From 8fc7f11014b64cf2c219295d4d3428a33fb4e273 Mon Sep 17 00:00:00 2001 From: rGaillard Date: Wed, 6 Jul 2011 10:54:11 +0000 Subject: [PATCH] --- 404.php | 42 + CHANGELOG | 3384 ++++ address.php | 35 + addresses.php | 35 + admin-dev/ajax.php | 708 + admin-dev/ajax_category_list.php | 85 + admin-dev/ajax_lang_packs.php | 50 + admin-dev/ajax_products_list.php | 67 + admin-dev/ajax_send_mail_test.php | 47 + .../_ajax_get_details_listing.php | 54 + .../_ajax_get_thumbnail_listing.php | 37 + .../ajaxfilemanager/_ajax_load_folders.php | 17 + .../ajaxfilemanager/ajax_create_folder.php | 75 + .../ajaxfilemanager/ajax_delete_file.php | 79 + admin-dev/ajaxfilemanager/ajax_download.php | 33 + .../ajaxfilemanager/ajax_editor_reset.php | 118 + admin-dev/ajaxfilemanager/ajax_file_copy.php | 35 + admin-dev/ajaxfilemanager/ajax_file_cut.php | 36 + admin-dev/ajaxfilemanager/ajax_file_paste.php | 140 + .../ajaxfilemanager/ajax_file_upload.php | 90 + .../ajaxfilemanager/ajax_get_file_listing.php | 139 + .../ajax_get_folder_listing.php | 15 + .../ajaxfilemanager/ajax_image_editor.php | 210 + admin-dev/ajaxfilemanager/ajax_image_save.php | 196 + .../ajaxfilemanager/ajax_image_thumbnail.php | 35 + admin-dev/ajaxfilemanager/ajax_image_undo.php | 96 + admin-dev/ajaxfilemanager/ajax_login.php | 67 + admin-dev/ajaxfilemanager/ajax_preview.php | 60 + .../ajaxfilemanager/ajax_save_as_form.php | 59 + admin-dev/ajaxfilemanager/ajax_save_name.php | 81 + admin-dev/ajaxfilemanager/ajax_save_text.php | 90 + .../ajaxfilemanager/ajax_text_editor.php | 168 + admin-dev/ajaxfilemanager/ajaxfilemanager.php | 689 + admin-dev/ajaxfilemanager/debug.html | 0 admin-dev/ajaxfilemanager/inc/class.auth.php | 48 + admin-dev/ajaxfilemanager/inc/class.file.php | 436 + .../ajaxfilemanager/inc/class.history.php | 155 + admin-dev/ajaxfilemanager/inc/class.image.php | 789 + .../ajaxfilemanager/inc/class.manager.php | 373 + .../ajaxfilemanager/inc/class.pagination.php | 584 + .../ajaxfilemanager/inc/class.search.php | 184 + .../ajaxfilemanager/inc/class.session.php | 228 + .../inc/class.sessionaction.php | 93 + .../ajaxfilemanager/inc/class.upload.php | 589 + admin-dev/ajaxfilemanager/inc/config.base.php | 135 + admin-dev/ajaxfilemanager/inc/config.php | 107 + .../ajaxfilemanager/inc/config.tinymce.php | 131 + admin-dev/ajaxfilemanager/inc/data.php | 8 + .../ajaxfilemanager/inc/function.base.php | 1225 ++ .../jscripts/ajaxfilemanager.js | 1845 ++ .../jscripts/ajaxfilemanager_c.js | 564 + .../jscripts/ajaxfileupload.js | 225 + .../jscripts/ajaximageeditor.js | 873 + .../jscripts/ajaximageeditor_c.js | 26 + .../jscripts/ajaxtexteditor.js | 91 + .../jscripts/ajaxtexteditor_c.js | 14 + .../ajaxfilemanager/jscripts/calendar.js | 6 + .../ajaxfilemanager/jscripts/contextmenu.js | 1 + .../jscripts/edit_area/edit_area.css | 352 + .../jscripts/edit_area/edit_area_full.js | 35 + .../jscripts/edit_area/images/close.gif | Bin 0 -> 102 bytes .../jscripts/edit_area/images/fullscreen.gif | Bin 0 -> 198 bytes .../jscripts/edit_area/images/go_to_line.gif | Bin 0 -> 1053 bytes .../jscripts/edit_area/images/help.gif | Bin 0 -> 295 bytes .../jscripts/edit_area/images/highlight.gif | Bin 0 -> 256 bytes .../jscripts/edit_area/images/load.gif | Bin 0 -> 1041 bytes .../jscripts/edit_area/images/move.gif | Bin 0 -> 257 bytes .../jscripts/edit_area/images/newdocument.gif | Bin 0 -> 170 bytes .../jscripts/edit_area/images/opacity.png | Bin 0 -> 147 bytes .../jscripts/edit_area/images/processing.gif | Bin 0 -> 825 bytes .../jscripts/edit_area/images/redo.gif | Bin 0 -> 169 bytes .../edit_area/images/reset_highlight.gif | Bin 0 -> 168 bytes .../jscripts/edit_area/images/save.gif | Bin 0 -> 285 bytes .../jscripts/edit_area/images/save_as.gif | Bin 0 -> 203 bytes .../jscripts/edit_area/images/search.gif | Bin 0 -> 191 bytes .../edit_area/images/smooth_selection.gif | Bin 0 -> 174 bytes .../jscripts/edit_area/images/spacer.gif | Bin 0 -> 43 bytes .../edit_area/images/statusbar_resize.gif | Bin 0 -> 79 bytes .../jscripts/edit_area/images/undo.gif | Bin 0 -> 175 bytes .../jscripts/edit_area/langs/de.js | 45 + .../jscripts/edit_area/langs/dk.js | 45 + .../jscripts/edit_area/langs/en.js | 46 + .../jscripts/edit_area/langs/fr.js | 45 + .../jscripts/edit_area/langs/hr.js | 45 + .../jscripts/edit_area/langs/it.js | 45 + .../jscripts/edit_area/langs/ja.js | 45 + .../jscripts/edit_area/langs/nl.js | 45 + .../jscripts/edit_area/langs/pl.js | 45 + .../jscripts/edit_area/langs/pt.js | 45 + .../jscripts/edit_area/langs/zh_cn.js | 46 + .../jscripts/edit_area/reg_syntax/basic.js | 69 + .../edit_area/reg_syntax/brainfuck.js | 44 + .../jscripts/edit_area/reg_syntax/c.js | 62 + .../jscripts/edit_area/reg_syntax/cpp.js | 65 + .../jscripts/edit_area/reg_syntax/css.js | 84 + .../jscripts/edit_area/reg_syntax/html.js | 50 + .../jscripts/edit_area/reg_syntax/js.js | 60 + .../jscripts/edit_area/reg_syntax/pas.js | 82 + .../jscripts/edit_area/reg_syntax/php.js | 75 + .../jscripts/edit_area/reg_syntax/python.js | 144 + .../jscripts/edit_area/reg_syntax/vb.js | 52 + .../jscripts/edit_area/reg_syntax/xml.js | 56 + .../ajaxfilemanager/jscripts/for_fckeditor.js | 27 + .../ajaxfilemanager/jscripts/for_form.js | 16 + .../jscripts/for_stand_alone.js | 5 + .../ajaxfilemanager/jscripts/for_tinymce.js | 248 + admin-dev/ajaxfilemanager/jscripts/form.js | 807 + .../ajaxfilemanager/jscripts/interface.js | 764 + .../ajaxfilemanager/jscripts/iresizable.js | 527 + admin-dev/ajaxfilemanager/jscripts/iutil.js | 245 + admin-dev/ajaxfilemanager/jscripts/jquery.js | 11 + admin-dev/ajaxfilemanager/jscripts/media.js | 444 + admin-dev/ajaxfilemanager/jscripts/rotate.js | 68 + admin-dev/ajaxfilemanager/jscripts/select.js | 1 + .../ajaxfilemanager/jscripts/thickbox.js | 323 + admin-dev/ajaxfilemanager/langs/en.php | 332 + admin-dev/ajaxfilemanager/langs/zh.php | 332 + admin-dev/ajaxfilemanager/mediaplayer.swf | Bin 0 -> 29708 bytes .../session/gc_counter.ajax.php | 1 + .../ajaxfilemanager/session/gc_log.ajax.php | 2 + .../theme/default/css/ajaximageeditor.css | 211 + .../theme/default/css/ajaxtexteditor.css | 106 + .../theme/default/css/fckeditor.css | 536 + .../theme/default/css/form.css | 537 + .../ajaxfilemanager/theme/default/css/ie6.css | 4 + .../theme/default/css/jqModal.css | 31 + .../theme/default/css/jquery-calendar.css | 166 + .../theme/default/css/login.css | 92 + .../theme/default/css/template.css | 585 + .../theme/default/css/thickbox.css | 159 + .../theme/default/css/tinymce.css | 537 + .../theme/default/images/action/copy.png | Bin 0 -> 677 bytes .../theme/default/images/action/copy_flag.gif | Bin 0 -> 178 bytes .../theme/default/images/action/cut.png | Bin 0 -> 674 bytes .../theme/default/images/action/cut_flag.png | Bin 0 -> 752 bytes .../theme/default/images/action/delete.png | Bin 0 -> 756 bytes .../default/images/action/folder_add.png | Bin 0 -> 617 bytes .../default/images/action/folder_explore.png | Bin 0 -> 673 bytes .../theme/default/images/action/page_add.png | Bin 0 -> 228 bytes .../theme/default/images/action/paste.png | Bin 0 -> 742 bytes .../theme/default/images/action/refresh.png | Bin 0 -> 811 bytes .../theme/default/images/action/tickAll.png | Bin 0 -> 819 bytes .../default/images/action/uncheckAll.png | Bin 0 -> 724 bytes .../theme/default/images/action/unzip.png | Bin 0 -> 429 bytes .../theme/default/images/action/upload.png | Bin 0 -> 751 bytes .../theme/default/images/action/zip.png | Bin 0 -> 428 bytes .../theme/default/images/add.png | Bin 0 -> 241 bytes .../theme/default/images/ajaxLoading.gif | Bin 0 -> 4204 bytes .../theme/default/images/arrow_right.png | Bin 0 -> 349 bytes .../default/images/big_icon/fileAcrobat.png | Bin 0 -> 812 bytes .../default/images/big_icon/fileCode.png | Bin 0 -> 423 bytes .../default/images/big_icon/fileExcel.png | Bin 0 -> 694 bytes .../theme/default/images/big_icon/fileExe.png | Bin 0 -> 355 bytes .../default/images/big_icon/fileFlash.png | Bin 0 -> 796 bytes .../default/images/big_icon/fileMusic.png | Bin 0 -> 412 bytes .../default/images/big_icon/filePicture.png | Bin 0 -> 422 bytes .../images/big_icon/filePowerpoint.png | Bin 0 -> 650 bytes .../theme/default/images/big_icon/fileRTF.png | Bin 0 -> 412 bytes .../default/images/big_icon/fileText.png | Bin 0 -> 602 bytes .../default/images/big_icon/fileUnknown.png | Bin 0 -> 415 bytes .../default/images/big_icon/fileVideo.png | Bin 0 -> 404 bytes .../default/images/big_icon/fileWord.png | Bin 0 -> 729 bytes .../theme/default/images/big_icon/fileXml.png | Bin 0 -> 409 bytes .../theme/default/images/big_icon/fileZip.png | Bin 0 -> 619 bytes .../theme/default/images/big_icon/folder.png | Bin 0 -> 1191 bytes .../default/images/big_icon/folderEmpty.png | Bin 0 -> 984 bytes .../theme/default/images/button.gif | Bin 0 -> 312 bytes .../theme/default/images/close.png | Bin 0 -> 403 bytes .../theme/default/images/copy.png | Bin 0 -> 677 bytes .../theme/default/images/copy_flag.gif | Bin 0 -> 178 bytes .../theme/default/images/cut.png | Bin 0 -> 674 bytes .../theme/default/images/cut_flag.gif | Bin 0 -> 278 bytes .../theme/default/images/date_picker.png | Bin 0 -> 3333 bytes .../theme/default/images/delete.png | Bin 0 -> 756 bytes .../default/images/file_type/fileAcrobat.png | Bin 0 -> 415 bytes .../default/images/file_type/fileCode.png | Bin 0 -> 423 bytes .../default/images/file_type/fileExcel.png | Bin 0 -> 914 bytes .../default/images/file_type/fileExe.png | Bin 0 -> 408 bytes .../default/images/file_type/fileFlash.png | Bin 0 -> 415 bytes .../default/images/file_type/fileMusic.png | Bin 0 -> 658 bytes .../default/images/file_type/filePicture.png | Bin 0 -> 689 bytes .../images/file_type/filePowerpoint.png | Bin 0 -> 883 bytes .../default/images/file_type/fileRTF.png | Bin 0 -> 782 bytes .../default/images/file_type/fileText.png | Bin 0 -> 782 bytes .../default/images/file_type/fileUnknown.png | Bin 0 -> 394 bytes .../default/images/file_type/fileVideo.png | Bin 0 -> 1040 bytes .../default/images/file_type/fileWord.png | Bin 0 -> 865 bytes .../default/images/file_type/fileXml.png | Bin 0 -> 409 bytes .../default/images/file_type/fileZip.png | Bin 0 -> 510 bytes .../theme/default/images/file_type/folder.png | Bin 0 -> 733 bytes .../default/images/file_type/folderEmpty.png | Bin 0 -> 528 bytes .../default/images/file_type/folderParent.png | Bin 0 -> 412 bytes .../theme/default/images/flagYes.png | Bin 0 -> 430 bytes .../theme/default/images/flagno.png | Bin 0 -> 425 bytes .../theme/default/images/folder.png | Bin 0 -> 389 bytes .../theme/default/images/folder_explore.png | Bin 0 -> 410 bytes .../theme/default/images/go_parent.png | Bin 0 -> 461 bytes .../theme/default/images/header.jpg | Bin 0 -> 13778 bytes .../theme/default/images/info.png | Bin 0 -> 821 bytes .../theme/default/images/loadingAnimation.gif | Bin 0 -> 5886 bytes .../images/pagination/pagination_left.gif | Bin 0 -> 263 bytes .../images/pagination/pagination_right.gif | Bin 0 -> 124 bytes .../theme/default/images/panel_bg.gif | Bin 0 -> 592 bytes .../theme/default/images/paste.png | Bin 0 -> 742 bytes .../theme/default/images/player.gif | Bin 0 -> 943 bytes .../theme/default/images/refresh.png | Bin 0 -> 585 bytes .../theme/default/images/shadow.gif | Bin 0 -> 5415 bytes .../theme/default/images/standard/add.png | Bin 0 -> 761 bytes .../default/images/standard/ajaxLoading.gif | Bin 0 -> 4204 bytes .../default/images/standard/arrow_right.png | Bin 0 -> 349 bytes .../theme/default/images/standard/button.gif | Bin 0 -> 443 bytes .../theme/default/images/standard/close.png | Bin 0 -> 403 bytes .../default/images/standard/date_picker.png | Bin 0 -> 3333 bytes .../theme/default/images/standard/flagno.png | Bin 0 -> 762 bytes .../theme/default/images/standard/flagyes.png | Bin 0 -> 769 bytes .../theme/default/images/standard/folder.png | Bin 0 -> 460 bytes .../images/standard/folder_explore.png | Bin 0 -> 673 bytes .../default/images/standard/go_parent.png | Bin 0 -> 776 bytes .../theme/default/images/standard/header.jpg | Bin 0 -> 13778 bytes .../theme/default/images/standard/info.png | Bin 0 -> 766 bytes .../images/standard/loadingAnimation.gif | Bin 0 -> 5886 bytes .../default/images/standard/panel_bg.gif | Bin 0 -> 592 bytes .../theme/default/images/standard/player.gif | Bin 0 -> 943 bytes .../theme/default/images/standard/shadow.gif | Bin 0 -> 5415 bytes .../images/standard/transparentpixel.gif | Bin 0 -> 43 bytes .../images/standard/uploadProcessing.gif | Bin 0 -> 847 bytes .../theme/default/images/tickAll.png | Bin 0 -> 819 bytes .../theme/default/images/transparentpixel.gif | Bin 0 -> 43 bytes .../theme/default/images/uncheckAll.png | Bin 0 -> 724 bytes .../theme/default/images/unzip.png | Bin 0 -> 429 bytes .../theme/default/images/uploadProcessing.gif | Bin 0 -> 847 bytes .../theme/default/images/zip.png | Bin 0 -> 428 bytes admin-dev/backup.php | 77 + admin-dev/backups/.htaccess | 2 + admin-dev/backups/index.php | 36 + admin-dev/confirm.php | 59 + admin-dev/displayImage.php | 36 + admin-dev/drawer.php | 57 + admin-dev/footer.inc.php | 54 + admin-dev/functions.php | 389 + admin-dev/get-file-admin.php | 31 + admin-dev/grider.php | 64 + admin-dev/header.inc.php | 177 + admin-dev/import/.htaccess | 2 + admin-dev/import/index.php | 36 + admin-dev/index.php | 160 + admin-dev/init.php | 93 + admin-dev/login.php | 187 + admin-dev/password.php | 116 + admin-dev/pdf.php | 114 + admin-dev/searchcron.php | 36 + admin-dev/tabs/.htaccess | 2 + admin-dev/tabs/AdminAccess.php | 138 + admin-dev/tabs/AdminAddonsCatalog.php | 38 + admin-dev/tabs/AdminAddonsMyAccount.php | 38 + admin-dev/tabs/AdminAddresses.php | 510 + admin-dev/tabs/AdminAliases.php | 106 + admin-dev/tabs/AdminAppearance.php | 36 + admin-dev/tabs/AdminAttachments.php | 134 + admin-dev/tabs/AdminAttributeGenerator.php | 321 + admin-dev/tabs/AdminAttributes.php | 161 + admin-dev/tabs/AdminAttributesGroups.php | 236 + admin-dev/tabs/AdminBackup.php | 307 + admin-dev/tabs/AdminCMS.php | 357 + admin-dev/tabs/AdminCMSCategories.php | 293 + admin-dev/tabs/AdminCMSContent.php | 129 + admin-dev/tabs/AdminCarriers.php | 379 + admin-dev/tabs/AdminCarts.php | 344 + admin-dev/tabs/AdminCatalog.php | 204 + admin-dev/tabs/AdminCategories.php | 355 + admin-dev/tabs/AdminContact.php | 132 + admin-dev/tabs/AdminContacts.php | 121 + admin-dev/tabs/AdminCountries.php | 347 + admin-dev/tabs/AdminCounty.php | 219 + admin-dev/tabs/AdminCurrencies.php | 240 + admin-dev/tabs/AdminCustomerThreads.php | 605 + admin-dev/tabs/AdminCustomers.php | 861 + admin-dev/tabs/AdminDb.php | 150 + admin-dev/tabs/AdminDeliverySlip.php | 104 + admin-dev/tabs/AdminDiscounts.php | 504 + admin-dev/tabs/AdminEmails.php | 108 + admin-dev/tabs/AdminEmployees.php | 221 + admin-dev/tabs/AdminFeatures.php | 212 + admin-dev/tabs/AdminFeaturesValues.php | 118 + admin-dev/tabs/AdminGenerator.php | 190 + admin-dev/tabs/AdminGeolocation.php | 189 + admin-dev/tabs/AdminGroupShop.php | 114 + admin-dev/tabs/AdminGroups.php | 383 + admin-dev/tabs/AdminHome.php | 441 + admin-dev/tabs/AdminImageResize.php | 100 + admin-dev/tabs/AdminImages.php | 444 + admin-dev/tabs/AdminImport.php | 1633 ++ admin-dev/tabs/AdminInformation.php | 381 + admin-dev/tabs/AdminInvoices.php | 159 + admin-dev/tabs/AdminLanguages.php | 427 + admin-dev/tabs/AdminLocalization.php | 130 + admin-dev/tabs/AdminLogs.php | 83 + admin-dev/tabs/AdminManufacturers.php | 318 + admin-dev/tabs/AdminMessages.php | 173 + admin-dev/tabs/AdminMeta.php | 195 + admin-dev/tabs/AdminModules.php | 968 + admin-dev/tabs/AdminModulesPositions.php | 459 + admin-dev/tabs/AdminOrderMessage.php | 87 + admin-dev/tabs/AdminOrders.php | 988 + admin-dev/tabs/AdminOrdersStates.php | 204 + admin-dev/tabs/AdminPDF.php | 114 + admin-dev/tabs/AdminPPreferences.php | 96 + admin-dev/tabs/AdminPayment.php | 243 + admin-dev/tabs/AdminPerformance.php | 457 + admin-dev/tabs/AdminPreferences.php | 528 + admin-dev/tabs/AdminProducts.php | 3834 ++++ admin-dev/tabs/AdminProfiles.php | 91 + admin-dev/tabs/AdminQuickAccesses.php | 92 + admin-dev/tabs/AdminRangePrice.php | 120 + admin-dev/tabs/AdminRangeWeight.php | 119 + admin-dev/tabs/AdminReferrers.php | 472 + admin-dev/tabs/AdminReturn.php | 288 + admin-dev/tabs/AdminReturnStates.php | 80 + admin-dev/tabs/AdminScenes.php | 282 + admin-dev/tabs/AdminSearch.php | 288 + admin-dev/tabs/AdminSearchConf.php | 106 + admin-dev/tabs/AdminSearchEngines.php | 75 + admin-dev/tabs/AdminShipping.php | 306 + admin-dev/tabs/AdminShop.php | 192 + admin-dev/tabs/AdminShopUrl.php | 145 + admin-dev/tabs/AdminSlip.php | 120 + admin-dev/tabs/AdminStates.php | 161 + admin-dev/tabs/AdminStats.php | 35 + admin-dev/tabs/AdminStatsConf.php | 119 + admin-dev/tabs/AdminStatsTab.php | 254 + admin-dev/tabs/AdminStatuses.php | 86 + admin-dev/tabs/AdminStockMvt.php | 200 + admin-dev/tabs/AdminStores.php | 315 + admin-dev/tabs/AdminSubDomains.php | 89 + admin-dev/tabs/AdminSuppliers.php | 231 + admin-dev/tabs/AdminTabs.php | 178 + admin-dev/tabs/AdminTags.php | 139 + admin-dev/tabs/AdminTaxRulesGroup.php | 571 + admin-dev/tabs/AdminTaxes.php | 192 + admin-dev/tabs/AdminThemes.php | 276 + admin-dev/tabs/AdminTools.php | 43 + admin-dev/tabs/AdminTracking.php | 267 + admin-dev/tabs/AdminTranslations.php | 1927 ++ admin-dev/tabs/AdminWebservice.php | 282 + admin-dev/tabs/AdminZones.php | 90 + admin-dev/themes/flashyturtle/admin.css | 61 + admin-dev/themes/flashyturtle/bg-lang.png | Bin 0 -> 767 bytes admin-dev/themes/flashyturtle/bg-quick.png | Bin 0 -> 615 bytes admin-dev/themes/flashyturtle/bg-subtab.png | Bin 0 -> 93 bytes admin-dev/themes/flashyturtle/bg-tab.png | Bin 0 -> 190 bytes admin-dev/themes/flashyturtle/bg-top.png | Bin 0 -> 10222 bytes admin-dev/themes/flashyturtle/button-bg.png | Bin 0 -> 165 bytes .../themes/flashyturtle/center_btn_filter.png | Bin 0 -> 267 bytes admin-dev/themes/flashyturtle/footer-bg.png | Bin 0 -> 872 bytes .../themes/flashyturtle/header_module.png | Bin 0 -> 895 bytes admin-dev/themes/flashyturtle/searchbar.png | Bin 0 -> 1409 bytes .../themes/flashyturtle/searchbutton.png | Bin 0 -> 2504 bytes .../themes/flashyturtle/separator_subnav.png | Bin 0 -> 79 bytes admin-dev/themes/flashyturtle/thead.png | Bin 0 -> 859 bytes admin-dev/themes/oldschool/admin.css | 56 + admin-dev/themes/oldschool/bg-lang.png | Bin 0 -> 910 bytes admin-dev/themes/oldschool/bg-quick.png | Bin 0 -> 1620 bytes admin-dev/themes/oldschool/bg-subtab.png | Bin 0 -> 249 bytes admin-dev/themes/oldschool/bg-tab.png | Bin 0 -> 224 bytes admin-dev/themes/oldschool/button-bg.png | Bin 0 -> 339 bytes admin-dev/themes/oldschool/footer-bg.png | Bin 0 -> 946 bytes admin-dev/themes/oldschool/header_module.png | Bin 0 -> 218 bytes admin-dev/themes/oldschool/news-bg.gif | Bin 0 -> 277 bytes admin-dev/themes/oldschool/searchbar.png | Bin 0 -> 2446 bytes admin-dev/themes/oldschool/searchbutton.gif | Bin 0 -> 1548 bytes .../themes/oldschool/separator_subnav.png | Bin 0 -> 120 bytes admin-dev/themes/oldschool/submenu-bg.gif | Bin 0 -> 52 bytes admin-dev/themes/oldschool/tab_right.gif | Bin 0 -> 2128 bytes admin-dev/themes/oldschool/thead.png | Bin 0 -> 218 bytes admin-dev/themes/origins/admin.css | 59 + admin-dev/themes/origins/bg-lang.png | Bin 0 -> 1715 bytes admin-dev/themes/origins/bg-quick.png | Bin 0 -> 1620 bytes admin-dev/themes/origins/bg-subtab.png | Bin 0 -> 249 bytes admin-dev/themes/origins/bg-tab.png | Bin 0 -> 968 bytes admin-dev/themes/origins/bg-top.png | Bin 0 -> 9503 bytes admin-dev/themes/origins/button-bg.png | Bin 0 -> 339 bytes admin-dev/themes/origins/footer-bg.png | Bin 0 -> 946 bytes admin-dev/themes/origins/header_module.png | Bin 0 -> 218 bytes .../origins/img/t/AdminAddonsCatalog.gif | Bin 0 -> 1461 bytes .../origins/img/t/AdminAddonsMyAccount.gif | Bin 0 -> 1461 bytes .../themes/origins/img/t/AdminCatalog.gif | Bin 0 -> 1697 bytes .../themes/origins/img/t/AdminCustomers.gif | Bin 0 -> 1461 bytes .../themes/origins/img/t/AdminEmployees.gif | Bin 0 -> 1720 bytes .../themes/origins/img/t/AdminModules.gif | Bin 0 -> 1461 bytes .../origins/img/t/AdminModulesPositions.gif | Bin 0 -> 1033 bytes .../themes/origins/img/t/AdminOrders.gif | Bin 0 -> 1449 bytes .../themes/origins/img/t/AdminPayment.gif | Bin 0 -> 1322 bytes .../themes/origins/img/t/AdminPreferences.gif | Bin 0 -> 1465 bytes .../themes/origins/img/t/AdminShipping.gif | Bin 0 -> 1709 bytes admin-dev/themes/origins/img/t/AdminStats.gif | Bin 0 -> 1453 bytes .../themes/origins/img/t/AdminStockMvt.gif | Bin 0 -> 1709 bytes .../themes/origins/img/t/AdminStores.gif | Bin 0 -> 1449 bytes admin-dev/themes/origins/img/t/AdminTools.gif | Bin 0 -> 1658 bytes admin-dev/themes/origins/news-bg.gif | Bin 0 -> 277 bytes admin-dev/themes/origins/searchbar.png | Bin 0 -> 2446 bytes admin-dev/themes/origins/searchbutton.png | Bin 0 -> 930 bytes admin-dev/themes/origins/separator_subnav.png | Bin 0 -> 120 bytes admin-dev/themes/origins/tab_right.gif | Bin 0 -> 2128 bytes admin-dev/themes/origins/thead.png | Bin 0 -> 218 bytes admin-dev/uploadProductFile.php | 61 + attachment.php | 35 + authentication.php | 35 + best-sales.php | 35 + cart.php | 35 + category.php | 35 + changecurrency.php | 35 + classes/.htaccess | 2 + classes/AbstractLogger.php | 111 + classes/Address.php | 329 + classes/AddressFormat.php | 439 + classes/AdminTab.php | 2226 +++ classes/Alias.php | 95 + classes/Attachment.php | 106 + classes/Attribute.php | 205 + classes/AttributeGroup.php | 195 + classes/Backup.php | 252 + classes/Blowfish.php | 484 + classes/CMS.php | 255 + classes/CMSCategory.php | 658 + classes/Cache.php | 80 + classes/CacheFS.php | 175 + classes/Carrier.php | 711 + classes/CarrierModule.php | 33 + classes/Cart.php | 1708 ++ classes/Category.php | 1048 + classes/Chart.php | 178 + classes/Combination.php | 180 + classes/Configuration.php | 494 + classes/Connection.php | 184 + classes/ConnectionsSource.php | 112 + classes/Contact.php | 89 + classes/ControllerFactory.php | 53 + classes/Cookie.php | 354 + classes/Country.php | 333 + classes/County.php | 244 + classes/Currency.php | 377 + classes/Customer.php | 699 + classes/CustomerMessage.php | 59 + classes/CustomerThread.php | 84 + classes/Customization.php | 125 + classes/DateRange.php | 67 + classes/Db.php | 328 + classes/Delivery.php | 78 + classes/Discount.php | 520 + classes/Dispatcher.php | 51 + classes/Employee.php | 223 + classes/Feature.php | 207 + classes/FeatureValue.php | 176 + classes/FileLogger.php | 70 + classes/FrontController.php | 617 + classes/Group.php | 176 + classes/GroupReduction.php | 108 + classes/GroupShop.php | 128 + classes/Guest.php | 210 + classes/HelpAccess.php | 117 + classes/Hook.php | 253 + classes/Image.php | 516 + classes/ImageType.php | 149 + classes/ImportModule.php | 93 + classes/Language.php | 655 + classes/Link.php | 365 + classes/LocalizationPack.php | 490 + classes/Logger.php | 161 + classes/MCached.php | 171 + classes/Mail.php | 228 + classes/Manufacturer.php | 397 + classes/Message.php | 165 + classes/Meta.php | 189 + classes/Module.php | 1168 ++ classes/ModuleGraph.php | 327 + classes/ModuleGraphEngine.php | 72 + classes/ModuleGrid.php | 185 + classes/ModuleGridEngine.php | 71 + classes/MySQL.php | 285 + classes/ObjectModel.php | 831 + classes/Order.php | 1057 ++ classes/OrderDetail.php | 218 + classes/OrderDiscount.php | 71 + classes/OrderHistory.php | 203 + classes/OrderMessage.php | 79 + classes/OrderReturn.php | 205 + classes/OrderReturnState.php | 80 + classes/OrderSlip.php | 179 + classes/OrderState.php | 132 + classes/PDF.php | 1128 ++ classes/Pack.php | 201 + classes/Page.php | 129 + classes/PaymentCC.php | 74 + classes/PaymentModule.php | 535 + classes/Product.php | 3486 ++++ classes/ProductDownload.php | 272 + classes/ProductSale.php | 186 + classes/Profile.php | 131 + classes/QuickAccess.php | 82 + classes/RangePrice.php | 71 + classes/RangeWeight.php | 71 + classes/Referrer.php | 315 + classes/Rijndael.php | 54 + classes/Scene.php | 258 + classes/Search.php | 595 + classes/SearchEngine.php | 72 + classes/Shop.php | 588 + classes/ShopUrl.php | 103 + classes/SpecificPrice.php | 255 + classes/State.php | 204 + classes/Stock.php | 66 + classes/StockMvt.php | 133 + classes/StockMvtReason.php | 73 + classes/Store.php | 135 + classes/SubDomain.php | 56 + classes/Supplier.php | 279 + classes/Tab.php | 249 + classes/Tag.php | 203 + classes/Tax.php | 397 + classes/TaxRule.php | 111 + classes/TaxRulesGroup.php | 166 + classes/Theme.php | 50 + classes/Tools.php | 2186 +++ classes/TranslatedConfiguration.php | 95 + classes/Validate.php | 1098 ++ classes/WebserviceException.php | 87 + classes/WebserviceKey.php | 154 + classes/WebserviceOutputBuilder.php | 761 + classes/WebserviceOutputInterface.php | 49 + classes/WebserviceOutputXML.php | 201 + classes/WebserviceRequest.php | 1723 ++ .../WebserviceSpecificManagementImages.php | 1013 + .../WebserviceSpecificManagementInterface.php | 47 + .../WebserviceSpecificManagementSearch.php | 125 + classes/Zone.php | 105 + classes/index.php | 36 + cms.php | 35 + config/.htaccess | 2 + config/autoload.php | 60 + config/config.inc.php | 128 + config/defines.inc.php | 165 + config/index.php | 37 + config/modules_list.xml | 118 + config/smarty.config.inc.php | 217 + contact-form.php | 35 + controllers/AddressController.php | 303 + controllers/AddressesController.php | 110 + controllers/AttachmentController.php | 45 + controllers/AuthController.php | 407 + controllers/BestSalesController.php | 63 + controllers/CMSController.php | 126 + controllers/CartController.php | 258 + controllers/CategoryController.php | 170 + controllers/ChangeCurrencyController.php | 47 + controllers/CompareController.php | 120 + controllers/ContactController.php | 264 + controllers/DiscountController.php | 59 + controllers/GetFileController.php | 303 + controllers/GuestTrackingController.php | 147 + controllers/HistoryController.php | 75 + controllers/IdentityController.php | 129 + controllers/IndexController.php | 48 + controllers/ManufacturerController.php | 102 + controllers/MyAccountController.php | 63 + controllers/NewProductsController.php | 66 + controllers/OrderConfirmationController.php | 94 + controllers/OrderController.php | 296 + controllers/OrderDetailController.php | 185 + controllers/OrderFollowController.php | 106 + controllers/OrderOpcController.php | 457 + controllers/OrderReturnController.php | 99 + controllers/OrderSlipController.php | 60 + controllers/PageNotFoundController.php | 35 + controllers/ParentOrderController.php | 452 + controllers/PasswordController.php | 116 + controllers/PdfInvoiceController.php | 50 + controllers/PricesDropController.php | 65 + controllers/ProductController.php | 470 + controllers/SearchController.php | 142 + controllers/SitemapController.php | 63 + controllers/StatisticsController.php | 64 + controllers/StoresController.php | 216 + controllers/SupplierController.php | 101 + controllers/pdfOrderReturnController.php | 49 + controllers/pdfOrderSlipController.php | 51 + css/admin-ie.css | 2 + css/admin.css | 1535 ++ css/csshover.htc.htc | 120 + css/datePicker.css | 142 + css/index.php | 37 + css/install.css | 349 + css/jquery-ui-1.8.10.custom.css | 573 + css/jquery.autocomplete.css | 51 + css/jquery.cluetip.css | 63 + css/jquery.fancybox-1.3.4.css | 374 + css/jquery.jgrowl.css | 127 + css/jqzoom.css | 21 + css/login.css | 146 + css/tabpane.css | 67 + css/thickbox.css | 174 + discount.php | 35 + docs/dev/dbmodel.mwb | Bin 0 -> 127165 bytes docs/licences/cropper.txt | 12 + docs/licences/fpdf.txt | 7 + docs/licences/index.php | 37 + docs/licences/open-software-3.0.txt | 44 + docs/licences/pclzip.txt | 504 + docs/licences/tinymce-smarty-swift.txt | 460 + download/.htaccess | 2 + download/index.php | 13 + footer.php | 29 + get-file.php | 35 + guest-tracking.php | 35 + header.php | 30 + history.php | 35 + identity.php | 35 + images.inc.php | 382 + img/404.gif | Bin 0 -> 1049 bytes img/admin/AdminBackup.gif | Bin 0 -> 1052 bytes img/admin/AdminCatalog.gif | Bin 0 -> 1697 bytes img/admin/AdminCustomers.gif | Bin 0 -> 1461 bytes img/admin/AdminEmployees.gif | Bin 0 -> 1720 bytes img/admin/AdminModules.gif | Bin 0 -> 1461 bytes img/admin/AdminNext.gif | Bin 0 -> 1330 bytes img/admin/AdminOrders.gif | Bin 0 -> 1449 bytes img/admin/AdminPayment.gif | Bin 0 -> 1322 bytes img/admin/AdminPreferences.gif | Bin 0 -> 1465 bytes img/admin/AdminShipping.gif | Bin 0 -> 1709 bytes img/admin/AdminStats.gif | Bin 0 -> 1453 bytes img/admin/AdminTools.gif | Bin 0 -> 1658 bytes img/admin/___info-ca.gif | Bin 0 -> 628 bytes img/admin/access.png | Bin 0 -> 706 bytes img/admin/add-btn.png | Bin 0 -> 174 bytes img/admin/add.gif | Bin 0 -> 598 bytes img/admin/add_2.gif | Bin 0 -> 1197 bytes img/admin/addresses_edit.gif | Bin 0 -> 412 bytes img/admin/affiliation.png | Bin 0 -> 968 bytes img/admin/ajax-loader.gif | Bin 0 -> 673 bytes img/admin/appearance.gif | Bin 0 -> 1025 bytes img/admin/arrow-left.png | Bin 0 -> 608 bytes img/admin/arrow-right.png | Bin 0 -> 576 bytes img/admin/arrow.gif | Bin 0 -> 341 bytes img/admin/arrow2.gif | Bin 0 -> 215 bytes img/admin/arrow_down.png | Bin 0 -> 3235 bytes img/admin/arrow_in.png | Bin 0 -> 547 bytes img/admin/arrow_out.png | Bin 0 -> 594 bytes img/admin/arrow_up.png | Bin 0 -> 3245 bytes img/admin/asterisk.gif | Bin 0 -> 612 bytes img/admin/barcode.gif | Bin 0 -> 552 bytes img/admin/basket_error.png | Bin 0 -> 753 bytes img/admin/bg.png | Bin 0 -> 56884 bytes img/admin/bg_2.png | Bin 0 -> 24942 bytes img/admin/bg_login.gif | Bin 0 -> 7726 bytes img/admin/bg_pslink.png | Bin 0 -> 24905 bytes img/admin/binoculars.png | Bin 0 -> 826 bytes img/admin/blank.gif | Bin 0 -> 807 bytes img/admin/block_bg.jpg | Bin 0 -> 361 bytes img/admin/calendar.png | Bin 0 -> 1011 bytes img/admin/cart.gif | Bin 0 -> 265 bytes img/admin/catalog_xl.png | Bin 0 -> 1419 bytes img/admin/center_btn_filter.png | Bin 0 -> 267 bytes img/admin/charged_ko.gif | Bin 0 -> 1006 bytes img/admin/charged_ok.gif | Bin 0 -> 997 bytes img/admin/close-white.png | Bin 0 -> 3286 bytes img/admin/close.png | Bin 0 -> 612 bytes img/admin/cms.gif | Bin 0 -> 1026 bytes img/admin/cog.gif | Bin 0 -> 280 bytes img/admin/color.png | Bin 0 -> 839 bytes img/admin/colorpicker.png | Bin 0 -> 4689 bytes img/admin/comment.gif | Bin 0 -> 413 bytes img/admin/commercial.gif | Bin 0 -> 1017 bytes img/admin/computer_key.png | Bin 0 -> 740 bytes img/admin/contact.gif | Bin 0 -> 604 bytes img/admin/copy_files.gif | Bin 0 -> 968 bytes img/admin/coupon.gif | Bin 0 -> 248 bytes img/admin/customer_xl.png | Bin 0 -> 1583 bytes img/admin/database_gear.gif | Bin 0 -> 279 bytes img/admin/date.gif | Bin 0 -> 974 bytes img/admin/date.png | Bin 0 -> 622 bytes img/admin/delete.gif | Bin 0 -> 992 bytes img/admin/delivery.gif | Bin 0 -> 583 bytes img/admin/delivery_ko.gif | Bin 0 -> 1001 bytes img/admin/details.gif | Bin 0 -> 954 bytes img/admin/disabled.gif | Bin 0 -> 960 bytes img/admin/dollar.gif | Bin 0 -> 358 bytes img/admin/down-white.gif | Bin 0 -> 75 bytes img/admin/down.gif | Bin 0 -> 63 bytes img/admin/down_d.gif | Bin 0 -> 54 bytes img/admin/download_page.png | Bin 0 -> 470 bytes img/admin/duplicate.gif | Bin 0 -> 1004 bytes img/admin/duplicate.png | Bin 0 -> 590 bytes img/admin/edit.gif | Bin 0 -> 973 bytes img/admin/edit_2.gif | Bin 0 -> 1201 bytes img/admin/email.gif | Bin 0 -> 582 bytes img/admin/email_edit.gif | Bin 0 -> 604 bytes img/admin/employee.gif | Bin 0 -> 586 bytes img/admin/employees_xl.png | Bin 0 -> 1373 bytes img/admin/enabled-2.gif | Bin 0 -> 1427 bytes img/admin/enabled.gif | Bin 0 -> 321 bytes img/admin/error.png | Bin 0 -> 741 bytes img/admin/error2.png | Bin 0 -> 1061 bytes img/admin/exchangesrate.gif | Bin 0 -> 1021 bytes img/admin/export.gif | Bin 0 -> 979 bytes img/admin/female.gif | Bin 0 -> 249 bytes img/admin/female_2.gif | Bin 0 -> 1476 bytes img/admin/filter.png | Bin 0 -> 720 bytes img/admin/folder.gif | Bin 0 -> 387 bytes img/admin/forbbiden.gif | Bin 0 -> 594 bytes img/admin/gold.gif | Bin 0 -> 1030 bytes img/admin/google.gif | Bin 0 -> 378 bytes img/admin/graybar.jpg | Bin 0 -> 719 bytes img/admin/green-gradient.png | Bin 0 -> 193 bytes img/admin/greenlight-gradient.png | Bin 0 -> 189 bytes img/admin/grid.gif | Bin 0 -> 87 bytes img/admin/group.gif | Bin 0 -> 1004 bytes img/admin/help-new.png | Bin 0 -> 2765 bytes img/admin/help.png | Bin 0 -> 733 bytes img/admin/help2.png | Bin 0 -> 2523 bytes img/admin/home.gif | Bin 0 -> 597 bytes img/admin/home.png | Bin 0 -> 370 bytes img/admin/htaccess.gif | Bin 0 -> 985 bytes img/admin/import.gif | Bin 0 -> 981 bytes img/admin/index.php | 36 + img/admin/info.png | Bin 0 -> 1270 bytes img/admin/information.png | Bin 0 -> 725 bytes img/admin/invoice.gif | Bin 0 -> 601 bytes img/admin/less.png | Bin 0 -> 186 bytes img/admin/list-next.gif | Bin 0 -> 53 bytes img/admin/list-next2.gif | Bin 0 -> 61 bytes img/admin/list-prev.gif | Bin 0 -> 53 bytes img/admin/list-prev2.gif | Bin 0 -> 62 bytes img/admin/localization.gif | Bin 0 -> 1067 bytes img/admin/login-bg.jpg | Bin 0 -> 12222 bytes img/admin/lv1.gif | Bin 0 -> 393 bytes img/admin/lv1.png | Bin 0 -> 137 bytes img/admin/lv2_b.gif | Bin 0 -> 81 bytes img/admin/lv2_b.png | Bin 0 -> 128 bytes img/admin/lv2_f.gif | Bin 0 -> 76 bytes img/admin/lv2_f.png | Bin 0 -> 122 bytes img/admin/lv3_b.png | Bin 0 -> 141 bytes img/admin/lv3_f.png | Bin 0 -> 145 bytes img/admin/lv4_b.png | Bin 0 -> 156 bytes img/admin/lv4_f.png | Bin 0 -> 153 bytes img/admin/lv5_b.png | Bin 0 -> 155 bytes img/admin/lv5_f.png | Bin 0 -> 168 bytes img/admin/lvl_0.gif | Bin 0 -> 85 bytes img/admin/lvl_1.gif | Bin 0 -> 97 bytes img/admin/male.gif | Bin 0 -> 360 bytes img/admin/male_2.gif | Bin 0 -> 1479 bytes img/admin/manufacturers.gif | Bin 0 -> 280 bytes img/admin/medal.png | Bin 0 -> 588 bytes img/admin/meta100.png | Bin 0 -> 612 bytes img/admin/metatags.gif | Bin 0 -> 991 bytes img/admin/module_disabled.png | Bin 0 -> 567 bytes img/admin/module_install.png | Bin 0 -> 778 bytes img/admin/module_notinstall.png | Bin 0 -> 556 bytes img/admin/module_warning.png | Bin 0 -> 968 bytes img/admin/money.gif | Bin 0 -> 383 bytes img/admin/money.png | Bin 0 -> 685 bytes img/admin/more.png | Bin 0 -> 203 bytes img/admin/msg-forward.png | Bin 0 -> 1326 bytes img/admin/msg-is-pending.png | Bin 0 -> 1914 bytes img/admin/msg-ok.png | Bin 0 -> 1513 bytes img/admin/msg-pending.png | Bin 0 -> 2197 bytes img/admin/multishop_config.png | Bin 0 -> 549 bytes img/admin/nav-home.gif | Bin 0 -> 597 bytes img/admin/nav-logout.gif | Bin 0 -> 371 bytes img/admin/nav-user.gif | Bin 0 -> 354 bytes img/admin/navigation.png | Bin 0 -> 581 bytes img/admin/news-new.gif | Bin 0 -> 333 bytes img/admin/next-msg.png | Bin 0 -> 2319 bytes img/admin/next.gif | Bin 0 -> 301 bytes img/admin/ok.gif | Bin 0 -> 610 bytes img/admin/ok2.png | Bin 0 -> 1162 bytes img/admin/orange-gradient.png | Bin 0 -> 200 bytes img/admin/page_world.png | Bin 0 -> 903 bytes img/admin/payment.gif | Bin 0 -> 1042 bytes img/admin/pdf.gif | Bin 0 -> 616 bytes img/admin/photo.gif | Bin 0 -> 1053 bytes img/admin/photo_add.gif | Bin 0 -> 1066 bytes img/admin/picture.gif | Bin 0 -> 585 bytes img/admin/pink-gradient.png | Bin 0 -> 185 bytes img/admin/prefs.gif | Bin 0 -> 351 bytes img/admin/prestastore.gif | Bin 0 -> 984 bytes img/admin/previous.gif | Bin 0 -> 302 bytes img/admin/previous.png | Bin 0 -> 1183 bytes img/admin/printer.gif | Bin 0 -> 731 bytes img/admin/products.gif | Bin 0 -> 1005 bytes img/admin/profiles.png | Bin 0 -> 700 bytes img/admin/quick.gif | Bin 0 -> 971 bytes img/admin/return.gif | Bin 0 -> 1062 bytes img/admin/right_btn_filter.png | Bin 0 -> 642 bytes img/admin/robots.gif | Bin 0 -> 965 bytes img/admin/search.gif | Bin 0 -> 615 bytes img/admin/separator_breadcrum.png | Bin 0 -> 260 bytes img/admin/separator_filter.png | Bin 0 -> 76 bytes img/admin/slip.gif | Bin 0 -> 1027 bytes img/admin/stats_xl.png | Bin 0 -> 1476 bytes img/admin/statsettings.gif | Bin 0 -> 1027 bytes img/admin/status_green.gif | Bin 0 -> 1295 bytes img/admin/status_orange.gif | Bin 0 -> 1396 bytes img/admin/status_red.gif | Bin 0 -> 1396 bytes img/admin/subdomain.gif | Bin 0 -> 1071 bytes img/admin/submenu-bg.gif | Bin 0 -> 52 bytes img/admin/submenu-bg.png | Bin 0 -> 144 bytes img/admin/submenu-bg_2.png | Bin 0 -> 144 bytes img/admin/submenu-configuration.gif | Bin 0 -> 280 bytes img/admin/success.png | Bin 0 -> 1032 bytes img/admin/summary.png | Bin 0 -> 471 bytes img/admin/supplier.gif | Bin 0 -> 266 bytes img/admin/suppliers.gif | Bin 0 -> 266 bytes img/admin/tab-categories.gif | Bin 0 -> 570 bytes img/admin/tab-contact.gif | Bin 0 -> 354 bytes img/admin/tab-customers.gif | Bin 0 -> 587 bytes img/admin/tab-groups.gif | Bin 0 -> 1004 bytes img/admin/tab-invoice.gif | Bin 0 -> 997 bytes img/admin/tab-orders.gif | Bin 0 -> 265 bytes img/admin/tab-payment.gif | Bin 0 -> 383 bytes img/admin/tab-plugins.gif | Bin 0 -> 365 bytes img/admin/tab-preferences.gif | Bin 0 -> 589 bytes img/admin/tab-products.gif | Bin 0 -> 359 bytes img/admin/tab-shipping.gif | Bin 0 -> 583 bytes img/admin/tab-stats.gif | Bin 0 -> 606 bytes img/admin/tab-tools.gif | Bin 0 -> 351 bytes img/admin/tab.gif | Bin 0 -> 347 bytes img/admin/thead.png | Bin 0 -> 146 bytes img/admin/themes.gif | Bin 0 -> 997 bytes img/admin/time.gif | Bin 0 -> 618 bytes img/admin/translation.gif | Bin 0 -> 919 bytes img/admin/transparentpixel.gif | Bin 0 -> 43 bytes img/admin/unknow.gif | Bin 0 -> 1227 bytes img/admin/unknown.gif | Bin 0 -> 396 bytes img/admin/up.gif | Bin 0 -> 55 bytes img/admin/up_d.gif | Bin 0 -> 55 bytes img/admin/visitors.gif | Bin 0 -> 1052 bytes img/admin/warn2.png | Bin 0 -> 1061 bytes img/admin/warning.gif | Bin 0 -> 581 bytes img/admin/world.gif | Bin 0 -> 1065 bytes img/c/2-category.jpg | Bin 0 -> 15328 bytes img/c/2-large.jpg | Bin 0 -> 15694 bytes img/c/2-medium.jpg | Bin 0 -> 2560 bytes img/c/2-small.jpg | Bin 0 -> 1380 bytes img/c/2.jpg | Bin 0 -> 21177 bytes img/c/3-category.jpg | Bin 0 -> 16989 bytes img/c/3-large.jpg | Bin 0 -> 10597 bytes img/c/3-medium.jpg | Bin 0 -> 1828 bytes img/c/3-small.jpg | Bin 0 -> 1176 bytes img/c/3.jpg | Bin 0 -> 25492 bytes img/c/4-category.jpg | Bin 0 -> 15013 bytes img/c/4-large.jpg | Bin 0 -> 7716 bytes img/c/4-medium.jpg | Bin 0 -> 1683 bytes img/c/4-small.jpg | Bin 0 -> 1038 bytes img/c/4.jpg | Bin 0 -> 20201 bytes img/c/de-default-category.jpg | Bin 0 -> 5039 bytes img/c/de-default-large.jpg | Bin 0 -> 8343 bytes img/c/de-default-medium.jpg | Bin 0 -> 2010 bytes img/c/de-default-small.jpg | Bin 0 -> 1220 bytes img/c/de.jpg | Bin 0 -> 11205 bytes img/c/en-default-category.jpg | Bin 0 -> 3928 bytes img/c/en-default-large.jpg | Bin 0 -> 6819 bytes img/c/en-default-medium.jpg | Bin 0 -> 1740 bytes img/c/en-default-small.jpg | Bin 0 -> 1047 bytes img/c/en.jpg | Bin 0 -> 10859 bytes img/c/es-default-category.jpg | Bin 0 -> 4121 bytes img/c/es-default-large.jpg | Bin 0 -> 6972 bytes img/c/es-default-medium.jpg | Bin 0 -> 1799 bytes img/c/es-default-small.jpg | Bin 0 -> 1017 bytes img/c/es.jpg | Bin 0 -> 6828 bytes img/c/fr-default-category.jpg | Bin 0 -> 4938 bytes img/c/fr-default-large.jpg | Bin 0 -> 8272 bytes img/c/fr-default-medium.jpg | Bin 0 -> 2223 bytes img/c/fr-default-small.jpg | Bin 0 -> 1252 bytes img/c/fr.jpg | Bin 0 -> 13454 bytes img/c/index.php | 36 + img/c/it-default-category.jpg | Bin 0 -> 6438 bytes img/c/it-default-large.jpg | Bin 0 -> 11828 bytes img/c/it-default-medium.jpg | Bin 0 -> 2607 bytes img/c/it-default-small.jpg | Bin 0 -> 1454 bytes img/c/it.jpg | Bin 0 -> 35628 bytes img/co/index.php | 36 + img/favicon.ico | Bin 0 -> 1150 bytes img/index.php | 36 + .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 260 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 251 bytes img/jquery-ui/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 178 bytes .../ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 104 bytes .../ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 125 bytes img/jquery-ui/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 3762 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 90 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 129 bytes img/jquery-ui/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes img/jquery-ui/ui-icons_228ef1_256x240.png | Bin 0 -> 5355 bytes img/jquery-ui/ui-icons_ef8c08_256x240.png | Bin 0 -> 4369 bytes img/jquery-ui/ui-icons_ffd27a_256x240.png | Bin 0 -> 4369 bytes img/jquery-ui/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes img/l/1.jpg | Bin 0 -> 665 bytes img/l/2.jpg | Bin 0 -> 679 bytes img/l/3.jpg | Bin 0 -> 696 bytes img/l/4.jpg | Bin 0 -> 924 bytes img/l/5.jpg | Bin 0 -> 911 bytes img/l/en-default-home.jpg | Bin 0 -> 3026 bytes img/l/en-default-large.jpg | Bin 0 -> 6819 bytes img/l/en-default-large_scene.jpg | Bin 0 -> 4298 bytes img/l/en-default-medium.jpg | Bin 0 -> 1740 bytes img/l/en-default-small.jpg | Bin 0 -> 1056 bytes img/l/en-default-thickbox.jpg | Bin 0 -> 9401 bytes img/l/en.jpg | Bin 0 -> 10859 bytes img/l/index.php | 36 + img/l/none.jpg | Bin 0 -> 443 bytes img/loader.gif | Bin 0 -> 3719 bytes img/loadingAnimation.gif | Bin 0 -> 5886 bytes img/logo.jpg | Bin 0 -> 6305 bytes img/logo_stores.gif | Bin 0 -> 806 bytes img/m/1-large.jpg | Bin 0 -> 4108 bytes img/m/1-medium.jpg | Bin 0 -> 2056 bytes img/m/1-small.jpg | Bin 0 -> 1236 bytes img/m/1.jpg | Bin 0 -> 2680 bytes img/m/2-large.jpg | Bin 0 -> 4222 bytes img/m/2-medium.jpg | Bin 0 -> 1369 bytes img/m/2-small.jpg | Bin 0 -> 1024 bytes img/m/2.jpg | Bin 0 -> 2596 bytes img/m/de-default-large.jpg | Bin 0 -> 8343 bytes img/m/de-default-medium.jpg | Bin 0 -> 2010 bytes img/m/de-default-small.jpg | Bin 0 -> 1220 bytes img/m/de.jpg | Bin 0 -> 11205 bytes img/m/en-default-large.jpg | Bin 0 -> 6819 bytes img/m/en-default-medium.jpg | Bin 0 -> 1740 bytes img/m/en-default-small.jpg | Bin 0 -> 1047 bytes img/m/en.jpg | Bin 0 -> 10859 bytes img/m/es-default-large.jpg | Bin 0 -> 6826 bytes img/m/es-default-medium.jpg | Bin 0 -> 1802 bytes img/m/es-default-small.jpg | Bin 0 -> 1014 bytes img/m/es-default-thickbox.jpg | Bin 0 -> 8219 bytes img/m/es.jpg | Bin 0 -> 6828 bytes img/m/fr-default-large.jpg | Bin 0 -> 8272 bytes img/m/fr-default-medium.jpg | Bin 0 -> 2223 bytes img/m/fr-default-small.jpg | Bin 0 -> 1252 bytes img/m/fr.jpg | Bin 0 -> 13454 bytes img/m/index.php | 36 + img/m/it-default-large.jpg | Bin 0 -> 11828 bytes img/m/it-default-medium.jpg | Bin 0 -> 2607 bytes img/m/it-default-small.jpg | Bin 0 -> 1454 bytes img/m/it.jpg | Bin 0 -> 35628 bytes img/macFFBgHack.png | Bin 0 -> 207 bytes img/os/1.gif | Bin 0 -> 958 bytes img/os/10.gif | Bin 0 -> 1030 bytes img/os/11.gif | Bin 0 -> 608 bytes img/os/12.gif | Bin 0 -> 976 bytes img/os/2.gif | Bin 0 -> 334 bytes img/os/3.gif | Bin 0 -> 1046 bytes img/os/4.gif | Bin 0 -> 615 bytes img/os/5.gif | Bin 0 -> 980 bytes img/os/6.gif | Bin 0 -> 379 bytes img/os/7.gif | Bin 0 -> 596 bytes img/os/8.gif | Bin 0 -> 387 bytes img/os/9.gif | Bin 0 -> 1071 bytes img/os/index.php | 36 + img/p/1/5/15-home.jpg | Bin 0 -> 3535 bytes img/p/1/5/15-large.jpg | Bin 0 -> 11546 bytes img/p/1/5/15-medium.jpg | Bin 0 -> 2043 bytes img/p/1/5/15-small.jpg | Bin 0 -> 1222 bytes img/p/1/5/15-thickbox.jpg | Bin 0 -> 31270 bytes img/p/1/5/15.jpg | Bin 0 -> 33661 bytes img/p/1/6/16-home.jpg | Bin 0 -> 2031 bytes img/p/1/6/16-large.jpg | Bin 0 -> 5343 bytes img/p/1/6/16-medium.jpg | Bin 0 -> 1253 bytes img/p/1/6/16-small.jpg | Bin 0 -> 916 bytes img/p/1/6/16-thickbox.jpg | Bin 0 -> 13142 bytes img/p/1/6/16.jpg | Bin 0 -> 13867 bytes img/p/1/7/17-home.jpg | Bin 0 -> 3616 bytes img/p/1/7/17-large.jpg | Bin 0 -> 12173 bytes img/p/1/7/17-medium.jpg | Bin 0 -> 1815 bytes img/p/1/7/17-small.jpg | Bin 0 -> 1085 bytes img/p/1/7/17-thickbox.jpg | Bin 0 -> 34087 bytes img/p/1/7/17.jpg | Bin 0 -> 36721 bytes img/p/1/8/18-home.jpg | Bin 0 -> 3136 bytes img/p/1/8/18-large.jpg | Bin 0 -> 9889 bytes img/p/1/8/18-medium.jpg | Bin 0 -> 1764 bytes img/p/1/8/18-small.jpg | Bin 0 -> 1121 bytes img/p/1/8/18-thickbox.jpg | Bin 0 -> 27010 bytes img/p/1/8/18.jpg | Bin 0 -> 29036 bytes img/p/1/9/19-home.jpg | Bin 0 -> 2476 bytes img/p/1/9/19-large.jpg | Bin 0 -> 7234 bytes img/p/1/9/19-medium.jpg | Bin 0 -> 1372 bytes img/p/1/9/19-small.jpg | Bin 0 -> 932 bytes img/p/1/9/19-thickbox.jpg | Bin 0 -> 18894 bytes img/p/1/9/19.jpg | Bin 0 -> 22068 bytes img/p/2-46-home.jpg | Bin 0 -> 4440 bytes img/p/2-46-large.jpg | Bin 0 -> 6062 bytes img/p/2-46-medium.jpg | Bin 0 -> 2644 bytes img/p/2-46-small.jpg | Bin 0 -> 1487 bytes img/p/2-46-thickbox.jpg | Bin 0 -> 7778 bytes img/p/2-46.jpg | Bin 0 -> 4960 bytes img/p/2-47-home.jpg | Bin 0 -> 4130 bytes img/p/2-47-large.jpg | Bin 0 -> 5675 bytes img/p/2-47-medium.jpg | Bin 0 -> 2486 bytes img/p/2-47-small.jpg | Bin 0 -> 1392 bytes img/p/2-47-thickbox.jpg | Bin 0 -> 7464 bytes img/p/2-47.jpg | Bin 0 -> 4670 bytes img/p/2-48-home.jpg | Bin 0 -> 4141 bytes img/p/2-48-large.jpg | Bin 0 -> 5713 bytes img/p/2-48-medium.jpg | Bin 0 -> 2451 bytes img/p/2-48-small.jpg | Bin 0 -> 1390 bytes img/p/2-48-thickbox.jpg | Bin 0 -> 7431 bytes img/p/2-48.jpg | Bin 0 -> 4639 bytes img/p/2-49-home.jpg | Bin 0 -> 2746 bytes img/p/2-49-large.jpg | Bin 0 -> 3948 bytes img/p/2-49-medium.jpg | Bin 0 -> 1680 bytes img/p/2-49-small.jpg | Bin 0 -> 1041 bytes img/p/2-49-thickbox.jpg | Bin 0 -> 5645 bytes img/p/2-49.jpg | Bin 0 -> 2988 bytes img/p/2/0/20-home.jpg | Bin 0 -> 3409 bytes img/p/2/0/20-large.jpg | Bin 0 -> 10580 bytes img/p/2/0/20-medium.jpg | Bin 0 -> 1823 bytes img/p/2/0/20-small.jpg | Bin 0 -> 1155 bytes img/p/2/0/20-thickbox.jpg | Bin 0 -> 27873 bytes img/p/2/0/20.jpg | Bin 0 -> 30294 bytes img/p/2/4/24-home.jpg | Bin 0 -> 3322 bytes img/p/2/4/24-large.jpg | Bin 0 -> 10325 bytes img/p/2/4/24-medium.jpg | Bin 0 -> 1870 bytes img/p/2/4/24-small.jpg | Bin 0 -> 1177 bytes img/p/2/4/24-thickbox.jpg | Bin 0 -> 28642 bytes img/p/2/4/24.jpg | Bin 0 -> 34942 bytes img/p/2/6/26-home.jpg | Bin 0 -> 3079 bytes img/p/2/6/26-large.jpg | Bin 0 -> 9486 bytes img/p/2/6/26-medium.jpg | Bin 0 -> 1775 bytes img/p/2/6/26-small.jpg | Bin 0 -> 1147 bytes img/p/2/6/26-thickbox.jpg | Bin 0 -> 25279 bytes img/p/2/6/26.jpg | Bin 0 -> 28689 bytes img/p/2/7/27-home.jpg | Bin 0 -> 3140 bytes img/p/2/7/27-large.jpg | Bin 0 -> 11199 bytes img/p/2/7/27-medium.jpg | Bin 0 -> 1751 bytes img/p/2/7/27-small.jpg | Bin 0 -> 1109 bytes img/p/2/7/27-thickbox.jpg | Bin 0 -> 34555 bytes img/p/2/7/27.jpg | Bin 0 -> 59782 bytes img/p/2/9/29-home.jpg | Bin 0 -> 3699 bytes img/p/2/9/29-large.jpg | Bin 0 -> 11884 bytes img/p/2/9/29-medium.jpg | Bin 0 -> 2127 bytes img/p/2/9/29-small.jpg | Bin 0 -> 1184 bytes img/p/2/9/29-thickbox.jpg | Bin 0 -> 31419 bytes img/p/2/9/29.jpg | Bin 0 -> 44471 bytes img/p/3/0/30-home.jpg | Bin 0 -> 2480 bytes img/p/3/0/30-large.jpg | Bin 0 -> 5924 bytes img/p/3/0/30-medium.jpg | Bin 0 -> 1463 bytes img/p/3/0/30-small.jpg | Bin 0 -> 977 bytes img/p/3/0/30-thickbox.jpg | Bin 0 -> 16029 bytes img/p/3/0/30.jpg | Bin 0 -> 17755 bytes img/p/3/2/32-home.jpg | Bin 0 -> 4131 bytes img/p/3/2/32-large.jpg | Bin 0 -> 12135 bytes img/p/3/2/32-medium.jpg | Bin 0 -> 2239 bytes img/p/3/2/32-small.jpg | Bin 0 -> 1283 bytes img/p/3/2/32-thickbox.jpg | Bin 0 -> 33248 bytes img/p/3/2/32.jpg | Bin 0 -> 38998 bytes img/p/3/3-home.jpg | Bin 0 -> 2922 bytes img/p/3/3-large.jpg | Bin 0 -> 7280 bytes img/p/3/3-medium.jpg | Bin 0 -> 1712 bytes img/p/3/3-small.jpg | Bin 0 -> 1072 bytes img/p/3/3-thickbox.jpg | Bin 0 -> 18490 bytes img/p/3/3.jpg | Bin 0 -> 17009 bytes img/p/3/3/33-home.jpg | Bin 0 -> 4217 bytes img/p/3/3/33-large.jpg | Bin 0 -> 15199 bytes img/p/3/3/33-medium.jpg | Bin 0 -> 2235 bytes img/p/3/3/33-small.jpg | Bin 0 -> 1290 bytes img/p/3/3/33-thickbox.jpg | Bin 0 -> 24333 bytes img/p/3/3/33.jpg | Bin 0 -> 21811 bytes img/p/3/6/36-home.jpg | Bin 0 -> 4169 bytes img/p/3/6/36-large.jpg | Bin 0 -> 13183 bytes img/p/3/6/36-medium.jpg | Bin 0 -> 2388 bytes img/p/3/6/36-small.jpg | Bin 0 -> 1371 bytes img/p/3/6/36-thickbox.jpg | Bin 0 -> 28777 bytes img/p/3/6/36.jpg | Bin 0 -> 27319 bytes img/p/3/7/37-home.jpg | Bin 0 -> 3026 bytes img/p/3/7/37-large.jpg | Bin 0 -> 8818 bytes img/p/3/7/37-medium.jpg | Bin 0 -> 1751 bytes img/p/3/7/37-small.jpg | Bin 0 -> 1091 bytes img/p/3/7/37-thickbox.jpg | Bin 0 -> 10475 bytes img/p/3/7/37.jpg | Bin 0 -> 7783 bytes img/p/3/8/38-home.jpg | Bin 0 -> 3619 bytes img/p/3/8/38-large.jpg | Bin 0 -> 10060 bytes img/p/3/8/38-medium.jpg | Bin 0 -> 2130 bytes img/p/3/8/38-small.jpg | Bin 0 -> 1269 bytes img/p/3/8/38-thickbox.jpg | Bin 0 -> 11716 bytes img/p/3/8/38.jpg | Bin 0 -> 9207 bytes img/p/3/9/39-home.jpg | Bin 0 -> 3349 bytes img/p/3/9/39-large.jpg | Bin 0 -> 9503 bytes img/p/3/9/39-medium.jpg | Bin 0 -> 1999 bytes img/p/3/9/39-small.jpg | Bin 0 -> 1208 bytes img/p/3/9/39-thickbox.jpg | Bin 0 -> 11099 bytes img/p/3/9/39.jpg | Bin 0 -> 8425 bytes img/p/4/0/40-home.jpg | Bin 0 -> 3886 bytes img/p/4/0/40-large.jpg | Bin 0 -> 11322 bytes img/p/4/0/40-medium.jpg | Bin 0 -> 2324 bytes img/p/4/0/40-small.jpg | Bin 0 -> 1426 bytes img/p/4/0/40-thickbox.jpg | Bin 0 -> 15634 bytes img/p/4/0/40.jpg | Bin 0 -> 8809 bytes img/p/4/1/41-home.jpg | Bin 0 -> 3608 bytes img/p/4/1/41-large.jpg | Bin 0 -> 10230 bytes img/p/4/1/41-medium.jpg | Bin 0 -> 2087 bytes img/p/4/1/41-small.jpg | Bin 0 -> 1246 bytes img/p/4/1/41-thickbox.jpg | Bin 0 -> 11816 bytes img/p/4/1/41.jpg | Bin 0 -> 9163 bytes img/p/4/2/42-home.jpg | Bin 0 -> 3877 bytes img/p/4/2/42-large.jpg | Bin 0 -> 11205 bytes img/p/4/2/42-medium.jpg | Bin 0 -> 2262 bytes img/p/4/2/42-small.jpg | Bin 0 -> 1413 bytes img/p/4/2/42-thickbox.jpg | Bin 0 -> 15497 bytes img/p/4/2/42.jpg | Bin 0 -> 8790 bytes img/p/4/4/44-home.jpg | Bin 0 -> 3080 bytes img/p/4/4/44-large.jpg | Bin 0 -> 9088 bytes img/p/4/4/44-medium.jpg | Bin 0 -> 1798 bytes img/p/4/4/44-small.jpg | Bin 0 -> 1107 bytes img/p/4/4/44-thickbox.jpg | Bin 0 -> 10797 bytes img/p/4/4/44.jpg | Bin 0 -> 8156 bytes img/p/4/5/45-home.jpg | Bin 0 -> 3624 bytes img/p/4/5/45-large.jpg | Bin 0 -> 10456 bytes img/p/4/5/45-medium.jpg | Bin 0 -> 2132 bytes img/p/4/5/45-small.jpg | Bin 0 -> 1254 bytes img/p/4/5/45-thickbox.jpg | Bin 0 -> 12172 bytes img/p/4/5/45.jpg | Bin 0 -> 9490 bytes img/p/de-default-home.jpg | Bin 0 -> 3528 bytes img/p/de-default-large.jpg | Bin 0 -> 8343 bytes img/p/de-default-medium.jpg | Bin 0 -> 2010 bytes img/p/de-default-small.jpg | Bin 0 -> 1220 bytes img/p/de-default-thickbox.jpg | Bin 0 -> 12500 bytes img/p/de.jpg | Bin 0 -> 11205 bytes img/p/en-default-home.jpg | Bin 0 -> 3026 bytes img/p/en-default-large.jpg | Bin 0 -> 6819 bytes img/p/en-default-medium.jpg | Bin 0 -> 1740 bytes img/p/en-default-small.jpg | Bin 0 -> 1056 bytes img/p/en-default-thickbox.jpg | Bin 0 -> 8219 bytes img/p/en.jpg | Bin 0 -> 10859 bytes img/p/es-default-home.jpg | Bin 0 -> 3155 bytes img/p/es-default-large.jpg | Bin 0 -> 6826 bytes img/p/es-default-medium.jpg | Bin 0 -> 1802 bytes img/p/es-default-small.jpg | Bin 0 -> 1014 bytes img/p/es-default-thickbox.jpg | Bin 0 -> 8105 bytes img/p/es.jpg | Bin 0 -> 6828 bytes img/p/fr-default-home.jpg | Bin 0 -> 3648 bytes img/p/fr-default-large.jpg | Bin 0 -> 8272 bytes img/p/fr-default-medium.jpg | Bin 0 -> 2223 bytes img/p/fr-default-small.jpg | Bin 0 -> 1259 bytes img/p/fr-default-thickbox.jpg | Bin 0 -> 10087 bytes img/p/fr.jpg | Bin 0 -> 13454 bytes img/p/index.php | 36 + img/p/it-default-home.jpg | Bin 0 -> 4601 bytes img/p/it-default-large.jpg | Bin 0 -> 11828 bytes img/p/it-default-medium.jpg | Bin 0 -> 2607 bytes img/p/it-default-small.jpg | Bin 0 -> 1454 bytes img/p/it-default-thickbox.jpg | Bin 0 -> 15175 bytes img/p/it.jpg | Bin 0 -> 35628 bytes img/s/index.php | 36 + img/scenes/1-large_scene.jpg | Bin 0 -> 36207 bytes img/scenes/1.jpg | Bin 0 -> 34152 bytes img/scenes/2-large_scene.jpg | Bin 0 -> 17003 bytes img/scenes/2.jpg | Bin 0 -> 15334 bytes img/scenes/3-large_scene.jpg | Bin 0 -> 18122 bytes img/scenes/3.jpg | Bin 0 -> 16080 bytes img/scenes/de-default-large_scene.jpg | Bin 0 -> 6770 bytes img/scenes/de-default-thumb_scene.jpg | Bin 0 -> 1584 bytes img/scenes/en-default-large_scene.jpg | Bin 0 -> 4298 bytes img/scenes/en-default-thumb_scene.jpg | Bin 0 -> 1119 bytes img/scenes/es-default-large_scene.jpg | Bin 0 -> 4298 bytes img/scenes/es-default-thumb_scene.jpg | Bin 0 -> 1119 bytes img/scenes/fr-default-large_scene.jpg | Bin 0 -> 6215 bytes img/scenes/fr-default-thumb_scene.jpg | Bin 0 -> 1734 bytes img/scenes/index.php | 36 + img/scenes/it-default-large_scene.jpg | Bin 0 -> 8770 bytes img/scenes/it-default-thumb_scene.jpg | Bin 0 -> 1884 bytes img/scenes/thumbs/1-thumb_scene.jpg | Bin 0 -> 6403 bytes img/scenes/thumbs/2-thumb_scene.jpg | Bin 0 -> 3412 bytes img/scenes/thumbs/3-thumb_scene.jpg | Bin 0 -> 3532 bytes img/scenes/thumbs/index.php | 36 + img/st/1-medium.jpg | Bin 0 -> 2951 bytes img/st/1.jpg | Bin 0 -> 8072 bytes img/st/2-medium.jpg | Bin 0 -> 2674 bytes img/st/2.jpg | Bin 0 -> 8072 bytes img/st/3-medium.jpg | Bin 0 -> 2674 bytes img/st/3.jpg | Bin 0 -> 8072 bytes img/st/4-medium.jpg | Bin 0 -> 2674 bytes img/st/4.jpg | Bin 0 -> 8072 bytes img/st/5-medium.jpg | Bin 0 -> 2674 bytes img/st/5.jpg | Bin 0 -> 8072 bytes img/st/index.php | 36 + img/su/1-large.jpg | Bin 0 -> 8179 bytes img/su/1-medium.jpg | Bin 0 -> 3040 bytes img/su/1-small.jpg | Bin 0 -> 1580 bytes img/su/1.jpg | Bin 0 -> 4952 bytes img/su/2-large.jpg | Bin 0 -> 4222 bytes img/su/2-medium.jpg | Bin 0 -> 1369 bytes img/su/2-small.jpg | Bin 0 -> 1024 bytes img/su/2.jpg | Bin 0 -> 2596 bytes img/su/de-default-large.jpg | Bin 0 -> 8343 bytes img/su/de-default-medium.jpg | Bin 0 -> 2010 bytes img/su/de-default-small.jpg | Bin 0 -> 1220 bytes img/su/de.jpg | Bin 0 -> 11205 bytes img/su/en-default-large.jpg | Bin 0 -> 5919 bytes img/su/en-default-medium.jpg | Bin 0 -> 1845 bytes img/su/en-default-small.jpg | Bin 0 -> 968 bytes img/su/en.jpg | Bin 0 -> 10859 bytes img/su/es-default-large.jpg | Bin 0 -> 5919 bytes img/su/es-default-medium.jpg | Bin 0 -> 1845 bytes img/su/es-default-small.jpg | Bin 0 -> 968 bytes img/su/es.jpg | Bin 0 -> 10859 bytes img/su/fr-default-large.jpg | Bin 0 -> 7302 bytes img/su/fr-default-medium.jpg | Bin 0 -> 2290 bytes img/su/fr-default-small.jpg | Bin 0 -> 1185 bytes img/su/fr.jpg | Bin 0 -> 13454 bytes img/su/index.php | 36 + img/su/it-default-large.jpg | Bin 0 -> 11828 bytes img/su/it-default-medium.jpg | Bin 0 -> 2607 bytes img/su/it-default-small.jpg | Bin 0 -> 1454 bytes img/su/it.jpg | Bin 0 -> 35628 bytes img/t/0.gif | Bin 0 -> 597 bytes img/t/AdminAccess.gif | Bin 0 -> 631 bytes img/t/AdminAddonsCatalog.gif | Bin 0 -> 1461 bytes img/t/AdminAddonsMyAccount.gif | Bin 0 -> 1461 bytes img/t/AdminAddresses.gif | Bin 0 -> 604 bytes img/t/AdminAliases.gif | Bin 0 -> 956 bytes img/t/AdminAppearance.gif | Bin 0 -> 1025 bytes img/t/AdminAttachments.gif | Bin 0 -> 1040 bytes img/t/AdminAttributesGroups.gif | Bin 0 -> 612 bytes img/t/AdminBackup.gif | Bin 0 -> 1052 bytes img/t/AdminCMS.gif | Bin 0 -> 1026 bytes img/t/AdminCMSContent.gif | Bin 0 -> 1026 bytes img/t/AdminCarriers.gif | Bin 0 -> 583 bytes img/t/AdminCarts.gif | Bin 0 -> 1000 bytes img/t/AdminCatalog.gif | Bin 0 -> 570 bytes img/t/AdminContact.gif | Bin 0 -> 354 bytes img/t/AdminContacts.gif | Bin 0 -> 604 bytes img/t/AdminCountries.gif | Bin 0 -> 1065 bytes img/t/AdminCounty.gif | Bin 0 -> 1064 bytes img/t/AdminCurrencies.gif | Bin 0 -> 358 bytes img/t/AdminCustomerThreads.gif | Bin 0 -> 587 bytes img/t/AdminCustomers.gif | Bin 0 -> 587 bytes img/t/AdminDb.gif | Bin 0 -> 279 bytes img/t/AdminDeliverySlip.gif | Bin 0 -> 926 bytes img/t/AdminDiscounts.gif | Bin 0 -> 248 bytes img/t/AdminEmails.gif | Bin 0 -> 582 bytes img/t/AdminEmployees.gif | Bin 0 -> 586 bytes img/t/AdminFeatures.gif | Bin 0 -> 998 bytes img/t/AdminGenerator.gif | Bin 0 -> 1022 bytes img/t/AdminGeolocalization.gif | Bin 0 -> 1065 bytes img/t/AdminGeolocation.gif | Bin 0 -> 1064 bytes img/t/AdminGroups.gif | Bin 0 -> 1004 bytes img/t/AdminHome.gif | Bin 0 -> 604 bytes img/t/AdminImages.gif | Bin 0 -> 585 bytes img/t/AdminImport.gif | Bin 0 -> 981 bytes img/t/AdminInformation.gif | Bin 0 -> 617 bytes img/t/AdminInvoices.gif | Bin 0 -> 997 bytes img/t/AdminLanguages.gif | Bin 0 -> 1065 bytes img/t/AdminLocalization.gif | Bin 0 -> 1067 bytes img/t/AdminLogs.gif | Bin 0 -> 1027 bytes img/t/AdminManufacturers.gif | Bin 0 -> 280 bytes img/t/AdminMessages.gif | Bin 0 -> 604 bytes img/t/AdminMeta.gif | Bin 0 -> 991 bytes img/t/AdminModules.gif | Bin 0 -> 365 bytes img/t/AdminModulesPositions.gif | Bin 0 -> 1033 bytes img/t/AdminOrderMessage.gif | Bin 0 -> 1055 bytes img/t/AdminOrders.gif | Bin 0 -> 265 bytes img/t/AdminPDF.gif | Bin 0 -> 616 bytes img/t/AdminPPreferences.gif | Bin 0 -> 265 bytes img/t/AdminPayment.gif | Bin 0 -> 1042 bytes img/t/AdminPerformance.gif | Bin 0 -> 959 bytes img/t/AdminPreferences.gif | Bin 0 -> 991 bytes img/t/AdminProfiles.gif | Bin 0 -> 932 bytes img/t/AdminQuickAccesses.gif | Bin 0 -> 971 bytes img/t/AdminRangePrice.gif | Bin 0 -> 358 bytes img/t/AdminRangeWeight.gif | Bin 0 -> 1062 bytes img/t/AdminReferrers.gif | Bin 0 -> 1036 bytes img/t/AdminReturn.gif | Bin 0 -> 1062 bytes img/t/AdminScenes.gif | Bin 0 -> 1053 bytes img/t/AdminSearch.gif | Bin 0 -> 989 bytes img/t/AdminSearchConf.gif | Bin 0 -> 355 bytes img/t/AdminSearchEngines.gif | Bin 0 -> 1013 bytes img/t/AdminShipping.gif | Bin 0 -> 583 bytes img/t/AdminShop.gif | Bin 0 -> 1010 bytes img/t/AdminSlip.gif | Bin 0 -> 1027 bytes img/t/AdminStates.gif | Bin 0 -> 1065 bytes img/t/AdminStats.gif | Bin 0 -> 606 bytes img/t/AdminStatsConf.gif | Bin 0 -> 1027 bytes img/t/AdminStatsModules.gif | Bin 0 -> 997 bytes img/t/AdminStatuses.gif | Bin 0 -> 618 bytes img/t/AdminStockMvt.gif | Bin 0 -> 1709 bytes img/t/AdminStores.gif | Bin 0 -> 1006 bytes img/t/AdminSubDomains.gif | Bin 0 -> 1071 bytes img/t/AdminSuppliers.gif | Bin 0 -> 266 bytes img/t/AdminTabs.gif | Bin 0 -> 347 bytes img/t/AdminTags.gif | Bin 0 -> 981 bytes img/t/AdminTaxRulesGroup.gif | Bin 0 -> 383 bytes img/t/AdminTaxes.gif | Bin 0 -> 383 bytes img/t/AdminThemes.gif | Bin 0 -> 1025 bytes img/t/AdminTools.gif | Bin 0 -> 351 bytes img/t/AdminTracking.gif | Bin 0 -> 898 bytes img/t/AdminTranslations.gif | Bin 0 -> 919 bytes img/t/AdminWebservice.gif | Bin 0 -> 613 bytes img/t/AdminZones.gif | Bin 0 -> 1065 bytes img/t/index.php | 36 + img/tmp/index.php | 36 + index.php | 30 + init.php | 29 + install-dev/classes/AddConfToFile.php | 91 + install-dev/classes/ConfigurationTest.php | 225 + install-dev/classes/GetVersionFromDb.php | 665 + install-dev/classes/Language.php | 652 + install-dev/classes/LanguagesManager.php | 105 + install-dev/classes/Module.php | 1074 ++ install-dev/classes/ToolsInstall.php | 191 + install-dev/controller.js | 1046 + install-dev/img/01-gd100.png | Bin 0 -> 170 bytes install-dev/img/01-pt100.png | Bin 0 -> 158 bytes install-dev/img/01-pt70.png | Bin 0 -> 157 bytes install-dev/img/02-gd100.png | Bin 0 -> 284 bytes install-dev/img/02-pt100.png | Bin 0 -> 248 bytes install-dev/img/02-pt70.png | Bin 0 -> 279 bytes install-dev/img/03-gd100.png | Bin 0 -> 308 bytes install-dev/img/03-pt100.png | Bin 0 -> 270 bytes install-dev/img/03-pt70.png | Bin 0 -> 292 bytes install-dev/img/04-gd100.png | Bin 0 -> 241 bytes install-dev/img/04-pt100.png | Bin 0 -> 211 bytes install-dev/img/04-pt70.png | Bin 0 -> 217 bytes install-dev/img/05-gd100.png | Bin 0 -> 302 bytes install-dev/img/05-pt100.png | Bin 0 -> 259 bytes install-dev/img/05-pt70.png | Bin 0 -> 259 bytes install-dev/img/bad.gif | Bin 0 -> 594 bytes install-dev/img/bg-body.png | Bin 0 -> 143 bytes install-dev/img/bg-ctnr.png | Bin 0 -> 306 bytes install-dev/img/bg-tab.png | Bin 0 -> 190 bytes install-dev/img/bg_help.png | Bin 0 -> 908 bytes install-dev/img/boutonpt-disabled.png | Bin 0 -> 719 bytes install-dev/img/boutonpt-on.png | Bin 0 -> 714 bytes install-dev/img/boutonpt-over.png | Bin 0 -> 701 bytes install-dev/img/bt-dsbl.png | Bin 0 -> 474 bytes install-dev/img/bt-hover.png | Bin 0 -> 752 bytes install-dev/img/bt.png | Bin 0 -> 772 bytes install-dev/img/btn-installeur.png | Bin 0 -> 2330 bytes install-dev/img/bullet.png | Bin 0 -> 1265 bytes install-dev/img/ico_help.gif | Bin 0 -> 1246 bytes install-dev/img/logo.png | Bin 0 -> 15664 bytes install-dev/img/ok.gif | Bin 0 -> 610 bytes install-dev/img/ombrage-bas.png | Bin 0 -> 342 bytes install-dev/img/ombrage-droit.png | Bin 0 -> 243 bytes install-dev/img/phone.png | Bin 0 -> 697 bytes install-dev/img/puce.gif | Bin 0 -> 683 bytes install-dev/img/shadow-left.png | Bin 0 -> 254 bytes install-dev/index.php | 1164 ++ install-dev/langs/de.php | 285 + install-dev/langs/es.php | 285 + install-dev/langs/fr.php | 289 + install-dev/langs/it.php | 272 + install-dev/langs/list.xml | 53 + install-dev/langs/us.php | 85 + install-dev/model.php | 116 + install-dev/module_tools.php | 37 + install-dev/php/add_missing_rewrite_value.php | 45 + install-dev/php/add_module_to_hook.php | 58 + install-dev/php/add_new_tab.php | 65 + install-dev/php/alter_blocklink.php | 36 + install-dev/php/alter_cms_block.php | 40 + install-dev/php/blocknewsletter.php | 33 + .../php/check_webservice_account_table.php | 44 + install-dev/php/cms_block.php | 33 + install-dev/php/confcleaner.php | 48 + install-dev/php/country_to_timezone.php | 278 + install-dev/php/create_multistore.php | 41 + install-dev/php/customizations.php | 44 + install-dev/php/database_structure.php | 47 + install-dev/php/deliverynumber.php | 55 + install-dev/php/desactivatecustommodules.php | 65 + install-dev/php/editorial_update.php | 73 + install-dev/php/generate_ntree.php | 31 + install-dev/php/generate_tax_rules.php | 87 + install-dev/php/gridextjs_deprecated.php | 35 + install-dev/php/invoicenumber.php | 55 + .../php/migrate_block_info_to_cms_block.php | 57 + install-dev/php/module_tools.php | 37 + install-dev/php/move_crossselling.php | 14 + install-dev/php/price_converter.php | 50 + install-dev/php/regenerate_level_depth.php | 58 + .../php/remove_duplicate_category_groups.php | 52 + install-dev/php/remove_module_from_hook.php | 53 + install-dev/php/reorderpositions.php | 75 + .../php/setallgroupsonhomecategory.php | 40 + install-dev/php/setdiscountcategory.php | 37 + install-dev/php/setpaymentmodule.php | 54 + install-dev/php/setpaymentmodulegroup.php | 50 + install-dev/php/shop_url.php | 35 + install-dev/php/update_for_13version.php | 16 + install-dev/php/update_image_size_in_db.php | 42 + install-dev/php/update_module_followup.php | 37 + install-dev/php/update_module_loyalty.php | 45 + install-dev/php/update_order_details.php | 39 + .../php/update_products_ecotax_v133.php | 36 + install-dev/php/updatecarrierurl.php | 43 + install-dev/php/updatemodulessql.php | 41 + install-dev/php/updateproductcomments.php | 58 + .../php/updatetabicon_from_11version.php | 47 + install-dev/php/utf8.php | 135 + install-dev/preactivation.php | 122 + install-dev/sql/db.sql | 1883 ++ install-dev/sql/db_settings_extends.sql | 1142 ++ install-dev/sql/db_settings_lite.sql | 1175 ++ install-dev/sql/upgrade/0.9.1.2.sql | 30 + install-dev/sql/upgrade/0.9.1.sql | 9 + install-dev/sql/upgrade/0.9.5.1.sql | 66 + install-dev/sql/upgrade/0.9.5.2.sql | 5 + install-dev/sql/upgrade/0.9.6.1.sql | 51 + install-dev/sql/upgrade/0.9.6.2.sql | 7 + install-dev/sql/upgrade/0.9.7.1.sql | 14 + install-dev/sql/upgrade/0.9.7.2.sql | 21 + install-dev/sql/upgrade/0.9.sql | 39 + install-dev/sql/upgrade/1.0.0.1.sql | 122 + install-dev/sql/upgrade/1.0.0.2.sql | 13 + install-dev/sql/upgrade/1.0.0.3.sql | 441 + install-dev/sql/upgrade/1.0.0.4.sql | 88 + install-dev/sql/upgrade/1.0.0.5.sql | 35 + install-dev/sql/upgrade/1.0.0.6.sql | 11 + install-dev/sql/upgrade/1.0.0.7.sql | 21 + install-dev/sql/upgrade/1.0.0.8.sql | 17 + install-dev/sql/upgrade/1.1.0.1.sql | 629 + install-dev/sql/upgrade/1.1.0.2.sql | 3 + install-dev/sql/upgrade/1.1.0.3.sql | 10 + install-dev/sql/upgrade/1.1.0.4.sql | 28 + install-dev/sql/upgrade/1.1.0.5.sql | 20 + install-dev/sql/upgrade/1.2.0.1.sql | 1071 ++ install-dev/sql/upgrade/1.2.0.2.sql | 610 + install-dev/sql/upgrade/1.2.0.3.sql | 33 + install-dev/sql/upgrade/1.2.0.4.sql | 10 + install-dev/sql/upgrade/1.2.0.5.sql | 17 + install-dev/sql/upgrade/1.2.0.6.sql | 14 + install-dev/sql/upgrade/1.2.0.7.sql | 12 + install-dev/sql/upgrade/1.2.0.8.sql | 10 + install-dev/sql/upgrade/1.2.1.0.sql | 16 + install-dev/sql/upgrade/1.2.2.0.sql | 6 + install-dev/sql/upgrade/1.2.3.0.sql | 3 + install-dev/sql/upgrade/1.2.4.0.sql | 1 + install-dev/sql/upgrade/1.2.5.0.sql | 1 + install-dev/sql/upgrade/1.3.0.1.sql | 92 + install-dev/sql/upgrade/1.3.0.10.sql | 5 + install-dev/sql/upgrade/1.3.0.2.sql | 147 + install-dev/sql/upgrade/1.3.0.3.sql | 15 + install-dev/sql/upgrade/1.3.0.4.sql | 83 + install-dev/sql/upgrade/1.3.0.5.sql | 1 + install-dev/sql/upgrade/1.3.0.6.sql | 1 + install-dev/sql/upgrade/1.3.0.7.sql | 3 + install-dev/sql/upgrade/1.3.0.8.sql | 5 + install-dev/sql/upgrade/1.3.0.9.sql | 1 + install-dev/sql/upgrade/1.3.1.1.sql | 1 + install-dev/sql/upgrade/1.3.2.1.sql | 3 + install-dev/sql/upgrade/1.3.2.2.sql | 27 + install-dev/sql/upgrade/1.3.2.3.sql | 1 + install-dev/sql/upgrade/1.3.3.0.sql | 8 + install-dev/sql/upgrade/1.3.4.0.sql | 1 + install-dev/sql/upgrade/1.3.5.0.sql | 1 + install-dev/sql/upgrade/1.3.6.0.sql | 3 + install-dev/sql/upgrade/1.3.7.0.sql | 1 + install-dev/sql/upgrade/1.4.0.1.sql | 2 + install-dev/sql/upgrade/1.4.0.10.sql | 20 + install-dev/sql/upgrade/1.4.0.11.sql | 35 + install-dev/sql/upgrade/1.4.0.12.sql | 7 + install-dev/sql/upgrade/1.4.0.13.sql | 1 + install-dev/sql/upgrade/1.4.0.14.sql | 24 + install-dev/sql/upgrade/1.4.0.15.sql | 41 + install-dev/sql/upgrade/1.4.0.16.sql | 38 + install-dev/sql/upgrade/1.4.0.17.sql | 22 + install-dev/sql/upgrade/1.4.0.2.sql | 694 + install-dev/sql/upgrade/1.4.0.3.sql | 67 + install-dev/sql/upgrade/1.4.0.4.sql | 21 + install-dev/sql/upgrade/1.4.0.5.sql | 73 + install-dev/sql/upgrade/1.4.0.6.sql | 12 + install-dev/sql/upgrade/1.4.0.7.sql | 10 + install-dev/sql/upgrade/1.4.0.8.sql | 35 + install-dev/sql/upgrade/1.4.0.9.sql | 16 + install-dev/sql/upgrade/1.4.1.0.sql | 43 + install-dev/sql/upgrade/1.4.2.0.sql | 28 + install-dev/sql/upgrade/1.4.2.1.sql | 3 + install-dev/sql/upgrade/1.4.2.2.sql | 11 + install-dev/sql/upgrade/1.4.2.3.sql | 30 + install-dev/sql/upgrade/1.4.2.4.sql | 10 + install-dev/sql/upgrade/1.4.2.5.sql | 4 + install-dev/sql/upgrade/1.4.3.sql | 16 + install-dev/sql/upgrade/1.5.0.0.sql | 287 + install-dev/todo_1.5.txt | 1 + install-dev/view.css | 594 + install-dev/xml/checkConfig.php | 90 + install-dev/xml/checkDB.php | 29 + install-dev/xml/checkMail.php | 44 + install-dev/xml/checkShopInfos.php | 287 + install-dev/xml/createDB.php | 240 + install-dev/xml/doUpgrade.php | 386 + install-dev/xml/getNonNativeModules.php | 36 + install-dev/xml/getVersionFromDb.php | 85 + install-dev/xml/uploadLogo.php | 116 + js/admin-dnd.js | 168 + js/admin-scene-cropping.js | 202 + js/admin.js | 846 + js/adminImport.js | 111 + js/ajax.js | 131 + js/attributesBack.js | 350 + js/checkLangPack.js | 50 + js/cropper/builder.js | 101 + js/cropper/cropper.css | 143 + js/cropper/cropper.js | 572 + js/cropper/dragdrop.js | 915 + js/cropper/index.php | 11 + js/cropper/loader.js | 90 + js/cropper/prototype.js | 2006 ++ js/cropper/scriptaculous.js | 47 + js/date.js | 467 + js/gg-translate.js | 79 + js/hookLiveEdit.js | 218 + js/index.php | 36 + js/jquery/accordion/accordion.css | 695 + js/jquery/accordion/accordion.ui.js | 402 + js/jquery/ajaxfileupload.js | 53 + js/jquery/datepicker/000000.png | Bin 0 -> 178 bytes js/jquery/datepicker/666666.png | Bin 0 -> 395 bytes js/jquery/datepicker/b81900.png | Bin 0 -> 403 bytes js/jquery/datepicker/datepicker.css | 875 + js/jquery/datepicker/eeeeee.png | Bin 0 -> 201 bytes js/jquery/datepicker/f6a828.png | Bin 0 -> 3762 bytes js/jquery/datepicker/f6f6f6.png | Bin 0 -> 895 bytes js/jquery/datepicker/fdf5ce.png | Bin 0 -> 235 bytes js/jquery/datepicker/ffe45c.png | Bin 0 -> 249 bytes js/jquery/datepicker/ffffff.png | Bin 0 -> 207 bytes js/jquery/datepicker/icons222222.png | Bin 0 -> 10566 bytes js/jquery/datepicker/icons228ef1.png | Bin 0 -> 10653 bytes js/jquery/datepicker/iconsef8c08.png | Bin 0 -> 10636 bytes js/jquery/datepicker/iconsffd27a.png | Bin 0 -> 10662 bytes js/jquery/datepicker/iconsffffff.png | Bin 0 -> 10356 bytes js/jquery/datepicker/index.php | 11 + .../jquery-ui-personalized-1.6rc4.packed.js | 1 + js/jquery/datepicker/ui/i18n/index.php | 11 + .../datepicker/ui/i18n/jquery.ui.i18n.all.js | 909 + .../datepicker/ui/i18n/ui.datepicker-ar.js | 26 + .../datepicker/ui/i18n/ui.datepicker-bg.js | 25 + .../datepicker/ui/i18n/ui.datepicker-ca.js | 25 + .../datepicker/ui/i18n/ui.datepicker-cs.js | 25 + .../datepicker/ui/i18n/ui.datepicker-da.js | 25 + .../datepicker/ui/i18n/ui.datepicker-de.js | 25 + .../datepicker/ui/i18n/ui.datepicker-eo.js | 25 + .../datepicker/ui/i18n/ui.datepicker-es.js | 25 + .../datepicker/ui/i18n/ui.datepicker-fa.js | 25 + .../datepicker/ui/i18n/ui.datepicker-fi.js | 25 + .../datepicker/ui/i18n/ui.datepicker-fr.js | 25 + .../datepicker/ui/i18n/ui.datepicker-he.js | 25 + .../datepicker/ui/i18n/ui.datepicker-hr.js | 25 + .../datepicker/ui/i18n/ui.datepicker-hu.js | 25 + .../datepicker/ui/i18n/ui.datepicker-hy.js | 25 + .../datepicker/ui/i18n/ui.datepicker-id.js | 25 + .../datepicker/ui/i18n/ui.datepicker-is.js | 25 + .../datepicker/ui/i18n/ui.datepicker-it.js | 25 + .../datepicker/ui/i18n/ui.datepicker-ja.js | 26 + .../datepicker/ui/i18n/ui.datepicker-ko.js | 25 + .../datepicker/ui/i18n/ui.datepicker-lt.js | 25 + .../datepicker/ui/i18n/ui.datepicker-lv.js | 25 + .../datepicker/ui/i18n/ui.datepicker-nl.js | 25 + .../datepicker/ui/i18n/ui.datepicker-no.js | 25 + .../datepicker/ui/i18n/ui.datepicker-pl.js | 25 + .../datepicker/ui/i18n/ui.datepicker-pt.js | 25 + .../datepicker/ui/i18n/ui.datepicker-ro.js | 25 + .../datepicker/ui/i18n/ui.datepicker-ru.js | 25 + .../datepicker/ui/i18n/ui.datepicker-sk.js | 25 + .../datepicker/ui/i18n/ui.datepicker-sl.js | 26 + .../datepicker/ui/i18n/ui.datepicker-sq.js | 25 + .../datepicker/ui/i18n/ui.datepicker-sv.js | 25 + .../datepicker/ui/i18n/ui.datepicker-th.js | 25 + .../datepicker/ui/i18n/ui.datepicker-tr.js | 25 + .../datepicker/ui/i18n/ui.datepicker-uk.js | 25 + .../datepicker/ui/i18n/ui.datepicker-zh.js | 25 + js/jquery/datepicker/ui/index.php | 11 + js/jquery/excanvas.min.js | 1 + js/jquery/fancybox/blank.gif | Bin 0 -> 43 bytes js/jquery/fancybox/fancy_close.png | Bin 0 -> 1517 bytes js/jquery/fancybox/fancy_loading.png | Bin 0 -> 10195 bytes js/jquery/fancybox/fancy_nav_left.png | Bin 0 -> 1446 bytes js/jquery/fancybox/fancy_nav_right.png | Bin 0 -> 1454 bytes js/jquery/fancybox/fancy_shadow_e.png | Bin 0 -> 107 bytes js/jquery/fancybox/fancy_shadow_n.png | Bin 0 -> 106 bytes js/jquery/fancybox/fancy_shadow_ne.png | Bin 0 -> 347 bytes js/jquery/fancybox/fancy_shadow_nw.png | Bin 0 -> 324 bytes js/jquery/fancybox/fancy_shadow_s.png | Bin 0 -> 111 bytes js/jquery/fancybox/fancy_shadow_se.png | Bin 0 -> 352 bytes js/jquery/fancybox/fancy_shadow_sw.png | Bin 0 -> 340 bytes js/jquery/fancybox/fancy_shadow_w.png | Bin 0 -> 103 bytes js/jquery/fancybox/fancy_title_left.png | Bin 0 -> 503 bytes js/jquery/fancybox/fancy_title_main.png | Bin 0 -> 96 bytes js/jquery/fancybox/fancy_title_over.png | Bin 0 -> 70 bytes js/jquery/fancybox/fancy_title_right.png | Bin 0 -> 506 bytes js/jquery/fancybox/fancybox-x.png | Bin 0 -> 203 bytes js/jquery/fancybox/fancybox-y.png | Bin 0 -> 176 bytes js/jquery/fancybox/fancybox.png | Bin 0 -> 15287 bytes js/jquery/ifxtransfer.js | 13 + js/jquery/imgareaselect/border-anim-h.gif | Bin 0 -> 219 bytes js/jquery/imgareaselect/border-anim-v.gif | Bin 0 -> 219 bytes js/jquery/imgareaselect/border-h.gif | Bin 0 -> 72 bytes js/jquery/imgareaselect/border-v.gif | Bin 0 -> 72 bytes .../imgareaselect/imgareaselect-animated.css | 41 + .../imgareaselect/imgareaselect-default.css | 41 + .../imgareaselect-deprecated.css | 36 + js/jquery/imgareaselect/index.php | 11 + .../jquery.imgareaselect.pack.js | 1 + js/jquery/index.php | 11 + js/jquery/iutil.prestashop-modifications.js | 26 + js/jquery/jqminmax-compressed.js | 3 + js/jquery/jquery-1.4.4.min.js | 167 + js/jquery/jquery-colorpicker.js | 573 + js/jquery/jquery-fieldselection.js | 84 + js/jquery/jquery-typewatch.pack.js | 89 + js/jquery/jquery-ui-1.8.10.custom.min.js | 782 + js/jquery/jquery.autocomplete.js | 758 + js/jquery/jquery.cluetip.js | 42 + js/jquery/jquery.dimensions.js | 12 + js/jquery/jquery.easing.1.3.js | 146 + js/jquery/jquery.fancybox-1.3.4.js | 1156 ++ js/jquery/jquery.flot.min.js | 1 + js/jquery/jquery.hoverIntent.minified.js | 9 + js/jquery/jquery.idTabs.modified.js | 34 + js/jquery/jquery.jgrowl-1.2.1.min.js | 4 + js/jquery/jquery.jqzoom.js | 80 + js/jquery/jquery.pngFix.pack.js | 11 + js/jquery/jquery.scrollTo-1.4.2-min.js | 11 + js/jquery/jquery.serialScroll-1.2.2-min.js | 10 + js/jquery/jquery.tablednd_0_5.js | 308 + js/jquery/thickbox-modified.js | 40 + js/pluginDetect.js | 1 + js/price.js | 224 + js/sendMailTest.js | 80 + js/tabpane.js | 287 + js/tiny_mce/langs/en.js | 1 + js/tiny_mce/langs/es.js | 1 + js/tiny_mce/langs/et.js | 1 + js/tiny_mce/langs/fi.js | 1 + js/tiny_mce/langs/fr.js | 1 + js/tiny_mce/langs/gl.js | 1 + js/tiny_mce/langs/he.js | 1 + js/tiny_mce/langs/hu.js | 1 + js/tiny_mce/langs/id.js | 1 + js/tiny_mce/langs/it.js | 1 + js/tiny_mce/langs/lt.js | 1 + js/tiny_mce/langs/lv.js | 1 + js/tiny_mce/langs/nl.js | 1 + js/tiny_mce/langs/no.js | 1 + js/tiny_mce/langs/pl.js | 1 + js/tiny_mce/langs/pt.js | 1 + js/tiny_mce/langs/ro.js | 1 + js/tiny_mce/langs/ru.js | 1 + js/tiny_mce/license.txt | 504 + js/tiny_mce/plugins/advimage/css/advimage.css | 13 + js/tiny_mce/plugins/advimage/editor_plugin.js | 1 + .../plugins/advimage/editor_plugin_src.js | 50 + js/tiny_mce/plugins/advimage/image.htm | 235 + js/tiny_mce/plugins/advimage/img/sample.gif | Bin 0 -> 1624 bytes js/tiny_mce/plugins/advimage/js/image.js | 445 + js/tiny_mce/plugins/advimage/langs/ar_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/az_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/be_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/bg_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/bn_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/br_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/bs_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ca_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ch_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/cn_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/cs_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/cy_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/da_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/de_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/dv_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/el_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/en_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/es_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/et_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/eu_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/fa_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/fi_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/fr_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/gl_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/gu_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/he_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/hi_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/hr_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/hu_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/hy_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ia_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/id_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/is_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/it_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ja_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ka_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/kl_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/km_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ko_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/lb_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/lt_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/lv_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/mk_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ml_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/mn_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ms_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/my_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/nb_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/nl_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/nn_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/no_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/pl_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ps_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/pt_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ro_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ru_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/sc_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/se_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/si_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/sk_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/sl_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/sq_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/sr_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/sv_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ta_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/te_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/th_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/tn_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/tr_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/tt_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/tw_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/uk_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/ur_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/vi_dlg.js | 1 + .../plugins/advimage/langs/zh-cn_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/zh_dlg.js | 1 + js/tiny_mce/plugins/advimage/langs/zu_dlg.js | 1 + js/tiny_mce/plugins/advlink/css/advlink.css | 8 + js/tiny_mce/plugins/advlink/editor_plugin.js | 1 + .../plugins/advlink/editor_plugin_src.js | 61 + js/tiny_mce/plugins/advlink/js/advlink.js | 523 + js/tiny_mce/plugins/advlink/langs/ar_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/az_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/be_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/bg_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/bn_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/br_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/bs_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ca_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ch_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/cn_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/cs_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/cy_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/da_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/de_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/dv_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/el_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/en_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/es_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/et_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/eu_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/fa_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/fi_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/fr_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/gl_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/gu_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/he_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/hi_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/hr_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/hu_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/hy_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ia_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/id_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ii_dlg.js | 52 + js/tiny_mce/plugins/advlink/langs/is_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/it_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ja_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ka_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/kl_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/km_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ko_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/lb_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/lt_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/lv_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/mk_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ml_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/mn_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ms_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/my_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/nb_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/nl_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/nn_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/no_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/pl_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ps_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/pt_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ro_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ru_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/sc_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/se_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/si_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/sk_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/sl_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/sq_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/sr_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/sv_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ta_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/te_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/th_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/tn_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/tr_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/tt_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/tw_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/uk_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/ur_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/vi_dlg.js | 1 + .../plugins/advlink/langs/zh-cn_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/zh_dlg.js | 1 + js/tiny_mce/plugins/advlink/langs/zu_dlg.js | 1 + js/tiny_mce/plugins/advlink/link.htm | 338 + .../plugins/contextmenu/editor_plugin.js | 1 + .../plugins/contextmenu/editor_plugin_src.js | 156 + .../plugins/fullscreen/editor_plugin.js | 1 + .../plugins/fullscreen/editor_plugin_src.js | 159 + js/tiny_mce/plugins/fullscreen/fullscreen.htm | 109 + .../plugins/inlinepopups/editor_plugin.js | 1 + .../plugins/inlinepopups/editor_plugin_src.js | 696 + .../skins/clearlooks2/img/alert.gif | Bin 0 -> 818 bytes .../skins/clearlooks2/img/button.gif | Bin 0 -> 280 bytes .../skins/clearlooks2/img/buttons.gif | Bin 0 -> 1195 bytes .../skins/clearlooks2/img/confirm.gif | Bin 0 -> 915 bytes .../skins/clearlooks2/img/corners.gif | Bin 0 -> 911 bytes .../skins/clearlooks2/img/horizontal.gif | Bin 0 -> 769 bytes .../skins/clearlooks2/img/vertical.gif | Bin 0 -> 92 bytes .../inlinepopups/skins/clearlooks2/window.css | 90 + js/tiny_mce/plugins/inlinepopups/template.htm | 387 + js/tiny_mce/plugins/media/css/media.css | 17 + js/tiny_mce/plugins/media/editor_plugin.js | 1 + .../plugins/media/editor_plugin_src.js | 770 + js/tiny_mce/plugins/media/js/embed.js | 73 + js/tiny_mce/plugins/media/js/media.js | 354 + js/tiny_mce/plugins/media/langs/ar_dlg.js | 1 + js/tiny_mce/plugins/media/langs/az_dlg.js | 1 + js/tiny_mce/plugins/media/langs/be_dlg.js | 1 + js/tiny_mce/plugins/media/langs/bg_dlg.js | 1 + js/tiny_mce/plugins/media/langs/bn_dlg.js | 1 + js/tiny_mce/plugins/media/langs/br_dlg.js | 1 + js/tiny_mce/plugins/media/langs/bs_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ca_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ch_dlg.js | 1 + js/tiny_mce/plugins/media/langs/cn_dlg.js | 1 + js/tiny_mce/plugins/media/langs/cs_dlg.js | 1 + js/tiny_mce/plugins/media/langs/cy_dlg.js | 1 + js/tiny_mce/plugins/media/langs/da_dlg.js | 1 + js/tiny_mce/plugins/media/langs/de_dlg.js | 1 + js/tiny_mce/plugins/media/langs/dv_dlg.js | 1 + js/tiny_mce/plugins/media/langs/el_dlg.js | 1 + js/tiny_mce/plugins/media/langs/en_dlg.js | 1 + js/tiny_mce/plugins/media/langs/es_dlg.js | 1 + js/tiny_mce/plugins/media/langs/et_dlg.js | 1 + js/tiny_mce/plugins/media/langs/eu_dlg.js | 1 + js/tiny_mce/plugins/media/langs/fa_dlg.js | 1 + js/tiny_mce/plugins/media/langs/fi_dlg.js | 1 + js/tiny_mce/plugins/media/langs/fr_dlg.js | 1 + js/tiny_mce/plugins/media/langs/gl_dlg.js | 1 + js/tiny_mce/plugins/media/langs/gu_dlg.js | 1 + js/tiny_mce/plugins/media/langs/he_dlg.js | 1 + js/tiny_mce/plugins/media/langs/hi_dlg.js | 1 + js/tiny_mce/plugins/media/langs/hr_dlg.js | 1 + js/tiny_mce/plugins/media/langs/hu_dlg.js | 1 + js/tiny_mce/plugins/media/langs/hy_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ia_dlg.js | 1 + js/tiny_mce/plugins/media/langs/id_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ii_dlg.js | 103 + js/tiny_mce/plugins/media/langs/is_dlg.js | 1 + js/tiny_mce/plugins/media/langs/it_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ja_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ka_dlg.js | 1 + js/tiny_mce/plugins/media/langs/kl_dlg.js | 1 + js/tiny_mce/plugins/media/langs/km_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ko_dlg.js | 1 + js/tiny_mce/plugins/media/langs/lb_dlg.js | 1 + js/tiny_mce/plugins/media/langs/lt_dlg.js | 1 + js/tiny_mce/plugins/media/langs/lv_dlg.js | 1 + js/tiny_mce/plugins/media/langs/mk_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ml_dlg.js | 1 + js/tiny_mce/plugins/media/langs/mn_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ms_dlg.js | 1 + js/tiny_mce/plugins/media/langs/my_dlg.js | 1 + js/tiny_mce/plugins/media/langs/nb_dlg.js | 1 + js/tiny_mce/plugins/media/langs/nl_dlg.js | 1 + js/tiny_mce/plugins/media/langs/nn_dlg.js | 1 + js/tiny_mce/plugins/media/langs/no_dlg.js | 1 + js/tiny_mce/plugins/media/langs/pl_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ps_dlg.js | 1 + js/tiny_mce/plugins/media/langs/pt_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ro_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ru_dlg.js | 1 + js/tiny_mce/plugins/media/langs/sc_dlg.js | 1 + js/tiny_mce/plugins/media/langs/se_dlg.js | 1 + js/tiny_mce/plugins/media/langs/si_dlg.js | 1 + js/tiny_mce/plugins/media/langs/sk_dlg.js | 1 + js/tiny_mce/plugins/media/langs/sl_dlg.js | 1 + js/tiny_mce/plugins/media/langs/sq_dlg.js | 1 + js/tiny_mce/plugins/media/langs/sr_dlg.js | 1 + js/tiny_mce/plugins/media/langs/sv_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ta_dlg.js | 1 + js/tiny_mce/plugins/media/langs/te_dlg.js | 1 + js/tiny_mce/plugins/media/langs/th_dlg.js | 1 + js/tiny_mce/plugins/media/langs/tn_dlg.js | 1 + js/tiny_mce/plugins/media/langs/tr_dlg.js | 1 + js/tiny_mce/plugins/media/langs/tt_dlg.js | 1 + js/tiny_mce/plugins/media/langs/tw_dlg.js | 1 + js/tiny_mce/plugins/media/langs/uk_dlg.js | 1 + js/tiny_mce/plugins/media/langs/ur_dlg.js | 1 + js/tiny_mce/plugins/media/langs/vi_dlg.js | 1 + js/tiny_mce/plugins/media/langs/zh-cn_dlg.js | 1 + js/tiny_mce/plugins/media/langs/zh_dlg.js | 1 + js/tiny_mce/plugins/media/langs/zu_dlg.js | 1 + js/tiny_mce/plugins/media/media.htm | 812 + js/tiny_mce/plugins/media/moxieplayer.swf | Bin 0 -> 33931 bytes .../plugins/pagebreak/editor_plugin.js | 1 + .../plugins/pagebreak/editor_plugin_src.js | 74 + js/tiny_mce/plugins/paste/editor_plugin.js | 1 + .../plugins/paste/editor_plugin_src.js | 930 + js/tiny_mce/plugins/paste/js/pastetext.js | 36 + js/tiny_mce/plugins/paste/js/pasteword.js | 51 + js/tiny_mce/plugins/paste/langs/ar_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/az_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/be_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/bg_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/bn_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/br_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/bs_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ca_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ch_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/cn_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/cs_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/cy_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/da_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/de_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/dv_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/el_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/en_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/es_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/et_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/eu_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/fa_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/fi_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/fr_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/gl_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/gu_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/he_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/hi_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/hr_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/hu_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/hy_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ia_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/id_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ii_dlg.js | 5 + js/tiny_mce/plugins/paste/langs/is_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/it_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ja_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ka_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/kl_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/km_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ko_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/lb_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/lt_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/lv_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/mk_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ml_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/mn_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ms_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/my_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/nb_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/nl_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/nn_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/no_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/pl_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ps_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/pt_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ro_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ru_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/sc_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/se_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/si_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/sk_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/sl_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/sq_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/sr_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/sv_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ta_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/te_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/th_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/tn_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/tr_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/tt_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/tw_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/uk_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/ur_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/vi_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/zh-cn_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/zh_dlg.js | 1 + js/tiny_mce/plugins/paste/langs/zu_dlg.js | 1 + js/tiny_mce/plugins/paste/pastetext.htm | 27 + js/tiny_mce/plugins/paste/pasteword.htm | 21 + js/tiny_mce/plugins/preview/editor_plugin.js | 1 + .../plugins/preview/editor_plugin_src.js | 53 + js/tiny_mce/plugins/preview/example.html | 28 + js/tiny_mce/plugins/preview/jscripts/embed.js | 73 + js/tiny_mce/plugins/preview/preview.html | 17 + .../plugins/searchreplace/langs/ar_dlg.js | 16 + .../plugins/searchreplace/langs/az_dlg.js | 16 + .../plugins/searchreplace/langs/be_dlg.js | 16 + .../plugins/searchreplace/langs/bg_dlg.js | 16 + .../plugins/searchreplace/langs/bn_dlg.js | 16 + .../plugins/searchreplace/langs/br_dlg.js | 16 + .../plugins/searchreplace/langs/bs_dlg.js | 16 + .../plugins/searchreplace/langs/ca_dlg.js | 16 + .../plugins/searchreplace/langs/ch_dlg.js | 16 + .../plugins/searchreplace/langs/cs_dlg.js | 16 + .../plugins/searchreplace/langs/cy_dlg.js | 16 + .../plugins/searchreplace/langs/da_dlg.js | 16 + .../plugins/searchreplace/langs/de_dlg.js | 16 + .../plugins/searchreplace/langs/dv_dlg.js | 16 + .../plugins/searchreplace/langs/el_dlg.js | 16 + .../plugins/searchreplace/langs/en_dlg.js | 16 + .../plugins/searchreplace/langs/es_dlg.js | 16 + .../plugins/searchreplace/langs/et_dlg.js | 16 + .../plugins/searchreplace/langs/eu_dlg.js | 16 + .../plugins/searchreplace/langs/fa_dlg.js | 16 + .../plugins/searchreplace/langs/fi_dlg.js | 16 + .../plugins/searchreplace/langs/fr_dlg.js | 16 + .../plugins/searchreplace/langs/gl_dlg.js | 16 + .../plugins/searchreplace/langs/gu_dlg.js | 16 + .../plugins/searchreplace/langs/he_dlg.js | 16 + .../plugins/searchreplace/langs/hi_dlg.js | 16 + .../plugins/searchreplace/langs/hr_dlg.js | 16 + .../plugins/searchreplace/langs/hu_dlg.js | 16 + .../plugins/searchreplace/langs/hy_dlg.js | 16 + .../plugins/searchreplace/langs/ia_dlg.js | 16 + .../plugins/searchreplace/langs/id_dlg.js | 16 + .../plugins/searchreplace/langs/ii_dlg.js | 16 + .../plugins/searchreplace/langs/is_dlg.js | 16 + .../plugins/searchreplace/langs/it_dlg.js | 16 + .../plugins/searchreplace/langs/ja_dlg.js | 16 + .../plugins/searchreplace/langs/ka_dlg.js | 16 + .../plugins/searchreplace/langs/kl_dlg.js | 16 + .../plugins/searchreplace/langs/ko_dlg.js | 16 + .../plugins/searchreplace/langs/lb_dlg.js | 16 + .../plugins/searchreplace/langs/lt_dlg.js | 16 + .../plugins/searchreplace/langs/lv_dlg.js | 16 + .../plugins/searchreplace/langs/mk_dlg.js | 16 + .../plugins/searchreplace/langs/ml_dlg.js | 16 + .../plugins/searchreplace/langs/mn_dlg.js | 16 + .../plugins/searchreplace/langs/ms_dlg.js | 16 + .../plugins/searchreplace/langs/nb_dlg.js | 16 + .../plugins/searchreplace/langs/nl_dlg.js | 16 + .../plugins/searchreplace/langs/nn_dlg.js | 16 + .../plugins/searchreplace/langs/no_dlg.js | 16 + .../plugins/searchreplace/langs/pl_dlg.js | 16 + .../plugins/searchreplace/langs/ps_dlg.js | 16 + .../plugins/searchreplace/langs/pt_dlg.js | 16 + .../plugins/searchreplace/langs/ro_dlg.js | 16 + .../plugins/searchreplace/langs/ru_dlg.js | 16 + .../plugins/searchreplace/langs/sc_dlg.js | 16 + .../plugins/searchreplace/langs/se_dlg.js | 16 + .../plugins/searchreplace/langs/si_dlg.js | 16 + .../plugins/searchreplace/langs/sk_dlg.js | 16 + .../plugins/searchreplace/langs/sl_dlg.js | 16 + .../plugins/searchreplace/langs/sq_dlg.js | 16 + .../plugins/searchreplace/langs/sr_dlg.js | 16 + .../plugins/searchreplace/langs/sv_dlg.js | 16 + .../plugins/searchreplace/langs/ta_dlg.js | 16 + .../plugins/searchreplace/langs/te_dlg.js | 16 + .../plugins/searchreplace/langs/th_dlg.js | 16 + .../plugins/searchreplace/langs/tr_dlg.js | 16 + .../plugins/searchreplace/langs/tt_dlg.js | 16 + .../plugins/searchreplace/langs/tw_dlg.js | 16 + .../plugins/searchreplace/langs/uk_dlg.js | 16 + .../plugins/searchreplace/langs/ur_dlg.js | 16 + .../plugins/searchreplace/langs/vi_dlg.js | 16 + .../plugins/searchreplace/langs/zh_dlg.js | 16 + .../plugins/searchreplace/langs/zu_dlg.js | 16 + js/tiny_mce/plugins/style/css/props.css | 13 + js/tiny_mce/plugins/style/editor_plugin.js | 1 + .../plugins/style/editor_plugin_src.js | 55 + js/tiny_mce/plugins/style/js/props.js | 635 + js/tiny_mce/plugins/style/langs/ar_dlg.js | 1 + js/tiny_mce/plugins/style/langs/az_dlg.js | 1 + js/tiny_mce/plugins/style/langs/be_dlg.js | 1 + js/tiny_mce/plugins/style/langs/bg_dlg.js | 1 + js/tiny_mce/plugins/style/langs/bn_dlg.js | 1 + js/tiny_mce/plugins/style/langs/br_dlg.js | 1 + js/tiny_mce/plugins/style/langs/bs_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ca_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ch_dlg.js | 1 + js/tiny_mce/plugins/style/langs/cn_dlg.js | 1 + js/tiny_mce/plugins/style/langs/cs_dlg.js | 1 + js/tiny_mce/plugins/style/langs/cy_dlg.js | 1 + js/tiny_mce/plugins/style/langs/da_dlg.js | 1 + js/tiny_mce/plugins/style/langs/de_dlg.js | 1 + js/tiny_mce/plugins/style/langs/dv_dlg.js | 1 + js/tiny_mce/plugins/style/langs/el_dlg.js | 1 + js/tiny_mce/plugins/style/langs/en_dlg.js | 1 + js/tiny_mce/plugins/style/langs/es_dlg.js | 1 + js/tiny_mce/plugins/style/langs/et_dlg.js | 1 + js/tiny_mce/plugins/style/langs/eu_dlg.js | 1 + js/tiny_mce/plugins/style/langs/fa_dlg.js | 1 + js/tiny_mce/plugins/style/langs/fi_dlg.js | 1 + js/tiny_mce/plugins/style/langs/fr_dlg.js | 1 + js/tiny_mce/plugins/style/langs/gl_dlg.js | 1 + js/tiny_mce/plugins/style/langs/gu_dlg.js | 1 + js/tiny_mce/plugins/style/langs/he_dlg.js | 1 + js/tiny_mce/plugins/style/langs/hi_dlg.js | 1 + js/tiny_mce/plugins/style/langs/hr_dlg.js | 1 + js/tiny_mce/plugins/style/langs/hu_dlg.js | 1 + js/tiny_mce/plugins/style/langs/hy_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ia_dlg.js | 1 + js/tiny_mce/plugins/style/langs/id_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ii_dlg.js | 63 + js/tiny_mce/plugins/style/langs/is_dlg.js | 1 + js/tiny_mce/plugins/style/langs/it_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ja_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ka_dlg.js | 1 + js/tiny_mce/plugins/style/langs/kl_dlg.js | 1 + js/tiny_mce/plugins/style/langs/km_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ko_dlg.js | 1 + js/tiny_mce/plugins/style/langs/lb_dlg.js | 1 + js/tiny_mce/plugins/style/langs/lt_dlg.js | 1 + js/tiny_mce/plugins/style/langs/lv_dlg.js | 1 + js/tiny_mce/plugins/style/langs/mk_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ml_dlg.js | 1 + js/tiny_mce/plugins/style/langs/mn_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ms_dlg.js | 1 + js/tiny_mce/plugins/style/langs/my_dlg.js | 1 + js/tiny_mce/plugins/style/langs/nb_dlg.js | 1 + js/tiny_mce/plugins/style/langs/nl_dlg.js | 1 + js/tiny_mce/plugins/style/langs/nn_dlg.js | 1 + js/tiny_mce/plugins/style/langs/no_dlg.js | 1 + js/tiny_mce/plugins/style/langs/pl_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ps_dlg.js | 1 + js/tiny_mce/plugins/style/langs/pt_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ro_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ru_dlg.js | 1 + js/tiny_mce/plugins/style/langs/sc_dlg.js | 1 + js/tiny_mce/plugins/style/langs/se_dlg.js | 1 + js/tiny_mce/plugins/style/langs/si_dlg.js | 1 + js/tiny_mce/plugins/style/langs/sk_dlg.js | 1 + js/tiny_mce/plugins/style/langs/sl_dlg.js | 1 + js/tiny_mce/plugins/style/langs/sq_dlg.js | 1 + js/tiny_mce/plugins/style/langs/sr_dlg.js | 1 + js/tiny_mce/plugins/style/langs/sv_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ta_dlg.js | 1 + js/tiny_mce/plugins/style/langs/te_dlg.js | 1 + js/tiny_mce/plugins/style/langs/th_dlg.js | 1 + js/tiny_mce/plugins/style/langs/tn_dlg.js | 1 + js/tiny_mce/plugins/style/langs/tr_dlg.js | 1 + js/tiny_mce/plugins/style/langs/tt_dlg.js | 1 + js/tiny_mce/plugins/style/langs/tw_dlg.js | 1 + js/tiny_mce/plugins/style/langs/uk_dlg.js | 1 + js/tiny_mce/plugins/style/langs/ur_dlg.js | 1 + js/tiny_mce/plugins/style/langs/vi_dlg.js | 1 + js/tiny_mce/plugins/style/langs/zh-cn_dlg.js | 1 + js/tiny_mce/plugins/style/langs/zh_dlg.js | 1 + js/tiny_mce/plugins/style/langs/zu_dlg.js | 1 + js/tiny_mce/plugins/style/props.htm | 838 + js/tiny_mce/plugins/table/cell.htm | 178 + js/tiny_mce/plugins/table/css/cell.css | 17 + js/tiny_mce/plugins/table/css/row.css | 25 + js/tiny_mce/plugins/table/css/table.css | 13 + js/tiny_mce/plugins/table/editor_plugin.js | 1 + .../plugins/table/editor_plugin_src.js | 1198 ++ js/tiny_mce/plugins/table/js/cell.js | 284 + js/tiny_mce/plugins/table/js/merge_cells.js | 27 + js/tiny_mce/plugins/table/js/row.js | 232 + js/tiny_mce/plugins/table/js/table.js | 450 + js/tiny_mce/plugins/table/langs/ar_dlg.js | 1 + js/tiny_mce/plugins/table/langs/az_dlg.js | 1 + js/tiny_mce/plugins/table/langs/be_dlg.js | 1 + js/tiny_mce/plugins/table/langs/bg_dlg.js | 1 + js/tiny_mce/plugins/table/langs/bn_dlg.js | 1 + js/tiny_mce/plugins/table/langs/br_dlg.js | 1 + js/tiny_mce/plugins/table/langs/bs_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ca_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ch_dlg.js | 1 + js/tiny_mce/plugins/table/langs/cn_dlg.js | 1 + js/tiny_mce/plugins/table/langs/cs_dlg.js | 1 + js/tiny_mce/plugins/table/langs/cy_dlg.js | 1 + js/tiny_mce/plugins/table/langs/da_dlg.js | 1 + js/tiny_mce/plugins/table/langs/de_dlg.js | 1 + js/tiny_mce/plugins/table/langs/dv_dlg.js | 1 + js/tiny_mce/plugins/table/langs/el_dlg.js | 1 + js/tiny_mce/plugins/table/langs/en_dlg.js | 1 + js/tiny_mce/plugins/table/langs/es_dlg.js | 1 + js/tiny_mce/plugins/table/langs/et_dlg.js | 1 + js/tiny_mce/plugins/table/langs/eu_dlg.js | 1 + js/tiny_mce/plugins/table/langs/fa_dlg.js | 1 + js/tiny_mce/plugins/table/langs/fi_dlg.js | 1 + js/tiny_mce/plugins/table/langs/fr_dlg.js | 1 + js/tiny_mce/plugins/table/langs/gl_dlg.js | 1 + js/tiny_mce/plugins/table/langs/gu_dlg.js | 1 + js/tiny_mce/plugins/table/langs/he_dlg.js | 1 + js/tiny_mce/plugins/table/langs/hi_dlg.js | 1 + js/tiny_mce/plugins/table/langs/hr_dlg.js | 1 + js/tiny_mce/plugins/table/langs/hu_dlg.js | 1 + js/tiny_mce/plugins/table/langs/hy_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ia_dlg.js | 1 + js/tiny_mce/plugins/table/langs/id_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ii_dlg.js | 74 + js/tiny_mce/plugins/table/langs/is_dlg.js | 1 + js/tiny_mce/plugins/table/langs/it_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ja_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ka_dlg.js | 1 + js/tiny_mce/plugins/table/langs/kl_dlg.js | 1 + js/tiny_mce/plugins/table/langs/km_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ko_dlg.js | 1 + js/tiny_mce/plugins/table/langs/lb_dlg.js | 1 + js/tiny_mce/plugins/table/langs/lt_dlg.js | 1 + js/tiny_mce/plugins/table/langs/lv_dlg.js | 1 + js/tiny_mce/plugins/table/langs/mk_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ml_dlg.js | 1 + js/tiny_mce/plugins/table/langs/mn_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ms_dlg.js | 1 + js/tiny_mce/plugins/table/langs/my_dlg.js | 1 + js/tiny_mce/plugins/table/langs/nb_dlg.js | 1 + js/tiny_mce/plugins/table/langs/nl_dlg.js | 1 + js/tiny_mce/plugins/table/langs/nn_dlg.js | 1 + js/tiny_mce/plugins/table/langs/no_dlg.js | 1 + js/tiny_mce/plugins/table/langs/pl_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ps_dlg.js | 1 + js/tiny_mce/plugins/table/langs/pt_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ro_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ru_dlg.js | 1 + js/tiny_mce/plugins/table/langs/sc_dlg.js | 1 + js/tiny_mce/plugins/table/langs/se_dlg.js | 1 + js/tiny_mce/plugins/table/langs/si_dlg.js | 1 + js/tiny_mce/plugins/table/langs/sk_dlg.js | 1 + js/tiny_mce/plugins/table/langs/sl_dlg.js | 1 + js/tiny_mce/plugins/table/langs/sq_dlg.js | 1 + js/tiny_mce/plugins/table/langs/sr_dlg.js | 1 + js/tiny_mce/plugins/table/langs/sv_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ta_dlg.js | 1 + js/tiny_mce/plugins/table/langs/te_dlg.js | 1 + js/tiny_mce/plugins/table/langs/th_dlg.js | 1 + js/tiny_mce/plugins/table/langs/tn_dlg.js | 1 + js/tiny_mce/plugins/table/langs/tr_dlg.js | 1 + js/tiny_mce/plugins/table/langs/tt_dlg.js | 1 + js/tiny_mce/plugins/table/langs/tw_dlg.js | 1 + js/tiny_mce/plugins/table/langs/uk_dlg.js | 1 + js/tiny_mce/plugins/table/langs/ur_dlg.js | 1 + js/tiny_mce/plugins/table/langs/vi_dlg.js | 1 + js/tiny_mce/plugins/table/langs/zh-cn_dlg.js | 1 + js/tiny_mce/plugins/table/langs/zh_dlg.js | 1 + js/tiny_mce/plugins/table/langs/zu_dlg.js | 1 + js/tiny_mce/plugins/table/merge_cells.htm | 32 + js/tiny_mce/plugins/table/row.htm | 157 + js/tiny_mce/plugins/table/table.htm | 188 + js/tiny_mce/plugins/xhtmlxtras/abbr.htm | 142 + js/tiny_mce/plugins/xhtmlxtras/acronym.htm | 142 + js/tiny_mce/plugins/xhtmlxtras/attributes.htm | 149 + js/tiny_mce/plugins/xhtmlxtras/cite.htm | 142 + .../plugins/xhtmlxtras/css/attributes.css | 11 + js/tiny_mce/plugins/xhtmlxtras/css/popup.css | 9 + js/tiny_mce/plugins/xhtmlxtras/del.htm | 162 + .../plugins/xhtmlxtras/editor_plugin.js | 1 + .../plugins/xhtmlxtras/editor_plugin_src.js | 132 + js/tiny_mce/plugins/xhtmlxtras/ins.htm | 162 + js/tiny_mce/plugins/xhtmlxtras/js/abbr.js | 28 + js/tiny_mce/plugins/xhtmlxtras/js/acronym.js | 28 + .../plugins/xhtmlxtras/js/attributes.js | 125 + js/tiny_mce/plugins/xhtmlxtras/js/cite.js | 28 + js/tiny_mce/plugins/xhtmlxtras/js/del.js | 53 + .../plugins/xhtmlxtras/js/element_common.js | 229 + js/tiny_mce/plugins/xhtmlxtras/js/ins.js | 53 + .../plugins/xhtmlxtras/langs/ar_dlg.js | 1 + .../plugins/xhtmlxtras/langs/az_dlg.js | 1 + .../plugins/xhtmlxtras/langs/be_dlg.js | 1 + .../plugins/xhtmlxtras/langs/bg_dlg.js | 1 + .../plugins/xhtmlxtras/langs/bn_dlg.js | 1 + .../plugins/xhtmlxtras/langs/br_dlg.js | 1 + .../plugins/xhtmlxtras/langs/bs_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ca_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ch_dlg.js | 1 + .../plugins/xhtmlxtras/langs/cn_dlg.js | 1 + .../plugins/xhtmlxtras/langs/cs_dlg.js | 1 + .../plugins/xhtmlxtras/langs/cy_dlg.js | 1 + .../plugins/xhtmlxtras/langs/da_dlg.js | 1 + .../plugins/xhtmlxtras/langs/de_dlg.js | 1 + .../plugins/xhtmlxtras/langs/dv_dlg.js | 1 + .../plugins/xhtmlxtras/langs/el_dlg.js | 1 + .../plugins/xhtmlxtras/langs/en_dlg.js | 1 + .../plugins/xhtmlxtras/langs/es_dlg.js | 1 + .../plugins/xhtmlxtras/langs/et_dlg.js | 1 + .../plugins/xhtmlxtras/langs/eu_dlg.js | 1 + .../plugins/xhtmlxtras/langs/fa_dlg.js | 1 + .../plugins/xhtmlxtras/langs/fi_dlg.js | 1 + .../plugins/xhtmlxtras/langs/fr_dlg.js | 1 + .../plugins/xhtmlxtras/langs/gl_dlg.js | 1 + .../plugins/xhtmlxtras/langs/gu_dlg.js | 1 + .../plugins/xhtmlxtras/langs/he_dlg.js | 1 + .../plugins/xhtmlxtras/langs/hi_dlg.js | 1 + .../plugins/xhtmlxtras/langs/hr_dlg.js | 1 + .../plugins/xhtmlxtras/langs/hu_dlg.js | 1 + .../plugins/xhtmlxtras/langs/hy_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ia_dlg.js | 1 + .../plugins/xhtmlxtras/langs/id_dlg.js | 1 + .../plugins/xhtmlxtras/langs/is_dlg.js | 1 + .../plugins/xhtmlxtras/langs/it_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ja_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ka_dlg.js | 1 + .../plugins/xhtmlxtras/langs/kl_dlg.js | 1 + .../plugins/xhtmlxtras/langs/km_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ko_dlg.js | 1 + .../plugins/xhtmlxtras/langs/lb_dlg.js | 1 + .../plugins/xhtmlxtras/langs/lt_dlg.js | 1 + .../plugins/xhtmlxtras/langs/lv_dlg.js | 1 + .../plugins/xhtmlxtras/langs/mk_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ml_dlg.js | 1 + .../plugins/xhtmlxtras/langs/mn_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ms_dlg.js | 1 + .../plugins/xhtmlxtras/langs/my_dlg.js | 1 + .../plugins/xhtmlxtras/langs/nb_dlg.js | 1 + .../plugins/xhtmlxtras/langs/nl_dlg.js | 1 + .../plugins/xhtmlxtras/langs/nn_dlg.js | 1 + .../plugins/xhtmlxtras/langs/no_dlg.js | 1 + .../plugins/xhtmlxtras/langs/pl_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ps_dlg.js | 1 + .../plugins/xhtmlxtras/langs/pt_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ro_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ru_dlg.js | 1 + .../plugins/xhtmlxtras/langs/sc_dlg.js | 1 + .../plugins/xhtmlxtras/langs/se_dlg.js | 1 + .../plugins/xhtmlxtras/langs/si_dlg.js | 1 + .../plugins/xhtmlxtras/langs/sk_dlg.js | 1 + .../plugins/xhtmlxtras/langs/sl_dlg.js | 1 + .../plugins/xhtmlxtras/langs/sq_dlg.js | 1 + .../plugins/xhtmlxtras/langs/sr_dlg.js | 1 + .../plugins/xhtmlxtras/langs/sv_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ta_dlg.js | 1 + .../plugins/xhtmlxtras/langs/te_dlg.js | 1 + .../plugins/xhtmlxtras/langs/th_dlg.js | 1 + .../plugins/xhtmlxtras/langs/tn_dlg.js | 1 + .../plugins/xhtmlxtras/langs/tr_dlg.js | 1 + .../plugins/xhtmlxtras/langs/tt_dlg.js | 1 + .../plugins/xhtmlxtras/langs/tw_dlg.js | 1 + .../plugins/xhtmlxtras/langs/uk_dlg.js | 1 + .../plugins/xhtmlxtras/langs/ur_dlg.js | 1 + .../plugins/xhtmlxtras/langs/vi_dlg.js | 1 + .../plugins/xhtmlxtras/langs/zh-cn_dlg.js | 1 + .../plugins/xhtmlxtras/langs/zh_dlg.js | 1 + .../plugins/xhtmlxtras/langs/zu_dlg.js | 1 + js/tiny_mce/themes/advanced/about.htm | 52 + js/tiny_mce/themes/advanced/anchor.htm | 26 + js/tiny_mce/themes/advanced/charmap.htm | 51 + js/tiny_mce/themes/advanced/color_picker.htm | 74 + .../themes/advanced/editor_template.js | 1 + .../themes/advanced/editor_template_src.js | 1360 ++ js/tiny_mce/themes/advanced/image.htm | 80 + .../themes/advanced/img/colorpicker.jpg | Bin 0 -> 3189 bytes js/tiny_mce/themes/advanced/img/flash.gif | Bin 0 -> 241 bytes js/tiny_mce/themes/advanced/img/icons.gif | Bin 0 -> 11794 bytes js/tiny_mce/themes/advanced/img/iframe.gif | Bin 0 -> 600 bytes js/tiny_mce/themes/advanced/img/pagebreak.gif | Bin 0 -> 325 bytes js/tiny_mce/themes/advanced/img/quicktime.gif | Bin 0 -> 303 bytes js/tiny_mce/themes/advanced/img/realmedia.gif | Bin 0 -> 439 bytes js/tiny_mce/themes/advanced/img/shockwave.gif | Bin 0 -> 387 bytes js/tiny_mce/themes/advanced/img/trans.gif | Bin 0 -> 43 bytes js/tiny_mce/themes/advanced/img/video.gif | Bin 0 -> 597 bytes .../themes/advanced/img/windowsmedia.gif | Bin 0 -> 415 bytes js/tiny_mce/themes/advanced/js/about.js | 73 + js/tiny_mce/themes/advanced/js/anchor.js | 42 + js/tiny_mce/themes/advanced/js/charmap.js | 355 + .../themes/advanced/js/color_picker.js | 329 + js/tiny_mce/themes/advanced/js/image.js | 247 + js/tiny_mce/themes/advanced/js/link.js | 153 + .../themes/advanced/js/source_editor.js | 56 + js/tiny_mce/themes/advanced/langs/en.js | 1 + js/tiny_mce/themes/advanced/langs/en_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/es.js | 1 + js/tiny_mce/themes/advanced/langs/es_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/et.js | 1 + js/tiny_mce/themes/advanced/langs/et_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/fi.js | 1 + js/tiny_mce/themes/advanced/langs/fi_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/fr.js | 1 + js/tiny_mce/themes/advanced/langs/fr_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/gl.js | 1 + js/tiny_mce/themes/advanced/langs/gl_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/he.js | 1 + js/tiny_mce/themes/advanced/langs/he_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/hu.js | 1 + js/tiny_mce/themes/advanced/langs/hu_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/id.js | 1 + js/tiny_mce/themes/advanced/langs/id_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/it.js | 1 + js/tiny_mce/themes/advanced/langs/it_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/lt.js | 1 + js/tiny_mce/themes/advanced/langs/lt_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/lv.js | 1 + js/tiny_mce/themes/advanced/langs/lv_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/nl.js | 1 + js/tiny_mce/themes/advanced/langs/nl_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/no.js | 1 + js/tiny_mce/themes/advanced/langs/no_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/pl.js | 1 + js/tiny_mce/themes/advanced/langs/pl_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/pt.js | 1 + js/tiny_mce/themes/advanced/langs/pt_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/ro.js | 1 + js/tiny_mce/themes/advanced/langs/ro_dlg.js | 1 + js/tiny_mce/themes/advanced/langs/ru.js | 1 + js/tiny_mce/themes/advanced/langs/ru_dlg.js | 1 + js/tiny_mce/themes/advanced/link.htm | 57 + js/tiny_mce/themes/advanced/shortcuts.htm | 47 + .../themes/advanced/skins/cirkuit/content.css | 66 + .../themes/advanced/skins/cirkuit/dialog.css | 117 + .../advanced/skins/cirkuit/img/butt2.png | Bin 0 -> 135 bytes .../advanced/skins/cirkuit/img/button-bg.png | Bin 0 -> 296 bytes .../advanced/skins/cirkuit/img/buttons.png | Bin 0 -> 3274 bytes .../advanced/skins/cirkuit/img/down_arrow.gif | Bin 0 -> 60 bytes .../advanced/skins/cirkuit/img/fade-butt.png | Bin 0 -> 785 bytes .../advanced/skins/cirkuit/img/icons.png | Bin 0 -> 30143 bytes .../advanced/skins/cirkuit/img/items.gif | Bin 0 -> 70 bytes .../advanced/skins/cirkuit/img/menu-arrow.png | Bin 0 -> 209 bytes .../advanced/skins/cirkuit/img/menu-check.png | Bin 0 -> 214 bytes .../advanced/skins/cirkuit/img/progress.gif | Bin 0 -> 1787 bytes .../advanced/skins/cirkuit/img/tabs.gif | Bin 0 -> 1326 bytes .../advanced/skins/cirkuit/img/toolbarbg.png | Bin 0 -> 143 bytes .../themes/advanced/skins/cirkuit/ui.css | 988 + .../themes/advanced/skins/default/content.css | 47 + .../themes/advanced/skins/default/dialog.css | 117 + .../advanced/skins/default/img/buttons.png | Bin 0 -> 3274 bytes .../advanced/skins/default/img/items.gif | Bin 0 -> 70 bytes .../advanced/skins/default/img/menu_arrow.gif | Bin 0 -> 68 bytes .../advanced/skins/default/img/menu_check.gif | Bin 0 -> 70 bytes .../advanced/skins/default/img/progress.gif | Bin 0 -> 1787 bytes .../advanced/skins/default/img/tabs.gif | Bin 0 -> 1326 bytes .../themes/advanced/skins/default/ui.css | 213 + .../advanced/skins/highcontrast/content.css | 23 + .../advanced/skins/highcontrast/dialog.css | 105 + .../themes/advanced/skins/highcontrast/ui.css | 101 + .../themes/advanced/skins/o2k7/content.css | 46 + .../themes/advanced/skins/o2k7/dialog.css | 117 + .../advanced/skins/o2k7/img/button_bg.png | Bin 0 -> 5859 bytes .../skins/o2k7/img/button_bg_black.png | Bin 0 -> 3736 bytes .../skins/o2k7/img/button_bg_silver.png | Bin 0 -> 5358 bytes js/tiny_mce/themes/advanced/skins/o2k7/ui.css | 216 + .../themes/advanced/skins/o2k7/ui_black.css | 8 + .../themes/advanced/skins/o2k7/ui_silver.css | 5 + js/tiny_mce/themes/advanced/source_editor.htm | 25 + js/tiny_mce/tiny_mce.js | 12834 +++++++++++++ js/tiny_mce/tiny_mce_popup.js | 5 + js/tiny_mce/tiny_mce_src.js | 15752 ++++++++++++++++ js/tiny_mce/utils/editable_selects.js | 70 + js/tiny_mce/utils/form_utils.js | 210 + js/tiny_mce/utils/mctabs.js | 162 + js/tiny_mce/utils/validate.js | 252 + js/tinymce.inc.js | 54 + js/toggle.js | 48 + js/tools.js | 234 + localization/ar.xml | 23 + localization/at.xml | 110 + localization/au.xml | 30 + localization/az.xml | 28 + localization/be.xml | 173 + localization/bg.xml | 140 + localization/bo.xml | 23 + localization/br.xml | 62 + localization/ca.xml | 30 + localization/ch.xml | 35 + localization/cl.xml | 23 + localization/cn.xml | 69 + localization/co.xml | 23 + localization/cy.xml | 142 + localization/cz.xml | 140 + localization/de.xml | 140 + localization/dk.xml | 109 + localization/do.xml | 28 + localization/ec.xml | 23 + localization/ee.xml | 141 + localization/eg.xml | 23 + localization/es.xml | 173 + localization/fi.xml | 171 + localization/fj.xml | 20 + localization/fr.xml | 172 + localization/gb.xml | 77 + localization/ge.xml | 23 + localization/gr.xml | 264 + localization/gt.xml | 23 + localization/gy.xml | 24 + localization/hk.xml | 16 + localization/hu.xml | 171 + localization/id.xml | 28 + localization/ie.xml | 108 + localization/il.xml | 24 + localization/in.xml | 67 + localization/ir.xml | 23 + localization/it.xml | 283 + localization/je.xml | 23 + localization/jp.xml | 22 + localization/li.xml | 33 + localization/lt.xml | 171 + localization/lu.xml | 204 + localization/lv.xml | 140 + localization/md.xml | 35 + localization/mt.xml | 107 + localization/mx.xml | 28 + localization/nl.xml | 140 + localization/no.xml | 33 + localization/nz.xml | 20 + localization/pk.xml | 25 + localization/pl.xml | 223 + localization/pt.xml | 171 + localization/py.xml | 28 + localization/ro.xml | 171 + localization/ru.xml | 28 + localization/sa.xml | 16 + localization/se.xml | 33 + localization/sg.xml | 24 + localization/si.xml | 140 + localization/sk.xml | 171 + localization/sv.xml | 23 + localization/th.xml | 21 + localization/tr.xml | 33 + localization/tw.xml | 24 + localization/ua.xml | 23 + localization/us.xml | 287 + localization/uy.xml | 28 + localization/ve.xml | 28 + localization/vn.xml | 28 + log/.htaccess | 2 + log/index.php | 36 + mails/de/account.html | 52 + mails/de/account.txt | 18 + mails/de/bankwire.html | 55 + mails/de/bankwire.txt | 20 + mails/de/cheque.html | 55 + mails/de/cheque.txt | 18 + mails/de/contact.html | 34 + mails/de/contact.txt | 7 + mails/de/contact_form.html | 40 + mails/de/contact_form.txt | 7 + mails/de/credit_slip.html | 46 + mails/de/credit_slip.txt | 9 + mails/de/download-product.tpl | 13 + mails/de/download_product.html | 55 + mails/de/download_product.txt | 12 + mails/de/employee_password.html | 40 + mails/de/employee_password.txt | 10 + mails/de/forward_msg.html | 16 + mails/de/forward_msg.txt | 4 + mails/de/guest_to_customer.html | 46 + mails/de/guest_to_customer.txt | 12 + mails/de/in_transit.html | 55 + mails/de/in_transit.txt | 12 + mails/de/index.php | 36 + mails/de/lang.php | 39 + mails/de/log_alert.html | 46 + mails/de/log_alert.txt | 10 + mails/de/newsletter.html | 34 + mails/de/newsletter.txt | 9 + mails/de/order_canceled.html | 49 + mails/de/order_canceled.txt | 10 + mails/de/order_conf.html | 120 + mails/de/order_conf.txt | 43 + mails/de/order_customer_comment.html | 40 + mails/de/order_customer_comment.txt | 8 + mails/de/order_merchant_comment.html | 40 + mails/de/order_merchant_comment.txt | 10 + mails/de/order_return_state.html | 46 + mails/de/order_return_state.txt | 9 + mails/de/outofstock.html | 49 + mails/de/outofstock.txt | 10 + mails/de/password.html | 46 + mails/de/password.txt | 12 + mails/de/password_query.html | 40 + mails/de/password_query.txt | 9 + mails/de/payment.html | 46 + mails/de/payment.txt | 9 + mails/de/payment_error.html | 55 + mails/de/payment_error.txt | 12 + mails/de/preparation.html | 49 + mails/de/preparation.txt | 11 + mails/de/refund.html | 49 + mails/de/refund.txt | 10 + mails/de/reply_msg.html | 16 + mails/de/reply_msg.txt | 4 + mails/de/shipped.html | 49 + mails/de/shipped.txt | 11 + mails/de/test.html | 22 + mails/de/test.txt | 5 + mails/de/voucher.html | 46 + mails/de/voucher.txt | 11 + mails/en/account.html | 53 + mails/en/account.txt | 20 + mails/en/bankwire.html | 61 + mails/en/bankwire.txt | 23 + mails/en/cheque.html | 59 + mails/en/cheque.txt | 21 + mails/en/contact.html | 34 + mails/en/contact.txt | 11 + mails/en/contact_form.html | 36 + mails/en/contact_form.txt | 12 + mails/en/credit_slip.html | 41 + mails/en/credit_slip.txt | 12 + mails/en/download-product.tpl | 13 + mails/en/download_product.html | 54 + mails/en/download_product.txt | 11 + mails/en/employee_password.html | 39 + mails/en/employee_password.txt | 14 + mails/en/forward_msg.html | 20 + mails/en/forward_msg.txt | 4 + mails/en/guest_to_customer.html | 46 + mails/en/guest_to_customer.txt | 16 + mails/en/in_transit.html | 53 + mails/en/in_transit.txt | 16 + mails/en/index.php | 36 + mails/en/lang.php | 31 + mails/en/log_alert.html | 42 + mails/en/log_alert.txt | 11 + mails/en/newsletter.html | 30 + mails/en/newsletter.txt | 9 + mails/en/order_canceled.html | 47 + mails/en/order_canceled.txt | 14 + mails/en/order_conf.html | 121 + mails/en/order_conf.txt | 30 + mails/en/order_customer_comment.html | 38 + mails/en/order_customer_comment.txt | 8 + mails/en/order_merchant_comment.html | 38 + mails/en/order_merchant_comment.txt | 10 + mails/en/order_return_state.html | 42 + mails/en/order_return_state.txt | 11 + mails/en/outofstock.html | 47 + mails/en/outofstock.txt | 14 + mails/en/password.html | 45 + mails/en/password.txt | 12 + mails/en/password_query.html | 38 + mails/en/password_query.txt | 9 + mails/en/payment.html | 42 + mails/en/payment.txt | 13 + mails/en/payment_error.html | 53 + mails/en/payment_error.txt | 14 + mails/en/preparation.html | 47 + mails/en/preparation.txt | 14 + mails/en/refund.html | 47 + mails/en/refund.txt | 12 + mails/en/reply_msg.html | 18 + mails/en/reply_msg.txt | 4 + mails/en/shipped.html | 47 + mails/en/shipped.txt | 16 + mails/en/test.html | 23 + mails/en/test.txt | 3 + mails/en/voucher.html | 43 + mails/en/voucher.txt | 14 + mails/es/account.html | 53 + mails/es/account.txt | 20 + mails/es/bankwire.html | 56 + mails/es/bankwire.txt | 20 + mails/es/cheque.html | 56 + mails/es/cheque.txt | 19 + mails/es/contact.html | 35 + mails/es/contact.txt | 11 + mails/es/contact_form.html | 41 + mails/es/contact_form.txt | 12 + mails/es/credit_slip.html | 47 + mails/es/credit_slip.txt | 12 + mails/es/download-product.tpl | 13 + mails/es/download_product.html | 56 + mails/es/download_product.txt | 13 + mails/es/employee_password.html | 11 + mails/es/employee_password.txt | 13 + mails/es/forward_msg.html | 17 + mails/es/forward_msg.txt | 4 + mails/es/guest_to_customer.html | 47 + mails/es/guest_to_customer.txt | 15 + mails/es/in_transit.html | 56 + mails/es/in_transit.txt | 14 + mails/es/index.php | 37 + mails/es/lang.php | 39 + mails/es/log_alert.html | 47 + mails/es/log_alert.txt | 11 + mails/es/newsletter.html | 35 + mails/es/newsletter.txt | 9 + mails/es/order_canceled.html | 50 + mails/es/order_canceled.txt | 14 + mails/es/order_conf.html | 120 + mails/es/order_conf.txt | 29 + mails/es/order_customer_comment.html | 41 + mails/es/order_customer_comment.txt | 8 + mails/es/order_merchant_comment.html | 11 + mails/es/order_merchant_comment.txt | 0 mails/es/order_return_state.html | 47 + mails/es/order_return_state.txt | 9 + mails/es/outofstock.html | 50 + mails/es/outofstock.txt | 17 + mails/es/password.html | 47 + mails/es/password.txt | 15 + mails/es/password_query.html | 41 + mails/es/password_query.txt | 9 + mails/es/payment.html | 50 + mails/es/payment.txt | 14 + mails/es/payment_error.html | 56 + mails/es/payment_error.txt | 16 + mails/es/preparation.html | 50 + mails/es/preparation.txt | 13 + mails/es/refund.html | 50 + mails/es/refund.txt | 12 + mails/es/reply_msg.html | 17 + mails/es/reply_msg.txt | 4 + mails/es/shipped.html | 50 + mails/es/shipped.txt | 15 + mails/es/test.html | 23 + mails/es/test.txt | 3 + mails/es/voucher.html | 47 + mails/es/voucher.txt | 14 + mails/fr/account.html | 43 + mails/fr/account.txt | 13 + mails/fr/bankwire.html | 61 + mails/fr/bankwire.txt | 22 + mails/fr/cheque.html | 59 + mails/fr/cheque.txt | 21 + mails/fr/contact.html | 34 + mails/fr/contact.txt | 11 + mails/fr/contact_form.html | 36 + mails/fr/contact_form.txt | 12 + mails/fr/credit_slip.html | 42 + mails/fr/credit_slip.txt | 12 + mails/fr/download-product.tpl | 13 + mails/fr/download_product.html | 54 + mails/fr/download_product.txt | 12 + mails/fr/employee_password.html | 39 + mails/fr/employee_password.txt | 15 + mails/fr/forward_msg.html | 20 + mails/fr/forward_msg.txt | 5 + mails/fr/guest_to_customer.html | 42 + mails/fr/guest_to_customer.txt | 13 + mails/fr/in_transit.html | 53 + mails/fr/in_transit.txt | 14 + mails/fr/index.php | 36 + mails/fr/lang.php | 39 + mails/fr/log_alert.html | 42 + mails/fr/log_alert.txt | 11 + mails/fr/newsletter.html | 30 + mails/fr/newsletter.txt | 9 + mails/fr/order_canceled.html | 47 + mails/fr/order_canceled.txt | 12 + mails/fr/order_conf.html | 121 + mails/fr/order_conf.txt | 28 + mails/fr/order_customer_comment.html | 38 + mails/fr/order_customer_comment.txt | 8 + mails/fr/order_merchant_comment.html | 38 + mails/fr/order_merchant_comment.txt | 10 + mails/fr/order_return_state.html | 42 + mails/fr/order_return_state.txt | 7 + mails/fr/outofstock.html | 47 + mails/fr/outofstock.txt | 12 + mails/fr/password.html | 37 + mails/fr/password.txt | 11 + mails/fr/password_query.html | 38 + mails/fr/password_query.txt | 9 + mails/fr/payment.html | 47 + mails/fr/payment.txt | 12 + mails/fr/payment_error.html | 47 + mails/fr/payment_error.txt | 12 + mails/fr/preparation.html | 47 + mails/fr/preparation.txt | 12 + mails/fr/refund.html | 47 + mails/fr/refund.txt | 12 + mails/fr/reply_msg.html | 18 + mails/fr/reply_msg.txt | 0 mails/fr/shipped.html | 47 + mails/fr/shipped.txt | 14 + mails/fr/test.html | 23 + mails/fr/test.txt | 3 + mails/fr/voucher.html | 43 + mails/fr/voucher.txt | 13 + mails/index.php | 36 + mails/it/account.html | 52 + mails/it/account.txt | 20 + mails/it/bankwire.html | 55 + mails/it/bankwire.txt | 23 + mails/it/cheque.html | 55 + mails/it/cheque.txt | 22 + mails/it/contact.html | 34 + mails/it/contact.txt | 11 + mails/it/contact_form.html | 40 + mails/it/contact_form.txt | 12 + mails/it/credit_slip.html | 46 + mails/it/credit_slip.txt | 12 + mails/it/download-product.tpl | 13 + mails/it/download_product.html | 55 + mails/it/download_product.txt | 11 + mails/it/employee_password.html | 40 + mails/it/employee_password.txt | 14 + mails/it/forward_msg.html | 16 + mails/it/forward_msg.txt | 4 + mails/it/guest_to_customer.html | 46 + mails/it/guest_to_customer.txt | 15 + mails/it/in_transit.html | 55 + mails/it/in_transit.txt | 16 + mails/it/index.php | 36 + mails/it/lang.php | 39 + mails/it/log_alert.html | 46 + mails/it/log_alert.txt | 11 + mails/it/newsletter.html | 34 + mails/it/newsletter.txt | 9 + mails/it/order_canceled.html | 49 + mails/it/order_canceled.txt | 14 + mails/it/order_conf.html | 120 + mails/it/order_conf.txt | 43 + mails/it/order_customer_comment.html | 40 + mails/it/order_customer_comment.txt | 8 + mails/it/order_merchant_comment.html | 40 + mails/it/order_merchant_comment.txt | 10 + mails/it/order_return_state.html | 46 + mails/it/order_return_state.txt | 11 + mails/it/outofstock.html | 49 + mails/it/outofstock.txt | 14 + mails/it/password.html | 46 + mails/it/password.txt | 12 + mails/it/password_query.html | 40 + mails/it/password_query.txt | 9 + mails/it/payment.html | 46 + mails/it/payment.txt | 13 + mails/it/payment_error.html | 55 + mails/it/payment_error.txt | 14 + mails/it/preparation.html | 49 + mails/it/preparation.txt | 14 + mails/it/refund.html | 49 + mails/it/refund.txt | 12 + mails/it/reply_msg.html | 16 + mails/it/reply_msg.txt | 4 + mails/it/shipped.html | 49 + mails/it/shipped.txt | 16 + mails/it/test.html | 22 + mails/it/test.txt | 3 + mails/it/voucher.html | 46 + mails/it/voucher.txt | 14 + manufacturer.php | 35 + modules/.htaccess | 3 + modules/authorizeaim/authorizeaim.php | 178 + modules/authorizeaim/authorizeaim.tpl | 114 + modules/authorizeaim/cards/ax.gif | Bin 0 -> 560 bytes modules/authorizeaim/cards/discover.gif | Bin 0 -> 504 bytes modules/authorizeaim/cards/mastercard.gif | Bin 0 -> 595 bytes modules/authorizeaim/cards/visa.gif | Bin 0 -> 451 bytes modules/authorizeaim/config.xml | 12 + modules/authorizeaim/cvv.png | Bin 0 -> 8485 bytes modules/authorizeaim/de.php | 40 + modules/authorizeaim/en.php | 4 + modules/authorizeaim/es.php | 39 + modules/authorizeaim/fr.php | 39 + modules/authorizeaim/help.png | Bin 0 -> 911 bytes .../authorizeaim/hookorderconfirmation.tpl | 11 + modules/authorizeaim/it.php | 38 + modules/authorizeaim/logo.gif | Bin 0 -> 79 bytes modules/authorizeaim/logo_authorize.png | Bin 0 -> 6565 bytes modules/authorizeaim/logoa.gif | Bin 0 -> 2047 bytes modules/authorizeaim/secure.png | Bin 0 -> 611 bytes modules/authorizeaim/validation.php | 86 + modules/bankwire/bankwire.jpg | Bin 0 -> 9087 bytes modules/bankwire/bankwire.php | 235 + modules/bankwire/config.xml | 13 + modules/bankwire/de.php | 56 + modules/bankwire/en.php | 4 + modules/bankwire/es.php | 54 + modules/bankwire/fr.php | 54 + modules/bankwire/it.php | 56 + modules/bankwire/logo.gif | Bin 0 -> 1030 bytes modules/bankwire/payment.php | 41 + modules/bankwire/payment.tpl | 32 + modules/bankwire/payment_execution.tpl | 80 + modules/bankwire/payment_return.tpl | 45 + modules/bankwire/validation.php | 52 + modules/birthdaypresent/birthdaypresent.php | 148 + modules/birthdaypresent/comment.gif | Bin 0 -> 413 bytes modules/birthdaypresent/config.xml | 12 + modules/birthdaypresent/cron.php | 40 + modules/birthdaypresent/de.php | 30 + modules/birthdaypresent/en.php | 4 + modules/birthdaypresent/es.php | 28 + modules/birthdaypresent/fr.php | 28 + modules/birthdaypresent/it.php | 30 + modules/birthdaypresent/logo.gif | Bin 0 -> 676 bytes .../birthdaypresent/mails/de/birthday.html | 42 + modules/birthdaypresent/mails/de/birthday.txt | 5 + .../birthdaypresent/mails/en/birthday.html | 38 + modules/birthdaypresent/mails/en/birthday.txt | 7 + .../birthdaypresent/mails/es/birthday.html | 43 + modules/birthdaypresent/mails/es/birthday.txt | 6 + .../birthdaypresent/mails/fr/birthday.html | 38 + modules/birthdaypresent/mails/fr/birthday.txt | 7 + .../birthdaypresent/mails/it/birthday.html | 42 + modules/birthdaypresent/mails/it/birthday.txt | 7 + modules/blockadvertising/advertising.jpg | Bin 0 -> 8363 bytes modules/blockadvertising/blockadvertising.php | 230 + modules/blockadvertising/blockadvertising.tpl | 31 + modules/blockadvertising/config.xml | 12 + modules/blockadvertising/de.php | 18 + modules/blockadvertising/en.php | 4 + modules/blockadvertising/es.php | 15 + modules/blockadvertising/fr.php | 15 + modules/blockadvertising/it.php | 18 + modules/blockadvertising/logo.gif | Bin 0 -> 1052 bytes modules/blockbestsellers/blockbestsellers.php | 133 + modules/blockbestsellers/blockbestsellers.tpl | 47 + modules/blockbestsellers/config.xml | 12 + modules/blockbestsellers/de.php | 19 + modules/blockbestsellers/en.php | 4 + modules/blockbestsellers/es.php | 17 + modules/blockbestsellers/fr.php | 17 + modules/blockbestsellers/img/logo.gif | Bin 0 -> 601 bytes modules/blockbestsellers/it.php | 19 + modules/blockbestsellers/logo.gif | Bin 0 -> 601 bytes modules/blockcart/ajax-cart.js | 630 + modules/blockcart/blockcart-ajax.php | 36 + modules/blockcart/blockcart-json.tpl | 117 + modules/blockcart/blockcart-set-collapse.php | 44 + modules/blockcart/blockcart.php | 194 + modules/blockcart/blockcart.tpl | 154 + modules/blockcart/config.xml | 12 + modules/blockcart/de.php | 34 + modules/blockcart/en.php | 4 + modules/blockcart/es.php | 32 + modules/blockcart/fr.php | 32 + modules/blockcart/img/icon/basket.png | Bin 0 -> 669 bytes modules/blockcart/img/icon/basket_go.png | Bin 0 -> 777 bytes modules/blockcart/img/icon/checkout.png | Bin 0 -> 777 bytes modules/blockcart/img/icon/delete.gif | Bin 0 -> 103 bytes modules/blockcart/it.php | 34 + modules/blockcart/logo.gif | Bin 0 -> 995 bytes modules/blockcategories/blockcategories.php | 355 + modules/blockcategories/blockcategories.tpl | 49 + .../blockcategories_footer.tpl | 56 + .../blockcategories/category-tree-branch.tpl | 40 + modules/blockcategories/config.xml | 12 + modules/blockcategories/de.php | 24 + modules/blockcategories/en.php | 4 + modules/blockcategories/es.php | 22 + modules/blockcategories/fr.php | 22 + modules/blockcategories/it.php | 24 + modules/blockcategories/logo.gif | Bin 0 -> 649 bytes modules/blockcms/ajax_blockcms.php | 117 + modules/blockcms/blockcms.js | 144 + modules/blockcms/blockcms.php | 763 + modules/blockcms/blockcms.tpl | 62 + modules/blockcms/config.xml | 12 + modules/blockcms/de.php | 59 + modules/blockcms/es.php | 57 + modules/blockcms/fr.php | 57 + modules/blockcms/it.php | 59 + modules/blockcms/logo.gif | Bin 0 -> 778 bytes modules/blockcurrencies/blockcurrencies.php | 81 + modules/blockcurrencies/blockcurrencies.tpl | 44 + modules/blockcurrencies/config.xml | 12 + modules/blockcurrencies/de.php | 9 + modules/blockcurrencies/en.php | 4 + modules/blockcurrencies/es.php | 7 + modules/blockcurrencies/fr.php | 7 + modules/blockcurrencies/it.php | 9 + modules/blockcurrencies/logo.gif | Bin 0 -> 383 bytes modules/blocklanguages/blocklanguages.php | 75 + modules/blocklanguages/blocklanguages.tpl | 58 + modules/blocklanguages/config.xml | 12 + modules/blocklanguages/de.php | 8 + modules/blocklanguages/en.php | 4 + modules/blocklanguages/es.php | 6 + modules/blocklanguages/fr.php | 6 + modules/blocklanguages/it.php | 8 + modules/blocklanguages/logo.gif | Bin 0 -> 616 bytes modules/blocklayered/blocklayered-ajax.php | 35 + modules/blocklayered/blocklayered.css | 75 + modules/blocklayered/blocklayered.js | 192 + modules/blocklayered/blocklayered.php | 1010 + modules/blocklayered/blocklayered.tpl | 155 + modules/blocklayered/config.xml | 12 + modules/blocklayered/de.php | 46 + modules/blocklayered/es.php | 54 + modules/blocklayered/fr.php | 54 + modules/blocklayered/it.php | 46 + modules/blocklayered/logo.gif | Bin 0 -> 280 bytes modules/blocklink/add.png | Bin 0 -> 570 bytes modules/blocklink/blocklink.js | 44 + modules/blocklink/blocklink.php | 386 + modules/blocklink/blocklink.tpl | 42 + modules/blocklink/config.xml | 13 + modules/blocklink/de.php | 43 + modules/blocklink/en.php | 4 + modules/blocklink/es.php | 41 + modules/blocklink/fr.php | 41 + modules/blocklink/it.php | 43 + modules/blocklink/logo.gif | Bin 0 -> 1067 bytes modules/blocklink/prefs.gif | Bin 0 -> 351 bytes .../blockmanufacturer/blockmanufacturer.php | 133 + .../blockmanufacturer/blockmanufacturer.tpl | 58 + modules/blockmanufacturer/config.xml | 12 + modules/blockmanufacturer/de.php | 25 + modules/blockmanufacturer/en.php | 4 + modules/blockmanufacturer/es.php | 23 + modules/blockmanufacturer/fr.php | 23 + modules/blockmanufacturer/it.php | 25 + modules/blockmanufacturer/logo.gif | Bin 0 -> 280 bytes modules/blockmyaccount/blockmyaccount.php | 93 + modules/blockmyaccount/blockmyaccount.tpl | 43 + modules/blockmyaccount/config.xml | 12 + modules/blockmyaccount/de.php | 16 + modules/blockmyaccount/en.php | 4 + modules/blockmyaccount/es.php | 14 + modules/blockmyaccount/fr.php | 14 + modules/blockmyaccount/it.php | 16 + modules/blockmyaccount/logo.gif | Bin 0 -> 600 bytes modules/blocknewproducts/blocknewproducts.php | 121 + modules/blocknewproducts/blocknewproducts.tpl | 51 + modules/blocknewproducts/config.xml | 12 + modules/blocknewproducts/de.php | 23 + modules/blocknewproducts/en.php | 4 + modules/blocknewproducts/es.php | 21 + modules/blocknewproducts/fr.php | 21 + modules/blocknewproducts/it.php | 23 + modules/blocknewproducts/logo.gif | Bin 0 -> 333 bytes modules/blocknewsletter/blocknewsletter.php | 285 + modules/blocknewsletter/blocknewsletter.tpl | 48 + modules/blocknewsletter/config.xml | 13 + modules/blocknewsletter/de.php | 58 + modules/blocknewsletter/en.php | 4 + modules/blocknewsletter/es.php | 28 + modules/blocknewsletter/fr.php | 28 + modules/blocknewsletter/it.php | 58 + modules/blocknewsletter/logo.gif | Bin 0 -> 983 bytes .../mails/de/newsletter_conf.html | 14 + .../mails/de/newsletter_conf.txt | 7 + .../mails/de/newsletter_voucher.html | 40 + .../mails/de/newsletter_voucher.txt | 8 + .../mails/en/newsletter_conf.html | 21 + .../mails/en/newsletter_conf.txt | 7 + .../mails/en/newsletter_voucher.html | 36 + .../mails/en/newsletter_voucher.txt | 9 + .../mails/es/newsletter_conf.html | 15 + .../mails/es/newsletter_conf.txt | 7 + .../mails/es/newsletter_voucher.html | 41 + .../mails/es/newsletter_voucher.txt | 9 + .../mails/fr/newsletter_conf.html | 21 + .../mails/fr/newsletter_conf.txt | 7 + .../mails/fr/newsletter_voucher.html | 36 + .../mails/fr/newsletter_voucher.txt | 9 + .../mails/it/newsletter_conf.html | 15 + .../mails/it/newsletter_conf.txt | 6 + .../mails/it/newsletter_voucher.html | 40 + .../mails/it/newsletter_voucher.txt | 8 + modules/blockpaymentlogo/blockpaymentlogo.php | 145 + modules/blockpaymentlogo/blockpaymentlogo.tpl | 35 + modules/blockpaymentlogo/config.xml | 12 + modules/blockpaymentlogo/de.php | 15 + modules/blockpaymentlogo/en.php | 4 + modules/blockpaymentlogo/es.php | 13 + modules/blockpaymentlogo/fr.php | 13 + modules/blockpaymentlogo/it.php | 15 + modules/blockpaymentlogo/logo.gif | Bin 0 -> 1063 bytes .../blockpermanentlinks-header.tpl | 36 + .../blockpermanentlinks.php | 85 + .../blockpermanentlinks.tpl | 45 + modules/blockpermanentlinks/config.xml | 12 + modules/blockpermanentlinks/de.php | 14 + modules/blockpermanentlinks/en.php | 4 + modules/blockpermanentlinks/es.php | 12 + modules/blockpermanentlinks/fr.php | 12 + modules/blockpermanentlinks/it.php | 14 + modules/blockpermanentlinks/logo.gif | Bin 0 -> 938 bytes modules/blockrss/blockrss.php | 167 + modules/blockrss/blockrss.tpl | 42 + modules/blockrss/config.xml | 12 + modules/blockrss/de.php | 23 + modules/blockrss/en.php | 4 + modules/blockrss/es.php | 21 + modules/blockrss/fr.php | 21 + modules/blockrss/it.php | 23 + modules/blockrss/logo.gif | Bin 0 -> 1009 bytes modules/blocksearch/blocksearch-top.tpl | 135 + modules/blocksearch/blocksearch.php | 101 + modules/blocksearch/blocksearch.tpl | 135 + modules/blocksearch/config.xml | 12 + modules/blocksearch/de.php | 12 + modules/blocksearch/en.php | 4 + modules/blocksearch/es.php | 10 + modules/blocksearch/fr.php | 10 + modules/blocksearch/it.php | 12 + modules/blocksearch/logo.gif | Bin 0 -> 615 bytes modules/blockspecials/blockspecials.php | 113 + modules/blockspecials/blockspecials.tpl | 59 + modules/blockspecials/config.xml | 12 + modules/blockspecials/de.php | 19 + modules/blockspecials/en.php | 4 + modules/blockspecials/es.php | 17 + modules/blockspecials/fr.php | 17 + modules/blockspecials/it.php | 19 + modules/blockspecials/logo.gif | Bin 0 -> 251 bytes modules/blockstore/blockstore.css | 3 + modules/blockstore/blockstore.php | 125 + modules/blockstore/blockstore.tpl | 37 + modules/blockstore/config.xml | 12 + modules/blockstore/de.php | 18 + modules/blockstore/es.php | 16 + modules/blockstore/fr.php | 16 + modules/blockstore/it.php | 17 + modules/blockstore/logo.gif | Bin 0 -> 280 bytes modules/blockstore/store.jpg | Bin 0 -> 10572 bytes modules/blocksupplier/blocksupplier.php | 140 + modules/blocksupplier/blocksupplier.tpl | 60 + modules/blocksupplier/config.xml | 12 + modules/blocksupplier/de.php | 25 + modules/blocksupplier/en.php | 4 + modules/blocksupplier/es.php | 23 + modules/blocksupplier/fr.php | 23 + modules/blocksupplier/it.php | 25 + modules/blocksupplier/logo.gif | Bin 0 -> 266 bytes modules/blocktags/blocktags.php | 125 + modules/blocktags/blocktags.tpl | 40 + modules/blocktags/config.xml | 12 + modules/blocktags/de.php | 19 + modules/blocktags/en.php | 4 + modules/blocktags/es.php | 17 + modules/blocktags/fr.php | 17 + modules/blocktags/it.php | 19 + modules/blocktags/logo.gif | Bin 0 -> 731 bytes modules/blockuserinfo/blockuserinfo.php | 81 + modules/blockuserinfo/blockuserinfo.tpl | 62 + modules/blockuserinfo/config.xml | 12 + modules/blockuserinfo/de.php | 18 + modules/blockuserinfo/en.php | 4 + modules/blockuserinfo/es.php | 16 + modules/blockuserinfo/fr.php | 16 + modules/blockuserinfo/it.php | 18 + modules/blockuserinfo/logo.gif | Bin 0 -> 600 bytes modules/blockviewed/blockviewed.php | 191 + modules/blockviewed/blockviewed.tpl | 41 + modules/blockviewed/config.xml | 12 + modules/blockviewed/de.php | 18 + modules/blockviewed/en.php | 4 + modules/blockviewed/es.php | 16 + modules/blockviewed/fr.php | 16 + modules/blockviewed/it.php | 18 + modules/blockviewed/logo.gif | Bin 0 -> 954 bytes modules/blockwishlist/WishList.php | 517 + modules/blockwishlist/blockwishlist-ajax.tpl | 50 + modules/blockwishlist/blockwishlist-extra.tpl | 27 + .../blockwishlist/blockwishlist-header.tpl | 29 + modules/blockwishlist/blockwishlist.php | 340 + modules/blockwishlist/blockwishlist.tpl | 66 + modules/blockwishlist/buywishlistproduct.php | 54 + modules/blockwishlist/cart.php | 87 + modules/blockwishlist/config.xml | 12 + modules/blockwishlist/de.php | 84 + modules/blockwishlist/en.php | 4 + modules/blockwishlist/es.php | 82 + modules/blockwishlist/fr.php | 82 + modules/blockwishlist/img/delete.gif | Bin 0 -> 752 bytes modules/blockwishlist/img/icon/delete.png | Bin 0 -> 715 bytes modules/blockwishlist/img/icon/package.png | Bin 0 -> 853 bytes modules/blockwishlist/img/icon/package_go.png | Bin 0 -> 898 bytes modules/blockwishlist/img/star.gif | Bin 0 -> 815 bytes modules/blockwishlist/install.sql | 33 + modules/blockwishlist/it.php | 84 + modules/blockwishlist/js/ajax-wishlist.js | 254 + modules/blockwishlist/logo.gif | Bin 0 -> 853 bytes modules/blockwishlist/mails/de/wishlink.html | 40 + modules/blockwishlist/mails/de/wishlink.txt | 7 + modules/blockwishlist/mails/de/wishlist.html | 40 + modules/blockwishlist/mails/de/wishlist.txt | 8 + modules/blockwishlist/mails/en/wishlink.html | 38 + modules/blockwishlist/mails/en/wishlink.txt | 7 + modules/blockwishlist/mails/en/wishlist.html | 38 + modules/blockwishlist/mails/en/wishlist.txt | 8 + modules/blockwishlist/mails/es/wishlink.html | 11 + modules/blockwishlist/mails/es/wishlink.txt | 1 + modules/blockwishlist/mails/es/wishlist.html | 41 + modules/blockwishlist/mails/es/wishlist.txt | 8 + modules/blockwishlist/mails/fr/wishlink.html | 38 + modules/blockwishlist/mails/fr/wishlink.txt | 7 + modules/blockwishlist/mails/fr/wishlist.html | 38 + modules/blockwishlist/mails/fr/wishlist.txt | 8 + modules/blockwishlist/mails/it/wishlink.html | 40 + modules/blockwishlist/mails/it/wishlink.txt | 7 + modules/blockwishlist/mails/it/wishlist.html | 40 + modules/blockwishlist/mails/it/wishlist.txt | 8 + modules/blockwishlist/managewishlist.php | 115 + modules/blockwishlist/managewishlist.tpl | 127 + modules/blockwishlist/my-account.tpl | 31 + modules/blockwishlist/mywishlist.php | 106 + modules/blockwishlist/mywishlist.tpl | 100 + modules/blockwishlist/sendwishlist.php | 61 + modules/blockwishlist/view.php | 88 + modules/blockwishlist/view.tpl | 96 + modules/carriercompare/ajax.php | 51 + modules/carriercompare/carriercompare.js | 138 + modules/carriercompare/carriercompare.php | 180 + modules/carriercompare/carriercompare.tpl | 95 + modules/carriercompare/config.xml | 12 + modules/carriercompare/de.php | 24 + modules/carriercompare/es.php | 22 + modules/carriercompare/fr.php | 22 + modules/carriercompare/it.php | 24 + modules/carriercompare/logo.gif | Bin 0 -> 583 bytes modules/carriercompare/style.css | 14 + modules/cashondelivery/cashondelivery.gif | Bin 0 -> 2391 bytes modules/cashondelivery/cashondelivery.jpg | Bin 0 -> 3009 bytes modules/cashondelivery/cashondelivery.php | 85 + modules/cashondelivery/config.xml | 12 + modules/cashondelivery/confirmation.tpl | 32 + modules/cashondelivery/de.php | 25 + modules/cashondelivery/en.php | 4 + modules/cashondelivery/es.php | 23 + modules/cashondelivery/fr.php | 23 + modules/cashondelivery/it.php | 25 + modules/cashondelivery/logo.gif | Bin 0 -> 425 bytes modules/cashondelivery/payment.tpl | 34 + modules/cashondelivery/validation.php | 63 + modules/cashondelivery/validation.tpl | 58 + modules/cashticket/Disposition.php | 82 + modules/cashticket/PrepaidServices.php | 665 + modules/cashticket/PrepaidServicesAPI.php | 202 + .../cashticket/cashticket-accept-payment.tpl | 43 + .../cashticket/cashticket-confirmation.tpl | 32 + modules/cashticket/cashticket.php | 119 + modules/cashticket/config.xml | 12 + modules/cashticket/de.php | 53 + modules/cashticket/disposition-error.tpl | 37 + modules/cashticket/es.php | 51 + modules/cashticket/fr.php | 51 + modules/cashticket/img/payment-logo.png | Bin 0 -> 14045 bytes modules/cashticket/img/payment-small.png | Bin 0 -> 633 bytes modules/cashticket/img/payment.png | Bin 0 -> 14045 bytes modules/cashticket/it.php | 53 + modules/cashticket/keyring/.htaccess | 1 + modules/cashticket/keyring/paysafecard-CA.pem | 227 + modules/cashticket/logo.gif | Bin 0 -> 952 bytes modules/cashticket/payment.php | 107 + modules/cashticket/payment.tpl | 32 + modules/cashticket/prepaidservices.js | 38 + modules/cashticket/redirect.php | 51 + modules/cheque/cheque.jpg | Bin 0 -> 1837 bytes modules/cheque/cheque.php | 223 + modules/cheque/config.xml | 13 + modules/cheque/de.php | 51 + modules/cheque/en.php | 4 + modules/cheque/es.php | 49 + modules/cheque/fr.php | 49 + modules/cheque/it.php | 51 + modules/cheque/logo.gif | Bin 0 -> 958 bytes modules/cheque/payment.php | 43 + modules/cheque/payment.tpl | 32 + modules/cheque/payment_execution.tpl | 80 + modules/cheque/payment_return.tpl | 43 + modules/cheque/validation.php | 54 + modules/criteo/config.xml | 12 + modules/criteo/criteo.php | 367 + modules/criteo/de.php | 15 + modules/criteo/en.php | 4 + modules/criteo/es.php | 13 + modules/criteo/export_csv.php | 36 + modules/criteo/export_xml.php | 36 + modules/criteo/fr.php | 13 + modules/criteo/it.php | 15 + modules/criteo/logo.gif | Bin 0 -> 176 bytes modules/crossselling/config.xml | 12 + modules/crossselling/crossselling.php | 150 + modules/crossselling/crossselling.tpl | 59 + modules/crossselling/de.php | 18 + modules/crossselling/en.php | 5 + modules/crossselling/es.php | 16 + modules/crossselling/fr.php | 16 + modules/crossselling/it.php | 17 + modules/crossselling/js/crossselling.js | 65 + modules/crossselling/logo.gif | Bin 0 -> 731 bytes modules/dateofdelivery/beforeCarrier.tpl | 67 + modules/dateofdelivery/config.xml | 12 + modules/dateofdelivery/dateofdelivery.php | 527 + modules/dateofdelivery/de.php | 75 + modules/dateofdelivery/es.php | 73 + modules/dateofdelivery/fr.php | 73 + modules/dateofdelivery/img/cross.png | Bin 0 -> 655 bytes modules/dateofdelivery/img/tick.png | Bin 0 -> 537 bytes modules/dateofdelivery/img/time.png | Bin 0 -> 793 bytes modules/dateofdelivery/img/time_add.png | Bin 0 -> 827 bytes modules/dateofdelivery/img/time_delete.png | Bin 0 -> 853 bytes modules/dateofdelivery/it.php | 75 + modules/dateofdelivery/logo.gif | Bin 0 -> 618 bytes modules/dateofdelivery/orderDetail.tpl | 30 + modules/dejala/MyLogUtils.php | 49 + modules/dejala/calendarutils.php | 141 + modules/dejala/config.xml | 12 + modules/dejala/de.php | 189 + modules/dejala/dejala.php | 1359 ++ modules/dejala/dejala_carrier.gif | Bin 0 -> 2004 bytes modules/dejala/dejala_carrier.tpl | 65 + modules/dejala/dejala_carrier_nostock.tpl | 23 + modules/dejala/dejala_contacts.tpl | 46 + modules/dejala/dejala_deliveries.tpl | 74 + modules/dejala/dejala_deliveries_csv.tpl | 4 + modules/dejala/dejala_delivery_options.tpl | 43 + modules/dejala/dejala_footer.tpl | 26 + modules/dejala/dejala_header.tpl | 9 + modules/dejala/dejala_home.tpl | 166 + modules/dejala/dejala_location.tpl | 26 + modules/dejala/dejala_logo.gif | Bin 0 -> 2932 bytes modules/dejala/dejala_menu.tpl | 37 + modules/dejala/dejala_picking_timetable.tpl | 31 + modules/dejala/dejala_processes.tpl | 23 + modules/dejala/dejala_products.tpl | 40 + modules/dejala/dejala_technical_options.tpl | 20 + modules/dejala/dejala_timetable.tpl | 27 + modules/dejala/dejalacarrierutils.php | 100 + modules/dejala/dejalacart.php | 74 + modules/dejala/dejalaconfig.php | 119 + modules/dejala/dejalatest.php | 19 + modules/dejala/dejalautils.php | 498 + modules/dejala/deliveries_csv.php | 72 + modules/dejala/es.php | 187 + modules/dejala/fr.php | 187 + modules/dejala/google.gif | Bin 0 -> 378 bytes modules/dejala/install.sql | 10 + modules/dejala/it.php | 189 + modules/dejala/logo.gif | Bin 0 -> 1072 bytes modules/dejala/picto_0.gif | Bin 0 -> 64 bytes modules/dejala/picto_1.gif | Bin 0 -> 1000 bytes modules/dejala/picto_2.gif | Bin 0 -> 1006 bytes modules/dejala/picto_3.gif | Bin 0 -> 992 bytes modules/dejala/picto_4.gif | Bin 0 -> 1009 bytes modules/dejala/picto_5.gif | Bin 0 -> 1032 bytes modules/dejala/picto_6.gif | Bin 0 -> 973 bytes modules/dejala/picto_7.gif | Bin 0 -> 1041 bytes modules/dejala/picto_8.gif | Bin 0 -> 1042 bytes modules/dejala/submenu-bg.gif | Bin 0 -> 52 bytes modules/dejala/timetable.css | 49 + modules/dejala/timetable.js | 104 + modules/dibs/config.xml | 12 + modules/dibs/de.php | 45 + modules/dibs/dibs.jpg | Bin 0 -> 1931 bytes modules/dibs/dibs.php | 399 + modules/dibs/dibs.tpl | 13 + modules/dibs/es.php | 43 + modules/dibs/fr.php | 43 + modules/dibs/hookorderconfirmation.tpl | 11 + modules/dibs/img/da.jpg | Bin 0 -> 1364 bytes modules/dibs/img/en.jpg | Bin 0 -> 665 bytes modules/dibs/img/no.jpg | Bin 0 -> 11692 bytes modules/dibs/img/sv.jpg | Bin 0 -> 1402 bytes modules/dibs/it.php | 44 + modules/dibs/logo.gif | Bin 0 -> 1654 bytes modules/dibs/logos/dibs_black.jpg | Bin 0 -> 1814 bytes modules/dibs/logos/dibs_blue.jpg | Bin 0 -> 1953 bytes modules/dibs/logos/dibs_green.jpg | Bin 0 -> 1652 bytes modules/dibs/logos/dibs_grey.jpg | Bin 0 -> 1216 bytes modules/dibs/logos/dibs_purple.jpg | Bin 0 -> 1952 bytes modules/dibs/logos/dibs_yellow.jpg | Bin 0 -> 1670 bytes modules/dibs/validation.php | 47 + modules/ebay/ajax/changeCategoryMatch.php | 35 + modules/ebay/ajax/checkToken.php | 31 + modules/ebay/ajax/getNbProductsSync.php | 21 + modules/ebay/ajax/loadCategoryMatch.php | 54 + modules/ebay/config.xml | 12 + modules/ebay/de.php | 46 + modules/ebay/eBayRequest.php | 1047 + modules/ebay/ebay.gif | Bin 0 -> 2871 bytes modules/ebay/ebay.php | 1710 ++ modules/ebay/es.php | 0 modules/ebay/forbbiden.gif | Bin 0 -> 594 bytes modules/ebay/fr.php | 80 + modules/ebay/it.php | 7 + modules/ebay/loading.gif | Bin 0 -> 58913 bytes modules/ebay/logo.gif | Bin 0 -> 597 bytes modules/ebay/sql-install.php | 52 + modules/ebay/sql-uninstall.php | 9 + modules/ebay/template/ebay.css | 14 + modules/ebay/template/ebay.tpl | 35 + modules/ebay/template/images/favorite.png | Bin 0 -> 1110 bytes modules/ebay/template/images/footer.png | Bin 0 -> 5910 bytes modules/ebay/template/images/header.png | Bin 0 -> 5345 bytes modules/ebay/template/images/search.png | Bin 0 -> 1057 bytes modules/ebay/template/images/stats.png | Bin 0 -> 941 bytes modules/ebay/valid.png | Bin 0 -> 778 bytes modules/ebay/warn.png | Bin 0 -> 1061 bytes modules/editorial/EditorialClass.php | 115 + modules/editorial/config.xml | 12 + modules/editorial/de.php | 25 + modules/editorial/editorial.php | 318 + modules/editorial/editorial.tpl | 41 + modules/editorial/en.php | 4 + modules/editorial/es.php | 23 + modules/editorial/fr.php | 23 + modules/editorial/homepage_logo.jpg | Bin 0 -> 21250 bytes modules/editorial/it.php | 25 + modules/editorial/logo.gif | Bin 0 -> 627 bytes modules/ekomi/config.xml | 12 + modules/ekomi/de.php | 19 + modules/ekomi/ekomi.php | 133 + modules/ekomi/es.php | 17 + modules/ekomi/fr.php | 17 + modules/ekomi/it.php | 17 + modules/ekomi/logo.gif | Bin 0 -> 1095 bytes modules/ekomi/mails/de/ekomi.html | 10 + modules/ekomi/mails/de/ekomi.txt | 4 + modules/ekomi/mails/en/ekomi.html | 4 + modules/ekomi/mails/en/ekomi.txt | 4 + modules/ekomi/mails/es/ekomi.html | 11 + modules/ekomi/mails/es/ekomi.txt | 4 + modules/ekomi/mails/fr/ekomi.html | 4 + modules/ekomi/mails/fr/ekomi.txt | 4 + modules/ekomi/mails/it/ekomi.html | 10 + modules/ekomi/mails/it/ekomi.txt | 4 + .../envoimoinscher/AdminEnvoiMoinsCher.gif | Bin 0 -> 604 bytes .../envoimoinscher/AdminEnvoiMoinsCher.php | 314 + modules/envoimoinscher/config.xml | 12 + modules/envoimoinscher/de.php | 119 + modules/envoimoinscher/envoimoinscher.php | 601 + modules/envoimoinscher/es.php | 117 + modules/envoimoinscher/fr.php | 117 + modules/envoimoinscher/install.sql | 84 + modules/envoimoinscher/it.php | 119 + modules/envoimoinscher/logo.gif | Bin 0 -> 604 bytes modules/envoimoinscher/logocarre.png | Bin 0 -> 13384 bytes modules/envoimoinscher/ps_emc.png | Bin 0 -> 11858 bytes modules/envoimoinscher/tracking.php | 105 + modules/fedexcarrier/RateService_v9.wsdl | 4756 +++++ modules/fedexcarrier/carrier.jpg | Bin 0 -> 2785 bytes modules/fedexcarrier/config.xml | 12 + modules/fedexcarrier/de.php | 147 + modules/fedexcarrier/es.php | 145 + modules/fedexcarrier/fedexcarrier.php | 1702 ++ modules/fedexcarrier/fr.php | 145 + modules/fedexcarrier/it.php | 147 + modules/fedexcarrier/logo.gif | Bin 0 -> 552 bytes modules/fedexcarrier/sql-install.php | 89 + modules/fedexcarrier/sql-uninstall.php | 11 + modules/feeder/config.xml | 12 + modules/feeder/de.php | 8 + modules/feeder/en.php | 4 + modules/feeder/es.php | 6 + modules/feeder/feeder.php | 87 + modules/feeder/feederHeader.tpl | 27 + modules/feeder/fr.php | 6 + modules/feeder/it.php | 8 + modules/feeder/logo.gif | Bin 0 -> 1009 bytes modules/feeder/rss.php | 78 + modules/fianetfraud/config.xml | 12 + modules/fianetfraud/cron_reevaluate.php | 31 + modules/fianetfraud/cron_waiting.php | 33 + modules/fianetfraud/de.php | 38 + modules/fianetfraud/es.php | 36 + .../fianet/classes/fianet_key_32bits.php | 274 + .../fianet/classes/fianet_key_64bits.php | 279 + .../fianet/classes/fianet_sender.php | 473 + .../classes/fianet_sender.private.inc.php | 235 + .../fianet/classes/fianet_socket.php | 172 + .../classes/order/fianet_adress_xml.php | 76 + .../classes/order/fianet_appartment_xml.php | 44 + .../order/fianet_billing_adress_xml.php | 13 + .../classes/order/fianet_billing_user_xml.php | 13 + .../order/fianet_delivery_adress_xml.php | 11 + .../order/fianet_delivery_user_xml.php | 11 + .../classes/order/fianet_info_order_xml.php | 50 + .../fianet/classes/order/fianet_order_xml.php | 68 + .../classes/order/fianet_paraobject_xml.php | 23 + .../classes/order/fianet_payment_xml.php | 76 + .../classes/order/fianet_product_list_xml.php | 49 + .../classes/order/fianet_product_xml.php | 59 + .../order/fianet_rnp_info_order_xml.php | 36 + .../classes/order/fianet_rnp_order_xml.php | 142 + .../classes/order/fianet_rnp_wallet_xml.php | 60 + .../classes/order/fianet_transport_xml.php | 42 + .../order/fianet_user_siteconso_xml.php | 29 + .../fianet/classes/order/fianet_user_xml.php | 80 + .../order/fianet_xml_paracallback_builder.php | 44 + modules/fianetfraud/fianet/const/fianet.php | 4 + modules/fianetfraud/fianet/const/url_rnp.php | 6 + modules/fianetfraud/fianet/const/url_sac.php | 10 + modules/fianetfraud/fianet/fianet.php | 49 + modules/fianetfraud/fianet/includes/debug.php | 77 + .../fianetfraud/fianet/includes/general.php | 71 + .../fianetfraud/fianet/includes/xml2array.php | 119 + .../fianet/to_implement/implement.php | 12 + modules/fianetfraud/fianetfraud.php | 625 + modules/fianetfraud/fr.php | 36 + modules/fianetfraud/install.sql | 13 + modules/fianetfraud/it.php | 38 + modules/fianetfraud/logo.gif | Bin 0 -> 230 bytes modules/fianetfraud/logo.jpg | Bin 0 -> 15435 bytes modules/fianetsceau/config.xml | 12 + modules/fianetsceau/de.php | 23 + modules/fianetsceau/es.php | 21 + modules/fianetsceau/fianetsceau.php | 239 + modules/fianetsceau/fr.php | 21 + modules/fianetsceau/it.php | 23 + modules/fianetsceau/logo.gif | Bin 0 -> 994 bytes modules/fianetsceau/logo.jpg | Bin 0 -> 20511 bytes modules/followup/config.xml | 13 + modules/followup/cron.php | 40 + modules/followup/de.php | 46 + modules/followup/en.php | 4 + modules/followup/es.php | 44 + modules/followup/followup.php | 488 + modules/followup/fr.php | 44 + modules/followup/it.php | 46 + modules/followup/logo-2.gif | Bin 0 -> 606 bytes modules/followup/logo.gif | Bin 0 -> 587 bytes modules/followup/mails/de/followup_1.html | 46 + modules/followup/mails/de/followup_1.txt | 11 + modules/followup/mails/de/followup_2.html | 46 + modules/followup/mails/de/followup_2.txt | 10 + modules/followup/mails/de/followup_3.html | 49 + modules/followup/mails/de/followup_3.txt | 9 + modules/followup/mails/de/followup_4.html | 48 + modules/followup/mails/de/followup_4.txt | 11 + modules/followup/mails/en/followup_1.html | 49 + modules/followup/mails/en/followup_1.txt | 13 + modules/followup/mails/en/followup_2.html | 43 + modules/followup/mails/en/followup_2.txt | 9 + modules/followup/mails/en/followup_3.html | 45 + modules/followup/mails/en/followup_3.txt | 9 + modules/followup/mails/en/followup_4.html | 45 + modules/followup/mails/en/followup_4.txt | 11 + modules/followup/mails/es/followup_1.html | 47 + modules/followup/mails/es/followup_1.txt | 0 modules/followup/mails/es/followup_2.html | 47 + modules/followup/mails/es/followup_2.txt | 0 modules/followup/mails/es/followup_3.html | 47 + modules/followup/mails/es/followup_3.txt | 0 modules/followup/mails/es/followup_4.html | 47 + modules/followup/mails/es/followup_4.txt | 0 modules/followup/mails/fr/followup_1.html | 49 + modules/followup/mails/fr/followup_1.txt | 9 + modules/followup/mails/fr/followup_2.html | 43 + modules/followup/mails/fr/followup_2.txt | 9 + modules/followup/mails/fr/followup_3.html | 44 + modules/followup/mails/fr/followup_3.txt | 9 + modules/followup/mails/fr/followup_4.html | 44 + modules/followup/mails/fr/followup_4.txt | 9 + modules/followup/mails/it/followup_1.html | 46 + modules/followup/mails/it/followup_1.txt | 13 + modules/followup/mails/it/followup_2.html | 46 + modules/followup/mails/it/followup_2.txt | 9 + modules/followup/mails/it/followup_3.html | 46 + modules/followup/mails/it/followup_3.txt | 9 + modules/followup/mails/it/followup_4.html | 46 + modules/followup/mails/it/followup_4.txt | 11 + modules/gadsense/adsense_script.gif | Bin 0 -> 2456 bytes modules/gadsense/config.xml | 13 + modules/gadsense/de.php | 15 + modules/gadsense/en.php | 4 + modules/gadsense/es.php | 13 + modules/gadsense/fr.php | 13 + modules/gadsense/gadsense.php | 116 + modules/gadsense/it.php | 15 + modules/gadsense/logo.gif | Bin 0 -> 378 bytes modules/ganalytics/config.xml | 13 + modules/ganalytics/de.php | 51 + modules/ganalytics/en.php | 4 + modules/ganalytics/es.php | 49 + modules/ganalytics/fr.php | 49 + modules/ganalytics/ganalytics.php | 209 + modules/ganalytics/header.tpl | 39 + modules/ganalytics/it.php | 51 + modules/ganalytics/logo.gif | Bin 0 -> 1117 bytes modules/gcheckout/.htaccess | 5 + modules/gcheckout/config.xml | 12 + modules/gcheckout/confirm.tpl | 56 + modules/gcheckout/de.php | 44 + modules/gcheckout/en.php | 4 + modules/gcheckout/es.php | 42 + modules/gcheckout/fr.php | 42 + modules/gcheckout/gcheckout.gif | Bin 0 -> 2569 bytes modules/gcheckout/gcheckout.php | 230 + modules/gcheckout/htaccessBugInformation.php | 21 + modules/gcheckout/it.php | 44 + modules/gcheckout/library/googlecart.php | 1612 ++ modules/gcheckout/library/googleitem.php | 161 + modules/gcheckout/library/googlelog.php | 96 + .../library/googlemerchantcalculations.php | 115 + modules/gcheckout/library/googlerequest.php | 757 + modules/gcheckout/library/googleresponse.php | 221 + modules/gcheckout/library/googleresult.php | 105 + modules/gcheckout/library/googleshipping.php | 532 + modules/gcheckout/library/googletax.php | 146 + .../library/xml-processing/gc_xmlbuilder.php | 94 + .../library/xml-processing/gc_xmlparser.php | 202 + modules/gcheckout/logo.gif | Bin 0 -> 378 bytes modules/gcheckout/payment.php | 47 + modules/gcheckout/payment.tpl | 32 + modules/gcheckout/payment_return.tpl | 27 + modules/gcheckout/validation.php | 158 + .../graphartichow/artichow/AntiSpam.class.php | 224 + .../graphartichow/artichow/Artichow.cfg.php | 84 + .../graphartichow/artichow/BarPlot.class.php | 364 + .../artichow/Component.class.php | 415 + .../graphartichow/artichow/Graph.class.php | 412 + .../graphartichow/artichow/Image.class.php | 606 + .../graphartichow/artichow/LinePlot.class.php | 585 + .../graphartichow/artichow/MathPlot.class.php | 438 + .../graphartichow/artichow/Pattern.class.php | 96 + modules/graphartichow/artichow/Pie.class.php | 694 + modules/graphartichow/artichow/Plot.class.php | 1463 ++ .../artichow/ScatterPlot.class.php | 300 + modules/graphartichow/artichow/cache/Abel | Bin 0 -> 15596 bytes .../graphartichow/artichow/cache/Abel-time | 2 + modules/graphartichow/artichow/cache/Albert | Bin 0 -> 14816 bytes .../graphartichow/artichow/cache/Albert-time | 2 + .../graphartichow/artichow/cache/Example-006 | Bin 0 -> 13372 bytes .../artichow/cache/Example-006-time | 2 + modules/graphartichow/artichow/common.php | 96 + modules/graphartichow/artichow/font/Tuffy.ttf | Bin 0 -> 19300 bytes .../graphartichow/artichow/font/TuffyBold.ttf | Bin 0 -> 16440 bytes .../artichow/font/TuffyBoldItalic.ttf | Bin 0 -> 18068 bytes .../artichow/font/TuffyItalic.ttf | Bin 0 -> 18904 bytes .../graphartichow/artichow/images/book.png | Bin 0 -> 797 bytes .../graphartichow/artichow/images/error.png | Bin 0 -> 6066 bytes .../images/errors/missing-anti-aliasing.png | Bin 0 -> 7634 bytes .../artichow/images/errors/missing-gd2.png | Bin 0 -> 7448 bytes .../artichow/images/paperclip.png | Bin 0 -> 452 bytes .../graphartichow/artichow/images/star.png | Bin 0 -> 748 bytes .../graphartichow/artichow/inc/Axis.class.php | 768 + .../artichow/inc/Border.class.php | 197 + .../artichow/inc/Color.class.php | 165 + .../artichow/inc/Driver.class.php | 724 + .../graphartichow/artichow/inc/Font.class.php | 262 + .../artichow/inc/Gradient.class.php | 135 + .../graphartichow/artichow/inc/Grid.class.php | 290 + .../artichow/inc/Label.class.php | 587 + .../artichow/inc/Legend.class.php | 709 + .../graphartichow/artichow/inc/Mark.class.php | 489 + .../graphartichow/artichow/inc/Math.class.php | 831 + .../artichow/inc/Shadow.class.php | 405 + .../graphartichow/artichow/inc/Text.class.php | 233 + .../graphartichow/artichow/inc/Tick.class.php | 343 + .../artichow/inc/Tools.class.php | 174 + .../artichow/inc/drivers/gd.class.php | 1335 ++ .../artichow/inc/drivers/ming.class.php | 773 + .../artichow/patterns/BarDepth.php | 84 + .../artichow/patterns/LightLine.php | 49 + modules/graphartichow/config.xml | 12 + modules/graphartichow/de.php | 8 + modules/graphartichow/en.php | 4 + modules/graphartichow/es.php | 6 + modules/graphartichow/fr.php | 6 + modules/graphartichow/graphartichow.php | 370 + modules/graphartichow/it.php | 8 + modules/graphartichow/logo.gif | Bin 0 -> 1042 bytes modules/graphgooglechart/config.xml | 12 + modules/graphgooglechart/de.php | 8 + modules/graphgooglechart/en.php | 4 + modules/graphgooglechart/es.php | 6 + modules/graphgooglechart/fr.php | 6 + modules/graphgooglechart/graphgooglechart.php | 248 + modules/graphgooglechart/it.php | 8 + modules/graphgooglechart/logo.gif | Bin 0 -> 953 bytes modules/graphvisifire/config.xml | 12 + modules/graphvisifire/de.php | 8 + modules/graphvisifire/en.php | 4 + modules/graphvisifire/es.php | 6 + modules/graphvisifire/fr.php | 6 + modules/graphvisifire/graphvisifire.php | 187 + modules/graphvisifire/it.php | 8 + modules/graphvisifire/logo.gif | Bin 0 -> 1012 bytes modules/graphvisifire/visifire/Visifire.js | 353 + modules/graphvisifire/visifire/Visifire.xap | Bin 0 -> 152606 bytes modules/graphxmlswfcharts/config.xml | 12 + modules/graphxmlswfcharts/de.php | 8 + modules/graphxmlswfcharts/en.php | 4 + modules/graphxmlswfcharts/es.php | 6 + modules/graphxmlswfcharts/fr.php | 6 + .../graphxmlswfcharts/graphxmlswfcharts.php | 259 + modules/graphxmlswfcharts/it.php | 8 + modules/graphxmlswfcharts/logo.gif | Bin 0 -> 979 bytes .../xml_swf_charts/AC_RunActiveContent.js | 292 + .../xml_swf_charts/charts.swf | Bin 0 -> 51456 bytes .../xml_swf_charts/charts.txt | 1 + .../xml_swf_charts/charts_library/ar3d.swf | Bin 0 -> 10349 bytes .../xml_swf_charts/charts_library/arno.swf | Bin 0 -> 8119 bytes .../xml_swf_charts/charts_library/ars3.swf | Bin 0 -> 10756 bytes .../xml_swf_charts/charts_library/arst.swf | Bin 0 -> 8444 bytes .../xml_swf_charts/charts_library/brfl.swf | Bin 0 -> 7351 bytes .../xml_swf_charts/charts_library/brno.swf | Bin 0 -> 8660 bytes .../xml_swf_charts/charts_library/brst.swf | Bin 0 -> 8646 bytes .../xml_swf_charts/charts_library/buno.swf | Bin 0 -> 7014 bytes .../xml_swf_charts/charts_library/cl3d.swf | Bin 0 -> 10512 bytes .../xml_swf_charts/charts_library/clfl.swf | Bin 0 -> 7125 bytes .../xml_swf_charts/charts_library/clim.swf | Bin 0 -> 6963 bytes .../xml_swf_charts/charts_library/clno.swf | Bin 0 -> 8394 bytes .../xml_swf_charts/charts_library/clp3.swf | Bin 0 -> 10524 bytes .../xml_swf_charts/charts_library/cls3.swf | Bin 0 -> 10616 bytes .../xml_swf_charts/charts_library/clst.swf | Bin 0 -> 8486 bytes .../xml_swf_charts/charts_library/cnno.swf | Bin 0 -> 7450 bytes .../xml_swf_charts/charts_library/dono.swf | Bin 0 -> 6615 bytes .../xml_swf_charts/charts_library/lnno.swf | Bin 0 -> 9111 bytes .../xml_swf_charts/charts_library/mxno.swf | Bin 0 -> 10229 bytes .../xml_swf_charts/charts_library/pi3d.swf | Bin 0 -> 9222 bytes .../xml_swf_charts/charts_library/piim.swf | Bin 0 -> 5572 bytes .../xml_swf_charts/charts_library/pino.swf | Bin 0 -> 6814 bytes .../xml_swf_charts/charts_library/pono.swf | Bin 0 -> 8529 bytes .../xml_swf_charts/charts_library/scno.swf | Bin 0 -> 8069 bytes modules/gridhtml/config.xml | 12 + modules/gridhtml/de.php | 7 + modules/gridhtml/en.php | 4 + modules/gridhtml/es.php | 5 + modules/gridhtml/fr.php | 5 + modules/gridhtml/gridhtml.php | 190 + modules/gridhtml/it.php | 7 + modules/gridhtml/logo.gif | Bin 0 -> 998 bytes modules/gsitemap/config.xml | 12 + modules/gsitemap/de.php | 22 + modules/gsitemap/en.php | 4 + modules/gsitemap/es.php | 22 + modules/gsitemap/fr.php | 22 + modules/gsitemap/gsitemap.php | 384 + modules/gsitemap/it.php | 26 + modules/gsitemap/logo.gif | Bin 0 -> 378 bytes modules/hipay/1.png | Bin 0 -> 2216 bytes modules/hipay/2.png | Bin 0 -> 2399 bytes modules/hipay/3.png | Bin 0 -> 2530 bytes modules/hipay/config.xml | 12 + modules/hipay/create.jpg | Bin 0 -> 13498 bytes modules/hipay/de.php | 50 + modules/hipay/es.php | 45 + modules/hipay/fr.php | 45 + modules/hipay/help.png | Bin 0 -> 787 bytes modules/hipay/hipay.php | 511 + modules/hipay/hipay.png | Bin 0 -> 2636 bytes modules/hipay/it.php | 51 + modules/hipay/logo.gif | Bin 0 -> 1073 bytes modules/hipay/mapi/mapi_affiliate.php | 232 + modules/hipay/mapi/mapi_comm_xml.php | 124 + modules/hipay/mapi/mapi_defs.php | 83 + modules/hipay/mapi/mapi_exception.php | 125 + modules/hipay/mapi/mapi_installment.php | 215 + modules/hipay/mapi/mapi_item.php | 43 + modules/hipay/mapi/mapi_lockable.php | 21 + modules/hipay/mapi/mapi_multiplepayment.php | 45 + modules/hipay/mapi/mapi_order.php | 396 + modules/hipay/mapi/mapi_package.php | 20 + modules/hipay/mapi/mapi_payment.php | 447 + modules/hipay/mapi/mapi_paymentparams.php | 880 + modules/hipay/mapi/mapi_product.php | 285 + modules/hipay/mapi/mapi_send_xml.php | 89 + modules/hipay/mapi/mapi_simplepayment.php | 19 + modules/hipay/mapi/mapi_tax.php | 165 + modules/hipay/mapi/mapi_utf8.php | 70 + modules/hipay/mapi/mapi_utils.php | 73 + modules/hipay/mapi/mapi_xml.php | 72 + modules/hipay/payment.tpl | 39 + modules/hipay/redirect.php | 41 + modules/hipay/screenshots/accountnumber.png | Bin 0 -> 17281 bytes .../hipay/screenshots/merchantpassword.png | Bin 0 -> 40449 bytes modules/hipay/screenshots/siteid.png | Bin 0 -> 43597 bytes modules/hipay/validation.php | 33 + modules/homefeatured/config.xml | 12 + modules/homefeatured/de.php | 20 + modules/homefeatured/en.php | 4 + modules/homefeatured/es.php | 18 + modules/homefeatured/fr.php | 18 + modules/homefeatured/homefeatured.php | 107 + modules/homefeatured/homefeatured.tpl | 64 + modules/homefeatured/it.php | 20 + modules/homefeatured/logo.gif | Bin 0 -> 597 bytes modules/iadvize/config.xml | 12 + modules/iadvize/de.php | 21 + modules/iadvize/es.php | 19 + modules/iadvize/fr.php | 19 + modules/iadvize/iadvize.php | 161 + modules/iadvize/it.php | 21 + modules/iadvize/logo-iadvize.gif | Bin 0 -> 4771 bytes modules/iadvize/logo.gif | Bin 0 -> 585 bytes modules/iadvize/offer-fr.jpg | Bin 0 -> 23217 bytes modules/importerosc/config.xml | 12 + modules/importerosc/de.php | 15 + modules/importerosc/es.php | 14 + modules/importerosc/fr.php | 14 + modules/importerosc/importerosc.php | 434 + modules/importerosc/it.php | 15 + modules/importerosc/logo.gif | Bin 0 -> 2378 bytes modules/importerosc/passwordhash.php | 254 + modules/index.php | 36 + modules/livezilla/config.xml | 12 + modules/livezilla/de.php | 21 + modules/livezilla/es.php | 20 + modules/livezilla/fr.php | 20 + modules/livezilla/it.php | 21 + modules/livezilla/livezilla.php | 124 + modules/livezilla/livezilla.tpl | 54 + modules/livezilla/logo.gif | Bin 0 -> 1066 bytes modules/livezilla/lz_download.gif | Bin 0 -> 1500 bytes modules/livezilla/lz_package.gif | Bin 0 -> 9189 bytes modules/livezilla/offline.png | Bin 0 -> 6608 bytes modules/loyalty/LoyaltyModule.php | 250 + modules/loyalty/LoyaltyStateModule.php | 93 + modules/loyalty/config.xml | 13 + modules/loyalty/de.php | 102 + modules/loyalty/en.php | 4 + modules/loyalty/es.php | 100 + modules/loyalty/fr.php | 100 + modules/loyalty/it.php | 102 + modules/loyalty/logo.gif | Bin 0 -> 1016 bytes modules/loyalty/loyalty-program.php | 166 + modules/loyalty/loyalty.gif | Bin 0 -> 1016 bytes modules/loyalty/loyalty.php | 674 + modules/loyalty/loyalty.tpl | 205 + modules/loyalty/my-account.tpl | 29 + modules/loyalty/product.tpl | 43 + modules/loyalty/shopping-cart.tpl | 31 + modules/mailalerts/config.xml | 13 + modules/mailalerts/de.php | 43 + modules/mailalerts/en.php | 4 + modules/mailalerts/es.php | 41 + modules/mailalerts/fr.php | 41 + modules/mailalerts/img/delete.gif | Bin 0 -> 358 bytes modules/mailalerts/it.php | 43 + modules/mailalerts/logo.gif | Bin 0 -> 792 bytes modules/mailalerts/mailalerts-ajax_add.php | 67 + modules/mailalerts/mailalerts-ajax_check.php | 44 + modules/mailalerts/mailalerts.php | 571 + modules/mailalerts/mails/de/customer_qty.html | 34 + modules/mailalerts/mails/de/customer_qty.txt | 10 + modules/mailalerts/mails/de/new_order.html | 116 + modules/mailalerts/mails/de/new_order.txt | 40 + .../mails/de/productoutofstock.html | 34 + .../mailalerts/mails/de/productoutofstock.txt | 12 + modules/mailalerts/mails/en/customer_qty.html | 34 + modules/mailalerts/mails/en/customer_qty.txt | 12 + modules/mailalerts/mails/en/new_order.html | 125 + modules/mailalerts/mails/en/new_order.txt | 41 + .../mails/en/productoutofstock.html | 34 + .../mailalerts/mails/en/productoutofstock.txt | 11 + modules/mailalerts/mails/es/customer_qty.html | 35 + modules/mailalerts/mails/es/customer_qty.txt | 12 + modules/mailalerts/mails/es/new_order.html | 118 + modules/mailalerts/mails/es/new_order.txt | 41 + .../mails/es/productoutofstock.html | 35 + .../mailalerts/mails/es/productoutofstock.txt | 10 + modules/mailalerts/mails/fr/customer_qty.html | 34 + modules/mailalerts/mails/fr/customer_qty.txt | 10 + modules/mailalerts/mails/fr/new_order.html | 125 + modules/mailalerts/mails/fr/new_order.txt | 39 + .../mails/fr/productoutofstock.html | 34 + .../mailalerts/mails/fr/productoutofstock.txt | 9 + modules/mailalerts/mails/it/customer_qty.html | 34 + modules/mailalerts/mails/it/customer_qty.txt | 12 + modules/mailalerts/mails/it/new_order.html | 116 + modules/mailalerts/mails/it/new_order.txt | 41 + .../mails/it/productoutofstock.html | 34 + .../mailalerts/mails/it/productoutofstock.txt | 11 + modules/mailalerts/my-account.tpl | 32 + modules/mailalerts/myalerts.php | 65 + modules/mailalerts/myalerts.tpl | 79 + modules/mailalerts/product.tpl | 93 + modules/mondialrelay/AdminMondialRelay.gif | Bin 0 -> 800 bytes modules/mondialrelay/AdminMondialRelay.php | 219 + modules/mondialrelay/ajax.php | 105 + .../classes/IMondialRelayWSMethod.php | 60 + .../mondialrelay/classes/MRCreateTickets.php | 527 + modules/mondialrelay/classes/MRGetTickets.php | 265 + modules/mondialrelay/classes/MRManagement.php | 105 + .../classes/MondialRelayClass.php | 83 + modules/mondialrelay/config.xml | 12 + modules/mondialrelay/cron.php | 76 + modules/mondialrelay/de.php | 124 + modules/mondialrelay/en.php | 9 + modules/mondialrelay/errorCode.php | 79 + modules/mondialrelay/es.php | 144 + modules/mondialrelay/fr.php | 144 + modules/mondialrelay/googlemap.php | 120 + modules/mondialrelay/images/getTickets.gif | Bin 0 -> 1849 bytes modules/mondialrelay/images/loader.gif | Bin 0 -> 847 bytes modules/mondialrelay/images/logo.gif | Bin 0 -> 1035 bytes modules/mondialrelay/images/pdf_icon.jpg | Bin 0 -> 9713 bytes modules/mondialrelay/it.php | 90 + modules/mondialrelay/jquery-1.4.4.min.js | 167 + modules/mondialrelay/kit_mondialrelay/MR.gif | Bin 0 -> 1756 bytes .../kit_mondialrelay/MR_small.gif | Bin 0 -> 797 bytes .../RechercheDetailPointRelais_ajax.php | 151 + .../RecherchePointRelais_ajax.php | 101 + .../kit_mondialrelay/SuiviExpedition_ajax.php | 6 + .../mondialrelay/kit_mondialrelay/close.gif | Bin 0 -> 246 bytes .../kit_mondialrelay/js/include_MR.js | 56 + .../kit_mondialrelay/js/ressources_MR.js | 344 + .../mondialrelay/kit_mondialrelay/loading.gif | Bin 0 -> 6494 bytes .../mondialrelay/kit_mondialrelay/loupe.gif | Bin 0 -> 1756 bytes .../mondialrelay/kit_mondialrelay/marker.gif | Bin 0 -> 1196 bytes .../kit_mondialrelay/mr_opc_ajax.php | 27 + .../tools/nusoap/lib/class.nusoap_base.php | 995 + .../tools/nusoap/lib/class.soap_fault.php | 89 + .../tools/nusoap/lib/class.soap_parser.php | 642 + .../tools/nusoap/lib/class.soap_server.php | 1126 ++ .../nusoap/lib/class.soap_transport_http.php | 1306 ++ .../tools/nusoap/lib/class.soap_val.php | 106 + .../tools/nusoap/lib/class.soapclient.php | 991 + .../tools/nusoap/lib/class.wsdl.php | 1937 ++ .../tools/nusoap/lib/class.wsdlcache.php | 209 + .../tools/nusoap/lib/class.xmlschema.php | 972 + .../tools/nusoap/lib/nusoap.php | 8148 ++++++++ .../tools/nusoap/lib/nusoapmime.php | 501 + .../lib/nusoap/class.nusoap_base.php | 995 + .../lib/nusoap/class.soap_fault.php | 89 + .../lib/nusoap/class.soap_parser.php | 642 + .../lib/nusoap/class.soap_server.php | 1126 ++ .../lib/nusoap/class.soap_transport_http.php | 1306 ++ .../lib/nusoap/class.soap_val.php | 106 + .../lib/nusoap/class.soapclient.php | 991 + .../mondialrelay/lib/nusoap/class.wsdl.php | 1937 ++ .../lib/nusoap/class.wsdlcache.php | 209 + .../lib/nusoap/class.xmlschema.php | 972 + modules/mondialrelay/lib/nusoap/nusoap.php | 8148 ++++++++ .../mondialrelay/lib/nusoap/nusoapmime.php | 501 + modules/mondialrelay/logo.gif | Bin 0 -> 1035 bytes modules/mondialrelay/mondialrelay.js | 273 + modules/mondialrelay/mondialrelay.php | 1189 ++ modules/mondialrelay/mondialrelay.tpl | 95 + modules/mondialrelay/mrInstall.sql | 43 + modules/mondialrelay/orderDetail.tpl | 29 + modules/mondialrelay/page_iso.php | 42 + modules/mondialrelay/sitemap.xml | 0 modules/mondialrelay/style.css | 176 + modules/moneybookers/config.xml | 13 + modules/moneybookers/confirmation.tpl | 44 + modules/moneybookers/de.php | 73 + modules/moneybookers/es.php | 74 + modules/moneybookers/fr.php | 74 + modules/moneybookers/it.php | 59 + modules/moneybookers/logo-cc-1.gif | Bin 0 -> 3877 bytes modules/moneybookers/logo-cc-2.gif | Bin 0 -> 3969 bytes modules/moneybookers/logo-mb-1.gif | Bin 0 -> 3987 bytes modules/moneybookers/logo-mb-2.gif | Bin 0 -> 4470 bytes modules/moneybookers/logo-mb-3.gif | Bin 0 -> 5117 bytes modules/moneybookers/logo-mb-4.gif | Bin 0 -> 3874 bytes modules/moneybookers/logo-mb-5.gif | Bin 0 -> 5021 bytes modules/moneybookers/logo-mb-6.gif | Bin 0 -> 4391 bytes modules/moneybookers/logo-mb-7.gif | Bin 0 -> 4428 bytes modules/moneybookers/logo-mb.gif | Bin 0 -> 12201 bytes modules/moneybookers/logo.gif | Bin 0 -> 585 bytes .../moneybookers/logos/international/amex.gif | Bin 0 -> 2462 bytes .../logos/international/diners.gif | Bin 0 -> 2297 bytes .../logos/international/ewallet.gif | Bin 0 -> 2429 bytes .../moneybookers/logos/international/jcb.gif | Bin 0 -> 2084 bytes .../logos/international/maestro.gif | Bin 0 -> 2021 bytes .../logos/international/mastercard.gif | Bin 0 -> 2074 bytes .../moneybookers/logos/international/visa.gif | Bin 0 -> 1544 bytes .../logos/international/visadebit.gif | Bin 0 -> 1484 bytes modules/moneybookers/logos/local/4b.gif | Bin 0 -> 1940 bytes modules/moneybookers/logos/local/cartasi.gif | Bin 0 -> 2406 bytes .../moneybookers/logos/local/cartebleue.gif | Bin 0 -> 2082 bytes modules/moneybookers/logos/local/dankort.gif | Bin 0 -> 1987 bytes modules/moneybookers/logos/local/ec.gif | Bin 0 -> 1347 bytes modules/moneybookers/logos/local/enets.gif | Bin 0 -> 2145 bytes modules/moneybookers/logos/local/epay.gif | Bin 0 -> 1182 bytes modules/moneybookers/logos/local/eps.gif | Bin 0 -> 2010 bytes modules/moneybookers/logos/local/euro6000.gif | Bin 0 -> 2255 bytes modules/moneybookers/logos/local/giropay.gif | Bin 0 -> 1504 bytes modules/moneybookers/logos/local/ideal.gif | Bin 0 -> 2031 bytes .../logos/local/instantbanktransfer.gif | Bin 0 -> 3521 bytes modules/moneybookers/logos/local/laser.gif | Bin 0 -> 1458 bytes modules/moneybookers/logos/local/nordea.gif | Bin 0 -> 1548 bytes modules/moneybookers/logos/local/p24.gif | Bin 0 -> 2249 bytes modules/moneybookers/logos/local/pekao.gif | Bin 0 -> 841 bytes modules/moneybookers/logos/local/poli.gif | Bin 0 -> 1991 bytes modules/moneybookers/logos/local/postepay.gif | Bin 0 -> 3086 bytes modules/moneybookers/logos/local/sofort.gif | Bin 0 -> 2447 bytes modules/moneybookers/logos/local/solo.gif | Bin 0 -> 1495 bytes modules/moneybookers/logos/local/unionpay.gif | Bin 0 -> 2088 bytes .../moneybookers/logos/local/visaelectron.gif | Bin 0 -> 1530 bytes .../moneybookers-currency-error.tpl | 29 + modules/moneybookers/moneybookers.php | 542 + modules/moneybookers/moneybookers.tpl | 160 + modules/moneybookers/prestashop_mb_en.gif | Bin 0 -> 12740 bytes modules/moneybookers/prestashop_mb_fr.gif | Bin 0 -> 31807 bytes modules/moneybookers/validation.php | 85 + modules/newsletter/config.xml | 12 + modules/newsletter/de.php | 32 + modules/newsletter/en.php | 4 + modules/newsletter/es.php | 32 + modules/newsletter/fr.php | 32 + modules/newsletter/it.php | 32 + modules/newsletter/logo.gif | Bin 0 -> 983 bytes modules/newsletter/newsletter.php | 234 + modules/ogone/checkwaitingorder.php | 35 + modules/ogone/config.xml | 12 + modules/ogone/confirmation.php | 48 + modules/ogone/de.php | 45 + modules/ogone/docs/en1.png | Bin 0 -> 29227 bytes modules/ogone/docs/en2.png | Bin 0 -> 16667 bytes modules/ogone/docs/en3.png | Bin 0 -> 11914 bytes modules/ogone/docs/en4.png | Bin 0 -> 73459 bytes modules/ogone/es.php | 43 + modules/ogone/fr.php | 43 + modules/ogone/hookorderconfirmation.tpl | 37 + modules/ogone/it.php | 45 + modules/ogone/logo.gif | Bin 0 -> 1079 bytes modules/ogone/ogone.gif | Bin 0 -> 1843 bytes modules/ogone/ogone.php | 220 + modules/ogone/ogone.tpl | 43 + modules/ogone/validation.php | 109 + modules/ogone/waiting.tpl | 44 + modules/pagesnotfound/comment.gif | Bin 0 -> 413 bytes modules/pagesnotfound/config.xml | 12 + modules/pagesnotfound/de.php | 23 + modules/pagesnotfound/en.php | 4 + modules/pagesnotfound/es.php | 21 + modules/pagesnotfound/fr.php | 21 + modules/pagesnotfound/it.php | 23 + modules/pagesnotfound/logo.gif | Bin 0 -> 898 bytes modules/pagesnotfound/pagesnotfound.php | 168 + modules/paypal/about.php | 37 + modules/paypal/about.tpl | 42 + modules/paypal/api/paypalconnect.php | 93 + modules/paypal/api/paypallib.php | 63 + modules/paypal/column.tpl | 29 + modules/paypal/config.xml | 13 + modules/paypal/confirm.tpl | 66 + modules/paypal/confirmation.tpl | 32 + modules/paypal/de.php | 227 + modules/paypal/error.tpl | 41 + modules/paypal/es.php | 227 + modules/paypal/express/authentication.tpl | 200 + modules/paypal/express/login.tpl | 52 + modules/paypal/express/paypalexpress.php | 105 + modules/paypal/express/shopping_cart.tpl | 27 + modules/paypal/express/submit.php | 390 + modules/paypal/fr.php | 227 + modules/paypal/img/AU_pp_express.gif | Bin 0 -> 3091 bytes modules/paypal/img/AU_pp_integral.gif | Bin 0 -> 5490 bytes modules/paypal/img/CA_pp_express.gif | Bin 0 -> 3091 bytes modules/paypal/img/CA_pp_integral.gif | Bin 0 -> 5253 bytes modules/paypal/img/CN_pp_express.gif | Bin 0 -> 3091 bytes modules/paypal/img/CN_pp_integral.gif | Bin 0 -> 6495 bytes modules/paypal/img/DE_pp_express.gif | Bin 0 -> 2376 bytes modules/paypal/img/DE_pp_integral.gif | Bin 0 -> 4632 bytes modules/paypal/img/ES_pp_express.gif | Bin 0 -> 3047 bytes modules/paypal/img/ES_pp_integral.gif | Bin 0 -> 5311 bytes modules/paypal/img/FR_pp_express.gif | Bin 0 -> 2866 bytes modules/paypal/img/FR_pp_integral.gif | Bin 0 -> 7046 bytes modules/paypal/img/IT_pp_express.gif | Bin 0 -> 3025 bytes modules/paypal/img/IT_pp_integral.gif | Bin 0 -> 7069 bytes modules/paypal/img/JP_pp_express.gif | Bin 0 -> 3091 bytes modules/paypal/img/JP_pp_integral.gif | Bin 0 -> 4563 bytes modules/paypal/img/NL_pp_express.gif | Bin 0 -> 3090 bytes modules/paypal/img/NL_pp_integral.gif | Bin 0 -> 3452 bytes modules/paypal/img/PL_pp_express.gif | Bin 0 -> 3244 bytes modules/paypal/img/PL_pp_integral.gif | Bin 0 -> 3466 bytes modules/paypal/img/PayPal_mark_60x38.gif | Bin 0 -> 956 bytes modules/paypal/img/UK_pp_express.gif | Bin 0 -> 3091 bytes modules/paypal/img/UK_pp_integral.gif | Bin 0 -> 7191 bytes modules/paypal/img/US_pp_express.gif | Bin 0 -> 3091 bytes modules/paypal/img/US_pp_integral.gif | Bin 0 -> 6181 bytes modules/paypal/img/integral_evolution.png | Bin 0 -> 18370 bytes .../img/integral_evolution_vertical.png | Bin 0 -> 24107 bytes modules/paypal/img/vertical_FR_large.png | Bin 0 -> 10725 bytes modules/paypal/img/vertical_US_large.png | Bin 0 -> 11877 bytes modules/paypal/integral_evolution/paypal.tpl | 31 + .../paypal/integral_evolution/redirect.php | 111 + .../paypal/integral_evolution/redirect.tpl | 93 + modules/paypal/ipn.php | 80 + modules/paypal/it.php | 227 + modules/paypal/logo.gif | Bin 0 -> 2066 bytes modules/paypal/mails/de/error_reporting.html | 46 + modules/paypal/mails/de/error_reporting.txt | 9 + modules/paypal/mails/en/error_reporting.html | 42 + modules/paypal/mails/en/error_reporting.txt | 9 + modules/paypal/mails/es/error_reporting.html | 47 + modules/paypal/mails/es/error_reporting.txt | 9 + modules/paypal/mails/fr/error_reporting.html | 42 + modules/paypal/mails/fr/error_reporting.txt | 9 + modules/paypal/mails/it/error_reporting.html | 46 + modules/paypal/mails/it/error_reporting.txt | 9 + modules/paypal/payment/payment.tpl | 38 + modules/paypal/payment/paypalpayment.php | 119 + modules/paypal/payment/submit.php | 168 + modules/paypal/paypal.gif | Bin 0 -> 1525 bytes modules/paypal/paypal.php | 1269 ++ modules/paypal/prestashop_paypal.png | Bin 0 -> 5388 bytes modules/paypal/standard/paypal.tpl | 32 + modules/paypal/standard/redirect.php | 89 + modules/paypal/standard/redirect.tpl | 90 + modules/paypal/validation.php | 151 + modules/paysafecard/Disposition.php | 82 + modules/paysafecard/PrepaidServices.php | 663 + modules/paysafecard/PrepaidServicesAPI.php | 190 + modules/paysafecard/config.xml | 12 + modules/paysafecard/de.php | 53 + modules/paysafecard/disposition-error.tpl | 37 + modules/paysafecard/es.php | 51 + modules/paysafecard/fr.php | 51 + modules/paysafecard/img/payment-logo.png | Bin 0 -> 8718 bytes modules/paysafecard/img/payment-small.png | Bin 0 -> 333 bytes modules/paysafecard/img/payment.png | Bin 0 -> 5381 bytes modules/paysafecard/it.php | 53 + modules/paysafecard/keyring/.htaccess | 1 + .../paysafecard/keyring/paysafecard-CA.pem | 227 + modules/paysafecard/logo.gif | Bin 0 -> 940 bytes modules/paysafecard/payment.php | 102 + modules/paysafecard/payment.tpl | 32 + .../paysafecard-accept-payment.tpl | 43 + .../paysafecard/paysafecard-confirmation.tpl | 32 + modules/paysafecard/paysafecard.php | 120 + modules/paysafecard/prepaidservices.js | 38 + modules/paysafecard/redirect.php | 50 + modules/prestafraud/config.xml | 12 + modules/prestafraud/de.php | 65 + modules/prestafraud/es.php | 63 + modules/prestafraud/fr.php | 63 + modules/prestafraud/install.sql | 29 + modules/prestafraud/it.php | 64 + modules/prestafraud/logo.gif | Bin 0 -> 702 bytes modules/prestafraud/prestafraud.php | 595 + modules/productcomments/ProductComment.php | 260 + .../ProductCommentCriterion.php | 214 + modules/productcomments/ProductCriterion.php | 175 + modules/productcomments/config.xml | 12 + modules/productcomments/de.php | 75 + modules/productcomments/en.php | 4 + modules/productcomments/es.php | 73 + modules/productcomments/fr.php | 73 + modules/productcomments/img/accept.png | Bin 0 -> 781 bytes modules/productcomments/img/comment.png | Bin 0 -> 413 bytes .../productcomments/img/comments_delete.png | Bin 0 -> 670 bytes modules/productcomments/img/delete.gif | Bin 0 -> 752 bytes modules/productcomments/img/delete.png | Bin 0 -> 715 bytes modules/productcomments/img/note.png | Bin 0 -> 500 bytes modules/productcomments/img/note_go.png | Bin 0 -> 661 bytes modules/productcomments/img/star.gif | Bin 0 -> 815 bytes modules/productcomments/install.sql | 53 + modules/productcomments/it.php | 75 + .../productcomments/js/jquery.rating.pack.js | 12 + modules/productcomments/js/moderate.js | 77 + .../productcomments/js/productCriterion.js | 41 + .../productcomments/js/products-comparison.js | 46 + modules/productcomments/logo.gif | Bin 0 -> 557 bytes modules/productcomments/productcomments.php | 638 + modules/productcomments/productcomments.tpl | 137 + .../productcommentscriterion.php | 52 + .../productcomments/products-comparison.tpl | 116 + modules/productcomments/tab.tpl | 27 + modules/productscategory/config.xml | 12 + modules/productscategory/de.php | 19 + modules/productscategory/en.php | 4 + modules/productscategory/es.php | 17 + modules/productscategory/fr.php | 17 + modules/productscategory/img/thumbs_left.gif | Bin 0 -> 201 bytes modules/productscategory/img/thumbs_right.gif | Bin 0 -> 197 bytes modules/productscategory/it.php | 19 + modules/productscategory/logo.gif | Bin 0 -> 1071 bytes modules/productscategory/productscategory.css | 51 + modules/productscategory/productscategory.js | 55 + modules/productscategory/productscategory.php | 182 + modules/productscategory/productscategory.tpl | 56 + modules/producttooltip/config.xml | 12 + modules/producttooltip/de.php | 26 + modules/producttooltip/es.php | 24 + modules/producttooltip/fr.php | 24 + modules/producttooltip/it.php | 25 + modules/producttooltip/logo.gif | Bin 0 -> 359 bytes modules/producttooltip/producttooltip.php | 191 + modules/producttooltip/producttooltip.tpl | 36 + modules/producttooltip/sample.gif | Bin 0 -> 30852 bytes .../referralprogram/ReferralProgramModule.php | 200 + modules/referralprogram/authentication.tpl | 35 + modules/referralprogram/config.xml | 13 + modules/referralprogram/de.php | 112 + modules/referralprogram/en.php | 4 + modules/referralprogram/es.php | 111 + modules/referralprogram/fr.php | 111 + modules/referralprogram/it.php | 112 + modules/referralprogram/logo.gif | Bin 0 -> 1051 bytes .../de/referralprogram-congratulations.html | 46 + .../de/referralprogram-congratulations.txt | 8 + .../mails/de/referralprogram-invitation.html | 58 + .../mails/de/referralprogram-invitation.txt | 12 + .../mails/de/referralprogram-voucher.html | 46 + .../mails/de/referralprogram-voucher.txt | 12 + .../en/referralprogram-congratulations.html | 40 + .../en/referralprogram-congratulations.txt | 9 + .../mails/en/referralprogram-invitation.html | 52 + .../mails/en/referralprogram-invitation.txt | 15 + .../mails/en/referralprogram-voucher.html | 42 + .../mails/en/referralprogram-voucher.txt | 12 + .../es/referralprogram-congratulations.html | 47 + .../es/referralprogram-congratulations.txt | 9 + .../mails/es/referralprogram-invitation.html | 59 + .../mails/es/referralprogram-invitation.txt | 15 + .../mails/es/referralprogram-voucher.html | 47 + .../mails/es/referralprogram-voucher.txt | 10 + .../fr/referralprogram-congratulations.html | 40 + .../fr/referralprogram-congratulations.txt | 9 + .../mails/fr/referralprogram-invitation.html | 52 + .../mails/fr/referralprogram-invitation.txt | 15 + .../mails/fr/referralprogram-voucher.html | 43 + .../mails/fr/referralprogram-voucher.txt | 10 + .../it/referralprogram-congratulations.html | 46 + .../it/referralprogram-congratulations.txt | 9 + .../mails/it/referralprogram-invitation.html | 58 + .../mails/it/referralprogram-invitation.txt | 15 + .../mails/it/referralprogram-voucher.html | 46 + .../mails/it/referralprogram-voucher.txt | 12 + modules/referralprogram/my-account.tpl | 29 + .../referralprogram/order-confirmation.tpl | 30 + modules/referralprogram/preview-email.php | 56 + .../referralprogram-program.php | 192 + .../referralprogram-program.tpl | 223 + .../referralprogram/referralprogram-rules.php | 51 + .../referralprogram/referralprogram-rules.tpl | 33 + modules/referralprogram/referralprogram.gif | Bin 0 -> 1051 bytes modules/referralprogram/referralprogram.php | 604 + modules/referralprogram/referralprogram.xml | 13 + modules/referralprogram/shopping-cart.tpl | 35 + modules/reverso/config.xml | 12 + modules/reverso/de.php | 18 + modules/reverso/es.php | 16 + modules/reverso/fr.php | 16 + modules/reverso/it.php | 18 + modules/reverso/js/index.php | 26 + modules/reverso/js/reverso.js | 63 + modules/reverso/logo.gif | Bin 0 -> 1021 bytes modules/reverso/reverso.php | 169 + modules/reverso/reverso.tpl | 39 + modules/reverso/reverso_check.php | 41 + modules/secuvad/classes/PaymentCC.php | 64 + .../secuvad/classes/Secuvad_connection.php | 180 + modules/secuvad/classes/Secuvad_flux.php | 237 + modules/secuvad/config.xml | 13 + modules/secuvad/de.php | 116 + modules/secuvad/en.php | 101 + modules/secuvad/es.php | 114 + modules/secuvad/fr.php | 114 + modules/secuvad/install.sql | 93 + modules/secuvad/it.php | 116 + modules/secuvad/logo.gif | Bin 0 -> 631 bytes modules/secuvad/secuvad.php | 1324 ++ modules/secuvad/secuvad_config.php | 43 + modules/secuvad/secuvad_response.php | 95 + modules/sekeywords/config.xml | 12 + modules/sekeywords/de.php | 26 + modules/sekeywords/en.php | 4 + modules/sekeywords/es.php | 24 + modules/sekeywords/fr.php | 24 + modules/sekeywords/it.php | 26 + modules/sekeywords/logo.gif | Bin 0 -> 1013 bytes modules/sekeywords/sekeywords.php | 200 + modules/sendtoafriend/config.xml | 12 + modules/sendtoafriend/de.php | 23 + modules/sendtoafriend/en.php | 4 + modules/sendtoafriend/es.php | 21 + modules/sendtoafriend/fr.php | 21 + modules/sendtoafriend/it.php | 23 + modules/sendtoafriend/logo.gif | Bin 0 -> 633 bytes .../mails/de/send_to_a_friend.html | 40 + .../mails/de/send_to_a_friend.txt | 13 + .../mails/en/send_to_a_friend.html | 36 + .../mails/en/send_to_a_friend.txt | 13 + .../mails/es/send_to_a_friend.html | 41 + .../mails/es/send_to_a_friend.txt | 13 + .../mails/fr/send_to_a_friend.html | 36 + .../mails/fr/send_to_a_friend.txt | 13 + .../mails/it/send_to_a_friend.html | 40 + .../mails/it/send_to_a_friend.txt | 13 + modules/sendtoafriend/product_page.tpl | 27 + modules/sendtoafriend/sendtoafriend-form.php | 38 + modules/sendtoafriend/sendtoafriend.php | 130 + modules/sendtoafriend/sendtoafriend.png | Bin 0 -> 754 bytes modules/sendtoafriend/sendtoafriend.tpl | 66 + modules/shopimporter/ajax.php | 130 + modules/shopimporter/config.xml | 12 + modules/shopimporter/de.php | 93 + modules/shopimporter/es.php | 92 + modules/shopimporter/fr.php | 92 + modules/shopimporter/img/ajax-loader.gif | Bin 0 -> 1849 bytes modules/shopimporter/img/delete.gif | Bin 0 -> 992 bytes modules/shopimporter/img/error.png | Bin 0 -> 1061 bytes modules/shopimporter/img/file.png | Bin 0 -> 330 bytes modules/shopimporter/img/force.gif | Bin 0 -> 971 bytes modules/shopimporter/img/ok.png | Bin 0 -> 1162 bytes modules/shopimporter/img/skip.png | Bin 0 -> 1508 bytes modules/shopimporter/img/stop.png | Bin 0 -> 1496 bytes modules/shopimporter/img/warn.png | Bin 0 -> 1061 bytes modules/shopimporter/it.php | 92 + modules/shopimporter/logo.gif | Bin 0 -> 379 bytes modules/shopimporter/shopimporter.js | 543 + modules/shopimporter/shopimporter.php | 1266 ++ modules/socolissimo/ajax.php | 19 + modules/socolissimo/config.xml | 12 + modules/socolissimo/de.php | 89 + modules/socolissimo/es.php | 88 + modules/socolissimo/fr.php | 88 + modules/socolissimo/it.php | 89 + modules/socolissimo/logo.gif | Bin 0 -> 1625 bytes modules/socolissimo/redirect.php | 44 + modules/socolissimo/socolissimo.jpg | Bin 0 -> 8040 bytes modules/socolissimo/socolissimo.php | 774 + modules/socolissimo/socolissimo_carrier.tpl | 128 + modules/socolissimo/socolissimo_error.tpl | 37 + modules/socolissimo/validation.php | 204 + modules/statsbestcategories/config.xml | 12 + modules/statsbestcategories/de.php | 16 + modules/statsbestcategories/en.php | 4 + modules/statsbestcategories/es.php | 14 + modules/statsbestcategories/fr.php | 14 + modules/statsbestcategories/it.php | 16 + modules/statsbestcategories/logo.gif | Bin 0 -> 641 bytes .../statsbestcategories.php | 205 + modules/statsbestcustomers/config.xml | 12 + modules/statsbestcustomers/de.php | 25 + modules/statsbestcustomers/en.php | 4 + modules/statsbestcustomers/es.php | 23 + modules/statsbestcustomers/fr.php | 23 + modules/statsbestcustomers/it.php | 25 + modules/statsbestcustomers/logo.gif | Bin 0 -> 992 bytes .../statsbestcustomers/statsbestcustomers.php | 162 + modules/statsbestmanufacturers/config.xml | 12 + modules/statsbestmanufacturers/de.php | 15 + modules/statsbestmanufacturers/en.php | 4 + modules/statsbestmanufacturers/es.php | 13 + modules/statsbestmanufacturers/fr.php | 13 + modules/statsbestmanufacturers/it.php | 15 + modules/statsbestmanufacturers/logo.gif | Bin 0 -> 641 bytes .../statsbestmanufacturers.php | 152 + modules/statsbestproducts/config.xml | 12 + modules/statsbestproducts/de.php | 20 + modules/statsbestproducts/en.php | 4 + modules/statsbestproducts/es.php | 18 + modules/statsbestproducts/fr.php | 18 + modules/statsbestproducts/it.php | 20 + modules/statsbestproducts/logo.gif | Bin 0 -> 641 bytes .../statsbestproducts/statsbestproducts.php | 199 + modules/statsbestsuppliers/config.xml | 12 + modules/statsbestsuppliers/de.php | 15 + modules/statsbestsuppliers/en.php | 4 + modules/statsbestsuppliers/es.php | 13 + modules/statsbestsuppliers/fr.php | 13 + modules/statsbestsuppliers/it.php | 15 + modules/statsbestsuppliers/logo.gif | Bin 0 -> 641 bytes .../statsbestsuppliers/statsbestsuppliers.php | 153 + modules/statsbestvouchers/config.xml | 12 + modules/statsbestvouchers/de.php | 15 + modules/statsbestvouchers/en.php | 4 + modules/statsbestvouchers/es.php | 13 + modules/statsbestvouchers/fr.php | 13 + modules/statsbestvouchers/it.php | 15 + modules/statsbestvouchers/logo.gif | Bin 0 -> 641 bytes .../statsbestvouchers/statsbestvouchers.php | 132 + modules/statscarrier/config.xml | 12 + modules/statscarrier/de.php | 14 + modules/statscarrier/en.php | 4 + modules/statscarrier/es.php | 12 + modules/statscarrier/fr.php | 12 + modules/statscarrier/it.php | 14 + modules/statscarrier/logo.gif | Bin 0 -> 583 bytes modules/statscarrier/statscarrier.php | 115 + modules/statscatalog/application_home.png | Bin 0 -> 685 bytes modules/statscatalog/basket_delete.png | Bin 0 -> 773 bytes modules/statscatalog/config.xml | 12 + modules/statscatalog/de.php | 28 + modules/statscatalog/en.php | 4 + modules/statscatalog/es.php | 26 + modules/statscatalog/fr.php | 26 + modules/statscatalog/it.php | 28 + modules/statscatalog/logo.gif | Bin 0 -> 932 bytes modules/statscatalog/page_edit.png | Bin 0 -> 807 bytes modules/statscatalog/statscatalog.php | 244 + modules/statscheckup/config.xml | 12 + modules/statscheckup/de.php | 32 + modules/statscheckup/es.php | 30 + modules/statscheckup/fr.php | 31 + modules/statscheckup/green.png | Bin 0 -> 776 bytes modules/statscheckup/it.php | 32 + modules/statscheckup/logo.gif | Bin 0 -> 1025 bytes modules/statscheckup/orange.png | Bin 0 -> 770 bytes modules/statscheckup/red.png | Bin 0 -> 767 bytes modules/statscheckup/statscheckup.php | 299 + modules/statsdata/config.xml | 12 + modules/statsdata/de.php | 19 + modules/statsdata/en.php | 4 + modules/statsdata/es.php | 17 + modules/statsdata/fr.php | 17 + modules/statsdata/it.php | 19 + modules/statsdata/logo.gif | Bin 0 -> 1044 bytes modules/statsdata/statsdata.php | 201 + modules/statsequipment/config.xml | 12 + modules/statsequipment/de.php | 17 + modules/statsequipment/en.php | 4 + modules/statsequipment/es.php | 15 + modules/statsequipment/fr.php | 15 + modules/statsequipment/it.php | 17 + modules/statsequipment/logo.gif | Bin 0 -> 1030 bytes modules/statsequipment/statsequipment.php | 183 + modules/statsforecast/config.xml | 12 + modules/statsforecast/de.php | 59 + modules/statsforecast/es.php | 57 + modules/statsforecast/fr.php | 57 + modules/statsforecast/funnel.png | Bin 0 -> 732 bytes modules/statsforecast/it.php | 59 + modules/statsforecast/logo.gif | Bin 0 -> 1028 bytes modules/statsforecast/next.png | Bin 0 -> 395 bytes modules/statsforecast/statsforecast.php | 646 + modules/statsgeolocation/config.php | 110 + modules/statsgeolocation/config.xml | 12 + modules/statsgeolocation/de.php | 20 + modules/statsgeolocation/drawer.php | 90 + modules/statsgeolocation/en.php | 4 + modules/statsgeolocation/es.php | 18 + modules/statsgeolocation/fr.php | 18 + modules/statsgeolocation/img/cross.png | Bin 0 -> 1212 bytes modules/statsgeolocation/img/map.png | Bin 0 -> 66827 bytes modules/statsgeolocation/it.php | 20 + modules/statsgeolocation/logo.gif | Bin 0 -> 1042 bytes modules/statsgeolocation/statsgeolocation.js | 236 + modules/statsgeolocation/statsgeolocation.php | 193 + modules/statslive/config.xml | 12 + modules/statslive/de.php | 24 + modules/statslive/en.php | 4 + modules/statslive/es.php | 22 + modules/statslive/fr.php | 22 + modules/statslive/it.php | 24 + modules/statslive/logo.gif | Bin 0 -> 1009 bytes modules/statslive/statslive.php | 173 + modules/statsnewsletter/config.xml | 12 + modules/statsnewsletter/de.php | 17 + modules/statsnewsletter/en.php | 4 + modules/statsnewsletter/es.php | 15 + modules/statsnewsletter/fr.php | 15 + modules/statsnewsletter/it.php | 17 + modules/statsnewsletter/logo.gif | Bin 0 -> 983 bytes modules/statsnewsletter/statsnewsletter.php | 170 + modules/statsorigin/config.xml | 12 + modules/statsorigin/de.php | 23 + modules/statsorigin/en.php | 4 + modules/statsorigin/es.php | 21 + modules/statsorigin/fr.php | 21 + modules/statsorigin/it.php | 23 + modules/statsorigin/logo.gif | Bin 0 -> 967 bytes modules/statsorigin/statsorigin.php | 150 + modules/statspersonalinfos/config.xml | 12 + modules/statspersonalinfos/de.php | 38 + modules/statspersonalinfos/en.php | 4 + modules/statspersonalinfos/es.php | 36 + modules/statspersonalinfos/fr.php | 36 + modules/statspersonalinfos/it.php | 38 + modules/statspersonalinfos/logo.gif | Bin 0 -> 1031 bytes .../statspersonalinfos/statspersonalinfos.php | 294 + modules/statsproduct/config.xml | 12 + modules/statsproduct/de.php | 41 + modules/statsproduct/en.php | 4 + modules/statsproduct/es.php | 39 + modules/statsproduct/fr.php | 39 + modules/statsproduct/it.php | 41 + modules/statsproduct/logo.gif | Bin 0 -> 1018 bytes modules/statsproduct/statsproduct.php | 437 + modules/statsregistrations/config.xml | 12 + modules/statsregistrations/de.php | 22 + modules/statsregistrations/en.php | 4 + modules/statsregistrations/es.php | 20 + modules/statsregistrations/fr.php | 20 + modules/statsregistrations/it.php | 22 + modules/statsregistrations/logo.gif | Bin 0 -> 992 bytes .../statsregistrations/statsregistrations.php | 185 + modules/statssales/config.xml | 12 + modules/statssales/de.php | 26 + modules/statssales/en.php | 4 + modules/statssales/es.php | 24 + modules/statssales/fr.php | 24 + modules/statssales/it.php | 26 + modules/statssales/logo.gif | Bin 0 -> 936 bytes modules/statssales/statssales.php | 257 + modules/statssearch/config.xml | 12 + modules/statssearch/de.php | 15 + modules/statssearch/en.php | 4 + modules/statssearch/es.php | 13 + modules/statssearch/fr.php | 13 + modules/statssearch/it.php | 15 + modules/statssearch/logo.gif | Bin 0 -> 1013 bytes modules/statssearch/statssearch.php | 156 + modules/statsstock/config.xml | 12 + modules/statsstock/de.php | 21 + modules/statsstock/es.php | 19 + modules/statsstock/fr.php | 19 + modules/statsstock/it.php | 21 + modules/statsstock/logo.gif | Bin 0 -> 1035 bytes modules/statsstock/statsstock.php | 152 + modules/statsvisits/config.xml | 12 + modules/statsvisits/de.php | 22 + modules/statsvisits/en.php | 4 + modules/statsvisits/es.php | 20 + modules/statsvisits/fr.php | 20 + modules/statsvisits/it.php | 22 + modules/statsvisits/logo.gif | Bin 0 -> 1033 bytes modules/statsvisits/statsvisits.php | 182 + modules/themeinstallator/add.png | Bin 0 -> 759 bytes modules/themeinstallator/config.xml | 12 + modules/themeinstallator/de.php | 89 + modules/themeinstallator/delete.png | Bin 0 -> 823 bytes modules/themeinstallator/es.php | 87 + modules/themeinstallator/fr.php | 87 + modules/themeinstallator/it.php | 89 + modules/themeinstallator/logo.gif | Bin 0 -> 963 bytes modules/themeinstallator/script.js | 108 + modules/themeinstallator/themeinstallator.php | 1275 ++ modules/tm4b/classes/Tm4bSms.php | 232 + modules/tm4b/config.xml | 13 + modules/tm4b/cron.php | 51 + modules/tm4b/de.php | 46 + modules/tm4b/en.php | 4 + modules/tm4b/es.php | 46 + modules/tm4b/fr.php | 46 + modules/tm4b/informations.gif | Bin 0 -> 581 bytes modules/tm4b/it.php | 46 + modules/tm4b/logo.gif | Bin 0 -> 241 bytes modules/tm4b/mails/de/sms_new_order.txt | 5 + modules/tm4b/mails/de/sms_out_of_stock.txt | 5 + modules/tm4b/mails/en/sms_new_order.txt | 5 + modules/tm4b/mails/en/sms_out_of_stock.txt | 5 + modules/tm4b/mails/es/sms_new_order.txt | 0 modules/tm4b/mails/es/sms_out_of_stock.txt | 5 + modules/tm4b/mails/fr/sms_new_order.txt | 5 + modules/tm4b/mails/fr/sms_out_of_stock.txt | 5 + modules/tm4b/mails/it/sms_new_order.txt | 5 + modules/tm4b/mails/it/sms_out_of_stock.txt | 5 + modules/tm4b/prefs.gif | Bin 0 -> 351 bytes modules/tm4b/tm4b.php | 399 + modules/trackingfront/account.tpl | 70 + modules/trackingfront/config.xml | 12 + modules/trackingfront/de.php | 53 + modules/trackingfront/en.php | 4 + modules/trackingfront/es.php | 51 + modules/trackingfront/footer.tpl | 28 + modules/trackingfront/fr.php | 51 + modules/trackingfront/header.tpl | 36 + modules/trackingfront/it.php | 53 + modules/trackingfront/login.tpl | 57 + modules/trackingfront/logo.gif | Bin 0 -> 1073 bytes modules/trackingfront/stats.php | 37 + modules/trackingfront/trackingfront.php | 265 + modules/treepodia/add-to-cart.tpl | 57 + modules/treepodia/api/get_data_feed.php | 19 + modules/treepodia/api/ping.php | 3 + modules/treepodia/api/set_account_code.php | 13 + modules/treepodia/config.xml | 12 + modules/treepodia/de.php | 38 + modules/treepodia/es.php | 36 + modules/treepodia/export/export.php | 3 + modules/treepodia/footer.tpl | 45 + modules/treepodia/fr.php | 36 + modules/treepodia/it.php | 38 + modules/treepodia/logo.gif | Bin 0 -> 93 bytes modules/treepodia/logo.png | Bin 0 -> 14731 bytes modules/treepodia/logos/01_1.jpg | Bin 0 -> 11662 bytes modules/treepodia/logos/01_2.jpg | Bin 0 -> 11738 bytes modules/treepodia/logos/01_3.jpg | Bin 0 -> 12213 bytes modules/treepodia/logos/01_4.jpg | Bin 0 -> 11027 bytes modules/treepodia/logos/02_1.jpg | Bin 0 -> 3531 bytes modules/treepodia/logos/02_2.jpg | Bin 0 -> 6446 bytes modules/treepodia/logos/03_1.jpg | Bin 0 -> 5711 bytes modules/treepodia/logos/04_1.jpg | Bin 0 -> 4267 bytes modules/treepodia/logos/04_2.jpg | Bin 0 -> 4310 bytes modules/treepodia/logos/04_3.jpg | Bin 0 -> 4260 bytes modules/treepodia/logos/04_4.jpg | Bin 0 -> 4160 bytes modules/treepodia/logos/04_5.jpg | Bin 0 -> 2879 bytes modules/treepodia/logos/05_1.jpg | Bin 0 -> 6287 bytes modules/treepodia/logos/05_2.jpg | Bin 0 -> 5846 bytes modules/treepodia/logos/05_3.jpg | Bin 0 -> 5786 bytes modules/treepodia/logos/05_4.jpg | Bin 0 -> 5238 bytes modules/treepodia/logos/05_6.jpg | Bin 0 -> 2640 bytes modules/treepodia/logos/06_1.jpg | Bin 0 -> 3464 bytes modules/treepodia/logos/07_1.jpg | Bin 0 -> 2909 bytes modules/treepodia/logos/08_1.jpg | Bin 0 -> 7096 bytes modules/treepodia/logos/09.jpg | Bin 0 -> 6363 bytes modules/treepodia/logos/1-1.png | Bin 0 -> 4483 bytes modules/treepodia/logos/1-2.png | Bin 0 -> 4399 bytes modules/treepodia/logos/1-3.png | Bin 0 -> 4362 bytes modules/treepodia/logos/1-4.png | Bin 0 -> 4440 bytes modules/treepodia/logos/1-5.png | Bin 0 -> 4489 bytes modules/treepodia/logos/1-6.png | Bin 0 -> 4405 bytes modules/treepodia/logos/1-7.png | Bin 0 -> 4493 bytes modules/treepodia/logos/10.jpg | Bin 0 -> 3766 bytes modules/treepodia/logos/11_1.jpg | Bin 0 -> 5540 bytes modules/treepodia/logos/11_2.jpg | Bin 0 -> 5584 bytes modules/treepodia/logos/11_3.jpg | Bin 0 -> 5121 bytes modules/treepodia/logos/11_4.jpg | Bin 0 -> 5323 bytes modules/treepodia/logos/11_5.jpg | Bin 0 -> 3538 bytes modules/treepodia/logos/12_1.jpg | Bin 0 -> 4023 bytes modules/treepodia/logos/12_2.jpg | Bin 0 -> 4158 bytes modules/treepodia/logos/12_3.jpg | Bin 0 -> 4049 bytes modules/treepodia/logos/12_4.jpg | Bin 0 -> 3084 bytes modules/treepodia/logos/12_5.jpg | Bin 0 -> 3779 bytes modules/treepodia/logos/2-1-2.png | Bin 0 -> 3094 bytes modules/treepodia/logos/2-1.png | Bin 0 -> 3227 bytes modules/treepodia/logos/2-2-2.png | Bin 0 -> 3095 bytes modules/treepodia/logos/2-2.png | Bin 0 -> 3245 bytes modules/treepodia/logos/2-3.png | Bin 0 -> 3432 bytes modules/treepodia/logos/2-4.png | Bin 0 -> 3470 bytes modules/treepodia/logos/2-5.png | Bin 0 -> 4969 bytes modules/treepodia/logos/2-6.png | Bin 0 -> 3272 bytes modules/treepodia/logos/3-2.png | Bin 0 -> 3470 bytes modules/treepodia/logos/3-3.png | Bin 0 -> 3311 bytes modules/treepodia/logos/3-7.png | Bin 0 -> 2840 bytes modules/treepodia/logos/4-1.png | Bin 0 -> 5382 bytes modules/treepodia/logos/4-2.png | Bin 0 -> 5360 bytes modules/treepodia/logos/4-3.png | Bin 0 -> 6267 bytes modules/treepodia/logos/4-4.png | Bin 0 -> 6260 bytes modules/treepodia/logos/4-5.png | Bin 0 -> 5448 bytes modules/treepodia/logos/4-6.png | Bin 0 -> 4814 bytes modules/treepodia/logos/4-7.png | Bin 0 -> 5432 bytes modules/treepodia/logos/5-1.png | Bin 0 -> 4387 bytes modules/treepodia/logos/5-2.png | Bin 0 -> 4361 bytes modules/treepodia/logos/5-3.png | Bin 0 -> 4453 bytes modules/treepodia/logos/5-4.png | Bin 0 -> 4334 bytes modules/treepodia/logos/5-6.png | Bin 0 -> 4346 bytes modules/treepodia/logos/5-7.png | Bin 0 -> 4363 bytes modules/treepodia/logos/5-8.png | Bin 0 -> 4263 bytes modules/treepodia/logos/7-1-2.png | Bin 0 -> 10117 bytes modules/treepodia/logos/7-1.png | Bin 0 -> 10176 bytes modules/treepodia/logos/7-2-3.png | Bin 0 -> 10122 bytes modules/treepodia/logos/7-2.png | Bin 0 -> 21332 bytes modules/treepodia/logos/7-4.png | Bin 0 -> 19378 bytes modules/treepodia/logos/7-6.png | Bin 0 -> 19575 bytes modules/treepodia/logos/7-7-1.png | Bin 0 -> 8159 bytes modules/treepodia/logos/8-1.png | Bin 0 -> 3750 bytes modules/treepodia/logos/8-2.png | Bin 0 -> 3980 bytes modules/treepodia/logos/8-3.png | Bin 0 -> 4033 bytes modules/treepodia/logos/8-4.png | Bin 0 -> 4084 bytes modules/treepodia/logos/8-5.png | Bin 0 -> 3320 bytes modules/treepodia/logos/8-6.png | Bin 0 -> 3413 bytes modules/treepodia/logos/8-7.png | Bin 0 -> 3363 bytes modules/treepodia/product.tpl | 36 + modules/treepodia/tracking.tpl | 39 + modules/treepodia/treepodia.js | 42 + modules/treepodia/treepodia.php | 778 + modules/treepodia/video-sitemap.php | 7 + modules/trustedshops/RatingAlert.php | 109 + modules/trustedshops/TrustedShopsSoapApi.php | 71 + modules/trustedshops/WidgetCache.php | 52 + modules/trustedshops/config.xml | 13 + modules/trustedshops/cron.php | 34 + modules/trustedshops/cron_garantee.php | 39 + modules/trustedshops/de.php | 104 + modules/trustedshops/display_products.tpl | 85 + modules/trustedshops/es.php | 176 + modules/trustedshops/fr.php | 176 + modules/trustedshops/img/apply_de.gif | Bin 0 -> 3243 bytes modules/trustedshops/img/apply_en.gif | Bin 0 -> 3178 bytes modules/trustedshops/img/apply_fr.gif | Bin 0 -> 3205 bytes modules/trustedshops/img/siegel.gif | Bin 0 -> 3150 bytes modules/trustedshops/img/ts_logo.jpg | Bin 0 -> 9249 bytes modules/trustedshops/img/ts_rating_en.jpg | Bin 0 -> 11311 bytes modules/trustedshops/img/ts_rating_fr.jpg | Bin 0 -> 28734 bytes modules/trustedshops/it.php | 163 + modules/trustedshops/lib/AbsTrustedShops.php | 151 + modules/trustedshops/lib/RatingAlert.php | 109 + modules/trustedshops/lib/TSBPException.php | 106 + .../trustedshops/lib/TSBuyerProtection.php | 1393 ++ .../trustedshops/lib/TrustedShopsRating.php | 492 + .../trustedshops/lib/TrustedShopsSoapApi.php | 71 + modules/trustedshops/lib/WidgetCache.php | 52 + modules/trustedshops/lib/js/payment.js | 103 + modules/trustedshops/logo.gif | Bin 0 -> 1013 bytes .../trustedshops/mails/de/rating_email.html | 26 + .../trustedshops/mails/de/rating_email.txt | 5 + .../trustedshops/mails/en/rating_email.html | 29 + .../trustedshops/mails/en/rating_email.txt | 3 + .../trustedshops/mails/es/rating_email.html | 26 + .../trustedshops/mails/es/rating_email.txt | 3 + .../trustedshops/mails/fr/rating_email.html | 29 + .../trustedshops/mails/fr/rating_email.txt | 3 + .../trustedshops/mails/it/rating_email.html | 25 + .../trustedshops/mails/it/rating_email.txt | 3 + .../order-confirmation-tsbp-classic.tpl | 63 + modules/trustedshops/order-confirmation.tpl | 27 + modules/trustedshops/seal_of_approval.tpl | 43 + modules/trustedshops/trustedshops.php | 237 + modules/trustedshops/widget.tpl | 38 + modules/twenga/ajax-loader.gif | Bin 0 -> 4176 bytes modules/twenga/bt_500_clicks.gif | Bin 0 -> 9049 bytes modules/twenga/config.xml | 12 + modules/twenga/de.php | 66 + modules/twenga/es.php | 95 + modules/twenga/export.php | 43 + modules/twenga/fr.php | 95 + modules/twenga/infos.html | 1 + modules/twenga/infos_update.php | 27 + modules/twenga/it.php | 96 + modules/twenga/lib/PrestashopStats.php | 128 + modules/twenga/lib/TwengaAddFeed.php | 45 + modules/twenga/lib/TwengaFields.php | 329 + .../lib/TwengaFieldsGetSubscriptionLink.php | 59 + .../lib/TwengaFieldsGetTrackingScript.php | 88 + .../twenga/lib/TwengaFieldsOrderCancel.php | 32 + modules/twenga/lib/TwengaFieldsOrderExist.php | 33 + .../twenga/lib/TwengaFieldsOrderValidate.php | 47 + .../twenga/lib/TwengaFieldsSiteActivate.php | 33 + modules/twenga/lib/TwengaFieldsSiteExist.php | 43 + modules/twenga/lib/TwengaObj.php | 577 + modules/twenga/logo.gif | Bin 0 -> 1046 bytes modules/twenga/logo_big.jpg | Bin 0 -> 4869 bytes modules/twenga/mails/de/mail.html | 14 + modules/twenga/mails/de/mail.txt | 6 + modules/twenga/mails/en/mail.html | 14 + modules/twenga/mails/en/mail.txt | 6 + modules/twenga/mails/es/mail.html | 14 + modules/twenga/mails/es/mail.txt | 6 + modules/twenga/mails/fr/mail.html | 14 + modules/twenga/mails/fr/mail.txt | 6 + modules/twenga/mails/it/mail.html | 14 + modules/twenga/mails/it/mail.txt | 0 modules/twenga/send_mail.php | 33 + modules/twenga/twenga.php | 1085 ++ modules/upscarrier/carrier.jpg | Bin 0 -> 5140 bytes modules/upscarrier/config.xml | 12 + modules/upscarrier/de.php | 146 + modules/upscarrier/es.php | 148 + modules/upscarrier/fr.php | 148 + modules/upscarrier/it.php | 146 + modules/upscarrier/logo.gif | Bin 0 -> 1140 bytes modules/upscarrier/sql-install.php | 149 + modules/upscarrier/sql-uninstall.php | 12 + modules/upscarrier/upscarrier.php | 1855 ++ modules/upscarrier/xml-package.tpl | 21 + modules/upscarrier/xml.tpl | 59 + modules/uspscarrier/carrier.jpg | Bin 0 -> 4079 bytes modules/uspscarrier/config.xml | 12 + modules/uspscarrier/de.php | 123 + modules/uspscarrier/es.php | 123 + modules/uspscarrier/fr.php | 123 + modules/uspscarrier/it.php | 124 + modules/uspscarrier/logo.gif | Bin 0 -> 1074 bytes modules/uspscarrier/sql-install.php | 85 + modules/uspscarrier/sql-uninstall.php | 11 + modules/uspscarrier/uspscarrier.php | 1879 ++ modules/uspscarrier/xml-package.tpl | 10 + modules/uspscarrier/xml.tpl | 4 + modules/vatnumber/ajax.php | 31 + modules/vatnumber/config.xml | 12 + modules/vatnumber/de.php | 15 + modules/vatnumber/en.php | 4 + modules/vatnumber/es.php | 14 + modules/vatnumber/fr.php | 14 + modules/vatnumber/it.php | 15 + modules/vatnumber/logo.gif | Bin 0 -> 1025 bytes modules/vatnumber/vatnumber.php | 186 + modules/watermark/config.xml | 13 + modules/watermark/de.php | 31 + modules/watermark/en.php | 4 + modules/watermark/es.php | 29 + modules/watermark/fr.php | 29 + modules/watermark/it.php | 31 + modules/watermark/logo.gif | Bin 0 -> 988 bytes modules/watermark/watermark.gif | Bin 0 -> 2055 bytes modules/watermark/watermark.php | 267 + my-account.php | 35 + new-products.php | 35 + order-confirmation.php | 35 + order-detail.php | 35 + order-follow.php | 35 + order-opc.php | 35 + order-return.php | 35 + order-slip.php | 35 + order.php | 35 + override/classes/FirePHP.class.php | 1784 ++ override/classes/_FrontController.php | 360 + override/classes/_Module.php | 48 + override/classes/_MySQL.php | 213 + override/classes/_Tools.php | 316 + override/classes/fb.php | 276 + pagination.php | 29 + password.php | 35 + pdf-invoice.php | 35 + pdf-order-return.php | 35 + pdf-order-slip.php | 35 + prices-drop.php | 35 + product-sort.php | 35 + product.php | 35 + products-comparison.php | 35 + readme_de.txt | 82 + readme_en.txt | 70 + readme_es.txt | 70 + readme_fr.txt | 70 + readme_it.txt | 70 + search.php | 35 + sitemap.php | 35 + sitemap.xml | 0 statistics.php | 35 + stores.php | 35 + supplier.php | 35 + themes/.htaccess | 3 + themes/debug.tpl | 90 + themes/index.php | 36 + themes/live_edit.tpl | 53 + themes/prestashop/404.tpl | 46 + themes/prestashop/address.tpl | 254 + themes/prestashop/addresses.tpl | 78 + themes/prestashop/authentication.tpl | 489 + themes/prestashop/best-sales.tpl | 38 + themes/prestashop/breadcrumb.tpl | 32 + .../prestashop/category-cms-tree-branch.tpl | 53 + themes/prestashop/category-tree-branch.tpl | 40 + themes/prestashop/category.tpl | 93 + themes/prestashop/cms.tpl | 73 + themes/prestashop/config.xml | 9 + themes/prestashop/contact-form.tpl | 121 + themes/prestashop/css/addresses.css | 68 + themes/prestashop/css/authentication.css | 58 + themes/prestashop/css/category.css | 5 + themes/prestashop/css/cms.css | 10 + themes/prestashop/css/comparator.css | 122 + themes/prestashop/css/contact-form.css | 8 + themes/prestashop/css/global.css | 1495 ++ themes/prestashop/css/history.css | 45 + themes/prestashop/css/identity.css | 5 + themes/prestashop/css/maintenance.css | 39 + .../blockadvertising/blockadvertising.css | 2 + .../blockbestsellers/blockbestsellers.css | 5 + .../css/modules/blockcart/blockcart.css | 113 + .../blockcategories/blockcategories.css | 59 + .../css/modules/blockcms/blockcms.css | 14 + .../blockcurrencies/blockcurrencies.css | 38 + .../modules/blocklanguages/blocklanguages.css | 17 + .../blockmanufacturer/blockmanufacturer.css | 6 + .../modules/blockmyaccount/blockmyaccount.css | 14 + .../blocknewproducts/blocknewproducts.css | 8 + .../blocknewsletter/blocknewsletter.css | 4 + .../blockpaymentlogo/blockpaymentlogo.css | 4 + .../blockpermanentlinks.css | 24 + .../css/modules/blockrss/blockrss.css | 2 + .../css/modules/blocksearch/blocksearch.css | 24 + .../modules/blockspecials/blockspecials.css | 16 + .../css/modules/blockstore/blockstore.css | 3 + .../modules/blocksupplier/blocksupplier.css | 7 + .../css/modules/blocktags/blocktags.css | 18 + .../modules/blockuserinfo/blockuserinfo.css | 27 + .../css/modules/blockviewed/blockviewed.css | 6 + .../modules/blockwishlist/blockwishlist.css | 16 + .../css/modules/crossselling/crossselling.css | 44 + .../css/modules/editorial/editorial.css | 30 + themes/prestashop/css/my-account.css | 6 + themes/prestashop/css/order-opc.css | 66 + themes/prestashop/css/product.css | 159 + themes/prestashop/css/product_list.css | 73 + themes/prestashop/css/restricted-country.css | 39 + themes/prestashop/css/scenes.css | 134 + themes/prestashop/css/sitemap.css | 20 + themes/prestashop/css/stores.css | 65 + themes/prestashop/discount.tpl | 95 + themes/prestashop/errors.tpl | 39 + themes/prestashop/footer.tpl | 41 + themes/prestashop/guest-tracking.tpl | 85 + themes/prestashop/header.tpl | 90 + themes/prestashop/history.tpl | 96 + themes/prestashop/identity.tpl | 139 + themes/prestashop/img/address_alias_left.gif | Bin 0 -> 928 bytes themes/prestashop/img/address_alias_right.gif | Bin 0 -> 928 bytes themes/prestashop/img/ajax-loader.gif | Bin 0 -> 3208 bytes .../img/arrow_rotate_anticlockwise.png | Bin 0 -> 608 bytes themes/prestashop/img/bg_account.jpg | Bin 0 -> 415 bytes themes/prestashop/img/block_bg.jpg | Bin 0 -> 361 bytes themes/prestashop/img/block_bg_myaccount.jpg | Bin 0 -> 394 bytes .../prestashop/img/block_category_item_bg.jpg | Bin 0 -> 380 bytes themes/prestashop/img/block_exclusive_bg.jpg | Bin 0 -> 375 bytes .../prestashop/img/block_exclusive_footer.jpg | Bin 0 -> 744 bytes themes/prestashop/img/block_footer.gif | Bin 0 -> 261 bytes themes/prestashop/img/block_footer.png | Bin 0 -> 207 bytes .../prestashop/img/block_footer_myaccount.jpg | Bin 0 -> 852 bytes themes/prestashop/img/block_footer_page.gif | Bin 0 -> 1733 bytes .../img/block_footer_page_footer.png | Bin 0 -> 357 bytes themes/prestashop/img/block_header.gif | Bin 0 -> 1286 bytes themes/prestashop/img/block_header.png | Bin 0 -> 966 bytes .../prestashop/img/block_header_exclusive.gif | Bin 0 -> 1273 bytes .../prestashop/img/block_header_exclusive.png | Bin 0 -> 960 bytes .../img/block_header_exclusive_cart.gif | Bin 0 -> 1431 bytes .../img/block_header_exclusive_cart.png | Bin 0 -> 1134 bytes themes/prestashop/img/block_header_large.gif | Bin 0 -> 1417 bytes themes/prestashop/img/block_header_large.png | Bin 0 -> 777 bytes .../prestashop/img/block_header_myaccount.jpg | Bin 0 -> 1851 bytes .../img/block_myaccount_header_large.gif | Bin 0 -> 2253 bytes themes/prestashop/img/block_search_bg.jpg | Bin 0 -> 1104 bytes themes/prestashop/img/bullet.gif | Bin 0 -> 85 bytes themes/prestashop/img/bullet_alt.jpg | Bin 0 -> 710 bytes themes/prestashop/img/bullet_myaccount.gif | Bin 0 -> 56 bytes themes/prestashop/img/bullet_price.gif | Bin 0 -> 64 bytes .../prestashop/img/button-account-large.gif | Bin 0 -> 1739 bytes themes/prestashop/img/button-account-mini.gif | Bin 0 -> 932 bytes .../prestashop/img/button-account-small.gif | Bin 0 -> 1192 bytes themes/prestashop/img/button-account.gif | Bin 0 -> 1456 bytes themes/prestashop/img/button-large.gif | Bin 0 -> 2737 bytes themes/prestashop/img/button-large.png | Bin 0 -> 1777 bytes .../prestashop/img/button-large_exclusive.gif | Bin 0 -> 2099 bytes themes/prestashop/img/button-medium.gif | Bin 0 -> 2521 bytes themes/prestashop/img/button-medium.png | Bin 0 -> 1733 bytes .../img/button-medium_exclusive.gif | Bin 0 -> 1860 bytes .../img/button-medium_exclusive.png | Bin 0 -> 1144 bytes themes/prestashop/img/button-mini.gif | Bin 0 -> 1877 bytes themes/prestashop/img/button-mini.png | Bin 0 -> 1703 bytes .../prestashop/img/button-mini_exclusive.gif | Bin 0 -> 1248 bytes themes/prestashop/img/button-small.gif | Bin 0 -> 2163 bytes themes/prestashop/img/button-small.png | Bin 0 -> 1727 bytes .../prestashop/img/button-small_exclusive.gif | Bin 0 -> 1507 bytes themes/prestashop/img/flag_new_bg.jpg | Bin 0 -> 359 bytes themes/prestashop/img/footer_account.gif | Bin 0 -> 243 bytes themes/prestashop/img/form-input-bg.gif | Bin 0 -> 93 bytes themes/prestashop/img/form_bg.jpg | Bin 0 -> 512 bytes themes/prestashop/img/header_account.gif | Bin 0 -> 1231 bytes themes/prestashop/img/icon/add.gif | Bin 0 -> 598 bytes themes/prestashop/img/icon/addrbook.gif | Bin 0 -> 632 bytes themes/prestashop/img/icon/available.gif | Bin 0 -> 610 bytes themes/prestashop/img/icon/cancel.gif | Bin 0 -> 614 bytes themes/prestashop/img/icon/cancel_16x18.gif | Bin 0 -> 565 bytes themes/prestashop/img/icon/cart.gif | Bin 0 -> 636 bytes themes/prestashop/img/icon/cible.gif | Bin 0 -> 736 bytes themes/prestashop/img/icon/contact.gif | Bin 0 -> 616 bytes themes/prestashop/img/icon/delete.gif | Bin 0 -> 103 bytes .../prestashop/img/icon/download_product.gif | Bin 0 -> 580 bytes themes/prestashop/img/icon/error.gif | Bin 0 -> 1391 bytes themes/prestashop/img/icon/gift.gif | Bin 0 -> 641 bytes themes/prestashop/img/icon/home.gif | Bin 0 -> 625 bytes themes/prestashop/img/icon/infos.gif | Bin 0 -> 778 bytes themes/prestashop/img/icon/less.gif | Bin 0 -> 58 bytes themes/prestashop/img/icon/magnify.gif | Bin 0 -> 379 bytes themes/prestashop/img/icon/more.gif | Bin 0 -> 58 bytes themes/prestashop/img/icon/my-account.gif | Bin 0 -> 692 bytes themes/prestashop/img/icon/next.gif | Bin 0 -> 83 bytes themes/prestashop/img/icon/no.gif | Bin 0 -> 613 bytes themes/prestashop/img/icon/order.gif | Bin 0 -> 382 bytes themes/prestashop/img/icon/pdf.gif | Bin 0 -> 616 bytes themes/prestashop/img/icon/previous.gif | Bin 0 -> 82 bytes themes/prestashop/img/icon/quantity_down.gif | Bin 0 -> 73 bytes .../prestashop/img/icon/quantity_down_off.gif | Bin 0 -> 73 bytes themes/prestashop/img/icon/quantity_up.gif | Bin 0 -> 73 bytes themes/prestashop/img/icon/recyclable.gif | Bin 0 -> 1065 bytes themes/prestashop/img/icon/return.gif | Bin 0 -> 1062 bytes themes/prestashop/img/icon/search.gif | Bin 0 -> 662 bytes .../img/icon/serial_scroll_left.gif | Bin 0 -> 258 bytes .../img/icon/serial_scroll_right.gif | Bin 0 -> 259 bytes themes/prestashop/img/icon/sitemap.gif | Bin 0 -> 600 bytes themes/prestashop/img/icon/slip.gif | Bin 0 -> 1027 bytes themes/prestashop/img/icon/sort_asc.gif | Bin 0 -> 55 bytes .../prestashop/img/icon/sort_asc_disabled.gif | Bin 0 -> 55 bytes themes/prestashop/img/icon/sort_asc_white.gif | Bin 0 -> 444 bytes themes/prestashop/img/icon/sort_asc_white.png | Bin 0 -> 118 bytes themes/prestashop/img/icon/sort_desc.gif | Bin 0 -> 63 bytes .../img/icon/sort_desc_disabled.gif | Bin 0 -> 54 bytes .../prestashop/img/icon/sort_desc_white.gif | Bin 0 -> 447 bytes .../prestashop/img/icon/sort_desc_white.png | Bin 0 -> 132 bytes themes/prestashop/img/icon/star.gif | Bin 0 -> 369 bytes themes/prestashop/img/icon/unavailable.gif | Bin 0 -> 610 bytes themes/prestashop/img/icon/up.gif | Bin 0 -> 55 bytes themes/prestashop/img/icon/update.gif | Bin 0 -> 568 bytes themes/prestashop/img/icon/userinfo.gif | Bin 0 -> 589 bytes themes/prestashop/img/icon/voucher.gif | Bin 0 -> 592 bytes themes/prestashop/img/icon/yes.gif | Bin 0 -> 622 bytes themes/prestashop/img/jquery/macFFBgHack.png | Bin 0 -> 207 bytes .../img/logo_paiement_mastercard.jpg | Bin 0 -> 1880 bytes .../prestashop/img/logo_paiement_paypal.jpg | Bin 0 -> 2426 bytes themes/prestashop/img/logo_paiement_visa.jpg | Bin 0 -> 1700 bytes themes/prestashop/img/nav-logout.gif | Bin 0 -> 371 bytes themes/prestashop/img/onsale_en.gif | Bin 0 -> 1962 bytes themes/prestashop/img/onsale_es.gif | Bin 0 -> 1688 bytes themes/prestashop/img/onsale_fr.gif | Bin 0 -> 2183 bytes .../prestashop/img/pagination-bg-current.gif | Bin 0 -> 146 bytes .../prestashop/img/pagination-next-border.gif | Bin 0 -> 510 bytes .../prestashop/img/pagination-prev-border.gif | Bin 0 -> 518 bytes .../prestashop/img/pagination-prevnext-bg.gif | Bin 0 -> 147 bytes themes/prestashop/img/pagination_bg.gif | Bin 0 -> 146 bytes themes/prestashop/img/product-buy-bg.gif | Bin 0 -> 184 bytes .../prestashop/img/product-short-desc-bg.gif | Bin 0 -> 332 bytes themes/prestashop/img/rss.gif | Bin 0 -> 209 bytes themes/prestashop/img/sitemap-horizontal.gif | Bin 0 -> 427 bytes themes/prestashop/img/sitemap-horizontal.png | Bin 0 -> 100 bytes themes/prestashop/img/sitemap-last.gif | Bin 0 -> 76 bytes themes/prestashop/img/sitemap-top.gif | Bin 0 -> 393 bytes themes/prestashop/img/sitemap_long.gif | Bin 0 -> 584 bytes themes/prestashop/img/step_current.gif | Bin 0 -> 230 bytes themes/prestashop/img/step_end.gif | Bin 0 -> 190 bytes themes/prestashop/img/step_end_current.gif | Bin 0 -> 196 bytes themes/prestashop/img/step_standard.gif | Bin 0 -> 210 bytes themes/prestashop/img/step_start.gif | Bin 0 -> 95 bytes themes/prestashop/img/tab_bg.jpg | Bin 0 -> 1073 bytes themes/prestashop/img/tab_bg_selected.jpg | Bin 0 -> 1434 bytes .../prestashop/img/tab_bg_selected_short.jpg | Bin 0 -> 8577 bytes themes/prestashop/img/tab_bg_short.jpg | Bin 0 -> 8314 bytes themes/prestashop/img/table_footer.gif | Bin 0 -> 105 bytes themes/prestashop/img/table_header.gif | Bin 0 -> 1262 bytes themes/prestashop/img/thumbs_left.gif | Bin 0 -> 201 bytes themes/prestashop/img/thumbs_right.gif | Bin 0 -> 197 bytes themes/prestashop/img/title_bg.gif | Bin 0 -> 1385 bytes themes/prestashop/img/title_bg.png | Bin 0 -> 574 bytes themes/prestashop/img/title_bg_large.gif | Bin 0 -> 1428 bytes themes/prestashop/index.php | 37 + themes/prestashop/index.tpl | 27 + themes/prestashop/js/cart-summary.js | 406 + themes/prestashop/js/cms.js | 41 + themes/prestashop/js/history.js | 128 + themes/prestashop/js/order-address.js | 122 + themes/prestashop/js/order-opc.js | 687 + themes/prestashop/js/product.js | 528 + themes/prestashop/js/products-comparison.js | 53 + themes/prestashop/js/scenes.js | 92 + themes/prestashop/js/stores.js | 217 + themes/prestashop/js/tools.js | 226 + .../prestashop/js/tools/statesManagement.js | 61 + themes/prestashop/js/tools/treeManagement.js | 57 + themes/prestashop/lang/de.php | 719 + themes/prestashop/lang/en.php | 6 + themes/prestashop/lang/es.php | 732 + themes/prestashop/lang/fr.php | 732 + themes/prestashop/lang/it.php | 711 + themes/prestashop/maintenance.tpl | 51 + themes/prestashop/manufacturer-list.tpl | 85 + themes/prestashop/manufacturer.tpl | 41 + themes/prestashop/my-account.tpl | 51 + themes/prestashop/new-products.tpl | 38 + themes/prestashop/order-address.tpl | 195 + themes/prestashop/order-carrier.tpl | 198 + themes/prestashop/order-confirmation.tpl | 54 + themes/prestashop/order-detail.tpl | 371 + themes/prestashop/order-follow.tpl | 84 + themes/prestashop/order-opc-new-account.tpl | 382 + themes/prestashop/order-opc.tpl | 105 + themes/prestashop/order-payment.tpl | 72 + themes/prestashop/order-return.tpl | 106 + themes/prestashop/order-slip.tpl | 71 + themes/prestashop/order-steps.tpl | 75 + themes/prestashop/pagination.tpl | 102 + themes/prestashop/password.tpl | 54 + themes/prestashop/preview.jpg | Bin 0 -> 12628 bytes themes/prestashop/prices-drop.tpl | 38 + themes/prestashop/product-compare.tpl | 41 + themes/prestashop/product-list.tpl | 67 + themes/prestashop/product-sort.tpl | 75 + themes/prestashop/product.tpl | 542 + themes/prestashop/products-comparison.tpl | 143 + themes/prestashop/restricted-country.tpl | 51 + themes/prestashop/scenes.tpl | 92 + themes/prestashop/search.tpl | 51 + .../prestashop/shopping-cart-product-line.tpl | 80 + themes/prestashop/shopping-cart.tpl | 358 + themes/prestashop/sitemap.tpl | 90 + themes/prestashop/store_infos.tpl | 45 + themes/prestashop/stores.tpl | 100 + themes/prestashop/supplier-list.tpl | 106 + themes/prestashop/supplier.tpl | 41 + tools/.htaccess | 2 + tools/fpdf/font/courier.php | 7 + tools/fpdf/font/helvetica.php | 15 + tools/fpdf/font/helveticab.php | 15 + tools/fpdf/font/helveticabi.php | 15 + tools/fpdf/font/helveticai.php | 15 + tools/fpdf/font/index.php | 11 + tools/fpdf/font/makefont/cp1250.map | 251 + tools/fpdf/font/makefont/cp1251.map | 255 + tools/fpdf/font/makefont/cp1252.map | 251 + tools/fpdf/font/makefont/cp1253.map | 239 + tools/fpdf/font/makefont/cp1254.map | 249 + tools/fpdf/font/makefont/cp1255.map | 233 + tools/fpdf/font/makefont/cp1257.map | 244 + tools/fpdf/font/makefont/cp1258.map | 247 + tools/fpdf/font/makefont/cp874.map | 225 + tools/fpdf/font/makefont/index.php | 11 + tools/fpdf/font/makefont/iso-8859-1.map | 256 + tools/fpdf/font/makefont/iso-8859-11.map | 248 + tools/fpdf/font/makefont/iso-8859-15.map | 256 + tools/fpdf/font/makefont/iso-8859-16.map | 256 + tools/fpdf/font/makefont/iso-8859-2.map | 256 + tools/fpdf/font/makefont/iso-8859-4.map | 256 + tools/fpdf/font/makefont/iso-8859-5.map | 256 + tools/fpdf/font/makefont/iso-8859-7.map | 250 + tools/fpdf/font/makefont/iso-8859-9.map | 256 + tools/fpdf/font/makefont/koi8-r.map | 256 + tools/fpdf/font/makefont/koi8-u.map | 256 + tools/fpdf/font/makefont/makefont.php | 416 + tools/fpdf/font/symbol.php | 15 + tools/fpdf/font/times.php | 15 + tools/fpdf/font/timesb.php | 15 + tools/fpdf/font/timesbi.php | 15 + tools/fpdf/font/timesi.php | 15 + tools/fpdf/font/zapfdingbats.php | 15 + tools/fpdf/fpdf.php | 1729 ++ tools/fpdf/index.php | 11 + tools/geoip/geoip.inc | 556 + tools/geoip/geoipcity.inc | 217 + tools/geoip/geoipregionvars.php | 4191 ++++ tools/index.php | 11 + tools/js_minify/jsmin.php | 291 + tools/json/json.php | 804 + tools/minify_html/minify_html.class.php | 220 + tools/pclzip/pclzip.lib.php | 5694 ++++++ tools/pear/PEAR.php | 1410 ++ tools/pear_xml_parser/Parser.php | 351 + tools/pear_xml_parser/Parser/Atom.php | 365 + tools/pear_xml_parser/Parser/AtomElement.php | 261 + tools/pear_xml_parser/Parser/Exception.php | 42 + tools/pear_xml_parser/Parser/RSS09.php | 214 + tools/pear_xml_parser/Parser/RSS09Element.php | 62 + tools/pear_xml_parser/Parser/RSS1.php | 277 + tools/pear_xml_parser/Parser/RSS11.php | 276 + tools/pear_xml_parser/Parser/RSS11Element.php | 151 + tools/pear_xml_parser/Parser/RSS1Element.php | 116 + tools/pear_xml_parser/Parser/RSS2.php | 334 + tools/pear_xml_parser/Parser/RSS2Element.php | 171 + tools/pear_xml_parser/Parser/Type.php | 441 + tools/pear_xml_parser/Parser/index.php | 11 + tools/pear_xml_parser/index.php | 11 + tools/smarty/Smarty.class.php | 822 + tools/smarty/cache/index.php | 11 + tools/smarty/compile/index.php | 11 + tools/smarty/debug.tpl | 133 + tools/smarty/plugins/block.php.php | 27 + tools/smarty/plugins/block.textformat.php | 102 + tools/smarty/plugins/function.counter.php | 78 + tools/smarty/plugins/function.cycle.php | 106 + tools/smarty/plugins/function.fetch.php | 216 + .../plugins/function.html_checkboxes.php | 143 + tools/smarty/plugins/function.html_image.php | 137 + .../smarty/plugins/function.html_options.php | 133 + tools/smarty/plugins/function.html_radios.php | 154 + .../plugins/function.html_select_date.php | 330 + .../plugins/function.html_select_time.php | 194 + tools/smarty/plugins/function.html_table.php | 177 + tools/smarty/plugins/function.mailto.php | 156 + tools/smarty/plugins/function.math.php | 83 + tools/smarty/plugins/modifier.capitalize.php | 37 + tools/smarty/plugins/modifier.date_format.php | 61 + .../plugins/modifier.debug_print_var.php | 87 + tools/smarty/plugins/modifier.escape.php | 91 + .../smarty/plugins/modifier.regex_replace.php | 46 + tools/smarty/plugins/modifier.replace.php | 29 + tools/smarty/plugins/modifier.spacify.php | 37 + tools/smarty/plugins/modifier.truncate.php | 67 + tools/smarty/plugins/modifiercompiler.cat.php | 29 + .../modifiercompiler.count_characters.php | 39 + .../modifiercompiler.count_paragraphs.php | 27 + .../modifiercompiler.count_sentences.php | 27 + .../plugins/modifiercompiler.count_words.php | 31 + .../plugins/modifiercompiler.default.php | 33 + .../plugins/modifiercompiler.indent.php | 32 + .../smarty/plugins/modifiercompiler.lower.php | 31 + .../plugins/modifiercompiler.noprint.php | 24 + .../modifiercompiler.string_format.php | 26 + .../smarty/plugins/modifiercompiler.strip.php | 33 + .../plugins/modifiercompiler.strip_tags.php | 34 + .../smarty/plugins/modifiercompiler.upper.php | 30 + .../plugins/modifiercompiler.wordwrap.php | 35 + .../plugins/outputfilter.trimwhitespace.php | 77 + .../plugins/shared.escape_special_chars.php | 29 + .../smarty/plugins/shared.make_timestamp.php | 43 + .../smarty/plugins/shared.mb_str_replace.php | 38 + .../variablefilter.htmlspecialchars.php | 22 + .../smarty_internal_cacheresource_file.php | 205 + .../smarty_internal_compile_append.php | 50 + .../smarty_internal_compile_assign.php | 64 + .../smarty_internal_compile_block.php | 187 + .../smarty_internal_compile_break.php | 65 + .../smarty_internal_compile_call.php | 108 + .../smarty_internal_compile_capture.php | 81 + .../smarty_internal_compile_config_load.php | 64 + .../smarty_internal_compile_continue.php | 64 + .../smarty_internal_compile_debug.php | 38 + .../smarty_internal_compile_eval.php | 51 + .../smarty_internal_compile_extends.php | 90 + .../smarty_internal_compile_for.php | 147 + .../smarty_internal_compile_foreach.php | 219 + .../smarty_internal_compile_function.php | 134 + .../sysplugins/smarty_internal_compile_if.php | 179 + .../smarty_internal_compile_include.php | 176 + .../smarty_internal_compile_include_php.php | 90 + .../smarty_internal_compile_insert.php | 123 + .../smarty_internal_compile_ldelim.php | 37 + .../smarty_internal_compile_nocache.php | 63 + ..._internal_compile_private_block_plugin.php | 78 + ...ternal_compile_private_function_plugin.php | 58 + ...arty_internal_compile_private_modifier.php | 69 + ..._compile_private_object_block_function.php | 80 + ...ternal_compile_private_object_function.php | 71 + ...ernal_compile_private_print_expression.php | 77 + ...ernal_compile_private_registered_block.php | 95 + ...al_compile_private_registered_function.php | 67 + ...ernal_compile_private_special_variable.php | 99 + .../smarty_internal_compile_rdelim.php | 37 + .../smarty_internal_compile_section.php | 173 + .../smarty_internal_compile_while.php | 82 + .../smarty_internal_compilebase.php | 150 + .../sysplugins/smarty_internal_config.php | 288 + .../smarty_internal_config_file_compiler.php | 106 + .../smarty_internal_configfilelexer.php | 526 + .../smarty_internal_configfileparser.php | 870 + .../sysplugins/smarty_internal_data.php | 479 + .../sysplugins/smarty_internal_debug.php | 170 + .../sysplugins/smarty_internal_filter.php | 89 + .../smarty_internal_filter_handler.php | 67 + .../smarty_internal_function_call_handler.php | 40 + .../smarty_internal_get_include_path.php | 44 + .../smarty_internal_nocache_insert.php | 49 + .../sysplugins/smarty_internal_parsetree.php | 236 + .../sysplugins/smarty_internal_register.php | 156 + .../smarty_internal_resource_eval.php | 89 + .../smarty_internal_resource_extends.php | 176 + .../smarty_internal_resource_file.php | 128 + .../smarty_internal_resource_php.php | 127 + .../smarty_internal_resource_registered.php | 143 + .../smarty_internal_resource_stream.php | 99 + .../smarty_internal_resource_string.php | 133 + ...smarty_internal_smartytemplatecompiler.php | 72 + .../sysplugins/smarty_internal_template.php | 999 + .../smarty_internal_templatecompilerbase.php | 435 + .../smarty_internal_templatelexer.php | 1182 ++ .../smarty_internal_templateparser.php | 2966 +++ .../sysplugins/smarty_internal_utility.php | 300 + .../sysplugins/smarty_internal_wrapper.php | 131 + .../sysplugins/smarty_internal_write_file.php | 56 + tools/smarty/sysplugins/smarty_security.php | 229 + tools/smarty_v2/Config_File.class.php | 389 + tools/smarty_v2/Smarty.class.php | 1970 ++ tools/smarty_v2/Smarty_Compiler.class.php | 2330 +++ tools/smarty_v2/cache/index.php | 11 + tools/smarty_v2/compile/index.php | 11 + tools/smarty_v2/configs/index.php | 11 + tools/smarty_v2/index.php | 11 + .../core.assemble_plugin_filepath.php | 126 + .../core.assign_smarty_interface.php | 43 + .../internals/core.create_dir_structure.php | 79 + .../internals/core.display_debug_console.php | 61 + .../internals/core.get_include_path.php | 44 + .../internals/core.get_microtime.php | 23 + .../internals/core.get_php_resource.php | 80 + tools/smarty_v2/internals/core.is_secure.php | 59 + tools/smarty_v2/internals/core.is_trusted.php | 47 + .../smarty_v2/internals/core.load_plugins.php | 125 + .../internals/core.load_resource_plugin.php | 74 + .../internals/core.process_cached_inserts.php | 71 + .../core.process_compiled_include.php | 37 + .../internals/core.read_cache_file.php | 101 + tools/smarty_v2/internals/core.rm_auto.php | 74 + tools/smarty_v2/internals/core.rmdir.php | 54 + .../internals/core.run_insert_handler.php | 71 + .../internals/core.smarty_include_php.php | 50 + .../internals/core.write_cache_file.php | 96 + .../internals/core.write_compiled_include.php | 91 + .../core.write_compiled_resource.php | 35 + tools/smarty_v2/internals/core.write_file.php | 54 + tools/smarty_v2/internals/index.php | 11 + tools/smarty_v2/plugins/block.textformat.php | 103 + tools/smarty_v2/plugins/compiler.assign.php | 40 + .../plugins/function.assign_debug_info.php | 40 + .../plugins/function.config_load.php | 142 + tools/smarty_v2/plugins/function.counter.php | 80 + tools/smarty_v2/plugins/function.cycle.php | 102 + tools/smarty_v2/plugins/function.debug.php | 35 + tools/smarty_v2/plugins/function.eval.php | 49 + tools/smarty_v2/plugins/function.fetch.php | 221 + .../plugins/function.html_checkboxes.php | 143 + .../smarty_v2/plugins/function.html_image.php | 142 + .../plugins/function.html_options.php | 122 + .../plugins/function.html_radios.php | 156 + .../plugins/function.html_select_date.php | 331 + .../plugins/function.html_select_time.php | 194 + .../smarty_v2/plugins/function.html_table.php | 177 + tools/smarty_v2/plugins/function.mailto.php | 165 + tools/smarty_v2/plugins/function.math.php | 84 + tools/smarty_v2/plugins/function.popup.php | 119 + .../smarty_v2/plugins/function.popup_init.php | 40 + tools/smarty_v2/plugins/index.php | 11 + .../smarty_v2/plugins/modifier.capitalize.php | 43 + tools/smarty_v2/plugins/modifier.cat.php | 33 + .../plugins/modifier.count_characters.php | 32 + .../plugins/modifier.count_paragraphs.php | 29 + .../plugins/modifier.count_sentences.php | 29 + .../plugins/modifier.count_words.php | 33 + .../plugins/modifier.date_format.php | 58 + .../plugins/modifier.debug_print_var.php | 90 + tools/smarty_v2/plugins/modifier.default.php | 32 + tools/smarty_v2/plugins/modifier.escape.php | 93 + tools/smarty_v2/plugins/modifier.indent.php | 28 + tools/smarty_v2/plugins/modifier.lower.php | 26 + tools/smarty_v2/plugins/modifier.nl2br.php | 35 + .../plugins/modifier.regex_replace.php | 48 + tools/smarty_v2/plugins/modifier.replace.php | 30 + tools/smarty_v2/plugins/modifier.spacify.php | 30 + .../plugins/modifier.string_format.php | 29 + tools/smarty_v2/plugins/modifier.strip.php | 33 + .../smarty_v2/plugins/modifier.strip_tags.php | 32 + tools/smarty_v2/plugins/modifier.truncate.php | 51 + tools/smarty_v2/plugins/modifier.upper.php | 26 + tools/smarty_v2/plugins/modifier.wordwrap.php | 29 + .../plugins/outputfilter.trimwhitespace.php | 75 + .../plugins/shared.escape_special_chars.php | 31 + .../plugins/shared.make_timestamp.php | 46 + tools/swift/EasySwift.php | 949 + tools/swift/Swift.php | 489 + tools/swift/Swift/Address.php | 104 + tools/swift/Swift/AddressContainer.php | 8 + tools/swift/Swift/Authenticator.php | 33 + .../swift/Swift/Authenticator/@PopB4Smtp.php | 86 + tools/swift/Swift/Authenticator/CRAMMD5.php | 73 + tools/swift/Swift/Authenticator/LOGIN.php | 49 + tools/swift/Swift/Authenticator/PLAIN.php | 50 + .../PopB4Smtp/Pop3Connection.php | 176 + .../Swift/Authenticator/PopB4Smtp/index.php | 11 + tools/swift/Swift/Authenticator/index.php | 13 + tools/swift/Swift/BadResponseException.php | 22 + tools/swift/Swift/BatchMailer.php | 229 + tools/swift/Swift/Cache.php | 55 + tools/swift/Swift/Cache/Disk.php | 130 + tools/swift/Swift/Cache/JointOutputStream.php | 74 + tools/swift/Swift/Cache/Memory.php | 78 + tools/swift/Swift/Cache/OutputStream.php | 60 + tools/swift/Swift/Cache/index.php | 11 + tools/swift/Swift/CacheFactory.php | 47 + tools/swift/Swift/ClassLoader.php | 38 + tools/swift/Swift/Connection.php | 81 + tools/swift/Swift/Connection/Multi.php | 161 + tools/swift/Swift/Connection/NativeMail.php | 136 + tools/swift/Swift/Connection/Rotator.php | 194 + tools/swift/Swift/Connection/SMTP.php | 452 + tools/swift/Swift/Connection/Sendmail.php | 352 + tools/swift/Swift/Connection/index.php | 11 + tools/swift/Swift/ConnectionBase.php | 102 + tools/swift/Swift/ConnectionException.php | 22 + tools/swift/Swift/Events.php | 41 + .../Swift/Events/BeforeCommandListener.php | 25 + .../swift/Swift/Events/BeforeSendListener.php | 25 + tools/swift/Swift/Events/CommandEvent.php | 74 + tools/swift/Swift/Events/CommandListener.php | 25 + tools/swift/Swift/Events/ConnectEvent.php | 42 + tools/swift/Swift/Events/ConnectListener.php | 25 + tools/swift/Swift/Events/DisconnectEvent.php | 42 + .../swift/Swift/Events/DisconnectListener.php | 25 + tools/swift/Swift/Events/Listener.php | 17 + tools/swift/Swift/Events/ListenerMapper.php | 47 + tools/swift/Swift/Events/ResponseEvent.php | 71 + tools/swift/Swift/Events/ResponseListener.php | 25 + tools/swift/Swift/Events/SendEvent.php | 116 + tools/swift/Swift/Events/SendListener.php | 24 + tools/swift/Swift/Events/index.php | 11 + tools/swift/Swift/Exception.php | 36 + tools/swift/Swift/File.php | 208 + tools/swift/Swift/FileException.php | 22 + tools/swift/Swift/Iterator.php | 44 + tools/swift/Swift/Iterator/Array.php | 111 + tools/swift/Swift/Iterator/MySQLResult.php | 121 + tools/swift/Swift/Iterator/index.php | 11 + tools/swift/Swift/Log.php | 152 + tools/swift/Swift/Log/DefaultLog.php | 58 + tools/swift/Swift/Log/index.php | 11 + tools/swift/Swift/LogContainer.php | 47 + tools/swift/Swift/Message.php | 797 + tools/swift/Swift/Message/Attachment.php | 161 + tools/swift/Swift/Message/EmbeddedFile.php | 77 + tools/swift/Swift/Message/Encoder.php | 455 + tools/swift/Swift/Message/Headers.php | 573 + tools/swift/Swift/Message/Image.php | 55 + tools/swift/Swift/Message/Mime.php | 500 + tools/swift/Swift/Message/MimeException.php | 22 + tools/swift/Swift/Message/Part.php | 134 + tools/swift/Swift/Message/index.php | 11 + tools/swift/Swift/Plugin/AntiFlood.php | 105 + tools/swift/Swift/Plugin/BandwidthMonitor.php | 107 + .../swift/Swift/Plugin/ConnectionRotator.php | 113 + tools/swift/Swift/Plugin/Decorator.php | 259 + .../Swift/Plugin/Decorator/Replacements.php | 77 + tools/swift/Swift/Plugin/Decorator/index.php | 11 + .../Swift/Plugin/EasySwiftResponseTracker.php | 46 + tools/swift/Swift/Plugin/FileEmbedder.php | 428 + tools/swift/Swift/Plugin/MailSend.php | 170 + tools/swift/Swift/Plugin/Throttler.php | 168 + tools/swift/Swift/Plugin/VerboseSending.php | 88 + .../Plugin/VerboseSending/AbstractView.php | 26 + .../Plugin/VerboseSending/DefaultView.php | 50 + .../Swift/Plugin/VerboseSending/index.php | 11 + tools/swift/Swift/Plugin/index.php | 11 + tools/swift/Swift/RecipientList.php | 234 + tools/swift/Swift/index.php | 11 + tools/swift/index.php | 11 + .../taasc/AddressStandardizationSolution.php | 1684 ++ tools/tar/Archive_Tar.php | 1764 ++ translations/de/admin.php | 3043 +++ translations/de/errors.php | 434 + translations/de/fields.php | 472 + translations/de/index.php | 11 + translations/de/pdf.php | 68 + translations/en/admin.php | 2923 +++ translations/en/errors.php | 6 + translations/en/fields.php | 120 + translations/en/index.php | 11 + translations/en/pdf.php | 7 + translations/es/admin.php | 3075 +++ translations/es/errors.php | 532 + translations/es/fields.php | 518 + translations/es/index.php | 11 + translations/es/pdf.php | 68 + translations/export/index.php | 11 + translations/fr/admin.php | 3171 ++++ translations/fr/errors.php | 538 + translations/fr/fields.php | 539 + translations/fr/index.php | 11 + translations/fr/pdf.php | 68 + translations/index.php | 11 + translations/it/admin.php | 2974 +++ translations/it/errors.php | 428 + translations/it/fields.php | 470 + translations/it/index.php | 11 + translations/it/pdf.php | 67 + upload/index.php | 11 + webservice/dispatcher.php | 103 + webservice/index.php | 36 + 5398 files changed, 482149 insertions(+) create mode 100644 404.php create mode 100644 CHANGELOG create mode 100644 address.php create mode 100644 addresses.php create mode 100644 admin-dev/ajax.php create mode 100755 admin-dev/ajax_category_list.php create mode 100644 admin-dev/ajax_lang_packs.php create mode 100644 admin-dev/ajax_products_list.php create mode 100644 admin-dev/ajax_send_mail_test.php create mode 100755 admin-dev/ajaxfilemanager/_ajax_get_details_listing.php create mode 100755 admin-dev/ajaxfilemanager/_ajax_get_thumbnail_listing.php create mode 100755 admin-dev/ajaxfilemanager/_ajax_load_folders.php create mode 100755 admin-dev/ajaxfilemanager/ajax_create_folder.php create mode 100755 admin-dev/ajaxfilemanager/ajax_delete_file.php create mode 100755 admin-dev/ajaxfilemanager/ajax_download.php create mode 100755 admin-dev/ajaxfilemanager/ajax_editor_reset.php create mode 100755 admin-dev/ajaxfilemanager/ajax_file_copy.php create mode 100755 admin-dev/ajaxfilemanager/ajax_file_cut.php create mode 100755 admin-dev/ajaxfilemanager/ajax_file_paste.php create mode 100755 admin-dev/ajaxfilemanager/ajax_file_upload.php create mode 100755 admin-dev/ajaxfilemanager/ajax_get_file_listing.php create mode 100755 admin-dev/ajaxfilemanager/ajax_get_folder_listing.php create mode 100755 admin-dev/ajaxfilemanager/ajax_image_editor.php create mode 100755 admin-dev/ajaxfilemanager/ajax_image_save.php create mode 100755 admin-dev/ajaxfilemanager/ajax_image_thumbnail.php create mode 100755 admin-dev/ajaxfilemanager/ajax_image_undo.php create mode 100755 admin-dev/ajaxfilemanager/ajax_login.php create mode 100755 admin-dev/ajaxfilemanager/ajax_preview.php create mode 100755 admin-dev/ajaxfilemanager/ajax_save_as_form.php create mode 100755 admin-dev/ajaxfilemanager/ajax_save_name.php create mode 100755 admin-dev/ajaxfilemanager/ajax_save_text.php create mode 100755 admin-dev/ajaxfilemanager/ajax_text_editor.php create mode 100755 admin-dev/ajaxfilemanager/ajaxfilemanager.php create mode 100755 admin-dev/ajaxfilemanager/debug.html create mode 100755 admin-dev/ajaxfilemanager/inc/class.auth.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.file.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.history.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.image.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.manager.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.pagination.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.search.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.session.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.sessionaction.php create mode 100755 admin-dev/ajaxfilemanager/inc/class.upload.php create mode 100755 admin-dev/ajaxfilemanager/inc/config.base.php create mode 100755 admin-dev/ajaxfilemanager/inc/config.php create mode 100755 admin-dev/ajaxfilemanager/inc/config.tinymce.php create mode 100755 admin-dev/ajaxfilemanager/inc/data.php create mode 100755 admin-dev/ajaxfilemanager/inc/function.base.php create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaxfilemanager.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaxfilemanager_c.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaxfileupload.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaximageeditor.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaximageeditor_c.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaxtexteditor.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/ajaxtexteditor_c.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/calendar.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/contextmenu.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area.css create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area_full.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/close.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/fullscreen.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/go_to_line.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/help.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/highlight.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/load.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/move.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/newdocument.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/opacity.png create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/processing.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/redo.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/reset_highlight.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/save.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/save_as.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/search.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/smooth_selection.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/spacer.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/statusbar_resize.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/images/undo.gif create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/de.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/dk.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/en.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/fr.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/hr.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/it.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/ja.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/nl.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pl.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pt.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/langs/zh_cn.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/basic.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/brainfuck.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/c.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/cpp.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/css.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/html.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/js.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/pas.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/php.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/python.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/vb.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/xml.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/for_fckeditor.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/for_form.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/for_stand_alone.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/for_tinymce.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/form.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/interface.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/iresizable.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/iutil.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/jquery.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/media.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/rotate.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/select.js create mode 100755 admin-dev/ajaxfilemanager/jscripts/thickbox.js create mode 100755 admin-dev/ajaxfilemanager/langs/en.php create mode 100755 admin-dev/ajaxfilemanager/langs/zh.php create mode 100755 admin-dev/ajaxfilemanager/mediaplayer.swf create mode 100755 admin-dev/ajaxfilemanager/session/gc_counter.ajax.php create mode 100755 admin-dev/ajaxfilemanager/session/gc_log.ajax.php create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/ajaximageeditor.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/ajaxtexteditor.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/fckeditor.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/form.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/ie6.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/jqModal.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/jquery-calendar.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/login.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/template.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/thickbox.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/css/tinymce.css create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/copy.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/copy_flag.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/cut.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/cut_flag.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/delete.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/folder_add.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/folder_explore.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/page_add.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/paste.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/refresh.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/tickAll.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/uncheckAll.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/unzip.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/upload.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/action/zip.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/add.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/ajaxLoading.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/arrow_right.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileAcrobat.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileCode.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileExcel.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileExe.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileFlash.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileMusic.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/filePicture.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/filePowerpoint.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileRTF.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileText.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileUnknown.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileVideo.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileWord.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileXml.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/fileZip.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/folder.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/big_icon/folderEmpty.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/button.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/close.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/copy.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/copy_flag.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/cut.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/cut_flag.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/date_picker.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/delete.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileAcrobat.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileCode.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileExcel.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileExe.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileFlash.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileMusic.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/filePicture.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/filePowerpoint.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileRTF.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileText.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileUnknown.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileVideo.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileWord.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileXml.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/fileZip.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/folder.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/folderEmpty.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/file_type/folderParent.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/flagYes.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/flagno.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/folder.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/folder_explore.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/go_parent.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/header.jpg create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/info.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/loadingAnimation.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/pagination/pagination_left.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/pagination/pagination_right.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/panel_bg.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/paste.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/player.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/refresh.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/shadow.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/add.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/ajaxLoading.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/arrow_right.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/button.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/close.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/date_picker.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/flagno.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/flagyes.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/folder.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/folder_explore.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/go_parent.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/header.jpg create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/info.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/loadingAnimation.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/panel_bg.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/player.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/shadow.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/transparentpixel.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/standard/uploadProcessing.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/tickAll.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/transparentpixel.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/uncheckAll.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/unzip.png create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/uploadProcessing.gif create mode 100755 admin-dev/ajaxfilemanager/theme/default/images/zip.png create mode 100644 admin-dev/backup.php create mode 100644 admin-dev/backups/.htaccess create mode 100644 admin-dev/backups/index.php create mode 100644 admin-dev/confirm.php create mode 100644 admin-dev/displayImage.php create mode 100644 admin-dev/drawer.php create mode 100644 admin-dev/footer.inc.php create mode 100644 admin-dev/functions.php create mode 100644 admin-dev/get-file-admin.php create mode 100644 admin-dev/grider.php create mode 100644 admin-dev/header.inc.php create mode 100644 admin-dev/import/.htaccess create mode 100644 admin-dev/import/index.php create mode 100644 admin-dev/index.php create mode 100644 admin-dev/init.php create mode 100644 admin-dev/login.php create mode 100644 admin-dev/password.php create mode 100644 admin-dev/pdf.php create mode 100644 admin-dev/searchcron.php create mode 100755 admin-dev/tabs/.htaccess create mode 100644 admin-dev/tabs/AdminAccess.php create mode 100644 admin-dev/tabs/AdminAddonsCatalog.php create mode 100644 admin-dev/tabs/AdminAddonsMyAccount.php create mode 100644 admin-dev/tabs/AdminAddresses.php create mode 100644 admin-dev/tabs/AdminAliases.php create mode 100644 admin-dev/tabs/AdminAppearance.php create mode 100644 admin-dev/tabs/AdminAttachments.php create mode 100644 admin-dev/tabs/AdminAttributeGenerator.php create mode 100644 admin-dev/tabs/AdminAttributes.php create mode 100644 admin-dev/tabs/AdminAttributesGroups.php create mode 100644 admin-dev/tabs/AdminBackup.php create mode 100644 admin-dev/tabs/AdminCMS.php create mode 100644 admin-dev/tabs/AdminCMSCategories.php create mode 100644 admin-dev/tabs/AdminCMSContent.php create mode 100644 admin-dev/tabs/AdminCarriers.php create mode 100644 admin-dev/tabs/AdminCarts.php create mode 100644 admin-dev/tabs/AdminCatalog.php create mode 100644 admin-dev/tabs/AdminCategories.php create mode 100644 admin-dev/tabs/AdminContact.php create mode 100644 admin-dev/tabs/AdminContacts.php create mode 100644 admin-dev/tabs/AdminCountries.php create mode 100644 admin-dev/tabs/AdminCounty.php create mode 100644 admin-dev/tabs/AdminCurrencies.php create mode 100644 admin-dev/tabs/AdminCustomerThreads.php create mode 100644 admin-dev/tabs/AdminCustomers.php create mode 100644 admin-dev/tabs/AdminDb.php create mode 100644 admin-dev/tabs/AdminDeliverySlip.php create mode 100644 admin-dev/tabs/AdminDiscounts.php create mode 100644 admin-dev/tabs/AdminEmails.php create mode 100644 admin-dev/tabs/AdminEmployees.php create mode 100644 admin-dev/tabs/AdminFeatures.php create mode 100644 admin-dev/tabs/AdminFeaturesValues.php create mode 100644 admin-dev/tabs/AdminGenerator.php create mode 100755 admin-dev/tabs/AdminGeolocation.php create mode 100755 admin-dev/tabs/AdminGroupShop.php create mode 100644 admin-dev/tabs/AdminGroups.php create mode 100644 admin-dev/tabs/AdminHome.php create mode 100644 admin-dev/tabs/AdminImageResize.php create mode 100644 admin-dev/tabs/AdminImages.php create mode 100644 admin-dev/tabs/AdminImport.php create mode 100644 admin-dev/tabs/AdminInformation.php create mode 100644 admin-dev/tabs/AdminInvoices.php create mode 100644 admin-dev/tabs/AdminLanguages.php create mode 100644 admin-dev/tabs/AdminLocalization.php create mode 100644 admin-dev/tabs/AdminLogs.php create mode 100644 admin-dev/tabs/AdminManufacturers.php create mode 100644 admin-dev/tabs/AdminMessages.php create mode 100644 admin-dev/tabs/AdminMeta.php create mode 100644 admin-dev/tabs/AdminModules.php create mode 100644 admin-dev/tabs/AdminModulesPositions.php create mode 100644 admin-dev/tabs/AdminOrderMessage.php create mode 100644 admin-dev/tabs/AdminOrders.php create mode 100644 admin-dev/tabs/AdminOrdersStates.php create mode 100644 admin-dev/tabs/AdminPDF.php create mode 100644 admin-dev/tabs/AdminPPreferences.php create mode 100644 admin-dev/tabs/AdminPayment.php create mode 100644 admin-dev/tabs/AdminPerformance.php create mode 100644 admin-dev/tabs/AdminPreferences.php create mode 100644 admin-dev/tabs/AdminProducts.php create mode 100644 admin-dev/tabs/AdminProfiles.php create mode 100644 admin-dev/tabs/AdminQuickAccesses.php create mode 100644 admin-dev/tabs/AdminRangePrice.php create mode 100644 admin-dev/tabs/AdminRangeWeight.php create mode 100644 admin-dev/tabs/AdminReferrers.php create mode 100644 admin-dev/tabs/AdminReturn.php create mode 100644 admin-dev/tabs/AdminReturnStates.php create mode 100644 admin-dev/tabs/AdminScenes.php create mode 100644 admin-dev/tabs/AdminSearch.php create mode 100644 admin-dev/tabs/AdminSearchConf.php create mode 100644 admin-dev/tabs/AdminSearchEngines.php create mode 100644 admin-dev/tabs/AdminShipping.php create mode 100755 admin-dev/tabs/AdminShop.php create mode 100755 admin-dev/tabs/AdminShopUrl.php create mode 100644 admin-dev/tabs/AdminSlip.php create mode 100644 admin-dev/tabs/AdminStates.php create mode 100644 admin-dev/tabs/AdminStats.php create mode 100644 admin-dev/tabs/AdminStatsConf.php create mode 100644 admin-dev/tabs/AdminStatsTab.php create mode 100644 admin-dev/tabs/AdminStatuses.php create mode 100755 admin-dev/tabs/AdminStockMvt.php create mode 100644 admin-dev/tabs/AdminStores.php create mode 100644 admin-dev/tabs/AdminSubDomains.php create mode 100644 admin-dev/tabs/AdminSuppliers.php create mode 100644 admin-dev/tabs/AdminTabs.php create mode 100644 admin-dev/tabs/AdminTags.php create mode 100755 admin-dev/tabs/AdminTaxRulesGroup.php create mode 100644 admin-dev/tabs/AdminTaxes.php create mode 100644 admin-dev/tabs/AdminThemes.php create mode 100644 admin-dev/tabs/AdminTools.php create mode 100644 admin-dev/tabs/AdminTracking.php create mode 100644 admin-dev/tabs/AdminTranslations.php create mode 100755 admin-dev/tabs/AdminWebservice.php create mode 100644 admin-dev/tabs/AdminZones.php create mode 100644 admin-dev/themes/flashyturtle/admin.css create mode 100644 admin-dev/themes/flashyturtle/bg-lang.png create mode 100644 admin-dev/themes/flashyturtle/bg-quick.png create mode 100644 admin-dev/themes/flashyturtle/bg-subtab.png create mode 100644 admin-dev/themes/flashyturtle/bg-tab.png create mode 100644 admin-dev/themes/flashyturtle/bg-top.png create mode 100644 admin-dev/themes/flashyturtle/button-bg.png create mode 100644 admin-dev/themes/flashyturtle/center_btn_filter.png create mode 100644 admin-dev/themes/flashyturtle/footer-bg.png create mode 100644 admin-dev/themes/flashyturtle/header_module.png create mode 100644 admin-dev/themes/flashyturtle/searchbar.png create mode 100644 admin-dev/themes/flashyturtle/searchbutton.png create mode 100644 admin-dev/themes/flashyturtle/separator_subnav.png create mode 100644 admin-dev/themes/flashyturtle/thead.png create mode 100644 admin-dev/themes/oldschool/admin.css create mode 100644 admin-dev/themes/oldschool/bg-lang.png create mode 100644 admin-dev/themes/oldschool/bg-quick.png create mode 100644 admin-dev/themes/oldschool/bg-subtab.png create mode 100644 admin-dev/themes/oldschool/bg-tab.png create mode 100644 admin-dev/themes/oldschool/button-bg.png create mode 100644 admin-dev/themes/oldschool/footer-bg.png create mode 100644 admin-dev/themes/oldschool/header_module.png create mode 100644 admin-dev/themes/oldschool/news-bg.gif create mode 100644 admin-dev/themes/oldschool/searchbar.png create mode 100644 admin-dev/themes/oldschool/searchbutton.gif create mode 100644 admin-dev/themes/oldschool/separator_subnav.png create mode 100644 admin-dev/themes/oldschool/submenu-bg.gif create mode 100644 admin-dev/themes/oldschool/tab_right.gif create mode 100644 admin-dev/themes/oldschool/thead.png create mode 100644 admin-dev/themes/origins/admin.css create mode 100644 admin-dev/themes/origins/bg-lang.png create mode 100644 admin-dev/themes/origins/bg-quick.png create mode 100644 admin-dev/themes/origins/bg-subtab.png create mode 100644 admin-dev/themes/origins/bg-tab.png create mode 100644 admin-dev/themes/origins/bg-top.png create mode 100644 admin-dev/themes/origins/button-bg.png create mode 100644 admin-dev/themes/origins/footer-bg.png create mode 100644 admin-dev/themes/origins/header_module.png create mode 100644 admin-dev/themes/origins/img/t/AdminAddonsCatalog.gif create mode 100644 admin-dev/themes/origins/img/t/AdminAddonsMyAccount.gif create mode 100644 admin-dev/themes/origins/img/t/AdminCatalog.gif create mode 100644 admin-dev/themes/origins/img/t/AdminCustomers.gif create mode 100644 admin-dev/themes/origins/img/t/AdminEmployees.gif create mode 100644 admin-dev/themes/origins/img/t/AdminModules.gif create mode 100644 admin-dev/themes/origins/img/t/AdminModulesPositions.gif create mode 100644 admin-dev/themes/origins/img/t/AdminOrders.gif create mode 100644 admin-dev/themes/origins/img/t/AdminPayment.gif create mode 100644 admin-dev/themes/origins/img/t/AdminPreferences.gif create mode 100644 admin-dev/themes/origins/img/t/AdminShipping.gif create mode 100644 admin-dev/themes/origins/img/t/AdminStats.gif create mode 100755 admin-dev/themes/origins/img/t/AdminStockMvt.gif create mode 100644 admin-dev/themes/origins/img/t/AdminStores.gif create mode 100644 admin-dev/themes/origins/img/t/AdminTools.gif create mode 100644 admin-dev/themes/origins/news-bg.gif create mode 100644 admin-dev/themes/origins/searchbar.png create mode 100644 admin-dev/themes/origins/searchbutton.png create mode 100644 admin-dev/themes/origins/separator_subnav.png create mode 100644 admin-dev/themes/origins/tab_right.gif create mode 100644 admin-dev/themes/origins/thead.png create mode 100644 admin-dev/uploadProductFile.php create mode 100644 attachment.php create mode 100644 authentication.php create mode 100644 best-sales.php create mode 100644 cart.php create mode 100644 category.php create mode 100644 changecurrency.php create mode 100755 classes/.htaccess create mode 100644 classes/AbstractLogger.php create mode 100644 classes/Address.php create mode 100644 classes/AddressFormat.php create mode 100644 classes/AdminTab.php create mode 100644 classes/Alias.php create mode 100644 classes/Attachment.php create mode 100644 classes/Attribute.php create mode 100644 classes/AttributeGroup.php create mode 100644 classes/Backup.php create mode 100644 classes/Blowfish.php create mode 100644 classes/CMS.php create mode 100644 classes/CMSCategory.php create mode 100755 classes/Cache.php create mode 100755 classes/CacheFS.php create mode 100644 classes/Carrier.php create mode 100644 classes/CarrierModule.php create mode 100644 classes/Cart.php create mode 100644 classes/Category.php create mode 100644 classes/Chart.php create mode 100644 classes/Combination.php create mode 100644 classes/Configuration.php create mode 100644 classes/Connection.php create mode 100644 classes/ConnectionsSource.php create mode 100644 classes/Contact.php create mode 100644 classes/ControllerFactory.php create mode 100644 classes/Cookie.php create mode 100644 classes/Country.php create mode 100644 classes/County.php create mode 100644 classes/Currency.php create mode 100644 classes/Customer.php create mode 100644 classes/CustomerMessage.php create mode 100644 classes/CustomerThread.php create mode 100644 classes/Customization.php create mode 100644 classes/DateRange.php create mode 100644 classes/Db.php create mode 100644 classes/Delivery.php create mode 100644 classes/Discount.php create mode 100644 classes/Dispatcher.php create mode 100644 classes/Employee.php create mode 100644 classes/Feature.php create mode 100644 classes/FeatureValue.php create mode 100644 classes/FileLogger.php create mode 100755 classes/FrontController.php create mode 100644 classes/Group.php create mode 100644 classes/GroupReduction.php create mode 100755 classes/GroupShop.php create mode 100644 classes/Guest.php create mode 100644 classes/HelpAccess.php create mode 100644 classes/Hook.php create mode 100644 classes/Image.php create mode 100644 classes/ImageType.php create mode 100644 classes/ImportModule.php create mode 100644 classes/Language.php create mode 100644 classes/Link.php create mode 100644 classes/LocalizationPack.php create mode 100644 classes/Logger.php create mode 100755 classes/MCached.php create mode 100644 classes/Mail.php create mode 100644 classes/Manufacturer.php create mode 100644 classes/Message.php create mode 100644 classes/Meta.php create mode 100644 classes/Module.php create mode 100644 classes/ModuleGraph.php create mode 100644 classes/ModuleGraphEngine.php create mode 100644 classes/ModuleGrid.php create mode 100644 classes/ModuleGridEngine.php create mode 100644 classes/MySQL.php create mode 100644 classes/ObjectModel.php create mode 100644 classes/Order.php create mode 100644 classes/OrderDetail.php create mode 100644 classes/OrderDiscount.php create mode 100644 classes/OrderHistory.php create mode 100644 classes/OrderMessage.php create mode 100644 classes/OrderReturn.php create mode 100644 classes/OrderReturnState.php create mode 100644 classes/OrderSlip.php create mode 100644 classes/OrderState.php create mode 100644 classes/PDF.php create mode 100644 classes/Pack.php create mode 100644 classes/Page.php create mode 100644 classes/PaymentCC.php create mode 100644 classes/PaymentModule.php create mode 100644 classes/Product.php create mode 100644 classes/ProductDownload.php create mode 100644 classes/ProductSale.php create mode 100644 classes/Profile.php create mode 100644 classes/QuickAccess.php create mode 100644 classes/RangePrice.php create mode 100644 classes/RangeWeight.php create mode 100644 classes/Referrer.php create mode 100644 classes/Rijndael.php create mode 100644 classes/Scene.php create mode 100644 classes/Search.php create mode 100644 classes/SearchEngine.php create mode 100644 classes/Shop.php create mode 100755 classes/ShopUrl.php create mode 100644 classes/SpecificPrice.php create mode 100644 classes/State.php create mode 100755 classes/Stock.php create mode 100755 classes/StockMvt.php create mode 100755 classes/StockMvtReason.php create mode 100644 classes/Store.php create mode 100644 classes/SubDomain.php create mode 100644 classes/Supplier.php create mode 100644 classes/Tab.php create mode 100644 classes/Tag.php create mode 100644 classes/Tax.php create mode 100644 classes/TaxRule.php create mode 100644 classes/TaxRulesGroup.php create mode 100644 classes/Theme.php create mode 100644 classes/Tools.php create mode 100755 classes/TranslatedConfiguration.php create mode 100644 classes/Validate.php create mode 100755 classes/WebserviceException.php create mode 100755 classes/WebserviceKey.php create mode 100755 classes/WebserviceOutputBuilder.php create mode 100755 classes/WebserviceOutputInterface.php create mode 100755 classes/WebserviceOutputXML.php create mode 100644 classes/WebserviceRequest.php create mode 100755 classes/WebserviceSpecificManagementImages.php create mode 100755 classes/WebserviceSpecificManagementInterface.php create mode 100755 classes/WebserviceSpecificManagementSearch.php create mode 100644 classes/Zone.php create mode 100644 classes/index.php create mode 100644 cms.php create mode 100755 config/.htaccess create mode 100644 config/autoload.php create mode 100644 config/config.inc.php create mode 100755 config/defines.inc.php create mode 100644 config/index.php create mode 100755 config/modules_list.xml create mode 100644 config/smarty.config.inc.php create mode 100644 contact-form.php create mode 100644 controllers/AddressController.php create mode 100644 controllers/AddressesController.php create mode 100644 controllers/AttachmentController.php create mode 100644 controllers/AuthController.php create mode 100644 controllers/BestSalesController.php create mode 100644 controllers/CMSController.php create mode 100644 controllers/CartController.php create mode 100644 controllers/CategoryController.php create mode 100644 controllers/ChangeCurrencyController.php create mode 100644 controllers/CompareController.php create mode 100644 controllers/ContactController.php create mode 100644 controllers/DiscountController.php create mode 100644 controllers/GetFileController.php create mode 100644 controllers/GuestTrackingController.php create mode 100644 controllers/HistoryController.php create mode 100644 controllers/IdentityController.php create mode 100644 controllers/IndexController.php create mode 100644 controllers/ManufacturerController.php create mode 100644 controllers/MyAccountController.php create mode 100644 controllers/NewProductsController.php create mode 100644 controllers/OrderConfirmationController.php create mode 100644 controllers/OrderController.php create mode 100644 controllers/OrderDetailController.php create mode 100644 controllers/OrderFollowController.php create mode 100644 controllers/OrderOpcController.php create mode 100644 controllers/OrderReturnController.php create mode 100644 controllers/OrderSlipController.php create mode 100644 controllers/PageNotFoundController.php create mode 100644 controllers/ParentOrderController.php create mode 100644 controllers/PasswordController.php create mode 100644 controllers/PdfInvoiceController.php create mode 100644 controllers/PricesDropController.php create mode 100644 controllers/ProductController.php create mode 100644 controllers/SearchController.php create mode 100644 controllers/SitemapController.php create mode 100644 controllers/StatisticsController.php create mode 100644 controllers/StoresController.php create mode 100644 controllers/SupplierController.php create mode 100644 controllers/pdfOrderReturnController.php create mode 100644 controllers/pdfOrderSlipController.php create mode 100644 css/admin-ie.css create mode 100644 css/admin.css create mode 100644 css/csshover.htc.htc create mode 100644 css/datePicker.css create mode 100644 css/index.php create mode 100644 css/install.css create mode 100755 css/jquery-ui-1.8.10.custom.css create mode 100644 css/jquery.autocomplete.css create mode 100644 css/jquery.cluetip.css create mode 100644 css/jquery.fancybox-1.3.4.css create mode 100644 css/jquery.jgrowl.css create mode 100644 css/jqzoom.css create mode 100644 css/login.css create mode 100644 css/tabpane.css create mode 100644 css/thickbox.css create mode 100644 discount.php create mode 100644 docs/dev/dbmodel.mwb create mode 100644 docs/licences/cropper.txt create mode 100644 docs/licences/fpdf.txt create mode 100644 docs/licences/index.php create mode 100644 docs/licences/open-software-3.0.txt create mode 100644 docs/licences/pclzip.txt create mode 100644 docs/licences/tinymce-smarty-swift.txt create mode 100644 download/.htaccess create mode 100644 download/index.php create mode 100644 footer.php create mode 100644 get-file.php create mode 100644 guest-tracking.php create mode 100644 header.php create mode 100644 history.php create mode 100644 identity.php create mode 100644 images.inc.php create mode 100644 img/404.gif create mode 100644 img/admin/AdminBackup.gif create mode 100644 img/admin/AdminCatalog.gif create mode 100644 img/admin/AdminCustomers.gif create mode 100644 img/admin/AdminEmployees.gif create mode 100644 img/admin/AdminModules.gif create mode 100644 img/admin/AdminNext.gif create mode 100644 img/admin/AdminOrders.gif create mode 100644 img/admin/AdminPayment.gif create mode 100644 img/admin/AdminPreferences.gif create mode 100644 img/admin/AdminShipping.gif create mode 100644 img/admin/AdminStats.gif create mode 100644 img/admin/AdminTools.gif create mode 100644 img/admin/___info-ca.gif create mode 100644 img/admin/access.png create mode 100644 img/admin/add-btn.png create mode 100644 img/admin/add.gif create mode 100644 img/admin/add_2.gif create mode 100644 img/admin/addresses_edit.gif create mode 100644 img/admin/affiliation.png create mode 100644 img/admin/ajax-loader.gif create mode 100644 img/admin/appearance.gif create mode 100644 img/admin/arrow-left.png create mode 100644 img/admin/arrow-right.png create mode 100644 img/admin/arrow.gif create mode 100644 img/admin/arrow2.gif create mode 100644 img/admin/arrow_down.png create mode 100755 img/admin/arrow_in.png create mode 100755 img/admin/arrow_out.png create mode 100644 img/admin/arrow_up.png create mode 100644 img/admin/asterisk.gif create mode 100644 img/admin/barcode.gif create mode 100644 img/admin/basket_error.png create mode 100644 img/admin/bg.png create mode 100644 img/admin/bg_2.png create mode 100644 img/admin/bg_login.gif create mode 100644 img/admin/bg_pslink.png create mode 100644 img/admin/binoculars.png create mode 100644 img/admin/blank.gif create mode 100644 img/admin/block_bg.jpg create mode 100644 img/admin/calendar.png create mode 100644 img/admin/cart.gif create mode 100644 img/admin/catalog_xl.png create mode 100644 img/admin/center_btn_filter.png create mode 100644 img/admin/charged_ko.gif create mode 100644 img/admin/charged_ok.gif create mode 100644 img/admin/close-white.png create mode 100644 img/admin/close.png create mode 100644 img/admin/cms.gif create mode 100644 img/admin/cog.gif create mode 100644 img/admin/color.png create mode 100644 img/admin/colorpicker.png create mode 100644 img/admin/comment.gif create mode 100644 img/admin/commercial.gif create mode 100644 img/admin/computer_key.png create mode 100644 img/admin/contact.gif create mode 100644 img/admin/copy_files.gif create mode 100644 img/admin/coupon.gif create mode 100644 img/admin/customer_xl.png create mode 100644 img/admin/database_gear.gif create mode 100644 img/admin/date.gif create mode 100644 img/admin/date.png create mode 100644 img/admin/delete.gif create mode 100644 img/admin/delivery.gif create mode 100644 img/admin/delivery_ko.gif create mode 100644 img/admin/details.gif create mode 100644 img/admin/disabled.gif create mode 100644 img/admin/dollar.gif create mode 100755 img/admin/down-white.gif create mode 100644 img/admin/down.gif create mode 100644 img/admin/down_d.gif create mode 100644 img/admin/download_page.png create mode 100644 img/admin/duplicate.gif create mode 100644 img/admin/duplicate.png create mode 100644 img/admin/edit.gif create mode 100644 img/admin/edit_2.gif create mode 100644 img/admin/email.gif create mode 100644 img/admin/email_edit.gif create mode 100644 img/admin/employee.gif create mode 100644 img/admin/employees_xl.png create mode 100644 img/admin/enabled-2.gif create mode 100644 img/admin/enabled.gif create mode 100644 img/admin/error.png create mode 100644 img/admin/error2.png create mode 100644 img/admin/exchangesrate.gif create mode 100644 img/admin/export.gif create mode 100644 img/admin/female.gif create mode 100644 img/admin/female_2.gif create mode 100644 img/admin/filter.png create mode 100644 img/admin/folder.gif create mode 100644 img/admin/forbbiden.gif create mode 100644 img/admin/gold.gif create mode 100644 img/admin/google.gif create mode 100755 img/admin/graybar.jpg create mode 100755 img/admin/green-gradient.png create mode 100755 img/admin/greenlight-gradient.png create mode 100755 img/admin/grid.gif create mode 100644 img/admin/group.gif create mode 100644 img/admin/help-new.png create mode 100644 img/admin/help.png create mode 100644 img/admin/help2.png create mode 100644 img/admin/home.gif create mode 100644 img/admin/home.png create mode 100644 img/admin/htaccess.gif create mode 100644 img/admin/import.gif create mode 100644 img/admin/index.php create mode 100644 img/admin/info.png create mode 100644 img/admin/information.png create mode 100644 img/admin/invoice.gif create mode 100644 img/admin/less.png create mode 100644 img/admin/list-next.gif create mode 100644 img/admin/list-next2.gif create mode 100644 img/admin/list-prev.gif create mode 100644 img/admin/list-prev2.gif create mode 100644 img/admin/localization.gif create mode 100644 img/admin/login-bg.jpg create mode 100644 img/admin/lv1.gif create mode 100644 img/admin/lv1.png create mode 100644 img/admin/lv2_b.gif create mode 100644 img/admin/lv2_b.png create mode 100644 img/admin/lv2_f.gif create mode 100644 img/admin/lv2_f.png create mode 100644 img/admin/lv3_b.png create mode 100644 img/admin/lv3_f.png create mode 100644 img/admin/lv4_b.png create mode 100644 img/admin/lv4_f.png create mode 100644 img/admin/lv5_b.png create mode 100644 img/admin/lv5_f.png create mode 100755 img/admin/lvl_0.gif create mode 100755 img/admin/lvl_1.gif create mode 100644 img/admin/male.gif create mode 100644 img/admin/male_2.gif create mode 100644 img/admin/manufacturers.gif create mode 100644 img/admin/medal.png create mode 100644 img/admin/meta100.png create mode 100644 img/admin/metatags.gif create mode 100644 img/admin/module_disabled.png create mode 100644 img/admin/module_install.png create mode 100644 img/admin/module_notinstall.png create mode 100644 img/admin/module_warning.png create mode 100644 img/admin/money.gif create mode 100644 img/admin/money.png create mode 100644 img/admin/more.png create mode 100644 img/admin/msg-forward.png create mode 100644 img/admin/msg-is-pending.png create mode 100644 img/admin/msg-ok.png create mode 100644 img/admin/msg-pending.png create mode 100644 img/admin/multishop_config.png create mode 100644 img/admin/nav-home.gif create mode 100644 img/admin/nav-logout.gif create mode 100644 img/admin/nav-user.gif create mode 100644 img/admin/navigation.png create mode 100644 img/admin/news-new.gif create mode 100644 img/admin/next-msg.png create mode 100644 img/admin/next.gif create mode 100644 img/admin/ok.gif create mode 100644 img/admin/ok2.png create mode 100755 img/admin/orange-gradient.png create mode 100644 img/admin/page_world.png create mode 100644 img/admin/payment.gif create mode 100644 img/admin/pdf.gif create mode 100644 img/admin/photo.gif create mode 100644 img/admin/photo_add.gif create mode 100644 img/admin/picture.gif create mode 100755 img/admin/pink-gradient.png create mode 100644 img/admin/prefs.gif create mode 100644 img/admin/prestastore.gif create mode 100644 img/admin/previous.gif create mode 100644 img/admin/previous.png create mode 100644 img/admin/printer.gif create mode 100644 img/admin/products.gif create mode 100644 img/admin/profiles.png create mode 100644 img/admin/quick.gif create mode 100644 img/admin/return.gif create mode 100644 img/admin/right_btn_filter.png create mode 100644 img/admin/robots.gif create mode 100644 img/admin/search.gif create mode 100644 img/admin/separator_breadcrum.png create mode 100644 img/admin/separator_filter.png create mode 100644 img/admin/slip.gif create mode 100644 img/admin/stats_xl.png create mode 100644 img/admin/statsettings.gif create mode 100644 img/admin/status_green.gif create mode 100644 img/admin/status_orange.gif create mode 100644 img/admin/status_red.gif create mode 100644 img/admin/subdomain.gif create mode 100644 img/admin/submenu-bg.gif create mode 100644 img/admin/submenu-bg.png create mode 100644 img/admin/submenu-bg_2.png create mode 100644 img/admin/submenu-configuration.gif create mode 100644 img/admin/success.png create mode 100644 img/admin/summary.png create mode 100644 img/admin/supplier.gif create mode 100644 img/admin/suppliers.gif create mode 100644 img/admin/tab-categories.gif create mode 100644 img/admin/tab-contact.gif create mode 100644 img/admin/tab-customers.gif create mode 100644 img/admin/tab-groups.gif create mode 100644 img/admin/tab-invoice.gif create mode 100644 img/admin/tab-orders.gif create mode 100644 img/admin/tab-payment.gif create mode 100644 img/admin/tab-plugins.gif create mode 100644 img/admin/tab-preferences.gif create mode 100644 img/admin/tab-products.gif create mode 100644 img/admin/tab-shipping.gif create mode 100644 img/admin/tab-stats.gif create mode 100644 img/admin/tab-tools.gif create mode 100644 img/admin/tab.gif create mode 100644 img/admin/thead.png create mode 100644 img/admin/themes.gif create mode 100644 img/admin/time.gif create mode 100644 img/admin/translation.gif create mode 100755 img/admin/transparentpixel.gif create mode 100644 img/admin/unknow.gif create mode 100644 img/admin/unknown.gif create mode 100644 img/admin/up.gif create mode 100644 img/admin/up_d.gif create mode 100644 img/admin/visitors.gif create mode 100644 img/admin/warn2.png create mode 100644 img/admin/warning.gif create mode 100644 img/admin/world.gif create mode 100644 img/c/2-category.jpg create mode 100644 img/c/2-large.jpg create mode 100644 img/c/2-medium.jpg create mode 100644 img/c/2-small.jpg create mode 100644 img/c/2.jpg create mode 100644 img/c/3-category.jpg create mode 100644 img/c/3-large.jpg create mode 100644 img/c/3-medium.jpg create mode 100644 img/c/3-small.jpg create mode 100644 img/c/3.jpg create mode 100644 img/c/4-category.jpg create mode 100644 img/c/4-large.jpg create mode 100644 img/c/4-medium.jpg create mode 100644 img/c/4-small.jpg create mode 100644 img/c/4.jpg create mode 100755 img/c/de-default-category.jpg create mode 100755 img/c/de-default-large.jpg create mode 100755 img/c/de-default-medium.jpg create mode 100755 img/c/de-default-small.jpg create mode 100755 img/c/de.jpg create mode 100644 img/c/en-default-category.jpg create mode 100644 img/c/en-default-large.jpg create mode 100644 img/c/en-default-medium.jpg create mode 100644 img/c/en-default-small.jpg create mode 100644 img/c/en.jpg create mode 100644 img/c/es-default-category.jpg create mode 100644 img/c/es-default-large.jpg create mode 100644 img/c/es-default-medium.jpg create mode 100644 img/c/es-default-small.jpg create mode 100644 img/c/es.jpg create mode 100644 img/c/fr-default-category.jpg create mode 100644 img/c/fr-default-large.jpg create mode 100644 img/c/fr-default-medium.jpg create mode 100644 img/c/fr-default-small.jpg create mode 100644 img/c/fr.jpg create mode 100644 img/c/index.php create mode 100755 img/c/it-default-category.jpg create mode 100755 img/c/it-default-large.jpg create mode 100755 img/c/it-default-medium.jpg create mode 100755 img/c/it-default-small.jpg create mode 100755 img/c/it.jpg create mode 100644 img/co/index.php create mode 100644 img/favicon.ico create mode 100644 img/index.php create mode 100755 img/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100755 img/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100755 img/jquery-ui/ui-bg_flat_10_000000_40x100.png create mode 100755 img/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png create mode 100755 img/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png create mode 100755 img/jquery-ui/ui-bg_glass_65_ffffff_1x400.png create mode 100755 img/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100755 img/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100755 img/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100755 img/jquery-ui/ui-icons_222222_256x240.png create mode 100755 img/jquery-ui/ui-icons_228ef1_256x240.png create mode 100755 img/jquery-ui/ui-icons_ef8c08_256x240.png create mode 100755 img/jquery-ui/ui-icons_ffd27a_256x240.png create mode 100755 img/jquery-ui/ui-icons_ffffff_256x240.png create mode 100644 img/l/1.jpg create mode 100644 img/l/2.jpg create mode 100644 img/l/3.jpg create mode 100644 img/l/4.jpg create mode 100644 img/l/5.jpg create mode 100644 img/l/en-default-home.jpg create mode 100644 img/l/en-default-large.jpg create mode 100644 img/l/en-default-large_scene.jpg create mode 100644 img/l/en-default-medium.jpg create mode 100644 img/l/en-default-small.jpg create mode 100755 img/l/en-default-thickbox.jpg create mode 100644 img/l/en.jpg create mode 100644 img/l/index.php create mode 100644 img/l/none.jpg create mode 100644 img/loader.gif create mode 100644 img/loadingAnimation.gif create mode 100644 img/logo.jpg create mode 100644 img/logo_stores.gif create mode 100644 img/m/1-large.jpg create mode 100644 img/m/1-medium.jpg create mode 100644 img/m/1-small.jpg create mode 100644 img/m/1.jpg create mode 100644 img/m/2-large.jpg create mode 100644 img/m/2-medium.jpg create mode 100644 img/m/2-small.jpg create mode 100644 img/m/2.jpg create mode 100755 img/m/de-default-large.jpg create mode 100755 img/m/de-default-medium.jpg create mode 100755 img/m/de-default-small.jpg create mode 100755 img/m/de.jpg create mode 100644 img/m/en-default-large.jpg create mode 100644 img/m/en-default-medium.jpg create mode 100644 img/m/en-default-small.jpg create mode 100644 img/m/en.jpg create mode 100644 img/m/es-default-large.jpg create mode 100644 img/m/es-default-medium.jpg create mode 100644 img/m/es-default-small.jpg create mode 100644 img/m/es-default-thickbox.jpg create mode 100644 img/m/es.jpg create mode 100644 img/m/fr-default-large.jpg create mode 100644 img/m/fr-default-medium.jpg create mode 100644 img/m/fr-default-small.jpg create mode 100644 img/m/fr.jpg create mode 100644 img/m/index.php create mode 100755 img/m/it-default-large.jpg create mode 100755 img/m/it-default-medium.jpg create mode 100755 img/m/it-default-small.jpg create mode 100755 img/m/it.jpg create mode 100644 img/macFFBgHack.png create mode 100644 img/os/1.gif create mode 100644 img/os/10.gif create mode 100644 img/os/11.gif create mode 100644 img/os/12.gif create mode 100644 img/os/2.gif create mode 100644 img/os/3.gif create mode 100644 img/os/4.gif create mode 100644 img/os/5.gif create mode 100644 img/os/6.gif create mode 100644 img/os/7.gif create mode 100644 img/os/8.gif create mode 100644 img/os/9.gif create mode 100644 img/os/index.php create mode 100644 img/p/1/5/15-home.jpg create mode 100644 img/p/1/5/15-large.jpg create mode 100644 img/p/1/5/15-medium.jpg create mode 100644 img/p/1/5/15-small.jpg create mode 100644 img/p/1/5/15-thickbox.jpg create mode 100644 img/p/1/5/15.jpg create mode 100644 img/p/1/6/16-home.jpg create mode 100644 img/p/1/6/16-large.jpg create mode 100644 img/p/1/6/16-medium.jpg create mode 100644 img/p/1/6/16-small.jpg create mode 100644 img/p/1/6/16-thickbox.jpg create mode 100644 img/p/1/6/16.jpg create mode 100644 img/p/1/7/17-home.jpg create mode 100644 img/p/1/7/17-large.jpg create mode 100644 img/p/1/7/17-medium.jpg create mode 100644 img/p/1/7/17-small.jpg create mode 100644 img/p/1/7/17-thickbox.jpg create mode 100644 img/p/1/7/17.jpg create mode 100644 img/p/1/8/18-home.jpg create mode 100644 img/p/1/8/18-large.jpg create mode 100644 img/p/1/8/18-medium.jpg create mode 100644 img/p/1/8/18-small.jpg create mode 100644 img/p/1/8/18-thickbox.jpg create mode 100644 img/p/1/8/18.jpg create mode 100644 img/p/1/9/19-home.jpg create mode 100644 img/p/1/9/19-large.jpg create mode 100644 img/p/1/9/19-medium.jpg create mode 100644 img/p/1/9/19-small.jpg create mode 100644 img/p/1/9/19-thickbox.jpg create mode 100644 img/p/1/9/19.jpg create mode 100644 img/p/2-46-home.jpg create mode 100644 img/p/2-46-large.jpg create mode 100644 img/p/2-46-medium.jpg create mode 100644 img/p/2-46-small.jpg create mode 100644 img/p/2-46-thickbox.jpg create mode 100644 img/p/2-46.jpg create mode 100644 img/p/2-47-home.jpg create mode 100644 img/p/2-47-large.jpg create mode 100644 img/p/2-47-medium.jpg create mode 100644 img/p/2-47-small.jpg create mode 100644 img/p/2-47-thickbox.jpg create mode 100644 img/p/2-47.jpg create mode 100644 img/p/2-48-home.jpg create mode 100644 img/p/2-48-large.jpg create mode 100644 img/p/2-48-medium.jpg create mode 100644 img/p/2-48-small.jpg create mode 100644 img/p/2-48-thickbox.jpg create mode 100644 img/p/2-48.jpg create mode 100644 img/p/2-49-home.jpg create mode 100644 img/p/2-49-large.jpg create mode 100644 img/p/2-49-medium.jpg create mode 100644 img/p/2-49-small.jpg create mode 100644 img/p/2-49-thickbox.jpg create mode 100644 img/p/2-49.jpg create mode 100644 img/p/2/0/20-home.jpg create mode 100644 img/p/2/0/20-large.jpg create mode 100644 img/p/2/0/20-medium.jpg create mode 100644 img/p/2/0/20-small.jpg create mode 100644 img/p/2/0/20-thickbox.jpg create mode 100644 img/p/2/0/20.jpg create mode 100644 img/p/2/4/24-home.jpg create mode 100644 img/p/2/4/24-large.jpg create mode 100644 img/p/2/4/24-medium.jpg create mode 100644 img/p/2/4/24-small.jpg create mode 100644 img/p/2/4/24-thickbox.jpg create mode 100644 img/p/2/4/24.jpg create mode 100644 img/p/2/6/26-home.jpg create mode 100644 img/p/2/6/26-large.jpg create mode 100644 img/p/2/6/26-medium.jpg create mode 100644 img/p/2/6/26-small.jpg create mode 100644 img/p/2/6/26-thickbox.jpg create mode 100644 img/p/2/6/26.jpg create mode 100644 img/p/2/7/27-home.jpg create mode 100644 img/p/2/7/27-large.jpg create mode 100644 img/p/2/7/27-medium.jpg create mode 100644 img/p/2/7/27-small.jpg create mode 100644 img/p/2/7/27-thickbox.jpg create mode 100644 img/p/2/7/27.jpg create mode 100644 img/p/2/9/29-home.jpg create mode 100644 img/p/2/9/29-large.jpg create mode 100644 img/p/2/9/29-medium.jpg create mode 100644 img/p/2/9/29-small.jpg create mode 100644 img/p/2/9/29-thickbox.jpg create mode 100644 img/p/2/9/29.jpg create mode 100644 img/p/3/0/30-home.jpg create mode 100644 img/p/3/0/30-large.jpg create mode 100644 img/p/3/0/30-medium.jpg create mode 100644 img/p/3/0/30-small.jpg create mode 100644 img/p/3/0/30-thickbox.jpg create mode 100644 img/p/3/0/30.jpg create mode 100644 img/p/3/2/32-home.jpg create mode 100644 img/p/3/2/32-large.jpg create mode 100644 img/p/3/2/32-medium.jpg create mode 100644 img/p/3/2/32-small.jpg create mode 100644 img/p/3/2/32-thickbox.jpg create mode 100644 img/p/3/2/32.jpg create mode 100644 img/p/3/3-home.jpg create mode 100644 img/p/3/3-large.jpg create mode 100644 img/p/3/3-medium.jpg create mode 100644 img/p/3/3-small.jpg create mode 100644 img/p/3/3-thickbox.jpg create mode 100644 img/p/3/3.jpg create mode 100644 img/p/3/3/33-home.jpg create mode 100644 img/p/3/3/33-large.jpg create mode 100644 img/p/3/3/33-medium.jpg create mode 100644 img/p/3/3/33-small.jpg create mode 100644 img/p/3/3/33-thickbox.jpg create mode 100644 img/p/3/3/33.jpg create mode 100644 img/p/3/6/36-home.jpg create mode 100644 img/p/3/6/36-large.jpg create mode 100644 img/p/3/6/36-medium.jpg create mode 100644 img/p/3/6/36-small.jpg create mode 100644 img/p/3/6/36-thickbox.jpg create mode 100644 img/p/3/6/36.jpg create mode 100644 img/p/3/7/37-home.jpg create mode 100644 img/p/3/7/37-large.jpg create mode 100644 img/p/3/7/37-medium.jpg create mode 100644 img/p/3/7/37-small.jpg create mode 100644 img/p/3/7/37-thickbox.jpg create mode 100644 img/p/3/7/37.jpg create mode 100644 img/p/3/8/38-home.jpg create mode 100644 img/p/3/8/38-large.jpg create mode 100644 img/p/3/8/38-medium.jpg create mode 100644 img/p/3/8/38-small.jpg create mode 100644 img/p/3/8/38-thickbox.jpg create mode 100644 img/p/3/8/38.jpg create mode 100644 img/p/3/9/39-home.jpg create mode 100644 img/p/3/9/39-large.jpg create mode 100644 img/p/3/9/39-medium.jpg create mode 100644 img/p/3/9/39-small.jpg create mode 100644 img/p/3/9/39-thickbox.jpg create mode 100644 img/p/3/9/39.jpg create mode 100644 img/p/4/0/40-home.jpg create mode 100644 img/p/4/0/40-large.jpg create mode 100644 img/p/4/0/40-medium.jpg create mode 100644 img/p/4/0/40-small.jpg create mode 100644 img/p/4/0/40-thickbox.jpg create mode 100644 img/p/4/0/40.jpg create mode 100644 img/p/4/1/41-home.jpg create mode 100644 img/p/4/1/41-large.jpg create mode 100644 img/p/4/1/41-medium.jpg create mode 100644 img/p/4/1/41-small.jpg create mode 100644 img/p/4/1/41-thickbox.jpg create mode 100644 img/p/4/1/41.jpg create mode 100644 img/p/4/2/42-home.jpg create mode 100644 img/p/4/2/42-large.jpg create mode 100644 img/p/4/2/42-medium.jpg create mode 100644 img/p/4/2/42-small.jpg create mode 100644 img/p/4/2/42-thickbox.jpg create mode 100644 img/p/4/2/42.jpg create mode 100644 img/p/4/4/44-home.jpg create mode 100644 img/p/4/4/44-large.jpg create mode 100644 img/p/4/4/44-medium.jpg create mode 100644 img/p/4/4/44-small.jpg create mode 100644 img/p/4/4/44-thickbox.jpg create mode 100644 img/p/4/4/44.jpg create mode 100644 img/p/4/5/45-home.jpg create mode 100644 img/p/4/5/45-large.jpg create mode 100644 img/p/4/5/45-medium.jpg create mode 100644 img/p/4/5/45-small.jpg create mode 100644 img/p/4/5/45-thickbox.jpg create mode 100644 img/p/4/5/45.jpg create mode 100755 img/p/de-default-home.jpg create mode 100755 img/p/de-default-large.jpg create mode 100755 img/p/de-default-medium.jpg create mode 100755 img/p/de-default-small.jpg create mode 100755 img/p/de-default-thickbox.jpg create mode 100755 img/p/de.jpg create mode 100644 img/p/en-default-home.jpg create mode 100644 img/p/en-default-large.jpg create mode 100644 img/p/en-default-medium.jpg create mode 100644 img/p/en-default-small.jpg create mode 100644 img/p/en-default-thickbox.jpg create mode 100644 img/p/en.jpg create mode 100644 img/p/es-default-home.jpg create mode 100644 img/p/es-default-large.jpg create mode 100644 img/p/es-default-medium.jpg create mode 100644 img/p/es-default-small.jpg create mode 100644 img/p/es-default-thickbox.jpg create mode 100644 img/p/es.jpg create mode 100644 img/p/fr-default-home.jpg create mode 100644 img/p/fr-default-large.jpg create mode 100644 img/p/fr-default-medium.jpg create mode 100644 img/p/fr-default-small.jpg create mode 100644 img/p/fr-default-thickbox.jpg create mode 100644 img/p/fr.jpg create mode 100644 img/p/index.php create mode 100755 img/p/it-default-home.jpg create mode 100755 img/p/it-default-large.jpg create mode 100755 img/p/it-default-medium.jpg create mode 100755 img/p/it-default-small.jpg create mode 100755 img/p/it-default-thickbox.jpg create mode 100755 img/p/it.jpg create mode 100644 img/s/index.php create mode 100644 img/scenes/1-large_scene.jpg create mode 100644 img/scenes/1.jpg create mode 100644 img/scenes/2-large_scene.jpg create mode 100644 img/scenes/2.jpg create mode 100644 img/scenes/3-large_scene.jpg create mode 100644 img/scenes/3.jpg create mode 100755 img/scenes/de-default-large_scene.jpg create mode 100755 img/scenes/de-default-thumb_scene.jpg create mode 100644 img/scenes/en-default-large_scene.jpg create mode 100644 img/scenes/en-default-thumb_scene.jpg create mode 100755 img/scenes/es-default-large_scene.jpg create mode 100755 img/scenes/es-default-thumb_scene.jpg create mode 100644 img/scenes/fr-default-large_scene.jpg create mode 100644 img/scenes/fr-default-thumb_scene.jpg create mode 100644 img/scenes/index.php create mode 100755 img/scenes/it-default-large_scene.jpg create mode 100755 img/scenes/it-default-thumb_scene.jpg create mode 100644 img/scenes/thumbs/1-thumb_scene.jpg create mode 100644 img/scenes/thumbs/2-thumb_scene.jpg create mode 100644 img/scenes/thumbs/3-thumb_scene.jpg create mode 100644 img/scenes/thumbs/index.php create mode 100644 img/st/1-medium.jpg create mode 100644 img/st/1.jpg create mode 100644 img/st/2-medium.jpg create mode 100644 img/st/2.jpg create mode 100644 img/st/3-medium.jpg create mode 100644 img/st/3.jpg create mode 100644 img/st/4-medium.jpg create mode 100644 img/st/4.jpg create mode 100644 img/st/5-medium.jpg create mode 100644 img/st/5.jpg create mode 100755 img/st/index.php create mode 100644 img/su/1-large.jpg create mode 100644 img/su/1-medium.jpg create mode 100644 img/su/1-small.jpg create mode 100644 img/su/1.jpg create mode 100644 img/su/2-large.jpg create mode 100644 img/su/2-medium.jpg create mode 100644 img/su/2-small.jpg create mode 100644 img/su/2.jpg create mode 100755 img/su/de-default-large.jpg create mode 100755 img/su/de-default-medium.jpg create mode 100755 img/su/de-default-small.jpg create mode 100755 img/su/de.jpg create mode 100644 img/su/en-default-large.jpg create mode 100644 img/su/en-default-medium.jpg create mode 100644 img/su/en-default-small.jpg create mode 100644 img/su/en.jpg create mode 100755 img/su/es-default-large.jpg create mode 100755 img/su/es-default-medium.jpg create mode 100755 img/su/es-default-small.jpg create mode 100755 img/su/es.jpg create mode 100644 img/su/fr-default-large.jpg create mode 100644 img/su/fr-default-medium.jpg create mode 100644 img/su/fr-default-small.jpg create mode 100644 img/su/fr.jpg create mode 100644 img/su/index.php create mode 100755 img/su/it-default-large.jpg create mode 100755 img/su/it-default-medium.jpg create mode 100755 img/su/it-default-small.jpg create mode 100755 img/su/it.jpg create mode 100644 img/t/0.gif create mode 100644 img/t/AdminAccess.gif create mode 100644 img/t/AdminAddonsCatalog.gif create mode 100644 img/t/AdminAddonsMyAccount.gif create mode 100644 img/t/AdminAddresses.gif create mode 100644 img/t/AdminAliases.gif create mode 100644 img/t/AdminAppearance.gif create mode 100644 img/t/AdminAttachments.gif create mode 100644 img/t/AdminAttributesGroups.gif create mode 100644 img/t/AdminBackup.gif create mode 100644 img/t/AdminCMS.gif create mode 100644 img/t/AdminCMSContent.gif create mode 100644 img/t/AdminCarriers.gif create mode 100644 img/t/AdminCarts.gif create mode 100644 img/t/AdminCatalog.gif create mode 100644 img/t/AdminContact.gif create mode 100644 img/t/AdminContacts.gif create mode 100644 img/t/AdminCountries.gif create mode 100644 img/t/AdminCounty.gif create mode 100644 img/t/AdminCurrencies.gif create mode 100644 img/t/AdminCustomerThreads.gif create mode 100644 img/t/AdminCustomers.gif create mode 100644 img/t/AdminDb.gif create mode 100644 img/t/AdminDeliverySlip.gif create mode 100644 img/t/AdminDiscounts.gif create mode 100644 img/t/AdminEmails.gif create mode 100644 img/t/AdminEmployees.gif create mode 100644 img/t/AdminFeatures.gif create mode 100644 img/t/AdminGenerator.gif create mode 100755 img/t/AdminGeolocalization.gif create mode 100644 img/t/AdminGeolocation.gif create mode 100644 img/t/AdminGroups.gif create mode 100644 img/t/AdminHome.gif create mode 100644 img/t/AdminImages.gif create mode 100644 img/t/AdminImport.gif create mode 100644 img/t/AdminInformation.gif create mode 100644 img/t/AdminInvoices.gif create mode 100644 img/t/AdminLanguages.gif create mode 100644 img/t/AdminLocalization.gif create mode 100755 img/t/AdminLogs.gif create mode 100644 img/t/AdminManufacturers.gif create mode 100644 img/t/AdminMessages.gif create mode 100644 img/t/AdminMeta.gif create mode 100644 img/t/AdminModules.gif create mode 100644 img/t/AdminModulesPositions.gif create mode 100644 img/t/AdminOrderMessage.gif create mode 100644 img/t/AdminOrders.gif create mode 100644 img/t/AdminPDF.gif create mode 100644 img/t/AdminPPreferences.gif create mode 100644 img/t/AdminPayment.gif create mode 100644 img/t/AdminPerformance.gif create mode 100644 img/t/AdminPreferences.gif create mode 100644 img/t/AdminProfiles.gif create mode 100644 img/t/AdminQuickAccesses.gif create mode 100644 img/t/AdminRangePrice.gif create mode 100644 img/t/AdminRangeWeight.gif create mode 100644 img/t/AdminReferrers.gif create mode 100644 img/t/AdminReturn.gif create mode 100644 img/t/AdminScenes.gif create mode 100644 img/t/AdminSearch.gif create mode 100644 img/t/AdminSearchConf.gif create mode 100644 img/t/AdminSearchEngines.gif create mode 100644 img/t/AdminShipping.gif create mode 100644 img/t/AdminShop.gif create mode 100644 img/t/AdminSlip.gif create mode 100644 img/t/AdminStates.gif create mode 100644 img/t/AdminStats.gif create mode 100644 img/t/AdminStatsConf.gif create mode 100644 img/t/AdminStatsModules.gif create mode 100644 img/t/AdminStatuses.gif create mode 100755 img/t/AdminStockMvt.gif create mode 100644 img/t/AdminStores.gif create mode 100644 img/t/AdminSubDomains.gif create mode 100644 img/t/AdminSuppliers.gif create mode 100644 img/t/AdminTabs.gif create mode 100644 img/t/AdminTags.gif create mode 100755 img/t/AdminTaxRulesGroup.gif create mode 100644 img/t/AdminTaxes.gif create mode 100644 img/t/AdminThemes.gif create mode 100644 img/t/AdminTools.gif create mode 100644 img/t/AdminTracking.gif create mode 100644 img/t/AdminTranslations.gif create mode 100644 img/t/AdminWebservice.gif create mode 100644 img/t/AdminZones.gif create mode 100644 img/t/index.php create mode 100644 img/tmp/index.php create mode 100644 index.php create mode 100644 init.php create mode 100644 install-dev/classes/AddConfToFile.php create mode 100644 install-dev/classes/ConfigurationTest.php create mode 100644 install-dev/classes/GetVersionFromDb.php create mode 100644 install-dev/classes/Language.php create mode 100644 install-dev/classes/LanguagesManager.php create mode 100644 install-dev/classes/Module.php create mode 100644 install-dev/classes/ToolsInstall.php create mode 100644 install-dev/controller.js create mode 100644 install-dev/img/01-gd100.png create mode 100644 install-dev/img/01-pt100.png create mode 100644 install-dev/img/01-pt70.png create mode 100644 install-dev/img/02-gd100.png create mode 100644 install-dev/img/02-pt100.png create mode 100644 install-dev/img/02-pt70.png create mode 100644 install-dev/img/03-gd100.png create mode 100644 install-dev/img/03-pt100.png create mode 100644 install-dev/img/03-pt70.png create mode 100644 install-dev/img/04-gd100.png create mode 100644 install-dev/img/04-pt100.png create mode 100644 install-dev/img/04-pt70.png create mode 100644 install-dev/img/05-gd100.png create mode 100644 install-dev/img/05-pt100.png create mode 100644 install-dev/img/05-pt70.png create mode 100644 install-dev/img/bad.gif create mode 100644 install-dev/img/bg-body.png create mode 100644 install-dev/img/bg-ctnr.png create mode 100644 install-dev/img/bg-tab.png create mode 100644 install-dev/img/bg_help.png create mode 100644 install-dev/img/boutonpt-disabled.png create mode 100644 install-dev/img/boutonpt-on.png create mode 100644 install-dev/img/boutonpt-over.png create mode 100644 install-dev/img/bt-dsbl.png create mode 100644 install-dev/img/bt-hover.png create mode 100644 install-dev/img/bt.png create mode 100644 install-dev/img/btn-installeur.png create mode 100644 install-dev/img/bullet.png create mode 100644 install-dev/img/ico_help.gif create mode 100644 install-dev/img/logo.png create mode 100644 install-dev/img/ok.gif create mode 100644 install-dev/img/ombrage-bas.png create mode 100644 install-dev/img/ombrage-droit.png create mode 100644 install-dev/img/phone.png create mode 100644 install-dev/img/puce.gif create mode 100644 install-dev/img/shadow-left.png create mode 100644 install-dev/index.php create mode 100644 install-dev/langs/de.php create mode 100644 install-dev/langs/es.php create mode 100644 install-dev/langs/fr.php create mode 100644 install-dev/langs/it.php create mode 100644 install-dev/langs/list.xml create mode 100644 install-dev/langs/us.php create mode 100644 install-dev/model.php create mode 100644 install-dev/module_tools.php create mode 100644 install-dev/php/add_missing_rewrite_value.php create mode 100644 install-dev/php/add_module_to_hook.php create mode 100644 install-dev/php/add_new_tab.php create mode 100644 install-dev/php/alter_blocklink.php create mode 100644 install-dev/php/alter_cms_block.php create mode 100644 install-dev/php/blocknewsletter.php create mode 100644 install-dev/php/check_webservice_account_table.php create mode 100644 install-dev/php/cms_block.php create mode 100644 install-dev/php/confcleaner.php create mode 100644 install-dev/php/country_to_timezone.php create mode 100755 install-dev/php/create_multistore.php create mode 100644 install-dev/php/customizations.php create mode 100644 install-dev/php/database_structure.php create mode 100644 install-dev/php/deliverynumber.php create mode 100644 install-dev/php/desactivatecustommodules.php create mode 100644 install-dev/php/editorial_update.php create mode 100644 install-dev/php/generate_ntree.php create mode 100644 install-dev/php/generate_tax_rules.php create mode 100644 install-dev/php/gridextjs_deprecated.php create mode 100644 install-dev/php/invoicenumber.php create mode 100644 install-dev/php/migrate_block_info_to_cms_block.php create mode 100644 install-dev/php/module_tools.php create mode 100644 install-dev/php/move_crossselling.php create mode 100644 install-dev/php/price_converter.php create mode 100644 install-dev/php/regenerate_level_depth.php create mode 100644 install-dev/php/remove_duplicate_category_groups.php create mode 100644 install-dev/php/remove_module_from_hook.php create mode 100644 install-dev/php/reorderpositions.php create mode 100755 install-dev/php/setallgroupsonhomecategory.php create mode 100644 install-dev/php/setdiscountcategory.php create mode 100644 install-dev/php/setpaymentmodule.php create mode 100644 install-dev/php/setpaymentmodulegroup.php create mode 100644 install-dev/php/shop_url.php create mode 100644 install-dev/php/update_for_13version.php create mode 100644 install-dev/php/update_image_size_in_db.php create mode 100644 install-dev/php/update_module_followup.php create mode 100644 install-dev/php/update_module_loyalty.php create mode 100644 install-dev/php/update_order_details.php create mode 100644 install-dev/php/update_products_ecotax_v133.php create mode 100644 install-dev/php/updatecarrierurl.php create mode 100644 install-dev/php/updatemodulessql.php create mode 100644 install-dev/php/updateproductcomments.php create mode 100644 install-dev/php/updatetabicon_from_11version.php create mode 100644 install-dev/php/utf8.php create mode 100644 install-dev/preactivation.php create mode 100644 install-dev/sql/db.sql create mode 100644 install-dev/sql/db_settings_extends.sql create mode 100644 install-dev/sql/db_settings_lite.sql create mode 100644 install-dev/sql/upgrade/0.9.1.2.sql create mode 100644 install-dev/sql/upgrade/0.9.1.sql create mode 100644 install-dev/sql/upgrade/0.9.5.1.sql create mode 100644 install-dev/sql/upgrade/0.9.5.2.sql create mode 100644 install-dev/sql/upgrade/0.9.6.1.sql create mode 100644 install-dev/sql/upgrade/0.9.6.2.sql create mode 100644 install-dev/sql/upgrade/0.9.7.1.sql create mode 100644 install-dev/sql/upgrade/0.9.7.2.sql create mode 100644 install-dev/sql/upgrade/0.9.sql create mode 100644 install-dev/sql/upgrade/1.0.0.1.sql create mode 100644 install-dev/sql/upgrade/1.0.0.2.sql create mode 100644 install-dev/sql/upgrade/1.0.0.3.sql create mode 100644 install-dev/sql/upgrade/1.0.0.4.sql create mode 100644 install-dev/sql/upgrade/1.0.0.5.sql create mode 100644 install-dev/sql/upgrade/1.0.0.6.sql create mode 100644 install-dev/sql/upgrade/1.0.0.7.sql create mode 100644 install-dev/sql/upgrade/1.0.0.8.sql create mode 100644 install-dev/sql/upgrade/1.1.0.1.sql create mode 100644 install-dev/sql/upgrade/1.1.0.2.sql create mode 100644 install-dev/sql/upgrade/1.1.0.3.sql create mode 100644 install-dev/sql/upgrade/1.1.0.4.sql create mode 100644 install-dev/sql/upgrade/1.1.0.5.sql create mode 100644 install-dev/sql/upgrade/1.2.0.1.sql create mode 100644 install-dev/sql/upgrade/1.2.0.2.sql create mode 100644 install-dev/sql/upgrade/1.2.0.3.sql create mode 100644 install-dev/sql/upgrade/1.2.0.4.sql create mode 100644 install-dev/sql/upgrade/1.2.0.5.sql create mode 100644 install-dev/sql/upgrade/1.2.0.6.sql create mode 100644 install-dev/sql/upgrade/1.2.0.7.sql create mode 100644 install-dev/sql/upgrade/1.2.0.8.sql create mode 100644 install-dev/sql/upgrade/1.2.1.0.sql create mode 100644 install-dev/sql/upgrade/1.2.2.0.sql create mode 100644 install-dev/sql/upgrade/1.2.3.0.sql create mode 100644 install-dev/sql/upgrade/1.2.4.0.sql create mode 100644 install-dev/sql/upgrade/1.2.5.0.sql create mode 100644 install-dev/sql/upgrade/1.3.0.1.sql create mode 100644 install-dev/sql/upgrade/1.3.0.10.sql create mode 100644 install-dev/sql/upgrade/1.3.0.2.sql create mode 100644 install-dev/sql/upgrade/1.3.0.3.sql create mode 100644 install-dev/sql/upgrade/1.3.0.4.sql create mode 100644 install-dev/sql/upgrade/1.3.0.5.sql create mode 100644 install-dev/sql/upgrade/1.3.0.6.sql create mode 100755 install-dev/sql/upgrade/1.3.0.7.sql create mode 100644 install-dev/sql/upgrade/1.3.0.8.sql create mode 100644 install-dev/sql/upgrade/1.3.0.9.sql create mode 100644 install-dev/sql/upgrade/1.3.1.1.sql create mode 100755 install-dev/sql/upgrade/1.3.2.1.sql create mode 100755 install-dev/sql/upgrade/1.3.2.2.sql create mode 100755 install-dev/sql/upgrade/1.3.2.3.sql create mode 100644 install-dev/sql/upgrade/1.3.3.0.sql create mode 100644 install-dev/sql/upgrade/1.3.4.0.sql create mode 100644 install-dev/sql/upgrade/1.3.5.0.sql create mode 100755 install-dev/sql/upgrade/1.3.6.0.sql create mode 100644 install-dev/sql/upgrade/1.3.7.0.sql create mode 100644 install-dev/sql/upgrade/1.4.0.1.sql create mode 100644 install-dev/sql/upgrade/1.4.0.10.sql create mode 100644 install-dev/sql/upgrade/1.4.0.11.sql create mode 100644 install-dev/sql/upgrade/1.4.0.12.sql create mode 100644 install-dev/sql/upgrade/1.4.0.13.sql create mode 100644 install-dev/sql/upgrade/1.4.0.14.sql create mode 100644 install-dev/sql/upgrade/1.4.0.15.sql create mode 100644 install-dev/sql/upgrade/1.4.0.16.sql create mode 100644 install-dev/sql/upgrade/1.4.0.17.sql create mode 100644 install-dev/sql/upgrade/1.4.0.2.sql create mode 100644 install-dev/sql/upgrade/1.4.0.3.sql create mode 100644 install-dev/sql/upgrade/1.4.0.4.sql create mode 100644 install-dev/sql/upgrade/1.4.0.5.sql create mode 100644 install-dev/sql/upgrade/1.4.0.6.sql create mode 100644 install-dev/sql/upgrade/1.4.0.7.sql create mode 100644 install-dev/sql/upgrade/1.4.0.8.sql create mode 100644 install-dev/sql/upgrade/1.4.0.9.sql create mode 100755 install-dev/sql/upgrade/1.4.1.0.sql create mode 100644 install-dev/sql/upgrade/1.4.2.0.sql create mode 100644 install-dev/sql/upgrade/1.4.2.1.sql create mode 100644 install-dev/sql/upgrade/1.4.2.2.sql create mode 100644 install-dev/sql/upgrade/1.4.2.3.sql create mode 100644 install-dev/sql/upgrade/1.4.2.4.sql create mode 100644 install-dev/sql/upgrade/1.4.2.5.sql create mode 100644 install-dev/sql/upgrade/1.4.3.sql create mode 100755 install-dev/sql/upgrade/1.5.0.0.sql create mode 100644 install-dev/todo_1.5.txt create mode 100644 install-dev/view.css create mode 100644 install-dev/xml/checkConfig.php create mode 100644 install-dev/xml/checkDB.php create mode 100644 install-dev/xml/checkMail.php create mode 100644 install-dev/xml/checkShopInfos.php create mode 100644 install-dev/xml/createDB.php create mode 100644 install-dev/xml/doUpgrade.php create mode 100644 install-dev/xml/getNonNativeModules.php create mode 100644 install-dev/xml/getVersionFromDb.php create mode 100644 install-dev/xml/uploadLogo.php create mode 100644 js/admin-dnd.js create mode 100644 js/admin-scene-cropping.js create mode 100644 js/admin.js create mode 100644 js/adminImport.js create mode 100644 js/ajax.js create mode 100644 js/attributesBack.js create mode 100644 js/checkLangPack.js create mode 100644 js/cropper/builder.js create mode 100644 js/cropper/cropper.css create mode 100644 js/cropper/cropper.js create mode 100644 js/cropper/dragdrop.js create mode 100644 js/cropper/index.php create mode 100644 js/cropper/loader.js create mode 100644 js/cropper/prototype.js create mode 100644 js/cropper/scriptaculous.js create mode 100644 js/date.js create mode 100644 js/gg-translate.js create mode 100644 js/hookLiveEdit.js create mode 100644 js/index.php create mode 100644 js/jquery/accordion/accordion.css create mode 100644 js/jquery/accordion/accordion.ui.js create mode 100644 js/jquery/ajaxfileupload.js create mode 100644 js/jquery/datepicker/000000.png create mode 100644 js/jquery/datepicker/666666.png create mode 100644 js/jquery/datepicker/b81900.png create mode 100644 js/jquery/datepicker/datepicker.css create mode 100644 js/jquery/datepicker/eeeeee.png create mode 100644 js/jquery/datepicker/f6a828.png create mode 100644 js/jquery/datepicker/f6f6f6.png create mode 100644 js/jquery/datepicker/fdf5ce.png create mode 100644 js/jquery/datepicker/ffe45c.png create mode 100644 js/jquery/datepicker/ffffff.png create mode 100644 js/jquery/datepicker/icons222222.png create mode 100644 js/jquery/datepicker/icons228ef1.png create mode 100644 js/jquery/datepicker/iconsef8c08.png create mode 100644 js/jquery/datepicker/iconsffd27a.png create mode 100644 js/jquery/datepicker/iconsffffff.png create mode 100644 js/jquery/datepicker/index.php create mode 100644 js/jquery/datepicker/jquery-ui-personalized-1.6rc4.packed.js create mode 100644 js/jquery/datepicker/ui/i18n/index.php create mode 100644 js/jquery/datepicker/ui/i18n/jquery.ui.i18n.all.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-ar.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-bg.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-ca.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-cs.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-da.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-de.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-eo.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-es.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-fa.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-fi.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-fr.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-he.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-hr.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-hu.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-hy.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-id.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-is.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-it.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-ja.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-ko.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-lt.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-lv.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-nl.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-no.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-pl.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-pt.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-ro.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-ru.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-sk.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-sl.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-sq.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-sv.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-th.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-tr.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-uk.js create mode 100644 js/jquery/datepicker/ui/i18n/ui.datepicker-zh.js create mode 100644 js/jquery/datepicker/ui/index.php create mode 100644 js/jquery/excanvas.min.js create mode 100644 js/jquery/fancybox/blank.gif create mode 100644 js/jquery/fancybox/fancy_close.png create mode 100644 js/jquery/fancybox/fancy_loading.png create mode 100644 js/jquery/fancybox/fancy_nav_left.png create mode 100644 js/jquery/fancybox/fancy_nav_right.png create mode 100644 js/jquery/fancybox/fancy_shadow_e.png create mode 100644 js/jquery/fancybox/fancy_shadow_n.png create mode 100644 js/jquery/fancybox/fancy_shadow_ne.png create mode 100644 js/jquery/fancybox/fancy_shadow_nw.png create mode 100644 js/jquery/fancybox/fancy_shadow_s.png create mode 100644 js/jquery/fancybox/fancy_shadow_se.png create mode 100644 js/jquery/fancybox/fancy_shadow_sw.png create mode 100644 js/jquery/fancybox/fancy_shadow_w.png create mode 100644 js/jquery/fancybox/fancy_title_left.png create mode 100644 js/jquery/fancybox/fancy_title_main.png create mode 100644 js/jquery/fancybox/fancy_title_over.png create mode 100644 js/jquery/fancybox/fancy_title_right.png create mode 100644 js/jquery/fancybox/fancybox-x.png create mode 100644 js/jquery/fancybox/fancybox-y.png create mode 100644 js/jquery/fancybox/fancybox.png create mode 100644 js/jquery/ifxtransfer.js create mode 100644 js/jquery/imgareaselect/border-anim-h.gif create mode 100644 js/jquery/imgareaselect/border-anim-v.gif create mode 100644 js/jquery/imgareaselect/border-h.gif create mode 100644 js/jquery/imgareaselect/border-v.gif create mode 100644 js/jquery/imgareaselect/imgareaselect-animated.css create mode 100644 js/jquery/imgareaselect/imgareaselect-default.css create mode 100644 js/jquery/imgareaselect/imgareaselect-deprecated.css create mode 100644 js/jquery/imgareaselect/index.php create mode 100644 js/jquery/imgareaselect/jquery.imgareaselect.pack.js create mode 100644 js/jquery/index.php create mode 100644 js/jquery/iutil.prestashop-modifications.js create mode 100644 js/jquery/jqminmax-compressed.js create mode 100644 js/jquery/jquery-1.4.4.min.js create mode 100644 js/jquery/jquery-colorpicker.js create mode 100644 js/jquery/jquery-fieldselection.js create mode 100644 js/jquery/jquery-typewatch.pack.js create mode 100755 js/jquery/jquery-ui-1.8.10.custom.min.js create mode 100644 js/jquery/jquery.autocomplete.js create mode 100644 js/jquery/jquery.cluetip.js create mode 100644 js/jquery/jquery.dimensions.js create mode 100644 js/jquery/jquery.easing.1.3.js create mode 100644 js/jquery/jquery.fancybox-1.3.4.js create mode 100644 js/jquery/jquery.flot.min.js create mode 100644 js/jquery/jquery.hoverIntent.minified.js create mode 100644 js/jquery/jquery.idTabs.modified.js create mode 100644 js/jquery/jquery.jgrowl-1.2.1.min.js create mode 100644 js/jquery/jquery.jqzoom.js create mode 100644 js/jquery/jquery.pngFix.pack.js create mode 100644 js/jquery/jquery.scrollTo-1.4.2-min.js create mode 100644 js/jquery/jquery.serialScroll-1.2.2-min.js create mode 100644 js/jquery/jquery.tablednd_0_5.js create mode 100644 js/jquery/thickbox-modified.js create mode 100644 js/pluginDetect.js create mode 100644 js/price.js create mode 100644 js/sendMailTest.js create mode 100644 js/tabpane.js create mode 100755 js/tiny_mce/langs/en.js create mode 100755 js/tiny_mce/langs/es.js create mode 100755 js/tiny_mce/langs/et.js create mode 100755 js/tiny_mce/langs/fi.js create mode 100755 js/tiny_mce/langs/fr.js create mode 100755 js/tiny_mce/langs/gl.js create mode 100755 js/tiny_mce/langs/he.js create mode 100755 js/tiny_mce/langs/hu.js create mode 100755 js/tiny_mce/langs/id.js create mode 100755 js/tiny_mce/langs/it.js create mode 100755 js/tiny_mce/langs/lt.js create mode 100755 js/tiny_mce/langs/lv.js create mode 100755 js/tiny_mce/langs/nl.js create mode 100755 js/tiny_mce/langs/no.js create mode 100755 js/tiny_mce/langs/pl.js create mode 100755 js/tiny_mce/langs/pt.js create mode 100755 js/tiny_mce/langs/ro.js create mode 100755 js/tiny_mce/langs/ru.js create mode 100644 js/tiny_mce/license.txt create mode 100644 js/tiny_mce/plugins/advimage/css/advimage.css create mode 100644 js/tiny_mce/plugins/advimage/editor_plugin.js create mode 100644 js/tiny_mce/plugins/advimage/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/advimage/image.htm create mode 100644 js/tiny_mce/plugins/advimage/img/sample.gif create mode 100644 js/tiny_mce/plugins/advimage/js/image.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/el_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/advimage/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/advlink/css/advlink.css create mode 100644 js/tiny_mce/plugins/advlink/editor_plugin.js create mode 100644 js/tiny_mce/plugins/advlink/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/advlink/js/advlink.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/el_dlg.js create mode 100644 js/tiny_mce/plugins/advlink/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ii_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/advlink/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/advlink/link.htm create mode 100644 js/tiny_mce/plugins/contextmenu/editor_plugin.js create mode 100644 js/tiny_mce/plugins/contextmenu/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/fullscreen/editor_plugin.js create mode 100644 js/tiny_mce/plugins/fullscreen/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/fullscreen/fullscreen.htm create mode 100644 js/tiny_mce/plugins/inlinepopups/editor_plugin.js create mode 100644 js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif create mode 100644 js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css create mode 100644 js/tiny_mce/plugins/inlinepopups/template.htm create mode 100644 js/tiny_mce/plugins/media/css/media.css create mode 100644 js/tiny_mce/plugins/media/editor_plugin.js create mode 100644 js/tiny_mce/plugins/media/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/media/js/embed.js create mode 100644 js/tiny_mce/plugins/media/js/media.js create mode 100755 js/tiny_mce/plugins/media/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/el_dlg.js create mode 100644 js/tiny_mce/plugins/media/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ii_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/media/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/media/media.htm create mode 100644 js/tiny_mce/plugins/media/moxieplayer.swf create mode 100644 js/tiny_mce/plugins/pagebreak/editor_plugin.js create mode 100644 js/tiny_mce/plugins/pagebreak/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/paste/editor_plugin.js create mode 100644 js/tiny_mce/plugins/paste/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/paste/js/pastetext.js create mode 100644 js/tiny_mce/plugins/paste/js/pasteword.js create mode 100755 js/tiny_mce/plugins/paste/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/el_dlg.js create mode 100644 js/tiny_mce/plugins/paste/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ii_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/paste/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/paste/pastetext.htm create mode 100644 js/tiny_mce/plugins/paste/pasteword.htm create mode 100644 js/tiny_mce/plugins/preview/editor_plugin.js create mode 100644 js/tiny_mce/plugins/preview/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/preview/example.html create mode 100644 js/tiny_mce/plugins/preview/jscripts/embed.js create mode 100644 js/tiny_mce/plugins/preview/preview.html create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/el_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ii_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/searchreplace/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/style/css/props.css create mode 100644 js/tiny_mce/plugins/style/editor_plugin.js create mode 100644 js/tiny_mce/plugins/style/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/style/js/props.js create mode 100755 js/tiny_mce/plugins/style/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/el_dlg.js create mode 100644 js/tiny_mce/plugins/style/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ii_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/style/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/style/props.htm create mode 100644 js/tiny_mce/plugins/table/cell.htm create mode 100644 js/tiny_mce/plugins/table/css/cell.css create mode 100644 js/tiny_mce/plugins/table/css/row.css create mode 100644 js/tiny_mce/plugins/table/css/table.css create mode 100644 js/tiny_mce/plugins/table/editor_plugin.js create mode 100644 js/tiny_mce/plugins/table/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/table/js/cell.js create mode 100644 js/tiny_mce/plugins/table/js/merge_cells.js create mode 100644 js/tiny_mce/plugins/table/js/row.js create mode 100644 js/tiny_mce/plugins/table/js/table.js create mode 100755 js/tiny_mce/plugins/table/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/el_dlg.js create mode 100644 js/tiny_mce/plugins/table/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ii_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/table/langs/zu_dlg.js create mode 100644 js/tiny_mce/plugins/table/merge_cells.htm create mode 100644 js/tiny_mce/plugins/table/row.htm create mode 100644 js/tiny_mce/plugins/table/table.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/abbr.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/acronym.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/attributes.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/cite.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/css/attributes.css create mode 100644 js/tiny_mce/plugins/xhtmlxtras/css/popup.css create mode 100644 js/tiny_mce/plugins/xhtmlxtras/del.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/ins.htm create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/abbr.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/acronym.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/attributes.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/cite.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/del.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/element_common.js create mode 100644 js/tiny_mce/plugins/xhtmlxtras/js/ins.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/az_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/be_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/bn_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/br_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/bs_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ca_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ch_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/cn_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/cy_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/dv_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/eu_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/fa_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/gl_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/gu_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/hi_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/hr_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ia_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/is_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ja_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ka_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/kl_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/km_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ko_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/lt_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/lv_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/mk_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ml_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/mn_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ms_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/my_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/nb_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/nl_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/nn_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/no_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/pt_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ro_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/sc_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/se_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/si_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/sl_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/sq_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/sr_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/sv_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ta_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/te_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/tn_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/tt_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/tw_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/ur_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/vi_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/zh_dlg.js create mode 100755 js/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js create mode 100644 js/tiny_mce/themes/advanced/about.htm create mode 100644 js/tiny_mce/themes/advanced/anchor.htm create mode 100644 js/tiny_mce/themes/advanced/charmap.htm create mode 100644 js/tiny_mce/themes/advanced/color_picker.htm create mode 100644 js/tiny_mce/themes/advanced/editor_template.js create mode 100644 js/tiny_mce/themes/advanced/editor_template_src.js create mode 100644 js/tiny_mce/themes/advanced/image.htm create mode 100644 js/tiny_mce/themes/advanced/img/colorpicker.jpg create mode 100644 js/tiny_mce/themes/advanced/img/flash.gif create mode 100644 js/tiny_mce/themes/advanced/img/icons.gif create mode 100644 js/tiny_mce/themes/advanced/img/iframe.gif create mode 100644 js/tiny_mce/themes/advanced/img/pagebreak.gif create mode 100644 js/tiny_mce/themes/advanced/img/quicktime.gif create mode 100644 js/tiny_mce/themes/advanced/img/realmedia.gif create mode 100644 js/tiny_mce/themes/advanced/img/shockwave.gif create mode 100644 js/tiny_mce/themes/advanced/img/trans.gif create mode 100644 js/tiny_mce/themes/advanced/img/video.gif create mode 100644 js/tiny_mce/themes/advanced/img/windowsmedia.gif create mode 100644 js/tiny_mce/themes/advanced/js/about.js create mode 100644 js/tiny_mce/themes/advanced/js/anchor.js create mode 100644 js/tiny_mce/themes/advanced/js/charmap.js create mode 100644 js/tiny_mce/themes/advanced/js/color_picker.js create mode 100644 js/tiny_mce/themes/advanced/js/image.js create mode 100644 js/tiny_mce/themes/advanced/js/link.js create mode 100644 js/tiny_mce/themes/advanced/js/source_editor.js create mode 100755 js/tiny_mce/themes/advanced/langs/en.js create mode 100755 js/tiny_mce/themes/advanced/langs/en_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/es.js create mode 100755 js/tiny_mce/themes/advanced/langs/es_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/et.js create mode 100755 js/tiny_mce/themes/advanced/langs/et_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/fi.js create mode 100755 js/tiny_mce/themes/advanced/langs/fi_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/fr.js create mode 100755 js/tiny_mce/themes/advanced/langs/fr_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/gl.js create mode 100755 js/tiny_mce/themes/advanced/langs/gl_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/he.js create mode 100755 js/tiny_mce/themes/advanced/langs/he_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/hu.js create mode 100755 js/tiny_mce/themes/advanced/langs/hu_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/id.js create mode 100755 js/tiny_mce/themes/advanced/langs/id_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/it.js create mode 100755 js/tiny_mce/themes/advanced/langs/it_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/lt.js create mode 100755 js/tiny_mce/themes/advanced/langs/lt_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/lv.js create mode 100755 js/tiny_mce/themes/advanced/langs/lv_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/nl.js create mode 100755 js/tiny_mce/themes/advanced/langs/nl_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/no.js create mode 100755 js/tiny_mce/themes/advanced/langs/no_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/pl.js create mode 100755 js/tiny_mce/themes/advanced/langs/pl_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/pt.js create mode 100755 js/tiny_mce/themes/advanced/langs/pt_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/ro.js create mode 100755 js/tiny_mce/themes/advanced/langs/ro_dlg.js create mode 100755 js/tiny_mce/themes/advanced/langs/ru.js create mode 100755 js/tiny_mce/themes/advanced/langs/ru_dlg.js create mode 100644 js/tiny_mce/themes/advanced/link.htm create mode 100644 js/tiny_mce/themes/advanced/shortcuts.htm create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/content.css create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/dialog.css create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/butt2.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/button-bg.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/buttons.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/down_arrow.gif create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/fade-butt.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/icons.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/items.gif create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/menu-arrow.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/menu-check.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/progress.gif create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/tabs.gif create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/img/toolbarbg.png create mode 100755 js/tiny_mce/themes/advanced/skins/cirkuit/ui.css create mode 100644 js/tiny_mce/themes/advanced/skins/default/content.css create mode 100644 js/tiny_mce/themes/advanced/skins/default/dialog.css create mode 100644 js/tiny_mce/themes/advanced/skins/default/img/buttons.png create mode 100644 js/tiny_mce/themes/advanced/skins/default/img/items.gif create mode 100644 js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif create mode 100644 js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif create mode 100644 js/tiny_mce/themes/advanced/skins/default/img/progress.gif create mode 100644 js/tiny_mce/themes/advanced/skins/default/img/tabs.gif create mode 100644 js/tiny_mce/themes/advanced/skins/default/ui.css create mode 100644 js/tiny_mce/themes/advanced/skins/highcontrast/content.css create mode 100644 js/tiny_mce/themes/advanced/skins/highcontrast/dialog.css create mode 100644 js/tiny_mce/themes/advanced/skins/highcontrast/ui.css create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/content.css create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/dialog.css create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/ui.css create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css create mode 100644 js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css create mode 100644 js/tiny_mce/themes/advanced/source_editor.htm create mode 100644 js/tiny_mce/tiny_mce.js create mode 100644 js/tiny_mce/tiny_mce_popup.js create mode 100644 js/tiny_mce/tiny_mce_src.js create mode 100644 js/tiny_mce/utils/editable_selects.js create mode 100644 js/tiny_mce/utils/form_utils.js create mode 100644 js/tiny_mce/utils/mctabs.js create mode 100644 js/tiny_mce/utils/validate.js create mode 100644 js/tinymce.inc.js create mode 100644 js/toggle.js create mode 100644 js/tools.js create mode 100644 localization/ar.xml create mode 100644 localization/at.xml create mode 100644 localization/au.xml create mode 100644 localization/az.xml create mode 100644 localization/be.xml create mode 100644 localization/bg.xml create mode 100644 localization/bo.xml create mode 100644 localization/br.xml create mode 100644 localization/ca.xml create mode 100644 localization/ch.xml create mode 100644 localization/cl.xml create mode 100644 localization/cn.xml create mode 100644 localization/co.xml create mode 100644 localization/cy.xml create mode 100644 localization/cz.xml create mode 100644 localization/de.xml create mode 100644 localization/dk.xml create mode 100644 localization/do.xml create mode 100644 localization/ec.xml create mode 100644 localization/ee.xml create mode 100644 localization/eg.xml create mode 100644 localization/es.xml create mode 100644 localization/fi.xml create mode 100644 localization/fj.xml create mode 100644 localization/fr.xml create mode 100644 localization/gb.xml create mode 100644 localization/ge.xml create mode 100644 localization/gr.xml create mode 100644 localization/gt.xml create mode 100644 localization/gy.xml create mode 100644 localization/hk.xml create mode 100644 localization/hu.xml create mode 100644 localization/id.xml create mode 100644 localization/ie.xml create mode 100644 localization/il.xml create mode 100644 localization/in.xml create mode 100644 localization/ir.xml create mode 100644 localization/it.xml create mode 100644 localization/je.xml create mode 100644 localization/jp.xml create mode 100644 localization/li.xml create mode 100644 localization/lt.xml create mode 100644 localization/lu.xml create mode 100644 localization/lv.xml create mode 100644 localization/md.xml create mode 100644 localization/mt.xml create mode 100644 localization/mx.xml create mode 100644 localization/nl.xml create mode 100644 localization/no.xml create mode 100644 localization/nz.xml create mode 100644 localization/pk.xml create mode 100644 localization/pl.xml create mode 100644 localization/pt.xml create mode 100644 localization/py.xml create mode 100644 localization/ro.xml create mode 100644 localization/ru.xml create mode 100644 localization/sa.xml create mode 100644 localization/se.xml create mode 100644 localization/sg.xml create mode 100644 localization/si.xml create mode 100644 localization/sk.xml create mode 100644 localization/sv.xml create mode 100644 localization/th.xml create mode 100644 localization/tr.xml create mode 100644 localization/tw.xml create mode 100644 localization/ua.xml create mode 100644 localization/us.xml create mode 100644 localization/uy.xml create mode 100644 localization/ve.xml create mode 100644 localization/vn.xml create mode 100755 log/.htaccess create mode 100755 log/index.php create mode 100644 mails/de/account.html create mode 100644 mails/de/account.txt create mode 100644 mails/de/bankwire.html create mode 100644 mails/de/bankwire.txt create mode 100644 mails/de/cheque.html create mode 100644 mails/de/cheque.txt create mode 100644 mails/de/contact.html create mode 100644 mails/de/contact.txt create mode 100644 mails/de/contact_form.html create mode 100644 mails/de/contact_form.txt create mode 100644 mails/de/credit_slip.html create mode 100644 mails/de/credit_slip.txt create mode 100644 mails/de/download-product.tpl create mode 100644 mails/de/download_product.html create mode 100644 mails/de/download_product.txt create mode 100644 mails/de/employee_password.html create mode 100644 mails/de/employee_password.txt create mode 100644 mails/de/forward_msg.html create mode 100644 mails/de/forward_msg.txt create mode 100644 mails/de/guest_to_customer.html create mode 100644 mails/de/guest_to_customer.txt create mode 100644 mails/de/in_transit.html create mode 100644 mails/de/in_transit.txt create mode 100644 mails/de/index.php create mode 100644 mails/de/lang.php create mode 100755 mails/de/log_alert.html create mode 100755 mails/de/log_alert.txt create mode 100644 mails/de/newsletter.html create mode 100644 mails/de/newsletter.txt create mode 100644 mails/de/order_canceled.html create mode 100644 mails/de/order_canceled.txt create mode 100644 mails/de/order_conf.html create mode 100644 mails/de/order_conf.txt create mode 100644 mails/de/order_customer_comment.html create mode 100644 mails/de/order_customer_comment.txt create mode 100644 mails/de/order_merchant_comment.html create mode 100644 mails/de/order_merchant_comment.txt create mode 100644 mails/de/order_return_state.html create mode 100644 mails/de/order_return_state.txt create mode 100644 mails/de/outofstock.html create mode 100644 mails/de/outofstock.txt create mode 100644 mails/de/password.html create mode 100644 mails/de/password.txt create mode 100644 mails/de/password_query.html create mode 100644 mails/de/password_query.txt create mode 100644 mails/de/payment.html create mode 100644 mails/de/payment.txt create mode 100644 mails/de/payment_error.html create mode 100644 mails/de/payment_error.txt create mode 100644 mails/de/preparation.html create mode 100644 mails/de/preparation.txt create mode 100644 mails/de/refund.html create mode 100644 mails/de/refund.txt create mode 100644 mails/de/reply_msg.html create mode 100644 mails/de/reply_msg.txt create mode 100644 mails/de/shipped.html create mode 100644 mails/de/shipped.txt create mode 100644 mails/de/test.html create mode 100644 mails/de/test.txt create mode 100644 mails/de/voucher.html create mode 100644 mails/de/voucher.txt create mode 100644 mails/en/account.html create mode 100644 mails/en/account.txt create mode 100644 mails/en/bankwire.html create mode 100644 mails/en/bankwire.txt create mode 100644 mails/en/cheque.html create mode 100644 mails/en/cheque.txt create mode 100644 mails/en/contact.html create mode 100644 mails/en/contact.txt create mode 100644 mails/en/contact_form.html create mode 100644 mails/en/contact_form.txt create mode 100644 mails/en/credit_slip.html create mode 100644 mails/en/credit_slip.txt create mode 100644 mails/en/download-product.tpl create mode 100644 mails/en/download_product.html create mode 100644 mails/en/download_product.txt create mode 100644 mails/en/employee_password.html create mode 100644 mails/en/employee_password.txt create mode 100644 mails/en/forward_msg.html create mode 100644 mails/en/forward_msg.txt create mode 100644 mails/en/guest_to_customer.html create mode 100644 mails/en/guest_to_customer.txt create mode 100755 mails/en/in_transit.html create mode 100755 mails/en/in_transit.txt create mode 100644 mails/en/index.php create mode 100644 mails/en/lang.php create mode 100755 mails/en/log_alert.html create mode 100755 mails/en/log_alert.txt create mode 100644 mails/en/newsletter.html create mode 100644 mails/en/newsletter.txt create mode 100644 mails/en/order_canceled.html create mode 100644 mails/en/order_canceled.txt create mode 100644 mails/en/order_conf.html create mode 100644 mails/en/order_conf.txt create mode 100644 mails/en/order_customer_comment.html create mode 100644 mails/en/order_customer_comment.txt create mode 100644 mails/en/order_merchant_comment.html create mode 100644 mails/en/order_merchant_comment.txt create mode 100644 mails/en/order_return_state.html create mode 100644 mails/en/order_return_state.txt create mode 100644 mails/en/outofstock.html create mode 100644 mails/en/outofstock.txt create mode 100644 mails/en/password.html create mode 100644 mails/en/password.txt create mode 100644 mails/en/password_query.html create mode 100644 mails/en/password_query.txt create mode 100644 mails/en/payment.html create mode 100644 mails/en/payment.txt create mode 100644 mails/en/payment_error.html create mode 100644 mails/en/payment_error.txt create mode 100644 mails/en/preparation.html create mode 100644 mails/en/preparation.txt create mode 100644 mails/en/refund.html create mode 100644 mails/en/refund.txt create mode 100644 mails/en/reply_msg.html create mode 100644 mails/en/reply_msg.txt create mode 100644 mails/en/shipped.html create mode 100644 mails/en/shipped.txt create mode 100644 mails/en/test.html create mode 100644 mails/en/test.txt create mode 100644 mails/en/voucher.html create mode 100644 mails/en/voucher.txt create mode 100644 mails/es/account.html create mode 100644 mails/es/account.txt create mode 100644 mails/es/bankwire.html create mode 100644 mails/es/bankwire.txt create mode 100644 mails/es/cheque.html create mode 100644 mails/es/cheque.txt create mode 100644 mails/es/contact.html create mode 100644 mails/es/contact.txt create mode 100644 mails/es/contact_form.html create mode 100644 mails/es/contact_form.txt create mode 100644 mails/es/credit_slip.html create mode 100644 mails/es/credit_slip.txt create mode 100644 mails/es/download-product.tpl create mode 100644 mails/es/download_product.html create mode 100644 mails/es/download_product.txt create mode 100644 mails/es/employee_password.html create mode 100644 mails/es/employee_password.txt create mode 100644 mails/es/forward_msg.html create mode 100644 mails/es/forward_msg.txt create mode 100644 mails/es/guest_to_customer.html create mode 100644 mails/es/guest_to_customer.txt create mode 100644 mails/es/in_transit.html create mode 100644 mails/es/in_transit.txt create mode 100644 mails/es/index.php create mode 100644 mails/es/lang.php create mode 100755 mails/es/log_alert.html create mode 100755 mails/es/log_alert.txt create mode 100644 mails/es/newsletter.html create mode 100644 mails/es/newsletter.txt create mode 100644 mails/es/order_canceled.html create mode 100644 mails/es/order_canceled.txt create mode 100644 mails/es/order_conf.html create mode 100644 mails/es/order_conf.txt create mode 100644 mails/es/order_customer_comment.html create mode 100644 mails/es/order_customer_comment.txt create mode 100644 mails/es/order_merchant_comment.html create mode 100644 mails/es/order_merchant_comment.txt create mode 100644 mails/es/order_return_state.html create mode 100644 mails/es/order_return_state.txt create mode 100644 mails/es/outofstock.html create mode 100644 mails/es/outofstock.txt create mode 100644 mails/es/password.html create mode 100644 mails/es/password.txt create mode 100644 mails/es/password_query.html create mode 100644 mails/es/password_query.txt create mode 100644 mails/es/payment.html create mode 100644 mails/es/payment.txt create mode 100644 mails/es/payment_error.html create mode 100644 mails/es/payment_error.txt create mode 100644 mails/es/preparation.html create mode 100644 mails/es/preparation.txt create mode 100644 mails/es/refund.html create mode 100644 mails/es/refund.txt create mode 100644 mails/es/reply_msg.html create mode 100644 mails/es/reply_msg.txt create mode 100644 mails/es/shipped.html create mode 100644 mails/es/shipped.txt create mode 100644 mails/es/test.html create mode 100644 mails/es/test.txt create mode 100644 mails/es/voucher.html create mode 100644 mails/es/voucher.txt create mode 100644 mails/fr/account.html create mode 100644 mails/fr/account.txt create mode 100644 mails/fr/bankwire.html create mode 100644 mails/fr/bankwire.txt create mode 100644 mails/fr/cheque.html create mode 100644 mails/fr/cheque.txt create mode 100644 mails/fr/contact.html create mode 100644 mails/fr/contact.txt create mode 100644 mails/fr/contact_form.html create mode 100644 mails/fr/contact_form.txt create mode 100644 mails/fr/credit_slip.html create mode 100644 mails/fr/credit_slip.txt create mode 100644 mails/fr/download-product.tpl create mode 100644 mails/fr/download_product.html create mode 100644 mails/fr/download_product.txt create mode 100644 mails/fr/employee_password.html create mode 100644 mails/fr/employee_password.txt create mode 100644 mails/fr/forward_msg.html create mode 100644 mails/fr/forward_msg.txt create mode 100644 mails/fr/guest_to_customer.html create mode 100644 mails/fr/guest_to_customer.txt create mode 100755 mails/fr/in_transit.html create mode 100755 mails/fr/in_transit.txt create mode 100644 mails/fr/index.php create mode 100644 mails/fr/lang.php create mode 100755 mails/fr/log_alert.html create mode 100755 mails/fr/log_alert.txt create mode 100644 mails/fr/newsletter.html create mode 100644 mails/fr/newsletter.txt create mode 100644 mails/fr/order_canceled.html create mode 100644 mails/fr/order_canceled.txt create mode 100644 mails/fr/order_conf.html create mode 100644 mails/fr/order_conf.txt create mode 100644 mails/fr/order_customer_comment.html create mode 100644 mails/fr/order_customer_comment.txt create mode 100644 mails/fr/order_merchant_comment.html create mode 100644 mails/fr/order_merchant_comment.txt create mode 100644 mails/fr/order_return_state.html create mode 100644 mails/fr/order_return_state.txt create mode 100644 mails/fr/outofstock.html create mode 100644 mails/fr/outofstock.txt create mode 100644 mails/fr/password.html create mode 100644 mails/fr/password.txt create mode 100644 mails/fr/password_query.html create mode 100644 mails/fr/password_query.txt create mode 100644 mails/fr/payment.html create mode 100644 mails/fr/payment.txt create mode 100644 mails/fr/payment_error.html create mode 100644 mails/fr/payment_error.txt create mode 100644 mails/fr/preparation.html create mode 100644 mails/fr/preparation.txt create mode 100644 mails/fr/refund.html create mode 100644 mails/fr/refund.txt create mode 100644 mails/fr/reply_msg.html create mode 100644 mails/fr/reply_msg.txt create mode 100644 mails/fr/shipped.html create mode 100644 mails/fr/shipped.txt create mode 100644 mails/fr/test.html create mode 100644 mails/fr/test.txt create mode 100644 mails/fr/voucher.html create mode 100644 mails/fr/voucher.txt create mode 100644 mails/index.php create mode 100644 mails/it/account.html create mode 100644 mails/it/account.txt create mode 100644 mails/it/bankwire.html create mode 100644 mails/it/bankwire.txt create mode 100644 mails/it/cheque.html create mode 100644 mails/it/cheque.txt create mode 100644 mails/it/contact.html create mode 100644 mails/it/contact.txt create mode 100644 mails/it/contact_form.html create mode 100644 mails/it/contact_form.txt create mode 100644 mails/it/credit_slip.html create mode 100644 mails/it/credit_slip.txt create mode 100644 mails/it/download-product.tpl create mode 100644 mails/it/download_product.html create mode 100644 mails/it/download_product.txt create mode 100644 mails/it/employee_password.html create mode 100644 mails/it/employee_password.txt create mode 100644 mails/it/forward_msg.html create mode 100644 mails/it/forward_msg.txt create mode 100644 mails/it/guest_to_customer.html create mode 100644 mails/it/guest_to_customer.txt create mode 100644 mails/it/in_transit.html create mode 100644 mails/it/in_transit.txt create mode 100644 mails/it/index.php create mode 100644 mails/it/lang.php create mode 100755 mails/it/log_alert.html create mode 100755 mails/it/log_alert.txt create mode 100644 mails/it/newsletter.html create mode 100644 mails/it/newsletter.txt create mode 100644 mails/it/order_canceled.html create mode 100644 mails/it/order_canceled.txt create mode 100644 mails/it/order_conf.html create mode 100644 mails/it/order_conf.txt create mode 100644 mails/it/order_customer_comment.html create mode 100644 mails/it/order_customer_comment.txt create mode 100644 mails/it/order_merchant_comment.html create mode 100644 mails/it/order_merchant_comment.txt create mode 100644 mails/it/order_return_state.html create mode 100644 mails/it/order_return_state.txt create mode 100644 mails/it/outofstock.html create mode 100644 mails/it/outofstock.txt create mode 100644 mails/it/password.html create mode 100644 mails/it/password.txt create mode 100644 mails/it/password_query.html create mode 100644 mails/it/password_query.txt create mode 100644 mails/it/payment.html create mode 100644 mails/it/payment.txt create mode 100644 mails/it/payment_error.html create mode 100644 mails/it/payment_error.txt create mode 100644 mails/it/preparation.html create mode 100644 mails/it/preparation.txt create mode 100644 mails/it/refund.html create mode 100644 mails/it/refund.txt create mode 100644 mails/it/reply_msg.html create mode 100644 mails/it/reply_msg.txt create mode 100644 mails/it/shipped.html create mode 100644 mails/it/shipped.txt create mode 100644 mails/it/test.html create mode 100644 mails/it/test.txt create mode 100644 mails/it/voucher.html create mode 100644 mails/it/voucher.txt create mode 100644 manufacturer.php create mode 100644 modules/.htaccess create mode 100755 modules/authorizeaim/authorizeaim.php create mode 100755 modules/authorizeaim/authorizeaim.tpl create mode 100755 modules/authorizeaim/cards/ax.gif create mode 100755 modules/authorizeaim/cards/discover.gif create mode 100755 modules/authorizeaim/cards/mastercard.gif create mode 100755 modules/authorizeaim/cards/visa.gif create mode 100755 modules/authorizeaim/config.xml create mode 100644 modules/authorizeaim/cvv.png create mode 100755 modules/authorizeaim/de.php create mode 100644 modules/authorizeaim/en.php create mode 100644 modules/authorizeaim/es.php create mode 100644 modules/authorizeaim/fr.php create mode 100644 modules/authorizeaim/help.png create mode 100755 modules/authorizeaim/hookorderconfirmation.tpl create mode 100755 modules/authorizeaim/it.php create mode 100755 modules/authorizeaim/logo.gif create mode 100755 modules/authorizeaim/logo_authorize.png create mode 100644 modules/authorizeaim/logoa.gif create mode 100755 modules/authorizeaim/secure.png create mode 100755 modules/authorizeaim/validation.php create mode 100644 modules/bankwire/bankwire.jpg create mode 100644 modules/bankwire/bankwire.php create mode 100755 modules/bankwire/config.xml create mode 100644 modules/bankwire/de.php create mode 100644 modules/bankwire/en.php create mode 100644 modules/bankwire/es.php create mode 100644 modules/bankwire/fr.php create mode 100644 modules/bankwire/it.php create mode 100644 modules/bankwire/logo.gif create mode 100644 modules/bankwire/payment.php create mode 100644 modules/bankwire/payment.tpl create mode 100644 modules/bankwire/payment_execution.tpl create mode 100644 modules/bankwire/payment_return.tpl create mode 100644 modules/bankwire/validation.php create mode 100644 modules/birthdaypresent/birthdaypresent.php create mode 100644 modules/birthdaypresent/comment.gif create mode 100755 modules/birthdaypresent/config.xml create mode 100644 modules/birthdaypresent/cron.php create mode 100644 modules/birthdaypresent/de.php create mode 100644 modules/birthdaypresent/en.php create mode 100644 modules/birthdaypresent/es.php create mode 100644 modules/birthdaypresent/fr.php create mode 100644 modules/birthdaypresent/it.php create mode 100644 modules/birthdaypresent/logo.gif create mode 100644 modules/birthdaypresent/mails/de/birthday.html create mode 100644 modules/birthdaypresent/mails/de/birthday.txt create mode 100644 modules/birthdaypresent/mails/en/birthday.html create mode 100644 modules/birthdaypresent/mails/en/birthday.txt create mode 100644 modules/birthdaypresent/mails/es/birthday.html create mode 100644 modules/birthdaypresent/mails/es/birthday.txt create mode 100644 modules/birthdaypresent/mails/fr/birthday.html create mode 100644 modules/birthdaypresent/mails/fr/birthday.txt create mode 100644 modules/birthdaypresent/mails/it/birthday.html create mode 100644 modules/birthdaypresent/mails/it/birthday.txt create mode 100644 modules/blockadvertising/advertising.jpg create mode 100644 modules/blockadvertising/blockadvertising.php create mode 100644 modules/blockadvertising/blockadvertising.tpl create mode 100755 modules/blockadvertising/config.xml create mode 100644 modules/blockadvertising/de.php create mode 100644 modules/blockadvertising/en.php create mode 100644 modules/blockadvertising/es.php create mode 100644 modules/blockadvertising/fr.php create mode 100644 modules/blockadvertising/it.php create mode 100644 modules/blockadvertising/logo.gif create mode 100644 modules/blockbestsellers/blockbestsellers.php create mode 100644 modules/blockbestsellers/blockbestsellers.tpl create mode 100755 modules/blockbestsellers/config.xml create mode 100644 modules/blockbestsellers/de.php create mode 100644 modules/blockbestsellers/en.php create mode 100644 modules/blockbestsellers/es.php create mode 100644 modules/blockbestsellers/fr.php create mode 100644 modules/blockbestsellers/img/logo.gif create mode 100644 modules/blockbestsellers/it.php create mode 100644 modules/blockbestsellers/logo.gif create mode 100644 modules/blockcart/ajax-cart.js create mode 100644 modules/blockcart/blockcart-ajax.php create mode 100644 modules/blockcart/blockcart-json.tpl create mode 100644 modules/blockcart/blockcart-set-collapse.php create mode 100644 modules/blockcart/blockcart.php create mode 100644 modules/blockcart/blockcart.tpl create mode 100755 modules/blockcart/config.xml create mode 100644 modules/blockcart/de.php create mode 100644 modules/blockcart/en.php create mode 100644 modules/blockcart/es.php create mode 100644 modules/blockcart/fr.php create mode 100644 modules/blockcart/img/icon/basket.png create mode 100644 modules/blockcart/img/icon/basket_go.png create mode 100644 modules/blockcart/img/icon/checkout.png create mode 100644 modules/blockcart/img/icon/delete.gif create mode 100644 modules/blockcart/it.php create mode 100644 modules/blockcart/logo.gif create mode 100644 modules/blockcategories/blockcategories.php create mode 100644 modules/blockcategories/blockcategories.tpl create mode 100644 modules/blockcategories/blockcategories_footer.tpl create mode 100644 modules/blockcategories/category-tree-branch.tpl create mode 100755 modules/blockcategories/config.xml create mode 100644 modules/blockcategories/de.php create mode 100644 modules/blockcategories/en.php create mode 100644 modules/blockcategories/es.php create mode 100644 modules/blockcategories/fr.php create mode 100644 modules/blockcategories/it.php create mode 100644 modules/blockcategories/logo.gif create mode 100755 modules/blockcms/ajax_blockcms.php create mode 100755 modules/blockcms/blockcms.js create mode 100755 modules/blockcms/blockcms.php create mode 100755 modules/blockcms/blockcms.tpl create mode 100755 modules/blockcms/config.xml create mode 100644 modules/blockcms/de.php create mode 100755 modules/blockcms/es.php create mode 100755 modules/blockcms/fr.php create mode 100644 modules/blockcms/it.php create mode 100755 modules/blockcms/logo.gif create mode 100644 modules/blockcurrencies/blockcurrencies.php create mode 100644 modules/blockcurrencies/blockcurrencies.tpl create mode 100755 modules/blockcurrencies/config.xml create mode 100644 modules/blockcurrencies/de.php create mode 100644 modules/blockcurrencies/en.php create mode 100644 modules/blockcurrencies/es.php create mode 100644 modules/blockcurrencies/fr.php create mode 100644 modules/blockcurrencies/it.php create mode 100644 modules/blockcurrencies/logo.gif create mode 100644 modules/blocklanguages/blocklanguages.php create mode 100644 modules/blocklanguages/blocklanguages.tpl create mode 100755 modules/blocklanguages/config.xml create mode 100644 modules/blocklanguages/de.php create mode 100644 modules/blocklanguages/en.php create mode 100644 modules/blocklanguages/es.php create mode 100644 modules/blocklanguages/fr.php create mode 100644 modules/blocklanguages/it.php create mode 100644 modules/blocklanguages/logo.gif create mode 100644 modules/blocklayered/blocklayered-ajax.php create mode 100644 modules/blocklayered/blocklayered.css create mode 100644 modules/blocklayered/blocklayered.js create mode 100644 modules/blocklayered/blocklayered.php create mode 100644 modules/blocklayered/blocklayered.tpl create mode 100644 modules/blocklayered/config.xml create mode 100644 modules/blocklayered/de.php create mode 100644 modules/blocklayered/es.php create mode 100644 modules/blocklayered/fr.php create mode 100644 modules/blocklayered/it.php create mode 100644 modules/blocklayered/logo.gif create mode 100644 modules/blocklink/add.png create mode 100644 modules/blocklink/blocklink.js create mode 100644 modules/blocklink/blocklink.php create mode 100644 modules/blocklink/blocklink.tpl create mode 100755 modules/blocklink/config.xml create mode 100644 modules/blocklink/de.php create mode 100644 modules/blocklink/en.php create mode 100644 modules/blocklink/es.php create mode 100644 modules/blocklink/fr.php create mode 100644 modules/blocklink/it.php create mode 100644 modules/blocklink/logo.gif create mode 100644 modules/blocklink/prefs.gif create mode 100644 modules/blockmanufacturer/blockmanufacturer.php create mode 100644 modules/blockmanufacturer/blockmanufacturer.tpl create mode 100755 modules/blockmanufacturer/config.xml create mode 100644 modules/blockmanufacturer/de.php create mode 100644 modules/blockmanufacturer/en.php create mode 100644 modules/blockmanufacturer/es.php create mode 100644 modules/blockmanufacturer/fr.php create mode 100644 modules/blockmanufacturer/it.php create mode 100644 modules/blockmanufacturer/logo.gif create mode 100644 modules/blockmyaccount/blockmyaccount.php create mode 100644 modules/blockmyaccount/blockmyaccount.tpl create mode 100755 modules/blockmyaccount/config.xml create mode 100644 modules/blockmyaccount/de.php create mode 100644 modules/blockmyaccount/en.php create mode 100644 modules/blockmyaccount/es.php create mode 100644 modules/blockmyaccount/fr.php create mode 100644 modules/blockmyaccount/it.php create mode 100644 modules/blockmyaccount/logo.gif create mode 100644 modules/blocknewproducts/blocknewproducts.php create mode 100644 modules/blocknewproducts/blocknewproducts.tpl create mode 100755 modules/blocknewproducts/config.xml create mode 100644 modules/blocknewproducts/de.php create mode 100644 modules/blocknewproducts/en.php create mode 100644 modules/blocknewproducts/es.php create mode 100644 modules/blocknewproducts/fr.php create mode 100644 modules/blocknewproducts/it.php create mode 100644 modules/blocknewproducts/logo.gif create mode 100644 modules/blocknewsletter/blocknewsletter.php create mode 100644 modules/blocknewsletter/blocknewsletter.tpl create mode 100755 modules/blocknewsletter/config.xml create mode 100644 modules/blocknewsletter/de.php create mode 100644 modules/blocknewsletter/en.php create mode 100644 modules/blocknewsletter/es.php create mode 100644 modules/blocknewsletter/fr.php create mode 100644 modules/blocknewsletter/it.php create mode 100644 modules/blocknewsletter/logo.gif create mode 100644 modules/blocknewsletter/mails/de/newsletter_conf.html create mode 100644 modules/blocknewsletter/mails/de/newsletter_conf.txt create mode 100644 modules/blocknewsletter/mails/de/newsletter_voucher.html create mode 100644 modules/blocknewsletter/mails/de/newsletter_voucher.txt create mode 100644 modules/blocknewsletter/mails/en/newsletter_conf.html create mode 100644 modules/blocknewsletter/mails/en/newsletter_conf.txt create mode 100644 modules/blocknewsletter/mails/en/newsletter_voucher.html create mode 100644 modules/blocknewsletter/mails/en/newsletter_voucher.txt create mode 100755 modules/blocknewsletter/mails/es/newsletter_conf.html create mode 100755 modules/blocknewsletter/mails/es/newsletter_conf.txt create mode 100755 modules/blocknewsletter/mails/es/newsletter_voucher.html create mode 100755 modules/blocknewsletter/mails/es/newsletter_voucher.txt create mode 100644 modules/blocknewsletter/mails/fr/newsletter_conf.html create mode 100644 modules/blocknewsletter/mails/fr/newsletter_conf.txt create mode 100644 modules/blocknewsletter/mails/fr/newsletter_voucher.html create mode 100644 modules/blocknewsletter/mails/fr/newsletter_voucher.txt create mode 100755 modules/blocknewsletter/mails/it/newsletter_conf.html create mode 100755 modules/blocknewsletter/mails/it/newsletter_conf.txt create mode 100755 modules/blocknewsletter/mails/it/newsletter_voucher.html create mode 100755 modules/blocknewsletter/mails/it/newsletter_voucher.txt create mode 100644 modules/blockpaymentlogo/blockpaymentlogo.php create mode 100644 modules/blockpaymentlogo/blockpaymentlogo.tpl create mode 100755 modules/blockpaymentlogo/config.xml create mode 100644 modules/blockpaymentlogo/de.php create mode 100644 modules/blockpaymentlogo/en.php create mode 100644 modules/blockpaymentlogo/es.php create mode 100644 modules/blockpaymentlogo/fr.php create mode 100644 modules/blockpaymentlogo/it.php create mode 100644 modules/blockpaymentlogo/logo.gif create mode 100644 modules/blockpermanentlinks/blockpermanentlinks-header.tpl create mode 100644 modules/blockpermanentlinks/blockpermanentlinks.php create mode 100644 modules/blockpermanentlinks/blockpermanentlinks.tpl create mode 100755 modules/blockpermanentlinks/config.xml create mode 100644 modules/blockpermanentlinks/de.php create mode 100644 modules/blockpermanentlinks/en.php create mode 100644 modules/blockpermanentlinks/es.php create mode 100644 modules/blockpermanentlinks/fr.php create mode 100644 modules/blockpermanentlinks/it.php create mode 100644 modules/blockpermanentlinks/logo.gif create mode 100644 modules/blockrss/blockrss.php create mode 100644 modules/blockrss/blockrss.tpl create mode 100755 modules/blockrss/config.xml create mode 100644 modules/blockrss/de.php create mode 100644 modules/blockrss/en.php create mode 100644 modules/blockrss/es.php create mode 100644 modules/blockrss/fr.php create mode 100644 modules/blockrss/it.php create mode 100644 modules/blockrss/logo.gif create mode 100644 modules/blocksearch/blocksearch-top.tpl create mode 100644 modules/blocksearch/blocksearch.php create mode 100644 modules/blocksearch/blocksearch.tpl create mode 100755 modules/blocksearch/config.xml create mode 100644 modules/blocksearch/de.php create mode 100644 modules/blocksearch/en.php create mode 100644 modules/blocksearch/es.php create mode 100644 modules/blocksearch/fr.php create mode 100644 modules/blocksearch/it.php create mode 100644 modules/blocksearch/logo.gif create mode 100644 modules/blockspecials/blockspecials.php create mode 100644 modules/blockspecials/blockspecials.tpl create mode 100755 modules/blockspecials/config.xml create mode 100644 modules/blockspecials/de.php create mode 100644 modules/blockspecials/en.php create mode 100644 modules/blockspecials/es.php create mode 100644 modules/blockspecials/fr.php create mode 100644 modules/blockspecials/it.php create mode 100644 modules/blockspecials/logo.gif create mode 100644 modules/blockstore/blockstore.css create mode 100644 modules/blockstore/blockstore.php create mode 100644 modules/blockstore/blockstore.tpl create mode 100755 modules/blockstore/config.xml create mode 100644 modules/blockstore/de.php create mode 100644 modules/blockstore/es.php create mode 100644 modules/blockstore/fr.php create mode 100644 modules/blockstore/it.php create mode 100644 modules/blockstore/logo.gif create mode 100644 modules/blockstore/store.jpg create mode 100644 modules/blocksupplier/blocksupplier.php create mode 100644 modules/blocksupplier/blocksupplier.tpl create mode 100755 modules/blocksupplier/config.xml create mode 100644 modules/blocksupplier/de.php create mode 100644 modules/blocksupplier/en.php create mode 100644 modules/blocksupplier/es.php create mode 100644 modules/blocksupplier/fr.php create mode 100644 modules/blocksupplier/it.php create mode 100644 modules/blocksupplier/logo.gif create mode 100644 modules/blocktags/blocktags.php create mode 100644 modules/blocktags/blocktags.tpl create mode 100755 modules/blocktags/config.xml create mode 100644 modules/blocktags/de.php create mode 100644 modules/blocktags/en.php create mode 100644 modules/blocktags/es.php create mode 100644 modules/blocktags/fr.php create mode 100644 modules/blocktags/it.php create mode 100644 modules/blocktags/logo.gif create mode 100644 modules/blockuserinfo/blockuserinfo.php create mode 100644 modules/blockuserinfo/blockuserinfo.tpl create mode 100755 modules/blockuserinfo/config.xml create mode 100644 modules/blockuserinfo/de.php create mode 100644 modules/blockuserinfo/en.php create mode 100644 modules/blockuserinfo/es.php create mode 100644 modules/blockuserinfo/fr.php create mode 100644 modules/blockuserinfo/it.php create mode 100644 modules/blockuserinfo/logo.gif create mode 100644 modules/blockviewed/blockviewed.php create mode 100644 modules/blockviewed/blockviewed.tpl create mode 100755 modules/blockviewed/config.xml create mode 100644 modules/blockviewed/de.php create mode 100644 modules/blockviewed/en.php create mode 100644 modules/blockviewed/es.php create mode 100644 modules/blockviewed/fr.php create mode 100644 modules/blockviewed/it.php create mode 100644 modules/blockviewed/logo.gif create mode 100644 modules/blockwishlist/WishList.php create mode 100644 modules/blockwishlist/blockwishlist-ajax.tpl create mode 100644 modules/blockwishlist/blockwishlist-extra.tpl create mode 100644 modules/blockwishlist/blockwishlist-header.tpl create mode 100644 modules/blockwishlist/blockwishlist.php create mode 100644 modules/blockwishlist/blockwishlist.tpl create mode 100644 modules/blockwishlist/buywishlistproduct.php create mode 100644 modules/blockwishlist/cart.php create mode 100755 modules/blockwishlist/config.xml create mode 100644 modules/blockwishlist/de.php create mode 100644 modules/blockwishlist/en.php create mode 100644 modules/blockwishlist/es.php create mode 100644 modules/blockwishlist/fr.php create mode 100644 modules/blockwishlist/img/delete.gif create mode 100644 modules/blockwishlist/img/icon/delete.png create mode 100644 modules/blockwishlist/img/icon/package.png create mode 100644 modules/blockwishlist/img/icon/package_go.png create mode 100644 modules/blockwishlist/img/star.gif create mode 100644 modules/blockwishlist/install.sql create mode 100644 modules/blockwishlist/it.php create mode 100644 modules/blockwishlist/js/ajax-wishlist.js create mode 100644 modules/blockwishlist/logo.gif create mode 100644 modules/blockwishlist/mails/de/wishlink.html create mode 100644 modules/blockwishlist/mails/de/wishlink.txt create mode 100644 modules/blockwishlist/mails/de/wishlist.html create mode 100644 modules/blockwishlist/mails/de/wishlist.txt create mode 100644 modules/blockwishlist/mails/en/wishlink.html create mode 100644 modules/blockwishlist/mails/en/wishlink.txt create mode 100644 modules/blockwishlist/mails/en/wishlist.html create mode 100644 modules/blockwishlist/mails/en/wishlist.txt create mode 100755 modules/blockwishlist/mails/es/wishlink.html create mode 100755 modules/blockwishlist/mails/es/wishlink.txt create mode 100644 modules/blockwishlist/mails/es/wishlist.html create mode 100644 modules/blockwishlist/mails/es/wishlist.txt create mode 100644 modules/blockwishlist/mails/fr/wishlink.html create mode 100644 modules/blockwishlist/mails/fr/wishlink.txt create mode 100644 modules/blockwishlist/mails/fr/wishlist.html create mode 100644 modules/blockwishlist/mails/fr/wishlist.txt create mode 100644 modules/blockwishlist/mails/it/wishlink.html create mode 100644 modules/blockwishlist/mails/it/wishlink.txt create mode 100644 modules/blockwishlist/mails/it/wishlist.html create mode 100644 modules/blockwishlist/mails/it/wishlist.txt create mode 100644 modules/blockwishlist/managewishlist.php create mode 100644 modules/blockwishlist/managewishlist.tpl create mode 100644 modules/blockwishlist/my-account.tpl create mode 100644 modules/blockwishlist/mywishlist.php create mode 100644 modules/blockwishlist/mywishlist.tpl create mode 100644 modules/blockwishlist/sendwishlist.php create mode 100644 modules/blockwishlist/view.php create mode 100644 modules/blockwishlist/view.tpl create mode 100644 modules/carriercompare/ajax.php create mode 100644 modules/carriercompare/carriercompare.js create mode 100755 modules/carriercompare/carriercompare.php create mode 100644 modules/carriercompare/carriercompare.tpl create mode 100644 modules/carriercompare/config.xml create mode 100644 modules/carriercompare/de.php create mode 100644 modules/carriercompare/es.php create mode 100644 modules/carriercompare/fr.php create mode 100644 modules/carriercompare/it.php create mode 100644 modules/carriercompare/logo.gif create mode 100644 modules/carriercompare/style.css create mode 100644 modules/cashondelivery/cashondelivery.gif create mode 100644 modules/cashondelivery/cashondelivery.jpg create mode 100644 modules/cashondelivery/cashondelivery.php create mode 100755 modules/cashondelivery/config.xml create mode 100644 modules/cashondelivery/confirmation.tpl create mode 100644 modules/cashondelivery/de.php create mode 100644 modules/cashondelivery/en.php create mode 100644 modules/cashondelivery/es.php create mode 100644 modules/cashondelivery/fr.php create mode 100644 modules/cashondelivery/it.php create mode 100644 modules/cashondelivery/logo.gif create mode 100644 modules/cashondelivery/payment.tpl create mode 100644 modules/cashondelivery/validation.php create mode 100644 modules/cashondelivery/validation.tpl create mode 100644 modules/cashticket/Disposition.php create mode 100644 modules/cashticket/PrepaidServices.php create mode 100644 modules/cashticket/PrepaidServicesAPI.php create mode 100644 modules/cashticket/cashticket-accept-payment.tpl create mode 100644 modules/cashticket/cashticket-confirmation.tpl create mode 100644 modules/cashticket/cashticket.php create mode 100755 modules/cashticket/config.xml create mode 100644 modules/cashticket/de.php create mode 100644 modules/cashticket/disposition-error.tpl create mode 100755 modules/cashticket/es.php create mode 100755 modules/cashticket/fr.php create mode 100644 modules/cashticket/img/payment-logo.png create mode 100644 modules/cashticket/img/payment-small.png create mode 100644 modules/cashticket/img/payment.png create mode 100644 modules/cashticket/it.php create mode 100755 modules/cashticket/keyring/.htaccess create mode 100644 modules/cashticket/keyring/paysafecard-CA.pem create mode 100644 modules/cashticket/logo.gif create mode 100644 modules/cashticket/payment.php create mode 100644 modules/cashticket/payment.tpl create mode 100644 modules/cashticket/prepaidservices.js create mode 100644 modules/cashticket/redirect.php create mode 100644 modules/cheque/cheque.jpg create mode 100644 modules/cheque/cheque.php create mode 100755 modules/cheque/config.xml create mode 100644 modules/cheque/de.php create mode 100644 modules/cheque/en.php create mode 100644 modules/cheque/es.php create mode 100644 modules/cheque/fr.php create mode 100644 modules/cheque/it.php create mode 100644 modules/cheque/logo.gif create mode 100644 modules/cheque/payment.php create mode 100644 modules/cheque/payment.tpl create mode 100644 modules/cheque/payment_execution.tpl create mode 100644 modules/cheque/payment_return.tpl create mode 100644 modules/cheque/validation.php create mode 100755 modules/criteo/config.xml create mode 100755 modules/criteo/criteo.php create mode 100644 modules/criteo/de.php create mode 100755 modules/criteo/en.php create mode 100644 modules/criteo/es.php create mode 100755 modules/criteo/export_csv.php create mode 100755 modules/criteo/export_xml.php create mode 100755 modules/criteo/fr.php create mode 100755 modules/criteo/it.php create mode 100755 modules/criteo/logo.gif create mode 100755 modules/crossselling/config.xml create mode 100755 modules/crossselling/crossselling.php create mode 100755 modules/crossselling/crossselling.tpl create mode 100644 modules/crossselling/de.php create mode 100755 modules/crossselling/en.php create mode 100644 modules/crossselling/es.php create mode 100755 modules/crossselling/fr.php create mode 100644 modules/crossselling/it.php create mode 100755 modules/crossselling/js/crossselling.js create mode 100755 modules/crossselling/logo.gif create mode 100644 modules/dateofdelivery/beforeCarrier.tpl create mode 100755 modules/dateofdelivery/config.xml create mode 100644 modules/dateofdelivery/dateofdelivery.php create mode 100644 modules/dateofdelivery/de.php create mode 100644 modules/dateofdelivery/es.php create mode 100644 modules/dateofdelivery/fr.php create mode 100755 modules/dateofdelivery/img/cross.png create mode 100755 modules/dateofdelivery/img/tick.png create mode 100755 modules/dateofdelivery/img/time.png create mode 100755 modules/dateofdelivery/img/time_add.png create mode 100755 modules/dateofdelivery/img/time_delete.png create mode 100644 modules/dateofdelivery/it.php create mode 100644 modules/dateofdelivery/logo.gif create mode 100644 modules/dateofdelivery/orderDetail.tpl create mode 100644 modules/dejala/MyLogUtils.php create mode 100644 modules/dejala/calendarutils.php create mode 100755 modules/dejala/config.xml create mode 100644 modules/dejala/de.php create mode 100644 modules/dejala/dejala.php create mode 100644 modules/dejala/dejala_carrier.gif create mode 100644 modules/dejala/dejala_carrier.tpl create mode 100644 modules/dejala/dejala_carrier_nostock.tpl create mode 100644 modules/dejala/dejala_contacts.tpl create mode 100644 modules/dejala/dejala_deliveries.tpl create mode 100644 modules/dejala/dejala_deliveries_csv.tpl create mode 100644 modules/dejala/dejala_delivery_options.tpl create mode 100644 modules/dejala/dejala_footer.tpl create mode 100644 modules/dejala/dejala_header.tpl create mode 100644 modules/dejala/dejala_home.tpl create mode 100644 modules/dejala/dejala_location.tpl create mode 100644 modules/dejala/dejala_logo.gif create mode 100644 modules/dejala/dejala_menu.tpl create mode 100644 modules/dejala/dejala_picking_timetable.tpl create mode 100644 modules/dejala/dejala_processes.tpl create mode 100644 modules/dejala/dejala_products.tpl create mode 100644 modules/dejala/dejala_technical_options.tpl create mode 100644 modules/dejala/dejala_timetable.tpl create mode 100644 modules/dejala/dejalacarrierutils.php create mode 100644 modules/dejala/dejalacart.php create mode 100644 modules/dejala/dejalaconfig.php create mode 100644 modules/dejala/dejalatest.php create mode 100644 modules/dejala/dejalautils.php create mode 100644 modules/dejala/deliveries_csv.php create mode 100644 modules/dejala/es.php create mode 100644 modules/dejala/fr.php create mode 100644 modules/dejala/google.gif create mode 100644 modules/dejala/install.sql create mode 100644 modules/dejala/it.php create mode 100644 modules/dejala/logo.gif create mode 100644 modules/dejala/picto_0.gif create mode 100644 modules/dejala/picto_1.gif create mode 100644 modules/dejala/picto_2.gif create mode 100644 modules/dejala/picto_3.gif create mode 100644 modules/dejala/picto_4.gif create mode 100644 modules/dejala/picto_5.gif create mode 100644 modules/dejala/picto_6.gif create mode 100644 modules/dejala/picto_7.gif create mode 100644 modules/dejala/picto_8.gif create mode 100644 modules/dejala/submenu-bg.gif create mode 100644 modules/dejala/timetable.css create mode 100644 modules/dejala/timetable.js create mode 100644 modules/dibs/config.xml create mode 100644 modules/dibs/de.php create mode 100644 modules/dibs/dibs.jpg create mode 100644 modules/dibs/dibs.php create mode 100644 modules/dibs/dibs.tpl create mode 100644 modules/dibs/es.php create mode 100644 modules/dibs/fr.php create mode 100644 modules/dibs/hookorderconfirmation.tpl create mode 100644 modules/dibs/img/da.jpg create mode 100644 modules/dibs/img/en.jpg create mode 100644 modules/dibs/img/no.jpg create mode 100644 modules/dibs/img/sv.jpg create mode 100644 modules/dibs/it.php create mode 100644 modules/dibs/logo.gif create mode 100644 modules/dibs/logos/dibs_black.jpg create mode 100644 modules/dibs/logos/dibs_blue.jpg create mode 100644 modules/dibs/logos/dibs_green.jpg create mode 100644 modules/dibs/logos/dibs_grey.jpg create mode 100644 modules/dibs/logos/dibs_purple.jpg create mode 100644 modules/dibs/logos/dibs_yellow.jpg create mode 100644 modules/dibs/validation.php create mode 100755 modules/ebay/ajax/changeCategoryMatch.php create mode 100755 modules/ebay/ajax/checkToken.php create mode 100755 modules/ebay/ajax/getNbProductsSync.php create mode 100755 modules/ebay/ajax/loadCategoryMatch.php create mode 100755 modules/ebay/config.xml create mode 100644 modules/ebay/de.php create mode 100755 modules/ebay/eBayRequest.php create mode 100755 modules/ebay/ebay.gif create mode 100755 modules/ebay/ebay.php create mode 100644 modules/ebay/es.php create mode 100644 modules/ebay/forbbiden.gif create mode 100755 modules/ebay/fr.php create mode 100644 modules/ebay/it.php create mode 100755 modules/ebay/loading.gif create mode 100755 modules/ebay/logo.gif create mode 100755 modules/ebay/sql-install.php create mode 100755 modules/ebay/sql-uninstall.php create mode 100755 modules/ebay/template/ebay.css create mode 100755 modules/ebay/template/ebay.tpl create mode 100755 modules/ebay/template/images/favorite.png create mode 100755 modules/ebay/template/images/footer.png create mode 100755 modules/ebay/template/images/header.png create mode 100755 modules/ebay/template/images/search.png create mode 100755 modules/ebay/template/images/stats.png create mode 100644 modules/ebay/valid.png create mode 100644 modules/ebay/warn.png create mode 100755 modules/editorial/EditorialClass.php create mode 100755 modules/editorial/config.xml create mode 100644 modules/editorial/de.php create mode 100644 modules/editorial/editorial.php create mode 100644 modules/editorial/editorial.tpl create mode 100644 modules/editorial/en.php create mode 100644 modules/editorial/es.php create mode 100644 modules/editorial/fr.php create mode 100644 modules/editorial/homepage_logo.jpg create mode 100644 modules/editorial/it.php create mode 100644 modules/editorial/logo.gif create mode 100644 modules/ekomi/config.xml create mode 100644 modules/ekomi/de.php create mode 100755 modules/ekomi/ekomi.php create mode 100644 modules/ekomi/es.php create mode 100644 modules/ekomi/fr.php create mode 100644 modules/ekomi/it.php create mode 100755 modules/ekomi/logo.gif create mode 100755 modules/ekomi/mails/de/ekomi.html create mode 100755 modules/ekomi/mails/de/ekomi.txt create mode 100755 modules/ekomi/mails/en/ekomi.html create mode 100755 modules/ekomi/mails/en/ekomi.txt create mode 100755 modules/ekomi/mails/es/ekomi.html create mode 100755 modules/ekomi/mails/es/ekomi.txt create mode 100755 modules/ekomi/mails/fr/ekomi.html create mode 100755 modules/ekomi/mails/fr/ekomi.txt create mode 100755 modules/ekomi/mails/it/ekomi.html create mode 100755 modules/ekomi/mails/it/ekomi.txt create mode 100755 modules/envoimoinscher/AdminEnvoiMoinsCher.gif create mode 100755 modules/envoimoinscher/AdminEnvoiMoinsCher.php create mode 100755 modules/envoimoinscher/config.xml create mode 100644 modules/envoimoinscher/de.php create mode 100755 modules/envoimoinscher/envoimoinscher.php create mode 100644 modules/envoimoinscher/es.php create mode 100755 modules/envoimoinscher/fr.php create mode 100755 modules/envoimoinscher/install.sql create mode 100644 modules/envoimoinscher/it.php create mode 100755 modules/envoimoinscher/logo.gif create mode 100755 modules/envoimoinscher/logocarre.png create mode 100755 modules/envoimoinscher/ps_emc.png create mode 100755 modules/envoimoinscher/tracking.php create mode 100644 modules/fedexcarrier/RateService_v9.wsdl create mode 100644 modules/fedexcarrier/carrier.jpg create mode 100755 modules/fedexcarrier/config.xml create mode 100644 modules/fedexcarrier/de.php create mode 100644 modules/fedexcarrier/es.php create mode 100644 modules/fedexcarrier/fedexcarrier.php create mode 100644 modules/fedexcarrier/fr.php create mode 100644 modules/fedexcarrier/it.php create mode 100644 modules/fedexcarrier/logo.gif create mode 100755 modules/fedexcarrier/sql-install.php create mode 100755 modules/fedexcarrier/sql-uninstall.php create mode 100755 modules/feeder/config.xml create mode 100644 modules/feeder/de.php create mode 100644 modules/feeder/en.php create mode 100644 modules/feeder/es.php create mode 100644 modules/feeder/feeder.php create mode 100644 modules/feeder/feederHeader.tpl create mode 100644 modules/feeder/fr.php create mode 100644 modules/feeder/it.php create mode 100644 modules/feeder/logo.gif create mode 100644 modules/feeder/rss.php create mode 100755 modules/fianetfraud/config.xml create mode 100644 modules/fianetfraud/cron_reevaluate.php create mode 100644 modules/fianetfraud/cron_waiting.php create mode 100644 modules/fianetfraud/de.php create mode 100644 modules/fianetfraud/es.php create mode 100644 modules/fianetfraud/fianet/classes/fianet_key_32bits.php create mode 100644 modules/fianetfraud/fianet/classes/fianet_key_64bits.php create mode 100644 modules/fianetfraud/fianet/classes/fianet_sender.php create mode 100644 modules/fianetfraud/fianet/classes/fianet_sender.private.inc.php create mode 100644 modules/fianetfraud/fianet/classes/fianet_socket.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_adress_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_appartment_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_billing_adress_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_billing_user_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_delivery_adress_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_delivery_user_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_info_order_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_order_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_paraobject_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_payment_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_product_list_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_product_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_rnp_info_order_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_rnp_order_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_rnp_wallet_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_transport_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_user_siteconso_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_user_xml.php create mode 100644 modules/fianetfraud/fianet/classes/order/fianet_xml_paracallback_builder.php create mode 100644 modules/fianetfraud/fianet/const/fianet.php create mode 100644 modules/fianetfraud/fianet/const/url_rnp.php create mode 100644 modules/fianetfraud/fianet/const/url_sac.php create mode 100644 modules/fianetfraud/fianet/fianet.php create mode 100644 modules/fianetfraud/fianet/includes/debug.php create mode 100644 modules/fianetfraud/fianet/includes/general.php create mode 100644 modules/fianetfraud/fianet/includes/xml2array.php create mode 100644 modules/fianetfraud/fianet/to_implement/implement.php create mode 100644 modules/fianetfraud/fianetfraud.php create mode 100644 modules/fianetfraud/fr.php create mode 100644 modules/fianetfraud/install.sql create mode 100644 modules/fianetfraud/it.php create mode 100644 modules/fianetfraud/logo.gif create mode 100644 modules/fianetfraud/logo.jpg create mode 100755 modules/fianetsceau/config.xml create mode 100644 modules/fianetsceau/de.php create mode 100644 modules/fianetsceau/es.php create mode 100644 modules/fianetsceau/fianetsceau.php create mode 100644 modules/fianetsceau/fr.php create mode 100644 modules/fianetsceau/it.php create mode 100644 modules/fianetsceau/logo.gif create mode 100644 modules/fianetsceau/logo.jpg create mode 100755 modules/followup/config.xml create mode 100644 modules/followup/cron.php create mode 100644 modules/followup/de.php create mode 100644 modules/followup/en.php create mode 100644 modules/followup/es.php create mode 100644 modules/followup/followup.php create mode 100644 modules/followup/fr.php create mode 100644 modules/followup/it.php create mode 100644 modules/followup/logo-2.gif create mode 100644 modules/followup/logo.gif create mode 100644 modules/followup/mails/de/followup_1.html create mode 100644 modules/followup/mails/de/followup_1.txt create mode 100644 modules/followup/mails/de/followup_2.html create mode 100644 modules/followup/mails/de/followup_2.txt create mode 100644 modules/followup/mails/de/followup_3.html create mode 100644 modules/followup/mails/de/followup_3.txt create mode 100644 modules/followup/mails/de/followup_4.html create mode 100644 modules/followup/mails/de/followup_4.txt create mode 100644 modules/followup/mails/en/followup_1.html create mode 100644 modules/followup/mails/en/followup_1.txt create mode 100644 modules/followup/mails/en/followup_2.html create mode 100644 modules/followup/mails/en/followup_2.txt create mode 100644 modules/followup/mails/en/followup_3.html create mode 100644 modules/followup/mails/en/followup_3.txt create mode 100644 modules/followup/mails/en/followup_4.html create mode 100644 modules/followup/mails/en/followup_4.txt create mode 100644 modules/followup/mails/es/followup_1.html create mode 100644 modules/followup/mails/es/followup_1.txt create mode 100644 modules/followup/mails/es/followup_2.html create mode 100644 modules/followup/mails/es/followup_2.txt create mode 100644 modules/followup/mails/es/followup_3.html create mode 100644 modules/followup/mails/es/followup_3.txt create mode 100644 modules/followup/mails/es/followup_4.html create mode 100644 modules/followup/mails/es/followup_4.txt create mode 100644 modules/followup/mails/fr/followup_1.html create mode 100644 modules/followup/mails/fr/followup_1.txt create mode 100644 modules/followup/mails/fr/followup_2.html create mode 100644 modules/followup/mails/fr/followup_2.txt create mode 100644 modules/followup/mails/fr/followup_3.html create mode 100644 modules/followup/mails/fr/followup_3.txt create mode 100644 modules/followup/mails/fr/followup_4.html create mode 100644 modules/followup/mails/fr/followup_4.txt create mode 100644 modules/followup/mails/it/followup_1.html create mode 100644 modules/followup/mails/it/followup_1.txt create mode 100644 modules/followup/mails/it/followup_2.html create mode 100644 modules/followup/mails/it/followup_2.txt create mode 100644 modules/followup/mails/it/followup_3.html create mode 100644 modules/followup/mails/it/followup_3.txt create mode 100644 modules/followup/mails/it/followup_4.html create mode 100644 modules/followup/mails/it/followup_4.txt create mode 100644 modules/gadsense/adsense_script.gif create mode 100755 modules/gadsense/config.xml create mode 100644 modules/gadsense/de.php create mode 100644 modules/gadsense/en.php create mode 100644 modules/gadsense/es.php create mode 100644 modules/gadsense/fr.php create mode 100644 modules/gadsense/gadsense.php create mode 100644 modules/gadsense/it.php create mode 100644 modules/gadsense/logo.gif create mode 100755 modules/ganalytics/config.xml create mode 100644 modules/ganalytics/de.php create mode 100644 modules/ganalytics/en.php create mode 100644 modules/ganalytics/es.php create mode 100644 modules/ganalytics/fr.php create mode 100644 modules/ganalytics/ganalytics.php create mode 100644 modules/ganalytics/header.tpl create mode 100644 modules/ganalytics/it.php create mode 100644 modules/ganalytics/logo.gif create mode 100644 modules/gcheckout/.htaccess create mode 100755 modules/gcheckout/config.xml create mode 100644 modules/gcheckout/confirm.tpl create mode 100644 modules/gcheckout/de.php create mode 100644 modules/gcheckout/en.php create mode 100644 modules/gcheckout/es.php create mode 100644 modules/gcheckout/fr.php create mode 100644 modules/gcheckout/gcheckout.gif create mode 100644 modules/gcheckout/gcheckout.php create mode 100644 modules/gcheckout/htaccessBugInformation.php create mode 100644 modules/gcheckout/it.php create mode 100644 modules/gcheckout/library/googlecart.php create mode 100644 modules/gcheckout/library/googleitem.php create mode 100644 modules/gcheckout/library/googlelog.php create mode 100644 modules/gcheckout/library/googlemerchantcalculations.php create mode 100644 modules/gcheckout/library/googlerequest.php create mode 100644 modules/gcheckout/library/googleresponse.php create mode 100644 modules/gcheckout/library/googleresult.php create mode 100644 modules/gcheckout/library/googleshipping.php create mode 100644 modules/gcheckout/library/googletax.php create mode 100644 modules/gcheckout/library/xml-processing/gc_xmlbuilder.php create mode 100644 modules/gcheckout/library/xml-processing/gc_xmlparser.php create mode 100644 modules/gcheckout/logo.gif create mode 100644 modules/gcheckout/payment.php create mode 100644 modules/gcheckout/payment.tpl create mode 100644 modules/gcheckout/payment_return.tpl create mode 100644 modules/gcheckout/validation.php create mode 100644 modules/graphartichow/artichow/AntiSpam.class.php create mode 100644 modules/graphartichow/artichow/Artichow.cfg.php create mode 100644 modules/graphartichow/artichow/BarPlot.class.php create mode 100644 modules/graphartichow/artichow/Component.class.php create mode 100644 modules/graphartichow/artichow/Graph.class.php create mode 100644 modules/graphartichow/artichow/Image.class.php create mode 100644 modules/graphartichow/artichow/LinePlot.class.php create mode 100644 modules/graphartichow/artichow/MathPlot.class.php create mode 100644 modules/graphartichow/artichow/Pattern.class.php create mode 100644 modules/graphartichow/artichow/Pie.class.php create mode 100644 modules/graphartichow/artichow/Plot.class.php create mode 100644 modules/graphartichow/artichow/ScatterPlot.class.php create mode 100644 modules/graphartichow/artichow/cache/Abel create mode 100644 modules/graphartichow/artichow/cache/Abel-time create mode 100644 modules/graphartichow/artichow/cache/Albert create mode 100644 modules/graphartichow/artichow/cache/Albert-time create mode 100644 modules/graphartichow/artichow/cache/Example-006 create mode 100644 modules/graphartichow/artichow/cache/Example-006-time create mode 100644 modules/graphartichow/artichow/common.php create mode 100644 modules/graphartichow/artichow/font/Tuffy.ttf create mode 100644 modules/graphartichow/artichow/font/TuffyBold.ttf create mode 100644 modules/graphartichow/artichow/font/TuffyBoldItalic.ttf create mode 100644 modules/graphartichow/artichow/font/TuffyItalic.ttf create mode 100644 modules/graphartichow/artichow/images/book.png create mode 100644 modules/graphartichow/artichow/images/error.png create mode 100644 modules/graphartichow/artichow/images/errors/missing-anti-aliasing.png create mode 100644 modules/graphartichow/artichow/images/errors/missing-gd2.png create mode 100644 modules/graphartichow/artichow/images/paperclip.png create mode 100644 modules/graphartichow/artichow/images/star.png create mode 100644 modules/graphartichow/artichow/inc/Axis.class.php create mode 100644 modules/graphartichow/artichow/inc/Border.class.php create mode 100644 modules/graphartichow/artichow/inc/Color.class.php create mode 100644 modules/graphartichow/artichow/inc/Driver.class.php create mode 100644 modules/graphartichow/artichow/inc/Font.class.php create mode 100644 modules/graphartichow/artichow/inc/Gradient.class.php create mode 100644 modules/graphartichow/artichow/inc/Grid.class.php create mode 100644 modules/graphartichow/artichow/inc/Label.class.php create mode 100644 modules/graphartichow/artichow/inc/Legend.class.php create mode 100644 modules/graphartichow/artichow/inc/Mark.class.php create mode 100644 modules/graphartichow/artichow/inc/Math.class.php create mode 100644 modules/graphartichow/artichow/inc/Shadow.class.php create mode 100644 modules/graphartichow/artichow/inc/Text.class.php create mode 100644 modules/graphartichow/artichow/inc/Tick.class.php create mode 100644 modules/graphartichow/artichow/inc/Tools.class.php create mode 100644 modules/graphartichow/artichow/inc/drivers/gd.class.php create mode 100644 modules/graphartichow/artichow/inc/drivers/ming.class.php create mode 100644 modules/graphartichow/artichow/patterns/BarDepth.php create mode 100644 modules/graphartichow/artichow/patterns/LightLine.php create mode 100755 modules/graphartichow/config.xml create mode 100644 modules/graphartichow/de.php create mode 100644 modules/graphartichow/en.php create mode 100644 modules/graphartichow/es.php create mode 100644 modules/graphartichow/fr.php create mode 100644 modules/graphartichow/graphartichow.php create mode 100644 modules/graphartichow/it.php create mode 100644 modules/graphartichow/logo.gif create mode 100755 modules/graphgooglechart/config.xml create mode 100644 modules/graphgooglechart/de.php create mode 100644 modules/graphgooglechart/en.php create mode 100644 modules/graphgooglechart/es.php create mode 100644 modules/graphgooglechart/fr.php create mode 100644 modules/graphgooglechart/graphgooglechart.php create mode 100644 modules/graphgooglechart/it.php create mode 100644 modules/graphgooglechart/logo.gif create mode 100755 modules/graphvisifire/config.xml create mode 100644 modules/graphvisifire/de.php create mode 100644 modules/graphvisifire/en.php create mode 100644 modules/graphvisifire/es.php create mode 100644 modules/graphvisifire/fr.php create mode 100644 modules/graphvisifire/graphvisifire.php create mode 100644 modules/graphvisifire/it.php create mode 100644 modules/graphvisifire/logo.gif create mode 100644 modules/graphvisifire/visifire/Visifire.js create mode 100644 modules/graphvisifire/visifire/Visifire.xap create mode 100755 modules/graphxmlswfcharts/config.xml create mode 100644 modules/graphxmlswfcharts/de.php create mode 100644 modules/graphxmlswfcharts/en.php create mode 100644 modules/graphxmlswfcharts/es.php create mode 100644 modules/graphxmlswfcharts/fr.php create mode 100644 modules/graphxmlswfcharts/graphxmlswfcharts.php create mode 100644 modules/graphxmlswfcharts/it.php create mode 100644 modules/graphxmlswfcharts/logo.gif create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/AC_RunActiveContent.js create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts.txt create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/ar3d.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/arno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/ars3.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/arst.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/brfl.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/brno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/brst.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/buno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/cl3d.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/clfl.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/clim.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/clno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/clp3.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/cls3.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/clst.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/cnno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/dono.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/lnno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/mxno.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/pi3d.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/piim.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/pino.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/pono.swf create mode 100644 modules/graphxmlswfcharts/xml_swf_charts/charts_library/scno.swf create mode 100755 modules/gridhtml/config.xml create mode 100644 modules/gridhtml/de.php create mode 100644 modules/gridhtml/en.php create mode 100644 modules/gridhtml/es.php create mode 100644 modules/gridhtml/fr.php create mode 100644 modules/gridhtml/gridhtml.php create mode 100644 modules/gridhtml/it.php create mode 100644 modules/gridhtml/logo.gif create mode 100755 modules/gsitemap/config.xml create mode 100644 modules/gsitemap/de.php create mode 100644 modules/gsitemap/en.php create mode 100644 modules/gsitemap/es.php create mode 100644 modules/gsitemap/fr.php create mode 100644 modules/gsitemap/gsitemap.php create mode 100644 modules/gsitemap/it.php create mode 100644 modules/gsitemap/logo.gif create mode 100644 modules/hipay/1.png create mode 100644 modules/hipay/2.png create mode 100644 modules/hipay/3.png create mode 100755 modules/hipay/config.xml create mode 100644 modules/hipay/create.jpg create mode 100644 modules/hipay/de.php create mode 100644 modules/hipay/es.php create mode 100644 modules/hipay/fr.php create mode 100644 modules/hipay/help.png create mode 100644 modules/hipay/hipay.php create mode 100644 modules/hipay/hipay.png create mode 100644 modules/hipay/it.php create mode 100644 modules/hipay/logo.gif create mode 100644 modules/hipay/mapi/mapi_affiliate.php create mode 100644 modules/hipay/mapi/mapi_comm_xml.php create mode 100644 modules/hipay/mapi/mapi_defs.php create mode 100644 modules/hipay/mapi/mapi_exception.php create mode 100644 modules/hipay/mapi/mapi_installment.php create mode 100644 modules/hipay/mapi/mapi_item.php create mode 100644 modules/hipay/mapi/mapi_lockable.php create mode 100644 modules/hipay/mapi/mapi_multiplepayment.php create mode 100644 modules/hipay/mapi/mapi_order.php create mode 100644 modules/hipay/mapi/mapi_package.php create mode 100644 modules/hipay/mapi/mapi_payment.php create mode 100644 modules/hipay/mapi/mapi_paymentparams.php create mode 100644 modules/hipay/mapi/mapi_product.php create mode 100644 modules/hipay/mapi/mapi_send_xml.php create mode 100644 modules/hipay/mapi/mapi_simplepayment.php create mode 100644 modules/hipay/mapi/mapi_tax.php create mode 100644 modules/hipay/mapi/mapi_utf8.php create mode 100644 modules/hipay/mapi/mapi_utils.php create mode 100644 modules/hipay/mapi/mapi_xml.php create mode 100644 modules/hipay/payment.tpl create mode 100644 modules/hipay/redirect.php create mode 100644 modules/hipay/screenshots/accountnumber.png create mode 100644 modules/hipay/screenshots/merchantpassword.png create mode 100644 modules/hipay/screenshots/siteid.png create mode 100644 modules/hipay/validation.php create mode 100755 modules/homefeatured/config.xml create mode 100644 modules/homefeatured/de.php create mode 100644 modules/homefeatured/en.php create mode 100644 modules/homefeatured/es.php create mode 100644 modules/homefeatured/fr.php create mode 100644 modules/homefeatured/homefeatured.php create mode 100644 modules/homefeatured/homefeatured.tpl create mode 100644 modules/homefeatured/it.php create mode 100644 modules/homefeatured/logo.gif create mode 100755 modules/iadvize/config.xml create mode 100644 modules/iadvize/de.php create mode 100644 modules/iadvize/es.php create mode 100644 modules/iadvize/fr.php create mode 100755 modules/iadvize/iadvize.php create mode 100644 modules/iadvize/it.php create mode 100755 modules/iadvize/logo-iadvize.gif create mode 100755 modules/iadvize/logo.gif create mode 100755 modules/iadvize/offer-fr.jpg create mode 100644 modules/importerosc/config.xml create mode 100644 modules/importerosc/de.php create mode 100644 modules/importerosc/es.php create mode 100644 modules/importerosc/fr.php create mode 100644 modules/importerosc/importerosc.php create mode 100644 modules/importerosc/it.php create mode 100644 modules/importerosc/logo.gif create mode 100755 modules/importerosc/passwordhash.php create mode 100644 modules/index.php create mode 100644 modules/livezilla/config.xml create mode 100644 modules/livezilla/de.php create mode 100644 modules/livezilla/es.php create mode 100644 modules/livezilla/fr.php create mode 100644 modules/livezilla/it.php create mode 100644 modules/livezilla/livezilla.php create mode 100644 modules/livezilla/livezilla.tpl create mode 100644 modules/livezilla/logo.gif create mode 100644 modules/livezilla/lz_download.gif create mode 100644 modules/livezilla/lz_package.gif create mode 100644 modules/livezilla/offline.png create mode 100644 modules/loyalty/LoyaltyModule.php create mode 100644 modules/loyalty/LoyaltyStateModule.php create mode 100755 modules/loyalty/config.xml create mode 100644 modules/loyalty/de.php create mode 100644 modules/loyalty/en.php create mode 100644 modules/loyalty/es.php create mode 100644 modules/loyalty/fr.php create mode 100644 modules/loyalty/it.php create mode 100644 modules/loyalty/logo.gif create mode 100644 modules/loyalty/loyalty-program.php create mode 100644 modules/loyalty/loyalty.gif create mode 100644 modules/loyalty/loyalty.php create mode 100644 modules/loyalty/loyalty.tpl create mode 100644 modules/loyalty/my-account.tpl create mode 100644 modules/loyalty/product.tpl create mode 100644 modules/loyalty/shopping-cart.tpl create mode 100755 modules/mailalerts/config.xml create mode 100644 modules/mailalerts/de.php create mode 100644 modules/mailalerts/en.php create mode 100644 modules/mailalerts/es.php create mode 100644 modules/mailalerts/fr.php create mode 100644 modules/mailalerts/img/delete.gif create mode 100644 modules/mailalerts/it.php create mode 100644 modules/mailalerts/logo.gif create mode 100644 modules/mailalerts/mailalerts-ajax_add.php create mode 100644 modules/mailalerts/mailalerts-ajax_check.php create mode 100644 modules/mailalerts/mailalerts.php create mode 100644 modules/mailalerts/mails/de/customer_qty.html create mode 100644 modules/mailalerts/mails/de/customer_qty.txt create mode 100644 modules/mailalerts/mails/de/new_order.html create mode 100644 modules/mailalerts/mails/de/new_order.txt create mode 100644 modules/mailalerts/mails/de/productoutofstock.html create mode 100644 modules/mailalerts/mails/de/productoutofstock.txt create mode 100644 modules/mailalerts/mails/en/customer_qty.html create mode 100644 modules/mailalerts/mails/en/customer_qty.txt create mode 100644 modules/mailalerts/mails/en/new_order.html create mode 100644 modules/mailalerts/mails/en/new_order.txt create mode 100644 modules/mailalerts/mails/en/productoutofstock.html create mode 100644 modules/mailalerts/mails/en/productoutofstock.txt create mode 100644 modules/mailalerts/mails/es/customer_qty.html create mode 100644 modules/mailalerts/mails/es/customer_qty.txt create mode 100644 modules/mailalerts/mails/es/new_order.html create mode 100644 modules/mailalerts/mails/es/new_order.txt create mode 100644 modules/mailalerts/mails/es/productoutofstock.html create mode 100644 modules/mailalerts/mails/es/productoutofstock.txt create mode 100644 modules/mailalerts/mails/fr/customer_qty.html create mode 100644 modules/mailalerts/mails/fr/customer_qty.txt create mode 100644 modules/mailalerts/mails/fr/new_order.html create mode 100644 modules/mailalerts/mails/fr/new_order.txt create mode 100644 modules/mailalerts/mails/fr/productoutofstock.html create mode 100644 modules/mailalerts/mails/fr/productoutofstock.txt create mode 100644 modules/mailalerts/mails/it/customer_qty.html create mode 100644 modules/mailalerts/mails/it/customer_qty.txt create mode 100644 modules/mailalerts/mails/it/new_order.html create mode 100644 modules/mailalerts/mails/it/new_order.txt create mode 100644 modules/mailalerts/mails/it/productoutofstock.html create mode 100644 modules/mailalerts/mails/it/productoutofstock.txt create mode 100644 modules/mailalerts/my-account.tpl create mode 100644 modules/mailalerts/myalerts.php create mode 100644 modules/mailalerts/myalerts.tpl create mode 100644 modules/mailalerts/product.tpl create mode 100755 modules/mondialrelay/AdminMondialRelay.gif create mode 100755 modules/mondialrelay/AdminMondialRelay.php create mode 100755 modules/mondialrelay/ajax.php create mode 100755 modules/mondialrelay/classes/IMondialRelayWSMethod.php create mode 100755 modules/mondialrelay/classes/MRCreateTickets.php create mode 100755 modules/mondialrelay/classes/MRGetTickets.php create mode 100755 modules/mondialrelay/classes/MRManagement.php create mode 100755 modules/mondialrelay/classes/MondialRelayClass.php create mode 100755 modules/mondialrelay/config.xml create mode 100755 modules/mondialrelay/cron.php create mode 100644 modules/mondialrelay/de.php create mode 100755 modules/mondialrelay/en.php create mode 100755 modules/mondialrelay/errorCode.php create mode 100644 modules/mondialrelay/es.php create mode 100755 modules/mondialrelay/fr.php create mode 100755 modules/mondialrelay/googlemap.php create mode 100755 modules/mondialrelay/images/getTickets.gif create mode 100644 modules/mondialrelay/images/loader.gif create mode 100755 modules/mondialrelay/images/logo.gif create mode 100755 modules/mondialrelay/images/pdf_icon.jpg create mode 100644 modules/mondialrelay/it.php create mode 100644 modules/mondialrelay/jquery-1.4.4.min.js create mode 100755 modules/mondialrelay/kit_mondialrelay/MR.gif create mode 100755 modules/mondialrelay/kit_mondialrelay/MR_small.gif create mode 100755 modules/mondialrelay/kit_mondialrelay/RechercheDetailPointRelais_ajax.php create mode 100755 modules/mondialrelay/kit_mondialrelay/RecherchePointRelais_ajax.php create mode 100755 modules/mondialrelay/kit_mondialrelay/SuiviExpedition_ajax.php create mode 100755 modules/mondialrelay/kit_mondialrelay/close.gif create mode 100755 modules/mondialrelay/kit_mondialrelay/js/include_MR.js create mode 100755 modules/mondialrelay/kit_mondialrelay/js/ressources_MR.js create mode 100755 modules/mondialrelay/kit_mondialrelay/loading.gif create mode 100755 modules/mondialrelay/kit_mondialrelay/loupe.gif create mode 100755 modules/mondialrelay/kit_mondialrelay/marker.gif create mode 100644 modules/mondialrelay/kit_mondialrelay/mr_opc_ajax.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.nusoap_base.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_fault.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_parser.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_server.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_transport_http.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_val.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soapclient.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdl.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdlcache.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.xmlschema.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoap.php create mode 100755 modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoapmime.php create mode 100755 modules/mondialrelay/lib/nusoap/class.nusoap_base.php create mode 100755 modules/mondialrelay/lib/nusoap/class.soap_fault.php create mode 100755 modules/mondialrelay/lib/nusoap/class.soap_parser.php create mode 100755 modules/mondialrelay/lib/nusoap/class.soap_server.php create mode 100755 modules/mondialrelay/lib/nusoap/class.soap_transport_http.php create mode 100755 modules/mondialrelay/lib/nusoap/class.soap_val.php create mode 100755 modules/mondialrelay/lib/nusoap/class.soapclient.php create mode 100755 modules/mondialrelay/lib/nusoap/class.wsdl.php create mode 100755 modules/mondialrelay/lib/nusoap/class.wsdlcache.php create mode 100755 modules/mondialrelay/lib/nusoap/class.xmlschema.php create mode 100755 modules/mondialrelay/lib/nusoap/nusoap.php create mode 100755 modules/mondialrelay/lib/nusoap/nusoapmime.php create mode 100755 modules/mondialrelay/logo.gif create mode 100755 modules/mondialrelay/mondialrelay.js create mode 100755 modules/mondialrelay/mondialrelay.php create mode 100755 modules/mondialrelay/mondialrelay.tpl create mode 100755 modules/mondialrelay/mrInstall.sql create mode 100755 modules/mondialrelay/orderDetail.tpl create mode 100755 modules/mondialrelay/page_iso.php create mode 100755 modules/mondialrelay/sitemap.xml create mode 100755 modules/mondialrelay/style.css create mode 100755 modules/moneybookers/config.xml create mode 100644 modules/moneybookers/confirmation.tpl create mode 100644 modules/moneybookers/de.php create mode 100644 modules/moneybookers/es.php create mode 100644 modules/moneybookers/fr.php create mode 100644 modules/moneybookers/it.php create mode 100644 modules/moneybookers/logo-cc-1.gif create mode 100644 modules/moneybookers/logo-cc-2.gif create mode 100644 modules/moneybookers/logo-mb-1.gif create mode 100644 modules/moneybookers/logo-mb-2.gif create mode 100644 modules/moneybookers/logo-mb-3.gif create mode 100644 modules/moneybookers/logo-mb-4.gif create mode 100644 modules/moneybookers/logo-mb-5.gif create mode 100644 modules/moneybookers/logo-mb-6.gif create mode 100644 modules/moneybookers/logo-mb-7.gif create mode 100644 modules/moneybookers/logo-mb.gif create mode 100644 modules/moneybookers/logo.gif create mode 100644 modules/moneybookers/logos/international/amex.gif create mode 100644 modules/moneybookers/logos/international/diners.gif create mode 100644 modules/moneybookers/logos/international/ewallet.gif create mode 100644 modules/moneybookers/logos/international/jcb.gif create mode 100644 modules/moneybookers/logos/international/maestro.gif create mode 100644 modules/moneybookers/logos/international/mastercard.gif create mode 100644 modules/moneybookers/logos/international/visa.gif create mode 100644 modules/moneybookers/logos/international/visadebit.gif create mode 100644 modules/moneybookers/logos/local/4b.gif create mode 100644 modules/moneybookers/logos/local/cartasi.gif create mode 100644 modules/moneybookers/logos/local/cartebleue.gif create mode 100644 modules/moneybookers/logos/local/dankort.gif create mode 100644 modules/moneybookers/logos/local/ec.gif create mode 100644 modules/moneybookers/logos/local/enets.gif create mode 100644 modules/moneybookers/logos/local/epay.gif create mode 100644 modules/moneybookers/logos/local/eps.gif create mode 100644 modules/moneybookers/logos/local/euro6000.gif create mode 100644 modules/moneybookers/logos/local/giropay.gif create mode 100644 modules/moneybookers/logos/local/ideal.gif create mode 100644 modules/moneybookers/logos/local/instantbanktransfer.gif create mode 100644 modules/moneybookers/logos/local/laser.gif create mode 100644 modules/moneybookers/logos/local/nordea.gif create mode 100644 modules/moneybookers/logos/local/p24.gif create mode 100644 modules/moneybookers/logos/local/pekao.gif create mode 100644 modules/moneybookers/logos/local/poli.gif create mode 100644 modules/moneybookers/logos/local/postepay.gif create mode 100644 modules/moneybookers/logos/local/sofort.gif create mode 100644 modules/moneybookers/logos/local/solo.gif create mode 100644 modules/moneybookers/logos/local/unionpay.gif create mode 100644 modules/moneybookers/logos/local/visaelectron.gif create mode 100644 modules/moneybookers/moneybookers-currency-error.tpl create mode 100644 modules/moneybookers/moneybookers.php create mode 100644 modules/moneybookers/moneybookers.tpl create mode 100644 modules/moneybookers/prestashop_mb_en.gif create mode 100644 modules/moneybookers/prestashop_mb_fr.gif create mode 100644 modules/moneybookers/validation.php create mode 100755 modules/newsletter/config.xml create mode 100644 modules/newsletter/de.php create mode 100644 modules/newsletter/en.php create mode 100644 modules/newsletter/es.php create mode 100644 modules/newsletter/fr.php create mode 100644 modules/newsletter/it.php create mode 100644 modules/newsletter/logo.gif create mode 100644 modules/newsletter/newsletter.php create mode 100644 modules/ogone/checkwaitingorder.php create mode 100755 modules/ogone/config.xml create mode 100644 modules/ogone/confirmation.php create mode 100644 modules/ogone/de.php create mode 100644 modules/ogone/docs/en1.png create mode 100644 modules/ogone/docs/en2.png create mode 100644 modules/ogone/docs/en3.png create mode 100644 modules/ogone/docs/en4.png create mode 100644 modules/ogone/es.php create mode 100644 modules/ogone/fr.php create mode 100644 modules/ogone/hookorderconfirmation.tpl create mode 100644 modules/ogone/it.php create mode 100644 modules/ogone/logo.gif create mode 100644 modules/ogone/ogone.gif create mode 100644 modules/ogone/ogone.php create mode 100644 modules/ogone/ogone.tpl create mode 100644 modules/ogone/validation.php create mode 100644 modules/ogone/waiting.tpl create mode 100644 modules/pagesnotfound/comment.gif create mode 100755 modules/pagesnotfound/config.xml create mode 100644 modules/pagesnotfound/de.php create mode 100644 modules/pagesnotfound/en.php create mode 100644 modules/pagesnotfound/es.php create mode 100644 modules/pagesnotfound/fr.php create mode 100644 modules/pagesnotfound/it.php create mode 100644 modules/pagesnotfound/logo.gif create mode 100644 modules/pagesnotfound/pagesnotfound.php create mode 100644 modules/paypal/about.php create mode 100644 modules/paypal/about.tpl create mode 100644 modules/paypal/api/paypalconnect.php create mode 100644 modules/paypal/api/paypallib.php create mode 100644 modules/paypal/column.tpl create mode 100755 modules/paypal/config.xml create mode 100644 modules/paypal/confirm.tpl create mode 100644 modules/paypal/confirmation.tpl create mode 100644 modules/paypal/de.php create mode 100644 modules/paypal/error.tpl create mode 100644 modules/paypal/es.php create mode 100644 modules/paypal/express/authentication.tpl create mode 100644 modules/paypal/express/login.tpl create mode 100644 modules/paypal/express/paypalexpress.php create mode 100644 modules/paypal/express/shopping_cart.tpl create mode 100644 modules/paypal/express/submit.php create mode 100644 modules/paypal/fr.php create mode 100644 modules/paypal/img/AU_pp_express.gif create mode 100644 modules/paypal/img/AU_pp_integral.gif create mode 100644 modules/paypal/img/CA_pp_express.gif create mode 100644 modules/paypal/img/CA_pp_integral.gif create mode 100644 modules/paypal/img/CN_pp_express.gif create mode 100644 modules/paypal/img/CN_pp_integral.gif create mode 100644 modules/paypal/img/DE_pp_express.gif create mode 100644 modules/paypal/img/DE_pp_integral.gif create mode 100644 modules/paypal/img/ES_pp_express.gif create mode 100644 modules/paypal/img/ES_pp_integral.gif create mode 100644 modules/paypal/img/FR_pp_express.gif create mode 100644 modules/paypal/img/FR_pp_integral.gif create mode 100644 modules/paypal/img/IT_pp_express.gif create mode 100644 modules/paypal/img/IT_pp_integral.gif create mode 100644 modules/paypal/img/JP_pp_express.gif create mode 100644 modules/paypal/img/JP_pp_integral.gif create mode 100644 modules/paypal/img/NL_pp_express.gif create mode 100644 modules/paypal/img/NL_pp_integral.gif create mode 100644 modules/paypal/img/PL_pp_express.gif create mode 100644 modules/paypal/img/PL_pp_integral.gif create mode 100644 modules/paypal/img/PayPal_mark_60x38.gif create mode 100644 modules/paypal/img/UK_pp_express.gif create mode 100644 modules/paypal/img/UK_pp_integral.gif create mode 100644 modules/paypal/img/US_pp_express.gif create mode 100644 modules/paypal/img/US_pp_integral.gif create mode 100644 modules/paypal/img/integral_evolution.png create mode 100644 modules/paypal/img/integral_evolution_vertical.png create mode 100644 modules/paypal/img/vertical_FR_large.png create mode 100644 modules/paypal/img/vertical_US_large.png create mode 100644 modules/paypal/integral_evolution/paypal.tpl create mode 100644 modules/paypal/integral_evolution/redirect.php create mode 100644 modules/paypal/integral_evolution/redirect.tpl create mode 100644 modules/paypal/ipn.php create mode 100644 modules/paypal/it.php create mode 100644 modules/paypal/logo.gif create mode 100644 modules/paypal/mails/de/error_reporting.html create mode 100644 modules/paypal/mails/de/error_reporting.txt create mode 100644 modules/paypal/mails/en/error_reporting.html create mode 100644 modules/paypal/mails/en/error_reporting.txt create mode 100644 modules/paypal/mails/es/error_reporting.html create mode 100644 modules/paypal/mails/es/error_reporting.txt create mode 100644 modules/paypal/mails/fr/error_reporting.html create mode 100644 modules/paypal/mails/fr/error_reporting.txt create mode 100644 modules/paypal/mails/it/error_reporting.html create mode 100644 modules/paypal/mails/it/error_reporting.txt create mode 100644 modules/paypal/payment/payment.tpl create mode 100644 modules/paypal/payment/paypalpayment.php create mode 100644 modules/paypal/payment/submit.php create mode 100644 modules/paypal/paypal.gif create mode 100644 modules/paypal/paypal.php create mode 100644 modules/paypal/prestashop_paypal.png create mode 100644 modules/paypal/standard/paypal.tpl create mode 100644 modules/paypal/standard/redirect.php create mode 100644 modules/paypal/standard/redirect.tpl create mode 100644 modules/paypal/validation.php create mode 100644 modules/paysafecard/Disposition.php create mode 100644 modules/paysafecard/PrepaidServices.php create mode 100644 modules/paysafecard/PrepaidServicesAPI.php create mode 100755 modules/paysafecard/config.xml create mode 100644 modules/paysafecard/de.php create mode 100644 modules/paysafecard/disposition-error.tpl create mode 100755 modules/paysafecard/es.php create mode 100755 modules/paysafecard/fr.php create mode 100644 modules/paysafecard/img/payment-logo.png create mode 100644 modules/paysafecard/img/payment-small.png create mode 100644 modules/paysafecard/img/payment.png create mode 100644 modules/paysafecard/it.php create mode 100755 modules/paysafecard/keyring/.htaccess create mode 100755 modules/paysafecard/keyring/paysafecard-CA.pem create mode 100644 modules/paysafecard/logo.gif create mode 100644 modules/paysafecard/payment.php create mode 100644 modules/paysafecard/payment.tpl create mode 100644 modules/paysafecard/paysafecard-accept-payment.tpl create mode 100644 modules/paysafecard/paysafecard-confirmation.tpl create mode 100644 modules/paysafecard/paysafecard.php create mode 100644 modules/paysafecard/prepaidservices.js create mode 100644 modules/paysafecard/redirect.php create mode 100644 modules/prestafraud/config.xml create mode 100644 modules/prestafraud/de.php create mode 100644 modules/prestafraud/es.php create mode 100644 modules/prestafraud/fr.php create mode 100644 modules/prestafraud/install.sql create mode 100755 modules/prestafraud/it.php create mode 100644 modules/prestafraud/logo.gif create mode 100644 modules/prestafraud/prestafraud.php create mode 100644 modules/productcomments/ProductComment.php create mode 100644 modules/productcomments/ProductCommentCriterion.php create mode 100644 modules/productcomments/ProductCriterion.php create mode 100755 modules/productcomments/config.xml create mode 100644 modules/productcomments/de.php create mode 100644 modules/productcomments/en.php create mode 100644 modules/productcomments/es.php create mode 100644 modules/productcomments/fr.php create mode 100644 modules/productcomments/img/accept.png create mode 100644 modules/productcomments/img/comment.png create mode 100644 modules/productcomments/img/comments_delete.png create mode 100644 modules/productcomments/img/delete.gif create mode 100644 modules/productcomments/img/delete.png create mode 100644 modules/productcomments/img/note.png create mode 100644 modules/productcomments/img/note_go.png create mode 100644 modules/productcomments/img/star.gif create mode 100644 modules/productcomments/install.sql create mode 100644 modules/productcomments/it.php create mode 100644 modules/productcomments/js/jquery.rating.pack.js create mode 100644 modules/productcomments/js/moderate.js create mode 100644 modules/productcomments/js/productCriterion.js create mode 100755 modules/productcomments/js/products-comparison.js create mode 100644 modules/productcomments/logo.gif create mode 100644 modules/productcomments/productcomments.php create mode 100644 modules/productcomments/productcomments.tpl create mode 100644 modules/productcomments/productcommentscriterion.php create mode 100755 modules/productcomments/products-comparison.tpl create mode 100644 modules/productcomments/tab.tpl create mode 100755 modules/productscategory/config.xml create mode 100644 modules/productscategory/de.php create mode 100644 modules/productscategory/en.php create mode 100644 modules/productscategory/es.php create mode 100644 modules/productscategory/fr.php create mode 100644 modules/productscategory/img/thumbs_left.gif create mode 100644 modules/productscategory/img/thumbs_right.gif create mode 100644 modules/productscategory/it.php create mode 100644 modules/productscategory/logo.gif create mode 100644 modules/productscategory/productscategory.css create mode 100644 modules/productscategory/productscategory.js create mode 100644 modules/productscategory/productscategory.php create mode 100644 modules/productscategory/productscategory.tpl create mode 100755 modules/producttooltip/config.xml create mode 100644 modules/producttooltip/de.php create mode 100644 modules/producttooltip/es.php create mode 100644 modules/producttooltip/fr.php create mode 100644 modules/producttooltip/it.php create mode 100644 modules/producttooltip/logo.gif create mode 100644 modules/producttooltip/producttooltip.php create mode 100644 modules/producttooltip/producttooltip.tpl create mode 100644 modules/producttooltip/sample.gif create mode 100644 modules/referralprogram/ReferralProgramModule.php create mode 100644 modules/referralprogram/authentication.tpl create mode 100755 modules/referralprogram/config.xml create mode 100644 modules/referralprogram/de.php create mode 100644 modules/referralprogram/en.php create mode 100644 modules/referralprogram/es.php create mode 100644 modules/referralprogram/fr.php create mode 100644 modules/referralprogram/it.php create mode 100644 modules/referralprogram/logo.gif create mode 100644 modules/referralprogram/mails/de/referralprogram-congratulations.html create mode 100644 modules/referralprogram/mails/de/referralprogram-congratulations.txt create mode 100644 modules/referralprogram/mails/de/referralprogram-invitation.html create mode 100644 modules/referralprogram/mails/de/referralprogram-invitation.txt create mode 100644 modules/referralprogram/mails/de/referralprogram-voucher.html create mode 100644 modules/referralprogram/mails/de/referralprogram-voucher.txt create mode 100644 modules/referralprogram/mails/en/referralprogram-congratulations.html create mode 100644 modules/referralprogram/mails/en/referralprogram-congratulations.txt create mode 100644 modules/referralprogram/mails/en/referralprogram-invitation.html create mode 100644 modules/referralprogram/mails/en/referralprogram-invitation.txt create mode 100644 modules/referralprogram/mails/en/referralprogram-voucher.html create mode 100644 modules/referralprogram/mails/en/referralprogram-voucher.txt create mode 100755 modules/referralprogram/mails/es/referralprogram-congratulations.html create mode 100755 modules/referralprogram/mails/es/referralprogram-congratulations.txt create mode 100755 modules/referralprogram/mails/es/referralprogram-invitation.html create mode 100755 modules/referralprogram/mails/es/referralprogram-invitation.txt create mode 100755 modules/referralprogram/mails/es/referralprogram-voucher.html create mode 100755 modules/referralprogram/mails/es/referralprogram-voucher.txt create mode 100644 modules/referralprogram/mails/fr/referralprogram-congratulations.html create mode 100644 modules/referralprogram/mails/fr/referralprogram-congratulations.txt create mode 100644 modules/referralprogram/mails/fr/referralprogram-invitation.html create mode 100644 modules/referralprogram/mails/fr/referralprogram-invitation.txt create mode 100644 modules/referralprogram/mails/fr/referralprogram-voucher.html create mode 100644 modules/referralprogram/mails/fr/referralprogram-voucher.txt create mode 100644 modules/referralprogram/mails/it/referralprogram-congratulations.html create mode 100644 modules/referralprogram/mails/it/referralprogram-congratulations.txt create mode 100644 modules/referralprogram/mails/it/referralprogram-invitation.html create mode 100644 modules/referralprogram/mails/it/referralprogram-invitation.txt create mode 100644 modules/referralprogram/mails/it/referralprogram-voucher.html create mode 100644 modules/referralprogram/mails/it/referralprogram-voucher.txt create mode 100644 modules/referralprogram/my-account.tpl create mode 100644 modules/referralprogram/order-confirmation.tpl create mode 100644 modules/referralprogram/preview-email.php create mode 100644 modules/referralprogram/referralprogram-program.php create mode 100644 modules/referralprogram/referralprogram-program.tpl create mode 100644 modules/referralprogram/referralprogram-rules.php create mode 100644 modules/referralprogram/referralprogram-rules.tpl create mode 100644 modules/referralprogram/referralprogram.gif create mode 100644 modules/referralprogram/referralprogram.php create mode 100644 modules/referralprogram/referralprogram.xml create mode 100644 modules/referralprogram/shopping-cart.tpl create mode 100755 modules/reverso/config.xml create mode 100644 modules/reverso/de.php create mode 100644 modules/reverso/es.php create mode 100644 modules/reverso/fr.php create mode 100644 modules/reverso/it.php create mode 100644 modules/reverso/js/index.php create mode 100644 modules/reverso/js/reverso.js create mode 100644 modules/reverso/logo.gif create mode 100644 modules/reverso/reverso.php create mode 100644 modules/reverso/reverso.tpl create mode 100644 modules/reverso/reverso_check.php create mode 100644 modules/secuvad/classes/PaymentCC.php create mode 100644 modules/secuvad/classes/Secuvad_connection.php create mode 100644 modules/secuvad/classes/Secuvad_flux.php create mode 100755 modules/secuvad/config.xml create mode 100644 modules/secuvad/de.php create mode 100644 modules/secuvad/en.php create mode 100644 modules/secuvad/es.php create mode 100755 modules/secuvad/fr.php create mode 100644 modules/secuvad/install.sql create mode 100644 modules/secuvad/it.php create mode 100644 modules/secuvad/logo.gif create mode 100644 modules/secuvad/secuvad.php create mode 100644 modules/secuvad/secuvad_config.php create mode 100644 modules/secuvad/secuvad_response.php create mode 100755 modules/sekeywords/config.xml create mode 100644 modules/sekeywords/de.php create mode 100644 modules/sekeywords/en.php create mode 100644 modules/sekeywords/es.php create mode 100644 modules/sekeywords/fr.php create mode 100644 modules/sekeywords/it.php create mode 100644 modules/sekeywords/logo.gif create mode 100644 modules/sekeywords/sekeywords.php create mode 100755 modules/sendtoafriend/config.xml create mode 100644 modules/sendtoafriend/de.php create mode 100644 modules/sendtoafriend/en.php create mode 100644 modules/sendtoafriend/es.php create mode 100644 modules/sendtoafriend/fr.php create mode 100644 modules/sendtoafriend/it.php create mode 100644 modules/sendtoafriend/logo.gif create mode 100644 modules/sendtoafriend/mails/de/send_to_a_friend.html create mode 100644 modules/sendtoafriend/mails/de/send_to_a_friend.txt create mode 100644 modules/sendtoafriend/mails/en/send_to_a_friend.html create mode 100644 modules/sendtoafriend/mails/en/send_to_a_friend.txt create mode 100644 modules/sendtoafriend/mails/es/send_to_a_friend.html create mode 100644 modules/sendtoafriend/mails/es/send_to_a_friend.txt create mode 100644 modules/sendtoafriend/mails/fr/send_to_a_friend.html create mode 100644 modules/sendtoafriend/mails/fr/send_to_a_friend.txt create mode 100644 modules/sendtoafriend/mails/it/send_to_a_friend.html create mode 100644 modules/sendtoafriend/mails/it/send_to_a_friend.txt create mode 100644 modules/sendtoafriend/product_page.tpl create mode 100644 modules/sendtoafriend/sendtoafriend-form.php create mode 100644 modules/sendtoafriend/sendtoafriend.php create mode 100644 modules/sendtoafriend/sendtoafriend.png create mode 100644 modules/sendtoafriend/sendtoafriend.tpl create mode 100644 modules/shopimporter/ajax.php create mode 100644 modules/shopimporter/config.xml create mode 100644 modules/shopimporter/de.php create mode 100644 modules/shopimporter/es.php create mode 100644 modules/shopimporter/fr.php create mode 100644 modules/shopimporter/img/ajax-loader.gif create mode 100644 modules/shopimporter/img/delete.gif create mode 100644 modules/shopimporter/img/error.png create mode 100644 modules/shopimporter/img/file.png create mode 100644 modules/shopimporter/img/force.gif create mode 100644 modules/shopimporter/img/ok.png create mode 100644 modules/shopimporter/img/skip.png create mode 100644 modules/shopimporter/img/stop.png create mode 100644 modules/shopimporter/img/warn.png create mode 100644 modules/shopimporter/it.php create mode 100644 modules/shopimporter/logo.gif create mode 100644 modules/shopimporter/shopimporter.js create mode 100644 modules/shopimporter/shopimporter.php create mode 100644 modules/socolissimo/ajax.php create mode 100755 modules/socolissimo/config.xml create mode 100644 modules/socolissimo/de.php create mode 100644 modules/socolissimo/es.php create mode 100644 modules/socolissimo/fr.php create mode 100644 modules/socolissimo/it.php create mode 100644 modules/socolissimo/logo.gif create mode 100644 modules/socolissimo/redirect.php create mode 100644 modules/socolissimo/socolissimo.jpg create mode 100644 modules/socolissimo/socolissimo.php create mode 100644 modules/socolissimo/socolissimo_carrier.tpl create mode 100644 modules/socolissimo/socolissimo_error.tpl create mode 100644 modules/socolissimo/validation.php create mode 100755 modules/statsbestcategories/config.xml create mode 100644 modules/statsbestcategories/de.php create mode 100644 modules/statsbestcategories/en.php create mode 100644 modules/statsbestcategories/es.php create mode 100644 modules/statsbestcategories/fr.php create mode 100644 modules/statsbestcategories/it.php create mode 100644 modules/statsbestcategories/logo.gif create mode 100644 modules/statsbestcategories/statsbestcategories.php create mode 100755 modules/statsbestcustomers/config.xml create mode 100644 modules/statsbestcustomers/de.php create mode 100644 modules/statsbestcustomers/en.php create mode 100644 modules/statsbestcustomers/es.php create mode 100644 modules/statsbestcustomers/fr.php create mode 100644 modules/statsbestcustomers/it.php create mode 100644 modules/statsbestcustomers/logo.gif create mode 100644 modules/statsbestcustomers/statsbestcustomers.php create mode 100755 modules/statsbestmanufacturers/config.xml create mode 100644 modules/statsbestmanufacturers/de.php create mode 100755 modules/statsbestmanufacturers/en.php create mode 100755 modules/statsbestmanufacturers/es.php create mode 100755 modules/statsbestmanufacturers/fr.php create mode 100644 modules/statsbestmanufacturers/it.php create mode 100755 modules/statsbestmanufacturers/logo.gif create mode 100755 modules/statsbestmanufacturers/statsbestmanufacturers.php create mode 100755 modules/statsbestproducts/config.xml create mode 100644 modules/statsbestproducts/de.php create mode 100644 modules/statsbestproducts/en.php create mode 100644 modules/statsbestproducts/es.php create mode 100644 modules/statsbestproducts/fr.php create mode 100644 modules/statsbestproducts/it.php create mode 100644 modules/statsbestproducts/logo.gif create mode 100644 modules/statsbestproducts/statsbestproducts.php create mode 100755 modules/statsbestsuppliers/config.xml create mode 100644 modules/statsbestsuppliers/de.php create mode 100644 modules/statsbestsuppliers/en.php create mode 100644 modules/statsbestsuppliers/es.php create mode 100644 modules/statsbestsuppliers/fr.php create mode 100644 modules/statsbestsuppliers/it.php create mode 100644 modules/statsbestsuppliers/logo.gif create mode 100644 modules/statsbestsuppliers/statsbestsuppliers.php create mode 100755 modules/statsbestvouchers/config.xml create mode 100644 modules/statsbestvouchers/de.php create mode 100644 modules/statsbestvouchers/en.php create mode 100644 modules/statsbestvouchers/es.php create mode 100644 modules/statsbestvouchers/fr.php create mode 100644 modules/statsbestvouchers/it.php create mode 100644 modules/statsbestvouchers/logo.gif create mode 100644 modules/statsbestvouchers/statsbestvouchers.php create mode 100755 modules/statscarrier/config.xml create mode 100644 modules/statscarrier/de.php create mode 100644 modules/statscarrier/en.php create mode 100644 modules/statscarrier/es.php create mode 100644 modules/statscarrier/fr.php create mode 100644 modules/statscarrier/it.php create mode 100644 modules/statscarrier/logo.gif create mode 100644 modules/statscarrier/statscarrier.php create mode 100644 modules/statscatalog/application_home.png create mode 100644 modules/statscatalog/basket_delete.png create mode 100755 modules/statscatalog/config.xml create mode 100644 modules/statscatalog/de.php create mode 100644 modules/statscatalog/en.php create mode 100644 modules/statscatalog/es.php create mode 100644 modules/statscatalog/fr.php create mode 100644 modules/statscatalog/it.php create mode 100644 modules/statscatalog/logo.gif create mode 100644 modules/statscatalog/page_edit.png create mode 100644 modules/statscatalog/statscatalog.php create mode 100755 modules/statscheckup/config.xml create mode 100644 modules/statscheckup/de.php create mode 100644 modules/statscheckup/es.php create mode 100644 modules/statscheckup/fr.php create mode 100644 modules/statscheckup/green.png create mode 100644 modules/statscheckup/it.php create mode 100644 modules/statscheckup/logo.gif create mode 100644 modules/statscheckup/orange.png create mode 100644 modules/statscheckup/red.png create mode 100644 modules/statscheckup/statscheckup.php create mode 100644 modules/statsdata/config.xml create mode 100644 modules/statsdata/de.php create mode 100644 modules/statsdata/en.php create mode 100644 modules/statsdata/es.php create mode 100644 modules/statsdata/fr.php create mode 100644 modules/statsdata/it.php create mode 100644 modules/statsdata/logo.gif create mode 100644 modules/statsdata/statsdata.php create mode 100755 modules/statsequipment/config.xml create mode 100644 modules/statsequipment/de.php create mode 100644 modules/statsequipment/en.php create mode 100644 modules/statsequipment/es.php create mode 100644 modules/statsequipment/fr.php create mode 100644 modules/statsequipment/it.php create mode 100644 modules/statsequipment/logo.gif create mode 100644 modules/statsequipment/statsequipment.php create mode 100755 modules/statsforecast/config.xml create mode 100644 modules/statsforecast/de.php create mode 100644 modules/statsforecast/es.php create mode 100644 modules/statsforecast/fr.php create mode 100644 modules/statsforecast/funnel.png create mode 100644 modules/statsforecast/it.php create mode 100644 modules/statsforecast/logo.gif create mode 100644 modules/statsforecast/next.png create mode 100644 modules/statsforecast/statsforecast.php create mode 100644 modules/statsgeolocation/config.php create mode 100755 modules/statsgeolocation/config.xml create mode 100644 modules/statsgeolocation/de.php create mode 100644 modules/statsgeolocation/drawer.php create mode 100644 modules/statsgeolocation/en.php create mode 100644 modules/statsgeolocation/es.php create mode 100644 modules/statsgeolocation/fr.php create mode 100644 modules/statsgeolocation/img/cross.png create mode 100644 modules/statsgeolocation/img/map.png create mode 100644 modules/statsgeolocation/it.php create mode 100644 modules/statsgeolocation/logo.gif create mode 100644 modules/statsgeolocation/statsgeolocation.js create mode 100644 modules/statsgeolocation/statsgeolocation.php create mode 100755 modules/statslive/config.xml create mode 100644 modules/statslive/de.php create mode 100644 modules/statslive/en.php create mode 100644 modules/statslive/es.php create mode 100644 modules/statslive/fr.php create mode 100644 modules/statslive/it.php create mode 100644 modules/statslive/logo.gif create mode 100644 modules/statslive/statslive.php create mode 100755 modules/statsnewsletter/config.xml create mode 100644 modules/statsnewsletter/de.php create mode 100644 modules/statsnewsletter/en.php create mode 100644 modules/statsnewsletter/es.php create mode 100644 modules/statsnewsletter/fr.php create mode 100644 modules/statsnewsletter/it.php create mode 100644 modules/statsnewsletter/logo.gif create mode 100644 modules/statsnewsletter/statsnewsletter.php create mode 100755 modules/statsorigin/config.xml create mode 100644 modules/statsorigin/de.php create mode 100644 modules/statsorigin/en.php create mode 100644 modules/statsorigin/es.php create mode 100644 modules/statsorigin/fr.php create mode 100644 modules/statsorigin/it.php create mode 100644 modules/statsorigin/logo.gif create mode 100644 modules/statsorigin/statsorigin.php create mode 100755 modules/statspersonalinfos/config.xml create mode 100644 modules/statspersonalinfos/de.php create mode 100644 modules/statspersonalinfos/en.php create mode 100644 modules/statspersonalinfos/es.php create mode 100644 modules/statspersonalinfos/fr.php create mode 100644 modules/statspersonalinfos/it.php create mode 100644 modules/statspersonalinfos/logo.gif create mode 100644 modules/statspersonalinfos/statspersonalinfos.php create mode 100755 modules/statsproduct/config.xml create mode 100644 modules/statsproduct/de.php create mode 100644 modules/statsproduct/en.php create mode 100644 modules/statsproduct/es.php create mode 100644 modules/statsproduct/fr.php create mode 100644 modules/statsproduct/it.php create mode 100644 modules/statsproduct/logo.gif create mode 100644 modules/statsproduct/statsproduct.php create mode 100755 modules/statsregistrations/config.xml create mode 100644 modules/statsregistrations/de.php create mode 100644 modules/statsregistrations/en.php create mode 100644 modules/statsregistrations/es.php create mode 100644 modules/statsregistrations/fr.php create mode 100644 modules/statsregistrations/it.php create mode 100644 modules/statsregistrations/logo.gif create mode 100644 modules/statsregistrations/statsregistrations.php create mode 100755 modules/statssales/config.xml create mode 100644 modules/statssales/de.php create mode 100644 modules/statssales/en.php create mode 100644 modules/statssales/es.php create mode 100644 modules/statssales/fr.php create mode 100644 modules/statssales/it.php create mode 100644 modules/statssales/logo.gif create mode 100644 modules/statssales/statssales.php create mode 100755 modules/statssearch/config.xml create mode 100644 modules/statssearch/de.php create mode 100644 modules/statssearch/en.php create mode 100644 modules/statssearch/es.php create mode 100644 modules/statssearch/fr.php create mode 100644 modules/statssearch/it.php create mode 100644 modules/statssearch/logo.gif create mode 100644 modules/statssearch/statssearch.php create mode 100755 modules/statsstock/config.xml create mode 100644 modules/statsstock/de.php create mode 100644 modules/statsstock/es.php create mode 100644 modules/statsstock/fr.php create mode 100644 modules/statsstock/it.php create mode 100644 modules/statsstock/logo.gif create mode 100644 modules/statsstock/statsstock.php create mode 100755 modules/statsvisits/config.xml create mode 100644 modules/statsvisits/de.php create mode 100644 modules/statsvisits/en.php create mode 100644 modules/statsvisits/es.php create mode 100644 modules/statsvisits/fr.php create mode 100644 modules/statsvisits/it.php create mode 100644 modules/statsvisits/logo.gif create mode 100644 modules/statsvisits/statsvisits.php create mode 100644 modules/themeinstallator/add.png create mode 100755 modules/themeinstallator/config.xml create mode 100644 modules/themeinstallator/de.php create mode 100644 modules/themeinstallator/delete.png create mode 100644 modules/themeinstallator/es.php create mode 100644 modules/themeinstallator/fr.php create mode 100644 modules/themeinstallator/it.php create mode 100644 modules/themeinstallator/logo.gif create mode 100644 modules/themeinstallator/script.js create mode 100644 modules/themeinstallator/themeinstallator.php create mode 100644 modules/tm4b/classes/Tm4bSms.php create mode 100755 modules/tm4b/config.xml create mode 100644 modules/tm4b/cron.php create mode 100644 modules/tm4b/de.php create mode 100644 modules/tm4b/en.php create mode 100644 modules/tm4b/es.php create mode 100644 modules/tm4b/fr.php create mode 100644 modules/tm4b/informations.gif create mode 100644 modules/tm4b/it.php create mode 100644 modules/tm4b/logo.gif create mode 100755 modules/tm4b/mails/de/sms_new_order.txt create mode 100755 modules/tm4b/mails/de/sms_out_of_stock.txt create mode 100644 modules/tm4b/mails/en/sms_new_order.txt create mode 100644 modules/tm4b/mails/en/sms_out_of_stock.txt create mode 100644 modules/tm4b/mails/es/sms_new_order.txt create mode 100644 modules/tm4b/mails/es/sms_out_of_stock.txt create mode 100644 modules/tm4b/mails/fr/sms_new_order.txt create mode 100644 modules/tm4b/mails/fr/sms_out_of_stock.txt create mode 100755 modules/tm4b/mails/it/sms_new_order.txt create mode 100755 modules/tm4b/mails/it/sms_out_of_stock.txt create mode 100644 modules/tm4b/prefs.gif create mode 100644 modules/tm4b/tm4b.php create mode 100644 modules/trackingfront/account.tpl create mode 100755 modules/trackingfront/config.xml create mode 100644 modules/trackingfront/de.php create mode 100644 modules/trackingfront/en.php create mode 100644 modules/trackingfront/es.php create mode 100644 modules/trackingfront/footer.tpl create mode 100644 modules/trackingfront/fr.php create mode 100644 modules/trackingfront/header.tpl create mode 100644 modules/trackingfront/it.php create mode 100644 modules/trackingfront/login.tpl create mode 100644 modules/trackingfront/logo.gif create mode 100644 modules/trackingfront/stats.php create mode 100644 modules/trackingfront/trackingfront.php create mode 100644 modules/treepodia/add-to-cart.tpl create mode 100644 modules/treepodia/api/get_data_feed.php create mode 100644 modules/treepodia/api/ping.php create mode 100644 modules/treepodia/api/set_account_code.php create mode 100755 modules/treepodia/config.xml create mode 100644 modules/treepodia/de.php create mode 100644 modules/treepodia/es.php create mode 100644 modules/treepodia/export/export.php create mode 100644 modules/treepodia/footer.tpl create mode 100644 modules/treepodia/fr.php create mode 100644 modules/treepodia/it.php create mode 100644 modules/treepodia/logo.gif create mode 100644 modules/treepodia/logo.png create mode 100644 modules/treepodia/logos/01_1.jpg create mode 100644 modules/treepodia/logos/01_2.jpg create mode 100644 modules/treepodia/logos/01_3.jpg create mode 100644 modules/treepodia/logos/01_4.jpg create mode 100644 modules/treepodia/logos/02_1.jpg create mode 100644 modules/treepodia/logos/02_2.jpg create mode 100644 modules/treepodia/logos/03_1.jpg create mode 100644 modules/treepodia/logos/04_1.jpg create mode 100644 modules/treepodia/logos/04_2.jpg create mode 100644 modules/treepodia/logos/04_3.jpg create mode 100644 modules/treepodia/logos/04_4.jpg create mode 100644 modules/treepodia/logos/04_5.jpg create mode 100644 modules/treepodia/logos/05_1.jpg create mode 100644 modules/treepodia/logos/05_2.jpg create mode 100644 modules/treepodia/logos/05_3.jpg create mode 100644 modules/treepodia/logos/05_4.jpg create mode 100644 modules/treepodia/logos/05_6.jpg create mode 100644 modules/treepodia/logos/06_1.jpg create mode 100644 modules/treepodia/logos/07_1.jpg create mode 100644 modules/treepodia/logos/08_1.jpg create mode 100644 modules/treepodia/logos/09.jpg create mode 100644 modules/treepodia/logos/1-1.png create mode 100644 modules/treepodia/logos/1-2.png create mode 100644 modules/treepodia/logos/1-3.png create mode 100644 modules/treepodia/logos/1-4.png create mode 100644 modules/treepodia/logos/1-5.png create mode 100644 modules/treepodia/logos/1-6.png create mode 100644 modules/treepodia/logos/1-7.png create mode 100644 modules/treepodia/logos/10.jpg create mode 100644 modules/treepodia/logos/11_1.jpg create mode 100644 modules/treepodia/logos/11_2.jpg create mode 100644 modules/treepodia/logos/11_3.jpg create mode 100644 modules/treepodia/logos/11_4.jpg create mode 100644 modules/treepodia/logos/11_5.jpg create mode 100644 modules/treepodia/logos/12_1.jpg create mode 100644 modules/treepodia/logos/12_2.jpg create mode 100644 modules/treepodia/logos/12_3.jpg create mode 100644 modules/treepodia/logos/12_4.jpg create mode 100644 modules/treepodia/logos/12_5.jpg create mode 100644 modules/treepodia/logos/2-1-2.png create mode 100644 modules/treepodia/logos/2-1.png create mode 100644 modules/treepodia/logos/2-2-2.png create mode 100644 modules/treepodia/logos/2-2.png create mode 100644 modules/treepodia/logos/2-3.png create mode 100644 modules/treepodia/logos/2-4.png create mode 100644 modules/treepodia/logos/2-5.png create mode 100644 modules/treepodia/logos/2-6.png create mode 100644 modules/treepodia/logos/3-2.png create mode 100644 modules/treepodia/logos/3-3.png create mode 100644 modules/treepodia/logos/3-7.png create mode 100644 modules/treepodia/logos/4-1.png create mode 100644 modules/treepodia/logos/4-2.png create mode 100644 modules/treepodia/logos/4-3.png create mode 100644 modules/treepodia/logos/4-4.png create mode 100644 modules/treepodia/logos/4-5.png create mode 100644 modules/treepodia/logos/4-6.png create mode 100644 modules/treepodia/logos/4-7.png create mode 100644 modules/treepodia/logos/5-1.png create mode 100644 modules/treepodia/logos/5-2.png create mode 100644 modules/treepodia/logos/5-3.png create mode 100644 modules/treepodia/logos/5-4.png create mode 100644 modules/treepodia/logos/5-6.png create mode 100644 modules/treepodia/logos/5-7.png create mode 100644 modules/treepodia/logos/5-8.png create mode 100644 modules/treepodia/logos/7-1-2.png create mode 100644 modules/treepodia/logos/7-1.png create mode 100644 modules/treepodia/logos/7-2-3.png create mode 100644 modules/treepodia/logos/7-2.png create mode 100644 modules/treepodia/logos/7-4.png create mode 100644 modules/treepodia/logos/7-6.png create mode 100644 modules/treepodia/logos/7-7-1.png create mode 100644 modules/treepodia/logos/8-1.png create mode 100644 modules/treepodia/logos/8-2.png create mode 100644 modules/treepodia/logos/8-3.png create mode 100644 modules/treepodia/logos/8-4.png create mode 100644 modules/treepodia/logos/8-5.png create mode 100644 modules/treepodia/logos/8-6.png create mode 100644 modules/treepodia/logos/8-7.png create mode 100644 modules/treepodia/product.tpl create mode 100644 modules/treepodia/tracking.tpl create mode 100644 modules/treepodia/treepodia.js create mode 100644 modules/treepodia/treepodia.php create mode 100644 modules/treepodia/video-sitemap.php create mode 100644 modules/trustedshops/RatingAlert.php create mode 100644 modules/trustedshops/TrustedShopsSoapApi.php create mode 100644 modules/trustedshops/WidgetCache.php create mode 100755 modules/trustedshops/config.xml create mode 100644 modules/trustedshops/cron.php create mode 100644 modules/trustedshops/cron_garantee.php create mode 100644 modules/trustedshops/de.php create mode 100644 modules/trustedshops/display_products.tpl create mode 100644 modules/trustedshops/es.php create mode 100644 modules/trustedshops/fr.php create mode 100644 modules/trustedshops/img/apply_de.gif create mode 100644 modules/trustedshops/img/apply_en.gif create mode 100644 modules/trustedshops/img/apply_fr.gif create mode 100755 modules/trustedshops/img/siegel.gif create mode 100644 modules/trustedshops/img/ts_logo.jpg create mode 100644 modules/trustedshops/img/ts_rating_en.jpg create mode 100644 modules/trustedshops/img/ts_rating_fr.jpg create mode 100644 modules/trustedshops/it.php create mode 100644 modules/trustedshops/lib/AbsTrustedShops.php create mode 100644 modules/trustedshops/lib/RatingAlert.php create mode 100644 modules/trustedshops/lib/TSBPException.php create mode 100644 modules/trustedshops/lib/TSBuyerProtection.php create mode 100644 modules/trustedshops/lib/TrustedShopsRating.php create mode 100644 modules/trustedshops/lib/TrustedShopsSoapApi.php create mode 100644 modules/trustedshops/lib/WidgetCache.php create mode 100644 modules/trustedshops/lib/js/payment.js create mode 100644 modules/trustedshops/logo.gif create mode 100644 modules/trustedshops/mails/de/rating_email.html create mode 100644 modules/trustedshops/mails/de/rating_email.txt create mode 100644 modules/trustedshops/mails/en/rating_email.html create mode 100644 modules/trustedshops/mails/en/rating_email.txt create mode 100755 modules/trustedshops/mails/es/rating_email.html create mode 100755 modules/trustedshops/mails/es/rating_email.txt create mode 100644 modules/trustedshops/mails/fr/rating_email.html create mode 100644 modules/trustedshops/mails/fr/rating_email.txt create mode 100644 modules/trustedshops/mails/it/rating_email.html create mode 100644 modules/trustedshops/mails/it/rating_email.txt create mode 100644 modules/trustedshops/order-confirmation-tsbp-classic.tpl create mode 100644 modules/trustedshops/order-confirmation.tpl create mode 100644 modules/trustedshops/seal_of_approval.tpl create mode 100644 modules/trustedshops/trustedshops.php create mode 100644 modules/trustedshops/widget.tpl create mode 100644 modules/twenga/ajax-loader.gif create mode 100644 modules/twenga/bt_500_clicks.gif create mode 100644 modules/twenga/config.xml create mode 100644 modules/twenga/de.php create mode 100644 modules/twenga/es.php create mode 100644 modules/twenga/export.php create mode 100644 modules/twenga/fr.php create mode 100755 modules/twenga/infos.html create mode 100755 modules/twenga/infos_update.php create mode 100644 modules/twenga/it.php create mode 100644 modules/twenga/lib/PrestashopStats.php create mode 100755 modules/twenga/lib/TwengaAddFeed.php create mode 100644 modules/twenga/lib/TwengaFields.php create mode 100644 modules/twenga/lib/TwengaFieldsGetSubscriptionLink.php create mode 100644 modules/twenga/lib/TwengaFieldsGetTrackingScript.php create mode 100644 modules/twenga/lib/TwengaFieldsOrderCancel.php create mode 100644 modules/twenga/lib/TwengaFieldsOrderExist.php create mode 100644 modules/twenga/lib/TwengaFieldsOrderValidate.php create mode 100644 modules/twenga/lib/TwengaFieldsSiteActivate.php create mode 100644 modules/twenga/lib/TwengaFieldsSiteExist.php create mode 100644 modules/twenga/lib/TwengaObj.php create mode 100644 modules/twenga/logo.gif create mode 100644 modules/twenga/logo_big.jpg create mode 100755 modules/twenga/mails/de/mail.html create mode 100755 modules/twenga/mails/de/mail.txt create mode 100755 modules/twenga/mails/en/mail.html create mode 100755 modules/twenga/mails/en/mail.txt create mode 100755 modules/twenga/mails/es/mail.html create mode 100755 modules/twenga/mails/es/mail.txt create mode 100755 modules/twenga/mails/fr/mail.html create mode 100755 modules/twenga/mails/fr/mail.txt create mode 100644 modules/twenga/mails/it/mail.html create mode 100644 modules/twenga/mails/it/mail.txt create mode 100755 modules/twenga/send_mail.php create mode 100644 modules/twenga/twenga.php create mode 100644 modules/upscarrier/carrier.jpg create mode 100755 modules/upscarrier/config.xml create mode 100644 modules/upscarrier/de.php create mode 100644 modules/upscarrier/es.php create mode 100644 modules/upscarrier/fr.php create mode 100644 modules/upscarrier/it.php create mode 100644 modules/upscarrier/logo.gif create mode 100644 modules/upscarrier/sql-install.php create mode 100644 modules/upscarrier/sql-uninstall.php create mode 100644 modules/upscarrier/upscarrier.php create mode 100755 modules/upscarrier/xml-package.tpl create mode 100644 modules/upscarrier/xml.tpl create mode 100644 modules/uspscarrier/carrier.jpg create mode 100755 modules/uspscarrier/config.xml create mode 100644 modules/uspscarrier/de.php create mode 100644 modules/uspscarrier/es.php create mode 100644 modules/uspscarrier/fr.php create mode 100644 modules/uspscarrier/it.php create mode 100644 modules/uspscarrier/logo.gif create mode 100755 modules/uspscarrier/sql-install.php create mode 100755 modules/uspscarrier/sql-uninstall.php create mode 100644 modules/uspscarrier/uspscarrier.php create mode 100644 modules/uspscarrier/xml-package.tpl create mode 100644 modules/uspscarrier/xml.tpl create mode 100644 modules/vatnumber/ajax.php create mode 100755 modules/vatnumber/config.xml create mode 100644 modules/vatnumber/de.php create mode 100644 modules/vatnumber/en.php create mode 100755 modules/vatnumber/es.php create mode 100755 modules/vatnumber/fr.php create mode 100644 modules/vatnumber/it.php create mode 100755 modules/vatnumber/logo.gif create mode 100755 modules/vatnumber/vatnumber.php create mode 100755 modules/watermark/config.xml create mode 100644 modules/watermark/de.php create mode 100644 modules/watermark/en.php create mode 100644 modules/watermark/es.php create mode 100644 modules/watermark/fr.php create mode 100644 modules/watermark/it.php create mode 100644 modules/watermark/logo.gif create mode 100644 modules/watermark/watermark.gif create mode 100644 modules/watermark/watermark.php create mode 100644 my-account.php create mode 100644 new-products.php create mode 100644 order-confirmation.php create mode 100644 order-detail.php create mode 100644 order-follow.php create mode 100755 order-opc.php create mode 100644 order-return.php create mode 100644 order-slip.php create mode 100644 order.php create mode 100644 override/classes/FirePHP.class.php create mode 100755 override/classes/_FrontController.php create mode 100644 override/classes/_Module.php create mode 100644 override/classes/_MySQL.php create mode 100755 override/classes/_Tools.php create mode 100644 override/classes/fb.php create mode 100644 pagination.php create mode 100644 password.php create mode 100644 pdf-invoice.php create mode 100644 pdf-order-return.php create mode 100644 pdf-order-slip.php create mode 100644 prices-drop.php create mode 100644 product-sort.php create mode 100644 product.php create mode 100644 products-comparison.php create mode 100644 readme_de.txt create mode 100644 readme_en.txt create mode 100644 readme_es.txt create mode 100644 readme_fr.txt create mode 100644 readme_it.txt create mode 100644 search.php create mode 100644 sitemap.php create mode 100644 sitemap.xml create mode 100644 statistics.php create mode 100644 stores.php create mode 100644 supplier.php create mode 100644 themes/.htaccess create mode 100644 themes/debug.tpl create mode 100644 themes/index.php create mode 100644 themes/live_edit.tpl create mode 100644 themes/prestashop/404.tpl create mode 100644 themes/prestashop/address.tpl create mode 100644 themes/prestashop/addresses.tpl create mode 100644 themes/prestashop/authentication.tpl create mode 100644 themes/prestashop/best-sales.tpl create mode 100644 themes/prestashop/breadcrumb.tpl create mode 100644 themes/prestashop/category-cms-tree-branch.tpl create mode 100644 themes/prestashop/category-tree-branch.tpl create mode 100644 themes/prestashop/category.tpl create mode 100644 themes/prestashop/cms.tpl create mode 100644 themes/prestashop/config.xml create mode 100644 themes/prestashop/contact-form.tpl create mode 100755 themes/prestashop/css/addresses.css create mode 100755 themes/prestashop/css/authentication.css create mode 100755 themes/prestashop/css/category.css create mode 100644 themes/prestashop/css/cms.css create mode 100644 themes/prestashop/css/comparator.css create mode 100755 themes/prestashop/css/contact-form.css create mode 100644 themes/prestashop/css/global.css create mode 100755 themes/prestashop/css/history.css create mode 100755 themes/prestashop/css/identity.css create mode 100644 themes/prestashop/css/maintenance.css create mode 100755 themes/prestashop/css/modules/blockadvertising/blockadvertising.css create mode 100755 themes/prestashop/css/modules/blockbestsellers/blockbestsellers.css create mode 100755 themes/prestashop/css/modules/blockcart/blockcart.css create mode 100755 themes/prestashop/css/modules/blockcategories/blockcategories.css create mode 100755 themes/prestashop/css/modules/blockcms/blockcms.css create mode 100755 themes/prestashop/css/modules/blockcurrencies/blockcurrencies.css create mode 100755 themes/prestashop/css/modules/blocklanguages/blocklanguages.css create mode 100755 themes/prestashop/css/modules/blockmanufacturer/blockmanufacturer.css create mode 100755 themes/prestashop/css/modules/blockmyaccount/blockmyaccount.css create mode 100755 themes/prestashop/css/modules/blocknewproducts/blocknewproducts.css create mode 100755 themes/prestashop/css/modules/blocknewsletter/blocknewsletter.css create mode 100755 themes/prestashop/css/modules/blockpaymentlogo/blockpaymentlogo.css create mode 100755 themes/prestashop/css/modules/blockpermanentlinks/blockpermanentlinks.css create mode 100755 themes/prestashop/css/modules/blockrss/blockrss.css create mode 100755 themes/prestashop/css/modules/blocksearch/blocksearch.css create mode 100755 themes/prestashop/css/modules/blockspecials/blockspecials.css create mode 100644 themes/prestashop/css/modules/blockstore/blockstore.css create mode 100755 themes/prestashop/css/modules/blocksupplier/blocksupplier.css create mode 100755 themes/prestashop/css/modules/blocktags/blocktags.css create mode 100755 themes/prestashop/css/modules/blockuserinfo/blockuserinfo.css create mode 100755 themes/prestashop/css/modules/blockviewed/blockviewed.css create mode 100755 themes/prestashop/css/modules/blockwishlist/blockwishlist.css create mode 100644 themes/prestashop/css/modules/crossselling/crossselling.css create mode 100755 themes/prestashop/css/modules/editorial/editorial.css create mode 100755 themes/prestashop/css/my-account.css create mode 100755 themes/prestashop/css/order-opc.css create mode 100755 themes/prestashop/css/product.css create mode 100755 themes/prestashop/css/product_list.css create mode 100644 themes/prestashop/css/restricted-country.css create mode 100644 themes/prestashop/css/scenes.css create mode 100755 themes/prestashop/css/sitemap.css create mode 100644 themes/prestashop/css/stores.css create mode 100644 themes/prestashop/discount.tpl create mode 100644 themes/prestashop/errors.tpl create mode 100644 themes/prestashop/footer.tpl create mode 100644 themes/prestashop/guest-tracking.tpl create mode 100644 themes/prestashop/header.tpl create mode 100644 themes/prestashop/history.tpl create mode 100644 themes/prestashop/identity.tpl create mode 100644 themes/prestashop/img/address_alias_left.gif create mode 100644 themes/prestashop/img/address_alias_right.gif create mode 100644 themes/prestashop/img/ajax-loader.gif create mode 100644 themes/prestashop/img/arrow_rotate_anticlockwise.png create mode 100644 themes/prestashop/img/bg_account.jpg create mode 100644 themes/prestashop/img/block_bg.jpg create mode 100644 themes/prestashop/img/block_bg_myaccount.jpg create mode 100644 themes/prestashop/img/block_category_item_bg.jpg create mode 100644 themes/prestashop/img/block_exclusive_bg.jpg create mode 100644 themes/prestashop/img/block_exclusive_footer.jpg create mode 100644 themes/prestashop/img/block_footer.gif create mode 100755 themes/prestashop/img/block_footer.png create mode 100644 themes/prestashop/img/block_footer_myaccount.jpg create mode 100644 themes/prestashop/img/block_footer_page.gif create mode 100644 themes/prestashop/img/block_footer_page_footer.png create mode 100644 themes/prestashop/img/block_header.gif create mode 100755 themes/prestashop/img/block_header.png create mode 100644 themes/prestashop/img/block_header_exclusive.gif create mode 100755 themes/prestashop/img/block_header_exclusive.png create mode 100644 themes/prestashop/img/block_header_exclusive_cart.gif create mode 100755 themes/prestashop/img/block_header_exclusive_cart.png create mode 100644 themes/prestashop/img/block_header_large.gif create mode 100755 themes/prestashop/img/block_header_large.png create mode 100644 themes/prestashop/img/block_header_myaccount.jpg create mode 100644 themes/prestashop/img/block_myaccount_header_large.gif create mode 100644 themes/prestashop/img/block_search_bg.jpg create mode 100644 themes/prestashop/img/bullet.gif create mode 100644 themes/prestashop/img/bullet_alt.jpg create mode 100644 themes/prestashop/img/bullet_myaccount.gif create mode 100644 themes/prestashop/img/bullet_price.gif create mode 100644 themes/prestashop/img/button-account-large.gif create mode 100644 themes/prestashop/img/button-account-mini.gif create mode 100644 themes/prestashop/img/button-account-small.gif create mode 100644 themes/prestashop/img/button-account.gif create mode 100644 themes/prestashop/img/button-large.gif create mode 100755 themes/prestashop/img/button-large.png create mode 100644 themes/prestashop/img/button-large_exclusive.gif create mode 100644 themes/prestashop/img/button-medium.gif create mode 100755 themes/prestashop/img/button-medium.png create mode 100644 themes/prestashop/img/button-medium_exclusive.gif create mode 100755 themes/prestashop/img/button-medium_exclusive.png create mode 100644 themes/prestashop/img/button-mini.gif create mode 100755 themes/prestashop/img/button-mini.png create mode 100644 themes/prestashop/img/button-mini_exclusive.gif create mode 100644 themes/prestashop/img/button-small.gif create mode 100755 themes/prestashop/img/button-small.png create mode 100644 themes/prestashop/img/button-small_exclusive.gif create mode 100644 themes/prestashop/img/flag_new_bg.jpg create mode 100644 themes/prestashop/img/footer_account.gif create mode 100644 themes/prestashop/img/form-input-bg.gif create mode 100644 themes/prestashop/img/form_bg.jpg create mode 100644 themes/prestashop/img/header_account.gif create mode 100644 themes/prestashop/img/icon/add.gif create mode 100644 themes/prestashop/img/icon/addrbook.gif create mode 100644 themes/prestashop/img/icon/available.gif create mode 100644 themes/prestashop/img/icon/cancel.gif create mode 100644 themes/prestashop/img/icon/cancel_16x18.gif create mode 100644 themes/prestashop/img/icon/cart.gif create mode 100644 themes/prestashop/img/icon/cible.gif create mode 100644 themes/prestashop/img/icon/contact.gif create mode 100644 themes/prestashop/img/icon/delete.gif create mode 100644 themes/prestashop/img/icon/download_product.gif create mode 100644 themes/prestashop/img/icon/error.gif create mode 100644 themes/prestashop/img/icon/gift.gif create mode 100644 themes/prestashop/img/icon/home.gif create mode 100644 themes/prestashop/img/icon/infos.gif create mode 100644 themes/prestashop/img/icon/less.gif create mode 100644 themes/prestashop/img/icon/magnify.gif create mode 100644 themes/prestashop/img/icon/more.gif create mode 100644 themes/prestashop/img/icon/my-account.gif create mode 100644 themes/prestashop/img/icon/next.gif create mode 100644 themes/prestashop/img/icon/no.gif create mode 100644 themes/prestashop/img/icon/order.gif create mode 100644 themes/prestashop/img/icon/pdf.gif create mode 100644 themes/prestashop/img/icon/previous.gif create mode 100644 themes/prestashop/img/icon/quantity_down.gif create mode 100755 themes/prestashop/img/icon/quantity_down_off.gif create mode 100644 themes/prestashop/img/icon/quantity_up.gif create mode 100644 themes/prestashop/img/icon/recyclable.gif create mode 100644 themes/prestashop/img/icon/return.gif create mode 100644 themes/prestashop/img/icon/search.gif create mode 100644 themes/prestashop/img/icon/serial_scroll_left.gif create mode 100644 themes/prestashop/img/icon/serial_scroll_right.gif create mode 100644 themes/prestashop/img/icon/sitemap.gif create mode 100644 themes/prestashop/img/icon/slip.gif create mode 100644 themes/prestashop/img/icon/sort_asc.gif create mode 100644 themes/prestashop/img/icon/sort_asc_disabled.gif create mode 100644 themes/prestashop/img/icon/sort_asc_white.gif create mode 100755 themes/prestashop/img/icon/sort_asc_white.png create mode 100644 themes/prestashop/img/icon/sort_desc.gif create mode 100644 themes/prestashop/img/icon/sort_desc_disabled.gif create mode 100644 themes/prestashop/img/icon/sort_desc_white.gif create mode 100755 themes/prestashop/img/icon/sort_desc_white.png create mode 100644 themes/prestashop/img/icon/star.gif create mode 100644 themes/prestashop/img/icon/unavailable.gif create mode 100644 themes/prestashop/img/icon/up.gif create mode 100644 themes/prestashop/img/icon/update.gif create mode 100644 themes/prestashop/img/icon/userinfo.gif create mode 100644 themes/prestashop/img/icon/voucher.gif create mode 100644 themes/prestashop/img/icon/yes.gif create mode 100644 themes/prestashop/img/jquery/macFFBgHack.png create mode 100644 themes/prestashop/img/logo_paiement_mastercard.jpg create mode 100644 themes/prestashop/img/logo_paiement_paypal.jpg create mode 100644 themes/prestashop/img/logo_paiement_visa.jpg create mode 100755 themes/prestashop/img/nav-logout.gif create mode 100644 themes/prestashop/img/onsale_en.gif create mode 100644 themes/prestashop/img/onsale_es.gif create mode 100644 themes/prestashop/img/onsale_fr.gif create mode 100644 themes/prestashop/img/pagination-bg-current.gif create mode 100644 themes/prestashop/img/pagination-next-border.gif create mode 100644 themes/prestashop/img/pagination-prev-border.gif create mode 100644 themes/prestashop/img/pagination-prevnext-bg.gif create mode 100644 themes/prestashop/img/pagination_bg.gif create mode 100644 themes/prestashop/img/product-buy-bg.gif create mode 100644 themes/prestashop/img/product-short-desc-bg.gif create mode 100644 themes/prestashop/img/rss.gif create mode 100644 themes/prestashop/img/sitemap-horizontal.gif create mode 100755 themes/prestashop/img/sitemap-horizontal.png create mode 100644 themes/prestashop/img/sitemap-last.gif create mode 100644 themes/prestashop/img/sitemap-top.gif create mode 100644 themes/prestashop/img/sitemap_long.gif create mode 100644 themes/prestashop/img/step_current.gif create mode 100644 themes/prestashop/img/step_end.gif create mode 100644 themes/prestashop/img/step_end_current.gif create mode 100644 themes/prestashop/img/step_standard.gif create mode 100644 themes/prestashop/img/step_start.gif create mode 100644 themes/prestashop/img/tab_bg.jpg create mode 100644 themes/prestashop/img/tab_bg_selected.jpg create mode 100644 themes/prestashop/img/tab_bg_selected_short.jpg create mode 100644 themes/prestashop/img/tab_bg_short.jpg create mode 100644 themes/prestashop/img/table_footer.gif create mode 100644 themes/prestashop/img/table_header.gif create mode 100644 themes/prestashop/img/thumbs_left.gif create mode 100644 themes/prestashop/img/thumbs_right.gif create mode 100644 themes/prestashop/img/title_bg.gif create mode 100755 themes/prestashop/img/title_bg.png create mode 100644 themes/prestashop/img/title_bg_large.gif create mode 100644 themes/prestashop/index.php create mode 100644 themes/prestashop/index.tpl create mode 100644 themes/prestashop/js/cart-summary.js create mode 100644 themes/prestashop/js/cms.js create mode 100644 themes/prestashop/js/history.js create mode 100644 themes/prestashop/js/order-address.js create mode 100755 themes/prestashop/js/order-opc.js create mode 100644 themes/prestashop/js/product.js create mode 100644 themes/prestashop/js/products-comparison.js create mode 100644 themes/prestashop/js/scenes.js create mode 100644 themes/prestashop/js/stores.js create mode 100644 themes/prestashop/js/tools.js create mode 100644 themes/prestashop/js/tools/statesManagement.js create mode 100644 themes/prestashop/js/tools/treeManagement.js create mode 100644 themes/prestashop/lang/de.php create mode 100644 themes/prestashop/lang/en.php create mode 100644 themes/prestashop/lang/es.php create mode 100644 themes/prestashop/lang/fr.php create mode 100755 themes/prestashop/lang/it.php create mode 100644 themes/prestashop/maintenance.tpl create mode 100644 themes/prestashop/manufacturer-list.tpl create mode 100644 themes/prestashop/manufacturer.tpl create mode 100644 themes/prestashop/my-account.tpl create mode 100644 themes/prestashop/new-products.tpl create mode 100644 themes/prestashop/order-address.tpl create mode 100644 themes/prestashop/order-carrier.tpl create mode 100644 themes/prestashop/order-confirmation.tpl create mode 100644 themes/prestashop/order-detail.tpl create mode 100644 themes/prestashop/order-follow.tpl create mode 100644 themes/prestashop/order-opc-new-account.tpl create mode 100755 themes/prestashop/order-opc.tpl create mode 100644 themes/prestashop/order-payment.tpl create mode 100644 themes/prestashop/order-return.tpl create mode 100644 themes/prestashop/order-slip.tpl create mode 100644 themes/prestashop/order-steps.tpl create mode 100644 themes/prestashop/pagination.tpl create mode 100644 themes/prestashop/password.tpl create mode 100644 themes/prestashop/preview.jpg create mode 100644 themes/prestashop/prices-drop.tpl create mode 100644 themes/prestashop/product-compare.tpl create mode 100644 themes/prestashop/product-list.tpl create mode 100644 themes/prestashop/product-sort.tpl create mode 100644 themes/prestashop/product.tpl create mode 100644 themes/prestashop/products-comparison.tpl create mode 100644 themes/prestashop/restricted-country.tpl create mode 100644 themes/prestashop/scenes.tpl create mode 100644 themes/prestashop/search.tpl create mode 100644 themes/prestashop/shopping-cart-product-line.tpl create mode 100644 themes/prestashop/shopping-cart.tpl create mode 100644 themes/prestashop/sitemap.tpl create mode 100644 themes/prestashop/store_infos.tpl create mode 100644 themes/prestashop/stores.tpl create mode 100644 themes/prestashop/supplier-list.tpl create mode 100644 themes/prestashop/supplier.tpl create mode 100755 tools/.htaccess create mode 100644 tools/fpdf/font/courier.php create mode 100644 tools/fpdf/font/helvetica.php create mode 100644 tools/fpdf/font/helveticab.php create mode 100644 tools/fpdf/font/helveticabi.php create mode 100644 tools/fpdf/font/helveticai.php create mode 100644 tools/fpdf/font/index.php create mode 100644 tools/fpdf/font/makefont/cp1250.map create mode 100644 tools/fpdf/font/makefont/cp1251.map create mode 100644 tools/fpdf/font/makefont/cp1252.map create mode 100644 tools/fpdf/font/makefont/cp1253.map create mode 100644 tools/fpdf/font/makefont/cp1254.map create mode 100644 tools/fpdf/font/makefont/cp1255.map create mode 100644 tools/fpdf/font/makefont/cp1257.map create mode 100644 tools/fpdf/font/makefont/cp1258.map create mode 100644 tools/fpdf/font/makefont/cp874.map create mode 100644 tools/fpdf/font/makefont/index.php create mode 100644 tools/fpdf/font/makefont/iso-8859-1.map create mode 100644 tools/fpdf/font/makefont/iso-8859-11.map create mode 100644 tools/fpdf/font/makefont/iso-8859-15.map create mode 100644 tools/fpdf/font/makefont/iso-8859-16.map create mode 100644 tools/fpdf/font/makefont/iso-8859-2.map create mode 100644 tools/fpdf/font/makefont/iso-8859-4.map create mode 100644 tools/fpdf/font/makefont/iso-8859-5.map create mode 100644 tools/fpdf/font/makefont/iso-8859-7.map create mode 100644 tools/fpdf/font/makefont/iso-8859-9.map create mode 100644 tools/fpdf/font/makefont/koi8-r.map create mode 100644 tools/fpdf/font/makefont/koi8-u.map create mode 100644 tools/fpdf/font/makefont/makefont.php create mode 100644 tools/fpdf/font/symbol.php create mode 100644 tools/fpdf/font/times.php create mode 100644 tools/fpdf/font/timesb.php create mode 100644 tools/fpdf/font/timesbi.php create mode 100644 tools/fpdf/font/timesi.php create mode 100644 tools/fpdf/font/zapfdingbats.php create mode 100644 tools/fpdf/fpdf.php create mode 100644 tools/fpdf/index.php create mode 100755 tools/geoip/geoip.inc create mode 100755 tools/geoip/geoipcity.inc create mode 100755 tools/geoip/geoipregionvars.php create mode 100644 tools/index.php create mode 100644 tools/js_minify/jsmin.php create mode 100644 tools/json/json.php create mode 100755 tools/minify_html/minify_html.class.php create mode 100644 tools/pclzip/pclzip.lib.php create mode 100644 tools/pear/PEAR.php create mode 100644 tools/pear_xml_parser/Parser.php create mode 100644 tools/pear_xml_parser/Parser/Atom.php create mode 100644 tools/pear_xml_parser/Parser/AtomElement.php create mode 100644 tools/pear_xml_parser/Parser/Exception.php create mode 100644 tools/pear_xml_parser/Parser/RSS09.php create mode 100644 tools/pear_xml_parser/Parser/RSS09Element.php create mode 100644 tools/pear_xml_parser/Parser/RSS1.php create mode 100644 tools/pear_xml_parser/Parser/RSS11.php create mode 100644 tools/pear_xml_parser/Parser/RSS11Element.php create mode 100644 tools/pear_xml_parser/Parser/RSS1Element.php create mode 100644 tools/pear_xml_parser/Parser/RSS2.php create mode 100644 tools/pear_xml_parser/Parser/RSS2Element.php create mode 100644 tools/pear_xml_parser/Parser/Type.php create mode 100644 tools/pear_xml_parser/Parser/index.php create mode 100644 tools/pear_xml_parser/index.php create mode 100644 tools/smarty/Smarty.class.php create mode 100644 tools/smarty/cache/index.php create mode 100644 tools/smarty/compile/index.php create mode 100644 tools/smarty/debug.tpl create mode 100644 tools/smarty/plugins/block.php.php create mode 100644 tools/smarty/plugins/block.textformat.php create mode 100644 tools/smarty/plugins/function.counter.php create mode 100644 tools/smarty/plugins/function.cycle.php create mode 100644 tools/smarty/plugins/function.fetch.php create mode 100644 tools/smarty/plugins/function.html_checkboxes.php create mode 100644 tools/smarty/plugins/function.html_image.php create mode 100644 tools/smarty/plugins/function.html_options.php create mode 100644 tools/smarty/plugins/function.html_radios.php create mode 100644 tools/smarty/plugins/function.html_select_date.php create mode 100644 tools/smarty/plugins/function.html_select_time.php create mode 100644 tools/smarty/plugins/function.html_table.php create mode 100644 tools/smarty/plugins/function.mailto.php create mode 100644 tools/smarty/plugins/function.math.php create mode 100644 tools/smarty/plugins/modifier.capitalize.php create mode 100644 tools/smarty/plugins/modifier.date_format.php create mode 100644 tools/smarty/plugins/modifier.debug_print_var.php create mode 100644 tools/smarty/plugins/modifier.escape.php create mode 100644 tools/smarty/plugins/modifier.regex_replace.php create mode 100644 tools/smarty/plugins/modifier.replace.php create mode 100644 tools/smarty/plugins/modifier.spacify.php create mode 100644 tools/smarty/plugins/modifier.truncate.php create mode 100644 tools/smarty/plugins/modifiercompiler.cat.php create mode 100644 tools/smarty/plugins/modifiercompiler.count_characters.php create mode 100644 tools/smarty/plugins/modifiercompiler.count_paragraphs.php create mode 100644 tools/smarty/plugins/modifiercompiler.count_sentences.php create mode 100644 tools/smarty/plugins/modifiercompiler.count_words.php create mode 100644 tools/smarty/plugins/modifiercompiler.default.php create mode 100644 tools/smarty/plugins/modifiercompiler.indent.php create mode 100644 tools/smarty/plugins/modifiercompiler.lower.php create mode 100644 tools/smarty/plugins/modifiercompiler.noprint.php create mode 100644 tools/smarty/plugins/modifiercompiler.string_format.php create mode 100644 tools/smarty/plugins/modifiercompiler.strip.php create mode 100644 tools/smarty/plugins/modifiercompiler.strip_tags.php create mode 100644 tools/smarty/plugins/modifiercompiler.upper.php create mode 100644 tools/smarty/plugins/modifiercompiler.wordwrap.php create mode 100644 tools/smarty/plugins/outputfilter.trimwhitespace.php create mode 100644 tools/smarty/plugins/shared.escape_special_chars.php create mode 100644 tools/smarty/plugins/shared.make_timestamp.php create mode 100644 tools/smarty/plugins/shared.mb_str_replace.php create mode 100644 tools/smarty/plugins/variablefilter.htmlspecialchars.php create mode 100644 tools/smarty/sysplugins/smarty_internal_cacheresource_file.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_append.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_assign.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_block.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_break.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_call.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_capture.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_config_load.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_continue.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_debug.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_eval.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_extends.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_for.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_foreach.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_function.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_if.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_include.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_include_php.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_insert.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_ldelim.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_nocache.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_block_plugin.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_function_plugin.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_modifier.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_object_block_function.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_object_function.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_print_expression.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_registered_block.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_registered_function.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_private_special_variable.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_rdelim.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_section.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compile_while.php create mode 100644 tools/smarty/sysplugins/smarty_internal_compilebase.php create mode 100644 tools/smarty/sysplugins/smarty_internal_config.php create mode 100644 tools/smarty/sysplugins/smarty_internal_config_file_compiler.php create mode 100644 tools/smarty/sysplugins/smarty_internal_configfilelexer.php create mode 100644 tools/smarty/sysplugins/smarty_internal_configfileparser.php create mode 100644 tools/smarty/sysplugins/smarty_internal_data.php create mode 100644 tools/smarty/sysplugins/smarty_internal_debug.php create mode 100644 tools/smarty/sysplugins/smarty_internal_filter.php create mode 100644 tools/smarty/sysplugins/smarty_internal_filter_handler.php create mode 100644 tools/smarty/sysplugins/smarty_internal_function_call_handler.php create mode 100644 tools/smarty/sysplugins/smarty_internal_get_include_path.php create mode 100644 tools/smarty/sysplugins/smarty_internal_nocache_insert.php create mode 100644 tools/smarty/sysplugins/smarty_internal_parsetree.php create mode 100644 tools/smarty/sysplugins/smarty_internal_register.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_eval.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_extends.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_file.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_php.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_registered.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_stream.php create mode 100644 tools/smarty/sysplugins/smarty_internal_resource_string.php create mode 100644 tools/smarty/sysplugins/smarty_internal_smartytemplatecompiler.php create mode 100644 tools/smarty/sysplugins/smarty_internal_template.php create mode 100644 tools/smarty/sysplugins/smarty_internal_templatecompilerbase.php create mode 100644 tools/smarty/sysplugins/smarty_internal_templatelexer.php create mode 100644 tools/smarty/sysplugins/smarty_internal_templateparser.php create mode 100644 tools/smarty/sysplugins/smarty_internal_utility.php create mode 100644 tools/smarty/sysplugins/smarty_internal_wrapper.php create mode 100644 tools/smarty/sysplugins/smarty_internal_write_file.php create mode 100644 tools/smarty/sysplugins/smarty_security.php create mode 100644 tools/smarty_v2/Config_File.class.php create mode 100644 tools/smarty_v2/Smarty.class.php create mode 100644 tools/smarty_v2/Smarty_Compiler.class.php create mode 100644 tools/smarty_v2/cache/index.php create mode 100644 tools/smarty_v2/compile/index.php create mode 100644 tools/smarty_v2/configs/index.php create mode 100644 tools/smarty_v2/index.php create mode 100644 tools/smarty_v2/internals/core.assemble_plugin_filepath.php create mode 100644 tools/smarty_v2/internals/core.assign_smarty_interface.php create mode 100644 tools/smarty_v2/internals/core.create_dir_structure.php create mode 100644 tools/smarty_v2/internals/core.display_debug_console.php create mode 100644 tools/smarty_v2/internals/core.get_include_path.php create mode 100644 tools/smarty_v2/internals/core.get_microtime.php create mode 100644 tools/smarty_v2/internals/core.get_php_resource.php create mode 100644 tools/smarty_v2/internals/core.is_secure.php create mode 100644 tools/smarty_v2/internals/core.is_trusted.php create mode 100644 tools/smarty_v2/internals/core.load_plugins.php create mode 100644 tools/smarty_v2/internals/core.load_resource_plugin.php create mode 100644 tools/smarty_v2/internals/core.process_cached_inserts.php create mode 100644 tools/smarty_v2/internals/core.process_compiled_include.php create mode 100644 tools/smarty_v2/internals/core.read_cache_file.php create mode 100644 tools/smarty_v2/internals/core.rm_auto.php create mode 100644 tools/smarty_v2/internals/core.rmdir.php create mode 100644 tools/smarty_v2/internals/core.run_insert_handler.php create mode 100644 tools/smarty_v2/internals/core.smarty_include_php.php create mode 100644 tools/smarty_v2/internals/core.write_cache_file.php create mode 100644 tools/smarty_v2/internals/core.write_compiled_include.php create mode 100644 tools/smarty_v2/internals/core.write_compiled_resource.php create mode 100644 tools/smarty_v2/internals/core.write_file.php create mode 100644 tools/smarty_v2/internals/index.php create mode 100644 tools/smarty_v2/plugins/block.textformat.php create mode 100644 tools/smarty_v2/plugins/compiler.assign.php create mode 100644 tools/smarty_v2/plugins/function.assign_debug_info.php create mode 100644 tools/smarty_v2/plugins/function.config_load.php create mode 100644 tools/smarty_v2/plugins/function.counter.php create mode 100644 tools/smarty_v2/plugins/function.cycle.php create mode 100644 tools/smarty_v2/plugins/function.debug.php create mode 100644 tools/smarty_v2/plugins/function.eval.php create mode 100644 tools/smarty_v2/plugins/function.fetch.php create mode 100644 tools/smarty_v2/plugins/function.html_checkboxes.php create mode 100644 tools/smarty_v2/plugins/function.html_image.php create mode 100644 tools/smarty_v2/plugins/function.html_options.php create mode 100644 tools/smarty_v2/plugins/function.html_radios.php create mode 100644 tools/smarty_v2/plugins/function.html_select_date.php create mode 100644 tools/smarty_v2/plugins/function.html_select_time.php create mode 100644 tools/smarty_v2/plugins/function.html_table.php create mode 100644 tools/smarty_v2/plugins/function.mailto.php create mode 100644 tools/smarty_v2/plugins/function.math.php create mode 100644 tools/smarty_v2/plugins/function.popup.php create mode 100644 tools/smarty_v2/plugins/function.popup_init.php create mode 100644 tools/smarty_v2/plugins/index.php create mode 100644 tools/smarty_v2/plugins/modifier.capitalize.php create mode 100644 tools/smarty_v2/plugins/modifier.cat.php create mode 100644 tools/smarty_v2/plugins/modifier.count_characters.php create mode 100644 tools/smarty_v2/plugins/modifier.count_paragraphs.php create mode 100644 tools/smarty_v2/plugins/modifier.count_sentences.php create mode 100644 tools/smarty_v2/plugins/modifier.count_words.php create mode 100644 tools/smarty_v2/plugins/modifier.date_format.php create mode 100644 tools/smarty_v2/plugins/modifier.debug_print_var.php create mode 100644 tools/smarty_v2/plugins/modifier.default.php create mode 100644 tools/smarty_v2/plugins/modifier.escape.php create mode 100644 tools/smarty_v2/plugins/modifier.indent.php create mode 100644 tools/smarty_v2/plugins/modifier.lower.php create mode 100644 tools/smarty_v2/plugins/modifier.nl2br.php create mode 100644 tools/smarty_v2/plugins/modifier.regex_replace.php create mode 100644 tools/smarty_v2/plugins/modifier.replace.php create mode 100644 tools/smarty_v2/plugins/modifier.spacify.php create mode 100644 tools/smarty_v2/plugins/modifier.string_format.php create mode 100644 tools/smarty_v2/plugins/modifier.strip.php create mode 100644 tools/smarty_v2/plugins/modifier.strip_tags.php create mode 100644 tools/smarty_v2/plugins/modifier.truncate.php create mode 100644 tools/smarty_v2/plugins/modifier.upper.php create mode 100644 tools/smarty_v2/plugins/modifier.wordwrap.php create mode 100644 tools/smarty_v2/plugins/outputfilter.trimwhitespace.php create mode 100644 tools/smarty_v2/plugins/shared.escape_special_chars.php create mode 100644 tools/smarty_v2/plugins/shared.make_timestamp.php create mode 100644 tools/swift/EasySwift.php create mode 100644 tools/swift/Swift.php create mode 100644 tools/swift/Swift/Address.php create mode 100644 tools/swift/Swift/AddressContainer.php create mode 100644 tools/swift/Swift/Authenticator.php create mode 100644 tools/swift/Swift/Authenticator/@PopB4Smtp.php create mode 100644 tools/swift/Swift/Authenticator/CRAMMD5.php create mode 100644 tools/swift/Swift/Authenticator/LOGIN.php create mode 100644 tools/swift/Swift/Authenticator/PLAIN.php create mode 100644 tools/swift/Swift/Authenticator/PopB4Smtp/Pop3Connection.php create mode 100644 tools/swift/Swift/Authenticator/PopB4Smtp/index.php create mode 100644 tools/swift/Swift/Authenticator/index.php create mode 100644 tools/swift/Swift/BadResponseException.php create mode 100644 tools/swift/Swift/BatchMailer.php create mode 100644 tools/swift/Swift/Cache.php create mode 100644 tools/swift/Swift/Cache/Disk.php create mode 100644 tools/swift/Swift/Cache/JointOutputStream.php create mode 100644 tools/swift/Swift/Cache/Memory.php create mode 100644 tools/swift/Swift/Cache/OutputStream.php create mode 100644 tools/swift/Swift/Cache/index.php create mode 100644 tools/swift/Swift/CacheFactory.php create mode 100644 tools/swift/Swift/ClassLoader.php create mode 100644 tools/swift/Swift/Connection.php create mode 100644 tools/swift/Swift/Connection/Multi.php create mode 100644 tools/swift/Swift/Connection/NativeMail.php create mode 100644 tools/swift/Swift/Connection/Rotator.php create mode 100644 tools/swift/Swift/Connection/SMTP.php create mode 100644 tools/swift/Swift/Connection/Sendmail.php create mode 100644 tools/swift/Swift/Connection/index.php create mode 100644 tools/swift/Swift/ConnectionBase.php create mode 100644 tools/swift/Swift/ConnectionException.php create mode 100644 tools/swift/Swift/Events.php create mode 100644 tools/swift/Swift/Events/BeforeCommandListener.php create mode 100644 tools/swift/Swift/Events/BeforeSendListener.php create mode 100644 tools/swift/Swift/Events/CommandEvent.php create mode 100644 tools/swift/Swift/Events/CommandListener.php create mode 100644 tools/swift/Swift/Events/ConnectEvent.php create mode 100644 tools/swift/Swift/Events/ConnectListener.php create mode 100644 tools/swift/Swift/Events/DisconnectEvent.php create mode 100644 tools/swift/Swift/Events/DisconnectListener.php create mode 100644 tools/swift/Swift/Events/Listener.php create mode 100644 tools/swift/Swift/Events/ListenerMapper.php create mode 100644 tools/swift/Swift/Events/ResponseEvent.php create mode 100644 tools/swift/Swift/Events/ResponseListener.php create mode 100644 tools/swift/Swift/Events/SendEvent.php create mode 100644 tools/swift/Swift/Events/SendListener.php create mode 100644 tools/swift/Swift/Events/index.php create mode 100644 tools/swift/Swift/Exception.php create mode 100644 tools/swift/Swift/File.php create mode 100644 tools/swift/Swift/FileException.php create mode 100644 tools/swift/Swift/Iterator.php create mode 100644 tools/swift/Swift/Iterator/Array.php create mode 100644 tools/swift/Swift/Iterator/MySQLResult.php create mode 100644 tools/swift/Swift/Iterator/index.php create mode 100644 tools/swift/Swift/Log.php create mode 100644 tools/swift/Swift/Log/DefaultLog.php create mode 100644 tools/swift/Swift/Log/index.php create mode 100644 tools/swift/Swift/LogContainer.php create mode 100644 tools/swift/Swift/Message.php create mode 100644 tools/swift/Swift/Message/Attachment.php create mode 100644 tools/swift/Swift/Message/EmbeddedFile.php create mode 100644 tools/swift/Swift/Message/Encoder.php create mode 100644 tools/swift/Swift/Message/Headers.php create mode 100644 tools/swift/Swift/Message/Image.php create mode 100644 tools/swift/Swift/Message/Mime.php create mode 100644 tools/swift/Swift/Message/MimeException.php create mode 100644 tools/swift/Swift/Message/Part.php create mode 100644 tools/swift/Swift/Message/index.php create mode 100644 tools/swift/Swift/Plugin/AntiFlood.php create mode 100644 tools/swift/Swift/Plugin/BandwidthMonitor.php create mode 100644 tools/swift/Swift/Plugin/ConnectionRotator.php create mode 100644 tools/swift/Swift/Plugin/Decorator.php create mode 100644 tools/swift/Swift/Plugin/Decorator/Replacements.php create mode 100644 tools/swift/Swift/Plugin/Decorator/index.php create mode 100644 tools/swift/Swift/Plugin/EasySwiftResponseTracker.php create mode 100644 tools/swift/Swift/Plugin/FileEmbedder.php create mode 100644 tools/swift/Swift/Plugin/MailSend.php create mode 100644 tools/swift/Swift/Plugin/Throttler.php create mode 100644 tools/swift/Swift/Plugin/VerboseSending.php create mode 100644 tools/swift/Swift/Plugin/VerboseSending/AbstractView.php create mode 100644 tools/swift/Swift/Plugin/VerboseSending/DefaultView.php create mode 100644 tools/swift/Swift/Plugin/VerboseSending/index.php create mode 100644 tools/swift/Swift/Plugin/index.php create mode 100644 tools/swift/Swift/RecipientList.php create mode 100644 tools/swift/Swift/index.php create mode 100644 tools/swift/index.php create mode 100644 tools/taasc/AddressStandardizationSolution.php create mode 100644 tools/tar/Archive_Tar.php create mode 100644 translations/de/admin.php create mode 100644 translations/de/errors.php create mode 100644 translations/de/fields.php create mode 100644 translations/de/index.php create mode 100644 translations/de/pdf.php create mode 100644 translations/en/admin.php create mode 100644 translations/en/errors.php create mode 100644 translations/en/fields.php create mode 100644 translations/en/index.php create mode 100644 translations/en/pdf.php create mode 100644 translations/es/admin.php create mode 100644 translations/es/errors.php create mode 100644 translations/es/fields.php create mode 100644 translations/es/index.php create mode 100644 translations/es/pdf.php create mode 100644 translations/export/index.php create mode 100644 translations/fr/admin.php create mode 100644 translations/fr/errors.php create mode 100644 translations/fr/fields.php create mode 100644 translations/fr/index.php create mode 100644 translations/fr/pdf.php create mode 100644 translations/index.php create mode 100644 translations/it/admin.php create mode 100644 translations/it/errors.php create mode 100644 translations/it/fields.php create mode 100644 translations/it/index.php create mode 100644 translations/it/pdf.php create mode 100644 upload/index.php create mode 100644 webservice/dispatcher.php create mode 100644 webservice/index.php diff --git a/404.php b/404.php new file mode 100644 index 000000000..7a74b2168 --- /dev/null +++ b/404.php @@ -0,0 +1,42 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* Send the proper status code in HTTP headers */ +header('HTTP/1.1 404 Not Found'); +header('Status: 404 Not Found'); + +if (in_array(substr($_SERVER['REQUEST_URI'], -3), array('png', 'jpg', 'gif'))) +{ + require_once(dirname(__FILE__).'/config/settings.inc.php'); + header('Location: '.__PS_BASE_URI__.'img/404.gif'); + exit; +} +elseif (in_array(substr($_SERVER['REQUEST_URI'], -3), array('.js', 'css'))) + die(''); + +require_once(dirname(__FILE__).'/config/config.inc.php'); +ControllerFactory::getController('PageNotFoundController')->run(); diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 000000000..15b299ba5 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,3384 @@ +2007-2011 PrestaShop + +NOTICE OF LICENSE + +This source file is subject to the Open Software License (OSL 3.0) +that is bundled with this package in the file LICENSE.txt. +It is also available through the world-wide-web at this URL: +http://opensource.org/licenses/osl-3.0.php +If you did not receive a copy of the license and are unable to +obtain it through the world-wide-web, please send an email +to license@prestashop.com so we can send you a copy immediately. + +DISCLAIMER + +Do not edit or add to this file if you wish to upgrade PrestaShop to newer +versions in the future. If you wish to customize PrestaShop for your +needs please refer to http://www.prestashop.com for more information. + +@author PrestaShop SA +@copyright 2007-2011 PrestaShop SA +@license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +International Registred Trademark & Property of PrestaShop SA + +Release Notes for PrestaShop 1.4 +-------------------------------- +#################################### +# v1.4.3.0 - 7119 (2011-06-16) # +#################################### + + Added Features: + + [+] Installer : Refuse to index the page by robots + + [+] BO : Added button "Add my IP" + [+] BO : Adding pagination to the customers list + [+] BO : added the option to move product images to the new filesystem + + [+] Classes : added manufacturer name and id in ProductSale::getBestSales(); + [+] Classes : added manufacturer name and id in ProductSale::getBestSales(); without sql error ;) + + [+] MO : MondialRelay, add fields personalization and fix js + [+] MO : Refactoring Module dejala and LiveZilla + [+] MO : layered module - real time URL building (ability to give the URL to someone) + + Improved/changed features: + + [*] Project : Removed "if class_exists" in autoload + + [*] Installer : Now when you install Prestashop, all languages are disabled expect the default language of your shop + + [*] FO : Fixed Bug #PSCFI-1342 - Gest customer transformation is only applicable when there is no non-guest customer with the same email + [*] FO : Fixed Bug #PSCFI-2241 - Error in JS tools.js + + [*] BO : Added some help on the search configuration page + [*] BO : detailled error message when you import from csv + + [*] Classes : #PSCFI-2061 - removed return statement in constructor + [*] Classes : fix issue on cache object return value in method getPosition + + [*] MO : Fixed bug #PSCFI-2242 - Changes from the 1.3.x version have not been added to the 1.4 version + [*] MO : Treepodia module can now handle more products on their feed + [*] MO : eBay module - Some improvments + [*] MO : fix issue on loyalty module + + [*] WS : clean code + [*] WS : clean code + + Fixed bugs: + + [-] PROJECT : Bug fixed #PSCFI-2119 - Cache was not working well with getRow and getValue (Thanks Remi for the fix :) + [-] Project : remove unused 4 param in Tools::displayPrice() #PSCFI-2063 + [-] Project : the autoload now accept not "Core" classes in classes folder. + + [-] Installer : Undefined variable languages + [-] Installer : add a ";" to SQL requeste + + [-] FO : Add a defined list of required fields for a susbscription form + [-] FO : Bug Fixed #PSCFI-1515 - Specific price cache is useless in priceCalculation + [-] FO : Bug Fixed #PSCFI-2090 - Group discount + discount = incorrect combination price + [-] FO : Bug Fixed #PSCFI-2105 - Voucher discount on total amount + [-] FO : Bug Fixed #PSCFI-2107 - Required Field "Tax Identification" + [-] FO : Bug Fixed #PSCFI-2161 - Rounding issues + [-] FO : Bug Fixed (related #PSCFI-2250) - Out of stock behavior + comparison page + [-] FO : BugFix #PSCFI-2267 : Forbidden access to tpl files + [-] FO : BugFix #PSCFI-2271 : Cumulable voucher can be added more than one time to cart + [-] FO : Fix Undefined value when adding a product to the cart + [-] FO : Fix a bug with invoice address on OPC #PSCFI-2099 + [-] FO : Fix the default fields for a new register user form + [-] FO : Fixed Bug #PSCFI-1730 - CCC mustn't be included each time with https + [-] FO : Fixed Bug #PSCFI-2163 - Product list dont show "add to cart" button, if minimal qty to order is set to something != 1, it must be <= 1 + [-] FO : Fixed Bug #PSCFI-2163 - Product minimal quantity by default must be 1 and not 0 + [-] FO : Fixed Bug #PSCFI-2192 - Nomalization + [-] FO : Fixed Bug #PSCFI-2241 - Error in JS tools.js + [-] FO : Fixed bug #PSCFI-2088 - change id attribute adress_alias to address_alias. + [-] FO : Fixed bug #PSCFI-2120 - Customization image delete button doesn't work. The link was commented. + [-] FO : Fixed bug #PSCFI-2150 - Wrong url when we used the sort option + [-] FO : Fixed bug PSCFI-2135, Refreshing price is fixed when the ajax setting of blockcart is turned off + [-] FO : Function usingSecureMode does not work properly (depends on the server configuration) + [-] FO : PSCFI-2118 - Substr of payment name compared to payment name (payment name musnt be truncated). + [-] FO : PSCFI-2118 - Substr of payment name compared to payment name (payment name musnt be truncated). + [-] FO : Remove blocklayered CSS/Js files on page we dont need them (and they make bugs with pager) + [-] FO : Rounding issues + [-] FO : Smarty 2 compatibility + [-] FO : Validator don't work fine with non ansi chars + [-] FO : fix an URL never rewrited in stores.js #PSCFI-1931 + [-] FO : fixed bug #PSCFI-2153 - CreditSlip PDF not accessible from FrontOffice + [-] FO : fixed bug #PSCFI-2171 - Group Access Not Working + [-] FO : fixed bug #PSCFI-2203 - [OPC] AJAX login fails and freezes when user has no address defined. + [-] FO : fixed bug #PSCFI-2279 - voucher add to cart technical error + [-] FO : fixed bug - breadcrumb was not display in some case. + [-] FO : removing the link on the category label #PSCFI-2065 + + [-] BO : Better understanting for address layout, Add a ignore class list for the liable fields and fix translsation + [-] BO : Bug fixed on CSV import (Thanks to Magavenue :) + [-] BO : BugFix #PSCFI-2289 - AdminImport not working in some cases + [-] BO : Fix tax calcul in attribute generator #PSCFI-2095 + [-] BO : Fixed #PSCFI-444 - flag can be updated even if .htaccess is not writable + [-] BO : Fixed Bug #PSCFI-2200 - On installing languages, bad adding on table profile_lang (id_lang and id_profile are reversed) + [-] BO : Fixed Bug #PSCFI-2263 - Mexico must be set as a country with states + [-] BO : Fixed Bug PSCFI-2198, The current editing element will not be removed if the user cancel it and a better fonctionality of Echap key. + [-] BO : Fixed bug #PSCFI-2092 - Missing translation on contact details + [-] BO : Fixed bug PSCFI-2207, Fixed a bad variabled used with vat. + [-] BO : Fixed invoice date when database is MySQL 4. + [-] BO : fixed bug #PSCFI-2247 - AdminCustomerThreads (Customer Service) displays wrong currency symbol in BO + [-] BO : fixed bug #PSCFI-2248 - browser error "unterminated string constant" in AdminTracking.php + [-] BO : fixed bug #PSCFI-2255 - PDF PS_INVOICE_PREFIX without iconv + [-] BO : fixed image caching when memory_limit = -1 + [-] BO : fixed overflowing admin sub-tabs in themes flashyturtle and origins + [-] BO : fixed rewrite link warning message when importing + [-] BO : removed hard coded tmp img link + + [-] Classes : Bug fixed in Language class, delete method when no i18n file were created for a language. + [-] Classes : fixed bug #PSCFI-2124 - Misuse of redirect (Tools.php) in Order Process (and probably other areas) causes failed flow. + [-] Classes : fixed bug #PSCFI-2141 - Object->add() should not use Tools::getValue() - final part + [-] Classes : fixed bug #PSCFI-2141 - Object->add() should not use Tools::getValue() - first part + [-] Classes : fixed bug in property_exists function + [-] Classes : fixed calls of non static method as static in order controllers + + [-] Core : fixed bug #PSCFI-2143 - Insufficient check for crawler populated ghost carts in CartController + + [-] MO : #Fixed bug PSCFI-2134 - Json parse error. Need ' instead of \' + [-] MO : Add Constants cart directly to the module for the PrestaShop 1.3 compatibility + [-] MO : Bug fixed #PSCFI-2122 - Problem on rounded values + [-] MO : Bug fixed #PSCFI-2122 - Problem on tax values + [-] MO : Bug fixed #PSCFI-2238 - Module USPS was send container type to USPS + [-] MO : Bug fixed eBay module - Wrong flag for resync option + [-] MO : Categories shown twice (or more) on block category when customer have more than one group + [-] MO : Code Cleaning + [-] MO : Fix blocklayered module to allow user to sort products list (now use default value from BO, and refresh using ajax) #PSCFI-2096 + [-] MO : Fix console.log IE + [-] MO : Fix minors bug and translations + [-] MO : Fix smarty display for 1.3 + [-] MO : Fix translations + [-] MO : Fixed Bug #PSCFI-2182 - Loyalty module (loyalty-program.php) return wrong category list and too long list on vast catalog + [-] MO : Fixed Bug #PSCFI-2191 - DIBS module test paramter is assigned with wrong values. + [-] MO : Fixed Bug #PSCFI-2191 - DIBS module test paramter is assigned with wrong values. + [-] MO : Fixed Bug #PSCFI-2192 - Required fields and ajax cart dont work as expected + [-] MO : Fixed Bug #PSCFI-2192 - Required fields and ajax cart dont work as expected + [-] MO : Fixed Bug #PSCFI-2264 - Left scroll button is visible when the page is loaded whereas there is no products on the left. + [-] MO : Fixed SQL error on layered module + [-] MO : Fixed SQL/PHP errors on layered module when category is empty + [-] MO : Fixed bug - Incorrect validation for discount_value_percentage field + [-] MO : Fixed bug - Possibility to put negative values + [-] MO : Fixed bug - Values are not passed in an htmlentities function before display + [-] MO : Fixed bug : Ajax with the button add cart properly works when an product image doesn't exist + [-] MO : Fixed bug PSCFI-2187, Use back price_wt instead of total_wt wthen product is added to google cart. + [-] MO : Fixed bug when the hook is detached of the right + [-] MO : Fixed errors, and add nb items per page to the layered block module + [-] MO : Fixed norms + [-] MO : Had a security token on eBay module + [-] MO : Mistake in the commit 6952 + [-] MO : MondialRelay fix french franslations + [-] MO : MondialRelay is now supported for PrestaShop 1.3. Clean unused code. + [-] MO : MondialRelay, add french translation + [-] MO : Norm pass + [-] MO : Normalization + better directory clean + [-] MO : PayPal create account link for Spain changed + [-] MO : added cast in blockrss + [-] MO : added check on secure key in moneybookers validation + [-] MO : added token on export and send mail on twenga module + [-] MO : carriercompare - undefined variable + [-] MO : eBay module - fix for PrestaShop 1.3.x and many others improvments + [-] MO : fix french translation for statscarrier + [-] MO : fixed Fatal Error when payment name in osc bdd has character inappropriate // :p + [-] MO : fixed bug #PSCFI-2165 - Module ImporterOsc - After importing, changing orders state, in list mode : date of today, in order detail mode : real date + [-] MO : fixed bug #PSCFI-2194 - Layered when reset display inactive products + [-] MO : fixed bug #PSCFI-2219 - Incorrect usage of numRows() + [-] MO : fixed bug #PSCFI-2229 - added help text on specific option + [-] MO : fixed bug #PSCFI-2240 - Layered navigation - overloading template file (.tpl) is not working + [-] MO : fixed bug #PSCFI-2280 - module customer follow up has bug when install in back office + [-] MO : fixed bug - import osc was not display in shopImport module + [-] MO : fixed bug on instant search with Internet Explorer 7 + [-] MO : fixed bug on tm4b + [-] MO : fixed error when uninstall socolissimo module //thanks to Alain ouftete + [-] MO : layered navigation pagination added ;) #PSCFI-2137 #PSCFI-2085 + [-] MO : layered navigation pagination fixed undefined variable + [-] MO : now only discount bound to a valid order is shown (Loyalty module) + + [-] WS : Bug fixed due to Core modifications + [-] WS : Factorization of WebserviceRequest + [-] WS : Small fix when error happens + [-] WS : Support for categories POST - PSCFI-1416 + [-] WS : Support for image product POST method PSCFI-675, PSCFI-1416 + + [-] PDF : Bug Fixed - Invoice: tax detail line with reduction + + +#################################### +# v1.4.2.5 - 6780 (2011-05-30) # +#################################### + + Improved/changed features: + + [*] Installer : add PS_VERSION_DB configuration data filled after install / upgrade + + [*] FO : smarty_v2 improvement : moved currentTemplate init in fetch method instead of display method + + [*] Core : module carrier has been disabled on One page checkout when customer isn't logged + [*] Core : module carrier has been disabled on One page checkout when customer isn't logged Part 2 + + Fixed bugs: + + [-] Project : fix an issue on Tools::jsonDecode + + [-] Installer : fixed bug where categories have incorrect level_depth + + [-] FO : Bug Fixed #PSCFI-2077 - Tax rules + customization + [-] FO : Fixed #PSCFI-2051 - weekdays translations are now correct in store_infos google maps + [-] FO : Fixed #PSCFI-2066 - Control terms if terms are activated + [-] FO : On updating address with a bad field, firstname and alias are fill with the post + the registered data. + + [-] BO : Fixed bug #PSCFI-2035 - The other messages in this category have been answered + [-] BO : Fixed bug #PSCFI-2073 - avoid crashing the product listing page when you have not enough memory to resize the thumbnails + + [-] Classes : fixed bug with cookie name generated from http host causing cookie duplication + + [-] MO : Bug fixed #PSCFI-2055 - number_format replaced by round in PayPal Module (Thanks Angora :) + [-] MO : Bug fixed on eBay Module (when products does not exist) + [-] MO : Fixed bug #PSCFI-1782 - Dibs could not do the callback + [-] MO : adding a message in So Colissimo module, in order to indicate: this module isn't compliant with OPC feature + + +#################################### +# v1.4.2.4 - 6742 (2011-05-27) # +#################################### + + Added Features: + + [+] Installer : Case management system of ubuntu, phpversion return 5.2.4-2ubuntu5.2 + [+] Installer : During installation if the PHP version is less than 5.2, install smarty 2, otherwise it installs smarty 3 + [+] Installer : during upgrade, analyse the database structure to find PrestaShop version and compare it to version in settings to display or not a warning + [+] Installer : hidden notice date_default_timezone_set, notice prevented the use of Ajax back + + [+] BO : Add jquery plugin for the address layout selection feature + [+] BO : Added ability to add instructions in the backup file to drop existing tables during restore + [+] BO : Adding validation field for Regenerate password + [+] BO : Adding validation function and Update Options function + [+] BO : Address layout add the pattern when an user click on a selection key + [+] BO : Now you can update an already installed language from prestashop.com + [+] BO : add display of company name in order details, and display of phone in PDF invoice + [+] BO : add module physical name as title of element in admin module list + + [+] MO : Added "Site speed" feature to Google Analytics Module (See which pages load the fastest and which ones are slower) + [+] MO : Added customer e-mail in the notification sent after each order (mailalerts module) + [+] MO : Rewrite Generate and Get tickets including new Interface class to communique with the mondial relay webservice + [+] MO : blockcategories can now be hooked on footer + [+] MO : eBay module (currently only for eBay.fr) + + [+] WS : Add virtual field in Category entity. + [+] WS : add state command for WS + [+] WS : allow displayed simple association + [+] WS : allow negative values in the filter + [+] WS : allow the outformat even the authentication failed + [+] WS : allow to display association in blank schema + [+] WS : allow to display association in synopsis + [+] WS : bug PSCFI-1659 is fixed + [+] WS : bug PSCFI-1778 is fixed + [+] WS : bug PSCFI-1778 is fixed + [+] WS : bug PSCFI-1780 is fixed + [+] WS : change association name and its getter, improve error output + [+] WS : improve the filter behaviour + + Improved/changed features: + + [*] Project : Improve autoload performances + + [*] Installer : A log file is now created during installation + [*] Installer : Add index to modules followup and add index to installer + [*] Installer : added unique index to table category_group + [*] Installer : for old version, you will keep your admin icon for your custom tab + [*] Installer : no more cache after upgrade + [*] Installer : when upgrade, cleaning cache and compile dir now also exclude .htaccess files + + [*] FO : #PSCFI-1594 Corrects missing id_country + [*] FO : #PSCFI-1647 corrects disappearing invoice address title + [*] FO : Adding address layout management + [*] FO : Adding address layout management + [*] FO : Adding address layout management + [*] FO : Adding address layout management + [*] FO : CSS improvements (thanks Melinda!) + [*] FO : New default logo (better JPG quality) + [*] FO : corrects js error when cart is empty + [*] FO : hide the "add to cart" button if there are required customization fields + [*] FO : hide the "hide to cart" button for products with minimal quantity > 1 when customer can't choose the quantity + [*] FO : remove some unused global vars declaration + + [*] BO : 'add a language' is now 'add or update a language' + [*] BO : Added new column to "Carts" tab and ability to delete carts + [*] BO : Added several advice to help during database backup process and database restore process + [*] BO : Better cache management for image uploading (Categories, Manufacturers, Suppliers, Stores) - no more need to press CTRL+F5 + [*] BO : Fixed #PSCFI-1667 + [*] BO : Improved code standards and UI/UX for the Translations tab + [*] BO : Improved product indexation (1 query instead of 1 query per word!) + [*] BO : Improvement about login with SSL enabled. Now you can use http if maintenance or local ip. + [*] BO : On module list reduce SQL query + [*] BO : On modules position reduce SQL queries + [*] BO : Remove unused variable + [*] BO : added a default sort direction on the stats modules + [*] BO : added a warning message when the shop domain name is wrong + [*] BO : added warning message when updating a language pack you already installed + [*] BO : check if cart has an order attached improvement + [*] BO : delete unused method and globals in adminOrder + [*] BO : deleting the English language is now forbidden + [*] BO : improvement of module filter system + [*] BO : initial stock to 0 (new added products,new declination,generator declination ) + [*] BO : now all hidden file are excluded in listing file in adminImport + [*] BO : now to enable ssl, you need to already use it in back office + [*] BO : performance optimization in the back office, and performance tools added for developers + [*] BO : when carrier is free => don't display range + [*] BO : you can now choose if you want to delete existing images in product import + [*] BO : you can now enable or disable newsletter and optin options, directly on the customers listing + + [*] Classes : removed some more returns in constructors see #PSCFI-2009 + [*] Classes : see #PSCFI-2009 - Use of return statements in class constructors break class integrity + + [*] MO : Change European VAT module description + [*] MO : Enable translation to title/description of the module "pretashop security" + [*] MO : Fix bug when saving module Customer referral program (error message say each time "Invalid html field, javascript is forbidden") + [*] MO : Improvment #PSCFI-934 - UPS module has now an option to make one package for all products + [*] MO : fixed bug on validate Rules shopImport + [*] MO : fixing tpl calculation specials + [*] MO : import oscommerce now import newsletter + [*] MO : improve in module Paypal (thank you Tomer) + [*] MO : now oscommerce import use "date_add" for products + [*] MO : theme installer can now manage module exceptions + + [*] WS : Add image association for combinations + [*] WS : Add information for associations : virtual_entity + [*] WS : Add manufacturer_name getter for Product entity and clean WebserviceParameters of Configuration entity + [*] WS : Add new authentification method for Webservice + [*] WS : Add setWsPasswd in Customer and Employee entity in order to set password in plain text + [*] WS : All setter which don't exists is set to false + [*] WS : Fixed feature/bug PSCFI-1095 + [*] WS : Improve Attribute displaying + [*] WS : dispatcher evolved + [*] WS : refactoring webservice classes + [*] WS : set the class name to us for webservice with a static property of WebserviceRequest class. [-] WS : product options values are get well + + [*] TR : fixed translations #PSCFI-759 + [*] TR : fixed translations #PSCFI-862 + + Fixed bugs: + + [-] PROJECT : Fixing bug in AddressFormat (as vSchoener suggestion) + [-] Project : Add a new way to build the layout address. All template / pdf are compatible with and keep the order of the layout. Fix US format view for the addresses + [-] Project : add parameters to respect the strict standard + [-] Project : add parameters to respect the strict standard + [-] Project : fixed bug #PSCFI-1687 - $protocol_link and $protocol_content not assigning correctly + + [-] Installer : 1.4.1.1 => 1.4.2.0 wq + [-] Installer : Fix PSCFI-1579 - on update, paypal and authorize.net will not be disabled. + [-] Installer : Fixed #PSCFI-1722 - Characters encoding problem + [-] Installer : Fixed bug #1803 - Adding IGNORE if the configuration already exists + [-] Installer : Fixed bug #1803 - The PS_STOCK_MVT_REASON_DEFAULT was never add in the configuration table during the update. + [-] Installer : Fixed bug in sql query settings lite + [-] Installer : Fixed bug on installing without default timezone + [-] Installer : Fixed for new address format + [-] Installer : Fixed undefined constant when upgrading from version 1.3.7 or lower + [-] Installer : If an user submit wrong infos on the step 4, he can't re-submit the form because the button next is disabled + [-] Installer : Missing translations + [-] Installer : Tab AdminAliases is now correctly moved to Preferences during update + [-] Installer : Undefined variable in update_module_followup + [-] Installer : bug fixed #1863 request update (SQL) + [-] Installer : desactivate custom module will not desactivate native partner modules + [-] Installer : fix commit 6591 - remove duplicates from table category_group + [-] Installer : fix error template smarty for smarty v2 + [-] Installer : fix php version ubuntu + [-] Installer : fixed bug #PSCFI-1301 - Prestashop installation and Swift exception + [-] Installer : fixed bug #PSCFI-1542 - PSCFI-1455 (svn5981) needs further followup + [-] Installer : fixed bug #PSCFI-1613 - Missing flag when adding languages during installation + [-] Installer : fixed bug #PSCFI-1747 - Variable assigned to rigidly in a file in the module dateofdelivery + [-] Installer : fixed bug #PSCFI-1823 - use of PHP function property_exists is not compatible with PHP 5.0 + [-] Installer : fixed bug #PSCFI-1841 - ps prefix in sql file + [-] Installer : fixed bug #PSCFI-1908 - Tab name for SEO & URLs is now updated in sql 1.4.2.3 + [-] Installer : fixed bug #PSCFI-1934 - removes duplicates from table category_group + [-] Installer : fixed bug #PSCFI-979 - unknown _PS_version_ in install process + [-] Installer : fixed bug on upgrader when you have wrong informations in your settings.inc.php file + [-] Installer : fixed timezone issue on install process with a version of PHP < 5.2 + [-] Installer : fixes for the sql upgrade scripts + [-] Installer : module loyalty + [-] Installer : removed hard id_tab for AdminMeta lang update + + [-] FO : If the purchase is verified with a guest account if this type of control is allowed + [-] FO : Prohibits the payment of an order if the conditions were not accepted + [-] FO : #PSCFI-1654 Fixed a bug concerning the order process after a login + [-] FO : #PSCFI-1660 Fixed a bug which not display an error when a carrier is not selected + [-] FO : #PSCFI-1674 Display problem about tax identification with guest checkout activated + [-] FO : Accept return product when the status of payment is accepted. + [-] FO : After an upgrade, it was impossible to create an account + [-] FO : Bug Fixed #PSCFI-1558 - Ecotax on product page when taxes are disabled + [-] FO : Bug Fixed #PSCFI-1845 - Rounding issues + [-] FO : Bug Fixed #PSCFI-1980 - Minimum order purchase and taxes + [-] FO : Fix bug when double click on "confirm order" button (add .hideOnSubmit class on elements to hide when parent form is submit) #PSCFI-1954 + [-] FO : Fix bug when double click on "confirm order" button (add .hideOnSubmit class on elements to hide when parent form is submit) #PSCFI-1954 + [-] FO : Fix else if and assign compatibility for smarty v2 + [-] FO : Fix state order for USA + [-] FO : Fix the displayed address using smarty 2 + [-] FO : Fix the state display changing the country when State:name doesn't exist in the layout + [-] FO : Fix theme compatibility < 1.4.2 + [-] FO : Fix undefined variable + [-] FO : Fixed #PSCFI-1454 - fixed security lack if someone know the maintenance IP + [-] FO : Fixed #PSCFI-1611 - Comment mistake + [-] FO : Fixed a bug related to Smarty v2 on addresses.tpl + [-] FO : Fixed a bug related to the "Last quantities available" message display + [-] FO : Fixed an error when declinations with variable attributes are created for a same product + [-] FO : Fixed bug #PSCFI-1582 - Not correct search. Now we list all products which contains the search word. + [-] FO : Fixed bug #PSCFI-1592 - CMS category specifics meta tags was missing + [-] FO : Fixed bug #PSCFI-1593 - Path error with CMS subcategory. The $fullPath variable wasn't declared in the right place. + [-] FO : Fixed bug #PSCFI-1652 - The Best Sales pagination now works properly + [-] FO : Fixed bug #PSCFI-1665 - Invalid token when Instant search enabled. The $static_token variable was never set with instant search + [-] FO : Fixed bug #PSCFI-1718 - Categories block doesn't show categories when processing empty cart checkout. There was a javascript error. + [-] FO : Fixed bug #PSCFI-1825 - Tax is always displayed on the cart module + [-] FO : Fixed bug #PSCFI-1842 For guest, order details disappears when the browser is resized (IE7) + [-] FO : Fixed bug #PSCFI-1858 - Bug with cutomized field and reordering + [-] FO : Fixed bug #PSCFI-1864 - Fixed bug on ganalytics trackink step order when using url rewriting + [-] FO : Fixed bug #PSCFI-1865 - Some supplier images were not displayed. Image directory was _PS_MANU_IMG_DIR_ instead of _PS_SUPP_IMG_DIR_ + [-] FO : Fixed bug #PSCFI-1883 - Changing the condition to avoid a problem of cache + [-] FO : Fixed bug #PSCFI-1895 - redirection problems on adding product to cart + [-] FO : Fixed bug #PSCFI-1895 - redirection problems on removing product to cart + [-] FO : Fixed bug #PSCFI-1914 - Voucher calculation and product discount + [-] FO : Fixed bug #PSCFI-1914 - Voucher calculation and product discount + [-] FO : Fixed bug #PSCFI-2024 - If using minimum amount to order don't see "cart is empty" alert but the cart with no products. + [-] FO : Fixed bug Smarty error $customizationQuantityTotal didn't exist. Replaced by $product.customizationQuantityTotal. + [-] FO : Fixed the undefined variable invoice_address on pdf-order-return.php + [-] FO : Incorrect price on product page when using group reduction + combination + [-] FO : No error popup "Cannot add this product because current voucher does not allow additional discounts" while using ajax cart + [-] FO : Product combination quantity not displayed + [-] FO : Product with combination should use default ecotax if not overriden + [-] FO : Removed useless CSS in blockstore #PSCFI-1443 + [-] FO : Small fix regarding code standards + [-] FO : Validation W3C + [-] FO : bug fixed remaning for free shippping was casted to int + [-] FO : extra semicolon + [-] FO : fix a bug with default declination in product page #PSCFI-1917 + [-] FO : fix a javascript bug on order page when a cart item is deleted #PSCFI-1905 + [-] FO : fixed a bug wich controls the validity of the password + [-] FO : fixed bug #PSCFI-1310 - DNI mandatory for country not requesting DNI + [-] FO : fixed bug #PSCFI-1316 - one page checkout gives shipping error when the shipping clearly shows + [-] FO : fixed bug #PSCFI-1585 - Wrong filename css in SearchControllers.php + [-] FO : fixed bug #PSCFI-1590 - meta page title for manufacturers and suppliers + [-] FO : fixed bug #PSCFI-1602 - Googlemaps does not show the map or even the shops (there is no map) + [-] FO : fixed bug #PSCFI-1686 - Redirect to ssl has incorrect logic + [-] FO : fixed bug #PSCFI-1713 - issue with wishlist name translation + [-] FO : fixed bug #PSCFI-1786 - svn6231 cart bug and cannot check out using 1 page or 5 step checkout + [-] FO : fixed bug #PSCFI-1827 - Error with Url rewrite on stores page + [-] FO : fixed bug #PSCFI-1906 - 2 states fields for American account creation + [-] FO : fixed bug #PSCFI-2012 - The names of some sub categories are overflowing + [-] FO : fixed bug on refresh of cart summary when you log in on One page checkout + [-] FO : fixed bug on smarty v2 compatibility + [-] FO : fixed little bug with TOS value on Cookie + [-] FO : fixed strange chars in CMS contents when HTML is reduced #PSCFI-1956 + [-] FO : removing the link on the category label + [-] FO : search improvements, both for indexation and search + [-] FO : see #PSCFI-1454 + [-] FO : set '; +if (isset($_GET['installBoughtModule'])) +{ + $file = false; + while ($file === false OR file_exists(_PS_MODULE_DIR_.$file)) + $file = uniqid(); + $file = _PS_MODULE_DIR_.$file.'.zip'; + $sourceFile = 'http://addons.prestashop.com/iframe/getboughtfile.php?id_order_detail='.Tools::getValue('id_order_detail').'&token='.Tools::getValue('token'); + if (!copy($sourceFile, $file)) + { + if (!($content = file_get_contents($sourceFile))) + die(displayJavascriptAlert('Access denied: Please download your module directly from PrestaShop Addons website')); + elseif (!file_put_contents($file, $content)) + die(displayJavascriptAlert('Local error: your module directory is not writable')); + } + $first6 = fread($fd = fopen($file, 'r'), 6); + if (!strncmp($first6, 'Error:', 6)) + { + $displayJavascriptAlert = displayJavascriptAlert(fread($fd, 1024)); + fclose($fd); + unlink($file); + die($displayJavascriptAlert); + } + fclose($fd); + if (!Tools::ZipExtract($file, _PS_MODULE_DIR_)) + { + unlink($file); + die(displayJavascriptAlert('Cannot unzip file')); + } + unlink($file); + die(displayJavascriptAlert('Module copied to disk')); +} + +function displayJavascriptAlert($s){echo '';} + +if (isset($_GET['ajaxProductManufacturers'])) +{ + $currentIndex = 'index.php?tab=AdminCatalog'; + $manufacturers = Manufacturer::getManufacturers(); + if ($manufacturers) + { + $jsonArray = array(); + foreach ($manufacturers AS $manufacturer) + $jsonArray[] = '{"optionValue": "'.$manufacturer['id_manufacturer'].'", "optionDisplay": "'.htmlspecialchars($manufacturer['name']).'"}'; + die('['.implode(',', $jsonArray).']'); + } +} +if (isset($_GET['ajaxReferrers'])) +{ + require('tabs/AdminReferrers.php'); +} + +if (isset($_GET['ajaxProductSuppliers'])) +{ + $currentIndex = 'index.php?tab=AdminCatalog'; + $suppliers = Supplier::getSuppliers(); + if ($suppliers) + { + $jsonArray = array(); + foreach ($suppliers AS $supplier) + $jsonArray[] = '{"optionValue": "'.$supplier['id_supplier'].'", "optionDisplay": "'.htmlspecialchars($supplier['name']).'"}'; + die('['.implode(',', $jsonArray).']'); + } +} + +if (isset($_GET['ajaxProductAccessories'])) +{ + $currentIndex = 'index.php?tab=AdminCatalog'; + $jsonArray = array(); + + $products = Db::getInstance()->ExecuteS(' + SELECT p.`id_product`, pl.`name` + FROM `'._DB_PREFIX_.'product` p + NATURAL LEFT JOIN `'._DB_PREFIX_.'product_lang` pl + WHERE pl.`id_lang` = '.(int)(Tools::getValue('id_lang')).' + AND p.`id_product` != '.(int)(Tools::getValue('id_product')).' + AND p.`id_product` NOT IN ( + SELECT a.`id_product_2` + FROM `'._DB_PREFIX_.'accessory` a + WHERE a.`id_product_1` = '.(int)(Tools::getValue('id_product')).') + ORDER BY pl.`name`'); + + foreach ($products AS $accessory) + $jsonArray[] = '{"value: "'.(int)($accessory['id_product']).'-'.addslashes($accessory['name']).'", "text":"'.(int)($accessory['id_product']).' - '.addslashes($accessory['name']).'"}'; + die('['.implode(',', $jsonArray).']'); +} + +if (isset($_GET['ajaxDiscountCustomers'])) +{ + global $cookie; + + $currentIndex = 'index.php?tab=AdminDiscounts'; + $jsonArray = array(); + $filter = Tools::getValue('filter'); + + if (Validate::isBool_Id($filter)) + $filterArray = explode('_', $filter); + + $customers = Db::getInstance()->ExecuteS(' + SELECT `id_customer`, `email`, CONCAT(`lastname`, \' \', `firstname`) as name + FROM `'._DB_PREFIX_.'customer` + WHERE `deleted` = 0 AND is_guest = 0 + AND '.(Validate::isUnsignedInt($filter) ? '`id_customer` = '.(int)($filter) : '(`email` LIKE "%'.pSQL($filter).'%" + '.((Validate::isBool_Id($filter) AND $filterArray[0] == 0) ? 'OR `id_customer` = '.(int)($filterArray[1]) : '').' + '.(Validate::isUnsignedInt($filter) ? '`id_customer` = '.(int)($filter) : '').' + OR CONCAT(`firstname`, \' \', `lastname`) LIKE "%'.pSQL($filter).'%" + OR CONCAT(`lastname`, \' \', `firstname`) LIKE "%'.pSQL($filter).'%")').' + ORDER BY CONCAT(`lastname`, \' \', `firstname`) ASC + LIMIT 50'); + + $groups = Db::getInstance()->ExecuteS(' + SELECT g.`id_group`, gl.`name` + FROM `'._DB_PREFIX_.'group` g + LEFT JOIN `'._DB_PREFIX_.'group_lang` AS gl ON (g.`id_group` = gl.`id_group` AND gl.`id_lang` = '.(int)($cookie->id_lang).') + WHERE '.(Validate::isUnsignedInt($filter) ? 'g.`id_group` = '.(int)($filter) : 'gl.`name` LIKE "%'.pSQL($filter).'%" + '.((Validate::isBool_Id($filter) AND $filterArray[0] == 1) ? 'OR g.`id_group` = '.(int)($filterArray[1]) : '')).' + ORDER BY gl.`name` ASC + LIMIT 50'); + + $json = '{"customers" : '; + foreach ($customers AS $customer) + $jsonArray[] = '{"value":"0_'.(int)($customer['id_customer']).'", "text":"'.addslashes($customer['name']).' ('.addslashes($customer['email']).')"}'; + $json .= '['.implode(',', $jsonArray).'], + "groups" : '; + $jsonArray = array(); + foreach ($groups AS $group) + $jsonArray[] = '{"value":"1_'.(int)($group['id_group']).'", "text":"'.addslashes($group['name']).'"}'; + $json .= '['.implode(',', $jsonArray).']}'; + die($json); +} + +if (Tools::getValue('page') == 'prestastore' AND @fsockopen('addons.prestashop.com', 80, $errno, $errst, 3)) + readfile('http://addons.prestashop.com/adminmodules.php?lang='.Language::getIsoById($cookie->id_lang)); +if (Tools::getValue('page') == 'themes' AND @fsockopen('addons.prestashop.com', 80, $errno, $errst, 3)) + readfile('http://addons.prestashop.com/adminthemes.php?lang='.Language::getIsoById($cookie->id_lang)); + +if ($step = (int)(Tools::getValue('ajaxProductTab'))) +{ + require_once(dirname(__FILE__).'/tabs/AdminCatalog.php'); + $catalog = new AdminCatalog(); + $admin = new AdminProducts(); + + $languages = Language::getLanguages(false); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $product = new Product((int)(Tools::getValue('id_product'))); + if (!Validate::isLoadedObject($product)) + die (Tools::displayError('Product cannot be loaded')); + + $switchArray = array(3 => 'displayFormPrices', 4 => 'displayFormAttributes', 5 => 'displayFormFeatures', 6 => 'displayFormCustomization', 7 => 'displayFormAttachments'); + $currentIndex = 'index.php?tab=AdminCatalog'; + if (key_exists($step, $switchArray)) + $admin->{$switchArray[$step]}($product, $languages, $defaultLanguage); +} + +if (isset($_GET['getAvailableFields']) and isset($_GET['entity'])) +{ + $currentIndex = 'index.php?tab=AdminImport'; + $jsonArray = array(); + require_once(dirname(__FILE__).'/tabs/AdminImport.php'); + $import = new AdminImport(); + + $languages = Language::getLanguages(false); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $fields = $import->getAvailableFields(true); + foreach ($fields AS $field) + $jsonArray[] = '{"field":"'.addslashes($field).'"}'; + die('['.implode(',', $jsonArray).']'); +} + +if (array_key_exists('ajaxModulesPositions', $_POST)) +{ + $id_module = (int)(Tools::getValue('id_module')); + $id_hook = (int)(Tools::getValue('id_hook')); + $way = (int)(Tools::getValue('way')); + $positions = Tools::getValue(strval($id_hook)); + $position = (is_array($positions)) ? array_search($id_hook.'_'.$id_module, $positions) : null; + $module = Module::getInstanceById($id_module); + if (Validate::isLoadedObject($module)) + if ($module->updatePosition($id_hook, $way, $position)) + die(true); + else + die('{"hasError" : true, "errors" : "Can not update module position"}'); + else + die('{"hasError" : true, "errors" : "This module can not be loaded"}'); +} + +if (array_key_exists('ajaxCategoriesPositions', $_POST)) +{ + $id_category_to_move = (int)(Tools::getValue('id_category_to_move')); + $id_category_parent = (int)(Tools::getValue('id_category_parent')); + $way = (int)(Tools::getValue('way')); + $positions = Tools::getValue('category'); + if (is_array($positions)) + foreach ($positions AS $key => $value) + { + $pos = explode('_', $value); + if ((isset($pos[1]) AND isset($pos[2])) AND ($pos[1] == $id_category_parent AND $pos[2] == $id_category_to_move)) + { + $position = $key; + break; + } + } + $category = new Category($id_category_to_move); + if (Validate::isLoadedObject($category)) + { + if (isset($position) && $category->updatePosition($way, $position)) + { + Module::hookExec('categoryUpdate'); + die(true); + } + else + die('{"hasError" : true, errors : "Can not update categories position"}'); + } + else + die('{"hasError" : true, "errors" : "This category can not be loaded"}'); + +} + +if (array_key_exists('ajaxCMSCategoriesPositions', $_POST)) +{ + $id_cms_category_to_move = (int)(Tools::getValue('id_cms_category_to_move')); + $id_cms_category_parent = (int)(Tools::getValue('id_cms_category_parent')); + $way = (int)(Tools::getValue('way')); + $positions = Tools::getValue('cms_category'); + if (is_array($positions)) + foreach ($positions AS $key => $value) + { + $pos = explode('_', $value); + if ((isset($pos[1]) AND isset($pos[2])) AND ($pos[1] == $id_cms_category_parent AND $pos[2] == $id_cms_category_to_move)) + { + $position = $key; + break; + } + } + $cms_category = new CMSCategory($id_cms_category_to_move); + if (Validate::isLoadedObject($cms_category)) + { + if (isset($position) && $cms_category->updatePosition($way, $position)) + die(true); + else + die('{"hasError" : true, "errors" : "Can not update cms categories position"}'); + } + else + die('{"hasError" : true, "errors" : "This cms category can not be loaded"}'); +} + +if (array_key_exists('ajaxCMSPositions', $_POST)) +{ + $id_cms = (int)(Tools::getValue('id_cms')); + $id_category = (int)(Tools::getValue('id_cms_category')); + $way = (int)(Tools::getValue('way')); + $positions = Tools::getValue('cms'); + if (is_array($positions)) + foreach ($positions AS $key => $value) + { + $pos = explode('_', $value); + if ((isset($pos[1]) AND isset($pos[2])) AND ($pos[1] == $id_category AND $pos[2] == $id_cms)) + { + $position = $key; + break; + } + } + $cms = new CMS($id_cms); + if (Validate::isLoadedObject($cms)) + { + if (isset($position) && $cms->updatePosition($way, $position)) + die(true); + else + die('{"hasError" : true, "errors" : "Can not update cms position"}'); + } + else + die('{"hasError" : true, "errors" : "This cms can not be loaded"}'); +} + +/* Modify product position in catalog */ +if (array_key_exists('ajaxProductsPositions', $_POST)) +{ + $way = (int)(Tools::getValue('way')); + $id_product = (int)(Tools::getValue('id_product')); + $id_category = (int)(Tools::getValue('id_category')); + $positions = Tools::getValue('product'); + + if (is_array($positions)) + foreach ($positions AS $position => $value) + { + // pos[1] = id_categ, pos[2] = id_product, pos[3]=old position + $pos = explode('_', $value); + + if ((isset($pos[1]) AND isset($pos[2])) AND ($pos[1] == $id_category AND (int)$pos[2] === $id_product)) + { + if ($product = new Product((int)$pos[2])) + if (isset($position) && $product->updatePosition($way, $position)) + echo "ok position $position for product $pos[2]\r\n"; + else + echo '{"hasError" : true, "errors" : "Can not update product '. $id_product . ' to position '.$position.' "}'; + else + echo '{"hasError" : true, "errors" : "This product ('.$id_product.') can t be loaded"}'; + + break; + } + } +} + +if (isset($_GET['ajaxProductPackItems'])) +{ + $jsonArray = array(); + $products = Db::getInstance()->ExecuteS(' + SELECT p.`id_product`, pl.`name` + FROM `'._DB_PREFIX_.'product` p + NATURAL LEFT JOIN `'._DB_PREFIX_.'product_lang` pl + WHERE pl.`id_lang` = '.(int)(Tools::getValue('id_lang')).' + AND p.`id_product` NOT IN (SELECT DISTINCT id_product_pack FROM `'._DB_PREFIX_.'pack`) + AND p.`id_product` != '.(int)(Tools::getValue('id_product'))); + + foreach ($products AS $packItem) + $jsonArray[] = '{"value": "'.(int)($packItem['id_product']).'-'.addslashes($packItem['name']).'", "text":"'.(int)($packItem['id_product']).' - '.addslashes($packItem['name']).'"}'; + die('['.implode(',', $jsonArray).']'); +} + +if (isset($_GET['ajaxStates']) AND isset($_GET['id_country'])) +{ + $states = Db::getInstance()->ExecuteS(' + SELECT s.id_state, s.name + FROM '._DB_PREFIX_.'state s + LEFT JOIN '._DB_PREFIX_.'country c ON (s.`id_country` = c.`id_country`) + WHERE s.id_country = '.(int)(Tools::getValue('id_country')).' AND s.active = 1 AND c.`contains_states` = 1 + ORDER BY s.`name` ASC'); + + if (is_array($states) AND !empty($states)) + { + $list = ''; + if (Tools::getValue('no_empty') != true) + $list = ''."\n"; + + foreach ($states AS $state) + $list .= ''."\n"; + } + else + $list = 'false'; + + die($list); +} + +if (Tools::isSubmit('submitCustomerNote') AND $id_customer = (int)Tools::getValue('id_customer')) +{ + $note = html_entity_decode(Tools::getValue('note')); + if (!empty($note) AND !Validate::isCleanHtml($note)) + die ('error:validation'); + if (!Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'customer SET `note` = "'.pSQL($note, true).'" WHERE id_customer = '.(int)$id_customer.' LIMIT 1')) + die ('error:update'); + die('ok'); +} + +if (Tools::getValue('form_language_id')) +{ + if (!($cookie->employee_form_lang = (int)(Tools::getValue('form_language_id')))) + die ('Error while updating cookie.'); + die ('Form language updated.'); +} + +if (Tools::getValue('submitPublishProduct')) +{ + global $cookie; + + if (Tools::getIsset('id_product')) + { + $id_product = (int)(Tools::getValue('id_product')); + $id_tab_catalog = (int)(Tab::getIdFromClassName('AdminCatalog')); + $token = Tools::getAdminToken('AdminCatalog'.(int)($id_tab_catalog).(int)($cookie->id_employee)); + $bo_product_url = dirname($_SERVER['PHP_SELF']).'/index.php?tab=AdminCatalog&id_product='.$id_product.'&updateproduct&token='.$token; + + if (Tools::getValue('redirect')) + die($bo_product_url); + + $profileAccess = Profile::getProfileAccess((int)$cookie->profile, $id_tab_catalog); + if($profileAccess['edit']) + { + $product = new Product((int)(Tools::getValue('id_product'))); + if (!Validate::isLoadedObject($product)) + die('error: invalid id'); + + $product->active = 1; + + if ($product->save()) + die($bo_product_url); + else + die('error: saving'); + + } else { + die('error: permissions'); + } + } + else + die ('error: parameters'); +} + +if (Tools::getValue('submitPublishCMS')) +{ + global $cookie; + + if (Tools::getIsset('id_cms')) + { + $id_cms = (int)(Tools::getValue('id_cms')); + $id_tab_cms = (int)(Tab::getIdFromClassName('AdminCMSContent')); + $token = Tools::getAdminToken('AdminCMSContent'.(int)($id_tab_cms).(int)($cookie->id_employee)); + $bo_cms_url = dirname($_SERVER['PHP_SELF']).'/index.php?tab=AdminCMSContent&id_cms='.(int)$id_cms.'&updatecms&token='.$token; + + if (Tools::getValue('redirect')) + die($bo_cms_url); + + $profileAccess = Profile::getProfileAccess((int)$cookie->profile, $id_tab_cms); + if($profileAccess['edit']) + { + $cms = new CMS((int)(Tools::getValue('id_cms'))); + if (!Validate::isLoadedObject($cms)) + die('error: invalid id'); + + $cms->active = 1; + + if ($cms->save()) + die($bo_cms_url); + else + die('error: saving'); + + } else { + die('error: permissions'); + } + } + else + die ('error: parameters'); +} + +if (Tools::isSubmit('submitTrackClickOnHelp')) +{ + $label = Tools::getValue('label'); + $version = Tools::getValue('version'); + + if (!empty($label) && !empty($version)) + HelpAccess::trackClick($label, $version); +} + +if (Tools::isSubmit('saveImportMatchs')) +{ + $match = implode('|', Tools::getValue('type_value')); + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'import_match` ( + `id_import_match` , + `name` , + `match`, + `skip` + ) + VALUES ( + NULL , + \''.pSQL(Tools::getValue('newImportMatchs')).'\', + \''.pSQL($match).'\', + \''.pSQL(Tools::getValue('skip')).'\' + )'); + + die('{"id" : "'.Db::getInstance()->Insert_ID().'"}'); +} + +if (Tools::isSubmit('deleteImportMatchs')) +{ + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'import_match` WHERE id_import_match = '.pSQL(Tools::getValue('idImportMatchs'))); +} + +if (Tools::isSubmit('loadImportMatchs')) +{ + $return = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'import_match` WHERE id_import_match = '.pSQL(Tools::getValue('idImportMatchs'))); + die('{"id" : "'.$return[0]['id_import_match'].'", "matchs" : "'.$return[0]['match'].'", "skip" : "'.$return[0]['skip'].'"}'); +} + +if (Tools::isSubmit('toggleScreencast')) +{ + global $cookie; + $cookie->show_screencast = (int)(!(bool)$cookie->show_screencast); +} + +if (Tools::isSubmit('ajaxAddZipCode') OR Tools::isSubmit('ajaxRemoveZipCode')) +{ + $zipcodes = Tools::getValue('zipcodes'); + $id_county = (int)Tools::getValue('id_county'); + + $county = new County($id_county); + if (!Validate::isLoadedObject($county)) + die('error'); + + if (Tools::isSubmit('ajaxAddZipCode')) + { + if ($county->isZipCodeRangePresent($zipcodes)) + die('error:'.Tools::displayError('This Zip Code is already in use.')); + if ($county->addZipCodes($zipcodes)) + die(AdminCounty::renderZipCodeList($county->getZipCodes())); + } + else if (Tools::isSubmit('ajaxRemoveZipCode') AND $county->removeZipCodes($zipcodes)) + die(AdminCounty::renderZipCodeList($county->getZipCodes())); + + die('error'); +} + +if (Tools::isSubmit('helpAccess')) +{ + $item = Tools::getValue('item'); + $isoUser = Tools::getValue('isoUser'); + $country = Tools::getValue('country'); + $version = Tools::getValue('version'); + + if (isset($item) AND isset($isoUser) AND isset($country)) + die(HelpAccess::displayHelp($item, $isoUser, $country, $version)); + die(); +} + +if (Tools::isSubmit('getHookableList')) +{ + $modules_list = explode(',', Tools::getValue('modules_list')); + $hooks_list = explode(',', Tools::getValue('hooks_list')); + $hookableList = array(); + foreach ($modules_list as $module) + { + $module = trim($module); + if (!$module) + continue; + + $moduleInstance = Module::getInstanceByName($module); + foreach ($hooks_list as $hook_name) + { + $hook_name = trim($hook_name); + if (!$hook_name) + continue; + if (!array_key_exists($hook_name, $hookableList)) + $hookableList[$hook_name] = array(); + if ($moduleInstance->isHookableOn($hook_name)) + array_push($hookableList[$hook_name], $module); + } + + } + die(Tools::jsonEncode($hookableList)); +} + +if (Tools::isSubmit('getHookableModuleList')) +{ + + include('../init.php'); + $hook_name = Tools::getValue('hook'); + $hookableModulesList = array(); + $modules = Db::getInstance()->ExecuteS('SELECT id_module, name FROM `'._DB_PREFIX_.'module` '); + foreach ($modules as $module) + { + if (file_exists(_PS_MODULE_DIR_.$module['name'].'/'.$module['name'].'.php')) + { + include_once(_PS_MODULE_DIR_.$module['name'].'/'.$module['name'].'.php'); + $mod = new $module['name'](); + if ($mod->isHookableOn($hook_name)) + $hookableModulesList[] = array('id' => (int)$mod->id, 'name' => $mod->displayName, 'display' => Module::hookExec($hook_name, array(), (int)$mod->id)); + } + } + die(Tools::jsonEncode($hookableModulesList)); +} + +if (Tools::isSubmit('saveHook')) +{ + $hooks_list = explode(',', Tools::getValue('hooks_list')); + $id_shop = (int)Tools::getValue('id_shop'); + if ($id_shop) + { + $hookableList = array(); + foreach ($hooks_list as $hook) + { + $hook = trim($hook); + if (!$hook) + continue; + + $sql = 'DELETE FROM '._DB_PREFIX_.'hook_module + WHERE id_hook = (SELECT id_hook FROM '._DB_PREFIX_.'hook WHERE `name` = \''.pSQL($hook).'\' LIMIT 1) + AND id_shop = '.$id_shop; + Db::getInstance()->Execute($sql); + $hookedModules = explode(',', Tools::getValue($hook)); + $i = 1; + $value = ''; + foreach ($hookedModules as $module) + { + $ids = explode('_', $module); + $value .= '('.$ids[1].', '.$id_shop.', (SELECT id_hook FROM '._DB_PREFIX_.'hook WHERE `name` = \''.pSQL($hook).'\' LIMIT 1), '.$i.'),'; + $i++; + } + $value = rtrim($value, ','); + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'hook_module (id_module, id_shop, id_hook, position) VALUES '.$value); + + } + } + die('{"hasError" : false, "errors" : ""}'); +} + +if (Tools::isSubmit('getAdminHomeElement')) +{ + $result = array(); + + $protocol = (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http'; + $isoUser = Language::getIsoById(intval($cookie->id_lang)); + $isoCountry = Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT')); + $context = stream_context_create(array('http' => array('method'=>"GET", 'timeout' => 5))); + + // SCREENCAST + if (@fsockopen('www.prestashop.com', 80, $errno, $errst, 3)) + $result['screencast'] = 'OK'; + else + $result['screencast'] = 'NOK'; + + // PREACTIVATION + $content = @file_get_contents($protocol.'://www.prestashop.com/partner/preactivation/preactivation-block.php?version=1.0&shop='.urlencode(Configuration::get('PS_SHOP_NAME')).'&protocol='.$protocol.'&url='.urlencode($_SERVER['HTTP_HOST']).'&iso_country='.$isoCountry.'&iso_lang='.Tools::strtolower($isoUser).'&id_lang='.(int)$cookie->id_lang.'&email='.urlencode(Configuration::get('PS_SHOP_EMAIL')).'&date_creation='._PS_CREATION_DATE_.'&v='._PS_VERSION_.'&security='.md5(Configuration::get('PS_SHOP_EMAIL')._COOKIE_IV_), false, $context); + if (!$content) + $result['partner_preactivation'] = 'NOK'; + else + { + $content = explode('|', $content); + if ($content[0] == 'OK') + { + $result['partner_preactivation'] = $content[2]; + $content[1] = explode('#%#', $content[1]); + foreach ($content[1] as $partnerPopUp) + if ($partnerPopUp) + { + $partnerPopUp = explode('%%', $partnerPopUp); + if (!Configuration::get('PS_PREACTIVATION_'.strtoupper($partnerPopUp[0]))) + { + $result['partner_preactivation'] .= $partnerPopUp[1]; + Configuration::updateValue('PS_PREACTIVATION_'.strtoupper($partnerPopUp[0]), 'TRUE'); + } + } + } + else + $result['partner_preactivation'] = 'NOK'; + } + + // DISCOVER PRESTASHOP + $content = @file_get_contents($protocol.'://www.prestashop.com/partner/prestashop/prestashop-link.php?iso_country='.$isoCountry.'&iso_lang='.Tools::strtolower($isoUser).'&id_lang='.(int)$cookie->id_lang, false, $context); + if (!$content) + $result['discover_prestashop'] = 'NOK'; + else + { + $content = explode('|', $content); + if ($content[0] == 'OK') + $result['discover_prestashop'] = $content[1]; + else + $result['discover_prestashop'] = 'NOK'; + + if (@fsockopen('www.prestashop.com', 80, $errno, $errst, 3)) + $result['discover_prestashop'] .= ''; + + $content = @file_get_contents($protocol.'://www.prestashop.com/partner/paypal/paypal-tips.php?protocol='.$protocol.'&iso_country='.$isoCountry.'&iso_lang='.Tools::strtolower($isoUser).'&id_lang='.(int)$cookie->id_lang, false, $context); + $content = explode('|', $content); + if ($content[0] == 'OK') + $result['discover_prestashop'] .= $content[1]; + } + + die(Tools::jsonEncode($result)); +} + +if (Tools::isSubmit('getChildrenCategories') && Tools::getValue('id_category_parent')) +{ + $children_categories = Category::getChildrenWithNbSelectedSubCatForProduct(Tools::getValue('id_category_parent'), Tools::getValue('id_product', 0), Tools::getValue('post_selected_cat', null), $cookie->id_lang); + die(Tools::jsonEncode($children_categories)); +} + +if (Tools::isSubmit('updateProductImageShopAsso')) +{ + if ($id_image = (int)Tools::getValue('id_image') AND $id_shop = (int)Tools::getValue('id_shop')) + { + if ((int)Tools::getValue('active')) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'image_shop (`id_image`, `id_shop`) VALUES('.(int)$id_image.', '.(int)$id_shop.')'); + else + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'image_shop WHERE `id_image`='.(int)$id_image.' AND `id_shop`='.(int)$id_shop); + } +} diff --git a/admin-dev/ajax_category_list.php b/admin-dev/ajax_category_list.php new file mode 100755 index 000000000..a29196651 --- /dev/null +++ b/admin-dev/ajax_category_list.php @@ -0,0 +1,85 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + define('PS_ADMIN_DIR', getcwd()); + include_once('../config/config.inc.php'); + include_once('tabs/AdminCatalog.php'); + include_once('tabs/AdminProducts.php'); + include_once('init.php'); + + if (Tools::getValue('token') != Tools::getAdminTokenLite('AdminCatalog')) + die(1); + + $catalog = new AdminCatalog(); + $adminProducts = new AdminProducts(); + + global $cookie; + + echo ' + + + + + + + '.$adminProducts->getL('Catalog:').' + +
+ + + + + + + '; + $done = array(); + $index = array(); + + $categoryBox = Tools::getValue('categoryBox'); + if ($categoryBox != '') + { + $categoryBox = @unserialize($categoryBox); + foreach ($categoryBox AS $k => $row) + $index[] = $row; + } + elseif ((int)Tools::getValue('id_product')) + $index = Product::getProductCategories((int)Tools::getValue('id_product')); + $adminProducts->recurseCategoryForInclude((int)(Tools::getValue('id_product')), $index, $categories, $categories[0][1], 1, (int)(Tools::getValue('id_category_default'))); + echo '
'.$adminProducts->getL('ID').''.$adminProducts->getL('Name').'
+

'.$adminProducts->getL('Mark all checkbox(es) of categories in which product is to appear').' *

+
+ '; diff --git a/admin-dev/ajax_lang_packs.php b/admin-dev/ajax_lang_packs.php new file mode 100644 index 000000000..ca36f579e --- /dev/null +++ b/admin-dev/ajax_lang_packs.php @@ -0,0 +1,50 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_ADMIN_DIR', getcwd()); +include(PS_ADMIN_DIR.'/../config/config.inc.php'); +/* Getting cookie or logout */ +require_once(dirname(__FILE__).'/init.php'); + +if(!isset($_GET['iso_lang']) OR empty($_GET['iso_lang'])) + die('fail:0'); +if(!isset($_GET['ps_version']) OR empty($_GET['ps_version'])) + die('fail:0'); +if(@fsockopen('www.prestashop.com', 80)) +{ + // Get all iso code available + $lang_packs = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_language_pack.php?version='.(string)$_GET['ps_version'].'&iso_lang='.(string)$_GET['iso_lang']); + + if ($lang_packs !== '' && Tools::jsonDecode($lang_packs) !== NULL) + { + echo $lang_packs; + } + else + die('fail:2'); +} +else + die('offline'); diff --git a/admin-dev/ajax_products_list.php b/admin-dev/ajax_products_list.php new file mode 100644 index 000000000..ed1e7d758 --- /dev/null +++ b/admin-dev/ajax_products_list.php @@ -0,0 +1,67 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_ADMIN_DIR', getcwd()); +include(PS_ADMIN_DIR.'/../config/config.inc.php'); +/* Getting cookie or logout */ +require_once(dirname(__FILE__).'/init.php'); + +$query = Tools::getValue('q', false); +if (!$query OR $query == '' OR strlen($query) < 1) + die(); + +/* + * In the SQL request the "q" param is used entirely to match result in database. + * In this way if string:"(ref : #ref_pattern#)" is displayed on the return list, + * they are no return values just because string:"(ref : #ref_pattern#)" + * is not write in the name field of the product. + * So the ref pattern will be cut for the search request. + */ +if($pos = strpos($query, ' (ref:')) + $query = substr($query, 0, $pos); + +$excludeIds = Tools::getValue('excludeIds', false); +if ($excludeIds && $excludeIds != 'NaN') + $excludeIds = implode(',', array_map('intval', explode(',', $excludeIds))); +else + $excludeIds = ''; + +// Excluding downloadable products from packs because download from pack is not supported +$excludeVirtuals = (bool)Tools::getValue('excludeVirtuals', false); + +$items = Db::getInstance()->ExecuteS(' +SELECT p.`id_product`, `reference`, pl.name +FROM `'._DB_PREFIX_.'product` p +LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.id_product = p.id_product) +WHERE (pl.name LIKE \'%'.pSQL($query).'%\' OR p.reference LIKE \'%'.pSQL($query).'%\') AND pl.id_lang = '.(int)($cookie->id_lang). +(!empty($excludeIds) ? ' AND p.id_product NOT IN ('.$excludeIds.') ' : ' '). +($excludeVirtuals ? 'AND p.id_product NOT IN (SELECT pd.id_product FROM `'._DB_PREFIX_.'product_download` pd WHERE (pd.id_product = p.id_product))' : '')); + +if ($items) + foreach ($items AS $item) + echo trim($item['name']).(!empty($item['reference']) ? ' (ref: '.$item['reference'].')' : '').'|'.(int)($item['id_product'])."\n"; + diff --git a/admin-dev/ajax_send_mail_test.php b/admin-dev/ajax_send_mail_test.php new file mode 100644 index 000000000..225ec082f --- /dev/null +++ b/admin-dev/ajax_send_mail_test.php @@ -0,0 +1,47 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../config/config.inc.php'); + +/* Getting cookie or logout */ +require_once(dirname(__FILE__).'/init.php'); + +$smtpChecked = (trim($_GET['mailMethod']) == 'smtp'); +$smtpServer = $_GET['smtpSrv']; +$content = $_GET['testMsg']; +$subject = $_GET['testSubject']; +$type = 'text/html'; +$to = $_GET['testEmail']; +$from = Configuration::get('PS_SHOP_EMAIL'); +$smtpLogin = $_GET['smtpLogin']; +$smtpPassword = $_GET['smtpPassword']; +$smtpPort = $_GET['smtpPort']; +$smtpEncryption = $_GET['smtpEnc']; + +$result = Mail::sendMailTest(Tools::htmlentitiesUTF8($smtpChecked), Tools::htmlentitiesUTF8($smtpServer), Tools::htmlentitiesUTF8($content), Tools::htmlentitiesUTF8($subject), Tools::htmlentitiesUTF8($type), Tools::htmlentitiesUTF8($to), Tools::htmlentitiesUTF8($from), Tools::htmlentitiesUTF8($smtpLogin), Tools::htmlentitiesUTF8($smtpPassword), Tools::htmlentitiesUTF8($smtpPort), Tools::htmlentitiesUTF8($smtpEncryption)); +die($result ? 'ok' : 'fail'); + diff --git a/admin-dev/ajaxfilemanager/_ajax_get_details_listing.php b/admin-dev/ajaxfilemanager/_ajax_get_details_listing.php new file mode 100755 index 000000000..8e049eac7 --- /dev/null +++ b/admin-dev/ajaxfilemanager/_ajax_get_details_listing.php @@ -0,0 +1,54 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  
  /> +   
 /> +   >">  
+
\ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/_ajax_get_thumbnail_listing.php b/admin-dev/ajaxfilemanager/_ajax_get_thumbnail_listing.php new file mode 100755 index 000000000..221d10f33 --- /dev/null +++ b/admin-dev/ajaxfilemanager/_ajax_get_thumbnail_listing.php @@ -0,0 +1,37 @@ +
+ +
+
+ '; + echo '' . "\n"; + break; + case 'fileFlash': + case 'fileVideo': + case 'fileMusic': + break; + default: + echo ' '; + } + ?> + +
+
  class="radio" value="" /> + href="" title="" id="a">
+ +
+ +
\ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/_ajax_load_folders.php b/admin-dev/ajaxfilemanager/_ajax_load_folders.php new file mode 100755 index 000000000..6017ac47f --- /dev/null +++ b/admin-dev/ajaxfilemanager/_ajax_load_folders.php @@ -0,0 +1,17 @@ + + \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_create_folder.php b/admin-dev/ajaxfilemanager/ajax_create_folder.php new file mode 100755 index 000000000..ad3d5eea1 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_create_folder.php @@ -0,0 +1,75 @@ +mkdir(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder'], 0775)) + { + include_once(CLASS_MANAGER); + $manager = new manager(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder'], false); + $pathInfo = $manager->getFolderInfo(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder']); + foreach($pathInfo as $k=>$v) + { + switch ($k) + { + + + case "ctime"; + case "mtime": + case "atime": + $v = date(DATE_TIME_FORMAT, $v); + break; + case 'name': + $info .= sprintf(", %s:'%s'", 'short_name', shortenFileName($v)); + break; + case 'cssClass': + $v = 'folderEmpty'; + break; + } + $info .= sprintf(", %s:'%s'", $k, $v); + } + }else + { + $error = ERR_FOLDER_CREATION_FAILED; + } + //$error = "For security reason, folder creation function has been disabled."; + } + echo "error:'" . $error . "'"; + echo $info; + echo "}"; +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_delete_file.php b/admin-dev/ajaxfilemanager/ajax_delete_file.php new file mode 100755 index 000000000..be52c2c99 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_delete_file.php @@ -0,0 +1,79 @@ +delete(addTrailingSlash(backslashToSlash($_GET['delete']))); + }elseif(is_file($_GET['delete']) + && isValidPattern(CONFIG_SYS_INC_FILE_PATTERN, getBaseName($_GET['delete'])) + && !isInvalidPattern(CONFIG_SYS_EXC_FILE_PATTERN, getBaseName($_GET['delete'])) + ) + { + $file->delete(($_GET['delete'])); + } + } + }else + { + if(!isset($_POST['selectedDoc']) || !is_array($_POST['selectedDoc']) || sizeof($_POST['selectedDoc']) < 1) + { + $error = ERR_NOT_FILE_SELECTED; + } + else + { + + include_once(CLASS_FILE); + $file = new file(); + + foreach($_POST['selectedDoc'] as $doc) + { + if(file_exists($doc) && isUnderRoot($doc)) + { + if(is_dir($doc) + && isValidPattern(CONFIG_SYS_INC_DIR_PATTERN, $doc) + && !isInvalidPattern(CONFIG_SYS_EXC_DIR_PATTERN, $doc)) + { + $file->delete(addTrailingSlash(backslashToSlash($doc))); + }elseif(is_file($doc) + && isValidPattern(CONFIG_SYS_INC_FILE_PATTERN, $doc) + && !isInvalidPattern(CONFIG_SYS_EXC_FILE_PATTERN, $doc) + ) + { + $file->delete($doc); + } + } + + + } + } + } + + echo "{error:'" . $error . "'}"; +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_download.php b/admin-dev/ajaxfilemanager/ajax_download.php new file mode 100755 index 000000000..ec054a846 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_download.php @@ -0,0 +1,33 @@ + getMemoryLimit()) + {//larger then the php memory limit, redirect to the file + + header('Location: ' . $path); + exit; + }else + {//open it up and send out with php + downloadFile($path); + + } + }else + { + die(ERR_DOWNLOAD_FILE_NOT_FOUND); + } +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_editor_reset.php b/admin-dev/ajaxfilemanager/ajax_editor_reset.php new file mode 100755 index 000000000..ba210e6a9 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_editor_reset.php @@ -0,0 +1,118 @@ +loadImage($_POST['path']); + + switch($_POST['mode']) + { + case "resize": + if(!$image->resize($_POST['width'], $_POST['height'], (!empty($_POST['constraint'])?true:false))) + { + $error = IMG_SAVE_RESIZE_FAILED; + } + break; + case "crop": + if(!$image->cropToDimensions($_POST['x'], $_POST['y'], (int)($_POST['x']) + (int)($_POST['width']), (int)($_POST['y']) + (int)($_POST['height']))) + { + $error = IMG_SAVE_CROP_FAILED; + } + + break; + case "flip": + if(!$image->flip($_POST['flip_angle'])) + { + $error = IMG_SAVE_FLIP_FAILED; + } + break; + case "rotate": + if(!$image->rotate((int)($_POST['angle']))) + { + $error = IMG_SAVE_ROTATE_FAILED; + } + break; + default: + $error = IMG_SAVE_UNKNOWN_MODE; + } + if(empty($error)) + { + + $sessionNewPath = $session->getSessionDir() . uniqid(md5(time())) . "." . getFileExt($_POST['path']); + if(!@copy($_POST['path'], $sessionNewPath)) + { + $error = IMG_SAVE_BACKUP_FAILED; + }else + { + addSessionHistory($_POST['path'], $sessionNewPath); + if($image->saveImage($_POST['path'])) + { + $imageInfo = $image->getFinalImageInfo(); + $info .= ",width:" . $imageInfo['width'] . "\n"; + $info .= ",height:" . $imageInfo['height'] . "\n"; + $info .= ",size:'" . transformFileSize($imageInfo['size']) . "'\n"; + }else + { + $error = IMG_SAVE_FAILED; + } + } + }else + { + //$image->DestroyImages(); + } + }else + { + $error = IMG_SAVE_UNKNOWN_MODE; + } + } + + echo "error:'" . $error . "'\n"; + if(isset($image) && is_object($image)) + { + $image->DestroyImages(); + } + echo $info; + echo ",history:" . sizeof($_SESSION[$_POST['path']]) . "\n"; + echo "}"; +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_file_copy.php b/admin-dev/ajaxfilemanager/ajax_file_copy.php new file mode 100755 index 000000000..99b19ab64 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_file_copy.php @@ -0,0 +1,35 @@ +setAction($_POST['action_value']); + $sessionAction->setFolder($_POST['currentFolderPath']); + $sessionAction->set($_POST['selectedDoc']); + $info = ',num:' . sizeof($_POST['selectedDoc']); + } + echo "{error:'" . $error . "'\n" . $info . "}"; +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_file_cut.php b/admin-dev/ajaxfilemanager/ajax_file_cut.php new file mode 100755 index 000000000..07a7f5574 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_file_cut.php @@ -0,0 +1,36 @@ +setAction($_POST['action_value']); + $sessionAction->setFolder($_POST['currentFolderPath']); + $sessionAction->set($_POST['selectedDoc']); + $info = ',num:' . sizeof($_POST['selectedDoc']); + } + echo "{error:'" . $error . "'\n" . $info . "}"; +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_file_paste.php b/admin-dev/ajaxfilemanager/ajax_file_paste.php new file mode 100755 index 000000000..787626267 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_file_paste.php @@ -0,0 +1,140 @@ +setSessionAction($sessionAction); + $selectedDocuments = $sessionAction->get(); + + $destFolderPath = addTrailingSlash(backslashToSlash($_GET['current_folder_path'])); + + + if(sizeof($selectedDocuments)) + { + //get all files within the destination folder + $allDocs = array(); + if(($fh = @opendir($_GET['current_folder_path']))) + { + while(($file = readdir($fh)) && $file != '.' && $file != '..') + { + $allDocs[] = getRealPath($destFolderPath . $file); + } + } + closedir($fh); + include_once(CLASS_FILE); + $file = new file(); + //check if all files are allowed to cut or copy + + foreach($selectedDocuments as $doc) + { + if(file_exists($doc) && isUnderRoot($doc) ) + { + + if( array_search(getRealPath($doc), $allDocs) === false || CONFIG_OVERWRITTEN) + { + if(CONFIG_OVERWRITTEN) + { + $file->delete($doc); + } + if($file->copyTo($doc, $_GET['current_folder_path'])) + { + + $finalPath = $destFolderPath . basename($doc); + $objFile = new file($finalPath); + $tem = $objFile->getFileInfo(); + $obj = new manager($finalPath, false); + + $fileType = $obj->getFileType($finalPath, (is_dir($finalPath)?true:false)); + + foreach($fileType as $k=>$v) + { + $tem[$k] = $v; + } + +/* foreach ($folderInfo as $k=>$v) + { + $tem['i_' . $k] = $v; + } + if($folderInfo['type'] == 'folder' && empty($folderInfo['subdir']) && empty($folderInfo['file'])) + { + $tem['cssClass'] = 'folderEmpty'; + }*/ + + $tem['final_path'] = $finalPath; + $tem['path'] = backslashToSlash($finalPath); + $tem['type'] = (is_dir($finalPath)?'folder':'file'); + $tem['size'] = @transformFileSize($tem['size']); + $tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']); + $tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']); + $tem['flag'] = 'noFlag'; + $tem['url'] = getFileUrl($doc); + + $manager = null; + if($sessionAction->getAction() == "cut") + { + $file->delete($doc); + } + $fileMoved[sizeof($fileMoved)] = $tem; + $tem = null; + } + }else + { + $unmovedDocDueToSamePath[] = $doc; + } + + } + } + + $sessionAction->set(array()); + } + if(sizeof($unmovedDocDueToSamePath) == sizeof($selectedDocuments)) + { + $error = ERR_DEST_FOLDER_NOT_ALLOWED; + }elseif(sizeof($unmovedDocDueToSamePath)) + { + foreach($unmovedDocDueToSamePath as $v) + { + $error .= sprintf(ERR_UNABLE_TO_MOVE_TO_SAME_DEST, $v) . "\r\n"; + } + } + } + + echo "{'error':'" . $error . "', 'unmoved_files':" . sizeof($unmovedDocDueToSamePath) . ", 'files':{"; + foreach($fileMoved as $i=>$file) + { + + echo ($i>0?', ':' ') . $i . ": { "; + $j = 0; + foreach($file as $k=>$v) + { + echo ($j++ > 0? ", ":'') . "'" . $k . "':'" . $v . "'"; + + } + echo "} "; + } + echo "} }"; + +?> diff --git a/admin-dev/ajaxfilemanager/ajax_file_upload.php b/admin-dev/ajaxfilemanager/ajax_file_upload.php new file mode 100755 index 000000000..ebe128482 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_file_upload.php @@ -0,0 +1,90 @@ +setInvalidFileExt(explode(",", CONFIG_UPLOAD_INVALID_EXTS)); + if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_UPLOAD) + { + $error = SYS_DISABLED; + } + elseif(empty($_GET['folder']) || !isUnderRoot($_GET['folder'])) + { + $error = ERR_FOLDER_PATH_NOT_ALLOWED; + }else if(!$upload->isFileUploaded('file')) + { + $error = ERR_FILE_NOT_UPLOADED; + }else if(!$upload->moveUploadedFile($_GET['folder'])) + { + $error = ERR_FILE_MOVE_FAILED; + } + elseif(!$upload->isPermittedFileExt(explode(",", CONFIG_UPLOAD_VALID_EXTS))) + { + $error = ERR_FILE_TYPE_NOT_ALLOWED; + }elseif(defined('CONFIG_UPLOAD_MAXSIZE') && CONFIG_UPLOAD_MAXSIZE && $upload->isSizeTooBig(CONFIG_UPLOAD_MAXSIZE)) + { + $error = sprintf(ERROR_FILE_TOO_BID, transformFileSize(CONFIG_UPLOAD_MAXSIZE)); + }else + { + include_once(CLASS_FILE); + $path = $upload->getFilePath(); + $obj = new file($path); + $tem = $obj->getFileInfo(); + if(sizeof($tem)) + { + include_once(CLASS_MANAGER); + + $manager = new manager($upload->getFilePath(), false); + + $fileType = $manager->getFileType($upload->getFileName()); + + foreach($fileType as $k=>$v) + { + $tem[$k] = $v; + } + + $tem['path'] = backslashToSlash($path); + $tem['type'] = "file"; + $tem['size'] = transformFileSize($tem['size']); + $tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']); + $tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']); + $tem['short_name'] = shortenFileName($tem['name']); + $tem['flag'] = 'noFlag'; + $obj->close(); + foreach($tem as $k=>$v) + { + $info .= sprintf(", %s:'%s'", $k, $v); + } + + $info .= sprintf(", url:'%s'", getFileUrl($path)); + $info .= sprintf(", tipedit:'%s'", TIP_DOC_RENAME); + + + }else + { + $error = ERR_FILE_NOT_AVAILABLE; + } + + + } + echo "error:'" . $error . "'"; + echo $info; + echo "}"; + +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_get_file_listing.php b/admin-dev/ajaxfilemanager/ajax_get_file_listing.php new file mode 100755 index 000000000..05f46af93 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_get_file_listing.php @@ -0,0 +1,139 @@ +addSearchKeyword('recursive', @$_GET['search_recursively']); + $search->addSearchKeyword('mtime_from', @$_GET['search_mtime_from']); + $search->addSearchKeyword('mtime_to', @$_GET['search_mtime_to']); + $search->addSearchKeyword('size_from', @$_GET['search_size_from']); + $search->addSearchKeyword('size_to', @$_GET['search_size_to']); + $search->addSearchKeyword('recursive', @$_GET['search_recursively']); + $search->addSearchKeyword('name', @$_GET['search_name']); + $search->doSearch(); + $fileList = $search->getFoundFiles(); + $folderInfo = $search->getRootFolderInfo(); + + }else + { + include_once(CLASS_MANAGER); + include_once(CLASS_SESSION_ACTION); + $sessionAction = new SessionAction(); + include_once(DIR_AJAX_INC . "class.manager.php"); + + $manager = new manager(); + $manager->setSessionAction($sessionAction); + + $fileList = $manager->getFileList(); + $folderInfo = $manager->getFolderInfo(); + + } + $pagination->setUrl(CONFIG_URL_FILEnIMAGE_MANAGER); + + }else + { + include_once(CLASS_PAGINATION); + $pagination = new pagination(false); + } + + + $pagination->setTotal(sizeof($fileList)); + $pagination->setFirstText(PAGINATION_FIRST); + $pagination->setPreviousText(PAGINATION_PREVIOUS); + $pagination->setNextText(PAGINATION_NEXT); + $pagination->setLastText(PAGINATION_LAST); + $pagination->setLimit(!empty($_GET['limit'])?(int)($_GET['limit']):CONFIG_DEFAULT_PAGINATION_LIMIT); + echo $pagination->getPaginationHTML(); + echo "\n"; + if(!empty($_GET['view'])) + { + switch($_GET['view']) + { + case 'detail': + case 'thumbnail': + case 'text': + $view = $_GET['view']; + break; + default: + $view = CONFIG_DEFAULT_VIEW; + } + }else + { + $view = CONFIG_DEFAULT_VIEW; + } + switch($view) + { + case 'text': + //list file name only + include_once(DIR_AJAX_ROOT . '_ajax_get_text_listing.php'); + break; + case 'thumbnail': + //list file with thumbnail + include_once(DIR_AJAX_ROOT . '_ajax_get_thumbnail_listing.php'); + break; + case 'detail': + default: + include_once(DIR_AJAX_ROOT . '_ajax_get_details_listing.php'); + } + + + +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_get_folder_listing.php b/admin-dev/ajaxfilemanager/ajax_get_folder_listing.php new file mode 100755 index 000000000..565703ad9 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_get_folder_listing.php @@ -0,0 +1,15 @@ +$v) + { + + + echo (($count > 1)?', ':''). "'" . $v . "':'" . $k . "'"; + $count++; + } + echo "}"; +?> diff --git a/admin-dev/ajaxfilemanager/ajax_image_editor.php b/admin-dev/ajaxfilemanager/ajax_image_editor.php new file mode 100755 index 000000000..b959bbdc2 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_image_editor.php @@ -0,0 +1,210 @@ +gc(); + $_GET['path'] = empty($_GET['path'])?CONFIG_SYS_ROOT_PATH . "ajax_image_editor_demo.jpg":$_GET['path']; + if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']) && isUnderRoot($_GET['path'])) + { + $path = $_GET['path']; + }else + { + die(IMG_GEN_IMG_NOT_EXISTS); + } + require_once(CLASS_HISTORY); + $history = new History($path, $session); + if(CONFIG_SYS_DEMO_ENABLE) + { + $sessionImageInfo = $history->getLastestRestorable(); + $originalSessionImageInfo = $history->getOriginalImage(); + if(sizeof($originalSessionImageInfo)) + { + $path = backslashToSlash($session->getSessionDir() . $originalSessionImageInfo['info']['name']); + } + } + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "class.image.php"); + $image = new Image(); + + $imageInfo = $image->getImageInfo($path); + + ?> + + + + + + + + + + + + + + + + + + +Ajax Image Editor + + + +
+
+ Modes +
+ + +

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

+
+
+
+ +
+

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

+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + + diff --git a/admin-dev/ajaxfilemanager/ajax_image_save.php b/admin-dev/ajaxfilemanager/ajax_image_save.php new file mode 100755 index 000000000..9c4de2fac --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_image_save.php @@ -0,0 +1,196 @@ +getSessionDir()) == '') + { + $error = SESSION_PERSONAL_DIR_NOT_FOUND; + } + else + { + require_once(CLASS_HISTORY); + $history = new History($_POST['path'], $session); + if(!empty($_POST['mode'])) + { + //get the original image which is the lastest session image if any when the system is in demo + $lastestSessionImageInfo = $history->getLastestRestorable(); + if(sizeof($lastestSessionImageInfo) && CONFIG_SYS_DEMO_ENABLE) + { + $originalSessionImageInfo = $history->getOriginalImage(); + if(sizeof($originalSessionImageInfo)) + { + $originalImage = $sessionDir . $originalSessionImageInfo['info']['name']; + } + } + if(empty($originalImage)) + { + $originalImage = $_POST['path']; + } + + include_once(CLASS_IMAGE); + $image = new Image(); + if($image->loadImage($originalImage)) + { + + switch($_POST['mode']) + { + case "resize": + if(!$image->resize($_POST['width'], $_POST['height'], (!empty($_POST['constraint'])?true:false))) + { + $error = IMG_SAVE_RESIZE_FAILED; + } + break; + case "crop": + if(!$image->crop($_POST['x'], $_POST['y'], $_POST['width'], $_POST['height'])) + { + $error = IMG_SAVE_CROP_FAILED; + } + break; + case "flip": + if(!$image->flip($_POST['flip_angle'])) + { + $error = IMG_SAVE_FLIP_FAILED; + } + break; + case "rotate": + + if(!$image->rotate((int)($_POST['angle']))) + { + $error = IMG_SAVE_ROTATE_FAILED; + } + + break; + default: + $error = IMG_SAVE_UNKNOWN_MODE; + } + + + if(empty($error)) + { + $sessionNewPath = $sessionDir . uniqid(md5(time())) . "." . getFileExt($_POST['path']); + if(!@copy($originalImage, $sessionNewPath)) + {//keep a copy under the session folder + $error = IMG_SAVE_BACKUP_FAILED; + }else + { + + $isSaveAsRequest = (!empty($_POST['new_name']) && !empty($_POST['save_to'])?true:false); + //save the modified image + $sessionImageInfo = array('name'=>basename($sessionNewPath), 'restorable'=>1); + $history->add($sessionImageInfo); + if(CONFIG_SYS_DEMO_ENABLE) + {//demo only + if(isset($originalSessionImageInfo) && sizeof($originalSessionImageInfo)) + { + $imagePath = $sessionDir . $originalSessionImageInfo['info']['name']; + }else + { + $imagePath = $sessionDir . uniqid(md5(time())) . "." . getFileExt($_POST['path']); + } + }else + { + if($isSaveAsRequest) + {//save as request + //check save to folder if exists + $imagePath = addTrailingSlash(backslashToSlash($_POST['save_to'])) . $_POST['new_name'] . "." . getFileExt($_POST['path']); + if(!file_exists($_POST['save_to']) || !is_dir($_POST['save_to'])) + { + $error = IMG_SAVE_AS_FOLDER_NOT_FOUND; + }elseif(file_exists($imagePath)) + { + $error = IMG_SAVE_AS_NEW_IMAGE_EXISTS; + }elseif(!preg_match("/^[a-zA-Z0-9_\- ]+$/", $_POST['new_name'])) + { + $error = IMG_SAVE_AS_ERR_NAME_INVALID; + } + + }else + {//save request + $imagePath = $originalImage; + } + + } + + if($image->saveImage($imagePath)) + { + + if(CONFIG_SYS_DEMO_ENABLE) + { + if(!isset($originalSessionImageInfo) || !sizeof($originalSessionImageInfo)) + {//keep this original image information on session for future reference if demo only + $originalSessionImageInfo = array('name'=>basename($imagePath), 'restorable'=>0, 'is_original'=>1); + $history->add($originalSessionImageInfo); + } + } + $imageInfo = $image->getFinalImageInfo(); + }else + { + $error = IMG_SAVE_FAILED; + + } + if(isset($imageInfo)) + { + $info .= ",width:" . $imageInfo['width'] . ""; + $info .= ",height:" . $imageInfo['height'] . ""; + $info .= ",size:'" . transformFileSize($imageInfo['size']) . "'"; + if($isSaveAsRequest) + { + $info .= ",save_as:'1'"; + }else + { + $info .= ",save_as:'0'"; + } + $info .= ",folder_path:'" . dirname($imagePath) . "'"; + $info .= ",path:'" . backslashToSlash($imagePath) . "'"; + + } + + } + + } + }else + { + $error = IMG_SAVE_IMG_OPEN_FAILED; + } + + }else + { + $error = IMG_SAVE_UNKNOWN_MODE; + } + } + echo "{"; + echo "error:'" . $error . "'"; + if(isset($image) && is_object($image)) + { + $image->DestroyImages(); + } + echo $info; + echo ",history:" . (isset($history) && is_object($history)?($history->getNumRestorable()):0) . ""; + echo "}"; + + +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_image_thumbnail.php b/admin-dev/ajaxfilemanager/ajax_image_thumbnail.php new file mode 100755 index 000000000..ac32a2314 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_image_thumbnail.php @@ -0,0 +1,35 @@ +loadImage($_GET['path'])) + { + if($image->resize(CONFIG_IMG_THUMBNAIL_MAX_X, CONFIG_IMG_THUMBNAIL_MAX_Y, true, true)) + { + $image->showImage(); + }else + { + echo PREVIEW_NOT_PREVIEW . "."; + } + }else + { + echo PREVIEW_NOT_PREVIEW . ".."; + } + + + }else + { + echo PREVIEW_NOT_PREVIEW . "..."; + } + diff --git a/admin-dev/ajaxfilemanager/ajax_image_undo.php b/admin-dev/ajaxfilemanager/ajax_image_undo.php new file mode 100755 index 000000000..ae813a5f8 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_image_undo.php @@ -0,0 +1,96 @@ +getLastestRestorable(); + echo "{"; + $error = ""; + $info = ""; + if(CONFIG_SYS_VIEW_ONLY) + { + $error = SYS_DISABLED; + } + elseif(empty($_POST['file_path'])) + { + $error = IMG_SAVE_EMPTY_PATH; + }elseif(!file_exists($_POST['file_path'])) + { + $error = IMG_SAVE_NOT_EXISTS; + }elseif(!isUnderRoot($_POST['file_path'])) + { + $error = IMG_SAVE_PATH_DISALLOWED; + }else if(!sizeof($lastestSessionImageInfo)) + { + $error = IMG_UNDO_NO_HISTORY_AVAIALBE; + } + else + { + //get the original image which is the lastest session image if any when the system is in demo + $sessionImage = $session->getSessionDir() . $lastestSessionImageInfo['name']; + $originalSessionImageInfo = $history->getOriginalImage(); + if(CONFIG_SYS_DEMO_ENABLE && sizeof($originalSessionImageInfo)) + { + $originalImage = $session->getSessionDir() . $originalSessionImageInfo['info']['name']; + }else + { + $originalImage = $_POST['file_path']; + } + + include_once(CLASS_IMAGE); + $image = new Image(); + if($image->loadImage($sessionImage)) + { + $imageInfo = $image->getOriginalImageInfo(); + if(!@copy($sessionImage, $originalImage)) + { + $error = IMG_UNDO_COPY_FAILED; + }else + { + + //remove the session image + if(@unlink($sessionImage)) + { + $history->restore(); + } + //only one left, remove the session original if demo + + if($history->getNumRestorable() == 0 && CONFIG_SYS_DEMO_ENABLE && sizeof($originalSessionImageInfo)) + { + @unlink($session->getSessionDir() . $originalSessionImageInfo['info']['name']); + $originalImage = $_POST['file_path']; + } + } + $imagePath = $originalImage; + + }else + { + $error = IMG_SAVE_IMG_OPEN_FAILED; + } + if(isset($imageInfo)) + { + $info .= ",width:" . $imageInfo['width'] . "\n"; + $info .= ",height:" . $imageInfo['height'] . "\n"; + $info .= ",size:'" . transformFileSize($imageInfo['size']) . "'\n"; + $info .= ",path:'" . backslashToSlash($imagePath) . "'\n"; + } + + } + + echo "error:'" . $error . "'\n"; + if(isset($image) && is_object($image)) + { + $image->DestroyImages(); + } + echo $info; + echo ",history:" . ($history->getNumRestorable()) . "\n"; + echo "}"; +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_login.php b/admin-dev/ajaxfilemanager/ajax_login.php new file mode 100755 index 000000000..74a09ee84 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_login.php @@ -0,0 +1,67 @@ +login()) + { + header('Location: ' . appendQueryString(CONFIG_URL_HOME, makeQueryString())); + exit; + } + } +}else{ + $_SESSION['ajax_user'] = true; + header('Location: ' . appendQueryString(CONFIG_URL_HOME, makeQueryString())); + exit; +} +?> + + + + + +<?php echo LOGIN_PAGE_TITLE; ?> + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
 
+
+
+
+ + diff --git a/admin-dev/ajaxfilemanager/ajax_preview.php b/admin-dev/ajaxfilemanager/ajax_preview.php new file mode 100755 index 000000000..e233a214f --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_preview.php @@ -0,0 +1,60 @@ +getFileType(basename($_GET['path'])); + if($fileTypes['preview']) + { + switch($fileTypes['fileType']) + { + case "image": + $imageInfo = @getimagesize($_GET['path']); + if(!empty($imageInfo[0]) && !empty($imageInfo[1])) + { + $thumInfo = getThumbWidthHeight($imageInfo[0], $imageInfo[1], 400, 135); + printf("", getFileUrl($_GET['path']), $thumInfo['width'], $thumInfo['height']); + + }else + { + echo PREVIEW_IMAGE_LOAD_FAILED; + } + + break; + case "txt": + if(($fp = @fopen($_GET['path'], 'r'))) + { + echo @fread($fp, @filesize($_GET['path'])); + @fclose($fp); + }else + { + echo PREVIEW_OPEN_FAILED . "."; + } + break; + + case "video": + break; + } + }else + { + echo PREVIEW_NOT_PREVIEW . ".."; + } + + }else + { + echo PREVIEW_NOT_PREVIEW . "..."; + } + +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_save_as_form.php b/admin-dev/ajaxfilemanager/ajax_save_as_form.php new file mode 100755 index 000000000..8ad17406b --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_save_as_form.php @@ -0,0 +1,59 @@ + + + + + +Untitled Document + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
  + + * + +
 
+ + diff --git a/admin-dev/ajaxfilemanager/ajax_save_name.php b/admin-dev/ajaxfilemanager/ajax_save_name.php new file mode 100755 index 000000000..c0435bad9 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_save_name.php @@ -0,0 +1,81 @@ +get(); + if(removeTrailingSlash($sessionAction->getFolder()) == getParentPath($_POST['original_path']) && sizeof($selectedDocuments)) + { + if(($key = array_search(basename($_POST['original_path']), $selectedDocuments)) !== false) + { + $selectedDocuments[$key] = $_POST['name']; + $sessionAction->set($selectedDocuments); + + } + + }elseif(removeTrailingSlash($sessionAction->getFolder()) == removeTrailingSlash($_POST['original_path'])) + { + $sessionAction->setFolder($_POST['original_path']); + } + $path = addTrailingSlash(getParentPath($_POST['original_path'])) . $_POST['name']; + if(is_file($path)) + { + include_once(CLASS_FILE); + $file = new file($path); + $fileInfo = $file->getFileInfo(); + }else + { + include_once(CLASS_MANAGER); + $manager = new manager($path, false); + $fileInfo = $manager->getFolderInfo(); + } + } + + echo "{"; + echo "error:'" . $error . "' "; + foreach ($fileInfo as $k=>$v) + { + echo "," . $k . ":'" . $v . "' "; + } + echo "}"; + + +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_save_text.php b/admin-dev/ajaxfilemanager/ajax_save_text.php new file mode 100755 index 000000000..1d7724c4e --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_save_text.php @@ -0,0 +1,90 @@ + \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/ajax_text_editor.php b/admin-dev/ajaxfilemanager/ajax_text_editor.php new file mode 100755 index 000000000..16b91045b --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajax_text_editor.php @@ -0,0 +1,168 @@ +gc(); + $_GET['path'] = empty($_GET['path'])?CONFIG_SYS_ROOT_PATH . "ajax_image_editor_demo.jpg":$_GET['path']; + if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']) && isUnderRoot($_GET['path'])) + { + $path = $_GET['path']; + }else + { + die(TXT_FILE_NOT_FOUND); + } + if(file_exists(DIR_AJAX_EDIT_AREA . "reg_syntax" . DIRECTORY_SEPARATOR . getFileExt($path) . ".js")) + { + $syntax = getFileExt($path); + }else + { + switch (getFileExt($path)) + { + case 'htm': + $syntax = 'html'; + break; + default: + $syntax = 'basic'; + } + } + if(array_search(getFileExt($path), getValidTextEditorExts())=== false) + { + die(TXT_DISALLOWED_EXT); + } + ?> + + + + + + + + + + + + + +Ajax Text Editor + + + +
+ +
+
+ + + + diff --git a/admin-dev/ajaxfilemanager/ajaxfilemanager.php b/admin-dev/ajaxfilemanager/ajaxfilemanager.php new file mode 100755 index 000000000..d7ec72663 --- /dev/null +++ b/admin-dev/ajaxfilemanager/ajaxfilemanager.php @@ -0,0 +1,689 @@ +gc(); + require_once(CLASS_SESSION_ACTION); + $sessionAction = new SessionAction(); + if(CONFIG_LOAD_DOC_LATTER) + { + $fileList = array(); + $folderInfo = array('path'=>getCurrentFolderPath()); + }else + { + require_once(CLASS_MANAGER); + + + $manager = new manager(); + $manager->setSessionAction($sessionAction); + $fileList = $manager->getFileList(); + $folderInfo = $manager->getFolderInfo(); + } + if(CONFIG_SYS_THUMBNAIL_VIEW_ENABLE) + { + $views = array( + 'detail'=>LBL_BTN_VIEW_DETAILS, + 'thumbnail'=>LBL_BTN_VIEW_THUMBNAIL, + ); + }else + { + $views = array( + 'detail'=>LBL_BTN_VIEW_DETAILS, + ); + } + + if(!empty($_GET['view'])) + { + switch($_GET['view']) + { + case 'detail': + case 'thumbnail': + $view = $_GET['view']; + break; + default: + $view = CONFIG_DEFAULT_VIEW; + } + }else + { + $view = CONFIG_DEFAULT_VIEW; + } + +?> + + + + +Ajax File Manager + + + + + + + + + + + + +
+ + +
+ + +
+ + + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + +
+
+ +   + +
+    + /> + /> +
+ + + + +

+ + + + + +

+
+ +
+ +
+
+ + +
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/debug.html b/admin-dev/ajaxfilemanager/debug.html new file mode 100755 index 000000000..e69de29bb diff --git a/admin-dev/ajaxfilemanager/inc/class.auth.php b/admin-dev/ajaxfilemanager/inc/class.auth.php new file mode 100755 index 000000000..1978c13fd --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.auth.php @@ -0,0 +1,48 @@ +__construct(); + } + /** + * check if the user has logged + * + * @return boolean + */ + function isLoggedIn() + { + return (!empty($_SESSION[$this->__loginIndexInSession])?true:false); + } + /** + * validate the username & password + * @return boolean + * + */ + function login() + { + if($_POST['username'] == CONFIG_LOGIN_USERNAME && $_POST['password'] == CONFIG_LOGIN_PASSWORD) + { + $_SESSION[$this->__loginIndexInSession] = true; + return true; + }else + { + return false; + } + } + } +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/class.file.php b/admin-dev/ajaxfilemanager/inc/class.file.php new file mode 100755 index 000000000..85512eb02 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.file.php @@ -0,0 +1,436 @@ +filePath = $path; + if(is_file($this->filePath)) + { + $this->fileStat = @stat($path); + $this->fileInfo['size'] = $this->fileStat[7]; + $this->fileInfo['atime'] = $this->fileStat[8]; + $this->fileInfo['ctime'] = $this->fileStat[10]; + $this->fileInfo['mtime'] = $this->fileStat[9]; + $this->fileInfo['path'] = $path; + $this->fileInfo['name'] = basename($path); + $this->fileInfo['is_writable'] = $this->isWritable(); + $this->fileInfo['is_readable'] = $this->isReadable(); + }elseif(is_dir($this->filePath)) + { + $this->fileStat = @stat($path); + $this->fileInfo['name'] = basename($path); + $this->fileInfo['path'] = $path; + $this->fileInfo['atime'] = $this->fileStat[8]; + $this->fileInfo['ctime'] = $this->fileStat[10]; + $this->fileInfo['mtime'] = $this->fileStat[9]; + $this->fileInfo['is_writable'] = $this->isWritable(); + $this->fileInfo['is_readable'] = $this->isReadable(); + } + }else + { + trigger_error('No such file exists. ' . $path, E_USER_NOTICE); + } + } + + + + } + /** + * contructor + * + * @param string $path + */ + function file($path=null) + { + $this->__construct($path); + } + + + /** + * check if a file or folder writable + * + * @param file path $path + * @return boolean + */ + function isWritable($path=null) + { + $path = (is_null($path)?$this->filePath:$path); + if (DIRECTORY_SEPARATOR == "\\") + { + $path = slashToBackslash($path); + if(is_file($path)) + { + $fp = @fopen($path,'ab'); + if($fp) + { + @fclose($fp); + return true; + } + }elseif(is_dir($path)) + { + $path = addTrailingSlash($path); + $tmp = uniqid(time()); + if (@touch($path . $tmp)) + { + @unlink($path . $tmp); + return true; + } + } + return false; + }else + { + return @is_writable(slashToBackslash($path)); + } + + } + /** + * Returns true if the files is readable. + * + * @return boolean true if the files is readable. + */ + function isReadable($path =null) + { + $path = is_null($path)?$this->filePath:$path; + return @is_readable(slashToBackslash($path)); + } + /** + * change the modified time + * + * @param string $path + * @param string $time + * @return boolean + */ + function setLastModified($path=null, $time) + { + $path = is_null($path)?$this->filePath:$path; + $time = is_null($time)?time():$time; + return @touch(slashToBackslash($path), $time); + } + + /** + * create a new folder + * + * @path the path for the new folder + * @mask + * @dirOwner + * @return boolean + */ + function mkdir($path = null, $mask=null, $dirOwner='') + { + $path = is_null($path)?$this->filePath:$path; + if(!file_exists($path)) + { + $mask = is_null($mask)?$this->mask:$mask; + $status = @mkdir(slashToBackslash($path)); + if ($mask) + { + @chmod(slashToBackslash($path), intval($mask, 8)); + } + if($dirOwner) + { + $this->chown(slashToBackslash($path), $dirOwner); + } + return $status; + } + return true; + + } + /** + * change the own of a file or folder + * + * @param the file path $path + * @param $owner + */ + function chown($path, $owner) + { + if(!empty($owner)) + { + $owners = explode(":", $owner); + if(!empty($owners[0])) + @chown($path, $owners[0]); + if(!empty($owners[1])) + @chgrp($path, $owner[1]); + } + } + + /** + * Copy a file, or recursively copy a folder and its contents + * @author Aidan Lister + * @author Paul Scott + * @version 1.0.1 + * @param string $source Source path + * @param string $dest Destination path + * @return bool Returns TRUE on success, FALSE on failure + */ + function copyTo($source, $dest) + { + $source = removeTrailingSlash(backslashToSlash($source)); + $dest = removeTrailingSlash(backslashToSlash($dest)); + if(!file_exists($dest) || !is_dir($dest)) + { + if(!$this->mkdir($dest)) + { + $this->_debug('Unable to create folder (' . $dest . ")"); + return false; + } + } + // Copy in to your self? + if (getAbsPath($source) == getAbsPath($dest)) + { + $this->_debug('Unable to copy itself. source: ' . getAbsPath($source) . "; dest: " . getAbsPath($dest)); + return false; + } + // Simple copy for a file + if (is_file($source)) + { + $dest = addTrailingSlash($dest) . (basename($source)); + if(file_exists($dest)) + { + return false; + }else { + + return copy($source, $dest); + } + + + }elseif(is_dir($source)) + { + // Loop through the folder + if(file_exists(addTrailingSlash($dest) . basename($source))) + { + return false; + }else + { + if(!file_exists(addTrailingSlash($dest) . basename($source)) || !is_dir(addTrailingSlash($dest) . basename($source))) + { + if(!$this->mkdir(addTrailingSlash($dest) . basename($source))) + { + $this->_debug('Unable to create folder (' . addTrailingSlash($dest) . basename($source) . ")"); + return false; + } + } + $handle = opendir($source); + while(false !== ($readdir = readdir($handle))) + { + if($readdir != '.' && $readdir != '..') + { + $path = addTrailingSlash($source).'/'.$readdir; + $this->copyTo($path, addTrailingSlash($dest) . basename($source)); + } + } + closedir($handle); + return true; + } + + } + return false; + } + /** + * get next available file name + * + * @param string $fileToMove the path of the file will be moved to + * @param string $destFolder the path of destination folder + * @return string + */ + function getNextAvailableFileName($fileToMove, $destFolder) + { + + $folderPath = addslashes(backslashToSlash(getParentPath($fileToMove))); + $destFolder = addslashes(backslashToSlash(getParentPath($destFolder))); + $finalPath = $destFolder . basename($fileToMove); + if(file_exists($fileToMove)) + { + if(is_file()) + { + $fileExt = getFileExt($fileToMove); + $fileBaseName = basename($fileToMove, '.' . $fileExt); + $count = 1; + while(file_exists($destFolder . $fileBaseName . $count . "." . $fileExt)) + { + $count++; + } + $filePath = $destFolder . $fileBaseName . $count . "." . $fileExt; + }elseif(is_dir()) + { + $folderName = basename($fileToMove); + $count = 1; + while(file_exists($destFolder . $folderName . $count)) + { + $count++; + } + $filePath = $destFolder . $fileBaseName . $count; + } + + } + return $finalPath; + } + /** + * get file information + * + * @return array + */ + function getFileInfo() + { + return $this->fileInfo; + } + /** + * close + * + */ + function close() + { + $this->fileInfo = null; + $this->fileStat = null; + } + /** + * delete a file or a folder and all contents within that folder + * + * @param string $path + * @return boolean + */ + function delete($path = null) + { + $path = is_null($path)?$this->filePath:$path; + if(file_exists($path)) + { + if(is_file($path)) + { + return @unlink($path); + }elseif(is_dir($path)) + { + return $this->__recursive_remove_directory($path); + } + + } + return false; + } + /** + * empty a folder + * + * @param string $path + * @return boolean + */ + function emptyFolder($path) + { + $path = is_null($path)?$this->filePath:""; + if(file_exists($path) && is_dir($path)) + { + return $this->__recursive_remove_directory($path, true); + } + return false; + } + + function _debug($info) + { + if($this->debug) + { + echo $info . "
\n"; + }else + { + $this->errors[] = $info; + } + } +/** + * recursive_remove_directory( directory to delete, empty ) + * expects path to directory and optional TRUE / FALSE to empty + * of course PHP has to have the rights to delete the directory + * you specify and all files and folders inside the directory + * + * to use this function to totally remove a directory, write: + * recursive_remove_directory('path/to/directory/to/delete'); + * to use this function to empty a directory, write: + * recursive_remove_directory('path/to/full_directory',TRUE); + * @param string $directory + * @param boolean $empty + * @return boolean + */ + function __recursive_remove_directory($directory, $empty=FALSE) + { + // if the path has a slash at the end we remove it here + if(substr($directory,-1) == '/') + { + $directory = substr($directory,0,-1); + } + + // if the path is not valid or is not a directory ... + if(!file_exists($directory) || !is_dir($directory)) + { + // ... we return false and exit the function + return FALSE; + + // ... if the path is not readable + }elseif(!is_readable($directory)) + { + // ... we return false and exit the function + return FALSE; + + // ... else if the path is readable + }else{ + + // we open the directory + $handle = @opendir($directory); + + // and scan through the items inside + while (FALSE !== ($item = @readdir($handle))) + { + // if the filepointer is not the current directory + // or the parent directory + if($item != '.' && $item != '..') + { + // we build the new path to delete + $path = $directory.'/'.$item; + + // if the new path is a directory + if(is_dir($path)) { + // we call this function with the new path + $this->__recursive_remove_directory($path); + + // if the new path is a file + }else{ + // we remove the file + @unlink($path); + } + } + } + // close the directory + @closedir($handle); + + // if the option to empty is not set to true + if($empty == FALSE) + { + // try to delete the now empty directory + if(!@rmdir($directory)) + { + // return false if not possible + return FALSE; + } + } + // return success + return TRUE; + } + } + } + +?> diff --git a/admin-dev/ajaxfilemanager/inc/class.history.php b/admin-dev/ajaxfilemanager/inc/class.history.php new file mode 100755 index 000000000..f209c2195 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.history.php @@ -0,0 +1,155 @@ +path = $path; + $this->session = &$session; + if(!isset($_SESSION[$this->path])) + { + $_SESSION[$this->path] = array(); + } + + } + /** + * constructor + * + * @param string $path the path to the image + * @param object $session an instance of session class + */ + function History($path, &$session) + { + $this->__construct($path, $session); + } + + /** + * keep tracks of each changes made to an image + * + * @param string $key + * @param string $info array('name', 'restorable', 'is_original') + */ + function add($info) + { + $_SESSION[$this->path][] = $info; + } + /** + * get the lastest changes for restore + * + * @return array array('name', 'restorable', 'is_original') + */ + function getNumRestorable() + { + $output = 0; + if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path])) + { + foreach($_SESSION[$this->path] as $k=>$v) + { + if(!empty($v['restorable']) && empty($v['is_original'])) + { + if(file_exists($this->session->getSessionDir() . $v['name'])) + { + $output++; + }else + { + + } + + } + } + } + return $output; + } + + /** + * get the path of image which keep the lastest changes + * + * @return return empty array when failed + */ + function getLastestRestorable() + { + if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path]) && sizeof($_SESSION[$this->path])) + { + $sessionImages = array_reverse($_SESSION[$this->path], true); + $lastestKey = ''; + foreach($sessionImages as $k=>$v) + { + if($v['restorable'] && empty($v['is_original']) && file_exists($this->session->getSessionDir() . $v['name'])) + { + return $sessionImages[$k]; + } + } + + } + return array(); + + } + /** + * get the original image which is kept in the session folder + * + * @return array + */ + function getOriginalImage() + { + $outputs = array(); + if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path])) + { + $sessionImages = array_reverse($_SESSION[$this->path], true); + foreach($sessionImages as $k=>$v) + { + if(!empty($v['is_original'])) + { + if(file_exists($this->session->getSessionDir() . $v['name'])) + { + return array('info'=>$_SESSION[$this->path][$k], 'key'=>$k); + } + + } + } + } + return $outputs; + + } + /** + * remove the lastest restorable state + * + * @return boolean + */ + function restore() + { + if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path]) && sizeof($_SESSION[$this->path])) + { + $sessionImages = array_reverse($_SESSION[$this->path], true); + $lastestKey = ''; + foreach($sessionImages as $k=>$v) + { + if($v['restorable'] && empty($v['is_original'])) + { + unset($_SESSION[$k]); + return true; + } + } + } + return false; + } + + + + } +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/class.image.php b/admin-dev/ajaxfilemanager/inc/class.image.php new file mode 100755 index 000000000..dfbaf970c --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.image.php @@ -0,0 +1,789 @@ +'', + 'ext'=>'', + 'size'=>'', + 'width'=>'', + 'height'=>'', + 'type'=>'', + 'path'=>'', + ); + var $_imgInfoFinal = array( + 'name'=>'', + 'ext'=>'', + 'size'=>'', + 'width'=>'', + 'height'=>'', + 'type'=>'', + 'path'=>'', + ); + var $_imgQuality = 90; + /** + * constructor + * + * @param boolean $debug + * @return Image + */ + + function __construct($debug = false) + { + $this->enableDebug($debug); + $this->gdInfo = $this->getGDInfo(); + } + function Image($debug = false) + { + $this->__construct($debug); + } + /** + * enable to debug + * + * @param boolean $value + */ + function enableDebug($value) + { + $this->_debug = ($value?true:false); + } + /** + * check if debug enable + * @return boolean + */ + function _isDebugEnable() + { + return $this->_debug; + } + + /** + * append to errors array and shown the each error when the debug turned on + * + * @param string $string + * @return void + * @access private + * @copyright this function originally come from Andy's php + */ + function _debug($value) + { + $this->_errors[] = $value; + if ($this->_debug) + { + echo $value . "
\n"; + } + } + /** + * show erros + * + */ + function showErrors() + { + if(sizeof($this->_errors)) + { + foreach($this->_errors as $error) + { + echo $error . "
\n"; + } + } + } + /** + * Load an image from the file system. + * + * @param string $filename + * @return bool + * @access public + * @copyright this function originally come from Andy's php + */ + function loadImage($filename) + { + $ext = strtolower($this->_getExtension($filename)); + $func = 'imagecreatefrom' . ($ext == 'jpg' ? 'jpeg' : $ext); + if (!$this->_isSupported($filename, $ext, $func, false)) { + return false; + } + if($ext == "gif") + { + // the following part gets the transparency color for a gif file + // this code is from the PHP manual and is written by + // fred at webblake dot net and webmaster at webnetwizard dotco dotuk, thanks! + $fp = @fopen($filename, "rb"); + $result = @fread($fp, 13); + $colorFlag = ord(substr($result,10,1)) >> 7; + $background = ord(substr($result,11)); + if ($colorFlag) { + $tableSizeNeeded = ($background + 1) * 3; + $result = @fread($fp, $tableSizeNeeded); + $this->transparentColorRed = ord(substr($result, $background * 3, 1)); + $this->transparentColorGreen = ord(substr($result, $background * 3 + 1, 1)); + $this->transparentColorBlue = ord(substr($result, $background * 3 + 2, 1)); + } + fclose($fp); + // -- here ends the code related to transparency handling + } + $this->_imgOrig = @$func($filename); + if ($this->_imgOrig == null) { + $this->_debug("The image could not be created from the '$filename' file using the '$func' function."); + return false; + }else + { + $this->imageFile = $filename; + $this->_imgInfoOrig = array( + 'name'=>basename($filename), + 'ext'=>$ext, + 'size'=>filesize($filename), + 'path'=>$filename, + ); + $imgInfo = $this->_getImageInfo($filename); + if(sizeof($imgInfo)) + { + foreach($imgInfo as $k=>$v) + { + $this->_imgInfoOrig[$k] = $v; + $this->_imgInfoFinal[$k] = $v; + } + } + + } + return true; + } + + /** + * Load an image from a string (eg. from a database table) + * + * @param string $string + * @return bool + * @access public + * @copyright this function originally come from Andy's php + */ + function loadImageFromString($string) + { + $this->imageFile = $filename; + $this->_imgOrig = imagecreatefromstring($string); + if (!$this->_imgOrig) { + $this->_debug('The image (supplied as a string) could not be created.'); + return false; + } + return true; + } + + + /** + * Save the modified image + * + * @param string $filename + * @param int $quality + * @param string $forcetype + * @return bool + * @access public + * @copyright this function originally come from Andy's php + */ + function saveImage($filename, $quality = 90, $forcetype = '') + { + if ($this->_imgFinal == null) { + $this->_debug('No changes intend to be made.'); + return false; + } + + $ext = ($forcetype == '') ? $this->_getExtension($filename) : strtolower($forcetype); + $func = 'image' . ($ext == 'jpg' ? 'jpeg' : $ext); + if (!$this->_isSupported($filename, $ext, $func, true)) + { + return false; + } + $saved = false; + switch($ext) + { + case 'gif': + if ($this->gdInfo['Truecolor Support'] && imageistruecolor($this->_imgFinal)) + { + imagetruecolortopalette($this->_imgFinal, false, 255); + } + case 'png': + $saved = $func($this->_imgFinal, $filename); + break; + case 'jpg': + $saved = $func($this->_imgFinal, $filename, $quality); + break; + } + + if ($saved === false) + { + $this->_debug("The image could not be saved to the '$filename' file as the file type '$ext' using the '$func' function."); + return false; + }else + { + $this->_imgInfoFinal['size'] = @filesize($filename); + @chmod($filename, intval($this->chmod, 8)); + } + + return true; + } + /** + * Shows the masked image without any saving + * + * @param string $type + * @param int $quality + * @return bool + * @access public + * @copyright this function originally come from Andy's php + */ + function showImage($type = '', $quality = '') + { + if ($this->_imgFinal == null) { + $this->_debug('There is no cropped image to show.'); + return false; + } + $type = (!empty($type)?$type:$this->_imgInfoOrig['ext']); + $quality = (!empty($quality)?$quality:$this->_imgQuality); + + $type = strtolower($type); + $func = 'image' . ($type == 'jpg' ? 'jpeg' : $type); + $head = 'image/' . ($type == 'jpg' ? 'jpeg' : $type); + + if (!$this->_isSupported('[showing file]', $type, $func, false)) { + return false; + } + + header("Content-type: $head"); + switch($type) + { + case 'gif': + if ($this->gdInfo['Truecolor Support'] && imageistruecolor($this->_imgFinal)) + { + @imagetruecolortopalette($this->_imgFinal, false, 255); + } + case 'png': + $func($this->_imgFinal); + break; + case 'jpg': + $func($this->_imgFinal, '', $quality); + break; + } + return true; + } + + /** + * Used for cropping image + * + * @param int $dst_x + * @param int $dst_y + * @param int $dst_w + * @param int $dst_h + * @return bool + * @access public + * @copyright this function originally come from Andy's php + */ + function crop($dst_x, $dst_y, $dst_w, $dst_h) + { + if ($this->_imgOrig == null) { + $this->_debug('The original image has not been loaded.'); + return false; + } + if (($dst_w <= 0) || ($dst_h <= 0)) { + $this->_debug('The image could not be cropped because the size given is not valid.'); + return false; + } + if (($dst_w > imagesx($this->_imgOrig)) || ($dst_h > imagesy($this->_imgOrig))) { + $this->_debug('The image could not be cropped because the size given is larger than the original image.'); + return false; + } + $this->_createFinalImageHandler($dst_w, $dst_h); + if ($this->gdInfo['Truecolor Support']) + { + if(!@imagecopyresampled($this->_imgFinal, $this->_imgOrig, 0, 0, $dst_x, $dst_y, $dst_w, $dst_h, $dst_w, $dst_h)) + { + $this->_debug('Unable crop the image.'); + return false; + } + } else + { + if(!@imagecopyresized($this->_imgFinal, $this->_imgOrig, 0, 0, $dst_x, $dst_y, $dst_w, $dst_h, $dst_w, $dst_h)) + { + $this->_debug('Unable crop the image.'); + return false; + } + + } + $this->_imgInfoFinal['width'] = $dst_w; + $this->_imgInfoFinal['height'] = $dst_h; + return true; + } + + + /** + * Resize the Image in the X and/or Y direction + * If either is 0 it will be scaled proportionally + * + * @access public + * + * @param mixed $new_x + * @param mixed $new_y + * @param boolean $constraint keep to resize the image proportionally + * @param boolean $unchangeIfsmaller keep the orignial size if the orignial smaller than the new size + * + * + * @return mixed none or PEAR_error + */ + function resize( $new_x, $new_y, $constraint= false, $unchangeIfsmaller=false) + { + if(!$this->_imgOrig) + { + $this->_debug('No image fould.'); + return false; + } + + $new_x = (int)($new_x); + $new_y = (int)($new_y); + if($new_x <=0 || $new_y <= 0) + { + $this->_debug('either of new width or height can be zeor or less.'); + }else + { + + if($constraint) + { + if($new_x < 1 && $new_y < 1) + { + $new_x = $this->_imgInfoOrig['width']; + $new_y = $this->_imgInfoOrig['height']; + }elseif($new_x < 1) + { + $new_x = floor($new_y / $this->_imgInfoOrig['height'] * $this->_imgInfoOrig['width']); + + }elseif($new_y < 1) + { + $new_y = floor($new_x / $this->_imgInfoOrig['width'] * $this->_imgInfoOrig['height']); + }else + { + $scale = min($new_x/$this->_imgInfoOrig['width'], $new_y/$this->_imgInfoOrig['height']) ; + $new_x = floor($scale*$this->_imgInfoOrig['width']); + $new_y = floor($scale*$this->_imgInfoOrig['height']); + } + } + if($unchangeIfsmaller) + { + if($this->_imgInfoOrig['width'] < $new_x && $this->_imgInfoOrig['height'] < $new_y ) + { + $new_x = $this->_imgInfoOrig['width']; + $new_y = $this->_imgInfoOrig['height']; + } + } + + + + if(is_null($this->_imgOrig)) + { + $this->loadImage($filePath); + } + if(sizeof($this->_errors) == 0) + { + return $this->_resize($new_x, $new_y); + } + } + + return false; + + } // End resize + /** + * resize the image and return the thumbnail image details array("width"=>, "height"=>, "name") + * + * @param string $fileName + * @param int $new_x the thumbnail width + * @param int $new_y the thumbnail height + * @param string $mode can be save, view and both + * @return unknown + */ + function _resize( $new_x, $new_y) + { + $this->_createFinalImageHandler($new_x, $new_y); + // hacks fot transparency of png24 files + if ($this->_imgInfoOrig['type'] == 'png') + { + @imagealphablending($this->_imgFinal, false); + if(function_exists('ImageCopyResampled')) + { + @ImageCopyResampled($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']); + } else { + @ImageCopyResized($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']); + } + @imagesavealpha($this->_imgFinal, true); + + }else + {//for the rest image + if(function_exists('ImageCopyResampled')) + { + @ImageCopyResampled($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']); + } else { + @ImageCopyResized($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']); + } + } + + + $this->_imgInfoFinal['width'] = $new_x; + $this->_imgInfoFinal['height'] = $new_y; + $this->_imgInfoFinal['name'] = basename($this->_imgInfoOrig['name']); + $this->_imgInfoFinal['path'] = $this->_imgInfoOrig['path']; + if($this->_imgFinal) + { + return true; + }else + { + $this->_debug('Unable to resize the image on the fly.'); + return false; + + } + + } + /** + * Get the extension of a file name + * + * @param string $file + * @return string + * @copyright this function originally come from Andy's php + */ + function _getExtension($file) + { + $ext = ''; + if (strrpos($file, '.')) { + $ext = strtolower(substr($file, (strrpos($file, '.') ? strrpos($file, '.') + 1 : strlen($file)), strlen($file))); + } + return $ext; + } + + /** + * Validate whether image reading/writing routines are valid. + * + * @param string $filename + * @param string $extension + * @param string $function + * @param bool $write + * @return bool + * @access private + * @copyright this function originally come from Andy's php + */ + function _isSupported($filename, $extension, $function, $write = false) + { + + $giftype = ($write) ? ' Create Support' : ' Read Support'; + $support = strtoupper($extension) . ($extension == 'gif' ? $giftype : ' Support'); + + if (!isset($this->gdInfo[$support]) || $this->gdInfo[$support] == false) { + $request = ($write) ? 'saving' : 'reading'; + $this->_debug("Support for $request the file type '$extension' cannot be found."); + return false; + } + if (!function_exists($function)) { + $request = ($write) ? 'save' : 'read'; + $this->_debug("The '$function' function required to $request the '$filename' file cannot be found."); + return false; + } + + return true; + } + /** + * flip image horizotally or vertically + * + * @param string $direction + * @return boolean + */ + function flip($direction="horizontal") + { + $this->_createFinalImageHandler($this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']); + if($direction != "vertical") + { + $dst_x = 0; + $dst_y = 0; + $src_x = $this->_imgInfoOrig['width'] -1; + $src_y = 0; + $dst_w = $this->_imgInfoOrig['width']; + $dst_h = $this->_imgInfoOrig['height']; + $src_w = 0 - $this->_imgInfoOrig['width']; + $src_h = $this->_imgInfoOrig['height']; + + }else + { + $dst_x = 0; + $dst_y = 0; + $src_x = 0; + $src_y = $this->_imgInfoOrig['height'] - 1; + $dst_w = $this->_imgInfoOrig['width']; + $dst_h = $this->_imgInfoOrig['height']; + $src_w = $this->_imgInfoOrig['width']; + $src_h = 0 - $this->_imgInfoOrig['height']; + } + if(function_exists('ImageCopyResampled')){ + ImageCopyResampled($this->_imgFinal, $this->_imgOrig, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); + } else { + ImageCopyResized($this->_imgFinal, $this->_imgOrig, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); + } + $this->_imgInfoFinal['width'] = $dst_w; + $this->_imgInfoFinal['height'] = $dst_h; + $this->_imgInfoFinal['name'] = basename($this->imageFile); + $this->_imgInfoFinal['path'] = $this->imageFile; + if($this->_imgFinal) + { + return true; + }else + { + $this->_debug('Unable to resize the image on the fly.'); + return false; + + } + } + /** + * flip vertically + * + * @return boolean + */ + function flipVertical() + { + return $this->flip('vertical'); + } + /** + * flip horizontal + * + * @return string + */ + function flipHorizontal() + { + return $this->flip('horizontal'); + } + + + /** + * get the GD version information + * + * @param bool $versionOnly + * @return array + * @access private + * @copyright this function originally come from Andy's php + */ + function getGDInfo($versionOnly = false) + { + $outputs = array(); + if (function_exists('gd_info')) + { + $outputs = gd_info(); + } else + { + $gd = array( + 'GD Version' => '', + 'GIF Read Support' => false, + 'GIF Create Support' => false, + 'JPG Support' => false, + 'PNG Support' => false, + 'FreeType Support' => false, + 'FreeType Linkage' => '', + 'T1Lib Support' => false, + 'WBMP Support' => false, + 'XBM Support' => false + ); + ob_start(); + phpinfo(); + $buffer = ob_get_contents(); + ob_end_clean(); + foreach (explode("\n", $buffer) as $line) { + $line = array_map('trim', (explode('|', strip_tags(str_replace('', '|', $line))))); + if (isset($gd[$line[0]])) { + if (strtolower($line[1]) == 'enabled') { + $gd[$line[0]] = true; + } else { + $gd[$line[0]] = $line[1]; + } + } + } + $outputs = $gd; + } + + if (isset($outputs['JIS-mapped Japanese Font Support'])) { + unset($outputs['JIS-mapped Japanese Font Support']); + } + if (function_exists('imagecreatefromgd')) { + $outputs['GD Support'] = true; + } + if (function_exists('imagecreatefromgd2')) { + $outputs['GD2 Support'] = true; + } + if (preg_match('/^(bundled|2)/', $outputs['GD Version'])) { + $outputs['Truecolor Support'] = true; + } else { + $outputs['Truecolor Support'] = false; + } + if ($outputs['GD Version'] != '') { + $match = array(); + if (preg_match('/([0-9\.]+)/', $outputs['GD Version'], $match)) { + $foo = explode('.', $match[0]); + $outputs['Version'] = array('major' => isset($foo[0])?$foo[0]:'', 'minor' => isset($foo[1])?$foo[1]:'', 'patch' => isset($foo[2])?$foo:""); + } + } + + return ($versionOnly) ? $outputs['Version'] : $outputs; + } + + /** + * Destroy the resources used by the images. + * + * @param bool $original + * @return void + * @access public + * @copyright this function originally come from Andy's php + */ + function DestroyImages($original = true) + { + if(!is_null($this->_imgFinal)) + { + @imagedestroy($this->_imgFinal); + } + $this->_imgFinal = null; + if ($original && !is_null($this->_imgOrig)) { + @imagedestroy($this->_imgOrig); + $this->_imgOrig = null; + } + } + + function getImageInfo($imagePath) + { + return $this->_getImageInfo($imagePath); + } + /** + * get image information, e.g. width, height, type + * @access public + * @return array + */ + function _getImageInfo($imagePath) + { + $outputs = array(); + $imageInfo = @GetImageSize($imagePath); + if ($imageInfo && is_array($imageInfo)) + { + switch($imageInfo[2]){ + case 1: + $type = 'gif'; + break; + case 2: + $type = 'jpeg'; + break; + case 3: + $type = 'png'; + break; + case 4: + $type = 'swf'; + break; + case 5: + $type = 'psd'; + case 6: + $type = 'bmp'; + case 7: + case 8: + $type = 'tiff'; + default: + $type = ''; + } + $outputs['width'] = $imageInfo[0]; + $outputs['height'] = $imageInfo[1]; + $outputs['type'] = $type; + $outputs['ext'] = $this->_getExtension($imagePath); + } else { + $this->_debug('Unable locate the image or read images information.'); + } + return $outputs; + + } + function rotate($angle, $bgColor=0) + { + $angle = (int)($angle) -360; + while($angle <0) + { + $angle += 360; + } + + + if($this->_imgFinal = imagerotate($this->_imgOrig, $angle)) + { + return true; + }else + { + return false; + } + + + } + /** + * get the original image info + * + * @return array + */ + function getOriginalImageInfo() + { + return $this->_imgInfoOrig; + } + /** + * return the final image info + * + * @return array + */ + function getFinalImageInfo() + { + if($this->_imgInfoFinal['width'] == '') + { + if(is_null($this->_imgFinal)) + { + $this->_imgInfoFinal = $this->_imgInfoOrig; + }else + { + $this->_imgInfoFinal['width'] = @imagesx($this->_imgFinal); + $this->_imgInfoFinal['height'] = @imagesy($this->_imgFinal); + } + } + return $this->_imgInfoFinal; + } + + /** + * create final image handler + * + * @access private + * @param $dst_w width + * @param $dst_h height + * @return boolean + * @copyright original from noname at nivelzero dot ro + */ + function _createFinalImageHandler($dst_w, $dst_h) + { + if(function_exists('ImageCreateTrueColor')) + { + $this->_imgFinal = @ImageCreateTrueColor($dst_w,$dst_h); + } else { + $this->_imgFinal = @ImageCreate($dst_w,$dst_h); + } + if (!is_null($this->transparentColorRed) && !is_null($this->transparentColorGreen) && !is_null($this->transparentColorBlue)) { + + $transparent = @imagecolorallocate($targetImageIdentifier, $this->transparentColorRed, $this->transparentColorGreen, $this->transparentColorBlue); + @imagefilledrectangle($this->_imgFinal, 0, 0, $dst_w, $dst_h, $transparent); + @imagecolortransparent($this->_imgFinal, $transparent); + } + + } + } + +?> diff --git a/admin-dev/ajaxfilemanager/inc/class.manager.php b/admin-dev/ajaxfilemanager/inc/class.manager.php new file mode 100755 index 000000000..01e4d89a9 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.manager.php @@ -0,0 +1,373 @@ +'noFlag', 'cut'=>'cutFlag', 'copy'=>'copyFlag'); + var $forceFolderOnTop = false; //forced to have folder shown on the top of the list + var $currentFolderInfo = array( + 'name'=>'', + 'subdir'=>0, + 'file'=>0, + 'ctime'=>'', + 'mtime'=>'', + 'is_readable'=>'', + 'is_writable'=>'', + 'size'=>0, + 'path'=>'', + 'type'=>'folder', + 'flag'=>'noFlag', + 'friendly_path'=>'', + ); + + var $lastVisitedFolderPathIndex = 'ajax_last_visited_folder'; + var $folderPathIndex = "path"; + var $calculateSubdir = true; + var $fileTypes = array( + array(array("exe", "com"), "fileExe", SEARCH_TYPE_EXE, 0), + array(array("gif", "jpg", "png", "bmp", "tif"), "filePicture", SEARCH_TYPE_IMG, 1), + array(array("zip", "sit", "rar", "gz", "tar"), "fileZip", SEARCH_TYPE_ARCHIVE, 0), + array(array("htm", "html", "php", "jsp", "asp", 'js', 'css'), "fileCode", SEARCH_TYPE_HTML, 1), + array(array("mov", "ram", "rm", "asx", "dcr", "wmv"), "fileVideo", SEARCH_TYPE_VIDEO, 1), + array(array("mpg", "avi", "asf", "mpeg"), "fileVideo", SEARCH_TYPE_MOVIE, 1), + array(array("aif", "aiff", "wav", "mp3", "wma"), "fileMusic", SEARCH_TYPE_MUSIC, 1), + array(array("swf", 'flv'), "fileFlash", SEARCH_TYPE_FLASH, 1), + array(array("ppt"), "filePPT", SEARCH_TYPE_PPT, 0), + array(array("rtf"), "fileRTF", SEARCH_TYPE_DOC, 0), + array(array("doc"), "fileWord", SEARCH_TYPE_WORD, 0), + array(array("pdf"), "fileAcrobat", SEARCH_TYPE_PDF, 0), + array(array("xls", "csv"), "fileExcel", SEARCH_TYPE_EXCEL, 0), + array(array("txt"), "fileText", SEARCH_TYPE_TEXT, 1), + array(array("xml", "xsl", "dtd"), "fileXml", SEARCH_TYPE_XML, 1) + ); + + /** + * constructor + * @path the path to a folder + * @calculateSubdir force to get the subdirectories information + */ + function __construct($path = null, $calculateSubdir=true) + { + + $this->calculateSubdir = $calculateSubdir; + if(defined('CONFIG_SYS_FOLDER_SHOWN_ON_TOP')) + { + $this->forceFolderOnTop = CONFIG_SYS_FOLDER_SHOWN_ON_TOP; + } + if(!is_null($path)) + { + $this->currentFolderPath = $path; + + }elseif(isset($_GET[$this->folderPathIndex]) && file_exists($_GET[$this->folderPathIndex]) && !is_file($_GET[$this->folderPathIndex]) ) + { + $this->currentFolderPath = $_GET[$this->folderPathIndex]; + } + elseif(isset($_SESSION[$this->lastVisitedFolderPathIndex]) && file_exists($_SESSION[$this->lastVisitedFolderPathIndex]) && !is_file($_SESSION[$this->lastVisitedFolderPathIndex])) + { + $this->currentFolderPath = $_SESSION[$this->lastVisitedFolderPathIndex]; + }else + { + $this->currentFolderPath = CONFIG_SYS_DEFAULT_PATH; + } + + $this->currentFolderPath = (isUnderRoot($this->currentFolderPath)?backslashToSlash((addTrailingSlash($this->currentFolderPath))):CONFIG_SYS_DEFAULT_PATH); + + if($this->calculateSubdir) + {// keep track of this folder path in session + $_SESSION[$this->lastVisitedFolderPathIndex] = $this->currentFolderPath; + } + if(is_dir($this->currentFolderPath)) + { + $file = new file($this->currentFolderPath); + $folderInfo = $file->getFileInfo(); + if(sizeof($folderInfo)) + { + $this->currentFolderInfo['name']=basename($this->currentFolderPath); + $this->currentFolderInfo['subdir']=0; + $this->currentFolderInfo['file']=0; + $this->currentFolderInfo['ctime']=$folderInfo['ctime']; + $this->currentFolderInfo['mtime']=$folderInfo['mtime']; + $this->currentFolderInfo['is_readable']=$folderInfo['is_readable']; + $this->currentFolderInfo['is_writable']=$folderInfo['is_writable']; + $this->currentFolderInfo['path'] = $this->currentFolderPath; + $this->currentFolderInfo['friendly_path'] = transformFilePath($this->currentFolderPath); + $this->currentFolderInfo['type'] = "folder"; + $this->currentFolderInfo['cssClass']='folder'; + + //$this->currentFolderInfo['flag'] = $folderInfo['flag']; + } + } + if($calculateSubdir && !file_exists($this->currentFolderPath)) + { + die(ERR_FOLDER_NOT_FOUND . $this->currentFolderPath); + } + + + + } + + function setSessionAction(&$session) + { + $this->sessionAction = $session; + } + /** + * constructor + */ + function manager($path = null, $calculateSubdir=true) + { + $this->__construct($path, $calculateSubdir); + } + /** + * get current folder path + * @return string + */ + function getCurrentFolderPath() + { + return $this->currentFolderPath; + } + /** + * get the list of files and folders under this current fold + * @return array + */ + function getFileList() + { + $outputs = array(); + $files = array(); + $folders = array(); + $tem = array(); + $dirHandler = @opendir($this->currentFolderPath); + if($dirHandler) + { + while(false !== ($file = readdir($dirHandler))) + { + if($file != '.' && $file != '..') + { + $flag = $this->flags['no']; + + if($this->sessionAction->getFolder() == $this->currentFolderPath) + {//check if any flag associated with this folder or file + $folder = addTrailingSlash(backslashToSlash($this->currentFolderPath)); + if(in_array($folder . $file, $this->sessionAction->get())) + { + if($this->sessionAction->getAction() == "copy") + { + $flag = $this->flags['copy']; + }else + { + $flag = $this->flags['cut']; + } + } + } + $path=$this->currentFolderPath.$file; + if(is_dir($path) && isListingDocument($path) ) + { + $this->currentFolderInfo['subdir']++; + if(!$this->calculateSubdir) + { + }else + { + + $folder = $this->getFolderInfo($path); + $folder['flag'] = $flag; + $folders[$file] = $folder; + $outputs[$file] = $folders[$file]; + } + + + }elseif(is_file($path) && isListingDocument($path)) + { + + $obj = new file($path); + $tem = $obj->getFileInfo(); + if(sizeof($tem)) + { + $fileType = $this->getFileType($file); + foreach($fileType as $k=>$v) + { + $tem[$k] = $v; + } + $this->currentFolderInfo['size'] += $tem['size']; + $this->currentFolderInfo['file']++; + $tem['path'] = backslashToSlash($path); + $tem['type'] = "file"; + $tem['flag'] = $flag; + $files[$file] = $tem; + $outputs[$file] = $tem; + $tem = array(); + $obj->close(); + + } + + + } + + } + } + if($this->forceFolderOnTop) + { + uksort($folders, "strnatcasecmp"); + uksort($files, "strnatcasecmp"); + $outputs = array(); + foreach($folders as $v) + { + $outputs[] = $v; + } + foreach ($files as $v) + { + $outputs[] = $v; + } + }else + { + uksort($outputs, "strnatcasecmp"); + } + + @closedir($dirHandler); + }else + { + trigger_error('Unable to locate the folder ' . $this->currentFolderPath, E_NOTICE); + } + return $outputs; + } + + + /** + * get current or the specified dir information + * + * @param string $path + * @return array + */ + function getFolderInfo($path=null) + { + if(is_null($path)) + { + return $this->currentFolderInfo; + }else + { + $obj = new manager($path, false); + $obj->setSessionAction($this->sessionAction); + $obj->getFileList(); + return $obj->getFolderInfo(); + } + + } + + /** + * return the file type of a file. + * + * @param string file name + * @return array + */ + function getFileType($fileName, $checkIfDir = false) + { + + $ext = strtolower($this->_getExtension($fileName, $checkIfDir)); + + foreach ($this->fileTypes as $fileType) + { + if(in_array($ext, $fileType[0])) + { + return array("cssClass" => $fileType[1], "fileType" => $fileType[2], "preview" => $fileType[3], 'test'=>5); + } + } + if(!empty($fileName)) + {//this is folder + if(empty($ext)) + { + if(is_dir($fileName)) + { + + return array("cssClass" => ($checkIfDir && $this->isDirEmpty($fileName)?'folderEmpty':"folder") , "fileType" => "Folder", "preview" => 0, 'test'=>1); + }else + { + return array("cssClass" => "fileUnknown", "fileType" => SEARCH_TYPE_UNKNOWN, "preview" => 0, 'test'=>2); + } + }else + { + return array("cssClass" => "fileUnknown", "fileType" => SEARCH_TYPE_UNKNOWN, "preview" => 0, 'test'=>3, 'ext'=>$ext , 'filename'=>$fileName); + } + + }else + {//this is unknown file + return array("cssClass" => "fileUnknown", "fileType" => SEARCH_TYPE_UNKNOWN, "preview" => 0, 'test'=>4); + } + + + } + + /** + * return the predefined file types + * + * @return arrray + */ + function getFileTypes() + { + return $this->fileTypes; + } + /** + * print out the file types + * + */ + function printFileTypes() + { + foreach($fileTypes as $fileType) + { + if(isset($fileType[0]) && is_array($fileType[0])) + { + foreach($fileType[0] as $type) + { + echo $type. ","; + } + } + } + } + + /** + * Get the extension of a file name + * + * @param string $file + * @return string + * @copyright this function originally come from Andy's php + */ + function _getExtension($file, $checkIfDir = false) + { + if($checkIfDir && file_exists($file) && is_dir($file)) + { + return ''; + }else + { + return @substr(@strrchr($file, "."), 1); + } + + + } + + function isDirEmpty($path) + { + $dirHandler = @opendir($path); + if($dirHandler) + { + while(false !== ($file = readdir($dirHandler))) + { + if($file != '.' && $file != '..') + { + @closedir($dirHandler); + return false; + + } + } + + @closedir($dirHandler); + + } + return true; + } +} +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/class.pagination.php b/admin-dev/ajaxfilemanager/inc/class.pagination.php new file mode 100755 index 000000000..38752d3cd --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.pagination.php @@ -0,0 +1,584 @@ +friendlyUrl = $friendlyUrl; + $this->__resetCurrentPage(); + } + + /** + * set maximum number of items per page + * + * @param integer $value maximum number of items per page + */ + function setLimit($value) + { + $this->itemsPerPage = (int)($value); + } + /** + * get maximum number of items per page + * + * @return integer + */ + function getLimit() + { + return $this->itemsPerPage; + } + + /** + * set the total number of items + * + * @param integer $value the total number of items + */ + function setTotal($value) + { + $this->totalItems = (int)($value); + } + /** + * get the total number of items + * + * @return integer total number of items + */ + function getTotal() + { + return $this->totalItems; + } + /** + * get total pages will be used to display all records + * + */ + function getTotalPages() + { + + $output = floor(($this->totalItems / $this->itemsPerPage )); + if($this->totalItems % $this->itemsPerPage) + { + $output++; + } + return $output; + } + + /** + * Set the index of URL Query String + * + * @param string $value e.g. page + */ + function setPageIndex($value) + { + $this->pageIndex = $value; + $this->__resetCurrentPage(); + } + + + function getPageIndex() + { + return $this->pageIndex; + } + /** + * initiate or reset the current page number + * + */ + function __resetCurrentPage() + { + $this->currentPage = ((isset($_GET[$this->pageIndex]) && (int)($_GET[$this->pageIndex]) > 0)?(int)($_GET[$this->pageIndex]):1); + } + + /** + * set the base url used in the links, default is $PHP_SELF + * + * @param string $value the base url + */ + function setUrl($value="") + { + if(empty($value)) + { + if($this->friendlyUrl) + { + $this->url = "http://" . $_SERVER['HTTP_HOST'] . "/"; + }else + { + $this->url = $_SERVER['PHP_SELF']; + } + }else + { + $this->url = $value; + } + + } + + /** + * get the base url variable + * + * @return string the base url + */ + function getUrl() + { + + if(empty($this->url)) + { + $this->setUrl(); + + } + return $this->url; + } + + /** + * set base url for pagination links after exculed those keys + * identified on excluded query strings + */ + function __setBaseUrl() + { + + if(empty($this->url)) + { + $this->getUrl(); + } + + if($this->friendlyUrl) + { + $this->baseUrl = $this->getUrl(); + }else + { + + $appendingQueryStrings = array(); + $this->excludedQueryStrings[$this->pageIndex] =$this->pageIndex; + foreach($_GET as $k=>$v) + { + if((array_search($k, $this->excludedQueryStrings) === false )) + { + $appendingQueryStrings[$k] = $k . "=" . $v; + } + } + if(sizeof($appendingQueryStrings)) + { + $this->baseUrl = $this->__appendQueryString($this->url, implode("&", $appendingQueryStrings)); + }else + { + $this->baseUrl = $this->getUrl(); + } + + } + + + } + /** + * get base url for pagination links aftr excluded those key + * identified on excluded query strings + * + */ + function __getBaseUrl() + { + + if(empty($this->baseUrl)) + { + + $this->__setBaseUrl(); + } + return $this->baseUrl; + } + + + /** + * get the first item number + * + * @return interger the first item number displayed within current page + */ + function getFirstItem() + { + $output = 0; + $temStartItemNumber = (($this->currentPage - 1) * $this->itemsPerPage + 1); + if($this->totalItems && $temStartItemNumber <= $this->totalItems ) + { + + $output = $temStartItemNumber; + } + return $output; + } + /** + * get the last item number displayed within current page + * + * @return interger the last item number + */ + function getLastItem() + { + $output = 0; + $temEndItemNumber = (($this->currentPage) * $this->itemsPerPage); + if($this->totalItems) + { + if($temEndItemNumber <= $this->totalItems) + { + $output = $temEndItemNumber; + }else + { + $output = $this->totalItems; + } + + } + return $output; + } + /** + * set page groupings limit + * used for previous 1 2 3 4 5 next + * + * @param unknown_type $value + */ + function setGroupLimit($value) + { + $this->groupLimit = (int)($value); + } + /** + * get page grouping limit + * + * @return integer the page grouping limit + */ + function getGroupLimit() + { + return $this->groupLimit; + } + /** + * get the page offset number + * used for Query . e.g SELECT SQL_CALC_FOUND_ROWS * + * FROM mytable LIMIT getPageOffset(), getItemsPerPage() + * + * @return iner + */ + function getPageOffset() + { + return (($this->currentPage - 1) * $this->itemsPerPage); + } + /** + * get the last url if any + * @return string the last url + */ + function getLastUrl() + { + + $url = ""; + $totalPages = $this->getTotalPages(); + if($this->currentPage < $totalPages) + { + $url = $this->__getBaseUrl(); + + if($this->friendlyUrl) + { + $url .= $this->pageIndex . $totalPages . "/"; + }else + { + $url = $this->__appendQueryString($url, $this->pageIndex . "=" . $totalPages); + } + $url = sprintf('%s', + $url, + $this->lastText); + } + return $url; + } + + + + + /** + * get the first url if any + * @return string the first url + */ + + function getFirstUrl() + { + $url = ""; + if($this->currentPage > 1) + { + $url = $this->__getBaseUrl(); + if($this->friendlyUrl) + { + $url .= $this->pageIndex . "1/"; + }else + { + $url = $this->__appendQueryString($url, $this->pageIndex . "=1"); + } + $url = sprintf('%s', + $url, + $this->firstText); + + } + return $url; + } + + /** + * get the previous page url if anywhere + * + * @param array $excludedQueryStrings excluded the value from $_GET + * @return string the previous page url + */ + function getPreviousUrl() + { + $url = ""; + if($this->currentPage > 1 && $this->totalItems > 0 ) + { + $url = $this->__getBaseUrl(); + if($this->friendlyUrl) + { + $url .= $this->pageIndex . ($this->currentPage - 1) . "/"; + }else + { + $url = $this->__appendQueryString($url, $this->pageIndex . "=" . ($this->currentPage -1)); + } + $url = sprintf('%s', + $url, + $this->previousText); + + } + + return $url; + } + /** + * get the next page url if anywhere + * + * @param array $excludedQueryStrings excluded the value from $_GET + * @return string the next page url + */ + function getNextUrl() + { + $url = ""; + if($this->totalItems > ($this->currentPage * $this->itemsPerPage)) + { + $url = $this->__getBaseUrl(); + if($this->friendlyUrl) + { + $url .= $this->pageIndex . ($this->currentPage + 1) . "/"; + }else + { + $url = $this->__appendQueryString($url, $this->pageIndex . "=" . ($this->currentPage + 1)); + } + $url = sprintf('%s', + $url, + $this->nextText); + } + return $url; + + } + + /** + * get the group page links e.g. 1,2,3,4,5 + * return format + * 1 + * 2 + * 3 + */ + function getGroupUrls() + { + $output = ""; + if($this->totalItems > 0) + { + $displayedPages = 0; + $url = $this->__getBaseUrl(); + $totalPages = $this->getTotalPages(); + // find halfway point + $groupLimitHalf = floor($this->groupLimit / 2); + // determine what item/page we start with + $itemStart = $this->currentPage - $groupLimitHalf; + $itemStart = ($itemStart > 0 && $itemStart <= $totalPages)?$itemStart:1; + $itemEnd = $itemStart; + + while($itemEnd < ($itemStart + $this->groupLimit - 1) && $itemEnd < $totalPages) + { + $itemEnd++; + } + + + if($totalPages > ($itemEnd - $itemStart)) + { + for($i = $itemStart; $i > 1 && ($itemEnd - $itemStart + 1) < $this->groupLimit; $i--) + { + $itemStart--; + } + } + + for($item = $itemStart; $item <= $itemEnd; $item++) + { + if($item != $this->currentPage) + {//it is not the active link + if($this->friendlyUrl) + { + $temUrl = $url . $this->pageIndex . $item . "/"; + }else + { + $temUrl = $this->__appendQueryString($url, $this->pageIndex . "=" . $item); + } + $output .= sprintf(' %d ', $temUrl, $item); + }else + {//active link + $output .= sprintf(' %d ', $item); + } + } + } + return $output; + } + /** + * set the text of previous page link + * + * @param string $value + */ + function setPreviousText($value) + { + $this->previousText = $value; + } + /** + * set the text of first page link + * + * @param string $value + */ + function setFirstText($value) + { + $this->firstText = $value; + } + /** + * set the text of next page link + * + * @param string $value + */ + + function setNextText($value) + { + $this->nextText = $value; + } + /** + * set the text of last page link + * + * @param string $value + */ + function setLastText($value) + { + $this->lastText = $value; + } + + /** + * set the excluded query string from $_GET; + * + * @param array the lists of the query string keys + */ + + function setExcludedQueryString($values = array()) + { + $this->excludedQueryStrings = $values; + } + + function getExcludedQueryString() + { + return $this->excludedQueryStrings; + } + + + /** + * add extra query stiring to a url + * @param string $baseUrl + * @param string $extra the query string added to the base url + */ + function __appendQueryString($baseUrl, $extra) + { + $output = trim($baseUrl); + if(strpos($baseUrl, "?") !== false) + { + $output .= "&" . $extra; + }else + { + $output .= "?" . $extra; + } + return $output; + } + /** + * return the html + * + * @param integer $type + */ + function getPaginationHTML($type=1, $cssClass="pagination") + { + $output = ''; + $output .= "

\n"; + switch($type) + { + case "2": + $output .= "" . $this->getFirstItem() . " to " . $this->getLastItem() . " of " . $this->getTotal() . " results. "; + if($previousUrl = $this->getPreviousUrl()) + { + $output .= " " . $previousUrl; + } + + if($nextUrl = $this->getNextUrl()) + { + $output .= " " . $nextUrl; + } + break; + case 1: + //get full summary pagination + default: + $output .= "" . $this->getFirstItem() . "/" . $this->getLastItem() . " (" . $this->getTotal() . ") "; + if($firstUrl = $this->getFirstUrl()) + { + $output .= " " . $firstUrl; + } + if($previousUrl = $this->getPreviousUrl()) + { + $output .= " " . $previousUrl; + } + + if($groupUrls = $this->getGroupUrls()) + { + $output .= " " . $groupUrls; + } + if($nextUrl = $this->getNextUrl()) + { + $output .= " " . $nextUrl; + } + if($lastUrl = $this->getLastUrl()) + { + $output .= " " . $lastUrl; + } + $itemPerPage = ''; + $itemPerPage .= "\n"; + $output .= ""; + $output .= sprintf(PAGINATION_ITEMS_PER_PAGE, $itemPerPage); + $output .= ""; + $output .= " "; + } + + $output .= "

"; + return $output; + } + +} +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/class.search.php b/admin-dev/ajaxfilemanager/inc/class.search.php new file mode 100755 index 000000000..b26241a91 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.search.php @@ -0,0 +1,184 @@ +'', + 'mtime_to'=>'', + 'name'=>'', + 'size_from'=>'', + 'size_to'=>'', + 'recursive'=>'0', + + ); + var $sessionAction = null; + /** + * constructor + * + * @param string $rootFolder + */ + function __construct($rootFolder) + { + $this->rootFolder = $rootFolder; + $this->sessionAction = new SessionAction(); + $objRootFolder = new file($this->rootFolder); + $tem = $objRootFolder->getFileInfo(); + $obj = new manager($this->rootFolder, false); + $obj->setSessionAction($this->sessionAction); + $selectedDocuments = $this->sessionAction->get(); + $fileType = $obj->getFolderInfo($this->rootFolder); + + foreach($fileType as $k=>$v) + { + $tem[$k] = $v; + } + + $tem['path'] = backslashToSlash($this->rootFolder); + $tem['type'] = (is_dir($this->rootFolder)?'folder':'file'); + $tem['size'] = (is_dir($this->rootFolder)?'':transformFileSize(@filesize($this->rootFolder))); + //$tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']); + //$tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']); + $tem['flag'] = (array_search($tem['path'], $selectedDocuments) !== false?($this->sessionAction->getAction() == "copy"?'copyFlag':'cutFlag'):'noFlag'); + $tem['url'] = getFileUrl($this->rootFolder); + $tem['friendly_path'] = transformFilePath($this->rootFolder); + $tem['file'] = 0; + $tem['subdir'] = 0; + $manager = null; + $this->rootFolderInfo = $tem; + $tem = null; + } + + + + /** + * constructor + * + * @param string $rootFolder + */ + function Search($rootFolder) + { + $this->__construct($rootFolder); + } + + /** + * change the search keyword individually + * + * @param string $key + * @param string $value + */ + function addSearchKeyword($key, $value) + { + $this->searchkeywords[$key] = $value; + } + /** + * change the search keywords + * + * @param array $keywords + */ + function addSearchKeywords($keywords) + { + foreach($this->searchkeywords as $k=>$v) + { + if(array_key_exists($k, $keywords) !== false) + { + $this->searchkeywords[$k] = $keywords[$k]; + } + } + } + /** + * get the file according to the search keywords + * + */ + function doSearch($baseFolderPath = null) + { + + $baseFolderPath = addTrailingSlash(backslashToSlash((is_null($baseFolderPath)?$this->rootFolder:$baseFolderPath))); + + $dirHandler = @opendir($baseFolderPath); + if($dirHandler) + { + while(false !== ($file = readdir($dirHandler))) + { + if($file != '.' && $file != '..') + { + $path = $baseFolderPath . $file; + if(is_file($path)) + { + $isValid = true; + + $fileTime = @filemtime($path); + $fileSize = @filesize($path); + if($this->searchkeywords['name'] !== '' && @eregi($this->searchkeywords['name'], $file) === false) + { + $isValid = false; + } + if($this->searchkeywords['mtime_from'] != '' && $fileTime < @strtotime($this->searchkeywords['mtime_from'])) + { + $isValid = false; + } + if($this->searchkeywords['mtime_to'] != '' && $fileTime > @strtotime($this->searchkeywords['mtime_to'])) + { + $isValid = false; + } + if($this->searchkeywords['size_from'] != '' && $fileSize < @strtotime($this->searchkeywords['size_from'])) + { + $isValid = false; + } + if($this->searchkeywords['size_to'] != '' && $fileSize > @strtotime($this->searchkeywords['size_to'])) + { + $isValid = false; + } + if($isValid && isListingDocument($path)) + { + $finalPath = $path; + $objFile = new file($finalPath); + $tem = $objFile->getFileInfo(); + $obj = new manager($finalPath, false); + $obj->setSessionAction($this->sessionAction); + $selectedDocuments = $this->sessionAction->get(); + $fileType = $obj->getFileType($finalPath); + + foreach($fileType as $k=>$v) + { + $tem[$k] = $v; + } + + $tem['path'] = backslashToSlash($finalPath); + $tem['type'] = (is_dir($finalPath)?'folder':'file'); + $tem['size'] = transformFileSize($tem['size']); + $tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']); + $tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']); + $tem['flag'] = (array_search($tem['path'], $selectedDocuments) !== false?($this->sessionAction->getAction() == "copy"?'copyFlag':'cutFlag'):'noFlag'); + $tem['url'] = getFileUrl($tem['path']); + $this->rootFolderInfo['file']++; + $manager = null; + $this->files[] = $tem; + $tem = null; + } + }elseif(is_dir($path) && $this->searchkeywords['recursive']) + { + $this->Search($baseFolderPath); + } + } + } + } + closedir($dirHandler); + } + + function getFoundFiles() + { + return $this->files; + } + + function getRootFolderInfo() + { + + return $this->rootFolderInfo; + } + } +?> diff --git a/admin-dev/ajaxfilemanager/inc/class.session.php b/admin-dev/ajaxfilemanager/inc/class.session.php new file mode 100755 index 000000000..8fcf53c28 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.session.php @@ -0,0 +1,228 @@ +mkdir(CONFIG_SYS_DIR_SESSION_PATH)) + { + die('Unable to create session folder.'); + } + } + if(!$dir->isReadable(CONFIG_SYS_DIR_SESSION_PATH)) + { + die('Permission denied: ' . CONFIG_SYS_DIR_SESSION_PATH . " is not readable."); + } + if(!$dir->isWritable(CONFIG_SYS_DIR_SESSION_PATH)) + { + die('Permission denied: ' . CONFIG_SYS_DIR_SESSION_PATH . " is not writable."); + } + $this->dir = backslashToSlash(addTrailingSlash(CONFIG_SYS_DIR_SESSION_PATH)); + $this->lifeTime = get_cfg_var("session.gc_maxlifetime"); + $this->gcCounterFile = $this->dir . $this->gcCounterFileName; + $this->gcLogFile = $this->dir . $this->gcLogFileName; + $this->sessionDir = backslashToSlash($this->dir.session_id().DIRECTORY_SEPARATOR); +*/ + $this->init(); + } + /** + * constructor + * + */ + function Session() + { + $this->__construct(); + } + /** + * session init + * @return boolean + */ + function init() + { + + + + } + + function gc() + { + //init the counter file + $fp = @fopen($this->gcCounterFile, 'a+'); + if($fp) + { + $count = (int)(fgets($fp, 999999)) + 1; + if($count > $this->gcCounter || rand(0, 23) == date('h')) + { + $this->_gc(); + $count = 0; + } + @ftruncate($fp, 0); + if(!@fputs($fp, $count)) + { + die(SESSION_COUNTER_FILE_WRITE_FAILED); + } + @fclose($fp); + }else + { + die(SESSION_COUNTER_FILE_CREATE_FAILED); + } + } + + + function _gc() + { + //remove expired file from session folder + $dirHandler = @opendir($this->dir); + $output = ''; + $output .= "gc start at " . date('d/M/Y H:i:s') . "\n"; + $fo = new file(); + if($dirHandler) + { + while(false !== ($file = readdir($dirHandler))) + { + if($file != '.' && $file != '..' && $file != $this->gcCounterFileName && $file != $this->gcLogFileName && $file != session_id() ) + { + $path=$this->dir.$file; + $output .= $path ; + //check if this is a expired session file + if(filemtime($path) + $this->lifeTime < time()) + { + if($fo->delete($path)) + { + $output .= ' Deleted at ' . date('d/M/Y H:i:s'); + }else + { + $output .= " Failed at " . date('d/M/Y H:i:s'); + } + } + $output .= "\n"; + + } + } + if($this->debug) + { + $this->_log($output); + } + + @closedir($dirHandler); + + } + if(CONFIG_SYS_DEMO_ENABLE) + { + //remove expired files from uploaded folder + $dirHandler = @opendir(CONFIG_SYS_ROOT_PATH); + $output = ''; + $output .= "gc start at " . date('d/M/Y H:i:s') . "\n"; + $fo = new file(); + if($dirHandler) + { + while(false !== ($file = readdir($dirHandler))) + { + if($file != '.' && $file != '..') + { + $path=CONFIG_SYS_ROOT_PATH.$file; + $output .= $path ; + //check if this is a expired session file + if(filemtime($path) + $this->lifeTime < time()) + { + if($fo->delete($path)) + { + $output .= ' Deleted at ' . date('d/M/Y H:i:s'); + }else + { + $output .= " Failed at " . date('d/M/Y H:i:s'); + } + } + $output .= "\n"; + + } + } + if($this->debug) + { + $this->_log($output); + } + + @closedir($dirHandler); + + } + } + + } + /** + * log action taken by the gc + * + * @param unknown_type $msg + */ + function _log($msg) + { + $msg = "\n" . $msg; + $fp = @fopen($this->gcLogFile, 'w+'); + if($fp) + { + @ftruncate($fp, 0); + !@fputs($fp, $msg); + @fclose($fp); + } + } + + /** + * get the current session directory + * + * @return string return empty if failed + */ + function getSessionDir() + { + if(!file_exists($this->sessionDir) && !is_dir($this->sessionDir)) + { + $dir = new file(); + if(!$dir->mkdir($this->sessionDir)) + { + return ''; + } + }else + { + if(!@is_dir($this->sessionDir)) + { + return ''; + } + } + return $this->sessionDir; + } + + + +} +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/class.sessionaction.php b/admin-dev/ajaxfilemanager/inc/class.sessionaction.php new file mode 100755 index 000000000..486d1df50 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.sessionaction.php @@ -0,0 +1,93 @@ +actionIndex])) + { + $_SESSION[$this->actionIndex] = ''; + } + if(!isset($_SESSION[$this->selectedDocIndex]) || !is_array($_SESSION[$this->selectedDocIndex])) + { + $_SESSION[$this->selectedDocIndex] = array(); + } + if(!isset($_SESSION[$this->fromFolderIndex])) + { + $_SESSION[$this->fromFolderIndex] = ''; + } + } + + function SessionAction() + { + $this->__construct(); + } + /** + * count the number of selected documents + * + */ + function count() + { + return (isset($_SESSION[$this->selectedDocIndex])?sizeof($_SESSION[$this->selectedDocIndex]):0); + } + /** + * assign the selected documents + * + * @param array $selectedDocuments + */ + function set($selectedDocuments) + { + $_SESSION[$this->selectedDocIndex] = $selectedDocuments; + + } + /** + * get the selected documents + * @return array + */ + function get() + { + return (isset($_SESSION[$this->selectedDocIndex])?$_SESSION[$this->selectedDocIndex]:array()); + } + + function setAction($action) + { + $_SESSION[$this->actionIndex] = $action; + } + /** + * get the action + * + * @return unknown + */ + function getAction() + { + return (isset($_SESSION[$this->actionIndex])?$_SESSION[$this->actionIndex]:''); + } + /** + * set the folder + * + * @param string $folder + */ + function setFolder($folder) + { + $_SESSION[$this->fromFolderIndex] = $folder; + } + /** + * get the folder + * + * @return string + */ + function getFolder() + { + return (isset($_SESSION[$this->fromFolderIndex])?$_SESSION[$this->fromFolderIndex]:''); + } + } +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/class.upload.php b/admin-dev/ajaxfilemanager/inc/class.upload.php new file mode 100755 index 000000000..58979c6ad --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/class.upload.php @@ -0,0 +1,589 @@ +'the file uploaded with success', + 1=>'The uploaded file exceeds the upload_max_filesize directive in php.ini', + 2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', + 3=>'The uploaded file was only partially uploaded', + 4=>'No file was uploaded.', + 6=>'Missing a temporary folder', + 7=>'Failed to write file to disk', + 8=>'File upload stopped by extension', + 999=>'No error code avaiable', + ); + + + function Upload() + { + //doing nothing + } + + function isFileUploaded($indexInPost="file") + { + + $this->errCode = isset($_FILES[$indexInPost]['error'])?$_FILES[$indexInPost]['error']:999; + if((isset($_FILES[$indexInPost]['error']) && $_FILES[$indexInPost] == 0) || + (!empty($_FILES[$indexInPost]['tmp_name']) && $_FILES[$indexInPost]['tmp_name'] != 'none') + ) + { + $this->_value = $_FILES[$indexInPost]; + $this->fileSize = @filesize($this->_value['tmp_name']); + $this->originalFileName = $this->_value['name']; + $this->fileType = $this->_value['type']; + + return true; + }else + { + + array_push($this->errors, 'Unable to upload file'); + return false; + } + } + + function getErrorCodeMsg() + { + return (isset($this->errorCodes[$this->errCode])?$this->errorCodes[$this->errCode]:""); + } + /** + * check if the uploaded file extension is allowed against the validFile Extension + * or against the invalid extension list when the list of valid file extension is not set + * + * @param array $validFileExt + * @return boolean + */ + function isPermittedFileExt($validFileExt = array()) + { + $tem = array(); + + if(sizeof($validFileExt)) + { + foreach($validFileExt as $k=>$v) + { + $tem[$k] = strtolower(trim($v)); + } + } + $validFileExt = $tem; + + if(sizeof($validFileExt) && sizeof($this->invalidFileExt)) + { + foreach($validFileExt as $k=>$ext) + { + if(array_search(strtolower($ext), $this->invalidFileExt) !== false) + { + unset($validFileExt[$k]); + } + } + } + + + + + if(sizeof($validFileExt)) + { + if(array_search(strtolower($this->getFileExt()), $validFileExt) !== false) + { + return true; + } + }elseif(array_search(strtolower($this->getFileExt()), $this->invalidFileExt) === false) + { + return true; + } + + + $this->deleteUploadedFile(); + return false; + + } + /** + * check if the uploaded file size is too big + * + * @param integer $maxSize + */ + function isSizeTooBig($maxSize="") + { + if($this->fileSize > $maxSize) + { + $this->deleteUploadedFile(); + return true; + }else + { + return false; + } + } + /** + * set the invali file extensions + * + * @param array $invalidFileExt + */ + function setInvalidFileExt($invalidFileExt=array()) + { + $tem = array(); + if(sizeof($invalidFileExt)) + { + foreach($invalidFileExt as $k=>$v) + { + $tem[$k]= strtolower(trim($v)); + } + } + + $this->invalidFileExt = $tem; + } + /** + * get file type + * + * @return string + */ + function getFileType() + { + return $this->fileType; + } + /** + * get a file extension + * + * @param string $fileName the path to a file or just the file name + */ + function getFileExt() + { + //return strtolower(substr(strrchr($this->fileName, "."), 1)); + return substr(strrchr($this->originalFileName, "."), 1); + } + /** + * move the uploaded file to a specific location + * + * @param string $dest the path to the directory which the uploaded file will be moved to + * @param string $fileBaseName the base name which the uploaded file will be renamed to + * @param unknown_type $overwrite + * @return unknown + */ + function moveUploadedFile($dest, $fileBaseName = '', $overwrite=false) + { + + //ensure the directory path ending with / + if ($dest != '' && substr($dest, -1) != '/') { + $dest .= '/'; + } + $this->dirPath = $dest; + $fileName = basename($this->_value['name']); + + $dotIndex = strrpos($fileName, '.'); + $this->fileExtension = ''; + if(is_int($dotIndex)) + { + $this->fileExtension = substr($fileName, $dotIndex); + $this->fileBaseName = substr($fileName, 0, $dotIndex); + } + if(!empty($fileBaseName)) + { + $this->fileBaseName = $fileBaseName; + } + $fileName = $this->fileBaseName . $this->fileExtension; + $filePath = $dest . $fileName; + + if(!$overwrite && file_exists($filePath) && is_file($filePath)) + {//rename + + $counter = 0; + while(file_exists($dest.$fileName) && is_file($dest .$fileName)) + { + $counter++; + $fileName = $this->fileBaseName.'_'.$counter.$this->fileExtension; + } + $this->fileBaseName .= "_" . $counter; + + } + if (@move_uploaded_file($this->_value['tmp_name'], $dest . $fileName)) { + @chmod($dest . $fileName, $this->uploadFileMode); + $this->fileName = $fileName; + $this->filePath = $dest . $fileName; + return true; + } else { + return false; + } + } + + + /** + * check if the uploaded is permitted to upload + * + * @param mixed $invalidImageExts invalid image extension + * @param bool $delete force to delete the uploaded file + */ + function isImage($invalidImageExts = array(), $delete = true) + { + if(!is_array($invalidImageExts) && !empty($invalidImageExts)) + { + $invalidImageExts = explode(",", $invalidImageExts); + } + foreach ($invalidImageExts as $k=>$v) + { + $invalidImageExts[$k] = strtolower(trim($v)); + } + foreach ($this->validImageExts as $k=>$v) + { + $ValidImageExts[$k] = strtolower(trim($v)); + } + if(sizeof($invalidImageExts)) + { + foreach ($ValidImageExts as $k=>$v) + { + if(array_search(strtolower($v), $invalidImageExts) !== false) + { + unset($ValidImageExts[$k]); + } + } + } + if(array_search(strtolower($this->getFileExt()), $ValidImageExts)!==false) + { + $this->_get_image_details($this->filePath); + if(!empty($this->fileType)) + { + return true; + } + }else + { + if($delete) + { + $this->deleteUploadedFile(); + } + } + + array($this->errors, "This file is not a image type file."); + return false; + } + + /** + * Resize the Image in the X and/or Y direction + * If either is 0 it will be scaled proportionally + * + * @access public + * + * @param mixed $new_x + * @param mixed $new_y + * @param string $thumb_suffix + * + * @return mixed none or PEAR_error + */ + function resize($filePath, $thumb_suffix="", $new_x = 0, $new_y = 0) + { + + if(empty($filePath)) + { + $filePath = $this->dirPath . $this->fileBaseName . $thumb_suffix . $this->fileExtension; + } + // 0 means keep original size + if ($this->img_x > $this->img_y) + $new_y = (int)($new_y/$this->img_x*$this->img_y); + else if ($this->img_y > $this->img_x) + $new_x = (int)($new_x/$this->img_y*$this->img_x); + // Now do the library specific resizing. + return $this->_resize($filePath,$new_x, $new_y); + } // End resize + + /** + * resize the image and return the thumbnail image details array("width"=>, "height"=>, "name") + * + * @param string $fileName + * @param int $new_x the thumbnail width + * @param int $new_y the thumbnail height + * @return unknown + */ + function _resize($fileName, $new_x, $new_y) { + $functionName = 'ImageCreateFrom' . $this->fileType; + + + if(function_exists($functionName)) + { + $this->imgHandler = $functionName($this->filePath); + }else + { + array_push($this->errors, $functionName . " function is unavailable"); + return false; + } + + if(function_exists('ImageCreateTrueColor')){ + $new_img =ImageCreateTrueColor($new_x,$new_y); + } else { + $new_img =ImageCreate($new_x,$new_y); + } + if(function_exists('ImageCopyResampled')){ + ImageCopyResampled($new_img, $this->imgHandler, 0, 0, 0, 0, $new_x, $new_y, $this->img_x, $this->img_y); + } else { + ImageCopyResized($new_img, $this->imgHandler, 0, 0, 0, 0, $new_x, $new_y, $this->img_x, $this->img_y); + } + if($this->_imageSave($new_img, $fileName, 80)) + { + return array("width"=>$new_x, "height"=>$new_y, "name"=>basename($fileName)); + }else + { + + array_push($this->errors, "Unable to resize the image"); + return false; + } + + } + /** + * save the thumbnail file and destroy the opened image + * + * @param resource $newImageHandler + * @param string $fileName + * @param int $quality + * @return boolean + */ + function _imageSave($newImageHandler, $fileName, $quality = 90) + { + $functionName = 'image' . $this->fileType; + if($functionName($newImageHandler, $fileName, $quality)) + { + imagedestroy($newImageHandler); + return true; + }else + { + imagedestroy($newImageHandler); + array_push($this->errors, "Unable to save the thumbnail file."); + return false; + } + + } + /** + * + * @access public + * @return void + */ + function _get_image_details($image) + { + + //echo $image; + $data = @GetImageSize($image); + #1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order, + # 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC + if (is_array($data)){ + switch($data[2]){ + case 1: + $type = 'gif'; + break; + case 2: + $type = 'jpeg'; + break; + case 3: + $type = 'png'; + break; + case 4: + $type = 'swf'; + break; + case 5: + $type = 'psd'; + case 6: + $type = 'bmp'; + case 7: + case 8: + $type = 'tiff'; + default: + array_push($this->errors, "We do not recognize this image format"); + + } + $this->img_x = $data[0]; + $this->img_y = $data[1]; + $this->fileType = $type; + + return true; + } else { + array_push($this->errors, "Cannot fetch image or images details."); + return null; + } + } + /** + * caculate the thumbnail details from the original image file + * + * @param string $originalImageName + * @param int $originaleImageWidth + * @param int $originalImageHeight + * @param string $thumbnailSuffix + * @param int $thumbnailWidth + * @param int $thumbnailHeight + * @return array array("name"=>"image name", "width"=>"image width", "height"=>"image height") + */ + function getThumbInfo($originalImageName, $originaleImageWidth, $originalImageHeight, $thumbnailSuffix, $thumbnailWidth, $thumbnailHeight) + { + $outputs = array("name"=>"", "width"=>0, "height"=>0); + $thumbnailWidth = (int)($thumbnailWidth); + $thumbnailHeight = (int)($thumbnailHeight); + if(!empty($originalImageName) && !empty($originaleImageWidth) && !empty($originalImageHeight)) + { + $dotIndex = strrpos($originalImageName, '.'); + //begin to get the thumbnail image name + $fileExtension = ''; + $fileBaseName = ''; + if(is_int($dotIndex)) + { + $fileExtension = substr($originalImageName, $dotIndex); + $fileBaseName = substr($originalImageName, 0, $dotIndex); + } + $outputs['name'] = $fileBaseName . $thumbnailSuffix . $fileExtension; + //start to get the thumbnail width & height + if($thumbnailWidth < 1 && $thumbnailHeight < 1) + { + $thumbnailWidth =$originaleImageWidth; + $thumbnailHeight = $originalImageHeight; + }elseif($thumbnailWidth < 1) + { + $thumbnailWidth = floor($thumbnailHeight / $originalImageHeight * $originaleImageWidth); + + }elseif($thumbnailHeight < 1) + { + $thumbnailHeight = floor($thumbnailWidth / $originaleImageWidth * $originalImageHeight); + }else + { + $scale = min($thumbnailWidth/$originaleImageWidth, $thumbnailHeight/$originalImageHeight); + $thumbnailWidth = floor($scale*$originaleImageWidth); + $thumbnailHeight = floor($scale*$originalImageHeight); + } + $outputs['width'] = $thumbnailWidth; + $outputs['height'] = $thumbnailHeight; + } + return $outputs; + + } + + + /** + * get the uploaded file + */ + function deleteUploadedFile() + { + @unlink($this->filePath); + } + /** + * destroy the tmp file + * + */ + function finish() + { + @unlink($this->_value['tmp_name']); + } + + function displayError() + { + if(sizeof($this->errors)) + { + echo "
";
+			print_r($this->errors);
+			echo "
"; + } + } + /** + * get the path which the file uploaded to + * + */ + function getFilePath() + { + return $this->filePath; + } + /** + * return the directory path witch the file uploaded to + * + * @return unknown + */ + function getDirPath() + { + return $this->dirPath; + } + + function getFileBaseName() + { + return $this->fileBaseName; + } + + function getFileName() + { + return $this->fileName; + } + /** + * get image width + * + * @return integer + */ + function getImageWidth() + { + return $this->img_x; + } + /** + * get image height + * + * @return integer + */ + function getImageHeight() + { + return $this->img_y; + } + /** + * get uploaded file size + * + * @return string + */ + function getFileSize() + { + return $this->fileSize; + } + /** + * delete the uploaded image file & associated thumnails + * + * @param string $dirPath + * @param string $originalImageName + * @param string $arrayThumbnailSuffix + */ + function deleteFileAndThumbs($dirPath, $originalImageName, $arrayThumbnailSuffix) + { + //ensure the directory path ending with / + if ($dirPath != '' && substr($dirPath, -1) != '/') { + $dirPath .= '/'; + } + if(!empty($originalImageName) && file_exists($dirPath . $originalImageName) && is_file($dirPath . $originalImageName)) + { + @unlink($dirPath . $originalImageName); + foreach($arrayThumbnailSuffix as $v) + { + $dotIndex = strrpos($originalImageName, '.'); + //begin to get the thumbnail image name + $fileExtension = ''; + $fileBaseName = ''; + if(is_int($dotIndex)) + { + $fileExtension = substr($originalImageName, $dotIndex); + $fileBaseName = substr($originalImageName, 0, $dotIndex); + } + @unlink($dirPath . $fileBaseName . $v . $fileExtension); + } + } + + + } +} +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/config.base.php b/admin-dev/ajaxfilemanager/inc/config.base.php new file mode 100755 index 000000000..28155f21e --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/config.base.php @@ -0,0 +1,135 @@ + false + * by session => true + */ + define('CONFIG_ACCESS_CONTROL_MODE', false); + define("CONFIG_LOGIN_USERNAME", 'sdfgdfgdfgdgfdgsdfsdfg3454dsfb5e'); + define('CONFIG_LOGIN_PASSWORD', 'ASDF@#%JHGSDFGasdkjfh3812764ksdjfbhkjxcf'); + define('CONFIG_LOGIN_PAGE', 'ajax_login.php'); //the url to the login page + + + //SYSTEM MODE CONFIG + /** + * turn it on when you have this system for demo purpose + * that means changes made to each image is not physically applied to it + * and all uploaded files/created folders will be removed automatically + */ + define('CONFIG_SYS_DEMO_ENABLE', false); + define('CONFIG_SYS_VIEW_ONLY', false); //diabled the system, view only + define('CONFIG_SYS_THUMBNAIL_VIEW_ENABLE', true);//REMOVE THE thumbnail view if false + + //User Permissions + define('CONFIG_OPTIONS_DELETE', true); + define('CONFIG_OPTIONS_CUT', true); + define('CONFIG_OPTIONS_COPY', true); + define('CONFIG_OPTIONS_NEWFOLDER', true); + define('CONFIG_OPTIONS_RENAME', true); + define('CONFIG_OPTIONS_UPLOAD', true); // + define('CONFIG_OPTIONS_EDITABLE', true); //disable image editor and text editor + //FILESYSTEM CONFIG + /* + * CONFIG_SYS_DEFAULT_PATH is the default folder where the files would be uploaded to + and it must be a folder under the CONFIG_SYS_ROOT_PATH or the same folder + these two paths accept relative path only, don't use absolute path + */ + //check if folder exist + if (!is_dir('../../img/cms')) + mkdir('../../img/cms'); + + define('CONFIG_SYS_DEFAULT_PATH', '../../img/cms'); //accept relative path only + define('CONFIG_SYS_ROOT_PATH', '../../img/cms'); //accept relative path only + define('CONFIG_SYS_FOLDER_SHOWN_ON_TOP', true); //show your folders on the top of list if true or order by name + define("CONFIG_SYS_DIR_SESSION_PATH", 'session/'); + define("CONFIG_SYS_PATTERN_FORMAT", 'list'); //three options: reg ,csv, list, this option define the parttern format for the following patterns + /** + * reg => regulare expression + * csv => a list of comma separated file/folder name, (exactly match the specified file/folders) + * list => a list of comma spearated vague file/folder name (partially match the specified file/folders) + * + */ + //more details about regular expression please visit http://nz.php.net/manual/en/function.eregi.php + define('CONFIG_SYS_INC_DIR_PATTERN', ''); //force listing of folders with such pattern(s). separated by , if multiple + define('CONFIG_SYS_EXC_DIR_PATTERN', 'CVS'); //will prevent listing of folders with such pattern(s). separated by , if multiple + define('CONFIG_SYS_INC_FILE_PATTERN', ''); //force listing of fiels with such pattern(s). separated by , if multiple + define('CONFIG_SYS_EXC_FILE_PATTERN', ''); //will prevent listing of files with such pattern(s). separated by , if multiple + define('CONFIG_SYS_DELETE_RECURSIVE', 1); //delete all contents within a specific folder if set to be 1 + + //UPLOAD OPTIONS CONFIG + define('CONFIG_UPLOAD_MAXSIZE', 5000 * 1024 ); //by bytes + //define('CONFIG_UPLOAD_MAXSIZE', 2048); //by bytes + //define('CONFIG_UPLOAD_VALID_EXTS', 'txt');// + + define('CONFIG_EDITABLE_VALID_EXTS', 'txt,htm,html,xml,js,css'); //make you include all these extension in CONFIG_UPLOAD_VALID_EXTS if you want all valid + + define('CONFIG_OVERWRITTEN', false); //overwirte when processing paste + define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png');// // + //define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,bmp,tif,zip,sit,rar,gz,tar,htm,html,mov,mpg,avi,asf,mpeg,wmv,aif,aiff,wav,mp3,swf,ppt,rtf,doc,pdf,xls,txt,xml,xsl,dtd');// + define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,jpg,png'); + //define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // + define('CONFIG_UPLOAD_INVALID_EXTS', ''); + + //Preview + define('CONFIG_IMG_THUMBNAIL_MAX_X', 100); + define('CONFIG_IMG_THUMBNAIL_MAX_Y', 100); + define('CONFIG_THICKBOX_MAX_WIDTH', 700); + define('CONFIG_THICKBOX_MAX_HEIGHT', 430); + + + /** + * CONFIG_URL_PREVIEW_ROOT was replaced by CONFIG_WEBSITE_DOCUMENT_ROOT since v0.8 + * Normally, you don't need to bother with CONFIG_WEBSITE_DOCUMENT_ROOT + * Howerver, some Web Hosts do not have standard php.ini setting + * which you will find the file manager can not locate your files correctly + * if you do have such issue, please change it to fit your system. + * so what should you to do get it + * 1. create a php script file (let's call it document_root.php) + * 2. add the following codes in in + * + * 3. upload document_root.php to you website root folder which will only be reached when you visit http://www.domain-name.com or http://localhost/ at localhost computer + * 4. run it via http://www.domain-name.com/document_root.php or http://localhost/docuent_root.php if localhost computer, the url has to be exactly like that + * 5. the value shown on the screen is CONFIG_WEBSITE_DOCUMENT_ROOT should be + * 6. enjoy it + + + * + */ + + + define('CONFIG_WEBSITE_DOCUMENT_ROOT', ''); + //theme related setting + /* + * options avaialbe for CONFIG_EDITOR_NAME are: + stand_alone + tinymce + fckeditor + */ + //CONFIG_EDITOR_NAME replaced CONFIG_THEME_MODE since @version 0.8 + define('CONFIG_EDITOR_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['editor'])?secureFileName($_GET['editor']):'tinymce')); + define('CONFIG_THEME_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['theme'])?secureFileName($_GET['theme']):'default')); //change the theme to your custom theme rather than default + define('CONFIG_DEFAULT_VIEW', (CONFIG_SYS_THUMBNAIL_VIEW_ENABLE?'detail':'detail')); //thumnail or detail + define('CONFIG_DEFAULT_PAGINATION_LIMIT', 10); + define('CONFIG_LOAD_DOC_LATTER', false); //all documents will be loaded up after the template has been loaded to the client + + //General Option Declarations + //LANGAUGAE DECLARATIONNS + define('CONFIG_LANG_INDEX', 'language'); //the index in the session + define('CONFIG_LANG_DEFAULT', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['language']) && file_exists(DIR_LANG . secureFileName($_GET['language']) . '.php')?secureFileName($_GET['language']):'en')); //change it to be your language file base name, such en +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/config.php b/admin-dev/ajaxfilemanager/inc/config.php new file mode 100755 index 000000000..2f30ed245 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/config.php @@ -0,0 +1,107 @@ + + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "class.auth.php"); + define('CONFIG_QUERY_STRING_ENABLE', true); //Enable passed query string to setting the system configuration + if(!isset($_SESSION)) + { + session_start(); + } + if(!headers_sent()) + { + header('Content-Type: text/html; charset=utf-8'); + } + + /** + * secure file name which retrieve from query string + * + * @param string $input + * @return string + */ + function secureFileName($input) + { + return preg_replace('/[^a-zA-Z0-9\-_]/', '', $input); + } + //Directories Declarations + + define('DIR_AJAX_ROOT', dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR) ; // the path to ajax file manager + define('DIR_AJAX_INC', DIR_AJAX_ROOT . "inc" . DIRECTORY_SEPARATOR); + define('DIR_AJAX_CLASSES', DIR_AJAX_ROOT . "classes" . DIRECTORY_SEPARATOR); + define("DIR_AJAX_LANGS", DIR_AJAX_ROOT . "langs" . DIRECTORY_SEPARATOR); + define('DIR_AJAX_JS', DIR_AJAX_ROOT . 'jscripts' . DIRECTORY_SEPARATOR); + define('DIR_AJAX_EDIT_AREA', DIR_AJAX_JS . 'edit_area' . DIRECTORY_SEPARATOR); + define('DIR_LANG', DIR_AJAX_ROOT . 'langs' . DIRECTORY_SEPARATOR); + + + //Class Declarations + define('CLASS_FILE', DIR_AJAX_INC .'class.file.php'); + define("CLASS_UPLOAD", DIR_AJAX_INC . 'class.upload.php'); + define('CLASS_MANAGER', DIR_AJAX_INC . 'class.manager.php'); + define('CLASS_IMAGE', DIR_AJAX_INC . "class.image.php"); + define('CLASS_HISTORY', DIR_AJAX_INC . "class.history.php"); + define('CLASS_SESSION_ACTION', DIR_AJAX_INC . "class.sessionaction.php"); + define('CLASS_PAGINATION', DIR_AJAX_INC . 'class.pagination.php'); + define('CLASS_SEARCH', DIR_AJAX_INC . "class.search.php"); + //SCRIPT FILES declarations + define('SPT_FUNCTION_BASE', DIR_AJAX_INC . 'function.base.php'); + //include different config base file according to query string "config" + $configBaseFileName = 'config.base.php'; + + if(CONFIG_QUERY_STRING_ENABLE && !empty($_GET['config']) && file_exists(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'config.' . secureFileName($_GET['config']) . ".php") + { + $configBaseFileName = 'config.' . secureFileName($_GET['config']) . ".php"; + } + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . $configBaseFileName); + + + require_once(DIR_AJAX_LANGS . CONFIG_LANG_DEFAULT . ".php"); + require_once(DIR_AJAX_INC . "function.base.php"); + + require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "class.session.php"); + $session = new Session(); + $auth = new Auth(); + + if(CONFIG_ACCESS_CONTROL_MODE == 1) + {//access control enabled + if(!$auth->isLoggedIn() && strtolower(basename($_SERVER['PHP_SELF']) != strtolower(basename(CONFIG_LOGIN_PAGE)))) + {// + header('Location: ' . appendQueryString(CONFIG_LOGIN_PAGE, makeQueryString())); + exit; + } + } + addNoCacheHeaders(); + //URL Declartions + define('CONFIG_URL_IMAGE_PREVIEW', 'ajax_image_preview.php'); + define('CONFIG_URL_CREATE_FOLDER', 'ajax_create_folder.php'); + define('CONFIG_URL_DELETE', 'ajax_delete_file.php'); + define('CONFIG_URL_HOME', 'ajaxfilemanager.php'); + define("CONFIG_URL_UPLOAD", 'ajax_file_upload.php'); + define('CONFIG_URL_PREVIEW', 'ajax_preview.php'); + define('CONFIG_URL_SAVE_NAME', 'ajax_save_name.php'); + define('CONFIG_URL_IMAGE_EDITOR', 'ajax_image_editor.php'); + define('CONFIG_URL_IMAGE_SAVE', 'ajax_image_save.php'); + define('CONFIG_URL_IMAGE_RESET', 'ajax_editor_reset.php'); + define('CONFIG_URL_IMAGE_UNDO', 'ajax_image_undo.php'); + define('CONFIG_URL_CUT', 'ajax_file_cut.php'); + define('CONFIG_URL_COPY', 'ajax_file_copy.php'); + define('CONFIG_URL_LOAD_FOLDERS', '_ajax_load_folders.php'); + + define('CONFIG_URL_DOWNLOAD', 'ajax_download.php'); + define('CONFIG_URL_TEXT_EDITOR', 'ajax_text_editor.php'); + define('CONFIG_URL_GET_FOLDER_LIST', 'ajax_get_folder_listing.php'); + define('CONFIG_URL_SAVE_TEXT', 'ajax_save_text.php'); + define('CONFIG_URL_LIST_LISTING', 'ajax_get_file_listing.php'); + define('CONFIG_URL_IMG_THUMBNAIL', 'ajax_image_thumbnail.php'); + define('CONFIG_URL_FILEnIMAGE_MANAGER', 'ajaxfilemanager.php'); + define('CONFIG_URL_FILE_PASTE', 'ajax_file_paste.php'); + + +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/config.tinymce.php b/admin-dev/ajaxfilemanager/inc/config.tinymce.php new file mode 100755 index 000000000..53b1e611c --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/config.tinymce.php @@ -0,0 +1,131 @@ + false + * by session => true + */ + define('CONFIG_ACCESS_CONTROL_MODE', false); + define("CONFIG_LOGIN_USERNAME", 'ajax'); + define('CONFIG_LOGIN_PASSWORD', '123456'); + define('CONFIG_LOGIN_PAGE', 'ajax_login.php'); //the url to the login page + + //SYSTEM MODE CONFIG + /** + * turn it on when you have this system for demo purpose + * that means changes made to each image is not physically applied to it + * and all uploaded files/created folders will be removed automatically + */ + define('CONFIG_SYS_DEMO_ENABLE', false); + define('CONFIG_SYS_VIEW_ONLY', false); //diabled the system, view only + define('CONFIG_SYS_THUMBNAIL_VIEW_ENABLE', true);//REMOVE THE thumbnail view if false + + //User Permissions + define('CONFIG_OPTIONS_DELETE', true); + define('CONFIG_OPTIONS_CUT', true); + define('CONFIG_OPTIONS_COPY', true); + define('CONFIG_OPTIONS_NEWFOLDER', true); + define('CONFIG_OPTIONS_RENAME', true); + define('CONFIG_OPTIONS_UPLOAD', true); // + define('CONFIG_OPTIONS_EDITABLE', true); //disable image editor and text editor + //FILESYSTEM CONFIG + /* + * CONFIG_SYS_DEFAULT_PATH is the default folder where the files would be uploaded to + and it must be a folder under the CONFIG_SYS_ROOT_PATH or the same folder + these two paths accept relative path only, don't use absolute path + */ + + define('CONFIG_SYS_DEFAULT_PATH', '../uploaded/'); //accept relative path only + define('CONFIG_SYS_ROOT_PATH', '../uploaded/'); //accept relative path only + define('CONFIG_SYS_FOLDER_SHOWN_ON_TOP', true); //show your folders on the top of list if true or order by name + define("CONFIG_SYS_DIR_SESSION_PATH", 'session/'); + define("CONFIG_SYS_PATTERN_FORMAT", 'list'); //three options: reg ,csv, list, this option define the parttern format for the following patterns + /** + * reg => regulare expression + * csv => a list of comma separated file/folder name, (exactly match the specified file/folders) + * list => a list of comma spearated vague file/folder name (partially match the specified file/folders) + * + */ + //more details about regular expression please visit http://nz.php.net/manual/en/function.eregi.php + define('CONFIG_SYS_INC_DIR_PATTERN', ''); //force listing of folders with such pattern(s). separated by , if multiple + define('CONFIG_SYS_EXC_DIR_PATTERN', ''); //will prevent listing of folders with such pattern(s). separated by , if multiple + define('CONFIG_SYS_INC_FILE_PATTERN', ''); //force listing of fiels with such pattern(s). separated by , if multiple + define('CONFIG_SYS_EXC_FILE_PATTERN', ''); //will prevent listing of files with such pattern(s). separated by , if multiple + define('CONFIG_SYS_DELETE_RECURSIVE', 1); //delete all contents within a specific folder if set to be 1 + + //UPLOAD OPTIONS CONFIG + define('CONFIG_UPLOAD_MAXSIZE', 5000 * 1024 ); //by bytes + //define('CONFIG_UPLOAD_MAXSIZE', 2048); //by bytes + //define('CONFIG_UPLOAD_VALID_EXTS', 'txt');// + + define('CONFIG_EDITABLE_VALID_EXTS', 'txt,htm,html,xml,js,css'); //make you include all these extension in CONFIG_UPLOAD_VALID_EXTS if you want all valid + + define('CONFIG_OVERWRITTEN', false); //overwirte when processing paste + define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // + //define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,bmp,tif,zip,sit,rar,gz,tar,htm,html,mov,mpg,avi,asf,mpeg,wmv,aif,aiff,wav,mp3,swf,ppt,rtf,doc,pdf,xls,txt,xml,xsl,dtd');// + define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,bmp,txt,jpg,png,tif,html,htm,js,css,xml,xsl,dtd,mp3,wav,wmv,wma,rm,rmvb,mov,swf'); + //define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // + define('CONFIG_UPLOAD_INVALID_EXTS', ''); + + //Preview + define('CONFIG_IMG_THUMBNAIL_MAX_X', 100); + define('CONFIG_IMG_THUMBNAIL_MAX_Y', 100); + define('CONFIG_THICKBOX_MAX_WIDTH', 700); + define('CONFIG_THICKBOX_MAX_HEIGHT', 430); + + + /** + * CONFIG_URL_PREVIEW_ROOT was replaced by CONFIG_WEBSITE_DOCUMENT_ROOT since v0.8 + * Normally, you don't need to bother with CONFIG_WEBSITE_DOCUMENT_ROOT + * Howerver, some Web Hosts do not have standard php.ini setting + * which you will find the file manager can not locate your files correctly + * if you do have such issue, please change it to fit your system. + * so what should you to do get it + * 1. create a php script file (let's call it document_root.php) + * 2. add the following codes in in + * + * 3. upload document_root.php to you website root folder which will only be reached when you visit http://www.domain-name.com or http://localhost/ at localhost computer + * 4. run it via http://www.domain-name.com/document_root.php or http://localhost/docuent_root.php if localhost computer, the url has to be exactly like that + * 5. the value shown on the screen is CONFIG_WEBSITE_DOCUMENT_ROOT should be + * 6. enjoy it + + + * + */ + + + define('CONFIG_WEBSITE_DOCUMENT_ROOT', ''); + //theme related setting + /* + * options avaialbe for CONFIG_EDITOR_NAME are: + stand_alone + tinymce + fckeditor + */ + //CONFIG_EDITOR_NAME replaced CONFIG_THEME_MODE since @version 0.8 + define('CONFIG_EDITOR_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['editor'])?secureFileName($_GET['editor']):'stand_alone')); + define('CONFIG_THEME_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['theme'])?secureFileName($_GET['theme']):'default')); //change the theme to your custom theme rather than default + define('CONFIG_DEFAULT_VIEW', (CONFIG_SYS_THUMBNAIL_VIEW_ENABLE?'detail':'detail')); //thumnail or detail + define('CONFIG_DEFAULT_PAGINATION_LIMIT', 10); + define('CONFIG_LOAD_DOC_LATTER', false); //all documents will be loaded up after the template has been loaded to the client + + //General Option Declarations + //LANGAUGAE DECLARATIONNS + define('CONFIG_LANG_INDEX', 'language'); //the index in the session + define('CONFIG_LANG_DEFAULT', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['language']) && file_exists(DIR_LANG . secureFileName($_GET['language'] . '.php'))?secureFileName($_GET['language']):'en')); //change it to be your language file base name, such en +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/data.php b/admin-dev/ajaxfilemanager/inc/data.php new file mode 100755 index 000000000..e0d9ddd53 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/data.php @@ -0,0 +1,8 @@ +
Array
+(
+    [currentFolderPath] => ../uploaded/
+    [new_folder] => Test
+)
+
+ +22/Sep/2008 13:17:12 \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/inc/function.base.php b/admin-dev/ajaxfilemanager/inc/function.base.php new file mode 100755 index 000000000..0a07df367 --- /dev/null +++ b/admin-dev/ajaxfilemanager/inc/function.base.php @@ -0,0 +1,1225 @@ +$v) + { + if(array_search($k, $excls) ===false) + { + $strAppend = "&"; + if($count == 1) + { + $strAppend = "?"; + $count++; + } + $output .= $strAppend . $k . "=" . $v; + } + } + return htmlspecialchars($output); + } + +/** + * print out an array + * + * @param array $array + */ +function displayArray($array, $comments="") +{ + echo "
";
+	echo $comments;
+	print_r($array);
+	echo $comments;
+	echo "
"; +} + + + + /** + * check if a file extension is permitted + * + * @param string $filePath + * @param array $validExts + * @param array $invalidExts + * @return boolean + */ + function isValidExt($filePath, $validExts, $invalidExts=array()) + { + $tem = array(); + + if(sizeof($validExts)) + { + foreach($validExts as $k=>$v) + { + $tem[$k] = strtolower(trim($v)); + } + } + $validExts = $tem; + $tem = array(); + if(sizeof($invalidExts)) + { + foreach($invalidExts as $k=>$v) + { + $tem[$k] = strtolower(trim($v)); + } + } + $invalidExts = $tem; + if(sizeof($validExts) && sizeof($invalidExts)) + { + foreach($validExts as $k=>$ext) + { + if(array_search($ext, $invalidExts) !== false) + { + unset($validExts[$k]); + } + } + } + if(sizeof($validExts)) + { + if(array_search(strtolower(getFileExt($filePath)), $validExts) !== false) + { + return true; + }else + { + return false; + } + }elseif(array_search(strtolower(getFileExt($filePath)), $invalidExts) === false) + { + return true; + }else + { + return false; + } + } + + + + + +/** + * transform file relative path to absolute path + * @param string $value the path to the file + * @return string + */ +function relToAbs($value) +{ + return backslashToSlash(preg_replace("/(\\\\)/","\\", getRealPath($value))); + +} + + function getRelativeFileUrl($value, $relativeTo) + { + $output = ''; + $wwwroot = removeTrailingSlash(backslashToSlash(getRootPath())); + $urlprefix = ""; + $urlsuffix = ""; + $value = backslashToSlash(getRealPath($value)); + $pos = strpos($value, $wwwroot); + if ($pos !== false && $pos == 0) + { + $output = $urlprefix . substr($value, strlen($wwwroot)) . $urlsuffix; + } + } +/** + * replace slash with backslash + * + * @param string $value the path to the file + * @return string + */ +function slashToBackslash($value) { + return str_replace("/", DIRECTORY_SEPARATOR, $value); +} + +/** + * replace backslash with slash + * + * @param string $value the path to the file + * @return string + */ +function backslashToSlash($value) { + return str_replace(DIRECTORY_SEPARATOR, "/", $value); +} + +/** + * removes the trailing slash + * + * @param string $value + * @return string + */ +function removeTrailingSlash($value) { + if(preg_match('@^.+/$@i', $value)) + { + $value = substr($value, 0, strlen($value)-1); + } + return $value; +} + +/** + * append a trailing slash + * + * @param string $value + * @return string + */ +function addTrailingSlash($value) +{ + if(preg_match('@^.*[^/]{1}$@i', $value)) + { + $value .= '/'; + } + return $value; +} + +/** + * transform a file path to user friendly + * + * @param string $value + * @return string + */ +function transformFilePath($value) { + $rootPath = addTrailingSlash(backslashToSlash(getRealPath(CONFIG_SYS_ROOT_PATH))); + $value = addTrailingSlash(backslashToSlash(getRealPath($value))); + if(!empty($rootPath) && ($i = strpos($value, $rootPath)) !== false) + { + $value = ($i == 0?substr($value, strlen($rootPath)):"/"); + } + $value = prependSlash($value); + return $value; +} +/** + * prepend slash + * + * @param string $value + * @return string + */ +function prependSlash($value) +{ + if (($value && $value[0] != '/') || !$value ) + { + $value = "/" . $value; + } + return $value; +} + + + function writeInfo($data, $die = false) + { + $fp = @fopen(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'data.php', 'w+'); + @fwrite($fp, $data); + @fwrite($fp, "\n\n" . date('d/M/Y H:i:s') ); + @fclose($fp); + if($die) + { + die(); + } + + } + +/** + * no cachable header + */ +function addNoCacheHeaders() { + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); +} + /** + * add extra query stiring to a url + * @param string $baseUrl + * @param string $extra the query string added to the base url + */ + function appendQueryString($baseUrl, $extra) + { + $output = $baseUrl; + if(!empty($extra)) + { + if(strpos($baseUrl, "?") !== false) + { + $output .= "&" . $extra; + }else + { + $output .= "?" . $extra; + } + } + + return $output; + } + /** + * make the query strin from $_GET, but excluding those specified by $excluded + * + * @param array $excluded + * @return string + */ + function makeQueryString($excluded=array()) + { + $output = ''; + $count = 1; + foreach($_GET as $k=>$v) + { + if(array_search($k, $excluded) === false) + { + $output .= ($count>1?'&':'') . ($k . "=" . $v); + $count++; + } + } + return $output; + } + /** + * get parent path from specific path + * + * @param string $value + * @return string + */ + function getParentPath($value) + { + $value = removeTrailingSlash(backslashToSlash($value)); + if(false !== ($index = strrpos($value, "/")) ) + { + return substr($value, 0, $index); + } + + } + + + /** + * check if the file/folder is sit under the root + * + * @param string $value + * @return boolean + */ + function isUnderRoot($value) + { + $roorPath = strtolower(addTrailingSlash(backslashToSlash(getRealPath(CONFIG_SYS_ROOT_PATH)))); + if(file_exists($value) && @strpos(strtolower(addTrailingSlash(backslashToSlash(getRealPath($value)))), $roorPath) === 0 ) + { + return true; + } + return false; + } + /** + * check if a file under the session folder + * + * @param string $value + * @return boolean + */ + function isUnderSession($value) + { + global $session; + $sessionPath = strtolower(addTrailingSlash(backslashToSlash(getRealPath($session->getSessionDir())))); + if(file_exists($value) && @strpos(strtolower(addTrailingSlash(backslashToSlash(getRealPath($value)))), $sessionPath) === 0 ) + { + return true; + } + return false; + } + + + /** + * get thumbnail width and height + * + * @param integer $originaleImageWidth + * @param integer $originalImageHeight + * @param integer $thumbnailWidth + * @param integer $thumbnailHeight + * @return array() + */ + function getThumbWidthHeight( $originaleImageWidth, $originalImageHeight, $thumbnailWidth, $thumbnailHeight) + { + $outputs = array( "width"=>0, "height"=>0); + $thumbnailWidth = (int)($thumbnailWidth); + $thumbnailHeight = (int)($thumbnailHeight); + if(!empty($originaleImageWidth) && !empty($originalImageHeight)) + { + //start to get the thumbnail width & height + if(($thumbnailWidth < 1 && $thumbnailHeight < 1) || ($thumbnailWidth > $originaleImageWidth && $thumbnailHeight > $originalImageHeight )) + { + $thumbnailWidth =$originaleImageWidth; + $thumbnailHeight = $originalImageHeight; + }elseif($thumbnailWidth < 1) + { + $thumbnailWidth = floor($thumbnailHeight / $originalImageHeight * $originaleImageWidth); + + }elseif($thumbnailHeight < 1) + { + $thumbnailHeight = floor($thumbnailWidth / $originaleImageWidth * $originalImageHeight); + }else + { + $scale = min($thumbnailWidth/$originaleImageWidth, $thumbnailHeight/$originalImageHeight); + $thumbnailWidth = floor($scale*$originaleImageWidth); + $thumbnailHeight = floor($scale*$originalImageHeight); + } + $outputs['width'] = $thumbnailWidth; + $outputs['height'] = $thumbnailHeight; + } + return $outputs; + + } +/** + * turn to absolute path from relative path + * + * @param string $value + * @return string + */ +function getAbsPath($value) { + if (substr($value, 0, 1) == "/") + return slashToBackslash(DIR_AJAX_ROOT . $value); + + return slashToBackslash(dirname(__FILE__) . "/" . $value); +} + + /** + * get file/folder base name + * + * @param string $value + * @return string + */ + function getBaseName($value) + { + $value = removeTrailingSlash(backslashToSlash($value)); + + if(false !== ($index = strrpos($value, "/")) ) + { + return substr($value, $index + 1); + }else + { + return $value; + } + } + +function myRealPath($path) { + + if(strpos($path, ':/') !== false) + { + return $path; + } + // check if path begins with "/" ie. is absolute + // if it isnt concat with script path + + if (strpos($path,"/") !== 0 ) { + $base=dirname($_SERVER['SCRIPT_FILENAME']); + $path=$base."/".$path; + } + + // canonicalize + $path=explode('/', $path); + $newpath=array(); + for ($i=0; $i 1048576) + { + return round($size / 1048576, 1) . " MB"; + }elseif ($size > 1024) + { + return round($size / 1024, 1) . " KB"; + }elseif($size == '') + { + return $size; + }else + { + return $size . " b"; + } +} + + /** + * remove beginging slash + * + * @param string $value + * @return string + */ + function removeBeginingSlash($value) + { + $value = backslashToSlash($value); + if(strpos($value, "/") === 0) + { + $value = substr($value, 1); + } + return $value; + } + +/** + * get site root path + * + * @return String. + */ +function getRootPath() { + $output = ""; + if (defined('CONFIG_WEBSITE_DOCUMENT_ROOT') && CONFIG_WEBSITE_DOCUMENT_ROOT) + { + return slashToBackslash(CONFIG_WEBSITE_DOCUMENT_ROOT); + } + if(isset($_SERVER['DOCUMENT_ROOT']) && ($output = relToAbs($_SERVER['DOCUMENT_ROOT'])) != '' ) + { + return $output; + }elseif(isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["SCRIPT_FILENAME"]) && ($output = str_replace(backslashToSlash($_SERVER["SCRIPT_NAME"]), "", backslashToSlash($_SERVER["SCRIPT_FILENAME"]))) && is_dir($output)) + { + return slashToBackslash($output); + }elseif(isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["PATH_TRANSLATED"]) && ($output = str_replace(backslashToSlash($_SERVER["SCRIPT_NAME"]), "", str_replace("//", "/", backslashToSlash($_SERVER["PATH_TRANSLATED"])))) && is_dir($output)) + { + return $output; + }else + { + return ''; + } + + return null; +} + + + /** + * add beginging slash + * + * @param string $value + * @return string + */ + function addBeginingSlash($value) + { + if(strpos($value, "/") !== 0 && !empty($value)) + { + $value .= "/" . $value; + } + return $value; + } + + + + + + /** + * get a file extension + * + * @param string $fileName the path to a file or just the file name + */ + function getFileExt($filePath) + { + return @substr(@strrchr($filePath, "."), 1); + } + + /** + * reuturn the relative path between two url + * + * @param string $start_dir + * @param string $final_dir + * @return string + */ + function getRelativePath($start_dir, $final_dir){ + // + $firstPathParts = explode(DIRECTORY_SEPARATOR, $start_dir); + $secondPathParts = explode(DIRECTORY_SEPARATOR, $final_dir); + // + $sameCounter = 0; + for($i = 0; $i < min( count($firstPathParts), count($secondPathParts) ); $i++) { + if( strtolower($firstPathParts[$i]) !== strtolower($secondPathParts[$i]) ) { + break; + } + $sameCounter++; + } + if( $sameCounter == 0 ) { + return $final_dir; + } + // + $newPath = ''; + for($i = $sameCounter; $i < count($firstPathParts); $i++) { + if( $i > $sameCounter ) { + $newPath .= DIRECTORY_SEPARATOR; + } + $newPath .= ".."; + } + if( count($newPath) == 0 ) { + $newPath = "."; + } + for($i = $sameCounter; $i < count($secondPathParts); $i++) { + $newPath .= DIRECTORY_SEPARATOR; + $newPath .= $secondPathParts[$i]; + } + // + return $newPath; + } + /** + * get the php server memory limit + * @return integer + * + */ + function getMemoryLimit() + { + $output = @ini_get('memory_limit') or $output = -1 ; + if((int)($output) < 0) + {//unlimited + $output = 999999999999999999; + } + elseif(strpos('g', strtolower($output)) !== false) + { + $output = (int)($output) * 1024 * 1024 * 1024; + }elseif(strpos('k', strtolower($output)) !== false) + { + $output = (int)($output) * 1024 ; + }else + { + $output = (int)($output) * 1024 * 1024; + } + + return $output; + } + /** + * get file content + * + * @param string $path + */ + function getFileContent($path) + { + return @file_get_contents($path); + //return str_replace(array("\r", "\n", '"', "\t"), array("", "\\n", '\"', "\\t"), @file_get_contents($path)); + } + /** + * get the list of folder under a specified folder + * which will be used for drop-down menu + * @param string $path the path of the specified folder + * @param array $outputs + * @param string $indexNumber + * @param string $prefixNumber the prefix before the index number + * @param string $prefixName the prefix before the folder name + * @return array + */ + function getFolderListing($path,$indexNumber=null, $prefixNumber =' ', $prefixName =' - ', $outputs=array()) + { + $path = removeTrailingSlash(backslashToSlash($path)); + if(is_null($indexNumber)) + { + $outputs[IMG_LBL_ROOT_FOLDER] = removeTrailingSlash(backslashToSlash($path)); + } + $fh = @opendir($path); + if($fh) + { + $count = 1; + while($file = @readdir($fh)) + { + $newPath = removeTrailingSlash(backslashToSlash($path . "/" . $file)); + if(isListingDocument($newPath) && $file != '.' && $file != '..' && is_dir($newPath)) + { + if(!empty($indexNumber)) + {//this is not root folder + + $outputs[$prefixNumber . $indexNumber . "." . $count . $prefixName . $file] = $newPath; + getFolderListing($newPath, $prefixNumber . $indexNumber . "." . $count , $prefixNumber, $prefixName, $outputs); + }else + {//this is root folder + + $outputs[$count . $prefixName . $file] = $newPath; + getFolderListing($newPath, $count, $prefixNumber, $prefixName, $outputs); + } + $count++; + } + } + @closedir($fh); + } + return $outputs; + } + + + /** + * get the valid text editor extension + * which is calcualte from the CONFIG_EDITABALE_VALID_EXTS + * exclude those specified in CONFIG_UPLOAD_INVALID_EXTS + * and those are not specified in CONFIG_UPLOAD_VALID_EXTS + * + * @return array + */ + function getValidTextEditorExts() + { + $validEditorExts = explode(',', CONFIG_EDITABLE_VALID_EXTS); + if(CONFIG_UPLOAD_VALID_EXTS) + {//exclude those exts not shown on CONFIG_UPLOAD_VALID_EXTS + $validUploadExts = explode(',', CONFIG_UPLOAD_VALID_EXTS); + foreach($validEditorExts as $k=>$v) + { + if(array_search($v, $validUploadExts) === false) + { + unset($validEditorExts[$k]); + } + } + } + if(CONFIG_UPLOAD_INVALID_EXTS) + {//exlcude those exists in CONFIG_UPLOAD_INVALID_EXTS + $invalidUploadExts = explode(',', CONFIG_UPLOAD_INVALID_EXTS); + foreach($validEditorExts as $k=>$v) + { + if(array_search($v, $invalidUploadExts) !== false) + { + unset($validEditorExts[$k]); + } + } + } + return $validEditorExts; + + } + /** + * check if file name or folder name is valid against a regular expression + * + * @param string $pattern regular expression, separated by , if multiple + * @param string $string + * @return booolean + */ + function isValidPattern( $pattern, $string) + { + if(($pattern)=== '') + { + return true; + } + else if (strpos($pattern,",")!==false) + { + $regExps = explode(',', $pattern); + foreach ($regExps as $regExp => $value) + { + if(eregi($value, $string)) + { + return true; + } + } + } + else if(eregi($pattern, $string)) + { + return true; + } + return false; + + } + + + /** + * check if file name or folder name is invalid against a regular expression + * + * @param string $pattern regular expression, separated by , if multiple + * @param string $string + * @return booolean + */ + function isInvalidPattern( $pattern, $string) + { + if(($pattern)=== '') + { + return false; + } + else if (strpos($pattern,",")!==false) + { + $regExps = explode(',', $pattern); + foreach ($regExps as $regExp => $value) + { + if(eregi($value, $string)) + { + return true; + } + } + } + else if(eregi($pattern, $string)) + { + return true; + } + return false; + + } + + + /** + * cut the file down to fit the list page + * + * @param string $fileName + */ + function shortenFileName($fileName, $maxLeng=17, $indicate = '...') + { + if(strlen($fileName) > $maxLeng) + { + $fileName = substr($fileName, 0, $maxLeng - strlen($indicate)) . $indicate; + } + return $fileName; + + } + if (!function_exists('mime_content_type')) + { + function mime_content_type ( $f ) + { + return trim ( @exec ('file -bi ' . escapeshellarg ( $f ) ) ) ; + } + } + + /** + * check if such document is allowed to shown on the list + * + * @param string $path the path to the document + * @return boolean + */ + function isListingDocument($path) + { + $file = basename($path); + if(CONFIG_SYS_PATTERN_FORMAT == 'list') + {// comma delimited vague file/folder name + + + + + if(is_dir($path)) + { + $includeDir = trimlrm(CONFIG_SYS_INC_DIR_PATTERN); + $excludeDir = trimlrm(CONFIG_SYS_EXC_DIR_PATTERN); + $found_includeDir = strpos($includeDir, $file); + $found_excludeDir = strpos($excludeDir, $file); + if((!CONFIG_SYS_INC_DIR_PATTERN || (!($found_includeDir === FALSE))) && (!CONFIG_SYS_EXC_DIR_PATTERN || (($found_excludeDir === FALSE)))) + { + return true; + }else + { + return false; + } + }elseif(is_file($path)) + { + $includeFile = trimlrm(CONFIG_SYS_INC_FILE_PATTERN); + $excludeFile = trimlrm(CONFIG_SYS_EXC_FILE_PATTERN); + $found_includeFile = strpos($includeFile, $file); + $found_excludeFile = strpos($excludeFile, $file); + if((!CONFIG_SYS_INC_FILE_PATTERN || (!($found_includeFile === FALSE))) && (!CONFIG_SYS_EXC_FILE_PATTERN || (($found_excludeFile === FALSE)))) + { + return true; + }else + { + return false; + } + } + }elseif(CONFIG_SYS_PATTERN_FORMAT == 'csv') + {//comma delimited file/folder name + + if(is_dir($path)) + { + + $includeDir = trimlrm(CONFIG_SYS_INC_DIR_PATTERN); + $excludeDir = trimlrm(CONFIG_SYS_EXC_DIR_PATTERN); + + if(!empty($includeDir) && !empty($excludeDir)) + { + + $validDir = explode(',', $includeDir); + + $invalidDir = explode(",", $excludeDir); + + if(array_search(basename($path), $validDir) !== false && array_search(basename($path), $invalidDir) === false) + { + return true; + }else + { + return false; + } + }elseif(!empty($includeDir)) + { + $validDir = explode(',', $includeDir); + if(array_search(basename($path), $validDir) !== false) + { + return true; + }else + { + return false; + } + + }elseif(!empty($excludeFile)) + { + $invalidDir = explode(",", $excludeDir); + if(array_search(basename($path), $invalidDir) === false) + { + return true; + }else + { + return false; + } + } + return true; + + }elseif(is_file($path)) + { + $includeFile = trimlrm(CONFIG_SYS_INC_FILE_PATTERN); + $excludeFile = trimlrm(CONFIG_SYS_EXC_FILE_PATTERN); + if(!empty($includeFile) && !empty($excludeFile)) + { + $validFile = explode(',', $includeFile); + $invalidFile = explode(',', $excludeFile); + if(array_search(basename($path), $validFile) !== false && array_search(basename($path), $invalidFile) === false) + { + return true; + }else + { + return false; + } + }elseif(!empty($includeFile)) + { + $validFile = explode(',', $includeFile); + if(array_search(basename($path), $validFile) !== false) + { + return true; + }else + { + return false; + } + }elseif(!empty($excludeFile)) + { + $invalidFile = explode(',', $excludeFile); + if(array_search(basename($path), $invalidFile) === false) + { + return true; + }else + { + return false; + } + } + return true; + } + } + else + {//regular expression + if(is_dir($path) ) + { + if(isValidPattern(CONFIG_SYS_INC_DIR_PATTERN, $path) && !isInvalidPattern(CONFIG_SYS_EXC_DIR_PATTERN, $path)) + { + return true; + }else + { + return false; + } + + }elseif(is_file($path)) + { + if(isValidPattern(CONFIG_SYS_INC_FILE_PATTERN, $path) && !isInvalidPattern(CONFIG_SYS_EXC_FILE_PATTERN, $path) ) + { + return true; + }else + { + return false; + } + } + } + return false; + + } + + /** + * force to down the specified file + * + * @param string $path + * + */ + function downloadFile($path, $newFileName=null) + { + if(file_exists($path) && is_file($path)) + { + $mimeContentType = 'application/octet-stream'; + if(function_exists('finfo_open')) + { + if(($fp = @finfo_open($path))) + { + $mimeContentType = @finfo_file($fp, basename($path)); + @finfo_close($fp); + } + + }elseif(($temMimeContentType = @mime_content_type($path)) && !empty($temMimeContentType)) + { + $mimeContentType = $temMimeContentType; + } + + + + + + // START ANDR� SILVA DOWNLOAD CODE + // required for IE, otherwise Content-disposition is ignored + if(ini_get('zlib.output_compression')) + ini_set('zlib.output_compression', 'Off'); + header("Pragma: public"); // required + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Cache-Control: private",false); // required for certain browsers + header("Content-Type: " . $mimeContentType ); + // change, added quotes to allow spaces in filenames, by Rajkumar Singh + header("Content-Disposition: attachment; filename=\"".(is_null($newFileName)?basename($path):$newFileName)."\";" ); + header("Content-Transfer-Encoding: binary"); + header("Content-Length: ".filesize($path)); + + readfile($path); + exit(); + // END ANDR� SILVA DOWNLOAD CODE + } + + } + + /** + * remove all white spaces + * + * @param string $hayStack + * @param string $whiteSpaceChars + * @return string + */ + function trimlrm ($hayStack, $whiteSpaceChars="\t\n\r\0\x0B") + { + return str_replace($whiteSpaceChars, '', trim($hayStack)); + } + + /** + * get the parent path of the specified path + * + * @param string $path + * @return string + */ + function getParentFolderPath($path) + { + $realPath = addTrailingSlash(backslashToSlash(getRealPath($path))); + $parentRealPath = addTrailingSlash(backslashToSlash(dirname($realPath))); + $differentPath = addTrailingSlash(substr($realPath, strlen($parentRealPath))); + $parentPath = substr($path, 0, strlen(addTrailingSlash(backslashToSlash($path))) - strlen($differentPath)); + if(isUnderRoot($parentPath)) + { + return $parentPath; + }else + { + return CONFIG_SYS_DEFAULT_PATH; + } + } + + function getCurrentFolderPath() + { + $folderPathIndex = 'path'; + $lastVisitedFolderPathIndex = 'ajax_last_visited_folder'; + if(isset($_GET[$folderPathIndex]) && file_exists($_GET[$folderPathIndex]) && !is_file($_GET[$folderPathIndex]) ) + { + $currentFolderPath = $_GET[$folderPathIndex]; + } + elseif(isset($_SESSION[$lastVisitedFolderPathIndex]) && file_exists($_SESSION[$lastVisitedFolderPathIndex]) && !is_file($_SESSION[$lastVisitedFolderPathIndex])) + { + $currentFolderPath = $_SESSION[$lastVisitedFolderPathIndex]; + }else + { + $currentFolderPath = CONFIG_SYS_DEFAULT_PATH; + } + + $currentFolderPath = (isUnderRoot($currentFolderPath)?backslashToSlash((addTrailingSlash($currentFolderPath))):CONFIG_SYS_DEFAULT_PATH); + + //keep track of this folder path in session + $_SESSION[$lastVisitedFolderPathIndex] = $currentFolderPath; + + + if(!file_exists($currentFolderPath)) + { + die(ERR_FOLDER_NOT_FOUND . $currentFolderPath); + } + } + + if(!function_exists("imagerotate")) + { + function imagerotate($src_img, $angle, $bicubic=false) + { + // convert degrees to radians + + $angle = (360 - $angle) + 180; + $angle = deg2rad($angle); + + $src_x = imagesx($src_img); + $src_y = imagesy($src_img); + + $center_x = floor($src_x/2); + $center_y = floor($src_y/2); + + $rotate = imagecreatetruecolor($src_x, $src_y); + imagealphablending($rotate, false); + imagesavealpha($rotate, true); + + $cosangle = cos($angle); + $sinangle = sin($angle); + + for ($y = 0; $y < $src_y; $y++) { + for ($x = 0; $x < $src_x; $x++) { + // rotate... + $old_x = (($center_x-$x) * $cosangle + ($center_y-$y) * $sinangle) + + $center_x; + $old_y = (($center_y-$y) * $cosangle - ($center_x-$x) * $sinangle) + + $center_y; + + if ( $old_x >= 0 && $old_x < $src_x + && $old_y >= 0 && $old_y < $src_y ) { + if ($bicubic == true) { + $sY = $old_y + 1; + $siY = $old_y; + $siY2 = $old_y - 1; + $sX = $old_x + 1; + $siX = $old_x; + $siX2 = $old_x - 1; + + $c1 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY2)); + $c2 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY)); + $c3 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY2)); + $c4 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY)); + + $r = ($c1['red'] + $c2['red'] + $c3['red'] + $c4['red'] ) << 14; + $g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) << 6; + $b = ($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue'] ) >> 2; + $a = ($c1['alpha'] + $c2['alpha'] + $c3['alpha'] + $c4['alpha'] ) >> 2; + $color = imagecolorallocatealpha($src_img, $r,$g,$b,$a); + } else { + $color = imagecolorat($src_img, $old_x, $old_y); + } + } else { + // this line sets the background colour + $color = imagecolorallocatealpha($src_img, 255, 255, 255, 127); + } + imagesetpixel($rotate, $x, $y, $color); + } + } + return $rotate; +/* $src_x = @imagesx($src_img); + $src_y = @imagesy($src_img); + if ($angle == 180) + { + $dest_x = $src_x; + $dest_y = $src_y; + } + elseif ($src_x <= $src_y) + { + $dest_x = $src_y; + $dest_y = $src_x; + } + elseif ($src_x >= $src_y) + { + $dest_x = $src_y; + $dest_y = $src_x; + } + if(function_exists('ImageCreateTrueColor')) + { + $rotate = @ImageCreateTrueColor($dst_w,$dst_h); + } else { + $rotate = @ImageCreate($dst_w,$dst_h); + } + @imagealphablending($rotate, false); + + switch ($angle) + { + case 270: + for ($y = 0; $y < ($src_y); $y++) + { + for ($x = 0; $x < ($src_x); $x++) + { + $color = imagecolorat($src_img, $x, $y); + imagesetpixel($rotate, $dest_x - $y - 1, $x, $color); + } + } + break; + case 90: + for ($y = 0; $y < ($src_y); $y++) + { + for ($x = 0; $x < ($src_x); $x++) + { + $color = imagecolorat($src_img, $x, $y); + imagesetpixel($rotate, $y, $dest_y - $x - 1, $color); + } + } + break; + case 180: + for ($y = 0; $y < ($src_y); $y++) + { + for ($x = 0; $x < ($src_x); $x++) + { + $color = imagecolorat($src_img, $x, $y); + imagesetpixel($rotate, $dest_x - $x - 1, $dest_y - $y - 1, $color); + } + } + break; + default: $rotate = $src_img; + }; + return $rotate;*/ + } + } +?> \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/ajaxfilemanager.js b/admin-dev/ajaxfilemanager/jscripts/ajaxfilemanager.js new file mode 100755 index 000000000..05bd03d28 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/ajaxfilemanager.js @@ -0,0 +1,1845 @@ +/* +/* + * author: Logan Cai + * Email: cailongqun [at] yahoo [dot] com [dot] cn + * Website: www.phpletter.com + * Created At: 21/April/2007 + * Modified At: 1/June/2007 +*/ +// Returns true if the passed value is found in the +// array. Returns false if it is not. +Array.prototype.inArray = function (value,caseSensitive) +{ + var i; + for (i=0; i < this.length; i++) + { + // use === to check for Matches. ie., identical (===), + if(caseSensitive){ //performs match even the string is case sensitive + if (this[i].toLowerCase() == value.toLowerCase()) + { + return true; + } + }else + { + if (this[i] == value) + { + return true; + } + } + } + return false; +}; + var dcTime=250; // doubleclick time + var dcDelay=100; // no clicks after doubleclick + var dcAt=0; // time of doubleclick + var savEvent=null; // save Event for handling doClick(). + var savEvtTime=0; // save time of click event. + var savTO=null; // handle of click setTimeOut + var linkElem = null; + + + function hadDoubleClick() + { + var d = new Date(); + var now = d.getTime(); + if ((now - dcAt) < dcDelay) + { + return true; + } + return false; + }; + + +/** +* enable left click to preview certain files +*/ +function enablePreview(elem, num) +{ + + $(elem).each( + function() + { + + $(this).click(function () + { + + //alert('single click'); + var num = getNum(this.id); + var path = files[num].path; + //alert('now: ' + now + '; dcat: ' + dcAt + '; dcDelay: ' + dcDelay); + if (hadDoubleClick()) + { + return false; + }else + { + linkElem = $('#a' + num).get(0); + } + + d = new Date(); + savEvtTime = d.getTime(); + savTO = setTimeout(function() + { + if (savEvtTime - dcAt > 0) + { + //check if this file is previewable + + + var ext = getFileExtension(path); + var supportedExts = supporedPreviewExts.split(","); + var isSupportedExt = false; + for (i in supportedExts) + { + var typeOf = typeof(supportedExts[i]); + //alert(supportedExts[i]); + if(typeOf.toLowerCase() == 'string' && supportedExts[i].toLowerCase() == ext.toLowerCase()) + { + isSupportedExt = true; + break; + } + + } + + if(isSupportedExt) + { + switch(files[num].cssClass) + { + case 'fileVideo': + case 'fileMusic': + case 'fileFlash': + + $('#playGround').html('
 this is mine
'); + + + $('#playGround' + num).html(''); + $('#playGround' + num).media({ width: 255, height: 210, autoplay: true }); + //alert($('#playGround' + num).html()); + showThickBox($('#a' + num).get(0), appendQueryString('#TB_inline', 'height=250' + '&width=256' + '&inlineId=winPlay&modal=true')); + + break; + default: + showThickBox(linkElem, appendQueryString(path, 'KeepThis=true&TB_iframe=true&height=' + thickbox.height + '&width=' + thickbox.width)); + + } + + } + + } + + + return false; + + }, dcTime); + + return false; + + }); + $(this).dblclick(function() + { + var d = new Date(); + dcAt = d.getTime(); + if (savTO != null) { + clearTimeout( savTO ); // Clear pending Click + savTO = null; + + } + + if(typeof(selectFile) != 'undefined') + { + + selectFile(files[num].url); + }else + generateDownloadIframe(appendQueryString(getUrl('download'), 'path=' + files[num].path, ['path'])); { + + } + + } + ); + + } + ); +}; +/** +* add over class to the specific table +*/ +function tableRuler(element) +{ + + var rows = $(element); + + $(rows).each(function(){ + $(this).mouseover(function(){ + $(this).addClass('over'); + }); + $(this).mouseout(function(){ + $(this).removeClass('over'); + }); + }); +}; + + + + + + + +function previewMedia(rowNum) +{ + $('#preview' +rowNum).html(''); + $('#preview' +rowNum).media({ width: 255, height: 210, autoplay: true }); + return false; +}; + +function getFileExtension(filename) +{ + if( filename.length == 0 ) return ""; + var dot = filename.lastIndexOf("."); + if( dot == -1 ) return ""; + var extension = filename.substr(dot + 1,filename.length); + return extension; +}; + +function closeWindow() +{ + if(window.confirm(warningCloseWindow)) + { + window.close(); + } + return false; +}; + +/** +* return the url with query string +*/ +function getUrl(index,limitNeeded , viewNeeded, searchNeeded) +{ + + var queryStr = ''; + var excluded = new Array(); + + if(typeof(limitNeeded) == 'boolean' && limitNeeded) + { + var limit = document.getElementById('limit'); + var typeLimit = typeof(limit); + + if(typeLimit != 'undefined' && limit ) + { + excluded[excluded.length] = 'limit'; + queryStr += (queryStr == ''?'':'&') + 'limit=' + limit.options[limit.selectedIndex].value; + } + + } + if(typeof(viewNeeded) == 'boolean' && viewNeeded) + { + queryStr += (queryStr == ''?'':'&') + 'view=' + getView(); + excluded[excluded.length] = 'view'; + + } + + if(typeof(searchNeeded) == 'boolean' && searchNeeded && searchRequired) + { + var search_recursively = 0; + $('input[@name=search_recursively][@checked]').each( + function() + { + search_recursively = this.value; + } + ); + var searchFolder = document.getElementById('search_folder'); + queryStr += (queryStr == ''?'':'&') + 'search=1&search_name=' + $('#search_name').val() + '&search_recursively=' + search_recursively + '&search_mtime_from=' + $('#search_mtime_from').val() + '&search_mtime_to=' + $('#search_mtime_to').val() + '&search_folder=' + searchFolder.options[searchFolder.selectedIndex].value; + excluded[excluded.length] = 'search'; + excluded[excluded.length] = 'search_recursively'; + excluded[excluded.length] = 'search_mtime_from'; + excluded[excluded.length] = 'search_mtime_to'; + excluded[excluded.length] = 'search_folder'; + excluded[excluded.length] = 'search_name'; + excluded[excluded.length] = 'search'; + + } + + + + return appendQueryString(appendQueryString(urls[index], queryString), queryStr, excluded); +}; +/** +* change view +*/ +function changeView() +{ + + var url = getUrl('view', true, true); + $('#rightCol').empty(); + ajaxStart('#rightCol'); + + $('#rightCol').load(url, + {}, + function(){ + ajaxStop('#rightCol img.ajaxLoadingImg'); + urls.present = getUrl('home', true, true); + initAfterListingLoaded(); + }); +}; + +function goParentFolder() +{ + + searchRequired = false; + var url = appendQueryString(getUrl('view', true, true), 'path=' + parentFolder.path , ['path']); + $('#rightCol').empty(); + ajaxStart('#rightCol'); + + $('#rightCol').load(url, + {}, + function(){ + urls.present = appendQueryString(getUrl('home', true, true), 'path=' + parentFolder.path , ['path']); + ajaxStop('#rightCol img.ajaxLoadingImg'); + initAfterListingLoaded(); + }); + +}; + +/** +* append Query string to the base url +* @param string baseUrl the base url +* @param string the query string +* @param array remove thost url variable from base url if any matches +*/ +function appendQueryString(baseUrl, queryStr, excludedQueryStr) +{ + + if(typeof(excludedQueryStr) == 'object' && excludedQueryStr.length) + { + var isMatched = false; + var urlParts = baseUrl.split("?"); + baseUrl = urlParts[0]; + var count = 1; + if(typeof(urlParts[1]) != 'undefined' && urlParts[1] != '') + {//this is the query string parts + var queryStrParts = urlParts[1].split("&"); + for(var i=0; i < queryStrParts.length; i++) + { + //split into query string variable name & value + var queryStrVariables = queryStrParts[i].split('='); + for(var j=0; j < excludedQueryStr.length; j++) + { + if(queryStrVariables[0] == excludedQueryStr[j]) + { + isMatched = true; + } + } + if(!isMatched) + { + baseUrl += ((count==1?'?':'&') + queryStrVariables[0] + '=' + queryStrVariables[1]); + count++; + } + } + } + + } + if(queryStr != '') + { + return (baseUrl.indexOf('?')> -1?baseUrl + '&' + queryStr:baseUrl + '?' + queryStr); + }else + { + return baseUrl; + } + + + + +}; + + +/** +* initiate when the listing page is loaded +* add main features according to the view +*/ +function initAfterListingLoaded() +{ + + + parsePagination(); + + parseCurrentFolder(); + var view = getView(); + + setDocInfo('root'); + + if(view != '') + { + + switch(view) + { + + + case 'thumbnail': + //enableContextMenu('dl.thumbnailListing, dl.thumbnailListing dt, dl.thumbnailListing dd, dl.thumbnailListing a'); + enableContextMenu('dl.thumbnailListing'); + for(i in files) + { + if(files[i].type== 'folder') + {//this is foder item + + enableFolderBrowsable(i); + }else + {//this is file item + + switch(files[i].cssClass) + { + case 'filePicture': + //$('#a' + i).attr('rel', 'ajaxphotos'); + //retrieveThumbnail(i); + + break; + case 'fileFlash': + break; + case 'fileVideo': + break; + case 'fileMusic': + break; + default: + + + } + enablePreview('#dt' + i, i); + enablePreview('#thumbUrl' + i, i); + enablePreview('#a' + i, i); + + } + enableShowDocInfo( i); + + } + break; + case 'detail': + default: + + enableContextMenu('#fileList tr'); + for(i in files) + { + if(files[i].type== 'folder') + {//this is foder item + enableFolderBrowsable(i); + }else + {//this is file item + switch(files[i].cssClass) + { + case 'filePicture': + $('#row' + i + ' td a').attr('rel', 'ajaxphotos'); + break; + case 'fileFlash': + break; + case 'fileVideo': + break; + case 'fileMusic': + break; + default: + + }; + enablePreview('#row' + i + ' td a', i); + + } + enableShowDocInfo(i); + } + break; + + + } + } + + +}; + +function enableFolderBrowsable(num, debug) +{ + + switch(getView()) + { + case 'thumbnail': + $('#dt'+ num + ' , #dd' + num + ' a').each(function() + + { +/* if(typeof(debug) != 'undefined' && debug) + { + alert(this.tagName + ' ' + files[num].path); + }*/ + doEnableFolderBrowsable(this, num); + } + ); + break; + case 'detail': + default: + $('#row' + num + ' td[a]').each(function() + + { + doEnableFolderBrowsable(this, num ); + } + ); + + } + + + + +}; + +function doEnableFolderBrowsable(elem, num) +{ + $(elem).click(function() + { + { + searchRequired = false; + var typeNum = typeof(num); + if(typeNum.toUpperCase() == 'STRING') + { + var fpath = (num.indexOf(urls.view) >=0?num:files[num].path); + }else + { + var fpath = files[num].path; + } + + + var url = appendQueryString(getUrl('view', true, true), 'path=' + fpath, ['path']); + + + $('#rightCol').empty(); + ajaxStart('#rightCol'); + $('#rightCol').load(url, + {}, + function(){ + urls.present = appendQueryString(getUrl('home', true, true), 'path=' + fpath, ['path']); + ajaxStop('#rightCol img.ajaxLoadingImg'); + initAfterListingLoaded(); + }); + }; + return false; + + } + ); +}; + +/** +* @param mixed destinationSelector where the animation image will be append to +* @param mixed selectorOfAnimation the jquery selector of the animation +*/ +function ajaxStart(destinationSelector, id, selectorOfAnimation) +{ + if(typeof(selectorOfAnimation) == 'undefined') + {//set defaullt animation + selectorOfAnimation = '#ajaxLoading img'; + } + if(typeof(id) != 'undefined') + { + $(selectorOfAnimation).clone().attr('id', id).appendTo(destinationSelector); + + }else + { + $(selectorOfAnimation).clone(true).appendTo(destinationSelector); + + } + + +}; +/** +* remove the ajax animation +* @param mixed selectorOfAnimation the jquery selector of the animation +*/ +function ajaxStop(selectorOfAnimation) +{ + $(selectorOfAnimation).remove(); +}; +/** +* change pagination limit +*/ +function changePaginationLimit(elem) +{ + var url = getUrl('view', true, true, true); + $('#rightCol').empty(); + ajaxStart('#rightCol'); + $('#rightCol').load(url, + {}, + function(){ + urls.present = appendQueryString(getUrl('home', true, true), 'path=' + parentFolder.path , ['path']) + ajaxStop('#rightCol img.ajaxLoadingImg'); + initAfterListingLoaded(); + }); +}; +/** +* get a query string variable value from an url +* @param string index +* @param string url +*/ +function getUrlVarValue(url, index) +{ + + if(url != '' && index != '') + { + var urlParts = url.split("?"); + baseUrl = urlParts[0]; + var count = 1; + if(typeof(urlParts[1]) != 'undefined' && urlParts[1] != '') + {//this is the query string parts + var queryStrParts = urlParts[1].split("&"); + for(var i=0; i < queryStrParts.length; i++) + { + //split into query string variable name & value + var queryStrVariables = queryStrParts[i].split('='); + if(queryStrVariables[0] == index) + { + return queryStrVariables[1]; + } + } + } + } + return ''; + +}; +/** +* parse current folder +*/ +function parseCurrentFolder() +{ + var folders = currentFolder.friendly_path.split('/'); + var str = ''; + var url = getUrl('view', true, true); + + var parentPath = ''; + for(var i = 0; i < folders.length; i++) + { + if(i == 0) + { + parentPath += paths.root; + str += '/' + paths.root_title + '' + + }else + { + if(folders[i] != '') + { + + parentPath += folders[i] + '/'; + str += '/' + folders[i] + ''; + } + } + } + $('#currentFolderPath').empty().append(str); + $('#currentFolderPath a').each( + function() + { + doEnableFolderBrowsable(this, $(this).attr('href')); + } + ); +}; +/** +* enable pagination as ajax function call +*/ +function parsePagination() +{ + $('p.pagination a[@id!=pagination_parent_link]').each(function () + { + $(this).click( + function() + { + + + var page = getUrlVarValue($(this).attr('href'), 'page'); + var url = appendQueryString(getUrl('view', true, true, searchRequired),'page=' + page, ['page']); + $('#rightCol').empty(); + ajaxStart('#rightCol'); + $('#rightCol').load(url, + {}, + function(){ + urls.present = appendQueryString(getUrl('home', true, true, searchRequired),'page=' + page, ['page']); + ajaxStop('#rightCol img.ajaxLoadingImg'); + initAfterListingLoaded(); + }); + return false; + } + + ); + } + ); +}; +/** +* get current view +*/ +function getView() +{ + var view = $('input[@name=view][@checked]').get(0); + if(typeof(view) != 'undefined') + { + return view.value; + }else + { + return ''; + } +}; + +function getNum(elemId) +{ + + if(typeof(elemId) != 'undefined' && elemId != '') + { + var r = elemId.match(/[\d\.]+/g); + if(typeof(r) != 'undefined' && r && typeof(r[0]) != 'undefined') + { + return r[0]; + } + } + + return 0; +}; + +function enableContextMenu(jquerySelectors) +{ + + $(jquerySelectors).contextMenu('contextMenu', + { + bindings: + { + 'menuSelect':function(t) + { + var num = (getNum($(t).attr('id'))); + + selectFile(files[num].url); + }, + 'menuPlay':function(t) + { + var num = (getNum($(t).attr('id'))); + $('#playGround').html('
 this is mine
'); + + + $('#playGround' + num).html(''); + $('#playGround' + num).media({ width: 255, height: 210, autoplay: true }); + //alert($('#playGround' + num).html()); + showThickBox($('#a' + num).get(0), appendQueryString('#TB_inline', 'height=250' + '&width=258' + '&inlineId=winPlay&modal=true')); + + + + }, + 'menuPreview':function(t) + { + var num = (getNum($(t).attr('id'))); + $('#a' + num).click(); + }, + 'menuDownload':function(t) + { + var num = (getNum($(t).attr('id'))); + generateDownloadIframe(appendQueryString(getUrl('download', false, false), 'path=' + files[num].path, ['path'])); + }, + 'menuRename':function(t) + { + var num = (getNum($(t).attr('id'))); + + showThickBox($('#a' + num).get(0), appendQueryString('#TB_inline', 'height=100' + '&width=350' + '&inlineId=winRename&modal=true')); + + $('div#TB_window #renameName').val(files[num].name); + $('div#TB_window #original_path').val(files[num].path); + $('div#TB_window #renameNum').val(num); + }, + 'menuEdit':function(t) + { + var num = (getNum($(t).attr('id'))); + var url = ''; + switch(files[num].cssClass) + { + case 'filePicture': + url = getUrl('image_editor'); + break; + default: + url = getUrl('text_editor'); + + } + var param = "status=yes,menubar=no,resizable=yes,scrollbars=yes,location=no,toolbar=no"; + param += ",height=" + screen.height + ",width=" + screen.width; + if(typeof(window.screenX) != 'undefined') + { + param += ",screenX = 0,screenY=0"; + }else if(typeof(window.screenTop) != 'undefined' ) + { + param += ",left = 0,top=0" ; + } + var newWindow = window.open(url + ((url.lastIndexOf("?") > - 1)?"&":"?") + "path=" + files[num].path,'', param); + newWindow.focus( ); + + + }, + + 'menuCut':function(t) + { + + }, + 'menuCopy':function(t) + { + + }, + 'menuPaste':function(t) + { + + }, + 'menuDelete':function(t) + { + var num = (getNum($(t).attr('id'))); + if(window.confirm(warningDelete)) + { + $.getJSON(appendQueryString(getUrl('delete', false,false), 'delete=' + files[num].path, ['delete']), + function(data) + { + if(typeof(data.error) == 'undefined') + { + alert('Unexpected Error.'); + } + else if(data.error != '') + { + alert(data.error); + }else + {//remove deleted files + switch(getView()) + { + case 'thumbnail': $('#dl' + num ).remove(); + break; + case 'detail': + default: + $('#row' + num).remove(); + + } + files[num] = null; + } + } + ); + + + } + } + }, + onContextMenu:function(events) + { + + return true; + }, + onShowMenu:function(events, menu) + { + + switch(getView()) + { + case 'thumbnail': + var num = getNum(events.target.id); + + break; + case 'detail': + default: + switch(events.target.tagName.toLowerCase()) + { + case 'span': + + if($(events.target).parent().get(0).tagName.toLowerCase() == 'a') + { + + var num = getNum($(events.target).parent().parent().parent().attr('id')); + }else + { + var num = getNum($(events.target).parent().parent().parent().parent().attr('id')); + } + + + + break; + case 'td': + var num = getNum($(events.target).parent().attr('id')); + break; + case 'a': + case 'input': + var num = getNum($(events.target).parent().parent().attr('id')); + break; + } + } + + var menusToRemove = new Array; + if(typeof(selectFile) == 'undefined') + { + menusToRemove[menusToRemove.length] = '#menuSelect'; + } + menusToRemove[menusToRemove.length] = '#menuCut'; + menusToRemove[menusToRemove.length] = '#menuCopy'; + menusToRemove[menusToRemove.length] = '#menuPaste'; + switch(files[num].type) + { + case 'folder': + if(numFiles < 1) + { + menusToRemove[menusToRemove.length] = '#menuPaste'; + } + menusToRemove[menusToRemove.length] = '#menuPreview'; + menusToRemove[menusToRemove.length] = '#menuDownload'; + menusToRemove[menusToRemove.length] = '#menuEdit'; + menusToRemove[menusToRemove.length] = '#menuPlay'; + menusToRemove[menusToRemove.length] = '#menuDownload'; + + break; + default: + var isSupportedExt = false; + if(permits.edit) + { + var ext = getFileExtension(files[num].path); + var supportedExts = supporedPreviewExts.split(","); + + for(var i = 0; i < supportedExts.length; i++) + { + if(typeof(supportedExts[i]) != 'undefined' && typeof(supportedExts[i]).toLowerCase() == 'string' && supportedExts[i].toLowerCase() == ext.toLowerCase()) + { + isSupportedExt = true; + break; + } + } + + } + if(!isSupportedExt || permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuEdit'; + } + + + switch(files[num].cssClass) + { + case 'filePicture': + menusToRemove[menusToRemove.length] = '#menuPlay'; + break; + case 'fileCode': + menusToRemove[menusToRemove.length] = '#menuPlay'; + break; + case 'fileVideo': + case 'fileFlash': + case 'fileMusic': + + menusToRemove[menusToRemove.length] = '#menuPreview'; menusToRemove[menusToRemove.length] = '#menuEdit'; + break; + default: + menusToRemove[menusToRemove.length] = '#menuPreview'; + menusToRemove[menusToRemove.length] = '#menuPlay'; + + + + } + menusToRemove[menusToRemove.length] = '#menuPaste'; + } + if(!permits.edit|| permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuEdit'; + } + if(!permits.del || permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuDelete'; + } + if(!permits.cut || permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuCut'; + } + if(!permits.copy || permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuCopy'; + } + if((!permits.cut && !permits.copy) || permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuPaste'; + } + if(!permits.rename || permits.view_only) + { + menusToRemove[menusToRemove.length] = '#menuRename'; + } + + //alert(menusToRemove.join(',')); + var txt = ''; + for(var t in menu) + { + //txt += t + ': ' + menu[t] + '\n'; + } + $(menu).children().children().children().each( + function() + { + if(menusToRemove.inArray('#' + this.id)) + { + $(this).parent().remove(); + } + //alert(this.id); + + + } + ) + //alert(menusToRemove.join(',')); + //$(menusToRemove.join(','), $(menu).children().children().children()).remove(); + + + return menu; + } + } + ); +}; + + +var fileUploadElemIds = new Array(); //keep track of the file element ids +/** +* add more file type of input file for multiple uploads +*/ +function addMoreFile() +{ + + var newFileUpload = $($('div#TB_window #fileUploadBody tr').get(0)).clone(); + + do + { + var elementId = 'upload' + generateUniqueId(10); + }while(fileUploadElemIds.inArray(elementId)); + + fileUploadElemIds[fileUploadElemIds.length] = elementId; + + $(newFileUpload).appendTo('div#TB_window #fileUploadBody'); + $('input[@type=file]', newFileUpload).attr('id', elementId); + $('span.uploadProcessing', newFileUpload).attr('id', 'ajax' + elementId); + $('input[@type=button]', newFileUpload).click( + function() + { + uploadFile(elementId); + } + ); + $('a', newFileUpload).show().click( + function() + { + cancelFileUpload(elementId); + } + ); + + + $(newFileUpload).show(); + + return false; +}; +/** +* cancel uploading file +* remove hidden upload frame +* remove hidden upload form +*/ +function cancelFileUpload(elementId) +{ + $('div#TB_window #' + elementId).parent().parent().remove(); + + //ensure there is at least one visible upload element + while($('div#TB_window #fileUploadBody tr').length < 2) + { + addMoreFile(); + } + return false; +}; +/** +* upload file +*/ +function uploadFile(elementId) +{ + + var ext = getFileExtension($('#' + elementId).val()); + if(ext == '') + { + alert(noFileSelected ); + return false; + } + var supportedExts = supportedUploadExts.split(","); + var isSupportedExt = false; + + for (i in supportedExts) + { + //alert(typeof(supportedExts[i])); + if(typeof(supportedExts[i]) == 'string') + { + isSupportedExt = true; + break; + } + } + + if(!isSupportedExt) + { + alert(msgInvalidExt); + return false; + } + + $('#ajax' + elementId).hide(); + $('#ajax' + elementId).show(); + $.ajaxFileUpload + ( + { + url:appendQueryString(getUrl('upload', false, false), 'folder=' + currentFolder.path, ['folder']), + secureuri:false, + fileElementId:elementId, + dataType: 'json', + success: function (data, status) + { + + if(typeof(data.error) != 'undefined') + { + if(data.error != '') + { + alert(data.error); + $('#ajax' + elementId).hide(); + }else + { + //remove the file type of input + cancelFileUpload(elementId); + numRows++; + files[numRows] = {}; + + for(var i in data) + { + if(i != 'error') + { + files[numRows][i] = data[i]; + } + } + addDocumentHtml(numRows); + } + } + + }, + error: function (data, status, e) + { + $('#ajax' + elementId).hide(); + alert(e); + } + } + ) + + return false; +}; +/** +* generate unique id +*/ +function generateUniqueId(leng) +{ + var idLength = leng || 32; + var chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ"; + var id = ''; + for(var i = 0; i <= idLength; i++) + { + id += chars.substr( Math.floor(Math.random() * 62), 1 ); + } + + return (id ); + +}; + +/** +* generate a hidden iframe and force to download the specified file +*/ +function generateDownloadIframe(url) +{ + var frameId = 'ajaxDownloadIframe'; + $('#' + frameId).remove(); + if(window.ActiveXObject) { + var io = document.createElement('').css({opacity:0}),e=function(h){if(ie6)if(h.o)h.o.html('

').prepend(i);else if(!$('iframe.jqm',h.w)[0])h.w.prepend(i);f(h)},f=function(h){h.f=$(':input:visible:first',h.w)[0];if(h.f)h.f.focus()},F=function(t){$()[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m)},m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r)f(h);return!r},hs=function(w,e,y){var s=[];w.each(function(){s.push(this._jqm)});$(e).each(function(){if(this[y])$.extend(this[y],s);else{this[y]=s;$(this).click(function(){for(var i in{jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return false})}})}})(jQuery);*/ + + + +(function($){$.fn.jqm=function(o){var p={overlay:50,overlayClass:'jqmOverlay',closeClass:'jqmClose',trigger:'.jqModal',ajax:F,ajaxText:'',target:F,modal:F,toTop:F,onShow:F,onHide:F,onLoad:F};return this.each(function(){if(this._jqm)return H[this._jqm].c=$.extend({},H[this._jqm].c,o);s++;this._jqm=s;H[s]={c:$.extend(p,$.jqm.params,o),a:F,w:$(this).addClass('jqmID'+s),s:s};if(p.trigger)$(this).jqmAddTrigger(p.trigger)})};$.fn.jqmAddClose=function(e){return hs(this,e,'jqmHide')};$.fn.jqmAddTrigger=function(e){return hs(this,e,'jqmShow')};$.fn.jqmShow=function(t){return this.each(function(){$.jqm.open(this._jqm,t)})};$.fn.jqmHide=function(t){return this.each(function(){$.jqm.close(this._jqm,t)})};$.jqm={hash:{},open:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=(parseInt(h.w.css('z-index'))),z=(z>0)?z:3000,o=$('

').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});if(h.a)return F;h.t=t;h.a=true;h.w.css('z-index',z);if(c.modal){if(!A[0])L('bind');A.push(s)}else if(c.overlay>0)h.w.jqmAddClose(o);else o=F;h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):F;if(ie6){$('html,body').css({height:'100%',width:'100%'});if(o){o=o.css({position:'absolute'})[0];for(var y in{Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'")}}if(c.ajax){var r=c.target||h.w,u=c.ajax,r=(typeof r=='string')?$(r,h.w):$(r),u=(u.substr(0,1)=='@')?$(t).attr(u.substring(1)):u;r.html(c.ajaxText).load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h)})}else if(cc)h.w.jqmAddClose($(cc,h.w));if(c.toTop&&h.o)h.w.before('').insertAfter(h.o);(c.onShow)?c.onShow(h):h.w.show();e(h);return F},close:function(s){var h=H[s];if(!h.a)return F;h.a=F;if(A[0]){A.pop();if(!A[0])L('unbind')}if(h.c.toTop&&h.o)$('#jqmP'+h.w[0]._jqm).after(h.w).remove();if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove()}return F},params:{}};var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&($.browser.version=="6.0"),F=false,i=$('').css({opacity:0}),e=function(h){if(ie6)if(h.o)h.o.html('

').prepend(i);else if(!$('iframe.jqm',h.w)[0])h.w.prepend(i);f(h)},f=function(h){try{$(':input:visible',h.w)[0].focus()}catch(_){}},L=function(t){$()[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m)},m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r)f(h);return!r},hs=function(w,t,c){return w.each(function(){var s=this._jqm;$(t).each(function(){if(!this[c]){this[c]=[];$(this).click(function(){for(var i in{jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return F})}this[c].push(s)})})}})(jQuery); +//jqModal.js end + +//rotate.js start +jQuery.fn.rotate=function(a,b){var p=this.get(0);if(!b){p.angle=((p.angle==undefined?0:p.angle)+a)%360}else{p.angle=a}if(p.angle>=0){var c=Math.PI*p.angle/180}else{var c=Math.PI*(360+p.angle)/180}var d=Math.cos(c);var e=Math.sin(c);if(document.all&&!window.opera){var f=document.createElement('img');f.src=p.src;f.height=p.height;f.width=p.width;f.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11="+d+",M12="+(-e)+",M21="+e+",M22="+d+",SizingMethod='auto expand')"}else{var f=document.createElement('canvas');if(!p.oImage){f.oImage=new Image();f.oImage.src=p.src;f.oImage.width=p.width;f.oImage.height=p.height}else{f.oImage=p.oImage}f.style.width=f.width=Math.abs(d*f.oImage.width)+Math.abs(e*f.oImage.height);f.style.height=f.height=Math.abs(d*f.oImage.height)+Math.abs(e*f.oImage.width);var g=f.getContext('2d');g.save();if(c<=Math.PI/2){g.translate(e*f.oImage.height,0)}else if(c<=Math.PI){g.translate(f.width,-d*f.oImage.height)}else if(c<=1.5*Math.PI){g.translate(-d*f.oImage.width,f.height)}else{g.translate(0,-e*f.oImage.width)}g.rotate(c);g.drawImage(f.oImage,0,0,f.oImage.width,f.oImage.height);g.restore()}f.id=p.id;f.angle=p.angle;p.parentNode.replaceChild(f,p)};jQuery.fn.rotateRight=function(a){this.rotate(a==undefined?90:a)};jQuery.fn.rotateLeft=function(a){this.rotate(a==undefined?-90:-a)}; +//rotate.js end +//interface.js start +jQuery.iUtil={getPosition:function(e){var x=0;var y=0;var a=e.style;var b=false;if(jQuery(e).css('display')=='none'){var c=a.visibility;var d=a.position;b=true;a.visibility='hidden';a.display='block';a.position='absolute'}var f=e;while(f){x+=f.offsetLeft+(f.currentStyle&&!jQuery.browser.opera?parseInt(f.currentStyle.borderLeftWidth)||0:0);y+=f.offsetTop+(f.currentStyle&&!jQuery.browser.opera?parseInt(f.currentStyle.borderTopWidth)||0:0);f=f.offsetParent}f=e;while(f&&f.tagName&&f.tagName.toLowerCase()!='body'){x-=f.scrollLeft||0;y-=f.scrollTop||0;f=f.parentNode}if(b==true){a.display='none';a.position=d;a.visibility=c}return{x:x,y:y}},getPositionLite:function(a){var x=0,y=0;while(a){x+=a.offsetLeft||0;y+=a.offsetTop||0;a=a.offsetParent}return{x:x,y:y}},getSize:function(e){var w=jQuery.css(e,'width');var h=jQuery.css(e,'height');var a=0;var b=0;var c=e.style;if(jQuery(e).css('display')!='none'){a=e.offsetWidth;b=e.offsetHeight}else{var d=c.visibility;var f=c.position;c.visibility='hidden';c.display='block';c.position='absolute';a=e.offsetWidth;b=e.offsetHeight;c.display='none';c.position=f;c.visibility=d}return{w:w,h:h,wb:a,hb:b}},getSizeLite:function(a){return{wb:a.offsetWidth||0,hb:a.offsetHeight||0}},getClient:function(e){var h,w,de;if(e){w=e.clientWidth;h=e.clientHeight}else{de=document.documentElement;w=window.innerWidth||self.innerWidth||(de&&de.clientWidth)||document.body.clientWidth;h=window.innerHeight||self.innerHeight||(de&&de.clientHeight)||document.body.clientHeight}return{w:w,h:h}},getScroll:function(e){var t=0,l=0,w=0,h=0,iw=0,ih=0;if(e&&e.nodeName.toLowerCase()!='body'){t=e.scrollTop;l=e.scrollLeft;w=e.scrollWidth;h=e.scrollHeight;iw=0;ih=0}else{if(document.documentElement){t=document.documentElement.scrollTop;l=document.documentElement.scrollLeft;w=document.documentElement.scrollWidth;h=document.documentElement.scrollHeight}else if(document.body){t=document.body.scrollTop;l=document.body.scrollLeft;w=document.body.scrollWidth;h=document.body.scrollHeight}iw=self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;ih=self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0}return{t:t,l:l,w:w,h:h,iw:iw,ih:ih}},getMargins:function(e,a){var c=jQuery(e);var t=c.css('marginTop')||'';var r=c.css('marginRight')||'';var b=c.css('marginBottom')||'';var l=c.css('marginLeft')||'';if(a)return{t:parseInt(t)||0,r:parseInt(r)||0,b:parseInt(b)||0,l:parseInt(l)};else return{t:t,r:r,b:b,l:l}},getPadding:function(e,a){var c=jQuery(e);var t=c.css('paddingTop')||'';var r=c.css('paddingRight')||'';var b=c.css('paddingBottom')||'';var l=c.css('paddingLeft')||'';if(a)return{t:parseInt(t)||0,r:parseInt(r)||0,b:parseInt(b)||0,l:parseInt(l)};else return{t:t,r:r,b:b,l:l}},getBorder:function(e,a){var c=jQuery(e);var t=c.css('borderTopWidth')||'';var r=c.css('borderRightWidth')||'';var b=c.css('borderBottomWidth')||'';var l=c.css('borderLeftWidth')||'';if(a)return{t:parseInt(t)||0,r:parseInt(r)||0,b:parseInt(b)||0,l:parseInt(l)||0};else return{t:t,r:r,b:b,l:l}},getPointer:function(a){var x=a.pageX||(a.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft))||0;var y=a.pageY||(a.clientY+(document.documentElement.scrollTop||document.body.scrollTop))||0;return{x:x,y:y}},traverseDOM:function(a,b){b(a);a=a.firstChild;while(a){jQuery.iUtil.traverseDOM(a,b);a=a.nextSibling}},purgeEvents:function(c){jQuery.iUtil.traverseDOM(c,function(a){for(var b in a){if(typeof a[b]==='function'){a[b]=null}}})},centerEl:function(a,b){var c=jQuery.iUtil.getScroll();var d=jQuery.iUtil.getSize(a);if(!b||b=='vertically')jQuery(a).css({top:c.t+((Math.max(c.h,c.ih)-c.t-d.hb)/2)+'px'});if(!b||b=='horizontally')jQuery(a).css({left:c.l+((Math.max(c.w,c.iw)-c.l-d.wb)/2)+'px'})},fixPNG:function(a,b){var c=jQuery('img[@src*="png"]',a||document),png;c.each(function(){png=this.src;this.src=b;this.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+png+"')"})}};[].indexOf||(Array.prototype.indexOf=function(v,n){n=(n==null)?0:n;var m=this.length;for(var i=n;i0&&c>0){e=(Math.round(c/b*10000)/10000)}else{e=null}}}});return e},ResizeConstraint:function(d){var e;this.each(function(){var a=this;if(typeof(d)!='boolean'||!d){a.resizeOptions.ratio=null}else{var b=parseInt(jQuery(a).css('width'))||0;var c=parseInt(jQuery(a).css('height'))||0;if(b>0&&c>0){a.resizeOptions.ratio=(Math.round(c/b*10000)/10000)}else{a.resizeOptions.ratio=null}}})},move:function(e){if(jQuery.iResize.resizeElement==null){return}pointer=jQuery.iUtil.getPointer(e);dx=pointer.x-jQuery.iResize.pointer.x;dy=pointer.y-jQuery.iResize.pointer.y;newSizes={width:jQuery.iResize.sizes.width,height:jQuery.iResize.sizes.height};newPosition={top:jQuery.iResize.position.top,left:jQuery.iResize.position.left};switch(jQuery.iResize.resizeDirection){case'e':newSizes.width=jQuery.iResize.getWidth(dx,1);break;case'se':newSizes.width=jQuery.iResize.getWidth(dx,1);newSizes.height=jQuery.iResize.getHeight(dy,1);break;case'w':newSizes.width=jQuery.iResize.getWidth(dx,-1);newPosition.left=jQuery.iResize.position.left-newSizes.width+jQuery.iResize.sizes.width;break;case'sw':newSizes.width=jQuery.iResize.getWidth(dx,-1);newPosition.left=jQuery.iResize.position.left-newSizes.width+jQuery.iResize.sizes.width;newSizes.height=jQuery.iResize.getHeight(dy,1);break;case'nw':newSizes.height=jQuery.iResize.getHeight(dy,-1);newPosition.top=jQuery.iResize.position.top-newSizes.height+jQuery.iResize.sizes.height;newSizes.width=jQuery.iResize.getWidth(dx,-1);newPosition.left=jQuery.iResize.position.left-newSizes.width+jQuery.iResize.sizes.width;break;case'n':newSizes.height=jQuery.iResize.getHeight(dy,-1);newPosition.top=jQuery.iResize.position.top-newSizes.height+jQuery.iResize.sizes.height;break;case'ne':newSizes.height=jQuery.iResize.getHeight(dy,-1);newPosition.top=jQuery.iResize.position.top-newSizes.height+jQuery.iResize.sizes.height;newSizes.width=jQuery.iResize.getWidth(dx,1);break;case's':newSizes.height=jQuery.iResize.getHeight(dy,1);break}if(jQuery.iResize.resizeElement.resizeOptions.ratio){if(jQuery.iResize.resizeDirection=='n'||jQuery.iResize.resizeDirection=='s')nWidth=newSizes.height*jQuery.iResize.resizeElement.resizeOptions.ratio;else nWidth=newSizes.width;nHeight=jQuery.iResize.getHeightMinMax(nWidth*jQuery.iResize.resizeElement.resizeOptions.ratio);nWidth=nHeight/jQuery.iResize.resizeElement.resizeOptions.ratio;switch(jQuery.iResize.resizeDirection){case'n':case'nw':case'ne':newPosition.top+=newSizes.height-nHeight;break}switch(jQuery.iResize.resizeDirection){case'nw':case'w':case'sw':newPosition.left+=newSizes.width-nWidth;break}newSizes.height=nHeight;newSizes.width=nWidth}if(newPosition.topjQuery.iResize.resizeElement.resizeOptions.maxBottom){newSizes.height=jQuery.iResize.resizeElement.resizeOptions.maxBottom-newPosition.top;if(jQuery.iResize.resizeElement.resizeOptions.ratio){newSizes.width=newSizes.height/jQuery.iResize.resizeElement.resizeOptions.ratio}}if(newPosition.left+newSizes.width>jQuery.iResize.resizeElement.resizeOptions.maxRight){newSizes.width=jQuery.iResize.resizeElement.resizeOptions.maxRight-newPosition.left;if(jQuery.iResize.resizeElement.resizeOptions.ratio){newSizes.height=newSizes.width*jQuery.iResize.resizeElement.resizeOptions.ratio}}var a=false;if(jQuery.iResize.resizeElement.resizeOptions.onResize){a=jQuery.iResize.resizeElement.resizeOptions.onResize.apply(jQuery.iResize.resizeElement,[newSizes,newPosition]);if(a){if(a.sizes){jQuery.extend(newSizes,a.sizes)}if(a.position){jQuery.extend(newPosition,a.position)}}}elS=jQuery.iResize.resizeElement.style;elS.left=newPosition.left+'px';elS.top=newPosition.top+'px';elS.width=newSizes.width+'px';elS.height=newSizes.height+'px';return false},build:function(b){if(!b||!b.handlers||b.handlers.constructor!=Object){return}return this.each(function(){var a=this;a.resizeOptions=b;a.resizeOptions.minWidth=b.minWidth||10;a.resizeOptions.minHeight=b.minHeight||10;a.resizeOptions.maxWidth=b.maxWidth||3000;a.resizeOptions.maxHeight=b.maxHeight||3000;a.resizeOptions.minTop=b.minTop||-1000;a.resizeOptions.minLeft=b.minLeft||-1000;a.resizeOptions.maxRight=b.maxRight||3000;a.resizeOptions.maxBottom=b.maxBottom||3000;elPosition=jQuery(a).css('position');if(!(elPosition=='relative'||elPosition=='absolute')){a.style.position='relative'}directions=/n|ne|e|se|s|sw|w|nw/g;for(i in a.resizeOptions.handlers){if(i.toLowerCase().match(directions)!=null){if(a.resizeOptions.handlers[i].constructor==String){handle=jQuery(a.resizeOptions.handlers[i]);if(handle.size()>0){a.resizeOptions.handlers[i]=handle.get(0)}}if(a.resizeOptions.handlers[i].tagName){a.resizeOptions.handlers[i].resizeElement=a;a.resizeOptions.handlers[i].resizeDirection=i;jQuery(a.resizeOptions.handlers[i]).bind('mousedown',jQuery.iResize.start)}}}if(a.resizeOptions.dragHandle){if(typeof a.resizeOptions.dragHandle==='string'){handleEl=jQuery(a.resizeOptions.dragHandle);if(handleEl.size()>0){handleEl.each(function(){this.dragEl=a});handleEl.bind('mousedown',jQuery.iResize.startDrag)}}else if(a.resizeOptions.dragHandle==true){jQuery(this).bind('mousedown',jQuery.iResize.startDrag)}}})},destroy:function(){return this.each(function(){var a=this;for(i in a.resizeOptions.handlers){a.resizeOptions.handlers[i].resizeElement=null;a.resizeOptions.handlers[i].resizeDirection=null;jQuery(a.resizeOptions.handlers[i]).unbind('mousedown',jQuery.iResize.start)}if(a.resizeOptions.dragHandle){if(typeof a.resizeOptions.dragHandle==='string'){handle=jQuery(a.resizeOptions.dragHandle);if(handle.size()>0){handle.unbind('mousedown',jQuery.iResize.startDrag)}}else if(a.resizeOptions.dragHandle==true){jQuery(this).unbind('mousedown',jQuery.iResize.startDrag)}}a.resizeOptions=null})}};jQuery.fn.extend({Resizable:jQuery.iResize.build,ResizableRatio:jQuery.iResize.ResizeRatio,ResizeConstraint:jQuery.iResize.ResizeConstraint,ResizableDestroy:jQuery.iResize.destroy}); +//interface.js end +//image_editor_general.js start +/*function getModeValue(){var CheckedElem=null;for(var i=0;i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7(1g 18.6=="I"){18.I=18.I;u 6=q(a,c){7(18==9||!9.3X)v 14 6(a,c);v 9.3X(a,c)};7(1g $!="I")6.1I$=$;u $=6;6.11=6.8r={3X:q(a,c){a=a||P;7(6.16(a))v 14 6(P)[6.11.1G?"1G":"1W"](a);7(1g a=="1s"){u m=/^[^<]*(<(.|\\s)+>)[^>]*$/.1V(a);7(m)a=6.31([m[1]]);B v 14 6(c).1L(a)}v 9.4E(a.15==2b&&a||(a.3C||a.C&&a!=18&&!a.1q&&a[0]!=I&&a[0].1q)&&6.2L(a)||[a])},3C:"1.1.3.1",7W:q(){v 9.C},C:0,1M:q(a){v a==I?6.2L(9):9[a]},1Z:q(a){u b=6(a);b.5q=9;v b},4E:q(a){9.C=0;[].R.O(9,a);v 9},F:q(a,b){v 6.F(9,a,b)},2p:q(a){u b=-1;9.F(q(i){7(9==a)b=i});v b},1b:q(f,d,e){u c=f;7(f.15==33)7(d==I)v 9.C&&6[e||"1b"](9[0],f)||I;B{c={};c[f]=d}v 9.F(q(a){E(u b V c)6.1b(e?9.T:9,b,6.4H(9,c[b],e,a,b))})},1f:q(b,a){v 9.1b(b,a,"2z")},2A:q(e){7(1g e=="1s")v 9.2Y().3e(P.66(e));u t="";6.F(e||9,q(){6.F(9.2S,q(){7(9.1q!=8)t+=9.1q!=1?9.5R:6.11.2A([9])})});v t},8b:q(){u a,1S=19;v 9.F(q(){7(!a)a=6.31(1S,9.2O);u b=a[0].3s(K);9.L.2K(b,9);1v(b.1d)b=b.1d;b.4g(9)})},3e:q(){v 9.2F(19,K,1,q(a){9.4g(a)})},5w:q(){v 9.2F(19,K,-1,q(a){9.2K(a,9.1d)})},5t:q(){v 9.2F(19,N,1,q(a){9.L.2K(a,9)})},5s:q(){v 9.2F(19,N,-1,q(a){9.L.2K(a,9.1X)})},2U:q(){v 9.5q||6([])},1L:q(t){u b=6.3k(9,q(a){v 6.1L(t,a)});v 9.1Z(/[^+>] [^+>]/.17(t)||t.J("..")>-1?6.5g(b):b)},7x:q(e){u d=9.1A(9.1L("*"));d.F(q(){9.1I$1a={};E(u a V 9.$1a)9.1I$1a[a]=6.1c({},9.$1a[a])}).3U();u r=9.1Z(6.3k(9,q(a){v a.3s(e!=I?e:K)}));d.F(q(){u b=9.1I$1a;E(u a V b)E(u c V b[a])6.S.1A(9,a,b[a][c],b[a][c].W);9.1I$1a=H});v r},1i:q(t){v 9.1Z(6.16(t)&&6.2s(9,q(b,a){v t.O(b,[a])})||6.2x(t,9))},4Y:q(t){v 9.1Z(t.15==33&&6.2x(t,9,K)||6.2s(9,q(a){v(t.15==2b||t.3C)?6.2w(a,t)<0:a!=t}))},1A:q(t){v 9.1Z(6.1T(9.1M(),t.15==33?6(t).1M():t.C!=I&&(!t.Q||t.Q=="6Z")?t:[t]))},37:q(a){v a?6.2x(a,9).C>0:N},6R:q(a){v a==I?(9.C?9[0].2v:H):9.1b("2v",a)},3F:q(a){v a==I?(9.C?9[0].27:H):9.2Y().3e(a)},2F:q(f,d,g,e){u c=9.C>1,a;v 9.F(q(){7(!a){a=6.31(f,9.2O);7(g<0)a.6E()}u b=9;7(d&&6.Q(9,"1r")&&6.Q(a[0],"2V"))b=9.3R("1z")[0]||9.4g(P.5h("1z"));6.F(a,q(){e.O(b,[c?9.3s(K):9])})})}};6.1c=6.11.1c=q(){u c=19[0],a=1;7(19.C==1){c=9;a=0}u b;1v((b=19[a++])!=H)E(u i V b)c[i]=b[i];v c};6.1c({6n:q(){7(6.1I$)$=6.1I$;v 6},16:q(a){v!!a&&1g a!="1s"&&!a.Q&&a.15!=2b&&/q/i.17(a+"")},40:q(a){v a.4z&&a.2O&&!a.2O.4y},Q:q(b,a){v b.Q&&b.Q.1D()==a.1D()},F:q(a,b,c){7(a.C==I)E(u i V a)b.O(a[i],c||[i,a[i]]);B E(u i=0,4x=a.C;i<4x;i++)7(b.O(a[i],c||[i,a[i]])===N)1F;v a},4H:q(c,b,d,e,a){7(6.16(b))b=b.3D(c,[e]);u f=/z-?2p|5Y-?8p|1e|5U|8i-?1u/i;v b&&b.15==3y&&d=="2z"&&!f.17(a)?b+"4o":b},12:{1A:q(b,c){6.F(c.2R(/\\s+/),q(i,a){7(!6.12.3w(b.12,a))b.12+=(b.12?" ":"")+a})},1E:q(b,c){b.12=c!=I?6.2s(b.12.2R(/\\s+/),q(a){v!6.12.3w(c,a)}).5M(" "):""},3w:q(t,c){v 6.2w(c,(t.12||t).3v().2R(/\\s+/))>-1}},4m:q(e,o,f){E(u i V o){e.T["2N"+i]=e.T[i];e.T[i]=o[i]}f.O(e,[]);E(u i V o)e.T[i]=e.T["2N"+i]},1f:q(e,p){7(p=="1u"||p=="29"){u b={},3r,3p,d=["83","81","80","7Y"];6.F(d,q(){b["7V"+9]=0;b["7T"+9+"7S"]=0});6.4m(e,b,q(){7(6(e).37(\':4f\')){3r=e.7Q;3p=e.7O}B{e=6(e.3s(K)).1L(":4b").5v("2B").2U().1f({48:"1y",3i:"7L",U:"2h",7K:"0",7I:"0"}).5o(e.L)[0];u a=6.1f(e.L,"3i")||"3n";7(a=="3n")e.L.T.3i="7G";3r=e.7E;3p=e.7D;7(a=="3n")e.L.T.3i="3n";e.L.3q(e)}});v p=="1u"?3r:3p}v 6.2z(e,p)},2z:q(e,a,d){u g;7(a=="1e"&&6.M.1h){g=6.1b(e.T,"1e");v g==""?"1":g}7(a.3t(/3x/i))a=6.1U;7(!d&&e.T[a])g=e.T[a];B 7(P.3f&&P.3f.3Y){7(a.3t(/3x/i))a="3x";a=a.1o(/([A-Z])/g,"-$1").2H();u b=P.3f.3Y(e,H);7(b)g=b.57(a);B 7(a=="U")g="1P";B 6.4m(e,{U:"2h"},q(){u c=P.3f.3Y(9,"");g=c&&c.57(a)||""})}B 7(e.3S){u f=a.1o(/\\-(\\w)/g,q(m,c){v c.1D()});g=e.3S[a]||e.3S[f]}v g},31:q(a,c){u r=[];c=c||P;6.F(a,q(i,b){7(!b)v;7(b.15==3y)b=b.3v();7(1g b=="1s"){u s=6.2C(b).2H(),1x=c.5h("1x"),1N=[];u a=!s.J("<1H")&&[1,"<2y>",""]||!s.J("<7g")&&[1,"<52>",""]||(!s.J("<7c")||!s.J("<1z")||!s.J("<7a")||!s.J("<78"))&&[1,"<1r>",""]||!s.J("<2V")&&[2,"<1r><1z>",""]||(!s.J("<75")||!s.J("<74"))&&[3,"<1r><1z><2V>",""]||!s.J("<73")&&[2,"<1r><4W>",""]||[0,"",""];1x.27=a[1]+b+a[2];1v(a[0]--)1x=1x.1d;7(6.M.1h){7(!s.J("<1r")&&s.J("<1z")<0)1N=1x.1d&&1x.1d.2S;B 7(a[1]=="<1r>"&&s.J("<1z")<0)1N=1x.2S;E(u n=1N.C-1;n>=0;--n)7(6.Q(1N[n],"1z")&&!1N[n].2S.C)1N[n].L.3q(1N[n])}b=6.2L(1x.2S)}7(0===b.C&&(!6.Q(b,"34")&&!6.Q(b,"2y")))v;7(b[0]==I||6.Q(b,"34")||b.71)r.R(b);B r=6.1T(r,b)});v r},1b:q(c,d,a){u e=6.40(c)?{}:6.3H;7(e[d]){7(a!=I)c[e[d]]=a;v c[e[d]]}B 7(a==I&&6.M.1h&&6.Q(c,"34")&&(d=="70"||d=="6Y"))v c.6W(d).5R;B 7(c.4z){7(a!=I)c.6U(d,a);7(6.M.1h&&/4M|2u/.17(d)&&!6.40(c))v c.35(d,2);v c.35(d)}B{7(d=="1e"&&6.M.1h){7(a!=I){c.5U=1;c.1i=(c.1i||"").1o(/4L\\([^)]*\\)/,"")+(39(a).3v()=="6M"?"":"4L(1e="+a*4X+")")}v c.1i?(39(c.1i.3t(/1e=([^)]*)/)[1])/4X).3v():""}d=d.1o(/-([a-z])/6K,q(z,b){v b.1D()});7(a!=I)c[d]=a;v c[d]}},2C:q(t){v t.1o(/^\\s+|\\s+$/g,"")},2L:q(a){u r=[];7(1g a!="6I")E(u i=0,26=a.C;i<26;i++)r.R(a[i]);B r=a.51(0);v r},2w:q(b,a){E(u i=0,26=a.C;i<26;i++)7(a[i]==b)v i;v-1},1T:q(a,b){E(u i=0;b[i];i++)a.R(b[i]);v a},5g:q(a){u r=[],3P=6.1k++;E(u i=0,4G=a.C;i<4G;i++)7(3P!=a[i].1k){a[i].1k=3P;r.R(a[i])}v r},1k:0,2s:q(c,b,d){7(1g b=="1s")b=14 45("a","i","v "+b);u a=[];E(u i=0,30=c.C;i<30;i++)7(!d&&b(c[i],i)||d&&!b(c[i],i))a.R(c[i]);v a},3k:q(c,b){7(1g b=="1s")b=14 45("a","v "+b);u d=[];E(u i=0,30=c.C;i<30;i++){u a=b(c[i],i);7(a!==H&&a!=I){7(a.15!=2b)a=[a];d=d.6v(a)}}v d}});14 q(){u b=6u.6t.2H();6.M={4D:(b.3t(/.+(?:6s|6q|6o|6m)[\\/: ]([\\d.]+)/)||[])[1],20:/5l/.17(b),2a:/2a/.17(b),1h:/1h/.17(b)&&!/2a/.17(b),3j:/3j/.17(b)&&!/(6h|5l)/.17(b)};6.6g=!6.M.1h||P.6f=="6c";6.1U=6.M.1h?"1U":"5x",6.3H={"E":"68","67":"12","3x":6.1U,5x:6.1U,1U:6.1U,27:"27",12:"12",2v:"2v",2r:"2r",2B:"2B",65:"63",2T:"2T",62:"5Z"}};6.F({4v:"a.L",4p:"6.4p(a)",8o:"6.22(a,2,\'1X\')",8n:"6.22(a,2,\'4t\')",8k:"6.4q(a.L.1d,a)",8h:"6.4q(a.1d)"},q(i,n){6.11[i]=q(a){u b=6.3k(9,n);7(a&&1g a=="1s")b=6.2x(a,b);v 9.1Z(b)}});6.F({5o:"3e",8g:"5w",2K:"5t",8f:"5s"},q(i,n){6.11[i]=q(){u a=19;v 9.F(q(){E(u j=0,26=a.C;j<26;j++)6(a[j])[n](9)})}});6.F({5v:q(a){6.1b(9,a,"");9.8d(a)},8c:q(c){6.12.1A(9,c)},88:q(c){6.12.1E(9,c)},87:q(c){6.12[6.12.3w(9,c)?"1E":"1A"](9,c)},1E:q(a){7(!a||6.1i(a,[9]).r.C)9.L.3q(9)},2Y:q(){1v(9.1d)9.3q(9.1d)}},q(i,n){6.11[i]=q(){v 9.F(n,19)}});6.F(["5Q","5P","5O","5N"],q(i,n){6.11[n]=q(a,b){v 9.1i(":"+n+"("+a+")",b)}});6.F(["1u","29"],q(i,n){6.11[n]=q(h){v h==I?(9.C?6.1f(9[0],n):H):9.1f(n,h.15==33?h:h+"4o")}});6.1c({4n:{"":"m[2]==\'*\'||6.Q(a,m[2])","#":"a.35(\'2m\')==m[2]",":":{5P:"im[3]-0",22:"m[3]-0==i",5Q:"m[3]-0==i",2Q:"i==0",2P:"i==r.C-1",5L:"i%2==0",5K:"i%2","2Q-3u":"a.L.3R(\'*\')[0]==a","2P-3u":"6.22(a.L.5J,1,\'4t\')==a","86-3u":"!6.22(a.L.5J,2,\'4t\')",4v:"a.1d",2Y:"!a.1d",5N:"(a.5H||a.85||\'\').J(m[3])>=0",4f:\'"1y"!=a.G&&6.1f(a,"U")!="1P"&&6.1f(a,"48")!="1y"\',1y:\'"1y"==a.G||6.1f(a,"U")=="1P"||6.1f(a,"48")=="1y"\',84:"!a.2r",2r:"a.2r",2B:"a.2B",2T:"a.2T||6.1b(a,\'2T\')",2A:"\'2A\'==a.G",4b:"\'4b\'==a.G",5F:"\'5F\'==a.G",4l:"\'4l\'==a.G",5E:"\'5E\'==a.G",4k:"\'4k\'==a.G",5D:"\'5D\'==a.G",5C:"\'5C\'==a.G",1J:\'"1J"==a.G||6.Q(a,"1J")\',5B:"/5B|2y|82|1J/i.17(a.Q)"},"[":"6.1L(m[2],a).C"},5A:[/^\\[ *(@)([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(\\[)\\s*(.*?(\\[.*?\\])?[^[]*?)\\s*\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,14 3o("^([:.#]*)("+(6.2J=6.M.20&&6.M.4D<"3.0.0"?"\\\\w":"(?:[\\\\w\\7Z-\\7X*1I-]|\\\\\\\\.)")+"+)")],2x:q(a,c,b){u d,1K=[];1v(a&&a!=d){d=a;u f=6.1i(a,c,b);a=f.t.1o(/^\\s*,\\s*/,"");1K=b?c=f.r:6.1T(1K,f.r)}v 1K},1L:q(t,l){7(1g t!="1s")v[t];7(l&&!l.1q)l=H;l=l||P;7(!t.J("//")){l=l.4h;t=t.2G(2,t.C)}B 7(!t.J("/")&&!l.2O){l=l.4h;t=t.2G(1,t.C);7(t.J("/")>=1)t=t.2G(t.J("/"),t.C)}u b=[l],2j=[],2P;1v(t&&2P!=t){u r=[];2P=t;t=6.2C(t).1o(/^\\/\\//,"");u k=N;u g=14 3o("^[/>]\\\\s*("+6.2J+"+)");u m=g.1V(t);7(m){u o=m[1].1D();E(u i=0;b[i];i++)E(u c=b[i].1d;c;c=c.1X)7(c.1q==1&&(o=="*"||c.Q.1D()==o.1D()))r.R(c);b=r;t=t.1o(g,"");7(t.J(" ")==0)7R;k=K}B{g=/^((\\/?\\.\\.)|([>\\/+~]))\\s*([a-z]*)/i;7((m=g.1V(t))!=H){r=[];u o=m[4],1k=6.1k++;m=m[1];E(u j=0,2e=b.C;j<2e;j++)7(m.J("..")<0){u n=m=="~"||m=="+"?b[j].1X:b[j].1d;E(;n;n=n.1X)7(n.1q==1){7(m=="~"&&n.1k==1k)1F;7(!o||n.Q.1D()==o.1D()){7(m=="~")n.1k=1k;r.R(n)}7(m=="+")1F}}B r.R(b[j].L);b=r;t=6.2C(t.1o(g,""));k=K}}7(t&&!k){7(!t.J(",")){7(l==b[0])b.4e();2j=6.1T(2j,b);r=b=[l];t=" "+t.2G(1,t.C)}B{u h=14 3o("^("+6.2J+"+)(#)("+6.2J+"+)");u m=h.1V(t);7(m){m=[0,m[2],m[3],m[1]]}B{h=14 3o("^([#.]?)("+6.2J+"*)");m=h.1V(t)}m[2]=m[2].1o(/\\\\/g,"");u f=b[b.C-1];7(m[1]=="#"&&f&&f.4d){u p=f.4d(m[2]);7((6.M.1h||6.M.2a)&&p&&1g p.2m=="1s"&&p.2m!=m[2])p=6(\'[@2m="\'+m[2]+\'"]\',f)[0];b=r=p&&(!m[3]||6.Q(p,m[3]))?[p]:[]}B{E(u i=0;b[i];i++){u a=m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&b[i].Q.2H()=="7P")a="2E";r=6.1T(r,b[i].3R(a))}7(m[1]==".")r=6.4c(r,m[2]);7(m[1]=="#"){u e=[];E(u i=0;r[i];i++)7(r[i].35("2m")==m[2]){e=[r[i]];1F}r=e}b=r}t=t.1o(h,"")}}7(t){u d=6.1i(t,r);b=r=d.r;t=6.2C(d.t)}}7(t)b=[];7(b&&l==b[0])b.4e();2j=6.1T(2j,b);v 2j},4c:q(r,m,a){m=" "+m+" ";u b=[];E(u i=0;r[i];i++){u c=(" "+r[i].12+" ").J(m)>=0;7(!a&&c||a&&!c)b.R(r[i])}v b},1i:q(t,r,h){u d;1v(t&&t!=d){d=t;u p=6.5A,m;E(u i=0;p[i];i++){m=p[i].1V(t);7(m){t=t.7N(m[0].C);m[2]=m[2].1o(/\\\\/g,"");1F}}7(!m)1F;7(m[1]==":"&&m[2]=="4Y")r=6.1i(m[3],r,K).r;B 7(m[1]==".")r=6.4c(r,m[2],h);B 7(m[1]=="@"){u g=[],G=m[3];E(u i=0,2e=r.C;i<2e;i++){u a=r[i],z=a[6.3H[m[2]]||m[2]];7(z==H||/4M|2u/.17(m[2]))z=6.1b(a,m[2])||\'\';7((G==""&&!!z||G=="="&&z==m[5]||G=="!="&&z!=m[5]||G=="^="&&z&&!z.J(m[5])||G=="$="&&z.2G(z.C-m[5].C)==m[5]||(G=="*="||G=="~=")&&z.J(m[5])>=0)^h)g.R(a)}r=g}B 7(m[1]==":"&&m[2]=="22-3u"){u e=6.1k++,g=[],17=/(\\d*)n\\+?(\\d*)/.1V(m[3]=="5L"&&"2n"||m[3]=="5K"&&"2n+1"||!/\\D/.17(m[3])&&"n+"+m[3]||m[3]),2Q=(17[1]||1)-0,d=17[2]-0;E(u i=0,2e=r.C;i<2e;i++){u j=r[i],L=j.L;7(e!=L.1k){u c=1;E(u n=L.1d;n;n=n.1X)7(n.1q==1)n.4a=c++;L.1k=e}u b=N;7(2Q==1){7(d==0||j.4a==d)b=K}B 7((j.4a+d)%2Q==0)b=K;7(b^h)g.R(j)}r=g}B{u f=6.4n[m[1]];7(1g f!="1s")f=6.4n[m[1]][m[2]];49("f = q(a,i){v "+f+"}");r=6.2s(r,f,h)}}v{r:r,t:t}},4p:q(c){u b=[];u a=c.L;1v(a&&a!=P){b.R(a);a=a.L}v b},22:q(a,e,c,b){e=e||1;u d=0;E(;a;a=a[c])7(a.1q==1&&++d==e)1F;v a},4q:q(n,a){u r=[];E(;n;n=n.1X){7(n.1q==1&&(!a||n!=a))r.R(n)}v r}});6.S={1A:q(d,e,c,b){7(6.M.1h&&d.3m!=I)d=18;7(!c.1Q)c.1Q=9.1Q++;7(b!=I){u f=c;c=q(){v f.O(9,19)};c.W=b;c.1Q=f.1Q}7(!d.$1a)d.$1a={};7(!d.$1p)d.$1p=q(){u a;7(1g 6=="I"||6.S.47)v a;a=6.S.1p.O(d,19);v a};u g=d.$1a[e];7(!g){g=d.$1a[e]={};7(d.46)d.46(e,d.$1p,N);B d.7M("5r"+e,d.$1p)}g[c.1Q]=c;7(!9.Y[e])9.Y[e]=[];7(6.2w(d,9.Y[e])==-1)9.Y[e].R(d)},1Q:1,Y:{},1E:q(b,c,a){u d=b.$1a,1Y,2p;7(d){7(c&&c.G){a=c.44;c=c.G}7(!c){E(c V d)9.1E(b,c)}B 7(d[c]){7(a)3l d[c][a.1Q];B E(a V b.$1a[c])3l d[c][a];E(1Y V d[c])1F;7(!1Y){7(b.43)b.43(c,b.$1p,N);B b.7J("5r"+c,b.$1p);1Y=H;3l d[c];1v(9.Y[c]&&((2p=6.2w(b,9.Y[c]))>=0))3l 9.Y[c][2p]}}E(1Y V d)1F;7(!1Y)b.$1p=b.$1a=H}},1t:q(c,b,d){b=6.2L(b||[]);7(!d)6.F(9.Y[c]||[],q(){6.S.1t(c,b,9)});B{u a,1Y,11=6.16(d[c]||H);b.5p(9.42({G:c,1O:d}));7(6.16(d.$1p)&&(a=d.$1p.O(d,b))!==N)9.47=K;7(11&&a!==N&&!6.Q(d,\'a\'))d[c]();9.47=N}},1p:q(b){u a;b=6.S.42(b||18.S||{});u c=9.$1a&&9.$1a[b.G],1S=[].51.3D(19,1);1S.5p(b);E(u j V c){1S[0].44=c[j];1S[0].W=c[j].W;7(c[j].O(9,1S)===N){b.2d();b.2D();a=N}}7(6.M.1h)b.1O=b.2d=b.2D=b.44=b.W=H;v a},42:q(c){u a=c;c=6.1c({},a);c.2d=q(){7(a.2d)v a.2d();a.7H=N};c.2D=q(){7(a.2D)v a.2D();a.7F=K};7(!c.1O&&c.5n)c.1O=c.5n;7(6.M.20&&c.1O.1q==3)c.1O=a.1O.L;7(!c.41&&c.4j)c.41=c.4j==c.1O?c.7C:c.4j;7(c.5k==H&&c.5j!=H){u e=P.4h,b=P.4y;c.5k=c.5j+(e&&e.5i||b.5i);c.7z=c.7y+(e&&e.5f||b.5f)}7(!c.3h&&(c.5e||c.5d))c.3h=c.5e||c.5d;7(!c.5c&&c.5b)c.5c=c.5b;7(!c.3h&&c.1J)c.3h=(c.1J&1?1:(c.1J&2?3:(c.1J&4?2:0)));v c}};6.11.1c({3g:q(c,a,b){v c=="3z"?9.3Z(c,a,b):9.F(q(){6.S.1A(9,c,b||a,b&&a)})},3Z:q(d,b,c){v 9.F(q(){6.S.1A(9,d,q(a){6(9).3U(a);v(c||b).O(9,19)},c&&b)})},3U:q(a,b){v 9.F(q(){6.S.1E(9,a,b)})},1t:q(a,b){v 9.F(q(){6.S.1t(a,b,9)})},1R:q(){u a=19;v 9.5a(q(e){9.4u=0==9.4u?1:0;e.2d();v a[9.4u].O(9,[e])||N})},7w:q(f,g){q 3W(e){u p=e.41;1v(p&&p!=9)2g{p=p.L}25(e){p=9};7(p==9)v N;v(e.G=="3V"?f:g).O(9,[e])}v 9.3V(3W).59(3W)},1G:q(f){7(6.3d)f.O(P,[6]);B 6.2q.R(q(){v f.O(9,[6])});v 9}});6.1c({3d:N,2q:[],1G:q(){7(!6.3d){6.3d=K;7(6.2q){6.F(6.2q,q(){9.O(P)});6.2q=H}7(6.M.3j||6.M.2a)P.43("58",6.1G,N);7(!18.7v.C)6(18).1W(q(){6("#3T").1E()})}}});14 q(){6.F(("7u,7t,1W,7s,7r,3z,5a,7q,"+"7p,7o,7n,3V,59,7m,2y,"+"4k,7l,7k,7j,2c").2R(","),q(i,o){6.11[o]=q(f){v f?9.3g(o,f):9.1t(o)}});7(6.M.3j||6.M.2a)P.46("58",6.1G,N);B 7(6.M.1h){P.7i("<7h"+"7f 2m=3T 7e=K "+"2u=//:><\\/3b>");u a=P.4d("3T");7(a)a.7d=q(){7(9.3a!="1n")v;6.1G()};a=H}B 7(6.M.20)6.3N=3m(q(){7(P.3a=="79"||P.3a=="1n"){3M(6.3N);6.3N=H;6.1G()}},10);6.S.1A(18,"1W",6.1G)};7(6.M.1h)6(18).3Z("3z",q(){u a=6.S.Y;E(u b V a){u c=a[b],i=c.C;7(i&&b!=\'3z\')77 c[i-1]&&6.S.1E(c[i-1],b);1v(--i)}});6.11.1c({76:q(c,b,a){9.1W(c,b,a,1)},1W:q(g,d,c,e){7(6.16(g))v 9.3g("1W",g);c=c||q(){};u f="3K";7(d)7(6.16(d)){c=d;d=H}B{d=6.2E(d);f="50"}u h=9;6.2Z({1C:g,G:f,W:d,2t:e,1n:q(a,b){7(b=="28"||!e&&b=="4V")h.1b("27",a.3c).3J().F(c,[a.3c,b,a]);B c.O(h,[a.3c,b,a])}});v 9},72:q(){v 6.2E(9)},3J:q(){v 9.1L("3b").F(q(){7(9.2u)6.4U(9.2u);B 6.3I(9.2A||9.5H||9.27||"")}).2U()}});6.F("4T,4I,4S,4R,4Q,4P".2R(","),q(i,o){6.11[o]=q(f){v 9.3g(o,f)}});6.1c({1M:q(e,c,a,d,b){7(6.16(c)){a=c;c=H}v 6.2Z({G:"3K",1C:e,W:c,28:a,3G:d,2t:b})},6X:q(d,b,a,c){v 6.1M(d,b,a,c,1)},4U:q(b,a){v 6.1M(b,H,a,"3b")},6V:q(c,b,a){v 6.1M(c,b,a,"4N")},6T:q(d,b,a,c){7(6.16(b)){a=b;b={}}v 6.2Z({G:"50",1C:d,W:b,28:a,3G:c})},6S:q(a){6.36.21=a},6Q:q(a){6.1c(6.36,a)},36:{Y:K,G:"3K",21:0,4O:"6P/x-6O-34-6N",4K:K,38:K,W:H},32:{},2Z:q(s){s=6.1c({},6.36,s);7(s.W){7(s.4K&&1g s.W!="1s")s.W=6.2E(s.W);7(s.G.2H()=="1M"){s.1C+=((s.1C.J("?")>-1)?"&":"?")+s.W;s.W=H}}7(s.Y&&!6.3L++)6.S.1t("4T");u f=N;u h=18.4Z?14 4Z("6L.6J"):14 4J();h.7b(s.G,s.1C,s.38);7(s.W)h.3Q("6H-6G",s.4O);7(s.2t)h.3Q("6F-3O-6D",6.32[s.1C]||"6C, 6B 6A 6z 4r:4r:4r 6y");h.3Q("X-6x-6w","4J");7(s.56)s.56(h);7(s.Y)6.S.1t("4P",[h,s]);u g=q(d){7(h&&(h.3a==4||d=="21")){f=K;7(i){3M(i);i=H}u c;2g{c=6.54(h)&&d!="21"?s.2t&&6.4F(h,s.1C)?"4V":"28":"2c";7(c!="2c"){u b;2g{b=h.3E("53-3O")}25(e){}7(s.2t&&b)6.32[s.1C]=b;u a=6.55(h,s.3G);7(s.28)s.28(a,c);7(s.Y)6.S.1t("4Q",[h,s])}B 6.2X(s,h,c)}25(e){c="2c";6.2X(s,h,c,e)}7(s.Y)6.S.1t("4S",[h,s]);7(s.Y&&!--6.3L)6.S.1t("4I");7(s.1n)s.1n(h,c);7(s.38)h=H}};u i=3m(g,13);7(s.21>0)4C(q(){7(h){h.6r();7(!f)g("21")}},s.21);2g{h.6p(s.W)}25(e){6.2X(s,h,H,e)}7(!s.38)g();v h},2X:q(s,a,b,e){7(s.2c)s.2c(a,b,e);7(s.Y)6.S.1t("4R",[a,s,e])},3L:0,54:q(r){2g{v!r.23&&7A.7B=="4l:"||(r.23>=5u&&r.23<6l)||r.23==5m||6.M.20&&r.23==I}25(e){}v N},4F:q(a,c){2g{u b=a.3E("53-3O");v a.23==5m||b==6.32[c]||6.M.20&&a.23==I}25(e){}v N},55:q(r,b){u c=r.3E("6k-G");u a=!b&&c&&c.J("4B")>=0;a=b=="4B"||a?r.6j:r.3c;7(b=="3b")6.3I(a);7(b=="4N")a=49("("+a+")");7(b=="3F")6("<1x>").3F(a).3J();v a},2E:q(a){u s=[];7(a.15==2b||a.3C)6.F(a,q(){s.R(2l(9.6i)+"="+2l(9.2v))});B E(u j V a)7(a[j]&&a[j].15==2b)6.F(a[j],q(){s.R(2l(j)+"="+2l(9))});B s.R(2l(j)+"="+2l(a[j]));v s.5M("&")},3I:q(a){7(18.4A)18.4A(a);B 7(6.M.20)18.4C(a,0);B 49.3D(18,a)}});6.11.1c({1m:q(b,a){v b?9.1w({1u:"1m",29:"1m",1e:"1m"},b,a):9.1i(":1y").F(q(){9.T.U=9.2i?9.2i:"";7(6.1f(9,"U")=="1P")9.T.U="2h"}).2U()},1j:q(b,a){v b?9.1w({1u:"1j",29:"1j",1e:"1j"},b,a):9.1i(":4f").F(q(){9.2i=9.2i||6.1f(9,"U");7(9.2i=="1P")9.2i="2h";9.T.U="1P"}).2U()},5G:6.11.1R,1R:q(a,b){v 6.16(a)&&6.16(b)?9.5G(a,b):a?9.1w({1u:"1R",29:"1R",1e:"1R"},a,b):9.F(q(){6(9)[6(9).37(":1y")?"1m":"1j"]()})},6e:q(b,a){v 9.1w({1u:"1m"},b,a)},6d:q(b,a){v 9.1w({1u:"1j"},b,a)},6b:q(b,a){v 9.1w({1u:"1R"},b,a)},6a:q(b,a){v 9.1w({1e:"1m"},b,a)},69:q(b,a){v 9.1w({1e:"1j"},b,a)},7U:q(c,a,b){v 9.1w({1e:a},c,b)},1w:q(d,h,f,g){v 9.1l(q(){u c=6(9).37(":1y"),1H=6.5z(h,f,g),5y=9;E(u p V d){7(d[p]=="1j"&&c||d[p]=="1m"&&!c)v 6.16(1H.1n)&&1H.1n.O(9);7(p=="1u"||p=="29"){1H.U=6.1f(9,"U");1H.2f=9.T.2f}}7(1H.2f!=H)9.T.2f="1y";9.2k=6.1c({},d);6.F(d,q(a,b){u e=14 6.2M(5y,1H,a);7(b.15==3y)e.2W(e.1K(),b);B e[b=="1R"?c?"1m":"1j":b](d)})})},1l:q(a,b){7(!b){b=a;a="2M"}v 9.F(q(){7(!9.1l)9.1l={};7(!9.1l[a])9.1l[a]=[];9.1l[a].R(b);7(9.1l[a].C==1)b.O(9)})}});6.1c({5z:q(b,a,c){u d=b&&b.15==64?b:{1n:c||!c&&a||6.16(b)&&b,1B:b,2I:c&&a||a&&a.15!=45&&a||(6.2I.4i?"4i":"4w")};d.1B=(d.1B&&d.1B.15==3y?d.1B:{61:60,89:5u}[d.1B])||8a;d.2N=d.1n;d.1n=q(){6.5I(9,"2M");7(6.16(d.2N))d.2N.O(9)};v d},2I:{4w:q(p,n,b,a){v b+a*p},4i:q(p,n,b,a){v((-5W.5X(p*5W.8e)/2)+0.5)*a+b}},1l:{},5I:q(b,a){a=a||"2M";7(b.1l&&b.1l[a]){b.1l[a].4e();u f=b.1l[a][0];7(f)f.O(b)}},3B:[],2M:q(f,e,g){u z=9;u y=f.T;z.a=q(){7(e.3A)e.3A.O(f,[z.2o]);7(g=="1e")6.1b(y,"1e",z.2o);B{y[g]=8m(z.2o)+"4o";y.U="2h"}};z.5V=q(){v 39(6.1f(f,g))};z.1K=q(){u r=39(6.2z(f,g));v r&&r>-8l?r:z.5V()};z.2W=q(c,b){z.4s=(14 5T()).5S();z.2o=c;z.a();6.3B.R(q(){v z.3A(c,b)});7(6.3B.C==1){u d=3m(q(){u a=6.3B;E(u i=0;ie.1B+z.4s){z.2o=c;z.a();7(f.2k)f.2k[g]=K;u b=K;E(u i V f.2k)7(f.2k[i]!==K)b=N;7(b){7(e.U!=H){y.2f=e.2f;y.U=e.U;7(6.1f(f,"U")=="1P")y.U="2h"}7(e.1j)y.U="1P";7(e.1j||e.1m)E(u p V f.2k)6.1b(y,p,f.24[p])}7(b&&6.16(e.1n))e.1n.O(f);v N}B{u n=t-9.4s;u p=n/e.1B;z.2o=6.2I[e.2I](p,n,a,(c-a),e.1B);z.a()}v K}}})}',62,524,'||||||jQuery|if||this|||||||||||||||||function||||var|return||||||else|length||for|each|type|null|undefined|indexOf|true|parentNode|browser|false|apply|document|nodeName|push|event|style|display|in|data||global|||fn|className||new|constructor|isFunction|test|window|arguments|events|attr|extend|firstChild|opacity|css|typeof|msie|filter|hide|mergeNum|queue|show|complete|replace|handle|nodeType|table|string|trigger|height|while|animate|div|hidden|tbody|add|duration|url|toUpperCase|remove|break|ready|opt|_|button|cur|find|get|tb|target|none|guid|toggle|args|merge|styleFloat|exec|load|nextSibling|ret|pushStack|safari|timeout|nth|status|orig|catch|al|innerHTML|success|width|opera|Array|error|preventDefault|rl|overflow|try|block|oldblock|done|curAnim|encodeURIComponent|id||now|index|readyList|disabled|grep|ifModified|src|value|inArray|multiFilter|select|curCSS|text|checked|trim|stopPropagation|param|domManip|substr|toLowerCase|easing|chars|insertBefore|makeArray|fx|old|ownerDocument|last|first|split|childNodes|selected|end|tr|custom|handleError|empty|ajax|el|clean|lastModified|String|form|getAttribute|ajaxSettings|is|async|parseFloat|readyState|script|responseText|isReady|append|defaultView|bind|which|position|mozilla|map|delete|setInterval|static|RegExp|oWidth|removeChild|oHeight|cloneNode|match|child|toString|has|float|Number|unload|step|timers|jquery|call|getResponseHeader|html|dataType|props|globalEval|evalScripts|GET|active|clearInterval|safariTimer|Modified|num|setRequestHeader|getElementsByTagName|currentStyle|__ie_init|unbind|mouseover|handleHover|init|getComputedStyle|one|isXMLDoc|relatedTarget|fix|removeEventListener|handler|Function|addEventListener|triggered|visibility|eval|nodeIndex|radio|classFilter|getElementById|shift|visible|appendChild|documentElement|swing|fromElement|submit|file|swap|expr|px|parents|sibling|00|startTime|previousSibling|lastToggle|parent|linear|ol|body|tagName|execScript|xml|setTimeout|version|setArray|httpNotModified|fl|prop|ajaxStop|XMLHttpRequest|processData|alpha|href|json|contentType|ajaxSend|ajaxSuccess|ajaxError|ajaxComplete|ajaxStart|getScript|notmodified|colgroup|100|not|ActiveXObject|POST|slice|fieldset|Last|httpSuccess|httpData|beforeSend|getPropertyValue|DOMContentLoaded|mouseout|click|ctrlKey|metaKey|keyCode|charCode|scrollTop|unique|createElement|scrollLeft|clientX|pageX|webkit|304|srcElement|appendTo|unshift|prevObject|on|after|before|200|removeAttr|prepend|cssFloat|self|speed|parse|input|reset|image|password|checkbox|_toggle|textContent|dequeue|lastChild|odd|even|join|contains|gt|lt|eq|nodeValue|getTime|Date|zoom|max|Math|cos|font|maxLength|600|slow|maxlength|readOnly|Object|readonly|createTextNode|class|htmlFor|fadeOut|fadeIn|slideToggle|CSS1Compat|slideUp|slideDown|compatMode|boxModel|compatible|name|responseXML|content|300|ie|noConflict|ra|send|it|abort|rv|userAgent|navigator|concat|With|Requested|GMT|1970|Jan|01|Thu|Since|reverse|If|Type|Content|array|XMLHTTP|ig|Microsoft|NaN|urlencoded|www|application|ajaxSetup|val|ajaxTimeout|post|setAttribute|getJSON|getAttributeNode|getIfModified|method|FORM|action|options|serialize|col|th|td|loadIfModified|do|colg|loaded|tfoot|open|thead|onreadystatechange|defer|ipt|leg|scr|write|keyup|keypress|keydown|change|mousemove|mouseup|mousedown|dblclick|scroll|resize|focus|blur|frames|hover|clone|clientY|pageY|location|protocol|toElement|clientWidth|clientHeight|cancelBubble|relative|returnValue|left|detachEvent|right|absolute|attachEvent|substring|offsetWidth|object|offsetHeight|continue|Width|border|fadeTo|padding|size|uFFFF|Left|u0128|Right|Bottom|textarea|Top|enabled|innerText|only|toggleClass|removeClass|fast|400|wrap|addClass|removeAttribute|PI|insertAfter|prependTo|children|line|splice|siblings|10000|parseInt|prev|next|weight|1px|prototype'.split('|'),0,{})); //jquery.js end + //form.js start +(function($){$.fn.ajaxSubmit=function(o){if(typeof o=='function')o={success:o};o=$.extend({url:this.attr('action')||window.location,type:this.attr('method')||'GET'},o||{});var a=this.formToArray(o.semantic);if(o.beforeSubmit&&o.beforeSubmit(a,this,o)===false)return this;var p={};$.event.trigger('form.submit.validate',[a,this,o,p]);if(p.veto)return this;var q=$.param(a);if(o.type.toUpperCase()=='GET'){o.url+=(o.url.indexOf('?')>=0?'&':'?')+q;o.data=null}else o.data=q;var r=this,callbacks=[];if(o.resetForm)callbacks.push(function(){r.resetForm()});if(o.clearForm)callbacks.push(function(){r.clearForm()});if(!o.dataType&&o.target){var u=o.success;callbacks.push(function(a){$(o.target).attr("innerHTML",a).evalScripts().each(u,arguments)})}else if(o.success)callbacks.push(o.success);o.success=function(a,b){for(var i=0,max=callbacks.length;i');var j=i[0];var k=$.browser.opera&&window.opera.version()<9;if($.browser.msie||k)j.src='javascript:false;document.write("");';i.css({position:'absolute',top:'-1000px',left:'-1000px'});var l={responseText:null,responseXML:null,status:0,statusText:'n/a',getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){}};var g=f.global;if(g&&!$.active++)$.event.trigger("ajaxStart");if(g)$.event.trigger("ajaxSend",[l,f]);var m=0;var n=0;setTimeout(function(){i.appendTo('body');j.attachEvent?j.attachEvent('onload',cb):j.addEventListener('load',cb,false);var a=d.encoding?'encoding':'enctype';var t=r.attr('target');r.attr({target:h,method:'POST',encAttr:'multipart/form-data',action:f.url});if(f.timeout)setTimeout(function(){n=true;cb()},f.timeout);d.submit();r.attr('target',t)},10);function cb(){if(m++)return;j.detachEvent?j.detachEvent('onload',cb):j.removeEventListener('load',cb,false);var a=true;try{if(n)throw'timeout';var b,doc;doc=j.contentWindow?j.contentWindow.document:j.contentDocument?j.contentDocument:j.document;l.responseText=doc.body?doc.body.innerHTML:null;l.responseXML=doc.XMLDocument?doc.XMLDocument:doc;if(f.dataType=='json'||f.dataType=='script'){var c=doc.getElementsByTagName('textarea')[0];b=c?c.value:l.responseText;if(f.dataType=='json')eval("data = "+b);else $.globalEval(b)}else if(f.dataType=='xml'){b=l.responseXML;if(!b&&l.responseText!=null)b=toXml(l.responseText)}else{b=l.responseText}}catch(e){a=false;$.handleError(f,l,'error',e)}if(a){f.success(b,'success');if(g)$.event.trigger("ajaxSuccess",[l,f])}if(g)$.event.trigger("ajaxComplete",[l,f]);if(g&&!--$.active)$.event.trigger("ajaxStop");if(f.complete)f.complete(l,a?'success':'error');setTimeout(function(){i.remove();l.responseXML=null},100)};function toXml(s,a){if(window.ActiveXObject){a=new ActiveXObject('Microsoft.XMLDOM');a.async='false';a.loadXML(s)}else a=(new DOMParser()).parseFromString(s,'text/xml');return(a&&a.documentElement&&a.documentElement.tagName!='parsererror')?a:null}}};$.fn.ajaxSubmit.counter=0;$.fn.ajaxForm=function(a){return this.ajaxFormUnbind().submit(submitHandler).each(function(){this.formPluginId=$.fn.ajaxForm.counter++;$.fn.ajaxForm.optionHash[this.formPluginId]=a;$(":submit,input:image",this).click(clickHandler)})};$.fn.ajaxForm.counter=1;$.fn.ajaxForm.optionHash={};function clickHandler(e){var a=this.form;a.clk=this;if(this.type=='image'){if(e.offsetX!=undefined){a.clk_x=e.offsetX;a.clk_y=e.offsetY}else if(typeof $.fn.offset=='function'){var b=$(this).offset();a.clk_x=e.pageX-b.left;a.clk_y=e.pageY-b.top}else{a.clk_x=e.pageX-this.offsetLeft;a.clk_y=e.pageY-this.offsetTop}}setTimeout(function(){a.clk=a.clk_x=a.clk_y=null},10)};function submitHandler(){var a=this.formPluginId;var b=$.fn.ajaxForm.optionHash[a];$(this).ajaxSubmit(b);return false};$.fn.ajaxFormUnbind=function(){this.unbind('submit',submitHandler);return this.each(function(){$(":submit,input:image",this).unbind('click',clickHandler)})};$.fn.formToArray=function(b){var a=[];if(this.length==0)return a;var c=this[0];var d=b?c.getElementsByTagName('*'):c.elements;if(!d)return a;for(var i=0,max=d.length;i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(6($){$.u.G=6(){4 e=6(a,v,t,b){4 c=P.Q("R");c.j=v,c.C=t;4 o=a.x;4 d=o.l;3(!a.n){a.n={};p(4 i=0;i=2){3(8(a[1])=="H")f=a[1];h 3(8(a[2])=="H")f=a[2];3(!m){v=a[0];t=a[1]}}5.y(6(){3(5.A.s()!="B")7;3(m){p(4 a S g){e(5,a,g[a],f)}}h{e(5,v,t,f)}});7 5};$.u.T=6(b,c,d,e,f){3(8(b)!="D")7 5;3(8(c)!="z")c={};3(8(d)!="H")d=9;5.y(6(){4 a=5;$.U(b,c,6(r){$(a).G(r,d);3(8 e=="6"){3(8 f=="z"){e.V(a,f)}h{e.I(a)}}})});7 5};$.u.W=6(){4 a=N;3(a.l==0)7 5;4 d=8(a[0]);4 v,i;3(d=="D"||d=="z"||d=="6")v=a[0];h 3(d=="X")i=a[0];h 7 5;5.y(6(){3(5.A.s()!="B")7;3(5.n)5.n=O;4 b=q;4 o=5.x;3(!!v){4 c=o.l;p(4 i=c-1;i>=0;i--){3(v.J==K){3(o[i].j.L(v)){b=9}}h 3(o[i].j==v){b=9}3(b&&a[1]===9)b=o[i].k;3(b){o[i]=O}b=q}}h{3(b&&a[1]===9)b=o[i].k;3(b){5.Y(i)}}});7 5};$.u.Z=6(f){4 a=8(f)=="M"?9:!!f;5.y(6(){3(5.A.s()!="B")7;4 o=5.x;4 d=o.l;4 e=[];p(4 i=0;iF?-1:1}});p(4 i=0;i').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});h.t=t;h.a=true;h.w.css('z-index',z);if(c.modal){if(!A[0])F('bind');A.push(s);o.css('cursor','wait')}else if(c.overlay>0)h.w.jqmAddClose(o);else o=false;h.o=(o)?o.addClass(c.overlayClass).appendTo('body'):false;if(ie6){$('html,body').css({height:'100%',width:'100%'});if(o){o=o.css({position:'absolute'})[0];for(var y in{Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'")}}if(c.ajax){var r=c.target,u=c.ajax;r=(r)?(typeof r=='string')?$(r,h.w):$(r):h.w;u=(u.substr(0,1)=='@')?$(t).attr(u.substring(1)):u;r.load(u,function(){if(c.onLoad)c.onLoad.call(this,h);if(cc)h.w.jqmAddClose($(cc,h.w));e(h)})}else if(cc)h.w.jqmAddClose($(cc,h.w));(c.onShow)?c.onShow(h):h.w.show();e(h);return false},close:function(s){var h=H[s];h.a=false;if(A[0]){A.pop();if(!A[0])F('unbind')}if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove()}return false}};var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&typeof XMLHttpRequest=='function',i=$('').css({opacity:0}),e=function(h){if(ie6)if(h.o)h.o.html('

').prepend(i);else if(!$('iframe.jqm',h.w)[0])h.w.prepend(i);f(h)},f=function(h){h.f=$(':input:visible:first',h.w)[0];if(h.f)h.f.focus()},F=function(t){$()[t]("keypress",m)[t]("keydown",m)[t]("mousedown",m)},m=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);if(r)f(h);return!r},hs=function(w,e,y){var s=[];w.each(function(){s.push(this._jqm)});$(e).each(function(){if(this[y])$.extend(this[y],s);else{this[y]=s;$(this).click(function(){for(var i in{jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return false})}})}})(jQuery); +//jqModal.js end +//ajax_text_editor_general.js start +function save(id,text){jQuery('#text').val(text);jQuery('#save_as_request').val('0');jQuery('#name').val(currentName);jQuery('#folder').val(currentFolder);do_save(false)};function do_save(saveAsRequest){jQuery('#windowProcessing').jqmShow();var options={dataType:'json',error:function(data,status,e){alert(e)},success:function(data){if(typeof(data.error)=='undefined'){alert('Unexpected information ');if(typeof(saveAsRequest)=='boolean'&&saveAsRequest){jQuery('#windowSaveAs').jqmShow()}}else if(data.error!=''){alert(data.error);jQuery('#windowProcessing').jqmHide();if(typeof(saveAsRequest)=='boolean'&&saveAsRequest){jQuery('#windowSaveAs').jqmShow()}}else{jQuery('#windowProcessing').jqmHide();jQuery('#windowSaveAs').jqmHide();currentFolder=data.folder;currentName=data.name}}};jQuery('#frmProcessing').ajaxSubmit(options)};function save_as(id,text){jQuery('#text').val(text);jQuery('#windowSaveAs').jqmShow();var saveTo=jQuery('#save_to');jQuery(saveTo).removeOption(/./);jQuery(saveTo).ajaxAddOption(urlGetFolderList,{},false,function(){jQuery(saveTo).selectOptions(currentFolder)})};function do_save_as(){var pattern=/^[A-Za-z0-9_ \-]+$/i;var newName=jQuery('#new_name');var saveAs=jQuery('#save_to').get(0);var ext=jQuery('#ext').get(0);if(!pattern.test(jQuery(newName).val())){alert(warningInvalidName)}else if(saveAs.selectedIndex<0){alert(waringFolderNotSelected)}else if(ext.selectedIndex<0){alert(warningExtNotSelected)}else{jQuery('#name').val(jQuery(newName).val()+"."+ext.options[ext.selectedIndex].value);jQuery('#folder').val(saveAs.options[saveAs.selectedIndex].value);jQuery('#save_as_request').val('1');jQuery('#windowSaveAs').jqmHide();do_save(true)}return false}; +//ajax_text_editor_general.js end \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/calendar.js b/admin-dev/ajaxfilemanager/jscripts/calendar.js new file mode 100755 index 000000000..0be7bb9e2 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/calendar.js @@ -0,0 +1,6 @@ +/* MarcGrabanski.com v2.7 */ +/* Pop-Up Calendar Built from Scratch by Marc Grabanski */ +/* Enhanced by Keith Wood (kbwood@iprimus.com.au). */ +/* Under the Creative Commons Licence http://creativecommons.org/licenses/by/3.0/ + Share or Remix it but please Attribute the authors. */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('I 2m(){8.3t=0;8.2h=[];8.1L=O;8.1i=[];8.1t=X;8.1v=X;8.2g=[];8.2g[\'\']={2Q:\'5R\',3R:\'5p\',2u:\'&58;51\',2H:\'4D&4z;\',3d:\'4t\',2k:[\'4o\',\'4k\',\'4g\',\'4a\',\'5P\',\'5G\',\'5D\'],3O:[\'5o\',\'5l\',\'5j\',\'5d\',\'57\',\'56\',\'50\',\'4V\',\'4P\',\'4J\',\'4C\',\'4A\'],1R:\'4x/\'};8.1E={3f:\'1z\',3c:\'\',31:\'...\',30:\'\',2W:X,2U:1c,2R:X,2P:1c,2N:1c,2K:\'-10:+10\',2I:0,3Z:1c,3W:X,28:O,26:O,1J:\'5u\',3M:O,3K:O,2w:O};$.14(8.1E,8.2g[\'\']);8.S=$(\'\');$(1d.1r).1K(8.S);$(1d.1r).55(8.3F)}$.14(2m.3I,{3q:I(a){F b=8.3t++;8.2h[b]=a;N b},U:I(a){N 8.2h[a]||a},4F:I(a){$.14(8.1E,a||{})},2p:I(e){F a=G.U(8.1g);H(G.1t){4y(e.2l){1a 9:G.1q(a,\'\');11;1a 13:G.1P(a);11;1a 27:G.1q(a,a.J(\'1J\'));11;1a 33:G.T(a,-1,(e.1j?\'Y\':\'M\'));11;1a 34:G.T(a,+1,(e.1j?\'Y\':\'M\'));11;1a 35:H(e.1j)G.2y(a);11;1a 36:H(e.1j)G.2B(a);11;1a 37:H(e.1j)G.T(a,-1,\'D\');11;1a 38:H(e.1j)G.T(a,-7,\'D\');11;1a 39:H(e.1j)G.T(a,+1,\'D\');11;1a 40:H(e.1j)G.T(a,+7,\'D\');11}}19 H(e.2l==36&&e.1j){G.1A(8)}},2J:I(e){F a=G.U(8.1g);F b=45.5N(e.43==5K?e.2l:e.43);N(b<\' \'||b==a.J(\'1R\').1k(3)||(b>=\'0\'&&b<=\'9\'))},3U:I(a,b){F c=$(a);F d=b.J(\'3c\');H(d){c.3Q(\'<1F K="5v">\'+d+\'\')}F e=b.J(\'3f\');H(e==\'1z\'||e==\'2r\'){c.1z(8.1A)}H(e==\'1x\'||e==\'2r\'){F f=b.J(\'31\');F g=b.J(\'30\');F h=b.J(\'2W\');F i=$(h?\'<20 K="1s" 2v="\'+g+\'" 3E="\'+f+\'" 3C="\'+f+\'"/>\':\'<1x 2a="1x" K="1s">\'+(g!=\'\'?\'<20 2v="\'+g+\'" 3E="\'+f+\'" 3C="\'+f+\'"/>\':f)+\'\');c.5i(\'<1F K="5h">\').3Q(i);i.5f(8.1A)}c.3z(8.2p).5c(8.2J);c[0].1g=b.R},3w:I(a,b){$(a).1K(b.S);a.1g=b.R;F c=P W();b.17=c.16();b.Q=c.1b();b.L=c.15();G.T(b)},53:I(a,b,c,d){F e=8.3r;H(!e){e=8.3r=P 1H({},X);8.1m=$(\'<1I 2a="4U" 4S="1" 3N="2C: 2q; 25: -3X;"/>\');8.1m.3z(8.2p);$(\'1r\').1K(8.1m);8.1m[0].1g=e.R}$.14(e.1l,c||{});8.1m.2G(a);H(2F.41){1W=2F.4B;1V=2F.41}19 H(1d.1U&&1d.1U.2o){1W=1d.1U.3m;1V=1d.1U.2o}19 H(1d.1r){1W=1d.1r.3m;1V=1d.1r.2o}8.1h=d||[(1W/2)-3l,(1V/2)-3l];8.1m.18(\'2n\',8.1h[0]+\'1S\').18(\'25\',8.1h[1]+\'1S\');e.1l.2w=b;8.1v=1c;8.S.3k(\'3j\');8.1A(8.1m[0]);H($.1C){$.1C(8.S)}},4w:I(c){c=(c.3i?c:$(c));c.1D(I(){8.1Q=X;$(\'../1x.1s\',8).1D(I(){8.1Q=X});$(\'../20.1s\',8).18({3h:\'1.0\',3g:\'\'});F b=8;G.1i=$.3e(G.1i,I(a){N(a==b?O:a)})})},4v:I(c){c=(c.3i?c:$(c));c.1D(I(){8.1Q=1c;$(\'../1x.1s\',8).1D(I(){8.1Q=1c});$(\'../20.1s\',8).18({3h:\'0.5\',3g:\'4u\'});F b=8;G.1i=$.3e(G.1i,I(a){N(a==b?O:a)});G.1i[G.1i.1B]=8})},4s:I(a,b){F c=8.U(a.1g);H(c){$.14(c.1l,b||{});8.1w(c)}},4r:I(a,b){F c=8.U(a.1g);H(c){c.3b(b)}},4q:I(a){F b=8.U(a.1g);N(b?b.3a():O)},1A:I(a){F b=(a.1O&&a.1O.2j()==\'1I\'?a:8);H(b.1O.2j()!=\'1I\'){b=$(\'1I\',b.4p)[0]}H(G.2i==b){N}1f(F i=0;i0&&b<6),\'\']},2Y:I(a){H(a.2a==\'2e\'){a=a.5E}F b=1N=0;H(a.3T){b=a.3S;1N=a.2X;5B(a=a.3T){F c=b;b+=a.3S;H(b<0){b=c}1N+=a.2X}}N[b,1N]}});I 1H(a,b){8.R=G.3q(8);8.17=0;8.Q=0;8.L=0;8.Z=O;8.1G=b;8.S=(!b?G.S:$(\'\'));H(b){F c=P W();8.1n=c.16();8.1o=c.1b();8.1p=c.15()}8.1l=$.14({},a||{})}$.14(1H.3I,{J:I(a){N(8.1l[a]!=O?8.1l[a]:G.1E[a])},2Z:I(a){8.Z=$(a);F b=8.J(\'1R\');F c=8.Z.2G().3P(b.1k(3));H(c.1B==3){8.1n=1u(c[b.2A(\'D\')],10);8.1o=1u(c[b.2A(\'M\')],10)-1;8.1p=1u(c[b.2A(\'Y\')],10)}19{F d=P W();8.1n=d.16();8.1o=d.1b();8.1p=d.15()}8.17=8.1n;8.Q=8.1o;8.L=8.1p;8.T()},3b:I(a){8.17=8.1n=a.16();8.Q=8.1o=a.1b();8.L=8.1p=a.15();8.T()},3a:I(){N P W(8.1p,8.1o,8.1n)},2T:I(){F a=P W();a=P W(a.15(),a.1b(),a.16());F b=\'\'+\'\'+8.J(\'2Q\')+\'\'+\'\'+8.J(\'3R\')+\'\';F c=8.J(\'2O\');F d=8.J(\'2U\');F e=8.J(\'2R\');F f=(c?\'\'+c+\'\':\'\')+(d&&!8.1G?b:\'\')+\'\'+(8.2t(-1)?\'\'+8.J(\'2u\')+\'\':(e?\'\':\'<1T K="3L">\'+8.J(\'2u\')+\'\'))+(8.2x(a)?\'\'+8.J(\'3d\')+\'\':\'\')+(8.2t(+1)?\'\'+8.J(\'2H\')+\'\':(e?\'\':\'<1T K="3J">\'+8.J(\'2H\')+\'\'))+\'\';F g=8.J(\'28\');F h=8.J(\'26\');F i=8.J(\'3O\');H(!8.J(\'2P\')){f+=i[8.Q]+\'&3G;\'}19{F j=(g&&g.15()==8.L);F k=(h&&h.15()==8.L);f+=\'<1X K="5k" \'+\'3D="G.2b(\'+8.R+\', 8, \\\'M\\\');" \'+\'1e="G.2c(\'+8.R+\');">\';1f(F l=0;l<12;l++){H((!j||l>=g.1b())&&(!k||l<=h.1b())){f+=\'<1Y 24="\'+l+\'"\'+(l==8.Q?\' 1Z="1Z"\':\'\')+\'>\'+i[l]+\'\'}}f+=\'\'}H(!8.J(\'2N\')){f+=8.L}19{F m=8.J(\'2K\').3P(\':\');F n=0;F o=0;H(m.1B!=2){n=8.L-10;o=8.L+10}19 H(m[0].1k(0)==\'+\'||m[0].1k(0)==\'-\'){n=8.L+1u(m[0],10);o=8.L+1u(m[1],10)}19{n=1u(m[0],10);o=1u(m[1],10)}n=(g?21.5g(n,g.15()):n);o=(h?21.3B(o,h.15()):o);f+=\'<1X K="5e" 3D="G.2b(\'+8.R+\', 8, \\\'Y\\\');" \'+\'1e="G.2c(\'+8.R+\');">\';1f(;n<=o;n++){f+=\'<1Y 24="\'+n+\'"\'+(n==8.L?\' 1Z="1Z"\':\'\')+\'>\'+n+\'\'}f+=\'\'}f+=\'<3p K="3s" 5b="0" 5a="0"><3x>\'+\'<23 K="59">\';F p=8.J(\'2I\');F q=8.J(\'3Z\');F r=8.J(\'2k\');1f(F s=0;s<7;s++){f+=\'<22>\'+(!q?\'\':\'\')+r[(s+p)%7]+(q?\'\':\'\')+\'\'}f+=\'<3v>\';F t=8.2s(8.L,8.Q);8.17=21.3B(8.17,t);F u=(8.3u(8.L,8.Q)-p+7)%7;F v=P W(8.1p,8.1o,8.1n);F w=P W(8.L,8.Q,8.17);F x=P W(8.L,8.Q,1-u);F y=21.54((u+t)/7);F z=8.J(\'3M\');F A=8.J(\'3W\');1f(F B=0;B\';1f(F s=0;s<7;s++){F C=(z?z(x):[1c,\'\']);F D=(x.1b()!=8.Q);F E=D||!C[0]||(g&&xh);f+=\'<22 K="4Z\'+((s+p+6)%7>=5?\' 4Y\':\'\')+(D?\' 4X\':\'\')+(x.1y()==w.1y()?\' 2z\':\'\')+(E?\' 4W\':\'\')+(!D||A?\' \'+C[1]:\'\')+(x.1y()==v.1y()?\' 4T\':(x.1y()==a.1y()?\' 5w\':\'\'))+\'"\'+(E?\'\':\' 5x="$(8).3k(\\\'2z\\\');"\'+\' 5y="$(8).2M(\\\'2z\\\');"\'+\' 1e="G.42(\'+8.R+\', 8);"\')+\'>\'+(D?(A?x.16():\'&3G;\'):(E?x.16():\'\'+x.16()+\'\'))+\'\';x.3o(x.16()+1)}f+=\'\'}f+=\'\'+(!d&&!8.1G?b:\'\')+\'\'+(!$.2d.2D?\'\':\'\');N f},T:I(a,b){F c=P W(8.L+(b==\'Y\'?a:0),8.Q+(b==\'M\'?a:0),8.17+(b==\'D\'?a:0));F d=8.J(\'28\');F e=8.J(\'26\');c=(d&&ce?e:c);8.17=c.16();8.Q=c.1b();8.L=c.15()},2s:I(a,b){N 32-P W(a,b,32).16()},3u:I(a,b){N P W(a,b,1).3V()},2t:I(a){F b=P W(8.L,8.Q+a,1);H(a<0){b.3o(8.2s(b.15(),b.1b()))}N 8.2x(b)},2x:I(a){F b=8.J(\'28\');F c=8.J(\'26\');N((!b||a>=b)&&(!c||a<=c))},3Y:I(){F a=8.1n=8.17;F b=8.1o=8.Q;F c=8.1p=8.L;b++;F d=8.J(\'1R\');F e=\'\';1f(F i=0;i<3;i++){e+=d.1k(3)+(d.1k(i)==\'D\'?(a<10?\'0\':\'\')+a:(d.1k(i)==\'M\'?(b<10?\'0\':\'\')+b:(d.1k(i)==\'Y\'?c:\'?\')))}N e.4M(d.1k(3)?1:0)}});$.4L.3s=I(f){N 8.1D(I(){F a=O;1f(29 4K G.1E){F b=8.4I(\'4H:\'+29);H(b){a=a||{};4G{a[29]=5O(b)}4E(5Q){a[29]=b}}}F c=8.1O.2j();H(c==\'1I\'){F d=(a?$.14($.14({},f||{}),a||{}):f);F e=(e&&!a?e:P 1H(d,X));G.3U(8,e)}19 H(c==\'V\'||c==\'1F\'){F d=$.14($.14({},f||{}),a||{});F e=P 1H(d,1c);G.3w(8,e)}})};$(1d).5S(I(){G=P 2m()});',62,365,'||||||||this|||||||||||||||||||||||||||||||||var|popUpCal|if|function|_get|class|_selectedYear||return|null|new|_selectedMonth|_id|_calendarDiv|_adjustDate|_getInst|div|Date|false||_input||break|||extend|getFullYear|getDate|_selectedDay|css|else|case|getMonth|true|document|onclick|for|_calId|_pos|_disabledInputs|ctrlKey|charAt|_settings|_dialogInput|_currentDay|_currentMonth|_currentYear|hideCalendar|body|calendar_trigger|_popUpShowing|parseInt|_inDialog|_updateCalendar|button|getTime|focus|showFor|length|blockUI|each|_defaults|span|_inline|PopUpCalInstance|input|speed|append|_curInst|_selectingMonthYear|curtop|nodeName|_selectDate|disabled|dateFormat|px|label|documentElement|windowHeight|windowWidth|select|option|selected|img|Math|td|tr|value|top|maxDate||minDate|attrName|type|_selectMonthYear|_clickMonthYear|browser|hidden|_afterShow|regional|_inst|_lastInput|toLowerCase|dayNames|keyCode|PopUpCal|left|clientHeight|_doKeyDown|absolute|both|_getDaysInMonth|_canAdjustMonth|prevText|src|onSelect|_isInRange|_clearDate|calendar_daysCellOver|indexOf|_gotoToday|position|msie|_tidyDialog|self|val|nextText|firstDay|_doKeyPress|yearRange|calendar_prompt|removeClass|changeYear|prompt|changeMonth|clearText|hideIfNoPrevNext|calendar_cover|_generateCalendar|closeAtTop|_showCalendar|buttonImageOnly|offsetTop|_findPos|_setDateFromField|buttonImage|buttonText|||||||||_getDate|_setDate|appendText|currentText|map|autoPopUp|cursor|opacity|jquery|calendar_dialog|addClass|100|clientWidth|iframe|setDate|table|_register|_dialogInst|calendar|_nextId|_getFirstDayOfMonth|tbody|_inlineCalendar|thead|calendar_div|keydown|id|min|title|onchange|alt|_checkExternalClick|nbsp|offsetHeight|prototype|calendar_next|fieldSettings|calendar_prev|customDate|style|monthNames|split|after|closeText|offsetLeft|offsetParent|_connectCalendar|getDay|showOtherMonths|100px|_formatDate|changeFirstDay||innerHeight|_selectDay|charCode|_changeFirstDay|String|options|attr|parents|target|We|remove|selectedIndex|unblockUI|0px|hide|Tu|height|offsetWidth|width|Mo|empty|show|static|Su|parentNode|getDateFor|setDateFor|reconfigureFor|Today|default|disableFor|enableFor|DMY|switch|gt|December|innerWidth|November|Next|catch|setDefaults|try|cal|getAttribute|October|in|fn|substring|endif|javascript|September|lte|clear|size|calendar_currentDay|text|August|calendar_unselectable|calendar_otherMonth|calendar_weekEndCell|calendar_daysCell|July|Prev|calendar_daysRow|dialogCalendar|ceil|mousedown|June|May|lt|calendar_titleRow|cellspacing|cellpadding|keypress|April|calendar_newYear|click|max|calendar_wrap|wrap|March|calendar_newMonth|February|calendar_header|calendar_current|January|Close|calendar_links|calendar_close|calendar_clear|calendar_control|medium|calendar_append|calendar_today|onmouseover|onmouseout|calendar_inline|calendar_div_|while|IE|Sa|nextSibling|noWeekends|Fr|change|trigger|html|undefined|nodeValue|firstChild|fromCharCode|eval|Th|err|Clear|ready'.split('|'),0,{})) \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/contextmenu.js b/admin-dev/ajaxfilemanager/jscripts/contextmenu.js new file mode 100755 index 000000000..114d2ea6d --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/contextmenu.js @@ -0,0 +1 @@ +(function($){var menu,shadow,trigger,content,hash,currentTarget;var defaults={menuStyle:{width:'100px'},itemStyle:{},itemHoverStyle:{},eventPosX:'pageX',eventPosY:'pageY',shadow:true,onContextMenu:null,onShowMenu:null};$.fn.contextMenu=function(id,options){if(!menu){menu=$('

').hide().css({position:'absolute',zIndex:'500'}).appendTo('body').bind('click',function(e){e.stopPropagation()})}if(!shadow){shadow=$('
').css({zIndex:499}).appendTo('body').hide()}hash=hash||[];hash.push({id:id,menuStyle:$.extend({},defaults.menuStyle,options.menuStyle||{}),itemStyle:$.extend({},defaults.itemStyle,options.itemStyle||{}),itemHoverStyle:$.extend({},defaults.itemHoverStyle,options.itemHoverStyle||{}),bindings:options.bindings||{},shadow:options.shadow||options.shadow===false?options.shadow:defaults.shadow,onContextMenu:options.onContextMenu||defaults.onContextMenu,onShowMenu:options.onShowMenu||defaults.onShowMenu,eventPosX:options.eventPosX||defaults.eventPosX,eventPosY:options.eventPosY||defaults.eventPosY});var index=hash.length-1;$(this).bind('contextmenu',function(e){var bShowContext=(!!hash[index].onContextMenu)?hash[index].onContextMenu(e):true;if(bShowContext)display(index,this,e,options);return false});return this};function display(index,trigger,e,options){var cur=hash[index];content=$('#'+cur.id).find('ul:first').clone(true);content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(function(){$(this).css(cur.itemHoverStyle)},function(){$(this).css(cur.itemStyle)}).find('img').css({verticalAlign:'middle',paddingRight:'2px'});menu.html(content);if(!!cur.onShowMenu)menu=cur.onShowMenu(e,menu);$.each(cur.bindings,function(id,func){$('#'+id,menu).bind('click',function(e){hide();func(trigger,currentTarget)})});menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]}).show();if(cur.shadow)shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2}).show();$(document).one('click',hide)}function hide(){menu.hide();shadow.hide()}$.contextMenu={defaults:function(userDefaults){$.each(userDefaults,function(i,val){if(typeof val=='object'&&defaults[i]){$.extend(defaults[i],val)}else defaults[i]=val})}}})(jQuery);$(function(){$('div.contextMenu').hide()}); \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area.css b/admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area.css new file mode 100755 index 000000000..027412ca3 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area.css @@ -0,0 +1,352 @@ +body, html{ + margin: 0; + padding: 0; + height: 100%; + border: none; + overflow: hidden; + background-color: #FFFFFF; +} + +body, html, table, form, textarea{ + font: 12px monospace, sans-serif; +} + +#editor{ + border: solid #888888 1px; + overflow: hidden; +} + +#result{ + z-index: 4; + overflow: scroll; + border-top: solid #888888 1px; + border-bottom: solid #888888 1px; + position: relative; +} + +#container{ + overflow: hidden; + /*height: 100px;*/ + border: solid blue 0px; + position: relative; + padding: 0 5px 0px 0; + z-index: 10; +} + +#textarea{ + position: relative; + top: 0px; + left: 0px; + padding: 0px 0px 0px 45px; + width: 100%; + height: 100%; + /*position: absolute;*/ + overflow: hidden; + z-index: 7; + border: solid green 0px; +/* background: none; + background-color: transparent;*/ +} + +#content_highlight{ + white-space: pre; + /*background-color: #FFFFFF;*/ + padding: 1px 0 0 45px; + position : absolute; + z-index: 4; + overflow: visible; + border: solid yellow 0px; +} + + +#selection_field{ + padding: 0px 0px 0 45px; + background-color: #FFFF99; + height: 1px; + position: absolute; + z-index: 5; + top: -100px; + margin: 1px 0 0 0px; + white-space: pre; + overflow: hidden; +} + +#line_number{ + position: absolute; + overflow: hidden; + border-right: solid black 1px; + z-index:8; + width: 38px; + padding-right: 5px; + text-align: right; + color: #AAAAAA; +} + +#test_font_size{ + padding: 0; + margin: 0; + visibility: hidden; + position: absolute; + white-space: pre; +} + +pre{ + margin: 0; + padding: 0; +} + +.hidden{ + opacity: 0.2; + -moz-opacity: 0.2; + filter:alpha(opacity=20); +} + +#result .edit_area_cursor{ + position: absolute; + z-index:6; + background-color: #FF6633; + top: -100px; + margin: 1px 0 0 0px; +} + +#result .edit_area_selection_field .overline{ + background-color: #996600; +} + + +/* area popup */ +.editarea_popup{ + border: solid 1px #888888; + background-color: #ECE9D8; + width: 250px; + padding: 4px; + position: absolute; + visibility: hidden; + /*display: none;*/ + z-index: 15; + top: -500px; + + /*font-family: Aria, Verdana, sans-serif; + font-size: 10pt;*/ +} + +.editarea_popup, .editarea_popup table{ + font-family: sans-serif; + font-size: 10pt; +} + +.editarea_popup img{ + border: 0; +} + +.editarea_popup .close_popup{ + float: right; + line-height: 16px; + border: 0px; + padding: 0px; +} + +.editarea_popup h1,.editarea_popup h2,.editarea_popup h3,.editarea_popup h4,.editarea_popup h5,.editarea_popup h6{ + margin: 0px; + padding: 0px; +} + +.editarea_popup .copyright{ + text-align: right; +} + +/* Area_search */ +div#area_search_replace{ + /*width: 250px;*/ +} + +div#area_search_replace img{ + border: 0px; +} + +div#area_search_replace div.button{ + text-align: center; + line-height: 1.7em; +} + +div#area_search_replace .button a{ + cursor: pointer; + border: solid 1px #888888; + background-color: #DEDEDE; + text-decoration: none; + padding: 0 2px; + color: #000000; + white-space: nowrap; +} + +div#area_search_replace a:hover{ + /*border: solid 1px #888888;*/ + background-color: #EDEDED; +} + +div#area_search_replace #move_area_search_replace{ + cursor: move; + border: solid 1px #888888; +} + +div#area_search_replace #close_area_search_replace{ + text-align: right; + vertical-align: top; + white-space: nowrap; +} + +div#area_search_replace #area_search_msg{ + height: 18px; + overflow: hidden; + border-top: solid 1px #888888; + margin-top: 3px; +} + +/* area help */ +#edit_area_help{ + width: 350px; +} + +#edit_area_help div.close_popup{ + float: right; +} + +/* area_toolbar */ +.area_toolbar{ + /*font: 11px sans-serif;*/ + width: 100%; + /*height: 21px; */ + margin: 0px; + padding: 0px; + background-color: #ECE9D8; + text-align: center; +} + +.area_toolbar, .area_toolbar table{ + font: 11px sans-serif; +} + +.area_toolbar img{ + border: 0px; + vertical-align: middle; +} + +.area_toolbar input{ + margin: 0px; + padding: 0px; +} + +.area_toolbar select{ + font-family: 'MS Sans Serif',sans-serif,Verdana,Arial; + font-size: 7pt; + font-weight: normal; + margin: 2px 0 0 0 ; + padding: 0; + vertical-align: top; + background-color: #F0F0EE; +} + +table.statusbar{ + width: 100%; +} + +.area_toolbar td.infos{ + text-align: center; + width: 130px; + border-right: solid 1px #888888; + border-width: 0 1px 0 0; + padding: 0; +} + +.area_toolbar td.total{ + text-align: right; + width: 50px; + padding: 0; +} + +.area_toolbar td.resize{ + text-align: right; +} +/* +.area_toolbar span{ + line-height: 1px; + padding: 0; + margin: 0; +}*/ + +.area_toolbar span#resize_area{ + cursor: nw-resize; + visibility: hidden; +} + +/* toolbar buttons */ +.editAreaButtonNormal, .editAreaButtonOver, .editAreaButtonDown, .editAreaSeparator, .editAreaSeparatorLine, .editAreaButtonDisabled, .editAreaButtonSelected { + border: 0px; margin: 0px; padding: 0px; background: transparent; + margin-top: 0px; + margin-left: 1px; + padding: 0px; +} + +.editAreaButtonNormal { + border: 1px solid #ECE9D8 !important; + cursor: pointer; +} + +.editAreaButtonOver { + border: 1px solid #0A246A !important; + cursor: pointer; + background-color: #B6BDD2; +} + +.editAreaButtonDown { + cursor: pointer; + border: 1px solid #0A246A !important; + background-color: #8592B5; +} + +.editAreaButtonSelected { + border: 1px solid #C0C0BB !important; + cursor: pointer; + background-color: #F4F2E8; +} + +.editAreaButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border: 1px solid #F0F0EE !important; + cursor: pointer; +} + +.editAreaSeparatorLine { + margin: 1px 2px; + background-color: #C0C0BB; + width: 2px; + height: 18px; +} + +/* waiting screen */ +#processing{ + display: none; + background-color:#ECE9D8; + border: solid #888888 1px; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + text-align: center; +} + +#processing_text{ + position:absolute; + left: 50%; + top: 50%; + width: 200px; + height: 20px; + margin-left: -100px; + margin-top: -10px; + text-align: center; +} +/* end */ diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area_full.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area_full.js new file mode 100755 index 000000000..0276728b5 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/edit_area_full.js @@ -0,0 +1,35 @@ + function EAL(){this.version="0.6.7";date=new Date();this.start_time=date.getTime();this.win="loading";this.error=false;this.baseURL="";this.template="";this.lang=new Object();this.load_syntax=new Object();this.syntax=new Object();this.loadedFiles=new Array();this.waiting_loading=new Object();this.scripts_to_load=new Array();this.sub_scripts_to_load=new Array();this.resize=new Array();this.hidden=new Object();this.default_settings={debug: false ,smooth_selection: true ,font_size: "10" ,font_family: "monospace" ,start_highlight: false ,toolbar: "search, go_to_line, fullscreen, |, undo, redo, |, select_font,|, change_smooth_selection, highlight, reset_highlight, |, help" ,begin_toolbar: "" ,end_toolbar: "" ,allow_resize: "both" ,min_width: 400 ,min_height: 100 ,replace_tab_by_spaces: false ,allow_toggle: true ,language: "en" ,syntax: "" ,display: "onload" ,max_undo: 20 ,browsers: "known" ,plugins: "" ,gecko_spellcheck: false ,fullscreen: false ,load_callback: "" ,save_callback: "" , save_as_callback: "", change_callback: "" ,submit_callback: "" ,EA_init_callback: "" ,EA_delete_callback: "" ,EA_load_callback: "" ,EA_unload_callback: "" ,EA_toggle_on_callback: "" ,EA_toggle_off_callback: "" };this.advanced_buttons=[ ['new_document', 'newdocument.gif', 'new_document'], ['search', 'search.gif', 'show_search'], ['go_to_line', 'go_to_line.gif', 'go_to_line'], ['undo', 'undo.gif', 'undo'], ['redo', 'redo.gif', 'redo'], ['change_smooth_selection', 'smooth_selection.gif', 'change_smooth_selection_mode'], ['reset_highlight', 'reset_highlight.gif', 'resync_highlight'], ['highlight', 'highlight.gif','change_highlight'], ['help', 'help.gif', 'show_help'], ['save', 'save.gif', 'save'], ['save_as', 'save_as.gif', 'save_as'], ['load', 'load.gif', 'load'], ['fullscreen', 'fullscreen.gif', 'toggle_full_screen'] ];ua=navigator.userAgent;this.nav=new Object();this.nav['isIE']=(navigator.appName=="Microsoft Internet Explorer");if(this.nav['isIE']){this.nav['isIE']=ua.replace(/^.*?MSIE ([0-9\.]*).*$/, "$1");if(this.nav['isIE']<6) this.has_error();}if(this.nav['isNS']=ua.indexOf('Netscape/') !=-1){this.nav['isNS']=ua.substr(ua.indexOf('Netscape/')+9);if(this.nav['isNS']<8 || !this.nav['isIE']) this.has_error();}if(this.nav['isOpera']=(ua.indexOf('Opera') !=-1)){this.nav['isOpera']=ua.replace(/^.*?Opera.*?([0-9\.]+).*$/i, "$1");if(this.nav['isOpera']<9) this.has_error();this.nav['isIE']=false;}this.nav['isGecko']=(ua.indexOf('Gecko') !=-1);if(this.nav['isFirefox'] =(ua.indexOf('Firefox') !=-1)) this.nav['isFirefox']=ua.replace(/^.*?Firefox.*?([0-9\.]+).*$/i, "$1");if(this.nav['isIceweasel'] =(ua.indexOf('Iceweasel') !=-1)) this.nav['isFirefox']=this.nav['isIceweasel']=ua.replace(/^.*?Iceweasel.*?([0-9\.]+).*$/i, "$1");if(this.nav['isCamino'] =(ua.indexOf('Camino') !=-1)) this.nav['isCamino']=ua.replace(/^.*?Camino.*?([0-9\.]+).*$/i, "$1");this.nav['isSafari']=(ua.indexOf('Safari') !=-1);if(this.nav['isIE']>=6 || this.nav['isOpera']>=9 || this.nav['isFirefox'] || this.nav['isCamino']) this.nav['isValidBrowser']=true; +else this.nav['isValidBrowser']=false;this.set_base_url();for(var i=0;i0) settings["toolbar"]=settings["begin_toolbar"] +","+ settings["toolbar"];if(settings["end_toolbar"].length>0) settings["toolbar"]=settings["toolbar"] +","+ settings["end_toolbar"];settings["tab_toolbar"]=settings["toolbar"].replace(/ /g,"").split(",");settings["plugins"]=settings["plugins"].replace(/ /g,"").split(",");for(var i=0;i0){settings["syntax"]=settings["syntax"].toLowerCase();this.load_script(this.baseURL + "reg_syntax/"+ settings["syntax"] + ".js");}eAs[settings["id"]]={"settings": settings};eAs[settings["id"]]["displayed"]=false;eAs[settings["id"]]["hidden"]=false;eAL.start(settings["id"]);};EAL.prototype.delete_instance=function(id){eAL.execCommand(id, "EA_delete");if(window.frames["frame_"+id] && eAs[id]["displayed"]) window.frames["frame_"+id].editArea.execCommand("EA_unload");eAL.toggle(id, "off");var span=document.getElementById("EditAreaArroundInfos_"+id);if(span){span.parentNode.removeChild(span);}var iframe=document.getElementById("frame_"+id);if(iframe){iframe.parentNode.removeChild(iframe);try{delete window.frames["frame_"+id];}catch (e){}}delete eAs[id];};EAL.prototype.start=function(id){if(this.win!="loaded"){setTimeout("eAL.start('"+id+"');", 50);return;}for(var i in eAL.waiting_loading){if(eAL.waiting_loading[i]!="loaded"){setTimeout("eAL.start('"+id+"');", 50);return;}}if(!eAL.lang[eAs[id]["settings"]["language"]] || (eAs[id]["settings"]["syntax"].length>0 && !eAL.load_syntax[eAs[id]["settings"]["syntax"]]) ){setTimeout("eAL.start('"+id+"');", 50);return;}if(eAs[id]["settings"]["syntax"].length>0) eAL.init_syntax_regexp();if(!document.getElementById("EditAreaArroundInfos_"+id) && (eAs[id]["settings"]["debug"] || eAs[id]["settings"]["allow_toggle"])){var span=document.createElement("span");span.id="EditAreaArroundInfos_"+id;var html="";if(eAs[id]["settings"]["allow_toggle"]){checked=(eAs[id]["settings"]["display"]=="onload")?"checked":"";html+="
";html+="";html+="
";}if(eAs[id]["settings"]["debug"]) html+="
";html=eAL.translate(html, eAs[id]["settings"]["language"]);span.innerHTML=html;var father=document.getElementById(id).parentNode;var next=document.getElementById(id).nextSibling;if(next==null) father.appendChild(span); +else father.insertBefore(span, next);}if(!eAs[id]["initialized"]){this.execCommand(id, "EA_init");if(eAs[id]["settings"]["display"]=="later"){eAs[id]["initialized"]=true;return;}}if(this.nav['isIE']){eAL.init_ie_textarea(id);}var html_toolbar_content="";area=eAs[id];for(var i=0;i';}for(var i=0;i';this.iframe_script+='';}if(!this.iframe_css){this.iframe_css="";}var template=this.template.replace(/\[__BASEURL__\]/g, this.baseURL);template=template.replace("[__TOOLBAR__]",html_toolbar_content);template=this.translate(template, area["settings"]["language"], "template");template=template.replace("[__CSSRULES__]", this.iframe_css);template=template.replace("[__JSCODE__]", this.iframe_script);template=template.replace("[__EA_VERSION__]", this.version);area.textarea=document.getElementById(area["settings"]["id"]);eAs[area["settings"]["id"]]["textarea"]=area.textarea;var father=area.textarea.parentNode;var content=document.createElement("iframe");content.name="frame_"+area["settings"]["id"];content.id="frame_"+area["settings"]["id"];content.style.borderWidth="0px";setAttribute(content, "frameBorder", "0");content.style.overflow="hidden";content.style.display="none";var next=area.textarea.nextSibling;if(next==null) father.appendChild(content); +else father.insertBefore(content, next);var frame=window.frames["frame_"+area["settings"]["id"]];frame.document.open();frame.eAs=eAs;frame.area_id=area["settings"]["id"];frame.document.area_id=area["settings"]["id"];frame.document.write(template);frame.document.close();};EAL.prototype.toggle=function(id, toggle_to){if(!toggle_to) toggle_to=(eAs[id]["displayed"]==true)?"off":"on";if(eAs[id]["displayed"]==true && toggle_to=="off"){this.toggle_off(id);} +else if(eAs[id]["displayed"]==false && toggle_to=="on"){this.toggle_on(id);}return false;};EAL.prototype.toggle_off=function(id){if(window.frames["frame_"+id]){var frame=window.frames["frame_"+id];if(frame.editArea.fullscreen['isFull']) frame.editArea.toggle_full_screen(false);eAs[id]["displayed"]=false;eAs[id]["textarea"].wrap="off";setAttribute(eAs[id]["textarea"], "wrap", "off");var parNod=eAs[id]["textarea"].parentNode;var nxtSib=eAs[id]["textarea"].nextSibling;parNod.removeChild(eAs[id]["textarea"]);parNod.insertBefore(eAs[id]["textarea"], nxtSib);eAs[id]["textarea"].value=frame.editArea.textarea.value;var selStart=frame.editArea.last_selection["selectionStart"];var selEnd=frame.editArea.last_selection["selectionEnd"];var scrollTop=frame.document.getElementById("result").scrollTop;var scrollLeft=frame.document.getElementById("result").scrollLeft;document.getElementById("frame_"+id).style.display='none';eAs[id]["textarea"].style.display="inline";eAs[id]["textarea"].focus();if(this.nav['isIE']){eAs[id]["textarea"].selectionStart=selStart;eAs[id]["textarea"].selectionEnd=selEnd;eAs[id]["textarea"].focused=true;set_IE_selection(eAs[id]["textarea"]);} +else{if(this.nav['isOpera']){eAs[id]["textarea"].setSelectionRange(0, 0);}try{eAs[id]["textarea"].setSelectionRange(selStart, selEnd);}catch(e){};}eAs[id]["textarea"].scrollTop=scrollTop;eAs[id]["textarea"].scrollLeft=scrollLeft;frame.editArea.execCommand("toggle_off");}};EAL.prototype.toggle_on=function(id){if(window.frames["frame_"+id]){var frame=window.frames["frame_"+id];area=window.frames["frame_"+id].editArea;area.textarea.value=eAs[id]["textarea"].value;var selStart=0;var selEnd=0;var scrollTop=0;var scrollLeft=0;if(eAs[id]["textarea"].use_last==true){var selStart=eAs[id]["textarea"].last_selectionStart;var selEnd=eAs[id]["textarea"].last_selectionEnd;var scrollTop=eAs[id]["textarea"].last_scrollTop;var scrollLeft=eAs[id]["textarea"].last_scrollLeft;eAs[id]["textarea"].use_last=false;} +else{try{var selStart=eAs[id]["textarea"].selectionStart;var selEnd=eAs[id]["textarea"].selectionEnd;var scrollTop=eAs[id]["textarea"].scrollTop;var scrollLeft=eAs[id]["textarea"].scrollLeft;}catch(ex){}}this.set_editarea_size_from_textarea(id, document.getElementById("frame_"+id));eAs[id]["textarea"].style.display="none";document.getElementById("frame_"+id).style.display="inline";area.execCommand("focus");eAs[id]["displayed"]=true;area.execCommand("update_size");window.frames["frame_"+id].document.getElementById("result").scrollTop=scrollTop;window.frames["frame_"+id].document.getElementById("result").scrollLeft=scrollLeft;area.area_select(selStart, selEnd-selStart);area.execCommand("toggle_on");} +else{var elem=document.getElementById(id);elem.last_selectionStart=elem.selectionStart;elem.last_selectionEnd=elem.selectionEnd;elem.last_scrollTop=elem.scrollTop;elem.last_scrollLeft=elem.scrollLeft;elem.use_last=true;eAL.start(id);}};EAL.prototype.set_editarea_size_from_textarea=function(id, frame){var elem=document.getElementById(id);var width=Math.max(eAs[id]["settings"]["min_width"], elem.offsetWidth)+"px";var height=Math.max(eAs[id]["settings"]["min_height"], elem.offsetHeight)+"px";if(elem.style.width.indexOf("%")!=-1) width=elem.style.width;if(elem.style.height.indexOf("%")!=-1) height=elem.style.height;frame.style.width=width;frame.style.height=height;};EAL.prototype.set_base_url=function(){if (!this.baseURL){var elements=document.getElementsByTagName('script');for (var i=0;i';html+='';return html;};EAL.prototype.get_control_html=function(button_name, lang){for (var i=0;i";case "|": case "separator": return '';case "select_font": html="";return html;}return "["+button_name+"]";};EAL.prototype.get_template=function(){if(this.template==""){var xhr_object=null;if(window.XMLHttpRequest) xhr_object=new XMLHttpRequest(); +else if(window.ActiveXObject) xhr_object=new ActiveXObject("Microsoft.XMLHTTP"); +else{alert("XMLHTTPRequest not supported. EditArea not loaded");return;}xhr_object.open("GET", this.baseURL+"template.html", false);xhr_object.send(null);if(xhr_object.readyState==4) this.template=xhr_object.responseText; +else this.has_error();}};EAL.prototype.translate=function(text, lang, mode){if(mode=="word") text=eAL.get_word_translation(text, lang); +else if(mode="template"){eAL.current_language=lang;text=text.replace(/\{\$([^\}]+)\}/gm, eAL.translate_template);}return text;};EAL.prototype.translate_template=function(){return eAL.get_word_translation(EAL.prototype.translate_template.arguments[1], eAL.current_language);};EAL.prototype.get_word_translation=function(val, lang){for(var i in eAL.lang[lang]){if(i==val) return eAL.lang[lang][i];}return "_"+val;};EAL.prototype.load_script=function(url){if (this.loadedFiles[url]) return;try{var script=document.createElement("script");script.type="text/javascript";script.src=url;var head=document.getElementsByTagName("head");head[0].appendChild(script);}catch(e){document.write('');}this.loadedFiles[url]=true;};EAL.prototype.add_event=function(obj, name, handler){if (obj.attachEvent){obj.attachEvent("on" + name, handler);} +else{obj.addEventListener(name, handler, false);}};EAL.prototype.remove_event=function(obj, name, handler){if (obj.detachEvent) obj.detachEvent("on" + name, handler); +else obj.removeEventListener(name, handler, false);};EAL.prototype.reset=function(e){var formObj=eAL.nav['isIE'] ? window.event.srcElement : e.target;for(var i in eAs){var is_child=false;for (var x=0;x old_sel["start"]) this.setSelectionRange(id, new_sel["end"], new_sel["end"]); +else this.setSelectionRange(id, old_sel["start"]+open_tag.length, old_sel["start"]+open_tag.length);};EAL.prototype.hide=function(id){if(document.getElementById(id) && !this.hidden[id]){this.hidden[id]=new Object();this.hidden[id]["selectionRange"]=this.getSelectionRange(id);if(document.getElementById(id).style.display!="none"){this.hidden[id]["scrollTop"]=document.getElementById(id).scrollTop;this.hidden[id]["scrollLeft"]=document.getElementById(id).scrollLeft;}if(window.frames["frame_"+id]){this.hidden[id]["toggle"]=eAs[id]["displayed"];if(window.frames["frame_"+id] && eAs[id]["displayed"]==true){var scrollTop=window.frames["frame_"+ id].document.getElementById("result").scrollTop;var scrollLeft=window.frames["frame_"+ id].document.getElementById("result").scrollLeft;} +else{var scrollTop=document.getElementById(id).scrollTop;var scrollLeft=document.getElementById(id).scrollLeft;}this.hidden[id]["scrollTop"]=scrollTop;this.hidden[id]["scrollLeft"]=scrollLeft;if(eAs[id]["displayed"]==true) eAL.toggle_off(id);}var span=document.getElementById("EditAreaArroundInfos_"+id);if(span){span.style.display='none';}document.getElementById(id).style.display="none";}};EAL.prototype.show=function(id){if((elem=document.getElementById(id)) && this.hidden[id]){elem.style.display="inline";elem.scrollTop=this.hidden[id]["scrollTop"];elem.scrollLeft=this.hidden[id]["scrollLeft"];var span=document.getElementById("EditAreaArroundInfos_"+id);if(span){span.style.display='inline';}if(window.frames["frame_"+id]){elem.style.display="inline";if(this.hidden[id]["toggle"]==true) eAL.toggle_on(id);scrollTop=this.hidden[id]["scrollTop"];scrollLeft=this.hidden[id]["scrollLeft"];if(window.frames["frame_"+id] && eAs[id]["displayed"]==true){window.frames["frame_"+ id].document.getElementById("result").scrollTop=scrollTop;window.frames["frame_"+ id].document.getElementById("result").scrollLeft=scrollLeft;} +else{elem.scrollTop=scrollTop;elem.scrollLeft=scrollLeft;}}sel=this.hidden[id]["selectionRange"];this.setSelectionRange(id, sel["start"], sel["end"]);delete this.hidden[id];}};EAL.prototype.execCommand=function(id, cmd){switch(cmd){case "EA_init": if(eAs[id]['settings']["EA_init_callback"].length>0) eval(eAs[id]['settings']["EA_init_callback"]+"('"+ id +"');");break;case "EA_delete": if(eAs[id]['settings']["EA_delete_callback"].length>0) eval(eAs[id]['settings']["EA_delete_callback"]+"('"+ id +"');");break;case "EA_submit": if(eAs[id]['settings']["submit_callback"].length>0) eval(eAs[id]['settings']["submit_callback"]+"('"+ id +"');");break;}if(window.frames["frame_"+id]){return eval('window.frames["frame_'+ id +'"].editArea.'+ cmd +';');}return false;};var eAL=new EAL();var eAs=new Object();function getAttribute( elm, aname ){try{var avalue=elm.getAttribute( aname );}catch(exept){}if ( ! avalue ){for ( var i=0;i < elm.attributes.length;i ++ ){var taName=elm.attributes [i] .name.toLowerCase();if ( taName==aname ){avalue=elm.attributes [i] .value;return avalue;}}}return avalue;};function setAttribute( elm, attr, val ){if(attr=="class"){elm.setAttribute("className", val);elm.setAttribute("class", val);} +else{elm.setAttribute(attr, val);}};function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth){if(!option) var option="single";if(!depth) var depth=-1;if(elem){var children=elem.childNodes;var result=null;var results=new Array();for (var x=0;x0){results=results.concat(result);}} +else if(result!=null){return result;}}}}if(option=="all") return results;}return null;};function isChildOf(elem, parent){if(elem){if(elem==parent) return true;while(elem.parentNode !='undefined'){return isChildOf(elem.parentNode, parent);}}return false;};function getMouseX(e){if(e!=null && typeof(e.pageX)!="undefined"){return e.pageX;} +else{return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;}};function getMouseY(e){if(e!=null && typeof(e.pageY)!="undefined"){return e.pageY;} +else{return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;}};function calculeOffsetLeft(r){return calculeOffset(r,"offsetLeft") };function calculeOffsetTop(r){return calculeOffset(r,"offsetTop") };function calculeOffset(element,attr){var offset=0;while(element){offset+=element[attr];element=element.offsetParent}return offset;};function get_css_property(elem, prop){if(document.defaultView){return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);} +else if(elem.currentStyle){var prop=prop.replace(/-\D/gi, function(sMatch){return sMatch.charAt(sMatch.length - 1).toUpperCase();});return elem.currentStyle[prop];} +else return null;}var move_current_element;function start_move_element(e, id, frame){var elem_id=(e.target || e.srcElement).id;if(id) elem_id=id;if(!frame) frame=window;if(frame.event) e=frame.event;move_current_element=frame.document.getElementById(elem_id);move_current_element.frame=frame;frame.document.onmousemove=move_element;frame.document.onmouseup=end_move_element;mouse_x=getMouseX(e);mouse_y=getMouseY(e);move_current_element.start_pos_x=mouse_x - (move_current_element.style.left.replace("px","") || calculeOffsetLeft(move_current_element));move_current_element.start_pos_y=mouse_y - (move_current_element.style.top.replace("px","") || calculeOffsetTop(move_current_element));return false;};function end_move_element(e){move_current_element.frame.document.onmousemove="";move_current_element.frame.document.onmouseup="";move_current_element=null;};function move_element(e){if(move_current_element.frame && move_current_element.frame.event) e=move_current_element.frame.event;var mouse_x=getMouseX(e);var mouse_y=getMouseY(e);var new_top=mouse_y - move_current_element.start_pos_y;var new_left=mouse_x - move_current_element.start_pos_x;var max_left=move_current_element.frame.document.body.offsetWidth- move_current_element.offsetWidth;max_top=move_current_element.frame.document.body.offsetHeight- move_current_element.offsetHeight;new_top=Math.min(Math.max(0, new_top), max_top);new_left=Math.min(Math.max(0, new_left), max_left);move_current_element.style.top=new_top+"px";move_current_element.style.left=new_left+"px";return false;};var nav=eAL.nav;function getSelectionRange(textarea){return {"start": textarea.selectionStart, "end": textarea.selectionEnd};};function setSelectionRange(textarea, start, end){textarea.focus();start=Math.max(0, Math.min(textarea.value.length, start));end=Math.max(start, Math.min(textarea.value.length, end));if(nav['isOpera']){textarea.selectionEnd=1;textarea.selectionStart=0;textarea.selectionEnd=1;textarea.selectionStart=0;}textarea.selectionStart=start;textarea.selectionEnd=end;if(nav['isIE']) set_IE_selection(textarea);};function get_IE_selection(textarea){if(textarea && textarea.focused){if(!textarea.ea_line_height){var div=document.createElement("div");div.style.fontFamily=get_css_property(textarea, "font-family");div.style.fontSize=get_css_property(textarea, "font-size");div.style.visibility="hidden";div.innerHTML="0";document.body.appendChild(div);textarea.ea_line_height=div.offsetHeight;document.body.removeChild(div);}var range=document.selection.createRange();var stored_range=range.duplicate();stored_range.moveToElementText( textarea );stored_range.setEndPoint( 'EndToEnd', range );if(stored_range.parentElement()==textarea){var elem=textarea;var scrollTop=0;while(elem.parentNode){scrollTop+=elem.scrollTop;elem=elem.parentNode;}var relative_top=range.offsetTop - calculeOffsetTop(textarea)+ scrollTop;var line_start=Math.round((relative_top / textarea.ea_line_height) +1);var line_nb=Math.round(range.boundingHeight / textarea.ea_line_height);var range_start=stored_range.text.length - range.text.length;var tab=textarea.value.substr(0, range_start).split("\n");range_start+=(line_start - tab.length)*2;textarea.selectionStart=range_start;var range_end=textarea.selectionStart + range.text.length;tab=textarea.value.substr(0, range_start + range.text.length).split("\n");range_end+=(line_start + line_nb - 1 - tab.length)*2;textarea.selectionEnd=range_end;}}setTimeout("get_IE_selection(document.getElementById('"+ textarea.id +"'));", 50);};function IE_textarea_focus(){event.srcElement.focused=true;}function IE_textarea_blur(){event.srcElement.focused=false;}function set_IE_selection(textarea){var nbLineStart=textarea.value.substr(0, textarea.selectionStart).split("\n").length - 1;var nbLineEnd=textarea.value.substr(0, textarea.selectionEnd).split("\n").length - 1;var range=document.selection.createRange();range.moveToElementText( textarea );range.setEndPoint( 'EndToStart', range );range.moveStart('character', textarea.selectionStart - nbLineStart);range.moveEnd('character', textarea.selectionEnd - nbLineEnd - (textarea.selectionStart - nbLineStart) );range.select();};eAL.waiting_loading["elements_functions.js"]="loaded";EAL.prototype.start_resize_area=function(){document.onmouseup=eAL.end_resize_area;document.onmousemove=eAL.resize_area;eAL.toggle(eAL.resize["id"]);var textarea=eAs[eAL.resize["id"]]["textarea"];var div=document.getElementById("edit_area_resize");if(!div){div=document.createElement("div");div.id="edit_area_resize";div.style.border="dashed #888888 1px";}var width=textarea.offsetWidth -2;var height=textarea.offsetHeight -2;div.style.display="block";div.style.width=width+"px";div.style.height=height+"px";var father=textarea.parentNode;father.insertBefore(div, textarea);textarea.style.display="none";eAL.resize["start_top"]=calculeOffsetTop(div);eAL.resize["start_left"]=calculeOffsetLeft(div);};EAL.prototype.end_resize_area=function(e){document.onmouseup="";document.onmousemove="";var div=document.getElementById("edit_area_resize");var textarea=eAs[eAL.resize["id"]]["textarea"];var width=Math.max(eAs[eAL.resize["id"]]["settings"]["min_width"], div.offsetWidth-4);var height=Math.max(eAs[eAL.resize["id"]]["settings"]["min_height"], div.offsetHeight-4);if(eAL.nav['isIE']==6){width-=2;height-=2;}textarea.style.width=width+"px";textarea.style.height=height+"px";div.style.display="none";textarea.style.display="inline";textarea.selectionStart=eAL.resize["selectionStart"];textarea.selectionEnd=eAL.resize["selectionEnd"];eAL.toggle(eAL.resize["id"]);return false;};EAL.prototype.resize_area=function(e){var allow=eAs[eAL.resize["id"]]["settings"]["allow_resize"];if(allow=="both" || allow=="y"){new_y=getMouseY(e);var new_height=Math.max(20, new_y- eAL.resize["start_top"]);document.getElementById("edit_area_resize").style.height=new_height+"px";}if(allow=="both" || allow=="x"){new_x=getMouseX(e);var new_width=Math.max(20, new_x- eAL.resize["start_left"]);document.getElementById("edit_area_resize").style.width=new_width+"px";}return false;};eAL.waiting_loading["resize_area.js"]="loaded";EAL.prototype.get_regexp=function(text_array){res="(\\b)(";for(i=0;i0) res+="|";res+=this.get_escaped_regexp(text_array[i]);}res+=")(\\b)";reg=new RegExp(res);return res;};EAL.prototype.get_escaped_regexp=function(str){return str.replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g, "\\$1");};EAL.prototype.init_syntax_regexp=function(){var lang_style=new Object();for(var lang in this.load_syntax){if(!this.syntax[lang]){this.syntax[lang]=new Object();this.syntax[lang]["keywords_reg_exp"]=new Object();this.keywords_reg_exp_nb=0;if(this.load_syntax[lang]['KEYWORDS']){param="g";if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false) param+="i";for(var i in this.load_syntax[lang]['KEYWORDS']){if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function") continue;this.syntax[lang]["keywords_reg_exp"][i]=new RegExp(this.get_regexp( this.load_syntax[lang]['KEYWORDS'][i] ), param);this.keywords_reg_exp_nb++;}}if(this.load_syntax[lang]['OPERATORS']){var str="";var nb=0;for(var i in this.load_syntax[lang]['OPERATORS']){if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function") continue;if(nb>0) str+="|";str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]);nb++;}if(str.length>0) this.syntax[lang]["operators_reg_exp"]=new RegExp("("+str+")","g");}if(this.load_syntax[lang]['DELIMITERS']){var str="";var nb=0;for(var i in this.load_syntax[lang]['DELIMITERS']){if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function") continue;if(nb>0) str+="|";str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]);nb++;}if(str.length>0) this.syntax[lang]["delimiters_reg_exp"]=new RegExp("("+str+")","g");}var syntax_trace=new Array();this.syntax[lang]["quotes"]=new Object();var quote_tab=new Array();if(this.load_syntax[lang]['QUOTEMARKS']){for(var i in this.load_syntax[lang]['QUOTEMARKS']){if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function") continue;var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]);this.syntax[lang]["quotes"][x]=x;quote_tab[quote_tab.length]="("+x+"(?:[^"+x+"\\\\]*(\\\\\\\\)*(\\\\"+x+"?)?)*("+x+"|$))";syntax_trace.push(x);}}this.syntax[lang]["comments"]=new Object();if(this.load_syntax[lang]['COMMENT_SINGLE']){for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function") continue;var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]);quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))";syntax_trace.push(x);this.syntax[lang]["comments"][x]="\n";}}if(this.load_syntax[lang]['COMMENT_MULTI']){for(var i in this.load_syntax[lang]['COMMENT_MULTI']){if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function") continue;var start=this.get_escaped_regexp(i);var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]);quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))";syntax_trace.push(start);syntax_trace.push(end);this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i];}}if(quote_tab.length>0) this.syntax[lang]["comment_or_quote_reg_exp"]=new RegExp("("+quote_tab.join("|")+")","gi");if(syntax_trace.length>0) this.syntax[lang]["syntax_trace_regexp"]=new RegExp("((.|\n)*?)(\\\\*("+ syntax_trace.join("|") +"|$))", "gmi");if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){this.syntax[lang]["script_delimiters"]=new Object();for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function") continue;this.syntax[lang]["script_delimiters"][i]=this.load_syntax[lang]['SCRIPT_DELIMITERS'];}}this.syntax[lang]["custom_regexp"]=new Object();if(this.load_syntax[lang]['REGEXPS']){for(var i in this.load_syntax[lang]['REGEXPS']){if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function") continue;var val=this.load_syntax[lang]['REGEXPS'][i];if(!this.syntax[lang]["custom_regexp"][val['execute']]) this.syntax[lang]["custom_regexp"][val['execute']]=new Object();this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp' : new RegExp(val['search'], val['modifiers']) , 'class' : val['class']};}}if(this.load_syntax[lang]['STYLES']){lang_style[lang]=new Object();for(var i in this.load_syntax[lang]['STYLES']){if(typeof(this.load_syntax[lang]['STYLES'][i])=="function") continue;if(typeof(this.load_syntax[lang]['STYLES'][i]) !="string"){for(var j in this.load_syntax[lang]['STYLES'][i]){lang_style[lang][j]=this.load_syntax[lang]['STYLES'][i][j];}} +else{lang_style[lang][i]=this.load_syntax[lang]['STYLES'][i];}}}var style="";for(var i in lang_style[lang]){if(lang_style[lang][i].length>0){style+="."+ lang +" ."+ i.toLowerCase() +" span{"+lang_style[lang][i]+"}\n";style+="."+ lang +" ."+ i.toLowerCase() +"{"+lang_style[lang][i]+"}\n";}}this.syntax[lang]["styles"]=style;}}};eAL.waiting_loading["reg_syntax.js"]="loaded"; +var editAreaLoader= eAL;var editAreas=eAs;EditAreaLoader=EAL;editAreaLoader.iframe_script= ""; +editAreaLoader.template= " EditArea [__CSSRULES__] [__JSCODE__]
[__TOOLBAR__]
 
 
{$position}: {$line_abbr} 0, {$char_abbr} 0 {$total}: {$line_abbr} 0, {$char_abbr} 0 resize
{$processing}
{$search} {$close_popup}
{$replace} {$move_popup}

{$find_next} {$replace} {$replace_all}
{$close_popup}

Editarea [__EA_VERSION__]


{$shortcuts}:

{$tab}: {$add_tab}
{$shift}+{$tab}: {$remove_tab}
{$ctrl}+f: {$search_command}
{$ctrl}+r: {$replace_command}
{$ctrl}+h: {$highlight}
{$ctrl}+g: {$go_to_line}
{$ctrl}+z: {$undo}
{$ctrl}+y: {$redo}
{$ctrl}+e: {$help}
{$ctrl}+q, {$esc}: {$close_popup}
{$accesskey} E: {$toggle}

{$about_notice}
"; +editAreaLoader.iframe_css= ""; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/close.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/close.gif new file mode 100755 index 0000000000000000000000000000000000000000..679ca2aa47644793fc7096142233af6d18cfc9ac GIT binary patch literal 102 zcmZ?wbhEHb6ky2ivBykw!ot@6bd$)Ew*2Dq{%MuzLU-VNrt;$I z{;0?PSAE;|`To-4{r~^~A^8LW000jFEC2ui02BZe000DY@X1N5y*O(ey8oUPG-PQu zh5=L~;SvlX%mSjURO>jy;xC1Q4L8xD48CAu$Z8M;}RUJf0>sOc_ z4h#giNmy{Z(DeG+E>qDAdHB(q-q8pM40A&O(_`XwX{XYr&z?PRr~gK;d)>WX|G+!v(`@O7 z#gQbEOxp+vsv_Jf61NO&~~uOm_QM5vt=)9^-2GdKQc?)(;>#1N8f<|iMC zmfD0;+g#c2!gPCdc7LqAKSnW@pd1qCo=N!3p0wI2Uh9Zk=lo!cD>>j-uGI1o**BAk z+nGfbcNcGeD*Jw7fy$G-la=mZQupAaAFx7wCr5K@**^bL3Q~$qtHmc2WOevhi_fWl z(sfv=`%6)ajg-4YJ5{Q^m(#*3no)Srli%PkY(#z&y{Z+f+pwX9E^Yd+_%OYx&Ar(` z=b4djMwtQYk78Xr3Od-lZnm`j;kQO??xYJWs4$_>f=Uxp*o#UtRAz5wJ9c-WrBlt9O#3t52`azorU%kROg@@ z^zE{v@mJLUhW&Q0+TqtY**eGbY8Q-WL0yJ%2*zQUhhcE~^jDa6JM<&|E(h8!`+6?G zauKFcruQPOmtb}IdR;i-!l|q1zlPIe7`*NuypEwiaDEc5N!oD}u3H$rjgdPTzwMiF zW73U3-MIHR?mx!VBe)-7`Y}8GFP?hv%!?T>JTLH^W@!ct!!mxbeim#%0DiolK>dFZ zzu?Szn}8&d0Ixnlcr-z9tlW0gQOy(ZIijL;LUHC4jE8fT{5fxlGUc6R6Y~{@_~J%= ziZgCiQ%F{M*H(S!QUO0gbU~ZjkzrMe*Qfr{5E{fyU6VLfTYp$-lRvr9@jypuf+~_C zDj$qCCpH(=w|2(Q4(4zKVf!L10!gkpb3pTD`L)o<*}R1hzkBo0vAn*uM>IjYsOYG9 zv0-1Q$7SopSqDij=l!TwL4r~y5zZS4c_*b{JYyhnO!uxVTX;N-(&|NuHN*7jINqW6 zg#4dMC#VB0%WI7CoA*nyGUuv1R~CH1U1>^NB9Y7#b@4?RyG&}ev|@Q}Xsl)1T~msP Gq`d@2%&Q{+ literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/help.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/help.gif new file mode 100755 index 0000000000000000000000000000000000000000..51a1ee42073402ce787b60d151219ef7ce367615 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VH5xq0Mrfu6i>3FyW3udp6K!Ub&;kbTH+f8tqUysbN$lQ^w;v!hW z!pq(wXY{hj_W%F@A^8LW0018VEC2ui02BZe000G~;3tk`X`X1Ru1KI+h83(|W>rq^ zR7RF&f!#zRnN$X{6T;$HBo?`WVllvQOo2)zp>TL49!J8HVVDe#NumhpbS0R9z=Ux~ zAoz}Cx7j!jCJ$n5dR`j(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/load.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/load.gif new file mode 100755 index 0000000000000000000000000000000000000000..461698f56b1e5822f49ed10227b2e57e683c8a03 GIT binary patch literal 1041 zcmdtPjZ>0$007{hgDIQsG-j@L*>tB)b60+}iD?OrA>k>g{a2QP=fy)QrO@924oIV@UURUC)| z_Hh8BRUmo->{0^i0Eit2)L}rq58_9_9yQoI0ru(0?>qtr=0Nh3sMI;iK}AgZ2uL@P zv!?cB{7K50jm$K~=L}H_^$ABuCzq*wkDptnZcdR`%IPfr6%FD zE9uMWOe#-mc0 zdbNSOGybW`IN~b2xCP6L&iUIvl!Pgr0!^ zgyGf}G~(fT2)$k$^Fj=R+dg6)!q7Gz2ta%rhJ%nGAPmD7c3yT#A#%j)UNN`xjj9kk>WZd!xmETTBh{YXI^b{t9!jGiW~Qp#VbtkipU(u58V$>o<`ED_LfQ)yM&!tudZ zO6ZtkL-u2)?nak`4w3~)2OMlB%CquCMW`EC1=ut*Geik9*l2SqO#J~;-aN z((?HJ(%tf+t-`|0-T(jqA^8LW000jFEC2ui02BZe000D6@X1N5y*TTfdRNNeY>8o> z4KQZPc^-wzx@G{}*+AEJzAuCxrm-U+gcqV~fj9y(hozB$v;>w-LA7!<0TB$xmeMs$ Y1>z^>8fd%Q>Wl40uW#=7ygmW|J7pwMu>b%7 literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/opacity.png b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/opacity.png new file mode 100755 index 0000000000000000000000000000000000000000..b4217cb212926ce7abfde5e045380e3f6a5d54b7 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl_jZKS5jZLdL qklCGA#U1zK0aw_X$=hxGiT1+v}x0S96<3ux1VcBu(M-; ztC5}oGb2#H;!hSvE(Q(;9gtxlV;NXH1WtA`ESM2BJDuZdn+*H6+J_#~?s=}wnLTle zLdoPrg>AjBcimgdeCKBYhit0B2@x&{waK4q^pXsNww0L>hh!WVpKG)o&b3NQQ?5mIMo+7=AS21Oo%i<%fwhoMRy< z%r&om<6%ZJd`e=;WCaw%pB9{8VS>4w;Q?{M;sr8%x#87s0xU>|UnwlPY=B}oE5iv6 z7MRN&h%~$hWcYK-tKURekqj4MC=qrd`<&8udehy@~I>Xg(5^P9@hX|Ae U2cj76s&GPp1LpFB=!RPZ0F}Z{aR2}S literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/redo.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/redo.gif new file mode 100755 index 0000000000000000000000000000000000000000..3af90697f0b74d0b6b07b585614a6dc67ff87f1d GIT binary patch literal 169 zcmV;a09OA;Nk%w1VH5xq0K*FaEl-kjqwqa)*O$8QUUsNeit)O{)H!9gj;!cSf8=SD z@4U+CH(H=qeZQ%{>Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/reset_highlight.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/reset_highlight.gif new file mode 100755 index 0000000000000000000000000000000000000000..0fa3cb79734b6ddadaded7a30dbbab4cdf7ee11a GIT binary patch literal 168 zcmV;Z09XG3d^!9RvqL!@E;^*>mjy!E|{0<7#0>aHWEL6BndDU8;y+&e4jmm66%_}QC6xvn4h#bW3={_x jpoxPV4gmok9t#w=ts@#{Ko1AM7r_@1E5*jg#vuSZ^a*OP literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/save_as.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/save_as.gif new file mode 100755 index 0000000000000000000000000000000000000000..d8251b4b9b1b24e2b939c4b7b68cbb5c517f9b8f GIT binary patch literal 203 zcmZ?wbhEHb6krfw*v!xH=F5k+6}Q(Oe>-jK;Y%*7$|1_=dNaD$xAL|z0Na{Wn z-gG#(=SKFVv;VM;(5eDq%`2oNfXq zfBR}Fa;Y+Ku!wSWIX<46!Nb`#(~I%QLodDsEeC{k3V1aV7R>mx!+(YHh8apyclfjq zs!fsK=vsBSZ>J`2OU!Y00WJ|1-fH$%b_UJ{(QrPtJ~qBiF)nVNY13J|#AXW#GFSru D3N=ks literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/search.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/search.gif new file mode 100755 index 0000000000000000000000000000000000000000..cfe76b5d5b06afde765a8f9559c7b2c3fb0d2bf0 GIT binary patch literal 191 zcmV;w06_moNk%w1VH5xq0K*6XAwYSPrOj1uq2J{2d5^L-QjNRF;a`BY`TG5IgsOa& z#YJeCAx49!wa3EN@&Et;A^8LW000jFEC2ui02BZe000DR@X1N5y*TU5Zy?LmfLnqv zlZj@dP!!MS!kB^>3Thj{dMSt5;y`fuDmH}Uz$g$9N~Xo|3t6qtjy*E#3&d$!w&zD+OKB~ULl7eEw((m;2 z^kQ<7@$qtYhNk=Uwg3PCA^8LW000jFEC2ui02BZe000DA@X1N5y*TU5`(_{rgp5Wq zV<-tiQw0DJpz-{)hcHm#IKm8pA~9I(Ca@SvR8S0cm6VSWFgTt^N>UaxG!szEiFzP_ cvz1f8Q5b|bYX=qJK_CnUx@XVt`!Nv!J5VM>-~a#s literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/spacer.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/spacer.gif new file mode 100755 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/statusbar_resize.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/statusbar_resize.gif new file mode 100755 index 0000000000000000000000000000000000000000..af89d803f8f0eeb965d9443473d5be009641cacf GIT binary patch literal 79 zcmZ?wbhEHbX*~6o0ZXGB7YP=m6OaAbAERg(>|jPrv0~%%#ha d_MXKm)lqT2YSDtso)?w9Z@gz^T^C`n1_07v8bkm9 literal 0 HcmV?d00001 diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/images/undo.gif b/admin-dev/ajaxfilemanager/jscripts/edit_area/images/undo.gif new file mode 100755 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk", +not_found: "Nicht gefunden.", +occurrence_replaced: "Die Vorkommen wurden ersetzt.", +search_field_empty: "leeres Suchfeld", +restart_search_at_begin: "Ende des zu durchsuchenden Bereiches erreicht. Es wird die Suche von Anfang an fortgesetzt.", //find a shorter translation +move_popup: "Suchfenster bewegen", +font_size: "--Schriftgröße--", +go_to_line: "gehe zu Zeile", +go_to_line_prompt: "gehe zu Zeilennummmer:", +undo: "rückgängig machen", +redo: "wiederherstellen", +change_smooth_selection: "aktiviere/deaktiviere einige Features (weniger Bildschirmnutzung aber mehr CPU-Belastung)", +highlight: "Syntax Highlighting an- und ausschalten", +reset_highlight: "Highlighting zurücksetzen (falls mit Text nicht konform)", +help: "über", +save: "sichern", +load: "öffnen", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Gesamt", +close_popup: "Popup schließen", +shortcuts: "Shortcuts", +add_tab: "Tab zum Text hinzufügen", +remove_tab: "Tab aus Text entfernen", +about_notice: "Bemerkung: Syntax Highlighting ist nur für kurze Texte", +toggle: "Editor an- und ausschalten", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "In Bearbeitung...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/dk.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/dk.js new file mode 100755 index 000000000..e82e2c9e6 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/dk.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["dk"]={ +new_document: "nyt tomt dokument", +search_button: "søg og erstat", +search_command: "find næste / åben søgefelt", +search: "søg", +replace: "erstat", +replace_command: "erstat / åben søgefelt", +find_next: "find næste", +replace_all: "erstat alle", +reg_exp: "regular expressions", +match_case: "forskel på store/små bogstaver
", +not_found: "not found.", +occurrence_replaced: "occurences replaced.", +search_field_empty: "Search field empty", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "flyt søgepopup", +font_size: "--Skriftstørrelse--", +go_to_line: "gå til linie", +go_to_line_prompt: "gå til linienummer:", +undo: "fortryd", +redo: "gentag", +change_smooth_selection: "slå display funktioner til/fra (smartere display men mere CPU krævende)", +highlight: "slå syntax highlight til/fra", +reset_highlight: "nulstil highlight (hvis den er desynkroniseret fra teksten)", +help: "om", +save: "gem", +load: "hent", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "luk popup", +shortcuts: "Genveje", +add_tab: "tilføj tabulation til tekst", +remove_tab: "fjern tabulation fra tekst", +about_notice: "Husk: syntax highlight funktionen bør kun bruge til små tekster", +toggle: "Slå editor til / fra", +accesskey: "Accesskey", +tab: "Tab", +shift: "Skift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processing...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/en.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/en.js new file mode 100755 index 000000000..3f84614e3 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/en.js @@ -0,0 +1,46 @@ +editAreaLoader.lang["en"]={ +new_document: "new empty document", +search_button: "search and replace", +search_command: "search next / open search area", +search: "search", +replace: "replace", +replace_command: "replace / open search area", +find_next: "find next", +replace_all: "replace all", +reg_exp: "regular expressions", +match_case: "match case", +not_found: "not found.", +occurrence_replaced: "occurences replaced.", +search_field_empty: "Search field empty", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "move search popup", +font_size: "--Font size--", +go_to_line: "go to line", +go_to_line_prompt: "go to line number:", +undo: "undo", +redo: "redo", +change_smooth_selection: "enable/disable some display features (smarter display but more CPU charge)", +highlight: "toggle syntax highlight on/off", +reset_highlight: "reset highlight (if desyncronized from text)", +help: "about", +save: "save", +save_as: "save as", +load: "load", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "close popup", +shortcuts: "Shortcuts", +add_tab: "add tabulation to text", +remove_tab: "remove tabulation to text", +about_notice: "Notice: syntax highlight function is only for small text", +toggle: "Toggle editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processing...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/fr.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/fr.js new file mode 100755 index 000000000..aa1995a8f --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/fr.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["fr"]={ +new_document: "nouveau document (efface le contenu)", +search_button: "rechercher / remplacer", +search_command: "rechercher suivant / ouvrir la fenêtre de recherche", +search: "rechercher", +replace: "remplacer", +replace_command: "remplacer / ouvrir la fenêtre de recherche", +find_next: "rechercher", +replace_all: "tout remplacer", +reg_exp: "expr. régulière", +match_case: "respecter la casse", +not_found: "pas trouvé.", +occurrence_replaced: "remplacements éffectués.", +search_field_empty: "Le champ de recherche est vide.", +restart_search_at_begin: "Fin du texte atteint, poursuite au début.", +move_popup: "déplacer la fenêtre de recherche", +font_size: "--Taille police--", +go_to_line: "aller à la ligne", +go_to_line_prompt: "aller a la ligne numero:", +undo: "annuler", +redo: "refaire", +change_smooth_selection: "activer/désactiver des fonctions d'affichage (meilleur affichage mais plus de charge processeur)", +highlight: "activer/désactiver la coloration syntaxique", +reset_highlight: "réinitialiser la coloration syntaxique (si désyncronisée du texte)", +help: "à propos", +save: "sauvegarder", +load: "charger", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "fermer le popup", +shortcuts: "Racourcis clavier", +add_tab: "ajouter une tabulation dans le texte", +remove_tab: "retirer une tabulation dans le texte", +about_notice: "Note: la coloration syntaxique n'est prévue que pour de courts textes.", +toggle: "basculer l'éditeur", +accesskey: "Accesskey", +tab: "Tab", +shift: "Maj", +ctrl: "Ctrl", +esc: "Esc", +processing: "chargement...", +fullscreen: "plein écran" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/hr.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/hr.js new file mode 100755 index 000000000..7ea4df876 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/hr.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["hr"]={ +new_document: "Novi dokument", +search_button: "Traži i izmijeni", +search_command: "Traži dalje / Otvori prozor za traženje", +search: "Traži", +replace: "Izmijeni", +replace_command: "Izmijeni / Otvori prozor za traženje", +find_next: "Traži dalje", +replace_all: "Izmjeni sve", +reg_exp: "Regularni izrazi", +match_case: "Bitna vel. slova", +not_found: "nije naðeno.", +occurrence_replaced: "izmjenjenih.", +search_field_empty: "Prazno polje za traženje!", +restart_search_at_begin: "Došao do kraja. Poèeo od poèetka.", +move_popup: "Pomakni prozor", +font_size: "--Velièina teksta--", +go_to_line: "Odi na redak", +go_to_line_prompt: "Odi na redak:", +undo: "Vrati natrag", +redo: "Napravi ponovo", +change_smooth_selection: "Ukljuèi/iskljuèi neke moguænosti prikaza (pametniji prikaz, ali zagušeniji CPU)", +highlight: "Ukljuèi/iskljuèi bojanje sintakse", +reset_highlight: "Ponovi kolorizaciju (ako je nesinkronizirana s tekstom)", +help: "O edit_area", +save: "Spremi", +load: "Uèitaj", +line_abbr: "Ln", +char_abbr: "Zn", +position: "Pozicija", +total: "Ukupno", +close_popup: "Zatvori prozor", +shortcuts: "Kratice", +add_tab: "Dodaj tabulaciju", +remove_tab: "Makni tabulaciju", +about_notice: "Napomena: koloriziranje sintakse je samo za kratke kodove", +toggle: "Prebaci naèin ureðivanja", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Procesiram...", +fullscreen: "Cijeli prozor" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/it.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/it.js new file mode 100755 index 000000000..90f0b00e3 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/it.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["it"]={ +new_document: "nuovo documento vuoto", +search_button: "cerca e sostituisci", +search_command: "trova successivo / apri finestra di ricerca", +search: "cerca", +replace: "sostituisci", +replace_command: "sostituisci / apri finestra di ricerca", +find_next: "trova successivo", +replace_all: "sostituisci tutti", +reg_exp: "espressioni regolari", +match_case: "confronta maiuscole/minuscole
", +not_found: "non trovato.", +occurrence_replaced: "occorrenze sostituite.", +search_field_empty: "Campo ricerca vuoto", +restart_search_at_begin: "Fine del testo raggiunta. Ricomincio dall'inizio.", +move_popup: "sposta popup di ricerca", +font_size: "-- Dimensione --", +go_to_line: "vai alla linea", +go_to_line_prompt: "vai alla linea numero:", +undo: "annulla", +redo: "ripeti", +change_smooth_selection: "abilita/disabilita alcune caratteristiche della visualizzazione", +highlight: "abilita/disabilita colorazione della sintassi", +reset_highlight: "aggiorna colorazione (se non sincronizzata)", +help: "informazioni su...", +save: "salva", +load: "carica", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posizione", +total: "Totale", +close_popup: "chiudi popup", +shortcuts: "Scorciatoie", +add_tab: "aggiungi tabulazione", +remove_tab: "rimuovi tabulazione", +about_notice: "Avviso: la colorazione della sintassi vale solo con testo piccolo", +toggle: "Abilita/disabilita editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "In corso...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/ja.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/ja.js new file mode 100755 index 000000000..2ae0caabb --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/ja.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["ja"]={ +new_document: "新規作成", +search_button: "検索・置換", +search_command: "次を検索 / 検索窓を表示", +search: "検索", +replace: "置換", +replace_command: "置換 / 置換窓を表示", +find_next: "次を検索", +replace_all: "全置換", +reg_exp: "正規表現", +match_case: "大文字小文字の区別", +not_found: "見つかりません。", +occurrence_replaced: "置換しました。", +search_field_empty: "検索対象文字列が空です。", +restart_search_at_begin: "終端に達しました、始めに戻ります", +move_popup: "検索窓を移動", +font_size: "--フォントサイズ--", +go_to_line: "指定行へ移動", +go_to_line_prompt: "指定行へ移動します:", +undo: "元に戻す", +redo: "やり直し", +change_smooth_selection: "スムース表示の切り替え(CPUを使います)", +highlight: "構文強調表示の切り替え", +reset_highlight: "構文強調表示のリセット", +help: "ヘルプを表示", +save: "保存", +load: "読み込み", +line_abbr: "行", +char_abbr: "文字", +position: "位置", +total: "合計", +close_popup: "ポップアップを閉じる", +shortcuts: "ショートカット", +add_tab: "タブを挿入する", +remove_tab: "タブを削除する", +about_notice: "注意:構文強調表示は短いテキストでしか有効に機能しません。", +toggle: "テキストエリアとeditAreaの切り替え", +accesskey: "アクセスキー", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "処理中です...", +fullscreen: "fullscreen" +}; \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/nl.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/nl.js new file mode 100755 index 000000000..b768481d4 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/nl.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["nl"]={ +new_document: "nieuw leeg document", +search_button: "zoek en vervang", +search_command: "zoek volgende / zoekscherm openen", +search: "zoek", +replace: "vervang", +replace_command: "vervang / zoekscherm openen", +find_next: "volgende vinden", +replace_all: "alles vervangen", +reg_exp: "reguliere expressies", +match_case: "hoofdletter gevoelig", +not_found: "niet gevonden.", +occurrence_replaced: "object vervangen.", +search_field_empty: "Zoek veld leeg", +restart_search_at_begin: "Niet meer instanties gevonden, begin opnieuw", +move_popup: "versleep zoek scherm", +font_size: "--Letter grootte--", +go_to_line: "Ga naar regel", +go_to_line_prompt: "Ga naar regel nummer:", +undo: "Ongedaan maken", +redo: "Opnieuw doen", +change_smooth_selection: "zet wat schermopties aan/uit (kan langzamer zijn)", +highlight: "zet syntax highlight aan/uit", +reset_highlight: "reset highlight (indien gedesynchronizeerd)", +help: "informatie", +save: "opslaan", +load: "laden", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Positie", +total: "Totaal", +close_popup: "Popup sluiten", +shortcuts: "Snelkoppelingen", +add_tab: "voeg tabs toe in tekst", +remove_tab: "verwijder tabs uit tekst", +about_notice: "Notitie: syntax highlight functie is alleen voor kleine tekst", +toggle: "geavanceerde bewerkingsopties", +accesskey: "Accessknop", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Verwerken...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pl.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pl.js new file mode 100755 index 000000000..a403dad2f --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pl.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["pl"]={ +new_document: "nowy dokument", +search_button: "znajdź i zamień", +search_command: "znajdź następny", +search: "znajdź", +replace: "zamień", +replace_command: "zamień", +find_next: "następny", +replace_all: "zamień wszystko", +reg_exp: "wyrażenie regularne", +match_case: "uwzględnij wielkość liter
", +not_found: "nie znaleziono.", +occurrence_replaced: "wystąpień zamieniono.", +search_field_empty: "Nie wprowadzono tekstu", +restart_search_at_begin: "Koniec dokumentu. Wyszukiwanie od początku.", +move_popup: "przesuń okienko wyszukiwania", +font_size: "Rozmiar", +go_to_line: "idź do linii", +go_to_line_prompt: "numer linii:", +undo: "cofnij", +redo: "przywróć", +change_smooth_selection: "włącz/wyłącz niektóre opcje wyglądu (zaawansowane opcje wyglądu obciążają procesor)", +highlight: "włącz/wyłącz podświetlanie składni", +reset_highlight: "odśwież podświetlanie składni (jeśli rozsynchronizowało się z tekstem)", +help: "o programie", +save: "zapisz", +load: "otwórz", +line_abbr: "Ln", +char_abbr: "Zn", +position: "Pozycja", +total: "W sumie", +close_popup: "zamknij okienko", +shortcuts: "Skróty klawiaturowe", +add_tab: "dodaj wcięcie do zaznaczonego tekstu", +remove_tab: "usuń wcięcie", +about_notice: "Uwaga: podświetlanie składni nie jest zalecane dla długich tekstów", +toggle: "Włącz/wyłącz edytor", +accesskey: "Alt+", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Przetwarzanie...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pt.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pt.js new file mode 100755 index 000000000..3ffad3374 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/pt.js @@ -0,0 +1,45 @@ +editAreaLoader.lang["pt"]={ +new_document: "Novo documento", +search_button: "Localizar e substituir", +search_command: "Localizar próximo", +search: "Localizar", +replace: "Substituir", +replace_command: "Substituir", +find_next: "Localizar", +replace_all: "Subst. tudo", +reg_exp: "Expressões regulares", +match_case: "Diferenciar maiúsculas e minúsculas", +not_found: "Não encontrado.", +occurrence_replaced: "Ocorrências substituidas", +search_field_empty: "Campo localizar vazio.", +restart_search_at_begin: "Fim das ocorrências. Recomeçar do inicio.", +move_popup: "Mover janela", +font_size: "--Tamanho da fonte--", +go_to_line: "Ir para linha", +go_to_line_prompt: "Ir para a linha:", +undo: "Desfazer", +redo: "Refazer", +change_smooth_selection: "Opções visuais", +highlight: "Cores de sintaxe", +reset_highlight: "Resetar cores (se não sincronizado)", +help: "Sobre", +save: "Salvar", +load: "Carregar", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posição", +total: "Total", +close_popup: "Fechar", +shortcuts: "Shortcuts", +add_tab: "Adicionar tabulação", +remove_tab: "Remover tabulação", +about_notice: "Atenção: Cores de sintaxe são indicados somente para textos pequenos", +toggle: "Exibir editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processando...", +fullscreen: "fullscreen" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/zh_cn.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/zh_cn.js new file mode 100755 index 000000000..055eabb47 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/langs/zh_cn.js @@ -0,0 +1,46 @@ +editAreaLoader.lang["zh_cn"]={ +new_document: "½ļ", +search_button: "滻", +search_command: "²/򿪲ҿ", +search: "", +replace: "滻", +replace_command: "滻/򿪲ҿ", +find_next: "һ", +replace_all: "滻ȫ", +reg_exp: "ʽ", +match_case: "Сд", +not_found: "ƥ.", +occurrence_replaced: "滻.", +search_field_empty: "ҹؼΪ", +restart_search_at_begin: "Ѵֿף¿ʼ.", +move_popup: "ƶҴ", +font_size: "--ִС--", +go_to_line: "ָ", +go_to_line_prompt: "ƶָ:", +undo: "һ", +redo: "һ", +change_smooth_selection: "/ֹijЩʾЧ", +highlight: "", +reset_highlight: "", +help: "", +save: "", +save_as: "Ϊ", +load: "", +line_abbr: "", +char_abbr: "ֽ", +position: "λ", +total: "ܹ", +close_popup: "رմ", +shortcuts: "ݼ", +add_tab: "Ӽ", +remove_tab: "ɾ", +about_notice: "ʾ߶ȹֻСĵ", +toggle: "ת༭", +accesskey: "ɷʼ", +tab: "", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "...", +fullscreen: "ȫ" +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/basic.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/basic.js new file mode 100755 index 000000000..8a5849cd4 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/basic.js @@ -0,0 +1,69 @@ +editAreaLoader.load_syntax["basic"] = { + 'COMMENT_SINGLE' : {1 : "'", 2 : 'rem'} + ,'COMMENT_MULTI' : { } + ,'QUOTEMARKS' : {1: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'if','then','for','wend','while', + 'else','elseif','select','case','end select', + 'until','next','step','to','end if', 'call' + ] + ,'keywords' : [ + 'sub', 'end sub', 'function', 'end function', 'exit', + 'exit function', 'dim', 'redim', 'shared', 'const', + 'is', 'absolute', 'access', 'any', 'append', 'as', + 'base', 'beep', 'binary', 'bload', 'bsave', 'chain', + 'chdir', 'circle', 'clear', 'close', 'cls', 'color', + 'com', 'common', 'data', 'date', 'declare', 'def', + 'defdbl', 'defint', 'deflng', 'defsng', 'defstr', + 'double', 'draw', 'environ', 'erase', 'error', 'field', + 'files', 'fn', 'get', 'gosub', 'goto', 'integer', 'key', + 'kill', 'let', 'line', 'list', 'locate', 'lock', 'long', + 'lprint', 'lset', 'mkdir', 'name', 'off', 'on', 'open', + 'option', 'out', 'output', 'paint', 'palette', 'pcopy', + 'poke', 'preset', 'print', 'pset', 'put', 'random', + 'randomize', 'read', 'reset', 'restore', 'resume', + 'return', 'rmdir', 'rset', 'run', 'screen', 'seg', + 'shell', 'single', 'sleep', 'sound', 'static', 'stop', + 'strig', 'string', 'swap', 'system', 'time', 'timer', + 'troff', 'tron', 'type', 'unlock', 'using', 'view', + 'wait', 'width', 'window', 'write' + ] + ,'functions' : [ + 'abs', 'asc', 'atn', 'cdbl', 'chr', 'cint', 'clng', + 'cos', 'csng', 'csrlin', 'cvd', 'cvdmbf', 'cvi', 'cvl', + 'cvs', 'cvsmbf', 'eof', 'erdev', 'erl', 'err', 'exp', + 'fileattr', 'fix', 'fre', 'freefile', 'hex', 'inkey', + 'inp', 'input', 'instr', 'int', 'ioctl', 'lbound', + 'lcase', 'left', 'len', 'loc', 'lof', 'log', 'lpos', + 'ltrim', 'mid', 'mkd', 'mkdmbf', 'mki', 'mkl', 'mks', + 'mksmbf', 'oct', 'peek', 'pen', 'play', 'pmap', 'point', + 'pos', 'right', 'rnd', 'rtrim', 'seek', 'sgn', 'sin', + 'space', 'spc', 'sqr', 'stick', 'str', 'tab', 'tan', + 'ubound', 'ucase', 'val', 'varptr', 'varseg' + ] + ,'operators' : [ + 'and', 'eqv', 'imp', 'mod', 'not', 'or', 'xor' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '!', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #99CC00;' + ,'QUOTESMARKS': 'color: #333399;' + ,'KEYWORDS' : { + 'keywords' : 'color: #3366FF;' + ,'functions' : 'color: #0000FF;' + ,'statements' : 'color: #3366FF;' + ,'operators' : 'color: #FF0000;' + } + ,'OPERATORS' : 'color: #FF0000;' + ,'DELIMITERS' : 'color: #0000FF;' + + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/brainfuck.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/brainfuck.js new file mode 100755 index 000000000..3625f701e --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/brainfuck.js @@ -0,0 +1,44 @@ +editAreaLoader.load_syntax["brainfuck"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {} + ,'QUOTEMARKS' : {} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'OPERATORS' :[ + '+', '-' + ] + ,'DELIMITERS' :[ + '[', ']' + ] + ,'REGEXPS' : { + 'bfispis' : { + 'search' : '()(\\.)()' + ,'class' : 'bfispis' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'bfupis' : { + 'search' : '()(\\,)()' + ,'class' : 'bfupis' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'bfmemory' : { + 'search' : '()([<>])()' + ,'class' : 'bfmemory' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'OPERATORS' : 'color: #88AA00;' + ,'DELIMITERS' : 'color: #00C138;' + ,'REGEXPS' : { + 'bfispis' : 'color: #EE0000;' + ,'bfupis' : 'color: #4455ee;' + ,'bfmemory' : 'color: #DD00DD;' + } + } +}; + diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/c.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/c.js new file mode 100755 index 000000000..d4e577122 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/c.js @@ -0,0 +1,62 @@ +editAreaLoader.load_syntax["c"] = { + 'COMMENT_SINGLE' : {1 : '//'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + 'constants' : [ + 'NULL', 'false', 'stdin', 'stdout', 'stderr', 'true' + ] + ,'types' : [ + 'FILE', 'auto', 'char', 'const', 'double', + 'extern', 'float', 'inline', 'int', 'long', 'register', + 'short', 'signed', 'size_t', 'static', 'struct', + 'time_t', 'typedef', 'union', 'unsigned', 'void', + 'volatile' + ] + ,'statements' : [ + 'do', 'else', 'enum', 'for', 'goto', 'if', 'sizeof', + 'switch', 'while' + ] + ,'keywords' : [ + 'break', 'case', 'continue', 'default', 'delete', + 'return' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + 'precompiler' : { + 'search' : '()(#[^\r\n]*)()' + ,'class' : 'precompiler' + ,'modifiers' : 'g' + ,'execute' : 'before' + } +/* ,'precompilerstring' : { + 'search' : '(#[\t ]*include[\t ]*)([^\r\n]*)([^\r\n]*[\r\n])' + ,'class' : 'precompilerstring' + ,'modifiers' : 'g' + ,'execute' : 'before' + }*/ + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'constants' : 'color: #EE0000;' + ,'types' : 'color: #0000EE;' + ,'statements' : 'color: #60CA00;' + ,'keywords' : 'color: #48BDDF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #0038E1;' + ,'REGEXPS' : { + 'precompiler' : 'color: #009900;' + ,'precompilerstring' : 'color: #994400;' + } + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/cpp.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/cpp.js new file mode 100755 index 000000000..e5e2be061 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/cpp.js @@ -0,0 +1,65 @@ +editAreaLoader.load_syntax["cpp"] = { + 'COMMENT_SINGLE' : {1 : '//'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + 'constants' : [ + 'NULL', 'false', 'std', 'stdin', 'stdout', 'stderr', + 'true' + ] + ,'types' : [ + 'FILE', 'auto', 'char', 'class', 'const', 'double', + 'extern', 'float', 'friend', 'inline', 'int', + 'iterator', 'long', 'map', 'operator', 'queue', + 'register', 'short', 'signed', 'size_t', 'stack', + 'static', 'string', 'struct', 'time_t', 'typedef', + 'union', 'unsigned', 'vector', 'void', 'volatile' + ] + ,'statements' : [ + 'catch', 'do', 'else', 'enum', 'for', 'goto', 'if', + 'sizeof', 'switch', 'this', 'throw', 'try', 'while' + ] + ,'keywords' : [ + 'break', 'case', 'continue', 'default', 'delete', + 'namespace', 'new', 'private', 'protected', 'public', + 'return', 'using' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + 'precompiler' : { + 'search' : '()(#[^\r\n]*)()' + ,'class' : 'precompiler' + ,'modifiers' : 'g' + ,'execute' : 'before' + } +/* ,'precompilerstring' : { + 'search' : '(#[\t ]*include[\t ]*)([^\r\n]*)([^\r\n]*[\r\n])' + ,'class' : 'precompilerstring' + ,'modifiers' : 'g' + ,'execute' : 'before' + }*/ + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'constants' : 'color: #EE0000;' + ,'types' : 'color: #0000EE;' + ,'statements' : 'color: #60CA00;' + ,'keywords' : 'color: #48BDDF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #0038E1;' + ,'REGEXPS' : { + 'precompiler' : 'color: #009900;' + ,'precompilerstring' : 'color: #994400;' + } + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/css.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/css.js new file mode 100755 index 000000000..b8131ccdd --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/css.js @@ -0,0 +1,84 @@ +editAreaLoader.load_syntax["css"] = { + 'COMMENT_SINGLE' : {1 : '@'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : ['"', "'"] + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'attributes' : [ + 'aqua', 'azimuth', 'background-attachment', 'background-color', + 'background-image', 'background-position', 'background-repeat', + 'background', 'border-bottom-color', 'border-bottom-style', + 'border-bottom-width', 'border-left-color', 'border-left-style', + 'border-left-width', 'border-right', 'border-right-color', + 'border-right-style', 'border-right-width', 'border-top-color', + 'border-top-style', 'border-top-width','border-bottom', 'border-collapse', + 'border-left', 'border-width', 'border-color', 'border-spacing', + 'border-style', 'border-top', 'border', 'caption-side', + 'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset', + 'cue-after', 'cue-before', 'cue', 'cursor', 'direction', 'display', + 'elevation', 'empty-cells', 'float', 'font-family', 'font-size', + 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', + 'font-weight', 'font', 'height', 'letter-spacing', 'line-height', + 'list-style', 'list-style-image', 'list-style-position', 'list-style-type', + 'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'margin', + 'marker-offset', 'marks', 'max-height', 'max-width', 'min-height', + 'min-width', 'opacity', 'orphans', 'outline', 'outline-color', 'outline-style', + 'outline-width', 'overflow', 'padding-bottom', 'padding-left', + 'padding-right', 'padding-top', 'padding', 'page', 'page-break-after', + 'page-break-before', 'page-break-inside', 'pause-after', 'pause-before', + 'pause', 'pitch', 'pitch-range', 'play-during', 'position', 'quotes', + 'richness', 'right', 'size', 'speak-header', 'speak-numeral', 'speak-punctuation', + 'speak', 'speech-rate', 'stress', 'table-layout', 'text-align', 'text-decoration', + 'text-indent', 'text-shadow', 'text-transform', 'top', 'unicode-bidi', + 'vertical-align', 'visibility', 'voice-family', 'volume', 'white-space', 'widows', + 'width', 'word-spacing', 'z-index', 'bottom', 'left' + ] + ,'values' : [ + 'above', 'absolute', 'always', 'armenian', 'aural', 'auto', 'avoid', + 'baseline', 'behind', 'below', 'bidi-override', 'black', 'blue', 'blink', 'block', 'bold', 'bolder', 'both', + 'capitalize', 'center-left', 'center-right', 'center', 'circle', 'cjk-ideographic', + 'close-quote', 'collapse', 'condensed', 'continuous', 'crop', 'crosshair', 'cross', 'cursive', + 'dashed', 'decimal-leading-zero', 'decimal', 'default', 'digits', 'disc', 'dotted', 'double', + 'e-resize', 'embed', 'extra-condensed', 'extra-expanded', 'expanded', + 'fantasy', 'far-left', 'far-right', 'faster', 'fast', 'fixed', 'fuchsia', + 'georgian', 'gray', 'green', 'groove', 'hebrew', 'help', 'hidden', 'hide', 'higher', + 'high', 'hiragana-iroha', 'hiragana', 'icon', 'inherit', 'inline-table', 'inline', + 'inset', 'inside', 'invert', 'italic', 'justify', 'katakana-iroha', 'katakana', + 'landscape', 'larger', 'large', 'left-side', 'leftwards', 'level', 'lighter', 'lime', 'line-through', 'list-item', 'loud', 'lower-alpha', 'lower-greek', 'lower-roman', 'lowercase', 'ltr', 'lower', 'low', + 'maroon', 'medium', 'message-box', 'middle', 'mix', 'monospace', + 'n-resize', 'narrower', 'navy', 'ne-resize', 'no-close-quote', 'no-open-quote', 'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize', + 'oblique', 'olive', 'once', 'open-quote', 'outset', 'outside', 'overline', + 'pointer', 'portrait', 'purple', 'px', + 'red', 'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb', 'ridge', 'right-side', 'rightwards', + 's-resize', 'sans-serif', 'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate', 'serif', 'show', 'silent', 'silver', 'slow', 'slower', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid', 'spell-out', 'square', + 'static', 'status-bar', 'super', 'sw-resize', + 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row', 'table-row-group', 'teal', 'text', 'text-bottom', 'text-top', 'thick', 'thin', 'transparent', + 'ultra-condensed', 'ultra-expanded', 'underline', 'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'url', + 'visible', + 'w-resize', 'wait', 'white', 'wider', + 'x-fast', 'x-high', 'x-large', 'x-loud', 'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small', + 'yellow', 'yes' + ] + ,'specials' : [ + 'important' + ] + } + ,'OPERATORS' :[ + ':', ';', '!', '.', '#' + ] + ,'DELIMITERS' :[ + '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'attributes' : 'color: #48BDDF;' + ,'values' : 'color: #2B60FF;' + ,'specials' : 'color: #FF0000;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #60CA00;' + + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/html.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/html.js new file mode 100755 index 000000000..cc2a90e6e --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/html.js @@ -0,0 +1,50 @@ +/* +* last update: 2006-08-24 +*/ + +editAreaLoader.load_syntax["html"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {''} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + } + ,'OPERATORS' :[ + ] + ,'DELIMITERS' :[ + ] + ,'REGEXPS' : { + 'doctype' : { + 'search' : '()(]*>)()' + ,'class' : 'doctype' + ,'modifiers' : '' + ,'execute' : 'before' // before or after + } + ,'tags' : { + 'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'tags' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'attributes' : { + 'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)' + ,'class' : 'attributes' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + } + ,'OPERATORS' : 'color: #E775F0;' + ,'DELIMITERS' : '' + ,'REGEXPS' : { + 'attributes': 'color: #B1AC41;' + ,'tags': 'color: #E62253;' + ,'doctype': 'color: #8DCFB5;' + ,'test': 'color: #00FF00;' + } + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/js.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/js.js new file mode 100755 index 000000000..3b4ef5e53 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/js.js @@ -0,0 +1,60 @@ +editAreaLoader.load_syntax["js"] = { + 'COMMENT_SINGLE' : {1 : '//'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + 'statements' : [ + 'as', 'break', 'case', 'catch', 'continue', 'decodeURI', 'delete', 'do', + 'else', 'encodeURI', 'eval', 'finally', 'for', 'if', 'in', 'is', 'item', + 'instanceof', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'void', + 'while', 'write', 'with' + ] + ,'keywords' : [ + 'class', 'const', 'default', 'debugger', 'export', 'extends', 'false', + 'function', 'import', 'namespace', 'new', 'null', 'package', 'private', + 'protected', 'public', 'super', 'true', 'use', 'var', 'window', 'document', + // the list below must be sorted and checked (if it is a keywords or a function and if it is not present twice + 'Link ', 'outerHeight ', 'Anchor', 'FileUpload', + 'location', 'outerWidth', 'Select', 'Area', 'find', 'Location', 'Packages', 'self', + 'arguments', 'locationbar', 'pageXoffset', 'Form', + 'Math', 'pageYoffset', 'setTimeout', 'assign', 'Frame', 'menubar', 'parent', 'status', + 'blur', 'frames', 'MimeType', 'parseFloat', 'statusbar', 'Boolean', 'Function', 'moveBy', + 'parseInt', 'stop', 'Button', 'getClass', 'moveTo', 'Password', 'String', 'callee', 'Hidden', + 'name', 'personalbar', 'Submit', 'caller', 'history', 'NaN', 'Plugin', 'sun', 'captureEvents', + 'History', 'navigate', 'print', 'taint', 'Checkbox', 'home', 'navigator', 'prompt', 'Text', + 'Image', 'Navigator', 'prototype', 'Textarea', 'clearTimeout', 'Infinity', + 'netscape', 'Radio', 'toolbar', 'close', 'innerHeight', 'Number', 'ref', 'top', 'closed', + 'innerWidth', 'Object', 'RegExp', 'toString', 'confirm', 'isFinite', 'onBlur', 'releaseEvents', + 'unescape', 'constructor', 'isNan', 'onError', 'Reset', 'untaint', 'Date', 'java', 'onFocus', + 'resizeBy', 'unwatch', 'defaultStatus', 'JavaArray', 'onLoad', 'resizeTo', 'valueOf', 'document', + 'JavaClass', 'onUnload', 'routeEvent', 'watch', 'Document', 'JavaObject', 'open', 'scroll', 'window', + 'Element', 'JavaPackage', 'opener', 'scrollbars', 'Window', 'escape', 'length', 'Option', 'scrollBy' + ] + ,'functions' : [ + // common functions for Window object + 'alert', 'Array', 'back', 'blur', 'clearInterval', 'close', 'confirm', 'eval ', 'focus', 'forward', 'home', + 'name', 'navigate', 'onblur', 'onerror', 'onfocus', 'onload', 'onmove', + 'onresize', 'onunload', 'open', 'print', 'prompt', 'scroll', 'scrollTo', 'setInterval', 'status', + 'stop' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'statements' : 'color: #60CA00;' + ,'keywords' : 'color: #48BDDF;' + ,'functions' : 'color: #2B60FF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #0038E1;' + + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/pas.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/pas.js new file mode 100755 index 000000000..2038539f5 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/pas.js @@ -0,0 +1,82 @@ +editAreaLoader.load_syntax["pas"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {'{' : '}', '(*':'*)'} + ,'QUOTEMARKS' : {1: '"', 2: "'"} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'constants' : [ + 'Blink', 'Black', 'Blue', 'Green', 'Cyan', 'Red', + 'Magenta', 'Brown', 'LightGray', 'DarkGray', + 'LightBlue', 'LightGreen', 'LightCyan', 'LightRed', + 'LightMagenta', 'Yellow', 'White', 'MaxSIntValue', + 'MaxUIntValue', 'maxint', 'maxLongint', 'maxSmallint', + 'erroraddr', 'errorcode', 'LineEnding' + ] + ,'keywords' : [ + 'in', 'or', 'div', 'mod', 'and', 'shl', 'shr', 'xor', + 'pow', 'is', 'not','Absolute', 'And_then', 'Array', + 'Begin', 'Bindable', 'Case', 'Const', 'Do', 'Downto', + 'Else', 'End', 'Export', 'File', 'For', 'Function', + 'Goto', 'If', 'Import', 'Implementation', 'Inherited', + 'Inline', 'Interface', 'Label', 'Module', 'Nil', + 'Object', 'Of', 'Only', 'Operator', 'Or_else', + 'Otherwise', 'Packed', 'Procedure', 'Program', + 'Protected', 'Qualified', 'Record', 'Repeat', + 'Restricted', 'Set', 'Then', 'To', 'Type', 'Unit', + 'Until', 'Uses', 'Value', 'Var', 'Virtual', 'While', + 'With' + ] + ,'functions' : [ + 'Abs', 'Addr', 'Append', 'Arctan', 'Assert', 'Assign', + 'Assigned', 'BinStr', 'Blockread', 'Blockwrite', + 'Break', 'Chdir', 'Chr', 'Close', 'CompareByte', + 'CompareChar', 'CompareDWord', 'CompareWord', 'Concat', + 'Continue', 'Copy', 'Cos', 'CSeg', 'Dec', 'Delete', + 'Dispose', 'DSeg', 'Eof', 'Eoln', 'Erase', 'Exclude', + 'Exit', 'Exp', 'Filepos', 'Filesize', 'FillByte', + 'Fillchar', 'FillDWord', 'Fillword', 'Flush', 'Frac', + 'Freemem', 'Getdir', 'Getmem', 'GetMemoryManager', + 'Halt', 'HexStr', 'Hi', 'High', 'Inc', 'Include', + 'IndexByte', 'IndexChar', 'IndexDWord', 'IndexWord', + 'Insert', 'IsMemoryManagerSet', 'Int', 'IOresult', + 'Length', 'Ln', 'Lo', 'LongJmp', 'Low', 'Lowercase', + 'Mark', 'Maxavail', 'Memavail', 'Mkdir', 'Move', + 'MoveChar0', 'New', 'Odd', 'OctStr', 'Ofs', 'Ord', + 'Paramcount', 'Paramstr', 'Pi', 'Pos', 'Power', 'Pred', + 'Ptr', 'Random', 'Randomize', 'Read', 'Readln', + 'Real2Double', 'Release', 'Rename', 'Reset', 'Rewrite', + 'Rmdir', 'Round', 'Runerror', 'Seek', 'SeekEof', + 'SeekEoln', 'Seg', 'SetMemoryManager', 'SetJmp', + 'SetLength', 'SetString', 'SetTextBuf', 'Sin', 'SizeOf', + 'Sptr', 'Sqr', 'Sqrt', 'SSeg', 'Str', 'StringOfChar', + 'Succ', 'Swap', 'Trunc', 'Truncate', 'Upcase', 'Val', + 'Write', 'WriteLn' + ] + ,'types' : [ + 'Integer', 'Shortint', 'SmallInt', 'Longint', + 'Longword', 'Int64', 'Byte', 'Word', 'Cardinal', + 'QWord', 'Boolean', 'ByteBool', 'LongBool', 'Char', + 'Real', 'Single', 'Double', 'Extended', 'Comp', + 'String', 'ShortString', 'AnsiString', 'PChar' + ] + } + ,'OPERATORS' :[ + '@', '*', '+', '-', '/', '^', ':=', '<', '=', '>' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'specials' : 'color: #EE0000;' + ,'constants' : 'color: #654321;' + ,'keywords' : 'color: #48BDDF;' + ,'functions' : 'color: #449922;' + ,'types' : 'color: #2B60FF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #60CA00;' + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/php.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/php.js new file mode 100755 index 000000000..535a22bd3 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/php.js @@ -0,0 +1,75 @@ +editAreaLoader.load_syntax["php"] = { + 'COMMENT_SINGLE' : {1 : '//', 2 : '#'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'include', 'require', 'include_once', 'require_once', + 'for', 'foreach', 'as', 'if', 'elseif', 'else', 'while', 'do', 'endwhile', + 'endif', 'switch', 'case', 'endswitch', + 'return', 'break', 'continue' + ] + ,'reserved' : [ + '_GET', '_POST', '_SERVER', '_FILES', '_ENV', '_COOKIE', '_REQUEST', + 'null', '__LINE__', '__FILE__', + 'false', '<?php', '?>', '<?', + '<script language', '</script>', + 'true', 'var', 'default', + 'function', 'class', 'new', '&new', 'this', + '__FUNCTION__', '__CLASS__', '__METHOD__', 'PHP_VERSION', + 'PHP_OS', 'DEFAULT_INCLUDE_PATH', 'PEAR_INSTALL_DIR', 'PEAR_EXTENSION_DIR', + 'PHP_EXTENSION_DIR', 'PHP_BINDIR', 'PHP_LIBDIR', 'PHP_DATADIR', 'PHP_SYSCONFDIR', + 'PHP_LOCALSTATEDIR', 'PHP_CONFIG_FILE_PATH', 'PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT', + 'PHP_OUTPUT_HANDLER_END', 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE', + 'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_USER_ERROR', + 'E_USER_WARNING', 'E_USER_NOTICE', 'E_ALL' + + ] + ,'functions' : [ + 'func_num_args', 'func_get_arg', 'func_get_args', 'strlen', 'strcmp', 'strncmp', 'strcasecmp', 'strncasecmp', 'each', 'error_reporting', 'define', 'defined', + 'trigger_error', 'user_error', 'set_error_handler', 'restore_error_handler', 'get_declared_classes', 'get_loaded_extensions', + 'extension_loaded', 'get_extension_funcs', 'debug_backtrace', + 'constant', 'bin2hex', 'sleep', 'usleep', 'time', 'mktime', 'gmmktime', 'strftime', 'gmstrftime', 'strtotime', 'date', 'gmdate', 'getdate', 'localtime', 'checkdate', 'flush', 'wordwrap', 'htmlspecialchars', 'htmlentities', 'html_entity_decode', 'md5', 'md5_file', 'crc32', 'getimagesize', 'image_type_to_mime_type', 'phpinfo', 'phpversion', 'phpcredits', 'strnatcmp', 'strnatcasecmp', 'substr_count', 'strspn', 'strcspn', 'strtok', 'strtoupper', 'strtolower', 'strpos', 'strrpos', 'strrev', 'hebrev', 'hebrevc', 'nl2br', 'basename', 'dirname', 'pathinfo', 'stripslashes', 'stripcslashes', 'strstr', 'stristr', 'strrchr', 'str_shuffle', 'str_word_count', 'strcoll', 'substr', 'substr_replace', 'quotemeta', 'ucfirst', 'ucwords', 'strtr', 'addslashes', 'addcslashes', 'rtrim', 'str_replace', 'str_repeat', 'count_chars', 'chunk_split', 'trim', 'ltrim', 'strip_tags', 'similar_text', 'explode', 'implode', 'setlocale', 'localeconv', + 'parse_str', 'str_pad', 'chop', 'strchr', 'sprintf', 'printf', 'vprintf', 'vsprintf', 'sscanf', 'fscanf', 'parse_url', 'urlencode', 'urldecode', 'rawurlencode', 'rawurldecode', 'readlink', 'linkinfo', 'link', 'unlink', 'exec', 'system', 'escapeshellcmd', 'escapeshellarg', 'passthru', 'shell_exec', 'proc_open', 'proc_close', 'rand', 'srand', 'getrandmax', 'mt_rand', 'mt_srand', 'mt_getrandmax', 'base64_decode', 'base64_encode', 'abs', 'ceil', 'floor', 'round', 'is_finite', 'is_nan', 'is_infinite', 'bindec', 'hexdec', 'octdec', 'decbin', 'decoct', 'dechex', 'base_convert', 'number_format', 'fmod', 'ip2long', 'long2ip', 'getenv', 'putenv', 'getopt', 'microtime', 'gettimeofday', 'getrusage', 'uniqid', 'quoted_printable_decode', 'set_time_limit', 'get_cfg_var', 'magic_quotes_runtime', 'set_magic_quotes_runtime', 'get_magic_quotes_gpc', 'get_magic_quotes_runtime', + 'import_request_variables', 'error_log', 'serialize', 'unserialize', 'memory_get_usage', 'var_dump', 'var_export', 'debug_zval_dump', 'print_r','highlight_file', 'show_source', 'highlight_string', 'ini_get', 'ini_get_all', 'ini_set', 'ini_alter', 'ini_restore', 'get_include_path', 'set_include_path', 'restore_include_path', 'setcookie', 'header', 'headers_sent', 'connection_aborted', 'connection_status', 'ignore_user_abort', 'parse_ini_file', 'is_uploaded_file', 'move_uploaded_file', 'intval', 'floatval', 'doubleval', 'strval', 'gettype', 'settype', 'is_null', 'is_resource', 'is_bool', 'is_long', 'is_float', 'is_int', 'is_integer', 'is_double', 'is_real', 'is_numeric', 'is_string', 'is_array', 'is_object', 'is_scalar', + 'ereg', 'ereg_replace', 'eregi', 'eregi_replace', 'split', 'spliti', 'join', 'sql_regcase', 'dl', 'pclose', 'popen', 'readfile', 'rewind', 'rmdir', 'umask', 'fclose', 'feof', 'fgetc', 'fgets', 'fgetss', 'fread', 'fopen', 'fpassthru', 'ftruncate', 'fstat', 'fseek', 'ftell', 'fflush', 'fwrite', 'fputs', 'mkdir', 'rename', 'copy', 'tempnam', 'tmpfile', 'file', 'file_get_contents', 'stream_select', 'stream_context_create', 'stream_context_set_params', 'stream_context_set_option', 'stream_context_get_options', 'stream_filter_prepend', 'stream_filter_append', 'fgetcsv', 'flock', 'get_meta_tags', 'stream_set_write_buffer', 'set_file_buffer', 'set_socket_blocking', 'stream_set_blocking', 'socket_set_blocking', 'stream_get_meta_data', 'stream_register_wrapper', 'stream_wrapper_register', 'stream_set_timeout', 'socket_set_timeout', 'socket_get_status', 'realpath', 'fnmatch', 'fsockopen', 'pfsockopen', 'pack', 'unpack', 'get_browser', 'crypt', 'opendir', 'closedir', 'chdir', 'getcwd', 'rewinddir', 'readdir', 'dir', 'glob', 'fileatime', 'filectime', 'filegroup', 'fileinode', 'filemtime', 'fileowner', 'fileperms', 'filesize', 'filetype', 'file_exists', 'is_writable', 'is_writeable', 'is_readable', 'is_executable', 'is_file', 'is_dir', 'is_link', 'stat', 'lstat', 'chown', + 'touch', 'clearstatcache', 'mail', 'ob_start', 'ob_flush', 'ob_clean', 'ob_end_flush', 'ob_end_clean', 'ob_get_flush', 'ob_get_clean', 'ob_get_length', 'ob_get_level', 'ob_get_status', 'ob_get_contents', 'ob_implicit_flush', 'ob_list_handlers', 'ksort', 'krsort', 'natsort', 'natcasesort', 'asort', 'arsort', 'sort', 'rsort', 'usort', 'uasort', 'uksort', 'shuffle', 'array_walk', 'count', 'end', 'prev', 'next', 'reset', 'current', 'key', 'min', 'max', 'in_array', 'array_search', 'extract', 'compact', 'array_fill', 'range', 'array_multisort', 'array_push', 'array_pop', 'array_shift', 'array_unshift', 'array_splice', 'array_slice', 'array_merge', 'array_merge_recursive', 'array_keys', 'array_values', 'array_count_values', 'array_reverse', 'array_reduce', 'array_pad', 'array_flip', 'array_change_key_case', 'array_rand', 'array_unique', 'array_intersect', 'array_intersect_assoc', 'array_diff', 'array_diff_assoc', 'array_sum', 'array_filter', 'array_map', 'array_chunk', 'array_key_exists', 'pos', 'sizeof', 'key_exists', 'assert', 'assert_options', 'version_compare', 'ftok', 'str_rot13', 'aggregate', + 'session_name', 'session_module_name', 'session_save_path', 'session_id', 'session_regenerate_id', 'session_decode', 'session_register', 'session_unregister', 'session_is_registered', 'session_encode', + 'session_start', 'session_destroy', 'session_unset', 'session_set_save_handler', 'session_cache_limiter', 'session_cache_expire', 'session_set_cookie_params', 'session_get_cookie_params', 'session_write_close', 'preg_match', 'preg_match_all', 'preg_replace', 'preg_replace_callback', 'preg_split', 'preg_quote', 'preg_grep', 'overload', 'ctype_alnum', 'ctype_alpha', 'ctype_cntrl', 'ctype_digit', 'ctype_lower', 'ctype_graph', 'ctype_print', 'ctype_punct', 'ctype_space', 'ctype_upper', 'ctype_xdigit', 'virtual', 'apache_request_headers', 'apache_note', 'apache_lookup_uri', 'apache_child_terminate', 'apache_setenv', 'apache_response_headers', 'apache_get_version', 'getallheaders', 'mysql_connect', 'mysql_pconnect', 'mysql_close', 'mysql_select_db', 'mysql_create_db', 'mysql_drop_db', 'mysql_query', 'mysql_unbuffered_query', 'mysql_db_query', 'mysql_list_dbs', 'mysql_list_tables', 'mysql_list_fields', 'mysql_list_processes', 'mysql_error', 'mysql_errno', 'mysql_affected_rows', 'mysql_insert_id', 'mysql_result', 'mysql_num_rows', 'mysql_num_fields', 'mysql_fetch_row', 'mysql_fetch_array', 'mysql_fetch_assoc', 'mysql_fetch_object', 'mysql_data_seek', 'mysql_fetch_lengths', 'mysql_fetch_field', 'mysql_field_seek', 'mysql_free_result', 'mysql_field_name', 'mysql_field_table', 'mysql_field_len', 'mysql_field_type', 'mysql_field_flags', 'mysql_escape_string', 'mysql_real_escape_string', 'mysql_stat', + 'mysql_thread_id', 'mysql_client_encoding', 'mysql_get_client_info', 'mysql_get_host_info', 'mysql_get_proto_info', 'mysql_get_server_info', 'mysql_info', 'mysql', 'mysql_fieldname', 'mysql_fieldtable', 'mysql_fieldlen', 'mysql_fieldtype', 'mysql_fieldflags', 'mysql_selectdb', 'mysql_createdb', 'mysql_dropdb', 'mysql_freeresult', 'mysql_numfields', 'mysql_numrows', 'mysql_listdbs', 'mysql_listtables', 'mysql_listfields', 'mysql_db_name', 'mysql_dbname', 'mysql_tablename', 'mysql_table_name', 'pg_connect', 'pg_pconnect', 'pg_close', 'pg_connection_status', 'pg_connection_busy', 'pg_connection_reset', 'pg_host', 'pg_dbname', 'pg_port', 'pg_tty', 'pg_options', 'pg_ping', 'pg_query', 'pg_send_query', 'pg_cancel_query', 'pg_fetch_result', 'pg_fetch_row', 'pg_fetch_assoc', 'pg_fetch_array', 'pg_fetch_object', 'pg_fetch_all', 'pg_affected_rows', 'pg_get_result', 'pg_result_seek', 'pg_result_status', 'pg_free_result', 'pg_last_oid', 'pg_num_rows', 'pg_num_fields', 'pg_field_name', 'pg_field_num', 'pg_field_size', 'pg_field_type', 'pg_field_prtlen', 'pg_field_is_null', 'pg_get_notify', 'pg_get_pid', 'pg_result_error', 'pg_last_error', 'pg_last_notice', 'pg_put_line', 'pg_end_copy', 'pg_copy_to', 'pg_copy_from', + 'pg_trace', 'pg_untrace', 'pg_lo_create', 'pg_lo_unlink', 'pg_lo_open', 'pg_lo_close', 'pg_lo_read', 'pg_lo_write', 'pg_lo_read_all', 'pg_lo_import', 'pg_lo_export', 'pg_lo_seek', 'pg_lo_tell', 'pg_escape_string', 'pg_escape_bytea', 'pg_unescape_bytea', 'pg_client_encoding', 'pg_set_client_encoding', 'pg_meta_data', 'pg_convert', 'pg_insert', 'pg_update', 'pg_delete', 'pg_select', 'pg_exec', 'pg_getlastoid', 'pg_cmdtuples', 'pg_errormessage', 'pg_numrows', 'pg_numfields', 'pg_fieldname', 'pg_fieldsize', 'pg_fieldtype', 'pg_fieldnum', 'pg_fieldprtlen', 'pg_fieldisnull', 'pg_freeresult', 'pg_result', 'pg_loreadall', 'pg_locreate', 'pg_lounlink', 'pg_loopen', 'pg_loclose', 'pg_loread', 'pg_lowrite', 'pg_loimport', 'pg_loexport', + 'echo', 'print', 'global', 'static', 'exit', 'array', 'empty', 'eval', 'isset', 'unset', 'die' + + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '&&', '||' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + // highlight all variables ($...) + 'variables' : { + 'search' : '()(\\$\\w+)()' + ,'class' : 'variables' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #879EFA;' + ,'KEYWORDS' : { + 'reserved' : 'color: #48BDDF;' + ,'functions' : 'color: #0040FD;' + ,'statements' : 'color: #60CA00;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #2B60FF;' + ,'REGEXPS' : { + 'variables' : 'color: #E0BD54;' + } + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/python.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/python.js new file mode 100755 index 000000000..456b27e97 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/python.js @@ -0,0 +1,144 @@ +/** + * Python syntax v 1.1 + * + * v1.1 by Andre Roberge (2006/12/27) + * +**/ +editAreaLoader.load_syntax["python"] = { + 'COMMENT_SINGLE' : {1 : '#'} + ,'COMMENT_MULTI' : {} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + /* + ** Set 1: reserved words + ** http://python.org/doc/current/ref/keywords.html + ** Note: 'as' and 'with' have been added starting with Python 2.5 + */ + 'reserved' : [ + 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', + 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', + 'import', 'is', 'in', 'lambda', 'not', 'or', 'pass', 'print', 'raise', + 'return', 'try', 'while', 'with', 'yield' + //the following are *almost* reserved; we'll treat them as such + , 'False', 'True', 'None' + ] + /* + ** Set 2: builtins + ** http://python.org/doc/current/lib/built-in-funcs.html + */ + ,'builtins' : [ + '__import__', 'abs', 'basestring', 'bool', 'callable', 'chr', 'classmethod', 'cmp', + 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', + 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', + 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals', + 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'range', + 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', + 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', + 'vars', 'xrange', 'zip', + // Built-in constants: http://www.python.org/doc/2.4.1/lib/node35.html + //'False', 'True', 'None' have been included in 'reserved' + 'NotImplemented', 'Ellipsis', + // Built-in Exceptions: http://python.org/doc/current/lib/module-exceptions.html + 'Exception', 'StandardError', 'ArithmeticError', 'LookupError', 'EnvironmentError', + 'AssertionError', 'AttributeError', 'EOFError', 'FloatingPointError', 'IOError', + 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError', + 'NotImplementedError', 'OSError', 'OverflowError', 'ReferenceError', 'RuntimeError', + 'StopIteration', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError', + 'UnboundlocalError', 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError', + 'UnicodeTranslateError', 'ValueError', 'WindowsError', 'ZeroDivisionError', 'Warning', + 'UserWarning', 'DeprecationWarning', 'PendingDeprecationWarning', 'SyntaxWarning', + 'RuntimeWarning', 'FutureWarning', + // we will include the string methods as well + // http://python.org/doc/current/lib/string-methods.html + 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', + 'find', 'index', 'isalnum', 'isaplpha', 'isdigit', 'islower', 'isspace', 'istitle', + 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust', + 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', + 'translate', 'upper', 'zfill' + ] + /* + ** Set 3: standard library + ** http://python.org/doc/current/lib/modindex.html + */ + ,'stdlib' : [ + '__builtin__', '__future__', '__main__', '_winreg', 'aifc', 'AL', 'al', 'anydbm', + 'array', 'asynchat', 'asyncore', 'atexit', 'audioop', 'base64', 'BaseHTTPServer', + 'Bastion', 'binascii', 'binhex', 'bisect', 'bsddb', 'bz2', 'calendar', 'cd', 'cgi', + 'CGIHTTPServer', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop', + 'collections', 'colorsys', 'commands', 'compileall', 'compiler', 'compiler', + 'ConfigParser', 'Cookie', 'cookielib', 'copy', 'copy_reg', 'cPickle', 'crypt', + 'cStringIO', 'csv', 'curses', 'datetime', 'dbhash', 'dbm', 'decimal', 'DEVICE', + 'difflib', 'dircache', 'dis', 'distutils', 'dl', 'doctest', 'DocXMLRPCServer', 'dumbdbm', + 'dummy_thread', 'dummy_threading', 'email', 'encodings', 'errno', 'exceptions', 'fcntl', + 'filecmp', 'fileinput', 'FL', 'fl', 'flp', 'fm', 'fnmatch', 'formatter', 'fpectl', + 'fpformat', 'ftplib', 'gc', 'gdbm', 'getopt', 'getpass', 'gettext', 'GL', 'gl', 'glob', + 'gopherlib', 'grp', 'gzip', 'heapq', 'hmac', 'hotshot', 'htmlentitydefs', 'htmllib', + 'HTMLParser', 'httplib', 'imageop', 'imaplib', 'imgfile', 'imghdr', 'imp', 'inspect', + 'itertools', 'jpeg', 'keyword', 'linecache', 'locale', 'logging', 'mailbox', 'mailcap', + 'marshal', 'math', 'md5', 'mhlib', 'mimetools', 'mimetypes', 'MimeWriter', 'mimify', + 'mmap', 'msvcrt', 'multifile', 'mutex', 'netrc', 'new', 'nis', 'nntplib', 'operator', + 'optparse', 'os', 'ossaudiodev', 'parser', 'pdb', 'pickle', 'pickletools', 'pipes', + 'pkgutil', 'platform', 'popen2', 'poplib', 'posix', 'posixfile', 'pprint', 'profile', + 'pstats', 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'Queue', 'quopri', 'random', + 're', 'readline', 'repr', 'resource', 'rexec', 'rfc822', 'rgbimg', 'rlcompleter', + 'robotparser', 'sched', 'ScrolledText', 'select', 'sets', 'sgmllib', 'sha', 'shelve', + 'shlex', 'shutil', 'signal', 'SimpleHTTPServer', 'SimpleXMLRPCServer', 'site', 'smtpd', + 'smtplib', 'sndhdr', 'socket', 'SocketServer', 'stat', 'statcache', 'statvfs', 'string', + 'StringIO', 'stringprep', 'struct', 'subprocess', 'sunau', 'SUNAUDIODEV', 'sunaudiodev', + 'symbol', 'sys', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios', + 'test', 'textwrap', 'thread', 'threading', 'time', 'timeit', 'Tix', 'Tkinter', 'token', + 'tokenize', 'traceback', 'tty', 'turtle', 'types', 'unicodedata', 'unittest', 'urllib2', + 'urllib', 'urlparse', 'user', 'UserDict', 'UserList', 'UserString', 'uu', 'warnings', + 'wave', 'weakref', 'webbrowser', 'whichdb', 'whrandom', 'winsound', 'xdrlib', 'xml', + 'xmllib', 'xmlrpclib', 'zipfile', 'zipimport', 'zlib' + + ] + /* + ** Set 4: special methods + ** http://python.org/doc/current/ref/specialnames.html + */ + ,'special' : [ + // Basic customization: http://python.org/doc/current/ref/customization.html + '__new__', '__init__', '__del__', '__repr__', '__str__', + '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__cmp__', '__rcmp__', + '__hash__', '__nonzero__', '__unicode__', '__dict__', + // Attribute access: http://python.org/doc/current/ref/attribute-access.html + '__setattr__', '__delattr__', '__getattr__', '__getattribute__', '__get__', '__set__', + '__delete__', '__slots__', + // Class creation, callable objects + '__metaclass__', '__call__', + // Container types: http://python.org/doc/current/ref/sequence-types.html + '__len__', '__getitem__', '__setitem__', '__delitem__', '__iter__', '__contains__', + '__getslice__', '__setslice__', '__delslice__', + // Numeric types: http://python.org/doc/current/ref/numeric-types.html + '__abs__','__add__','__and__','__coerce__','__div__','__divmod__','__float__', + '__hex__','__iadd__','__isub__','__imod__','__idiv__','__ipow__','__iand__', + '__ior__','__ixor__', '__ilshift__','__irshift__','__invert__','__int__', + '__long__','__lshift__', + '__mod__','__mul__','__neg__','__oct__','__or__','__pos__','__pow__', + '__radd__','__rdiv__','__rdivmod__','__rmod__','__rpow__','__rlshift__','__rrshift__', + '__rshift__','__rsub__','__rmul__','__repr__','__rand__','__rxor__','__ror__', + '__sub__','__xor__' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '&', ';', '?', '`', ':', ',' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #660066;' + ,'KEYWORDS' : { + 'reserved' : 'color: #0000FF;' + ,'builtins' : 'color: #009900;' + ,'stdlib' : 'color: #009900;' + ,'special': 'color: #006666;' + } + ,'OPERATORS' : 'color: #993300;' + ,'DELIMITERS' : 'color: #993300;' + + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/vb.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/vb.js new file mode 100755 index 000000000..18cc87cf7 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/vb.js @@ -0,0 +1,52 @@ +editAreaLoader.load_syntax["vb"] = { + 'COMMENT_SINGLE' : {1 : "'"} + ,'COMMENT_MULTI' : { } + ,'QUOTEMARKS' : {1: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'if','then','for','each','while','do','loop', + 'else','elseif','select','case','end select', + 'until','next','step','to','in','end if' + ] + ,'keywords' : [ + 'empty','isempty','nothing','null','isnull','true','false', + 'set','call', + 'sub','end sub','function','end function','exit','exit function', + 'dim','Mod','In','private','public','shared','const' + ] + + ,'functions' : [ + 'CDate','Date','DateAdd','DateDiff','DatePart','DateSerial','DateValue','Day','FormatDateTime', + 'Hour','IsDate','Minute','Month', + 'MonthName','Now','Second','Time','Timer','TimeSerial','TimeValue','Weekday','WeekdayName ','Year', + 'Asc','CBool','CByte','CCur','CDate','CDbl','Chr','CInt','CLng','CSng','CStr','Hex','Oct','FormatCurrency', + 'FormatDateTime','FormatNumber','FormatPercent','Abs','Atn','Cos','Exp','Hex','Int','Fix','Log','Oct', + 'Rnd','Sgn','Sin','Sqr','Tan', + 'Array','Filter','IsArray','Join','LBound','Split','UBound', + 'InStr','InStrRev','LCase','Left','Len','LTrim','RTrim','Trim','Mid','Replace','Right','Space','StrComp', + 'String','StrReverse','UCase', + 'CreateObject','Eval','GetLocale','GetObject','GetRef','InputBox','IsEmpty','IsNull','IsNumeric', + 'IsObject','LoadPicture','MsgBox','RGB','Round','ScriptEngine','ScriptEngineBuildVersion','ScriptEngineMajorVersion', + 'ScriptEngineMinorVersion','SetLocale','TypeName','VarType' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '!', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #99CC00;' + ,'QUOTESMARKS': 'color: #333399;' + ,'KEYWORDS' : { + 'keywords' : 'color: #3366FF;' + ,'functions' : 'color: #0000FF;' + ,'statements' : 'color: #3366FF;' + } + ,'OPERATORS' : 'color: #FF0000;' + ,'DELIMITERS' : 'color: #0000FF;' + + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/xml.js b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/xml.js new file mode 100755 index 000000000..a043dd63a --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/edit_area/reg_syntax/xml.js @@ -0,0 +1,56 @@ +/* +* last update: 2006-08-24 +*/ + +editAreaLoader.load_syntax["xml"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {''} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + } + ,'OPERATORS' :[ + ] + ,'DELIMITERS' :[ + ] + ,'REGEXPS' : { + 'xml' : { + 'search' : '()(<\\?[^>]*?\\?>)()' + ,'class' : 'xml' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + ,'cdatas' : { + 'search' : '()()()' + ,'class' : 'cdata' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + ,'tags' : { + 'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'tags' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'attributes' : { + 'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)' + ,'class' : 'attributes' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + } + ,'OPERATORS' : 'color: #E775F0;' + ,'DELIMITERS' : '' + ,'REGEXPS' : { + 'attributes': 'color: #B1AC41;' + ,'tags': 'color: #E62253;' + ,'xml': 'color: #8DCFB5;' + ,'cdata': 'color: #50B020;' + } + } +}; diff --git a/admin-dev/ajaxfilemanager/jscripts/for_fckeditor.js b/admin-dev/ajaxfilemanager/jscripts/for_fckeditor.js new file mode 100755 index 000000000..7cc7788f6 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/for_fckeditor.js @@ -0,0 +1,27 @@ +//function below added by logan (cailongqun [at] yahoo [dot] com [dot] cn) from www.phpletter.com +function selectFile() +{ + var selectedFileRowNum = $('#selectedFileRowNum').val(); + if(selectedFileRowNum != '' && $('#row' + selectedFileRowNum)) + { + + // insert information now + var url = $('#fileUrl'+selectedFileRowNum).val(); + window.opener.SetUrl( url ) ; + window.close() ; + + }else + { + alert(noFileSelected); + } + + +} + + + +function cancelSelectFile() +{ + // close popup window + window.close() ; +} \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/for_form.js b/admin-dev/ajaxfilemanager/jscripts/for_form.js new file mode 100755 index 000000000..8ac37e108 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/for_form.js @@ -0,0 +1,16 @@ +function selectFile(url) +{ + window.opener.document.getElementById(elementId).value = url; + window.close() ; + + +} + + + +function cancelSelectFile() +{ + // close popup window + window.close() ; +} + diff --git a/admin-dev/ajaxfilemanager/jscripts/for_stand_alone.js b/admin-dev/ajaxfilemanager/jscripts/for_stand_alone.js new file mode 100755 index 000000000..16b2dc8af --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/for_stand_alone.js @@ -0,0 +1,5 @@ +function cancelSelectFile() +{ + // close popup window + window.close(); +} \ No newline at end of file diff --git a/admin-dev/ajaxfilemanager/jscripts/for_tinymce.js b/admin-dev/ajaxfilemanager/jscripts/for_tinymce.js new file mode 100755 index 000000000..bc8cfa6b9 --- /dev/null +++ b/admin-dev/ajaxfilemanager/jscripts/for_tinymce.js @@ -0,0 +1,248 @@ +// Some global instances +var tinymce = null, tinyMCEPopup, tinyMCE; + +tinyMCEPopup = { + init : function() { + var t = this, w = t.getWin(), ti; + + // Find API + tinymce = w.tinymce; + tinyMCE = w.tinyMCE; + t.editor = tinymce.EditorManager.activeEditor; + t.params = t.editor.windowManager.params; + + // Setup local DOM + t.dom = t.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document); + t.dom.loadCSS(t.editor.settings.popup_css); + + // Setup on init listeners + t.listeners = []; + t.onInit = { + add : function(f, s) { + t.listeners.push({func : f, scope : s}); + } + }; + + t.isWindow = !t.getWindowArg('mce_inline'); + t.id = t.getWindowArg('mce_window_id'); + t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window); + }, + + getWin : function() { + return window.dialogArguments || opener || parent || top; + }, + + getWindowArg : function(n, dv) { + var v = this.params[n]; + + return tinymce.is(v) ? v : dv; + }, + + getParam : function(n, dv) { + return this.editor.getParam(n, dv); + }, + + getLang : function(n, dv) { + return this.editor.getLang(n, dv); + }, + + execCommand : function(cmd, ui, val) { + this.restoreSelection(); + return this.editor.execCommand(cmd, ui, val); + }, + + resizeToInnerSize : function() { + var t = this, n, b = document.body, vp = t.dom.getViewPort(window), dw, dh; + + dw = t.getWindowArg('mce_width') - vp.w; + dh = t.getWindowArg('mce_height') - vp.h; + + if (t.isWindow) + window.resizeBy(dw, dh); + else + t.editor.windowManager.resizeBy(dw, dh, t.id); + }, + + executeOnLoad : function(s) { + this.onInit.add(function() { + eval(s); + }); + }, + + storeSelection : function() { + this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark('simple'); + }, + + restoreSelection : function() { + var t = tinyMCEPopup; + + if (!t.isWindow && tinymce.isIE) + t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark); + }, + + requireLangPack : function() { + var u = this.getWindowArg('plugin_url') || this.getWindowArg('theme_url'); + + if (u) + document.write(''); + }, + + pickColor : function(e, element_id) { + this.execCommand('mceColorPicker', true, { + color : document.getElementById(element_id).value, + func : function(c) { + document.getElementById(element_id).value = c; + + if (tinymce.is(document.getElementById(element_id).onchange, 'function')) + document.getElementById(element_id).onchange(); + } + }); + }, + + openBrowser : function(element_id, type, option) { + tinyMCEPopup.restoreSelection(); + this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window); + }, + + close : function() { + var t = this; + + t.dom = t.dom.doc = null; // Cleanup + t.editor.windowManager.close(window, t.id); + }, + + // Internal functions + + _restoreSelection : function() { + var e = window.event.srcElement; + + if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) + tinyMCEPopup.restoreSelection(); + }, + +/* _restoreSelection : function() { + var e = window.event.srcElement; + + // If user focus a non text input or textarea + if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text') + tinyMCEPopup.restoreSelection(); + },*/ + + _onDOMLoaded : function() { + var t = this, ti = document.title, bm, h; + + // Translate page + h = document.body.innerHTML; + + // Replace a=x with a="x" in IE + if (tinymce.isIE) + h = h.replace(/ (value|title|alt)=([^\s>]+)/gi, ' $1="$2"'); + + document.body.innerHTML = t.editor.translate(h); + document.title = ti = t.editor.translate(ti); + document.body.style.display = ''; + + // Restore selection in IE when focus is placed on a non textarea or input element of the type text + if (tinymce.isIE) + document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection); + + t.restoreSelection(); + + // Call onInit + tinymce.each(t.listeners, function(o) { + o.func.call(o.scope, t.editor); + }); + + t.resizeToInnerSize(); + + if (t.isWindow) + window.focus(); + else + t.editor.windowManager.setTitle(ti, t.id); + + if (!tinymce.isIE && !t.isWindow) { + tinymce.dom.Event._add(document, 'focus', function() { + t.editor.windowManager.focus(t.id) + }); + } + + // Patch for accessibility + tinymce.each(t.dom.select('select'), function(e) { + e.onkeydown = tinyMCEPopup._accessHandler; + }); + + // Move focus to window + window.focus(); + }, + + _accessHandler : function(e) { + var e = e || window.event; + + if (e.keyCode == 13 || e.keyCode == 32) { + e = e.target || e.srcElement; + + if (e.onchange) + e.onchange(); + + return tinymce.dom.Event.cancel(e); + } + }, + + _wait : function() { + var t = this, ti; + + if (tinymce.isIE && document.location.protocol != 'https:') { + // Fake DOMContentLoaded on IE + document.write(''; + $iso = Db::getInstance()->getValue('SELECT iso_code FROM '._DB_PREFIX_.'lang WHERE `id_lang` = '.(int)($cookie->id_lang)); + if ($iso != 'en') + echo ''; + echo ''; +} + +/** + * Generate a new settings file, only transmitted parameters are updated + * + * @param string $baseUri Base URI + * @param string $theme Theme name (eg. default) + * @param array $arrayDB Parameters in order to connect to database + */ +function rewriteSettingsFile($baseUrls = NULL, $theme = NULL, $arrayDB = NULL) +{ + $defines = array(); + $defines['_PS_DIRECTORY_'] = ($baseUrls AND $baseUrls['_PS_DIRECTORY_']) ? $baseUrls['_PS_DIRECTORY_'] : _PS_DIRECTORY_; + $defines['_MEDIA_SERVER_1_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_1_'])) ? $baseUrls['_MEDIA_SERVER_1_'] : _MEDIA_SERVER_1_; + $defines['_MEDIA_SERVER_2_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_2_'])) ? $baseUrls['_MEDIA_SERVER_2_'] : _MEDIA_SERVER_2_; + $defines['_MEDIA_SERVER_3_'] = ($baseUrls AND isset($baseUrls['_MEDIA_SERVER_3_'])) ? $baseUrls['_MEDIA_SERVER_3_'] : _MEDIA_SERVER_3_; + $defines['_PS_CACHING_SYSTEM_'] = _PS_CACHING_SYSTEM_; + $defines['_PS_CACHE_ENABLED_'] = _PS_CACHE_ENABLED_; + $defines['_DB_NAME_'] = (($arrayDB AND isset($arrayDB['_DB_NAME_'])) ? $arrayDB['_DB_NAME_'] : _DB_NAME_); + $defines['_MYSQL_ENGINE_'] = _MYSQL_ENGINE_; + $defines['_DB_SERVER_'] = (($arrayDB AND isset($arrayDB['_DB_SERVER_'])) ? $arrayDB['_DB_SERVER_'] : _DB_SERVER_); + $defines['_DB_USER_'] = (($arrayDB AND isset($arrayDB['_DB_USER_'])) ? $arrayDB['_DB_USER_'] : _DB_USER_); + $defines['_DB_PREFIX_'] = (($arrayDB AND isset($arrayDB['_DB_PREFIX_'])) ? $arrayDB['_DB_PREFIX_'] : _DB_PREFIX_); + $defines['_DB_PASSWD_'] = (($arrayDB AND isset($arrayDB['_DB_PASSWD_'])) ? $arrayDB['_DB_PASSWD_'] : _DB_PASSWD_); + $defines['_DB_TYPE_'] = (($arrayDB AND isset($arrayDB['_DB_TYPE_'])) ? $arrayDB['_DB_TYPE_'] : _DB_TYPE_); + $defines['_COOKIE_KEY_'] = addslashes(_COOKIE_KEY_); + $defines['_COOKIE_IV_'] = addslashes(_COOKIE_IV_); + if (defined('_RIJNDAEL_KEY_')) + $defines['_RIJNDAEL_KEY_'] = addslashes(_RIJNDAEL_KEY_); + if (defined('_RIJNDAEL_IV_')) + $defines['_RIJNDAEL_IV_'] = addslashes(_RIJNDAEL_IV_); + $defines['_PS_VERSION_'] = addslashes(_PS_VERSION_); + $content = " $value) + $content .= 'define(\''.$k.'\', \''.addslashes($value).'\');'."\n"; + $content .= "\n?>"; + if ($fd = @fopen(PS_ADMIN_DIR.'/../config/settings.inc.php', 'w')) + { + fwrite($fd, $content); + fclose($fd); + return true; + } + return false; +} + +/** + * Display SQL date in friendly format + * + * @param string $sqlDate Date in SQL format (YYYY-MM-DD HH:mm:ss) + * @param boolean $withTime Display both date and time + * @todo Several formats (french : DD-MM-YYYY) + */ +function displayDate($sqlDate, $withTime = false) +{ + return strftime('%Y-%m-%d'.($withTime ? ' %H:%M:%S' : ''), strtotime($sqlDate)); +} + +/** + * Return path to a product category + * + * @param string $urlBase Start URL + * @param integer $id_category Start category + * @param string $path Current path + * @param string $highlight String to highlight (in XHTML/CSS) + * @param string $type Category type (products/cms) + */ +function getPath($urlBase, $id_category, $path = '', $highlight = '', $categoryType = 'catalog', $home = false) +{ + global $cookie; + + if ($categoryType == 'catalog') + { + $category = Db::getInstance()->getRow(' + SELECT id_category, level_depth, nleft, nright + FROM '._DB_PREFIX_.'category + WHERE id_category = '.(int)$id_category); + if (isset($category['id_category'])) + { + $categories = Db::getInstance()->ExecuteS(' + SELECT c.id_category, cl.name, cl.link_rewrite + FROM '._DB_PREFIX_.'category c + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category) + WHERE c.nleft <= '.(int)$category['nleft'].' AND c.nright >= '.(int)$category['nright'].' AND cl.id_lang = '.(int)$cookie->id_lang.($home ? ' AND c.id_category='.$id_category : '').' + GROUP BY c.id_category + ORDER BY c.level_depth ASC + LIMIT '.(!$home ? (int)($category['level_depth'] + 1) : 1)); + $fullPath = ''; + $n = 1; + $nCategories = (int)sizeof($categories); + foreach ($categories AS $category) + { + $edit = ' '; + $fullPath .= $edit. + ($n < $nCategories ? '' : ''). + (!empty($highlight) ? str_ireplace($highlight, ''.htmlentities($highlight, ENT_NOQUOTES, 'UTF-8').'', $category['name']) : $category['name']). + ($n < $nCategories ? '' : ''). + (($n++ != $nCategories OR !empty($path)) ? ' > ' : ''); + } + + return $fullPath.$path; + } + } + elseif ($categoryType == 'cms') + { + $category = new CMSCategory($id_category, (int)($cookie->id_lang)); + if (!$category->id) + return $path; + + $name = ($highlight != NULL) ? str_ireplace($highlight, ''.$highlight.'', CMSCategory::hideCMSCategoryPosition($category->name)) : CMSCategory::hideCMSCategoryPosition($category->name); + $edit = ' + Modify '; + if ($category->id == 1) + $edit = ' + Home '; + $path = $edit.' + '.$name.' > '.$path; + if ($category->id == 1) + return substr($path, 0, strlen($path) - 3); + return getPath($urlBase, $category->id_parent, $path, '', 'cms'); + } +} + +function getDirContent($path) +{ + $content = array(); + if (is_dir($path)) + { + $d = dir($path); + while (false !== ($entry = $d->read())) + if ($entry{0} != '.') + $content[] = $entry; + $d->close(); + } + return $content; +} + +function createDir($path, $rights) +{ + if (file_exists($path)) + return true; + return @mkdir($path, $rights); +} + +function checkPSVersion() +{ + libxml_set_streams_context(stream_context_create(array('http' => array('timeout' => 3)))); + if ($feed = @simplexml_load_file('http://www.prestashop.com/xml/version.xml') AND _PS_VERSION_ < $feed->version->num) + return array('name' => $feed->version->name, 'link' => $feed->download->link); + return false; +} + +function translate($string) +{ + global $_LANGADM; + if (!is_array($_LANGADM)) + return str_replace('"', '"', $string); + $key = md5(str_replace('\'', '\\\'', $string)); + $str = (key_exists('index'.$key, $_LANGADM)) ? $_LANGADM['index'.$key] : ((key_exists('index'.$key, $_LANGADM)) ? $_LANGADM['index'.$key] : $string); + return str_replace('"', '"', stripslashes($str)); +} + +function recursiveTab($id_tab) +{ + global $cookie, $tabs; + + $adminTab = Tab::getTab((int)$cookie->id_lang, $id_tab); + $tabs[]= $adminTab; + if ($adminTab['id_parent'] > 0) + recursiveTab($adminTab['id_parent']); +} + +function checkingTab($tab) +{ + global $adminObj, $cookie; + + $tab = trim($tab); + if (!Validate::isTabName($tab)) + return false; + + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT id_tab, module FROM `'._DB_PREFIX_.'tab` WHERE class_name = \''.pSQL($tab).'\''); + if (!$row['id_tab']) + { + if (isset(AdminTab::$tabParenting[$tab])) + Tools::redirectAdmin('?tab='.AdminTab::$tabParenting[$tab].'&token='.Tools::getAdminTokenLite(AdminTab::$tabParenting[$tab])); + echo Tools::displayError('Tab cannot be found.'); + return false; + } + if ($row['module'] AND file_exists(_PS_MODULE_DIR_.'/'.$row['module'].'/'.$tab.'.php')) + include_once(_PS_MODULE_DIR_.'/'.$row['module'].'/'.$tab.'.php'); + elseif (file_exists(PS_ADMIN_DIR.'/tabs/'.$tab.'.php')) + include_once(PS_ADMIN_DIR.'/tabs/'.$tab.'.php'); + + if (!class_exists($tab, false) OR !$row['id_tab']) + { + echo Tools::displayError('Tab file cannot be found.'); + return false; + } + $adminObj = new $tab; + if (!$adminObj->viewAccess() AND ($adminObj->table != 'employee' OR $cookie->id_employee != Tools::getValue('id_employee') OR !Tools::isSubmit('updateemployee'))) + { + $adminObj->_errors = array(Tools::displayError('Access denied')); + echo $adminObj->displayErrors(); + return false; + } + return $row['id_tab']; +} + +function checkTabRights($id_tab) +{ + global $cookie; + static $tabAccesses = NULL; + + if ($tabAccesses === NULL) + $tabAccesses = Profile::getProfileAccesses($cookie->profile); + + if (isset($tabAccesses[(int)($id_tab)]['view'])) + return ($tabAccesses[(int)($id_tab)]['view'] === '1'); + return false; +} + + +/** + * Converts a simpleXML element into an array. Preserves attributes and everything. + * You can choose to get your elements either flattened, or stored in a custom index that + * you define. + * For example, for a given element + * + * if you choose to flatten attributes, you would get: + * $array['field']['name'] = 'someName'; + * $array['field']['type'] = 'someType'; + * If you choose not to flatten, you get: + * $array['field']['@attributes']['name'] = 'someName'; + * _____________________________________ + * Repeating fields are stored in indexed arrays. so for a markup such as: + * + * a + * b + * c + * + * you array would be: + * $array['parent']['child'][0] = 'a'; + * $array['parent']['child'][1] = 'b'; + * ...And so on. + * _____________________________________ + * @param simpleXMLElement $xml the XML to convert + * @param boolean $flattenValues Choose wether to flatten values + * or to set them under a particular index. + * defaults to true; + * @param boolean $flattenAttributes Choose wether to flatten attributes + * or to set them under a particular index. + * Defaults to true; + * @param boolean $flattenChildren Choose wether to flatten children + * or to set them under a particular index. + * Defaults to true; + * @param string $valueKey index for values, in case $flattenValues was set to + * false. Defaults to "@value" + * @param string $attributesKey index for attributes, in case $flattenAttributes was set to + * false. Defaults to "@attributes" + * @param string $childrenKey index for children, in case $flattenChildren was set to + * false. Defaults to "@children" + * @return array the resulting array. + */ +function simpleXMLToArray ($xml, $flattenValues = true, $flattenAttributes = true, $flattenChildren = true, $valueKey = '@value', $attributesKey = '@attributes', $childrenKey = '@children') +{ + $return = array(); + if (!($xml instanceof SimpleXMLElement)) + return $return; + + $name = $xml->getName(); + $_value = trim((string)$xml); + if (strlen($_value) == 0) + $_value = null; + + if ($_value !== null) + { + if (!$flattenValues) + $return[$valueKey] = $_value; + else + $return = $_value; + } + + $children = array(); + $first = true; + foreach($xml->children() as $elementName => $child) + { + $value = simpleXMLToArray($child, $flattenValues, $flattenAttributes, $flattenChildren, $valueKey, $attributesKey, $childrenKey); + if (isset($children[$elementName])) + { + if ($first) + { + $temp = $children[$elementName]; + unset($children[$elementName]); + $children[$elementName][] = $temp; + $first=false; + } + $children[$elementName][] = $value; + } + else + $children[$elementName] = $value; + } + + if (count($children) > 0 ) + { + if (!$flattenChildren) + $return[$childrenKey] = $children; + else + $return = array_merge($return, $children); + } + + $attributes = array(); + foreach($xml->attributes() as $name => $value) + $attributes[$name] = trim($value); + + if (count($attributes) > 0) + { + if (!$flattenAttributes) + $return[$attributesKey] = $attributes; + else + $return = array_merge($return, $attributes); + } + + return $return; +} diff --git a/admin-dev/get-file-admin.php b/admin-dev/get-file-admin.php new file mode 100644 index 000000000..f40678c83 --- /dev/null +++ b/admin-dev/get-file-admin.php @@ -0,0 +1,31 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_ADMIN_DIR', getcwd()); + +include(PS_ADMIN_DIR.'/../get-file.php'); + diff --git a/admin-dev/grider.php b/admin-dev/grider.php new file mode 100644 index 000000000..7d30d69b7 --- /dev/null +++ b/admin-dev/grider.php @@ -0,0 +1,64 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../config/config.inc.php'); +$cookie = new Cookie('psAdmin'); + +$module = Tools::getValue('module'); +$render = Tools::getValue('render'); +$type = Tools::getValue('type'); +$option = Tools::getValue('option'); +$width = (int)(Tools::getValue('width', 600)); +$height = (int)(Tools::getValue('height', 920)); +$start = (int)(Tools::getValue('start', 0)); +$limit = (int)(Tools::getValue('limit', 40)); +$sort = Tools::getValue('sort', 0); // Should be a String. Default value is an Integer because we don't know what can be the name of the column to sort. +$dir = Tools::getValue('dir', 0); // Should be a String : Either ASC or DESC +$id_employee = (int)(Tools::getValue('id_employee')); +$id_lang = (int)(Tools::getValue('id_lang')); + +if ($cookie->id_employee != $id_employee) + die; + +if (!Validate::isModuleName($module)) + die(Tools::displayError()); + +if (!Tools::file_exists_cache($module_path = dirname(__FILE__).'/../modules/'.$module.'/'.$module.'.php')) + die(Tools::displayError()); + +require_once($module_path); + +$grid = new $module(); +$grid->setEmployee($id_employee); +$grid->setLang($id_lang); +if ($option) + $grid->setOption($option); + +$grid->create($render, $type, $width, $height, $start, $limit, $sort, $dir); +$grid->render(); + + diff --git a/admin-dev/header.inc.php b/admin-dev/header.inc.php new file mode 100644 index 000000000..fb53a9d18 --- /dev/null +++ b/admin-dev/header.inc.php @@ -0,0 +1,177 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +// P3P Policies (http://www.w3.org/TR/2002/REC-P3P-20020416/#compact_policies) +header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"'); +header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); +header('Pragma: no-cache'); +header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + +require_once(dirname(__FILE__).'/init.php'); + +echo ' + + + + + + + + + PrestaShop™ - '.translate('Administration panel').' + + + + + + + + + + '.Module::hookExec('backOfficeHeader').' + + + + bo_color)) ? 'style="background:'.Tools::htmlentitiesUTF8($employee->bo_color).'"' : '').'> +
+
+
+ '.Configuration::get('PS_SHOP_NAME').'
+ '.Tools::substr($employee->firstname, 0, 1).'. '.htmlentities($employee->lastname, ENT_COMPAT, 'UTF-8').' + [ '.translate('logout').' ] + - '.translate('View my shop').' + - '.translate('My preferences').' +
+ +
+ + +
'; + + if (Tools::isMultiShopActivated()) + echo '
'.Shop::generateHtmlList().'
'; + +echo '
 
+ '.Module::hookExec('backOfficeTop').' + '.$echoLis; +if ($employee->bo_uimode == 'hover') + echo ' '; +echo ' +
+
' + .(file_exists(PS_ADMIN_DIR.'/../install') ? '
' + .translate('For security reasons, you must also:').' '. + translate('deleted the /install folder'). + '
' : '').' + '; diff --git a/admin-dev/import/.htaccess b/admin-dev/import/.htaccess new file mode 100644 index 000000000..66d49b1bd --- /dev/null +++ b/admin-dev/import/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/admin-dev/import/index.php b/admin-dev/import/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/admin-dev/import/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/admin-dev/index.php b/admin-dev/index.php new file mode 100644 index 000000000..323fe58da --- /dev/null +++ b/admin-dev/index.php @@ -0,0 +1,160 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7451 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('_PS_ADMIN_DIR_', getcwd()); +define('PS_ADMIN_DIR', _PS_ADMIN_DIR_); // Retro-compatibility + +include(PS_ADMIN_DIR.'/../config/config.inc.php'); +include(PS_ADMIN_DIR.'/functions.php'); +include(PS_ADMIN_DIR.'/header.inc.php'); +if (empty($tab) and !sizeof($_POST)) +{ + $tab = 'AdminHome'; + $_POST['tab'] = 'AdminHome'; + $_POST['token'] = Tools::getAdminTokenLite($tab); +} + + if ($id_tab = checkingTab($tab)) + { + $isoUser = Language::getIsoById(intval($cookie->id_lang)); + $tabs = array(); + recursiveTab($id_tab); + $tabs = array_reverse($tabs); + $bread = ''; + + foreach ($tabs AS $key => $item) + $bread .= ' + '.((sizeof($tabs) - 1 > $key) + ? '' + : '').' + '.$item['name'].((sizeof($tabs) - 1 > $key) ? '' : ''); + + echo''; + + + echo '
+ + '.translate('Back Office').' + '.$bread; + if (Tools::isMultiShopActivated()) + { + echo ' + '.translate('You are currently view/configure your store for').' '; + if (Shop::getContextType() == Shop::CONTEXT_ALL) + echo 'all shops'; + elseif (Shop::getContextType() == Shop::CONTEXT_GROUP) + { + $group_shop = new GroupShop((int)Shop::getCurrentGroupShop()); + echo 'all shops of group shop '.$group_shop->name.''; + } + elseif (Shop::getContextType() == Shop::CONTEXT_SHOP) + { + $shop = new Shop((int)Shop::getCurrentShop()); + echo 'shop '.$shop->name.''; + } + echo ' +  '; + } + echo ' +
'; + + if (Validate::isLoadedObject($adminObj)) + { + if ($adminObj->checkToken()) + { + /* Filter memorization */ + if (isset($_POST) AND !empty($_POST) AND isset($adminObj->table)) + foreach ($_POST AS $key => $value) + if (is_array($adminObj->table)) + { + foreach ($adminObj->table AS $table) + if (strncmp($key, $table.'Filter_', 7) === 0 OR strncmp($key, 'submitFilter', 12) === 0) + $cookie->$key = !is_array($value) ? $value : serialize($value); + } + elseif (strncmp($key, $adminObj->table.'Filter_', 7) === 0 OR strncmp($key, 'submitFilter', 12) === 0) + $cookie->$key = !is_array($value) ? $value : serialize($value); + + if (isset($_GET) AND !empty($_GET) AND isset($adminObj->table)) + foreach ($_GET AS $key => $value) + if (is_array($adminObj->table)) + { + foreach ($adminObj->table AS $table) + if (strncmp($key, $table.'OrderBy', 7) === 0 OR strncmp($key, $table.'Orderway', 8) === 0) + $cookie->$key = $value; + } + elseif (strncmp($key, $adminObj->table.'OrderBy', 7) === 0 OR strncmp($key, $adminObj->table.'Orderway', 12) === 0) + $cookie->$key = $value; + + $adminObj->displayConf(); + $adminObj->postProcess(); + $adminObj->displayErrors(); + $adminObj->display(); + } + else + { + // If this is an XSS attempt, then we should only display a simple, secure page + ob_clean(); + + // ${1} in the replacement string of the regexp is required, because the token may begin with a number and mix up with it (e.g. $17) + $url = preg_replace('/([&?]token=)[^&]*(&.*)?$/', '${1}'.$adminObj->token.'$2', $_SERVER['REQUEST_URI']); + if (false === strpos($url, '?token=') AND false === strpos($url, '&token=')) + $url .= '&token='.$adminObj->token; + + $message = translate('Invalid security token'); + echo ''.$message.' +
+ + '.$message.' +
'; + echo ' + + + + + + '; + die; + } + } + } + +include(PS_ADMIN_DIR.'/footer.inc.php'); + diff --git a/admin-dev/init.php b/admin-dev/init.php new file mode 100644 index 000000000..0d53acdb0 --- /dev/null +++ b/admin-dev/init.php @@ -0,0 +1,93 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7227 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +ob_start(); +$timerStart = microtime(true); + +$currentFileName = array_reverse(explode("/", $_SERVER['SCRIPT_NAME'])); +$cookie = new Cookie('psAdmin', substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -strlen($currentFileName['0']))); +if (isset($_GET['logout'])) + $cookie->logout(); + +if (!$cookie->isLoggedBack()) +{ + + $destination = substr($_SERVER['REQUEST_URI'], strlen(dirname($_SERVER['SCRIPT_NAME'])) + 1); + Tools::redirectAdmin('login.php'.(empty($destination) || ($destination == 'index.php?logout') ? '' : '?redirect='.$destination)); +} +else +{ + $link = new Link(); + + $currentIndex = $_SERVER['SCRIPT_NAME'].(($tab = Tools::getValue('tab')) ? '?tab='.$tab : ''); + if ($back = Tools::getValue('back')) + $currentIndex .= '&back='.urlencode($back); + + /* Server Params */ + $protocol_link = (Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://'; + $protocol_content = (isset($useSSL) AND $useSSL AND Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://'; + define('_PS_BASE_URL_', Tools::getShopDomain(true)); + define('_PS_BASE_URL_SSL_', Tools::getShopDomainSsl(true)); + + $employee = new Employee((int)$cookie->id_employee); + $cookie->id_lang = (int)$employee->id_lang; + $iso = strtolower(Language::getIsoById($cookie->id_lang ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'))); + include(_PS_TRANSLATIONS_DIR_.$iso.'/errors.php'); + include(_PS_TRANSLATIONS_DIR_.$iso.'/fields.php'); + include(_PS_TRANSLATIONS_DIR_.$iso.'/admin.php'); + + /* attribute id_lang is often needed, so we create a constant for performance reasons */ + define('_USER_ID_LANG_', (int)$cookie->id_lang); + + $path = dirname(__FILE__).'/themes/'; + if (empty($employee->bo_theme) OR !file_exists($path.$employee->bo_theme.'/admin.css')) + { + if (file_exists($path.'oldschool/admin.css')) + $employee->bo_theme = 'oldschool'; + elseif (file_exists($path.'origins/admin.css')) + $employee->bo_theme = 'origins'; + else + foreach (scandir($path) as $theme) + if ($theme[0] != '.' AND file_exists($path.$theme.'/admin.css')) + { + $employee->bo_theme = $theme; + break; + } + $employee->update(); + } + + // Change shop context ? + if (Tools::isMultiShopActivated() && Tools::getValue('setShopContext') !== false) + { + $cookie->shopContext = Tools::getValue('setShopContext'); + $url = parse_url($_SERVER['REQUEST_URI']); + $query = (isset($url['query'])) ? $url['query'] : ''; + parse_str($query, $parseQuery); + unset($parseQuery['setShopContext']); + Tools::redirectAdmin($url['path'] . '?' . http_build_query($parseQuery)); + } +} diff --git a/admin-dev/login.php b/admin-dev/login.php new file mode 100644 index 000000000..e2ff575f5 --- /dev/null +++ b/admin-dev/login.php @@ -0,0 +1,187 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +ob_start(); +define('PS_ADMIN_DIR', getcwd()); + +include(PS_ADMIN_DIR.'/../config/config.inc.php'); +include(PS_ADMIN_DIR.'/functions.php'); + +$clientIsMaintenanceOrLocal = in_array(Tools::getRemoteAddr(), array_merge(array('127.0.0.1'),explode(',', Configuration::get('PS_MAINTENANCE_IP')))); + +$errors = array(); + +if ((empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) == 'off') + AND Configuration::get('PS_SSL_ENABLED')) +{ + // You can uncomment theses lines if you want to force https even from localhost and automatically redirect + // header('HTTP/1.1 301 Moved Permanently'); + // header('Location: '.Tools::getShopDomainSsl(true).$_SERVER['REQUEST_URI']); + // exit(); + + // If ssl is enabled, https protocol is required. Exception for maintenance and local (127.0.0.1) IP + if ($clientIsMaintenanceOrLocal) + $errors[] = translate('SSL is activated. However, your IP is allowed to use unsecure mode (Maintenance or local IP).').'
'; + else + $warningSslMessage = translate('SSL is activated. Please connect using the following url to log in in secure mode (https).') + .'

https://'.Tools::getServerName().$_SERVER['REQUEST_URI'].''; +} + +$cookie = new Cookie('psAdmin', substr($_SERVER['PHP_SELF'], strlen(__PS_BASE_URI__), -10)); +if (!isset($cookie->id_lang)) + $cookie->id_lang = Configuration::get('PS_LANG_DEFAULT'); +$iso = strtolower(Language::getIsoById((int)($cookie->id_lang))); +include(_PS_TRANSLATIONS_DIR_.$iso.'/admin.php'); +include(_PS_TRANSLATIONS_DIR_.$iso.'/errors.php'); + +/* Cookie creation and redirection */ +if (Tools::isSubmit('Submit')) +{ + /* Check fields validity */ + $passwd = trim(Tools::getValue('passwd')); + $email = trim(Tools::getValue('email')); + if (empty($email)) + $errors[] = Tools::displayError('E-mail is empty'); + elseif (!Validate::isEmail($email)) + $errors[] = Tools::displayError('Invalid e-mail address'); + elseif (empty($passwd)) + $errors[] = Tools::displayError('Password is blank'); + elseif (!Validate::isPasswd($passwd)) + $errors[] = Tools::displayError('Invalid password'); + else + { + /* Seeking for employee */ + $employee = new Employee(); + $employee = $employee->getByemail($email, $passwd); + if (!$employee) + { + $errors[] = Tools::displayError('Employee does not exist or password is incorrect.'); + $cookie->logout(); + } + else + { + /* Creating cookie */ + $cookie->id_employee = $employee->id; + $cookie->email = $employee->email; + $cookie->profile = $employee->id_profile; + $cookie->passwd = $employee->passwd; + $cookie->remote_addr = ip2long(Tools::getRemoteAddr()); + $cookie->write(); + /* Redirect to admin panel */ + if (isset($_GET['redirect'])) + $url = strval($_GET['redirect'].(isset($_GET['token']) ? ('&token='.$_GET['token']) : '')); + else + $url = 'index.php'; + if (!Validate::isCleanHtml($url)) + die(Tools::displayError()); + echo ' + + + + + + + '; + exit ; + } + } +} + +echo ' + + + + + PrestaShop™ - '.translate('Administration panel').''; +echo ' + + +
'; + +if ($nbErrors = sizeof($errors)) +{ + echo ' +
+

'.($nbErrors > 1 ? translate('There are') : translate('There is')).' '.$nbErrors.' '.($nbErrors > 1 ? translate('errors') : translate('error')).'

+
    '; + foreach ($errors AS $error) + echo '
  1. '.$error.'
  2. '; + echo ' +
+
+
'; +} + +echo ' +
+

'.Tools::htmlentitiesUTF8(Configuration::get('PS_SHOP_NAME')).'

+
'; + +$randomNb = rand(100, 999); +if(file_exists(PS_ADMIN_DIR.'/../install') OR file_exists(PS_ADMIN_DIR.'/../admin')) +{ + echo ' '.translate('For security reasons, you cannot connect to the Back Office until after you have:').'

+ - '.translate('deleted the /install folder').'
+ - '.translate('renamed the /admin folder (eg. ').'/admin'.$randomNb.')
+
'.translate('Please then access this page by the new url (eg. http://www.domain.tld/admin').$randomNb.')
'; +} +else +{ + // If https enabled, we force it except if you try to log in from maintenance or local ip + if ( (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) == 'off') + AND ( Configuration::get('PS_SSL_ENABLED') AND !$clientIsMaintenanceOrLocal) + ) + echo '
'.$warningSslMessage.'
'; + else + echo '
+ +
+
+ +
+ + '; +} +?> + + +
+

© Copyright by PrestaShop. all rights reserved.

+
+ +'; diff --git a/admin-dev/password.php b/admin-dev/password.php new file mode 100644 index 000000000..51ba005b9 --- /dev/null +++ b/admin-dev/password.php @@ -0,0 +1,116 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_ADMIN_DIR', getcwd()); + +include(PS_ADMIN_DIR.'/../config/config.inc.php'); +include(PS_ADMIN_DIR.'/functions.php'); + +$cookie = new Cookie('psAdmin', substr($_SERVER['PHP_SELF'], strlen(__PS_BASE_URI__), -10)); + +$errors = array(); + +$id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); +$iso = strtolower(Language::getIsoById((int)$id_lang)); +include(_PS_TRANSLATIONS_DIR_.$iso.'/admin.php'); + +if (isset($_POST['Submit'])) +{ + $errors = array(); + if (empty($_POST['email'])) + $errors[] = Tools::displayError('E-mail is empty'); + elseif (!Validate::isEmail($_POST['email'])) + $errors[] = Tools::displayError('Invalid e-mail address'); + else + { + $employee = new Employee(); + if (!$employee->getByemail($_POST['email']) OR !$employee) + $errors[] = Tools::displayError('This account does not exist'); + else + { + if ((strtotime($employee->last_passwd_gen.'+'.Configuration::get('PS_PASSWD_TIME_BACK').' minutes') - time()) > 0 ) + $errors[] = Tools::displayError('You can regenerate your password only every').' '.Configuration::get('PS_PASSWD_TIME_BACK').' '.Tools::displayError('minute(s)'); + else + { + $pwd = Tools::passwdGen(); + $employee->passwd = md5(pSQL(_COOKIE_KEY_.$pwd)); + $employee->last_passwd_gen = date('Y-m-d H:i:s', time()); + $result = $employee->update(); + if (!$result) + $errors[] = Tools::displayError('An error occurred during your password change.'); + else + { + Mail::Send((int)$id_lang, 'password', Mail::l('Your new admin password'), array('{email}' => $employee->email, '{lastname}' => $employee->lastname, '{firstname}' => $employee->firstname, '{passwd}' => $pwd), $employee->email, $employee->firstname.' '.$employee->lastname); + $confirmation = 'ok'; + } + } + } + } +} + +echo ' + + + + + + PrestaShop™ - '.translate('Administration panel').' + +
'; + +if (sizeof($errors)) +{ + echo '
+

'.translate('There is 1 error').'

+
    '; + foreach ($errors AS $error) + echo '
  1. '.$error.'
  2. '; + echo '
+
'; +} + +echo ' +
+

'.Configuration::get('PS_SHOP_NAME').'

+ +
'.translate('Forgot your password?').'

'; +if (isset($confirmation)) + echo '
+
'.translate('Your password has been e-mailed to you').'.
+ '; +else + echo ' '.translate('Please, enter your e-mail address').' + '.translate('(the one you wrote during your registration) in order to receive your access codes by e-mail').'.
+ +
+
+
 
+
+ +
+

© Copyright by PrestaShop. all rights reserved.

+
'; \ No newline at end of file diff --git a/admin-dev/pdf.php b/admin-dev/pdf.php new file mode 100644 index 000000000..5e0ed25d4 --- /dev/null +++ b/admin-dev/pdf.php @@ -0,0 +1,114 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_ADMIN_DIR', getcwd()); + +include(PS_ADMIN_DIR.'/../config/config.inc.php'); + +/* Header can't be included, so cookie must be created here */ +$cookie = new Cookie('psAdmin'); +if (!$cookie->id_employee) + Tools::redirectAdmin('login.php'); + +$functionArray = array( + 'pdf' => 'generateInvoicePDF', + 'id_order_slip' => 'generateOrderSlipPDF', + 'id_delivery' => 'generateDeliverySlipPDF', + 'invoices' => 'generateInvoicesPDF', + 'invoices2' => 'generateInvoicesPDF2', + 'slips' => 'generateOrderSlipsPDF', + 'deliveryslips' => 'generateDeliverySlipsPDF' +); + +foreach ($functionArray as $var => $function) + if (isset($_GET[$var])) + { + call_user_func($function); + die; + } + +function generateInvoicePDF() +{ + if (!isset($_GET['id_order'])) + die (Tools::displayError('Missing order ID')); + $order = new Order((int)($_GET['id_order'])); + if (!Validate::isLoadedObject($order)) + die(Tools::displayError('Cannot find order in database')); + PDF::invoice($order); +} + +function generateOrderSlipPDF() +{ + $orderSlip = new OrderSlip((int)($_GET['id_order_slip'])); + $order = new Order((int)($orderSlip->id_order)); + if (!Validate::isLoadedObject($order)) + die(Tools::displayError('Cannot find order in database')); + $order->products = OrderSlip::getOrdersSlipProducts($orderSlip->id, $order); + $tmp = NULL; + PDF::invoice($order, 'D', false, $tmp, $orderSlip); +} + +function generateDeliverySlipPDF() +{ + $order = Order::getByDelivery((int)($_GET['id_delivery'])); + if (!Validate::isLoadedObject($order)) + die(Tools::displayError('Cannot find order in database')); + $tmp = NULL; + PDF::invoice($order, 'D', false, $tmp, false, $order->delivery_number); +} + +function generateInvoicesPDF() +{ + $orders = Order::getOrdersIdInvoiceByDate($_GET['date_from'], $_GET['date_to'], NULL, 'invoice'); + if (!is_array($orders)) + die (Tools::displayError('No invoices found')); + PDF::multipleInvoices($orders); +} + +function generateInvoicesPDF2() +{ + $allOrders = array(); + foreach (explode('-', Tools::getValue('id_order_state')) as $id_order_state) + if (is_array($orders = Order::getOrderIdsByStatus((int)$id_order_state))) + $allOrders = array_merge($allOrders, $orders); + PDF::multipleInvoices($allOrders); +} + +function generateOrderSlipsPDF() +{ + $orderSlips = OrderSlip::getSlipsIdByDate($_GET['date_from'], $_GET['date_to']); + if (!count($orderSlips)) + die (Tools::displayError('No order slips found')); + PDF::multipleOrderSlips($orderSlips); +} + +function generateDeliverySlipsPDF() +{ + $slips = unserialize(urldecode($_GET['deliveryslips'])); + if (is_array($slips)) + PDF::multipleDelivery($slips); +} diff --git a/admin-dev/searchcron.php b/admin-dev/searchcron.php new file mode 100644 index 000000000..6751becb6 --- /dev/null +++ b/admin-dev/searchcron.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../config/config.inc.php'); + +if (substr(_COOKIE_KEY_, 34, 8) != Tools::getValue('token')) + die; + +ini_set('max_execution_time', 7200); +Search::indexation(Tools::getValue('full')); +Tools::redirectAdmin($_SERVER['HTTP_REFERER'].'&conf=4'); + diff --git a/admin-dev/tabs/.htaccess b/admin-dev/tabs/.htaccess new file mode 100755 index 000000000..93169e4eb --- /dev/null +++ b/admin-dev/tabs/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/admin-dev/tabs/AdminAccess.php b/admin-dev/tabs/AdminAccess.php new file mode 100644 index 000000000..3d69914c0 --- /dev/null +++ b/admin-dev/tabs/AdminAccess.php @@ -0,0 +1,138 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminAccess extends AdminTab +{ + public function postProcess() + { + if (Tools::isSubmit('submitAddaccess') AND $action = Tools::getValue('action') AND $id_tab = (int)(Tools::getValue('id_tab')) AND $id_profile = (int)(Tools::getValue('id_profile')) AND $this->tabAccess['edit'] == 1) + { + if ($id_tab == -1 AND $action == 'all' AND (int)(Tools::getValue('perm')) == 0) + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'access` SET `view` = '.(int)(Tools::getValue('perm')).', `add` = '.(int)(Tools::getValue('perm')).', `edit` = '.(int)(Tools::getValue('perm')).', `delete` = '.(int)(Tools::getValue('perm')).' WHERE `id_profile` = '.(int)($id_profile).' AND `id_tab` != 31'); + elseif ($id_tab == -1 AND $action == 'all') + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'access` SET `view` = '.(int)(Tools::getValue('perm')).', `add` = '.(int)(Tools::getValue('perm')).', `edit` = '.(int)(Tools::getValue('perm')).', `delete` = '.(int)(Tools::getValue('perm')).' WHERE `id_profile` = '.(int)($id_profile)); + elseif ($id_tab == -1) + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'access` SET `'.pSQL($action).'` = '.(int)(Tools::getValue('perm')).' WHERE `id_profile` = '.(int)($id_profile)); + elseif ($action == 'all') + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'access` SET `view` = '.(int)(Tools::getValue('perm')).', `add` = '.(int)(Tools::getValue('perm')).', `edit` = '.(int)(Tools::getValue('perm')).', `delete` = '.(int)(Tools::getValue('perm')).' WHERE `id_tab` = '.(int)($id_tab).' AND `id_profile` = '.(int)($id_profile)); + else + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'access` SET `'.pSQL($action).'` = '.(int)(Tools::getValue('perm')).' WHERE `id_tab` = '.(int)($id_tab).' AND `id_profile` = '.(int)($id_profile)); + } + } + + public function display() + { + $this->displayForm(); + } + + /** + * Get the current profile id + * + * @return the $_GET['profile'] if valid, else 1 (the first profile id) + */ + function getCurrentProfileId() + { + return (isset($_GET['profile']) AND !empty($_GET['profile']) AND is_numeric($_GET['profile'])) ? (int)($_GET['profile']) : 1; + } + + public function displayForm($isMainTab = true) + { + global $cookie, $currentIndex; + parent::displayForm(); + + $currentProfile = (int)($this->getCurrentProfileId()); + $tabs = Tab::getTabs($cookie->id_lang); + $profiles = Profile::getProfiles((int)($cookie->id_lang)); + $accesses = Profile::getProfileAccesses((int)($currentProfile)); + + echo ' + +
+ + + '; + + if ($currentProfile != (int)(_PS_ADMIN_PROFILE_)) + echo ' + + + + + + '; + + if (!sizeof($tabs)) + echo ''; + elseif ($currentProfile == (int)(_PS_ADMIN_PROFILE_)) + echo ''; + else + foreach ($tabs AS $tab) + if (!$tab['id_parent'] OR (int)($tab['id_parent']) == -1) + { + $this->printTabAccess((int)($currentProfile), $tab, $accesses[$tab['id_tab']], false, $tabsize, sizeof($tabs)); + foreach ($tabs AS $child) + if ($child['id_parent'] === $tab['id_tab']) + $this->printTabAccess($currentProfile, $child, $accesses[$child['id_tab']], true, $tabsize, sizeof($tabs)); + } + echo '
+ + '.$this->l('View').'
'.$this->l('Add').'
'.$this->l('Edit').'
'.$this->l('Delete').'
'.$this->l('All').'
'.$this->l('No tab').'
'.$this->l('Administrator permissions can\'t be modified.').'
'; + } + + private function printTabAccess($currentProfile, $tab, $access, $is_child, $tabsize, $tabnumber) + { + $result_accesses = 0; + $perms = array('view', 'add', 'edit', 'delete'); + echo ''.($is_child ? ' » ' : '').$tab['name'].''; + foreach ($perms as $perm) + { + if($this->tabAccess['edit'] == 1) + echo ''; + else + echo ''; + $result_accesses += $access[$perm]; + } + echo ''; + + } +} + + diff --git a/admin-dev/tabs/AdminAddonsCatalog.php b/admin-dev/tabs/AdminAddonsCatalog.php new file mode 100644 index 000000000..c7863aa71 --- /dev/null +++ b/admin-dev/tabs/AdminAddonsCatalog.php @@ -0,0 +1,38 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminAddonsCatalog extends AdminTab +{ + public function display() + { + $parentDomain = Tools::getHttpHost(true).substr($_SERVER['REQUEST_URI'], 0, -1 * strlen(basename($_SERVER['REQUEST_URI']))); + echo ' +
 
'; + } +} + + diff --git a/admin-dev/tabs/AdminAddonsMyAccount.php b/admin-dev/tabs/AdminAddonsMyAccount.php new file mode 100644 index 000000000..e856cc670 --- /dev/null +++ b/admin-dev/tabs/AdminAddonsMyAccount.php @@ -0,0 +1,38 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminAddonsMyAccount extends AdminTab +{ + public function display() + { + $parentDomain = Tools::getHttpHost(true).substr($_SERVER['REQUEST_URI'], 0, -1 * strlen(basename($_SERVER['REQUEST_URI']))); + echo ' +
 
'; + } +} + + diff --git a/admin-dev/tabs/AdminAddresses.php b/admin-dev/tabs/AdminAddresses.php new file mode 100644 index 000000000..d75387d58 --- /dev/null +++ b/admin-dev/tabs/AdminAddresses.php @@ -0,0 +1,510 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7320 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); +if(Configuration::get('VATNUMBER_MANAGEMENT') AND file_exists(_PS_MODULE_DIR_.'vatnumber/vatnumber.php')) + include_once(_PS_MODULE_DIR_.'vatnumber/vatnumber.php'); + +class AdminAddresses extends AdminTab +{ + /** @var array countries list */ + private $countriesArray = array(); + + public function __construct() + { + global $cookie; + + $this->table = 'address'; + $this->className = 'Address'; + $this->lang = false; + $this->edit = true; + $this->delete = true; + $this->requiredDatabase = true; + $this->addressType = 'customer'; + + if (!Tools::getValue('realedit')) + $this->deleted = true; + $this->_select = 'cl.`name` as country'; + $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON + (cl.`id_country` = a.`id_country` AND cl.`id_lang` = '.(int)($cookie->id_lang).')'; + + $countries = Country::getCountries((int)($cookie->id_lang)); + foreach ($countries AS $country) + $this->countriesArray[$country['id_country']] = $country['name']; + + $this->fieldsDisplay = array( + 'id_address' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'firstname' => array('title' => $this->l('First name'), 'width' => 80, 'filter_key' => 'a!firstname'), + 'lastname' => array('title' => $this->l('Last name'), 'width' => 100, 'filter_key' => 'a!lastname'), + 'address1' => array('title' => $this->l('Address'), 'width' => 200), + 'postcode' => array('title' => $this->l('Postcode/ Zip Code'), 'align' => 'right', 'width' => 50), + 'city' => array('title' => $this->l('City'), 'width' => 150), + 'country' => array('title' => $this->l('Country'), 'width' => 100, 'type' => 'select', 'select' => $this->countriesArray, 'filter_key' => 'cl!id_country')); + + parent::__construct(); + } + + public function postProcess() + { + if (isset($_POST['submitAdd'.$this->table])) + { + // Transform e-mail in id_customer for parent processing + if ($this->addressType == 'customer') + { + if (Validate::isEmail(Tools::getValue('email'))) + { + $customer = new Customer; + $customer = $customer->getByemail(Tools::getValue('email')); + if (Validate::isLoadedObject($customer)) + $_POST['id_customer'] = $customer->id; + else + $this->_errors[] = Tools::displayError('This e-mail address is not registered.'); + } + elseif ($id_customer = Tools::getValue('id_customer')) + { + $customer = new Customer((int)($id_customer)); + if (Validate::isLoadedObject($customer)) + $_POST['id_customer'] = $customer->id; + else + $this->_errors[] = Tools::displayError('Unknown customer'); + } + else + $this->_errors[] = Tools::displayError('Unknown customer'); + if (Country::isNeedDniByCountryId(Tools::getValue('id_country')) AND !Tools::getValue('dni')) + $this->_errors[] = Tools::displayError('Identification number is incorrect or has already been used.'); + } + + // Check manufacturer selected + if ($this->addressType == 'manufacturer') + { + $manufacturer = new Manufacturer((int)(Tools::getValue('id_manufacturer'))); + if (!Validate::isLoadedObject($manufacturer)) + $this->_errors[] = Tools::displayError('Manufacturer selected is not valid.'); + } + + /* If the selected country does not contain states */ + $id_state = (int)(Tools::getValue('id_state')); + if ($id_country = Tools::getValue('id_country') AND $country = new Country((int)($id_country)) AND !(int)($country->contains_states) AND $id_state) + $this->_errors[] = Tools::displayError('You have selected a state for a country that does not contain states.'); + + /* If the selected country contains states, then a state have to be selected */ + if ((int)($country->contains_states) AND !$id_state) + $this->_errors[] = Tools::displayError('An address located in a country containing states must have a state selected.'); + + /* Check zip code */ + if ($country->need_zip_code) + { + $zip_code_format = $country->zip_code_format; + if (($postcode = Tools::getValue('postcode')) AND $zip_code_format) + { + $zip_regexp = '/^'.$zip_code_format.'$/ui'; + $zip_regexp = str_replace(' ', '( |)', $zip_regexp); + $zip_regexp = str_replace('-', '(-|)', $zip_regexp); + $zip_regexp = str_replace('N', '[0-9]', $zip_regexp); + $zip_regexp = str_replace('L', '[a-zA-Z]', $zip_regexp); + $zip_regexp = str_replace('C', $country->iso_code, $zip_regexp); + if (!preg_match($zip_regexp, $postcode)) + $this->_errors[] = Tools::displayError('Your zip/postal code is incorrect.').'
'.Tools::displayError('Must be typed as follows:').' '.str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $zip_code_format))); + } + elseif ($zip_code_format) + $this->_errors[] = Tools::displayError('Postcode required.'); + elseif ($postcode AND !preg_match('/^[0-9a-zA-Z -]{4,9}$/ui', $postcode)) + $this->_errors[] = Tools::displayError('Your zip/postal code is incorrect.'); + } + + + /* If this address come from order's edition and is the same as the other one (invoice or delivery one) + ** we delete its id_address to force the creation of a new one */ + if ((int)(Tools::getValue('id_order'))) + { + $this->_redirect = false; + if (isset($_POST['address_type'])) + $_POST['id_address'] = ''; + } + } + if (!sizeof($this->_errors)) + parent::postProcess(); + + /* Reassignation of the order's new (invoice or delivery) address */ + $address_type = ((int)(Tools::getValue('address_type')) == 2 ? 'invoice' : ((int)(Tools::getValue('address_type')) == 1 ? 'delivery' : '')); + if (isset($_POST['submitAdd'.$this->table]) AND ($id_order = (int)(Tools::getValue('id_order'))) AND !sizeof($this->_errors) AND !empty($address_type)) + { + if(!Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'orders SET `id_address_'.$address_type.'` = '.Db::getInstance()->Insert_ID().' WHERE `id_order` = '.$id_order)) + $this->_errors[] = Tools::displayError('An error occurred while linking this address to its order.'); + else + Tools::redirectAdmin(Tools::getValue('back').'&conf=4'); + } + } + + public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL, $id_lang_shop = NULL) + { + parent::getList($id_lang, $orderBy, $orderWay, $start, $limit); + + global $cookie; + + /* Manage default params values */ + if (empty($limit)) + $limit = ((!isset($cookie->{$this->table.'_pagination'})) ? $this->_pagination[0] : $limit = $cookie->{$this->table.'_pagination'}); + + if (!Validate::isTableOrIdentifier($this->table)) + die('filter is corrupted'); + if (empty($orderBy)) + $orderBy = Tools::getValue($this->table.'Orderby', 'id_'.$this->table); + if (empty($orderWay)) + $orderWay = Tools::getValue($this->table.'Orderway', 'ASC'); + $limit = (int)(Tools::getValue('pagination', $limit)); + $cookie->{$this->table.'_pagination'} = $limit; + + /* Check params validity */ + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay) + OR !is_numeric($start) OR !is_numeric($limit) + OR !Validate::isUnsignedId($id_lang)) + die(Tools::displayError('get list params is not valid')); + + /* Determine offset from current page */ + if ((isset($_POST['submitFilter'.$this->table]) OR + isset($_POST['submitFilter'.$this->table.'_x']) OR + isset($_POST['submitFilter'.$this->table.'_y'])) AND + !empty($_POST['submitFilter'.$this->table]) AND + is_numeric($_POST['submitFilter'.$this->table])) + $start = (int)($_POST['submitFilter'.$this->table] - 1) * $limit; + + /* Cache */ + $this->_lang = (int)($id_lang); + $this->_orderBy = $orderBy; + $this->_orderWay = Tools::strtoupper($orderWay); + + /* SQL table : orders, but class name is Order */ + $sqlTable = $this->table == 'order' ? 'orders' : $this->table; + + /* Query in order to get results number */ + $queryTotal = Db::getInstance()->getRow(' + SELECT COUNT(a.`id_'.$this->table.'`) AS total + FROM `'._DB_PREFIX_.$sqlTable.'` a + '.($this->lang ? 'LEFT JOIN `'._DB_PREFIX_.$this->table.'_lang` b ON (b.`id_'.$this->table.'` = a.`id_'.$this->table.'` AND b.`id_lang` = '.(int)($id_lang).')' : '').' + '.(isset($this->_join) ? $this->_join.' ' : '').' + WHERE 1 '.(isset($this->_where) ? $this->_where.' ' : '').(($this->deleted OR $this->table == 'currency') ? 'AND a.`deleted` = 0 ' : '').$this->_filter.' + '.(isset($this->_group) ? $this->_group.' ' : '').' + '.(isset($this->addressType) ? 'AND a.id_'.strval($this->addressType).' != 0' : '')); + $this->_listTotal = (int)($queryTotal['total']); + + /* Query in order to get results with all fields */ + $this->_list = Db::getInstance()->ExecuteS(' + SELECT a.*'.($this->lang ? ', b.*' : '').(isset($this->_select) ? ', '.$this->_select.' ' : '').' + FROM `'._DB_PREFIX_.$sqlTable.'` a + '.($this->lang ? 'LEFT JOIN `'._DB_PREFIX_.$this->table.'_lang` b ON (b.`id_'.$this->table.'` = a.`id_'.$this->table.'` AND b.`id_lang` = '.(int)($id_lang).')' : '').' + '.(isset($this->_join) ? $this->_join.' ' : '').' + WHERE 1 '.(isset($this->_where) ? $this->_where.' ' : '').(($this->deleted OR $this->table == 'currency') ? 'AND a.`deleted` = 0 ' : '').$this->_filter.' + '.(isset($this->_group) ? $this->_group.' ' : '').' + '.(isset($this->addressType) ? 'AND a.id_'.strval($this->addressType).' != 0' : '').' + ORDER BY '.(($orderBy == 'id_'.$this->table) ? 'a.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' + LIMIT '.(int)($start).','.(int)($limit)); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.((int)($obj->id) ? '' : '').' + '.(($id_order = (int)(Tools::getValue('id_order'))) ? '' : '').' + '.(($address_type = (int)(Tools::getValue('address_type'))) ? '' : '').' + '.(Tools::getValue('realedit') ? '' : '').' +
+ '.$this->l('Addresses').''; + switch ($this->addressType) + { + case 'manufacturer': + echo ' +
'; + $manufacturers = Manufacturer::getManufacturers(); + echo ''; + echo '
'; + echo ''; + break; + case 'customer': + default: + if ($obj->id) + { + $customer = new Customer($obj->id_customer); + $tokenCustomer = Tools::getAdminToken('AdminCustomers'.(int)(Tab::getIdFromClassName('AdminCustomers')).(int)($cookie->id_employee)); + echo ' + + + + '; + } + else + { + echo + ' +
+ * +
'; + } + echo ' + +
+ +

'.$this->l('DNI / NIF / NIE').'

+
'; + + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + break; + } + + $addresses_fields = $this->processAddressFormat(); + $addresses_fields = $addresses_fields["dlv_all_fields"]; // we use delivery address + + + + foreach($addresses_fields as $addr_field_item) + { + if ($addr_field_item == 'company') + { + if ($this->addressType != 'manufacturer') + { + echo ' +
+ + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + + if ((Configuration::get('VATNUMBER_MANAGEMENT') AND file_exists(_PS_MODULE_DIR_.'vatnumber/vatnumber.php')) && VatNumber::isApplicable(Configuration::get('PS_COUNTRY_DEFAULT'))) + echo '
'; + else if(Configuration::get('VATNUMBER_MANAGEMENT')) + echo '
'; + else + echo'
'; + + echo ' +
+ +
+
'; + } + } + elseif ($addr_field_item == 'lastname') + { + echo ' + +
+ * + '.$this->l('Invalid characters:').' 0-9!<>,;?=+()@#"�{}_$%:  +
'; + } + elseif ($addr_field_item == 'firstname') + { + + echo ' + +
+ * + '.$this->l('Invalid characters:').' 0-9!<>,;?=+()@#"�{}_$%:  +
'; + } + elseif ($addr_field_item == 'address1') + { + + echo ' + +
+ * +
'; + } + elseif ($addr_field_item == 'address2') + { + + echo ' + +
+ +
'; + } + elseif ($addr_field_item == 'postcode') + { + + echo ' + +
+ +
'; + } + elseif ($addr_field_item == 'city') + { + + echo ' + +
+ * +
'; + } + elseif ($addr_field_item == 'country' || $addr_field_item == 'Country:name') + { + + echo ' + +
+ * +
'; + + + echo ' +
+ +
+ + * +
+
'; + + + $id_country_ajax = (int)$this->getFieldValue($obj, 'id_country'); + + echo ' + '; + } + + } // End foreach + echo ' + +
+ +
'; + + echo ' + +
+ +
'; + + + echo ' + +
+ + '.$this->l('Forbidden characters:').' <>;=#{}  +
'; + + echo ' +
+ +
+
* '.$this->l('Required field').'
+
'; + echo ' +
'; + } + + protected function processAddressFormat() + { + $tmp_addr = new Address((int)Tools::getValue("id_address")); + + $selectedCountry = ($tmp_addr && $tmp_addr->id_country) ? $tmp_addr->id_country : + (int)(Configuration::get('PS_COUNTRY_DEFAULT')); + + $inv_adr_fields = AddressFormat::getOrderedAddressFields($selectedCountry); + $dlv_adr_fields = AddressFormat::getOrderedAddressFields($selectedCountry); + + $inv_all_fields = array(); + $dlv_all_fields = array(); + + $out = array(); + + foreach (array('inv','dlv') as $adr_type) + { + foreach (${$adr_type.'_adr_fields'} as $fields_line) + foreach(explode(' ',$fields_line) as $field_item) + ${$adr_type.'_all_fields'}[] = trim($field_item); + + + $out[$adr_type.'_adr_fields'] = ${$adr_type.'_adr_fields'}; + $out[$adr_type.'_all_fields'] = ${$adr_type.'_all_fields'}; + } + + return $out; + } +} + + diff --git a/admin-dev/tabs/AdminAliases.php b/admin-dev/tabs/AdminAliases.php new file mode 100644 index 000000000..0efa6df58 --- /dev/null +++ b/admin-dev/tabs/AdminAliases.php @@ -0,0 +1,106 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminAliases extends AdminTab +{ + function __construct() + { + $this->table = 'alias'; + $this->className = 'Alias'; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'alias' => array('title' => $this->l('Aliases'), 'width' => 160), + 'search' => array('title' => $this->l('Search'), 'width' => 40), + 'active' => array('title' => $this->l('Status'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false) + ); + parent::__construct(); + } + + public function postProcess() + { + if (isset($_POST['submitAdd'.$this->table])) + { + $search = strval(Tools::getValue('search')); + $string = strval(Tools::getValue('alias')); + $aliases = explode(',', $string); + if (empty($search) OR empty($string)) + $this->_errors[] = $this->l('aliases and result are both required'); + if (!Validate::isValidSearch($search)) + $this->_errors[] = $search.' '.$this->l('is not a valid result'); + foreach ($aliases AS $alias) + if (!Validate::isValidSearch($alias)) + $this->_errors[] = $alias.' '.$this->l('is not a valid alias'); + + if (!sizeof($this->_errors)) + { + Alias::deleteAliases($search); + foreach ($aliases AS $alias) + { + $obj = new Alias(NULL, trim($alias), trim($search)); + $obj->save(); + } + } + } + else + parent::postProcess(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Aliases').' + +
+ * +

'.$this->l('Enter each alias separated by a comma (\',\')').' '.$this->l('(e.g., \'prestshop,preztashop,prestasohp\')').'
+ '.$this->l('Forbidden characters:').' <>;=#{}

+
+ +
+ * +

'.$this->l('Search this word instead.').'

+
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} + + diff --git a/admin-dev/tabs/AdminAppearance.php b/admin-dev/tabs/AdminAppearance.php new file mode 100644 index 000000000..2afa2a908 --- /dev/null +++ b/admin-dev/tabs/AdminAppearance.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/AdminThemes.php'); + +class AdminAppearance extends AdminThemes // extends AdminThemes only for retro-compatibility +{ + public function display() + { + Tools::redirectAdmin('index.php?tab=AdminThemes&token='.Tools::getAdminTokenLite('AdminThemes')); + } +} \ No newline at end of file diff --git a/admin-dev/tabs/AdminAttachments.php b/admin-dev/tabs/AdminAttachments.php new file mode 100644 index 000000000..8b6ebecb5 --- /dev/null +++ b/admin-dev/tabs/AdminAttachments.php @@ -0,0 +1,134 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminAttachments extends AdminTab +{ + public function __construct() + { + global $cookie; + + $this->table = 'attachment'; + $this->className = 'Attachment'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'id_attachment' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Name')), + 'file' => array('title' => $this->l('File'))); + + parent::__construct(); + } + + public function postProcess() + { + if (Tools::isSubmit('submitAdd'.$this->table)) + { + if ($id = (int)(Tools::getValue('id_attachment')) AND $a = new Attachment($id)) + { + $_POST['file'] = $a->file; + $_POST['mime'] = $a->mime; + } + if (!sizeof($this->_errors)) + { + if (isset($_FILES['file']) AND is_uploaded_file($_FILES['file']['tmp_name'])) + { + if ($_FILES['file']['size'] > (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024 * 1024)) + $this->_errors[] = $this->l('File too large, maximum size allowed:').' '.(Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024).' '.$this->l('kb').'. '.$this->l('File size you\'re trying to upload is:').number_format(($_FILES['file']['size']/1024), 2, '.', '').$this->l('kb'); + else + { + do $uniqid = sha1(microtime()); while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid)); + if (!copy($_FILES['file']['tmp_name'], _PS_DOWNLOAD_DIR_.$uniqid)) + $this->_errors[] = $this->l('File copy failed'); + $_POST['file_name'] = $_FILES['file']['name']; + @unlink($_FILES['file']['tmp_name']); + $_POST['file'] = $uniqid; + $_POST['mime'] = $_FILES['file']['type']; + } + } + else if (array_key_exists('file', $_FILES) && (int)$_FILES['file']['error'] === 1) + { + $max_upload = (int)(ini_get('upload_max_filesize')); + $max_post = (int)(ini_get('post_max_size')); + $upload_mb = min($max_upload, $max_post); + $this->_errors[] = $this->l('the File').' '.$_FILES['file']['name'].' '.$this->l('exceeds the size allowed by the server. This limit is set to').' '.$upload_mb.$this->l('Mb').''; + } + else if (!empty($_FILES['file']['tmp_name'])) + $this->_errors[] = $this->l('No file or your file isn\'t uploadable, check your server configuration about the upload maximum size.'); + } + $this->validateRules(); + } + return parent::postProcess(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Attachment').' + +
'; + foreach ($this->_languages as $language) + echo '
+ * +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'cname¤cdescription', 'cname'); + echo '
+
 
+ +
'; + foreach ($this->_languages as $language) + echo '
+ +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'cname¤cdescription', 'cdescription'); + echo '
+
 
+ +
+

+

'.$this->l('Upload file from your computer').'

+
+
 
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} diff --git a/admin-dev/tabs/AdminAttributeGenerator.php b/admin-dev/tabs/AdminAttributeGenerator.php new file mode 100644 index 000000000..6e849a61e --- /dev/null +++ b/admin-dev/tabs/AdminAttributeGenerator.php @@ -0,0 +1,321 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +@ini_set('max_execution_time', 3600); +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminAttributeGenerator extends AdminTab +{ + private $combinations = array(); + private $product; + + private function addAttribute($arr, $price = 0, $weight = 0) + { + foreach ($arr AS $attr) + { + $price += (float)($_POST['price_impact_'.(int)($attr)]); + $weight += (float)($_POST['weight_impact'][(int)($attr)]); + } + if ($this->product->id) + { + return (array( + 'id_product' => (int)($this->product->id), + 'price' => (float)($price), + 'weight' => (float)($weight), + 'ecotax' => 0, + 'quantity' => (int)($_POST['quantity']), + 'reference' => pSQL($_POST['reference']), + 'default_on' => 0)); + } + return array(); + } + + static private function createCombinations($list) + { + if (sizeof($list) <= 1) + return sizeof($list) ? array_map(create_function('$v', 'return (array($v));'), $list[0]) : $list; + $res = array(); + $first = array_pop($list); + foreach ($first AS $attribute) + { + $tab = self::createCombinations($list); + foreach ($tab AS $toAdd) + $res[] = is_array($toAdd) ? array_merge($toAdd, array($attribute)) : array($toAdd, $attribute); + } + return $res; + } + + public function postProcess() + { + global $currentIndex; + + $this->product = new Product((int)(Tools::getValue('id_product'))); + + if (isset($_POST['generate'])) + { + if (!is_array(Tools::getValue('options'))) + $this->_errors[] = Tools::displayError('Please choose at least 1 attribute.'); + else + { + $tab = array_values($_POST['options']); + if (sizeof($tab) AND Validate::isLoadedObject($this->product)) + { + self::setAttributesImpacts($this->product->id, $tab); + $this->combinations = array_values(self::createCombinations($tab)); + $values = array_values(array_map(array($this, 'addAttribute'), $this->combinations)); + $this->product->deleteProductAttributes(); + $res = $this->product->addProductAttributeMultiple($values); + $this->product->addAttributeCombinationMultiple($res, $this->combinations); + $this->product->updateQuantityProductWithAttributeQuantity(); + } + else + $this->_errors[] = Tools::displayError('Unable to initialize parameters, combination is missing or object cannot be loaded.'); + } + } + elseif (isset($_POST['back'])) + Tools::redirectAdmin($currentIndex.'&id_product='.(int)(Tools::getValue('id_product')).'&id_category='.(int)(Tools::getValue('id_category')).'&addproduct'.'&tabs=3&token='.Tools::getValue('token')); + parent::postProcess(); + } + + static private function displayAndReturnAttributeJs() + { + global $cookie; + + $attributes = Attribute::getAttributes((int)($cookie->id_lang), true); + $attributeJs = array(); + foreach ($attributes AS $k => $attribute) + $attributeJs[$attribute['id_attribute_group']][$attribute['id_attribute']] = $attribute['name']; + echo ' + '; + return $attributeJs; + } + + private function displayGroupSelect($attributeJs, $attributesGroups) + { + echo '
+ +
'; + } + + static private function setAttributesImpacts($id_product, $tab) + { + $attributes = array(); + foreach ($tab AS $group) + foreach ($group AS $attribute) + $attributes[] = '('.(int)($id_product).', '.(int)($attribute).', '.(float)($_POST['price_impact_'.(int)($attribute)]).', '.(float)($_POST['weight_impact'][(int)($attribute)]).')'; + return Db::getInstance()->Execute( + 'INSERT INTO `'._DB_PREFIX_.'attribute_impact` (`id_product`, `id_attribute`, `price`, `weight`) + VALUES '.implode(',', $attributes).' + ON DUPLICATE KEY UPDATE `price`=VALUES(price), `weight`=VALUES(weight)' + ); + } + + static private function getAttributesImpacts($id_product) + { + $tab = array(); + $result = Db::getInstance()->ExecuteS( + 'SELECT ai.`id_attribute`, ai.`price`, ai.`weight` + FROM `'._DB_PREFIX_.'attribute_impact` ai + WHERE ai.`id_product` = '.(int)($id_product)); + if (!$result) + return array(); + foreach ($result AS $impact) + { + $tab[$impact['id_attribute']]['price'] = (float)($impact['price']); + $tab[$impact['id_attribute']]['weight'] = (float)($impact['weight']); + } + return $tab; + } + + private function displayGroupeTable($attributeJs, $attributesGroups) + { + global $cookie; + + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $combinationsGroups = $this->product->getAttributesGroups((int)($cookie->id_lang)); + $attributes = array(); + $impacts = self::getAttributesImpacts($this->product->id); + foreach ($combinationsGroups AS &$combination) + { + $target = &$attributes[$combination['id_attribute_group']][$combination['id_attribute']]; + $target = $combination; + if (isset($impacts[$combination['id_attribute']])) + { + $target['price'] = $impacts[$combination['id_attribute']]['price']; + $target['weight'] = $impacts[$combination['id_attribute']]['weight']; + } + } + + foreach ($attributesGroups AS $k => $attributeGroup) + { + $idGroup = $attributeGroup['id_attribute_group']; + if (isset($attributeJs[$idGroup])) + { + echo ' +
+ + + + + + + + + + + '; + if (isset($attributes[$idGroup])) + foreach ($attributes[$idGroup] AS $k => $attribute) + echo ''; + } + } + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + $jsAttributes = self::displayAndReturnAttributeJs(); + $attributesGroups = AttributeGroup::getAttributesGroups((int)($cookie->id_lang)); + $this->product = new Product((int)(Tools::getValue('id_product'))); + + // JS Init + echo + ''; + + + + if (isset($_POST['generate']) AND !sizeof($this->_errors)) + echo ' +
+ + '.sizeof($this->combinations).' '.$this->l('product(s) successfully created.').' +
'; + echo ' + +
+
'.$this->l('Attributes generator').''. + $this->l('Add or modify attributes for product:').' '.$this->product->name[$cookie->id_lang].' +

+ '; + echo ' +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+
'; + self::displayGroupeTable($jsAttributes, $attributesGroups); + echo ' +
+
+
+ '; + self::displayGroupSelect($jsAttributes, $attributesGroups); + echo ' +
+

+ +
+ +

+
+
+
+
+
'; + } +} + diff --git a/admin-dev/tabs/AdminAttributes.php b/admin-dev/tabs/AdminAttributes.php new file mode 100644 index 000000000..ee78eceb9 --- /dev/null +++ b/admin-dev/tabs/AdminAttributes.php @@ -0,0 +1,161 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminAttributes extends AdminTab +{ + public function __construct() + { + $this->table = 'attribute'; + $this->className = 'Attribute'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + $this->shopLinkType = 'group_shop'; + $this->fieldImageSettings = array('name' => 'texture', 'dir' => 'co'); + + parent::__construct(); + } + + /** + * Display form + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayForm($token = NULL) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + $color = ($obj->color ? $obj->color : 0); + $attributes_groups = AttributeGroup::getAttributesGroups($this->_defaultFormLanguage); + $strAttributesGroups = ''; + echo ' + +
+ '.($obj->id ? '' : '').' +
'.$this->l('Attribute').' + +
'; + foreach ($this->_languages as $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name', 'name'); + echo ' +
+
+ +
+ * +
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoGroupShop(); + echo '
'; + } + echo ' + +
+ +
+ * +

'.$this->l('HTML colors only (e.g.,').' "lightblue", "#CC6600")

+
+ +
+ +

'.$this->l('Upload color texture from your computer').'
'.$this->l('This will override the HTML color!').'

+
+ +
+

'.(file_exists(_PS_IMG_DIR_.$this->fieldImageSettings['dir'].'/'.$obj->id.'.jpg') + ? ' '.$this->l('delete').'' + : $this->l('None') + ).'

+
+
+
+ +
+
* '.$this->l('Required field').'
+
+
+ '; + } + + /** + * Manage page processing + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function postProcess($token = NULL) + { + global $currentIndex; + if (Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.$_POST['groupid'].'Box'])) + { + $object = new $this->className(); + if ($object->deleteSelection($_POST[$this->table.$_POST['groupid'].'Box'])) + Tools::redirectAdmin($currentIndex.'&conf=2'.'&token='.($token ? $token : $this->token)); + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + else + parent::postProcess(); + } + + +} + + diff --git a/admin-dev/tabs/AdminAttributesGroups.php b/admin-dev/tabs/AdminAttributesGroups.php new file mode 100644 index 000000000..3d83901bb --- /dev/null +++ b/admin-dev/tabs/AdminAttributesGroups.php @@ -0,0 +1,236 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); +include_once(PS_ADMIN_DIR.'/tabs/AdminAttributes.php'); + +class AdminAttributesGroups extends AdminTab +{ + /** @var object AdminAttributes() instance */ + private $adminAttributes; + + public function __construct() + { + $this->adminAttributes = new AdminAttributes(); + $this->table = 'attribute_group'; + $this->className = 'AttributeGroup'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'name' => array('title' => $this->l('Name'), 'width' => 140, 'filter_key' => 'b!name'), + 'attribute' => array('title' => $this->l('Attributes'), 'width' => 240, 'orderby' => false, 'search' => false)); + $this->shopLinkType = 'group_shop'; + parent::__construct(); + } + + public function display() + { + global $currentIndex; + + if ((isset($_POST['submitAddattribute']) AND sizeof($this->adminAttributes->_errors)) + OR isset($_GET['updateattribute']) OR isset($_GET['addattribute'])) + { + $this->adminAttributes->displayForm($this->token); + echo '

'.$this->l('Back to list').'
'; + } + else + { + parent::display(); + $this->displayAssoGroupShop(); + } + } + + public function postProcess() + { + global $cookie, $currentIndex; + + $this->adminAttributes->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id); + $this->adminAttributes->postProcess($this->token); + + if(Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.'Box'])) + { + $object = new $this->className(); + if ($object->deleteSelection($_POST[$this->table.'Box'])) + Tools::redirectAdmin($currentIndex.'&conf=2'.'&token='.$this->token); + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + else + parent::postProcess(); + } + + public function displayErrors() + { + $this->adminAttributes->displayErrors(); + parent::displayErrors(); + } + + /* Report to AdminTab::displayList() for more details */ + public function displayList() + { + global $currentIndex, $cookie; + + echo '
'.$this->l('Add attributes group').'
+ '.$this->l('Add attribute').'

+ '.$this->l('Click on the group name to view its attributes. Click again to hide them.').'

'; + if ($this->_list === false) + Tools::displayError('No elements found'); + + $this->displayListHeader(); + echo ''; + + if (!sizeof($this->_list)) + echo ''.$this->l('No elements found').''; + + $irow = 0; + foreach ($this->_list AS $tr) + { + $id = (int)($tr['id_'.$this->table]); + echo ' + + + '.$tr['name'].' + + + '; + + echo ' + + + '.$this->l('Edit').'  + + '.$this->l('Delete').' + + '; + } + + $this->displayListFooter(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Attributes group').' + +
'; + foreach ($this->_languages as $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name¤public_name', 'name'); + echo ' +
+
+ +
'; + foreach ($this->_languages as $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +

'.$this->l('Term or phrase displayed to the customer').'

+
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name¤public_name', 'public_name'); + echo ' +
+
+ +
+ getFieldValue($obj, 'is_color_group') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'is_color_group') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This is a color group').'

+
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoGroupShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} + + diff --git a/admin-dev/tabs/AdminBackup.php b/admin-dev/tabs/AdminBackup.php new file mode 100644 index 000000000..a684e4174 --- /dev/null +++ b/admin-dev/tabs/AdminBackup.php @@ -0,0 +1,307 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7320 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminBackup extends AdminTab +{ + /** @var string The field we are sorting on */ + protected $_sortBy = 'date'; + + public function __construct() + { + $this->table = 'backup'; + $this->className = 'Backup'; + parent::__construct(); + + $this->edit = false; + $this->delete = true; + $this->view = true; + + $this->deleted = false; + + $this->requiredDatabase = false; + + $this->fieldsDisplay = array ( + 'date' => array('title' => $this->l('Date'), 'type' => 'datetime', 'width' => 120, 'align' => 'right'), + 'age' => array('title' => $this->l('Age')), + 'filename' => array('title' => $this->l('File name'), 'width' => 200), + 'filesize' => array('title' => $this->l('File size'))); + $this->optionTitle = $this->l('Backup options'); + $this->_fieldsOptions = array( + 'PS_BACKUP_ALL' => array('title' => $this->l('Ignore statistics tables:'), + 'desc' => $this->l('The following tables will NOT be backed up if you enable this option:').'
'._DB_PREFIX_.'connections, '._DB_PREFIX_.'connections_page, '._DB_PREFIX_.'connections_source, '._DB_PREFIX_.'guest, '._DB_PREFIX_.'statssearch', 'cast' => 'intval', 'type' => 'bool'), + 'PS_BACKUP_DROP_TABLE' => array('title' => $this->l('Drop existing tables during import:'), + 'desc' => $this->l('Select this option to instruct the backup file to drop your tables prior to restoring the backed up data').'
(ie. "DROP TABLE IF EXISTS")', 'cast' => 'intval', 'type' => 'bool')); + + $this->identifier = 'filename'; + } + + /** + * Load class object using identifier in $_GET (if possible) + * otherwise return an empty object + * This method overrides the one in AdminTab because AdminTab assumes the id is a UnsignedInt + * "Backups" Directory in admin directory must be writeable (CHMOD 777) + * @param boolean $opt Return an empty object if load fail + * @return object + */ + protected function loadObject($opt = false) + { + if ($id = Tools::getValue($this->identifier)) + return new $this->className($id); + return new $this->className(); + } + + /** + * Creates a new backup, and then displays the normal menu + */ + public function displayForm($isMainTab = true) + { + if(is_writable(PS_ADMIN_DIR.'/backups/')) + { + if (!($object = $this->loadObject())) + return; + if ($object->add()) + { + echo '
 '.$this->l('It appears that the Backup was successful, however, you must download and carefully verify the Backup file.').'
'; + if ($this->tabAccess['view'] === '1') + echo ' +
+ '.$this->l('Download').' +

'.$this->l('Download the Backup file').' ('.number_format((filesize($object->id)*0.000001), 2, '.', '').$this->l('Mb').')

+ '.$this->l('Tip: You can also download this file by FTP, Backup files are located in "admin/backups" directory.').'

+
'; + + $this->displayHowTo(false); + } + elseif ($object->error) + $this->_errors[] = $object->error; + } + else + $this->_errors[] = $this->l('"Backups" Directory in admin directory must be writeable (CHMOD 755 / 777)'); + $this->displayErrors(); + } + + /** + * Displays the page which allows the backup to be downloaded + */ + public function viewbackup() + { + global $currentIndex; + + if (!($object = $this->loadObject())) + return; + if ($object->id) + { + $url = $object->getBackupURL(); + echo '
 '.$this->l('Beginning download ...').'
'; + echo '
'.$this->l('Back-up file should automatically download.'); + echo '

'.$this->l('If not,').' '.$this->l('please click here!').''; + echo ''; + echo '


'.$this->l('Back to list').'
'; + } + elseif ($object->error) + $this->_errors[] = $object->error; + $this->displayErrors(); + } + + public function displayHowTo($showForm = true) + { + global $currentIndex; + + echo ' +
+

'.$this->l('Disclaimer before creating a new Backup').'

+
    +
  1. '.$this->l('PrestaShop is not responsible for your database, Backups, restore and data.').'
  2. +
  3. '.$this->l('PrestaShop is an Open-source software, you are using it at your own risk under the licence agreement.').'
  4. +
  5. '.$this->l('You should Backup your data on a regular basis (both files and database).').'
  6. +
  7. '.$this->l('This function only backs up your database, not your files.').'
  8. +
  9. '.$this->l('By default, your existing database tables will be deleted during Backup restore (see options).').'
  10. +
  11. '.$this->l('Always verify the quality and integrity of your Backups files.').'
  12. +
  13. '.$this->l('Always verify that your Backups files are complete, up-to-date and valid. Even if you had a success message during the Backup process.').'
  14. +
  15. '.$this->l('Always check your data.').'
  16. +
  17. '.$this->l('Never restore a Backup on a live site.').'
  18. +
'; + + if ($showForm) + echo ' +
+ +
'; + + echo ' +
+
+

'.$this->l('How-to restore a database Backup in 10 easy steps').'

+
    +
  1. '.$this->l('Turn off the "Enable Shop" option in the "Preferences" tab.').'
  2. +
  3. '.$this->l('Download the Backup from the list below or from your FTP server (in the folder "admin/backups").').'
  4. +
  5. '.$this->l('Check the Backup integrity: look for errors, incomplete file. Verify all your data.').'
  6. +
  7. '.$this->l('Ask your hosting provider for a "phpMyAdmin" access to your database').'
  8. +
  9. '.$this->l('Connect to "phpMyAdmin" and select your current database').'
  10. +
  11. '.$this->l('Unless you enabled the "Drop existing tables" option, you must delete all tables from your current database.').'
  12. +
  13. '.$this->l('At the top of the screen select the tab "Import"').'
  14. +
  15. '.$this->l('Click on the "Browse..." button and select the Backup file from your hard drive').'
  16. +
  17. '.$this->l('Check the max. allowed filesize (ie. Max: 16Mb)').'
    '.$this->l('If your Backup file exceeds this limit, contact your hosting provider').'
  18. +
  19. '.$this->l('Click on the "Go" button and wait during the import, the process can take several minutes').'
  20. +
+
+
'; + } + + public function displayList() + { + global $currentIndex; + + // Test if the backup dir is writable + if(!is_writable(PS_ADMIN_DIR.'/backups/')) + $this->displayWarning($this->l('"Backups" Directory in admin directory must be writeable (CHMOD 755 / 777)')); + + $this->displayErrors(); + $this->displayHowTo(); + + parent::displayList(); + } + + public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL, $id_lang_shop = NULL) + { + global $cookie; + + if (!Validate::isTableOrIdentifier($this->table)) + die('filter is corrupted'); + if (empty($orderBy)) + $orderBy = Tools::getValue($this->table.'Orderby', $this->_defaultOrderBy); + if (empty($orderWay)) + $orderWay = Tools::getValue($this->table.'Orderway', 'ASC'); + + // Try and obtain getList arguments from $_GET + $orderBy = Tools::getValue($this->table.'Orderby'); + $orderWay = Tools::getValue($this->table.'Orderway'); + + // Validate the orderBy and orderWay fields + switch ($orderBy) + { + case 'filename': + case 'filesize': + case 'date': + case 'age': + break; + default: + $orderBy = 'date'; + } + switch ($orderWay) + { + case 'asc': + case 'desc': + break; + default: + $orderWay = 'desc'; + } + if (empty($limit)) + $limit = ((!isset($cookie->{$this->table.'_pagination'})) ? $this->_pagination[0] : $limit = $cookie->{$this->table.'_pagination'}); + $limit = (int)(Tools::getValue('pagination', $limit)); + $cookie->{$this->table.'_pagination'} = $limit; + + /* Determine offset from current page */ + if (!empty($_POST['submitFilter'.$this->table]) AND is_numeric($_POST['submitFilter'.$this->table])) + $start = (int)($_POST['submitFilter'.$this->table] - 1) * $limit; + $this->_lang = (int)($id_lang); + $this->_orderBy = $orderBy; + $this->_orderWay = strtoupper($orderWay); + $this->_list = array(); + + // Find all the backups + $dh = @opendir(PS_ADMIN_DIR.'/backups/'); + if ($dh === false) + { + $this->_errors[] = Tools::displayError('Unable to open backup directory .').addslashes(PS_ADMIN_DIR.'/backups/').'"'; + return; + } + while (($file = readdir($dh)) !== false) + { + if (preg_match('/^([\d]+-[a-z\d]+)\.sql(\.gz|\.bz2)?$/', $file, $matches) == 0) + continue; + $timestamp = (int)($matches[1]); + $date = date('Y-m-d h:i:s', $timestamp); + $age = time() - $timestamp; + if ($age < 3600) + $age = '< 1 '.$this->l('hour'); + else if ($age < 86400) + { + $age = floor($age / 3600); + $age = $age.' '.(($age == 1) ? $this->l('hour') : $this->l('hours')); + } + else + { + $age = floor($age / 86400); + $age = $age.' '.(($age == 1) ? $this->l('day') : $this->l('days')); + } + $size = filesize(PS_ADMIN_DIR.'/backups/'.$file); + $this->_list[] = array( + 'filename' => $file, + 'age' => $age, + 'date' => $date, + 'filesize' => number_format($size / 1000, 2).' Kb', + 'timestamp' => $timestamp, + 'filesize_sort' => $size, + ); + } + closedir($dh); + $this->_listTotal = count($this->_list); + + // Sort the _list based on the order requirements + switch ($this->_orderBy) + { + case 'filename': + $this->_sortBy = 'filename'; + $sorter = 'str_sort'; + break; + case 'filesize': + $this->_sortBy = 'filesize_sort'; + $sorter = 'int_sort'; + break; + case 'age': + case 'date': + $this->_sortBy = 'timestamp'; + $sorter = 'int_sort'; + break; + } + usort($this->_list, array($this, $sorter)); + $this->_list = array_slice($this->_list, $start, $limit); + } + + public function int_sort($a, $b) + { + return $this->_orderWay == 'ASC' ? $a[$this->_sortBy] - $b[$this->_sortBy] : $b[$this->_sortBy] - $a[$this->_sortBy]; + } + + public function str_sort($a, $b) + { + return $this->_orderWay == 'ASC' ? strcmp($a[ $this->_sortBy], $b[$this->_sortBy]) : strcmp($b[ $this->_sortBy], $a[$this->_sortBy]); + } +} diff --git a/admin-dev/tabs/AdminCMS.php b/admin-dev/tabs/AdminCMS.php new file mode 100644 index 000000000..540f90e35 --- /dev/null +++ b/admin-dev/tabs/AdminCMS.php @@ -0,0 +1,357 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7300 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminCMS extends AdminTab +{ + private $_category; + + public function __construct() + { + $this->table = 'cms'; + $this->className = 'CMS'; + $this->lang = true; + $this->edit = true; + $this->view = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'id_cms' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'link_rewrite' => array('title' => $this->l('URL'), 'width' => 200), + 'meta_title' => array('title' => $this->l('Title'), 'width' => 300), + 'position' => array('title' => $this->l('Position'), 'width' => 40,'filter_key' => 'position', 'align' => 'center', 'position' => 'position'), + 'active' => array('title' => $this->l('Enabled'), 'width' => 25, 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false) + ); + + $this->_category = AdminCMSContent::getCurrentCMSCategory(); + $this->_join = ' + LEFT JOIN `'._DB_PREFIX_.'cms_category` c ON (c.`id_cms_category` = a.`id_cms_category`)'; + $this->_select = 'a.position '; + $this->_filter = 'AND c.id_cms_category = '.(int)($this->_category->id); + + parent::__construct(); + } + + private function _displayDraftWarning($active) + { + return + '
+

+ + + '.$this->l('Your CMS page will be saved as a draft').' + + + +
+

+
'; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + $obj = $this->loadObject(true); + $iso = Language::getIsoById((int)($cookie->id_lang)); + $divLangName = 'meta_title¤meta_description¤meta_keywords¤ccontent¤link_rewrite'; + + echo ' +
+ '.($obj->id ? '' : '').' + '.$this->_displayDraftWarning($obj->active).' +
'.$this->l('CMS page').''; + + // META TITLE + echo ' +
+ +
+ +
'; + foreach ($this->_languages as $language) + echo '
+ * +
'; + + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, $divLangName, 'meta_title'); + echo '
 
'; + + // META DESCRIPTION + echo ' +
'; + foreach ($this->_languages as $language) + echo '
+ +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, $divLangName, 'meta_description'); + echo '
 
'; + + // META KEYWORDS + echo ' +
'; + foreach ($this->_languages as $language) + echo '
+ +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, $divLangName, 'meta_keywords'); + echo '
 
'; + + // LINK REWRITE + echo ' +
'; + foreach ($this->_languages as $language) + echo ' '; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, $divLangName, 'link_rewrite'); + echo '
 
'; + + // CONTENT + echo ' +
'; + foreach ($this->_languages as $language) + echo '
+ +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, $divLangName, 'ccontent'); + echo '
 
+ +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoShop(); + echo '
'; + } + // SUBMIT + echo '
+ +
+
* '.$this->l('Required field').'
+

+ '.$this->_displayDraftWarning($obj->active).' +
'; + // TinyMCE + global $cookie; + $iso = Language::getIsoById((int)($cookie->id_lang)); + $isoTinyMCE = (file_exists(_PS_ROOT_DIR_.'/js/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en'); + $ad = dirname($_SERVER["PHP_SELF"]); + echo ' + + + '; + } + + public function display($token = NULL) + { + global $currentIndex, $cookie; + + if (($id_cms_category = (int)Tools::getValue('id_cms_category'))) + $currentIndex .= '&id_cms_category='.$id_cms_category; + $this->getList((int)($cookie->id_lang), !$cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$cookie->__get($this->table.'Orderway') ? 'ASC' : NULL); + //$this->getList((int)($cookie->id_lang)); + if (!$id_cms_category) + $id_cms_category = 1; + echo '

'.(!$this->_listTotal ? ($this->l('No pages found')) : ($this->_listTotal.' '.($this->_listTotal > 1 ? $this->l('pages') : $this->l('page')))).' '. + $this->l('in category').' "'.stripslashes(CMSCategory::hideCMSCategoryPosition($this->_category->getName())).'"

'; + echo ' '.$this->l('Add a new page').' +
'; + $this->displayList($token); + echo '
'; + } + + public function displayList($token = NULL) + { + global $currentIndex; + + /* Display list header (filtering, pagination and column names) */ + $this->displayListHeader($token); + if (!sizeof($this->_list)) + echo ''.$this->l('No items found').''; + + /* Show the content of the table */ + $this->displayListContent($token); + + /* Close list table and submit button */ + $this->displayListFooter($token); + } + + function postProcess() + { + global $cookie, $link, $currentIndex; + + if (Tools::isSubmit('viewcms') AND ($id_cms = (int)(Tools::getValue('id_cms'))) AND $cms = new CMS($id_cms, (int)($cookie->id_lang)) AND Validate::isLoadedObject($cms)) + { + $redir = $link->getCMSLink($cms); + if (!$cms->active) + { + $admin_dir = dirname($_SERVER['PHP_SELF']); + $admin_dir = substr($admin_dir, strrpos($admin_dir,'/') + 1); + $redir .= '?adtoken='.Tools::encrypt('PreviewCMS'.$cms->id).'&ad='.$admin_dir; + } + Tools::redirectAdmin($redir); + } + elseif (Tools::isSubmit('deletecms')) + { + if (Tools::getValue('id_cms') == Configuration::get('PS_CONDITIONS_CMS_ID')) + { + Configuration::updateValue('PS_CONDITIONS', 0); + Configuration::updateValue('PS_CONDITIONS_CMS_ID', 0); + } + $cms = new CMS((int)(Tools::getValue('id_cms'))); + $cms->cleanPositions($cms->id_cms_category); + if (!$cms->delete()) + $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' ('.mysql_error().')'; + else + Tools::redirectAdmin($currentIndex.'&id_cms_category='.$cms->id_cms_category.'&conf=1&token='.Tools::getAdminTokenLite('AdminCMSContent')); + }/* Delete multiple objects */ + elseif (Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.'Box'])) + { + $cms = new CMS(); + $result = true; + $result = $cms->deleteSelection(Tools::getValue($this->table.'Box')); + if ($result) + { + $cms->cleanPositions((int)(Tools::getValue('id_cms_category'))); + Tools::redirectAdmin($currentIndex.'&conf=2&token='.Tools::getAdminTokenLite('AdminCMSContent').'&id_category='.(int)(Tools::getValue('id_cms_category'))); + } + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + elseif (Tools::isSubmit('submitAddcms') OR Tools::isSubmit('submitAddcmsAndPreview')) + { + parent::validateRules(); + + if (!sizeof($this->_errors)) + { + if (!$id_cms = (int)(Tools::getValue('id_cms'))) + { + $cms = new CMS(); + $this->copyFromPost($cms, 'cms'); + if (!$cms->add()) + $this->_errors[] = Tools::displayError('An error occurred while creating object.').' '.$this->table.' ('.mysql_error().')'; + elseif (Tools::isSubmit('submitAddcmsAndPreview')) + { + $preview_url = $link->getCMSLink($cms, $this->getFieldValue($object, 'link_rewrite', $this->_defaultFormLanguage), (int)($cookie->id_lang)); + if (!$cms->active) + { + $admin_dir = dirname($_SERVER['PHP_SELF']); + $admin_dir = substr($admin_dir, strrpos($admin_dir,'/') + 1); + $token = Tools::encrypt('PreviewCMS'.$cms->id); + + $preview_url .= $object->active ? '' : '&adtoken='.$token.'&ad='.$admin_dir; + } + Tools::redirectAdmin($preview_url); + } + else + Tools::redirectAdmin($currentIndex.'&id_cms_category='.$cms->id_cms_category.'&conf=3&token='.Tools::getAdminTokenLite('AdminCMSContent')); + } + else + { + $cms = new CMS($id_cms); + $this->copyFromPost($cms, 'cms'); + if (!$cms->update()) + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.' ('.mysql_error().')'; + elseif (Tools::isSubmit('submitAddcmsAndPreview')) + { + $preview_url = $link->getCMSLink($cms, $this->getFieldValue($object, 'link_rewrite', $this->_defaultFormLanguage), (int)($cookie->id_lang)); + if (!$cms->active) + { + $admin_dir = dirname($_SERVER['PHP_SELF']); + $admin_dir = substr($admin_dir, strrpos($admin_dir,'/') + 1); + $token = Tools::encrypt('PreviewCMS'.$cms->id); + + $preview_url .= $object->active ? '' : '&adtoken='.$token.'&ad='.$admin_dir; + } + Tools::redirectAdmin($preview_url); + } + else + Tools::redirectAdmin($currentIndex.'&id_cms_category='.$cms->id_cms_category.'&conf=4&token='.Tools::getAdminTokenLite('AdminCMSContent')); + } + } + } + elseif (Tools::getValue('position')) + { + if ($this->tabAccess['edit'] !== '1') + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + elseif (!Validate::isLoadedObject($object = $this->loadObject())) + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + elseif (!$object->updatePosition((int)(Tools::getValue('way')), (int)(Tools::getValue('position')))) + $this->_errors[] = Tools::displayError('Failed to update the position.'); + else + Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=4'.(($id_category = (int)(Tools::getValue('id_cms_category'))) ? ('&id_cms_category='.$id_category) : '').'&token='.Tools::getAdminTokenLite('AdminCMSContent')); + } + /* Change object statuts (active, inactive) */ + elseif (Tools::isSubmit('status') AND Tools::isSubmit($this->identifier)) + { + if ($this->tabAccess['edit'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->toggleStatus()) + Tools::redirectAdmin($currentIndex.'&conf=5'.((int)Tools::getValue('id_cms_category') ? '&id_cms_category='.(int)Tools::getValue('id_cms_category') : '').'&token='.Tools::getValue('token')); + else + $this->_errors[] = Tools::displayError('An error occurred while updating status.'); + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + else + parent::postProcess(true); + } +} + + diff --git a/admin-dev/tabs/AdminCMSCategories.php b/admin-dev/tabs/AdminCMSCategories.php new file mode 100644 index 000000000..515f17bdf --- /dev/null +++ b/admin-dev/tabs/AdminCMSCategories.php @@ -0,0 +1,293 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminCMSCategories extends AdminTab +{ + protected $maxImageSize = 300000; + + /** @var object CMSCategory() instance for navigation*/ + private $_CMSCategory; + + public function __construct() + { + global $cookie; + + $this->table = 'cms_category'; + $this->className = 'CMSCategory'; + $this->lang = true; + $this->edit = true; + $this->view = true; + $this->delete = true; + + + $this->fieldsDisplay = array( + 'id_cms_category' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 30), + 'name' => array('title' => $this->l('Name'), 'width' => 100, 'callback' => 'hideCMSCategoryPosition'), + 'description' => array('title' => $this->l('Description'), 'width' => 500, 'maxlength' => 90, 'orderby' => false), + 'position' => array('title' => $this->l('Position'), 'width' => 40,'filter_key' => 'position', 'align' => 'center', 'position' => 'position'), + 'active' => array('title' => $this->l('Displayed'), 'active' => 'status', 'align' => 'center', 'type' => 'bool', 'orderby' => false)); + + $this->_CMSCategory = AdminCMSContent::getCurrentCMSCategory(); + $this->_filter = 'AND `id_parent` = '.(int)($this->_CMSCategory->id); + $this->_select = 'position '; + + parent::__construct(); + } + + public function displayList($token = NULL) + { + global $currentIndex; + /* Display list header (filtering, pagination and column names) */ + $this->displayListHeader($token); + if (!sizeof($this->_list)) + echo ''.$this->l('No items found').''; + + /* Show the content of the table */ + $this->displayListContent($token); + + /* Close list table and submit button */ + $this->displayListFooter($token); + } + + public function display($token = NULL) + { + global $currentIndex, $cookie; + $id_cms_category = (int)(Tools::getValue('id_cms_category', 1)); + + $this->getList((int)($cookie->id_lang), !$cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$cookie->__get($this->table.'Orderway') ? 'ASC' : NULL); + + echo '

'.(!$this->_listTotal ? ($this->l('There are no subcategories')) : ($this->_listTotal.' '.($this->_listTotal > 1 ? $this->l('subcategories') : $this->l('subCMS Category')))).' '.$this->l('in CMS Category').' "'.stripslashes(CMSCategory::hideCMSCategoryPosition($this->_CMSCategory->getName())).'"

'; + echo ' '.$this->l('Add a new sub CMS Category').' +
'; + $this->displayList($token); + echo '
'; + } + + public function postProcess($token = NULL) + { + global $cookie, $currentIndex; + + $this->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id); + + + if (Tools::isSubmit('submitAdd'.$this->table)) + { + + if ($id_cms_category = (int)(Tools::getValue('id_cms_category'))) + { + if (!CMSCategory::checkBeforeMove($id_cms_category, (int)(Tools::getValue('id_parent')))) + { + $this->_errors[] = Tools::displayError('CMS Category cannot be moved here'); + return false; + } + } + } + /* Change object statuts (active, inactive) */ + elseif (isset($_GET['statuscms_category']) AND Tools::getValue($this->identifier)) + { + if ($this->tabAccess['edit'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->toggleStatus()) + Tools::redirectAdmin($currentIndex.'&conf=5'.((int)$object->id_parent ? '&id_cms_category='.(int)$object->id_parent : '').'&token='.Tools::getValue('token')); + else + $this->_errors[] = Tools::displayError('An error occurred while updating status.'); + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + /* Delete object */ + elseif (isset($_GET['delete'.$this->table])) + { + if ($this->tabAccess['delete'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings)) + { + // check if request at least one object with noZeroObject + if (isset($object->noZeroObject) AND sizeof($taxes = call_user_func(array($this->className, $object->noZeroObject))) <= 1) + $this->_errors[] = Tools::displayError('You need at least one object.').' '.$this->table.'
'.Tools::displayError('You cannot delete all of the items.'); + else + { + $this->deleteImage($object->id); + if ($this->deleted) + { + $object->deleted = 1; + if ($object->update()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.Tools::getValue('token')); + } + elseif ($object->delete()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.Tools::getValue('token')); + $this->_errors[] = Tools::displayError('An error occurred during deletion.'); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + elseif (isset($_GET['position'])) + { + if ($this->tabAccess['edit'] !== '1') + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + elseif (!Validate::isLoadedObject($object = new CMSCategory((int)(Tools::getValue($this->identifier, Tools::getValue('id_cms_category_to_move', 1)))))) + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + elseif (!$object->updatePosition((int)(Tools::getValue('way')), (int)(Tools::getValue('position')))) + $this->_errors[] = Tools::displayError('Failed to update the position.'); + else + Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=5'.(($id_category = (int)(Tools::getValue($this->identifier, Tools::getValue('id_cms_category_parent', 1)))) ? ('&'.$this->identifier.'='.$id_category) : '').'&token='.Tools::getAdminTokenLite('AdminCMSContent')); + } + /* Delete multiple objects */ + elseif (Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.'Box'])) + { + $cms_category = new CMSCategory(); + $result = true; + $result = $cms_category->deleteSelection(Tools::getValue($this->table.'Box')); + if ($result) + { + $cms_category->cleanPositions((int)(Tools::getValue('id_cms_category'))); + Tools::redirectAdmin($currentIndex.'&conf=2&token='.Tools::getAdminTokenLite('AdminCMSContent').'&id_category='.(int)(Tools::getValue('id_cms_category'))); + } + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + parent::postProcess(true); + } + + public function displayForm($token=NULL) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + $active = $this->getFieldValue($obj, 'active'); + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('CMS Category').' + +
'; + foreach ($this->_languages as $language) + echo ' +
+ id) ? ' onkeyup="copy2friendlyURL();"' : '').' /> * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + echo '

+
+ +
+ + + + +
+ +
+ +
+ +
'; + foreach ($this->_languages as $language) + echo ' +
+ +
'; + echo '

+
+

+ +
'; + foreach ($this->_languages as $language) + echo ' +
+ + '.$this->l('Forbidden characters:').' <>;=#{}  +
'; + echo '

+
+ +
'; + foreach ($this->_languages as $language) + echo '
+ + '.$this->l('Forbidden characters:').' <>;=#{}  +
'; + echo '

+
+ +
'; + foreach ($this->_languages as $language) + echo ' +
+ + '.$this->l('Forbidden characters:').' <>;=#{}  +
'; + echo '

+
+ +
'; + foreach ($this->_languages as $language) + echo '
+ * + '.$this->l('Only letters and the minus (-) character are allowed').'  +
'; + echo '

+
+ +
+ +   +
+
* '.$this->l('Required field').'
+
+
+

'; + } +} diff --git a/admin-dev/tabs/AdminCMSContent.php b/admin-dev/tabs/AdminCMSContent.php new file mode 100644 index 000000000..25774e144 --- /dev/null +++ b/admin-dev/tabs/AdminCMSContent.php @@ -0,0 +1,129 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); +include(PS_ADMIN_DIR.'/tabs/AdminCMSCategories.php'); +include(PS_ADMIN_DIR.'/tabs/AdminCMS.php'); + +class AdminCMSContent extends AdminTab +{ + /** @var object adminCMSCategories() instance */ + private $adminCMSCategories; + + /** @var object adminCMS() instance */ + private $adminCMS; + + /** @var object Category() instance for navigation*/ + private static $_category = NULL; + + public function __construct() + { + /* Get current category */ + $id_cms_category = (int)(Tools::getValue('id_cms_category', Tools::getValue('id_cms_category_parent', 1))); + self::$_category = new CMSCategory($id_cms_category); + if (!Validate::isLoadedObject(self::$_category)) + die('Category cannot be loaded'); + + $this->table = array('cms_category', 'cms'); + $this->adminCMSCategories = new adminCMSCategories(); + $this->adminCMS = new adminCMS(); + + parent::__construct(); + } + + /** + * Return current category + * + * @return object + */ + public static function getCurrentCMSCategory() + { + return self::$_category; + } + + public function viewAccess($disable = false) + { + $result = parent::viewAccess($disable); + $this->adminCMSCategories->tabAccess = $this->tabAccess; + $this->adminCMS->tabAccess = $this->tabAccess; + return $result; + } + + public function postProcess() + { + if (Tools::isSubmit('submitDelcms') OR Tools::isSubmit('previewSubmitAddcmsAndPreview') OR Tools::isSubmit('submitAddcms') OR isset($_GET['deletecms']) OR Tools::isSubmit('viewcms') OR (Tools::isSubmit('statuscms') AND Tools::isSubmit('id_cms')) OR (Tools::isSubmit('position') AND !Tools::isSubmit('id_cms_category_to_move'))) + $this->adminCMS->postProcess(); + if(Tools::isSubmit('submitDelcms_category') OR Tools::isSubmit('submitAddcms_categoryAndBackToParent') OR Tools::isSubmit('submitAddcms_category') OR isset($_GET['deletecms_category']) OR (Tools::isSubmit('statuscms_category') AND Tools::isSubmit('id_cms_category')) OR (Tools::isSubmit('position') AND Tools::isSubmit('id_cms_category_to_move'))) + $this->adminCMSCategories->postProcess(); + + } + + public function displayErrors() + { + parent::displayErrors(); + $this->adminCMS->displayErrors(); + $this->adminCMSCategories->displayErrors(); + } + + public function display() + { + global $currentIndex; + + if (((Tools::isSubmit('submitAddcms_category') OR Tools::isSubmit('submitAddcms_categoryAndStay')) AND sizeof($this->adminCMSCategories->_errors)) OR isset($_GET['updatecms_category']) OR isset($_GET['addcms_category'])) + { + $this->adminCMSCategories->displayForm($this->token); + echo '

'.$this->l('Back to list').'
'; + + } + elseif (((Tools::isSubmit('submitAddcms') OR Tools::isSubmit('submitAddcmsAndStay')) AND sizeof($this->adminCMS->_errors)) OR isset($_GET['updatecms']) OR isset($_GET['addcms'])) + { + $this->adminCMS->displayForm($this->token); + echo '

'.$this->l('Back to list').'
'; + + } + else + { + $id_cms_category = (int)(Tools::getValue('id_cms_category')); + if (!$id_cms_category) + $id_cms_category = 1; + $cms_tabs = array('cms_category', 'cms'); + // Cleaning links + $catBarIndex = $currentIndex; + foreach ($cms_tabs AS $tab) + if (Tools::getValue($tab.'Orderby') && Tools::getValue($tab.'Orderway')) + $catBarIndex = preg_replace('/&'.$tab.'Orderby=([a-z _]*)&'.$tab.'Orderway=([a-z]*)/i', '', $currentIndex); + echo '
'.$this->l('Current category').' :   '.getPath($catBarIndex, $id_cms_category,'','','cms').'
'; + echo '

'.$this->l('Categories').'

'; + $this->adminCMSCategories->display($this->token); + echo '
 
'; + echo '

'.$this->l('Pages in this category').'

'; + $this->adminCMS->display($this->token); + } + + } +} + diff --git a/admin-dev/tabs/AdminCarriers.php b/admin-dev/tabs/AdminCarriers.php new file mode 100644 index 000000000..43551726a --- /dev/null +++ b/admin-dev/tabs/AdminCarriers.php @@ -0,0 +1,379 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7321 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminCarriers extends AdminTab +{ + protected $maxImageSize = 30000; + + public function __construct() + { + global $cookie; + + $this->table = 'carrier'; + $this->className = 'Carrier'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + $this->deleted = true; + $this->fieldImageSettings = array('name' => 'logo', 'dir' => 's'); + + $this->fieldsDisplay = array( + 'id_carrier' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Name'), 'width' => 100), + 'logo' => array('title' => $this->l('Logo'), 'align' => 'center', 'image' => 's', 'orderby' => false, 'search' => false), + 'delay' => array('title' => $this->l('Delay'), 'width' => 300, 'orderby' => false), + 'active' => array('title' => $this->l('Status'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false), + 'is_free' => array('title' => $this->l('Is Free'), 'align' => 'center', 'icon' => array(0 => 'disabled.gif', 1 => 'enabled.gif', 'default' => 'disabled.gif'), 'type' => 'bool', 'orderby' => false)); + + $this->optionTitle = $this->l('Carrier options'); + $this->_fieldsOptions = array( + 'PS_CARRIER_DEFAULT' => array('title' => $this->l('Default carrier:'), 'desc' => $this->l('The default carrier used in shop'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'id_carrier', 'list' => Carrier::getCarriers((int)(Configuration::get('PS_LANG_DEFAULT')), true , false,false, NULL, ALL_CARRIERS)), + ); + + parent::__construct(); + } + + public function displayTop() + { + echo + '
'. + ' '.$this->l('How to create a new carrier?').''. + '
'. + '
    '.' +
  • '.$this->l('Click "Add new".').'
    '.'
  • +
  • '.$this->l('Fill in the fields and click "Save".').'
  • +
  • '.$this->l('You need to decide a price range or a weight range for which the new carrier will be available. Under the "Shipping" tab, click either "Price Ranges" or "Weight Ranges".').'
  • +
  • '.$this->l('Click "Add new".').'
  • +
  • '.$this->l('Select the name of the carrier and define the price range or the weight range. For example the carrier can be made available for a weight range between 0 and 5kgs. Another carrier will have a range between 5 and 10kgs.').'
  • +
  • '.$this->l('When you are done, click "Save".').'
  • +
  • '.$this->l('Click on the "Shipping" tab.').'
  • +
  • '.$this->l('You need to choose the fees that will be applied for this carrier. At the bottom on the page, in the "Fees" section, select the name of the carrier.').'
  • +
  • '.$this->l('For each zone, enter a price. Click "Save".').'
  • +
  • '.$this->l('You\'re set! The new carrier will be displayed to your customers.').'
  • +
+

'; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + $currentLanguage = (int)($cookie->id_lang); + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Carriers').' + +
+ * + '.$this->l('Allowed characters: letters, spaces and').' ().-  +

'.$this->l('Carrier name displayed during checkout').'
'.$this->l('With a value of 0, the carrier name will be replaced by the shop name').'

+
+ +
+ +

'.$this->l('Upload logo from your computer').' (.gif, .jpg, .jpeg '.$this->l('or').' .png)

+
+ +
'; + foreach ($this->_languages as $language) + echo ' +
+ * +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'delay', 'delay'); + echo ' +

'.$this->l('Time taken for product delivery; displayed during checkout').'

+
+ +
+ +

'.$this->l('URL for the tracking number; type \'@\' where the tracking number will appear').'

+
+ +
'; + $carrier_zones = $obj->getZones(); + $zones = Zone::getZones(false); + foreach ($zones AS $zone) + echo ' $obj->id, 'id_zone' => $zone['id_zone'], 'name' => $zone['name'], 'active' => $zone['active']), $carrier_zones))) ? ' checked="checked"' : '').'>
'; + echo '

'.$this->l('The zone in which this carrier is to be used').'

+
+ +
'; + $groups = Group::getGroups((int)($cookie->id_lang)); + if (sizeof($groups)) + { + echo ' + + + + + + '; + $irow = 0; + foreach ($groups as $group) + echo ' + + + + + '; + echo ' +
id) ? 'checked="checked" ' : '').' />'.$this->l('ID').''.$this->l('Group name').'
getValue('SELECT id_group FROM '._DB_PREFIX_.'carrier_group WHERE id_carrier='.(int)($obj->id).' AND id_group='.(int)($group['id_group'])) OR (!isset($obj->id))) ? 'checked="checked" ' : '').'/>'.$group['id_group'].'
+

'.$this->l('Mark all groups you want to give access to this carrier').'

+ '; + } + else + echo '

'.$this->l('No group created').'

'; + echo '
+ +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Include or exclude carrier from list of carriers on Front Office').'

+
+ +
+ getFieldValue($obj, 'is_free') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'is_free') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Apply shipping costs and additional shipping costs by products in carrier price').'

+
+
+ +
+ +
+ +
+ getFieldValue($obj, 'shipping_handling') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'shipping_handling') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Include the shipping & handling costs in carrier price').'

+
+ +
+ getFieldValue($obj, 'shipping_method') == Carrier::SHIPPING_METHOD_DEFAULT ? 'checked="checked" ' : '').'/> +
+ getFieldValue($obj, 'shipping_method') == Carrier::SHIPPING_METHOD_PRICE ? 'checked="checked" ' : '').'/> +
+ getFieldValue($obj, 'shipping_method') == Carrier::SHIPPING_METHOD_WEIGHT ? 'checked="checked" ' : '').'/> +
+
+ +
+ +

'.$this->l('Out-of-range behavior when none is defined (e.g., when a customer\'s cart weight is greater than the highest range limit)').'

+
'; + if($this->getFieldValue($obj, 'is_module')) + { + echo ' +

- '. + $this->l('This carrier is bound to this module ').' => '.$this->getFieldValue($obj, 'external_module_name').'

+ + '; + + if($this->getFieldValue($obj, 'shipping_external')) + { + echo '

- '.$this->l('The shipping costs are calculated outside of your shop').'

+ '; + } + if($this->getFieldValue($obj, 'need_range')) + { + echo '

- '.$this->l('This carrier uses PrestaShop range to calculate shipping costs').'

+ '; + } + + echo '
'; + } + echo '
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + + public function beforeDelete($object) + { + return $object->isUsed(); + } + + public function afterDelete($object, $oldId) + { + $object->copyCarrierData((int)($oldId)); + } + + private function changeGroups($id_carrier, $delete = true) + { + if ($delete) + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'carrier_group WHERE id_carrier='.(int)($id_carrier)); + $groups = Db::getInstance()->ExecuteS('SELECT id_group FROM `'._DB_PREFIX_.'group`'); + foreach ($groups as $group) + if (in_array($group['id_group'], $_POST['groupBox'])) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'carrier_group (id_group, id_carrier) VALUES('.(int)($group['id_group']).','.(int)($id_carrier).')'); + } + + public function postProcess() + { + global $currentIndex; + + if (Tools::getValue('submitAdd'.$this->table)) + { + /* Checking fields validity */ + $this->validateRules(); + if (!sizeof($this->_errors)) + { + $id = (int)(Tools::getValue('id_'.$this->table)); + + /* Object update */ + if (isset($id) AND !empty($id)) + { + if ($this->tabAccess['edit'] === '1') + { + $object = new $this->className($id); + if (Validate::isLoadedObject($object)) + { + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'carrier_group WHERE id_carrier='.(int)($id)); + $object->deleted = 1; + $object->update(); + $objectNew = new $this->className(); + $this->copyFromPost($objectNew, $this->table); + $result = $objectNew->add(); + if (Validate::isLoadedObject($objectNew)) + { + $this->afterDelete($objectNew, $object->id); + Hook::updateCarrier((int)($object->id), $objectNew); + } + $this->changeGroups($objectNew->id); + if (!$result) + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.''; + elseif ($this->postImage($objectNew->id)) + { + $this->changeZones($objectNew->id); + Tools::redirectAdmin($currentIndex.'&id_'.$this->table.'='.$object->id.'&conf=4'.'&token='.$this->token); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + + /* Object creation */ + else + { + if ($this->tabAccess['add'] === '1') + { + $object = new $this->className(); + $this->copyFromPost($object, $this->table); + if (!$object->add()) + $this->_errors[] = Tools::displayError('An error occurred while creating object.').' '.$this->table.''; + elseif (($_POST['id_'.$this->table] = $object->id /* voluntary */) AND $this->postImage($object->id) AND $this->_redirect) + { + $this->changeZones($object->id); + $this->changeGroups($object->id); + Tools::redirectAdmin($currentIndex.'&id_'.$this->table.'='.$object->id.'&conf=3'.'&token='.$this->token); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + } + } + else + { + if ((Tools::isSubmit('submitDel'.$this->table) && in_array(Configuration::get('PS_CARRIER_DEFAULT'), Tools::getValue('carrierBox'))) + OR (isset($_GET['delete'.$this->table]) AND Tools::getValue('id_carrier') == Configuration::get('PS_CARRIER_DEFAULT'))) + $this->_errors[] = $this->l('Please set another carrier as default before deleting'); + else + parent::postProcess(); + } + } + + + function changeZones($id) + { + $carrier = new $this->className($id); + if (!Validate::isLoadedObject($carrier)) + die (Tools::displayError('Object cannot be loaded')); + $zones = Zone::getZones(true); + foreach ($zones as $zone) + if (sizeof($carrier->getZone($zone['id_zone']))) + { + if (!isset($_POST['zone_'.$zone['id_zone']]) OR !$_POST['zone_'.$zone['id_zone']]) + $carrier->deleteZone($zone['id_zone']); + } + else + if (isset($_POST['zone_'.$zone['id_zone']]) AND $_POST['zone_'.$zone['id_zone']]) + $carrier->addZone($zone['id_zone']); + } + + public function displayListContent($token = NULL) + { + foreach ($this->_list as $key => $list) + if ($list['name'] == '0') + $this->_list[$key]['name'] = Configuration::get('PS_SHOP_NAME'); + parent::displayListContent($token); + } +} + diff --git a/admin-dev/tabs/AdminCarts.php b/admin-dev/tabs/AdminCarts.php new file mode 100644 index 000000000..e3be739ed --- /dev/null +++ b/admin-dev/tabs/AdminCarts.php @@ -0,0 +1,344 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminCarts extends AdminTab +{ + public function __construct() + { + $this->table = 'cart'; + $this->className = 'Cart'; + $this->lang = false; + $this->edit = false; + $this->view = true; + $this->delete = true; + + $this->_select = 'CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) `customer`, a.id_cart total, ca.name carrier, o.id_order '; + $this->_join = 'LEFT JOIN '._DB_PREFIX_.'customer c ON (c.id_customer = a.id_customer) + LEFT JOIN '._DB_PREFIX_.'currency cu ON (cu.id_currency = a.id_currency) + LEFT JOIN '._DB_PREFIX_.'carrier ca ON (ca.id_carrier = a.id_carrier) + LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_cart = a.id_cart) '; + + $this->fieldsDisplay = array( + 'id_cart' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'id_order' => array('title' => $this->l('ID Order'), 'align' => 'center', 'width' => 25), + 'customer' => array('title' => $this->l('Customer'), 'width' => 80, 'filter_key' => 'c!lastname'), + 'total' => array('title' => $this->l('Total'), 'callback' => 'getOrderTotalUsingTaxCalculationMethod', 'orderby' => false, 'search' => false, 'width' => 50, 'align' => 'right', 'prefix' => '', 'suffix' => '', 'currency' => true), + 'carrier' => array('title' => $this->l('Carrier'), 'width' => 25, 'align' => 'center', 'callback' => 'replaceZeroByShopName', 'filter_key' => 'ca!name'), + 'date_add' => array('title' => $this->l('Date'), 'width' => 90, 'align' => 'right', 'type' => 'datetime', 'filter_key' => 'a!date_add')); + $this->shopLinkType = 'shop'; + + parent::__construct(); + } + + public function viewDetails() + { + global $currentIndex, $cookie; + + if (!($cart = $this->loadObject(true))) + return; + $customer = new Customer($cart->id_customer); + $customerStats = $customer->getStats(); + $products = $cart->getProducts(); + $customizedDatas = Product::getAllCustomizedDatas((int)($cart->id)); + Product::addCustomizationPrice($products, $customizedDatas); + $summary = $cart->getSummaryDetails(); + $discounts = $cart->getDiscounts(); + + $currency = new Currency($cart->id_currency); + $currentLanguage = new Language((int)($cookie->id_lang)); + + // display cart header + echo '

'.(($customer->id) ? $customer->firstname.' '.$customer->lastname : $this->l('Guest')).' - '.$this->l('Cart #').sprintf('%06d', $cart->id).' '.$this->l('from').' '.$cart->date_upd.'

'; + + /* Display customer information */ + echo ' +
+
+
+ '.$this->l('Customer information').' + '; + if ($customer->id) + echo ' + '.$customer->firstname.' '.$customer->lastname.' ('.$this->l('#').$customer->id.')
+ ('.$customer->email.')

+ '.$this->l('Account registered:').' '.Tools::displayDate($customer->date_add, (int)($cookie->id_lang), true).'
+ '.$this->l('Valid orders placed:').' '.$customerStats['nb_orders'].'
+ '.$this->l('Total paid since registration:').' '.Tools::displayPrice($customerStats['total_orders'], $currency, false).'
'; + else + echo $this->l('Guest not registered').''; + echo '
'; + echo ' +
+
'; + + /* Display order information */ + $id_order = (int)(Order::getOrderByCartId($cart->id)); + $order = new Order($id_order); + + if ($order->getTaxCalculationMethod() == PS_TAX_EXC) + { + $total_products = $summary['total_products']; + $total_discount = $summary['total_discounts_tax_exc']; + $total_wrapping = $summary['total_wrapping_tax_exc']; + $total_price = $summary['total_price_without_tax']; + $total_shipping = $summary['total_shipping_tax_exc']; + } else { + $total_products = $summary['total_products_wt']; + $total_discount = $summary['total_discounts']; + $total_wrapping = $summary['total_wrapping']; + $total_price = $summary['total_price']; + $total_shipping = $summary['total_shipping']; + } + + echo ' +
+ '.$this->l('Order information').' + '; + if ($order->id) + echo ' + '.$this->l('Order #').sprintf('%06d', $order->id).' +

+ '.$this->l('Made on:').' '.Tools::displayDate($order->date_add, (int)$cookie->id_lang, true).'



'; + else + echo $this->l('No order created from this cart').''; + echo '
'; + echo ' +
'; + + + // List of products + echo ' +
+
+ '.$this->l('Products').''.$this->l('Cart summary').' +
+ + + + + + + + + '; + $tokenCatalog = Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee)); + foreach ($products as $k => $product) + { + if ($order->getTaxCalculationMethod() == PS_TAX_EXC) + { + $product_price = $product['price']; + $product_total = $product['total']; + } else { + $product_price = $product['price_wt']; + $product_total = $product['total_wt']; + } + + + $image = array(); + if (isset($product['id_product_attribute']) AND (int)($product['id_product_attribute'])) + $image = Db::getInstance()->getRow(' + SELECT id_image + FROM '._DB_PREFIX_.'product_attribute_image + WHERE id_product_attribute = '.(int)($product['id_product_attribute'])); + if (!isset($image['id_image'])) + $image = Db::getInstance()->getRow(' + SELECT id_image + FROM '._DB_PREFIX_.'image + WHERE id_product = '.(int)($product['id_product']).' AND cover = 1'); + + $productObj = new Product($product['id_product']); + + /* Customization display */ + $this->displayCustomizedDatas($customizedDatas, $product, $currency, $image, $tokenCatalog, $stock); + if ($product['cart_quantity'] > $product['customizationQuantityTotal']) + { + $imageProduct = new Image($image['id_image']); + echo ' + + + + + + + + '; + } + } + echo ' + + + + '; + + if ($summary['total_discounts'] != 0) + echo ' + + + + '; + if ($summary['total_wrapping'] > 0) + echo ' + + + + '; + if ($cart->getOrderTotal(true, Cart::ONLY_SHIPPING) > 0) + echo ' + + + + '; + echo ' + + + + +
 '.$this->l('Product').''.$this->l('UP').''.$this->l('Qty').''.$this->l('Stock').''.$this->l('Total').'
'.(isset($image['id_image']) ? cacheImage(_PS_IMG_DIR_.'p/'.$imageProduct->getExistingImgPath().'.jpg', + 'product_mini_'.(int)($product['id_product']).(isset($product['id_product_attribute']) ? '_'.(int)($product['id_product_attribute']) : '').'.jpg', 45, 'jpg') : '--').' + '.$product['name'].'
+ '.($product['reference'] ? $this->l('Ref:').' '.$product['reference'] : '') + .(($product['reference'] AND $product['supplier_reference']) ? ' / '.$product['supplier_reference'] : '') + .'
'.Tools::displayPrice($product_price, $currency, false).''.((int)($product['cart_quantity']) - $product['customizationQuantityTotal']).''.$productObj->getStock(isset($product['id_product_attribute']) ? $product['id_product_attribute'] : 0).''.Tools::displayPrice($product_total, $currency, false).'
'.$this->l('Total products:').''.Tools::displayPrice($total_products, $currency, false).'
'.$this->l('Total vouchers:').''.Tools::displayPrice($total_discount, $currency, false).'
'.$this->l('Total gift-wrapping:').''.Tools::displayPrice($total_wrapping, $currency, false).'
'.$this->l('Total shipping:').''.Tools::displayPrice($total_shipping, $currency, false).'
'.$this->l('Total:').''.Tools::displayPrice($total_price, $currency, false).'
'; + + if (sizeof($discounts)) + { + echo ' + + + + + '; + + foreach ($discounts as $discount) + echo ' + + + + '; + echo ' +
'.$this->l('Discounts').''.$this->l('Discount name').''.$this->l('Value').'
'.$discount['name'].'- '.Tools::displayPrice($discount['value_real'], $currency, false).'
'; + } + echo '
'. + $this->l('According to the group of this customer, prices are printed:').' '.($order->getTaxCalculationMethod() == PS_TAX_EXC ? $this->l('tax excluded.') : $this->l('tax included.')).' +
'; + + // Cancel product + echo ' +
+
 
'; + } + + private function displayCustomizedDatas(&$customizedDatas, &$product, &$currency, &$image, $tokenCatalog, &$stock) + { + if (!($order = $this->loadObject(true))) + return; + + if (is_array($customizedDatas) AND isset($customizedDatas[(int)($product['id_product'])][(int)($product['id_product_attribute'])])) + { + $image = new Image($image['id_image']); + echo ' + + '.(isset($image['id_image']) ? cacheImage(_PS_IMG_DIR_.'p/'.$image->getExistingImgPath().'.jpg', + 'product_mini_'.(int)($product['id_product']).(isset($product['id_product_attribute']) ? '_'.(int)($product['id_product_attribute']) : '').'.jpg', 45, 'jpg') : '--').' + + '.$product['name'].'
+ '.($product['reference'] ? $this->l('Ref:').' '.$product['reference'] : '') + .(($product['reference'] AND $product['supplier_reference']) ? ' / '.$product['supplier_reference'] : '') + .'
+ '.Tools::displayPrice($product['price_wt'], $currency, false).' + '.$product['customizationQuantityTotal'].' + '.(int)($stock['quantity']).' + '.Tools::displayPrice($product['total_customization_wt'], $currency, false).' + '; + foreach ($customizedDatas[(int)($product['id_product'])][(int)($product['id_product_attribute'])] AS $customization) + { + echo ' + + '; + foreach ($customization['datas'] AS $type => $datas) + if ($type == _CUSTOMIZE_FILE_) + { + $i = 0; + echo '
    '; + foreach ($datas AS $data) + echo '
  • + +
  • '; + echo '
'; + } + elseif ($type == _CUSTOMIZE_TEXTFIELD_) + { + $i = 0; + echo '
    '; + foreach ($datas AS $data) + echo '
  • '.($data['name'] ? $data['name'] : $this->l('Text #').++$i).$this->l(':').' '.$data['value'].'
  • '; + echo '
'; + } + echo ' + + '.$customization['quantity'].' + + + '; + } + } + } + + public function display() + { + global $cookie; + + if (isset($_GET['view'.$this->table])) + $this->viewDetails(); + else + { + $this->getList((int)($cookie->id_lang), !Tools::getValue($this->table.'Orderby') ? 'date_add' : NULL, !Tools::getValue($this->table.'Orderway') ? 'DESC' : NULL); + $this->displayList(); + } + } + + protected function _displayDeleteLink($token = NULL, $id) + { + global $currentIndex; + + foreach ($this->_list as $cart) + if ($id == $cart['id_cart']) + if ($cart['id_order']) + return; + + $_cacheLang['Delete'] = $this->l('Delete', __CLASS__, true, false); + $_cacheLang['DeleteItem'] = $this->l('Delete item #', __CLASS__, true, false).$id.' ?)'; + + echo ' + + '.$_cacheLang['Delete'].' + '; + } +} + diff --git a/admin-dev/tabs/AdminCatalog.php b/admin-dev/tabs/AdminCatalog.php new file mode 100644 index 000000000..688f3f238 --- /dev/null +++ b/admin-dev/tabs/AdminCatalog.php @@ -0,0 +1,204 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7499 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); +include(PS_ADMIN_DIR.'/tabs/AdminCategories.php'); +include(PS_ADMIN_DIR.'/tabs/AdminProducts.php'); + +class AdminCatalog extends AdminTab +{ + /** @var object AdminCategories() instance */ + private $adminCategories; + + /** @var object AdminProducts() instance */ + private $adminProducts; + + /** @var object AttributeGenerator() instance */ + private $attributeGenerator; + + /** @var object imageResize() instance */ + private $imageResize; + + /** @var object Category() instance for navigation*/ + private static $_category = NULL; + + public function __construct() + { + /* Get current category */ + $id_category = abs(Tools::getValue('id_category')); + $shop = new Shop(Shop::getCurrentShop(true)); + if (!$id_category) + $id_category = $shop->id_category; + else if ($id_category != $shop->id_category) + { + // Check if current category is "inside" shop default category + $sql = 'SELECT nleft, nright FROM '._DB_PREFIX_.'category + WHERE id_category = '.$shop->id_category; + if ($result = Db::getInstance()->getRow($sql)) + { + $sql = 'SELECT id_category FROM '._DB_PREFIX_.'category + WHERE id_category = '.(int)$id_category.' + AND nleft >= '.$result['nleft'].' + AND nright <= '.$result['nright']; + if (!Db::getInstance()->getValue($sql)) + $id_category = $shop->id_category; + } + } + + self::$_category = new Category($id_category, NULL, Shop::getCurrentShop(true)); + if (!Validate::isLoadedObject(self::$_category)) + die('Category cannot be loaded'); + + $this->table = array('category', 'product'); + $this->adminCategories = new AdminCategories(); + $this->adminProducts = new AdminProducts(); + + parent::__construct(); + } + + /** + * Return current category + * + * @return object + */ + public static function getCurrentCategory() + { + return self::$_category; + } + + public function viewAccess($disable = false) + { + $result = parent::viewAccess($disable); + $this->adminCategories->tabAccess = $this->tabAccess; + $this->adminProducts->tabAccess = $this->tabAccess; + return $result; + } + + public function postProcess() + { + if (!Tools::getValue('id_product')) + $this->adminCategories->postProcess(); + elseif (isset($_GET['attributegenerator'])) + { + if (!isset($this->attributeGenerator)) + { + include_once(PS_ADMIN_DIR.'/tabs/AdminAttributeGenerator.php'); + $this->attributeGenerator = new AdminAttributeGenerator(); + } + $this->attributeGenerator->postProcess(); + } + elseif (isset($_GET['imageresize'])) + { + if (!isset($this->imageResize)) + { + include_once(PS_ADMIN_DIR.'/tabs/AdminImageResize.php'); + $this->imageResize = new AdminImageResize(); + } + $this->imageResize->postProcess(); + } + $this->adminProducts->postProcess($this->token); + } + + public function displayErrors() + { + parent::displayErrors(); + $this->adminProducts->displayErrors(); + $this->adminCategories->displayErrors(); + if (Validate::isLoadedObject($this->attributeGenerator)) + $this->attributeGenerator->displayErrors(); + if (Validate::isLoadedObject($this->imageResize)) + $this->imageResize->displayErrors(); + } + + public function display() + { + global $currentIndex; + + if (((Tools::isSubmit('submitAddcategory') OR Tools::isSubmit('submitAddcategoryAndStay')) AND sizeof($this->adminCategories->_errors)) OR isset($_GET['updatecategory']) OR isset($_GET['addcategory'])) + { + $this->adminCategories->displayForm($this->token); + echo '

'.$this->l('Back to list').'
'; + } + elseif (((Tools::isSubmit('submitAddproduct') OR Tools::isSubmit('submitAddproductAndPreview') OR Tools::isSubmit('submitAddproductAndStay') OR Tools::isSubmit('submitSpecificPricePriorities') OR Tools::isSubmit('submitPriceAddition') OR Tools::isSubmit('submitPricesModification')) AND sizeof($this->adminProducts->_errors)) OR Tools::isSubmit('updateproduct') OR Tools::isSubmit('addproduct')) + { + $this->adminProducts->displayForm($this->token); + if (Tools::getValue('id_category') > 1) + echo '

'.$this->l('Back to home').'
'; + else + echo '

'.$this->l('Back to catalog').'
'; + } + elseif (isset($_GET['attributegenerator'])) + { + if (!isset($this->attributeGenerator)) + { + include_once(PS_ADMIN_DIR.'/tabs/AdminAttributeGenerator.php'); + $this->attributeGenerator = new AdminAttributeGenerator(); + } + $this->attributeGenerator->displayForm(); + } + elseif (isset($_GET['imageresize'])) + { + if (!isset($this->imageResize)) + { + include_once(PS_ADMIN_DIR.'/tabs/AdminImageResize.php'); + $this->imageResize = new AdminImageResize(); + } + $this->imageResize->displayForm(); + } + elseif (!isset($_GET['editImage'])) + { + $home = false; + $id_category = (int)(Tools::getValue('id_category')); + if (!$id_category) + { + $home = true; + if (Shop::getContextType() == Shop::CONTEXT_SHOP) + { + $shop = new Shop((int)Shop::getCurrentShop()); + $id_category = $shop->id_category; + } + else + $id_category = 1; + } + $catalog_tabs = array('category', 'product'); + // Cleaning links + $catBarIndex = $currentIndex; + foreach ($catalog_tabs AS $tab) + if (Tools::getValue($tab.'Orderby') && Tools::getValue($tab.'Orderway')) + $catBarIndex = preg_replace('/&'.$tab.'Orderby=([a-z _]*)&'.$tab.'Orderway=([a-z]*)/i', '', $currentIndex); + + echo '
'.$this->l('Current category').' :   '.getPath($catBarIndex, $id_category, '', '', 'catalog', $home).'
'; + echo '

'.$this->l('Categories').'

'; + $this->adminCategories->display($this->token); + echo '
 
'; + echo '

'.$this->l('Products in this category').'

'; + $this->adminProducts->display($this->token); + } + } +} + + diff --git a/admin-dev/tabs/AdminCategories.php b/admin-dev/tabs/AdminCategories.php new file mode 100644 index 000000000..a70d04ca4 --- /dev/null +++ b/admin-dev/tabs/AdminCategories.php @@ -0,0 +1,355 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7499 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminCategories extends AdminTab +{ + protected $maxImageSize = 300000; + + /** @var object Category() instance for navigation*/ + private $_category; + + public function __construct() + { + global $cookie; + + $this->table = 'category'; + $this->className = 'Category'; + $this->lang = true; + $this->edit = true; + $this->view = true; + $this->delete = true; + + $this->fieldImageSettings = array('name' => 'image', 'dir' => 'c'); + + $this->fieldsDisplay = array( + 'id_category' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 30), + 'name' => array('title' => $this->l('Name'), 'width' => 100), + 'description' => array('title' => $this->l('Description'), 'width' => 500, 'maxlength' => 90, 'orderby' => false), + 'position' => array('title' => $this->l('Position'), 'width' => 40,'filter_key' => 'position', 'align' => 'center', 'position' => 'position'), + 'active' => array('title' => $this->l('Displayed'), 'active' => 'status', 'align' => 'center', 'type' => 'bool', 'orderby' => false)); + + $this->_category = AdminCatalog::getCurrentCategory(); + $this->_filter = 'AND `id_parent` = '.(int)($this->_category->id); + $this->_select = 'position '; + + parent::__construct(); + } + + public function displayList($token = NULL) + { + global $currentIndex; + + /* Display list header (filtering, pagination and column names) */ + $this->displayListHeader($token); + if (!sizeof($this->_list)) + echo ''.$this->l('No items found').''; + + /* Show the content of the table */ + $this->displayListContent($token); + + /* Close list table and submit button */ + $this->displayListFooter($token); + } + + public function display($token = NULL) + { + global $currentIndex, $cookie; + $this->getList((int)($cookie->id_lang), !$cookie->__get($this->table.'Orderby') ? 'position' : NULL, !$cookie->__get($this->table.'Orderway') ? 'ASC' : NULL, 0, NULL, (int)Shop::getCurrentShop(true)); + echo '

'.(!$this->_listTotal ? ($this->l('There are no subcategories')) : ($this->_listTotal.' '.($this->_listTotal > 1 ? $this->l('subcategories') : $this->l('subcategory')))).' '.$this->l('in category').' "'.stripslashes($this->_category->getName()).'"

'; + if ($this->tabAccess['add'] === '1') + echo ' '.$this->l('Add a new subcategory').''; + echo '
'; + $this->displayList($token); + echo '
'; + } + + public function postProcess($token = NULL) + { + global $cookie, $currentIndex; + + $this->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id); + + if (Tools::isSubmit('submitAdd'.$this->table)) + { + if ($id_category = (int)(Tools::getValue('id_category'))) + { + if (!Category::checkBeforeMove($id_category, $this->_category->id)) + { + $this->_errors[] = Tools::displayError('Category cannot be moved here'); + return false; + } + } + } + /* Change object statuts (active, inactive) */ + elseif (isset($_GET['status']) AND Tools::getValue($this->identifier)) + { + if ($this->tabAccess['edit'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->toggleStatus()) + { + $target = ''; + if (($id_category = (int)(Tools::getValue('id_category'))) AND Tools::getValue('id_product')) + $target = '&id_category='.(int)($id_category); + else + { + $referrer = Tools::secureReferrer($_SERVER['HTTP_REFERER']); + if (preg_match('/id_category=(\d+)/', $referrer, $matches)) + $target = '&id_category='.(int)($matches[1]); + } + Module::hookExec('categoryUpdate'); + Tools::redirectAdmin($currentIndex.'&conf=5'.$target.'&token='.Tools::getValue('token')); + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating status.'); + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + /* Delete object */ + elseif (isset($_GET['delete'.$this->table])) + { + if ($this->tabAccess['delete'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings)) + { + // check if request at least one object with noZeroObject + if (isset($object->noZeroObject) AND sizeof($taxes = call_user_func(array($this->className, $object->noZeroObject))) <= 1) + $this->_errors[] = Tools::displayError('You need at least one object.').' '.$this->table.'
'.Tools::displayError('You cannot delete all of the items.'); + else + { + if ($this->deleted) + { + $object->deleteImage(); + $object->deleted = 1; + if ($object->update()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.Tools::getValue('token').'&id_category='.(int)($object->id_parent)); + } + elseif ($object->delete()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.Tools::getValue('token').'&id_category='.(int)($object->id_parent)); + $this->_errors[] = Tools::displayError('An error occurred during deletion.'); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + elseif (isset($_GET['position'])) + { + if ($this->tabAccess['edit'] !== '1') + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + elseif (!Validate::isLoadedObject($object = new Category((int)(Tools::getValue($this->identifier, Tools::getValue('id_category_to_move', 1)))))) + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + if (!$object->updatePosition((int)(Tools::getValue('way')), (int)(Tools::getValue('position')))) + $this->_errors[] = Tools::displayError('Failed to update the position.'); + else + Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=5'.(($id_category = (int)(Tools::getValue($this->identifier, Tools::getValue('id_category_parent', 1)))) ? ('&'.$this->identifier.'='.$id_category) : '').'&token='.Tools::getAdminTokenLite('AdminCatalog')); + } + /* Delete multiple objects */ + elseif (Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.'Box'])) + { + $category = new Category(); + $result = true; + $result = $category->deleteSelection(Tools::getValue($this->table.'Box')); + if ($result) + { + $category->cleanPositions((int)(Tools::getValue('id_category'))); + Tools::redirectAdmin($currentIndex.'&conf=2&token='.Tools::getAdminTokenLite('AdminCatalog').'&id_category='.(int)(Tools::getValue('id_category'))); + } + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + return; + } + parent::postProcess(); + } + + protected function postImage($id) + { + $ret = parent::postImage($id); + if (($id_category = (int)(Tools::getValue('id_category'))) AND isset($_FILES) AND sizeof($_FILES) AND $_FILES['image']['name'] != NULL AND file_exists(_PS_CAT_IMG_DIR_.$id_category.'.jpg')) + { + $imagesTypes = ImageType::getImagesTypes('categories'); + foreach ($imagesTypes AS $k => $imageType) + imageResize(_PS_CAT_IMG_DIR_.$id_category.'.jpg', _PS_CAT_IMG_DIR_.$id_category.'-'.stripslashes($imageType['name']).'.jpg', (int)($imageType['width']), (int)($imageType['height'])); + } + return $ret; + } + + public function displayForm($token = NULL) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + $active = $this->getFieldValue($obj, 'active'); + $customer_groups = $obj->getGroups(); + if (Shop::getContextType() == Shop::CONTEXT_SHOP) + { + $shop = new Shop(Shop::getCurrentShop()); + $id_category = $shop->id_category; + } + else + $id_category = (int)Tools::getValue('id_parent'); + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Category').' + +
'; + foreach ($this->_languages AS $language) + echo ' +
+ id) ? ' onkeyup="copy2friendlyURL();"' : '').' /> * + '.$this->l('Invalid characters:').' <>;=#{}'.($obj->id ? '
'.$this->youEditFieldFor() : '').' 
+
'; + echo '

+
+ +
+ + + + +
+ +
+ +
+ +
'; + foreach ($this->_languages AS $language) + echo ' +
+ +
'; + echo '

+
+ +
'; + echo $this->displayImage($obj->id, _PS_IMG_DIR_.'c/'.$obj->id.'.jpg', 350, NULL, Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee)), true); + echo '
+

'.$this->l('Upload category logo from your computer').'

+
+

+ +
'; + foreach ($this->_languages AS $language) + echo ' +
+ + '.$this->l('Forbidden characters:').' <>;=#{}'.($obj->id ? '
'.$this->youEditFieldFor() : '').' 
+
'; + echo '

+
+ +
'; + foreach ($this->_languages AS $language) + echo '
+ + '.$this->l('Forbidden characters:').' <>;=#{}'.($obj->id ? '
'.$this->youEditFieldFor() : '').' 
+
'; + echo '

+
+ +
'; + foreach ($this->_languages AS $language) + echo ' +
+ + '.$this->l('Forbidden characters:').' <>;=#{}'.($obj->id ? '
'.$this->youEditFieldFor() : '').' 
+
'; + echo '

+
+ +
'; + foreach ($this->_languages AS $language) + echo '
+ * + '.$this->l('Only letters and the minus (-) character are allowed').($obj->id ? '
'.$this->youEditFieldFor() : '').' 
+
'; + echo '

+
+ +
'; + $groups = Group::getGroups((int)($cookie->id_lang)); + if (sizeof($groups)) + { + echo ' + + + + + + '; + $irow = 0; + foreach ($groups AS $group) + echo ' + + + + + '; + echo ' +
id) ? 'checked="checked" ' : '').' />'.$this->l('ID').''.$this->l('Group name').'
id))) ? 'checked="checked" ' : '').'/>'.$group['id_group'].'
+

'.$this->l('Mark all groups you want to give access to this category').'

+ '; + } else + echo '

'.$this->l('No group created').'

'; + echo ' +
+
+ +   +
+
* '.$this->l('Required field').'
+
+
+

'; + } +} diff --git a/admin-dev/tabs/AdminContact.php b/admin-dev/tabs/AdminContact.php new file mode 100644 index 000000000..afd9933c5 --- /dev/null +++ b/admin-dev/tabs/AdminContact.php @@ -0,0 +1,132 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7060 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); +include_once(PS_ADMIN_DIR.'/tabs/AdminPreferences.php'); + +class AdminContact extends AdminPreferences +{ + public function __construct() + { + $this->className = 'Configuration'; + $this->table = 'configuration'; + + $temporyArrayFields = $this->_getDefaultFieldsContent(); + $this->_buildOrderedFieldsShop($temporyArrayFields); + + parent::__construct(); + + } + + private function _getDefaultFieldsContent() + { + global $cookie; + + $countryList = array(); + $countryList[] = array('id' => '0', 'name' => $this->l('Choose your country')); + foreach (Country::getCountries(intval($cookie->id_lang)) AS $country) + $countryList[] = array('id' => $country['id_country'], 'name' => $country['name']); + $stateList = array(); + $stateList[] = array('id' => '0', 'name' => $this->l('Choose your state (if applicable)')); + foreach (State::getStates(intval($cookie->id_lang)) AS $state) + $stateList[] = array('id' => $state['id_state'], 'name' => $state['name']); + + $formFields = array( + 'PS_SHOP_NAME' => array('title' => $this->l('Shop name:'), 'desc' => $this->l('Displayed in e-mails and page titles'), 'validation' => 'isGenericName', 'required' => true, 'size' => 30, 'type' => 'text'), + 'PS_SHOP_EMAIL' => array('title' => $this->l('Shop e-mail:'), 'desc' => $this->l('Displayed in e-mails sent to customers'), 'validation' => 'isEmail', 'required' => true, 'size' => 30, 'type' => 'text'), + 'PS_SHOP_DETAILS' => array('title' => $this->l('Registration:'), 'desc' => $this->l('Shop registration information (e.g., SIRET or RCS)'), 'validation' => 'isGenericName', 'size' => 30, 'type' => 'textarea', 'cols' => 30, 'rows' => 5), + 'PS_SHOP_ADDR1' => array('title' => $this->l('Shop address line 1:'), 'validation' => 'isAddress', 'size' => 30, 'type' => 'text'), + 'PS_SHOP_ADDR2' => array('title' => 'Address line 2', 'validation' => 'isAddress', 'size' => 30, 'type' => 'text'), + 'PS_SHOP_CODE' => array('title' => $this->l('Post/Zip code:'), 'validation' => 'isGenericName', 'size' => 6, 'type' => 'text'), + 'PS_SHOP_CITY' => array('title' => $this->l('City:'), 'validation' => 'isGenericName', 'size' => 30, 'type' => 'text'), + 'PS_SHOP_COUNTRY_ID' => array('title' => $this->l('Country:'), 'validation' => 'isInt', 'size' => 30, 'type' => 'select', 'list' => $countryList, 'identifier' => 'id', 'cast' => 'intval'), + 'PS_SHOP_STATE_ID' => array('title' => $this->l('State:'), 'validation' => 'isInt', 'size' => 30, 'type' => 'select', 'list' => $stateList, 'identifier' => 'id', 'cast' => 'intval'), + 'PS_SHOP_PHONE' => array('title' => $this->l('Phone:'), 'validation' => 'isGenericName', 'size' => 30, 'type' => 'text'), + 'PS_SHOP_FAX' => array('title' => $this->l('Fax:'), 'validation' => 'isGenericName', 'size' => 30, 'type' => 'text'), + ); + return $formFields; + } + + private function _buildOrderedFieldsShop($formFields) + { + $associatedOrderKey = array( + 'PS_SHOP_NAME' => 'company', + 'PS_SHOP_ADDR1' => 'address1', + 'PS_SHOP_ADDR2' => 'address2', + 'PS_SHOP_CITY' => 'city', + 'PS_SHOP_STATE_ID' => 'State:name', + 'PS_SHOP_CODE' => 'postcode', + 'PS_SHOP_COUNTRY_ID' => 'Country:name', + 'PS_SHOP_PHONE' => 'phone'); + + $this->_fieldsShop = array(); + $orderedFields = AddressFormat::getOrderedAddressFields(Configuration::get('PS_SHOP_COUNTRY_ID')); + + foreach($orderedFields as $lineFields) + if (($patterns = explode(' ', $lineFields))) + foreach($patterns as $pattern) + if (($key = array_search($pattern, $associatedOrderKey))) + $this->_fieldsShop[$key] = $formFields[$key]; + foreach($formFields as $key => $value) + if (!isset($this->_fieldsShop[$key])) + $this->_fieldsShop[$key] = $formFields[$key]; + } + + public function postProcess() + { + if (isset($_POST['PS_SHOP_STATE_ID']) && $_POST['PS_SHOP_STATE_ID'] != '0') + { + $isStateOk = Db::getInstance()->getValue('SELECT `active` FROM `'._DB_PREFIX_.'state` WHERE `id_country` = '.(int)(Tools::getValue('PS_SHOP_COUNTRY_ID')).' AND `id_state` = '.(int)(Tools::getValue('PS_SHOP_STATE_ID'))); + if ($isStateOk != 1) + $this->_errors[] = Tools::displayError('This state is not in this country.'); + } + parent::postProcess(); + } + + protected function _postConfig($fields) + { + global $cookie; + if (!$this->_errors && isset($_POST['PS_SHOP_COUNTRY_ID'])) + { + $country = new Country((int)($_POST['PS_SHOP_COUNTRY_ID']), intval($cookie->id_lang)); + Configuration::updateValue('PS_SHOP_COUNTRY', pSQL($country->name)); + } + if (!$this->_errors && isset($_POST['PS_SHOP_STATE_ID'])) + { + $state = new State((int)($_POST['PS_SHOP_STATE_ID'])); + Configuration::updateValue('PS_SHOP_STATE', pSQL($state->name)); + } + parent::_postConfig($fields); + } + + public function display() + { + $this->_displayForm('shop', $this->_fieldsShop, $this->l('Contact details'), 'width3', 'tab-contact'); + } +} + + diff --git a/admin-dev/tabs/AdminContacts.php b/admin-dev/tabs/AdminContacts.php new file mode 100644 index 000000000..f6986f671 --- /dev/null +++ b/admin-dev/tabs/AdminContacts.php @@ -0,0 +1,121 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7300 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminContacts extends AdminTab +{ + public function __construct() + { + $this->table = 'contact'; + $this->className = 'Contact'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'id_contact' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Title'), 'width' => 130), + 'email' => array('title' => $this->l('E-mail address'), 'width' => 130), + 'description' => array('title' => $this->l('Description'), 'width' => 150)); + + $this->optionTitle = $this->l('Contact options'); + $this->_fieldsOptions = array( + 'PS_CUSTOMER_SERVICE_FILE_UPLOAD' => array('title' => $this->l('Allow file upload'), 'desc' => $this->l('Allow customers to upload file using contact page'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'value', 'list' => array( + '0' => array('value' => 0, 'name' => $this->l('No')), + '1' => array('value' => 1, 'name' => $this->l('Yes')) + )), + 'PS_CUSTOMER_SERVICE_SIGNATURE' => array('title' => $this->l('Pre-defined message'), 'desc' => $this->l('Please fill the message that appears by default when you answer a thread on the customer service page'), 'cast' => 'pSQL', 'type' => 'textareaLang', 'identifier' => 'value', + 'cols' => 40, 'rows' => 8 + )); + + parent::__construct(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Contacts').' + +
'; + foreach ($this->_languages as $language) + echo ' +
+ * +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name¤description', 'name'); + echo '

'.$this->l('Contact name, e.g., Technical Support').'

+
+ +
+ +

'.$this->l('E-mails will be sent to this address').'

+
+ +
+ getFieldValue($obj, 'customer_service') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'customer_service') ? 'checked="checked" ' : '').'/> + +

'.$this->l('The messages will be saved in the Customer Service tab').'

+
 
+ +
'; + foreach ($this->_languages as $language) + echo ' +
+ +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name¤description', 'description'); + echo ' +

'.$this->l('Additional information about this contact').'

+
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} + + diff --git a/admin-dev/tabs/AdminCountries.php b/admin-dev/tabs/AdminCountries.php new file mode 100644 index 000000000..65d4f715b --- /dev/null +++ b/admin-dev/tabs/AdminCountries.php @@ -0,0 +1,347 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminCountries extends AdminTab +{ + public function __construct() + { + global $cookie; + + $this->table = 'country'; + $this->className = 'Country'; + $this->lang = true; + $this->edit = true; + $this->deleted = false; + $this->_select = 'z.`name` AS zone'; + $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'zone` z ON (z.`id_zone` = a.`id_zone`)'; + + $this->fieldsDisplay = array( + 'id_country' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Country'), 'width' => 130, 'filter_key' => 'b!name'), + 'iso_code' => array('title' => $this->l('ISO code'), 'width' => 70, 'align' => 'center'), + 'call_prefix' => array('title' => $this->l('Call prefix'), 'width' => 40, 'align' => 'center', 'callback' => 'displayCallPrefix'), + 'zone' => array('title' => $this->l('Zone'), 'width' => 100, 'filter_key' => 'z!name'), + 'a!active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'a!active')); + + $this->optionTitle = $this->l('Countries options'); + $this->_fieldsOptions = array('PS_COUNTRY_DEFAULT' => array('title' => $this->l('Default country:'), 'desc' => $this->l('The default country used in shop'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'id_country', 'list' => Country::getCountries((int)($cookie->id_lang)))); + parent::__construct(); + } + + public function postProcess() + { + if (isset($_GET['delete'.$this->table]) OR Tools::getValue('submitDel'.$this->table)) + $this->_errors[] = Tools::displayError('You cannot delete a country. If you do not want it available for customers, please disable it.'); + else + { + if (Tools::getValue('submitAdd'.$this->table)) + { + $id_country = Tools::getValue('id_country'); + $tmp_addr_format = new AddressFormat($id_country); + + $save_status = false; + + $is_new = is_null($tmp_addr_format->id_country); + if ($is_new) + { + $tmp_addr_format = new AddressFormat(); + $tmp_addr_format->id_country = $id_country; + } + + $tmp_addr_format->format = Tools::getValue('address_layout'); + + if (strlen($tmp_addr_format->format) > 0) + { + if ($tmp_addr_format->checkFormatFields()) + $save_status = ($is_new) ? $tmp_addr_format->save(): $tmp_addr_format->update(); + else + { + $errorList = $tmp_addr_format->getErrorList(); + foreach($errorList as $numError => $error) + $this->_errors[] = $error; + } + + + if (!$save_status) + $this->_errors[] = Tools::displayError('Invalid address layout'.Db::getInstance()->getMsgError()); + } + unset($tmp_addr_format); + } + + return parent::postProcess(); + } + } + + private function _displayValidFields() + { + $html = '
    '; + $appendContainer = ''; + + $objectList = AddressFormat::getLiableClass('Address'); + $objectList['Address'] = NULL; + + // Get the available properties for each class + foreach($objectList as $className => &$object) + { + $fields = array(); + + $html .= '
  • + '.$className.''; + foreach(AddressFormat::getValidateFields($className) as $name) + $fields[] = ' + '.$name.''; + $html .= ' +
    + '.implode(', ', $fields).'
  • '; + unset($object); + } + return $html .= '
'; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + $defaultLayout = ''; + + $defaultLayoutTab = array( + array('firstname', 'lastname'), + array('company'), + array('vat_number'), + array('address1'), + array('address2'), + array('postcode', 'city'), + array('Country:name'), + array('phone')); + + if (!($obj = $this->loadObject(true))) + return; + + foreach ($defaultLayoutTab as $line) + $defaultLayout .= implode(' ', $line)."\r\n"; + + echo ' + + +
+ '.($obj->id ? '' : '').' +
'.$this->l('Countries').' + +
'; + + foreach ($this->_languages as $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name', 'name'); + echo '

'.$this->l('Name of country').'

+
+ +
+ * +

'.$this->l('2- or 3-letter ISO code, e.g., FR for France').'. '.$this->l('Official list here').'.

+
+ +
+ * +

'.$this->l('International call prefix, e.g., 33 for France.').'.

+
+ +
+ +
+ +
+ +

'.$this->l('Geographical zone where country is located').'

+
+ +
+ id OR $this->getFieldValue($obj, 'need_zip_code')) ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'need_zip_code') AND $obj->id) ? 'checked="checked" ' : '').'/> + +
+ +
+ * +

'.$this->l('National zip code (L for a letter, N for a number and C for the Iso code), e.g., NNNNN for France. No verification if undefined').'.

+
+ +
+
+ +
+
+ '.$this->l('Liable fields for the address information (click to have more details)').': '.$this->_displayValidFields().' +
+
+ +
+ +
+ id OR $this->getFieldValue($obj, 'active')) ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') AND $obj->id) ? 'checked="checked" ' : '').'/> + +

'.$this->l('Enabled or disabled').'

+
+ +
+ id OR $this->getFieldValue($obj, 'contains_states')) ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'contains_states') AND $obj->id) ? 'checked="checked" ' : '').'/> + +
+ +
+ id OR $this->getFieldValue($obj, 'need_identification_number')) ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'need_identification_number') AND $obj->id) ? 'checked="checked" ' : '').'/> + +
+
+ +
+ id OR $this->getFieldValue($obj, 'display_tax_label')) ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'display_tax_label') AND $obj->id) ? 'checked="checked" ' : '').'/> + +
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
+ '; + } +} + diff --git a/admin-dev/tabs/AdminCounty.php b/admin-dev/tabs/AdminCounty.php new file mode 100644 index 000000000..bf8fb7564 --- /dev/null +++ b/admin-dev/tabs/AdminCounty.php @@ -0,0 +1,219 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminCounty extends AdminTab +{ + public function __construct() + { + global $cookie; + + $this->table = 'county'; + $this->className = 'County'; + $this->edit = true; + $this->delete = true; + $this->_select = 's.`name` AS state'; + $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = a.`id_state`)'; + + $this->fieldsDisplay = array( + 'id_county' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('County'), 'width' => 130, 'filter_key' => 'b!name'), + 'state' => array('title' => $this->l('State'), 'width' => 70, 'filter_key' => 's!name'), + 'a!active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'a!active')); + + parent::__construct(); + } + + public function renderJS() + { + return + ''; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + $cur_id_country = 0; + $cur_id_state = 0; + if (isset($obj->id_state)) + { + $cur_state = new State($obj->id_state); + if (Validate::isLoadedObject($cur_state)) + { + $cur_id_country = $cur_state->id_country; + $cur_id_state = $cur_state->id; + } + } + + echo $this->renderJS(). + '
+ '.($obj->id ? '' : '').' +
'.$this->l('Counties').''; + + if (!isset($obj->id)) + echo '
'.$this->l('Save this county then you will be able to associate zipcodes').'

'; + + $countries = Country::getCountries($cookie->id_lang, true, true); + echo ' +
'; + + + echo ' +
+ +
+ '; + + echo + ' +
+ * +
+ +
+ id OR $this->getFieldValue($obj, 'active')) ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') AND $obj->id) ? 'checked="checked" ' : '').'/> + +

'.$this->l('Enabled or disabled').'

+
+
+   + +
'; + + echo '
* '.$this->l('Required field').'
'; + + if (isset($obj->id)) + { + echo ' +
+ '.$this->_renderZipCodeForm().'
+
+ '.AdminCounty::renderZipCodeList($obj->getZipCodes()).' +
'; + } + + echo ' +
+
'; + } + + + protected function _renderZipCodeForm() + { + return ' +
+ Add Zip Codes:
+ Add +
+
'; + } + + + public static function renderZipCodeList($zip_codes) + { + $html = ''; + foreach ($zip_codes AS $zip_code) + { + $full_zip_code = $zip_code['from_zip_code']; + if ($zip_code['to_zip_code'] != 0) + $full_zip_code .= '-'.$zip_code['to_zip_code']; + + $html .= '
'.Tools::htmlentitiesUTF8($full_zip_code).'
'; + } + + return $html; + } +} + diff --git a/admin-dev/tabs/AdminCurrencies.php b/admin-dev/tabs/AdminCurrencies.php new file mode 100644 index 000000000..cebf64915 --- /dev/null +++ b/admin-dev/tabs/AdminCurrencies.php @@ -0,0 +1,240 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7300 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php'); + +class AdminCurrencies extends AdminTab +{ + public function __construct() + { + $this->table = 'currency'; + $this->className = 'Currency'; + $this->lang = false; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'id_currency' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Currency'), 'width' => 100), + 'iso_code' => array('title' => $this->l('ISO code'), 'align' => 'center', 'width' => 35), + 'iso_code_num' => array('title' => $this->l('ISO code num'), 'align' => 'center', 'width' => 35), + 'sign' => array('title' => $this->l('Symbol'), 'width' => 20, 'align' => 'center', 'orderby' => false, 'search' => false), + 'conversion_rate' => array('title' => $this->l('Conversion rate'), 'float' => true, 'align' => 'center', 'width' => 50, 'search' => false), + 'active' => array('title' => $this->l('Enabled'), 'width' => 25, 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false)); + + $this->optionTitle = $this->l('Currencies options'); + $this->_fieldsOptions = array( + 'PS_CURRENCY_DEFAULT' => array( + 'title' => $this->l('Default currency:'), + 'desc' => $this->l('The default currency used in shop') + .'
'.$this->l('If you change default currency, you will have to manually edit every product price.').'
', + 'cast' => 'intval', + 'type' => 'select', + 'identifier' => 'id_currency', + 'list' => Currency::getCurrencies() + ), + ); + $this->_where = 'AND a.`deleted` = 0'; + + parent::__construct(); + } + + public function postProcess() + { + global $currentIndex; + + if (isset($_GET['delete'.$this->table])) + { + if ($this->tabAccess['delete'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->id == Configuration::get('PS_CURRENCY_DEFAULT')) + $this->_errors[] = $this->l('You can\'t delete the default currency'); + elseif ($object->delete()) + Tools::redirectAdmin($currentIndex.'&conf=1'.'&token='.$this->token); + else + $this->_errors[] = Tools::displayError('An error occurred during deletion.'); + } + else + $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + elseif ((isset($_GET['status'.$this->table]) OR isset($_GET['status'])) AND Tools::getValue($this->identifier)) + { + if ($this->tabAccess['edit'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->active AND $object->id == Configuration::get('PS_CURRENCY_DEFAULT')) + $this->_errors[] = $this->l('You can\'t disable the default currency'); + elseif ($object->toggleStatus()) + Tools::redirectAdmin($currentIndex.'&conf=5'.((($id_category = (int)(Tools::getValue('id_category'))) AND Tools::getValue('id_product')) ? '&id_category='.$id_category : '').'&token='.$this->token); + else + $this->_errors[] = Tools::displayError('An error occurred while updating status.'); + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + elseif (Tools::getValue('submitOptions'.$this->table)) + { + foreach ($this->_fieldsOptions as $key => $field) + { + Configuration::updateValue($key, $field['cast'](Tools::getValue($key))); + if ($key == 'PS_CURRENCY_DEFAULT') + Currency::refreshCurrencies(); + } + Tools::redirectAdmin($currentIndex.'&conf=6'.'&token='.$this->token); + } + elseif (Tools::isSubmit('submitExchangesRates')) + { + if (!$this->_errors[] = Currency::refreshCurrencies()) + Tools::redirectAdmin($currentIndex.'&conf=6'.'&token='.$this->token); + } + else + parent::postProcess(); + } + + public function displayOptionsList() + { + global $currentIndex; + + parent::displayOptionsList(); + echo '

+
+
+ '.$this->l('Currency rates').' + +
+

'.$this->l('Update your currencies exchanges rates with a real-time tool').'

+
+
+ +
+
+
'; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Currencies').' + +
+ * + '.$this->l('Only letters and the minus character are allowed').'  +

'.$this->l('Will appear on Front Office, e.g., euro, dollar').'...

+
+ +
+ * +   +

'.$this->l('ISO code, e.g., USD for dollar, EUR for euro').'...

+
+ +
+ * +   +

'.$this->l('Numeric ISO code, e.g., 840 for dollar, 978 for euro').'...

+
+ +
+ * +

'.$this->l('Will appear on Front Office, e.g., €, $').'...

+
+ +
+ * +

'.$this->l('Conversion rate from one unit of your shop\'s default currency (for example, 1€) to this currency. For example, if the default currency is euros and this currency is dollars, type \'1.20\'').' 1€ = $1.20

+
+ +
+ +

'.$this->l('Applies to all prices, e.g.,').' $1,240.15

+
+ +
+ getFieldValue($obj, 'decimals') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'decimals') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Display decimals on prices').'

+
+ +
+ getFieldValue($obj, 'blank') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'blank') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Include a blank between sign and price, e.g.,').'
$1,240.15 -> $ 1,240.15

+
+ +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} + diff --git a/admin-dev/tabs/AdminCustomerThreads.php b/admin-dev/tabs/AdminCustomerThreads.php new file mode 100644 index 000000000..af6f9bd30 --- /dev/null +++ b/admin-dev/tabs/AdminCustomerThreads.php @@ -0,0 +1,605 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminCustomerThreads extends AdminTab +{ + public function __construct() + { + global $cookie; + + $this->table = 'customer_thread'; + $this->lang = false; + $this->className = 'CustomerThread'; + $this->edit = false; + $this->view = true; + $this->delete = true; + + $this->_select = 'CONCAT(c.firstname," ",c.lastname) as customer, cl.name as contact, l.name as language, group_concat(message) as messages, ( + SELECT IFNULL(CONCAT(LEFT(e.firstname, 1),". ",e.lastname), "--") + FROM '._DB_PREFIX_.'customer_message cm2 INNER JOIN '._DB_PREFIX_.'employee e ON e.id_employee = cm2.id_employee + WHERE cm2.id_employee > 0 AND cm2.`id_customer_thread` = a.`id_customer_thread` + ORDER BY cm2.date_add DESC LIMIT 1) as employee'; + $this->_group = 'GROUP BY cm.id_customer_thread'; + $this->_join = ' + LEFT JOIN `'._DB_PREFIX_.'customer` c ON c.`id_customer` = a.`id_customer` + LEFT JOIN `'._DB_PREFIX_.'customer_message` cm ON cm.`id_customer_thread` = a.`id_customer_thread` + LEFT JOIN `'._DB_PREFIX_.'lang` l ON l.`id_lang` = a.`id_lang` + LEFT JOIN `'._DB_PREFIX_.'contact_lang` cl ON (cl.`id_contact` = a.`id_contact` AND cl.`id_lang` = '.(int)$cookie->id_lang.')'; + + $contactArray = array(); + $contacts = Contact::getContacts($cookie->id_lang); + foreach ($contacts AS $contact) + $contactArray[$contact['id_contact']] = $contact['name']; + + $languageArray = array(); + $languages = Language::getLanguages(); + foreach ($languages AS $language) + $languageArray[$language['id_lang']] = $language['name']; + + $statusArray = array( + 'open' => $this->l('Open'), + 'closed' => $this->l('Closed'), + 'pending1' => $this->l('Pending 1'), + 'pending2' => $this->l('Pending 2') + ); + + $imagesArray = array( + 'open' => 'status_green.gif', + 'closed' => 'status_red.gif', + 'pending1' => 'status_orange.gif', + 'pending2' => 'status_orange.gif' + ); + + $this->fieldsDisplay = array( + 'id_customer_thread' => array('title' => $this->l('ID'), 'width' => 25), + 'customer' => array('title' => $this->l('Customer'), 'width' => 100, 'filter_key' => 'customer', 'tmpTableFilter' => true), + 'email' => array('title' => $this->l('E-mail'), 'width' => 100, 'filter_key' => 'a!email'), + 'contact' => array('title' => $this->l('Type'), 'width' => 75, 'type' => 'select', 'select' => $contactArray, 'filter_key' => 'cl!id_contact', 'filter_type' => 'int'), + 'language' => array('title' => $this->l('Language'), 'width' => 60, 'type' => 'select', 'select' => $languageArray, 'filter_key' => 'l!id_lang', 'filter_type' => 'int'), + 'status' => array('title' => $this->l('Status'), 'width' => 50, 'type' => 'select', 'select' => $statusArray, 'icon' => $imagesArray, 'align' => 'center', 'filter_key' => 'a!status', 'filter_type' => 'string'), + 'employee' => array('title' => $this->l('Employee'), 'width' => 100, 'filter_key' => 'employee', 'tmpTableFilter' => true), + 'messages' => array('title' => $this->l('Messages'), 'width' => 50, 'filter_key' => 'messages', 'tmpTableFilter' => true, 'maxlength' => 0), + 'date_upd' => array('title' => $this->l('Last message'), 'width' => 90) + ); + $this->shopLinkType = 'shop'; + + parent::__construct(); + } + + public function postProcess() + { + global $currentIndex, $cookie, $link; + + if ($id_customer_thread = (int)Tools::getValue('id_customer_thread')) + { + if (($id_contact = (int)Tools::getValue('id_contact'))) + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'customer_thread SET id_contact = '.(int)$id_contact.' WHERE id_customer_thread = '.(int)$id_customer_thread); + if ($id_status = (int)Tools::getValue('setstatus')) + { + $statusArray = array(1 => 'open', 2 => 'closed', 3 => 'pending1', 4 => 'pending2'); + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'customer_thread SET status = "'.$statusArray[$id_status].'" WHERE id_customer_thread = '.(int)$id_customer_thread.' LIMIT 1'); + } + if (isset($_POST['id_employee_forward'])) + { + // Todo: need to avoid doubles + $messages = Db::getInstance()->ExecuteS(' + SELECT ct.*, cm.*, cl.name subject, CONCAT(e.firstname, \' \', e.lastname) employee_name, CONCAT(c.firstname, \' \', c.lastname) customer_name, c.firstname + FROM '._DB_PREFIX_.'customer_thread ct + LEFT JOIN '._DB_PREFIX_.'customer_message cm ON (ct.id_customer_thread = cm.id_customer_thread) + LEFT JOIN '._DB_PREFIX_.'contact_lang cl ON (cl.id_contact = ct.id_contact AND cl.id_lang = '.(int)$cookie->id_lang.') + LEFT OUTER JOIN '._DB_PREFIX_.'employee e ON e.id_employee = cm.id_employee + LEFT OUTER JOIN '._DB_PREFIX_.'customer c ON (c.email = ct.email) + WHERE ct.id_customer_thread = '.(int)Tools::getValue('id_customer_thread').' + ORDER BY cm.date_add DESC'); + $output = ''; + foreach ($messages AS $message) + $output .= $this->displayMsg($message, true, (int)Tools::getValue('id_employee_forward')); + + $cm = new CustomerMessage(); + $cm->id_employee = (int)$cookie->id_employee; + $cm->id_customer_thread = (int)Tools::getValue('id_customer_thread'); + $cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']); + $currentEmployee = new Employee($cookie->id_employee); + if (($id_employee = (int)Tools::getValue('id_employee_forward')) AND ($employee = new Employee($id_employee)) AND Validate::isLoadedObject($employee)) + { + $params = array( + '{messages}' => $output, + '{employee}' => $currentEmployee->firstname.' '.$currentEmployee->lastname, + '{comment}' => stripslashes($_POST['message_forward'])); + Mail::Send((int)($cookie->id_lang), 'forward_msg', Mail::l('Fwd: Customer message'), $params, + $employee->email, $employee->firstname.' '.$employee->lastname, + $currentEmployee->email, $currentEmployee->firstname.' '.$currentEmployee->lastname); + $cm->message = $this->l('Message forwarded to').' '.$employee->firstname.' '.$employee->lastname."\n".$this->l('Comment:').' '.$_POST['message_forward']; + $cm->add(); + } + elseif (($email = Tools::getValue('email')) AND Validate::isEmail($email)) + { + $params = array( + '{messages}' => $output, + '{employee}' => $currentEmployee->firstname.' '.$currentEmployee->lastname, + '{comment}' => stripslashes($_POST['message_forward'])); + Mail::Send((int)($cookie->id_lang), 'forward_msg', Mail::l('Fwd: Customer message'), $params, + $email, NULL, + $currentEmployee->email, $currentEmployee->firstname.' '.$currentEmployee->lastname); + $cm->message = $this->l('Message forwarded to').' '.$email."\n".$this->l('Comment:').' '.$_POST['message_forward']; + $cm->add(); + } + else + echo '
'.Tools::displayError('Email invalid.').'
'; + } + if (Tools::isSubmit('submitReply')) + { + $ct = new CustomerThread($id_customer_thread); + $cm = new CustomerMessage(); + $cm->id_employee = (int)$cookie->id_employee; + $cm->id_customer_thread = $ct->id; + $cm->message = Tools::htmlentitiesutf8(nl2br2(Tools::getValue('reply_message'))); + $cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']); + if (isset($_FILES) AND !empty($_FILES['joinFile']['name']) AND $_FILES['joinFile']['error'] != 0) + $this->_errors[] = Tools::displayError('An error occurred with the file upload.'); + else if ($cm->add()) + { + $fileAttachment = NULL; + if (!empty($_FILES['joinFile']['name'])) + { + $fileAttachment['content'] = file_get_contents($_FILES['joinFile']['tmp_name']); + $fileAttachment['name'] = $_FILES['joinFile']['name']; + $fileAttachment['mime'] = $_FILES['joinFile']['type']; + } + $params = array( + '{reply}' => nl2br2(Tools::getValue('reply_message')), + '{link}' => Tools::url($link->getPageLink('contact', true), 'id_customer_thread='.(int)($ct->id).'&token='.$ct->token), + ); + Mail::Send($ct->id_lang, 'reply_msg', Mail::l('An answer to your message is available'), $params, Tools::getValue('msg_email'), NULL, NULL, NULL, $fileAttachment); + $ct->status = 'closed'; + $ct->update(); + Tools::redirectAdmin($currentIndex.'&id_customer_thread='.(int)$id_customer_thread.'&viewcustomer_thread&token='.Tools::getValue('token')); + } + else + $this->_errors[] = Tools::displayError('An error occurred, your message was not sent. Please contact your system administrator.'); + } + } + + return parent::postProcess(); + } + + public function display() + { + global $cookie; + + if (isset($_GET['filename']) AND file_exists(_PS_UPLOAD_DIR_.$_GET['filename'])) + self::openUploadedFile(); + else if (isset($_GET['view'.$this->table])) + $this->viewcustomer_thread(); + else + { + $this->getList((int)$cookie->id_lang, !Tools::getValue($this->table.'Orderby') ? 'date_upd' : NULL, !Tools::getValue($this->table.'Orderway') ? 'DESC' : NULL); + $this->displayList(); + } + } + + public function displayListHeader($token = NULL) + { + global $currentIndex, $cookie; + + $contacts = Db::getInstance()->ExecuteS(' + SELECT cl.*, COUNT(*) as total, ( + SELECT id_customer_thread + FROM '._DB_PREFIX_.'customer_thread ct2 + WHERE status = "open" AND ct.id_contact = ct2.id_contact + ORDER BY date_upd ASC + LIMIT 1 + ) as id_customer_thread + FROM '._DB_PREFIX_.'customer_thread ct + LEFT JOIN '._DB_PREFIX_.'contact_lang cl ON (cl.id_contact = ct.id_contact AND cl.id_lang = '.$cookie->id_lang.') + WHERE ct.status = "open" + GROUP BY ct.id_contact HAVING COUNT(*) > 0'); + $categories = Db::getInstance()->ExecuteS(' + SELECT cl.* + FROM '._DB_PREFIX_.'contact ct + LEFT JOIN '._DB_PREFIX_.'contact_lang cl ON (cl.id_contact = ct.id_contact AND cl.id_lang = '.$cookie->id_lang.') + WHERE ct.customer_service = 1'); + $dim = count($categories); + + echo '
'; + foreach ($categories as $key => $val) + { + $totalThread = 0; + $id_customer_thread = 0; + foreach ($contacts as $tmp => $tmp2) + if ($val['id_contact'] == $tmp2['id_contact']) + { + $totalThread = $tmp2['total']; + $id_customer_thread = $tmp2['id_customer_thread']; + break; + } + echo '
+

 '.$val['name'].'

'. + ($dim > 6 ? '' : '

'.$val['description'].'

'). + ($totalThread == 0 ? '

'.$this->l('No new message').'

' + : ''.$totalThread.' '.($totalThread > 1 ? $this->l('new messages'): $this->l('new message')).'').' +
'; + } + echo '
'; + + $params = array( + $this->l('Total threads') => $all = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'customer_thread'), + $this->l('Threads pending') => $pending = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'customer_thread WHERE status LIKE "%pending%"'), + $this->l('Total customer messages') => Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'customer_message WHERE id_employee = 0'), + $this->l('Total employee messages') => Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'customer_message WHERE id_employee != 0'), + $this->l('Threads unread') => $unread = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'customer_thread WHERE status = "open"'), + $this->l('Threads closed') => $all - ($unread + $pending)); + + echo '
+

'.$this->l('Customer service').' : '.$this->l('Statistics').'

+ '; + $count = 0; + foreach ($params as $key => $val) + echo ''; + echo '
'.$key.''.$val.'
+

 

'; + parent::displayListHeader($token); + } + + private function openUploadedFile() + { + $filename = $_GET['filename']; + + $extensions = array('.txt' => 'text/plain', '.rtf' => 'application/rtf', '.doc' => 'application/msword', '.docx'=> 'application/msword', + '.pdf' => 'application/pdf', '.zip' => 'multipart/x-zip', '.png' => 'image/png', '.jpeg' => 'image/jpeg', '.gif' => 'image/gif', '.jpg' => 'image/jpeg'); + + $extension = ''; + foreach ($extensions AS $key => $val) + if (substr($filename, -4) == $key OR substr($filename, -5) == $key) + { + $extension = $val; + break; + } + + ob_end_clean(); + header('Content-Type: '.$extension); + header('Content-Disposition:attachment;filename="'.$filename.'"'); + readfile(_PS_UPLOAD_DIR_.$filename); + die; + } + private function displayMsg($message, $email = false, $id_employee = null) + { + global $cookie, $currentIndex; + + $customersToken = Tools::getAdminToken('AdminCustomers'.(int)(Tab::getIdFromClassName('AdminCustomers')).(int)($cookie->id_employee)); + $contacts = Contact::getContacts($cookie->id_lang); + + if (!$email) + { + if (!empty($message['id_product']) AND empty($message['employee_name'])) + $id_order_product = Db::getInstance()->getValue(' + SELECT o.id_order + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'order_detail od ON o.id_order = od.id_order + WHERE o.id_customer = '.(int)$message['id_customer'].' + AND od.product_id = '.(int)$message['id_product'].' + ORDER BY o.date_add DESC'); + + $output = ' +
+ '.( + !empty($message['employee_name']) + ? ''.Configuration::get('PS_SHOP_NAME').' '.Configuration::get('PS_SHOP_NAME').' - '.$message['employee_name'] + : ''.Configuration::get('PS_SHOP_NAME').' '.( + !empty($message['id_customer']) + ? ''.$message['customer_name'].'' + : $message['email'] + ) + ).' +
'.( + (!empty($message['id_customer']) AND empty($message['employee_name'])) + ? ''.$this->l('Customer ID:').' '.(int)($message['id_customer']).' '.$this->l('view').'
' + : '' + ).' + '.$this->l('Sent on:').' '.Tools::displayDate($message['date_add'], (int)($cookie->id_lang), true).'
'.( + empty($message['employee_name']) + ? ''.$this->l('Browser:').' '.strip_tags($message['user_agent']).'
' + : '' + ).( + (!empty($message['file_name']) AND file_exists(_PS_UPLOAD_DIR_.$message['file_name'])) + ? ''.$this->l('File attachment').' '.$this->l('view').'
' + : '' + ).( + (!empty($message['id_order']) AND empty($message['employee_name'])) + ? ''.$this->l('Order #').' '.(int)($message['id_order']).' '.$this->l('view').'
' + : '' + ).( + (!empty($message['id_product']) AND empty($message['employee_name'])) + ? ''.$this->l('Product #').' '.(int)($message['id_product']).' '.$this->l('view').'
' + : '' + ).'
+
+ '.$this->l('Subject:').' + + +
'; + } + else + { + $output = '
+ '.($id_employee ? ''.$this->l('View this thread').'
' : '').' + '.$this->l('Sent by:').' '.(!empty($message['customer_name']) ? $message['customer_name'].' ('.$message['email'].')' : $message['email']) + .((!empty($message['id_customer']) AND empty($message['employee_name'])) ? '
'.$this->l('Customer ID:').' '.(int)($message['id_customer']).'
' : '') + .((!empty($message['id_order']) AND empty($message['employee_name'])) ? '
'.$this->l('Order #').': '.(int)($message['id_order']).'
' : '') + .((!empty($message['id_product']) AND empty($message['employee_name'])) ? '
'.$this->l('Product #').': '.(int)($message['id_product']).'
' : '') + .'
'.$this->l('Subject:').' '.$message['subject']; + } + + $message['message'] = preg_replace('/(https?:\/\/[a-z0-9#%&_=\(\)\.\? \+\-@\/]{6,1000})([\s\n<])/Uui', '\1\2', html_entity_decode($message['message'], ENT_NOQUOTES, 'UTF-8')); + $output .= '

+ '.$this->l('Thread ID:').' '.(int)$message['id_customer_thread'].'
+ '.$this->l('Message ID:').' '.(int)$message['id_customer_message'].'
+ '.$this->l('Message:').'
+ '.$message['message'].' +
'; + + if (!$email) + { + if (empty($message['employee_name'])) + $output .= ' +

+ +

+
'; + } + + return $output; + } + + public function viewcustomer_thread() + { + global $cookie, $currentIndex; + + if (!($thread = $this->loadObject())) + return; + $cookie->{'customer_threadFilter_cl!id_contact'} = $thread->id_contact; + + $employees = Db::getInstance()->ExecuteS(' + SELECT e.id_employee, e.firstname, e.lastname FROM '._DB_PREFIX_.'employee e + WHERE e.active = 1 ORDER BY e.lastname ASC'); + + echo ' +

'.$this->l('Messages').'

+
+

+ '.$this->l('Forward this discussion to an employee:').' + +

+ +

+
+
 
'; + + $messages = Db::getInstance()->ExecuteS(' + SELECT ct.*, cm.*, cl.name subject, CONCAT(e.firstname, \' \', e.lastname) employee_name, CONCAT(c.firstname, \' \', c.lastname) customer_name, c.firstname + FROM '._DB_PREFIX_.'customer_thread ct + LEFT JOIN '._DB_PREFIX_.'customer_message cm ON (ct.id_customer_thread = cm.id_customer_thread) + LEFT JOIN '._DB_PREFIX_.'contact_lang cl ON (cl.id_contact = ct.id_contact AND cl.id_lang = '.(int)$cookie->id_lang.') + LEFT JOIN '._DB_PREFIX_.'employee e ON e.id_employee = cm.id_employee + LEFT JOIN '._DB_PREFIX_.'customer c ON (IFNULL(ct.id_customer, ct.email) = IFNULL(c.id_customer, c.email)) + WHERE ct.id_customer_thread = '.(int)Tools::getValue('id_customer_thread').' + ORDER BY cm.date_add DESC'); + + echo '
'; + + $nextThread = Db::getInstance()->getValue(' + SELECT id_customer_thread FROM '._DB_PREFIX_.'customer_thread ct + WHERE ct.status = "open" AND ct.date_upd = ( + SELECT date_add FROM '._DB_PREFIX_.'customer_message + WHERE (id_employee IS NULL OR id_employee = 0) AND id_customer_thread = '.(int)$thread->id.' + ORDER BY date_add DESC LIMIT 1 + ) + '.($cookie->{'customer_threadFilter_cl!id_contact'} ? 'AND ct.id_contact = '.(int)$cookie->{'customer_threadFilter_cl!id_contact'} : '').' + '.($cookie->{'customer_threadFilter_l!id_lang'} ? 'AND ct.id_lang = '.(int)$cookie->{'customer_threadFilter_l!id_lang'} : ''). + ' ORDER BY ct.date_upd ASC'); + + if ($nextThread) + echo $this->displayButton(' + + +
'.$this->l('Answer to the next unanswered message in this category').' > +
'); + else + echo $this->displayButton(' + +
'.$this->l('The other messages in this category have been answered')); + + if ($thread->status != "closed") + echo $this->displayButton(' + + +
'.$this->l('Set this message as handled').' +
'); + + if ($thread->status != "pending1") + echo $this->displayButton(' + + +
'.$this->l('Declare this message').'
'.$this->l('as "pending 1"').'
'.$this->l('(will be answered later)').' +
'); + else + echo $this->displayButton(' + + +
'.$this->l('Click here to disable pending status').' +
'); + + if ($thread->status != "pending2") + echo $this->displayButton(' + + +
'.$this->l('Declare this message').'
'.$this->l('as "pending 2"').'
'.$this->l('(will be answered later)').' +
'); + else + echo $this->displayButton(' + + +
'.$this->l('Click here to disable pending status').' +
'); + + echo '
'; + + if ($thread->id_customer) + { + $customer = new Customer($thread->id_customer); + $products = $customer->getBoughtProducts(); + $orders = Order::getCustomerOrders($customer->id); + + echo '
'; + if ($orders AND sizeof($orders)) + { + $totalOK = 0; + $ordersOK = array(); + $tokenOrders = Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee)); + foreach ($orders as $order) + if ($order['valid']) + { + $ordersOK[] = $order; + $totalOK += $order['total_paid_real']; + } + if ($countOK = sizeof($ordersOK)) + { + echo '
+

'.$this->l('Orders').'

+ + + + + + + + + + '; + $irow = 0; + foreach ($ordersOK AS $order) + echo ' + + + + + + + + '; + echo '
'.$this->l('ID').''.$this->l('Date').''.$this->l('Products').''.$this->l('Total paid').''.$this->l('Payment').''.$this->l('State').''.$this->l('Actions').'
'.$order['id_order'].''.Tools::displayDate($order['date_add'], (int)($cookie->id_lang)).''.$order['nb_products'].''.Tools::displayPrice($order['total_paid_real'], new Currency((int)($order['id_currency']))).''.$order['payment'].''.$order['order_state'].'
+

'.$this->l('Validated Orders:').' '.$countOK.' '.$this->l('for').' '.Tools::displayPrice($totalOK, new Currency(Configuration::get('PS_CURRENCY_DEFAULT'))).'

+
'; + } + } + if ($products AND sizeof($products)) + { + echo '
+

'.$this->l('Products').'

+ + + + + + + + '; + $irow = 0; + $tokenOrders = Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee)); + foreach ($products AS $product) + echo ' + + + + + + + '; + echo '
'.$this->l('Date').''.$this->l('ID').''.$this->l('Name').''.$this->l('Quantity').''.$this->l('Actions').'
'.Tools::displayDate($product['date_add'], (int)($cookie->id_lang), true).''.$product['product_id'].''.$product['product_name'].''.$product['product_quantity'].'
'; + } + echo '
'; + } + + echo '
'; + foreach ($messages AS $message) + echo $this->displayMsg($message); + echo '
 
'; + } + + private function displayButton($content) + { + return ' +
+

+ '.$content.' +

+
'; + } +} + diff --git a/admin-dev/tabs/AdminCustomers.php b/admin-dev/tabs/AdminCustomers.php new file mode 100644 index 000000000..1a0f8c824 --- /dev/null +++ b/admin-dev/tabs/AdminCustomers.php @@ -0,0 +1,861 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7320 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminCustomers extends AdminTab +{ + public function __construct() + { + $this->table = 'customer'; + $this->className = 'Customer'; + $this->lang = false; + $this->edit = true; + $this->view = true; + $this->delete = true; + $this->deleted = true; + $this->requiredDatabase = true; + + $this->_select = '(YEAR(CURRENT_DATE)-YEAR(`birthday`)) - (RIGHT(CURRENT_DATE, 5) $this->l('M'), 2 => $this->l('F'), 9 => $this->l('?')); + $this->fieldsDisplay = array( + 'id_customer' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'id_gender' => array('title' => $this->l('Gender'), 'width' => 25, 'align' => 'center', 'icon' => array(1 => 'male.gif', 2 => 'female.gif', 'default' => 'unknown.gif'), 'orderby' => false, 'type' => 'select', 'select' => $genders, 'filter_key' => 'a!id_gender'), + 'lastname' => array('title' => $this->l('Last Name'), 'width' => 80), + 'firstname' => array('title' => $this->l('First name'), 'width' => 60), + 'email' => array('title' => $this->l('E-mail address'), 'width' => 120, 'maxlength' => 19), + 'age' => array('title' => $this->l('Age'), 'width' => 30, 'search' => false), + 'active' => array('title' => $this->l('Enabled'), 'width' => 25, 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false), + 'newsletter' => array('title' => $this->l('News.'), 'width' => 25, 'align' => 'center', 'type' => 'bool', 'callback' => 'printNewsIcon', 'orderby' => false), + 'optin' => array('title' => $this->l('Opt.'), 'width' => 25, 'align' => 'center', 'type' => 'bool', 'callback' => 'printOptinIcon', 'orderby' => false), + 'date_add' => array('title' => $this->l('Registration'), 'width' => 30, 'type' => 'date', 'align' => 'right'), + 'connect' => array('title' => $this->l('Connection'), 'width' => 60, 'type' => 'datetime', 'search' => false)); + + $this->shopLinkType = 'shop'; + $this->shopShareDatas = true; + $this->optionTitle = $this->l('Customers options'); + $this->_fieldsOptions = array( + 'PS_PASSWD_TIME_FRONT' => array('title' => $this->l('Regenerate password:'), 'desc' => $this->l('Security minimum time to wait to regenerate the password'),'validation' => 'isUnsignedInt', 'cast' => 'intval', 'size' => 5, 'type' => 'text', 'suffix' => ' '.$this->l('minutes')) + ); + + parent::__construct(); + } + + public function postProcess() + { + global $currentIndex; + + if (Tools::isSubmit('submitDel'.$this->table) OR Tools::isSubmit('delete'.$this->table)) + { + $deleteForm = ' +
+
'.$this->l('How do you want to delete your customer(s)?').' + '.$this->l('You have two ways to delete a customer, please choose what you want to do.').' +

+ + +

+

+ + +

'; + foreach ($_POST as $key => $value) + if (is_array($value)) + foreach ($value as $val) + $deleteForm .= ''; + else + $deleteForm .= ''; + $deleteForm .= '
+
+
+
 
'; + } + + if (Tools::getValue('submitAdd'.$this->table)) + { + $groupList = Tools::getValue('groupBox'); + + /* Checking fields validity */ + $this->validateRules(); + if (!sizeof($this->_errors)) + { + $id = (int)(Tools::getValue('id_'.$this->table)); + if (isset($id) AND !empty($id)) + { + if ($this->tabAccess['edit'] !== '1') + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + else + { + $object = new $this->className($id); + if (Validate::isLoadedObject($object)) + { + $customer_email = strval(Tools::getValue('email')); + + // check if e-mail already used + if ($customer_email != $object->email) + { + $customer = new Customer(); + $customer->getByEmail($customer_email); + if ($customer->id) + $this->_errors[] = Tools::displayError('An account already exists for this e-mail address:').' '.$customer_email; + } + + if (!is_array($groupList) OR sizeof($groupList) == 0) + $this->_errors[] = Tools::displayError('Customer must be in at least one group.'); + else + if (!in_array(Tools::getValue('id_default_group'), $groupList)) + $this->_errors[] = Tools::displayError('Default customer group must be selected in group box.'); + + // Updating customer's group + if (!sizeof($this->_errors)) + { + $object->cleanGroups(); + if (is_array($groupList) AND sizeof($groupList) > 0) + $object->addGroups($groupList); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while loading object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + } + else + { + if ($this->tabAccess['add'] === '1') + { + $object = new $this->className(); + $this->copyFromPost($object, $this->table); + $shop = new Shop((int)$object->id_shop); + $object->id_group_shop = (int)$shop->id_group_shop; + if (!$object->add()) + $this->_errors[] = Tools::displayError('An error occurred while creating object.').' '.$this->table.' ('.mysql_error().')'; + elseif (($_POST[$this->identifier] = $object->id /* voluntary */) AND $this->postImage($object->id) AND !sizeof($this->_errors) AND $this->_redirect) + { + // Add Associated groups + $group_list = Tools::getValue('groupBox'); + if (is_array($group_list) && sizeof($group_list) > 0) + $object->addGroups($group_list, true); + $parent_id = (int)(Tools::getValue('id_parent', 1)); + // Save and stay on same form + if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=3&update'.$this->table.'&token='.$this->token); + // Save and back to parent + if (Tools::isSubmit('submitAdd'.$this->table.'AndBackToParent')) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$parent_id.'&conf=3&token='.$this->token); + // Default behavior (save and back) + Tools::redirectAdmin($currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=3&token='.$this->token); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + } + } + elseif (Tools::isSubmit('delete'.$this->table) AND $this->tabAccess['delete'] === '1') + { + switch (Tools::getValue('deleteMode')) + { + case 'real': + $this->deleted = false; + Discount::deleteByIdCustomer((int)(Tools::getValue('id_customer'))); + break; + case 'deleted': + $this->deleted = true; + break; + default: + echo $deleteForm; + if (isset($_POST['delete'.$this->table])) + unset($_POST['delete'.$this->table]); + if (isset($_GET['delete'.$this->table])) + unset($_GET['delete'.$this->table]); + break; + } + } + elseif (Tools::isSubmit('submitDel'.$this->table) AND $this->tabAccess['delete'] === '1') + { + switch (Tools::getValue('deleteMode')) + { + case 'real': + $this->deleted = false; + foreach (Tools::getValue('customerBox') as $id_customer) + Discount::deleteByIdCustomer((int)($id_customer)); + break; + case 'deleted': + $this->deleted = true; + break; + default: + echo $deleteForm; + if (isset($_POST['submitDel'.$this->table])) + unset($_POST['submitDel'.$this->table]); + if (isset($_GET['submitDel'.$this->table])) + unset($_GET['submitDel'.$this->table]); + break; + } + } + elseif (Tools::isSubmit('submitGuestToCustomer') AND Tools::getValue('id_customer')) + { + if ($this->tabAccess['edit'] === '1') + { + $customer = new Customer((int)Tools::getValue('id_customer')); + if (!Validate::isLoadedObject($customer)) + $this->_errors[] = Tools::displayError('This customer does not exist.'); + if(Customer::customerExists($customer->email)) + $this->_errors[] = Tools::displayError('This customer already exist as non-guest.'); + elseif ($customer->transformToCustomer(Tools::getValue('id_lang', Configuration::get('PS_LANG_DEFAULT')))) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$customer->id.'&conf=3&token='.$this->token); + else + $this->_errors[] = Tools::displayError('An error occurred while updating customer.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + }elseif (Tools::isSubmit('changeNewsletterVal') AND Tools::getValue('id_customer')) + { + $id_customer = (int)Tools::getValue('id_customer'); + $customer = new Customer($id_customer); + if (!Validate::isLoadedObject($customer)) + $this->_errors[] = Tools::displayError('An error occurred while updating customer.'); + $update = Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customer` SET newsletter = '.($customer->newsletter ? 0 : 1).' WHERE `id_customer` = '.(int)($customer->id)); + if (!$update) + $this->_errors[] = Tools::displayError('An error occurred while updating customer.'); + Tools::redirectAdmin($currentIndex.'&token='.$this->token); + + }elseif (Tools::isSubmit('changeOptinVal') AND Tools::getValue('id_customer')) + { + $id_customer = (int)Tools::getValue('id_customer'); + $customer = new Customer($id_customer); + if (!Validate::isLoadedObject($customer)) + $this->_errors[] = Tools::displayError('An error occurred while updating customer.'); + $update = Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customer` SET optin = '.($customer->optin ? 0 : 1).' WHERE `id_customer` = '.(int)($customer->id)); + if (!$update) + $this->_errors[] = Tools::displayError('An error occurred while updating customer.'); + Tools::redirectAdmin($currentIndex.'&token='.$this->token); + } + + return parent::postProcess(); + } + + public function viewcustomer() + { + global $currentIndex, $cookie, $link; + + $irow = 0; + $configurations = Configuration::getMultiple(array('PS_LANG_DEFAULT', 'PS_CURRENCY_DEFAULT')); + $defaultLanguage = (int)($configurations['PS_LANG_DEFAULT']); + $defaultCurrency = (int)($configurations['PS_CURRENCY_DEFAULT']); + if (!($customer = $this->loadObject())) + return; + $customerStats = $customer->getStats(); + $addresses = $customer->getAddresses($defaultLanguage); + $products = $customer->getBoughtProducts(); + $discounts = Discount::getCustomerDiscounts($defaultLanguage, (int)$customer->id, false, false); + $orders = Order::getCustomerOrders((int)$customer->id, true); + $carts = Cart::getCustomerCarts((int)$customer->id); + $groups = $customer->getGroups(); + $messages = CustomerThread::getCustomerMessages((int)$customer->id); + $referrers = Referrer::getReferrers((int)$customer->id); + if ($totalCustomer = Db::getInstance()->getValue('SELECT SUM(total_paid_real) FROM '._DB_PREFIX_.'orders WHERE id_customer = '.$customer->id.' AND valid = 1')) + { + Db::getInstance()->getValue('SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM '._DB_PREFIX_.'orders WHERE valid = 1 GROUP BY id_customer HAVING SUM(total_paid_real) > '.$totalCustomer); + $countBetterCustomers = (int)Db::getInstance()->getValue('SELECT FOUND_ROWS()') + 1; + } + else + $countBetterCustomers = '-'; + + $shop = new Shop((int)$customer->id_shop); + + echo ' +
+ '.$customer->firstname.' '.$customer->lastname.' +
+ '.$customer->email.'

+ '.$this->l('ID:').' '.sprintf('%06d', $customer->id).'
+ '.$this->l('Registration date:').' '.Tools::displayDate($customer->date_add, (int)($cookie->id_lang), true).'
+ '.$this->l('Last visit:').' '.($customerStats['last_visit'] ? Tools::displayDate($customerStats['last_visit'], (int)($cookie->id_lang), true) : $this->l('never')).'
+ '.($countBetterCustomers != '-' ? $this->l('Rank: #').' '.(int)$countBetterCustomers.'
' : '') + .(Tools::isMultiShopActivated() ? '
'.$this->l('Shop:').' '.$shop->name : '').' +
+
+
+ +
+ '.$this->l('Newsletter:').' '.($customer->newsletter ? '' : '').'
+ '.$this->l('Opt-in:').' '.($customer->optin ? '' : '').'
+ '.$this->l('Age:').' '.$customerStats['age'].' '.((!empty($customer->birthday['age'])) ? '('.Tools::displayDate($customer->birthday, (int)($cookie->id_lang)).')' : $this->l('unknown')).'

+ '.$this->l('Last update:').' '.Tools::displayDate($customer->date_upd, (int)($cookie->id_lang), true).'
+ '.$this->l('Status:').' '.($customer->active ? '' : ''); + if ($customer->isGuest()) + { + echo ' +
+ '.$this->l('This customer is registered as').' '.$this->l('guest').''; + if(!Customer::customerExists($customer->email)) + { + echo ' +
+ +

+ '.$this->l('This feature generates a random password and sends an e-mail to the customer +
'); + } + else + echo '
'.$this->l('A registered customer account exists with the same email address').''; + echo ' +
+ '; + } + echo ' +
+
 
'; + + echo '
'.$this->l('Add a private note').' +

'.$this->l('This note will be displayed to all the employees but not to the customer.').'

+
+
+ + +
+
+
 
+ '; + + + echo '

'.$this->l('Messages').' ('.sizeof($messages).')

'; + if (sizeof($messages)) + { + echo ' + + + + + + '; + foreach ($messages AS $message) + echo ' + + + + '; + echo '
'.$this->l('Status').''.$this->l('Message').''.$this->l('Sent on').'
'.$message['status'].''.substr(strip_tags(html_entity_decode($message['message'], ENT_NOQUOTES, 'UTF-8')), 0, 75).'...'.Tools::displayDate($message['date_add'], (int)($cookie->id_lang), true).'
+
 
'; + } + else + echo $customer->firstname.' '.$customer->lastname.' '.$this->l('has never contacted you.'); + + // display hook specified to this page : AdminCustomers + if (($hook = Module::hookExec('adminCustomers', array('id_customer' => $customer->id))) !== false) + echo '
'.$hook.'
'; + echo '
 
'; + + echo '

'.$this->l('Groups').' ('.sizeof($groups).')

'; + if ($groups AND sizeof($groups)) + { + echo ' + + + + + + '; + $tokenGroups = Tools::getAdminToken('AdminGroups'.(int)(Tab::getIdFromClassName('AdminGroups')).(int)($cookie->id_employee)); + foreach ($groups AS $group) + { + $objGroup = new Group($group); + echo ' + + + + + '; + } + echo ' +
'.$this->l('ID').''.$this->l('Name').''.$this->l('Actions').'
'.$objGroup->id.''.$objGroup->name[$defaultLanguage].'
'; + } + echo '
 
'; + echo '

'.$this->l('Orders').' ('.sizeof($orders).')

'; + if ($orders AND sizeof($orders)) + { + $totalOK = 0; + $ordersOK = array(); + $ordersKO = array(); + $tokenOrders = Tools::getAdminToken('AdminOrders'.(int)Tab::getIdFromClassName('AdminOrders').(int)$cookie->id_employee); + foreach ($orders AS $order) + if ($order['valid']) + { + $ordersOK[] = $order; + $totalOK += $order['total_paid_real']; + } + else + $ordersKO[] = $order; + $orderHead = ' + + + + + + + + + + '; + $orderFoot = '
'.$this->l('ID').''.$this->l('Date').''.$this->l('Products').''.$this->l('Total paid').''.$this->l('Payment').''.$this->l('State').''.$this->l('Actions').'
'; + if ($countOK = sizeof($ordersOK)) + { + echo '

'.$this->l('Valid orders:').' '.$countOK.' '.$this->l('for').' '.Tools::displayPrice($totalOK, new Currency($defaultCurrency)).'

'.$orderHead; + foreach ($ordersOK AS $order) + echo ' + '.$order['id_order'].' + '.Tools::displayDate($order['date_add'], (int)($cookie->id_lang)).' + '.$order['nb_products'].' + '.Tools::displayPrice($order['total_paid_real'], new Currency((int)($order['id_currency']))).' + '.$order['payment'].' + '.$order['order_state'].' + + '; + echo $orderFoot.'
'; + } + if ($countKO = sizeof($ordersKO)) + { + echo '

'.$this->l('Invalid orders:').' '.$countKO.'

'.$orderHead; + foreach ($ordersKO AS $order) + echo ' + + '.$order['id_order'].' + '.Tools::displayDate($order['date_add'], (int)($cookie->id_lang)).' + '.$order['nb_products'].' + '.Tools::displayPrice($order['total_paid_real'], new Currency((int)($order['id_currency']))).' + '.$order['payment'].' + '.$order['order_state'].' + + '; + echo $orderFoot.'
 
'; + } + } + else + echo $customer->firstname.' '.$customer->lastname.' '.$this->l('has not placed any orders yet'); + + if ($products AND sizeof($products)) + { + echo '
 
+

'.$this->l('Products').' ('.sizeof($products).')

+ + + + + + + '; + $tokenOrders = Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee)); + foreach ($products AS $product) + echo ' + + + + + + '; + echo ' +
'.$this->l('Date').''.$this->l('Name').''.$this->l('Quantity').''.$this->l('Actions').'
'.Tools::displayDate($product['date_add'], (int)($cookie->id_lang), true).''.$product['product_name'].''.$product['product_quantity'].'
'; + } + echo '
 
+

'.$this->l('Addresses').' ('.sizeof($addresses).')

'; + if (sizeof($addresses)) + { + echo ' + + + + + + + + + '; + $tokenAddresses = Tools::getAdminToken('AdminAddresses'.(int)(Tab::getIdFromClassName('AdminAddresses')).(int)($cookie->id_employee)); + foreach ($addresses AS $address) + echo ' + + + + + + + + '; + echo ' +
'.$this->l('Company').''.$this->l('Name').''.$this->l('Address').''.$this->l('Country').''.$this->l('Phone number(s)').''.$this->l('Actions').'
'.($address['company'] ? $address['company'] : '--').''.$address['firstname'].' '.$address['lastname'].''.$address['address1'].($address['address2'] ? ' '.$address['address2'] : '').' '.$address['postcode'].' '.$address['city'].''.$address['country'].''.($address['phone'] ? ($address['phone'].($address['phone_mobile'] ? '
'.$address['phone_mobile'] : '')) : ($address['phone_mobile'] ? '
'.$address['phone_mobile'] : '--')).'
+ + +
'; + } + else + echo $customer->firstname.' '.$customer->lastname.' '.$this->l('has not registered any addresses yet').'.'; + echo '
 
+

'.$this->l('Discounts').' ('.sizeof($discounts).')

'; + if (sizeof($discounts)) + { + echo ' + + + + + + + + + + '; + $tokenDiscounts = Tools::getAdminToken('AdminDiscounts'.(int)(Tab::getIdFromClassName('AdminDiscounts')).(int)($cookie->id_employee)); + foreach ($discounts AS $discount) + { + echo ' + + + + + + + + + '; + } + echo ' +
'.$this->l('ID').''.$this->l('Code').''.$this->l('Type').''.$this->l('Value').''.$this->l('Qty available').''.$this->l('Status').''.$this->l('Actions').'
'.$discount['id_discount'].''.$discount['name'].''.$discount['type'].''.$discount['value'].''.$discount['quantity_for_user'].''.$this->l('Status').' + + +
'; + + } + else + echo $customer->firstname.' '.$customer->lastname.' '.$this->l('has no discount vouchers').'.'; + echo '
 
'; + + echo '
+

'.$this->l('Carts').' ('.sizeof($carts).')

'; + if ($carts AND sizeof($carts)) + { + echo ' + + + + + + + + '; + $tokenCarts = Tools::getAdminToken('AdminCarts'.(int)(Tab::getIdFromClassName('AdminCarts')).(int)($cookie->id_employee)); + foreach ($carts AS $cart) + { + $cartI = new Cart((int)($cart['id_cart'])); + $summary = $cartI->getSummaryDetails(); + $currency = new Currency((int)($cart['id_currency'])); + $carrier = new Carrier((int)($cart['id_carrier'])); + echo ' + + + + + + + '; + } + echo ' +
'.$this->l('ID').''.$this->l('Date').''.$this->l('Total').''.$this->l('Carrier').''.$this->l('Actions').'
'.sprintf('%06d', $cart['id_cart']).''.Tools::displayDate($cart['date_add'], (int)($cookie->id_lang), true).''.Tools::displayPrice($summary['total_price'], $currency).''.$carrier->name.'
'; + } + else + echo $this->l('No cart available').'.'; + echo '
'; + + $interested = Db::getInstance()->ExecuteS('SELECT DISTINCT id_product, c.id_cart, c.id_shop + FROM '._DB_PREFIX_.'cart_product cp + JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = cp.id_cart) + WHERE c.id_customer = '.(int)$customer->id.' + AND cp.id_product NOT IN (SELECT product_id + FROM '._DB_PREFIX_.'orders o + JOIN '._DB_PREFIX_.'order_detail od ON (o.id_order = od.id_order) + WHERE o.valid = 1 AND o.id_customer = '.(int)$customer->id.')'); + if (count($interested)) + { + echo '
+

'.$this->l('Products').' ('.count($interested).')

+ '; + foreach ($interested as $p) + { + $product = new Product((int)$p['id_product'], false, $cookie->id_lang, (int)$p['id_shop']); + echo ' + + + + + '; + } + echo '
'.(int)$product->id.''.Tools::htmlentitiesUTF8($product->name).'
'; + } + + echo '
 
'; + + /* Last connections */ + $connections = $customer->getLastConnections(); + if (sizeof($connections)) + { + echo '

'.$this->l('Last connections').'

+ + + + + + + + '; + foreach ($connections as $connection) + echo ' + + + + + + '; + echo '
'.$this->l('Date').''.$this->l('Pages viewed').''.$this->l('Total time').''.$this->l('Origin').''.$this->l('IP Address').'
'.Tools::displayDate($connection['date_add'], (int)($cookie->id_lang), true).''.(int)($connection['pages']).''.$connection['time'].''.($connection['http_referer'] ? preg_replace('/^www./', '', parse_url($connection['http_referer'], PHP_URL_HOST)) : $this->l('Direct link')).''.$connection['ipaddress'].'
 
'; + } + if (sizeof($referrers)) + { + echo '

'.$this->l('Referrers').'

+ + + + + '; + foreach ($referrers as $referrer) + echo ' + + + '; + echo '
'.$this->l('Date').''.$this->l('Name').'
'.Tools::displayDate($referrer['date_add'], (int)($cookie->id_lang), true).''.$referrer['name'].'
 
'; + } + echo ' '.$this->l('Back to customer list').'
'; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + $birthday = explode('-', $this->getFieldValue($obj, 'birthday')); + $customer_groups = Tools::getValue('groupBox', $obj->getGroups()); + $groups = Group::getGroups($this->_defaultFormLanguage, true); + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Customer').' + +
+ getFieldValue($obj, 'id_gender') == 1 ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'id_gender') == 2 ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'id_gender') == 9 OR !$this->getFieldValue($obj, 'id_gender')) ? 'checked="checked" ' : '').'/> + +
+ +
+ * + '.$this->l('Invalid characters:').' 0-9!<>,;?=+()@#"�{}_$%:  +
+ +
+ * + '.$this->l('Forbidden characters:').' 0-9!<>,;?=+()@#"�{}_$%:  +
+ +
+ '.(!$obj->id ? '*' : '').' +

'.($obj->id ? $this->l('Leave blank if no change') : $this->l('5 characters min., only letters, numbers, or').' -_').'

+
+ +
+ * +
+ '; + $sl_year = ($this->getFieldValue($obj, 'birthday')) ? $birthday[0] : 0; + $years = Tools::dateYears(); + $sl_month = ($this->getFieldValue($obj, 'birthday')) ? $birthday[1] : 0; + $months = Tools::dateMonths(); + $sl_day = ($this->getFieldValue($obj, 'birthday')) ? $birthday[2] : 0; + $days = Tools::dateDays(); + $tab_months = array( + $this->l('January'), + $this->l('February'), + $this->l('March'), + $this->l('April'), + $this->l('May'), + $this->l('June'), + $this->l('July'), + $this->l('August'), + $this->l('September'), + $this->l('October'), + $this->l('November'), + $this->l('December')); + echo ' +
+ + + +
'; + echo ' +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Allow or disallow this customer to log in').'

+
+ +
+ getFieldValue($obj, 'newsletter') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'newsletter') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Customer will receive your newsletter via e-mail').'

+
+ +
+ getFieldValue($obj, 'optin') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'optin') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Customer will receive your ads via e-mail').'

+
+ +
+ +

'.$this->l('Apply non-cumulative rules (e.g., price, display method, reduction)').'

+
+ +
'; + if (sizeof($groups)) + { + echo ' + + + + + + '; + $irow = 0; + foreach ($groups as $group) + { + echo ' + + + + + '; + } + echo ' +
'.$this->l('ID').''.$this->l('Group name').'
'.''.$group['id_group'].'
+

'.$this->l('Check all the box(es) of groups of which the customer is to be a member').' *

+ '; + } else + echo '

'.$this->l('No group created').'

'; + echo ' +
'; + if (Tools::isMultiShopActivated()) + { + $shops = Shop::getShops(); + echo ' + +
+ '; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + + public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL, $id_lang_shop = NULL) + { + global $cookie; + return parent::getList((int)($cookie->id_lang), !Tools::getValue($this->table.'Orderby') ? 'date_add' : NULL, !Tools::getValue($this->table.'Orderway') ? 'DESC' : NULL); + } + + public function beforeDelete($object) + { + return $object->isUsed(); + } +} + + diff --git a/admin-dev/tabs/AdminDb.php b/admin-dev/tabs/AdminDb.php new file mode 100644 index 000000000..3b914646a --- /dev/null +++ b/admin-dev/tabs/AdminDb.php @@ -0,0 +1,150 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/tabs/AdminPreferences.php'); + +class AdminDb extends AdminPreferences +{ + public function __construct() + { + $this->className = 'Configuration'; + $this->table = 'configuration'; + + $this->_fieldsDatabase = array( + 'db_server' => array('title' => $this->l('Server:'), 'desc' => $this->l('IP or server name; \'localhost\' will work in most cases'), 'size' => 30, 'type' => 'text', 'required' => true, 'visibility' => Shop::CONTEXT_ALL), + 'db_name' => array('title' => $this->l('Database:'), 'desc' => $this->l('Database name (e.g., \'prestashop\')'), 'size' => 30, 'type' => 'text', 'required' => true, 'visibility' => Shop::CONTEXT_ALL), + 'db_prefix' => array('title' => $this->l('Prefix:'), 'size' => 30, 'type' => 'text', 'visibility' => Shop::CONTEXT_ALL), + 'db_user' => array('title' => $this->l('User:'), 'size' => 30, 'type' => 'text', 'required' => true, 'visibility' => Shop::CONTEXT_ALL), + 'db_passwd' => array('title' => $this->l('Password:'), 'size' => 30, 'type' => 'password', 'desc' => $this->l('Leave blank if no change')), 'visibility' => Shop::CONTEXT_ALL); + parent::__construct(); + } + + public function postProcess() + { + global $currentIndex; + + if (isset($_POST['submitDatabase'.$this->table])) + { + if ($this->tabAccess['edit'] === '1') + { + foreach ($this->_fieldsDatabase AS $field => $values) + if (isset($values['required']) AND $values['required']) + if (($value = Tools::getValue($field)) == false AND (string)$value != '0') + $this->_errors[] = Tools::displayError('field').' '.$values['title'].' '.Tools::displayError('is required.'); + + if (!sizeof($this->_errors)) + { + /* Datas are not saved in database but in config/settings.inc.php */ + $settings = array(); + foreach ($_POST as $k => $value) + if ($value) + $settings['_'.Tools::strtoupper($k).'_'] = $value; + rewriteSettingsFile(NULL, NULL, $settings); + Tools::redirectAdmin($currentIndex.'&conf=6'.'&token='.$this->token); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + if (Tools::isSubmit('submitEngine')) + { + if (!isset($_POST['tablesBox']) OR !sizeof($_POST['tablesBox'])) + $this->_errors[] = Tools::displayError('You did not select any tables'); + else + { + $available_engines = $this->_getEngines(); + $tables_status = $this->_getTablesStatus(); + $tables_engine = array(); + + foreach ($tables_status AS $table) + $tables_engine[$table['Name']] = $table['Engine']; + + $engineType = pSQL(Tools::getValue('engineType')); + foreach ($_POST['tablesBox'] AS $table) + { + if ($engineType == $tables_engine[$table]) + $this->_errors[] = $table.' '.$this->l('is already in').' '.$engineType; + else + if (!Db::getInstance()->Execute('ALTER TABLE '.pSQL($table).' ENGINE='.pSQL($engineType))) + $this->_errors[] = $this->l('Can\'t change engine for').' '.$table; + else + echo '
'.$this->l('Confirmation').''.$this->l('Engine change of').' '.$table.' '.$this->l('to').' '.$engineType.'
'; + } + } + } + + } + + public function display() + { + global $currentIndex; + echo $this->displayWarning($this->l('Be VERY CAREFUL with these settings, as changes may cause your PrestaShop online store to malfunction. For all issues, check the config/settings.inc.php file.')).'
'; + $this->_displayForm('database', $this->_fieldsDatabase, $this->l('Database'), 'width2', 'database_gear'); + $engines = $this->_getEngines(); + $irow = 0; + echo '
'.$this->l('MySQL Engine').'
+ '; + $tables_status = $this->_getTablesStatus(); + foreach ($tables_status AS $table) + { + if (!preg_match('/^'._DB_PREFIX_.'.*/Ui', $table['Name'])) + continue; + echo ' + + '; + } + echo '
'.$this->l('Table').''.$this->l('Table Engine').'
'.$table['Name'].''.$table['Engine'].'

+ +
+ + +
+
'; + } + + private function _getEngines() + { + $engines = Db::getInstance()->ExecuteS('SHOW ENGINES'); + $allowed_engines = array(); + foreach ($engines AS $engine) + { + if (in_array($engine['Engine'], array('InnoDB', 'MyISAM')) AND in_array($engine['Support'], array('DEFAULT', 'YES'))) + $allowed_engines[] = $engine['Engine']; + } + return $allowed_engines; + } + + private function _getTablesStatus() + { + return Db::getInstance()->ExecuteS('SHOW TABLE STATUS'); + } +} + + diff --git a/admin-dev/tabs/AdminDeliverySlip.php b/admin-dev/tabs/AdminDeliverySlip.php new file mode 100644 index 000000000..fab8c0fd6 --- /dev/null +++ b/admin-dev/tabs/AdminDeliverySlip.php @@ -0,0 +1,104 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7060 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminDeliverySlip extends AdminTab +{ + public function __construct() + { + global $cookie; + + $this->table = 'delivery'; + + $this->optionTitle = $this->l('Delivery slips options'); + $this->_fieldsOptions = array( + 'PS_DELIVERY_PREFIX' => array('title' => $this->l('Delivery prefix:'), 'desc' => $this->l('Prefix used for delivery slips'), 'size' => 6, 'type' => 'textLang'), + 'PS_DELIVERY_NUMBER' => array('title' => $this->l('Delivery number:'), 'desc' => $this->l('The next delivery slip will begin with this number, and then increase with each additional slip'), 'size' => 6, 'type' => 'text'), + ); + + parent::__construct(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + $output = ' +

'.$this->l('Print PDF delivery slips').'

+
+ + +
+ * +

'.$this->l('Format: 2007-12-31 (inclusive)').'

+
+ +
+ * +

'.$this->l('Format: 2008-12-31 (inclusive)').'

+
+
+ +
+
* '.$this->l('Required fields').'
+ +
'; + + echo $output; + } + + public function display() + { + $this->displayForm(); + $this->displayOptionsList(); + } + + public function postProcess() + { + global $currentIndex; + + if (Tools::getValue('submitPrint')) + { + if (!Validate::isDate($_POST['date_from'])) + $this->_errors[] = $this->l('Invalid from date'); + if (!Validate::isDate($_POST['date_to'])) + $this->_errors[] = $this->l('Invalid end date'); + if (!sizeof($this->_errors)) + { + $orders = Order::getOrdersIdByDate($_POST['date_from'], $_POST['date_to'], NULL, 'delivery'); + if (sizeof($orders)) + Tools::redirectAdmin('pdf.php?deliveryslips='.urlencode(serialize($orders)).'&token='.$this->token); + else + $this->_errors[] = $this->l('No delivery slip found for this period'); + } + } + else + parent::postProcess(); + } +} + + diff --git a/admin-dev/tabs/AdminDiscounts.php b/admin-dev/tabs/AdminDiscounts.php new file mode 100644 index 000000000..9a4fc9539 --- /dev/null +++ b/admin-dev/tabs/AdminDiscounts.php @@ -0,0 +1,504 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7060 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminDiscounts extends AdminTab +{ + public function __construct() + { + global $cookie; + + $this->table = 'discount'; + $this->className = 'Discount'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + $this->_select = 'dtl.`name` AS discount_type, s.name shop_name, + IF(a.id_discount_type = 1, CONCAT(a.value, " %"), + IF(a.id_discount_type = 2, CONCAT(a.value, " ", c.sign), + "--")) as strvalue'; + $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'currency` c ON (c.`id_currency` = a.`id_currency`) + LEFT JOIN `'._DB_PREFIX_.'discount_type` dt ON (dt.`id_discount_type` = a.`id_discount_type`) + LEFT JOIN `'._DB_PREFIX_.'shop` s ON (s.`id_shop` = a.`id_shop`) + LEFT JOIN `'._DB_PREFIX_.'discount_type_lang` dtl ON (dt.`id_discount_type` = dtl.`id_discount_type` AND dtl.`id_lang` = '.(int)($cookie->id_lang).')'; + + $typesArray = array(); + $types = Discount::getDiscountTypes((int)($cookie->id_lang)); + foreach ($types AS $type) + $typesArray[$type['id_discount_type']] = $type['name']; + + $this->fieldsDisplay = array( + 'id_discount' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Code'), 'width' => 85, 'prefix' => '', 'suffix' => '', 'filter_key' => 'a!name'), + 'shop_name' => array('title' => $this->l('Shop'), 'width' => 85, 'filter_key' => 's!name'), + 'description' => array('title' => $this->l('Description'), 'width' => 100, 'filter_key' => 'b!description'), + 'discount_type' => array('title' => $this->l('Type'), 'type' => 'select', 'select' => $typesArray, 'filter_key' => 'dt!id_discount_type'), + 'strvalue' => array('title' => $this->l('Value'), 'width' => 50, 'align' => 'right', 'filter_key' => 'a!value'), + 'quantity' => array('title' => $this->l('Qty'), 'width' => 40, 'align' => 'right'), + 'date_to' => array('title' => $this->l('To'), 'width' => 60, 'type' => 'date', 'align' => 'right'), + 'active' => array('title' => $this->l('Status'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false)); + + $this->optionTitle = $this->l('Discounts options'); + $this->_fieldsOptions = array( + 'PS_VOUCHERS' => array('title' => $this->l('Enable vouchers:'), 'desc' => $this->l('Allow the use of vouchers in shop'), 'cast' => 'intval', 'type' => 'bool'), + ); + parent::__construct(); + } + + protected function copyFromPost(&$object, $table) + { + parent::copyFromPost($object, $table); + + $object->cumulable = (!isset($_POST['cumulable']) ? false : true); + $object->cumulable_reduction = (!isset($_POST['cumulable_reduction']) ? false : true); + } + + public function postProcess() + { + global $currentIndex, $cookie; + $token = Tools::getValue('token') ? Tools::getValue('token') : $this->token; + + if ($discountName = Tools::getValue('name') AND Validate::isDiscountName($discountName) AND Discount::discountExists($discountName, Tools::getValue('id_discount'))) + $this->_errors[] = Tools::displayError('A voucher of this name already exists. Please choose another name.'); + + if (Tools::getValue('submitAdd'.$this->table)) + { + if (Tools::getValue('id_discount_type') == 0) + $this->_errors[] = Tools::displayError('Please set a type for this voucher.'); + if (Tools::getValue('id_discount_type') == 2 AND Tools::getValue('id_currency') == 0) + $this->_errors[] = Tools::displayError('Please set a currency for this voucher.'); + if ((Tools::getValue('id_discount_type') == 1 || Tools::getValue('id_discount_type') == 2) && !Tools::getValue('value')) + $this->_errors[] = Tools::displayError('Please set a amount for this voucher.'); + if (!Validate::isBool_Id(Tools::getValue('id_target'))) + $this->_errors[] = Tools::displayError('Invalid customer or group ID field'); + else + { + $rules = explode('_', Tools::getValue('id_target')); + /* In form, there is one field for two differents fields in object*/ + $_POST[($rules[0] ? 'id_group' : 'id_customer')] = $rules[1]; + } + /* Checking fields validity */ + $this->validateRules(); + if (!sizeof($this->_errors)) + { + $id = (int)(Tools::getValue($this->identifier)); + /* Object update */ + if (isset($id) AND !empty($id)) + { + if ($this->tabAccess['edit'] === '1') + { + $object = new $this->className($id); + if (Validate::isLoadedObject($object)) + { + /* Specific to objects which must not be deleted */ + if ($this->deleted AND $this->beforeDelete($object)) + { + $object->deleted = 1; + $object->update(); + $objectNew = new $this->className(); + $this->copyFromPost($objectNew, $this->table); + $shop = new Shop((int)$objectNew->id_shop); + $objectNew->id_group_shop = (int)$shop->id_group_shop; + $result = $objectNew->add(); + if (Validate::isLoadedObject($objectNew)) + $this->afterDelete($objectNew, $object->id); + } + else + { + if (($categories = Tools::getValue('categoryBox')) === false OR (!empty($categories) AND !is_array($categories))) + $this->_errors[] = Tools::displayError('Please set a category for this voucher.'); + $this->copyFromPost($object, $this->table); + $shop = new Shop((int)$objectNew->id_shop); + $objectNew->id_group_shop = (int)$shop->id_group_shop; + $result = $object->update(true, false, $categories); + } + if (!$result) + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.''; + elseif ($this->postImage($object->id)) + { + if ($back = Tools::getValue('back')) + Tools::redirectAdmin(urldecode($back).'&conf=4'); + if (Tools::getValue('stay_here') == 'on' || Tools::getValue('stay_here') == 'true' || Tools::getValue('stay_here') == '1') + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=4&updatescene&token='.$token); + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=4&token='.$token); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + + /* Object creation */ + else + { + if ($this->tabAccess['add'] === '1') + { + $object = new $this->className(); + $this->copyFromPost($object, $this->table); + $shop = new Shop((int)$objectNew->id_shop); + $objectNew->id_group_shop = (int)$shop->id_group_shop; + $categories = Tools::getValue('categoryBox', null); + if (!$object->add(true, false, $categories)) + $this->_errors[] = Tools::displayError('An error occurred while creating object.').' '.$this->table.''; + elseif (($_POST[$this->identifier] = $object->id /* voluntary */) AND $this->postImage($object->id) AND $this->_redirect) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=3&token='.$token); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + } + $this->_errors = array_unique($this->_errors); + } + else + return parent::postProcess(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' + +
+ '.($obj->id ? '' : '').' +
'.$this->l('Vouchers').' + +
+ + * + + '.$this->l('Invalid characters: numbers and').' !<>,;?=+()@#"�{}_$%:  +

'.$this->l('The voucher\'s code, at least 3 characters long, which the customer types in during check-out').'

+
+ +
+ * +
+ + +
'; + foreach ($this->_languages as $language) + echo '
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +

'.$this->l('Will appear in cart next to voucher code').'

+
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'description', 'description'); + echo '
+
+ +
+ + + + + + '; + $done = array(); + $index = array(); + $indexedCategories = isset($_POST['categoryBox']) ? $_POST['categoryBox'] : ($obj->id ? Discount::getCategories($obj->id) : array()); + $categories = Category::getCategories((int)($cookie->id_lang), false); + foreach ($indexedCategories AS $k => $row) + $index[] = $row['id_category']; + $this->recurseCategoryForInclude((int)(Tools::getValue($this->identifier)), $index, $categories, $categories[0][1], 1, $obj->id); + echo ' +
'.$this->l('ID').''.$this->l('Name').'
+

'.$this->l('Mark all checkbox(es) of categories to which the discount is to be applied').' *

+
+
+ +
+ * +

'.$this->l('Total quantity available (mainly for vouchers open to everyone)').'

+
+ +
+ * +

'.$this->l('Number of times a single customer can use this voucher').'

+
+ +
+ * +

'.$this->l('0 if not applicable').'

+
+
+

+ getFieldValue($obj, 'cumulable') == 1) ? ' checked="checked"' : '').' id="cumulable_on" value="1" /> + +

+
+
+

+ getFieldValue($obj, 'cumulable_reduction') == 1) ? ' checked="checked"' : '').' id="cumulable_reduction_on" value="1" /> + +

+
+ +
+ +
+ + +
+ + +
'.$this->l('Filter:').' + +

'; + includeDatepicker(array('date_from', 'date_to'), true); + echo ' + +
+ * +

'.$this->l('Start date/time from which voucher can be used').'
'.$this->l('Format: YYYY-MM-DD HH:MM:SS').'

+
+ +
+ * +

'.$this->l('End date/time at which voucher is no longer valid').'
'.$this->l('Format: YYYY-MM-DD HH:MM:SS').'

+
+ +
+ getFieldValue($obj, 'cart_display') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'cart_display') ? 'checked="checked" ' : '').'/> + +
+
+ +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Enable or disable voucher').'

+
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + /** + * Build a categories tree + * + * @param array $indexedCategories Array with categories where product is indexed (in order to check checkbox) + * @param array $categories Categories to list + * @param array $current Current category + * @param integer $id_category Current category id + */ + public static function recurseCategoryForInclude($id_obj, $indexedCategories, $categories, $current, $id_category = 1, $id_category_default = NULL, $has_suite = array()) + { + global $done; + static $irow; + + if (!isset($done[$current['infos']['id_parent']])) + $done[$current['infos']['id_parent']] = 0; + $done[$current['infos']['id_parent']] += 1; + + $todo = sizeof($categories[$current['infos']['id_parent']]); + $doneC = $done[$current['infos']['id_parent']]; + + $level = $current['infos']['level_depth'] + 1; + + echo ' + + + + + + '.$id_category.' + + '; + for ($i = 2; $i < $level; $i++) + echo ''; + echo '   + + '; + + if ($level > 1) + $has_suite[] = ($todo == $doneC ? 0 : 1); + if (isset($categories[$id_category])) + foreach ($categories[$id_category] AS $key => $row) + if ($key != 'infos') + self::recurseCategoryForInclude($id_obj, $indexedCategories, $categories, $categories[$id_category][$key], $key, $id_category_default, $has_suite); + } +} + + diff --git a/admin-dev/tabs/AdminEmails.php b/admin-dev/tabs/AdminEmails.php new file mode 100644 index 000000000..639f388ab --- /dev/null +++ b/admin-dev/tabs/AdminEmails.php @@ -0,0 +1,108 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/tabs/AdminPreferences.php'); + +class AdminEmails extends AdminPreferences +{ + public function __construct() + { + global $cookie; + + $this->className = 'Configuration'; + $this->table = 'configuration'; + + foreach (Contact::getContacts((int)$cookie->id_lang) AS $contact) + $arr[] = array('email_message' => $contact['id_contact'], 'name' => $contact['name']); + + $this->_fieldsEmail = array( + 'PS_MAIL_EMAIL_MESSAGE' => array('title' => $this->l('Send e-mail to:'), 'desc' => $this->l('When customers send message from order page'), 'validation' => 'isUnsignedId', 'type' => 'select', 'cast' => 'intval', 'identifier' => 'email_message', 'list' => $arr), + 'PS_MAIL_METHOD' => array('title' => '', 'validation' => 'isGenericName', 'required' => true, 'type' => 'radio', 'choices' => array(1 => $this->l('Use PHP mail() function. Recommended; works in most cases'), 2 => $this->l('Set my own SMTP parameters. For advanced users ONLY')), 'js' => array(1 => 'onclick="$(\'#SMTP_CONTAINER\').slideUp();"', 2 => 'onclick="$(\'#SMTP_CONTAINER\').slideDown();"'), 'visibility' => Shop::CONTEXT_ALL), + 'PS_MAIL_TYPE' => array('title' => '', 'validation' => 'isGenericName', 'required' => true, 'type' => 'radio', 'choices' => array(1 => $this->l('Send e-mail as HTML'), 2 => $this->l('Send e-mail as Text'), 3 => $this->l('Both'))), + 'SMTP_CONTAINER' => array('title' => '', 'type' => 'container'), + 'PS_MAIL_DOMAIN' => array('title' => $this->l('Mail domain:'), 'desc' => $this->l('Fully qualified domain name (keep it empty if you do not know)'), 'validation' => 'isUrl', 'size' => 30, 'type' => 'text', 'visibility' => Shop::CONTEXT_ALL), + 'PS_MAIL_SERVER' => array('title' => $this->l('SMTP server:'), 'desc' => $this->l('IP or server name (e.g., smtp.mydomain.com)'), 'validation' => 'isGenericName', 'size' => 30, 'type' => 'text', 'visibility' => Shop::CONTEXT_ALL), + 'PS_MAIL_USER' => array('title' => $this->l('SMTP user:'), 'desc' => $this->l('Leave blank if not applicable'), 'validation' => 'isGenericName', 'size' => 30, 'type' => 'text', 'visibility' => Shop::CONTEXT_ALL), + 'PS_MAIL_PASSWD' => array('title' => $this->l('SMTP password:'), 'desc' => $this->l('Leave blank if not applicable'), 'validation' => 'isAnything', 'size' => 30, 'type' => 'password', 'visibility' => Shop::CONTEXT_ALL), + 'PS_MAIL_SMTP_ENCRYPTION' => array('title' => $this->l('Encryption:'), 'desc' => $this->l('Use an encrypt protocol'), 'type' => 'select', 'cast' => 'strval', 'identifier' => 'mode', 'list' => array(array('mode' => 'off', 'name' => $this->l('None')), array('mode' => 'tls', 'name' => $this->l('TLS')), array('mode' => 'ssl', 'name' => $this->l('SSL'))), 'visibility' => Shop::CONTEXT_ALL), + 'PS_MAIL_SMTP_PORT' => array('title' => $this->l('Port:'), 'desc' => $this->l('Number of port to use'), 'validation' => 'isInt', 'size' => 5, 'type' => 'text', 'cast' => 'intval', 'visibility' => Shop::CONTEXT_ALL), + 'SMTP_CONTAINER_END' => array('title' => '', 'type' => 'container_end', 'content' => '')); + + parent::__construct(); + } + + public function postProcess() + { + if (isset($_POST['submitEmail'.$this->table])) + { + if ($this->tabAccess['edit'] === '1') + { + if ($_POST['PS_MAIL_METHOD'] == 2 AND (empty($_POST['PS_MAIL_SERVER']) OR empty($_POST['PS_MAIL_SMTP_PORT']))) + $this->_errors[] = Tools::displayError('You must define a SMTP server and a SMTP port. If you do not know, use the PHP mail() function instead.'); + else + $this->_postConfig($this->_fieldsEmail); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + } + + public function display() { + $this->_displayForm('email', $this->_fieldsEmail, $this->l('E-mail'), 'width2', 'email'); + $this->_displayMailTest(); + } + + private function _displayMailTest() + { + echo ' +
+ '.$this->l('Test your e-mail configuration').' + + +
+ +
+
+ + + + + + +
+ +
+
+
'; + } +} diff --git a/admin-dev/tabs/AdminEmployees.php b/admin-dev/tabs/AdminEmployees.php new file mode 100644 index 000000000..7bbc0eab2 --- /dev/null +++ b/admin-dev/tabs/AdminEmployees.php @@ -0,0 +1,221 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7210 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminEmployees extends AdminTab +{ + /** @var array profiles list */ + private $profilesArray = array(); + + public function __construct() + { + global $cookie; + + $this->table = 'employee'; + $this->className = 'Employee'; + $this->lang = false; + $this->edit = true; + $this->delete = true; + $this->_select = 'pl.`name` AS profile'; + $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'profile` p ON a.`id_profile` = p.`id_profile` + LEFT JOIN `'._DB_PREFIX_.'profile_lang` pl ON (pl.`id_profile` = p.`id_profile` AND pl.`id_lang` = '.(int)($cookie->id_lang).')'; + + $profiles = Profile::getProfiles((int)($cookie->id_lang)); + if (!$profiles) + $this->_errors[] = Tools::displayError('No profile'); + else + foreach ($profiles AS $profile) + $this->profilesArray[$profile['name']] = $profile['name']; + + $this->fieldsDisplay = array( + 'id_employee' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'lastname' => array('title' => $this->l('Last name'), 'width' => 130), + 'firstname' => array('title' => $this->l('First name'), 'width' => 130), + 'email' => array('title' => $this->l('E-mail address'), 'width' => 180), + 'profile' => array('title' => $this->l('Profile'), 'width' => 90, 'type' => 'select', 'select' => $this->profilesArray, 'filter_key' => 'pl!name'), + 'active' => array('title' => $this->l('Can log in'), 'align' => 'center', 'active' => 'status', 'type' => 'bool')); + + $this->optionTitle = $this->l('Employees options'); + $this->_fieldsOptions = array( + 'PS_PASSWD_TIME_BACK' => array('title' => $this->l('Password regenerate:'), 'desc' => $this->l('Security minimum time to wait to regenerate a new password'), 'cast' => 'intval', 'size' => 5, 'type' => 'text', 'suffix' => ' '.$this->l('minutes'), 'visibility' => Shop::CONTEXT_ALL), + 'PS_BO_ALLOW_EMPLOYEE_FORM_LANG' => array('title' => $this->l('Memorize form language:'), 'desc' => $this->l('Allow employees to save their own default form language'), 'cast' => 'intval', 'type' => 'select', 'identifier' => 'value', 'list' => array( + '0' => array('value' => 0, 'name' => $this->l('No')), + '1' => array('value' => 1, 'name' => $this->l('Yes')) + ), 'visibility' => Shop::CONTEXT_ALL) + ); + + parent::__construct(); + } + + protected function _childValidation() + { + if (!($obj = $this->loadObject(true))) + return false; + $email = $this->getFieldValue($obj, 'email'); + if (!Validate::isEmail($email)) + $this->_errors[] = Tools::displayError('Invalid e-mail'); + else if (Employee::employeeExists($email) AND !Tools::getValue('id_employee')) + $this->_errors[] = Tools::displayError('An account already exists for this e-mail address:').' '.$email; + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + $profiles = Profile::getProfiles((int)($cookie->id_lang)); + + echo ' + + + +
+ '.($obj->id ? '' : '').' + '.((int)$this->tabAccess['view'] ? '' : '').' +
'.$this->l('Employees').' + +
+ * +
+ +
+ * +
+ +
+ * +

'.($obj->id ? $this->l('Leave blank if you do not want to change your password') : $this->l('Min. 8 characters; use only letters, numbers or').' -_').'

+
+ +
+ * +
 
+ +
'; + // Note : width= fix Firefox 4 display bug related to colorpicker librarie + echo ' +

'.$this->l('Back office background will be displayed in this color. HTML colors only (e.g.,').' "lightblue", "#CC6600")

+
 
+ +
+ * +
 
+ +
+ * +
'; + if ((int)$this->tabAccess['edit']) + { + echo '
 
+ +
+ getFieldValue($obj, 'bo_uimode') == 'hover' ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'bo_uimode') == 'click' ? 'checked="checked" ' : '').'/> + +
 
+ +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Allow or disallow this employee to log into this Back Office').'

+
+ +
+ * +
'; + } + echo '
 
+
+ +
 
+
* '.$this->l('Required field').'
+
+
'; + } + + public function postProcess() + { + global $cookie; + + if (Tools::isSubmit('deleteemployee') OR Tools::isSubmit('status') OR Tools::isSubmit('statusemployee')) + { + if ($cookie->id_employee == Tools::getValue('id_employee')) + { + $this->_errors[] = Tools::displayError('You cannot disable or delete your own account.'); + return false; + } + + $employee = new Employee(Tools::getValue('id_employee')); + if ($employee->isLastAdmin()) + { + $this->_errors[] = Tools::displayError('You cannot disable or delete the last administrator account.'); + return false; + } + } + elseif (Tools::isSubmit('submitAddemployee')) + { + $employee = new Employee((int)Tools::getValue('id_employee')); + if (!(int)$this->tabAccess['edit']) + $_POST['id_profile'] = $_GET['id_profile'] = $employee->id_profile; + + if ($employee->isLastAdmin()) + { + if (Tools::getValue('id_profile') != (int)_PS_ADMIN_PROFILE_) + { + $this->_errors[] = Tools::displayError('You should have at least one employee in the administrator group.'); + return false; + } + + if (Tools::getvalue('active') == 0) + { + $this->_errors[] = Tools::displayError('You cannot disable or delete the last administrator account.'); + return false; + } + } + } + + return parent::postProcess(); + } +} \ No newline at end of file diff --git a/admin-dev/tabs/AdminFeatures.php b/admin-dev/tabs/AdminFeatures.php new file mode 100644 index 000000000..b13c5e2de --- /dev/null +++ b/admin-dev/tabs/AdminFeatures.php @@ -0,0 +1,212 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7331 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/tabs/AdminFeaturesValues.php'); + +class AdminFeatures extends AdminTab +{ + public function __construct() + { + $this->adminFeaturesValues = new AdminFeaturesValues(); + $this->table = 'feature'; + $this->className = 'Feature'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'name' => array('title' => $this->l('Name'), 'width' => 128, 'filter_key' => 'b!name'), + 'value' => array('title' => $this->l('Values'), 'width' => 255, 'orderby' => false, 'search' => false)); + + parent::__construct(); + } + + public function display() + { + global $currentIndex; + + if ((isset($_POST['submitAddfeature_value']) AND sizeof($this->adminFeaturesValues->_errors)) + OR isset($_GET['updatefeature_value']) OR isset($_GET['addfeature_value'])) + { + $this->adminFeaturesValues->displayForm($this->token); + echo '

'.$this->l('Back to the features list').'
'; + } + else + { + parent::display(); + $this->displayAssoGroupShop(); + } + } + + /* Report to AdminTab::displayList() for more details */ + public function displayList() + { + global $currentIndex; + + echo '
+ '.$this->l('Add a new feature').'
+ '.$this->l('Add a new feature value').'

+ '.$this->l('Click on a feature name to view its values and then click again if you want to hide them.').'

'; + + $this->displayListHeader(); + echo ''; + + if (!sizeof($this->_list)) + echo ''.$this->l('No features found.').''; + + $irow = 0; + foreach ($this->_list AS $tr) + { + $id = (int)($tr['id_'.$this->table]); + echo ' + + + '.$tr['name'].' + + + '; + + echo ' + + + '.$this->l('Edit').'  + + '.$this->l('Delete').' + + '; + } + + $this->displayListFooter(); + + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +

'.$this->l('Add a new feature').'

+
+ '.($obj->id ? '' : '').' +
+ '.$this->l('Add a new feature').' + +
'; + foreach ($this->_languages AS $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name', 'name'); + echo ' +
+
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoGroupShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + + public function displayErrors() + { + $this->adminFeaturesValues->displayErrors(); + parent::displayErrors(); + } + + public function postProcess() + { + global $cookie, $currentIndex; + $this->adminFeaturesValues->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id); + $this->adminFeaturesValues->postProcess($this->token); + + if(Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.'Box'])) + { + $object = new $this->className(); + if ($object->deleteSelection($_POST[$this->table.'Box'])) + Tools::redirectAdmin($currentIndex.'&conf=2'.'&token='.$this->token); + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + else + parent::postProcess(); + } +} + + diff --git a/admin-dev/tabs/AdminFeaturesValues.php b/admin-dev/tabs/AdminFeaturesValues.php new file mode 100644 index 000000000..45268c68e --- /dev/null +++ b/admin-dev/tabs/AdminFeaturesValues.php @@ -0,0 +1,118 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminFeaturesValues extends AdminTab +{ + public function __construct() + { + $this->table = 'feature_value'; + $this->className = 'FeatureValue'; + $this->lang = true; + $this->edit = true; + $this->delete = true; + + parent::__construct(); + } + + /** + * Display form + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo ' +

'.$this->l('Add a new feature value').'

+
+ '.($obj->id ? '' : '').' +
+ '.$this->l('Add a new feature value').' + +
'; + foreach ($this->_languages as $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' <>;=#{}  +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'value', 'value'); + echo ' +
+
+ +
+ * +
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + + /** + * Manage page processing + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function postProcess($token = NULL) + { + global $currentIndex; + + if(Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.$_POST['groupid'].'Box'])) + { + $object = new $this->className(); + if ($object->deleteSelection($_POST[$this->table.$_POST['groupid'].'Box'])) + Tools::redirectAdmin($currentIndex.'&conf=2'.'&token='.($token ? $token : $this->token)); + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + else + parent::postProcess(); + } +} \ No newline at end of file diff --git a/admin-dev/tabs/AdminGenerator.php b/admin-dev/tabs/AdminGenerator.php new file mode 100644 index 000000000..040eadd50 --- /dev/null +++ b/admin-dev/tabs/AdminGenerator.php @@ -0,0 +1,190 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminGenerator extends AdminTab +{ + public function __construct() + { + $this->_htFile = dirname(__FILE__).'/../../.htaccess'; + $this->_rbFile = dirname(__FILE__).'/../../robots.txt'; + $this->_smFile = dirname(__FILE__).'/../../sitemap.xml'; + $this->_rbData = $this->_getRobotsContent(); + return parent::__construct(); + } + + public function display() + { + global $currentIndex; + + $languages = Language::getLanguages(false); + + // Htaccess + echo ' +
+
'.$this->l('Htaccess file generation').' +

'.$this->l('Warning:').' '.$this->l('this tool can ONLY be used if you are hosted by an Apache web server. Please ask your webhost.').'

+

'.$this->l('This tool will automatically generate a ".htaccess" file that will give you the ability to do URL rewriting and to catch 404 errors.').'

+

'.$this->l('If you do not have "Friendly URL" enabled when generating the ".htaccess" file, this feature won\'t be available.').'

'; + if ($this->_checkConfiguration($this->_htFile)) + echo ' +
 
+ +
+ +

'.$this->l('This will add directives to your .htaccess file which should improve caching and compression.').'

+
+
 
+ +
+ +

'.$this->l('Enable only if your server allows URL rewriting.').'

+
+
 
+ +
+ +

'.$this->l('Add here the specific directives of your host (SetEnv PHP_VER 5, AddType x-mapp-php5 .php...).').'

+
+

'.$this->l('Generate your ".htaccess" file by clicking on the following button:').'

+

+

'.$this->l('This will erase your').' '.$this->l('old').' '.$this->l('.htaccess file!').'

'; + else + echo ' +

'.$this->l('Before being able to use this tool, you need to:').'

+

'.$this->l('- create a').' '. $this->l('.htaccess').' '.$this->l('blank file in directory').' '.__PS_BASE_URI__.' +
'.$this->l('- give it write permissions (CHMOD 666 on Unix system)').'

'; + echo '

'; + + // Robots + echo '

+
+
'.$this->l('Robots file generation').' +

'.$this->l('Warning:').' '.$this->l('Your file robots.txt MUST be in your website\'s root directory and nowhere else.').'

+

'.$this->l('eg: http://www.yoursite.com/robots.txt').'.

+

'.$this->l('This tool will automatically generate a "robots.txt" file that you can configure to deny access to search engines for some pages.').'

'; + if ($this->_checkConfiguration($this->_rbFile)) + echo ' +

'.$this->l('Generate your "robots.txt" file by clicking on the following button:').'

+

+

'.$this->l('This will erase your').' '.$this->l('old').' '.$this->l('robots.txt file!').'

'; + else + echo ' +

'.$this->l('Before being able to use this tool, you need to:').'

+

'.$this->l('- create a').' '. $this->l('robots.txt').' '.$this->l('blank file in dir:').' '.__PS_BASE_URI__.' +
'.$this->l('- give it write permissions (CHMOD 666 on Unix system)').'

'; + echo '

'; + } + + public function _checkConfiguration($file) + { + if (file_exists($file)) + return is_writable($file); + return is_writable(dirname($file)); + } + + function postProcess() + { + global $currentIndex; + + if (Tools::isSubmit('submitHtaccess')) + { + if ($this->tabAccess['edit'] === '1') + { + Configuration::updateValue('PS_HTACCESS_CACHE_CONTROL', (int)Tools::getValue('PS_HTACCESS_CACHE_CONTROL')); + Configuration::updateValue('PS_REWRITING_SETTINGS', (int)Tools::getValue('PS_REWRITING_SETTINGS')); + Configuration::updateValue('PS_HTACCESS_SPECIFIC', Tools::getValue('ps_htaccess_specific'), true); + if (Tools::generateHtaccess($this->_htFile, Configuration::get('PS_REWRITING_SETTINGS'), Configuration::get('PS_HTACCESS_CACHE_CONTROL'), Tools::getValue('ps_htaccess_specific'))) + Tools::redirectAdmin($currentIndex.'&conf=4&token='.$this->token); + $this->_errors[] = $this->l('Cannot write into file:').' '.$this->_htFile.'
'.$this->l('Please check write permissions.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + + if (Tools::isSubmit('submitRobots')) + { + if ($this->tabAccess['edit'] === '1') + { + if (!$writeFd = @fopen($this->_rbFile, 'w')) + die ($this->l('Cannot write into file:').' '.$this->_rbFile.'
'.$this->l('Please check write permissions.')); + else + { + // PS Comments + fwrite($writeFd, "# robots.txt automaticaly generated by PrestaShop e-commerce open-source solution\n"); + fwrite($writeFd, "# http://www.prestashop.com - http://www.prestashop.com/forums\n\n"); + fwrite($writeFd, "# This file is to prevent the crawling and indexing of certain parts\n"); + fwrite($writeFd, "# of your site by web crawlers and spiders run by sites like Yahoo!\n"); + fwrite($writeFd, "# and Google. By telling these \"robots\" where not to go on your site,\n"); + fwrite($writeFd, "# you save bandwidth and server resources.\n\n"); + fwrite($writeFd, "# For more information about the robots.txt standard, see:\n"); + fwrite($writeFd, "# http://www.robotstxt.org/wc/robots.html\n\n"); + + // User-Agent + fwrite($writeFd, "User-agent: *\n"); + + // Directories + fwrite($writeFd, "# Directories\n"); + foreach ($this->_rbData['Directories'] as $dir) + fwrite($writeFd, 'Disallow: '.__PS_BASE_URI__.$dir."\n"); + + // Files + fwrite($writeFd, "# Files\n"); + foreach ($this->_rbData['Files'] as $file) + fwrite($writeFd, 'Disallow: '.__PS_BASE_URI__.$file."\n"); + + // Sitemap + fwrite($writeFd, "# Sitemap\n"); + if (file_exists($this->_smFile)) + if (filesize($this->_smFile)) + fwrite($writeFd, 'Sitemap: '.(Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].__PS_BASE_URI__.'sitemap.xml'."\n"); + fwrite($writeFd, "\n"); + + fclose($writeFd); + Tools::redirectAdmin($currentIndex.'&conf=4&token='.$this->token); + } + } else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + } + + public function _getRobotsContent() + { + $tab = array(); + + // Directories + $tab['Directories'] = array('classes/', 'config/', 'download/', 'mails/', 'modules/', 'translations/', 'tools/', 'lang-'.Language::getIsoById(Configuration::get('PS_LANG_DEFAULT')).'/'); + + // Files + $tab['Files'] = array('addresses.php', 'address.php', 'authentication.php', 'cart.php', 'discount.php', 'footer.php', + 'get-file.php', 'header.php', 'history.php', 'identity.php', 'images.inc.php', 'init.php', 'my-account.php', 'order.php', 'order-opc.php', + 'order-slip.php', 'order-detail.php', 'order-follow.php', 'order-return.php', 'order-confirmation.php', 'pagination.php', 'password.php', + 'pdf-invoice.php', 'pdf-order-return.php', 'pdf-order-slip.php', 'product-sort.php', 'search.php', 'statistics.php','attachment.php', 'guest-tracking', + '*orderby=','*orderway=','*tag=','*id_currency=','*search_query=','*id_lang=','*back=','*utm_source=','*utm_medium=','*utm_campaign=','*n='); + + return $tab; + } +} \ No newline at end of file diff --git a/admin-dev/tabs/AdminGeolocation.php b/admin-dev/tabs/AdminGeolocation.php new file mode 100755 index 000000000..96ef0fef0 --- /dev/null +++ b/admin-dev/tabs/AdminGeolocation.php @@ -0,0 +1,189 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminGeolocation extends AdminTab +{ + public function display() + { + global $currentIndex, $cookie; + + echo ' +

'.$this->l('Geolocation').'

+ '; + + if (!$this->_isGeoLiteCityAvailable()) + $this->displayWarning($this->l('In order to use Geolocation, please download').' '.$this->l('this file').' '.$this->l('and decompress it into tools/geoip/ directory')); + + echo ' +
+
+ '.$this->l('Geolocation by IP').' + + +
+ + +

'.$this->l('This option allows you, among other things, to restrict access to your shop for many countries. See below.').'

+
+ +
+ +
+
+
+ '; + $allowedCountries = explode(';', Configuration::get('PS_ALLOWED_COUNTRIES')); + echo ' +
+
+ '.$this->l('Options').' + +
+ '.$this->l('The following features are only available if you enable the Geolocation by IP feature.').' +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ + + + + + + + + '; + foreach (Country::getCountries(intval($cookie->id_lang)) AS $country) + echo ' + + + + + '; + echo ' + +
'.$this->l('Name').'
'.Tools::htmlentitiesUTF8($country['name']).'
+
+ +
+ +
+
+
+ +
+
+ '.$this->l('Whitelist of IP addresses').' + +
+ '.$this->l('You can add many IP addresses, these addresses will always be allowed to access your shop (e.g. Google bots IP).').' +
+ + +
+ +
+ +
+ +
+
+
+ '; + } + + public function postProcess() + { + global $currentIndex; + + if (Tools::isSubmit('submitGeolocationConfiguration')) + { + if ($this->_isGeoLiteCityAvailable()) + { + Configuration::updateValue('PS_GEOLOCATION_ENABLED', intval(Tools::getValue('PS_GEOLOCATION_ENABLED'))); + Tools::redirectAdmin($currentIndex.'&token='.Tools::getValue('token').'&conf=4'); + } + else + $this->_errors[] = Tools::displayError('Geolocation database is unavailable.'); + } + + if (Tools::isSubmit('submitGeolocationCountries')) + { + if (!is_array(Tools::getValue('countries')) OR !sizeof(Tools::getValue('countries'))) + $this->_errors[] = Tools::displayError('Country selection is invalid'); + else + { + Configuration::updateValue('PS_GEOLOCATION_BEHAVIOR', (!(int)(Tools::getValue('PS_GEOLOCATION_BEHAVIOR')) ? _PS_GEOLOCATION_NO_CATALOG_ : _PS_GEOLOCATION_NO_ORDER_)); + Configuration::updateValue('PS_GEOLOCATION_NA_BEHAVIOR', (int)Tools::getValue('PS_GEOLOCATION_NA_BEHAVIOR')); + Configuration::updateValue('PS_ALLOWED_COUNTRIES', implode(';', Tools::getValue('countries'))); + Tools::redirectAdmin($currentIndex.'&token='.Tools::getValue('token').'&conf=4'); + } + } + + if (Tools::isSubmit('submitGeolocationWhitelist')) + { + if (!Validate::isCleanHtml(Tools::getValue('PS_GEOLOCATION_WHITELIST'))) + $this->_errors[] = Tools::displayError('Invalid whitelist'); + else + { + Configuration::updateValue('PS_GEOLOCATION_WHITELIST', str_replace("\n", ';', str_replace("\r", '', Tools::getValue('PS_GEOLOCATION_WHITELIST')))); + Tools::redirectAdmin($currentIndex.'&token='.Tools::getValue('token').'&conf=4'); + } + } + + return parent::postProcess(); + } + + private function _isGeoLiteCityAvailable() + { + if (file_exists(_PS_GEOIP_DIR_.'GeoLiteCity.dat')) + return true; + return false; + } +} + diff --git a/admin-dev/tabs/AdminGroupShop.php b/admin-dev/tabs/AdminGroupShop.php new file mode 100755 index 000000000..9be0571f2 --- /dev/null +++ b/admin-dev/tabs/AdminGroupShop.php @@ -0,0 +1,114 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +class AdminGroupShop extends AdminTab +{ + + public function __construct() + { + $this->table = 'group_shop'; + $this->className = 'GroupShop'; + $this->edit = true; + $this->delete = false; + $this->deleted = false; + + $this->fieldsDisplay = array( + 'id_group_shop' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('County'), 'width' => 130, 'filter_key' => 'b!name'), + 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false, 'filter_key' => 'active')); + + parent::__construct(); + } + + public function postProcess() + { + if (Tools::isSubmit('delete'.$this->table) OR Tools::isSubmit('status') OR Tools::isSubmit('status'.$this->table)) + { + $object = $this->loadObject(); + if(GroupShop::getTotalGroupShops() == 1) + $this->_errors[] = Tools::displayError('You cannot delete or disable the last groupshop.'); + elseif($object->haveShops()) + $this->_errors[] = Tools::displayError('You cannot delete or disable a groupshop which have this shops using it.'); + + if (sizeof($this->_errors)) + return false; + } + return parent::postProcess(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm($isMainTab); + + if (!($obj = $this->loadObject(true))) + return; + if (Shop::getTotalShops() > 1 AND $obj->id) + $disabled = 'disabled="disabled"'; + else + $disabled = ''; + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('GroupShop').''.$this->l('You can\'t edit GroupShop when you have more than one Shop').'
+ +
+ +
+ +
+ getFieldValue($obj, 'share_datas') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'share_datas') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Share customers, orders and carts between shops of this group').'

+
+ +
+ getFieldValue($obj, 'share_stock') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'share_stock') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Sare stock between shops of this group').'

+
+ +
+ getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'active') ? 'checked="checked" ' : '').'/> + +

'.$this->l('Enable or disable shop').'

+
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} diff --git a/admin-dev/tabs/AdminGroups.php b/admin-dev/tabs/AdminGroups.php new file mode 100644 index 000000000..1cbbe4ac7 --- /dev/null +++ b/admin-dev/tabs/AdminGroups.php @@ -0,0 +1,383 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7332 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminGroups extends AdminTab +{ + public function __construct() + { + $this->table = 'group'; + $this->className = 'Group'; + $this->lang = true; + $this->edit = true; + $this->view = true; + $this->delete = true; + + $this->_select = ' + (SELECT COUNT(jcg.`id_customer`) + FROM `'._DB_PREFIX_.'customer_group` jcg + LEFT JOIN `'._DB_PREFIX_.'customer` jc ON (jc.`id_customer` = jcg.`id_customer`) + WHERE jc.`deleted` != 1 + AND jcg.`id_group` = a.`id_group`) AS nb + '; + $this->_group = 'GROUP BY a.id_group'; + $this->_listSkipDelete = array(1); + + $this->fieldsDisplay = array( + 'id_group' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Name'), 'width' => 80, 'filter_key' => 'b!name'), + 'reduction' => array('title' => $this->l('Discount'), 'width' => 50, 'align' => 'right'), + 'nb' => array('title' => $this->l('Members'), 'width' => 25, 'align' => 'center'), + 'date_add' => array('title' => $this->l('Creation date'), 'width' => 60, 'type' => 'date', 'align' => 'right')); + + parent::__construct(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + $groupReductions = $obj->id ? GroupReduction::getGroupReductions($obj->id, (int)($cookie->id_lang)) : array(); + $categories = Category::getSimpleCategories((int)($cookie->id_lang)); + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Group').' + +
'; + foreach ($this->_languages as $language) + echo ' +
+ * + '.$this->l('Invalid characters:').' 0-9!<>,;?=+()@#"�{}_$%:  +
'; + $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'name', 'name'); + $reduction = htmlentities($this->getFieldValue($obj, 'reduction'), ENT_COMPAT, 'UTF-8'); + echo ' +
+
 
+ +
+ '.$this->l('%').' +

'.$this->l('Will automatically apply this value as a discount on ALL shop\'s products for this group\'s members.').'

+
'; + if ($obj->id) + { + echo ' + +
'; + if ($groupReductions) + { + echo ' + + + + + '; + foreach ($groupReductions AS $groupReduction) + echo ' + + + + + '; + echo '
'.$this->l('Category').''.$this->l('Value').''.$this->l('Action').'
'.Tools::htmlentitiesUTF8($groupReduction['category_name']).''.$this->l('Delete').'
'; + } + else + echo $this->l('No discount'); + echo '
'; + } + echo ' + +
+ +

'.$this->l('How the prices are displayed on order summary for this customer group (tax included or excluded).').'

+
+
 
+
+ +
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoGroupShop(); + echo '
'; + } + echo ' +
* '.$this->l('Required field').'
+
+

'; + + if ($obj->id) + { + echo ' +
+ +
'.$this->l('New group discount').' + +
+ * +
+ +
+ * +
+
 
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + } + + public function viewgroup() + { + global $cookie; + + $currentIndex = 'index.php?tab=AdminGroups'; + if (!($obj = $this->loadObject(true))) + return; + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + + echo ' +
+
+ '.strval($obj->name[(int)($cookie->id_lang)]).' +
 
+ '.$this->l('Discount:').' '.(float)($obj->reduction).$this->l('%').' +
+
 
'; + + $this->fieldsDisplay = (array( + 'ID' => array('title' => $this->l('ID')), + 'sex' => array('title' => $this->l('Sex')), + 'name' => array('title' => $this->l('Name')), + 'e-mail' => array('title' => $this->l('e-mail')), + 'birthdate' => array('title' => $this->l('Birth date')), + 'register_date' => array('title' => $this->l('Registration date')), + 'orders' => array('title' => $this->l('Orders')), + 'status' => array('title' => $this->l('Status')), + 'actions' => array('title' => $this->l('Actions')) + )); + + if ($nbCustomers = $obj->getCustomers(true)) + { + echo '

'.$this->l('Customer members of this group').' ('.$nbCustomers.')

'; + + // Pagination Begin + $customersPerPage = (Tools::getValue('customerPerPage') ? (int)Tools::getValue('customerPerPage') : 50); + $totalPages = ceil($nbCustomers / $customersPerPage); + $perPageOptions = array(20, 50, 100, 300); + + $customerPageIndex = (Tools::getValue('customerPageIndex') && Tools::getValue('customerPageIndex') <= $totalPages ? (int)Tools::getValue('customerPageIndex') : 1); + $from = (Tools::getValue('customerPageIndex') ? ((int)$customerPageIndex - 1) * ((int)$customersPerPage) : 0); + + $customers = $obj->getCustomers(false, $from, $customersPerPage); + + echo ' +
+ '; + + if ($customerPageIndex > 1) + { + echo '  '; + echo '  '; + } + + echo 'Page / '.$totalPages; + + if ($customerPageIndex < $totalPages) + { + echo ' '; + echo ' '; + } + + echo ' | Display + / '.$nbCustomers.' result(s) + +
+ '; + // Pagination End + + echo ' + '; + foreach ($this->fieldsDisplay AS $field) + echo ''.$field['title'].''; + echo ' + '; + $irow = 0; + + foreach ($customers AS $k => $customer) + { + $imgGender = $customer['id_gender'] == 1 ? ''.$this->l('Male').'' : ($customer['id_gender'] == 2 ? ''.$this->l('Female').'' : ''); + echo ' + + + + + + + + + + + '; + } + echo '
'.$customer['id_customer'].''.$imgGender.''.stripslashes($customer['lastname']).' '.stripslashes($customer['firstname']).''.stripslashes($customer['email']).' '.$this->l('Write to this customer').''.Tools::displayDate($customer['birthday'], (int)($cookie->id_lang)).''.Tools::displayDate($customer['date_add'], (int)($cookie->id_lang)).''.Order::getCustomerNbOrders($customer['id_customer']).' + + '.$this->l('View orders').' + + '.$this->l('Modify this customer').' + + '.$this->l('Delete this customer').' +
'; + } + else + echo '

'.$this->l('No user in this group.').'

'; + } + + public function postProcess() + { + global $currentIndex; + + $token = Tools::getValue('token') ? Tools::getValue('token') : $this->token; + + if (Tools::isSubmit('deleteGroupReduction')) + { + if ($this->tabAccess['delete'] === '1') + { + if (!$id_group_reduction = Tools::getValue('id_group_reduction')) + $this->_errors[] = Tools::displayError('Invalid group reduction ID'); + else + { + $groupReduction = new GroupReduction((int)($id_group_reduction)); + if (!$groupReduction->delete()) + $this->_errors[] = Tools::displayError('An error occurred while deleting the group reduction'); + else + Tools::redirectAdmin($currentIndex.'&update'.$this->table.'&id_group='.(int)(Tools::getValue('id_group')).'&conf=1&token='.$token); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + if (Tools::isSubmit('submitAddGroupReduction')) + { + if ($this->tabAccess['add'] === '1') + { + if (!($obj = $this->loadObject())) + return; + $groupReduction = new GroupReduction(); + if (!$id_category = Tools::getValue('id_category') OR !Validate::isUnsignedId($id_category)) + $this->_errors[] = Tools::displayError('Wrong category ID'); + elseif (!$reduction = Tools::getValue('reduction') OR !Validate::isPrice($reduction)) + $this->_errors[] = Tools::displayError('Invalid reduction (must be a percentage)'); + elseif (GroupReduction::doesExist((int)($obj->id), $id_category)) + $this->_errors[] = Tools::displayError('A reduction already exists for this category.'); + else + { + $groupReduction->id_category = (int)($id_category); + $groupReduction->id_group = (int)($obj->id); + $groupReduction->reduction = (float)($reduction) / 100; + if (!$groupReduction->add()) + $this->_errors[] = Tools::displayError('An error occurred while adding a category group reduction.'); + else + Tools::redirectAdmin($currentIndex.'&update'.$this->table.'&id_group='.(int)(Tools::getValue('id_group')).'&conf=3&token='.$this->token); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + if (Tools::isSubmit('submitAddgroup')) + { + if ($this->tabAccess['add'] === '1') + { + if (Tools::getValue('reduction') > 100 OR Tools::getValue('reduction') < 0) + $this->_errors[] = Tools::displayError('Reduction value is incorrect'); + else + { + $id_group_reductions = Tools::getValue('gr_id_group_reduction'); + $reductions = Tools::getValue('gr_reduction'); + if ($id_group_reductions) + foreach ($id_group_reductions AS $key => $id_group_reduction) + if (!Validate::isUnsignedId($id_group_reductions[$key]) OR !Validate::isPrice($reductions[$key])) + $this->_errors[] = Tools::displayError(); + else + { + $groupReduction = new GroupReduction((int)($id_group_reductions[$key])); + $groupReduction->reduction = $reductions[$key] / 100; + if (!$groupReduction->update()) + $this->errors[] = Tools::displayError('Cannot update group reductions'); + } + if (!sizeof($this->_errors)) + parent::postProcess(); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + elseif (isset($_GET['delete'.$this->table])) + { + if ($this->tabAccess['delete'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->id == 1) + $this->_errors[] = Tools::displayError('You cannot delete default group.'); + else + { + if ($object->delete()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.$token); + $this->_errors[] = Tools::displayError('An error occurred during deletion.'); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + else + parent::postProcess(); + } +} diff --git a/admin-dev/tabs/AdminHome.php b/admin-dev/tabs/AdminHome.php new file mode 100644 index 000000000..992753dd6 --- /dev/null +++ b/admin-dev/tabs/AdminHome.php @@ -0,0 +1,441 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminHome extends AdminTab +{ + public function postProcess() + { + } + + private function _displayOptimizationTips() + { + $rewrite = 0; + if (Configuration::get('PS_REWRITING_SETTINGS')) + { + $rewrite = 2; + if (!file_exists(dirname(__FILE__).'/../../.htaccess')) + $rewrite = 1; + else + { + $stat = stat(dirname(__FILE__).'/../../.htaccess'); + if (strtotime(Db::getInstance()->getValue('SELECT date_upd FROM '._DB_PREFIX_.'configuration WHERE name = "PS_REWRITING_SETTINGS"')) > $stat['mtime']) + $rewrite = 0; + } + } + + $htaccessAfterUpdate = 2; + $htaccessOptimized = (Configuration::get('PS_HTACCESS_CACHE_CONTROL') ? 2 : 0); + if (!file_exists(dirname(__FILE__).'/../../.htaccess')) + { + if (Configuration::get('PS_HTACCESS_CACHE_CONTROL')) + $htaccessOptimized = 1; + } + else + { + $stat = stat(dirname(__FILE__).'/../../.htaccess'); + $dateUpdHtaccess = Db::getInstance()->getValue('SELECT date_upd FROM '._DB_PREFIX_.'configuration WHERE name = "PS_HTACCESS_CACHE_CONTROL"'); + if (Configuration::get('PS_HTACCESS_CACHE_CONTROL') AND strtotime($dateUpdHtaccess) > $stat['mtime']) + $htaccessOptimized = 1; + + $dateUpdate = Configuration::get('PS_LAST_SHOP_UPDATE'); + if ($dateUpdate AND strtotime($dateUpdate) > $stat['mtime']) + $htaccessAfterUpdate = 0; + } + $indexRebuiltAfterUpdate = 0; + $needRebuild=Configuration::get('PS_NEED_REBUILD_INDEX'); + if($needRebuild !='0'); + $indexRebuiltAfterUpdate = 2; + + $smartyOptimized = 0; + if (!Configuration::get('PS_SMARTY_FORCE_COMPILE')) + ++$smartyOptimized; + if (Configuration::get('PS_SMARTY_CACHE')) + ++$smartyOptimized; + + $cccOptimized = Configuration::get('PS_CSS_THEME_CACHE') + + Configuration::get('PS_JS_THEME_CACHE') + + Configuration::get('PS_HTML_THEME_COMPRESSION') + + Configuration::get('PS_JS_HTML_THEME_COMPRESSION'); + if ($cccOptimized == 4) + $cccOptimized = 2; + else + $cccOptimized = 1; + + $shopEnabled = (Configuration::get('PS_SHOP_ENABLE') ? 2 : 1); + + $lights = array( + 0 => array('image'=>'error2.png','color'=>'#fbe8e8'), + 1 => array('image'=>'warn2.png','color'=>'#fffac6'), + 2 => array('image'=>'ok2.png','color'=>'#dffad3')); + + + if ($rewrite + $htaccessOptimized + $smartyOptimized + $cccOptimized + $shopEnabled + $htaccessAfterUpdate + $indexRebuiltAfterUpdate != 14) + echo ' +
+
'.$this->l('A good beginning...') + .' + + v':'href="?hideOptimizationTips" > + X + ').'
'; + echo ' + + '; + echo ' +
'; + } + public function display() + { + global $cookie; + $this->warnDomainName(); + + $tab = get_class(); + $protocol = (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')?'https':'http'; + $isoDefault = Language::getIsoById(intval(Configuration::get('PS_LANG_DEFAULT'))); + $isoUser = Language::getIsoById(intval($cookie->id_lang)); + $isoCountry = Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT')); + $currency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + echo '
+

'.$this->l('Dashboard').'

+
+
'; + if (@ini_get('allow_url_fopen') AND $update = checkPSVersion()) + echo '

'.$this->l('New PrestaShop version available').' : '.$this->l('Download').' '.$update['name'].' !

'; + elseif (!@ini_get('allow_url_fopen')) + { + echo '

'.$this->l('Update notification unavailable').'

'; + echo '

 

'; + echo '

'.$this->l('To receive PrestaShop update warnings, you need to activate the allow_url_fopen command in your php.ini config file.').' ['.$this->l('more info').']

'; + echo '

'.$this->l('If you don\'t know how to do that, please contact your host administrator !').'


'; + } + echo '
'; + + if (!isset($cookie->show_screencast)) + $cookie->show_screencast = true; + if ($cookie->show_screencast) + echo' +
+ + +
+ +

'; + + + echo ' +
+ + '; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT SUM(o.`total_paid_real` / o.conversion_rate) as total_sales, COUNT(*) as total_orders + FROM `'._DB_PREFIX_.'orders` o + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN \''.date('Y-m').'-01 00:00:00\' AND \''.date('Y-m').'-31 23:59:59\' '); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(`id_customer`) AS total_registrations + FROM `'._DB_PREFIX_.'customer` c + WHERE c.`date_add` BETWEEN \''.date('Y-m').'-01 00:00:00\' AND \''.date('Y-m').'-31 23:59:59\''); + $result3 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT SUM(pv.`counter`) AS total_viewed + FROM `'._DB_PREFIX_.'page_viewed` pv + LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON pv.`id_date_range` = dr.`id_date_range` + LEFT JOIN `'._DB_PREFIX_.'page` p ON pv.`id_page` = p.`id_page` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type` + WHERE pt.`name` = \'product.php\' + AND dr.`time_start` BETWEEN \''.date('Y-m').'-01 00:00:00\' AND \''.date('Y-m').'-31 23:59:59\' + AND dr.`time_end` BETWEEN \''.date('Y-m').'-01 00:00:00\' AND \''.date('Y-m').'-31 23:59:59\''); + $results = array_merge($result, array_merge($result2, $result3)); + echo ' +
+
'.$this->l('View more').' '.$this->l('Monthly Statistics').'
+ + + + + + + + + + + + + + + + + +
+ '.$this->l('Sales').' + + '.Tools::displayPrice($results['total_sales'], $currency).' +
+ '.$this->l('Total registrations').' + + '.(int)($results['total_registrations']).' +
+ '.$this->l('Total orders').' + + '.(int)($results['total_orders']).' +
+ '.$this->l('Product pages viewed').' + + '.(int)($results['total_viewed']).' +
+
+ '; + $all = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'customer_thread'); + $unread = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'customer_thread` WHERE `status` = "open"'); + $pending = (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'customer_thread` WHERE `status` LIKE "%pending%"'); + $close = $all - ($unread + $pending); + echo ' +
+
'.$this->l('View more').' '.$this->l('Customers service').'
+ + + + + + + + + + + + + + + + + +
+ '.$this->l('Thread unread').' + + '.$unread.' +
+ '.$this->l('Thread pending').' + + '.$pending.' +
+ '.$this->l('Thread closed').' + + '.$close.' +
+ '.$this->l('Total thread').' + + '.$all.' +
+
+ +
+
'.$this->l('View more').' '.$this->l('Statistics').' / '.$this->l('Sales of the week').'
+
'; + + define('PS_BASE_URI', __PS_BASE_URI__); + $chart = new Chart(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT total_paid / conversion_rate as total_converted, invoice_date + FROM '._DB_PREFIX_.'orders o + WHERE valid = 1 + AND invoice_date BETWEEN \''.date('Y-m-d', strtotime('-7 DAYS', time())).' 00:00:00\' AND \''.date('Y-m-d H:i:s').'\''); + foreach ($result as $row) + $chart->getCurve(1)->setPoint(strtotime($row['invoice_date']), $row['total_converted']); + $chart->setSize(580, 170); + $chart->setTimeMode(strtotime('-7 DAYS', time()), time(), 'd'); + $chart->getCurve(1)->setLabel($this->l('Sales +Tx').' ('.strtoupper($currency->iso_code).')'); + $chart->display(); + echo '
+
+ + + + + + + + + + + '; + + $orders = Order::getOrdersWithInformations(10); + $i = 0; + foreach ($orders AS $order) + { + $currency = Currency::getCurrency((int)$order['id_currency']); + echo ' + + + + + + + + '; + $i++; + } + + echo ' + +
'.$this->l('ID').''.$this->l('Customer Name').''.$this->l('Status').''.$this->l('Total').''.$this->l('Action').'
'.(int)$order['id_order'].''.Tools::htmlentitiesUTF8($order['firstname']).' '.Tools::htmlentitiesUTF8($order['lastname']).''.Tools::htmlentitiesUTF8($order['state_name']).''.Tools::displayPrice((float)$order['total_paid'], $currency).' + '.$this->l('See').' +
+
+
+ +
+

'.translate('Loading...').'

+
+ '; + + if (Tools::isSubmit('hideOptimizationTips')) + Configuration::updateValue('PS_HIDE_OPTIMIZATION_TIPS', 1); + + $this->_displayOptimizationTips(); + + echo ' +
+

'.translate('Loading...').'

+
+
+
'; + + echo Module::hookExec('backOfficeHome'); + } +} + + diff --git a/admin-dev/tabs/AdminImageResize.php b/admin-dev/tabs/AdminImageResize.php new file mode 100644 index 000000000..94c1d9404 --- /dev/null +++ b/admin-dev/tabs/AdminImageResize.php @@ -0,0 +1,100 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminImageResize extends AdminTab +{ + public function postProcess() + { + global $currentIndex, $cookie; + + if (isset($_POST['resize'])) + { + $imagesTypes = ImageType::getImagesTypes('products'); + $sourceFile['tmp_name'] = _PS_IMG_DIR_.'/p/'.Tools::getValue('id_product').'-'.Tools::getValue('id_image').'.jpg'; + foreach ($imagesTypes AS $k => $imageType) + if (!imageCut + ($sourceFile, + _PS_IMG_DIR_.'p/'.Tools::getValue('id_product').'-'.Tools::getValue('id_image').'-'.stripslashes($imageType['name']).'.jpg', + $imageType['width'], + $imageType['height'], + 'jpg', + $_POST[$imageType['id_image_type'].'_x1'], + $_POST[$imageType['id_image_type'].'_y1'])) + $this->_errors = Tools::displayError('An error occurred while copying image.').' '.stripslashes($imageType['name']); + // Save and stay on same form + if (Tools::getValue('saveandstay') == 'on') + Tools::redirectAdmin($currentIndex.'&id_product='.Tools::getValue('id_product').'&id_category='.(int)(Tools::getValue('id_category')).'&addproduct&conf=4&tabs=1&token='.Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee))); + // Default behavior (save and back) + Tools::redirectAdmin($currentIndex.'&id_category='.(int)(Tools::getValue('id_category')).'&conf='.(int)(Tools::getValue('conf')).'&token='.Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee))); + } else + parent::postProcess(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + $imagesTypes = ImageType::getImagesTypes(); + $imageObj = new Image(Tools::getValue('id_image')); + echo ' + + + + + + +
+ + + + + + +
+ '.$this->l('Image resize').' + '.$this->l('Using your mouse, define which area of the image is to be used for generating each type of thumbnail.').' +

+ + +
+ + +
'; + foreach ($imagesTypes AS $type) + echo ' + + + + '; + echo '
+
'; + } +} \ No newline at end of file diff --git a/admin-dev/tabs/AdminImages.php b/admin-dev/tabs/AdminImages.php new file mode 100644 index 000000000..b0f18faef --- /dev/null +++ b/admin-dev/tabs/AdminImages.php @@ -0,0 +1,444 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminImages extends AdminTab +{ + private $start_time = 0; + private $max_execution_time = 7200; + + public function __construct() + { + $this->table = 'image_type'; + $this->className = 'ImageType'; + $this->lang = false; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'id_image_type' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Name'), 'width' => 140, 'size' => 16), + 'width' => array('title' => $this->l('Width'), 'align' => 'right', 'suffix' => ' px', 'width' => 50, 'size' => 5), + 'height' => array('title' => $this->l('Height'), 'align' => 'right', 'suffix' => ' px', 'width' => 50, 'size' => 5) + ); + parent::__construct(); + } + + public function displayList() + { + parent::displayList(); + $this->displayRegenerate(); + $this->displayMoveImages(); + } + + public function postProcess() + { + global $currentIndex; + if (Tools::getValue('submitRegenerate'.$this->table)) + { + if ($this->tabAccess['edit'] === '1') + { + if ($this->_regenerateThumbnails(Tools::getValue('type'), Tools::getValue('erase'))) + Tools::redirectAdmin($currentIndex.'&conf=9'.'&token='.$this->token); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + }elseif (Tools::getValue('submitMoveImages'.$this->table)) + $this->_moveImagesToNewFileSystem(); + else + parent::postProcess(); + } + + protected function _childValidation() + { + if (!Tools::getValue('id_image_type') AND Validate::isImageTypeName($typeName = Tools::getValue('name')) AND ImageType::typeAlreadyExists($typeName)) + $this->_errors[] = Tools::displayError('This name already exists.'); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + + echo $obj->id ? $this->displayWarning($this->l('After modification, do not forget to regenerate thumbnails')) : ''; + + echo ' +
+ '.($obj->id ? '' : '').' +
+ '.$this->l('Images').'
+ +
+ * +

'.$this->l('Letters only (e.g., small, medium, large, extra-large)').'

+
+ +
+ * +

'.$this->l('Maximum image width in pixels').'

+
+ +
+ * +

'.$this->l('Maximum image height in pixels').'

+
+ +
+ getFieldValue($obj, 'products') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'products') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This type will be applied to product images').'

+
+ +
+ getFieldValue($obj, 'categories') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'categories') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This type will be applied to category images').'

+
+ +
+ getFieldValue($obj, 'manufacturers') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'manufacturers') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This type will be applied to manufacturer images').'

+
+ +
+ getFieldValue($obj, 'suppliers') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'suppliers') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This type will be applied to suppliers images').'

+
+ +
+ getFieldValue($obj, 'scenes') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'scenes') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This type will be applied to scenes images').'

+
+ +
+ getFieldValue($obj, 'stores') ? 'checked="checked" ' : '').'/> + + getFieldValue($obj, 'stores') ? 'checked="checked" ' : '').'/> + +

'.$this->l('This type will be applied to stores images').'

+
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + + /** + * Display form for thumbnails regeneration + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayRegenerate() + { + global $currentIndex; + + $types = array( + 'categories' => $this->l('Categories'), + 'manufacturers' => $this->l('Manufacturers'), + 'suppliers' => $this->l('Suppliers'), + 'scenes' => $this->l('Scenes'), + 'products' => $this->l('Products'), + 'stores' => $this->l('Stores') + ); + echo ' +

'.$this->l('Regenerate thumbnails').'

+ '.$this->l('Regenerates thumbnails for all existing product images').'.

'; + $this->displayWarning($this->l('Please be patient, as this can take several minutes').'
'.$this->l('Be careful! Manually generated thumbnails will be erased by automatically generated thumbnails.')); + echo ' +
+
+ '.$this->l('Regenerate thumbnails').'
+ +
+ +
'; + + foreach ($types AS $k => $type) + { + $formats = ImageType::getImagesTypes($k); + echo ' + + '; + } + echo ' + + +
+ +

'.$this->l('Uncheck this checkbox only if your server timed out and you need to resume the regeneration.').'

+
+
+
+
+
'; + } + + /** + * Delete resized image then regenerate new one with updated settings + */ + private function _deleteOldImages($dir, $type, $product = false) + { + $toDel = scandir($dir); + foreach ($toDel AS $d) + foreach ($type AS $imageType) + if (preg_match('/^[0-9]+\-'.($product ? '[0-9]+\-' : '').$imageType['name'].'\.jpg$/', $d) OR preg_match('/^([[:lower:]]{2})\-default\-(.*)\.jpg$/', $d)) + if (file_exists($dir.$d)) + unlink($dir.$d); + + // delete product images using new filesystem. + if ($product) + { + $productsImages = Image::getAllImages(); + foreach ($productsImages AS $k => $image) + { + $imageObj = new Image($image['id_image']); + $imageObj->id_product = $image['id_product']; + if (file_exists($dir.$imageObj->getImgFolder())) + { + $toDel = scandir($dir.$imageObj->getImgFolder()); + foreach ($toDel AS $d) + foreach ($type AS $imageType) + if (preg_match('/^[0-9]+\-'.$imageType['name'].'\.jpg$/', $d)) + if (file_exists($dir.$imageObj->getImgFolder().$d)) + unlink($dir.$imageObj->getImgFolder().$d); + } + } + } + } + + // Regenerate images + private function _regenerateNewImages($dir, $type, $productsImages = false) + { + $errors = false; + $toRegen = scandir($dir); + if (!$productsImages) + { + foreach ($toRegen AS $image) + if (preg_match('/^[0-9]*\.jpg$/', $image)) + foreach ($type AS $k => $imageType) + { + // Customizable writing dir + $newDir = $dir; + if ($imageType['name'] == 'thumb_scene') + $newDir .= 'thumbs/'; + if (!file_exists($newDir)) + continue; + if (!file_exists($newDir.substr($image, 0, -4).'-'.stripslashes($imageType['name']).'.jpg')) + if (!imageResize($dir.$image, $newDir.substr($image, 0, -4).'-'.stripslashes($imageType['name']).'.jpg', (int)($imageType['width']), (int)($imageType['height']))) + $errors = true; + if (time() - $this->start_time > $this->max_execution_time - 4) // stop 4 seconds before the tiemout, just enough time to process the end of the page on a slow server + return 'timeout'; + } + } + else + { + $productsImages = Image::getAllImages(); + foreach ($productsImages AS $k => $image) + { + $imageObj = new Image($image['id_image']); + if (file_exists($dir.$imageObj->getExistingImgPath().'.jpg')) + foreach ($type AS $k => $imageType) + { + if (!file_exists($dir.$imageObj->getExistingImgPath().'-'.stripslashes($imageType['name']).'.jpg')) + if (!imageResize($dir.$imageObj->getExistingImgPath().'.jpg', $dir.$imageObj->getExistingImgPath().'-'.stripslashes($imageType['name']).'.jpg', (int)($imageType['width']), (int)($imageType['height']))) + $errors = true; + if (time() - $this->start_time > $this->max_execution_time - 4) // stop 4 seconds before the tiemout, just enough time to process the end of the page on a slow server + return 'timeout'; + } + } + } + return $errors; + } + + // Regenerate no-pictures images + private function _regenerateNoPictureImages($dir, $type, $languages) + { + $errors = false; + foreach ($type AS $k => $imageType) + foreach ($languages AS $language) + { + $file = $dir.$language['iso_code'].'.jpg'; + if (!file_exists($file)) + $file = _PS_PROD_IMG_DIR_.Language::getIsoById((int)(Configuration::get('PS_LANG_DEFAULT'))).'.jpg'; + if (!file_exists($dir.$language['iso_code'].'-default-'.stripslashes($imageType['name']).'.jpg')) + if (!imageResize($file, $dir.$language['iso_code'].'-default-'.stripslashes($imageType['name']).'.jpg', (int)($imageType['width']), (int)($imageType['height']))) + $errors = true; + } + return $errors; + } + + // Hook watermark optimization + private function _regenerateWatermark($dir) + { + $result = Db::getInstance()->ExecuteS(' + SELECT m.`name` FROM `'._DB_PREFIX_.'module` m + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` + WHERE h.`name` = \'watermark\' AND m.`active` = 1'); + + if ($result AND sizeof($result)) + { + $productsImages = Image::getAllImages(); + foreach ($productsImages AS $k => $image) + $imageObj = new Image($image['id_image']); + if (file_exists($dir.$imageObj->getExistingImgPath().'.jpg')) + foreach ($result AS $k => $module) + { + if ($moduleInstance = Module::getInstanceByName($module['name']) AND is_callable(array($moduleInstance, 'hookwatermark'))) + call_user_func(array($moduleInstance, 'hookwatermark'), array('id_image' => $image['id_image'], 'id_product' => $image['id_product'])); + if (time() - $this->start_time > $this->max_execution_time - 4) // stop 4 seconds before the tiemout, just enough time to process the end of the page on a slow server + return 'timeout'; + } + } + } + + private function _regenerateThumbnails($type = 'all', $deleteOldImages = false) + { + $this->start_time = time(); + ini_set('max_execution_time', $this->max_execution_time); // ini_set may be disabled, we need the real value + $this->max_execution_time = (int)ini_get('max_execution_time'); + $languages = Language::getLanguages(false); + + $process = + array( + array('type' => 'categories', 'dir' => _PS_CAT_IMG_DIR_), + array('type' => 'manufacturers', 'dir' => _PS_MANU_IMG_DIR_), + array('type' => 'suppliers', 'dir' => _PS_SUPP_IMG_DIR_), + array('type' => 'scenes', 'dir' => _PS_SCENE_IMG_DIR_), + array('type' => 'products', 'dir' => _PS_PROD_IMG_DIR_), + array('type' => 'stores', 'dir' => _PS_STORE_IMG_DIR_) + ); + + // Launching generation process + foreach ($process AS $k => $proc) + { + if ($type != 'all' && $type != $proc['type']) + continue ; + + // Getting format generation + $formats = ImageType::getImagesTypes($proc['type']); + if ($type != 'all') + { + $format = strval(Tools::getValue('format_'.$type)); + if ($format != 'all') + foreach ($formats AS $k => $form) + if ($form['id_image_type'] != $format) + unset($formats[$k]); + } + + if ($deleteOldImages) + $this->_deleteOldImages($proc['dir'], $formats, ($proc['type'] == 'products' ? true : false)); + if (($return = $this->_regenerateNewImages($proc['dir'], $formats, ($proc['type'] == 'products' ? true : false))) === true) + $this->_errors[] = Tools::displayError('Cannot write ').$proc['type'].Tools::displayError(' images. Please check the folder\'s writing permissions.'); + elseif ($return == 'timeout') + $this->_errors[] = Tools::displayError('Only part of the images have been regenerated, server timed out before finishing.'); + else + { + if ($proc['type'] == 'products') + if ($this->_regenerateWatermark($proc['dir']) == 'timeout') + $this->_errors[] = Tools::displayError('Server timed out, the watermark may not have been applied on all your images.'); + if (!count($this->_errors)) + if ($this->_regenerateNoPictureImages($proc['dir'], $formats, $languages)) + $this->_errors[] = Tools::displayError('Cannot write no-picture image to').' ('.$proc['type'].') '.Tools::displayError('images folder. Please check the folder\'s writing permissions.'); + } + } + return (sizeof($this->_errors) > 0 ? false : true); + } + + /** + * Display the block for moving images + */ + public function displayMoveImages() + { + global $currentIndex; + + echo ' +

'.$this->l('Move images').'

'. + $this->l('A new storage system for product images is now used by PrestaShop. It offers better performance if your shop has a very large number of products.').'
'. + '
+
+
+ '.$this->l('Move images').'
'. + $this->l('You can choose to keep your images stored in the previous system - nothing wrong with that.').'
'. + $this->l('You can also decide to move your images to the new storage system: in this case, click on the "Move images" button below. Please be patient, as this can take several minutes.'). + '

 '. + $this->l('After moving all of your product images, for best performance go to the '). + ''.$this->l('product preferences tab').''. + $this->l(' and set "Activate legacy images compatibility" to NO.').' +

+
+
+
'; +} + + /** + * Move product images to the new filesystem + */ + private function _moveImagesToNewFileSystem() + { + global $currentIndex; + ini_set('max_execution_time', $this->max_execution_time); // ini_set may be disabled, we need the real value + $this->max_execution_time = (int)ini_get('max_execution_time'); + $result = Image::moveToNewFileSystem($this->max_execution_time); + if ($result === 'timeout') + $this->_errors[] = Tools::displayError('Not all images have been moved, server timed out before finishing. Click on \"Move images\" again to resume moving images'); + Tools::redirectAdmin($currentIndex.'&conf=25'.'&token='.$this->token); + } +} diff --git a/admin-dev/tabs/AdminImport.php b/admin-dev/tabs/AdminImport.php new file mode 100644 index 000000000..ab74f0ba9 --- /dev/null +++ b/admin-dev/tabs/AdminImport.php @@ -0,0 +1,1633 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(PS_ADMIN_DIR.'/../images.inc.php'); +@ini_set('max_execution_time', 0); +define('MAX_LINE_SIZE', 4096); + +define('UNFRIENDLY_ERROR', false); // Used for validatefields diying without user friendly error or not + +// this value set the number of columns visible on each page +define('MAX_COLUMNS', 6); +// correct Mac error on eof +@ini_set('auto_detect_line_endings', '1'); + +class AdminImport extends AdminTab +{ + public static $column_mask; + + public $entities = array(); + + public $available_fields = array(); + + public static $required_fields = array('name'); + + public static $default_values = array(); + + public $_warnings = array(); + + public static $validators = array( + 'active' => array('AdminImport', 'getBoolean'), + 'tax_rate' => array('AdminImport', 'getPrice'), + 'price_tex' => array('AdminImport', 'getPrice'), // Tax excluded + 'price_tin' => array('AdminImport', 'getPrice'), // Tax included + 'reduction_price' => array('AdminImport', 'getPrice'), + 'reduction_percent' => array('AdminImport', 'getPrice'), + 'wholesale_price' => array('AdminImport', 'getPrice'), + 'ecotax' => array('AdminImport', 'getPrice'), + 'name' => array('AdminImport', 'createMultiLangField'), + 'description' => array('AdminImport', 'createMultiLangField'), + 'description_short' => array('AdminImport', 'createMultiLangField'), + 'meta_title' => array('AdminImport', 'createMultiLangField'), + 'meta_keywords' => array('AdminImport', 'createMultiLangField'), + 'meta_description' => array('AdminImport', 'createMultiLangField'), + 'link_rewrite' => array('AdminImport', 'createMultiLangField'), + 'available_now' => array('AdminImport', 'createMultiLangField'), + 'available_later' => array('AdminImport', 'createMultiLangField'), + 'category' => array('AdminImport', 'split'), + 'online_only' => array('AdminImport', 'getBoolean') + ); + + public function __construct() + { + $this->entities = array_flip(array($this->l('Categories'), $this->l('Products'), $this->l('Combinations'), $this->l('Customers'), $this->l('Addresses'), $this->l('Manufacturers'), $this->l('Suppliers'))); + + switch ((int)(Tools::getValue('entity'))) + { + case $this->entities[$this->l('Combinations')]: + + self::$required_fields = array('id_product', 'options'); + $this->available_fields = array( + 'no' => array('label' => $this->l('Ignore this column')), + 'id_product' => array('label' => $this->l('Product ID').'*'), + 'options' => array('label' => $this->l('Options (Group:Value)').'*'), + 'reference' => array('label' => $this->l('Reference')), + 'supplier_reference' => array('label' => $this->l('Supplier reference')), + 'ean13' => array('label' => $this->l('EAN13')), + 'upc' => array('label' => $this->l('UPC')), + 'wholesale_price' => array('label' => $this->l('Wholesale price')), + 'price' => array('label' => $this->l('Price')), + 'ecotax' => array('label' => $this->l('Ecotax')), + 'quantity' => array('label' => $this->l('Quantity')), + 'weight' => array('label' => $this->l('Weight')), + 'default_on' => array('label' => $this->l('Default')) + ); + + self::$default_values = array( + 'reference' => '', + 'supplier_reference' => '', + 'ean13' => '', + 'upc' => '', + 'wholesale_price' => 0, + 'price' => 0, + 'ecotax' => 0, + 'quantity' => 0, + 'weight' => 0, + 'default_on' => 0 + ); + + break; + + case $this->entities[$this->l('Categories')]: + + $this->available_fields = array( + 'no' => array('label' => $this->l('Ignore this column')), + 'id' => array('label' => $this->l('ID')), + 'active' => array('label' => $this->l('Active (0/1)')), + 'name' => array('label' => $this->l('Name *')), + 'parent' => array('label' => $this->l('Parent category')), + 'description' => array('label' => $this->l('Description')), + 'meta_title' => array('label' => $this->l('Meta-title')), + 'meta_keywords' => array('label' => $this->l('Meta-keywords')), + 'meta_description' => array('label' => $this->l('Meta-description')), + 'link_rewrite' => array('label' => $this->l('URL rewritten')), + 'image' => array('label' => $this->l('Image URL'))); + + self::$default_values = array('active' => '1', 'parent' => '1', 'link_rewrite' => ''); + + break; + + case $this->entities[$this->l('Products')]: + + self::$validators['image'] = array('AdminImport', 'split'); + + $this->available_fields = array( + 'no' => array('label' => $this->l('Ignore this column')), + 'id' => array('label' => $this->l('ID')), + 'active' => array('label' => $this->l('Active (0/1)')), + 'name' => array('label' => $this->l('Name *')), + 'category' => array('label' => $this->l('Categories (x,y,z...)')), + 'price_tex' => array('label' => $this->l('Price tax excl.')), + 'price_tin' => array('label' => $this->l('Price tax incl.')), + 'id_tax_rules_group' => array('label' => $this->l('Tax rules id')), + 'wholesale_price' => array('label' => $this->l('Wholesale price')), + 'on_sale' => array('label' => $this->l('On sale (0/1)')), + 'reduction_price' => array('label' => $this->l('Discount amount')), + 'reduction_percent' => array('label' => $this->l('Discount percent')), + 'reduction_from' => array('label' => $this->l('Discount from (yyyy-mm-dd)')), + 'reduction_to' => array('label' => $this->l('Discount to (yyyy-mm-dd)')), + 'reference' => array('label' => $this->l('Reference #')), + 'supplier_reference' => array('label' => $this->l('Supplier reference #')), + 'supplier' => array('label' => $this->l('Supplier')), + 'manufacturer' => array('label' => $this->l('Manufacturer')), + 'ean13' => array('label' => $this->l('EAN13')), + 'upc' => array('label' => $this->l('UPC')), + 'ecotax' => array('label' => $this->l('Ecotax')), + 'weight' => array('label' => $this->l('Weight')), + 'quantity' => array('label' => $this->l('Quantity')), + 'description_short' => array('label' => $this->l('Short description')), + 'description' => array('label' => $this->l('Description')), + 'tags' => array('label' => $this->l('Tags (x,y,z...)')), + 'meta_title' => array('label' => $this->l('Meta-title')), + 'meta_keywords' => array('label' => $this->l('Meta-keywords')), + 'meta_description' => array('label' => $this->l('Meta-description')), + 'link_rewrite' => array('label' => $this->l('URL rewritten')), + 'available_now' => array('label' => $this->l('Text when in-stock')), + 'available_later' => array('label' => $this->l('Text if back-order allowed')), + 'image' => array('label' => $this->l('Image URLs (x,y,z...)')), + 'delete_existing_images' => array( + 'label' => $this->l('Delete existing images (0 = no, 1 = yes)'), + 'help' => $this->l('If you do not specify this column and you specify the column images, all images of the product will be replaced by those specified in the import file')), + 'feature' => array('label' => $this->l('Feature')), + 'online_only' => array('label' => $this->l('Only available online')), + 'condition' => array('label' => $this->l('Condition'))); + + self::$default_values = array( + 'id_category' => array(1), + 'id_category_default' => 1, + 'active' => '1', + 'quantity' => 0, + 'price' => 0, + 'id_tax_rules_group' => 0, + 'description_short' => array((int)(Configuration::get('PS_LANG_DEFAULT')) => ''), + 'link_rewrite' => array((int)(Configuration::get('PS_LANG_DEFAULT')) => ''), + 'online_only' => 0, + 'condition' => 'new'); + + break; + + case $this->entities[$this->l('Customers')]: + + //Overwrite required_fields AS only email is required whereas other entities + self::$required_fields = array('email', 'passwd', 'lastname', 'firstname'); + + $this->available_fields = array( + 'no' => array('label' => $this->l('Ignore this column')), + 'id' => array('label' => $this->l('ID')), + 'active' => array('label' => $this->l('Active (0/1)')), + 'id_gender' => array('label' => $this->l('Gender ID (Mr = 1, Ms = 2, else 9)')), + 'email' => array('label' => $this->l('E-mail *')), + 'passwd' => array('label' => $this->l('Password *')), + 'birthday' => array('label' => $this->l('Birthday (yyyy-mm-dd)')), + 'lastname' => array('label' => $this->l('Lastname *')), + 'firstname' => array('label' => $this->l('Firstname *')), + 'newsletter' => array('label' => $this->l('Newsletter (0/1)')), + 'optin' => array('label' => $this->l('Opt in (0/1)'))); + + self::$default_values = array('active' => '1'); + + break; + case $this->entities[$this->l('Addresses')]: + + //Overwrite required_fields + self::$required_fields = array('lastname', 'firstname', 'address1', 'postcode', 'country', 'city'); + + $this->available_fields = array( + 'no' => array('label' => $this->l('Ignore this column')), + 'id' => array('label' => $this->l('ID')), + 'alias' => array('label' => $this->l('Alias *')), + 'active' => array('label' => $this->l('Active (0/1)')), + 'customer_email' => array('label' => $this->l('Customer e-mail')), + 'manufacturer' => array('label' => $this->l('Manufacturer')), + 'supplier' => array('label' => $this->l('Supplier')), + 'company' => array('label' => $this->l('Company')), + 'lastname' => array('label' => $this->l('Lastname *')), + 'firstname' => array('label' => $this->l('Firstname *')), + 'address1' => array('label' => $this->l('Address 1 *')), + 'address2' => array('label' => $this->l('Address 2')), + 'postcode' => array('label' => $this->l('Postcode*/ Zipcode*')), + 'city' => array('label' => $this->l('City *')), + 'country' => array('label' => $this->l('Country *')), + 'state' => array('label' => $this->l('State')), + 'other' => array('label' => $this->l('Other')), + 'phone' => array('label' => $this->l('Phone')), + 'phone_mobile' => array('label' => $this->l('Mobile Phone')), + 'vat_number' => array('label' => $this->l('VAT number'))); + + self::$default_values = array('alias' => 'Alias', 'postcode' => 'X'); + + break; + case $this->entities[$this->l('Manufacturers')]: + case $this->entities[$this->l('Suppliers')]: + + //Overwrite validators AS name is not MultiLangField + self::$validators = array( + 'description' => array('AdminImport', 'createMultiLangField'), + 'description_short' => array('AdminImport', 'createMultiLangField'), + 'meta_title' => array('AdminImport', 'createMultiLangField'), + 'meta_keywords' => array('AdminImport', 'createMultiLangField'), + 'meta_description' => array('AdminImport', 'createMultiLangField')); + + $this->available_fields = array( + 'no' => array('label' => $this->l('Ignore this column')), + 'id' => array('label' => $this->l('ID')), + 'active' => array('label' => $this->l('Active (0/1)')), + 'name' => array('label' => $this->l('Name *')), + 'description' => array('label' => $this->l('Description')), + 'short_description' => array('label' => $this->l('Short description')), + 'meta_title' => array('label' => $this->l('Meta-title')), + 'meta_keywords' => array('label' => $this->l('Meta-keywords')), + 'meta_description' => array('label' => $this->l('Meta-description'))); + break; + } + parent::__construct(); + } + + private static function getBoolean($field) + { + return (boolean)$field; + } + + private static function getPrice($field) + { + $field = ((float)(str_replace(',', '.', $field))); + $field = ((float)(str_replace('%', '', $field))); + return $field; + } + + private static function split($field) + { + $separator = ((is_null(Tools::getValue('multiple_value_separator')) OR trim(Tools::getValue('multiple_value_separator')) == '' ) ? ',' : Tools::getValue('multiple_value_separator')); + $tab = explode($separator, $field); + $res = array_map('strval', $tab); + $res = array_map('trim', $tab); + return $tab; + } + + private static function createMultiLangField($field) + { + $languages = Language::getLanguages(false); + $res = array(); + foreach ($languages AS $lang) + $res[$lang['id_lang']] = $field; + return $res; + } + + private function getTypeValuesOptions($nb_c) + { + $i = 0; + $noPreSelect = array('price_tin', 'feature'); + + $options = ''; + foreach ($this->available_fields AS $k => $field) + { + $options .= '
+ +

'; + echo '
+
+ + '.$this->l('Import a language pack manually').' + +
'. + $this->l('If the name format is: isocode.gzip (e.g. fr.gzip) and the language corresponding to this package does not exist, it will automatically be created.'). + $this->l('Be careful, as it will replace all existing data for the destination language!').'

'. + $this->l('Language pack to import:').'  

+
+
+
+

+
+
'.$this->l('Export a language').' +

'.$this->l('Export data from one language to a file (language pack).').'
'. + $this->l('Choose the theme from which you want to export translations.').'
+ +     +    + +

+
+

'; + $allLanguages = Language::getLanguages(false); + echo ' +
+
'.$this->l('Copy').' +

'.$this->l('Copies data from one language to another.').'
'. + $this->l('Be careful, as it will replace all existing data for the destination language!').'
'. + $this->l('If necessary').', '.$this->l('first create a new language').'.

+
+

+

'.$this->l('From:').'
+ +     + * +

+

+

'.$this->l('To:').'
+ +     + +

+
+
+ +
+

* '.$this->l('Language files (as indicated at Tools >> Languages >> Edition) must be complete to allow copying of translations').'

+
+
'; + } + } + + public function fileExists($dir, $file, $var) + { + ${$var} = array(); + if (!file_exists($dir)) + if (!mkdir($dir, 0700)) + die('Please create the directory '.$dir); + if (!file_exists($dir.'/'.$file)) + if (!file_put_contents($dir.'/'.$file, "")) + die('Please create a "'.$file.'" file in '.$dir); + if (!is_writable($dir.'/'.$file)) + $this->displayWarning(Tools::displayError('This file must be writable:').' '.$dir.'/'.$file); + include($dir.'/'.$file); + return ${$var}; + } + + public function displayToggleButton($closed = false) + { + $str_output = ' + + + '; + return $str_output; + } + + protected function displaySubmitButtons($name) + { + return ' + + '; + } + + public function displayAutoTranslate() + { + $languageCode = Tools::htmlentitiesUTF8(Language::getLanguageCodeByIso(Tools::getValue('lang'))); + return ' + + + + + '; + } + + public function displayLimitPostWarning($count) + { + $str_output = ''; + if ((ini_get('suhosin.post.max_vars') AND ini_get('suhosin.post.max_vars') < $count) + OR (ini_get('suhosin.request.max_vars') AND ini_get('suhosin.request.max_vars') < $count)) + { + if (ini_get('suhosin.post.max_vars') < $count OR ini_get('suhosin.request.max_vars') < $count) + { + $this->suhosin_limit_exceed = true; + $str_output .= '
'.$this->l('Warning, your hosting provider is using the suhosin patch for PHP, which limits the maximum number of fields to post in a form:').'
' + .''.ini_get('suhosin.post.max_vars').' '.$this->l('for suhosin.post.max_vars.').'
' + .''.ini_get('suhosin.request.max_vars').' '.$this->l('for suhosin.request.max_vars.').'
' + .$this->l('Please ask your hosting provider to increase the suhosin post and request limit to') + .' '.((int)$count + 100).' '.$this->l('at least.').' '.$this->l('or edit the translation file manually.').'
'; + } + } + return $str_output; + } + + public function displayFormFront($lang) + { + global $currentIndex; + $_LANG = $this->fileExists(_PS_THEME_DIR_.'lang', Tools::strtolower($lang).'.php', '_LANG'); + $str_output = ''; + + /* List templates to parse */ + $templates = array_merge(scandir(_PS_THEME_DIR_), scandir(_PS_ALL_THEMES_DIR_)); + $count = 0; + $files = array(); + foreach ($templates AS $template) + if (preg_match('/^(.*).tpl$/', $template) AND (file_exists($tpl = _PS_THEME_DIR_.$template) OR file_exists($tpl = _PS_ALL_THEMES_DIR_.$template))) + { + $template2 = substr(basename($template), 0, -4); + $newLang = array(); + $fd = fopen($tpl, 'r'); + $content = fread($fd, filesize($tpl)); + + /* Search language tags (eg {l s='to translate'}) */ + $regex = '/\{l s=\''._PS_TRANS_PATTERN_.'\'( js=1)?\}/U'; + preg_match_all($regex, $content, $matches); + + /* Get string translation */ + foreach($matches[1] AS $key) + { + if(empty($key)) + { + $this->_errors[] = $this->l('Empty string found, please edit:').'
'._PS_THEME_DIR_.''.$template; + $newLang[$key] = ''; + } + else + { + $key2 = $template2.'_'.md5($key); + $newLang[$key] = (key_exists($key2, $_LANG)) ? html_entity_decode($_LANG[$key2], ENT_COMPAT, 'UTF-8') : ''; + } + } + $files[$template2] = $newLang; + $count += sizeof($newLang); + } + + $str_output .= ' +

'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Front-Office translations').'

+ '.$this->l('Total expressions').' : '.$count.'. '.$this->l('Click the fieldset title to expand or close the fieldset.').'.

'; + $str_output .= $this->displayLimitPostWarning($count); + if (!$this->suhosin_limit_exceed) + { + $str_output .= ' +
'; + $str_output .= $this->displayToggleButton(sizeof($_LANG) >= $count); + $str_output .= $this->displayAutoTranslate(); + $str_output .= '

'; + foreach ($files AS $k => $newLang) + if (sizeof($newLang)) + { + $countValues = array_count_values($newLang); + $empty = isset($countValues['']) ? $countValues[''] : 0; + $str_output .= ' +
'.$k.' - '.sizeof($newLang).' '.$this->l('expressions').' ('.$empty.') +
+ '; + foreach ($newLang AS $key => $value) + { + $str_output .= ''; + } + $str_output .= ' +
'.stripslashes($key).''; + if (strlen($key) != 0 && strlen($key) < TEXTAREA_SIZED) + $str_output .= '= '; + elseif(strlen($key)) + $str_output .= '= '; + else + $str_output .= ''.implode(', ', $this->_errors).''; + $str_output .= '
+
+

'; + } + $str_output .= '
'; + } + if (!empty($this->_errors)) + $this->displayErrors(); + echo $str_output; + } + + public function displayFormBack($lang) + { + global $currentIndex; + $_LANGADM = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'admin.php', '_LANGADM'); + $str_output = ''; + /* List templates to parse */ + $count = 0; + $tabs = scandir(PS_ADMIN_DIR.'/tabs'); + $tabs[] = '../../classes/AdminTab.php'; + $files = array(); + foreach ($tabs AS $tab) + if (preg_match('/^(.*)\.php$/', $tab) AND file_exists($tpl = PS_ADMIN_DIR.'/tabs/'.$tab)) + { + $tab = basename(substr($tab, 0, -4)); + $fd = fopen($tpl, 'r'); + $content = fread($fd, filesize($tpl)); + fclose($fd); + $regex = '/this->l\(\''._PS_TRANS_PATTERN_.'\'[\)|\,]/U'; + preg_match_all($regex, $content, $matches); + foreach ($matches[1] AS $key) + $tabsArray[$tab][$key] = stripslashes(key_exists($tab.md5($key), $_LANGADM) ? html_entity_decode($_LANGADM[$tab.md5($key)], ENT_COMPAT, 'UTF-8') : ''); + $count += isset($tabsArray[$tab]) ? sizeof($tabsArray[$tab]) : 0; + } + foreach (array('header.inc', 'footer.inc', 'index', 'login', 'password', 'functions') AS $tab) + { + $tab = PS_ADMIN_DIR.'/'.$tab.'.php'; + $fd = fopen($tab, 'r'); + $content = fread($fd, filesize($tab)); + fclose($fd); + $regex = '/translate\(\''._PS_TRANS_PATTERN_.'\'\)/U'; + preg_match_all($regex, $content, $matches); + foreach ($matches[1] AS $key) + $tabsArray['index'][$key] = stripslashes(key_exists('index'.md5($key), $_LANGADM) ? html_entity_decode($_LANGADM['index'.md5($key)], ENT_COMPAT, 'UTF-8') : ''); + $count += isset($tabsArray['index']) ? sizeof($tabsArray['index']) : 0; + } + + $str_output .= ' +

'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Back-Office translations').'

+ '.$this->l('Expressions to translate').' : '.$count.'. '.$this->l('Click on the titles to open fieldsets').'.

'; + $str_output .= $this->displayLimitPostWarning($count); + if (!$this->suhosin_limit_exceed) + { + $str_output .= ' +
'; + $str_output .= $this->displayToggleButton(); + $str_output .= $this->displayAutoTranslate(); + $str_output .= '

'; + foreach ($tabsArray AS $k => $newLang) + if (sizeof($newLang)) + { + $countValues = array_count_values($newLang); + $empty = isset($countValues['']) ? $countValues[''] : 0; + $str_output .= ' +
'.$k.' - '.sizeof($newLang).' '.$this->l('expressions').' ('.$empty.') +
+ '; + foreach ($newLang AS $key => $value) + { + $str_output .= ''; + else + $str_output .= ''; + } + $str_output .= ' +
'.stripslashes($key).'= '; + if (strlen($key) < TEXTAREA_SIZED) + $str_output .= '
+
+

'; + } + $str_output .= '
'; + } + echo $str_output; + } + + public function displayFormErrors($lang) + { + global $currentIndex; + $_ERRORS = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'errors.php', '_ERRORS'); + + $str_output = ''; + + /* List files to parse */ + $stringToTranslate = array(); + $dirToParse = array(PS_ADMIN_DIR.'/../', + PS_ADMIN_DIR.'/../classes/', + PS_ADMIN_DIR.'/../controllers/', + PS_ADMIN_DIR.'/../override/classes/', + PS_ADMIN_DIR.'/../override/controllers/', + PS_ADMIN_DIR.'/', + PS_ADMIN_DIR.'/tabs/'); + if (!file_exists(_PS_MODULE_DIR_)) + die($this->displayWarning(Tools::displayError('Fatal error: Module directory is not here anymore ').'('._PS_MODULE_DIR_.')')); + if (!is_writable(_PS_MODULE_DIR_)) + $this->displayWarning(Tools::displayError('The module directory must be writable')); + if (!$modules = scandir(_PS_MODULE_DIR_)) + $this->displayWarning(Tools::displayError('There are no modules in your copy of PrestaShop. Use the Modules tab to activate them or go to our Website to download additional Modules.')); + else + { + $count = 0; + + foreach ($modules AS $module) + if (is_dir(_PS_MODULE_DIR_.$module) && $module != '.' && $module != '..' && $module != '.svn' ) + $dirToParse[] = _PS_MODULE_DIR_.$module.'/'; + } + foreach ($dirToParse AS $dir) + foreach (scandir($dir) AS $file) + if (preg_match('/\.php$/', $file) AND file_exists($fn = $dir.$file) AND $file != 'index.php') + { + if (!filesize($fn)) + continue; + preg_match_all('/Tools::displayError\(\''._PS_TRANS_PATTERN_.'\'(, (true|false))?\)/U', fread(fopen($fn, 'r'), filesize($fn)), $matches); + foreach($matches[1] AS $key) + $stringToTranslate[$key] = (key_exists(md5($key), $_ERRORS)) ? html_entity_decode($_ERRORS[md5($key)], ENT_COMPAT, 'UTF-8') : ''; + } + $irow = 0; + $str_output .= $this->displayAutoTranslate(); + $str_output .= '

'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Error translations').'

' + .$this->l('Errors to translate').' : '.sizeof($stringToTranslate).'

'; + $str_output .= $this->displayLimitPostWarning(sizeof($stringToTranslate)); + if (!$this->suhosin_limit_exceed) + { + $str_output .= ' +
+

+ '; + ksort($stringToTranslate); + foreach ($stringToTranslate AS $key => $value) + $str_output .= ''; + $str_output .= '
'.stripslashes($key).'=

'; + } + echo $str_output; + } + + public function displayFormFields($lang) + { + global $currentIndex; + $_FIELDS = $this->fileExists(_PS_TRANSLATIONS_DIR_.$lang, 'fields.php', '_FIELDS'); + + $str_output = ''; + $classArray = array(); + $count = 0; + foreach (scandir(_PS_CLASS_DIR_) AS $classFile) + { + if (!preg_match('/\.php$/', $classFile) OR $classFile == 'index.php') + continue; + include_once(_PS_CLASS_DIR_.$classFile); + $className = substr($classFile, 0, -4); + if (!class_exists($className)) + continue; + if (!is_subclass_of($className, 'ObjectModel')) + continue; + $classArray[$className] = call_user_func(array($className, 'getValidationRules'), $className); + if (isset($classArray[$className]['validate'])) + $count += sizeof($classArray[$className]['validate']); + if (isset($classArray[$className]['validateLang'])) + $count += sizeof($classArray[$className]['validateLang']); + } + + $str_output .= $this->displayAutoTranslate(); + $str_output .= ' +

'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Field name translations').'

'; + $str_output .= $this->displayLimitPostWarning($count); + if (!$this->suhosin_limit_exceed) + { + $str_output .= $this->l('Fields to translate').' : '.$count.'. '.$this->l('Click on the titles to open fieldsets').'.

+
'; + $str_output .= $this->displayToggleButton(); + $str_output .= '

'; + foreach ($classArray AS $className => $rules) + { + $translated = 0; + $toTranslate = 0; + if (isset($rules['validate'])) + foreach ($rules['validate'] AS $key => $value) + (array_key_exists($className.'_'.md5($key), $_FIELDS)) ? ++$translated : ++$toTranslate; + if (isset($rules['validateLang'])) + foreach ($rules['validateLang'] AS $key => $value) + (array_key_exists($className.'_'.md5($key), $_FIELDS)) ? ++$translated : ++$toTranslate; + $str_output .= ' +
'.$className.' - '.($toTranslate + $translated).' '.$this->l('fields').' ('.$toTranslate.') +
+ '; + if (isset($rules['validate'])) + foreach ($rules['validate'] AS $key => $value) + $str_output .= ''; + if (isset($rules['validateLang'])) + foreach ($rules['validateLang'] AS $key => $value) + $str_output .= ''; + $str_output .= ' +
'.stripslashes($key).'=
'.stripslashes($key).'=
+
+

'; + } + $str_output .= '
'; + } + echo $str_output; + } + + /** + * Get each informations for each mails founded in the folder $dir. + * + * @since 1.4.0.14 + * @param string $dir + * @param string $lang + * @param $string $group_name + */ + public function getMailFiles($dir, $lang, $group_name = 'mail') + { + $arr_return = array(); + + // Very usefull to name input and textarea fields + $arr_return['group_name'] = $group_name; + $arr_return['empty_values'] = 0; + $arr_return['total_filled'] = 0; + $arr_return['directory'] = $dir; +// $arr_return['subject'] = $this->getSubjectMailContent($dir.$lang); + if(file_exists($dir.'en')) + { + // Get all english files to compare with the language to translate + foreach (scandir($dir.'en') AS $email_file) + { + if (strripos($email_file, '.html') > 0 || strripos($email_file, '.txt') > 0) + { + $email_name = substr($email_file, 0, strripos($email_file, '.')); + $type = substr($email_file, strripos($email_file, '.')+1); + if (!isset($arr_return['files'][$email_name])) { + $arr_return['files'][$email_name] = array(); + } + $arr_return['files'][$email_name][$type]['en'] = $this->getMailContent($dir, $email_file, 'en'); + + // check if the file exists in the language to translate + if (file_exists($dir.$lang.'/'.$email_file)) { + $arr_return['files'][$email_name][$type][$lang] = $this->getMailContent($dir, $email_file, $lang); + } else { + $arr_return['files'][$email_name][$type][$lang] = ''; + } + if ($arr_return['files'][$email_name][$type][$lang] == '') { + $arr_return['empty_values']++; + } else { + $arr_return['total_filled']++; + } + } + } + } + return $arr_return; + } + + /** + * Get content of the mail file. + * + * @since 1.4.0.14 + * @param string $dir + * @param string $file + * @param string $lang iso code of a language + */ + protected function getMailContent($dir, $file, $lang) + { + $arr_return = array(); + $content = file_get_contents($dir.$lang.'/'.$file); + + if (Tools::strlen($content) === 0) { + $content = ''; + } + return $content; + } + + /** + * Display mails in html format. + * This was create for factorize the html displaying + * + * @since 1.4.0.14 + * @param array $mails + * @param array $all_subject_mail + * @param Language $obj_lang + * @param string $id_html use for set html id attribute for the block + * @param string $title Set the title for the block + * @param string|boolean $name_for_module is not false define add a name for disntiguish mails module + */ + protected function displayMailContent($mails, $all_subject_mail, $obj_lang, $id_html, $title, $name_for_module = false) + { + $str_return = ''; + $group_name = 'mail'; + if (key_exists('group_name', $mails)) + { + $group_name = $mails['group_name']; + } + $str_return .= ' +
+

'.$title.' - '.$mails['empty_values'].' ' + .sprintf($this->l('missing translation(s) on %s template(s) for %s'), ''.((int)$mails['empty_values']+(int)$mails['total_filled']).'', $obj_lang->name) + .':

+
'; + if (!empty($mails['files'])) + { + foreach ($mails['files'] AS $mail_name => $mail_files) + { + if ((key_exists('html', $mail_files) OR key_exists('txt', $mail_files))) + { + if (key_exists($mail_name, $all_subject_mail)) + { + $subject_mail = $all_subject_mail[$mail_name]; + $str_return .= ' +
+ +
+ '.$subject_mail.'
+ +
+
'; + } else { + $str_return .= ' +
+ '.sprintf($this->l('No Subject was found for %s.'), ''.$mail_name.'').'' + .'
'; + } + if (key_exists('html', $mail_files)) + { + $base_uri = str_replace(_PS_ROOT_DIR_, __PS_BASE_URI__, $mails['directory']); + $base_uri = str_replace('//', '/', $base_uri); + $url_mail = $base_uri.$obj_lang->iso_code.'/'.$mail_name.'.html'; + $str_return .= $this->displayMailBlockHtml($mail_files['html'], $obj_lang->iso_code, $url_mail, $mail_name, $group_name, $name_for_module); + } + if (key_exists('txt', $mail_files)) { + $str_return .= $this->displayMailBlockTxt($mail_files['txt'], $obj_lang->iso_code, $mail_name, $group_name, $name_for_module); + } + } + } + } + else + { + $str_return .= ' +

'.$this->l('There is a problem getting the Mail files.').'
' + .sprintf($this->l('Please ensure that English files exist in %s folder'), ''.$mails['directory'].'en') + .'

'; + } + $str_return .= ' +
+
+
'; + return $str_return; + } + /** + * Just build the html structure for display txt mails + * + * @since 1.4.0.14 + * @param array $content with english and language needed contents + * @param string $lang iso code of the needed language + * @param string $mail_name name of the file to translate (same for txt and html files) + * @param string $group_name group name allow to distinguish each block of mail. + * @param string|boolean $name_for_module is not false define add a name for disntiguish mails module + */ + protected function displayMailBlockTxt($content, $lang, $mail_name, $group_name, $name_for_module = false) + { + return ' +
+ +
+
+
+
'; + } + /** + * Just build the html structure for display html mails. + * + * @since 1.4.0.14 + * @param array $content with english and language needed contents + * @param string $lang iso code of the needed language + * @param string $url for the html page and displaying an outline + * @param string $mail_name name of the file to translate (same for txt and html files) + * @param string $group_name group name allow to distinguish each block of mail. + * @param string|boolean $name_for_module is not false define add a name for disntiguish mails module + */ + protected function displayMailBlockHtml($content, $lang, $url, $mail_name, $group_name, $name_for_module = false) + { + $title = array(); + + // Because TinyMCE don't work correctly with , and tags + if (stripos($content[$lang], '([^<]+)#Ui', $title[$language], $matches); + $title[$language] = empty($matches[1])?'':$matches[1]; + + // The 2 lines below allow to exlude tag from the content. + // This allow to exclude body tag even if attributs are setted. + $content[$language] = substr($content[$language], stripos($content[$language], '')+1); + $content[$language] = substr($content[$language], 0, stripos($content[$language], '')); + } + } + + $str_return = ''; + $str_return .= ' +
+ +
+
'; + $str_return .= ' +
+ '.$this->l('"title" tag:').' '.(isset($title['en']) ? $title['en'] : '').'
+ +
'; + $str_return .= ' + + Edit this mail template +
+ +
+
'; + return $str_return; + } + + /** + * Check in each module if contains mails folder. + * + * @return array of module which has mails + */ + public function getModulesHasMails() + { + $arr_modules = array(); + foreach (scandir(_PS_MODULE_DIR_) AS $module_dir) + { + if ($module_dir[0] != '.' AND file_exists(_PS_MODULE_DIR_.$module_dir.'/mails')) + { + $arr_modules[$module_dir] = _PS_MODULE_DIR_.$module_dir; + } + + } + return $arr_modules; + } + protected function getTinyMCEForMails($iso_lang) + { + // TinyMCE + $isoTinyMCE = (file_exists(_PS_ROOT_DIR_.'/js/tiny_mce/langs/'.$iso_lang.'.js') ? $iso_lang : 'en'); + $ad = dirname($_SERVER["PHP_SELF"]); + return ' + + + + '; + } + public function displayFormMails($lang, $noDisplay = false) + { + global $cookie, $currentIndex; + + $core_mails = array(); + $module_mails = array(); + $theme_mails = array(); + $str_output = ''; + + // get all mail subjects, this method parse each files in Prestashop !! + $subject_mail = array(); + $modules_has_mails = $this->getModulesHasMails(); + $arr_files_to_parse = array( + _PS_ROOT_DIR_.'/controllers', + _PS_ROOT_DIR_.'/classes', + PS_ADMIN_DIR.'/tabs', + ); + $arr_files_to_parse = array_merge($arr_files_to_parse, $modules_has_mails); + foreach ($arr_files_to_parse as $path) { + $subject_mail = self::getSubjectMail($path, $subject_mail); + } + + $core_mails = $this->getMailFiles(_PS_MAIL_DIR_, $lang, 'core_mail'); + $core_mails['subject'] = $this->getSubjectMailContent(_PS_MAIL_DIR_.$lang); + foreach ($modules_has_mails AS $module_name=>$module_path) + { + $module_mails[$module_name] = $this->getMailFiles($module_path.'/mails/', $lang, 'module_mail'); + $module_mails[$module_name]['subject'] = $core_mails['subject']; + } + + // Before 1.4.0.14 each theme folder was parsed, + // This page was really to low to load. + // Now just use the current theme. + if(_THEME_NAME_ !== AdminTranslations::DEFAULT_THEME_NAME) + { + if(file_exists(_PS_THEME_DIR_.'mails')) + { + $theme_mails['theme_mail'] = $this->getMailFiles(_PS_THEME_DIR_.'mails/', $lang, 'theme_mail'); + $theme_mails['theme_mail']['subject'] = $this->getSubjectMailContent(_PS_THEME_DIR_.'mails/'.$lang); + } + if (file_exists(_PS_THEME_DIR_.'/modules')) + { + foreach (scandir(_PS_THEME_DIR_.'/modules') AS $module_dir) + { + if ($module_dir[0] != '.' AND file_exists(_PS_THEME_DIR_.'modules/'.$module_dir.'/mails')) + { + $theme_mails[$module_dir] = $this->getMailFiles(_PS_THEME_DIR_.'modules/'.$module_dir.'/mails/', $lang, 'theme_module_mail'); + $theme_mails[$module_dir]['subject'] = $theme_mails['theme_mail']['subject']; + } + } + } + } + + if ($noDisplay) + { + $empty = 0; + $total = 0; + $total += (int)$core_mails['total_filled']; + $empty += (int)$core_mails['empty_values']; + foreach ($module_mails as $mod_infos) + { + $total += (int)$mod_infos['total_filled']; + $empty += (int)$mod_infos['empty_values']; + } + foreach ($theme_mails as $themes_infos) + { + $total += (int)$themes_infos['total_filled']; + $empty += (int)$themes_infos['empty_values']; + } + return array('total' => $total, 'empty' => $empty); + } + + $obj_lang = new Language(Language::getIdByIso($lang)); + + // TinyMCE + $str_output .= $this->getTinyMCEForMails($obj_lang->iso_code); + + $str_output .= ''; + $str_output .= ' +

'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('E-mail template translations').'

' + .$this->l('Click on the titles to open fieldsets').'.

'; + + // display form + $str_output .= ' +
'; + $str_output .= $this->displayToggleButton(); + $str_output .= $this->displaySubmitButtons(Tools::getValue('type')); + $str_output .= '

'; + + // core emails + $str_output .= $this->l('Core e-mails:'); + $str_output .= $this->displayMailContent($core_mails, $subject_mail, $obj_lang, 'core', $this->l('Core e-mails')); + // module mails + $str_output .= $this->l('Modules e-mails:'); + foreach ($module_mails as $module_name => $mails) + { + $str_output .= $this->displayMailContent($mails, $subject_mail, $obj_lang, Tools::strtolower($module_name), sprintf($this->l('E-mails for %s module'), ''.$module_name.''), $module_name); + } + // mail theme and module theme + if (!empty($theme_mails)) + { + $str_output .= $this->l('Themes e-mails:'); + $bool_title = false; + foreach ($theme_mails as $theme_or_module_name => $mails) + { + $title = $theme_or_module_name != 'theme_mail' ? ucfirst(_THEME_NAME_).' '.sprintf($this->l('E-mails for %s module'), ''.$theme_or_module_name.'') : ucfirst(_THEME_NAME_).' '.$this->l('e-mails'); + if ($theme_or_module_name != 'theme_mail' && !$bool_title) { + $bool_title = true; + $str_output .= $this->l('E-mails modules in theme:'); + } + $str_output .= $this->displayMailContent($mails, $subject_mail, $obj_lang, 'theme_'.Tools::strtolower($theme_or_module_name), $title, ($theme_or_module_name != 'theme_mail' ? $theme_or_module_name : false)); + } + } + $str_output .= ' + + '; + $str_output .= $this->displaySubmitButtons(Tools::getValue('type')); + $str_output .= '

'; + $str_output .= '
'; + echo $str_output; + } + + protected function getSubjectMail($directory, $subject_mail) + { + foreach (scandir($directory) AS $filename) + { + if (strripos($filename, '.php') > 0 AND $filename != 'AdminTranslations.php') + { + $content = file_get_contents($directory.'/'.$filename); + $content = str_replace("\n", " ", $content); + if (preg_match_all('/Mail::Send([^;]*);/si', $content, $tab)) + { + for ($i = 0 ; isset($tab[1][$i]) ; $i++) + { + $tab2 = explode(',', $tab[1][$i]); + if (is_array($tab2)) + { + if ($tab2 && isset($tab2[1])) + { + $tab2[1] = trim(str_replace('\'', '', $tab2[1])); + if (preg_match('/Mail::l\(\''._PS_TRANS_PATTERN_.'\'\)/s', $tab2[2], $tab3)) + $tab2[2] = $tab3[1]; + $subject_mail[$tab2[1]] = $tab2[2]; + } + } + } + } + } + if ($filename != '.svn' AND $filename != '.' AND $filename != '..' AND is_dir(($directory.'/'.$filename))) + $subject_mail = self::getSubjectMail($directory.'/'.$filename, $subject_mail); + } + return $subject_mail; + } + + protected function getSubjectMailContent($directory) + { + $subject_mail_content = array(); + + if (Tools::file_exists_cache($directory.'/lang.php')) + { + // we need to include this even if already included + include($directory.'/lang.php'); + foreach($_LANGMAIL as $key => $subject) + { + $subject = str_replace("\n", " ", $subject); + $subject = str_replace("\\'", "\'", $subject); + + $subject_mail_content[$key] = htmlentities($subject,ENT_QUOTES,'UTF-8'); + } + } + else + $this->_errors[] = $this->l('Subject mail translation file not found in').' '.$directory; + return $subject_mail_content; + } + + protected function writeSubjectTranslationFile($sub, $path, $mark = false, $fullmark = false) + { + global $currentIndex; + + if ($fd = @fopen($path, 'w')) + { + //$tab = ($fullmark ? Tools::strtoupper($fullmark) : 'LANG').($mark ? Tools::strtoupper($mark) : ''); + $tab = 'LANGMAIL'; + fwrite($fd, " $value) + { + // Magic Quotes shall... not.. PASS! + if (_PS_MAGIC_QUOTES_GPC_) + $value = stripslashes($value); + fwrite($fd, '$_'.$tab.'[\''.pSQL($key).'\'] = \''.pSQL($value).'\';'."\n"); + } + + fwrite($fd, "\n?>"); + fclose($fd); + + } + else + die($this->l('Cannot write language file for e-mail subjects, path is:').$path); + } + + /** + * This get files to translate in module directory. + * Recursive method allow to get each files for a module no matter his depth. + * + * @param string $path directory path to scan + * @param array $array_files by reference - array which saved files to parse. + * @param string $module_name module name + * @param string $lang_file full path of translation file + * @param boolean $is_default + */ + protected function recursiveGetModuleFiles($path, &$array_files, $module_name, $lang_file, $is_default = false) + { + $files_module = array(); + $files_module = scandir($path); + $files_for_module = $this->clearModuleFiles($files_module, 'file'); + if (!empty($files_for_module)) + $array_files[] = array( + 'file_name' => $lang_file, + 'dir' => $path, + 'files' => $files_for_module, + 'module' => $module_name, + 'is_default' => $is_default, + 'theme' => ($is_default ? self::DEFAULT_THEME_NAME : _THEME_NAME_ ), + ); + $dir_module = $this->clearModuleFiles($files_module, 'directory', $path); + if(!empty($dir_module)) + { + foreach ($dir_module AS $folder) + { + $this->recursiveGetModuleFiles($path.$folder.'/', $array_files, $module_name, $lang_file, $is_default); + } + } + } + + /** + * This method get translation in each translations file. + * The file depend on $lang param. + * + * @param array $modules list of modules + * @param string $root_dir path where it get each modules + * @param string $lang iso code of choosen language to translate + * @param boolean $is_default set it if modules are located in root/prestashop/modules folder + * This allow to distinguish overrided prestashop theme and original module + */ + protected function getAllModuleFiles($modules, $root_dir, $lang, $is_default = false) + { + $array_files = array(); + foreach ($modules AS $module) + { + if ($module{0} != '.' AND is_dir($root_dir.$module)) + { + @include_once($root_dir.$module.'/'.$lang.'.php'); + self::getModuleTranslations($is_default); + $this->recursiveGetModuleFiles($root_dir.$module.'/', $array_files, $module, $root_dir.$module.'/'.$lang.'.php', $is_default); + } + } + return $array_files; + } + public function displayFormModules($lang) + { + global $currentIndex, $_MODULES; + + $array_lang_src = Language::getLanguages(false); + $str_output = ''; + + foreach ($array_lang_src as $language) + { + $this->all_iso_lang[] = $language['iso_code']; + } + + if (!file_exists(_PS_MODULE_DIR_)) + die($this->displayWarning(Tools::displayError('Fatal error: Module directory is not here anymore ').'('._PS_MODULE_DIR_.')')); + if (!is_writable(_PS_MODULE_DIR_)) + $this->displayWarning(Tools::displayError('The module directory must be writable')); + if (!$modules = scandir(_PS_MODULE_DIR_)) + $this->displayWarning(Tools::displayError('There are no modules in your copy of PrestaShop. Use the Modules tab to activate them or go to our Website to download additional Modules.')); + else + { + $arr_find_and_fill = array(); + + $arr_files = $this->getAllModuleFiles($modules, _PS_MODULE_DIR_, $lang, true); + $arr_find_and_fill = array_merge($arr_find_and_fill, $arr_files); + + if(file_exists(_PS_THEME_DIR_.'/modules/')) + { + $modules = scandir(_PS_THEME_DIR_.'/modules/'); + $arr_files = $this->getAllModuleFiles($modules, _PS_THEME_DIR_.'modules/', $lang); + $arr_find_and_fill = array_merge($arr_find_and_fill, $arr_files); + } + foreach ($arr_find_and_fill as $value) + $this->findAndFillTranslations($value['files'], $value['theme'], $value['module'], $value['dir'], $lang); + + $str_output .= ' +

'.$this->l('Language').' : '.Tools::strtoupper($lang).' - '.$this->l('Modules translations').'

+ '.$this->l('Total expressions').' : '.$this->total_expression.'. '.$this->l('Click the fieldset title to expand or close the fieldset.').'.

'; + $str_output .= $this->displayLimitPostWarning($this->total_expression); + if (!$this->suhosin_limit_exceed) + { + $str_output .= ' +
'; + $str_output .= $this->displayToggleButton(); + $str_output .= $this->displayAutoTranslate(); + $str_output .= '

'; + + if (count($this->modules_translations) > 1) + { + $str_output .= '

'.$this->l('List of Themes - Click to access theme translation:').'

'; + $str_output .= ''; + } + + foreach ($this->modules_translations AS $theme_name => $theme) + { + $str_output .= '

>'.$this->l('Theme:').' '.($theme_name === self::DEFAULT_THEME_NAME ? $this->l('default') : $theme_name ).'

'; + foreach ($theme AS $module_name => $module) + { + $str_output .= ''.$this->l('Module:').' '.$module_name.''; + foreach ($module AS $template_name => $newLang) + if (sizeof($newLang)) + { + $countValues = array_count_values($newLang); + $empty = isset($countValues['']) ? $countValues[''] : 0; + $str_output .= ' +
'.($theme_name === 'default' ? $this->l('default') : $theme_name ).' - '.$template_name.' - '.sizeof($newLang).' '.$this->l('expressions').' ('.$empty.') +
+ '; + foreach ($newLang AS $key => $value) + { + $str_output .= ''; + else + $str_output .= ''; + } + $str_output .= ' +
'.stripslashes($key).'= '; + if (strlen($key) < TEXTAREA_SIZED) + $str_output .= '
+
+

'; + } + } + } + $str_output .= '
'; + } + } + echo $str_output; + } + + public function displayFormPDF() + { + global $currentIndex; + + $lang = Tools::strtolower(Tools::getValue('lang')); + $_LANG = array(); + $str_output = ''; + + if (!file_exists(_PS_TRANSLATIONS_DIR_.$lang)) + if (!mkdir(_PS_TRANSLATIONS_DIR_.$lang, 0700)) + die('Please create a "'.$iso.'" directory in '._PS_TRANSLATIONS_DIR_); + if (!file_exists(_PS_TRANSLATIONS_DIR_.$lang.'/pdf.php')) + if (!file_put_contents(_PS_TRANSLATIONS_DIR_.$lang.'/pdf.php', "")) + die('Please create a "'.Tools::strtolower($lang).'.php" file in '.realpath(PS_ADMIN_DIR.'/')); + unset($_LANGPDF); + @include(_PS_TRANSLATIONS_DIR_.$lang.'/pdf.php'); + $files = array(); + $count = 0; + $tab = 'PDF_invoice'; + $pdf = _PS_CLASS_DIR_.'PDF.php'; + $newLang = array(); + $fd = fopen($pdf, 'r'); + $content = fread($fd, filesize($pdf)); + fclose($fd); + $regex = '/self::l\(\''._PS_TRANS_PATTERN_.'\'[\)|\,]/U'; + preg_match_all($regex, $content, $matches); + foreach($matches[1] AS $key) + $tabsArray[$tab][$key] = stripslashes(key_exists($tab.md5(addslashes($key)), $_LANGPDF) ? html_entity_decode($_LANGPDF[$tab.md5(addslashes($key))], ENT_COMPAT, 'UTF-8') : ''); + $count += isset($tabsArray[$tab]) ? sizeof($tabsArray[$tab]) : 0; + $closed = sizeof($_LANGPDF) >= $count; + + $str_output .= $this->displayAutoTranslate(); + $str_output .= '

'.$this->l('Language').' : '.Tools::strtoupper($lang).'

' + .$this->l('Expressions to translate').' : '.$count.'. '.$this->l('Click on the titles to open fieldsets').'.

'; + $str_output .= $this->displayLimitPostWarning($count); + if (!$this->suhosin_limit_exceed) + { + $str_output .= ' +
+ + + + '; + $str_output .= '

'; + foreach ($tabsArray AS $k => $newLang) + if (sizeof($newLang)) + { + $countValues = array_count_values($newLang); + $empty = isset($countValues['']) ? $countValues[''] : 0; + $str_output .= '
'.$k.' - '.sizeof($newLang).' '.$this->l('expressions').' ('.$empty.') +
+ '; + foreach ($newLang AS $key => $value) + { + $str_output .= ' + + + '; + } + $str_output .= '
'.stripslashes($key).' + = +
+
+

'; + } + $str_output .= '
'; + } + echo $str_output; + } + + /** + * Return an array with themes and thumbnails + * + * @return array + */ + static public function getThemesList() + { + $dir = opendir(_PS_ALL_THEMES_DIR_); + while ($folder = readdir($dir)) + if ($folder != '.' AND $folder != '..' AND is_dir(_PS_ALL_THEMES_DIR_.DIRECTORY_SEPARATOR.$folder) AND file_exists(_PS_ALL_THEMES_DIR_.'/'.$folder.'/preview.jpg')) + $themes[$folder]['name'] = $folder; + closedir($dir); + return isset($themes) ? $themes : array(); + } +} diff --git a/admin-dev/tabs/AdminWebservice.php b/admin-dev/tabs/AdminWebservice.php new file mode 100755 index 000000000..541ed1ccf --- /dev/null +++ b/admin-dev/tabs/AdminWebservice.php @@ -0,0 +1,282 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7499 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../classes/AdminTab.php'); + +class AdminWebservice extends AdminTab +{ + + public function __construct() + { + $this->table = 'webservice_account'; + $this->className = 'WebserviceKey'; + $this->lang = false; + $this->edit = true; + $this->delete = true; + + $this->id_lang_default = Configuration::get('PS_LANG_DEFAULT'); + + $this->fieldsDisplay = array( + 'key' => array('title' => $this->l('Key'), 'align' => 'center', 'width' => 32), + 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false), + 'description' => array('title' => $this->l('Key description'), 'align' => 'center', 'orderby' => false) + ); + + $this->optionTitle = $this->l('Configuration'); + if (file_exists(_PS_ROOT_DIR_.'/.htaccess')) + $this->_fieldsOptions = array('PS_WEBSERVICE' => array('title' => $this->l('Enable PrestaShop Webservice:'), + 'desc' => $this->l('Before activating the webservice, you must be sure to: '). + '
  1. '.$this->l('be certain URL rewrite is available on this server'). + '
  2. '.$this->l('be certain that the 5 methods GET, POST, PUT, DELETE and HEAD are supported by this server'). + '
', + 'cast' => 'intval', + 'type' => 'bool')); + parent::__construct(); + } + + protected function afterAdd($object) { + WebserviceKey::setPermissionForAccount($object->id, Tools::getValue('resources', array())); + } + + protected function afterUpdate($object) { + WebserviceKey::setPermissionForAccount($object->id, Tools::getValue('resources', array())); + } + + public function checkForWarning() + { + $warnings = array(); + if (!file_exists(_PS_ROOT_DIR_.'/.htaccess')) + $warnings[] = $this->l('In order to enable the PrestaShop Webservice, please generate the .htaccess file via the "Generators" tab (in the "Tools" tab).'); + if (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') === false) + $warnings[] = $this->l('To avoid operating problems, please use an Apache server.'); + { + if (function_exists('apache_get_modules')) + { + $apache_modules = apache_get_modules(); + if (!in_array('mod_auth_basic', $apache_modules)) + $warnings[] = $this->l('Please activate the Apache module \'mod_auth_basic\' to allow authentication of PrestaShop webservice.'); + if (!in_array('mod_rewrite', $apache_modules)) + $warnings[] = $this->l('Please activate the Apache module \'mod_rewrite\' to allow using the PrestaShop webservice.'); + } + else + { + $warnings[] = $this->l('We could not check if basic authentication and rewrite extensions are activated. Please manually check if they are activated in order to use the PrestaShop webservice.'); + } + } + if (!extension_loaded('SimpleXML')) + $warnings[] = $this->l('Please activate the PHP extension \'SimpleXML\' to allow testing of PrestaShop webservice.'); + if (!configuration::get('PS_SSL_ENABLED')) + $warnings[] = $this->l('If possible, it is preferable to use SSL (https) for webservice calls, as it avoids the security issues of type "man in the middle".'); + + $this->displayWarning($warnings); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex; + parent::displayForm(); + if (!($obj = $this->loadObject(true))) + return; + + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Webservice Accounts').' + +
+ + + * +

'.$this->l('Webservice account key').'

+
+ +
+ +

'.$this->l('Key description').'

+
+ +
+ id OR Tools::getValue('active', $obj->active)) ? 'checked="checked" ' : '').'/> + + active) AND $obj->id) ? 'checked="checked" ' : '').'/> + +
+ +
+

'.$this->l('Set the resource permissions for this key:').'

+ + + + + + + + + + + + + + + + + + + + + + + + '; +$ressources = WebserviceRequest::getResources(); +$permissions = WebserviceKey::getPermissionForAccount($obj->key); +foreach ($ressources as $resourceName => $resource) +echo ' + + + + + + + + + '; +echo ' + +
'.$this->l('Resource').''.$this->l('View (GET)').''.$this->l('Modify (PUT)').''.$this->l('Add (POST)').''.$this->l('Delete (DELETE)').''.$this->l('Fast view (HEAD)').'
'.$resourceName.'
+ +
+
+ +
+
* '.$this->l('Required field').'
+
+
'; + } + public function postProcess() + { + if (Tools::getValue('key') && strlen(Tools::getValue('key')) < 32) + $this->_errors[] = Tools::displayError($this->l('Key length must be 32 character long')); + return parent::postProcess(); + } + + public function display() + { + global $currentIndex, $cookie; + + // Include other tab in current tab + if ($this->includeSubTab('display', array('submitAdd2', 'add', 'update', 'view'))){} + + // Include current tab + elseif ((Tools::getValue('submitAdd'.$this->table) AND sizeof($this->_errors)) OR isset($_GET['add'.$this->table])) + { + if ($this->tabAccess['add'] === '1') + { + $this->displayForm(); + if ($this->tabAccess['view']) + echo '

'.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'
'; + } + else + echo $this->l('You do not have permission to add here'); + } + elseif (isset($_GET['update'.$this->table])) + { + if ($this->tabAccess['edit'] === '1' OR ($this->table == 'employee' AND $cookie->id_employee == Tools::getValue('id_employee'))) + { + $this->displayForm(); + if ($this->tabAccess['view']) + echo '

'.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'
'; + } + else + echo $this->l('You do not have permission to edit here'); + } + elseif (isset($_GET['view'.$this->table])) + $this->{'view'.$this->table}(); + + else + { + $this->checkForWarning(); + + $this->getList((int)$cookie->id_lang); + $this->displayList(); + + $this->displayRequiredFields(); + $this->includeSubTab('display'); + $assos_shop = Shop::getAssoTables(); + if (isset($assos_shop[$this->table]) AND $assos_shop[$this->table]['type'] == 'shop') + { + echo '
'; + $this->displayAssoShop('key'); + } + elseif (isset($assos_shop[$this->table]) AND $assos_shop[$this->table]['type'] == 'group_shop') + $this->displayAssoGroupShop(); + $this->displayOptionsList(); + } + } + +} diff --git a/admin-dev/tabs/AdminZones.php b/admin-dev/tabs/AdminZones.php new file mode 100644 index 000000000..07c05c164 --- /dev/null +++ b/admin-dev/tabs/AdminZones.php @@ -0,0 +1,90 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7300 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../classes/AdminTab.php'); + +class AdminZones extends AdminTab +{ + public function __construct() + { + $this->table = 'zone'; + $this->className = 'Zone'; + $this->lang = false; + $this->edit = true; + $this->delete = true; + + $this->fieldsDisplay = array( + 'id_zone' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), + 'name' => array('title' => $this->l('Zone'), 'width' => 150), + 'active' => array('title' => $this->l('Enabled'), 'align' => 'center', 'active' => 'status', 'type' => 'bool', 'orderby' => false) + ); + + parent::__construct(); + } + + public function displayForm($isMainTab = true) + { + global $currentIndex, $cookie; + parent::displayForm(); + + if (!($obj = $this->loadObject(true))) + return; + echo ' +
+ '.($obj->id ? '' : '').' +
'.$this->l('Zones').' + +
+ * + '.$this->l('Allowed characters: letters, spaces and').' (-)  +

'.$this->l('Zone name, e.g., Africa, West Coast, Neighboring Countries').'

+
+ +
+ id OR Tools::getValue('active', $obj->active)) ? 'checked="checked" ' : '').'/> + + active) AND $obj->id) ? 'checked="checked" ' : '').'/> + +

'.$this->l('Allow or disallow shipping to this zone').'

+
'; + if (Tools::isMultiShopActivated()) + { + echo '
'; + $this->displayAssoGroupShop(); + echo '
'; + } + echo ' +
+ +
+
* '.$this->l('Required field').'
+
+
'; + } +} + + diff --git a/admin-dev/themes/flashyturtle/admin.css b/admin-dev/themes/flashyturtle/admin.css new file mode 100644 index 000000000..bdc012462 --- /dev/null +++ b/admin-dev/themes/flashyturtle/admin.css @@ -0,0 +1,61 @@ +body{background:#EFEFEF url(../../../img/admin/bg.png)} +#top_container{background:url(bg-top.png) repeat-x 0 -60px;margin:0;padding:0} +div#header_infos span{color:#FFF} +#header_infos{float:left;font-size:10px;margin:10px 20px 4px 0;width:360px;height:43px} +div#header_infos a#header_shopname span{display:block;font-size:24px;overflow:hidden;margin-bottom:-8px;height:28px} +div#header_infos a#header_logout span{text-decoration:underline} +div#header_infos a#header_foaccess span{text-decoration:none} +div#header_infos a {color:#FFF;} +#header_search{background:url(searchbar.png) no-repeat;float:right;height:39px;width:356px} +#header_search #bo_query{background:transparent;border:none;color:#FFF;float:left;height:16px;line-height:16px;margin:10px 0 0 30px;outline:0;vertical-align:middle;width:140px} +#header_search #bo_search_type{background:#ECECEC;border:#000;float:left;height:21px;line-height:21px;margin-top:9px;vertical-align:middle;width:90px} +#header_search #bo_search_submit{background:url(searchbutton.png) no-repeat;border:none;color:#FFF;cursor:pointer;float:left;font-size:10px;font-weight:700;height:24px;line-height:24px;margin:7px 0 0 2px;outline:0;padding-bottom:2px;width:79px} +#header_search #bo_search_submit:hover{background-position:0 -25px} +#header_search #bo_search_submit:active{background-position:0 -50px} +#header_quick{background:url(bg-quick.png) no-repeat;float:right;height:39px;margin-right:1px;width:175px} +#header_quick #quick_select{background:#ECECEC;border:#000;height:21px;line-height:21px;margin:8px 0 0 30px;vertical-align:middle;width:140px} +#header_myaccount{background:url(bg-lang.png) no-repeat;display:block;float:right;height:39px;margin-right:1px;width:39px} +.button{background:#83CA38 url(center_btn_filter.png) repeat-x 0px -1px;border:1px solid #364A14;border-left:1px solid #475B25;border-top:1px solid #475B25;color:#FFF;cursor:pointer;padding:0 5px;height:24px} +.button[disabled=disabled]{background:#E2EBEE;color:#000000} +input.button[disabled=disabled]:hover{background-color:#FFF6D3} +.button:hover{background-position:0 -27px} +a.button{padding:3px 15px;color:white;} +.table{border:1px solid #416110;padding:0} +.table th a{text-decoration:underline} +.table a:hover{text-decoration:none} +.table tr th{background:#7AB51D url(thead.png) repeat-x top left;border-bottom:1px solid #416110;color:#FFF;padding:4px 6px} +.table tr td{border-bottom:1px solid #F0EADA;color:#963;font-size:.9em;height:23px;padding:0 4px 0 6px} +.table tr.last td{border-bottom:none} +.alt_row{background-color:#EFEFEF} +.path_bar{background-color:#E2EBEE;border:1px solid #999999;font-family:Trebuchet,Arial,Helvetica,sans-serif;font-size:13px;margin-bottom:20px;padding:5px} +.path_bar a{font-weight:700} +.cat_bar{background-color:#F4E8CD;border:1px solid #999999;font-family:Trebuchet,Arial,Helvetica,sans-serif;font-size:12px;font-weight:700;margin-bottom:20px;padding:5px} +.cat_bar a{font-weight:700} +fieldset{background:#FFF;border:1px solid #8E8E8E;font-size:1.1em;margin:0;padding:1em} +legend{background:#7AB51D url(thead.png) repeat-x top left;border:1px solid #364A14;font-weight:700;margin:0;padding:.2em .5em;text-align:left;color:#FFFFFF} +#menu{float:left;height:35px;line-height:normal;margin:10px 0 0;*margin:7px 0 0;padding:0;width:100%} +#menu li{background:url(bg-tab.png) repeat-x;float:left;height:35px;list-style:none;margin:0 1px 0 0} +#menu li a{color:#FFF;display:block;height:35px;padding:6px 8px 4px 0;} +#menu img{display:inline;padding:0 3px 0 6px;vertical-align:top;width:16px;height:16px} +#menu li.active{background-position:0 -70px} +#menu li.active a{color:#000} +#submenu{clear:both;color:#666;margin:0;height:38px;padding:0} +.withLeftBorder{background:transparent url(separator_subnav.png) no-repeat 0 5px} +#submenu li{display:inline;list-style:none;margin:0;background:transparent url(separator_subnav.png) no-repeat right 0;padding-left:8px;padding-right:8px;margin-top:8px;float:left;height:20px} +#submenu li a{text-decoration:underline} +#menu li{_height:32px;_padding-top:3px} +#menu li a{_display:inline;_padding:6px 6px 4px} +.tab-page {border:1px solid #383838;background:#F6F6F6} +.tab-row .tab.selected {border:1px solid #383838;background:#812143} +.tab-row .tab.selected a{color:black} +.tab-row .tab {border:1px solid #FDFDFD;background:#EFEFEF;height:24px;line-height:24px;vertical-align:middle} +hr {height: 1px;color:#DEDEDE;background-color:#DEDEDE} +#footer {height:40px;background:#DDDDDD url("footer-bg.png") repeat-x scroll left bottom;border:1px solid #383838;font-size:12px;clear:both;font-size:0.9em;color:#666666} +#content {background-color:#FFF;border-left:1px solid #383838;border-right:1px solid #383838} +input[type="text"],input[type="password"],input[type="file"],textarea {border:1px solid #416110} +select {border: 1px solid #416110} +.header_module{background:url(header_module.png);padding-left: 0.5em;padding-top: 0.8em;height:20px;color: #812143;border:solid 1px #CCC;} +a.action_module{color: #488C40;text-decoration: underline;} +a.header_module_toggle{font-weight: bold;color: #812143;display:block;} +a.module_toggle_all{color:#FFF;text-decoration:none;display:inherit;} +.nbr_module{float:right;margin-right:10px;font-style:italic;font-size:12px;color: #812143;} diff --git a/admin-dev/themes/flashyturtle/bg-lang.png b/admin-dev/themes/flashyturtle/bg-lang.png new file mode 100644 index 0000000000000000000000000000000000000000..e099979d22ef912363e697c6714c6599484060e6 GIT binary patch literal 767 zcmV?7AIxTR;V(}8d9Zrj!Mx*&zuh;K@ua1^%l}e@cX_0d}o%rTr zAOkIMg+jr;va)h`I$L!*-H&Fod6%{~hw5}Xt5D;k-f@t?f&%*T077 zow(X$GFhCXj4TFjb92)Vg?NB)N~Q7`4sB>{_h^C3=kr(0X7f|%r)@r;ParW)L=J5j z0=~Ljt{4B=WB(1V-|y?v>GVwisX(JYf-*8}@|dmEs8OSb(9qs~!RNhHDs>AB_d?+s zjmAa4-~Rxj^l?0WV57$`#zsG>j8G$pnT)=;2d=;E^?DywtJSrIz(MA1u~@7DULU?K z%uM{kKS4o~^sz&LzJuKxL*iaM!{_t8gtO1j4QDc$o?*1`*H5~>Ny_DNTcc8PqgJb> zAi_uEy$BkOMk}y(d2Tou9CvVt#4DTy3>AyT-o)ea$M75;LZ^5F?`}ZdABjZX!rAV* z;c)D>*=*HNDD)2OnG^^F_F!b%g^aGkTvv5C9OYmzxQlBW8yowXOy)V9eRWaUx(>QF xI&fB@zlS2~nrCz-^Vg7pW8fG#2JS4v{RRTUd%n7yCpQ29002ovPDHLkV1fanaS{Lk literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/bg-quick.png b/admin-dev/themes/flashyturtle/bg-quick.png new file mode 100644 index 0000000000000000000000000000000000000000..96503c8f8afb1fcbcebdbdd1e6fe248a235d109d GIT binary patch literal 615 zcmV-t0+{`YP)f5LHY-~Sqg$s>JTV}4#7>qEjoq}gwD?Gq;oq6 zR-81_P0SZa$$Wb5O9cA?0{4Yyco1K3x%{}?d(;yVc}C>IiYF`rftLupMBpXx5`mWp zyhKlicd=MhO)N0E3a>#MkH;6Q)#`=5FSE$x3cQoa-F9T0s)!N=U?>MI~JI%$7|sFe7^f&FeuGt^QS)hsGYLFWHnyJ+B0xNp^&6fDOoO; z7wo!ZJzfLX z$%16FSqE;T(YV!V!{uNwIPZ45pP2KKRd@|Z16R+u5{tzom&-YDOQn+YY9O2E`ubwyQht!+1QtdW8Fu#U!io9(G-wG(5~^ zv%WrSYtLCovL3J5b#+YkcRHOO;GVIFWIf(ar}I@WY1`dy*8wiMZqB>eY~C`%B{$D` zflK^*m1_aCg q|NrmI>9ylZpwo=gI(mBd7#L>#^l9emjwuJKXYh3Ob6Mw<&;$S^K^ryz literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/bg-tab.png b/admin-dev/themes/flashyturtle/bg-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..6214b2094456ac9a8173b34ce478886572f18793 GIT binary patch literal 190 zcmV;v073tWP)R{dfY-&j#b$+nWHNSTJ*WEC_Z8go%a71^tDH|E swRP&sj`v3p{07*qoM6N<$f)4~wkN^Mx literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/bg-top.png b/admin-dev/themes/flashyturtle/bg-top.png new file mode 100644 index 0000000000000000000000000000000000000000..75fe354e0e070524f78d2970ab748a2f1aaabca4 GIT binary patch literal 10222 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 literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/button-bg.png b/admin-dev/themes/flashyturtle/button-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3708ba053c719b774890d2c6caef9964f1ce66cc GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI}!3HGf{@&OHq;fo6978y+=k}}?J;Wfuq8{y_ z!ZlqjAcAW#kJTcs5*MBuyAMvVIdu4J-OhXd&kXH3c{i$ZEL1UTnHCWpC2+blaQ61E zKNjBmuQ_v>;JN9uE6;KZcA7DA9@bjQ`A50)ihJGicU4|8S*j|JAD)noE{MiP{SPx=i{eiu7D-I0$37iG9X+DCtT zZbE$Ay(J;EQY7)%ZDSI<^Dh3C2!=>p31lTmB4s7Wl_OW0z9>sx6i$v-j>l<|#)q;Z zVWik`AMe+YB(ZL)*y?eQFQ=^5^SEQNjICw@HBF)D@2o_9dUF)f|D}s0egVS&jTb!= RiBtdp002ovPDHLkV1fdsYQ+Em literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/footer-bg.png b/admin-dev/themes/flashyturtle/footer-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..227aa8a5ec35ecd98152e2d74ab130023152e159 GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3-ohG7?-F7?>FXd_r8$oH=v$?AdeY&YeGh z{=$U|7cXACbm`LN%a^ZQxpMXD)oa(TUB7<)#*G^{Z{ECh>(=etx9{A!bNB9Dpdq7R zGz5l02o$YJiUxW^+0(@_gd;jxASEdwDd88tdSE0+k7m=7X)_x;fe;878M+eq{TAFP Qo(b}`r>mdKI;Vst09ArV(f|Me literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/header_module.png b/admin-dev/themes/flashyturtle/header_module.png new file mode 100644 index 0000000000000000000000000000000000000000..98a8244875a37f1e59c4d7745db5b210c92de87c GIT binary patch literal 895 zcmV-_1AzRAP)4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_001{hL_t&t z9b~1|VSi|NlRB0=Fy!PzMl0wf+0|56WTyNdS$*Fb}K*w|O8JV3UQ50RW0Q VRGDKMj5q)Q002ovPDHLkV1iKFp{W1> literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/searchbar.png b/admin-dev/themes/flashyturtle/searchbar.png new file mode 100644 index 0000000000000000000000000000000000000000..dc69699d13f673b5228400519794e3232b980a8e GIT binary patch literal 1409 zcmZ9MeKga19LLualI6}wmlX4`k(*36SHfNUG1Rbb6h&?x66t9hnx`9Aeq$bXj2rS? zT-6Zb8o4O7OjtWI&w1F0A?#k%Hg|N+J@?#yzMt>+oXNi`4n+H3Ec8F#_W?S`42UTa=P#GY=wEDrwqQA?|v_@Te%s6l-W`h&(zAf;1H= zfaCu3Q1^0R;583-_qVlmbuJN{jt+`73N?K$-ynEwY^g`k zKeMUrzjMKXO#Uk*G&FRAB@&5rJiChCWMJ`k$M)CsOSqGh4;m{g7c8=oYu};Kr!)RM zz>!dSUx)zUkdRtj_DFw{+`uJ8Mt<4r=&yrTvrSD-<{h)PF6iv;ZoHeAI2Ruu|DMYw zOuc*e?$(tn<+!YfAaugwbD0$ap^x2k%?Vm9I&Me`Ba>5pk)(c4&M}?(#J^f+EN!y< zjq?l@@<|4QV2_rzcBrgE4}n%AsoS_KqqBn9zw<|UJPVbzwY7`BBvU)P_uXsyM7AA! zw+7yUvtq_d1=&hH1o0VTc6IQ$?R#GKDI*JYP0iSZp1RuFCm*LI^lxHQW+%`8EG^zh z5hBmqJwD2{ROg9QD#hwzWNJm3-l#M&QO34xP5Z;8S!2HsNe4!U6_!kwpH2@*8izJ; z-`=SyX>5$tF3OblcPn&RP3E>3_wD0&w89f#m>+G4S5)1vV7KAIihYiM{Kyfp$tgTO zMJN#H)*T7Nc*+G0Evu6z+^5l>+r{iCl{3JjBeU8c7`UeOi@9af_#{Ds%}~e zjdqU|));-m&u^mQ>JG`bi}v@PzQm6wm($>$AuAUgUY8MGIeN*$_=AHXi_MBKI{mA1 zJJT0Byt*2ZX8E``cwk_ldO;+5VwKmmLb_HTd6P&adfpY{YzZ>^u%+zi1vyRIzmhD+ zEZ}zfWjd2PEMo^XoIM(+@=;7g$2Cvr1kmyWjECZv=dl1OvuHCzfuN((k5EGct+(l^ zuCwav>%A!qLA#b6lgS)b659g6*)7MC@*gSOb`r+Et;VzT-FQ5nx0+zErlw|Letv$0 z)oBBQ6Y=6mL4S+3$+Q;S#s)$_@DIMIkVWtDX6c))nNrG?w%U<0VWPbdgO3URV`0V+=T G#{C0e8N3q! literal 0 HcmV?d00001 diff --git a/admin-dev/themes/flashyturtle/searchbutton.png b/admin-dev/themes/flashyturtle/searchbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..30cc017e2ed558cacb6b36fa9115c6ee8d0a08e7 GIT binary patch literal 2504 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 Oj`ei)b6Mw<&;$T!npA24 literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/admin.css b/admin-dev/themes/oldschool/admin.css new file mode 100644 index 000000000..a141bfc6b --- /dev/null +++ b/admin-dev/themes/oldschool/admin.css @@ -0,0 +1,56 @@ +body{background:#EFEFEF} +#top_container{margin:0;padding:0} +#header_infos{float:left;font-size:10px;margin:10px 20px 4px 0;width:380px;height:40px} +#header_infos #header_shopname span{display:block;font-size:24px;height:28px;overflow:hidden;margin-bottom:-8px} +#header_infos #header_logout{text-decoration:underline} +#header_infos #header_foaccess{text-decoration:none} +#header_search{float:right;height:39px;width:356px} +#header_search #bo_query{float:left;height:16px;line-height:16px;margin:8px 2px 0 30px;vertical-align:middle;width:140px} +#header_search #bo_search_type{float:left;height:21px;line-height:21px;margin:8px 2px 0 0;vertical-align:middle;width:90px} +#header_search #bo_search_submit{cursor:pointer;float:left;font-weight:700;margin:7px 0 0 2px;width:79px} +#header_quick{float:right;height:39px;margin-right:1px;width:175px} +#header_quick #quick_select{margin:8px 0 0 20px;vertical-align:middle;width:140px} +#header_shoplist{float: right;} +#header_myaccount{background:url(bg-lang.png) no-repeat;display:block;float:right;height:16px;margin:8px 1px 0 0;width:16px} +.button{background-color:#FFF6D3;border:1px solid #DFD5AF;border-left:1px solid #FFF6D3;border-top:1px solid #FFF6D3;color:#268CCD;padding:3px} +.button[disabled=disabled]{color:#8C8C8C} +input.button[disabled=disabled]:hover{background-color:#FFF6D3} +.button:hover{background-color:#F0EBD6} +.table{border:1px solid #DFD5C3;padding:0} +.table th a{text-decoration:underline} +.table a:hover{text-decoration:none} +.table tr th{background:#F4E6C9 url(news-bg.gif) repeat-x top left;padding:4px 6px} +.table tr td{border-bottom:1px solid #DEDEDE;color:#963;font-size:.9em;height:23px;padding:0 4px 0 6px} +.table tr.last td{border-bottom:none} +.alt_row{background-color:#EFEFEF} +.path_bar{background-color:#E2EBEE;border:1px solid #999999;font-family:Trebuchet,Arial,Helvetica,sans-serif;font-size:13px;margin-bottom:20px;padding:5px} +.path_bar a{font-weight:700} +.cat_bar{background-color:#F4E8CD;border:1px solid #999999;font-family:Trebuchet,Arial,Helvetica,sans-serif;font-size:12px;font-weight:700;margin-bottom:20px;padding:5px} +.cat_bar a{font-weight:700} +fieldset{background:#FFFFF0;border:1px solid #DFD5C3;font-size:1.1em;margin:0;padding:1em} +legend{background:#FFF6D3;border:1px solid #DFD5C3;font-weight:700;margin:0;padding:.2em .5em;text-align:left} +#menu{float:left;height:30px;line-height:normal;margin:10px 0 0;*margin:7px 0 0;padding:0;width:100%;padding:0 1px} +#menu li{background:url(bg-tab.png) repeat-x 0 -2px;float:left;height:29px;list-style:none;margin:0 1px 0 0;list-style:none;display:block;border:1px solid #999999;-moz-border-radius-topright:6px;-moz-border-radius-topleft:6px;-webkit-border-top-right-radius:6px;-webkit-border-top-left-radius:6px} +#menu li a{color:#000;display:block;height:20px;padding:8px 8px 4px 0;font-weight:bold;font-size:0.95em;} +#menu img{display:inline;padding:0 3px 0 6px;vertical-align:top;width:16px;height:16px} +#menu li.active,#menu li:hover{background-position:0 -38px;white-space:nowrap;} +#menu li.active a{color:#000} +#submenu{background:#ECEADE;clear:both;color:#666;margin:0;height:32px;padding:0;border:1px solid #999999} +.withLeftBorder{background:transparent url(separator_subnav.png) no-repeat 0 5px} +#submenu li{display:inline;list-style:none;margin:0;background:transparent url(separator_subnav.png) no-repeat right 0;padding-left:7px;padding-right:7px;margin-top:8px;float:left;height:20px} +#submenu li a{text-decoration:underline} +#menu li{_height:32px;_padding-top:3px} +#menu li a{_display:inline;_padding:6px 5px 4px 0} +.tab-page {border:1px solid #ccc;background:#FFFFF0} +.tab-row .tab.selected {border:1px solid #ccc;background:#FFF6D3;margin:1px -3px -3px 0px;top:-2px} +.tab-row .tab {background:#EFEFEF} +hr {height: 1px;color:#E0D0B1;background-color:#E0D0B1} +#footer {height:40px;background:#ECEADE url(footer-bg.png) repeat-x scroll left bottom;border:1px solid #999999;font-size:12px;clear:both;font-size:0.9em;color:#666666} +#content {background-color:#FFF;border-left:1px solid #999999;border-right:1px solid #999999} +input[type="text"],input[type="password"],input[type="file"],textarea {border:1px solid #E0D0B1} +select {border: 1px solid #E0D0B1} +.header_module{background:url(header_module.png);padding-left: 0.5em;padding-top: 0.8em;height:20px;color: #812143;border:solid 1px #CCC;} +a.action_module{color: #268CCD;text-decoration: underline;} +a.header_module_toggle{font-weight: bold;color: #268CCD;display:block;} +a.module_toggle_all{color: #268CCD;} +.nbr_module{float:right;margin-right:10px;font-style:italic;font-size:12px;color: #268CCD;} \ No newline at end of file diff --git a/admin-dev/themes/oldschool/bg-lang.png b/admin-dev/themes/oldschool/bg-lang.png new file mode 100644 index 0000000000000000000000000000000000000000..5db32699e9922e249df7920a5fdd9f0564eb7c31 GIT binary patch literal 910 zcmV;919AL`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+$tiu~XJ00RC=L_t(IPjypWNRwd{9$`Oi~R(8pr2!UqQjbEc=K ziK(fnErmkys;jH(Y#>c4mCY_MFZ!>nX0n(B z!T-{OAmiiX8@s!^fb2eG@7M?E?d_#~svdmbmR#;zOht<_pSX^B6*=#m4{6e8n8SEL^(qAQG zV_G*RY^qc$KIe zNFFveHlA#1YAP_9Ofx8T&*5;uyjlhAMFn7f{REs0s%P?X9wCa0j6DKUTU#5}-Q8WU z*Xv#AG*~Pavfn+mT5S^FOdI<8?5@YrSPU+1Js2P660+0_Spkrmnwl_VFE$tq8xs=~ zK=!?`umD=E_6trSPkcEcdn6}CXMb4;-|LFN(NXQuKe$7%WBw_@BpN1fNu^Rht}Wos z`_cK;s;a6Kj1wf&$LNT7MMko2wj|fHSXl@^-c`bAK^DPJiqE8=qd#%0yv@zc1Qz-U zf^gC4^qPu_ibD^JeJ&k07*qoM6N<$f)Cf4U;qFB literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/bg-quick.png b/admin-dev/themes/oldschool/bg-quick.png new file mode 100644 index 0000000000000000000000000000000000000000..4acbb75b44b2a4c948a7b943fe8b2318af9f29c0 GIT binary patch literal 1620 zcmaJ>eM}Q)7(Y>g>G+s)6%fsNpd*vE*A`mZaWH79Rz0i*CSlrHdIwZ#uiTyVBhCPu zaY&fDxf;c($nYb?GKD}?e5LvWIL*hUJMr7ikLa)ij zRk#MT-$QWY_=@8*eshv|Df*%*3;G1_XL^{(A`2 zVF>8KKv5+n{rb6~a>7Q&#A$KeU0L?Tfn$cK3_7v^($d^S%c5%4823{EbH ziAG{s5|vCo8H@1{D2Jwv5-!(dGI2}-4nbyfd1A5Ht-IZcF`lt3onCnhEF#k?qCl!q%L zv|IJKf%b5**W9FOx$aTW8=1&5oYdvxn4Bc^;6%w1-SoL6POCS`#iq|iIxUyWB*S%I z?7uGBbHq%Kdpk9@j59U(xPh5=k{Rn|e!k5B;B{FcOGq_$4wUh7Le_;gAF;MYg@_ZW zW!`O9da$CU!5_`cn!BVA!UQK{ik0gV&d&OhlUyIZLs=xX?F;oE+*5w*TdI0dZDmG? zDgvqS4u2Wnrjn$cH2ZW1jGbI-eERg+aF-Mv9UWcbT`=5tVDAk0y*&#)Py-+r@L2CX z^%%82(r+BXSdyM-(36RonfzyR~PQSBwGIUsxL}b zf441ee3y;L84Be7bh>fFosyCgul=?got>Q>EiEm684LO{)SZjNt2#FS+)t1ESlNr; z${h(kJ(p%ba=FOz53BUMj$ID*_o=y+d+ovF3+vOKlpl-8sOmVlTVAm_V*c~u&wp^h zr7kVKeP`LqaPo=u6Y8cTB_-t=#^*f`{dF)uxcKTo{@<5sYHD)9Ku2@w%%Has&HTLj zy1IM$=La8@t}Ys5)sM4}uBhs0VX;_oM-Cm@XS3O485iZvn|fN$U%YrYS6H@tBj>kI z4;%=lD%#ALuxz|5dBY-RwYLjfeQG&D*^dv(Uj*ESN-NSMQ!e7vor0;Bcn<2#*zCD^NQ>?w)aPHsJCCEK|0ik@4ZTw!Z-b XI~MnDAWy6jy5D(4QnJjRxT)wL7Fu^= literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/bg-subtab.png b/admin-dev/themes/oldschool/bg-subtab.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc1b1180b124baa5efc8cbe4107abd12c36a3cd GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf$!3HE*_k3gr2^0spJ29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?z8@)#y;M1`rPy!NHKF5$ p9>*k-?w5OJ`)Vv*l6(6Hv#DUaw%$~ew?Io7JYD@<);T3K0RVAvR^ zi(`mJaPkbxVztAYx62>+aq)FI&-Z!z6L)YQ***=}8Xx|*ly3W<-gELGgJ9&E&^s~5 R_5dwn@O1TaS?83{1ORNbQUw42 literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/button-bg.png b/admin-dev/themes/oldschool/button-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..bbde5ed577adc5845e8b88c0a1c0f95642821c41 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI}!3HGf{@&OH5-1LGcVbv~PUa<$!;&U>c zv7h@-A}f&3S>O>_%)r2R7=#&*=dVZs3QCr^MwA5SrJ~QNf6c!~W8IcR ztrPDvyZ&ju;9KX@XZt!YUFqCm6Je^P7P{KW=Kao<6?#^zo%z8-myt)U}I|@caU|5Dg z^^rS=fga;5@Q5sCVBk9h!i=ICUJXD&$r9IylHmNblJdl&REB`W%)AmkKi3e2GGjec zJyXxFKM#P4ls#P>LnOkJAEYVp?3A#Ow2-*5a6)h6)W+6ENv@d^5|R@b7_8YDWyCl8 RN&=NLc)I$ztaD0e0ss{$Ok4l} literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/header_module.png b/admin-dev/themes/oldschool/header_module.png new file mode 100644 index 0000000000000000000000000000000000000000..afaaae61d4d983c6dcd2ea2841c06d5378b72ba7 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3HGlw@oMq2^0spJ29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?h6dRZUsYuk3v3k z+J&Dx=qP+-b=+gY{X|JH-61CA(a+2U5@C--JeXW;oYfe*Pfj|TbXk55&{PIbS3j3^ HP6(lh;%=G5U_36;{>Cg4+ z()H=i_3F^|?A7$?&h+QXA^8LW00000EC2ui05<>~000ESu*pfQy*O*ZyZ>M)j$~<` z=vS<4>%MR-&vb3yuA=XJ@BhG{kU%UNkI1BQ$!t2G&?93?ty-_xtagj&dcWYXcuX!Q z&gisy&2GEji@1DFuiNkVykpPr`~QG}f`bEvhKGoWii?bmj*pO$hz69EmY0~Bnwy-R zo}ZwX0i&d)rl+W>s;jK6uCK7MvaJubwzs&sy1Tr+2fx6dFX%FDt4&d<=% b($mz{*4NnC+S}aS-rwNi;^XAy(GdVU);y|O literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/searchbar.png b/admin-dev/themes/oldschool/searchbar.png new file mode 100644 index 0000000000000000000000000000000000000000..26b93aeefd2aaa58bf0bff6e41ad2f05ff1b92f1 GIT binary patch literal 2446 zcmaJ@X;>3k7JU%~8%0rBMJ0pCCRsrtkpKc=HLL+?7uqZZL`*6qg@mPOXk?>pz*d*3^Czn9?Y?xdo; zQ5gWB;^OS!4FHCVjty5TqHoK~WIyzyjnMrOA2<*RXNe%Nn+vlctP7tN1bIU&ZbWD^ zWCehN9*^md_%rrUIWQm3TEyTbd?CsPz{*A?a5k zLeu*zDSw71)*co?*d2Hxjzio@#O@^FNoM9278a&hGLb|i5Xl4*8Ar09nvtnQBKGs6 zhei`|1F7B)j-O+pGn!s7f(WSuLU?#MKHLlsi-HIw3Wc($K_=r+1Wp_wKv)u-K)iKH z!2uF;L_8tFg9X?{MHU+lLuh(vrhk>d7k-fyh(B)=x?uzfOGqH$iHjvI0U3<{59RZ} zpv8zc^mo4hQ&`N55JCiRNDPOGIOxFzZe0u|q}q!h76OZyFnnZb7d?Yv1QrLwLae>d z4lIMk;RzP!pYRL@)kPpiSON~@;y}|w74SSBmr5bq(Jgn|TiV$>IFd*Xj+R7oGY2zt zkxr(N%y*hEaUEbz7#|WKOI+^XT*_Cui&o$Z(Z~*vh<6m?I*MRE_EX7J-q&;4`BlBo zT<+I%vG^*NfF?s&JlOv_=%pppJ&VIHwnZmjj1LJ=w~J6)w-?*80Z?4#;;@@3=^5!g z80-_Ir8Iv2tk~VUM{9qlfbHmKd^51~Y(Y_-Y0{}ZFqh6+T`hx@s+todxonvZ?2 zn>EWgv-{~Eu^0dr;1yft3Lx&O!ZK|Dj;#h@CHl`VCj-Fb$lHE;H#@egI$+G%NG;Ov zqH9^k9)q@E^VicUXUbKwP<(M>V&b`bCbew-adX+tn%-ODd=7$4Z%@yc z9l05ncrQhRPJ)SAr*b_NLEL7wM0&gb)q;ZcgLy1An=O(^ECZm(oIq^0bKjRDPH@XW&T0TZwlQE#+a`XUv1`3%ZF#ybIDv^hbvO707A?pIFWz@N9D{C8@v9yegDp!u5$-M}9 z=iKARDXIw$TV|)H-@ibp8!A))cp!z^AEh$77_D|jguaVXPVMuti0R)Rg;n+9H_;-I z_JN5x=-YO~^Ua;z-QBnSO<&E-M`vg53Lo8-o>hm&RXto>^(GI>@i7|CMV_kDOTD4! z)Ae(YbKSnrvWgI$Ic}+bw$Y+3P#h{0j+dmRrG+rJMb-6>`WKUCbloptXGD%~ku`>jMi z)ulY(T?rpd)*Qb!`J`Z5EHzX9VAb(lP;#qsC3v`8T{MswnfpetAD5`0wC29y`h>Mx ztfM9G>*7~+oVrr2`tyXOI@9FE?U|XG!p4DbOifMI)-?fOSC3m&v*~{HCKPL}y3&+> z^^tu?M~Ck0%*=v6g`$yI_Pi!)c7vB%5e|oIW|}~GLcgQ0%@n|8JGnh}D%?*P=7!mC zTB15LJL_RB8SfiDMC{U3j&IO+N$<}h#ly0mo}SP(1D&0IyE}f4DHrrsI!@K5LX^`o z3}{OdPhVsg4!>o^_7hNg2Tiabk1Gb0!Iy4iw2$Ye~Xn=1F^aMEDY*a8ai4}vCO7$RyXt~m*`!{9sorXJ zv!cSt(>6#^QSo+7_?TQ%tpWbgJ}qF&Pqqsu3W7|>F}58M+hp>VcgfP+sB@mag}(3A z`(j#jh8|>p3_N`JwcDD(tgNi={{DV-c7o&8Ybh9T?0^S$@5#x4g;42}N{YF;xuDel z?Sm|uj*I?!ol^fJ=cNL)*-Xk6BHr2kVP${TWRT&dman0q!4*J<-su2r^6+Y|ONyv& z>W7?-uVapEm`yL$)CTF=LDx)MPp_D~dqPQfisNMD!-&4S@44S{00`c`Pr7=0+s@wE z{_EzZfRfqS($dnk^HtkXZ?Vf|^P%qXkv*CKw4KbRGU!DKWS>gWpzFz#1+iOB>|ghx z4FB8I{H1dEc`V_a^R@Im$SB!Y9(pX_T>&r~53b1XFs|qo#BjO#^dS=!o4l>H_0x65 z%WnNsH@z_`p$Ku7NHO5(X@!4F2d;V6KwiYL{^QZ-i1NK4?xW&O8bAv|doJ2#<80A8 h720L*gpBH96ahsy!^(ACQvBi#$%XFjP;7VT_@5vG2`m5r literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/searchbutton.gif b/admin-dev/themes/oldschool/searchbutton.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2f27ddf9c68c38f662daf49bdea964e6a90ce91 GIT binary patch literal 1548 zcmeH``A^yh0L8x?0;X$5r)5^1$7(HzZtjR>bIBK{^{7~BT@w3dw#$}< z#Rh5JGFFUbs|Q6}EmB8O@f?DRawrNY*E~>>TLtk<*M2wmN9?D*yu4rE%O`nx1-Yd6 zJ}U;&fqmde+h%ar0zNf>kRF5#;PW{UGJywH@W2K_77$tlp=A)VgInec9%H#@u6$p2 zX0~Wfuv2%#g_N{<9uco1XxS^LkoW4gYkR2q5&+A&qHC^n(t+3mz`P`IpP0u4^JGDvX{#GEI@BFx% zv8d_oyxf&jRv%R;65-(}m5H0m-_Sm)44{fZue@@U!dUiUxZ;#s@{1)ZqPIpIQ95wz+6X`nBy$ z>GIO_P~SI}0q9nMJlr2#Q*nu(>V^-mo`7dx<6Zo7aMx$)u3XlYf5&#mjMhQ%#j@eU zklWaq2R)0&91pB%TZ%_y&z>HHmeGj;1PcOCcsmn`tFZrwiB=iG*e^Kt8f-2;k$I{r zffE)>I$Nha5%p zi^p-5{wJ#FN+wyB?DKce=EnFX&`qzm*YduV2w$l7ZS>h$#La$3L*^U3XbgXI&@c6E z4h1HNTf@P)1S%Zi=-iV1z31B+0nn-G^6-UBg#vR{6c~N!oIfyz&7=jua3npbjQUa( zoQS>d4^F;TOvwUXslT$V#MHK~1mi3ax3;mgP{5|6H_V+Po~-c6-jxzIEGZ*O8WQze|^)02@@EFnMHW&*c=)d8CGjBzqPsc RCM literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/tab_right.gif b/admin-dev/themes/oldschool/tab_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..82740efa4f9c48737c02ff9d9466038ddc3e6634 GIT binary patch literal 2128 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 G0suR2Xq&nK literal 0 HcmV?d00001 diff --git a/admin-dev/themes/oldschool/thead.png b/admin-dev/themes/oldschool/thead.png new file mode 100644 index 0000000000000000000000000000000000000000..afaaae61d4d983c6dcd2ea2841c06d5378b72ba7 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3HGlw@oMq2^0spJ29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?h6dRZUsYuk3v3k z+J&Dx=qP+-b=+gY{X|JH-61CA(a+2U5@C--JeXW;oYfe*Pfj|TbXk55&{PIbS3j3^ HP6LAR)1|)kH2buyY$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVi%$jQ~h(b>ew*~QJ!(8bNdz{J?a7%1p!WNBz( zW&+delAm0fo0?Yw)0=|OYl>4ZC@JI?0Bv?jEy^rQO>ryA&s6|>*(wu@TTD%yT-}T; z+;Ex))tiFFEfBqy1~~QV10ACeiddwGh6w>v4~Pj*wm=R%;iu*SQ+p9GSvN1Yj0ffx zbx#+^kcwMxrtkHZE|fU_UT=EFy(=cmwkTfYYn;UqrW@4Sq|n;p^_yKp@vKs#&s{6a z8B4j|K1fnb@oo=zwMMo}lEs(n;KG&7TVr`Pnrt+C_IK@lcd1)TqD;iA_`VT2ohPJ&6fh;q;?spESegWtTIv)6>CN6Yx5p#tI;lKI<#xwzIE1icKdE#y?Qjm zM5^t1y}bJbj*q1|y%E*__bPN9RbuB@w|MbmmSu|Z4{R$oHLP`-k|irI|9@SGR{tx5 zvuqhntGk%Q`Pz3E@0>I1+ljmT*U8Jse0lr+efMKa6nhi%NZq+~X;Nx=`FF?S zd#z52>`Tt-bZui}Vw`;cef^Hjn~Uc^-jTgTNG1O3D%F4|cLlqWN~@}V`EpBD8|I#U z{#nMPt|B${si4}#-2#-PtP=-6T)7gGke8>|!@qJ1ubx=< z%4g4?zgGin#SZ@w*i ze(l;c_qAcgGcNiaQ({`>udrP5-O0yRQw_K+#H`jRd92D}l9iRMmE~cZAFMBKGW9@o zR7Ka~Jxcke?e9&Bci**}ep*!Zd2W9G>-4m=d5qK4*I$;Lk;Jp3OjKJhL+IFbtylM~ z_$6*0J9ex{+Zd7bA!^0;?csHC7CZ~O zDs1f94leL9Xl`zPUsY8#<%3*z|J22f^@}EKUp;j~L$;=mcxI?C!_{SS-n(XJ9aow2 p>$u~k`qeDzpkx}u{VlkGk-@^yy|QWB-7lbO#M9N!Wt~$(69B)~nr;99 literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/bg-quick.png b/admin-dev/themes/origins/bg-quick.png new file mode 100644 index 0000000000000000000000000000000000000000..4acbb75b44b2a4c948a7b943fe8b2318af9f29c0 GIT binary patch literal 1620 zcmaJ>eM}Q)7(Y>g>G+s)6%fsNpd*vE*A`mZaWH79Rz0i*CSlrHdIwZ#uiTyVBhCPu zaY&fDxf;c($nYb?GKD}?e5LvWIL*hUJMr7ikLa)ij zRk#MT-$QWY_=@8*eshv|Df*%*3;G1_XL^{(A`2 zVF>8KKv5+n{rb6~a>7Q&#A$KeU0L?Tfn$cK3_7v^($d^S%c5%4823{EbH ziAG{s5|vCo8H@1{D2Jwv5-!(dGI2}-4nbyfd1A5Ht-IZcF`lt3onCnhEF#k?qCl!q%L zv|IJKf%b5**W9FOx$aTW8=1&5oYdvxn4Bc^;6%w1-SoL6POCS`#iq|iIxUyWB*S%I z?7uGBbHq%Kdpk9@j59U(xPh5=k{Rn|e!k5B;B{FcOGq_$4wUh7Le_;gAF;MYg@_ZW zW!`O9da$CU!5_`cn!BVA!UQK{ik0gV&d&OhlUyIZLs=xX?F;oE+*5w*TdI0dZDmG? zDgvqS4u2Wnrjn$cH2ZW1jGbI-eERg+aF-Mv9UWcbT`=5tVDAk0y*&#)Py-+r@L2CX z^%%82(r+BXSdyM-(36RonfzyR~PQSBwGIUsxL}b zf441ee3y;L84Be7bh>fFosyCgul=?got>Q>EiEm684LO{)SZjNt2#FS+)t1ESlNr; z${h(kJ(p%ba=FOz53BUMj$ID*_o=y+d+ovF3+vOKlpl-8sOmVlTVAm_V*c~u&wp^h zr7kVKeP`LqaPo=u6Y8cTB_-t=#^*f`{dF)uxcKTo{@<5sYHD)9Ku2@w%%Has&HTLj zy1IM$=La8@t}Ys5)sM4}uBhs0VX;_oM-Cm@XS3O485iZvn|fN$U%YrYS6H@tBj>kI z4;%=lD%#ALuxz|5dBY-RwYLjfeQG&D*^dv(Uj*ESN-NSMQ!e7vor0;Bcn<2#*zCD^NQ>?w)aPHsJCCEK|0ik@4ZTw!Z-b XI~MnDAWy6jy5D(4QnJjRxT)wL7Fu^= literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/bg-subtab.png b/admin-dev/themes/origins/bg-subtab.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc1b1180b124baa5efc8cbe4107abd12c36a3cd GIT binary patch literal 249 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 n`Cslo_>b!|KKK#^`U|r{J>|Mz@<{RDe-Q&U>c zv7h@-A}f&3S>O>_%)r2R7=#&*=dVZs3QCr^MwA5SrJ~QNf6c!~W8IcR ztrPDvyZ&ju;9KX@XZt!YUFqCm6Je^P7P{KW=Kao<6?#^zo%z8-myt)U}I|@caU|5Dg z^^rS=fga;5@Q5sCVBk9h!i=ICUJXD&$r9IylHmNblJdl&REB`W%)AmkKi3e2GGjec zJyXxFKM#P4ls#P>LnOkJAEYVp?3A#Ow2-*5a6)h6)W+6ENv@d^5|R@b7_8YDWyCl8 RN&=NLc)I$ztaD0e0ss{$Ok4l} literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/header_module.png b/admin-dev/themes/origins/header_module.png new file mode 100644 index 0000000000000000000000000000000000000000..afaaae61d4d983c6dcd2ea2841c06d5378b72ba7 GIT binary patch literal 218 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 QY}~{pUcPO+w}X72L;=RfD(b55h%sY5X_ zOUyb1SXH%o4FS$PZN8?NV+j|*R<^N?W9blCI=MP8Tie31bx*N`1S&TNZDqT$GB?hj zRhRGTEwKTf(O0Ih^U-Ee+Y-ba6l(7wKB~DwiOZcH6o{3p8SDxY*z=mCVg!{g0#i zs4(pDL3WJBn7_fCPGXThoQ8Vwr9{FgJ-mC56e6NVX-MrsJV_fKBV5B29vt?zMTYw# zXjE!8L58$G9Z$w_8iUgD{zOWjHcGK5*^BF$d2Sn)LgNs+&nUIz4xpT-jihi$Eko)f zhz5Z)a+zGI(rUGJkOGk-Frt9vih8+LuTbw^$emuHI$&SbbTUKGhxAwry>-QqzN(so)A#gmNi)$R6q67HfZk!OEY8y)8Z~#w{15^ZO;58Fu z=I%}|lmjx}=vyg*c@(VQPDTdec!GA@jZ)@B7A2y3M5ROIa;*x{DiDoMF1P3qhtBD+ z+E7%9IuX@`jT3RTN~Kn#Qd_JxCu76z)FCRRU8%4-912vf(oAyQi4=_`BKU+Z!RQ|6 zq9^6*Z4{2tB-KWe{Sz7Bi;*;$ijhgk7F0tXEJ7r5>)i7ki`I@)#Bx09q{uile!qI+ z1p0{j-{L;TjsBNAgBfSwTyp#)Sthoa49ra@Q=eH(77w0aDu!Z8Bk$;+fBgR2uSb6Q z`KKR$`2M?Zzd8K%S6_bd`DdSga_HlaKK$U|`|rK`&f9Oj`Nr$7z52?_FTHr+h3B7p z_L--j+W+Jek3aV4zP*n;yyu|@AJ~2WeY@_xXXo8_-MQnA+i$z|mYcWVbmI-zUw7>_ zS6{X5$}29v?9#1UF4=tXMHgPMY2*1D&O3K({kpYlMzgC|jbzSQdG=W=&OBpyC_T7* zfKE}%l4K&@-*-9@Te<{~MtZTH#fwe@-CdpGP)B=PFyQyKdOa=8O>S4C(_yz+Eep*i zqoF~M>a-fQN~vJVQdVELp!U@H^XAT(T_dfAW}Py#YDT4Gdd0MIaoN;TQAzQXBB7wL zfY0M{*!fH+t3JYEzJOJi>uI^3&*JY~2{I$AR%b`otX;Prbh9=zjg4@Niwn7%G8Qlw zRAjHU77qfrN&agJ_T@KkS}nJw$`$Dl;lkn0`YwHr~~kT4(P#5pqL}_XB+E+ zz{YO~w2b&VvvN=crXauzf$}0#W!9{ffT9vU8Ulq2!K`dEuqSuy#d({>VCz^x&puJM pta{h3Z3i;zH(IRe>C((X3(6^T`3?r=6s{`Y64(y*Q$C2*@E7e{0;T`} literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/img/t/AdminModules.gif b/admin-dev/themes/origins/img/t/AdminModules.gif new file mode 100644 index 0000000000000000000000000000000000000000..2104e0bed91fad53006e5889705b14bcd36ec799 GIT binary patch literal 1461 zcmZ?wbhEHb6k!lyxN6G~RLB{a&+eDS5s=5OW5?u^#bM#c99Y2Vk;3km%^{`E=$$MU zkS*+&pyeH_>KCu4Vaa6X#ZuJfo?2}ll&YCgZ($$7np|b>p1>NBW$v257M!JGAI=_I zuIiP_8JNc@smACM$7UVG=AXmvmB#KHr)})P5}3!6P-5;AryiYQYwjWuk|$x{!mOan zY~smc?9S{Q!xV%Qmue&kg&dz0$52&wylyQNJ0T* zr*nQ$s)DJWfo`&anSp|tp`M|!iMhGCj)IYap@F`Ek-njkuA#Y=v5}R5fdUjL0c|Tv zNwW%aaf8|g1^l#~=$>Fbx5m+O@q>*W`v>l<2HT7t|lGSUUA&@HaaD@m--%_~-h znc$LIoLrPyP?DLSrvNfBF)6>a#8wIDQivCF3w(Xy2Im#)fjy*`oS&;-kyxN_sAr&` zn+x(6SaoqpP%6S1SXCE?R2HP_2c;J0mlh?b0+lPnGy}s9zeOO0K-XCL7i9t?B{9b( zKe;qFHLt|e#a0O@qnDDIVr5`rVPI%zZen0=WMF1tXy|BR;A-LK>f~%`X>93cU;;A( zn_hEcV^cFzBXcKbH=r3VZWab6#xBN2POh#-mWC!~aJ`;+#U+V($*C}VGlBL(^_t<; zYvo*&npl!w6q28x14{t`8Tlpo#Toep3eLf%3ciWSnRy^SD0(2ibxAGCEK5ysE6UGR z0Ee$tCKme*ObPiLqBn({Fw+M*MjwIxnujbty?y4+PGo;y0vRouUffc`Ld-;7B5=3 zVE(+hb7s$)Ib-^?sZ%CTnmD1queYbWtFxoMt+l1Osj;EHuC}JSsEZKEj1-MDKQ~FE;c4QDl#HGEHorIC@{d^&)3J>%hSW%&DF)($^ux>E5YqoIeuy*dU@oaYXZguhPaP#l>@SN!AH{C6$%O|kcE2!T)tluwW zl3(~#|B(4U;S&NPrvye$4~(528aX2{c4k=2tdN-5Au)49qL&B8EC^1VADJ{iI(J%H z-qf`G=^42*QuAh~70k>in4M8LFEe3bMADMT)P=FBi(=B3$0e>0&sY|pu{JJkTTIsC z#OxJG*=rJWRwU)ENX=WFlDjrJdrv~af{fyYStU!eOPA&rtWGanmtMFkqhe)V?&>BUDLj|rej-u)A6#F)0J&!DmxC;c5QFy+tV_8&&1jLCiEX{nQ*vu(&6@L zC%R@G@1J?HcjlSi+2{M`9hf}t;Ns>)~tL4&T^*^u~^( zH+LMnwe#flJtuDOK6!i3sT+Gw-`aQL&hC@<_ME=E@6`RhXKwF5dvE{g2m8+6IdJao z!E^Typ1*(S!h^#XA0EE==*XpqM=m`&`snG^C(o`ueSZDf^Bd2f-+cZ8h;F?AqL;TA zMjlZ7$->OQ5X+zg@;WF_FmOC$*v%p1u_0l4&{DTfF4j}Q>b_GoT$N6ooVq$pB64li zQm?BDO*11nxmZs4%iC3ddZ3ux-h04%^}7kbS~4#!cJ1I=Yxu-l?Cv6zsWMKGErD<_+fmG_m$7wv%G`+&^yl8mBs2rTnC+aA? z?9?QA3zwb^2`-I`T;gASX>d|;?-iCaYgiz_+~{E1QsN=GsoAwtK*q?VA<-d0%0M$` zfx<;c=T=TWi7g5aADXAC`%aQsXy|;5Tbzj_X@>&ip(Yj%J`o84hK7TWPfX_K;b5=^ E03CFPcK`qY literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/img/t/AdminOrders.gif b/admin-dev/themes/origins/img/t/AdminOrders.gif new file mode 100644 index 0000000000000000000000000000000000000000..92067bd9e75dd2a96f95a39a2ccdfedb118771ad GIT binary patch literal 1449 zcmZ?wbhEHb6k!lyxT?qC7|9w~z-b%GqF}&S+T|Nm!08;rX5q)IVaX(=#%S!pZ05yc z;KHn7#pIL8A*02ZSfi_K#28c{P}Jt>8?Rc`8)WJ%?UBr`X3C^v$5h-B=p4hMZOi1D z%5Lt>;-AAFkj-!5DWqt?D5=J1?!yw6tFCU&WF5p}AHnJrAg}Mltf0%}nZh1i#KAxo zQ2fsw;Txdfl30=mq;2dg3KEmEQ%e+*Qqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Y zlp0*+7m{3+ootz+WN)WnQ(;w+TacStlBiITo0C^;Rbi`?n3A8AY6WD2g!Ppaz)DK8 zZIv8B5(*$Yo%4%Q6-@OEbdwFt3>3@^^$d+o%+1Yp6pRcE4fG9+^bL)44b82LjjRj| z6rex}Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M(T(8_%FTW^V-_X+15@d#vkuFe$ZgFK^ zNn(X=Ua>OF1ees}><76{9OHt z!~%UoJp=vRT#&!Os*6j4QW4I;s=7F&vLIDID784hv?w_hs9YJQ85nl>EdnV7y2i@C zC=(bdi8(I$$)&lec_p4Mwn{)5y_C!pD+3b?14Bb|69aQ212YRlLq`h(R|_{+Cud7b zV@o#!6POv;^qLzRIht9zIXgMK0nKo6voJ6*b}=?`a&-EelE=kNwPKDW< z3A7ig*9os)E9aur#FG4?ko^1{SPBTp$S=t+&d4uNa1J(A@J&q4%meX3(F5_VOKMSO zS!#+~QGTuhIDD-#vDj~5O32?3y(#2`nLf}l`k=&tlvrRwz!V5#!jnFb1J69EdB7Y~ z1k4(Y|Ns5{^ZVD&AK$-y{qp(K#}Dt{y?yig)yo&ppFMr@_|d}$_wU`kbNklK8`rO0 zy>j`|#S7=pojr5<)X5Xaj~zX7_|U-v`}ghLvwPRh9ox5U-LiSp#trM&tzENv)yfsi zmn~hgc+tWI^XJW-Gkey|8PlgtoicgS#0mXjScm6wKdgMl@;Y> zr6t8hg$4O}xjETcnHlM6sVT`xi3#y>u`$t6krClxp&`LRfdT%0zCPYwo*wRQt}f0_ zjt=&Awl>yQmKNq_rY6Qlz-+0ftD~)@siCf>s-moDIqQrZU=09%*31L| literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/img/t/AdminPayment.gif b/admin-dev/themes/origins/img/t/AdminPayment.gif new file mode 100644 index 0000000000000000000000000000000000000000..89de86e3c6fca77c6023487cf2e395f045f87bbf GIT binary patch literal 1322 zcmZ?wbhEHb6k!lyI3mlS=g1_Z!RVgIs_(??6v?M!$7JCxU>hK;ZN+96D4bg8>l!WW z6v?A)%cO43lv?Cx?kQm5C1mN#?Gh!VZpmcn%V+5=q;1V*=_O?1&ZBI^=n}^!tHsCw z1B(B-BYXoCToOwXfwYZ%ML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb*d<&dYGcrA@ zic*8C{6dnevXd=SlxV%Qmue&kg&dz0$52& zwylyQNJ0T*r*nQ$s)DJWfo`&anSp|tp`M|!iMhGCj)IYap@F`Ek-njkuA#Y=v5}R5 zfdUjL0c|TvNwW%aaf8|g1^l#~=$>Fbx5m+O@q>*W`v>l<2HT7t|lGSUUA&@Haa zD@m--%_~-hnc$LIoLrPyP?DLSrvNfBF)6>a#8wIDQivCF3w(Xy2Im#)fjy*`oS&;- zkyxN_sAr&`n+x(6SaoqpP%6S1SXCE?R2HP_2c;J0mlh?b0+lPnGy}s9zeOO0K-XCL z7i9t?B{9b(Ke;qFHLt|e#a0O@qnDDIVr5`rVPI%zZen0=WMF1tXy|BR;A-LK>f~%` zX>93cU;;A(n_hEcBWH7S3sWa&H=r3VZWab6#xBN2POh#-mWC!~aJ`;+#U+V($*C}V zGlBL(^_t+-Yvo*&npl!w6q28x14{t`8Tlpo#Toep3eLf%3ciWSnRy^SD0(2ibxAGC zEK5ysE6UGR0Ee$tCKme*ObPiLqBn({Fw+M*MjwIxnujbty?y4+PGo;y0vRouUffc z`Ld-;7B5=3VE(+hb7s$)Ib-^?sZ%CTnmD1queYbWtFxoMt+l1Osj;EHuC}JSsEZKEj1-MDKQ~FE;c4QDl#HGEHorIC@{d^&)3J>%hSW%&DF)( z$;xncUu zjT1B(XDuk;STRGQski8)h=7mqwL?>0m@qUr9xO4CjF6bzDr%^yvDxJK$AX>rKkS$z I!o*+=09qG3D{A4#9GI@^5iO@<$7JBl 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 C49}hb literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/img/t/AdminStockMvt.gif b/admin-dev/themes/origins/img/t/AdminStockMvt.gif new file mode 100755 index 0000000000000000000000000000000000000000..2a85c456cf8fff5023155d8bd8aed23ed6ab7e1c GIT binary patch literal 1709 zcmZ?wbhEHb6k!lyc;?UGk-{F3%Wf0GBCo>~RLJR-#vYYx;GW1Dl&RpK!yZ?z;S$HD zY{cl1%7m(3BGW8j&}?w-Kv8L4UM&uSgW>Kf1H6wMlxuAykaSk&eon9rWy z;^Z8|mfz|msm5sJ%IuTDrl89dmZ|TP#ZlbhDXYaOtIcQ~#9|-8Y8%3$W5*Pbs%+rG zZ0yS6n<^2QA*b)a**qyJxz-@4fHS^KKRnwYvP@Fj7N|@$BugbQTT;P*F}_kgC{@QP zRKh<^);5$Sq)5myk~O|cJ-$@mF-$17RKp{gHLgMHY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C z$yM3OmMKd1b_zBXRu#Dgxv3?I3Kh9IdBs*0wn~X9`AMl(KsHENUr7P1q$Jx`$q^)> z0J76LzbI9~RL?*+*}%*|!OT$4(AdP>++0V&$iUD*-@r)U&`8(N+{)O<%D_MY3Y37h z6{VzE1-ZCE?E>;_l`=|73as??%gf94%8m8%i_-NCEiElUW*8ai0#)c1SLT%@R_Nvx zE5l51Ni9w;$}A|!%+FH*nV6WAUs__T1av9H3%LcpzHo!{iuJ%A(o4?I)vrh_&^OdG z(9g{U`3tPNxFjeQ;S8**i$f|4QuTvUi}Op1l2d`om0_BJVTa!$kV2qqto(~IfsvA! zP;G0~2ExV$P$&N=+=uFAB-e&w-_YfQ9{rvI$+t)9jKYjf0{@vR*uV1}<@%-7-CyyUJd~pBX-8;8$-Mn%A+SMzU zFI~KF{@mF!r%#aDv3%Lm zC5sm=Trhv$+&Qyn&73iP+SDnNCrzBt-`CsI-PPIA-qzaE+|<}mUsqdGT~%38URGLC zTvS+)pO>4Hot2r9o|c-DoRpXl9~T=F9Tgc79u^uB926Mf@8|2|?d9p=?&j*^?BwWR zZ)a;`ZDna;Zf0s?Yy`}fdb&E=TACW_YN{&AN{R~daM-~8?Rc`8)WJ%?UBr`X3C^v$5h-B=p4hMZOi1D z%5Lt>;-AAFkj-!5DWqt?D5=J1?!yw6tFCU&WF5p}AHnJrAg}Mltf0%}nZh1i#KAxo zQ2fsw;Txdfl30=mq;2dg3KEmEQ%e+*Qqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Y zlp0*+7m{3+ootz+WN)WnQ(;w+TacStlBiITo0C^;Rbi`?n3A8AY6WD2g!Ppaz)DK8 zZIv8B5(*$Yo%4%Q6-@OEbdwFt3>3@^^$d+o%+1Yp6pRcE4fG9+^bL)44b82LjjRj| z6rex}Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M(T(8_%FTW^V-_X+15@d#vkuFe$ZgFK^ zNn(X=Ua>OF1ees}><76{9OHt z!~%UoJp=vRT#&!Os*6j4QW4I;s=7F&vLIDID784hv?w_hs9YJQ85nl>EdnV7y2i@C zC=(bdi8(I$$)&lec_p4Mwn{)5y_C!pD+3b?14Bb|69aQ212YRlLq`h(R|_{+Cud7b zV@o#!6POv;^qLzRIht9zIXgMK0nKo6voJ6*b}=?`a&-EelE=kNwPKDW< z3A7ig*9os)E9aur#FG4?ko^1{SPBTp$S=t+&d4uNa1J(A@J&q4%meX3(F5_VOKMSO zS!#+~QGTuhIDD-#vDj~5O32?3y(#2`nLf}l`k=&tlvrRwz!V5#!jnFb1J69EdB7Y~ z1k4(Y|Ns5{^ZVD&AK$-y{qp(K#}Dt{y?yig)yo&ppFMr@_|d}$_wU`kbNklK8`rO0 zy>j`|#S7=pojr5<)X5Xaj~zX7_|U-v`}ghLvwPRh9ox5U-LiSp#trM&tzENv)yfsi zmn~hgc+tWI^XJW-Gkey|8PlgtoicgS#0mXjScm6wKdgMl@;Y> zr6t8hg$4O}xjETcnHlM6sVT`xi3#y>u`$t6krClxp&`LRfdT%0zCPYwo*wRQt}f0_ zjt=&Awl>yQmKNq_rY6Qlz-+0ftD~)@siCf>s-moDIqQrZU=09%*31L| literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/img/t/AdminTools.gif b/admin-dev/themes/origins/img/t/AdminTools.gif new file mode 100644 index 0000000000000000000000000000000000000000..d875d9167928d980b5900cd54ac06a7d7824d063 GIT binary patch literal 1658 zcmZ?wbhEHb6k!lyc;?LDp1`VO%NA3rp=Hf%7sh7f%IuTL<`l*17|Ckj!WxmUZXeEN z?#YvN*62}%%BrmSSsBFZjZpIptp< zreV&Okmsgu#_W|WU>V4&ZN(OnCmWE*o=|EUkjt)R#pV<)7M5mW6U?G!%48S9;T+4R zY{=vi!|f3-!7wy|;(zW4-v9-d#F9iHZDU_ikeHmETB4AYnx2_wtMq>NekFy>6kDZm zQ(pt$0_W6>OpmIf)Zi+=kmRcDWXlvKdpiZ23ag6Tg51=SM1_jnoV;SI3R|Vbl>DSr zDrlU}Ruupl@KL zZ)l`zXl`X}WMyEW00l}w+lo@stb$zJpmqUywn`Z#B?VUc`sL;2dgaD?`9*7iAWdWaj57fJ{tG$}cUkRRX#c;)UD-UthSv zdBu8Q59uZ6=jvA^7U&!58R+Ncg8T(mU0f2Bif{&2)x{x|1*!T$sm1xFMaii^<;pP4 zz_7z_5lA7>HCFybnZQU%%yG$2F3nBNEAe!(RRYTBrDUd98JJiY7#fLwm{}Ma zI$9XGTDZA7Ia^v9Te=yTz|6p=*WB3H+|0zx$jR9aXoicMg@K8&i?NZDtE-Wvp@|t> zuV-FyNn&1dD$L$YpuJGNhIsW_ITxiSmgE}YRmZE0?5 zY^blRt*Nf6tSB!lEh#Q4EXdEx&B@Nn%t%j5O-W8lOo)$*jfswmj0g`44G9hk4Dk2! z_3`%d^l*1`b#Zobbg;LxwXwFcv@ka_H8C~(lh;%=G5U_36;{>Cg4+ z()H=i_3F^|?A7$?&h+QXA^8LW00000EC2ui05<>~000ESu*pfQy*O*ZyZ>M)j$~<` z=vS<4>%MR-&vb3yuA=XJ@BhG{kU%UNkI1BQ$!t2G&?93?ty-_xtagj&dcWYXcuX!Q z&gisy&2GEji@1DFuiNkVykpPr`~QG}f`bEvhKGoWii?bmj*pO$hz69EmY0~Bnwy-R zo}ZwX0i&d)rl+W>s;jK6uCK7MvaJubwzs&sy1Tr+2fx6dFX%FDt4&d<=% b($mz{*4NnC+S}aS-rwNi;^XAy(GdVU);y|O literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/searchbar.png b/admin-dev/themes/origins/searchbar.png new file mode 100644 index 0000000000000000000000000000000000000000..26b93aeefd2aaa58bf0bff6e41ad2f05ff1b92f1 GIT binary patch literal 2446 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 literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/searchbutton.png b/admin-dev/themes/origins/searchbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..31327bf89451c57b37f3cc2838285c5730da83e1 GIT binary patch literal 930 zcmV;T16}-yP)N2bPDNB8 zb~7$DE;UJt{NMlp10P95K~!i%?c2*w6Hycf@L558Y*~O1)0m-!&_YCoR2m=+E}F3L z58!WAK^`s7Lf<@91PY3YPogoO=bOkS(;_`_eHLGubUK?~&b{Z(oYafQ<47bD=#NJc z>FYpG>@K>ZZI%WDy3oguM&SECB9REZWHO1q!TazZwWGH28po9!&i7U<4F+_f51ssh zdx*ti@Px|SUR%cb?h4L!mT|hBwKN#eg+6qmSAW8X7ai)v-sU_$%7qiT!E&=sT%vtBbeP2tdqUUc)=96s!<;JBK#C=KXEw*c>Kdl^U7C5zI4UJj3C z_`bYkQ5w+8;niz79F`X?N&|X1ypw7UZ%Ydnr2)Mh-f<<1H^l{u(tutL@2H%`eqr9C zG@zHmW3$-b5vw z9D9tZsVSt>X?Qlb)y=3|&TYR|CxPNPP_Q%^hzotLo!cV+7wkYjtCl7My0ECkDKxkJ zeu=d&7cDm%h!wru+%`}qTE)`RfKKA&=C;8NyB4*9c)4d=Y#N*zjzuP3S9n~uR(W~@ z@w&ph?6h`7(H+yoD_nU7r-P$YQ{|Q9ON-7RRC#iGzNlHW27C&;TDDS(KLyXCGvJd( zsA2pTO^eQek7%LFyO2%LqB96ro-~SYa%#5d4A@v*<#D6@C8uVK&VXJayf2jrSab$W zc%RGTu;>gN9_NpILrSh4Gr-n3K9w_;76yc)S7>g_{f-xc>RWqm zX*3WQ`q1gxxov%GCRo1wktJ+E7y8)T_CNj-d)?gj51Usjj?Zhf!2kdN07*qoM6N<$ Ef)>@THUIzs literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/separator_subnav.png b/admin-dev/themes/origins/separator_subnav.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2a18ad086ee123a9befdd528beaa7b35df93b7 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ec!3HFkTfSKYq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6-jxzIEGZ*O8WQze|^)02@@EFnMHW&*c=)d8CGjBzqPsc RL^YHHF=I!wA?BVR{-s0=--RJE8<&@gy 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 G0suR2Xq&nK literal 0 HcmV?d00001 diff --git a/admin-dev/themes/origins/thead.png b/admin-dev/themes/origins/thead.png new file mode 100644 index 0000000000000000000000000000000000000000..afaaae61d4d983c6dcd2ea2841c06d5378b72ba7 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3HGlw@oMq2^0spJ29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?h6dRZUsYuk3v3k z+J&Dx=qP+-b=+gY{X|JH-61CA(a+2U5@C--JeXW;oYfe*Pfj|TbXk55&{PIbS3j3^ HP6 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_ADMIN_DIR', getcwd()); + +include(PS_ADMIN_DIR.'/../config/config.inc.php'); + +if (!class_exists('Cookie')) + exit(); + +$cookie = new Cookie('psAdmin', substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -10)); +if (!$cookie->isLoggedBack()) + die; + +if (isset($_FILES['virtual_product_file']) AND is_uploaded_file($_FILES['virtual_product_file']['tmp_name']) AND +(isset($_FILES['virtual_product_file']['error']) AND !$_FILES['virtual_product_file']['error']) OR +(!empty($_FILES['virtual_product_file']['tmp_name']) AND $_FILES['virtual_product_file']['tmp_name'] != 'none')) +{ + $filename = $_FILES['virtual_product_file']['name']; + $file = $_FILES['virtual_product_file']['tmp_name']; + $newfilename = ProductDownload::getNewFilename(); + + if (!copy($file, _PS_DOWNLOAD_DIR_.$newfilename)) + { + header('HTTP/1.1 500 Error'); + echo ''; + } + @unlink($file); + + header('HTTP/1.1 200 OK'); + echo ''; +} +else +{ + header('HTTP/1.1 500 Error'); + echo ''; +} \ No newline at end of file diff --git a/attachment.php b/attachment.php new file mode 100644 index 000000000..d73e1594d --- /dev/null +++ b/attachment.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=attachment'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/authentication.php b/authentication.php new file mode 100644 index 000000000..f714c1a98 --- /dev/null +++ b/authentication.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=authentication'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/best-sales.php b/best-sales.php new file mode 100644 index 000000000..8b674f6c3 --- /dev/null +++ b/best-sales.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=best-sales'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/cart.php b/cart.php new file mode 100644 index 000000000..6ab3d2c19 --- /dev/null +++ b/cart.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=cart'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/category.php b/category.php new file mode 100644 index 000000000..5965f8d74 --- /dev/null +++ b/category.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=category'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/changecurrency.php b/changecurrency.php new file mode 100644 index 000000000..b8dc6ad81 --- /dev/null +++ b/changecurrency.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=change-currency'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/classes/.htaccess b/classes/.htaccess new file mode 100755 index 000000000..93169e4eb --- /dev/null +++ b/classes/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/classes/AbstractLogger.php b/classes/AbstractLogger.php new file mode 100644 index 000000000..5e8dfe7b6 --- /dev/null +++ b/classes/AbstractLogger.php @@ -0,0 +1,111 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class AbstractLoggerCore +{ + public $level; + protected $level_value = array(0 => 'DEBUG', + 1 => 'INFO', + 2 => 'WARNING', + 3 => 'ERROR'); + + const DEBUG = 0; + const INFO = 1; + const WARNING = 2; + const ERROR = 3; + + public function __construct($level = self::INFO) + { + if (array_key_exists((int)$level, $this->level_value)) + $this->level = $level; + else + $this->level = self::INFO; + } + + /** + * Log the message + * + * @param string message + * @param level + */ + abstract protected function logMessage($message, $level); + + /** + * Check the level and log the message if needed + * + * @param string message + * @param level + */ + public function log($message, $level = self::DEBUG) + { + if ($level >= $this->level) + { + $this->logMessage($message, $level); + } + } + + /** + * Log a debug message + * + * @param string message + */ + public function logDebug($message) + { + $this->log($message, self::DEBUG); + } + + /** + * Log an info message + * + * @param string message + */ + public function logInfo($message) + { + $this->log($message, self::INFO); + } + + /** + * Log a warning message + * + * @param string message + */ + public function logWarning($message) + { + $this->log($message, self::WARNING); + } + + /** + * Log an error message + * + * @param string message + */ + public function logError($message) + { + $this->log($message, self::ERROR); + } +} + diff --git a/classes/Address.php b/classes/Address.php new file mode 100644 index 000000000..9c327bf55 --- /dev/null +++ b/classes/Address.php @@ -0,0 +1,329 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AddressCore extends ObjectModel +{ + /** @var integer Customer id which address belongs */ + public $id_customer = NULL; + + /** @var integer Manufacturer id which address belongs */ + public $id_manufacturer = NULL; + + /** @var integer Supplier id which address belongs */ + public $id_supplier = NULL; + + /** @var integer Country id */ + public $id_country; + + /** @var integer State id */ + public $id_state; + + /** @var string Country name */ + public $country; + + /** @var string Alias (eg. Home, Work...) */ + public $alias; + + /** @var string Company (optional) */ + public $company; + + /** @var string Lastname */ + public $lastname; + + /** @var string Firstname */ + public $firstname; + + /** @var string Address first line */ + public $address1; + + /** @var string Address second line (optional) */ + public $address2; + + /** @var string Postal code */ + public $postcode; + + /** @var string City */ + public $city; + + /** @var string Any other useful information */ + public $other; + + /** @var string Phone number */ + public $phone; + + /** @var string Mobile phone number */ + public $phone_mobile; + + /** @var string VAT number */ + public $vat_number; + + /** @var string DNI number */ + public $dni; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + /** @var boolean True if address has been deleted (staying in database as deleted) */ + public $deleted = 0; + + protected static $_idZones = array(); + protected static $_idCountries = array(); + + protected $fieldsRequired = array('id_country', 'alias', 'lastname', 'firstname', 'address1', 'city'); + protected $fieldsSize = array('alias' => 32, 'company' => 32, 'lastname' => 32, 'firstname' => 32, + 'address1' => 128, 'address2' => 128, 'postcode' => 12, 'city' => 64, + 'other' => 300, 'phone' => 16, 'phone_mobile' => 16, 'dni' => 16); + protected $fieldsValidate = array('id_customer' => 'isNullOrUnsignedId', 'id_manufacturer' => 'isNullOrUnsignedId', + 'id_supplier' => 'isNullOrUnsignedId', 'id_country' => 'isUnsignedId', 'id_state' => 'isNullOrUnsignedId', + 'alias' => 'isGenericName', 'company' => 'isGenericName', 'lastname' => 'isName','vat_number' => 'isGenericName', + 'firstname' => 'isName', 'address1' => 'isAddress', 'address2' => 'isAddress', 'postcode'=>'isPostCode', + 'city' => 'isCityName', 'other' => 'isMessage', + 'phone' => 'isPhoneNumber', 'phone_mobile' => 'isPhoneNumber', 'deleted' => 'isBool', 'dni' => 'isDniLite'); + + protected $table = 'address'; + protected $identifier = 'id_address'; + protected $_includeVars = array('addressType' => 'table'); + protected $_includeContainer = false; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'addresses', + 'fields' => array( + 'id_customer' => array('xlink_resource'=> 'customers'), + 'id_manufacturer' => array('xlink_resource'=> 'manufacturers'), + 'id_supplier' => array('xlink_resource'=> 'suppliers'), + 'id_country' => array('xlink_resource'=> 'countries'), + 'id_state' => array('xlink_resource'=> 'states'), + ), + ); + + /** + * Build an address + * + * @param integer $id_address Existing address id in order to load object (optional) + */ + public function __construct($id_address = NULL, $id_lang = NULL) + { + parent::__construct($id_address); + + /* Get and cache address country name */ + if ($this->id) + { + $result = Db::getInstance()->getRow('SELECT `name` FROM `'._DB_PREFIX_.'country_lang` + WHERE `id_country` = '.(int)($this->id_country).' + AND `id_lang` = '.($id_lang ? (int)($id_lang) : Configuration::get('PS_LANG_DEFAULT'))); + $this->country = $result['name']; + } + } + + public function add($autodate = true, $nullValues = false) + { + if (!parent::add($autodate, $nullValues)) + return false; + + if (Validate::isUnsignedId($this->id_customer)) + Customer::resetAddressCache($this->id_customer); + return true; + } + + public function delete() + { + if (Validate::isUnsignedId($this->id_customer)) + Customer::resetAddressCache($this->id_customer); + + if (!$this->isUsed()) + return parent::delete(); + else + { + $this->deleted = true; + return $this->update(); + } + } + + /** + * Returns fields required for an address in an array hash + * @return array hash values + */ + public static function getFieldsValidate() + { + $tmp_addr = new Address(); + $out = ($tmp_addr->fieldsValidate); + + unset($tmp_addr); + return $out; + } + + + + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_address'] = (int)($this->id); + $fields['id_customer'] = is_null($this->id_customer) ? 0 : (int)($this->id_customer); + $fields['id_manufacturer'] = is_null($this->id_manufacturer) ? 0 : (int)($this->id_manufacturer); + $fields['id_supplier'] = is_null($this->id_supplier) ? 0 : (int)($this->id_supplier); + $fields['id_country'] = (int)($this->id_country); + $fields['id_state'] = (int)($this->id_state); + $fields['alias'] = pSQL($this->alias); + $fields['company'] = pSQL($this->company); + $fields['lastname'] = pSQL($this->lastname); + $fields['firstname'] = pSQL($this->firstname); + $fields['address1'] = pSQL($this->address1); + $fields['address2'] = pSQL($this->address2); + $fields['postcode'] = pSQL($this->postcode); + $fields['city'] = pSQL($this->city); + $fields['other'] = pSQL($this->other); + $fields['phone'] = pSQL($this->phone); + $fields['phone_mobile'] = pSQL($this->phone_mobile); + $fields['vat_number'] = pSQL($this->vat_number); + $fields['dni'] = pSQL($this->dni); + $fields['deleted'] = (int)($this->deleted); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + public function validateController($htmlentities = true) + { + $errors = parent::validateController($htmlentities); + if (!Configuration::get('VATNUMBER_CHECKING')) + return $errors; + include_once(_PS_MODULE_DIR_.'vatnumber/vatnumber.php'); + if (class_exists('VatNumber', false)) + return array_merge($errors, VatNumber::WebServiceCheck($this->vat_number)); + return $errors; + } + /** + * Get zone id for a given address + * + * @param integer $id_address Address id for which we want to get zone id + * @return integer Zone id + */ + public static function getZoneById($id_address) + { + if (isset(self::$_idZones[$id_address])) + return self::$_idZones[$id_address]; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT s.`id_zone` AS id_zone_state, c.`id_zone` + FROM `'._DB_PREFIX_.'address` a + LEFT JOIN `'._DB_PREFIX_.'country` c ON c.`id_country` = a.`id_country` + LEFT JOIN `'._DB_PREFIX_.'state` s ON s.`id_state` = a.`id_state` + WHERE a.`id_address` = '.(int)($id_address)); + + self::$_idZones[$id_address] = (int)((int)($result['id_zone_state']) ? $result['id_zone_state'] : $result['id_zone']); + return self::$_idZones[$id_address]; + } + + /** + * Check if country is active for a given address + * + * @param integer $id_address Address id for which we want to get country status + * @return integer Country status + */ + public static function isCountryActiveById($id_address) + { + if (!$result = Db::getInstance()->getRow(' + SELECT c.`active` + FROM `'._DB_PREFIX_.'address` a + LEFT JOIN `'._DB_PREFIX_.'country` c ON c.`id_country` = a.`id_country` + WHERE a.`id_address` = '.(int)($id_address))) + return false; + return ($result['active']); + } + + /** + * Check if address is used (at least one order placed) + * + * @return integer Order count for this address + */ + public function isUsed() + { + $result = Db::getInstance()->getRow(' + SELECT COUNT(`id_order`) AS used + FROM `'._DB_PREFIX_.'orders` + WHERE `id_address_delivery` = '.(int)($this->id).' + OR `id_address_invoice` = '.(int)($this->id)); + + return isset($result['used']) ? $result['used'] : false; + } + + /** + * @param int $id_address + * @return int + * @deprecated + */ + static public function getManufacturerIdByAddress($id_address) + { + Tools::displayAsDeprecated(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_manufacturer` FROM `'._DB_PREFIX_.'address` + WHERE `id_address` = '.(int)($id_address)); + return isset($result['id_manufacturer']) ? $result['id_manufacturer'] : false; + } + + static public function getCountryAndState($id_address) + { + if (isset(self::$_idCountries[$id_address])) + return self::$_idCountries[$id_address]; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_country`, `id_state`, `vat_number`, `postcode` FROM `'._DB_PREFIX_.'address` + WHERE `id_address` = '.(int)($id_address)); + self::$_idCountries[$id_address] = $result; + return $result; + } + + /** + * Specify if an address is already in base + * + * @param $id_address Address id + * @return boolean + */ + static public function addressExists($id_address) + { + $row = Db::getInstance()->getRow(' + SELECT `id_address` + FROM '._DB_PREFIX_.'address a + WHERE a.`id_address` = '.(int)($id_address)); + + return isset($row['id_address']); + } + + static public function getFirstCustomerAddressId($id_customer, $active = true) + { + return Db::getInstance()->getValue(' + SELECT `id_address` + FROM `'._DB_PREFIX_.'address` + WHERE `id_customer` = '.(int)($id_customer).' AND `deleted` = 0'.($active ? ' AND `active` = 1' : '') + ); + } +} + diff --git a/classes/AddressFormat.php b/classes/AddressFormat.php new file mode 100644 index 000000000..56f8614e5 --- /dev/null +++ b/classes/AddressFormat.php @@ -0,0 +1,439 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AddressFormatCore extends ObjectModel +{ + /** @var integer */ + public $id_address_format; + + /** @var integer */ + public $id_country; + + /** @var string */ + public $format; + + private $_errorFormatList = array(); + + protected $fieldsRequired = array ('format'); + protected $fieldsValidate = array ('format' => 'isGenericName'); + + /* MySQL does not allow 'order detail' for a table name */ + protected $table = 'address_format'; + protected $identifier = 'id_country'; + + static public $requireFormFieldsList = array( + 'firstname', + 'name', + 'address1', + 'city', + 'postcode', + 'Country:name', + 'State:name'); + + static public $forbiddenProperyList = array( + 'deleted', + 'date_add', + 'other', + 'alias', + 'secure_key', + 'note', + 'newsletter', + 'ip_registration_newsletter', + 'newsletter_date_add', + 'optin', + 'passwd', + 'last_passwd_gen', + 'active', + 'is_guest', + 'date_upd', + 'years', + 'days', + 'months', + 'description', + 'meta_description', + 'short_description', + 'link_rewrite', + 'meta_title', + 'meta_keywords', + 'display_tax_label', + 'need_zip_code', + 'contains_states', + 'call_prefixes', + 'call_prefix'); + + static public $forbiddenClassList = array( + 'Manufacturer', + 'Supplier'); + + public function getFields() + { + parent::validateFields(); + + $fields['id_country'] = (int)($this->id_country); + $fields['format'] = pSQL($this->format); + + return $fields; + } + + /* + * Check if the the association of the field name and a class name + * is valide + * @className is the name class + * @fieldName is a property name + * @isIdField boolean to know if we have to allowed a property name started by 'id_' + */ + private function _checkValidateClassField($className, $fieldName, $isIdField) + { + $isValide = false; + + if (!class_exists($className)) + $this->_errorFormatList[] = Tools::displayError('This class name doesn\'t exist'). + ': '.$className; + else + { + $obj = new $className(); + $reflect = new ReflectionObject($obj); + + // Check if the property is accessible + $publicProperties = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); + foreach($publicProperties as $property) + { + $propertyName = $property->getName(); + if (($propertyName == $fieldName) && ($isIdField || + (!preg_match('#id|id_\w#', $propertyName, $match)))) + $isValide = true; + } + + if (!$isValide) + $this->_errorFormatList[] = Tools::displayError('This property doesn\'t exist in the class or is forbidden'). + ': '.$className.': '.$fieldName; + + unset($obj); + unset($reflect); + } + return $isValide; + } + + /* + * Verify the existence of a field name and check the availability + * of an association between a field name and a class (ClassName:fieldName) + * if the separator is overview + * @patternName is the composition of the class and field name + * @fieldsValidate contains the list of available field for the Address class + */ + private function _checkLiableAssociation($patternName, $fieldsValidate) + { + $patternName = trim($patternName); + $cleanedLine = ''; + + if ($associationName = explode(':', $patternName)) + { + $totalNameUsed = count($associationName); + if ($totalNameUsed > 2) + $this->_errorFormatList[] = Tools::displayError('This assocation contains too much key name'); + else if ($totalNameUsed == 1) + { + $associationName[0] = strtolower($associationName[0]); + $cleanedLine = $associationName[0]; + if (in_array($associationName[0], self::$forbiddenProperyList) || + !$this->_checkValidateClassField('Address', $associationName[0], false)) + $this->_errorFormatList[] = Tools::displayError('This name isn\'t allowed').': '. + $associationName[0]; + } + else if ($totalNameUsed == 2) + { + if (empty($associationName[0]) || empty($associationName[1])) + $this->_errorFormatList[] = Tools::displayError('Syntax error with this pattern').': '.$patternName; + else + { + $associationName[0] = ucfirst($associationName[0]); + $associationName[1] = strtolower($associationName[1]); + + if (in_array($associationName[0], self::$forbiddenClassList)) + $this->_errorFormatList[] = Tools::displayError('This name isn\'t allowed').': '. + $associationName[0]; + else + { + // Check if the id field name exist in the Address class + $this->_checkValidateClassField('Address', 'id_'.strtolower($associationName[0]), true); + + // Check if the field name exist in the class write by the user + $this->_checkValidateClassField($associationName[0], $associationName[1], false); + $cleanedLine = $associationName[0].':'.$associationName[1]; + } + } + } + } + return (strlen($cleanedLine)) ? $cleanedLine.' ' : ''; + } + + /* + * Check if the set fields are valide + */ + public function checkFormatFields() + { + $cleanedContent = ''; + $this->_errorFormatList = array(); + $fieldsValidate = Address::getFieldsValidate(); + + $multipleLineFields = explode("\n", $this->format); + if ($multipleLineFields && is_array($multipleLineFields)) + foreach($multipleLineFields as $lineField) + { + $lineField = str_replace(array("\n", "\t", "\r\n", "\r"), '', $lineField); + if (strlen($lineField)) + { + $patternsName = explode(' ', trim($lineField)); + if ($patternsName && is_array($patternsName)) + { + foreach($patternsName as $patternName) + $cleanedContent .= $this->_checkLiableAssociation($patternName, $fieldsValidate); + $cleanedContent = trim($cleanedContent)."\r\n"; + } + } + } + $this->format = $cleanedContent; + return (count($this->_errorFormatList)) ? false : true; + } + + /* + * Returns the error list + */ + public function getErrorList() + { + return $this->_errorFormatList; + } + + /* + * Returns the formatted fields with associated values + * + * @address is an instancied Address object + * @addressFormat is the format + * @return double Array + */ + public static function getFormattedAddressFieldsValues($address, $addressFormat) + { + global $cookie; + + $tab = array(); + $temporyObject = array(); + + // Check if $address exist and it's an instanciate object of Address + if ($address && ($address instanceof Address)) + foreach($addressFormat as $lineNum => $line) + { + if (($keyList = explode(' ', $line)) && is_array($keyList)) + foreach($keyList as $pattern) + if ($associateName = explode(':', $pattern)) + { + $totalName = count($associateName); + if ($totalName == 1 && isset($address->{$associateName[0]})) + $tab[$associateName[0]] = $address->{$associateName[0]}; + else + { + $tab[$pattern] = ''; + + // Check if the property exist in both classes + if (($totalName == 2) && class_exists($associateName[0]) && + Tools::property_exists($associateName[0], $associateName[1]) && + Tools::property_exists($address, 'id_'.strtolower($associateName[0]))) + { + $idFieldName = 'id_'.strtolower($associateName[0]); + + if (!isset($temporyObject[$associateName[0]])) + $temporyObject[$associateName[0]] = new $associateName[0]($address->{$idFieldName}); + if ($temporyObject[$associateName[0]]) + $tab[$pattern] = (is_array($temporyObject[$associateName[0]]->{$associateName[1]})) ? + ((isset($temporyObject[$associateName[0]]->{$associateName[1]}[(isset($cookie) ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'))])) ? + $temporyObject[$associateName[0]]->{$associateName[1]}[(isset($cookie) ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'))] : '') : + $temporyObject[$associateName[0]]->{$associateName[1]}; + } + } + } + } + // Free the instanciate objects + foreach($temporyObject as $objectName => &$object) + unset($object); + return $tab; + } + + /* + * Generates the full address text + * @address is an instanciate object of Address class + * @patternrules is a defined rules array to avoid some pattern + * @newLine is a string containing the newLine format + * @separator is a string containing the separator format + */ + public static function generateAddress(Address $address, $patternRules, $newLine = "\r\n", $separator = ' ', $style = array()) + { + $addressFields = AddressFormat::getOrderedAddressFields($address->id_country); + $addressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($address, $addressFields); + + $addressText = ''; + foreach ($addressFields as $line) + if (($patternsList = explode(' ', $line))) + { + $tmpText = ''; + foreach($patternsList as $pattern) + if (!in_array($pattern, $patternRules['avoid'])) + $tmpText .= (isset($addressFormatedValues[$pattern])) ? + (((isset($style[$pattern])) ? + (sprintf($style[$pattern], $addressFormatedValues[$pattern])) : + $addressFormatedValues[$pattern]).$separator) : ''; + $tmpText = trim($tmpText); + $addressText .= (!empty($tmpText)) ? $tmpText.$newLine: ''; + } + return $addressText; + } + + /** + * Returns selected fields required for an address in an array according to a selection hash + * @return array String values + */ + public static function getValidateFields($className) + { + $propertyList = array(); + + if (class_exists($className)) + { + $object = new $className(); + $reflect = new ReflectionObject($object); + + // Check if the property is accessible + $publicProperties = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); + foreach($publicProperties as $property) + { + $propertyName = $property->getName(); + if ((!in_array($propertyName, AddressFormat::$forbiddenProperyList)) && + (!preg_match('#id|id_\w#', $propertyName, $match))) + $propertyList[] = $propertyName; + } + unset($object); + unset($reflect); + } + return $propertyList; + } + + /* + * Return a list of liable class of the className + */ + public static function getLiableClass($className) + { + $objectList = array(); + + if (class_exists($className)) + { + $object = new $className(); + $reflect = new ReflectionObject($object); + + // Get all the name object liable to the Address class + $publicProperties = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); + foreach($publicProperties as $property) + { + $propertyName = $property->getName(); + if (preg_match('#id_\w#', $propertyName, $match) && strlen($propertyName) > 3) + { + $nameObject = ucfirst(substr($propertyName, 3)); + if (!in_array($nameObject, self::$forbiddenClassList) && + class_exists($nameObject)) + $objectList[$nameObject] = new $nameObject(); + } + } + unset($object); + unset($reflect); + } + return $objectList; + } + + /** + * Returns address format fields in array by country + * + * @param Integer PS_COUNTRY.id if null using default country + * @return Array String field address format + */ + public static function getOrderedAddressFields($id_country = 0, $split_all = false) + { + $out = array(); + $field_set = explode("\n", self::getAddressCountryFormat($id_country)); + foreach ($field_set as $field_item) + if ($split_all) + foreach(explode(' ',$field_item) as $word_item) + $out[] = trim($word_item); + else + $out[] = trim($field_item); + return $out; + } + + /** + * Returns address format by country if not defined using default country + * + * @param Integer PS_COUNTRY.id + * @return String field address format + */ + public static function getAddressCountryFormat($id_country = 0) + { + $out = ''; + $id_country = (int) $id_country; + + if ($id_country <= 0) + { + $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT')); + } + + $tmp_obj = new AddressFormat(); + $tmp_obj->id_country = $id_country; + $out = $tmp_obj->getFormat($tmp_obj->id_country); + unset($tmp_obj); + return $out; + } + + /** + * Returns address format by country + * + * @param Integer PS_COUNTRY.id + * @return String field address format + */ + public function getFormat($id_country) + { + $out = $this->_getFormatDB($id_country); + + if (strlen(trim($out)) == 0) + $out = $this->_getFormatDB(Configuration::get('PS_COUNTRY_DEFAULT')); + return $out; + } + + private function _getFormatDB($id_country) + { + $result = Db::getInstance()->getRow(' + SELECT format + FROM `'._DB_PREFIX_.$this->table.'` + WHERE `id_country` = '.(int)($id_country)); + + return isset($result['format']) ? trim($result['format']) : ''; + } +} + diff --git a/classes/AdminTab.php b/classes/AdminTab.php new file mode 100644 index 000000000..f96a60064 --- /dev/null +++ b/classes/AdminTab.php @@ -0,0 +1,2226 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7499 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class AdminTabCore +{ + /** @var integer Tab id */ + public $id = -1; + + /** @var string Associated table name */ + public $table; + + /** @var string Object identifier inside the associated table */ + protected $identifier = false; + + /** @var string Tab name */ + public $name; + + /** @var string Security token */ + public $token; + + /** @var boolean Automatically join language table if true */ + public $lang = false; + + /** @var boolean Tab Automatically displays edit/delete icons if true */ + public $edit = false; + + /** @var boolean Tab Automatically displays view icon if true */ + public $view = false; + + /** @var boolean Tab Automatically displays delete icon if true */ + public $delete = false; + + /** @var boolean Table records are not deleted but marked as deleted */ + public $deleted = false; + + /** @var boolean Tab Automatically displays duplicate icon if true */ + public $duplicate = false; + + /** @var boolean Content line is clickable if true */ + public $noLink = false; + + /** @var boolean select other required fields */ + public $requiredDatabase = false; + + /** @var boolean Tab Automatically displays '$color' as background color on listing if true */ + public $colorOnBackground = false; + + /** @var string Add fields into data query to display list */ + protected $_select; + + /** @var string Join tables into data query to display list */ + protected $_join; + + /** @var string Add conditions into data query to display list */ + protected $_where; + + /** @var string Group rows into data query to display list */ + protected $_group; + + /** @var string Having rows into data query to display list */ + protected $_having; + + /** @var array Name and directory where class image are located */ + public $fieldImageSettings = array(); + + /** @var string Image type */ + public $imageType = 'jpg'; + + /** @var array Fields to display in list */ + public $fieldsDisplay = array(); + + /** @var string shop | group_shop */ + public $shopLinkType; + + /** @var bool */ + public $shopShareDatas = false; + + /** @var array Cache for query results */ + protected $_list = array(); + + /** @var integer Number of results in list */ + protected $_listTotal = 0; + + /** @var array WHERE clause determined by filter fields */ + protected $_filter; + + /** @var array Temporary SQL table WHERE clause determinated by filter fields */ + protected $_tmpTableFilter = ''; + + /** @var array Number of results in list per page (used in select field) */ + protected $_pagination = array(20, 50, 100, 300); + + /** @var string ORDER BY clause determined by field/arrows in list header */ + protected $_orderBy; + + /** @var string Default ORDER BY clause when $_orderBy is not defined */ + protected $_defaultOrderBy = false; + + /** @var string Order way (ASC, DESC) determined by arrows in list header */ + protected $_orderWay; + + /** @var integer Max image size for upload */ + protected $maxImageSize = 2000000; + + /** @var array Errors displayed after post processing */ + public $_errors = array(); + + /** @var array Confirmations displayed after post processing */ + protected $_conf; + + /** @var object Object corresponding to the tab */ + protected $_object = false; + + /** @var array tabAccess */ + public $tabAccess; + + /** @var string specificConfirmDelete */ + public $specificConfirmDelete = NULL; + + protected $identifiersDnd = array('id_product' => 'id_product', 'id_category' => 'id_category_to_move','id_cms_category' => 'id_cms_category_to_move', 'id_cms' => 'id_cms'); + + /** @var bool Redirect or not ater a creation */ + protected $_redirect = true; + + protected $_languages = NULL; + protected $_defaultFormLanguage = NULL; + + protected $_includeObj = array(); + protected $_includeVars = false; + protected $_includeContainer = true; + + public static $tabParenting = array( + 'AdminProducts' => 'AdminCatalog', + 'AdminCategories' => 'AdminCatalog', + 'AdminImageResize' => 'AdminImages', + 'AdminCMS' => 'AdminCMSContent', + 'AdminCMSCategories' => 'AdminCMSContent', + 'AdminOrdersStates' => 'AdminStatuses', + 'AdminAttributeGenerator' => 'AdminProducts', + 'AdminAttributes' => 'AdminAttributesGroups', + 'AdminFeaturesValues' => 'AdminFeatures', + 'AdminReturnStates' => 'AdminStatuses', + 'AdminStatsTab' => 'AdminStats' + ); + + public function __construct() + { + global $cookie; + + $this->id = Tab::getCurrentTabId(); + $this->_conf = array( + 1 => $this->l('Deletion successful'), 2 => $this->l('Selection successfully deleted'), + 3 => $this->l('Creation successful'), 4 => $this->l('Update successful'), + 5 => $this->l('Status update successful'), 6 => $this->l('Settings update successful'), + 7 => $this->l('Image successfully deleted'), 8 => $this->l('Module downloaded successfully'), + 9 => $this->l('Thumbnails successfully regenerated'), 10 => $this->l('Message sent to the customer'), + 11 => $this->l('Comment added'), 12 => $this->l('Module installed successfully'), + 13 => $this->l('Module uninstalled successfully'), 14 => $this->l('Language successfully copied'), + 15 => $this->l('Translations successfully added'), 16 => $this->l('Module transplanted successfully to hook'), + 17 => $this->l('Module removed successfully from hook'), 18 => $this->l('Upload successful'), + 19 => $this->l('Duplication completed successfully'), 20 => $this->l('Translation added successfully but the language has not been created'), + 21 => $this->l('Module reset successfully'), 22 => $this->l('Module deleted successfully'), + 23 => $this->l('Localization pack imported successfully'), 24 => $this->l('Refund Successful'), + 25 => $this->l('Images successfully moved')); + if (!$this->identifier) $this->identifier = 'id_'.$this->table; + if (!$this->_defaultOrderBy) $this->_defaultOrderBy = $this->identifier; + $className = get_class($this); + if ($className == 'AdminCategories' OR $className == 'AdminProducts') + $className = 'AdminCatalog'; + $this->token = Tools::getAdminToken($className.(int)$this->id.(int)$cookie->id_employee); + + if (!Tools::isMultiShopActivated()) + $this->shopLinkType = ''; + } + + + /** + * use translations files to replace english expression. + * + * @param mixed $string term or expression in english + * @param string $class + * @param boolan $addslashes if set to true, the return value will pass through addslashes(). Otherwise, stripslashes(). + * @param boolean $htmlentities if set to true(default), the return value will pass through htmlentities($string, ENT_QUOTES, 'utf-8') + * @return string the translation if available, or the english default text. + */ + protected function l($string, $class = 'AdminTab', $addslashes = FALSE, $htmlentities = TRUE) + { + // if the class is extended by a module, use modules/[module_name]/xx.php lang file + $currentClass = get_class($this); + if(Module::getModuleNameFromClass($currentClass)) + { + $string = str_replace('\'', '\\\'', $string); + return Module::findTranslation(Module::$classInModule[$currentClass], $string, $currentClass); + } + global $_LANGADM; + + if ($class == __CLASS__) + $class = 'AdminTab'; + + $key = md5(str_replace('\'', '\\\'', $string)); + $str = (key_exists(get_class($this).$key, $_LANGADM)) ? $_LANGADM[get_class($this).$key] : ((key_exists($class.$key, $_LANGADM)) ? $_LANGADM[$class.$key] : $string); + $str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str; + return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str))); + } + + /** + * Manage page display (form, list...) + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function display() + { + global $currentIndex, $cookie; + + // Include other tab in current tab + if ($this->includeSubTab('display', array('submitAdd2', 'add', 'update', 'view'))){} + + // Include current tab + elseif ((Tools::getValue('submitAdd'.$this->table) AND sizeof($this->_errors)) OR isset($_GET['add'.$this->table])) + { + if ($this->tabAccess['add'] === '1') + { + $this->displayForm(); + if ($this->tabAccess['view']) + echo '

'.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'
'; + } + else + echo $this->l('You do not have permission to add here'); + } + elseif (isset($_GET['update'.$this->table])) + { + if ($this->tabAccess['edit'] === '1' OR ($this->table == 'employee' AND $cookie->id_employee == Tools::getValue('id_employee'))) + { + $this->displayForm(); + if ($this->tabAccess['view']) + echo '

'.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'
'; + } + else + echo $this->l('You do not have permission to edit here'); + } + elseif (isset($_GET['view'.$this->table])) + $this->{'view'.$this->table}(); + + else + { + $this->getList((int)$cookie->id_lang); + $this->displayList(); + $this->displayOptionsList(); + $this->displayRequiredFields(); + $this->includeSubTab('display'); + $assos_shop = Shop::getAssoTables(); + if (isset($assos_shop[$this->table]) AND $assos_shop[$this->table]['type'] == 'shop') + $this->displayAssoShop(); + elseif (isset($assos_shop[$this->table]) AND $assos_shop[$this->table]['type'] == 'group_shop') + $this->displayAssoGroupShop(); + } + } + + public function displayRequiredFields() + { + global $currentIndex; + if (!$this->tabAccess['add'] OR !$this->tabAccess['delete'] === '1' OR !$this->requiredDatabase) + return; + $rules = call_user_func_array(array($this->className, 'getValidationRules'), array($this->className)); + $required_class_fields = array($this->identifier); + foreach ($rules['required'] AS $required) + $required_class_fields[] = $required; + + echo '
+

'.$this->l('Set required fields for this section').'

+ '; + } + + public function includeSubTab($methodname, $actions = array()) + { + if (!isset($this->_includeTab) OR !is_array($this->_includeTab)) + return false; + $key = 0; + $inc = false; + foreach ($this->_includeTab as $subtab => $extraVars) + { + /* New tab loading */ + $classname = 'Admin'.$subtab; + if ($module = Db::getInstance()->getValue('SELECT `module` FROM `'._DB_PREFIX_.'tab` WHERE `class_name` = \''.pSQL($classname).'\'') AND file_exists(_PS_MODULE_DIR_.'/'.$module.'/'.$classname.'.php')) + include_once(_PS_MODULE_DIR_.'/'.$module.'/'.$classname.'.php'); + elseif (file_exists(PS_ADMIN_DIR.'/tabs/'.$classname.'.php')) + include_once('tabs/'.$classname.'.php'); + if (!isset($this->_includeObj[$key])) + $this->_includeObj[$key] = new $classname; + $adminTab = $this->_includeObj[$key]; + $adminTab->token = $this->token; + + /* Extra variables addition */ + if (!empty($extraVars) AND is_array($extraVars)) + foreach ($extraVars AS $varKey => $varValue) + $adminTab->$varKey = $varValue; + + /* Actions management */ + foreach ($actions as $action) + { + switch ($action) + { + + case 'submitAdd1': + if (Tools::getValue('submitAdd'.$adminTab->table)) + $ok_inc = true; + break; + case 'submitAdd2': + if (Tools::getValue('submitAdd'.$adminTab->table) AND sizeof($adminTab->_errors)) + $ok_inc = true; + break; + case 'submitDel': + if (Tools::getValue('submitDel'.$adminTab->table)) + $ok_inc = true; + break; + case 'submitFilter': + if (Tools::isSubmit('submitFilter'.$adminTab->table)) + $ok_inc = true; + case 'submitReset': + if (Tools::isSubmit('submitReset'.$adminTab->table)) + $ok_inc = true; + default: + if (isset($_GET[$action.$adminTab->table])) + $ok_inc = true; + } + } + $inc = false; + if ((isset($ok_inc) AND $ok_inc) OR !sizeof($actions)) + { + if (!$adminTab->viewAccess()) + { + echo Tools::displayError('Access denied'); + return false; + } + if (!sizeof($actions)) + if (($methodname == 'displayErrors' AND sizeof($adminTab->_errors)) OR $methodname != 'displayErrors') + echo (isset($this->_includeTabTitle[$key]) ? '

'.$this->_includeTabTitle[$key].'

' : ''); + if ($adminTab->_includeVars) + foreach ($adminTab->_includeVars AS $var => $value) + $adminTab->$var = $this->$value; + $adminTab->$methodname(); + $inc = true; + } + $key++; + } + return $inc; + } + + /** + * Manage page display (form, list...) + * + * @param string $className Allow to validate a different class than the current one + */ + public function validateRules($className = false) + { + if (!$className) + $className = $this->className; + + /* Class specific validation rules */ + $rules = call_user_func(array($className, 'getValidationRules'), $className); + + if ((sizeof($rules['requiredLang']) OR sizeof($rules['sizeLang']) OR sizeof($rules['validateLang']))) + { + /* Language() instance determined by default language */ + $defaultLanguage = new Language((int)(Configuration::get('PS_LANG_DEFAULT'))); + + /* All availables languages */ + $languages = Language::getLanguages(false); + } + + /* Checking for required fields */ + foreach ($rules['required'] AS $field) + if (($value = Tools::getValue($field)) == false AND (string)$value != '0') + if (!Tools::getValue($this->identifier) OR ($field != 'passwd' AND $field != 'no-picture')) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $field, $className).' '.$this->l('is required'); + + /* Checking for multilingual required fields */ + foreach ($rules['requiredLang'] AS $fieldLang) + if (($empty = Tools::getValue($fieldLang.'_'.$defaultLanguage->id)) === false OR empty($empty)) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' '.$this->l('is required at least in').' '.$defaultLanguage->name; + + /* Checking for maximum fields sizes */ + foreach ($rules['size'] AS $field => $maxLength) + if (Tools::getValue($field) !== false AND Tools::strlen(Tools::getValue($field)) > $maxLength) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $field, $className).' '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')'; + + /* Checking for maximum multilingual fields size */ + foreach ($rules['sizeLang'] AS $fieldLang => $maxLength) + foreach ($languages AS $language) + if (Tools::getValue($fieldLang.'_'.$language['id_lang']) !== false AND Tools::strlen(Tools::getValue($fieldLang.'_'.$language['id_lang'])) > $maxLength) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].') '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max, html chars including').')'; + + /* Overload this method for custom checking */ + $this->_childValidation(); + + /* Checking for fields validity */ + foreach ($rules['validate'] AS $field => $function) + if (($value = Tools::getValue($field)) !== false AND ($field != 'passwd')) + if (!Validate::$function($value)) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $field, $className).' '.$this->l('is invalid'); + + /* Checking for passwd_old validity */ + if (($value = Tools::getValue('passwd')) != false) + { + if ($className == 'Employee' AND !Validate::isPasswdAdmin($value)) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), 'passwd', $className).' '.$this->l('is invalid'); + elseif ($className == 'Customer' AND !Validate::isPasswd($value)) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), 'passwd', $className).' '.$this->l('is invalid'); + } + + /* Checking for multilingual fields validity */ + foreach ($rules['validateLang'] AS $fieldLang => $function) + foreach ($languages AS $language) + if (($value = Tools::getValue($fieldLang.'_'.$language['id_lang'])) !== false AND !empty($value)) + if (!Validate::$function($value)) + $this->_errors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].') '.$this->l('is invalid'); + } + + /** + * Overload this method for custom checking + */ + protected function _childValidation() { } + + /** + * Overload this method for custom checking + * + * @param integer $id Object id used for deleting images + * TODO This function will soon be deprecated. Use ObjectModel->deleteImage instead. + */ + public function deleteImage($id) + { + $dir = null; + /* Deleting object images and thumbnails (cache) */ + if (key_exists('dir', $this->fieldImageSettings)) + { + $dir = $this->fieldImageSettings['dir'].'/'; + if (file_exists(_PS_IMG_DIR_.$dir.$id.'.'.$this->imageType) AND !unlink(_PS_IMG_DIR_.$dir.$id.'.'.$this->imageType)) + return false; + } + if (file_exists(_PS_TMP_IMG_DIR_.$this->table.'_'.$id.'.'.$this->imageType) AND !unlink(_PS_TMP_IMG_DIR_.$this->table.'_'.$id.'.'.$this->imageType)) + return false; + if (file_exists(_PS_TMP_IMG_DIR_.$this->table.'_mini_'.$id.'.'.$this->imageType) AND !unlink(_PS_TMP_IMG_DIR_.$this->table.'_mini_'.$id.'.'.$this->imageType)) + return false; + $types = ImageType::getImagesTypes(); + foreach ($types AS $imageType) + if (file_exists(_PS_IMG_DIR_.$dir.$id.'-'.stripslashes($imageType['name']).'.'.$this->imageType) AND !unlink(_PS_IMG_DIR_.$dir.$id.'-'.stripslashes($imageType['name']).'.'.$this->imageType)) + return false; + return true; + } + + /** + * Manage page processing + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function postProcess() + { + global $currentIndex, $cookie; + if (!isset($this->table)) + return false; + // set token + $token = Tools::getValue('token') ? Tools::getValue('token') : $this->token; + + // Sub included tab postProcessing + $this->includeSubTab('postProcess', array('status', 'submitAdd1', 'submitDel', 'delete', 'submitFilter', 'submitReset')); + + /* Delete object image */ + if (isset($_GET['deleteImage'])) + { + if (Validate::isLoadedObject($object = $this->loadObject())) + if (($object->deleteImage())) + Tools::redirectAdmin($currentIndex.'&add'.$this->table.'&'.$this->identifier.'='.Tools::getValue($this->identifier).'&conf=7&token='.$token); + $this->_errors[] = Tools::displayError('An error occurred during image deletion (cannot load object).'); + } + + /* Delete object */ + elseif (isset($_GET['delete'.$this->table])) + { + if ($this->tabAccess['delete'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings)) + { + // check if request at least one object with noZeroObject + if (isset($object->noZeroObject) AND sizeof(call_user_func(array($this->className, $object->noZeroObject))) <= 1) + $this->_errors[] = Tools::displayError('You need at least one object.').' '.$this->table.'
'.Tools::displayError('You cannot delete all of the items.'); + else + { + if ($this->deleted) + { + $object->deleteImage(); + $object->deleted = 1; + if ($object->update()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.$token); + } + elseif ($object->delete()) + Tools::redirectAdmin($currentIndex.'&conf=1&token='.$token); + $this->_errors[] = Tools::displayError('An error occurred during deletion.'); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while deleting object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + + /* Change object statuts (active, inactive) */ + elseif ((isset($_GET['status'.$this->table]) OR isset($_GET['status'])) AND Tools::getValue($this->identifier)) + { + if ($this->tabAccess['edit'] === '1') + { + if (Validate::isLoadedObject($object = $this->loadObject())) + { + if ($object->toggleStatus()) + Tools::redirectAdmin($currentIndex.'&conf=5'.((($id_category = (int)(Tools::getValue('id_category'))) AND Tools::getValue('id_product')) ? '&id_category='.$id_category : '').'&token='.$token); + else + $this->_errors[] = Tools::displayError('An error occurred while updating status.'); + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + /* Move an object */ + elseif (isset($_GET['position'])) + { + if ($this->tabAccess['edit'] !== '1') + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + elseif (!Validate::isLoadedObject($object = $this->loadObject())) + $this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + elseif (!$object->updatePosition((int)(Tools::getValue('way')), (int)(Tools::getValue('position')))) + $this->_errors[] = Tools::displayError('Failed to update the position.'); + else + Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=5'.(($id_category = (int)(Tools::getValue($this->identifier))) ? ('&'.$this->identifier.'='.$id_category) : '').'&token='.$token); + Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=5'.((($id_category = (int)(Tools::getValue('id_category'))) AND Tools::getValue('id_product')) ? '&id_category='.$id_category : '').'&token='.$token); + } + /* Delete multiple objects */ + elseif (Tools::getValue('submitDel'.$this->table)) + { + if ($this->tabAccess['delete'] === '1') + { + if (isset($_POST[$this->table.'Box'])) + { + $object = new $this->className(); + if (isset($object->noZeroObject) AND + // Check if all object will be deleted + (sizeof(call_user_func(array($this->className, $object->noZeroObject))) <= 1 OR sizeof($_POST[$this->table.'Box']) == sizeof(call_user_func(array($this->className, $object->noZeroObject))))) + $this->_errors[] = Tools::displayError('You need at least one object.').' '.$this->table.'
'.Tools::displayError('You cannot delete all of the items.'); + else + { + $result = true; + if ($this->deleted) + { + foreach(Tools::getValue($this->table.'Box') as $id) + { + $toDelete = new $this->className($id); + $toDelete->deleted = 1; + $result = $result AND $toDelete->update(); + } + } + else + $result = $object->deleteSelection(Tools::getValue($this->table.'Box')); + + if ($result) + Tools::redirectAdmin($currentIndex.'&conf=2&token='.$token); + $this->_errors[] = Tools::displayError('An error occurred while deleting selection.'); + } + } + else + $this->_errors[] = Tools::displayError('You must select at least one element to delete.'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + + /* Create or update an object */ + elseif (Tools::getValue('submitAdd'.$this->table)) + { + /* Checking fields validity */ + $this->validateRules(); + if (!sizeof($this->_errors)) + { + $id = (int)(Tools::getValue($this->identifier)); + + /* Object update */ + if (isset($id) AND !empty($id)) + { + if ($this->tabAccess['edit'] === '1' OR ($this->table == 'employee' AND $cookie->id_employee == Tools::getValue('id_employee') AND Tools::isSubmit('updateemployee'))) + { + $object = new $this->className($id); + if (Validate::isLoadedObject($object)) + { + /* Specific to objects which must not be deleted */ + if ($this->deleted AND $this->beforeDelete($object)) + { + // Create new one with old objet values + $objectNew = new $this->className($object->id); + $objectNew->id = NULL; + $objectNew->date_add = ''; + $objectNew->date_upd = ''; + + // Update old object to deleted + $object->deleted = 1; + $object->update(); + + // Update new object with post values + $this->copyFromPost($objectNew, $this->table); + $result = $objectNew->add(); + if (Validate::isLoadedObject($objectNew)) + $this->afterDelete($objectNew, $object->id); + } + else + { + $this->copyFromPost($object, $this->table); + $result = $object->update(); + $this->afterUpdate($object); + } + if ($object->id) + { + $this->updateAssoShop((int)$object->id); + $this->updateAssoGroupShop((int)$object->id); + } + if (!$result) + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.' ('.Db::getInstance()->getMsgError().')'; + elseif ($this->postImage($object->id) AND !sizeof($this->_errors)) + { + $parent_id = (int)(Tools::getValue('id_parent', 1)); + // Specific back redirect + if ($back = Tools::getValue('back')) + Tools::redirectAdmin(urldecode($back).'&conf=4'); + // Specific scene feature + if (Tools::getValue('stay_here') == 'on' || Tools::getValue('stay_here') == 'true' || Tools::getValue('stay_here') == '1') + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=4&updatescene&token='.$token); + // Save and stay on same form + if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=4&update'.$this->table.'&token='.$token); + // Save and back to parent + if (Tools::isSubmit('submitAdd'.$this->table.'AndBackToParent')) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$parent_id.'&conf=4&token='.$token); + // Default behavior (save and back) + Tools::redirectAdmin($currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=4&token='.$token); + } + } + else + $this->_errors[] = Tools::displayError('An error occurred while updating object.').' '.$this->table.' '.Tools::displayError('(cannot load object)'); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + + /* Object creation */ + else + { + if ($this->tabAccess['add'] === '1') + { + $object = new $this->className(); + $this->copyFromPost($object, $this->table); + if (!$object->add()) + $this->_errors[] = Tools::displayError('An error occurred while creating object.').' '.$this->table.' ('.mysql_error().')'; + elseif (($_POST[$this->identifier] = $object->id /* voluntary */) AND $this->postImage($object->id) AND !sizeof($this->_errors) AND $this->_redirect) + { + $parent_id = (int)(Tools::getValue('id_parent', 1)); + $this->afterAdd($object); + // Save and stay on same form + if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=3&update'.$this->table.'&token='.$token); + // Save and back to parent + if (Tools::isSubmit('submitAdd'.$this->table.'AndBackToParent')) + Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$parent_id.'&conf=3&token='.$token); + // Default behavior (save and back) + Tools::redirectAdmin($currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=3&token='.$token); + } + } + else + $this->_errors[] = Tools::displayError('You do not have permission to add here.'); + } + } + $this->_errors = array_unique($this->_errors); + } + + /* Cancel all filters for this tab */ + elseif (isset($_POST['submitReset'.$this->table])) + { + $filters = $cookie->getFamily($this->table.'Filter_'); + foreach ($filters AS $cookieKey => $filter) + if (strncmp($cookieKey, $this->table.'Filter_', 7 + Tools::strlen($this->table)) == 0) + { + $key = substr($cookieKey, 7 + Tools::strlen($this->table)); + /* Table alias could be specified using a ! eg. alias!field */ + $tmpTab = explode('!', $key); + $key = (count($tmpTab) > 1 ? $tmpTab[1] : $tmpTab[0]); + if (array_key_exists($key, $this->fieldsDisplay)) + unset($cookie->$cookieKey); + } + if (isset($cookie->{'submitFilter'.$this->table})) + unset($cookie->{'submitFilter'.$this->table}); + if (isset($cookie->{$this->table.'Orderby'})) + unset($cookie->{$this->table.'Orderby'}); + if (isset($cookie->{$this->table.'Orderway'})) + unset($cookie->{$this->table.'Orderway'}); + unset($_POST); + } + + /* Submit options list */ + elseif (Tools::getValue('submitOptions'.$this->table)) + { + $this->updateOptions($token); + } + + /* Manage list filtering */ + elseif (Tools::isSubmit('submitFilter'.$this->table) OR $cookie->{'submitFilter'.$this->table} !== false) + { + $_POST = array_merge($cookie->getFamily($this->table.'Filter_'), (isset($_POST) ? $_POST : array())); + foreach ($_POST AS $key => $value) + { + /* Extracting filters from $_POST on key filter_ */ + if ($value != NULL AND !strncmp($key, $this->table.'Filter_', 7 + Tools::strlen($this->table))) + { + $key = Tools::substr($key, 7 + Tools::strlen($this->table)); + /* Table alias could be specified using a ! eg. alias!field */ + $tmpTab = explode('!', $key); + $filter = count($tmpTab) > 1 ? $tmpTab[1] : $tmpTab[0]; + if ($field = $this->filterToField($key, $filter)) + { + $type = (array_key_exists('filter_type', $field) ? $field['filter_type'] : (array_key_exists('type', $field) ? $field['type'] : false)); + if (($type == 'date' OR $type == 'datetime') AND is_string($value)) + $value = unserialize($value); + $key = isset($tmpTab[1]) ? $tmpTab[0].'.`'.$tmpTab[1].'`' : '`'.$tmpTab[0].'`'; + if (array_key_exists('tmpTableFilter', $field)) + $sqlFilter = & $this->_tmpTableFilter; + elseif (array_key_exists('havingFilter', $field)) + $sqlFilter = & $this->_filterHaving; + else + $sqlFilter = & $this->_filter; + + /* Only for date filtering (from, to) */ + if (is_array($value)) + { + if (isset($value[0]) AND !empty($value[0])) + { + if (!Validate::isDate($value[0])) + $this->_errors[] = Tools::displayError('\'from:\' date format is invalid (YYYY-MM-DD)'); + else + $sqlFilter .= ' AND '.pSQL($key).' >= \''.pSQL(Tools::dateFrom($value[0])).'\''; + } + + if (isset($value[1]) AND !empty($value[1])) + { + if (!Validate::isDate($value[1])) + $this->_errors[] = Tools::displayError('\'to:\' date format is invalid (YYYY-MM-DD)'); + else + $sqlFilter .= ' AND '.pSQL($key).' <= \''.pSQL(Tools::dateTo($value[1])).'\''; + } + } + else + { + $sqlFilter .= ' AND '; + if ($type == 'int' OR $type == 'bool') + $sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`' OR $key == '`active`') ? 'a.' : '').pSQL($key).' = '.(int)($value).' '; + elseif ($type == 'decimal') + $sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`') ? 'a.' : '').pSQL($key).' = '.(float)($value).' '; + elseif ($type == 'select') + $sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`') ? 'a.' : '').pSQL($key).' = \''.pSQL($value).'\' '; + else + $sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`') ? 'a.' : '').pSQL($key).' LIKE \'%'.pSQL($value).'%\' '; + } + } + } + } + } + elseif(Tools::isSubmit('submitFields') AND $this->requiredDatabase AND $this->tabAccess['add'] === '1' AND $this->tabAccess['delete'] === '1') + { + if (!is_array($fields = Tools::getValue('fieldsBox'))) + $fields = array(); + + $object = new $this->className(); + if (!$object->addFieldsRequiredDatabase($fields)) + $this->_errors[] = Tools::displayError('Error in updating required fields'); + else + Tools::redirectAdmin($currentIndex.'&conf=4&token='.$token); + } + elseif (Tools::isSubmit('submitAssoShop') AND $this->tabAccess['add'] === '1' AND Tools::getValue('assoShopClass') == $this->className) + { + $this->updateAssoShop(); + Tools::redirectAdmin($currentIndex.'&conf=4&token='.$token); + } + + elseif (Tools::isSubmit('submitAssoGroupShop') AND $this->tabAccess['add'] === '1' AND Tools::getValue('assoGroupShopClass') == $this->className) + { + $this->updateAssoGroupShop(); + Tools::redirectAdmin($currentIndex.'&conf=4&token='.$token); + } + } + + protected function updateAssoGroupShop() + { + $assos = array(); + foreach ($_POST AS $k => $row) + { + if (!preg_match('/^checkBoxGroupShopAsso_'.$this->table.'_([0-9]+)_([0-9]+)$/Ui', $k, $res)) + continue; + $assos[] = array('id_object' => $res[1], 'id_group_shop' => (int)$res[2]); + } + if (!sizeof($assos)) + return; + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.$this->table.'_group_shop'.($id_object ? ' WHERE id_object='.(int)$id_object : '')); + foreach ($assos AS $asso) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.$this->table.'_group_shop(`'.pSQL($this->identifier).'`, id_group_shop) + VALUES('.(int)$asso['id_object'].', '.(int)$asso['id_group_shop'].')'); + } + + protected function updateAssoShop($id_object = false) + { + $assos = array(); + + foreach ($_POST AS $k => $row) + { + if (!preg_match('/^checkBoxShopAsso_'.$this->table.'_([0-9]+)_([0-9]+)$/Ui', $k, $res)) + continue; + $assos[] = array('id_object' => $res[1], 'id_shop' => (int)$res[2]); + } + if (!sizeof($assos)) + return; + + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.$this->table.'_shop'.($id_object ? ' WHERE `'.$this->identifier.'`='.(int)$id_object : '')); + foreach ($assos AS $asso) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.$this->table.'_shop(`'.pSQL($this->identifier).'`, id_shop) + VALUES('.(int)$asso['id_object'].', '.(int)$asso['id_shop'].')'); + } + + protected function updateOptions($token) + { + global $currentIndex, $cookie; + + if ($this->tabAccess['edit'] === '1') + { + $this->submitConfiguration($this->_fieldsOptions); + if (count($this->_errors) <= 0) + Tools::redirectAdmin($currentIndex.'&conf=6&token='.$token); + } + else + $this->_errors[] = Tools::displayError('You do not have permission to edit here.'); + } + + protected function validateField($value, $field) + { + if (isset($field['validation'])) + { + $validate = new Validate(); + if (method_exists($validate, $field['validation'])) + { + if (!Validate::$field['validation']($value)) + { + $this->_errors[] = Tools::displayError($field['title'].' : Incorrect value'); + return false; + } + } + } + + return true; + } + + protected function uploadImage($id, $name, $dir, $ext = false) + { + if (isset($_FILES[$name]['tmp_name']) AND !empty($_FILES[$name]['tmp_name'])) + { + // Delete old image + if (Validate::isLoadedObject($object = $this->loadObject())) + $object->deleteImage(); + else + return false; + + // Check image validity + if ($error = checkImage($_FILES[$name], $this->maxImageSize)) + $this->_errors[] = $error; + elseif (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($_FILES[$name]['tmp_name'], $tmpName)) + return false; + else + { + $_FILES[$name]['tmp_name'] = $tmpName; + // Copy new image + if (!imageResize($tmpName, _PS_IMG_DIR_.$dir.$id.'.'.$this->imageType, NULL, NULL, ($ext ? $ext : $this->imageType))) + $this->_errors[] = Tools::displayError('An error occurred while uploading image.'); + if (sizeof($this->_errors)) + return false; + if ($this->afterImageUpload()) + { + unlink($tmpName); + return true; + } + return false; + } + } + return true; + } + + + + protected function uploadIco($name, $dest) + { + + if (isset($_FILES[$name]['tmp_name']) AND !empty($_FILES[$name]['tmp_name'])) + { + /* Check ico validity */ + if ($error = checkIco($_FILES[$name], $this->maxImageSize)) + $this->_errors[] = $error; + + /* Copy new ico */ + elseif(!copy($_FILES[$name]['tmp_name'], $dest)) + $this->_errors[] = Tools::displayError('an error occurred while uploading favicon: '.$_FILES[$name]['tmp_name'].' to '.$dest); + } + return !sizeof($this->_errors) ? true : false; + } + + /** + * Overload this method for custom checking + * + * @param integer $id Object id used for deleting images + * @return boolean + */ + protected function postImage($id) + { + if (isset($this->fieldImageSettings['name']) AND isset($this->fieldImageSettings['dir'])) + return $this->uploadImage($id, $this->fieldImageSettings['name'], $this->fieldImageSettings['dir'].'/'); + elseif (!empty($this->fieldImageSettings)) + foreach ($this->fieldImageSettings AS $image) + if (isset($image['name']) AND isset($image['dir'])) + $this->uploadImage($id, $image['name'], $image['dir'].'/'); + return !sizeof($this->_errors) ? true : false; + } + + /** + * Copy datas from $_POST to object + * + * @param object &$object Object + * @param string $table Object table + */ + protected function copyFromPost(&$object, $table) + { + /* Classical fields */ + foreach ($_POST AS $key => $value) + if (key_exists($key, $object) AND $key != 'id_'.$table) + { + /* Do not take care of password field if empty */ + if ($key == 'passwd' AND Tools::getValue('id_'.$table) AND empty($value)) + continue; + /* Automatically encrypt password in MD5 */ + if ($key == 'passwd' AND !empty($value)) + $value = Tools::encrypt($value); + $object->{$key} = $value; + } + + /* Multilingual fields */ + $rules = call_user_func(array(get_class($object), 'getValidationRules'), get_class($object)); + if (sizeof($rules['validateLang'])) + { + $languages = Language::getLanguages(false); + foreach ($languages AS $language) + foreach ($rules['validateLang'] AS $field => $validation) + if (isset($_POST[$field.'_'.(int)($language['id_lang'])])) + $object->{$field}[(int)($language['id_lang'])] = $_POST[$field.'_'.(int)($language['id_lang'])]; + } + } + + /** + * Display errors + */ + public function displayErrors() + { + if ($nbErrors = count($this->_errors) AND $this->_includeContainer) + { + echo ' +
X'; + if (count($this->_errors) == 1) + echo $this->_errors[0]; + else + { + echo $nbErrors.' '.$this->l('errors').'
    '; + foreach ($this->_errors AS $error) + echo '
  1. '.$error.'
  2. '; + echo '
'; + } + echo '
'; + } + $this->includeSubTab('displayErrors'); + } + + /** + * Display a warning message + * + * @param string $warn Warning message to display + */ + public function displayWarning($warn) + { + $str_output = ''; + if (!empty($warn)) + { + $str_output .= ' +
'; + if (!is_array($warn)) + $str_output .= ''.$warn; + else + { $str_output .= 'X'. + (count($warn) > 1 ? $this->l('There are') : $this->l('There is')).' '.count($warn).' '.(count($warn) > 1 ? $this->l('warnings') : $this->l('warning')) + .' + '.$this->l('Click here to see more').' + '; + } + $str_output .= '
'; + } + echo $str_output; + } + + /** + * Display confirmations + */ + public function displayConf() + { + if ($conf = Tools::getValue('conf')) + echo '
+ + '.$this->_conf[(int)($conf)].' +
'; + } + + /** + * Get the current objects' list form the database + * + * @param integer $id_lang Language used for display + * @param string $orderBy ORDER BY clause + * @param string $_orderWay Order way (ASC, DESC) + * @param integer $start Offset in LIMIT clause + * @param integer $limit Row count in LIMIT clause + */ + public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL, $id_lang_shop = false) + { + global $cookie; + + /* Manage default params values */ + if (empty($limit)) + $limit = ((!isset($cookie->{$this->table.'_pagination'})) ? $this->_pagination[1] : $limit = $cookie->{$this->table.'_pagination'}); + + if (!Validate::isTableOrIdentifier($this->table)) + die (Tools::displayError('Table name is invalid:').' "'.$this->table.'"'); + + if (empty($orderBy)) + $orderBy = $cookie->__get($this->table.'Orderby') ? $cookie->__get($this->table.'Orderby') : $this->_defaultOrderBy; + if (empty($orderWay)) + $orderWay = $cookie->__get($this->table.'Orderway') ? $cookie->__get($this->table.'Orderway') : 'ASC'; + + $limit = (int)(Tools::getValue('pagination', $limit)); + $cookie->{$this->table.'_pagination'} = $limit; + + /* Check params validity */ + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay) + OR !is_numeric($start) OR !is_numeric($limit) + OR !Validate::isUnsignedId($id_lang)) + die(Tools::displayError('get list params is not valid')); + + /* Determine offset from current page */ + if ((isset($_POST['submitFilter'.$this->table]) OR + isset($_POST['submitFilter'.$this->table.'_x']) OR + isset($_POST['submitFilter'.$this->table.'_y'])) AND + !empty($_POST['submitFilter'.$this->table]) AND + is_numeric($_POST['submitFilter'.$this->table])) + $start = (int)($_POST['submitFilter'.$this->table] - 1) * $limit; + + /* Cache */ + $this->_lang = (int)($id_lang); + $this->_orderBy = $orderBy; + $this->_orderWay = Tools::strtoupper($orderWay); + + /* SQL table : orders, but class name is Order */ + $sqlTable = $this->table == 'order' ? 'orders' : $this->table; + + // Add SQL shop restriction + $selectShop = $joinShop = $whereShop = ''; + if ($this->shopLinkType) + { + $selectShop = ', shop.name as shop_name '; + $joinShop = ' LEFT JOIN '._DB_PREFIX_.$this->shopLinkType.' shop + ON a.id_'.$this->shopLinkType.' = shop.id_'.$this->shopLinkType; + $whereShop = Shop::sqlRestriction($this->shopShareDatas, 'a', null, null, $this->shopLinkType); + } + $filterShop = ''; + if (($context_type = Shop::getContextType()) != Shop::CONTEXT_ALL) + { + if ($context_type == Shop::CONTEXT_SHOP) + { + $assos = Shop::getAssoTables(); + if (isset($assos[$this->table]) AND $assos[$this->table]['type'] == 'shop') + $filterKey = $assos[$this->table]['type']; + $idenfierShop = Shop::getCurrentShop(); + } + elseif ($context_type == Shop::CONTEXT_GROUP) + { + $assos = GroupShop::getAssoTables(); + if (isset($assos[$this->table]) AND $assos[$this->table]['type'] == 'group_shop') + $filterKey = $assos[$this->table]['type']; + $idenfierShop = Shop::getCurrentGroupShop(); + } + if (isset($filterKey)) + $filterShop = 'JOIN `'._DB_PREFIX_.$this->table.'_'.$filterKey.'` sa ON (sa.'.$this->identifier.' = a.'.$this->identifier.' AND sa.id_'.$filterKey.'='.(int)$idenfierShop.')'; + } + + /* Query in order to get results with all fields */ + $sql = 'SELECT SQL_CALC_FOUND_ROWS + '.($this->_tmpTableFilter ? ' * FROM (SELECT ' : '').' + '.($this->lang ? 'b.*, ' : '').'a.*'.(isset($this->_select) ? ', '.$this->_select.' ' : '').$selectShop.' + FROM `'._DB_PREFIX_.$sqlTable.'` a + '.$filterShop.' + '.($this->lang ? 'LEFT JOIN `'._DB_PREFIX_.$this->table.'_lang` b ON (b.`'.$this->identifier.'` = a.`'.$this->identifier.'` AND b.`id_lang` = '.(int)($id_lang).($id_lang_shop ? ' AND b.`id_shop`='.(int)$id_lang_shop : '').')' : '').' + '.(isset($this->_join) ? $this->_join.' ' : '').' + '.$joinShop.' + WHERE 1 '.(isset($this->_where) ? $this->_where.' ' : '').($this->deleted ? 'AND a.`deleted` = 0 ' : '').(isset($this->_filter) ? $this->_filter : '').$whereShop.' + '.(isset($this->_group) ? $this->_group.' ' : '').' + '.((isset($this->_filterHaving) || isset($this->_having)) ? 'HAVING ' : '').(isset($this->_filterHaving) ? ltrim($this->_filterHaving, ' AND ') : '').(isset($this->_having) ? $this->_having.' ' : '').' + ORDER BY '.(($orderBy == $this->identifier) ? 'a.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay). + ($this->_tmpTableFilter ? ') tmpTable WHERE 1'.$this->_tmpTableFilter : '').' + LIMIT '.(int)($start).','.(int)($limit); + //p($sql); + $this->_list = Db::getInstance()->ExecuteS($sql); + $this->_listTotal = Db::getInstance()->getValue('SELECT FOUND_ROWS() AS `'._DB_PREFIX_.$this->table.'`'); + + } + + /** + * Display image aside object form + * + * @param integer $id Object id + * @param string $image Local image filepath + * @param integer $size Image width + * @param integer $id_image Image id (for products with several images) + * @param string $token Employee token used in the image deletion link + * @param boolean $disableCache When turned on a timestamp will be added to the image URI to disable the HTTP cache + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayImage($id, $image, $size, $id_image = NULL, $token = NULL, $disableCache = false) + { + global $currentIndex; + + if (!isset($token) OR empty($token)) + $token = $this->token; + if ($id AND file_exists($image)) + echo ' +
+ '.cacheImage($image, $this->table.'_'.(int)($id).'.'.$this->imageType, $size, $this->imageType, $disableCache).' +

'.$this->l('File size').' '.(filesize($image) / 1000).'kb

+ + '.$this->l('Delete').' '.$this->l('Delete').' +
'; + } + + /** + * Display list header (filtering, pagination and column names) + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayListHeader($token = NULL) + { + global $currentIndex, $cookie; + $isCms = false; + if (preg_match('/cms/Ui', $this->identifier)) + $isCms = true; + $id_cat = Tools::getValue('id_'.($isCms ? 'cms_' : '').'category'); + + if (!isset($token) OR empty($token)) + $token = $this->token; + + /* Determine total page number */ + $totalPages = ceil($this->_listTotal / Tools::getValue('pagination', (isset($cookie->{$this->table.'_pagination'}) ? $cookie->{$this->table.'_pagination'} : $this->_pagination[0]))); + if (!$totalPages) $totalPages = 1; + + echo ' '; + echo ' + + + + + + + + + '; + foreach ($this->fieldsDisplay AS $key => $params) + { + echo ' '; + } + + if ($this->shopLinkType) + { + echo ''; + } + + /* Check if object can be modified, deleted or detailed */ + if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) + echo ' '; + echo ' + + '; + + /* Javascript hack in order to catch ENTER keypress event */ + $keyPress = 'onkeypress="formSubmit(event, \'submitFilterButton_'.$this->table.'\');"'; + + /* Filters (input, select, date or bool) */ + foreach ($this->fieldsDisplay AS $key => $params) + { + $width = (isset($params['width']) ? ' style="width: '.(int)($params['width']).'px;"' : ''); + echo ''; + if (!isset($params['type'])) + $params['type'] = 'text'; + + $value = Tools::getValue($this->table.'Filter_'.(array_key_exists('filter_key', $params) ? $params['filter_key'] : $key)); + if (isset($params['search']) AND !$params['search']) + { + echo '--'; + continue; + } + switch ($params['type']) + { + case 'bool': + echo ' + '; + break; + + case 'date': + case 'datetime': + if (is_string($value)) + $value = unserialize($value); + if (!Validate::isCleanHtml($value[0]) OR !Validate::isCleanHtml($value[1])) + $value = ''; + $name = $this->table.'Filter_'.(isset($params['filter_key']) ? $params['filter_key'] : $key); + $nameId = str_replace('!', '__', $name); + includeDatepicker(array($nameId.'_0', $nameId.'_1')); + echo $this->l('From').'
+ '.$this->l('To').' '; + break; + + case 'select': + + if (isset($params['filter_key'])) + { + echo ''; + break; + } + + case 'text': + default: + if (!Validate::isCleanHtml($value)) + $value = ''; + echo ''; + } + echo ''; + } + + if ($this->shopLinkType) + { + echo '
'; + } + + if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) + echo ''; + + echo ' + '; + } + + public function displayTop() + { + } + + /** + * Display list + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayList() + { + global $currentIndex; + + $this->displayTop(); + + if ($this->edit AND (!isset($this->noAdd) OR !$this->noAdd)) + echo '
'.$this->l('Add new').'

'; + /* Append when we get a syntax error in SQL query */ + if ($this->_list === false) + { + $this->displayWarning($this->l('Bad SQL query')); + return false; + } + + /* Display list header (filtering, pagination and column names) */ + $this->displayListHeader(); + if (!sizeof($this->_list)) + echo ''; + + /* Show the content of the table */ + $this->displayListContent(); + + /* Close list table and submit button */ + $this->displayListFooter(); + } + + public function displayListContent($token = NULL) + { + /* Display results in a table + * + * align : determine value alignment + * prefix : displayed before value + * suffix : displayed after value + * image : object image + * icon : icon determined by values + * active : allow to toggle status + */ + + global $currentIndex, $cookie; + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + + $id_category = 1; // default categ + + $irow = 0; + if ($this->_list AND isset($this->fieldsDisplay['position'])) + { + $positions = array_map(create_function('$elem', 'return (int)($elem[\'position\']);'), $this->_list); + sort($positions); + } + if ($this->_list) + { + $isCms = false; + if (preg_match('/cms/Ui', $this->identifier)) + $isCms = true; + $keyToGet = 'id_'.($isCms ? 'cms_' : '').'category'.(in_array($this->identifier, array('id_category', 'id_cms_category')) ? '_parent' : ''); + foreach ($this->_list AS $i => $tr) + { + $id = $tr[$this->identifier]; + echo 'identifier,$this->identifiersDnd) ? ' id="tr_'.(($id_category = (int)(Tools::getValue('id_'.($isCms ? 'cms_' : '').'category', '1'))) ? $id_category : '').'_'.$id.'_'.$tr['position'].'"' : '').($irow++ % 2 ? ' class="alt_row"' : '').' '.((isset($tr['color']) AND $this->colorOnBackground) ? 'style="background-color: '.$tr['color'].'"' : '').'> + '; + foreach ($this->fieldsDisplay AS $key => $params) + { + $tmp = explode('!', $key); + $key = isset($tmp[1]) ? $tmp[1] : $tmp[0]; + echo ' + '; + } + + if ($this->shopLinkType) + { + $name = (Tools::strlen($tr['shop_name']) > 15) ? Tools::substr($tr['shop_name'], 0, 15).'...' : $tr['shop_name']; + echo ''; + } + + if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn')) + { + echo ''; + } + echo ''; + } + } + } + + + protected function _displayEnableLink($token, $id, $value, $active, $id_category = NULL, $id_product = NULL) + { + global $currentIndex; + + echo ' + '.($value ? $this->l('Enabled') : $this->l('Disabled')).''; + } + + protected function _displayDuplicate($token = NULL, $id) + { + global $currentIndex; + + $_cacheLang['Duplicate'] = $this->l('Duplicate'); + $_cacheLang['Copy images too?'] = $this->l('Copy images too?', __CLASS__, TRUE, FALSE); + + $duplicate = $currentIndex.'&'.$this->identifier.'='.$id.'&duplicate'.$this->table; + + echo ' + + '.$_cacheLang['Duplicate'].''; + } + + protected function _displayViewLink($token = NULL, $id) + { + global $currentIndex; + + $_cacheLang['View'] = $this->l('View'); + + echo ' + + '.$_cacheLang['View'].''; + } + + protected function _displayEditLink($token = NULL, $id) + { + global $currentIndex; + + $_cacheLang['Edit'] = $this->l('Edit'); + + echo ' + + '; + } + + protected function _displayDeleteLink($token = NULL, $id) + { + global $currentIndex; + + $_cacheLang['Delete'] = $this->l('Delete'); + $_cacheLang['DeleteItem'] = $this->l('Delete item #', __CLASS__, TRUE, FALSE); + + echo ' + + '.$_cacheLang['Delete'].''; + } + + /** + * Close list table and submit button + */ + public function displayListFooter($token = NULL) + { + echo '
+ '; + + /* Determine current page number */ + $page = (int)(Tools::getValue('submitFilter'.$this->table)); + if (!$page) $page = 1; + if ($page > 1) + echo ' + +   '; + echo $this->l('Page').' '.$page.' / '.$totalPages; + if ($page < $totalPages) + echo ' + +  '; + echo ' | '.$this->l('Display').' + + / '.(int)($this->_listTotal).' '.$this->l('result(s)').' + + + + + + +
'; + + /* Display column names and arrows for ordering (ASC, DESC) */ + if (array_key_exists($this->identifier,$this->identifiersDnd) AND $this->_orderBy == 'position') + { + echo ' + + + + '; + } + echo 'identifier,$this->identifiersDnd) ? ' id="'.(($id_category = (int)(Tools::getValue($this->identifiersDnd[$this->identifier], 1))) ? substr($this->identifier,3,strlen($this->identifier)) : '').'"' : '' ).' class="table'.((array_key_exists($this->identifier,$this->identifiersDnd) AND ($this->_orderBy != 'position 'AND $this->_orderWay != 'DESC')) ? ' tableDnD' : '' ).'" cellpadding="0" cellspacing="0"> +
'; + if ($this->delete) + echo ' '; + echo ' '.$params['title']; + if (!isset($params['orderby']) OR $params['orderby']) + { + // Cleaning links + if (Tools::getValue($this->table.'Orderby') && Tools::getValue($this->table.'Orderway')) + $currentIndex = preg_replace('/&'.$this->table.'Orderby=([a-z _]*)&'.$this->table.'Orderway=([a-z]*)/i', '', $currentIndex); + echo '
+ + '; + } + echo '
'.$this->l(($this->shopLinkType == 'shop') ? 'Shop' : 'Group shop').''.$this->l('Actions').'
'; + if ($this->delete) + echo ' --'; + echo ' ----
'.$this->l('No items found').'
'; + if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) + echo ''; + echo 'noLink) OR !$this->noLink)) + echo ' onclick="document.location = \''.$currentIndex.'&'.$this->identifier.'='.$id.($this->view? '&view' : '&update').$this->table.'&token='.($token!=NULL ? $token : $this->token).'\'">'.(isset($params['prefix']) ? $params['prefix'] : ''); + else + echo '>'; + if (isset($params['active']) AND isset($tr[$key])) + $this->_displayEnableLink($token, $id, $tr[$key], $params['active'], Tools::getValue('id_category'), Tools::getValue('id_product')); + elseif (isset($params['activeVisu']) AND isset($tr[$key])) + echo ''.($tr[$key] ? $this->l('Enabled') : $this->l('Disabled')).''; + elseif (isset($params['position'])) + { + if ($this->_orderBy == 'position' AND $this->_orderWay != 'DESC') + { + echo ' + '.$this->l('Down').''; + + echo ' + '.$this->l('Up').''; } + else + echo (int)($tr[$key] + 1); + } + elseif (isset($params['image'])) + { + // item_id is the product id in a product image context, else it is the image id. + $item_id = isset($params['image_id']) ? $tr[$params['image_id']] : $id; + // If it's a product image + if (isset($tr['id_image'])) + { + $image = new Image((int)$tr['id_image']); + $path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$image->getExistingImgPath().'.'.$this->imageType; + }else + $path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$item_id.(isset($tr['id_image']) ? '-'.(int)($tr['id_image']) : '').'.'.$this->imageType; + + echo cacheImage($path_to_image, $this->table.'_mini_'.$item_id.'.'.$this->imageType, 45, $this->imageType); + } + elseif (isset($params['icon']) AND (isset($params['icon'][$tr[$key]]) OR isset($params['icon']['default']))) + echo ''.$tr[$key]).''; + elseif (isset($params['price'])) + echo Tools::displayPrice($tr[$key], (isset($params['currency']) ? Currency::getCurrencyInstance((int)($tr['id_currency'])) : $currency), false); + elseif (isset($params['float'])) + echo rtrim(rtrim($tr[$key], '0'), '.'); + elseif (isset($params['type']) AND $params['type'] == 'date') + echo Tools::displayDate($tr[$key], $cookie->id_lang); + elseif (isset($params['type']) AND $params['type'] == 'datetime') + echo Tools::displayDate($tr[$key], $cookie->id_lang, true); + elseif (isset($tr[$key])) + { + if ($key == 'price') + $echo = round($tr[$key], 2); + else if (isset($params['maxlength']) && Tools::strlen($tr[$key]) > $params['maxlength']) + $echo = ''.Tools::substr($tr[$key], 0, $params['maxlength']).'...'; + else + $echo = $tr[$key]; + + echo isset($params['callback']) ? call_user_func_array(array($this->className, $params['callback']), array($echo, $tr)) : $echo; + } + else + echo '--'; + + echo (isset($params['suffix']) ? $params['suffix'] : ''). + ''.$name.''; + if ($this->view) + $this->_displayViewLink($token, $id); + if ($this->edit) + $this->_displayEditLink($token, $id); + if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete))) + $this->_displayDeleteLink($token, $id); + if ($this->duplicate) + $this->_displayDuplicate($token, $id); + echo '
'; + if ($this->delete) + echo '

'; + echo ' + + + + + '; + if (isset($this->_includeTab) AND sizeof($this->_includeTab)) + echo '

'; + } + + /** + * Options lists + */ + public function displayOptionsList() + { + global $currentIndex, $cookie, $tab; + + if (!isset($this->_fieldsOptions) OR !sizeof($this->_fieldsOptions)) + return false; + + $defaultLanguage = (int)Configuration::get('PS_LANG_DEFAULT'); + $this->_languages = Language::getLanguages(false); + $tab = Tab::getTab((int)$cookie->id_lang, Tab::getIdFromClassName($tab)); + echo '

'; + echo (isset($this->optionTitle) ? '

'.$this->optionTitle.'

' : ''); + echo ' + +
+
'; + echo (isset($this->optionTitle) ? ' + ' + .$this->optionTitle.'' : ''); + + foreach ($this->_fieldsOptions AS $key => $field) + { + $val = Tools::getValue($key, Configuration::get($key)); + if ($field['type'] != 'textLang') + if (!Validate::isCleanHtml($val)) + $val = Configuration::get($key); + + $isDisabled = (isset($field['visibility']) && $field['visibility'] > Shop::getContextType()) ? true : false; + + echo $this->getHtmlDefaultConfigurationValue($key, $this->_languages); + echo ' +
'; + switch ($field['type']) + { + case 'select': + echo ''; + break; + + case 'bool': + echo ' + + + + + '; + break; + + case 'textLang': + foreach ($this->_languages as $language) + { + $val = Tools::getValue($key.'_'.$language['id_lang'], Configuration::get($key, $language['id_lang'])); + if (!Validate::isCleanHtml($val)) + $val = Configuration::get($key); + echo ' +
+ +
'; + } + $this->displayFlags($this->_languages, $defaultLanguage, $key, $key); + + echo '
'; + break; + + case 'textareaLang': + foreach ($this->_languages as $language) + { + $val = Configuration::get($key, $language['id_lang']); + echo ' +
+ +
'; + } + $this->displayFlags($this->_languages, $defaultLanguage, $key, $key); + echo '
'; + break; + + case 'text': + + default: + echo ''.(isset($field['suffix']) ? $field['suffix'] : ''); + break; + } + + if (isset($field['required']) AND $field['required']) + echo ' *'; + + echo (isset($field['desc']) ? '

'.$field['desc'].'

' : ''); + echo ($isDisabled) ? '

'.$this->l('You can\'t change the value of this configuration field in this shop context').'

' : ''; + echo '
'; + } + echo '
+ +
+
+ +
'; + } + + /** + * Load class object using identifier in $_GET (if possible) + * otherwise return an empty object, or die + * + * @param boolean $opt Return an empty object if load fail + * @return object + */ + protected function loadObject($opt = false) + { + global $cookie; + if ($id = (int)(Tools::getValue($this->identifier)) AND Validate::isUnsignedId($id)) + { + if (!$this->_object) + $this->_object = new $this->className($id); + if (Validate::isLoadedObject($this->_object)) + return $this->_object; + $this->_errors[] = Tools::displayError('Object cannot be loaded (not found)'); + } + elseif ($opt) + { + $this->_object = new $this->className(); + return $this->_object; + } + else + $this->_errors[] = Tools::displayError('Object cannot be loaded (identifier missing or invalid)'); + + $this->displayErrors(); + } + + /** + * Return field value if possible (both classical and multilingual fields) + * + * Case 1 : Return value if present in $_POST / $_GET + * Case 2 : Return object value + * + * @param object $obj Object + * @param string $key Field name + * @param integer $id_lang Language id (optional) + * @return string + */ + protected function getFieldValue($obj, $key, $id_lang = NULL, $id_shop = NULL) + { + global $cookie; + + if (!$id_shop AND $obj->isLangMultishop()) + $id_shop = Shop::getCurrentShop(true); + + if ($id_lang) + $defaultValue = ($obj->id AND isset($obj->{$key}[(int)$id_shop][$id_lang])) ? $obj->{$key}[(int)$id_shop][$id_lang] : ''; + else + $defaultValue = isset($obj->{$key}) ? $obj->{$key} : ''; + + return Tools::getValue($key.($id_lang ? '_'.$id_shop.'_'.$id_lang : ''), $defaultValue); + } + + /** + * Display form + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function displayForm($firstCall = true) + { + global $cookie; + + $allowEmployeeFormLang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; + if ($allowEmployeeFormLang && !$cookie->employee_form_lang) + $cookie->employee_form_lang = (int)(Configuration::get('PS_LANG_DEFAULT')); + $useLangFromCookie = false; + $this->_languages = Language::getLanguages(false); + if ($allowEmployeeFormLang) + foreach ($this->_languages AS $lang) + if ($cookie->employee_form_lang == $lang['id_lang']) + $useLangFromCookie = true; + if (!$useLangFromCookie) + $this->_defaultFormLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + else + $this->_defaultFormLanguage = (int)($cookie->employee_form_lang); + + // Only if it is the first call to displayForm, otherwise it has already been defined + if ($firstCall) + { + echo ' + '; + } + } + + /** + * Display object details + * + * @global string $currentIndex Current URL in order to keep current Tab + */ + public function viewDetails() { global $currentIndex; } + + /** + * Called before deletion + * + * @param object $object Object + * @return boolean + */ + protected function beforeDelete($object) { return true; } + + /** + * Called before deletion + * + * @param object $object Object + * @return boolean + */ + protected function afterDelete($object, $oldId) { return true; } + + protected function afterAdd($object) { return true; } + + protected function afterUpdate($object) { return true; } + + /** + * Check rights to view the current tab + * + * @return boolean + */ + + protected function afterImageUpload() { + return true; + } + + /** + * Check rights to view the current tab + * + * @return boolean + */ + + public function viewAccess($disable = false) + { + global $cookie; + + if ($disable) + return true; + + $this->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id); + + if ($this->tabAccess['view'] === '1') + return true; + return false; + } + + /** + * Check for security token + */ + public function checkToken() + { + $token = Tools::getValue('token'); + return (!empty($token) AND $token === $this->token); + } + + /** + * Display flags in forms for translations + * + * @param array $languages All languages available + * @param integer $defaultLanguage Default language id + * @param string $ids Multilingual div ids in form + * @param string $id Current div id] + * #param boolean $return define the return way : false for a display, true for a return + */ + public function displayFlags($languages, $defaultLanguage, $ids, $id, $return = false) + { + if (sizeof($languages) == 1) + return false; + $defaultIso = Language::getIsoById($defaultLanguage); + $output = ' +
+ +
+
+ '.$this->l('Choose language:').'

'; + foreach ($languages as $language) + $output .= ''.$language['name'].' '; + $output .= '
'; + + if ($return) + return $output; + echo $output; + } + + protected function filterToField($key, $filter) + { + foreach ($this->fieldsDisplay AS $field) + if (array_key_exists('filter_key', $field) AND $field['filter_key'] == $key) + return $field; + if (array_key_exists($filter, $this->fieldsDisplay)) + return $this->fieldsDisplay[$filter]; + return false; + } + + protected function warnDomainName() + { + global $currentIndex; + + if ($_SERVER['HTTP_HOST'] != Configuration::get('PS_SHOP_DOMAIN') AND $_SERVER['HTTP_HOST'] != Configuration::get('PS_SHOP_DOMAIN_SSL')) + $this->displayWarning($this->l('Your are currently connected with the following domain name:').' '.$_SERVER['HTTP_HOST'].'
'. + $this->l('This one is different from the main shop domain name set in "Preferences > SEO & URLs":').' '.Configuration::get('PS_SHOP_DOMAIN').'
+ '. + $this->l('Click here if you want to modify the main shop domain name').''); + } + + protected function displayAssoShop($field_name = 'name') + { + global $currentIndex, $cookie; + if (!Tools::isMultiShopActivated() || (!$this->_object && Shop::getContextType() != Shop::CONTEXT_ALL)) + return; + + $shops = Shop::getShops(); + $objects = Db::getInstance()->ExecuteS('SELECT DISTINCT a.`'.pSQL($this->identifier).'`, '.(($this->lang AND isset($this->fieldsDisplay[$field_name]['filter_key']) AND $this->fieldsDisplay[$field_name]['filter_key'] == 'b!'.$field_name) ? 'b' : 'a').'.`'.pSQL($field_name).'` + FROM `'._DB_PREFIX_.pSQL($this->table).'`a '. + (($this->lang AND isset($this->fieldsDisplay[$field_name]['filter_key']) AND $this->fieldsDisplay[$field_name]['filter_key'] == 'b!'.$field_name) ? ' LEFT JOIN `'._DB_PREFIX_.pSQL($this->table).'_lang` b ON (a.`'.pSQL($this->identifier).'`=b.`'.pSQL($this->identifier).'`)' : ''). + ' WHERE 1'.(($this->lang AND isset($this->fieldsDisplay[$field_name]['filter_key']) AND $this->fieldsDisplay[$field_name]['filter_key'] == 'b!'.$field_name) ? ' AND b.id_lang='.(int)$cookie->id_lang : '').($this->_object ? ' AND a.`'.pSQL($this->identifier).'`='.(int)$this->_object->id : '')); + $assos = array(); + $res = Db::getInstance()->ExecuteS('SELECT id_shop, `'.pSQL($this->identifier).'` + FROM `'._DB_PREFIX_.pSQL($this->table).'_shop`'); + foreach ($res AS $row) + $assos[$row['id_shop']][] = $row[$this->identifier]; + + if (!$this->_object) + { + $html = ' + + + + + '; + foreach ($shops as $shop) + $html .= ''; + + $html .= ' + '; + + foreach ($objects AS $row) + { + $html .= ''; + foreach ($shops AS $shop) + $html .= ''; + $html .= ''; + } + + $html .= '
'.$this->l('Shop association').''.$shop['name'].'
'.$row[$field_name].'identifier], $assos[$shop['id_shop']])) ? 'checked="checked"' : '').'>
+ '; + } + else + { + $html = ' + '; + foreach ($shops AS $shop) + $html .= ''; + $html .= '
'.$this->l('Shop').''.$this->l('Association').'
'.$shop['name'].'id, $assos[$shop['id_shop']])) ? 'checked="checked"' : '').'>
'; + } + echo $html; + } + + protected function youEditFieldFor() + { + if (!Tools::isMultiShopActivated()) + return; + if (!$id_shop = Shop::getCurrentShop()) + $id_shop = Configuration::get('PS_SHOP_DEFAULT'); + $shop = new Shop((int)$id_shop); + return $this->l('This field will be changed for the shop:').' '.$shop->name; + } + + protected function displayAssoGroupShop($field_name = 'name') + { + global $currentIndex, $cookie; + + if (!Tools::isMultiShopActivated() || (!$this->_object && Shop::getContextType() != Shop::CONTEXT_ALL)) + return; + + $objects = Db::getInstance()->ExecuteS('SELECT DISTINCT a.`'.pSQL($this->identifier).'`, '.(($this->lang AND isset($this->fieldsDisplay[$field_name]['filter_key']) AND $this->fieldsDisplay[$field_name]['filter_key'] == 'b!'.$field_name) ? 'b' : 'a').'.`'.pSQL($field_name).'` + FROM `'._DB_PREFIX_.pSQL($this->table).'` a'. + (($this->lang AND isset($this->fieldsDisplay[$field_name]['filter_key']) AND $this->fieldsDisplay[$field_name]['filter_key'] == 'b!'.$field_name) ? ' LEFT JOIN `'._DB_PREFIX_.pSQL($this->table).'_lang` b ON (a.`'.pSQL($this->identifier).'`=b.`'.pSQL($this->identifier).'`)' : ''). + ' WHERE 1'.(($this->lang AND isset($this->fieldsDisplay[$field_name]['filter_key']) AND $this->fieldsDisplay[$field_name]['filter_key'] == 'b!'.$field_name) ? ' AND b.id_lang='.(int)$cookie->id_lang : '').($this->_object ? ' AND a.`'.pSQL($this->identifier).'`='.(int)$this->_object->id : '')); + $groups_shop = GroupShop::getGroupShops(); + $assos = array(); + $res = Db::getInstance()->ExecuteS('SELECT id_group_shop, `'.pSQL($this->identifier).'` + FROM `'._DB_PREFIX_.pSQL($this->table).'_group_shop`'); + foreach ($res AS $row) + $assos[$row['id_group_shop']][] = $row[$this->identifier]; + if (!$this->_object) + { + $html = '
+ + + + '; + foreach ($groups_shop as $group_shop) + $html .= ''; + + $html .= ' + '; + + foreach ($objects as $row) + { + $html .= ''; + foreach ($groups_shop AS $group_shop) + $html .= ''; + $html .= ''; + } + + $html .= ' +
'.$this->l('GroupShop association').''.$group_shop['name'].'
'.$row['name'].'identifier], $assos[$group_shop['id_group_shop']])) ? 'checked="checked"' : '').'>
+
'; + } + else + { + $html = ' + '; + foreach ($groups_shop as $group_shop) + $html .= ''; + $html .= '
'.$this->l('Shop').''.$this->l('Association').'
'.$group_shop['name'].'id, $assos[$group_shop['id_group_shop']])) ? 'checked="checked"' : '').'>
'; + } + echo $html; + + } + + /** + * Get current URL + * + * @param array $remove List of keys to remove from URL + * @return string + */ + protected function getCurrentUrl($remove = array()) + { + $url = $_SERVER['REQUEST_URI']; + if (!$remove) + return $url; + + if (!is_array($remove)) + $remove = array($remove); + + $url = preg_replace('#(?<=&|\?)(' . implode('|', $remove) . ')=.*?(&|$)#i', '', $url); + $len = strlen($url); + if ($url[$len - 1] == '&') + $url = substr($url, 0, $len - 1); + return $url; + } + + /** + * Display the button to set default value of a configuration field + * + * @todo Improve system for modules + * @param string $key + * @return string + */ + protected function getHtmlDefaultConfigurationValue($key, $languages) + { + if (Configuration::isLangKey($key)) + { + $testContext = false; + foreach ($languages as $lang) + if ((Shop::getContextType() == Shop::CONTEXT_SHOP && Configuration::hasContext($key, $lang['id_lang'], Shop::CONTEXT_SHOP)) + || (Shop::getContextType() == Shop::CONTEXT_GROUP && Configuration::hasContext($key, $lang['id_lang'], Shop::CONTEXT_GROUP))) + $testContext = true; + } + else + { + $testContext = ((Shop::getContextType() == Shop::CONTEXT_SHOP && Configuration::hasContext($key, null, Shop::CONTEXT_SHOP)) + || (Shop::getContextType() == Shop::CONTEXT_GROUP && Configuration::hasContext($key, null, Shop::CONTEXT_GROUP))) ? true : false; + } + + if (Tools::isMultiShopActivated() && Shop::getContextType() != Shop::CONTEXT_ALL && $testContext) + { + echo '
'; + echo ''; + echo '
'; + echo ' '.$this->l('Use default value'); + echo '
'; + echo '
'; + } + } + + /** + * Process the submission of a configuration form + * + * @param array $fields + */ + protected function submitConfiguration($fields) + { + $languages = Language::getLanguages(false); + foreach ($fields as $key => $options) + { + if (isset($options['visibility']) && $options['visibility'] > Shop::getContextType()) + continue; + + if (Tools::isMultiShopActivated() && isset($_POST['configUseDefault'][$key])) + { + Configuration::deleteFromContext($key); + continue; + } + + if ($this->validateField(Tools::getValue($key), $options)) + { + if (isset($options['type']) && in_array($options['type'], array('textLang', 'textareaLang'))) + { + $list = array(); + foreach ($languages as $language) + { + $val = (isset($options['cast']) ? $options['cast'](Tools::getValue($key.'_'.$language['id_lang'])) : Tools::getValue($key.'_'.$language['id_lang'])); + if (Validate::isCleanHtml($val)) + $list[$language['id_lang']] = $val; + else + $this->_errors[] = Tools::displayError('Can not add configuration '.$key.' for lang '.Language::getIsoById((int)$language['id_lang'])); + } + Configuration::updateValue($key, $list); + } + else + { + $val = (isset($options['cast']) ? $options['cast'](Tools::getValue($key)) : Tools::getValue($key)); + if (Validate::isCleanHtml($val)) + Configuration::updateValue($key, $val); + else + $this->_errors[] = Tools::displayError('Can not add configuration '.$key); + } + } + } + } +} diff --git a/classes/Alias.php b/classes/Alias.php new file mode 100644 index 000000000..bfb386534 --- /dev/null +++ b/classes/Alias.php @@ -0,0 +1,95 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AliasCore extends ObjectModel +{ + public $alias; + public $search; + public $active = true; + + protected $fieldsRequired = array('alias', 'search'); + protected $fieldsSize = array('alias' => 255, 'search' => 255); + protected $fieldsValidate = array('search' => 'isValidSearch', 'alias' => 'isValidSearch', 'active' => 'isBool'); + + protected $table = 'alias'; + protected $identifier = 'id_alias'; + + function __construct($id = NULL, $alias = NULL, $search = NULL, $id_lang = NULL) + { + if ($id) + parent::__construct($id); + elseif ($alias AND Validate::isValidSearch($alias)) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT a.id_alias, a.search, a.alias + FROM `'._DB_PREFIX_.'alias` a + WHERE `alias` LIKE \''.pSQL($alias).'\' AND `active` = 1'); + + if ($row) + { + $this->id = (int)($row['id_alias']); + $this->search = $search ? trim($search) : $row['search']; + $this->alias = $row['alias']; + } + else + { + $this->alias = trim($alias); + $this->search = trim($search); + } + } + } + + static public function deleteAliases($search) + { + return Db::getInstance()->Execute(' + DELETE + FROM `'._DB_PREFIX_.'alias` + WHERE `search` LIKE \''.pSQL($search).'\''); + } + + public function getAliases() + { + $aliases = Db::getInstance()->ExecuteS(' + SELECT a.alias + FROM `'._DB_PREFIX_.'alias` a + WHERE `search` = \''.pSQL($this->search).'\''); + + $aliases = array_map('implode', $aliases); + return implode(', ', $aliases); + } + + public function getFields() + { + parent::validateFields(); + + $fields['alias'] = pSQL($this->alias); + $fields['search'] = pSQL($this->search); + $fields['active'] = (int)($this->active); + return $fields; + } +} + diff --git a/classes/Attachment.php b/classes/Attachment.php new file mode 100644 index 000000000..561e8f4fe --- /dev/null +++ b/classes/Attachment.php @@ -0,0 +1,106 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AttachmentCore extends ObjectModel +{ + public $file; + public $file_name; + public $name; + public $mime; + public $description; + + /** @var integer position */ + public $position; + + protected $fieldsRequired = array('file', 'mime'); + protected $fieldsSize = array('file' => 40, 'mime' => 64, 'file_name' => 128); + protected $fieldsValidate = array('file' => 'isGenericName', 'mime' => 'isCleanHtml', 'file_name' => 'isGenericName'); + + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName', 'description' => 'isCleanHtml'); + + protected $table = 'attachment'; + protected $identifier = 'id_attachment'; + + public function getFields() + { + parent::validateFields(); + $fields['file_name'] = pSQL($this->file_name); + $fields['file'] = pSQL($this->file); + $fields['mime'] = pSQL($this->mime); + return $fields; + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'description')); + } + + public function delete() + { + @unlink(_PS_DOWNLOAD_DIR_.$this->file); + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_attachment WHERE id_attachment = '.(int)($this->id)); + return parent::delete(); + } + + public function deleteSelection($attachments) + { + $return = 1; + foreach ($attachments AS $id_attachment) + { + $attachment = new Attachment((int)($id_attachment)); + $return &= $attachment->delete(); + } + return $return; + } + + public static function getAttachments($id_lang, $id_product, $include = true) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'attachment a + LEFT JOIN '._DB_PREFIX_.'attachment_lang al ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)($id_lang).') + WHERE a.id_attachment '.($include ? 'IN' : 'NOT IN').' (SELECT pa.id_attachment FROM '._DB_PREFIX_.'product_attachment pa WHERE id_product = '.(int)($id_product).')'); + } + + public static function attachToProduct($id_product, $array) + { + $result1 = Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_attachment WHERE id_product = '.(int)($id_product)); + if (is_array($array)) + { + $ids = array(); + foreach ($array as $id_attachment) + $ids[] = '('.(int)($id_product).','.(int)($id_attachment).')'; + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET cache_has_attachments = '.(count($ids) ? '1' : '0').' WHERE id_product = '.(int)($id_product).' LIMIT 1'); + return ($result1 && Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'product_attachment (id_product, id_attachment) VALUES '.implode(',',$ids))); + } + return $result1; + } +} + diff --git a/classes/Attribute.php b/classes/Attribute.php new file mode 100644 index 000000000..28abe79ff --- /dev/null +++ b/classes/Attribute.php @@ -0,0 +1,205 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AttributeCore extends ObjectModel +{ + /** @var integer Group id which attribute belongs */ + public $id_attribute_group; + + /** @var string Name */ + public $name; + public $color; + + public $default; + + protected $fieldsRequired = array('id_attribute_group'); + protected $fieldsValidate = array('id_attribute_group' => 'isUnsignedId', 'color' => 'isColor'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 64); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'attribute'; + protected $identifier = 'id_attribute'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'product_option_values', + 'objectNodeName' => 'product_option_value', + 'fields' => array( + 'id_attribute_group' => array('xlink_resource'=> 'product_options'), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_attribute_group'] = (int)($this->id_attribute_group); + $fields['color'] = pSQL($this->color); + + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + public function delete() + { + if (($result = Db::getInstance()->ExecuteS('SELECT `id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute_combination` WHERE `'.$this->identifier.'` = '.(int)($this->id))) === false) + return false; + $combinationIds = array(); + if (Db::getInstance()->numRows()) + { + foreach ($result AS $row) + $combinationIds[] = (int)($row['id_product_attribute']); + if (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` WHERE `'.$this->identifier.'` = '.(int)($this->id)) === false) + return false; + if (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product_attribute` IN ('.implode(', ', $combinationIds).')') === false) + return false; + } + return parent::delete(); + } + + /** + * Get all attributes for a given language + * + * @param integer $id_lang Language id + * @param boolean $notNull Get only not null fields if true + * @return array Attributes + */ + static public function getAttributes($id_lang, $notNull = false) + { + return Db::getInstance()->ExecuteS(' + SELECT ag.*, agl.*, a.`id_attribute`, al.`name`, agl.`name` AS `attribute_group` + FROM `'._DB_PREFIX_.'attribute_group` ag + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute_group` = ag.`id_attribute_group` + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)($id_lang).') + '.($notNull ? 'WHERE a.`id_attribute` IS NOT NULL AND al.`name` IS NOT NULL' : '').' + ORDER BY agl.`name` ASC, al.`name` ASC'); + } + + /** + * Get quantity for a given attribute combinaison + * Check if quantity is enough to deserve customer + * + * @param integer $id_product_attribute Product attribute combinaison id + * @param integer $qty Quantity needed + * @return boolean Quantity is available or not + */ + static public function checkAttributeQty($id_product_attribute, $qty) + { + $sql = 'SELECT quantity + FROM '._DB_PREFIX_.'stock + WHERE id_product_attribute = '.(int)$id_product_attribute + .Shop::sqlSharedStock(); + $result = (int)Db::getInstance()->getValue($sql); + + return ($result AND $qty <= $result); + } + + /** + * Get quantity for product with attributes quantity + * + * @deprecated since 1.5.0, use Product->getStock() + * @param integer $id_product + * @return mixed Quantity or false + */ + static public function getAttributeQty($id_product) + { + Tools::displayAsDeprecated(); + + $row = Db::getInstance()->getRow(' + SELECT SUM(quantity) as quantity + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product` = '.(int)($id_product)); + + if ($row['quantity'] !== NULL) + return (int)($row['quantity']); + return false; + } + + /** + * Update array with veritable quantity + * + * @deprecated since 1.5.0 + * @param array &$arr + * return bool + */ + static public function updateQtyProduct(&$arr) + { + Tools::displayAsDeprecated(); + + $id_product = (int)($arr['id_product']); + $qty = self::getAttributeQty($id_product); + + if ($qty !== false) + { + $arr['quantity'] = (int)($qty); + return true; + } + return false; + } + + public function isColorAttribute() + { + if (!Db::getInstance()->getRow(' + SELECT `is_color_group` FROM `'._DB_PREFIX_.'attribute_group` WHERE `id_attribute_group` = ( + SELECT `id_attribute_group` FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute` = '.(int)($this->id).') + AND is_color_group = 1')) + return false; + return Db::getInstance()->NumRows(); + } + + /** + * Get minimal quantity for product with attributes quantity + * + * @acces public static + * @param integer $id_product_attribute + * @return mixed Minimal Quantity or false + */ + static public function getAttributeMinimalQty($id_product_attribute) + { + $minimal_quantity = Db::getInstance()->getValue(' + SELECT `minimal_quantity` + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product_attribute` = '.(int)($id_product_attribute)); + + if ($minimal_quantity > 1) + return (int)$minimal_quantity; + return false; + } + +} + diff --git a/classes/AttributeGroup.php b/classes/AttributeGroup.php new file mode 100644 index 000000000..326b182cb --- /dev/null +++ b/classes/AttributeGroup.php @@ -0,0 +1,195 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AttributeGroupCore extends ObjectModel +{ + /** @var string Name */ + public $name; + public $is_color_group; + + /** @var string Public Name */ + public $public_name; + + protected $fieldsRequired = array(); + protected $fieldsValidate = array('is_color_group' => 'isBool'); + protected $fieldsRequiredLang = array('name', 'public_name'); + protected $fieldsSizeLang = array('name' => 64, 'public_name' => 64); + protected $fieldsValidateLang = array('name' => 'isGenericName', 'public_name' => 'isGenericName'); + + protected $table = 'attribute_group'; + protected $identifier = 'id_attribute_group'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'product_options', + 'objectNodeName' => 'product_option', + 'fields' => array(), + 'associations' => array( + 'product_option_values' => array('resource' => 'product_option_value', + 'fields' => array( + 'id' => array(), + ), + ), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['is_color_group'] = (int)($this->is_color_group); + + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + return parent::add($autodate, true); + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'public_name')); + } + + static public function cleanDeadCombinations() + { + $attributeCombinations = Db::getInstance()->ExecuteS('SELECT pac.`id_attribute`, pa.`id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` pa LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pa.`id_product_attribute` = pac.`id_product_attribute`)'); + $toRemove = array(); + foreach ($attributeCombinations AS $attributeCombination) + if ((int)($attributeCombination['id_attribute']) == 0) + $toRemove[] = (int)($attributeCombination['id_product_attribute']); + if (!empty($toRemove) AND Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product_attribute` IN ('.implode(', ', $toRemove).')') === false) + return false; + return true; + } + + public function delete() + { + /* Select children in order to find linked combinations */ + $attributeIds = Db::getInstance()->ExecuteS('SELECT `id_attribute` FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)($this->id)); + if ($attributeIds === false) + return false; + /* Removing attributes to the found combinations */ + $toRemove = array(); + foreach ($attributeIds AS $attribute) + $toRemove[] = (int)($attribute['id_attribute']); + if (!empty($toRemove) AND Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` WHERE `id_attribute` IN ('.implode(', ', $toRemove).')') === false) + return false; + /* Remove combinations if they do not possess attributes anymore */ + if (!self::cleanDeadCombinations()) + return false; + /* Also delete related attributes */ + if (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'attribute_lang` WHERE `id_attribute` IN (SELECT id_attribute FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)($this->id).')') === false OR Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'attribute` WHERE `id_attribute_group` = '.(int)($this->id)) === false) + return false; + return parent::delete(); + } + + /** + * Get all attributes for a given language / group + * + * @param integer $id_lang Language id + * @param boolean $id_attribute_group Attribute group id + * @return array Attributes + */ + static public function getAttributes($id_lang, $id_attribute_group) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'attribute` a + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)($id_lang).') + WHERE a.`id_attribute_group` = '.(int)($id_attribute_group).' + ORDER BY `name`'); + } + + /** + * Get all attributes groups for a given language + * + * @param integer $id_lang Language id + * @return array Attributes groups + */ + static public function getAttributesGroups($id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'attribute_group` ag + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND `id_lang` = '.(int)($id_lang).') + ORDER BY `name` ASC'); + } + + /** + * Delete several objects from database + * + * return boolean Deletion result + */ + public function deleteSelection($selection) + { + /* Also delete Attributes */ + foreach ($selection AS $value) { + $obj = new AttributeGroup($value); + if (!$obj->delete()) + return false; + } + return true; + } + + public function setWsProductOptionValues($values) + { + $ids = array(); + foreach ($values as $value) + $ids[] = intval($value['id']); + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'attribute` + WHERE `id_attribute_group` = '.(int)$this->id.' + AND `id_attribute` NOT IN ('.implode(',', $ids).')' + ); + $ok = true; + foreach ($values as $value) + { + $result = Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'attribute` + SET `id_attribute_group` = '.(int)$this->id.' + WHERE `id_attribute` = '.(int)$value['id'] + ); + if ($result === false) + $ok = false; + } + return $ok; + } + + public function getWsProductOptionValues() + { + $result = Db::getInstance()->executeS('SELECT id_attribute AS id from `'._DB_PREFIX_.'attribute` WHERE id_attribute_group = '.(int)$this->id); + return $result; + } +} + diff --git a/classes/Backup.php b/classes/Backup.php new file mode 100644 index 000000000..2eeacc685 --- /dev/null +++ b/classes/Backup.php @@ -0,0 +1,252 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class BackupCore +{ + /** @var integer Object id */ + public $id; + /** @var string Last error messages */ + public $error; + + /** + * Creates a new backup object + * + * @param string $filename Filename of the backup file + */ + public function __construct($filename = NULL) + { + if ($filename) + $this->id = self::getBackupPath($filename); + } + + /** + * Get the full path of the backup file + * + * @param string $filename Filename of the backup file + * @return The full path of the backup file, or false if the backup file does not exists + */ + public static function getBackupPath($filename) + { + $backupdir = realpath(PS_ADMIN_DIR.'/backups/'); + + if ($backupdir === false) + die(Tools::displayError('Backups directory does not exist.')); + + // Check the realpath so we can validate the backup file is under the backup directory + $backupfile = realpath($backupdir.'/'.$filename); + if ($backupfile === false OR strncmp($backupdir, $backupfile, strlen($backupdir)) != 0) + die (Tools::displayError()); + + return $backupfile; + } + + /** + * Get the URL used to retreive this backup file + * + * @return The url used to request the backup file + */ + public function getBackupURL() + { + $adminDir = __PS_BASE_URI__.substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__) ); + $adminDir = substr($adminDir, 0, strrpos($adminDir, '/')); + + return $adminDir.'/backup.php?filename='.basename($this->id); + } + + /** + * Delete the current backup file + * + * @return boolean Deletion result, true on success + */ + public function delete() + { + if (!$this->id || !unlink($this->id)) + { + $this->error = Tools::displayError('Error deleting').' '.($this->id ? '"'.$this->id.'"' : Tools::displayError('Invalid ID')); + return false; + } + return true; + } + + /** + * Deletes a range of backup files + * + * @return boolean True on success + */ + public function deleteSelection($list) + { + foreach ($list as $file) + { + $backup = new Backup($file); + if (!$backup->delete()) + { + $this->error = $backup->error; + return false; + } + } + return true; + } + + /** + * Creates a new backup file + * + * @return boolean true on successful backup + */ + public function add() + { + if ( _DB_TYPE_ !== 'MySQL' ) + { + $this->error = Tools::displayError('Sorry, backup currently only supports MySQL database types. You are using') . ' "' . _DB_TYPE_ . '"'; + return false; + } + + if (!Configuration::get('PS_BACKUP_ALL')) + $ignore_insert_table = array(_DB_PREFIX_.'connections', _DB_PREFIX_.'connections_page', _DB_PREFIX_.'connections_source', _DB_PREFIX_.'guest', _DB_PREFIX_.'statssearch'); + else + $ignore_insert_table = array(); + + // Generate some random number, to make it extra hard to guess backup file names + $rand = dechex ( mt_rand(0, min(0xffffffff, mt_getrandmax() ) ) ); + $date = time(); + $backupfile = PS_ADMIN_DIR . '/backups/' . $date . '-' . $rand . '.sql'; + + // Figure out what compression is available and open the file + if (function_exists('bzopen')) + { + $backupfile .= '.bz2'; + $fp = @bzopen($backupfile, 'w'); + } + else if (function_exists('gzopen')) + { + $backupfile .= '.gz'; + $fp = @gzopen($backupfile, 'w'); + } + else + $fp = @fopen($backupfile, 'w'); + + if ($fp === false) + { + echo Tools::displayError('Unable to create backup file') . ' "' . addslashes($backupfile) . '"'; + return false; + } + + $this->id = realpath($backupfile); + + fwrite($fp, '/* Backup for ' . Tools::getHttpHost(false, false) . __PS_BASE_URI__ . "\n * at " . date($date) . "\n */\n"); + fwrite($fp, "\n".'SET NAMES \'utf8\';'."\n\n"); + + // Find all tables + $tables = Db::getInstance()->ExecuteS('SHOW TABLES'); + $found = 0; + foreach ($tables AS $table) + { + $table = current($table); + + // Skip tables which do not start with _DB_PREFIX_ + if (strlen($table) < strlen(_DB_PREFIX_) || strncmp($table, _DB_PREFIX_, strlen(_DB_PREFIX_)) != 0) + continue; + + // Export the table schema + $schema = Db::getInstance()->ExecuteS('SHOW CREATE TABLE `' . $table . '`'); + + if (count($schema) != 1 || !isset($schema[0]['Table']) || !isset($schema[0]['Create Table'])) + { + fclose($fp); + $this->delete(); + echo Tools::displayError('An error occurred while backing up. Unable to obtain the schema of').' "'.$table; + return false; + } + + fwrite($fp, '/* Scheme for table ' . $schema[0]['Table'] . " */\n"); + + if (Configuration::get('PS_BACKUP_DROP_TABLE')) + fwrite($fp, 'DROP TABLE IF EXISTS `'.$schema[0]['Table'].'`;'."\n"); + + fwrite($fp, $schema[0]['Create Table'] . ";\n\n"); + + if (!in_array($schema[0]['Table'], $ignore_insert_table)) + { + $data = Db::getInstance()->ExecuteS('SELECT * FROM `' . $schema[0]['Table'] . '`', false); + $sizeof = DB::getInstance()->NumRows(); + $lines = explode("\n", $schema[0]['Create Table']); + + if ($data AND $sizeof > 0) + { + // Export the table data + fwrite($fp, 'INSERT INTO `' . $schema[0]['Table'] . "` VALUES\n"); + $i = 1; + while ($row = DB::getInstance()->nextRow($data)) + { + $s = '('; + + foreach ($row AS $field => $value) + { + $tmp = "'" . mysql_real_escape_string($value) . "',"; + if($tmp != "'',") + $s .= $tmp; + else + { + foreach($lines AS $line) + if (strpos($line, '`'.$field.'`') !== false) + { + if (preg_match('/(.*NOT NULL.*)/Ui', $line)) + $s .= "'',"; + else + $s .= 'NULL,'; + break; + } + } + } + $s = rtrim($s, ','); + + if ($i%200 == 0 AND $i < $sizeof) + $s .= ");\nINSERT INTO `".$schema[0]['Table']."` VALUES\n"; + elseif ($i < $sizeof) + $s .= "),\n"; + else + $s .= ");\n"; + + fwrite($fp, $s); + ++$i; + } + } + } + $found++; + } + + fclose($fp); + if ($found == 0) + { + $this->delete(); + echo Tools::displayError('No valid tables were found to backup.' ); + return false; + } + + return true; + } + +} diff --git a/classes/Blowfish.php b/classes/Blowfish.php new file mode 100644 index 000000000..1ab25f21c --- /dev/null +++ b/classes/Blowfish.php @@ -0,0 +1,484 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_UNPACK_NATIVE', 1); +define('PS_UNPACK_MODIFIED', 2); + +class Crypt_Blowfish +{ + + var $_P = array( + 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, + 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, + 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, + 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, + 0x9216D5D9, 0x8979FB1B + ); + + var $_S = array( + array( + 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, + 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, + 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, + 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, + 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, + 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, + 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, + 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, + 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, + 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, + 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, + 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, + 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, + 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, + 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, + 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, + 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, + 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, + 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, + 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, + 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, + 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, + 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, + 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, + 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, + 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, + 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, + 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, + 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, + 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, + 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, + 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, + 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, + 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, + 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, + 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, + 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, + 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, + 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, + 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, + 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, + 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, + 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, + 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, + 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, + 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, + 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, + 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, + 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, + 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, + 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, + 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, + 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, + 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, + 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, + 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, + 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, + 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, + 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, + 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, + 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, + 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, + 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, + 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A + ), + array( + 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, + 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, + 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, + 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, + 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, + 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, + 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, + 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, + 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, + 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, + 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, + 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, + 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, + 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, + 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, + 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, + 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, + 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, + 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, + 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, + 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, + 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, + 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, + 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, + 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, + 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, + 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, + 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, + 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, + 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, + 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, + 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, + 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, + 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, + 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, + 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, + 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, + 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, + 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, + 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, + 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, + 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, + 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, + 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, + 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, + 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, + 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, + 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, + 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, + 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, + 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, + 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, + 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, + 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, + 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, + 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, + 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, + 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, + 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, + 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, + 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, + 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, + 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, + 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 + ), + array( + 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, + 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, + 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, + 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, + 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, + 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, + 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, + 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, + 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, + 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, + 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, + 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, + 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, + 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, + 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, + 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, + 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, + 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, + 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, + 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, + 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, + 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, + 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, + 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, + 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, + 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, + 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, + 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, + 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, + 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, + 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, + 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, + 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, + 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, + 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, + 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, + 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, + 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, + 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, + 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, + 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, + 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, + 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, + 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, + 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, + 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, + 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, + 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, + 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, + 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, + 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, + 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, + 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, + 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, + 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, + 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, + 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, + 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, + 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, + 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, + 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, + 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, + 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, + 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 + ), + array( + 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, + 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, + 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, + 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, + 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, + 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, + 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, + 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, + 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, + 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, + 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, + 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, + 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, + 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, + 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, + 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, + 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, + 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, + 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, + 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, + 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, + 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, + 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, + 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, + 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, + 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, + 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, + 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, + 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, + 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, + 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, + 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, + 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, + 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, + 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, + 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, + 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, + 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, + 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, + 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, + 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, + 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, + 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, + 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, + 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, + 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, + 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, + 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, + 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, + 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, + 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, + 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, + 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, + 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, + 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, + 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, + 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, + 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, + 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, + 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, + 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, + 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, + 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, + 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 + ) + ); + + var $_iv = NULL; + + protected $_unpackMode = PS_UNPACK_NATIVE; + + function __construct($key, $iv) + { + $_iv = $iv; + + $len = strlen($key); + + $k = 0; + $data = 0; + $datal = 0; + $datar = 0; + + if (PHP_VERSION_ID == '50201' OR PHP_VERSION_ID == '50206') + $this->_unpackMode = PS_UNPACK_MODIFIED; + + for ($i = 0; $i < 18; $i++) + { + $data = 0; + for ($j = 4; $j > 0; $j--) + { + $data = $data << 8 | ord($key{$k}); + $k = ($k + 1) % $len; + } + $this->_P[$i] ^= $data; + } + + for ($i = 0; $i <= 16; $i += 2) { + $this->_encipher($datal, $datar); + $this->_P[$i] = $datal; + $this->_P[$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[0][$i] = $datal; + $this->_S[0][$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[1][$i] = $datal; + $this->_S[1][$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[2][$i] = $datal; + $this->_S[2][$i+1] = $datar; + } + for ($i = 0; $i < 256; $i += 2) { + $this->_encipher($datal, $datar); + $this->_S[3][$i] = $datal; + $this->_S[3][$i+1] = $datar; + } + } + + function _encipher(&$Xl, &$Xr) + { + for ($i = 0; $i < 16; $i++) { + $temp = $Xl ^ $this->_P[$i]; + $Xl = ((($this->_S[0][($temp>>24) & 255] + + $this->_S[1][($temp>>16) & 255]) ^ + $this->_S[2][($temp>>8) & 255]) + + $this->_S[3][$temp & 255]) ^ $Xr; + $Xr = $temp; + } + $Xr = $Xl ^ $this->_P[16]; + $Xl = $temp ^ $this->_P[17]; + } + + function _decipher(&$Xl, &$Xr) + { + for ($i = 17; $i > 1; $i--) + { + $temp = $Xl ^ $this->_P[$i]; + $Xl = ((($this->_S[0][($temp>>24) & 255] + + $this->_S[1][($temp>>16) & 255]) ^ + $this->_S[2][($temp>>8) & 255]) + + $this->_S[3][$temp & 255]) ^ $Xr; + $Xr = $temp; + } + $Xr = $Xl ^ $this->_P[1]; + $Xl = $temp ^ $this->_P[0]; + } + + function encrypt($plainText) + { + $cipherText = ''; + $len = strlen($plainText); + $plainText .= str_repeat(chr(0), (8 - ($len % 8)) % 8); + for ($i = 0; $i < $len; $i += 8) + { + list(, $Xl, $Xr) = ($this->_unpackMode == PS_UNPACK_NATIVE ? unpack('N2', substr($plainText, $i, 8)) : $this->myUnpackN2(substr($plainText, $i, 8))); + $this->_encipher($Xl, $Xr); + $cipherText .= pack('N2', $Xl, $Xr); + } + return $cipherText; + } + + function decrypt($cipherText) + { + $plainText = ''; + $len = strlen($cipherText); + $cipherText .= str_repeat(chr(0), (8 - ($len % 8)) % 8); + for ($i = 0; $i < $len; $i += 8) + { + list(, $Xl, $Xr) = ($this->_unpackMode == PS_UNPACK_NATIVE ? unpack('N2', substr($cipherText, $i, 8)) : $this->myUnpackN2(substr($cipherText, $i, 8))); + $this->_decipher($Xl, $Xr); + $plainText .= pack('N2', $Xl, $Xr); + } + return $plainText; + } + + function myUnpackN($str) + { + if (pack('L', 0x6162797A) == pack('V', 0x6162797A)) + return ((ord($str) << 24) | (ord(substr($str, 1)) << 16) | (ord(substr($str, 2)) << 8) | ord(substr($str, 3))); + else + return (ord($str) | (ord(substr($str, 1)) << 8) | (ord(substr($str, 2)) << 16) | (ord(substr($str, 3)) << 24)); + } + + function myUnpackN2($str) + { + return array('1' => $this->myUnpackN($str), '2' => $this->myUnpackN(substr($str, 4))); + } +} + +class BlowfishCore extends Crypt_Blowfish +{ + function encrypt($plaintext) + { + if (($length = strlen($plaintext)) >= 1048576) + return false; + + $ciphertext = ''; + $paddedtext = $this->maxi_pad($plaintext); + $strlen = strlen($paddedtext); + for($x = 0; $x < $strlen; $x += 8) + { + $piece = substr($paddedtext, $x, 8); + $cipher_piece = parent::encrypt($piece); + $encoded = base64_encode($cipher_piece); + $ciphertext = $ciphertext.$encoded; + } + return $ciphertext.sprintf('%06d', $length); + } + + function decrypt($ciphertext) + { + $plainTextLength = intval(substr($ciphertext, -6)); + $ciphertext = substr($ciphertext, 0, -6); + + $plaintext = ''; + $chunks = explode('=', $ciphertext); + $ending_value = sizeof($chunks) ; + for($counter = 0; $counter < ($ending_value - 1); $counter++) + { + $chunk = $chunks[$counter].'='; + $decoded = base64_decode($chunk); + $piece = parent::decrypt($decoded); + $plaintext = $plaintext.$piece; + } + return substr($plaintext, 0, $plainTextLength); + } + + function maxi_pad($plaintext) + { + $str_len = sizeof($plaintext); + $pad_len = $str_len % 8; + for($x = 0; $x < $pad_len; $x++) + $plaintext = $plaintext.' '; + return $plaintext; + } +} + + diff --git a/classes/CMS.php b/classes/CMS.php new file mode 100644 index 000000000..20d248e01 --- /dev/null +++ b/classes/CMS.php @@ -0,0 +1,255 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CMSCore extends ObjectModel +{ + + /** @var string Name */ + public $meta_title; + public $meta_description; + public $meta_keywords; + public $content; + public $link_rewrite; + public $id_cms_category; + public $position; + public $active; + + protected $fieldsValidate = array('id_cms_category' => 'isUnsignedInt'); + protected $fieldsRequiredLang = array('meta_title', 'link_rewrite'); + protected $fieldsSizeLang = array('meta_description' => 255, 'meta_keywords' => 255, 'meta_title' => 128, 'link_rewrite' => 128, 'content' => 3999999999999); + protected $fieldsValidateLang = array('meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName', 'meta_title' => 'isGenericName', 'link_rewrite' => 'isLinkRewrite', 'content' => 'isString'); + + protected $table = 'cms'; + protected $identifier = 'id_cms'; + + public function getFields() + { + parent::validateFields(); + $fields['id_cms'] = (int)($this->id); + $fields['id_cms_category'] = (int)($this->id_cms_category); + $fields['position'] = (int)($this->position); + $fields['active'] = (int)($this->active); + return $fields; + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + + $fieldsArray = array('meta_title', 'meta_description', 'meta_keywords', 'link_rewrite'); + $fields = array(); + $languages = Language::getLanguages(false); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + foreach ($languages as $language) + { + $fields[$language['id_lang']]['id_lang'] = (int)($language['id_lang']); + $fields[$language['id_lang']][$this->identifier] = (int)($this->id); + $fields[$language['id_lang']]['content'] = (isset($this->content[$language['id_lang']])) ? pSQL($this->content[$language['id_lang']], true) : ''; + foreach ($fieldsArray as $field) + { + if (!Validate::isTableOrIdentifier($field)) + die(Tools::displayError()); + if (isset($this->{$field}[$language['id_lang']]) AND !empty($this->{$field}[$language['id_lang']])) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$language['id_lang']]); + elseif (in_array($field, $this->fieldsRequiredLang)) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$defaultLanguage]); + else + $fields[$language['id_lang']][$field] = ''; + } + } + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + $this->position = CMS::getLastPosition((int)$this->id_cms_category); + return parent::add($autodate, true); + } + + public function update($nullValues = false) + { + if (parent::update($nullValues)) + return $this->cleanPositions($this->id_cms_category); + return false; + } + + public function delete() + { + if (parent::delete()) + return $this->cleanPositions($this->id_cms_category); + return false; + } + + public static function getLinks($id_lang, $selection = NULL, $active = true, $id_shop = false) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.id_cms, cl.link_rewrite, cl.meta_title + FROM '._DB_PREFIX_.'cms c + LEFT JOIN '._DB_PREFIX_.'cms_lang cl ON (c.id_cms = cl.id_cms AND cl.id_lang = '.(int)($id_lang).') + WHERE 1 + '.(($selection !== NULL) ? ' AND c.id_cms IN ('.implode(',', array_map('intval', $selection)).')' : ''). + ($active ? ' AND c.`active` = 1 ' : ''). + 'ORDER BY c.`position`'); + $link = new Link(); + $links = array(); + if ($result) + foreach ($result as $row) + { + $row['link'] = $link->getCMSLink((int)($row['id_cms']), $row['link_rewrite']); + $links[] = $row; + } + return $links; + } + + public static function listCms($id_lang = NULL, $id_block = false, $active = true) + { + if (empty($id_lang)) + $id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.id_cms, l.meta_title + FROM '._DB_PREFIX_.'cms c + JOIN '._DB_PREFIX_.'cms_lang l ON (c.id_cms = l.id_cms) + '.(($id_block) ? 'JOIN '._DB_PREFIX_.'block_cms b ON (c.id_cms = b.id_cms)' : '').' + WHERE l.id_lang = '.(int)($id_lang).(($id_block) ? ' AND b.id_block = '.(int)($id_block) : '').($active ? ' AND c.`active` = 1 ' : '').' + ORDER BY c.`position`'); + } + + /** + * @deprecated + */ + public static function isInBlock($id_cms, $id_block) + { + Tools::displayAsDeprecated(); + Db::getInstance()->getRow(' + SELECT id_cms FROM '._DB_PREFIX_.'block_cms + WHERE id_block = '.(int)($id_block).' AND id_cms = '.(int)($id_cms)); + + return (Db::getInstance()->NumRows()); + } + + /** + * @deprecated + */ + public static function updateCmsToBlock($cms, $id_block) + { + Tools::displayAsDeprecated(); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'block_cms` WHERE `id_block` = '.(int)($id_block)); + + $list = ''; + foreach ($cms AS $id_cms) + $list .= '('.(int)($id_block).', '.(int)($id_cms).'),'; + $list = rtrim($list, ','); + + if (!empty($list)) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'block_cms (id_block, id_cms) VALUES '.pSQL($list)); + + return true; + } + + public function updatePosition($way, $position) + { + if (!$res = Db::getInstance()->ExecuteS(' + SELECT cp.`id_cms`, cp.`position`, cp.`id_cms_category` + FROM `'._DB_PREFIX_.'cms` cp + WHERE cp.`id_cms_category` = '.(int)$this->id_cms_category.' + ORDER BY cp.`position` ASC' + )) + return false; + + foreach ($res AS $cms) + if ((int)($cms['id_cms']) == (int)($this->id)) + $movedCms = $cms; + + if (!isset($movedCms) || !isset($position)) + return false; + + // < and > statements rather than BETWEEN operator + // since BETWEEN is treated differently according to databases + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms` + SET `position`= `position` '.($way ? '- 1' : '+ 1').' + WHERE `position` + '.($way + ? '> '.(int)($movedCms['position']).' AND `position` <= '.(int)($position) + : '< '.(int)($movedCms['position']).' AND `position` >= '.(int)($position)).' + AND `id_cms_category`='.(int)($movedCms['id_cms_category'])) + AND Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms` + SET `position` = '.(int)($position).' + WHERE `id_cms` = '.(int)($movedCms['id_cms']).' + AND `id_cms_category`='.(int)($movedCms['id_cms_category']))); + } + + static public function cleanPositions($id_category) + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_cms` + FROM `'._DB_PREFIX_.'cms` + WHERE `id_cms_category` = '.(int)($id_category).' + ORDER BY `position`'); + $sizeof = sizeof($result); + for ($i = 0; $i < $sizeof; ++$i){ + $sql = ' + UPDATE `'._DB_PREFIX_.'cms` + SET `position` = '.(int)($i).' + WHERE `id_cms_category` = '.(int)($id_category).' + AND `id_cms` = '.(int)($result[$i]['id_cms']); + Db::getInstance()->Execute($sql); + } + return true; + } + + static public function getLastPosition($id_category) + { + return (Db::getInstance()->getValue('SELECT MAX(position)+1 FROM `'._DB_PREFIX_.'cms` WHERE `id_cms_category` = '.(int)($id_category))); + } + + static public function getCMSPages($id_lang = NULL, $id_cms_category = NULL, $active = true) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'cms` c + JOIN `'._DB_PREFIX_.'cms_lang` l ON (c.id_cms = l.id_cms)'. + (isset($id_cms_category) ? 'WHERE `id_cms_category` = '.(int)($id_cms_category) : ''). + ($active ? ' AND c.`active` = 1 ' : '').' + AND l.id_lang = '.(int)($id_lang).' + ORDER BY `position`'); + } + public static function getUrlRewriteInformations($id_cms) + { + $sql = ' + SELECT l.`id_lang`, c.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_lang` AS c + LEFT JOIN `'._DB_PREFIX_.'lang` AS l ON c.`id_lang` = l.`id_lang` + WHERE c.`id_cms` = '.(int)$id_cms.' + AND l.`active` = 1'; + $arr_return = Db::getInstance()->ExecuteS($sql); + return $arr_return; + } +} + diff --git a/classes/CMSCategory.php b/classes/CMSCategory.php new file mode 100644 index 000000000..d0b22319e --- /dev/null +++ b/classes/CMSCategory.php @@ -0,0 +1,658 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CMSCategoryCore extends ObjectModel +{ + public $id; + + /** @var integer CMSCategory ID */ + public $id_cms_category; + + /** @var string Name */ + public $name; + + /** @var boolean Status for display */ + public $active = 1; + + /** @var string Description */ + public $description; + + /** @var integer Parent CMSCategory ID */ + public $id_parent; + + /** @var integer category position */ + public $position; + + /** @var integer Parents number */ + public $level_depth; + + /** @var string string used in rewrited URL */ + public $link_rewrite; + + /** @var string Meta title */ + public $meta_title; + + /** @var string Meta keywords */ + public $meta_keywords; + + /** @var string Meta description */ + public $meta_description; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected static $_links = array(); + + + protected $tables = array ('cms_category', 'cms_category_lang'); + + protected $fieldsRequired = array('id_parent', 'active'); + protected $fieldsSize = array('id_parent' => 10, 'active' => 1); + protected $fieldsValidate = array('active' => 'isBool', 'id_parent' => 'isUnsignedInt'); + protected $fieldsRequiredLang = array('name', 'link_rewrite'); + protected $fieldsSizeLang = array('name' => 64, 'link_rewrite' => 64, 'meta_title' => 128, 'meta_description' => 255, 'meta_keywords' => 255); + protected $fieldsValidateLang = array('name' => 'isCatalogName', 'link_rewrite' => 'isLinkRewrite', 'description' => 'isCleanHtml', + 'meta_title' => 'isGenericName', 'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName'); + + protected $table = 'cms_category'; + protected $identifier = 'id_cms_category'; + + public function __construct($id_cms_category = NULL, $id_lang = NULL) + { + parent::__construct($id_cms_category, $id_lang); + } + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_cms_category'] = (int)($this->id); + $fields['active'] = (int)($this->active); + $fields['id_parent'] = (int)($this->id_parent); + $fields['position'] = (int)($this->position); + $fields['level_depth'] = (int)($this->level_depth); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'description', 'link_rewrite', 'meta_title', 'meta_keywords', 'meta_description')); + } + + public function add($autodate = true, $nullValues = false) + { + $this->position = self::getLastPosition((int)$this->id_parent); + $this->level_depth = $this->calcLevelDepth(); + foreach ($this->name AS $k => $value) + if (preg_match('/^[1-9]\./', $value)) + $this->name[$k] = '0'.$value; + $ret = parent::add($autodate); + $this->cleanPositions($this->id_parent); + return $ret; + } + + public function update($nullValues = false) + { + $this->level_depth = $this->calcLevelDepth(); + foreach ($this->name AS $k => $value) + if (preg_match('/^[1-9]\./', $value)) + $this->name[$k] = '0'.$value; + return parent::update(); + } + + /** + * Recursive scan of subcategories + * + * @param integer $maxDepth Maximum depth of the tree (i.e. 2 => 3 levels depth) + * @param integer $currentDepth specify the current depth in the tree (don't use it, only for rucursivity!) + * @param array $excludedIdsArray specify a list of ids to exclude of results + * @param integer $idLang Specify the id of the language used + * + * @return array Subcategories lite tree + */ + function recurseLiteCategTree($maxDepth = 3, $currentDepth = 0, $idLang = NULL, $excludedIdsArray = NULL) + { + global $link; + + //get idLang + $idLang = is_null($idLang) ? _USER_ID_LANG_ : (int)($idLang); + + //recursivity for subcategories + $children = array(); + if (($maxDepth == 0 OR $currentDepth < $maxDepth) AND $subcats = $this->getSubCategories($idLang, true) AND sizeof($subcats)) + foreach ($subcats as &$subcat) + { + if (!$subcat['id_cms_category']) + break; + elseif ( !is_array($excludedIdsArray) || !in_array($subcat['id_cms_category'], $excludedIdsArray) ) + { + $categ = new CMSCategory($subcat['id_cms_category'] ,$idLang); + $categ->name = CMSCategory::hideCMSCategoryPosition($categ->name); + $children[] = $categ->recurseLiteCategTree($maxDepth, $currentDepth + 1, $idLang, $excludedIdsArray); + } + } + + + return array( + 'id' => $this->id_cms_category, + 'link' => $link->getCMSCategoryLink($this->id, $this->link_rewrite), + 'name' => $this->name, + 'desc'=> $this->description, + 'children' => $children + ); + } + + static public function getRecurseCategory($id_lang = _USER_ID_LANG_, $current = 1, $active = 1, $links = 0, $id_shop = false) + { + $category = Db::getInstance()->getRow(' + SELECT c.`id_cms_category`, c.`id_parent`, c.`level_depth`, cl.`name`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_category` c + JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON c.`id_cms_category` = cl.`id_cms_category` + WHERE c.`id_cms_category` = '.(int)($current).' + AND `id_lang` = '.(int)($id_lang)); + $result = Db::getInstance()->ExecuteS(' + SELECT c.`id_cms_category` + FROM `'._DB_PREFIX_.'cms_category` c + WHERE c.`id_parent` = '.(int)($current). + ($active ? ' AND c.`active` = 1' : '')); + foreach ($result as $row) + $category['children'][] = self::getRecurseCategory($id_lang, $row['id_cms_category'], $active, $links); + $category['cms'] = Db::getInstance()->ExecuteS(' + SELECT c.`id_cms`, cl.`meta_title`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms` c + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'cms_shop cs ON (cs.id_cms = c.id_cms)' : '').' + JOIN `'._DB_PREFIX_.'cms_lang` cl ON c.`id_cms` = cl.`id_cms` + WHERE `id_cms_category` = '.(int)($current).' + '.($id_shop ? ' AND cs.id_shop='.(int)$id_shop : '').' + AND cl.`id_lang` = '.(int)($id_lang).($active ? ' AND c.`active` = 1' : '').' + ORDER BY c.`position`'); + if ($links == 1) + { + $link = new Link(); + $category['link'] = $link->getCMSCategoryLink($current, $category['link_rewrite']); + foreach($category['cms'] as $key => $cms) + $category['cms'][$key]['link'] = $link->getCMSLink($cms['id_cms'], $cms['link_rewrite']); + } + return $category; + } + + static public function recurseCMSCategory($categories, $current, $id_cms_category = 1, $id_selected = 1, $is_html = 0) + { + global $currentIndex; + $html = ''; + if ($is_html == 0) + echo $html; + if (isset($categories[$id_cms_category])) + foreach ($categories[$id_cms_category] AS $key => $row) + $html .= self::recurseCMSCategory($categories, $categories[$id_cms_category][$key], $key, $id_selected, $is_html); + return $html; + } + + + + /** + * Recursively add specified CMSCategory childs to $toDelete array + * + * @param array &$toDelete Array reference where categories ID will be saved + * @param array $id_cms_category Parent CMSCategory ID + */ + protected function recursiveDelete(&$toDelete, $id_cms_category) + { + if (!is_array($toDelete) OR !$id_cms_category) + die(Tools::displayError()); + + $result = Db::getInstance()->ExecuteS(' + SELECT `id_cms_category` + FROM `'._DB_PREFIX_.'cms_category` + WHERE `id_parent` = '.(int)($id_cms_category)); + foreach ($result AS $k => $row) + { + $toDelete[] = (int)($row['id_cms_category']); + $this->recursiveDelete($toDelete, (int)($row['id_cms_category'])); + } + } + + public function delete() + { + if ($this->id == 1) return false; + + $this->clearCache(); + + /* Get childs categories */ + $toDelete = array((int)($this->id)); + $this->recursiveDelete($toDelete, (int)($this->id)); + $toDelete = array_unique($toDelete); + + /* Delete CMS Category and its child from database */ + $list = sizeof($toDelete) > 1 ? implode(',', $toDelete) : (int)($this->id); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cms_category` WHERE `id_cms_category` IN ('.$list.')'); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cms_category_lang` WHERE `id_cms_category` IN ('.$list.')'); + + self::cleanPositions($this->id_parent); + + /* Delete pages which are in categories to delete */ + $result = Db::getInstance()->ExecuteS(' + SELECT `id_cms` + FROM `'._DB_PREFIX_.'cms` + WHERE `id_cms_category` IN ('.$list.')'); + foreach ($result as $p) + { + $product = new CMS((int)($p['id_cms'])); + if (Validate::isLoadedObject($product)) + $product->delete(); + } + return true; + } + + /** + * Delete several categories from database + * + * return boolean Deletion result + */ + public function deleteSelection($categories) + { + $return = 1; + foreach ($categories AS $id_category_cms) + { + $category_cms = new CMSCategory((int)($id_category_cms)); + $return &= $category_cms->delete(); + } + return $return; + } + + /** + * Get the number of parent categories + * + * @return integer Level depth + */ + public function calcLevelDepth() + { + $parentCMSCategory = new CMSCategory((int)($this->id_parent)); + if (!$parentCMSCategory) + die('parent CMS Category does not exist'); + return $parentCMSCategory->level_depth + 1; + } + + /** + * Return available categories + * + * @param integer $id_lang Language ID + * @param boolean $active return only active categories + * @return array Categories + */ + static public function getCategories($id_lang, $active = true, $order = true) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON c.`id_cms_category` = cl.`id_cms_category` + WHERE `id_lang` = '.(int)($id_lang).' + '.($active ? 'AND `active` = 1' : '').' + ORDER BY `name` ASC'); + + if (!$order) + return $result; + + $categories = array(); + foreach ($result AS $row) + $categories[$row['id_parent']][$row['id_cms_category']]['infos'] = $row; + return $categories; + } + + static public function getSimpleCategories($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_cms_category`, cl.`name` + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category`) + WHERE cl.`id_lang` = '.(int)($id_lang).' + ORDER BY cl.`name`'); + } + + /** + * Return current CMSCategory childs + * + * @param integer $id_lang Language ID + * @param boolean $active return only active categories + * @return array Categories + */ + public function getSubCategories($id_lang, $active = true) + { + global $cookie; + if (!Validate::isBool($active)) + die(Tools::displayError()); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.*, cl.id_lang, cl.name, cl.description, cl.link_rewrite, cl.meta_title, cl.meta_keywords, cl.meta_description + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category` AND `id_lang` = '.(int)($id_lang).') + WHERE `id_parent` = '.(int)($this->id).' + '.($active ? 'AND `active` = 1' : '').' + GROUP BY c.`id_cms_category` + ORDER BY `name` ASC'); + + /* Modify SQL result */ + foreach ($result AS &$row) + { + $row['name'] = CMSCategory::hideCMSCategoryPosition($row['name']); + } + return $result; + } + + /** + * Hide CMSCategory prefix used for position + * + * @param string $name CMSCategory name + * @return string Name without position + */ + static public function hideCMSCategoryPosition($name) + { + return preg_replace('/^[0-9]+\./', '', $name); + } + + /** + * Return main categories + * + * @param integer $id_lang Language ID + * @param boolean $active return only active categories + * @return array categories + */ + static public function getHomeCategories($id_lang, $active = true) + { + return self::getChildren(1, $id_lang, $active); + } + /** + * @deprecated + **/ + static public function getRootCMSCategory($id_lang = NULL) + { + Tools::displayAsDeprecated(); + //get idLang + $id_lang = is_null($id_lang) ? _USER_ID_LANG_ : (int)($id_lang); + return new CMSCategory (1, $id_lang); + } + + static public function getChildren($id_parent, $id_lang, $active = true) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_cms_category`, cl.`name`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON c.`id_cms_category` = cl.`id_cms_category` + WHERE `id_lang` = '.(int)($id_lang).' + AND c.`id_parent` = '.(int)($id_parent).' + '.($active ? 'AND `active` = 1' : '').' + ORDER BY `name` ASC'); + + /* Modify SQL result */ + $resultsArray = array(); + foreach ($result AS $row) + { + $row['name'] = CMSCategory::hideCMSCategoryPosition($row['name']); + $resultsArray[] = $row; + } + return $resultsArray; + } + + /** + * Check if CMSCategory can be moved in another one + * + * @param integer $id_parent Parent candidate + * @return boolean Parent validity + */ + public static function checkBeforeMove($id_cms_category, $id_parent) + { + if ($id_cms_category == $id_parent) return false; + if ($id_parent == 1) return true; + $i = (int)($id_parent); + + while (42) + { + $result = Db::getInstance()->getRow('SELECT `id_parent` FROM `'._DB_PREFIX_.'cms_category` WHERE `id_cms_category` = '.(int)($i)); + if (!isset($result['id_parent'])) return false; + if ($result['id_parent'] == $id_cms_category) return false; + if ($result['id_parent'] == 1) return true; + $i = $result['id_parent']; + } + } + + public static function getLinkRewrite($id_cms_category, $id_lang) + { + if (!Validate::isUnsignedId($id_cms_category) OR !Validate::isUnsignedId($id_lang)) + return false; + + if (isset(self::$_links[$id_cms_category.'-'.$id_lang])) + return self::$_links[$id_cms_category.'-'.$id_lang]; + + $result = Db::getInstance()->getRow(' + SELECT cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON c.`id_cms_category` = cl.`id_cms_category` + WHERE `id_lang` = '.(int)($id_lang).' + AND c.`id_cms_category` = '.(int)($id_cms_category)); + self::$_links[$id_cms_category.'-'.$id_lang] = $result['link_rewrite']; + return $result['link_rewrite']; + } + + public function getLink() + { + global $link; + return $link->getCMSCategoryLink($this->id, $this->link_rewrite); + } + + public function getName($id_lang = NULL) + { + if (!$id_lang) + { + global $cookie; + + if (isset($this->name[$cookie->id_lang])) + $id_lang = $cookie->id_lang; + else + $id_lang = (int)(Configuration::get('PS_LANG_DEFAULT')); + } + return isset($this->name[$id_lang]) ? $this->name[$id_lang] : ''; + } + + /** + * Light back office search for categories + * + * @param integer $id_lang Language ID + * @param string $query Searched string + * @param boolean $unrestricted allows search without lang and includes first CMSCategory and exact match + * @return array Corresponding categories + */ + static public function searchByName($id_lang, $query, $unrestricted = false) + { + if ($unrestricted === true) + return Db::getInstance()->getRow(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category`) + WHERE `name` LIKE \''.pSQL($query).'\''); + else + return Db::getInstance()->ExecuteS(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category` AND `id_lang` = '.(int)($id_lang).') + WHERE `name` LIKE \'%'.pSQL($query).'%\' AND c.`id_cms_category` != 1'); + } + + /** + * Retrieve CMSCategory by name and parent CMSCategory id + * + * @param integer $id_lang Language ID + * @param string $CMSCategory_name Searched CMSCategory name + * @param integer $id_parent_CMSCategory parent CMSCategory ID + * @return array Corresponding CMSCategory + * @deprecated + */ + static public function searchByNameAndParentCMSCategoryId($id_lang, $CMSCategory_name, $id_parent_CMSCategory) + { + Tools::displayAsDeprecated(); + return Db::getInstance()->getRow(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category` AND `id_lang` = '.(int)($id_lang).') + WHERE `name` LIKE \''.pSQL($CMSCategory_name).'\' + AND c.`id_cms_category` != 1 + AND c.`id_parent` = '.(int)($id_parent_CMSCategory)); + } + + /** + * Get Each parent CMSCategory of this CMSCategory until the root CMSCategory + * + * @param integer $id_lang Language ID + * @return array Corresponding categories + */ + public function getParentsCategories($idLang = null) + { + //get idLang + $idLang = is_null($idLang) ? _USER_ID_LANG_ : (int)($idLang); + + $categories = null; + $idCurrent = (int)($this->id); + while (true) + { + $query = ' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'cms_category` c + LEFT JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category` AND `id_lang` = '.(int)($idLang).') + WHERE c.`id_cms_category` = '.$idCurrent.' AND c.`id_parent` != 0 + '; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($query); + + $categories[] = $result[0]; + if(!$result OR $result[0]['id_parent'] == 1) + return $categories; + $idCurrent = $result[0]['id_parent']; + } + } + /** + * Specify if a CMSCategory already in base + * + * @param $id_cms_category CMSCategory id + * @return boolean + * @deprecated + */ + static public function CMSCategoryExists($id_cms_category) + { + Tools::displayAsDeprecated(); + $row = Db::getInstance()->getRow(' + SELECT `id_cms_category` + FROM '._DB_PREFIX_.'cms_category c + WHERE c.`id_cms_category` = '.(int)($id_cms_category)); + + return isset($row['id_cms_category']); + } + + public function updatePosition($way, $position) + { + if (!$res = Db::getInstance()->ExecuteS(' + SELECT cp.`id_cms_category`, cp.`position`, cp.`id_parent` + FROM `'._DB_PREFIX_.'cms_category` cp + WHERE cp.`id_parent` = '.(int)$this->id_parent.' + ORDER BY cp.`position` ASC' + )) + return false; + foreach ($res AS $category) + if ((int)($category['id_cms_category']) == (int)($this->id)) + $movedCategory = $category; + + if (!isset($movedCategory) || !isset($position)) + return false; + // < and > statements rather than BETWEEN operator + // since BETWEEN is treated differently according to databases + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_category` + SET `position`= `position` '.($way ? '- 1' : '+ 1').' + WHERE `position` + '.($way + ? '> '.(int)($movedCategory['position']).' AND `position` <= '.(int)($position) + : '< '.(int)($movedCategory['position']).' AND `position` >= '.(int)($position)).' + AND `id_parent`='.(int)($movedCategory['id_parent'])) + AND Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_category` + SET `position` = '.(int)($position).' + WHERE `id_parent` = '.(int)($movedCategory['id_parent']).' + AND `id_cms_category`='.(int)($movedCategory['id_cms_category']))); + } + + static public function cleanPositions($id_category_parent) + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_cms_category` + FROM `'._DB_PREFIX_.'cms_category` + WHERE `id_parent` = '.(int)($id_category_parent).' + ORDER BY `position`'); + $sizeof = sizeof($result); + for ($i = 0; $i < $sizeof; ++$i){ + $sql = ' + UPDATE `'._DB_PREFIX_.'cms_category` + SET `position` = '.(int)($i).' + WHERE `id_parent` = '.(int)($id_category_parent).' + AND `id_cms_category` = '.(int)($result[$i]['id_cms_category']); + Db::getInstance()->Execute($sql); + } + return true; + } + + static public function getLastPosition($id_category_parent) + { + return (Db::getInstance()->getValue('SELECT MAX(position)+1 FROM `'._DB_PREFIX_.'cms_category` WHERE `id_parent` = '.(int)($id_category_parent))); + } + public static function getUrlRewriteInformations($id_category) + { + $sql = ' + SELECT l.`id_lang`, c.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_category_lang` AS c + LEFT JOIN `'._DB_PREFIX_.'lang` AS l ON c.`id_lang` = l.`id_lang` + WHERE c.`id_cms_category` = '.(int)$id_category.' + AND l.`active` = 1'; + $arr_return = Db::getInstance()->ExecuteS($sql); + return $arr_return; + } +} + + diff --git a/classes/Cache.php b/classes/Cache.php new file mode 100755 index 000000000..6b34634e0 --- /dev/null +++ b/classes/Cache.php @@ -0,0 +1,80 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class CacheCore +{ + + protected static $_instance; + protected $_keysCached; + protected $_tablesCached = array(); + protected $_blackList = array('cart', + 'cart_discount', + 'cart_product', + 'connections', + 'connections_source', + 'connections_page', + 'customer', + 'customer_group', + 'customized_data', + 'guest', + 'pagenotfound', + 'page_viewed'); + public static function getInstance() + { + if(!isset(self::$_instance)) + { + $caching_system = _PS_CACHING_SYSTEM_; + self::$_instance = new $caching_system(); + + } + return self::$_instance; + } + + protected function __construct() + { + } + + protected function __destruct() + { + } + + protected function isBlacklist($query) + { + foreach ($this->_blackList AS $find) + if (strpos($query, $find)) + return true; + return false; + } + + abstract public function get($key); + abstract public function delete($key, $timeout = 0); + abstract public function set($key, $value, $expire = 0); + abstract public function flush(); + abstract public function setQuery($query, $result); + abstract public function deleteQuery($query); + +} diff --git a/classes/CacheFS.php b/classes/CacheFS.php new file mode 100755 index 000000000..3a590218e --- /dev/null +++ b/classes/CacheFS.php @@ -0,0 +1,175 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CacheFSCore extends Cache { + + protected $_depth; + + protected function __construct() + { + parent::__construct(); + $this->_init(); + } + + protected function _init() + { + $this->_depth = Db::getInstance()->getValue('SELECT value FROM '._DB_PREFIX_.'configuration WHERE name=\'PS_CACHEFS_DIRECTORY_DEPTH\'', false); + return $this->_setKeys(); + } + + public function set($key, $value, $expire = 0) + { + $path = _PS_CACHEFS_DIRECTORY_; + for ($i = 0; $i < $this->_depth; $i++) + { + $path.=$key[$i].'/'; + } + if(file_put_contents($path.$key, serialize($value))) + { + $this->_keysCached[$key] = true; + return $key; + } + return false; + } + + public function setNumRows($key, $value, $expire = 0) + { + return $this->set($key.'_nrows', $value, $expire); + } + + public function getNumRows($key) + { + return $this->get($key.'_nrows'); + } + + public function get($key) + { + if (!isset($this->_keysCached[$key])) + return false; + $path = _PS_CACHEFS_DIRECTORY_; + for ($i = 0; $i < $this->_depth; $i++) + $path.=$key[$i].'/'; + if (!file_exists($path.$key)) + { + unset($this->_keysCached[$key]); + return false; + } + $file = file_get_contents($path.$key); + return unserialize($file); + } + + protected function _setKeys() + { + if (file_exists(_PS_CACHEFS_DIRECTORY_.'keysCached')) + { + $file = file_get_contents(_PS_CACHEFS_DIRECTORY_.'keysCached'); + $this->_keysCached = unserialize($file); + } + if (file_exists(_PS_CACHEFS_DIRECTORY_.'tablesCached')) + { + $file = file_get_contents(_PS_CACHEFS_DIRECTORY_.'tablesCached'); + $this->_tablesCached = unserialize($file); + } + return true; + } + + public function setQuery($query, $result) + { + $md5_query = md5($query); + if (isset($this->_keysCached[$md5_query])) + return true; + if ($this->isBlacklist($query)) + return true; + $key = $this->set($md5_query, $result); + if (preg_match_all('/('._DB_PREFIX_.'[a-z_-]*)`?.*/i', $query, $res)) + foreach($res[1] AS $table) + if(!isset($this->_tablesCached[$table][$key])) + $this->_tablesCached[$table][$key] = true; + } + + public function delete($key, $timeout = 0) + { + $path = _PS_CACHEFS_DIRECTORY_; + if (!isset($this->_keysCached[$key])) + return; + for ($i = 0; $i < $this->_depth; $i++) + $path.=$key[$i].'/'; + if (!file_exists($path.$key)) + return true; + if (!unlink($path.$key)) + return false; + unset($this->_keysCached[$key]); + return true; + } + + public function deleteQuery($query) + { + + if (preg_match_all('/('._DB_PREFIX_.'[a-z_-]*)`?.*/i', $query, $res)) + foreach ($res[1] AS $table) + if (isset($this->_tablesCached[$table])) + { + foreach ($this->_tablesCached[$table] AS $fsKey => $foo) + { + $this->delete($fsKey); + $this->delete($fsKey.'_nrows'); + } + unset($this->_tablesCached[$table]); + } + } + + public function flush() + { + } + + public function __destruct() + { + parent::__destruct(); + file_put_contents(_PS_CACHEFS_DIRECTORY_.'keysCached', serialize($this->_keysCached)); + file_put_contents(_PS_CACHEFS_DIRECTORY_.'tablesCached', serialize($this->_tablesCached)); + } + + public static function deleteCacheDirectory() + { + Tools::deleteDirectory(_PS_CACHEFS_DIRECTORY_, false); + } + + public static function createCacheDirectories($level_depth, $directory = false) + { + if (!$directory) + $directory = _PS_CACHEFS_DIRECTORY_; + $chars = '0123456789abcdefghijklmnopqrstuvwxyz'; + for ($i = 0; $i < strlen($chars); $i++) + { + $new_dir = $directory.$chars[$i].'/'; + if (mkdir($new_dir)) + if (chmod($new_dir, 0777)) + if ($level_depth - 1 > 0) + self::createCacheDirectories($level_depth - 1, $new_dir); + } + } +} diff --git a/classes/Carrier.php b/classes/Carrier.php new file mode 100644 index 000000000..c8a46970b --- /dev/null +++ b/classes/Carrier.php @@ -0,0 +1,711 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CarrierCore extends ObjectModel +{ + const SHIPPING_METHOD_DEFAULT = 0; + const SHIPPING_METHOD_WEIGHT = 1; + const SHIPPING_METHOD_PRICE = 2; + const SHIPPING_METHOD_FREE = 3; + + /** @var int Tax id (none = 0) */ + public $id_tax_rules_group; + + /** @var string Name */ + public $name; + + /** @var string URL with a '@' for */ + public $url; + + /** @var string Delay needed to deliver customer */ + public $delay; + + /** @var boolean Carrier statuts */ + public $active = true; + + /** @var boolean True if carrier has been deleted (staying in database as deleted) */ + public $deleted = 0; + + /** @var boolean Active or not the shipping handling */ + public $shipping_handling = true; + + /** @var int Behavior taken for unknown range */ + public $range_behavior; + + /** @var boolean Carrier module */ + public $is_module; + + /** @var boolean Free carrier */ + public $is_free = false; + + /** @var int shipping behavior: by weight or by price */ + public $shipping_method = 0; + + /** @var boolean Shipping external */ + public $shipping_external = 0; + + /** @var string Shipping external */ + public $external_module_name = NULL; + + /** @var boolean Need Range */ + public $need_range = 0; + + protected $fieldsRequired = array('name', 'active'); + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('id_tax_rules_group' => 'isInt', 'name' => 'isCarrierName', 'active' => 'isBool', 'is_free' => 'isBool', 'url' => 'isAbsoluteUrl', 'shipping_handling' => 'isBool', 'range_behavior' => 'isBool', 'shipping_method' => 'isUnsignedInt'); + protected $fieldsRequiredLang = array('delay'); + protected $fieldsSizeLang = array('delay' => 128); + protected $fieldsValidateLang = array('delay' => 'isGenericName'); + + protected $table = 'carrier'; + protected $identifier = 'id_carrier'; + + protected static $priceByWeight = array(); + protected static $priceByWeight2 = array(); + protected static $priceByPrice = array(); + protected static $priceByPrice2 = array(); + + protected static $_cache_tax_rule = array(); + + protected $webserviceParameters = array( + 'fields' => array( + 'id_tax_rules_group' => array(), + 'deleted' => array(), + 'is_module' => array(), + ), + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_tax_rules_group'] = (int)($this->id_tax_rules_group); + $fields['name'] = pSQL($this->name); + $fields['url'] = pSQL($this->url); + $fields['active'] = (int)($this->active); + $fields['deleted'] = (int)($this->deleted); + $fields['shipping_handling'] = (int)($this->shipping_handling); + $fields['range_behavior'] = (int)($this->range_behavior); + $fields['shipping_method'] = (int)($this->shipping_method); + $fields['is_module'] = (int)($this->is_module); + $fields['is_free'] = (int)($this->is_free); + $fields['shipping_external'] = (int)($this->shipping_external); + $fields['external_module_name'] = $this->external_module_name; + $fields['need_range'] = $this->need_range; + + return $fields; + } + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id, $id_lang); + if ($this->name == '0') + $this->name = Configuration::get('PS_SHOP_NAME'); + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('delay')); + } + + public function add($autodate = true, $nullValues = false) + { + if (!parent::add($autodate, $nullValues) OR !Validate::isLoadedObject($this)) + return false; + if (!$result = Db::getInstance()->ExecuteS('SELECT `id_carrier` FROM `'._DB_PREFIX_.$this->table.'` WHERE `deleted` = 0')) + return false; + if (!$numRows = Db::getInstance()->NumRows()) + return false; + if ((int)($numRows) == 1) + Configuration::updateValue('PS_CARRIER_DEFAULT', (int)($this->id)); + return true; + } + + /** + * Change carrier id in delivery prices when updating a carrier + * + * @param integer $id_old Old id carrier + */ + public function setConfiguration($id_old) + { + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'delivery` SET `id_carrier` = '.(int)($this->id).' WHERE `id_carrier` = '.(int)($id_old)); + } + + /** + * Get delivery prices for a given order + * + * @param floatval $totalWeight Order total weight + * @param integer $id_zone Zone id (for customer delivery address) + * @return float Delivery price + */ + public function getDeliveryPriceByWeight($totalWeight, $id_zone) + { + $cache_key = $this->id.'_'.$totalWeight.'_'.$id_zone; + if (!isset(self::$priceByWeight[$cache_key])) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT d.`price` + FROM `'._DB_PREFIX_.'delivery` d + LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON (d.`id_range_weight` = w.`id_range_weight`) + WHERE d.`id_zone` = '.(int)($id_zone).' + AND '.(float)($totalWeight).' >= w.`delimiter1` + AND '.(float)($totalWeight).' < w.`delimiter2` + AND d.`id_carrier` = '.(int)($this->id).' + ORDER BY w.`delimiter1` ASC'); + if (!isset($result['price'])) + self::$priceByWeight[$cache_key] = $this->getMaxDeliveryPriceByWeight($id_zone); + else + self::$priceByWeight[$cache_key] = $result['price']; + } + return self::$priceByWeight[$cache_key]; + } + + static public function checkDeliveryPriceByWeight($id_carrier, $totalWeight, $id_zone) + { + $cache_key = $id_carrier.'_'.$totalWeight.'_'.$id_zone; + if (!isset(self::$priceByWeight2[$cache_key])) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT d.`price` + FROM `'._DB_PREFIX_.'delivery` d + LEFT JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight` + WHERE d.`id_zone` = '.(int)($id_zone).' + AND '.(float)($totalWeight).' >= w.`delimiter1` + AND '.(float)($totalWeight).' < w.`delimiter2` + AND d.`id_carrier` = '.(int)($id_carrier).' + ORDER BY w.`delimiter1` ASC'); + self::$priceByWeight2[$cache_key] = (isset($result['price'])); + } + return self::$priceByWeight2[$cache_key]; + } + + public function getMaxDeliveryPriceByWeight($id_zone) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT d.`price` + FROM `'._DB_PREFIX_.'delivery` d + INNER JOIN `'._DB_PREFIX_.'range_weight` w ON d.`id_range_weight` = w.`id_range_weight` + WHERE d.`id_zone` = '.(int)($id_zone).' + AND d.`id_carrier` = '.(int)($this->id).' + ORDER BY w.`delimiter2` DESC LIMIT 1'); + if (!isset($result[0]['price'])) + return false; + return $result[0]['price']; + } + + /** + * Get delivery prices for a given order + * + * @param floatval $orderTotal Order total to pay + * @param integer $id_zone Zone id (for customer delivery address) + * @return float Delivery price + */ + public function getDeliveryPriceByPrice($orderTotal, $id_zone, $id_currency = NULL) + { + $cache_key = $this->id.'_'.$orderTotal.'_'.$id_zone.'_'.$id_currency; + if (!isset(self::$priceByPrice[$cache_key])) + { + if (!empty($id_currency)) + $orderTotal = Tools::convertPrice($orderTotal, $id_currency, false); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT d.`price` + FROM `'._DB_PREFIX_.'delivery` d + LEFT JOIN `'._DB_PREFIX_.'range_price` r ON d.`id_range_price` = r.`id_range_price` + WHERE d.`id_zone` = '.(int)($id_zone).' + AND '.(float)($orderTotal).' >= r.`delimiter1` + AND '.(float)($orderTotal).' < r.`delimiter2` + AND d.`id_carrier` = '.(int)($this->id).' + ORDER BY r.`delimiter1` ASC'); + if (!isset($result['price'])) + self::$priceByPrice[$cache_key] = $this->getMaxDeliveryPriceByPrice($id_zone); + else + self::$priceByPrice[$cache_key] = $result['price']; + } + return self::$priceByPrice[$cache_key]; + } + + /** + * Check delivery prices for a given order + * + * @param id_carrier + * @param floatval $orderTotal Order total to pay + * @param integer $id_zone Zone id (for customer delivery address) + * @param integer $id_currency + * @return float Delivery price + */ + static public function checkDeliveryPriceByPrice($id_carrier, $orderTotal, $id_zone, $id_currency = NULL) + { + $cache_key = $id_carrier.'_'.$orderTotal.'_'.$id_zone.'_'.$id_currency; + if (!isset(self::$priceByPrice2[$cache_key])) + { + if (!empty($id_currency)) + $orderTotal = Tools::convertPrice($orderTotal, $id_currency, false); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT d.`price` + FROM `'._DB_PREFIX_.'delivery` d + LEFT JOIN `'._DB_PREFIX_.'range_price` r ON d.`id_range_price` = r.`id_range_price` + WHERE d.`id_zone` = '.(int)($id_zone).' + AND '.(float)($orderTotal).' >= r.`delimiter1` + AND '.(float)($orderTotal).' < r.`delimiter2` + AND d.`id_carrier` = '.(int)($id_carrier).' + ORDER BY r.`delimiter1` ASC'); + self::$priceByPrice2[$cache_key] = (isset($result['price'])); + } + return self::$priceByPrice2[$cache_key]; + } + + public function getMaxDeliveryPriceByPrice($id_zone) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT d.`price` + FROM `'._DB_PREFIX_.'delivery` d + INNER JOIN `'._DB_PREFIX_.'range_price` r ON d.`id_range_price` = r.`id_range_price` + WHERE d.`id_zone` = '.(int)($id_zone).' + AND d.`id_carrier` = '.(int)($this->id).' + ORDER BY r.`delimiter2` DESC LIMIT 1'); + if (!isset($result[0]['price'])) + return false; + return $result[0]['price']; + } + + /** + * Get delivery prices for a given shipping method (price/weight) + * + * @param string $rangeTable Table name (price or weight) + * @return array Delivery prices + */ + public static function getDeliveryPriceByRanges($rangeTable, $id_carrier) + { + $rangeTable = pSQL($rangeTable); + return Db::getInstance()->ExecuteS(' + SELECT d.`id_'.$rangeTable.'`, d.`id_carrier`, d.`id_zone`, d.`price` + FROM `'._DB_PREFIX_.'delivery` d + LEFT JOIN `'._DB_PREFIX_.$rangeTable.'` r ON r.`id_'.$rangeTable.'` = d.`id_'.$rangeTable.'` + WHERE (d.`id_'.$rangeTable.'` IS NOT NULL AND d.`id_'.$rangeTable.'` != 0 AND d.`id_carrier` = '.(int)($id_carrier).') + ORDER BY r.`delimiter1` ASC'); + } + + /** + * Get all carriers in a given language + * + * @param integer $id_lang Language id + * @param $modules_filters, possible values: + PS_CARRIERS_ONLY + CARRIERS_MODULE + CARRIERS_MODULE_NEED_RANGE + PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE + ALL_CARRIERS + * @param boolean $active Returns only active carriers when true + * @return array Carriers + */ + public static function getCarriers($id_lang, $active = false, $delete = false, $id_zone = false, $ids_group = NULL, $modules_filters = 1) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + if ($ids_group) + { + $ids = ''; + foreach ($ids_group as $id) + $ids .= (int)($id).', '; + $ids = rtrim($ids, ', '); + if ($ids == '') + return (array()); + } + $sql = ' + SELECT c.*, cl.delay + FROM `'._DB_PREFIX_.'carrier` c + LEFT JOIN `'._DB_PREFIX_.'carrier_lang` cl ON (c.`id_carrier` = cl.`id_carrier` AND cl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'carrier_zone` cz ON (cz.`id_carrier` = c.`id_carrier`)'. + ($id_zone ? 'LEFT JOIN `'._DB_PREFIX_.'zone` z ON (z.`id_zone` = '.(int)($id_zone).')' : '').' + WHERE c.`deleted` '.($delete ? '= 1' : ' = 0'). + ($active ? ' AND c.`active` = 1' : ''). + ($id_zone ? ' AND cz.`id_zone` = '.(int)($id_zone).' + AND z.`active` = 1 ' : ' '); + switch ($modules_filters) + { + case 1 : + $sql .= 'AND c.is_module = 0 '; + break; + case 2 : + $sql .= 'AND c.is_module = 1 '; + break; + case 3 : + $sql .= 'AND c.is_module = 1 AND c.need_range = 1 '; + break; + case 4 : + $sql .= 'AND (c.is_module = 0 OR c.need_range = 1) '; + break; + case 5 : + $sql .= ''; + break; + + } + $sql .= ($ids_group ? ' AND c.id_carrier IN (SELECT id_carrier FROM '._DB_PREFIX_.'carrier_group WHERE id_group IN ('.$ids.')) ' : '').' + GROUP BY c.`id_carrier`'; + + $carriers = Db::getInstance()->ExecuteS($sql); + + if (is_array($carriers) AND count($carriers)) + { + foreach ($carriers as $key => $carrier) + if ($carrier['name'] == '0') + $carriers[$key]['name'] = Configuration::get('PS_SHOP_NAME'); + } + else + $carriers = array(); + + return $carriers; + } + + public static function getCarriersForOrder($id_zone, $groups = NULL) + { + global $cookie, $cart; + + if (is_array($groups) AND !empty($groups)) + $result = Carrier::getCarriers((int)$cookie->id_lang, true, false, (int)$id_zone, $groups, PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE); + else + $result = Carrier::getCarriers((int)$cookie->id_lang, true, false, (int)$id_zone, array(1), PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE); + $resultsArray = array(); + + foreach ($result AS $k => $row) + { + $carrier = new Carrier((int)$row['id_carrier']); + $shippingMethod = $carrier->getShippingMethod(); + if ($shippingMethod != Carrier::SHIPPING_METHOD_FREE) + { + // Get only carriers that are compliant with shipping method + if (($shippingMethod == Carrier::SHIPPING_METHOD_WEIGHT AND $carrier->getMaxDeliveryPriceByWeight($id_zone) === false) + OR ($shippingMethod == Carrier::SHIPPING_METHOD_PRICE AND $carrier->getMaxDeliveryPriceByPrice($id_zone) === false)) + { + unset($result[$k]); + continue ; + } + + // If out-of-range behavior carrier is set on "Desactivate carrier" + if ($row['range_behavior']) + { + // Get id zone + if (!$id_zone) + $id_zone = (int)$defaultCountry->id_zone; + + // Get only carriers that have a range compatible with cart + if (($shippingMethod == Carrier::SHIPPING_METHOD_WEIGHT AND (!Carrier::checkDeliveryPriceByWeight($row['id_carrier'], $cart->getTotalWeight(), $id_zone))) + OR ($shippingMethod == Carrier::SHIPPING_METHOD_PRICE AND (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $cart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, $cart->id_currency)))) + { + unset($result[$k]); + continue ; + } + } + } + + $row['name'] = (strval($row['name']) != '0' ? $row['name'] : Configuration::get('PS_SHOP_NAME')); + $row['price'] = ($shippingMethod == Carrier::SHIPPING_METHOD_FREE ? 0 : $cart->getOrderShippingCost((int)$row['id_carrier'])); + $row['price_tax_exc'] = ($shippingMethod == Carrier::SHIPPING_METHOD_FREE ? 0 : $cart->getOrderShippingCost((int)$row['id_carrier'], false)); + $row['img'] = file_exists(_PS_SHIP_IMG_DIR_.(int)($row['id_carrier']).'.jpg') ? _THEME_SHIP_DIR_.(int)($row['id_carrier']).'.jpg' : ''; + + // If price is false, then the carrier is unavailable (carrier module) + if ($row['price'] === false) + { + unset($result[$k]); + continue ; + } + + $resultsArray[] = $row; + } + return $resultsArray; + } + + /** + * @param int $id_country + * @param array $groups + * @return Array carriers list + * @deprecated + */ + public static function getCarriersOpc($id_country, $groups = NULL) + { + Tools::displayAsDeprecated(); + + return self::getCarriersForOrder((int)Country::getIdZone((int)($id_country)), $groups); + } + + public static function checkCarrierZone($id_carrier, $id_zone) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_carrier` + FROM `'._DB_PREFIX_.'carrier` c + LEFT JOIN `'._DB_PREFIX_.'carrier_zone` cz ON (cz.`id_carrier` = c.`id_carrier`) + LEFT JOIN `'._DB_PREFIX_.'zone` z ON (z.`id_zone` = '.(int)($id_zone).') + WHERE c.`id_carrier` = '.(int)($id_carrier).' + AND c.`deleted` = 0 + AND c.`active` = 1 + AND cz.`id_zone` = '.(int)($id_zone).' + AND z.`active` = 1' + ); + } + + /** + * Get all zones + * + * @return array Zones + */ + public function getZones() + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'carrier_zone` cz + LEFT JOIN `'._DB_PREFIX_.'zone` z ON cz.`id_zone` = z.`id_zone` + WHERE cz.`id_carrier` = '. (int)($this->id)); + } + + /** + * Get a specific zones + * + * @return array Zone + */ + public function getZone($id_zone) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'carrier_zone` + WHERE `id_carrier` = '.(int)($this->id).' + AND `id_zone` = '.(int)($id_zone)); + } + + /** + * Add zone + */ + public function addZone($id_zone) + { + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'carrier_zone` (`id_carrier` , `id_zone`) + VALUES ('.(int)($this->id).', '.(int)($id_zone).')'); + } + + /** + * Delete zone + */ + public function deleteZone($id_zone) + { + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'carrier_zone` + WHERE `id_carrier` = '.(int)($this->id).' + AND `id_zone` = '.(int)($id_zone).' LIMIT 1'); + } + + /** + * Clean delivery prices (weight/price) + * + * @param string $rangeTable Table name to clean (weight or price according to shipping method) + * @return boolean Deletion result + */ + public function deleteDeliveryPrice($rangeTable) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'delivery` WHERE `id_carrier` = '.(int)($this->id).' AND (`id_'.$rangeTable.'` IS NOT NULL OR `id_'.$rangeTable.'` = 0)'); + } + + /** + * Add new delivery prices + * + * @param string $priceList Prices list separated by commas + * @return boolean Insertion result + */ + public function addDeliveryPrice($priceList) + { + if (!Validate::isValuesList($priceList)) + die(Tools::displayError()); + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'delivery` (`id_range_price`, `id_range_weight`, `id_carrier`, `id_zone`, `price`) + VALUES '.$priceList); + } + + /** + * Copy old carrier informations when update carrier + * + * @param integer $oldId Old id carrier (copy from that id) + */ + public function copyCarrierData($oldId) + { + if (!Validate::isUnsignedId($oldId)) + die(Tools::displayError()); + + $oldLogo = _PS_SHIP_IMG_DIR_.'/'.(int)($oldId).'.jpg'; + if (file_exists($oldLogo)) + copy($oldLogo, _PS_SHIP_IMG_DIR_.'/'.(int)($this->id).'.jpg'); + + // Copy existing ranges price + $res = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'range_price` + WHERE id_carrier = '.(int)($oldId)); + foreach ($res AS $val) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'range_price` (`id_carrier`, `delimiter1`, `delimiter2`) + VALUES ('.(int)($this->id).','.(float)($val['delimiter1']).','.(float)($val['delimiter2']).')'); + $maxRangePrice = Db::getInstance()->Insert_ID(); + $res2 = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'delivery` + WHERE id_carrier = '.(int)($oldId).' + AND id_range_price = '.(int)($val['id_range_price'])); + foreach ($res2 AS $val2) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'delivery` (`id_carrier`,`id_range_price`,`id_range_weight`,`id_zone`, `price`) + VALUES ('.(int)($this->id).','.(int)($maxRangePrice).',NULL,'.(int)($val2['id_zone']).','.(float)($val2['price']).')'); + } + + // Copy existing ranges weight + $res = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'range_weight` + WHERE id_carrier = '.(int)($oldId)); + foreach ($res as $val) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'range_weight` (`id_carrier`, `delimiter1`, `delimiter2`) + VALUES ('.(int)($this->id).','.(float)($val['delimiter1']).','.(float)($val['delimiter2']).')'); + $maxRangeWeight = Db::getInstance()->Insert_ID(); + $res2 = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'delivery` + WHERE id_carrier = '.(int)($oldId).' + AND id_range_weight = '.(int)($val['id_range_weight'])); + foreach ($res2 as $val2) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'delivery` (`id_carrier`,`id_range_price`,`id_range_weight`,`id_zone`, `price`) + VALUES ('.(int)($this->id).',NULL,'.(int)($maxRangeWeight).','.(int)($val2['id_zone']).','.(float)($val2['price']).')'); + } + + // Copy existing zones + $res = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'carrier_zone` + WHERE id_carrier = '.(int)($oldId)); + foreach ($res as $val) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'carrier_zone` (`id_carrier`, `id_zone`) + VALUES ('.(int)($this->id).','.(int)($val['id_zone']).')'); + + //Copy default carrier + if ((int)(Configuration::get('PS_CARRIER_DEFAULT')) == $oldId) + Configuration::updateValue('PS_CARRIER_DEFAULT', (int)($this->id)); + } + + /** + * Check if carrier is used (at least one order placed) + * + * @return integer Order count for this carrier + */ + public function isUsed() + { + $row = Db::getInstance()->getRow(' + SELECT COUNT(`id_carrier`) AS total + FROM `'._DB_PREFIX_.'orders` + WHERE `id_carrier` = '.(int)($this->id)); + + return (int)($row['total']); + } + + + /** + * Get the price without taxes defined in carrier + * @deprecated + **/ + public function getPriceWithoutTaxes($productPrice) + { + Tools::displayAsDeprecated(); + $tax = new Tax($this->id_tax); + return round($productPrice - ($productPrice * $tax->rate / 100), 2); + } + + + public function getShippingMethod() + { + if ($this->is_free) + return Carrier::SHIPPING_METHOD_FREE; + + $method = (int)$this->shipping_method; + + if ($this->shipping_method == Carrier::SHIPPING_METHOD_DEFAULT) + { + // backward compatibility + if ((int)Configuration::get('PS_SHIPPING_METHOD')) + $method = Carrier::SHIPPING_METHOD_WEIGHT; + else + $method = Carrier::SHIPPING_METHOD_PRICE; + } + + return $method; + } + + public function getRangeTable() + { + $shippingMethod = $this->getShippingMethod(); + if ($shippingMethod == Carrier::SHIPPING_METHOD_WEIGHT) + return 'range_weight'; + elseif ($shippingMethod == Carrier::SHIPPING_METHOD_PRICE) + return 'range_price'; + return false; + } + + public function getRangeObject() + { + $shippingMethod = $this->getShippingMethod(); + if ($shippingMethod == Carrier::SHIPPING_METHOD_WEIGHT) + return new RangeWeight(); + elseif ($shippingMethod == Carrier::SHIPPING_METHOD_PRICE) + return new RangePrice(); + return false; + } + + public function getRangeSuffix() + { + $suffix = Configuration::get('PS_WEIGHT_UNIT'); + if ($this->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE) + { + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $suffix = $currency->sign; + } + return $suffix; + } + + public static function getIdTaxRulesGroupByIdCarrier($id_carrier) + { + if (!isset(self::$_cache_tax_rule[(int)$id_carrier])) + { + self::$_cache_tax_rule[$id_carrier] = Db::getInstance()->getValue(' + SELECT `id_tax_rules_group` + FROM `'._DB_PREFIX_.'carrier` + WHERE `id_carrier` = '.(int)$id_carrier); + } + + return self::$_cache_tax_rule[$id_carrier]; + } +} + diff --git a/classes/CarrierModule.php b/classes/CarrierModule.php new file mode 100644 index 000000000..46abb660a --- /dev/null +++ b/classes/CarrierModule.php @@ -0,0 +1,33 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class CarrierModuleCore extends Module +{ + abstract function getOrderShippingCost($params,$shipping_cost); + abstract function getOrderShippingCostExternal($params); +} + diff --git a/classes/Cart.php b/classes/Cart.php new file mode 100644 index 000000000..095522247 --- /dev/null +++ b/classes/Cart.php @@ -0,0 +1,1708 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7506 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CartCore extends ObjectModel +{ + public $id; + + public $id_group_shop; + + public $id_shop; + + /** @var integer Customer delivery address ID */ + public $id_address_delivery; + + /** @var integer Customer invoicing address ID */ + public $id_address_invoice; + + /** @var integer Customer currency ID */ + public $id_currency; + + /** @var integer Customer ID */ + public $id_customer; + + /** @var integer Guest ID */ + public $id_guest; + + /** @var integer Language ID */ + public $id_lang; + + /** @var integer Carrier ID */ + public $id_carrier; + + /** @var boolean True if the customer wants a recycled package */ + public $recyclable = 1; + + /** @var boolean True if the customer wants a gift wrapping */ + public $gift = 0; + + /** @var string Gift message if specified */ + public $gift_message; + + /** @var string Object creation date */ + public $date_add; + + /** @var string secure_key */ + public $secure_key; + + /** @var string Object last modification date */ + public $date_upd; + + protected static $_nbProducts = array(); + protected static $_isVirtualCart = array(); + + protected $fieldsRequired = array('id_currency', 'id_lang'); + protected $fieldsValidate = array('id_address_delivery' => 'isUnsignedId', 'id_address_invoice' => 'isUnsignedId', + 'id_currency' => 'isUnsignedId', 'id_customer' => 'isUnsignedId', 'id_guest' => 'isUnsignedId', 'id_lang' => 'isUnsignedId', + 'id_carrier' => 'isUnsignedId', 'recyclable' => 'isBool', 'gift' => 'isBool', 'gift_message' => 'isMessage'); + + protected $_products = NULL; + protected static $_totalWeight = array(); + protected $_taxCalculationMethod = PS_TAX_EXC; + protected static $_discounts = NULL; + protected static $_discountsLite = NULL; + protected static $_carriers = NULL; + protected static $_taxes_rate = NULL; + protected static $_attributesLists = array(); + protected $table = 'cart'; + protected $identifier = 'id_cart'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_address_delivery' => array('xlink_resource' => 'addresses'), + 'id_address_invoice' => array('xlink_resource' => 'addresses'), + 'id_currency' => array('xlink_resource' => 'currencies'), + 'id_customer' => array('xlink_resource' => 'customers'), + 'id_guest' => array('xlink_resource' => 'guests'), + 'id_lang' => array('xlink_resource' => 'languages'), + 'id_carrier' => array('xlink_resource' => 'carriers'), + ), + 'associations' => array( + 'cart_rows' => array('resource' => 'cart_row', 'virtual_entity' => true, 'fields' => array( + 'id_product' => array('required' => true, 'xlink_resource' => 'products'), + 'id_product_attribute' => array('required' => true, 'xlink_resource' => 'combinations'), + 'quantity' => array('required' => true), + ) + ), + ), + ); + + const ONLY_PRODUCTS = 1; + const ONLY_DISCOUNTS = 2; + const BOTH = 3; + const BOTH_WITHOUT_SHIPPING = 4; + const ONLY_SHIPPING = 5; + const ONLY_WRAPPING = 6; + const ONLY_PRODUCTS_WITHOUT_SHIPPING = 7; + + public function getFields() + { + parent::validateFields(); + + $fields['id_group_shop'] = (int)$this->id_group_shop; + $fields['id_shop'] = (int)$this->id_shop; + + $fields['id_address_delivery'] = (int)($this->id_address_delivery); + $fields['id_address_invoice'] = (int)($this->id_address_invoice); + $fields['id_currency'] = (int)($this->id_currency); + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_guest'] = (int)($this->id_guest); + $fields['id_lang'] = (int)($this->id_lang); + $fields['id_carrier'] = (int)($this->id_carrier); + $fields['recyclable'] = (int)($this->recyclable); + $fields['gift'] = (int)($this->gift); + $fields['secure_key'] = pSQL($this->secure_key); + $fields['gift_message'] = pSQL($this->gift_message); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + + return $fields; + } + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id, $id_lang); + if ($this->id_customer) + { + $customer = new Customer((int)($this->id_customer)); + $this->_taxCalculationMethod = Group::getPriceDisplayMethod((int)($customer->id_default_group)); + if ((!$this->secure_key OR $this->secure_key == '-1') AND $customer->secure_key) + { + $this->secure_key = $customer->secure_key; + $this->save(); + } + } + else + $this->_taxCalculationMethod = Group::getDefaultPriceDisplayMethod(); + } + + public function add($autodate = true, $nullValues = false) + { + $return = parent::add($autodate); + Module::hookExec('cart'); + return $return; + } + + public function update($nullValues = false) + { + if (isset(self::$_nbProducts[$this->id])) + unset(self::$_nbProducts[$this->id]); + if (isset(self::$_totalWeight[$this->id])) + unset(self::$_totalWeight[$this->id]); + $this->_products = NULL; + $return = parent::update(); + Module::hookExec('cart'); + return $return; + } + + public function delete() + { + if ($this->OrderExists()) //NOT delete a cart which is associated with an order + return false; + + $uploadedFiles = Db::getInstance()->ExecuteS(' + SELECT cd.`value` + FROM `'._DB_PREFIX_.'customized_data` cd + INNER JOIN `'._DB_PREFIX_.'customization` c ON (cd.`id_customization`= c.`id_customization`) + WHERE cd.`type`= 0 AND c.`id_cart`='.(int)$this->id); + + foreach ($uploadedFiles as $mustUnlink) + { + unlink(_PS_UPLOAD_DIR_.$mustUnlink['value'].'_small'); + unlink(_PS_UPLOAD_DIR_.$mustUnlink['value']); + } + + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'customized_data` + WHERE `id_customization` IN ( + SELECT `id_customization` + FROM `'._DB_PREFIX_.'customization` + WHERE `id_cart`='.(int)$this->id.' + )'); + + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'customization` + WHERE `id_cart` = '.(int)$this->id); + + if (!Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_discount` WHERE `id_cart` = '.(int)($this->id)) + OR !Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_product` WHERE `id_cart` = '.(int)($this->id))) + return false; + + return parent::delete(); + } + + static public function getTaxesAverageUsed($id_cart) + { + $cart = new Cart((int)($id_cart)); + if (!Validate::isLoadedObject($cart)) + die(Tools::displayError()); + + if (!Configuration::get('PS_TAX')) + return 0; + + $products = $cart->getProducts(); + $totalProducts_moy = 0; + $ratioTax = 0; + + if (!sizeof($products)) + return 0; + + foreach ($products AS $product) + { + $totalProducts_moy += $product['total_wt']; + $ratioTax += $product['total_wt'] * Tax::getProductTaxRate((int)$product['id_product'], (int)$cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + } + + if ($totalProducts_moy > 0) + return $ratioTax / $totalProducts_moy; + + return 0; + } + + /** + * Return cart discounts + * + * @result array Discounts + */ + public function getDiscounts($lite = false, $refresh = false) + { + if (!$this->id) + return array(); + if (!$lite AND !$refresh AND isset(self::$_discounts[$this->id])) + return self::$_discounts[$this->id]; + if ($lite AND isset(self::$_discountsLite[$this->id])) + return self::$_discountsLite[$this->id]; + + $result = Db::getInstance()->ExecuteS(' + SELECT d.*, `id_cart` + FROM `'._DB_PREFIX_.'cart_discount` c + LEFT JOIN `'._DB_PREFIX_.'discount` d ON c.`id_discount` = d.`id_discount` + WHERE `id_cart` = '.(int)($this->id)); + + $products = $this->getProducts(); + foreach ($result AS $k => $discount) + { + $categories = Discount::getCategories((int)($discount['id_discount'])); + $in_category = false; + foreach ($products AS $product) + if (Product::idIsOnCategoryId((int)($product['id_product']), $categories)) + { + $in_category = true; + break; + } + if (!$in_category) + unset($result[$k]); + } + + if ($lite) + { + self::$_discountsLite[$this->id] = $result; + return $result; + } + + $total_products_wt = $this->getOrderTotal(true, Cart::ONLY_PRODUCTS); + $total_products = $this->getOrderTotal(false, Cart::ONLY_PRODUCTS); + $shipping_wt = $this->getOrderShippingCost(); + $shipping = $this->getOrderShippingCost(NULL, false); + self::$_discounts[$this->id] = array(); + foreach ($result as $row) + { + $discount = new Discount($row['id_discount'], (int)($this->id_lang)); + $row['description'] = $discount->description ? $discount->description : $discount->name; + $row['value_real'] = $discount->getValue(sizeof($result), $total_products_wt, $shipping_wt, $this->id); + $row['value_tax_exc'] = $discount->getValue(sizeof($result), $total_products, $shipping, $this->id, false); + self::$_discounts[$this->id][] = $row; + } + + return isset(self::$_discounts[$this->id]) ? self::$_discounts[$this->id] : NULL; + } + + public function getDiscountsCustomer($id_discount) + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_discount` + FROM `'._DB_PREFIX_.'cart_discount` + WHERE `id_discount` = '.(int)($id_discount).' AND `id_cart` = '.(int)($this->id)); + + return Db::getInstance()->NumRows(); + } + + public function getLastProduct() + { + $sql = ' + SELECT `id_product`, `id_product_attribute` + FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_cart` = '.(int)($this->id).' + ORDER BY `date_add` DESC'; + $result = Db::getInstance()->getRow($sql); + if ($result AND isset($result['id_product']) AND $result['id_product']) + return $result; + return false; + } + + /** + * Return cart products + * + * @result array Products + */ + public function getProducts($refresh = false, $id_product = false) + { + if (!$this->id) + return array(); + // Product cache must be strictly compared to NULL, or else an empty cart will add dozens of queries + if ($this->_products !== NULL AND !$refresh) + return $this->_products; + $sql = ' + SELECT cp.`id_product_attribute`, cp.`id_product`, cu.`id_customization`, cp.`quantity` AS cart_quantity, cu.`quantity` AS customization_quantity, pl.`name`, + pl.`description_short`, pl.`available_now`, pl.`available_later`, p.`id_product`, p.`id_category_default`, p.`id_supplier`, p.`id_manufacturer`, p.`on_sale`, p.`ecotax`, p.`additional_shipping_cost`, p.`available_for_order`, + p.`price`, p.`weight`, p.`width`, p.`height`, p.`depth`, p.`out_of_stock`, p.`active`, p.`date_add`, p.`date_upd`, IFNULL(pa.`minimal_quantity`, p.`minimal_quantity`) as minimal_quantity, + t.`id_tax`, tl.`name` AS tax, t.`rate`, pa.`price` AS price_attribute, s.quantity, + pa.`ecotax` AS ecotax_attr, i.`id_image`, il.`legend`, pl.`link_rewrite`, cl.`link_rewrite` AS category, CONCAT(cp.`id_product`, cp.`id_product_attribute`) AS unique_id, + IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference, + IF (IFNULL(pa.`supplier_reference`, \'\') = \'\', p.`supplier_reference`, pa.`supplier_reference`) AS supplier_reference, + (p.`weight`+ pa.`weight`) weight_attribute, + IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13, IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc, + pai.`id_image` as pai_id_image + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$this->id_lang.') + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.`id_product_attribute` = cp.`id_product_attribute`) + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$this->id_lang.') + LEFT JOIN `'._DB_PREFIX_.'customization` cu ON (p.`id_product` = cu.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'product_attribute_image` pai ON (pai.`id_product_attribute` = pa.`id_product_attribute`) + LEFT JOIN `'._DB_PREFIX_.'image` i ON (IF(pai.`id_image`, + i.`id_image` = + (SELECT i2.`id_image` + FROM `'._DB_PREFIX_.'image` i2 + INNER JOIN `'._DB_PREFIX_.'product_attribute_image` pai2 ON (pai2.`id_image` = i2.`id_image`) + WHERE i2.`id_product` = p.`id_product` AND pai2.`id_product_attribute` = pa.`id_product_attribute` + ORDER BY i2.`position` + LIMIT 1), + i.`id_product` = p.`id_product` AND i.`cover` = 1) + ) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$this->id_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$this->id_lang.') + LEFT JOIN '._DB_PREFIX_.'stock s ON cp.id_product = s.id_product AND cp.id_product_attribute = s.id_product_attribute '.Shop::sqlSharedStock('s').' + WHERE cp.`id_cart` = '.(int)$this->id.' + '.($id_product ? ' AND cp.`id_product` = '.(int)$id_product : '').' + AND p.`id_product` IS NOT NULL + GROUP BY unique_id + ORDER BY cp.date_add ASC'; + $result = Db::getInstance()->ExecuteS($sql); + // Reset the cache before the following return, or else an empty cart will add dozens of queries + + $productsIds = array(); + $paIds = array(); + foreach ($result as $row) + { + $productsIds[] = $row['id_product']; + $paIds[] = $row['id_product_attribute']; + } + // Thus you can avoid one query per product, because there will be only one query for all the products of the cart + Product::cacheProductsFeatures($productsIds); + self::cacheSomeAttributesLists($paIds, $this->id_lang); + + $this->_products = array(); + if (empty($result)) + return array(); + foreach ($result AS $k => $row) + { + if (isset($row['ecotax_attr']) AND $row['ecotax_attr'] > 0) + $row['ecotax'] = (float)($row['ecotax_attr']); + $row['stock_quantity'] = (int)($row['quantity']); + // for compatibility with 1.2 themes + $row['quantity'] = (int)($row['cart_quantity']); + if (isset($row['id_product_attribute']) AND (int)$row['id_product_attribute']) + { + $row['weight'] = $row['weight_attribute']; + } + if ($this->_taxCalculationMethod == PS_TAX_EXC) + { + $row['price'] = Product::getPriceStatic((int)$row['id_product'], false, isset($row['id_product_attribute']) ? (int)($row['id_product_attribute']) : NULL, 2, NULL, false, true, (int)($row['cart_quantity']), false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL), $specificPriceOutput); // Here taxes are computed only once the quantity has been applied to the product price + $row['price_wt'] = Product::getPriceStatic((int)$row['id_product'], true, isset($row['id_product_attribute']) ? (int)($row['id_product_attribute']) : NULL, 2, NULL, false, true, (int)($row['cart_quantity']), false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); + $tax_rate = Tax::getProductTaxRate((int)$row['id_product'], (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + + $row['total_wt'] = Tools::ps_round($row['price'] * (float)$row['cart_quantity'] * (1 + (float)($tax_rate) / 100), 2); + $row['total'] = $row['price'] * (int)($row['cart_quantity']); + } + else + { + $row['price'] = Product::getPriceStatic((int)$row['id_product'], false, (int)$row['id_product_attribute'], 6, NULL, false, true, $row['cart_quantity'], false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL), $specificPriceOutput); + $row['price_wt'] = Product::getPriceStatic((int)$row['id_product'], true, (int)$row['id_product_attribute'], 2, NULL, false, true, $row['cart_quantity'], false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); + + /* In case when you use QuantityDiscount, getPriceStatic() can be return more of 2 decimals */ + $row['price_wt'] = Tools::ps_round($row['price_wt'], 2); + $row['total_wt'] = $row['price_wt'] * (int)($row['cart_quantity']); + $row['total'] = Tools::ps_round($row['price'] * (int)($row['cart_quantity']), 2); + } + $row['reduction_applies'] = $specificPriceOutput AND (float)($specificPriceOutput['reduction']); + $row['id_image'] = Product::defineProductImage($row,$this->id_lang); + $row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); + $row['features'] = Product::getFeaturesStatic((int)$row['id_product']); + if (array_key_exists($row['id_product_attribute'].'-'.$this->id_lang, self::$_attributesLists)) + $row = array_merge($row, self::$_attributesLists[$row['id_product_attribute'].'-'.$this->id_lang]); + + $this->_products[] = $row; + } + return $this->_products; + } + + public static function cacheSomeAttributesLists($ipaList, $id_lang) + { + $paImplode = array(); + $attributesList = array(); + $attributesListSmall = array(); + foreach ($ipaList as $id_product_attribute) + if ((int)$id_product_attribute AND !array_key_exists($id_product_attribute.'-'.$id_lang, self::$_attributesLists)) + { + $paImplode[] = (int)$id_product_attribute; + self::$_attributesLists[(int)$id_product_attribute.'-'.$id_lang] = array('attributes' => '', 'attributes_small' => ''); + } + if (!count($paImplode)) + return; + + $result = Db::getInstance()->ExecuteS(' + SELECT pac.`id_product_attribute`, agl.`public_name` AS public_group_name, al.`name` AS attribute_name + FROM `'._DB_PREFIX_.'product_attribute_combination` pac + LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute` + LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group` + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.') + WHERE pac.`id_product_attribute` IN ('.implode($paImplode, ',').') + ORDER BY agl.`public_name` ASC'); + + foreach ($result as $row) + { + self::$_attributesLists[$row['id_product_attribute'].'-'.$id_lang]['attributes'] .= $row['public_group_name'].' : '.$row['attribute_name'].', '; + self::$_attributesLists[$row['id_product_attribute'].'-'.$id_lang]['attributes_small'] .= $row['attribute_name'].', '; + } + + foreach ($paImplode as $id_product_attribute) + { + self::$_attributesLists[$id_product_attribute.'-'.$id_lang]['attributes'] = rtrim(self::$_attributesLists[$id_product_attribute.'-'.$id_lang]['attributes'], ', '); + self::$_attributesLists[$id_product_attribute.'-'.$id_lang]['attributes_small'] = rtrim(self::$_attributesLists[$id_product_attribute.'-'.$id_lang]['attributes_small'], ', '); + } + } + + /** + * Return cart products quantity + * + * @result integer Products quantity + */ + public function nbProducts() + { + if (!$this->id) + return 0; + return self::getNbProducts($this->id); + } + + public static function getNbProducts($id) + { + // Must be strictly compared to NULL, or else an empty cart will bypass the cache and add dozens of queries + if (isset(self::$_nbProducts[$id]) && self::$_nbProducts[$id] !== NULL) + return self::$_nbProducts[$id]; + self::$_nbProducts[$id] = (int)(Db::getInstance()->getValue(' + SELECT SUM(`quantity`) + FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_cart` = '.(int)($id))); + return self::$_nbProducts[$id]; + } + + /** + * Add a discount to the cart (NO controls except doubles) + * + * @param integer $id_discount The discount to add to the cart + * @result boolean Update result + */ + public function addDiscount($id_discount) + { + return Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_discount', array('id_discount' => (int)($id_discount), 'id_cart' => (int)($this->id)), 'INSERT'); + } + + public function containsProduct($id_product, $id_product_attribute, $id_customization) + { + return Db::getInstance()->getRow(' + SELECT cp.`quantity` + FROM `'._DB_PREFIX_.'cart_product` cp + '.($id_customization ? 'LEFT JOIN `'._DB_PREFIX_.'customization` c ON (c.`id_product` = cp.`id_product` AND c.`id_product_attribute` = cp.`id_product_attribute`)' : '').' + WHERE cp.`id_product` = '.(int)$id_product.' AND cp.`id_product_attribute` = '.(int)$id_product_attribute.' AND cp.`id_cart` = '.(int)$this->id. + ($id_customization ? ' AND c.`id_customization` = '.(int)$id_customization : '')); + } + + /** + * Update product quantity + * + * @param integer $quantity Quantity to add (or substract) + * @param integer $id_product Product ID + * @param integer $id_product_attribute Attribute ID if needed + * @param string $operator Indicate if quantity must be increased or decreased + */ + public function updateQty($quantity, $id_product, $id_product_attribute = NULL, $id_customization = false, $operator = 'up', $id_shop = NULL, $id_group_shop = NULL) + { + if (is_null($id_shop)) $id_shop = Shop::getCurrentShop(true); + $quantity = (int)$quantity; + $id_product = (int)$id_product; + $id_product_attribute = (int)$id_product_attribute; + $product = new Product($id_product, false, Configuration::get('PS_LANG_DEFAULT'), $id_shop); + + /* If we have a product combination, the minimal quantity is set with the one of this combination */ + if (!empty($id_product_attribute)) + $minimalQuantity = (int)Attribute::getAttributeMinimalQty($id_product_attribute); + else + $minimalQuantity = (int)$product->minimal_quantity; + + if (!Validate::isLoadedObject($product)) + die(Tools::displayError()); + if (isset(self::$_nbProducts[$this->id])) + unset(self::$_nbProducts[$this->id]); + if (isset(self::$_totalWeight[$this->id])) + unset(self::$_totalWeight[$this->id]); + if ((int)$quantity <= 0) + return $this->deleteProduct($id_product, $id_product_attribute, (int)$id_customization); + elseif (!$product->available_for_order OR Configuration::get('PS_CATALOG_MODE')) + return false; + else + { + /* Check if the product is already in the cart */ + $result = $this->containsProduct($id_product, $id_product_attribute, (int)$id_customization); + + /* Update quantity if product already exist */ + + if ($result) + { + if ($operator == 'up') + { + $sql = 'SELECT p.out_of_stock, s.quantity + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = p.id_product + WHERE s.id_product = '.$id_product.' + AND s.id_product_attribute = '.$id_product_attribute + .Shop::sqlSharedStock('s', $id_shop, $id_group_shop); + $result2 = Db::getInstance()->getRow($sql); + $productQty = (int)$result2['quantity']; + $newQty = (int)$result['quantity'] + (int)$quantity; + $qty = '+ '.(int)$quantity; + + if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock'])) + if ($newQty > $productQty) + return false; + } + elseif ($operator == 'down') + { + $qty = '- '.(int)$quantity; + $newQty = (int)$result['quantity'] - (int)$quantity; + if ($newQty < $minimalQuantity AND $minimalQuantity > 1) + return -1; + } + else + return false; + + /* Delete product from cart */ + if ($newQty <= 0) + return $this->deleteProduct((int)$id_product, (int)$id_product_attribute, (int)$id_customization); + elseif ($newQty < $minimalQuantity) + return -1; + else + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cart_product` + SET `quantity` = `quantity` '.$qty.' + WHERE `id_product` = '.(int)$id_product. + (!empty($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)$id_product_attribute : '').' + AND `id_cart` = '.(int)$this->id.' + LIMIT 1'); + } + + /* Add product to the cart */ + else + { + $sql = 'SELECT p.out_of_stock, s.quantity + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = p.id_product + WHERE s.id_product = '.$id_product.' + AND s.id_product_attribute = '.$id_product_attribute + .Shop::sqlSharedStock('s', $id_shop, $id_group_shop); + $result2 = Db::getInstance()->getRow($sql); + if (!Product::isAvailableWhenOutOfStock((int)$result2['out_of_stock'])) + if ((int)$quantity > $result2['quantity']) + return false; + + if ((int)$quantity < $minimalQuantity) + return -1; + + if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_product', array('id_product' => (int)$id_product, + 'id_product_attribute' => (int)$id_product_attribute, 'id_cart' => (int)$this->id, + 'quantity' => (int)$quantity, 'date_add' => date('Y-m-d H:i:s')), 'INSERT')) + return false; + } + } + // refresh cache of self::_products + $this->_products = $this->getProducts(true); + $this->update(true); + + if ($product->customizable) + return $this->_updateCustomizationQuantity((int)$quantity, (int)$id_customization, (int)$id_product, (int)$id_product_attribute, $operator); + else + return true; + } + + /* + ** Customization management + */ + protected function _updateCustomizationQuantity($quantity, $id_customization, $id_product, $id_product_attribute, $operator = 'up') + { + global $cookie; + + /* Getting datas */ + $files = $cookie->getFamily('pictures_'.(int)($id_product).'_'); + $textFields = $cookie->getFamily('textFields_'.(int)($id_product).'_'); + /* Customization addition */ + if (count($files) > 0 OR count($textFields) > 0) + return $this->_addCustomization((int)$id_product, (int)$id_product_attribute, $files, $textFields, (int)$quantity); + /* Deletion */ + if (!empty($id_customization) AND (int)($quantity) < 1) + return $this->_deleteCustomization((int)$id_customization, (int)$id_product, (int)$id_product_attribute); + /* Quantity update */ + if (!empty($id_customization)) + { + $result = Db::getInstance()->getRow('SELECT `quantity` FROM `'._DB_PREFIX_.'customization` WHERE `id_customization` = '.(int)$id_customization); + if ($result AND Db::getInstance()->NumRows()) + { + if ($operator == 'down' AND (int)($result['quantity']) - (int)($quantity) < 1) + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization` WHERE `id_customization` = '.(int)$id_customization); + return Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customization` SET `quantity` = `quantity` '.($operator == 'up' ? '+ ' : '- ').(int)($quantity).' WHERE `id_customization` = '.(int)($id_customization)); + } + } + // refresh cache of self::_products + $this->_products = $this->getProducts(true); + $this->update(true); + return true; + } + + public function _addCustomization($id_product, $id_product_attribute, $files, $textFields, $quantity) + { + if (!is_array($files) OR !is_array($textFields)) + die(Tools::displayError()); + /* Copying them inside the db */ + if (!Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'customization` (`id_cart`, `id_product`, `id_product_attribute`, `quantity`) VALUES ('.(int)($this->id).', '.(int)($id_product).', '.(int)($id_product_attribute).', '.(int)($quantity).')')) + return false; + if (!$id_customization = Db::getInstance()->Insert_ID()) + return false; + $query = 'INSERT INTO `'._DB_PREFIX_.'customized_data` (`id_customization`, `type`, `index`, `value`) VALUES '; + if (count($files)) + foreach ($files AS $key => $filename) + { + $tmp = explode('_', $key); + $query .= '('.(int)($id_customization).', '._CUSTOMIZE_FILE_.', '.$tmp[2].', \''.$filename.'\'), '; + } + if (count($textFields)) + foreach ($textFields AS $key => $textFieldValue) + { + $tmp = explode('_', $key); + $query .= '('.(int)($id_customization).', '._CUSTOMIZE_TEXTFIELD_.', '.$tmp[2].', \''.$textFieldValue.'\'), '; + } + $query = rtrim($query, ', '); + if (!$result = Db::getInstance()->Execute($query)) + return false; + /* Deleting customized informations from the cart (we just copied them inside the db) */ + return Cart::deleteCustomizationInformations((int)($id_product)); + } + + /** + * Check if order has already been placed + * + * @return boolean result + */ + public function OrderExists() + { + return (bool)Db::getInstance()->getValue('SELECT `id_cart` FROM `'._DB_PREFIX_.'orders` WHERE `id_cart` = '.(int)$this->id); + } + + /* + ** Deletion + */ + + /** + * Delete a discount from the cart + * + * @param integer $id_discount Discount ID + * @return boolean result + */ + public function deleteDiscount($id_discount) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_discount` WHERE `id_discount` = '.(int)($id_discount).' AND `id_cart` = '.(int)($this->id).' LIMIT 1'); + } + + /** + * Delete a product from the cart + * + * @param integer $id_product Product ID + * @param integer $id_product_attribute Attribute ID if needed + * @param integer $id_customization Customization id + * @return boolean result + */ + public function deleteProduct($id_product, $id_product_attribute = NULL, $id_customization = NULL) + { + if (isset(self::$_nbProducts[$this->id])) + unset(self::$_nbProducts[$this->id]); + if (isset(self::$_totalWeight[$this->id])) + unset(self::$_totalWeight[$this->id]); + if ((int)($id_customization)) + { + $productTotalQuantity = (int)(Db::getInstance()->getValue('SELECT `quantity` + FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_product` = '.(int)($id_product).' AND `id_product_attribute` = '.(int)($id_product_attribute))); + $customizationQuantity = (int)(Db::getInstance()->getValue('SELECT `quantity` + FROM `'._DB_PREFIX_.'customization` + WHERE `id_cart` = '.(int)($this->id).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute))); + if (!$this->_deleteCustomization((int)($id_customization), (int)($id_product), (int)($id_product_attribute))) + return false; + // refresh cache of self::_products + $this->_products = $this->getProducts(true); + return ($customizationQuantity == $productTotalQuantity AND $this->deleteProduct((int)($id_product), $id_product_attribute, NULL)); + } + + /* Get customization quantity */ + if (($result = Db::getInstance()->getRow('SELECT SUM(`quantity`) AS \'quantity\' FROM `'._DB_PREFIX_.'customization` WHERE `id_cart` = '.(int)($this->id).' AND `id_product` = '.(int)($id_product).' AND `id_product_attribute` = '.(int)($id_product_attribute))) === false) + return false; + + /* If the product still possesses customization it does not have to be deleted */ + if (Db::getInstance()->NumRows() AND (int)($result['quantity'])) + return Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'cart_product` SET `quantity` = '.(int)($result['quantity']).' WHERE `id_cart` = '.(int)($this->id).' AND `id_product` = '.(int)($id_product).($id_product_attribute != NULL ? ' AND `id_product_attribute` = '.(int)($id_product_attribute) : '')); + + /* Product deletion */ + if (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)($id_product).($id_product_attribute != NULL ? ' AND `id_product_attribute` = '.(int)($id_product_attribute) : '').' AND `id_cart` = '.(int)($this->id))) + { + // refresh cache of self::_products + $this->_products = $this->getProducts(true); + /* Update cart */ + return $this->update(true); + } + return false; + } + + /** + * Delete a customization from the cart. If customization is a Picture (type=2), + * then the image is also deleted + * + * @param integer $id_customization + * @return boolean result + */ + protected function _deleteCustomization($id_customization, $id_product, $id_product_attribute) + { + $result = true; + $customization = Db::getInstance()->getRow('SELECT * + FROM `'._DB_PREFIX_.'customization` + WHERE `id_customization` = '.(int)($id_customization)); + + if ($customization and sizeof($customization)) + { + $custData = Db::getInstance()->getRow('SELECT * + FROM `'._DB_PREFIX_.'customized_data` + WHERE `id_customization` = '.(int)($id_customization)); + + if (isset($custData['type']) and $custData['type'] == 0) + $result &= $this->deletePictureToProduct($id_product,$custData['value']); + + $result &= Db::getInstance()->execute('DELETE + FROM `'._DB_PREFIX_.'customized_data` + WHERE `id_customization` = '.(int)($id_customization)); + + if($result) + $result &= Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'cart_product` + SET `quantity` = `quantity` - '.(int)($customization['quantity']).' + WHERE `id_cart` = '.(int)($this->id).' + AND `id_product` = '.(int)($id_product).((int)($id_product_attribute) ? ' + AND `id_product_attribute` = '.(int)($id_product_attribute) : '')); + + if (!$result) + return false; + + return Db::getInstance()->Execute('DELETE + FROM `'._DB_PREFIX_.'customization` + WHERE `id_customization` = '.(int)($id_customization)); + } + + return true; + } + + static public function getTotalCart($id_cart, $use_tax_display = false) + { + $cart = new Cart((int)($id_cart)); + if (!Validate::isLoadedObject($cart)) + die(Tools::displayError()); + $with_taxes = $use_tax_display ? $cart->_taxCalculationMethod != PS_TAX_EXC : true; + return Tools::displayPrice($cart->getOrderTotal($with_taxes), Currency::getCurrencyInstance((int)($cart->id_currency)), false); + } + + + public static function getOrderTotalUsingTaxCalculationMethod($id_cart) + { + return Cart::getTotalCart($id_cart, true); + } + + /** + * This function returns the total cart amount + * + * Possible values for $type: + * Cart::ONLY_PRODUCTS + * Cart::ONLY_DISCOUNTS + * Cart::BOTH + * Cart::BOTH_WITHOUT_SHIPPING + * Cart::ONLY_SHIPPING + * Cart::ONLY_WRAPPING + * Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING + * + * @param boolean $withTaxes With or without taxes + * @param integer $type Total type + * @return float Order total + */ + public function getOrderTotal($withTaxes = true, $type = Cart::BOTH) + { + if (!$this->id) + return 0; + $type = (int)($type); + if (!in_array($type, array(Cart::ONLY_PRODUCTS, Cart::ONLY_DISCOUNTS, Cart::BOTH, Cart::BOTH_WITHOUT_SHIPPING, Cart::ONLY_SHIPPING, Cart::ONLY_WRAPPING, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING))) + die(Tools::displayError()); + + // no shipping cost if is a cart with only virtuals products + $virtual = $this->isVirtualCart(); + if ($virtual AND $type == Cart::ONLY_SHIPPING) + return 0; + if ($virtual AND $type == Cart::BOTH) + $type = Cart::BOTH_WITHOUT_SHIPPING; + $shipping_fees = ($type != Cart::BOTH_WITHOUT_SHIPPING AND $type != Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING) ? $this->getOrderShippingCost(NULL, (int)($withTaxes)) : 0; + if ($type == Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING) + $type = Cart::ONLY_PRODUCTS; + + $products = $this->getProducts(); + $order_total = 0; + if (Tax::excludeTaxeOption()) + $withTaxes = false; + foreach ($products AS $product) + { + if ($this->_taxCalculationMethod == PS_TAX_EXC) + { + + // Here taxes are computed only once the quantity has been applied to the product price + $price = Product::getPriceStatic((int)$product['id_product'], false, (int)$product['id_product_attribute'], 2, NULL, false, true, $product['cart_quantity'], false, (int)$this->id_customer ? (int)$this->id_customer : NULL, (int)$this->id, ($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + + $total_ecotax = $product['ecotax'] * (int)$product['cart_quantity']; + $total_price = $price * (int)$product['cart_quantity']; + + if ($withTaxes) + { + $total_price = ($total_price - $total_ecotax) * (1 + (float)(Tax::getProductTaxRate((int)$product['id_product'], (int)$this->{Configuration::get('PS_TAX_ADDRESS_TYPE')})) / 100); + $total_ecotax = $total_ecotax * (1 + Tax::getProductEcotaxRate((int)$this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) / 100); + $total_price = Tools::ps_round($total_price + $total_ecotax, 2); + } + } + else + { + $price = Product::getPriceStatic((int)($product['id_product']), $withTaxes, (int)($product['id_product_attribute']), 2, NULL, false, true, $product['cart_quantity'], false, ((int)($this->id_customer) ? (int)($this->id_customer) : NULL), (int)($this->id), ((int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) ? (int)($this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) : NULL)); + $total_price = Tools::ps_round($price, 2) * (int)($product['cart_quantity']); + } + $order_total += $total_price; + } + $order_total_products = $order_total; + if ($type == Cart::ONLY_DISCOUNTS) + $order_total = 0; + // Wrapping Fees + $wrapping_fees = 0; + if ($this->gift) + { + $wrapping_fees = (float)(Configuration::get('PS_GIFT_WRAPPING_PRICE')); + if ($withTaxes) + { + $wrapping_fees_tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX'))); + $wrapping_fees *= 1 + (((float)($wrapping_fees_tax->rate) / 100)); + } + $wrapping_fees = Tools::convertPrice(Tools::ps_round($wrapping_fees, 2), Currency::getCurrencyInstance((int)($this->id_currency))); + } + + if ($type != Cart::ONLY_PRODUCTS) + { + $discounts = array(); + /* Firstly get all discounts, looking for a free shipping one (in order to substract shipping fees to the total amount) */ + if ($discountIds = $this->getDiscounts(true)) + { + foreach ($discountIds AS $id_discount) + { + $discount = new Discount((int)($id_discount['id_discount'])); + if (Validate::isLoadedObject($discount)) + { + $discounts[] = $discount; + if ($discount->id_discount_type == 3) + foreach($products AS $product) + { + $categories = Discount::getCategories($discount->id); + if (count($categories) AND Product::idIsOnCategoryId($product['id_product'], $categories)) + { + if($type == Cart::ONLY_DISCOUNTS) + $order_total -= $shipping_fees; + $shipping_fees = 0; + break; + } + } + } + } + /* Secondly applying all vouchers to the correct amount */ + $shrunk = false; + foreach ($discounts AS $discount) + if ($discount->id_discount_type != 3) + { + $order_total -= Tools::ps_round((float)($discount->getValue(sizeof($discounts), $order_total_products, $shipping_fees, $this->id, (int)($withTaxes))), 2); + if ($discount->id_discount_type == 2) + if (in_array($discount->behavior_not_exhausted, array(1,2))) + $shrunk = true; + } + + $order_total_discount = 0; + if ($shrunk AND $order_total < (-$wrapping_fees - $order_total_products - $shipping_fees)) + $order_total_discount = -$wrapping_fees - $order_total_products - $shipping_fees; + else + $order_total_discount = $order_total; + } + } + + if ($type == Cart::ONLY_SHIPPING) return $shipping_fees; + if ($type == Cart::ONLY_WRAPPING) return $wrapping_fees; + if ($type == Cart::BOTH) $order_total += $shipping_fees + $wrapping_fees; + if ($order_total < 0 AND $type != Cart::ONLY_DISCOUNTS) return 0; + if ($type == Cart::ONLY_DISCOUNTS AND isset($order_total_discount)) + return Tools::ps_round((float)($order_total_discount), 2); + return Tools::ps_round((float)($order_total), 2); + } + + /** + * Return shipping total + * + * @param integer $id_carrier Carrier ID (default : current carrier) + * @return float Shipping total + */ + function getOrderShippingCost($id_carrier = NULL, $useTax = true) + { + global $defaultCountry; + + if ($this->isVirtualCart()) + return 0; + + // Checking discounts in cart + $products = $this->getProducts(); + $discounts = $this->getDiscounts(true); + if ($discounts) + foreach ($discounts AS $id_discount) + if ($id_discount['id_discount_type'] == 3) + { + if ($id_discount['minimal'] > 0) + { + $total_cart = 0; + + $categories = Discount::getCategories((int)($id_discount['id_discount'])); + if (sizeof($categories)) + foreach($products AS $product) + if (Product::idIsOnCategoryId((int)($product['id_product']), $categories)) + $total_cart += $product['total_wt']; + + if ($total_cart >= $id_discount['minimal']) + return 0; + } + else + return 0; + } + + // Order total in default currency without fees + $order_total = $this->getOrderTotal(true, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING); + + // Start with shipping cost at 0 + $shipping_cost = 0; + + // If no product added, return 0 + if ($order_total <= 0 AND !(int)(self::getNbProducts($this->id))) + return $shipping_cost; + + // Get id zone + if (isset($this->id_address_delivery) + AND $this->id_address_delivery + AND Customer::customerHasAddress($this->id_customer, $this->id_address_delivery)) + $id_zone = Address::getZoneById((int)($this->id_address_delivery)); + else + { + // This method can be called from the backend, and $defaultCountry won't be defined + if (!Validate::isLoadedObject($defaultCountry)) + $defaultCountry = new Country(Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT')); + $id_zone = (int)$defaultCountry->id_zone; + } + + // If no carrier, select default one + if (!$id_carrier) + $id_carrier = $this->id_carrier; + + if ($id_carrier && !$this->isCarrierInRange($id_carrier, $id_zone)) + $id_carrier = ''; + + if (empty($id_carrier) && $this->isCarrierInRange(Configuration::get('PS_CARRIER_DEFAULT'), $id_zone)) + $id_carrier = (int)(Configuration::get('PS_CARRIER_DEFAULT')); + + if (empty($id_carrier)) + { + if ((int)($this->id_customer)) + { + $customer = new Customer((int)($this->id_customer)); + $result = Carrier::getCarriers((int)(Configuration::get('PS_LANG_DEFAULT')), true, false, (int)($id_zone), $customer->getGroups()); + unset($customer); + } + else + $result = Carrier::getCarriers((int)(Configuration::get('PS_LANG_DEFAULT')), true, false, (int)($id_zone)); + + $resultsArray = array(); + foreach ($result AS $k => $row) + { + if ($row['id_carrier'] == Configuration::get('PS_CARRIER_DEFAULT')) + continue; + + if (!isset(self::$_carriers[$row['id_carrier']])) + self::$_carriers[$row['id_carrier']] = new Carrier((int)($row['id_carrier'])); + + $carrier = self::$_carriers[$row['id_carrier']]; + + // Get only carriers that are compliant with shipping method + if (($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT AND $carrier->getMaxDeliveryPriceByWeight($id_zone) === false) + OR ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE AND $carrier->getMaxDeliveryPriceByPrice($id_zone) === false)) + { + unset($result[$k]); + continue ; + } + + // If out-of-range behavior carrier is set on "Desactivate carrier" + if ($row['range_behavior']) + { + // Get only carriers that have a range compatible with cart + if (($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT AND (!Carrier::checkDeliveryPriceByWeight($row['id_carrier'], $this->getTotalWeight(), $id_zone))) + OR ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE AND (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, (int)($this->id_currency))))) + { + unset($result[$k]); + continue ; + } + } + + if ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) + { + $shipping = $carrier->getDeliveryPriceByWeight($this->getTotalWeight(), $id_zone); + + if (!isset($tmp)) + $tmp = $shipping; + + if ($shipping <= $tmp) + $id_carrier = (int)($row['id_carrier']); + } + else // by price + { + $shipping = $carrier->getDeliveryPriceByPrice($order_total, $id_zone, (int)($this->id_currency)); + + if (!isset($tmp)) + $tmp = $shipping; + + if ($shipping <= $tmp) + $id_carrier = (int)($row['id_carrier']); + } + } + } + + if (empty($id_carrier)) + $id_carrier = Configuration::get('PS_CARRIER_DEFAULT'); + + if (!isset(self::$_carriers[$id_carrier])) + self::$_carriers[$id_carrier] = new Carrier((int)($id_carrier), Configuration::get('PS_LANG_DEFAULT')); + $carrier = self::$_carriers[$id_carrier]; + if (!Validate::isLoadedObject($carrier)) + die(Tools::displayError('Fatal error: "no default carrier"')); + if (!$carrier->active) + return $shipping_cost; + + // Free fees if free carrier + if ($carrier->is_free == 1) + return 0; + + // Select carrier tax + if ($useTax AND !Tax::excludeTaxeOption()) + $carrierTax = Tax::getCarrierTaxRate((int)$carrier->id, (int)$this->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + + $configuration = Configuration::getMultiple(array('PS_SHIPPING_FREE_PRICE', 'PS_SHIPPING_HANDLING', 'PS_SHIPPING_METHOD', 'PS_SHIPPING_FREE_WEIGHT')); + // Free fees + $free_fees_price = 0; + if (isset($configuration['PS_SHIPPING_FREE_PRICE'])) + $free_fees_price = Tools::convertPrice((float)($configuration['PS_SHIPPING_FREE_PRICE']), Currency::getCurrencyInstance((int)($this->id_currency))); + $orderTotalwithDiscounts = $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING); + if ($orderTotalwithDiscounts >= (float)($free_fees_price) AND (float)($free_fees_price) > 0) + return $shipping_cost; + if (isset($configuration['PS_SHIPPING_FREE_WEIGHT']) AND $this->getTotalWeight() >= (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) AND (float)($configuration['PS_SHIPPING_FREE_WEIGHT']) > 0) + return $shipping_cost; + + // Get shipping cost using correct method + if ($carrier->range_behavior) + { + // Get id zone + if ( + isset($this->id_address_delivery) + AND $this->id_address_delivery + AND Customer::customerHasAddress($this->id_customer, $this->id_address_delivery) + ) + $id_zone = Address::getZoneById((int)($this->id_address_delivery)); + else + $id_zone = (int)$defaultCountry->id_zone; + if (($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT AND (!Carrier::checkDeliveryPriceByWeight($carrier->id, $this->getTotalWeight(), $id_zone))) + OR ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_PRICE AND (!Carrier::checkDeliveryPriceByPrice($carrier->id, $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, (int)($this->id_currency))))) + $shipping_cost += 0; + else { + if ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) + $shipping_cost += $carrier->getDeliveryPriceByWeight($this->getTotalWeight(), $id_zone); + else // by price + $shipping_cost += $carrier->getDeliveryPriceByPrice($order_total, $id_zone, (int)($this->id_currency)); + } + } + else + { + if ($carrier->getShippingMethod() == Carrier::SHIPPING_METHOD_WEIGHT) + $shipping_cost += $carrier->getDeliveryPriceByWeight($this->getTotalWeight(), $id_zone); + else + $shipping_cost += $carrier->getDeliveryPriceByPrice($order_total, $id_zone, (int)($this->id_currency)); + + } + // Adding handling charges + if (isset($configuration['PS_SHIPPING_HANDLING']) AND $carrier->shipping_handling) + $shipping_cost += (float)($configuration['PS_SHIPPING_HANDLING']); + + $shipping_cost = Tools::convertPrice($shipping_cost, Currency::getCurrencyInstance((int)($this->id_currency))); + + // Additional Shipping Cost per product + foreach($products AS $product) + $shipping_cost += $product['additional_shipping_cost'] * $product['cart_quantity']; + + //get external shipping cost from module + if ($carrier->shipping_external) + { + $moduleName = $carrier->external_module_name; + $module = Module::getInstanceByName($moduleName); + if (key_exists('id_carrier', $module)) + $module->id_carrier = $carrier->id; + if($carrier->need_range) + $shipping_cost = $module->getOrderShippingCost($this, $shipping_cost); + else + $shipping_cost = $module->getOrderShippingCostExternal($this); + + // Check if carrier is available + if ($shipping_cost === false) + return false; + } + + // Apply tax + if (isset($carrierTax)) + $shipping_cost *= 1 + ($carrierTax / 100); + + return (float)(Tools::ps_round((float)($shipping_cost), 2)); + } + + /** + * Return cart weight + * + * @return float Cart weight + */ + public function getTotalWeight() + { + if (!isset(self::$_totalWeight[$this->id])) + { + $result = Db::getInstance()->getRow(' + SELECT SUM((p.`weight` + pa.`weight`) * cp.`quantity`) as nb + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.`id_product` = p.`id_product` + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON cp.`id_product_attribute` = pa.`id_product_attribute` + WHERE (cp.`id_product_attribute` IS NOT NULL AND cp.`id_product_attribute` != 0) + AND cp.`id_cart` = '.(int)($this->id)); + $result2 = Db::getInstance()->getRow(' + SELECT SUM(p.`weight` * cp.`quantity`) as nb + FROM `'._DB_PREFIX_.'cart_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.`id_product` = p.`id_product` + WHERE (cp.`id_product_attribute` IS NULL OR cp.`id_product_attribute` = 0) + AND cp.`id_cart` = '.(int)($this->id)); + self::$_totalWeight[$this->id] = round((float)($result['nb']) + (float)($result2['nb']), 3); + } + return self::$_totalWeight[$this->id]; + } + + /** + * Check discount validity + * + * @return mixed Return a string if an error occurred and false otherwise + */ + function checkDiscountValidity($discountObj, $discounts, $order_total, $products, $checkCartDiscount = false, $id_group_shop = false, $id_shop = false) + { + global $cookie; + + if (!$order_total) + return Tools::displayError('Cannot add voucher if order is free.'); + if (!$discountObj->active) + return Tools::displayError('This voucher has already been used or is disabled.'); + if (!$discountObj->quantity) + return Tools::displayError('This voucher has expired (usage limit attained).'); + if ($discountObj->id_discount_type == 2 AND $this->id_currency != $discountObj->id_currency) + return Tools::displayError('This voucher can only be used in the following currency:').' + '.Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT `name` FROM `'._DB_PREFIX_.'currency` WHERE id_currency = '.(int)$discountObj->id_currency); + if ($checkCartDiscount + AND ( + $this->getDiscountsCustomer($discountObj->id) >= $discountObj->quantity_per_user + OR (Order::getDiscountsCustomer((int)($cookie->id_customer), $discountObj->id) + $this->getDiscountsCustomer($discountObj->id) >= $discountObj->quantity_per_user) >= $discountObj->quantity_per_user + ) + ) + return Tools::displayError('You cannot use this voucher anymore (usage limit attained).'); + if (strtotime($discountObj->date_from) > time()) + return Tools::displayError('This voucher is not yet valid'); + if (strtotime($discountObj->date_to) < time()) + return Tools::displayError('This voucher has expired.'); + if ($id_group_shop AND $id_shop) + if (!$discountObj->availableWithShop((int)$id_group_shop, (int)$id_shop)) + return Tools::displayError('This voucher is not available with this shop.'); + if (sizeof($discounts) >= 1 AND $checkCartDiscount) + { + if (!$discountObj->cumulable) + return Tools::displayError('This voucher is not valid with other current discounts.'); + foreach ($discounts as $discount) + if (!$discount['cumulable']) + return Tools::displayError('Voucher is not valid with other discounts.'); + + foreach($discounts as $discount) + if($discount['id_discount'] == $discountObj->id) + return Tools::displayError('This voucher is already in your cart'); + } + + $groups = Customer::getGroupsStatic($this->id_customer); + + if (($discountObj->id_customer OR $discountObj->id_group) AND ($this->id_customer != $discountObj->id_customer AND !in_array($discountObj->id_group, $groups))) + { + if (!$cookie->isLogged()) + return Tools::displayError('You cannot use this voucher.').' - '.Tools::displayError('Please log in.'); + return Tools::displayError('You cannot use this voucher.'); + } + $currentDate = date('Y-m-d'); + $onlyProductWithDiscount = true; + if (!$discountObj->cumulable_reduction) + { + foreach ($products as $product) + if (!$product['reduction_applies'] AND !$product['on_sale']) + $onlyProductWithDiscount = false; + } + if (!$discountObj->cumulable_reduction AND $onlyProductWithDiscount) + return Tools::displayError('This voucher is not valid for marked or reduced products.'); + $total_cart = 0; + $categories = Discount::getCategories($discountObj->id); + $returnErrorNoProductCategory = true; + foreach($products AS $product) + { + if(count($categories)) + if (Product::idIsOnCategoryId($product['id_product'], $categories)) + { + if ((!$discountObj->cumulable_reduction AND !$product['reduction_applies'] AND !$product['on_sale']) OR $discountObj->cumulable_reduction) + $total_cart += $product['total_wt']; + $returnErrorNoProductCategory = false; + } + } + if ($returnErrorNoProductCategory) + return Tools::displayError('This discount does not apply to that product category.'); + if ($total_cart < $discountObj->minimal) + return Tools::displayError('The order total is not high enough or this voucher cannot be used with those products.'); + return false; + } + + /** + * @param Discount $discountObj + * @return bool + * @deprecated + */ + public function hasProductInCategory($discountObj) + { + Tools::displayAsDeprecated(); + $products = $this->getProducts(); + $categories = Discount::getCategories($discountObj->id); + foreach ($products AS $product) + { + if (Product::idIsOnCategoryId($product['id_product'], $categories)) + return true; + } + return false; + } + + /** + * Return useful informations for cart + * + * @return array Cart details + */ + function getSummaryDetails() + { + global $cookie; + + $delivery = new Address((int)($this->id_address_delivery)); + $invoice = new Address((int)($this->id_address_invoice)); + + $total_tax = $this->getOrderTotal() - $this->getOrderTotal(false); + + if ($total_tax < 0) + $total_tax = 0; + + $total_free_ship = 0; + if ($free_ship = Tools::convertPrice((float)(Configuration::get('PS_SHIPPING_FREE_PRICE')), new Currency((int)($this->id_currency)))) + { + $discounts = $this->getDiscounts(); + $total_free_ship = $free_ship - ($this->getOrderTotal(true, Cart::ONLY_PRODUCTS) + $this->getOrderTotal(true, Cart::ONLY_DISCOUNTS)); + foreach ($discounts as $discount) + if ($discount['id_discount_type'] == 3) + { + $total_free_ship = 0; + break; + } + } + + return array( + 'delivery' => $delivery, + 'delivery_state' => State::getNameById($delivery->id_state), + 'invoice' => $invoice, + 'invoice_state' => State::getNameById($invoice->id_state), + 'carrier' => new Carrier((int)($this->id_carrier), $cookie->id_lang), + 'products' => $this->getProducts(false), + 'discounts' => $this->getDiscounts(false, true), + 'is_virtual_cart' => (int)$this->isVirtualCart(), + 'total_discounts' => $this->getOrderTotal(true, Cart::ONLY_DISCOUNTS), + 'total_discounts_tax_exc' => $this->getOrderTotal(false, Cart::ONLY_DISCOUNTS), + 'total_wrapping' => $this->getOrderTotal(true, Cart::ONLY_WRAPPING), + 'total_wrapping_tax_exc' => $this->getOrderTotal(false, Cart::ONLY_WRAPPING), + 'total_shipping' => $this->getOrderShippingCost(), + 'total_shipping_tax_exc' => $this->getOrderShippingCost(NULL, false), + 'total_products_wt' => $this->getOrderTotal(true, Cart::ONLY_PRODUCTS), + 'total_products' => $this->getOrderTotal(false, Cart::ONLY_PRODUCTS), + 'total_price' => $this->getOrderTotal(), + 'total_tax' => $total_tax, + 'total_price_without_tax' => $this->getOrderTotal(false), + 'free_ship' => $total_free_ship); + } + + /** + * Return carts thats have not been converted in orders + * + * @param string $dateFrom Select only cart updated after this date + * @param string $dateTo Select only cart updated before this date + * @return array Carts + * @deprecated + */ + static function getNonOrderedCarts($dateFrom, $dateTo) + { + Tools::displayAsDeprecated(); + if (!Validate::isDate($dateFrom) OR !Validate::isDate($dateTo)) + die (Tools::displayError()); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT cart.`id_cart`, cart.`date_upd`, c.`id_customer` AS id_customer, c.`lastname` AS customer_lastname, c.`firstname` AS customer_firstname, + SUM(cp.`quantity`) AS nb_products, + COUNT(cd.`id_cart`) AS nb_discounts + FROM `'._DB_PREFIX_.'cart` cart + LEFT JOIN `'._DB_PREFIX_.'cart_product` cp ON cart.`id_cart` = cp.`id_cart` + LEFT JOIN `'._DB_PREFIX_.'cart_discount` cd ON cart.`id_cart` = cd.`id_cart` + LEFT JOIN `'._DB_PREFIX_.'customer` c ON cart.`id_customer` = c.`id_customer` + WHERE cart.`id_cart` NOT IN (SELECT `id_cart` FROM `'._DB_PREFIX_.'orders`) + AND TO_DAYS(cart.`date_upd`) >= TO_DAYS(\''.pSQL(strftime('%Y-%m-%d %H:%M:%S', strtotime($dateFrom))).'\') + AND TO_DAYS(cart.`date_upd`) <= TO_DAYS(\''.pSQL(strftime('%Y-%m-%d %H:%M:%S', strtotime($dateTo))).'\') + GROUP BY cart.`id_cart`, cp.`id_cart`, cd.`id_cart` + ORDER BY cart.`date_upd` DESC'); + } + + public function checkQuantities() + { + if (Configuration::get('PS_CATALOG_MODE')) + return false; + foreach ($this->getProducts() AS $product) + if (!$product['active'] OR (!$product['allow_oosp'] AND $product['stock_quantity'] < $product['cart_quantity']) OR !$product['available_for_order']) + return false; + return true; + } + + static public function lastNoneOrderedCart($id_customer) + { + $sql = 'SELECT c.`id_cart` + FROM '._DB_PREFIX_.'cart c + LEFT JOIN '._DB_PREFIX_.'orders o ON (c.`id_cart` = o.`id_cart`) + WHERE c.`id_customer` = '.(int)($id_customer).' + AND o.`id_cart` IS NULL + '.Shop::sqlRestriction(true, 'c').' + ORDER BY c.`date_upd` DESC'; + if (!$id_cart = Db::getInstance()->getValue($sql)) + return false; + return $id_cart; + } + + /** + * Check if cart contains only virtual products + * @return boolean true if is a virtual cart or false + * + */ + public function isVirtualCart() + { + if (!isset(self::$_isVirtualCart[$this->id])) + { + $products = $this->getProducts(); + + if (!sizeof($products)) + return false; + + $list = ''; + foreach ($products AS $product) + $list .= (int)($product['id_product']).','; + $list = rtrim($list, ','); + + $n = (int)Db::getInstance()->getValue(' + SELECT COUNT(`id_product_download`) n + FROM `'._DB_PREFIX_.'product_download` + WHERE `id_product` IN ('.pSQL($list).') AND `active` = 1'); + + self::$_isVirtualCart[$this->id] = ($n == sizeof($products)); + } + return self::$_isVirtualCart[$this->id]; + } + + static public function getCartByOrderId($id_order) + { + if ($id_cart = self::getCartIdByOrderId($id_order)) + return new Cart((int)($id_cart)); + + return false; + } + + static public function getCartIdByOrderId($id_order) + { + $result = Db::getInstance()->getRow('SELECT `id_cart` FROM '._DB_PREFIX_.'orders WHERE `id_order` = '.(int)$id_order); + if (!$result OR empty($result) OR !key_exists('id_cart', $result)) + return false; + return $result['id_cart']; + } + + /* + * Add customer's pictures + * + * @return bool Always true + */ + public function addPictureToProduct($id_product, $index, $identifier) + { + global $cookie; + + $varName = 'pictures_'.(int)($id_product).'_'.(int)($index); + if ($cookie->$varName) + { + @unlink(_PS_UPLOAD_DIR_.$cookie->$varName); + @unlink(_PS_UPLOAD_DIR_.$cookie->$varName.'_small'); + } + $cookie->$varName = $identifier; + return true; + } + + /* + * Add customer's text + * + * @return bool Always true + */ + public function addTextFieldToProduct($id_product, $index, $textValue) + { + global $cookie; + $textValue = str_replace(array("\n", "\r"), '', nl2br($textValue)); + $textValue = str_replace('\\', '\\\\', $textValue); + $textValue = str_replace('\'', '\\\'', $textValue); + $cookie->{'textFields_'.(int)($id_product).'_'.(int)($index)} = $textValue; + return true; + } + + /* + * Delete customer's text + * + * @return bool Always true + */ + public function deleteTextFieldFromProduct($id_product, $index) + { + global $cookie; + + unset($cookie->{'textFields_'.(int)($id_product).'_'.(int)($index)}); + return true; + } + + /* + * Remove a customer's picture + * + * @return bool + */ + public function deletePictureToProduct($id_product, $index) + { + global $cookie; + + $varName = 'pictures_'.(int)($id_product).'_'.(int)($index); + // if cookie->varName is empty, use index which is the name of the picture + $picture = !empty($cookie->$varName)?$cookie->$varName:$index; + if ($picture) + { + if (!@unlink(_PS_UPLOAD_DIR_.$picture) OR !@unlink(_PS_UPLOAD_DIR_.$picture.'_small')) + return false; + unset($cookie->$varName); + return true; + } + return false; + } + + static public function deleteCustomizationInformations($id_product) + { + global $cookie; + + $cookie->unsetFamily('pictures_'.(int)($id_product).'_'); + $cookie->unsetFamily('textFields_'.(int)($id_product).'_'); + return true; + } + + static public function getCustomerCarts($id_customer) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'cart c + WHERE c.`id_customer` = '.(int)($id_customer).' + ORDER BY c.`date_add` DESC'); + return $result; + } + + static public function replaceZeroByShopName($echo, $tr) + { + return ($echo == '0' ? Configuration::get('PS_SHOP_NAME') : $echo); + } + + /* DEPRECATED */ + public function getCustomeremail() + { + Tools::displayAsDeprecated(); + $customer = new Customer((int)($this->id_customer)); + return $customer->email; + } + + public function duplicate() + { + if (!Validate::isLoadedObject($this)) + return false; + $cart = new Cart($this->id); + $cart->id = NULL; + $cart->id_shop = $this->id_shop; + $cart->id_group_shop = $this->id_group_shop; + + $cart->add(); + + if (!Validate::isLoadedObject($cart)) + return false; + $success = true; + $products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'cart_product` WHERE `id_cart` = '.(int)$this->id); + foreach ($products AS $product) + $success &= $cart->updateQty($product['quantity'], (int)$product['id_product'], (int)$product['id_product_attribute'], NULL, 'up', (int)$cart->id_shop, (int)$cart->id_group_shop); + + // Customized products + $customs = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'customization c + LEFT JOIN '._DB_PREFIX_.'customized_data cd ON cd.id_customization = c.id_customization + WHERE c.id_cart = '.(int)$this->id); + + // Group line by id_customization + $customsById = array(); + foreach ($customs AS $custom) + { + if(!isset($customsById[$custom['id_customization']])) + $customsById[$custom['id_customization']] = array(); + $customsById[$custom['id_customization']][] = $custom; + } + + // Insert new customizations + $custom_ids = array(); + foreach($customsById as $customizationId => $val) + { + Db::getInstance(_PS_USE_SQL_SLAVE_)->Execute(' + INSERT INTO '._DB_PREFIX_.'customization (id_customization, id_cart, id_product_attribute, id_product, quantity) + VALUES(\'\', '.(int)$cart->id.', '.(int)$custom['id_product_attribute'].', '.(int)$custom['id_product'].', '.(int)$custom['quantity'].')'); + $custom_ids[$custom['id_customization']] = Db::getInstance(_PS_USE_SQL_SLAVE_)->Insert_ID(); + } + + // Insert customized_data + if (sizeof($customs)) + { + $first = true; + $sql_custom_data = 'INSERT INTO '._DB_PREFIX_.'customized_data (`id_customization`, `type`, `index`, `value`) VALUES '; + foreach ($customs AS $custom) + { + if(!$first) + $sql_custom_data .= ','; + else + $first = false; + $sql_custom_data .= '('.(int)$custom_ids[$custom['id_customization']].', '.(int)$custom['type'].', '.(int)$custom['index'].', \''.pSQL($custom['value']).'\')'; + } + Db::getInstance(_PS_USE_SQL_SLAVE_)->Execute($sql_custom_data); + } + + return array('cart' => $cart, 'success' => $success); + } + + public function getWsCartRows() + { + $query = 'SELECT id_product, id_product_attribute, quantity + FROM `'._DB_PREFIX_.'cart_product` + WHERE id_cart = '.(int)$this->id; + $result = Db::getInstance()->executeS($query); + return $result; + } + + public function setWsCartRows($values) + { + if ($this->deleteAssociations()) + { + $query = 'INSERT INTO `'._DB_PREFIX_.'cart_product`(`id_cart`, `id_product`, `id_product_attribute`, `quantity`, `date_add`) VALUES '; + foreach ($values as $value) + $query .= '('.(int)$this->id.', '.(int)$value['id_product'].', '.(int)$value['id_product_attribute'].', '.(int)$value['quantity'].', NOW()),'; + $result = Db::getInstance()->Execute(rtrim($query, ',')); + } + return true; + } + + public function deleteAssociations() + { + return (Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_cart` = '.(int)($this->id)) !== false); + } + + /** + * isGuestCartByCartId + * + * @param int $id_cart + * @return bool true if cart has been made by a guest customer + */ + static public function isGuestCartByCartId($id_cart) + { + if (!(int)$id_cart) + return false; + return (bool)Db::getInstance()->getValue(' + SELECT `is_guest` + FROM `'._DB_PREFIX_.'customer` cu + LEFT JOIN `'._DB_PREFIX_.'cart` ca ON (ca.`id_customer` = cu.`id_customer`) + WHERE ca.`id_cart` = '.(int)$id_cart); + } + + /** + * isCarrierInRange + * + * Check if the specified carrier is in range + * + * @id_carrier int + * @id_zone int + */ + public function isCarrierInRange($id_carrier, $id_zone) + { + $carrier = new Carrier((int)$id_carrier, Configuration::get('PS_LANG_DEFAULT')); + $shippingMethod = $carrier->getShippingMethod(); + + if ($shippingMethod == Carrier::SHIPPING_METHOD_FREE) + return true; + if ($shippingMethod == Carrier::SHIPPING_METHOD_WEIGHT + AND (Carrier::checkDeliveryPriceByWeight((int)$id_carrier, $this->getTotalWeight(), $id_zone))) + return true; + if ($shippingMethod == Carrier::SHIPPING_METHOD_PRICE + AND (Carrier::checkDeliveryPriceByPrice((int)$id_carrier, $this->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, (int)$this->id_currency))) + return true; + + return false; + } +} + diff --git a/classes/Category.php b/classes/Category.php new file mode 100644 index 000000000..51fc4cb62 --- /dev/null +++ b/classes/Category.php @@ -0,0 +1,1048 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7515 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CategoryCore extends ObjectModel +{ + public $id; + + /** @var integer category ID */ + public $id_category; + + /** @var string Name */ + public $name; + + /** @var boolean Status for display */ + public $active = 1; + + /** @var integer category position */ + public $position; + + /** @var string Description */ + public $description; + + /** @var integer Parent category ID */ + public $id_parent; + + /** @var integer Parents number */ + public $level_depth; + + /** @var integer Nested tree model "left" value */ + public $nleft; + + /** @var integer Nested tree model "right" value */ + public $nright; + + /** @var string string used in rewrited URL */ + public $link_rewrite; + + /** @var string Meta title */ + public $meta_title; + + /** @var string Meta keywords */ + public $meta_keywords; + + /** @var string Meta description */ + public $meta_description; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $langMultiShop = true; + + public $groupBox; + + protected static $_links = array(); + + protected $tables = array ('category', 'category_lang'); + + protected $fieldsRequired = array('active'); + protected $fieldsSize = array('active' => 1); + protected $fieldsValidate = array('nleft' => 'isUnsignedInt', 'nright' => 'isUnsignedInt', 'level_depth' => 'isUnsignedInt', 'active' => 'isBool', 'id_parent' => 'isUnsignedInt', 'groupBox' => 'isArrayWithIds'); + protected $fieldsRequiredLang = array('name', 'link_rewrite'); + protected $fieldsSizeLang = array('name' => 64, 'link_rewrite' => 64, 'meta_title' => 128, 'meta_description' => 255, 'meta_keywords' => 255); + protected $fieldsValidateLang = array('name' => 'isCatalogName', 'link_rewrite' => 'isLinkRewrite', 'description' => 'isCleanHtml', + 'meta_title' => 'isGenericName', 'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName'); + + protected $table = 'category'; + protected $identifier = 'id_category'; + + /** @var string id_image is the category ID when an image exists and 'default' otherwise */ + public $id_image = 'default'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'categories', + 'hidden_fields' => array('nleft', 'nright', 'groupBox'), + 'fields' => array( + 'id_parent' => array('xlink_resource'=> 'categories'), + 'level_depth' => array('setter' => false), + 'nb_products_recursive' => array('getter' => 'getWsNbProductsRecursive', 'setter' => false), + ), + 'associations' => array( + 'categories' => array('getter' => 'getChildrenWs', 'resource' => 'category', ), + 'products' => array('getter' => 'getProductsWs', 'resource' => 'product', ), + ), + ); + + public function __construct($id_category = NULL, $id_lang = NULL, $id_shop = NULL) + { + parent::__construct($id_category, $id_lang, $id_shop); + $this->id_image = ($this->id AND file_exists(_PS_CAT_IMG_DIR_.(int)($this->id).'.jpg')) ? (int)($this->id) : false; + $this->image_dir = _PS_CAT_IMG_DIR_; + } + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_category'] = (int)($this->id); + $fields['active'] = (int)($this->active); + $fields['id_parent'] = (int)($this->id_parent); + $fields['position'] = (int)($this->position); + $fields['level_depth'] = (int)($this->level_depth); + $fields['nleft'] = (int)($this->nleft); + $fields['nright'] = (int)($this->nright); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'description', 'link_rewrite', 'meta_title', 'meta_keywords', 'meta_description')); + } + + public function add($autodate = true, $nullValues = false) + { + $this->position = self::getLastPosition((int)$this->id_parent); + if (!isset($this->level_depth) OR $this->level_depth != 0) + $this->level_depth = $this->calcLevelDepth(); + $ret = parent::add($autodate); + if (!isset($this->doNotRegenerateNTree) OR !$this->doNotRegenerateNTree) + self::regenerateEntireNtree(); + $this->updateGroup($this->groupBox); + Module::hookExec('categoryAddition', array('category' => $this)); + return $ret; + } + + /** + * update category positions in parent + * + * @param mixed $nullValues + * @return void + */ + public function update($nullValues = false) + { + // Update group selection + $this->updateGroup($this->groupBox); + $this->level_depth = $this->calcLevelDepth(); + $this->cleanPositions((int)$this->id_parent); + // If the parent category was changed, we don't want to have 2 categories with the same position + if ($this->getDuplicatePosition()) + $this->position = self::getLastPosition((int)$this->id_parent); + $ret = parent::update($nullValues); + if (!isset($this->doNotRegenerateNTree) OR !$this->doNotRegenerateNTree) + self::regenerateEntireNtree(); + Module::hookExec('categoryUpdate', array('category' => $this)); + return $ret; + } + + /** + * Recursive scan of subcategories + * + * @param integer $maxDepth Maximum depth of the tree (i.e. 2 => 3 levels depth) + * @param integer $currentDepth specify the current depth in the tree (don't use it, only for rucursivity!) + * @param array $excludedIdsArray specify a list of ids to exclude of results + * @param integer $idLang Specify the id of the language used + * + * @return array Subcategories lite tree + */ + function recurseLiteCategTree($maxDepth = 3, $currentDepth = 0, $idLang = NULL, $excludedIdsArray = NULL) + { + global $link; + + $idLang = is_null($idLang) ? _USER_ID_LANG_ : (int)($idLang); + + $children = array(); + if (($maxDepth == 0 OR $currentDepth < $maxDepth) AND $subcats = $this->getSubCategories((int)$idLang, true) AND sizeof($subcats)) + foreach ($subcats AS &$subcat) + { + if (!$subcat['id_category']) + break; + elseif (!is_array($excludedIdsArray) || !in_array($subcat['id_category'], $excludedIdsArray)) + { + $categ = new Category((int)$subcat['id_category'], (int)$idLang); + $children[] = $categ->recurseLiteCategTree($maxDepth, $currentDepth + 1, (int)$idLang, $excludedIdsArray); + } + } + + return array( + 'id' => (int)$this->id_category, + 'link' => $link->getCategoryLink((int)$this->id, $this->link_rewrite), + 'name' => $this->name, + 'desc'=> $this->description, + 'children' => $children + ); + } + + static public function recurseCategory($categories, $current, $id_category = 1, $id_selected = 1) + { + global $currentIndex; + echo ''; + if (isset($categories[$id_category])) + foreach ($categories[$id_category] AS $key => $row) + self::recurseCategory($categories, $categories[$id_category][$key], $key, $id_selected); + } + + + /** + * Recursively add specified category childs to $toDelete array + * + * @param array &$toDelete Array reference where categories ID will be saved + * @param array $id_category Parent category ID + */ + protected function recursiveDelete(&$toDelete, $id_category) + { + if (!is_array($toDelete) OR !$id_category) + die(Tools::displayError()); + + $result = Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'category` + WHERE `id_parent` = '.(int)($id_category)); + foreach ($result AS $k => $row) + { + $toDelete[] = (int)($row['id_category']); + $this->recursiveDelete($toDelete, (int)($row['id_category'])); + } + } + + public function delete() + { + if ((int)($this->id) === 0 OR (int)($this->id) === 1) return false; + + $this->clearCache(); + + /* Get childs categories */ + $toDelete = array((int)($this->id)); + $this->recursiveDelete($toDelete, (int)($this->id)); + $toDelete = array_unique($toDelete); + + /* Delete category and its child from database */ + $list = sizeof($toDelete) > 1 ? implode(',', array_map('intval',$toDelete)) : (int)($this->id); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category` WHERE `id_category` IN ('.$list.')'); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_lang` WHERE `id_category` IN ('.$list.')'); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_category` IN ('.$list.')'); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_group` WHERE `id_category` IN ('.$list.')'); + + self::cleanPositions($this->id_parent); + + /* Delete category images and its children images */ + $tmpCategory= new Category(); + foreach ($toDelete AS $id_category) + { + $tmpCategory->id = (int)$id_category; + $tmpCategory->deleteImage(); + } + + /* Delete products which were not in others categories */ + $result = Db::getInstance()->ExecuteS(' + SELECT `id_product` + FROM `'._DB_PREFIX_.'product` + WHERE `id_product` NOT IN (SELECT `id_product` FROM `'._DB_PREFIX_.'category_product`)'); + foreach ($result as $p) + { + $product = new Product((int)$p['id_product']); + if (Validate::isLoadedObject($product)) + $product->delete(); + } + + /* Set category default to 1 where categorie no more exists */ + $result = Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product` + SET `id_category_default` = 1 + WHERE `id_category_default` + NOT IN (SELECT `id_category` FROM `'._DB_PREFIX_.'category`)'); + + /* Rebuild the nested tree */ + if (!isset($this->doNotRegenerateNTree) OR !$this->doNotRegenerateNTree) + self::regenerateEntireNtree(); + + Module::hookExec('categoryDeletion', array('category' => $this)); + return true; + } + + /** + * Delete several categories from database + * + * return boolean Deletion result + */ + public function deleteSelection($categories) + { + $return = 1; + foreach ($categories AS $id_category) + { + $category = new Category((int)($id_category)); + $return &= $category->delete(); + } + return $return; + } + + /** + * Get the depth level for the category + * + * @return integer Depth level + */ + public function calcLevelDepth() + { + /* Root category */ + if (!$this->id_parent) + return 0; + + $parentCategory = new Category((int)($this->id_parent)); + if (!Validate::isLoadedObject($parentCategory)) + die('parent category does not exist'); + return $parentCategory->level_depth + 1; + } + + /** + * Re-calculate the values of all branches of the nested tree + */ + public static function regenerateEntireNtree() + { + $categories = Db::getInstance()->ExecuteS('SELECT id_category, id_parent FROM '._DB_PREFIX_.'category ORDER BY id_category ASC'); + $categoriesArray = array(); + foreach ($categories AS $category) + $categoriesArray[(int)$category['id_parent']]['subcategories'][(int)$category['id_category']] = 1; + $n = 1; + self::_subTree($categoriesArray, 1, $n); + } + + protected static function _subTree(&$categories, $id_category, &$n) + { + $left = (int)$n++; + if (isset($categories[(int)$id_category]['subcategories'])) + foreach ($categories[(int)$id_category]['subcategories'] AS $id_subcategory => $value) + self::_subTree($categories, (int)$id_subcategory, $n); + $right = (int)$n++; + + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'category SET nleft = '.(int)$left.', nright = '.(int)$right.' WHERE id_category = '.(int)$id_category.' LIMIT 1'); + } + + /** + * Return available categories + * + * @param integer $id_lang Language ID + * @param boolean $active return only active categories + * @return array Categories + */ + static public function getCategories($id_lang = false, $active = true, $order = true, $sql_filter = '', $sql_sort = '',$sql_limit = '', $id_shop = false) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON c.`id_category` = cl.`id_category` + WHERE 1 '.$sql_filter.' '.($id_lang ? 'AND `id_lang` = '.(int)($id_lang) : '').' + '.($active ? 'AND `active` = 1' : '').' + '.(!$id_lang ? 'GROUP BY c.id_category' : '').' + '.($sql_sort != '' ? $sql_sort : 'ORDER BY c.`level_depth` ASC, c.`position` ASC').' + '.($sql_limit != '' ? $sql_limit : '') + ); + + if (!$order) + return $result; + + $categories = array(); + foreach ($result AS $row) + $categories[$row['id_parent']][$row['id_category']]['infos'] = $row; + + return $categories; + } + + static public function getSimpleCategories($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_category`, cl.`name` + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`) + WHERE cl.`id_lang` = '.(int)$id_lang.' + GROUP BY c.id_category + ORDER BY c.`position`'); + } + + /** + * Return current category childs + * + * @param integer $id_lang Language ID + * @param boolean $active return only active categories + * @return array Categories + */ + public function getSubCategories($id_lang, $active = true) + { + global $cookie; + if (!Validate::isBool($active)) + die(Tools::displayError()); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.*, cl.id_lang, cl.name, cl.description, cl.link_rewrite, cl.meta_title, cl.meta_keywords, cl.meta_description + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`) + WHERE `id_parent` = '.(int)($this->id).' + '.($active ? 'AND `active` = 1' : '').' + AND cg.`id_group` '.$sqlGroups.' + GROUP BY c.`id_category` + ORDER BY `level_depth` ASC, c.`position` ASC'); + + foreach ($result AS &$row) + { + $row['id_image'] = (file_exists(_PS_CAT_IMG_DIR_.$row['id_category'].'.jpg')) ? (int)($row['id_category']) : Language::getIsoById($id_lang).'-default'; + $row['legend'] = 'no picture'; + } + return $result; + } + + /** + * Return current category products + * + * @param integer $id_lang Language ID + * @param integer $p Page number + * @param integer $n Number of products per page + * @param boolean $getTotal return the number of results instead of the results themself + * @param boolean $active return only active products + * @param boolean $random active a random filter for returned products + * @param int $randomNumberProducts number of products to return if random is activated + * @param boolean $checkAccess set to false to return all products (even if customer hasn't access) + * @return mixed Products or number of products + */ + public function getProducts($id_lang, $p, $n, $orderBy = NULL, $orderWay = NULL, $getTotal = false, $active = true, $random = false, $randomNumberProducts = 1, $checkAccess = true, $id_shop = null) + { + global $cookie; + if (!$checkAccess OR !$this->checkAccess($cookie->id_customer)) + return false; + + if (!$id_shop) + $id_shop_lang = (int)Configuration::get('PS_SHOP_DEFAULT'); + else + $id_shop_lang = (int)$id_shop; + + if ($p < 1) $p = 1; + + if (empty($orderBy)) + $orderBy = 'position'; + else + /* Fix for all modules which are now using lowercase values for 'orderBy' parameter */ + $orderBy = strtolower($orderBy); + + if (empty($orderWay)) + $orderWay = 'ASC'; + if ($orderBy == 'id_product' OR $orderBy == 'date_add') + $orderByPrefix = 'p'; + elseif ($orderBy == 'name') + $orderByPrefix = 'pl'; + elseif ($orderBy == 'manufacturer') + { + $orderByPrefix = 'm'; + $orderBy = 'name'; + } + elseif ($orderBy == 'position') + $orderByPrefix = 'cp'; + + if ($orderBy == 'price') + $orderBy = 'orderprice'; + + if (!Validate::isBool($active) OR !Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + die (Tools::displayError()); + + $id_supplier = (int)(Tools::getValue('id_supplier')); + + /* Return only the number of products */ + if ($getTotal) + { + $sql = 'SELECT COUNT(cp.`id_product`) AS total + FROM `'._DB_PREFIX_.'product` p + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product` + WHERE cp.`id_category` = '.(int)($this->id). + ($active ? ' AND p.`active` = 1' : ''). + ($id_shop ? ' AND ps.id_shop='.(int)$id_shop : ''). + ($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : ''); + return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + $sql = 'SELECT p.*, s.quantity, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, + (p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice + FROM `'._DB_PREFIX_.'category_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) + LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = p.id_product AND s.id_product_attribute = IFNULL(pa.id_product_attribute, 0) '.Shop::sqlSharedStock('s', $id_shop).' + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.' AND cl.`id_shop` = '.(int)$id_shop_lang.') + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.' AND pl.`id_shop` = '.(int)$id_shop_lang.') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` + WHERE cp.`id_category` = '.(int)($this->id) + .($active ? ' AND p.`active` = 1' : '') + .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '') + .($id_shop ? ' AND ps.id_shop='.(int)$id_shop : ''); + if ($random === true) + { + $sql .= ' ORDER BY RAND()'; + $sql .= ' LIMIT 0, '.(int)($randomNumberProducts); + } + else + { + $sql .= ' ORDER BY '.(isset($orderByPrefix) ? $orderByPrefix.'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' + LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n); + } + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if ($orderBy == 'orderprice') + Tools::orderbyPrice($result, $orderWay); + + if (!$result) + return false; + + /* Modify SQL result */ + return Product::getProductsProperties($id_lang, $result); + } + + /** + * Hide category prefix used for position + * + * @param string $name Category name + * @return string Name without position + */ + static public function hideCategoryPosition($name) + { + Tools::displayAsDeprecated(); + return preg_replace('/^[0-9]+\./', '', $name); + } + + /** + * Return main categories + * + * @param integer $id_lang Language ID + * @param boolean $active return only active categories + * @return array categories + */ + public static function getHomeCategories($id_lang, $active = true) + { + return self::getChildren(1, $id_lang, $active); + } + + static public function getRootCategory($id_lang = NULL, $id_shop = false) + { + if (!$id_shop) + $id_shop = Configuration::get('PS_SHOP_DEFAULT'); + $shop = new Shop((int)$id_shop); + $id_category = $shop->getRootCategory(); + + return new Category ((int)$id_category, is_null($id_lang) ? (int)_USER_ID_LANG_ : (int)($id_lang)); + } + + /** + * + * @param int $id_parent + * @param int $id_lang + * @param bool $active + * @return array + */ + public static function getChildren($id_parent, $id_lang, $active = true) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_category`, cl.`name`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON c.`id_category` = cl.`id_category` + WHERE `id_lang` = '.(int)($id_lang).' + AND c.`id_parent` = '.(int)($id_parent).' + '.($active ? 'AND `active` = 1' : '').' + ORDER BY `position` ASC'); + } + + /** + * This method allow to return children categories with the number of sub children selected for a product + * + * @param int $id_parent + * @param int $id_product + * @param int $id_lang + * @return array + */ + public static function getChildrenWithNbSelectedSubCatForProduct($id_parent, $id_product = 0, $ids_categories = null, $id_lang) + { + $categories_product_str = ''; + if ($id_product) + { + $categories_product = Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'category_product` + WHERE `id_product` = '.(int)$id_product); + if (sizeof($categories_product)) + foreach ($categories_product as $category_product) + $categories_product_str .= $category_product['id_category'].','; + } + else + { + $categories_product = array(); + $categories_product_str = $ids_categories; + } + $categories_product_str = rtrim($categories_product_str, ','); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_category`, cl.`name`, IF(( + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'category` c2 + WHERE c2.`id_parent` = c.`id_category` + ) > 0, 1, 0) AS has_children, '.($categories_product_str ? '( + SELECT count(c3.`id_category`) + FROM `'._DB_PREFIX_.'category` c3 + WHERE c3.`nleft` > c.`nleft` + AND c3.`nright` < c.`nright` + AND c3.`id_category` IN ('.$categories_product_str.') + )' : '0').' AS nbSelectedSubCat + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON c.`id_category` = cl.`id_category` + WHERE `id_lang` = '.(int)($id_lang).' + AND c.`id_parent` = '.(int)($id_parent).' + ORDER BY `position` ASC'); + } + + /** + * Copy products from a category to another + * + * @param integer $id_old Source category ID + * @param boolean $id_new Destination category ID + * @return boolean Duplication result + */ + public static function duplicateProductCategories($id_old, $id_new) + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'category_product` + WHERE `id_product` = '.(int)($id_old)); + + $row = array(); + if ($result) + foreach ($result AS $i) + $row[] = '('.implode(', ', array((int)($id_new), $i['id_category'], '(SELECT tmp.max + 1 FROM (SELECT MAX(cp.`position`) AS max FROM `'._DB_PREFIX_.'category_product` cp WHERE cp.`id_category`='.(int)($i['id_category']).') AS tmp)')).')'; + + $flag = Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'category_product` (`id_product`, `id_category`, `position`) VALUES '.implode(',', $row)); + return $flag; + } + + /** + * Check if category can be moved in another one. + * The category cannot be moved in a child category. + * + * @param integer $id_category current category + * @param integer $id_parent Parent candidate + * @return boolean Parent validity + */ + public static function checkBeforeMove($id_category, $id_parent) + { + if ($id_category == $id_parent) return false; + if ($id_parent == 1) return true; + $i = (int)($id_parent); + + while (42) + { + $result = Db::getInstance()->getRow('SELECT `id_parent` FROM `'._DB_PREFIX_.'category` WHERE `id_category` = '.(int)($i)); + if (!isset($result['id_parent'])) return false; + if ($result['id_parent'] == $id_category) return false; + if ($result['id_parent'] == 1) return true; + $i = $result['id_parent']; + } + } + + public static function getLinkRewrite($id_category, $id_lang) + { + if (!Validate::isUnsignedId($id_category) OR !Validate::isUnsignedId($id_lang)) + return false; + + if (isset(self::$_links[$id_category.'-'.$id_lang])) + return self::$_links[$id_category.'-'.$id_lang]; + + $result = Db::getInstance()->getRow(' + SELECT cl.`link_rewrite` + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON c.`id_category` = cl.`id_category` + WHERE `id_lang` = '.(int)($id_lang).' + AND c.`id_category` = '.(int)($id_category)); + self::$_links[$id_category.'-'.$id_lang] = $result['link_rewrite']; + return $result['link_rewrite']; + } + + public function getLink() + { + global $link; + return $link->getCategoryLink($this->id, $this->link_rewrite); + } + + public function getName($id_lang = NULL, $id_shop = false) + { + if (!$id_shop) + $id_shop = (int)Shop::getCurrentShop(true); + if (!$id_lang) + { + global $cookie; + + if (isset($this->name[(int)$id_shop][$cookie->id_lang])) + $id_lang = $cookie->id_lang; + else + $id_lang = (int)(Configuration::get('PS_LANG_DEFAULT')); + } + return isset($this->name[(int)$id_shop][$id_lang]) ? $this->name[(int)$id_shop][$id_lang] : ''; + } + + /** + * Light back office search for categories + * + * @param integer $id_lang Language ID + * @param string $query Searched string + * @param boolean $unrestricted allows search without lang and includes first category and exact match + * @return array Corresponding categories + */ + static public function searchByName($id_lang, $query, $unrestricted = false) + { + if ($unrestricted === true) + return Db::getInstance()->getRow(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`) + WHERE `name` LIKE \''.pSQL($query).'\''); + else + return Db::getInstance()->ExecuteS(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.(int)($id_lang).') + WHERE `name` LIKE \'%'.pSQL($query).'%\' AND c.`id_category` != 1'); + } + + /** + * Retrieve category by name and parent category id + * + * @param integer $id_lang Language ID + * @param string $category_name Searched category name + * @param integer $id_parent_category parent category ID + * @return array Corresponding category + */ + static public function searchByNameAndParentCategoryId($id_lang, $category_name, $id_parent_category) + { + return Db::getInstance()->getRow(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.(int)($id_lang).') + WHERE `name` LIKE \''.pSQL($category_name).'\' + AND c.`id_category` != 1 + AND c.`id_parent` = '.(int)($id_parent_category)); + } + + /** + * Get Each parent category of this category until the root category + * + * @param integer $id_lang Language ID + * @return array Corresponding categories + */ + public function getParentsCategories($idLang = null) + { + //get idLang + $idLang = is_null($idLang) ? _USER_ID_LANG_ : (int)($idLang); + + $categories = null; + $idCurrent = (int)($this->id); + while (true) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.*, cl.* + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.(int)($idLang).') + WHERE c.`id_category` = '.(int)$idCurrent.' AND c.`id_parent` != 0 + '); + + $categories[] = $result[0]; + if(!$result OR $result[0]['id_parent'] == 1) + return $categories; + $idCurrent = $result[0]['id_parent']; + } + } + /** + * Specify if a category already in base + * + * @param $id_category Category id + * @return boolean + */ + static public function categoryExists($id_category) + { + $row = Db::getInstance()->getRow(' + SELECT `id_category` + FROM '._DB_PREFIX_.'category c + WHERE c.`id_category` = '.(int)($id_category)); + + return isset($row['id_category']); + } + + + public function cleanGroups() + { + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_group` WHERE `id_category` = '.(int)($this->id)); + } + + public function addGroups($groups) + { + foreach ($groups as $group) + { + $row = array('id_category' => (int)($this->id), 'id_group' => (int)($group)); + Db::getInstance()->AutoExecute(_DB_PREFIX_.'category_group', $row, 'INSERT'); + } + } + + public function getGroups() + { + $groups = array(); + $result = Db::getInstance()->ExecuteS(' + SELECT cg.`id_group` + FROM '._DB_PREFIX_.'category_group cg + WHERE cg.`id_category` = '.(int)($this->id)); + foreach ($result as $group) + $groups[] = $group['id_group']; + return $groups; + } + + /** + * checkAccess return true if id_customer is in a group allowed to see this category. + * + * @param mixed $id_customer + * @access public + * @return boolean true if access allowed for customer $id_customer + */ + public function checkAccess($id_customer) + { + if (!$id_customer) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT ctg.`id_group` + FROM '._DB_PREFIX_.'category_group ctg + WHERE ctg.`id_category` = '.(int)($this->id).' AND ctg.`id_group` = 1'); + } else { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT ctg.`id_group` + FROM '._DB_PREFIX_.'category_group ctg + INNER JOIN '._DB_PREFIX_.'customer_group cg on (cg.`id_group` = ctg.`id_group` AND cg.`id_customer` = '.(int)($id_customer).') + WHERE ctg.`id_category` = '.(int)($this->id)); + } + if ($result AND isset($result['id_group']) AND $result['id_group']) + return true; + return false; + } + + public function updateGroup($list) + { + $this->cleanGroups(); + if ($list AND sizeof($list)) + $this->addGroups($list); + else + $this->addGroups(array(1)); + } + + static public function setNewGroupForHome($id_group) + { + if (!(int)($id_group)) + return false; + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'category_group` + VALUES (1, '.(int)($id_group).') + '); + } + + public function updatePosition($way, $position) + { + if (!$res = Db::getInstance()->ExecuteS(' + SELECT cp.`id_category`, cp.`position`, cp.`id_parent` + FROM `'._DB_PREFIX_.'category` cp + WHERE cp.`id_parent` = '.(int)$this->id_parent.' + ORDER BY cp.`position` ASC' + )) + return false; + + foreach ($res AS $category) + if ((int)($category['id_category']) == (int)($this->id)) + $movedCategory = $category; + + if (!isset($movedCategory) || !isset($position)) + return false; + // < and > statements rather than BETWEEN operator + // since BETWEEN is treated differently according to databases + $result = (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'category` + SET `position`= `position` '.($way ? '- 1' : '+ 1').' + WHERE `position` + '.($way + ? '> '.(int)($movedCategory['position']).' AND `position` <= '.(int)($position) + : '< '.(int)($movedCategory['position']).' AND `position` >= '.(int)($position)).' + AND `id_parent`='.(int)($movedCategory['id_parent'])) + AND Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'category` + SET `position` = '.(int)($position).' + WHERE `id_parent` = '.(int)($movedCategory['id_parent']).' + AND `id_category`='.(int)($movedCategory['id_category']))); + Module::hookExec('categoryUpdate'); + return $result; + } + + /** + * cleanPositions keep order of category in $id_category_parent, + * but remove duplicate position. Should not be used if positions + * are clean at the beginning ! + * + * @param mixed $id_category_parent + * @return boolean true if succeed + */ + static public function cleanPositions($id_category_parent) + { + $return = true; + + $result = Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'category` + WHERE `id_parent` = '.(int)($id_category_parent).' + ORDER BY `position`'); + $sizeof = sizeof($result); + for ($i = 0; $i < $sizeof; $i++){ + $sql = ' + UPDATE `'._DB_PREFIX_.'category` + SET `position` = '.(int)($i).' + WHERE `id_parent` = '.(int)($id_category_parent).' + AND `id_category` = '.(int)($result[$i]['id_category']); + $return &= Db::getInstance()->Execute($sql); + } + return $return; + } + + static public function getLastPosition($id_category_parent) + { + return (Db::getInstance()->getValue('SELECT MAX(position)+1 FROM `'._DB_PREFIX_.'category` WHERE `id_parent` = '.(int)($id_category_parent))); + } + + public static function getUrlRewriteInformations($id_category) + { + return Db::getInstance()->ExecuteS(' + SELECT l.`id_lang`, c.`link_rewrite` + FROM `'._DB_PREFIX_.'category_lang` AS c + LEFT JOIN `'._DB_PREFIX_.'lang` AS l ON c.`id_lang` = l.`id_lang` + WHERE c.`id_category` = '.(int)$id_category.' + AND l.`active` = 1' + ); + } + + /** + * Return nleft and nright fields for a given category + * + * @since 1.5.0 + * @param int $id + * @return array + */ + public static function getInterval($id) + { + $sql = 'SELECT nleft, nright FROM '._DB_PREFIX_.'category + WHERE id_category = '.(int)$id; + if (!$result = Db::getInstance()->getRow($sql)) + return false; + return $result; + } + + public function getChildrenWs() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_category` as id + FROM `'._DB_PREFIX_.'category` c + WHERE c.`id_parent` = '.(int)($this->id).' + AND `active` = 1 + ORDER BY `position` ASC'); + return $result; + } + + public function getProductsWs() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT cp.`id_product` as id + FROM `'._DB_PREFIX_.'category_product` cp + WHERE cp.`id_category` = '.(int)($this->id).' + ORDER BY `position` ASC'); + return $result; + } + + /** + * Search for another category with the same parent and the same position + * + * @return array first category found + */ + public function getDuplicatePosition() + { + return Db::getInstance()->getRow(' + SELECT c.`id_category` as id + FROM `'._DB_PREFIX_.'category` c + WHERE c.`id_parent` = '.(int)($this->id_parent).' + AND `position` = '.(int)($this->position).' + AND c.`id_category` != '.(int)($this->id)); + } + + public function getWsNbProductsRecursive() + { + $result = Db::getInstance()->ExecuteS( + 'SELECT count(distinct(id_product)) as nb_product_recursive FROM `'._DB_PREFIX_.'category_product` + WHERE id_category IN (SELECT id_category + FROM `'._DB_PREFIX_.'category` + WHERE nleft > '.(int)$this->nleft. + ' AND nright < '.(int)$this->nright.' AND active = 1 UNION SELECT '.(int)$this->id.')'); + if (!$result) + return -1; + return $result[0]['nb_product_recursive']; + } +} diff --git a/classes/Chart.php b/classes/Chart.php new file mode 100644 index 000000000..d01b85b68 --- /dev/null +++ b/classes/Chart.php @@ -0,0 +1,178 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ChartCore +{ + protected static $poolId = 0; + + protected $width = 600; + protected $height = 300; + + // Time mode + protected $timeMode = false; + protected $from; + protected $to; + protected $format; + protected $granularity; + + protected $curves = array(); + + /** @prototype void public static function init(void) */ + public static function init() + { + if (!self::$poolId) + { + ++self::$poolId; + echo ' + + '; + } + } + + /** @prototype void public function __construct() */ + public function __construct() + { + self::init(); + ++self::$poolId; + } + + /** @prototype void public function setSize(int $width, int $height) */ + public function setSize($width, $height) + { + $this->width = (int)$width; + $this->height = (int)$height; + } + + /** @prototype void public function setTimeMode($from, $to, $granularity) */ + public function setTimeMode($from, $to, $granularity) + { + $this->granularity = $granularity; + + if (Validate::isDate($from)) + $from = strtotime($from); + $this->from = $from; + if (Validate::isDate($to)) + $to = strtotime($to); + $this->to = $to; + + if ($granularity == 'd') + $this->format = '%d/%m/%y'; + if ($granularity == 'w') + $this->format = '%d/%m/%y'; + if ($granularity == 'm') + $this->format = '%m/%y'; + if ($granularity == 'y') + $this->format = '%y'; + + $this->timeMode = true; + } + + public function getCurve($i) + { + if (!array_key_exists($i, $this->curves)) + $this->curves[$i] = new Curve(); + return $this->curves[$i]; + } + + /** @prototype void public function display() */ + public function display() + { + $options = ''; + if ($this->timeMode) + { + $options = 'xaxis:{mode:"time",timeformat:\''.addslashes($this->format).'\',min:'.$this->from.'000,max:'.$this->to.'000}'; + if ($this->granularity == 'd') + foreach ($this->curves as $curve) + for ($i = $this->from; $i <= $this->to; $i += 86400) + if (!$curve->getPoint($i)) + $curve->setPoint($i, 0); + } + + $jsCurves = array(); + foreach ($this->curves as $curve) + $jsCurves[] = $curve->getValues($this->timeMode); + + if (count($jsCurves)) + echo ' +
+ '; + else + echo ErrorFacade::Display(PS_ERROR_UNDEFINED, 'No values for this chart.'); + } +} + +class Curve +{ + protected $values = array(); + protected $label; + protected $type; + + /** @prototype void public function setValues($values) */ + public function setValues($values) + { + $this->values = $values; + } + + public function getValues($timeMode = false) + { + ksort($this->values); + $string = ''; + foreach ($this->values as $key => $value) + $string .= '['.addslashes((string)$key).($timeMode ? '000' : '').','.(float)$value.'],'; + return '{data:['.rtrim($string, ',').']'.(!empty($this->label) ? ',label:"'.$this->label.'"' : '').''.(!empty($this->type) ? ','.$this->type : '').'}'; + } + + /** @prototype void public function setPoint(float $x, float $y) */ + public function setPoint($x, $y) + { + $this->values[(string)$x] = (float)$y; + } + + public function setLabel($label) + { + $this->label = $label; + } + + public function setType($type) + { + $this->type = ''; + if ($type == 'bars') + $this->type = 'bars:{show:true}'; + if ($type == 'steps') + $this->type = 'lines:{show:true,steps:true}'; + } + + public function getPoint($x) + { + if (array_key_exists((string)$x, $this->values)) + return $this->values[(string)$x]; + } +} \ No newline at end of file diff --git a/classes/Combination.php b/classes/Combination.php new file mode 100644 index 000000000..e7cd00b65 --- /dev/null +++ b/classes/Combination.php @@ -0,0 +1,180 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CombinationCore extends ObjectModel +{ + public $id_product; + + public $reference; + + public $supplier_reference; + + public $location; + + public $ean13; + + public $upc; + + public $wholesale_price; + + public $price; + + public $ecotax; + + public $quantity; + + public $weight; + + public $default_on; + + protected $fieldsRequired = array( + 'id_product', + ); + protected $fieldsSize = array( + 'reference' => 32, + 'supplier_reference' => 32, + 'location' => 64, + 'ean13' => 13, + 'upc' => 12, + 'wholesale_price' => 27, + 'price' => 20, + 'ecotax' => 20, + 'quantity' => 10 + ); + protected $fieldsValidate = array( + 'id_product' => 'isUnsignedId', + 'location' => 'isGenericName', + 'ean13' => 'isEan13', + 'upc' => 'isUpc', + 'wholesale_price' => 'isPrice', + 'price' => 'isPrice', + 'ecotax' => 'isPrice', + 'quantity' => 'isUnsignedInt', + 'weight' => 'isFloat', + 'default_on' => 'isBool', + ); + + protected $table = 'product_attribute'; + protected $identifier = 'id_product_attribute'; + + protected $webserviceParameters = array( + 'objectNodeName' => 'combination', + 'objectsNodeName' => 'combinations', + 'fields' => array( + 'id_product' => array('required' => true, 'xlink_resource'=> 'products'), + ), + 'associations' => array( + 'product_option_values' => array('resource' => 'product_option_value'), + 'images' => array('resource' => 'image'), + ), + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_product'] = (int)($this->id_product); + $fields['reference'] = pSQL($this->reference); + $fields['supplier_reference'] = pSQL($this->supplier_reference); + $fields['location'] = pSQL($this->location); + $fields['ean13'] = pSQL($this->ean13); + $fields['upc'] = pSQL($this->upc); + $fields['wholesale_price'] = pSQL($this->wholesale_price); + $fields['price'] = pSQL($this->price); + $fields['ecotax'] = pSQL($this->ecotax); + $fields['quantity'] = (int)($this->quantity); + $fields['weight'] = pSQL($this->weight); + $fields['default_on'] = (int)($this->default_on); + return $fields; + } + + public function delete() + { + if (!parent::delete() OR $this->deleteAssociations() === false) + return false; + return true; + } + + public function deleteAssociations() + { + if ( + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` + WHERE `id_product_attribute` = '.(int)($this->id)) === false + ) + return false; + return true; + } + + public function setWsProductOptionValues($values) + { + if ($this->deleteAssociations()) + { + $sqlValues = array(); + foreach ($values as $value) + $sqlValues[] = '('.(int)$value['id'].', '.(int)$this->id.')'; + $result = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_attribute_combination` (`id_attribute`, `id_product_attribute`) + VALUES '.implode(',', $sqlValues) + ); + return $result; + } + return false; + } + + public function getWsProductOptionValues() + { + $result = Db::getInstance()->executeS('SELECT id_attribute AS id from `'._DB_PREFIX_.'product_attribute_combination` WHERE id_product_attribute = '.(int)$this->id); + return $result; + } + + public function getWsImages() + { + return Db::getInstance()->ExecuteS(' + SELECT `id_image` as id + FROM `'._DB_PREFIX_.'product_attribute_image` + WHERE `id_product_attribute` = '.(int)($this->id).' + '); +} + + public function setWsImages($values) + { + if (Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_attribute_image` + WHERE `id_product_attribute` = '.(int)($this->id)) === false) + return false; + $sqlValues = array(); + foreach ($values as $value) + $sqlValues[] = '('.(int)$this->id.', '.(int)$value['id'].')'; + $result = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_attribute_image` (`id_product_attribute`, `id_image`) + VALUES '.implode(',', $sqlValues) + ); + return true; + } +} + + diff --git a/classes/Configuration.php b/classes/Configuration.php new file mode 100644 index 000000000..26975c035 --- /dev/null +++ b/classes/Configuration.php @@ -0,0 +1,494 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7227 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ConfigurationCore extends ObjectModel +{ + public $id; + + /** @var string Key */ + public $name; + + public $id_group_shop; + public $id_shop; + + /** @var string Value */ + public $value; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 32); + protected $fieldsValidate = array('name' => 'isConfigName', 'id_group_shop' => 'isUnsignedId', 'id_shop' => 'isUnsignedId'); + + protected $table = 'configuration'; + protected $identifier = 'id_configuration'; + + /** @var array Configuration cache */ + protected static $_CONF; + + /** @var array Vars types */ + protected static $types = array(); + + protected $webserviceParameters = array( + 'fields' => array( + 'value' => array(), + ) + ); + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + $fields['id_group_shop'] = $this->id_group_shop; + $fields['id_shop'] = $this->id_shop; + $fields['value'] = pSQL($this->value); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + if (!is_array($this->value)) + return true; + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('value')); + } + + /** + * Return ID a configuration key + * + * @param string $key + * @param int $shopGroupID + * @param int $shopID + */ + public static function getIdByName($key, $shopGroupID = null, $shopID = null) + { + self::getShopFromContext($shopGroupID, $shopID); + $sql = 'SELECT id_configuration + FROM '._DB_PREFIX_.'configuration + WHERE name = \''.pSQL($key).'\'' + .Configuration::sqlRestriction($shopGroupID, $shopID); + return (int)Db::getInstance()->getValue($sql); + } + + /** + * Load all configuration data + */ + static public function loadConfiguration() + { + self::$_CONF = array(); + $sql = 'SELECT c.`name`, cl.`id_lang`, IF(cl.`id_lang` IS NULL, c.`value`, cl.`value`) AS value, c.id_group_shop, c.id_shop + FROM `'._DB_PREFIX_.'configuration` c + LEFT JOIN `'._DB_PREFIX_.'configuration_lang` cl ON (c.id_configuration = cl.id_configuration)'; + if (!$results = Db::getInstance()->ExecuteS($sql)) + return; + + foreach ($results as $row) + { + $lang = ($row['id_lang']) ? $row['id_lang'] : 0; + self::$types[$row['name']] = ($lang) ? 'lang' : 'normal'; + if (!isset(self::$_CONF[$lang])) + self::$_CONF[$lang] = array( + 'global' => array(), + 'group' => array(), + 'shop' => array(), + ); + + // Do not remove (int) cast + Configuration::set($row['name'], array($lang => $row['value']), (int)$row['id_group_shop'], (int)$row['id_shop']); + } + } + + /** + * Get a single configuration value (in one language only) + * + * @param string $key Key wanted + * @param integer $id_lang Language ID + * @return string Value + */ + static public function get($key, $langID = NULL, $shopGroupID = NULL, $shopID = NULL) + { + self::getShopFromContext($shopGroupID, $shopID); + $langID = (int)$langID; + if (!isset(self::$_CONF[$langID])) + $langID = 0; + + if ($shopID && Configuration::hasKey($key, $langID, null, $shopID)) + return self::$_CONF[$langID]['shop'][$shopID][$key]; + else if ($shopGroupID && Configuration::hasKey($key, $langID, $shopGroupID)) + return self::$_CONF[$langID]['group'][$shopGroupID][$key]; + else if (Configuration::hasKey($key, $langID)) + return self::$_CONF[$langID]['global'][$key]; + return false; + } + + /** + * Get a single configuration value (in multiple languages) + * + * @param string $key Key wanted + * @param int $shopGroupID + * @param int $shopID + * @return array Values in multiple languages + */ + static public function getInt($key, $id_group_shop = NULL, $id_shop = NULL) + { + $languages = Language::getLanguages(); + $resultsArray = array(); + foreach ($languages as $language) + $resultsArray[$language['id_lang']] = self::get($key, $language['id_lang'], $id_group_shop, $id_shop); + return $resultsArray; + } + + /** + * Get several configuration values (in one language only) + * + * @param array $keys Keys wanted + * @param integer $id_lang Language ID + * @return array Values + */ + static public function getMultiple($keys, $langID = NULL, $shopGroupID = NULL, $shopID = NULL) + { + if (!is_array($keys)) + die(Tools::displayError()); + + $langID = (int)$langID; + self::getShopFromContext($shopGroupID, $shopID); + + $results = array(); + foreach ($keys as $key) + $results[$key] = Configuration::get($key, $langID, $shopGroupID, $shopID); + return $results; + } + + /** + * Check if key exists in configuration + * + * @param string $key + * @param int $id_lang + * @param int $shopGroupID + * @param int $shopID + * @return bool + */ + public static function hasKey($key, $langID = null, $shopGroupID = null, $shopID = null) + { + $langID = (int)$langID; + if ($shopID) + return isset(self::$_CONF[$langID]['shop'][$shopID]) && array_key_exists($key, self::$_CONF[$langID]['shop'][$shopID]); + else if ($shopGroupID) + return isset(self::$_CONF[$langID]['group'][$shopGroupID]) && array_key_exists($key, self::$_CONF[$langID]['group'][$shopGroupID]); + return isset(self::$_CONF[$langID]['global']) && array_key_exists($key, self::$_CONF[$langID]['global']); + } + + /** + * Set TEMPORARY a single configuration value (in one language only) + * + * @param string $key Key wanted + * @param mixed $values $values is an array if the configuration is multilingual, a single string else. + * @param int $shopGroupID + * @param int $shopID + */ + static public function set($key, $values, $id_group_shop = NULL, $id_shop = NULL) + { + if (!Validate::isConfigName($key)) + die(Tools::displayError()); + self::getShopFromContext($id_group_shop, $id_shop); + + if (!is_array($values)) + $values = array($values); + + foreach ($values as $lang => $value) + { + if ($id_shop) + self::$_CONF[$lang]['shop'][$id_shop][$key] = $value; + else if ($id_group_shop) + self::$_CONF[$lang]['group'][$id_group_shop][$key] = $value; + else + self::$_CONF[$lang]['global'][$key] = $value; + } + } + + /** + * Update configuration key for global context only + * + * @param string $key + * @param mixed $values + * @param bool $html + * @return bool + */ + static public function updateGlobalValue($key, $values, $html = false) + { + return Configuration::updateValue($key, $values, $html, 0, 0); + } + + /** + * Update configuration key and value into database (automatically insert if key does not exist) + * + * @param string $key Key + * @param mixed $values $values is an array if the configuration is multilingual, a single string else. + * @param boolean $html Specify if html is authorized in value + * @param int $shopGroupID + * @param int $shopID + * @return boolean Update result + */ + static public function updateValue($key, $values, $html = false, $shopGroupID = NULL, $shopID = NULL) + { + if (!Validate::isConfigName($key)) + die(Tools::displayError()); + self::getShopFromContext($shopGroupID, $shopID); + + if (!is_array($values)) + $values = array($values); + + $result = true; + foreach ($values as $lang => $value) + { + if ($value == Configuration::get($key, $lang, $shopGroupID, $shopID)) + continue; + + // If key already exists, update value + if (Configuration::hasKey($key, $lang, $shopGroupID, $shopID)) + { + if (!$lang) + { + // Update config not linked to lang + $result &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'configuration', array( + 'value' => pSQL($value, $html), + 'date_upd' => date('Y-m-d H:i:s'), + ), 'UPDATE', '`name` = \''.pSQL($key).'\''.Configuration::sqlRestriction($shopGroupID, $shopID), true, true); + } + else + { + // Update multi lang + $sql = 'UPDATE '._DB_PREFIX_.'configuration_lang cl + SET cl.value = \''.pSQL($value, $html).'\', + cl.date_upd = NOW() + WHERE cl.id_lang = '.(int)$lang.' + AND cl.id_configuration = ( + SELECT c.id_configuration + FROM '._DB_PREFIX_.'configuration c + WHERE c.name = \''.pSQL($key).'\'' + .Configuration::sqlRestriction($shopGroupID, $shopID) + .')'; + $result &= Db::getInstance()->Execute($sql); + } + } + // If key does not exists, create it + else + { + if (!$configID = Configuration::getIdByName($key, $shopGroupID, $shopID)) + { + $newConfig = new Configuration(); + $newConfig->name = $key; + if ($shopID) + $newConfig->id_shop = (int)$shopID; + if ($shopGroupID) + $newConfig->id_group_shop = (int)$shopGroupID; + if (!$lang) + $newConfig->value = $value; + $result &= $newConfig->add(true, true); + $configID = $newConfig->id; + } + + if ($lang) + { + $result &= Db::getInstance()->autoExecute(_DB_PREFIX_.'configuration_lang', array( + 'id_configuration' => $configID, + 'id_lang' => $lang, + 'value' => pSQL($value, $html), + 'date_upd' => date('Y-m-d H:i:s'), + ), 'INSERT'); + } + } + + Configuration::set($key, $value, $shopGroupID, $shopID); + } + + return $result; + } + + /** + * Delete a configuration key in database (with or without language management) + * + * @param string $key Key to delete + * @return boolean Deletion result + */ + static public function deleteByName($key) + { + if (!Validate::isConfigName($key)) + return false; + + $sql = 'DELETE FROM `'._DB_PREFIX_.'configuration_lang` + WHERE `id_configuration` = ( + SELECT `id_configuration` + FROM `'._DB_PREFIX_.'configuration` + WHERE `name` = \''.pSQL($key).'\' + )'; + $result = Db::getInstance()->Execute($sql); + + $sql = 'DELETE FROM `'._DB_PREFIX_.'configuration` + WHERE `name` = \''.pSQL($key).'\''; + $result2 = Db::getInstance()->Execute($sql); + return ($result && $result2); + } + + /** + * Delete configuration key from current context. + * + * @param string $key + */ + public static function deleteFromContext($key) + { + list($shopID, $shopGroupID) = Shop::retrieveContext(); + if (!$shopID && !$shopGroupID) + return; + + $id = Configuration::getIdByName($key, $shopGroupID, $shopID); + $sql = 'DELETE FROM '._DB_PREFIX_.'configuration + WHERE id_configuration = '.$id; + Db::getInstance()->Execute($sql); + + $sql = 'DELETE FROM '._DB_PREFIX_.'configuration_lang + WHERE id_configuration = '.$id; + Db::getInstance()->Execute($sql); + } + + /** + * Check if configuration var is defined in given context + * + * @param string $key + * @param int $langID + * @param int $context + */ + public static function hasContext($key, $langID, $context) + { + list($shopID, $shopGroupID) = Shop::retrieveContext(); + if ($context == Shop::CONTEXT_SHOP && Configuration::hasKey($key, $langID, null, $shopID)) + return true; + else if ($context == Shop::CONTEXT_GROUP && Configuration::hasKey($key, $langID, $shopGroupID)) + return true; + else if ($context == Shop::CONTEXT_ALL && Configuration::hasKey($key, $langID)) + return true; + return false; + } + + /** + * Check if a key was loaded as multi lang + * + * @param string $key + * @return bool + */ + public static function isLangKey($key) + { + return (isset(self::$types[$key]) && self::$types[$key] == 'lang') ? true : false; + } + + /** + * Fill $id_group_shop and $id_shop vars from correct context + * + * @param int $id_group_shop + * @param int $id_shop + */ + protected static function getShopFromContext(&$id_group_shop, &$id_shop) + { + list($shopID, $shopGroupID) = Shop::retrieveContext(); + if (is_null($id_shop)) + $id_shop = $shopID; + if (is_null($id_group_shop)) + $id_group_shop = $shopGroupID; + + $id_shop = (int)$id_shop; + $id_group_shop = (int)$id_group_shop; + } + + /** + * Add SQL restriction on shops for configuration table + * + * @param int $shopGroupID + * @param int $shopID + * @return string + */ + protected static function sqlRestriction($shopGroupID, $shopID) + { + if ($shopID) + return ' AND id_shop = '.$shopID; + else if ($shopGroupID) + return ' AND id_group_shop = '.$shopGroupID.' AND id_shop IS NULL'; + else + return ' AND id_group_shop IS NULL AND id_shop IS NULL'; + } + + /** + * This method is override to allow TranslatedConfiguration entity + * + * @param $sql_join + * @param $sql_filter + * @param $sql_sort + * @param $sql_limit + * @return array + */ + public function getWebserviceObjectList($sql_join, $sql_filter, $sql_sort, $sql_limit) + { + $query = ' + SELECT DISTINCT main.`'.$this->identifier.'` FROM `'._DB_PREFIX_.$this->table.'` main + '.$sql_join.' + WHERE id_configuration NOT IN + ( SELECT id_configuration + FROM '._DB_PREFIX_.$this->table.'_lang + ) '.$sql_filter.' + '.($sql_sort != '' ? $sql_sort : '').' + '.($sql_limit != '' ? $sql_limit : '').' + '; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($query); + } + + /** + * Get several configuration values (in multiple languages) + * + * @param array $keys Keys wanted + * @return array Values in multiple languages + * @deprecated + */ + static public function getMultipleInt($keys) + { + Tools::displayAsDeprecated(); + $languages = Language::getLanguages(); + $resultsArray = array(); + foreach($languages as $language) + $resultsArray[$language['id_lang']] = self::getMultiple($keys, $language['id_lang']); + return $resultsArray; + } +} \ No newline at end of file diff --git a/classes/Connection.php b/classes/Connection.php new file mode 100644 index 000000000..280bbfa61 --- /dev/null +++ b/classes/Connection.php @@ -0,0 +1,184 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6883 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ConnectionCore extends ObjectModel +{ + /** @var integer */ + public $id_guest; + + /** @var integer */ + public $id_page; + + /** @var string */ + public $ip_address; + + /** @var string */ + public $http_referer; + + /** @var int */ + public $id_shop; + + /** @var int */ + public $id_group_shop; + + /** @var string */ + public $date_add; + + protected $fieldsRequired = array ('id_guest', 'id_page', 'id_shop', 'id_group_shop'); + protected $fieldsValidate = array ('id_guest' => 'isUnsignedId', 'id_page' => 'isUnsignedId', + 'ip_address' => 'isInt', 'http_referer' => 'isAbsoluteUrl'); + + /* MySQL does not allow 'connection' for a table name */ + protected $table = 'connections'; + protected $identifier = 'id_connections'; + + public function getFields() + { + parent::validateFields(); + $fields['id_guest'] = (int)($this->id_guest); + $fields['id_page'] = (int)($this->id_page); + $fields['ip_address'] = (int)($this->ip_address); + if (Validate::isAbsoluteUrl($this->http_referer)) + $fields['http_referer'] = pSQL($this->http_referer); + $fields['date_add'] = pSQL($this->date_add); + $fields['id_shop'] = (int)$this->id_shop; + $fields['id_group_shop'] = (int)$this->id_group_shop; + return $fields; + } + + public static function setPageConnection($cookie, $full = true) + { + // The connection is created if it does not exist yet and we get the current page id + if (!isset($cookie->id_connections) OR !strstr(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', Tools::getHttpHost(false, false))) + $id_page = Connection::setNewConnection($cookie); + if (!isset($id_page) OR !$id_page) + $id_page = Page::getCurrentId(); + if (!Configuration::get('PS_STATSDATA_CUSTOMER_PAGESVIEWS')) + return array('id_page' => $id_page); + + // The ending time will be updated by an ajax request when the guest will close the page + $time_start = date('Y-m-d H:i:s'); + Db::getInstance()->AutoExecute(_DB_PREFIX_.'connections_page', array('id_connections' => (int)($cookie->id_connections), 'id_page' => (int)($id_page), 'time_start' => $time_start), 'INSERT'); + + // This array is serialized and used by the ajax request to identify the page + return array( + 'id_connections' => (int)($cookie->id_connections), + 'id_page' => (int)($id_page), + 'time_start' => $time_start); + } + + public static function setNewConnection($cookie) + { + if (isset($_SERVER['HTTP_USER_AGENT']) + AND preg_match('/BotLink|ahoy|AlkalineBOT|anthill|appie|arale|araneo|AraybOt|ariadne|arks|ATN_Worldwide|Atomz|bbot|Bjaaland|Ukonline|borg\-bot\/0\.9|boxseabot|bspider|calif|christcrawler|CMC\/0\.01|combine|confuzzledbot|CoolBot|cosmos|Internet Cruiser Robot|cusco|cyberspyder|cydralspider|desertrealm, desert realm|digger|DIIbot|grabber|downloadexpress|DragonBot|dwcp|ecollector|ebiness|elfinbot|esculapio|esther|fastcrawler|FDSE|FELIX IDE|ESI|fido|H�m�h�kki|KIT\-Fireball|fouineur|Freecrawl|gammaSpider|gazz|gcreep|golem|googlebot|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|iajabot|INGRID\/0\.1|Informant|InfoSpiders|inspectorwww|irobot|Iron33|JBot|jcrawler|Teoma|Jeeves|jobo|image\.kapsi\.net|KDD\-Explorer|ko_yappo_robot|label\-grabber|larbin|legs|Linkidator|linkwalker|Lockon|logo_gif_crawler|marvin|mattie|mediafox|MerzScope|NEC\-MeshExplorer|MindCrawler|udmsearch|moget|Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|sharp\-info\-agent|WebMechanic|NetScoop|newscan\-online|ObjectsSearch|Occam|Orbsearch\/1\.0|packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|Getterrobo\-Plus|Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Search\-AU|searchprocess|Senrigan|Shagseeker|sift|SimBot|Site Valet|skymob|SLCrawler\/2\.0|slurp|ESI|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|nil|suke|http:\/\/www\.sygol\.com|tach_bw|TechBOT|templeton|titin|topiclink|UdmSearch|urlck|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|crawlpaper|wapspider|WebBandit\/1\.0|webcatcher|T\-H\-U\-N\-D\-E\-R\-S\-T\-O\-N\-E|WebMoose|webquest|webreaper|webs|webspider|WebWalker|wget|winona|whowhere|wlm|WOLP|WWWC|none|XGET|Nederland\.zoek/i', $_SERVER['HTTP_USER_AGENT'])) + { + // This is a bot and we have to retrieve its connection ID + $sql = 'SELECT `id_connections` FROM `'._DB_PREFIX_.'connections` c + WHERE ip_address = '.ip2long(Tools::getRemoteAddr()).' + AND DATE_ADD(c.`date_add`, INTERVAL 30 MINUTE) > \''.pSQL(date('Y-m-d H:i:00')).'\' + AND id_shop = '.Shop::getCurrentShop().' + ORDER BY c.`date_add` DESC'; + if ($id_connections = Db::getInstance()->getValue($sql)) + { + $cookie->id_connections = (int)$id_connections; + return Page::getCurrentId(); + } + } + + // A new connection is created if the guest made no actions during 30 minutes + $sql = 'SELECT c.`id_guest` + FROM `'._DB_PREFIX_.'connections` c + WHERE c.`id_guest` = '.(int)($cookie->id_guest).' + AND DATE_ADD(c.`date_add`, INTERVAL 30 MINUTE) > \''.pSQL(date('Y-m-d H:i:00')).'\' + AND id_shop = '.Shop::getCurrentShop().' + ORDER BY c.`date_add` DESC'; + $result = Db::getInstance()->getRow($sql); + if (!$result['id_guest'] AND (int)($cookie->id_guest)) + { + // The old connections details are removed from the database in order to spare some memory + Connection::cleanConnectionsPages(); + + $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; + $arrayUrl = parse_url($referer); + if (!isset($arrayUrl['host']) OR preg_replace('/^www./', '', $arrayUrl['host']) == preg_replace('/^www./', '', Tools::getHttpHost(false, false))) + $referer = ''; + $connection = new Connection(); + $connection->id_guest = (int)($cookie->id_guest); + $connection->id_page = Page::getCurrentId(); + $connection->ip_address = Tools::getRemoteAddr() ? ip2long(Tools::getRemoteAddr()) : ''; + $connection->id_shop = Shop::getCurrentShop(); + $connection->id_group_shop = Shop::getCurrentGroupShop(); + if (Validate::isAbsoluteUrl($referer)) + $connection->http_referer = $referer; + $connection->add(); + $cookie->id_connections = $connection->id; + return $connection->id_page; + } + } + + public static function setPageTime($id_connections, $id_page, $time_start, $time) + { + if (!Validate::isUnsignedId($id_connections) + OR !Validate::isUnsignedId($id_page) + OR !Validate::isDate($time_start)) + return; + + // Limited to 5 minutes because more than 5 minutes is considered as an error + if ($time > 300000) + $time = 300000; + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'connections_page` + SET `time_end` = `time_start` + INTERVAL '.(int)($time / 1000).' SECOND + WHERE `id_connections` = '.(int)($id_connections).' + AND `id_page` = '.(int)($id_page).' + AND `time_start` = \''.pSQL($time_start).'\''); + } + + public static function cleanConnectionsPages() + { + $period = Configuration::get('PS_STATS_OLD_CONNECT_AUTO_CLEAN'); + + if ($period === 'week') + $interval = '1 WEEK'; + else if ($period === 'month') + $interval = '1 MONTH'; + else if ($period === 'year') + $interval = '1 YEAR'; + else + return; + + if ($interval != null) + { + // Records of connections details older than the beginning of the specified interval are deleted + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'connections_page` + WHERE time_start < LAST_DAY(DATE_SUB(NOW(), INTERVAL '.$interval.'))'); + } + } +} + + diff --git a/classes/ConnectionsSource.php b/classes/ConnectionsSource.php new file mode 100644 index 000000000..2d3c23f90 --- /dev/null +++ b/classes/ConnectionsSource.php @@ -0,0 +1,112 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ConnectionsSourceCore extends ObjectModel +{ + public $id_connections; + public $http_referer; + public $request_uri; + public $keywords; + public $date_add; + + // Controler les keywords + + protected $fieldsRequired = array('id_connections', 'date_add'); + protected $fieldsValidate = array('id_connections' => 'isUnsignedId', 'http_referer' => 'isAbsoluteUrl', 'request_uri' => 'isUrl', 'keywords' => 'isMessage'); + + protected $table = 'connections_source'; + protected $identifier = 'id_connections_source'; + + public function getFields() + { + parent::validateFields(); + $fields['id_connections'] = (int)($this->id_connections); + $fields['http_referer'] = pSQL($this->http_referer); + $fields['request_uri'] = pSQL($this->request_uri); + $fields['keywords'] = pSQL($this->keywords); + $fields['date_add'] = pSQL($this->date_add); + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + if($result = parent::add($autodate, $nullValues)) + Referrer::cacheNewSource($this->id); + return $result; + } + + public static function logHttpReferer() + { + global $cookie; + + if (!isset($cookie->id_connections) OR !Validate::isUnsignedId($cookie->id_connections)) + return false; + if (!isset($_SERVER['HTTP_REFERER']) AND !Configuration::get('TRACKING_DIRECT_TRAFFIC')) + return false; + + $source = new ConnectionsSource(); + if (isset($_SERVER['HTTP_REFERER']) AND Validate::isAbsoluteUrl($_SERVER['HTTP_REFERER'])) + { + $parsed = parse_url($_SERVER['HTTP_REFERER']); + $parsed_host = parse_url(Tools::getProtocol().Tools::getHttpHost(false, false).__PS_BASE_URI__); + if ((preg_replace('/^www./', '', $parsed['host']) == preg_replace('/^www./', '', Tools::getHttpHost(false, false))) + AND !strncmp($parsed['path'], $parsed_host['path'], strlen(__PS_BASE_URI__))) + return false; + if (Validate::isAbsoluteUrl(strval($_SERVER['HTTP_REFERER']))) + { + $source->http_referer = strval($_SERVER['HTTP_REFERER']); + $source->keywords = trim(SearchEngine::getKeywords(strval($_SERVER['HTTP_REFERER']))); + if (!Validate::isMessage($source->keywords)) + return false; + } + } + + $source->id_connections = (int)($cookie->id_connections); + $source->request_uri = Tools::getHttpHost(false, false); + if (isset($_SERVER['REDIRECT_URL'])) + $source->request_uri .= strval($_SERVER['REDIRECT_URL']); + elseif (isset($_SERVER['REQUEST_URI'])) + $source->request_uri .= strval($_SERVER['REQUEST_URI']); + if (!Validate::isUrl($source->request_uri)) + $source->request_uri = ''; + return $source->add(); + } + + public static function getOrderSources($id_order) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT cos.http_referer, cos.request_uri, cos.keywords, cos.date_add + FROM '._DB_PREFIX_.'orders o + INNER JOIN '._DB_PREFIX_.'guest g ON g.id_customer = o.id_customer + INNER JOIN '._DB_PREFIX_.'connections co ON co.id_guest = g.id_guest + INNER JOIN '._DB_PREFIX_.'connections_source cos ON cos.id_connections = co.id_connections + WHERE id_order = '.(int)($id_order).' + ORDER BY cos.date_add DESC'); + } +} + + diff --git a/classes/Contact.php b/classes/Contact.php new file mode 100644 index 000000000..e5dca1e9d --- /dev/null +++ b/classes/Contact.php @@ -0,0 +1,89 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ContactCore extends ObjectModel +{ + public $id; + + /** @var string Name */ + public $name; + + /** @var string e-mail */ + public $email; + + /** @var string Detailed description */ + public $description; + + public $customer_service; + + protected $fieldsRequired = array(); + protected $fieldsSize = array('email' => 128); + protected $fieldsValidate = array('email' => 'isEmail', 'customer_service' => 'isBool'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName', 'description' => 'isCleanHtml'); + + protected $table = 'contact'; + protected $identifier = 'id_contact'; + + public function getFields() + { + parent::validateFields(); + $fields['email'] = pSQL($this->email); + $fields['customer_service'] = (int)($this->customer_service); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'description')); + } + + /** + * Return available contacts + * + * @param integer $id_lang Language ID + * @return array Contacts + */ + static public function getContacts($id_lang, $id_shop = false) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'contact` c + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'contact_shop cs ON (cs.id_contact = c.id_contact)' : '').' + LEFT JOIN `'._DB_PREFIX_.'contact_lang` cl ON (c.`id_contact` = cl.`id_contact`) + WHERE cl.`id_lang` = '.(int)($id_lang).($id_shop ? ' AND cs.id_shop='.(int)$id_shop : '').' + ORDER BY `name` ASC'); + } +} + diff --git a/classes/ControllerFactory.php b/classes/ControllerFactory.php new file mode 100644 index 000000000..838b2c270 --- /dev/null +++ b/classes/ControllerFactory.php @@ -0,0 +1,53 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ControllerFactoryCore +{ + public static function includeController($className) + { + if (!class_exists($className, false)) + { + require_once(dirname(__FILE__).'/../controllers/'.$className.'.php'); + if (file_exists(dirname(__FILE__).'/../override/controllers/'.$className.'.php')) + require_once(dirname(__FILE__).'/../override/controllers/'.$className.'.php'); + else + { + $coreClass = new ReflectionClass($className.'Core'); + if ($coreClass->isAbstract()) + eval('abstract class '.$className.' extends '.$className.'Core {}'); + else + eval('class '.$className.' extends '.$className.'Core {}'); + } + } + } + + public static function getController($className, $auth = false, $ssl = false) + { + ControllerFactory::includeController($className); + return new $className($auth, $ssl); + } +} \ No newline at end of file diff --git a/classes/Cookie.php b/classes/Cookie.php new file mode 100644 index 000000000..a973bbef9 --- /dev/null +++ b/classes/Cookie.php @@ -0,0 +1,354 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CookieCore +{ + /** @var array Contain cookie content in a key => value format */ + protected $_content; + + /** @var array Crypted cookie name for setcookie() */ + protected $_name; + + /** @var array expiration date for setcookie() */ + protected $_expire; + + /** @var array Website domain for setcookie() */ + protected $_domain; + + /** @var array Path for setcookie() */ + protected $_path; + + /** @var array cipher tool instance */ + protected $_cipherTool; + + /** @var array cipher tool initialization key */ + protected $_key; + + /** @var array cipher tool initilization vector */ + protected $_iv; + + protected $_modified = false; + + /** + * Get data if the cookie exists and else initialize an new one + * + * @param $name Cookie name before encrypting + * @param $path + */ + public function __construct($name, $path = '', $expire = NULL) + { + $this->_content = array(); + $this->_expire = isset($expire) ? (int)($expire) : (time() + 1728000); + $this->_name = md5($name); + $this->_path = trim(__PS_BASE_URI__.$path, '/\\').'/'; + if ($this->_path{0} != '/') $this->_path = '/'.$this->_path; + $this->_path = rawurlencode($this->_path); + $this->_path = str_replace('%2F', '/', $this->_path); + $this->_path = str_replace('%7E', '~', $this->_path); + $this->_key = _COOKIE_KEY_; + $this->_iv = _COOKIE_IV_; + $this->_domain = $this->getDomain(); + if (Configuration::get('PS_CIPHER_ALGORITHM')) + $this->_cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); + else + $this->_cipherTool = new Blowfish($this->_key, $this->_iv); + $this->update(); + } + + protected function getDomain() + { + $r = '!(?:(\w+)://)?(?:(\w+)\:(\w+)@)?([^/:]+)?(?:\:(\d*))?([^#?]+)?(?:\?([^#]+))?(?:#(.+$))?!i'; + preg_match ($r, Tools::getHttpHost(false, false), $out); + if (preg_match('/^(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]{1}[0-9]|[1-9]).)'. + '{1}((25[0-5]|2[0-4][0-9]|[1]{1}[0-9]{2}|[1-9]{1}[0-9]|[0-9]).)'. + '{2}((25[0-5]|2[0-4][0-9]|[1]{1}[0-9]{2}|[1-9]{1}[0-9]|[0-9]){1}))$/', $out[4])) + return false; + if (!strstr(Tools::getHttpHost(false, false), '.')) + return false; + $domain = $out[4]; + $subDomains = SubDomain::getSubDomains(); + if ($subDomains === false) + die(Tools::displayError('Bad SubDomain SQL query.')); + foreach ($subDomains AS $subDomain) + { + $subDomainLength = strlen($subDomain) + 1; + if (strncmp($subDomain.'.', $domain, $subDomainLength) == 0) + $domain = substr($domain, $subDomainLength); + } + return $domain; + } + + /** + * Set expiration date + * + * @param integer $expire Expiration time from now + */ + function setExpire($expire) + { + $this->_expire = (int)($expire); + } + + /** + * Magic method wich return cookie data from _content array + * + * @param $key key wanted + * @return string value corresponding to the key + */ + public function __get($key) + { + return isset($this->_content[$key]) ? $this->_content[$key] : false; + } + + /** + * Magic method which check if key exists in the cookie + * + * @param $key key wanted + * @return boolean key existence + */ + public function __isset($key) + { + return isset($this->_content[$key]); + } + + /** + * Magic method wich add data into _content array + * + * @param $key key desired + * @param $value value corresponding to the key + */ + public function __set($key, $value) + { + if (is_array($value)) + die(Tools::displayError()); + if (preg_match('/¤|\|/', $key.$value)) + throw new Exception('Forbidden chars in cookie'); + if (!$this->_modified AND (!isset($this->_content[$key]) OR (isset($this->_content[$key]) AND $this->_content[$key] != $value))) + $this->_modified = true; + $this->_content[$key] = $value; + $this->write(); + } + + /** + * Magic method wich delete data into _content array + * + * @param $key key wanted + */ + public function __unset($key) + { + if (isset($this->_content[$key])) + $this->_modified = true; + unset($this->_content[$key]); + $this->write(); + } + + /** + * Check customer informations saved into cookie and return customer validity + * + * @return boolean customer validity + */ + public function isLogged($withGuest = false) + { + if (!$withGuest AND $this->is_guest == 1) + return false; + + /* Customer is valid only if it can be load and if cookie password is the same as database one */ + if ($this->logged == 1 AND $this->id_customer AND Validate::isUnsignedId($this->id_customer) AND Customer::checkPassword((int)($this->id_customer), $this->passwd)) + return true; + return false; + } + + /** + * Check employee informations saved into cookie and return employee validity + * + * @return boolean employee validity + */ + public function isLoggedBack() + { + /* Employee is valid only if it can be load and if cookie password is the same as database one */ + return ($this->id_employee + AND Validate::isUnsignedId($this->id_employee) + AND Employee::checkPassword((int)$this->id_employee, $this->passwd) + AND (!isset($this->_content['remote_addr']) OR $this->_content['remote_addr'] == ip2long(Tools::getRemoteAddr()) OR !Configuration::get('PS_COOKIE_CHECKIP')) + ); + } + + /** + * Delete cookie + */ + public function logout() + { + $this->_content = array(); + $this->_setcookie(); + unset($_COOKIE[$this->_name]); + $this->_modified = true; + $this->write(); + } + + /** + * Soft logout, delete everything links to the customer + * but leave there affiliate's informations + */ + public function mylogout() + { + unset($this->_content['id_customer']); + unset($this->_content['id_guest']); + unset($this->_content['is_guest']); + unset($this->_content['id_connections']); + unset($this->_content['customer_lastname']); + unset($this->_content['customer_firstname']); + unset($this->_content['passwd']); + unset($this->_content['logged']); + unset($this->_content['email']); + unset($this->_content['id_cart']); + unset($this->_content['id_address_invoice']); + unset($this->_content['id_address_delivery']); + $this->_modified = true; + $this->write(); + } + + function makeNewLog() + { + unset($this->_content['id_customer']); + unset($this->_content['id_guest']); + Guest::setNewGuest($this); + $this->_modified = true; + } + + /** + * Get cookie content + */ + function update($nullValues = false) + { + if (isset($_COOKIE[$this->_name])) + { + /* Decrypt cookie content */ + $content = $this->_cipherTool->decrypt($_COOKIE[$this->_name]); + + /* Get cookie checksum */ + $checksum = crc32($this->_iv.substr($content, 0, strrpos($content, '¤') + 2)); + + /* Unserialize cookie content */ + $tmpTab = explode('¤', $content); + foreach ($tmpTab AS $keyAndValue) + { + $tmpTab2 = explode('|', $keyAndValue); + if (sizeof($tmpTab2) == 2) + $this->_content[$tmpTab2[0]] = $tmpTab2[1]; + } + /* Blowfish fix */ + if (isset($this->_content['checksum'])) + $this->_content['checksum'] = (int)($this->_content['checksum']); + + /* Check if cookie has not been modified */ + if (!isset($this->_content['checksum']) OR $this->_content['checksum'] != $checksum) + $this->logout(); + + if (!isset($this->_content['date_add'])) + $this->_content['date_add'] = date('Y-m-d H:i:s'); + } + else + $this->_content['date_add'] = date('Y-m-d H:i:s'); + + //checks if the language exists, if not choose the default language + if (!Language::getLanguage((int)$this->id_lang)) + $this->id_lang = Configuration::get('PS_LANG_DEFAULT'); + + } + + /** + * Setcookie according to php version + */ + protected function _setcookie($cookie = NULL) + { + if ($cookie) + { + $content = $this->_cipherTool->encrypt($cookie); + $time = $this->_expire; + } + else + { + $content = 0; + $time = time() - 1; + } + if (PHP_VERSION_ID <= 50200) /* PHP version > 5.2.0 */ + return setcookie($this->_name, $content, $time, $this->_path, $this->_domain, 0); + else + return setcookie($this->_name, $content, $time, $this->_path, $this->_domain, 0, true); + } + + /** + * Save cookie with setcookie() + */ + public function write() + { + $cookie = ''; + + /* Serialize cookie content */ + if (isset($this->_content['checksum'])) unset($this->_content['checksum']); + foreach ($this->_content AS $key => $value) + $cookie .= $key.'|'.$value.'¤'; + + /* Add checksum to cookie */ + $cookie .= 'checksum|'.crc32($this->_iv.$cookie); + + /* Cookies are encrypted for evident security reasons */ + return $this->_setcookie($cookie); + } + + /** + * Get a family of variables (e.g. "filter_") + */ + public function getFamily($origin) + { + $result = array(); + if (count($this->_content) == 0) + return $result; + foreach ($this->_content AS $key => $value) + if (strncmp($key, $origin, strlen($origin)) == 0) + $result[$key] = $value; + return $result; + } + + /** + * + */ + public function unsetFamily($origin) + { + $family = $this->getFamily($origin); + foreach ($family AS $member => $value) + unset($this->$member); + } + + /** + * + * @return String name of cookie + */ + public function getName() + { + return $this->_name; + } +} diff --git a/classes/Country.php b/classes/Country.php new file mode 100644 index 000000000..3fbdd813d --- /dev/null +++ b/classes/Country.php @@ -0,0 +1,333 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CountryCore extends ObjectModel +{ + public $id; + + /** @var integer Zone id which country belongs */ + public $id_zone; + + /** @var integer Currency id which country belongs */ + public $id_currency; + + /** @var string 2 letters iso code */ + public $iso_code; + + /** @var integer international call prefix */ + public $call_prefix; + + /** @var string Name */ + public $name; + + /** @var boolean Contain states */ + public $contains_states; + + /** @var boolean Need identification number dni/nif/nie */ + public $need_identification_number; + + /** @var boolean Need Zip Code */ + public $need_zip_code; + + /** @var string Zip Code Format */ + public $zip_code_format; + + /** @var boolean Display or not the tax incl./tax excl. mention in the front office */ + public $display_tax_label = true; + + /** @var boolean Status for delivery */ + public $active = true; + + protected static $_idZones = array(); + + protected $tables = array ('country', 'country_lang'); + + protected $fieldsRequired = array('id_zone', 'id_currency', 'iso_code', 'contains_states', 'need_identification_number', 'display_tax_label'); + protected $fieldsSize = array('iso_code' => 3); + protected $fieldsValidate = array('id_zone' => 'isUnsignedId', 'id_currency' => 'isUnsignedId', 'call_prefix' => 'isInt', 'iso_code' => 'isLanguageIsoCode', 'active' => 'isBool', 'contains_states' => 'isBool', 'need_identification_number' => 'isBool', 'need_zip_code' => 'isBool', 'zip_code_format' => 'isZipCodeFormat', 'display_tax_label' => 'isBool'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 64); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $webserviceParameters = array( + 'objectsNodeName' => 'countries', + 'fields' => array( + 'id_zone' => array('sqlId' => 'id_zone', 'xlink_resource'=> 'zones'), + 'id_currency' => array('sqlId' => 'id_currency', 'xlink_resource'=> 'currencies'), + ), + ); + + protected $table = 'country'; + protected $identifier = 'id_country'; + + public function getFields() + { + parent::validateFields(); + $fields['id_zone'] = (int)($this->id_zone); + $fields['id_currency'] = (int)($this->id_currency); + $fields['iso_code'] = pSQL(strtoupper($this->iso_code)); + $fields['call_prefix'] = (int)($this->call_prefix); + $fields['active'] = (int)($this->active); + $fields['contains_states'] = (int)($this->contains_states); + $fields['need_identification_number'] = (int)($this->need_identification_number); + $fields['need_zip_code'] = (int)($this->need_zip_code); + $fields['zip_code_format'] = $this->zip_code_format; + $fields['display_tax_label'] = $this->display_tax_label; + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + /** + * Return available countries + * + * @param integer $id_lang Language ID + * @param boolean $active return only active coutries + * @return array Countries and corresponding zones + */ + static public function getCountries($id_lang, $active = false, $containStates = NULL, $id_shop = false) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + + $states = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT s.* + FROM `'._DB_PREFIX_.'state` s + ORDER BY s.`name` ASC'); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT cl.*,c.*, cl.`name` AS country, z.`name` AS zone + FROM `'._DB_PREFIX_.'country` c + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'country_shop cs ON (cs.id_country = c.id_country)' : '').' + LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'zone` z ON z.`id_zone` = c.`id_zone` + WHERE 1 + '.($active ? ' AND c.active = 1' : '') + .($id_shop ? ' AND cs.id_shop='.(int)$id_shop : '') + .(!is_null($containStates) ? 'AND c.`contains_states` = '.(int)($containStates) : '').' + ORDER BY cl.name ASC'); + $countries = array(); + foreach ($result AS &$country) + $countries[$country['id_country']] = $country; + foreach ($states AS &$state) + if (isset($countries[$state['id_country']])) /* Does not keep the state if its country has been disabled and not selected */ + $countries[$state['id_country']]['states'][] = $state; + + return $countries; + } + + /** + * Get a country ID with its iso code + * + * @param string $iso_code Country iso code + * @return integer Country ID + */ + static public function getByIso($iso_code) + { + if (!Validate::isLanguageIsoCode($iso_code)) + die(Tools::displayError()); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_country` + FROM `'._DB_PREFIX_.'country` + WHERE `iso_code` = \''.pSQL(strtoupper($iso_code)).'\''); + + return $result['id_country']; + } + + static public function getIdZone($id_country) + { + if (!Validate::isUnsignedId($id_country)) + die(Tools::displayError()); + + if (isset(self::$_idZones[$id_country])) + return self::$_idZones[$id_country]; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_zone` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)($id_country)); + + self::$_idZones[$id_country] = $result['id_zone']; + return $result['id_zone']; + } + + /** + * Get a country name with its ID + * + * @param integer $id_lang Language ID + * @param integer $id_country Country ID + * @return string Country name + */ + static public function getNameById($id_lang, $id_country) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name` + FROM `'._DB_PREFIX_.'country_lang` + WHERE `id_lang` = '.(int)($id_lang).' + AND `id_country` = '.(int)($id_country)); + + return $result['name']; + } + + /** + * Get a country iso with its ID + * + * @param integer $id_country Country ID + * @return string Country iso + */ + static public function getIsoById($id_country) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `iso_code` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)($id_country)); + + return $result['iso_code']; + } + + /** + * Get a country id with its name + * + * @param integer $id_lang Language ID + * @param string $country Country Name + * @return intval Country id + */ + static public function getIdByName($id_lang = NULL, $country) + { + $sql = ' + SELECT `id_country` + FROM `'._DB_PREFIX_.'country_lang` + WHERE `name` LIKE \''.pSQL($country).'\''; + if ($id_lang) + $sql .= ' AND `id_lang` = '.(int)($id_lang); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + + return ((int)($result['id_country'])); + } + + + /** + * @param $id_country + * @deprecated + */ + static public function getNeedIdentifcationNumber($id_country) + { + Tools::displayAsDeprecated(); + return self::isNeedDniByCountryId($id_country); + } + + static public function getNeedZipCode($id_country) + { + if (!(int)($id_country)) + return false; + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `need_zip_code` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)($id_country)); + } + + static public function getZipCodeFormat($id_country) + { + if (!(int)($id_country)) + return false; + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `zip_code_format` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)($id_country)); + } + + public static function displayCallPrefix($prefix) + { + return ((int)($prefix) ? '+'.$prefix : '-'); + } + + /** + * Returns the default country Id + * + * @return integer default country id + */ + public static function getDefaultCountryId() + { + global $cookie; + + if (Configuration::get('PS_GEOLOCATION_ENABLED') AND Validate::isLanguageIsoCode($cookie->iso_code_country)) + $id_country = (int)Country::getByIso($cookie->iso_code_country); + else + $id_country = (int)Configuration::get('PS_COUNTRY_DEFAULT'); + + return $id_country; + } + + + public static function getCountriesByZoneId($id_zone, $id_lang, $id_shop = false) + { + if (empty($id_zone) OR empty($id_lang)) + die(Tools::displayError()); + return Db::getInstance()->ExecuteS(' + SELECT DISTINCT c.*, cl.* + FROM `'._DB_PREFIX_.'country` c + '.($id_shop ? ' LEFT JOIN '._DB_PREFIX_.'country_shop cs ON (cs.id_country = c.id_country)' : '').' + LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_country` = c.`id_country`) + LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country`) + WHERE (c.`id_zone` = '.(int)$id_zone.' OR s.`id_zone` = '.(int)$id_zone.') + '.($id_shop ? ' AND cs.id_shop='.(int)$id_shop : '').' + AND `id_lang` = '.(int)$id_lang); + } + + public function isNeedDni() + { + return (bool)self::isNeedDniByCountryId($this->id); + } + + static public function isNeedDniByCountryId($id_country) + { + return (bool)Db::getInstance()->getValue(' + SELECT `need_identification_number` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)$id_country); + } + + static public function containsStates($id_country) + { + return (bool)Db::getInstance()->getValue(' + SELECT `contains_states` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)$id_country); + } +} diff --git a/classes/County.php b/classes/County.php new file mode 100644 index 000000000..6db4cc417 --- /dev/null +++ b/classes/County.php @@ -0,0 +1,244 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CountyCore extends ObjectModel +{ + public $id; + public $name; + public $id_state; + public $active; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('name' => 'isGenericName', 'id_state' => 'isUnsignedId', 'active' => 'isBool'); + + protected $table = 'county'; + protected $identifier = 'id_county'; + + private static $_cache_get_counties = array(); + private static $_cache_county_zipcode = array(); + + const USE_BOTH_TAX = 0; + const USE_COUNTY_TAX = 1; + const USE_STATE_TAX = 2; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_state' => array('xlink_resource'=> 'states'), + ), + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_state'] = (int)($this->id_state); + $fields['name'] = pSQL($this->name); + $fields['active'] = (int)($this->active); + return $fields; + } + + public function delete() + { + $id = $this->id; + parent::delete(); + + // remove associated zip codes & tax rule + return (County::deleteZipCodeByIdCounty($id) AND TaxRule::deleteTaxRuleByIdCounty($id)); + } + + public static function getCounties($id_state) + { + if (!isset(self::$_cache_get_counties[$id_state])) + { + self::$_cache_get_counties[$id_state] = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'county` + WHERE `id_state` = '.(int)$id_state + ); + } + + return self::$_cache_get_counties[$id_state]; + } + + // return the list of associated zipcode + public function getZipCodes() + { + return Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'county_zip_code` + WHERE `id_county` = '.(int)$this->id.' + ORDER BY `from_zip_code` ASC' + ); + } + + public function addZipCodes($zip_codes) + { + list($from, $to) = $this->breakDownZipCode($zip_codes); + + if ($from == 0) + return false; + + return Db::getInstance()->Execute( + 'INSERT INTO `'._DB_PREFIX_.'county_zip_code` (`id_county`, `from_zip_code`, `to_zip_code`) + VALUES ('.(int)$this->id.','.(int)$from.','.(int)$to.')' + ); + } + + + public function removeZipCodes($zip_codes) + { + list($from, $to) = $this->breakDownZipCode($zip_codes); + + if ($from == 0) + return false; + + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'county_zip_code` + WHERE `id_county` = '.(int)$this->id.' + AND `from_zip_code` = '.(int)$from.' + AND `to_zip_code` = '.(int)$to + ); + } + + + public function breakDownZipCode($zip_codes) + { + $zip_codes = preg_split('/-/', $zip_codes); + + if (sizeof($zip_codes) == 2) + { + $from = $zip_codes[0]; + $to = $zip_codes[1]; + if ($zip_codes[0] > $zip_codes[1]) + { + $from = $zip_codes[1]; + $to = $zip_codes[0]; + } + else if ($zip_codes[0] == $zip_codes[1]) + { + $from = $zip_codes[0]; + $to = 0; + } + } + else if (sizeof($zip_codes) == 1) + { + $from = $zip_codes[0]; + $to = 0; + } + + if (!Validate::isInt($from) OR !Validate::isInt($to)) + { + $from = 0; + $to = 0; + } + + return array($from, $to); + } + + public static function getIdCountyByZipCode($id_state, $zip_code) + { + if (!isset(self::$_cache_county_zipcode[$id_state.'-'.$zip_code])) + { + self::$_cache_county_zipcode[$id_state.'-'.$zip_code] = Db::getInstance()->getValue(' + SELECT DISTINCT c.`id_county` FROM `'._DB_PREFIX_.'county` c + LEFT JOIN `'._DB_PREFIX_.'county_zip_code` cz ON (c.`id_county` = cz.`id_county`) + WHERE `id_state` = '.(int)$id_state.' + AND cz.`from_zip_code` >= '.(int)$zip_code.' + AND cz.`to_zip_code` <= '.(int)$zip_code + ); + } + + return self::$_cache_county_zipcode[$id_state.'-'.$zip_code]; + } + + public function isZipCodeRangePresent($zip_codes) + { + $res = false; + list($from, $to) = $this->breakDownZipCode($zip_codes); + + if ($from == 0) + return false; + + if ($to != 0) + { + $res = Db::getInstance()->getValue(' + SELECT COUNT(*) FROM `'._DB_PREFIX_.'county_zip_code` cz + LEFT JOIN `'._DB_PREFIX_.'county` c ON (c.`id_county` = cz.`id_county`) + LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = c.`id_state`) + WHERE `from_zip_code` >= '.(int)$from.' + AND `to_zip_code` <= '.(int)$to.' + AND s.`id_country` = (SELECT `id_country` + FROM `'._DB_PREFIX_.'state` s + LEFT JOIN `'._DB_PREFIX_.'county` c ON (c.`id_state` = s.`id_state`) + WHERE `id_county` = '.(int)$this->id.' + )' + ); + } + + return ($res OR County::isZipCodePresent($from) OR County::isZipCodePresent($to)); + } + + public function isZipCodePresent($zip_code) + { + + if ($zip_code == 0) + return false; + + return (bool) Db::getInstance()->getValue(' + SELECT COUNT(*) FROM `'._DB_PREFIX_.'county_zip_code` cz + LEFT JOIN `'._DB_PREFIX_.'county` c ON (c.`id_county` = cz.`id_county`) + LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = c.`id_state`) + WHERE + (`from_zip_code` <= '.(int)$zip_code.' AND `to_zip_code` >= '.(int)$zip_code.') + OR + (`from_zip_code` = '.(int)$zip_code.') + AND s.`id_country` = (SELECT `id_country` + FROM `'._DB_PREFIX_.'state` s + LEFT JOIN `'._DB_PREFIX_.'county` c ON (c.`id_state` = s.`id_state`) + WHERE `id_county` = '.(int)$this->id.' + )' + ); + } + + public static function deleteZipCodeByIdCounty($id_county) + { + return Db::getInstance()->Execute( + 'DELETE FROM `'._DB_PREFIX_.'county_zip_code` + WHERE `id_county` = '.(int)$id_county + ); + } + + + public static function getIdCountyByNameAndIdState($name, $id_state) + { + return Db::getInstance()->getValue(' + SELECT `id_county` FROM `'._DB_PREFIX_.'county` + WHERE `name` = \''.pSQL($name).'\' + AND `id_state` = '.(int)$id_state + ); + } + +} + diff --git a/classes/Currency.php b/classes/Currency.php new file mode 100644 index 000000000..8c5765671 --- /dev/null +++ b/classes/Currency.php @@ -0,0 +1,377 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7503 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CurrencyCore extends ObjectModel +{ + public $id; + + /** @var string Name */ + public $name; + + /** @var string Iso code */ + public $iso_code; + + /** @var string Iso code numeric */ + public $iso_code_num; + + /** @var string Symbol for short display */ + public $sign; + + /** @var int bool used for displaying blank between sign and price */ + public $blank; + + /** @var string Conversion rate from euros */ + public $conversion_rate; + + /** @var boolean True if currency has been deleted (staying in database as deleted) */ + public $deleted = 0; + + /** @var int ID used for displaying prices */ + public $format; + + /** @var int bool Display decimals on prices */ + public $decimals; + + /** @var int bool active */ + public $active; + + protected $fieldsRequired = array('name', 'iso_code', 'sign', 'conversion_rate', 'format', 'decimals'); + protected $fieldsSize = array('name' => 32, 'iso_code' => 3, 'iso_code_num' => 3, 'sign' => 8); + protected $fieldsValidate = array('name' => 'isGenericName', 'iso_code' => 'isLanguageIsoCode', 'iso_code_num' => 'isNumericIsoCode', 'blank' => 'isInt', 'sign' => 'isGenericName', + 'format' => 'isUnsignedId', 'decimals' => 'isBool', 'conversion_rate' => 'isFloat', 'deleted' => 'isBool', 'active' => 'isBool'); + + protected $table = 'currency'; + protected $identifier = 'id_currency'; + + /** @var Currency Current currency */ + static protected $current = NULL; + /** @var array Currency cache */ + static protected $currencies = array(); + + protected $webserviceParameters = array( + 'objectsNodeName' => 'currencies', + ); + + + /** + * Overriding check if currency with the same iso code already exists. + * If it's true, currency is doesn't added. + * + * @see ObjectModelCore::add() + */ + public function add($autodate = true, $nullValues = false) + { + return Currency::exists($this->iso_code) ? false : parent::add(); + } + + /** + * Check if a curency already exists. + * + * @param int|string $iso_code int for iso code number string for iso code + * @return boolean + */ + public static function exists ($iso_code) + { + if(is_int($iso_code)) + $id_currency_exists = Currency::getIdByIsoCodeNum($iso_code); + else + $id_currency_exists = Currency::getIdByIsoCode($iso_code); + + if ($id_currency_exists){ + return true; + } else { + return false; + } + } + public function getFields() + { + parent::validateFields(); + + $fields['name'] = pSQL($this->name); + $fields['iso_code'] = pSQL($this->iso_code); + $fields['iso_code_num'] = pSQL($this->iso_code_num); + $fields['sign'] = pSQL($this->sign); + $fields['format'] = (int)($this->format); + $fields['decimals'] = (int)($this->decimals); + $fields['blank'] = (int)($this->blank); + $fields['conversion_rate'] = (float)($this->conversion_rate); + $fields['deleted'] = (int)($this->deleted); + $fields['active'] = (int)($this->active); + + return $fields; + } + + public function deleteSelection($selection) + { + if (!is_array($selection) OR !Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $result = true; + foreach ($selection AS $id) + { + $obj = new Currency((int)($id)); + $res[$id] = $obj->delete(); + } + foreach ($res AS $value) + if (!$value) + return false; + return true; + } + + public function delete() + { + if ($this->id == Configuration::get('PS_CURRENCY_DEFAULT')) + { + $result = Db::getInstance()->getRow('SELECT `id_currency` FROM '._DB_PREFIX_.'currency WHERE `id_currency` != '.(int)($this->id).' AND `deleted` = 0'); + if (!$result['id_currency']) + return false; + Configuration::updateValue('PS_CURRENCY_DEFAULT', $result['id_currency']); + } + $this->deleted = 1; + return $this->update(); + } + + /** + * Return formated sign + * + * @param string $side left or right + * @return string formated sign + */ + public function getSign($side=NULL) + { + if (!$side) + return $this->sign; + $formated_strings = array( + 'left' => $this->sign.' ', + 'right' => ' '.$this->sign + ); + $formats = array( + 1 => array('left' => &$formated_strings['left'], 'right' => ''), + 2 => array('left' => '', 'right' => &$formated_strings['right']), + 3 => array('left' => &$formated_strings['left'], 'right' => ''), + 4 => array('left' => '', 'right' => &$formated_strings['right']), + ); + return ($formats[$this->format][$side]); + } + + /** + * Return available currencies + * + * @return array Currencies + */ + static public function getCurrencies($object = false, $active = 1, $id_shop = false) + { + $tab = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'currency` c + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'currency_shop cs ON (c.id_currency = cs.id_currency)' : '').' + WHERE `deleted` = 0 + '.($active == 1 ? 'AND c.`active` = 1' : '').($id_shop ? ' AND cs.id_shop='.(int)$id_shop : '').' + ORDER BY `name` ASC'); + if ($object) + foreach ($tab as $key => $currency) + $tab[$key] = Currency::getCurrencyInstance($currency['id_currency']); + return $tab; + } + + static public function getPaymentCurrenciesSpecial($id_module, $id_shop = null) + { + if (is_null($id_shop)) + $id_shop = Shop::getCurrentShop(true); + + $sql = 'SELECT * + FROM '._DB_PREFIX_.'module_currency + WHERE id_module = '.(int)$id_module.' + AND id_shop ='.(int)$id_shop; + return Db::getInstance()->getRow($sql); + } + + static public function getPaymentCurrencies($id_module, $id_shop = null) + { + if (is_null($id_shop)) + $id_shop = Shop::getCurrentShop(true); + + $sql = 'SELECT c.* + FROM `'._DB_PREFIX_.'module_currency` mc + LEFT JOIN `'._DB_PREFIX_.'currency` c ON c.`id_currency` = mc.`id_currency` + WHERE c.`deleted` = 0 + AND mc.`id_module` = '.(int)$id_module.' + AND c.`active` = 1 + AND mc.id_shop = '.(int)$id_shop.' + ORDER BY c.`name` ASC'; + return Db::getInstance()->ExecuteS($sql); + } + + static public function checkPaymentCurrencies($id_module, $id_shop = null) + { + if (is_null($id_shop)) + $id_shop = Shop::getCurrentShop(true); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT mc.* + FROM `'._DB_PREFIX_.'module_currency` mc + WHERE mc.`id_module` = '.(int)$id_module.' AND mc.`id_shop`='.(int)$id_shop); + } + + static public function getCurrency($id_currency) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'currency` + WHERE `deleted` = 0 + AND `id_currency` = '.(int)($id_currency)); + } + + static public function getIdByIsoCode($iso_code) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_currency` + FROM `'._DB_PREFIX_.'currency` + WHERE `deleted` = 0 + AND `iso_code` = \''.pSQL($iso_code).'\''); + return $result['id_currency']; + } + + static public function getIdByIsoCodeNum($iso_code) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_currency` + FROM `'._DB_PREFIX_.'currency` + WHERE `deleted` = 0 + AND `iso_code_num` = \''.pSQL($iso_code).'\''); + return (int)$result['id_currency']; + } + + /** + * Refresh the currency conversion rate + * The XML file define conversion rate for each from a default currency ($isoCodeSource). + * + * @param $data XML content which contains all the conversion rates + * @param $isoCodeSource The default currency used in the XML file + * @param $defaultCurrency The default currency object + */ + public function refreshCurrency($data, $isoCodeSource, $defaultCurrency) + { + // fetch the conversion rate of the default currency + $conversion_rate = 1; + if ($defaultCurrency->iso_code != $isoCodeSource) + { + foreach ($data->currency AS $currency) + if ($currency['iso_code'] == $defaultCurrency->iso_code) + { + $conversion_rate = round((float)$currency['rate'], 6); + break; + } + } + + if ($defaultCurrency->iso_code == $this->iso_code) + $this->conversion_rate = 1; + else + { + if ($this->iso_code == $isoCodeSource) + $rate = 1; + else + { + foreach ($data->currency AS $obj) + if ($this->iso_code == strval($obj['iso_code'])) + { + $rate = (float) $obj['rate']; + break; + } + } + + $this->conversion_rate = round($rate / $conversion_rate, 6); + } + $this->update(); + } + + /** + * @deprecated + **/ + static public function refreshCurrenciesGetDefault($data, $isoCodeSource, $idCurrency) + { + Tools::displayAsDeprecated(); + + $defaultCurrency = new Currency($idCurrency); + + /* Change defaultCurrency rate if not as currency of feed source */ + if ($defaultCurrency->iso_code != $isoCodeSource) + foreach ($data->currency AS $obj) + if ($defaultCurrency->iso_code == strval($obj['iso_code'])) + $defaultCurrency->conversion_rate = round((float)($obj['rate']), 6); + + return $defaultCurrency; + } + + public static function getDefaultCurrency() + { + $id_currency = (int)Configuration::get('PS_CURRENCY_DEFAULT'); + if ($id_currency == 0) + return false; + + return new Currency($id_currency); + } + + static public function refreshCurrencies() + { + // Parse + if (!$feed = @simplexml_load_file('http://www.prestashop.com/xml/currencies.xml')) + return Tools::displayError('Cannot parse feed.'); + + // Default feed currency (EUR) + $isoCodeSource = strval($feed->source['iso_code']); + + if (!$default_currency = self::getDefaultCurrency()) + return Tools::displayError('No default currency'); + + $currencies = self::getCurrencies(true); + foreach ($currencies as $currency) + $currency->refreshCurrency($feed->list, $isoCodeSource, $default_currency); + + } + + static public function getCurrent() + { + global $cookie; + + if (!self::$current) + { + if (isset($cookie->id_currency) AND $cookie->id_currency) + self::$current = new Currency((int)($cookie->id_currency)); + else + self::$current = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + } + return self::$current; + } + + static public function getCurrencyInstance($id) + { + if (!array_key_exists($id, self::$currencies)) + self::$currencies[(int)($id)] = new Currency((int)($id)); + return self::$currencies[(int)($id)]; + } +} + diff --git a/classes/Customer.php b/classes/Customer.php new file mode 100644 index 000000000..6ca696eb1 --- /dev/null +++ b/classes/Customer.php @@ -0,0 +1,699 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7499 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CustomerCore extends ObjectModel +{ + public $id; + + public $id_shop; + + public $id_group_shop; + + /** @var string Secure key */ + public $secure_key; + + /** @var string protected note */ + public $note; + + /** @var integer Gender ID */ + public $id_gender = 9; + + /** @var integer Default group ID */ + public $id_default_group; + + /** @var string Lastname */ + public $lastname; + + /** @var string Firstname */ + public $firstname; + + /** @var string Birthday (yyyy-mm-dd) */ + public $birthday = NULL; + + /** @var string e-mail */ + public $email; + + /** @var boolean Newsletter subscription */ + public $newsletter; + + /** @var string Newsletter ip registration */ + public $ip_registration_newsletter; + + /** @var string Newsletter ip registration */ + public $newsletter_date_add; + + /** @var boolean Opt-in subscription */ + public $optin; + + /** @var integer Password */ + public $passwd; + + /** @var datetime Password */ + public $last_passwd_gen; + + /** @var boolean Status */ + public $active = true; + + /** @var boolean Status */ + public $is_guest = 0; + + /** @var boolean True if carrier has been deleted (staying in database as deleted) */ + public $deleted = 0; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + public $years; + public $days; + public $months; + + protected $tables = array ('customer'); + + protected $fieldsRequired = array('lastname', 'passwd', 'firstname', 'email'); + protected $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'note' => 65000); + protected $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd', + 'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'note' => 'isCleanHtml', 'is_guest' => 'isBool', 'id_shop' => 'isUnsignedId','id_group_shop' => 'isUnsignedId',); + + protected $webserviceParameters = array( + 'fields' => array( + 'id_default_group' => array('xlink_resource' => 'groups'), + 'newsletter_date_add' => array(), + 'ip_registration_newsletter' => array(), + 'last_passwd_gen' => array('setter' => null), + 'secure_key' => array('setter' => null), + 'deleted' => array(), + 'passwd' => array('setter' => 'setWsPasswd'), + ), + ); + + protected $table = 'customer'; + protected $identifier = 'id_customer'; + + protected static $_defaultGroupId = array(); + protected static $_customerHasAddress = array(); + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_customer'] = (int)($this->id); + + $fields['id_shop'] = (int)$this->id_shop; + $fields['id_group_shop'] = (int)$this->id_group_shop; + $fields['secure_key'] = pSQL($this->secure_key); + $fields['note'] = pSQL($this->note, true); + $fields['id_gender'] = (int)($this->id_gender); + $fields['id_default_group'] = (int)($this->id_default_group); + $fields['lastname'] = pSQL($this->lastname); + $fields['firstname'] = pSQL($this->firstname); + $fields['birthday'] = pSQL($this->birthday); + $fields['email'] = pSQL($this->email); + $fields['newsletter'] = (int)($this->newsletter); + $fields['newsletter_date_add'] = pSQL($this->newsletter_date_add); + $fields['ip_registration_newsletter'] = pSQL($this->ip_registration_newsletter); + $fields['optin'] = (int)($this->optin); + $fields['passwd'] = pSQL($this->passwd); + $fields['last_passwd_gen'] = pSQL($this->last_passwd_gen); + $fields['active'] = (int)($this->active); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['is_guest'] = (int)($this->is_guest); + $fields['deleted'] = (int)($this->deleted); + return $fields; + } + + public function add($autodate = true, $nullValues = true) + { + $this->id_shop = ($this->id_shop) ? $this->id_shop : Shop::getCurrentShop(); + $this->id_group_shop = ($this->id_group_shop) ? $this->id_group_shop : Shop::getCurrentGroupShop(); + $this->birthday = (empty($this->years) ? $this->birthday : (int)($this->years).'-'.(int)($this->months).'-'.(int)($this->days)); + $this->secure_key = md5(uniqid(rand(), true)); + $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_FRONT').'minutes')); + if (empty($this->id_default_group)) + $this->id_default_group = 1; + /* Can't create a guest customer, if this feature is disabled */ + if ($this->is_guest AND !Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) + return false; + if (!parent::add($autodate, $nullValues)) + return false; + + $row = array('id_customer' => (int)($this->id), 'id_group' => (int)$this->id_default_group); + return Db::getInstance()->AutoExecute(_DB_PREFIX_.'customer_group', $row, 'INSERT'); + } + + public function update($nullValues = false) + { + $this->birthday = (empty($this->years) ? $this->birthday : (int)$this->years.'-'.(int)$this->months.'-'.(int)$this->days); + if ($this->newsletter AND !$this->newsletter_date_add) + $this->newsletter_date_add = date('Y-m-d H:i:s'); + return parent::update(true); + } + + public function delete() + { + $addresses = $this->getAddresses((int)(Configuration::get('PS_LANG_DEFAULT'))); + foreach ($addresses AS $address) + { + $obj = new Address((int)($address['id_address'])); + $obj->delete(); + } + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customer_group` WHERE `id_customer` = '.(int)($this->id)); + Discount::deleteByIdCustomer((int)($this->id)); + return parent::delete(); + } + + /** + * Return customers list + * + * @return array Customers + */ + static public function getCustomers() + { + $sql = 'SELECT `id_customer`, `email`, `firstname`, `lastname` + FROM `'._DB_PREFIX_.'customer` + WHERE 1 + '.Shop::sqlRestriction(true).' + ORDER BY `id_customer` ASC'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + /** + * Return customer instance from its e-mail (optionnaly check password) + * + * @param string $email e-mail + * @param string $passwd Password is also checked if specified + * @return Customer instance + */ + public function getByEmail($email, $passwd = NULL, $id_group_shop = null, $id_shop = null) + { + if (!Validate::isEmail($email) OR ($passwd AND !Validate::isPasswd($passwd))) + die (Tools::displayError()); + + $sql = 'SELECT * + FROM `'._DB_PREFIX_ .'customer` + WHERE `active` = 1 + AND `email` = \''.pSQL($email).'\' + '.Shop::sqlRestriction(true, null, $id_shop, $id_group_shop).' + '.(isset($passwd) ? 'AND `passwd` = \''.md5(_COOKIE_KEY_.$passwd).'\'' : '').' + AND `deleted` = 0 + AND `is_guest` = 0'; + $result = Db::getInstance()->getRow($sql); + + if (!$result) + return false; + $this->id = $result['id_customer']; + foreach ($result AS $key => $value) + if (key_exists($key, $this)) + $this->{$key} = $value; + + return $this; + } + + /** + * Check id the customer is active or not + * + * @return boolean customer validity + */ + public static function isBanned($id_customer) + { + if (!Validate::isUnsignedId($id_customer)) + return true; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_customer` + FROM `'._DB_PREFIX_.'customer` + WHERE `id_customer` = \''.(int)($id_customer).'\' + AND active = 1 + AND `deleted` = 0'); + if (isset($result['id_customer'])) + return false; + return true; + } + + /** + * Check if e-mail is already registered in database + * + * @param string $email e-mail + * @param $return_id boolean + * @param $ignoreGuest boolean, for exclure guest customer + * @return Customer ID if found, false otherwise + */ + static public function customerExists($email, $return_id = false, $ignoreGuest = true, $id_group_shop = null, $id_shop = null) + { + if (!Validate::isEmail($email)) + die (Tools::displayError()); + + $sql = 'SELECT `id_customer` + FROM `'._DB_PREFIX_.'customer` + WHERE `email` = \''.pSQL($email).'\' + '.Shop::sqlRestriction(true, null, $id_shop, $id_group_shop). + ($ignoreGuest ? 'AND `is_guest` = 0' : ''); + $result = Db::getInstance()->getRow($sql); + + if ($return_id) + return $result['id_customer']; + return isset($result['id_customer']); + } + + /** + * Check if, except current customer, someone else registered this e-email + * + * @return integer Number of customers who have also this e-mail + * @deprecated + */ + public function cantChangeemail() + { + Tools::displayAsDeprecated(); + if (!Validate::isEmail($this->email)) + die (Tools::displayError()); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(`id_customer`) AS total + FROM `'._DB_PREFIX_.'customer` + WHERE `email` = \''.pSQL($this->email).'\' AND `id_customer` != '.(int)($this->id)); + + return $result['total']; + } + + /** + * Check if an address is owned by a customer + * + * @param integer $id_customer Customer ID + * @param integer $id_address Address ID + * @return boolean result + */ + static public function customerHasAddress($id_customer, $id_address) + { + if (!array_key_exists($id_customer, self::$_customerHasAddress)) + { + self::$_customerHasAddress[$id_customer] = (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `id_address` + FROM `'._DB_PREFIX_.'address` + WHERE `id_customer` = '.(int)($id_customer).' + AND `id_address` = '.(int)($id_address).' + AND `deleted` = 0'); + } + return self::$_customerHasAddress[$id_customer]; + } + + static public function resetAddressCache($id_customer) + { + if (array_key_exists($id_customer, self::$_customerHasAddress)) + unset(self::$_customerHasAddress[$id_customer]); + } + + /** + * Return customer addresses + * + * @param integer $id_lang Language ID + * @return array Addresses + */ + public function getAddresses($id_lang) + { + $sql = 'SELECT a.*, cl.`name` AS country, s.name AS state, s.iso_code AS state_iso + FROM `'._DB_PREFIX_.'address` a + LEFT JOIN `'._DB_PREFIX_.'country` c ON (a.`id_country` = c.`id_country`) + LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country`) + LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = a.`id_state`) + WHERE `id_lang` = '.(int)($id_lang).' AND `id_customer` = '.(int)($this->id).' AND a.`deleted` = 0'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + + /** + * Returns customer last connections + * + * @param integer $nb Number of connections wanted + * @return array Connections + */ + public function getConnections($nb = 10) + { + Tools::displayAsDeprecated(); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT `ip_address`, `date_add` + FROM `'._DB_PREFIX_.'connections` + WHERE `id_guest` IN (SELECT `id_guest` FROM `'._DB_PREFIX_.'guest` WHERE `id_customer` = '.(int)($this->id).') + ORDER BY `date_add` DESC + LIMIT 0,'.(int)($nb)); + } + + /** + * Count the number of addresses for a customer + * + * @param integer $id_customer Customer ID + * @return integer Number of addresses + */ + public static function getAddressesTotalById($id_customer) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT COUNT(`id_address`) + FROM `'._DB_PREFIX_.'address` + WHERE `id_customer` = '.(int)($id_customer).' + AND `deleted` = 0'); + } + + /** + * Check if customer password is the right one + * + * @param string $passwd Password + * @return boolean result + */ + static public function checkPassword($id_customer, $passwd) + { + if (!Validate::isUnsignedId($id_customer) OR !Validate::isMd5($passwd)) + die (Tools::displayError()); + + $sql = 'SELECT `id_customer` + FROM `'._DB_PREFIX_.'customer` + WHERE `id_customer` = '.$id_customer.' + AND `passwd` = \''.$passwd.'\''; + return (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + /** + * Return customers who have subscribed to the newsletter + * + * @return array Customers + * @deprecated + */ + public static function getNewsletteremails() + { + Tools::displayAsDeprecated(); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT `email`, `firstname`, `lastname`, `newsletter`, `ip_registration_newsletter`, `newsletter_date_add` + FROM `'._DB_PREFIX_.'customer` + WHERE `newsletter` = 1 + AND `active` = 1'); + } + + /** + * Return the number of customers who registered today + * + * @return integer number of customers who registered today + * @deprecated + */ + public static function getTodaysRegistration() + { + Tools::displayAsDeprecated(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(`id_customer`) as nb + FROM `'._DB_PREFIX_.'customer` + WHERE DAYOFYEAR(`date_add`) = DAYOFYEAR(NOW()) + AND YEAR(`date_add`) = YEAR(NOW())'); + if (!$result['nb']) + return '0'; + return $result['nb']; + } + + /** + * Light back office search for customers + * + * @param string $query Searched string + * @return array Corresponding customers + */ + public static function searchByName($query) + { + $sql = 'SELECT * + FROM `'._DB_PREFIX_.'customer` + WHERE ( + `email` LIKE \'%'.pSQL($query).'%\' + OR `id_customer` LIKE \'%'.pSQL($query).'%\' + OR `lastname` LIKE \'%'.pSQL($query).'%\' + OR `firstname` LIKE \'%'.pSQL($query).'%\' + )'.Shop::sqlRestriction(true); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + /** + * Return several useful statistics about customer + * + * @return array Stats + */ + public function getStats() + { + $result = Db::getInstance()->getRow(' + SELECT COUNT(`id_order`) AS nb_orders, SUM(`total_paid` / o.`conversion_rate`) AS total_orders + FROM `'._DB_PREFIX_.'orders` o + WHERE o.`id_customer` = '.(int)($this->id).' + AND o.valid = 1'); + + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT MAX(c.`date_add`) AS last_visit + FROM `'._DB_PREFIX_.'guest` g + LEFT JOIN `'._DB_PREFIX_.'connections` c ON c.id_guest = g.id_guest + WHERE g.`id_customer` = '.(int)($this->id)); + + $result3 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT (YEAR(CURRENT_DATE)-YEAR(c.`birthday`)) - (RIGHT(CURRENT_DATE, 5)ExecuteS(' + SELECT c.date_add, COUNT(cp.id_page) AS pages, TIMEDIFF(MAX(cp.time_end), c.date_add) as time, http_referer,INET_NTOA(ip_address) as ipaddress + FROM `'._DB_PREFIX_.'guest` g + LEFT JOIN `'._DB_PREFIX_.'connections` c ON c.id_guest = g.id_guest + LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.id_connections = cp.id_connections + WHERE g.`id_customer` = '.(int)($this->id).' + GROUP BY c.`id_connections` + ORDER BY c.date_add DESC + LIMIT 10'); + } + + /** + * Return last cart ID for this customer + * + * @return integer Cart ID + * @deprecated + */ + public function getLastCart() + { + Tools::displayAsDeprecated(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT MAX(c.`id_cart`) AS id_cart + FROM `'._DB_PREFIX_.'cart` c + WHERE c.`id_customer` = '.(int)($this->id)); + if (isset($result['id_cart'])) + return $result['id_cart']; + return false; + } + /* + * Specify if a customer already in base + * + * @param $id_customer Customer id + * @return boolean + */ + // DEPRECATED + public function customerIdExists($id_customer) + { + return self::customerIdExistsStatic((int)($id_customer)); + } + + static public function customerIdExistsStatic($id_customer) + { + $row = Db::getInstance()->getRow(' + SELECT `id_customer` + FROM '._DB_PREFIX_.'customer c + WHERE c.`id_customer` = '.(int)($id_customer)); + + return isset($row['id_customer']); + } + + public function cleanGroups() + { + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customer_group` WHERE `id_customer` = '.(int)($this->id)); + } + + public function addGroups($groups) + { + foreach ($groups as $group) + { + $row = array('id_customer' => (int)($this->id), 'id_group' => (int)($group)); + Db::getInstance()->AutoExecute(_DB_PREFIX_.'customer_group', $row, 'INSERT'); + } + } + + public static function getGroupsStatic($id_customer) + { + $groups = array(); + $result = Db::getInstance()->ExecuteS(' + SELECT cg.`id_group` + FROM '._DB_PREFIX_.'customer_group cg + WHERE cg.`id_customer` = '.(int)($id_customer)); + foreach ($result AS $group) + $groups[] = (int)($group['id_group']); + return $groups; + } + + public function getGroups() + { + return self::getGroupsStatic((int)($this->id)); + } + + public function isUsed() + { + return false; + } + + /** + * @param int $id_group + * @return int + * @deprecated + */ + public function isMemberOfGroup($id_group) + { + Tools::displayAsDeprecated(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT count(cg.`id_group`) as nb + FROM '._DB_PREFIX_.'customer_group cg + WHERE cg.`id_customer` = '.(int)($this->id).' + AND cg.`id_group` = '.(int)($id_group)); + + return $result['nb']; + } + + public function getBoughtProducts() + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order + WHERE o.valid = 1 AND o.`id_customer` = '.(int)($this->id)); + } + + /** + * @deprecated + * @return bool + */ + public function getNeedDNI() + { + Tools::displayAsDeprecated(); + + return false; + } + + static public function getDefaultGroupId($id_customer) + { + if (!isset(self::$_defaultGroupId[(int)($id_customer)])) + self::$_defaultGroupId[(int)($id_customer)] = Db::getInstance()->getValue('SELECT `id_default_group` FROM `'._DB_PREFIX_.'customer` WHERE `id_customer` = '.(int)($id_customer)); + return self::$_defaultGroupId[(int)($id_customer)]; + } + + static public function getCurrentCountry($id_customer) + { + global $cart; + + if (!$cart OR !$cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) + $id_address = (int)(Db::getInstance()->getValue('SELECT `id_address` FROM `'._DB_PREFIX_.'address` WHERE `id_customer` = '.(int)($id_customer).' AND `deleted` = 0 ORDER BY `id`')); + else + $id_address = $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}; + $ids = Address::getCountryAndState($id_address); + return (int)($ids['id_country'] ? $ids['id_country'] : Configuration::get('PS_COUNTRY_DEFAULT')); + } + + public function toggleStatus() + { + parent::toggleStatus(); + + /* Change status to active/inactive */ + return Db::getInstance()->Execute(' + UPDATE `'.pSQL(_DB_PREFIX_.$this->table).'` + SET `date_upd` = NOW() + WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + } + + + public function isGuest() + { + return (bool)$this->is_guest; + } + + public function transformToCustomer($id_lang, $password = NULL) + { + if (!$this->isGuest()) + return false; + if (empty($password)) + $password = Tools::passwdGen(); + if (!Validate::isPasswd($password)) + return false; + + $this->is_guest = 0; + $this->passwd = Tools::encrypt($password); + if ($this->update()) + { + $vars = array( + '{firstname}' => $this->firstname, + '{lastname}' => $this->lastname, + '{email}' => $this->email, + '{passwd}' => $password + ); + + Mail::Send((int)$id_lang, 'guest_to_customer', Mail::l('Your guest account has been transformed to customer account'), $vars, $this->email, $this->firstname.' '.$this->lastname); + return true; + } + return false; + } + + static public function printNewsIcon($id_customer, $tr) + { + $customer = new Customer($tr['id_customer']); + if (!Validate::isLoadedObject($customer)) + die(Tools::displayError('Invalid objects')); + echo ''. + ($customer->newsletter ? '' : ''). + ''; + } + + static public function printOptinIcon($id_customer, $tr) + { + $customer = new Customer($tr['id_customer']); + if (!Validate::isLoadedObject($customer)) + die(Tools::displayError('Invalid objects')); + echo ''. + ($customer->optin ? '' : ''). + ''; + } + + public function setWsPasswd($passwd) + { + if ($this->id != 0) + { + if ($this->passwd != $passwd) + $this->passwd = Tools::encrypt($passwd); + } + else + $this->passwd = Tools::encrypt($passwd); + return true; + } +} \ No newline at end of file diff --git a/classes/CustomerMessage.php b/classes/CustomerMessage.php new file mode 100644 index 000000000..202a6d307 --- /dev/null +++ b/classes/CustomerMessage.php @@ -0,0 +1,59 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CustomerMessageCore extends ObjectModel +{ + public $id; + public $id_customer_thread; + public $id_employee; + public $message; + public $file_name; + public $ip_address; + public $user_agent; + public $date_add; + + protected $table = 'customer_message'; + protected $identifier = 'id_customer_message'; + + protected $fieldsRequired = array('message'); + protected $fieldsSize = array('message' => 65000); + protected $fieldsValidate = array('message' => 'isCleanHtml', 'id_employee' => 'isUnsignedId', 'ip_address' => 'isIp2Long'); + + public function getFields() + { + parent::validateFields(); + $fields['id_customer_thread'] = (int)($this->id_customer_thread); + $fields['id_employee'] = (int)($this->id_employee); + $fields['message'] = pSQL($this->message); + $fields['file_name'] = pSQL($this->file_name); + $fields['ip_address'] = (int)($this->ip_address); + $fields['user_agent'] = pSQL($this->user_agent); + $fields['date_add'] = pSQL($this->date_add); + return $fields; + } +} + diff --git a/classes/CustomerThread.php b/classes/CustomerThread.php new file mode 100644 index 000000000..500cfb8d4 --- /dev/null +++ b/classes/CustomerThread.php @@ -0,0 +1,84 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CustomerThreadCore extends ObjectModel +{ + public $id; + public $id_shop; + public $id_lang; + public $id_contact; + public $id_customer; + public $id_order; + public $id_product; + public $status; + public $email; + public $token; + public $date_add; + public $date_upd; + + protected $table = 'customer_thread'; + protected $identifier = 'id_customer_thread'; + + protected $fieldsRequired = array('id_lang', 'id_contact', 'token'); + protected $fieldsSize = array('email' => 254); + protected $fieldsValidate = array('id_lang' => 'isUnsignedId', 'id_contact' => 'isUnsignedId', 'id_shop' => 'isUnsignedId', 'id_customer' => 'isUnsignedId', + 'id_order' => 'isUnsignedId', 'id_product' => 'isUnsignedId', 'email' => 'isEmail', 'token' => 'isGenericName'); + + public function getFields() + { + parent::validateFields(); + $fields['id_lang'] = (int)($this->id_lang); + $fields['id_shop'] = (int)$this->id_shop; + $fields['id_contact'] = (int)($this->id_contact); + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_order'] = (int)($this->id_order); + $fields['id_product'] = (int)($this->id_product); + $fields['status'] = pSQL($this->status); + $fields['email'] = pSQL($this->email); + $fields['token'] = pSQL($this->token); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + public function delete() + { + if (!Validate::isUnsignedId($this->id)) + return false; + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customer_message` WHERE `id_customer_thread` = '.(int)($this->id)); + return (parent::delete()); + } + + public static function getCustomerMessages($id_customer) + { + return Db::getInstance()->ExecuteS(' + SELECT * FROM '._DB_PREFIX_.'customer_thread ct + LEFT JOIN '._DB_PREFIX_.'customer_message cm ON ct.id_customer_thread = cm.id_customer_thread + WHERE id_customer = '.(int)($id_customer)); + } +} + diff --git a/classes/Customization.php b/classes/Customization.php new file mode 100644 index 000000000..1ea2c8df7 --- /dev/null +++ b/classes/Customization.php @@ -0,0 +1,125 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CustomizationCore +{ + + static public function getReturnedCustomizations($id_order) + { + if (($result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT ore.`id_order_return`, ord.`id_order_detail`, ord.`id_customization`, ord.`product_quantity` + FROM `'._DB_PREFIX_.'order_return` ore + INNER JOIN `'._DB_PREFIX_.'order_return_detail` ord ON (ord.`id_order_return` = ore.`id_order_return`) + WHERE ore.`id_order` = '.(int)($id_order).' AND ord.`id_customization` != 0')) === false) + return false; + $customizations = array(); + foreach ($result AS $row) + $customizations[(int)($row['id_customization'])] = $row; + return $customizations; + } + + static public function getOrderedCustomizations($id_cart) + { + if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `id_customization`, `quantity` FROM `'._DB_PREFIX_.'customization` WHERE `id_cart` = '.(int)($id_cart))) + return false; + $customizations = array(); + foreach ($result AS $row) + $customizations[(int)($row['id_customization'])] = $row; + return $customizations; + } + + static public function countCustomizationQuantityByProduct($customizations) + { + $total = array(); + foreach ($customizations AS $customization) + $total[(int)($customization['id_order_detail'])] = !isset($total[(int)($customization['id_order_detail'])]) ? (int)($customization['quantity']) : $total[(int)($customization['id_order_detail'])] + (int)($customization['quantity']); + return $total; + } + + static public function getLabel($id_customization, $id_lang) + { + if (!$id_customization || !$id_lang) + return false; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name` + FROM `'._DB_PREFIX_.'customization_field_lang` + WHERE `id_customization_field` = '.(int)($id_customization).' + AND `id_lang` = '.(int)($id_lang) + ); + + return $result['name']; + } + + public static function retrieveQuantitiesFromIds($ids_customizations) + { + $quantities = array(); + + $in_values = ''; + foreach($ids_customizations as $key => $id_customization) + { + if ($key > 0) $in_values += ','; + $in_values += (int)($id_customization); + } + + if (!empty($in_values)) + { + $results = Db::getInstance()->ExecuteS( + 'SELECT `id_customization`, `id_product`, `quantity`, `quantity_refunded`, `quantity_returned` + FROM `'._DB_PREFIX_.'customization` + WHERE `id_customization` IN ('.$in_values.')'); + + foreach($results as $row) + { + $quantities[$row['id_customization']] = $row; + } + } + + return $quantities; + } + + public static function countQuantityByCart($id_cart) + { + $quantity = array(); + + $results = Db::getInstance()->executeS(' + SELECT `id_product`, `id_product_attribute`, SUM(`quantity`) AS quantity + FROM `'._DB_PREFIX_.'customization` + WHERE `id_cart` = '.(int)($id_cart).' + GROUP BY `id_cart`, `id_product`, `id_product_attribute`' + ); + + foreach($results as $row) + { + $quantity[$row['id_product']][$row['product_attribute_id']] = $row['quantity']; + } + + return $quantity; + } + +} + diff --git a/classes/DateRange.php b/classes/DateRange.php new file mode 100644 index 000000000..e1e191075 --- /dev/null +++ b/classes/DateRange.php @@ -0,0 +1,67 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class DateRangeCore extends ObjectModel +{ + public $time_start; + public $time_end; + + protected $fieldsRequired = array ('time_start', 'time_end'); + protected $fieldsValidate = array ('time_start' => 'isDate', 'time_end' => 'isDate'); + + protected $table = 'date_range'; + protected $identifier = 'id_date_range'; + + public function getFields() + { + parent::validateFields(); + $fields['time_start'] = pSQL($this->time_start); + $fields['time_end'] = pSQL($this->time_end); + return $fields; + } + + public static function getCurrentRange() + { + $result = Db::getInstance()->getRow(' + SELECT `id_date_range`, `time_end` + FROM `'._DB_PREFIX_.'date_range` + WHERE `time_end` = (SELECT MAX(`time_end`) FROM `'._DB_PREFIX_.'date_range`)'); + if (!$result['id_date_range'] OR strtotime($result['time_end']) < strtotime(date('Y-m-d H:i:s'))) + { + // The default range is set to 1 day less 1 second (in seconds) + $rangeSize = 86399; + $dateRange = new DateRange(); + $dateRange->time_start = date('Y-m-d'); + $dateRange->time_end = strftime('%Y-%m-%d %H:%M:%S', strtotime($dateRange->time_start) + $rangeSize); + $dateRange->add(); + return $dateRange->id; + } + return $result['id_date_range']; + } +} + + diff --git a/classes/Db.php b/classes/Db.php new file mode 100644 index 000000000..e20efe3e2 --- /dev/null +++ b/classes/Db.php @@ -0,0 +1,328 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (file_exists(dirname(__FILE__).'/../config/settings.inc.php')) + include_once(dirname(__FILE__).'/../config/settings.inc.php'); +//include_once(dirname(__FILE__).'/../classes/MySQL.php'); + +abstract class DbCore +{ + /** @var string Server (eg. localhost) */ + protected $_server; + + /** @var string Database user (eg. root) */ + protected $_user; + + /** @var string Database password (eg. can be empty !) */ + protected $_password; + + /** @var string Database type (MySQL, PgSQL) */ + protected $_type; + + /** @var string Database name */ + protected $_database; + + /** @var mixed Ressource link */ + protected $_link; + + /** @var mixed SQL cached result */ + protected $_result; + + /** @var mixed ? */ + protected static $_db; + + /** @var mixed Object instance for singleton */ + protected static $_instance = array(); + + protected static $_servers = array( + array('server' => _DB_SERVER_, 'user' => _DB_USER_, 'password' => _DB_PASSWD_, 'database' => _DB_NAME_), /* MySQL Master server */ + /* Add here your slave(s) server(s)*/ + /*array('server' => '192.168.0.15', 'user' => 'rep', 'password' => '123456', 'database' => 'rep'), + array('server' => '192.168.0.3', 'user' => 'myuser', 'password' => 'mypassword', 'database' => 'mydatabase'), + */ + ); + + protected $_lastQuery; + protected $_lastCached; + + protected static $_idServer; + + /** + * Get Db object instance (Singleton) + * + * @param boolean $master Decides wether the connection to be returned by the master server or the slave server + * @return object Db instance + */ + public static function getInstance($master = 1) + { + if ($master OR ($nServers = sizeof(self::$_servers)) == 1) + $idServer = 0; + else + $idServer = ($nServers > 2 AND ($id = ++self::$_idServer % (int)$nServers) !== 0) ? $id : 1; + + if(!isset(self::$_instance[$idServer])) + self::$_instance[(int)($idServer)] = new MySQL(self::$_servers[(int)($idServer)]['server'], self::$_servers[(int)($idServer)]['user'], self::$_servers[(int)($idServer)]['password'], self::$_servers[(int)($idServer)]['database']); + + return self::$_instance[(int)($idServer)]; + } + + public function getRessource() { return $this->_link;} + + public function __destruct() + { + $this->disconnect(); + } + + /** + * Build a Db object + */ + public function __construct($server, $user, $password, $database) + { + $this->_server = $server; + $this->_user = $user; + $this->_password = $password; + $this->_type = _DB_TYPE_; + $this->_database = $database; + + $this->connect(); + } + + /** + * Filter SQL query within a blacklist + * + * @param string $table Table where insert/update data + * @param string $values Data to insert/update + * @param string $type INSERT or UPDATE + * @param string $where WHERE clause, only for UPDATE (optional) + * @param string $limit LIMIT clause (optional) + * @return mixed|boolean SQL query result + */ + public function autoExecute($table, $values, $type, $where = false, $limit = false, $use_cache = 1) + { + if (!sizeof($values)) + return true; + + if (strtoupper($type) == 'INSERT') + { + $query = 'INSERT INTO `'.$table.'` ('; + foreach ($values AS $key => $value) + $query .= '`'.$key.'`,'; + $query = rtrim($query, ',').') VALUES ('; + foreach ($values AS $key => $value) + $query .= '\''.$value.'\','; + $query = rtrim($query, ',').')'; + if ($limit) + $query .= ' LIMIT '.(int)($limit); + return $this->q($query, $use_cache); + } + elseif (strtoupper($type) == 'UPDATE') + { + $query = 'UPDATE `'.$table.'` SET '; + foreach ($values AS $key => $value) + $query .= '`'.$key.'` = \''.$value.'\','; + $query = rtrim($query, ','); + if ($where) + $query .= ' WHERE '.$where; + if ($limit) + $query .= ' LIMIT '.(int)($limit); + return $this->q($query, $use_cache); + } + + return false; + } + + + /** + * Filter SQL query within a blacklist + * + * @param string $table Table where insert/update data + * @param string $values Data to insert/update + * @param string $type INSERT or UPDATE + * @param string $where WHERE clause, only for UPDATE (optional) + * @param string $limit LIMIT clause (optional) + * @return mixed|boolean SQL query result + */ + public function autoExecuteWithNullValues($table, $values, $type, $where = false, $limit = false) + { + if (!sizeof($values)) + return true; + + if (strtoupper($type) == 'INSERT') + { + $query = 'INSERT INTO `'.$table.'` ('; + foreach ($values AS $key => $value) + $query .= '`'.$key.'`,'; + $query = rtrim($query, ',').') VALUES ('; + foreach ($values AS $key => $value) + $query .= (($value === '' OR $value === NULL) ? 'NULL' : '\''.$value.'\'').','; + $query = rtrim($query, ',').')'; + if ($limit) + $query .= ' LIMIT '.(int)($limit); + return $this->q($query); + } + elseif (strtoupper($type) == 'UPDATE') + { + $query = 'UPDATE `'.$table.'` SET '; + foreach ($values AS $key => $value) + $query .= '`'.$key.'` = '.(($value === '' OR $value === NULL) ? 'NULL' : '\''.$value.'\'').','; + $query = rtrim($query, ','); + if ($where) + $query .= ' WHERE '.$where; + if ($limit) + $query .= ' LIMIT '.(int)($limit); + return $this->q($query); + } + + return false; + } + + /********************************************************* + * ABSTRACT METHODS + *********************************************************/ + + /** + * Open a connection + */ + abstract public function connect(); + + /** + * Get the ID generated from the previous INSERT operation + */ + abstract public function Insert_ID(); + + /** + * Get number of affected rows in previous databse operation + */ + abstract public function Affected_Rows(); + + /** + * Gets the number of rows in a result + */ + abstract public function NumRows(); + + /** + * Delete + */ + abstract public function delete ($table, $where = false, $limit = false, $use_cache = 1); + /** + * Fetches a row from a result set + */ + abstract public function Execute ($query, $use_cache = 1); + + /** + * Fetches an array containing all of the rows from a result set + */ + abstract public function ExecuteS($query, $array = true, $use_cache = 1); + + /* + * Get next row for a query which doesn't return an array + */ + abstract public function nextRow($result = false); + + /** + * Alias of Db::getInstance()->ExecuteS + * + * @acces string query The query to execute + * @return array Array of line returned by MySQL + */ + static public function s($query, $use_cache = 1) + { + return Db::getInstance()->ExecuteS($query, true, $use_cache); + } + + static public function ps($query, $use_cache = 1) + { + $ret = Db::s($query, $use_cache); + p($ret); + return $ret; + } + + static public function ds($query, $use_cache = 1) + { + Db::s($query, $use_cache); + die(); + } + + /** + * getRow return an associative array containing the first row of the query + * This function automatically add "limit 1" to the query + * + * @param mixed $query the select query (without "LIMIT 1") + * @param int $use_cache find it in cache first + * @return array associative array of (field=>value) + */ + abstract public function getRow($query, $use_cache = 1); + + /** + * getValue return the first item of a select query. + * + * @param mixed $query + * @param int $use_cache + * @return void + */ + abstract public function getValue($query, $use_cache = 1); + + /** + * Returns the text of the error message from previous database operation + */ + abstract public function getMsgError(); +} + +/** + * Sanitize data which will be injected into SQL query + * + * @param string $string SQL data which will be injected into SQL query + * @param boolean $htmlOK Does data contain HTML code ? (optional) + * @return string Sanitized data + */ +function pSQL($string, $htmlOK = false) +{ + if (_PS_MAGIC_QUOTES_GPC_) + $string = stripslashes($string); + if (!is_numeric($string)) + { + $link = Db::getInstance()->getRessource(); + $string = _PS_MYSQL_REAL_ESCAPE_STRING_ ? mysql_real_escape_string($string, $link) : addslashes($string); + if (!$htmlOK) + $string = strip_tags(nl2br2($string)); + } + + return $string; +} + +/** + * Convert \n and \r\n and \r to
+ * + * @param string $string String to transform + * @return string New string + */ +function nl2br2($string) +{ + return str_replace(array("\r\n", "\r", "\n"), '
', $string); +} + + diff --git a/classes/Delivery.php b/classes/Delivery.php new file mode 100644 index 000000000..5e36effd4 --- /dev/null +++ b/classes/Delivery.php @@ -0,0 +1,78 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class DeliveryCore extends ObjectModel +{ + /** @var integer */ + public $id_delivery; + + /** @var integer */ + public $id_carrier; + + /** @var integer */ + public $id_range_price; + + /** @var integer */ + public $id_range_weight; + + /** @var integer */ + public $id_zone; + + /** @var float */ + public $price; + + protected $fieldsRequired = array ('id_carrier', 'id_range_price', 'id_range_weight', 'id_zone', 'price'); + protected $fieldsValidate = array ('id_carrier' => 'isUnsignedId', 'id_range_price' => 'isUnsignedId', + 'id_range_weight' => 'isUnsignedId', 'id_zone' => 'isUnsignedId', 'price' => 'isPrice'); + + protected $table = 'delivery'; + protected $identifier = 'id_delivery'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'deliveries', + 'fields' => array( + 'id_carrier' => array('xlink_resource' => 'carriers'), + 'id_range_price' => array('xlink_resource' => 'price_ranges'), + 'id_range_weight' => array('xlink_resource' => 'weight_ranges'), + 'id_zone' => array('xlink_resource' => 'zones'), + ) + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_carrier'] = (int)($this->id_carrier); + $fields['id_range_price'] = (int)($this->id_range_price); + $fields['id_range_weight'] = (int)($this->id_range_weight); + $fields['id_zone'] = (int)($this->id_zone); + $fields['price'] = (float)($this->price); + + return $fields; + } +} + diff --git a/classes/Discount.php b/classes/Discount.php new file mode 100644 index 000000000..0fcb6dff3 --- /dev/null +++ b/classes/Discount.php @@ -0,0 +1,520 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class DiscountCore extends ObjectModel +{ + public $id; + + public $id_group_shop; + + public $id_shop; + + /** @var integer Customer id only if discount is reserved */ + public $id_customer; + + /** @var integer Group id only if discount is reserved */ + public $id_group; + + /** @var integer Currency ID only if the discount type is 2 */ + public $id_currency; + + /** @var integer Discount type ID */ + public $id_discount_type; + + /** @var string Name (the one which must be entered) */ + public $name; + + /** @var string A short description for the discount */ + public $description; + + /** @var string Value in percent as well as in euros */ + public $value; + + /** @var integer Totale quantity available */ + public $quantity; + + /** @var integer User quantity available */ + public $quantity_per_user; + + /** @var boolean Indicate if discount is cumulable with others */ + public $cumulable; + + /** @var integer Indicate if discount is cumulable with already bargained products */ + public $cumulable_reduction; + + /** @var integer Date from wich discount become active */ + public $date_from; + + /** @var integer Date from wich discount is no more active */ + public $date_to; + + /** @var integer Minimum cart total amount required to use the discount */ + public $minimal; + + /** @var integer display the discount in the summary */ + public $cart_display; + + public $behavior_not_exhausted; + + /** @var boolean Status */ + public $active = true; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $fieldsRequired = array('id_discount_type', 'name', 'value', 'quantity', 'quantity_per_user', 'date_from', 'date_to'); + protected $fieldsSize = array('name' => '32', 'date_from' => '32', 'date_to' => '32'); + protected $fieldsValidate = array('id_customer' => 'isUnsignedId', 'id_group' => 'isUnsignedId', 'id_discount_type' => 'isUnsignedId', 'id_currency' => 'isUnsignedId', + 'name' => 'isDiscountName', 'value' => 'isPrice', 'quantity' => 'isUnsignedInt', 'quantity_per_user' => 'isUnsignedInt', + 'cumulable' => 'isBool', 'cumulable_reduction' => 'isBool', 'date_from' => 'isDate', + 'date_to' => 'isDate', 'minimal' => 'isUnsignedFloat', 'active' => 'isBool'); + protected $fieldsRequiredLang = array('description'); + protected $fieldsSizeLang = array('description' => 128); + protected $fieldsValidateLang = array('description' => 'isVoucherDescription'); + + protected $table = 'discount'; + protected $identifier = 'id_discount'; + + + protected $webserviceParameters = array( + 'fields' => array( + 'id_discount_type' => array('sqlId' => 'id_discount_type', 'xlink_resource' => 'discount_types'), + 'id_customer' => array('sqlId' => 'id_customer', 'xlink_resource' => 'customers'), + 'id_group' => array('sqlId' => 'id_group', 'xlink_resource' => 'groups'), + 'id_currency' => array('sqlId' => 'id_currency', 'xlink_resource' => 'currencies'), + 'name' => array('sqlId' => 'name'), + 'value' => array('sqlId' => 'value'), + 'quantity' => array('sqlId' => 'quantity'), + 'quantity_per_user' => array('sqlId' => 'quantity_per_user'), + 'cumulable' => array('sqlId' => 'cumulable'), + 'cumulable_reduction' => array('sqlId' => 'cumulable_reduction'), + 'behavior_not_exhausted' => array('sqlId' => 'behavior_not_exhausted'), + 'date_from' => array('sqlId' => 'date_from'), + 'date_to' => array('sqlId' => 'date_to'), + 'minimal' => array('sqlId' => 'minimal'), + 'active' => array('sqlId' => 'active'), + 'cart_display' => array('sqlId' => 'cart_display'), + 'date_add' => array('sqlId' => 'date_add'), + 'date_upd' => array('sqlId' => 'date_upd') + ) + ); + + + + public function getFields() + { + parent::validateFields(); + + $fields['id_group_shop'] = (int)$this->id_group_shop; + $fields['id_shop'] = (int)$this->id_shop; + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_group'] = (int)($this->id_group); + $fields['id_currency'] = (int)($this->id_currency); + $fields['id_discount_type'] = (int)($this->id_discount_type); + $fields['name'] = pSQL($this->name); + $fields['value'] = (float)($this->value); + $fields['quantity'] = (int)($this->quantity); + $fields['quantity_per_user'] = (int)($this->quantity_per_user); + $fields['cumulable'] = (int)($this->cumulable); + $fields['cumulable_reduction'] = (int)($this->cumulable_reduction); + $fields['date_from'] = pSQL($this->date_from); + $fields['date_to'] = pSQL($this->date_to); + $fields['minimal'] = (float)($this->minimal); + $fields['behavior_not_exhausted'] = (int)$this->behavior_not_exhausted; + $fields['active'] = (int)($this->active); + $fields['cart_display'] = (int)($this->cart_display); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + public function add($autodate = true, $nullValues = false, $categories = null) + { + $ret = NULL; + if (parent::add($autodate, $nullValues)) + $ret = true; + + $this->updateCategories($categories); + return $ret; + } + + /* Categories initialization is different between add() and update() because the addition will set all categories if none are selected (compatibility with old modules) and update won't update categories if none are selected */ + public function update($autodate = true, $nullValues = false, $categories = false) + { + $ret = NULL; + if (parent::update($autodate, $nullValues)) + $ret = true; + + $this->updateCategories($categories); + return $ret; + } + + public function delete() + { + if (!parent::delete()) + return false; + return (Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'cart_discount WHERE id_discount = '.(int)($this->id)) + AND Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'discount_category WHERE id_discount = '.(int)($this->id))); + } + + public function getTranslationsFieldsChild() + { + if (!parent::validateFieldsLang()) + return false; + return parent::getTranslationsFields(array('description')); + } + + /** + * Return discount types list + * + * @return array Discount types + */ + static public function getDiscountTypes($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'discount_type dt + LEFT JOIN `'._DB_PREFIX_.'discount_type_lang` dtl ON (dt.`id_discount_type` = dtl.`id_discount_type` AND dtl.`id_lang` = '.(int)($id_lang).')'); + } + + /** + * Get discount ID from name + * + * @param string $discountName Discount name + * @return integer Discount ID + */ + public static function getIdByName($discountName) + { + if (!Validate::isDiscountName($discountName)) + die(Tools::displayError()); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_discount` + FROM `'._DB_PREFIX_.'discount` + WHERE `name` = \''.pSQL($discountName).'\''); + return isset($result['id_discount']) ? $result['id_discount'] : false; + } + + /** + * Return customer discounts + * + * @param integer $id_lang Language ID + * @param boolean $id_customer Customer ID + * @return array Discounts + */ + static public function getCustomerDiscounts($id_lang, $id_customer, $active = false, $includeGenericOnes = true, $stock = false) + { + global $cart; + + $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT d.*, dtl.`name` AS `type`, dl.`description` + FROM `'._DB_PREFIX_.'discount` d + LEFT JOIN `'._DB_PREFIX_.'discount_lang` dl ON (d.`id_discount` = dl.`id_discount` AND dl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'discount_type` dt ON dt.`id_discount_type` = d.`id_discount_type` + LEFT JOIN `'._DB_PREFIX_.'discount_type_lang` dtl ON (dt.`id_discount_type` = dtl.`id_discount_type` AND dtl.`id_lang` = '.(int)($id_lang).') + WHERE (`id_customer` = '.(int)($id_customer).' + OR `id_group` IN (SELECT `id_group` FROM `'._DB_PREFIX_.'customer_group` WHERE `id_customer` = '.(int)($id_customer).')'. + ($includeGenericOnes ? ' OR (`id_customer` = 0 AND `id_group` = 0)' : '').') + '.($active ? ' AND d.`active` = 1' : '').' + '.($stock ? ' AND d.`quantity` != 0' : '')); + + foreach ($res as &$discount) + if ($discount['quantity_per_user']) + { + $quantity_used = Order::getDiscountsCustomer((int)($id_customer), (int)($discount['id_discount'])); + if (isset($cart) AND isset($cart->id)) + $quantity_used += $cart->getDiscountsCustomer((int)($discount['id_discount'])); + $discount['quantity_for_user'] = $discount['quantity_per_user'] - $quantity_used; + } + else + $discount['quantity_for_user'] = 0; + return $res; + } + + public function usedByCustomer($id_customer) + { + return Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'order_discount` od + LEFT JOIN `'._DB_PREFIX_.'orders` o ON (od.`id_order` = o.`id_order`) + WHERE od.`id_discount` = '.(int)($this->id).' + AND o.`id_customer` = '.(int)($id_customer) + ); + } + + /** + * Return discount value + * + * @param integer $nb_discounts Number of discount currently in cart + * @param boolean $order_total_products Total cart products amount + * @return mixed Return a float value or '!' if reduction is 'Shipping free' + */ + public function getValue($nb_discounts = 0, $order_total_products = 0, $shipping_fees = 0, $idCart = false, $useTax = true, $id_group_shop = false, $id_shop = false) + { + $totalAmount = 0; + + $cart = new Cart((int)($idCart)); + if (!Validate::isLoadedObject($cart)) + return 0; + + if ((!$this->cumulable AND (int)($nb_discounts) > 1) OR !$this->active OR (!$this->quantity AND !$cart->OrderExists())) + return 0; + + if ($this->usedByCustomer((int)($cart->id_customer)) >= $this->quantity_per_user AND !$cart->OrderExists()) + return 0; + + $date_start = strtotime($this->date_from); + $date_end = strtotime($this->date_to); + if ((time() < $date_start OR time() > $date_end) AND !$cart->OrderExists()) return 0; + + if ($id_group_shop AND $id_shop) + if (!$this->availableWithShop($id_group_shop, $id_shop)) + return 0; + $products = $cart->getProducts(); + $categories = Discount::getCategories((int)($this->id)); + $in_category = false; + + foreach ($products AS $product) + if (count($categories) AND Product::idIsOnCategoryId($product['id_product'], $categories)) + $totalAmount += $useTax ? $product['price_wt'] * $product['quantity']: $product['price'] * $product['quantity']; + + if ($this->minimal > 0 AND $totalAmount < $this->minimal) + return 0; + + switch ($this->id_discount_type) + { + /* Relative value (% of the order total) */ + case 1: + $amount = 0; + $percentage = $this->value / 100; + foreach ($products AS $product) + if (Product::idIsOnCategoryId($product['id_product'], $categories)) + if ($this->cumulable_reduction OR (!$product['reduction_applies'] AND !$product['on_sale'])) + $amount += ($useTax ? $product['total_wt'] : $product['total']) * $percentage; + return $amount; + + /* Absolute value */ + case 2: + // An "absolute" voucher is available in one currency only + $currency = ((int)$cart->id_currency ? Currency::getCurrencyInstance($cart->id_currency) : Currency::getCurrent()); + if ($this->id_currency != $currency->id) + return 0; + + $taxDiscount = Cart::getTaxesAverageUsed((int)($cart->id)); + if (!$useTax AND isset($taxDiscount) AND $taxDiscount != 1) + $this->value = abs($this->value / (1 + $taxDiscount * 0.01)); + + // Main return + $value = 0; + foreach ($products AS $product) + if (Product::idIsOnCategoryId($product['id_product'], $categories)) + $value = $this->value; + // Return 0 if there are no applicable categories + return $value; + + /* Free shipping (does not return a value but a special code) */ + case 3: + return '!'; + } + return 0; + } + + /** + * @param int $id_category_product + * @param int $id_category_discount + * @return bool + * @deprecated + */ + static public function isParentCategoryProductDiscount($id_category_product, $id_category_discount) + { + Tools::displayAsDeprecated(); + $category = new Category((int)($id_category_product)); + $parentCategories = $category->getParentsCategories(); + foreach($parentCategories AS $parentCategory) + if($id_category_discount == $parentCategory['id_category']) + return true; + return false; + } + + static public function getCategories($id_discount) + { + return Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'discount_category` + WHERE `id_discount` = '.(int)($id_discount)); + } + + public function updateCategories($categories) + { + /* false value will avoid category update and null value will force all category to be selected */ + if ($categories === false) + return ; + if ($categories === null) + { + // Compatibility for modules which create discount without setting categories (ex. fidelity, sponsorship) + $result = Db::getInstance()->ExecuteS('SELECT id_category FROM '._DB_PREFIX_.'category'); + $categories = array(); + foreach ($result as $row) + $categories[] = $row['id_category']; + } + elseif (!is_array($categories) OR !sizeof($categories)) + return false; + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount_category` WHERE `id_discount`='.(int)($this->id)); + foreach($categories AS $category) + { + Db::getInstance()->ExecuteS(' + SELECT `id_discount` + FROM `'._DB_PREFIX_.'discount_category` + WHERE `id_discount`='.(int)($this->id).' AND `id_category`='.(int)($category)); + if (Db::getInstance()->NumRows() == 0) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'discount_category` (`id_discount`, `id_category`) VALUES('.(int)($this->id).','.(int)($category).')'); + } + } + + static public function discountExists($discountName, $id_discount = 0) + { + return Db::getInstance()->getRow('SELECT `id_discount` FROM '._DB_PREFIX_.'discount WHERE `name` LIKE \''.pSQL($discountName).'\' AND `id_discount` != '.(int)($id_discount)); + } + + static public function createOrderDiscount($order, $productList, $qtyList, $name, $shipping_cost = false, $id_category = 0, $subcategory = 0) + { + $languages = Language::getLanguages($order); + $products = $order->getProducts(false, $productList, $qtyList); + + // Totals are stored in the order currency (or at least should be) + $total = $order->getTotalProductsWithTaxes($products); + $discounts = $order->getDiscounts(true); + $total_tmp = $total; + foreach ($discounts as $discount) + { + if ($discount['id_discount_type'] == 1) + $total -= $total_tmp * ($discount['value'] / 100); + elseif ($discount['id_discount_type'] == 2) + $total -= ($discount['value'] * ($total_tmp / $order->total_products_wt)); + } + if ($shipping_cost) + $total += $order->total_shipping; + + // create discount + $voucher = new Discount(); + $voucher->id_discount_type = 2; + foreach ($languages as $language) + $voucher->description[$language['id_lang']] = strval($name).(int)($order->id); + $voucher->value = (float)($total); + $voucher->name = 'V0C'.(int)($order->id_customer).'O'.(int)($order->id); + $voucher->id_customer = (int)($order->id_customer); + $voucher->id_currency = (int)($order->id_currency); + $voucher->quantity = 1; + $voucher->quantity_per_user = 1; + $voucher->cumulable = 1; + $voucher->cumulable_reduction = 1; + $voucher->minimal = (float)($voucher->value); + $voucher->active = 1; + $voucher->cart_display = 1; + $voucher->id_group_shop = (int)$order->id_group_shop; + $voucher->id_shop = (int)$order->id_shop; + + $now = time(); + $voucher->date_from = date('Y-m-d H:i:s', $now); + $voucher->date_to = date('Y-m-d H:i:s', $now + (3600 * 24 * 365.25)); /* 1 year */ + if (!$voucher->validateFieldsLang(false) OR !$voucher->add()) + return false; + // set correct name + $voucher->name = 'V'.(int)($voucher->id).'C'.(int)($order->id_customer).'O'.$order->id; + if (!$voucher->update()) + return false; + + return $voucher; + } + + static public function display($discountValue, $discountType, $currency = false) + { + if ((float)($discountValue) AND (int)($discountType)) + { + if ($discountType == 1) + return $discountValue.chr(37); // ASCII #37 --> % (percent) + elseif ($discountType == 2) + return Tools::displayPrice($discountValue, $currency); + } + return ''; // return a string because it's a display method + } + + static public function getVouchersToCartDisplay($id_lang, $id_customer) + { + return Db::getInstance()->ExecuteS(' + SELECT d.`name`, dl.`description`, d.`id_discount` + FROM `'._DB_PREFIX_.'discount` d + LEFT JOIN `'._DB_PREFIX_.'discount_lang` dl ON (d.`id_discount` = dl.`id_discount`) + WHERE d.`active` = 1 + AND d.`date_from` <= \''.pSQL(date('Y-m-d H:i:s')).'\' AND d.`date_to` >= \''.pSQL(date('Y-m-d H:i:s')).'\' + AND dl.`id_lang` = '.(int)($id_lang).' + AND d.`cart_display` = 1 AND d.`quantity` > 0 + AND ((d.`id_customer` = 0 AND d.`id_group` = 0) '.($id_customer ? 'OR (d.`id_customer` = '.$id_customer.' + OR d.`id_group` IN (SELECT `id_group` FROM `'._DB_PREFIX_.'customer_group` WHERE `id_customer` = '.(int)($id_customer).')))' : 'OR d.`id_group` = 1)')); + } + + static public function deleteByIdCustomer($id_customer) + { + $discounts = Db::getInstance()->ExecuteS('SELECT `id_discount` FROM `'._DB_PREFIX_.'discount` WHERE `id_customer` = '.(int)($id_customer)); + foreach ($discounts as $discount) + { + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount` WHERE `id_discount` = '.(int)($discount['id_discount'])); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount_category` WHERE `id_discount` = '.(int)($discount['id_discount'])); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount_lang` WHERE `id_discount` = '.(int)($discount['id_discount'])); + } + return true; + } + + static public function deleteByIdGroup($id_group) + { + $discounts = Db::getInstance()->ExecuteS('SELECT `id_discount` FROM `'._DB_PREFIX_.'discount` WHERE `id_group` = '.(int)($id_group)); + foreach ($discounts as $discount) + { + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount` WHERE `id_discount` = '.(int)($discount['id_discount'])); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount_category` WHERE `id_discount` = '.(int)($discount['id_discount'])); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount_lang` WHERE `id_discount` = '.(int)($discount['id_discount'])); + } + return true; + } + + static public function getDiscount($id_discount) + { + return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'discount` WHERE `id_discount` = '.(int)$id_discount); + } + + public function availableWithShop($id_group_shop, $id_shop) + { + return Db::getInstance()->getValue('SELECT d.id_discount + FROM '._DB_PREFIX_.'discount d + LEFT JOIN '._DB_PREFIX_.'group_shop gs ON (gs.id_group_shop=d.id_group_shop) + WHERE d.id_discount='.(int)$this->id.' AND (d.id_shop='.(int)$id_shop.' OR (d.id_group_shop='.(int)$id_group_shop.' AND gs.share_datas=1))'); + } +} + diff --git a/classes/Dispatcher.php b/classes/Dispatcher.php new file mode 100644 index 000000000..d28ee9edd --- /dev/null +++ b/classes/Dispatcher.php @@ -0,0 +1,51 @@ +loadControllers(); + } + + public function dispatch() + { + self::$controller = $this->getController(); + + self::$controller = str_replace('-', '', strtolower(self::$controller)); + if (!isset($this->controllers[self::$controller])) + self::$controller = 'index'; + ControllerFactory::getController($this->controllers[self::$controller])->run(); + } + + protected function loadControllers() + { + $controller_files = scandir(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.'controllers'); + foreach($controller_files as $controller_filename) + { + if (substr($controller_filename, -14, 14) == 'Controller.php') + $this->controllers[strtolower(substr($controller_filename, 0, -14))] = basename($controller_filename, '.php'); + } + + // add default controller + $this->controllers['index'] = 'IndexController'; + $this->controllers['authentication'] = $this->controllers['auth']; + $this->controllers['productscomparison'] = $this->controllers['compare']; + } + + public function getController() + { + $controller = Tools::getValue('controller'); + if (isset($controller) && preg_match('/^([0-9a-z_-]+)\?(.*)=(.*)$/Ui', $controller, $controller_string)) + { + $controller = $controller_string[1]; + if (isset($_GET['controller'])) + $_GET[$controller_string[2]] = $controller_string[3]; + elseif (isset($_POST['controller'])) + $_POST[$controller_string[2]] = $controller_string[3]; + } + return (!empty($controller)) ? $controller : 'index'; + } +} diff --git a/classes/Employee.php b/classes/Employee.php new file mode 100644 index 000000000..a652cbb39 --- /dev/null +++ b/classes/Employee.php @@ -0,0 +1,223 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class EmployeeCore extends ObjectModel +{ + public $id; + + /** @var string Determine employee profile */ + public $id_profile; + + /** @var string employee language */ + public $id_lang; + + /** @var string Lastname */ + public $lastname; + + /** @var string Firstname */ + public $firstname; + + /** @var string e-mail */ + public $email; + + /** @var string Password */ + public $passwd; + + /** @var datetime Password */ + public $last_passwd_gen; + + public $stats_date_from; + public $stats_date_to; + + /** @var string Display back office background in the specified color */ + public $bo_color; + + /** @var string employee's chosen theme */ + public $bo_theme; + + /** @var string / enum hover or click mode */ + public $bo_uimode; + + /** @var boolean Status */ + public $active = 1; + + protected $fieldsRequired = array('lastname', 'firstname', 'email', 'passwd', 'id_profile', 'id_lang'); + protected $fieldsSize = array('lastname' => 32, 'firstname' => 32, 'email' => 128, 'passwd' => 32, 'bo_color' => 32, 'bo_theme' => 32); + protected $fieldsValidate = array('lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'id_lang' => 'isUnsignedInt', + 'passwd' => 'isPasswdAdmin', 'active' => 'isBool', 'id_profile' => 'isInt', 'bo_color' => 'isColor', 'bo_theme' => 'isGenericName', 'bo_uimode' => 'isGenericName'); + + protected $table = 'employee'; + protected $identifier = 'id_employee'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_lang' => array('xlink_resource' => 'languages'), + 'last_passwd_gen' => array('setter' => null), + 'stats_date_from' => array('setter' => null), + 'stats_date_to' => array('setter' => null), + 'passwd' => array('setter' => 'setWsPasswd'), + ), + ); + + + public function getFields() + { + parent::validateFields(); + + $fields['id_profile'] = (int)$this->id_profile; + $fields['id_lang'] = (int)$this->id_lang; + $fields['lastname'] = pSQL($this->lastname); + $fields['firstname'] = pSQL(Tools::ucfirst($this->firstname)); + $fields['email'] = pSQL($this->email); + $fields['passwd'] = pSQL($this->passwd); + $fields['last_passwd_gen'] = pSQL($this->last_passwd_gen); + + if (empty($this->stats_date_from)) + $this->stats_date_from = date('Y-m-d 00:00:00'); + $fields['stats_date_from'] = pSQL($this->stats_date_from); + + if (empty($this->stats_date_to)) + $this->stats_date_to = date('Y-m-d 23:59:59'); + $fields['stats_date_to'] = pSQL($this->stats_date_to); + + $fields['bo_color'] = pSQL($this->bo_color); + $fields['bo_theme'] = pSQL($this->bo_theme); + $fields['bo_uimode'] = pSQL($this->bo_uimode); + $fields['active'] = (int)$this->active; + + return $fields; + } + + /** + * Return all employee id and email + * + * @return array Employees + * @deprecated + */ + static public function getEmployees() + { + Tools::displayAsDeprecated(); + return Db::getInstance()->ExecuteS(' + SELECT `id_employee`, CONCAT(`firstname`, \' \', `lastname`) AS "name" + FROM `'._DB_PREFIX_.'employee` + WHERE `active` = 1 + ORDER BY `email`'); + } + + public function add($autodate = true, $nullValues = true) + { + $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_BACK').'minutes')); + return parent::add($autodate, $nullValues); + } + + /** + * Return employee instance from its e-mail (optionnaly check password) + * + * @param string $email e-mail + * @param string $passwd Password is also checked if specified + * @return Employee instance + */ + public function getByEmail($email, $passwd = NULL) + { + if (!Validate::isEmail($email) OR ($passwd != NULL AND !Validate::isPasswd($passwd))) + die(Tools::displayError()); + + $result = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'employee` + WHERE `active` = 1 + AND `email` = \''.pSQL($email).'\' + '.($passwd ? 'AND `passwd` = \''.Tools::encrypt($passwd).'\'' : '')); + if (!$result) + return false; + $this->id = $result['id_employee']; + $this->id_profile = $result['id_profile']; + foreach ($result AS $key => $value) + if (key_exists($key, $this)) + $this->{$key} = $value; + return $this; + } + + static public function employeeExists($email) + { + if (!Validate::isEmail($email)) + die (Tools::displayError()); + + return (bool)Db::getInstance()->getValue(' + SELECT `id_employee` + FROM `'._DB_PREFIX_.'employee` + WHERE `email` = \''.pSQL($email).'\''); + } + + /** + * Check if employee password is the right one + * + * @param string $passwd Password + * @return boolean result + */ + static public function checkPassword($id_employee, $passwd) + { + if (!Validate::isUnsignedId($id_employee) OR !Validate::isPasswd($passwd, 8)) + die (Tools::displayError()); + + return Db::getInstance()->getValue(' + SELECT `id_employee` + FROM `'._DB_PREFIX_.'employee` + WHERE `id_employee` = '.(int)$id_employee.' + AND `passwd` = \''.pSQL($passwd).'\' + AND active = 1'); + } + + static public function countProfile($id_profile, $activeOnly = false) + { + return Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'employee` + WHERE `id_profile` = '.(int)$id_profile.' + '.($activeOnly ? ' AND `active` = 1' : '')); + } + + public function isLastAdmin() + { + return ($this->id_profile == _PS_ADMIN_PROFILE_ + AND Employee::countProfile($this->id_profile, true) == 1 + AND $this->active + ); + } + + public function setWsPasswd($passwd) + { + if ($this->id != 0) + { + if ($this->passwd != $passwd) + $this->passwd = Tools::encrypt($passwd); + } + else + $this->passwd = Tools::encrypt($passwd); + return true; + } +} \ No newline at end of file diff --git a/classes/Feature.php b/classes/Feature.php new file mode 100644 index 000000000..9abf375ef --- /dev/null +++ b/classes/Feature.php @@ -0,0 +1,207 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class FeatureCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 128); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'feature'; + protected $identifier = 'id_feature'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'product_features', + 'objectNodeName' => 'product_feature', + 'fields' => array(), + ); + + public function getFields() + { + return array('id_feature' => NULL); + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + /** + * Get a feature data for a given id_feature and id_lang + * + * @param integer $id_lang Language id + * @param integer $id_feature Feature id + * @return array Array with feature's data + * @static + */ + static public function getFeature($id_lang, $id_feature) + { + return Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'feature` f + LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON ( f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = '.(int)($id_lang).') + WHERE f.`id_feature` = '.(int)($id_feature)); + } + + /** + * Get all features for a given language + * + * @param integer $id_lang Language id + * @return array Multiple arrays with feature's data + * @static + */ + static public function getFeatures($id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'feature` f + LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON (f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = '.(int)($id_lang).') + ORDER BY fl.`name` ASC'); + } + + /** + * Delete several objects from database + * + * @param array $selection Array with items to delete + * @return boolean Deletion result + */ + public function deleteSelection($selection) + { + /* Also delete Attributes */ + foreach ($selection AS $value) { + $obj = new Feature($value); + if (!$obj->delete()) + return false; + } + return true; + } + + public function add($autodate = true, $nullValues = false) + { + return parent::add($autodate, true); + } + + public function delete() + { + /* Also delete related attributes */ + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'feature_value_lang` WHERE `id_feature_value` IN (SELECT id_feature_value FROM `'._DB_PREFIX_.'feature_value` WHERE `id_feature` = '.(int)($this->id).')'); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'feature_value` WHERE `id_feature` = '.(int)($this->id)); + /* Also delete related products */ + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'feature_product` WHERE `id_feature` = '.(int)($this->id)); + return parent::delete(); + } + + public function update($nullValues = false) + { + $this->clearCache(); + + $result = 1; + $fields = $this->getTranslationsFieldsChild(); + foreach ($fields as $field) + { + foreach ($field as $key => $value) + if (!Validate::isTableOrIdentifier($key)) + die(Tools::displayError()); + $mode = Db::getInstance()->getRow('SELECT `id_lang` FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` WHERE `'.pSQL($this->identifier). + '` = '.(int)($this->id).' AND `id_lang` = '.(int)($field['id_lang'])); + $result *= (!Db::getInstance()->NumRows()) ? Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'INSERT') : + Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'UPDATE', '`'. + pSQL($this->identifier).'` = '.(int)($this->id).' AND `id_lang` = '.(int)($field['id_lang'])); + } + return $result; + } + + /** + * Count number of features for a given language + * + * @param integer $id_lang Language id + * @return int Number of feature + * @static + */ + static public function nbFeatures($id_lang) + { + $result = Db::getInstance()->getRow(' + SELECT COUNT(ag.`id_feature`) as nb + FROM `'._DB_PREFIX_.'feature` ag + LEFT JOIN `'._DB_PREFIX_.'feature_lang` agl ON (ag.`id_feature` = agl.`id_feature` AND `id_lang` = '.(int)($id_lang).') + ORDER BY `name` ASC'); + return ($result['nb']); + } + + /** + * Create a feature from import + * + * @param integer $id_feature Feature id + * @param integer $id_product Product id + * @param array $value Feature Value + */ + static public function addFeatureImport($name) + { + $rq = Db::getInstance()->getRow('SELECT `id_feature` FROM '._DB_PREFIX_.'feature_lang WHERE `name` = \''.pSQL($name).'\' GROUP BY `id_feature`'); + if (!empty($rq)) + return (int)($rq['id_feature']); + // Feature doesn't exist, create it + $feature = new Feature(); + $languages = Language::getLanguages(); + foreach ($languages as $language) + $feature->name[$language['id_lang']] = strval($name); + $feature->add(); + return $feature->id; + } + + public static function getFeaturesForComparison($list_ids_product, $id_lang) + { + $ids = ''; + foreach($list_ids_product as $id) + $ids .= (int)($id).','; + + $ids = rtrim($ids, ','); + + if (empty($ids)) + return false; + + return Db::getInstance()->ExecuteS(' + SELECT * , COUNT(*) as nb + FROM `'._DB_PREFIX_.'feature` f + LEFT JOIN `'._DB_PREFIX_.'feature_product` fp ON f.`id_feature` = fp.`id_feature` + LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON f.`id_feature` = fl.`id_feature` + WHERE fp.`id_product` IN ('.$ids.') + AND `id_lang` = '.(int)($id_lang).' + GROUP BY f.`id_feature` + ORDER BY nb DESC'); + } +} + diff --git a/classes/FeatureValue.php b/classes/FeatureValue.php new file mode 100644 index 000000000..41fac6fa7 --- /dev/null +++ b/classes/FeatureValue.php @@ -0,0 +1,176 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class FeatureValueCore extends ObjectModel +{ + /** @var integer Group id which attribute belongs */ + public $id_feature; + + /** @var string Name */ + public $value; + + /** @var boolean Custom */ + public $custom = 0; + + protected $fieldsRequired = array('id_feature'); + protected $fieldsValidate = array('id_feature' => 'isUnsignedId', 'custom' => 'isBool'); + protected $fieldsRequiredLang = array('value'); + protected $fieldsSizeLang = array('value' => 255); + protected $fieldsValidateLang = array('value' => 'isGenericName'); + + protected $table = 'feature_value'; + protected $identifier = 'id_feature_value'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'product_feature_values', + 'objectNodeName' => 'product_feature_value', + 'fields' => array( + 'id_feature' => array('xlink_resource'=> 'product_features'), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_feature'] = (int)$this->id_feature; + $fields['custom'] = (int)$this->custom; + + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('value')); + } + + /** + * Get all values for a given feature + * + * @param boolean $id_feature Feature id + * @return array Array with feature's values + * @static + */ + static public function getFeatureValues($id_feature) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'feature_value` + WHERE `id_feature` = '.(int)$id_feature); + } + + /** + * Get all values for a given feature and language + * + * @param integer $id_lang Language id + * @param boolean $id_feature Feature id + * @return array Array with feature's values + * @static + */ + static public function getFeatureValuesWithLang($id_lang, $id_feature) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'feature_value` v + LEFT JOIN `'._DB_PREFIX_.'feature_value_lang` vl ON (v.`id_feature_value` = vl.`id_feature_value` AND vl.`id_lang` = '.(int)$id_lang.') + WHERE v.`id_feature` = '.(int)$id_feature.' AND (v.`custom` IS NULL OR v.`custom` = 0) + ORDER BY vl.`value` ASC'); + } + + /** + * Get all language for a given value + * + * @param boolean $id_feature_value Feature value id + * @return array Array with value's languages + * @static + */ + static public function getFeatureValueLang($id_feature_value) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'feature_value_lang` + WHERE `id_feature_value` = '.(int)$id_feature_value.' + ORDER BY `id_lang`'); + } + + /** + * Select the good lang in tab + * + * @param array $lang Array with all language + * @param integer $id_lang Language id + * @return string String value name selected + * @static + */ + static public function selectLang($lang, $id_lang) + { + foreach ($lang as $tab) + if ($tab['id_lang'] == $id_lang) + return $tab['value']; + } + + static public function addFeatureValueImport($id_feature, $name) + { + $rq = Db::getInstance()->ExecuteS(' + SELECT fv.`id_feature_value` + FROM '._DB_PREFIX_.'feature_value fv + LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.`id_feature_value` = fv.`id_feature_value`) + WHERE `value` = \''.pSQL($name).'\' + AND fv.`id_feature` = '.(int)$id_feature.' + AND fv.`custom` = 0 + GROUP BY fv.`id_feature_value` LIMIT 1'); + + if (!isset($rq[0]['id_feature_value']) OR !$id_feature_value = (int)$rq[0]['id_feature_value']) + { + // Feature doesn't exist, create it + $featureValue = new FeatureValue(); + + $languages = Language::getLanguages(); + foreach ($languages AS $language) + $featureValue->value[$language['id_lang']] = strval($name); + + $featureValue->id_feature = (int)$id_feature; + $featureValue->custom = 1; + $featureValue->add(); + + return (int)$featureValue->id; + } + return (int)$id_feature_value; + } + + public function delete() + { + /* Also delete related products */ + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'feature_product` WHERE `id_feature_value` = '.(int)$this->id); + return parent::delete(); + } +} \ No newline at end of file diff --git a/classes/FileLogger.php b/classes/FileLogger.php new file mode 100644 index 000000000..f599acf41 --- /dev/null +++ b/classes/FileLogger.php @@ -0,0 +1,70 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +class FileLoggerCore extends AbstractLogger +{ + protected $filename = ''; + + /** + * Write the message in the log file + * + * @param string message + * @param level + */ + protected function logMessage($message, $level) + { + $formatted_message = '*'.$this->level_value[$level].'* '."\t".date('Y/m/d - H:i:s').': '.$message."\r\n"; + return file_put_contents($this->getFilename(), $formatted_message, FILE_APPEND); + } + + /** + * Check if the specified filename is writable and set the filename + * + * @param string filename + */ + public function setFilename($filename) + { + if (is_writable(dirname($filename))) + $this->filename = $filename; + else + die('Directory '.dirname($filename).' is not writable'); + } + + /** + * Log the message + * + * @param string message + * @param level + */ + public function getFilename() + { + if (empty($this->filename)) + die('Filename is empty.'); + + return $this->filename; + } +} + diff --git a/classes/FrontController.php b/classes/FrontController.php new file mode 100755 index 000000000..68ab2fedf --- /dev/null +++ b/classes/FrontController.php @@ -0,0 +1,617 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7483 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class FrontControllerCore +{ + public $errors = array(); + protected static $smarty; + protected static $cookie; + protected static $link; + protected static $cart; + public $iso; + + public $orderBy; + public $orderWay; + public $p; + public $n; + + public $auth = false; + public $guestAllowed = false; + public $authRedirection = false; + public $ssl = false; + + protected $restrictedCountry = false; + protected $maintenance = false; + protected $id_current_shop; + protected $id_current_group_shop; + + public static $initialized = false; + + protected static $currentCustomerGroups; + + public function __construct() + { + global $useSSL; + + $useSSL = $this->ssl; + } + + public function run() + { + $this->init(); + $this->preProcess(); + $this->displayHeader(); + $this->process(); + $this->displayContent(); + $this->displayFooter(); + } + + public function init() + { + global $cookie, $smarty, $cart, $iso, $defaultCountry, $protocol_link, $protocol_content, $link, $css_files, $js_files; + + if (self::$initialized) + return; + self::$initialized = true; + + $this->id_current_shop = (int)Shop::getCurrentShop(); + $this->id_current_group_shop = (int)Shop::getCurrentGroupShop(); + + $css_files = array(); + $js_files = array(); + + if ($this->ssl AND (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) == 'off') AND Configuration::get('PS_SSL_ENABLED')) + { + header('HTTP/1.1 301 Moved Permanently'); + header('Location: '.Tools::getShopDomainSsl(true).$_SERVER['REQUEST_URI']); + exit(); + } + + ob_start(); + + /* Loading default country */ + $defaultCountry = new Country((int)Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT')); + + $cookie = new Cookie('ps'); + $link = new Link(); + + if ($this->auth AND !$cookie->isLogged($this->guestAllowed)) + Tools::redirect('index.php?controller=authentication'.($this->authRedirection ? '&back='.$this->authRedirection : '')); + + /* Theme is missing or maintenance */ + if (!is_dir(_PS_THEME_DIR_)) + die(Tools::displayError('Current theme unavailable. Please check your theme directory name and permissions.')); + elseif (basename($_SERVER['PHP_SELF']) != 'disabled.php' AND !(int)(Configuration::get('PS_SHOP_ENABLE'))) + $this->maintenance = true; + elseif (Configuration::get('PS_GEOLOCATION_ENABLED')) + $this->geolocationManagement(); + + // Switch language if needed and init cookie language + if ($iso = Tools::getValue('isolang') AND Validate::isLanguageIsoCode($iso) AND ($id_lang = (int)(Language::getIdByIso($iso)))) + $_GET['id_lang'] = $id_lang; + + Tools::switchLanguage(); + Tools::setCookieLanguage(); + + /* attribute id_lang is often needed, so we create a constant for performance reasons */ + if (!defined('_USER_ID_LANG_')) + define('_USER_ID_LANG_', (int)$cookie->id_lang); + + if (isset($_GET['logout']) OR ($cookie->logged AND Customer::isBanned((int)$cookie->id_customer))) + { + $cookie->logout(); + Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : NULL); + } + elseif (isset($_GET['mylogout'])) + { + $cookie->mylogout(); + Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : NULL); + } + + global $currency; + $currency = Tools::setCurrency(); + + $_MODULES = array(); + + /* Cart already exists */ + if ((int)$cookie->id_cart) + { + $cart = new Cart((int)$cookie->id_cart); + if ($cart->OrderExists()) + unset($cookie->id_cart, $cart, $cookie->checkedTOS); + /* Delete product of cart, if user can't make an order from his country */ + elseif (intval(Configuration::get('PS_GEOLOCATION_ENABLED')) AND + !in_array(strtoupper($cookie->iso_code_country), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))) AND + $cart->nbProducts() AND intval(Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR')) != -1 AND + !self::isInWhitelistForGeolocation()) + unset($cookie->id_cart, $cart); + elseif ($cookie->id_customer != $cart->id_customer OR $cookie->id_lang != $cart->id_lang OR $cookie->id_currency != $cart->id_currency) + { + if ($cookie->id_customer) + $cart->id_customer = (int)($cookie->id_customer); + $cart->id_lang = (int)($cookie->id_lang); + $cart->id_currency = (int)($cookie->id_currency); + $cart->update(); + } + /* Select an address if not set */ + if (isset($cart) && (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0 || + !isset($cart->id_address_invoice) || $cart->id_address_invoice == 0) && $cookie->id_customer) + { + $to_update = false; + if (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0) + { + $to_update = true; + $cart->id_address_delivery = (int)Address::getFirstCustomerAddressId($cart->id_customer); + } + if (!isset($cart->id_address_invoice) || $cart->id_address_invoice == 0) + { + $to_update = true; + $cart->id_address_invoice = (int)Address::getFirstCustomerAddressId($cart->id_customer); + } + if ($to_update) + $cart->update(); + } + } + + if (!isset($cart) OR !$cart->id) + { + $cart = new Cart(); + $cart->id_lang = (int)($cookie->id_lang); + $cart->id_currency = (int)($cookie->id_currency); + $cart->id_guest = (int)($cookie->id_guest); + $cart->id_group_shop = (int)$this->id_current_group_shop; + $cart->id_shop = (int)$this->id_current_shop; + if ($cookie->id_customer) + { + $cart->id_customer = (int)($cookie->id_customer); + $cart->id_address_delivery = (int)(Address::getFirstCustomerAddressId($cart->id_customer)); + $cart->id_address_invoice = $cart->id_address_delivery; + } + else + { + $cart->id_address_delivery = 0; + $cart->id_address_invoice = 0; + } + } + if (!$cart->nbProducts()) + $cart->id_carrier = NULL; + + $locale = strtolower(Configuration::get('PS_LOCALE_LANGUAGE')).'_'.strtoupper(Configuration::get('PS_LOCALE_COUNTRY').'.UTF-8'); + setlocale(LC_COLLATE, $locale); + setlocale(LC_CTYPE, $locale); + setlocale(LC_TIME, $locale); + setlocale(LC_NUMERIC, 'en_US.UTF-8'); + + if (Validate::isLoadedObject($currency)) + $smarty->ps_currency = $currency; + if (Validate::isLoadedObject($ps_language = new Language((int)$cookie->id_lang))) + $smarty->ps_language = $ps_language; + + /* get page name to display it in body id */ + $pathinfo = pathinfo(__FILE__); + $page_name = Dispatcher::$controller; + $page_name = (preg_match('/^[0-9]/', $page_name)) ? 'page_'.$page_name : $page_name; + $smarty->assign(Tools::getMetaTags($cookie->id_lang, $page_name)); + $smarty->assign('request_uri', Tools::safeOutput(urldecode($_SERVER['REQUEST_URI']))); + + /* Breadcrumb */ + $navigationPipe = (Configuration::get('PS_NAVIGATION_PIPE') ? Configuration::get('PS_NAVIGATION_PIPE') : '>'); + $smarty->assign('navigationPipe', $navigationPipe); + + $protocol_link = (Configuration::get('PS_SSL_ENABLED') OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://'; + $protocol_content = ((isset($useSSL) AND $useSSL AND Configuration::get('PS_SSL_ENABLED')) OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://'; + if (!defined('_PS_BASE_URL_')) + define('_PS_BASE_URL_', Tools::getShopDomain(true)); + if (!defined('_PS_BASE_URL_SSL_')) + define('_PS_BASE_URL_SSL_', Tools::getShopDomainSsl(true)); + + $link->preloadPageLinks(); + $this->canonicalRedirection(); + + Product::initPricesComputation(); + + $display_tax_label = $defaultCountry->display_tax_label; + if ($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) + { + $infos = Address::getCountryAndState((int)($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + $country = new Country((int)$infos['id_country']); + if (Validate::isLoadedObject($country)) + $display_tax_label = $country->display_tax_label; + } + $smarty->assign(array( + 'link' => $link, + 'cart' => $cart, + 'currency' => $currency, + 'cookie' => $cookie, + 'page_name' => $page_name, + 'base_dir' => _PS_BASE_URL_.__PS_BASE_URI__, + 'base_dir_ssl' => $protocol_link.Tools::getShopDomainSsl().__PS_BASE_URI__, + 'content_dir' => $protocol_content.Tools::getShopDomain().__PS_BASE_URI__, + 'tpl_dir' => _PS_THEME_DIR_, + 'modules_dir' => _MODULE_DIR_, + 'mail_dir' => _MAIL_DIR_, + 'lang_iso' => $ps_language->iso_code, + 'come_from' => Tools::getHttpHost(true, true).Tools::htmlentitiesUTF8(str_replace('\'', '', urldecode($_SERVER['REQUEST_URI']))), + 'cart_qties' => (int)$cart->nbProducts(), + 'currencies' => Currency::getCurrencies(), + 'languages' => Language::getLanguages(), + 'priceDisplay' => Product::getTaxCalculationMethod(), + 'add_prod_display' => (int)Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + 'shop_name' => Configuration::get('PS_SHOP_NAME'), + 'roundMode' => (int)Configuration::get('PS_PRICE_ROUND_MODE'), + 'use_taxes' => (int)Configuration::get('PS_TAX'), + 'display_tax_label' => (bool)$display_tax_label, + 'vat_management' => (int)Configuration::get('VATNUMBER_MANAGEMENT'), + 'opc' => (bool)Configuration::get('PS_ORDER_PROCESS_TYPE'), + 'PS_CATALOG_MODE' => (bool)Configuration::get('PS_CATALOG_MODE'), + 'id_current_shop' => (int)$this->id_current_shop, + 'id_current_group_shop' => (int)$this->id_current_group_shop + )); + + // Deprecated + $smarty->assign(array( + 'id_currency_cookie' => (int)$currency->id, + 'logged' => $cookie->isLogged(), + 'customerName' => ($cookie->logged ? $cookie->customer_firstname.' '.$cookie->customer_lastname : false) + )); + + // TODO for better performances (cache usage), remove these assign and use a smarty function to get the right media server in relation to the full ressource name + $assignArray = array( + 'img_ps_dir' => _PS_IMG_, + 'img_cat_dir' => _THEME_CAT_DIR_, + 'img_lang_dir' => _THEME_LANG_DIR_, + 'img_prod_dir' => _THEME_PROD_DIR_, + 'img_manu_dir' => _THEME_MANU_DIR_, + 'img_sup_dir' => _THEME_SUP_DIR_, + 'img_ship_dir' => _THEME_SHIP_DIR_, + 'img_store_dir' => _THEME_STORE_DIR_, + 'img_col_dir' => _THEME_COL_DIR_, + 'img_dir' => _THEME_IMG_DIR_, + 'css_dir' => _THEME_CSS_DIR_, + 'js_dir' => _THEME_JS_DIR_, + 'pic_dir' => _THEME_PROD_PIC_DIR_ + ); + + foreach ($assignArray as $assignKey => $assignValue) + if (substr($assignValue, 0, 1) == '/' OR $protocol_content == 'https://') + $smarty->assign($assignKey, $protocol_content.Tools::getMediaServer($assignValue).$assignValue); + else + $smarty->assign($assignKey, $assignValue); + + // setting properties from global var + self::$cookie = $cookie; + self::$cart = $cart; + self::$smarty = $smarty; + self::$link = $link; + + if ($this->maintenance) + $this->displayMaintenancePage(); + if ($this->restrictedCountry) + $this->displayRestrictedCountryPage(); + + //live edit + if (Tools::isSubmit('live_edit') AND $ad = Tools::getValue('ad') AND (Tools::getValue('liveToken') == sha1(Tools::getValue('ad')._COOKIE_KEY_))) + if (!is_dir(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.$ad)) + die(Tools::displayError()); + + + $this->iso = $iso; + $this->setMedia(); + } + + /* Display a maintenance page if shop is closed */ + protected function displayMaintenancePage() + { + if (!in_array(Tools::getRemoteAddr(), explode(',', Configuration::get('PS_MAINTENANCE_IP')))) + { + header('HTTP/1.1 503 temporarily overloaded'); + self::$smarty->display(_PS_THEME_DIR_.'maintenance.tpl'); + exit; + } + } + + /* Display a specific page if the user country is not allowed */ + protected function displayRestrictedCountryPage() + { + global $smarty; + + header('HTTP/1.1 503 temporarily overloaded'); + $smarty->display(_PS_THEME_DIR_.'restricted-country.tpl'); + exit; + } + + protected function canonicalRedirection() + { + global $link, $cookie; + + // Automatically redirect to the canonical URL if needed + if (isset($this->php_self) AND !empty($this->php_self)) + { + // $_SERVER['HTTP_HOST'] must be replaced by the real canonical domain + $canonicalURL = $link->getPageLink($this->php_self, $this->ssl, $cookie->id_lang); + if (!preg_match('/^'.Tools::pRegexp($canonicalURL, '/').'([&?].*)?$/i', (($this->ssl AND Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) + { + header('HTTP/1.0 301 Moved'); + $params = ''; + $excludedKey = array('isolang', 'id_lang'); + foreach ($_GET as $key => $value) + if (!in_array($key, $excludedKey)) + $params .= ($params == '' ? '?' : '&').$key.'='.$value; + if (defined('_PS_MODE_DEV_') AND _PS_MODE_DEV_ AND $_SERVER['REQUEST_URI'] != __PS_BASE_URI__) + die('[Debug] This page has moved
Please use the following URL instead: '.$canonicalURL.$params.''); + Tools::redirectLink($canonicalURL.$params); + } + } + } + + protected function geolocationManagement() + { + global $cookie, $smarty; + + if (!in_array($_SERVER['SERVER_NAME'], array('localhost', '127.0.0.1'))) + { + /* Check if Maxmind Database exists */ + if (file_exists(_PS_GEOIP_DIR_.'GeoLiteCity.dat')) + { + if (!isset($cookie->iso_code_country) OR (isset($cookie->iso_code_country) AND !in_array(strtoupper($cookie->iso_code_country), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))))) + { + include_once(_PS_GEOIP_DIR_.'geoipcity.inc'); + include_once(_PS_GEOIP_DIR_.'geoipregionvars.php'); + + $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD); + $record = geoip_record_by_addr($gi, Tools::getRemoteAddr()); + + if (is_object($record) AND !in_array(strtoupper($record->country_code), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))) AND !self::isInWhitelistForGeolocation()) + { + if (Configuration::get('PS_GEOLOCATION_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_) + $this->restrictedCountry = true; + elseif (Configuration::get('PS_GEOLOCATION_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_) + $smarty->assign(array( + 'restricted_country_mode' => true, + 'geolocation_country' => $record->country_name + )); + } + elseif (is_object($record)) + { + $cookie->iso_code_country = strtoupper($record->country_code); + $hasBeenSet = true; + } + } + + if (isset($cookie->iso_code_country) AND (int)($id_country = Country::getByIso(strtoupper($cookie->iso_code_country)))) + { + /* Update defaultCountry */ + $defaultCountry = new Country($id_country); + if (isset($hasBeenSet) AND $hasBeenSet) + $cookie->id_currency = (int)(Currency::getCurrencyInstance($defaultCountry->id_currency ? (int)$defaultCountry->id_currency : Configuration::get('PS_CURRENCY_DEFAULT'))->id); + } + elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_) + $this->restrictedCountry = true; + elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_) + $smarty->assign(array( + 'restricted_country_mode' => true, + 'geolocation_country' => 'Undefined' + )); + } + /* If not exists we disabled the geolocation feature */ + else + Configuration::updateValue('PS_GEOLOCATION_ENABLED', 0); + } + } + + public function preProcess() + { + } + + public function setMedia() + { + global $cookie; + + Tools::addCSS(_THEME_CSS_DIR_.'global.css', 'all'); + Tools::addJS(array(_PS_JS_DIR_.'jquery/jquery-1.4.4.min.js', _PS_JS_DIR_.'jquery/jquery.easing.1.3.js', _PS_JS_DIR_.'tools.js')); + if (Tools::isSubmit('live_edit') AND $ad = Tools::getValue('ad') AND (Tools::getValue('liveToken') == sha1(Tools::getValue('ad')._COOKIE_KEY_))) + { + Tools::addJS(array( + _PS_JS_DIR_.'jquery/jquery-ui-1.8.10.custom.min.js', + _PS_JS_DIR_.'jquery/jquery.fancybox-1.3.4.js', + _PS_JS_DIR_.'hookLiveEdit.js') + ); + Tools::addCSS(_PS_CSS_DIR_.'jquery.fancybox-1.3.4.css'); + } + } + + public function process() + { + } + + public function displayContent() + { + Tools::safePostVars(); + self::$smarty->assign('errors', $this->errors); + } + + public function displayHeader() + { + global $css_files, $js_files; + + if (!self::$initialized) + $this->init(); + + // P3P Policies (http://www.w3.org/TR/2002/REC-P3P-20020416/#compact_policies) + header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"'); + + /* Hooks are volontary out the initialize array (need those variables already assigned) */ + self::$smarty->assign(array( + 'time' => time(), + 'img_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'), + 'static_token' => Tools::getToken(false), + 'token' => Tools::getToken(), + 'logo_image_width' => Configuration::get('SHOP_LOGO_WIDTH'), + 'logo_image_height' => Configuration::get('SHOP_LOGO_HEIGHT'), + 'priceDisplayPrecision' => _PS_PRICE_DISPLAY_PRECISION_, + 'content_only' => (int)Tools::getValue('content_only') + )); + self::$smarty->assign(array( + 'HOOK_HEADER' => Module::hookExec('header'), + 'HOOK_TOP' => Module::hookExec('top'), + 'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn') + )); + + if ((Configuration::get('PS_CSS_THEME_CACHE') OR Configuration::get('PS_JS_THEME_CACHE')) AND is_writable(_PS_THEME_DIR_.'cache')) + { + // CSS compressor management + if (Configuration::get('PS_CSS_THEME_CACHE')) + Tools::cccCss(); + + //JS compressor management + if (Configuration::get('PS_JS_THEME_CACHE')) + Tools::cccJs(); + } + + self::$smarty->assign('css_files', $css_files); + self::$smarty->assign('js_files', array_unique($js_files)); + self::$smarty->display(_PS_THEME_DIR_.'header.tpl'); + } + + public function displayFooter() + { + global $cookie; + if (!self::$initialized) + $this->init(); + + self::$smarty->assign(array( + 'HOOK_RIGHT_COLUMN' => Module::hookExec('rightColumn', array('cart' => self::$cart)), + 'HOOK_FOOTER' => Module::hookExec('footer'), + 'content_only' => (int)(Tools::getValue('content_only')))); + self::$smarty->display(_PS_THEME_DIR_.'footer.tpl'); + //live edit + if (Tools::isSubmit('live_edit') AND $ad = Tools::getValue('ad') AND (Tools::getValue('liveToken') == sha1(Tools::getValue('ad')._COOKIE_KEY_))) + { + self::$smarty->assign(array('ad' => $ad, 'live_edit' => true)); + self::$smarty->display(_PS_ALL_THEMES_DIR_.'live_edit.tpl'); + } + else + Tools::displayError(); + } + + public function productSort() + { + if (!self::$initialized) + $this->init(); + + // $this->orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby')); + // $this->orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway')); + // 'orderbydefault' => Tools::getProductsOrder('by'), + // 'orderwayposition' => Tools::getProductsOrder('way'), // Deprecated: orderwayposition + // 'orderwaydefault' => Tools::getProductsOrder('way'), + + $stock_management = (int)(Configuration::get('PS_STOCK_MANAGEMENT')) ? true : false; // no display quantity order if stock management disabled + $orderByValues = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position', 5 => 'manufacturer_name', 6 => 'quantity'); + $orderWayValues = array(0 => 'asc', 1 => 'desc'); + $this->orderBy = Tools::strtolower(Tools::getValue('orderby', $orderByValues[(int)(Configuration::get('PS_PRODUCTS_ORDER_BY'))])); + $this->orderWay = Tools::strtolower(Tools::getValue('orderway', $orderWayValues[(int)(Configuration::get('PS_PRODUCTS_ORDER_WAY'))])); + if (!in_array($this->orderBy, $orderByValues)) + $this->orderBy = $orderByValues[0]; + if (!in_array($this->orderWay, $orderWayValues)) + $this->orderWay = $orderWayValues[0]; + + self::$smarty->assign(array( + 'orderby' => $this->orderBy, + 'orderway' => $this->orderWay, + 'orderbydefault' => $orderByValues[(int)(Configuration::get('PS_PRODUCTS_ORDER_BY'))], + 'orderwayposition' => $orderWayValues[(int)(Configuration::get('PS_PRODUCTS_ORDER_WAY'))], // Deprecated: orderwayposition + 'orderwaydefault' => $orderWayValues[(int)(Configuration::get('PS_PRODUCTS_ORDER_WAY'))], + 'stock_management' => (int)($stock_management))); + } + + public function pagination($nbProducts = 10) + { + if (!self::$initialized) + $this->init(); + + $nArray = (int)(Configuration::get('PS_PRODUCTS_PER_PAGE')) != 10 ? array((int)(Configuration::get('PS_PRODUCTS_PER_PAGE')), 10, 20, 50) : array(10, 20, 50); + asort($nArray); + $this->n = abs((int)(Tools::getValue('n', ((isset(self::$cookie->nb_item_per_page) AND self::$cookie->nb_item_per_page >= 10) ? self::$cookie->nb_item_per_page : (int)(Configuration::get('PS_PRODUCTS_PER_PAGE')))))); + $this->p = abs((int)(Tools::getValue('p', 1))); + $range = 2; /* how many pages around page selected */ + + if ($this->p < 0) + $this->p = 0; + + if (isset(self::$cookie->nb_item_per_page) AND $this->n != self::$cookie->nb_item_per_page AND in_array($this->n, $nArray)) + self::$cookie->nb_item_per_page = $this->n; + + if ($this->p > ($nbProducts / $this->n)) + $this->p = ceil($nbProducts / $this->n); + $pages_nb = ceil($nbProducts / (int)($this->n)); + + $start = (int)($this->p - $range); + if ($start < 1) + $start = 1; + $stop = (int)($this->p + $range); + if ($stop > $pages_nb) + $stop = (int)($pages_nb); + self::$smarty->assign('nb_products', $nbProducts); + $pagination_infos = array( + 'pages_nb' => (int)($pages_nb), + 'p' => (int)($this->p), + 'n' => (int)($this->n), + 'nArray' => $nArray, + 'range' => (int)($range), + 'start' => (int)($start), + 'stop' => (int)($stop) + ); + self::$smarty->assign($pagination_infos); + } + + public static function getCurrentCustomerGroups() + { + if (!isset(self::$cookie) || !self::$cookie->id_customer) + return array(); + if (!is_array(self::$currentCustomerGroups)) + { + self::$currentCustomerGroups = array(); + $result = Db::getInstance()->ExecuteS('SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.(int)self::$cookie->id_customer); + foreach ($result as $row) + self::$currentCustomerGroups[] = $row['id_group']; + } + return self::$currentCustomerGroups; + } + + protected static function isInWhitelistForGeolocation() + { + $allowed = false; + $userIp = Tools::getRemoteAddr(); + $ips = explode(';', Configuration::get('PS_GEOLOCATION_WHITELIST')); + if (is_array($ips) AND sizeof($ips)) + foreach ($ips AS $ip) + if (!empty($ip) AND strpos($userIp, $ip) === 0) + $allowed = true; + return $allowed; + } +} + diff --git a/classes/Group.php b/classes/Group.php new file mode 100644 index 000000000..c03a517b1 --- /dev/null +++ b/classes/Group.php @@ -0,0 +1,176 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class GroupCore extends ObjectModel +{ + public $id; + + /** @var string Lastname */ + public $name; + + /** @var string Reduction */ + public $reduction; + + /** @var int Price display method (tax inc/tax exc) */ + public $price_display_method; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $tables = array ('group'); + + protected $fieldsRequired = array('price_display_method'); + protected $fieldsSize = array(); + protected $fieldsValidate = array('reduction' => 'isFloat', 'price_display_method' => 'isPriceDisplayMethod'); + + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'group'; + protected $identifier = 'id_group'; + + protected static $_cacheReduction = array(); + protected static $_groupPriceDisplayMethod = array(); + + protected $webserviceParameters = array(); + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_group'] = (int)($this->id); + $fields['reduction'] = (float)($this->reduction); + $fields['price_display_method'] = (int)($this->price_display_method); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + + return $fields; + } + + public function getTranslationsFieldsChild() + { + if (!parent::validateFieldsLang()) + return false; + return parent::getTranslationsFields(array('name')); + } + + static public function getGroups($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT g.`id_group`, g.`reduction`, g.`price_display_method`, gl.`name` + FROM `'._DB_PREFIX_.'group` g + LEFT JOIN `'._DB_PREFIX_.'group_lang` AS gl ON (g.`id_group` = gl.`id_group` AND gl.`id_lang` = '.(int)($id_lang).') + ORDER BY g.`id_group` ASC'); + } + + public function getCustomers($count = false, $start = 0, $limit = 0) + { + if ($count) + return Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'customer_group` cg + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (cg.`id_customer` = c.`id_customer`) + WHERE cg.`id_group` = '.(int)$this->id.' + AND c.`deleted` != 1'); + return Db::getInstance()->ExecuteS(' + SELECT cg.`id_customer`, c.* + FROM `'._DB_PREFIX_.'customer_group` cg + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (cg.`id_customer` = c.`id_customer`) + WHERE cg.`id_group` = '.(int)$this->id.' + AND c.`deleted` != 1 + ORDER BY cg.`id_customer` ASC + '.($limit > 0 ? 'LIMIT '.(int)$start.', '.(int)$limit : '')); + } + + static public function getReduction($id_customer = NULL) + { + if ($id_customer === NULL) + $id_customer = 0; + if (!isset(self::$_cacheReduction['customer'][$id_customer])) + { + if ($id_customer) + $customer = new Customer((int)($id_customer)); + self::$_cacheReduction['customer'][$id_customer] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `reduction` + FROM `'._DB_PREFIX_.'group` + WHERE `id_group` = '.((isset($customer) AND Validate::isLoadedObject($customer)) ? (int)($customer->id_default_group) : 1)); + } + return self::$_cacheReduction['customer'][$id_customer]; + } + + public static function getReductionByIdGroup($id_group) + { + if (!isset(self::$_cacheReduction['group'][$id_group])) + { + self::$_cacheReduction['group'][$id_group] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `reduction` + FROM `'._DB_PREFIX_.'group` + WHERE `id_group` = '.$id_group); + } + return self::$_cacheReduction['group'][$id_group]; + } + + static public function getPriceDisplayMethod($id_group) + { + if (!isset(self::$_groupPriceDisplayMethod[$id_group])) + self::$_groupPriceDisplayMethod[$id_group] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `price_display_method` + FROM `'._DB_PREFIX_.'group` + WHERE `id_group` = '.(int)($id_group)); + return self::$_groupPriceDisplayMethod[$id_group]; + } + + static public function getDefaultPriceDisplayMethod() + { + return self::getPriceDisplayMethod(1); + } + + public function add($autodate = true, $nullValues = false) + { + return parent::add() && Category::setNewGroupForHome((int)($this->id)); + } + + public function delete() + { + if ($this->id == _PS_DEFAULT_CUSTOMER_GROUP_) + return false; + if (parent::delete()) + { + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customer_group` WHERE `id_group` = '.(int)($this->id)); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_group` WHERE `id_group` = '.(int)($this->id)); + Discount::deleteByIdGroup((int)($this->id)); + return true; + } + return false; + } +} + + diff --git a/classes/GroupReduction.php b/classes/GroupReduction.php new file mode 100644 index 000000000..f6629384e --- /dev/null +++ b/classes/GroupReduction.php @@ -0,0 +1,108 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class GroupReductionCore extends ObjectModel +{ + public $id_group; + public $id_category; + public $reduction; + + protected $fieldsRequired = array('id_group', 'id_category', 'reduction'); + protected $fieldsValidate = array('id_group' => 'isUnsignedId', 'id_category' => 'isUnsignedId', 'reduction' => 'isPrice'); + + protected $table = 'group_reduction'; + protected $identifier = 'id_group_reduction'; + + protected static $reductionCache = array(); + + public function getFields() + { + parent::validateFields(); + $fields['id_group'] = (int)($this->id_group); + $fields['id_category'] = (int)($this->id_category); + $fields['reduction'] = (float)($this->reduction); + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + return (parent::add($autodate, $nullValues) AND $this->_setCache()); + } + + public function update($nullValues = false) + { + return (parent::update($nullValues) AND $this->_clearCache() AND $this->_setCache()); + } + + public function delete() + { + return $this->_clearCache() AND parent::delete(); + } + + protected function _clearCache() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_group_reduction_cache` WHERE `id_group` = '.(int)($this->id_group)); + } + + protected function _setCache() + { + $resource = Db::getInstance()->ExecuteS(' + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_product` cp + INNER JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = cp.`id_product`) + WHERE cp.`id_category` = '.(int)($this->id_category) + , false); + $query = 'INSERT INTO `'._DB_PREFIX_.'product_group_reduction_cache` (`id_product`, `id_group`, `reduction`) VALUES '; + while ($row = Db::getInstance()->nextRow($resource)) + $query .= '('.(int)($row['id_product']).', '.(int)($this->id_group).', '.(float)($this->reduction).'), '; + return Db::getInstance()->Execute(rtrim($query, ', ')); + } + + static public function getGroupReductions($id_group, $id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT gr.`id_group_reduction`, gr.`id_group`, gr.`id_category`, gr.`reduction`, cl.`name` AS category_name + FROM `'._DB_PREFIX_.'group_reduction` gr + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = gr.`id_category` AND cl.`id_lang` = '.(int)($id_lang).') + WHERE `id_group` = '.(int)($id_group) + ); + } + + static public function getValueForProduct($id_product, $id_group) + { + if (!isset(self::$reductionCache[$id_product.'-'.$id_group])) + self::$reductionCache[$id_product.'-'.$id_group] = Db::getInstance()->getValue('SELECT `reduction` FROM `'._DB_PREFIX_.'product_group_reduction_cache` WHERE `id_product` = '.(int)($id_product).' AND `id_group` = '.(int)($id_group)); + return self::$reductionCache[$id_product.'-'.$id_group]; + } + + static public function doesExist($id_group, $id_category) + { + return (bool)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT `id_group` FROM `'._DB_PREFIX_.'group_reduction` WHERE `id_group` = '.(int)($id_group).' AND `id_category` = '.(int)($id_category)); + } +} + + diff --git a/classes/GroupShop.php b/classes/GroupShop.php new file mode 100755 index 000000000..46915c58d --- /dev/null +++ b/classes/GroupShop.php @@ -0,0 +1,128 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * @since 1.5.0 + */ +class GroupShopCore extends ObjectModel +{ + public $name; + public $active; + public $share_datas; + public $share_stock; + public $deleted; + + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array( + 'active' => 'isBool', + 'share_datas' => 'isBool', + 'share_stock' => 'isBool', + 'name' => 'isGenericName', + ); + protected $table = 'group_shop'; + protected $identifier = 'id_group_shop'; + + private static $assoTables = array( + 'attribute_group' => array('type' => 'group_shop'), + 'attribute' => array('type' => 'group_shop'), + 'customer_group' => array('type' => 'group_shop'), + 'feature' => array('type' => 'group_shop'), + 'group' => array('type' => 'group_shop'), + 'manufacturer' => array('type' => 'group_shop'), + 'supplier' => array('type' => 'group_shop'), + 'zone' => array('type' => 'group_shop'), + 'tax_rules_group' => array('type' => 'group_shop'), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['name'] = pSQL($this->name); + $fields['share_datas'] = (int)$this->share_datas; + $fields['share_stock'] = (int)$this->share_stock; + $fields['active'] = (int)$this->active; + $fields['deleted'] = (int)$this->deleted; + return $fields; + } + + public static function getGroupShops($active = true) + { + return Db::getInstance()->ExecuteS('SELECT * + FROM '._DB_PREFIX_.'group_shop + WHERE `deleted`= 0 AND `active`='.(int)$active); + } + + public function delete() + { + if (!$res = parent::delete()) + return false; + + foreach (Shop::getAssoTables() AS $table_name => $row) + { + + $id = 'id_'.$row['type']; + if ($row['type'] == 'fk_shop') + $id = 'id_shop'; + else + $table_name .= '_'.$row['type']; + $res &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.$table_name.'` WHERE `'.$id.'`='.(int)$this->id); + } + + return $res; + } + + public static function getAssoTables() + { + return self::$assoTables; + } + + /** + * @return int Total of groupshops + */ + public static function getTotalGroupShops($active = true) + { + return sizeof(GroupShop::getGroupShops($active)); + } + + public function copyGroupShopData($old_id) + { + //TODO + } + + public function haveShops() + { + return (bool)$this->getNbShops(); + } + + public function getNbShops() + { + return (int)Db::getInstance()->getValue('SELECT COUNT(*) + FROM '._DB_PREFIX_.'shop s + WHERE id_group_shop='.(int)$this->id); + } +} diff --git a/classes/Guest.php b/classes/Guest.php new file mode 100644 index 000000000..de4020e84 --- /dev/null +++ b/classes/Guest.php @@ -0,0 +1,210 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class GuestCore extends ObjectModel +{ + public $id_operating_system; + public $id_web_browser; + public $id_customer; + public $javascript; + public $screen_resolution_x; + public $screen_resolution_y; + public $screen_color; + public $sun_java; + public $adobe_flash; + public $adobe_director; + public $apple_quicktime; + public $real_player; + public $windows_media; + public $accept_language; + + protected $fieldsSize = array('accept_language' => 8); + protected $fieldsValidate = array( + 'id_operating_system' => 'isUnsignedId', + 'id_web_browser' => 'isUnsignedId', + 'id_customer' => 'isUnsignedId', + 'javascript' => 'isBool', + 'screen_resolution_x' => 'isInt', + 'screen_resolution_y' => 'isInt', + 'screen_color' => 'isInt', + 'sun_java' => 'isBool', + 'adobe_flash' => 'isBool', + 'adobe_director' => 'isBool', + 'apple_quicktime' => 'isBool', + 'real_player' => 'isBool', + 'windows_media' => 'isBool', + 'accept_language' => 'isGenericName' + ); + + protected $table = 'guest'; + protected $identifier = 'id_guest'; + + + protected $webserviceParameters = array( + 'fields' => array( + 'id_customer' => array('xlink_resource' => 'customers'), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_operating_system'] = (int)($this->id_operating_system); + $fields['id_web_browser'] = (int)($this->id_web_browser); + $fields['id_customer'] = (int)($this->id_customer); + $fields['javascript'] = (int)($this->javascript); + $fields['screen_resolution_x'] = (int)($this->screen_resolution_x); + $fields['screen_resolution_y'] = (int)($this->screen_resolution_y); + $fields['screen_color'] = (int)($this->screen_color); + $fields['sun_java'] = (int)($this->sun_java); + $fields['adobe_flash'] = (int)($this->adobe_flash); + $fields['adobe_director'] = (int)($this->adobe_director); + $fields['apple_quicktime'] = (int)($this->apple_quicktime); + $fields['real_player'] = (int)($this->real_player); + $fields['windows_media'] = (int)($this->windows_media); + $fields['accept_language'] = pSQL($this->accept_language); + + return $fields; + } + + function userAgent() + { + $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; + $acceptLanguage = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : ''; + $this->id_operating_system = $this->getOs($userAgent); + $this->id_web_browser = $this->getBrowser($userAgent); + $this->accept_language = $this->getLanguage($acceptLanguage); + } + + protected function getLanguage($acceptLanguage) + { + // $langsArray is filled with all the languages accepted, ordered by priority + $langsArray = array(); + preg_match_all('/([a-z]{2}(-[a-z]{2})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/', $acceptLanguage, $array); + if (count($array[1])) + { + $langsArray = array_combine($array[1], $array[4]); + foreach ($langsArray as $lang => $val) + if ($val === '') + $langsArray[$lang] = 1; + arsort($langsArray, SORT_NUMERIC); + } + + // Only the first language is returned + return (sizeof($langsArray) ? key($langsArray) : ''); + } + + protected function getBrowser($userAgent) + { + $browserArray = array( + 'Google Chrome' => 'Chrome/', + 'Safari' => 'Safari', + 'Firefox 3.x' => 'Firefox/3', + 'Firefox 2.x' => 'Firefox/2', + 'Opera' => 'Opera', + 'IE 8.x' => 'MSIE 8', + 'IE 7.x' => 'MSIE 7', + 'IE 6.x' => 'MSIE 6' + ); + foreach ($browserArray as $k => $value) + if (strstr($userAgent, $value)) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_web_browser` + FROM `'._DB_PREFIX_.'web_browser` wb + WHERE wb.`name` = \''.pSQL($k).'\''); + + return $result['id_web_browser']; + } + return NULL; + } + + protected function getOs($userAgent) + { + $osArray = array( + 'Windows Vista' => 'Windows NT 6', + 'Windows XP' => 'Windows NT 5', + 'MacOsX' => 'Mac OS X', + 'Linux' => 'X11' + ); + foreach ($osArray as $k => $value) + if (strstr($userAgent, $value)) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_operating_system` + FROM `'._DB_PREFIX_.'operating_system` os + WHERE os.`name` = \''.pSQL($k).'\''); + + return $result['id_operating_system']; + } + return NULL; + } + + public static function getFromCustomer($id_customer) + { + if (!Validate::isUnsignedId($id_customer)) + return false; + $result = Db::getInstance()->getRow(' + SELECT `id_guest` + FROM `'._DB_PREFIX_.'guest` + WHERE `id_customer` = '.(int)($id_customer)); + return $result['id_guest']; + } + + public function mergeWithCustomer($id_guest, $id_customer) + { + // Since the guests are merged, the guest id in the connections table must be changed too + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'connections` c + SET c.`id_guest` = '.(int)($id_guest).' + WHERE c.`id_guest` = '.(int)($this->id)); + + // The current guest is removed from the database + $this->delete(); + + // $this is still filled with values, so it's id is changed for the old guest + $this->id = (int)($id_guest); + $this->id_customer = (int)($id_customer); + + // $this is now the old guest but filled with the most up to date values + $this->update(); + } + + public static function setNewGuest($cookie) + { + $guest = new Guest(isset($cookie->id_customer) ? Guest::getFromCustomer((int)($cookie->id_customer)) : NULL); + $guest->userAgent(); + if ($guest->id_operating_system OR $guest->id_web_browser) + { + $guest->save(); + $cookie->id_guest = (int)($guest->id); + } + } +} + + diff --git a/classes/HelpAccess.php b/classes/HelpAccess.php new file mode 100644 index 000000000..808659fea --- /dev/null +++ b/classes/HelpAccess.php @@ -0,0 +1,117 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +class HelpAccessCore +{ + const URL = 'http://help.prestashop.com'; + + protected static $_images = array(0 => 'none', + 1 => 'help2.png', + 2 => 'help-new.png'); + + public static function trackClick($label, $version) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'help_access` (`label`, `version`) VALUES (\''.pSQL($label).'\',\''.pSQL($version).'\') + ON DUPLICATE KEY UPDATE `version` = \''.pSQL($version).'\' + '); + } + + public static function getVersion($label) + { + return Db::getInstance()->getValue(' + SELECT `version` FROM `'._DB_PREFIX_.'help_access` + WHERE `label` = \''.pSQL($label).'\' + '); + } + + public static function retrieveInfos($label, $iso_lang, $country, $version) + { + $image = self::$_images[0]; + $tooltip = ''; + $url = HelpAccess::URL.'/documentation/renderIcon?label='.$label.'&iso_lang='.$iso_lang.'&country='.$country.'&version='.$version; + + $ctx = stream_context_create(array( + 'http' => array( + 'timeout' => 10 + ) + )); + + $res = @file_get_contents($url, 0, $ctx); + + $infos = preg_split('/\|/', $res); + if (sizeof($infos) > 0) + { + $version = trim($infos[0]); + if (!empty($version)) + { + $image = self::$_images[1]; + + if (sizeof($infos) > 1) + $tooltip = trim('|'.$infos[1]); + } + } + + $last_version = HelpAccess::getVersion($label); + + if (!empty($version) && $version != $last_version) + $image = self::$_images[2]; + + return array('version' => $version, 'image' => $image, 'tooltip' => $tooltip); + } + + public static function displayHelp($label, $iso_lang, $country, $ps_version) + { + $infos = HelpAccess::retrieveInfos($label, $iso_lang, $country, $ps_version); + if (array_key_exists('image', $infos) && $infos['image'] != 'none') + { + echo ' + + '.Tools::displayError('HELP').' + + + '; + + + if (!empty($infos['tooltip'])) + echo ' '; + } + } +} + diff --git a/classes/Hook.php b/classes/Hook.php new file mode 100644 index 000000000..629695036 --- /dev/null +++ b/classes/Hook.php @@ -0,0 +1,253 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7025 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class HookCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 32); + protected $fieldsValidate = array('name' => 'isHookName'); + + protected $table = 'hook'; + protected $identifier = 'id_hook'; + + static $preloadModulesFromHooks = null; + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + return $fields; + } + + /** + * Return hook ID from name + * + * @param string $hookName Hook name + * @return integer Hook ID + */ + static public function get($hookName) + { + if (!Validate::isHookName($hookName)) + die(Tools::displayError()); + + $result = Db::getInstance()->getRow(' + SELECT `id_hook`, `name` + FROM `'._DB_PREFIX_.'hook` + WHERE `name` = \''.pSQL($hookName).'\''); + + return ($result ? $result['id_hook'] : false); + } + + static public function getHooks($position = false) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'hook` h + '.($position ? 'WHERE h.`position` = 1' : '')); + } + + static public function preloadModulesFromHooks() + { + if (!is_null(self::$preloadModulesFromHooks)) + return ; + + self::$preloadModulesFromHooks = array(); + $sql = 'SELECT h.id_hook, h.name as h_name, title, description, h.position, live_edit, hm.position as hm_position, m.id_module, m.name, active + FROM `'._DB_PREFIX_.'hook` h + INNER JOIN `'._DB_PREFIX_.'hook_module` hm ON (h.id_hook = hm.id_hook) + INNER JOIN `'._DB_PREFIX_.'module` as m ON (m.id_module = hm.id_module) + WHERE hm.id_shop IN('.implode(', ', Shop::getListFromContext()).') + GROUP BY hm.id_hook, hm.id_module + ORDER BY hm.position'; + $results = Db::getInstance()->executeS($sql); + foreach ($results as $result) + { + if (!isset(self::$preloadModulesFromHooks[$result['id_hook']])) + self::$preloadModulesFromHooks[$result['id_hook']] = array(); + + self::$preloadModulesFromHooks[$result['id_hook']][$result['id_module']] = array( + 'id_hook' => $result['id_hook'], + 'title' => $result['title'], + 'description' => $result['description'], + 'hm.position' => $result['position'], + 'live_edit' => $result['live_edit'], + 'm.position' => $result['hm_position'], + 'id_module' => $result['id_module'], + 'name' => $result['name'], + 'active' => $result['active'], + ); + } + } + + static public function getModulesFromHook($hookID, $moduleID = null) + { + Hook::preloadModulesFromHooks(); + + $list = (isset(self::$preloadModulesFromHooks[$hookID])) ? self::$preloadModulesFromHooks[$hookID] : array(); + if ($moduleID) + return (isset($list[$moduleID])) ? array($list[$moduleID]) : array(); + return $list; + } + + static public function newOrder($cart, $order, $customer, $currency, $orderStatus) + { + return Module::hookExec('newOrder', array( + 'cart' => $cart, + 'order' => $order, + 'customer' => $customer, + 'currency' => $currency, + 'orderStatus' => $orderStatus)); + } + + static public function updateOrderStatus($newOrderStatusId, $id_order) + { + $order = new Order((int)($id_order)); + $newOS = new OrderState((int)($newOrderStatusId), $order->id_lang); + + $return = ((int)($newOS->id) == _PS_OS_PAYMENT_) ? Module::hookExec('paymentConfirm', array('id_order' => (int)($order->id))) : true; + $return = Module::hookExec('updateOrderStatus', array('newOrderStatus' => $newOS, 'id_order' => (int)($order->id))) AND $return; + return $return; + } + + static public function postUpdateOrderStatus($newOrderStatusId, $id_order) + { + $order = new Order((int)($id_order)); + $newOS = new OrderState((int)($newOrderStatusId), $order->id_lang); + $return = Module::hookExec('postUpdateOrderStatus', array('newOrderStatus' => $newOS, 'id_order' => (int)($order->id))); + return $return; + } + + /** + * Called when quantity of a product is updated. + * + * @param Product + * @param Order + */ + static public function updateQuantity($product, $order = null) + { + return Module::hookExec('updateQuantity', array('product' => $product, 'order' => $order)); + } + + static public function productFooter($product, $category) + { + return Module::hookExec('productFooter', array('product' => $product, 'category' => $category)); + } + + static public function productOutOfStock($product) + { + return Module::hookExec('productOutOfStock', array('product' => $product)); + } + + static public function addProduct($product) + { + return Module::hookExec('addProduct', array('product' => $product)); + } + + static public function updateProduct($product) + { + return Module::hookExec('updateProduct', array('product' => $product)); + } + + static public function deleteProduct($product) + { + return Module::hookExec('deleteProduct', array('product' => $product)); + } + + static public function updateProductAttribute($id_product_attribute) + { + return Module::hookExec('updateProductAttribute', array('id_product_attribute' => $id_product_attribute)); + } + + static public function orderConfirmation($id_order) + { + if (Validate::isUnsignedId($id_order)) + { + $params = array(); + $order = new Order((int)$id_order); + $currency = new Currency((int)$order->id_currency); + + if (Validate::isLoadedObject($order)) + { + $params['total_to_pay'] = $order->total_paid; + $params['currency'] = $currency->sign; + $params['objOrder'] = $order; + $params['currencyObj'] = $currency; + + return Module::hookExec('orderConfirmation', $params); + } + } + return false; + } + + static public function paymentReturn($id_order, $id_module) + { + if (Validate::isUnsignedId($id_order) AND Validate::isUnsignedId($id_module)) + { + $params = array(); + $order = new Order((int)($id_order)); + $currency = new Currency((int)($order->id_currency)); + + if (Validate::isLoadedObject($order)) + { + $params['total_to_pay'] = $order->total_paid; + $params['currency'] = $currency->sign; + $params['objOrder'] = $order; + $params['currencyObj'] = $currency; + + return Module::hookExec('paymentReturn', $params, (int)($id_module)); + } + } + return false; + } + + static public function PDFInvoice($pdf, $id_order) + { + if (!is_object($pdf) OR !Validate::isUnsignedId($id_order)) + return false; + return Module::hookExec('PDFInvoice', array('pdf' => $pdf, 'id_order' => $id_order)); + } + + static public function backBeforePayment($module) + { + $params['module'] = strval($module); + if (!$params['module']) + return false; + return Module::hookExec('backBeforePayment', $params); + } + + static public function updateCarrier($id_carrier, $carrier) + { + if (!Validate::isUnsignedId($id_carrier) OR !is_object($carrier)) + return false; + return Module::hookExec('updateCarrier', array('id_carrier' => $id_carrier, 'carrier' => $carrier)); + } +} + + diff --git a/classes/Image.php b/classes/Image.php new file mode 100644 index 000000000..0ee5e3439 --- /dev/null +++ b/classes/Image.php @@ -0,0 +1,516 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ImageCore extends ObjectModel +{ + public $id; + + /** @var integer Image ID */ + public $id_image; + + /** @var integer Product ID */ + public $id_product; + + /** @var string HTML title and alt attributes */ + public $legend; + + /** @var integer Position used to order images of the same product */ + public $position; + + /** @var boolean Image is cover */ + public $cover; + + /** @var string image extension */ + public $image_format = 'jpg'; + + /** @var string image folder */ + protected $folder; + + /** @var string image path without extension */ + protected $existing_path; + + protected $tables = array ('image', 'image_lang'); + + protected $fieldsRequired = array('id_product'); + protected $fieldsValidate = array('id_product' => 'isUnsignedId', 'position' => 'isUnsignedInt', 'cover' => 'isBool'); + protected $fieldsRequiredLang = array('legend'); + protected $fieldsSizeLang = array('legend' => 128); + protected $fieldsValidateLang = array('legend' => 'isGenericName'); + + protected $table = 'image'; + protected $identifier = 'id_image'; + + protected static $_cacheGetSize = array(); + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id, $id_lang); + $this->image_dir = _PS_PROD_IMG_DIR_; + } + + public function getFields() + { + parent::validateFields(); + $fields['id_product'] = (int)($this->id_product); + $fields['position'] = (int)($this->position); + $fields['cover'] = (int)($this->cover); + return $fields; + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('legend')); + } + + public function delete() + { + if (!parent::delete() || + !$this->deleteProductAttributeImage() || + !$this->deleteImage()) + return false; + + // update positions + $result = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)$this->id_product.' + ORDER BY `position`'); + $i = 1; + if ($result) + foreach ($result AS $row) + { + $row['position'] = $i++; + Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table, $row, 'UPDATE', '`id_image` = '.(int)($row['id_image']), 1); + } + + return true; + } + + /** + * Return available images for a product + * + * @param integer $id_lang Language ID + * @param integer $id_product Product ID + * @return array Images + */ + static public function getImages($id_lang, $id_product) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'image` i + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image`) + WHERE i.`id_product` = '.(int)$id_product.' AND il.`id_lang` = '.(int)$id_lang.' + ORDER BY i.`position` ASC'); + } + + /** + * Return Images + * + * @return array Images + */ + static public function getAllImages() + { + return Db::getInstance()->ExecuteS(' + SELECT `id_image`, `id_product` + FROM `'._DB_PREFIX_.'image` + ORDER BY `id_image` ASC'); + } + + /** + * Return number of images for a product + * + * @param integer $id_product Product ID + * @return integer number of images + */ + static public function getImagesTotal($id_product) + { + $result = Db::getInstance()->getRow(' + SELECT COUNT(`id_image`) AS total + FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)($id_product)); + return $result['total']; + } + + /** + * Return highest position of images for a product + * + * @param integer $id_product Product ID + * @return integer highest position of images + */ + static public function getHighestPosition($id_product) + { + $result = Db::getInstance()->getRow(' + SELECT MAX(`position`) AS max + FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)($id_product)); + return $result['max']; + } + + /** + * Delete product cover + * + * @param integer $id_product Product ID + * @return boolean result + */ + static public function deleteCover($id_product) + { + if (!Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + + if (file_exists(_PS_TMP_IMG_DIR_.'product_'.$id_product.'.jpg')) + unlink(_PS_TMP_IMG_DIR_.'product_'.$id_product.'.jpg'); + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'image` + SET `cover` = 0 + WHERE `id_product` = '.(int)($id_product)); + } + + /** + *Get product cover + * + * @param integer $id_product Product ID + * @return boolean result + */ + static public function getCover($id_product) + { + return Db::getInstance()->getRow(' + SELECT * FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)($id_product).' + AND `cover`= 1'); + } + + /** + * Copy images from a product to another + * + * @param integer $id_product_old Source product ID + * @param boolean $id_product_new Destination product ID + */ + static public function duplicateProductImages($id_product_old, $id_product_new, $combinationImages) + { + $imagesTypes = ImageType::getImagesTypes('products'); + $result = Db::getInstance()->ExecuteS(' + SELECT `id_image` + FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)($id_product_old)); + foreach ($result as $row) + { + $imageOld = new Image($row['id_image']); + $imageNew = clone $imageOld; + $imageNew->id_product = (int)($id_product_new); + $imageOld->id_product = (int)($id_product_old); + if ($imageNew->add()) + { + foreach ($imagesTypes AS $k => $imageType) + { + if (file_exists(_PS_PROD_IMG_DIR_.$imageOld->getExistingImgPath().'-'.$imageType['name'].'.jpg')) + { + $imageNew->createImgFolder(); + copy(_PS_PROD_IMG_DIR_.$imageOld->getExistingImgPath().'-'.$imageType['name'].'.jpg', _PS_PROD_IMG_DIR_. + $imageNew->getImgPath().'-'.$imageType['name'].'.jpg'); + } + } + if (file_exists(_PS_PROD_IMG_DIR_.$imageOld->getExistingImgPath().'.jpg')) + copy(_PS_PROD_IMG_DIR_.$imageOld->getExistingImgPath().'.jpg', + _PS_PROD_IMG_DIR_.$imageNew->getImgPath().'.jpg'); + + self::replaceAttributeImageAssociationId($combinationImages, (int)($imageOld->id), (int)($imageNew->id)); + } + else + return false; + } + return self::duplicateAttributeImageAssociations($combinationImages); + } + + static protected function replaceAttributeImageAssociationId(&$combinationImages, $saved_id, $id_image) + { + if (!isset($combinationImages['new']) OR !is_array($combinationImages['new'])) + return ; + foreach ($combinationImages['new'] AS $id_product_attribute => $imageIds) + foreach ($imageIds AS $key => $imageId) + if ((int)($imageId) == (int)($saved_id)) + $combinationImages['new'][$id_product_attribute][$key] = (int)($id_image); + } + + /** + * Duplicate product attribute image associations + * @param integer $id_product_attribute_old + * @return boolean + */ + static public function duplicateAttributeImageAssociations($combinationImages) + { + if (!isset($combinationImages['new']) OR !is_array($combinationImages['new'])) + return true; + $query = 'INSERT INTO `'._DB_PREFIX_.'product_attribute_image` (`id_product_attribute`, `id_image`) VALUES '; + foreach ($combinationImages['new'] AS $id_product_attribute => $imageIds) + foreach ($imageIds AS $imageId) + $query .= '('.(int)($id_product_attribute).', '.(int)($imageId).'), '; + $query = rtrim($query, ', '); + return DB::getInstance()->Execute($query); + } + + /** + * Reposition image + * + * @param integer $position Position + * @param boolean $direction Direction + */ + public function positionImage($position, $direction) + { + $position = (int)($position); + $direction = (int)($direction); + + // temporary position + $high_position = Image::getHighestPosition($this->id_product) + 1; + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'image` + SET `position` = '.(int)($high_position).' + WHERE `id_product` = '.(int)($this->id_product).' + AND `position` = '.($direction ? $position - 1 : $position + 1)); + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'image` + SET `position` = `position`'.($direction ? '-1' : '+1').' + WHERE `id_image` = '.(int)($this->id)); + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'image` + SET `position` = '.$this->position.' + WHERE `id_product` = '.(int)($this->id_product).' + AND `position` = '.(int)($high_position)); + } + + static public function getSize($type) + { + if (!isset(self::$_cacheGetSize[$type]) OR self::$_cacheGetSize[$type] === NULL) + self::$_cacheGetSize[$type] = Db::getInstance()->getRow('SELECT `width`, `height` FROM '._DB_PREFIX_.'image_type WHERE `name` = \''.pSQL($type).'\''); + return self::$_cacheGetSize[$type]; + } + + /** + * Clear all images in tmp dir + */ + static public function clearTmpDir() + { + foreach (scandir(_PS_TMP_IMG_DIR_) AS $d) + if (preg_match('/(.*)\.jpg$/', $d)) + unlink(_PS_TMP_IMG_DIR_.$d); + } + /** + * Delete Image - Product attribute associations for this image + */ + public function deleteProductAttributeImage() + { + return Db::getInstance()->Execute(' + DELETE + FROM `'._DB_PREFIX_.'product_attribute_image` + WHERE `id_image` = '.(int)($this->id) + ); +} + + /** + * Delete a product image from disk and remove the containing folder if empty + * Handles both legacy and new image filesystems + */ + public function deleteImage() + { + // Delete base image + if (file_exists($this->image_dir.$this->getExistingImgPath().'.'.$this->image_format)) + unlink($this->image_dir.$this->getExistingImgPath().'.'.$this->image_format); + else + return false; + + // Delete auto-generated images + $imageTypes = ImageType::getImagesTypes(); + foreach ($imageTypes AS $imageType) + if (file_exists($this->image_dir.$this->getExistingImgPath().'-'.$imageType['name'].'.'.$this->image_format)) + unlink($this->image_dir.$this->getExistingImgPath().'-'.$imageType['name'].'.'.$this->image_format); + + // Can we remove the image folder? + if (is_dir($this->image_dir.$this->getImgFolder())) + { + $remove_folder = true; + foreach (scandir($this->image_dir.$this->getImgFolder()) as $file) + if (($file != '.' && $file != '..')) + { + $remove_folder = false; + break; +} + } + if (isset($remove_folder) && $remove_folder) + @rmdir($this->image_dir.$this->getImgFolder()); + + // Delete tmp images + if (file_exists(_PS_TMP_IMG_DIR_.'product_'.$this->id_product.'.'.$this->image_format) + && !unlink(_PS_TMP_IMG_DIR_.'product_'.$this->id_product.'.'.$this->image_format)) + return false; + if (file_exists(_PS_TMP_IMG_DIR_.'product_mini_'.$this->id_product.'.'.$this->image_format) + && !unlink(_PS_TMP_IMG_DIR_.'product_mini_'.$this->id_product.'.'.$this->image_format)) + return false; + + return true; + } + + /** + * Recursively deletes all product images in the given folder tree and removes empty folders. + * + * @param string $path folder containing the product images to delete + * @param string $format image format + * @return bool success + */ + public static function deleteAllImages($path, $format='jpg') + { + if (!$path || !$format || !is_dir($path)) + return false; + foreach (scandir($path) as $file) + { + if (preg_match('/^[0-9]+(\-(.*))?\.'.$format.'$/', $file)) + unlink($path.$file); + else if (is_dir($path.$file) && (preg_match('/^[0-9]$/', $file))) + self::deleteAllImages($path.$file.'/', $format); + } + + // Can we remove the image folder? + $remove_folder = true; + foreach (scandir($path) as $file) + if (($file != '.' && $file != '..')) + { + $remove_folder = false; + break; + } + + if ($remove_folder) + @rmdir($path); + + return true; + } + + /** + * Returns image path in the old or in the new filesystem + * + * @ returns string image path + */ + public function getExistingImgPath() + { + if (!$this->existing_path) + { + if (Configuration::get('PS_LEGACY_IMAGES') && file_exists(_PS_PROD_IMG_DIR_.$this->id_product.'-'.$this->id.'.'.$this->image_format)) + $this->existing_path = $this->id_product.'-'.$this->id; + else + $this->existing_path = $this->getImgPath(); + } + + return $this->existing_path; + } + + /** + * Returns the path to the folder containing the image in the new filesystem + * + * @return string path to folder + */ + public function getImgFolder() + { + if (!$this->id) + return false; + + if (!$this->folder) + $this->folder = self::getImgFolderStatic($this->id); + + return $this->folder; + } + + /** + * Create parent folders for the image in the new filesystem + * + * @return bool success + */ + public function createImgFolder() + { + if (!file_exists(_PS_PROD_IMG_DIR_.$this->getImgFolder())) + return @mkdir(_PS_PROD_IMG_DIR_.$this->getImgFolder(), 0755, true); + return true; + } + + /** + * Returns the path to the image without file extension + * + * @return string path + */ + public function getImgPath() + { + $path = $this->getImgFolder().$this->id; + return $path; + } + + /** + * Returns the path to the folder containing the image in the new filesystem + * + * @param mixed $id_image + * @return string path to folder + */ + public static function getImgFolderStatic($id_image) + { + if (!is_numeric($id_image)) + return false; + $folders = str_split((string)$id_image); + return implode('/', $folders).'/'; + } + + /** + * Move all legacy product image files from the image folder root to their subfolder in the new filesystem. + * If max_execution_time is provided, stops before timeout and returns string "timeout". + * + * @return mixed success or timeout + */ + public static function moveToNewFileSystem($max_execution_time = 0) + { + $start_time = time(); + $image = null; + $result = true; + foreach (scandir(_PS_PROD_IMG_DIR_) as $file) + { + if (preg_match('/^([0-9]+\-)([0-9]+)(\-(.*))?\.jpg$/', $file, $matches)) + { + // don't recreate an image object for each image type + if (!$image || $image->id !== (int)$matches[2]) + $image = new Image((int)$matches[2]); + + if ($image->createImgFolder()) + { + $new_path = _PS_PROD_IMG_DIR_.$image->getImgPath().(isset($matches[3]) ? $matches[3] : '').'.jpg'; + $result &= @rename(_PS_PROD_IMG_DIR_.$file, $new_path); + } + } + if ((int)$max_execution_time != 0 && (time() - $start_time > (int)$max_execution_time - 4)) + return 'timeout'; + } + return $result; + } +} + + diff --git a/classes/ImageType.php b/classes/ImageType.php new file mode 100644 index 000000000..b109a27ca --- /dev/null +++ b/classes/ImageType.php @@ -0,0 +1,149 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ImageTypeCore extends ObjectModel +{ + public $id; + + /** @var string Name */ + public $name; + + /** @var integer Width */ + public $width; + + /** @var integer Height */ + public $height; + + /** @var boolean Apply to products */ + public $products; + + /** @var integer Apply to categories */ + public $categories; + + /** @var integer Apply to manufacturers */ + public $manufacturers; + + /** @var integer Apply to suppliers */ + public $suppliers; + + /** @var integer Apply to scenes */ + public $scenes; + + /** @var integer Apply to store */ + public $stores; + + protected $fieldsRequired = array('name', 'width', 'height'); + protected $fieldsValidate = array( + 'name' => 'isImageTypeName', + 'width' => 'isImageSize', + 'height' => 'isImageSize', + 'categories' => 'isBool', + 'products' => 'isBool', + 'manufacturers' => 'isBool', + 'suppliers' => 'isBool', + 'scenes' => 'isBool', + 'stores' => 'isBool' + ); + protected $fieldsSize = array('name' => 16); + + protected $table = 'image_type'; + protected $identifier = 'id_image_type'; + + /** + * @var array Image types cache + */ + protected static $images_types_cache = array(); + + protected $webserviceParameters = array(); + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + $fields['width'] = (int)($this->width); + $fields['height'] = (int)($this->height); + $fields['products'] = (int)($this->products); + $fields['categories'] = (int)($this->categories); + $fields['manufacturers'] = (int)($this->manufacturers); + $fields['suppliers'] = (int)($this->suppliers); + $fields['scenes'] = (int)($this->scenes); + $fields['stores'] = (int)($this->stores); + return $fields; + } + + /** + * Returns image type definitions + * + * @param string|null Image type + * @return array Image type definitions + */ + static public function getImagesTypes($type = NULL) + { + if (!isset(self::$images_types_cache[$type])) + { + if (!empty($type)) + $where = 'WHERE ' . pSQL($type) . ' = 1 '; + else + $where = ''; + + $query = 'SELECT * FROM `'._DB_PREFIX_.'image_type`'.$where.'ORDER BY `name` ASC'; + self::$images_types_cache[$type] = Db::getInstance()->ExecuteS($query); + } + + return self::$images_types_cache[$type]; + } + + /** + * Check if type already is already registered in database + * + * @param string $typeName Name + * @return integer Number of results found + */ + static public function typeAlreadyExists($typeName) + { + if (!Validate::isImageTypeName($typeName)) + die(Tools::displayError()); + + $result = Db::getInstance()->ExecuteS(' + SELECT `id_image_type` + FROM `'._DB_PREFIX_.'image_type` + WHERE `name` = \''.pSQL($typeName).'\''); + + return Db::getInstance()->NumRows(); + } + + /** + * Finds image type definition by name and type + * @param string $name + * @param string $type + */ + static public function getByNameNType($name, $type) + { + return Db::getInstance()->getRow('SELECT `id_image_type`, `name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`, `scenes` FROM `'._DB_PREFIX_.'image_type` WHERE `name` = \''.pSQL($name).'\' AND `'.pSQL($type).'` = 1'); + } + +} diff --git a/classes/ImportModule.php b/classes/ImportModule.php new file mode 100644 index 000000000..2b26f7d0c --- /dev/null +++ b/classes/ImportModule.php @@ -0,0 +1,93 @@ + + * @copyright PrestaShop + * @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0 + * @version 1.4 + * + */ + +abstract class ImportModuleCore extends Module +{ + protected $_link = NULL; + + public $server; + + public $user; + + public $passwd; + + public $database; + + /** @var string Prefix database */ + public $prefix; + + + public function __destruct() + { + if($this->_link) + @mysql_close($this->_link); + } + + protected function initDatabaseConnection() + { + if ($this->_link != NULL) + return $this->_link; + if ($this->_link = mysql_connect($this->server, $this->user, $this->passwd, true)) + { + if(!mysql_select_db($this->database, $this->_link)) + die(Tools::displayError('The database selection cannot be made.')); + if (!mysql_query('SET NAMES \'utf8\'', $this->_link)) + die(Tools::displayError('PrestaShop Fatal error: no utf-8 support. Please check your server configuration.')); + } + else + die(Tools::displayError('Link to database cannot be established.')); + return $this->_link; + } + + public function ExecuteS($query) + { + $this->initDatabaseConnection(); + $result = mysql_query($query, $this->_link); + $resultArray = array(); + if ($result !== true) + while ($row = mysql_fetch_assoc($result)) + $resultArray[] = $row; + return $resultArray; + } + + public function Execute($query) + { + $this->initDatabaseConnection(); + return mysql_query($query, $this->_link); + } + + public function getValue($query) + { + $this->initDatabaseConnection(); + $result = $this->ExecuteS($query); + if (!sizeof($result)) + return 0; + else + return array_shift($result[0]); + } + + public static function getImportModulesOnDisk () + { + $modules = Module::getModulesOnDisk(true); + foreach ($modules as $key => $module) + if(get_parent_class($module) != 'ImportModule') + unset($modules[$key]); + return $modules; + } + + abstract public function getDefaultIdLang(); + +} + +?> diff --git a/classes/Language.php b/classes/Language.php new file mode 100644 index 000000000..da77de3d7 --- /dev/null +++ b/classes/Language.php @@ -0,0 +1,655 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class LanguageCore extends ObjectModel +{ + public $id; + + /** @var string Name */ + public $name; + + /** @var string 2-letter iso code */ + public $iso_code; + + /** @var string 5-letter iso code */ + public $language_code; + + /** @var boolean Status */ + public $active = true; + + protected $fieldsRequired = array('name', 'iso_code'); + protected $fieldsSize = array('name' => 32, 'iso_code' => 2, 'language_code' => 5); + protected $fieldsValidate = array('name' => 'isGenericName', 'iso_code' => 'isLanguageIsoCode', 'language_code' => 'isLanguageCode', 'active' => 'isBool'); + + protected $table = 'lang'; + protected $identifier = 'id_lang'; + + /** @var array Languages cache */ + protected static $_checkedLangs; + protected static $_LANGUAGES; + protected static $countActiveLanguages; + + protected $webserviceParameters = array( + 'objectNodeName' => 'language', + 'objectsNodeName' => 'languages', + ); + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id); + } + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + $fields['iso_code'] = pSQL(strtolower($this->iso_code)); + $fields['language_code'] = pSQL(strtolower($this->language_code)); + if (empty($fields['language_code'])) + $fields['language_code'] = $fields['iso_code']; + $fields['active'] = (int)($this->active); + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + if (!parent::add($autodate)) + return false; + + $translationsFiles = array( + 'fields' => '_FIELDS', + 'errors' => '_ERRORS', + 'admin' => '_LANGADM', + 'pdf' => '_LANGPDF', + ); + if (!file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code)) + mkdir(_PS_TRANSLATIONS_DIR_.$this->iso_code); + foreach ($translationsFiles as $file => $var) + if (!file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code.'/'.$file.'.php')) + file_put_contents(_PS_TRANSLATIONS_DIR_.$this->iso_code.'/'.$file.'.php', ''); + + $resUpdateSQL = $this->loadUpdateSQL(); + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return $resUpdateSQL; + + return ($resUpdateSQL AND Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + )); + } + + public function toggleStatus() + { + if (!parent::toggleStatus()) + return false; + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + return (Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + )); + } + + public function checkFiles() + { + return self::checkFilesWithIsoCode($this->iso_code); + } + + + /** + * This functions checks if every files exists for the language $iso_code. + * Concerned files are theses located in translations/$iso_code/ + * and translations/mails/$iso_code . + * + * @param mixed $iso_code + * @returntrue if all files exists + */ + public static function checkFilesWithIsoCode($iso_code) + { + if (isset(self::$_checkedLangs[$iso_code]) AND self::$_checkedLangs[$iso_code]) + return true; + foreach (self::getFilesList($iso_code, _THEME_NAME_, false, false, false, true) as $key => $file) + if (!file_exists($key)) + return false; + self::$_checkedLangs[$iso_code] = true; + return true; + } + + public static function getFilesList($iso_from, $theme_from, $iso_to = false, $theme_to = false, $select = false, $check = false, $modules = false) + { + if (empty($iso_from)) + die(Tools::displayError()); + + $copy = ($iso_to AND $theme_to) ? true : false; + + $lPath_from = _PS_TRANSLATIONS_DIR_.(string)$iso_from.'/'; + $tPath_from = _PS_ROOT_DIR_.'/themes/'.(string)$theme_from.'/'; + $mPath_from = _PS_MAIL_DIR_.(string)$iso_from.'/'; + + if ($copy) + { + $lPath_to = _PS_TRANSLATIONS_DIR_.(string)$iso_to.'/'; + $tPath_to = _PS_ROOT_DIR_.'/themes/'.(string)$theme_to.'/'; + $mPath_to = _PS_MAIL_DIR_.(string)$iso_to.'/'; + } + + $lFiles = array('admin'.'.php', 'errors'.'.php', 'fields'.'.php', 'pdf'.'.php'); + $mFiles = array( + 'account.html', 'account.txt', + 'bankwire.html', 'bankwire.txt', + 'cheque.html', 'cheque.txt', + 'contact.html', 'contact.txt', + 'contact_form.html', 'contact_form.txt', + 'credit_slip.html', 'credit_slip.txt', + 'download_product.html', 'download_product.txt', + 'download-product.tpl', + 'employee_password.html', 'employee_password.txt', + 'forward_msg.html', 'forward_msg.txt', + 'guest_to_customer.html', 'guest_to_customer.txt', + 'in_transit.html', 'in_transit.txt', + 'newsletter.html', 'newsletter.txt', + 'order_canceled.html', 'order_canceled.txt', + 'order_conf.html', 'order_conf.txt', + 'order_customer_comment.html', 'order_customer_comment.txt', + 'order_merchant_comment.html', 'order_merchant_comment.txt', + 'order_return_state.html', 'order_return_state.txt', + 'outofstock.html', 'outofstock.txt', + 'password.html', 'password.txt', + 'password_query.html', 'password_query.txt', + 'payment.html', 'payment.txt', + 'payment_error.html', 'payment_error.txt', + 'preparation.html', 'preparation.txt', + 'refund.html', 'refund.txt', + 'reply_msg.html', 'reply_msg.txt', + 'shipped.html', 'shipped.txt', + 'test.html', 'test.txt', + 'voucher.html', 'voucher.txt', + ); + + $number = -1; + + $files = array(); + $files_tr = array(); + $files_theme = array(); + $files_mail = array(); + $files_modules = array(); + + + // When a copy is made from a theme in specific language + // to an other theme for the same language, + // it's avoid to copy Translations, Mails files + // and modules files which are not override by theme. + if (!$copy OR $iso_from != $iso_to) + { + // Translations files + if (!$check OR ($check AND (string)$iso_from != 'en')) + foreach ($lFiles as $file) + $files_tr[$lPath_from.$file] = ($copy ? $lPath_to.$file : ++$number); + if ($select == 'tr') + return $files_tr; + $files = array_merge($files, $files_tr); + + // Mail files + if (!$check OR ($check AND (string)$iso_from != 'en')) + $files_mail[$mPath_from.'lang.php'] = ($copy ? $mPath_to.'lang.php' : ++$number); + foreach ($mFiles as $file) + $files_mail[$mPath_from.$file] = ($copy ? $mPath_to.$file : ++$number); + if ($select == 'mail') + return $files_mail; + $files = array_merge($files, $files_mail); + + // Modules + if ($modules) + { + $modList = Module::getModulesDirOnDisk(); + foreach ($modList as $k => $mod) + { + $modDir = _PS_MODULE_DIR_.$mod; + // Lang file + if (file_exists($modDir.'/'.(string)$iso_from.'.php')) + $files_modules[$modDir.'/'.(string)$iso_from.'.php'] = ($copy ? $modDir.'/'.(string)$iso_to.'.php' : ++$number); + // Mails files + $modMailDirFrom = $modDir.'/mails/'.(string)$iso_from; + $modMailDirTo = $modDir.'/mails/'.(string)$iso_to; + if (file_exists($modMailDirFrom)) + { + $dirFiles = scandir($modMailDirFrom); + foreach ($dirFiles as $file) + if (file_exists($modMailDirFrom.'/'.$file) AND $file != '.' AND $file != '..' AND $file != '.svn') + $files_modules[$modMailDirFrom.'/'.$file] = ($copy ? $modMailDirTo.'/'.$file : ++$number); + } + } + if ($select == 'modules') + return $files_modules; + $files = array_merge($files, $files_modules); + } + } + else if ($select == 'mail' OR $select == 'tr') + { + return $files; + } + + // Theme files + if (!$check OR ($check AND (string)$iso_from != 'en')) + { + $files_theme[$tPath_from.'lang/'.(string)$iso_from.'.php'] = ($copy ? $tPath_to.'lang/'.(string)$iso_to.'.php' : ++$number); + $module_theme_files = (file_exists($tPath_from.'modules/') ? scandir($tPath_from.'modules/') : array()); + foreach ($module_theme_files as $module) + if ($module !== '.' AND $module != '..' AND $module !== '.svn' AND file_exists($tPath_from.'modules/'.$module.'/'.(string)$iso_from.'.php')) + $files_theme[$tPath_from.'modules/'.$module.'/'.(string)$iso_from.'.php'] = ($copy ? $tPath_to.'modules/'.$module.'/'.(string)$iso_to.'.php' : ++$number); + } + if ($select == 'theme') + return $files_theme; + $files = array_merge($files, $files_theme); + + // Return + return $files; + } + + /** + * loadUpdateSQL will create default lang values when you create a new lang, based on default id lang + * + * @return boolean true if succeed + */ + public function loadUpdateSQL() + { + $tables = Db::getInstance()->ExecuteS('SHOW TABLES LIKE \''._DB_PREFIX_.'%_lang\' '); + $langTables = array(); + + foreach($tables as $table) + foreach($table as $t) + $langTables[] = $t; + + Db::getInstance()->Execute('SET @id_lang_default = (SELECT c.`value` FROM `'._DB_PREFIX_.'configuration` c WHERE c.`name` = \'PS_LANG_DEFAULT\' LIMIT 1)'); + $return = true; + foreach($langTables as $name) + { + $fields = ''; + $columns = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'.$name.'`'); + foreach($columns as $column) + $fields .= $column['Field'].', '; + $fields = rtrim($fields, ', '); + $identifier = 'id_'.str_replace('_lang', '', str_replace(_DB_PREFIX_, '', $name)); + + $sql = 'INSERT IGNORE INTO `'.$name.'` ('.$fields.') (SELECT '; + foreach($columns as $column) { + if ($identifier != $column['Field'] and $column['Field'] != 'id_lang') + $sql .= '(SELECT `'.$column['Field'].'` FROM `'.$name.'` tl WHERE tl.`id_lang` = @id_lang_default AND tl.`'.$identifier.'` = `'.str_replace('_lang', '', $name).'`.`'.$identifier.'`), '; + else + $sql.= '`'.$column['Field'].'`, '; + } + $sql = rtrim($sql, ', '); + $sql .= ' FROM `'._DB_PREFIX_.'lang` CROSS JOIN `'.str_replace('_lang', '', $name).'`) ;'; + $return &= Db::getInstance()->Execute(pSQL($sql)); + } + return $return; + } + + public static function recurseDeleteDir($dir) + { + if (!is_dir($dir)) + return false; + if ($handle = @opendir($dir)) + { + while (false !== ($file = readdir($handle))) + if ($file != '.' && $file != '..') + { + if (is_dir($dir.'/'.$file)) + self::recurseDeleteDir($dir.'/'.$file); + elseif (file_exists($dir.'/'.$file)) + @unlink($dir.'/'.$file); + } + closedir($handle); + } + rmdir($dir); + } + + public function delete() + { + if (empty($this->iso_code)) + $this->iso_code = self::getIsoById($this->id); + + // Database translations deletion + $result = Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'`'); + foreach ($result AS $row) + if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_])) + if (!Db::getInstance()->Execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)($this->id))) + return false; + + // Delete tags + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'tag WHERE id_lang = '.(int)($this->id)); + + // Delete search words + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'search_word WHERE id_lang = '.(int)($this->id)); + + // Files deletion + foreach (self::getFilesList($this->iso_code, _THEME_NAME_, false, false, false, true, true) as $key => $file) + if (file_exists($key)) + unlink($key); + $modList = scandir(_PS_MODULE_DIR_); + foreach ($modList as $k => $mod) + { + self::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'.$this->iso_code); + $files = @scandir(_PS_MODULE_DIR_.$mod.'/mails/'); + if (count($files) <= 2) + self::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'); + + if(file_exists(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php')) + { + $return = unlink(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php'); + $files = @scandir(_PS_MODULE_DIR_.$mod); + if (count($files) <= 2) + self::recurseDeleteDir(_PS_MODULE_DIR_.$mod); + } + } + + if (file_exists(_PS_MAIL_DIR_.$this->iso_code)) + self::recurseDeleteDir(_PS_MAIL_DIR_.$this->iso_code); + if (file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code)) + self::recurseDeleteDir(_PS_TRANSLATIONS_DIR_.$this->iso_code); + if (!parent::delete()) + return false; + + // delete images + $files_copy = array('/en.jpg', '/en-default-thickbox.jpg', '/en-default-home.jpg', '/en-default-large.jpg', '/en-default-medium.jpg', '/en-default-small.jpg', '/en-default-large_scene.jpg'); + $tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_); + foreach($tos AS $to) + foreach($files_copy AS $file) + { + $name = str_replace('/en', ''.$this->iso_code, $file); + + if (file_exists($to.$name)) + unlink($to.$name); + if (file_exists(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg')) + unlink(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg'); + } + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + + public function deleteSelection($selection) + { + if (!is_array($selection) OR !Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $result = true; + foreach ($selection AS $id) + { + $this->id = (int)($id); + $result = $result AND $this->delete(); + } + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + + Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + + return $result; + } + + /** + * Return available languages + * + * @param boolean $active Select only active languages + * @return array Languages + */ + public static function getLanguages($active = true, $id_shop = false) + { + if (!self::$_LANGUAGES) + self::loadLanguages(); + $languages = array(); + $languages = array(); + foreach (self::$_LANGUAGES AS $language) + { + if ($active AND !$language['active'] OR ($id_shop AND !isset($language['shops'][(int)$id_shop]))) + continue; + $languages[] = $language; + } + return $languages; + } + + public static function getLanguage($id_lang) + { + if (!array_key_exists((int)($id_lang), self::$_LANGUAGES)) + return false; + return self::$_LANGUAGES[(int)($id_lang)]; + } + + /** + * Return iso code from id + * + * @param integer $id_lang Language ID + * @return string Iso code + */ + public static function getIsoById($id_lang) + { + if (isset(self::$_LANGUAGES[(int)$id_lang]['iso_code'])) + return self::$_LANGUAGES[(int)$id_lang]['iso_code']; + return false; + } + + /** + * Return id from iso code + * + * @param string $iso_code Iso code + * @return integer Language ID + */ + public static function getIdByIso($iso_code) + { + if (!Validate::isLanguageIsoCode($iso_code)) + die(Tools::displayError('Fatal error : iso code is not correct : ').$iso_code); + + return Db::getInstance()->getValue('SELECT `id_lang` FROM `'._DB_PREFIX_.'lang` WHERE `iso_code` = \''.pSQL(strtolower($iso_code)).'\''); + } + + public static function getLanguageCodeByIso($iso_code) + { + if (!Validate::isLanguageIsoCode($iso_code)) + die(Tools::displayError('Fatal error : iso code is not correct : ').$iso_code); + + return Db::getInstance()->getValue('SELECT `language_code` FROM `'._DB_PREFIX_.'lang` WHERE `iso_code` = \''.pSQL(strtolower($iso_code)).'\''); + } + + /** + * Return array (id_lang, iso_code) + * + * @param string $iso_code Iso code + * @return array Language (id_lang, iso_code) + */ + public static function getIsoIds($active = true) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `id_lang`, `iso_code` FROM `'._DB_PREFIX_.'lang` '.($active ? 'WHERE active = 1' : '')); + } + + public static function copyLanguageData($from, $to) + { + $result = Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'`'); + foreach ($result AS $row) + if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_]) AND $row['Tables_in_'._DB_NAME_] != _DB_PREFIX_.'lang') + { + $result2 = Db::getInstance()->ExecuteS('SELECT * FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)($from)); + if (!sizeof($result2)) + continue; + Db::getInstance()->Execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)($to)); + $query = 'INSERT INTO `'.$row['Tables_in_'._DB_NAME_].'` VALUES '; + foreach ($result2 AS $row2) + { + $query .= '('; + $row2['id_lang'] = $to; + foreach ($row2 AS $field) + $query .= '\''.pSQL($field, true).'\','; + $query = rtrim($query, ',').'),'; + } + $query = rtrim($query, ','); + Db::getInstance()->Execute($query); + } + return true; + } + + /** + * Load all languages in memory for caching + */ + public static function loadLanguages() + { + self::$_LANGUAGES = array(); + + $result = Db::getInstance()->ExecuteS(' + SELECT l.`id_lang`, l.`name`, l.`iso_code`, l.`active`, ls.`id_shop` + FROM `'._DB_PREFIX_.'lang` l + LEFT JOIN `'._DB_PREFIX_.'lang_shop` ls ON (l.id_lang = ls.id_lang)'); + + foreach ($result AS $row) + { + if (!isset(self::$_LANGUAGES[(int)$row['id_lang']])) + self::$_LANGUAGES[(int)$row['id_lang']] = array('id_lang' => (int)$row['id_lang'], + 'name' => $row['name'], + 'iso_code' => $row['iso_code'], + 'active' => (int)$row['active'],); + self::$_LANGUAGES[(int)$row['id_lang']]['shops'][(int)$row['id_shop']] = true; + } + } + + public function update($nullValues = false) + { + if (!parent::update($nullValues)) + return false; + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + public static function checkAndAddLanguage($iso_code) + { + if (Language::getIdByIso($iso_code)) + return true; + else + { + if(@fsockopen('www.prestashop.com', 80)) + { + $lang = new Language(); + $lang->iso_code = $iso_code; + $lang->active = true; + + if ($lang_pack = Tools::jsonDecode(Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_language_pack.php?version='._PS_VERSION_.'&iso_lang='.$iso_code))) + { + if (isset($lang_pack->name) + && isset($lang_pack->version) + && isset($lang_pack->iso_code)) + $lang->name = $lang_pack->name; + } + if (!$lang->name OR !$lang->add()) + return false; + $insert_id = (int)($lang->id); + + if ($lang_pack) + { + $flag = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/flags/jpeg/'.$iso_code.'.jpg'); + if ($flag != NULL && !preg_match('//', $flag)) + { + $file = fopen(dirname(__FILE__).'/../img/l/'.$insert_id.'.jpg', 'w'); + if ($file) + { + fwrite($file, $flag); + fclose($file); + } + else + self::_copyNoneFlag($insert_id); + } + else + self::_copyNoneFlag($insert_id); + } + else + self::_copyNoneFlag($insert_id); + + $files_copy = array('/en.jpg', '/en-default-thickbox.jpg', '/en-default-home.jpg', '/en-default-large.jpg', '/en-default-medium.jpg', '/en-default-small.jpg', '/en-default-large_scene.jpg'); + $tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_); + foreach($tos AS $to) + foreach($files_copy AS $file) + { + $name = str_replace('/en', '/'.$iso_code, $file); + copy(dirname(__FILE__).'/../img/l'.$file, $to.$name); + } + return true; + } + else + return false; + } + } + + protected static function _copyNoneFlag($id) + { + return copy(dirname(__FILE__).'/../img/l/none.jpg', dirname(__FILE__).'/../img/l/'.$id.'.jpg'); + } + + private static $_cache_language_installation = null; + public static function isInstalled($iso_code) + { + if (self::$_cache_language_installation === null) + { + self::$_cache_language_installation = array(); + $result = Db::getInstance()->ExecuteS('SELECT `id_lang`, `iso_code` FROM `'._DB_PREFIX_.'lang`'); + foreach ($result as $row) + self::$_cache_language_installation[$row['iso_code']] = $row['id_lang']; + } + return (isset(self::$_cache_language_installation[$iso_code]) ? self::$_cache_language_installation[$iso_code] : false); + } + + public static function countActiveLanguages() + { + if (!self::$countActiveLanguages) + self::$countActiveLanguages = Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'lang` WHERE `active` = 1'); + return self::$countActiveLanguages; + } +} diff --git a/classes/Link.php b/classes/Link.php new file mode 100644 index 000000000..846afebf5 --- /dev/null +++ b/classes/Link.php @@ -0,0 +1,365 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class LinkCore +{ + /** @var boolean Rewriting activation */ + protected $allow; + protected $url; + public static $cache = array('page' => array()); + + /** + * Constructor (initialization only) + */ + public function __construct() + { + $this->allow = (int)Configuration::get('PS_REWRITING_SETTINGS'); + $this->url = $_SERVER['SCRIPT_NAME']; + } + + /** + * This function returns a link to delete a customization picture file + * + * @param mixed $product + * @param mixed $id_picture + * @return void + */ + public function getProductDeletePictureLink($product, $id_picture){ + if (is_object($product)) + return ($this->allow == 1)?(_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink().((isset($product->category) AND !empty($product->category) AND $product->category != 'home') ? $product->category.'/' : '').(int)$product->id.'-'.$product->link_rewrite.($product->ean13 ? '-'.$product->ean13 : '').'.html?deletePicture='.$id_picture) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$product->id).'&deletePicture='.$id_picture; + else + return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$product.'&deletePicture='.$id_picture; + } + + /** + * Return the correct link for product/category/supplier/manufacturer + * + * @param mixed $id_OBJ Can be either the object or the ID only + * @param string $alias Friendly URL (only if $id_OBJ is the object) + * @return string link + */ + public function getProductLink($id_product, $alias = NULL, $category = NULL, $ean13 = NULL, $id_lang = NULL) + { + if (is_object($id_product)) + return ($this->allow == 1)?(_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)$id_lang).((isset($id_product->category) AND !empty($id_product->category) AND $id_product->category != 'home') ? $id_product->category.'/' : '').(int)$id_product->id.'-'.$id_product->link_rewrite.($id_product->ean13 ? '-'.$id_product->ean13 : '').'.html') : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$id_product->id); + elseif ($alias) + return ($this->allow == 1)?(_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)$id_lang).(($category AND $category != 'home') ? ($category.'/') : '').(int)$id_product.'-'.$alias.($ean13 ? '-'.$ean13 : '').'.html') : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$id_product); + else + return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=product&id_product='.(int)$id_product; + } + + public function getCategoryLink($id_category, $alias = NULL, $id_lang = NULL) + { + if (is_object($id_category)) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_category->id).'-'.$id_category->link_rewrite) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=category&id_category='.(int)($id_category->id)); + if ($alias) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_category).'-'.$alias) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=category&id_category='.(int)($id_category)); + return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=category&id_category='.(int)($id_category); + } + + public function getCMSCategoryLink($id_category, $alias = NULL, $id_lang = NULL) + { + if (is_object($id_category)) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/category/'.(int)($id_category->id).'-'.$id_category->link_rewrite) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=cms&id_cms_category='.(int)($id_category->id)); + if ($alias) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/category/'.(int)($id_category).'-'.$alias) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=cms&id_cms_category='.(int)($id_category)); + return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=cms&id_cms_category='.(int)($id_category); + } + + public function getCMSLink($cms, $alias = null, $ssl = false, $id_lang = NULL) + { + $base = (($ssl AND Configuration::get('PS_SSL_ENABLED')) ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true)); + + if (is_object($cms)) + { + return ($this->allow == 1) ? + ($base.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/'.(int)($cms->id).'-'.$cms->link_rewrite) : + ($base.__PS_BASE_URI__.'index.php?controller=cms&id_cms='.(int)($cms->id)); + } + + if ($alias) + return ($this->allow == 1) ? ($base.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).'content/'.(int)($cms).'-'.$alias) : + ($base.__PS_BASE_URI__.'index.php?controller=cms&id_cms='.(int)($cms)); + return $base.__PS_BASE_URI__.'index.php?controller=cms&id_cms='.(int)($cms); + } + + public function getSupplierLink($id_supplier, $alias = NULL, $id_lang = NULL) + { + if (is_object($id_supplier)) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_supplier->id).'__'.$id_supplier->link_rewrite) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=supplier&id_supplier='.(int)($id_supplier->id)); + if ($alias) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_supplier).'__'.$alias) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=supplier&id_supplier='.(int)($id_supplier)); + return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=supplier&id_supplier='.(int)($id_supplier); + } + + public function getManufacturerLink($id_manufacturer, $alias = NULL, $id_lang = NULL) + { + if (is_object($id_manufacturer)) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_manufacturer->id).'_'.$id_manufacturer->link_rewrite) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=manufacturer&id_manufacturer='.(int)($id_manufacturer->id)); + if ($alias) + return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$this->getLangLink((int)($id_lang)).(int)($id_manufacturer).'_'.$alias) : + (_PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=manufacturer&id_manufacturer='.(int)($id_manufacturer)); + return _PS_BASE_URL_.__PS_BASE_URI__.'index.php?controller=manufacturer&id_manufacturer='.(int)($id_manufacturer); + } + + /** + * Returns a link to a product image for display + * Note: the new image filesystem stores product images in subdirectories of img/p/ + * + * @param string $name rewrite link of the image + * @param string $ids id part of the image filename - can be "id_product-id_image" (legacy support, recommended) or "id_image" (new) + * @param string $type + */ + public function getImageLink($name, $ids, $type = NULL) + { + global $protocol_content; + + // legacy mode + if (Configuration::get('PS_LEGACY_IMAGES') + && (file_exists(_PS_PROD_IMG_DIR_.$ids.($type ? '-'.$type : '').'.jpg'))) + { + if ($this->allow == 1) + $uri_path = __PS_BASE_URI__.$ids.($type ? '-'.$type : '').'/'.$name.'.jpg'; + else + $uri_path = _THEME_PROD_DIR_.$ids.($type ? '-'.$type : '').'.jpg'; + }else + { + // if ids if of the form id_product-id_image, we want to extract the id_image part + $split_ids = explode('-', $ids); + $id_image = (isset($split_ids[1]) ? $split_ids[1] : $split_ids[0]); + + if ($this->allow == 1) + $uri_path = __PS_BASE_URI__.$id_image.($type ? '-'.$type : '').'/'.$name.'.jpg'; + else + $uri_path = _THEME_PROD_DIR_.Image::getImgFolderStatic($id_image).$id_image.($type ? '-'.$type : '').'.jpg'; + } + + return $protocol_content.Tools::getMediaServer($uri_path).$uri_path; + } + + public function getMediaLink($filepath) + { + return Tools::getProtocol().Tools::getMediaServer($filepath).$filepath; + } + + public function preloadPageLinks() + { + global $cookie; + if ($this->allow != 1) + return; + + $result = Db::getInstance()->ExecuteS(' + SELECT page, url_rewrite + FROM `'._DB_PREFIX_.'meta` m + LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON (m.id_meta = ml.id_meta) + WHERE id_lang = '.(int)$cookie->id_lang); + foreach ($result as $row) + self::$cache['page'][$row['page'].'.php_'.$cookie->id_lang] = $this->getLangLink((int)$cookie->id_lang).$row['url_rewrite']; + } + + public function getPageLink($filename, $ssl = false, $id_lang = NULL, $request = NULL) + { + global $cookie; + if ($id_lang == NULL) + $id_lang = (int)($cookie->id_lang); + + if (array_key_exists($filename.'_'.$id_lang, self::$cache['page']) AND !empty(self::$cache['page'][$filename.'_'.$id_lang])) + $uri_path = self::$cache['page'][$filename.'_'.$id_lang]; + else + { + if ($this->allow == 1) + { + $url_rewrite = ''; + if ($filename != 'index') + { + $pagename = $filename; + $url_rewrite = Db::getInstance()->getValue(' + SELECT url_rewrite + FROM `'._DB_PREFIX_.'meta` m + LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON (m.id_meta = ml.id_meta) + WHERE id_lang = '.(int)$id_lang.' AND `page` = \''.pSQL($pagename).'\''); + $uri_path = $this->getLangLink((int)$id_lang).($url_rewrite ? $url_rewrite : $filename); + } + else + $uri_path = $this->getLangLink((int)$id_lang); + } + else + { + $uri_path = ''; + + if ($filename != 'index.php') + $uri_path = 'index.php?controller='.str_replace('.php', '', $filename); + } + self::$cache['page'][$filename.'_'.$id_lang] = $uri_path; + } + return (($ssl AND Configuration::get('PS_SSL_ENABLED')) ? Tools::getShopDomainSsl(true) : Tools::getShopDomain(true)).__PS_BASE_URI__.ltrim($uri_path, '/').($request ? (($this->allow ? '?' : '&').trim($request)) : ''); + } + + public function getCatImageLink($name, $id_category, $type = null) + { + return ($this->allow == 1) ? (__PS_BASE_URI__.'c/'.$id_category.($type ? '-'.$type : '').'/'.$name.'.jpg') : (_THEME_CAT_DIR_.$id_category.($type ? '-'.$type : '').'.jpg'); + } + + /** + * Create link after language change, for the change language block + * + * @param integer $id_lang Language ID + * @return string link + */ + public function getLanguageLink($id_lang) + { + global $cookie; + $matches = array(); + $request = $_SERVER['REQUEST_URI']; + preg_match('#^/([a-z]{2})/([^\?]*).*$#', $request, $matches); + if ($matches) + { + $current_iso = $matches[1]; + $rewrite = $matches[2]; + $url_rewrite = Meta::getEquivalentUrlRewrite($id_lang, Language::getIdByIso($current_iso), $rewrite); + $request = str_replace($rewrite, $url_rewrite, $request); + } + + $queryTab = array(); + parse_str($_SERVER['QUERY_STRING'], $queryTab); + unset($queryTab['isolang']); + $query = http_build_query($queryTab); + + if (!empty($query) OR !$this->allow) + $query = '?'.$query; + + $switchLangLink = $this->getPageLink(substr($_SERVER['PHP_SELF'], strlen(__PS_BASE_URI__)), false, $id_lang).$query; + if (!$this->allow) + if ($id_lang != $cookie->id_lang) + { + if (strpos($switchLangLink,'id_lang')) + $switchLangLink = preg_replace('`id_lang=[0-9]*`','id_lang='.$id_lang,$switchLangLink); + else + $switchLangLink = $switchLangLink.'&id_lang='.$id_lang; + } + return $switchLangLink; + } + + /** + * @deprecated + */ + public function getLanguageLinkAdmin($id_lang) + { + Tools::displayAsDeprecated(); + return $this->getUrlWith('id_lang', (int)($id_lang)); + } + + /** + * This function return the current url with a new parameter key=value + * @param mixed $key + * @param mixed $val + * @return url with &key=val (or ?key=val) + * @deprectated + */ + public function getUrlWith($key, $val) + { + // This function does not use rewrite + Tools::displayAsDeprecated(); + $n = 0; + $url = str_replace('index.php', '', htmlentities($this->url, ENT_QUOTES, 'UTF-8')); + + foreach ($_GET as $k => $value) + // adminlang is an hand-written param in BO + if ($k != 'adminlang') + if (!is_array($value) AND $k != $key AND Tools::isSubmit($k)) + $url .= ((!$n++) ? '?' : '&').urlencode($k).($value ? '='.urlencode($value) : ''); + + return $url.($n ? '&' : '?').urlencode($key).'='.urlencode($val); + } + + public function goPage($url, $p) + { + return $url.($p == 1 ? '' : (!strstr($url, '?') ? '?' : '&').'p='.(int)($p)); + } + + public function getPaginationLink($type, $id_object, $nb = false, $sort = false, $pagination = false, $array = false) + { + if ($type AND $id_object) + $url = $this->{'get'.$type.'Link'}($id_object, NULL); + else + { + $url = $this->url; + if (Configuration::get('PS_REWRITING_SETTINGS')) + $url = $this->getPageLink(basename($url)); + } + $vars = (!$array ? '' : array()); + $varsNb = array('n', 'search_query'); + $varsSort = array('orderby', 'orderway'); + $varsPagination = array('p'); + + $n = 0; + foreach ($_GET AS $k => $value) + if ($k != 'id_'.$type) + { + if (Configuration::get('PS_REWRITING_SETTINGS') AND ($k == 'isolang' OR $k == 'id_lang')) + continue; + $ifNb = (!$nb OR ($nb AND !in_array($k, $varsNb))); + $ifSort = (!$sort OR ($sort AND !in_array($k, $varsSort))); + $ifPagination = (!$pagination OR ($pagination AND !in_array($k, $varsPagination))); + if ($ifNb AND $ifSort AND $ifPagination AND !is_array($value)) + !$array ? ($vars .= ((!$n++ AND ($this->allow == 1 OR $url == $this->url)) ? '?' : '&').urlencode($k).'='.urlencode($value)) : ($vars[urlencode($k)] = urlencode($value)); + } + if (!$array) + return $url.$vars; + $vars['requestUrl'] = $url; + if ($type AND $id_object) + $vars['id_'.$type] = (is_object($id_object) ? (int)$id_object->id : (int)$id_object); + return $vars; + } + + public function addSortDetails($url, $orderby, $orderway) + { + return $url.(!strstr($url, '?') ? '?' : '&').'orderby='.urlencode($orderby).'&orderway='.urlencode($orderway); + } + + protected function getLangLink($id_lang = NULL) + { + if (!$this->allow OR Language::countActiveLanguages() <= 1) + return ''; + + global $cookie; + if (!$id_lang) + $id_lang = (int)$cookie->id_lang; + + return Language::getIsoById((int)$id_lang).'/'; + } +} diff --git a/classes/LocalizationPack.php b/classes/LocalizationPack.php new file mode 100644 index 000000000..8ab1b7292 --- /dev/null +++ b/classes/LocalizationPack.php @@ -0,0 +1,490 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(_PS_TOOL_DIR_.'tar/Archive_Tar.php'); + +class LocalizationPackCore +{ + public $name; + public $version; + + protected $iso_code_lang; + protected $iso_currency; + protected $_errors = array(); + + public function loadLocalisationPack($file, $selection, $install_mode = false) + { + if (!$xml = simplexml_load_string($file)) + return false; + $mainAttributes = $xml->attributes(); + $this->name = strval($mainAttributes['name']); + $this->version = strval($mainAttributes['version']); + if (empty($selection)) + { + $res = true; + $res &= $this->_installStates($xml); + $res &= $this->_installTaxes($xml); + $res &= $this->_installCurrencies($xml, $install_mode); + $res &= $this->_installUnits($xml); + $res &= $this->installConfiguration($xml); + $res &= $this->installModules($xml); + $res &= $this->updateDefaultGroupDisplayMethod($xml); + + if (!defined('_PS_MODE_DEV_') OR !_PS_MODE_DEV_) + $res &= $this->_installLanguages($xml, $install_mode); + + if ($res AND isset($this->iso_code_lang)) + Configuration::updateValue('PS_LANG_DEFAULT', (int)Language::getIdByIso($this->iso_code_lang)); + + if ($install_mode AND $res AND isset($this->iso_currency)) + { + $res &= Configuration::updateValue('PS_CURRENCY_DEFAULT', (int)Currency::getIdByIsoCode($this->iso_currency)); + Currency::refreshCurrencies(); + } + + return $res; + } + foreach ($selection AS $selected) + if (!Validate::isLocalizationPackSelection($selected) OR !$this->{'_install'.ucfirst($selected)}($xml)) + return false; + + return true; + } + + protected function _installStates($xml) + { + if (isset($xml->states->state)) + foreach ($xml->states->state AS $data) + { + $attributes = $data->attributes(); + + if (!$id_state = State::getIdByName($attributes['name'])) + { + $state = new State(); + $state->name = strval($attributes['name']); + $state->iso_code = strval($attributes['iso_code']); + $state->id_country = Country::getByIso(strval($attributes['country'])); + $state->id_zone = (int)(Zone::getIdByName(strval($attributes['zone']))); + + if (!$state->validateFields()) + { + $this->_errors[] = Tools::displayError('Invalid state properties.'); + return false; + } + + $country = new Country($state->id_country); + if (!$country->contains_states) + { + $country->contains_states = 1; + if (!$country->update()) + $this->_errors[] = Tools::displayError('Cannot update the associated country: ').$country->name; + } + + if (!$state->add()) + { + $this->_errors[] = Tools::displayError('An error occurred while adding the state.'); + return false; + } + } else { + $state = new State($id_state); + if (!Validate::isLoadedObject($state)) + { + $this->_errors[] = Tools::displayError('An error occurred while fetching the state.'); + return false; + } + } + + // Add counties + foreach ($data->county AS $xml_county) + { + $county_attributes = $xml_county->attributes(); + if (!$id_county = County::getIdCountyByNameAndIdState($county_attributes['name'], $state->id)) + { + $county = new County(); + $county->name = $county_attributes['name']; + $county->id_state = (int)$state->id; + $county->active = 1; + + if (!$county->validateFields()) + { + $this->_errors[] = Tools::displayError('Invalid County properties'); + return false; + } + + if (!$county->save()) + { + $this->_errors[] = Tools::displayError('An error has occurred while adding the county'); + return false; + } + } else { + $county = new County((int)$id_county); + if (!Validate::isLoadedObject($county)) + { + $this->_errors[] = Tools::displayError('An error occurred while fetching the county.'); + return false; + } + } + + // add zip codes + foreach ($xml_county->zipcode AS $xml_zipcode) + { + $zipcode_attributes = $xml_zipcode->attributes(); + + $zipcodes = $zipcode_attributes['from']; + if (isset($zipcode_attributes['to'])) + $zipcodes .= '-'.$zipcode_attributes['to']; + + if ($county->isZipCodeRangePresent($zipcodes)) + continue; + + if (!$county->addZipCodes($zipcodes)) + { + $this->_errors[] = Tools::displayError('An error has occurred while adding zipcodes'); + return false; + } + } + } + } + + + return true; + } + + protected function _installTaxes($xml) + { + if (isset($xml->taxes->tax)) + { + $available_behavior = array(PS_PRODUCT_TAX, PS_STATE_TAX, PS_BOTH_TAX); + $assoc_taxes = array(); + foreach ($xml->taxes->tax AS $taxData) + { + $attributes = $taxData->attributes(); + if (Tax::getTaxIdByName($attributes['name'])) + continue; + $tax = new Tax(); + $tax->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = strval($attributes['name']); + $tax->rate = (float)($attributes['rate']); + $tax->active = 1; + + if (!$tax->validateFields()) + { + $this->_errors[] = Tools::displayError('Invalid tax properties.'); + return false; + } + + if (!$tax->add()) + { + $this->_errors[] = Tools::displayError('An error occurred while importing the tax: ').strval($attributes['name']); + return false; + } + + $assoc_taxes[(int)$attributes['id']] = $tax->id; + } + + foreach ($xml->taxes->taxRulesGroup AS $group) + { + $group_attributes = $group->attributes(); + if (!Validate::isGenericName($group_attributes['name'])) + continue; + + if (TaxRulesGroup::getIdByName($group['name'])) + continue; + + $trg = new TaxRulesGroup(); + $trg->name = $group['name']; + $trg->active = 1; + + if (!$trg->save()) + { + $this->_errors = Tools::displayError('This tax rule can\'t be saved.'); + return false; + } + + foreach($group->taxRule as $rule) + { + $rule_attributes = $rule->attributes(); + + // Validation + if (!isset($rule_attributes['iso_code_country'])) + continue; + + $id_country = Country::getByIso(strtoupper($rule_attributes['iso_code_country'])); + if (!$id_country) + continue; + + if (!isset($rule_attributes['id_tax']) || !array_key_exists(strval($rule_attributes['id_tax']), $assoc_taxes)) + continue; + + // Default values + $id_state = (int) isset($rule_attributes['iso_code_state']) ? State::getIdByIso(strtoupper($rule_attributes['iso_code_state'])) : 0; + $id_county = 0; + $state_behavior = 0; + $county_behavior = 0; + + if ($id_state) + { + if (isset($rule_attributes['state_behavior']) && in_array($rule_attributes['state_behavior'], $available_behavior)) + $state_behavior = (int)$rule_attributes['state_behavior']; + + if (isset($rule_attributes['county_name'])) + { + $id_county = County::getIdCountyByNameAndIdState($rule_attributes['county_name'], (int)$id_state); + if (!$id_county) + continue; + } + + if (isset($rule_attributes['county_behavior']) && in_array($rule_attributes['state_behavior'], $available_behavior)) + $county_behavior = (int)$rule_attributes['county_behavior']; + } + + + // Creation + $tr = new TaxRule(); + $tr->id_tax_rules_group = $trg->id; + $tr->id_country = $id_country; + $tr->id_state = $id_state; + $tr->id_county = $id_county; + $tr->state_behavior = $state_behavior; + $tr->county_behavior = $county_behavior; + $tr->id_tax = $assoc_taxes[strval($rule_attributes['id_tax'])]; + $tr->save(); + } + } + } + + return true; + } + + protected function _installCurrencies($xml, $install_mode = false) + { + if (isset($xml->currencies->currency)) + { + if (!$feed = @simplexml_load_file('http://www.prestashop.com/xml/currencies.xml') AND !$feed = @simplexml_load_file(dirname(__FILE__).'/../localization/currencies.xml')) + { + $this->_errors[] = Tools::displayError('Cannot parse the currencies XML feed.'); + return false; + } + + foreach ($xml->currencies->currency AS $data) + { + $attributes = $data->attributes(); + if(Currency::exists($attributes['iso_code'])) + continue; + $currency = new Currency(); + $currency->name = strval($attributes['name']); + $currency->iso_code = strval($attributes['iso_code']); + $currency->iso_code_num = (int)($attributes['iso_code_num']); + $currency->sign = strval($attributes['sign']); + $currency->blank = (int)($attributes['blank']); + $currency->conversion_rate = 1; // This value will be updated if the store is online + $currency->format = (int)($attributes['format']); + $currency->decimals = (int)($attributes['decimals']); + $currency->active = $install_mode; + if (!$currency->validateFields()) + { + $this->_errors[] = Tools::displayError('Invalid currency properties.'); + return false; + } + if (!Currency::exists($currency->iso_code)) + { + if (!$currency->add()) + { + $this->_errors[] = Tools::displayError('An error occurred while importing the currency: ').strval($attributes['name']); + return false; + } + } + } + + Currency::refreshCurrencies(); + + if (!sizeof($this->_errors) AND $install_mode AND isset($attributes['iso_code']) AND sizeof($xml->currencies->currency) == 1) + $this->iso_currency = $attributes['iso_code']; + } + + return true; + } + + protected function _installLanguages($xml, $install_mode = false) + { + $attributes = array(); + if (isset($xml->languages->language)) + foreach ($xml->languages->language AS $data) + { + $attributes = $data->attributes(); + if (Language::getIdByIso($attributes['iso_code'])) + continue; + $native_lang = Language::getLanguages(); + $native_iso_code = array(); + foreach ($native_lang AS $lang) + $native_iso_code[] = $lang['iso_code']; + if ((in_array((string)$attributes['iso_code'], $native_iso_code) AND !$install_mode) OR !in_array((string)$attributes['iso_code'], $native_iso_code)) + if(@fsockopen('www.prestashop.com', 80, $errno = 0, $errstr = '', 10)) + { + if ($lang_pack = Tools::jsonDecode(Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_language_pack.php?version='._PS_VERSION_.'&iso_lang='.$attributes['iso_code']))) + { + if ($content = file_get_contents('http://www.prestashop.com/download/lang_packs/gzip/'.$lang_pack->version.'/'.$attributes['iso_code'].'.gzip')) + { + $file = _PS_TRANSLATIONS_DIR_.$attributes['iso_code'].'.gzip'; + if (file_put_contents($file, $content)) + { + $gz = new Archive_Tar($file, true); + + if (!$gz->extract(_PS_TRANSLATIONS_DIR_.'../', false)) + { + $this->_errors[] = Tools::displayError('Cannot decompress the translation file of the language: ').(string)$attributes['iso_code']; + return false; + } + + if (!Language::checkAndAddLanguage((string)$attributes['iso_code'])) + { + $this->_errors[] = Tools::displayError('An error occurred while creating the language: ').(string)$attributes['iso_code']; + return false; + } + + @unlink($file); + } + else + $this->_errors[] = Tools::displayError('Server does not have permissions for writing.'); + } + } + else + $this->_errors[] = Tools::displayError('Error occurred when language was checked according to your Prestashop version.'); + } + else + $this->_errors[] = Tools::displayError('Archive cannot be downloaded from prestashop.com.'); + } + + // change the default language if there is only one language in the localization pack + if (!sizeof($this->_errors) AND $install_mode AND isset($attributes['iso_code']) AND sizeof($xml->languages->language) == 1) + $this->iso_code_lang = $attributes['iso_code']; + + return true; + } + + protected function _installUnits($xml) + { + $varNames = array('weight' => 'PS_WEIGHT_UNIT', 'volume' => 'PS_VOLUME_UNIT', 'short_distance' => 'PS_DIMENSION_UNIT', 'base_distance' => 'PS_BASE_DISTANCE_UNIT', 'long_distance' => 'PS_DISTANCE_UNIT'); + if (isset($xml->units->unit)) + foreach ($xml->units->unit AS $data) + { + $attributes = $data->attributes(); + if (!isset($varNames[strval($attributes['type'])])) + { + $this->_errors[] = Tools::displayError('Pack corrupted: wrong unit type.'); + return false; + } + if (!Configuration::updateValue($varNames[strval($attributes['type'])], strval($attributes['value']))) + { + $this->_errors[] = Tools::displayError('An error occurred while setting the units.'); + return false; + } + } + return true; + } + + /** + * Install/Uninstall a module from a localization file + * + * + */ + protected function installModules($xml) + { + if (isset($xml->modules)) + foreach($xml->modules->module as $data) + { + $attributes = $data->attributes(); + $name = (string)$attributes['name']; + if (isset($name) && $module = Module::getInstanceByName($name)) + { + $install = ($attributes['install'] == 1) ? true : false; + + if ($install) + { + if (!Module::isInstalled($name)) + if (!$module->install()) + $this->_errors[] = Tools::displayError('An error has occured during the module installation: '). $name; + } + else + if (Module::isInstalled($name)) + if (!$module->uninstall()) + $this->_errors[] = Tools::displayError('An error has occured during the module uninstall: '). $name; + + unset($module); + } + else + $this->_errors[] = Tools::displayError('An error has occured, this module doesnt exists: '). $name; + } + + return true; + } + + /** + * Update a configuration variable from a localization file + * + * + */ + protected function installConfiguration($xml) + { + if (isset($xml->configurations)) + foreach($xml->configurations->configuration as $data) + { + $attributes = $data->attributes(); + $name = (string)$attributes['name']; + + if (isset($name) && isset($attributes['value']) && Configuration::get($name) !== false) + if (!Configuration::updateValue($name, (string)$attributes['value'])) + $this->_errors[] = Tools::displayError('An error has occured during the configuration setup: '. $name); + } + + return true; + } + + protected function updateDefaultGroupDisplayMethod($xml) + { + if (isset($xml->group_default)) + { + $attributes = $xml->group_default->attributes(); + if (isset($attributes['price_display_method']) && in_array((int)$attributes['price_display_method'], array(0, 1))) + { + $group = new Group((int)_PS_DEFAULT_CUSTOMER_GROUP_); + $group->price_display_method = (int)$attributes['price_display_method']; + if (!$group->save()) + $this->_errors[] = Tools::displayError('An error has occured during the default group update'); + } + else + $this->_errors[] = Tools::displayError('An error has occured during the default group update'); + } + + return true; + } + + public function getErrors() + { + return $this->_errors; + } +} + diff --git a/classes/Logger.php b/classes/Logger.php new file mode 100644 index 000000000..b8c4e2f98 --- /dev/null +++ b/classes/Logger.php @@ -0,0 +1,161 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class LoggerCore extends ObjectModel +{ + /** @var integer Log id */ + public $id_log; + + /** @var integer Log severity */ + public $severity; + + /** @var integer Error code */ + public $error_code; + + /** @var string Message */ + public $message; + + /** @var string Object type (eg. Order, Customer...) */ + public $object_type; + + /** @var integer Object ID */ + public $object_id; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $fieldsRequired = array('severity', 'message'); + protected $fieldsSize = array(); + protected $fieldsValidate = array('id_log' => 'isUnsignedId', 'severity' => 'isInt', 'error_code' => 'isUnsignedInt', + 'message' => 'isMessage', 'object_id' => 'isUnsignedInt', 'object_type' => 'isName'); + + protected $table = 'log'; + protected $identifier = 'id_log'; + + protected static $_is_present = array(); + + + public function getFields() + { + parent::validateFields(); + + $fields['severity'] = intval($this->severity); + $fields['error_code'] = intval($this->error_code); + $fields['message'] = pSQL($this->message); + $fields['object_type'] = pSQL($this->object_type); + $fields['object_id'] = intval($this->object_id); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + + return $fields; + } + + static public function sendByMail($log) + { + /* Send e-mail to the shop owner only if the minimal severity level has been reached */ + if (intval(Configuration::get('PS_LOGS_BY_EMAIL')) <= intval($log->severity)) + Mail::Send((int)Configuration::get('PS_LANG_DEFAULT'), 'log_alert', Mail::l('Log: You have a new alert from your shop'), array(), Configuration::get('PS_SHOP_EMAIL')); + } + + /** + * add a log item to the database and send a mail if configured for this $severity + * + * @param string $message the log message + * @param int $severity + * @param int $errorCode + * @param string $objectType + * @param int $objectId + * @param boolean $allowDuplicate if set to true, can log several time the same information (not recommended) + * @return boolean true if succeed + */ + static public function addLog($message, $severity = 1, $errorCode = NULL, $objectType = NULL, $objectId = NULL, $allowDuplicate = false) + { + $log = new Logger(); + $log->severity = intval($severity); + $log->error_code = intval($errorCode); + $log->message = pSQL($message); + $log->date_add = date('Y-m-d H:i:s'); + $log->date_upd = date('Y-m-d H:i:s'); + if (!empty($objectType) AND !empty($objectId)) + { + $log->object_type = pSQL($objectType); + $log->object_id = intval($objectId); + } + + self::sendByMail($log); + + if ($allowDuplicate or !$log->_isPresent() ) + { + $res = $log->add(); + if ($res) + { + self::$_is_present[$log->getHash()] = isset(self::$_is_present[$log->getHash()])?self::$_is_present[$log->getHash()] + 1:1; + return true; + } + } + return false; + } + + /** + * this function md5($this->message.$this->severity.$this->error_code.$this->object_type.$this->object_id) + * + * @return string hash + */ + public function getHash(){ + if (empty($this->hash)) + $this->hash = md5($this->message.$this->severity.$this->error_code.$this->object_type.$this->object_id); + + return $this->hash; + } + + /** + * check if this log message already exists in database. + * + * @param mixed $message + * @return true if exists + */ + private function _isPresent() + { + if (!isset(self::$_is_present[md5($this->message)])) + self::$_is_present[$this->getHash()] = Db::getInstance()->getValue('SELECT COUNT(*) + FROM `'._DB_PREFIX_.'log` + WHERE + `message` = \''.$this->message.'\' + AND `severity` = \''.$this->severity.'\' + AND `error_code` = \''.$this->error_code.'\' + AND `object_type` = \''.$this->object_type.'\' + AND `object_id` = \''.$this->object_id.'\' + '); + + return self::$_is_present[$this->getHash()]; + } + +} + diff --git a/classes/MCached.php b/classes/MCached.php new file mode 100755 index 000000000..be3436ce0 --- /dev/null +++ b/classes/MCached.php @@ -0,0 +1,171 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class MCachedCore extends Cache +{ + protected $_memcacheObj; + protected $_isConnected = false; + + protected function __construct() + { + parent::__construct(); + $this->connect(); + } + + public function connect() + { + $this->_memcacheObj = new Memcache(); + $servers = self::getMemcachedServers(); + if (!$servers) + return false; + foreach ($servers AS $server) + $this->_memcacheObj->addServer($server['ip'], $server['port'], $server['weight']); + + $this->_isConnected = true; + return $this->_setKeys(); + } + + public function set($key, $value, $expire = 0) + { + if (!$this->_isConnected) + return false; + if ($this->_memcacheObj->set($key, $value, 0, $expire)) + { + $this->_keysCached[$key] = true; + return $key; + } + } + + public function setNumRows($key, $value, $expire = 0) + { + return $this->set($key.'_nrows', $value, $expire); + } + + public function getNumRows($key) + { + return $this->get($key.'_nrows'); + } + + public function get($key) + { + if (!isset($this->_keysCached[$key])) + return false; + return $this->_memcacheObj->get($key); + } + + protected function _setKeys() + { + if (!$this->_isConnected) + return false; + $this->_keysCached = $this->_memcacheObj->get('keysCached'); + $this->_tablesCached = $this->_memcacheObj->get('tablesCached'); + + return true; + } + + public function setQuery($query, $result) + { + if (!$this->_isConnected) + return false; + if ($this->isBlacklist($query)) + return true; + $md5_query = md5($query); + if (isset($this->_keysCached[$md5_query])) + return true; + $key = $this->set($md5_query, $result); + if(preg_match_all('/('._DB_PREFIX_.'[a-z_-]*)`?.*/i', $query, $res)) + foreach($res[1] AS $table) + if(!isset($this->_tablesCached[$table][$key])) + $this->_tablesCached[$table][$key] = true; + } + + public function delete($key, $timeout = 0) + { + if (!$this->_isConnected) + return false; + if (!empty($key) AND $this->_memcacheObj->delete($key, $timeout)) + unset($this->_keysCached[$key]); + } + + public function deleteQuery($query) + { + if (!$this->_isConnected) + return false; + if (preg_match_all('/('._DB_PREFIX_.'[a-z_-]*)`?.*/i', $query, $res)) + foreach ($res[1] AS $table) + if (isset($this->_tablesCached[$table])) + { + foreach ($this->_tablesCached[$table] AS $memcachedKey => $foo) + { + $this->delete($memcachedKey); + $this->delete($memcachedKey.'_nrows'); + } + unset($this->_tablesCached[$table]); + } + } + + protected function close() + { + if (!$this->_isConnected) + return false; + return $this->_memcacheObj->close(); + } + + public function flush() + { + if(!$this->_isConnected) + return false; + if ($this->_memcacheObj->flush()) + return $this->_setKeys(); + return false; + } + + public function __destruct() + { + parent::__destruct(); + if (!$this->_isConnected) + return false; + $this->_memcacheObj->set('keysCached', $this->_keysCached, 0, 0); + $this->_memcacheObj->set('tablesCached', $this->_tablesCached, 0, 0); + $this->close(); + } + + public static function addServer($ip, $port, $weight) + { + return Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'memcached_servers (id_memcached_server, ip, port, weight) VALUES(\'\', \''.pSQL($ip).'\', '.(int)$port.', '.(int)$weight.')', false); + } + + public static function getMemcachedServers() + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM '._DB_PREFIX_.'memcached_servers', true, false); + } + + public static function deleteServer($id_server) + { + return Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'memcached_servers WHERE id_memcached_server='.(int)$id_server); + } +} diff --git a/classes/Mail.php b/classes/Mail.php new file mode 100644 index 000000000..5379e4226 --- /dev/null +++ b/classes/Mail.php @@ -0,0 +1,228 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(_PS_SWIFT_DIR_.'Swift.php'); +include_once(_PS_SWIFT_DIR_.'Swift/Connection/SMTP.php'); +include_once(_PS_SWIFT_DIR_.'Swift/Connection/NativeMail.php'); +include_once(_PS_SWIFT_DIR_.'Swift/Plugin/Decorator.php'); + +class MailCore +{ + static public function Send($id_lang, $template, $subject, $templateVars, $to, $toName = NULL, $from = NULL, $fromName = NULL, $fileAttachment = NULL, $modeSMTP = NULL, $templatePath = _PS_MAIL_DIR_) + { + $configuration = Configuration::getMultiple(array('PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME', 'PS_MAIL_SMTP_ENCRYPTION', 'PS_MAIL_SMTP_PORT', 'PS_MAIL_METHOD', 'PS_MAIL_TYPE')); + if(!isset($configuration['PS_MAIL_SMTP_ENCRYPTION'])) $configuration['PS_MAIL_SMTP_ENCRYPTION'] = 'off'; + if(!isset($configuration['PS_MAIL_SMTP_PORT'])) $configuration['PS_MAIL_SMTP_PORT'] = 'default'; + + if (!isset($from)) $from = $configuration['PS_SHOP_EMAIL']; + if (!isset($fromName)) $fromName = $configuration['PS_SHOP_NAME']; + + if (!empty($from) AND !Validate::isEmail($from)) + die(Tools::displayError('Error: parameter "from" is corrupted')); + + if (!empty($fromName) AND !Validate::isMailName($fromName)) + die(Tools::displayError('Error: parameter "fromName" is corrupted')); + + if (!is_array($to) AND !Validate::isEmail($to)) + die(Tools::displayError('Error: parameter "to" is corrupted')); + + if (!is_array($templateVars)) + die(Tools::displayError('Error: parameter "templateVars" is not an array')); + + // Do not crash for this error, that may be a complicated customer name + if (!empty($toName) AND !Validate::isMailName($toName)) + $toName = NULL; + + if (!Validate::isTplName($template)) + die(Tools::displayError('Error: invalid email template')); + + if (!Validate::isMailSubject($subject)) + die(Tools::displayError('Error: invalid email subject')); + + /* Construct multiple recipients list if needed */ + if (is_array($to)) + { + $to_list = new Swift_RecipientList(); + foreach ($to AS $key => $addr) + { + $to_name = NULL; + $addr = trim($addr); + if (!Validate::isEmail($addr)) + die(Tools::displayError('Error: invalid email address')); + if ($toName AND is_array($toName) AND Validate::isGenericName($toName[$key])) + $to_name = $toName[$key]; + $to_list->addTo($addr, $to_name); + } + $to_plugin = $to[0]; + $to = $to_list; + } else { + /* Simple recipient, one address */ + $to_plugin = $to; + $to = new Swift_Address($to, $toName); + } + try { + /* Connect with the appropriate configuration */ + if ($configuration['PS_MAIL_METHOD'] == 2) + { + if (empty($configuration['PS_MAIL_SERVER']) OR empty($configuration['PS_MAIL_SMTP_PORT'])) + die(Tools::displayError('Error: invalid SMTP server or SMTP port')); + + $connection = new Swift_Connection_SMTP($configuration['PS_MAIL_SERVER'], $configuration['PS_MAIL_SMTP_PORT'], ($configuration['PS_MAIL_SMTP_ENCRYPTION'] == "ssl") ? Swift_Connection_SMTP::ENC_SSL : (($configuration['PS_MAIL_SMTP_ENCRYPTION'] == "tls") ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_OFF)); + $connection->setTimeout(4); + if (!$connection) + return false; + if (!empty($configuration['PS_MAIL_USER'])) + $connection->setUsername($configuration['PS_MAIL_USER']); + if (!empty($configuration['PS_MAIL_PASSWD'])) + $connection->setPassword($configuration['PS_MAIL_PASSWD']); + } + else + $connection = new Swift_Connection_NativeMail(); + + if (!$connection) + return false; + $swift = new Swift($connection, Configuration::get('PS_MAIL_DOMAIN')); + /* Get templates content */ + $iso = Language::getIsoById((int)($id_lang)); + if (!$iso) + die (Tools::displayError('Error - No ISO code for email')); + $template = $iso.'/'.$template; + + $moduleName = false; + $overrideMail = false; + + // get templatePath + if (preg_match('#'.__PS_BASE_URI__.'modules/#', $templatePath) AND preg_match('#modules/([a-z0-9_-]+)/#ui' , $templatePath , $res)) + $moduleName = $res[1]; + + if ($moduleName !== false AND (file_exists(_PS_THEME_DIR_.'modules/'.$moduleName.'/mails/'.$template.'.txt') OR + file_exists(_PS_THEME_DIR_.'modules/'.$moduleName.'/mails/'.$template.'.html'))) + $templatePath = _PS_THEME_DIR_.'modules/'.$moduleName.'/mails/'; + elseif (file_exists(_PS_THEME_DIR_.'mails/'.$template.'.txt') OR file_exists(_PS_THEME_DIR_.'mails/'.$template.'.html')) + { + $templatePath = _PS_THEME_DIR_.'mails/'; + $overrideMail = true; + } + elseif (!file_exists($templatePath.$template.'.txt') OR !file_exists($templatePath.$template.'.html')) + die(Tools::displayError('Error - The following email template is missing:').' '.$templatePath.$template.'.txt'); + + $templateHtml = file_get_contents($templatePath.$template.'.html'); + $templateTxt = strip_tags(html_entity_decode(file_get_contents($templatePath.$template.'.txt'), NULL, 'utf-8')); + + if ($overrideMail AND file_exists($templatePath.$iso.'/lang.php')) + include_once($templatePath.$iso.'/lang.php'); + elseif ($moduleName AND file_exists($templatePath.$iso.'/lang.php')) + include_once(_PS_THEME_DIR_.'mails/'.$iso.'/lang.php'); + else + include_once(dirname(__FILE__).'/../mails/'.$iso.'/lang.php'); + + /* Create mail and attach differents parts */ + $message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME').'] '. $subject); + $templateVars['{shop_logo}'] = (file_exists(_PS_IMG_DIR_.'logo_mail.jpg')) ? $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.'logo_mail.jpg'))) : ((file_exists(_PS_IMG_DIR_.'logo.jpg')) ? $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.'logo.jpg'))) : ''); + $templateVars['{shop_name}'] = Tools::safeOutput(Configuration::get('PS_SHOP_NAME')); + $templateVars['{shop_url}'] = Tools::getShopDomain(true, true).__PS_BASE_URI__; + $swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $templateVars)), 'decorator'); + if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 2) + $message->attach(new Swift_Message_Part($templateTxt, 'text/plain', '8bit', 'utf-8')); + if ($configuration['PS_MAIL_TYPE'] == 3 OR $configuration['PS_MAIL_TYPE'] == 1) + $message->attach(new Swift_Message_Part($templateHtml, 'text/html', '8bit', 'utf-8')); + if ($fileAttachment AND isset($fileAttachment['content']) AND isset($fileAttachment['name']) AND isset($fileAttachment['mime'])) + $message->attach(new Swift_Message_Attachment($fileAttachment['content'], $fileAttachment['name'], $fileAttachment['mime'])); + /* Send mail */ + $send = $swift->send($message, $to, new Swift_Address($from, $fromName)); + $swift->disconnect(); + return $send; + } + + catch (Swift_ConnectionException $e) { return false; } + } + + static public function sendMailTest($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort = 25, $smtpEncryption) + { + $swift = NULL; + $result = NULL; + try + { + if($smtpChecked) + { + + $smtp = new Swift_Connection_SMTP($smtpServer, $smtpPort, ($smtpEncryption == "off") ? Swift_Connection_SMTP::ENC_OFF : (($smtpEncryption == "tls") ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_SSL)); + $smtp->setUsername($smtpLogin); + $smtp->setpassword($smtpPassword); + $smtp->setTimeout(5); + $swift = new Swift($smtp, Configuration::get('PS_MAIL_DOMAIN')); + } + else + $swift = new Swift(new Swift_Connection_NativeMail(), Configuration::get('PS_MAIL_DOMAIN')); + + $message = new Swift_Message($subject, $content, $type); + + if ($swift->send($message, $to, $from)) + $result = true; + else + $result = 999; + + $swift->disconnect(); + } + catch (Swift_Connection_Exception $e) { $result = $e->getCode(); } + catch (Swift_Message_MimeException $e) { $result = $e->getCode(); } + + return $result; + } + + /** + * This method is used to get the translation for email Object. + * For an object is forbidden to use htmlentities, + * we have to return a sentence with accents. + * + * @param string $string raw sentence (write directly in file) + */ + static public function l($string) + { + global $_LANGMAIL, $cookie; + + $key = str_replace('\'', '\\\'', $string); + $id_lang = (!isset($cookie) OR !is_object($cookie)) ? (int)Configuration::get('PS_LANG_DEFAULT') : (int)$cookie->id_lang; + + $file_core = _PS_ROOT_DIR_.'/mails/'.Language::getIsoById((int)$id_lang).'/lang.php'; + if (Tools::file_exists_cache($file_core) && empty($_LANGMAIL)) + include_once($file_core); + + $file_theme = _PS_THEME_DIR_.'mails/'.Language::getIsoById((int)$id_lang).'/lang.php'; + if (Tools::file_exists_cache($file_theme)) + include_once($file_theme); + + if (!is_array($_LANGMAIL)) + return (str_replace('"', '"', $string)); + if (key_exists($key, $_LANGMAIL)) + $str = $_LANGMAIL[$key]; + else + $str = $string; + + return str_replace('"', '"', addslashes($str)); + } +} diff --git a/classes/Manufacturer.php b/classes/Manufacturer.php new file mode 100644 index 000000000..538b007e2 --- /dev/null +++ b/classes/Manufacturer.php @@ -0,0 +1,397 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ManufacturerCore extends ObjectModel +{ + public $id; + + /** @var integer manufacturer ID */ + public $id_manufacturer;//FIXME is it really usefull...? + + /** @var string Name */ + public $name; + + /** @var string A description */ + public $description; + + /** @var string A short description */ + public $short_description; + + /** @var int Address */ + public $id_address; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + /** @var string Friendly URL */ + public $link_rewrite; + + /** @var string Meta title */ + public $meta_title; + + /** @var string Meta keywords */ + public $meta_keywords; + + /** @var string Meta description */ + public $meta_description; + + /** @var boolean active */ + public $active; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('name' => 'isCatalogName'); + + protected $fieldsSizeLang = array('short_description' => 254, 'meta_title' => 128, 'meta_description' => 255, 'meta_description' => 255); + protected $fieldsValidateLang = array('description' => 'isString', 'short_description' => 'isString', 'meta_title' => 'isGenericName', 'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName'); + + protected $table = 'manufacturer'; + protected $identifier = 'id_manufacturer'; + + protected $webserviceParameters = array( + 'fields' => array( + 'link_rewrite' => array('getter' => 'getLink', 'setter' => false), + ), + 'associations' => array( + 'addresses' => array('resource' => 'address', 'setter' => false, 'fields' => array( + 'id' => array('xlink_resource' => 'addresses'), + )), + ), + ); + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id, $id_lang); + + /* Get the manufacturer's id_address */ + $this->id_address = $this->getManufacturerAddress(); + $this->link_rewrite = $this->getLink(); + $this->image_dir = _PS_MANU_IMG_DIR_; + } + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_manufacturer'] = (int)($this->id); + $fields['name'] = pSQL($this->name); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['active'] = (int)($this->active); + return $fields; + } + + public function getTranslationsFieldsChild() + { + $fieldsArray = array('description', 'short_description', 'meta_title', 'meta_keywords', 'meta_description'); + $fields = array(); + $languages = Language::getLanguages(false); + $defaultLanguage = Configuration::get('PS_LANG_DEFAULT'); + foreach ($languages as $language) + { + $fields[$language['id_lang']]['id_lang'] = $language['id_lang']; + $fields[$language['id_lang']][$this->identifier] = (int)($this->id); + $fields[$language['id_lang']]['description'] = (isset($this->description[$language['id_lang']])) ? pSQL($this->description[$language['id_lang']], true) : ''; + $fields[$language['id_lang']]['short_description'] = (isset($this->short_description[$language['id_lang']])) ? pSQL($this->short_description[$language['id_lang']], true) : ''; + + foreach ($fieldsArray as $field) + { + if (!Validate::isTableOrIdentifier($field)) + die(Tools::displayError()); + + /* Check fields validity */ + if (isset($this->{$field}[$language['id_lang']]) AND !empty($this->{$field}[$language['id_lang']])) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$language['id_lang']], true); + elseif (in_array($field, $this->fieldsRequiredLang)) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$defaultLanguage]); + else + $fields[$language['id_lang']][$field] = ''; + + } + } + return $fields; + } + + public function delete() + { + $address = new Address($this->id_address); + if (!$address->delete()) + return false; + if (parent::delete()) + return $this->deleteImage(); + } + + /** + * Delete several objects from database + * + * return boolean Deletion result + */ + public function deleteSelection($selection) + { + if (!is_array($selection) OR !Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $result = true; + foreach ($selection AS $id) + { + $this->id = (int)($id); + $this->id_address = self::getManufacturerAddress(); + $result = $result AND $this->delete(); + } + return $result; + } + + protected function getManufacturerAddress() + { + if (!(int)($this->id)) + return false; + $result = Db::GetInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_address` FROM '._DB_PREFIX_.'address WHERE `id_manufacturer` = '.(int)($this->id)); + if (!$result) + return false; + return $result['id_address']; + } + + /** + * Return manufacturers + * + * @param boolean $getNbProducts [optional] return products numbers for each + * @return array Manufacturers + */ + static public function getManufacturers($getNbProducts = false, $id_lang = 0, $active = true, $p = false, $n = false, $all_group = false, $id_group_shop = false) + { + if (!$id_lang) + $id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); + if (!$id_group_shop) + $id_group_shop = Configuration::get('PS_GROUP_SHOP_DEFAULT'); + $sql = 'SELECT m.*, ml.`description`'; + $sql.= 'FROM `'._DB_PREFIX_.'manufacturer_group_shop` mgs + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.id_manufacturer = mgs.id_manufacturer) + LEFT JOIN `'._DB_PREFIX_.'manufacturer_lang` ml ON (m.`id_manufacturer` = ml.`id_manufacturer` AND ml.`id_lang` = '.(int)($id_lang).') + WHERE mgs.id_group_shop='.(int)$id_group_shop.($active ? ' AND m.`active` = 1' : ''); + $sql.= ' ORDER BY m.`name` ASC'.($p ? ' LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n) : ''); + $manufacturers = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if ($manufacturers === false) + return false; + if ($getNbProducts) + { + $sqlGroups = ''; + if (!$all_group) + { + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + } + foreach ($manufacturers as $key => $manufacturer) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT p.`id_product` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'manufacturer` as m ON (m.`id_manufacturer`= p.`id_manufacturer`) + WHERE m.`id_manufacturer` = '.(int)($manufacturer['id_manufacturer']). + ($active ? ' AND p.`active` = 1 ' : ''). + ($all_group ? '' : ' AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.')')); + + $manufacturers[$key]['nb_products'] = sizeof($result); + } + } + for ($i = 0; $i < sizeof($manufacturers); $i++) + if ((int)(Configuration::get('PS_REWRITING_SETTINGS'))) + $manufacturers[$i]['link_rewrite'] = Tools::link_rewrite($manufacturers[$i]['name'], false); + else + $manufacturers[$i]['link_rewrite'] = 0; + return $manufacturers; + } + + /** + * @deprecated + */ + static public function getManufacturersWithoutAddress() + { + Tools::displayAsDeprecated(); + $sql = 'SELECT m.* FROM `'._DB_PREFIX_.'manufacturer` m + LEFT JOIN `'._DB_PREFIX_.'address` a ON (a.`id_manufacturer` = m.`id_manufacturer` AND a.`deleted` = 0) + WHERE a.`id_manufacturer` IS NULL'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + /** + * Return name from id + * + * @param integer $id_manufacturer Manufacturer ID + * @return string name + */ + static protected $cacheName = array(); + static public function getNameById($id_manufacturer) + { + if (!isset(self::$cacheName[$id_manufacturer])) + self::$cacheName[$id_manufacturer] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `name` FROM `'._DB_PREFIX_.'manufacturer` WHERE `id_manufacturer` = '.(int)($id_manufacturer).' AND `active` = 1'); + return self::$cacheName[$id_manufacturer]; + } + + static public function getIdByName($name) + { + $result = Db::getInstance()->getRow(' + SELECT `id_manufacturer` + FROM `'._DB_PREFIX_.'manufacturer` + WHERE `name` = \''.pSQL($name).'\''); + if (isset($result['id_manufacturer'])) + return (int)($result['id_manufacturer']); + return false; + } + + public function getLink() + { + return Tools::link_rewrite($this->name, false); + } + + static public function getProducts($id_manufacturer, $id_lang, $p, $n, $orderBy = NULL, $orderWay = NULL, $getTotal = false, $active = true) + { + if ($p < 1) $p = 1; + if (empty($orderBy) ||$orderBy == 'position') $orderBy = 'name'; + if (empty($orderWay)) $orderWay = 'ASC'; + + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + die (Tools::displayError()); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + /* Return only the number of products */ + if ($getTotal) + { + $sql = ' + SELECT p.`id_product` + FROM `'._DB_PREFIX_.'product` p + WHERE p.id_manufacturer = '.(int)($id_manufacturer) + .($active ? ' AND p.`active` = 1' : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + )'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + return (int)(sizeof($result)); + } + $sql = ' + SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, + (p.`price` * ((100 + (t.`rate`))/100)) AS orderprice + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` + WHERE p.`id_manufacturer` = '.(int)($id_manufacturer).($active ? ' AND p.`active` = 1' : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY '.(($orderBy == 'id_product') ? 'p.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' + LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if (!$result) + return false; + if ($orderBy == 'price') + Tools::orderbyPrice($result, $orderWay); + return Product::getProductsProperties($id_lang, $result); + } + + public function getProductsLite($id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT p.`id_product`, pl.`name` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + WHERE p.`id_manufacturer` = '.(int)($this->id)); + } + /* + * Specify if a manufacturer already in base + * + * @param $id_manufacturer Manufacturer id + * @return boolean + */ + static public function manufacturerExists($id_manufacturer) + { + $row = Db::getInstance()->getRow(' + SELECT `id_manufacturer` + FROM '._DB_PREFIX_.'manufacturer m + WHERE m.`id_manufacturer` = '.(int)($id_manufacturer)); + + return isset($row['id_manufacturer']); + } + + public function getAddresses($id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT a.*, cl.name AS `country`, s.name AS `state` + FROM `'._DB_PREFIX_.'address` AS a + LEFT JOIN `'._DB_PREFIX_.'country_lang` AS cl ON (cl.`id_country` = a.`id_country` AND cl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'state` AS s ON (s.`id_state` = a.`id_state`) + WHERE `id_manufacturer` = '.(int)($this->id).' + AND a.`deleted` = 0'); + } + + public function getWsAddresses() + { + return Db::getInstance()->ExecuteS(' + SELECT a.id_address as id + FROM `'._DB_PREFIX_.'address` AS a + WHERE `id_manufacturer` = '.(int)($this->id).' + AND a.`deleted` = 0'); + } + + public function setWsAddresses($id_addresses) + { + $ids = array(); + foreach ($id_addresses as $id) + $ids[] = (int)$id['id']; + Db::getInstance()->ExecuteS(' + UPDATE `'._DB_PREFIX_.'address` + SET id_manufacturer = 0 + WHERE id_manufacturer = '.(int)$this->id.' + AND deleted = 0'); + return (Db::getInstance()->ExecuteS(' + UPDATE `'._DB_PREFIX_.'address` + SET id_customer = 0, id_supplier = 0, id_manufacturer = '.(int)$this->id.' + WHERE id_address IN('.implode(',', $ids).') + AND deleted = 0') !== false); + } +} + diff --git a/classes/Message.php b/classes/Message.php new file mode 100644 index 000000000..3ec822e48 --- /dev/null +++ b/classes/Message.php @@ -0,0 +1,165 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class MessageCore extends ObjectModel +{ + public $id; + + /** @var string message content */ + public $message; + + /** @var integer Cart ID (if applicable) */ + public $id_cart; + + /** @var integer Order ID (if applicable) */ + public $id_order; + + /** @var integer Customer ID (if applicable) */ + public $id_customer; + + /** @var integer Employee ID (if applicable) */ + public $id_employee; + + /** @var boolean Message is not displayed to the customer */ + public $private; + + /** @var string Object creation date */ + public $date_add; + + protected $fieldsRequired = array('message'); + protected $fieldsSize = array('message' => 1600); + protected $fieldsValidate = array( + 'message' => 'isCleanHtml', 'id_cart' => 'isUnsignedId', 'id_order' => 'isUnsignedId', + 'id_customer' => 'isUnsignedId', 'id_employee' => 'isUnsignedId', 'private' => 'isBool'); + + protected $table = 'message'; + protected $identifier = 'id_message'; + + public function getFields() + { + parent::validateFields(); + + $fields['message'] = pSQL($this->message, true); + $fields['id_cart'] = (int)($this->id_cart); + $fields['id_order'] = (int)($this->id_order); + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_employee'] = (int)($this->id_employee); + $fields['private'] = (int)($this->private); + $fields['date_add'] = pSQL($this->date_add); + + return $fields; + } + + /** + * Return the last message from cart + * + * @param integer $id_cart Cart ID + * @return array Message + */ + static public function getMessageByCartId($id_cart) + { + $db = Db::getInstance(); + $result = $db->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'message` + WHERE `id_cart` = '.(int)($id_cart)); + + return $result; + } + + /** + * Return messages from Order ID + * + * @param integer $id_order Order ID + * @param boolean $private return WITH private messages + * @return array Messages + */ + static public function getMessagesByOrderId($id_order, $private = false) + { + if (!Validate::isBool($private)) + die(Tools::displayError()); + + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT m.*, c.`firstname` AS cfirstname, c.`lastname` AS clastname, e.`firstname` AS efirstname, e.`lastname` AS elastname, (COUNT(mr.id_message) = 0 AND m.id_customer != 0) AS is_new_for_me + FROM `'._DB_PREFIX_.'message` m + LEFT JOIN `'._DB_PREFIX_.'customer` c ON m.`id_customer` = c.`id_customer` + LEFT JOIN `'._DB_PREFIX_.'message_readed` mr ON (mr.id_message = m.id_message AND mr.id_employee = '.(int)$cookie->id_employee.') + LEFT OUTER JOIN `'._DB_PREFIX_.'employee` e ON e.`id_employee` = m.`id_employee` + WHERE id_order = '.(int)$id_order.' + '.(!$private ? ' AND m.`private` = 0' : '').' + GROUP BY m.id_message + ORDER BY m.date_add DESC'); + } + + /** + * Return messages from Cart ID + * + * @param integer $id_order Order ID + * @param boolean $private return WITH private messages + * @return array Messages + */ + static public function getMessagesByCartId($id_cart, $private = false) + { + if (!Validate::isBool($private)) + die(Tools::displayError()); + + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT m.*, c.`firstname` AS cfirstname, c.`lastname` AS clastname, e.`firstname` AS efirstname, e.`lastname` AS elastname, (COUNT(mr.id_message) = 0 AND m.id_customer != 0) AS is_new_for_me + FROM `'._DB_PREFIX_.'message` m + LEFT JOIN `'._DB_PREFIX_.'customer` c ON m.`id_customer` = c.`id_customer` + LEFT JOIN `'._DB_PREFIX_.'message_readed` mr ON (mr.id_message = m.id_message AND mr.id_employee = '.(int)$cookie->id_employee.') + LEFT OUTER JOIN `'._DB_PREFIX_.'employee` e ON e.`id_employee` = m.`id_employee` + WHERE id_cart = '.(int)$id_cart.' + '.(!$private ? ' AND m.`private` = 0' : '').' + GROUP BY m.id_message + ORDER BY m.date_add DESC'); + } + + /** + * Registered a message 'readed' + * + * @param integer $id_message Message ID + * @param integer $id_emplyee Employee ID + */ + static public function markAsReaded($id_message, $id_employee) + { + if (!Validate::isUnsignedId($id_message) OR !Validate::isUnsignedId($id_employee)) + die(Tools::displayError()); + + $result = Db::getInstance()->Execute(' + INSERT INTO '._DB_PREFIX_.'message_readed (id_message , id_employee , date_add) VALUES + ('.(int)($id_message).', '.(int)($id_employee).', NOW()); + '); + return $result; + } +} + + diff --git a/classes/Meta.php b/classes/Meta.php new file mode 100644 index 000000000..e23ef10e6 --- /dev/null +++ b/classes/Meta.php @@ -0,0 +1,189 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7445 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class MetaCore extends ObjectModel +{ + /** @var string Name */ + public $page; + public $title; + public $description; + public $keywords; + public $url_rewrite; + + protected $fieldsRequired = array('page'); + protected $fieldsSize = array('page' => 64); + protected $fieldsValidate = array('page' => 'isFileName'); + + protected $fieldsRequiredLang = array(); + protected $fieldsSizeLang = array('title' => 128, 'description' => 255, 'keywords' => 255, 'url_rewrite' => 255); + protected $fieldsValidateLang = array('title' => 'isGenericName', 'description' => 'isGenericName', 'keywords' => 'isGenericName', 'url_rewrite' => 'isLinkRewrite'); + + protected $langMultiShop = true; + protected $table = 'meta'; + protected $identifier = 'id_meta'; + + public function getFields() + { + parent::validateFields(); + return array('page' => pSQL($this->page)); + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('title', 'description', 'keywords', 'url_rewrite')); + } + + static public function getPages($excludeFilled = false, $addPage = false) + { + $selectedPages = array(); + if (!$files = scandir(_PS_ROOT_DIR_.'/controllers')) + die(Tools::displayError('Cannot scan root directory')); + + // Exclude pages forbidden + $exludePages = array('category', 'changecurrency', 'cms', 'footer', 'header', + 'pagination', 'product', 'product-sort', 'statistics'); + foreach ($files as $file) + if (preg_match('/^[a-z0-9_.-]*\.php$/i', $file) AND !in_array(strtolower(str_replace('Controller.php', '', $file)), $exludePages)) + $selectedPages[] = strtolower(str_replace('Controller.php', '', $file)); + // Exclude page already filled + if ($excludeFilled) + { + $metas = self::getMetas(); + foreach ($metas as $k => $meta) + if (in_array($meta['page'], $selectedPages)) + unset($selectedPages[array_search($meta['page'], $selectedPages)]); + } + // Add selected page + if ($addPage) + { + $selectedPages[] = $addPage; + sort($selectedPages); + } + return $selectedPages; + } + + static public function getMetas() + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'meta + ORDER BY page ASC'); + } + + static public function getMetasByIdLang($id_lang, $id_shop = false) + { + if (!$id_shop) + $id_shop = (int)Configuration::get('PS_SHOP_DEFAULT'); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'meta` m + LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON m.`id_meta` = ml.`id_meta` + WHERE ml.`id_lang` = '.(int)($id_lang). + ($id_shop ? ' AND ml.id_shop='.(int)$id_shop : '').' + ORDER BY page ASC'); + + } + + static public function getMetaByPage($page, $id_lang, $id_shop = false) + { + if (!$id_shop) + $id_shop = (int)Configuration::get('PS_SHOP_DEFAULT'); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT * + FROM '._DB_PREFIX_.'meta m + LEFT JOIN '._DB_PREFIX_.'meta_lang ml on (m.id_meta = ml.id_meta) + WHERE m.page = \''.pSQL($page).'\' AND ml.id_lang = '.(int)($id_lang)); + } + + public function update($nullValues = false) + { + if (!parent::update($nullValues)) + return false; + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + public function add($autodate = true, $nullValues = false) + { + if (!parent::add($autodate, $nullValues)); + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + public function delete() + { + if (!parent::delete()) + return false; + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + public function deleteSelection($selection) + { + if (!is_array($selection) OR !Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $result = true; + foreach ($selection AS $id) + { + $this->id = (int)($id); + $result = $result AND $this->delete(); + } + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + static public function getEquivalentUrlRewrite($new_id_lang, $id_lang, $url_rewrite) + { + return Db::getInstance()->getValue(' + SELECT url_rewrite + FROM `'._DB_PREFIX_.'meta_lang` + WHERE id_meta = ( + SELECT id_meta + FROM `'._DB_PREFIX_.'meta_lang` + WHERE url_rewrite = \''.pSQL($url_rewrite).'\' AND id_lang = '.(int)($id_lang).' + ) + AND id_lang = '.(int)($new_id_lang)); + } +} + diff --git a/classes/Module.php b/classes/Module.php new file mode 100644 index 000000000..38fdfc595 --- /dev/null +++ b/classes/Module.php @@ -0,0 +1,1168 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7436 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class ModuleCore +{ + /** @var integer Module ID */ + public $id = NULL; + + /** @var float Version */ + public $version; + + /** @var string Unique name */ + public $name; + + /** @var string Human name */ + public $displayName; + + /** @var string A little description of the module */ + public $description; + + /** @var string author of the module */ + public $author; + + /** @var int need_instance */ + public $need_instance = 1; + + /** @var string Admin tab correponding to the module */ + public $tab = NULL; + + /** @var boolean Status */ + public $active = false; + + /** @var array current language translations */ + protected $_lang = array(); + + /** @var string Module web path (eg. '/shop/modules/modulename/') */ + protected $_path = NULL; + + /** @var string Fill it if the module is installed but not yet set up */ + public $warning; + + /** @var string Message display before uninstall a module */ + public $beforeUninstall = NULL; + + public $_errors = false; + + protected $table = 'module'; + + protected $identifier = 'id_module'; + + static public $_db; + + /** @var array to store the limited country */ + public $limited_countries = array(); + + protected static $modulesCache; + protected static $_hookModulesCache; + + protected static $_INSTANCE = array(); + + protected static $_generateConfigXmlMode = false; + + protected static $l_cache = array(); + + /** + * @var array used by AdminTab to determine which lang file to use (admin.php or module lang file) + */ + public static $classInModule = array(); + + /** @var int */ + protected $shopID; + + /** @var int */ + protected $shopGroupID; + + /** + * Constructor + * + * @param string $name Module unique name + */ + public function __construct($name = NULL) + { + global $cookie; + + // Search the module shop context + list($shopID, $shopGroupID) = Shop::retrieveContext(); + $this->setShopID($shopID); + $this->setShopGroupID($shopGroupID); + + if ($this->name == NULL) + $this->name = $this->id; + if ($this->name != NULL) + { + if (self::$modulesCache == NULL AND !is_array(self::$modulesCache)) + { + $list = Shop::getListOfID($this->shopID, $this->shopGroupID); + + // Join clause is done to check if the module is activated in current shop context + $sql = 'SELECT m.id_module, m.name, ( + SELECT COUNT(*) FROM '._DB_PREFIX_.'module_shop ms WHERE m.id_module = ms.id_module AND ms.id_shop IN ('.implode(',', $list).') + ) as total + FROM '._DB_PREFIX_.'module m'; + self::$modulesCache = array(); + $result = Db::getInstance()->ExecuteS($sql); + foreach ($result as $row) + { + self::$modulesCache[$row['name']] = $row; + self::$modulesCache[$row['name']]['active'] = ($row['total'] == count($list)) ? true : false; + } + } + + if (isset(self::$modulesCache[$this->name])) + { + $this->active = self::$modulesCache[$this->name]['active']; + $this->id = self::$modulesCache[$this->name]['id_module']; + foreach (self::$modulesCache[$this->name] AS $key => $value) + if (key_exists($key, $this)) + $this->{$key} = $value; + $this->_path = __PS_BASE_URI__.'modules/'.$this->name.'/'; + } + } + } + + /** + * @param int $id Set shopID property + */ + public function setShopID($id) + { + $this->shopID = (int)$id; + } + + /** + * @param int $id Set shopGroupID property + */ + public function setShopGroupID($id) + { + $this->shopGroupID = (int)$id; + } + + protected function sqlShopRestriction($share = false, $alias = null) + { + return Shop::sqlRestriction($share, $alias, $this->shopID, $this->shopGroupID, 'shop'); + } + + /** + * Insert module into datable + */ + public function install() + { + if (!Validate::isModuleName($this->name)) + die(Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT `id_module` + FROM `'._DB_PREFIX_.'module` + WHERE `name` = \''.pSQL($this->name).'\''); + if ($result) + return false; + + $result = Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table, array('name' => $this->name, 'active' => 1), 'INSERT'); + if (!$result) + return false; + $this->id = Db::getInstance()->Insert_ID(); + + $this->enable(true); + $this->id = Db::getInstance()->Insert_ID(); + return true; + } + + /** + * Delete module from datable + * + * @return boolean result + */ + public function uninstall() + { + if (!Validate::isUnsignedId($this->id)) + return false; + $result = Db::getInstance()->ExecuteS(' + SELECT `id_hook` + FROM `'._DB_PREFIX_.'hook_module` hm + WHERE `id_module` = '.(int)($this->id)); + foreach ($result AS $row) + { + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.(int)($this->id).' + AND `id_hook` = '.(int)($row['id_hook'])); + $this->cleanPositions($row['id_hook']); + } + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'module` + WHERE `id_module` = '.(int)($this->id)); + } + + /** + * This function enable module $name. If an $name is an array, + * this will enable all of them + * + * @param array|string $name + * @return true if succeed + * @since 1.4.1 + */ + public static function enableByName($name) + { + if (!is_array($name)) + $name = array($name); + + foreach ($name as $k => $v) + Module::getInstanceByName()->enable(); + } + + /** + * Activate current module. + * + * @param bool $forceAll If true, enable module for all shop + */ + public function enable($forceAll = false) + { + $list = Shop::getListOfID($this->shopID, $this->shopGroupID); + $sql = 'SELECT id_shop + FROM '._DB_PREFIX_.'module_shop + WHERE id_module = '.$this->id.' + '.(($list) ? 'AND id_shop IN('.implode(', ', $list).')' : ''); + $items = array(); + if ($results = Db::getInstance($sql)->executeS($sql)) + foreach ($results as $row) + $items[] = $row['id_shop']; + + foreach ($list as $id) + if (!in_array($id, $items)) + Db::getInstance()->autoExecute(_DB_PREFIX_.'module_shop', array( + 'id_module' => $this->id, + 'id_shop' => $id, + ), 'INSERT'); + + return true; + } + + /** + * This function disable module $name. If an $name is an array, + * this will disable all of them + * + * @param array|string $name + * @return true if succeed + * @since 1.4.1 + */ + public static function disableByName($name) + { + if (!is_array($name)) + $name = array($name); + + foreach ($name as $k => $v) + Module::getInstanceByName()->disable(); + + return true; + } + + /** + * Desactivate current module. + * + * @param bool $forceAll If true, disable module for all shop + */ + public function disable($forceAll = false) + { + $list = Shop::getListOfID($this->shopID, $this->shopGroupID); + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'module_shop WHERE id_module = '.$this->id.' AND id_shop IN('.implode(', ', $list).')'); + } + + /** + * Display flags in forms for translations + * + * @param array $languages All languages available + * @param integer $defaultLanguage Default language id + * @param string $ids Multilingual div ids in form + * @param string $id Current div id] + * #param boolean $return define the return way : false for a display, true for a return + */ + public function displayFlags($languages, $defaultLanguage, $ids, $id, $return = false) + { + if (sizeof($languages) == 1) + return false; + $output = ' +
+ +
+
+ '.$this->l('Choose language:').'

'; + foreach ($languages as $language) + $output .= ''.$language['name'].' '; + $output .= '
'; + + if ($return) + return $output; + echo $output; + } + + /** + * Connect module to a hook + * + * @param string $hook_name Hook name + * @param array $shopList List of shop linked to the hook (if null, link hook to all shops) + * @return boolean result + */ + public function registerHook($hook_name, $shopList = null) + { + if (!Validate::isHookName($hook_name)) + die(Tools::displayError()); + if (!isset($this->id) OR !is_numeric($this->id)) + return false; + + // Get hook id + $sql = 'SELECT `id_hook` + FROM `'._DB_PREFIX_.'hook` + WHERE `name` = \''.pSQL($hook_name).'\''; + $hookID = Db::getInstance()->getValue($sql); + if (!$hookID) + return false; + + if (is_null($shopList)) + $shopList = Shop::getShops(true, null, true); + + $return = true; + foreach ($shopList as $shopID) + { + // Check if already register + $sql = 'SELECT hm.`id_module` + FROM `'._DB_PREFIX_.'hook_module` hm, `'._DB_PREFIX_.'hook` h + WHERE hm.`id_module` = '.(int)($this->id).' + AND h.id_hook = '.$hookID.' + AND h.`id_hook` = hm.`id_hook` + AND id_shop = '.$shopID; + if (Db::getInstance()->getRow($sql)) + continue; + + // Get module position in hook + $sql = 'SELECT MAX(`position`) AS position + FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_hook` = '.$hookID + .' AND id_shop = '.$shopID; + if (!$position = Db::getInstance()->getValue($sql)) + $position = 0; + + // Register module in hook + $result = Db::getInstance()->autoExecute(_DB_PREFIX_.'hook_module', array( + 'id_module' => $this->id, + 'id_hook' => $hookID, + 'id_shop' => $shopID, + 'position' => $position + 1, + ), 'INSERT'); + if (!$result) + $return &= false; + } + + $this->cleanPositions($hookID, $shopList); + return $return; + } + + /** + * Unregister module from hook + * + * @param int $id_hook Hook id + * @param array $shopList List of shop + * @return boolean result + */ + public function unregisterHook($hook_id, $shopList = null) + { + $sql = 'DELETE FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.(int)$this->id.' + AND `id_hook` = '.(int)$hook_id + .(($shopList) ? ' AND id_shop IN('.implode(', ', $shopList).')' : ''); + $result = Db::getInstance()->Execute($sql); + $this->cleanPositions($hook_id, $shopList); + return $result; + } + + /** + * Unregister exceptions linked to module + * + * @param int $id_hook Hook id + * @param array $shopList List of shop + * @return boolean result + */ + public function unregisterExceptions($hook_id, $shopList = null) + { + $sql = 'DELETE + FROM `'._DB_PREFIX_.'hook_module_exceptions` + WHERE `id_module` = '.(int)$this->id.' + AND `id_hook` = '.(int)$hook_id + .(($shopList) ? ' AND id_shop IN('.implode(', ', $shopList).')' : ''); + return Db::getInstance()->Execute($sql); + } + + /** + * Add exceptions for module->Hook + * + * @param int $id_hook Hook id + * @param array $excepts List of file name + * @param array $shopList List of shop + * @return boolean result + */ + public function registerExceptions($id_hook, $excepts, $shopList = null) + { + if (is_null($shopList)) + $shopList = Shop::getShops(true, null, true); + + foreach ($shopList as $shopID) + { + foreach ($excepts AS $except) + { + if (!$except) + continue; + + $result = Db::getInstance()->autoExecute(_DB_PREFIX_.'hook_module_exceptions', array( + 'id_module' => $this->id, + 'id_hook' => (int)$id_hook, + 'id_shop' => $shopID, + 'file_name' => pSQL($except), + ), 'INSERT'); + if (!$result) + return false; + } + } + return true; + } + + public function editExceptions($hookID, $excepts, $shopList = null) + { + $this->unregisterExceptions($hookID, $shopList); + return $this->registerExceptions($hookID, $excepts, $shopList); + } + + + /** + * This function is used to determine the module name + * of an AdminTab which belongs to a module, in order to keep translation + * related to a module in its directory (instead of $_LANGADM) + * + * @param mixed $currentClass the + * @return boolean|string if the class belongs to a module, will return the module name. Otherwise, return false. + */ + public static function getModuleNameFromClass($currentClass) + { + // Module can now define AdminTab keeping the module translations method, + // i.e. in modules/[module name]/[iso_code].php + if (!isset(self::$classInModule[$currentClass])) + { + global $_MODULES; + $_MODULE = array(); + $reflectionClass = new ReflectionClass($currentClass); + $filePath = realpath($reflectionClass->getFileName()); + $realpathModuleDir = realpath(_PS_MODULE_DIR_); + if (substr(realpath($filePath), 0, strlen($realpathModuleDir)) == $realpathModuleDir) + { + self::$classInModule[$currentClass] = substr(dirname($filePath), strlen($realpathModuleDir)+1); + + $id_lang = (!isset($cookie) OR !is_object($cookie)) ? (int)(Configuration::get('PS_LANG_DEFAULT')) : (int)($cookie->id_lang); + $file = _PS_MODULE_DIR_.self::$classInModule[$currentClass].'/'.Language::getIsoById($id_lang).'.php'; + if (Tools::file_exists_cache($file) AND include_once($file)) + $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; + } + else + self::$classInModule[$currentClass] = false; + } + // return name of the module, or false + return self::$classInModule[$currentClass]; + } + + /** + * Return an instance of the specified module + * + * @param string $moduleName Module name + * @return Module instance + */ + static public function getInstanceByName($moduleName) + { + if (!Tools::file_exists_cache(_PS_MODULE_DIR_.$moduleName.'/'.$moduleName.'.php')) + return false; + include_once(_PS_MODULE_DIR_.$moduleName.'/'.$moduleName.'.php'); + if (!class_exists($moduleName, false)) + return false; + + if (!isset(self::$_INSTANCE[$moduleName])) + self::$_INSTANCE[$moduleName] = new $moduleName; + return self::$_INSTANCE[$moduleName]; + } + + /** + * Return an instance of the specified module + * + * @param integer $id_module Module ID + * @return Module instance + */ + static public function getInstanceById($moduleID) + { + static $id2name = null; + + if (is_null($id2name)) + { + $id2name = array(); + $sql = 'SELECT id_module, name + FROM '._DB_PREFIX_.'module'; + if ($results = Db::getInstance()->executeS($sql)) + foreach ($results as $row) + $id2name[$row['id_module']] = $row['name']; + } + + if (isset($id2name[$moduleID])) + return Module::getInstanceByName($id2name[$moduleID]); + return false; + } + + /** + * Return available modules + * + * @param boolean $useConfig in order to use config.xml file in module dir + * @return array Modules + */ + public static function getModulesOnDisk($useConfig = false) + { + global $cookie, $_MODULES; + + $moduleList = array(); + $moduleListCursor = 0; + $moduleNameList = array(); + $modulesNameToCursor = array(); + $errors = array(); + $modules_dir = self::getModulesDirOnDisk(); + foreach ($modules_dir AS $module) + { + $configFile = _PS_MODULE_DIR_.$module.'/config.xml'; + $xml_exist = file_exists($configFile); + if ($xml_exist) + $needNewConfigFile = (filemtime($configFile) < filemtime(_PS_MODULE_DIR_.$module.'/'.$module.'.php')); + else + $needNewConfigFile = true; + if ($useConfig AND $xml_exist) + { + libxml_use_internal_errors(true); + $xml_module = simplexml_load_file($configFile); + foreach (libxml_get_errors() as $error) + $errors[] = '['.$module.'] '.Tools::displayError('Error found in config file:').' '.htmlentities($error->message); + libxml_clear_errors(); + + if (!count($errors) AND (int)$xml_module->need_instance == 0 AND !$needNewConfigFile) + { + $file = _PS_MODULE_DIR_.$module.'/'.Language::getIsoById($cookie->id_lang).'.php'; + if (Tools::file_exists_cache($file) AND include_once($file)) + if(isset($_MODULE) AND is_array($_MODULE)) + $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; + + $item = new stdClass(); + $item->id = 0; + $item->warning = ''; + foreach ($xml_module as $k => $v) + $item->$k = (string) $v; + $item->displayName = Module::findTranslation($xml_module->name, $xml_module->displayName, (string)$xml_module->name); + $item->description = Module::findTranslation($xml_module->name, $xml_module->description, (string)$xml_module->name); + $item->author = Module::findTranslation($xml_module->name, $xml_module->author, (string)$xml_module->name); + + if (isset($xml_module->confirmUninstall)) + $item->confirmUninstall = Module::findTranslation($xml_module->name, $xml_module->confirmUninstall, (string)$xml_module->name); + + $item->active = 0; + $moduleList[$moduleListCursor] = $item; + $moduleNameList[$moduleListCursor] = '\''.pSQL($item->name).'\''; + $modulesNameToCursor[strval($item->name)] = $moduleListCursor; + $moduleListCursor++; + } + } + + if (!$useConfig OR !$xml_exist OR (isset($xml_module->need_instance) AND (int)$xml_module->need_instance == 1) OR $needNewConfigFile) + { + $file = trim(file_get_contents(_PS_MODULE_DIR_.$module.'/'.$module.'.php')); + if (substr($file, 0, 5) == '') + $file = substr($file, 0, -2); + if (class_exists($module, false) OR eval($file) !== false) + { + $moduleList[$moduleListCursor++] = new $module; + if (!$xml_exist OR $needNewConfigFile) + { + self::$_generateConfigXmlMode = true; + $tmpModule = new $module; + $tmpModule->_generateConfigXml(); + self::$_generateConfigXmlMode = false; + } + } + else + $errors[] = $module; + } + } + + // Get modules information from database + if (!empty($moduleNameList)) + { + $list = Shop::getListFromContext(); + + $sql = 'SELECT m.id_module, m.name, ( + SELECT COUNT(*) FROM '._DB_PREFIX_.'module_shop ms WHERE m.id_module = ms.id_module AND ms.id_shop IN ('.implode(',', $list).') + ) as total + FROM '._DB_PREFIX_.'module m + WHERE m.name IN ('.implode(',', $moduleNameList).')'; + $results = Db::getInstance()->executeS($sql); + foreach ($results as $result) + { + $moduleCursor = $modulesNameToCursor[$result['name']]; + $moduleList[$moduleCursor]->id = $result['id_module']; + $moduleList[$moduleCursor]->active = ($result['total'] == count($list)) ? 1 : 0; + } + } + + if ($errors) + { + echo '

'.Tools::displayError('Parse error(s) in module(s)').'

    '; + foreach ($errors AS $error) + echo '
  1. '.$error.'
  2. '; + echo '
'; + } + + return $moduleList; + } + + public static function getModulesDirOnDisk() + { + $moduleList = array(); + $modules = scandir(_PS_MODULE_DIR_); + foreach ($modules AS $name) + { + if (Tools::file_exists_cache($moduleFile = _PS_MODULE_DIR_.$name.'/'.$name.'.php')) + { + if (!Validate::isModuleName($name)) + die(Tools::displayError().' (Module '.$name.')'); + $moduleList[] = $name; + } + } + return $moduleList; + } + + /** + * Return non native module + * + * @param int $position Take only positionnables modules + * @return array Modules + */ + public static function getNonNativeModuleList() + { + $db = Db::getInstance(); + $modulesDirOnDisk = Module::getModulesDirOnDisk(); + + $module_list_xml = _PS_ROOT_DIR_.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'modules_list.xml'; + $nativeModules = simplexml_load_file($module_list_xml); + $nativeModules = $nativeModules->modules; + foreach ($nativeModules as $nativeModulesType) + if (in_array($nativeModulesType['type'],array('native','partner'))) + { + $arrNativeModules[] = '""'; + foreach ($nativeModulesType->module as $module) + $arrNativeModules[] = '"'.pSQL($module['name']).'"'; + } + + return $db->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'module` m + WHERE name NOT IN ('.implode(',',$arrNativeModules).') '); + } + + /** + * Return installed modules + * + * @param int $position Take only positionnables modules + * @return array Modules + */ + public static function getModulesInstalled($position = 0) + { + $sql = 'SELECT m.* + FROM `'._DB_PREFIX_.'module` m'; + if ($position) + $sql .= ' LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON m.`id_module` = hm.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` k ON hm.`id_hook` = k.`id_hook` + WHERE k.`position` = 1 + GROUP BY m.id_module'; + return Db::getInstance()->ExecuteS($sql); + } + + /* + * Execute modules for specified hook + * + * @param string $hook_name Hook Name + * @param array $hookArgs Parameters for the functions + * @return string modules output + */ + public static function hookExec($hook_name, $hookArgs = array(), $id_module = NULL) + { + global $cart, $cookie; + if ((!empty($id_module) AND !Validate::isUnsignedId($id_module)) OR !Validate::isHookName($hook_name)) + die(Tools::displayError()); + + $live_edit = false; + if (!isset($hookArgs['cookie']) OR !$hookArgs['cookie']) + $hookArgs['cookie'] = $cookie; + if (!isset($hookArgs['cart']) OR !$hookArgs['cart']) + $hookArgs['cart'] = $cart; + $hook_name = strtolower($hook_name); + + if (!isset(self::$_hookModulesCache)) + { + $db = Db::getInstance(_PS_USE_SQL_SLAVE_); + $list = Shop::getListFromContext(); + + $sql = 'SELECT h.`name` as hook, m.`id_module`, h.`id_hook`, m.`name` as module, h.`live_edit` + FROM `'._DB_PREFIX_.'module` m + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm + ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h + ON hm.`id_hook` = h.`id_hook` + WHERE (SELECT COUNT(*) FROM '._DB_PREFIX_.'module_shop ms WHERE ms.id_module = m.id_module AND ms.id_shop IN('.implode(', ', $list).')) = '.count($list).' + AND hm.id_shop IN('.implode(', ', $list).') + GROUP BY hm.id_hook, hm.id_module + ORDER BY hm.`position`'; + $result = $db->ExecuteS($sql, false); + self::$_hookModulesCache = array(); + + if ($result) + while ($row = $db->nextRow()) + { + $row['hook'] = strtolower($row['hook']); + if (!isset(self::$_hookModulesCache[$row['hook']])) + self::$_hookModulesCache[$row['hook']] = array(); + self::$_hookModulesCache[$row['hook']][] = array('id_hook' => $row['id_hook'], 'module' => $row['module'], 'id_module' => $row['id_module'], 'live_edit' => $row['live_edit']); + } + } + + if (!isset(self::$_hookModulesCache[$hook_name])) + return; + + $altern = 0; + $output = ''; + foreach (self::$_hookModulesCache[$hook_name] AS $array) + { + if ($id_module AND $id_module != $array['id_module']) + continue; + if (!($moduleInstance = Module::getInstanceByName($array['module']))) + continue; + + $exceptions = $moduleInstance->getExceptions($array['id_hook']); + foreach ($exceptions AS $exception) + if (strstr(basename($_SERVER['PHP_SELF']).'?'.$_SERVER['QUERY_STRING'], $exception)) + continue 2; + + if (is_callable(array($moduleInstance, 'hook'.$hook_name))) + { + $hookArgs['altern'] = ++$altern; + + $display = call_user_func(array($moduleInstance, 'hook'.$hook_name), $hookArgs); + if ($array['live_edit'] && ((Tools::isSubmit('live_edit') AND $ad = Tools::getValue('ad') AND (Tools::getValue('liveToken') == sha1(Tools::getValue('ad')._COOKIE_KEY_))))) + { + $live_edit = true; + $output .= ' +
+ ' + .$moduleInstance->displayName.' + + + + + '.$display.'
'; + } + else + $output .= $display; + } + } + return ($live_edit ? '
' : '').$output.($live_edit ? '
' : ''); + } + + public static function hookExecPayment() + { + global $cart, $cookie; + $hookArgs = array('cookie' => $cookie, 'cart' => $cart); + $id_customer = (int)($cookie->id_customer); + $billing = new Address((int)($cart->id_address_invoice)); + $output = ''; + $list = Shop::getListFromContext(); + $sql = 'SELECT DISTINCT h.`id_hook`, m.`name`, hm.`position` + FROM `'._DB_PREFIX_.'module_country` mc + LEFT JOIN `'._DB_PREFIX_.'module` m ON m.`id_module` = mc.`id_module` + INNER JOIN `'._DB_PREFIX_.'module_group` mg ON (m.`id_module` = mg.`id_module`) + INNER JOIN `'._DB_PREFIX_.'customer_group` cg on (cg.`id_group` = mg.`id_group` AND cg.`id_customer` = '.(int)($id_customer).') + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` + WHERE h.`name` = \'payment\' + AND mc.id_country = '.(int)($billing->id_country).' + AND mc.id_shop = '.(int)Shop::getCurrentShop().' + AND mg.id_shop = '.(int)Shop::getCurrentShop().' + AND (SELECT COUNT(*) FROM '._DB_PREFIX_.'module_shop ms WHERE ms.id_module = m.id_module AND ms.id_shop IN('.implode(', ', $list).')) = '.count($list).' + AND hm.id_shop IN('.implode(', ', $list).') + GROUP BY hm.id_hook, hm.id_module + ORDER BY hm.`position`, m.`name` DESC'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if ($result) + foreach ($result AS $k => $module) + if (($moduleInstance = Module::getInstanceByName($module['name'])) AND is_callable(array($moduleInstance, 'hookpayment'))) + if (!$moduleInstance->currencies OR ($moduleInstance->currencies AND sizeof(Currency::checkPaymentCurrencies($moduleInstance->id, (int)Shop::getCurrentShop())))) + $output .= call_user_func(array($moduleInstance, 'hookpayment'), $hookArgs); + return $output; + } + + /** + * find translation from $_MODULES and put it in self::$l_cache if not already exist + * and return it. + * + * @param string $name name of the module + * @param string $string term to find + * @param string $source additional param for building translation key + * @return string + */ + public static function findTranslation($name, $string, $source) + { + global $_MODULES; + + $cache_key = $name . '|' . $string . '|' . $source; + + if (!isset(self::$l_cache[$cache_key])) + { + if (!is_array($_MODULES)) + return str_replace('"', '"', $string); + // set array key to lowercase for 1.3 compatibility + $_MODULES = array_change_key_case($_MODULES); + $currentKey = '<{'.strtolower($name).'}'.strtolower(_THEME_NAME_).'>'.strtolower($source).'_'.md5($string); + $defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string); + + if (isset($_MODULES[$currentKey])) + $ret = stripslashes($_MODULES[$currentKey]); + elseif (isset($_MODULES[Tools::strtolower($currentKey)])) + $ret = stripslashes($_MODULES[Tools::strtolower($currentKey)]); + elseif (isset($_MODULES[$defaultKey])) + $ret = stripslashes($_MODULES[$defaultKey]); + elseif (isset($_MODULES[Tools::strtolower($defaultKey)])) + $ret = stripslashes($_MODULES[Tools::strtolower($defaultKey)]); + else + $ret = stripslashes($string); + + self::$l_cache[$cache_key] = str_replace('"', '"', $ret); + } + return self::$l_cache[$cache_key]; + } + /** + * Get translation for a given module text + * + * Note: $specific parameter is mandatory for library files. + * Otherwise, translation key will not match for Module library + * when module is loaded with eval() Module::getModulesOnDisk() + * + * @param string $string String to translate + * @param boolean|string $specific filename to use in translation key + * @return string Translation + */ + public function l($string, $specific = false) + { + if (self::$_generateConfigXmlMode) + return $string; + + global $_MODULES, $_MODULE, $cookie; + + $id_lang = (!isset($cookie) OR !is_object($cookie)) ? (int)(Configuration::get('PS_LANG_DEFAULT')) : (int)($cookie->id_lang); + $file = _PS_MODULE_DIR_.$this->name.'/'.Language::getIsoById($id_lang).'.php'; + if (Tools::file_exists_cache($file) AND include_once($file)) + $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; + + $source = $specific ? $specific : $this->name; + $string = str_replace('\'', '\\\'', $string); + $ret = $this->findTranslation($this->name, $string, $source); + return $ret; + } + + /* + * Reposition module + * + * @param boolean $id_hook Hook ID + * @param boolean $way Up (1) or Down (0) + * @param int $position + */ + public function updatePosition($id_hook, $way, $position = NULL) + { + $list = ShopCore::getListOfID($this->shopID, $this->shopGroupID); + foreach ($list as $shopID) + { + $sql = 'SELECT hm.`id_module`, hm.`position`, hm.`id_hook` + FROM `'._DB_PREFIX_.'hook_module` hm + WHERE hm.`id_hook` = '.(int)$id_hook.' + AND hm.id_shop = '.$shopID.' + ORDER BY hm.`position` '.($way ? 'ASC' : 'DESC'); + if (!$res = Db::getInstance()->ExecuteS($sql)) + continue; + + foreach ($res AS $key => $values) + if ((int)($values[$this->identifier]) == (int)($this->id)) + { + $k = $key ; + break ; + } + if (!isset($k) OR !isset($res[$k]) OR !isset($res[$k + 1])) + return false; + $from = $res[$k]; + $to = $res[$k + 1]; + + if (isset($position) and !empty($position)) + $to['position'] = (int)($position); + + $sql = 'UPDATE `'._DB_PREFIX_.'hook_module` + SET `position`= position '.($way ? '-1' : '+1').' + WHERE position between '.(int)(min(array($from['position'], $to['position']))) .' AND '.(int)(max(array($from['position'], $to['position']))).' + AND `id_hook`='.(int)$from['id_hook'].' + AND id_shop = '.$shopID; + if (!Db::getInstance()->Execute($sql)) + return false; + + $sql = 'UPDATE `'._DB_PREFIX_.'hook_module` + SET `position`='.(int)($to['position']).' + WHERE `'.pSQL($this->identifier).'` = '.(int)($from[$this->identifier]).' + AND `id_hook` = '.(int)($to['id_hook']).' + AND id_shop = '.$shopID; + if (!Db::getInstance()->Execute($sql)) + return false; + } + } + + /* + * Reorder modules position + * + * @param boolean $id_hook Hook ID + * @param array $shopList List of shop + */ + public function cleanPositions($id_hook, $shopList = null) + { + $sql = 'SELECT id_module, id_shop + FROM '._DB_PREFIX_.'hook_module + WHERE id_hook = '.(int)$id_hook.' + '.((!is_null($shopList)) ? ' AND id_shop IN('.implode(', ', $shopList).')' : '').' + ORDER BY position'; + $results = Db::getInstance()->ExecuteS($sql); + $position = array(); + foreach ($results as $row) + { + if (!isset($position[$row['id_shop']])) + $position[$row['id_shop']] = 1; + + $sql = 'UPDATE '._DB_PREFIX_.'hook_module + SET position = '.$position[$row['id_shop']].' + WHERE id_hook = '.(int)$id_hook.' + AND id_module = '.$row['id_module'].' + AND id_shop = '.$row['id_shop']; + Db::getInstance()->Execute($sql); + $position[$row['id_shop']]++; + } + + return true; + } + + public function displayError($error) + { + $output = ' +
+ '.$error.' +
'; + $this->error = true; + return $output; + } + + public function displayConfirmation($string) + { + $output = ' +
+ '.$string.' +
'; + return $output; + } + + /* + * Return exceptions for module in hook + * + * @param int $id_hook Hook ID + * @return array Exceptions + */ + protected static $exceptionsCache = NULL; + public function getExceptions($hookID, $dispatch = false) + { + if (is_null(self::$exceptionsCache)) + { + self::$exceptionsCache = array(); + $sql = 'SELECT * + FROM `'._DB_PREFIX_.'hook_module_exceptions` + WHERE id_shop IN ('.implode(', ', Shop::getListFromContext()).')'; + $result = Db::getInstance()->ExecuteS($sql); + foreach ($result as $row) + { + if (!$row['file_name']) + continue; + $key = $row['id_hook'] . '-' . $row['id_module']; + if (!isset(self::$exceptionsCache[$key])) + self::$exceptionsCache[$key] = array(); + if (!isset(self::$exceptionsCache[$key][$row['id_shop']])) + self::$exceptionsCache[$key][$row['id_shop']] = array(); + self::$exceptionsCache[$key][$row['id_shop']][] = $row['file_name']; + } + } + + $key = $hookID.'-'.$this->id; + if (!$dispatch) + { + $files = array(); + foreach (Shop::getListFromContext() as $shopID) + if (isset(self::$exceptionsCache[$key], self::$exceptionsCache[$key][$shopID])) + foreach (self::$exceptionsCache[$key][$shopID] as $file) + if (!in_array($file, $files)) + $files[] = $file; + return $files; + } + else + { + $list = array(); + foreach (Shop::getListFromContext() as $shopID) + if (isset(self::$exceptionsCache[$key], self::$exceptionsCache[$key][$shopID])) + $list[$shopID] = self::$exceptionsCache[$key][$shopID]; + return $list; + } + } + + public static function isInstalled($moduleName) + { + Db::getInstance()->ExecuteS('SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name` = \''.pSQL($moduleName).'\''); + return (bool)Db::getInstance()->NumRows(); + } + + public function isRegisteredInHook($hook) + { + if (!$this->id) + return false; + + $sql = 'SELECT COUNT(*) + FROM `'._DB_PREFIX_.'hook_module` hm + LEFT JOIN `'._DB_PREFIX_.'hook` h ON (h.`id_hook` = hm.`id_hook`) + WHERE h.`name` = \''.pSQL($hook).'\' + AND hm.`id_module` = '.(int)($this->id); + return Db::getInstance()->getValue($sql); + } + + /* + ** Template management (display, overload, cache) + */ + protected static function _isTemplateOverloadedStatic($moduleName, $template) + { + if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$moduleName.'/'.$template)) + return true; + elseif (Tools::file_exists_cache(_PS_MODULE_DIR_.$moduleName.'/'.$template)) + return false; + return NULL; + } + + protected function _isTemplateOverloaded($template) + { + return self::_isTemplateOverloadedStatic($this->name, $template); + } + + public static function display($file, $template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + if (Configuration::get('PS_FORCE_SMARTY_2')) /* Keep a backward compatibility for Smarty v2 */ + { + $previousTemplate = $smarty->currentTemplate; + $smarty->currentTemplate = substr(basename($template), 0, -4); + } + $smarty->assign('module_dir', __PS_BASE_URI__.'modules/'.basename($file, '.php').'/'); + if (($overloaded = self::_isTemplateOverloadedStatic(basename($file, '.php'), $template)) === NULL) + $result = Tools::displayError('No template found for module').' '.basename($file,'.php'); + else + { + $smarty->assign('module_template_dir', ($overloaded ? _THEME_DIR_ : __PS_BASE_URI__).'modules/'.basename($file, '.php').'/'); + $result = $smarty->fetch(($overloaded ? _PS_THEME_DIR_.'modules/'.basename($file, '.php') : _PS_MODULE_DIR_.basename($file, '.php')).'/'.$template, $cacheId, $compileId); + } + if (Configuration::get('PS_FORCE_SMARTY_2')) /* Keep a backward compatibility for Smarty v2 */ + $smarty->currentTemplate = $previousTemplate; + return $result; + } + + protected function _getApplicableTemplateDir($template) + { + return $this->_isTemplateOverloaded($template) ? _PS_THEME_DIR_ : _PS_MODULE_DIR_.$this->name.'/'; + } + + public function isCached($template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + /* Use Smarty 3 API calls */ + if (!Configuration::get('PS_FORCE_SMARTY_2')) /* PHP version > 5.1.2 */ + return $smarty->isCached($this->_getApplicableTemplateDir($template).$template, $cacheId, $compileId); + /* or keep a backward compatibility if PHP version < 5.1.2 */ + else + return $smarty->is_cached($this->_getApplicableTemplateDir($template).$template, $cacheId, $compileId); + } + + protected function _clearCache($template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + /* Use Smarty 3 API calls */ + if (!Configuration::get('PS_FORCE_SMARTY_2')) /* PHP version > 5.1.2 */ + return $smarty->clearCache($template ? $this->_getApplicableTemplateDir($template).$template : NULL, $cacheId, $compileId); + /* or keep a backward compatibility if PHP version < 5.1.2 */ + else + return $smarty->clear_cache($template ? $this->_getApplicableTemplateDir($template).$template : NULL, $cacheId, $compileId); + } + + protected function _generateConfigXml() + { + $xml = ' + + '.$this->name.' + displayName).']]> + version.']]> + description).']]> + author).']]> + tab).']]>'.(isset($this->confirmUninstall) ? "\n\t".''.$this->confirmUninstall.'' : '').' + '.(int)method_exists($this, 'getContent').' + '.(int)$this->need_instance.''.(isset($this->limited_countries) ? "\n\t".''.(sizeof($this->limited_countries) == 1 ? $this->limited_countries[0] : '').'' : '').' +'; + if (is_writable(_PS_MODULE_DIR_.$this->name.'/')) + file_put_contents(_PS_MODULE_DIR_.$this->name.'/config.xml', utf8_encode($xml)); + } + + /** + * @param string $hook_name + * @return bool if module can be transplanted on hook + */ + public function isHookableOn($hook_name) + { + return is_callable(array($this, 'hook'.ucfirst($hook_name))); + } +} + diff --git a/classes/ModuleGraph.php b/classes/ModuleGraph.php new file mode 100644 index 000000000..2aadb7c1f --- /dev/null +++ b/classes/ModuleGraph.php @@ -0,0 +1,327 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7329 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class ModuleGraphCore extends Module +{ + protected $_employee; + + /** @var integer array graph data */ + protected $_values = array(); + + /** @var string array graph legends (X axis) */ + protected $_legend = array(); + + /**@var string graph titles */ + protected $_titles = array('main' => NULL, 'x' => NULL, 'y' => NULL); + + /** @var ModuleGraphEngine graph engine */ + protected $_render; + + abstract protected function getData($layers); + + public function setEmployee($id_employee) + { + $this->_employee = new Employee((int)($id_employee)); + } + + public function setLang($id_lang) + { + $this->_id_lang = $id_lang; + } + + protected function setDateGraph($layers, $legend = false) + { + // Get dates in a manageable format + $fromArray = getdate(strtotime($this->_employee->stats_date_from)); + $toArray = getdate(strtotime($this->_employee->stats_date_to)); + + // If the granularity is inferior to 1 day + if ($this->_employee->stats_date_from == $this->_employee->stats_date_to) + { + if ($legend) + for ($i = 0; $i < 24; $i++) + { + if ($layers == 1) + $this->_values[$i] = 0; + else + for ($j = 0; $j < $layers; $j++) + $this->_values[$j][$i] = 0; + $this->_legend[$i] = ($i % 2) ? '' : sprintf('%02dh', $i); + } + if (is_callable(array($this, 'setDayValues'))) + $this->setDayValues($layers); + } + // If the granularity is inferior to 1 month TODO : change to manage 28 to 31 days + elseif (strtotime($this->_employee->stats_date_to) - strtotime($this->_employee->stats_date_from) <= 2678400) + { + if ($legend) + { + $days = array(); + if ($fromArray['mon'] == $toArray['mon']) + for ($i = $fromArray['mday']; $i <= $toArray['mday']; ++$i) + $days[] = $i; + else + { + $imax = date('t', mktime(0, 0, 0, $fromArray['mon'], 1, $fromArray['year'])); + for ($i = $fromArray['mday']; $i <= $imax; ++$i) + $days[] = $i; + for ($i = 1; $i <= $toArray['mday']; ++$i) + $days[] = $i; + } + foreach ($days as $i) + { + if ($layers == 1) + $this->_values[$i] = 0; + else + for ($j = 0; $j < $layers; $j++) + $this->_values[$j][$i] = 0; + $this->_legend[$i] = ($i % 2) ? '' : sprintf('%02d', $i); + } + } + if (is_callable(array($this, 'setMonthValues'))) + $this->setMonthValues($layers); + } + // If the granularity is less than 1 year + elseif (strtotime('-1 year', strtotime($this->_employee->stats_date_to)) < strtotime($this->_employee->stats_date_from)) + { + if ($legend) + { + $months = array(); + if ($fromArray['year'] == $toArray['year']) + for ($i = $fromArray['mon']; $i <= $toArray['mon']; ++$i) + $months[] = $i; + else + { + for ($i = $fromArray['mon']; $i <= 12; ++$i) + $months[] = $i; + for ($i = 1; $i <= $toArray['mon']; ++$i) + $months[] = $i; + } + foreach ($months as $i) + { + if ($layers == 1) + $this->_values[$i] = 0; + else + for ($j = 0; $j < $layers; $j++) + $this->_values[$j][$i] = 0; + $this->_legend[$i] = sprintf('%02d', $i); + } + } + if (is_callable(array($this, 'setYearValues'))) + $this->setYearValues($layers); + } + // If the granularity is greater than 1 year + else + { + if ($legend) + { + $years = array(); + for ($i = $fromArray['year']; $i <= $toArray['year']; ++$i) + $years[] = $i; + foreach ($years as $i) + { + if ($layers == 1) + $this->_values[$i] = 0; + else + for ($j = 0; $j < $layers; $j++) + $this->_values[$j][$i] = 0; + $this->_legend[$i] = sprintf('%04d', $i); + } + } + if (is_callable(array($this, 'setAllTimeValues'))) + $this->setAllTimeValues($layers); + } + } + + protected function csvExport($datas) + { + global $cookie; + + $this->setEmployee(intval($cookie->id_employee)); + $this->setLang(intval($cookie->id_lang)); + + $layers = isset($datas['layers']) ? $datas['layers'] : 1; + if (isset($datas['option'])) + $this->setOption($datas['option'], $layers); + $this->getData($layers); + + // @todo use native CSV PHP functions ? + // Generate first line (column titles) + if (is_array($this->_titles['main'])) + for ($i = 0; $i <= sizeof($this->_titles['main']); $i++) + { + if($i > 0) + $this->_csv .= ';'; + if (isset($this->_titles['main'][$i])) + $this->_csv .= $this->_titles['main'][$i]; + } + else // If there is only one column title, there is in fast two column (the first without title) + $this->_csv .= ';'.$this->_titles['main']; + $this->_csv .= "\n"; + if (sizeof($this->_legend)) + { + $total = 0; + if ($datas['type'] == 'pie') + foreach ($this->_legend AS $key => $legend) + for ($i = 0; $i < (is_array($this->_titles['main']) ? sizeof($this->_values) : 1); ++$i) + $total += (is_array($this->_values[$i]) ? $this->_values[$i][$key] : $this->_values[$key]); + foreach ($this->_legend AS $key => $legend) + { + $this->_csv .= $legend.';'; + for ($i = 0; $i < (is_array($this->_titles['main']) ? sizeof($this->_values) : 1); ++$i) + { + if (!isset($this->_values[$i]) || !is_array($this->_values[$i])) + if (isset($this->_values[$key])) + { + // We don't want strings to be divided. Example: product name + if (is_numeric($this->_values[$key])) + $this->_csv .= $this->_values[$key] / (($datas['type'] == 'pie') ? $total : 1); + else + $this->_csv .= $this->_values[$key]; + }else + $this->_csv .= '0'; + else + { + // We don't want strings to be divided. Example: product name + if (is_numeric($this->_values[$i][$key])) + $this->_csv .= $this->_values[$i][$key] / (($datas['type'] == 'pie') ? $total : 1); + else + $this->_csv .= $this->_values[$i][$key]; + } + $this->_csv .= ';'; + } + $this->_csv .= "\n"; + } + } + $this->_displayCsv(); + } + + protected function _displayCsv() + { + ob_end_clean(); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="'.$this->displayName.' - '.time().'.csv"'); + echo $this->_csv; + exit; + } + + public function create($render, $type, $width, $height, $layers) + { + if (!Tools::file_exists_cache($file = dirname(__FILE__).'/../modules/'.$render.'/'.$render.'.php')) + die(Tools::displayError()); + require_once($file); + $this->_render = new $render($type); + + $this->getData($layers); + $this->_render->createValues($this->_values); + $this->_render->setSize($width, $height); + $this->_render->setLegend($this->_legend); + $this->_render->setTitles($this->_titles); + } + + public function draw() + { + $this->_render->draw(); + } + + /** + * @todo Set this method as abstracted ? Quid of module compatibility. + */ + public function setOption($option, $layers = 1) + { + } + + public function engine($params) + { + global $cookie; + + if (!($render = Configuration::get('PS_STATS_RENDER'))) + return Tools::displayError('No graph engine selected'); + if (!file_exists(dirname(__FILE__).'/../modules/'.$render.'/'.$render.'.php')) + return Tools::displayError('Graph engine selected is unavailable.'); + + global $cookie; + $id_employee = (int)($cookie->id_employee); + $id_lang = (int)($cookie->id_lang); + + if (!isset($params['layers'])) + $params['layers'] = 1; + if (!isset($params['type'])) + $params['type'] = 'column'; + if (!isset($params['width'])) + $params['width'] = 550; + if (!isset($params['height'])) + $params['height'] = 270; + + $urlParams = $params; + $urlParams['render'] = $render; + $urlParams['module'] = Tools::getValue('module'); + $urlParams['id_employee'] = $id_employee; + $urlParams['id_lang'] = $id_lang; + $drawer = 'drawer.php?' . http_build_query($urlParams); + + require_once(dirname(__FILE__).'/../modules/'.$render.'/'.$render.'.php'); + return call_user_func(array($render, 'hookGraphEngine'), $params, $drawer); + } + + protected static function getEmployee($employee = null) + { + if (!$employee) + { + global $cookie; + $employee = new Employee((int)($cookie->id_employee)); + } + + if (empty($employee->stats_date_from) OR empty($employee->stats_date_to) OR $employee->stats_date_from == '0000-00-00' OR $employee->stats_date_to == '0000-00-00') + { + if (empty($employee->stats_date_from) OR $employee->stats_date_from == '0000-00-00') + $employee->stats_date_from = date('Y').'-01-01'; + if (empty($employee->stats_date_to) OR $employee->stats_date_to == '0000-00-00') + $employee->stats_date_to = date('Y').'-12-31'; + $employee->update(); + } + return $employee; + } + + public function getDate() + { + return self::getDateBetween($this->_employee); + } + + public static function getDateBetween($employee = null) + { + $employee = self::getEmployee($employee); + return ' \''.$employee->stats_date_from.' 00:00:00\' AND \''.$employee->stats_date_to.' 23:59:59\' '; + } + + public function getLang() + { + return $this->_id_lang; + } +} + + diff --git a/classes/ModuleGraphEngine.php b/classes/ModuleGraphEngine.php new file mode 100644 index 000000000..8420ee87e --- /dev/null +++ b/classes/ModuleGraphEngine.php @@ -0,0 +1,72 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class ModuleGraphEngineCore extends Module +{ + protected $_type; + + public function __construct($type) + { + $this->_type = $type; + } + + public function install() + { + if (!parent::install()) + return false; + return Configuration::updateValue('PS_STATS_RENDER', $this->name); + } + + public static function getGraphEngines() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT m.`name` + FROM `'._DB_PREFIX_.'module` m + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` + WHERE h.`name` = \'GraphEngine\''); + + $arrayEngines = array(); + foreach ($result AS $module) + { + $instance = Module::getInstanceByName($module['name']); + if (!$instance) + continue; + $arrayEngines[$module['name']] = array($instance->displayName, $instance->description); + } + + return $arrayEngines; + } + + abstract public function createValues($values); + abstract public function setSize($width, $height); + abstract public function setLegend($legend); + abstract public function setTitles($titles); + abstract public function draw(); +} + + diff --git a/classes/ModuleGrid.php b/classes/ModuleGrid.php new file mode 100644 index 000000000..d76f83d8f --- /dev/null +++ b/classes/ModuleGrid.php @@ -0,0 +1,185 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class ModuleGridCore extends Module +{ + protected $_employee; + + /** @var string array graph data */ + protected $_values = array(); + + /** @var integer total number of values **/ + protected $_totalCount = 0; + + /**@var string graph titles */ + protected $_title; + + /**@var integer start */ + protected $_start; + + /**@var integer limit */ + protected $_limit; + + /**@var string column name on which to sort */ + protected $_sort = null; + + /**@var string sort direction DESC/ASC */ + protected $_direction = null; + + /** @var ModuleGridEngine grid engine */ + protected $_render; + + public function install() + { + return (parent::install()); + } + + public function setEmployee($id_employee) + { + $this->_employee = new Employee((int)($id_employee)); + } + public function setLang($id_lang) + { + $this->_id_lang = $id_lang; + } + + public function create($render, $type, $width, $height, $start, $limit, $sort, $dir) + { + if (!Tools::file_exists_cache($file = dirname(__FILE__).'/../modules/'.$render.'/'.$render.'.php')) + die(Tools::displayError()); + require_once($file); + $this->_render = new $render($type); + + $this->_start = $start; + $this->_limit = $limit; + $this->_sort = $sort; + $this->_direction = $dir; + + $this->getData(); + + $this->_render->setTitle($this->_title); + $this->_render->setSize($width, $height); + $this->_render->setValues($this->_values); + $this->_render->setTotalCount($this->_totalCount); + $this->_render->setLimit($this->_start, $this->_limit); + } + + public function render() + { + $this->_render->render(); + } + + public function engine($params) + { + if (!($render = Configuration::get('PS_STATS_GRID_RENDER'))) + return Tools::displayError('No grid engine selected'); + if (!file_exists(dirname(__FILE__).'/../modules/'.$render.'/'.$render.'.php')) + return Tools::displayError('Grid engine selected is unavailable.'); + + $grider = 'grider.php?render='.$render.'&module='.Tools::getValue('module'); + + global $cookie; + $grider .= '&id_employee='.(int)($cookie->id_employee); + $grider .= '&id_lang='.(int)($cookie->id_lang); + + if (!isset($params['width']) OR !Validate::IsUnsignedInt($params['width'])) + $params['width'] = 600; + if (!isset($params['height']) OR !Validate::IsUnsignedInt($params['height'])) + $params['height'] = 920; + if (!isset($params['start']) OR !Validate::IsUnsignedInt($params['start'])) + $params['start'] = 0; + if (!isset($params['limit']) OR !Validate::IsUnsignedInt($params['height'])) + $params['limit'] = 40; + + $grider .= '&width='.$params['width']; + $grider .= '&height='.$params['height']; + if (isset($params['start']) AND Validate::IsUnsignedInt($params['start'])) + $grider .= '&start='.$params['start']; + if (isset($params['limit']) AND Validate::IsUnsignedInt($params['limit'])) + $grider .= '&limit='.$params['limit']; + if (isset($params['type']) AND Validate::IsName($params['type'])) + $grider .= '&type='.$params['type']; + if (isset($params['option']) AND Validate::IsGenericName($params['option'])) + $grider .= '&option='.$params['option']; + if (isset($params['sort']) AND Validate::IsName($params['sort'])) + $grider .= '&sort='.$params['sort']; + if (isset($params['dir']) AND Validate::IsSortDirection($params['dir'])) + $grider .= '&dir='.$params['dir']; + + require_once(dirname(__FILE__).'/../modules/'.$render.'/'.$render.'.php'); + return call_user_func(array($render, 'hookGridEngine'), $params, $grider); + } + + protected function csvExport($datas) + { + global $cookie; + $this->_sort = $datas['defaultSortColumn']; + $this->setLang($cookie->id_lang); + $this->getData(); + + $layers = isset($datas['layers']) ? $datas['layers'] : 1; + + if (isset($datas['option'])) + $this->setOption($datas['option'], $layers); + + if (sizeof($datas['columns'])) + { + foreach ($datas['columns'] AS $column) + $this->_csv .= $column['header'].';'; + $this->_csv = rtrim($this->_csv, ';')."\n"; + + foreach ($this->_values AS $value) + { + foreach ($datas['columns'] AS $column) + $this->_csv .= $value[$column['dataIndex']].';'; + $this->_csv = rtrim($this->_csv, ';')."\n"; + } + } + $this->_displayCsv(); + } + + protected function _displayCsv() + { + ob_end_clean(); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="'.$this->displayName.' - '.time().'.csv"'); + echo $this->_csv; + exit; + } + + abstract protected function getData(); + + public function getDate() + { + return ModuleGraph::getDateBetween($this->_employee); + } + public function getLang() + { + return $this->_id_lang; + } +} + diff --git a/classes/ModuleGridEngine.php b/classes/ModuleGridEngine.php new file mode 100644 index 000000000..3d3a23941 --- /dev/null +++ b/classes/ModuleGridEngine.php @@ -0,0 +1,71 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class ModuleGridEngineCore extends Module +{ + protected $_type; + + public function __construct($type) + { + $this->_type = $type; + } + + public function install() + { + if (!parent::install()) + return false; + return Configuration::updateValue('PS_STATS_GRID_RENDER', $this->name); + } + + public static function getGridEngines() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT m.`name` + FROM `'._DB_PREFIX_.'module` m + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` + WHERE h.`name` = \'GridEngine\''); + + $arrayEngines = array(); + foreach ($result AS $module) + { + $instance = Module::getInstanceByName($module['name']); + if (!$instance) + continue; + $arrayEngines[$module['name']] = array($instance->displayName, $instance->description); + } + return $arrayEngines; + } + + abstract public function setValues($values); + abstract public function setTitle($title); + abstract public function setSize($width, $height); + abstract public function setTotalCount($totalCount); + abstract public function setLimit($start, $limit); + abstract public function render(); +} + diff --git a/classes/MySQL.php b/classes/MySQL.php new file mode 100644 index 000000000..40fb166e7 --- /dev/null +++ b/classes/MySQL.php @@ -0,0 +1,285 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6856 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class MySQLCore extends Db +{ + public function connect() + { + if (!defined('_PS_DEBUG_SQL_')) + define('_PS_DEBUG_SQL_', false); + if ($this->_link = mysql_connect($this->_server, $this->_user, $this->_password)) + { + if(!$this->set_db($this->_database)) + die(Tools::displayError('The database selection cannot be made.')); + } + else + die(Tools::displayError('Link to database cannot be established.')); + /* UTF-8 support */ + if (!mysql_query('SET NAMES \'utf8\'', $this->_link)) + die(Tools::displayError('PrestaShop Fatal error: no utf-8 support. Please check your server configuration.')); + // removed SET GLOBAL SQL_MODE : we can't do that (see PSCFI-1548) + return $this->_link; + } + + /* do not remove, useful for some modules */ + public function set_db($db_name) { + return mysql_select_db($db_name, $this->_link); + } + + public function disconnect() + { + if ($this->_link) + @mysql_close($this->_link); + $this->_link = false; + } + + public function getRow($query, $use_cache = 1) + { + $query .= ' LIMIT 1'; + $this->_result = false; + $this->_lastQuery = $query; + if($use_cache AND _PS_CACHE_ENABLED_) + if ($result = Cache::getInstance()->get(md5($query))) + { + $this->_lastCached = true; + return $result; + } + if ($this->_link) + if ($this->_result = mysql_query($query, $this->_link)) + { + $this->_lastCached = false; + if (_PS_DEBUG_SQL_) + $this->displayMySQLError($query); + $result = mysql_fetch_assoc($this->_result); + if ($use_cache = 1 AND _PS_CACHE_ENABLED_) + Cache::getInstance()->setQuery($query, $result); + return $result; + } + if (_PS_DEBUG_SQL_) + $this->displayMySQLError($query); + return false; + } + + public function getValue($query, $use_cache = 1) + { + $query .= ' LIMIT 1'; + $this->_result = false; + $this->_lastQuery = $query; + if ($use_cache AND _PS_CACHE_ENABLED_) + if ($result = Cache::getInstance()->get(md5($query))) + { + $this->_lastCached = true; + return $result; + } + if ($this->_link AND $this->_result = mysql_query($query, $this->_link) AND is_array($tmpArray = mysql_fetch_assoc($this->_result))) + { + $this->_lastCached = false; + $result = array_shift($tmpArray); + if($use_cache AND _PS_CACHE_ENABLED_) + Cache::getInstance()->setQuery($query, $result); + return $result; + } + return false; + } + + public function Execute($query, $use_cache = 1) + { + $this->_result = false; + if ($this->_link) + { + $this->_result = mysql_query($query, $this->_link); + if (_PS_DEBUG_SQL_) + $this->displayMySQLError($query); + if ($use_cache AND _PS_CACHE_ENABLED_) + Cache::getInstance()->deleteQuery($query); + return $this->_result; + } + if (_PS_DEBUG_SQL_) + $this->displayMySQLError($query); + return false; + } + + /** + * ExecuteS return the result of $query as array, + * or as mysqli_result if $array set to false + * + * @param string $query query to execute + * @param boolean $array return an array instead of a mysql_result object + * @param int $use_cache if query has been already executed, use its result + * @return array or result object + */ + public function ExecuteS($query, $array = true, $use_cache = 1) + { + $this->_result = false; + $this->_lastQuery = $query; + if ($use_cache AND _PS_CACHE_ENABLED_) + if ($array AND ($result = Cache::getInstance()->get(md5($query)))) + { + $this->_lastCached = true; + return $result; + } + if ($this->_link && $this->_result = mysql_query($query, $this->_link)) + { + $this->_lastCached = false; + if (_PS_DEBUG_SQL_) + $this->displayMySQLError($query); + if (!$array) + return $this->_result; + $resultArray = array(); + // Only SELECT queries and a few others return a valid resource usable with mysql_fetch_assoc + if ($this->_result !== true) + while ($row = mysql_fetch_assoc($this->_result)) + $resultArray[] = $row; + if ($use_cache AND _PS_CACHE_ENABLED_) + Cache::getInstance()->setQuery($query, $resultArray); + return $resultArray; + } + if (_PS_DEBUG_SQL_) + $this->displayMySQLError($query); + return false; + } + + public function nextRow($result = false) + { + return mysql_fetch_assoc($result ? $result : $this->_result); + } + + public function delete($table, $where = false, $limit = false, $use_cache = 1) + { + $this->_result = false; + if ($this->_link) + { + $query = 'DELETE FROM `'.pSQL($table).'`'.($where ? ' WHERE '.$where : '').($limit ? ' LIMIT '.(int)($limit) : ''); + $res = mysql_query($query, $this->_link); + if ($use_cache AND _PS_CACHE_ENABLED_) + Cache::getInstance()->deleteQuery($query); + return $res; + } + + return false; + } + + public function NumRows() + { + if (!$this->_lastCached AND $this->_link AND $this->_result) + { + $nrows = mysql_num_rows($this->_result); + if (_PS_CACHE_ENABLED_) + Cache::getInstance()->setNumRows(md5($this->_lastQuery), $nrows); + return $nrows; + } + elseif (_PS_CACHE_ENABLED_ AND $this->_lastCached) + { + return Cache::getInstance()->getNumRows(md5($this->_lastQuery)); + } + } + + public function Insert_ID() + { + if ($this->_link) + return mysql_insert_id($this->_link); + return false; + } + + public function Affected_Rows() + { + if ($this->_link) + return mysql_affected_rows($this->_link); + return false; + } + + protected function q($query, $use_cache = 1) + { + global $webservice_call; + $this->_result = false; + if ($this->_link) + { + $result = mysql_query($query, $this->_link); + $this->_lastQuery = $query; + if ($webservice_call) + $this->displayMySQLError($query); + if ($use_cache AND _PS_CACHE_ENABLED_) + Cache::getInstance()->deleteQuery($query); + return $result; + } + return false; + } + + /** + * Returns the text of the error message from previous MySQL operation + * + * @acces public + * @return string error + */ + public function getMsgError($query = false) + { + return mysql_error(); + } + + public function getNumberError() + { + return mysql_errno(); + } + + public function displayMySQLError($query = false) + { + global $webservice_call; + if ($webservice_call && mysql_errno()) + { + WebserviceRequest::getInstance()->setError(500, '[SQL Error] '.mysql_error().'. Query was : '.$query, 97); + } + elseif (_PS_DEBUG_SQL_ AND mysql_errno() AND !defined('PS_INSTALLATION_IN_PROGRESS')) + { + if ($query) + { + die(Tools::displayError(mysql_error().'

'.$query.'
')); + } + die(Tools::displayError((mysql_error()))); + } + } + + static public function tryToConnect($server, $user, $pwd, $db) + { + if (!$link = @mysql_connect($server, $user, $pwd)) + return 1; + if (!@mysql_select_db($db, $link)) + return 2; + @mysql_close($link); + return 0; + } + + static public function tryUTF8($server, $user, $pwd) + { + $link = @mysql_connect($server, $user, $pwd); + if (!mysql_query('SET NAMES \'utf8\'', $link)) + $ret = false; + else + $ret = true; + @mysql_close($link); + return $ret; + } +} diff --git a/classes/ObjectModel.php b/classes/ObjectModel.php new file mode 100644 index 000000000..666a23e13 --- /dev/null +++ b/classes/ObjectModel.php @@ -0,0 +1,831 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7499 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class ObjectModelCore +{ + /** @var integer Object id */ + public $id; + + /** @var integer lang id */ + protected $id_lang = NULL; + + protected $id_shop = NULL; + + /** @var string SQL Table name */ + protected $table = NULL; + + /** @var string SQL Table identifier */ + protected $identifier = NULL; + + /** @var array Required fields for admin panel forms */ + protected $fieldsRequired = array(); + + /** @var fieldsRequiredDatabase */ + protected static $fieldsRequiredDatabase = NULL; + + /** @var array Maximum fields size for admin panel forms */ + protected $fieldsSize = array(); + + /** @var array Fields validity functions for admin panel forms */ + protected $fieldsValidate = array(); + + /** @var array Multilingual required fields for admin panel forms */ + protected $fieldsRequiredLang = array(); + + /** @var array Multilingual maximum fields size for admin panel forms */ + protected $fieldsSizeLang = array(); + + /** @var array Multilingual fields validity functions for admin panel forms */ + protected $fieldsValidateLang = array(); + + protected $langMultiShop = false; + + /** @var array tables */ + protected $tables = array(); + + /** @var array tables */ + protected $webserviceParameters = array(); + + protected static $_cache = array(); + + /** @var string path to image directory. Used for image deletion. */ + protected $image_dir = NULL; + + /** @var string file type of image files. Used for image deletion. */ + protected $image_format = 'jpg'; + + /** + * Returns object validation rules (fields validity) + * + * @param string $className Child class name for static use (optional) + * @return array Validation rules (fields validity) + */ + static public function getValidationRules($className = __CLASS__) + { + $object = new $className(); + return array( + 'required' => $object->fieldsRequired, + 'size' => $object->fieldsSize, + 'validate' => $object->fieldsValidate, + 'requiredLang' => $object->fieldsRequiredLang, + 'sizeLang' => $object->fieldsSizeLang, + 'validateLang' => $object->fieldsValidateLang); + } + + /** + * Prepare fields for ObjectModel class (add, update) + * All fields are verified (pSQL, intval...) + * + * @return array All object fields + */ + public function getFields() { return array(); } + + /** + * Build object + * + * @param integer $id Existing object id in order to load object (optional) + * @param integer $id_lang Required if object is multilingual (optional) + */ + public function __construct($id = NULL, $id_lang = NULL, $id_shop = NULL) + { + if ($id_lang != NULL && Validate::isLoadedObject(new Language($id_lang))) + $this->id_lang = $id_lang; + elseif ($id_lang != NULL) + die(Tools::displayError()); + + if ($this->langMultiShop AND $id_shop == NULL) + $id_shop = (int)Shop::getCurrentShop(true); + if ($id_shop AND $this->langMultiShop) + $this->id_shop = $id_shop; + /* Connect to database and check SQL table/identifier */ + if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $this->identifier = pSQL($this->identifier); + /* Load object from database if object id is present */ + if ($id) + { + if (!isset(self::$_cache[$this->table][(int)$id][(int)$id_shop][(int)$id_lang])) + self::$_cache[$this->table][(int)($id)][(int)$id_shop][(int)$id_lang] = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.$this->table.'` a '. + ($id_lang ? ('LEFT JOIN `'.pSQL(_DB_PREFIX_.$this->table).'_lang` b ON (a.`'.$this->identifier.'` = b.`'.$this->identifier).'` AND `id_lang` = '.(int)($id_lang).')' : '') + .' WHERE 1 AND a.`'.$this->identifier.'` = '.(int)$id. + (($this->langMultiShop AND $id_shop AND $id_lang) ? ' AND b.id_shop='.(int)$id_shop : '')); + $result = self::$_cache[$this->table][(int)$id][(int)$id_shop][(int)$id_lang]; + if ($result) + { + $this->id = (int)($id); + foreach ($result AS $key => $value) + if (key_exists($key, $this)) + $this->{$key} = stripslashes($value); + + if (!$id_lang AND method_exists($this, 'getTranslationsFieldsChild')) + { + $result = Db::getInstance()->ExecuteS('SELECT * FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` + WHERE `'.$this->identifier.'` = '.(int)$id + .(($this->langMultiShop AND $id_shop) ? ' AND `id_shop`='.(int)$id_shop : '')); + if ($result) + foreach ($result as $row) + foreach ($row AS $key => $value) + { + if (key_exists($key, $this) AND $key != $this->identifier) + { + if (!is_array($this->{$key})) + $this->{$key} = array(); + if ($this->langMultiShop AND $id_shop) + $this->{$key}[$row['id_shop']][$row['id_lang']] = stripslashes($value); + else + $this->{$key}[$row['id_lang']] = stripslashes($value); + } + } + } + } + } + + if (!is_array(self::$fieldsRequiredDatabase)) + { + $fields = $this->getfieldsRequiredDatabase(true); + if ($fields) + foreach ($fields AS $row) + self::$fieldsRequiredDatabase[$row['object_name']][(int)$row['id_required_field']] = pSQL($row['field_name']); + else + self::$fieldsRequiredDatabase = array(); + } + } + + /** + * Save current object to database (add or update) + * + * return boolean Insertion result + */ + public function save($nullValues = false, $autodate = true) + { + return (int)($this->id) > 0 ? $this->update($nullValues) : $this->add($autodate, $nullValues); + } + + /** + * Add current object to database + * + * return boolean Insertion result + */ + public function add($autodate = true, $nullValues = false) + { + if (!Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + + /* Automatically fill dates */ + if ($autodate AND key_exists('date_add', $this)) + $this->date_add = date('Y-m-d H:i:s'); + if ($autodate AND key_exists('date_upd', $this)) + $this->date_upd = date('Y-m-d H:i:s'); + /* Database insertion */ + if ($nullValues) + $result = Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.$this->table, $this->getFields(), 'INSERT'); + else + $result = Db::getInstance()->autoExecute(_DB_PREFIX_.$this->table, $this->getFields(), 'INSERT'); + + if (!$result) + return false; + /* Get object id in database */ + $this->id = Db::getInstance()->Insert_ID(); + $assos = Shop::getAssoTables(); + /* Database insertion for multilingual fields related to the object */ + if (method_exists($this, 'getTranslationsFieldsChild')) + { + $fields = $this->getTranslationsFieldsChild(); + $shops = Shop::getShops(true, null, true); + if ($fields AND is_array($fields)) + foreach ($fields AS &$field) + { + foreach ($field AS $key => $value) + if (!Validate::isTableOrIdentifier($key)) + die(Tools::displayError()); + $field[$this->identifier] = (int)$this->id; + $result = Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'INSERT') && $result; + if (isset($assos[$this->table.'_lang']) && $assos[$this->table.'_lang']['type'] == 'fk_shop') + { + foreach ($shops as $id_shop) + { + if ($this->id_shop == (int)$id_shop) + continue; + $field['id_shop'] = (int)$id_shop; + $result = Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'INSERT') && $result; + } + } + } + } + + if(!Tools::isMultishopActivated()) + { + if (isset($assos[$this->table]) && $assos[$this->table]['type'] == 'shop') + $result &= $this->associateTo(array((int)Shop::getCurrentShop(true)), 'shop'); + $assos = GroupShop::getAssoTables(); + if (isset($assos[$this->table]) && $assos[$this->table]['type'] == 'group_shop') + $result &= $this->associateTo(array((int)Shop::getCurrentGroupShop()), 'group_shop'); + } + return $result; + } + + /** + * Update current object to database + * + * return boolean Update result + */ + public function update($nullValues = false) + { + if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + + $this->clearCache(); + /* Automatically fill dates */ + if (key_exists('date_upd', $this)) + $this->date_upd = date('Y-m-d H:i:s'); + + /* Database update */ + if ($nullValues) + $result = Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.$this->table, $this->getFields(), 'UPDATE', '`'.pSQL($this->identifier).'` = '.(int)($this->id)); + else + $result = Db::getInstance()->autoExecute(_DB_PREFIX_.$this->table, $this->getFields(), 'UPDATE', '`'.pSQL($this->identifier).'` = '.(int)($this->id)); + if (!$result) + return false; + + // Database update for multilingual fields related to the object + if (method_exists($this, 'getTranslationsFieldsChild')) + { + $fields = $this->getTranslationsFieldsChild(); + if (is_array($fields)) + { + foreach ($fields as $field) + { + foreach ($field as $key => $value) + if (!Validate::isTableOrIdentifier($key)) + die(Tools::displayError()); + + if ($this->langMultiShop) + $field['id_shop'] = ($this->id_shop ? $this->id_shop : Shop::getCurrentShop(true)); + + // used to insert missing lang entries + $where_lang = '`'.pSQL($this->identifier).'` = '.(int)$this->id. + ' AND `id_lang` = '.(int)$field['id_lang']. + (($this->langMultiShop AND $this->id_shop) ? ' AND `id_shop`='.$this->id_shop : ''); + + $lang_found = Db::getInstance()->getValue('SELECT COUNT(*) FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` WHERE '. $where_lang); + if (!$lang_found) + $result &= Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'INSERT'); + else + $result &= Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table.'_lang', $field, 'UPDATE', $where_lang); + } + } + } + return $result; + } + + /** + * Delete current object from database + * + * return boolean Deletion result + */ + public function delete() + { + if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + + $this->clearCache(); + + /* Database deletion */ + $result = Db::getInstance()->Execute('DELETE FROM `'.pSQL(_DB_PREFIX_.$this->table).'` WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + if (!$result) + return false; + + /* Database deletion for multilingual fields related to the object */ + if (method_exists($this, 'getTranslationsFieldsChild')) + Db::getInstance()->Execute('DELETE FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + return $result; + } + + /** + * Delete several objects from database + * + * return boolean Deletion result + */ + public function deleteSelection($selection) + { + if (!is_array($selection) OR !Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $result = true; + foreach ($selection AS $id) + { + $this->id = (int)($id); + $result = $result AND $this->delete(); + } + return $result; + } + + /** + * Toggle object status in database + * + * return boolean Update result + */ + public function toggleStatus() + { + if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + + /* Object must have a variable called 'active' */ + elseif (!key_exists('active', $this)) + die(Tools::displayError()); + + /* Update active status on object */ + $this->active = (int)(!$this->active); + + /* Change status to active/inactive */ + return Db::getInstance()->Execute(' + UPDATE `'.pSQL(_DB_PREFIX_.$this->table).'` + SET `active` = !`active` + WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + } + + /** + * Prepare multilingual fields for database insertion + * + * @param array $fieldsArray Multilingual fields to prepare + * return array Prepared fields for database insertion + */ + protected function getTranslationsFields($fieldsArray) + { + /* WARNING : Product do not use this function, so do not forget to report any modification if necessary */ + if (!Validate::isTableOrIdentifier($this->identifier)) + die(Tools::displayError()); + + $fields = array(); + + if($this->id_lang == NULL) + foreach (Language::getLanguages() as $language) + $this->makeTranslationFields($fields, $fieldsArray, $language['id_lang']); + else + $this->makeTranslationFields($fields, $fieldsArray, $this->id_lang); + + return $fields; + } + + protected function makeTranslationFields(&$fields, &$fieldsArray, $id_language) + { + $fields[$id_language]['id_lang'] = $id_language; + $fields[$id_language][$this->identifier] = (int)($this->id); + if ($this->id_shop AND $this->langMultiShop) + $fields[$id_language]['id_shop'] = (int)$this->id_shop; + foreach ($fieldsArray as $field) + { + /* Check fields validity */ + if (!Validate::isTableOrIdentifier($field)) + die(Tools::displayError()); + + /* Copy the field, or the default language field if it's both required and empty */ + if ((!$this->id_lang AND isset($this->{$field}[$id_language]) AND !empty($this->{$field}[$id_language])) + OR ($this->id_lang AND isset($this->$field) AND !empty($this->$field))) + $fields[$id_language][$field] = $this->id_lang ? pSQL($this->$field) : pSQL($this->{$field}[$id_language]); + elseif (in_array($field, $this->fieldsRequiredLang)) + $fields[$id_language][$field] = $this->id_lang ? pSQL($this->$field) : pSQL($this->{$field}[Configuration::get('PS_LANG_DEFAULT')]); + else + $fields[$id_language][$field] = ''; + } + } + + /** + * Check for fields validity before database interaction + */ + public function validateFields($die = true, $errorReturn = false) + { + $fieldsRequired = array_merge($this->fieldsRequired, (isset(self::$fieldsRequiredDatabase[get_class($this)]) ? self::$fieldsRequiredDatabase[get_class($this)] : array())); + foreach ($fieldsRequired as $field) + if (Tools::isEmpty($this->{$field}) AND (!is_numeric($this->{$field}))) + { + if ($die) die (Tools::displayError().' ('.get_class($this).' -> '.$field.' is empty)'); + return $errorReturn ? get_class($this).' -> '.$field.' is empty' : false; + } + foreach ($this->fieldsSize as $field => $size) + if (isset($this->{$field}) AND Tools::strlen($this->{$field}) > $size) + { + if ($die) die (Tools::displayError().' ('.get_class($this).' -> '.$field.' Length '.$size.')'); + return $errorReturn ? get_class($this).' -> '.$field.' Length '.$size : false; + } + $validate = new Validate(); + foreach ($this->fieldsValidate as $field => $method) + if (!method_exists($validate, $method)) + die (Tools::displayError('Validation function not found.').' '.$method); + elseif (!empty($this->{$field}) AND !call_user_func(array('Validate', $method), $this->{$field})) + { + if ($die) die (Tools::displayError().' ('.get_class($this).' -> '.$field.' = '.$this->{$field}.')'); + return $errorReturn ? get_class($this).' -> '.$field.' = '.$this->{$field} : false; + } + return true; + } + + /** + * Check for multilingual fields validity before database interaction + */ + public function validateFieldsLang($die = true, $errorReturn = false) + { + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + foreach ($this->fieldsRequiredLang as $fieldArray) + { + if (!is_array($this->{$fieldArray})) + continue ; + if (!$this->{$fieldArray} OR !sizeof($this->{$fieldArray}) OR ($this->{$fieldArray}[$defaultLanguage] !== '0' AND empty($this->{$fieldArray}[$defaultLanguage]))) + { + if ($die) die (Tools::displayError().' ('.get_class($this).'->'.$fieldArray.' '.Tools::displayError('is empty for default language.').')'); + return $errorReturn ? get_class($this).'->'.$fieldArray.' '.Tools::displayError('is empty for default language.') : false; + } + } + foreach ($this->fieldsSizeLang as $fieldArray => $size) + { + if (!is_array($this->{$fieldArray})) + continue ; + foreach ($this->{$fieldArray} as $k => $value) + if (Tools::strlen($value) > $size) + { + if ($die) die (Tools::displayError().' ('.get_class($this).'->'.$fieldArray.' '.Tools::displayError('Length').' '.$size.' '.Tools::displayError('for language').')'); + return $errorReturn ? get_class($this).'->'.$fieldArray.' '.Tools::displayError('Length').' '.$size.' '.Tools::displayError('for language') : false; + } + } + $validate = new Validate(); + foreach ($this->fieldsValidateLang as $fieldArray => $method) + { + if (!is_array($this->{$fieldArray})) + continue ; + foreach ($this->{$fieldArray} as $k => $value) + if (!method_exists($validate, $method)) + die (Tools::displayError('Validation function not found.').' '.$method); + elseif (!empty($value) AND !call_user_func(array('Validate', $method), $value)) + { + if ($die) die (Tools::displayError('The following field is invalid according to the validate method ').''.$method.':
('.get_class($this).'->'.$fieldArray.' = '.$value.' '.Tools::displayError('for language').' '.$k.')'); + return $errorReturn ? Tools::displayError('The following field is invalid according to the validate method ').''.$method.':
('. get_class($this).'->'.$fieldArray.' = '.$value.' '.Tools::displayError('for language').' '.$k : false; + } + } + return true; + } + + static public function displayFieldName($field, $className = __CLASS__, $htmlentities = true) + { + global $_FIELDS, $cookie; + $iso = strtolower(Language::getIsoById($cookie->id_lang ? (int)$cookie->id_lang : Configuration::get('PS_LANG_DEFAULT'))); + @include(_PS_TRANSLATIONS_DIR_.$iso.'/fields.php'); + + $key = $className.'_'.md5($field); + return ((is_array($_FIELDS) AND array_key_exists($key, $_FIELDS)) ? ($htmlentities ? htmlentities($_FIELDS[$key], ENT_QUOTES, 'utf-8') : $_FIELDS[$key]) : $field); + } + + /** + * TODO: refactor rename all calls to this to validateController + */ + public function validateControler($htmlentities = true) + { + return $this->validateController($htmlentities); + } + + public function validateController($htmlentities = true) + { + $errors = array(); + + /* Checking for required fields */ + $fieldsRequired = array_merge($this->fieldsRequired, (isset(self::$fieldsRequiredDatabase[get_class($this)]) ? self::$fieldsRequiredDatabase[get_class($this)] : array())); + foreach ($fieldsRequired AS $field) + if (($value = Tools::getValue($field, $this->{$field})) == false AND (string)$value != '0') + if (!$this->id OR $field != 'passwd') + $errors[] = ''.self::displayFieldName($field, get_class($this), $htmlentities).' '.Tools::displayError('is required.'); + + + /* Checking for maximum fields sizes */ + foreach ($this->fieldsSize AS $field => $maxLength) + if (($value = Tools::getValue($field, $this->{$field})) AND Tools::strlen($value) > $maxLength) + $errors[] = ''.self::displayFieldName($field, get_class($this), $htmlentities).' '.Tools::displayError('is too long.').' ('.Tools::displayError('Maximum length:').' '.$maxLength.')'; + + /* Checking for fields validity */ + foreach ($this->fieldsValidate AS $field => $function) + { + // Hack for postcode required for country which does not have postcodes + if ($value = Tools::getValue($field, $this->{$field}) OR ($field == 'postcode' AND $value == '0')) + { + if (!Validate::$function($value)) + $errors[] = ''.self::displayFieldName($field, get_class($this), $htmlentities).' '.Tools::displayError('is invalid.'); + else + { + if ($field == 'passwd') + { + if ($value = Tools::getValue($field)) + $this->{$field} = Tools::encrypt($value); + } + else + $this->{$field} = $value; + } + } + } + return $errors; + } + + public function getWebserviceParameters($wsParamsAttributeName = NULL) + { + $defaultResourceParameters = array( + 'objectSqlId' => $this->identifier, + 'retrieveData' => array( + 'className' => get_class($this), + 'retrieveMethod' => 'getWebserviceObjectList', + 'params' => array(), + 'table' => $this->table, + ), + 'fields' => array( + 'id' => array('sqlId' => $this->identifier, 'i18n' => false), + ), + ); + + if (is_null($wsParamsAttributeName)) + $wsParamsAttributeName = 'webserviceParameters'; + + + if (!isset($this->{$wsParamsAttributeName}['objectNodeName'])) + $defaultResourceParameters['objectNodeName'] = $this->table; + if (!isset($this->{$wsParamsAttributeName}['objectsNodeName'])) + $defaultResourceParameters['objectsNodeName'] = $this->table.'s'; + + if (isset($this->{$wsParamsAttributeName}['associations'])) + foreach ($this->{$wsParamsAttributeName}['associations'] as $assocName => &$association) + { + if (!array_key_exists('setter', $association) || (isset($association['setter']) && !$association['setter'])) + $association['setter'] = Tools::toCamelCase('set_ws_'.$assocName); + if (!array_key_exists('getter', $association)) + $association['getter'] = Tools::toCamelCase('get_ws_'.$assocName); + } + + + if (isset($this->{$wsParamsAttributeName}['retrieveData']) && isset($this->{$wsParamsAttributeName}['retrieveData']['retrieveMethod'])) + unset($defaultResourceParameters['retrieveData']['retrieveMethod']); + + $resourceParameters = array_merge_recursive($defaultResourceParameters, $this->{$wsParamsAttributeName}); + if (isset($this->fieldsSize)) + foreach ($this->fieldsSize as $fieldName => $maxSize) + { + if (!isset($resourceParameters['fields'][$fieldName])) + $resourceParameters['fields'][$fieldName] = array('required' => false); + $resourceParameters['fields'][$fieldName] = array_merge( + $resourceParameters['fields'][$fieldName], + $resourceParameters['fields'][$fieldName] = array('sqlId' => $fieldName, 'maxSize' => $maxSize, 'i18n' => false) + ); + } + if (isset($this->fieldsValidate)) + foreach ($this->fieldsValidate as $fieldName => $validateMethod) + { + if (!isset($resourceParameters['fields'][$fieldName])) + $resourceParameters['fields'][$fieldName] = array('required' => false); + $resourceParameters['fields'][$fieldName] = array_merge( + $resourceParameters['fields'][$fieldName], + $resourceParameters['fields'][$fieldName] = array( + 'sqlId' => $fieldName, + 'validateMethod' => ( + array_key_exists('validateMethod', $resourceParameters['fields'][$fieldName]) ? + array_merge($resourceParameters['fields'][$fieldName]['validateMethod'], array($validateMethod)) : + array($validateMethod) + ), + 'i18n' => false + ) + ); + } + if (isset($this->fieldsRequired)) + { + $fieldsRequired = array_merge($this->fieldsRequired, (isset(self::$fieldsRequiredDatabase[get_class($this)]) ? self::$fieldsRequiredDatabase[get_class($this)] : array())); + foreach ($fieldsRequired as $fieldRequired) + { + if (!isset($resourceParameters['fields'][$fieldRequired])) + $resourceParameters['fields'][$fieldRequired] = array(); + $resourceParameters['fields'][$fieldRequired] = array_merge( + $resourceParameters['fields'][$fieldRequired], + $resourceParameters['fields'][$fieldRequired] = array('sqlId' => $fieldRequired, 'required' => true, 'i18n' => false) + ); + } + } + if (isset($this->fieldsSizeLang)) + foreach ($this->fieldsSizeLang as $fieldName => $maxSize) + { + if (!isset($resourceParameters['fields'][$fieldName])) + $resourceParameters['fields'][$fieldName] = array('required' => false); + $resourceParameters['fields'][$fieldName] = array_merge( + $resourceParameters['fields'][$fieldName], + $resourceParameters['fields'][$fieldName] = array('sqlId' => $fieldName, 'maxSize' => $maxSize, 'i18n' => true) + ); + } + if (isset($this->fieldsValidateLang)) + foreach ($this->fieldsValidateLang as $fieldName => $validateMethod) + { + if (!isset($resourceParameters['fields'][$fieldName])) + $resourceParameters['fields'][$fieldName] = array('required' => false); + $resourceParameters['fields'][$fieldName] = array_merge( + $resourceParameters['fields'][$fieldName], + $resourceParameters['fields'][$fieldName] = array( + 'sqlId' => $fieldName, + 'validateMethod' => ( + array_key_exists('validateMethod', $resourceParameters['fields'][$fieldName]) ? + array_merge($resourceParameters['fields'][$fieldName]['validateMethod'], array($validateMethod)) : + array($validateMethod) + ), + 'i18n' => true + ) + ); + } + + if (isset($this->fieldsRequiredLang)) + foreach ($this->fieldsRequiredLang as $field) + { + if (!isset($resourceParameters['fields'][$field])) + $resourceParameters['fields'][$field] = array(); + $resourceParameters['fields'][$field] = array_merge( + $resourceParameters['fields'][$field], + $resourceParameters['fields'][$field] = array('sqlId' => $field, 'required' => true, 'i18n' => true) + ); + } + + if (isset($this->date_add)) + $resourceParameters['fields']['date_add']['setter'] = false; + if (isset($this->date_upd)) + $resourceParameters['fields']['date_upd']['setter'] = false; + + foreach ($resourceParameters['fields'] as $key => &$resourceParametersField) + if (!isset($resourceParametersField['sqlId'])) + $resourceParametersField['sqlId'] = $key; + return $resourceParameters; + } + + public function getWebserviceObjectList($sql_join, $sql_filter, $sql_sort, $sql_limit) + { + $assoc = Shop::getAssoTables(); + + if (array_key_exists($this->table ,$assoc)) + { + $multi_shop_join = ' LEFT JOIN `'._DB_PREFIX_.$this->table.'_'.$assoc[$this->table]['type'].'` AS multi_shop_'.$this->table.' ON (main.'.$this->identifier.' = '.'multi_shop_'.$this->table.'.'.$this->identifier.')'; + $class_name = WebserviceRequest::$ws_current_classname; + foreach ($class_name::$shopIDs as $id_shop) + $OR[] = ' multi_shop_'.$this->table.'.id_shop = '.$id_shop.' '; + $multi_shop_filter = ' AND ('.implode('OR', $OR).') '; + $sql_filter = $multi_shop_filter.' '.$sql_filter; + $sql_join = $multi_shop_join .' '. $sql_join; + } + $query = ' + SELECT DISTINCT main.`'.$this->identifier.'` FROM `'._DB_PREFIX_.$this->table.'` AS main + '.$sql_join.' + WHERE 1 '.$sql_filter.' + '.($sql_sort != '' ? $sql_sort : '').' + '.($sql_limit != '' ? $sql_limit : '').' + '; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($query); + } + + public function getFieldsRequiredDatabase($all = false) + { + return Db::getInstance()->ExecuteS(' + SELECT id_required_field, object_name, field_name + FROM '._DB_PREFIX_.'required_field + '.(!$all ? 'WHERE object_name = \''.pSQL(get_class($this)).'\'' : '')); + } + + public function addFieldsRequiredDatabase($fields) + { + if (!is_array($fields)) + return false; + + if (!Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'required_field WHERE object_name = \''.pSQL(get_class($this)).'\'')) + return false; + + foreach ($fields AS $field) + if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'required_field', array('object_name' => pSQL(get_class($this)), 'field_name' => pSQL($field)), 'INSERT')) + return false; + return true; + } + + public function clearCache($all = false) + { + if ($all AND isset(self::$_cache[$this->table])) + unset(self::$_cache[$this->table]); + elseif ($this->id AND isset(self::$_cache[$this->table][(int)$this->id])) + unset(self::$_cache[$this->table][(int)$this->id]); + } + + /** + * Check if current object is associated to a shop + * + * @since 1.5.0 + * @param int $id_shop + * @return bool + */ + public function isAssociatedToShop($id_shop = null) + { + if (is_null($id_shop)) + $id_shop = Shop::getCurrentShop(); + + $sql = 'SELECT id_shop + FROM `'.pSQL(_DB_PREFIX_.$this->table).'_shop` + WHERE `'.$this->identifier.'`='.(int)$this->id.' AND id_shop='.(int)$id_shop; + return (bool)Db::getInstance()->getValue($sql); + } + + /** + * This function associate an item to its context + * + * @param int|array $id_shops + * @param string $context + * @return boolean + */ + public function associateTo($id_shops, $context = 'shop') + { + if (!$this->id) + return; + $sql = ''; + if (!is_array($id_shops)) + $id_shops = array($id_shops); + + foreach ($id_shops as $id_shop) + { + if (!$this->isAssociatedToShop((int)$id_shop)) + $sql .= '('.(int)$this->id.','.(int)$id_shop.'),'; + } + + if (!empty($sql)) + return Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.$this->table.'_'.$context.'` (`'.$this->identifier.'`, `id_'.$context.'`) VALUES '.rtrim($sql,',')); + return true; + } + /** + * Check if current object is associated to a group shop + * + * @since 1.5.0 + * @param int $id_group_shop + * @return bool + */ + public function isAssociatedToGroupShop($id_group_shop = null) + { + if (is_null($id_group_shop)) + $id_shop = Shop::getCurrentGroupShop(); + + $sql = 'SELECT id_group_shop + FROM `'.pSQL(_DB_PREFIX_.$this->table).'_group_shop` + WHERE `'.$this->identifier.'`='.(int)$this->id.' AND id_group_shop='.(int)$id_group_shop; + return (bool)Db::getInstance()->getValue($sql); + } + + public function isLangMultishop() + { + return (int)$this->langMultiShop; + } + + /** + * Delete images associated with the object + * + * @return bool success + */ + public function deleteImage() + { + if (!$this->id) + return false; + + /* Deleting object images and thumbnails (cache) */ + if ($this->image_dir) + { + if (file_exists($this->image_dir.$this->id.'.'.$this->image_format) + && !unlink($this->image_dir.$this->id.'.'.$this->image_format)) + return false; + } + if (file_exists(_PS_TMP_IMG_DIR_.$this->table.'_'.$this->id.'.'.$this->image_format) + && !unlink(_PS_TMP_IMG_DIR_.$this->table.'_'.$this->id.'.'.$this->image_format)) + return false; + if (file_exists(_PS_TMP_IMG_DIR_.$this->table.'_mini_'.$this->id.'.'.$this->image_format) + && !unlink(_PS_TMP_IMG_DIR_.$this->table.'_mini_'.$this->id.'.'.$this->image_format)) + return false; + + $types = ImageType::getImagesTypes(); + foreach ($types AS $image_type) + if (file_exists($this->image_dir.$this->id.'-'.stripslashes($image_type['name']).'.'.$this->image_format) + && !unlink($this->image_dir.$this->id.'-'.stripslashes($image_type['name']).'.'.$this->image_format)) + return false; + return true; + } +} diff --git a/classes/Order.php b/classes/Order.php new file mode 100644 index 000000000..dd9d242b2 --- /dev/null +++ b/classes/Order.php @@ -0,0 +1,1057 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7331 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderCore extends ObjectModel +{ + /** @var integer Delivery address id */ + public $id_address_delivery; + + /** @var integer Invoice address id */ + public $id_address_invoice; + + public $id_group_shop; + + public $id_shop; + + /** @var integer Cart id */ + public $id_cart; + + /** @var integer Currency id */ + public $id_currency; + + /** @var integer Language id */ + public $id_lang; + + /** @var integer Customer id */ + public $id_customer; + + /** @var integer Carrier id */ + public $id_carrier; + + /** @var string Secure key */ + public $secure_key; + + /** @var string Payment method id */ + public $payment; + + /** @var string Payment module */ + public $module; + + /** @var float Currency conversion rate */ + public $conversion_rate; + + /** @var boolean Customer is ok for a recyclable package */ + public $recyclable = 1; + + /** @var boolean True if the customer wants a gift wrapping */ + public $gift = 0; + + /** @var string Gift message if specified */ + public $gift_message; + + /** @var string Shipping number */ + public $shipping_number; + + /** @var float Discounts total */ + public $total_discounts; + + /** @var float Total to pay */ + public $total_paid; + + /** @var float Total really paid */ + public $total_paid_real; + + /** @var float Products total */ + public $total_products; + + /** @var float Products total tax excluded */ + public $total_products_wt; + + /** @var float Shipping total */ + public $total_shipping; + + /** @var float Shipping tax rate */ + public $carrier_tax_rate; + + /** @var float Wrapping total */ + public $total_wrapping; + + /** @var integer Invoice number */ + public $invoice_number; + + /** @var integer Delivery number */ + public $delivery_number; + + /** @var string Invoice creation date */ + public $invoice_date; + + /** @var string Delivery creation date */ + public $delivery_date; + + /** @var boolean Order validity (paid and not canceled) */ + public $valid; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $tables = array ('orders'); + + protected $fieldsRequired = array('conversion_rate', 'id_address_delivery', 'id_address_invoice', 'id_cart', 'id_currency', 'id_lang', 'id_customer', 'id_carrier', 'payment', 'total_paid', 'total_paid_real', 'total_products', 'total_products_wt'); + protected $fieldsValidate = array( + 'id_address_delivery' => 'isUnsignedId', + 'id_address_invoice' => 'isUnsignedId', + 'id_cart' => 'isUnsignedId', + 'id_currency' => 'isUnsignedId', + 'id_group_shop' => 'isUnsignedId', + 'id_shop' => 'isUnsignedId', + 'id_lang' => 'isUnsignedId', + 'id_customer' => 'isUnsignedId', + 'id_carrier' => 'isUnsignedId', + 'secure_key' => 'isMd5', + 'payment' => 'isGenericName', + 'recyclable' => 'isBool', + 'gift' => 'isBool', + 'gift_message' => 'isMessage', + 'total_discounts' => 'isPrice', + 'total_paid' => 'isPrice', + 'total_paid_real' => 'isPrice', + 'total_products' => 'isPrice', + 'total_products_wt' => 'isPrice', + 'total_shipping' => 'isPrice', + 'carrier_tax_rate' => 'isFloat', + 'total_wrapping' => 'isPrice', + 'shipping_number' => 'isUrl', + 'conversion_rate' => 'isFloat' + ); + + protected $webserviceParameters = array( + 'objectMethods' => array('add' => 'addWs'), + 'objectNodeName' => 'order', + 'objectsNodeName' => 'orders', + 'fields' => array( + 'id_address_delivery' => array('xlink_resource'=> 'addresses'), + 'id_address_invoice' => array('xlink_resource'=> 'addresses'), + 'id_cart' => array('xlink_resource'=> 'carts'), + 'id_currency' => array('xlink_resource'=> 'currencies'), + 'id_lang' => array('xlink_resource'=> 'languages'), + 'id_customer' => array('xlink_resource'=> 'customers'), + 'id_carrier' => array('xlink_resource'=> 'carriers'), + 'module' => array('required' => true), + 'invoice_number' => array(), + 'delivery_number' => array(), + 'invoice_date' => array(), + 'delivery_date' => array(), + 'valid' => array(), + 'current_state' => array('getter' => 'getCurrentState', 'setter' => 'setCurrentState', 'xlink_resource'=> 'order_states'), + 'date_add' => array(), + 'date_upd' => array(), + ), + 'associations' => array( + 'order_rows' => array('resource' => 'order_row', 'setter' => false, 'virtual_entity' => true, + 'fields' => array( + 'id' => array(), + 'product_id' => array('required' => true), + 'product_attribute_id' => array('required' => true), + 'product_quantity' => array('required' => true), + 'product_name' => array('setter' => false), + 'product_price' => array('setter' => false), + )), + ), + + ); + + /* MySQL does not allow 'order' for a table name */ + protected $table = 'orders'; + protected $identifier = 'id_order'; + protected $_taxCalculationMethod = PS_TAX_EXC; + + protected static $_historyCache = array(); + + public function getFields() + { + parent::validateFields(); + + $fields['id_group_shop'] = (int)$this->id_group_shop; + $fields['id_shop'] = (int)$this->id_shop; + $fields['id_address_delivery'] = (int)($this->id_address_delivery); + $fields['id_address_invoice'] = (int)($this->id_address_invoice); + $fields['id_cart'] = (int)$this->id_cart; + $fields['id_currency'] = (int)($this->id_currency); + $fields['id_lang'] = (int)($this->id_lang); + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_carrier'] = (int)($this->id_carrier); + $fields['secure_key'] = pSQL($this->secure_key); + $fields['payment'] = pSQL($this->payment); + $fields['module'] = pSQL($this->module); + $fields['conversion_rate'] = (float)($this->conversion_rate); + $fields['recyclable'] = (int)($this->recyclable); + $fields['gift'] = (int)($this->gift); + $fields['gift_message'] = pSQL($this->gift_message); + $fields['shipping_number'] = pSQL($this->shipping_number); + $fields['total_discounts'] = (float)($this->total_discounts); + $fields['total_paid'] = (float)($this->total_paid); + $fields['total_paid_real'] = (float)($this->total_paid_real); + $fields['total_products'] = (float)($this->total_products); + $fields['total_products_wt'] = (float)($this->total_products_wt); + $fields['total_shipping'] = (float)($this->total_shipping); + $fields['carrier_tax_rate'] = (float)($this->carrier_tax_rate); + $fields['total_wrapping'] = (float)($this->total_wrapping); + $fields['invoice_number'] = (int)($this->invoice_number); + $fields['delivery_number'] = (int)($this->delivery_number); + $fields['invoice_date'] = pSQL($this->invoice_date); + $fields['delivery_date'] = pSQL($this->delivery_date); + $fields['valid'] = (int)($this->valid) ? 1 : 0; + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + + return $fields; + } + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id, $id_lang); + if ($this->id_customer) + { + $customer = new Customer((int)($this->id_customer)); + $this->_taxCalculationMethod = Group::getPriceDisplayMethod((int)($customer->id_default_group)); + } + else + $this->_taxCalculationMethod = Group::getDefaultPriceDisplayMethod(); + } + + public function getTaxCalculationMethod() + { + return (int)($this->_taxCalculationMethod); + } + + /* Does NOT delete a product but "cancel" it (which means return/refund/delete it depending of the case) */ + public function deleteProduct($order, $orderDetail, $quantity) + { + if (!$currentStatus = (int)($this->getCurrentState())) + return false; + + if ($this->hasBeenDelivered()) + { + if (!Configuration::get('PS_ORDER_RETURN')) + die(Tools::displayError()); + $orderDetail->product_quantity_return += (int)($quantity); + return $orderDetail->update(); + } + elseif ($this->hasBeenPaid()) + { + $orderDetail->product_quantity_refunded += (int)($quantity); + return $orderDetail->update(); + } + return $this->_deleteProduct($orderDetail, (int)($quantity)); + } + + /* DOES delete the product */ + protected function _deleteProduct($orderDetail, $quantity) + { + $price = $orderDetail->product_price * (1 + $orderDetail->tax_rate * 0.01); + if ($orderDetail->reduction_percent != 0.00) + $reduction_amount = $price * $orderDetail->reduction_percent / 100; + elseif ($orderDetail->reduction_amount != '0.000000') + $reduction_amount = Tools::ps_round($orderDetail->reduction_amount, 2); + if (isset($reduction_amount) AND $reduction_amount) + $price = Tools::ps_round($price - $reduction_amount, 2); + $productPriceWithoutTax = number_format($price / (1 + $orderDetail->tax_rate * 0.01), 2, '.', ''); + $price += Tools::ps_round($orderDetail->ecotax * (1 + $orderDetail->ecotax_tax_rate / 100), 2); + $productPrice = number_format($quantity * $price, 2, '.', ''); + /* Update cart */ + $cart = new Cart($this->id_cart); + $cart->updateQty($quantity, $orderDetail->product_id, $orderDetail->product_attribute_id, false, 'down'); // customization are deleted in deleteCustomization + $cart->update(); + + /* Update order */ + $shippingDiff = $this->total_shipping - $cart->getOrderShippingCost(); + $this->total_products -= $productPriceWithoutTax; + $this->total_products_wt -= $productPrice; + $this->total_shipping = $cart->getOrderShippingCost(); + + /* It's temporary fix for 1.3 version... */ + if ($orderDetail->product_quantity_discount != '0.000000') + $this->total_paid -= ($productPrice + $shippingDiff); + else + $this->total_paid = $cart->getOrderTotal(); + + $this->total_paid_real -= ($productPrice + $shippingDiff); + + /* Prevent from floating precision issues (total_products has only 2 decimals) */ + if ($this->total_products < 0) + $this->total_products = 0; + + if ($this->total_paid < 0) + $this->total_paid = 0; + + if ($this->total_paid_real < 0) + $this->total_paid_real = 0; + + /* Prevent from floating precision issues */ + $this->total_paid = number_format($this->total_paid, 2, '.', ''); + $this->total_paid_real = number_format($this->total_paid_real, 2, '.', ''); + $this->total_products = number_format($this->total_products, 2, '.', ''); + $this->total_products_wt = number_format($this->total_products_wt, 2, '.', ''); + + /* Update order detail */ + $orderDetail->product_quantity -= (int)($quantity); + + if (!$orderDetail->product_quantity) + { + if (!$orderDetail->delete()) + return false; + if (count($this->getProductsDetail()) == 0) + { + global $cookie; + $history = new OrderHistory(); + $history->id_order = (int)($this->id); + $history->changeIdOrderState(_PS_OS_CANCELED_, (int)($this->id)); + if (!$history->addWithemail()) + return false; + } + return $this->update(); + } + return $orderDetail->update() AND $this->update(); + } + + public function deleteCustomization($id_customization, $quantity, $orderDetail) + { + if (!$currentStatus = (int)($this->getCurrentState())) + return false; + + if ($this->hasBeenDelivered()) + return Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customization` SET `quantity_returned` = `quantity_returned` + '.(int)($quantity).' WHERE `id_customization` = '.(int)($id_customization).' AND `id_cart` = '.(int)($this->id_cart).' AND `id_product` = '.(int)($orderDetail->product_id)); + elseif ($this->hasBeenPaid()) + return Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customization` SET `quantity_refunded` = `quantity_refunded` + '.(int)($quantity).' WHERE `id_customization` = '.(int)($id_customization).' AND `id_cart` = '.(int)($this->id_cart).' AND `id_product` = '.(int)($orderDetail->product_id)); + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customization` SET `quantity` = `quantity` - '.(int)($quantity).' WHERE `id_customization` = '.(int)($id_customization).' AND `id_cart` = '.(int)($this->id_cart).' AND `id_product` = '.(int)($orderDetail->product_id))) + return false; + if (!Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization` WHERE `quantity` = 0')) + return false; + return $this->_deleteProduct($orderDetail, (int)($quantity)); + } + + /** + * Get order history + * + * @param integer $id_lang Language id + * + * @return array History entries ordered by date DESC + */ + public function getHistory($id_lang, $id_order_state = false, $no_hidden = false) + { + if (!$id_order_state) + $id_order_state = 0; + + if (!isset(self::$_historyCache[$id_order_state]) OR $no_hidden) + { + $id_lang = $id_lang ? (int)($id_lang) : 'o.`id_lang`'; + $result = Db::getInstance()->ExecuteS(' + SELECT oh.*, e.`firstname` AS employee_firstname, e.`lastname` AS employee_lastname, osl.`name` AS ostate_name + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON o.`id_order` = oh.`id_order` + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON os.`id_order_state` = oh.`id_order_state` + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'employee` e ON e.`id_employee` = oh.`id_employee` + WHERE oh.id_order = '.(int)($this->id).' + '.($no_hidden ? ' AND os.hidden = 0' : '').' + '.((int)($id_order_state) ? ' AND oh.`id_order_state` = '.(int)($id_order_state) : '').' + ORDER BY oh.date_add DESC, oh.id_order_history DESC'); + if ($no_hidden) + return $result; + self::$_historyCache[$id_order_state] = $result; + } + return self::$_historyCache[$id_order_state]; + } + + public function getProductsDetail() + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_detail` od + WHERE od.`id_order` = '.(int)($this->id)); + } + + + /** + * @return string + * @deprecated + */ + public function getLastMessage() + { + Tools::displayAsDeprecated(); + $sql = 'SELECT `message` FROM `'._DB_PREFIX_.'message` WHERE `id_order` = '.(int)($this->id).' ORDER BY `id_message` desc'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return $result['message']; + } + + public function getFirstMessage() + { + $sql = 'SELECT `message` FROM `'._DB_PREFIX_.'message` WHERE `id_order` = '.(int)($this->id).' ORDER BY `id_message` asc'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return $result['message']; + } + + public function setProductPrices(&$row) + { + if ($this->_taxCalculationMethod == PS_TAX_EXC) + $row['product_price'] = Tools::ps_round($row['product_price'], 2); + else + $row['product_price_wt'] = Tools::ps_round($row['product_price'] * (1 + $row['tax_rate'] / 100), 2); + + $group_reduction = 1; + if ($row['group_reduction'] > 0) + $group_reduction = $row['group_reduction'] / 100; + + if ($row['reduction_percent']) + { + if ($this->_taxCalculationMethod == PS_TAX_EXC) + $row['product_price'] = $row['product_price'] - $row['product_price'] * ($row['reduction_percent'] * 0.01 * $group_reduction); + else + $row['product_price_wt'] = Tools::ps_round($row['product_price_wt'] - $row['product_price_wt'] * ($row['reduction_percent'] * 0.01 * $group_reduction), 2); + } + + if ($row['reduction_amount']) + { + if ($this->_taxCalculationMethod == PS_TAX_EXC) + $row['product_price'] = $row['product_price'] - ($row['reduction_amount'] / (1 + $row['tax_rate'] / 100)) * $group_reduction; + else + $row['product_price_wt'] = Tools::ps_round($row['product_price_wt'] - $row['reduction_amount'] * $group_reduction, 2); + } + + if (($row['reduction_percent'] OR $row['reduction_amount'] OR $row['group_reduction']) AND $this->_taxCalculationMethod == PS_TAX_EXC) + $row['product_price'] = Tools::ps_round($row['product_price'], 2); + + if ($this->_taxCalculationMethod == PS_TAX_EXC) + $row['product_price_wt'] = Tools::ps_round($row['product_price'] * (1 + ($row['tax_rate'] * 0.01)), 2) + Tools::ps_round($row['ecotax'] * (1 + $row['ecotax_tax_rate'] / 100), 2); + else + { + $row['product_price_wt_but_ecotax'] = $row['product_price_wt']; + $row['product_price_wt'] = Tools::ps_round($row['product_price_wt'] + $row['ecotax'] * (1 + $row['ecotax_tax_rate'] / 100), 2); + } + + $row['total_wt'] = $row['product_quantity'] * $row['product_price_wt']; + $row['total_price'] = $row['product_quantity'] * $row['product_price']; + } + + /** + * Get order products + * + * @return array Products with price, quantity (with taxe and without) + */ + public function getProducts($products = false, $selectedProducts = false, $selectedQty = false) + { + if (!$products) + $products = $this->getProductsDetail(); + $resultArray = array(); + foreach ($products AS $k => $row) + { + // Change qty if selected + if ($selectedQty) + { + $row['product_quantity'] = 0; + foreach ($selectedProducts AS $key => $id_product) + if ($row['id_order_detail'] == $id_product) + $row['product_quantity'] = (int)($selectedQty[$key]); + if (!$row['product_quantity']) + continue ; + } + $this->setProductPrices($row); + + /* Add information for virtual product */ + if ($row['download_hash'] AND !empty($row['download_hash'])) + $row['filename'] = ProductDownload::getFilenameFromIdProduct($row['product_id']); + + /* Stock product */ + $resultArray[(int)($row['id_order_detail'])] = $row; + } + return $resultArray; + } + + public function getTaxesAverageUsed() + { + return Cart::getTaxesAverageUsed((int)($this->id_cart)); + } + + /** + * Count virtual products in order + * + * @return int number of virtual products + */ + public function getVirtualProducts() + { + $sql = ' + SELECT `product_id`, `download_hash`, `download_deadline` + FROM `'._DB_PREFIX_.'order_detail` od + WHERE od.`id_order` = '.(int)($this->id).' + AND `download_hash` <> \'\''; + return Db::getInstance()->ExecuteS($sql); + } + + /** + * Check if order contains (only) virtual products + * @return boolean true if is a virtual order or false + * + */ + public function isVirtual($strict = true) + { + $products = $this->getProducts(); + if (count($products) < 1) + return false; + $virtual = false; + foreach ($products AS $product) + { + $pd = ProductDownload::getIdFromIdProduct((int)($product['product_id'])); + if ($pd AND Validate::isUnsignedInt($pd) AND $product['download_hash']) + { + if ($strict === false) + return true; + $virtual &= true; + } + } + return $virtual; + } + + + /** + * Get order discounts + * + * @return array Discounts with price and quantity + */ + public function getDiscounts($details = false) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_discount` od '. + ($details ? 'LEFT JOIN `'._DB_PREFIX_.'discount` d ON (d.`id_discount` = od.`id_discount`)' : '').' + WHERE od.`id_order` = '.(int)($this->id)); + } + + static public function getDiscountsCustomer($id_customer, $id_discount) + { + return Db::getInstance()->getValue(' + SELECT COUNT(*) FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN '._DB_PREFIX_.'order_discount od ON (od.id_order = o.id_order) + WHERE o.id_customer = '.(int)($id_customer).' + AND od.id_discount = '.(int)($id_discount)); + } + + /** + * Get current order state (eg. Awaiting payment, Delivered...) + * + * @return array Order state details + */ + public function getCurrentState() + { + $orderHistory = OrderHistory::getLastOrderState($this->id); + if (!isset($orderHistory) OR !$orderHistory) + return false; + return $orderHistory->id; + } + + /** + * Get current order state name (eg. Awaiting payment, Delivered...) + * + * @return array Order state details + */ + public function getCurrentStateFull($id_lang) + { + return Db::getInstance()->getRow(' + SELECT oh.`id_order_state`, osl.`name`, os.`logable` + FROM `'._DB_PREFIX_.'order_history` oh + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (osl.`id_order_state` = oh.`id_order_state`) + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`) + WHERE osl.`id_lang` = '.(int)($id_lang).' AND oh.`id_order` = '.(int)($this->id).' + ORDER BY `date_add` DESC, `id_order_history` DESC'); + } + + /** + * @deprecated + */ + public function isLogable() + { + Tools::displayAsDeprecated(); + return $this->valid; + } + + public function hasBeenDelivered() + { + return sizeof($this->getHistory((int)($this->id_lang), _PS_OS_DELIVERED_)); + } + + public function hasBeenPaid() + { + return sizeof($this->getHistory((int)($this->id_lang), _PS_OS_PAYMENT_)); + } + + public function hasBeenShipped() + { + return sizeof($this->getHistory((int)($this->id_lang), _PS_OS_SHIPPING_)); + } + + public function isInPreparation() + { + return sizeof($this->getHistory((int)($this->id_lang), _PS_OS_PREPARATION_)); + } + + /** + * Get customer orders + * + * @param integer $id_customer Customer id + * @param boolean $showHiddenStatus Display or not hidden order statuses + * @return array Customer orders + */ + static public function getCustomerOrders($id_customer, $showHiddenStatus = false) + { + global $cookie; + + $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT o.*, (SELECT SUM(od.`product_quantity`) FROM `'._DB_PREFIX_.'order_detail` od WHERE od.`id_order` = o.`id_order`) nb_products + FROM `'._DB_PREFIX_.'orders` o + WHERE o.`id_customer` = '.(int)$id_customer.' + GROUP BY o.`id_order` + ORDER BY o.`date_add` DESC'); + if (!$res) + return array(); + + foreach ($res AS $key => $val) + { + $res2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT os.`id_order_state`, osl.`name` AS order_state, os.`invoice` + FROM `'._DB_PREFIX_.'order_history` oh + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`) + INNER JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)($cookie->id_lang).') + WHERE oh.`id_order` = '.(int)($val['id_order']).(!$showHiddenStatus ? ' AND os.`hidden` != 1' : '').' + ORDER BY oh.`date_add` DESC, oh.`id_order_history` DESC + LIMIT 1'); + if ($res2) + $res[$key] = array_merge($res[$key], $res2[0]); + } + return $res; + } + + static public function getOrdersIdByDate($date_from, $date_to, $id_customer = NULL, $type = NULL) + { + $sql = 'SELECT `id_order` + FROM `'._DB_PREFIX_.'orders` + WHERE DATE_ADD(date_upd, INTERVAL -1 DAY) <= \''.pSQL($date_to).'\' AND date_upd >= \''.pSQL($date_from).'\' + AND id_shop IN('.implode(', ', Shop::getListFromContext()).')' + .($type ? ' AND '.pSQL(strval($type)).'_number != 0' : '') + .($id_customer ? ' AND id_customer = '.(int)($id_customer) : ''); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + $orders = array(); + foreach ($result AS $order) + $orders[] = (int)($order['id_order']); + return $orders; + } + + /* + * @deprecated + */ + static public function getOrders($limit = NULL) + { + Tools::displayAsDeprecated(); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'orders` + ORDER BY `date_add` + '.((int)$limit ? 'LIMIT 0, '.(int)$limit : '')); + } + + static public function getOrdersWithInformations($limit = NULL) + { + global $cookie; + + $sql = 'SELECT *, ( + SELECT `name` + FROM `'._DB_PREFIX_.'order_history` oh + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (osl.`id_order_state` = oh.`id_order_state`) + WHERE oh.`id_order` = o.`id_order` + AND osl.`id_lang` = '.(int)$cookie->id_lang.' + ORDER BY oh.`date_add` DESC + LIMIT 1 + ) AS `state_name` + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = o.`id_customer`) + WHERE o.id_shop IN('.implode(', ', Shop::getListFromContext()).') + ORDER BY o.`date_add` DESC + '.((int)$limit ? 'LIMIT 0, '.(int)$limit : ''); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + static public function getOrdersIdInvoiceByDate($date_from, $date_to, $id_customer = NULL, $type = NULL) + { + $sql = 'SELECT `id_order` + FROM `'._DB_PREFIX_.'orders` + WHERE DATE_ADD(invoice_date, INTERVAL -1 DAY) <= \''.pSQL($date_to).'\' AND invoice_date >= \''.pSQL($date_from).'\' + AND id_shop IN('.implode(', ', Shop::getListFromContext()).')' + .($type ? ' AND '.pSQL(strval($type)).'_number != 0' : '') + .($id_customer ? ' AND id_customer = '.(int)($id_customer) : ''). + ' ORDER BY invoice_date ASC'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + $orders = array(); + foreach ($result AS $order) + $orders[] = (int)($order['id_order']); + return $orders; + } + + static public function getOrderIdsByStatus($id_order_state) + { + $sql = 'SELECT id_order + FROM '._DB_PREFIX_.'orders o + WHERE '.(int)$id_order_state.' = ( + SELECT id_order_state + FROM '._DB_PREFIX_.'order_history oh + WHERE oh.id_order = o.id_order + ORDER BY date_add DESC, id_order_history DESC + LIMIT 1 + ) + AND o.id_shop IN('.implode(', ', Shop::getListFromContext()).') + ORDER BY invoice_date ASC'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + $orders = array(); + foreach ($result AS $order) + $orders[] = (int)($order['id_order']); + return $orders; + } + + /** + * Get product total without taxes + * + * @return Product total with taxes + */ + public function getTotalProductsWithoutTaxes($products = false) + { + return $this->total_products; + } + + /** + * Get product total with taxes + * + * @return Product total with taxes + */ + public function getTotalProductsWithTaxes($products = false) + { + if ($this->total_products_wt != '0.00' AND !$products) + return $this->total_products_wt; + /* Retro-compatibility (now set directly on the validateOrder() method) */ + if (!$products) + $products = $this->getProductsDetail(); + + $return = 0; + foreach ($products AS $k => $row) + { + $price = Tools::ps_round($row['product_price'] * (1 + $row['tax_rate'] / 100), 2); + if ($row['reduction_percent']) + $price -= $price * ($row['reduction_percent'] * 0.01); + if ($row['reduction_amount']) + $price -= $row['reduction_amount'] * (1 + ($row['tax_rate'] * 0.01)); + if ($row['group_reduction']) + $price -= $price * ($row['group_reduction'] * 0.01); + $price += $row['ecotax'] * (1 + $row['ecotax_tax_rate'] / 100); + $return += Tools::ps_round($price, 2) * $row['product_quantity']; + } + if (!$products) + { + $this->total_products_wt = $return; + $this->update(); + } + return $return; + } + + /** + * Get customer orders number + * + * @param integer $id_customer Customer id + * @return array Customer orders number + */ + static public function getCustomerNbOrders($id_customer) + { + $sql = 'SELECT COUNT(`id_order`) AS nb + FROM `'._DB_PREFIX_.'orders` + WHERE `id_customer` = '.(int)($id_customer) + .' AND id_shop IN('.implode(', ', Shop::getListFromContext()).')'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + + return isset($result['nb']) ? $result['nb'] : 0; + } + + /** + * Get an order by its cart id + * + * @param integer $id_cart Cart id + * @return array Order details + */ + static public function getOrderByCartId($id_cart) + { + $sql = 'SELECT `id_order` + FROM `'._DB_PREFIX_.'orders` + WHERE `id_cart` = '.(int)($id_cart) + .' AND id_shop IN('.implode(', ', Shop::getListFromContext()).')'; + $result = Db::getInstance()->getRow($sql); + + return isset($result['id_order']) ? $result['id_order'] : false; + } + + /** + * Add a discount to order + * + * @param integer $id_discount Discount id + * @param string $name Discount name + * @param float $value Discount value + * @return boolean Query sucess or not + */ + public function addDiscount($id_discount, $name, $value) + { + return Db::getInstance()->AutoExecute(_DB_PREFIX_.'order_discount', array('id_order' => (int)($this->id), 'id_discount' => (int)($id_discount), 'name' => pSQL($name), 'value' => (float)($value)), 'INSERT'); + } + + /** + * Get orders number last week + * + * @return integer Orders number last week + * @deprecated + */ + public static function getWeeklyOrders() + { + Tools::displayAsDeprecated(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(`id_order`) as nb + FROM `'._DB_PREFIX_.'orders` + WHERE YEARWEEK(`date_add`) = YEARWEEK(NOW())'); + + return isset($result['nb']) ? $result['nb'] : 0; + } + + /** + * Get sales amount last month + * + * @return float Sales amount last month + * @deprecated + */ + public static function getMonthlySales() + { + Tools::displayAsDeprecated(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT SUM(`total_paid`) as nb + FROM `'._DB_PREFIX_.'orders` + WHERE MONTH(`date_add`) = MONTH(NOW()) + AND YEAR(`date_add`) = YEAR(NOW())'); + + return isset($result['nb']) ? $result['nb'] : 0; + } + + public function getNumberOfDays() + { + $nbReturnDays = (int)(Configuration::get('PS_ORDER_RETURN_NB_DAYS')); + if (!$nbReturnDays) + return true; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT TO_DAYS(NOW()) - TO_DAYS(`delivery_date`) AS days FROM `'._DB_PREFIX_.'orders` + WHERE `id_order` = '.(int)($this->id)); + if ($result['days'] <= $nbReturnDays) + return true; + return false; + } + + + public function isReturnable() + { + $payment = $this->getHistory((int)($this->id_lang), _PS_OS_PAYMENT_); + $delivred = $this->getHistory((int)($this->id_lang), _PS_OS_DELIVERED_); + if ($payment AND $delivred AND strtotime($delivred[0]['date_add']) < strtotime($payment[0]['date_add'])) + return ((int)(Configuration::get('PS_ORDER_RETURN')) == 1 AND $this->getNumberOfDays()); + else + return ((int)(Configuration::get('PS_ORDER_RETURN')) == 1 AND (int)($this->getCurrentState()) == _PS_OS_DELIVERED_ AND $this->getNumberOfDays()); + } + + + public static function getLastInvoiceNumber() + { + return (int)Db::getInstance()->getValue(' + SELECT MAX(`invoice_number`) AS `invoice_number` + FROM `'._DB_PREFIX_.'orders`'); + } + + public function setInvoice() + { + $number = (int)Configuration::get('PS_INVOICE_START_NUMBER'); + + if ($number) + Configuration::updateValue('PS_INVOICE_START_NUMBER', false); + else + $number = Order::getLastInvoiceNumber() + 1; + + // a way to avoid duplicate invoice number + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'orders` + SET `invoice_number` = '.$number.', `invoice_date` = \''.date('Y-m-d H:i:s').'\' + WHERE `id_order` = '.(int)$this->id + ); + + $res = Db::getInstance()->getRow(' + SELECT `invoice_number`, `invoice_date` + FROM `'._DB_PREFIX_.'orders` + WHERE `id_order` = '.(int)$this->id + ); + + $this->invoice_date = $res['invoice_date']; + $this->invoice_number = $res['invoice_number']; + } + + public function setDelivery() + { + // Set delivery number + $number = (int)(Configuration::get('PS_DELIVERY_NUMBER')); + if (!(int)($number)) + die(Tools::displayError('Invalid delivery number')); + $this->delivery_number = $number; + Configuration::updateValue('PS_DELIVERY_NUMBER', $number + 1); + + // Set delivery date + $this->delivery_date = date('Y-m-d H:i:s'); + + // Update object + $this->update(); + } + + static public function printPDFIcons($id_order, $tr) + { + $order = new Order($id_order); + $orderState = OrderHistory::getLastOrderState($id_order); + if (!Validate::isLoadedObject($orderState) OR !Validate::isLoadedObject($order)) + die(Tools::displayError('Invalid objects')); + echo ''; + if (($orderState->invoice AND $order->invoice_number) AND (int)($tr['product_number'])) + echo 'invoice'; + else + echo ' '; + echo ''; + echo ''; + if ($orderState->delivery AND $order->delivery_number) + echo 'delivery'; + else + echo ' '; + echo ''; + } + + static public function getByDelivery($id_delivery) + { + $sql = 'SELECT id_order + FROM `'._DB_PREFIX_.'orders` + WHERE `delivery_number` = '.(int)($id_delivery).' + AND id_shop IN('.implode(', ', Shop::getListFromContext()).')'; + $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return new Order((int)($res['id_order'])); + } + + public function getTotalWeight() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT SUM(product_weight * product_quantity) weight + FROM '._DB_PREFIX_.'order_detail + WHERE id_order = '.(int)($this->id)); + + return (float)($result['weight']); + } + + static public function getInvoice($id_invoice) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `invoice_number`, `id_order` + FROM `'._DB_PREFIX_.'orders` + WHERE invoice_number = '.(int)($id_invoice)); + } + + public function isAssociatedAtGuest($email) + { + if (!$email) + return false; + $sql = 'SELECT COUNT(*) + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = o.`id_customer`) + WHERE o.`id_order` = '.(int)$this->id.' + AND c.`email` = \''.pSQL($email).'\' + AND c.`is_guest` = 1 + AND c.id_shop IN('.implode(', ', Shop::getListFromContext()).')'; + return (bool)Db::getInstance()->getValue($sql); + } + + /** + * @param int $id_order + * @param int $id_customer optionnal + * @return int id_cart + */ + static public function getCartIdStatic($id_order, $id_customer = 0) + { + return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `id_cart` + FROM `'._DB_PREFIX_.'orders` + WHERE `id_order` = '.(int)$id_order.' + '.($id_customer ? 'AND `id_customer` = '.(int)$id_customer : '')); + } + + public function getWsOrderRows() + { + $query = 'SELECT id_order_detail as `id`, `product_id`, `product_price`, `id_order`, `product_attribute_id`, `product_quantity`, `product_name` + FROM `'._DB_PREFIX_.'order_detail` + WHERE id_order = '.(int)$this->id; + $result = Db::getInstance()->executeS($query); + return $result; + } + + public function setCurrentState($id_order_state) + { + if (empty($id_order_state)) + return false; + $history = new OrderHistory(); + $history->id_order = (int)($this->id); + $history->changeIdOrderState((int)$id_order_state, (int)($this->id)); + $history->addWithemail(); + } + + public function addWs($autodate = true, $nullValues = false) + { + $paymentModule = Module::getInstanceByName($this->module); + $customer = new Customer($this->id_customer); + $paymentModule->validateOrder($this->id_cart, _PS_OS_WS_PAYEMENT_, $this->total_paid, $this->payment, NULL, array(), null, false, $customer->secure_key); + $this->id = $paymentModule->currentOrder; + return true; + } + + public function deleteAssociations() + { + return (Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'order_detail` + WHERE `id_order` = '.(int)($this->id)) !== false); + } +} diff --git a/classes/OrderDetail.php b/classes/OrderDetail.php new file mode 100644 index 000000000..e0fb08a84 --- /dev/null +++ b/classes/OrderDetail.php @@ -0,0 +1,218 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderDetailCore extends ObjectModel +{ + /** @var integer */ + public $id_order_detail; + + /** @var integer */ + public $id_order; + + /** @var integer */ + public $product_id; + + /** @var integer */ + public $product_attribute_id; + + /** @var string */ + public $product_name; + + /** @var integer */ + public $product_quantity; + + /** @var integer */ + public $product_quantity_in_stock; + + /** @var integer */ + public $product_quantity_return; + + /** @var integer */ + public $product_quantity_refunded; + + /** @var integer */ + public $product_quantity_reinjected; + + /** @var float */ + public $product_price; + + /** @var float */ + public $reduction_percent; + + /** @var float */ + public $reduction_amount; + + /** @var float */ + public $group_reduction; + + /** @var float */ + public $product_quantity_discount; + + /** @var string */ + public $product_ean13; + + /** @var string */ + public $product_upc; + + /** @var string */ + public $product_reference; + + /** @var string */ + public $product_supplier_reference; + + /** @var float */ + public $product_weight; + + /** @var string */ + public $tax_name; + + /** @var float */ + public $tax_rate; + + /** @var float */ + public $ecotax; + + /** @var float */ + public $ecotax_tax_rate; + + /** @var integer */ + public $discount_quantity_applied; + + /** @var string */ + public $download_hash; + + /** @var integer */ + public $download_nb; + + /** @var date */ + public $download_deadline; + + protected $tables = array ('order_detail'); + + protected $fieldsRequired = array ('id_order', 'product_name', 'product_quantity', 'product_price', 'tax_rate'); + + protected $fieldsValidate = array ( + 'id_order' => 'isUnsignedId', + 'product_id' => 'isUnsignedId', + 'product_attribute_id' => 'isUnsignedId', + 'product_name' => 'isGenericName', + 'product_quantity' => 'isInt', + 'product_quantity_in_stock' => 'isInt', + 'product_quantity_return' => 'isUnsignedInt', + 'product_quantity_refunded' => 'isUnsignedInt', + 'product_quantity_reinjected' => 'isUnsignedInt', + 'product_price' => 'isPrice', + 'reduction_percent' => 'isFloat', + 'reduction_amount' => 'isPrice', + 'group_reduction' => 'isFloat', + 'product_quantity_discount' => 'isFloat', + 'product_ean13' => 'isEan13', + 'product_upc' => 'isUpc', + 'product_reference' => 'isReference', + 'product_supplier_reference' => 'isReference', + 'product_weight' => 'isFloat', + 'tax_name' => 'isGenericName', + 'tax_rate' => 'isFloat', + 'ecotax' => 'isFloat', + 'ecotax_tax_rate' => 'isFloat', + 'download_nb' => 'isInt', + ); + + protected $table = 'order_detail'; + protected $identifier = 'id_order_detail'; + + protected $webserviceParameters = array( + 'fields' => array ( + 'id_order' => array('xlink_resource' => 'orders'), + 'product_id' => array('xlink_resource' => 'products'), + 'product_attribute_id' => array('xlink_resource' => 'combinations'), + 'product_quantity_reinjected' => array(), + 'group_reduction' => array(), + 'discount_quantity_applied' => array(), + 'download_hash' => array(), + 'download_deadline' => array() + ) + ); + + + public function getFields() + { + parent::validateFields(); + + $fields['id_order'] = (int)($this->id_order); + $fields['product_id'] = (int)($this->product_id); + $fields['product_attribute_id'] = (int)($this->product_attribute_id); + $fields['product_name'] = pSQL($this->product_name); + $fields['product_quantity'] = (int)($this->product_quantity); + $fields['product_quantity_in_stock'] = (int)($this->product_quantity_in_stock); + $fields['product_quantity_return'] = (int)($this->product_quantity_return); + $fields['product_quantity_refunded'] = (int)($this->product_quantity_refunded); + $fields['product_quantity_reinjected'] = (int)($this->product_quantity_reinjected); + $fields['product_price'] = (float)($this->product_price); + $fields['reduction_percent'] = (float)($this->reduction_percent); + $fields['reduction_amount'] = (float)($this->reduction_amount); + $fields['group_reduction'] = (float)($this->group_reduction); + $fields['product_quantity_discount'] = (float)($this->product_quantity_discount); + $fields['product_ean13'] = pSQL($this->product_ean13); + $fields['product_upc'] = pSQL($this->product_upc); + $fields['product_reference'] = pSQL($this->product_reference); + $fields['product_supplier_reference'] = pSQL($this->product_reference); + $fields['product_weight'] = (float)($this->product_weight); + $fields['tax_name'] = pSQL($this->tax_name); + $fields['tax_rate'] = (float)($this->tax_rate); + $fields['ecotax'] = (float)($this->ecotax); + $fields['ecotax_tax_rate'] = (float)($this->ecotax_tax_rate); + $fields['download_hash'] = pSQL($this->download_hash); + $fields['download_nb'] = (int)($this->download_nb); + $fields['download_deadline'] = pSQL($this->download_deadline); + + return $fields; + } + + static public function getDownloadFromHash($hash) + { + if ($hash == '') return false; + $sql = 'SELECT * + FROM `'._DB_PREFIX_.'order_detail` od + LEFT JOIN `'._DB_PREFIX_.'product_download` pd ON (od.`product_id`=pd.`id_product`) + WHERE od.`download_hash` = \''.pSQL(strval($hash)).'\' + AND pd.`active` = 1'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + } + + static public function incrementDownload($id_order_detail, $increment=1) + { + $sql = 'UPDATE `'._DB_PREFIX_.'order_detail` + SET `download_nb` = `download_nb` + '.(int)($increment).' + WHERE `id_order_detail`= '.(int)($id_order_detail).' + LIMIT 1'; + return Db::getInstance()->Execute($sql); + } + +} + + diff --git a/classes/OrderDiscount.php b/classes/OrderDiscount.php new file mode 100644 index 000000000..5f99250f0 --- /dev/null +++ b/classes/OrderDiscount.php @@ -0,0 +1,71 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderDiscountCore extends ObjectModel +{ + /** @var integer */ + public $id_order_discount; + + /** @var integer */ + public $id_order; + + /** @var integer */ + public $id_discount; + + /** @var string */ + public $name; + + /** @var integer */ + public $value; + + protected $tables = array ('order_discount'); + + protected $fieldsRequired = array ('id_order', 'name', 'value'); + protected $fieldsValidate = array ('id_order' => 'isUnsignedId', 'name' => 'isGenericName', 'value' => 'isInt'); + + /* MySQL does not allow 'order detail' for a table name */ + protected $table = 'order_discount'; + protected $identifier = 'id_order_discount'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_order' => array('xlink_resource' => 'orders'), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_order'] = (int)($this->id_order); + $fields['name'] = pSQL($this->name); + $fields['value'] = (int)($this->value); + + return $fields; + } +} + diff --git a/classes/OrderHistory.php b/classes/OrderHistory.php new file mode 100644 index 000000000..f4352fe80 --- /dev/null +++ b/classes/OrderHistory.php @@ -0,0 +1,203 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderHistoryCore extends ObjectModel +{ + /** @var integer Order id */ + public $id_order; + + /** @var integer Order state id */ + public $id_order_state; + + /** @var integer Employee id for this history entry */ + public $id_employee; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $tables = array ('order_history'); + + protected $fieldsRequired = array('id_order', 'id_order_state'); + protected $fieldsValidate = array('id_order' => 'isUnsignedId', 'id_order_state' => 'isUnsignedId', 'id_employee' => 'isUnsignedId'); + + protected $table = 'order_history'; + protected $identifier = 'id_order_history'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'order_histories', + 'fields' => array( + 'id_order_state' => array('required' => true, 'xlink_resource'=> 'order_states'), + 'id_order' => array('xlink_resource' => 'orders'), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_order'] = (int)($this->id_order); + $fields['id_order_state'] = (int)($this->id_order_state); + $fields['id_employee'] = (int)($this->id_employee); + $fields['date_add'] = pSQL($this->date_add); + + return $fields; + } + + public function changeIdOrderState($new_order_state = NULL, $id_order) + { + if ($new_order_state != NULL) + { + Hook::updateOrderStatus((int)($new_order_state), (int)($id_order)); + $order = new Order((int)($id_order)); + + /* Best sellers */ + $newOS = new OrderState((int)($new_order_state), $order->id_lang); + $oldOrderStatus = OrderHistory::getLastOrderState((int)($id_order)); + $cart = Cart::getCartByOrderId($id_order); + $isValidated = $this->isValidated(); + if (Validate::isLoadedObject($cart)) + foreach ($cart->getProducts() as $product) + { + /* If becoming logable => adding sale */ + if ($newOS->logable AND (!$oldOrderStatus OR !$oldOrderStatus->logable)) + ProductSale::addProductSale($product['id_product'], $product['cart_quantity']); + /* If becoming unlogable => removing sale */ + elseif (!$newOS->logable AND ($oldOrderStatus AND $oldOrderStatus->logable)) + ProductSale::removeProductSale($product['id_product'], $product['cart_quantity']); + if (!$isValidated AND $newOS->logable AND isset($oldOrderStatus) AND $oldOrderStatus AND $oldOrderStatus->id == _PS_OS_ERROR_) + { + Product::updateQuantity($product); + } + } + + $this->id_order_state = (int)($new_order_state); + + /* Change invoice number of order ? */ + if (!Validate::isLoadedObject($newOS) OR !Validate::isLoadedObject($order)) + die(Tools::displayError('Invalid new order state')); + + /* The order is valid only if the invoice is available and the order is not cancelled */ + $order->valid = $newOS->logable; + $order->update(); + + if ($newOS->invoice AND !$order->invoice_number) + $order->setInvoice(); + if ($newOS->delivery AND !$order->delivery_number) + $order->setDelivery(); + Hook::postUpdateOrderStatus((int)($new_order_state), (int)($id_order)); + } + } + + static public function getLastOrderState($id_order) + { + $id_order_state = Db::getInstance()->getValue(' + SELECT `id_order_state` + FROM `'._DB_PREFIX_.'order_history` + WHERE `id_order` = '.(int)($id_order).' + ORDER BY `date_add` DESC, `id_order_history` DESC'); + if (!$id_order_state) + return false; + return new OrderState($id_order_state, Configuration::get('PS_LANG_DEFAULT')); + } + + public function addWithemail($autodate = true, $templateVars = false) + { + $lastOrderState = $this->getLastOrderState($this->id_order); + + if (!parent::add($autodate)) + return false; + + $result = Db::getInstance()->getRow(' + SELECT osl.`template`, c.`lastname`, c.`firstname`, osl.`name` AS osname, c.`email` + FROM `'._DB_PREFIX_.'order_history` oh + LEFT JOIN `'._DB_PREFIX_.'orders` o ON oh.`id_order` = o.`id_order` + LEFT JOIN `'._DB_PREFIX_.'customer` c ON o.`id_customer` = c.`id_customer` + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON oh.`id_order_state` = os.`id_order_state` + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = o.`id_lang`) + WHERE oh.`id_order_history` = '.(int)($this->id).' + AND os.`send_email` = 1'); + + if (isset($result['template']) AND Validate::isEmail($result['email'])) + { + $topic = $result['osname']; + $data = array('{lastname}' => $result['lastname'], '{firstname}' => $result['firstname'], '{id_order}' => (int)($this->id_order)); + if ($templateVars) + $data = array_merge($data, $templateVars); + $order = new Order((int)($this->id_order)); + $data['{total_paid}'] = Tools::displayPrice((float)($order->total_paid), new Currency((int)($order->id_currency)), false); + $data['{order_name}'] = sprintf("#%06d", (int)($order->id)); + + // An additional email is sent the first time a virtual item is validated + if ($virtualProducts = $order->getVirtualProducts() AND (!$lastOrderState OR !$lastOrderState->logable) AND $newOrderState = new OrderState($this->id_order_state, Configuration::get('PS_LANG_DEFAULT')) AND $newOrderState->logable) + { + global $smarty; + $assign = array(); + foreach ($virtualProducts AS $key => $virtualProduct) + { + $id_product_download = ProductDownload::getIdFromIdProduct($virtualProduct['product_id']); + $product_download = new ProductDownload($id_product_download); + $assign[$key]['name'] = $product_download->display_filename; + $dl_link = $product_download->getTextLink(false, $virtualProduct['download_hash']) + .'&id_order='.$order->id + .'&secure_key='.$order->secure_key; + $assign[$key]['link'] = $dl_link; + if ($virtualProduct['download_deadline'] != '0000-00-00 00:00:00') + $assign[$key]['deadline'] = Tools::displayDate($virtualProduct['download_deadline'], $order->id_lang); + if ($product_download->nb_downloadable != 0) + $assign[$key]['downloadable'] = $product_download->nb_downloadable; + } + $smarty->assign('virtualProducts', $assign); + $smarty->assign('id_order', $order->id); + $iso = Language::getIsoById((int)($order->id_lang)); + $links = $smarty->fetch(_PS_MAIL_DIR_.$iso.'/download-product.tpl'); + $tmpArray = array('{nbProducts}' => count($virtualProducts), '{virtualProducts}' => $links); + $data = array_merge ($data, $tmpArray); + global $_LANGMAIL; + Mail::Send((int)($order->id_lang), 'download_product', Mail::l('Virtual product to download'), $data, $result['email'], $result['firstname'].' '.$result['lastname']); + } + + if (Validate::isLoadedObject($order)) + Mail::Send((int)($order->id_lang), $result['template'], $topic, $data, $result['email'], $result['firstname'].' '.$result['lastname']); + } + + return true; + } + + public function isValidated() + { + return Db::getInstance()->getValue(' + SELECT COUNT(oh.`id_order_history`) AS nb + FROM `'._DB_PREFIX_.'order_state` os + LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (os.`id_order_state` = oh.`id_order_state`) + WHERE oh.`id_order` = '.(int)$this->id_order.' + AND os.`logable` = 1'); + } + +} diff --git a/classes/OrderMessage.php b/classes/OrderMessage.php new file mode 100644 index 000000000..378359d5e --- /dev/null +++ b/classes/OrderMessage.php @@ -0,0 +1,79 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderMessageCore extends ObjectModel +{ + /** @var string name name */ + public $name; + + /** @var string message content */ + public $message; + + /** @var string Object creation date */ + public $date_add; + + protected $fieldsRequired = array(); + protected $fieldsValidate = array(); + protected $fieldsSize = array(); + + protected $fieldsRequiredLang = array('name', 'message'); + protected $fieldsSizeLang = array('name' => 128, 'message' => 1200); + protected $fieldsValidateLang = array('name' => 'isGenericName', 'message' => 'isMessage'); + + protected $table = 'order_message'; + protected $identifier = 'id_order_message'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id' => array('sqlId' => 'id_discount_type', 'xlink_resource' => 'order_message_lang'), + 'date_add' => array('sqlId' => 'date_add') + ) + ); + + + public function getFields() + { + parent::validateFields(); + return array('date_add' => pSQL($this->date_add)); + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'message')); + } + + static public function getOrderMessages($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT om.id_order_message, oml.name, oml.message + FROM '._DB_PREFIX_.'order_message om + LEFT JOIN '._DB_PREFIX_.'order_message_lang oml ON (oml.id_order_message = om.id_order_message) + WHERE oml.id_lang = '.(int)($id_lang).' + ORDER BY name ASC'); + } +} diff --git a/classes/OrderReturn.php b/classes/OrderReturn.php new file mode 100644 index 000000000..7526ecd1b --- /dev/null +++ b/classes/OrderReturn.php @@ -0,0 +1,205 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderReturnCore extends ObjectModel +{ + /** @var integer */ + public $id; + + /** @var integer */ + public $id_customer; + + /** @var integer */ + public $id_order; + + /** @var integer */ + public $state; + + /** @var string message content */ + public $question; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $tables = array ('order_return'); + + protected $fieldsRequired = array ('id_customer', 'id_order'); + protected $fieldsValidate = array('id_customer' => 'isUnsignedId', 'id_order' => 'isUnsignedId', 'question' => 'isMessage'); + + protected $table = 'order_return'; + protected $identifier = 'id_order_return'; + + public function getFields() + { + parent::validateFields(); + + $fields['id_customer'] = pSQL($this->id_customer); + $fields['id_order'] = pSQL($this->id_order); + $fields['state'] = pSQL($this->state); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['question'] = pSQL(nl2br2($this->question), true); + return $fields; + } + + public function addReturnDetail($orderDetailList, $productQtyList, $customizationIds, $customizationQtyInput) + { + /* Classic product return */ + if ($orderDetailList) + foreach ($orderDetailList AS $key => $orderDetail) + if ($qty = (int)($productQtyList[$key])) + Db::getInstance()->AutoExecute(_DB_PREFIX_.'order_return_detail', array('id_order_return' => (int)($this->id), 'id_order_detail' => (int)($orderDetail), 'product_quantity' => $qty, 'id_customization' => 0), 'INSERT'); + /* Customized product return */ + if ($customizationIds) + foreach ($customizationIds AS $orderDetailId => $customizations) + foreach ($customizations AS $customizationId) + if ($quantity = (int)($customizationQtyInput[(int)($customizationId)])) + Db::getInstance()->AutoExecute(_DB_PREFIX_.'order_return_detail', array('id_order_return' => (int)($this->id), 'id_order_detail' => (int)($orderDetailId), 'product_quantity' => $quantity, 'id_customization' => (int)($customizationId)), 'INSERT'); + } + + public function checkEnoughProduct($orderDetailList, $productQtyList, $customizationIds, $customizationQtyInput) + { + $order = new Order((int)($this->id_order)); + if (!Validate::isLoadedObject($order)) + die(Tools::displayError()); + $products = $order->getProducts(); + /* Products already returned */ + $order_return = self::getOrdersReturn($order->id_customer, $order->id, true); + foreach ($order_return AS $or) + { + $order_return_products = self::getOrdersReturnProducts($or['id_order_return'], $order); + foreach ($order_return_products AS $key => $orp) + $products[$key]['product_quantity'] -= (int)($orp['product_quantity']); + } + /* Quantity check */ + if ($orderDetailList) + foreach ($orderDetailList AS $key => $orderDetail) + if ($qty = (int)($productQtyList[$key])) + if ($products[$key]['product_quantity'] - $qty < 0) + return false; + /* Customization quantity check */ + if ($customizationIds) + { + $orderedCustomizations = Customization::getOrderedCustomizations((int)($order->id_cart)); + foreach ($customizationIds AS $productId => $customizations) + foreach ($customizations AS $customizationId) + { + $customizationId = (int)($customizationId); + if (!isset($orderedCustomizations[$customizationId])) + return false; + $quantity = (isset($customizationQtyInput[$customizationId]) ? (int)($customizationQtyInput[$customizationId]) : 0); + if ((int)($orderedCustomizations[$customizationId]['quantity']) - $quantity < 0) + return false; + } + } + return true; + } + + public function countProduct() + { + if (!$data = Db::getInstance()->getRow(' + SELECT COUNT(`id_order_return`) AS total + FROM `'._DB_PREFIX_.'order_return_detail` + WHERE `id_order_return` = '.(int)($this->id))) + return false; + return (int)($data['total']); + } + + static public function getOrdersReturn($customer_id, $order_id = false, $no_denied = false) + { + global $cookie; + + $data = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_return` + WHERE `id_customer` = '.(int)($customer_id). + ($order_id ? ' AND `id_order` = '.(int)($order_id) : ''). + ($no_denied ? ' AND `state` != 4' : '').' + ORDER BY `date_add` DESC'); + foreach ($data AS $k => $or) + { + $state = new OrderReturnState($or['state']); + $data[$k]['state_name'] = $state->name[$cookie->id_lang]; + } + return $data; + } + + static public function getOrdersReturnDetail($id_order_return) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_return_detail` + WHERE `id_order_return` = '.(int)($id_order_return)); + } + + static public function getOrdersReturnProducts($orderReturnId, $order) + { + $productsRet = self::getOrdersReturnDetail($orderReturnId); + $products = $order->getProducts(); + $tmp = array(); + foreach ($productsRet AS $return_detail) + { + $tmp[$return_detail['id_order_detail']]['quantity'] = isset($tmp[$return_detail['id_order_detail']]['quantity']) ? $tmp[$return_detail['id_order_detail']]['quantity'] + (int)($return_detail['product_quantity']) : (int)($return_detail['product_quantity']); + $tmp[$return_detail['id_order_detail']]['customizations'] = (int)($return_detail['id_customization']); + } + $resTab = array(); + foreach ($products AS $key => $product) + if (isset($tmp[$product['id_order_detail']])) + { + $resTab[$key] = $product; + $resTab[$key]['product_quantity'] = $tmp[$product['id_order_detail']]['quantity']; + $resTab[$key]['customizations'] = $tmp[$product['id_order_detail']]['customizations']; + } + return $resTab; + } + + static public function getReturnedCustomizedProducts($id_order) + { + $returns = Customization::getReturnedCustomizations($id_order); + $order = new Order((int)($id_order)); + if (!Validate::isLoadedObject($order)) + die(Tools::displayError()); + $products = $order->getProducts(); + foreach ($returns AS &$return) + { + $return['product_id'] = (int)($products[(int)($return['id_order_detail'])]['product_id']); + $return['product_attribute_id'] = (int)($products[(int)($return['id_order_detail'])]['product_attribute_id']); + $return['name'] = $products[(int)($return['id_order_detail'])]['product_name']; + $return['reference'] = $products[(int)($return['id_order_detail'])]['product_reference']; + } + return $returns; + } + + static public function deleteOrderReturnDetail($id_order_return, $id_order_detail, $id_customization = 0) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_return_detail` WHERE `id_order_detail` = '.(int)($id_order_detail).' AND `id_order_return` = '.(int)($id_order_return).' AND `id_customization` = '.(int)($id_customization)); + } +} + diff --git a/classes/OrderReturnState.php b/classes/OrderReturnState.php new file mode 100644 index 000000000..255b7c4bc --- /dev/null +++ b/classes/OrderReturnState.php @@ -0,0 +1,80 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderReturnStateCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + /** @var string Display state in the specified color */ + public $color; + + + protected $fieldsValidate = array('color' => 'isColor'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 64); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'order_return_state'; + protected $identifier = 'id_order_return_state'; + + public function getFields() + { + parent::validateFields(); + $fields['color'] = pSQL($this->color); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + /** + * Get all available order states + * + * @param integer $id_lang Language id for state name + * @return array Order states + */ + static public function getOrderReturnStates($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_return_state` ors + LEFT JOIN `'._DB_PREFIX_.'order_return_state_lang` orsl ON (ors.`id_order_return_state` = orsl.`id_order_return_state` AND orsl.`id_lang` = '.(int)($id_lang).') + ORDER BY ors.`id_order_return_state` ASC'); + } + + +} + diff --git a/classes/OrderSlip.php b/classes/OrderSlip.php new file mode 100644 index 000000000..056f4a663 --- /dev/null +++ b/classes/OrderSlip.php @@ -0,0 +1,179 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderSlipCore extends ObjectModel +{ + /** @var integer */ + public $id; + + /** @var integer */ + public $id_customer; + + /** @var integer */ + public $id_order; + + /** @var float */ + public $conversion_rate; + + /** @var integer */ + public $shipping_cost; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $tables = array ('order_slip'); + + protected $fieldsRequired = array ('id_customer', 'id_order', 'conversion_rate'); + protected $fieldsValidate = array('id_customer' => 'isUnsignedId', 'id_order' => 'isUnsignedId', 'conversion_rate' => 'isFloat'); + + protected $table = 'order_slip'; + protected $identifier = 'id_order_slip'; + + public function getFields() + { + parent::validateFields(); + + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_order'] = (int)($this->id_order); + $fields['conversion_rate'] = (float)($this->conversion_rate); + $fields['shipping_cost'] = (int)($this->shipping_cost); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + public function addSlipDetail($orderDetailList, $productQtyList) + { + foreach ($orderDetailList as $key => $orderDetail) + { + if ($qty = (int)($productQtyList[$key])) + Db::getInstance()->AutoExecute(_DB_PREFIX_.'order_slip_detail', array('id_order_slip' => (int)($this->id), 'id_order_detail' => (int)($orderDetail), 'product_quantity' => $qty), 'INSERT'); + } + } + + static public function getOrdersSlip($customer_id, $order_id = false) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_slip` + WHERE `id_customer` = '.(int)($customer_id). + ($order_id ? ' AND `id_order` = '.(int)($order_id) : '').' + ORDER BY `date_add` DESC'); + } + + static public function getOrdersSlipDetail($id_order_slip = true, $id_order_detail = false) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS( + ($id_order_detail ? 'SELECT SUM(`product_quantity`) AS `total`' : 'SELECT *'). + 'FROM `'._DB_PREFIX_.'order_slip_detail`' + .($id_order_slip ? ' WHERE `id_order_slip` = '.(int)($id_order_slip) : '') + .($id_order_detail ? ' WHERE `id_order_detail` = '.(int)($id_order_detail) : '')); + } + + static public function getOrdersSlipProducts($orderSlipId, $order) + { + $discounts = $order->getDiscounts(true); + $productsRet = self::getOrdersSlipDetail($orderSlipId); + $products = $order->getProductsDetail(); + + $tmp = array(); + foreach ($productsRet as $slip_detail) + $tmp[$slip_detail['id_order_detail']] = $slip_detail['product_quantity']; + $resTab = array(); + foreach ($products as $key => $product) + if (isset($tmp[$product['id_order_detail']])) + { + $resTab[$key] = $product; + $resTab[$key]['product_quantity'] = $tmp[$product['id_order_detail']]; + if (sizeof($discounts)) + { + $order->setProductPrices($product); + $realProductPrice = $resTab[$key]['product_price']; + foreach ($discounts as $discount) + { + if ($discount['id_discount_type'] == 1) + $resTab[$key]['product_price'] -= $realProductPrice * ($discount['value'] / 100); + elseif ($discount['id_discount_type'] == 2) + $resTab[$key]['product_price'] -= (($discount['value'] * ($product['product_price_wt'] / $order->total_products_wt)) / (1.00 + ($product['tax_rate'] / 100))); + } + + } + } + return $order->getProducts($resTab); + } + + public function getProducts() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT *, osd.product_quantity + FROM `'._DB_PREFIX_.'order_slip_detail` osd + INNER JOIN `'._DB_PREFIX_.'order_detail` od ON osd.id_order_detail = od.id_order_detail + WHERE osd.`id_order_slip` = '.(int)$this->id); + + $order = new Order($this->id_order); + $products = array(); + foreach ($result AS $row) + { + $order->setProductPrices($row); + $products[] = $row; + } + return $products; + } + + static public function getSlipsIdByDate($dateFrom, $dateTo) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT `id_order_slip` + FROM `'._DB_PREFIX_.'order_slip` + WHERE `date_add` BETWEEN \''.pSQL($dateFrom).' 00:00:00\' AND \''.pSQL($dateTo).' 23:59:59\' + ORDER BY `date_add` ASC'); + + $slips = array(); + foreach ($result AS $slip) + $slips[] = (int)$slip['id_order_slip']; + return $slips; + } + + static public function createOrderSlip($order, $productList, $qtyList, $shipping_cost = false) + { + $currency = new Currency($order->id_currency); + $orderSlip = new OrderSlip(); + $orderSlip->id_customer = (int)($order->id_customer); + $orderSlip->id_order = (int)($order->id); + $orderSlip->shipping_cost = (int)($shipping_cost); + $orderSlip->conversion_rate = $currency->conversion_rate; + if (!$orderSlip->add()) + return false; + + $orderSlip->addSlipDetail($productList, $qtyList); + return true; + } +} + diff --git a/classes/OrderState.php b/classes/OrderState.php new file mode 100644 index 000000000..2faca06b0 --- /dev/null +++ b/classes/OrderState.php @@ -0,0 +1,132 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderStateCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + /** @var string Template name if there is any e-mail to send */ + public $template; + + /** @var boolean Send an e-mail to customer ? */ + public $send_email; + + /** @var boolean Allow customer to view and download invoice when order is at this state */ + public $invoice; + + /** @var string Display state in the specified color */ + public $color; + + public $unremovable; + + /** @var boolean Log authorization */ + public $logable; + + /** @var boolean Delivery */ + public $delivery; + + /** @var boolean Hidden */ + public $hidden; + + protected $fieldsValidate = array('send_email' => 'isBool', 'invoice' => 'isBool', 'color' => 'isColor', 'logable' => 'isBool'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 64, 'template' => 64); + protected $fieldsValidateLang = array('name' => 'isGenericName', 'template' => 'isTplName'); + + protected $table = 'order_state'; + protected $identifier = 'id_order_state'; + + protected $webserviceParameters = array( + 'fields' => array( + 'unremovable' => array(), + 'delivery' => array(), + 'hidden' => array(), + ), + ); + + public function getFields() + { + parent::validateFields(); + $fields['send_email'] = (int)($this->send_email); + $fields['invoice'] = (int)($this->invoice); + $fields['color'] = pSQL($this->color); + $fields['unremovable'] = (int)($this->unremovable); + $fields['logable'] = (int)($this->logable); + $fields['delivery'] = (int)($this->delivery); + $fields['hidden'] = (int)($this->hidden); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name', 'template')); + } + + /** + * Get all available order states + * + * @param integer $id_lang Language id for state name + * @return array Order states + */ + static public function getOrderStates($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'order_state` os + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)($id_lang).') + ORDER BY `name` ASC'); + } + + /** + * Check if we can make a facture when order is in this state + * + * @param integer $id_order_state State ID + * @return boolean availability + */ + static public function invoiceAvailable($id_order_state) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `invoice` AS ok + FROM `'._DB_PREFIX_.'order_state` + WHERE `id_order_state` = '.(int)($id_order_state)); + return $result['ok']; + } + + public function isRemovable() + { + return !($this->unremovable); + } +} + + diff --git a/classes/PDF.php b/classes/PDF.php new file mode 100644 index 000000000..f679d431d --- /dev/null +++ b/classes/PDF.php @@ -0,0 +1,1128 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(_PS_FPDF_PATH_.'fpdf.php'); + +class PDF_PageGroupCore extends FPDF +{ + var $NewPageGroup; // variable indicating whether a new group was requested + var $PageGroups; // variable containing the number of pages of the groups + var $CurrPageGroup; // variable containing the alias of the current page group + + // create a new page group; call this before calling AddPage() + function StartPageGroup() + { + $this->NewPageGroup=true; + } + + // current page in the group + function GroupPageNo() + { + return $this->PageGroups[$this->CurrPageGroup]; + } + + // alias of the current page group -- will be replaced by the total number of pages in this group + function PageGroupAlias() + { + return $this->CurrPageGroup; + } + + function _beginpage($orientation, $arg2) + { + parent::_beginpage($orientation, $arg2); + if($this->NewPageGroup) + { + // start a new group + $n = sizeof($this->PageGroups)+1; + $alias = "{nb$n}"; + $this->PageGroups[$alias] = 1; + $this->CurrPageGroup = $alias; + $this->NewPageGroup=false; + } + elseif($this->CurrPageGroup) + $this->PageGroups[$this->CurrPageGroup]++; + } + + function _putpages() + { + $nb = $this->page; + if (!empty($this->PageGroups)) + { + // do page number replacement + foreach ($this->PageGroups as $k => $v) + for ($n = 1; $n <= $nb; $n++) + $this->pages[$n]=str_replace($k, $v, $this->pages[$n]); + } + parent::_putpages(); + } +} + +class PDFCore extends PDF_PageGroupCore +{ + protected static $order = NULL; + protected static $orderReturn = NULL; + protected static $orderSlip = NULL; + protected static $delivery = NULL; + protected static $_priceDisplayMethod; + + /** @var object Order currency object */ + protected static $currency = NULL; + + protected static $_iso; + + /** @var array Special PDF params such encoding and font */ + + protected static $_pdfparams = array(); + protected static $_fpdf_core_fonts = array('courier', 'helvetica', 'helveticab', 'helveticabi', 'helveticai', 'symbol', 'times', 'timesb', 'timesbi', 'timesi', 'zapfdingbats'); + + /** + * Constructor + */ + public function __construct($orientation='P', $unit='mm', $format='A4') + { + global $cookie; + + if (!isset($cookie) OR !is_object($cookie)) + $cookie->id_lang = (int)(Configuration::get('PS_LANG_DEFAULT')); + self::$_iso = strtoupper(Language::getIsoById($cookie->id_lang)); + FPDF::FPDF($orientation, $unit, $format); + $this->_initPDFFonts(); + } + + protected function _initPDFFonts() + { + if (!$languages = Language::getLanguages()) + die(Tools::displayError()); + foreach ($languages AS $language) + { + $isoCode = strtoupper($language['iso_code']); + $conf = Configuration::getMultiple(array('PS_PDF_ENCODING_'.$isoCode, 'PS_PDF_FONT_'.$isoCode)); + self::$_pdfparams[$isoCode] = array( + 'encoding' => (isset($conf['PS_PDF_ENCODING_'.$isoCode]) AND $conf['PS_PDF_ENCODING_'.$isoCode] == true) ? $conf['PS_PDF_ENCODING_'.$isoCode] : 'iso-8859-1', + 'font' => (isset($conf['PS_PDF_FONT_'.$isoCode]) AND $conf['PS_PDF_FONT_'.$isoCode] == true) ? $conf['PS_PDF_FONT_'.$isoCode] : 'helvetica' + ); + } + + if ($font = self::embedfont()) + { + $this->AddFont($font); + $this->AddFont($font, 'B'); + } + } + + /** + * Invoice header + */ + public function Header() + { + global $cookie; + + $conf = Configuration::getMultiple(array('PS_SHOP_NAME', 'PS_SHOP_ADDR1', 'PS_SHOP_CODE', 'PS_SHOP_CITY', 'PS_SHOP_COUNTRY', 'PS_SHOP_STATE')); + $conf['PS_SHOP_NAME'] = isset($conf['PS_SHOP_NAME']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_NAME']) : 'Your company'; + $conf['PS_SHOP_ADDR1'] = isset($conf['PS_SHOP_ADDR1']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_ADDR1']) : 'Your company'; + $conf['PS_SHOP_CODE'] = isset($conf['PS_SHOP_CODE']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_CODE']) : 'Postcode'; + $conf['PS_SHOP_CITY'] = isset($conf['PS_SHOP_CITY']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_CITY']) : 'City'; + $conf['PS_SHOP_COUNTRY'] = isset($conf['PS_SHOP_COUNTRY']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_COUNTRY']) : 'Country'; + $conf['PS_SHOP_STATE'] = isset($conf['PS_SHOP_STATE']) ? Tools::iconv('utf-8', self::encoding(), $conf['PS_SHOP_STATE']) : ''; + + if (file_exists(_PS_IMG_DIR_.'/logo_invoice.jpg')) + $this->Image(_PS_IMG_DIR_.'/logo_invoice.jpg', 10, 8, 0, 15); + else if (file_exists(_PS_IMG_DIR_.'/logo.jpg')) + $this->Image(_PS_IMG_DIR_.'/logo.jpg', 10, 8, 0, 15); + $this->SetFont(self::fontname(), 'B', 15); + $this->Cell(115); + + if (self::$orderReturn) + $this->Cell(77, 10, self::l('RETURN #').' '.sprintf('%06d', self::$orderReturn->id), 0, 1, 'R'); + elseif (self::$orderSlip) + $this->Cell(77, 10, self::l('SLIP #').' '.sprintf('%06d', self::$orderSlip->id), 0, 1, 'R'); + elseif (self::$delivery) + $this->Cell(77, 10, self::l('DELIVERY SLIP #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_DELIVERY_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$delivery), 0, 1, 'R'); + elseif (self::$order->invoice_number) + $this->Cell(77, 10, self::l('INVOICE #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_INVOICE_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$order->invoice_number), 0, 1, 'R'); + else + $this->Cell(77, 10, self::l('ORDER #').' '.sprintf('%06d', self::$order->id), 0, 1, 'R'); + } + + /* + * Return the complete Address format + */ + private function _getCompleteUSAddressFormat($conf) + { + $shopCity = (isset($conf['PS_SHOP_CITY']) && !empty($conf['PS_SHOP_CITY'])) ? $conf['PS_SHOP_CITY'] : ''; + $shopState = ((isset($conf['PS_SHOP_STATE']) && !empty($conf['PS_SHOP_STATE'])) ? $conf['PS_SHOP_STATE'] : ''); + $shopZipcode = (isset($conf['PS_SHOP_CODE']) && !empty($conf['PS_SHOP_CODE'])) ? $conf['PS_SHOP_CODE'] : ''; + + // Build the complete address with good separators + $completeAddressShop = $shopCity. + ((!empty($shopState) && !empty($shopCity)) ? ', '.$shopState.((!empty($shopZipcode)) ? ' ' : '') : + ((!empty($shopState)) ? $shopState. ((!empty($shopZipcode)) ? ' ' : '') : + ((!empty($shopCity) && !empty($shopZipcode)) ? ' ' : ''))). + $shopZipcode; + + // Clean the string + return ($completeAddressShop = trim($completeAddressShop, ' ')); + } + + /* + * Build the the detailed footer of the merchant + */ + private function _builMerchantFooterDetail($conf) + { + $footerText; + + // If the country is USA + if ($conf['PS_SHOP_COUNTRY_ID'] == 21) + { + $completeAddressShop = $this->_getCompleteUSAddressFormat($conf); + + $footerText = self::l('Headquarters:')."\n". + $conf['PS_SHOP_NAME_UPPER']."\n". + (isset($conf['PS_SHOP_ADDR1']) && !empty($conf['PS_SHOP_ADDR1']) ? $conf['PS_SHOP_ADDR1']."\n" : ''). + (isset($conf['PS_SHOP_ADDR2']) && !empty($conf['PS_SHOP_ADDR2']) ? $conf['PS_SHOP_ADDR2']."\n" : ''). + (!empty($completeAddressShop) ? $completeAddressShop."\n" : ''). + (isset($conf['PS_SHOP_COUNTRY']) && !empty($conf['PS_SHOP_COUNTRY']) ? $conf['PS_SHOP_COUNTRY']."\n" : ''). + ((isset($conf['PS_SHOP_PHONE']) && !empty($conf['PS_SHOP_PHONE'])) ? self::l('PHONE:').' '.$conf['PS_SHOP_PHONE'] : ''); + } + else + { + $footerText = $conf['PS_SHOP_NAME_UPPER'].(!empty($conf['PS_SHOP_ADDR1']) ? ' - '.self::l('Headquarters:').' '.$conf['PS_SHOP_ADDR1']. + (!empty($conf['PS_SHOP_ADDR2']) ? ' '.$conf['PS_SHOP_ADDR2'] : '').' '.$conf['PS_SHOP_CODE'].' '.$conf['PS_SHOP_CITY']. + ((isset($conf['PS_SHOP_STATE']) AND !empty($conf['PS_SHOP_STATE'])) ? (', '.$conf['PS_SHOP_STATE']) : '').' '.$conf['PS_SHOP_COUNTRY'] : ''). + "\n".(!empty($conf['PS_SHOP_DETAILS']) ? self::l('Details:').' '.$conf['PS_SHOP_DETAILS'].' - ' : ''). + (!empty($conf['PS_SHOP_PHONE']) ? self::l('PHONE:').' '.$conf['PS_SHOP_PHONE'] : ''); + } + return $footerText; + } + + /** + * Invoice footer + */ + public function Footer() + { + $arrayConf = array( + 'PS_SHOP_NAME', + 'PS_SHOP_ADDR1', + 'PS_SHOP_ADDR2', + 'PS_SHOP_CODE', + 'PS_SHOP_CITY', + 'PS_SHOP_COUNTRY', + 'PS_SHOP_COUNTRY_ID', + 'PS_SHOP_DETAILS', + 'PS_SHOP_PHONE', + 'PS_SHOP_STATE'); + + $conf = Configuration::getMultiple($arrayConf); + $conf['PS_SHOP_NAME_UPPER'] = Tools::strtoupper($conf['PS_SHOP_NAME']); + $y_delta = array_key_exists('PS_SHOP_DETAILS', $conf) ? substr_count($conf['PS_SHOP_DETAILS'],"\n") : 0; + + foreach($conf as $key => $value) + $conf[$key] = Tools::iconv('utf-8', self::encoding(), $value); + foreach ($arrayConf as $key) + if (!isset($conf[$key])) + $conf[$key] = ''; + + $merchantDetailFooter = $this->_builMerchantFooterDetail($conf); + $totalLineDetailFooter = count(explode("\n", $merchantDetailFooter)); + + // A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). + // This is a very common unit in typography; font sizes are expressed in that unit. + // 8 point = 2.8mm and the cell height = 4mm + $this->SetY(-(21.0 + (4 * $totalLineDetailFooter)) - ($y_delta * 7.0)); + $this->SetFont(self::fontname(), '', 7); + $this->Cell(190, 5, ' '."\n".Tools::iconv('utf-8', self::encoding(), 'P. ').$this->GroupPageNo().' / '.$this->PageGroupAlias(), 'T', 1, 'R'); + + /* + * Display a message for customer + */ + if (!self::$delivery) + { + $this->SetFont(self::fontname(), '', 8); + if (self::$orderSlip) + $textFooter = self::l('An electronic version of this invoice is available in your account. To access it, log in to the'); + else + $textFooter = self::l('An electronic version of this invoice is available in your account. To access it, log in to the'); + $this->Cell(0, 10, $textFooter, 0, 0, 'C', 0, (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].__PS_BASE_URI__.'history.php'); + $this->Ln(4); + $this->Cell(0, 10, Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_SHOP_NAME')).' '.self::l('website using your e-mail address and password (which you created when placing your first order).'), 0, 0, 'C', 0, (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].__PS_BASE_URI__.'history.php'); + } + else + $this->Ln(4); + $this->Ln(9); + + $this->SetFillColor(240, 240, 240); + $this->SetTextColor(0, 0, 0); + $this->SetFont(self::fontname(), '', 8); + + $this->MultiCell(0.0, 4.0, $merchantDetailFooter, 0, 'C', 1); + } + + public static function multipleInvoices($invoices) + { + $pdf = new PDF('P', 'mm', 'A4'); + foreach ($invoices AS $id_order) + { + $orderObj = new Order((int)$id_order); + if (Validate::isLoadedObject($orderObj)) + PDF::invoice($orderObj, 'D', true, $pdf); + } + return $pdf->Output('invoices.pdf', 'D'); + } + + public static function multipleOrderSlips($orderSlips) + { + $pdf = new PDF('P', 'mm', 'A4'); + foreach ($orderSlips AS $id_order_slip) + { + $orderSlip = new OrderSlip((int)$id_order_slip); + $order = new Order((int)$orderSlip->id_order); + $order->products = OrderSlip::getOrdersSlipProducts($orderSlip->id, $order); + if (Validate::isLoadedObject($orderSlip) AND Validate::isLoadedObject($order)) + PDF::invoice($order, 'D', true, $pdf, $orderSlip); + } + return $pdf->Output('order_slips.pdf', 'D'); + } + + public static function multipleDelivery($slips) + { + $pdf = new PDF('P', 'mm', 'A4'); + foreach ($slips AS $id_order) + { + $orderObj = new Order((int)$id_order); + if (Validate::isLoadedObject($orderObj)) + PDF::invoice($orderObj, 'D', true, $pdf, false, $orderObj->delivery_number); + } + return $pdf->Output('invoices.pdf', 'D'); + } + + public static function orderReturn($orderReturn, $mode = 'D', $multiple = false, &$pdf = NULL) + { + $pdf = new PDF('P', 'mm', 'A4'); + self::$orderReturn = $orderReturn; + $order = new Order($orderReturn->id_order); + self::$order = $order; + $pdf->SetAutoPageBreak(true, 35); + $pdf->StartPageGroup(); + $pdf->AliasNbPages(); + $pdf->AddPage(); + + /* Display address information */ + $arrayConf = array('PS_SHOP_NAME', 'PS_SHOP_ADDR1', 'PS_SHOP_ADDR2', 'PS_SHOP_CODE', 'PS_SHOP_CITY', 'PS_SHOP_COUNTRY', 'PS_SHOP_DETAILS', 'PS_SHOP_PHONE', 'PS_SHOP_STATE'); + $conf = Configuration::getMultiple($arrayConf); + foreach ($conf as $key => $value) + $conf[$key] = Tools::iconv('utf-8', self::encoding(), $value); + foreach ($arrayConf as $key) + if (!isset($conf[$key])) + $conf[$key] = ''; + + $width = 100; + $pdf->SetX(10); + $pdf->SetY(25); + $pdf->SetFont(self::fontname(), '', 9); + + $addressType = array( + 'invoice' => array(), + 'delivery' => array()); + + $patternRules = array( + 'avoid' => array( + 'address2', + 'company', + 'phone', + 'phone_mobile')); + + $addressType = self::generateHeaderAddresses($pdf, $order, $addressType, $patternRules, $width); + + /* + * display order information + */ + $pdf->Ln(12); + $pdf->SetFillColor(240, 240, 240); + $pdf->SetTextColor(0, 0, 0); + $pdf->SetFont(self::fontname(), '', 9); + $pdf->Cell(0, 6, self::l('RETURN #').sprintf('%06d', self::$orderReturn->id).' '.self::l('from') . ' ' .Tools::displayDate(self::$orderReturn->date_upd, self::$order->id_lang), 1, 2, 'L'); + $pdf->Cell(0, 6, self::l('We have logged your return request.'), 'TRL', 2, 'L'); + $pdf->Cell(0, 6, self::l('Your package must be returned to us within').' '.Configuration::get('PS_ORDER_RETURN_NB_DAYS').' '.self::l('days of receiving your order.'), 'BRL', 2, 'L'); + $pdf->Ln(5); + $pdf->Cell(0, 6, self::l('List of items marked as returned :'), 0, 2, 'L'); + $pdf->Ln(5); + $pdf->ProdReturnTab(); + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), 'B', 10); + $pdf->Cell(0, 6, self::l('Return reference:').' '.self::l('RET').sprintf('%06d', self::$order->id), 0, 2, 'C'); + $pdf->Cell(0, 6, self::l('Please include this number on your return package.'), 0, 2, 'C'); + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), 'B', 9); + $pdf->Cell(0, 6, self::l('REMINDER:'), 0, 2, 'L'); + $pdf->SetFont(self::fontname(), '', 9); + $pdf->Cell(0, 6, self::l('- All products must be returned in their original packaging without damage or wear.'), 0, 2, 'L'); + $pdf->Cell(0, 6, self::l('- Please print out this document and slip it into your package.'), 0, 2, 'L'); + $pdf->Cell(0, 6, self::l('- The package should be sent to the following address:'), 0, 2, 'L'); + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), 'B', 10); + $pdf->Cell(0, 5, Tools::strtoupper($conf['PS_SHOP_NAME']), 0, 1, 'C', 1); + $pdf->Cell(0, 5, (!empty($conf['PS_SHOP_ADDR1']) ? self::l('Headquarters:').' '.$conf['PS_SHOP_ADDR1'].(!empty($conf['PS_SHOP_ADDR2']) ? ' '.$conf['PS_SHOP_ADDR2'] : '').' '.$conf['PS_SHOP_CODE'].' '.$conf['PS_SHOP_CITY'].' '.$conf['PS_SHOP_COUNTRY'].((isset($conf['PS_SHOP_STATE']) AND !empty($conf['PS_SHOP_STATE'])) ? (', '.$conf['PS_SHOP_STATE']) : '') : ''), 0, 1, 'C', 1); + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), '', 9); + $pdf->Cell(0, 6, self::l('Upon receiving your package, we will notify you by e-mail. We will then begin processing the reimbursement of your order total.'), 0, 2, 'L'); + $pdf->Cell(0, 6, self::l('Let us know if you have any questions.'), 0, 2, 'L'); + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), 'B', 10); + $pdf->Cell(0, 6, self::l('If the conditions of return listed above are not respected,'), 'TRL', 2, 'C'); + $pdf->Cell(0, 6, self::l('we reserve the right to refuse your package and/or reimbursement.'), 'BRL', 2, 'C'); + + return $pdf->Output(sprintf('%06d', self::$order->id).'.pdf', $mode); + } + + /** + * Product table with references, quantities... + */ + public function ProdReturnTab() + { + $header = array( + array(self::l('Description'), 'L'), + array(self::l('Reference'), 'L'), + array(self::l('Qty'), 'C') + ); + $w = array(110, 25, 20); + $this->SetFont(self::fontname(), 'B', 8); + $this->SetFillColor(240, 240, 240); + for ($i = 0; $i < sizeof($header); $i++) + $this->Cell($w[$i], 5, $header[$i][0], 'T', 0, $header[$i][1], 1); + $this->Ln(); + $this->SetFont(self::fontname(), '', 7); + + $products = OrderReturn::getOrdersReturnProducts(self::$orderReturn->id, self::$order); + foreach ($products AS $product) + { + $before = $this->GetY(); + $this->MultiCell($w[0], 5, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'B'); + $lineSize = $this->GetY() - $before; + $this->SetXY($this->GetX() + $w[0], $this->GetY() - $lineSize); + $this->Cell($w[1], $lineSize, ($product['product_reference'] != '' ? Tools::iconv('utf-8', self::encoding(), $product['product_reference']) : '---'), 'B'); + $this->Cell($w[2], $lineSize, $product['product_quantity'], 'B', 0, 'C'); + $this->Ln(); + } + } + + /* + * Generate the header addresses for pdf File + */ + public static function generateHeaderAddresses(&$pdf, $order, $addressType, $patternRules, $width) + { + $maxY = 0; + $pdf->setY($pdf->GetY() + 5); + foreach($addressType as $type => $idNameAttribute) + { + $currentY = $pdf->GetY(); + + $attributeName = 'id_address_'.$type; + $addressType[$type]['displayed'] = ''; + $addressType[$type]['addressObject'] = new Address((int)($order->$attributeName)); + $addressType[$type]['addressFields'] = AddressFormat::getOrderedAddressFields($addressType[$type]['addressObject']->id_country); + $addressType[$type]['addressFormatedValues'] = AddressFormat::getFormattedAddressFieldsValues( + $addressType[$type]['addressObject'], + $addressType[$type]['addressFields']); + + foreach ($addressType[$type]['addressFields'] as $line) + if (($patternsList = explode(' ', $line))) + { + $tmp = ''; + foreach($patternsList as $pattern) + if (!in_array($pattern, $patternRules['avoid'])) + $tmp .= ((isset($addressType[$type]['addressFormatedValues'][$pattern]) && + !empty($addressType[$type]['addressFormatedValues'][$pattern])) ? + (Tools::iconv('utf-8', self::encoding(), $addressType[$type]['addressFormatedValues'][$pattern]).' ') : ''); + $tmp = trim($tmp); + $addressType[$type]['displayed'] .= (!empty($tmp)) ? $tmp."\n" : ''; + } + $pdf->MultiCell($width, 6.0, $addressType[$type]['displayed'], 0, 'L', 0); + + if ($pdf->GetY() > $maxY) + $maxY = $pdf->GetY(); + + $pdf->SetY($currentY); + $pdf->SetX($width + 10); + } + + $pdf->SetY($maxY); + if ($maxY) + $pdf->Ln(5); + return $addressType; + } + + /** + * Main + * + * @param object $order Order + * @param string $mode Download or display (optional) + */ + public static function invoice($order, $mode = 'D', $multiple = false, &$pdf = NULL, $slip = false, $delivery = false) + { + global $cookie; + + if (!Validate::isLoadedObject($order) OR (!$cookie->id_employee AND (!OrderState::invoiceAvailable($order->getCurrentState()) AND !$order->invoice_number))) + die('Invalid order or invalid order state'); + self::$order = $order; + self::$orderSlip = $slip; + self::$delivery = $delivery; + self::$_iso = strtoupper(Language::getIsoById((int)(self::$order->id_lang))); + if ((self::$_priceDisplayMethod = $order->getTaxCalculationMethod()) === false) + die(self::l('No price display method defined for the customer group')); + + if (!$multiple) + $pdf = new PDF('P', 'mm', 'A4'); + + $pdf->SetAutoPageBreak(true, 35); + $pdf->StartPageGroup(); + + self::$currency = Currency::getCurrencyInstance((int)(self::$order->id_currency)); + + $pdf->AliasNbPages(); + $pdf->AddPage(); + + $width = 100; + $pdf->SetX(10); + $pdf->SetY(25); + $pdf->SetFont(self::fontname(), '', 12); + $pdf->Cell($width, 10, self::l('Delivery'), 0, 'L'); + $pdf->Cell($width, 10, self::l('Invoicing'), 0, 'L'); + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), '', 9); + + $addressType = array( + 'delivery' => array(), + 'invoice' => array(), + ); + + $patternRules = array( + 'optional' => array( + 'address2', + 'company'), + 'avoid' => array( + 'State:iso_code')); + + $addressType = self::generateHeaderAddresses($pdf, $order, $addressType, $patternRules, $width); + + if (Configuration::get('VATNUMBER_MANAGEMENT') AND !empty($addressType['invoice']['addressObject']->vat_number)) + { + $vat_delivery = ''; + if ($addressType['invoice']['addressObject']->id != $addressType['delivery']['addressObject']->id) + $vat_delivery = $addressType['delivery']['addressObject']->vat_number; + $pdf->Cell($width, 10, Tools::iconv('utf-8', self::encoding(), $vat_delivery), 0, 'L'); + $pdf->Cell($width, 10, Tools::iconv('utf-8', self::encoding(), $addressType['invoice']['addressObject']->vat_number), 0, 'L'); + $pdf->Ln(5); + } + + if ($addressType['invoice']['addressObject']->dni != NULL) + $pdf->Cell($width, 10, + self::l('Tax ID number:').' '.Tools::iconv('utf-8', self::encoding(), + $addressType['invoice']['addressObject']->dni), 0, 'L'); + + /* + * display order information + */ + $carrier = new Carrier(self::$order->id_carrier); + if ($carrier->name == '0') + $carrier->name = Configuration::get('PS_SHOP_NAME'); + $history = self::$order->getHistory(self::$order->id_lang); + foreach($history as $h) + if ($h['id_order_state'] == _PS_OS_SHIPPING_) + $shipping_date = $h['date_add']; + $pdf->Ln(12); + $pdf->SetFillColor(240, 240, 240); + $pdf->SetTextColor(0, 0, 0); + $pdf->SetFont(self::fontname(), '', 9); + if (self::$orderSlip) + $pdf->Cell(0, 6, self::l('SLIP #').' '.sprintf('%06d', self::$orderSlip->id).' '.self::l('from') . ' ' .Tools::displayDate(self::$orderSlip->date_upd, self::$order->id_lang), 1, 2, 'L', 1); + elseif (self::$delivery) + $pdf->Cell(0, 6, self::l('DELIVERY SLIP #').Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_DELIVERY_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$delivery).' '.self::l('from') . ' ' .Tools::displayDate(self::$order->delivery_date, self::$order->id_lang), 1, 2, 'L', 1); + else + $pdf->Cell(0, 6, self::l('INVOICE #').' '.Tools::iconv('utf-8', self::encoding(), Configuration::get('PS_INVOICE_PREFIX', (int)($cookie->id_lang))).sprintf('%06d', self::$order->invoice_number).' '.self::l('from') . ' ' .Tools::displayDate(self::$order->invoice_date, self::$order->id_lang), 1, 2, 'L', 1); + $pdf->Cell(55, 6, self::l('Order #').' '.sprintf('%06d', self::$order->id), 'L', 0); + $pdf->Cell(70, 6, self::l('Carrier:').($order->gift ? ' '.Tools::iconv('utf-8', self::encoding(), $carrier->name) : ''), 'L'); + $pdf->Cell(0, 6, self::l('Payment method:'), 'LR'); + $pdf->Ln(5); + $pdf->Cell(55, 6, (isset($shipping_date) ? self::l('Shipping date:').' '.Tools::displayDate($shipping_date, self::$order->id_lang) : ' '), 'LB', 0); + $pdf->Cell(70, 6, ($order->gift ? self::l('Gift-wrapped order') : Tools::iconv('utf-8', self::encoding(), $carrier->name)), 'LRB'); + $pdf->Cell(0, 6, Tools::iconv('utf-8', self::encoding(), $order->payment), 'LRB'); + $pdf->Ln(15); + $pdf->ProdTab((self::$delivery ? true : '')); + + /* Exit if delivery */ + if (!self::$delivery) + { + if (!self::$orderSlip) + $pdf->DiscTab(); + $priceBreakDown = array(); + $pdf->priceBreakDownCalculation($priceBreakDown); + + if (!self::$orderSlip OR (self::$orderSlip AND self::$orderSlip->shipping_cost)) + { + $priceBreakDown['totalWithoutTax'] += Tools::ps_round($priceBreakDown['shippingCostWithoutTax'], 2) + Tools::ps_round($priceBreakDown['wrappingCostWithoutTax'], 2); + $priceBreakDown['totalWithTax'] += self::$order->total_shipping + self::$order->total_wrapping; + } + if (!self::$orderSlip) + { + $taxDiscount = self::$order->getTaxesAverageUsed(); + if ($taxDiscount != 0) + $priceBreakDown['totalWithoutTax'] -= Tools::ps_round(self::$order->total_discounts / (1 + self::$order->getTaxesAverageUsed() * 0.01), 2); + else + $priceBreakDown['totalWithoutTax'] -= self::$order->total_discounts; + $priceBreakDown['totalWithTax'] -= self::$order->total_discounts; + } + + /* + * Display price summation + */ + if (Configuration::get('PS_TAX') OR $order->total_products_wt != $order->total_products) + { + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), 'B', 8); + $width = 165; + $pdf->Cell($width, 0, self::l('Total products (tax excl.)').' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalProductsWithoutTax'], self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + + $pdf->SetFont(self::fontname(), 'B', 8); + $width = 165; + $pdf->Cell($width, 0, self::l('Total products (tax incl.)').' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalProductsWithTax'], self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + else + { + $pdf->Ln(5); + $pdf->SetFont(self::fontname(), 'B', 8); + $width = 165; + $pdf->Cell($width, 0, self::l('Total products ').' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalProductsWithoutTax'], self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + + if (!self::$orderSlip AND self::$order->total_discounts != '0.00') + { + $pdf->Cell($width, 0, self::l('Total discounts (tax incl.)').' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (!self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_discounts, self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + + if(isset(self::$order->total_wrapping) and ((float)(self::$order->total_wrapping) > 0)) + { + $pdf->Cell($width, 0, self::l('Total gift-wrapping').' : ', 0, 0, 'R'); + if (self::$_priceDisplayMethod == PS_TAX_EXC) + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['wrappingCostWithoutTax'], self::$currency, true)), 0, 0, 'R'); + else + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_wrapping, self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + + if (self::$order->total_shipping != '0.00' AND (!self::$orderSlip OR (self::$orderSlip AND self::$orderSlip->shipping_cost))) + { + $pdf->Cell($width, 0, self::l('Total shipping').' : ', 0, 0, 'R'); + if (self::$_priceDisplayMethod == PS_TAX_EXC) + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(Tools::ps_round($priceBreakDown['shippingCostWithoutTax'], 2), self::$currency, true)), 0, 0, 'R'); + else + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_shipping, self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + + if (Configuration::get('PS_TAX') OR $order->total_products_wt != $order->total_products) + { + $pdf->Cell($width, 0, self::l('Total').' '.(self::$_priceDisplayMethod == PS_TAX_EXC ? self::l(' (tax incl.)') : self::l(' (tax excl.)')).' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice((self::$_priceDisplayMethod == PS_TAX_EXC ? $priceBreakDown['totalWithTax'] : $priceBreakDown['totalWithoutTax']), self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + $pdf->Cell($width, 0, self::l('Total').' '.(self::$_priceDisplayMethod == PS_TAX_EXC ? self::l(' (tax excl.)') : self::l(' (tax incl.)')).' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice((self::$_priceDisplayMethod == PS_TAX_EXC ? $priceBreakDown['totalWithoutTax'] : $priceBreakDown['totalWithTax']), self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + else + { + $pdf->Cell($width, 0, self::l('Total').' : ', 0, 0, 'R'); + $pdf->Cell(0, 0, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(($priceBreakDown['totalWithoutTax']), self::$currency, true)), 0, 0, 'R'); + $pdf->Ln(4); + } + + $pdf->TaxTab($priceBreakDown); + } + Hook::PDFInvoice($pdf, self::$order->id); + + if (!$multiple) + return $pdf->Output(sprintf('%06d', self::$order->id).'.pdf', $mode); + } + + public function ProdTabHeader($delivery = false) + { + if (!$delivery) + { + $header = array( + array(self::l('Description'), 'L'), + array(self::l('Reference'), 'L'), + array(self::l('U. price'), 'R'), + array(self::l('Qty'), 'C'), + array(self::l('Total'), 'R') + ); + $w = array(100, 15, 30, 15, 30); + } + else + { + $header = array( + array(self::l('Description'), 'L'), + array(self::l('Reference'), 'L'), + array(self::l('Qty'), 'C'), + ); + $w = array(120, 30, 10); + } + $this->SetFont(self::fontname(), 'B', 8); + $this->SetFillColor(240, 240, 240); + if ($delivery) + $this->SetX(25); + for($i = 0; $i < sizeof($header); $i++) + $this->Cell($w[$i], 5, $header[$i][0], 'T', 0, $header[$i][1], 1); + $this->Ln(); + $this->SetFont(self::fontname(), '', 8); + } + + /** + * Product table with price, quantities... + */ + public function ProdTab($delivery = false) + { + if (!$delivery) + $w = array(100, 15, 30, 15, 30); + else + $w = array(120, 30, 10); + self::ProdTabHeader($delivery); + if (!self::$orderSlip) + { + if (isset(self::$order->products) AND sizeof(self::$order->products)) + $products = self::$order->products; + else + $products = self::$order->getProducts(); + } + else + $products = self::$orderSlip->getProducts(); + $customizedDatas = Product::getAllCustomizedDatas((int)(self::$order->id_cart)); + Product::addCustomizationPrice($products, $customizedDatas); + + $counter = 0; + $lines = 25; + $lineSize = 0; + $line = 0; + + foreach($products AS $product) + if (!$delivery OR ((int)($product['product_quantity']) - (int)($product['product_quantity_refunded']) > 0)) + { + if($counter >= $lines) + { + $this->AddPage(); + $this->Ln(); + self::ProdTabHeader($delivery); + $lineSize = 0; + $counter = 0; + $lines = 40; + $line++; + } + $counter = $counter + ($lineSize / 5) ; + + $i = -1; + + // Unit vars + $unit_without_tax = $product['product_price'] + $product['ecotax']; + $unit_with_tax = $product['product_price_wt']; + if (self::$_priceDisplayMethod == PS_TAX_EXC) + $unit_price = &$unit_without_tax; + else + $unit_price = &$unit_with_tax; + $productQuantity = $delivery ? ((int)($product['product_quantity']) - (int)($product['product_quantity_refunded'])) : (int)($product['product_quantity']); + + if ($productQuantity <= 0) + continue ; + + // Total prices + $total_with_tax = $unit_with_tax * $productQuantity; + $total_without_tax = $unit_without_tax * $productQuantity; + // Spec + if (self::$_priceDisplayMethod == PS_TAX_EXC) + $final_price = &$total_without_tax; + else + $final_price = &$total_with_tax; + // End Spec + + if (isset($customizedDatas[$product['product_id']][$product['product_attribute_id']])) + { + $custoLabel = ''; + + foreach($customizedDatas[$product['product_id']][$product['product_attribute_id']] as $customizedData) + { + $customizationGroup = $customizedData['datas']; + $nb_images = 0; + + if (array_key_exists(_CUSTOMIZE_FILE_, $customizationGroup)) + $nb_images = sizeof($customizationGroup[_CUSTOMIZE_FILE_]); + + if (array_key_exists(_CUSTOMIZE_TEXTFIELD_, $customizationGroup)) + foreach($customizationGroup[_CUSTOMIZE_TEXTFIELD_] as $customization) + if(!empty($customization['name'])) $custoLabel .= '- '.$customization['name'].': '.$customization['value']."\n"; + + + if ($nb_images > 0) + $custoLabel .= '- '.$nb_images. ' '. self::l('image(s)')."\n"; + + $custoLabel .= "---\n"; + } + + $custoLabel = rtrim($custoLabel, "---\n"); + + $productQuantity = (int)($product['product_quantity']) - (int)($product['customizationQuantityTotal']); + if ($delivery) + $this->SetX(25); + $before = $this->GetY(); + $this->MultiCell($w[++$i], 5, Tools::iconv('utf-8', self::encoding(), $product['product_name']).' - '.self::l('Customized')." \n".Tools::iconv('utf-8', self::encoding(), $custoLabel), 'B'); + $lineSize = $this->GetY() - $before; + $this->SetXY($this->GetX() + $w[0] + ($delivery ? 15 : 0), $this->GetY() - $lineSize); + $this->Cell($w[++$i], $lineSize, $product['product_reference'], 'B'); + if (!$delivery) + $this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 'B', 0, 'R'); + $this->Cell($w[++$i], $lineSize, (int)($product['customizationQuantityTotal']), 'B', 0, 'C'); + if (!$delivery) + $this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price * (int)($product['customizationQuantityTotal']), self::$currency, true)), 'B', 0, 'R'); + $this->Ln(); + $i = -1; + $total_with_tax = $unit_with_tax * $productQuantity; + $total_without_tax = $unit_without_tax * $productQuantity; + } + if ($delivery) + $this->SetX(25); + if ($productQuantity) + { + $before = $this->GetY(); + $this->MultiCell($w[++$i], 5, Tools::iconv('utf-8', self::encoding(), $product['product_name']), 'B'); + $lineSize = $this->GetY() - $before; + $this->SetXY($this->GetX() + $w[0] + ($delivery ? 15 : 0), $this->GetY() - $lineSize); + $this->Cell($w[++$i], $lineSize, ($product['product_reference'] ? $product['product_reference'] : '--'), 'B'); + if (!$delivery) + $this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($unit_price, self::$currency, true)), 'B', 0, 'R'); + $this->Cell($w[++$i], $lineSize, $productQuantity, 'B', 0, 'C'); + if (!$delivery) + $this->Cell($w[++$i], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($final_price, self::$currency, true)), 'B', 0, 'R'); + $this->Ln(); + } + } + + if (!sizeof(self::$order->getDiscounts()) AND !$delivery) + $this->Cell(array_sum($w), 0, ''); + } + + /** + * Discount table with value, quantities... + */ + public function DiscTab() + { + $w = array(90, 25, 15, 10, 25, 25); + $this->SetFont(self::fontname(), 'B', 7); + $discounts = self::$order->getDiscounts(); + + foreach($discounts AS $discount) + { + $this->Cell($w[0], 6, self::l('Discount:').' '.$discount['name'], 'B'); + $this->Cell($w[1], 6, '', 'B'); + $this->Cell($w[2], 6, '', 'B'); + $this->Cell($w[3], 6, '', 'B', 0, 'R'); + $this->Cell($w[4], 6, '1', 'B', 0, 'C'); + $this->Cell($w[5], 6, ((!self::$orderSlip AND $discount['value'] != 0.00) ? '-' : '').self::convertSign(Tools::displayPrice($discount['value'], self::$currency, true)), 'B', 0, 'R'); + $this->Ln(); + } + + if (sizeof($discounts)) + $this->Cell(array_sum($w), 0, ''); + } + + public function priceBreakDownCalculation(&$priceBreakDown) + { + $priceBreakDown['totalsWithoutTax'] = array(); + $priceBreakDown['totalsWithTax'] = array(); + $priceBreakDown['totalsEcotax'] = array(); + $priceBreakDown['wrappingCostWithoutTax'] = 0; + $priceBreakDown['shippingCostWithoutTax'] = 0; + $priceBreakDown['totalWithoutTax'] = 0; + $priceBreakDown['totalWithTax'] = 0; + $priceBreakDown['totalProductsWithoutTax'] = 0; + $priceBreakDown['totalProductsWithTax'] = 0; + $priceBreakDown['hasEcotax'] = 0; + $priceBreakDown['totalsProductsWithTaxAndReduction'] = array(); + if (self::$order->total_paid == '0.00' AND self::$order->total_discounts == 0) + return ; + + // Setting products tax + if (isset(self::$order->products) AND sizeof(self::$order->products)) + $products = self::$order->products; + else + $products = self::$order->getProducts(); + $amountWithoutTax = 0; + $taxes = array(); + /* Firstly calculate all prices */ + foreach ($products AS &$product) + { + if (!isset($priceBreakDown['totalsWithTax'][$product['tax_rate']])) + $priceBreakDown['totalsWithTax'][$product['tax_rate']] = 0; + if (!isset($priceBreakDown['totalsEcotax'][$product['tax_rate']])) + $priceBreakDown['totalsEcotax'][$product['tax_rate']] = 0; + if (!isset($priceBreakDown['totalsWithoutTax'][$product['tax_rate']])) + $priceBreakDown['totalsWithoutTax'][$product['tax_rate']] = 0; + if (!isset($taxes[$product['tax_rate']])) + $taxes[$product['tax_rate']] = 0; + if (!isset($priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']])) + $priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']] = 0; + + + /* Without tax */ + if (self::$_priceDisplayMethod == PS_TAX_EXC) + $product['priceWithoutTax'] = Tools::ps_round((float)($product['product_price']) + (float)$product['ecotax'], 2); + else + $product['priceWithoutTax'] = ($product['product_price_wt_but_ecotax'] / (1 + $product['tax_rate'] / 100)) + (float)$product['ecotax']; + + $product['priceWithoutTax'] = $product['priceWithoutTax'] * (int)($product['product_quantity']); + + $amountWithoutTax += $product['priceWithoutTax']; + /* With tax */ + $product['priceWithTax'] = (float)($product['product_price_wt']) * (int)($product['product_quantity']); + $product['priceEcotax'] = $product['ecotax'] * (1 + $product['ecotax_tax_rate'] / 100); + } + + $priceBreakDown['totalsProductsWithoutTax'] = $priceBreakDown['totalsWithoutTax']; + $priceBreakDown['totalsProductsWithTax'] = $priceBreakDown['totalsWithTax']; + + $tmp = 0; + $product = &$tmp; + /* And secondly assign to each tax its own reduction part */ + $discountAmount = (float)(self::$order->total_discounts); + foreach ($products as $product) + { + $ratio = $amountWithoutTax == 0 ? 0 : $product['priceWithoutTax'] / $amountWithoutTax; + $priceWithTaxAndReduction = $product['priceWithTax'] - $discountAmount * $ratio; + $discountAmountWithoutTax = Tools::ps_round(($discountAmount * $ratio) / (1 + ($product['tax_rate'] / 100)), 2); + if (self::$_priceDisplayMethod == PS_TAX_EXC) + { + $vat = $priceWithTaxAndReduction - Tools::ps_round($priceWithTaxAndReduction / $product['product_quantity'] / (((float)($product['tax_rate']) / 100) + 1), 2) * $product['product_quantity']; + $priceBreakDown['totalsWithoutTax'][$product['tax_rate']] += $product['priceWithoutTax'] ; + $priceBreakDown['totalsProductsWithoutTax'][$product['tax_rate']] += $product['priceWithoutTax']; + $priceBreakDown['totalsProductsWithoutTaxAndReduction'][$product['tax_rate']] = Tools::ps_round($product['priceWithoutTax'] - (float)$discountAmountWithoutTax, 2); + } + else + { + $vat = (float)($product['priceWithoutTax']) * ((float)($product['tax_rate']) / 100) * $product['product_quantity']; + $priceBreakDown['totalsWithTax'][$product['tax_rate']] += $product['priceWithTax']; + $priceBreakDown['totalsProductsWithTax'][$product['tax_rate']] += $product['priceWithTax']; + $priceBreakDown['totalsProductsWithoutTax'][$product['tax_rate']] += $product['priceWithoutTax']; + $priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']] += $priceWithTaxAndReduction; + } + + $priceBreakDown['totalsEcotax'][$product['tax_rate']] += ($product['priceEcotax'] * $product['product_quantity']); + if ($priceBreakDown['totalsEcotax'][$product['tax_rate']]) + $priceBreakDown['hasEcotax'] = 1; + $taxes[$product['tax_rate']] += $vat; + } + + $carrier_tax_rate = (float)self::$order->carrier_tax_rate; + if (($priceBreakDown['totalsWithoutTax'] == $priceBreakDown['totalsWithTax']) AND (!$carrier_tax_rate OR $carrier_tax_rate == '0.00') AND (!self::$order->total_wrapping OR self::$order->total_wrapping == '0.00')) + return ; + + foreach ($taxes AS $tax_rate => &$vat) + { + if (self::$_priceDisplayMethod == PS_TAX_EXC) + { + $priceBreakDown['totalsWithoutTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsWithoutTax'][$tax_rate], 2); + $priceBreakDown['totalsProductsWithoutTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsWithoutTax'][$tax_rate], 2); + $priceBreakDown['totalsWithTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsWithoutTax'][$tax_rate] * (1 + $tax_rate / 100), 2); + $priceBreakDown['totalsProductsWithTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsProductsWithoutTax'][$tax_rate] * (1 + $tax_rate / 100), 2); + $priceBreakDown['totalsProductsWithTaxAndReduction'][$product['tax_rate']] += Tools::ps_round($priceBreakDown['totalsProductsWithoutTaxAndReduction'][$product['tax_rate']] * (1 + $tax_rate / 100), 2); + } + else + { + $priceBreakDown['totalsWithoutTax'][$tax_rate] = $priceBreakDown['totalsProductsWithoutTax'][$tax_rate]; + $priceBreakDown['totalsProductsWithoutTax'][$tax_rate] = Tools::ps_round($priceBreakDown['totalsProductsWithoutTax'][$tax_rate], 2); + $priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate] = $priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate] / (1 + ($tax_rate / 100)); + } + + $priceBreakDown['totalWithTax'] += $priceBreakDown['totalsWithTax'][$tax_rate]; + $priceBreakDown['totalWithoutTax'] += $priceBreakDown['totalsWithoutTax'][$tax_rate]; + $priceBreakDown['totalProductsWithoutTax'] += $priceBreakDown['totalsProductsWithoutTax'][$tax_rate]; + $priceBreakDown['totalProductsWithTax'] += $priceBreakDown['totalsProductsWithTax'][$tax_rate]; + + } + $priceBreakDown['taxes'] = $taxes; + $priceBreakDown['shippingCostWithoutTax'] = ($carrier_tax_rate AND $carrier_tax_rate != '0.00') ? (self::$order->total_shipping / (1 + ($carrier_tax_rate / 100))) : self::$order->total_shipping; + if (self::$order->total_wrapping AND self::$order->total_wrapping != '0.00') + { + $wrappingTax = new Tax(Configuration::get('PS_GIFT_WRAPPING_TAX')); + $priceBreakDown['wrappingCostWithoutTax'] = self::$order->total_wrapping / (1 + ((float)($wrappingTax->rate) / 100)); + } + } + + /** + * Tax table + */ + public function TaxTab(&$priceBreakDown) + { + + $invoiceAddress = new Address(self::$order->id_address_invoice); + if (Configuration::get('VATNUMBER_MANAGEMENT') AND !empty($invoiceAddress->vat_number) AND $invoiceAddress->id_country != Configuration::get('VATNUMBER_COUNTRY')) + { + $this->Ln(); + $this->Cell(30, 0, self::l('Exempt of VAT according section 259B of the General Tax Code.'), 0, 0, 'L'); + return; + } + + if (self::$order->total_paid == '0.00' OR (!(int)(Configuration::get('PS_TAX')) AND self::$order->total_products == self::$order->total_products_wt)) + return ; + + $carrier_tax_rate = (float)self::$order->carrier_tax_rate; + if (($priceBreakDown['totalsWithoutTax'] == $priceBreakDown['totalsWithTax']) AND (!$carrier_tax_rate OR $carrier_tax_rate == '0.00') AND (!self::$order->total_wrapping OR self::$order->total_wrapping == '0.00')) + return ; + + // Displaying header tax + if ($priceBreakDown['hasEcotax']) + { + $header = array(self::l('Tax detail'), self::l('Tax'), self::l('Pre-Tax Total'), self::l('Total Tax'), self::l('Ecotax (Tax Incl.)'), self::l('Total with Tax')); + $w = array(60, 20, 40, 20, 30, 20); + } + else + { + $header = array(self::l('Tax detail'), self::l('Tax'), self::l('Pre-Tax Total'), self::l('Total Tax'), self::l('Total with Tax')); + $w = array(60, 30, 40, 30, 30); + } + $this->SetFont(self::fontname(), 'B', 8); + for($i = 0; $i < sizeof($header); $i++) + $this->Cell($w[$i], 5, $header[$i], 0, 0, 'R'); + + $this->Ln(); + $this->SetFont(self::fontname(), '', 7); + + $nb_tax = 0; + + // Display product tax + foreach ($priceBreakDown['taxes'] AS $tax_rate => $vat) + { + if ($tax_rate != '0.00' AND $priceBreakDown['totalsProductsWithTax'][$tax_rate] != '0.00') + { + $nb_tax++; + $before = $this->GetY(); + $lineSize = $this->GetY() - $before; + $this->SetXY($this->GetX(), $this->GetY() - $lineSize + 3); + $this->Cell($w[0], $lineSize, self::l('Products'), 0, 0, 'R'); + $this->Cell($w[1], $lineSize, number_format($tax_rate, 3, ',', ' ').' %', 0, 0, 'R'); + $this->Cell($w[2], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate], self::$currency, true)), 0, 0, 'R'); + $this->Cell($w[3], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate] - $priceBreakDown['totalsProductsWithoutTaxAndReduction'][$tax_rate], self::$currency, true)), 0, 0, 'R'); + if ($priceBreakDown['hasEcotax']) + $this->Cell($w[4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsEcotax'][$tax_rate], self::$currency, true)), 0, 0, 'R'); + $this->Cell($w[$priceBreakDown['hasEcotax'] ? 5 : 4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['totalsProductsWithTaxAndReduction'][$tax_rate], self::$currency, true)), 0, 0, 'R'); + $this->Ln(); + } + } + + // Display carrier tax + if ($carrier_tax_rate AND $carrier_tax_rate != '0.00' AND ((self::$order->total_shipping != '0.00' AND !self::$orderSlip) OR (self::$orderSlip AND self::$orderSlip->shipping_cost))) + { + $nb_tax++; + $before = $this->GetY(); + $lineSize = $this->GetY() - $before; + $this->SetXY($this->GetX(), $this->GetY() - $lineSize + 3); + $this->Cell($w[0], $lineSize, self::l('Carrier'), 0, 0, 'R'); + $this->Cell($w[1], $lineSize, number_format($carrier_tax_rate, 3, ',', ' ').' %', 0, 0, 'R'); + $this->Cell($w[2], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['shippingCostWithoutTax'], self::$currency, true)), 0, 0, 'R'); + $this->Cell($w[3], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_shipping - $priceBreakDown['shippingCostWithoutTax'], self::$currency, true)), 0, 0, 'R'); + if ($priceBreakDown['hasEcotax']) + $this->Cell($w[4], $lineSize, (self::$orderSlip ? '-' : '').'', 0, 0, 'R'); + $this->Cell($w[$priceBreakDown['hasEcotax'] ? 5 : 4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_shipping, self::$currency, true)), 0, 0, 'R'); + $this->Ln(); + } + + // Display wrapping tax + if (self::$order->total_wrapping AND self::$order->total_wrapping != '0.00') + { + $tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX'))); + $taxRate = $tax->rate; + + $nb_tax++; + $before = $this->GetY(); + $lineSize = $this->GetY() - $before; + $this->SetXY($this->GetX(), $this->GetY() - $lineSize + 3); + $this->Cell($w[0], $lineSize, self::l('Gift-wrapping'), 0, 0, 'R'); + $this->Cell($w[1], $lineSize, number_format($taxRate, 3, ',', ' ').' %', 0, 0, 'R'); + $this->Cell($w[2], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice($priceBreakDown['wrappingCostWithoutTax'], self::$currency, true)), 0, 0, 'R'); + $this->Cell($w[3], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_wrapping - $priceBreakDown['wrappingCostWithoutTax'], self::$currency, true)), 0, 0, 'R'); + $this->Cell($w[4], $lineSize, (self::$orderSlip ? '-' : '').self::convertSign(Tools::displayPrice(self::$order->total_wrapping, self::$currency, true)), 0, 0, 'R'); + } + + if (!$nb_tax) + $this->Cell(190, 10, self::l('No tax'), 0, 0, 'C'); + } + + static protected function convertSign($s) + { + $arr['before'] = array('€', '£', '¥'); + $arr['after'] = array(chr(128), chr(163), chr(165)); + return str_replace($arr['before'], $arr['after'], $s); + } + + static protected function l($string) + { + global $cookie; + $iso = Language::getIsoById((isset($cookie->id_lang) AND Validate::isUnsignedId($cookie->id_lang)) ? $cookie->id_lang : Configuration::get('PS_LANG_DEFAULT')); + + if (@!include(_PS_TRANSLATIONS_DIR_.$iso.'/pdf.php')) + die('Cannot include PDF translation language file : '._PS_TRANSLATIONS_DIR_.$iso.'/pdf.php'); + + if (!isset($_LANGPDF) OR !is_array($_LANGPDF)) + return str_replace('"', '"', $string); + $key = md5(str_replace('\'', '\\\'', $string)); + $str = (key_exists('PDF_invoice'.$key, $_LANGPDF) ? $_LANGPDF['PDF_invoice'.$key] : $string); + + return (Tools::iconv('utf-8', self::encoding(), $str)); + } + + static public function encoding() + { + return (isset(self::$_pdfparams[self::$_iso]) AND is_array(self::$_pdfparams[self::$_iso]) AND self::$_pdfparams[self::$_iso]['encoding']) ? self::$_pdfparams[self::$_iso]['encoding'] : 'iso-8859-1'; + } + + static public function embedfont() + { + return (((isset(self::$_pdfparams[self::$_iso]) AND is_array(self::$_pdfparams[self::$_iso]) AND self::$_pdfparams[self::$_iso]['font']) AND !in_array(self::$_pdfparams[self::$_iso]['font'], self::$_fpdf_core_fonts)) ? self::$_pdfparams[self::$_iso]['font'] : false); + } + + static public function fontname() + { + $font = self::embedfont(); + if (in_array(self::$_pdfparams[self::$_iso]['font'], self::$_fpdf_core_fonts)) + $font = self::$_pdfparams[self::$_iso]['font']; + return $font ? $font : 'Arial'; + } + +} + diff --git a/classes/Pack.php b/classes/Pack.php new file mode 100644 index 000000000..f0c1d5d61 --- /dev/null +++ b/classes/Pack.php @@ -0,0 +1,201 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PackCore extends Product +{ + protected static $cachePackItems = array(); + protected static $cacheIsPack = array(); + protected static $cacheIsPacked = array(); + + public static function isPack($id_product) + { + if (!array_key_exists($id_product, self::$cacheIsPack)) + { + $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'pack WHERE id_product_pack = '.(int)($id_product)); + self::$cacheIsPack[$id_product] = ($result > 0); + } + return self::$cacheIsPack[$id_product]; + } + + public static function isPacked($id_product) + { + if (!array_key_exists($id_product, self::$cacheIsPacked)) + { + $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'pack WHERE id_product_item = '.(int)($id_product)); + self::$cacheIsPacked[$id_product] = ($result > 0); + } + return self::$cacheIsPacked[$id_product]; + } + + public static function noPackPrice($id_product) + { + global $cookie; + + $sum = 0; + + $price_display_method = !self::$_taxCalculationMethod; + $items = self::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); + foreach ($items as $item) + $sum += $item->getPrice($price_display_method) * $item->pack_quantity; + return $sum; + } + + public static function getItems($id_product, $id_lang) + { + if (array_key_exists($id_product, self::$cachePackItems)) + return self::$cachePackItems[$id_product]; + $result = Db::getInstance()->ExecuteS('SELECT id_product_item, quantity FROM '._DB_PREFIX_.'pack where id_product_pack = '.(int)($id_product)); + $arrayResult = array(); + foreach ($result AS $row) + { + $p = new Product($row['id_product_item'], false, (int)($id_lang)); + $p->pack_quantity = $row['quantity']; + $arrayResult[] = $p; + } + self::$cachePackItems[$id_product] = $arrayResult; + return self::$cachePackItems[$id_product]; + } + + public static function isInStock($id_product) + { + $items = self::getItems((int)($id_product), Configuration::get('PS_LANG_DEFAULT')); + foreach ($items AS $item) + if ($item->quantity < $item->pack_quantity AND !$item->isAvailableWhenOutOfStock((int)($item->out_of_stock))) + return false; + return true; + } + + public static function getItemTable($id_product, $id_lang, $full = false) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.*, pl.*, i.`id_image`, il.`legend`, t.`rate`, cl.`name` AS category_default, a.quantity AS pack_quantity + FROM `'._DB_PREFIX_.'pack` a + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = a.id_product_item + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.id_product = pl.id_product AND pl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') + WHERE a.`id_product_pack` = '.(int)($id_product) + ); + if (!$full) + return $result; + + $arrayResult = array(); + foreach ($result as $row) + if (!Pack::isPack($row['id_product'])) + $arrayResult[] = Product::getProductProperties($id_lang, $row); + return $arrayResult; + } + + public static function getPacksTable($id_product, $id_lang, $full = false, $limit = NULL) + { + $packs = Db::getInstance()->getValue(' + SELECT GROUP_CONCAT(a.`id_product_pack`) + FROM `'._DB_PREFIX_.'pack` a + WHERE a.`id_product_item` = '.(int)$id_product); + + if (!(int)$packs) + return array(); + + $sql = ' + SELECT p.*, pl.*, i.`id_image`, il.`legend`, t.`rate` + FROM `'._DB_PREFIX_.'product` p + NATURAL LEFT JOIN `'._DB_PREFIX_.'product_lang` pl + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$id_lang.') + WHERE pl.`id_lang` = '.(int)$id_lang.' + AND p.`id_product` IN ('.$packs.')'; + if ($limit) + $sql .= ' LIMIT '.(int)$limit; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if (!$full) + return $result; + + $arrayResult = array(); + foreach ($result as $row) + if (!Pack::isPacked($row['id_product'])) + $arrayResult[] = Product::getProductProperties($id_lang, $row); + return $arrayResult; + } + + public static function deleteItems($id_product) + { + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET cache_is_pack = 0 WHERE id_product = '.(int)($id_product).' LIMIT 1'); + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'pack` WHERE `id_product_pack` = '.(int)($id_product)); + } + + /** + * @deprecated + */ + public static function addItems($id_product, $ids) + { + Tools::displayAsDeprecated(); + + array_pop($ids); + foreach ($ids as $id_product_item) + { + $idQty = explode('x', $id_product_item); + if (!self::addItem($id_product, $idQty[1], $idQty[0])) + return false; + } + return true; + } + + /** + * Add an item to the pack + * + * @param integer $id_product + * @param integer $id_item + * @param integer $qty + * @return boolean true if everything was fine + */ + public static function addItem($id_product, $id_item, $qty) + { + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET cache_is_pack = 1 WHERE id_product = '.(int)($id_product).' LIMIT 1'); + return Db::getInstance()->AutoExecute(_DB_PREFIX_.'pack', array('id_product_pack' => (int)($id_product), 'id_product_item' => (int)($id_item), 'quantity' => (int)($qty)), 'INSERT'); + } + + public static function duplicate($id_product_old, $id_product_new) + { + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'pack (id_product_pack, id_product_item, quantity) + (SELECT '.(int)($id_product_new).', id_product_item, quantity FROM '._DB_PREFIX_.'pack WHERE id_product_pack = '.(int)($id_product_old).')'); + + // If return query result, a non-pack product will return false + return true; + } +} + diff --git a/classes/Page.php b/classes/Page.php new file mode 100644 index 000000000..aa493cffd --- /dev/null +++ b/classes/Page.php @@ -0,0 +1,129 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6946 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PageCore extends ObjectModel +{ + public $id_page_type; + public $id_object; + + public $name; + + protected $fieldsRequired = array ('id_page_type'); + protected $fieldsValidate = array ('id_page_type' => 'isUnsignedId', 'id_object' => 'isUnsignedId'); + + protected $table = 'page'; + protected $identifier = 'id_page'; + + public function getFields() + { + parent::validateFields(); + $fields['id_page_type'] = (int)($this->id_page_type); + $fields['id_object'] = (int)($this->id_object); + return $fields; + } + + /** + * @return int Current page ID + */ + public static function getCurrentId() + { + $phpSelf = isset($_SERVER['PHP_SELF']) ? substr($_SERVER['PHP_SELF'], strlen(__PS_BASE_URI__)) : ''; + $pageTypeID = Page::getPageTypeByName($phpSelf); + + // Some pages must be distinguished in order to record exactly what is being seen + $specialArray = array( + 'product.php' => 'id_product', + 'category.php' => 'id_category', + 'order.php' => 'step', + 'manufacturer.php' => 'id_manufacturer', + ); + + $where = ''; + $insertData = array( + 'id_page_type' => $pageTypeID, + ); + + if (array_key_exists($phpSelf, $specialArray)) + { + $objectID = Tools::getValue($specialArray[$phpSelf]); + $where = ' AND `id_object` = '.(int)$objectID; + $insertData['id_object'] = $objectID; + } + + $sql = 'SELECT `id_page` + FROM `'._DB_PREFIX_.'page` + WHERE `id_page_type` = '.(int)$pageTypeID.$where; + $result = Db::getInstance()->getRow($sql); + if ($result['id_page']) + return $result['id_page']; + + Db::getInstance()->autoExecute(_DB_PREFIX_.'page', $insertData, 'INSERT'); + return Db::getInstance()->Insert_ID(); + } + + /** + * Return page type ID from page name + * + * @param string $name Page name (E.g. product.php) + */ + public static function getPageTypeByName($name) + { + $sql = 'SELECT id_page_type + FROM '._DB_PREFIX_.'page_type + WHERE name = \''.pSQL($name).'\''; + if ($value = Db::getInstance()->getValue($sql)) + return $value; + + Db::getInstance()->autoExecute(_DB_PREFIX_.'page_type', array( + 'name' => $name, + ), 'INSERT'); + return Db::getInstance()->Insert_ID(); + } + + public static function setPageViewed($id_page) + { + $id_date_range = DateRange::getCurrentRange(); + + // Try to increment the visits counter + $sql = 'UPDATE `'._DB_PREFIX_.'page_viewed` + SET `counter` = `counter` + 1 + WHERE `id_date_range` = '.(int)$id_date_range.' + AND `id_page` = '.(int)$id_page.' + AND `id_shop` = ' . Shop::getCurrentShop(); + Db::getInstance()->Execute($sql); + + // If no one has seen the page in this date range, it is added + if (Db::getInstance()->Affected_Rows() == 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'page_viewed', array( + 'id_date_range' => (int)$id_date_range, + 'id_page' => (int)$id_page, + 'counter' => 1, + 'id_shop' => Shop::getCurrentShop(), + 'id_group_shop' => Shop::getCurrentGroupShop(), + ), 'INSERT'); + } +} \ No newline at end of file diff --git a/classes/PaymentCC.php b/classes/PaymentCC.php new file mode 100644 index 000000000..4932f1f4b --- /dev/null +++ b/classes/PaymentCC.php @@ -0,0 +1,74 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PaymentCCCore extends ObjectModel +{ + public $id_order; + public $id_currency; + public $amount; + public $transaction_id; + public $card_number; + public $card_brand; + public $card_expiration; + public $card_holder; + public $date_add; + + protected $fieldsRequired = array('id_currency', 'amount'); + protected $fieldsSize = array('transaction_id' => 254, 'card_number' => 254, 'card_brand' => 254, 'card_expiration' => 254, 'card_holder' => 254); + protected $fieldsValidate = array( + 'id_order' => 'isUnsignedId', 'id_currency' => 'isUnsignedId', 'amount' => 'isPrice', + 'transaction_id' => 'isAnything', 'card_number' => 'isAnything', 'card_brand' => 'isAnything', 'card_expiration' => 'isAnything', 'card_holder' => 'isAnything'); + + protected $table = 'payment_cc'; + protected $identifier = 'id_payment_cc'; + + public function getFields() + { + parent::validateFields(); + $fields['id_order'] = (int)($this->id_order); + $fields['id_currency'] = (int)($this->id_currency); + $fields['amount'] = (float)($this->amount); + $fields['transaction_id'] = pSQL($this->transaction_id); + $fields['card_number'] = pSQL($this->card_number); + $fields['card_brand'] = pSQL($this->card_brand); + $fields['card_expiration'] = pSQL($this->card_expiration); + $fields['card_holder'] = pSQL($this->card_holder); + $fields['date_add'] = pSQL($this->date_add); + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + if (parent::add($autodate, $nullValues)) + { + Module::hookExec('paymentCCAdded', array('paymentCC' => $this)); + return true; + } + return false; + } +} + diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php new file mode 100644 index 000000000..593b51230 --- /dev/null +++ b/classes/PaymentModule.php @@ -0,0 +1,535 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../config/config.inc.php'); + +abstract class PaymentModuleCore extends Module +{ + /** @var integer Current order's id */ + public $currentOrder; + public $currencies = true; + public $currencies_mode = 'checkbox'; + + public function install() + { + if (!parent::install()) + return false; + + // Insert currencies availability + if ($this->currencies_mode == 'checkbox') + { + if (!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_currency` (id_module, id_currency) + SELECT '.(int)($this->id).', id_currency FROM `'._DB_PREFIX_.'currency` WHERE deleted = 0')) + return false; + } + elseif ($this->currencies_mode == 'radio') + { + if (!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_currency` (id_module, id_currency) + VALUES ('.(int)($this->id).', -2)')) + return false; + } + else + Tools::displayError('No currency mode for payment module'); + + // Insert countries availability + $return = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_country` (id_module, id_country) + SELECT '.(int)($this->id).', id_country FROM `'._DB_PREFIX_.'country` WHERE active = 1'); + // Insert group availability + $return &= Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_group` (id_module, id_group) + SELECT '.(int)($this->id).', id_group FROM `'._DB_PREFIX_.'group`'); + + return $return; + } + + public function uninstall() + { + if (!Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'module_country` WHERE id_module = '.(int)($this->id)) + OR !Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'module_currency` WHERE id_module = '.(int)($this->id)) + OR !Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'module_group` WHERE id_module = '.(int)($this->id))) + return false; + return parent::uninstall(); + } + + /** + * Validate an order in database + * Function called from a payment module + * + * @param integer $id_cart Value + * @param integer $id_order_state Value + * @param float $amountPaid Amount really paid by customer (in the default currency) + * @param string $paymentMethod Payment method (eg. 'Credit card') + * @param string $message Message to attach to order + */ + public function validateOrder($id_cart, $id_order_state, $amountPaid, $paymentMethod = 'Unknown', $message = NULL, $extraVars = array(), $currency_special = NULL, $dont_touch_amount = false, $secure_key = false, $id_group_shop = false, $id_shop = false) + { + global $cart; + + $cart = new Cart((int)($id_cart)); + // Does order already exists ? + if (Validate::isLoadedObject($cart) AND $cart->OrderExists() == false) + { + if ($secure_key !== false AND $secure_key != $cart->secure_key) + die(Tools::displayError()); + + // Copying data from cart + $order = new Order(); + $order->id_carrier = (int)($cart->id_carrier); + $order->id_customer = (int)($cart->id_customer); + $order->id_address_invoice = (int)($cart->id_address_invoice); + $order->id_address_delivery = (int)($cart->id_address_delivery); + $vat_address = new Address((int)($order->id_address_delivery)); + $order->id_currency = ($currency_special ? (int)($currency_special) : (int)($cart->id_currency)); + $order->id_lang = (int)($cart->id_lang); + $order->id_cart = (int)($cart->id); + + $order->id_group_shop = (int)($id_group_shop ? $id_group_shop : $cart->id_group_shop); + $order->id_shop = (int)($id_shop ? $id_shop : $cart->id_shop); + + $customer = new Customer((int)($order->id_customer)); + $order->secure_key = ($secure_key ? pSQL($secure_key) : pSQL($customer->secure_key)); + $order->payment = $paymentMethod; + if (isset($this->name)) + $order->module = $this->name; + $order->recyclable = $cart->recyclable; + $order->gift = (int)($cart->gift); + $order->gift_message = $cart->gift_message; + $currency = new Currency($order->id_currency); + $order->conversion_rate = $currency->conversion_rate; + $amountPaid = !$dont_touch_amount ? Tools::ps_round((float)($amountPaid), 2) : $amountPaid; + $order->total_paid_real = $amountPaid; + $order->total_products = (float)($cart->getOrderTotal(false, Cart::ONLY_PRODUCTS)); + $order->total_products_wt = (float)($cart->getOrderTotal(true, Cart::ONLY_PRODUCTS)); + $order->total_discounts = (float)(abs($cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS))); + $order->total_shipping = (float)($cart->getOrderShippingCost()); + $order->carrier_tax_rate = (float)Tax::getCarrierTaxRate($cart->id_carrier, (int)$cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + $order->total_wrapping = (float)(abs($cart->getOrderTotal(true, Cart::ONLY_WRAPPING))); + $order->total_paid = (float)(Tools::ps_round((float)($cart->getOrderTotal(true, Cart::BOTH)), 2)); + $order->invoice_date = '0000-00-00 00:00:00'; + $order->delivery_date = '0000-00-00 00:00:00'; + // Amount paid by customer is not the right one -> Status = payment error + // We don't use the following condition to avoid the float precision issues : http://www.php.net/manual/en/language.types.float.php + // if ($order->total_paid != $order->total_paid_real) + // We use number_format in order to compare two string + if (number_format($order->total_paid, 2) != number_format($order->total_paid_real, 2)) + $id_order_state = _PS_OS_ERROR_; + // Creating order + if ($cart->OrderExists() == false) + $result = $order->add(); + else + { + $errorMessage = Tools::displayError('An order has already been placed using this cart.'); + Logger::addLog($errorMessage, 4, '0000001', 'Cart', intval($order->id_cart)); + die($errorMessage); + } + + // Next ! + if ($result AND isset($order->id)) + { + if (!$secure_key) + $message .= $this->l('Warning : the secure key is empty, check your payment account before validation'); + // Optional message to attach to this order + if (isset($message) AND !empty($message)) + { + $msg = new Message(); + $message = strip_tags($message, '
'); + if (Validate::isCleanHtml($message)) + { + $msg->message = $message; + $msg->id_order = intval($order->id); + $msg->private = 1; + $msg->add(); + } + } + + // Insert products from cart into order_detail table + $products = $cart->getProducts(); + $productsList = ''; + $db = Db::getInstance(); + $query = 'INSERT INTO `'._DB_PREFIX_.'order_detail` + (`id_order`, `product_id`, `product_attribute_id`, `product_name`, `product_quantity`, `product_quantity_in_stock`, `product_price`, `reduction_percent`, `reduction_amount`, `group_reduction`, `product_quantity_discount`, `product_ean13`, `product_upc`, `product_reference`, `product_supplier_reference`, `product_weight`, `tax_name`, `tax_rate`, `ecotax`, `ecotax_tax_rate`, `discount_quantity_applied`, `download_deadline`, `download_hash`) + VALUES '; + + $customizedDatas = Product::getAllCustomizedDatas((int)($order->id_cart)); + Product::addCustomizationPrice($products, $customizedDatas); + $outOfStock = false; + foreach ($products AS $key => $product) + { + $productQuantity = (int)(Product::getQuantity((int)($product['id_product']), ($product['id_product_attribute'] ? (int)($product['id_product_attribute']) : NULL))); + $quantityInStock = ($productQuantity - (int)($product['cart_quantity']) < 0) ? $productQuantity : (int)($product['cart_quantity']); + if ($id_order_state != _PS_OS_CANCELED_ AND $id_order_state != _PS_OS_ERROR_) + { + if (Product::updateQuantity($product, (int)$order->id)) + $product['stock_quantity'] -= $product['cart_quantity']; + if ($product['stock_quantity'] < 0 && Configuration::get('PS_STOCK_MANAGEMENT')) + $outOfStock = true; + + Product::updateDefaultAttribute($product['id_product']); + } + $price = Product::getPriceStatic((int)($product['id_product']), false, ($product['id_product_attribute'] ? (int)($product['id_product_attribute']) : NULL), 6, NULL, false, true, $product['cart_quantity'], false, (int)($order->id_customer), (int)($order->id_cart), (int)($order->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + $price_wt = Product::getPriceStatic((int)($product['id_product']), true, ($product['id_product_attribute'] ? (int)($product['id_product_attribute']) : NULL), 2, NULL, false, true, $product['cart_quantity'], false, (int)($order->id_customer), (int)($order->id_cart), (int)($order->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + // Add some informations for virtual products + $deadline = '0000-00-00 00:00:00'; + $download_hash = NULL; + if ($id_product_download = ProductDownload::getIdFromIdProduct((int)($product['id_product']))) + { + $productDownload = new ProductDownload((int)($id_product_download)); + $deadline = $productDownload->getDeadLine(); + $download_hash = $productDownload->getHash(); + } + + // Exclude VAT + if (Tax::excludeTaxeOption()) + { + $product['tax'] = 0; + $product['rate'] = 0; + $tax_rate = 0; + } + else + $tax_rate = Tax::getProductTaxRate((int)($product['id_product']), $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + + $ecotaxTaxRate = 0; + if (!empty($product['ecotax'])) + $ecotaxTaxRate = Tax::getProductEcotaxRate($order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + + $quantityDiscount = SpecificPrice::getQuantityDiscount((int)$product['id_product'], Shop::getCurrentShop(), (int)$cart->id_currency, (int)$vat_address->id_country, (int)$customer->id_default_group, (int)$product['cart_quantity']); + $unitPrice = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? intval($product['id_product_attribute']) : NULL), 2, NULL, false, true, 1, false, (int)$order->id_customer, NULL, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + $quantityDiscountValue = $quantityDiscount ? ((Product::getTaxCalculationMethod((int)$order->id_customer) == PS_TAX_EXC ? Tools::ps_round($unitPrice, 2) : $unitPrice) - $quantityDiscount['price'] * (1 + $tax_rate / 100)) : 0.00; + $query .= '('.(int)($order->id).', + '.(int)($product['id_product']).', + '.(isset($product['id_product_attribute']) ? (int)($product['id_product_attribute']) : 'NULL').', + \''.pSQL($product['name'].((isset($product['attributes']) AND $product['attributes'] != NULL) ? ' - '.$product['attributes'] : '')).'\', + '.(int)($product['cart_quantity']).', + '.$quantityInStock.', + '.(float)(Product::getPriceStatic((int)($product['id_product']), false, ($product['id_product_attribute'] ? (int)($product['id_product_attribute']) : NULL), (Product::getTaxCalculationMethod((int)($order->id_customer)) == PS_TAX_EXC ? 2 : 6), NULL, false, false, $product['cart_quantity'], false, (int)($order->id_customer), (int)($order->id_cart), (int)($order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}), $specificPrice, FALSE)).', + '.(float)(($specificPrice AND $specificPrice['reduction_type'] == 'percentage') ? $specificPrice['reduction'] * 100 : 0.00).', + '.(float)(($specificPrice AND $specificPrice['reduction_type'] == 'amount') ? (!$specificPrice['id_currency'] ? Tools::convertPrice($specificPrice['reduction'], $order->id_currency) : $specificPrice['reduction']) : 0.00).', + '.(float)(Group::getReduction((int)($order->id_customer))).', + '.$quantityDiscountValue.', + '.(empty($product['ean13']) ? 'NULL' : '\''.pSQL($product['ean13']).'\'').', + '.(empty($product['upc']) ? 'NULL' : '\''.pSQL($product['upc']).'\'').', + '.(empty($product['reference']) ? 'NULL' : '\''.pSQL($product['reference']).'\'').', + '.(empty($product['supplier_reference']) ? 'NULL' : '\''.pSQL($product['supplier_reference']).'\'').', + '.(float)($product['id_product_attribute'] ? $product['weight_attribute'] : $product['weight']).', + \''.(empty($tax_rate) ? '' : pSQL($product['tax'])).'\', + '.(float)($tax_rate).', + '.(float)Tools::convertPrice(floatval($product['ecotax']), intval($order->id_currency)).', + '.(float)$ecotaxTaxRate.', + '.(($specificPrice AND $specificPrice['from_quantity'] > 1) ? 1 : 0).', + \''.pSQL($deadline).'\', + \''.pSQL($download_hash).'\'),'; + + $customizationQuantity = 0; + if (isset($customizedDatas[$product['id_product']][$product['id_product_attribute']])) + { + $customizationText = ''; + foreach ($customizedDatas[$product['id_product']][$product['id_product_attribute']] AS $customization) + { + if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_])) + foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] AS $text) + $customizationText .= $text['name'].':'.' '.$text['value'].'
'; + + if (isset($customization['datas'][_CUSTOMIZE_FILE_])) + $customizationText .= sizeof($customization['datas'][_CUSTOMIZE_FILE_]) .' '. Tools::displayError('image(s)').'
'; + + $customizationText .= '---
'; + } + + $customizationText = rtrim($customizationText, '---
'); + + $customizationQuantity = (int)($product['customizationQuantityTotal']); + $productsList .= + ' + '.$product['reference'].' + '.$product['name'].(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '').' - '.$this->l('Customized').(!empty($customizationText) ? ' - '.$customizationText : '').' + '.Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt, $currency, false).' + '.$customizationQuantity.' + '.Tools::displayPrice($customizationQuantity * (Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt), $currency, false).' + '; + } + + if (!$customizationQuantity OR (int)$product['cart_quantity'] > $customizationQuantity) + $productsList .= + ' + '.$product['reference'].' + '.$product['name'].(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '').' + '.Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt, $currency, false).' + '.((int)($product['cart_quantity']) - $customizationQuantity).' + '.Tools::displayPrice(((int)($product['cart_quantity']) - $customizationQuantity) * (Product::getTaxCalculationMethod() == PS_TAX_EXC ? $price : $price_wt), $currency, false).' + '; + } // end foreach ($products) + $query = rtrim($query, ','); + $result = $db->Execute($query); + + // Insert discounts from cart into order_discount table + $discounts = $cart->getDiscounts(); + $discountsList = ''; + $total_discount_value = 0; + $shrunk = false; + foreach ($discounts AS $discount) + { + $objDiscount = new Discount((int)$discount['id_discount'], $order->id_lang); + $value = $objDiscount->getValue(sizeof($discounts), $cart->getOrderTotal(true, Cart::ONLY_PRODUCTS), $order->total_shipping, $cart->id); + if ($objDiscount->id_discount_type == 2 AND in_array($objDiscount->behavior_not_exhausted, array(1,2))) + $shrunk = true; + + if ($shrunk AND ($total_discount_value + $value) > ($order->total_products + $order->total_shipping + $order->total_wrapping)) + { + $amount_to_add = ($order->total_products + $order->total_shipping + $order->total_wrapping) - $total_discount_value; + if ($objDiscount->id_discount_type == 2 AND $objDiscount->behavior_not_exhausted == 2) + { + $voucher = new Discount(); + foreach ($objDiscount AS $key => $discountValue) + $voucher->$key = $discountValue; + $voucher->name = 'VSRK'.(int)$order->id_customer.'O'.(int)$order->id; + $voucher->value = (float)$value - $amount_to_add; + $voucher->add(); + $params['{voucher_amount}'] = Tools::displayPrice($voucher->value, $currency, false); + $params['{voucher_num}'] = $voucher->name; + @Mail::Send((int)$order->id_lang, 'voucher', Mail::l('New voucher regarding your order #').$order->id, $params, $customer->email, $customer->firstname.' '.$customer->lastname); + } + } + else + $amount_to_add = $value; + $order->addDiscount($objDiscount->id, $objDiscount->name, $amount_to_add); + $total_discount_value += $amount_to_add; + if ($id_order_state != _PS_OS_ERROR_ AND $id_order_state != _PS_OS_CANCELED_) + $objDiscount->quantity = $objDiscount->quantity - 1; + $objDiscount->update(); + + $discountsList .= + ' + '.$this->l('Voucher code:').' '.$objDiscount->name.' + '.($value != 0.00 ? '-' : '').Tools::displayPrice($value, $currency, false).' + '; + } + + // Specify order id for message + $oldMessage = Message::getMessageByCartId((int)($cart->id)); + if ($oldMessage) + { + $message = new Message((int)$oldMessage['id_message']); + $message->id_order = (int)$order->id; + $message->update(); + } + + // Hook new order + $orderStatus = new OrderState((int)$id_order_state, (int)$order->id_lang); + if (Validate::isLoadedObject($orderStatus)) + { + Hook::newOrder($cart, $order, $customer, $currency, $orderStatus); + foreach ($cart->getProducts() AS $product) + if ($orderStatus->logable) + ProductSale::addProductSale((int)$product['id_product'], (int)$product['cart_quantity']); + } + + if (isset($outOfStock) AND $outOfStock) + { + $history = new OrderHistory(); + $history->id_order = (int)$order->id; + $history->changeIdOrderState(_PS_OS_OUTOFSTOCK_, (int)$order->id); + $history->addWithemail(); + } + + // Set order state in order history ONLY even if the "out of stock" status has not been yet reached + // So you migth have two order states + $new_history = new OrderHistory(); + $new_history->id_order = (int)$order->id; + $new_history->changeIdOrderState((int)$id_order_state, (int)$order->id); + $new_history->addWithemail(true, $extraVars); + + // Order is reloaded because the status just changed + $order = new Order($order->id); + + // Send an e-mail to customer + if ($id_order_state != _PS_OS_ERROR_ AND $id_order_state != _PS_OS_CANCELED_ AND $customer->id) + { + $invoice = new Address((int)($order->id_address_invoice)); + $delivery = new Address((int)($order->id_address_delivery)); + $carrier = new Carrier((int)($order->id_carrier), $order->id_lang); + $delivery_state = $delivery->id_state ? new State((int)($delivery->id_state)) : false; + $invoice_state = $invoice->id_state ? new State((int)($invoice->id_state)) : false; + + $data = array( + '{firstname}' => $customer->firstname, + '{lastname}' => $customer->lastname, + '{email}' => $customer->email, + '{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"), + '{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"), + '{delivery_block_html}' => $this->_getFormatedAddress($delivery, "
", + array( + 'firstname' => '%s', + 'lastname' => '%s')), + '{invoice_block_html}' => $this->_getFormatedAddress($invoice, "
", + array( + 'firstname' => '%s', + 'lastname' => '%s')), + '{delivery_company}' => $delivery->company, + '{delivery_firstname}' => $delivery->firstname, + '{delivery_lastname}' => $delivery->lastname, + '{delivery_address1}' => $delivery->address1, + '{delivery_address2}' => $delivery->address2, + '{delivery_city}' => $delivery->city, + '{delivery_postal_code}' => $delivery->postcode, + '{delivery_country}' => $delivery->country, + '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', + '{delivery_phone}' => ($delivery->phone) ? $delivery->phone : $delivery->phone_mobile, + '{delivery_other}' => $delivery->other, + '{invoice_company}' => $invoice->company, + '{invoice_vat_number}' => $invoice->vat_number, + '{invoice_firstname}' => $invoice->firstname, + '{invoice_lastname}' => $invoice->lastname, + '{invoice_address2}' => $invoice->address2, + '{invoice_address1}' => $invoice->address1, + '{invoice_city}' => $invoice->city, + '{invoice_postal_code}' => $invoice->postcode, + '{invoice_country}' => $invoice->country, + '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', + '{invoice_phone}' => ($invoice->phone) ? $invoice->phone : $invoice->phone_mobile, + '{invoice_other}' => $invoice->other, + '{order_name}' => sprintf("#%06d", (int)($order->id)), + '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), (int)($order->id_lang), 1), + '{carrier}' => $carrier->name, + '{payment}' => Tools::substr($order->payment, 0, 32), + '{products}' => $productsList, + '{discounts}' => $discountsList, + '{total_paid}' => Tools::displayPrice($order->total_paid, $currency, false), + '{total_products}' => Tools::displayPrice($order->total_paid - $order->total_shipping - $order->total_wrapping + $order->total_discounts, $currency, false), + '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency, false), + '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency, false), + '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency, false)); + + if (is_array($extraVars)) + $data = array_merge($data, $extraVars); + + // Join PDF invoice + if ((int)(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number) + { + $fileAttachment['content'] = PDF::invoice($order, 'S'); + $fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf'; + $fileAttachment['mime'] = 'application/pdf'; + } + else + $fileAttachment = NULL; + + if (Validate::isEmail($customer->email)) + Mail::Send((int)($order->id_lang), 'order_conf', Mail::l('Order confirmation'), $data, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, $fileAttachment); + } + $this->currentOrder = (int)($order->id); + return true; + } + else + { + $errorMessage = Tools::displayError('Order creation failed'); + Logger::addLog($errorMessage, 4, '0000002', 'Cart', intval($order->id_cart)); + die($errorMessage); + } + } + else + { + $errorMessage = Tools::displayError('Cart can\'t be loaded or an order has already been placed using this cart'); + Logger::addLog($errorMessage, 4, '0000001', 'Cart', intval($cart->id)); + die($errorMessage); + } + } + + /** + * @param Object Address $the_address that needs to be txt formated + * @return String the txt formated address block + */ + private function _getTxtFormatedAddress($the_address) + { + $out = ''; + $adr_fields = AddressFormat::getOrderedAddressFields($the_address->id_country); + $r_values = array(); + foreach($adr_fields as $fields_line) + { + $tmp_values = array(); + foreach (explode(' ', $fields_line) as $field_item) + { + $field_item = trim($field_item); + $tmp_values[] = $the_address->{$field_item}; + } + $r_values[] = implode(' ', $tmp_values); + } + + $out = implode("\n", $r_values); + return $out; + } + + /** + * @param Object Address $the_address that needs to be txt formated + * @return String the txt formated address block + */ + + private function _getFormatedAddress(Address $the_address, $line_sep, $fields_style = array()) + { + return AddressFormat::generateAddress($the_address, array('avoid' => array()), $line_sep, ' ', $fields_style); + } + + /** + * @param int $id_currency : this parameter is optionnal but on 1.5 version of Prestashop, it will be REQUIRED + * @return Currency + */ + public function getCurrency($current_id_currency = NULL) + { + if (!(int)$current_id_currency) + global $cookie; + + if (!$this->currencies) + return false; + if ($this->currencies_mode == 'checkbox') + { + $currencies = Currency::getPaymentCurrencies($this->id); + return $currencies; + } + elseif ($this->currencies_mode == 'radio') + { + $currencies = Currency::getPaymentCurrenciesSpecial($this->id); + $currency = $currencies['id_currency']; + if ($currency == -1) + { + // not use $cookie if $current_id_currency is set + if ((int)$current_id_currency) + $id_currency = (int)$current_id_currency; + else + $id_currency = (int)($cookie->id_currency); + } + elseif ($currency == -2) + $id_currency = (int)(Configuration::get('PS_CURRENCY_DEFAULT')); + else + $id_currency = $currency; + } + if (!isset($id_currency) OR empty($id_currency)) + return false; + return (new Currency($id_currency)); + } +} + diff --git a/classes/Product.php b/classes/Product.php new file mode 100644 index 000000000..141d02c19 --- /dev/null +++ b/classes/Product.php @@ -0,0 +1,3486 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7506 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('_CUSTOMIZE_FILE_', 0); +define('_CUSTOMIZE_TEXTFIELD_', 1); + +class ProductCore extends ObjectModel +{ + /** @var string Tax name */ + public $tax_name; + + /** @var string Tax rate */ + public $tax_rate; + + /** @var string Tax rules group */ + public $id_tax_rules_group; + + /** @var integer Manufacturer id */ + public $id_manufacturer; + + /** @var integer Supplier id */ + public $id_supplier; + + /** @var integer default Category id */ + public $id_category_default; + + /** @var integer default Attribute id if color picker is enabled */ + public $id_color_default; + + /** @var string Manufacturer name */ + public $manufacturer_name; + + /** @var string Supplier name */ + public $supplier_name; + + /** @var string Name */ + public $name; + + /** @var string Long description */ + public $description; + + /** @var string Short description */ + public $description_short; + + /** @var integer Quantity available */ + public $quantity = 0; + + /** @var integer Minimal quantity for add to cart */ + public $minimal_quantity = 1; + + /** @var string available_now */ + public $available_now; + + /** @var string available_later */ + public $available_later; + + /** @var float Price in euros */ + public $price = 0; + + /** @var float Additional shipping cost */ + public $additional_shipping_cost = 0; + + /** @var float Wholesale Price in euros */ + public $wholesale_price = 0; + + /** @var boolean on_sale */ + public $on_sale = false; + + /** @var boolean online_only */ + public $online_only = false; + + /** @var string unity */ + public $unity = NULL; + + /** @var float price for product's unity */ + public $unit_price; + + /** @var float price for product's unity ratio */ + public $unit_price_ratio = 0; + + /** @var float Ecotax */ + public $ecotax = 0; + + /** @var string Reference */ + public $reference; + + /** @var string Supplier Reference */ + public $supplier_reference; + + /** @var string Location */ + public $location; + + /** @var string Width in default width unit */ + public $width = 0; + + /** @var string Height in default height unit */ + public $height = 0; + + /** @var string Depth in default depth unit */ + public $depth = 0; + + /** @var string Weight in default weight unit */ + public $weight = 0; + + /** @var string Ean-13 barcode */ + public $ean13; + + /** @var string Upc barcode */ + public $upc; + + /** @var string Friendly URL */ + public $link_rewrite; + + /** @var string Meta tag description */ + public $meta_description; + + /** @var string Meta tag keywords */ + public $meta_keywords; + + /** @var string Meta tag title */ + public $meta_title; + + /** @var integer Out of stock behavior */ + public $out_of_stock = 2; + + /** @var boolean Product statuts */ + public $quantity_discount = 0; + + /** @var boolean Product customization */ + public $customizable; + + /** @var boolean Product is new */ + public $new = NULL; + + /** @var integer Number of uploadable files (concerning customizable products) */ + public $uploadable_files; + + /** @var interger Number of text fields */ + public $text_fields; + + /** @var boolean Product statuts */ + public $active = 1; + + /** @var boolean Product available for order */ + public $available_for_order = 1; + + /** @var enum Product condition (new, used, refurbished) */ + public $condition; + + /** @var boolean Show price of Product */ + public $show_price = 1; + + public $indexed = 0; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + /*** @var array Tags */ + public $tags; + + protected $langMultiShop = true; + + public $cache_is_pack; + public $cache_has_attachments; + public $cache_default_attribute; + + public static $_taxCalculationMethod = PS_TAX_EXC; + protected static $_prices = array(); + protected static $_pricesLevel2 = array(); + protected static $_incat = array(); + protected static $_cart_quantity = array(); + protected static $_tax_rules_group = array(); + protected static $_cacheFeatures = array(); + protected static $_frontFeaturesCache = array(); + protected static $producPropertiesCache = array(); + /** @var array tables */ + protected $tables = array ('product', 'product_lang'); + + protected $fieldsRequired = array('quantity', 'price'); + protected $fieldsSize = array('reference' => 32, 'supplier_reference' => 32, 'location' => 64, 'ean13' => 13, 'upc' => 12, 'unity' => 10); + protected $fieldsValidate = array( + 'id_tax_rules_group' => 'isUnsignedId', + 'id_manufacturer' => 'isUnsignedId', + 'id_supplier' => 'isUnsignedId', + 'id_category_default' => 'isUnsignedId', + 'id_color_default' => 'isUnsignedInt', /* unsigned integer because its value could be 0 if the feature is disabled */ + 'minimal_quantity' => 'isUnsignedInt', + 'price' => 'isPrice', + 'additional_shipping_cost' => 'isPrice', + 'wholesale_price' => 'isPrice', + 'on_sale' => 'isBool', + 'online_only' => 'isBool', + 'ecotax' => 'isPrice', + 'unit_price' => 'isPrice', + 'unity' => 'isString', + 'reference' => 'isReference', + 'supplier_reference' => 'isReference', + 'location' => 'isReference', + 'width' => 'isUnsignedFloat', + 'height' => 'isUnsignedFloat', + 'depth' => 'isUnsignedFloat', + 'weight' => 'isUnsignedFloat', + 'out_of_stock' => 'isUnsignedInt', + 'quantity_discount' => 'isBool', + 'customizable' => 'isUnsignedInt', + 'uploadable_files' => 'isUnsignedInt', + 'text_fields' => 'isUnsignedInt', + 'active' => 'isBool', + 'available_for_order' => 'isBool', + 'condition' => 'isGenericName', + 'show_price' => 'isBool', + 'ean13' => 'isEan13', + 'upc' => 'isUpc', + 'indexed' => 'isBool', + 'cache_is_pack' => 'isBool', + 'cache_has_attachments' => 'isBool' + ); + protected $fieldsRequiredLang = array('link_rewrite', 'name'); + /* Description short is limited to 400 chars, but without html, so it can't be generic */ + protected $fieldsSizeLang = array('meta_description' => 255, 'meta_keywords' => 255, + 'meta_title' => 128, 'link_rewrite' => 128, 'name' => 128, 'available_now' => 255, 'available_later' => 255); + protected $fieldsValidateLang = array( + 'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName', + 'meta_title' => 'isGenericName', 'link_rewrite' => 'isLinkRewrite', 'name' => 'isCatalogName', + 'description' => 'isString', 'description_short' => 'isString', 'available_now' => 'isGenericName', 'available_later' => 'IsGenericName'); + + protected $table = 'product'; + protected $identifier = 'id_product'; + + protected $webserviceParameters = array( + 'objectNodeNames' => 'products', + 'fields' => array( + 'id_manufacturer' => array('xlink_resource' => 'manufacturers'), + 'id_supplier' => array('xlink_resource' => 'suppliers'), + 'id_category_default' => array('xlink_resource' => 'categories'), + 'out_of_stock' => array('required' => true), + 'new' => array(), + 'cache_default_attribute' => array(), + 'id_default_image' => array('getter' => 'getCoverWs', 'setter' => false, 'xlink_resource' => array('resourceName' => 'images', 'subResourceName' => 'products')), + 'id_default_combination' => array('getter' => 'getWsDefaultCombination', 'setter' => 'setWsDefaultCombination', 'xlink_resource' => array('resourceName' => 'combinations')), + 'position_in_category' => array('getter' => 'getWsPositionInCategory', 'setter' => false), + 'manufacturer_name' => array('getter' => 'getWsManufacturerName', 'setter' => false), + ), + 'associations' => array( + 'categories' => array('resource' => 'category', 'fields' => array( + 'id' => array('required' => true), + )), + 'images' => array('resource' => 'image', 'fields' => array('id' => array()) + ), + 'combinations' => array('resource' => 'combinations', 'fields' => array( + 'id' => array('required' => true), + )), + 'product_option_values' => array('resource' => 'product_options_values', 'fields' => array( + 'id' => array('required' => true), + )), + 'product_features' => array('resource' => 'product_feature', + 'fields' => array( + 'id' => array('required' => true), + 'id_feature_value' => array('required' => true, 'xlink_resource' => 'product_feature_values'), + )), + ), + ); + + public function __construct($id_product = NULL, $full = false, $id_lang = NULL, $id_shop = NULL) + { + global $cart; + + parent::__construct($id_product, $id_lang, $id_shop); + if ($full AND $this->id) + { + $this->tax_name = 'deprecated'; // The applicable tax may be BOTH the product one AND the state one (moreover this variable is some deadcode) + $this->manufacturer_name = Manufacturer::getNameById((int)$this->id_manufacturer); + $this->supplier_name = Supplier::getNameById((int)$this->id_supplier); + self::$_tax_rules_group[$this->id] = $this->id_tax_rules_group; + if (is_object($cart) AND $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')} != NULL) + $this->tax_rate = Tax::getProductTaxRate($this->id, $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + else + $this->tax_rate = Tax::getProductTaxRate($this->id, NULL); + $this->new = $this->isNew(); + $this->price = Product::getPriceStatic((int)($this->id), false, NULL, 6, NULL, false, true, 1, false, NULL, NULL, NULL, $this->specificPrice); + $this->unit_price = ($this->unit_price_ratio != 0 ? $this->price / $this->unit_price_ratio : 0); + if ($this->id) + $this->tags = Tag::getProductTags((int)$this->id); + } + + $this->quantity = $this->getStock(); + + if ($this->id_category_default) + $this->category = Category::getLinkRewrite((int)$this->id_category_default, (int)$id_lang); + } + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_product'] = (int)($this->id); + $fields['id_tax_rules_group'] = (int)($this->id_tax_rules_group); + $fields['id_manufacturer'] = (int)($this->id_manufacturer); + $fields['id_supplier'] = (int)($this->id_supplier); + $fields['id_category_default'] = (int)($this->id_category_default); + $fields['id_color_default'] = (int)($this->id_color_default); + $fields['quantity'] = (int)($this->quantity); + $fields['minimal_quantity'] = (int)($this->minimal_quantity); + $fields['price'] = (float)($this->price); + $fields['additional_shipping_cost'] = (float)($this->additional_shipping_cost); + $fields['wholesale_price'] = (float)($this->wholesale_price); + $fields['on_sale'] = (int)($this->on_sale); + $fields['online_only'] = (int)($this->online_only); + $fields['ecotax'] = (float)($this->ecotax); + $fields['unity'] = pSQL($this->unity); + $fields['unit_price_ratio'] = (float)($this->unit_price > 0 ? $this->price / $this->unit_price : 0); + $fields['ean13'] = pSQL($this->ean13); + $fields['upc'] = pSQL($this->upc); + $fields['reference'] = pSQL($this->reference); + $fields['supplier_reference'] = pSQL($this->supplier_reference); + $fields['location'] = pSQL($this->location); + $fields['width'] = (float)($this->width); + $fields['height'] = (float)($this->height); + $fields['depth'] = (float)($this->depth); + $fields['weight'] = (float)($this->weight); + $fields['out_of_stock'] = pSQL($this->out_of_stock); + $fields['quantity_discount'] = (int)($this->quantity_discount); + $fields['customizable'] = (int)($this->customizable); + $fields['uploadable_files'] = (int)($this->uploadable_files); + $fields['text_fields'] = (int)($this->text_fields); + $fields['active'] = (int)($this->active); + $fields['available_for_order'] = (int)($this->available_for_order); + $fields['condition'] = pSQL($this->condition); + $fields['show_price'] = (int)($this->show_price); + $fields['indexed'] = 0; // Reset indexation every times + $fields['cache_is_pack'] = (int)($this->cache_is_pack); + $fields['cache_has_attachments'] = (int)($this->cache_has_attachments); + $fields['cache_default_attribute'] = (int)($this->cache_default_attribute); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + self::validateFieldsLang(); + + $fieldsArray = array('meta_description', 'meta_keywords', 'meta_title', 'link_rewrite', 'name', 'available_now', 'available_later'); + $fields = array(); + $languages = Language::getLanguages(false); + $defaultLanguage = Configuration::get('PS_LANG_DEFAULT'); + foreach ($languages as $language) + { + $fields[$language['id_lang']]['id_lang'] = $language['id_lang']; + $fields[$language['id_lang']][$this->identifier] = (int)($this->id); + $fields[$language['id_lang']]['id_shop'] = (int)$this->id_shop; + $fields[$language['id_lang']]['description'] = (isset($this->description[$language['id_lang']])) ? pSQL($this->description[$language['id_lang']], true) : ''; + $fields[$language['id_lang']]['description_short'] = (isset($this->description_short[$language['id_lang']])) ? pSQL($this->description_short[$language['id_lang']], true) : ''; + foreach ($fieldsArray as $field) + { + if (!Validate::isTableOrIdentifier($field)) + die(Tools::displayError()); + + /* Check fields validity */ + if (isset($this->{$field}[$language['id_lang']]) AND !empty($this->{$field}[$language['id_lang']])) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$language['id_lang']]); + elseif (in_array($field, $this->fieldsRequiredLang)) + { + if ($this->{$field} != '') + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$defaultLanguage]); + } + else + $fields[$language['id_lang']][$field] = ''; + } + } + return $fields; + } + + public static function initPricesComputation($id_customer = NULL) + { + global $cookie; + + if ($id_customer) + { + $customer = new Customer((int)($id_customer)); + if (!Validate::isLoadedObject($customer)) + die(Tools::displayError()); + self::$_taxCalculationMethod = Group::getPriceDisplayMethod((int)($customer->id_default_group)); + } + elseif ($cookie->id_customer) + { + $customer = new Customer((int)($cookie->id_customer)); + self::$_taxCalculationMethod = Group::getPriceDisplayMethod((int)($customer->id_default_group)); + } + else + self::$_taxCalculationMethod = Group::getDefaultPriceDisplayMethod(); + } + + public static function getTaxCalculationMethod($id_customer = NULL) + { + if ($id_customer) + self::initPricesComputation((int)($id_customer)); + return (int)(self::$_taxCalculationMethod); + } + + /** + * Move a product inside its category + * @param boolean $way Up (1) or Down (0) + * @param integer $position + * return boolean Update result + */ + public function updatePosition($way, $position) + { + if (!$res = Db::getInstance()->ExecuteS(' + SELECT cp.`id_product`, cp.`position`, cp.`id_category` + FROM `'._DB_PREFIX_.'category_product` cp + WHERE cp.`id_category` = '.(int)(Tools::getValue('id_category', 1)).' + ORDER BY cp.`position` ASC' + )) + return false; + + foreach ($res AS $product) + if ((int)($product['id_product']) == (int)($this->id)) + $movedProduct = $product; + + if (!isset($movedProduct) || !isset($position)) + return false; + + // < and > statements rather than BETWEEN operator + // since BETWEEN is treated differently according to databases + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'category_product` + SET `position`= `position` '.($way ? '- 1' : '+ 1').' + WHERE `position` + '.($way + ? '> '.(int)($movedProduct['position']).' AND `position` <= '.(int)($position) + : '< '.(int)($movedProduct['position']).' AND `position` >= '.(int)($position)).' + AND `id_category`='.(int)($movedProduct['id_category'])) + AND Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'category_product` + SET `position` = '.(int)($position).' + WHERE `id_product` = '.(int)($movedProduct['id_product']).' + AND `id_category`='.(int)($movedProduct['id_category']))); + } + + /* + * Reorder product position in category $id_category. + * Call it after deleting a product from a category. + * + * @param int $id_category + */ + public static function cleanPositions($id_category) + { + $return = true; + + $result = Db::getInstance()->ExecuteS(' + SELECT `id_product` + FROM `'._DB_PREFIX_.'category_product` + WHERE `id_category` = '.(int)($id_category).' + ORDER BY `position`'); + $sizeof = sizeof($result); + + for ($i = 0; $i < $sizeof; $i++) + $return &= Db::getInstance()->Execute($sql=' + UPDATE `'._DB_PREFIX_.'category_product` + SET `position` = '.(int)($i).' + WHERE `id_category` = '.(int)($id_category).' + AND `id_product` = '.(int)($result[$i]['id_product'])); + return $return; + } + + /** + * Get the default attribute for a product + * + * @return int Attributes list + */ + public static function getDefaultAttribute($id_product, $minimumQuantity = 0) + { + $sql = 'SELECT pa.id_product_attribute + FROM '._DB_PREFIX_.'product_attribute pa' + .($minimumQuantity > 0 ? ' LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = pa.id_product AND pa.id_product_attribute = s.id_product_attribute '.Shop::sqlSharedStock('s') : ''). + ' WHERE pa.default_on = 1 ' + .($minimumQuantity > 0 ? ' AND s.quantity >= '.(int)$minimumQuantity : ''). + ' AND pa.id_product = '.(int)$id_product; + $result = Db::getInstance()->getRow($sql); + + if (!$result) + { + $sql = 'SELECT pa.id_product_attribute + FROM '._DB_PREFIX_.'product_attribute pa' + .($minimumQuantity > 0 ? ' LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = pa.id_product AND pa.id_product_attribute = s.id_product_attribute '.Shop::sqlSharedStock('s') : ''). + ' WHERE pa.id_product = '.(int)$id_product + .($minimumQuantity > 0 ? ' AND s.quantity >= '.(int)$minimumQuantity : ''); + $result = Db::getInstance()->getRow($sql); + } + + if (!$result) + { + $sql = 'SELECT id_product_attribute + FROM '._DB_PREFIX_.'product_attribute + WHERE id_product = '.(int)$id_product; + $result = Db::getInstance()->getRow($sql); + } + return $result['id_product_attribute']; + } + + public static function updateDefaultAttribute($id_product) + { + $id_product_attribute = self::getDefaultAttribute($id_product); + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET cache_default_attribute = '.(int)($id_product_attribute).' WHERE id_product = '.(int)($id_product).' LIMIT 1'); + } + + public function validateFieldsLang($die = true, $errorReturn = false) + { + if (!is_array($this->description_short)) + $this->description_short = array(); + foreach ($this->description_short as $k => $value) + if (Tools::strlen(strip_tags($value)) > 400) + { + if ($die) die (Tools::displayError().' ('.get_class($this).'->description: length > 400 for language '.$k.')'); + return $errorReturn ? get_class($this).'->'.Tools::displayError('description: length > 400 for language').' '.$k : false; + } + return parent::validateFieldsLang($die, $errorReturn); + } + + public function delete() + { + Hook::deleteProduct($this); + if (!parent::delete() OR + !$this->deleteCategories(true) OR + !$this->deleteImages() OR + !$this->deleteProductAttributes() OR + !$this->deleteProductFeatures() OR + !$this->deleteTags() OR + !$this->deleteCartProducts() OR + !$this->deleteAttributesImpacts() OR + !$this->deleteAttachments() OR + !$this->deleteCustomization() OR + !SpecificPrice::deleteByProductId((int)($this->id)) OR + !$this->deletePack() OR + !$this->deleteProductSale() OR + !$this->deleteSceneProducts() OR + !$this->deleteSearchIndexes() OR + !$this->deleteAccessories() OR + !$this->deleteFromAccessories()) + return false; + if ($id = ProductDownload::getIdFromIdProduct($this->id)) + if ($productDownload = new ProductDownload($id) AND !$productDownload->delete(true)) + return false; + return true; + } + + public function deleteSelection($products) + { + $return = 1; + foreach ($products AS $id_product) + { + $product = new Product((int)($id_product)); + $return &= $product->delete(); + } + return $return; + } + + /** + * @deprecated + * @param string $reference + */ + public static function getByReference($reference) + { + Tools::displayAsDeprecated(); + if (!Validate::isReference($reference)) + die(Tools::displayError()); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_product` + FROM `'._DB_PREFIX_.'product` p + WHERE p.`reference` = \''.pSQL($reference).'\''); + if (!isset($result['id_product'])) + return false; + + return new self((int)$result['id_product']); + } + + /** + * addToCategories add this product to the category/ies if not exists. + * + * @param mixed $categories id_category or array of id_category + * @return boolean true if succeed + */ + public function addToCategories($categories = array()) + { + if (empty($categories)) + return false; + + if (!is_array($categories)) + $categories=array($categories); + + if (!sizeof($categories)) + return false; + + $currentCategories = $this->getCategories(); + + // for new categ, put product at last position + $resCategNewPos = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql='SELECT id_category, MAX(position)+1 newPos + FROM `'._DB_PREFIX_.'category_product` + WHERE `id_category` IN('.implode(',', array_map('intval', $categories)).') + GROUP BY id_category'); + foreach ($resCategNewPos as $array) + { + $newCategories[$array['id_category']] = $array['newPos']; + } + + $newCategPos=array(); + foreach ($categories as $id_category) + $newCategPos[$id_category] = isset($newCategories[$id_category])?$newCategories[$id_category]:0; + + $productCats = array(); + + foreach ($categories as $newIdCateg) + if (!in_array($newIdCateg,$currentCategories)) + $productCats[] = '('. $newIdCateg.', '. $this->id.', '. $newCategPos[$newIdCateg].')'; + if (sizeof($productCats)) + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'category_product` (`id_category`, `id_product`, `position`) + VALUES '.implode(',', $productCats)); + + return true; + } + + /** + * Update categories to index product into + * + * @param string $productCategories Categories list to index product into + * @param boolean keepingCurrentPos (deprecated, no more used) + * @return array Update/insertion result + */ + public function updateCategories($categories, $keepingCurrentPos = false) + { + if (empty($categories)) + return false; + $positions = array(); + // get max position in each categories + $result = Db::getInstance()->ExecuteS('SELECT `id_category` + FROM `'._DB_PREFIX_.'category_product` + WHERE `id_category` NOT IN('.implode(',', array_map('intval', $categories)).') + AND id_product = '. $this->id .''); + foreach ($result as $categToDelete){ + $this->deleteCategory($categToDelete['id_category']); + } + // if none are found, it's an error + if (!is_array($result)) + return (false); + + if (!$this->addToCategories($categories)) + return false; + + return true; + } + + /** + * deleteCategory delete this product from the category $id_category + * + * @param mixed $id_category + * @param mixed $cleanPositions + * @return boolean + */ + public function deleteCategory($id_category, $cleanPositions = true) + { + $result = Db::getInstance()->ExecuteS('SELECT `id_category` FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.(int)($this->id) . ' AND id_category = '.(int)$id_category .''); + $return = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.(int)($this->id).' AND id_category = '.(int)$id_category .'' ); + if ($cleanPositions === true) + foreach ($result AS $row) + $this->cleanPositions((int)$row['id_category']); + return $return; + } + + /** + * Delete all association to category where product is indexed + * + * @param boolean $cleanPositions clean category positions after deletion + * @return array Deletion result + */ + public function deleteCategories($cleanPositions = false) + { + $return = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.(int)($this->id)); + if ($cleanPositions === true) + { + $result = Db::getInstance()->ExecuteS('SELECT `id_category` FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.(int)($this->id)); + foreach($result AS $row) + $this->cleanPositions((int)($row['id_category'])); + } + return $return; + } + + /** + * Delete products tags entries + * + * @return array Deletion result + */ + public function deleteTags() + { + return (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_tag` WHERE `id_product` = '.(int)($this->id)) + AND Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'tag` WHERE `id_tag` NOT IN (SELECT `id_tag` FROM `'._DB_PREFIX_.'product_tag`)')); + } + + /** + * Delete product from cart + * + * @return array Deletion result + */ + public function deleteCartProducts() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)($this->id)); + } + + /** + * Delete product images from database + * + * @return bool success + */ + public function deleteImages() + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_image` + FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)($this->id)); + + $status = true; + if ($result) + foreach($result as $row) + { + $image = new Image($row['id_image']); + $status &= $image->delete(); + } + return $status; + } + + public static function getProductAttributePrice($id_product_attribute) + { + $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `price` + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product_attribute` = '.(int)($id_product_attribute)); + return $rq['price']; + } + + /** + * Get all available products + * + * @param integer $id_lang Language id + * @param integer $start Start number + * @param integer $limit Number of products to return + * @param string $orderBy Field for ordering + * @param string $orderWay Way for ordering (ASC or DESC) + * @return array Products details + */ + public static function getProducts($id_lang, $start, $limit, $orderBy, $orderWay, $id_category = false, $only_active = false, $id_shop = false) + { + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + die (Tools::displayError()); + if ($orderBy == 'id_product' OR $orderBy == 'price' OR $orderBy == 'date_add') + $orderByPrefix = 'p'; + elseif ($orderBy == 'name') + $orderByPrefix = 'pl'; + elseif ($orderBy == 'position') + $orderByPrefix = 'c'; + + $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.*, pl.* , t.`rate` AS tax_rate, m.`name` AS manufacturer_name, s.`name` AS supplier_name + FROM `'._DB_PREFIX_.'product` p + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (p.id_product = ps.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) + LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (s.`id_supplier` = p.`id_supplier`)'. + ($id_category ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` c ON (c.`id_product` = p.`id_product`)' : '').' + WHERE pl.`id_lang` = '.(int)($id_lang). + ($id_shop ? ' AND ps.id_shop='.(int)$id_shop : ''). + ($id_category ? ' AND c.`id_category` = '.(int)($id_category) : ''). + ($only_active ? ' AND p.`active` = 1' : '').' + ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay). + ($limit > 0 ? ' LIMIT '.(int)($start).','.(int)($limit) : '') + ); + if($orderBy == 'price') + Tools::orderbyPrice($rq,$orderWay); + return ($rq); + } + + public static function getSimpleProducts($id_lang, $id_shop = false) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.`id_product`, pl.`name` + FROM `'._DB_PREFIX_.'product` p + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (p.id_product = ps.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product`) + WHERE pl.`id_lang` = '.(int)($id_lang).($id_shop ? ' AND ps.id_shop='.(int)$id_shop : '').' + ORDER BY pl.`name`'); + } + + /** + * Return the products in the same category than the default category of the instancied product + * + * @param integer $id_lang Language ID + * @return array Products + * @deprecated + */ + public function getDefaultCategoryProducts($idLang = NULL, $limit = NULL) + { + Tools::displayAsDeprecated(); + //get idLang + $idLang = is_null($idLang) ? _USER_ID_LANG_ : (int)($idLang); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.`id_product`, pl.`description_short`set, pl.`link_rewrite`, pl.`name`, i.`id_image` + FROM `'._DB_PREFIX_.'category_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = cp.id_product) + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`) + WHERE cp.id_category = ' . (int)($this->id_category_default) . ' + AND id_lang = ' . (int)($idLang) . ' + AND p.`active` = 1 + AND i.`cover` = 1 + '. (is_null($limit) ? '' : ' LIMIT 0 , ' . (int)($limit))); + return $result; + } + + public function isNew() + { + $result = Db::getInstance()->ExecuteS(' + SELECT id_product FROM `'._DB_PREFIX_.'product` p + WHERE 1 + AND id_product = '.(int)($this->id).' + AND DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 + '); + return sizeof($result) > 0; + } + + + public function productAttributeExists($attributesList, $currentProductAttribute = false) + { + $result = Db::getInstance()->ExecuteS('SELECT pac.`id_attribute`, pac.`id_product_attribute` + FROM `'._DB_PREFIX_.'product_attribute` pa + LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pac.`id_product_attribute` = pa.`id_product_attribute`) + WHERE pa.`id_product` = '.(int)($this->id)); + /* If something's wrong */ + if (!$result OR empty($result)) + return false; + /* Product attributes simulation */ + $productAttributes = array(); + foreach ($result AS $productAttribute) + $productAttributes[$productAttribute['id_product_attribute']][] = $productAttribute['id_attribute']; + /* Checking product's attribute existence */ + foreach ($productAttributes AS $key => $productAttribute) + if (sizeof($productAttribute) == sizeof($attributesList)) + { + $diff = false; + for ($i = 0; $diff == false AND isset($productAttribute[$i]); $i++) + if (!in_array($productAttribute[$i], $attributesList) OR $key == $currentProductAttribute) + $diff = true; + if (!$diff) + return true; + } + return false; + } + + /** + * Add a product attribute + * + * @param float $price Additional price + * @param float $weight Additional weight + * @param float $ecotax Additional ecotax + * @param integer $quantity Quantity available + * @param integer $id_images Image ids + * @param string $reference Reference + * @param string $supplier_reference Supplier Reference + * @param string $location Location + * @param string $ean13 Ean-13 barcode + * @param boolean $default Is default attribute for product + * @return mixed $id_product_attribute or false + */ + public function addProductAttribute($price, $weight, $unit_impact, $ecotax, $quantity, $id_images, $reference, $supplier_reference, $ean13, $default, $location = NULL, $upc = NULL) + { + if (!$this->id) + return; + + $price = str_replace(',', '.', $price); + $weight = str_replace(',', '.', $weight); + Db::getInstance()->AutoExecute(_DB_PREFIX_.'product_attribute', array( + 'id_product' => $this->id, + 'price' => (float)$price, + 'ecotax' => (float)$ecotax, + 'quantity' => (int)$quantity, + 'weight' => $weight ? (float)$weight : 0, + 'unit_price_impact' => $unit_impact ? (float)$unit_impact : 0, + 'reference' => pSQL($reference), + 'supplier_reference' => pSQL($supplier_reference), + 'location' => pSQL($location), + 'ean13' => pSQL($ean13), + 'upc' => pSQL($upc), + 'default_on' => (int)$default + ), 'INSERT'); + $id_product_attribute = Db::getInstance()->Insert_ID(); + + $this->setStock($quantity, $id_product_attribute); + Product::updateDefaultAttribute($this->id); + if (!$id_product_attribute) + return false; + if (empty($id_images)) + return (int)($id_product_attribute); + $query = 'INSERT INTO `'._DB_PREFIX_.'product_attribute_image` (`id_product_attribute`, `id_image`) VALUES '; + foreach ($id_images AS $id_image) + $query .= '('.(int)($id_product_attribute).', '.(int)($id_image).'), '; + $query = trim($query, ', '); + if (!Db::getInstance()->Execute($query)) + return false; + return (int)($id_product_attribute); + } + + public function addCombinationEntity($wholesale_price, $price, $weight, $unit_impact, $ecotax, $quantity, $id_images, $reference, $supplier_reference, $ean13, $default, $location = NULL, $upc = NULL) + { + $id_product_attribute = $this->addProductAttribute($price, $weight, $unit_impact, $ecotax, $quantity, $id_images, $reference, $supplier_reference, $ean13, $default, $location, $upc); + $result = Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'product_attribute` SET `wholesale_price` = '.(float)$wholesale_price.' WHERE `id_product_attribute` = '.(int)$id_product_attribute); + if (!$id_product_attribute OR !$result) + return false; + return $id_product_attribute; + } + + public function addProductAttributeMultiple($attributes, $setDefault = true) + { + $values = array(); + $keys = array(); + $fields = array(); + $default_value = 1; + foreach ($attributes AS &$attribute) + foreach ($attribute AS $key => $value) + if ($value != "") + $fields[$key] = $key; + + foreach ($attributes AS &$attribute) + { + $k = array(); + $v = array(); + foreach ($attribute AS $key => $value) + { + if (in_array($key, $fields)) + { + $k[] = '`'.$key.'`'; + $v[] = '\''.$value.'\''; + } + } + if ($setDefault) + { + $k[] = '`default_on`'; + $v[] = '\''.$default_value.'\''; + $default_value = 0; + } + $values[] = '(' . implode(', ', $v).')'; + $keys[] = implode(', ', $k); + } + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'product_attribute` ('. $keys[0].') VALUES '.implode(', ', $values)); + + return (array_map(create_function('$elem', 'return $elem[\'id_product_attribute\'];'), + Db::getInstance()->ExecuteS(' + SELECT `id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product_attribute` >= '.(int)(Db::getInstance()->Insert_ID()) + ))); + } + + /** + * Del all default attributes for product + */ + public function deleteDefaultAttributes() + { + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product_attribute` + SET `default_on` = 0 + WHERE `id_product` = '.(int)($this->id)); + } + + public function setDefaultAttribute($id_product_attribute) + { + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product_attribute` + SET `default_on` = 1 + WHERE `id_product` = '.(int)$this->id.' + AND `id_product_attribute` = '.(int)$id_product_attribute) && + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product` + SET `cache_default_attribute` = '.(int)$id_product_attribute.' + WHERE `id_product` = '.(int)$this->id.' LIMIT 1'); + } + + /** + * Update a product attribute + * + * @param integer $id_product_attribute Product attribute id + * @param float $price Additional price + * @param float $weight Additional weight + * @param float $ecotax Additional ecotax + * @param integer $quantity Quantity available + * @param integer $id_image Image id + * @param string $reference Reference + * @param string $ean13 Ean-13 barcode + * @param string $upc Upc barcode + * @param string $minimal_quantity Minimal quantity + * @return array Update result + */ + public function updateProductAttribute($id_product_attribute, $wholesale_price, $price, $weight, $unit, $ecotax, $quantity, $id_images, $reference, $supplier_reference, $ean13, $default, $location = NULL, $upc = NULL, $minimal_quantity) + { + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` + WHERE `id_product_attribute` = '.(int)($id_product_attribute)); + + $price = str_replace(',', '.', $price); + $weight = str_replace(',', '.', $weight); + $data = array( + 'wholesale_price' => (float)($wholesale_price), + 'price' => (float)($price), + 'ecotax' => (float)($ecotax), + 'weight' => ($weight ? (float)($weight) : 0), + 'unit_price_impact' => ($unit ? (float)($unit) : 0), + 'reference' => pSQL($reference), + 'supplier_reference' => pSQL($supplier_reference), + 'location' => pSQL($location), + 'ean13' => pSQL($ean13), + 'upc' => pSQL($upc), + 'default_on' => (int)($default), + 'minimal_quantity' => (int)($minimal_quantity) + ); + + if ($quantity) + { + $data['quantity'] = (int)$quantity; + $this->setStock($data['quantity'], $id_product_attribute); + } + + if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'product_attribute', $data, 'UPDATE', '`id_product_attribute` = '.(int)($id_product_attribute)) OR !Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute_image` WHERE `id_product_attribute` = '.(int)($id_product_attribute))) + return false; + if ($quantity) + Hook::updateProductAttribute($id_product_attribute); + Product::updateDefaultAttribute($this->id); + if (empty($id_images)) + return true; + $query = 'INSERT INTO `'._DB_PREFIX_.'product_attribute_image` (`id_product_attribute`, `id_image`) VALUES '; + foreach ($id_images AS $id_image) + $query .= '('.(int)($id_product_attribute).', '.(int)($id_image).'), '; + $query = trim($query, ', '); + return Db::getInstance()->Execute($query); + } + + /** + * @deprecated since 1.5.0 + */ + public function updateQuantityProductWithAttributeQuantity() + { + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product` + SET `quantity` = IFNULL( + ( + SELECT SUM(`quantity`) + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product` = '.(int)($this->id).' + ), \'0\' ) + WHERE `id_product` = '.(int)($this->id)); + } + /** + * Delete product attributes + * + * @return array Deletion result + */ + public function deleteProductAttributes() + { + Module::hookExec('deleteProductAttribute', array('id_product_attribute' => 0, 'id_product' => $this->id, 'deleteAllAttributes' => true)); + + $result = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` + WHERE `id_product_attribute` IN (SELECT `id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id).')'); + + $result2 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id)); + + return ($result & $result2); + } + + /** + * Delete product attributes impacts + * + * @return Deletion result + */ + public function deleteAttributesImpacts() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'attribute_impact` WHERE `id_product` = '.(int)($this->id)); + } + + /** + * Delete product features + * + * @return array Deletion result + */ + public function deleteProductFeatures() + { + return $this->deleteFeatures(); + } + + /** + * Delete product attachments + * + * @return array Deletion result + */ + public function deleteAttachments() + { + $attachments = Db::getInstance()->ExecuteS('SELECT id_attachment FROM `'._DB_PREFIX_.'product_attachment` WHERE `id_product` = '.(int)($this->id)); + $result = true; + foreach ($attachments AS $attachment) + { + $attachmentObj = new Attachment((int)($attachment['id_attachment'])); + if (Validate::isLoadedObject($attachmentObj)) + $result &= $attachmentObj->delete(); + } + + return $result; + } + + /** + * Delete product customizations + * + * @return array Deletion result + */ + public function deleteCustomization() + { + return + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization_field` WHERE `id_product` = '.(int)($this->id)) && + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization_field_lang` WHERE `id_customization_field` NOT IN (SELECT id_customization_field FROM `'._DB_PREFIX_.'customization_field`)'); + } + + /** + * Delete product quantity discounts + * + * @return array Deletion result + * @deprecated + */ + public function deleteQuantityDiscounts() + { + Tools::displayAsDeprecated(); + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'discount_quantity` WHERE `id_product` = '.(int)($this->id)); + } + + /** + * Delete product pack details + * + * @return array Deletion result + */ + public function deletePack() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'pack` WHERE `id_product_pack` = '.(int)($this->id).' OR `id_product_item` = '.(int)($this->id)); + } + + /** + * Delete product sales + * + * @return array Deletion result + */ + public function deleteProductSale() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_sale` WHERE `id_product` = '.(int)($this->id)); + } + + /** + * Delete product in its scenes + * + * @return array Deletion result + */ + public function deleteSceneProducts() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'scene_products` WHERE `id_product` = '.(int)($this->id)); + } + + /** + * Delete product indexed words + * + * @return array Deletion result + */ + public function deleteSearchIndexes() + { + return + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'search_index` WHERE `id_product` = '.(int)($this->id)) && + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'search_word` WHERE `id_word` NOT IN (SELECT id_word FROM `'._DB_PREFIX_.'search_index`)'); + } + + /** + * Add a product attributes combinaison + * + * @param integer $id_product_attribute Product attribute id + * @param array $attributes Attributes to forge combinaison + * @return array Insertion result + */ + public function addAttributeCombinaison($id_product_attribute, $attributes) + { + if (!is_array($attributes)) + die(Tools::displayError()); + if (!sizeof($attributes)) + return false; + $attributesList = ''; + foreach($attributes AS $id_attribute) + $attributesList .= '('.(int)($id_product_attribute).','.(int)($id_attribute).'),'; + $attributesList = rtrim($attributesList, ','); + + if (!Validate::isValuesList($attributesList)) + die(Tools::displayError()); + + $result = Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'product_attribute_combination` (`id_product_attribute`, `id_attribute`) VALUES '.$attributesList); + return $result; + } + + public function addAttributeCombinationMultiple($id_attributes, $combinations) + { + $attributesList = ''; + foreach ($id_attributes AS $nb => $id_product_attribute) + if (isset($combinations[$nb])) + foreach ($combinations[$nb] AS $id_attribute) + $attributesList .= '('.(int)($id_product_attribute).','.(int)($id_attribute).'),'; + $attributesList = rtrim($attributesList, ','); + return Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'product_attribute_combination` (`id_product_attribute`, `id_attribute`) VALUES '.$attributesList); + } + + /** + * Delete a product attributes combinaison + * + * @param integer $id_product_attribute Product attribute id + * @return array Deletion result + */ + public function deleteAttributeCombinaison($id_product_attribute) + { + if (!$this->id || !$id_product_attribute OR !is_numeric($id_product_attribute)) + return false; + + Module::hookExec('deleteProductAttribute', array('id_product_attribute' => $id_product_attribute, 'id_product' => $this->id, 'deleteAllAttributes' => false)); + + $sql = 'DELETE FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product_attribute` = '.$id_product_attribute.' + AND `id_product` = '.$this->id; + $result = Db::getInstance()->Execute($sql); + + $sql = 'DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` + WHERE `id_product_attribute` = '.$id_product_attribute; + $result2 = Db::getInstance()->Execute($sql); + + $sql = 'DELETE FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_product_attribute` = '.$id_product_attribute; + $result3 = Db::getInstance()->Execute($sql); + return ($result AND $result2 AND $result3); + } + + /** + * Delete features + * + */ + public function deleteFeatures() + { + // List products features + $result1 = Db::getInstance()->ExecuteS(' + SELECT p.*, f.* + FROM `'._DB_PREFIX_.'feature_product` as p + LEFT JOIN `'._DB_PREFIX_.'feature_value` as f ON (f.`id_feature_value` = p.`id_feature_value`) + WHERE `id_product` = '.(int)($this->id)); + foreach ($result1 as $tab) + // Delete product custom features + if ($tab['custom']) { + $result2 = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'feature_value` + WHERE `id_feature_value` = '.(int)($tab['id_feature_value'])); + $result3 = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'feature_value_lang` + WHERE `id_feature_value` = '.(int)($tab['id_feature_value'])); + } + // Delete product features + $result4 = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'feature_product` + WHERE `id_product` = '.(int)($this->id)); + return ($result4); + } + + /** + * Get all available product attributes combinaisons + * + * @param integer $id_lang Language id + * @return array Product attributes combinaisons + */ + public function getAttributeCombinaisons($id_lang) + { + $sql = 'SELECT pa.*, ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, al.`name` AS attribute_name, a.`id_attribute`, pa.`unit_price_impact`, s.quantity + FROM `'._DB_PREFIX_.'product_attribute` pa + LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute` + LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute` + LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group` + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$id_lang.') + LEFT JOIN '._DB_PREFIX_.'stock s ON pa.id_product = s.id_product AND pa.id_product_attribute = s.id_product_attribute + WHERE pa.`id_product` = '.(int)$this->id.' + ORDER BY pa.`id_product_attribute`'; + return Db::getInstance()->ExecuteS($sql); + } + + public function getCombinationImages($id_lang) + { + if (!$productAttributes = Db::getInstance()->ExecuteS('SELECT `id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id))) + return false; + $ids = array(); + foreach ($productAttributes AS $productAttribute) + $ids[] = (int)($productAttribute['id_product_attribute']); + if (!$result = Db::getInstance()->ExecuteS(' + SELECT pai.`id_image`, pai.`id_product_attribute`, il.`legend` + FROM `'._DB_PREFIX_.'product_attribute_image` pai + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (il.`id_image` = pai.`id_image`) + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_image` = pai.`id_image`) + WHERE pai.`id_product_attribute` IN ('.implode(', ', $ids).') AND il.`id_lang` = '.(int)($id_lang).' ORDER by i.`position`')) + return false; + $images = array(); + foreach ($result AS $row) + $images[$row['id_product_attribute']][] = $row; + return $images; + } + + /** + * Check if product has attributes combinaisons + * + * @return integer Attributes combinaisons number + */ + public function hasAttributes() + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT COUNT(`id_product_attribute`) + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product` = '.(int)($this->id)); + } + + /** + * Get new products + * + * @param integer $id_lang Language id + * @param integer $pageNumber Start from (optional) + * @param integer $nbProducts Number of products to return (optional) + * @return array New products + */ + public static function getNewProducts($id_lang, $pageNumber = 0, $nbProducts = 10, $count = false, $orderBy = NULL, $orderWay = NULL, $id_shop = null) + { + if (is_null($id_shop)) + $id_shop = Shop::getCurrentShop(); + if ($pageNumber < 0) $pageNumber = 0; + if ($nbProducts < 1) $nbProducts = 10; + if (empty($orderBy) || $orderBy == 'position') $orderBy = 'date_add'; + if (empty($orderWay)) $orderWay = 'DESC'; + if ($orderBy == 'id_product' OR $orderBy == 'price' OR $orderBy == 'date_add') + $orderByPrefix = 'p'; + elseif ($orderBy == 'name') + $orderByPrefix = 'pl'; + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + die(Tools::displayError()); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + if ($count) + { + $sql = 'SELECT COUNT(p.`id_product`) AS nb + FROM `'._DB_PREFIX_.'product` p + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + WHERE `active` = 1 + '.($id_shop ? ' AND ps.id_shop='.(int)$id_shop : '').' + AND DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + )'; + return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + $sql = 'SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`, + i.`id_image`, il.`legend`, t.`rate`, m.`name` AS manufacturer_name, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, + (p.`price` * ((100 + (t.`rate`))/100)) AS orderprice, pa.id_product_attribute + FROM `'._DB_PREFIX_.'product` p + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).(($id_shop) ? ' AND pl.id_shop = '.(int)$id_shop : '').') + LEFT OUTER JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND `default_on` = 1) + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) + WHERE p.`active` = 1 + '.($id_shop ? ' AND ps.id_shop='.(int)$id_shop : '').' + AND DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' + LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + if ($orderBy == 'price') + Tools::orderbyPrice($result, $orderWay); + if (!$result) + return false; + + $productsIds = array(); + foreach ($result as $row) + $productsIds[] = $row['id_product']; + // Thus you can avoid one query per product, because there will be only one query for all the products of the cart + Product::cacheFrontFeatures($productsIds, $id_lang); + + return Product::getProductsProperties((int)$id_lang, $result); + } + + static protected function _getProductIdByDate($beginning, $ending) + { + global $cookie, $cart; + + $id_group = $cookie->id_customer ? (int)(Customer::getDefaultGroupId((int)($cookie->id_customer))) : _PS_DEFAULT_CUSTOMER_GROUP_; + $id_address = $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}; + $ids = Address::getCountryAndState($id_address); + $id_country = (int)($ids['id_country'] ? $ids['id_country'] : Configuration::get('PS_COUNTRY_DEFAULT')); + return SpecificPrice::getProductIdByDate((int)(Shop::getCurrentShop()), (int)($cookie->id_currency), $id_country, $id_group, $beginning, $ending); + } + + /** + * Get a random special + * + * @param integer $id_lang Language id + * @return array Special + */ + public static function getRandomSpecial($id_lang, $beginning = false, $ending = false, $id_shop = false) + { + $currentDate = date('Y-m-d H:i:s'); + $ids_product = self::_getProductIdByDate((!$beginning ? $currentDate : $beginning), (!$ending ? $currentDate : $ending)); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + // Please keep 2 distinct queries because RAND() is an awful way to achieve this result + $sql = ' + SELECT p.id_product + FROM `'._DB_PREFIX_.'product` p + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + WHERE 1 + AND p.`active` = 1 '.($id_shop ? ' AND ps.id_shop='.(int)$id_shop : '').' + AND p.`id_product` IN ('.implode(', ', $ids_product).') + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY RAND()'; + $id_product = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + + if (!$id_product) + return false; + + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`, + i.`id_image`, il.`legend`, t.`rate` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + WHERE p.id_product = '.(int)$id_product); + + return Product::getProductProperties($id_lang, $row); + } + + /** + * Get prices drop + * + * @param integer $id_lang Language id + * @param integer $pageNumber Start from (optional) + * @param integer $nbProducts Number of products to return (optional) + * @param boolean $count Only in order to get total number (optional) + * @return array Prices drop + */ + public static function getPricesDrop($id_lang, $pageNumber = 0, $nbProducts = 10, $count = false, $orderBy = NULL, $orderWay = NULL, $beginning = false, $ending = false, $id_shop = null) + { + if (!Validate::isBool($count)) + die(Tools::displayError()); + + if (is_null($id_shop)) $id_shop = Shop::getCurrentShop(true); + if ($pageNumber < 0) $pageNumber = 0; + if ($nbProducts < 1) $nbProducts = 10; + if (empty($orderBy) || $orderBy == 'position') $orderBy = 'price'; + if (empty($orderWay)) $orderWay = 'DESC'; + if ($orderBy == 'id_product' OR $orderBy == 'price' OR $orderBy == 'date_add') + $orderByPrefix = 'p'; + elseif ($orderBy == 'name') + $orderByPrefix = 'pl'; + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + die (Tools::displayError()); + $currentDate = date('Y-m-d H:i:s'); + $ids_product = self::_getProductIdByDate((!$beginning ? $currentDate : $beginning), (!$ending ? $currentDate : $ending)); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + if ($count) + { + $sql = 'SELECT COUNT(DISTINCT p.`id_product`) AS nb + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product) + WHERE p.`active` = 1 + AND ps.id_shop='.(int)$id_shop.' + AND p.`show_price` = 1 + '.((!$beginning AND !$ending) ? ' AND p.`id_product` IN('.((is_array($ids_product) AND sizeof($ids_product)) ? implode(', ', $ids_product) : 0).')' : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + )'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return (int)($result['nb']); + } + + $sql = 'SELECT p.*, s.quantity, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, + pl.`name`, i.`id_image`, il.`legend`, t.`rate`, m.`name` AS manufacturer_name, + DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'stock s ON p.id_product = s.id_product AND s.id_product_attribute = 0 '.Shop::sqlSharedStock('s', $id_shop).' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.' AND pl.id_shop = '.(int)$id_shop.') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) + WHERE p.`active` = 1 + AND ps.id_shop = '.(int)$id_shop.' + AND p.`show_price` = 1 + '.((!$beginning AND !$ending) ? ' AND p.`id_product` IN ('.((is_array($ids_product) AND sizeof($ids_product)) ? implode(', ', $ids_product) : 0).')' : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'`'.' '.pSQL($orderWay).' + LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if($orderBy == 'price') + Tools::orderbyPrice($result,$orderWay); + if (!$result) + return false; + return Product::getProductsProperties($id_lang, $result); + } + + + /** + * getProductCategories return an array of categories which this product belongs to + * + * @return array of categories + */ + public static function getProductCategories($id_product = '') + { + $ret = array(); + if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT `id_category` FROM `'._DB_PREFIX_.'category_product` + WHERE `id_product` = '.(int)$id_product) + ) + foreach ($row as $val) + { + $ret[] = $val['id_category']; + } + return $ret; + } + + /** + * getCategories return an array of categories which this product belongs to + * + * @return array of categories + */ + public function getCategories() + { + return Product::getProductCategories($this->id); + } + + /** + * Get categories where product is indexed + * + * @param integer $id_product Product id + * @return array Categories where product is indexed + */ + public static function getIndexedCategories($id_product) + { + Tools::displayAsDeprecated(); + return Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'category_product` + WHERE `id_product` = '.(int)($id_product)); + } + + /** + * Get product images and legends + * + * @param integer $id_lang Language id for multilingual legends + * @return array Product images and legends + */ + public function getImages($id_lang, $id_shop = false) + { + return Db::getInstance()->ExecuteS(' + SELECT i.`cover`, i.`id_image`, il.`legend` + FROM `'._DB_PREFIX_.'image` i + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'image_shop iss ON (i.id_image = iss.id_image)' : '').' + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + WHERE i.`id_product` = '.(int)($this->id).' '.($id_shop ? ' AND iss.id_shop='.(int)$id_shop : '').' + ORDER BY `position`'); + } + + /** + * Get product cover image + * + * @return array Product cover image + */ + public static function getCover($id_product, $id_shop = false) + { + return Db::getInstance()->getRow(' + SELECT i.`id_image` + FROM `'._DB_PREFIX_.'image` i + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'image_shop iss ON (i.id_image = iss.id_image)' : '').' + WHERE i.`id_product` = '.(int)($id_product).($id_shop ? ' AND iss.id_shop='.(int)$id_shop : '').' + AND i.`cover` = 1'); + } + + /** + * Get reduction value for a given product + * ***************************************** + * ** Kept for retro-compatibility issues ** + * ***************************************** + * You should use getPriceStatic() instead (with the parameter $only_reduc set to true) + * + * @param array $result SQL result with reduction informations + * @param boolean $wt With taxes or not (optional) + * @return float Reduction value in euros + */ + /* */ + public static function getReductionValue($reduction_price, $reduction_percent, $date_from, $date_to, $product_price, $usetax, $taxrate) + { + Tools::displayAsDeprecated(); + + // Avoid an error with 1970-01-01 + if (!Validate::isDate($date_from) OR !Validate::isDate($date_to)) + return 0; + $currentDate = date('Y-m-d H:i:s'); + if ($date_from != $date_to AND ($currentDate > $date_to OR $currentDate < $date_from)) + return 0; + + // reduction values + if (!$usetax) + $reduction_price /= (1 + ($taxrate / 100)); + + // make the reduction + if ($reduction_price AND $reduction_price > 0) + { + if ($reduction_price >= $product_price) + $ret = $product_price; + else + $ret = $reduction_price; + } + elseif ($reduction_percent AND $reduction_percent > 0) + { + if ($reduction_percent >= 100) + $ret = $product_price; + else + $ret = $product_price * $reduction_percent / 100; + } + return isset($ret) ? $ret : 0; + } + + /** + * Get product price + * + * @param integer $id_product Product id + * @param boolean $usetax With taxes or not (optional) + * @param integer $id_product_attribute Product attribute id (optional). If set to false, do not apply the combination price impact. NULL does apply the default combination price impact. + * @param integer $decimals Number of decimals (optional) + * @param integer $divisor Useful when paying many time without fees (optional) + * @param boolean $only_reduc Returns only the reduction amount + * @param boolean $usereduc Set if the returned amount will include reduction + * @param integer $quantity Required for quantity discount application (default value: 1) + * @param boolean $forceAssociatedTax Force to apply the associated tax. Only works when the parameter $usetax is true + * @param integer $id_customer Customer ID (for customer group reduction) + * @param integer $id_cart Cart ID. Required when the cookie is not accessible (e.g., inside a payment module, a cron task...) + * @param integer $id_address Customer address ID. Required for price (tax included) calculation regarding the guest localization + * @param variable_reference $specificPriceOutput. If a specific price applies regarding the previous parameters, this variable is filled with the corresponding SpecificPrice object + * @param boolean $with_ecotax insert ecotax in price output. + * @return float Product price + */ + public static function getPriceStatic($id_product, $usetax = true, $id_product_attribute = NULL, $decimals = 6, $divisor = NULL, $only_reduc = false, + $usereduc = true, $quantity = 1, $forceAssociatedTax = false, $id_customer = NULL, $id_cart = NULL, $id_address = NULL, &$specificPriceOutput = NULL, $with_ecotax = TRUE) + { + global $cookie, $cart; + $cur_cart = $cart; + + if (isset($divisor)) + Tools::displayParameterAsDeprecated('divisor'); + + if (!Validate::isBool($usetax) OR !Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + // Initializations + if (!$id_customer) + $id_customer = ((Validate::isCookie($cookie) AND isset($cookie->id_customer) AND $cookie->id_customer) ? (int)($cookie->id_customer) : NULL); + $id_group = $id_customer ? (int)(Customer::getDefaultGroupId($id_customer)) : _PS_DEFAULT_CUSTOMER_GROUP_; + if (!is_object($cur_cart) OR (Validate::isUnsignedInt($id_cart) AND $id_cart)) + { + /* + * When a user (e.g., guest, customer, Google...) is on PrestaShop, he has already its cart as the global (see /init.php) + * When a non-user calls directly this method (e.g., payment module...) is on PrestaShop, he does not have already it BUT knows the cart ID + */ + if (!$id_cart AND !Validate::isCookie($cookie)) + die(Tools::displayError()); + $cur_cart = $id_cart ? new Cart((int)($id_cart)) : new Cart((int)($cookie->id_cart)); + } + + if ((int)($id_cart)) + { + if (!isset(self::$_cart_quantity[(int)($id_cart).'_'.(int)($id_product)]) OR self::$_cart_quantity[(int)($id_cart).'_'.(int)($id_product)] != (int)($quantity)) + self::$_cart_quantity[(int)($id_cart).'_'.(int)($id_product)] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT SUM(`quantity`) + FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_product` = '.(int)($id_product).' AND `id_cart` = '.(int)($id_cart) + ); + $cart_quantity = self::$_cart_quantity[(int)($id_cart).'_'.(int)($id_product)]; + } + $quantity = ($id_cart AND $cart_quantity) ? $cart_quantity : $quantity; + $id_currency = (int)(Validate::isLoadedObject($cur_cart) ? $cur_cart->id_currency : ((isset($cookie->id_currency) AND (int)($cookie->id_currency)) ? $cookie->id_currency : Configuration::get('PS_CURRENCY_DEFAULT'))); + + // retrieve address informations + $id_country = (int)Country::getDefaultCountryId(); + $id_state = 0; + $id_county = 0; + + if (!$id_address) + $id_address = $cur_cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}; + + if ($id_address) + { + $address_infos = Address::getCountryAndState($id_address); + if ($address_infos['id_country']) + { + $id_country = (int)($address_infos['id_country']); + $id_state = (int)($address_infos['id_state']); + $postcode = (int)$address_infos['postcode']; + + $id_county = (int)County::getIdCountyByZipCode($id_state, $postcode); + } + } + elseif (isset($cookie->id_country)) + { + // fetch address from cookie + $id_country = (int)$cookie->id_country; + $id_state = (int)$cookie->id_state; + $postcode = (int)$cookie->postcode; + + $id_county = (int)County::getIdCountyByZipCode($id_state, $postcode); + } + + if (Tax::excludeTaxeOption()) + $usetax = false; + + if ($usetax != false AND !empty($address_infos['vat_number']) AND $address_infos['id_country'] != Configuration::get('VATNUMBER_COUNTRY') AND Configuration::get('VATNUMBER_MANAGEMENT')) + $usetax = false; + + $id_shop = (int)(Shop::getCurrentShop()); + + return Product::priceCalculation($id_shop, $id_product, $id_product_attribute, $id_country, $id_state, $id_county, $id_currency, $id_group, $quantity, $usetax, $decimals, $only_reduc, + $usereduc, $with_ecotax, $specificPriceOutput); + } + + /** + * Price calculation / Get product price + * + * @param integer $id_shop Shop id + * @param integer $id_product Product id + * @param integer $id_product_attribute Product attribute id + * @param integer $id_country Country id + * @param integer $id_state State id + * @param integer $id_currency Currency id + * @param integer $id_group Group id + * @param integer $quantity Quantity Required for Specific prices : quantity discount application + * @param boolean $use_tax with (1) or without (0) tax + * @param integer $decimals Number of decimals returned + * @param boolean $only_reduc Returns only the reduction amount + * @param boolean $use_reduc Set if the returned amount will include reduction + * @param boolean $with_ecotax insert ecotax in price output. + * @param variable_reference $specific_price_output If a specific price applies regarding the previous parameters, this variable is filled with the corresponding SpecificPrice object + * @return float Product price + **/ + public static function priceCalculation($id_shop, $id_product, $id_product_attribute, $id_country, $id_state, $id_county, $id_currency, $id_group, $quantity, $use_tax, $decimals, $only_reduc, $use_reduc, $with_ecotax, &$specific_price) + { + // Caching + if ($id_product_attribute === NULL) + $product_attribute_label = 'NULL'; + else + $product_attribute_label = ($id_product_attribute === false ? 'false' : $id_product_attribute); + $cacheId = $id_product.'-'.$id_shop.'-'.$id_currency.'-'.$id_country.'-'.$id_state.'-'.$id_county.'-'.$id_group.'-'.$quantity.'-'.$product_attribute_label.'-'.($use_tax?'1':'0').'-'.$decimals.'-'.($only_reduc?'1':'0').'-'.($use_reduc?'1':'0').'-'.$with_ecotax; + // Cache for specific prices + $cacheId3 = $id_product.'-'.$id_shop.'-'.$id_currency.'-'.$id_country.'-'.$id_group.'-'.$quantity; + + // reference parameter is filled before any returns + $specific_price = SpecificPrice::getSpecificPrice((int)($id_product), $id_shop, $id_currency, $id_country, $id_group, $quantity); + + if (isset(self::$_prices[$cacheId])) + return self::$_prices[$cacheId]; + + // fetch price & attribute price + $cacheId2 = $id_product.'-'.$id_product_attribute; + if (!isset(self::$_pricesLevel2[$cacheId2])) + self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT p.`price`, + '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price, + p.`ecotax` + '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').' + FROM `'._DB_PREFIX_.'product` p + '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').' + WHERE p.`id_product` = '.(int)($id_product)); + $result = self::$_pricesLevel2[$cacheId2]; + + $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; + // convert only if the specific price is in the default currency (id_currency = 0) + if (!$specific_price OR !($specific_price['price'] > 0 AND $specific_price['id_currency'])) + $price = Tools::convertPrice($price, $id_currency); + + // Attribute price + $attribute_price = Tools::convertPrice(array_key_exists('attribute_price', $result) ? (float)($result['attribute_price']) : 0, $id_currency); + if ($id_product_attribute !== false) // If you want the default combination, please use NULL value instead + $price += $attribute_price; + + // TaxRate calculation + $tax_rate = Tax::getProductTaxRateViaRules((int)$id_product, (int)$id_country, (int)$id_state, (int)$id_county); + if ($tax_rate === false) + $tax_rate = 0; + + // Add Tax + if ($use_tax) + $price = $price * (1 + ($tax_rate / 100)); + $price = Tools::ps_round($price, $decimals); + + // Reduction + $reduc = 0; + if (($only_reduc OR $use_reduc) AND $specific_price) + { + if ($specific_price['reduction_type'] == 'amount') + { + $reduction_amount = $specific_price['reduction']; + + if (!$specific_price['id_currency']) + $reduction_amount = Tools::convertPrice($reduction_amount, $id_currency); + $reduc = Tools::ps_round(!$use_tax ? $reduction_amount / (1 + $tax_rate / 100) : $reduction_amount, $decimals); + } + else + $reduc = Tools::ps_round($price * $specific_price['reduction'], $decimals); + } + + if ($only_reduc) + return $reduc; + if ($use_reduc) + $price -= $reduc; + + // Group reduction + if ($reductionFromCategory = (float)(GroupReduction::getValueForProduct($id_product, $id_group))) + $price -= $price * $reductionFromCategory; + else // apply group reduction if there is no group reduction for this category + $price *= ((100 - Group::getReductionByIdGroup($id_group)) / 100); + + $price = Tools::ps_round($price, $decimals); + + // Eco Tax + if (($result['ecotax'] OR isset($result['attribute_ecotax'])) AND $with_ecotax) + { + $ecotax = $result['ecotax']; + if (isset($result['attribute_ecotax']) && $result['attribute_ecotax'] > 0) + $ecotax = $result['ecotax']; + + if ($id_currency) + $ecotax = Tools::convertPrice($ecotax, $id_currency); + if ($use_tax) + { + $taxRate = TaxRulesGroup::getTaxesRate((int)Configuration::get('PS_ECOTAX_TAX_RULES_GROUP_ID'), (int)$id_country, (int)$id_state, (int)$id_county); + $price += $ecotax * (1 + ($taxRate / 100)); + } + else + $price += $ecotax; + } + $price = Tools::ps_round($price, $decimals); + if ($price < 0) + $price = 0; + + self::$_prices[$cacheId] = $price; + return self::$_prices[$cacheId]; + } + + public static function convertAndFormatPrice($price, $currency = false) + { + if (!$currency) + $currency = Currency::getCurrent(); + return Tools::displayPrice(Tools::convertPrice($price, $currency), $currency); + } + + public static function isDiscounted($id_product, $quantity = 1) + { + global $cookie, $cart; + + $id_customer = ((Validate::isCookie($cookie) AND isset($cookie->id_customer) AND $cookie->id_customer) ? (int)($cookie->id_customer) : NULL); + $id_group = $id_customer ? (int)(Customer::getDefaultGroupId($id_customer)) : _PS_DEFAULT_CUSTOMER_GROUP_; + $cart_quantity = !$cart ? 0 : Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT SUM(`quantity`) + FROM `'._DB_PREFIX_.'cart_product` + WHERE `id_product` = '.(int)($id_product).' AND `id_cart` = '.(int)($cart->id) + ); + $quantity = $cart_quantity ? $cart_quantity : $quantity; + $id_currency = (int)(Validate::isLoadedObject($cart) ? $cart->id_currency : ((isset($cookie->id_currency) AND (int)($cookie->id_currency)) ? $cookie->id_currency : Configuration::get('PS_CURRENCY_DEFAULT'))); + $ids = Address::getCountryAndState((int)($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + $id_country = (int)($ids['id_country'] ? $ids['id_country'] : Configuration::get('PS_COUNTRY_DEFAULT')); + $id_shop = (int)(Shop::getCurrentShop()); + return (bool)SpecificPrice::getSpecificPrice((int)$id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity); + } + + /** + * Get product price + * Same as static function getPriceStatic, no need to specify product id + * + * @param boolean $tax With taxes or not (optional) + * @param integer $id_product_attribute Product attribute id (optional) + * @param integer $decimals Number of decimals (optional) + * @param integer $divisor Util when paying many time without fees (optional) + * @return float Product price in euros + */ + public function getPrice($tax = true, $id_product_attribute = NULL, $decimals = 6, $divisor = NULL, $only_reduc = false, $usereduc = true, $quantity = 1) + { + return self::getPriceStatic((int)($this->id), $tax, $id_product_attribute, $decimals, $divisor, $only_reduc, $usereduc, $quantity); + } + + /** + * @deprecated + */ + public function getIdProductAttributeMostExpsensive() + { + Tools::displayAsDeprecated(); + return $this->getIdProductAttributeMostExpensive(); + } + + public function getIdProductAttributeMostExpensive() + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `id_product_attribute` + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product` = '.(int)($this->id).' + ORDER BY `price` DESC'); + + return (isset($row['id_product_attribute']) AND $row['id_product_attribute']) ? (int)$row['id_product_attribute'] : 0; + } + + public function getPriceWithoutReduct($notax = false, $id_product_attribute = false) + { + return self::getPriceStatic((int)($this->id), !$notax, $id_product_attribute, 6, NULL, false, false); + } + + /** + * Get product price for display + * Also display currency sign and reduction + * + * @param array $params Product price, reduction... + * @param object $smarty Smarty object + * @return string Product price fully formated in customer currency + */ + static function productPrice($params, &$smarty) + { + Tools::displayAsDeprecated(); + $ret = ''; + if (isset($params['p']['reduction']) AND $params['p']['reduction']) + $ret .= ''.Tools::displayPrice($params['p']['price_without_reduction'], $smarty->ps_currency).'
'; + $ret .= Tools::displayPrice($params['p']['price'], $smarty->ps_currency); + return $ret; + } + + static function productPriceWithoutDisplay($params, &$smarty) + { + Tools::displayAsDeprecated(); + return Tools::convertPrice($params['p'], $params['c']); + } + + /** + * Display price with right format and currency + * + * @param array $params Params + * @object $smarty Smarty object + * @return string Price with right format and currency + */ + static function convertPrice($params, &$smarty) + { + return Tools::displayPrice($params['price'], $smarty->ps_currency); + } + + static function convertPriceWithCurrency($params, &$smarty) + { + if (!isset($params['convert'])) + $params['convert'] = true; + return Tools::displayPrice($params['price'], $params['currency'], false); + } + + static function displayWtPrice($params, &$smarty) + { + return Tools::displayPrice($params['p'], $smarty->ps_currency); + } + + static function displayWtPriceWithCurrency($params, &$smarty) + { + return Tools::displayPrice($params['price'], $params['currency'], false); + } + + /** + * Get available product quantities + * + * @param integer $id_product Product id + * @param integer $id_product_attribute Product attribute id (optional) + * @return integer Available quantities + */ + public static function getQuantity($id_product, $id_product_attribute = NULL, $cache_is_pack = NULL) + { + $lang = Configuration::get('PS_LANG_DEFAULT'); + if (((int)$cache_is_pack OR ($cache_is_pack === NULL AND Pack::isPack((int)$id_product, (int)$lang))) AND !Pack::isInStock((int)$id_product, (int)$lang)) + return 0; + + $product = new Product($id_product); + return $product->getStock($id_product_attribute); + } + + /** + * Set the stock quantity of current product + * + * @since 1.5.0 + * @param int $quantity + */ + public function setStock($quantity, $id_product_attribute = 0, $update = false) + { + if (!$this->id) + return ; + $shop = Shop::getCurrentShop(true); + + // For retrocompatibility + $id_product_attribute = (int)$id_product_attribute; + $quantity = (int)$quantity; + if (Shop::isDefaultShop($shop)) + { + if ($id_product_attribute) + { + $sql = 'UPDATE '._DB_PREFIX_.'product_attribute + SET quantity = quantity + '.(int)$quantity.' + WHERE id_product = '.$this->id.' + AND id_product_attribute = '.$id_product_attribute; + Db::getInstance()->Execute($sql); + } + else + { + $sql = 'UPDATE '._DB_PREFIX_.'product + SET quantity = quantity + '.(int)$quantity.' + WHERE id_product='.$this->id; + Db::getInstance()->Execute($sql); + } + } + + // Change stock quantity on product attribute + if ($id_product_attribute) + { + if ($id_stock = Stock::getStockId($this->id, $id_product_attribute, $shop)) + { + $sql = 'UPDATE '._DB_PREFIX_.'stock + SET quantity = '.(($update) ? 'quantity + '. $quantity : $quantity).' + WHERE id_stock = '.$id_stock; + Db::getInstance()->Execute($sql); + } + else + Db::getInstance()->autoExecute(_DB_PREFIX_.'stock', array( + 'id_product' => $this->id, + 'id_product_attribute' => $id_product_attribute, + 'id_shop' => $shop, + 'id_group_shop' => Shop::getGroupFromShop($shop), + 'quantity' => $quantity, + ), 'INSERT'); + } + + // Change stock quantity on product + if ($id_stock = Stock::getStockId($this->id, $id_product_attribute, $shop)) + { + $sql = 'UPDATE '._DB_PREFIX_.'stock + SET quantity = '.(($update) ? 'quantity + '. $quantity : $quantity).' + WHERE id_stock = '.$id_stock; + Db::getInstance()->Execute($sql); + } + else + Db::getInstance()->autoExecute(_DB_PREFIX_.'stock', array( + 'id_product' => $this->id, + 'id_product_attribute' => 0, + 'id_shop' => $shop, + 'id_group_shop' => Shop::getGroupFromShop($shop), + 'quantity' => $quantity, + ), 'INSERT'); + } + + /** + * Get the stock quantity of current product + * + * @since 1.5.0 + * @return int + */ + public function getStock($id_product_attribute = 0) + { + if (!$this->id) + return 0; + + $shop = Shop::getCurrentShop(true); + $sql = 'SELECT quantity + FROM '._DB_PREFIX_.'stock + WHERE id_product = '.$this->id.' + AND id_product_attribute = '.(int)$id_product_attribute + .Shop::sqlSharedStock('', $shop); + return (int)Db::getInstance()->getValue($sql); + } + + /** + * Update available product quantities + * + * @param array $product Array with ordered product (quantity, id_product_attribute if applicable) + * @return mixed Query result + */ + public static function updateQuantity($product, $id_order = NULL) + { + if (!is_array($product)) + die (Tools::displayError()); + + if (!Configuration::get('PS_STOCK_MANAGEMENT')) + return true; + + if (Pack::isPack((int)($product['id_product']))) + { + $products_pack = Pack::getItems((int)($product['id_product']), (int)(Configuration::get('PS_LANG_DEFAULT'))); + foreach($products_pack AS $product_pack) + { + $tab_product_pack['id_product'] = (int)($product_pack->id); + $tab_product_pack['id_product_attribute'] = self::getDefaultAttribute($tab_product_pack['id_product'], 1); + $tab_product_pack['cart_quantity'] = (int)($product_pack->pack_quantity * $product['cart_quantity']); + self::updateQuantity($tab_product_pack); + } + } + + $productObj = new Product((int)$product['id_product'], false, (int)Configuration::get('PS_LANG_DEFAULT')); + return $productObj->addStockMvt(-(int)$product['cart_quantity'], (int)_STOCK_MOVEMENT_ORDER_REASON_, (int)$product['id_product_attribute'], (int)$id_order, NULL); + } + + public static function reinjectQuantities(&$orderDetail, $quantity) + { + global $cookie; + if (!Validate::isLoadedObject($orderDetail)) + die(Tools::displayError()); + + if (Pack::isPack((int)($orderDetail->product_id))) + { + $products_pack = Pack::getItems((int)($orderDetail->product_id), (int)(Configuration::get('PS_LANG_DEFAULT'))); + foreach($products_pack AS $product_pack) + if (!$product_pack->addStockMvt((int)($product_pack->pack_quantity * $quantity), _STOCK_MOVEMENT_ORDER_REASON_, (int)$product_pack->id_product_attribute, (int)$orderDetail->id_order, (int)$cookie->id_employee)) + return false; + } + + $product = new Product((int)$orderDetail->product_id); + if (!$product->addStockMvt((int)$quantity, _STOCK_MOVEMENT_ORDER_REASON_, (int)$orderDetail->product_attribute_id, (int)$orderDetail->id_order, (int)$cookie->id_employee)) + return false; + + $orderDetail->product_quantity_reinjected += (int)($quantity); + return true; + } + + public static function isAvailableWhenOutOfStock($oos) + { + return !Configuration::get('PS_STOCK_MANAGEMENT') ? true : ((int)($oos) == 2 ? (int)(Configuration::get('PS_ORDER_OUT_OF_STOCK')) : (int)($oos)); + } + + /** + * Check product availability + * + * @param integer $qty Quantity desired + * @return boolean True if product is available with this quantity + */ + public function checkQty($qty) + { + if (Pack::isPack((int)($this->id)) AND !Pack::isInStock((int)($this->id))) + return false; + + if ($this->isAvailableWhenOutOfStock($this->out_of_stock)) + return true; + + return ($qty <= $this->getStock()); + } + + /** + * Check if there is not a default attribute and create it not + */ + public function checkDefaultAttributes() + { + if (!$this->id) + return false; + + $row = Db::getInstance()->getRow(' + SELECT id_product + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `default_on` = 1 AND `id_product` = '.(int)($this->id)); + if ($row) + return true; + + $mini = Db::getInstance()->getRow(' + SELECT MIN(pa.id_product_attribute) as `id_attr` + FROM `'._DB_PREFIX_.'product_attribute` pa + WHERE `id_product` = '.(int)($this->id)); + if (!$mini) + return false; + + if (!Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product_attribute` + SET `default_on` = 1 + WHERE `id_product_attribute` = '.(int)($mini['id_attr']))) + return false; + return true; + } + + /** + * Get all available attribute groups + * + * @param integer $id_lang Language id + * @return array Attribute groups + */ + public function getAttributesGroups($id_lang) + { + $sql = 'SELECT ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name, a.`id_attribute`, al.`name` AS attribute_name, + a.`color` AS attribute_color, pa.`id_product_attribute`, s.quantity, pa.`price`, pa.`ecotax`, pa.`weight`, pa.`default_on`, pa.`reference`, pa.`unit_price_impact`, pa.`minimal_quantity` + FROM `'._DB_PREFIX_.'product_attribute` pa + LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = pa.id_product AND s.id_product_attribute = pa.id_product_attribute '.Shop::sqlSharedStock('s').' + LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute` + LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute` + LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group` + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON a.`id_attribute` = al.`id_attribute` + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON ag.`id_attribute_group` = agl.`id_attribute_group` + WHERE pa.`id_product` = '.(int)($this->id).' + AND al.`id_lang` = '.(int)($id_lang).' + AND agl.`id_lang` = '.(int)($id_lang).' + ORDER BY agl.`public_name`, al.`name`'; + return Db::getInstance()->ExecuteS($sql); + } + + /** + * Delete product accessories + * + * @return mixed Deletion result + */ + public function deleteAccessories() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'accessory` WHERE `id_product_1` = '.(int)($this->id)); + } + + /** + * Delete product from other products accessories + * + * @return mixed Deletion result + */ + public function deleteFromAccessories() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'accessory` WHERE `id_product_2` = '.(int)($this->id)); + } + + /** + * Get product accessories (only names) + * + * @param integer $id_lang Language id + * @param integer $id_product Product id + * @return array Product accessories + */ + public static function getAccessoriesLight($id_lang, $id_product, $id_shop = false) + { + return Db::getInstance()->ExecuteS(' + SELECT p.`id_product`, p.`reference`, pl.`name` + FROM `'._DB_PREFIX_.'accessory` + LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product`= `id_product_2`) + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + WHERE `id_product_1` = '.(int)$id_product.($id_shop ? ' AND ps.id_shop='.(int)$id_shop : '')); + } + + /** + * Get product accessories + * + * @param integer $id_lang Language id + * @return array Product accessories + */ + public function getAccessories($id_lang, $active = true, $id_shop = false) + { + global $link, $cookie; + + if (!$id_shop) + $id_shop_lang = (int)Configuration::get('PS_SHOP_DEFAULT'); + else + $id_shop_lang = (int)$id_shop; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, p.`upc`, + i.`id_image`, il.`legend`, t.`rate`, m.`name` as manufacturer_name, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), + INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new + FROM `'._DB_PREFIX_.'accessory` + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = `id_product_2` + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).' AND pl.id_shop='.(int)$id_shop_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).' AND cl.id_shop='.(int)$id_shop_lang.') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (p.`id_manufacturer`= m.`id_manufacturer`) + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + WHERE `id_product_1` = '.(int)($this->id). + ($id_shop ? ' AND ps.id_shop='.(int)$id_shop : ''). + ($active ? ' AND p.`active` = 1' : '')); + + if (!$result) + return false; + + return $this->getProductsProperties($id_lang, $result); + } + + public static function getAccessoryById($accessoryId) + { + return Db::getInstance()->getRow('SELECT `id_product`, `name` FROM `'._DB_PREFIX_.'product_lang` WHERE `id_product` = '.(int)($accessoryId)); + } + + /** + * Link accessories with product + * + * @param array $accessories_id Accessories ids + */ + public function changeAccessories($accessories_id) + { + foreach ($accessories_id as $id_product_2) + Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', array('id_product_1' => (int)($this->id), 'id_product_2' => (int)($id_product_2)), 'INSERT'); + } + + /** + * Add new feature to product + */ + public function addFeaturesCustomToDB($id_value, $lang, $cust) + { + $row = array('id_feature_value' => (int)($id_value), 'id_lang' => (int)($lang), 'value' => pSQL($cust)); + return Db::getInstance()->autoExecute(_DB_PREFIX_.'feature_value_lang', $row, 'INSERT'); + } + + public function addFeaturesToDB($id_feature, $id_value, $cust = 0) + { + if ($cust) + { + $row = array('id_feature' => (int)($id_feature), 'custom' => 1); + Db::getInstance()->autoExecute(_DB_PREFIX_.'feature_value', $row, 'INSERT'); + $id_value = Db::getInstance()->Insert_ID(); + } + $row = array('id_feature' => (int)($id_feature), 'id_product' => (int)($this->id), 'id_feature_value' => (int)($id_value)); + Db::getInstance()->autoExecute(_DB_PREFIX_.'feature_product', $row, 'INSERT'); + if ($id_value) + return ($id_value); + } + + public static function addFeatureProductImport($id_product, $id_feature, $id_feature_value) + { + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'feature_product` (`id_feature`, `id_product`, `id_feature_value`) + VALUES ('.(int)($id_feature).', '.(int)($id_product).', '.(int)($id_feature_value).') + ON DUPLICATE KEY UPDATE `id_feature_value` = '.(int)($id_feature_value) + ); + } + + /** + * Select all features for the object + * + * @return array Array with feature product's data + */ + public function getFeatures() + { + return self::getFeaturesStatic((int)$this->id); + } + + public static function getFeaturesStatic($id_product) + { + if (!array_key_exists($id_product, self::$_cacheFeatures)) + self::$_cacheFeatures[$id_product] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT id_feature, id_product, id_feature_value + FROM `'._DB_PREFIX_.'feature_product` + WHERE `id_product` = '.(int)$id_product); + return self::$_cacheFeatures[$id_product]; + } + + public static function cacheProductsFeatures($productIds) + { + $productImplode = array(); + foreach ($productIds as $id_product) + if ((int)$id_product AND !array_key_exists($id_product, self::$_cacheFeatures)) + $productImplode[] = (int)$id_product; + if (!count($productImplode)) + return; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT id_feature, id_product, id_feature_value + FROM `'._DB_PREFIX_.'feature_product` + WHERE `id_product` IN ('.implode($productImplode, ',').')'); + foreach ($result as $row) + { + if (!array_key_exists($row['id_product'], self::$_cacheFeatures)) + self::$_cacheFeatures[$row['id_product']] = array(); + self::$_cacheFeatures[$row['id_product']][] = $row; + } + } + + public static function cacheFrontFeatures($productIds, $id_lang) + { + $productImplode = array(); + foreach ($productIds as $id_product) + if ((int)$id_product AND !array_key_exists($id_product.'-'.$id_lang, self::$_cacheFeatures)) + $productImplode[] = (int)$id_product; + if (!count($productImplode)) + return; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT id_product, name, value, pf.id_feature + FROM '._DB_PREFIX_.'feature_product pf + LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') + LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') + WHERE `id_product` IN ('.implode($productImplode, ',').')'); + + foreach ($result as $row) + { + if (!array_key_exists($row['id_product'].'-'.$id_lang, self::$_frontFeaturesCache)) + self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang] = array(); + self::$_frontFeaturesCache[$row['id_product'].'-'.$id_lang][] = $row; + } + } + + /** + * Admin panel product search + * + * @param integer $id_lang Language id + * @param string $query Search query + * @return array Matching products + */ + public static function searchByName($id_lang, $query, $id_shop = false) + { + $result = Db::getInstance()->ExecuteS(' + SELECT p.`id_product`, pl.`name`, pl.`link_rewrite`, p.`weight`, p.`active`, p.`ecotax`, i.`id_image`, p.`reference`, p.`cache_is_pack`, + il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name + FROM `'._DB_PREFIX_.'category_product` cp + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop ps ON (ps.id_product = p.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`) AND i.`cover` = 1 + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + WHERE pl.`name` LIKE \'%'.pSQL($query).'%\' OR p.`reference` LIKE \'%'.pSQL($query).'%\' OR p.`supplier_reference` LIKE \'%'.pSQL($query).'%\' + '.($id_shop ? ' AND ps.id_shop='.(int)$id_shop : '').' + GROUP BY `id_product` + ORDER BY pl.`name` ASC'); + + if (!$result) + return false; + + $resultsArray = array(); + foreach ($result AS $k => $row) + { + $row['price'] = Product::getPriceStatic($row['id_product'], true, NULL, 2); + $row['quantity'] = Product::getQuantity($row['id_product'], NULL, $row['cache_is_pack']); + $resultsArray[] = $row; + } + return $resultsArray; + } + + /** + * Duplicate attributes when duplicating a product + * + * @param integer $id_product_old Old product id + * @param integer $id_product_new New product id + */ + public static function duplicateAttributes($id_product_old, $id_product_new) + { + $return = true; + $combinationImages = array(); + + $result = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'product_attribute` + WHERE `id_product` = '.(int)($id_product_old)); + foreach ($result as $row) + { + $id_product_attribute_old = (int)($row['id_product_attribute']); + $result2 = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'product_attribute_combination` + WHERE `id_product_attribute` = '.$id_product_attribute_old); + + $row['id_product'] = $id_product_new; + unset($row['id_product_attribute']); + $return &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'product_attribute', $row, 'INSERT'); + + $id_product_attribute_new = (int)(Db::getInstance()->Insert_ID()); + if ($resultImages = self::_getAttributeImageAssociations($id_product_attribute_old)) + { + $combinationImages['old'][$id_product_attribute_old] = $resultImages; + $combinationImages['new'][$id_product_attribute_new] = $resultImages; + } + foreach ($result2 AS $row2) + { + $row2['id_product_attribute'] = $id_product_attribute_new; + $return &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'product_attribute_combination', $row2, 'INSERT'); + } + } + return !$return ? false : $combinationImages; + } + + /** + * Get product attribute image associations + * @param integer $id_product_attribute + * @return boolean + */ + public static function _getAttributeImageAssociations($id_product_attribute) + { + $combinationImages = array(); + $data = Db::getInstance()->ExecuteS(' + SELECT `id_image` + FROM `'._DB_PREFIX_.'product_attribute_image` + WHERE `id_product_attribute` = '.(int)($id_product_attribute)); + foreach ($data AS $row) + $combinationImages[] = (int)($row['id_image']); + return $combinationImages; + } + + public static function duplicateAccessories($id_product_old, $id_product_new) + { + $return = true; + + $result = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'accessory` + WHERE `id_product_1` = '.(int)($id_product_old)); + foreach ($result as $row) + { + $data = array( + 'id_product_1' => (int)($id_product_new), + 'id_product_2' => (int)($row['id_product_2'])); + $return &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'accessory', $data, 'INSERT'); + } + return $return; + } + + public static function duplicateTags($id_product_old, $id_product_new) + { + $tags = Db::getInstance()->ExecuteS('SELECT `id_tag` FROM `'._DB_PREFIX_.'product_tag` WHERE `id_product` = '.(int)($id_product_old)); + if (!Db::getInstance()->NumRows()) + return true; + $query = 'INSERT INTO `'._DB_PREFIX_.'product_tag` (`id_product`, `id_tag`) VALUES'; + foreach($tags as $tag) + $query .= ' ('.(int)($id_product_new).', '.(int)($tag['id_tag']).'),'; + $query = rtrim($query, ','); + return Db::getInstance()->Execute($query); + } + + public static function duplicateDownload($id_product_old, $id_product_new) + { + $resource = Db::getInstance()->ExecuteS('SELECT `display_filename`, `physically_filename`, `date_deposit`, `date_expiration`, `nb_days_accessible`, `nb_downloadable`, `active` FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)($id_product_old)); + if (!Db::getInstance()->NumRows()) + return true; + $query = 'INSERT INTO `'._DB_PREFIX_.'product_download` (`id_product`, `display_filename`, `physically_filename`, `date_deposit`, `date_expiration`, `nb_days_accessible`, `nb_downloadable`, `active`) VALUES'; + while ($row = Db::getInstance()->nextRow($resource)) + $query .= ' ('.(int)($id_product_new).', \''.pSQL($row['display_filename']).'\', \''.pSQL($row['physically_filename']).'\', \''.pSQL($row['date_deposit']).'\', \''.pSQL($row['date_expiration']).'\', '.(int)($row['nb_days_accessible']).', '.(int)($row['nb_downloadable']).', '.(int)($row['active']).'),'; + $query = rtrim($query, ','); + return Db::getInstance()->Execute($query); + } + + /** + * Duplicate features when duplicating a product + * + * @param integer $id_product_old Old product id + * @param integer $id_product_old New product id + */ + public static function duplicateFeatures($id_product_old, $id_product_new) + { + $return = true; + + $result = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'feature_product` + WHERE `id_product` = '.(int)($id_product_old)); + foreach ($result as $row) + { + $result2 = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'feature_value` + WHERE `id_feature_value` = '.(int)($row['id_feature_value'])); + // Custom feature value, need to duplicate it + if ($result2['custom']) + { + $old_id_feature_value = $result2['id_feature_value']; + unset($result2['id_feature_value']); + $return &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'feature_value', $result2, 'INSERT'); + $max_fv = Db::getInstance()->getRow(' + SELECT MAX(`id_feature_value`) AS nb + FROM `'._DB_PREFIX_.'feature_value`'); + $new_id_feature_value = $max_fv['nb']; + $languages = Language::getLanguages(); + foreach ($languages as $language) + { + $result3 = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'feature_value_lang` + WHERE `id_feature_value` = '.(int)($old_id_feature_value).' + AND `id_lang` = '.(int)($language['id_lang'])); + $result3['id_feature_value'] = $new_id_feature_value; + $return &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'feature_value_lang', $result3, 'INSERT'); + } + $row['id_feature_value'] = $new_id_feature_value; + } + $row['id_product'] = $id_product_new; + $return &= Db::getInstance()->AutoExecute(_DB_PREFIX_.'feature_product', $row, 'INSERT'); + } + return $return; + } + + static protected function _getCustomizationFieldsNLabels($productId) + { + $customizations = array(); + if (($customizations['fields'] = Db::getInstance()->ExecuteS(' + SELECT `id_customization_field`, `type`, `required` + FROM `'._DB_PREFIX_.'customization_field` + WHERE `id_product` = '.(int)($productId).' + ORDER BY `id_customization_field`')) === false) + return false; + if (empty($customizations['fields'])) + return array(); + $customizationFieldIds = array(); + foreach ($customizations['fields'] AS $customizationField) + $customizationFieldIds[] = (int)($customizationField['id_customization_field']); + if (($customizationLabels = Db::getInstance()->ExecuteS(' + SELECT `id_customization_field`, `id_lang`, `name` + FROM `'._DB_PREFIX_.'customization_field_lang` + WHERE `id_customization_field` IN ('.implode(', ', $customizationFieldIds).') + ORDER BY `id_customization_field`')) === false) + return false; + foreach ($customizationLabels AS $customizationLabel) + $customizations['labels'][$customizationLabel['id_customization_field']][] = $customizationLabel; + return $customizations; + } + + public static function duplicateSpecificPrices($oldProductId, $productId) + { + foreach (SpecificPrice::getIdsByProductId((int)($oldProductId)) as $data) + { + $specificPrice = new SpecificPrice((int)($data['id_specific_price'])); + if (!$specificPrice->duplicate((int)($productId))) + return false; + } + return true; + } + + public static function duplicateCustomizationFields($oldProductId, $productId) + { + if (($customizations = self::_getCustomizationFieldsNLabels($oldProductId)) === false) + return false; + if (empty($customizations)) + return true; + foreach ($customizations['fields'] AS $customizationField) + { + /* The new datas concern the new product */ + $customizationField['id_product'] = (int)($productId); + $oldCustomizationFieldId = (int)($customizationField['id_customization_field']); + unset($customizationField['id_customization_field']); + if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'customization_field', $customizationField, 'INSERT') OR !$customizationFieldId = Db::getInstance()->Insert_ID()) + return false; + if (isset($customizations['labels'])) + { + $query = 'INSERT INTO `'._DB_PREFIX_.'customization_field_lang` (`id_customization_field`, `id_lang`, `name`) VALUES '; + foreach ($customizations['labels'][$oldCustomizationFieldId] AS $customizationLabel) + $query .= '('.(int)($customizationFieldId).', '.(int)($customizationLabel['id_lang']).', \''.pSQL($customizationLabel['name']).'\'), '; + $query = rtrim($query, ', '); + if (!Db::getInstance()->Execute($query)) + return false; + } + } + return true; + } + + /** + * Get the link of the product page of this product + */ + public function getLink() + { + global $link; + return $link->getProductLink($this); + } + + public function getTags($id_lang) + { + if (!($this->tags AND key_exists($id_lang, $this->tags))) + return ''; + $result = ''; + foreach ($this->tags[$id_lang] AS $tagName) + $result .= $tagName.', '; + return rtrim($result, ', '); + } + + public static function defineProductImage($row, $id_lang) + { + if ($row['id_image']) + return $row['id_product'].'-'.$row['id_image']; + return Language::getIsoById((int)$id_lang).'-default'; + } + + public static function getProductProperties($id_lang, $row) + { + if (!$row['id_product']) + return false; + + // Product::getDefaultAttribute is only called if id_product_attribute is missing from the SQL query at the origin of it: consider adding it in order to avoid unnecessary queries + $row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); + if ((!isset($row['id_product_attribute']) OR !$row['id_product_attribute']) + AND ((isset($row['cache_default_attribute']) AND ($ipa_default = $row['cache_default_attribute']) !== NULL) + OR ($ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp']))) + ) + $row['id_product_attribute'] = $ipa_default; + if (!isset($row['id_product_attribute'])) + $row['id_product_attribute'] = 0; + + // Tax + $usetax = Tax::excludeTaxeOption(); + + $cacheKey = $row['id_product'].'-'.$row['id_product_attribute'].'-'.$id_lang.'-'.(int)($usetax); + if (array_key_exists($cacheKey, self::$producPropertiesCache)) + return self::$producPropertiesCache[$cacheKey]; + + // Datas + $link = new Link(); + $row['category'] = Category::getLinkRewrite((int)$row['id_category_default'], (int)($id_lang)); + $row['link'] = $link->getProductLink((int)$row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); + $row['attribute_price'] = (isset($row['id_product_attribute']) AND $row['id_product_attribute']) ? (float)(Product::getProductAttributePrice($row['id_product_attribute'])) : 0; + $row['price_tax_exc'] = Product::getPriceStatic((int)$row['id_product'], false, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? (int)($row['id_product_attribute']) : NULL), (self::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6)); + if (self::$_taxCalculationMethod == PS_TAX_EXC) + { + $row['price_tax_exc'] = Tools::ps_round($row['price_tax_exc'], 2); + $row['price'] = Product::getPriceStatic((int)$row['id_product'], true, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? (int)($row['id_product_attribute']) : NULL), 6); + $row['price_without_reduction'] = Product::getPriceStatic((int)$row['id_product'], false, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? (int)($row['id_product_attribute']) : NULL), 2, NULL, false, false); + } + else + { + $row['price'] = Tools::ps_round(Product::getPriceStatic((int)$row['id_product'], true, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? (int)($row['id_product_attribute']) : NULL), 2), 2); + $row['price_without_reduction'] = Product::getPriceStatic((int)$row['id_product'], true, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? (int)($row['id_product_attribute']) : NULL), 6, NULL, false, false); + } + + $row['reduction'] = Product::getPriceStatic((int)($row['id_product']), (bool)$usetax, (int)($row['id_product_attribute']), 6, NULL, true, true, 1, true, NULL, NULL, NULL, $specific_prices); + $row['specific_prices'] = $specific_prices; + + if ($row['id_product_attribute']) + { + $row['quantity_all_versions'] = $row['quantity']; + $row['quantity'] = Product::getQuantity((int)$row['id_product'], $row['id_product_attribute'], isset($row['cache_is_pack']) ? $row['cache_is_pack'] : NULL); + } + $row['id_image'] = Product::defineProductImage($row, $id_lang); + $row['features'] = Product::getFrontFeaturesStatic((int)$id_lang, $row['id_product']); + $row['attachments'] = ((!isset($row['cache_has_attachments']) OR $row['cache_has_attachments']) ? Product::getAttachmentsStatic((int)($id_lang), $row['id_product']) : array()); + + // Pack management + $row['pack'] = (!isset($row['cache_is_pack']) ? Pack::isPack($row['id_product']) : (int)$row['cache_is_pack']); + $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); + $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; + if ($row['pack'] AND !Pack::isInStock($row['id_product'])) + $row['quantity'] = 0; + + self::$producPropertiesCache[$cacheKey] = $row; + return self::$producPropertiesCache[$cacheKey]; + } + + public static function getProductsProperties($id_lang, $query_result) + { + $resultsArray = array(); + foreach ($query_result AS $row) + if ($row2 = Product::getProductProperties($id_lang, $row)) + $resultsArray[] = $row2; + return $resultsArray; + } + + /* + * Select all features for a given language + * + * @param $id_lang Language id + * @return array Array with feature's data + */ + public static function getFrontFeaturesStatic($id_lang, $id_product) + { + if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) + { + self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT name, value, pf.id_feature + FROM '._DB_PREFIX_.'feature_product pf + LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') + LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') + WHERE pf.id_product = '.(int)$id_product); + } + return self::$_frontFeaturesCache[$id_product.'-'.$id_lang]; + } + + public function getFrontFeatures($id_lang) + { + return self::getFrontFeaturesStatic($id_lang, $this->id); + } + + public static function getAttachmentsStatic($id_lang, $id_product) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM '._DB_PREFIX_.'product_attachment pa + LEFT JOIN '._DB_PREFIX_.'attachment a ON a.id_attachment = pa.id_attachment + LEFT JOIN '._DB_PREFIX_.'attachment_lang al ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)($id_lang).') + WHERE pa.id_product = '.(int)($id_product)); + } + + public function getAttachments($id_lang) + { + return self::getAttachmentsStatic($id_lang, $this->id); + } + + /* + ** Customization management + */ + + public static function getAllCustomizedDatas($id_cart, $id_lang = null) + { + global $cookie; + // No need to query if there isn't any real cart! + if (!$id_cart) + return false; + if (!$id_lang AND !is_null($cookie) AND $cookie->id_lang) + $id_lang = $cookie->id_lang; + else + { + $cart = new Cart((int)($id_cart)); + $id_lang = (int)($cart->id_lang); + } + + if (!$result = Db::getInstance()->ExecuteS(' + SELECT cd.`id_customization`, c.`id_product`, cfl.`id_customization_field`, c.`id_product_attribute`, cd.`type`, cd.`index`, cd.`value`, cfl.`name` + FROM `'._DB_PREFIX_.'customized_data` cd + NATURAL JOIN `'._DB_PREFIX_.'customization` c + LEFT JOIN `'._DB_PREFIX_.'customization_field_lang` cfl ON (cfl.id_customization_field = cd.`index` AND id_lang = '.(int)($id_lang).') + WHERE c.`id_cart` = '.(int)$id_cart.' + ORDER BY `id_product`, `id_product_attribute`, `type`, `index`')) + return false; + $customizedDatas = array(); + foreach ($result AS $row) + $customizedDatas[(int)($row['id_product'])][(int)($row['id_product_attribute'])][(int)($row['id_customization'])]['datas'][(int)($row['type'])][] = $row; + if (!$result = Db::getInstance()->ExecuteS('SELECT `id_product`, `id_product_attribute`, `id_customization`, `quantity`, `quantity_refunded`, `quantity_returned` FROM `'._DB_PREFIX_.'customization` WHERE `id_cart` = '.(int)($id_cart))) + return false; + foreach ($result AS $row) + { + $customizedDatas[(int)($row['id_product'])][(int)($row['id_product_attribute'])][(int)($row['id_customization'])]['quantity'] = (int)($row['quantity']); + $customizedDatas[(int)($row['id_product'])][(int)($row['id_product_attribute'])][(int)($row['id_customization'])]['quantity_refunded'] = (int)($row['quantity_refunded']); + $customizedDatas[(int)($row['id_product'])][(int)($row['id_product_attribute'])][(int)($row['id_customization'])]['quantity_returned'] = (int)($row['quantity_returned']); + } + return $customizedDatas; + } + + + /** + * @param int $id_customization + * @return bool + * @deprecated + */ + public function deleteCustomizedDatas($id_customization) + { + Tools::displayAsDeprecated(); + if (Pack::isPack((int)($product['id_product']))) + { + $products_pack = Pack::getItems((int)($product['id_product']), (int)(Configuration::get('PS_LANG_DEFAULT'))); + foreach($products_pack AS $product_pack) + { + $tab_product_pack['id_product'] = (int)($product_pack->id); + $tab_product_pack['id_product_attribute'] = self::getDefaultAttribute($tab_product_pack['id_product'], 1); + $tab_product_pack['cart_quantity'] = (int)($product_pack->pack_quantity * $product['cart_quantity']); + self::updateQuantity($tab_product_pack); + } + } + if (($result = Db::getInstance()->ExecuteS('SELECT `value` FROM `'._DB_PREFIX_.'customized_data` WHERE `id_customization` = '.(int)($id_customization).' AND `type` = '._CUSTOMIZE_FILE_)) === false) + return false; + foreach ($result AS $row) + if (!@unlink(_PS_UPLOAD_DIR_.$row['value']) OR !@unlink(_PS_UPLOAD_DIR_.$row['value'].'_small')) + return false; + return (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization` WHERE `id_customization` = '.(int)($id_customization)) AND Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customized_data` WHERE `id_customization` = '.(int)($id_customization))); + } + + public static function addCustomizationPrice(&$products, &$customizedDatas) + { + foreach ($products AS &$productUpdate) + { + $customizationQuantity = 0; + $customizationQuantityRefunded = 0; + $customizationQuantityReturned = 0; + /* Compatibility */ + $productId = (int)(isset($productUpdate['id_product']) ? $productUpdate['id_product'] : $productUpdate['product_id']); + $productAttributeId = (int)(isset($productUpdate['id_product_attribute']) ? $productUpdate['id_product_attribute'] : $productUpdate['product_attribute_id']); + $productQuantity = (int)(isset($productUpdate['cart_quantity']) ? $productUpdate['cart_quantity'] : $productUpdate['product_quantity']); + $price = isset($productUpdate['price']) ? $productUpdate['price'] : $productUpdate['product_price']; + $priceWt = $price * (1 + ((isset($productUpdate['tax_rate']) ? $productUpdate['tax_rate'] : $productUpdate['rate']) * 0.01)); + if (isset($customizedDatas[$productId][$productAttributeId])) + foreach ($customizedDatas[$productId][$productAttributeId] AS $customization) + { + $customizationQuantity += (int)($customization['quantity']); + $customizationQuantityRefunded += (int)($customization['quantity_refunded']); + $customizationQuantityReturned += (int)($customization['quantity_returned']); + } + $productUpdate['customizationQuantityTotal'] = $customizationQuantity; + $productUpdate['customizationQuantityRefunded'] = $customizationQuantityRefunded; + $productUpdate['customizationQuantityReturned'] = $customizationQuantityReturned; + if ($customizationQuantity) + { + $productUpdate['total_wt'] = $priceWt * ($productQuantity - $customizationQuantity); + $productUpdate['total_customization_wt'] = $priceWt * $customizationQuantity; + $productUpdate['total'] = $price * ($productQuantity - $customizationQuantity); + $productUpdate['total_customization'] = $price * $customizationQuantity; + } + } + } + + /* + ** Customization fields' label management + */ + + protected function _checkLabelField($field, $value) + { + if (!Validate::isLabel($value)) + return false; + $tmp = explode('_', $field); + if (count($tmp) < 4) + return false; + return $tmp; + } + + protected function _deleteOldLabels() + { + $max = array(_CUSTOMIZE_FILE_ => (int)(Tools::getValue('uploadable_files')), _CUSTOMIZE_TEXTFIELD_ => (int)(Tools::getValue('text_fields'))); + /* Get customization field ids */ + if (($result = Db::getInstance()->ExecuteS('SELECT `id_customization_field`, `type` FROM `'._DB_PREFIX_.'customization_field` WHERE `id_product` = '.(int)($this->id).' ORDER BY `id_customization_field`')) === false) + return false; + if (empty($result)) + return true; + $customizationFields = array(_CUSTOMIZE_FILE_ => array(), _CUSTOMIZE_TEXTFIELD_ => array()); + foreach ($result AS $row) + $customizationFields[(int)($row['type'])][] = (int)($row['id_customization_field']); + $extraFile = count($customizationFields[_CUSTOMIZE_FILE_]) - $max[_CUSTOMIZE_FILE_]; + $extraText = count($customizationFields[_CUSTOMIZE_TEXTFIELD_]) - $max[_CUSTOMIZE_TEXTFIELD_]; + + /* If too much inside the database, deletion */ + if ($extraFile > 0 AND count($customizationFields[_CUSTOMIZE_FILE_]) - $extraFile >= 0 AND + (!Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization_field` WHERE `id_product` = '.(int)($this->id).' AND `type` = '._CUSTOMIZE_FILE_.' AND `id_customization_field` >= '.(int)($customizationFields[_CUSTOMIZE_FILE_][count($customizationFields[_CUSTOMIZE_FILE_]) - $extraFile])) + OR !Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization_field_lang` WHERE `id_customization_field` NOT IN (SELECT `id_customization_field` FROM `'._DB_PREFIX_.'customization_field`)'))) + return false; + + if ($extraText > 0 AND count($customizationFields[_CUSTOMIZE_TEXTFIELD_]) - $extraText >= 0 AND + (!Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization_field` WHERE `id_product` = '.(int)($this->id).' AND `type` = '._CUSTOMIZE_TEXTFIELD_.' AND `id_customization_field` >= '.(int)($customizationFields[_CUSTOMIZE_TEXTFIELD_][count($customizationFields[_CUSTOMIZE_TEXTFIELD_]) - $extraText])) + OR !Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization_field_lang` WHERE `id_customization_field` NOT IN (SELECT `id_customization_field` FROM `'._DB_PREFIX_.'customization_field`)'))) + return false; + return true; + } + + protected function _createLabel(&$languages, $type) + { + /* Label insertion */ + if (!Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'customization_field` (`id_product`, `type`, `required`) VALUES ('.(int)($this->id).', '.(int)($type).', 0)') OR !$id_customization_field = (int)(Db::getInstance()->Insert_ID())) + return false; + + /* Multilingual label name creation */ + $values = ''; + foreach ($languages AS $language) + $values .= '('.(int)($id_customization_field).', '.(int)($language['id_lang']).', \'\'), '; + $values = rtrim($values, ', '); + if (!Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'customization_field_lang` (`id_customization_field`, `id_lang`, `name`) VALUES '.$values)) + return false; + return true; + } + + public function createLabels($uploadableFiles, $textFields) + { + $languages = Language::getLanguages(); + if ((int)($uploadableFiles) > 0) + for ($i = 0; $i < (int)($uploadableFiles); $i++) + if (!$this->_createLabel($languages, _CUSTOMIZE_FILE_)) + return false; + if ((int)($textFields) > 0) + for ($i = 0; $i < (int)($textFields); $i++) + if (!$this->_createLabel($languages, _CUSTOMIZE_TEXTFIELD_)) + return false; + return true; + } + + public function updateLabels() + { + $hasRequiredFields = 0; + foreach ($_POST AS $field => $value) + /* Label update */ + if (strncmp($field, 'label_', 6) == 0) + { + if (!$tmp = $this->_checkLabelField($field, $value)) + return false; + /* Multilingual label name update */ + if (!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'customization_field_lang` + (`id_customization_field`, `id_lang`, `name`) VALUES ('.(int)($tmp[2]).', '.(int)($tmp[3]).', \''.pSQL($value).'\') + ON DUPLICATE KEY UPDATE `name` = \''.pSQL($value).'\'')) + return false; + $isRequired = isset($_POST['require_'.(int)($tmp[1]).'_'.(int)($tmp[2])]) ? 1 : 0; + $hasRequiredFields |= $isRequired; + /* Require option update */ + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'customization_field` SET `required` = '.(int)($isRequired).' WHERE `id_customization_field` = '.(int)($tmp[2]))) + return false; + } + if ($hasRequiredFields AND !Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'product` SET `customizable` = 2 WHERE `id_product` = '.(int)($this->id))) + return false; + if (!$this->_deleteOldLabels()) + return false; + return true; + } + + public function getCustomizationFields($id_lang = false) + { + if (!$result = Db::getInstance()->ExecuteS(' + SELECT cf.`id_customization_field`, cf.`type`, cf.`required`, cfl.`name`, cfl.`id_lang` + FROM `'._DB_PREFIX_.'customization_field` cf + NATURAL JOIN `'._DB_PREFIX_.'customization_field_lang` cfl + WHERE cf.`id_product` = '.(int)($this->id).($id_lang ? ' AND cfl.`id_lang` = '.(int)($id_lang) : '').' + ORDER BY cf.`id_customization_field`')) + return false; + if ($id_lang) + return $result; + $customizationFields = array(); + foreach ($result AS $row) + $customizationFields[(int)($row['type'])][(int)($row['id_customization_field'])][(int)($row['id_lang'])] = $row; + return $customizationFields; + } + + public function getCustomizationFieldIds() + { + return Db::getInstance()->ExecuteS('SELECT `id_customization_field`, `type` FROM `'._DB_PREFIX_.'customization_field` WHERE `id_product` = '.(int)($this->id)); + } + + public function getRequiredCustomizableFields() + { + return Db::getInstance()->ExecuteS('SELECT `id_customization_field`, `type` FROM `'._DB_PREFIX_.'customization_field` WHERE `id_product` = '.(int)($this->id).' AND `required` = 1'); + } + + public function hasAllRequiredCustomizableFields() + { + global $cookie; + + $fields = array_merge($cookie->getFamily('pictures_'.(int)($this->id)), $cookie->getFamily('textFields_'.(int)($this->id))); + if (($requiredFields = $this->getRequiredCustomizableFields()) === false) + return false; + $prefix = array(_CUSTOMIZE_FILE_ => 'pictures_'.(int)($this->id).'_', _CUSTOMIZE_TEXTFIELD_ => 'textFields_'.(int)($this->id).'_'); + foreach ($requiredFields AS $field) + if (!isset($fields[$prefix[$field['type']].$field['id_customization_field']]) OR empty($fields[$prefix[$field['type']].$field['id_customization_field']])) + return false; + return true; + } + + /** + * Specify if a product is already in database + * + * @param $id_product Product id + * @return boolean + */ + public static function existsInDatabase($id_product) + { + $row = Db::getInstance()->getRow(' + SELECT `id_product` + FROM '._DB_PREFIX_.'product p + WHERE p.`id_product` = '.(int)($id_product)); + + return isset($row['id_product']); + } + + public static function idIsOnCategoryId($id_product, $categories) + { + $sql = 'SELECT id_product FROM `'._DB_PREFIX_.'category_product` WHERE `id_product`='.(int)($id_product).' AND `id_category` IN('; + foreach ($categories AS $category) + $sql .= (int)($category['id_category']).','; + $sql = rtrim($sql, ',').')'; + + if (isset(self::$_incat[md5($sql)])) + return self::$_incat[md5($sql)]; + + if (!Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) + return false; + self::$_incat[md5($sql)] = (Db::getInstance(_PS_USE_SQL_SLAVE_)->NumRows() > 0 ? true : false); + return self::$_incat[md5($sql)]; + } + + public function getNoPackPrice() + { + return Pack::noPackPrice($this->id); + } + + public function checkAccess($id_customer) + { + if (!$id_customer) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT ctg.`id_group` + FROM `'._DB_PREFIX_.'category_product` cp + INNER JOIN `'._DB_PREFIX_.'category_group` ctg ON (ctg.`id_category` = cp.`id_category`) + WHERE cp.`id_product` = '.(int)($this->id).' AND ctg.`id_group` = 1'); + } else { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT cg.`id_group` + FROM `'._DB_PREFIX_.'category_product` cp + INNER JOIN `'._DB_PREFIX_.'category_group` ctg ON (ctg.`id_category` = cp.`id_category`) + INNER JOIN `'._DB_PREFIX_.'customer_group` cg ON (cg.`id_group` = ctg.`id_group`) + WHERE cp.`id_product` = '.(int)($this->id).' AND cg.`id_customer` = '.(int)($id_customer)); + } + if ($result AND isset($result['id_group']) AND $result['id_group']) + return true; + return false; + } + + /** + * Add a stock movement for current product + * + * @param int $quantity + * @param int $id_reason + * @param int $id_product_attribute + * @param int $id_order + * @param int $id_employee + * @return bool + */ + public function addStockMvt($quantity, $id_reason, $id_product_attribute = NULL, $id_order = NULL, $id_employee = NULL) + { + if (!$this->id) + return; + + $reason = new StockMvtReason($id_reason); + if (!$reason->id) + return ; + + // Update product stock + $quantity = abs((int)$quantity) * $reason->sign; + $this->setStock($quantity, $id_product_attribute, true); + + // Add a new stock movement + $stockMvt = new StockMvt(); + $stockMvt->id_stock = Stock::getStockId($this->id, $id_product_attribute, $this->id_shop); + $stockMvt->id_product = $this->id; + $stockMvt->id_product_attribute = (int)$id_product_attribute; + $stockMvt->id_order = (int)$id_order; + $stockMvt->id_employee = (int)$id_employee; + $stockMvt->quantity = $quantity; + $stockMvt->id_stock_mvt_reason = (int)$id_reason; + $result = $stockMvt->add(); + + // @hook updateQuantity + Hook::updateQuantity($this, null); + + return $result; + } + + public function getStockMvts($id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT sm.id_stock_mvt, sm.date_add, sm.quantity, sm.id_order, CONCAT(pl.name, \' \', GROUP_CONCAT(IFNULL(al.name, \'\'), \'\')) product_name, CONCAT(e.lastname, \' \', e.firstname) employee, mrl.name reason + FROM `'._DB_PREFIX_.'stock_mvt` sm + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (sm.id_product = pl.id_product AND pl.id_lang = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'stock_mvt_reason_lang` mrl ON (sm.id_stock_mvt_reason = mrl.id_stock_mvt_reason AND mrl.id_lang = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'employee` e ON (e.id_employee = sm.id_employee) + LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pac.id_product_attribute = sm.id_product_attribute) + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (al.id_attribute = pac.id_attribute AND al.id_lang = '.(int)$id_lang.') + WHERE sm.id_product='.(int)$this->id.' + GROUP BY sm.id_stock_mvt'); + } + + /** + * @deprecated + */ + public function getBasicPrice() + { + Tools::displayAsDeprecated(); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT `price` FROM `'._DB_PREFIX_.'product` WHERE `id_product` = '.(int)($this->id)); + } + + public static function getUrlRewriteInformations($id_product) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT pl.`id_lang`, pl.`link_rewrite`, p.`ean13`, cl.`link_rewrite` AS category_rewrite + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'lang` l ON (pl.`id_lang` = l.`id_lang`) + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = p.`id_category_default` AND cl.`id_lang` = pl.`id_lang`) + WHERE p.`id_product` = '.(int)$id_product. ' + AND l.`active` = 1'); + } + + public static function getIdTaxRulesGroupByIdProduct($id_product) + { + if (!isset(self::$_tax_rules_group[$id_product])) + { + $id_group = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `id_tax_rules_group` + FROM `'._DB_PREFIX_.'product` + WHERE `id_product` = '.(int)$id_product); + self::$_tax_rules_group[$id_product] = $id_group; + } + return self::$_tax_rules_group[$id_product]; + } + + /** + * Webservice getter : get product features association + * + * @return array + */ + public function getWsProductFeatures() + { + $rows = $this->getFeatures(); + foreach ($rows as $keyrow => $row) + { + foreach ($row as $keyfeature => $feature) + { + if ($keyfeature == 'id_feature') + { + $rows[$keyrow]['id'] = $feature; + unset($rows[$keyrow]['id_feature']); + } + unset($rows[$keyrow]['id_product']); + } + asort($rows[$keyrow]); + } + return $rows; + } + + /** + * Webservice setter : set product features association + * + * @param $productFeatures Product Feature ids + * @return boolean + */ + public function setWsProductFeatures($productFeatures) + { + $this->deleteProductFeatures(); + foreach ($productFeatures as $productFeature) + $this->addFeaturesToDB($productFeature['id'], $productFeature['id_feature_value']); + return true; + } + + /** + * Webservice getter : get virtual field default combination + * + * @return int + */ + public function getWsDefaultCombination() + { + return self::getDefaultAttribute($this->id); + } + + /** + * Webservice setter : set virtual field default combination + * + * @param $id_combination id default combination + */ + public function setWsDefaultCombination($id_combination) + { + $this->deleteDefaultAttributes(); + return $this->setDefaultAttribute((int)$id_combination); + } + + /** + * Webservice getter : get category ids of current product for association + * + * @return array + */ + public function getWsCategories() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('SELECT `id_category` AS id FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.(int)$this->id); + return $result; + } + + /** + * Webservice setter : set category ids of current product for association + * + * @param $category_ids category ids + */ + public function setWsCategories($category_ids) + { + $ids = array(); + foreach ($category_ids as $value) + $ids[] = $value['id']; + if ($this->deleteCategories()) + { + if ($ids) + { + $sqlValues = ''; + $ids = array_map('intval', $ids); + foreach ($ids as $position => $id) + $sqlValues[] = '('.(int)$id.', '.(int)$this->id.', '.(int)$position.')'; + $result = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'category_product` (`id_category`, `id_product`, `position`) + VALUES '.implode(',', $sqlValues) + ); + return $result; + } + } + return true; + } + + /** + * Webservice getter : get combination ids of current product for association + * + * @return array + */ + public function getWsCombinations() + { + $result = Db::getInstance()->ExecuteS('SELECT `id_product_attribute` as id FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id)); + return $result; + } + + /** + * Webservice setter : set combination ids of current product for association + * + * @param $combinations combination ids + */ + public function setWsCombinations($combinations) + { + // No hook exec + $ids_new = array(); + foreach ($combinations as $combination) + $ids_new[] = (int)$combination['id']; + + $ids_orig = array(); + $original = Db::getInstance()->ExecuteS('SELECT `id_product_attribute` as id FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id)); + if (is_array($original)) + foreach ($original as $id) + $ids_orig[] = $id['id']; + + $all_ids = array(); + $all = Db::getInstance()->ExecuteS('SELECT `id_product_attribute` as id FROM `'._DB_PREFIX_.'product_attribute`'); + if (is_array($all)) + foreach ($all as $id) + $all_ids[] = $id['id']; + + $toAdd = array(); + foreach ($ids_new as $id) + if (!in_array($id, $ids_orig)) + $toAdd[] = $id; + + $toDelete = array(); + foreach ($ids_orig as $id) + if (!in_array($id, $ids_new)) + $toDelete[] = $id; + + // Delete rows + if (count($toDelete) > 0) + $result = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product_attribute` IN ('.implode(',', $toDelete).')'); + + foreach ($toAdd as $id) + { + // Update id_product if exists else create + if (in_array($id, $all_ids)) + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'product_attribute` SET id_product = '.(int)$this->id.' WHERE id_product_attribute='.$id); + else + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'product_attribute` (`id_product`) VALUES ('.$this->id.')'); + } + return true; + } + + /** + * Webservice getter : get product option ids of current product for association + * + * @return array + */ + public function getWsProductOptionValues() + { + $result = Db::getInstance()->ExecuteS('SELECT DISTINCT pac.id_attribute as id + FROM `'._DB_PREFIX_.'product_attribute` pa + LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pac.id_product_attribute = pa.id_product_attribute) + WHERE pa.id_product = '.(int)$this->id); + return $result; + } + + /** + * Webservice getter : get virtual field position in category + * + * @return int + */ + public function getWsPositionInCategory() + { + $result = Db::getInstance()->ExecuteS('SELECT position + FROM `'._DB_PREFIX_.'category_product` + WHERE id_category = '.(int)($this->id_category_default).' + AND id_product = '.(int)($this->id)); + if (count($result) > 0) + return $result[0]['position']; + return ''; + } + + /** + * Webservice getter : get virtual field id_default_image in category + * + * @return int + */ + public function getCoverWs() + { + $result = $this->getCover($this->id); + return $result['id_image']; + } + + /** + * Webservice getter : get image ids of current product for association + * + * @return array + */ + public function getWsImages() + { + return Db::getInstance()->ExecuteS(' + SELECT `id_image` as id + FROM `'._DB_PREFIX_.'image` + WHERE `id_product` = '.(int)($this->id).' + ORDER BY `position`'); + } + + public function getWsManufacturerName() + { + return Manufacturer::getNameById((int)$this->id_manufacturer); + } +} diff --git a/classes/ProductDownload.php b/classes/ProductDownload.php new file mode 100644 index 000000000..7a6ffcf61 --- /dev/null +++ b/classes/ProductDownload.php @@ -0,0 +1,272 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7099 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ProductDownloadCore extends ObjectModel +{ + /** @var integer Product id which download belongs */ + public $id_product; + + /** @var string DisplayFilename the name which appear */ + public $display_filename; + + /** @var string PhysicallyFilename the name of the file on hard disk */ + public $physically_filename; + + /** @var string DateDeposit when the file is upload */ + public $date_deposit; + + /** @var string DateExpiration deadline of the file */ + public $date_expiration; + + /** @var string NbDaysAccessible how many days the customer can access to file */ + public $nb_days_accessible; + + /** @var string NbDownloadable how many time the customer can download the file */ + public $nb_downloadable; + + /** @var boolean Active if file is accessible or not */ + public $active = 1; + + protected static $_productIds = array(); + + protected $fieldsRequired = array( + 'id_product', + 'display_filename' + ); + protected $fieldsSize = array( + 'display_filename' => 255, + 'physically_filename' => 255, + 'date_deposit' => 20, + 'date_expiration' => 20, + 'nb_days_accessible' => 10, + 'nb_downloadable' => 10, + 'active' => 1 + ); + protected $fieldsValidate = array( + 'id_product' => 'isUnsignedId', + 'display_filename' => 'isGenericName', + 'physically_filename' => 'isSha1', + 'date_deposit' => 'isDate', + 'date_expiration' => 'isDate', + 'nb_days_accessible' => 'isUnsignedInt', + 'nb_downloadable' => 'isUnsignedInt', + 'active' => 'isUnsignedInt' + ); + + protected $table = 'product_download'; + protected $identifier = 'id_product_download'; + + /** + * Build a virtual product + * + * @param integer $id_product_download Existing productDownload id in order to load object (optional) + */ + public function __construct($id_product_download = NULL) + { + parent::__construct($id_product_download); + // TODO check if the file is present on hard drive + } + + public function delete($deleteFile=false) + { + if ($deleteFile) + $this->deleteFile(); + } + + public function getFields() + { + parent::validateFields(); + + $fields['id_product'] = (int)($this->id_product); + $fields['display_filename'] = pSQL($this->display_filename); + $fields['physically_filename'] = pSQL($this->physically_filename); + $fields['date_deposit'] = pSQL($this->date_deposit); + $fields['date_expiration'] = pSQL($this->date_expiration); + $fields['nb_days_accessible'] = (int)($this->nb_days_accessible); + $fields['nb_downloadable'] = (int)($this->nb_downloadable); + $fields['active'] = (int)($this->active); + return $fields; + } + + + /** + * Delete the file + * + * @return boolean + */ + public function deleteFile() + { + if (!$this->checkFile()) + return false; + return unlink(_PS_DOWNLOAD_DIR_.$this->physically_filename); + } + + /** + * Check if file exists + * + * @return boolean + */ + public function checkFile() + { + if (!$this->physically_filename) return false; + return file_exists(_PS_DOWNLOAD_DIR_.$this->physically_filename); + } + + /** + * Check if download repository is writable + * + * @return boolean + */ + static public function checkWritableDir() + { + return is_writable(_PS_DOWNLOAD_DIR_); + } + + /** + * Return the id_product_download from an id_product + * + * @param int $id_product Product the id + * @return integer Product the id for this virtual product + */ + public static function getIdFromIdProduct($id_product) + { + if (array_key_exists($id_product, self::$_productIds)) + return self::$_productIds[$id_product]; + + $data = Db::getInstance()->getRow(' + SELECT `id_product_download` + FROM `'._DB_PREFIX_.'product_download` + WHERE `id_product` = '.(int)($id_product).' AND `active` = 1'); + + self::$_productIds[$id_product] = isset($data['id_product_download']) ? (int)($data['id_product_download']) : false; + + return self::$_productIds[$id_product]; + } + + /** + * Return the filename from an id_product + * + * @param int $id_product Product the id + * @return string Filename the filename for this virtual product + */ + public static function getFilenameFromIdProduct($id_product) + { + $data = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `physically_filename` + FROM `'._DB_PREFIX_.'product_download` + WHERE `id_product` = '.(int)($id_product).' + AND `active` = 1'); + return $data['physically_filename']; + } + + /** + * Return the display filename from a physical filename + * + * @param string $physically_filename Filename physically + * @return string Filename the display filename for this virtual product + */ + public static function getFilenameFromFilename($physically_filename) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `display_filename` + FROM `'._DB_PREFIX_.'product_download` + WHERE `physically_filename` = \''.pSQL($physically_filename).'\''); + } + + /** + * Return html link + * + * @param string $class CSS selector (optionnal) + * @param bool $admin specific to backend (optionnal) + * @param string $hash hash code in table order detail (optionnal) + * @return string Html all the code for print a link to the file + */ + public function getTextLink($admin=true, $hash=false) + { + $key = $this->physically_filename . '-' . ($hash ? $hash : 'orderdetail'); + $link = ($admin) ? './index.php?controller=get-file-admin' : Tools::getHttpHost(true, true).'index.php?controller=get-file'; + $link .= ($admin) ? 'file='.$this->physically_filename : 'key='.$key; + return $link; + } + + /** + * Return html link + * + * @param string $class CSS selector (optionnal) + * @param bool $admin specific to backend (optionnal) + * @param string $hash hash code in table order detail (optionnal) + * @return string Html all the code for print a link to the file + */ + public function getHtmlLink($class=false, $admin=true, $hash=false) + { + $link = $this->getTextLink($admin, $hash); + $html = 'display_filename.''; + return $html; + } + + /** + * Return a deadline + * + * @return string Datetime in SQL format + */ + public function getDeadline() + { + if (!(int)($this->nb_days_accessible)) + return '0000-00-00 00:00:00'; + $timestamp = strtotime('+'.(int)($this->nb_days_accessible).' day'); + return date('Y-m-d H:i:s', $timestamp); + } + + /** + * Return a hash for control download access + * + * @return string Hash ready to insert in database + */ + public function getHash() + { + // TODO check if this hash not already in database + return sha1(microtime().$this->id); + } + + /** + * Return a sha1 filename + * + * @return string Sha1 unique filename + */ + static public function getNewFilename() + { + $ret = sha1(microtime()); + if (file_exists(_PS_DOWNLOAD_DIR_.$ret)) + $ret = ProductDownload::getNewFilename(); + return $ret; + } + +} + + diff --git a/classes/ProductSale.php b/classes/ProductSale.php new file mode 100644 index 000000000..9804d8af9 --- /dev/null +++ b/classes/ProductSale.php @@ -0,0 +1,186 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7484 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ProductSaleCore +{ + /* + ** Fill the `product_sale` SQL table with data from `order_detail` + ** @return bool True on success + */ + static public function fillProductSales() + { + return Db::getInstance()->Execute(' + REPLACE INTO '._DB_PREFIX_.'product_sale + (`id_product`, `quantity`, `sale_nbr`, `date_upd`) + SELECT od.product_id, COUNT(od.product_id), SUM(od.product_quantity), NOW() + FROM '._DB_PREFIX_.'order_detail od GROUP BY od.product_id'); + } + + /* + ** Get number of actives products sold + ** @return int number of actives products listed in product_sales + */ + static public function getNbSales($id_shop = false) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(ps.`id_product`) AS nb + FROM `'._DB_PREFIX_.'product_sale` ps + '.($id_shop ? 'LEFT JOIN '._DB_PREFIX_.'product_shop pss ON (pss.id_product = ps.id_product)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ps.`id_product` + WHERE p.`active` = 1'.($id_shop ? ' AND pss.id_shop='.(int)$id_shop : '')); + return (int)($result['nb']); + } + + /* + ** Get required informations on best sales products + ** + ** @param integer $id_lang Language id + ** @param integer $pageNumber Start from (optional) + ** @param integer $nbProducts Number of products to return (optional) + ** @return array from Product::getProductProperties + */ + static public function getBestSales($id_lang, $pageNumber = 0, $nbProducts = 10, $orderBy=NULL, $orderWay=NULL, $id_shop = false) + { + if ($pageNumber < 0) $pageNumber = 0; + if ($nbProducts < 1) $nbProducts = 10; + if (empty($orderBy) || $orderBy == 'position') $orderBy = 'sales'; + if (empty($orderWay)) $orderWay = 'DESC'; + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.*, + pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, m.`name` AS manufacturer_name, p.`id_manufacturer` as id_manufacturer, + i.`id_image`, il.`legend`, + ps.`quantity` AS sales, t.`rate`, pl.`meta_keywords`, pl.`meta_title`, pl.`meta_description`, + DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new + FROM `'._DB_PREFIX_.'product_sale` ps + LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product` + '.($id_shop ? 'LEFT JOIN `'._DB_PREFIX_.'product_shop` pss ON (pss.`id_product` = p.`id_product`)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + WHERE p.`active` = 1 + '.($id_shop ? ' AND pss.id_shop='.(int)$id_shop : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY '.(isset($orderByPrefix) ? $orderByPrefix.'.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' + LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts)); + + if ($orderBy == 'price') + Tools::orderbyPrice($result,$orderWay); + if (!$result) + return false; + return Product::getProductsProperties($id_lang, $result); + } + + /* + ** Get required informations on best sales products + ** + ** @param integer $id_lang Language id + ** @param integer $pageNumber Start from (optional) + ** @param integer $nbProducts Number of products to return (optional) + ** @return array keys : id_product, link_rewrite, name, id_image, legend, sales, ean13, upc, link + */ + static public function getBestSalesLight($id_lang, $pageNumber = 0, $nbProducts = 10, $id_shop = null) + { + global $link; + + if ($pageNumber < 0) $pageNumber = 0; + if ($nbProducts < 1) $nbProducts = 10; + if (is_null($id_shop)) $id_shop = Shop::getCurrentShop(); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + $sql = 'SELECT p.id_product, pl.`link_rewrite`, pl.`name`, pl.`description_short`, i.`id_image`, il.`legend`, ps.`quantity` AS sales, p.`ean13`, p.`upc`, cl.`link_rewrite` AS category + FROM `'._DB_PREFIX_.'product_sale` ps + LEFT JOIN `'._DB_PREFIX_.'product` p ON ps.`id_product` = p.`id_product` + '.($id_shop ? 'LEFT JOIN `'._DB_PREFIX_.'product_shop` pss ON (pss.`id_product` = p.`id_product`)' : '').' + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.(($id_shop) ? ' AND pl.id_shop = '.(int)$id_shop : '').') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = p.`id_category_default` AND cl.`id_lang` = '.(int)$id_lang.(($id_shop) ? ' AND cl.id_shop = '.(int)$id_shop : '').') + WHERE p.`active` = 1 + '.($id_shop ? ' AND pss.id_shop='.(int)$id_shop : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY sales DESC + LIMIT '.(int)($pageNumber * $nbProducts).', '.(int)($nbProducts); + if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) + return $result; + + foreach ($result AS &$row) + { + $row['link'] = $link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); + $row['id_image'] = Product::defineProductImage($row, $id_lang); + } + return $result; + } + + static public function addProductSale($product_id, $qty = 1) + { + return Db::getInstance()->Execute(' + INSERT INTO '._DB_PREFIX_.'product_sale + (`id_product`, `quantity`, `sale_nbr`, `date_upd`) + VALUES ('.(int)($product_id).', '.(int)($qty).', 1, NOW()) + ON DUPLICATE KEY UPDATE `quantity` = `quantity` + '.(int)($qty).', `sale_nbr` = `sale_nbr` + 1, `date_upd` = NOW()'); + } + + static public function getNbrSales($id_product) + { + $result = Db::getInstance()->getRow('SELECT `sale_nbr` FROM '._DB_PREFIX_.'product_sale WHERE `id_product` = '.(int)($id_product)); + if (!$result OR empty($result) OR !key_exists('sale_nbr', $result)) + return -1; + return (int)($result['sale_nbr']); + } + + static public function removeProductSale($id_product, $qty = 1) + { + $nbrSales = self::getNbrSales($id_product); + if ($nbrSales > 1) + return Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product_sale SET `quantity` = `quantity` - '.(int)($qty).', `sale_nbr` = `sale_nbr` - 1, `date_upd` = NOW() WHERE `id_product` = '.(int)($id_product)); + elseif ($nbrSales == 1) + return Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_sale WHERE `id_product` = '.(int)($id_product)); + return true; + } +} + diff --git a/classes/Profile.php b/classes/Profile.php new file mode 100644 index 000000000..614ca061f --- /dev/null +++ b/classes/Profile.php @@ -0,0 +1,131 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ProfileCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'profile'; + protected $identifier = 'id_profile'; + + public function getFields() + { + return array('id_profile' => $this->id); + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + /** + * Get all available profiles + * + * @return array Profiles + */ + static public function getProfiles($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.`id_profile`, `name` + FROM `'._DB_PREFIX_.'profile` p + LEFT JOIN `'._DB_PREFIX_.'profile_lang` pl ON (p.`id_profile` = pl.`id_profile` AND `id_lang` = '.(int)($id_lang).') + ORDER BY `name` ASC'); + } + + /** + * Get the current profile name + * + * @return string Profile + */ + static public function getProfile($id_profile, $id_lang = NULL) + { + if ($id_lang == NULL) + $id_lang = Configuration::get('PS_LANG_DEFAULT'); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name` + FROM `'._DB_PREFIX_.'profile` p + LEFT JOIN `'._DB_PREFIX_.'profile_lang` pl ON (p.`id_profile` = pl.`id_profile`) + WHERE p.`id_profile` = '.(int)($id_profile).' + AND pl.`id_lang` = '.(int)($id_lang)); + } + + + public function add($autodate = true, $nullValues = false) + { + if (parent::add($autodate, true)) + return Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'access (SELECT '.(int)($this->id).', id_tab, 0, 0, 0, 0 FROM '._DB_PREFIX_.'tab)'); + return false; + } + + public function delete() + { + if (parent::delete()) + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'access` WHERE `id_profile` = '.(int)($this->id)); + return false; + } + + public static function getProfileAccess($id_profile, $id_tab) + { + // getProfileAccesses is cached so there is no performance leak + $accesses = self::getProfileAccesses($id_profile); + return (isset($accesses[$id_tab]) ? $accesses[$id_tab] : false); + } + + private static $_cache_accesses = array(); + public static function getProfileAccesses($id_profile) + { + if (!isset(self::$_cache_accesses[$id_profile])) + { + $result = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'access` + WHERE `id_profile` = '.(int)$id_profile); + + self::$_cache_accesses[$id_profile] = array(); + foreach($result AS $row) + { + if (!isset(self::$_cache_accesses[$id_profile][$row['id_tab']])) + self::$_cache_accesses[$id_profile][$row['id_tab']] = array(); + self::$_cache_accesses[$id_profile][$row['id_tab']] = $row; + } + } + return self::$_cache_accesses[$id_profile]; + } +} + + diff --git a/classes/QuickAccess.php b/classes/QuickAccess.php new file mode 100644 index 000000000..a5873b77d --- /dev/null +++ b/classes/QuickAccess.php @@ -0,0 +1,82 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class QuickAccessCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + /** @var string Link */ + public $link; + + /** @var boolean New windows or not */ + public $new_window; + + protected $fieldsRequired = array('link', 'new_window'); + protected $fieldsSize = array('link' => 128); + protected $fieldsValidate = array('link' => 'isUrl', 'new_window' => 'isBool'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'quick_access'; + protected $identifier = 'id_quick_access'; + + public function getFields() + { + parent::validateFields(); + $fields['link'] = pSQL($this->link); + $fields['new_window'] = (int)($this->new_window); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + /** + * Get all available quick_accesses + * + * @return array QuickAccesses + */ + static public function getQuickAccesses($id_lang) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'quick_access` qa + LEFT JOIN `'._DB_PREFIX_.'quick_access_lang` qal ON (qa.`id_quick_access` = qal.`id_quick_access` AND qal.`id_lang` = '.(int)($id_lang).') + ORDER BY `name` ASC'); + } +} + diff --git a/classes/RangePrice.php b/classes/RangePrice.php new file mode 100644 index 000000000..aebf241f9 --- /dev/null +++ b/classes/RangePrice.php @@ -0,0 +1,71 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class RangePriceCore extends ObjectModel +{ + public $id_carrier; + public $delimiter1; + public $delimiter2; + + protected $fieldsRequired = array('id_carrier', 'delimiter1', 'delimiter2'); + protected $fieldsValidate = array('id_carrier' => 'isInt', 'delimiter1' => 'isUnsignedFloat', 'delimiter2' => 'isUnsignedFloat'); + + protected $table = 'range_price'; + protected $identifier = 'id_range_price'; + + protected $webserviceParameters = array( + 'objectsNodeName' => 'price_ranges', + 'objectNodeName' => 'price_range', + 'fields' => array( + 'id_carrier' => array('xlink_resource' => 'carriers'), + ) + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_carrier'] = (int)($this->id_carrier); + $fields['delimiter1'] = (float)($this->delimiter1); + $fields['delimiter2'] = (float)($this->delimiter2); + return $fields; + } + + /** + * Get all available price ranges + * + * @return array Ranges + */ + public static function getRanges($id_carrier) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'range_price` + WHERE `id_carrier` = '.(int)($id_carrier).' + ORDER BY `delimiter1` ASC'); + } +} + diff --git a/classes/RangeWeight.php b/classes/RangeWeight.php new file mode 100644 index 000000000..4c02e0dd3 --- /dev/null +++ b/classes/RangeWeight.php @@ -0,0 +1,71 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class RangeWeightCore extends ObjectModel +{ + public $id_carrier; + public $delimiter1; + public $delimiter2; + + protected $fieldsRequired = array('id_carrier', 'delimiter1', 'delimiter2'); + protected $fieldsValidate = array('id_carrier' => 'isInt', 'delimiter1' => 'isUnsignedFloat', 'delimiter2' => 'isUnsignedFloat'); + + protected $table = 'range_weight'; + protected $identifier = 'id_range_weight'; + + protected $webserviceParameters = array( + 'objectNodeName' => 'weight_range', + 'objectsNodeName' => 'weight_ranges', + 'fields' => array( + 'id_carrier' => array('xlink_resource' => 'carriers'), + ) + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_carrier'] = (int)($this->id_carrier); + $fields['delimiter1'] = (float)($this->delimiter1); + $fields['delimiter2'] = (float)($this->delimiter2); + return $fields; + } + + /** + * Get all available weight ranges + * + * @return array Ranges + */ + public static function getRanges($id_carrier) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'range_weight` + WHERE `id_carrier` = '.(int)($id_carrier).' + ORDER BY `delimiter1` ASC'); + } +} + diff --git a/classes/Referrer.php b/classes/Referrer.php new file mode 100644 index 000000000..c7bf50201 --- /dev/null +++ b/classes/Referrer.php @@ -0,0 +1,315 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ReferrerCore extends ObjectModel +{ + public $name; + public $passwd; + + public $http_referer_regexp; + public $http_referer_like; + public $request_uri_regexp; + public $request_uri_like; + public $http_referer_regexp_not; + public $http_referer_like_not; + public $request_uri_regexp_not; + public $request_uri_like_not; + + public $base_fee; + public $percent_fee; + public $click_fee; + + public $cache_visitors; + public $cache_visits; + public $cache_pages; + public $cache_registrations; + public $cache_orders; + public $cache_sales; + public $cache_reg_rate; + public $cache_order_rate; + + public $date_add; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 64, 'http_referer_regexp' => 64, 'request_uri_regexp' => 64, 'http_referer_like' => 64, 'request_uri_like' => 64, 'passwd' => 32); + protected $fieldsValidate = array( + 'name' => 'isGenericName', 'passwd' => 'isPasswd', + 'http_referer_regexp' => 'isCleanHtml', 'request_uri_regexp' => 'isCleanHtml', 'http_referer_like' => 'isCleanHtml', 'request_uri_like' => 'isCleanHtml', + 'http_referer_regexp_not' => 'isCleanHtml', 'request_uri_regexp_not' => 'isCleanHtml', 'http_referer_like_not' => 'isCleanHtml', 'request_uri_like_not' => 'isCleanHtml', + 'base_fee' => 'isFloat', 'percent_fee' => 'isFloat', 'click_fee' => 'isFloat', + 'cache_visitors' => 'isUnsignedInt', 'cache_visits' => 'isUnsignedInt', 'cache_pages' => 'isUnsignedInt', 'cache_registrations' => 'isUnsignedInt', + 'cache_orders' => 'isUnsignedInt', 'cache_sales' => 'isOptFloat', 'cache_reg_rate' => 'isOptFloat', 'cache_order_rate' => 'isOptFloat'); + + protected $table = 'referrer'; + protected $identifier = 'id_referrer'; + + protected static $_join = '(r.http_referer_like IS NULL OR r.http_referer_like = \'\' OR cs.http_referer LIKE r.http_referer_like) + AND (r.request_uri_like IS NULL OR r.request_uri_like = \'\' OR cs.request_uri LIKE r.request_uri_like) + AND (r.http_referer_like_not IS NULL OR r.http_referer_like_not = \'\' OR cs.http_referer NOT LIKE r.http_referer_like_not) + AND (r.request_uri_like_not IS NULL OR r.request_uri_like_not = \'\' OR cs.request_uri NOT LIKE r.request_uri_like_not) + AND (r.http_referer_regexp IS NULL OR r.http_referer_regexp = \'\' OR cs.http_referer REGEXP r.http_referer_regexp) + AND (r.request_uri_regexp IS NULL OR r.request_uri_regexp = \'\' OR cs.request_uri REGEXP r.request_uri_regexp) + AND (r.http_referer_regexp_not IS NULL OR r.http_referer_regexp_not = \'\' OR cs.http_referer NOT REGEXP r.http_referer_regexp_not) + AND (r.request_uri_regexp_not IS NULL OR r.request_uri_regexp_not = \'\' OR cs.request_uri NOT REGEXP r.request_uri_regexp_not)'; + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + $fields['passwd'] = pSQL($this->passwd); + $fields['http_referer_regexp'] = pSQL($this->http_referer_regexp, true); + $fields['request_uri_regexp'] = pSQL($this->request_uri_regexp, true); + $fields['http_referer_like'] = pSQL($this->http_referer_like, true); + $fields['request_uri_like'] = pSQL($this->request_uri_like, true); + $fields['http_referer_regexp_not'] = pSQL($this->http_referer_regexp_not, true); + $fields['request_uri_regexp_not'] = pSQL($this->request_uri_regexp_not, true); + $fields['http_referer_like_not'] = pSQL($this->http_referer_like_not, true); + $fields['request_uri_like_not'] = pSQL($this->request_uri_like_not, true); + $fields['base_fee'] = number_format($this->base_fee, 2, '.', ''); + $fields['percent_fee'] = number_format($this->percent_fee, 2, '.', ''); + $fields['click_fee'] = number_format($this->click_fee, 2, '.', ''); + $fields['cache_visitors'] = (int)($this->cache_visitors); + $fields['cache_visits'] = (int)($this->cache_visits); + $fields['cache_pages'] = (int)($this->cache_pages); + $fields['cache_registrations'] = (int)($this->cache_registrations); + $fields['cache_orders'] = (int)($this->cache_orders); + $fields['cache_sales'] = number_format($this->cache_sales, 2, '.', ''); + $fields['cache_reg_rate'] = $this->cache_reg_rate > 1 ? 1 : number_format((float)($this->cache_reg_rate), 4, '.', ''); + $fields['cache_order_rate'] = $this->cache_order_rate > 1 ? 1 : number_format((float)($this->cache_order_rate), 4, '.', ''); + $fields['date_add'] = pSQL($this->date_add); + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + if (!($result = parent::add($autodate, $nullValues))) + return false; + $this->refreshCache(array(array('id_referrer' => $this->id))); + $this->refreshIndex(array(array('id_referrer' => $this->id))); + return $result; + } + + public static function cacheNewSource($id_connections_source) + { + Db::getInstance()->Execute(' + INSERT INTO '._DB_PREFIX_.'referrer_cache (id_referrer, id_connections_source) ( + SELECT id_referrer, id_connections_source + FROM '._DB_PREFIX_.'referrer r + LEFT JOIN '._DB_PREFIX_.'connections_source cs ON ('.self::$_join.') + WHERE id_connections_source = '.(int)($id_connections_source).' + )'); + } + + public static function getReferrers($id_customer) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT c.date_add, r.name + FROM '._DB_PREFIX_.'guest g + LEFT JOIN '._DB_PREFIX_.'connections c ON c.id_guest = g.id_guest + LEFT JOIN '._DB_PREFIX_.'connections_source cs ON c.id_connections = cs.id_connections + LEFT JOIN '._DB_PREFIX_.'referrer r ON ('.self::$_join.') + WHERE g.id_customer = '.(int)($id_customer).' + AND r.name IS NOT NULL'); + } + + public function getStatsVisits($id_product = null, $employee = null) + { + list($join, $where) = array('',''); + if ((int)($id_product)) + { + $join = 'LEFT JOIN `'._DB_PREFIX_.'page` p ON cp.`id_page` = p.`id_page` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type`'; + $where = 'AND pt.`name` = \'product.php\' + AND p.`id_object` = '.(int)($id_product); + } + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(DISTINCT cs.id_connections_source) AS visits, + COUNT(DISTINCT cs.id_connections) as visitors, + COUNT(DISTINCT c.id_guest) as uniqs, + COUNT(DISTINCT cp.time_start) as pages + FROM '._DB_PREFIX_.'referrer_cache rc + LEFT JOIN '._DB_PREFIX_.'connections_source cs ON rc.id_connections_source = cs.id_connections_source + LEFT JOIN '._DB_PREFIX_.'connections c ON cs.id_connections = c.id_connections + LEFT JOIN '._DB_PREFIX_.'connections_page cp ON cp.id_connections = c.id_connections + '.$join.' + WHERE cs.date_add BETWEEN '.ModuleGraph::getDateBetween($employee).' + AND rc.id_referrer = '.(int)($this->id).' + '.$where); + } + + public function getRegistrations($id_product = null, $employee = null) + { + list($join, $where) = array('',''); + if ((int)($id_product)) + { + $join = 'LEFT JOIN '._DB_PREFIX_.'connections_page cp ON cp.id_connections = c.id_connections + LEFT JOIN `'._DB_PREFIX_.'page` p ON cp.`id_page` = p.`id_page` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type`'; + $where = 'AND pt.`name` = \'product.php\' + AND p.`id_object` = '.(int)($id_product); + } + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(DISTINCT cu.id_customer) AS registrations + FROM '._DB_PREFIX_.'referrer_cache rc + LEFT JOIN '._DB_PREFIX_.'connections_source cs ON rc.id_connections_source = cs.id_connections_source + LEFT JOIN '._DB_PREFIX_.'connections c ON cs.id_connections = c.id_connections + LEFT JOIN '._DB_PREFIX_.'guest g ON g.id_guest = c.id_guest + LEFT JOIN '._DB_PREFIX_.'customer cu ON cu.id_customer = g.id_customer + '.$join.' + WHERE cu.date_add BETWEEN '.ModuleGraph::getDateBetween($employee).' + AND cu.date_add > cs.date_add + AND rc.id_referrer = '.(int)($this->id).' + '.$where); + return $result['registrations']; + } + + public function getStatsSales($id_product = null, $employee = null) + { + list($join, $where) = array('',''); + if ((int)($id_product)) + { + $join = 'LEFT JOIN '._DB_PREFIX_.'order_detail od ON oo.id_order = od.id_order'; + $where = 'AND od.product_id = '.(int)($id_product); + } + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' + SELECT oo.id_order + FROM '._DB_PREFIX_.'referrer_cache rc + INNER JOIN '._DB_PREFIX_.'connections_source cs ON rc.id_connections_source = cs.id_connections_source + INNER JOIN '._DB_PREFIX_.'connections c ON cs.id_connections = c.id_connections + INNER JOIN '._DB_PREFIX_.'guest g ON g.id_guest = c.id_guest + LEFT JOIN '._DB_PREFIX_.'orders oo ON oo.id_customer = g.id_customer + '.$join.' + WHERE oo.invoice_date BETWEEN '.ModuleGraph::getDateBetween($employee).' + AND oo.date_add > cs.date_add + AND rc.id_referrer = '.(int)($this->id).' + AND oo.valid = 1 + '.$where); + + $implode = array(); + foreach ($result as $row) + if ((int)$row['id_order']) + $implode[] = (int)$row['id_order']; + + if ($implode) + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(o.id_order) AS orders, SUM(o.total_paid_real / o.conversion_rate) AS sales + FROM '._DB_PREFIX_.'orders o + WHERE o.id_order IN ('.implode($implode, ',').') + AND o.valid = 1'); + else + return array('orders' => 0, 'sales' => 0); + } + + public static function refreshCache($referrers = null, $employee = null) + { + if (!$referrers OR !is_array($referrers)) + $referrers = Db::getInstance()->ExecuteS('SELECT id_referrer FROM '._DB_PREFIX_.'referrer'); + foreach ($referrers as $row) + { + $referrer = new Referrer((int)($row['id_referrer'])); + $statsVisits = $referrer->getStatsVisits(null, $employee); + $referrer->cache_visitors = $statsVisits['uniqs']; + $referrer->cache_visits = $statsVisits['visits']; + $referrer->cache_pages = $statsVisits['pages']; + $registrations = $referrer->getRegistrations(null, $employee); + $referrer->cache_registrations = (int)($registrations); + $statsSales = $referrer->getStatsSales(null, $employee); + $referrer->cache_orders = (int)($statsSales['orders']); + $referrer->cache_sales = number_format($statsSales['sales'], 2, '.', ''); + $referrer->cache_reg_rate = $statsVisits['uniqs'] ? (int)($registrations) / $statsVisits['uniqs'] : 0; + $referrer->cache_order_rate = $statsVisits['uniqs'] ? (int)($statsSales['orders']) / $statsVisits['uniqs'] : 0; + if (!$referrer->update()) + Tools::dieObject(mysql_error()); + Configuration::updateValue('PS_REFERRERS_CACHE_LIKE', ModuleGraph::getDateBetween($employee)); + Configuration::updateValue('PS_REFERRERS_CACHE_DATE', date('Y-m-d H:i:s')); + } + return true; + } + + public static function refreshIndex($referrers = null) + { + if (!$referrers OR !is_array($referrers)) + { + Db::getInstance()->Execute('TRUNCATE '._DB_PREFIX_.'referrer_cache'); + Db::getInstance()->Execute(' + INSERT INTO '._DB_PREFIX_.'referrer_cache (id_referrer, id_connections_source) ( + SELECT id_referrer, id_connections_source + FROM '._DB_PREFIX_.'referrer r + LEFT JOIN '._DB_PREFIX_.'connections_source cs ON ('.self::$_join.') + )'); + } + else + foreach ($referrers as $row) + { + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'referrer_cache WHERE id_referrer = '.(int)($row['id_referrer'])); + Db::getInstance()->Execute(' + INSERT INTO '._DB_PREFIX_.'referrer_cache (id_referrer, id_connections_source) ( + SELECT id_referrer, id_connections_source + FROM '._DB_PREFIX_.'referrer r + LEFT JOIN '._DB_PREFIX_.'connections_source cs ON ('.self::$_join.') + WHERE id_referrer = '.(int)($row['id_referrer']).' + )'); + } + } + + public static function getAjaxProduct($id_referrer, $id_product, $employee = null) + { + $product = new Product($id_product, false, Configuration::get('PS_LANG_DEFAULT')); + $currency = Currency::getCurrencyInstance(Configuration::get('PS_CURRENCY_DEFAULT')); + $referrer = new Referrer($id_referrer); + $statsVisits = $referrer->getStatsVisits($id_product, $employee); + $registrations = $referrer->getRegistrations($id_product, $employee); + $statsSales = $referrer->getStatsSales($id_product, $employee); + + // If it's a product and it has no visits nor orders + if ((int)($id_product) AND !$statsVisits['visits'] AND !$statsSales['orders']) + exit; + + $jsonArray = array(); + $jsonArray[] = '"id_product":"'.(int)($product->id).'"'; + $jsonArray[] = '"product_name":"'.addslashes($product->name).'"'; + $jsonArray[] = '"uniqs":"'.(int)($statsVisits['uniqs']).'"'; + $jsonArray[] = '"visitors":"'.(int)($statsVisits['visitors']).'"'; + $jsonArray[] = '"visits":"'.(int)($statsVisits['visits']).'"'; + $jsonArray[] = '"pages":"'.(int)($statsVisits['pages']).'"'; + $jsonArray[] = '"registrations":"'.(int)($registrations).'"'; + $jsonArray[] = '"orders":"'.(int)($statsSales['orders']).'"'; + $jsonArray[] = '"sales":"'.Tools::displayPrice($statsSales['sales'], $currency).'"'; + $jsonArray[] = '"cart":"'.Tools::displayPrice(((int)($statsSales['orders']) ? $statsSales['sales'] / (int)($statsSales['orders']) : 0), $currency).'"'; + $jsonArray[] = '"reg_rate":"'.number_format((int)($statsVisits['uniqs']) ? (int)($registrations) / (int)($statsVisits['uniqs']) : 0, 4, '.', '').'"'; + $jsonArray[] = '"order_rate":"'.number_format((int)($statsVisits['uniqs']) ? (int)($statsSales['orders']) / (int)($statsVisits['uniqs']) : 0, 4, '.', '').'"'; + $jsonArray[] = '"click_fee":"'.Tools::displayPrice((int)($statsVisits['visits']) * $referrer->click_fee, $currency).'"'; + $jsonArray[] = '"base_fee":"'.Tools::displayPrice($statsSales['orders'] * $referrer->base_fee, $currency).'"'; + $jsonArray[] = '"percent_fee":"'.Tools::displayPrice($statsSales['sales'] * $referrer->percent_fee / 100, $currency).'"'; + die ('[{'.implode(',', $jsonArray).'}]'); + } +} + + diff --git a/classes/Rijndael.php b/classes/Rijndael.php new file mode 100644 index 000000000..427f978a2 --- /dev/null +++ b/classes/Rijndael.php @@ -0,0 +1,54 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class RijndaelCore +{ + protected $_key; + protected $_iv; + + public function __construct($key, $iv) + { + $this->_key = $key; + $this->_iv = base64_decode($iv); + } + + // Base64 is not required, but it is be more compact than urlencode + public function encrypt($plaintext) + { + if (($length = strlen($plaintext)) >= 1048576) + return false; + return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->_key, $plaintext, MCRYPT_MODE_ECB, $this->_iv)).sprintf('%06d', $length); + } + + public function decrypt($ciphertext) + { + $plainTextLength = intval(substr($ciphertext, -6)); + $ciphertext = substr($ciphertext, 0, -6); + return substr(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->_key, base64_decode($ciphertext), MCRYPT_MODE_ECB, $this->_iv), 0, $plainTextLength); + } +} + diff --git a/classes/Scene.php b/classes/Scene.php new file mode 100644 index 000000000..8a450c425 --- /dev/null +++ b/classes/Scene.php @@ -0,0 +1,258 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SceneCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + /** @var boolean Active Scene */ + public $active = true; + + /** @var array Zone for image map */ + public $zones = array(); + + /** @var array list of category where this scene is available */ + public $categories = array(); + + /** @var array Products */ + public $products; + + protected $table = 'scene'; + protected $identifier = 'id_scene'; + + protected $fieldsRequired = array('active'); + protected $fieldsValidate = array('active' => 'isBool', 'zones' => 'isSceneZones', 'categories' => 'isArrayWithIds'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 100); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + public function __construct($id = NULL, $id_lang = NULL, $liteResult = true, $hideScenePosition = false) + { + parent::__construct((int)($id), (int)($id_lang)); + + if (!$liteResult) + $this->products = $this->getProducts(true, (int)($id_lang), false); + if ($hideScenePosition) + $this->name = Scene::hideScenePosition($this->name); + $this->image_dir = _PS_SCENE_IMG_DIR_; + } + + public function getFields() + { + parent::validateFields(); + $fields['active'] = (int)($this->active); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + public function update($nullValues = false) + { + if (!$this->updateZoneProducts()) + return false; + if (!$this->updateCategories()) + return false; + return parent::update($nullValues); + } + + public function add($autodate = true, $nullValues = false) + { + if (!empty($this->zones)) + $this->addZoneProducts($this->zones); + if (!empty($this->categories)) + $this->addCategories($this->categories); + + return parent::add($autodate, $nullValues); + } + + public function delete() + { + $this->deleteZoneProducts(); + $this->deleteCategories(); + if (parent::delete()) + return $this->deleteImage(); + } + + public function deleteImage() + { + if (parent::deleteImage()) + { + if (file_exists($this->image_dir.'thumbs/'.$this->id.'-thumb_scene.'.$this->image_format) + && !unlink($this->image_dir.'thumbs/'.$this->id.'-thumb_scene.'.$this->image_format)) + return false; + } + else + return false; + return true; + } + + public function addCategories($categories) + { + $result = true; + foreach ($categories AS $category) + { + if (!Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'scene_category` ( `id_scene` , `id_category`) VALUES ('.(int)($this->id).', '.(int)($category).')')) + $result = false; + } + return $result; + } + + public function deleteCategories() + { + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'scene_category` + WHERE `id_scene` = '.(int)($this->id)); + } + + public function updateCategories() + { + if (!$this->deleteCategories()) + return false; + if (!empty($this->categories) AND !$this->addCategories($this->categories)) + return false; + return true; + } + + public function addZoneProducts($zones) + { + $result = true; + foreach ($zones AS $zone) + { + $sql = 'INSERT INTO `'._DB_PREFIX_.'scene_products` ( `id_scene` , `id_product` , `x_axis` , `y_axis` , `zone_width` , `zone_height`) VALUES + ('.(int)($this->id).', '.(int)($zone['id_product']).', '.(int)($zone['x1']).', '.(int)($zone['y1']).', '.(int)($zone['width']).', '.(int)($zone['height']).')'; + if (!Db::getInstance()->Execute($sql)) + $result = false; + } + return $result; + } + + public function deleteZoneProducts() + { + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'scene_products` + WHERE `id_scene` = '.(int)($this->id)); + } + + public function updateZoneProducts() + { + if (!$this->deleteZoneProducts()) + return false; + if ($this->zones AND !$this->addZoneProducts($this->zones)) + return false; + return true; + } + + /** + * Get all scenes of a category + * + * @return array Products + */ + static public function getScenes($id_category, $id_lang = NULL, $onlyActive = true, $liteResult = true, $hideScenePosition = true) + { + $id_lang = is_null($id_lang) ? _USER_ID_LANG_ : (int)($id_lang); + + $scenes = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT s.* + FROM `'._DB_PREFIX_.'scene_category` sc + LEFT JOIN `'._DB_PREFIX_.'scene` s ON (sc.id_scene = s.id_scene) + LEFT JOIN `'._DB_PREFIX_.'scene_lang` sl ON (sl.id_scene = s.id_scene) + WHERE sc.id_category = '.(int)($id_category).' AND sl.id_lang = '.(int)($id_lang).($onlyActive ? ' AND s.active = 1' : '').' + ORDER BY sl.name ASC'); + + if (!$liteResult AND $scenes) + foreach($scenes AS &$scene) + $scene = new Scene((int)($scene['id_scene']), (int)($id_lang), false, $hideScenePosition); + return $scenes; + } + + /** + * Get all products of this scene + * + * @return array Products + */ + public function getProducts($onlyActive = true, $id_lang = NULL, $liteResult = true) + { + global $link; + + $id_lang = is_null($id_lang) ? _USER_ID_LANG_ : (int)($id_lang); + + $products = Db::getInstance()->ExecuteS(' + SELECT s.* + FROM `'._DB_PREFIX_.'scene_products` s + LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = s.id_product) + WHERE s.id_scene = '.(int)($this->id).($onlyActive ? ' AND p.active = 1' : '')); + + if (!$liteResult AND $products) + foreach ($products AS &$product) + { + $product['details'] = new Product((int)($product['id_product']), !$liteResult, (int)($id_lang)); + $product['link'] = $link->getProductLink((int)($product['details']->id), $product['details']->link_rewrite, $product['details']->category, $product['details']->ean13); + $cover = Product::getCover((int)($product['details']->id)); + if(is_array($cover)) + $product = array_merge($cover, $product); + } + + return $products; + } + + /** + * Get categories where scene is indexed + * + * @param integer $id_scene Scene id + * @return array Categories where scene is indexed + */ + static public function getIndexedCategories($id_scene) + { + return Db::getInstance()->ExecuteS(' + SELECT `id_category` + FROM `'._DB_PREFIX_.'scene_category` + WHERE `id_scene` = '.(int)($id_scene)); + } + + /** + * Hide scene prefix used for position + * + * @param string $name Scene name + * @return string Name without position + */ + static public function hideScenePosition($name) + { + return preg_replace('/^[0-9]+\./', '', $name); + } +} + + diff --git a/classes/Search.php b/classes/Search.php new file mode 100644 index 000000000..1321fcb9a --- /dev/null +++ b/classes/Search.php @@ -0,0 +1,595 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7489 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('PS_SEARCH_MAX_WORD_LENGTH', 15); + +/* Copied from Drupal search module, except for \x{0}-\x{2f} that has been replaced by \x{0}-\x{2c}\x{2e}-\x{2f} in order to keep the char '-' */ +define('PREG_CLASS_SEARCH_EXCLUDE', +'\x{0}-\x{2c}\x{2e}-\x{2f}\x{3a}-\x{40}\x{5b}-\x{60}\x{7b}-\x{bf}\x{d7}\x{f7}\x{2b0}-'. +'\x{385}\x{387}\x{3f6}\x{482}-\x{489}\x{559}-\x{55f}\x{589}-\x{5c7}\x{5f3}-'. +'\x{61f}\x{640}\x{64b}-\x{65e}\x{66a}-\x{66d}\x{670}\x{6d4}\x{6d6}-\x{6ed}'. +'\x{6fd}\x{6fe}\x{700}-\x{70f}\x{711}\x{730}-\x{74a}\x{7a6}-\x{7b0}\x{901}-'. +'\x{903}\x{93c}\x{93e}-\x{94d}\x{951}-\x{954}\x{962}-\x{965}\x{970}\x{981}-'. +'\x{983}\x{9bc}\x{9be}-\x{9cd}\x{9d7}\x{9e2}\x{9e3}\x{9f2}-\x{a03}\x{a3c}-'. +'\x{a4d}\x{a70}\x{a71}\x{a81}-\x{a83}\x{abc}\x{abe}-\x{acd}\x{ae2}\x{ae3}'. +'\x{af1}-\x{b03}\x{b3c}\x{b3e}-\x{b57}\x{b70}\x{b82}\x{bbe}-\x{bd7}\x{bf0}-'. +'\x{c03}\x{c3e}-\x{c56}\x{c82}\x{c83}\x{cbc}\x{cbe}-\x{cd6}\x{d02}\x{d03}'. +'\x{d3e}-\x{d57}\x{d82}\x{d83}\x{dca}-\x{df4}\x{e31}\x{e34}-\x{e3f}\x{e46}-'. +'\x{e4f}\x{e5a}\x{e5b}\x{eb1}\x{eb4}-\x{ebc}\x{ec6}-\x{ecd}\x{f01}-\x{f1f}'. +'\x{f2a}-\x{f3f}\x{f71}-\x{f87}\x{f90}-\x{fd1}\x{102c}-\x{1039}\x{104a}-'. +'\x{104f}\x{1056}-\x{1059}\x{10fb}\x{10fc}\x{135f}-\x{137c}\x{1390}-\x{1399}'. +'\x{166d}\x{166e}\x{1680}\x{169b}\x{169c}\x{16eb}-\x{16f0}\x{1712}-\x{1714}'. +'\x{1732}-\x{1736}\x{1752}\x{1753}\x{1772}\x{1773}\x{17b4}-\x{17db}\x{17dd}'. +'\x{17f0}-\x{180e}\x{1843}\x{18a9}\x{1920}-\x{1945}\x{19b0}-\x{19c0}\x{19c8}'. +'\x{19c9}\x{19de}-\x{19ff}\x{1a17}-\x{1a1f}\x{1d2c}-\x{1d61}\x{1d78}\x{1d9b}-'. +'\x{1dc3}\x{1fbd}\x{1fbf}-\x{1fc1}\x{1fcd}-\x{1fcf}\x{1fdd}-\x{1fdf}\x{1fed}-'. +'\x{1fef}\x{1ffd}-\x{2070}\x{2074}-\x{207e}\x{2080}-\x{2101}\x{2103}-\x{2106}'. +'\x{2108}\x{2109}\x{2114}\x{2116}-\x{2118}\x{211e}-\x{2123}\x{2125}\x{2127}'. +'\x{2129}\x{212e}\x{2132}\x{213a}\x{213b}\x{2140}-\x{2144}\x{214a}-\x{2b13}'. +'\x{2ce5}-\x{2cff}\x{2d6f}\x{2e00}-\x{3005}\x{3007}-\x{303b}\x{303d}-\x{303f}'. +'\x{3099}-\x{309e}\x{30a0}\x{30fb}\x{30fd}\x{30fe}\x{3190}-\x{319f}\x{31c0}-'. +'\x{31cf}\x{3200}-\x{33ff}\x{4dc0}-\x{4dff}\x{a015}\x{a490}-\x{a716}\x{a802}'. +'\x{a806}\x{a80b}\x{a823}-\x{a82b}\x{d800}-\x{f8ff}\x{fb1e}\x{fb29}\x{fd3e}'. +'\x{fd3f}\x{fdfc}-\x{fe6b}\x{feff}-\x{ff0f}\x{ff1a}-\x{ff20}\x{ff3b}-\x{ff40}'. +'\x{ff5b}-\x{ff65}\x{ff70}\x{ff9e}\x{ff9f}\x{ffe0}-\x{fffd}'); + +define('PREG_CLASS_NUMBERS', +'\x{30}-\x{39}\x{b2}\x{b3}\x{b9}\x{bc}-\x{be}\x{660}-\x{669}\x{6f0}-\x{6f9}'. +'\x{966}-\x{96f}\x{9e6}-\x{9ef}\x{9f4}-\x{9f9}\x{a66}-\x{a6f}\x{ae6}-\x{aef}'. +'\x{b66}-\x{b6f}\x{be7}-\x{bf2}\x{c66}-\x{c6f}\x{ce6}-\x{cef}\x{d66}-\x{d6f}'. +'\x{e50}-\x{e59}\x{ed0}-\x{ed9}\x{f20}-\x{f33}\x{1040}-\x{1049}\x{1369}-'. +'\x{137c}\x{16ee}-\x{16f0}\x{17e0}-\x{17e9}\x{17f0}-\x{17f9}\x{1810}-\x{1819}'. +'\x{1946}-\x{194f}\x{2070}\x{2074}-\x{2079}\x{2080}-\x{2089}\x{2153}-\x{2183}'. +'\x{2460}-\x{249b}\x{24ea}-\x{24ff}\x{2776}-\x{2793}\x{3007}\x{3021}-\x{3029}'. +'\x{3038}-\x{303a}\x{3192}-\x{3195}\x{3220}-\x{3229}\x{3251}-\x{325f}\x{3280}-'. +'\x{3289}\x{32b1}-\x{32bf}\x{ff10}-\x{ff19}'); + +define('PREG_CLASS_PUNCTUATION', +'\x{21}-\x{23}\x{25}-\x{2a}\x{2c}-\x{2f}\x{3a}\x{3b}\x{3f}\x{40}\x{5b}-\x{5d}'. +'\x{5f}\x{7b}\x{7d}\x{a1}\x{ab}\x{b7}\x{bb}\x{bf}\x{37e}\x{387}\x{55a}-\x{55f}'. +'\x{589}\x{58a}\x{5be}\x{5c0}\x{5c3}\x{5f3}\x{5f4}\x{60c}\x{60d}\x{61b}\x{61f}'. +'\x{66a}-\x{66d}\x{6d4}\x{700}-\x{70d}\x{964}\x{965}\x{970}\x{df4}\x{e4f}'. +'\x{e5a}\x{e5b}\x{f04}-\x{f12}\x{f3a}-\x{f3d}\x{f85}\x{104a}-\x{104f}\x{10fb}'. +'\x{1361}-\x{1368}\x{166d}\x{166e}\x{169b}\x{169c}\x{16eb}-\x{16ed}\x{1735}'. +'\x{1736}\x{17d4}-\x{17d6}\x{17d8}-\x{17da}\x{1800}-\x{180a}\x{1944}\x{1945}'. +'\x{2010}-\x{2027}\x{2030}-\x{2043}\x{2045}-\x{2051}\x{2053}\x{2054}\x{2057}'. +'\x{207d}\x{207e}\x{208d}\x{208e}\x{2329}\x{232a}\x{23b4}-\x{23b6}\x{2768}-'. +'\x{2775}\x{27e6}-\x{27eb}\x{2983}-\x{2998}\x{29d8}-\x{29db}\x{29fc}\x{29fd}'. +'\x{3001}-\x{3003}\x{3008}-\x{3011}\x{3014}-\x{301f}\x{3030}\x{303d}\x{30a0}'. +'\x{30fb}\x{fd3e}\x{fd3f}\x{fe30}-\x{fe52}\x{fe54}-\x{fe61}\x{fe63}\x{fe68}'. +'\x{fe6a}\x{fe6b}\x{ff01}-\x{ff03}\x{ff05}-\x{ff0a}\x{ff0c}-\x{ff0f}\x{ff1a}'. +'\x{ff1b}\x{ff1f}\x{ff20}\x{ff3b}-\x{ff3d}\x{ff3f}\x{ff5b}\x{ff5d}\x{ff5f}-'. +'\x{ff65}'); + +/** + * Matches all CJK characters that are candidates for auto-splitting + * (Chinese, Japanese, Korean). + * Contains kana and BMP ideographs. + */ +define('PREG_CLASS_CJK', '\x{3041}-\x{30ff}\x{31f0}-\x{31ff}\x{3400}-\x{4db5}\x{4e00}-\x{9fbb}\x{f900}-\x{fad9}'); + +class SearchCore +{ + public static function sanitize($string, $id_lang, $indexation = false) + { + $string = Tools::strtolower(strip_tags($string)); + $string = html_entity_decode($string, ENT_NOQUOTES, 'utf-8'); + + $string = preg_replace('/(['.PREG_CLASS_NUMBERS.']+)['.PREG_CLASS_PUNCTUATION.']+(?=['.PREG_CLASS_NUMBERS.'])/u', '\1', $string); + $string = preg_replace('/['.PREG_CLASS_SEARCH_EXCLUDE.']+/u', ' ', $string); + + if ($indexation) + $string = preg_replace('/[._-]+/', '', $string); + else + { + $string = preg_replace('/[._]+/', '', $string); + $string = ltrim(preg_replace('/([^ ])-/', '$1', ' '.$string)); + $string = preg_replace('/[._]+/', '', $string); + $string = preg_replace('/[^\s]-+/', '', $string); + } + + $blacklist = Configuration::get('PS_SEARCH_BLACKLIST', $id_lang); + if (!empty($blacklist)) + { + $string = preg_replace('/(?<=\s)('.$blacklist.')(?=\s)/Su', '', $string); + $string = preg_replace('/^('.$blacklist.')(?=\s)/Su', '', $string); + $string = preg_replace('/(?<=\s)('.$blacklist.')$/Su', '', $string); + $string = preg_replace('/^('.$blacklist.')$/Su', '', $string); + } + + if (!$indexation) + { + $alias = new Alias(NULL, $string); + if (Validate::isLoadedObject($alias)) + $string = $alias->search; + } + + if ($indexation) + { + $minWordLen = (int)Configuration::get('PS_SEARCH_MINWORDLEN'); + if ($minWordLen > 1) + { + $minWordLen -= 1; + $string = preg_replace('/(?<=\s)[^\s]{1,'.$minWordLen.'}(?=\s)/Su', ' ', $string); + $string = preg_replace('/^[^\s]{1,'.$minWordLen.'}(?=\s)/Su', '', $string); + $string = preg_replace('/(?<=\s)[^\s]{1,'.$minWordLen.'}$/Su', '', $string); + $string = preg_replace('/^[^\s]{1,'.$minWordLen.'}$/Su', '', $string); + } + } + + $string = trim(preg_replace('/\s+/', ' ', $string)); + return $string; + } + + public static function find($id_lang, $expr, $pageNumber = 1, $pageSize = 1, $orderBy = 'position', $orderWay = 'desc', $ajax = false, $useCookie = true, $id_shop = false) + { + global $cookie; + $db = Db::getInstance(_PS_USE_SQL_SLAVE_); + + // Only use cookie if id_customer is not present + if ($useCookie) + $id_customer = $cookie->id_customer; + else + $id_customer = 0; + + if (!$id_shop) + $id_shop = Shop::getCurrentShop(); + + // TODO : smart page management + if ($pageNumber < 1) $pageNumber = 1; + if ($pageSize < 1) $pageSize = 1; + + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + return false; + + $intersectArray = array(); + $scoreArray = array(); + $words = explode(' ', Search::sanitize($expr, $id_lang)); + + foreach ($words AS $key => $word) + if (!empty($word) AND strlen($word) >= (int)Configuration::get('PS_SEARCH_MINWORDLEN')) + { + $word = str_replace('%', '\\%', $word); + $word = str_replace('_', '\\_', $word); + $intersectArray[] = 'SELECT si.id_product + FROM '._DB_PREFIX_.'search_word sw + LEFT JOIN '._DB_PREFIX_.'search_index si ON sw.id_word = si.id_word + WHERE sw.id_lang = '.(int)$id_lang.' + AND sw.id_shop = '.(int)$id_shop.' + AND sw.word LIKE + '.($word[0] == '-' + ? ' \''.pSQL(Tools::substr($word, 1, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' + : '\''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\'' + ); + + if ($word[0] != '-') + $scoreArray[] = 'sw.word LIKE \''.pSQL(Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH)).'%\''; + } + else + unset($words[$key]); + + if (!sizeof($words)) + return ($ajax ? array() : array('total' => 0, 'result' => array())); + + $score = ''; + if (sizeof($scoreArray)) + $score = ',( + SELECT SUM(weight) + FROM '._DB_PREFIX_.'search_word sw + LEFT JOIN '._DB_PREFIX_.'search_index si ON sw.id_word = si.id_word + WHERE sw.id_lang = '.(int)$id_lang.' + AND sw.id_shop = '.(int)$id_shop.' + AND si.id_product = p.id_product + AND ('.implode(' OR ', $scoreArray).') + ) position'; + + $result = $db->ExecuteS(' + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + INNER JOIN `'._DB_PREFIX_.'category_product` cp ON cp.`id_category` = cg.`id_category` + INNER JOIN `'._DB_PREFIX_.'category` c ON cp.`id_category` = c.`id_category` + INNER JOIN `'._DB_PREFIX_.'product` p ON cp.`id_product` = p.`id_product` + INNER JOIN `'._DB_PREFIX_.'product_shop` ps ON (p.id_product = ps.id_product) + WHERE c.`active` = 1 AND p.`active` = 1 AND indexed = 1 AND ps.id_shop='.(int)$id_shop.' + AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN ( + SELECT id_group FROM '._DB_PREFIX_.'customer_group + WHERE id_customer = '.(int)$id_customer.' + )'), false); + + $eligibleProducts = array(); + while ($row = $db->nextRow($result)) + $eligibleProducts[] = $row['id_product']; + foreach ($intersectArray as $query) + { + $result = $db->ExecuteS($query, false); + $eligibleProducts2 = array(); + while ($row = $db->nextRow($result)) + $eligibleProducts2[] = $row['id_product']; + + $eligibleProducts = array_intersect($eligibleProducts, $eligibleProducts2); + if (!count($eligibleProducts)) + return ($ajax ? array() : array('total' => 0, 'result' => array())); + } + array_unique($eligibleProducts); + + $productPool = ''; + foreach ($eligibleProducts AS $id_product) + if ($id_product) + $productPool .= (int)$id_product.','; + if (empty($productPool)) + return ($ajax ? array() : array('total' => 0, 'result' => array())); + $productPool = ((strpos($productPool, ',') === false) ? (' = '.(int)$productPool.' ') : (' IN ('.rtrim($productPool, ',').') ')); + + if ($ajax) + { + return $db->ExecuteS(' + SELECT DISTINCT p.id_product, pl.name pname, cl.name cname, + cl.link_rewrite crewrite, pl.link_rewrite prewrite '.$score.' + FROM '._DB_PREFIX_.'product p + INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.' AND pl.id_shop='.(int)$id_shop.') + INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.' AND cl.id_shop='.(int)$id_shop.') + WHERE p.`id_product` '.$productPool.' + ORDER BY position DESC LIMIT 10'); + } + + $queryResults = ' + SELECT p.*, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`, + tax.`rate`, i.`id_image`, il.`legend`, m.`name` manufacturer_name '.$score.', DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 new + FROM '._DB_PREFIX_.'product p + INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.' AND pl.id_shop='.(int)$id_shop.') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + WHERE p.`id_product` '.$productPool.' + '.($orderBy ? 'ORDER BY '.$orderBy : '').($orderWay ? ' '.$orderWay : '').' + LIMIT '.(int)(($pageNumber - 1) * $pageSize).','.(int)$pageSize; + + $result = $db->ExecuteS($queryResults); + $total = $db->getValue('SELECT COUNT(*) + FROM '._DB_PREFIX_.'product p + INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.' AND pl.id_shop='.(int)$id_shop.') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + WHERE p.`id_product` '.$productPool); + + if (!$result) + $resultProperties = false; + else + $resultProperties = Product::getProductsProperties((int)$id_lang, $result); + + return array('total' => $total,'result' => $resultProperties); + } + + public static function getTags($db, $id_product, $id_lang) + { + $tags = ''; + $tagsArray = $db->ExecuteS(' + SELECT t.name FROM '._DB_PREFIX_.'product_tag pt + LEFT JOIN '._DB_PREFIX_.'tag t ON (pt.id_tag = t.id_tag AND t.id_lang = '.(int)$id_lang.') + WHERE pt.id_product = '.(int)$id_product); + foreach ($tagsArray AS $tag) + $tags .= $tag['name'].' '; + return $tags; + } + + public static function getAttributes($db, $id_product, $id_lang) + { + $attributes = ''; + $attributesArray = $db->ExecuteS(' + SELECT al.name FROM '._DB_PREFIX_.'product_attribute pa + INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute + INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang = '.(int)$id_lang.') + WHERE pa.id_product = '.(int)$id_product); + foreach ($attributesArray AS $attribute) + $attributes .= $attribute['name'].' '; + return $attributes; + } + + public static function getFeatures($db, $id_product, $id_lang) + { + $features = ''; + $featuresArray = $db->ExecuteS(' + SELECT fvl.value FROM '._DB_PREFIX_.'feature_product fp + LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fp.id_feature_value = fvl.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') + WHERE fp.id_product = '.(int)$id_product); + foreach ($featuresArray AS $feature) + $features .= $feature['value'].' '; + return $features; + } + + public static function indexation($full = false) + { + $db = Db::getInstance(); + $dropIndex = false; + + if ($full) + { + $db->Execute('TRUNCATE '._DB_PREFIX_.'search_index'); + $db->Execute('TRUNCATE '._DB_PREFIX_.'search_word'); + $db->Execute('UPDATE '._DB_PREFIX_.'product SET indexed = 0'); + $dropIndex = true; + } + else + { + $products = $db->ExecuteS('SELECT id_product FROM '._DB_PREFIX_.'product WHERE indexed = 0'); + + $ids = array(); + if ($products) + foreach($products AS $product) + $ids[] = (int)$product['id_product']; + if (sizeof($ids)) + $db->Execute('DELETE FROM '._DB_PREFIX_.'search_index WHERE id_product IN ('.implode(',', $ids).')'); + + + if (count($products) > 2000) + $dropIndex = true; + } + + if ($dropIndex) + { + $dropIndex = false; + $result = $db->ExecuteS('SHOW INDEX FROM `'._DB_PREFIX_.'search_index`'); + foreach ($result as $row) + if (strtolower($row['Key_name']) == 'primary') + $dropIndex = true; + if ($dropIndex) + $db->Execute('ALTER TABLE '._DB_PREFIX_.'search_index DROP PRIMARY KEY'); + $dropIndex = true; + } + + // Every fields are weighted according to the configuration in the backend + $weightArray = array( + 'pname' => Configuration::get('PS_SEARCH_WEIGHT_PNAME'), + 'reference' => Configuration::get('PS_SEARCH_WEIGHT_REF'), + 'ean13' => Configuration::get('PS_SEARCH_WEIGHT_REF'), + 'upc' => Configuration::get('PS_SEARCH_WEIGHT_REF'), + 'description_short' => Configuration::get('PS_SEARCH_WEIGHT_SHORTDESC'), + 'description' => Configuration::get('PS_SEARCH_WEIGHT_DESC'), + 'cname' => Configuration::get('PS_SEARCH_WEIGHT_CNAME'), + 'mname' => Configuration::get('PS_SEARCH_WEIGHT_MNAME'), + 'tags' => Configuration::get('PS_SEARCH_WEIGHT_TAG'), + 'attributes' => Configuration::get('PS_SEARCH_WEIGHT_ATTRIBUTE'), + 'features' => Configuration::get('PS_SEARCH_WEIGHT_FEATURE') + ); + + // All the product not yet indexed are retrieved + $products = $db->ExecuteS(' + SELECT p.id_product, pl.id_lang, pl.name pname, p.reference, p.ean13, p.upc, pl.description_short, pl.description, cl.name cname, m.name mname, pl.id_shop + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = p.id_category_default AND pl.id_lang = cl.id_lang AND pl.id_shop = cl.id_shop) + LEFT JOIN '._DB_PREFIX_.'manufacturer m ON m.id_manufacturer = p.id_manufacturer + WHERE p.indexed = 0', false); + + // Those are kind of global variables required to save the processed data in the database every X occurences, in order to avoid overloading MySQL + $countWords = 0; + $countProducts = 0; + $queryArray3 = array(); + $productsArray = array(); + + // Every indexed words are cached into a PHP array + $wordIdsByWord = array(); + $wordIds = Db::getInstance()->ExecuteS(' + SELECT sw.id_word, sw.word, id_lang, id_shop + FROM '._DB_PREFIX_.'search_word sw', false); + $wordIdsByWord = array(); + while ($wordId = $db->nextRow($wordIds)) + { + if (!isset($wordIdsByWord[$wordId['id_shop']][$wordId['id_lang']])) + $wordIdsByWord[$wordId['id_shop']][$wordId['id_lang']] = array(); + $wordIdsByWord[$wordId['id_shop']][$wordId['id_lang']]['_'.$wordId['word']] = (int)$wordId['id_word']; + } + + // Now each non-indexed product is processed one by one, langage by langage + while ($product = $db->nextRow($products)) + { + $product['tags'] = Search::getTags($db, (int)$product['id_product'], (int)$product['id_lang']); + $product['attributes'] = Search::getAttributes($db, (int)$product['id_product'], (int)$product['id_lang']); + $product['features'] = Search::getFeatures($db, (int)$product['id_product'], (int)$product['id_lang']); + + // Data must be cleaned of html, bad characters, spaces and anything, then if the resulting words are long enough, they're added to the array + $pArray = array(); + foreach ($product AS $key => $value) + if (strncmp($key, 'id_', 3)) + { + $words = explode(' ', Search::sanitize($value, (int)$product['id_lang'], true)); + foreach ($words AS $word) + if (!empty($word)) + { + $word = Tools::substr($word, 0, PS_SEARCH_MAX_WORD_LENGTH); + if (!isset($pArray[$word])) + $pArray[$word] = 0; + $pArray[$word] += $weightArray[$key]; + } + } + + // If we find words that need to be indexed, they're added to the word table in the database + if (sizeof($pArray)) + { + $list = ''; + foreach ($pArray AS $word => $weight) + $list .= '\''.$word.'\','; + $list = rtrim($list, ','); + + $queryArray = array(); + $queryArray2 = array(); + foreach ($pArray AS $word => $weight) + if ($weight AND !isset($wordIdsByWord['_'.$word])) + { + $queryArray[] = '('.(int)$product['id_lang'].', '.(int)$product['id_shop'].', \''.pSQL($word).'\')'; + $queryArray2[] = '\''.pSQL($word).'\''; + $wordIdsByWord[$product['id_shop']][$product['id_lang']]['_'.$word] = 0; + } + + if (count($queryArray)) + { + // The words are inserted... + $db->Execute(' + INSERT IGNORE INTO '._DB_PREFIX_.'search_word (id_lang, id_shop, word) + VALUES '.implode(',',$queryArray)); + + // ...then their IDs are retrieved and added to the cache + $addedWords = $db->ExecuteS(' + SELECT sw.id_word, sw.word + FROM '._DB_PREFIX_.'search_word sw + WHERE sw.word IN ('.implode(',', $queryArray2).') + AND sw.id_lang = '.(int)$product['id_lang'].' + AND sw.id_shop = '.(int)$product['id_shop'].' + LIMIT '.count($queryArray2)); + foreach ($addedWords AS $wordId) + $wordIdsByWord[$product['id_shop']][$product['id_lang']]['_'.$wordId['word']] = (int)$wordId['id_word']; + } + } + + foreach ($pArray AS $word => $weight) + { + if (!$weight) + continue; + if (!isset($wordIdsByWord[$product['id_shop']][$product['id_lang']]['_'.$word])) + continue; + if (!$wordIdsByWord[$product['id_shop']][$product['id_lang']]['_'.$word]) + continue; + $queryArray3[] = '('.(int)$product['id_product'].','.(int)$wordIdsByWord[$product['id_shop']][$product['id_lang']]['_'.$word].','.(int)$weight.')'; + // Force save every 200 words in order to avoid overloading MySQL + if (++$countWords % 200 == 0) + Search::saveIndex($queryArray3); + } + + if (!in_array($product['id_product'], $productsArray)) + $productsArray[] = (int)$product['id_product']; + + // Force save every 50 products in order to avoid overloading MySQL + if (++$countProducts % 50 == 0) + Search::setProductsAsIndexed($productsArray); + } + + // One last save is done at the end in order to save what's left + Search::saveIndex($queryArray3); + Search::setProductsAsIndexed($productsArray); + + // If it has been deleted, the index is created again once the indexation is done + if (!$dropIndex) + { + $dropIndex = true; + $result = $db->ExecuteS('SHOW INDEX FROM `'._DB_PREFIX_.'search_index`'); + foreach ($result as $row) + if (strtolower($row['Key_name']) == 'primary') + $dropIndex = false; + } + if ($dropIndex) + $db->Execute('ALTER TABLE `'._DB_PREFIX_.'search_index` ADD PRIMARY KEY (`id_word`, `id_product`)'); + + Configuration::updateValue('PS_NEED_REBUILD_INDEX', 0); + return true; + } + + protected static function setProductsAsIndexed(&$products) + { + if (count($products)) + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET indexed = 1 WHERE id_product IN ('.implode(',', $products).') LIMIT '.(int)count($products)); + $productsArray = array(); + } + + // $queryArray3 is automatically emptied in order to be reused immediatly + protected static function saveIndex(&$queryArray3) + { + if (count($queryArray3)) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'search_index (id_product, id_word, weight) VALUES '.implode(',', $queryArray3).' ON DUPLICATE KEY UPDATE weight = weight + VALUES(weight)'); + $queryArray3 = array(); + } + + public static function searchTag($id_lang, $tag, $count = false, $pageNumber = 0, $pageSize = 10, $orderBy = false, $orderWay = false, $useCookie = true) + { + global $link, $cookie; + + // Only use cookie if id_customer is not present + if ($useCookie) + $id_customer = (int)$cookie->id_customer; + else + $id_customer = 0; + + if (!is_numeric($pageNumber) OR !is_numeric($pageSize) OR !Validate::isBool($count) OR !Validate::isValidSearch($tag) + OR $orderBy AND !$orderWay OR ($orderBy AND !Validate::isOrderBy($orderBy)) OR ($orderWay AND !Validate::isOrderBy($orderWay))) + return false; + + if ($pageNumber < 1) $pageNumber = 1; + if ($pageSize < 1) $pageSize = 10; + + if ($count) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(DISTINCT pt.`id_product`) nb + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_tag` pt ON (p.`id_product` = pt.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'tag` t ON (pt.`id_tag` = t.`id_tag` AND t.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = p.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`) + WHERE p.`active` = 1 + AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN ( + SELECT id_group FROM '._DB_PREFIX_.'customer_group + WHERE id_customer = '.(int)$id_customer.')').' + AND t.`name` LIKE \'%'.pSQL($tag).'%\''); + return isset($result['nb']) ? $result['nb'] : 0; + } + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT p.*, pl.`description_short`, pl.`link_rewrite`, pl.`name`, tax.`rate`, i.`id_image`, il.`legend`, m.`name` manufacturer_name, 1 position, + DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 new + FROM `'._DB_PREFIX_.'product` p + INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) + LEFT JOIN `'._DB_PREFIX_.'product_tag` pt ON (p.`id_product` = pt.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'tag` t ON (pt.`id_tag` = t.`id_tag` AND t.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = p.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`) + WHERE p.`active` = 1 + AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN ( + SELECT id_group FROM '._DB_PREFIX_.'customer_group + WHERE id_customer = '.(int)$id_customer.')').' + AND t.`name` LIKE \'%'.pSQL($tag).'%\' + ORDER BY position DESC'.($orderBy ? ', '.$orderBy : '').($orderWay ? ' '.$orderWay : '').' + LIMIT '.(int)(($pageNumber - 1) * $pageSize).','.(int)$pageSize); + if (!$result) return false; + + return Product::getProductsProperties((int)$id_lang, $result); + } +} diff --git a/classes/SearchEngine.php b/classes/SearchEngine.php new file mode 100644 index 000000000..c86e5a71c --- /dev/null +++ b/classes/SearchEngine.php @@ -0,0 +1,72 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SearchEngineCore extends ObjectModel +{ + public $server; + public $getvar; + + protected $fieldsRequired = array ('server', 'getvar'); + protected $fieldsValidate = array ('server' => 'isUrl', 'getvar' => 'isModuleName'); + + protected $table = 'search_engine'; + protected $identifier = 'id_search_engine'; + + public function getFields() + { + parent::validateFields(); + $fields['server'] = pSQL($this->server); + $fields['getvar'] = pSQL($this->getvar); + return $fields; + } + + public static function getKeywords($url) + { + $parsedUrl = @parse_url($url); + if (!isset($parsedUrl['host']) OR !isset($parsedUrl['query'])) + return false; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `server`, `getvar` FROM `'._DB_PREFIX_.'search_engine`'); + foreach ($result as $index => $row) + { + $host =& $row['server']; + $varname =& $row['getvar']; + if (strstr($parsedUrl['host'], $host)) + { + $kArray = array(); + preg_match('/[^a-z]'.$varname.'=.+\&'.'/U', $parsedUrl['query'], $kArray); + if (empty($kArray[0])) + preg_match('/[^a-z]'.$varname.'=.+$'.'/', $parsedUrl['query'], $kArray); + if (empty($kArray[0])) + return false; + $kString = urldecode(str_replace('+', ' ', ltrim(substr(rtrim($kArray[0], '&'), strlen($varname) + 1), '='))); + return $kString; + } + } + } +} + + diff --git a/classes/Shop.php b/classes/Shop.php new file mode 100644 index 000000000..9a893425b --- /dev/null +++ b/classes/Shop.php @@ -0,0 +1,588 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7521 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * @since 1.5.0 + */ +class ShopCore extends ObjectModel +{ + public $id_group_shop; + public $id_theme; + public $name; + public $active; + public $id_category; + public $deleted; + + private static $current_base_uri; + private static $current_theme_name; + private static $id_current_shop; + private static $id_current_group_shop; + private static $id_current_root_category; + + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('active' => 'isBool', + 'name' => 'isGenericName'); + protected $table = 'shop'; + protected $identifier = 'id_shop'; + + /** @var array List of shops cached */ + protected static $shops = array(); + + private static $assoTables = array( + 'carrier' => array('type' => 'shop'), + 'category_lang' => array('type' => 'fk_shop'), + 'cms' => array('type' => 'shop'), + 'contact' => array('type' => 'shop'), + 'country' => array('type' => 'shop'), + 'currency' => array('type' => 'shop'), + 'hook_module' => array('type' => 'fk_shop'), + 'hook_module_exceptions' => array('type' => 'fk_shop', 'primary' => 'id_hook_module_exceptions'), + 'image' => array('type' => 'shop'), + 'lang' => array('type' => 'shop'), + 'meta_lang' => array('type' => 'fk_shop'), + 'module' => array('type' => 'shop'), + 'module_currency' => array('type' => 'fk_shop'), + 'module_country' => array('type' => 'fk_shop'), + 'module_group' => array('type' => 'fk_shop'), + 'stock' => array('type' => 'fk_shop', 'primary' => 'id_stock'), + 'product' => array('type' => 'shop'), + 'product_lang' => array('type' => 'fk_shop'), + 'store' => array('type' => 'shop'), + 'webservice_account' => array('type' => 'shop'), + ); + + protected $webserviceParameters = array( + 'fields' => array( + 'id_group_shop' => array('xlink_resource' => 'shop_groups'), + 'id_category' => array(), + 'id_theme' => array(), + ), + ); + + /** + * There are 3 kinds of shop context : shop, group shop and general + */ + const CONTEXT_SHOP = 1; + const CONTEXT_GROUP = 2; + const CONTEXT_ALL = 3; + + public function getFields() + { + parent::validateFields(); + + $fields['id_group_shop'] = (int)$this->id_group_shop; + $fields['id_category'] = (int)$this->id_category; + $fields['id_theme'] = (int)$this->id_theme; + $fields['name'] = pSQL($this->name); + $fields['active'] = (int)$this->active; + $fields['deleted'] = (int)$this->deleted; + return $fields; + } + + public static function getAssoTables() + { + return self::$assoTables; + } + + public function add($autodate = true, $nullValues = false) + { + $res = parent::add(); + Shop::loadShops(true); + return $res; + } + + public function delete() + { + if (!$res = parent::delete()) + return false; + + foreach (Shop::getAssoTables() AS $table_name => $row) + { + // Special case for stock if current shop is in a share stock group + if ($table_name == 'stock') + { + $group = new GroupShop($this->id_group_shop); + if ($group->share_stock && $group->getNbShops() > 1) + continue; + } + + $id = 'id_'.$row['type']; + if ($row['type'] == 'fk_shop') + $id = 'id_shop'; + else + $table_name .= '_'.$row['type']; + $res &= Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.$table_name.'` WHERE `'.$id.'`='.(int)$this->id); + } + + Shop::loadShops(true); + + return $res; + } + + /** + * Check if shop is the same as default shop in configuration + * + * @param int $shopID + * @return bool + */ + public static function isDefaultShop($shopID) + { + return ($shopID == Configuration::get('PS_SHOP_DEFAULT')); + } + + /** + * Load list of groups and shops, and cache it + * + * @param bool $refresh + */ + public static function loadShops($refresh = false) + { + if (self::$shops && !$refresh) + return; + + $sql = 'SELECT gs.id_group_shop, gs.name AS group_name, gs.share_datas, gs.share_stock, s.id_shop, s.name AS shop_name, s.id_theme, s.id_category, s.active + FROM '._DB_PREFIX_.'group_shop gs + LEFT JOIN '._DB_PREFIX_.'shop s + ON (s.id_group_shop = gs.id_group_shop) + WHERE s.active = 1 + AND s.deleted = 0 + AND gs.deleted = 0 + ORDER BY gs.name, s.name'; + if ($results = Db::getInstance()->ExecuteS($sql)) + { + foreach ($results as $row) + { + if (!isset(self::$shops[$row['id_group_shop']])) + self::$shops[$row['id_group_shop']] = array( + 'id' => $row['id_group_shop'], + 'name' => $row['group_name'], + 'share_datas' => $row['share_datas'], + 'share_stock' => $row['share_stock'], + 'shops' => array(), + ); + + self::$shops[$row['id_group_shop']]['shops'][$row['id_shop']] = array( + 'id_shop' => $row['id_shop'], + 'id_group_shop' => $row['id_group_shop'], + 'name' => $row['shop_name'], + 'id_theme' => $row['id_theme'], + 'id_category' => $row['id_category'], + 'active' => $row['active'], + ); + } + } + } + + public function getUrls() + { + return Db::getInstance()->ExecuteS('SELECT * + FROM '._DB_PREFIX.'shop_url + WHERE active=1 AND id_shop='.(int)$this->id); + } + + /** + * Get shops list + * + * @param bool $active + * @param int $id_group_shop + * @param bool $getAsListID + */ + public static function getShops($active = true, $id_group_shop = null, $getAsListID = false) + { + Shop::loadShops(); + $results = array(); + foreach (self::$shops as $groupID => $groupData) + foreach ($groupData['shops'] as $id => $shopData) + if ((!$active || $shopData['active']) && (!$id_group_shop || $id_group_shop == $groupID)) + { + if ($getAsListID) + $results[] = $id; + else + $results[] = $shopData; + } + return $results; + } + + /** + * @return int Total of shops + */ + public static function getTotalShops($active = true) + { + return count(Shop::getShops($active)); + } + + public static function setCurrentShop() + { + $excluded_uris = self::getExcludedUris(); + preg_match('/^'.Tools::pRegexp(_PS_DIRECTORY_, '/').'([a-z0-9]+)\/.*$/Ui', $_SERVER['REQUEST_URI'], $res); + if (isset($res[1]) AND !in_array($res[1], $excluded_uris)) + $uri = $res[1]; + else + $uri = ''; + + if (!$id_shop = (int)Tools::getValue('id_shop')) + { + $id_shop = Db::getInstance()->getValue('SELECT s.id_shop + FROM '._DB_PREFIX_.'shop_url su + LEFT JOIN '._DB_PREFIX_.'shop s ON (s.id_shop = su.id_shop) + WHERE su.domain=\''.pSQL(Tools::getHttpHost()).'\' AND uri=\''.pSQL($uri).'\' AND s.active=1 AND s.deleted=0'); + if (!$id_shop) + $id_shop = Configuration::get('PS_SHOP_DEFAULT'); + } + + $res = Db::getInstance()->getRow('SELECT s.id_shop, s.id_group_shop, s.id_category, su.uri, t.name + FROM '._DB_PREFIX_.'shop s + LEFT JOIN '._DB_PREFIX_.'shop_url su ON (s.id_shop = su.id_shop) + LEFT JOIN '._DB_PREFIX_.'theme t ON (t.id_theme = s.id_theme) + WHERE s.id_shop='.(int)$id_shop.' AND s.active=1 AND s.deleted=0 AND su.main=1'); + + $id_shop = (int)$res['id_shop']; + $id_group_shop = (int)$res['id_group_shop']; + self::$id_current_shop = (int)$id_shop; + self::$id_current_group_shop = (int)$id_group_shop; + self::$id_current_root_category = (int)$res['id_category']; + self::$current_base_uri = (!empty($res['uri']) ? $res['uri'].'/' : '' ); + self::$current_theme_name = $res['name']; + } + + public static function getExcludedUris() + { + $directories = scandir(dirname(__FILE__).'/../'); + $not_uri = array(); + foreach ($directories AS $directory) + if (is_dir(dirname(__FILE__).'/../'.$directory) AND (!preg_match ('/^\./', $directory))) + $not_uri[] = '/'.$directory.'/'; + return $not_uri; + } + + public static function getCurrentTheme() + { + return self::$current_theme_name; + } + + public static function getCurrentBaseURI($with_base = true) + { + return ($with_base ? _PS_DIRECTORY_ : '').self::$current_base_uri; + } + + public static function getCurrentGroupShop() + { + return Shop::retrieveContext('group'); + } + + /** + * Get current shop ID. + * + * @param bool $forceContext If true and if no shop is selected in context, get default shop ID + * @return int + */ + public static function getCurrentShop($forceContext = false) + { + $shopID = Shop::retrieveContext('shop'); + if (!$shopID && $forceContext) + $shopID = (int)Configuration::get('PS_SHOP_DEFAULT'); + return $shopID; + } + + public function getTheme($entity = false, $id = false) + { + return Db::getInstance()->getValue('SELECT t.name + FROM '._DB_PREFIX_.'shop s + LEFT JOIN '._DB_PREFIX_.'theme t ON (s.id_theme = t.id_theme) + WHERE id_shop='.(int)$this->id); + + } + + public static function getCurrentRootCategory() + { + return self::$id_current_root_category; + } + + public function getRootCategory() + { + return $this->id_category; + } + + /** + * Retrieve group ID of a shop + * + * @param int $shopID Shop ID + * @return int Group ID + */ + public static function getGroupFromShop($shopID, $asID = true) + { + Shop::loadShops(); + foreach (self::$shops as $groupID => $groupData) + if (array_key_exists($shopID, $groupData['shops'])) + return ($asID) ? $groupID : $groupData; + return false; + } + + /** + * If the shop group has a the option "share_datas" activated, get all shops ID of this group, else get current shop ID + * + * @param int $shopID + * @return array + */ + public static function getSharedShops($shopID) + { + Shop::loadShops(); + foreach (self::$shops as $groupData) + if (array_key_exists($shopID, $groupData['shops']) && $groupData['share_datas']) + return array_keys($groupData['shops']); + return array($shopID); + } + + /** + * Retrieve the current shop context in FO or BO + * + * @param string null|shop|group + * @return array(id_shop, id_group_shop)|int + */ + public static function retrieveContext($type = null) + { + static $executed = false, $shopID = 0, $shopGroupID = 0; + if (!$executed) + { + if (defined('PS_ADMIN_DIR')) + { + global $cookie; + + // While cookie is not instancied in admin, we wait ... + if (!$cookie) + return ($type == 'shop' || $type == 'group') ? '' : array('', ''); + + // Parse shopContext cookie value (E.g. s-2, g-4) + $split = explode('-', $cookie->shopContext); + $shopID = $shopGroupID = ''; + if (count($split) == 2) + { + if ($split[0] == 's') + $shopID = (int)$split[1]; + else if ($split[0] == 'g') + $shopGroupID = (int)$split[1]; + + if ($shopID && !$shopGroupID) + $shopGroupID = Shop::getGroupFromShop($shopID); + } + } + else + { + $shopID = (int)self::$id_current_shop; + $shopGroupID = (int)self::$id_current_group_shop; + } + $executed = true; + } + if ($type == 'shop') + return $shopID; + else if ($type == 'group') + return $shopGroupID; + return array($shopID, $shopGroupID); + } + + /** + * Get a list of ID concerned by the shop context (E.g. if context is shop group, get list of children shop ID) + * + * @param int $shopID + * @param int $shopGroupID + * @param bool $share If true and if $shopID is set, list shops with share data too + * @return array + */ + public static function getListOfID($shopID, $shopGroupID, $share = false) + { + if ($shopID) + $list = (!$share) ? array($shopID) : Shop::getSharedShops($shopID); + else if ($shopGroupID) + $list = Shop::getShops(true, $shopGroupID, true); + else + $list = Shop::getShops(true, null, true); + + return $list; + } + + /** + * Get a list of ID concerned by the shop context (E.g. if context is shop group, get list of children shop ID) + * + * @return array + */ + public static function getListFromContext() + { + list($shopID, $shopGroupID) = Shop::retrieveContext(); + return Shop::getListOfID($shopID, $shopGroupID); + } + + /** + * Check in which type of shop context we are + * + * @return int + */ + public static function getContextType() + { + list($shopID, $shopGroupID) = Shop::retrieveContext(); + if ($shopID) + return Shop::CONTEXT_SHOP; + else if ($shopGroupID) + return Shop::CONTEXT_GROUP; + return Shop::CONTEXT_ALL; + } + + public static function sqlRestriction($share = false, $alias = null, $shopID = null, $shopGroupID = null, $type = 'shop') + { + if ($type != 'shop' && $type != 'group_shop') + $type = 'shop'; + + if ($alias) + $alias .= '.'; + + $restriction = ''; + if (is_null($shopID)) + $shopID = Shop::retrieveContext('shop'); + if (is_null($shopGroupID)) + $shopGroupID = Shop::retrieveContext('group'); + + if ($type == 'group_shop') + { + if ($shopID) + $restriction = ' AND '.$alias.'id_group_shop = '.Shop::getGroupFromShop($shopID); + else if ($shopGroupID) + $restriction = ' AND '.$alias.'id_group_shop = '.$shopGroupID; + } + else + { + if ($shopID || $shopGroupID) + $restriction = ' AND '.$alias.'id_shop IN ('.implode(', ', Shop::getListOfID($shopID, $shopGroupID, $share)).')'; + } + + return $restriction; + } + + public static function sqlSharedStock($alias = null, $shopID = null, $shopGroupID = null) + { + if ($alias) + $alias .= '.'; + + if (is_null($shopID)) + $shopID = Shop::getCurrentShop(true); + + if (!$shopID) + return ($shopGroupID) ? ' AND '.$alias.'id_group_shop = '.(int)$shopGroupID : ''; + + Shop::loadShops(); + foreach (self::$shops as $groupID => $groupData) + if (array_key_exists($shopID, $groupData['shops']) && $groupData['share_stock']) + return ' AND '.$alias.'id_group_shop = '.$groupID; + return ' AND '.$alias.'id_shop = '.$shopID; + } + + /** + * Get all groups and associated shops as subarrays + * + * @return array + */ + public static function getTree() + { + Shop::loadShops(); + return self::$shops; + } + + /** + * Generate a sweet HTML list for shop selection + * + * @return string + */ + public static function generateHtmlList() + { + $tree = Shop::getTree(); + + // Get default value + list($shopID, $shopGroupID) = Shop::retrieveContext(); + if ($shopID) + $value = 's-'.$shopID; + else if ($shopGroupID) + $value = 'g-'.$shopGroupID; + else + $value = ''; + + // Generate HTML + $url = $_SERVER['REQUEST_URI'] . (($_SERVER['QUERY_STRING']) ? '&' : '?') . 'setShopContext='; + $html = ''; + + return $html; + } + + public function copyShopData($old_id, $tables_import = false, $deleted = false) + { + foreach (Shop::getAssoTables() AS $table_name => $row) + { + if ($tables_import && !isset($tables_import[$table_name])) + continue; + + // Special case for stock if current shop is in a share stock group + if ($table_name == 'stock') + { + $group = new GroupShop($this->id_group_shop); + if ($group->share_stock && $group->haveShops()) + continue; + } + + $id = 'id_'.$row['type']; + if ($row['type'] == 'fk_shop') + $id = 'id_shop'; + else + $table_name .= '_'.$row['type']; + + if (!$deleted) + { + $res = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.$table_name.'` WHERE `'.$id.'` = '.(int)$old_id); + if ($res) + { + unset($res[$id]); + if (isset($row['primary'])) + unset($res[$row['primary']]); + + $keys = implode(', ', array_keys($res)); + $sql = 'INSERT INTO `'._DB_PREFIX_.$table_name.'` ('.$keys.', '.$id.') + (SELECT '.$keys.', '.(int)$this->id.' FROM '._DB_PREFIX_.$table_name.' + WHERE `'.$id.'` = '.(int)$old_id.')'; + Db::getInstance()->Execute($sql); + } + } + else + { + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.$table_name.'` SET WHERE `'.$id.'`='.(int)$old_id); + } + } + } +} diff --git a/classes/ShopUrl.php b/classes/ShopUrl.php new file mode 100755 index 000000000..77a7d3887 --- /dev/null +++ b/classes/ShopUrl.php @@ -0,0 +1,103 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ShopUrlCore extends ObjectModel +{ + public $id_shop; + public $domain; + public $domain_ssl; + public $uri; + public $main; + public $active; + + private static $main_domain = NULL; + private static $main_domain_ssl = NULL; + + + protected $fieldsRequired = array('domain', 'id_shop'); + protected $fieldsSize = array('domain' => 255, 'uri' => 64); + protected $fieldsValidate = array('active' => 'isBool'); + + protected $table = 'shop_url'; + protected $identifier = 'id_shop_url'; + + public function getFields() + { + parent::validateFields(); + $fields['domain'] = pSQL($this->domain); + $fields['domain_ssl'] = pSQL($this->domain_ssl); + $fields['uri'] = pSQL($this->uri); + $fields['id_shop'] = (int)$this->id_shop; + $fields['main'] = (int)$this->main; + $fields['active'] = (int)$this->active; + return $fields; + } + + public static function getShopUrls($id_shop = false) + { + return Db::getInstance()->ExecuteS('SELECT * + FROM '._DB_PREFIX_.'shop_url + WHERE 1 + '.($id_shop ? ' AND id_shop='.(int)$id_shop : '')); + } + + public function setMain() + { + $res = Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'shop_url SET main=0 WHERE id_shop='.(int)$this->id_shop); + $res &= Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'shop_url SET main=1 WHERE id_shop_url='.(int)$this->id); + return $res; + } + + public function canAddThisUrl($domain, $domain_ssl, $uri) + { + $sql = 'SELECT id_shop_url + FROM '._DB_PREFIX_.'shop_url + WHERE uri=\''.pSQL($uri).'\' + AND (domain=\''.pSQL($domain).'\' '.(($domain_ssl) ? 'OR domain_ssl=\''.pSQL($domain_ssl).'\'' : '').')' + .($this->id ? ' AND id_shop_url !='.(int)$this->id : ''); + return Db::getInstance()->getValue($sql); + } + + public static function getMainShopDomain() + { + if (!self::$main_domain) + self::$main_domain = Db::getInstance()->getValue('SELECT domain + FROM '._DB_PREFIX_.'shop_url + WHERE main=1 AND id_shop='.(int)Shop::getCurrentShop()); + return self::$main_domain; + } + + public static function getMainShopDomainSSL() + { + if (!self::$main_domain) + self::$main_domain = Db::getInstance()->getValue('SELECT domain + FROM '._DB_PREFIX_.'shop_url + WHERE main=1 AND id_shop='.(int)Shop::getCurrentShop()); + return self::$main_domain_ssl; + } +} + diff --git a/classes/SpecificPrice.php b/classes/SpecificPrice.php new file mode 100644 index 000000000..5fb0f0bc4 --- /dev/null +++ b/classes/SpecificPrice.php @@ -0,0 +1,255 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7158 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SpecificPriceCore extends ObjectModel +{ + public $id_product; + public $id_shop; + public $id_currency; + public $id_country; + public $id_group; + public $price; + public $from_quantity; + public $reduction; + public $reduction_type; + public $from; + public $to; + + protected $fieldsRequired = array('id_product', 'id_shop', 'id_currency', 'id_country', 'id_group', 'price', 'from_quantity', 'reduction', 'reduction_type', 'from', 'to'); + protected $fieldsValidate = array('id_group_shop' => 'isUnsignedId', 'id_product' => 'isUnsignedId', 'id_shop' => 'isUnsignedId', 'id_country' => 'isUnsignedId', 'id_group' => 'isUnsignedId', 'price' => 'isPrice', 'from_quantity' => 'isUnsignedInt', 'reduction' => 'isPrice', 'reduction_type' => 'isReductionType', 'from' => 'isDateFormat', 'to' => 'isDateFormat'); + + protected $table = 'specific_price'; + protected $identifier = 'id_specific_price'; + + protected static $_specificPriceCache = array(); + protected static $_cache_priorities = array(); + + public function getFields() + { + parent::validateFields(); + $fields['id_product'] = (int)($this->id_product); + $fields['id_shop'] = (int)($this->id_shop); + $fields['id_currency'] = (int)($this->id_currency); + $fields['id_country'] = (int)($this->id_country); + $fields['id_group'] = (int)($this->id_group); + $fields['price'] = (float)($this->price); + $fields['from_quantity'] = (int)($this->from_quantity); + $fields['reduction'] = (float)($this->reduction); + $fields['reduction_type'] = pSQL($this->reduction_type); + $fields['from'] = pSQL($this->from); + $fields['to'] = pSQL($this->to); + return $fields; + } + + static public function getByProductId($id_product) + { + return Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)($id_product) + ); + } + + static public function getIdsByProductId($id_product) + { + return Db::getInstance()->ExecuteS(' + SELECT `id_specific_price` FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)$id_product.' + '); + } + + // score generation for quantity discount + protected static function _getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group) + { + $select = '('; + + $now = date('Y-m-d H:i:s'); + $select .= ' IF (\''.$now.'\' >= `from` AND \''.$now.'\' <= `to`, '.pow(2, 0).', 0) + '; + + $priority = SpecificPrice::getPriority($id_product); + foreach (array_reverse($priority) AS $k => $field) + $select .= ' IF (`'.$field.'` = '.(int)(${$field}).', '.pow(2, $k + 1).', 0) + '; + + return rtrim($select, ' +').') AS `score`'; + } + + public static function getPriority($id_product) + { + + if (!isset(self::$_cache_priorities[(int)$id_product])) + { + self::$_cache_priorities[(int)$id_product] = Db::getInstance()->getValue(' + SELECT `priority` + FROM `'._DB_PREFIX_.'specific_price_priority` + WHERE `id_product` = '.(int)$id_product); + } + + $priority = self::$_cache_priorities[(int)$id_product]; + + if (!$priority) + $priority = Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES'); + return preg_split('/;/', $priority); + } + + static public function getSpecificPrice($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity) + { + /* + ** The date is not taken into account for the cache, but this is for the better because it keeps the consistency for the whole script. + ** The price must not change between the top and the bottom of the page + */ + + $key = ((int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.(int)$id_group.'-'.(int)$quantity); + if (!array_key_exists($key, self::$_specificPriceCache)) + { + $now = date('Y-m-d H:i:s'); + self::$_specificPriceCache[$key] = Db::getInstance()->getRow(' + SELECT *, '.self::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group).' + FROM `'._DB_PREFIX_.'specific_price` + WHERE `id_product` IN (0, '.(int)$id_product.') + AND `id_shop` IN (0, '.(int)$id_shop.') + AND `id_currency` IN (0, '.(int)$id_currency.') + AND `id_country` IN (0, '.(int)$id_country.') + AND `id_group` IN (0, '.(int)$id_group.') + AND `from_quantity` <= '.(int)$quantity.' + AND (`from` = \'0000-00-00 00:00:00\' OR (\''.$now.'\' >= `from` AND \''.$now.'\' <= `to`)) + ORDER BY `score` DESC, `from_quantity` DESC'); + } + return self::$_specificPriceCache[$key]; + } + + static public function setPriorities($priorities) + { + $value = ''; + foreach ($priorities as $priority) + $value .= pSQL($priority).';'; + + SpecificPrice::deletePriorities(); + + return Configuration::updateValue('PS_SPECIFIC_PRICE_PRIORITIES', rtrim($value, ';')); + } + + public static function deletePriorities() + { + return Db::getInstance()->Execute(' + TRUNCATE `'._DB_PREFIX_.'specific_price_priority` + '); + } + + static public function setSpecificPriority($id_product, $priorities) + { + $fields = ''; + $value = ''; + foreach ($priorities as $priority) + $value .= pSQL($priority).';'; + + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'specific_price_priority` (`id_product`, `priority`) + VALUES ('.(int)$id_product.',\''.rtrim($value, ';').'\') + ON DUPLICATE KEY UPDATE `priority` = \''.rtrim($value, ';').'\' + '); + } + + static public function getQuantityDiscounts($id_product, $id_shop, $id_currency, $id_country, $id_group) + { + $now = date('Y-m-d H:i:s'); + $res = Db::getInstance()->ExecuteS(' + SELECT *, + '.self::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group).' + FROM `'._DB_PREFIX_.'specific_price` + WHERE `id_product` IN(0, '.(int)($id_product).') AND + `id_shop` IN(0, '.(int)($id_shop).') AND + `id_currency` IN(0, '.(int)($id_currency).') AND + `id_country` IN(0, '.(int)($id_country).') AND + `id_group` IN(0, '.(int)($id_group).') AND + (`from` = \'0000-00-00 00:00:00\' OR (\''.$now.'\' >= `from` AND \''.$now.'\' <= `to`)) + ORDER BY `score` DESC, `from_quantity` DESC + '); + + $targeted_prices = array(); + $max_score = NULL; + + foreach($res as $specific_price) + { + if (!isset($max_score)) + $max_score = $specific_price['score']; + else if ($max_score != $specific_price['score']) + break; + + if ($specific_price['from_quantity'] > 1) + $targeted_prices[] = $specific_price; + } + + return $targeted_prices; + } + + static public function getQuantityDiscount($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity) + { + $now = date('Y-m-d H:i:s'); + return Db::getInstance()->getRow(' + SELECT *, + '.self::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group).' + FROM `'._DB_PREFIX_.'specific_price` + WHERE `id_product` IN(0, '.(int)($id_product).') AND + `id_shop` IN(0, '.(int)($id_shop).') AND + `id_currency` IN(0, '.(int)($id_currency).') AND + `id_country` IN(0, '.(int)($id_country).') AND + `id_group` IN(0, '.(int)($id_group).') AND + `from_quantity` >= '.(int)($quantity).' AND + (`from` = \'0000-00-00 00:00:00\' OR (\''.$now.'\' >= `from` AND \''.$now.'\' <= `to`)) + ORDER BY `score` DESC, `from_quantity` DESC + '); + } + + static public function getProductIdByDate($id_shop, $id_currency, $id_country, $id_group, $beginning, $ending) + { + $resource = Db::getInstance()->ExecuteS(' + SELECT `id_product` + FROM `'._DB_PREFIX_.'specific_price` + WHERE `id_shop` IN(0, '.(int)($id_shop).') AND + `id_currency` IN(0, '.(int)($id_currency).') AND + `id_country` IN(0, '.(int)($id_country).') AND + `id_group` IN(0, '.(int)($id_group).') AND + `from_quantity` = 1 AND + (`from` = \'0000-00-00 00:00:00\' OR (\''.$beginning.'\' >= `from` AND \''.$ending.'\' <= `to`)) AND + `reduction` > 0 + ', false); + $ids_product = array(); + while ($row = DB::getInstance()->nextRow($resource)) + $ids_product[] = (int)($row['id_product']); + return $ids_product; + } + + static public function deleteByProductId($id_product) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)($id_product)); + } + + public function duplicate($id_product = false) + { + if ($id_product) + $this->id_product = (int)($id_product); + return $this->add(); + } +} + diff --git a/classes/State.php b/classes/State.php new file mode 100644 index 000000000..b62ed457e --- /dev/null +++ b/classes/State.php @@ -0,0 +1,204 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class StateCore extends ObjectModel +{ + /** @var integer Country id which state belongs */ + public $id_country; + + /** @var integer Zone id which state belongs */ + public $id_zone; + + /** @var string 2 letters iso code */ + public $iso_code; + + /** @var string Name */ + public $name; + + /** @var boolean Status for delivery */ + public $active = true; + + protected $fieldsRequired = array('id_country', 'id_zone', 'iso_code', 'name'); + protected $fieldsSize = array('iso_code' => 4, 'name' => 32); + protected $fieldsValidate = array('id_country' => 'isUnsignedId', 'id_zone' => 'isUnsignedId', 'iso_code' => 'isStateIsoCode', 'name' => 'isGenericName', 'active' => 'isBool'); + + protected $table = 'state'; + protected $identifier = 'id_state'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_zone' => array('xlink_resource'=> 'zones'), + 'id_country' => array('xlink_resource'=> 'countries') + ), + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_country'] = (int)($this->id_country); + $fields['id_zone'] = (int)($this->id_zone); + $fields['iso_code'] = pSQL(strtoupper($this->iso_code)); + $fields['name'] = pSQL($this->name); + $fields['active'] = (int)($this->active); + return $fields; + } + + public static function getStates($id_lang = false, $active = false) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT `id_state`, `id_country`, `id_zone`, `iso_code`, `name`, `active` + FROM `'._DB_PREFIX_.'state` + '.($active ? 'WHERE active = 1' : '').' + ORDER BY `name` ASC'); + } + + /** + * Get a state name with its ID + * + * @param integer $id_state Country ID + * @return string State name + */ + static public function getNameById($id_state) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name` + FROM `'._DB_PREFIX_.'state` + WHERE `id_state` = '.(int)($id_state)); + + return $result['name']; + } + + /** + * Get a state id with its name + * + * @param string $id_state Country ID + * @return integer state id + */ + static public function getIdByName($state) + { + $result = Db::getInstance()->getRow(' + SELECT `id_state` + FROM `'._DB_PREFIX_.'state` + WHERE `name` LIKE \''.pSQL($state).'\''); + + return ((int)($result['id_state'])); + } + + /** + * Get a state id with its iso code + * + * @param string $iso_code Iso code + * @return integer state id + */ + static public function getIdByIso($iso_code) + { + return Db::getInstance()->getValue(' + SELECT `id_state` + FROM `'._DB_PREFIX_.'state` + WHERE `iso_code` = \''.pSQL($iso_code).'\'' + ); + } + + /** + * Delete a state only if is not in use + * + * @return boolean + */ + public function delete() + { + if (!Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + + if (!$this->isUsed()) + { + /* Database deletion */ + $result = Db::getInstance()->Execute('DELETE FROM `'.pSQL(_DB_PREFIX_.$this->table).'` WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + if (!$result) + return false; + + /* Database deletion for multilingual fields related to the object */ + if (method_exists($this, 'getTranslationsFieldsChild')) + Db::getInstance()->Execute('DELETE FROM `'.pSQL(_DB_PREFIX_.$this->table).'_lang` WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + return $result; + } + else + return false; + } + + /** + * Check if a state is used + * + * @return boolean + */ + public function isUsed() + { + return ($this->countUsed() > 0); + } + + /** + * Returns the number of utilisation of a state + * + * @return integer count for this state + */ + public function countUsed() + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(*) AS nb_used + FROM `'._DB_PREFIX_.'address` + WHERE `'.pSQL($this->identifier).'` = '.(int)($this->id)); + return $row['nb_used']; + } + + public static function getStatesByIdCountry($id_country) + { + if (empty($id_country)) + die(Tools::displayError()); + + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'state` s + WHERE s.`id_country` = '.(int)$id_country + ); + } + + public static function hasCounties($id_state) + { + return sizeof(County::getCounties((int)$id_state)); + } + + public static function getIdZone($id_state) + { + if (!Validate::isUnsignedId($id_state)) + die(Tools::displayError()); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `id_zone` + FROM `'._DB_PREFIX_.'state` + WHERE `id_state` = '.(int)($id_state)); + } +} + diff --git a/classes/Stock.php b/classes/Stock.php new file mode 100755 index 000000000..34b504d40 --- /dev/null +++ b/classes/Stock.php @@ -0,0 +1,66 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * @since 1.5.0 + */ +class Stock extends ObjectModel +{ + public $id_product; + public $id_product_attribute; + public $id_group_shop; + public $id_shop; + public $quantity; + + protected $fieldsRequired = array('id_shop', 'id_group_shop', 'id_product', 'id_product_attribute'); + protected $fieldsSize = array(); + protected $fieldsValidate = array(); + + protected $table = 'stock'; + protected $identifier = 'id_stock'; + + public function getFields() + { + parent::validateFields(); + $fields['id_product'] = (int)$this->id_product; + $fields['id_product_attribute'] = (int)$this->id_product_attribute; + $fields['id_group_shop'] = (int)$this->id_group_shop; + $fields['id_shop'] = (int)$this->id_shop; + $fields['quantity'] = (int)$this->quantity; + return $fields; + } + + public static function getStockId($id_product, $id_product_attribute, $shopID = null) + { + $sql = 'SELECT id_stock + FROM '._DB_PREFIX_.'stock + WHERE id_product = '.(int)$id_product.' + AND id_product_attribute = '.(int)$id_product_attribute + .Shop::sqlSharedStock('', $shopID); + return (int)Db::getInstance()->getValue($sql); + } +} \ No newline at end of file diff --git a/classes/StockMvt.php b/classes/StockMvt.php new file mode 100755 index 000000000..4da2a3738 --- /dev/null +++ b/classes/StockMvt.php @@ -0,0 +1,133 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class StockMvtCore extends ObjectModel +{ + public $id; + + /** + * @since 1.5.0 id_stock replace old id_product and id_product_attribute fields in this table + * @var int + */ + public $id_stock; + + public $id_order = NULL; + public $id_employee = NULL; + public $quantity; + public $id_stock_mvt_reason; + + public $date_add; + public $date_upd; + + protected $table = 'stock_mvt'; + protected $identifier = 'id_stock_mvt'; + + protected $fieldsRequired = array('id_stock', 'id_stock_mvt_reason', 'quantity'); + protected $fieldsValidate = array( + 'id_stock' => 'isUnsignedId', + 'id_order' => 'isUnsignedId', + 'id_employee' => 'isUnsignedId', + 'quantity' => 'isInt', + 'id_stock_mvt_reason' => 'isUnsignedId', + ); + + protected $webserviceParameters = array( + 'objectsNodeName' => 'stock_movements', + 'objectNodeName' => 'stock_movement', + 'fields' => array( + 'id_product' => array('xlink_resource'=> 'products'), + 'id_product_attribute' => array('xlink_resource'=> 'product_option_values'), + 'id_order' => array('xlink_resource'=> 'orders'), + 'id_employee' => array('xlink_resource'=> 'employees'), + 'id_stock_mvt_reason' => array('xlink_resource'=> 'stock_movement_reasons'), + ), + ); + + public function getFields() + { + parent::validateFields(); + $fields['id_stock'] = (int)$this->id_stock; + $fields['id_order'] = (int)$this->id_order; + $fields['id_employee'] = (int)$this->id_employee; + $fields['id_stock_mvt_reason'] = (int)$this->id_stock_mvt_reason; + $fields['quantity'] = (int)$this->quantity; + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + /** + * Add missing stock movement (compare the quantity of a products with all movements : if there is a difference, create a stock movement to correct it) + * + * @param int $id_employee + */ + public static function addMissingMvt($id_employee) + { + // Search missing stock movement on products without attributes + $sql = 'SELECT s.id_stock, (s.quantity - SUM(IFNULL(sm.quantity, 0))) AS qty + FROM '._DB_PREFIX_.'product p + INNER JOIN '._DB_PREFIX_.'stock s ON s.id_product = p.id_product + LEFT JOIN '._DB_PREFIX_.'stock_mvt sm ON s.id_stock = sm.id_stock + WHERE ( + SELECT COUNT(*) FROM '._DB_PREFIX_.'stock s2 + WHERE s2.id_product = p.id_product + AND s2.id_product_attribute > 0 + ) = 0 + '.Shop::sqlSharedStock('s').' + GROUP BY s.id_product, s.id_shop + HAVING qty <> 0'; + $products_without_attributes = Db::getInstance()->ExecuteS($sql); + + // Search missing stock movement on products with attributes + $sql = 'SELECT s.id_stock, (s.quantity - SUM(IFNULL(sm.quantity, 0))) AS qty + FROM '._DB_PREFIX_.'product_attribute pa + INNER JOIN '._DB_PREFIX_.'stock s ON s.id_product = pa.id_product AND s.id_product_attribute = pa.id_product_attribute + LEFT JOIN '._DB_PREFIX_.'stock_mvt sm ON s.id_stock = sm.id_stock + WHERE s.id_product_attribute > 0 + AND ( + SELECT COUNT(*) FROM '._DB_PREFIX_.'stock s2 + WHERE s2.id_product = pa.id_product + AND s2.id_product_attribute > 0 + ) > 0 + GROUP BY s.id_product_attribute + HAVING qty <> 0'; + $products_with_attributes = Db::getInstance()->ExecuteS($sql); + + // Add missing stock movements + $products = array_merge($products_without_attributes, $products_with_attributes); + if ($products) + foreach ($products AS $product) + { + $mvt = new StockMvt(); + $mvt->id_stock = $product['id_stock']; + $mvt->id_employee = (int)$id_employee; + $mvt->quantity = $product['qty']; + $mvt->id_stock_mvt_reason = _STOCK_MOVEMENT_MISSING_REASON_; + $mvt->add(); + } + } +} \ No newline at end of file diff --git a/classes/StockMvtReason.php b/classes/StockMvtReason.php new file mode 100755 index 000000000..e22849fdd --- /dev/null +++ b/classes/StockMvtReason.php @@ -0,0 +1,73 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class StockMvtReasonCore extends ObjectModel +{ + public $id; + public $name; + + public $sign; + + public $date_add; + public $date_upd; + + protected $table = 'stock_mvt_reason'; + protected $identifier = 'id_stock_mvt_reason'; + + + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 255); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $webserviceParameters = array( + 'objectsNodeName' => 'stock_movement_reasons', + 'objectNodeName' => 'stock_movement_reason', + ); + + public function getFields() + { + parent::validateFields(); + $fields['sign'] = (int)$this->sign; + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + static public function getStockMvtReasons($id_lang) + { + $sql = 'SELECT smrl.name, smr.id_stock_mvt_reason, smr.sign + FROM '._DB_PREFIX_.'stock_mvt_reason smr + LEFT JOIN '._DB_PREFIX_.'stock_mvt_reason_lang smrl ON (smr.id_stock_mvt_reason = smrl.id_stock_mvt_reason AND smrl.id_lang='.(int)$id_lang.')'; + return Db::getInstance()->ExecuteS($sql); + } +} diff --git a/classes/Store.php b/classes/Store.php new file mode 100644 index 000000000..1ef25659b --- /dev/null +++ b/classes/Store.php @@ -0,0 +1,135 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class StoreCore extends ObjectModel +{ + /** @var integer Country id */ + public $id_country; + + /** @var integer State id */ + public $id_state; + + /** @var string Store name */ + public $name; + + /** @var string Address first line */ + public $address1; + + /** @var string Address second line (optional) */ + public $address2; + + /** @var string Postal code */ + public $postcode; + + /** @var string City */ + public $city; + + /** @var float Latitude */ + public $latitude; + + /** @var float Longitude */ + public $longitude; + + /** @var string Store hours (PHP serialized) */ + public $hours; + + /** @var string Phone number */ + public $phone; + + /** @var string Fax number */ + public $fax; + + /** @var string Note */ + public $note; + + /** @var string e-mail */ + public $email; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + /** @var boolean Store status */ + public $active = true; + + protected $fieldsRequired = array('id_country', 'name', 'address1', 'city', 'active'); + protected $fieldsSize = array('name' => 128, 'address1' => 128, 'address2' => 128, 'postcode' => 12, 'city' => 64, 'latitude' => 10, 'longitude' => 10, 'hours' => 254, 'phone' => 16, 'fax' => 16, 'email' => 128, 'note' => 65000); + protected $fieldsValidate = array('id_country' => 'isUnsignedId', 'id_state' => 'isNullOrUnsignedId', 'name' => 'isGenericName', 'address1' => 'isAddress', 'address2' => 'isAddress', + 'city' => 'isCityName', 'latitude' => 'isCoordinate', 'longitude' => 'isCoordinate', 'hours' => 'isSerializedArray', 'phone' => 'isPhoneNumber', 'fax' => 'isPhoneNumber', + 'note' => 'isCleanHtml', 'email' => 'isEmail', 'active' => 'isBool'); + + protected $table = 'store'; + protected $identifier = 'id_store'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_country' => array('xlink_resource'=> 'countries'), + 'id_state' => array('xlink_resource'=> 'states'), + 'hours' => array('getter' => 'getWsHours', 'setter' => 'setWsHours'), + ), + ); + + public function getFields() + { + parent::validateFields(); + + $fields['id_country'] = (int)($this->id_country); + $fields['id_state'] = (int)($this->id_state); + $fields['name'] = pSQL($this->name); + $fields['address1'] = pSQL($this->address1); + $fields['address2'] = pSQL($this->address2); + $fields['postcode'] = pSQL($this->postcode); + $fields['city'] = pSQL($this->city); + $fields['latitude'] = (float)($this->latitude); + $fields['longitude'] = (float)($this->longitude); + $fields['hours'] = pSQL($this->hours); + $fields['phone'] = pSQL($this->phone); + $fields['fax'] = pSQL($this->fax); + $fields['note'] = pSQL($this->note); + $fields['email'] = pSQL($this->email); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['active'] = (int)($this->active); + + return $fields; + } + + public function getWsHours() + { + return implode(';', unserialize($this->hours)); + } + + public function setWsHours($hours) + { + $this->hours = serialize(explode(';', $hours)); + return true; + } +} + + diff --git a/classes/SubDomain.php b/classes/SubDomain.php new file mode 100644 index 000000000..2049f4b9a --- /dev/null +++ b/classes/SubDomain.php @@ -0,0 +1,56 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SubDomainCore extends ObjectModel +{ + public $name; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 16); + protected $fieldsValidate = array('name' => 'isSubDomainName'); + + protected $table = 'subdomain'; + protected $identifier = 'id_subdomain'; + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + return $fields; + } + + static public function getSubDomains() + { + if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `name` FROM `'._DB_PREFIX_.'subdomain`')) + return false; + $subDomains = array(); + foreach ($result AS $row) + $subDomains[] = $row['name']; + return $subDomains; + } +} + diff --git a/classes/Supplier.php b/classes/Supplier.php new file mode 100644 index 000000000..58ab60e92 --- /dev/null +++ b/classes/Supplier.php @@ -0,0 +1,279 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SupplierCore extends ObjectModel +{ + public $id; + + /** @var integer supplier ID */ + public $id_supplier; + + /** @var string Name */ + public $name; + + /** @var string A short description for the discount */ + public $description; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + /** @var string Friendly URL */ + public $link_rewrite; + + /** @var string Meta title */ + public $meta_title; + + /** @var string Meta keywords */ + public $meta_keywords; + + /** @var string Meta description */ + public $meta_description; + + /** @var boolean active */ + public $active; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('name' => 'isCatalogName'); + + protected $fieldsSizeLang = array('meta_title' => 128, 'meta_description' => 255, 'meta_keywords' => 255); + protected $fieldsValidateLang = array('description' => 'isGenericName', 'meta_title' => 'isGenericName', 'meta_description' => 'isGenericName', 'meta_keywords' => 'isGenericName'); + + protected $table = 'supplier'; + protected $identifier = 'id_supplier'; + + protected $webserviceParameters = array( + 'fields' => array( + 'link_rewrite' => array('sqlId' => 'link_rewrite'), + ), + ); + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id, $id_lang); + + $this->link_rewrite = $this->getLink(); + $this->image_dir = _PS_SUPP_IMG_DIR_; + } + + public function getLink() + { + return Tools::link_rewrite($this->name, false); + } + + public function getFields() + { + parent::validateFields(); + if (isset($this->id)) + $fields['id_supplier'] = (int)($this->id); + $fields['name'] = pSQL($this->name); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['active'] = (int)($this->active); + return $fields; + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('description', 'meta_title', 'meta_keywords', 'meta_description')); + } + + /** + * Return suppliers + * + * @return array Suppliers + */ + static public function getSuppliers($getNbProducts = false, $id_lang = 0, $active = true, $p = false, $n = false, $all_groups = false) + { + global $cookie; + + if (!$id_lang) + $id_lang = Configuration::get('PS_LANG_DEFAULT'); + $query = 'SELECT s.*, sl.`description`'; + $query .= ' FROM `'._DB_PREFIX_.'supplier` as s + LEFT JOIN `'._DB_PREFIX_.'supplier_lang` sl ON (s.`id_supplier` = sl.`id_supplier` AND sl.`id_lang` = '.(int)($id_lang).') + '.($active ? ' WHERE s.`active` = 1 ' : ''); + $query .= ' ORDER BY s.`name` ASC'.($p ? ' LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n) : ''); + $suppliers = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($query); + if ($suppliers === false) + return false; + if ($getNbProducts) + { + $sqlGroups = ''; + if (!$all_groups) + { + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + } + foreach ($suppliers as $key => $supplier) + { + $sql = ' + SELECT p.`id_product` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'supplier` as m ON (m.`id_supplier`= p.`id_supplier`) + WHERE m.`id_supplier` = '.(int)($supplier['id_supplier']). + ($active ? ' AND p.`active` = 1' : ''). + ($all_groups ? '' :' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + )'); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + $suppliers[$key]['nb_products'] = sizeof($result); + } + } + for ($i = 0; $i < sizeof($suppliers); $i++) + if ((int)(Configuration::get('PS_REWRITING_SETTINGS'))) + $suppliers[$i]['link_rewrite'] = Tools::link_rewrite($suppliers[$i]['name'], false); + else + $suppliers[$i]['link_rewrite'] = 0; + return $suppliers; + } + + /** + * Return name from id + * + * @param integer $id_supplier Supplier ID + * @return string name + */ + static protected $cacheName = array(); + static public function getNameById($id_supplier) + { + if (!isset(self::$cacheName[$id_supplier])) + self::$cacheName[$id_supplier] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `name` FROM `'._DB_PREFIX_.'supplier` WHERE `id_supplier` = '.(int)($id_supplier)); + return self::$cacheName[$id_supplier]; + } + static public function getIdByName($name) + { + $result = Db::getInstance()->getRow(' + SELECT `id_supplier` + FROM `'._DB_PREFIX_.'supplier` + WHERE `name` = \''.pSQL($name).'\''); + if (isset($result['id_supplier'])) + return (int)($result['id_supplier']); + return false; + } + + static public function getProducts($id_supplier, $id_lang, $p, $n, $orderBy = NULL, $orderWay = NULL, $getTotal = false, $active = true) + { + if ($p < 1) $p = 1; + if (empty($orderBy) OR $orderBy == 'position') $orderBy = 'name'; + if (empty($orderWay)) $orderWay = 'ASC'; + + if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)) + die (Tools::displayError()); + + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + /* Return only the number of products */ + if ($getTotal) + { + $sql = ' + SELECT p.`id_product` + FROM `'._DB_PREFIX_.'product` p + WHERE p.id_supplier = '.(int)($id_supplier) + .($active ? ' AND p.`active` = 1' : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + )'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + return (int)(sizeof($result)); + } + + $sql = ' + SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, s.`name` AS supplier_name, tl.`name` AS tax_name, t.`rate`, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, + (p.`price` * ((100 + (t.`rate`))/100)) AS orderprice, m.`name` AS manufacturer_name + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) + LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` + AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' + AND tr.`id_state` = 0) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'supplier` s ON s.`id_supplier` = p.`id_supplier` + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` + WHERE p.`id_supplier` = '.(int)($id_supplier).($active ? ' AND p.`active` = 1' : '').' + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + ORDER BY '.(($orderBy == 'id_product') ? 'p.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).' + LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if (!$result) + return false; + if ($orderBy == 'price') + Tools::orderbyPrice($result, $orderWay); + return Product::getProductsProperties($id_lang, $result); + } + + public function getProductsLite($id_lang) + { + return Db::getInstance()->ExecuteS(' + SELECT p.`id_product`, pl.`name` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') + WHERE p.`id_supplier` = '.(int)($this->id)); + } + /* + * Specify if a supplier already in base + * + * @param $id_supplier Supplier id + * @return boolean + */ + static public function supplierExists($id_supplier) + { + $row = Db::getInstance()->getRow(' + SELECT `id_supplier` + FROM '._DB_PREFIX_.'supplier s + WHERE s.`id_supplier` = '.(int)($id_supplier)); + + return isset($row['id_supplier']); + } + + public function delete() + { + if (parent::delete()) + return $this->deleteImage(); +} +} + diff --git a/classes/Tab.php b/classes/Tab.php new file mode 100644 index 000000000..f66c66195 --- /dev/null +++ b/classes/Tab.php @@ -0,0 +1,249 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class TabCore extends ObjectModel +{ + /** @var string Displayed name*/ + public $name; + + /** @var string Class and file name*/ + public $class_name; + + public $module; + + /** @var integer parent ID */ + public $id_parent; + + /** @var integer position */ + public $position; + + protected $fieldsRequired = array('class_name', 'position'); + protected $fieldsSize = array('class_name' => 64, 'module' => 64); + protected $fieldsValidate = array('id_parent' => 'isInt', 'position' => 'isUnsignedInt', 'module' => 'isTabName'); + + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'tab'; + protected $identifier = 'id_tab'; + + protected static $_getIdFromClassName = null; + + public function getFields() + { + parent::validateFields(); + $fields['id_parent'] = (int)($this->id_parent); + $fields['class_name'] = pSQL($this->class_name); + $fields['module'] = pSQL($this->module); + $fields['position'] = (int)($this->position); + return $fields; + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + public function add($autodate = true, $nullValues = false) + { + $this->position = self::getNbTabs($this->id_parent) + 1; + if (parent::add($autodate, $nullValues)) + return self::initAccess($this->id); + return false; + } + + static public function initAccess($id_tab) + { + /* Cookie's loading */ + global $cookie; + if (!is_object($cookie) OR !$cookie->profile) + return false; + /* Profile selection */ + $profiles = Db::getInstance()->ExecuteS('SELECT `id_profile` FROM '._DB_PREFIX_.'profile'); + if (!$profiles OR empty($profiles)) + return false; + /* Query definition */ + $query = 'INSERT INTO `'._DB_PREFIX_.'access` VALUES '; + foreach ($profiles AS $profile) + { + $rights = (((int)($profile['id_profile']) == 1 OR (int)($profile['id_profile']) == $cookie->profile) ? 1 : 0); + $query .= ($profile === $profiles[0] ? '' : ', ').'('.(int)($profile['id_profile']).', '.(int)($id_tab).', '.$rights.', '.$rights.', '.$rights.', '.$rights.')'; + } + return Db::getInstance()->Execute($query); + } + + public function delete() + { + if (Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'access WHERE `id_tab` = '.(int)($this->id)) AND parent::delete()) + return $this->cleanPositions($this->id_parent); + return false; + } + + /** + * Get tab id + * + * @return integer tab id + */ + static public function getCurrentTabId() + { + return self::getIdFromClassName(Tools::getValue('tab')); + } + + /** + * Get tab parent id + * + * @return integer tab parent id + */ + static public function getCurrentParentId() + { + if ($result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `id_parent` FROM `'._DB_PREFIX_.'tab` WHERE LOWER(class_name) = \''.pSQL(Tools::strtolower(Tools::getValue('tab'))).'\'')) + return $result['id_parent']; + return -1; + } + + /** + * Get tab + * + * @return array tab + */ + static public function getTab($id_lang, $id_tab) + { + /* Tabs selection */ + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'tab` t + LEFT JOIN `'._DB_PREFIX_.'tab_lang` tl ON (t.`id_tab` = tl.`id_tab` AND tl.`id_lang` = '.(int)($id_lang).') + WHERE t.`id_tab` = '.(int)($id_tab)); + } + + /** + * Get tabs + * + * @return array tabs + */ + static $_cache_tabs = array(); + static public function getTabs($id_lang, $id_parent = NULL) + { + if (!isset(self::$_cache_tabs[$id_lang])) + { + self::$_cache_tabs[$id_lang] = array(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'tab` t + LEFT JOIN `'._DB_PREFIX_.'tab_lang` tl ON (t.`id_tab` = tl.`id_tab` AND tl.`id_lang` = '.(int)$id_lang.') + ORDER BY t.`position` ASC'); + foreach ($result as $row) + { + if (!isset(self::$_cache_tabs[$id_lang][$row['id_parent']])) + self::$_cache_tabs[$id_lang][$row['id_parent']] = array(); + self::$_cache_tabs[$id_lang][$row['id_parent']][] = $row; + } + } + if ($id_parent === null) + { + $array_all = array(); + foreach (self::$_cache_tabs[$id_lang] as $array_parent) + $array_all = array_merge($array_all, $array_parent); + return $array_all; + } + return (isset(self::$_cache_tabs[$id_lang][$id_parent]) ? self::$_cache_tabs[$id_lang][$id_parent] : array()); + } + + /** + * Get tab id from name + * + * @param string class_name + * @return int id_tab + */ + static public function getIdFromClassName($class_name) + { + if (self::$_getIdFromClassName === null) + { + self::$_getIdFromClassName = array(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT id_tab, class_name FROM `'._DB_PREFIX_.'tab`'); + foreach ($result as $row) + self::$_getIdFromClassName[$row['class_name']] = $row['id_tab']; + } + return (isset(self::$_getIdFromClassName[$class_name]) ? (int)self::$_getIdFromClassName[$class_name] : false); + } + + /** + * @deprecated + * @param int $id_tab + */ + static public function getClassNameFromID($id_tab) + { + Tools::displayAsDeprecated(); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT class_name FROM `'._DB_PREFIX_.'tab` t WHERE t.`id_tab` = \''.(int)$id_tab.'\''); + } + + static public function getNbTabs($id_parent = NULL) + { + return (int)Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'tab` t + '.($id_parent !== NULL ? 'WHERE t.`id_parent` = '.(int)$id_parent : '')); + } + + public function move($direction) + { + $nbTabs = self::getNbTabs($this->id_parent); + if ($direction != 'l' AND $direction != 'r') + return false; + if ($nbTabs <= 1) + return false; + if ($direction == 'l' AND $this->position <= 1) + return false; + if ($direction == 'r' AND $this->position >= $nbTabs) + return false; + + $newPosition = ($direction == 'l') ? $this->position - 1 : $this->position + 1; + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'tab` t SET position = '.(int)($this->position).' WHERE id_parent = '.(int)($this->id_parent).' AND position = '.(int)($newPosition)); + $this->position = $newPosition; + return $this->update(); + } + + public function cleanPositions($id_parent) + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_tab` + FROM `'._DB_PREFIX_.'tab` + WHERE `id_parent` = '.(int)($id_parent).' + ORDER BY `position`'); + $sizeof = sizeof($result); + for ($i = 0; $i < $sizeof; ++$i) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'tab` + SET `position` = '.($i + 1).' + WHERE `id_tab` = '.(int)($result[$i]['id_tab'])); + return true; + } +} + + diff --git a/classes/Tag.php b/classes/Tag.php new file mode 100644 index 000000000..0a2a7c537 --- /dev/null +++ b/classes/Tag.php @@ -0,0 +1,203 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class TagCore extends ObjectModel +{ + /** @var integer Language id */ + public $id_lang; + + /** @var string Name */ + public $name; + + protected $fieldsRequired = array('id_lang', 'name'); + protected $fieldsValidate = array('id_lang' => 'isUnsignedId', 'name' => 'isGenericName'); + + protected $table = 'tag'; + protected $identifier = 'id_tag'; + + protected $webserviceParameters = array( + 'fields' => array( + 'id_lang' => array('xlink_resource' => 'languages'), + ), + ); + + public function __construct($id = NULL, $name = NULL, $id_lang = NULL) + { + if ($id) + parent::__construct($id); + elseif ($name AND Validate::isGenericName($name) AND $id_lang AND Validate::isUnsignedId($id_lang)) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'tag` t + WHERE `name` LIKE \''.pSQL($name).'\' AND `id_lang` = '.(int)($id_lang)); + + if ($row) + { + $this->id = (int)($row['id_tag']); + $this->id_lang = (int)($row['id_lang']); + $this->name = $row['name']; + } + } + } + + public function getFields() + { + parent::validateFields(); + $fields['id_lang'] = (int)($this->id_lang); + $fields['name'] = pSQL($this->name); + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + if (!parent::add($autodate, $nullValues)) + return false; + elseif (isset($_POST['products'])) + return $this->setProducts(Tools::getValue('products')); + return true; + } + + /** + * Add several tags in database and link it to a product + * + * @param integer $id_lang Language id + * @param integer $id_product Product id to link tags with + * @param string $string Tags separated by commas + * + * @return boolean Operation success + */ + static public function addTags($id_lang, $id_product, $string) + { + if (!Validate::isUnsignedId($id_lang) OR !Validate::isTagsList($string)) + return false; + + $tmpTab = array_unique(array_map('trim', preg_split('/,/', $string, NULL, PREG_SPLIT_NO_EMPTY))); + $list = array(); + foreach ($tmpTab AS $tag) + { + if (!Validate::isGenericName($tag)) + return false; + $tagObj = new Tag(NULL, trim($tag), (int)($id_lang)); + + /* Tag does not exist in database */ + if (!Validate::isLoadedObject($tagObj)) + { + $tagObj->name = trim($tag); + $tagObj->id_lang = (int)($id_lang); + $tagObj->add(); + } + if (!in_array($tagObj->id, $list)) + $list[] = $tagObj->id; + } + $data = ''; + foreach ($list AS $tag) + $data .= '('.(int)($tag).','.(int)($id_product).'),'; + $data = rtrim($data, ','); + + return Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_tag` (`id_tag`, `id_product`) + VALUES '.$data); + } + + static public function getMainTags($id_lang, $nb = 10) + { + $groups = FrontController::getCurrentCustomerGroups(); + $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT t.name, COUNT(pt.id_tag) AS times + FROM `'._DB_PREFIX_.'product_tag` pt + LEFT JOIN `'._DB_PREFIX_.'tag` t ON (t.id_tag = pt.id_tag) + LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = pt.id_product) + WHERE t.`id_lang` = '.(int)($id_lang).' + AND p.`active` = 1 + AND p.`id_product` IN ( + SELECT cp.`id_product` + FROM `'._DB_PREFIX_.'category_group` cg + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) + WHERE cg.`id_group` '.$sqlGroups.' + ) + GROUP BY t.id_tag + ORDER BY times DESC + LIMIT 0, '.(int)($nb)); + } + + static public function getProductTags($id_product) + { + if (!$tmp = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT t.`id_lang`, t.`name` + FROM '._DB_PREFIX_.'tag t + LEFT JOIN '._DB_PREFIX_.'product_tag pt ON (pt.id_tag = t.id_tag) + WHERE pt.`id_product`='.(int)($id_product))) + return false; + $result = array(); + foreach ($tmp AS $tag) + $result[$tag['id_lang']][] = $tag['name']; + return $result; + } + + public function getProducts($associated = true) + { + global $cookie; + $id_lang = $this->id_lang ? $this->id_lang : $cookie->id_lang; + + if (!$this->id AND $associated) + return array(); + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT pl.name, pl.id_product + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product + WHERE pl.id_lang = '.(int)($id_lang).' + AND p.active = 1 + '.($this->id ? ('AND p.id_product '.($associated ? 'IN' : 'NOT IN').' (SELECT pt.id_product FROM `'._DB_PREFIX_.'product_tag` pt WHERE pt.id_tag = '.(int)($this->id).')') : '').' + ORDER BY pl.name'); + } + + public function setProducts($array) + { + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_tag WHERE id_tag = '.(int)$this->id); + if (is_array($array)) + { + $array = array_map('intval', $array); + $result1 = Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'product SET indexed = 0 WHERE id_product IN ('.implode(',', $array).')'); + $ids = array(); + foreach ($array as $id_product) + $ids[] = '('.(int)$id_product.','.(int)$this->id.')'; + return ($result1 && Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'product_tag (id_product, id_tag) VALUES '.implode(',',$ids)) && Search::indexation(false)); + } + return $result1; + } + + static public function deleteTagsForProduct($id_product) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_tag` WHERE `id_product` = '.(int)($id_product)); + } +} + + diff --git a/classes/Tax.php b/classes/Tax.php new file mode 100644 index 000000000..d269d4d59 --- /dev/null +++ b/classes/Tax.php @@ -0,0 +1,397 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class TaxCore extends ObjectModel +{ + /** @var string Name */ + public $name; + + /** @var float Rate (%) */ + public $rate; + + /** @var bool active state */ + public $active; + + protected $fieldsRequired = array('rate'); + protected $fieldsValidate = array('rate' => 'isFloat'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'tax'; + protected $identifier = 'id_tax'; + + protected static $_product_country_tax = array(); + protected static $_product_tax_via_rules = array(); + + public function getFields() + { + parent::validateFields(); + $fields['rate'] = (float)($this->rate); + $fields['active'] = (int)($this->active); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + public function delete() + { + /* Clean associations */ + TaxRule::deleteTaxRuleByIdTax((int)$this->id); + return parent::delete(); + } + + /** + * @deprecated zones are not related to a tax + */ + public static function checkTaxZone($id_tax, $id_zone) + { + Tools::displayAsDeprecated(); + return true; + } + + /** + * @deprecated states are not related to a tax. Check TaxRules. + */ + public function getStates() + { + Tools::displayAsDeprecated(); + return false; + } + + /** + * @deprecated states are not related to a tax. Check TaxRules. + */ + public function getState($id_state) + { + Tools::displayAsDeprecated(); + return false; + } + + /** + * @deprecated states are not related to a tax. Check TaxRules. + */ + public function addState($id_state) + { + Tools::displayAsDeprecated(); + return true; + } + + + /** + * @deprecated states are not related to a tax. Check TaxRules. + */ + public function deleteState($id_state) + { + Tools::displayAsDeprecated(); + return true; + } + + /** + * Get all zones + * + * @return array Zones + * @deprecated zones are not related to a tax + */ + public function getZones() + { + Tools::displayAsDeprecated(); + return false; + } + + /** + * Get a specific zones + * + * @return array Zone + * @deprecated zones are not related to a tax + */ + public function getZone($id_zone) + { + Tools::displayAsDeprecated(); + return false; + } + + /** + * Add zone + * @deprecated zones are not related to a tax + */ + public function addZone($id_zone) + { + Tools::displayAsDeprecated(); + return true; + } + + /** + * Delete zone + * @deprecated zones are not related to a tax + */ + public function deleteZone($id_zone) + { + Tools::displayAsDeprecated(); + return true; + } + + /** + * Get all available taxes + * + * @return array Taxes + */ + static public function getTaxes($id_lang = false, $active = 1) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT t.id_tax, t.rate'.((int)($id_lang) ? ', tl.name, tl.id_lang ' : '').' + FROM `'._DB_PREFIX_.'tax` t + '.((int)($id_lang) ? 'LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).')' + .($active == 1 ? 'WHERE t.`active` = 1' : '').' + ORDER BY `name` ASC' : '')); + } + + static public function excludeTaxeOption() + { + return !Configuration::get('PS_TAX'); + } + + /* + * @deprecated zones are not related to a tax + */ + static public function zoneHasTax($id_tax, $id_zone) + { + Tools::displayAsDeprecated(); + return true; + } + + + + /** + * @deprecated states are not related to a tax. Check TaxRules. + */ + static public function getRateByState($id_state, $active = 1) + { + Tools::displayAsDeprecated(); + return false; + } + + /** + * Return the applicable tax rate depending of the country and state + * @deprecated use getApplicableTaxRate + * @param integer $id_tax + * @param float $productTax + * @param integer $id_address + * + * @return float taxe_rate + */ + static public function getApplicableTax($id_tax, $productTax, $id_address = NULL) + { + Tools::displayAsDeprecated(); + return Tax::getApplicableTaxRate($id_tax, $productTax, $id_address); + } + + /** + * Return the applicable tax rate depending of the country and state + * + * @param integer $id_tax + * @param float $productTax + * @param integer $id_address + * + * @return float taxe_rate + */ + public static function getApplicableTaxRate($id_tax, $productTax, $id_address = NULL) + { + Tools::displayAsDeprecated(); + global $cart, $cookie, $defaultCountry; + + return $productTax; + } + + static public function getTaxIdByRate($rate, $active = 1) + { + Tools::displayAsDeprecated(); + $tax = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT t.`id_tax` + FROM `'._DB_PREFIX_.'tax` t + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.id_tax = tl.id_tax) + WHERE t.`rate` = '.(float)($rate). + ($active == 1 ? ' AND t.`active` = 1' : '')); + return $tax ? (int)($tax['id_tax']) : false; + } + + public static function getTaxIdByName($tax_name, $active =1) + { + $tax = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT t.`id_tax` + FROM `'._DB_PREFIX_.'tax` t + LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (tl.id_tax = t.id_tax) + WHERE tl.`name` = \''.pSQL($tax_name).'\' '. + ($active == 1 ? ' AND t.`active` = 1' : '')); + + return $tax ? (int)($tax['id_tax']) : false; + } + + static public function getDataByProductId($id_product) + { + Tools::displayAsDeprecated(); + + $tax_rate = Tax::getProductTaxRate((int)$id_product); + $id_tax = Tax::getTaxIdByRate($tax_rate); + + return array('id_tax' => $id_tax, 'rate' => $tax_rate); + } + + /** + * Return the product tax + * + * @param integer $id_product + * @param integer $id_country + * @return Tax + */ + public static function getProductTaxRate($id_product, $id_address = NULL) + { + $id_country = (int)Country::getDefaultCountryId(); + $id_state = 0; + $id_county = 0; + $rate = 0; + if (!empty($id_address)) + { + $address_infos = Address::getCountryAndState($id_address); + if ($address_infos['id_country']) + { + $id_country = (int)($address_infos['id_country']); + $id_state = (int)$address_infos['id_state']; + $id_county = (int)County::getIdCountyByZipCode($address_infos['id_state'], $address_infos['postcode']); + } + + if (!empty($address_infos['vat_number']) AND $address_infos['id_country'] != Configuration::get('VATNUMBER_COUNTRY') AND Configuration::get('VATNUMBER_MANAGEMENT')) + return 0; + } + + if ($rate = Tax::getProductTaxRateViaRules((int)$id_product, (int)$id_country, (int)$id_state, (int)$id_county)) + return $rate; + + return $rate; + } + + public static function getProductEcotaxRate($id_address = NULL) + { + $id_country = (int)Country::getDefaultCountryId(); + $id_state = 0; + $id_county = 0; + $rate = 0; + if (!empty($id_address)) + { + $address_infos = Address::getCountryAndState($id_address); + if ($address_infos['id_country']) + { + $id_country = (int)($address_infos['id_country']); + $id_state = (int)$address_infos['id_state']; + $id_county = (int)County::getIdCountyByZipCode($address_infos['id_state'], $address_infos['postcode']); + } + + if (!empty($address_infos['vat_number']) AND $address_infos['id_country'] != Configuration::get('VATNUMBER_COUNTRY') AND Configuration::get('VATNUMBER_MANAGEMENT')) + return 0; + } + + if ($rate = TaxRulesGroup::getTaxesRate((int)Configuration::get('PS_ECOTAX_TAX_RULES_GROUP_ID'), (int)$id_country, (int)$id_state, (int)$id_county)) + return $rate; + + return $rate; + } + + /** + * Return the product tax rate using the tax rules system + * + * @param integer $id_product + * @param integer $id_country + * @return Tax + */ + public static function getProductTaxRateViaRules($id_product, $id_country, $id_state, $id_county) + { + if (!isset(self::$_product_tax_via_rules[$id_product.'-'.$id_country.'-'.$id_state.'-'.$id_county])) + { + $tax_rate = TaxRulesGroup::getTaxesRate((int)Product::getIdTaxRulesGroupByIdProduct((int)$id_product), (int)$id_country, (int)$id_state, (int)$id_county); + self::$_product_tax_via_rules[$id_product.'-'.$id_country.'-'.$id_county] = $tax_rate; + } + + return self::$_product_tax_via_rules[$id_product.'-'.$id_country.'-'.$id_county]; + } + + + public static function getCarrierTaxRate($id_carrier, $id_address = NULL) + { + $id_country = (int)Country::getDefaultCountryId(); + $id_state = 0; + $id_county = 0; + if (!empty($id_address)) + { + $address_infos = Address::getCountryAndState($id_address); + if ($address_infos['id_country']) + { + $id_country = (int)($address_infos['id_country']); + $id_state = (int)$address_infos['id_state']; + $id_county = (int)County::getIdCountyByZipCode($address_infos['id_state'], $address_infos['postcode']); + } + + if (!empty($address_infos['vat_number']) AND $address_infos['id_country'] != Configuration::get('VATNUMBER_COUNTRY') AND Configuration::get('VATNUMBER_MANAGEMENT')) + return 0; + } + + return TaxRulesGroup::getTaxesRate((int)Carrier::getIdTaxRulesGroupByIdCarrier((int)$id_carrier), (int)$id_country, (int)$id_state, (int)$id_county); + } + + public function toggleStatus() + { + if (parent::toggleStatus()) + return $this->_onStatusChange(); + + return false; + } + + public function update($nullValues = false) + { + if (parent::update($nullValues)) + return $this->_onStatusChange(); + + return false; + } + + protected function _onStatusChange() + { + if (!$this->active) + return TaxRule::deleteTaxRuleByIdTax($this->id); + + return true; + } +} + diff --git a/classes/TaxRule.php b/classes/TaxRule.php new file mode 100644 index 000000000..4b74dbb64 --- /dev/null +++ b/classes/TaxRule.php @@ -0,0 +1,111 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class TaxRuleCore extends ObjectModel +{ + public $id_tax_rules_group; + public $id_country; + public $id_state; + public $id_county; + public $id_tax; + public $state_behavior; + public $county_behavior; + + protected $fieldsRequired = array('id_tax_rules_group', 'id_country', 'id_tax'); + protected $fieldsValidate = array('id_tax_rules_group' => 'isUnsignedId', 'id_country' => 'isUnsignedId', 'id_state' => 'isUnsignedId', 'id_county' => 'isUnsignedId', 'id_tax' => 'isUnsignedId', 'state_behavior' => 'isUnsignedInt', 'county_behavior' => 'isUnsignedInt'); + + protected $table = 'tax_rule'; + protected $identifier = 'id_tax_rule'; + + public function getFields() + { + parent::validateFields(); + $fields['id_tax_rules_group'] = (int)($this->id_tax_rules_group); + $fields['id_country'] = (int)$this->id_country; + $fields['id_state'] = (int)$this->id_state; + $fields['id_county'] = (int)$this->id_county; + $fields['state_behavior'] = (int)$this->state_behavior; + $fields['county_behavior'] = (int)$this->county_behavior; + $fields['id_tax'] = (int)($this->id_tax); + + return $fields; + } + + public static function deleteByGroupId($id_group) + { + if (empty($id_group)) + die(Tools::displayError()); + + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'tax_rule` + WHERE `id_tax_rules_group` = '.(int)$id_group + ); + } + + public static function getTaxRulesByGroupId($id_group) + { + if (empty($id_group)) + die(Tools::displayError()); + + $results = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'tax_rule` + WHERE `id_tax_rules_group` = '.(int)$id_group + ); + + $res = array(); + foreach ($results AS $row) + $res[$row['id_country']][$row['id_state']][$row['id_county']] = array('id_tax' => $row['id_tax'], 'state_behavior' => $row['state_behavior'], 'county_behavior' => $row['county_behavior']); + + return $res; + } + + public static function deleteTaxRuleByIdTax($id_tax) + { + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'tax_rule` + WHERE `id_tax` = '.(int)$id_tax + ); + } + + + public static function deleteTaxRuleByIdCounty($id_county) + { + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'tax_rule` + WHERE `id_county` = '.(int)$id_county + ); + } + + public static function isTaxInUse($id_tax) + { + return Db::getInstance()->getValue(' + SELECT COUNT(*) FROM `'._DB_PREFIX_.'tax_rule` WHERE `id_tax` = '.(int)$id_tax + ); + } +} + diff --git a/classes/TaxRulesGroup.php b/classes/TaxRulesGroup.php new file mode 100644 index 000000000..7a4680a40 --- /dev/null +++ b/classes/TaxRulesGroup.php @@ -0,0 +1,166 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +class TaxRulesGroupCore extends ObjectModel +{ + public $name; + + /** @var bool active state */ + public $active; + + protected $fieldsRequired = array('name'); + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('name' => 'isGenericName'); + + protected $table = 'tax_rules_group'; + protected $identifier = 'id_tax_rules_group'; + + protected static $_taxes = array(); + + public function getFields() + { + parent::validateFields(); + $fields['name'] = ($this->name); + $fields['active'] = (int)($this->active); + return $fields; + } + + public static function getTaxRulesGroups($only_active = true) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'tax_rules_group` g' + .($only_active ? ' WHERE g.`active` = 1' : '') + ); + } + + public static function getTaxRulesGroupsForOptions() + { + $tax_rules[] = array('id_tax_rules_group' => 0, 'name' => Tools::displayError('No tax')); + return array_merge($tax_rules, TaxRulesGroup::getTaxRulesGroups()); + } + + public static function getTaxes($id_tax_rules_group, $id_country, $id_state, $id_county) + { + if (empty($id_tax_rules_group) OR empty($id_country)) + return array(new Tax()); // No Tax + + if (isset(self::$_taxes[$id_tax_rules_group.'-'.$id_country.'-'.$id_state.'-'.$id_county])) + return self::$_taxes[$id_tax_rules_group.'-'.$id_country.'-'.$id_state.'-'.$id_county]; + + $rows = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'tax_rule` + WHERE `id_country` = '.(int)$id_country.' + AND `id_tax_rules_group` = '.(int)$id_tax_rules_group.' + AND `id_state` IN (0, '.(int)$id_state.') + AND `id_county` IN (0, '.(int)$id_county.') + ORDER BY `id_county` DESC, `id_state` DESC' + ); + + + $taxes = array(); + foreach ($rows AS $row) + { + if ($row['id_county'] != 0) + { + switch($row['county_behavior']) + { + case County::USE_BOTH_TAX: + $taxes[] = new Tax($row['id_tax']); + break; + + case County::USE_COUNTY_TAX: + $taxes = array(new Tax($row['id_tax'])); + break 2; + + case County::USE_STATE_TAX: // do nothing + break; + } + } + else if ($row['id_state'] != 0) + { + switch($row['state_behavior']) + { + case PS_STATE_TAX: // use only product tax + $taxes[] = new Tax($row['id_tax']); + break 2; // switch + foreach + + case PS_BOTH_TAX: + $taxes[] = new Tax($row['id_tax']); + break; + + case PS_PRODUCT_TAX: // do nothing use country tax + break; + } + } + else + $taxes[] = new Tax((int)$row['id_tax']); + } + + self::$_taxes[$id_tax_rules_group.'-'.$id_country.'-'.$id_state.'-'.$id_county] = $taxes; + return $taxes; + } + + public static function getAssociatedTaxRatesByIdCountry($id_country) + { + $rows = Db::getInstance()->ExecuteS(' + SELECT rg.`id_tax_rules_group`, t.`rate` + FROM `'._DB_PREFIX_.'tax_rules_group` rg + LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (tr.`id_tax_rules_group` = rg.`id_tax_rules_group`) + LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) + WHERE tr.`id_country` = '.(int)$id_country.' + AND tr.`id_state` = 0 + AND tr.`id_county` = 0' + ); + + $res = array(); + foreach ($rows AS $row) + $res[$row['id_tax_rules_group']] = $row['rate']; + + return $res; + } + + public static function getTaxesRate($id_tax_rules_group, $id_country, $id_state, $id_county) + { + $rate = 0; + foreach (TaxRulesGroup::getTaxes($id_tax_rules_group, $id_country, $id_state, $id_county) AS $tax) + $rate += (float)$tax->rate; + + return $rate; + } + + public static function getIdByName($name) + { + return Db::getInstance()->getValue( + 'SELECT `id_tax_rules_group` + FROM `'._DB_PREFIX_.'tax_rules_group` rg + WHERE `name` = \''.pSQL($name).'\'' + ); + } +} \ No newline at end of file diff --git a/classes/Theme.php b/classes/Theme.php new file mode 100644 index 000000000..2d552834d --- /dev/null +++ b/classes/Theme.php @@ -0,0 +1,50 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ThemeCore extends ObjectModel +{ + public $name; + + + protected $fieldsSize = array('name' => 64); + protected $fieldsValidate = array('name' => 'isGenericName'); + protected $table = 'theme'; + protected $identifier = 'id_theme'; + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + return $fields; + } + + public static function getThemes() + { + return Db::getInstance()->ExecuteS('SELECT * + FROM '._DB_PREFIX_.'theme'); + } +} diff --git a/classes/Tools.php b/classes/Tools.php new file mode 100644 index 000000000..d9919a79e --- /dev/null +++ b/classes/Tools.php @@ -0,0 +1,2186 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7521 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ToolsCore +{ + protected static $file_exists_cache = array(); + protected static $_forceCompile; + protected static $_caching; + + /** + * Random password generator + * + * @param integer $length Desired length (optional) + * @return string Password + */ + public static function passwdGen($length = 8) + { + $str = 'abcdefghijkmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + for ($i = 0, $passwd = ''; $i < $length; $i++) + $passwd .= self::substr($str, mt_rand(0, self::strlen($str) - 1), 1); + return $passwd; + } + + public static function strReplaceFirst($search, $replace, $subject, $cur=0) { + return (strpos($subject, $search, $cur))?substr_replace($subject, $replace, (int)strpos($subject, $search, $cur), strlen($search)):$subject; + } + + /** + * Redirect user to another page + * + * @param string $url Desired URL + * @param string $baseUri Base URI (optional) + */ + public static function redirect($url, $baseUri = __PS_BASE_URI__) + { + if (strpos($url, 'http://') === FALSE && strpos($url, 'https://') === FALSE) + { + global $link; + if (strpos($url, $baseUri) !== FALSE && strpos($url, $baseUri) == 0) + $url = substr($url, strlen($baseUri)); + if (strpos($url, 'index.php?controller=') !== FALSE && strpos($url, 'index.php/') == 0) { + $url = substr($url, strlen('index.php?controller=')); + if((int)(Configuration::get('PS_REWRITING_SETTINGS') == 1)) + $url = self::strReplaceFirst('&', '?' , $url); + } + + $explode = explode('?', $url); + $url = $link->getPageLink($explode[0], true); + if (isset($explode[1])) + $url .= '?'.$explode[1]; + $baseUri = ''; + } + + if (isset($_SERVER['HTTP_REFERER']) AND ($url == $_SERVER['HTTP_REFERER'])) + header('Location: '.$_SERVER['HTTP_REFERER']); + else + header('Location: '.$baseUri.$url); + exit; + } + + /** + * Redirect url wich allready PS_BASE_URI + * + * @param string $url Desired URL + */ + public static function redirectLink($url) + { + if (!preg_match('@^https?://@i', $url)) + { + global $link; + if (strpos($url, __PS_BASE_URI__) !== FALSE && strpos($url, __PS_BASE_URI__) == 0) + $url = substr($url, strlen(__PS_BASE_URI__)); + if (strpos($url, 'index.php?controller=') !== FALSE && strpos($url, 'index.php/') == 0) + $url = substr($url, strlen('index.php?controller=')); + $explode = explode('?', $url); + $url = $link->getPageLink($explode[0]); + if (isset($explode[1])) + $url .= '?'.$explode[1]; + } + + header('Location: '.$url); + exit; + } + + /** + * Redirect user to another admin page + * + * @param string $url Desired URL + */ + public static function redirectAdmin($url) + { + header('Location: '.$url); + exit; + } + + /** + * getProtocol return the set protocol according to configuration (http[s]) + * @param Boolean true if require ssl + * @return String (http|https) + */ + public static function getProtocol($use_ssl = null) + { + return (!is_null($use_ssl) && $use_ssl ? 'https://' : 'http://'); + } + + /** + * getHttpHost return the current host used, with the protocol (http or https) if $http is true + * This function should not be used to choose http or https domain name. + * Use Tools::getShopDomain() or Tools::getShopDomainSsl instead + * + * @param boolean $http + * @param boolean $entities + * @return void + */ + public static function getHttpHost($http = false, $entities = false) + { + $host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']); + if ($entities) + $host = htmlspecialchars($host, ENT_COMPAT, 'UTF-8'); + if ($http) + $host = (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$host; + return $host; + } + + /** + * getShopDomain return domain name according to configuration + * + * @param boolean $http if true, return domain name with protocol + * @param boolean $entities if true, + * @return void + */ + public static function getShopDomain($http = false, $entities = false) + { + if (!$domain = ShopUrl::getMainShopDomain()) + $domain = self::getHttpHost(); + if ($entities) + $domain = htmlspecialchars($domain, ENT_COMPAT, 'UTF-8'); + if ($http) + $domain = 'http://'.$domain; + return $domain; + } + + public static function getShopDomainSsl($http = false, $entities = false) + { + if (!$domain = ShopUrl::getMainShopDomainSSL()) + $domain = self::getHttpHost(); + if ($entities) + $domain = htmlspecialchars($domain, ENT_COMPAT, 'UTF-8'); + if ($http) + $domain = (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$domain; + return $domain; + } + + /** + * Get the server variable SERVER_NAME + * + * @param string $referrer URL referrer + */ + static function getServerName() + { + if (isset($_SERVER['HTTP_X_FORWARDED_SERVER']) AND $_SERVER['HTTP_X_FORWARDED_SERVER']) + return $_SERVER['HTTP_X_FORWARDED_SERVER']; + return $_SERVER['SERVER_NAME']; + } + + /** + * Get the server variable REMOTE_ADDR, or the first ip of HTTP_X_FORWARDED_FOR (when using proxy) + * + * @return string $remote_addr ip of client + */ + static function getRemoteAddr() + { + // This condition is necessary when using CDN, don't remove it. + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR'] AND (!isset($_SERVER['REMOTE_ADDR']) OR preg_match('/^127\..*/i', trim($_SERVER['REMOTE_ADDR'])) OR preg_match('/^172\.16.*/i', trim($_SERVER['REMOTE_ADDR'])) OR preg_match('/^192\.168\.*/i', trim($_SERVER['REMOTE_ADDR'])) OR preg_match('/^10\..*/i', trim($_SERVER['REMOTE_ADDR'])))) + { + if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')) + { + $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); + return $ips[0]; + } + else + return $_SERVER['HTTP_X_FORWARDED_FOR']; + } + return $_SERVER['REMOTE_ADDR']; + } + + /** + * Check if the current page use SSL connection on not + */ + public static function usingSecureMode() + { + return !(empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) == 'off'); + } + + /** + * Get the current url prefix protocole (https/http) + */ + public static function getCurrentUrlProtocolPrefix() + { + if(Tools::usingSecureMode()) + return 'https://'; + else + return 'http://'; + } + + /** + * Secure an URL referrer + * + * @param string $referrer URL referrer + */ + public static function secureReferrer($referrer) + { + if (preg_match('/^http[s]?:\/\/'.self::getServerName().'(:'._PS_SSL_PORT_.')?\/.*$/Ui', $referrer)) + return $referrer; + return __PS_BASE_URI__; + } + + /** + * Get a value from $_POST / $_GET + * if unavailable, take a default value + * + * @param string $key Value key + * @param mixed $defaultValue (optional) + * @return mixed Value + */ + public static function getValue($key, $defaultValue = false) + { + if (!isset($key) OR empty($key) OR !is_string($key)) + return false; + $ret = (isset($_POST[$key]) ? $_POST[$key] : (isset($_GET[$key]) ? $_GET[$key] : $defaultValue)); + + if (is_string($ret) === true) + $ret = urldecode(preg_replace('/((\%5C0+)|(\%00+))/i', '', urlencode($ret))); + return !is_string($ret)? $ret : stripslashes($ret); + } + + public static function getIsset($key) + { + if (!isset($key) OR empty($key) OR !is_string($key)) + return false; + return isset($_POST[$key]) ? true : (isset($_GET[$key]) ? true : false); + } + + /** + * Change language in cookie while clicking on a flag + */ + public static function setCookieLanguage() + { + global $cookie; + + /* If language does not exist or is disabled, erase it */ + if ($cookie->id_lang) + { + $lang = new Language((int)$cookie->id_lang); + if (!Validate::isLoadedObject($lang) OR !$lang->active OR !$lang->isAssociatedToShop()) + $cookie->id_lang = NULL; + } + + /* Automatically detect language if not already defined */ + if (!$cookie->id_lang AND isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) + { + $array = explode(',', self::strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); + if (self::strlen($array[0]) > 2) + { + $tab = explode('-', $array[0]); + $string = $tab[0]; + } + else + $string = $array[0]; + if (Validate::isLanguageIsoCode($string)) + { + $lang = new Language((int)(Language::getIdByIso($string))); + if (Validate::isLoadedObject($lang) AND $lang->active) + $cookie->id_lang = (int)($lang->id); + } + } + + /* If language file not present, you must use default language file */ + if (!$cookie->id_lang OR !Validate::isUnsignedId($cookie->id_lang)) + $cookie->id_lang = (int)(Configuration::get('PS_LANG_DEFAULT')); + + $iso = Language::getIsoById((int)$cookie->id_lang); + @include_once(_PS_THEME_DIR_.'lang/'.$iso.'.php'); + + return $iso; + } + + public static function switchLanguage() + { + global $cookie; + + if ($id_lang = (int)(self::getValue('id_lang')) AND Validate::isUnsignedId($id_lang)) + $cookie->id_lang = $id_lang; + } + + public static function setCurrency() + { + global $cookie; + + if (self::isSubmit('SubmitCurrency')) + if (isset($_POST['id_currency']) AND is_numeric($_POST['id_currency'])) + { + $currency = Currency::getCurrencyInstance((int)($_POST['id_currency'])); + if (is_object($currency) AND $currency->id AND !$currency->deleted AND $currency->isAssociatedToShop()) + $cookie->id_currency = (int)($currency->id); + } + + if ((int)$cookie->id_currency) + { + $currency = Currency::getCurrencyInstance((int)$cookie->id_currency); + if (is_object($currency) AND (int)$currency->id AND (int)$currency->deleted != 1 AND $currency->active AND $currency->isAssociatedToShop()) + return $currency; + } + $currency = Currency::getCurrencyInstance((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + if (is_object($currency) AND $currency->id) + $cookie->id_currency = (int)($currency->id); + return $currency; + } + + /** + * Return price with currency sign for a given product + * + * @param float $price Product price + * @param object $currency Current currency (object, id_currency, NULL => getCurrent()) + * @return string Price correctly formated (sign, decimal separator...) + */ + public static function displayPrice($price, $currency = NULL, $no_utf8 = false) + { + if ($currency === NULL) + $currency = Currency::getCurrent(); + /* if you modified this function, don't forget to modify the Javascript function formatCurrency (in tools.js) */ + if (is_int($currency)) + $currency = Currency::getCurrencyInstance((int)($currency)); + $c_char = (is_array($currency) ? $currency['sign'] : $currency->sign); + $c_format = (is_array($currency) ? $currency['format'] : $currency->format); + $c_decimals = (is_array($currency) ? (int)($currency['decimals']) : (int)($currency->decimals)) * _PS_PRICE_DISPLAY_PRECISION_; + $c_blank = (is_array($currency) ? $currency['blank'] : $currency->blank); + $blank = ($c_blank ? ' ' : ''); + $ret = 0; + if (($isNegative = ($price < 0))) + $price *= -1; + $price = self::ps_round($price, $c_decimals); + switch ($c_format) + { + /* X 0,000.00 */ + case 1: + $ret = $c_char.$blank.number_format($price, $c_decimals, '.', ','); + break; + /* 0 000,00 X*/ + case 2: + $ret = number_format($price, $c_decimals, ',', ' ').$blank.$c_char; + break; + /* X 0.000,00 */ + case 3: + $ret = $c_char.$blank.number_format($price, $c_decimals, ',', '.'); + break; + /* 0,000.00 X */ + case 4: + $ret = number_format($price, $c_decimals, '.', ',').$blank.$c_char; + break; + } + if ($isNegative) + $ret = '-'.$ret; + if ($no_utf8) + return str_replace('€', chr(128), $ret); + return $ret; + } + + public static function displayPriceSmarty($params, &$smarty) + { + if (array_key_exists('currency', $params)) + { + $currency = Currency::getCurrencyInstance((int)($params['currency'])); + if (Validate::isLoadedObject($currency)) + return self::displayPrice($params['price'], $currency, false); + } + return self::displayPrice($params['price']); + } + + /** + * Return price converted + * + * @param float $price Product price + * @param object $currency Current currency object + * @param boolean $to_currency convert to currency or from currency to default currency + */ + public static function convertPrice($price, $currency = NULL, $to_currency = true) + { + if ($currency === NULL) + $currency = Currency::getCurrent(); + elseif (is_numeric($currency)) + $currency = Currency::getCurrencyInstance($currency); + + $c_id = (is_array($currency) ? $currency['id_currency'] : $currency->id); + $c_rate = (is_array($currency) ? $currency['conversion_rate'] : $currency->conversion_rate); + + if ($c_id != (int)(Configuration::get('PS_CURRENCY_DEFAULT'))) + { + if ($to_currency) + $price *= $c_rate; + else + $price /= $c_rate; + } + + return $price; + } + + + + /** + * Display date regarding to language preferences + * + * @param array $params Date, format... + * @param object $smarty Smarty object for language preferences + * @return string Date + */ + public static function dateFormat($params, &$smarty) + { + return self::displayDate($params['date'], $smarty->ps_language->id, (isset($params['full']) ? $params['full'] : false)); + } + + /** + * Display date regarding to language preferences + * + * @param string $date Date to display format UNIX + * @param integer $id_lang Language id + * @param boolean $full With time or not (optional) + * @return string Date + */ + public static function displayDate($date, $id_lang, $full = false, $separator='-') + { + if (!$date OR !strtotime($date)) + return $date; + if (!Validate::isDate($date) OR !Validate::isBool($full)) + die (self::displayError('Invalid date')); + $tmpTab = explode($separator, substr($date, 0, 10)); + $hour = ' '.substr($date, -8); + + $language = Language::getLanguage((int)($id_lang)); + if ($language AND strtolower($language['iso_code']) == 'fr') + return ($tmpTab[2].'-'.$tmpTab[1].'-'.$tmpTab[0].($full ? $hour : '')); + else + return ($tmpTab[0].'-'.$tmpTab[1].'-'.$tmpTab[2].($full ? $hour : '')); + } + + /** + * Sanitize a string + * + * @param string $string String to sanitize + * @param boolean $full String contains HTML or not (optional) + * @return string Sanitized string + */ + public static function safeOutput($string, $html = false) + { + if (!$html) + $string = @htmlentities(strip_tags($string), ENT_QUOTES, 'utf-8'); + return $string; + } + + public static function htmlentitiesUTF8($string, $type = ENT_QUOTES) + { + if (is_array($string)) + return array_map(array('Tools', 'htmlentitiesUTF8'), $string); + return htmlentities($string, $type, 'utf-8'); + } + + public static function htmlentitiesDecodeUTF8($string) + { + if (is_array($string)) + return array_map(array('Tools', 'htmlentitiesDecodeUTF8'), $string); + return html_entity_decode($string, ENT_QUOTES, 'utf-8'); + } + + public static function safePostVars() + { + $_POST = array_map(array('Tools', 'htmlentitiesUTF8'), $_POST); + } + + /** + * Delete directory and subdirectories + * + * @param string $dirname Directory name + */ + public static function deleteDirectory($dirname, $delete_self = true) + { + $dirname = rtrim($dirname, '/').'/'; + $files = scandir($dirname); + foreach ($files as $file) + if ($file != '.' AND $file != '..') + { + if (is_dir($dirname.$file)) + self::deleteDirectory($dirname.$file, true); + elseif (file_exists($dirname.$file)) + unlink($dirname.$file); + else + p('Unable to delete '.$dirname.$file); + } + if($delete_self) + rmdir($dirname); + } + + /** + * Display an error according to an error code + * + * @param integer $code Error code + */ + public static function displayError($string = 'Fatal error', $htmlentities = true) + { + global $_ERRORS, $cookie; + + $iso = strtolower(Language::getIsoById((is_object($cookie) AND $cookie->id_lang) ? (int)$cookie->id_lang : (int)Configuration::get('PS_LANG_DEFAULT'))); + @include_once(_PS_TRANSLATIONS_DIR_.$iso.'/errors.php'); + + if (defined('_PS_MODE_DEV_') AND _PS_MODE_DEV_ AND $string == 'Fatal error') + return ('
'.print_r(debug_backtrace(), true).'
'); + if (!is_array($_ERRORS)) + return str_replace('"', '"', $string); + $key = md5(str_replace('\'', '\\\'', $string)); + $str = (isset($_ERRORS) AND is_array($_ERRORS) AND key_exists($key, $_ERRORS)) ? ($htmlentities ? htmlentities($_ERRORS[$key], ENT_COMPAT, 'UTF-8') : $_ERRORS[$key]) : $string; + return str_replace('"', '"', stripslashes($str)); + } + + /** + * Display an error with detailed object + * + * @param mixed $object + * @param boolean $kill + * @return $object if $kill = false; + */ + public static function dieObject($object, $kill = true) + { + echo '
';
+		print_r($object);
+		echo '

'; + if ($kill) + die('END'); + return $object; + } + + /** + * ALIAS OF dieObject() - Display an error with detailed object + * + * @param object $object Object to display + */ + public static function d($object, $kill = true) + { + return (self::dieObject($object, $kill = true)); + } + + /** + * ALIAS OF dieObject() - Display an error with detailed object but don't stop the execution + * + * @param object $object Object to display + */ + public static function p($object) + { + return (self::dieObject($object, false)); + } + + /** + * Check if submit has been posted + * + * @param string $submit submit name + */ + public static function isSubmit($submit) + { + return ( + isset($_POST[$submit]) OR isset($_POST[$submit.'_x']) OR isset($_POST[$submit.'_y']) + OR isset($_GET[$submit]) OR isset($_GET[$submit.'_x']) OR isset($_GET[$submit.'_y']) + ); + } + + /** + * Get meta tages for a given page + * + * @param integer $id_lang Language id + * @return array Meta tags + */ + public static function getMetaTags($id_lang, $page_name) + { + global $maintenance; + + if (!(isset($maintenance) AND (!in_array(Tools::getRemoteAddr(), explode(',', Configuration::get('PS_MAINTENANCE_IP')))))) + { + /* Products specifics meta tags */ + if ($id_product = self::getValue('id_product')) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`) + WHERE pl.id_lang = '.(int)($id_lang).' AND pl.id_product = '.(int)($id_product).' AND p.active = 1'); + if ($row) + { + if (empty($row['meta_description'])) + $row['meta_description'] = strip_tags($row['description_short']); + return self::completeMetaTags($row, $row['name']); + } + } + + /* Categories specifics meta tags */ + elseif ($id_category = self::getValue('id_category')) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description` + FROM `'._DB_PREFIX_.'category_lang` + WHERE id_lang = '.(int)($id_lang).' AND id_category = '.(int)($id_category)); + if ($row) + { + if (empty($row['meta_description'])) + $row['meta_description'] = strip_tags($row['description']); + return self::completeMetaTags($row, $row['name']); + } + } + + /* Manufacturers specifics meta tags */ + elseif ($id_manufacturer = self::getValue('id_manufacturer')) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name`, `meta_title`, `meta_description`, `meta_keywords` + FROM `'._DB_PREFIX_.'manufacturer_lang` ml + LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (ml.`id_manufacturer` = m.`id_manufacturer`) + WHERE ml.id_lang = '.(int)($id_lang).' AND ml.id_manufacturer = '.(int)($id_manufacturer)); + if ($row) + { + if (empty($row['meta_description'])) + $row['meta_description'] = strip_tags($row['meta_description']); + if (!empty($row['meta_title'])) + $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME'); + return self::completeMetaTags($row, $row['name']); + } + } + + /* Suppliers specifics meta tags */ + elseif ($id_supplier = self::getValue('id_supplier')) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name`, `meta_title`, `meta_description`, `meta_keywords` + FROM `'._DB_PREFIX_.'supplier_lang` sl + LEFT JOIN `'._DB_PREFIX_.'supplier` s ON (sl.`id_supplier` = s.`id_supplier`) + WHERE sl.id_lang = '.(int)($id_lang).' AND sl.id_supplier = '.(int)($id_supplier)); + + if ($row) + { + if (empty($row['meta_description'])) + $row['meta_description'] = strip_tags($row['meta_description']); + if (!empty($row['meta_title'])) + $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME'); + return self::completeMetaTags($row, $row['name']); + } + } + + /* CMS specifics meta tags */ + elseif ($id_cms = self::getValue('id_cms')) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `meta_title`, `meta_description`, `meta_keywords` + FROM `'._DB_PREFIX_.'cms_lang` + WHERE id_lang = '.(int)($id_lang).' AND id_cms = '.(int)($id_cms)); + if ($row) + { + $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME'); + return self::completeMetaTags($row, $row['meta_title']); + } + } + + /* CMS category specifics meta tags */ + elseif ($id_cms = self::getValue('id_cms_category')) + { + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `meta_title`, `meta_description`, `meta_keywords` + FROM `'._DB_PREFIX_.'cms_category_lang` + WHERE id_lang = '.(int)($id_lang).' AND id_cms_category = '.(int)($id_cms)); + if ($row) + { + $row['meta_title'] = $row['meta_title'].' - '.Configuration::get('PS_SHOP_NAME'); + return self::completeMetaTags($row, $row['meta_title']); + } + } + } + + /* Default meta tags */ + return self::getHomeMetaTags($id_lang, $page_name); + } + + /** + * Get meta tags for a given page + * + * @param integer $id_lang Language id + * @return array Meta tags + */ + public static function getHomeMetaTags($id_lang, $page_name) + { + global $cookie; + + /* Metas-tags */ + $metas = Meta::getMetaByPage($page_name, $id_lang); + $ret['meta_title'] = (isset($metas['title']) AND $metas['title']) ? $metas['title'].' - '.Configuration::get('PS_SHOP_NAME') : Configuration::get('PS_SHOP_NAME'); + $ret['meta_description'] = (isset($metas['description']) AND $metas['description']) ? $metas['description'] : ''; + $ret['meta_keywords'] = (isset($metas['keywords']) AND $metas['keywords']) ? $metas['keywords'] : ''; + return $ret; + } + + + public static function completeMetaTags($metaTags, $defaultValue) + { + global $cookie; + + if ($metaTags['meta_title'] == NULL) + $metaTags['meta_title'] = $defaultValue.' - '.Configuration::get('PS_SHOP_NAME'); + if ($metaTags['meta_description'] == NULL) + $metaTags['meta_description'] = Configuration::get('PS_META_DESCRIPTION', (int)($cookie->id_lang)) ? Configuration::get('PS_META_DESCRIPTION', (int)($cookie->id_lang)) : ''; + if ($metaTags['meta_keywords'] == NULL) + $metaTags['meta_keywords'] = Configuration::get('PS_META_KEYWORDS', (int)($cookie->id_lang)) ? Configuration::get('PS_META_KEYWORDS', (int)($cookie->id_lang)) : ''; + return $metaTags; + } + + /** + * Encrypt password + * + * @param object $object Object to display + */ + public static function encrypt($passwd) + { + return md5(pSQL(_COOKIE_KEY_.$passwd)); + } + + /** + * Get token to prevent CSRF + * + * @param string $token token to encrypt + */ + public static function getToken($page = true) + { + global $cookie; + if ($page === true) + return (self::encrypt($cookie->id_customer.$cookie->passwd.$_SERVER['SCRIPT_NAME'])); + else + return (self::encrypt($cookie->id_customer.$cookie->passwd.$page)); + } + + /** + * Encrypt password + * + * @param object $object Object to display + */ + public static function getAdminToken($string) + { + return !empty($string) ? self::encrypt($string) : false; + } + public static function getAdminTokenLite($tab) + { + global $cookie; + return Tools::getAdminToken($tab.(int)Tab::getIdFromClassName($tab).(int)$cookie->id_employee); + } + + /** + * Get the user's journey + * + * @param integer $id_category Category ID + * @param string $path Path end + * @param boolean $linkOntheLastItem Put or not a link on the current category + * @param string [optionnal] $categoryType defined what type of categories is used (products or cms) + */ + public static function getPath($id_category, $path = '', $linkOntheLastItem = false, $categoryType = 'products') + { + global $link, $cookie; + + if ($id_category == 1) + return ''.$path.''; + + $pipe = Configuration::get('PS_NAVIGATION_PIPE'); + if (empty($pipe)) + $pipe = '>'; + + $fullPath = ''; + + if ($categoryType === 'products') + { + $category = Db::getInstance()->getRow(' + SELECT id_category, level_depth, nleft, nright + FROM '._DB_PREFIX_.'category + WHERE id_category = '.(int)$id_category); + + if (isset($category['id_category'])) + { + $categories = Db::getInstance()->ExecuteS(' + SELECT c.id_category, cl.name, cl.link_rewrite + FROM '._DB_PREFIX_.'category c + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category) + WHERE c.nleft <= '.(int)$category['nleft'].' AND c.nright >= '.(int)$category['nright'].' AND cl.id_lang = '.(int)($cookie->id_lang).' AND c.id_category != 1 + ORDER BY c.level_depth ASC + LIMIT '.(int)$category['level_depth']); + + $n = 1; + $nCategories = (int)sizeof($categories); + foreach ($categories AS $category) + { + $fullPath .= + (($n < $nCategories OR $linkOntheLastItem) ? '' : ''). + htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8'). + (($n < $nCategories OR $linkOntheLastItem) ? '' : ''). + (($n++ != $nCategories OR !empty($path)) ? ''.$pipe.'' : ''); + } + + return $fullPath.$path; + } + } + elseif ($categoryType === 'CMS') + { + $category = new CMSCategory((int)($id_category), (int)($cookie->id_lang)); + if (!Validate::isLoadedObject($category)) + die(self::displayError()); + $categoryLink = $link->getCMSCategoryLink($category); + + if ($path != $category->name) + $fullPath .= ''.htmlentities($category->name, ENT_NOQUOTES, 'UTF-8').''.$pipe.''.$path; + else + $fullPath = ($linkOntheLastItem ? '' : '').htmlentities($path, ENT_NOQUOTES, 'UTF-8').($linkOntheLastItem ? '' : ''); + + return self::getPath((int)($category->id_parent), $fullPath, $linkOntheLastItem, $categoryType); + } + } + + /** + * @param string [optionnal] $type_cat defined what type of categories is used (products or cms) + */ + public static function getFullPath($id_category, $end, $type_cat = 'products') + { + global $cookie; + + $pipe = (Configuration::get('PS_NAVIGATION_PIPE') ? Configuration::get('PS_NAVIGATION_PIPE') : '>'); + + if($type_cat === 'products') + $category = new Category((int)($id_category), (int)($cookie->id_lang)); + else if ($type_cat === 'CMS') + $category = new CMSCategory((int)($id_category), (int)($cookie->id_lang)); + + if (!Validate::isLoadedObject($category)) + $id_category = 1; + if ($id_category == 1) + return htmlentities($end, ENT_NOQUOTES, 'UTF-8'); + + return self::getPath($id_category, $category->name, true, $type_cat).''.$pipe.' '.htmlentities($end, ENT_NOQUOTES, 'UTF-8').''; + } + + /** + * @deprecated + */ + public static function getCategoriesTotal() + { + Tools::displayAsDeprecated(); + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT COUNT(`id_category`) AS total FROM `'._DB_PREFIX_.'category`'); + return (int)($row['total']); + } + + /** + * @deprecated + */ + public static function getProductsTotal() + { + Tools::displayAsDeprecated(); + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT COUNT(`id_product`) AS total FROM `'._DB_PREFIX_.'product`'); + return (int)($row['total']); + } + + /** + * @deprecated + */ + public static function getCustomersTotal() + { + Tools::displayAsDeprecated(); + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT COUNT(`id_customer`) AS total FROM `'._DB_PREFIX_.'customer`'); + return (int)($row['total']); + } + + /** + * @deprecated + */ + public static function getOrdersTotal() + { + Tools::displayAsDeprecated(); + $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT COUNT(`id_order`) AS total FROM `'._DB_PREFIX_.'orders`'); + return (int)($row['total']); + } + + /* + ** Historyc translation function kept for compatibility + ** Removing soon + */ + public static function historyc_l($key, $translations) + { + global $cookie; + if (!$translations OR !is_array($translations)) + die(self::displayError()); + $iso = strtoupper(Language::getIsoById($cookie->id_lang)); + $lang = key_exists($iso, $translations) ? $translations[$iso] : false; + return (($lang AND is_array($lang) AND key_exists($key, $lang)) ? stripslashes($lang[$key]) : $key); + } + + + /** + * Return the friendly url from the provided string + * + * @param string $str + * @param bool $utf8_decode => needs to be marked as deprecated + * @return string + */ + public static function link_rewrite($str, $utf8_decode = false) + { + return self::str2url($str); + } + + /** + * Return a friendly url made from the provided string + * If the mbstring library is available, the output is the same as the js function of the same name + * + * @param string $str + * @return string + */ + public static function str2url($str) + { + if (function_exists('mb_strtolower')) + $str = mb_strtolower($str, 'utf-8'); + + $str = trim($str); + $str = preg_replace('/[\x{0105}\x{0104}\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}]/u','a', $str); + $str = preg_replace('/[\x{00E7}\x{010D}\x{0107}\x{0106}]/u','c', $str); + $str = preg_replace('/[\x{010F}]/u','d', $str); + $str = preg_replace('/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{011B}\x{0119}\x{0118}]/u','e', $str); + $str = preg_replace('/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}]/u','i', $str); + $str = preg_replace('/[\x{0142}\x{0141}\x{013E}\x{013A}]/u','l', $str); + $str = preg_replace('/[\x{00F1}\x{0148}]/u','n', $str); + $str = preg_replace('/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}\x{00D3}]/u','o', $str); + $str = preg_replace('/[\x{0159}\x{0155}]/u','r', $str); + $str = preg_replace('/[\x{015B}\x{015A}\x{0161}]/u','s', $str); + $str = preg_replace('/[\x{00DF}]/u','ss', $str); + $str = preg_replace('/[\x{0165}]/u','t', $str); + $str = preg_replace('/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{016F}]/u','u', $str); + $str = preg_replace('/[\x{00FD}\x{00FF}]/u','y', $str); + $str = preg_replace('/[\x{017C}\x{017A}\x{017B}\x{0179}\x{017E}]/u','z', $str); + $str = preg_replace('/[\x{00E6}]/u','ae', $str); + $str = preg_replace('/[\x{0153}]/u','oe', $str); + + // Remove all non-whitelist chars. + $str = preg_replace('/[^a-zA-Z0-9\s\'\:\/\[\]-]/','', $str); + $str = preg_replace('/[\s\'\:\/\[\]-]+/',' ', $str); + $str = preg_replace('/[ ]/','-', $str); + $str = preg_replace('/[\/]/','-', $str); + + // If it was not possible to lowercase the string with mb_strtolower, we do it after the transformations. + // This way we lose fewer special chars. + $str = strtolower($str); + + return $str; + } + + /** + * Truncate strings + * + * @param string $str + * @param integer $maxLen Max length + * @param string $suffix Suffix optional + * @return string $str truncated + */ + /* CAUTION : Use it only on module hookEvents. + ** For other purposes use the smarty function instead */ + public static function truncate($str, $maxLen, $suffix = '...') + { + if (self::strlen($str) <= $maxLen) + return $str; + $str = utf8_decode($str); + return (utf8_encode(substr($str, 0, $maxLen - self::strlen($suffix)).$suffix)); + } + + /** + * Generate date form + * + * @param integer $year Year to select + * @param integer $month Month to select + * @param integer $day Day to select + * @return array $tab html data with 3 cells :['days'], ['months'], ['years'] + * + */ + public static function dateYears() + { + for ($i = date('Y') - 10; $i >= 1900; $i--) + $tab[] = $i; + return $tab; + } + + public static function dateDays() + { + for ($i = 1; $i != 32; $i++) + $tab[] = $i; + return $tab; + } + + public static function dateMonths() + { + for ($i = 1; $i != 13; $i++) + $tab[$i] = date('F', mktime(0, 0, 0, $i, date('m'), date('Y'))); + return $tab; + } + + public static function hourGenerate($hours, $minutes, $seconds) + { + return implode(':', array($hours, $minutes, $seconds)); + } + + public static function dateFrom($date) + { + $tab = explode(' ', $date); + if (!isset($tab[1])) + $date .= ' ' . self::hourGenerate(0, 0, 0); + return $date; + } + + public static function dateTo($date) + { + $tab = explode(' ', $date); + if (!isset($tab[1])) + $date .= ' ' . self::hourGenerate(23, 59, 59); + return $date; + } + + /** + * @deprecated + */ + public static function getExactTime() + { + Tools::displayAsDeprecated(); + return time()+microtime(); + } + + static function strtolower($str) + { + if (is_array($str)) + return false; + if (function_exists('mb_strtolower')) + return mb_strtolower($str, 'utf-8'); + return strtolower($str); + } + + static function strlen($str, $encoding = 'UTF-8') + { + if (is_array($str)) + return false; + $str = html_entity_decode($str, ENT_COMPAT, 'UTF-8'); + if (function_exists('mb_strlen')) + return mb_strlen($str, $encoding); + return strlen($str); + } + + static function stripslashes($string) + { + if (_PS_MAGIC_QUOTES_GPC_) + $string = stripslashes($string); + return $string; + } + + static function strtoupper($str) + { + if (is_array($str)) + return false; + if (function_exists('mb_strtoupper')) + return mb_strtoupper($str, 'utf-8'); + return strtoupper($str); + } + + static function substr($str, $start, $length = false, $encoding = 'utf-8') + { + if (is_array($str)) + return false; + if (function_exists('mb_substr')) + return mb_substr($str, (int)($start), ($length === false ? self::strlen($str) : (int)($length)), $encoding); + return substr($str, $start, ($length === false ? self::strlen($str) : (int)($length))); + } + + static function ucfirst($str) + { + return self::strtoupper(self::substr($str, 0, 1)).self::substr($str, 1); + } + + public static function orderbyPrice(&$array, $orderWay) + { + foreach($array as &$row) + $row['price_tmp'] = Product::getPriceStatic($row['id_product'], true, ((isset($row['id_product_attribute']) AND !empty($row['id_product_attribute'])) ? (int)($row['id_product_attribute']) : NULL), 2); + if(strtolower($orderWay) == 'desc') + uasort($array, 'cmpPriceDesc'); + else + uasort($array, 'cmpPriceAsc'); + foreach($array as &$row) + unset($row['price_tmp']); + } + + public static function iconv($from, $to, $string) + { + if (function_exists('iconv')) + return iconv($from, $to.'//TRANSLIT', str_replace('¥', '¥', str_replace('£', '£', str_replace('€', '€', $string)))); + return html_entity_decode(htmlentities($string, ENT_NOQUOTES, $from), ENT_NOQUOTES, $to); + } + + public static function isEmpty($field) + { + return ($field === '' OR $field === NULL); + } + + /** + * @deprecated + **/ + public static function getTimezones($select = false) + { + Tools::displayAsDeprecated(); + + static $_cache = 0; + + // One select + if ($select) + { + // No cache + if (!$_cache) + { + $tmz = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('SELECT `name` FROM '._DB_PREFIX_.'timezone WHERE id_timezone = '.(int)($select)); + $_cache = $tmz['name']; + } + return $_cache; + } + + // Multiple select + $tmz = Db::getInstance(_PS_USE_SQL_SLAVE_)->s('SELECT * FROM '._DB_PREFIX_.'timezone'); + $tab = array(); + foreach ($tmz as $timezone) + $tab[$timezone['id_timezone']] = str_replace('_', ' ', $timezone['name']); + return $tab; + } + + /** + * @deprecated + **/ + public static function ps_set_magic_quotes_runtime($var) + { + Tools::displayAsDeprecated(); + + if (function_exists('set_magic_quotes_runtime')) + set_magic_quotes_runtime($var); + } + + public static function ps_round($value, $precision = 0) + { + $method = (int)(Configuration::get('PS_PRICE_ROUND_MODE')); + if ($method == PS_ROUND_UP) + return Tools::ceilf($value, $precision); + elseif ($method == PS_ROUND_DOWN) + return Tools::floorf($value, $precision); + return round($value, $precision); + } + + public static function ceilf($value, $precision = 0) + { + $precisionFactor = $precision == 0 ? 1 : pow(10, $precision); + $tmp = $value * $precisionFactor; + $tmp2 = (string)$tmp; + // If the current value has already the desired precision + if (strpos($tmp2, '.') === false) + return ($value); + if ($tmp2[strlen($tmp2) - 1] == 0) + return $value; + return ceil($tmp) / $precisionFactor; + } + + public static function floorf($value, $precision = 0) + { + $precisionFactor = $precision == 0 ? 1 : pow(10, $precision); + $tmp = $value * $precisionFactor; + $tmp2 = (string)$tmp; + // If the current value has already the desired precision + if (strpos($tmp2, '.') === false) + return ($value); + if ($tmp2[strlen($tmp2) - 1] == 0) + return $value; + return floor($tmp) / $precisionFactor; + } + + /** + * file_exists() wrapper with cache to speedup performance + * + * @param string $filename File name + * @return boolean Cached result of file_exists($filename) + */ + public static function file_exists_cache($filename) + { + if (!isset(self::$file_exists_cache[$filename])) + self::$file_exists_cache[$filename] = file_exists($filename); + return self::$file_exists_cache[$filename]; + } + + public static function file_get_contents($url, $useIncludePath = false, $streamContext = NULL) + { + if (in_array(ini_get('allow_url_fopen'), array('On', 'on', '1'))) + return file_get_contents($url, $useIncludePath, $streamContext); + else if (function_exists('curl_init')) + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_URL, $url); + $content = curl_exec($curl); + curl_close($curl); + return $content; + } + else + return false; + } + + public static function minifyHTML($html_content) + { + if (strlen($html_content) > 0) + { + //set an alphabetical order for args + $html_content = preg_replace_callback( + '/(<[a-zA-Z0-9]+)((\s?[a-zA-Z0-9]+=[\"\\\'][^\"\\\']*[\"\\\']\s?)*)>/' + ,array('Tools', 'minifyHTMLpregCallback') + ,$html_content); + + require_once(_PS_TOOL_DIR_.'minify_html/minify_html.class.php'); + $html_content = str_replace(chr(194) . chr(160), ' ', $html_content); + $html_content = Minify_HTML::minify($html_content, array('xhtml', 'cssMinifier', 'jsMinifier')); + + if (Configuration::get('PS_HIGH_HTML_THEME_COMPRESSION')) + { + //$html_content = preg_replace('/"([^\>\s"]*)"/i', '$1', $html_content);//FIXME create a js bug + $html_content = preg_replace('/]*dtd\">/is', '', $html_content); + $html_content = preg_replace('/\s\>/is', '>', $html_content); + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('', '', $html_content); + //$html_content = str_replace('

', '', $html_content);//FIXME doesnt work... + $html_content = str_replace("\n", '', $html_content);//TODO with bellow + $html_content = str_replace('', '', $html_content); + $html_content = str_replace('
- '. + Tools::displayError('You will be redirected to your cart in a few seconds.')) : ''); + } + elseif (!$updateQuantity) + { + if (Tools::getValue('ajax') == 'true') + die('{"hasError" : true, "errors" : ["'.Tools::displayError('You already have the maximum quantity available for this product.', false).'"]}'); + else + $this->errors[] = Tools::displayError('You already have the maximum quantity available for this product.') + .((isset($_SERVER['HTTP_REFERER']) AND basename($_SERVER['HTTP_REFERER']) == 'order.php' OR (!Tools::isSubmit('ajax') AND substr(basename($_SERVER['REQUEST_URI']),0, strlen('cart.php')) == 'cart.php')) ? ('
- '. + Tools::displayError('You will be redirected to your cart in a few seconds.')) : ''); + } + } + } + elseif ($delete) + { + if (self::$cart->deleteProduct((int)($idProduct), (int)($idProductAttribute), (int)($customizationId))) + if (!Cart::getNbProducts((int)(self::$cart->id))) + { + self::$cart->id_carrier = 0; + self::$cart->gift = 0; + self::$cart->gift_message = ''; + self::$cart->update(); + } + } + } + $discounts = self::$cart->getDiscounts(); + foreach($discounts AS $discount) + { + $discountObj = new Discount((int)($discount['id_discount']), (int)(self::$cookie->id_lang)); + + if ($error = self::$cart->checkDiscountValidity($discountObj, $discounts, self::$cart->getOrderTotal(true, Cart::ONLY_PRODUCTS), self::$cart->getProducts(), false, (int)$this->id_current_group_shop, (int)$this->id_current_shop)) + { + self::$cart->deleteDiscount((int)($discount['id_discount'])); + self::$cart->update(); + $errors[] = $error; + } + } + if (!sizeof($this->errors)) + { + $queryString = Tools::safeOutput(Tools::getValue('query', NULL)); + if ($queryString AND !Configuration::get('PS_CART_REDIRECT')) + Tools::redirect('index.php?controller=search&search='.$queryString); + if (isset($_SERVER['HTTP_REFERER'])) + { + // Redirect to previous page + preg_match('!http(s?)://(.*)/(.*)!', $_SERVER['HTTP_REFERER'], $regs); + if (isset($regs[3]) AND !Configuration::get('PS_CART_REDIRECT') AND Tools::getValue('ajax') != 'true') + Tools::redirect($_SERVER['HTTP_REFERER']); + } + } + } + if (Tools::getValue('ajax') != 'true' AND !sizeof($this->errors)) + Tools::redirect('index.php?controller=order&'.(isset($idProduct) ? 'ipa='.(int)($idProduct) : '')); + + } + } + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'errors.tpl'); + } +} diff --git a/controllers/CategoryController.php b/controllers/CategoryController.php new file mode 100644 index 000000000..513c94a17 --- /dev/null +++ b/controllers/CategoryController.php @@ -0,0 +1,170 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7331 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CategoryControllerCore extends FrontController +{ + protected $category; + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(array( + _PS_CSS_DIR_.'jquery.cluetip.css' => 'all', + _THEME_CSS_DIR_.'scenes.css' => 'all', + _THEME_CSS_DIR_.'category.css' => 'all', + _THEME_CSS_DIR_.'product_list.css' => 'all')); + + if (Configuration::get('PS_COMPARATOR_MAX_ITEM') > 0) + Tools::addJS(_THEME_JS_DIR_.'products-comparison.js'); + } + + public function displayHeader() + { + parent::displayHeader(); + $this->productSort(); + } + + public function preProcess() + { + if ($id_category = (int)Tools::getValue('id_category')) + $this->category = new Category($id_category, self::$cookie->id_lang, (int)$this->id_current_shop); + if (!Validate::isLoadedObject($this->category)) + { + header('HTTP/1.1 404 Not Found'); + header('Status: 404 Not Found'); + } + else + { + // Automatically redirect to the canonical URL if the current in is the right one + // $_SERVER['HTTP_HOST'] must be replaced by the real canonical domain + $currentURL = self::$link->getCategoryLink($this->category); + $currentURL = preg_replace('/[?&].*$/', '', $currentURL); + if (!preg_match('/^'.Tools::pRegexp($currentURL, '/').'([&?].*)?$/i', Tools::getProtocol().$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) + { + header('HTTP/1.0 301 Moved'); + if (defined('_PS_MODE_DEV_') AND _PS_MODE_DEV_ ) + die('[Debug] This page has moved
Please use the following URL instead: '.$currentURL.''); + Tools::redirectLink($currentURL); + } + } + + parent::preProcess(); + + if((int)(Configuration::get('PS_REWRITING_SETTINGS'))) + if ($id_category = (int)Tools::getValue('id_category')) + { + $rewrite_infos = Category::getUrlRewriteInformations((int)$id_category); + + $default_rewrite = array(); + foreach ($rewrite_infos AS $infos) + $default_rewrite[$infos['id_lang']] = self::$link->getCategoryLink((int)$id_category, $infos['link_rewrite'], $infos['id_lang']); + + self::$smarty->assign('lang_rewrite_urls', $default_rewrite); + } + } + + public function process() + { + parent::process(); + if (!($id_category = (int)Tools::getValue('id_category')) OR !Validate::isUnsignedId($id_category)) + $this->errors[] = Tools::displayError('Missing category ID'); + else + { + if (!Validate::isLoadedObject($this->category)) + $this->errors[] = Tools::displayError('Category does not exist'); + elseif (!$this->category->checkAccess((int)(self::$cookie->id_customer))) + $this->errors[] = Tools::displayError('You do not have access to this category.'); + elseif (!$this->category->active) + self::$smarty->assign('category', $this->category); + else + { + $rewrited_url = self::$link->getCategoryLink((int)$this->category->id, $this->category->link_rewrite); + + /* Scenes (could be externalised to another controler if you need them */ + self::$smarty->assign('scenes', Scene::getScenes((int)($this->category->id), (int)(self::$cookie->id_lang), true, false)); + + /* Scenes images formats */ + if ($sceneImageTypes = ImageType::getImagesTypes('scenes')) + { + foreach ($sceneImageTypes AS $sceneImageType) + { + if ($sceneImageType['name'] == 'thumb_scene') + $thumbSceneImageType = $sceneImageType; + elseif ($sceneImageType['name'] == 'large_scene') + $largeSceneImageType = $sceneImageType; + } + self::$smarty->assign('thumbSceneImageType', isset($thumbSceneImageType) ? $thumbSceneImageType : NULL); + self::$smarty->assign('largeSceneImageType', isset($largeSceneImageType) ? $largeSceneImageType : NULL); + } + + $this->category->description = nl2br2($this->category->description); + $subCategories = $this->category->getSubCategories((int)(self::$cookie->id_lang)); + self::$smarty->assign('category', $this->category); + + if (isset($subCategories) AND !empty($subCategories) AND $subCategories) + { + self::$smarty->assign('subcategories', $subCategories); + self::$smarty->assign(array( + 'subcategories_nb_total' => sizeof($subCategories), + 'subcategories_nb_half' => ceil(sizeof($subCategories) / 2))); + } + if ($this->category->id != 1) + { + $nbProducts = $this->category->getProducts(NULL, NULL, NULL, $this->orderBy, $this->orderWay, true); + $this->pagination((int)$nbProducts); + self::$smarty->assign('nb_products', (int)$nbProducts); + $cat_products = $this->category->getProducts((int)(self::$cookie->id_lang), (int)($this->p), (int)($this->n), $this->orderBy, $this->orderWay); + } + self::$smarty->assign(array( + 'products' => (isset($cat_products) AND $cat_products) ? $cat_products : NULL, + 'id_category' => (int)($this->category->id), + 'id_category_parent' => (int)($this->category->id_parent), + 'return_category_name' => Tools::safeOutput($this->category->name), + 'path' => Tools::getPath((int)($this->category->id)), + 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + 'categorySize' => Image::getSize('category'), + 'mediumSize' => Image::getSize('medium'), + 'thumbSceneSize' => Image::getSize('thumb_scene'), + 'homeSize' => Image::getSize('home') + )); + } + } + + self::$smarty->assign(array( + 'allow_oosp' => (int)(Configuration::get('PS_ORDER_OUT_OF_STOCK')), + 'comparator_max_item' => (int)(Configuration::get('PS_COMPARATOR_MAX_ITEM')), + 'suppliers' => Supplier::getSuppliers() + )); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'category.tpl'); + } +} + diff --git a/controllers/ChangeCurrencyController.php b/controllers/ChangeCurrencyController.php new file mode 100644 index 000000000..1c0a6ca85 --- /dev/null +++ b/controllers/ChangeCurrencyController.php @@ -0,0 +1,47 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7448 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ChangeCurrencyControllerCore extends FrontController +{ + public function process() + { + parent::process(); + + $currency = new Currency((int)Tools::getValue('id_currency')); + if (Validate::isLoadedObject($currency) AND !$currency->deleted) + { + self::$cookie->id_currency = (int)($currency->id); + die('1'); + } + die('0'); + } + public function run() + { + $this->init(); + $this->process(); + } +} \ No newline at end of file diff --git a/controllers/CompareController.php b/controllers/CompareController.php new file mode 100644 index 000000000..2df2ea492 --- /dev/null +++ b/controllers/CompareController.php @@ -0,0 +1,120 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7507 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class CompareControllerCore extends FrontController +{ + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'/comparator.css'); + } + + public function process() + { + parent::process(); + + $hasProduct = false; + $product_list = Tools::getValue('compare_product_list'); + $postProducts = isset($product_list) ? rtrim($product_list,'|') : ''; + + if (!Configuration::get('PS_COMPARATOR_MAX_ITEM')) + return Tools::redirect('index.php?controller=404'); + + if ($postProducts) + { + $ids = array_unique(explode('|', $postProducts)); + + if (sizeof($ids) > 0) + { + if (sizeof($ids) > Configuration::get('PS_COMPARATOR_MAX_ITEM')) + $ids = array_slice($ids, 0, Configuration::get('PS_COMPARATOR_MAX_ITEM')); + + $listProducts = array(); + $listFeatures = array(); + + foreach ($ids AS $k => &$id) + { + $curProduct = new Product((int)$id, true, (int)self::$cookie->id_lang,(int)$this->id_current_shop); + if (!$curProduct->active OR !$curProduct->isAssociatedToShop((int)$this->id_current_shop)) + { + unset($ids[$k]); + continue; + } + + if (!$curProduct->active OR !$curProduct->isAssociatedToShop((int)$this->id_current_shop)) + { + unset($ids[$k]); + continue; + } + + if (!Validate::isLoadedObject($curProduct)) + continue; + + if (!$curProduct->active) + { + unset($ids[$k]); + continue; + } + + foreach ($curProduct->getFrontFeatures(self::$cookie->id_lang) AS $feature) + $listFeatures[$curProduct->id][$feature['id_feature']] = $feature['value']; + + $cover = Product::getCover((int)$id, (int)$this->id_current_shop); + + $curProduct->id_image = Tools::htmlentitiesUTF8(Product::defineProductImage(array('id_image' => $cover['id_image'], 'id_product' => $id), self::$cookie->id_lang)); + $curProduct->allow_oosp = Product::isAvailableWhenOutOfStock($curProduct->out_of_stock); + $listProducts[] = $curProduct; + } + + if (sizeof($listProducts) > 0) + { + $width = 80 / sizeof($listProducts); + + $hasProduct = true; + $ordered_features = Feature::getFeaturesForComparison($ids, self::$cookie->id_lang); + self::$smarty->assign(array( + 'ordered_features' => $ordered_features, + 'product_features' => $listFeatures, + 'products' => $listProducts, + 'link' => new Link(), + 'width' => $width, + 'homeSize' => Image::getSize('home') + )); + self::$smarty->assign('HOOK_EXTRA_PRODUCT_COMPARISON', Module::hookExec('extraProductComparison', array('list_ids_product' => $ids))); + } + } + } + self::$smarty->assign('hasProduct', $hasProduct); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'products-comparison.tpl'); + } +} + diff --git a/controllers/ContactController.php b/controllers/ContactController.php new file mode 100644 index 000000000..93a4355b0 --- /dev/null +++ b/controllers/ContactController.php @@ -0,0 +1,264 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ContactControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = 'contact'; + $this->ssl = true; + + parent::__construct(); + } + + public function preProcess() + { + parent::preProcess(); + + if (self::$cookie->isLogged()) + { + self::$smarty->assign('isLogged', 1); + $customer = new Customer((int)(self::$cookie->id_customer)); + if (!Validate::isLoadedObject($customer)) + die(Tools::displayError('Customer not found')); + $products = array(); + $orders = array(); + $getOrders = Db::getInstance()->ExecuteS(' + SELECT id_order + FROM '._DB_PREFIX_.'orders + WHERE id_customer = '.(int)$customer->id.' ORDER BY date_add'); + foreach ($getOrders as $row) + { + $order = new Order($row['id_order']); + $date = explode(' ', $order->date_add); + $orders[$row['id_order']] = Tools::displayDate($date[0], self::$cookie->id_lang); + $tmp = $order->getProducts(); + foreach ($tmp as $key => $val) + $products[$val['product_id']] = $val['product_name']; + } + + $orderList = ''; + foreach ($orders as $key => $val) + $orderList .= ''; + $orderedProductList = ''; + + foreach ($products as $key => $val) + $orderedProductList .= ''; + self::$smarty->assign('orderList', $orderList); + self::$smarty->assign('orderedProductList', $orderedProductList); + } + + if (Tools::isSubmit('submitMessage')) + { + $fileAttachment = NULL; + if (isset($_FILES['fileUpload']['name']) AND !empty($_FILES['fileUpload']['name']) AND !empty($_FILES['fileUpload']['tmp_name'])) + { + $extension = array('.txt', '.rtf', '.doc', '.docx', '.pdf', '.zip', '.png', '.jpeg', '.gif', '.jpg'); + $filename = uniqid().substr($_FILES['fileUpload']['name'], -5); + $fileAttachment['content'] = file_get_contents($_FILES['fileUpload']['tmp_name']); + $fileAttachment['name'] = $_FILES['fileUpload']['name']; + $fileAttachment['mime'] = $_FILES['fileUpload']['type']; + } + $message = Tools::htmlentitiesUTF8(Tools::getValue('message')); + if (!($from = trim(Tools::getValue('from'))) OR !Validate::isEmail($from)) + $this->errors[] = Tools::displayError('Invalid e-mail address'); + elseif (!($message = nl2br2($message))) + $this->errors[] = Tools::displayError('Message cannot be blank'); + elseif (!Validate::isCleanHtml($message)) + $this->errors[] = Tools::displayError('Invalid message'); + elseif (!($id_contact = (int)(Tools::getValue('id_contact'))) OR !(Validate::isLoadedObject($contact = new Contact((int)($id_contact), (int)(self::$cookie->id_lang))))) + $this->errors[] = Tools::displayError('Please select a subject on the list.'); + elseif (!empty($_FILES['fileUpload']['name']) AND $_FILES['fileUpload']['error'] != 0) + $this->errors[] = Tools::displayError('An error occurred during the file upload'); + elseif (!empty($_FILES['fileUpload']['name']) AND !in_array(substr($_FILES['fileUpload']['name'], -4), $extension) AND !in_array(substr($_FILES['fileUpload']['name'], -5), $extension)) + $this->errors[] = Tools::displayError('Bad file extension'); + else + { + if ((int)(self::$cookie->id_customer)) + $customer = new Customer((int)(self::$cookie->id_customer)); + else + { + $customer = new Customer(); + $customer->getByEmail($from, NULL, (int)$this->id_current_group_shop, (int)$this->id_current_shop); + } + + $contact = new Contact($id_contact, self::$cookie->id_lang); + + if (!(( + $id_customer_thread = (int)Tools::getValue('id_customer_thread') + AND (int)Db::getInstance()->getValue(' + SELECT cm.id_customer_thread FROM '._DB_PREFIX_.'customer_thread cm + WHERE cm.id_customer_thread = '.(int)$id_customer_thread.' AND cm.id_shop='.(int)$this->id_current_shop.' AND token = \''.pSQL(Tools::getValue('token')).'\'') + ) OR ( + $id_customer_thread = (int)Db::getInstance()->getValue(' + SELECT cm.id_customer_thread FROM '._DB_PREFIX_.'customer_thread cm + WHERE cm.email = \''.pSQL($from).'\' AND cm.id_shop='.(int)$this->id_current_shop.' AND cm.id_order = '.(int)(Tools::getValue('id_order')).'') + ))) + { + $fields = Db::getInstance()->ExecuteS(' + SELECT cm.id_customer_thread, cm.id_contact, cm.id_customer, cm.id_order, cm.id_product, cm.email + FROM '._DB_PREFIX_.'customer_thread cm + WHERE email = \''.pSQL($from).'\' AND cm.id_shop='.(int)$this->id_current_shop.' AND ('. + ($customer->id ? 'id_customer = '.(int)($customer->id).' OR ' : '').' + id_order = '.(int)(Tools::getValue('id_order')).')'); + $score = 0; + foreach ($fields as $key => $row) + { + $tmp = 0; + if ((int)$row['id_customer'] AND $row['id_customer'] != $customer->id AND $row['email'] != $from) + continue; + if ($row['id_order'] != 0 AND Tools::getValue('id_order') != $row['id_order']) + continue; + if ($row['email'] == $from) + $tmp += 4; + if ($row['id_contact'] == $id_contact) + $tmp++; + if (Tools::getValue('id_product') != 0 AND $row['id_product'] == Tools::getValue('id_product')) + $tmp += 2; + if ($tmp >= 5 AND $tmp >= $score) + { + $score = $tmp; + $id_customer_thread = $row['id_customer_thread']; + } + } + } + $old_message = Db::getInstance()->getValue(' + SELECT cm.message FROM '._DB_PREFIX_.'customer_message cm + WHERE cm.id_customer_thread = '.(int)($id_customer_thread).'AND cm.id_shop='.(int)$this->id_current_shop.' + ORDER BY date_add DESC'); + if ($old_message == htmlentities($message, ENT_COMPAT, 'UTF-8')) + { + self::$smarty->assign('alreadySent', 1); + $contact->email = ''; + $contact->customer_service = 0; + } + if (!empty($contact->email)) + { + if (Mail::Send((int)(self::$cookie->id_lang), 'contact', Mail::l('Message from contact form'), array('{email}' => $from, '{message}' => stripslashes($message)), $contact->email, $contact->name, $from, ((int)(self::$cookie->id_customer) ? $customer->firstname.' '.$customer->lastname : ''), $fileAttachment) + AND Mail::Send((int)(self::$cookie->id_lang), 'contact_form', Mail::l('Your message has been correctly sent'), array('{message}' => stripslashes($message)), $from)) + self::$smarty->assign('confirmation', 1); + else + $this->errors[] = Tools::displayError('An error occurred while sending message.'); + } + + if ($contact->customer_service) + { + if ((int)$id_customer_thread) + { + $ct = new CustomerThread($id_customer_thread); + $ct->status = 'open'; + $ct->id_lang = (int)self::$cookie->id_lang; + $ct->id_contact = (int)($id_contact); + if ($id_order = (int)Tools::getValue('id_order')) + $ct->id_order = $id_order; + if ($id_product = (int)Tools::getValue('id_product')) + $ct->id_product = $id_product; + $ct->update(); + } + else + { + $ct = new CustomerThread(); + if (isset($customer->id)) + $ct->id_customer = (int)($customer->id); + $ct->id_shop = (int)$this->id_current_shop; + if ($id_order = (int)Tools::getValue('id_order')) + $ct->id_order = $id_order; + if ($id_product = (int)Tools::getValue('id_product')) + $ct->id_product = $id_product; + $ct->id_contact = (int)($id_contact); + $ct->id_lang = (int)self::$cookie->id_lang; + $ct->email = $from; + $ct->status = 'open'; + $ct->token = Tools::passwdGen(12); + $ct->add(); + } + + if ($ct->id) + { + $cm = new CustomerMessage(); + $cm->id_customer_thread = $ct->id; + $cm->message = htmlentities($message, ENT_COMPAT, 'UTF-8'); + if (isset($filename) AND rename($_FILES['fileUpload']['tmp_name'], _PS_MODULE_DIR_.'../upload/'.$filename)) + $cm->file_name = $filename; + $cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']); + $cm->user_agent = $_SERVER['HTTP_USER_AGENT']; + if ($cm->add()) + { + if (empty($contact->email)) + Mail::Send((int)(self::$cookie->id_lang), 'contact_form', Mail::l('Your message has been correctly sent'), array('{message}' => stripslashes($message)), $from); + self::$smarty->assign('confirmation', 1); + } + else + $this->errors[] = Tools::displayError('An error occurred while sending message.'); + } + else + $this->errors[] = Tools::displayError('An error occurred while sending message.'); + } + if (count($this->errors) > 1) + array_unique($this->errors); + } + } + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'contact-form.css'); + } + + public function process() + { + parent::process(); + + $email = Tools::safeOutput(Tools::getValue('from', ((isset(self::$cookie) AND isset(self::$cookie->email) AND Validate::isEmail(self::$cookie->email)) ? self::$cookie->email : ''))); + self::$smarty->assign(array( + 'errors' => $this->errors, + 'email' => $email, + 'fileupload' => Configuration::get('PS_CUSTOMER_SERVICE_FILE_UPLOAD') + )); + + + if ($id_customer_thread = (int)Tools::getValue('id_customer_thread') AND $token = Tools::getValue('token')) + { + $customerThread = Db::getInstance()->getRow(' + SELECT cm.* FROM '._DB_PREFIX_.'customer_thread cm + WHERE cm.id_customer_thread = '.(int)$id_customer_thread.' AND cm.id_shop='.(int)$this->id_current_shop.' AND token = \''.pSQL($token).'\''); + self::$smarty->assign('customerThread', $customerThread); + } + self::$smarty->assign(array('contacts' => Contact::getContacts((int)self::$cookie->id_lang, (int)$this->id_current_shop), + 'message' => html_entity_decode(Tools::getValue('message')) + )); + } + + public function displayContent() + { + $_POST = array_merge($_POST, $_GET); + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'contact-form.tpl'); + } +} + diff --git a/controllers/DiscountController.php b/controllers/DiscountController.php new file mode 100644 index 000000000..9192c7a4a --- /dev/null +++ b/controllers/DiscountController.php @@ -0,0 +1,59 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class DiscountControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'discount.php'; + $this->authRedirection = 'discount.php'; + $this->ssl = true; + + parent::__construct(); + } + + public function process() + { + parent::process(); + + $discounts = Discount::getCustomerDiscounts((int)(self::$cookie->id_lang), (int)(self::$cookie->id_customer), true, false); + $nbDiscounts = 0; + foreach ($discounts AS $discount) + if ($discount['quantity_for_user']) + $nbDiscounts++; + + self::$smarty->assign(array('nbDiscounts' => (int)($nbDiscounts), 'discount' => $discounts)); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'discount.tpl'); + } +} + diff --git a/controllers/GetFileController.php b/controllers/GetFileController.php new file mode 100644 index 000000000..65e56683d --- /dev/null +++ b/controllers/GetFileController.php @@ -0,0 +1,303 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class getFileControllerCore extends FrontController +{ + public function process() + { + $cookie = self::$cookie; + if ($cookie->isLoggedBack() AND Tools::getValue('file')) + { + /* Admin can directly access to file */ + $filename = Tools::getValue('file'); + if (!Validate::isSha1($filename)) + die(Tools::displayError()); + $file = _PS_DOWNLOAD_DIR_.strval(preg_replace('/\.{2,}/', '.',$filename)); + $filename = ProductDownload::getFilenameFromFilename(Tools::getValue('file')); + if (empty($filename)) + { + $newFileName = Tools::getValue('filename'); + if (!empty($newFileName)) + $filename = Tools::getValue('filename'); + else + $filename = 'file'; + } + + if (!file_exists($file)) + Tools::redirect('index.php'); + } + else + { + if (!($key = Tools::getValue('key'))) + $this->displayCustomError('Invalid key.'); + + $cookie = new Cookie('ps'); + Tools::setCookieLanguage(); + if (!$cookie->isLogged() AND !Tools::getValue('secure_key') AND !Tools::getValue('id_order')) + Tools::redirect('index.php?controller=authentication&back=get-file.php&key='.$key); + elseif (!$cookie->isLogged() AND Tools::getValue('secure_key') AND Tools::getValue('id_order')) + { + $order = new Order((int)Tools::getValue('id_order')); + if (!Validate::isLoadedObject($order)) + $this->displayCustomError('Invalid key.'); + if ($order->secure_key != Tools::getValue('secure_key')) + $this->displayCustomError('Invalid key.'); + } + + /* Key format: - */ + $tmp = explode('-', $key); + if (sizeof($tmp) != 2) + $this->displayCustomError('Invalid key.'); + + $filename = $tmp[0]; + $hash = $tmp[1]; + + if (!($info = OrderDetail::getDownloadFromHash($hash))) + $this->displayCustomError('This product does not exist in our store.'); + + /* Product no more present in catalog */ + if (!isset($info['id_product_download']) OR empty($info['id_product_download'])) + $this->displayCustomError('This product has been deleted.'); + + if (!file_exists(_PS_DOWNLOAD_DIR_.$filename)) + $this->displayCustomError('This file no longer exists.'); + + $now = time(); + + $product_deadline = strtotime($info['download_deadline']); + if ($now > $product_deadline AND $info['download_deadline'] != '0000-00-00 00:00:00') + $this->displayCustomError('The product deadline is in the past.'); + + $customer_deadline = strtotime($info['date_expiration']); + if ($now > $customer_deadline AND $info['date_expiration'] != '0000-00-00 00:00:00') + $this->displayCustomError('Expiration date exceeded'); + + if ($info['download_nb'] >= $info['nb_downloadable'] AND $info['nb_downloadable']) + $this->displayCustomError('You have reached the maximum number of allowed downloads.'); + + /* Access is authorized -> increment download value for the customer */ + OrderDetail::incrementDownload($info['id_order_detail']); + + $file = _PS_DOWNLOAD_DIR_.$info['physically_filename']; + $filename = $info['display_filename']; + } + + /* Detect mime content type */ + $mimeType = false; + if (function_exists('finfo_open')) + { + $finfo = @finfo_open(FILEINFO_MIME); + $mimeType = @finfo_file($finfo, $file); + @finfo_close($finfo); + } + elseif (function_exists('mime_content_type')) + $mimeType = @mime_content_type($file); + elseif (function_exists('exec')) + { + $mimeType = trim(@exec('file -b --mime-type '.escapeshellarg($file))); + if (!$mimeType) + $mimeType = trim(@exec('file --mime '.escapeshellarg($file))); + if (!$mimeType) + $mimeType = trim(@exec('file -bi '.escapeshellarg($file))); + } + + if (empty($mimeType)) + { + $bName = basename($filename); + $bName = explode('.', $bName); + $bName = strtolower($bName[count($bName) - 1]); + + $mimeTypes = array( + 'ez' => 'application/andrew-inset', + 'hqx' => 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'doc' => 'application/msword', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'bcpio' => 'application/x-bcpio', + 'vcd' => 'application/x-cdlink', + 'pgn' => 'application/x-chess-pgn', + 'cpio' => 'application/x-cpio', + 'csh' => 'application/x-csh', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'spl' => 'application/x-futuresplash', + 'gtar' => 'application/x-gtar', + 'hdf' => 'application/x-hdf', + 'js' => 'application/x-javascript', + 'skp' => 'application/x-koan', + 'skd' => 'application/x-koan', + 'skt' => 'application/x-koan', + 'skm' => 'application/x-koan', + 'latex' => 'application/x-latex', + 'nc' => 'application/x-netcdf', + 'cdf' => 'application/x-netcdf', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'tar' => 'application/x-tar', + 'tcl' => 'application/x-tcl', + 'tex' => 'application/x-tex', + 'texinfo' => 'application/x-texinfo', + 'texi' => 'application/x-texinfo', + 't' => 'application/x-troff', + 'tr' => 'application/x-troff', + 'roff' => 'application/x-troff', + 'man' => 'application/x-troff-man', + 'me' => 'application/x-troff-me', + 'ms' => 'application/x-troff-ms', + 'ustar' => 'application/x-ustar', + 'src' => 'application/x-wais-source', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => 'application/zip', + 'au' => 'audio/basic', + 'snd' => 'audio/basic', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'kar' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'm3u' => 'audio/x-mpegurl', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'wav' => 'audio/x-wav', + 'pdb' => 'chemical/x-pdb', + 'xyz' => 'chemical/x-xyz', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'ief' => 'image/ief', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tif', + 'djvu' => 'image/vnd.djvu', + 'djv' => 'image/vnd.djvu', + 'wbmp' => 'image/vnd.wap.wbmp', + 'ras' => 'image/x-cmu-raster', + 'pnm' => 'image/x-portable-anymap', + 'pbm' => 'image/x-portable-bitmap', + 'pgm' => 'image/x-portable-graymap', + 'ppm' => 'image/x-portable-pixmap', + 'rgb' => 'image/x-rgb', + 'xbm' => 'image/x-xbitmap', + 'xpm' => 'image/x-xpixmap', + 'xwd' => 'image/x-windowdump', + 'igs' => 'model/iges', + 'iges' => 'model/iges', + 'msh' => 'model/mesh', + 'mesh' => 'model/mesh', + 'silo' => 'model/mesh', + 'wrl' => 'model/vrml', + 'vrml' => 'model/vrml', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'asc' => 'text/plain', + 'txt' => 'text/plain', + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'sgml' => 'text/sgml', + 'sgm' => 'text/sgml', + 'tsv' => 'text/tab-seperated-values', + 'wml' => 'text/vnd.wap.wml', + 'wmls' => 'text/vnd.wap.wmlscript', + 'etx' => 'text/x-setext', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'mxu' => 'video/vnd.mpegurl', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'ice' => 'x-conference-xcooltalk'); + + if (isset($mimeTypes[$bName])) + $mimeType = $mimeTypes[$bName]; + else + $mimeType = 'application/octet-stream'; + } + + + /* Set headers for download */ + header('Content-Transfer-Encoding: binary'); + header('Content-Type: '.$mimeType); + header('Content-Length: '.filesize($file)); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + ob_end_flush(); + $fp = fopen($file, 'rb'); + while (!feof($fp)) + echo fgets($fp, 16384); + + exit; + } + + protected function displayCustomError($msg) + { + $translations = array( + 'Invalid key.' => Tools::displayError('Invalid key.'), + 'This product does not exist in our store.' => Tools::displayError('This product does not exist in our store.'), + 'This product has been deleted.' => Tools::displayError('This product has been deleted.'), + 'This file no longer exists.' => Tools::displayError('This file no longer exists.'), + 'The product deadline is in the past.' => Tools::displayError('The product deadline is in the past.'), + 'Expiration date exceeded' => Tools::displayError('Expiration date exceeded'), + 'You have reached the maximum number of allowed downloads.' => Tools::displayError('You have reached the maximum number of allowed downloads.')); + ?> + + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7095 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class GuestTrackingControllerCore extends FrontController +{ + public function preProcess() + { + parent::preProcess(); + + if (self::$cookie->isLogged()) + Tools::redirect('index.php?controller=history'); + } + + public function process() + { + parent::process(); + + if ($id_order = Tools::getValue('id_order') AND $email = Tools::getValue('email')) + { + $order = new Order((int)$id_order); + if (!Validate::isLoadedObject($order)) + $this->errors[] = Tools::displayError('Invalid order'); + elseif (!$order->isAssociatedAtGuest($email)) + $this->errors[] = Tools::displayError('Invalid order'); + else + { + $customer = new Customer((int)$order->id_customer); + $id_order_state = (int)($order->getCurrentState()); + $carrier = new Carrier((int)($order->id_carrier), (int)($order->id_lang)); + $addressInvoice = new Address((int)($order->id_address_invoice)); + $addressDelivery = new Address((int)($order->id_address_delivery)); + $inv_adr_fields = AddressFormat::getOrderedAddressFields($addressInvoice->id_country); + $dlv_adr_fields = AddressFormat::getOrderedAddressFields($addressDelivery->id_country); + + $invoiceAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($addressInvoice, $inv_adr_fields); + $deliveryAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($addressDelivery, $dlv_adr_fields); + + if ($order->total_discounts > 0) + self::$smarty->assign('total_old', (float)($order->total_paid - $order->total_discounts)); + $products = $order->getProducts(); + $customizedDatas = Product::getAllCustomizedDatas((int)($order->id_cart)); + Product::addCustomizationPrice($products, $customizedDatas); + + $this->processAddressFormat($addressDelivery, $addressInvoice); + self::$smarty->assign(array( + 'shop_name' => Configuration::get('PS_SHOP_NAME'), + 'order' => $order, + 'return_allowed' => false, + 'currency' => new Currency($order->id_currency), + 'order_state' => (int)($id_order_state), + 'invoiceAllowed' => (int)(Configuration::get('PS_INVOICE')), + 'invoice' => (OrderState::invoiceAvailable((int)($id_order_state)) AND $order->invoice_number), + 'order_history' => $order->getHistory((int)(self::$cookie->id_lang), false, true), + 'products' => $products, + 'discounts' => $order->getDiscounts(), + 'carrier' => $carrier, + 'address_invoice' => $addressInvoice, + 'invoiceState' => (Validate::isLoadedObject($addressInvoice) AND $addressInvoice->id_state) ? new State((int)($addressInvoice->id_state)) : false, + 'address_delivery' => $addressDelivery, + 'deliveryState' => (Validate::isLoadedObject($addressDelivery) AND $addressDelivery->id_state) ? new State((int)($addressDelivery->id_state)) : false, + 'is_guest' => true, + 'group_use_tax' => (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC), + 'CUSTOMIZE_FILE' => _CUSTOMIZE_FILE_, + 'CUSTOMIZE_TEXTFIELD' => _CUSTOMIZE_TEXTFIELD_, + 'use_tax' => Configuration::get('PS_TAX'), + 'customizedDatas' => $customizedDatas, + 'invoiceAddressFormatedValues' => $invoiceAddressFormatedValues, + 'deliveryAddressFormatedValues' => $deliveryAddressFormatedValues)); + if ($carrier->url AND $order->shipping_number) + self::$smarty->assign('followup', str_replace('@', $order->shipping_number, $carrier->url)); + self::$smarty->assign('HOOK_ORDERDETAILDISPLAYED', Module::hookExec('orderDetailDisplayed', array('order' => $order))); + Module::hookExec('OrderDetail', array('carrier' => $carrier, 'order' => $order)); + + if (Tools::isSubmit('submitTransformGuestToCustomer')) + { + $customer = new Customer((int)$order->id_customer); + if (!Validate::isLoadedObject($customer)) + $this->errors[] = Tools::displayError('Invalid customer'); + if (!$customer->transformToCustomer(self::$cookie->id_lang, Tools::getValue('password'))) + $this->errors[] = Tools::displayError('An error occurred while transforming guest to customer.'); + if (!Tools::getValue('password')) + $this->errors[] = Tools::displayError('Invalid password'); + else + self::$smarty->assign('transformSuccess', true); + } + } + if (sizeof($this->errors)) + /* Handle brute force attacks */ + sleep(1); + } + + self::$smarty->assign(array( + 'action' => 'guest-tracking.php', + 'errors' => $this->errors + )); + } + + public function setMedia() + { + parent::setMedia(); + + Tools::addCSS(_THEME_CSS_DIR_.'history.css'); + Tools::addCSS(_THEME_CSS_DIR_.'addresses.css'); + } + + public function displayContent() + { + parent::displayContent(); + + self::$smarty->display(_PS_THEME_DIR_.'guest-tracking.tpl'); + } + + private function processAddressFormat(Address $delivery, Address $invoice) + { + + $inv_adr_fields = AddressFormat::getOrderedAddressFields($invoice->id_country); + $dlv_adr_fields = AddressFormat::getOrderedAddressFields($delivery->id_country); + + self::$smarty->assign('inv_adr_fields', $inv_adr_fields); + self::$smarty->assign('dlv_adr_fields', $dlv_adr_fields); + + } +} diff --git a/controllers/HistoryController.php b/controllers/HistoryController.php new file mode 100644 index 000000000..a3d3ec5a6 --- /dev/null +++ b/controllers/HistoryController.php @@ -0,0 +1,75 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class HistoryControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'history.php'; + $this->authRedirection = 'history.php'; + $this->ssl = true; + + parent::__construct(); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'history.css'); + Tools::addCSS(_THEME_CSS_DIR_.'addresses.css'); + Tools::addJS(array( + _PS_JS_DIR_.'jquery/jquery.scrollTo-1.4.2-min.js', + _THEME_JS_DIR_.'history.js', + _THEME_JS_DIR_.'tools.js')); + } + + public function process() + { + parent::process(); + + if ($orders = Order::getCustomerOrders((int)(self::$cookie->id_customer))) + foreach ($orders AS &$order) + { + $myOrder = new Order((int)($order['id_order'])); + if (Validate::isLoadedObject($myOrder)) + $order['virtual'] = $myOrder->isVirtual(false); + } + self::$smarty->assign(array( + 'orders' => $orders, + 'invoiceAllowed' => (int)(Configuration::get('PS_INVOICE')), + 'slowValidation' => Tools::isSubmit('slowvalidation') + )); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'history.tpl'); + } +} + diff --git a/controllers/IdentityController.php b/controllers/IdentityController.php new file mode 100644 index 000000000..a372d53ea --- /dev/null +++ b/controllers/IdentityController.php @@ -0,0 +1,129 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class IdentityControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'identity.php'; + $this->authRedirection = 'identity.php'; + $this->ssl = true; + + parent::__construct(); + } + + public function preProcess() + { + parent::preProcess(); + + $customer = new Customer((int)(self::$cookie->id_customer)); + + if (sizeof($_POST)) + { + $exclusion = array('secure_key', 'old_passwd', 'passwd', 'active', 'date_add', 'date_upd', 'last_passwd_gen', 'newsletter_date_add', 'id_default_group'); + $fields = $customer->getFields(); + foreach ($fields AS $key => $value) + if (!in_array($key, $exclusion)) + $customer->{$key} = key_exists($key, $_POST) ? trim($_POST[$key]) : 0; + } + + if (isset($_POST['years']) AND isset($_POST['months']) AND isset($_POST['days'])) + $customer->birthday = (int)($_POST['years']).'-'.(int)($_POST['months']).'-'.(int)($_POST['days']); + + if (Tools::isSubmit('submitIdentity')) + { + if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) AND + !(Tools::getValue('months') == '' AND Tools::getValue('days') == '' AND Tools::getValue('years') == '')) + $this->errors[] = Tools::displayError('Invalid date of birth'); + else + { + $customer->birthday = (empty($_POST['years']) ? '' : (int)($_POST['years']).'-'.(int)($_POST['months']).'-'.(int)($_POST['days'])); + + $_POST['old_passwd'] = trim($_POST['old_passwd']); + if (empty($_POST['old_passwd']) OR (Tools::encrypt($_POST['old_passwd']) != self::$cookie->passwd)) + $this->errors[] = Tools::displayError('Your password is incorrect.'); + elseif ($_POST['passwd'] != $_POST['confirmation']) + $this->errors[] = Tools::displayError('Password and confirmation do not match'); + else + { + $prev_id_default_group = $customer->id_default_group; + $this->errors = $customer->validateControler(); + } + if (!sizeof($this->errors)) + { + $customer->id_default_group = (int)($prev_id_default_group); + $customer->firstname = Tools::ucfirst(Tools::strtolower($customer->firstname)); + if (Tools::getValue('passwd')) + self::$cookie->passwd = $customer->passwd; + if ($customer->update()) + { + self::$cookie->customer_lastname = $customer->lastname; + self::$cookie->customer_firstname = $customer->firstname; + self::$smarty->assign('confirmation', 1); + } + else + $this->errors[] = Tools::displayError('Cannot update information'); + } + } + } + else + $_POST = array_map('stripslashes', $customer->getFields()); + + if ($customer->birthday) + $birthday = explode('-', $customer->birthday); + else + $birthday = array('-', '-', '-'); + + /* Generate years, months and days */ + self::$smarty->assign(array( + 'years' => Tools::dateYears(), + 'sl_year' => $birthday[0], + 'months' => Tools::dateMonths(), + 'sl_month' => $birthday[1], + 'days' => Tools::dateDays(), + 'sl_day' => $birthday[2], + 'errors' => $this->errors + )); + + self::$smarty->assign('newsletter', (int)Module::getInstanceByName('blocknewsletter')->active); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'identity.css'); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'identity.tpl'); + } +} + + diff --git a/controllers/IndexController.php b/controllers/IndexController.php new file mode 100644 index 000000000..d55c6c912 --- /dev/null +++ b/controllers/IndexController.php @@ -0,0 +1,48 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class IndexControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = Configuration::get('PS_HOMEPAGE_PHP_SELF'); + + parent::__construct(); + } + + public function process() + { + parent::process(); + self::$smarty->assign('HOOK_HOME', Module::hookExec('home')); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'index.tpl'); + } +} diff --git a/controllers/ManufacturerController.php b/controllers/ManufacturerController.php new file mode 100644 index 000000000..25bfa99b4 --- /dev/null +++ b/controllers/ManufacturerController.php @@ -0,0 +1,102 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ManufacturerControllerCore extends FrontController +{ + protected $manufacturer; + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'product_list.css'); + } + + public function process() + { + if ($id_manufacturer = Tools::getValue('id_manufacturer')) + { + $this->manufacturer = new Manufacturer((int)$id_manufacturer, self::$cookie->id_lang); + if (Validate::isLoadedObject($this->manufacturer) AND $this->manufacturer->active AND $this->manufacturer->isAssociatedToGroupShop((int)$this->id_current_shop)) + { + $nbProducts = $this->manufacturer->getProducts($id_manufacturer, NULL, NULL, NULL, $this->orderBy, $this->orderWay, true); + $this->pagination((int)$nbProducts); + self::$smarty->assign(array( + 'nb_products' => $nbProducts, + 'products' => $this->manufacturer->getProducts($id_manufacturer, (int)self::$cookie->id_lang, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay), + 'path' => ($this->manufacturer->active ? Tools::safeOutput($this->manufacturer->name) : ''), + 'manufacturer' => $this->manufacturer)); + } + else + { + header('HTTP/1.1 404 Not Found'); + header('Status: 404 Not Found'); + $this->errors[] = Tools::displayError('Manufacturer does not exist.'); + } + } + else + { + if (Configuration::get('PS_DISPLAY_SUPPLIERS')) + { + $id_current_group_shop = (int)Shop::getCurrentGroupShop(); + $data = call_user_func(array('Manufacturer', 'getManufacturers'), true, (int)self::$cookie->id_lang, true, false, false, false, $id_current_group_shop); + $nbProducts = count($data); + $this->pagination($nbProducts); + + $data = call_user_func(array('Manufacturer', 'getManufacturers'), true, (int)self::$cookie->id_lang, true, $this->p, $this->n, false, $id_current_group_shop); + $imgDir = _PS_MANU_IMG_DIR_; + foreach ($data AS &$item) + $item['image'] = (!file_exists($imgDir.'/'.$item['id_manufacturer'].'-medium.jpg')) ? + Language::getIsoById((int)(self::$cookie->id_lang)).'-default' : $item['id_manufacturer']; + self::$smarty->assign(array( + 'pages_nb' => ceil($nbProducts / (int)($this->n)), + 'nbManufacturers' => $nbProducts, + 'mediumSize' => Image::getSize('medium'), + 'manufacturers' => $data, + 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + )); + } + else + self::$smarty->assign('nbManufacturers', 0); + } + } + + public function displayHeader() + { + parent::displayHeader(); + $this->productSort(); + } + + public function displayContent() + { + parent::displayContent(); + if ($this->manufacturer) + self::$smarty->display(_PS_THEME_DIR_.'manufacturer.tpl'); + else + self::$smarty->display(_PS_THEME_DIR_.'manufacturer-list.tpl'); + } + +} diff --git a/controllers/MyAccountController.php b/controllers/MyAccountController.php new file mode 100644 index 000000000..f817d98af --- /dev/null +++ b/controllers/MyAccountController.php @@ -0,0 +1,63 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class MyAccountControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'my-account.php'; + $this->authRedirection = 'my-account.php'; + $this->ssl = true; + + parent::__construct(); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'my-account.css'); + } + + public function process() + { + parent::process(); + + self::$smarty->assign(array( + 'voucherAllowed' => (int)(Configuration::get('PS_VOUCHERS')), + 'returnAllowed' => (int)(Configuration::get('PS_ORDER_RETURN')) + )); + self::$smarty->assign('HOOK_CUSTOMER_ACCOUNT', Module::hookExec('customerAccount')); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'my-account.tpl'); + } +} + diff --git a/controllers/NewProductsController.php b/controllers/NewProductsController.php new file mode 100644 index 000000000..b7e255f4f --- /dev/null +++ b/controllers/NewProductsController.php @@ -0,0 +1,66 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7480 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class NewProductsControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = 'new-products.php'; + + parent::__construct(); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'product_list.css'); + } + + public function process() + { + parent::process(); + + $this->productSort(); + + $nbProducts = (int)Product::getNewProducts((int)self::$cookie->id_lang, (isset($this->p) ? (int)($this->p) - 1 : NULL), (isset($this->n) ? (int)($this->n) : NULL), true); + $this->pagination($nbProducts); + + self::$smarty->assign(array( + 'products' => Product::getNewProducts((int)(self::$cookie->id_lang), (int)($this->p) - 1, (int)($this->n), false, $this->orderBy, $this->orderWay), + 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + 'nbProducts' => (int)($nbProducts), + 'homeSize' => Image::getSize('home') + )); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'new-products.tpl'); + } +} + diff --git a/controllers/OrderConfirmationController.php b/controllers/OrderConfirmationController.php new file mode 100644 index 000000000..41165322e --- /dev/null +++ b/controllers/OrderConfirmationController.php @@ -0,0 +1,94 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderConfirmationControllerCore extends FrontController +{ + public $id_cart; + public $id_module; + public $id_order; + public $secure_key; + + public function __construct() + { + $this->php_self = 'order-confirmation.php'; + + parent::__construct(); + } + + public function preProcess() + { + parent::preProcess(); + + $this->id_cart = (int)(Tools::getValue('id_cart', 0)); + + /* check if the cart has been made by a Guest customer, for redirect link */ + if (Cart::isGuestCartByCartId($this->id_cart)) + $redirectLink = 'index.php?controller=guest-tracking'; + else + $redirectLink = 'index.php?controller=history'; + + $this->id_module = (int)(Tools::getValue('id_module', 0)); + $this->id_order = Order::getOrderByCartId((int)($this->id_cart)); + $this->secure_key = Tools::getValue('key', false); + if (!$this->id_order OR !$this->id_module OR !$this->secure_key OR empty($this->secure_key)) + Tools::redirect($redirectLink.(Tools::isSubmit('slowvalidation') ? '&slowvalidation' : '')); + + $order = new Order((int)($this->id_order)); + if (!Validate::isLoadedObject($order) OR $order->id_customer != self::$cookie->id_customer OR $this->secure_key != $order->secure_key) + Tools::redirect($redirectLink); + $module = Module::getInstanceById((int)($this->id_module)); + if ($order->payment != $module->displayName) + Tools::redirect($redirectLink); + } + + public function process() + { + parent::process(); + self::$smarty->assign(array( + 'is_guest' => self::$cookie->is_guest, + 'HOOK_ORDER_CONFIRMATION' => Hook::orderConfirmation((int)($this->id_order)), + 'HOOK_PAYMENT_RETURN' => Hook::paymentReturn((int)($this->id_order), (int)($this->id_module)) + )); + + if (self::$cookie->is_guest) + { + self::$smarty->assign(array( + 'id_order' => $this->id_order, + 'id_order_formatted' => sprintf('#%06d', $this->id_order) + )); + /* If guest we clear the cookie for security reason */ + self::$cookie->logout(); + } + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'order-confirmation.tpl'); + } +} + diff --git a/controllers/OrderController.php b/controllers/OrderController.php new file mode 100644 index 000000000..1ee6004e2 --- /dev/null +++ b/controllers/OrderController.php @@ -0,0 +1,296 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7095 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +ControllerFactory::includeController('ParentOrderController'); + +class OrderControllerCore extends ParentOrderController +{ + public $step; + + public function init() + { + parent::init(); + + $this->step = (int)(Tools::getValue('step')); + if (!$this->nbProducts) + $this->step = -1; + } + + public function preProcess() + { + global $isVirtualCart, $orderTotal; + + parent::preProcess(); + + /* If some products have disappear */ + if (!self::$cart->checkQuantities()) + { + $this->step = 0; + $this->errors[] = Tools::displayError('An item in your cart is no longer available for this quantity, you cannot proceed with your order.'); + } + + /* Check minimal amount */ + $currency = Currency::getCurrency((int)self::$cart->id_currency); + + $orderTotal = self::$cart->getOrderTotal(); + $minimalPurchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency); + if (self::$cart->getOrderTotal(false) < $minimalPurchase && $this->step != -1) + { + $this->step = 0; + $this->errors[] = Tools::displayError('A minimum purchase total of').' '.Tools::displayPrice($minimalPurchase, $currency). + ' '.Tools::displayError('is required in order to validate your order.'); + } + + if (!self::$cookie->isLogged(true) AND in_array($this->step, array(1, 2, 3))) + Tools::redirect('index.php?controller=authentication&back='.urlencode('order.php&step='.$this->step)); + + if ($this->nbProducts) + self::$smarty->assign('virtual_cart', $isVirtualCart); + } + + public function displayHeader() + { + if (!Tools::getValue('ajax')) + parent::displayHeader(); + } + + public function process() + { + parent::process(); + + /* 4 steps to the order */ + switch ((int)$this->step) + { + case -1; + self::$smarty->assign('empty', 1); + break; + case 1: + $this->_assignAddress(); + break; + case 2: + if(Tools::isSubmit('processAddress')) + $this->processAddress(); + $this->autoStep(); + $this->_assignCarrier(); + break; + case 3: + //Test that the conditions (so active) were accepted by the customer + $cgv = Tools::getValue('cgv'); + if (Configuration::get('PS_CONDITIONS') AND (!Validate::isBool($cgv))) + Tools::redirect('index.php?controller=order&step=2'); + + if(Tools::isSubmit('processCarrier')) + $this->processCarrier(); + $this->autoStep(); + /* Bypass payment step if total is 0 */ + if (($id_order = $this->_checkFreeOrder()) AND $id_order) + { + if (self::$cookie->is_guest) + { + $email = self::$cookie->email; + self::$cookie->logout(); // If guest we clear the cookie for security reason + Tools::redirect('index.php?controller=guest-tracking&id_order='.(int)$id_order.'&email='.urlencode($email)); + } + else + Tools::redirect('index.php?controller=history'); + } + $this->_assignPayment(); + break; + default: + $this->_assignSummaryInformations(); + break; + } + } + + private function processAddressFormat() + { + $addressDelivery = new Address((int)(self::$cart->id_address_delivery)); + $addressInvoice = new Address((int)(self::$cart->id_address_invoice)); + + $invoiceAddressFields = AddressFormat::getOrderedAddressFields($addressInvoice->id_country); + $deliveryAddressFields = AddressFormat::getOrderedAddressFields($addressDelivery->id_country); + + self::$smarty->assign(array( + 'inv_adr_fields' => $invoiceAddressFields, + 'dlv_adr_fields' => $deliveryAddressFields)); + } + + public function displayContent() + { + global $currency; + + parent::displayContent(); + + self::$smarty->assign(array( + 'currencySign' => $currency->sign, + 'currencyRate' => $currency->conversion_rate, + 'currencyFormat' => $currency->format, + 'currencyBlank' => $currency->blank, + )); + + switch ((int)$this->step) + { + case -1: + self::$smarty->display(_PS_THEME_DIR_.'shopping-cart.tpl'); + break; + case 1: + $this->processAddressFormat(); + self::$smarty->display(_PS_THEME_DIR_.'order-address.tpl'); + break; + case 2: + self::$smarty->display(_PS_THEME_DIR_.'order-carrier.tpl'); + break; + case 3: + self::$smarty->display(_PS_THEME_DIR_.'order-payment.tpl'); + break; + default: + self::$smarty->display(_PS_THEME_DIR_.'shopping-cart.tpl'); + break; + } + } + + public function displayFooter() + { + if (!Tools::getValue('ajax')) + parent::displayFooter(); + } + + /* Order process controller */ + public function autoStep() + { + global $isVirtualCart; + + if ($this->step >= 2 AND (!self::$cart->id_address_delivery OR !self::$cart->id_address_invoice)) + Tools::redirect('index.php?controller=order&step=1'); + $delivery = new Address((int)(self::$cart->id_address_delivery)); + $invoice = new Address((int)(self::$cart->id_address_invoice)); + + if ($delivery->deleted OR $invoice->deleted) + { + if ($delivery->deleted) + unset(self::$cart->id_address_delivery); + if ($invoice->deleted) + unset(self::$cart->id_address_invoice); + Tools::redirect('index.php?controller=order&step=1'); + } + elseif ($this->step >= 3 AND !self::$cart->id_carrier AND !$isVirtualCart) + Tools::redirect('index.php?controller=order&step=2'); + } + + /* + * Manage address + */ + public function processAddress() + { + if (!Tools::isSubmit('id_address_delivery') OR !Address::isCountryActiveById((int)Tools::getValue('id_address_delivery'))) + $this->errors[] = Tools::displayError('This address is not in a valid area.'); + else + { + self::$cart->id_address_delivery = (int)(Tools::getValue('id_address_delivery')); + self::$cart->id_address_invoice = Tools::isSubmit('same') ? self::$cart->id_address_delivery : (int)(Tools::getValue('id_address_invoice')); + if (!self::$cart->update()) + $this->errors[] = Tools::displayError('An error occurred while updating your cart.'); + + if (Tools::isSubmit('message')) + $this->_updateMessage(Tools::getValue('message')); + } + if (sizeof($this->errors)) + { + if (Tools::getValue('ajax')) + die('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + $this->step = 1; + } + if (Tools::getValue('ajax')) + die(true); + } + + /* Carrier step */ + protected function processCarrier() + { + global $orderTotal; + + parent::_processCarrier(); + + if (sizeof($this->errors)) + { + self::$smarty->assign('errors', $this->errors); + $this->_assignCarrier(); + $this->step = 2; + $this->displayContent(); + include(dirname(__FILE__).'/../footer.php'); + exit; + } + $orderTotal = self::$cart->getOrderTotal(); + } + + /* Address step */ + protected function _assignAddress() + { + parent::_assignAddress(); + + self::$smarty->assign('cart', self::$cart); + if (self::$cookie->is_guest) + Tools::redirect('index.php?controller=order&step=2'); + } + + /* Carrier step */ + protected function _assignCarrier() + { + global $defaultCountry; + + if (isset(self::$cookie->id_customer)) + $customer = new Customer((int)(self::$cookie->id_customer)); + else + die(Tools::displayError('Fatal error: No customer')); + // Assign carrier + parent::_assignCarrier(); + // Assign wrapping and TOS + $this->_assignWrappingAndTOS(); + + self::$smarty->assign('is_guest' ,(isset(self::$cookie->is_guest) ? self::$cookie->is_guest : 0)); + } + + /* Payment step */ + protected function _assignPayment() + { + global $orderTotal; + + // Redirect instead of displaying payment modules if any module are grefted on + Hook::backBeforePayment('order.php?step=3'); + + /* We may need to display an order summary */ + self::$smarty->assign(self::$cart->getSummaryDetails()); + self::$smarty->assign(array( + 'total_price' => (float)($orderTotal), + 'taxes_enabled' => (int)(Configuration::get('PS_TAX')) + )); + self::$cookie->checkedTOS = '1'; + + parent::_assignPayment(); + } +} + diff --git a/controllers/OrderDetailController.php b/controllers/OrderDetailController.php new file mode 100644 index 000000000..1f866fea3 --- /dev/null +++ b/controllers/OrderDetailController.php @@ -0,0 +1,185 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderDetailControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->authRedirection = 'history.php'; + $this->ssl = true; + + parent::__construct(); + + header("Cache-Control: no-cache, must-revalidate"); + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); + } + + public function preProcess() + { + parent::preProcess(); + + + if (Tools::isSubmit('submitMessage')) + { + $idOrder = (int)(Tools::getValue('id_order')); + $msgText = htmlentities(Tools::getValue('msgText'), ENT_COMPAT, 'UTF-8'); + + if (!$idOrder OR !Validate::isUnsignedId($idOrder)) + $this->errors[] = Tools::displayError('Order is no longer valid'); + elseif (empty($msgText)) + $this->errors[] = Tools::displayError('Message cannot be blank'); + elseif (!Validate::isMessage($msgText)) + $this->errors[] = Tools::displayError('Message is invalid (HTML is not allowed)'); + if(!sizeof($this->errors)) + { + $order = new Order((int)($idOrder)); + if (Validate::isLoadedObject($order) AND $order->id_customer == self::$cookie->id_customer) + { + $message = new Message(); + $message->id_customer = (int)(self::$cookie->id_customer); + $message->message = $msgText; + $message->id_order = (int)($idOrder); + $message->private = false; + $message->add(); + if (!Configuration::get('PS_MAIL_EMAIL_MESSAGE')) + $to = strval(Configuration::get('PS_SHOP_EMAIL')); + else + { + $to = new Contact((int)(Configuration::get('PS_MAIL_EMAIL_MESSAGE'))); + $to = strval($to->email); + } + $toName = strval(Configuration::get('PS_SHOP_NAME')); + $customer = new Customer((int)(self::$cookie->id_customer)); + if (Validate::isLoadedObject($customer)) + Mail::Send((int)(self::$cookie->id_lang), 'order_customer_comment', Mail::l('Message from a customer'), + array( + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{email}' => $customer->email, + '{id_order}' => (int)($message->id_order), + '{message}' => $message->message), + $to, $toName, $customer->email, $customer->firstname.' '.$customer->lastname); + if (Tools::getValue('ajax') != 'true') + Tools::redirect('index.php?controller=order-detail&id_order='.(int)($idOrder)); + } + else + { + $this->errors[] = Tools::displayError('Order not found'); + } + } + } + + if (!$id_order = (int)(Tools::getValue('id_order')) OR !Validate::isUnsignedId($id_order)) + $this->errors[] = Tools::displayError('Order ID required'); + else + { + $order = new Order($id_order); + if (Validate::isLoadedObject($order) AND $order->id_customer == self::$cookie->id_customer) + { + $id_order_state = (int)($order->getCurrentState()); + $carrier = new Carrier((int)($order->id_carrier), (int)($order->id_lang)); + $addressInvoice = new Address((int)($order->id_address_invoice)); + $addressDelivery = new Address((int)($order->id_address_delivery)); + // $stateInvoiceAddress = new State((int)$addressInvoice->id_state); + + $inv_adr_fields = AddressFormat::getOrderedAddressFields($addressInvoice->id_country); + $dlv_adr_fields = AddressFormat::getOrderedAddressFields($addressDelivery->id_country); + + $invoiceAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($addressInvoice, $inv_adr_fields); + $deliveryAddressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($addressDelivery, $dlv_adr_fields); + + if ($order->total_discounts > 0) + self::$smarty->assign('total_old', (float)($order->total_paid - $order->total_discounts)); + $products = $order->getProducts(); + + $customizedDatas = Product::getAllCustomizedDatas((int)($order->id_cart)); + Product::addCustomizationPrice($products, $customizedDatas); + + $customer = new Customer($order->id_customer); + + self::$smarty->assign(array( + 'shop_name' => strval(Configuration::get('PS_SHOP_NAME')), + 'order' => $order, + 'return_allowed' => (int)($order->isReturnable()), + 'currency' => new Currency($order->id_currency), + 'order_state' => (int)($id_order_state), + 'invoiceAllowed' => (int)(Configuration::get('PS_INVOICE')), + 'invoice' => (OrderState::invoiceAvailable((int)($id_order_state)) AND $order->invoice_number), + 'order_history' => $order->getHistory((int)(self::$cookie->id_lang), false, true), + 'products' => $products, + 'discounts' => $order->getDiscounts(), + 'carrier' => $carrier, + 'address_invoice' => $addressInvoice, + 'invoiceState' => (Validate::isLoadedObject($addressInvoice) AND $addressInvoice->id_state) ? new State((int)($addressInvoice->id_state)) : false, + 'address_delivery' => $addressDelivery, + 'inv_adr_fields' => $inv_adr_fields, + 'dlv_adr_fields' => $dlv_adr_fields, + 'invoiceAddressFormatedValues' => $invoiceAddressFormatedValues, + 'deliveryAddressFormatedValues' => $deliveryAddressFormatedValues, + 'deliveryState' => (Validate::isLoadedObject($addressDelivery) AND $addressDelivery->id_state) ? new State((int)($addressDelivery->id_state)) : false, + 'is_guest' => false, + 'messages' => Message::getMessagesByOrderId((int)($order->id)), + 'CUSTOMIZE_FILE' => _CUSTOMIZE_FILE_, + 'CUSTOMIZE_TEXTFIELD' => _CUSTOMIZE_TEXTFIELD_, + 'use_tax' => Configuration::get('PS_TAX'), + 'group_use_tax' => (Group::getPriceDisplayMethod($customer->id_default_group) == PS_TAX_INC), + 'customizedDatas' => $customizedDatas)); + if ($carrier->url AND $order->shipping_number) + self::$smarty->assign('followup', str_replace('@', $order->shipping_number, $carrier->url)); + self::$smarty->assign('HOOK_ORDERDETAILDISPLAYED', Module::hookExec('orderDetailDisplayed', array('order' => $order))); + Module::hookExec('OrderDetail', array('carrier' => $carrier, 'order' => $order)); + + unset($carrier); + unset($addressInvoice); + unset($addressDelivery); + } + else + $this->errors[] = Tools::displayError('Cannot find this order'); + unset($order); + } + } + + public function displayHeader() + { + if (Tools::getValue('ajax') != 'true') + parent::displayHeader(); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'order-detail.tpl'); + } + + public function displayFooter() + { + if (Tools::getValue('ajax') != 'true') + parent::displayFooter(); + } +} + diff --git a/controllers/OrderFollowController.php b/controllers/OrderFollowController.php new file mode 100644 index 000000000..4cb04de87 --- /dev/null +++ b/controllers/OrderFollowController.php @@ -0,0 +1,106 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7095 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderFollowControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'order-follow.php'; + $this->authRedirection = 'order-follow.php'; + $this->ssl = true; + + parent::__construct(); + } + + public function preProcess() + { + parent::preProcess(); + + if (Tools::isSubmit('submitReturnMerchandise')) + { + $customizationQtyInput = Tools::getValue('customization_qty_input'); + + if (!$id_order = (int)(Tools::getValue('id_order'))) + Tools::redirect('index.php?controller=history'); + if (!$order_qte_input = Tools::getValue('order_qte_input')) + Tools::redirect('index.php?controller=order-follow&errorDetail1'); + if ($customizationIds = Tools::getValue('customization_ids') AND !$customizationQtyInput) + Tools::redirect('index.php?controller=order-follow&errorDetail1'); + if (!$ids_order_detail = Tools::getValue('ids_order_detail') AND !$customizationIds) + Tools::redirect('index.php?controller=order-follow&errorDetail2'); + + $order = new Order((int)($id_order)); + if (!$order->isReturnable()) Tools::redirect('index.php?controller=order-follow&errorNotReturnable'); + if ($order->id_customer != self::$cookie->id_customer) + die(Tools::displayError()); + $orderReturn = new OrderReturn(); + $orderReturn->id_customer = (int)(self::$cookie->id_customer); + $orderReturn->id_order = $id_order; + $orderReturn->question = strval(Tools::getValue('returnText')); + if (empty($orderReturn->question)) + Tools::redirect('index.php?controller=order-follow&errorMsg'); + if (!$orderReturn->checkEnoughProduct($ids_order_detail, $order_qte_input, $customizationIds, $customizationQtyInput)) + Tools::redirect('index.php?controller=order-follow&errorQuantity'); + + $orderReturn->state = 1; + $orderReturn->add(); + $orderReturn->addReturnDetail($ids_order_detail, $order_qte_input, $customizationIds, $customizationQtyInput); + Module::hookExec('orderReturn', array('orderReturn' => $orderReturn)); + Tools::redirect('index.php?controller=order-follow'); + } + + $ordersReturn = OrderReturn::getOrdersReturn((int)(self::$cookie->id_customer)); + if (Tools::isSubmit('errorQuantity')) + self::$smarty->assign('errorQuantity', true); + elseif (Tools::isSubmit('errorMsg')) + self::$smarty->assign('errorMsg', true); + elseif (Tools::isSubmit('errorDetail1')) + self::$smarty->assign('errorDetail1', true); + elseif (Tools::isSubmit('errorDetail2')) + self::$smarty->assign('errorDetail2', true); + elseif (Tools::isSubmit('errorNotReturnable')) + self::$smarty->assign('errorNotReturnable',true); + + self::$smarty->assign('ordersReturn', $ordersReturn); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'history.css'); + Tools::addCSS(_THEME_CSS_DIR_.'addresses.css'); + Tools::addJS(array(_PS_JS_DIR_.'jquery/jquery.scrollTo-1.4.2-min.js', _THEME_JS_DIR_.'history.js')); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'order-follow.tpl'); + } +} + diff --git a/controllers/OrderOpcController.php b/controllers/OrderOpcController.php new file mode 100644 index 000000000..a84b9f3b0 --- /dev/null +++ b/controllers/OrderOpcController.php @@ -0,0 +1,457 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +ControllerFactory::includeController('ParentOrderController'); + +class OrderOpcControllerCore extends ParentOrderController +{ + public $isLogged; + + public function preProcess() + { + parent::preProcess(); + if ($this->nbProducts) + self::$smarty->assign('virtual_cart', false); + $this->isLogged = (bool)((int)(self::$cookie->id_customer) AND Customer::customerIdExistsStatic((int)(self::$cookie->id_customer))); + + if (self::$cart->nbProducts()) + { + if (Tools::isSubmit('ajax')) + { + if (Tools::isSubmit('method')) + { + switch (Tools::getValue('method')) + { + case 'updateMessage': + if (Tools::isSubmit('message')) + { + $txtMessage = urldecode(Tools::getValue('message')); + $this->_updateMessage($txtMessage); + if (sizeof($this->errors)) + die('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + die(true); + } + break; + case 'updateCarrierAndGetPayments': + if (Tools::isSubmit('id_carrier') AND Tools::isSubmit('recyclable') AND Tools::isSubmit('gift') AND Tools::isSubmit('gift_message')) + { + if ($this->_processCarrier()) + { + $return = array( + 'summary' => self::$cart->getSummaryDetails(), + 'HOOK_TOP_PAYMENT' => Module::hookExec('paymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods() + ); + die(Tools::jsonEncode($return)); + } + else + $this->errors[] = Tools::displayError('Error occurred updating cart.'); + if (sizeof($this->errors)) + die('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + exit; + } + break; + case 'updateTOSStatusAndGetPayments': + if (Tools::isSubmit('checked')) + { + self::$cookie->checkedTOS = (int)(Tools::getValue('checked')); + die(Tools::jsonEncode(array( + 'HOOK_TOP_PAYMENT' => Module::hookExec('paymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods() + ))); + } + break; + case 'getCarrierList': + die(Tools::jsonEncode($this->_getCarrierList())); + break; + case 'editCustomer': + if (!$this->isLogged) + exit; + $customer = new Customer((int)self::$cookie->id_customer); + if (Tools::getValue('years')) + $customer->birthday = (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'); + $_POST['lastname'] = $_POST['customer_lastname']; + $_POST['firstname'] = $_POST['customer_firstname']; + $this->errors = $customer->validateControler(); + $customer->newsletter = (int)Tools::isSubmit('newsletter'); + $customer->optin = (int)Tools::isSubmit('optin'); + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'id_customer' => (int)self::$cookie->id_customer, + 'token' => Tools::getToken(false) + ); + if (!sizeof($this->errors)) + $return['isSaved'] = (bool)$customer->update(); + else + $return['isSaved'] = false; + die(Tools::jsonEncode($return)); + break; + case 'getAddressBlockAndCarriersAndPayments': + if (self::$cookie->isLogged()) + { + // check if customer have addresses + if (!Customer::getAddressesTotalById((int)(self::$cookie->id_customer))) + die(Tools::jsonEncode(array('no_address' => 1))); + if (file_exists(_PS_MODULE_DIR_.'blockuserinfo/blockuserinfo.php')) + { + include_once(_PS_MODULE_DIR_.'blockuserinfo/blockuserinfo.php'); + $blockUserInfo = new BlockUserInfo(); + } + self::$smarty->assign('isVirtualCart', self::$cart->isVirtualCart()); + $this->_processAddressFormat(); + $this->_assignAddress(); + // Wrapping fees + $wrapping_fees = (float)(Configuration::get('PS_GIFT_WRAPPING_PRICE')); + $wrapping_fees_tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX'))); + $wrapping_fees_tax_inc = $wrapping_fees * (1 + (((float)($wrapping_fees_tax->rate) / 100))); + $return = array( + 'summary' => self::$cart->getSummaryDetails(), + 'order_opc_adress' => self::$smarty->fetch(_PS_THEME_DIR_.'order-address.tpl'), + 'block_user_info' => (isset($blockUserInfo) ? $blockUserInfo->hookTop(array()) : ''), + 'carrier_list' => $this->_getCarrierList(), + 'HOOK_TOP_PAYMENT' => Module::hookExec('paymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods(), + 'no_address' => 0, + 'gift_price' => Tools::displayPrice(Tools::convertPrice(Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, new Currency((int)(self::$cookie->id_currency)))) + ); + die(Tools::jsonEncode($return)); + } + die(Tools::displayError()); + break; + case 'makeFreeOrder': + /* Bypass payment step if total is 0 */ + if (($id_order = $this->_checkFreeOrder()) AND $id_order) + { + $email = self::$cookie->email; + if (self::$cookie->is_guest) + self::$cookie->logout(); // If guest we clear the cookie for security reason + die('freeorder:'.$id_order.':'.$email); + } + exit; + break; + case 'updateAddressesSelected': + if (self::$cookie->isLogged(true)) + { + $id_address_delivery = (int)(Tools::getValue('id_address_delivery')); + $id_address_invoice = (int)(Tools::getValue('id_address_invoice')); + $address_delivery = new Address((int)(Tools::getValue('id_address_delivery'))); + $address_invoice = ((int)(Tools::getValue('id_address_delivery')) == (int)(Tools::getValue('id_address_invoice')) ? $address_delivery : new Address((int)(Tools::getValue('id_address_invoice')))); + if ($address_delivery->id_customer != self::$cookie->id_customer || $address_invoice->id_customer != self::$cookie->id_customer) + $this->errors[] = Tools::displayError('This address is not yours.'); + elseif (!Address::isCountryActiveById((int)(Tools::getValue('id_address_delivery')))) + $this->errors[] = Tools::displayError('This address is not in a valid area.'); + elseif (!Validate::isLoadedObject($address_delivery) OR !Validate::isLoadedObject($address_invoice) OR $address_invoice->deleted OR $address_delivery->deleted) + $this->errors[] = Tools::displayError('This address is invalid.'); + else + { + self::$cart->id_address_delivery = (int)(Tools::getValue('id_address_delivery')); + self::$cart->id_address_invoice = Tools::isSubmit('same') ? self::$cart->id_address_delivery : (int)(Tools::getValue('id_address_invoice')); + if (!self::$cart->update()) + $this->errors[] = Tools::displayError('An error occurred while updating your cart.'); + + if (!sizeof($this->errors)) + { + if (self::$cookie->id_customer) + { + $customer = new Customer((int)(self::$cookie->id_customer)); + $groups = $customer->getGroups(); + } + else + $groups = array(1); + $result = $this->_getCarrierList(); + // Wrapping fees + $wrapping_fees = (float)(Configuration::get('PS_GIFT_WRAPPING_PRICE')); + $wrapping_fees_tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX'))); + $wrapping_fees_tax_inc = $wrapping_fees * (1 + (((float)($wrapping_fees_tax->rate) / 100))); + $result = array_merge($result, array( + 'summary' => self::$cart->getSummaryDetails(), + 'HOOK_TOP_PAYMENT' => Module::hookExec('paymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods(), + 'gift_price' => Tools::displayPrice(Tools::convertPrice(Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, new Currency((int)(self::$cookie->id_currency)))) + )); + die(Tools::jsonEncode($result)); + } + } + if (sizeof($this->errors)) + die('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + } + die(Tools::displayError()); + break; + default: + exit; + } + } + exit; + } + } + elseif (Tools::isSubmit('ajax')) + exit; + } + + public function setMedia() + { + parent::setMedia(); + + // Adding CSS style sheet + Tools::addCSS(_THEME_CSS_DIR_.'order-opc.css'); + // Adding JS files + Tools::addJS(_THEME_JS_DIR_.'order-opc.js'); + Tools::addJs(_PS_JS_DIR_.'jquery/jquery.scrollTo-1.4.2-min.js'); + Tools::addJS(_THEME_JS_DIR_.'tools/statesManagement.js'); + } + + public function process() + { + // SHOPPING CART + $this->_assignSummaryInformations(); + // WRAPPING AND TOS + $this->_assignWrappingAndTOS(); + + $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT')); + $countries = Country::getCountries((int)(self::$cookie->id_lang), true); + self::$smarty->assign(array( + 'isLogged' => $this->isLogged, + 'isGuest' => isset(self::$cookie->is_guest) ? self::$cookie->is_guest : 0, + 'countries' => $countries, + 'sl_country' => isset($selectedCountry) ? $selectedCountry : 0, + 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), + 'errorCarrier' => Tools::displayError('You must choose a carrier before', false), + 'errorTOS' => Tools::displayError('You must accept terms of service before', false), + 'isPaymentStep' => (bool)(isset($_GET['isPaymentStep']) AND $_GET['isPaymentStep']) + )); + $years = Tools::dateYears(); + $months = Tools::dateMonths(); + $days = Tools::dateDays(); + self::$smarty->assign(array( + 'years' => $years, + 'months' => $months, + 'days' => $days, + )); + + /* Load guest informations */ + if ($this->isLogged AND self::$cookie->is_guest) + self::$smarty->assign('guestInformations', $this->_getGuestInformations()); + + if ($this->isLogged) + $this->_assignAddress(); // ADDRESS + // CARRIER + $this->_assignCarrier(); + // PAYMENT + $this->_assignPayment(); + Tools::safePostVars(); + + self::$smarty->assign('newsletter', (int)Module::getInstanceByName('blocknewsletter')->active); + } + + public function displayHeader() + { + if (Tools::getValue('ajax') != 'true') + parent::displayHeader(); + } + + public function displayContent() + { + parent::displayContent(); + + $this->_processAddressFormat(); + self::$smarty->display(_PS_THEME_DIR_.'order-opc.tpl'); + } + + public function displayFooter() + { + if (Tools::getValue('ajax') != 'true') + parent::displayFooter(); + } + + protected function _getGuestInformations() + { + $customer = new Customer((int)(self::$cookie->id_customer)); + $address_delivery = new Address((int)self::$cart->id_address_delivery); + + if ($customer->birthday) + $birthday = explode('-', $customer->birthday); + else + $birthday = array('0', '0', '0'); + + return array( + 'id_customer' => (int)(self::$cookie->id_customer), + 'email' => Tools::htmlentitiesUTF8($customer->email), + 'customer_lastname' => Tools::htmlentitiesUTF8($customer->lastname), + 'customer_firstname' => Tools::htmlentitiesUTF8($customer->firstname), + 'newsletter' => (int)$customer->newsletter, + 'optin' => (int)$customer->optin, + 'id_address_delivery' => (int)self::$cart->id_address_delivery, + 'company' => Tools::htmlentitiesUTF8($address_delivery->company), + 'lastname' => Tools::htmlentitiesUTF8($address_delivery->lastname), + 'firstname' => Tools::htmlentitiesUTF8($address_delivery->firstname), + 'vat_number' => Tools::htmlentitiesUTF8($address_delivery->vat_number), + 'dni' => Tools::htmlentitiesUTF8($address_delivery->dni), + 'address1' => Tools::htmlentitiesUTF8($address_delivery->address1), + 'postcode' => Tools::htmlentitiesUTF8($address_delivery->postcode), + 'city' => Tools::htmlentitiesUTF8($address_delivery->city), + 'phone' => Tools::htmlentitiesUTF8($address_delivery->phone), + 'phone_mobile' => Tools::htmlentitiesUTF8($address_delivery->phone_mobile), + 'id_country' => (int)($address_delivery->id_country), + 'id_state' => (int)($address_delivery->id_state), + 'id_gender' => (int)$customer->id_gender, + 'sl_year' => $birthday[0], + 'sl_month' => $birthday[1], + 'sl_day' => $birthday[2] + ); + } + + protected function _assignCarrier() + { + if (!$this->isLogged) + { + $carriers = Carrier::getCarriersForOrder(Country::getIdZone((int)Configuration::get('PS_COUNTRY_DEFAULT'))); + self::$smarty->assign(array( + 'checked' => $this->_setDefaultCarrierSelection($carriers), + 'carriers' => $carriers, + 'default_carrier' => (int)(Configuration::get('PS_CARRIER_DEFAULT')), + 'HOOK_EXTRACARRIER' => NULL, + 'HOOK_BEFORECARRIER' => Module::hookExec('beforeCarrier', array('carriers' => $carriers)) + )); + } + else + parent::_assignCarrier(); + } + + protected function _assignPayment() + { + self::$smarty->assign(array( + 'HOOK_TOP_PAYMENT' => ($this->isLogged ? Module::hookExec('paymentTop') : ''), + 'HOOK_PAYMENT' => $this->_getPaymentMethods() + )); + } + + protected function _getPaymentMethods() + { + if (!$this->isLogged) + return '

'.Tools::displayError('Please sign in to see payment methods').'

'; + if (self::$cart->OrderExists()) + return '

'.Tools::displayError('Error: this order is already validated').'

'; + if (!self::$cart->id_customer OR !Customer::customerIdExistsStatic(self::$cart->id_customer) OR Customer::isBanned(self::$cart->id_customer)) + return '

'.Tools::displayError('Error: no customer').'

'; + $address_delivery = new Address(self::$cart->id_address_delivery); + $address_invoice = (self::$cart->id_address_delivery == self::$cart->id_address_invoice ? $address_delivery : new Address(self::$cart->id_address_invoice)); + if (!self::$cart->id_address_delivery OR !self::$cart->id_address_invoice OR !Validate::isLoadedObject($address_delivery) OR !Validate::isLoadedObject($address_invoice) OR $address_invoice->deleted OR $address_delivery->deleted) + return '

'.Tools::displayError('Error: please choose an address').'

'; + if (!self::$cart->id_carrier AND !self::$cart->isVirtualCart()) + return '

'.Tools::displayError('Error: please choose a carrier').'

'; + elseif (self::$cart->id_carrier != 0) + { + $carrier = new Carrier((int)(self::$cart->id_carrier)); + if (!Validate::isLoadedObject($carrier) OR $carrier->deleted OR !$carrier->active) + return '

'.Tools::displayError('Error: the carrier is invalid').'

'; + } + if (!self::$cart->id_currency) + return '

'.Tools::displayError('Error: no currency has been selected').'

'; + if (!self::$cookie->checkedTOS AND Configuration::get('PS_CONDITIONS')) + return '

'.Tools::displayError('Please accept Terms of Service').'

'; + + /* If some products have disappear */ + if (!self::$cart->checkQuantities()) + return '

'.Tools::displayError('An item in your cart is no longer available, you cannot proceed with your order.').'

'; + + /* Check minimal amount */ + $currency = Currency::getCurrency((int)self::$cart->id_currency); + + $minimalPurchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency); + if (self::$cart->getOrderTotal(false) < $minimalPurchase) + return '

'.Tools::displayError('A minimum purchase total of').' '.Tools::displayPrice($minimalPurchase, $currency). + ' '.Tools::displayError('is required in order to validate your order.').'

'; + + /* Bypass payment step if total is 0 */ + if (self::$cart->getOrderTotal() <= 0) + return '

'; + + $return = Module::hookExecPayment(); + if (!$return) + return '

'.Tools::displayError('No payment method is available').'

'; + return $return; + } + + protected function _getCarrierList() + { + $address_delivery = new Address(self::$cart->id_address_delivery); + if (self::$cookie->id_customer) + { + $customer = new Customer((int)(self::$cookie->id_customer)); + $groups = $customer->getGroups(); + } + else + $groups = array(1); + if (!Address::isCountryActiveById((int)(self::$cart->id_address_delivery))) + $this->errors[] = Tools::displayError('This address is not in a valid area.'); + elseif (!Validate::isLoadedObject($address_delivery) OR $address_delivery->deleted) + $this->errors[] = Tools::displayError('This address is invalid.'); + else + { + $carriers = Carrier::getCarriersForOrder((int)Address::getZoneById((int)($address_delivery->id)), $groups); + $result = array( + 'checked' => $this->_setDefaultCarrierSelection($carriers), + 'carriers' => $carriers, + 'HOOK_BEFORECARRIER' => Module::hookExec('beforeCarrier', array('carriers' => $carriers)), + 'HOOK_EXTRACARRIER' => Module::hookExec('extraCarrier', array('address' => $address_delivery)) + ); + return $result; + } + if (sizeof($this->errors)) + return array( + 'hasError' => true, + 'errors' => $this->errors + ); + } + + protected function _processAddressFormat() + { + $selectedCountry = (int)(Configuration::get('PS_COUNTRY_DEFAULT')); + + $address_delivery = new Address((int)self::$cart->id_address_delivery); + $address_invoice = new Address((int)self::$cart->id_address_invoice); + + $inv_adr_fields = AddressFormat::getOrderedAddressFields((int)$address_delivery->id_country); + $dlv_adr_fields = AddressFormat::getOrderedAddressFields((int)$address_invoice->id_country); + + $inv_all_fields = array(); + $dlv_all_fields = array(); + + foreach (array('inv','dlv') as $adr_type) + { + foreach (${$adr_type.'_adr_fields'} as $fields_line) + foreach(explode(' ',$fields_line) as $field_item) + ${$adr_type.'_all_fields'}[] = trim($field_item); + + self::$smarty->assign($adr_type.'_adr_fields', ${$adr_type.'_adr_fields'}); + self::$smarty->assign($adr_type.'_all_fields', ${$adr_type.'_all_fields'}); + + } + } +} + diff --git a/controllers/OrderReturnController.php b/controllers/OrderReturnController.php new file mode 100644 index 000000000..91ff15761 --- /dev/null +++ b/controllers/OrderReturnController.php @@ -0,0 +1,99 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderReturnControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'order-return.php'; + $this->authRedirection = 'order-follow.php'; + $this->ssl = true; + + parent::__construct(); + + header("Cache-Control: no-cache, must-revalidate"); + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); + } + + public function preProcess() + { + parent::preProcess(); + + if (!isset($_GET['id_order_return']) OR !Validate::isUnsignedId($_GET['id_order_return'])) + $this->errors[] = Tools::displayError('Order ID required'); + else + { + $orderRet = new OrderReturn((int)($_GET['id_order_return'])); + if (Validate::isLoadedObject($orderRet) AND $orderRet->id_customer == self::$cookie->id_customer) + { + $order = new Order((int)($orderRet->id_order)); + if (Validate::isLoadedObject($order)) + { + $state = new OrderReturnState((int)($orderRet->state)); + self::$smarty->assign(array( + 'orderRet' => $orderRet, + 'order' => $order, + 'state_name' => $state->name[(int)(self::$cookie->id_lang)], + 'return_allowed' => false, + 'products' => OrderReturn::getOrdersReturnProducts((int)($orderRet->id), $order), + 'returnedCustomizations' => OrderReturn::getReturnedCustomizedProducts((int)($orderRet->id_order)), + 'customizedDatas' => Product::getAllCustomizedDatas((int)($order->id_cart)) + )); + } + else + $this->errors[] = Tools::displayError('Cannot find this order return'); + } + else + $this->errors[] = Tools::displayError('Cannot find this order return'); + } + + self::$smarty->assign(array( + 'errors' => $this->errors, + 'nbdaysreturn' => (int)(Configuration::get('PS_ORDER_RETURN_NB_DAYS')) + )); + } + + public function displayHeader() + { + if (Tools::getValue('ajax') != 'true') + parent::displayHeader(); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'order-return.tpl'); + } + + public function displayFooter() + { + if (Tools::getValue('ajax') != 'true') + parent::displayFooter(); + } +} + diff --git a/controllers/OrderSlipController.php b/controllers/OrderSlipController.php new file mode 100644 index 000000000..951a51f7a --- /dev/null +++ b/controllers/OrderSlipController.php @@ -0,0 +1,60 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class OrderSlipControllerCore extends FrontController +{ + public function __construct() + { + $this->auth = true; + $this->php_self = 'order-slip.php'; + $this->authRedirection = 'order-slip.php'; + $this->ssl = true; + + parent::__construct(); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'history.css'); + Tools::addCSS(_THEME_CSS_DIR_.'addresses.css'); + Tools::addJS(array(_PS_JS_DIR_.'jquery/jquery.scrollTo-1.4.2-min.js',_THEME_JS_DIR_.'history.js')); + } + + public function process() + { + parent::process(); + self::$smarty->assign('ordersSlip', OrderSlip::getOrdersSlip((int)(self::$cookie->id_customer))); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'order-slip.tpl'); + } +} + diff --git a/controllers/PageNotFoundController.php b/controllers/PageNotFoundController.php new file mode 100644 index 000000000..bbcd27c3b --- /dev/null +++ b/controllers/PageNotFoundController.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PageNotFoundControllerCore extends FrontController +{ + public function displayContent() + { + self::$smarty->display(_PS_THEME_DIR_.'404.tpl'); + } +} + diff --git a/controllers/ParentOrderController.php b/controllers/ParentOrderController.php new file mode 100644 index 000000000..02527ff0a --- /dev/null +++ b/controllers/ParentOrderController.php @@ -0,0 +1,452 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* Class FreeOrder to use PaymentModule (abstract class, cannot be instancied) */ +class FreeOrder extends PaymentModule {} + +class ParentOrderControllerCore extends FrontController +{ + public $nbProducts; + + public function __construct() + { + $this->ssl = true; + parent::__construct(); + + /* Disable some cache related bugs on the cart/order */ + header('Cache-Control: no-cache, must-revalidate'); + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); + } + + public function init() + { + parent::init(); + $this->nbProducts = self::$cart->nbProducts(); + } + + public function preProcess() + { + global $isVirtualCart; + + parent::preProcess(); + + // Redirect to the good order process + if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 0 AND Tools::getValue('controller') != 'order') + Tools::redirect('index.php?controller=order'); + if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1 AND Tools::getValue('controller') != 'order-opc') + { + if (isset($_GET['step']) AND $_GET['step'] == 3) + Tools::redirect('index.php?controller=order-opc&isPaymentStep=true'); + Tools::redirect('index.php?controller=order-opc'); + } + + if (Configuration::get('PS_CATALOG_MODE')) + $this->errors[] = Tools::displayError('This store has not accepted your new order.'); + + if (Tools::isSubmit('submitReorder') AND $id_order = (int)Tools::getValue('id_order')) + { + $oldCart = new Cart(Order::getCartIdStatic((int)$id_order, (int)self::$cookie->id_customer)); + $duplication = $oldCart->duplicate(); + if (!$duplication OR !Validate::isLoadedObject($duplication['cart'])) + $this->errors[] = Tools::displayError('Sorry, we cannot renew your order.'); + elseif (!$duplication['success']) + $this->errors[] = Tools::displayError('Missing items - we are unable to renew your order'); + else + { + self::$cookie->id_cart = $duplication['cart']->id; + self::$cookie->write(); + if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) + Tools::redirect('index.php?controller=order-opc'); + Tools::redirect('index.php?controller=order'); + } + } + + if ($this->nbProducts) + { + if (Tools::isSubmit('submitAddDiscount') AND Tools::getValue('discount_name')) + { + $discountName = Tools::getValue('discount_name'); + if (!Validate::isDiscountName($discountName)) + $this->errors[] = Tools::displayError('Voucher name invalid.'); + else + { + $discount = new Discount((int)(Discount::getIdByName($discountName))); + if (Validate::isLoadedObject($discount)) + { + if ($tmpError = self::$cart->checkDiscountValidity($discount, self::$cart->getDiscounts(), self::$cart->getOrderTotal(), self::$cart->getProducts(), true, (int)$this->id_current_group_shop, (int)$this->id_current_shop)) + $this->errors[] = $tmpError; + } + else + $this->errors[] = Tools::displayError('Voucher name invalid.'); + if (!sizeof($this->errors)) + { + self::$cart->addDiscount((int)($discount->id)); + Tools::redirect('index.php?controller=order-opc'); + } + } + self::$smarty->assign(array( + 'errors' => $this->errors, + 'discount_name' => Tools::safeOutput($discountName) + )); + } + elseif (isset($_GET['deleteDiscount']) AND Validate::isUnsignedId($_GET['deleteDiscount'])) + { + self::$cart->deleteDiscount((int)($_GET['deleteDiscount'])); + Tools::redirect('index.php?controller=order-opc'); + } + + /* Is there only virtual product in cart */ + if ($isVirtualCart = self::$cart->isVirtualCart()) + $this->_setNoCarrier(); + } + + self::$smarty->assign('back', Tools::safeOutput(Tools::getValue('back'))); + } + + public function setMedia() + { + parent::setMedia(); + + // Adding CSS style sheet + Tools::addCSS(_THEME_CSS_DIR_.'addresses.css'); + Tools::addCSS(_PS_CSS_DIR_.'jquery.fancybox-1.3.4.css', 'screen'); + + // Adding JS files + Tools::addJS(_THEME_JS_DIR_.'tools.js'); + if ((Configuration::get('PS_ORDER_PROCESS_TYPE') == 0 AND Tools::getValue('step') == 1) OR Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) + Tools::addJS(_THEME_JS_DIR_.'order-address.js'); + Tools::addJS(_PS_JS_DIR_.'jquery/jquery.fancybox-1.3.4.js'); + if ((int)(Configuration::get('PS_BLOCK_CART_AJAX')) OR Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) + { + Tools::addJS(_THEME_JS_DIR_.'cart-summary.js'); + Tools::addJS(_PS_JS_DIR_.'jquery/jquery-typewatch.pack.js'); + } + + } + + /** + * @return boolean + */ + protected function _checkFreeOrder() + { + if (self::$cart->getOrderTotal() <= 0) + { + $order = new FreeOrder(); + $order->free_order_class = true; + $order->validateOrder((int)(self::$cart->id), _PS_OS_PAYMENT_, 0, Tools::displayError('Free order', false)); + return (int)Order::getOrderByCartId((int)self::$cart->id); + } + return false; + } + + protected function _updateMessage($messageContent) + { + if ($messageContent) + { + if (!Validate::isMessage($messageContent)) + $this->errors[] = Tools::displayError('Invalid message'); + elseif ($oldMessage = Message::getMessageByCartId((int)(self::$cart->id))) + { + $message = new Message((int)($oldMessage['id_message'])); + $message->message = htmlentities($messageContent, ENT_COMPAT, 'UTF-8'); + $message->update(); + } + else + { + $message = new Message(); + $message->message = htmlentities($messageContent, ENT_COMPAT, 'UTF-8'); + $message->id_cart = (int)(self::$cart->id); + $message->id_customer = (int)(self::$cart->id_customer); + $message->add(); + } + } + else + { + if ($oldMessage = Message::getMessageByCartId((int)(self::$cart->id))) + { + $message = new Message((int)($oldMessage['id_message'])); + $message->delete(); + } + } + return true; + } + + protected function _processCarrier() + { + self::$cart->recyclable = (int)(Tools::getValue('recyclable')); + self::$cart->gift = (int)(Tools::getValue('gift')); + if ((int)(Tools::getValue('gift'))) + { + if (!Validate::isMessage($_POST['gift_message'])) + $this->errors[] = Tools::displayError('Invalid gift message'); + else + self::$cart->gift_message = strip_tags($_POST['gift_message']); + } + + if (isset(self::$cookie->id_customer) AND self::$cookie->id_customer) + { + $address = new Address((int)(self::$cart->id_address_delivery)); + if (!($id_zone = Address::getZoneById($address->id))) + $this->errors[] = Tools::displayError('No zone match with your address'); + } + else + $id_zone = Country::getIdZone((int)Configuration::get('PS_COUNTRY_DEFAULT')); + + if (Validate::isInt(Tools::getValue('id_carrier')) AND sizeof(Carrier::checkCarrierZone((int)(Tools::getValue('id_carrier')), (int)($id_zone)))) + self::$cart->id_carrier = (int)(Tools::getValue('id_carrier')); + elseif (!self::$cart->isVirtualCart() AND (int)(Tools::getValue('id_carrier')) == 0) + $this->errors[] = Tools::displayError('Invalid carrier or no carrier selected'); + + Module::hookExec('processCarrier', array('cart' => self::$cart)); + + return self::$cart->update(); + } + + protected function _assignSummaryInformations() + { + global $currency; + + if (file_exists(_PS_SHIP_IMG_DIR_.(int)(self::$cart->id_carrier).'.jpg')) + self::$smarty->assign('carrierPicture', 1); + $summary = self::$cart->getSummaryDetails(); + $customizedDatas = Product::getAllCustomizedDatas((int)(self::$cart->id)); + + // override customization tax rate with real tax (tax rules) + foreach($summary['products'] AS &$productUpdate) + { + $productId = (int)(isset($productUpdate['id_product']) ? $productUpdate['id_product'] : $productUpdate['product_id']); + $productAttributeId = (int)(isset($productUpdate['id_product_attribute']) ? $productUpdate['id_product_attribute'] : $productUpdate['product_attribute_id']); + + if (isset($customizedDatas[$productId][$productAttributeId])) + $productUpdate['tax_rate'] = Tax::getProductTaxRate($productId, self::$cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + } + + Product::addCustomizationPrice($summary['products'], $customizedDatas); + + if ($free_ship = Tools::convertPrice((float)(Configuration::get('PS_SHIPPING_FREE_PRICE')), new Currency((int)(self::$cart->id_currency)))) + { + $discounts = self::$cart->getDiscounts(); + $total_free_ship = $free_ship - ($summary['total_products_wt'] + $summary['total_discounts']); + foreach ($discounts as $discount) + if ($discount['id_discount_type'] == 3) + { + $total_free_ship = 0; + break; + } + self::$smarty->assign('free_ship', $total_free_ship); + } + // for compatibility with 1.2 themes + foreach($summary['products'] AS $key => $product) + $summary['products'][$key]['quantity'] = $product['cart_quantity']; + + self::$smarty->assign($summary); + self::$smarty->assign(array( + 'token_cart' => Tools::getToken(false), + 'isVirtualCart' => self::$cart->isVirtualCart(), + 'productNumber' => self::$cart->nbProducts(), + 'voucherAllowed' => Configuration::get('PS_VOUCHERS'), + 'shippingCost' => self::$cart->getOrderTotal(true, Cart::ONLY_SHIPPING), + 'shippingCostTaxExc' => self::$cart->getOrderTotal(false, Cart::ONLY_SHIPPING), + 'customizedDatas' => $customizedDatas, + 'CUSTOMIZE_FILE' => _CUSTOMIZE_FILE_, + 'CUSTOMIZE_TEXTFIELD' => _CUSTOMIZE_TEXTFIELD_, + 'lastProductAdded' => self::$cart->getLastProduct(), + 'displayVouchers' => Discount::getVouchersToCartDisplay((int)(self::$cookie->id_lang), (isset(self::$cookie->id_customer) ? (int)(self::$cookie->id_customer) : 0)), + 'currencySign' => $currency->sign, + 'currencyRate' => $currency->conversion_rate, + 'currencyFormat' => $currency->format, + 'currencyBlank' => $currency->blank)); + self::$smarty->assign(array( + 'HOOK_SHOPPING_CART' => Module::hookExec('shoppingCart', $summary), + 'HOOK_SHOPPING_CART_EXTRA' => Module::hookExec('shoppingCartExtra', $summary) + )); + } + + protected function _assignAddress() + { + //if guest checkout disabled and flag is_guest in cookies is actived + if(Configuration::get('PS_GUEST_CHECKOUT_ENABLED') == 0 AND ((int) self::$cookie->is_guest != Configuration::get('PS_GUEST_CHECKOUT_ENABLED'))) + { + self::$cookie->logout(); + Tools::redirect(''); + } + elseif (!Customer::getAddressesTotalById((int)(self::$cookie->id_customer))) + Tools::redirect('index.php?controller=address&back=order.php&step=1'); + $customer = new Customer((int)(self::$cookie->id_customer)); + if (Validate::isLoadedObject($customer)) + { + /* Getting customer addresses */ + $customerAddresses = $customer->getAddresses((int)(self::$cookie->id_lang)); + + // Getting a list of formated address fields with associated values + $formatedAddressFieldsValuesList = array(); + foreach($customerAddresses as $address) + { + $tmpAddress = new Address($address['id_address']); + + $formatedAddressFieldsValuesList[$address['id_address']]['ordered_fields'] = AddressFormat::getOrderedAddressFields($address['id_country']); + $formatedAddressFieldsValuesList[$address['id_address']]['formated_fields_values'] = AddressFormat::getFormattedAddressFieldsValues( + $tmpAddress, + $formatedAddressFieldsValuesList[$address['id_address']]['ordered_fields']); + + unset($tmpAddress); + } + self::$smarty->assign(array( + 'addresses' => $customerAddresses, + 'formatedAddressFieldsValuesList' => $formatedAddressFieldsValuesList)); + + /* Setting default addresses for cart */ + if ((!isset(self::$cart->id_address_delivery) OR empty(self::$cart->id_address_delivery)) AND sizeof($customerAddresses)) + { + self::$cart->id_address_delivery = (int)($customerAddresses[0]['id_address']); + $update = 1; + } + if ((!isset(self::$cart->id_address_invoice) OR empty(self::$cart->id_address_invoice)) AND sizeof($customerAddresses)) + { + self::$cart->id_address_invoice = (int)($customerAddresses[0]['id_address']); + $update = 1; + } + /* Update cart addresses only if needed */ + if (isset($update) AND $update) + self::$cart->update(); + + /* If delivery address is valid in cart, assign it to Smarty */ + if (isset(self::$cart->id_address_delivery)) + { + $deliveryAddress = new Address((int)(self::$cart->id_address_delivery)); + if (Validate::isLoadedObject($deliveryAddress) AND ($deliveryAddress->id_customer == $customer->id)) + self::$smarty->assign('delivery', $deliveryAddress); + } + + /* If invoice address is valid in cart, assign it to Smarty */ + if (isset(self::$cart->id_address_invoice)) + { + $invoiceAddress = new Address((int)(self::$cart->id_address_invoice)); + if (Validate::isLoadedObject($invoiceAddress) AND ($invoiceAddress->id_customer == $customer->id)) + self::$smarty->assign('invoice', $invoiceAddress); + } + } + if ($oldMessage = Message::getMessageByCartId((int)(self::$cart->id))) + self::$smarty->assign('oldMessage', $oldMessage['message']); + } + + protected function _assignCarrier() + { + $customer = new Customer((int)(self::$cookie->id_customer)); + $address = new Address((int)(self::$cart->id_address_delivery)); + $id_zone = Address::getZoneById((int)($address->id)); + $carriers = Carrier::getCarriersForOrder($id_zone, $customer->getGroups()); + + self::$smarty->assign(array( + 'checked' => $this->_setDefaultCarrierSelection($carriers), + 'carriers' => $carriers, + 'default_carrier' => (int)(Configuration::get('PS_CARRIER_DEFAULT')), + 'HOOK_EXTRACARRIER' => Module::hookExec('extraCarrier', array('address' => $address)), + 'HOOK_BEFORECARRIER' => Module::hookExec('beforeCarrier', array('carriers' => $carriers)) + )); + } + + protected function _assignWrappingAndTOS() + { + // Wrapping fees + $wrapping_fees = (float)(Configuration::get('PS_GIFT_WRAPPING_PRICE')); + $wrapping_fees_tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX'))); + $wrapping_fees_tax_inc = $wrapping_fees * (1 + (((float)($wrapping_fees_tax->rate) / 100))); + + // TOS + $cms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)(self::$cookie->id_lang)); + $this->link_conditions = self::$link->getCMSLink($cms, $cms->link_rewrite, true); + if (!strpos($this->link_conditions, '?')) + $this->link_conditions .= '?content_only=1'; + else + $this->link_conditions .= '&content_only=1'; + + self::$smarty->assign(array( + 'checkedTOS' => (int)(self::$cookie->checkedTOS), + 'recyclablePackAllowed' => (int)(Configuration::get('PS_RECYCLABLE_PACK')), + 'giftAllowed' => (int)(Configuration::get('PS_GIFT_WRAPPING')), + 'cms_id' => (int)(Configuration::get('PS_CONDITIONS_CMS_ID')), + 'conditions' => (int)(Configuration::get('PS_CONDITIONS')), + 'link_conditions' => $this->link_conditions, + 'recyclable' => (int)(self::$cart->recyclable), + 'gift_wrapping_price' => (float)(Configuration::get('PS_GIFT_WRAPPING_PRICE')), + 'total_wrapping_cost' => Tools::convertPrice($wrapping_fees_tax_inc, new Currency((int)(self::$cookie->id_currency))), + 'total_wrapping_tax_exc_cost' => Tools::convertPrice($wrapping_fees, new Currency((int)(self::$cookie->id_currency))))); + } + + protected function _assignPayment() + { + self::$smarty->assign(array( + 'HOOK_TOP_PAYMENT' => Module::hookExec('paymentTop'), + 'HOOK_PAYMENT' => Module::hookExecPayment() + )); + } + + /** + * Set id_carrier to 0 (no shipping price) + * + */ + protected function _setNoCarrier() + { + self::$cart->id_carrier = 0; + self::$cart->update(); + } + + /** + * Decides what the default carrier is and update the cart with it + * + * @param array $carriers + * @return number the id of the default carrier + */ + protected function _setDefaultCarrierSelection($carriers) + { + if (sizeof($carriers)) + { + $defaultCarrierIsPresent = false; + if ((int)self::$cart->id_carrier != 0) + foreach ($carriers AS $carrier) + if ($carrier['id_carrier'] == (int)self::$cart->id_carrier) + $defaultCarrierIsPresent = true; + if (!$defaultCarrierIsPresent) + foreach ($carriers AS $carrier) + if ($carrier['id_carrier'] == (int)Configuration::get('PS_CARRIER_DEFAULT')) + { + $defaultCarrierIsPresent = true; + self::$cart->id_carrier = (int)$carrier['id_carrier']; + } + if (!$defaultCarrierIsPresent) + self::$cart->id_carrier = (int)$carriers[0]['id_carrier']; + } + else + self::$cart->id_carrier = 0; + if (self::$cart->update()) + return self::$cart->id_carrier; + return 0; + } + +} + diff --git a/controllers/PasswordController.php b/controllers/PasswordController.php new file mode 100644 index 000000000..f587f5b91 --- /dev/null +++ b/controllers/PasswordController.php @@ -0,0 +1,116 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('MIN_PASSWD_LENGTH', 8); + +class PasswordControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = 'password.php'; + + parent::__construct(); + } + + public function process() + { + parent::process(); + + if (Tools::isSubmit('email')) + { + if (!($email = Tools::getValue('email')) OR !Validate::isEmail($email)) + $this->errors[] = Tools::displayError('Invalid e-mail address'); + else + { + $customer = new Customer(); + $customer->getByemail($email); + if (!Validate::isLoadedObject($customer)) + $this->errors[] = Tools::displayError('There is no account registered to this e-mail address.'); + else + { + if ((strtotime($customer->last_passwd_gen.'+'.(int)($min_time = Configuration::get('PS_PASSWD_TIME_FRONT')).' minutes') - time()) > 0) + $this->errors[] = Tools::displayError('You can regenerate your password only every').' '.(int)($min_time).' '.Tools::displayError('minute(s)'); + else + { + if (Mail::Send((int)(self::$cookie->id_lang), 'password_query', Mail::l('Password query confirmation'), + array('{email}' => $customer->email, + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{url}' => self::$link->getPageLink('password', true, NULL, 'token='.$customer->secure_key.'&id_customer='.(int)$customer->id)), + $customer->email, + $customer->firstname.' '.$customer->lastname)) + self::$smarty->assign(array('confirmation' => 2, 'email' => $customer->email)); + else + $this->errors[] = Tools::displayError('Error occurred when sending the e-mail.'); + } + } + } + } + elseif (($token = Tools::getValue('token')) && ($id_customer = (int)(Tools::getValue('id_customer')))) + { + $email = Db::getInstance()->getValue('SELECT `email` FROM '._DB_PREFIX_.'customer c WHERE c.`secure_key` = "'.pSQL($token).'" AND c.id_customer='.(int)($id_customer)); + if ($email) + { + $customer = new Customer(); + $customer->getByemail($email); + if ((strtotime($customer->last_passwd_gen.'+'.(int)($min_time = Configuration::get('PS_PASSWD_TIME_FRONT')).' minutes') - time()) > 0) + Tools::redirect('index.php?controller=authentication&error_regen_pwd'); + else + { + $customer->passwd = Tools::encrypt($password = Tools::passwdGen((int)(MIN_PASSWD_LENGTH))); + $customer->last_passwd_gen = date('Y-m-d H:i:s', time()); + if ($customer->update()) + { + if (Mail::Send((int)(self::$cookie->id_lang), 'password', Mail::l('Your password'), + array('{email}' => $customer->email, + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{passwd}' => $password), + $customer->email, + $customer->firstname.' '.$customer->lastname)) + self::$smarty->assign(array('confirmation' => 1, 'email' => $customer->email)); + else + $this->errors[] = Tools::displayError('Error occurred when sending the e-mail.'); + } + else + $this->errors[] = Tools::displayError('An error occurred with your account and your new password cannot be sent to your e-mail. Please report your problem using the contact form.'); + } + } + else + $this->errors[] = Tools::displayError('We cannot regenerate your password with the data you submitted'); + } + elseif (($token = Tools::getValue('token')) || ($id_customer = Tools::getValue('id_customer'))) + $this->errors[] = Tools::displayError('We cannot regenerate your password with the data you submitted'); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'password.tpl'); + } +} + diff --git a/controllers/PdfInvoiceController.php b/controllers/PdfInvoiceController.php new file mode 100644 index 000000000..5e815fceb --- /dev/null +++ b/controllers/PdfInvoiceController.php @@ -0,0 +1,50 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PdfInvoiceControllerCore extends FrontController +{ + public function process() + { + parent::process(); + + $cookie = self::$cookie; + if (!$cookie->isLogged() AND !Tools::getValue('secure_key')) + Tools::redirect('index.php?controller=authentication&back=pdf-invoice'); + if (!(int)(Configuration::get('PS_INVOICE'))) + die(Tools::displayError('Invoices are disabled in this shop.')); + if (isset($_GET['id_order']) AND Validate::isUnsignedId($_GET['id_order'])) + $order = new Order((int)($_GET['id_order'])); + if (!isset($order) OR !Validate::isLoadedObject($order)) + die(Tools::displayError('Invoice not found')); + elseif ((isset($cookie->id_customer) AND $order->id_customer != $cookie->id_customer) OR (Tools::isSubmit('secure_key') AND $order->secure_key != Tools::getValue('secure_key'))) + die(Tools::displayError('Invoice not found')); + elseif (!OrderState::invoiceAvailable($order->getCurrentState()) AND !$order->invoice_number) + die(Tools::displayError('No invoice available')); + else + PDF::invoice($order); + } +} \ No newline at end of file diff --git a/controllers/PricesDropController.php b/controllers/PricesDropController.php new file mode 100644 index 000000000..eac4685f0 --- /dev/null +++ b/controllers/PricesDropController.php @@ -0,0 +1,65 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7506 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PricesDropControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = 'prices-drop.php'; + + parent::__construct(); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'product_list.css'); + } + + public function process() + { + parent::process(); + + $this->productSort(); + $nbProducts = Product::getPricesDrop((int)self::$cookie->id_lang, NULL, NULL, true); + $this->pagination($nbProducts); + + self::$smarty->assign(array( + 'products' => Product::getPricesDrop((int)self::$cookie->id_lang, (int)$this->p - 1, (int)$this->n, false, $this->orderBy, $this->orderWay, false, false, (int)$this->id_current_shop), + 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + 'nbProducts' => $nbProducts, + 'homeSize' => Image::getSize('home') + )); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'prices-drop.tpl'); + } +} + diff --git a/controllers/ProductController.php b/controllers/ProductController.php new file mode 100644 index 000000000..dc92fbad6 --- /dev/null +++ b/controllers/ProductController.php @@ -0,0 +1,470 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7331 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ProductControllerCore extends FrontController +{ + protected $product; + + public function setMedia() + { + parent::setMedia(); + + Tools::addCSS(_THEME_CSS_DIR_.'product.css'); + Tools::addCSS(_PS_CSS_DIR_.'jquery.fancybox-1.3.4.css', 'screen'); + Tools::addJS(array( + _PS_JS_DIR_.'jquery/jquery.fancybox-1.3.4.js', + _PS_JS_DIR_.'jquery/jquery.idTabs.modified.js', + _PS_JS_DIR_.'jquery/jquery.scrollTo-1.4.2-min.js', + _PS_JS_DIR_.'jquery/jquery.serialScroll-1.2.2-min.js', + _THEME_JS_DIR_.'tools.js', + _THEME_JS_DIR_.'product.js')); + + if (Configuration::get('PS_DISPLAY_JQZOOM') == 1) + { + Tools::addCSS(_PS_CSS_DIR_.'jqzoom.css', 'screen'); + Tools::addJS(_PS_JS_DIR_.'jquery/jquery.jqzoom.js'); + } + } + + public function preProcess() + { + if ($id_product = (int)Tools::getValue('id_product')) + $this->product = new Product($id_product, true, self::$cookie->id_lang, (int)$this->id_current_shop); + + if (!Validate::isLoadedObject($this->product)) + { + header('HTTP/1.1 404 Not Found'); + header('Status: 404 Not Found'); + } + else + { + // Automatically redirect to the canonical URL if the current in is the right one + // $_SERVER['HTTP_HOST'] must be replaced by the real canonical domain + if (Validate::isLoadedObject($this->product)) + { + $canonicalURL = self::$link->getProductLink($this->product); + if (!preg_match('/^'.Tools::pRegexp($canonicalURL, '/').'([&?].*)?$/i', Tools::getProtocol().$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) + { + header('HTTP/1.0 301 Moved'); + if (defined('_PS_MODE_DEV_') AND _PS_MODE_DEV_) + die('[Debug] This page has moved
Please use the following URL instead: '.$canonicalURL.''); + Tools::redirectLink($canonicalURL); + } + } + } + + parent::preProcess(); + + if((int)(Configuration::get('PS_REWRITING_SETTINGS'))) + if ($id_product = (int)Tools::getValue('id_product')) + { + $rewrite_infos = Product::getUrlRewriteInformations((int)$id_product); + + $default_rewrite = array(); + foreach ($rewrite_infos AS $infos) + $default_rewrite[$infos['id_lang']] = self::$link->getProductLink((int)$id_product, $infos['link_rewrite'], $infos['category_rewrite'], $infos['ean13'], (int)$infos['id_lang']); + + self::$smarty->assign('lang_rewrite_urls', $default_rewrite); + } + } + + public function process() + { + global $cart, $currency;; + parent::process(); + + if (!$id_product = (int)(Tools::getValue('id_product')) OR !Validate::isUnsignedId($id_product)) + $this->errors[] = Tools::displayError('Product not found'); + else + { + if (!Validate::isLoadedObject($this->product) OR !$this->product->isAssociatedToShop((int)$this->id_current_shop) + OR (!$this->product->active AND (Tools::getValue('adtoken') != Tools::encrypt('PreviewProduct'.$this->product->id)) + || !file_exists(dirname(__FILE__).'/../'.Tools::getValue('ad').'/ajax.php'))) + { + header('HTTP/1.1 404 page not found'); + $this->errors[] = Tools::displayError('Pproduct is no longer available.'); + } + elseif (!$this->product->checkAccess((int)(self::$cookie->id_customer))) + $this->errors[] = Tools::displayError('You do not have access to this product.'); + else + { + self::$smarty->assign('virtual', ProductDownload::getIdFromIdProduct((int)($this->product->id))); + + if (!$this->product->active) + self::$smarty->assign('adminActionDisplay', true); + + /* rewrited url set */ + $rewrited_url = self::$link->getProductLink($this->product->id, $this->product->link_rewrite); + + /* Product pictures management */ + require_once('images.inc.php'); + self::$smarty->assign('customizationFormTarget', Tools::safeOutput(urldecode($_SERVER['REQUEST_URI']))); + + if (Tools::isSubmit('submitCustomizedDatas')) + { + $this->pictureUpload($this->product, $cart); + $this->textRecord($this->product, $cart); + $this->formTargetFormat(); + } + elseif (isset($_GET['deletePicture']) AND !$cart->deletePictureToProduct((int)($this->product->id), (int)(Tools::getValue('deletePicture')))) + $this->errors[] = Tools::displayError('An error occurred while deleting the selected picture'); + + $files = self::$cookie->getFamily('pictures_'.(int)($this->product->id)); + $textFields = self::$cookie->getFamily('textFields_'.(int)($this->product->id)); + foreach ($textFields as $key => $textField) + $textFields[$key] = str_replace('
', "\n", $textField); + self::$smarty->assign(array( + 'pictures' => $files, + 'textFields' => $textFields)); + + $productPriceWithTax = Product::getPriceStatic($id_product, true, NULL, 6); + if (Product::$_taxCalculationMethod == PS_TAX_INC) + $productPriceWithTax = Tools::ps_round($productPriceWithTax, 2); + + $productPriceWithoutEcoTax = (float)($productPriceWithTax - $this->product->ecotax); + $configs = Configuration::getMultiple(array('PS_ORDER_OUT_OF_STOCK', 'PS_LAST_QTIES')); + + /* Features / Values */ + $features = $this->product->getFrontFeatures((int)(self::$cookie->id_lang)); + $attachments = $this->product->getAttachments((int)(self::$cookie->id_lang)); + + /* Category */ + $category = false; + if (isset($_SERVER['HTTP_REFERER']) AND preg_match('!^(.*)\/([0-9]+)\-(.*[^\.])|(.*)id_category=([0-9]+)(.*)$!', $_SERVER['HTTP_REFERER'], $regs) AND !strstr($_SERVER['HTTP_REFERER'], '.html')) + { + if (isset($regs[2]) AND is_numeric($regs[2])) + { + if (Product::idIsOnCategoryId((int)($this->product->id), array('0' => array('id_category' => (int)($regs[2]))))) + $category = new Category((int)($regs[2]), (int)self::$cookie->id_lang, (int)$this->id_current_shop); + } + elseif (isset($regs[5]) AND is_numeric($regs[5])) + { + if (Product::idIsOnCategoryId((int)($this->product->id), array('0' => array('id_category' => (int)($regs[5]))))) + $category = new Category((int)($regs[5]), (int)self::$cookie->id_lang, (int)$this->id_current_shop); + } + } + if (!$category) + $category = new Category($this->product->id_category_default, (int)self::$cookie->id_lang, (int)$this->id_current_shop); + + if (isset($category) AND Validate::isLoadedObject($category)) + { + self::$smarty->assign(array( + 'path' => Tools::getPath((int)$category->id, $this->product->name, true), + 'category' => $category, + 'subCategories' => $category->getSubCategories((int)(self::$cookie->id_lang), true), + 'id_category_current' => (int)($category->id), + 'id_category_parent' => (int)($category->id_parent), + 'return_category_name' => Tools::safeOutput($category->name))); + } + else + self::$smarty->assign('path', Tools::getPath((int)$this->product->id_category_default, $this->product->name)); + + self::$smarty->assign('return_link', (isset($category->id) AND $category->id) ? Tools::safeOutput(self::$link->getCategoryLink($category)) : 'javascript: history.back();'); + + $lang = Configuration::get('PS_LANG_DEFAULT'); + if (Pack::isPack((int)($this->product->id), (int)($lang)) AND !Pack::isInStock((int)($this->product->id), (int)($lang))) + $this->product->quantity = 0; + + $group_reduction = (100 - Group::getReduction((int)(self::$cookie->id_customer))) / 100; + $id_customer = (isset(self::$cookie->id_customer) AND self::$cookie->id_customer) ? (int)(self::$cookie->id_customer) : 0; + $id_group = $id_customer ? (int)(Customer::getDefaultGroupId($id_customer)) : _PS_DEFAULT_CUSTOMER_GROUP_; + $id_country = (int)($id_customer ? Customer::getCurrentCountry($id_customer) : Configuration::get('PS_COUNTRY_DEFAULT')); + + // Tax + $tax = (float)(Tax::getProductTaxRate((int)($this->product->id), $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + self::$smarty->assign('tax_rate', $tax); + + $ecotax_rate = (float) Tax::getProductEcotaxRate($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + $ecotaxTaxAmount = Tools::ps_round($this->product->ecotax, 2); + if (Product::$_taxCalculationMethod == PS_TAX_INC && (int)Configuration::get('PS_TAX')) + $ecotaxTaxAmount = Tools::ps_round($ecotaxTaxAmount * (1 + $ecotax_rate / 100), 2); + + self::$smarty->assign(array( + 'quantity_discounts' => $this->formatQuantityDiscounts(SpecificPrice::getQuantityDiscounts((int)($this->product->id), (int)(Shop::getCurrentShop()), (int)(self::$cookie->id_currency), $id_country, $id_group), $this->product->getPrice(Product::$_taxCalculationMethod == PS_TAX_INC, false), (float)($tax)), + 'product' => $this->product, + 'ecotax_tax_inc' => $ecotaxTaxAmount, + 'ecotax_tax_exc' => Tools::ps_round($this->product->ecotax, 2), + 'ecotaxTax_rate' => $ecotax_rate, + 'homeSize' => Image::getSize('home'), + 'product_manufacturer' => new Manufacturer((int)($this->product->id_manufacturer), Configuration::get('PS_LANG_DEFAULT')), + 'token' => Tools::getToken(false), + 'productPriceWithoutEcoTax' => (float)($productPriceWithoutEcoTax), + 'features' => $features, + 'attachments' => $attachments, + 'allow_oosp' => $this->product->isAvailableWhenOutOfStock((int)($this->product->out_of_stock)), + 'last_qties' => (int)($configs['PS_LAST_QTIES']), + 'group_reduction' => $group_reduction, + 'col_img_dir' => _PS_COL_IMG_DIR_, + )); + self::$smarty->assign(array( + 'HOOK_EXTRA_LEFT' => Module::hookExec('extraLeft'), + 'HOOK_EXTRA_RIGHT' => Module::hookExec('extraRight'), + 'HOOK_PRODUCT_OOS' => Hook::productOutOfStock($this->product), + 'HOOK_PRODUCT_FOOTER' => Hook::productFooter($this->product, $category), + 'HOOK_PRODUCT_ACTIONS' => Module::hookExec('productActions'), + 'HOOK_PRODUCT_TAB' => Module::hookExec('productTab'), + 'HOOK_PRODUCT_TAB_CONTENT' => Module::hookExec('productTabContent') + )); + + $images = $this->product->getImages((int)self::$cookie->id_lang, (int)$this->id_current_shop); + $productImages = array(); + foreach ($images AS $k => $image) + { + if ($image['cover']) + { + self::$smarty->assign('mainImage', $images[0]); + $cover = $image; + $cover['id_image'] = (Configuration::get('PS_LEGACY_IMAGES') ? ($this->product->id.'-'.$image['id_image']) : $image['id_image']); + $cover['id_image_only'] = (int)($image['id_image']); + } + $productImages[(int)($image['id_image'])] = $image; + } + if (!isset($cover)) + $cover = array('id_image' => Language::getIsoById(self::$cookie->id_lang).'-default', 'legend' => 'No picture', 'title' => 'No picture'); + $size = Image::getSize('large'); + self::$smarty->assign(array( + 'cover' => $cover, + 'imgWidth' => (int)($size['width']), + 'mediumSize' => Image::getSize('medium'), + 'largeSize' => Image::getSize('large'), + 'accessories' => $this->product->getAccessories((int)(self::$cookie->id_lang)))); + if (sizeof($productImages)) + self::$smarty->assign('images', $productImages); + + /* Attributes / Groups & colors */ + $colors = array(); + $attributesGroups = $this->product->getAttributesGroups((int)(self::$cookie->id_lang)); // @todo (RM) should only get groups and not all declination ? + if (is_array($attributesGroups) AND $attributesGroups) + { + $groups = array(); + $combinationImages = $this->product->getCombinationImages((int)(self::$cookie->id_lang)); + foreach ($attributesGroups AS $k => $row) + { + /* Color management */ + if (((isset($row['attribute_color']) AND $row['attribute_color']) OR (file_exists(_PS_COL_IMG_DIR_.$row['id_attribute'].'.jpg'))) AND $row['id_attribute_group'] == $this->product->id_color_default) + { + $colors[$row['id_attribute']]['value'] = $row['attribute_color']; + $colors[$row['id_attribute']]['name'] = $row['attribute_name']; + if (!isset($colors[$row['id_attribute']]['attributes_quantity'])) + $colors[$row['id_attribute']]['attributes_quantity'] = 0; + $colors[$row['id_attribute']]['attributes_quantity'] += (int)($row['quantity']); + } + + if (!isset($groups[$row['id_attribute_group']])) + { + $groups[$row['id_attribute_group']] = array( + 'name' => $row['public_group_name'], + 'is_color_group' => $row['is_color_group'], + 'default' => -1, + ); + } + + $groups[$row['id_attribute_group']]['attributes'][$row['id_attribute']] = $row['attribute_name']; + if ($row['default_on'] && $groups[$row['id_attribute_group']]['default'] == -1) + $groups[$row['id_attribute_group']]['default'] = (int)($row['id_attribute']); + if (!isset($groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']])) + $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] = 0; + $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] += (int)($row['quantity']); + + $combinations[$row['id_product_attribute']]['attributes_values'][$row['id_attribute_group']] = $row['attribute_name']; + $combinations[$row['id_product_attribute']]['attributes'][] = (int)($row['id_attribute']); + $combinations[$row['id_product_attribute']]['price'] = (float)($row['price']); + $combinations[$row['id_product_attribute']]['ecotax'] = (float)($row['ecotax']); + $combinations[$row['id_product_attribute']]['weight'] = (float)($row['weight']); + $combinations[$row['id_product_attribute']]['quantity'] = (int)($row['quantity']); + $combinations[$row['id_product_attribute']]['reference'] = $row['reference']; + $combinations[$row['id_product_attribute']]['unit_impact'] = $row['unit_price_impact']; + $combinations[$row['id_product_attribute']]['minimal_quantity'] = $row['minimal_quantity']; + $combinations[$row['id_product_attribute']]['id_image'] = isset($combinationImages[$row['id_product_attribute']][0]['id_image']) ? $combinationImages[$row['id_product_attribute']][0]['id_image'] : -1; + } + + //wash attributes list (if some attributes are unavailables and if allowed to wash it) + if (!Product::isAvailableWhenOutOfStock($this->product->out_of_stock) && Configuration::get('PS_DISP_UNAVAILABLE_ATTR') == 0) + { + foreach ($groups AS &$group) + foreach ($group['attributes_quantity'] AS $key => &$quantity) + if (!$quantity) + unset($group['attributes'][$key]); + + foreach ($colors AS $key => $color) + if (!$color['attributes_quantity']) + unset($colors[$key]); + } + + foreach ($groups AS &$group) + natcasesort($group['attributes']); + + foreach ($combinations AS $id_product_attribute => $comb) + { + $attributeList = ''; + foreach ($comb['attributes'] AS $id_attribute) + $attributeList .= '\''.(int)($id_attribute).'\','; + $attributeList = rtrim($attributeList, ','); + $combinations[$id_product_attribute]['list'] = $attributeList; + } + + self::$smarty->assign(array( + 'groups' => $groups, + 'combinaisons' => $combinations, /* Kept for compatibility purpose only */ + 'combinations' => $combinations, + 'colors' => (sizeof($colors) AND $this->product->id_color_default) ? $colors : false, + 'combinationImages' => $combinationImages)); + } + + self::$smarty->assign(array( + 'no_tax' => Tax::excludeTaxeOption() OR !Tax::getProductTaxRate((int)$this->product->id, $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}), + 'customizationFields' => $this->product->getCustomizationFields((int)(self::$cookie->id_lang)) + )); + + // Pack management + self::$smarty->assign('packItems', $this->product->cache_is_pack ? Pack::getItemTable($this->product->id, (int)(self::$cookie->id_lang), true) : array()); + self::$smarty->assign('packs', Pack::getPacksTable($this->product->id, (int)(self::$cookie->id_lang), true, 1)); + } + } + + self::$smarty->assign(array( + 'ENT_NOQUOTES' => ENT_NOQUOTES, + 'outOfStockAllowed' => (int)(Configuration::get('PS_ORDER_OUT_OF_STOCK')), + 'errors' => $this->errors, + 'categories' => Category::getHomeCategories((int)(self::$cookie->id_lang)), + 'have_image' => Product::getCover((int)(Tools::getValue('id_product'))), + 'tax_enabled' => Configuration::get('PS_TAX'), + 'display_qties' => (int)(Configuration::get('PS_DISPLAY_QTIES')), + 'display_ht' => !Tax::excludeTaxeOption(), + 'ecotax' => (!sizeof($this->errors) AND $this->product->ecotax > 0 ? Tools::convertPrice((float)($this->product->ecotax)) : 0), + 'currencySign' => $currency->sign, + 'currencyRate' => $currency->conversion_rate, + 'currencyFormat' => $currency->format, + 'currencyBlank' => $currency->blank, + 'jqZoomEnabled' => Configuration::get('PS_DISPLAY_JQZOOM') + )); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'product.tpl'); + } + + public function pictureUpload(Product $product, Cart $cart) + { + if (!$fieldIds = $this->product->getCustomizationFieldIds()) + return false; + $authorizedFileFields = array(); + foreach ($fieldIds AS $fieldId) + if ($fieldId['type'] == _CUSTOMIZE_FILE_) + $authorizedFileFields[(int)($fieldId['id_customization_field'])] = 'file'.(int)($fieldId['id_customization_field']); + $indexes = array_flip($authorizedFileFields); + foreach ($_FILES AS $fieldName => $file) + if (in_array($fieldName, $authorizedFileFields) AND isset($file['tmp_name']) AND !empty($file['tmp_name'])) + { + $fileName = md5(uniqid(rand(), true)); + if ($error = checkImage($file, (int)(Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE')))) + $this->errors[] = $error; + + if ($error OR (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($file['tmp_name'], $tmpName))) + return false; + /* Original file */ + elseif (!imageResize($tmpName, _PS_UPLOAD_DIR_.$fileName)) + $this->errors[] = Tools::displayError('An error occurred during the image upload.'); + /* A smaller one */ + elseif (!imageResize($tmpName, _PS_UPLOAD_DIR_.$fileName.'_small', (int)(Configuration::get('PS_PRODUCT_PICTURE_WIDTH')), (int)(Configuration::get('PS_PRODUCT_PICTURE_HEIGHT')))) + $this->errors[] = Tools::displayError('An error occurred during the image upload.'); + elseif (!chmod(_PS_UPLOAD_DIR_.$fileName, 0777) OR !chmod(_PS_UPLOAD_DIR_.$fileName.'_small', 0777)) + $this->errors[] = Tools::displayError('An error occurred during the image upload.'); + else + $cart->addPictureToProduct((int)($this->product->id), $indexes[$fieldName], $fileName); + unlink($tmpName); + } + return true; + } + + public function textRecord(Product $product, Cart $cart) + { + if (!$fieldIds = $this->product->getCustomizationFieldIds()) + return false; + $authorizedTextFields = array(); + foreach ($fieldIds AS $fieldId) + if ($fieldId['type'] == _CUSTOMIZE_TEXTFIELD_) + $authorizedTextFields[(int)($fieldId['id_customization_field'])] = 'textField'.(int)($fieldId['id_customization_field']); + $indexes = array_flip($authorizedTextFields); + foreach ($_POST AS $fieldName => $value) + if (in_array($fieldName, $authorizedTextFields) AND !empty($value)) + { + if (!Validate::isMessage($value)) + $this->errors[] = Tools::displayError('Invalid message'); + else + $cart->addTextFieldToProduct((int)($this->product->id), $indexes[$fieldName], $value); + } + elseif (in_array($fieldName, $authorizedTextFields) AND empty($value)) + $cart->deleteTextFieldFromProduct((int)($this->product->id), $indexes[$fieldName]); + } + + public function formTargetFormat() + { + $customizationFormTarget = Tools::safeOutput(urldecode($_SERVER['REQUEST_URI'])); + foreach ($_GET AS $field => $value) + if (strncmp($field, 'group_', 6) == 0) + $customizationFormTarget = preg_replace('/&group_([[:digit:]]+)=([[:digit:]]+)/', '', $customizationFormTarget); + if (isset($_POST['quantityBackup'])) + self::$smarty->assign('quantityBackup', (int)($_POST['quantityBackup'])); + self::$smarty->assign('customizationFormTarget', $customizationFormTarget); + } + + public function formatQuantityDiscounts($specificPrices, $price, $taxRate) + { + foreach ($specificPrices AS $key => &$row) + { + $row['quantity'] = &$row['from_quantity']; + if ($row['price'] != 0) // The price may be directly set + { + $cur_price = (Product::$_taxCalculationMethod == PS_TAX_EXC ? $row['price'] : $row['price'] * (1 + $taxRate / 100)); + + if ($row['reduction_type'] == 'amount') + { + $cur_price = Product::$_taxCalculationMethod == PS_TAX_INC ? $cur_price - $row['reduction'] : $cur_price - ($row['reduction'] / (1 + $taxRate / 100)); + } else { + $cur_price = $cur_price * ( 1 - ($row['reduction'])); + } + + $row['real_value'] = $price - $cur_price; + } + else + { + if ($row['reduction_type'] == 'amount') + { + $row['real_value'] = Product::$_taxCalculationMethod == PS_TAX_INC ? $row['reduction'] : $row['reduction'] / (1 + $taxRate / 100); + } else { + $row['real_value'] = $row['reduction'] * 100; + } + } + $row['nextQuantity'] = (isset($specificPrices[$key + 1]) ? (int)($specificPrices[$key + 1]['from_quantity']) : -1); + } + return $specificPrices; + } +} + diff --git a/controllers/SearchController.php b/controllers/SearchController.php new file mode 100644 index 000000000..de59284c2 --- /dev/null +++ b/controllers/SearchController.php @@ -0,0 +1,142 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SearchControllerCore extends FrontController +{ + public $instantSearch; + public $ajaxSearch; + + public function __construct() + { + $this->php_self = 'search.php'; + + parent::__construct(); + + $this->instantSearch = Tools::getValue('instantSearch'); + $this->ajaxSearch = Tools::getValue('ajaxSearch'); + } + + public function preProcess() + { + parent::preProcess(); + + $query = urldecode(Tools::getValue('q')); + if ($this->ajaxSearch) + { + self::$link = new Link(); + $searchResults = Search::find((int)(Tools::getValue('id_lang')), $query, 1, 10, 'position', 'desc', true, true, (int)$this->id_current_shop); + foreach ($searchResults AS &$product) + $product['product_link'] = self::$link->getProductLink($product['id_product'], $product['prewrite'], $product['crewrite']); + die(Tools::jsonEncode($searchResults)); + } + + if ($this->instantSearch && !is_array($query)) + { + $this->productSort(); + $this->n = abs((int)(Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')))); + $this->p = abs((int)(Tools::getValue('p', 1))); + $search = Search::find((int)(self::$cookie->id_lang), $query, $this->p, $this->n, $this->orderBy, $this->orderWay, false, true, (int)$this->id_current_shop); + Module::hookExec('search', array('expr' => $query, 'total' => $search['total'])); + $nbProducts = $search['total']; + $this->pagination($nbProducts); + self::$smarty->assign(array( + 'products' => $search['result'], // DEPRECATED (since to 1.4), not use this: conflict with block_cart module + 'search_products' => $search['result'], + 'nbProducts' => $search['total'], + 'search_query' => $query, + 'instantSearch' => $this->instantSearch, + 'homeSize' => Image::getSize('home'))); + } + elseif ($query = Tools::getValue('search_query', Tools::getValue('ref')) AND !is_array($query)) + { + $this->productSort(); + $this->n = abs((int)(Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')))); + $this->p = abs((int)(Tools::getValue('p', 1))); + $search = Search::find((int)(self::$cookie->id_lang), $query, $this->p, $this->n, $this->orderBy, $this->orderWay, false, true, (int)$this->id_current_shop); + Module::hookExec('search', array('expr' => $query, 'total' => $search['total'])); + $nbProducts = $search['total']; + $this->pagination($nbProducts); + self::$smarty->assign(array( + 'products' => $search['result'], // DEPRECATED (since to 1.4), not use this: conflict with block_cart module + 'search_products' => $search['result'], + 'nbProducts' => $search['total'], + 'search_query' => $query, + 'homeSize' => Image::getSize('home'))); + } + elseif ($tag = urldecode(Tools::getValue('tag')) AND !is_array($tag)) + { + $nbProducts = (int)(Search::searchTag((int)(self::$cookie->id_lang), $tag, true)); + $this->pagination($nbProducts); + $result = Search::searchTag((int)(self::$cookie->id_lang), $tag, false, $this->p, $this->n, $this->orderBy, $this->orderWay, false, true, (int)$this->id_current_shop); + Module::hookExec('search', array('expr' => $tag, 'total' => sizeof($result))); + self::$smarty->assign(array( + 'search_tag' => $tag, + 'products' => $result, // DEPRECATED (since to 1.4), not use this: conflict with block_cart module + 'search_products' => $result, + 'nbProducts' => $nbProducts, + 'homeSize' => Image::getSize('home'))); + } + else + { + self::$smarty->assign(array( + 'products' => array(), + 'search_products' => array(), + 'pages_nb' => 1, + 'nbProducts' => 0)); + } + self::$smarty->assign('add_prod_display', Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY')); + } + + public function displayHeader() + { + if (!$this->instantSearch AND !$this->ajaxSearch) + parent::displayHeader(); + else + self::$smarty->assign('static_token', Tools::getToken(false)); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'search.tpl'); + } + + public function displayFooter() + { + if (!$this->instantSearch AND !$this->ajaxSearch) + parent::displayFooter(); + } + + public function setMedia() + { + parent::setMedia(); + + if (!$this->instantSearch AND !$this->ajaxSearch) + Tools::addCSS(_THEME_CSS_DIR_.'product_list.css'); + } +} + diff --git a/controllers/SitemapController.php b/controllers/SitemapController.php new file mode 100644 index 000000000..7a7dc1068 --- /dev/null +++ b/controllers/SitemapController.php @@ -0,0 +1,63 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SitemapControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = 'sitemap.php'; + + parent::__construct(); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'sitemap.css'); + Tools::addJS(_THEME_JS_DIR_.'tools/treeManagement.js'); + } + + public function process() + { + parent::process(); + self::$smarty->assign('categoriesTree', Category::getRootCategory(NULL, (int)$this->id_current_shop)->recurseLiteCategTree(0)); + self::$smarty->assign('categoriescmsTree', CMSCategory::getRecurseCategory(_USER_ID_LANG_, 1, 1, 1, (int)$this->id_current_shop)); + self::$smarty->assign('voucherAllowed', (int)(Configuration::get('PS_VOUCHERS'))); + $blockmanufacturer = Module::getInstanceByName('blockmanufacturer'); + $blocksupplier = Module::getInstanceByName('blocksupplier'); + self::$smarty->assign('display_manufacturer_link', (((int)$blockmanufacturer->id) ? true : false)); + self::$smarty->assign('display_supplier_link', (((int)$blocksupplier->id) ? true : false)); + self::$smarty->assign('PS_DISPLAY_SUPPLIERS', Configuration::get('PS_DISPLAY_SUPPLIERS')); + self::$smarty->assign('display_store', Configuration::get('PS_STORES_DISPLAY_SITEMAP')); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'sitemap.tpl'); + } +} diff --git a/controllers/StatisticsController.php b/controllers/StatisticsController.php new file mode 100644 index 000000000..d8fcf6cc6 --- /dev/null +++ b/controllers/StatisticsController.php @@ -0,0 +1,64 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class StatisticsControllerCore extends FrontController +{ + public function process() + { + parent::process(); + + if (!isset($_POST['token']) OR !isset($_POST['type'])) + die; + + if ($_POST['type'] == 'navinfo') + { + if (sha1($_POST['id_guest']._COOKIE_KEY_) != $_POST['token']) + die; + + $guest = new Guest((int)$_POST['id_guest']); + $guest->javascript = true; + $guest->screen_resolution_x = (int)($_POST['screen_resolution_x']); + $guest->screen_resolution_y = (int)($_POST['screen_resolution_y']); + $guest->screen_color = (int)($_POST['screen_color']); + $guest->sun_java = (int)($_POST['sun_java']); + $guest->adobe_flash = (int)($_POST['adobe_flash']); + $guest->adobe_director = (int)($_POST['adobe_director']); + $guest->apple_quicktime = (int)($_POST['apple_quicktime']); + $guest->real_player = (int)($_POST['real_player']); + $guest->windows_media = (int)($_POST['windows_media']); + $guest->update(); + } + elseif ($_POST['type'] == 'pagetime') + { + if (sha1($_POST['id_connections'].$_POST['id_page'].$_POST['time_start']._COOKIE_KEY_) != $_POST['token']) + die; + if (!Validate::isInt($_POST['time']) OR $_POST['time'] <= 0) + die; + Connection::setPageTime((int)$_POST['id_connections'], (int)$_POST['id_page'], substr($_POST['time_start'], 0, 19), intval($_POST['time'])); + } + } +} \ No newline at end of file diff --git a/controllers/StoresController.php b/controllers/StoresController.php new file mode 100644 index 000000000..ba93c9faa --- /dev/null +++ b/controllers/StoresController.php @@ -0,0 +1,216 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class StoresControllerCore extends FrontController +{ + public function __construct() + { + $this->php_self = 'stores.php'; + + parent::__construct(); + } + + public function preProcess() + { + global $smarty, $cookie; + + $simplifiedStoreLocator = Configuration::get('PS_STORES_SIMPLIFIED'); + $distanceUnit = Configuration::get('PS_DISTANCE_UNIT'); + if (!in_array($distanceUnit, array('km', 'mi'))) + $distanceUnit = 'km'; + + if ($simplifiedStoreLocator) + { + $stores = Db::getInstance()->ExecuteS(' + SELECT s.*, cl.name country, st.iso_code state + FROM '._DB_PREFIX_.'store_shop ss + LEFT JOIN '._DB_PREFIX_.'store s ON (ss.id_store = s.id_store) + LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) + LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) + WHERE s.active = 1 AND cl.id_lang = '.(int)($cookie->id_lang).' AND ss.id_shop='.(int)$this->id_current_shop); + + foreach ($stores AS &$store) + $store['has_picture'] = file_exists(_PS_STORE_IMG_DIR_.(int)($store['id_store']).'.jpg'); + } + else + { + if (Tools::getValue('all') == 1) + { + $stores = Db::getInstance()->ExecuteS(' + SELECT s.*, cl.name country, st.iso_code state + FROM '._DB_PREFIX_.'store_shop ss + LEFT JOIN '._DB_PREFIX_.'store s ON (ss.id_store = s.id_store) + LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) + LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) + WHERE s.active = 1 AND cl.id_lang = '.(int)($cookie->id_lang).' AND ss.id_shop='.(int)$this->id_current_shop); + } + else + { + $distance = (int)(Tools::getValue('radius', 100)); + $multiplicator = ($distanceUnit == 'km' ? 6371 : 3959); + + $stores = Db::getInstance()->ExecuteS(' + SELECT s.*, cl.name country, st.iso_code state, + ('.(int)($multiplicator).' * acos(cos(radians('.(float)(Tools::getValue('latitude')).')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.(float)(Tools::getValue('longitude')).')) + sin(radians('.(float)(Tools::getValue('latitude')).')) * sin(radians(latitude)))) distance, cl.id_country id_country + FROM '._DB_PREFIX_.'store_shop ss + LEFT JOIN '._DB_PREFIX_.'store s ON (ss.id_store = s.id_store) + LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) + LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) + WHERE s.active = 1 AND cl.id_lang = '.(int)($cookie->id_lang).' AND ss.id_shop='.(int)$this->id_current_shop.' + HAVING distance < '.(int)($distance).' + ORDER BY distance ASC + LIMIT 0,20'); + } + + if (Tools::getValue('ajax') == 1) + { + $dom = new DOMDocument('1.0'); + $node = $dom->createElement('markers'); + $parnode = $dom->appendChild($node); + + $days[1] = 'Monday'; + $days[2] = 'Tuesday'; + $days[3] = 'Wednesday'; + $days[4] = 'Thursday'; + $days[5] = 'Friday'; + $days[6] = 'Saturday'; + $days[7] = 'Sunday'; + + foreach ($stores AS $store) + { + $days_datas = array(); + $node = $dom->createElement('marker'); + $newnode = $parnode->appendChild($node); + $newnode->setAttribute('name', $store['name']); + $address = $this->_processStoreAddress($store); + + $other = ''; + if (!empty($store['hours'])) + { + $hours = unserialize($store['hours']); + + for ($i = 1; $i < 8; $i++) + { + $hours_datas = array(); + $hours_datas['day'] = $days[$i]; + $hours_datas['hours'] = $hours[(int)($i) - 1]; + $days_datas[] = $hours_datas; + } + $smarty->assign('days_datas', $days_datas); + $smarty->assign('id_country', $store['id_country']); + + $other .= self::$smarty->fetch(_PS_THEME_DIR_.'store_infos.tpl'); + } + + $newnode->setAttribute('addressNoHtml', strip_tags(str_replace('
', ' ', $address))); + $newnode->setAttribute('address', $address); + $newnode->setAttribute('other', $other); + $newnode->setAttribute('phone', $store['phone']); + $newnode->setAttribute('id_store', (int)($store['id_store'])); + $newnode->setAttribute('has_store_picture', file_exists(_PS_STORE_IMG_DIR_.(int)($store['id_store']).'.jpg')); + $newnode->setAttribute('lat', (float)($store['latitude'])); + $newnode->setAttribute('lng', (float)($store['longitude'])); + + if (isset($store['distance'])) + $newnode->setAttribute('distance', (int)($store['distance'])); + } + + header('Content-type: text/xml'); + die($dom->saveXML()); + } + else + $smarty->assign('hasStoreIcon', file_exists(dirname(__FILE__).'/../img/logo_stores.gif')); + } + + $smarty->assign(array('distance_unit' => $distanceUnit, 'simplifiedStoresDiplay' => $simplifiedStoreLocator, 'stores' => $stores, 'mediumSize' => Image::getSize('medium'))); + } + + private function _processStoreAddress($store) + { + $ignore_field = array( + 'firstname' =>1 + , 'lastname' =>1 + ); + + $out = ''; + $out_datas = array(); + + $address_datas = AddressFormat::getOrderedAddressFields($store['id_country']); + $state = (isset($store['id_state'])) ? new State($store['id_state']) : NULL; + + foreach ($address_datas as $data_line) + { + $data_fields = explode(' ', $data_line); + $adr_out = array(); + + $data_fields_mod = false; + foreach ($data_fields as $field_item) + { + $field_item = trim($field_item); + if (!isset($ignore_field[$field_item]) && !empty($store[$field_item]) && $store[$field_item] != '') + { + $adr_out[] = ($field_item == "city" && $state && isset($state->iso_code) && strlen($state->iso_code)) ? + $store[$field_item].', '.$state->iso_code : $store[$field_item]; + $data_fields_mod = true; + } + } + if ($data_fields_mod) + $out_datas[] = implode(' ', $adr_out); + } + + $out = implode('
', $out_datas); + return $out; + } + + + public function process() + { + global $link; + parent::process(); + + self::$smarty->assign(array( + 'defaultLat' => (float)Configuration::get('PS_STORES_CENTER_LAT'), + 'defaultLong' => (float)Configuration::get('PS_STORES_CENTER_LONG'), + 'searchUrl' => $link->getPageLink('stores') + )); + } + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'stores.css'); + if (!Configuration::get('PS_STORES_SIMPLIFIED')) + Tools::addJS(_THEME_JS_DIR_.'stores.js'); + Tools::addJS('http://maps.google.com/maps/api/js?sensor=true'); + } + + public function displayContent() + { + parent::displayContent(); + self::$smarty->display(_PS_THEME_DIR_.'stores.tpl'); + } +} diff --git a/controllers/SupplierController.php b/controllers/SupplierController.php new file mode 100644 index 000000000..2dd40e626 --- /dev/null +++ b/controllers/SupplierController.php @@ -0,0 +1,101 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class SupplierControllerCore extends FrontController +{ + protected $supplier; + + public function setMedia() + { + parent::setMedia(); + Tools::addCSS(_THEME_CSS_DIR_.'product_list.css'); + } + + public function process() + { + if ($id_supplier = Tools::getValue('id_supplier')) + { + $this->supplier = new Supplier((int)$id_supplier, self::$cookie->id_lang); + if (Validate::isLoadedObject($this->supplier) AND $this->supplier->active AND $this->supplier->isAssociatedToGroupShop((int)$this->id_current_shop)) + { + $nbProducts = $this->supplier->getProducts($id_supplier, NULL, NULL, NULL, $this->orderBy, $this->orderWay, true); + $this->pagination((int)$nbProducts); + self::$smarty->assign(array( + 'nb_products' => $nbProducts, + 'products' => $this->supplier->getProducts($id_supplier, (int)self::$cookie->id_lang, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay), + 'path' => ($this->supplier->active ? Tools::safeOutput($this->supplier->name) : ''), + 'supplier' => $this->supplier)); + } + else + { + header('HTTP/1.1 404 Not Found'); + header('Status: 404 Not Found'); + $this->errors[] = Tools::displayError('Supplier does not exist'); + } + } + else + { + if (Configuration::get('PS_DISPLAY_SUPPLIERS')) + { + $data = call_user_func(array('Supplier', 'getSuppliers'), true, (int)(self::$cookie->id_lang), true); + $nbProducts = count($data); + $this->pagination($nbProducts); + + $data = call_user_func(array('Supplier', 'getSuppliers'), true, (int)(self::$cookie->id_lang), true, $this->p, $this->n); + $imgDir = _PS_SUPP_IMG_DIR_; + foreach ($data AS &$item) + $item['image'] = (!file_exists($imgDir.'/'.$item['id_supplier'].'-medium.jpg')) ? + Language::getIsoById((int)(self::$cookie->id_lang)).'-default' : $item['id_supplier']; + self::$smarty->assign(array( + 'pages_nb' => ceil($nbProducts / (int)($this->n)), + 'nbSuppliers' => $nbProducts, + 'mediumSize' => Image::getSize('medium'), + 'suppliers' => $data, + 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + )); + } + else + self::$smarty->assign('nbSuppliers', 0); + } + } + + public function displayHeader() + { + parent::displayHeader(); + $this->productSort(); + } + + public function displayContent() + { + parent::displayContent(); + if ($this->supplier) + self::$smarty->display(_PS_THEME_DIR_.'supplier.tpl'); + else + self::$smarty->display(_PS_THEME_DIR_.'supplier-list.tpl'); + } + +} diff --git a/controllers/pdfOrderReturnController.php b/controllers/pdfOrderReturnController.php new file mode 100644 index 000000000..9f0df13d2 --- /dev/null +++ b/controllers/pdfOrderReturnController.php @@ -0,0 +1,49 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PdfOrderReturnControllerCore extends FrontController +{ + public function process() + { + parent::process(); + + $cookie = self::$cookie; + if (!$cookie->isLogged()) + Tools::redirect('index.php?controller=authentication&back=order-follow'); + + if (isset($_GET['id_order_return']) AND Validate::isUnsignedId($_GET['id_order_return'])) + $orderReturn = new OrderReturn((int)($_GET['id_order_return'])); + if (!isset($orderReturn) OR !Validate::isLoadedObject($orderReturn)) + die(Tools::displayError('Order return not found')); + else if ($orderReturn->id_customer != $cookie->id_customer) + die(Tools::displayError('Order return not found')); + else if ($orderReturn->state < 2) + die(Tools::displayError('Order return not confirmed')); + else + PDF::orderReturn($orderReturn); + } +} \ No newline at end of file diff --git a/controllers/pdfOrderSlipController.php b/controllers/pdfOrderSlipController.php new file mode 100644 index 000000000..7dcdc781d --- /dev/null +++ b/controllers/pdfOrderSlipController.php @@ -0,0 +1,51 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PdfOrderSlipControllerCore extends FrontController +{ + public function process() + { + parent::process(); + + $cookie = self::$cookie; + if (!$cookie->isLogged()) + Tools::redirect('index.php?controller=authentication&back=order-follow'); + + if (isset($_GET['id_order_slip']) AND Validate::isUnsignedId($_GET['id_order_slip'])) + $orderSlip = new OrderSlip((int)($_GET['id_order_slip'])); + if (!isset($orderSlip) OR !Validate::isLoadedObject($orderSlip)) + die(Tools::displayError('Order return not found')); + elseif ($orderSlip->id_customer != $cookie->id_customer) + die(Tools::displayError('Order return not found')); + $order = new Order((int)($orderSlip->id_order)); + if (!Validate::isLoadedObject($order)) + die(Tools::displayError('Order not found')); + $order->products = OrderSlip::getOrdersSlipProducts((int)($orderSlip->id), $order); + $ref = NULL; + PDF::invoice($order, 'D', false, $ref, $orderSlip); + } +} \ No newline at end of file diff --git a/css/admin-ie.css b/css/admin-ie.css new file mode 100644 index 000000000..77a7f4b38 --- /dev/null +++ b/css/admin-ie.css @@ -0,0 +1,2 @@ +fieldset {position:relative;padding-top:25px} +fieldset legend {position:absolute;top:-0.5em;left:1.1em} \ No newline at end of file diff --git a/css/admin.css b/css/admin.css new file mode 100644 index 000000000..1dedfd1b4 --- /dev/null +++ b/css/admin.css @@ -0,0 +1,1535 @@ +/* CSS Admin PrestaShop */ +* {font-family: Arial,Verdana,Helvetica,sans-serif} + +body { + margin: 0; + padding: 0; + font-size: 12px; + color: #000; + text-align: center; +/* behavior: url(csshover.htc); */ +} + +.float {float:left} +.floatr {float:right} + +a img { + border: 0; +} + +a { + color: #000; + text-decoration: none; + outline: 0pt; +} + +a:hover { + color: #222; + text-decoration: none; +} + +a.link, a.link:hover { + color: #999999; +} +a.link { + text-decoration: underline; +} +.warn a{ + text-decoration: underline; +} + +img { + vertical-align: middle; +} + +input { + vertical-align: middle; +} + +p { + margin: 0.5em 0; +} + +hr { + border: none; + padding: 0; + margin-top: 10px; + margin-bottom: 10px; +} + +.block { + display: block; +} + +/* FONTS */ + +.bold { + font-weight: bold; +} + +legend, th { + font-family : Trebuchet,Arial,Helvetica,sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + font-family : "Trebuchet MS",Trebuchet,Arial,Helvetica,sans-serif; +} + +h1 { + font-size: 1.6em; + margin: 0 0 .67em 0; +} +h2 { + font-size: 1.4em; + margin: 0 0 .83em 0; + color: #268CCD; +} +h3 { + font-size: 1.1em; + margin: 0 0 .83em 0; +} +h4 { + margin: 1.33em 0; +} +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +h3.blue { + color: #268CCD; +} + +.red { + color: red; +} + +form { + margin: 0; + padding: 0; +} + +form p { + margin: 0.5em 0 0 0; + padding: 0 0 0.5em 0; +} + +form sup { + color: #CC0000; + font-weight: bold; + vertical-align: text-top; +} +form .simulate-disable-input{ + min-width:127px; + display:inline-block; + padding:3px; + border:1px solid #E0D0B1; + background-color:#dddddd; + color:#666666; + font-size:12px; +} +.block-mail { + margin:0 0 20px 0; +} +.mail-form { + margin:0 0 0 220px; + width:auto; + color: #7F7F7F; + font-size: 0.85em; +} +.label-subject { + padding:0; + margin:0 0 10px 0; + text-align:left; +} +.label-subject input{ + width:555px; +} +.mail-label table { + width:555px; +} +.mails_field { + margin:0; + background: none repeat scroll 0 0 #FFFFF0; + border: 1px solid #DFD5C3; + font-size: 1.1em; + margin: 20px 0 20px 0; + padding: 2em 1em 1em 1em; + position:relative; +} + +.mails_field h3{ + position:absolute; + margin:0; + top:-10px; + font-size:1em; + background-color:#FFF6D3; + border:1px solid #DFD5C3; + padding: 2px 5px 2px 5px; + display:inline-block; +} + +.style-themeModuleMail { + margin: 0; + padding: 0.2em 0.5em; + border: 1px solid #DFD5C3; + background: #FFF6D3; + font-weight: bold; + text-align: left; + cursor : pointer; + font-size: 12px; +} + +.style-themeModuleName { + margin: 0; + padding: 0.2em 0.5em; + border: 1px solid #DFD5C3; + background: #FFF6D3; + font-weight: bold; + text-align: left; + cursor : pointer; + font-size: 12px; +} + +.margin-form { + padding: 0 0 1em 210px; + color: #7F7F7F; + font-size: 0.85em; +} + +fieldset.width1 .margin-form { + margin: 0 0 1em 130px; +} + +fieldset img { + padding: 0 4px 0 0; + vertical-align: bottom; +} + +label { + float: left; + width: 200px; + padding: 0.2em 0.5em 0 0; + text-align: right; + font-weight: bold; +} + +#preview_import label { + float:left; + font-weight:bold; + padding:0.2em 0 0; + text-align:left; + width:270px; +} + +label.t { + float: none; + clear: none; + padding: 0px; + margin: 0px; + font-weight: bold; + font-size: 12px; +} +label.std { + float: none; + margin: 0px; + width: 170px; + display: block; + font-size: 12px; + text-align: right; + font-weight: bold; +} +form div.std { + margin-top: -2em; +} + +fieldset.width1 label { + width: 110px; +} + +label:after { + clear: both; +} + +input, textarea, option { + color: #000; + font-size: 12px; + margin: 0; + padding: 0; +} + +input[type="text"], input[type="password"], input[type="file"], textarea { + padding: 2px 4px; +} + +input[type="text"], input[type="password"], input[type="file"], textarea, select, option { + background-color:#FFF; +} +input[type="radio"], input[type="checkbox"] { + background-color:transparent; +} + +input:focus, textarea:focus { + background-color: #F0EBD6; +} + +fieldset { + _position: relative; +} + +legend { + _position: relative; + _top: -2em; + _margin-top: 12px; +} +select optgroup { + background: #fff; + padding: 2px; + color: #000 +} +select optgroup option { + padding: 0 9px; + color: #000 +} + +.lab_modules_positions { + float: none; + text-align: left; + font-weight: normal; + padding: 0; + cursor: pointer; + display: block; + width: 425px; +} + +.lab_modules { + float: none; + text-align: left; + font-weight: normal; + padding-left: 10px; + cursor: pointer; + display: block; + width: 350px; +} + +/* STRUCTURE */ + +#container { + width: 1024px; + margin: 0 auto 2em auto; + text-align: left; +} + +#main { + clear: left; + /*border: 1px solid #999; + border-bottom: none;*/ +} + +#content { + padding: 1.25em; +} + +#news { + width: 640px; + border: 1px solid #E0D0B1; +} + +#help { + float: right; + width: 150px; + padding: 4px; + border: 1px solid #DFD5C3; + font-size: 0.9em; +} + +#image { + float: none; + padding: 6px; + background: #fff; + border: 1px solid #DFD5C3; + font-size: 0.9em; + text-align: center; +} +#image img { margin: 0; padding: 0 } + +#id_image_attr +{ + list-style: none; +} + +#product_link { + width: 240px; + float: right; + padding: 4px; + margin-top: 8px; + font-size: 0.9em; + text-align: center; + clear: right; +} + +#help:after, +#image:after { + clear: both; +} + +/* NAV */ + +#nav { + float: right; + margin: 1em 0; + font-size: 1.1em; + font-weight: bold; + vertical-align: middle; +} + +#nav li { + display: inline; + list-style: none; + margin: 0 0 0 2em +} + +#nav img { + vertical-align: bottom; +} + +.warn .pico { + vertical-align: middle; + padding: 0; + margin: 0 +} + +#content .alert { + width: 500px; + margin: 0 0 15px 0; + padding: 10px 15px; + border-top: 1px solid #DF7B7B; + border-bottom: 1px solid #DF7B7B; + background-color: #FFE6E6; +} + +#content .warning { + width: 400px; + margin: 0 0 15px 0; + line-height: 20px; + padding: 10px 20px 10px 20px; + border-top: 1px solid #FF9900; + border-bottom: 1px solid #FF9900; + background-color: #FFEBCC; +} + +#unhook_button_position_bottom { + overflow: hidden; + width: 600px; + padding-top: 10px; +} + +#unhook_button_position_top { + overflow: hidden; + width: 600px; +} + +#content .conf, #content .warn, #content .error { + color:#383838; + font-weight:700; + margin: 0 0 10px 0; + line-height: 20px; + padding: 10px 15px; +} + +#content .error-inline { + color:#ff0000; + font-weight:bold; +} + +#content .conf { + border: 1px solid #72CB67; + background-color: #DFFAD3; +} +#content .conf img, #content .warn img, #content .error img { + margin:-4px 5px 0 0; +} + +#content .error { + border: 1px solid #EC9B9B; + background-color: #FAE2E3; +} + +#content .warn { + border: 1px solid #D3C200; + background-color: #FFFAC6; +} + +#content .error ol { + clear: both; + margin-top: 5px; + padding-bottom: 0; +} + +#content .error ol li{ + font-weight:200; + margin-left:30px; +} + +#content .confirm h3 { + padding: 0 0 0 20px; + background: url(../img/admin/ok.gif) no-repeat 0 0; +} + +#content .warn h3 { + padding: 0 0 0 20px; + background: url(../img/admin/warning.gif) no-repeat 0 0; +} + +#content .error h3 { + padding: 0 0 0 20px; + background: url(../img/admin/warning.gif) no-repeat 0 0; +} + +/* CONTENT - COLUMN */ + +.column { + float: left; + width: 173px; + margin: 0 50px 1.5em 0; + padding: 10px; + -moz-border-radius: 20px; + text-align: center; +} + +#col_1 { + height: 235px; + color: #FFFFFF; + background: #FF8C76 url(../img/admin/col_1.gif) no-repeat; +} + +#col_2 { + height: 235px; + color: #FFFFFF; + background: #FFC44F url(../img/admin/col_2.gif) no-repeat; +} + +#col_3 { + height: 235px; + color: #FFFFFF; + background: #8CFF70 url(../img/admin/col_3.gif) no-repeat; +} + +/* CONTENT - NEWS */ + +#news img { + padding: 0 6px 0 0; + vertical-align: middle; +} + +#news .infos, +#news .content { + margin: 0; + padding: 4px; + font-family: Arial,Helvetica,sans-serif; + font-weight: normal; +} + +.table tr.last td { + border-bottom: none; +} + +.footer_link, .footer_link:hover { + color: #812143; + font-weight: bold; + text-decoration: underline; +} + +/* CLASS */ + +h3.title { + clear: both; + margin: 0; + padding: 4px 10px; + border: 1px solid #E0D0B1; + border: none; +} + +h3.subtitle { + color: #FF8D42; + font-size: 1.2em; +} + +p.infos { + float: right; + margin: 0; + padding: 0; + font-size: 0.9em; + line-height: 1em; + vertical-align: top; +} + +.width1 { + width: 350px; +} + +.width2 { + width: 500px; +} + +.width3 { + width: 600px; +} + +.width4 { + width: 745px; +} + +.width5 { + width: 655px; +} + +.widthfull { + width: 100%; +} + +tr.deleted td { + background-color: #EEEEEE; +} + +.contextnav { + margin: 10px 0; + padding: 3px 6px; + line-height: 1.30em; + border: 1px solid #E0D0B1; +} + +.contextnav img { + vertical-align: text-top; +} + +.contextnavleft { + float: left; + width: 6em; +} + +.contextnavcenter { + text-align: center; +} + +.contextnavcenter a, +.contextnavcenter b { + letter-spacing: 6pt; +} + +.contextnavright { + float: right; + width: 6em; + text-align: right; +} + +.hidden { + height: 1px; + border-width: 1px 0 0 0; + border-style: solid; + border-color: #fff; +} + +.clear { + clear: both; +} + +.flatclear { + clear: both; + height:0px; + line-height:0px; +} + +.space { + margin-top: 13px; +} + +.pspace { + padding-top: 1em; +} + +.double-space { + margin-top: 2em ; +} + +.space-bottom { + margin-bottom: 1em; +} + +.double-bottom-space { + margin-bottom: 2em ; +} + +.left { + text-align: left; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +.small { + font-size: 0.85em; +} + +.row { + background: #F4E6C9 url(../img/admin/news-bg.gif) repeat-x top left; +} + +.noborder { + border: none; +} + +.highlight { + background-color: #FFFF66; + font-weight: bold; +} + +.discount_name { + background: #FFEBCC; + padding: 2px; + text-transform: uppercase; +} + +.displayed_flag { + float: left; + margin: 4px 0 0 4px; +} + +.language_flags { + display: none; + float: left; + background: #FFF; + margin: 4px; + padding: 8px; + width: 80px; + border: 1px solid #555; +} + +.pointer { + cursor: pointer; +} + +.imgm { + margin: 3px 0px 3px 0px; +} + +.green { + color: forestgreen; +} + +.bullet { + display: list-item; + list-style: disc; + margin-left: 30px; +} + +/* access management */ +#ajax_confirmation { + padding-top: 3px; + padding-bottom: 6px; +} + +/* help boxes */ +.hint { + display: none; + position: relative; + left: 0px; + margin-top: 4px; + margin-bottom: 2px; + border: 1px solid #50B0EC; + padding: 8px 6px 8px 34px ; + color: #383838; + background: #DDE9F7 url(../img/admin/help2.png) no-repeat 6px 5px; +} + +/* The pointer image is added by using another span */ +.hint .hint-pointer { + position: absolute; + left: -10px; + top: 5px; + width: 10px; + height: 19px; +} + +#flagsLanguage img { + padding: 3px; + margin-bottom: -4px; +} + +#flagsLanguage .selected_language { + border: 1px solid #BBB; + padding: 2px; + margin-bottom: -4px; +} + +.disable, .disable:hover { + background-color: #CCCCCC; + color: #AAAAAA; +} + +/* Ajax classes */ +.ajax-warning, .ajax-success, .ajax-error { + border: 1px solid #CCCCCC; + padding: 5px 20px; + margin: 5px; + width: 70%; +} +.ajax-warning { + background-color: #FFBD6F; +} +.ajax-success { + background-color: #9FDF8B; +} +.ajax-error { + background-color: #FF7F84; +} +.ajax-loader { + margin: 5px 10px; +} + +/* tab: AdminProducts */ +#upload-confirmation { + background-color: yellow; + font-weight:bold; +} + +.productFieldComment { + color: #7F7F7F; + font-size: 0.8em; +} + +/* Confirm box */ +a.confirm_yes, a.confirm_no { + width: 50px; + margin-left: 60px; + padding: 10px; + border-style: solid; + border-width: 1px; + text-align: center; + font-weight: bold; + color: white; +} +a.confirm_yes { + border-color: red; + background-color: red; +} +a.confirm_no { + border-color: green; + background-color: green; +} + +/* tab: AdminImport */ + +form#import_form { + padding-bottom:22px; + margin-left:15px; + margin-bottom:20px; +} +.table_overflow { + width:900px; + height:500px; + overflow:auto; +} + +.new_message{ + background-color:#FFE35C; +} +.myDragClass { + background-color: #FFAA55; +} +.dragHandle{ +cursor: move; +} + +p#mailResultCheck{ + margin:2px 0; + padding-left:18px; + font-size:12px; +} + +p.ok{ + background:url('../img/admin/enabled.gif') no-repeat top left; + color:green; +} + +p.fail{ + background:url('../img/admin/disabled.gif') no-repeat top left; + font-weight:bold; + color:red; +} +#resultCheckLangPack{ + border: 1px solid #DFD5C3; + padding:10px; + margin-bottom:10px; +} + +/* TinyMCE */ +span.defaultSkin .mceToolbar { height: auto } +span.defaultSkin table.mceLayout tr.mceFirst td { float: left } + +/* webservice */ +table.permissions { + border:1px solid #DFD5C3; +} +table.permissions th { + background:#FFF6D3; + text-align:center; + height:20px; +} +table.permissions td { + padding:5px; + text-align:center; +} + +/* */ +.path_bar{ + background-color:#EFEFEF; + font-family:Arial; + font-size:13px; + margin-bottom:20px; + padding:5px; +} + +.path_bar a{ + font-weight:700; +} +.adminHeader h1{ + font-family:Arial; + color:#812143; + font-size:18pt; + margin: 0; +} + +#adminHeader hr{ + background-color: #812143; + margin: 0; +} + +#header_shoplist select.shopList{ + background-image: url("../../../img/t/AdminShop.gif"); + background-position: 1px 50%; + background-repeat: no-repeat; + padding: 1px 1px 1px 14px; +} + + #header_shoplist select.shopList .first{ + font-weight: bold; + } + + #header_shoplist select.shopList .group{ + font-weight: bold; + font-style: italic; + padding-left: 10px; + } + + #header_shoplist select.shopList .shop{ + padding-left: 20px; + } + +.clearfix:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} + +.clearfix { + display: inline-block; +} + +html[xmlns] .clearfix { + display: block; +} + +* html .clearfix { + height: 1%; +} + +#adminHeader #help_img{ + float: right; + margin-top: 5px; +} +#adminpresentation{ + width: 923px; + border:1px solid #8E8E8E; + background-color: #EFEFEF; + float: left; + padding: 1px; + font-size: 8pt; +} + +#listpresentation{ + float: left; + width: 100px; +} + +#iframe{ + width: 450px; + height: 220px; + float: left; + margin: 10px; + background: #DDD; + border: 1px solid #666; +} + +#adminpresentation ul li{ + list-style: none; +} + +#list_video{ + float: left; + width: 220px; +} + +#list_video h3{ + color: #882F4F; + font-size: 12pt; + padding-top: 25px; + margin: 0; +} + +#list_video ul{ + text-align: left; + padding: 0; + margin: 0; +} + +#list_video ul li{ + float: left; + width: 195px; + text-decoration: underline; + padding-left: 25px; + margin-top: 5px; +} + +#footer_iframe_home{ + float: left; + background-color: #DEDEDE; + width: 100%; + height: 25px; + padding-top: 10px; +} + +#footer_iframe_home label{ + float: none; + padding-left: 10px; + color: #903E5B; + line-height: 15px; +} + +#footer_iframe_home input{ + margin-left: 10px; +} + +#footer_iframe_home a{ + float: right; + margin: 0px 15px 0px 0px; + text-decoration: underline; + color: #903E5B; +} + +#column_left{ + width: 610px; + float: left; + padding-top: 20px; +} + +#column_right{ + width: 315px; + float: right; + padding-top: 20px; +} + +.F_list{ + list-style: none; + padding: 0; + margin: 0; +} + +#first_block{ + margin: 0; + background: #EFEFEF url('../img/admin/catalog_xl.png') no-repeat 6px 6px; +} + +#second_block{ + background: #EFEFEF url('../img/admin/customer_xl.png') no-repeat 6px 6px; +} + +#third_block{ + background: #EFEFEF url('../img/admin/stats_xl.png') no-repeat 6px 6px; +} + +#fourth_block{ + background: #EFEFEF url('../img/admin/employees_xl.png') no-repeat 6px 6px; +} + +.F_list li{ + width: 125px; + float: left; + margin-left: 14px; + border: 1px solid #8E8E8E; + padding: 5px; + height: 120px; +} + +.F_list li h4{ + width: 115px; + color: #903E5B; + text-decoration: underline; + font-size: 12px; + margin-top: 35px; + margin-bottom: 0; +} + +.F_list a{ + color: #903E5B; +} + +.F_list a:hover{ + color: #903E5B; +} + +.F_list li p{ + font-size: 8pt; +} + +.table_info{ + width: 283px; + float: left; + padding: 1px; + border: 1px solid #8E8E8E; + margin-right: 15px; + margin-top: 20px; +} + +.table_info h5{ + background-image: url('../img/admin/green-gradient.png'); + color: #FFFFFF; + margin: 0; + line-height: 29px; + padding-left: 15px; + font-size: 12pt; +} + +.table_info h5 a, +.admin-box1 h5 a{ + color: #FFFFFF; + font-size: 8pt; + float: right; + text-decoration: underline; + font-weight: normal; + padding-right: 10px; +} + +.admin-box2 h5 a{ + color: #FFFFFF; + font-size: 8pt; + float: right; + text-decoration: underline; + font-weight: normal; + padding-right: 10px; +} + +#table_info_last{ + margin-left: 0; + float: left; +} + +.table_info_details{ + width: 283px; + border: 0; +} + +.table_info_details tr{ + height: 30px; + background-color: #EFEFEF; + width: 290px; + color: #000000; + font-weight: bold; + padding-left: 5px; + width: 100%; + text-align: center; +} + +.tr_odd td{ + background-color: #DEDEDE; +} +.table_info_details tr td.td_align_left{ + text-align: left; + padding-left: 10px; + width: 150px; +} + +.table_info_details tr td{ + text-align: right; + padding-right: 10px; +} + +#table_info_large{ + margin-top: 20px; + margin-bottom: 20px; + width: 586px; + float: left; + padding: 1px; + border: 1px solid #8E8E8E; +} + +#table_info_large h5{ + background-image: url('../img/admin/green-gradient.png'); + color: #FFFFFF; + margin: 0; + line-height: 29px; + padding-left: 15px; + font-size: 12pt; + font-weight: normal; +} + +#table_info_large h5 a{ + color: #FFFFFF; + float: right; + font-size: 8pt; + text-decoration: underline; + font-weight: normal; + padding-right: 8px; +} + +#stat_google{ + width: 586px; + height: 175px; + background-color: #DEDEDE; +} + +.admin-box1{ + width: 310px; + float: left; + padding: 1px; + border: 1px solid #8E8E8E; + font-size: 8pt; + margin-bottom: 20px; +} + +.admin-box1 h5{ + background-image: url('../img/admin/orange-gradient.png'); + color: #FFFFFF; + margin: 0; + line-height: 29px; + padding-left: 15px; + font-size: 12pt; +} + +.admin-box2{ + width: 310px; + float: left; + padding: 1px; + border: 1px solid #8E8E8E; + font-size: 8pt; + margin-bottom: 20px; + background-color: #f2f2f2; +} + +.admin-box2 h5{ + background-image: url('../img/admin/pink-gradient.png'); + color: #FFFFFF; + margin: 0; + line-height: 29px; + padding-left: 15px; + font-size: 12pt; +} + + +.admin-home-box-list li img{ + margin: 0 15px 0 5px; +} +.admin-home-box-list{ + padding-left:0; + margin: 0px; + list-style: none; +} + +#prestashop_link{ + background: url('../img/admin/bg_pslink.png') no-repeat 0px 0px; +} + +.admin-home-box-list li{ + margin: 1px; + padding:5px 0; +} + +#prestashop_link li{ + height: 67px; + margin: 1px; +} + +.admin-home-box-list li p{ + padding: 5px 5px 0px 90px; +} +.admin-home-box-list li a{ + color: #812143; + font-weight: bold; + text-decoration: underline; + line-height: 18px; + font-size: 8.5pt; + text-align: left; +} + +#prestashop_link li a{ + color: #812143; + margin-left: 90px; + font-weight: bold; + text-decoration: underline; + line-height: 18px; + font-size: 8.5pt; + text-align: left; + float:left; +} + +#table_customer{ + width: 590px; + cellpadding: 0; + cellspacing: 0; +} + +#table_customer thead span{ + background: url('../img/admin/greenlight-gradient.png'); + color: #FFFFFF; + line-height: 35px; + border: 1px solid #416110; + display: block; + text-align: center; + height: 30px; + border-left: none; + border-right: none; +} + +#table_customer thead span.first{ + border: 1px solid #416110; + border-right: none; +} + +#table_customer thead span.last{ + border: 1px solid #416110; + border-left: none; +} + +#table_customer thead th{ + margin: 0; +} + +#order_id{ + width: 52px; + text-align: center; +} + +#order_customer{ + width: 175px; +} + +#order_status{ + width: 130px; +} + +#order_total{ + width: 100px; +} + +.order_action{ + text-align: center; +} + +#order_line1{ + background-color: #EFEFEF; +} + +#table_customer tbody{ + font-size: 8pt; +} + +#table_customer tbody tr td.order_td_first{ + text-align: center; + padding: 0; + height: 35px; +} + +#table_customer tbody tr td{ + border: 1px solid #E0E0E0; + border-top: none; + padding-left: 10px; + height: 35px; +} + +#table_info_news{ + width: 310px; + float: left; + padding: 1px; + border: 1px solid #8E8E8E; + margin-top: 20px; + font-size: 8pt; +} + +#table_info_news h5{ + background-color: #7Ab51D; + color: #FFFFFF; + margin: 0; + line-height: 29px; + padding-left: 15px; + font-size: 12pt; +} + +#table_info_news h5 a{ + color: #FFFFFF; + float: right; + font-size: 8pt; + text-decoration: underline; + font-weight: normal; + padding-right: 10px; +} + +#table_info_news ul{ + list-style: none outside none; + padding: 0; + margin: 0; +} + +#block_news_first{ + background-color: #E1EBD2; + padding: 5px; +} +#block_news_first a{ + color: #812143; + font-weight: bold; + text-decoration: underline; + line-height: 18px; +} + +#block_news_first p{ + line-height: 12px; + padding-left: 10px; + margin: 0; +} + +#block_news_first p a{ + color: #812143; + font-weight: bold; + margin-right: 8px; + margin-left: 200px; +} + +#table_info_news ul li a{ + line-height: 25px; + padding-left: 10px; + margin: 0; + text-decoration: underline; +} + +.block_news_odd{ + background-color: #DEDEDE; + line-height: 25px; +} + +#block_news_last{ + background-color: #EFEFEF; +} + +#see_newsletter{ + margin-left: 5px; + background: url(../img/admin/email.gif) no-repeat left center; +} + +#follow_on_facebook{ + margin-left: 5px; + background: url(../img/admin/facebook.jpg) no-repeat left center; +} + +#follow_on_twitter{ + margin-left: 5px; + background: url(../img/admin/twitter.jpg) no-repeat left center; +} + +#block_news_last ul li a{ + color: #812143; + padding-left: 20px; +} + +.viewed{ + background: url('../img/admin/enabled.gif') no-repeat left center; +} + +.clear{ + clear: both; +} + +a.blue { + color:blue; +} + +a.blue:hover { + color:#0000AA; +} + + +/* help cluetip */ +.cluetip-help-button { + width: auto; + text-align:left; + background-color:white; + padding:10px; + border:1px solid gray; + background:#F1F2F4 url(../img/admin/block_bg.jpg) repeat-x scroll left bottom; + opacity:0.75; +} + +.ac_results ul { + list-style: none; + text-align: left; + background: white; + padding: 0; +} +.ac_results li { + padding: 5px; +} +.ac_even { + background: #EFEFEF; +} +.ac_over { + background: #ECEADE; +} +.button-translate { + padding:0px; + margin : 0 0 0 10px; + height:15px; + width:15px; + cursor:pointer; +} + +#importList label{ + float: none; +} + +#importList ul{ + list-style-type: none; +} + +.multishop_config{ + position: absolute; + margin-left: -10px; +} + + .multishop_config div{ + background-color: #DFFAD3; + border: 1px solid #DFD5C3; + display: none; + margin-top: 2px; + padding: 5px; + width: 200px; + } diff --git a/css/csshover.htc.htc b/css/csshover.htc.htc new file mode 100644 index 000000000..3ba936ac3 --- /dev/null +++ b/css/csshover.htc.htc @@ -0,0 +1,120 @@ + + \ No newline at end of file diff --git a/css/datePicker.css b/css/datePicker.css new file mode 100644 index 000000000..a22417f78 --- /dev/null +++ b/css/datePicker.css @@ -0,0 +1,142 @@ +table.jCalendar { + border: 1px solid #000; + background: #aaa; + border-collapse: separate; + border-spacing: 2px; +} +table.jCalendar th { + background: #333; + color: #fff; + font-weight: bold; + padding: 3px 5px; +} +table.jCalendar td { + background: #ccc; + color: #000; + padding: 3px 5px; + text-align: center; +} +table.jCalendar td.other-month { + background: #ddd; + color: #aaa; +} +table.jCalendar td.today { + background: #666; + color: #fff; +} +table.jCalendar td.selected { + background: #f66; + color: #fff; +} +table.jCalendar td.selected:hover { + background: #f33; + color: #fff; +} +table.jCalendar td:hover, table.jCalendar td.dp-hover { + background: #fff; + color: #000; +} +table.jCalendar td.disabled, table.jCalendar td.disabled:hover { + background: #bbb; + color: #888; +} + +/* For the popup */ + +/* NOTE - you will probably want to style a.dp-choose-date - see how I did it in demo.css */ +/* located in demo.css and creates a little calendar icon + * instead of a text link for "Choose date" + */ +a.dp-choose-date { + /*float: left; + display: block; + text-indent: -2000px;*/ + width: 16px; + height: 18px; + overflow: visible; + padding: 0; + margin: 2px 3px 0 3px; + background: url('../img/admin/calendar.png') no-repeat 0px -1px; +} +a.dp-choose-date.dp-disabled { + background-position: 0 -20px; + cursor: default; +} +/* makes the input field shorter once the date picker code + * has run (to allow space for the calendar icon + */ +input.dp-applied { + width: 100px; + /*float: left;*/ +} + + + +div.dp-popup { + position: relative; + background: #ccc; + font-size: 10px; + font-family: arial, sans-serif; + padding: 2px; + width: 171px; + line-height: 1.2em; +} +div#dp-popup { + position: absolute; + z-index: 199; +} +div.dp-popup h2 { + font-size: 12px; + text-align: center; + margin: 2px 0; + padding: 0; +} +a#dp-close { + font-size: 11px; + padding: 4px 0; + text-align: center; + display: block; +} +a#dp-close:hover { + text-decoration: underline; +} +div.dp-popup a { + color: #000; + text-decoration: none; + padding: 3px 2px 0; +} +div.dp-popup div.dp-nav-prev { + position: absolute; + top: 2px; + left: 4px; + width: 100px; +} +div.dp-popup div.dp-nav-prev a { + float: left; +} +/* Opera needs the rules to be this specific otherwise it doesn't change the cursor back to pointer after you have disabled and re-enabled a link */ +div.dp-popup div.dp-nav-prev a, div.dp-popup div.dp-nav-next a { + cursor: pointer; +} +div.dp-popup div.dp-nav-prev a.disabled, div.dp-popup div.dp-nav-next a.disabled { + cursor: default; +} +div.dp-popup div.dp-nav-next { + position: absolute; + top: 2px; + right: 4px; + width: 100px; +} +div.dp-popup div.dp-nav-next a { + float: right; +} +div.dp-popup a.disabled { + cursor: default; + color: #aaa; +} +div.dp-popup td { + cursor: pointer; +} +div.dp-popup td.disabled { + cursor: default; +} \ No newline at end of file diff --git a/css/index.php b/css/index.php new file mode 100644 index 000000000..5ff8ef28c --- /dev/null +++ b/css/index.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; +?> \ No newline at end of file diff --git a/css/install.css b/css/install.css new file mode 100644 index 000000000..e29531b37 --- /dev/null +++ b/css/install.css @@ -0,0 +1,349 @@ +/* POS CSS Install */ + +body { + height: 100%; + font-family: Arial, Verdana, sans-serif; + font-size: 13px; + font-weight: bold; + margin: 0; + padding: 0; + text-align: center; + background-color: #FFF; + color: #333; +} + +a { + color: #C73178; + text-decoration: none; + font-weight: normal; +} + +a:hover { + color: #333; + font-weight: normal; + text-decoration: underline; +} + +img { + margin-right: 10px; +} + +a img { + border: 0px; +} + +form { + margin: 0; + padding: 0; +} + +input, select { + font-family: Arial, Verdana, sans-serif; + font-weight: normal; + font-size: 12px; + margin: 2px 0 2px 0; +} + +#required { + color: #C73178; +} + + +/* STRUCTURE */ + +#page { + width: 100%; +} + +#container { + margin-top: 10px; + padding: 10px 0 0 0; + background: #FFF; +} + +#container-inner { + width: 940px; + margin: 0 auto 0 auto; + padding: 0; + text-align: left; +} + +#content { + float: right; + width: 697px; + border-left: 1px solid #65B821; + min-height: 380px; + margin: 0 0 20px 0; + padding: 5px 14px; +} + +#sidebar { + float: left; + width: 200px; + padding: 5px 0 0 0; +} + + +/* HEADER */ + +#header { + background-color: #DFF5CD; +} + +#header table{ + margin-left: 240px; + +} + +#frame { + color: #666; + width: 860px; + text-align: right; + padding-top: 50px; + padding-right: 10px; + padding-left: 20px; + margin-top: 30px; + float: right; +} + +#frame a{ + color: #666; + text-decoration: none; + font-weight: bold; +} + +#frame a:hover { + color: #333; + font-weight: bold; + text-decoration: underline; +} + +#spanTitle { + margin-top: -5px; + font-size: 23px; + float: left; + color: #555; +} + + +/* WELCOME */ + +#welcome { + margin-bottom: 2em; +} + +#welcome h3 { + font-size: 115%; +} + +#welcome p { + margin: 1.5em 180px 1em 0; + line-height: 1.5em; +} + +#welcome ul { + margin: 0 190px 0 20px; + padding: 0; + list-style: none; +} + +#welcome ul li { + margin: 0 0 10px 0; + padding: 0 0 0 26px; + font-size: 110%; + line-height: 1.3em; + font-weight: normal; + color: #666; + background: url(../img/install/icon-checksm_gris.gif) no-repeat 0 4px; +} + +/* CONTENT */ + +#content h1 { + margin: 0 0 12px 0; + padding: 0; + border-bottom: 1.5px solid #65B821; + color: #666; + font-size: 1.5em; +} + +#content h1 .faint { + background: #65B821; + width: inherit; + margin: 0 0.4em 0 0; + padding: 0 0.2em 0 0.2em; + color: #fff; + text-align: center; +} + +#content h2 { + color: #C73178; + font-size: 1.3em; + border-bottom: 2px solid #F4D7E4; + margin: 12px 0 12px 0; +} + +#content h3 { + margin: 0; + color: #C73178; +} + +/* TABLE */ + +.table { + width: 450px; + margin: 0 0 20px 0; + padding: 0; + border: 1px solid #F4D7E4; + border-collapse: collapse; +} + +.table th, .table td { + margin: 0; + padding: 5px; + border-bottom: 1px inset #F0EADA; +} + +.table td { + text-align: center; +} + + +/* FORM TABLE */ + +table.form-table { + width: 550px; + margin-top: 0.65em; + padding: 0; + border-collapse: collapse; +} + +table.form-table th, +table.form-table td { + margin: 0; + padding: 8px; + border-bottom: 1px dotted #F4D7E4; +} + +table.form-table th { + width: 135px; + padding-top: 12px; + text-align: right; + vertical-align: top; + color: #333; +} + +table.form-table td p.note { + margin: 0; + padding: 2px 0 2px 0; + font-family: "Lucida Grande", Arial, Verdana, sans-serif; + font-size: 90%; + font-weight: normal; + color: #666; +} + +/* HELP BOXES : HINT TO HIDE AND REVEAL PASSWORDS */ + +.reveal { + height: 50px; + font-size: 12px; + color: #333; + padding: 9px 10px 2px 10px; +} + +/* ERROR */ + +#content div.alert { + width: 450px; + margin: 15px 0; + padding: 10px 15px; + border-top : 1px dotted #666; + border-bottom: 1px dotted #666; + background: #F9E3EE; +} + +#content div.error h4 { + margin: 0; + padding: 0 0 0 20px; + font-family: "Lucida Grande", Verdana, sans-serif; + font-size: 110%; + text-transform: none; + font-weight: normal; + letter-spacing: 0; + text-align: left; + color: #C73178; + border: none; + background: url(../img/install/warning.gif) no-repeat 0 0; +} + +#content div.error ol { + margin: 15px 0 0 0; + padding-bottom: 0; + color: #C73178; + font-weight: normal; +} + + +/* WAITING */ + +#waiting { + margin: 10px; + display: none; + width: 230px; + background: #FFF; + border: 1px #666 dotted; + padding: 10px; +} + + +/* INFOS */ + +#infos { + width : 320px; + margin-left: 20px; + border: 1px solid #65B821; + background-color: #DFF5CD; + font-weight: normal; + padding: 10px; +} + + +/* SIDEBAR */ + +#sidebar div { + vertical-align: middle; + margin: auto 0 5px 0; + line-height: 27px; + font-size: 0.9em; + font-weight: bold; + color: #666; +} + +#sidebar .number { + line-height: 60px; + float: left; + height: 62px; + padding: 5px; + font-size: 4.0em; +} + +#sidebar .step { + float: right; + width: 140px; + height: 60px; + padding: 5px; + border: 1px solid #F4D7E4; +} + + +/* FOOTER */ + +#footer { + clear: both; + margin: 0; + padding: 8px 5px 20px 5px; + border-top: 1px solid #F4D7E4; + text-align: center; + font-size: 90%; + line-height: 1em; +} \ No newline at end of file diff --git a/css/jquery-ui-1.8.10.custom.css b/css/jquery-ui-1.8.10.custom.css new file mode 100755 index 000000000..fbcaad7c0 --- /dev/null +++ b/css/jquery-ui-1.8.10.custom.css @@ -0,0 +1,573 @@ +/* + * jQuery UI CSS Framework 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and ../img/jquery-ui */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(../img/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(../img/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(../img/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(../img/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; } +.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(../img/jquery-ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(../img/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(../img/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and ../img/jquery-ui */ +.ui-icon { width: 16px; height: 16px; background-image: url(../img/jquery-ui/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(../img/jquery-ui/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(../img/jquery-ui/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(../img/jquery-ui/ui-icons_ef8c08_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../img/jquery-ui/ui-icons_ef8c08_256x240.png); } +.ui-state-active .ui-icon {background-image: url(../img/jquery-ui/ui-icons_ef8c08_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(../img/jquery-ui/ui-icons_228ef1_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../img/jquery-ui/ui-icons_ffd27a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #666666 url(../img/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } +.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(../img/jquery-ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* + * jQuery UI Resizable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Accordion 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/* + * jQuery UI Autocomplete 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.10 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* + * jQuery UI Button 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Dialog 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* + * jQuery UI Slider 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Tabs 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* + * jQuery UI Datepicker 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* + * jQuery UI Progressbar 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/css/jquery.autocomplete.css b/css/jquery.autocomplete.css new file mode 100644 index 000000000..ab37428d7 --- /dev/null +++ b/css/jquery.autocomplete.css @@ -0,0 +1,51 @@ +.ac_results { + text-align: left; + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + margin: 0px; + padding: 2px 5px; + cursor: default; + display: block; + /* + if width will be 100% horizontal scrollbar will apear + when scroll mode will be used + */ + /*width: 100%;*/ + font: menu; + font-size: 12px; + /* + it is very important, if line-height not setted or setted + in relative units scroll will be broken in firefox + */ + line-height: 16px; + overflow: hidden; +} + +/* +.ac_loading { + background: white url('indicator.gif') right center no-repeat; +} +*/ + +.ac_odd { + background-color: #eee; +} + +.ac_over { + background-color: #0A246A; + color: white; +} diff --git a/css/jquery.cluetip.css b/css/jquery.cluetip.css new file mode 100644 index 000000000..335e03591 --- /dev/null +++ b/css/jquery.cluetip.css @@ -0,0 +1,63 @@ +#cluetip-close img { + border: 0; +} +#cluetip-title { + overflow: hidden; +} +#cluetip-title #cluetip-close { + float: right; + position: relative; +} +#cluetip-waitimage { + width: 43px; + height: 11px; + position: absolute; + background-image: url('../img/loader.gif'); +} +.cluetip-arrows { + display: none; + position: absolute; + top: 0; + left: -11px; + height: 22px; + width: 11px; + background-repeat: no-repeat; + background-position: 0 0; +} +#cluetip-extra { + display: none; +} + +.cluetip-default { + background-color: transparent; +} +.cluetip-default #cluetip-outer { + border: 2px solid #ccc; + position: relative; + background-color: #fff; +} + +.cluetip-default h3#cluetip-title { + margin: 0 0 5px; + padding: 2px 5px; + font-size: 12px; + font-weight: normal; + background-color: #ccc; + color: #333; +} + +.cluetip-default #cluetip-inner { + padding: 0 5px 5px; + display: inline-block; +} +.cluetip-default div#cluetip-close { + text-align: right; + margin: 0 5px 5px; + color: #900; +} + +/* stupid IE6 HasLayout hack */ +.cluetip-rounded #cluetip-title, +.cluetip-rounded #cluetip-inner { + zoom: 1; +} \ No newline at end of file diff --git a/css/jquery.fancybox-1.3.4.css b/css/jquery.fancybox-1.3.4.css new file mode 100644 index 000000000..f9f0647f0 --- /dev/null +++ b/css/jquery.fancybox-1.3.4.css @@ -0,0 +1,374 @@ +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. + * + * Version: 1.3.4 (11/11/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +/* PrestaShop + * + * We did several modifications in this file: + * + * - Persistant arrows + * - Fixed IE 6 path on the AlphaLoader method + * - Specific path for background images + * + */ + +#fancybox-loading { + position: fixed; + top: 50%; + left: 50%; + width: 40px; + height: 40px; + margin-top: -20px; + margin-left: -20px; + cursor: pointer; + overflow: hidden; + z-index: 1104; + display: none; +} + +#fancybox-loading div { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 480px; + background-image: url('../js/jquery/fancybox/fancybox.png'); +} + +#fancybox-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 1100; + display: none; +} + +#fancybox-tmp { + padding: 0; + margin: 0; + border: 0; + overflow: auto; + display: none; +} + +#fancybox-wrap { + position: absolute; + top: 0; + left: 0; + padding: 20px; + z-index: 1101; + outline: none; + display: none; +} + +#fancybox-outer { + position: relative; + width: 100%; + height: 100%; + background: #fff; +} + +#fancybox-content { + width: 0; + height: 0; + padding: 0; + outline: none; + position: relative; + overflow: hidden; + z-index: 1102; + border: 0px solid #fff; +} + +#fancybox-hide-sel-frame { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: transparent; + z-index: 1101; +} + +#fancybox-close { + position: absolute; + top: -15px; + right: -15px; + width: 30px; + height: 30px; + background: transparent url('../js/jquery/fancybox/fancybox.png') -40px 0px; + cursor: pointer; + z-index: 1103; + display: none; +} + +#fancybox-error { + color: #444; + font: normal 12px/20px Arial; + padding: 14px; + margin: 0; +} + +#fancybox-img { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + border: none; + outline: none; + line-height: 0; + vertical-align: top; +} + +#fancybox-frame { + width: 100%; + height: 100%; + border: none; + display: block; +} + +#fancybox-left, #fancybox-right { + position: absolute; + bottom: 0px; + height: 100%; + width: 35%; + cursor: pointer; + outline: none; + background: transparent url('../js/jquery/fancybox/blank.gif'); + z-index: 1102; + display: none; +} + +#fancybox-left { + left: 0px; +} + +#fancybox-right { + right: 0px; +} + +#fancybox-left-ico, #fancybox-right-ico { + position: absolute; + top: 50%; + left: -9999px; + width: 30px; + height: 30px; + margin-top: -15px; + cursor: pointer; + z-index: 1102; + display: block; +} + +#fancybox-left-ico { + background-image: url('../js/jquery/fancybox/fancybox.png'); + background-position: -40px -30px; + left: 20px; /* PrestaShop - make left arrow permanently visible */ +} + +#fancybox-right-ico { + background-image: url('../js/jquery/fancybox/fancybox.png'); + background-position: -40px -60px; + /* PrestaShop - make right arrow permanently visible */ + right: 20px; + left: auto; + /* End */ +} + +#fancybox-left:hover, #fancybox-right:hover { + visibility: visible; /* IE6 */ +} + +#fancybox-left:hover span { + left: 20px; +} + +#fancybox-right:hover span { + left: auto; + right: 20px; +} + +.fancybox-bg { + position: absolute; + padding: 0; + margin: 0; + border: 0; + width: 20px; + height: 20px; + z-index: 1001; +} + +#fancybox-bg-n { + top: -20px; + left: 0; + width: 100%; + background-image: url('../js/jquery/fancybox/fancybox-x.png'); +} + +#fancybox-bg-ne { + top: -20px; + right: -20px; + background-image: url('../js/jquery/fancybox/fancybox.png'); + background-position: -40px -162px; +} + +#fancybox-bg-e { + top: 0; + right: -20px; + height: 100%; + background-image: url('../js/jquery/fancybox/fancybox-y.png'); + background-position: -20px 0px; +} + +#fancybox-bg-se { + bottom: -20px; + right: -20px; + background-image: url('../js/jquery/fancybox/fancybox.png'); + background-position: -40px -182px; +} + +#fancybox-bg-s { + bottom: -20px; + left: 0; + width: 100%; + background-image: url('../js/jquery/fancybox/fancybox-x.png'); + background-position: 0px -20px; +} + +#fancybox-bg-sw { + bottom: -20px; + left: -20px; + background-image: url('../js/jquery/fancybox/fancybox.png'); + background-position: -40px -142px; +} + +#fancybox-bg-w { + top: 0; + left: -20px; + height: 100%; + background-image: url('../js/jquery/fancybox/fancybox-y.png'); +} + +#fancybox-bg-nw { + top: -20px; + left: -20px; + background-image: url('../js/jquery/fancybox/fancybox.png'); + background-position: -40px -122px; +} + +#fancybox-title { + font-family: Helvetica; + font-size: 12px; + z-index: 1102; +} + +.fancybox-title-inside { + padding-bottom: 10px; + text-align: center; + color: #333; + background: #fff; + position: relative; +} + +.fancybox-title-outside { + padding-top: 10px; + color: #fff; +} + +.fancybox-title-over { + position: absolute; + bottom: 0; + left: 0; + color: #FFF; + text-align: left; +} + +#fancybox-title-over { + padding: 10px; + background-image: url('../js/jquery/fancybox/fancy_title_over.png'); + display: block; +} + +.fancybox-title-float { + position: absolute; + left: 0; + bottom: -20px; + height: 32px; +} + +#fancybox-title-float-wrap { + border: none; + border-collapse: collapse; + width: auto; +} + +#fancybox-title-float-wrap td { + border: none; + white-space: nowrap; +} + +#fancybox-title-float-left { + padding: 0 0 0 15px; + background: url('../js/jquery/fancybox/fancybox.png') -40px -90px no-repeat; +} + +#fancybox-title-float-main { + color: #FFF; + line-height: 29px; + font-weight: bold; + padding: 0 0 3px 0; + background: url('../js/jquery/fancybox/fancybox-x.png') 0px -40px; +} + +#fancybox-title-float-right { + padding: 0 0 0 15px; + background: url('../js/jquery/fancybox/fancybox.png') -55px -90px no-repeat; +} + +/* IE6 */ + +.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_close.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_nav_left.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_nav_right.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; } +.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_title_left.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_title_main.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_title_right.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame { + height: expression(this.parentNode.clientHeight + "px"); +} + +#fancybox-loading.fancybox-ie6 { + position: absolute; margin-top: 0; + top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'); +} + +#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='js/jquery/fancybox/fancy_loading.png', sizingMethod='scale'); } + +/* IE6, IE7, IE8 */ + +.fancybox-ie .fancybox-bg { background: transparent !important; } + +.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_n.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_ne.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_e.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_se.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_s.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_sw.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_w.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../js/jquery/fancybox/fancy_shadow_nw.png', sizingMethod='scale'); } \ No newline at end of file diff --git a/css/jquery.jgrowl.css b/css/jquery.jgrowl.css new file mode 100644 index 000000000..02e041002 --- /dev/null +++ b/css/jquery.jgrowl.css @@ -0,0 +1,127 @@ + +div.jGrowl { + padding: 10px; + z-index: 9999; +} + +/** Special IE6 Style Positioning **/ +div.ie6 { + position: absolute; +} + +div.ie6.top-right { + right: auto; + bottom: auto; + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.top-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-right { + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.center { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); + width: 100%; +} + +/** Normal Style Positions **/ +body > div.jGrowl { + position: fixed; +} + +body > div.jGrowl.top-left { + left: 0px; + top: 0px; +} + +body > div.jGrowl.top-right { + right: 0px; + top: 0px; +} + +body > div.jGrowl.bottom-left { + left: 0px; + bottom: 0px; +} + +body > div.jGrowl.bottom-right { + right: 0px; + bottom: 0px; +} + +body > div.jGrowl.center { + top: 0px; + width: 50%; + left: 25%; +} + +/** Cross Browser Styling **/ +div.center div.jGrowl-notification, div.center div.jGrowl-closer { + margin-left: auto; + margin-right: auto; +} + +div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer { + background-color: #000; + color: #fff; + opacity: .85; + filter: alpha(opacity = 85); + zoom: 1; + width: 235px; + padding: 10px; + margin-top: 5px; + margin-bottom: 5px; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-size: 12px; + text-align: left; + display: none; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +div.jGrowl div.jGrowl-notification { + min-height: 40px; +} + +div.jGrowl div.jGrowl-notification div.header { + font-weight: bold; + font-size: 10px; +} + +div.jGrowl div.jGrowl-notification div.close { + z-index: 99; + float: right; + font-weight: bold; + font-size: 12px; + cursor: pointer; +} + +div.jGrowl div.jGrowl-closer { + height: 15px; + padding-top: 4px; + padding-bottom: 4px; + cursor: pointer; + font-size: 11px; + font-weight: bold; + text-align: center; +} + +/** Hide jGrowl when printing **/ +@media print { + div.jGrowl { + display: none; + } +} \ No newline at end of file diff --git a/css/jqzoom.css b/css/jqzoom.css new file mode 100644 index 000000000..1d5cdc988 --- /dev/null +++ b/css/jqzoom.css @@ -0,0 +1,21 @@ +div.zoomdiv { +z-index : 100; +position : absolute; +top:0px; +left:0px; +width : 200px; +height : 200px; +background: #ffffff; +border:1px solid #CCCCCC; +display:none; +text-align: center; +overflow: hidden; + +} + + +img.jqzoom{ +cursor:crosshair; +position:relative; + +} diff --git a/css/login.css b/css/login.css new file mode 100644 index 000000000..a09bb87d3 --- /dev/null +++ b/css/login.css @@ -0,0 +1,146 @@ +/* CSS Document */ + +body { + margin: 0; + padding: 0; + font-family: Arial; + font-size: 13px; + color: #333; + text-align: center; + background-image: url('../img/admin/bg_2.png'); +} + +h1 { + color: #902F52; + font-size: 20pt; + padding: 15px 10px 10px 30px; + margin: 0; + overflow: hidden; +} + +h2 a { + color: #dedede; + font-size: 7pt; + text-decoration: underline; + margin: 0; +} + +h2 a:hover { + color: #dedede; + font-size: 7pt; + text-decoration: underline; + margin: 0; +} + +a { + color: #902d50; + text-decoration: underline; +} + +a:hover { + color: #902d50; + text-decoration: none; +} + +input, textarea, option, select { + color: #000; + font-family: Arial; + font-size: 12px; + margin: 0; + padding: 0; +} + +input:focus, textarea:focus { + border: 1px solid #686868; + background-color: #DFDFDF; +} + +/* CONTENT */ + +#container { + width: 464px; + margin: 5em auto 1em auto; + padding: 0; +} + +#login { + height: 313px; + background: url('../img/admin/bg_login.gif') no-repeat top center; + color: #383838; + text-align: left; + font-weight: bold; +} + +#login form { + margin: 0; + padding: 40px 30px 25px 30px; +} + +#login #submit { + margin: 1em 1px; + padding: 0; + display: block; +} + +#login #submit input { + padding: 2px 4px; + _padding: 0; +} + +#login #lost { + + font-size: 0.95em; +} + +/* ERROR */ + +.error, #error { + margin: 0 30px 15px 30px; + padding: 10px 15px; + border: 1px solid #EC9B9B; + background-color: #FAE2E3; + text-align: left; +} + +#error ol { + margin: 15px 0 0 0; + padding-bottom: 0; +} + +#error li { + _margin-left: 45px; + font-family: Arial; + font-size: 11px; +} + +#error h3 { + margin: 0 0 .83em 0; + padding: 5px 0 0 30px; + background: url(../img/admin/error.png) no-repeat 0 0; + font-size: 1em; +} + +/* CLASS */ + +.input { + width: 260px; + margin-top: 2px; + padding: 2px 4px; + border: 1px solid #588216; +} + +.button { + border: 1px solid #DFD5AF; + border-top: 1px solid #FFF6D3; + border-left: 1px solid #FFF6D3; + color: #268CCD; + background-color: #FFF6D3; +} + +.button:hover { + background-color: #F0EBD6; +} + +.center { + text-align: center; +} diff --git a/css/tabpane.css b/css/tabpane.css new file mode 100644 index 000000000..f9606ad8d --- /dev/null +++ b/css/tabpane.css @@ -0,0 +1,67 @@ +.tab-pane { + float: left; + position: relative; + width: 928px; +} + +.tab-pane-tax { + float: left; + position: relative; + width: 900px; +} + +.tab-row .tab { + text-align: center; + font-weight: bold; + display: inline; + margin: 0; + float: left; + padding: 2px 8px 3px 8px; + background: #EFEFEF; + z-index: 1; + white-space: nowrap; + position: relative; + font-size: 1.1em; +} + +.tab-row .tab.selected { + border: 1px solid #ccc; + border-bottom: 0; + background: #FFF6D3; + z-index: 3; + padding: 2px 25px 4px 25px; + margin: 1px -3px -3px 0px; + top: -2px; +} + +.tab-page { + clear: both; + border: 1px solid #ccc; + background: #FFFFF0; + z-index: 2; + position: relative; + padding: 10px; +} + +.tab-page table tr td.col-left { + width: 150px; + vertical-align: top; +} + +.tab-page table tr td p { + margin: 0.5em 0 0 0; + padding: 0 0 0.5em 0; + color: #7F7F7F; + font-size: 0.95em; +} + +.tab-page table tr td p.block { + display: block; + clear: both; +} + +.tab-row { + z-index: 1; + white-space: nowrap; +} + diff --git a/css/thickbox.css b/css/thickbox.css new file mode 100644 index 000000000..0226a1ac2 --- /dev/null +++ b/css/thickbox.css @@ -0,0 +1,174 @@ +/* ----------------------------------------------------------------------------------------------------------------*/ +/* ---------->>> global settings needed for thickbox <<<-----------------------------------------------------------*/ +/* ----------------------------------------------------------------------------------------------------------------*/ +*{padding: 0; margin: 0;} + +/* ----------------------------------------------------------------------------------------------------------------*/ +/* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/ +/* ----------------------------------------------------------------------------------------------------------------*/ +#TB_window { + font: 12px Arial, Helvetica, sans-serif; + color: #333333; +} + +#TB_secondLine { + font: 10px Arial, Helvetica, sans-serif; + color:#666666; +} + +/*#TB_window a:link {color: #666666;} +#TB_window a:visited {color: #666666;} +#TB_window a:hover {color: #000;} +#TB_window a:active {color: #666666;} +#TB_window a:focus{color: #666666;}*/ +#TB_window h2 { + text-align:center; + padding-bottom: 25px; + display: block; +} + + +/* ----------------------------------------------------------------------------------------------------------------*/ +/* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/ +/* ----------------------------------------------------------------------------------------------------------------*/ +#TB_overlay { + position: fixed; + z-index:100; + top: 0px; + left: 0px; + height:100%; + width:100%; +} + +.TB_overlayMacFFBGHack {background: url(../img/macFFBgHack.png) repeat;} +.TB_overlayBG { + background-color:#000; + filter:alpha(opacity=75); + -moz-opacity: 0.75; + opacity: 0.75; +} + +* html #TB_overlay { /* ie6 hack */ + position: absolute; + height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); +} + +#TB_window { + position: fixed; + background: #ffffff; + z-index: 102; + color:#000000; + display:none; + border: 4px solid #525252; + text-align:left; + top:50%; + left:50%; +} + +* html #TB_window { /* ie6 hack */ +position: absolute; +margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); +} + +#TB_window img#TB_Image { + display:block; + margin: 15px 0 0 15px; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + border-top: 1px solid #666; + border-left: 1px solid #666; +} + +#TB_caption{ + height:25px; + padding:7px 30px 10px 25px; + float:left; +} + +#TB_closeWindow{ + height:25px; + padding:11px 25px 10px 0; + float:right; +} + +#TB_closeAjaxWindow{ + padding:7px 10px 5px 0; + margin-bottom:1px; + text-align:right; + float:right; +} + +#TB_ajaxWindowTitle{ + float:left; + padding:7px 0 5px 10px; + margin-bottom:1px; +} + +#TB_title{ + background-color:#e8e8e8; + height:27px; +} + +#TB_ajaxContent{ + clear:both; + padding:2px 15px 15px 15px; + overflow:auto; + text-align:left; + line-height:1.4em; +} + +#TB_ajaxContent.TB_modal{ + padding:15px; +} + +#TB_ajaxContent p{ + padding:5px 0px 5px 0px; +} + +#TB_load{ + position: fixed; + display:none; + height:13px; + width:208px; + z-index:103; + top: 50%; + left: 50%; + margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ +} + +* html #TB_load { /* ie6 hack */ +position: absolute; +margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); +} + +#TB_HideSelect{ + z-index:99; + position:fixed; + top: 0; + left: 0; + background-color:#fff; + border:none; + filter:alpha(opacity=0); + -moz-opacity: 0; + opacity: 0; + height:100%; + width:100%; +} + +* html #TB_HideSelect { /* ie6 hack */ + position: absolute; + height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); +} + +#TB_iframeContent{ + clear:both; + border:none; + margin-bottom:-1px; + margin-top:1px; + _margin-bottom:1px; +} + +*+html #TB_window { /* ie7 hack */ + position: absolute; + margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); +} \ No newline at end of file diff --git a/discount.php b/discount.php new file mode 100644 index 000000000..dfae802d0 --- /dev/null +++ b/discount.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=discount'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/docs/dev/dbmodel.mwb b/docs/dev/dbmodel.mwb new file mode 100644 index 0000000000000000000000000000000000000000..63b9983370b02a71f27b14ea46d5b65d0f4c20a0 GIT binary patch literal 127165 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≺Q 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%0Aw$Kp}8ZV=RY7o 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%0A43i`V8nCsvNPT{ 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∑%Vk1cjz_B-|MycIyHOr)(p+p&M|(Y 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

  • 5rA)idlTWo>FXK;Sg>@;vtu0f&a4c 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; +?> \ No newline at end of file diff --git a/docs/licences/open-software-3.0.txt b/docs/licences/open-software-3.0.txt new file mode 100644 index 000000000..f18dbccb9 --- /dev/null +++ b/docs/licences/open-software-3.0.txt @@ -0,0 +1,44 @@ +Open Source Links +Submitted by Michael Tiemann on Tue, 2006-09-19 03:53. :: +There are many resources (good and bad) on the web offering information, advice, and interpretation concerning Open Source. The following are references that we, the OSI Board, have found useful, either for informing ourselves or for helping others begin their education about open source. And as you explore these links, be mindful of these words attributed to the Buddha, "Believe nothing, no matter where you read it, or who said it, no matter if I have said it, unless it agrees with your own reason and your own common sense..." + +Rich References + + * Open Source on Wikipedia. Note that Wikipedia itself is implemented using MediaWiki software, which is covered by the GNU GPL, a popular license that is both a free software license and also approved by the OSI as an Open Source license. + * David Wheeler's Why OSS? Just look at the numbers! + * David Wheeler's References + * The Free, Libre, and Open Source Software (FLOSS) Surveys and reports. + * The Economic impact of FLOSS on innovation and competitiveness of the EU ICT sector, published 20 November 2006 by UNU-Merit. (Also linked from our Research page). + +Books + + * The Cathedral and the Bazaar (online and book), Eric S. Raymond, 1997 + * Open Sources: Voices from the Open Source Revolution, Chris DiBona, Sam Ockman, and Mark Stone, 1999 + * Open Sources 2.0: The Continuing Evolution, Chris DiBona, Mark Stone, and Danese Cooper, 2005 + * The Success of Open Source, Steven Weber, 2004 + * Producing Open Source Software, Karl Fogel, 2005 + * Open Source Licensing, Larry Rosen, 2004 + * Collaborative Ownership and the Digital Economy, Rishab Aiyer Ghosh, 2005 + +Open Source Software + + * The Free Software Directory Lists over 5,000 packages. (Yes, Free Software is also Open Source Software) + * sourceforge.net Lists over 120,000 projects in varying stages of development. Mainly for developers. The public sourceforge.net site only hosts projects covered by an OSI-approved license. + * freshmeat.net Lists over 60,000 new releases of Open Source packages. Mainly for people who want to download the latest releases from developers. freshmeat.net strongly prefers software covered by an OSI-approved license (but will host non-open source software in exchange for a fee). + +Open Source Conferences and User Groups + + * OSCON. Note that O'Reilly Media put on many other conferences, most of which have strong open source components and/or constitutents. + * FOSS4G. Free and Open Source Geospatial Information Systems conference. + * Blender Conference. There are other regional versions of this conference that can be found at the blender.org website. + * The Ottawa Linux Symposium. A premier event for hackers to discuss implementation experiences and chart the future of Linux. + * The Wizards of OS conference in Berlin. + * The FISL conference in Porto Alegre, Brazil. + * The FOSSSL conference (and other events) in Colombo, Sri Lanka. + * There are hundreds of conferences per year all over the world that advertise "Open Source" as a topic. Alas, these have varying degrees of quality and felicity and the OSI does not vouch for (nor recommend against) the ones not listed in this section. Check to see whether an OSI-affiliated speaker is listed as presenting if you wish to hear the OSI's thoughts or positions. + * User groups tend to focus on software or groups of software used in a particular context: Linux users in Northern Virginia (NOVALUG), PostgreSQL users in Dubai (EMIRPUG), GIS developers and users who formed the Indian Chapter of OSGeo, or the dozens of topic-specific users of the R package and its extensions. There are many thousands of user groups, and the best way to find the one that's right for you is to search the web, find the mailing lists, and make contact. + +Packaged Open Source Software + +Hundreds, if not thousands, of companies now sell commercially packaged and supported open source software. While many open source software packages do run on proprietary systems (Apache is quite popular on all operating systems platforms), Linux distributions provide a complete (and in some cases, exclusively) open source environment suitable for hand-held, desktop, server, and high-end enterprise/cluster/mainframe use. +The OSI website is built with and runs exclusively open source software, including Apache (web server), Drupal (content management and blogs), the PHP scripting language, the MySQL database, to name a few of the more well-known packages. \ No newline at end of file diff --git a/docs/licences/pclzip.txt b/docs/licences/pclzip.txt new file mode 100644 index 000000000..cbee875ba --- /dev/null +++ b/docs/licences/pclzip.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/docs/licences/tinymce-smarty-swift.txt b/docs/licences/tinymce-smarty-swift.txt new file mode 100644 index 000000000..070b42c74 --- /dev/null +++ b/docs/licences/tinymce-smarty-swift.txt @@ -0,0 +1,460 @@ +TinyMCE, Smarty and Swift are licenced under LGPL : + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/download/.htaccess b/download/.htaccess new file mode 100644 index 000000000..93169e4eb --- /dev/null +++ b/download/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/download/index.php b/download/index.php new file mode 100644 index 000000000..e3a60fae7 --- /dev/null +++ b/download/index.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/footer.php b/footer.php new file mode 100644 index 000000000..f8e5be2df --- /dev/null +++ b/footer.php @@ -0,0 +1,29 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$controller = new FrontController(); +$controller->displayFooter(); diff --git a/get-file.php b/get-file.php new file mode 100644 index 000000000..24e4a41d6 --- /dev/null +++ b/get-file.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=get-file'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/guest-tracking.php b/guest-tracking.php new file mode 100644 index 000000000..9bef034aa --- /dev/null +++ b/guest-tracking.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=guest-tracking'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/header.php b/header.php new file mode 100644 index 000000000..cdca642c1 --- /dev/null +++ b/header.php @@ -0,0 +1,30 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$controller = new FrontController(); +$controller->displayHeader(); + diff --git a/history.php b/history.php new file mode 100644 index 000000000..1b40f010b --- /dev/null +++ b/history.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=history'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/identity.php b/identity.php new file mode 100644 index 000000000..f3a8b93aa --- /dev/null +++ b/identity.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=identity'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/images.inc.php b/images.inc.php new file mode 100644 index 000000000..ad02c61be --- /dev/null +++ b/images.inc.php @@ -0,0 +1,382 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * Generate a cached thumbnail for object lists (eg. carrier, order states...etc) + * + * @param string $image Real image filename + * @param string $cacheImage Cached filename + * @param integer $size Desired size + * @param string $imageType Image type + * @param boolean $disableCache When turned on a timestamp will be added to the image URI to disable the HTTP cache + */ +function cacheImage($image, $cacheImage, $size, $imageType = 'jpg', $disableCache = false) +{ + if (file_exists($image)) + { + if (!file_exists(_PS_TMP_IMG_DIR_.$cacheImage)) + { + $memory_limit = ini_get('memory_limit'); + // memory_limit == -1 => unlimited memory + if ((int)$memory_limit != -1) + { + if (preg_match('/[0-9]+k/i', $memory_limit)) + $memory_limit = 1024 * (int)$memory_limit; + elseif (preg_match('/[0-9]+m/i', $memory_limit)) + $memory_limit = 1024 * 1024 * (int)$memory_limit; + elseif (preg_match('/[0-9]+g/i', $memory_limit)) + $memory_limit = 1024 * 1024 * 1024 * (int)$memory_limit; + $current_memory = memory_get_usage(); + $infos = getimagesize($image); + + // Evaluate the memory required to resize the image: if it's too much, you can't resize it. + if (($infos[0] * $infos[1] * $infos['bits'] * ($infos['channels'] / 8) + pow(2, 16)) * 1.8 + $current_memory > $memory_limit - 1024 * 1024) + return false; + } + + $imageGd = ($imageType == 'gif' ? imagecreatefromgif($image) : imagecreatefromjpeg($image)); + $x = imagesx($imageGd); + $y = imagesy($imageGd); + $max_x = ((int)$size)*3; + /* Size is already ok */ + if ($y < $size && $x <= $max_x ) + copy($image, _PS_TMP_IMG_DIR_.$cacheImage); + + /* We need to resize */ + else + { + $ratioX = $x / ($y / $size); + if($ratioX > $max_x) + { + $ratioX = $max_x; + $size = $y / ($x / $max_x); + } + $newImage = ($imageType == 'gif' ? imagecreate($ratioX, $size) : imagecreatetruecolor($ratioX, $size)); + + /* Allow to keep nice look even if resized */ + $white = imagecolorallocate($newImage, 255, 255, 255); + imagefill($newImage, 0, 0, $white); + imagecopyresampled($newImage, $imageGd, 0, 0, 0, 0, $ratioX, $size, $x, $y); + imagecolortransparent($newImage, $white); + + /* Quality alteration and image creation */ + if ($imageType == 'gif') + imagegif($newImage, _PS_TMP_IMG_DIR_.$cacheImage); + else + imagejpeg($newImage, _PS_TMP_IMG_DIR_.$cacheImage, 86); + } + } + return ''; + } + return ''; +} + +/** + * Check image upload + * + * @param array $file Upload $_FILE value + * @param integer $maxFileSize Maximum upload size + */ +function checkImage($file, $maxFileSize) +{ + if ($file['size'] > $maxFileSize) + return Tools::displayError('Image is too large').' ('.($file['size'] / 1000).Tools::displayError('KB').'). '.Tools::displayError('Maximum allowed:').' '.($maxFileSize / 1000).Tools::displayError('KB'); + if (!isPicture($file)) + return Tools::displayError('Image format not recognized, allowed formats are: .gif, .jpg, .png'); + if ($file['error']) + return Tools::displayError('Error while uploading image; please change your server\'s settings.').'('.Tools::displayError('Error code: ').$file['error'].')'; + return false; +} + + + +function checkImageUploadError($file) +{ + if ($file['error']) + { + switch ($file['error']) + { + case 1: + return Tools::displayError('The file is too large.'); + break; + + case 2: + return Tools::displayError('The file is too large.'); + break; + + case 3: + return Tools::displayError('The file was partialy uploaded'); + break; + + case 4: + return Tools::displayError('The file is empty'); + break; + } + } +} + +/** + * Check image MIME type + * + * @param string $file $_FILE of the current file + * @param array $types Allowed MIME types + */ +function isPicture($file, $types = NULL) +{ + /* Detect mime content type */ + $mimeType = false; + if (!$types) + $types = array('image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png'); + + /* Try 4 different methods to determine the mime type */ + if (function_exists('finfo_open')) + { + $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; + $finfo = finfo_open($const); + $mimeType = finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); + } + elseif (function_exists('mime_content_type')) + $mimeType = mime_content_type($file['tmp_name']); + elseif (function_exists('exec')) + { + $mimeType = trim(exec('file -b --mime-type '.escapeshellarg($file['tmp_name']))); + if (!$mimeType) + $mimeType = trim(exec('file --mime '.escapeshellarg($file['tmp_name']))); + if (!$mimeType) + $mimeType = trim(exec('file -bi '.escapeshellarg($file['tmp_name']))); + } + if (empty($mimeType) OR $mimeType == 'regular file' OR $mimeType == 'text/plain') + $mimeType = $file['type']; + + /* For each allowed MIME type, we are looking for it inside the current MIME type */ + foreach ($types AS $type) + if (strstr($mimeType, $type)) + return true; + + return false; +} + +/** + * Check icon upload + * + * @param array $file Upload $_FILE value + * @param integer $maxFileSize Maximum upload size + */ +function checkIco($file, $maxFileSize) +{ + if ($file['size'] > $maxFileSize) + return Tools::displayError('Image is too large').' ('.($file['size'] / 1000).'ko). '.Tools::displayError('Maximum allowed:').' '.($maxFileSize / 1000).'ko'; + if (substr($file['name'], -4) != '.ico') + return Tools::displayError('Image format not recognized, allowed formats are: .ico'); + if ($file['error']) + return Tools::displayError('Error while uploading image; please change your server\'s settings.'); + return false; +} + +/** + * Resize, cut and optimize image + * + * @param array $sourceFile Image object from $_FILE + * @param string $destFile Destination filename + * @param integer $destWidth Desired width (optional) + * @param integer $destHeight Desired height (optional) + * + * @return boolean Operation result + */ +function imageResize($sourceFile, $destFile, $destWidth = NULL, $destHeight = NULL, $fileType = 'jpg') +{ + list($sourceWidth, $sourceHeight, $type, $attr) = getimagesize($sourceFile); + if (!$sourceWidth) + return false; + if ($destWidth == NULL) $destWidth = $sourceWidth; + if ($destHeight == NULL) $destHeight = $sourceHeight; + + $sourceImage = createSrcImage($type, $sourceFile); + + $widthDiff = $destWidth / $sourceWidth; + $heightDiff = $destHeight / $sourceHeight; + + if ($widthDiff > 1 AND $heightDiff > 1) + { + $nextWidth = $sourceWidth; + $nextHeight = $sourceHeight; + } + else + { + if (Configuration::get('PS_IMAGE_GENERATION_METHOD') == 2 OR (!Configuration::get('PS_IMAGE_GENERATION_METHOD') AND $widthDiff > $heightDiff)) + { + $nextHeight = $destHeight; + $nextWidth = round(($sourceWidth * $nextHeight) / $sourceHeight); + $destWidth = (int)(!Configuration::get('PS_IMAGE_GENERATION_METHOD') ? $destWidth : $nextWidth); + } + else + { + $nextWidth = $destWidth; + $nextHeight = round($sourceHeight * $destWidth / $sourceWidth); + $destHeight = (int)(!Configuration::get('PS_IMAGE_GENERATION_METHOD') ? $destHeight : $nextHeight); + } + } + + $destImage = imagecreatetruecolor($destWidth, $destHeight); + + $white = imagecolorallocate($destImage, 255, 255, 255); + imagefilledrectangle ($destImage, 0, 0, $destWidth, $destHeight, $white); + + imagecopyresampled($destImage, $sourceImage, (int)(($destWidth - $nextWidth) / 2), (int)(($destHeight - $nextHeight) / 2), 0, 0, $nextWidth, $nextHeight, $sourceWidth, $sourceHeight); + imagecolortransparent($destImage, $white); + return (returnDestImage($fileType, $destImage, $destFile)); +} + +/** + * Cut image + * + * @param array $srcFile Image object from $_FILE + * @param string $destFile Destination filename + * @param integer $destWidth Desired width (optional) + * @param integer $destHeight Desired height (optional) + * + * @return boolean Operation result + */ +function imageCut($srcFile, $destFile, $destWidth = NULL, $destHeight = NULL, $fileType = 'jpg', $destX = 0, $destY = 0) +{ + if (!isset($srcFile['tmp_name']) OR !file_exists($srcFile['tmp_name'])) + return false; + + // Source infos + $srcInfos = getimagesize($srcFile['tmp_name']); + $src['width'] = $srcInfos[0]; + $src['height'] = $srcInfos[1]; + $src['ressource'] = createSrcImage($srcInfos[2], $srcFile['tmp_name']); + + // Destination infos + $dest['x'] = $destX; + $dest['y'] = $destY; + $dest['width'] = $destWidth != NULL ? $destWidth : $src['width']; + $dest['height'] = $destHeight != NULL ? $destHeight : $src['height']; + $dest['ressource'] = createDestImage($dest['width'], $dest['height']); + + $white = imagecolorallocate($dest['ressource'], 255, 255, 255); + imagecopyresampled($dest['ressource'], $src['ressource'], 0, 0, $dest['x'], $dest['y'], $dest['width'], $dest['height'], $dest['width'], $dest['height']); + imagecolortransparent($dest['ressource'], $white); + $return = returnDestImage($fileType, $dest['ressource'], $destFile); + return ($return); +} + +function createSrcImage($type, $filename) +{ + switch ($type) + { + case 1: + return imagecreatefromgif($filename); + break; + case 3: + return imagecreatefrompng($filename); + break; + case 2: + default: + return imagecreatefromjpeg($filename); + break; + } +} + +function createDestImage($width, $height) +{ + $image = imagecreatetruecolor($width, $height); + $white = imagecolorallocate($image, 255, 255, 255); + imagefill($image, 0, 0, $white); + return $image; +} + +function returnDestImage($type, $ressource, $filename) +{ + $flag = false; + switch ($type) + { + case 'gif': + $flag = imagegif($ressource, $filename); + break; + case 'png': + $flag = imagepng($ressource, $filename, 7); + break; + case 'jpeg': + default: + $flag = imagejpeg($ressource, $filename, 90); + break; + } + imagedestroy($ressource); + @chmod($filename, 0664); + return $flag; +} + +/** + * Delete product or category image + * + * @param integer $id_item Product or category id + * @param integer $id_image Image id + * TODO This function will soon be deprecated. + */ +function deleteImage($id_item, $id_image = NULL) +{ + // Category + if (!$id_image) + { + $path = _PS_CAT_IMG_DIR_; + $table = 'category'; + if (file_exists(_PS_TMP_IMG_DIR_.$table.'_'.$id_item.'.jpg')) + unlink(_PS_TMP_IMG_DIR_.$table.'_'.$id_item.'.jpg'); + if (!$id_image AND file_exists($path.$id_item.'.jpg')) + unlink($path.$id_item.'.jpg'); + + /* Auto-generated images */ + $imagesTypes = ImageType::getImagesTypes(); + foreach ($imagesTypes AS $k => $imagesType) + if (file_exists($path.$id_item.'-'.$imagesType['name'].'.jpg')) + unlink($path.$id_item.'-'.$imagesType['name'].'.jpg'); + }else // Product + { + $path = _PS_PROD_IMG_DIR_; + $table = 'product'; + $image = new Image($id_image); + $image->id_product = $id_item; + + if (file_exists($path.$image->getExistingImgPath().'.jpg')) + unlink($path.$image->getExistingImgPath().'.jpg'); + + /* Auto-generated images */ + $imagesTypes = ImageType::getImagesTypes(); + foreach ($imagesTypes AS $k => $imagesType) + if (file_exists($path.$image->getExistingImgPath().'-'.$imagesType['name'].'.jpg')) + unlink($path.$image->getExistingImgPath().'-'.$imagesType['name'].'.jpg'); + } + + /* BO "mini" image */ + if (file_exists(_PS_TMP_IMG_DIR_.$table.'_mini_'.$id_item.'.jpg')) + unlink(_PS_TMP_IMG_DIR_.$table.'_mini_'.$id_item.'.jpg'); + return true; +} + diff --git a/img/404.gif b/img/404.gif new file mode 100644 index 0000000000000000000000000000000000000000..e61d3b039672e098f47229189426e6e6b802e349 GIT binary patch literal 1049 zcmV+!1m^okNk%w1VSNC70K@gwv*+1cXZ;k>)M%*@RH|Nj6000000000000000000000000000000000000 z000000000000000A^8LV00000EC2ui0DS;`000I5AS8}tX`X1Ru59bRa4gSsT}ODX z?|kq7z@TtQEJjGiq;kn@0+G(BbV`L%uh{I*s_lBG+^=|C43p33ojJ`WuiNnMJ5H~T z>b*n20OqWCWYP$f*gqZp2~=2+7i(0}N-nO}x|FouXsd zO9tHIoCV*`TH@sEjtyeqMhd;`>)vwcR|NC)>y`H+T?FtO7-^6ectaelo5UcHLqrSq zAzSbdLY4y(eIYPl5C{W-+pJ|l7^J|q0rrUh1c)XL!9jdc4s2V{(Fg&P(o%wf=>%so zb3LUA7|F9qMq5*kA!D`^;4Wzis1RWJ%K;XWK79Hbz%+`wUqi28?LpO-Ff3(jT`j6a zCb9uFr!+{`)ydc$0g|1?!XTNyrWU6FpsOV>vcFR9>KOcsVqw2x*(OPp)|1u8$aLD3 z%tQ~L0s<=6oznMkWT#|2_wh2nuzq*PWlnu+4rIKFOO3mf;6smUC_4(ywWR$rPo z_by)KcrCcRi8F6L4d`j<(}UdHR=deo1v?U3lX}^~HB&q{mJF0_;V{Uj*_L*r0>;MY!OE6rN|{HVj_F86F!> zBLIf_ou|(@05&6_CE{^IUK$8y(b_i2owH&chD|fTd}zdY#cZ`8pa2~{PN5qz9TNFr z8!i4sqKf;0Se+$BM#0#Bu~q2=NR8p9WfRG)=jD=UC;-`*H?~olFJYk>B^_7RQlpY- zvJodO-MvEQ8UA^~+?PvmNlTk<`X;CYJ|mc4@4MwMr|Dwt8WJ0KE3<>#uXt2`e0TrV=Wv zs*+KxC&!MGYZuFE`scG+L<{Pcw8@TPEhNp>F{=^VKGLnQzJ=?^xUZJ`3%YQ8TZFld zu-k^aM8M04yu)NGhP@Bqi>tn0@au1n)Mgh#iOo72k+aS}-yAf} THWY32(MTt)^wLbr5CQ-@<&*Ln literal 0 HcmV?d00001 diff --git a/img/admin/AdminBackup.gif b/img/admin/AdminBackup.gif new file mode 100644 index 0000000000000000000000000000000000000000..15991a4c7c01a68bff66cc6a21cbb79034904c31 GIT binary patch literal 1052 zcmeH`Yfn-E0ESQNX3dPOwyc(#w(PQIt(KN+mQKoS>AJ77$Si4U7PT_FfN2(Z>#~*3 z5JW9v8k;lmHb5|-K!Fe;I80Dbj)Nl?k$~e#e?b4BXV16y!@IrPi#?VS7mvdL7@!OQ zc3o*cfd6vn7ArZAm0Z9+_q03Xnc&nj{^b(xX_D~F^Y7y`Q+g|%J19?J-%9&|5lp+UUlb#oKT}6)T-{+${$d* zg>^$kRMkVO=3%|2uwGYG2NqNr3u)R%G;I-G|CphB!Z18-0+Ai25^ly^`3K4E8p$0x zo!->c#AGsAELKZPOKWQ@o6T-(Yiny<9H0xKT}P z21^^j($662lachvRQ`4BO}pj&H>ma-T*HCr+&N(?4{j5Ub`8L6nM-6Z6WPm$-3`N@ z1|E;c=kxpe`UC=jP$=y0?-z^35{X1AmC9tYfq{X+!9lrPu23kHN~KDr8X6i>tJNBf zMyu88bUM9W4}zeaBkN5(Jf8N+wGL{jFSs2f?YQ^S*rd&aP$l+ABE zLF9Xq(5U!K_n0OoS{WXntEM^jTtB{PzM3F;nHOUVuCYkYsjYM zXOCoLgqcYzu|*~hQ*bpkCM06piEAbrmT@po&BI4*`PF=q8jDZ8OB9{hhc~1Vou;Fd zwcFF)C9;z$8T(&F?!C|;TufQLIdP4gzzC*ct3%_CC5zMPhsh}zq9drhVtrh2!r?Vp rOIC!Hr7zOtSgVS+-)p_DD9&CLx?n?C%K3uG(ig$&b_N3&3~=x-){fS- literal 0 HcmV?d00001 diff --git a/img/admin/AdminCatalog.gif b/img/admin/AdminCatalog.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e24cbc0c36e5db0e81f2903a4811fb1cb736e62 GIT binary patch literal 1697 zcmd5+S6CER6y9EFir51<45A3^PT4-}g3D~9Y+-k?5D|vmksV=X*4Y78Oi>U8Nn#Sy zi%CrHwp5dtrlu#FUW}$`OfxanG&75=Nxsj|hdkvz%-nPDf6jmYd(XMT&8v|&JM=a1?6IQo4kQim0}XJPihUx0*o@hOkCfgz?;=3uXJGo z^mVG-guHje-!tqF(}hI00d)#UMMF$cA5&Qx<*U|53(6(2mF5{0lDPq}kyXy4i>jKk zYMSNFmT{hlawe=StCZ3!yq>m<85)VjFSj+x%wB0hnONtM;)@hbY=JE-vj#KSL5H`s zlvtsuk15J4WqLfXb|6mlI$XwtJ01kpDguk^q87Cs0BoDNc z9TZ~&kM7tB0#wun&Np~rZyYCMl&6m)Lw&w*q^~n#iGtNtfHjFF={QaD1dyb=m;{!z zfkc#TCoy53T82Pi6vB7fKznKfNO9sUM*;>dtck!z7%(DQM5i~IOcekMBQOM`5Q1tD z6Q)Bk7zV}$D6nzSC0Nkm8sicy8yMsHI0iwzy}jCAotEV~AjD#^q++0`MnGs1%Nd?X zYM4ZEI)Z~tL^vwWQ!E3dA`$4MwiCfIH+LJIKWw6kz_XC_Jkg={cCM+uigbUD~aH%&5pt-}Ti zJK87}#bCV|Mi7%8HleW5j39P1>@>TaHMqs1v$$Y=I>zaIO(we&LG?P^i8v9&;WC?1 zyWMUOEL4Xes4?wZ%OrS$iI8btO5h#yMbGGq;T%cuEEi_ku5<+iVl2-lVr(41Lk7T0 zL?|X@r>^IuS_jEdJ!I6yu{1Dxz8G~HenITNbX#zTvqtAM=$vK~YP1``G2iHaIWtH| z21*sjKZ+&2BvfE(daCpV<5csIjLG?sfBy0NZ@(V@<>#M%{Nej!-+g=Zo3Fq6 z@{1#%A3pTir=NWM(ZK^B?*HKZ_uhTy?YG{16h zxcssWmtJ!5`im~SU}W9!(AqVFs|Wg5tvvs{bI)1Pw>;U~)6FNiWpS3FyE>Orv5qBV zG}2DAwJvU1bawN?1@q@Mg+sx{fZykBsIRN_xLr;MUSpqIU1hUYVivQ>Xwd6Wp)IwV zit@5KrL$+1%q#|rfEk4a`Daa^Hg(G6NfYxXj7Kw_E%Y<)O zRFQh?Qg6OUxp8Hqcs_vtfmzumWfpDy*lM>Zt z=0lz!78VVOr`Jxhx~g@KnOnE#OdiY~w{xvHXSO~gV|=D<*6uZ8)r2Yi1xiW%zCp1h z%RbHElgMTJS0AXe%q_`tA3id0ASA`JKaUCcV%bCCyParSDSaopf P-p!kKjbuy3qRPJjEe7_a literal 0 HcmV?d00001 diff --git a/img/admin/AdminCustomers.gif b/img/admin/AdminCustomers.gif new file mode 100644 index 0000000000000000000000000000000000000000..faef1dc53601673ed17d5d08c117d09575f7086e GIT binary patch literal 1461 zcmZ?wbhEHb6k!lyxN5=>RLJR_!4_D+8IZ^Bm(5}9!5mb;scz0BtHtP_!=6!V?wQK& z9LuI*$!g)tEUCii6wT_HC~ROa=pCc(87t!&&lZ#=nNVo$lf~hk&K8ttVi(5dm(67t z!s{L<>X*f98_ca?&gzrFmQZBto2cR%E^Fk>R@uk*}`rz#W*+ z=@BWf=fL8X#-7n&5nRN?;Zqle1Gx6p~WYGxKbf-tXS8 zq>!0ns}yePYv5bpoSKp8QB{;0T;&&%T$P<{nWAKGr(jcIRgqhen_7~nP?4LHS8P>b ztCX0MpOk6^WP^nDl@!2AO0sR096=HaAUmD&i&7O#^$c{A4a^J_%nbDmjZMtW&2GK4GRy>*)Z*l#%z~24{5%DaiHS-1r6smXK$k+i zkXzvE3pY5gSP$$Wz2y8{{ffi_eM3D1{oGuTzrd=COM+4n&cLd=IHa;5RX-@TIKQ+g zITff}8KxN+cK9s)HWySP|5yBfM08oIbySQt4vI+_A` zM#hGQMrJU*o_WP3iFwJXFncqB_5$^~8XB26;?-;AT$Gwvl3x^(pPvIu0Rb8LCHch} z`2`Bj!KMnniOHFHAU-I1Aii};Ey^rQO>ryA&s6}2uT>@%`+=TC@wcV3i>s5dtEsW8 zg}ITLqp1>9ZwfhKrVn(CJ}7Y@B^HeX-RQWVL^UgZccVq zW=48iYD#iaVnTdeY)o`iWJGvaXh?8SV1U1$uaCEvr-!?ntBbRfql3Mjt&O#nrG>ef zsfn=>Fk9;B>S$|eYN)HJswgWdD#**p%1BE|N{EYziUOZlh$g{>~#?dLKM4GswXWw|FvT>ga!vUvc zRn@f32ab4Io;Og{?rr{eB2%oPv9zCqO|Hm5lueIE!<&PhRe&XtMSzu^!=0Cphmn~f mgMnF6n~&E`mXRrA`En*k1vh0bqYWE3afz32+wSeiU=09up4MUj literal 0 HcmV?d00001 diff --git a/img/admin/AdminEmployees.gif b/img/admin/AdminEmployees.gif new file mode 100644 index 0000000000000000000000000000000000000000..38e91df296c5475197908fb9446b800a2169464d GIT binary patch literal 1720 zcmcgsS$Gpw6i%D1ZAzNbl#)_pnzC8iWM;BXnuW+1!0C|_;oTbc!Us|;@!8hw02gMjFqg16;qJp!ze?;(pk zlz3KEw!6E403wUO2z7|DdRg-l*w!RB)a7`(N^EU;AzIhbr>pBK1AQ3gl~@DCzQt8_ zl++dywk<35(+VOauO)@8G`xIu8__ATx98#^sVy)A^9kKR;S6zrsn(V}Hz>8V2#obI zbCV#pB2c?XVr$K}wdR=vk_t2{*sHJx3Tqb^(1Q(lhtTXTsR@Xk?Fw74)EX?Ttl`_+ zrHa{EM61FQC~*Len_~?W)%S?BZjq%)Vr|JcHi)(Eyq=VY=#VYY%k3el*;lBTo5lMd zNBL1n$m@q3BujFCvn>@T!@U#>byG{}m_>Pb_Z}rgM=Z)Vofr1T395&74<)FkAzyQN zs5gv7lr}45PMK2Cc$8vEC>8CCB~2-dl8i9jl!=?Cm(@yW0>buMlz4grN^25Kf`W7^ zxH=5$VMvdt5RKMgFjPS(jKFFbRU>FMVlZh?6AVL>L&>QnB1=p`hig)cvnVbg))qqCDB$lcX48zhsP_&vuR3`^xESai~B`Y!>98@x#pyMpf#GtfCvYY8=ElMuZ zV<|-AUhi?ov7~AuAyt@(s#9cKji_LCG@8z90-a=o)Zby85S?ruj8p0$m1O!8VTyxS zWXRmvom?mlg=!E4)n~Y#Sdt}UVJf3bbGnmU zO998SB&sna-(22_vhl#|@Ze>pQX7mPYx9RDbm%o10D>FM#(=ZxdcL&dm` zNpP)^b@b0ae*f*)BftFo(~m!V|J}FW9RB*NFTeQwvrj)c^zla@esJ*p_uhTy?YG{1 zDDcmY`*xS3oqET@%#|?6X#!dB)ISYG8Rkn@lW=GqGr2@9A{U(j`}U_QwYD@j1q1#@ zpSPjD&f~6iIUR%@Uud&h%rz#=Xwd7l8kB2GRdv;Z%2Vghn>%NAg|Zx)b;``L8KsKp zCDV%KMNCo0fj_dE%Wb!SKkc)uUr;)~;I* zI(ZxF#z%xwX|8b7Fb?K|lHt(!v>6gn$8h$VLQ5gwp8^DGke%lqYpmq&D9D;B0rL5} zF((iKBQSxP0G%TXjMi2)0YY38Y#8ykk0PK9Oo4$90>$~((ovg10rCsPSR2S)2xg7e z14n$vUP`oC4z`ZxbnTOk7M1VXwe7(0`i;0fHC;Kp5XS^XZvVmHoZMB#TY}rc{)8Xm G)%*o=eFD({ literal 0 HcmV?d00001 diff --git a/img/admin/AdminModules.gif b/img/admin/AdminModules.gif new file mode 100644 index 0000000000000000000000000000000000000000..29b86c2b22eda173ed7fc33017acfdc00fa3145b GIT binary patch literal 1461 zcmZ?wbhEHb6k!lyxN6G~RLB{a&+eDS5s=5OW5?u^#bM#c99Y2Vk;3km%^{`E=$$MU zkS*+&pyeH_>KCu4Vaa6X#ZuJfo?2}ll&YCgZ($$7np|b>p1>NBW$v257M!JGAI=_I zuIiP_8JNc@smACM$7UVG=AXmvmB#KHr)})P5}3!6P-5;AryiYQYwjWuk|$x{!mOan zY~smc?9S{Q!xV%Qmue&kg&dz0$52&wylyQNJ0T* zr*nQ$s)DJWfo`&anSp|tp`M|!iMhGCj)IYap@F`Ek-njkuA#Y=v5}R5fdUjL0c|Tv zNwW%aaf8|g1^l#~=$>Fbx5m+O@q>*W`v>l<2HT7t|lGSUUA&@HaaD@m--%_~-h znc$LIoLrPyP?DLSrvNfBF)6>a#8wIDQivCF3w(Xy2Im#)fjy*`oS&;-kyxN_sAr&` zn+x(6SaoqpP%6S1SXCE?R2HP_2c;J0mlh?b0+lPnGy}s9zeOO0K-XCL7i9t?B{9b( zKe;qFHLt|e#a0O@qnDDIVr5`rVPI%zZen0=WMF1tXy|BR;A-LK>f~%`X>93cU;;A( zn_hEsCvy`wQzvIvLsvsX7dHzFBS%L^Qy|aC*wE0(45rsJuec;JFF6%vZzj-Qs9s0B zdaay`QWHz^i$e1Ab6_bTAS1sdzc?emK*2fKRKYhfIWrH$2SpFWw=StgnPsUdZbkXI z3gGay%EV$n(6cE1wsdxJbuxA}HFmWyH!^cHRf6hGAt%iAfsWA!B@U#-0uutJKoAq2 z^no0B=1I*1=9nU2)?obq@9&@AzkdGs{_X3R&!0Yic>nJ0o7b;izIguZ>66Eg9zM8# z@9v%3w{G6Je(ma&%a<-*IDhW!nbW6Eo;ZH&=#j&R4j$OQZ||PnyLRr_zHRH4&6_rE zSif%Vn$@dTu2{Zo>5|2Z7A}}SZ|F(<6Xm4w6X>Mw4 zsIRN7sjjN5C@(85DK083$j{5o$mNlr>kh>weniH?el2oDPl2@VPj@b~le z@%HlcaCdWcadvWau(z|dv9_|bFgG(bF*X8bOFdm3Z7od=bv0ELWhF%gc{y1bX(>qw zaWPR5VIe^Qem-6vZZ1v^b~aWPW+p}k2F0H&K+={$2UOsI%1j2fq66~^JanY`Pb?`q znPXMGU}loXY`ti<85_hZ*G@BR^j&dE(aT%rL0VG>ODkKEyTJs8#S>TsJqkGV-1ww; z IwvG(e0LVt&ApigX literal 0 HcmV?d00001 diff --git a/img/admin/AdminNext.gif b/img/admin/AdminNext.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e6deea2559d7f6703961a38b031640e819b64f4 GIT binary patch literal 1330 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 E0C}~{U;qFB literal 0 HcmV?d00001 diff --git a/img/admin/AdminPayment.gif b/img/admin/AdminPayment.gif new file mode 100644 index 0000000000000000000000000000000000000000..14bb881bd1c98983b9262e384d385bddf5e91ee6 GIT binary patch literal 1322 zcmZ?wbhEHb6k!lyI3mlS=g1_Z!RVgIs_(??6v?M!$7JCxU>hK;ZN+96D4bg8>l!WW z6v?A)%cO43lv?Cx?kQm5C1mN#?Gh!VZpmcn%V+5=q;1V*=_O?1&ZBI^=n}^!tHsCw z1B(B-BYXoCToOwXfwYZ%ML}Y6c4~=2Qfhi;o~_dR-TRdkGE;1o!cBb*d<&dYGcrA@ zic*8C{6dnevXd=SlxV%Qmue&kg&dz0$52& zwylyQNJ0T*r*nQ$s)DJWfo`&anSp|tp`M|!iMhGCj)IYap@F`Ek-njkuA#Y=v5}R5 zfdUjL0c|TvNwW%aaf8|g1^l#~=$>Fbx5m+O@q>*W`v>l<2HT7t|lGSUUA&@Haa zD@m--%_~-hnc$LIoLrPyP?DLSrvNfBF)6>a#8wIDQivCF3w(Xy2Im#)fjy*`oS&;- zkyxN_sAr&`n+x(6SaoqpP%6S1SXCE?R2HP_2c;J0mlh?b0+lPnGy}s9zeOO0K-XCL z7i9t?B{9b(Ke;qFHLt|e#a0O@qnDDIVr5`rVPI%zZen0=WMF1tXy|BR;A-LK>f~%` zX>93cU;;A(n_hEsCnF;_OLJ#eLsvsX7dHzFBS%L^Qy|aC*wE0(45rsJuec;JFF6%v zZzj-Qs9rO?daay`QWHz^i$e1Ab6_bTAS1sdzc?emK*2fKRKYhfIWrH$2SpFWw=Stg znPsUdZbkXI3gGay%EV$n(6cE1wsdxJbuxA}HFmWyH!^cHRf6hGAt%iAfsWA!B@U#- z0uutJKoAq2^no0B=1I*1=9nU2)?obq@9&@AzkdGs{_X3R&!0Yic>nJ0o7b;izIguZ z>66Eg9zM8#@9v%3w{G6Je(ma&%a<-*IDhW!nbW6Eo;ZH&=#j&R4j$OQZ||PnyLRr_ zzHRH4&6_rESif%Vn$@dTu2{Zo>5|2Z7A}}SZ|F(<6 zXm4w6X>Mw4sIRN7sjjN5C@(85DK083$j{5o$mNlr>kh>weniH?el2oDPl z2@VPj@b~le@%HlcaCdWcadvWau(z|dv9_|bFgG(bF*X8bOFdm3Z7od=bv0ELWhF%g zc{y1bX(>qwaWPR5VIe^Qem-6vZZ1v^b~aWPW+q@Uqxh2rNXjzkfC?N?na05Co}k{B zk~uG9)w-P9Y%x0L4|Z;tK6B#)O~zRZ3OH8GkZ9^HIw>OHBYf@9louup4UPv(3?w5Y aCbxqG3D{A4#9GI@^5iO@<$7JBl ztnbX6QsT-$3Q+vd9pM|G;F4I92&8T7D+&^mvr|hHl2X$%^K6yg@7}MZkeOnu6mIHk z;9KCFnvv;IRg@ZBBbrg&Y3=Q-RjPwnS zbPdg|jE$@e3>2V1320kUN}5%WiyPD~AkS7Qqokz3N?*Ucyj-u`STDaQUEk2s(h_8b zk&!M?g>G?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaHmqNUdTj1*pH#o0Y z59}emIIAz^b}9q_QAYKPa_0zqBYh6{uVprWqJ^ z_$>k{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e|N03j;$#a}xt|BLg!FLqkUk z16K<-S0`snOJhqn0~44T*z}s4J2| z4|I$^C~+Vq7MKt)1%jCHqz~l4Gf!$BFvk=Dvj*e;e}Dh{{`K?6_itaneE#(D!~1t{ z-@JbH^2PIKPoF$~^zgy`dw1{LzIF4)^=ntJT)uSi!ufM&&zwGW^2G6DM~@snbnw9b zeS7!p-nDbb_HA3YY~HkS!}@h=*Q{Q(a>epxOP4HOv~a=vd2{E?o;7pE^l4M4OrA7x zLVsUxPj^>mM|)dqOLJ3WLw#LsO?6deMR{3iNpVqOL4ICtPIgviMtWLmN^(+SLVR3o zOmtLaM0i+eNN`YKfWM!wkGGenhr64ri?frXgT0-tjkT4fg}IrjiLntdTk7fRXlrR| zsH>@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%bSFev_H0g{FcI-o)c zRAw@;l^vK-;GrYce_~0HrUch4rx%675=E;HIk2A0;&EJ-_;`~@o7!RFXB`W6m>gmNT2ChXJ3nvY<1cWXaB5yWJcatO0QA)(iju literal 0 HcmV?d00001 diff --git a/img/admin/AdminShipping.gif b/img/admin/AdminShipping.gif new file mode 100644 index 0000000000000000000000000000000000000000..362e2928e5bfbf4b8259786d87bc8b30bb95501e GIT binary patch literal 1709 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 literal 0 HcmV?d00001 diff --git a/img/admin/AdminTools.gif b/img/admin/AdminTools.gif new file mode 100644 index 0000000000000000000000000000000000000000..854e17468b01bdfd0c75a2109c6a7e043f67225d GIT binary patch literal 1658 zcmZ?wbhEHb6k!lyc;?LDp1`VO%NA3rp=Hf%7sh7f%IuTL<`l*17|Ckj!WxmUZXeEN z?#YvN*62}%%BrmSSsBFZjZpIptp< zreV&Okmsgu#_W|WU>V4&ZN(OnCmWE*o=|EUkjt)R#pV<)7M5mW6U?G!%48S9;T+4R zY{=vi!|f3-!7wy|;(zW4-v9-d#F9iHZDU_ikeHmETB4AYnx2_wtMq>NekFy>6kDZm zQ(pt$0_W6>OpmIf)Zi+=kmRcDWXlvKdpiZ23ag6Tg51=SM1_jnoV;SI3R|Vbl>DSr zDrlU}Ruupl@KL zZ)l`zXl`X}WMyEW00l}w+lo@stb$zJpmqUywn`Z#B?VUc`sL;2dgaD?`9*7iAWdWaj57fJ{tG$}cUkRRX#c;)UD-UthSv zdBu8Q59uZ6=jvA^7U&!58R+Ncg8T(mU0f2Bif{&2)x{x|1*!T$sm1xFMaii^<;pP4 zz_7z_5lA7>HCFybnZQU%%yG$2F3nBNEAe!(RRYTBrDUd98JJiY7#fLwm{}Ma zI$9XGTDZA7Ia^v9Te=yTz|6p=*WBF6$<@@!&Dqt^)zHwz&BDUS(b3Tq$TKoFG&C}U z>GjMjE=kNwPKDW<3A7ig*A=f`E9aur#FG4?ko^1{SPBTp$S=t+&d4uNa1J(A@J&q4 z%meX3(F5_VOKMSOS!#+~QGTuhIDD-#vDgpvEQ-G^on2g=j9pEQT`kOw%p6UXpn6lt z2{V15WAs6Z11YhVgsyL#pFrHdENpF4Zz^r@34jvqUEVojbN~+qz}*ri~lcuUorj^{SOCmM>enWbvYf3+B(8J7@N+nKPzOn>uCk zq=^&y`+9r2yE;4C+ge+in;IMH>uPJNt12tX%Sua%iwXi?qaq{1!$L!Xg8~Em{d|4Ay*xeK-CSLqog5wP?QCtVtt>6f%}h;V~xOjJZzNKk;EkC%s=i<5($jg^I&iIIUp@h1zAbY{>2 z6_21YpMkx+!MUlqrM0cSqqD2Kr$a@n&DNn?-K2$;!&tvfso9>dnUz7Ft6fA?nMcC0 ziIc&Msgs+9f!D~Hk=lRI~c9o`JDw%H|u=({N-pPgEat36yV|j literal 0 HcmV?d00001 diff --git a/img/admin/___info-ca.gif b/img/admin/___info-ca.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bb96b05d729b098242777d5685d4bdf39407cf1 GIT binary patch literal 628 zcmZ?wbhEHb6krfwc*ekRb)v}6E2jTmt-Qa&?#tcY_xmNjpLBk6$n(eh2j6cN-(R8p zd7u7^;|=fD2|w8E|MOb%|Mz?TKcDw#rSSXp@?TF#eK{WR^HS8WyH)?c9DRDA{@E(S zpO*rj9dNt9MCi}6-p_}PKOEHja!mf?`SAbWul;zu_0#3-U-w!*ZW4Zddg`y2D{d{c z{dU>y%2d(kn?$}J_4;wqq@qQ>`o+5g|)d$~>Y?pnw1dkvqi6aKJ8>Bo8RyGyih%oqQ1 z%JTcYDR&kKy*bzP|Nnmm+5^R(ER5_7aSS>jt3YwWz<#kIuBpkC(bCRR+pM{#$=_R9 zLclw!x5rLdfXTy-X@V1invDWR?x3g2U75Cu|vkL9; z@-kI+(p2CN_u&`n5m8n)H!}Q=4MTu4Kf}R9F7QznC`l8!l;#z$&sUhhhc#dbCUyuH2|*D2rK{q literal 0 HcmV?d00001 diff --git a/img/admin/access.png b/img/admin/access.png new file mode 100644 index 0000000000000000000000000000000000000000..1800f8e56b81fe93899caf3e79d840e83a66c0f2 GIT binary patch literal 706 zcmV;z0zLhSP))oM+u>itHevEaRDcXyY5zmKX?EEbuWnE_yPbMt|!e!9B4IskA-Bvt)s zc6N3lguwRp_QNzy>mh_v2%(gwX?<&J>tF9ZwOVaKM4CtMibsQpELAEMc6N3MA$-?t zHoG~i-L*B4 zGOEh=pWLNj0aL*w>kyQmH$ErE$jrn(-=4b5;^liurofB~=f5Jskrc`#d;>9o;sjuz z0hN@iXZsKX01tk-_0oc=0ERsImE!mbl4KI%7?i7E5e}cC2Y=%S{}APn@_ZBXqZ~j4 zqJesP?cZ?j9ja%(VE4u~EWXd&muKny)y5C@nX12wnPS1`0RhY~4OACD#+6P$648h7lGu%S$8&@FN~xzmjDk of=PJZ^5R4_`&g>k92J270dlgk&Dl^^F#rGn07*qoM6N<$g0PZPO8@`> literal 0 HcmV?d00001 diff --git a/img/admin/add-btn.png b/img/admin/add-btn.png new file mode 100644 index 0000000000000000000000000000000000000000..642a6e1730bf1e3a391e0c96878ad07440b2bb9d GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj)8<3o<+3y6TNskp4n*H^~7K6 zbB=HvQ!v|Q!@R4ZRsM7RbPF>BwvC)w44OQ8j~J2#W*70E$TKTQ{P%w1A-?MjNzF$l z{B3!ZHle8@riD#FTBYrcx`?{KA%(3=vKgw5h)FKC=8Tn7o^rv~mf>TAUcgTe~DWM4f^=CaH literal 0 HcmV?d00001 diff --git a/img/admin/add.gif b/img/admin/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..df08c0b6b93e51661981722c0f8514a8bb2748af GIT binary patch literal 598 zcmZ?wbhEHb6krfwc*ekB(`vH$=912x71!Tg%G(kVH#>CJ!D;{h|KELeXZ6nHma`Qn z?jD|VV`A&Jg6AKedh|J_uL_!ergPH1x>Z+Z*X&NsKajNa#QeRFw%&Ys(SL?R!vOo@`xmd)CzbO}%HD9eYgAJ~+Pg z{M4o`xj|EXcHLQ5us1Gwe#oP@52s!2N?8@M<@WM*_m@^4&3gas&5;-TPd_`f_3rB8 zt;sbzvU>JbWv-5L?zSr19Y66%{j}pPJ=a=#j#ekk4L@>c=YvmouD!q3dA_D+YjN0I zm*TbA41*OY{$ycfXJBX00XYy9Ck*VH8`ztgTUuMq-PCz?n5323*d>ItEtxI#Y-F@r zB~Rn^o?Eo|kuo6UtxYZgUDO|~W_8Ji57 zB zbrg&Y3=Q-RjPwnSbPdg|jE$@e3>2V1320kUN}5%WiyPD~AkS7Qqokz3N?*Ucyj-u` zSTDaQUEk2s(h_8bk&!M?g>G?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaH zmqNUdTj1*pH#o0Y59}emIIAz^b}9q_QAYKPa_0 zzqBYh6{uVprWqJ^_$>k{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e|N03j;$# za}xt|BLg!FLqkUk16K<-S0`snOJhqn0~44T*z}s4yBZm~npir!8oC-9y0}?b7&$sR zngV%7#)gJQW-z^;dBr7(dC93TdozLdLiJkU)obNkl$uzQUlfv`p94z)0U7xv`NbLe z1q#l=rV74^$(eZ|J}7!1zI910$}CGwaVyHtRRD*tRVEhufu2S2x23a-tCO*-sj;ht zxsjQpsS;Fg3OQk>4|I$^C~+Vq7MKt)1%jCHqz~l4Gf!$BFvk=Dvj*e;e}Dh{{`K?6 z_itaneE#(D!~1t{-@JbH^2PIKPoF$~^zgy`dw1{LzIF4)^=ntJT)uSi!ufM&&zwGW z^2G6DM~@snbnw9beS7!p-nDbb_HA3YY~HkS!}@h=*Q{Q(a>epxOP4HOv~a=vd2{E? zo;7pE^l4M4OrA7xLVsUxPj^>mM|)dqOLJ3WLw#LsO?6deMR{3iNpVqOL4ICtPIgvi zMtWLmN^(+SLVR3oOmtLaM0i+eNN`YKfWM!wkGGenhr64ri?frXgT0-tjkT4fg}Irj ziLntdTk7fRXlrR|sH>@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% z%a@-lK$4L`2Uyks%N+p*2PT!C{z`_dITAdZRz}@D+;@3T!#uZXDr&JxJ2Ed%t1GnF Lcrn9@mBAVS{4AgE literal 0 HcmV?d00001 diff --git a/img/admin/addresses_edit.gif b/img/admin/addresses_edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..369fc46ed259191014664e8a16bea76e7513f8b6 GIT binary patch literal 412 zcmV;N0b~A&P)%thM>W-PO4z!6ryTDvQjnlZlgy>*`kliP$?n1x#3mBv=H* zZvSv|{Wk%bFo}=%C%C=cB-|2gZto+r=@*a)F<})kF(DFGf{cEF%qX{I6ar>BlQ09$ zKtwM=E70{BMdbz}7ZEfCIhx`>6H;PlIK|!Y1xVX8?flcwAM>e&;Vo+| zZ%mU{7{y8a=JsV~OO`DAvL$3&vc=4qIVZeyLpJ+o*sj2qBCtwZu&Y?x0tEyt?QD^D zwso!iv7%)aaRr_21O!bhBNe-LfDTG5AUHr-Lqio-WI5~mE+aGhaFUbfp8Lx^$#atc zB>gMHNX_%d0?O(dpKP$qdtkk!Z~wZ;%^S>fW*zzJe8VQGL<1e4Q zde4R4={~sc_u%%U033lfaP16BN!x63@tLW~{f+mC{{iZMtzx&|ZN;_eUbIe}$DzOx z$bPATGjs`@v-Ak>bo1*)wyB8Cy9n92Fu1y5_69%~tlFX)lE<#!zYg7M8U0t zu>NL)#bd@N7Fw~eWzu4B&BHw!!>MZz!Kl3*+g{m0>D=zA8?aVv^LE#pX$^rLDS)`UAbxrJCzSXrp&K#b zLdc2Z-8$@4Z$Hg5j%6qMu3YdfLFSl)sCfp$Q#1JX$~@l5y%?nc1zp)u-@*_shPrU_ zh6!o4Lu8qO#5#f3m`(pwU^b=8 z(v2y?Q3d~%xKN;v@_3J33OO27D%fl`lvb$Ls+xTe81AC9N=wa-s&!!HD*IAXQ=dzE zS}K2G?Q3ykoX?Lh)u~`DmBVN>Vqswc;cyrpj|a6HJ!I8pjE#q=*}%X6m0>cO^+{_7 zieE}RIkw#R9b6g}D&#T*Mn_S{=77my{3Q?wU^1DYR4PGw27`&cS$P2xB9qCY)Hbbf zxZD_@4{a6~nz}j)Ft=kD(g@;7e}6v$fdIT-FPu&%2qJAIGc$8D2~eq2s~bDL{9)Se zrmfrlC=m)NK;@@<@DYvnG$SJeY&M$`>1j0D8i&K_Aps(hXz7`swfD`pw(<7R7fr{s z>z!v>(b?GvtJMmrREqNQa>|plj*gCqUawzbu~=iz0FslFHxUG}l}@Km6&4mg7K_EJ q3B_}Aa`F=TIN_Jc8F@x#$n4**RgB^*(#uT%0000}QdQ9sf*QnxY>*kpE+b{_Q;sJloS71)&(@kO!}mqf@1v(v;*8Y=G9S3kY~Cw# zY=t&c z;3~JK4HxB^lY(MD+sYeQ=t%XSSW;x^1M?dTvN=W^yNcAcy`HCte31C;)5xP%b~qs> zDP&4(%TBqBNGHwnryK;BdMI$fEg xd0mc!C@j^ZpLxYv4HmnPfI0THYuv<%+6iSmMn&w3dPGDfL1|=LY008wP(boU~ literal 0 HcmV?d00001 diff --git a/img/admin/appearance.gif b/img/admin/appearance.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e5f79e9b3bd6a1e8231aeff9823f2016bdbadb2 GIT binary patch literal 1025 zcmZ?wbhEHb6krfwXlG!k+F?_@!$y6^TJ;(0jApF#oIc-g#=NZA)1tQ>ot-4PAXRor zj>hs_jb*u7Yl;ommYS}qve{H-vboH3OS#$hDyy9}cDrirKR7ymi;jAm9r>*^|DV{0 zNmFYZw>$K0aht%^UowCeb>nzM^auP-gXwyfgLlJXl%DsC>Rys@n6=E|Bo zE9<|s2fggielRuR(VX;0bF+T0a{RO=_T&EOpPQo}FD!bpsPM^>(r2qHpRK5QzP9f9 zx|-+fYM-yKf4-sq!~XQ&=dAx<)&74~=ig<+-xr;JUyb{JAou^H+;b}%&TpP@ZTFm; zJEq^?HS6x)xnEnG9ZTWnC*Z=?j8Abs(1QdU=Ff%Yn zGw6VLpgh6AagV{ALuLnKkdR6}ht{19&pqb*PJQ)d!^Q$;e(PmtIy8g3MCME9u(5Ro zyS9oLWgNTn^3q8m*2WpnW<(XbvCc3E@niUL;H1YaUOlnIj6+GM#PuSrmT+uvJE!f``Zo|B9vxhr*{9m=$I{NhuI|)y^tAosY+Wfi}Jkr$;Lft>m1{p&+23 zJh92la@vK3Q#jjMq$c`^Jec6l$a(C{cX!obsicJ1cf-U`tIG`NCfgi!@jADYk^JhwKQ z>=P$IgO8Ap-rGtH=Zv`Zwo$wQ4L(i21g6ypzo~vvL-gN`1{KF)te z`m2tv25BhH%l;Uk!2F2&NuVzml#f?nAp4HAp>g;fzB>lS@gEI5Ycm|8g@?yA@lird0fXuoU{ciC-; u@D0|(tKLwHtZWw!MNF1Ax;Lo(Isbd6S6uF%UZF^|1waFM5)0kASFV*_r zf5`X$%ne2VC(fxmT-}jsfYXA;9VY+dXRBkyakJF^$Ie8>akJF_r!LU^-@Mc6f5}9< z|Iyj@$3jxgjc{5p<*@bty7fjFxMrQ<|FSg(|5N8`{*Rfe3dZp>)c)r#)%jny%Hn@o ztNwqW{%JtWOi?74uF(G2WW5_F_Fv%#JpHAsF)B1 zSx~de;D6#Iwg2VI^#7MmGx=}nEAbX6=SY=|2C|@Wjp6^A6~_N_y1+ql6^NComXkpi zOg&)vKLZlpt1W!Qxv5%IfGmiwQ3Dy?LX+YeWC4&)pk;kvH(DoC9RmQ4MeB(mMfZ&W O0000sPN{y?pud$&)Ad?%lh7{rbt1C-?8)zj^cK<;#~Z zSg>IJ{P{gSJz-&Cfq{X(zP>&_J{}$(uCA^Q4i08!W(?E@ia%Kx*ctva=zt6c`H6w8 z$e|&?LPM(kaO1%R8B$%I&P^XbRLFHRmlQvS6^y1Xss~j24|A zr;dIqQ()uZSCo*Hl$NNJ<7_CC>64L^kdmv*P*7A>R*{sEFDzz?jTcsuNlA0_3T{%4 TNcZsa@eA;9S;_3|$Y2csVFZ1a literal 0 HcmV?d00001 diff --git a/img/admin/arrow2.gif b/img/admin/arrow2.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5c7f485611aa87fef7498449ac19ccedf4ba7f9 GIT binary patch literal 215 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 V7BJ7>(S!g1002ovPDHLkV1n)G4)Fj0 literal 0 HcmV?d00001 diff --git a/img/admin/arrow_in.png b/img/admin/arrow_in.png new file mode 100755 index 0000000000000000000000000000000000000000..134e122632ead612525ac70d0c195fc110eaadd3 GIT binary patch literal 547 zcmV+;0^I$HP)e%@pL+Zh6OKO(bdCwj5U0s0gt)-3k4&7P=4Z z=t{Lg`%d#aL|4wtcyb(OPhTQ_8ly=!3VJ?jF}WW_R1DW)Dj={txfYRvcrJwzJDQ?v zY7}(KlOtjXzD+mmt5&qVQ43Vy*fCWJ{JJ!ak-YD(9sgOK?^~fuX~Ab47|#XKpJwqe z*(|8IEu$C^{TR-BVaoJSt6`-}A?R4tpnai*X`NTsoU0tH%Ompk~r l(#$%pKpR5(n-OJ3xTo| zzV{Az-rC_Vje#(D=jSF0=P$d$OcdrqWdZ50OISNyhHKXf!jg068_0ZrhDT>{L~4Gy zBdqY8Z{N|1SMT6qEsm9X5`57DGIJ6{tUiU*w*<03GFWKb!_-I5B@^$yqd8xVVYQKh zR0+dTu)vlxgG|$F-~JTf!pHvB;^}=nIGMw(LqWZ0Ajmc)rbZwghz$N6FuFDPw?M3V zxyd6>bK=mgT-5{T&WPHE+aleX_AmP13}~n2@i(LDRmJ8PMrCl_&@?^QbAJr{3Xe7{ zRYXL~lWa_vCNY#Ts)2%lP|*kDnyzJ7?dSAQ`{;tavxCB5aI&_5*@FmdS#$HE!Hso; z?9Gj1PKm*v6<|v1p?jjC$@D`cYYE)_AVDgN3~tc{;W|CxdRiyDU-Jm$-Iy+k=wIpu zaqU^Lc$`4uXdceI71qtpa9aZ_T0~1>NOA<)R1XMW9DzMQjIr$@2E+2ogl@2IS%W^B gtbN=AP4XIk0RxY;jV+3>Hvj+t07*qoM6N<$f-d$A%>V!Z literal 0 HcmV?d00001 diff --git a/img/admin/arrow_up.png b/img/admin/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab1ee7147bd579e23865b127b1ad91ac8679860 GIT binary patch literal 3245 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 literal 0 HcmV?d00001 diff --git a/img/admin/asterisk.gif b/img/admin/asterisk.gif new file mode 100644 index 0000000000000000000000000000000000000000..897dc0a633f63565e65181c5f877dbe21d453458 GIT binary patch literal 612 zcmZ?wbhEHb6krfwc*ekRt&idHfsPmZ(ylLX`Tu6|t%b&)HZlCa*Yf2;`M2XPzdqjm zerM+M<$_-iX#Bbq^YgIctG%KB@AbU8xa#-2GoOwIe0#k6@4cGW>jaNC3I4w~=i3qE zzdzpnx)A+*i_8DpSuZvkKU%8%|90}fce{UG@cDdW=C3m@?{-x z|Gt{~{o$&AFIRm!o%UxR!-w-7x2G`NUE%UuTQTBkrG$#{awM@@S>?yQ{0d?GpTbz2x81wm(;sJ|6V>x|QMo^{5{g zQvQEG_vN7F&&R8No(p)oT=K(a!8hBCzwb4CajfJ2`+I*+D*k`g^Z(h*hjSPnu66l! zqwxFDAO<=D#h)yU>eE*;PY^ol~#fq*;UA#zxz+Sy)(=-@}j_;9-ysUyDgHfxvn46-E@m7|( z9~K^EW0g~9x#DzSNe8D8Q{RdihD!yyW!O6mZUiv4aH(o$2_zkCIK(N@#Px@x$}+jq zeemGH{rmU%`T6tn^Dkb!7#JA1VZ(;Kd-twgyLR&A$^QQSfB*jN>FIg#;zfCR`KeQ< z9zT9uUteEXSm@~Jn4O)yV8Mc;M~}{$HS5ZiE3vV$va+%-U%q_w=+T}%d*;lU&?|Ns9Cg9#}9WC1%z2SkG6gn_-aA)u+brL~2Z(_V$c&dJ$QR>9lV zM7_yZjz>+d3gtIdHNtSOWlm+_Li=q@4 zfwai7D3U19G#_JPiBU6!4vvmg)8EWJ_rKoTrlg=O=)mDD&fz;B=X{^0l*0dnK36jm zi8y+Dd);%*Xn$hR*gUY$kY6u^OYQownS<#stnu8Q)z|-tL1XhkgVQN*&bYF?Z_|b$ z?7CrhsB3%A-fQ?PKx6YjH6*qA^4yqu_W>1JeDG5u316NYIz;Q{qnE4a1lUr}P88b- zu~#va8lrF8=K7UBG2I<|6+^z3MqRl)^vex~hK4Q)A!>yXuq?}ASyn|T6w+GTpU}!B zrOsF^hKiyLG_zZ}=I_@Zb#$gV=kJLKobxGN2q6jz3Mv6qa?X!C91g9ktLyo~5}z{~ zjqWnscI2?f{IXSt4 zG4^1-x_dFNtlpnfvI>Qci3NWB`A#D07#SG>=lrD}4u{{GrkMgTPDGoWPG=uuY`w?h z8O+t92W&IxBi{U6%%tw1sQQ4Bi>pE1_{V{>9+EWFSa z2^TNl4zPaoG_@c*H-mXq$+r3Cps2W|i2~)MRnay+l;*k%`Y$Mt8@e+Jj47S>2F)?EBBM zU^8lvc%$Qfd)tS@XC9W#>VSysjIj(6y>^JHc;VuWOFiBsl$ZuI8~SdK0+5hw6a`Dl zu*fr2^z>9{*>AnjbAHWO)$SI*O^-o|j{wv!+OxTXNDN0X+IFhd{yQ%S;;#Oy4H+dB jl$1ZEnyru$N~z*+t{{CoO+Sk500000NkvXXu0mjfuTp9G literal 0 HcmV?d00001 diff --git a/img/admin/bg.png b/img/admin/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..bef777e269f79f0a8ef174d4f181b81008e2f385 GIT binary patch literal 56884 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ʑ}_7JUU%!+g7w>hWL5*gPDl%uOhQPMlmcypV?s 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 PHRGUWLA0R&1K0l#@1IEJ literal 0 HcmV?d00001 diff --git a/img/admin/bg_pslink.png b/img/admin/bg_pslink.png new file mode 100644 index 0000000000000000000000000000000000000000..432bdb734f6fc3d9356c6ece0217268787ce11cf GIT binary patch literal 24905 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 Hu0mjfRW65L literal 0 HcmV?d00001 diff --git a/img/admin/binoculars.png b/img/admin/binoculars.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9de04548df891a7c87fc945c8c21fb9a05ff05 GIT binary patch literal 826 zcmV-A1I7G_P)M%ilt^{mjf*adRS=fr@ivj?EDu7bH*JS9Q z4T_7~)!F~9b^djFa61A3Fjn>_BD-T|1#3h=Km&LUIH%N_o|k*udG67O%c0z=p>O@A zcSd)Ls`AknUw1Aq71k_)H;x|X?6+Uhbe{J=J%tZ}hEwVd&x^e&X3C1w!1%vKexH~d zw)wSc$Ih=C>D(D25n^jdCM>ChC6$O#42Z!z(%biT zx;?`$BSTbH^K`Z)DCOq(`P?^@mUE1a3=>-+HbNX364sK83;|Gus6ErsGWhxtZY|_k zn$I%u%3%t*d0rbl!g8t1_~;K95hAOg0t$-Y1NZ=ub1vz;Cp$aM#%hV;QXa7eF^1bW zuTfZ-2S5-+Au)X46bK3m z#Ma;%jwru)`})ZDXQ(*a`(RI({J7G>ts4u>&KIavtN5C*tJ8G-$GM6Lu|8D{SU#c{h literal 0 HcmV?d00001 diff --git a/img/admin/calendar.png b/img/admin/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..b98c29f4a30e0392bf244543cd37d02c84a07335 GIT binary patch literal 1011 zcmVk000BJNklbL86o#Lfdwp%kNt_hNCXiMUN)!p&ML|N)6|gG^2?^Hh;ST`n3RPmkf(^d`31~}^ zP}v{^Dk@Ej01=@|q)n3u5+`v!>U`L~zB6-J%=JgwZmO_kq|uqVy7Qj*ymQVOB_hHR zMhGys++x1kX0K&%&S4!G=djjconWl%n-*(?@zIEPUp?*tZmqO<{n^1s@_hcnLXSZs zwg40^z5^m)4LA!);@9mMk~YK%Bnbx}{6Mp1dH~jSWDs~_44m;(ObQZ15`$^OtttSC zv3&s6r2q<6Yaq@uan3Wb9Sc+{0JKv8L_|LQwkrG0L_WK^E+QhI|Fk9|B41qd`wQ3o z{_?E1wR%(D{^S=C5eWej>u@530bKlfgCNvgn%y7_;p>|lTw6QO)yocXj!gI=Pd_<8 zJMj#3Cj!{3?CCMCUxBA4C%L<{#M#qh1nL|w z&Wz%$aC@cBvEeL*Y^E22aULzuitql|1YmJ#8HM8exlIxW&Ixx`>x>LWl!kLy+ZTc{ z#%rMAl~X0c;5}YGS>ne(H+kt~iA%FJ7FKpC79z%qIh+#$O^-oheF&#c3{u^0GF8d5 zxVF#4XvANC*O@3naWJAhlJ`slMW+TsfD@%0AAPyNer!mLB{3Fj9Eo)pn>@4@o;g0` zQ}3wdtU2QNA0WNP-KOK9IWt|C7sTCd+vbu-~*)M#4w(JimI-m&$2N z3s&bkT_&A+EXaL=gWfuwHL-FTTUh zx{q7cr%_7LXf#lGX8DXdoJf)ir4^Km5j!m?4CFazG$|J&l$vI=kU>N^Xc?kV6KM62 z5ERsQ+W<5gO%$-X+s37t*oY08P!nbJ;f~bVD4;YPq0|(mp@^-$HjfQORCn4mT81#t zM4?8+JL@v&2r`@xX(g6IHlPt3av9BjGa;9OFwkT(y36#C2Kgx9_Ub{mn4CzO#e#pc h9vs8@@W1Ja{{jv@dJiQ^jn4o8002ovPDHLkV1k}v(C`2N literal 0 HcmV?d00001 diff --git a/img/admin/cart.gif b/img/admin/cart.gif new file mode 100644 index 0000000000000000000000000000000000000000..be9175d6f9cbd54c6c7346cb43c21edbd97e6cc5 GIT binary patch literal 265 zcmZ?wbhEHb6krfwIKse?mX>z(=+UK1m)^T~ucxPH+qP}*-@mV_s=9XV+RT|VfByVg zQc|*a@7{Im)}1+XrlqCj`Sa&frcC+&|9@6i76TDL@h1x-JA)8|4oEG?P6pPt1uA_h zne&_`DL9@saJ^&FB%m>2?VB2XiH;WKh6WZk_hSnhGECT&+zuRAAjLJoO)pWvaB6F+ zuwsFL$l_yH7hL61=w#-6C}F{x(jMUFrK-fj!r#oxt**w!T_eQCDA>@%&(7V}ro<;y jHA9()okv(XjhBy!eKI#^U$;^-qY4iLL;GeWMFwjCH11XL literal 0 HcmV?d00001 diff --git a/img/admin/catalog_xl.png b/img/admin/catalog_xl.png new file mode 100644 index 0000000000000000000000000000000000000000..58778b34a698adbda6474087a31adbe7804f2232 GIT binary patch literal 1419 zcmbVMZA=?=7(WFkVKQHmg)zf&IhH7f_U`)LlWr?_y{$kQD>dRI8Q1oJ6WXiSV=bL= z1kK2RY%FY+@%9O_MqywG7-6t34Rd@^wh|dS-}iTPeL4cQ=N79!IUDJ3dI7xMD#HN3mKiforTRV zrj)g^jI-+FaW)fz;z~GMp;&0iB^C1bDg?g3DvE>=3)X+lc}xL;Z{g#pM|4a!GM*T6;w+`>z|jT6=9( z9u~E-UcORrfcq#(i-AGz_7;*1fj7iyfdiMqR8YL5(#5((Gi5-)7rB#j5|~Pd;kZ_X zX%(18hvP;aX4287EK;vm>S;_ByNcH&|oW*Y6$*pTDY}X(?)9ULLs&ooMJEvDF-G zdltz!aw6dxGFCYCEP2vAB|V7zjP(#Op~uzvmD>{yes+O_uP?! z7vnFD^z0<{%hfh~Ot679EE-k+I?FYlD z_s;b`8GI+T>y9&|Y#F^%^`xi%#>K$!-S|UL@3j3Gx2Wcor literal 0 HcmV?d00001 diff --git a/img/admin/center_btn_filter.png b/img/admin/center_btn_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..f7009ad52d6e4ddf0414425f35a4612571bf641b GIT binary patch literal 267 zcmV+m0rdWfP)MiP{SPx=i{eiu7D-I0$37iG9X+DCtT zZbE$Ay(J;EQY7)%ZDSI<^Dh3C2!=>p31lTmB4s7Wl_OW0z9>sx6i$v-j>l<|#)q;Z zVWik`AMe+YB(ZL)*y?eQFQ=^5^SEQNjICw@HBF)D@2o_9dUF)f|D}s0egVS&jTb!= RiBtdp002ovPDHLkV1fdsYQ+Em literal 0 HcmV?d00001 diff --git a/img/admin/charged_ko.gif b/img/admin/charged_ko.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ed560ec4c62ec88bd5ab52dcaaefa01a7ba1a72 GIT binary patch literal 1006 zcmZ?wbhEHb6krfw_|57kQOzS zvu4eiI}ZrvFIc!>!Ggt$7cW_|WW|aVD_5>uwQAMs)vMR6S+jQS+6@~vY}~kU)22S(0lGCLKL-h1YLJO{b&4F>!gWWl e5R<-lgn&{DhmeX}hsIl{1?*gG$^W@I7_0$EhzKqK literal 0 HcmV?d00001 diff --git a/img/admin/charged_ok.gif b/img/admin/charged_ok.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2d449b1d22017cb14be124184f2ced10afb1345 GIT binary patch literal 997 zcmZ?wbhEHb6krfwXlG#XEm|H{y&UKoX zi<08M+K*b>+S}UNL7)QyIy*W$yMUm(ySt~Sx3{;aw+{&V`}-$?z@&+jCQY6^dCHV2 zQ>RXyK7IPknX_ijnl)$cyt#Ad0m1wQ3l}U{uz2y}B}C&akmoHzxe*MOc8@F!Vx_$fhojZ5#-@pIh!GnhnA3l2Y=<(ynPoF-0_Uzg7=g(if zc=7V(%h#`8|Ni~^&!0d4|Nmzg1tT>C6o0ZXGcfQn=zszMlqVQC4lzh`$arjc;2^CR zb)Z90nXN}mJLG}Fk3(HYyCp&eViH*!j`z#0opU2YwV{ELl~2J#;D8rbla`l|!2+Yk zrfC`pVTMjF924a2s@@cM8nlW^N_A~m!O(J$NlTf1)`m+doRgGY+ITpVma;esg=G{Z zC?zusiA${LQII&~C8FUs%OG$POXpMp7VC(ej7(m={Jv=g3m!E-VAT#@=26N0^rW!1 nB!}07h0gAMr)N|~D4a+<#LOY6;WI(tVI#93Td+6}2ZJ>Ly?OaE literal 0 HcmV?d00001 diff --git a/img/admin/close-white.png b/img/admin/close-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b23fdb88e3641acff0211edb353863d84dd507df GIT binary patch literal 3286 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 yK0ClME literal 0 HcmV?d00001 diff --git a/img/admin/cms.gif b/img/admin/cms.gif new file mode 100644 index 0000000000000000000000000000000000000000..176c99a23f6d8391aa7f0629805dde422eeefaa1 GIT binary patch literal 1026 zcmZ?wbhEHb6krfw_|5Zb7=dSLpv@U*>>f`uIC53 z-(73`d3?&xlM^3bTKoRenkSbxe!INx!=)`BA8q{bc-POzn~onpe(KnfGsg~`J$~@? z>CUSu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/img/admin/color.png b/img/admin/color.png new file mode 100644 index 0000000000000000000000000000000000000000..35eefe489b9f1931a15e3612aa88984232b6baa0 GIT binary patch literal 839 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 Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/img/admin/commercial.gif b/img/admin/commercial.gif new file mode 100644 index 0000000000000000000000000000000000000000..716701beed3f32f53a9e958101d5c3302c6c502d GIT binary patch literal 1017 zcmZ?wbhEHb6krfw_|5!8sYuAah+~~GyFnl2S&{g zi&+p6yD&1L%RQ~nzj#Jm;^Nrsg>h-i5>wYCY5!DwL2^8cUIN!s%}`E-?%!leP=@Zu7vJgNxi#LdiJFD z?@909oz<|rx^Z`H%ij9t19dG2>RJ!hw{CB0-qFyyuc3W^)5Nt6Q#Q0r-_+iEu%Z26 zQ~RN&&I2u72V1)iwRRtB>p9%scci2LXxF4;J(G_2PCn5$^yd7H zmnUqxG7qoLja0!jk2;7OuOrdd00pD{n7eb!YMVJF7NcUAN)x zsttEnZ@jm9)4esD@2}l*fBo)z+qXT~u{B-_HLhpjRJ~-n&k^x zGAs%@M69!3$Xs+V^q69mwXI}=^Ajc~1;1AuFDE|r61Ol^5jb;k3EzCX)QmkX7aJDv zsFk#QsoeDZxU?{@496K^XHHoY(^GGDeq6@FY^!|iPxC~VzM0x#X+H{_lbl#MIC=gg zD>r+|@P+Q!BALkODq*89Fz1HUqLb3PxlSP!4_JHVi|Miav2JcVPmM59*T*EB5*JyCN)Kk#>As1Njz}zV&c&&;b7X6m!=-P z2wV_NNl74t#KenB8(T^=AYefPwY%MQmwxlk%B9eOV5fMZL=NuyPt@$s4rKP2!_kOliDt$OOI7B7_F`@vfl*=U+7S5ACD|vBo zamsr?Tdh|23=a?U`>nfp?}<@~8X+nnMzSm;U0q$xLI?vP1ibe=mg&8x(P%s^nT?GG zF-9ieI*N0SG=wlvtGz_Cxe0)xsDi4Zy?_W*%0<3E_Z{Q=UL(Yas`eC!2+igupU>6- zgE3%w7p9MPtHsGr4&a>QYW*id2)y{t`#lBTdlbbOL%FgGYc0lFY#+v2+N~BEB74J+ zjE-8?!x-A{ffW&=f-#mPNuGf1zX04h$HYX1mnV<&LSc#Upx#p;{qY!UNYZrscVjKq z7>u!*o6kmCl z&|P6iwZ>LhWA_{5Om1H35!im6?N*B$zy5nK_Erl>;}$kq$Jh=7g>~5K(z(CYBgo}a zP8@rc5F;XB!?nan4op z`TXcExyBI7y8Gw{M%@KWXtO-uC6{$bj3GVv8Tap8XyfM zZ|{Bc@q2Ff^4%BS%-MWx_rVKirbetxS8bWrf9b^fKMxKcneK7z$%*G2ZaDj~ zYsK}b)|1zFmbNEo{X9N-Z>RVFPY=HT{PXU{hCOYrf4?1kzPD^;hm&u|;U{mtE?GGH z{M_`fPdB)h9=v|#LVV4t8&f@>@9)}n{m0e_CooMnZXPc z1I3>#jO+}S3_2i_KykvrzO%uyskx=KtW>_;vIJHH8A)04ps6!A|k75 zXP05%X>?ZRg0EI08ztW5Q{;}9@oLSqLXKbJs2g2I7@W-i?-iwhqTk93Ns#?_4Oe;pVT6ySOten-xUgWB^|R04u-7oax_VqP>>tFRFSEDf%iqd UxORD&0G5U=36AW-OiT>c0Gtq)7XSbN literal 0 HcmV?d00001 diff --git a/img/admin/coupon.gif b/img/admin/coupon.gif new file mode 100644 index 0000000000000000000000000000000000000000..f61d4f7bdab8288fd16b0c267ac486bbac973683 GIT binary patch literal 248 zcmZ?wbhEHb6krfwIKsfNe*OBVPoK7){k!ww-!o^2>({TpfB*j4o8L!{9GQLXf6tlkTeohVdgVV5bf5pf_uhX7+(7Xs3nM#&2!jqt z3CKpT?es7y z=k-cdoZ+)fq)qgy0*gkU9t%^N$E@DtmbQ`MY!A&N`@+JNSo6YpIg6P@x!9U?TZ)An cs|Hq)$ literal 0 HcmV?d00001 diff --git a/img/admin/customer_xl.png b/img/admin/customer_xl.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc1ba4e29331e1908998fa720097239c84ce495 GIT binary patch literal 1583 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA){ffi_eM3D1{oGuTzrd=COM+4n&cLd=IHa;5RX-@T zIKQ+g85kdF$}r8qu)}W=NFmTQR{lkqz(`5Vami0E%}vcK@pQ3O0?O#6WTsddm{=GX z8k(CJm>U_GSr{5RS{S%mxVbtxTUr`hx*3?j%)qAC%-Pk=#Ms!v)xgEs(9p%r(Z$Ua zsLj>I(#gWn*w_iC*E6rUBrz{J6=rWH&|ausbG&-3oQqNuOY)0C^7C_GDIg#tza+mn zBfmhwIoMReH!(Rg55xyW55%`FsYRJ(sVQzn`MC<<@U_asV!x%Ev6HKXg_)5B#NU=? z&SuUQjt0)AZWeBCF0M*Yy(#2`nLf}l`k=&tlvrRwz!V5#!jnFb1J69EdB7Y~1k4)2 z|7RWnW~+n%pAgr#Z{P0NvE$I8Lkkx!ym#;3r%#{e&6_uC)~pvVUR=0v;q&Lu4<0;t z_3G8>)2ELeJGO4!x(ypPT)upH%a$#>cke!V^5oK`OP@S>GI{dk6)RRupFaKe?c3Y7 zZTs@&%hs)1SFT(MG|eTya4*m#Ar-gQT)y4+Sb>Kv zfupfyPL2nM3Cs7t_lsmMm4zE?zdiedtJD9(ZKjWZ{5#`WtoLv)uWwQ=E4NLm&t3CK zI-^-%Zlef~sLe0=1>)9bPP@5EeiSy%{Nfjxy;_1J^VApFoHEaZw^fZRxxdTSGo~(b ze6`4H&tlHWKiGsOh&nL^{m+s9w9+!~!h@^74}M>KIqKJ;1(gnse)kk?gjQM@H$2N& z*kt+hP3BIKWoY3Prkp*$k&X+-~>bHss$~jXL-(; zyisXCs1;bS&G%!2sE5&9E}lCtgx(}4yTqL@{wDdfmMJINnP=CHz^;odfqy>lJRn_R zao(_y&EvLRRg+4JgTkMNFKZNca+~vP5)sM{YMbS@Zykrt3a*5g)nCLJTq@_ilMR|V z;T5Oau>i)j^RxNhX>X8~ZRc@+&9we`0OQ(ESC=g>me}cQ%4@s!@Btgsy$-o3qh_by$!w70kS{rmS-RaIxsoJmVd`~Uy{)~#Eo zOqufR*|VcZkADCD{o1u_fq{W**RCxtE}l7aW@~G!r>AFlczAYpHUkcz_>+Z^oq>}< z2P6-&lYw*^fRH%#4wFb0FB>f=7j|)TPp&pM{BsjZs*H zQII3ukH0a4m%D&PfTxy~)s2gZOGHGFN!W;$mw7ca+p<7mCNUc~R$&2lZZ=*~Ax9fA J23-HPoF=3{_^F^*RNl{ef#$P`}ZF|e*FCT z^VhFmzkmP!^XJdszkmPz`}hCBtk z1+$rHm&JNa%W~>FjxZs2;X|n literal 0 HcmV?d00001 diff --git a/img/admin/date.png b/img/admin/date.png new file mode 100644 index 0000000000000000000000000000000000000000..62df31c9366c8ee7bf7cab7c579e31edd7e8baf7 GIT binary patch literal 622 zcmV-!0+IcRP)`FCspBaR&gRzcP<|32mwU(YIn!(Hs3o4|=A0pk5vKoy(?abQez zFPFfSp=7`qe%~0z7*|^*u;qio-V}(9LhYtV2}}uW89pxoV63Zn;GApG>l;QNj;yGvYTw&sRaJfbE~=l5MfKo#l=H<6y>xF%RW%|o zP7qbX0Q$#P2?C#i@m0bAo=vVYx^kO0gMx}sGu^|{>@LbCBJj6bP#_FEx=*DEeYnt> zrpAZ!9cg?opta>Nz8`SzWF{J|m5K+(2`Ui!@M1d8WZ^CoLyD>rzQ2y|d(6$}2>gJj z6DwpBK1#KK6;zd)0J_>!j19q|0|)t*o2RQiMd00}v$Yv<%FIHMJ&m=*Yr{$lRwA{) z_jvW80Ki->hlj`T#{xz`M44SI($o+m*;uzdxe&lw8+qWv*<(q<;2LMzlDz&@;B;G( zf$=nF}{2+l1)IOAx65XJ|Yb~ zL{zFil8*L1nmJK+5;xXitixHsIKevm&s|vi_2)T&x6^h03nM~WjXfRfZ~y=R07*qo IM6N<$f=FW*$p8QV literal 0 HcmV?d00001 diff --git a/img/admin/delete.gif b/img/admin/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..20874bb3814eafc0ca3eeba507a18642cbf0f856 GIT binary patch literal 992 zcmV<610VcHNk%w1VGsZi0Ow}_000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^s6Va%Ew3Wn>_CX>@2HM@dak03rDV0SW;B04x9i000mG5C8xOr~v;7 z97wRB!GEk+&9Ze%*D6&9T@`yaY7{D1&x)}!*oxb?QQyAZ`o?Wz!BFnnnF|-rTswE6 z3??$=3|+l?=$x4%WYCeUN`m(28Ptf>AerDoYWrr)lr2978=d=h?AtVGl4|9VIkoDv zX^m*nF=(h9Rjbnw#d>2A$L}@A3J?n>TMxPEI~@ z8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=Wdqvq=*EHO-5 zX_~Xnxok^Wc#BijA=ic@p6w@mdQS&TJ{LUmLiOgm{VJl9)FkGana#AcT&t@)-zt7> zsacDA!D46U#f}Nv>Rf)Zu>EIX_{+}zkAvfRfYH+slP5Vo&kIBTB_#aI$oOAhzq{FM ze|x~;?$8tc(Pt(n9-m))VS4(N**O=MW?f!Ua&>Ll?G<&`H&)Nu{czF#M;nem+?Q8{&UKBOjyv>#KFEw zB9MulSIRi)K*hsFt{js8#ispmPd+K6>N!clGUU~Ts?lvqq>7X{vmb>Isllnm+Wv|(CbF01{Xkf4g0LAm(DgXcg literal 0 HcmV?d00001 diff --git a/img/admin/details.gif b/img/admin/details.gif new file mode 100644 index 0000000000000000000000000000000000000000..95eaaa9a3803cfdad82f16928d8195f2f3afd937 GIT binary patch literal 954 zcmZ?wbhEHb6krfwXlG#fr|@t`yZ_Ek|2=&X$EPKonVUUr(bj#dCePe@bMBr8tB>AV zeBjCQgAbM+e!A-Dv#nYZy>$&gSFTCD!8q`RUv5j^6uv^6sZo55Apy{NviwueYCnz5nLNvuDrVzkmPk^N;V}zyJULpJ5b? zhQL6FfZ|UUW{?|nKm;gHFmOy~U}QMqupz;bmq|FyqH)neXAyM+g%FO9Ek}h^Jr*b^ zPF!@fUqZV~CgS7cP9c6{jx!%NC>`t32$_^qX}H8^ny$Hq$At$6J7?=EdI%UEYG&bZ zkhkLaxX`&>fM=4GkHMjrECSq1%yI;hn!*J*wk*2wfU)H!2b;#4oXn*O?js literal 0 HcmV?d00001 diff --git a/img/admin/disabled.gif b/img/admin/disabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b47cbe5eddb96a353550822667fba6a19218ada GIT binary patch literal 960 zcmb`GT}V@57{~wTxVbYmIr%2JooQ3V5?rjLuriq|bDB`%M`ep#X&;!m{0PB}ZRQt? zT8ENB2CJ*+BD^pf)Wr-d35(H%P*_OC=nLy2Y>Mmc-O6t2vX|$a^S;mX{GP9uQ(Cs8 zV3SRRh<@N*c24;A$b7@mxw4&+H*aZ2=faDZpYk`%?c2Zb^cn4Td?~SnA3mflt>FXp z->Yk93ybLNY$(qVwjKU{{=(v`*R-jbc6HOLT6(JOYiaq9P>9wYSiI~1kiU^0IWk+k zEiyIrtzsAL8(e5=o~z#TajlU$dqcUobaIl`?8X0BvLaPhWDwmM9@#{D4B&~z6q&&# z5kw=h3`8??=>uei$vXwvlq;Kb;02PdC%W(wI~imBG1jxh)<;>b@n5W+q+5t)+6~A& z4^+BS{cP|4EE3HqkVd3%l;QNj<@eVW!xK;7A*0{!vW^pg2J!Hn-($W}3cWRD*=__>v22J)+;3fjD+v zWko<>UlsHDEhd1;pQU19#NG*H&MO!&guJLF`cFW(27_8>8L1yz7O!p>Do0G*xj1!& zXmSPue8P$bhb6!bCMNSqlXlyhe@h5VDE}3hMP)F7>i-+Z3mlYpPjnl+PaE8CFh=;op*lL z%g-;S9GTpGq;1oUHA^nc={?@H=kE5k*OoUQsGWMczjSx;)YFqrK0e-dxar!nb4$-H zs@qq2^#0+UH+Q`L`fBO5rNw)*@4dhF|Nnmm+5p9$ER5_7N(?$6<3WC6U~6`mSTG|{ zL+S96PY(+urUW!C%Dkwv!0DXxp{X_+{A(PA7DTXdF{@ZDt#Fyw|8(t_9??c_S?x_4 zc5EWNyfQU%%)HDZnJqO=l2XDVBEkW3V(iYG5^Nk^+`J;p66`Y40s^e1yaH@uyb>#< fIU{7HdD+;6IhgvCq?wsT_c^gMFz^I8GFSru9^G*O literal 0 HcmV?d00001 diff --git a/img/admin/down-white.gif b/img/admin/down-white.gif new file mode 100755 index 0000000000000000000000000000000000000000..b969607d301a460e54a614fcbf70961a3eb293e3 GIT binary patch literal 75 zcmZ?wbhEHbu$1B2o}LFb~>#FEq$h4Rdj31pDc`A42%pq dKm|a>oD2+1ygmJu2kt(c*XbG7TCBlf4FC*l6x9F# literal 0 HcmV?d00001 diff --git a/img/admin/down.gif b/img/admin/down.gif new file mode 100644 index 0000000000000000000000000000000000000000..f806d853498198d5e9d06f7f7e89fd794892d46a GIT binary patch literal 63 zcmZ?wbhEHbh0}nGW-}}rtXE-tdGT|B$Pzh+dFf1@Y83|ccpyD_#RVtM# z<#HMA5Z=S>cDtG-l0ZY@TrLNeWox9y@V>Ec_b2v-Uam%YKLY*qP_$K&-3D3NJ8{2pelAA*Rg$Xf;q4Z)2*(% zfI<>ffhB0f&CeCCzZmGf^SuiwOsx7B;rl!T^X`Jtr^l#vWTU6Q;CMQQ*}n{X(2Dan zCtR-%>;MJPw4_vI89MZIKXaE2J M07*qoM6N<$g6g}*^Z)<= literal 0 HcmV?d00001 diff --git a/img/admin/duplicate.gif b/img/admin/duplicate.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec5dc73f456a109fd87fc968c35a05bf047035b0 GIT binary patch literal 1004 zcmd5*i%XMH6hHgEPn!>F@hPdF+RUP&f-EC7qq$@)hz!#b8MZYowbHRoSxw5hEw!!3 zzH*6=TB#J1q;iw3X}%^JO`PGA7MY|e*~5Y;G1kSuqQkw1!#U^oJHLCm_t0TpT)c<{ zEGP#^)W)_>Hdfjd<6qwtSTeF|(`&koUa!|NYFFCDnnA_DyWYA9gSJib>H7@-M$%bx z>RneQ{qnMTq_)J7Q`mL7Y2bdxv~_ZRIHj6X>XO?=T8f&_7+sn(4>LWB6WUiwSzG4k zpL2@#3%VCY?H{d;Z)>VL%dWfBN%}p5Q~gatRb`e7sZ~c_cv>VKS>pR?(_cOqN3Ug@ z(=2ZvwY+b-*q8t9*Mf7d^Yv_x^pL#xHD?~wB@{bO8Jt&){Tlt4M&G9t z)}M5G>{CBHW8cOqhf4HT*@^mO*^_hd|C$Ae1po&4Ac>pN{_By_L@-T6f^Ih%T1Q6k z$#9Qh9>@p@0Fw+~pt;z(8YUU$qzO*-7|`5)ntO8v2vEuZzyS7>VcA>|prk)AX^sG} zFci}aCGsmg(hz`CP#}O9IY|F{0I?yUj-db$B|tL5vLRgpDFu*o9Cj2zp%|ppYFiEz z%RpKPc?e5V+jWQ&L*sDWst^=!IN>HKLV!vUd?c90nCKy)1~ivuIKp^rfIuVw8A)Xz zPeV1us35~P(h#K!VA8OkV%%C;cPPK7NDL}bem2xu8d8Tmg&iX!k>`_?8(=NEv(T$< zltHKD9X`Yo#m@pun+T1Qt>X&2rQl6^ZI;*AJ?ij^?aBeg;6z=oq)p48`EEX&ROz~F zzWmZrQXBP$zyW^4cEo~y1Pfj9D_Hak=RXy8Q@o?G!YHAdss6o_pJ5PlRjnmLA$a8hr4^#xQeF<6tZ!r3im%h;eO^U>mn2KO%OBv zXbqc_O>Et8t519HKx-tMBkEC`W9eM?((TWh^_Wj`g|MMV|D0gT=Z3jczRZLz?SSn~ zE)DV}u1$5ReMfA>@{)ojHu;C_%axlr4-Ue5UpF8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE;UJt{NMlp0n155K~y+Tos#WK6j2n$=U+6XL_(7!1cgl(g&ifZSPdi*i6qew z6=g_86A|+TwevwqluDt}^;4kulDaQ5vwLTKdhQj)`8Iaoff>%Zzd8KwSS1b4gE!Nu zMSFB#?2+G+82TwqA9f@@@Ld}Fw&nTzEs4GRD)nzS#O{+tJ#XEuW z76P=4?aO`gtaC*|0DELl07TByj-@alG5pIM_EjKbb3anuGY0{EfIdJUpbyXo=mYct z`T%`^KC<*tXK85~PzVBPpGbi&B8NVTR`cMl0jOe8yTE-yAF$&6-wYtQy5cqN@iBVQ z2dr4{rU4Wg`Y@;I172Ps>nU91@;J+QI6ilAc#^}P;|vZC(`N2T@-wXZp7q-s(9(3# z2l9ltg=@&AtME7L<0MVcg@>b4*UVM6&B3C{m$hAAq~`Uq(1&Tz2MSD{pq$>sSI7{Q z&MBN{3OG&sX72HeS%m%x`Y;XpFu4Kw8m1IHZe+G1P*=G<6$a3UY0$?lL~n989=CD{ z(^b|q9tO~dX+*7(MkfrQ4~ITLAE-_)pz75;Dq26Gyk#1X5|en?Ji)JiL}}asXLX#A cga3K?2cBfbq!Xd*a{vGU07*qoM6N<$g1ZL+VgLXD literal 0 HcmV?d00001 diff --git a/img/admin/edit.gif b/img/admin/edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..7934bbc8c96f3ad800a3ce2246698a1a137824ce GIT binary patch literal 973 zcmdT@?MstU6hF_l+%S{rlQ_32Iy6kCD1FgN7*D>;3L02CL&#~0EmJXEN`06zayG;H zl&CNwOE4qfFeRyB&Xq0qVcL8{Wu}{Rq;o1d#BAN!U(w~>bI<*8&hPy0<=pg)w8SI{ z6PQp3kV6D-ZEfjvI{Sodt|MFDB3z&EG#ZT_kEcsXOb#_3?T;+VzG}r znH{cF6vY~}y{^?^x7$6}mTA|@oGWI}&hoZn*=c?>(OJ6KBD5N=8x#WPT%WO7y!XqZ ztqwUDfA)KM%x%eE=u^zA~uTg0nlePfHq+xm~){c6r}v-Cw%vUK`vrJ%ImpygwF>!3ng7 zqjj`cOwxi#S{SI#;UOA4RETpIn;d|LmIE+w?gmLvf}20!Y&}U6w9WuYjFUv;aUy^m z1E2sT;_TZ5eTu~v&?n6Zx+(EfGhp$4M6jY9?qO*|C%QE2{8ZTFjG$X+zg@L*V z1(4W768jkV2Nn18>OdMeVq{5ZLi1NWF+8tKIdf%y{fp8ylfGQl(RI* zdXX?ddT@>jAOJ83d2B)mx@B5MI#ZIg223IcP(Rysx{f)Sutjg|ocDN)gtF_Xame8q zjgoewE*`O4Du-tcu|=z{-iQMl72pu~hz0!!CVJwx;7(2y^yQ7x4+GC!6k#=Eb&ME> z;EhY5_hnIOdGckS8az(0F`(?Xemxyr@~tW$-};3N@-s0gKU3?&;v%wM_DL``D>09+ zQ0CRC+5X%TQG#TBj6+q&>`ku7GiiJtKVCuz>8BX))>4`-)zIlgmGX1+46l|J!f%L< sf1PR=@{dx7Z?|JUtyKYF>aV4Wl{NK&_ZCFkW4`%xw&p5RB7h5j0nBhelmGw# literal 0 HcmV?d00001 diff --git a/img/admin/edit_2.gif b/img/admin/edit_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d62aac1a9fadea5bbbb7933105f26db7a2a6de1 GIT binary patch literal 1201 zcmZ?wbhEHb6krfwXkcXU@bF+@U{L(e9pM|G;F4I92&8T7D+&^mvr|hHl2X$%^K6yg z@7}MZkeOnu6mIHk;9KCFnvv;IRg@ZBB zbrg&Y3=Q-RjPwnSbPdg|jE$@e3>2V1320kUN}5%WiyPD~AkS7Qqokz3N?*Ucyj-u` zSTDaQUEk2s(h_8bk&!M?g>G?WUP)qwZeFo6%mkOz;^d;tf|AVqJOz-6iAnjTCALaH zmqNUdTj1*pH#o0Y59}emIIAz^b}9q_QAYKPa_0 zzqBYh6{uVprWqJ^_$>k{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e|N03j;$# za}xt|BLg!FLqkUk16K<-S0`snOJhqn0~44T*z}s4yEt387`r&T8oC-9y0}?b7&$sR zngV%7#)gJQW-z^;dBr7(dC93TdozLdLiIZ1)obNkl$uzQUlfv`p94z)0U7xv`NbLe z1q#l=rV74^$(eZ|J}7!1zI910$}CGwaVyHtRRD*tRVEhufu2S2x23a-tCO*-sj;ht zxsjQpsS;Fg3OQk>4|I$^C~+Vq7MKt)1%jCHqz~l4Gf!$BFvk=Dvj*e;e}Dh{{`K?6 z_itaneE#(D!~1t{-@JbH^2PIKPoF$~^zgy`dw1{LzIF4)^=ntJT)uSi!ufM&&zwGW z^2G6DM~@snbnw9beS7!p-nDbb_HA3YY~HkS!}@h=*Q{Q(a>epxOP4HOv~a=vd2{E? zo;7pE^l4M4OrA7xLVsUxPj^>mM|)dqOLJ3WLw#LsO?6deMR{3iNpVqOL4ICtPIgvi zMtWLmN^(+SLVR3oOmtLaM0i+eNN`YKfWM!wkGGenhr64ri?frXgT0-tjkT4fg}Irj ziLntdTk7fRXlrR|sH>@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% z%a@-lK$4L`2Uyks%N+p*2PTc4{>}*x?%fJLb0%PV$h5;fvS(Cn)iUO;*ybS8zVP+Q QWlK8RjrSb#WMr@g0Bo0}l>h($ literal 0 HcmV?d00001 diff --git a/img/admin/email.gif b/img/admin/email.gif new file mode 100644 index 0000000000000000000000000000000000000000..94ba79d858a2395433b01146ec15c269dc9d3ac3 GIT binary patch literal 582 zcmZ?wbhEHb6krfwc*ekBo3mxx^*?RP@4Wf=eZ`Siv7OuQKK~xpyfwDx)TYy~u08oV zb<5+gKmR+`9Q3a_a_-jaXYYRIPrWdI-^;_df5g|UaxFdh^Ur_Zj>Grg{QLO*-<-|Y zp1l9(UAV4g?Y)Su6MOG{Uv>0t^_Capv<5Hay}?d7}ys#C^t2? zw6?XkNEzB28*}u_$(fp}n>vX&ib;yinLAICnN?Aen@v(>g^IK^51Xu!hM<_$Qb~!` zYXo$ZbTy2{w70PF=;?{=vS!??c|co%NnnluleLY_UcLjWoEA&jxGgM%&Gw3laha%U z>kA3#Yu^@T)-d4F;*$8ea>Z={4H;d96p0fH7C5po%gtE8z;LXWjn{9^4u^@0`k6%p NGVh!yOjcm91^^RL!pr~w literal 0 HcmV?d00001 diff --git a/img/admin/email_edit.gif b/img/admin/email_edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e0b0e373c7d21176e9d0a72509af5711c9e5ad3 GIT binary patch literal 604 zcmZ?wbhEHb6krfwc*ejG;VAy~e$?Jd$^5Ao4&M6VRCDm+wtm~3E$42%esVHo>XyfM zZ|{Bc@q2Ff^4%BS%-MWx_rVKirbetxS8bWrf9b^fKMxKcneK7z$%*G2ZaDj~ zYsK}b)|1zFmbNEo{X9N-Z>RVFPY=HT{PXU{hCOYrf4?1kzPD^;hm&u|;U{mtE?GGH z{M_`fPdB)h9=v|#LVV4t8&f@>@9)}n{m0e_CooMnZXPc z1I3>#jO+}S3_2i_KykvrzO%uyskx=KtW>_;vIJHH8A)04ps6!A|k75 zXP05%X>?ZRg0EI08za%#$qHXQCe(t)0@4SQf%$)YmrS{OL z=*6Gz&8O*A_f#kP}_Ry&9 z$)oPdruWpZV_sQyJ`8g{42nq)fkh68Ne^>A4sbsaVKxt2H4(>jDav;$UpW<;VlG)Z z9K(}mk4X=9JPc_$5>PM{eLf9(KNG%iH+@YgwUc<7SuC}8OL# zXkAv)Z%Y5#*8W{k{9RD~VpjiYUH@)l{%~afab^E91vGAJ;PeoH_xGB!6jLzqoSD?d3rJ|dVU zAT1mzDjz18NiH56EFK*_m zZ*OdAXJTGjb!c-Df+G}QWo2VvU0GIgR~9;gBo|X_VZLy|LT3w_I~aBh3PHt=nTHSs Y5I9kx&;$ep1{gTdKmw+Zg8~5nJGu`CuK)l5 literal 0 HcmV?d00001 diff --git a/img/admin/employees_xl.png b/img/admin/employees_xl.png new file mode 100644 index 0000000000000000000000000000000000000000..d9215fbd63820231748902eef8c3c407220d69a7 GIT binary patch literal 1373 zcmbVLZ%i9y7(WDwF4=T3B%6GBbBq|1(Yx#Q&-J8(a@QM8R%lAY(2>ZsJ?MpAue&>F zA;jo#37QNw5-|}ovrWW`4T!LfMe2}jtB7M_fdki^`fsvt8t&81F~e`b&Me{MIjqOic8{AKF}y=z%Mk25j*#~jR9K_Ejb2?<1{oN2^tULQaGa0aXY$cmxgQo z7(>A(L~FF8TTa!uJ%EuF0hkSVQ2@8#z(N=Z(qy$-j{+l3;23Vi2xAdprAZ@=<6wKB zP)!Ne(_WU_)`B}b8q%~VjbX7^%n&0DveJMNHk(biVKf#&M3LGO(fD{#L@mfzUhQ@UI)YqE%l@ zRKUD~DmN(s_#X8I88Xb>-aTR(!G?&QyRWBx|x7lB0mBG6Ods5F`3tf1a&qSwRt- zg&?QM64=ZyE$*UkRSLqm&;ix)0j7#|-W z9UYyTn(FH6T3TA_@9$5i(}_f)ySqD?OwP{E&dkhAPfrgF45U)2v9Yn`<>kJkiy~k^}8O;;kE(=g-b1zRJD!d+I~^Tz32YzYFi*EIohfUem#l$NS=^$8P1ne>QPW z?X50vf980{^Ul(wYr68SH4=md7GA16C`MbeO5XiwE^DFu_R3>^D))|dlROeUa_F1p z?|zzQzAp&Zjpa4JcJ=XzAHMjl@G??e8@qe{YjYvKlDE>Cb96;~G%=C=*Hbr=?^TCC zc{Tm*X#OvydHuhRJLVtGxoZ<1sq|u7abfD@>}OZ}pI^Fj*i;SLy2z~O!nYRu;GHZr z4X*e)PQCEuSWepq*RQ^OZ~f8R*B^k?pDi0XhmeX6srW!))@hgk#O17DlVx>h{sEHG B58VI& literal 0 HcmV?d00001 diff --git a/img/admin/enabled-2.gif b/img/admin/enabled-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..085b57b298d0b6a2f63a3adad63a9454b16cfbe9 GIT binary patch literal 1427 zcmZ?wbhEHb6krfwxT?<(Q^hy&7(-%%XiPP4LL*OdlW6ZjhUhB3)tAE(>IHlDGj!}? zNNyBOY!I$rq@UH#0#uyQE|WivvF8B8#N!NcwL^nUk#C56lsTcvPQUjyF)=hTc$ zkE){7;3~h6MhI|Z8xtBTx$+|-gpg^Jvqyke^gTcyO5{G?PXAR8pCucQE0 zQj%?}|N*N_31y=g{<>lpi<;HsXMd|v6mX?+vGmMOMfhu&1 zEAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5FD#PU%0_}#d=^5=_Tjq z>Q^Kd=o{)8=;!8w`~_BBToROua0XV@#UYgisro^w#rdU0$*Dl)$}r8qu)}W=NFmTQ zR{lkqz(`5Vami0E%}vcK@pQ3O0?O#6WTsddm{=GX8k(CJm>U_GSr{5RS{S%mxVbtx zTUr`hx*3?j%)qAC+}y>;%-G1%+11e1(9p%r!otYW(a{vhGcq?$S+WE4mMTrO-#=Gku_A^g)RO zDY3wWfGH5fgeQF<2cCIS^ME;~2$(e(|Nr~@=l8FlKfZta`sMSdk00K@d;8|~tCugH zKYRM*@uPti4*$!dV9LN zIy>6iT3ec%8XM~CYHO;iDl5v%N=u513Jdb{a&xk?GBeWCQd5$X5)DCA|t}X zLPLUs0t5X0e0{vVJU!gqTwR=<93AZKY;CNqEG^80(Xw{{#uj)G1RgG_OpBZD;njn?1E literal 0 HcmV?d00001 diff --git a/img/admin/enabled.gif b/img/admin/enabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f3c6e5710a06dae05ed4ee55636ad7507d2976e GIT binary patch literal 321 zcmZ?wbhEHb6krfwxXQp_Sz}y#qIk~n8SzWQwqDy9Fw^74+p9TSlDf{<*)*9gIy}E* zPj>R^sFo9z5%UAwdhHKA+ShZwA!A+Kyc07UPnETvsa|nziG7Pj^s=Ce{W+QISvL_5c6>3^W6ZKUo;r859|GKsJE<#K0DJU_yb1j#R(LlVg)q z{P={@K1*iuh>$Z0P7|I+#dkwB>?;9=iwp%-83EIA^`3v0NgYk{5k;5902qx z0OKP7|11FAApq_t0M{M>-5>zkGaUQr>F_B4^C|$_9{}Ye0Q~Fg{kyl}DFE(JJNn4S z?kE8J=H}|MvFNI(?X$7!C;-($GU#<|`PtavhJxoL0QkGO{NmyENF>@H0PU=)`rX~& zVOag|@b*nE(mE^Sl8^oH@cYot+I@)diq5f^kGo^I|BLL-TC3++Aa_1bZpr$ z7T`N2{My;p9stoD0NF7Z>!_yn%gXmG0Qbwu`z!$afOY010Mj=m>Lmd0Cjk5F?Cv-Q z{V)LNdUE*I*6t_(`{d-+9svB`-TN#6&>aB$?(Y9nJohO8;4~T9DFgFME$}A*?>!dQ z9sum9rs;lm{VxFYy14zQqWMWA+aLhjBLMi&&fZl??L{ooLN)wC8~wGh`iz6mFiz5hrk@sy7Du&v=N0Ms4;>MH>IR#r}7SA>LbA)}m}9Cvmk zH;`g1sD?|Jit;itGPYG}D*`EA(PEf{M!N(P5V$9XrGRLOSRaUls+Ks1goFf#i*Z&e zm?0kQ43@A=sF4MMOhLg+FvG}8w-G3zR_eyX00R7ylKfx>kGF+7P(t3U8v|I`l93ny Xjfn9YSex>Y00000NkvXXu0mjfVCQ7T literal 0 HcmV?d00001 diff --git a/img/admin/error2.png b/img/admin/error2.png new file mode 100644 index 0000000000000000000000000000000000000000..5d52e2f1daba36a020aa967d6c2c46e9dd71fa55 GIT binary patch literal 1061 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g!!3-obe&3U4U|?nl@Ck7}z{qffk>Mm0!&xSV z^TI;sCB)82NuHCIIxj18k%{3lE5l_rhKp>B*H{@Ya{AnSKQh980qzeE`R2r#@*5PhjC{Zo&A`Ww{QKtbNA=ndq3~p|9StxuLlo*J$n4>@snTAp8tON3K+jo{->l8eSn;@3Z_bL; zxf9ctNOr5eS(G+;e*V&D9a=K$7A4M`p1y3MP=`{^!bMpVX0KeoDrr`$%A3UtmaLgK zYr%?DOCEFz_)Q842omb*77Pjsn$XeCUCp7Pp~2zS%E_e3s6L~>M1KE*1q%CjOV4=3 z*~)dh@H2B`$Lh@n9nYq>2eq?HlNo^n7UnsS#^LQC3QaoM#T-G@yGywqF Cz9@#Gu8DG$hFX_f|hN*(F@w(qs(QmF8Fk=Qxn6L*;Z&>DPmbK=i1&6~C2m}&|M4?cq zRBB&eAA`YQGMOwEi_K3M&KI@{3p?+x?H&Y4?NZlXiAohZrBlB=%TigW?_p6&L3)?gF z&BI&V8eR1A72Yw0cS5->PfW=A9viN#`xL?V?+=jP_*a=AjGP^;BT zOG`TavQED;tKE_6cV!0O;+jvs_QPO-RA#@%?AKZYI$J<*3oP3MD~^D{`SXuoWi%Q$ zOjfhS9*!0AZMcFaC}@U)&~C`>3vK&1z^ zAr)Q7f?-`*%Fz3F7tpevWYziDmh`x2Onjnr9)9jBCh2=wR4bVAU<`>?7Z%o^K064j ziewVO)O<2IK@FQd98K~(MAM06G6In{KLHXIxR~3_s)fw?SU3{92NxT0N^IPb>e3*H z#2o}9Ln$b*w6-BKg?kTi9D9SFddYto0V07z5$R7*2up+V%=PkB_^E6d790H-O2PAH zzcdms%91vTiJWjO`O2dbG(9IaJ|X+)Q(Rp$cmlXJm^&I-kaaTALae@ndeuXShyc?6 E0!#3mOaK4? literal 0 HcmV?d00001 diff --git a/img/admin/export.gif b/img/admin/export.gif new file mode 100644 index 0000000000000000000000000000000000000000..61f4912ccd305e4f8d889a5465b00fa44aae748f GIT binary patch literal 979 zcmZ?wbhEHb6krfwXlG#1%2qQd)HW*7F|9PPX)twcvU2IR_3Cx;o#q-bB`9}ZR^saL z%vFg68?uTw

    kos@R!Vv8SMVPhriz;$IAB8xB@99ja+LSkrc-cE$GP?MEBCjx={2 zYnpJfW8&$q>E|ZQJU?;%rD=x_9XfpY@X@13Po6w^`t<2DXU^QefB(^=M~@#re)jCy z^XJcBzI^%W)vMR9U%z?t=Iz_J@87@w@ZrP9j~_pM`t@Cc!oj5gaZu>3_&V991PX~y!g{( literal 0 HcmV?d00001 diff --git a/img/admin/female.gif b/img/admin/female.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cf832899193a2be20ac61c0b2e389432119c887 GIT binary patch literal 249 zcmV9FJV-16Fc(f{xF?ZxTjrQY<`@#B}<_s;L_zv=0<B-;>w>_xIj&&g7on z-G0*m0000000000A^8LW2LKrWEC2ui01yBW000GcU?z%9P*qSft|EdAhS5|3O9n=w zCx(UCfkC2CDBuDDTP0S|MGS+5tq^1ACbEMKA~6IulO;r9lN4Yv8KJfnbiD+NZ4_8E z1_1V4uvkbM02~Z+84eN>1Bn4za{z~l5&;~95gZ(cmKcO0908J>BLbFWEFl0p?iX@` literal 0 HcmV?d00001 diff --git a/img/admin/female_2.gif b/img/admin/female_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..659255212cc2fa620a0759cb8a1a5e63b551705b GIT binary patch literal 1476 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 literal 0 HcmV?d00001 diff --git a/img/admin/forbbiden.gif b/img/admin/forbbiden.gif new file mode 100644 index 0000000000000000000000000000000000000000..c772d4989314e1c09300cd89e8d4ac69ab8ae42a GIT binary patch literal 594 zcmZ?wbhEHb6krfwc*el6Gtl_<(y3PpQofx(|18w|!-TqXiNXK>|9`z{-KVmo=SOya zefID}ciGFNsB5{&zZOl{8*Tq~QtzX>n!_pH?@k&MpRZ{mWFWd*IbH8h9ea=x{b1Gn3x2kri(-CWKJ&P|;`fT#dy~DMMFxIdx8%$G zxo6YE-(|*rfBy7Jq!2#)|~x)Qtj78^FH=g{@k(dM|bJHisBcQCC_6b zK5W@~J0s=Onw8h$gTM4P{5*a5OrZ6jD`y|q)i4Y+Q2fcl$j-pdpaXIUC{7sI*Eg^? zHMg|3D)3MP}w6Qar3CfuUD$Da3v@+}YDZ2CPn>%Q-i8L#iX)Efoy1BS`%&@U* z^3e#^cj0l~=j>=@Y}6EDCBvg~>NID7mui!qyNg7dldY^yldsIaYrHp`q|{tYoSwgM zlJ*pC5>wJvSAXeb=_<+Cq`)L^b?T+-JckGajXlbDp!O3u-Q3AM%A_e0B6BN{l6;Me?jK~AVg~lC6z(~+2 zVuc{6AYl|ig9Ss2EtXP5sFZ@0G79az<<5@#6aEfQPQHAv=i!JF z^_+=%&ZN}OEalF$a;IB)NUbkg&qf>lY;^&cl#jIWOz$>YKL$-VtsQHQwtU)&G_F9U z;b_x(v}Kj8b=_=Rg#NuyUlTjp5IfRv@NZMP^{YSH;csgXK)>;4JNcM`k1P0Cmw-?P z5-I^E4?^0*aOHAR9c+_D&VJjBx6d(#=-i6Qw_(a?vTFya38ge!=)OpkOf=oGcSf0x z$wjzQh%4jBt~k6qj#4F1>V23z8C9p^s-r~raY8Ga)gB=<$LQWl#{XT6U%*J)O+?br3drq;ap0WPYqpk z=r7v!mmG#m6N&<}qF`Em!>oFW=^xpLZ`lp^Y`;s0k$c3*efys~cH?c@c-LWk>@+>H zj}|(N&w%N<(^Lw^UpXh9ImRW<8p8 zhSUMd0R68Crrq7=lY_NfRPgcuINT z7|YE=QR3-+=6ww3eo>|O&I6b4<_g6R4wbE66|*u{>AOtq9g+ukJ>;%AEkJ_muJ86- zxFim0KAD{q7@5V(%$AHk2~B=Ve6)LJGTgxdhbmjK_ zMs&&qHnH6p5{Zx56(4|an&}rilgut6O|?=0B9{06|II1@97(Xv-1EWp{}VCAATGs1 zZrlI$|6+ux-Ru7rKfl}>0A+>P(kKrxV7L=3pw=KSftlYiH?h#=|Jx-R4l2v(|NlI- zM9~ljA^8LV2LS&7EC2ui01yBW000J;zy_%@s0@w1iZbEzH7wAmR62TEdN5ppvg*_V z5a{W7P;pkU-jyNJK!4VmNG(l8ptL7Wq%cjTV-_J4E`L&R7BvQjQXWqkD2!1zPc0>W zP$mZvIyxy90#6SJ4hK;TIT#cl7CTQHEDH>nP&yz4786!55(^(276%6x0JwP;CMFvN Y5;iL_JSZ=~u98zbP1)MpJ~BZ7JC9qMJpcdz literal 0 HcmV?d00001 diff --git a/img/admin/graybar.jpg b/img/admin/graybar.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d3d2ccce2b7bc57d7b2c506609a3a03ac4f1e260 GIT binary patch literal 719 zcmex=PKf)jeavTFPU}NP3ii@HPGcYjzzs11A%*enbz$^gd-4{|Q zF%sc)_$9;3)_lm(pu`6(Vo#Aj{+vR0s-tMFfy>&Gl5LNbe1E70L)qTia}GJ zT6zV|S!(GOJZHJ)bC{PIn1Mkg(8RGoh@qkBpbF3&IY9|pw MbX{)i`2W8N0BDn%wg3PC literal 0 HcmV?d00001 diff --git a/img/admin/green-gradient.png b/img/admin/green-gradient.png new file mode 100755 index 0000000000000000000000000000000000000000..e0fffbdd7755138e8d171e06bb178d17c5f28960 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!3HGXPAxeO5-1LGcVbv~PUa<$!O>_%)r1c48n{Iv*t(u1=&kHeO=jaGxPCVNXY!vum=h`db&7C4K$bFiy85}Sb4q9e07KI}djJ3c literal 0 HcmV?d00001 diff --git a/img/admin/greenlight-gradient.png b/img/admin/greenlight-gradient.png new file mode 100755 index 0000000000000000000000000000000000000000..b289a372a6375e653f233edc75fc4d59d840043c GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!3HGlw@oMq2^0spJ29*~C-V}>VN3FMcVYMs zf(!O8p9~b?EbxddW?0 zImmgyK;Ur8@z?X_uAUuHsamkKzm8|qhMn_IE4ZlaVrE~ppPEvS^IM%vw#LMc)I$ztaD0e0sv+|Jg@)& literal 0 HcmV?d00001 diff --git a/img/admin/grid.gif b/img/admin/grid.gif new file mode 100755 index 0000000000000000000000000000000000000000..78b54c0f65b19012079abe617e69949f05b158b7 GIT binary patch literal 87 zcmZ?wbhEHb6k!lyn8*ME|NsAg^YR9eRQ$=p$iTqNpaT*G$ulr%^z<(}{o>%F3QxVN lH%9~f-_=H(D2?)LTG+nn)z2thn_Z^9OSj8-r!q2F0{~ndA$kA+ literal 0 HcmV?d00001 diff --git a/img/admin/group.gif b/img/admin/group.gif new file mode 100644 index 0000000000000000000000000000000000000000..213f3a2c72ad919fa008c1adc9e88a9b375c0137 GIT binary patch literal 1004 zcmZ?wbhEHb6krfwXlG#14k@;a+iaYFI=W1%~VeR*Pru`3@|2J&e|EOjEV%Pr< z-TXgx|Nqpc6D6GoN+v%^*!I6@-Sf0F|NEmHCdN3mRfJ7VbeWauJu}09a%JwaN{1yy zAuDPV*VZTf)qd2`6x=bnW^P~J>Xw346Kl8kWjCG9Z$Deucdm5Wxw6UUE9PCOzT9GZ zb&kRP#Y#_?N<3X_{A`WYu}NO{rurV9o_%;(*^vcR#}-#yTU>N)Y4x*N-j8MnK3`Mx zY948s#Ib<{feEQ|>x&&f= zJnHS27pSjEwD`a=K`o={&kM)E1%jrTx0VDdFL}(Z<#BCCVshKDLk1dNa|{+Xc}l9g zNC?yvH?{Z+8O=MA(V)uJ(x@A>!{dV|f;lh**UKGxo4BGci~L0C0UEUjP6A literal 0 HcmV?d00001 diff --git a/img/admin/help-new.png b/img/admin/help-new.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb44849d0b65c8d922f3b80c44bb9199f3b5e34 GIT binary patch literal 2765 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 literal 0 HcmV?d00001 diff --git a/img/admin/home.gif b/img/admin/home.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8847824364c22aceb6dbe5c68526a2f50dc2131 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc*ekBUTU;@_3CY9Ce_u|;k|(kUOF4Pqu;-O-?X#3xVZSv?VC%N zF5TDR6jc(DvpMn1nKPGG=BK5l&73)NUcU3e>-)RAyDRP079Uu+q2B4iy*oEg96Y|H zEOu_#w{PEe^@Q{$_}1(zTwCumEh}`-%q-7x*C(GJ^_^;-5M!~U#roClXl2!A0J*=;&!mheMgmL;o3~! zR`=kl7;y;FiNud96g@cyA5 zuc*$5xSHtL#UWFotlr!?zPH6Gc}jB8j?AT{HVgv_6o0ZXvNOms=zv@SiW3I*O%1Y5 z&9X*DEgdcTOjfR)9aff(j)pw_O>RB{v%RMF&lE6paWT}Dljv|W^q6X9W-ljgY}XuQ zI5&u&ot-OGQQ1OW)@i%p&fUAYOoZ7?lmeI7OP)C4&8jXYC9CP=F3ZmOkds|jRQ^`8 z>26LTA?7EXdL5#>ncr%E_#~@p&cPzi&ZZO5(C^wW>#Py5km(R3kGM7y%Zd#wEt~@W d3Qt;J_3UH#l@wkr-y`u$jQl-m6h4p*qE7_+1c6UAtE;QKySs;lg?V~< z*45S3*48>WI5;^uMMg$CIyxpMCZ?pMWM*c%xw%O}`1$((38r7$Om#dM=XhumTTDfI^D@<=Xo^Z9D%9Mzd>~zWozX zw@pX;kIU0r--|nr9m(%V3~f;nK5~JnUxmp~-`e|Y@jVwc8??{}=1&T-G( zk|VQpd)SjHc_Dqf6JOj2{rRHlCD)tI>5_Rz*bf-ZwU^$_&3I^>*y5Bl)k6mVLXQ`Ta@iw}YH- zQg?21!=)YVS9W*aIM9Fp`1IFjy5C=%`1w}%(+i8fK5Y8-p!xfw*6&XnzCUgJ{;d-I)6L|qTb){TfaY>|KsJ9pRecre6#T9tJS~Wt@-tC!;hDHe!buQ=ktO;UswM5 zy6*SK-M>HX`Tc3%_t!^$e>wK&>$$%_4*vOm_0Nxc|NgxD_vgdEKOg`9`}hAp5dCKu z1w%Om6o0ZXGcYhS=zu%{$`cG6+Zfn6WHbUi+IXBev~*@P@<_IDvrF+PAN8Ka62qoYLU%G-#eKYdy*3rIAY83>Gfqo=m3V_DP~j+ZX~gmat6{ zHpx4~@zKSBrA;a)#F3HtIER2gkB7vJhdko4Dqa$a6I@R-a`6}k6n<1ZD#Xsqq_E<^ z)t;$hauEiN2b3SN>8M$qu=upV{RpGvffW^jEe-vLnJsEgGA=#9e}cIqVg>^v$1_Go HMh0sD`oAbI literal 0 HcmV?d00001 diff --git a/img/admin/import.gif b/img/admin/import.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdd46317e3370700ce78a29bb10e9debfdedde00 GIT binary patch literal 981 zcmZ?wbhEHb6krfwXlGz>Y_jrfb`5C_2<;9G?+pr`=N&d9AYxWf^!(tMd7&{Yg5p+( zq|T4eotKrkIy`Yhc-1z#z_`12O=VCm1+3F@(<1aNMBa zC?YPTX0!1z`-FCZ@(za;8;gnS928P3dbL@>QHe6_QW@X?#@#u|W;vqI(b|w{* cgNwDBS=cz{c+5D|;@Hg0GRI@0fdYdy025o&>i_@% literal 0 HcmV?d00001 diff --git a/img/admin/index.php b/img/admin/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/admin/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/admin/info.png b/img/admin/info.png new file mode 100644 index 0000000000000000000000000000000000000000..bb000acac10a39193ce13f76d23ebdd9280281b3 GIT binary patch literal 1270 zcmV+}2R^84%Z`rYdHCRK<~gSO!6 z^BzclGNrw#ge4Mw8!AS)99(j-dK&j zn6T1TaiqoE?Y+w1!PMx?*yzvS@V?FDDOrw#s?M{~<>h?TX zh(2zrhPT#anZvci+**{sf|R!4>GoTZy=bV)v%uAyw9~=b>{fcNdX~Z1 zfs?_MuF+M6wohl4u)fuism)P)sD-A>zT09y2{;#p~zT&t671q#?#}AtIe~<;82CQhp*62gSKFt!=uXJQJlkOrpYp5 znpls$hM>q>oy1s;yrr|y)#dX#XO_az<>Kn~=kNM#s?3vzSZLJ$=2mun8U}}?3l00tI6Ph zq{+9#*k6;tq{G|F*67LE>&o8jJ8Pt3pvF&jtZSFTQhcgso5aS^i4b5;a7>bY=EU%jlETCm~N4{gtpVB$KJ!$=;G}7Y^u%M z>Gpf3%Dl?pe5lNYp}=p0r-i1?nXb_$Q;WRI-iWr-hoQ*P-|*}6`#orwi=4h&l)qn; zzf^OjiK@+ZpvP8oq=28rPl&mJtIdV3(21SMiJ7{Hnz>?|!{Y7uqsidm>-bNb!>Y*O z!`SO*rphs3ndk2JSB|}uuFz0~wuYd{XsF9voy00ykK^w7HQ?sE00058NklZ~ zj{`8k7)OK3#l${j@uN%ZalYU$Dfy?hLk&fO-{VuIU8=R-&NE*t3@;)i8kW}HUc7oW zJNxQ;Q``S;*$tC$eYf}QYODWWJ|Fw?-|F6+vYF{n30?06?EkgqGchnQRV)7IReG2K zk(hPpisOGXle9^%N<4o|xci^?OV literal 0 HcmV?d00001 diff --git a/img/admin/information.png b/img/admin/information.png new file mode 100644 index 0000000000000000000000000000000000000000..121c7336dc5d7e72080980b934618d6608ee979f GIT binary patch literal 725 zcmV;`0xJE9P)TmiBc>G#Z4hnJ5)iUE?jh#Z53Sk9|#IQR=%*M zbegV(TAGxG&Y~Nc#xT{yG>_33Gsz_V&D`(3_v=DPe6$-q%P(I(9609~RpotD^X4IQ zbu=x(9ak4lR;{!+4Je@q;ih-t&fwWk9=`f-UUl%rm643KaU?Fl0 z6`pW^dU*z;{kij>W#0lEzMRk4NNyb3Ru|vhTF=y+rMM8`gOaFQLn^V3!m~01KR;Zi zhEuruAu_j${MFh3DAFBGo|e$4Pp-Q-~96)smkq(Y`T3*VcxVM$!im1F+to z*w^07SaAsvL4wBz$B)AkWQQlPVzJJ$6h(~BE^=UR8^+obD=FB>wl>w*P?#yiSjLzzwF*!rY@%*mE&WIKAR;&sI$9D84gC%1t<@%0qT3@6%3r6Gjj5ilP5hRhlxHuOz%o259~|RynZd9JYA?T`1>dm`NE7bvHsk^ zne2aV0ifrrD`{1K91SN4l@>H$j41*)4RYs?fph;qrgzZ`s6T>xS+*g$00000NkvXX Hu0mjfwNh0) literal 0 HcmV?d00001 diff --git a/img/admin/invoice.gif b/img/admin/invoice.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c16743512dd882fe202327dfe1fd7a60061ba3e GIT binary patch literal 601 zcmZ?wbhEHb6krfwc*elsQ@HH;>9W0*lFy$%Uz?@2b?eqMXU=paY9)6axOZv!nl)=~ zED2w-WJzytZ)nx}NGFMzGiUxhKDni}?azb5|Ns9#Gd1Gkw*JivYmWfIbdRt1qkcZ# zxVO{$$;pswJ4#;^7kzqmxBiWy+K@EArpn*pM~x z#I7cr=li>EOmTgCrTXvpgH|IU>0XIc%`rB((^%C*-FkV?@oo`lHMy}kfQ$p!d?xO#YaSX*1m%F4RBy4u^@ zo0ynLNl7UxDr#zK0+n!=F@h+rk|4j}|1iL?>5R^Kps1s#i(?4K_1d$BLI)Ihm>n%Q zG5-C3xaFV<59{q%WyhzUt}7BXwVFJ5B<#vqrv7MK|3NTUZ@b`^oo}|Bp7k%-aW-G4 XGvmqNUF^0%!x%hW{an^LB{Ts5HGezC literal 0 HcmV?d00001 diff --git a/img/admin/list-next.gif b/img/admin/list-next.gif new file mode 100644 index 0000000000000000000000000000000000000000..20f5d922585d702d52319e7c7623dc6693022534 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkY+=|Ns9h{$ycbXZX*c1LA{Z7?^lme?3E{4--Rqg1uw980ZN KIvz%14AubDe-J|e literal 0 HcmV?d00001 diff --git a/img/admin/list-prev.gif b/img/admin/list-prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..69dcd1b215cc2adbd93e13e035eaa16a6ca3ac33 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkY+=|Ns9h{$ycbXZX*c1LA{Z7?^l^nAtmTbH|zl7)CKLSOWk* CE(=Tm literal 0 HcmV?d00001 diff --git a/img/admin/list-prev2.gif b/img/admin/list-prev2.gif new file mode 100644 index 0000000000000000000000000000000000000000..f6981829192aa70825cf4d4ecffa6b5daf467fc8 GIT binary patch literal 62 zcmZ?wbhEHb8iEi+}odO MYo<{9 literal 0 HcmV?d00001 diff --git a/img/admin/localization.gif b/img/admin/localization.gif new file mode 100644 index 0000000000000000000000000000000000000000..c1d63637fdb56ea09dab51fabed26e9c8078d1a1 GIT binary patch literal 1067 zcmchW`%}^f0KmVNcGarGtvT1WyIHoIR$gh3wRt;-sJUr#x9M?dhN)nemM=8XIq?B0 z(!e7Ih(>ncV{U+gv=l@V5dnEWMMSc5lK31rJ0Cm$iGA+#`{$=mLSp2*3hB zROR`LRTrS(pznUU{6l>-1Otx8#(qz~mV!@4K29qqr{=b1Bj~v>PFleqh`YluR2RIm z8&SbV776c_4&6ZsixE?01ykik(wt%`ym&0PbPQ1{%R`Obuaw`fR+Rj#Eh%qpK@1K3 zNF7V-P-ZZtnVqtmT@x8>TP8;j=PKbmRYAY3fUn9IO78uo&eswO$LfnrG^AWn3qON_ zg^5rny7NMD?Wt`|F%%{gBPgsFRzKn2?P-jCfdLObOcdg;)vB)7D3Ew@8BU2JtMiC5 z6ir;s5SPdszL8QAHDrj19A_rSY1-mVv{(!6r^)sl3lpkiWSgI58wXJO=g4_c`J6n} zJCp9UXL{|oJQD@;igLHH+M{`}q_6N8sy1e_ebf0X`ifOU<(dh#F?(afmHw~mW&`u# zuY(l22wlTwHNC8_v!ID`Y|CULN!?5xK@)Tsf}xIPBDR@Hv>8&ng_O+D7z=oaf!&1C0{vPUz@o>6xg46G^R z?+!c9CgnR!-Ai(TXGG+b3SJom9>Wy3K`S7LCkSFYOEu3{FL0D^_)7N+y_>IF?4Mp1 z*;hpKV%(;Tv?(Vp>w10qKUZ|T%~yRg$EeJ$k-N3(1&!V_X>e;zOFHAS(dIFj)?|(~ zv3=D#y=q%@J6!AHzrCt0=jgUivh5q)-jFS>z45Fs?yfm^*I#?zdVPEPwsy9*cea85 zk&sRQ{Q#f@&h9n$o&XN+0@On}tRyw)*okO+*kw*u$WaoU86J?R-GB8c)%fAuqJ@*f zf>i8#zf%$eu5Ag4`Yiu=cQPg7+?SF%Yvd7CcruvT^Im7rS>GHQ>HMG_(ihrxn4G9T z92nW0l;wrUus4W1z59G%>5+H9oPYWT&WvNy3nPHHrINTOCvR2Fy1Yr>9!UQb<{wGC z?f=mQ?RaT7xFH4$E!%>gL`#x`?_}ucXjhN;<5>Ldm9Rhwj(09kd2vAt_v0SmeVzm@ z39toU%B6=s2yh1WUx9#TIl6FM(D|g}nnn(cQTNH$J#k#_T*A8vAW#k|=G1Qyr>`6f ZIg}E8D$4It&D_CYSdHH^jGrIy)qlM|F4q76 literal 0 HcmV?d00001 diff --git a/img/admin/login-bg.jpg b/img/admin/login-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..135e4d128b5df4142a7dffe6591961af4b4a5f45 GIT binary patch literal 12222 zcmeHtby!s0_Wxm+85)Le7(zOR5=ClgkS+mfkQ4+70qGDVBm|_CZb^|;X#@o%B&8b# zML=oz4Zi5B-uJ%u-skx~_xH~|XU{%sul3n$t+RHVefF7?(UTbfrX;5*2cV&$0j8)E zIC%$110Ylp4ec}sogQHH(;NZ@ql2LkDD>M80}B(1frSBuV&Y(8VV@o-3Ks_(_q1@T z01blj4ES+?LFf=D zCK?77N=%IsfY5)I0w4$)%5RL5aR3(`C4`~F003=$uGuS1rqY}(KKvZxU4<;oQ{py> zk}OedTdnmW2hWr&EZtQ+;ftPty*PUb0xS zjB>iv=1RrGkIxwoUFt^iC)=u*ia!cec^3DlIgow1%HAIc2&$ib{9itaLSUTuD<_V+r?C=X;)t9#X@Q~093}w(V()jR7j^7d30a9 zQ*~%{T63^}Q>5O6vuEg)pc{Vl1#hYIFT>x@x5>R~ee}%jZpAWY^{037++tgBKu1OH zU{JJYP;e*iC0-nJZK#0F)sG=7-cOkvGk~IcN3)wM$r=f(iL9*->p{eQqR&&IFFP6? zi|Y1g+WcF$YSd?iw{BkN`pPnXpOl!1z^Xvka`aJy;D}5)fL&NH?PZ-@Z}n(XZ?;nA z0c^TYz-(>21nJ4$<0PT`4ko-RVqM`q#%L8n?)!F9}Dvx*p}*EUJ9! zJS;0R_P+AgCv^Qrs>AKtWBpC>nB_}KhL$wJJiQbexw0rzhBX)bK}B}LQ^`w?$@$L` zFIo2n=wwoX6)<0rj^1FKiC^hn^4MwGEwY;Ji>bucgml=gEqcZW8X|m$N)vTgx zu)lAYuZ#5&JM%`7`IlcR25$~JZO%SfKLHHqC*F{T>WLF3E`B(`qlfh`6Fl~o6Loz5 z$#jU^Pl(XILd<<_#L+n~-Mbe+(-ETnq`W1pJUDfk=Db4O98FK=je7FT&9_nY{%AVl z4|w#;u!LugBlEjDrXn|QeZIxS^-ym-Io*+zIq9o|73s^(?(&NDI_Xzpd3qZFP?Qq2 zljoV5XZz{gJ!)n}XMC%^nn|3#Jv+HcNdRKpuW_?M$c%B#po0At!!<%w~b z)Y#qOG1!cpAE&#FEeZVnT>}I@IahQl+>6C$-E4Y>%5WZOEID6!>FU`LjvBlUL#dMB2y3tM@5Ub2~3;;zoyHfY`>lE}?fdvm{P?v=WWy~Z*rC*Lwd(qLG( zZJU+goB)+GWz>bpjx;&*UTHpS!le6Q-4~lkrBa)HtOn_)RI(51s{C%9 zC-}J3f3z@;?~{srGw37|AdFt1<$`_x)54>r|>n!FA0wbA;V&cJ1u&l6>>dB>6 zs1bQ)$}KS@FF`a)yWnZMj>(YFY3aOV9FdmD?4E*;{9#*7su)^mt-~e z%kYXecOJXrwp_&bb+udC=x4AbLrOLuBvyT>?bze`DmVsScxyc8br7Q)YZ+{P) z&j1mO@{W08L!4ow&WkathMtYOsBvDo+%zd3zZGSn7FGX__ij?R^7&<+P#lL}E$Ces zH?*OGgh0@DxNS$Aqc-)|Y%8(43ZA!p*-=3GLm6&fwl6WV*p1h)c<}+F`s%p4+g%P5 z_U7QOORwydVv2$g%AdAx;t)QP@U6QA|4EC?27bb${1)JEpFN@Ia?p;|8 zpUSlxQ8F}0^ZT5$RH#4OxB$69dT~2hii*O9jD&<>;%UB7hj5p5MP4T>OV$qY$Y=mK z7))Vht{*`|#TAm7C86V>z1N|3zesID5|Jot$Ti z7LL13MnBSu%uMpHdJkrcGII+Fth^^TP_Mw4-F!0QHShRvqHVGraYLmsoq@2;(~ttL zmPoedpnnWE9LYjt#(}9P)nb6@>d1t1^`UA+C1X+J>QX`5u*Su3ZZd2evht@PY-}x& z6cYZw$7KdChpLXHuGC@xvf+iyJcIVJXK1#>lVoH=O;H2px2_%>Nf@Yp4y1Q3Q12Oe z;09ImW2)u?s(>Vc-H6}%lrJMf4ofl~%c9#enr}%I1q>*l43dca-GTWk18zF$PEP_9 zC^Tl1EW%gnccXFrHYgBTglty7P0ix(9d56LZ2#TX@5ADV(q6S8@lXpB%EBEbyW^F)j|*!yNAIaG zKCwXzTi{qBs{iAx4VMocSF#m`_-g{silUC+O7O@JweH{{1kgZW2pIJm`F+^|po0hn zG{F!Ui8C>rL6Qi;#}7qnm@!std|P&)UO*+#zI@huVD9R#JNqGgLd^MUXenpumv*#oK(dE;tkHz9gT89m*fji9RMXy4RhCFiYi&UG7Ng^ySHl zcDyRHRs1Duxf~wYl3Xs>U5Nay~j0QP- z{Xj!?Auu7a08B#@0+%FWK=2`!&=Sm-*?Rw?PbBV$)bTNZZm?sJ`MhpgCOxqb{ zwIXT^`jrUgk@#bW*}Bg7gE@mT(duh~=rr2cm@=?_{MB#lP2$Rol$OXRts9vMPDgnu zAr))K(Wh*Es+)!JjdJ^VMqOGmH%X;dCI2DJtz@FUWIXaqe_Y*1+Z`aE(`{oqp z;qos9kDp1ggofx`g58}oyLUmN@XDhFo#i@G&yTXkw`2dK0`2MCpaMfREC>q0z`%k) zuuj|dbpHuV$me{svL8YuC=>^UG4QL$XAzSyB9I!I7^H9}Nhz~{Smw-%=2-!087&KQ zOV_~cfx)@YXKyS}3D9zh+XMYyQi9!6gAW`-_K%BoN-Ilri;b=g|C&ttbA7v~<>!QW zlABwqr?KC8b2@C4)chlPo#s^Vq^0@~m?$TTVZTvQ?sUpS)x-FfyieJGt>7ECo>d{05OK1Q*rzou9}VxEu9NiQPK@M{NZcoF^gFc#Q3}+ah+`GH2{^l;zw0 zPX=+_!(sBna&C_M#tvc_S7)6{s(Bgc2P_&Z!#JG2Z2scGm$yKk;BW%|eiDo5eC8AV zw`l6<6Aw8zeuPLQ1Vs$(&{U}DlR9C6hlmJG)$#) z(pHI6M;MB^{_2nmql^RBgB$VZ4~R2m@6e23(~RH;5?{+%9K)u@$i}A@k~~aIS(t!R za_3t#!FU)M9gMz0?J zZp-!UNIOh;n|>rc*02(Er^7iR?7hv`e)%I=svBxuV$o5shO493*~i_j=!cZt*uOTW z;D=b=xX8luxZ8uZFKF*T+gE?@!6Sac&_b*VA-6AS5PSK}pq_4e@wgDag}eD$Mgebq zx6S<$NK21R-i#?wpvk$9@!H0R315h5ba3Sapw(f@ zoyLmIc%xX!ZXd#wHz1?=fOGHpFw$$4dKpXoIvZoQ9?6%_ z!CtG$=<7DO{Q`~+x6;xERPw-U4Vf~B?RFBKJFi}+v*Q~GJj~jTHA76|rq8a^Cvh;n zdu_{sQ!k>b#E`t$9f7JZhUV1G_WhipQWC|kQsl~#RB+2~w3DD9c8`6}qObIf zOn;9Lo!g>Kn0$NTVWFn;9s>w0MoWfnu5{j*uGmds$K_IIeUiFdwgkQBk3F2%vJI_rGpCj8=7m2s?i|~4A=-)&-6=oHkX35q*Vmd+f{5X zhLW|WCVG>T4Wox(uB;l-a+7JjQlDg6c4`&!*{}NGyO_Pl3B4H3eC;aEEBa@$*DlE^ zwjE``x5JLt>-P74X&Rq^N&~mH18RX2;3i@2+|zZTi+QozLQ^xqf3|avYsw!wl2|Su`iqwpe=zMLIG+f6!N2P3#{}6(?wnqvc*EYP~Q0=&YP|$K%3wD zf`qsrg3oR|CN*ke^D_m$>1MyywD`53R^;4BJBKXK`0J@?&Gr|s-35Oc&6lX;_FA;5 zu`vsVA!6QUv{6jnvmAIKU~PNQqZf#K9se`D?X!b=B|jt(!qFL$A>mEWtV|LBFw#R> zvnyWs-o*{$p9!;`b0*=|J!+O0Z{U=ZzuaP*qdp7s;xSl{n@x7Nx47l;-^x7y4-6T0 zY00l6*4mLI59$KMfKuK1@5A`Tep>mdjXMZE%j z|44^sM!3Pi=bQV5{@G9C0gNx3eUir z?BLLsyMOXQXfTCMw}k>O`APzsnw8{a$!H&iowt9Ly*Q5HEyN#xU@`!C3OCW*+Ly1+ zUEU7xQ6PU?e|*aQ!rPd0`@Q^&zsj;WsgC$mbvT=M8?hO8g=Mvf>gJ6a!Uvcfj2_%F zk+!<9sr!)f<(qVI@BK|`_~z_rVJVcu5QyXVJ6<6gD=0y^4zgLh3t_hI?3NJ zjHr@I-CbQPd&qjlXH>N)&pnXF8tL7*p+BQFZF$^t6zxi?!)OQ`65SM3Kw$4_OJ(k& zuO#RwK?Su%KK7mfL)&Ee!^iad*KDriENtJp%!kz@hHOBc-55M7+amtdyn{lh%KUL|CoRDa;NnMd+3b;@p5*7YWv2lW7^CJYtHes zx~B;i)^ti@OrGmT=t2rq{LXU-&_3kb zlX4sXd~f10fu5+x+FUSsK(u&B{T{Swl)P)@;{&*1t<50S3DDK?rF{(fjK!+PF~Q(X zMF@ec3fIJoC&NL^#jeu+aJ}sNzC)9|8yT7`az^#4Rp8Rbw&}@_{NElZmU|J3bh>;~bJ7LMGPl+(93(?J&}L9@_Lm?Xs)$ zp0Z85GEMK8kC)-ieLO0u>sNYiV-2eoO5bSGEQl*>PA@OTv(r%?4=Q@Ru7=+cx~0R; ze_LlL+3lb%eRuN3k#6I;dl&Z4e^{VKH#K2B0fJoRdt3)!*H*W5d{rMXrjMkACcrxSC_V z;qd5owYCw~_3|G^a_iNyVvWrBt;9oIt>~4$H)M^1>T{sp&FTG$Smz|hz@L#bcUywN z3|UMNGLAt$m(KeC+esEyV-B|L$8YT@uieo@NiLsBh9+59ctA@>8%c%6C1+jl!^a}+ zp=QlorIhf55AVuiuHyxGrxVtn*$`)PJG&Eax%X%8>_!cp)%{Fee5QF$SobVWZH^^p zO%OJD^}nT#geLtU9*fW(+35NuEOBA@#w+e+5FoI>8gP^z+2-80=n5d@( zCJZhafVvQRzE8*n45?x?{bUo0dP`n#GiS?Lrpqk+csBe>FcF5ene$OZ%AFBuT}bBm z%b}=8%eTLJ0H@n^FpwlF2NQM+!kSP7kbwzr#TDZBzo|){LDh|Df*?Tt06Nx}Pp{0> zc?J9d;1FN~0Ag?;JAljcx*Pxqnos}$?Dd{FgyH-f)Mw^X02qyGMdpaDUVi91z!p0O zDjME~gr8{uznqoCRi}0Uz5_5$fO;#1>z{T}oNqP&sXC8&lPfbn5CA+70S-kKzXQIJ z-?BfP__KVb;ZMeY1pw!JBf9lxQg6lvqrQ8g5~l@PT90zgoErQiRB zg9Z@782HRS!!tJ|ksAHZv8a8uZ%_ZzZBp3wdu3?2HM|#@76d(@uj`a>x=|5$6ysNs z*0x0XO8x+M;gsnTgMyf)zZEcK8#)b;4E)JvzyD8=|aOQWuqnqs` z57M@yrD~c-Mm_7#f19g}6tANAQ)61ZQG7>8=~;O%`{wY^s64 z52;0UrBWr(7+bMGk(b8lOxJIRs&DzH@T8}Ik{+uVwy5Ub-lMjd5Rog_cwFMTw{zUg z%Ph>%Sm^E-l_l$=c8XVcOVxDIokzII;Qi+Lm$hzq$j6uU$m$PKF3`^ih1DF>pNr>_$nkb~$T_4gV**E@ z>A@X~q`0F9MPu+>@G@Sm!xakZ@Q?*hUn~utiU*4eS2cqdR1xF4D13}rv`OThS%rbd zz|3P6s@I}lNy+7ARm%=6I=5N#q_KLbmBvdEaStA^gpet$S<0S|YU@@TRQs4iz}6Et zsDnQGS*DTqU@uzB>zUiB9jX+nSe))>$K_1+*f@DYr>v9|qB+_-v8l&V-b4(|Y(#07 zPgOo;(i9T3;>SG4s1-g?T^y;R3RiMIb?F#SZ7(t5siBwqzn%G%wVWfmE0d+c7O(Ut z0VC1$CDoKBU#+@@`;l@&pw`-{clKfHr91yvqpE^fLkEO))RpU!$(th+dHvuXh*)_XrjatE&Jn$~p@bQ8R+`1(x# zGhB`g1jkcKwtJawy&asjuO0A}La{|pC8y8au&a#>*0r!JxiQ-sicgV)l~?OjBG_tvkC^+MSstg=Xz||z5 zfn0bJd|}W>-E2*gmt(W+EVcQzVZiuc>HEZBxSQs)axz-LjS!gg{Vv}uXeJZ?#~n!$;1#VI^vl0D(rBUeljJfa=h_*=tKT^ zeYpq#O6uyFQWWz?#_2a6s8K360jvBUvF)!>nJyXMYg(n)r|2dOPzok6g?sp2Gkhp` z?Uj2Bg-X064jPmr-N&nZ{)fJn(rvT}UD6P9wBja=g`g%U&=QlfPu+W53+5{JiH422 z0&P3AtWC37T%KhGsQ7a|=dn*zEGK}6$NMjHde{p9mn8(BASVjIO0eBo@#oPZA@6Z6 z>m{0%H+oedhwG%yLX3W&Cyxi9f@IdpZMtqS(fLy#!<$En@h^$Z%S?YFpf#@dd2Acv zAC{!*&(O&N^i~XGWJO9z%7n2eB|SutptlIM;&z0SL|1KsTvH@#!6Oh!Q9zWyY=wM% zfV!#GUD8;Af#R0l-IpG=UyI%BTJOE_=>H?6=}yCO+R~Y2ni|mQG32P!A)3edHF)jj7;)2{ z2NK`0_b6emO@*rqePtHFgA3Sn(JZ9;cLrh;4h4L5ikZEGc8R14(MWR7s&NCNueGYN zuCc0v`u$?UNPHeaz7oVw*XWtYJdwlDexG8wlH~Q`SPH0HrU;#xhCf=HUZ-59jZj)d za+c_pu(`InSi(HJ4y<;g53R#xQe8W)iLPH(3ujl`OQ-&+*-PtZHmOIm^Ti`~EtI(+ zqXByjmK|I;!5HUgAQ)h}Ic5XoT5j$p4<&=BAo%vEud3*TOyA2(dtzCbSv2-U$>LTR zIXaZJa2X1QFsg?8clcE>WYYy{uxlG&9EeYN;`?8IGI0l;5LeD9#L`GI&2pZ`hvU*^ z;zXkhY*gv=0vdN%;Qe?v(^4IqW^xQ~n%R(b5HeZI!!%w`NudSh*AK;D#W{%w!XLo( z^uimBe(twz5%@7sV#O#-(YQEVfW_O|E4EP_CXA0CWC(*X=G>Q299mXNuwn}~GKR$| znM2XS^!0vmORefqhP9gU)Jjs+wui@$9A)CFhqr&|Ejs;;cO zi=2Gd6u|a5r22F8?K)%V0bH!u)~?N07-`!ugJ6duKS?XVK*ML8gti3&?C}rw`EYYi z!aEGRKQ-UyI>ri+=@?EUaYVaE8R^_JEzGg~G-0)Jm5SY;nqafK{d~LQwV71&(=*+) zhTkFFA^P>7BhV!0r<)r1$^BKKKO1s8{~wdzzkmP#edp`fufKoj z{QtV;$&)AlpVWVNQuY6K>Hq63f3FrCJ9g~g!Gn(u2He`8vwi#aZQHh8-{J6Rv-7fL z%g!%SJGnsd%uJKhGmMYTk~}s`>f|)T6H^Ti^=s|zQr*?Aw7o@sYm@BeM(GW85)BOv zYpO(+m+~(y=3P?6v$&9ZQ32P2JdSxeY;&?$W@RwVOlJhTkO4PP{K>+|&S1u%15yI= z69d~ahuH-lI#T^7mK2@Lv6_EDW1}-~D_>&<`vFl7x1Ke{(HhekmrOd@;w3vpuA%bW z({(DR1P&Z{|C?J!%u~LlwXH>jTVK4HrMO>IUcj)&L!O1Du9lTcUeIW&JNtBwrOTEw z%Sak8bYq;(!n!)}ffm|I=7sn8d^T{bm2N)&Td(YGhNY6e~pQ8B4=XbxB*^|^0oXi?O gj=NO-;pvcL$Ue*O|C00lGN3*NPgg&ebxsLQ0DOfi0RR91 literal 0 HcmV?d00001 diff --git a/img/admin/lv2_b.gif b/img/admin/lv2_b.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1d164d600bb4b88db09862b6ec32ac999c044c2 GIT binary patch literal 81 zcmZ?wbhEHblw^=%XkcJyXlVHV|G(l-7DjdkMg|=QAOOiQFlqGkvz>g)f3a)JrOeG? iyQAN<@@h=G)5NBkX_xbQ?+3N>k-6a&a&LlKL zToU9L{Qp10^;5i#K(4ZbP0l+XkKwxA=B literal 0 HcmV?d00001 diff --git a/img/admin/lv2_f.gif b/img/admin/lv2_f.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee3a5ef3f06bd058ec1c2c61084a23b650680d7e GIT binary patch literal 76 zcmZ?wbhEHblw^=%XkcJyXlVHV|G(l-7DjdkMg|=QAOOiQFe&%+vz>g)f3a)JrOeG? dyQAN<@@h=G)5NBkx$PbI@lQV2%|aO%tO0#}8dd-R literal 0 HcmV?d00001 diff --git a/img/admin/lv2_f.png b/img/admin/lv2_f.png new file mode 100644 index 0000000000000000000000000000000000000000..10a601c0620f24b60c83542f5fc91c3858b3d0a5 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoQ!3-oz7qkBdQk(%kA+8M#4fXZ)Kwi(rf9XJq zxg^Lh`2T-~>!)}ffm~Tn7sn8d^T`Q^SS30h^Z45Kq}*&~>AYgB<;*I{(Epv~--1gm RGk^*iJYD@<);T3K0RTU?Bf0

    8+^&x0!)}ffn0k}7sn8fEx881yT-%ujKh$cO1E>B9ZxY-T&q*vH#ufx{8+n wm9Ki(%ER8jTY@dKqIXyKmJ)lZxWk5WjQ`H5{?eV(39^{M)78&qol`;+03``CIRF3v literal 0 HcmV?d00001 diff --git a/img/admin/lv5_b.png b/img/admin/lv5_b.png new file mode 100644 index 0000000000000000000000000000000000000000..d09db6c530cade88566730eadfce0769ed0a4f54 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^$v`Z|!3-oHb6vU$q&Ne7LR=df8tUuofxMoL|I&dJ zb4ie2@c;h|*H7^}0=agcE{-7{$CDEl*(Mw~spvGvgO_LVzXg-+B|3$c@3xm%DJtLN zaH4_5{qofVzmg{`(>`|bQ`Qyv=7o1;=Y3>kSfL@XYQl>(Z-6E-c)I$ztaD0e0s#9) BHiQ5G literal 0 HcmV?d00001 diff --git a/img/admin/lv5_f.png b/img/admin/lv5_f.png new file mode 100644 index 0000000000000000000000000000000000000000..933b08b517e369430624458d64b1cbed201640af GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^$v`Z{!3-p)oDf4Se#e_Z#Yh_&uf=`X&hB9w~0A{an~24=PPHbEd(0N N;OXk;vd$@?2>=s*H{$>R literal 0 HcmV?d00001 diff --git a/img/admin/lvl_0.gif b/img/admin/lvl_0.gif new file mode 100755 index 0000000000000000000000000000000000000000..379e26f7f329430ddc159e8416de436fedbebeed GIT binary patch literal 85 zcmZ?wbhEHblwy!zXkcV$XlVHV|G(ltLFb~>#FEq$h4Rdj31pDc{*42%pq m3_t)<&cGzz)4%fcTmHp!w%qF8d~eTh{>U9B literal 0 HcmV?d00001 diff --git a/img/admin/lvl_1.gif b/img/admin/lvl_1.gif new file mode 100755 index 0000000000000000000000000000000000000000..5b27e6c4f2507b7487d2d5730bf5e1dbbe8d7892 GIT binary patch literal 97 zcmZ?wbhEHblwy!zXkcV$XlVHV|G(ltLFb~>#FEq$h4Rdj31pDc{*42%pq z3_t)<&cLMH)6aJDE&t7~Ew?f^yH)(YRl7*I?^)oyv{hX>ulH_HJ3n1kl))MR5ac5U literal 0 HcmV?d00001 diff --git a/img/admin/male.gif b/img/admin/male.gif new file mode 100644 index 0000000000000000000000000000000000000000..18f749232446435ae3c863ca6760ece552f7baad GIT binary patch literal 360 zcmZ?wbhEHb6krfwxXQqg(y{x*t&g*Iz35qe^V;*DJI_63? zryu?4-}LO%^_TUFt`$!@Fn7!Kcb|T&J^JF>i$4o?-o1G5DZ$gyWcm= zKU+Nc(4^JpCvLcZ_`;*f+g_i!|NY#PKlh$}Z&`Bb_{|URzx=xW>d)45-;dw@Rx;!4 z^8Jr{H$2{O;&t=li%$iww=BQSfEOtKWMO1yP-V~o zsRH?lfvxqxqyi5esrH%t$*n6a`wpE?w5oOV?&;1v!hq$?`BZWtSTs_sL|yr sl*FYgCBe-l<0h)5ptyC3jEOs|h?s%~s|;s2uYfeaj9mOFCr1Wr0HZaey#N3J literal 0 HcmV?d00001 diff --git a/img/admin/male_2.gif b/img/admin/male_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e170f93d7f1d6099e406464fe4cf57663ffecc86 GIT binary patch literal 1479 zcmZ?wbhEHb6krfwxN6UE;@-Eb&;MM0{%7Zz7uTNuJpb_f%~yZA*FTA_->^5(|NU&)<&r|o)o`tIjDum6&p9r7b1P#bD+2=sC{P00R+N%v73AUuwF}6zRmvzSDX`MlFE20GD>v55 zFG|-pw6wGYnPFt43sj+7T$xvrSfQI&tPC^3CAB!YD6^m>Ge1uOWMX1cerbuV640d( zFXR^Z`oay)E7k*hNG~}*SHB{$K;KZ$KtDGZMv>iKmOL5>Q4jB{Rj!z{JA9(9qn( zz}(2d%)-#n(Zayh!p+sm+0xS3(#^mGW(GFB=H_me25yF~&aQ^8hK4R~78XX1j*g~4 zo{_Pkp^+I(uV-FyNn&1dD$L$YpuJGNE_n4?ITxiSmgE}qQ4YGH0< z=4h$})tf?2nCSx@qYp|PNQng|1WbV-COqi_Iq=Mrng`4=MZm1V`2XMEKfizd{PF$U z*Ds$xef;qL-P<>>U%h}$>=IY|?cXql&E@W4PxO0iYIfYV%-!7@eBhC@9iNJ-3yU0=^Gg;zVvoKeTsx>tl- zgVBV^LeyDUAuF6oS;k(p&55_h%!yw@P|+<^oS9#mM^cj`Sl57oK{L7Yq`f19H308S BLf-%Y literal 0 HcmV?d00001 diff --git a/img/admin/manufacturers.gif b/img/admin/manufacturers.gif new file mode 100644 index 0000000000000000000000000000000000000000..659aace81c639dac0e3905c1a6d792c94051c20a GIT binary patch literal 280 zcmZ?wbhEHb6krfwIKsf-=jV6k%$dD=_by$!w56rx-o1Op#l_E_J=?Nn%gmWGv$M00 z9zFX0{rhXzuBD}=O`be?_3G8%zkjc(sp;zKVju!2{$ycfXAor20jUMq$-p`_L8Z^< zvP|+Sw&RT*Jyk4@TSSg_^PH{_={e+-(Bu%&5%;9P*wWXeGa)470!wF0!bS%lUSu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/img/admin/medal.png b/img/admin/medal.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5377cc6b5cbff833f638aeb313e0d3607ef033 GIT binary patch literal 588 zcmV-S0<-;zP)Q}atMclX|NNJ7%4KKSxD?%wCVckd-;Mn7)7xn>tnUtqPqjF=)S zJt`%TejQ*EdBv$W8!*B(aujyQwk?< zmcusHktb;MmF)gASlq_c_0;LfVcJ5&Z!%+3gp|ri7gVKWnH;8V&`wWoAaNi~ut4;b zMggK=5!4T?_ivYhBdkO8d(44Gsat4Z7Is;80|<)v7NJdj6cF5!Y^{(a*`4;Kmo1RV z6lrgMr`2F-1R#$2=IXtgx-G~SFpHScs9 zysvZ|62oGO_y*~ZHP)Ul*4invGcWA%o&bPv_mgSgpc)+&iIhSIT#LF(SrTD>=2drq a`tc9!{Hj7Gw`KeQ0000mX@>cK|L!876t}dXEXxl5X_#8e zU`=!PGDS#cyR;2l-}~yPMoguH$e;YWaq1hPb$-ku(%PH#+{dwW1;+F6^zHY!Sg-(H zp+x2Sg(gyNj3!1)7m%=5sJ5IY2T?|KO8dwt-|RnKaxX-oCl$<@(e_Hk>qEz^+PS!jY^=N3$m%%bR*UZ`z5XnWsu-o-CVlwtVin>ID~S z7hSAhdik&RqjeiMZ`--MY2lgH#b-N~oo`-owRPpSo)s7RS6}Q}ce8)f-6`uXPv3BL z`o^o%x8Iw!`P!T<*XC`zK5yHN`P*+y-Tq+Kp2rJ!++4Kt=Hgv9m+ZQ=Y!49KUcUGC z%6)fM?Z2~n|K0fqp07Q0Z{4AL>w)O-y$y%&Z#Z&)Ird=d@rT<^JluW~h#u`Y`Do{<$Gc8H-g5?sp6omKbmN6jn=gIdcIE5#tKW9t z__6Qyul;v^9X)#V#EBE9PMtb^`t-ST=Pq2haPi{BOP4NPzI^%0l`Ge-T|0Q;>7k3y z4_|tI^z!qgS6&>y`r^dZ7pJbhJazrmnH#Up-FkiS-k%G1-dw!%=F;7_SMI&Na{t|l zM}Mz9cz6BbyBm+*KX~xq`Sa%=fZ+4@KY#u(jDn#M0*XIbm>C#&8FWC71?33_jy(+0 zCJoI?yF@hnS48Z5At+%nA@lI0 zv$IUn&-4fiALAC+6%IS4sr0;kj$~2T2}MQqzKN{9*LXM&Ek4FArr}ldg2CMXnxpLaHX=l!ydGh4Rf&~j^&z}9@!Gq4u&Uf$LwY9a?)zvLsx^&K*Id9&)nKf%x zYisMFLx=Y4+4JSgmkARll$V#^y?b}vx^?aC?M+QhH*VZGdi3bcn>YLW``^BOyJX3d z#fulOU%&qN@#8OFzHDe{xPSlt)~#DNZrr$G!-lS|uJ`ZXuU@_S*s)_XXU<%^cJ1}+ z*I&GNv2EM7HEY%YwVynBvaGD^_3PK0H*em%ckioLujb90S6NvJbm!^Qr(0TD=Fgws z+}!->)2Gj$KLg21>37*cZ+eyl`33){5@6urm>&u>^pK~EV~E7%+=*9(4mt3+o(x;= zRk;1&-Md{XfB)+zHSjT?ex_M0H)-}{4}~=y4NsGIF)Tm-?g_vCvbin(HuKcq&i4QF z#>*tTq%(eJPnO%vA1aT77Oe}GFu2OKa!Sw1_A}Po_n*qGUN07-X6pXXGBo(|yJv>&+b4)*hzG3im^>bP0l+XkK DR<&2a literal 0 HcmV?d00001 diff --git a/img/admin/module_install.png b/img/admin/module_install.png new file mode 100644 index 0000000000000000000000000000000000000000..4f0790e5ccda55ed137697114dff4420e30691bd GIT binary patch literal 778 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gy!3-q#EwW`|U|`G(@Ck8kTI2KO%a@5;17__E zp0LTia)tN8yOrE1I!0=*_#=Ws5D^*H~uHwas1N{`SM` zoo6eiZ?k*-?!~J&FD~8P^z!ZVH}7BGdUUyOlh^7azMGG(U2`OM@+RAtZ=N@-_P+b% zV9j#Z&!0b?y1qSYPSEC)OI96!;$ZZKV+nm5Z6wE9%iOr{?r*0`cdS%^>hdb^+y;QMSYsG=ELswR`tnn^ithxF~ z#QP6#7Vay1@%rhL7muozm^Q9X>)hZ~vn>4P!|N*!gx0Net61*6_2jHgCsNiN^=Mq} zHhX8myj?C+wj@7${dmQJ)=PI+J$rSnXOsWpeIY-zP!KtY|*^k0fmcf7VR&2_Ud}adf)WfcH2($ zUVm_I{+@`kC2^mD-Ufp=Q+56VBcQ4z$S?T+Kmmpq_Ak_cuDIyw;us=vIeEnqE{P2t zqBFFT1^ak5Z8<35Co=KrLmhYVb6G&GF+BrI3dk&+s*2* zz3JPB4?f(#cgxZEh@0)}d-tx(F?@XV=;PzZpFe*-Bg63N`SY_f40|LQUfsNTuCeaR zmoG=87+&AK`|{e=TMkB-S{ko9ntXiu;zDKVRUfAl(V@58tZw-@zI*!g-HR8W-@Us~ zQF7SL_I^Xnt(cIjZdPw^-8`8T^XB@sV=h+5-RC;=uG4Ef!`tacX<)-?hAQwLT^!hc>srQ@e?s!-O4L{~)b6lF?nj8py0)zbGcRPR{ zbT0|=3;s_Pz;Jv{SU%9m{hlt4ArhCTUN|n)WFXLxIE9h%CC4|TYa6@wx=uX#>tFv8 zPR>(3;@_v#O#dVO@Mm$$|DO+5{&`pBeJ=2{q(|qf6EjOB&1XXhlb8ES z=#=vh3(nk_zpl8jqH|*1X1P}kQ=xxCbkBO@w%2b@R3)0e jaoknI`J-O?bP0l+XkKL2W@p literal 0 HcmV?d00001 diff --git a/img/admin/module_warning.png b/img/admin/module_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4c1dfe48eb1ad242dc329b8e94f0d757b71142 GIT binary patch literal 968 zcmd6m{ZA8j0LD)?X9Z0*K!q8jj4Y0EOoahLap1U8DndyCA*q^K6H$Ix$k-1q#%)o+ zki}$gZe=E7@LgAA=^~bDZI3Ifg+fc&I6@XH4RqB}df$8N-M4qOe}+%;JkPIB^2yWJ z*r48+`fe(MAR9Hcm@e6ylg?DUkxbj*z7zym^Kaw9W|i!0N#IJ!Ss8a@GVzJz+Ak9= za8eCDwa`&45&PtuX$eOeP1DkNrTn;oTR02=fKRLCu?oq)SF{xfo*p_(f)^w-Z2?pi zP%GSIDd#uHzh?`0AxqZ8M^PDX;yr!z|BKA*ZCr(D zc}e;6L12WR(8dWh!!X=GN4aS|3zk{;1$O)l?fpU?+D1>E;N7({t^-sA5=!YIDmscp zuSWFN0cw?5^2dBC$y&z|xv_}~@zIB(ISby;mLH&!r9hZci#`oBVZx|BZY_w+R8li} ztg}hRl`(fY@5tlrA5cLP{qh+{Xn4ymmQ;hVm!UzNsAfWb@vjP+yur>6M+1XkB_#MX zjIWp@M?f?TC<;VE;<%D`mWbxcYMiCeLRtvK|G4qOrrkS?H&3+nD2p}>D?;t%t;bVKZ|7xR{?DM$-pzR1J8%``_a@MylXZO~Bt~<3} zJJq66%>7x~)#>`~*M(D^&6%6*J&%Lk#}&7XgMT7P%dxkqQ0-C7VaH#Bp3+U#@FrX8G8xwWKiU(=TR>lWRZbL#2w zIajCN{d_ZTZPxqm?>1gt*Sx>BX?uOpOuw|XNk9I4?>^Kv@o4wTJBwx>nzrlSwzADd z(euOazq@3XD36`9iv4j4Iu|ISLB- z%DT*&N__GPA`&dplKf&~x<)KQ?3{c|Ox*md#gye)c{JFZ<@H$9)>w)Oo9Vc-F=-l# ZF<7vNs+bzfDsdjXro$s}&B>9$8UUwUG0ObdQifCF$AU~8B zNfK}+39Xy*B>`(~-F4G`=F<9hem_^6%c)&FXJ_Z^^L@V0bDqNkz}qj{j}# zZeO@9reUlp6SNT}nnMlz{}Ol@RWp659t1x5U|ukyDNv7E`Y!)K0>m<7NwP2v=jt&0 zYZEZM?10o;gX-~H{5=I)U$ijhq!EFSUOfFU49Aic^^;OeWrmwsRl>e#!Qi49kCz8QXI*Fs%W>6yY5gAo^-S}+>9wBN^&*Q zG4^%@n%U-UIOBpcEW_o&vdtYO7!zH`RL|u^8B9?mQyE*vDii6lzaG63D zz*;iScVUV&Xl!MOt99T#1vRm)i>fe@9)~>CfJ*lb4xalQMPw}mVP6r>8}g3uG&2f2 z3E19H@MWK&)+a&#I}?VN`U&jhveixBBXAs3D>Q0?RU734Wf17|q`BQ^PVqDm#ZlG; zJ0#SCp0n#%v~9!WOzaYYUUEY}*N$SUAXLyJ&74yO+uzO2QPIh3jw?y>RQU(_;(y{dIK0do TOVd4b00000NkvXXu0mjfB?mx` literal 0 HcmV?d00001 diff --git a/img/admin/more.png b/img/admin/more.png new file mode 100644 index 0000000000000000000000000000000000000000..0be351eb42a5996cb4f7abbcf6eae0bff91fa3e3 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^JRmj)Gmu>My}kfQDF*n2xO#YaSX*1$+uOUky2{GR znwXeKNl9sHY8n_AC@LxfRfWvs=mJvQB|(0{|KWha%b)QRP}tAY#W95Adh8i%z7_|D z!vX3u`Jen_UzRW-?6;NqvTT{vcY=@anc29d(T8P+sRGN2tI{t873&if-*3ESx~(-S o_O0skdWMSk<#!$4IC$0DT=HaE+Wf*_4`?!jr>mdKI;Vst030kuqW}N^ literal 0 HcmV?d00001 diff --git a/img/admin/msg-forward.png b/img/admin/msg-forward.png new file mode 100644 index 0000000000000000000000000000000000000000..e8156909d43983d868b967b52aafc17f8039930e GIT binary patch literal 1326 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 ALjV8( literal 0 HcmV?d00001 diff --git a/img/admin/msg-ok.png b/img/admin/msg-ok.png new file mode 100644 index 0000000000000000000000000000000000000000..35f391cd76bb71ff326b010732107b626c9f80ed GIT binary patch literal 1513 zcmV=IdGqbLt7XoNyG{nLPaFoVC~9>wI6%&fc341R&`DOi;i; zz(BwNg1VmXpD}h6eBh3i#2ODdk^iazM{3z(>@5EnbYCIMz=dadGlq+(vJ?`3^{;#k z|9uFlwk2%B;nP6pc;33_VL)PO z2%9K$YoP7%o@uB3Nv0s4g>^pLjqX>upf*rWLdVaUl-q}nv2^H;2D6ERNd{UU?VeW7 z{A6GOMi$>Oo`J64vO#U2oLkx+8-zZsPg0ODVIogr;M9*hr;XDOGX(K^5`X4tD$YO8 z1hs*3UTJ-lf%DHYapI;1nxeUEB1AOMd@pTUXt|%x;*0gB1!#SojC11#oO+NB%E_ko zMgn~wgfI0f(Lm#!y3t6iGp~YF&ItvH8}Gm4UM-GK{?q}4aGulTp-!lL<6-qw3DbC)p93o z+~HX;eXnxPyF6}p*WVL$qX}H6FyZKY)ZbO3j{#M%8G%r$N>A7|}%4wOGkGS2)k&wI%aVGr9#0cQvRU zjs@jpW4rXNbM1F{JxY`hY@J|mD<{(83TMIEzY+C!)TkKR2FeN7y4!K67~TXH#o~?) zZu@uaTW~vXINYz2O!K&7S10Po#nKbyT=RV&=4|~jLAJ{=Z;21baeC#Bfz6+2wGj2_v-$;^T|vzo_TFTL*3NJlW!1 z4dkTRm!hacg`%@zvMKId4@+M-%zY{(TSH*%UMIvQ)b3B6g4S_7P> z;*ZRkl6Z-M1I?>N*hG?fp-`OS_eO5RDn;TY2J#xekU+`SL{kX%(L*SH=VaHdR4iU% zAgBKGNw5h%gJhpr35wqtS;tpEePp&E{>^ig8_25t%q?t!4`P}0P>K~}s9p{}WAT#v z)-#kF*i*gSBh;~l*Lg$Lr=WPs?5bEMig&56+`z8NWnN(ud_2gg_yiRD&Cc?r;A0Al zcT-!r0s0-%Cv1Xu+H}WK;de{9q}e|LA5&Pohq}rQq}i9qLNGzAN2+Zx30vZml(I#l zcrP`T8=wcth6XnATu!zw6a;!A$r6g#!ygLbebiHKAjur+7yL&)&uRW)isDJ|9uj+K zLcEMx$_?mC7x;}}f~JSg6by<*IChGcSx316opJt@pdz(#G);J~pqQ@nMDc#qP;Nk5 zGIz?b2^OuP70M~z&+*C)Xo}}3f{JAkFZeozvC0hu{>>UN5HJuhFk}1!8(1S|muxLg P00000NkvXXu0mjfVQ%6# literal 0 HcmV?d00001 diff --git a/img/admin/msg-pending.png b/img/admin/msg-pending.png new file mode 100644 index 0000000000000000000000000000000000000000..d912a1d5da5919a6a66ca3dbe25d74299ed8e649 GIT binary patch literal 2197 zcmV;G2x|91n|<#oH;p^F#9$pe6Nyk0`S=JiSGhO zfIYx@j!zzY?eN08z>$$^<*O63pQp0>eo8yH?Ccnm2lg@csofCy&;YUk zWde{PNFQMo(o12)z?dO!T;=L3ud?#*t0x_h6CZ`Z^_p12ie3O0_V3?6RjpR}QsoUE z`ScQ>czhpQcI<*B15J-ihv1dK8$rmC4ghopI>G1|j|5Rxu+^}7?E+U``4jCAmS1#0 z{&t&!?{&;LHZy15&gW&%@20XWqjh7R*jg zPBa-E--=m`NmL3lM0g$u4RRg9T{DGo5@*ni370ae+wW%l@S}Y2*12b{zxm!X^_uu0 z@XMJwb8#KP4*=iv%fXQyU!G<2XqXs|jHVc0P136Q7%6;q-;)m+F_Euh+yG;0kcQ5SpjQc291r?t6&w`#+0l zSI`SFt!tM6-X3Uy$>0VfmAjk}SOKLINOq~x*BZLdSZj>d#ElFYB?O~BJ0F;0=NIpz z9W|%Z)p$BtY64K&v6WJ_il@rZ2;gc=W&m%L*1{El(*prigB8N^PS6Up0io42hK`E4!MgrI}4hC4%Fuy`dg7HTYp@hIkNJYH7NWoJ5 z0eC`l*GQ8f@W~S8W(%~*DI$7k)JvgWI^}bPD^u7#R(pj25jYDg*Go;j+!zdCOAzA+ zfsH0wyEvslWT1SjeVKvwZEvL2oXKp{s@p4N!>h{2YRK5*_VC>EMq#oxNu%9z{<1!R zikIL8KBlvoKnR7=s?$>#3!wl3y8Aa%pwCTnL#0=@hkH(Fg-Tig^S3PK04jch=X);N zeR6Wd=G0CGEThFs_tHL8Z3Ox!((D zSO8Li$~x<+qz$k<5P-peF?|4JAUs?5$echoeh4Wv3bDe z0@Kd|okcy6(h6U&fYDa_rlYycuA`Lg{}&6yt>G-7H8y#v!e+{Wke&r0C1}@_umJLq z*`ZRl)(W{chXRm+muo)-6(DWdSsnB3}iL>!PdqP7!LXaKbA%bqYG^Z;4@jK+D2fJ`&I7CYT%u;6@yfDcyBquv(TD zgvcFN7pdd9zTg8o#po2{xNkN@A<+RLbOKr;0|BseAb{oAC&|EM8XX z;KKJA87<)jBS<4|=6$i$9?A#u{bVOu3L_|w`6MkhJrKaP_83XJL?y^0j6o|!V{w(` z8!_!zUjbgnR`M+u9rgkbj&1d- z8jtdL2(%6WM{fz>d}Ewes)!Q7^`_!C^)e;j+w<)2Tkj2V6!`}5M!hDE&R=gIS@h$l zC&qk6J!yp*)&jW|+5HlQ`Lj*_))zp2Vt#O8RdKzoXlFf#0i9+YzZIoiKG){`f2F75Hc!sXnePpi2l};-2!sOW>NRn6 zIpxrDYQE(Q_Ln`IVnPYAwv|Y30c6kU#)0e^r3JhIyl}S3R3qaN zpbAX8lec-`R9^qz>ch)W7WkO2i@>jM_u;-i(9aj{)Jxt07WhAaO?}CYM4?RsKq-Y% z3a#}W51{WCnkb40!;nU!vAMp~1IifVMNvc)MZKZ5wHW}soFvIpK@fB%(liD5!)u2Z zl70)EZQfZva4d=x@WShl9iJFUlH@7(n%DwfT2K3T!X-BQzuWv5 XJ;`hW_D!#o00000NkvXXu0mjfpvn_B literal 0 HcmV?d00001 diff --git a/img/admin/multishop_config.png b/img/admin/multishop_config.png new file mode 100644 index 0000000000000000000000000000000000000000..18946e7ddb9f4b42fdf83b3671fa281f435ac93f GIT binary patch literal 549 zcmV+=0^0qFP)DHyt zE`f&-`vbOve?gZ(1HF0Z;IWJ0(PM`Y|A551LJ*z{vbrr;nIUv;cg?`vo!#lp%B;U2 z{opb4X5M`BeKSuel}aZ7kirOKQ1~Br#bWVhdO@}AP9=4 zX|N*J=NDu`h=?`-M?W0L0o%5N+;!ccxLU0)Fv_NB`h_U(px^JuJkOI*6|i8K9^>&i z)M_;YYbxn<`obsBbsZ?B(Cv0((P%Wx-eUR?pK~zFolYl@(=mZz82$!IU+eXHAc`W) zE0|Y<7b<}TB=}HOHI~U_gj_D?dq#==$lrkHoTS-oP82cu4CQi}777J;cx%ARXA2x+ zvF&kd&`Ev z%4W04y_5~b(;B!Q_5usn!Wdz0VK^8hIDOr?gn*!4uOG4T{7R+7C4mKxVsjyZ?F_*t zLx0XlBb&SMV-6++9D{Ge?+aN9FV$~i?E--)RAyDRP079Uu+q2B4iy*oEg96Y|H zEOu_#w{PEe^@Q{$_}1(zTwCumEh}`-%q-7x*C(GJ^_^;-5M!~U#roClXl2!A0J*=;&!mheMgmL;o3~! zR`=kl7;y;FiNud96g@cyA5 zuc*$5xSHtL#UWFotlr!?zPH6Gc}jB8j?AT{HVgv_6o0ZXvNOms=zv@SiW3I*O%1Y5 z&9X*DEgdcTOjfR)9aff(j)pw_O>RB{v%RMF&lE6paWT}Dljv|W^q6X9W-ljgY}XuQ zI5&u&ot-OGQQ1OW)@i%p&fUAYOoZ7?lmeI7OP)C4&8jXYC9CP=F3ZmOkds|jRQ^`8 z>26LTA?7EXdL5#>ncr%E_#~@p&cPzi&ZZO5(C^wW>#Py5km(R3kGM7y%Zd#wEt~@W d3Qt;J_Iz8e|+KXc|k z1H->pul{Go{P42=X=U|IM*Me}$G^moubiC!g@u3VX?~TL{Qv#?cQ2>^#>RiVy#B@o zeiIP*mlpX)L*u=;_%9W??+grotj+&h8U9gI{2lK3E6DkOR5$~bfZ|UUMs@~q1|5)j zAU`p%O*qh9;GrX?*}Y^^(w+dD-o7o$iiLdvE@{z%xennEHx~v8Xo>bZ2{Uqw%eE{E zxR4>i>Uxx=qTGn3qNIdhfUj1ZTSzjqiIrbQrafOsPOiLp!lVvvX*rHQRvu1ara97* z#XS7{6^sJQoMaSKi)L{$ax$^WJ8xEFo+u-{VUMef7~d(TGsoQ687^L8_r2=s$Y2cs DaprA8 literal 0 HcmV?d00001 diff --git a/img/admin/nav-user.gif b/img/admin/nav-user.gif new file mode 100644 index 0000000000000000000000000000000000000000..27508ef3ec5b4d2a1e2b94556773fd336a5d3786 GIT binary patch literal 354 zcmZ?wbhEHb6krfwxXQp#=BxVb*|R+}OG4+|uA6nXbn4QpSFis6|G#3@l_Q7NZ>{&) zvSHKr@88dyIkR`~-u3I(e?BoMc*)P+-S2nKY)skx|NZ;-87rRLyLWF|lK$kaM|;ow z>72Z}{ownfM~{}TI$yr?bMe+U@k<^=Fa5t`%ff~==Zn`p={fnMY}SUDwcodH-TLF) zg3Ptg7$^XWKUo;r8Q2+gKxTma#K2a6pt-<9N2>qClL>(|2n{*q*1BY9&@*lkW3 zlR3c$7aPhrtiJHz!G|n0E}jD^C(LfXV|7v0Fb-!j z_yivVJ`f26pW|Ck@40XXX_GF}3uk6?e&6?a^+FBXe8tyT;0>~=d~r&_H-C=^mj0`Pjh4{o>n)Mm52 zWT1{Td?*wO9Ys-Ky1@ZtW=ak+~N8Fzs0`yjfqnaOqC z5%}z}N5|C#^QC%z4y$C60^{+R7LJ8Nfj|JrmA!xJS#zzElY_?D>CNohSGqKG9t;LR z-UI}LLEw4*i@{*fJt=@6<@orZ`03-NBna{qZ+fuX?LD&TA10IO=wGlV@IUn%86YN8 T3Q8a700000NkvXXu0mjftmg`H literal 0 HcmV?d00001 diff --git a/img/admin/news-new.gif b/img/admin/news-new.gif new file mode 100644 index 0000000000000000000000000000000000000000..f310c6b405221701e084f04c33ada05221ad46f7 GIT binary patch literal 333 zcmZ?wbhEHb6krfwxXQrrzmwtrh3WrSy8i$4`2T~w|L17@-;?)$qTv6x*Z<#G_5b&` z|2tCuFShu|HKj_ zPD=-qna7qiEELe1>Y!LKp}LivM6nk(Yy>G5y=mHFVlkIAWQt=I1WS{I%8+T%~u*P4$*zxw5x7dno;*2~Z3XrLj{tk_xO0n3(+q>*?Af#A&Ehif67b^8bbk0oWPEZe>snKCP`AGim2d;HM&!JT{OPXhZ#H;jD#q20T=`|kVMdfPSTO%(KF9H!}jgldHGK-@Vh@wbMJ%WJoKsE z+;!(Rv~Wn%Vnc!@C9x^aCTQ@eQEXbq#o2dx`S-u!?Njd@jzC_z5e!@j;PkFtyS9#v zjq$$u3!`^cdHAyrvt`Sj6gAMo;mF8bAF1mjP5RmZL_J;$3g5(s9Fq!3f8gx7Q~crZ z43{rnem(*@dYud35tVUpW;#FCI&QBxZ>#s7OS9*38_zTOr7to(IL4*-7OBiP@VO_b zqN;?TgjOHAe~TCDl_s+nD~t?(h{qoPCZGAjqx%Mj249<;%6>dKm5r@o;p3B2*-tla z9R2Ip_dc;df>_xDAq29K2J6Q*QL8jSEs0A>okdm3FeL~zWf~0RjwMV3L-*Yc$)Q`w9j$x{U2q=Cw5R>T%4#@YZHs}6#&M@ zH!!wg6aC3Bp_x#fZ<1R>mJD$I!Wn=!R|O!hLjS-3A|(KeLyX`|%&ZE|DiQ=6T$=$2 z60DRu z0zeR>s1roWidJpb0M1`?GgmT@lO!o3OWCqw5#tc+5bIIvQFUcVWFTg%7458dWWRIH z)ff=B#DI#YR$m0TxGDfpj4`EwOH-5?u~EmaL(^8UM!=Y8+z!oOss9+g0l3;bwR)vD z0Ko{xfcTiL05+5isBx(Gi1FpvI+P9uVu<&sUmA;FVxl(**^+7Jk))ibQA%jO2L?h} zO5-0hfEtTPl#px5#3ACa#+HD!gL3UQZ`<5!kWi}twED0@0a)ff02%_mW#V8k2-bMK zO-Mu#TaK;uSnU9y9xoCXF72`RQik+yV(+@=>Y0HMAgFdRV2wrWQfU+CVy4S7s)lX@ zx7d)Y&D={9YnQH%b6Nwy!0G^`G;qrUCV<5t#v-;TrQ}^Xwias)hS0IdB5J-^8vCN{ zgPs7G(gU6Ilsm(Z-f%qBq=3iqX*Q- ziESw(HCP2>T3hHSpRVo0^?1O>yKpScz94mu!NGK(Rx7pwXRZl=VvwR}Mh3uIgE)(b zLDbS{=3JhuU`#2WG)Wj5Tu)zLKPsX0Lfa3%UCY-5Kw6$kP;rD{ST{UCtyWB|3cwUY z_@Y9RxL9Ef-sdbk!FesfqJb3V>0>dx|`#+GukAWQK9+J+B|Gyw$^d z%U6L{C#SLl7cS22Pm;x_hKBnw#-XY`GGN+eIjAM5MSNgn{Sd$>S2c0)3B!vIQK_9| z{>&!+bG(A8zQ4v7uqS|TO-^Mm&CgZ$CyD!VlBQT|R|jAvK5N7qrWlG`dF%8!fPOy|!5iFo;5vyoHezIo%TpS*OW-jJ`% zOy}R}={~Srd_W)s_~GPKc0fe-iOA!|u*;P77-Qmg-g~NxbwXg(7sD$8xN^MG_k%P` z)(j-gk~;7l@LZAmts#U*AdCSMz%eZ!-jB5Q|JVBP(h~zWxSauBxZaDG^}upoxLKRM z2^jc4fLprRwN#;720&};TYgHqxdAL&#H-aRS(dT5xOi)QsRty4;HuRs)oS(1(ptY2 z0Q@@7^T*OOZ67F#0^qkh_s-|bO;F_irt-kSYPCwOR%=IO;@~YIp`Cl@UwPxuNMD}k pkHyEtI`HC3*}oZ@xz+#O=6~Sz4L-L9usZ+%002ovPDHLkV1kT^Zi4^- literal 0 HcmV?d00001 diff --git a/img/admin/next.gif b/img/admin/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3325cd69a4af4b66dc35bc1f01e9dbbd5263547 GIT binary patch literal 301 zcmZ?wbhEHb6krfwxXQpF>bt*W@#C!SD^AVV794nETzsZ;!;{?kkCMBtY(4uyGVx@^ z(g${x7lL|kx2=0JaodaK$KQ!Z94=XOzkcOo>*DhX)9xzeo^4rsZ`Z}ov0c|HmOWc@ z;(bB)<(^H?X6$VE7XJ!FFzn-qcZ8F#$g^y7j8DC cteH9*)qz|>B23{bg01Z;3^LvQ6C4?=0r3W6hyVZp literal 0 HcmV?d00001 diff --git a/img/admin/ok.gif b/img/admin/ok.gif new file mode 100644 index 0000000000000000000000000000000000000000..11358801661a841c6c58afda919d72341986c872 GIT binary patch literal 610 zcmZ?wbhEHb6krfwc*el+|Ns9lzdn8Z`Qhb{r_aAWeDdkxgLe|bLnZm9UU&Mk)+~-5!pw)YIdjQA4p0);!(FfqilD4&9>C+y+P53Y>Kx{_f; zo0W{K4OHutG%8ip3Y8fK6Hxrg!pIJEkPgUEpg3V*-`~K{)ZEhA%FLr-X{j&B(#F7{ zuP4ICCt_yL*~(!q$t@})Bg(Dd%GJzlG+#+oeZ4xjnloz?j~=&@y6zrbP8Dtk*(QAv zQPsWs7+A!`-J9(A literal 0 HcmV?d00001 diff --git a/img/admin/ok2.png b/img/admin/ok2.png new file mode 100644 index 0000000000000000000000000000000000000000..4207a363cb342cb68a8cff0b5678e692091ba0af GIT binary patch literal 1162 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gy!3-q#EwW`|U|?nl@Ck8c^JQTPWMU0qWe;Ix zj$mYuX5k2B6N(mOOlD+FVr0o@W8tc27RqCl&k~c* zln|(77p`Izt7a3f_xE$(7TsmD9*j)hSTYEmJVe);20v zH!Rh1D7WQnV-fCR74Ku0Y+;w`V3+AHdp^a0ug;%qcPp64T zr=4HFQ$TSdhvH;TrD>e16S>r;acj)v)|ttpGmA%Snt)+9uVIszahtqRw}9bnUZXj@ zCbRiW=klAiD_C?XT6Zhi_A1#n85qq_b#Aco>NoT1wes!*B5Rj9%C7U(J*MdTPOx!r zbPAgq5IHX}aD{u=DwpU5L2-+Mvgalh&CgC><(0T3IC)t}>hh3`l_6QH!m`%{=By6R zSreSQHY{&_NbSn<;vG44J2DzpS2S;^Y}r}VzPq|}e^K*+oR&jHtp`fl4^?*^DeE{= z(Q~Z6V`D?#_SXI_9sLJ7CLHUUcDQrKvF=$Xdgh+%oqc-hypuB)9-Xo9?1UxfW-h-t zb^EooJFc(Wb${dDJDd02+r01YmIL><9elX$z@sgP9&JDLbnDS4JC8lxb^OVmTeI3^jT@3~A4?1GDA*+#Q1SSl zRylwF2UBTtvufuSV;zS>4u$&XujxvgZ~NiUs(bK|^!I74Yng*|_X#|d*?v?&KX2YX zPL((8f_eq>*aYuw;dK#ncW6mh-|fQI?BLO>_%)r1c48n{Iv*t(u1=&kHeO=jaGxPDAYKt|SrvQaKJY5_^IIi1v zY!p1=AkZ9P`uXqjytCRbnQu=wVAxw1YNNrH%AV@DkNqiICHv1x_UeQQ+t(j;^$VPI nUTR96KFd@&?o%v|^Zzj4=y9(5qAs=oXeNWFtDnm{r-UW|Rb)Ib literal 0 HcmV?d00001 diff --git a/img/admin/page_world.png b/img/admin/page_world.png new file mode 100644 index 0000000000000000000000000000000000000000..b8895ddecf57c8ece24f566d9b4a9d803e5a11bb GIT binary patch literal 903 zcmV;219<$2P)^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD literal 0 HcmV?d00001 diff --git a/img/admin/payment.gif b/img/admin/payment.gif new file mode 100644 index 0000000000000000000000000000000000000000..de6b152045d7d43764f21c99002b3508025ec8c6 GIT binary patch literal 1042 zcmeH`{V&u39LK*yoH9?-I!lEfre$qy*0g9>Ia13!Ka=ZWnAMy-$2oD_8K#&OC(lIk zoMImCWa#dDT<)18jv_JP__*(d&L7clz4rR~{ljZ}ySO^rUm+PI#z;1TJYjT2=l8_C z?29ex56R=j6|>@BvExey6PTY9%Z3u)3@2$UA10Ry(#i$Nl_TKh2JY_Q;Q^kW;N=D0 z-r(Z{zP{k+2mbyL5CDOJ5EKN#!4MJxp`j2K1|-sYeEbH5vU@>+ex&@OM=jT+0{F&F(8ctSqe<0!c^McWWt_2X>TUE zudlDazdxg5lv*XER*BMUBpG$mjCyHigDkUQlJ;(j)+En*FVAY8&Tg5Zx6aVpzP;|2 z(c5Pk9dkLIb2%RrIbCx(UGp^q^UcFQKJk8{-BeyLZES$CNuw$2>$e*kprvK2w@Hqc zC?!;we2yu~KvB7^sK*o)*g_Sy*vMkB*lhOD&=7~i;c~esit>28@$qqiKp+$f#bU8U zB9Tg^)6>&~!WDFCO|011;&MU4QHn%!8kVitICZP_4bldsoc`A^9S49RH;)cIVqB8IiWvDVxY}VG=1l zxxXhyP{R}9x@{)awN6Ze6(MD*m1K~A{IZa>j@Lu=j4bS!6&^QrbM46ZG)694i)MZ) zxRp?-B3WEBzvx{MrXU_UYQrfyXX5gLu5V(QY1Ls(G`!J~hQFVAi!USQ8tfJvUbrh> LBva)2IOOVI3#c-?cKZg#;nHh#4Q2fclD#F0TpaXI{C{7sIk2Wwh@rbpy zwX!#LF$oC>_KQl$af)#^Nhzpm>FVkm7?>+Ea7s**)i*Y^w6U?ZbI@d1EXJx}WMXEu z*4ExxPF-C|j>p3J*zseIti1d}XS)P>czHQ>I5~NE_<2Mx+?b}#&dkcm%Pw|-os*f% zP@L&859^C2LDo(g7D*ANC!a4cv*{E#Ha2mKYnbsYP*-qr5atu$;c!Se)KUMHXTk}F t^$a_UrYxxaVep_~R}PPgK#&R}!=6I*t!qV865A)twkUkJLV$z88USl4vTy(Z literal 0 HcmV?d00001 diff --git a/img/admin/photo.gif b/img/admin/photo.gif new file mode 100644 index 0000000000000000000000000000000000000000..4221ace66c1768651ef582bbf09c47164fca26f6 GIT binary patch literal 1053 zcmZ?wbhEHb6krfwc;3v=9wFNqCD$Dz-xsGaDN$)^iptD%wb>cEbF(!T=4mZ0)LvPt zyS74qL$%?$T8k}p#@icAcGS7N&^-|eHZ%SLyX-GM$|!`-&pd+iVQ``WB{qP@@l&;;MZ6MYX)_B%4w<;WEOqtgS7 z_D(V0H}&|;;N!D`JPw4Om>YU>Zt%(Z!KW97MDAO8c1ifzrQuO$RijRM#BTo|zvKV; z6_GI~vlDjyKff|6Y1jV?tD-Nij*35>cX4%0%I^OOrwdXK+`PCpDt+(&OY34TuZz08 zE+%8&|I6#6QqGlJ*${nYV|3Pm|5rA~WFLB;eei$oq5s#m#OEFUpL^m)!IA%kNB);w z4JbPLzxdeylH>nNkN>Z};oW}pN!f}2H8*|gZu&Od@^88ou>Qo%&O2ezm2%?iKvFm+<`I znx9YGem(E`^}O%Z%Y*+%!9aw7;y*#>qSVBa)D(sC%#sWRcTe8{2F0H&j9d)=8FUzc z0F+S}IG!^6=ali-@L)d=hj7{khKG*KY}_I$4igl;MKuHF7#JEIVds-J%{XH)A@LMf z3y-YRlotzJ8+m+!N%5ZF`e*RUw#HN9Btrn(Q&bK zJj69s-TTCfo6Zg`4Lptt3YttxE|Zj<8ooR*eBjK$Z7KIh;$dn#pQO1@#RG)}%nTf6 zQX3){tMkt@$v8JdQrLmHf!#zxVqfy|zBv{J_jWKkFgi3#h^r_W1T-9AU}R*FnZeM& p$RnodHATQBy>C9Rgo?`w28Bm1mzD)GOZeSc@bU2pRyGy}YXGt`wVMC{ literal 0 HcmV?d00001 diff --git a/img/admin/photo_add.gif b/img/admin/photo_add.gif new file mode 100644 index 0000000000000000000000000000000000000000..50c0b42af977ac8e17e360597f2765b2d0ccfff1 GIT binary patch literal 1066 zcmZ?wbhEHb6krfwc;3fgl_hDOEoqZ29i1fI9wFNqCD$Dz-xsGaDN$)^ii%IQ;mmZk zx!D>E^R%Ly?3Na42lr^iw>dZ0S+6YB4e!@oTcN+9+Ayupe_gG`mOA6@4JJFAOt&^$ z?`|>6pAoJ%=l|YzFM|bt_ILYe?6T3_Wp|*@*KoJ3_Fnsg{k}FUo@np0KQzJj@I>Fk zll_iNbvZJ{|LF7pqrFoaS0@_pn|gd^@bOte9tT2C%ndy`H@JLz@X7hXrx%7a?ud`v zxAN?g@Uu(9+jk~JomFk$l@N8xBX;}$?p;aoJO20XN;$tGGUjAhN$uaA zm9*=B|DN;cX4%0%I^OOrwdXK+`PCpDt+(&OY34TuZz08E+%8&|I6#6 zQqGlJ*${nYV|3Pm|5rA~WFLB;eei$oq5s#m#OEFUpL^m)!IA%kNB);w4JbPLzxdey zlH>nNkN#@$!T%SEg>fHfh_HIkO+- z-9KA)|7^vaM+I{q70rKKvfy#qq9+xLpH#iRnf&fv!H;_h7oP3<`LylV^PXSN`(C{~ z_vxQZd|^<{=<$8`Sb6fq{jQ*IMVs%HWO*3oMI@Dt0_@ zU~1&C(2@`n;RukIGy0;E<&@aaDkY<06fuFpvBjoZ#;}rU0aLHIPQZeUFUR|t?D~ox na|#qHWwNmIaA+tU5fr$_#?IDIz;a%YgK?5Jzk_X+1A{dH;m4=m literal 0 HcmV?d00001 diff --git a/img/admin/picture.gif b/img/admin/picture.gif new file mode 100644 index 0000000000000000000000000000000000000000..c33d0e62bcd952d0a38b7bc06386827f035474bc GIT binary patch literal 585 zcmZ?wbhEHb6krfwc*ekxG}Zd$`%h(au4PVLRJ%Ly;GKOlt4w+}U+6tp5Zm8zabEEM z|NrOhdfvPCLD8H;Z5#8BUwmA=)U#?;R^6rr^Uv0F9gMiRF89ON?^8BEK6zqxX=7|_ zuk)<+7Z#kEG-vCzx;^0&j>b$`eW7jJ_VShU-oF31@xZMkm)A8fyYuDi_oWvaCmn2G z*J@X}(s$;Ww6}ON0Mq5-eedwK=CIF13SZi1|5)#KykvrzN~?}skx=K$=pFk zvAd^7Mxe<-MPtg;X^b*WGU5{KuCkh%KGu9prZc$}H6)Z|Ep#1?4Vf+NS15|xxN15o zh>CK!1#WBFVIwSJWNXXf$9Z`BP9?1X78ZFAX7wX0O?jM^`91Z7Obl*szjt3sTH4N^ zm-mjMsg8~yo4dQVl@-HhQ!WmZi3bk}HL@}&#dJ)V%`POaO>_%)r1c48n{Iv*t(u1=&kHeO=jaGxPDAb7kCd-2oJ`^mK6y;kX{# zagdimQK02SS%Uxdm8Dj9oXyqhI1b3nXZ>&}H|U1uwwEVwR2a2IeP3EU^Ygk~0j);) YGncLJ+Pz%%9%u-Ir>mdKI;Vst0D9Ou%>V!Z literal 0 HcmV?d00001 diff --git a/img/admin/prefs.gif b/img/admin/prefs.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a1f43562f26ba1c172ff8f19febdf520f899ea1 GIT binary patch literal 351 zcmZ?wbhEHb6krfwxXQrL*4FmFMq&T{{r~s$EMLC-|LXkf*RQ{u8TWfZ;{WLZ|IaR) zJbCi-=gM(N{|`;yvSrK6nKSR+y?f@&neSVh-@SYHe@;+$clYYmt3NHv z`@cNv|NhDUkIeetpz(ih#Q$?^|1V4ZzqRTA`m+E3|1(eTa9MO|;p9n*iTiFIJ>sa4!o%<~C9#0xUXw~-V5Egc z-yVhsGrC=**aR6`%8L29xLDaG#Dcgwn3-icIQl2@^UKP!dUGjrF)J$x$V&%_FI+4j fzC4ImwqAf!F;YcQQDF1dZ7Q5{jMMfyGFSruy83zV literal 0 HcmV?d00001 diff --git a/img/admin/prestastore.gif b/img/admin/prestastore.gif new file mode 100644 index 0000000000000000000000000000000000000000..642599e070616fee09151b911cd12d3e12056be1 GIT binary patch literal 984 zcmZ?wbhEHb6krfw_|CxKS0)izB@xvu5z{6S+bt2>D-qW(5jRO9p;scKLn3LCM9MUY z)EN@#b0l&nOJvQF$eANiFhinXzC>n+Qf{+JLAQQ!uXWXAyUH0xS&Jlc7fIwTk;q*p zQLsd!V3|bG3W>ti5=HAJO4dr0u9v7;Bv-jYqGG*7=|+jljS>}GBr3N_RPT_e-7Qhw z?^!#|sd2AF)8x?R$?b>oj7s))TvWfu3Wix?b@BY*KgjudGG$MyLa#2zkmPHqeqV)KmPy! zKf@>(86ltp@+K%RFmUW;*vTQ|v0;Iuo|e!m3y*?_4(+VvFHTH+%-Sug6*NbHvFQO{ zmwr&e3k4+>cRm*FK8=kFP71IJNfq3fAk;cR#b}d3=ffp#%{(me6$dt^dQZ`eS`w4+ zp+SL5NOy^VrvW3U2p6B2z?%gu+*7#(#15QDI_l2YB%kx;hEa0^gIrL?4hM%1EG*n% zoBmi#dg{r*#PupmBT3a`sBG1wcg(U*3fu1}TyQ^a=AEqWD{D`@o3j0dSm1uk>MP09 z?#|rvs&eU5VT)}giyup+oZN8g{r~^}8E69(f3h&LGbl0WfQ$$EiGj`AVPb)Yj#U4N zB#ntGab~T{K3sUHu%xg5@WRX_4L-Ky33pTsc(|CSw776Iavizgqo5$_<)&4kBE%h} XBqk&%+@!?ICD+l(&^y7yk--`O`g>dB literal 0 HcmV?d00001 diff --git a/img/admin/previous.png b/img/admin/previous.png new file mode 100644 index 0000000000000000000000000000000000000000..980b4d664fea6d3849d58f84ef71bdf31a4a0cb3 GIT binary patch literal 1183 zcmV;Q1YrA#P);m^l?frU-&rw#CfAm~JpyXccIwAT0pBBRNQ!#qxGhx2;I@rA_hCO)8=wHZX26X6|%Y*xVu1{3e&kV!}ExzDr zPHWu|7$I}X0p)nnVL6-uKgsw zS19okdboA?AbP*bfpc1owkZ{FEQ9e_iWJ*~GSF*s??=x=_SQdFp=BbSH}#$*q?87b zfn>q*jjnAsTyyNL-^qaE)=}Qr$K}YdhLHGD!6HJgJq%rUGtfH41br%B6(^b_Nc`Vr zlyP`X5kXxWiuP#*&QB`PG$vaW=O^XpzL$>vM`{c#9$Pc@WARX!H<6K=RYe3<^%fS3 zrHoWGj3%=={GX@kh77HD6mU!?drf5XiU>z4gK_R=BARbWQGY!Nb)H1QpyxX#WUvgq zMF!@4iPxl-1)}!)+h`h3f^Fn5&R!LsTF<*^_#_cDDwxK&mBgpWN;kqfd;pC%-b2lm zcThc?AR25VhoEbXBm?f{#QRfDH(ZE;&69wt%ki*$6elXILvc9S6-x$YRy0uD9*xr< z9uzGl&V9=p_+tpMpjOhc59YoDqGV}ZaXkct)zZPPBV_?k6^ zIU09GZF|?mQW6y=%yHv%hV>;Bw(MRN`p!rgT#+op1PK?Xxf>c~)fVJCBKX5Pb$aKk z(6xm_X4)X!hK9SPRMl)nu05PLd5&-tIU}I4Zx?n;$=%dvG83A{oxI7l?}Dy944JkN z;WqW$whH}NWa4(-36abe)UJ>Md`@w!H1{ZAZpuh;*reghgJ2xzQh3?Kji002ovPDHLkV1nmPJazy8 literal 0 HcmV?d00001 diff --git a/img/admin/printer.gif b/img/admin/printer.gif new file mode 100644 index 0000000000000000000000000000000000000000..a350d1871536eb28fe2949936de1c79c1c26269d GIT binary patch literal 731 zcmV<10wn#3P)^msfbTI z9jQ^EwMRD5xNEm*sJPjH^k)@gXT@kl5ii6#6jNXX`Yb0kVgq(zut?ZfbRr+DS= z>q{33dTpWN$tl6c7nxE)4Qur1GCxuUnp5Y z5HK(>u&W4&EXz<>UtfnPivJ`O3Zb4K8yl-}7K;Uh5XR!-B2uXo6E#Dr&Ck!D<$0b5 zXEK?PNF*3;w;Rc15`MqGDN4rSaGd2kJ3GNmOiaM%^D*ppJL2&;mX?;95{t!PwOY^e z?d|R0=pOKTy$qMj1$rk8qtS@b(NQ*LUtb@(y1JlNtJzsS-`3U!Ze(Pn>hXBkfzr6} z{3Vv(2AlG1;RQN6I#_mYZVs)jt>6p>!_3go(6&ye1Mdo>SRyz&A^1T#%t=UROW6Bf zz^9CeqErU&3`3<-Da~6HQ^UW&yCT)$Cu literal 0 HcmV?d00001 diff --git a/img/admin/products.gif b/img/admin/products.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1036fe42b317b71547e310d53ea3bc9de51d3c9 GIT binary patch literal 1005 zcmZ?wbhEHb6krfw_|5v$mA}+Ba*j*Qu7Yzh-@CF>~h3 zS+i!%o;`ccoH=vn&Yd@J-ok|o7cE+}c=6&TOO`BMx^&sHWvf=LTD^Mpnl)=SY}l}I zg)|M~L=9MYr2pbG)TpDc_F4F4H) zKrRF22?mZ+4F5T0G#)jx@h}T(@f=h=&DtvPzw$=Y(k2IG=ej?_%4|N%mboo|eqU1KleCZwiCG!M#5&p3o6S%1^ZC>E-0D6( z37_~o-5LWfl~gJpJ=?_YP)NJsK`Q0$)O?{24sSzTZ;a{KUyi2 z=-*Nd%@OOO2W_U}dsu6OLkiuRIcv-CiP$om%sf1&-@czcdwx*>qIQa!dssYgj$2vk zJOZzkwr-KfwxuV>?)&q;&KbKz(4wg_Thf>oZTV`i8{Pv=c+Rv%Xyc8JtY1$5yuSb+#A5#XhVp zI1m^nP@Q|x9ubhT;>6A3ODjYU3uGR9y^xc5M?fCeKiH*h-tlru>g zAM+0&VjO2Ti&KM*LKe2B-5`gtRgXH826rAP(f`hdnxSeWXir+tC{9Fg0tWuMk%xs> z(N}d1o-Q>y6+93*Y_t@l!ZM?Vd8z^p?o!mc%h2<_4JD3Zq!cERn}CT=@A)`HZ5xcL zWWg|X3w3TKbQ2}GJy8VJ+aid`Jb20U{|{ED*8-2*byF7~PT#g?n}QGjQ*@ z9h!CuO2UfA5^@8Xf7YqiCEK9#1~FHn13k-UH;11G&RM<{-eQ0Adsn zYCMQz*N_o`Iep^K$zCHAF9Hy`0Fh$@LTUp%YY=H>Ak7%WQ_IWnU=aad6Vu;YQwo80 z4AR$t_*JNZ1IQTwvVXUz^+Kz-A08|s@S&q1#aW$Enar~}5=$n)($0l450-is%t|-t im!J8J<&yAVk$_)8f3g6Ow|qeW0000WD zt~R^3*7W`ctA|_kUvJZYu)*-*W~0YDjUVqYeX`s5$u9G!dw~q=C%bK*?zMcj-}>&p#~7e^D{o=$pktm567 zg7+t@-d`yAaHi(txw?<%>px%3`*<_u^Y!{qw@SZ1EP8#W`OW#xkLMabU26Vxx#jcq zwlCK^zTE8mdb{iE?e4F4y1w4&`F6kW>xkS{xCTws>Y&+0y@$5+9VYc2G`qp|jA}idw<|sR-?BJN}a>%XG{8otKr^l=_ z)Fk}4-Y_or5ReF5c3}eN0k@gPPDv{`4kz>Y%jWkme4MzbyO~2kNJL-*g9D#d_N5t& zk6XLNH2h}da42kOD?8y=eaf%;bb9~h(8g0C&8NZ|&xJLg32#0V)_OX;?My`T z>4^3-k?m(<+Rmo;pUj+cId8_L!ue+lrd}?beYs%4nc9`t>epPaU3qIpvclXft$8`R z3-k1rl$tLsv;OUVdv$}?#*WbKlalw$%0JuVd#=y#{KSCslLBr}b-Xjx>CQADa=tU& z|_?yRf0vmxWortG_$bM9@;zrU^E?xyMo zJ4+tzt^9DMv~lhA#&y>l*WPGZf3suvtH}r7tiSkq%jK`TuYcQf^ZUb{4UhJ>+H z*^!QC$2y;%?0$K=@4?BbFV9YVd3N&aOEcbHoA>#4!~0uHA70w`@$RZmkJf#9xZ&@+ zt^eL{J9Ovgp*z2h-2Hjv-p`}={+zh~>&T;D#~=JY_2Ad($G=ZM`hVup@3W8ooPGS~ z!jnH2f#~VqOHcn?diwv$v%goL|GWD9|F!3TuRs5P_vP1{FaO_u_5byQ%kQ4vdi?&^ zllQ-#e|-Pq)BEQiem(yLM1Nm={PptV?^mCGzXqbuzg~R$^YZiG7oY#V`uz9J=Rfbh z{(k@M_uH@k-hKJ|;oH9t-~WI7{_o@W|DV49|NP_k=b!(+{rLUk*Pnm?|1*qup!k!8 znSnu`K?f8Ppgh6A@t?uICSc0KgoC_H!dyNoO3v+OX=k=PoRG*O-YR!!MdiU~Cxy-Q z4)k1HU~pJUT{mJ)z(l52UVTZgWtp2)I45Za>cy;3NMv9QkvEzXSaiglUt^^~=B_Oq zLZTeYjixv%v3T@r&UQOQn6XSW{ig=~UcN1mUX?Zai1GgI+# z3n%wtK1Hh#4uN@roJJX)jEh+~x#xszF1!2Ep+m{1M?kV^;ly{>Dr6)bm=7hivCmeq do#oOQwA7zlglkR%g98I2;~`<@0s#RAYXIpN-sAuP literal 0 HcmV?d00001 diff --git a/img/admin/right_btn_filter.png b/img/admin/right_btn_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9b95f57ffb50abb792f647743f3ea64fa5d066 GIT binary patch literal 642 zcmV-|0)737P)Nkl(@2_X6)6!^j25&YI5kVDf-VkH5r+(JbrW5>#l=N%a}gBlDnche zS}X`o4mRQ<7$u~MDNWm?X`1A|Pis#b)m z6=8_vcv%&WNhZebuu*m^RWKxRyU+@$`3^}$nhauHhOHBXPN+NX!4AjOX0YQ7=a#e% z)e2@J*x#Y{K?!Rqfx}X) zeVpXf673%778)el9lePtK5_0U?Y>8eY+m+yjx0@Io=M7TMYWT7{cj{rMcr*Z7UxuB zskT}V03ZY)OauJ`fH5LbQ?*H>b8VLg@C;aeU4mg6kS+nE=c5673lKU1dk9iE>ak}j zh#vR|{)bZkX^-Yq4!n}4&*~D07^A`Si7r8qzj7sV`c{hs|-YQvit9;4r%4N5!m*1&db**;Ao%&UG|H*uuFn@jjf~}i3Z*E+Dy?O2R zrZxB4*WGMgf4^=0{hoC z>5@awR~&hU9XLUN^V4E>ei^e(IUbW9oe|;`jcNG# zsP%L=n@B=|$0G;F24(>^9Sw&Dh6ZLf78MBz#pX6nmfvv)91MC{d3?C!!wzpKJk-Eo F4FEvy0lokL literal 0 HcmV?d00001 diff --git a/img/admin/search.gif b/img/admin/search.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf3d97f75e9cde9c143980d89272fe61fc2d64ee GIT binary patch literal 615 zcmV-t0+{`YP)gNuvOO$0ks zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+ z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8 z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@! zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0 B3G literal 0 HcmV?d00001 diff --git a/img/admin/separator_filter.png b/img/admin/separator_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..088b28e18f5df6d97da2f3eb0643ff70329c582a GIT binary patch literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ep!3HGH{*y@rQo^1tjv*4^$$$R;w`b-s=rfui Z!BGA#=5W6CynjGx22WQ%mvv4FO#o-Y6Z8N8 literal 0 HcmV?d00001 diff --git a/img/admin/slip.gif b/img/admin/slip.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5df19aaf2db300b653d232adaddcc758780a56a GIT binary patch literal 1027 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 literal 0 HcmV?d00001 diff --git a/img/admin/submenu-bg.gif b/img/admin/submenu-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3de2cfc5edbc2c7ad388aef0d1975736a946972 GIT binary patch literal 52 zcmZ?wbhEHbWMtrBn8?8J=GDCy&#paveDU#vvx+}i7}y#9Gw3h?0Z5*KiM2&u(I}X~ F8UPB~5U>CM literal 0 HcmV?d00001 diff --git a/img/admin/submenu-bg.png b/img/admin/submenu-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1cdb923787a8ac533af6f263e8cecd0ba7b71f93 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|*!3HFIc5Iysq{2O2978nDADwWJw;_PTS^n7H z>xrUzJs-ju_@(rp{ckXw7|fh|St+@P<;IR@Y}ILgX5E($El-O0n0azPSJ@y@8*xxT%n)TrQT#!u+p00i_>zopr01wzTl>h($ literal 0 HcmV?d00001 diff --git a/img/admin/submenu-bg_2.png b/img/admin/submenu-bg_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1cdb923787a8ac533af6f263e8cecd0ba7b71f93 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|*!3HFIc5Iysq{2O2978nDADwWJw;_PTS^n7H z>xrUzJs-ju_@(rp{ckXw7|fh|St+@P<;IR@Y}ILgX5E($El-O0n0azPSJ@y@8*xxT%n)TrQT#!u+p00i_>zopr01wzTl>h($ literal 0 HcmV?d00001 diff --git a/img/admin/submenu-configuration.gif b/img/admin/submenu-configuration.gif new file mode 100644 index 0000000000000000000000000000000000000000..659aace81c639dac0e3905c1a6d792c94051c20a GIT binary patch literal 280 zcmZ?wbhEHb6krfwIKsf-=jV6k%$dD=_by$!w56rx-o1Op#l_E_J=?Nn%gmWGv$M00 z9zFX0{rhXzuBD}=O`be?_3G8%zkjc(sp;zKVju!2{$ycfXAor20jUMq$-p`_L8Z^< zvP|+Sw&RT*Jyk4@TSSg_^PH{_={e+-(Bu%&5%;9P*wWXeGa)470!wF0!bS%lUSu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/img/admin/success.png b/img/admin/success.png new file mode 100644 index 0000000000000000000000000000000000000000..9c941c781e35bcaf882c3fd4b3b5deeec0e83bea GIT binary patch literal 1032 zcmV+j1o!)iP)ByJJg(;2z z>ignXs3s$f01J))X|+-UY$qG=D-es00dnC%;mzT%$eu< z-57oVledaYnI<5H0P6bSpu(2t_}*ZiN=}hGoXv+bq5xHoNX6Z|E}{S`nEV09lbz;r7-%j3S`PnTElAmdJhS`rxhAoho@6;q}+( z`rUJ`VnT;7&E~^6q5u_$06Ksv0%!n%xMnS$04AIOg{*xU! zZ~3v9+*MPc5>3i%oLdq?y{i0EmxX9>)-Hw_Wxk&69OvFZ{^OhZPc2kD=Qh+mb4l>GNYdm00000D;?To<^|B9bDXS$35y?NTB(B^%P%XkxK7CDzAU=fZ_3`Iue1Yve}CciH2@ zynbh5hK4n#o|-u`=l7oToY&=Ul}m=>xy|l{Ec4HUXoh)bPg%#z32UD|W^Iup)-rj> zd=bXPzeMEvjw`s7ONG~Om=l^ucT=_iQQ0YVLrG=}@JBDiq$6quw(J4ExwP?7No6uq ziL2Ma)k{9G0%Ca{TFml(In4tLXS_Fh!kZ=zI9zCO;jscF)d(0F3^qls^G>i0T5Pfe1(YN39Q)z z;KK0{+-Fa*^OZc}wIL6!aMRMDeQd3T)3e9KhojfpE1$RGL@BYWT?S7HDF N002ovPDHLkV1fg%&-4HQ literal 0 HcmV?d00001 diff --git a/img/admin/supplier.gif b/img/admin/supplier.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5cb1f263cafa5c94545520fd8d7dc129be0eef3 GIT binary patch literal 266 zcmZ?wbhEHb6krfwIKsg29|+Ez`G02S|CvCPb_U1;@_A!vh=Dc=Ffg#T zD=74(WX@Ar$m6wI$7{(HuZ9~;N-7>9Lc10?Oq`t3BXodgsild8)KZrw$Fx_A!vh=Dc=Ffg#T zD=74(WX@Ar$m6wI$7{(HuZ9~;N-7>9Lc10?Oq`t3BXodgsild8)KZrw$Fxa+NABl_R3_h0W#{{Q#KtJB%S-(Q*h{c+3x|Nnn~I`i#L_Rklyzg!Q#y~X}`9|;OD;~F}S$({a{pIfR@7G#>zFhqM zVZ(zx;dj>B-`VW&=i7}RPkP^<(|mcL=*5NR@6Yz$o8tBB?WT9<+8KrpQ2fcl$j+e5 zpaXI;C{7sIr#C1!HMg|3wRd#3aB=qbatX6fn$)b(DkVQtUcgDR$yU@}gr9ZdWOh;O zCL3W95neGd2?^b;QnpRfQi^VljLWA;H?b*;9uu|GS2ENSvOA*8CTe7$pk~jZDx}WG zeL<7m)$-ICbrV?~70o77VM}|fr_XhmRZN>)WX#P)jE#ADC2njmJkq>?o5hA9;>3hR N7RD|mFCG>KYXEG{&A9*o literal 0 HcmV?d00001 diff --git a/img/admin/tab-contact.gif b/img/admin/tab-contact.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f85b96600197d73fbd783c08a64af98ef9b7e17 GIT binary patch literal 354 zcmZ?wbhEHb6krfwxXQrr|NsB*-@m_q|NhytXZP;iyL$ENk8=w?pO|yz%$cJ{kM^GV zbL7zao|8ZJ?%msd@cq`UTYGoE-?3%kmJOTAcYa>Ke*NUFM^kqHFW&m5Va@sCbx$(a zKC4)DrF_--n6=+`&TPzB@np};lIW%X)qmoNfr0?fynv=D0U9>UH`avBmS7O+ z6Y5&5!JsE~k@La_EgQ|NU4bXeZswgl$e_h8*TA2{!oZ^<$gL*K>f6h}-y$s_rmQI0 z)7UhDK~!E$Oje>NAWkUFyO){CWf=oAM~f>ff0_s@2L}TuC-2@y1|bn%uOmks8LR;x C0fcb? literal 0 HcmV?d00001 diff --git a/img/admin/tab-customers.gif b/img/admin/tab-customers.gif new file mode 100644 index 0000000000000000000000000000000000000000..2194c59dbdfb95ed058b5a8a7c7ebbd580f939c8 GIT binary patch literal 587 zcmZ?wbhEHb6krfwc*ejGVkl6u=!|vw8msi_ch@&8&(?W$X4RHSg$u;wc_2`WfKa67S<O)OxmKl} z@Z!RdmbI7XrRrRW^7JZSl3>ced+XstlhV>=9uMx_zy8#t*O#|BR;@c(uJ?9(?TaJx zK7Rd~)3-i<($1b$$GtoEo?TG9CDy6kgFnMU==+s*^Y`A^ykXtkO{d~4L|$zwFKC>4 zzR|eYT+q67MMa?5rFj3iiiM8#n=6){`*CKrSM$~v=Qpoyj99w=#{1n(8M9A3e(`o@ zML@ib)Z3GbY%12Ct5Of|*;}{j;ZJ=K+P5{h@V&pj z=l#}}zSXC)odg!`ybxg_{p{M-+|)BHmWd1c*9>ifi@Ia0)R{;&PQ0)evb;2v-vq=azRca54xAv}g*ja+VE> z;+Jp@S5?u{eB-Ig>&&Rv(i3=Tp@$G}lb?g8;u7XP+1%~VeR*Pru`3@|2J&e|EOjEV%Pr< z-TXgx|Nqpc6D6GoN+v%^*!I6@-Sf0F|NEmHCdN3mRfJ7VbeWauJu}09a%JwaN{1yy zAuDPV*VZTf)qd2`6x=bnW^P~J>Xw346Kl8kWjCG9Z$Deucdm5Wxw6UUE9PCOzT9GZ zb&kRP#Y#_?N<3X_{A`WYu}NO{rurV9o_%;(*^vcR#}-#yTU>N)Y4x*N-j8MnK3`Mx zY948s#Ib<{feEQ|>x&&f= zJnHS27pSjEwD`a=K`o={&kM)E1%jrTx0VDdFL}(Z<#BCCVshKDLk1dNa|{+Xc}l9g zNC?yvH?{Z+8O=MA(V)uJ(x@A>!{dV|f;lh**UKGxo4BGci~L0C0UEUjP6A literal 0 HcmV?d00001 diff --git a/img/admin/tab-invoice.gif b/img/admin/tab-invoice.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2d449b1d22017cb14be124184f2ced10afb1345 GIT binary patch literal 997 zcmZ?wbhEHb6krfwXlG#XEm|H{y&UKoX zi<08M+K*b>+S}UNL7)QyIy*W$yMUm(ySt~Sx3{;aw+{&V`}-$?z@&+jCQY6^dCHV2 zQ>RXyK7IPknX_ijnl)$cyt#Ad0m1wQ3l}U{uz2y}B}C&akmoHzxe*MOc8@F!Vx_$fhojZ5#-@pIh!GnhnA3l2Y=<(ynPoF-0_Uzg7=g(if zc=7V(%h#`8|Ni~^&!0d4|Nmzg1tT>C6o0ZXGcfQn=zszMlqVQC4lzh`$arjc;2^CR zb)Z90nXN}mJLG}Fk3(HYyCp&eViH*!j`z#0opU2YwV{ELl~2J#;D8rbla`l|!2+Yk zrfC`pVTMjF924a2s@@cM8nlW^N_A~m!O(J$NlTf1)`m+doRgGY+ITpVma;esg=G{Z zC?zusiA${LQII&~C8FUs%OG$POXpMp7VC(ej7(m={Jv=g3m!E-VAT#@=26N0^rW!1 nB!}07h0gAMr)N|~D4a+<#LOY6;WI(tVI#93Td+6}2ZJ>Ly?OaE literal 0 HcmV?d00001 diff --git a/img/admin/tab-orders.gif b/img/admin/tab-orders.gif new file mode 100644 index 0000000000000000000000000000000000000000..be9175d6f9cbd54c6c7346cb43c21edbd97e6cc5 GIT binary patch literal 265 zcmZ?wbhEHb6krfwIKse?mX>z(=+UK1m)^T~ucxPH+qP}*-@mV_s=9XV+RT|VfByVg zQc|*a@7{Im)}1+XrlqCj`Sa&frcC+&|9@6i76TDL@h1x-JA)8|4oEG?P6pPt1uA_h zne&_`DL9@saJ^&FB%m>2?VB2XiH;WKh6WZk_hSnhGECT&+zuRAAjLJoO)pWvaB6F+ zuwsFL$l_yH7hL61=w#-6C}F{x(jMUFrK-fj!r#oxt**w!T_eQCDA>@%&(7V}ro<;y jHA9()okv(XjhBy!eKI#^U$;^-qY4iLL;GeWMFwjCH11XL literal 0 HcmV?d00001 diff --git a/img/admin/tab-payment.gif b/img/admin/tab-payment.gif new file mode 100644 index 0000000000000000000000000000000000000000..b91777ebbf9f6c7f60aa7e348ca0af737d1beb04 GIT binary patch literal 383 zcmZ?wbhEHb6krfwxXQo~INfjAg~j!|st!LnP`oLx|47%f56{+|U7ffn_SVZ=+a7J2 zer8hLmg>#}&7XgMT7P%dxkqQ0-C7VaH#Bp3+U#@FrX8G8xwWKiU(=TR>lWRZbL#2w zIajCN{d_ZTZPxqm?>1gt*Sx>BX?uOpOuw|XNk9I4?>^Kv@o4wTJBwx>nzrlSwzADd z(euOazq@3XD36`9iv4j4Iu|ISLB- z%DT*&N__GPA`&dplKf&~x<)KQ?3{c|Ox*md#gye)c{JFZ<@H$9)>w)Oo9Vc-F=-l# ZF<7vNs+bzfDsdjXro$s}&B>9$8UUwL~I45F@-<0!RbFWVM_UCKBe6Q>+DNV<#3lF43EDLm= zWZ!YBDP?nP&FP}dJ+TElGZx>N;WO1UX-!P^q0*kSEeSh9v-Tu5U8tzsUpVc0pW{T^ zhI6GJ(_E5wMJ&5HyZUH$%&O2S=UNtApBb{)&#~VoYHL8ro*dsf?hMobia%Kx*%??F zbU=oI{KUZ4b)c!hLr2O~=J<(>CpC5)X%mGdd6r1@92S%i^iw~P`0I-h$2G?lFFITV z8e41(14JAdSseep2p$tS z*4>$2J;|E6wX?4;O8Ry;`_aOHw-?HvUE9PkIDq0$7Djdk83rAYb3k#zz`m+Mrm4B5 zRfbQ?w9C}G*V@FyLzYiQz@^GTRJi8=o1A`>v;#LMuIR}Lq8jA(mIEC|U SECR9w7zr%$cdnws%gMw`0eSXV0FswzifmKan(H%c+~sV!PIV z|NgzFr>Ac7_2S~C3`^aWgt8a`#WsVp;}#WV zZE6u0>EJ10>FJxijCHc2w8-R^x${L9vI+1xi%(d_zp}pDsfveA$L}@A3J?n>TMxPEI~@ z8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=WdDlzEXk$gpqzC`jt^St~+GqcEZQpWp z=js!mrtE#+z3KJRz3&yBivOpjIn>{(HmY8AaovGprvQVDr?lrtrlq`!0g{;#?`9qAm`yMDr;cC>Zsys$fRT` zV9YILWX5meCgJ0wA#5e>tgI}>#p*6*praukp&+CvWhtoZ=;q?WZx>o-aiDNf8=I~z zUqXZ7QWjn&g_abD56TYR%o33$iwju}Ow|qxllbxBA=^|IyBYz81D}p^vl&>LapckkY9JM*?12v*!! zzI=Jtn#Tc6R~wh!ub6jl_O@qh4!_!T;%)JidlNT2`Tzev166_IPZmaY22}>_xpP{!W;##QSh{rS*|W!O zx&`08dy%owq<&Mv)C2Wv&Q5;z?C#pNYrUr$8@7oYJ$f{HzIEav*TCsYOHTAS_ls4p z3%Pvxtmj0T{@ul!Hf?(P^l8#u!-h?f*-M=sK73fb%FnEw>&%%m*^6wZ9c*mbni{vj zX~EIX-ko{NPxq_Wvsm|trY><0o38HOFZuufe+EK8@h1x-JA(;>4oD%$PYi4o4zmh8 zbfo%EED7TLB{A>9iWZeA8cH|TOq(pA#xZq6L`|2(9+sm!ilkaB78t*+=9>RbeTv7i z3F=A}8XCNc(t4`K>1>QVy*#`E6ZPbD4AlYy6a{p3wfOin#q`}+^(1w4*fk9~+$ChC WxW)Lzg}qG-w6|>+VQ_I|um%8vSAN+5 literal 0 HcmV?d00001 diff --git a/img/admin/thead.png b/img/admin/thead.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c871b52066da58241e54a5a800e562491d7509 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^Y(T8R!2~3OIAkJ$RHUbiV~EE2wG$8W9x&ix%A6`{ zoW=f1p>>aR#e!9JN*0N~cf9NT&cm@=l}@PJZCgGtqgW8Iy7#{9r@+_Q(Ad w>rZ`H7|;|dux8yUuS>@jtp414-Ex*`Q+C>K={r0}ftE0My85}Sb4q9e0NKhms{jB1 literal 0 HcmV?d00001 diff --git a/img/admin/themes.gif b/img/admin/themes.gif new file mode 100644 index 0000000000000000000000000000000000000000..bda9d7c2a7862c83731a62e6fa65a8b55c810e55 GIT binary patch literal 997 zcmZ?wbhEHb6krfwXlG#1PFbsyzFse9lX2b_i{fp*dCUFsm-*$d@Gn^IU%0}*aFu`2 zT8FajUNyUXYIg+`tqCt%8C9_+pk!lU*`~mj^|aK$ge(GP;;`d=2THF2o=|!F0MOW65hD4Y{KryrbCe}2cz1KM7JG{YdH|r zaXh-~L`=`AxW3cz6VAj>IvYRvTx$P`#EGX9CZA25bT)bN+3X1?GN+!)n0}#T{@Kz6 zXUmsdty_Abe&vmSVjr59U2I!)p=HI@&Q;gC*Ie&jcVph(hYPmdo_*x)oFi|S9(ugv z{L6#4z8t#!<^TWx45MI}hJfNv7G?&9AO;7QVtiPWlMY~o3pUp zJYn3!*6463rQm`B4~LjmzzhjNw&nx!i4s1F0%@+jQbq|K9LbIg`VE*DaBxgM#1Vtk3k;Qyb@L_4aol;h%`-;GAYo6zMnxZ{M$0=)9k-oaI|bw{S{xMu hJkR$EvScm1^w^1&OGr$^BH#c6iws+^Fb@ZVH2`Pf=d%C+ literal 0 HcmV?d00001 diff --git a/img/admin/time.gif b/img/admin/time.gif new file mode 100644 index 0000000000000000000000000000000000000000..f15768f1336a06d62e156e19f94f304f34fb15a2 GIT binary patch literal 618 zcmZ?wbhEHb6krfwc*ejmz0B?2)%iL7#}BWnTC-#CnK!>SOp9E1<^ADJvu>Z?R#w;0 zzw+X~Q)iw(x^wI4^C@%Z&2LJ2@#p{f!&~;Qp0arDhWj^2={tAp#k-e}FCAX~_|vb8+Z*p*-c~j1Wc$jSJLhB{-MaSd zmaKKl1tO*Qsl+RxY}E@B8<6FCMJw_PcO!;(^;A?!EnZ zc2CWsZFk;%_;7CboKHV~Ebq=Jop|Kg_y0G}Z`-%HV8_wZk8hrszWL7Kix0b&U7S}N zK7I9}J7=anynEpNpZ`Gc?)AeLkMCW3{PEnDns;xW?3$l@<-q)DB|%GCV=C$!uAJC* z{{H(LXBM8@)6zQc#E!#Eym`_{kw_N!;@ zwU%Yq?|=P&d3O~9xj^wJ3nM#&AA=6a08pGTupe*mYie$3Z8Z&5Q3(pNHEr|b%yA8{ zvC&luiEQQc_Lr10GO|_>)tKF+sAZ}zl`1YCXf5RwuGnPDxxmkcPiMcIyR&c;v#xcZ zjv;@%9gBsBl6{kNut!FMPJ{@TOR__nXOo7hm~w`t9#@JWE0fP7KUr073rA%GOTlb* zHFJR`0UnDYC8x>F?CAoA9~7@n)s^te`1sJdTS_%%jf130<6$s eJP=ar;gi<(lWO|Jc&JNMz|N%M$mReA25SI>dNZp4 literal 0 HcmV?d00001 diff --git a/img/admin/translation.gif b/img/admin/translation.gif new file mode 100644 index 0000000000000000000000000000000000000000..af91f09a4c9b8f1d5a19ddfef5604e2a3a557cf7 GIT binary patch literal 919 zcmZ?wbhEHb6krfwXlGzxW@ct*XXobT=HcPt=jRs`6ciB=5fc-WkdTm+l$4g1mX(#2 zlao_WP*7G@R#8z=RaI3}Q`6AU(A3n_*4Eb1(b3b>)7RHGG&D3aGBP$cHZd_VH8nLi zH@C2`u(Y(ava+(Vv9YzawX?Icx3_n2aBy;Ra&d8Sb#--fbMx@<@bdEV_V)Ji@$vKX z3knJf4i1iph=`1g3~$?>JMCcQyrV74PR-hOW#jR?d(J;Pe*O8S`)^*p|N8&`e}+*o z8UhrDfZ|UUpc(%ebU-G7@&p4%2}3o9jK_ur2b(#H-#BCxwDmR`CF}@DT$Io!Z7gOa z@?*lW!*V(S6MigcT+kHLziHC~LtsJ}}G8zU9nui2r^n5A~C^RxMF)=Z0@cNeEz+epkgkWV= literal 0 HcmV?d00001 diff --git a/img/admin/transparentpixel.gif b/img/admin/transparentpixel.gif new file mode 100755 index 0000000000000000000000000000000000000000..b7406476aa46e4d98eefacf95f6d3e8c5439e330 GIT binary patch literal 43 qcmZ?wbh9u|WMp7uXkY+=|Ns9h{$ycf01D`U_#hbuCMF+725SJnmj?g< literal 0 HcmV?d00001 diff --git a/img/admin/unknow.gif b/img/admin/unknow.gif new file mode 100644 index 0000000000000000000000000000000000000000..27491d2f922ead4f3e9c7d8931042b505e5761ad GIT binary patch literal 1227 zcmZ?wbhEHb6krfwSj5WU9hsO>T$7Yvo|s#flvmCG1B(B-BYXoCToOwXfwYZ%ML}Y6 zc4~=2Qfhi;o~_dR-TRdkGE;1o!cBb*d<&dYGcrA@ic*8C{6dnevXd=SlxV%Qmue&kg&dz0$52&wylyQNJ0T*r*nQ$s)DJWfo`&a znSp|tp`M|!iMhGCj)IYap@F`Ek-njkuA#Y=v5}R5fdUjL0c|TvNwW%aaf8|g1^ zl#~=$>Fbx5m+O@q>*W`v>l<2HT7t|lGSUUA&@HaaD@m--%_~-hnc$LIoLrPyP?DLS zrvNfBF)6>a#8wIDQivCF3w(Xy2Im#)fjy*`oS&;-kyxN_sAr&`n+x(6SaoqpP%6S1 zSXCE?R2HP_2c;J0mlh?b0+lPnGy}s9zeOO0K-XCL7i9t?B{9b(Ke;qFHLt|e#a0O@ zqnDDIVr5`rVPI%zZen0=WMF1tXy|BR;A-LK>f~%`X>93cU;;A(n_hEsH&-(YGgoI< zLsvsX7dHzFBS%L^Qy|aC*wE0(45rsJuec;JFF6%vZzj-Qs9qPmdaay`QWHz^i$e1A zb6_bTAS1sdzc?emK*2fKRKYhfIWrH$2SpFWw=StgnPsUdZbkXI3gGay%EV$n(6cE1 zwsdxJbuxA}HFmWyH!^cHRf6hGAt%iAfsWA!B@U#-0uutJKoAq2^no0B=1I*1=9nU2 z)?obq@9&@AzkdGs{_X3R&!0Yic>nJ0o7b;izIguZ>66Eg9zM8#@9v%3w{G6Je(ma& z%a<-*IDhW!nbW6Eo;ZH&=#j&R4j$OQZ||PnyLRr_zHRH4&6_rESif%Vn$@dTu2{Zo z>5|2Z7A}}SZ|F(<6Xm4w6X>Mw4sIRN7sjjN5C@(85 zDK083$j{5o$mNlr>kh>weniH?el2oDPl2@VPj@b~le@%HlcaCdWcadvWa zu(z|dv9_|bFgG(bF*X8bOFdm3Z7od=bv0ELWhF%gc{y1bX(>qwaWPR5VIe^Qem-6v zZZ1v^b~aWPW+p}k2F0H&K$4X~2UOsI$|475gNR*sxOh2sWH5?MnE3Yd{NhA;kGRnA h&ea`rb2yC(q--5K?DzyCv}PBWteM)kF@=f28UXBKr=9=+ literal 0 HcmV?d00001 diff --git a/img/admin/unknown.gif b/img/admin/unknown.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9ef51c1bdf7103f053fd3ccff04bbf34dcb5fd0 GIT binary patch literal 396 zcmV;70dxLGNk%w1VGsZi0M!5hM02aAz~g$O&(-7ao3ztrlEA*x=i}<~UWm5K*y*** z;)<)&?(_I?n8s3lvAWaoxz6UHxz^$8^L?k)UWmGswAsbj?9<`z=a_q@;MS%bC4)#uIJ@2S7q!`k+EoXCWw$z+MOt;pn)ug`_6*GF}(>hk>7 zd4;sg{I5l?fgu7 zuK)l5A^8LW2LKxYEC2ui01yBW000K5z>RQ7EE;<|8jbWa3R%pT^wpa6imb;=6i}%; zmR6uS)LOn02}%GNbQr=`OEeJ>>lTYah-!5*84?P61{xI?3ql<&0vRze3Je%G1vmo@ zLKTb}oEs7{FfcL$1(_EWj|Hj}tUNk0LLVO%4WS+$2)Ph7H9{UG2@o$0g!@6q# literal 0 HcmV?d00001 diff --git a/img/admin/up.gif b/img/admin/up.gif new file mode 100644 index 0000000000000000000000000000000000000000..67345103c2c56780647290326f0e06473b3b9150 GIT binary patch literal 55 zcmZ?wbhEHbsI*;I@367XWlNpwx(3Jfjm{gJT{pJ6Z*6hk-r~Kv!+T4o|E?CF9o8XUL8T5j!VFZJ(Unc(|hRP-XMs>h@!`2m2zA^hF(?8ggP<#K~Dv zCuc>UnjLp+Qo_ke38$u~otc()W?tf%`AKKyC!e34dvR9I<+=G+=Hy|?X&6+iP_Ut)x=FFWtciy~t^XJcBuwcQ$g$oxgTC{la;w4L#EM2;^ z<5)xQiIz#HJExuPoq4W*)`f}lFHO0+Z^f#E-c4#?Y}Ji);6li@$7j7PzORi^n|T1T$9O%^p}VlBKdf$=aacfp;UqOGgE zBpapKc(p=KOi(mi6E#ywHMQpePjiHTQOS!7vqBa-w00eGRcLck@R4z9S;3v{W1tFdNfJZYqHAL2@6(uYuZ&Z=t>GLx+JD!kdzW=*x03E zQ_p1i@u6alims8DNWzsTljm9$PWbX7!NH+HRE5JJ%cW)V9OKNsHv%4sf=!IQQkGnk zIC&)u-HJGR4!k&^sflZ4R%;EXMk0jSi}YZ4-^>ybT`?3P^d$p*P@{{PU`6;~Bv?VE zL4mrd)9G}&xlgy+a9Tpnrr}m?F)_SwkLq|%R8SW3=_cQX3M2$C1?vmJ3;#{s5sw^P69Q7Y9Bhn(RmnZF}fqrL(og0 z351qlfS`|uK>|I&Fab+o2*t1fY$yi8p%Y1tOz4V!HWILXumoRJ;%@+ z4NVNRvCzgr9|^;87^A>)jDaozLy0h?z$k-R42u|}kuc@LqJXs!6Zx=R#KZ-R7r<5w zTL~u1@V*N6>zJvxZkp)kYr6G@Zd>X07~P(tJJZ}~|M5>QkXJun#ufXL zm60kJ+RMgf(#)qAnOo7QFE}tKwlq}7dm;uce2*izhCW$-c`oR8_ax;Ny1de*FHPj)Yg5c*MabWisYzO}|-|AC@9$Y2M33CcfzE*{TvIyJH!xVIwNUo^BPEWS@NY d&XREE#wtI)s<@%lTh#gY#4Kq}hC1z1-5)pmQi%Wn literal 0 HcmV?d00001 diff --git a/img/admin/warning.gif b/img/admin/warning.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4316825ec00c16f0047334aab6eb7c318b89c18 GIT binary patch literal 581 zcmZ?wbhEHb6krfwc*el+9|->a{P*Ym-(O$<{(S!T=i9$O?)~|8lo_2kGu;$DC6`$^G`gTA0b*5JEWEt<#0?tF(YzNYr83sL2 z{K>+|4s@js$fck-VPId>z|hp((%ROft=`@yB_}7;-OOaj#AVDhkwHbAnMGcCBD)Er z01vARm(H@0P*||Qk&#tM eOu+GoOJBR45)-G1kb?=;mn_BkPUVgR3?qZqi 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 literal 0 HcmV?d00001 diff --git a/img/c/2-large.jpg b/img/c/2-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d3d24dd90da3bf4c64996395ea3d44784651d6f GIT binary patch literal 15694 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 literal 0 HcmV?d00001 diff --git a/img/c/2-medium.jpg b/img/c/2-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9692889a042e174cc092fefb846792d6fda19f1 GIT binary patch literal 2560 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 literal 0 HcmV?d00001 diff --git a/img/c/2-small.jpg b/img/c/2-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76c7df8e783f2e4dd8483f9eff0fd4f74a54df71 GIT binary patch literal 1380 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox{#0Q&N)$F}wFrX@yoZ0brSJibj>zsd*%Eo`(9x#F=WbmO(Rn)cN<@U}eY-21n>NUJHnnx_eR_CZ_B5{_ zKV@Fa{FM980JK?AkO3HcjI0Qc0A0__A}D02pi(&T;0LhfK!@2g^6YK>HqXFf%ERVv zuN=V{vunTqKDEx`d{5PmFRS>2mEGEQ)C0|v5(Mc-_yZKzf=oh+3SfhnKnATcOLg42 zVsh}31Fs(gb?5;7&dAIR3|E*V7@3$EfG$up6jl;ZNW91@YUCJL*tl>b#4(HvZ1zl_ zoiDmhd{QfWl_lu5Q(J=9o0il4~FMhpEjzqL=hgrRgs zMu__4+iyLqg;*P9CT%J*zx~U!qIjEw{8@`hx206ya(@?nv@gE+u~n^|Tc2Uj^zC`? z%6W_03f*RXH+gmE<3ATf=Qz#Wwen?ak-SHP zU*u7v;#gh1cI)$!@8qv8G_UVmet;`zuO4^G5@q9git`^b7wvmIy-xJ$ErmBzLcQ0Q+|=_npTS88m^fLOkkSyNAcLY|pktvzV&g<;tbvk{ zz=R2T#;;E(w(I7cbFc$b}5jB(3>!ta6%glFcxECIuRKBzS+uEHOAzKT~?n)hGuqrH`dGF)G zDFtm>Q7)_F4g~UjdXf}8VU_p``=a=5-i#-?_gl2Snc?ns-24Q;^BxJVWQ=0>^?^SQPCS739np~T3Q#B%V@><kzjoa=lko29|7XLs4> RWXAstVlocDZ&%rEo4_ufChwZ7_F-F?m}@4cT> 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

    eCGjA#!vUPD!y=tMgx$8_OXs_jr+hkcdtGe&J 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 VFKI>yz^{a7K?39PQN$RZ|Jg5)IavSz literal 0 HcmV?d00001 diff --git a/img/c/3-category.jpg b/img/c/3-category.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf93e8c87145d9a12c440a16c7d0fadab73e9cfa GIT binary patch literal 16989 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 literal 0 HcmV?d00001 diff --git a/img/c/3-large.jpg b/img/c/3-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33f929178b97f2bddea3f5e636fa6dabe2f77cfb GIT binary patch literal 10597 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 D@*$Kp literal 0 HcmV?d00001 diff --git a/img/c/3-medium.jpg b/img/c/3-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45e6dc0b53d91b3c67e80c3469796b272a1b5408 GIT binary patch literal 1828 zcmb7EeKb^Q7{7OBZez?0_l}tclbAu@u|vzQ6{eC5mG8313boEgOSNpfGiS5aNo0v4 zwvTD7P>m2)kC*H= zD1Wp2W(bBM2nG+N`5oE_;c+AF!I~z> z7^FI9&<6u)Aus{>nE!Er6F3;J>4qqH7{Z}=6mT3#1G`2EQd!F~m8E>;RW&>vZ?&be zxJubrkwKS7d5^5hSL@CsXYD_$Gt``~%)Wd;E^K;Ddt0v(7SwqhcKxh%ERE*u)O8Kq zg9kx5C@eF_r%D_W3Xg0hItCpHJ3=nuxpuT`y~o{n%huj`snsQ^TlU|JH|L0B*t?4V{`+TRp_ z%Ng#I9<>?}BzStnv2LAIW-Bz%0`edJS~v!q;n*mLJ4YU;Mcz)dS1xVYa=%PT3I&)? zQ3wYi5P?J@&4+_=5T1b14A>klg3`@D=6RX^#2!g3kv*NS<|1dD zdbCa2lbjS)+hEx)%LznU&+yOH4E4vmXYPdQ7F;l0D95tqqYK^J?e&O|ShGJM~65VQ@6_Zp3fy z$eWT$~zHVtQS zl?P5*rEI>EH5=P132&usYRr&(-kovc`r4)XHs5{ueMjf$$gwx%nF|h4{68&*>Z>Pg z9bBbMzfLCCb27m8ZAMWCvD7x7ww1RsYsDJop2^-9hJKFgGR2aR^-iL9$^>eVw^P+^ z>%{5u>3(0C?=Oz&Q(haKGI&0T4UxsMUEz6_-`Se5t>qWT7|O3xE;YxnXgVJ~9&gAL z?F>8@nbzdC`n>n5xc(gs;={QXTB1N9uvYI2{f8lp&Ec2xO9o_or={< zBxJp*^>;pzPn_c|bMw0L2RrXim)Rs1vta3|vOBL_zM77_YC+Je_O#-CRUVnDN?j~2 zyoYZowUDheS<%2w32rQZ|HTAFWW;(>m}41pTGea*Q@x4AZ;6|QBHXg3$=~&zp~{xp z(SI^^-y?ft2Rspf(=Q5HzM@m;UW+4ji#8y+HMJ+`iMuSTt7`&xpZUCo?_3`Co;b8? z$jsWIf|XI7xx-+V-+HB#VS7P4+4DaRNULo0)o+fk+MJ#S)cwv1wt3Z~{hS+pP&c5O z`56YUxw@fdJny-3X+?vMvBOXWtwhK--L{JSFs6C`<$~()Df-oxY*FP{dv(*X2hT#JDhrY6^I<_%8K*hd zz&hK#5KS|K-i%WY4p4`Uj|oNs*4?l-5ARTT5C^0`8u?u>zTuG57i-~oJagarQ`GUG zU_KHkKxX%*AJ$LGC2S(>yOPhoFyS7@Ur0j+c8K&9m{+KuYHGl!tvi1&1p<)C$Ko!(`-LonHv6 z`H}dfq{+)4!(Qwm?bv&d?&=~>%Z)#sXjX!{t()B+f^PBkH1zwF(oNqGI`tlmfc!7M CU%9pb literal 0 HcmV?d00001 diff --git a/img/c/3-small.jpg b/img/c/3-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..981e037f0d768ccffedc6c03531852a3cac902df GIT binary patch literal 1176 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 literal 0 HcmV?d00001 diff --git a/img/c/4-large.jpg b/img/c/4-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f752acee91e7baff3d56e909fe9f5cbcef2b39ce GIT binary patch literal 7716 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 UErrWC6k8co!~Rs4?{60V3)OjlI{*Lx literal 0 HcmV?d00001 diff --git a/img/c/4-medium.jpg b/img/c/4-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..945480537ce797e6db3f77ed2f0ed613e2e5c110 GIT binary patch literal 1683 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 KL+(qgxBmehbb%rO literal 0 HcmV?d00001 diff --git a/img/c/de-default-large.jpg b/img/c/de-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..dcc29c8f14dd0455ddb3b39d3176e4f521c9933d GIT binary patch literal 8343 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 H`uu+bgPCz+ literal 0 HcmV?d00001 diff --git a/img/c/de-default-medium.jpg b/img/c/de-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0ee666461c87378d46070c5c514857386e472c1 GIT binary patch literal 2010 zcmbW%dpOkT9suy)%x}hR1~X&EZNeCXLdk6;Qphz7x=6#O!nkEC2D8}`ty{{@Y-pt{ ztxIx^K_fygAxRTuTnm&5rgw=RD8Zf6h7I_xpYSc`wiR^SsaVZob_d15i$O zj&=Y90ss)v05-n@<~AO-R!1lvdkHkZox$h)X@p3FUAqa}>ES_PG=ig(J;BM%)}9ba zHr$~{I8Q$n8Wh1G>?4@%mf9QwYyc1n-AYlwL7bOr{Ogu^AV(gy?uv{u?g99kJ(_{MDZl5|ffsSijs%&&a&>YgXR9-}4I! zi|!Xctg2?$)Yd)Xv^;HXYwvj0+4YM1x_{u!+d9 zTo3^KizS->g8hdJEpkC&Fc2ob<$^$?LJX#Cu9 zHB5BazBXK?5}1%)BRZoG3BF0wolNp5sn z|6~jqcK3FQ`R*m@bylAxZ>gh5MJJ>$a1)><%sv0u>MCr~6hJ0px>=^ko+a%L*)ek$ znVExH32R3a+TApQ)XqG}VS2JYy8+W?vj&%V#cvaGVp9qb1#&`19ans@q&%7a^EXN z>%5;D)h*R`;M|>>+Hn$+oRrjfassl-lHKOX@OG(f!#jS+u&-v}D@!`_I)h&rvNQ~6 z+8d2dzdjjh1I}O46xtSZzB_(=sO@6zi4gaYb$T)mSa4DtI3kEK zZhXY{nvdBp7B^oORGXkwo;5LEIzNeQ_tfjI&*T+TR9q>_s`A2>LSg2yzC8KWirMwy z>#8}%Kcrq5maDuIGXp%gN|)SLBLl*O5COERm zcUAjM=6s+&T8i3rT$4b$d;-Iwl4!^BxA7fgHGwZ_+WFz@8ISf-h1VkUOJ+YtQ=Jng zrW6YjDAky}u`fMJ-KVuu?_M?A^FqSHYl*et%w^yId+T+5cIR9l^}0Pp*eL5?jf0MTP= zClFCpie}bF8go=j_vN=&VOP=KM1#1G%e^-a(pnbqD3rta4MRJrr%U@=IphcYpk2nz z6Vj&E8^+6>VRNCxq`@{)qcy5WBh1jU<5cW{VOMyFu$R9>aOd%Q5_e}npD&x*%l3ZH z9CD#6xl9gOTN$DnZWT~KV+dPN^>n>FF#;i6x%FGz`r^@sCxP?78xr-n#wj4mDE94) z?!&TO+zBkN@Wz6Ld12tI5t{(!Ax2Sk7t>~2WoBxuoli3CtO`J4Htov?aLwf{&n}Pq z1*?)+%g-z7Yt^f()Vg-1=us>`tn4l>FnAx{6Lr%~{C2eVcunOvxvxZd6L3C@x2NbR z#8VIqx^k|=fG6onwQt4&1Wql&4=?`&L8=kb$DbfC2RhY=cSbKaJP@r&bHm>J&cA8&atl4E`w8@u!6Dr>y4$03BHaKDXE@}1i YC1-!5?Cfc?)wQy}|AyawNN{uTPg1vHga7~l literal 0 HcmV?d00001 diff --git a/img/c/de-default-small.jpg b/img/c/de-default-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..11e9c36886bc33382cc8a795c4f7d4ab4863facc GIT binary patch literal 1220 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%mqC}AQHg;`kdaxC@&6G9d7vj*8Nq-73K*GyZe(NU;N;>4 zD%dK(z{JSR%*4VBay3wOEl{3;MUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_ zYU1P)6PJ*bQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136 ztZHs)ZENr7?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;G&P778mFHFAhJOi*hHi=1j?9ZhleV_)E}1i1ED_o0f%I-y=hnAeD{tdU_|+OZD8l z-EpSvkwTNd#>T?l-`n1vUsrK_y$EBnh~TV7eT5kgK^1fSc0ba3@Uy$;X{{Sy#mbHa zJoS<YL{ziZKCa(AdkAx^4_VQ4?b|p_7;4f&ue;O-P#3PuRNRV+f@0q z_vnqj2Yc2E|J-EQdDv*f3?_rJ9WuqS{XJjKMh9L_{C9Mh+4hS*9J-1jDXAGZwpqR9 zf5v!saopVOi5otccl>AA@>D!(-hyjutKx$HE;yLle74M?q2@40pr6Ni9b`Xpwm#+XPSW^zL(Y+g@I3uW7`i zd6I#7%ZKp8Z<8Iae(7A_yXACp{*$ezVs@sK!Xt99*|4jh7%h`?q literal 0 HcmV?d00001 diff --git a/img/c/de.jpg b/img/c/de.jpg new file mode 100755 index 0000000000000000000000000000000000000000..43716f65318bb486962929a0530b495c72153c52 GIT binary patch literal 11205 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 K-Hni^t^Wl!0L!ib literal 0 HcmV?d00001 diff --git a/img/c/en-default-category.jpg b/img/c/en-default-category.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c28c90de171a96a73e4a1294e09713d232a4f5e4 GIT binary patch literal 3928 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 literal 0 HcmV?d00001 diff --git a/img/c/es-default-category.jpg b/img/c/es-default-category.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bf610f5562e2526ab9e50883c89d1ca57ea3180 GIT binary patch literal 4121 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 literal 0 HcmV?d00001 diff --git a/img/c/es-default-medium.jpg b/img/c/es-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..745c9f1c983eb4f44e771dfa8b2fc95c50435d8b GIT binary patch literal 1799 zcmb7EYdBPE6yBG)Fh=$;GhI+FA*D$wjoTSUxz!lby<|v5E}6zPWJ(TA4o5>II+RPA zsEI?8oIRDEes!L+_V;7&?^}DVcfIdgpZt;hIe@r0I6D9! z2mm1Z0P-h*Jpe>O$AgK zRN$R990X%AcqR0Z{Nwi5V|fQagh2p8U<9pjavi!0s&6w4qxi>Ja9(_NS=Br{=b=e{ zCNa4gx?hfO7LaKl+Nn0%RNo zQMWZfvnin%KrA#lJo4mzX(g2yahtGGclR$&=Lp%$e41-cmwQ%%I&M1~Ei~AtPaGKP z-d`v?KN+x$U#~Bk#O;<62R)%n33%FDNcwa!v-4VCcetobvt~m~jab%g&dJbJ%AA?bmdsN5gxh-@o0XNXSZd2o}vv8<`3-KCYLb-+3u4 zAT^$a$&PqXwY}bVzl35*%XYp>woY(*zW!GmYvCOP=S=Oi_If2CTHw=$6Pu*_*y1M= zo4z&FLC>r?TIsw7NDc_Xt%7o`HbvW>eo&&9NQAlRm=aP{!HOJhNGvrk3&(A@rs z;p5G}*LqCgG^*J&FIybN~6-gnfSn2KI6J$@<3^0wN$hjF9M@vF0oa(ErRtk=bv z{=58r=(^7rYL1S+vu`|fR{ib1W#-{E1HoO4M~bf1N6@B(APB_3-?{-L0lG`=+`SQ7 zH}0Xd{Av9_hVIy8lPHC_@s`EzuvsRm+QOE=#PR!QXt!J!(6SBGme7{&6g0_ z1=%Lj@_Ab>PMOgw$~rAS3W8e!hr?~UyBCS?^?x!oYKyjt+tTadBa0|GvYgd(+`M!| zw&_`0D`0pdGsV>ZK}%PdXBbhUnLkc*q6=#sZ(xivLl#H;ZlN_t2mbrLi2<{iX zi$je{XWkTZZ~;>Biu(Bh{8h29a7>AoV?=I%S|*FRfXTC8)ptE1tbP-?En9?E_on~UbR7>&slUY&>8}eVn z_QgRD6-c4bj{@leUj;gpro$CaUn~q{e3+n7B1Tr|XtJ|r9pkvC=W%kYsprWql-}#- zw|6go6rN7$XL}vsrUBzUg05v>ob?Uy* z>(S&oZ;^3YtquOcU0&~?Yh6|YE!m2XRN%{KzeIA@``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxp0@GqN(hjO%!p?sO;U!V{BahMauML;99}WB8-EAu&#!>yU;(@g^0|bHa~r z*6s(nM-bgT5QCT*8SNQCcH&aN1XG|Zz`(@F4D=p1%vp>~f($~6%!W#ii3-LO7YZvI z7zG9uPP%yMA=Hg*_DpYC=P7S^tLDJH!{(E{$jN25GNcPr{@ma2VYwTli+q%OqO4B{|x0*Ghf~G^jTyp1M{J7C5w9P{H>0kM0xf*jlrQ_0LwtraB z^d@N2uG?+jFa7-M%=UfWJo)Lc=m$ruz(Nj=M}7u}@dP|5W&{Yu3|N5z*sn-lWndI! zP&9N5ENm1=oTvczsldOkngwr;&C~onf9B8WeMUb{KbE_~snYeqC2_(px22mym`^ac zbS{3IlGGOK%&?5Bb9sMoNL$pLQll$7W;n1-^zE1&Jaf8GtKH4o2Nm4glrLmV-rGLU zZFl$LRbDT6U*xk^HP&yqaGWE6mCfQ}qEpcoMTbX!le#ConfE$E;yU9F)4luc{@Fg? SZk4|0``pd<^7qyMzX<>tuPw#^ literal 0 HcmV?d00001 diff --git a/img/c/es.jpg b/img/c/es.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28d7b8c81516e80cfc3027882a806825d27fc2f0 GIT binary patch literal 6828 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/img/c/fr-default-category.jpg b/img/c/fr-default-category.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c77b7622e867a956a9184806b60a563250b38b8 GIT binary patch literal 4938 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 SogA+3MeOqwe|b@NI{iPZ8*3&2 literal 0 HcmV?d00001 diff --git a/img/c/fr-default-large.jpg b/img/c/fr-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70c8ca6b7938871aa95e2f9337bf346693231b35 GIT binary patch literal 8272 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 H9~S=$9s;s( literal 0 HcmV?d00001 diff --git a/img/c/fr-default-medium.jpg b/img/c/fr-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a216e5ea41430cf5f13215ef83141ef99f1347ab GIT binary patch literal 2223 zcmb7Ec|4Ts7k_8od2NGPjiqAjvXi;hwar|2GKy4)Y0)qUm27P!Y9d$2SZ_j%5F&pF?7&Ud+cc>us}-sG?e zKp+4B0WV;=53mD3BywfLf`T_B1wkkjBqJ#)Atfs#D~pyvqvhoBSUGu|JQ|H9VQ~ba zf`Wo9Mp21GRKgP#h$}xqfUpe;l7=8@q8wU|_8N2mwkUrQk>6f8BpoSndU6LD&QfV&M!I3gAnmS;Oy(?OR@GC>N1V7=31w ziJ!V=;zql9#w8n1-M)viapn~m4%y%M(H2*zVm1Eh_}E7I``NG|26mx=h1~-P6ny+6 zAPRwm2mltRK&0YHWZ0n;90meHE;QRl2K0OSU-4wU+wJM4Q|2LewLf+%zBaap>(KR^ z%tOigk+-5(Ns5@X{5PF>Iw9)u7jWYGkn%;S1{lNEm-eSbwv=pZKevC**EyxpTql8& zf# zzbGKTDNtZ&5Fm(vP*ReAV}pQELgDZPbu$f3bJ})d2)7nXUPs;GefkBYW#^SQIQb7+ z61K?2yKTb2Gasw8A}aRUsKrZ^7WJ)Z>+=wJQs+Bwp!C}77K7U6wC0C~b_mKW6<2K# z{2|PGtYMI5vH9smozbDdpD1(x~b4rsFN86 z`nfL~x8@IbNbd`80wyEJ9n>rRd0fszFIo$qxTosz)Q3X@$M5Alh*lj`?dn`oZC2Ay z-5r^RNK3MP`;>#B8r%9o>9;@RHBdN~bDGgIf865fDS4}#KRNLqcMuj|)_53r2 zqxDp)dY@d1$EQDL_{WSsF;e4ydM__zTL-!si}QJfqB*ZEDP4HlvZa)PF8iQi_Cpd6XdF!5OY0NHX=F`bq+Y9_NwNW-Tb6O z!xgNyo=!>SCnb9etLYCykN8ffZ>aq&%+NgC(*ey4**>D8b-mmAu12dpU>eoa%l$2N ztcH`b-SUJ`LrN3d=VILn0g<1-VHq&=RI6GB;0Dyh!gGa0B2eGQAAtkZ&1l=bLQZqB zWa^#TZ?k8szO=u0%-w$tbKYF^tLhX>g-)cM9bG+rnX*2|eqj&sPqJ7e^n^F}sa=)y z>ywpRb&JeQhTQ>$gXv9;m-5(xqlf!d6{7Adw(e+qS=t6DJ=|ujudr@>UwUC?8~*O> zYP1s}p6aQ5E76O@xmeSlw%w;wG<)C!q@XO7i-FE_kZW96)=C4pY44$A^U!+Fymn`r zbakAC@Ujf~&6hn+JjLT73l9K2#s&2BpVS7$*c*H<#qjbka{;w}NZ+6cgx;X|#cu?M@Z+ae^AFdFOr4QOm`v9j+m3t&9^7c${b8 zp(wu^LHDYk!CdlqC*fSng)+_T+{+0CL3!>3%N$l-X;lH^&0WTAi-^U36{}k}FI4f)7N$zCKtA60% zCc>JFyoi$G;+(W2F&t@}Z_rGSt!tFr7Rge;<{D_I@nig1z>M*1Q0>>|BP4%)U>Ptc z_*5YIC&ccF#{N2 zXGQ}r#GXm5lQ7O=JImiRsnrOcdrKU9qZ0PzmVlBp5N`0CO5rj7Wb>OEKi)iZ=tbDt T554%Ek015M9>BbY383dMnILVf literal 0 HcmV?d00001 diff --git a/img/c/fr-default-small.jpg b/img/c/fr-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69e05318a0f3772c8ad55e1d92885c840a8a941a GIT binary patch literal 1252 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxMw02J`ns~FzyvNOUir7nzXcOS4rS?`|J1<&ly$oo{9_u-nx ziLjLXOL?7B8Y)fH0v>Ew9u$1zj+c+SRHNq6>k4y{)V(<(%0Mm_M0c?P*bZh!Mteqi zJPMd#3Jib_W@Kh$;^u@onUP75fmuk=&{05GK`F3t;=+vwFR>Uo1tlgGHeH1JfX$xi z>76pSM{}BH@-nqG-$`3HLBz>gX^L?Xw|m3eWsgFAx1Kl|e2!WE zKH~dL#&GWK2aIFWigq0B*nckc<=RQ}7T2%t?!M@#b%Tldqji`8TZB`|cH2XYzDe8u zoZxm??ZP#8nc=-q?ZS|?_LV2AQainr6Q8?;bNZNTHf2E(T){oT)j(KZ&0Xr9ruxEbYrjszIw@*1>xcin}Hpyz9{Y!lme6`k9FI1EMR-*v`%6S+}`siqcx{MVr*R z9^AMeV;r#R?v$s(nj5|Jj=0Eebq;o`IhErm&^SRyXG{IEe;b;(Rka;-@B3JCYrWs9 zA5vWv9KCSbr$rybS(g}isWcqZvD$cCea($MIa(UZ8wG_gYrJ1)ak7D}`Sm-q8O^0X zHF-?R@@||qTgbJcJMKP%fXxSkRrh6|mrpqL^Mxy?+QsfGRTpFgLhZw?&hPwgbAIRk H;{P`Rw*rR{ literal 0 HcmV?d00001 diff --git a/img/c/fr.jpg b/img/c/fr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed443472f6457de2a66f10fed0c34e25d4620b0f GIT binary patch literal 13454 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 literal 0 HcmV?d00001 diff --git a/img/c/index.php b/img/c/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/c/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/c/it-default-category.jpg b/img/c/it-default-category.jpg new file mode 100755 index 0000000000000000000000000000000000000000..add52ebb9866dec260ef650995e0b6657fc51af2 GIT binary patch literal 6438 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 literal 0 HcmV?d00001 diff --git a/img/c/it-default-medium.jpg b/img/c/it-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..461031f99934d59dbe75a84ed825b9b74101c174 GIT binary patch literal 2607 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 JLI?T(Hvtr}PZR(E literal 0 HcmV?d00001 diff --git a/img/c/it.jpg b/img/c/it.jpg new file mode 100755 index 0000000000000000000000000000000000000000..94802add7e6e15673d950cf943b205f6b139eefa GIT binary patch literal 35628 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 Ksl9)th5rG(VF{}M literal 0 HcmV?d00001 diff --git a/img/co/index.php b/img/co/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/co/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..883937325c4b6ac99389725577f2043aa60a20a2 GIT binary patch literal 1150 zcmb7?-7AAp9LIk{b7@6Vlgtfw+FwA)g)3Js6jx%F3m4ud5~U;&iVJpQxzG|Zv$VV= zgwfKNZC<7pt-M8~u;Y6kJ6hW_&3XDfzs~pf`}CYT50L_oN=10*Qhf?hCJ_|?L`Z&e z6e>pVKkMe|S$Sv=I&4P&#ilv1>^pkw`Hz3L_b}dDvCq28_aqj_E`xvhSra;i=zEUu z8;0wgA>r~m)#d&QcwaKaOmxj&YS)8X&vTGXwz@uMhkU=^=Ke&piy04gwK=B7q-dA# z;r0Q>{k5Q%nFqXVMCWAvRSt%;u<1TGTe&@Dm??|no4C*6zOn6u?O1QvmMy?+cAu1m z``S4Es_Daxu0;j+GXZ~F*0&f65^(t$%yK^Rk_7$XIDU14ev6#1wiuM~^FS@=08L;J z%z$%n0bW6+oG&u;HJ~D5Ux>Z*zv14JoMb}Uo5$7(I$e$d` O268!G@`>Jyh`s^lVQd8e literal 0 HcmV?d00001 diff --git a/img/index.php b/img/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png b/img/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100755 index 0000000000000000000000000000000000000000..954e22dbd99e8c6dd7091335599abf2d10bf8003 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEr#)R9Ln2z=UU%d=WFXS=@V?HT z#xG*`>Yvsgk=}99w^d^D^d*@m74oMo<%#FcopJf?u00-~YVKV2wzrI*_R6;UORMea zBFVSEnN~eiVA6V&z`E)YLz5Aok^D)In}Yn=OzDpgR5Wv0XfT8pOkmV{sKAJ-PO9#T zZK}IXj&Q-V!U)!LcB_3K0&C*{ literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png b/img/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png new file mode 100755 index 0000000000000000000000000000000000000000..64ece5707d91a6edf9fad4bfcce0c4dbcafcf58d GIT binary patch literal 251 zcmVbvPcjKS|RKP(6sDcCAB(_QB%0978a<$Ah$!b|E zwn;|HO0i8cQj@~)s!ajF0S002ovPDHLkV1oEp BYH0uf literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-bg_flat_10_000000_40x100.png b/img/jquery-ui/ui-bg_flat_10_000000_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..abdc01082bf3534eafecc5819d28c9574d44ea89 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQY-ImG zFPf9b{J;c_6SHRK%WcbN_hZpM=(Ry;4Rxv2@@2Y=$K57eF$X$=!PC{xWt~$(69B)$ BI)4BF literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png b/img/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..9b383f4d2eab09c0f2a739d6b232c32934bc620b GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour1U*q978O6-yYw{%b*}|_(02F z@qbE9)0CJMo;*v*PWv`Vh2h6EmG8IS-Cm{3U~` zFlmZ}YMcJY=eo?o%*@I?2`NblNeMudl#t?{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png b/img/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100755 index 0000000000000000000000000000000000000000..39d5824d6af5456f1e89fc7847ea3599ea5fd815 GIT binary patch literal 3762 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 literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png b/img/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..f1273672d253263b7564e9e21d69d7d9d0b337d9 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%l7LV~E7mxPQ=F85a&M@g_{ d|GeK{$Y5lo%PMu^>wln`44$rjF6*2UngE4^EGqy2 literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-icons_222222_256x240.png b/img/jquery-ui/ui-icons_222222_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..b273ff111d219c9b9a8b96d57683d0075fb7871a GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-icons_228ef1_256x240.png b/img/jquery-ui/ui-icons_228ef1_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..c357355aa7bb9201f3d40b8996449ffa1035dd6a GIT binary patch literal 5355 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 Y^OOM2(oM+v|NSx_Y8qC-Ajq!3AfU8Dx90^_ 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 literal 0 HcmV?d00001 diff --git a/img/jquery-ui/ui-icons_ffd27a_256x240.png b/img/jquery-ui/ui-icons_ffd27a_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..e117effa3dca24e7978cfc5f8b967f661e81044f GIT binary patch literal 4369 zcmd^?`8O2)_s3@pGmLE*`#M>&Z`mr_kcwz5Nh&g=McJ3E!;CE1E0ryV5Ro;>nvtvt zk&I==Xd;cVGZ@>q_xtnx{1u%7-D)N|5YqOB>i;(bZ#o62{J2Y9&^D3~R^$o+X? zwbxAEIb)xwCwK3TSR4QVym6N1rVgPmmt0caryBUceHP_&u}{?^Jn7f0PT$#h>UDqI zr!q(F&1jJ2_!jxdAB<)7H$foI*2zuncvu;;$SoU7br=AiJ@4=BC4vNO>DS`&UIB=K z;2)0F*t^FBvVfPuT4FVMSwUw%Xksjyl+;#*DDy%=ocFOyzDLvLR(`zCSOuJ=?FWYn z5ZD!UaoF>-$@=Vt?a&;UQYM$Oqe0ZB?Je?8ZnMxDe&uzzs*zlHd)V58nfJPc8S^({_4bj5HQ_B&EXHWj6wx@B;!mr04b_Mx)UFL)W7`V!c zpMp#C!a!!sh3h491y}^qfimXVY%!+sYu0_DWoJMqpN(FR9LM#jdZ{vJzEck`P^9(1N=4J za9%u4$2J8TAkUaJk_FX%iHuv#svL_mMmp{SR}ifc#ZcXv%CFsT?*>N^6r(%D?1YnU zAaT?UZGlOna6UXXs0m)3YDp}d%hb@)@Y!lK_A&D6{OPlNnj zYY*$b>vnRzL8=CDbQSi!DL3D!P^xhNtwrYByo?h-&OvQZYJ6ka{Re# zSc0ry_d(K$_Q2M{Y^O~DOK(szDOnMi_*h_Rx%eSRxA%n|FuC&=F=)B z_Qsgmj8g!GA+LZOX)gOW}vbo9|l8QW3iYw9qCD{o~xt^HIU>;dV5MJgc0#uHTA z80%Ee_r;G`GUjssm z*AhtwpW%Ly;X4Lq1Zq#ZpuwzrZE$sR087dN{w7PA6|Mo#6wwJP085K+h7+D>NyeX# zk|?MJ^Es)JtP-2eNr0EQe*ZM`&}OU zCD*uSSviE&p}uX|@1g_%|3*ra*MbBV#~cshdcFQ(dGLnTqaO-3{u==x1;Pp2im!#` zuZ2`ThfAmiSzb|4h`c4?^ZoGOF*oXYcV}(ge!v@^bse?daA`Ma+bSZLIg;pIN17vM zIOYfK=@s_Pj?~#lqnY2o?d1$MpoqsYQw%eX%X6Y4*^27{hMWGqILEMnVYUEMW#x7f zu^I*nzXQ@6HJ8n;26 zo^1+Ewi$fN$Unum1(FTb8I#cYgcGklwIExt#Mb(D=x~OTeZ^ubJ)S-ywfdZS?SRCq zDm=eU+CCWO@8S_m!W{alT)zj zZJbjxm5&No5xe_~Jw-i7`&G}=r)POGGfFq+c@kQbB#)ay`coj&C3- z(#&xV@Q3@VJd{qdH4g@4ZJi&mx9e@Io7@~(o5vTrkW>QEO1T-gmlTRHH+3)gcUC0P zk07rvDnf*7Y5J}8!>F_7D^Z3IoH^uGH}_a(ax{Q(IrvV$olf3WN&DY?uYZfvXI(;Vv&EAoQtfH;+4VI_a>yh*J+Cj!?h!QX?O`QXk@@G7AjloJe51Cw*rPXQ>#y?B^^ExRQFui zolmv*C5K|-p){rZiCNai^0H`1(Qr(Hz3v%7NnmriXu2tD>xsbN#*R3*wsZhRj6Lvb zn0Cu=qkC?*e4{NF_3=^bTb1f!g?@ryFH6Zw2tz%A zzz&o{w`dDv66!6Wk9w1-dglS#Sm{doxw&h5Z8&ONmlBBte{J)puaDzc!LC==rPRQK zQNH23?-rIo^MQdt3Tk!B@8l#}fxVtrlc8Y<>ORaVE($DKc{77qV^`+`%_DotrUD=8 z4}L7QnZi3RgUy*tteY-=$SqA2@IZWe(}mI`nzhAT{qC)my#rJsfoS*)xCXj!Tk6=3)cr@Jw#OcNqgS3pg7x|4!A$|w15X!huR*vB3q9Ya4 zF{xuzEQz{9YPl(gk`}Gffut%jotgqp$jZvzRO4EsExf~93vY~04AxH=lR>R3v3Qs2 zy$v4SN%ee@Kz#kDtARaQD`d!R%}#@T1=v8DAow*r>+0d1KS{ZtA~KMtgm)+$JHumW zw=;@qWk&MuG@LKx#K3@&WMw?r=jD2_)(*$LmkCm4_@};QZI|SPe8hIC6xqBy!LQyK z01_xmfNA9UlBU@Kzu7;zQYxHE>OCADA$gwaVqm`eN?XQF@NkrocB}lU4hcCf>wqir z>Ya=PcE!Xm#JG8v@G0lj&~)hScM}X57vGw3g<$^SUls53f|Bk>5FQwqE&{%u(f$!1 zl8+53vyYZ`mEEp&YT<=(krhKrw?~pS{N)?q{0qBR#2Y!w4!hWMdj`a(@A@r$zVB+u z06Hb@_9(cQ_AxbXI|-2w>#QUhp7k<+`z9+(jkh~v-Renr#C9U+&jL4vg6-E$f7@UU z(1fxB8{U2vq}h3rE!Z+n7=(>D&}@9~3mJ^R5}|WVG@!RSh3r{!>QHwg!t29YS&jiR ztyn_q*k9H0efZ7hO*b(WR|G!TDY`rol~Ob4&1OwdM8kbGj`^$~L5gdWYceWwL=PB{~NX=cu3p-{S;hqaE?bSHv$g+SA6bxy+VU3YVTPDj6CN zKLb_(9gM2Y#KW8ONxjH9To^Y)r?ql2cq8+WE438uIF$hjfdLs6-;!jv55jGcc3Ipg z;}aT32NAEGeU;J}&j5=+u`4?%xlwL7?NDn%2={4WS39yn3f;&r=|}5=M-Y2yrxeSw zv%*PmV{_{#Qk1sD>?M2KDapb~z3!E*-LPmCe9q86D%MGSe;4~~K-jKQxq6b^902_{ z%>4G>@Xqk8muR*|vGe5{@7sds2i|i;g}oMkd!o^0=HG+vcPrcN54A zLGv$PlTePRxp~-OSb_*aACO1qc{MpfS-fv(@UmRv%UO)cSt;ee@9(S)f>|~bwU@eZ z=kTS*sdjLclwMZG#?%U3)bq-uj?@@vj~6tq)ZS||Jxz`+di-M5SXM=h3EL`?pB>W9A;`V2vM)vk&%KFy|TAh#AQA zb_?J==3f@%LL{`vU$3Z@A2a9C3aC-YY43dR> pI7J0n@;b3~`)ubvsr|iU(l;L{A#E6J`}eC4usn-0uQEf&{2ws1m(ltoqJ#RmwV2==ic*rz7lOw=eaq=H~;_ux21)-Jpcgw zdj+hrf&W^f<%Qk9Zpqf#;q3n5{{POY;f!wmTR1An9(4&I0z1LNX50QSTV2M%4|y9c z#{ZQIVJKu~aY5?ZaZP*GIGqGs=e@q6o|EPhZB3CC?@LnORK8O@z{{<0KtSn5?#~OW zy=L;x8T&*%xqElS;s5~Pjk7d2bqIaA)xZbovnZd7eX17WNxx=w`p(8vulwUZ zl{so}MuRNJx5!8S5G;$o2?BApPHt+)!^#*Ww`?rcVE}mcyuY`X2o|uVUyI9o1t11O zemGWR?;aD#0$vJhiPhv~0iXS#iLq!>Qd$` zU{}<|Vb9Md>$4TMbL7C3GP#r;4Wc$}Z;^j;n}yc!E3d;`wry$!JkmJP0%(tIh!!TET8=+{rhUi^60G0t2HJSxXv-*DgC(HrJd8`|Dp3NvL5yg>xAvU zho|fEA~w^-HrW&H-JwkqNX2I-bEXBR&Uhp+y2^)1h1IIlNCzC!v-Mz@&z&VPz+cl1 z=f&f6Y*U~C`ixm4Sy1hl$hg(4%Dy;bq~k7d1<@K&%%NLT`L+A)-QXyKVswX?op90( zB#yeFEih@c{OXU8Oq~1CFI_38GXmns3(`;W(i+bslovCx4u7gvK>DrGOug*?G|1nz z_OR}|ZYS3pq-p?rS7G0qa`TM}r5XqDT4cV>%Qyk#9ES}`jc+Ww|DcbZrF6UG>CeXp zOVIV}K1e#z9@tu#?X)Ri=?zXMB`X3G-_I7FL-Zq`nbfWtX_EO1*!+U6pJW-_k&+vk zMd}THh}{(Ch_wPk(PI4vVB_KT76kGxVytLxpWg}&bHw`a3G#QzxV@ICNax&@hk3<_ zBh`Tq66G{-tCw$V{(y0v7l!tp20~@gdFXjzFbF#bJE7i>T4ux zQdrF3org^wFcnw$#bQMv@SfN3$Fuo7HnB_`2ZGB{ZqGr>%xP;2_!Q{=N-ZhU1c~^5 zdt=OO#wmcpkXJyCG?{{&n=R{Sn=Ytg;<09CH)l7TA&wkt{Q;>RrA2Ia6-QixEPLrU z%0)N$3Nh0?U825&v($Sz}0G_(!v&xSSAzje4{rup+^W@^}ByqOb95$E0sbwK*%#GP}!6`%*Z@L;&C z3^dE&>5%bWAXmP*X1 z_m}Pivs*u7@9i>qA!58fDCwj^M<1P(u^m;urVdlM@>aIf+E3-d9ZW>fc4cS7w5O3sCmKKn z+94A?VyfSBb9{}rEbCIYtXORJBCv__fnZ>?a}edaA%bP$jI?J^q0UKO!mduA8U!3b z0CJ_Js}NWQZoebapVUHP%pPOUm?1<)zd%`hzUM-Y6g1z|@@3G_kio?S0bcbjQuxJd>vU$Uyz(4*peEDSVc-G;O;% z9Y97%Tq}TRsH+oN%2u(oyC=W<9`e@&m;i;jC%L;sP(9RBDQnth3;ZMEQNFH3GEf0c zU<3RF!hNG-vCDooYFS^nPlFnv4(ElI1=vNcr42TF^uq67f{MoN>{f&>xA91r4pz5Zc&@P^i-9||`98v$Si!U@}ouZ88W zg;YL=OQ;4}UQtkpyd~lD{qWy0H|lwJXKmenz#E=*9kt$YX*X!wDk7ITlIUGWnj>a7 z<_GQR752@J)Y(U)ncu(dIit7P}oBq8x$FP85)&Nsw<#rOW z8U_x(1J)Zgm(8tZXU%+(yYcO+Z7#ZszPwa2`ygiMPayX9KondtFMRK!7x`9uWN;(f zfWW?8yOdj;GA3We0YAW92gWipn(d>zcbA+vZ_21BxF?-pfcW` zbqY??6ie(6M)p@6@WQ?Tl7 zoKrKEj|x~2yZehhMLkFRRnOC>XL&L+N;m0B{_OQ9gzzTYb!!Jct=bk?_hIpY9rOwY zMnr69R(?8EN52qR+k!~qnCYc-KmV&*d$&NY?t5cjR)V+ncMor=puTRoo?{5dH;@!* z<~RrV!+ljAN+;Qx2LraY&JWnz^|sYbZjP+Y;|pC#DuHUH+>F~x3PqTkx)=OAE0X9( z(AO6gp~AH^{nq+n)LHYDD8mQN?DDFcd!U&d4PaajzSD1~lXq3p{x=^vItrq3gD^4O z=hYS`?&C-0&KuAV>Jv}T?ba0IafL$~+bZ}p$9lwyyx=-uPN`Hpvv<)Ia>OWHa4+N4 z6zscrW$^XA32EJw^7hYtkRJr{Q8 zQ|*1pp_q6Mno|D6EX!kgSv0h0I3~ef_l%$DTFjL`0y16n%^dGNQn;2V82mqoIi9i{15vu zLq&(BTl9CInUjZlTIa>^!!HlMK3W8Sd_Ow0+E8IT?h$=55$^Z)$WYIuig=O;Lp_1Q z4wOT;XbWQ!>Mh`pdXuSo=KBba;wT!wK`Hf1Ueh04*%D7Kfj*#b~BNfvz zsbf?uiMm5-xhaQ|7Om2OrYbU>ngUM9%F5nU<65IFyu(`yZ;Vb1)=wCd!L2K?c$ezE z4IbS|^?Z>)eEp}ZfjwF)Waw?pPJ?{~*g%;efxO~Nx7dQGLWZ)cPQ*T!((W- zGm2?tM)K}7oG<0Xz<`ltWjxvE<$AH!4*R{A2~uYGr@m!vm*j+e#CE9^*}Oc#uihB| z5;#kMY2^8mrr80%*+02bDx6B{Jsch(d7kQGV7~iGTgFZBu$Pf`tNf`B2{|t7fGhIq zos0xF#l$bfxOtcGDd*MDbdKBaCKxgCEbr8JTNd_1bjWC{Ubgk z9~)9;A1&=FyIt$l!VBXfD~6VCk0fjO%QwLJ7k00RH*%I8cCqF542VzP^;`OU-_?=< zbV}OoQE)HqV`|)X5+WbgSxGWH>t+7-O;(l~Z+FJJ)sygu^+eF01#Suj+pnAcw!s>p z$-xF}c>7t9X6H$^V9hvT5H{jKv+=zzWHA0pgw8e5fZpm9vIphVq3%S4*N3%&jsY^Q zK%sSPuj=?d{ATs0o0y6#0w3%YT^@-_sTuTUwI(Q{;l3KjeAbVk#Wmi%PDxm`zoqQ~ z((<-}*FSP%5gt7uI3t1&75ne{@1^bpdW1;MMGNkSr~UAuDbB4+VQi|x(gdO^zin_) zncfs2hj8xdiiy)@vVkfkItLKvsGtJhrTb0T~tFl4Q3J!flauS==b& z6Bm!g%dDvlCf(St$kVofvH90|9yl-gmvRvcKS&Ye9DdoTK@2m}iSvC{3m%4E0 z@TJD7c1V?!URM7+t?f3)%{X(6JXg~A9TvGQyX6n(^Yt0NX;>vDPcr~mICPooLWA_` z<1A>FuXr|C)dtDr*PQt%Xs5WePWUB&gBj$zZ#BIY%?jDdpbSA-PV0`dGf^oa_Jp}Z zlrGV7oe`#B^+nPIQ`ZDJeJas=ru#=*YL#+n?Go}f33>1GsZ{TTy2bdBihj}mz*mp! zOzn%{WgLM=*CpiuKUs*GnHa{B$2siJqfNi|Z;|rH%stM*8b26kAMCYY&NHwPGtlYn z7UVx_^sgR$Z8x27foS63FCPt|gtcG_ zy#@C|!VQV~TY}G5e57qp?F4jRxqq~@h6^?-cvD>ySwVLl2m7=gERtEn>Fw_@ND%pO oiVC*mbz<%I+0K1Z`+LWvZ$3~$+A!Gm?^hpSc@||}WrmLVKLvuzv;Y7A literal 0 HcmV?d00001 diff --git a/img/l/1.jpg b/img/l/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72b962fa68b3be1b7052090dbbcfcd50f468cea9 GIT binary patch literal 665 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<&6$5T1i2m0J53D0AgYh z6b35>nqtqGl9MxOKUS4Mt;{SCl}sR&)6T770xDDy0J@)r8_7^c1|dbINleUw%7%{4 ziA4`TK%K&7&mlBjCLa7y z2=j-%qSx$ap?r1HZl-A|apt=7|deLj-OXn87GG z5$;EU>hRV4KxJZr=s^s$7OV>7KLJKVbD$z=0iYsAWb+sW6&VZ@3m?KACZImo{g!xo jU}>G-T89lMMP^T__vaFDunGJ=O=;pXm%gd@|K9`vunB~j5ev@{~-oJ4hC)p0cJ))1|~s9WPorsHvgw`;@jXerr=KwyGZmCQtN(u!0HqIu AiU0rr literal 0 HcmV?d00001 diff --git a/img/l/3.jpg b/img/l/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adb6dc5d93202a1178d81d4e32c324f871e1c47f GIT binary patch literal 696 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxW?^Fx5&^2`0Gh(c%9NMJdG^K+j@tLHLN@FKX%Pg9 zqS(sFz{2XX@F7?WGb5utqapv%J+FXDr3D#)A&0D%k%`%mfkkm4SS=Gs?c})fP)Oy-4T=IlE18+t5$<7RVh}W9R%8(pcAT{7BGgrE_Dm1I?8@>usazj5E$wc{pG7uD zn{G_qRWTK4hKv9M6EnzHaKI?YplF!bco1SM&<1-&nLu?FyMFBxR^~_95$;=okPzF;QSTlrKDP%e2Zj#ZW)MS> zfl<(~5bj}toJE3J8vB7tB?N#bqr?=*WJ9PQ8SMq)ZpJL0x_Wm&AlDINuF}0G-op2s WBYiF~X!|htmY#G{DLGdD|0V#DpM^>Q literal 0 HcmV?d00001 diff --git a/img/l/4.jpg b/img/l/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5abbc8cfa91a2d677274b4740634818a40ec3165 GIT binary patch literal 924 zcmex=Jq?U}9uuW@2Fmx*ZrGjI}^{1{Oh9Aw@$+HsQcTcBMiQqsEB~Ih36?9uy6__(8=u zsi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK-!_zA`Bs45MA~GsDB{eNQBQvYGq_nKO zqOz*FrM0cSqqA$$M%n)zEeTL>QL7=~wSXh`@ z*g^hcWGV+@WL##!=?ELHy&R6vPoC%%H-6%qq9A_+|mp+lOk5C zO!9oTWA=OQJ12F|6x}#1yZ`1oiK!PK^=ArNvKIunaj;vyjobO3ft&kC*~f#qatl}t z6?#K%A1PS1fN|2!HMQQy_bKe$zN0Dnso`m9w+GQjIKzTCPQ>(SKit1 literal 0 HcmV?d00001 diff --git a/img/l/5.jpg b/img/l/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..744eb0eef5a1b2bd02aa947f06785ee349d68406 GIT binary patch literal 911 zcmex=Jq?U}9uuW@2Fmx*ZrGjI}^{1{Oh9Aw@$+HsQcTcBMiQqsEB~Ih36?9uy6__(8=u zsi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK-!_zA`Bs45MA~GsDB{eNQBQvYGq_nKO zqOz*FrM0cSqqA$$M%n)zEeTL>QL7=~wSXh`@ z*g^hcWGV+@WL##!`JmU58d{cx}&O-D;9p?;yl+@=Z$JYo;fK` zKA$a`zco9`^>K7Y>)LJ4E|#->3NNsJevHq^QuNrrGyjaQ-9BD^E$vI~y!-B@y)`pF zF`edWoV(MeYS#MS-mkZRuQT8Hd0Du+x6Aoy4G&K1xjB4aKc_17KZEfL8@1k#7vh5K H|K9`v{=pZ{ literal 0 HcmV?d00001 diff --git a/img/l/en-default-home.jpg b/img/l/en-default-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae66584319cc1119a251037135a73c106c4f9b34 GIT binary patch literal 3026 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 literal 0 HcmV?d00001 diff --git a/img/l/en-default-large.jpg b/img/l/en-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d08a055e03dfb8462820fd6709e102724d0fa868 GIT binary patch literal 6819 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 O_|Me;Jp}SiWB(6E{$ox6 literal 0 HcmV?d00001 diff --git a/img/l/en.jpg b/img/l/en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d07b871d2d2968a7d8e6a169fe808e4fe1f86e8 GIT binary patch literal 10859 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 literal 0 HcmV?d00001 diff --git a/img/l/index.php b/img/l/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/l/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/l/none.jpg b/img/l/none.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e4c07cd411b8705dd365d37c94a9cd1c85cc303 GIT binary patch literal 443 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 z z<|DU>`DQ*!^}q1>d_~*+_nTbT`}Ga!CbfLY`3yL`&gh}@J*oAI7)j7&-c&;rEpH?# zuO;<4Zu2R{pRC{2{cW@REp``Qppxg9EG=}^ir zqEV&~TAXkQfu;2*s)U*ojDnI|_i)+*2VFI5KAuobiF#$TRl1OzVkEsfwD?~~^bMnl zm{Op$msJG0@m7iTS8r~acdrVu4;m__tw)nmTdn*BFFVE=Ggcq2%TDoOPZ=6zx! zy)4?$iL@aIq}0xF#ND=0`=GbhKMtZ&cbk352bS!TqPG~$SH4B|p$DoZ%Bm$Hs(QHk zdAhpM<3m2e=^aLz{NKEMR|Y|NnKWq{FJpJ=L!5|F@iI0~twBVjvW5db_*2BVO} z4o&`VM_9Rnxo3Zy7!<2neF4)+^+Br`zB=WgF%0yI_HdOJ4Wc|%d+haK!6~J7p;L?L z9Q@Vw%g~#DxdxSg`Rdk4Mj>JD%_o37V8hY`glC(**b72p&I#PXIv*u3A?GUGh$|8> z{D{8fYn~vi2LAI)QvR4gm`Ts1nt{+td!CnH7>6ypNI4zb;(hNBp3`MU*QVMit9!fi z<1O=9!(#g{$nfS1#FS*D>yPx2(+wShyx0DiaIYIOiL;5RHwymt{io&X-Q+M#Ybfk* z8tsBhFo*J~f@sfxRrAxylDR5i zS#F^2Ut#L(J0g)(U0oeCEwvuj+S}zWUy2N=ARz(XOVF zRyu-++00?00?i2UJ(bBkqK-XD6er|r*4h#5vaem&k z!@0OPcMVboQr51;5JyC2izciNdzp@CTol$uP!${e(y?D97Zu@nZQv5+R%&l1Ynkg#!gF+Iq z8}O2-gtSXURpYLPEsOV9<2moO=NjBUu#Vv08Gq?Tl>P- zvp0OTA$8C(GBj!;+_W8w-PUc?`;ZISEBJEm0#-GF`pgsKAqiV{kOr<_1FMc~@G5@j z4=_1IG~xY#6pOI5LxTL|kV2gEACQ{d5cTb1{qjd0@eQmtVfJZ literal 0 HcmV?d00001 diff --git a/img/loadingAnimation.gif b/img/loadingAnimation.gif new file mode 100644 index 0000000000000000000000000000000000000000..82290f48334c81272ff5991962951758137a08ba GIT binary patch literal 5886 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 Dl)1NK literal 0 HcmV?d00001 diff --git a/img/logo.jpg b/img/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f51b84481b430dad33ac0d3577c6662bf7c8ec8 GIT binary patch literal 6305 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 literal 0 HcmV?d00001 diff --git a/img/logo_stores.gif b/img/logo_stores.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb2ffaaba6af2f9e72aadfa5a89b5570c525de80 GIT binary patch literal 806 zcmV+>1KIpXNk%w1VIBY;0OkMyP_GuM?3c^|Vv)>kX=!QRMUuYRs`vc$a=t_4e5~5L zy5jTNs^F8|F@|`-OMHBMX1_X&&1~4KvDxj+_qyBVa;u=!fbse4*6hd88gYWgS!1{{ z&C<5tVVknpmGh*{l-qRs=JN2m(rvv!bG}E|KZo&zzwfxx`TzX9*`kKeV$Tg|{Ppt(Ei-DTQHjMqGczT>QCx;5WxqQuOo&=zd%n8Sz2VSL3?l;C=F!b$x6_*JtY zat zrHsmEf7D#}*5v14qyPW_000000000000000000000000000000A^8LV2LS&7EC2ui z03HAy000O7fCLYNgoTEOh=N#)jE# zIZs8|2<7JGGfQ0FzKujhB=IEY=Q9Ydn(ekl^!?})>>Q!7=Z{{I9RVA~Kro`f<6s@ps;i2;wBbVn zj}JhD+?b%CpvjCc`5s}YrsPNf4r^M}7*eJH5GDW+o_&O4#uElFsDv1@LQ94WE6fm? zgOBQ?7!GEraM7TG5hOKIXDC6YnIk7%xNt!cLP(U@6&`iO=W)Txnl*o}6Q2qaOG k3rIlx6{9O^1`9dS-1(w7by$$%ZGE>OMBu{{A`l1wJLbKYMF0Q* literal 0 HcmV?d00001 diff --git a/img/m/1-large.jpg b/img/m/1-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6000b1be53bb2dabd664cf01121c8441dac63550 GIT binary patch literal 4108 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 D7v8zJ literal 0 HcmV?d00001 diff --git a/img/m/1-medium.jpg b/img/m/1-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..373c85b7949a8c3509bd22a2c2d621f6261b38af GIT binary patch literal 2056 zcmb7Ec~nz(7Je^#NPzbOVGWoVpdf~wK`EH97=(bbyMVH_fEdKEl}#ZLDb$KYpo1tB zC?Jc1$fBY`5wOBRCyF42itJ_I1a-;)eK0zm`E&03o%1{I-1B|s-tW7=yVmY$a4wit$VlY@KJRV0NOOeSWDH2Iqh5|{;z%nEfqyWKk z@>D97EUT!bAg@G`r^;`UfM^7R!4k1pqP#RoTK@lz&Bp*t0Gt75G`JH$!5|t2H`@Rj z0HDwy62Rv`;Q$O4j|K@yRtW@<Y{{!eqmdA!?k{-N)t_Og$Ry*AIT30x{UR#3lG;?ZEYOquA{ z+S_|7E$ns3Tuc0nv*?YYMaDpoW5nnnkzBujKBu|ZH^_XlF7tX%6Z??g?rNke4F~`+ zh#p7@p8^e{FjxQwQ4s0qR0ReTsgQsa4q{QOc@}5B#ZA`Uh_6`bIN){EJZ{%Fmi+nA zUjH`(;&c5qHQl-s@_&yG;9DMh4_Db~y^g+AR#le#lfPJw=H71Xb=k~2YtXk$O7tK! z_~2O62d>T%FI^A1&r{Q6pZ&^||5mpuBK-I1-)Uzy0h6|5?m~rstVhPRjxzGn5}3bl zj|O^*HuJFNQ-q?4b$Zw&oi?=fV&dKuvF+ziH zRr~Td?P&TXCyL%a?flE#xAPb6Xn~@oeNd*=@HD<>&jyNcq?Kn(g^#p45Uiz9a zIkWb*P%*OP!T_C}-Sncl*QKw2M??J^zbuuwOz>}^JAy*d^qFQ!^4(&7$}@Akm&ZzC z2BEBXuJ~fRi9>?J7{l|TRlk?|prCbWswzp=iJLG*ri(O;%vYSQH6HKZ5v=m=J8OlC zk{Wh`is1&QoDDk+3$g{|+iq#~Cm@446*EsGgFD6EULp6YGJA_@saZO;_OxAx_c?ov zx-W+2u9c7X>fNe$jPZA^cHG!m=BzH@W+g0W`E-r=qzd2+h@y>C?XFrE)F}%G zSaH|QuBM1my^E$>(Wf=_)odhJNP!8fNjG2c^1RF2>=@1UPfwpT>A`+uAhRfU>cr&v zX*e0Lg-dfKb{E|W|0grHStDXLIT$kF##9=;$(mN~<;fis`f3&_5a{qjO3I{^3c#|_ zHj0LXUNcN|a3IyMH+vp)UZ+{@`m6KR!Rlok{(%i1S-LbfH!?Dz#W%LF&stwjzfRC8 zt2|F$|M^IJp#n}`okcuJB3;j~?bcI4iX>erV0Az#gu1*11-QcS0lxPE5lpc>%WG6YvvJ!w>8~*E0D{n zyb~d-U+%mrd96r=F(=8^gCU{=F*%F9yS?3oh;R+^Wz@N05O+f{xq)x5#CxAL4*M7h( zRASJbf71=(!7;YOoaGkg6%}SFE0Be+{_%^xpC>H19U9Sl=E4j-)-WI2!v6SWRY-hE zm(?2jLQGI$efx@AgRAeEe5XBcjnlX(BW4usQ5I%2T=y6woXZ8TeKpLI(dW0kyq8K; z#(vMM(zhK)(2K|@4yBhN`zv)NevrOHJOUY9Y4z)K~ zaPCdEx^%10*}uA(=vsGm+ES??hch$H==hj(qAWS~OzjQE%!Xo|1mIMTYHd77j%=Cq z_6aX}E+$?ao4soBWEZ_>)Tn0~r_iTkR#`pw!^fl8&>y4Dx|^yQM;JeR8f$4DpI%oX z9eY<&wLE$6N>iByniv=-Nld>TkuLl|i2p}$BdUMEOEBoJ=Eo;X4i%W#*hc-qSRb)_ oZWW|s556}{d@d`FhmXki)4HnB%U#`^&RgT-*<40Z;^wb^0<0VTLjV8( literal 0 HcmV?d00001 diff --git a/img/m/1-small.jpg b/img/m/1-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3fb7f964199a7671100d60ecfe2c3c1eb7ddb0b GIT binary patch literal 1236 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�z{qOt#$_zqLiBxbV-srdW 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 literal 0 HcmV?d00001 diff --git a/img/m/de-default-large.jpg b/img/m/de-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..dcc29c8f14dd0455ddb3b39d3176e4f521c9933d GIT binary patch literal 8343 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 H`uu+bgPCz+ literal 0 HcmV?d00001 diff --git a/img/m/de-default-medium.jpg b/img/m/de-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0ee666461c87378d46070c5c514857386e472c1 GIT binary patch literal 2010 zcmbW%dpOkT9suy)%x}hR1~X&EZNeCXLdk6;Qphz7x=6#O!nkEC2D8}`ty{{@Y-pt{ ztxIx^K_fygAxRTuTnm&5rgw=RD8Zf6h7I_xpYSc`wiR^SsaVZob_d15i$O zj&=Y90ss)v05-n@<~AO-R!1lvdkHkZox$h)X@p3FUAqa}>ES_PG=ig(J;BM%)}9ba zHr$~{I8Q$n8Wh1G>?4@%mf9QwYyc1n-AYlwL7bOr{Ogu^AV(gy?uv{u?g99kJ(_{MDZl5|ffsSijs%&&a&>YgXR9-}4I! zi|!Xctg2?$)Yd)Xv^;HXYwvj0+4YM1x_{u!+d9 zTo3^KizS->g8hdJEpkC&Fc2ob<$^$?LJX#Cu9 zHB5BazBXK?5}1%)BRZoG3BF0wolNp5sn z|6~jqcK3FQ`R*m@bylAxZ>gh5MJJ>$a1)><%sv0u>MCr~6hJ0px>=^ko+a%L*)ek$ znVExH32R3a+TApQ)XqG}VS2JYy8+W?vj&%V#cvaGVp9qb1#&`19ans@q&%7a^EXN z>%5;D)h*R`;M|>>+Hn$+oRrjfassl-lHKOX@OG(f!#jS+u&-v}D@!`_I)h&rvNQ~6 z+8d2dzdjjh1I}O46xtSZzB_(=sO@6zi4gaYb$T)mSa4DtI3kEK zZhXY{nvdBp7B^oORGXkwo;5LEIzNeQ_tfjI&*T+TR9q>_s`A2>LSg2yzC8KWirMwy z>#8}%Kcrq5maDuIGXp%gN|)SLBLl*O5COERm zcUAjM=6s+&T8i3rT$4b$d;-Iwl4!^BxA7fgHGwZ_+WFz@8ISf-h1VkUOJ+YtQ=Jng zrW6YjDAky}u`fMJ-KVuu?_M?A^FqSHYl*et%w^yId+T+5cIR9l^}0Pp*eL5?jf0MTP= zClFCpie}bF8go=j_vN=&VOP=KM1#1G%e^-a(pnbqD3rta4MRJrr%U@=IphcYpk2nz z6Vj&E8^+6>VRNCxq`@{)qcy5WBh1jU<5cW{VOMyFu$R9>aOd%Q5_e}npD&x*%l3ZH z9CD#6xl9gOTN$DnZWT~KV+dPN^>n>FF#;i6x%FGz`r^@sCxP?78xr-n#wj4mDE94) z?!&TO+zBkN@Wz6Ld12tI5t{(!Ax2Sk7t>~2WoBxuoli3CtO`J4Htov?aLwf{&n}Pq z1*?)+%g-z7Yt^f()Vg-1=us>`tn4l>FnAx{6Lr%~{C2eVcunOvxvxZd6L3C@x2NbR z#8VIqx^k|=fG6onwQt4&1Wql&4=?`&L8=kb$DbfC2RhY=cSbKaJP@r&bHm>J&cA8&atl4E`w8@u!6Dr>y4$03BHaKDXE@}1i YC1-!5?Cfc?)wQy}|AyawNN{uTPg1vHga7~l literal 0 HcmV?d00001 diff --git a/img/m/de-default-small.jpg b/img/m/de-default-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..11e9c36886bc33382cc8a795c4f7d4ab4863facc GIT binary patch literal 1220 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%mqC}AQHg;`kdaxC@&6G9d7vj*8Nq-73K*GyZe(NU;N;>4 zD%dK(z{JSR%*4VBay3wOEl{3;MUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_ zYU1P)6PJ*bQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136 ztZHs)ZENr7?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;G&P778mFHFAhJOi*hHi=1j?9ZhleV_)E}1i1ED_o0f%I-y=hnAeD{tdU_|+OZD8l z-EpSvkwTNd#>T?l-`n1vUsrK_y$EBnh~TV7eT5kgK^1fSc0ba3@Uy$;X{{Sy#mbHa zJoS<YL{ziZKCa(AdkAx^4_VQ4?b|p_7;4f&ue;O-P#3PuRNRV+f@0q z_vnqj2Yc2E|J-EQdDv*f3?_rJ9WuqS{XJjKMh9L_{C9Mh+4hS*9J-1jDXAGZwpqR9 zf5v!saopVOi5otccl>AA@>D!(-hyjutKx$HE;yLle74M?q2@40pr6Ni9b`Xpwm#+XPSW^zL(Y+g@I3uW7`i zd6I#7%ZKp8Z<8Iae(7A_yXACp{*$ezVs@sK!Xt99*|4jh7%h`?q literal 0 HcmV?d00001 diff --git a/img/m/de.jpg b/img/m/de.jpg new file mode 100755 index 0000000000000000000000000000000000000000..43716f65318bb486962929a0530b495c72153c52 GIT binary patch literal 11205 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 K-Hni^t^Wl!0L!ib literal 0 HcmV?d00001 diff --git a/img/m/en-default-large.jpg b/img/m/en-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d08a055e03dfb8462820fd6709e102724d0fa868 GIT binary patch literal 6819 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 literal 0 HcmV?d00001 diff --git a/img/m/es-default-large.jpg b/img/m/es-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6683d919ffc8e963b73282bab098669759a41cbb GIT binary patch literal 6826 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 literal 0 HcmV?d00001 diff --git a/img/m/es-default-medium.jpg b/img/m/es-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89043661550cf408a514e73af01f85112fa63863 GIT binary patch literal 1802 zcmb7EdpJ~E6yN8}jHWXlXUxzL!g%B&k492rkXLDjrd)ccl$u20hDk}2Jm!{)x{4k* zy{4k1`cU#Hlm;c!m_iR4$weMhdMI<*qVnLwCKRU@fU|Ftxka=wQL0EdTQ z0-&mBYB5oYDfS!@0|61>(VqSzXN%kI5(ZkbGwSqvWxL;Vyn@2YPZljIq2{*QgwQiB zbmvF%Dz5O? zo&L0Sjq5|yIFTxpzTwlpI$36n*Eq5IOw=VLGsn}%EV-+xLpn42kY$9|=HCp+!(WFi zvW!#cl2fta2iB(U_ABdZx9%KvTou9Eo1GO&(4bq-q8+?{B#Rdc9vF+$!bkgeRY%27 zBW^3%*!6x+!iRf-)-jCL+|2 zub~aC_2igTQ9GnHz+c`S^A4`oxlC>90Gf3Tx%|cUi^_-eOBxfxWBf}rc0`1PKsFYn zsE@UE|MZ9$S3d{e>hLqn7o5pxUYa*WZ{tvN|Gb52N8$==s!}Q0L-2Nii5t1%iXt{JtIrhTod8$gQS*k|4`M%d@P7{$jSW@ctgledg_YFO-HfH#7Y;!PZTdi z21a&n0c%jEe>6WcZ$d!G)#%GeQ2t5Pz-lM6SeliZ{-K8vsiV!OEw75xk@FcI_4WI7 z`zD#&n8abX&b8e24}X#ja`3optfLu z12#Dx^j*58_*%utc^>2-yB)ooRXI0N68psd>*ln+(x&-`?s(q@Q;tMg#~*ak(={YL z9yB@UE_AQDNfW!jWiPWyT*K5qxl(Y&*7H0>{&-wxnxrOvTg&yM9Tz-_-dh>0veM(> zH*2mB_S6~lY!2u3OS@Ou7eI&XA2dF{pT9cj34zgfG=978&@9V&a)D8v&l1|4m)|zH z`AX)Rd(D?kWuMWDsO_$|-#V+1O=AmvlFV+keHhW07$QJP94de0EN@`Q571yWtKoWQ zbWSxVWNYJWYzA2z4;j6}B6A zU!5*$vSqa=CnBb#rm{=RqNNQ^2r^<`SU$Uvux_<%Ufv6;cPG0%%Dw%fHAjkL3wcTDLWGk`J9rhide>-n zBQ@+$H?y;ybDhQxN3K1$oBPy&)feQ(^xx-a%9B-cjEUl~7Tf!2h7$S)!_?vdsg7B> zbP5x{qTy<>zek*kj@yq!dpXq%{bTTDyH(Z$@e&7 z{3kr@;LYD!hp0c1umo*;_6%QW^}3iDoVaP1T}TlUXt1(3!^a(*)~?SJ52U7865Z`B MY0Qmd$%<$H0_qf|3jhEB literal 0 HcmV?d00001 diff --git a/img/m/es-default-small.jpg b/img/m/es-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3118b097d6e8cc4d6576824d79d203337d28f71 GIT binary patch literal 1014 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxlccbI#jOlU5{m6Wz48JKj4VJuBaCHcWMW|zQ4kao zRx$t@!vQp$k(KFYT*upVr!zqpKA9{tl;>M6(zo;*!ym;BiE-*&hcpC=cMGXJ=lu9) z-+hpK1X0`xG#X+M(Eav|@^}<5!4&8UFfaj~!OY4Da~C6%AcGLIqLQJ4W1_He;KYT> z21Y@JlP+F*2z4WyJ<}s@tG>gX#teE7KA)-6oXor7g4v^!Kldj-_3PzQ_#I?@*5Ubl zFZUhd>=jQ_Tw|<_bt0!;bAERF@4cyQ(_^z53!i%#th*oJ#MohHo3u2A<#0|*h5S># zPq(+6*6H1+AG?~z^hdk1S+?<%<5Rs1gX&to%=!Br=o>`=U_gTaJP;WL6&Va26BPmr z4;oDT01HHW#ZU1};Wwo}y)+W$RQ`F++fzu8S?UGL zP2Bsk`j1oZyC3!Du()Rcxkq3jht8sN28Z#4Iw)EM2t^B6fr0=qF@QV@PjHNa42p)0 zj)ek&6B8BS9u@e{;A$68mh2z$_xzbZr;kh4rhe_NW@&P*QZhIruN-u96{8u0psK~+ zRfcS_&J4>qTrMA9xyo5rU25s+OOFB>c$H=gsx3FlQ{}3UtUmNXJkKQ~WAfhic>=aa zKVMa?VEbaACBpr;t4sU+``Fh#sc@^hA N@A-A^bA9Fin*g)37PtTa literal 0 HcmV?d00001 diff --git a/img/m/es-default-thickbox.jpg b/img/m/es-default-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bd5603f7ef665c7008db59c466a49fecbf5f517 GIT binary patch literal 8219 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 T@Uq{`&V9IOyE+`^FDL&8dq?EY literal 0 HcmV?d00001 diff --git a/img/m/es.jpg b/img/m/es.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28d7b8c81516e80cfc3027882a806825d27fc2f0 GIT binary patch literal 6828 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/img/m/fr-default-large.jpg b/img/m/fr-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70c8ca6b7938871aa95e2f9337bf346693231b35 GIT binary patch literal 8272 zcmbt&1yG&KvhEUG7qE~JJOLIOT!Xv2ySqz(2o4Jk3)kQTcPF^J1PBlkENFmW!R3;( z_dc)At5@&VeXswizhs; z4rDZBWF#bH3{+GUG%O4(EKCecOl%x{2sREL4kjjq2!cldB_t%o!X+jlf|B4v388zlncxXUoATt<90|4Ox!Fa%jJ^uMgoJ- z{&1mx?(v`Wumr#Y0|6ii81i_<`;!0U{?AsxjG6yX5Eil9ecto{NTpdE+wB|G3EpL9 zYWalIyy)Z0+4E;>_Qh?Xa#BToQjo9P-X5mn{;Vt?fXaBuGnor_kU>+c;rfF9% zMSR8yk~w9@9ZRgFf%Zx#Un+qA?JOY2Nm zzY53H`#ea-Vy$v+=eFb$p?ZCF_h<=>+l&`|aVB~tyHDel)(}gEdTmel_V?3iuFWrf z&KX|_jEHi~YR~afQj8^e8W!*lCUT_wyj=hCAAEZK*W~}_Px%;pFCYLA2m}EC3CF*} z5D6KK0t5k2c?bxJIJre3c=%8@E?(6DnrG~$k8z3i7_C5L(0w(rxgokpj{Uf}rQ^u)bN5{yL>-a(C3##S#B8G~y2u<%q7-6v#2(OP z&$PKUynncTm**+}JE&73+iJXdb0yPd=jzpurQxLfEQZpCKz!wmIT6ESjlB-jYkU31 za?^L6gw_MZ#eq7S=KUJ$p^BVX7$eE%yroAVY>34FjsZKJ_VhN|jNluQ$rW<M6 zb2yR~FqjYyyP6zD{zin^UU4+ZVQ3Iv6xrn#{wW)nYSFl=!*~w-jP|z6LM+ESz4Cne z-MW#$yR6Td-Dk5MF>ih|#hyq9B>~ze-z@9apI(yWa-Sq4 z#W1AnKWM1zE^CakaK!JwWv==>dSooR;2u^`oXd(%4k4U`Z<42_y@ZdHzG1*-ei~iT-ZYT0Ctq zLfgCbAm;bPJKgxPN|t^OutmI*c`Tjz7~45vzd~Ox{b-qq%I9IY{OaVFv=;!c2LQ6L zG0|Ghld#U%vq`rQBLxuE{_ZOUE@2hc+n>gljKeH)nnzJ6$WQQhzotsDI0j8CrN}uI zDfj1`&AIkWDeaDbJ&2jn#+N-2l+qMUo{L#N3;+GQ>f_$;!%K>BO(Nvq(gtVw*4JMTXBo7~OsZ`W>7 zlJ%|_ceQhpTcmu?aM-;T$;tk5-jSVujd^gKXKeB_lM!5X6;b)F-CpBY`RrSG*U_qv z2w?@qggC~;6pVtwUKwGrNr=VYpHyaDn#SqeGbEt(ZMFtBaA-%AT+pi_QS0X9wHq5R z7)-*2Ep|@ibhaeLrMCIRE1hLaN-0QehLr5anECh@2Q3?~C=-ej3u&=YY2g~Ga8ne% zqac8{0wI-uq4?w6Q$_urm~?}3{sHi(YT^CwRV(0M*#Qg$iU7I(uOguTB_ay}06~w{ z8WjZt4fS8S>~RS|!ow$^W=EzGQ*(zvImFFsx<%F9JOXQorA9R_gOrlm)dE-xo;RHkO32kOFH(-R+7mhc~7y4ahk^3etlyk|lODcE`cO zQq`Y#+-5!FaA-hVHE2@aqh- z27Y<7c#WDa8g_r97%WP(B_~_edVrv^l^Z4RmW5Ln0|ovOoFjCJ?dS;C0ZLZ zA!RueclcL@{`urGS=2IuH_GmI6vRTu`1eg+J@lUGiPu@OFsV{N7J`YLPBW27m#(c2 zvOnAp6Ei8In9-L^DJ^4=at*hpHE8xlxaiPOGkR%fIqBF7-o|j89IPyx;(gk(xMlBL z7P$`dj9zZy@hoPHfMOK6CKb#v5~9%iXl&qKH@uSkh5yF9Y^n16XftEoBSH44B zpO+4e_08UXc94kdGJsaN(Z?mvX#bR65+%tx`s&iyI6qxe$)HwCo|bId$-L=K2wi?9 zYR0iGGn}2M-`KZ#s$gHL#8Q;8)^hbClQ&)3It`ClMw-FniFQw0?nQlM%tjxy$ryeV zSZHa$8e}gnW$Vu89P7eBW5r_HG^~{LKJSh30I(pksuw@_#jSb>S^NOxq-y|M z^Z6Gm^!IyU`s-9f&Vne1pF zqn|UhF4yW8B>KDRt*Pv;bdPqv^&CuW5mynK^sQ(P(fERPQ;l_gRMe-3*0YY9+Q=0q zm4&uXc_sEe_}_GWyiqXMO;}$7{@`ITvO;Pc>P9%li;i^&2c!mxPk?j{*K;f z^CDwzB(B8S3zEjp+7fTk(D^Jx`PxcbtfU^EyT327E7&kev_0R=nz!1P&S1k3U)pA6YT;A&LvK z+H#CFLz=~zwjKalL3=^zK3k3F1D|?FpN1mQMtJHvz6CT=C^gQ*Bnh4sd{05O*}_6r z*(EM2sXJv0OP7_fg`!g^y^wxU<>XZ&uW=mJ8)RqO8&gdtAIDV5dAXK9=lezz&lX!h z)z7+rb75ybj!xl~bb(%luTH)*j6luT!Sw{QL7CT~j%2z_JZQ=V_L#7yLxSN9;juAo zOg|UZ*bII98UyFm3Un1WybgL1qbXCHE6U-pw(Sc2v$gXsby=z(lA5bDBOeW_tl6Ey zRrg-y%tIS8V6r9jron6xAw($1BWuJ?)pu+1(%gM4LEL~ec zhHJ^S;M&62CT|NnbFT_{79#lzeuqM1M@zKextntDQog6jg0O8S^S0 zv#}txCbbOF&kH{+>b^5gMqySl`yIV|XC=xTmCX=Wc-ERqG~hse-H(-?9XMa~;zxHO zj>HVlYwD83D4qd^W%JkJg9);HvEejaW}c6B zD@h2{Ma8vZ3$1tnWD2I9O7A#(D{QlDW!=CJ0=`}|IQYL~sH%;N_(u1w7j36rifK_c zOI}Ppaik0E47v0wtXF78j&#K137gT*LzE&kGHF?Jl}eYYRSP(Fta|3uofdmx8RGcb zc_^h)%C5^_u}Zd#uH@VkG&fq2^6?o{EVKMBQ|t?(?E~n*a70k%V)LuR2I+1$-$h@B#2uiv$_}8cS{J{|(frP)_ zI6yoAHM^LanOh(Nl6xdt(@n*uIvucf{O^89g!%zMLSwpA5+RQ9L?k4&U_T(a${cP+ zm=(ja+IIPN;vS9`qS^NV7_sh_uZ9li(dDk8O9IuyV&&e#^91V_z#7c_^U`l=p?;9w zU+SoqR{2Z`sXiRD>Z^>vPrPSP8&f}Q+t1$8Mg#657#7X zif!^fyENK8{#v%?o!>ps(DIJ;Rjw-;2l1Q12GIkF_LL9)rB~w*014hA<7qL=Ok4BH zkmspt9%=;RX2-Ee;eND8x#%xe<8bOx^jdpb>6Pr@T**fv#={#so7wDg+}TYoGU6zT z$za;gLiWhZPBPF{uio$3{H-0t_7Y|RAHtXYn&UrThqx$$O2+0Fq|Qt3#F(E7^1{x> zhY75k1pIB$Vpk-QXUK{b30-rt<*d9f&iLsOD8R)Jvjw*{VqWh^4itjREgctzzGsUV zm3l+zbG#gMC>Xk#r!fk!BM62>N`cgD@rQ$_8uXAJope7^o3n|v!atAbV3u9G70*v8^e-6oV` zSbSOLK7=^aoUg(|s58v{q`RSPK5vULwHdZTt!NTt(PsbHr$C&Ui?{$o#>_Yuw$246 z6>65Rc=Lb;8gkEc;2Irw=IKcwbfWHkkvV=*S|f(X{!0auhu$`Q8ozghTDzgLi1y?s z*B2gEe!9TXbO9Hj(3l`X9uLd1f%4-O`R`Lf+rg5PuGi2cR)yYI3;7(~o>D?PhnhYH z7de)oy=qxb{b^m~b|orJwb+4<*=|`=k1i(wpNw$C;1pWG z94DK6vK{NDh(6aWAutzX9;TkmZ$DrqIY#%9E3Bv`C+LkYMbdB5dV}aWXzjh1qOG4lkwgOIx(= z0Y)PN+5*q6<}njVF_s6$?!9ebAzPi$HKG}A|`i$XTLMiTLt=d~nRjFIGWrMcF@V57a;nPk-qu6{! z=K`izDt?K-8V_*-I&VKpA;+xB9>~A-a|}}IkbMAX?vKU{t25;lC(f9yBlJl2Ye@E2eP#NFmG@G9l>c&;&>wd~nUUGGz;B{rj^-qu6O8`jH!}~h zkEA9M3GLJceJ=NrC-{bOlH6KI#r(?YPPG3dW8Rs3CiokJ9D=-^ijP@v_FF2slnzu@ z&o@sXx>EJo`G&UEP}Ci2B!V{x5kdP+y>^!6AlmcP&l*jf-rfOh;0iz<7nQpV`&)cAE+TjITwdKGI5tMs6%x2k^A`XG*~ zjh^s&S8N?4oxK&{0B!YM@!G1=!Z>j1fXUh}cCY2x)D$#^h)D?}m#Xh_LJ?*JyJDUE zeO8&U0I)owva#C+$mF1v3-^X)PS|70hfSc8QeTnE(+CZpRZRq+vD|$?p2T&FjMGm0A5pobdn{UU5k8GQ zW|Ac86AMv#7Io=%Gz9v+xw4ap%PN87qz5<{QMJ!-1y`F`Oir_8AF{<fKR)gkrWup&^aNLAKEqS|$RlBr;h}I!`3a5b^8W^FackUsM5q0>hvDn5_s1cD~ z_S$F^@^&2ttW@LAmL)X@DFF3HA<;kNMhB``HU$h`(u7O_TG@I&$ZLt_s&*U?eiYLs zhr?s>Ck&oX1+%_qKaLXOf17v15VFPMN`?uTNjk)Hhz<294Dpx%=d>dIKvyojXnO#d z&C56us4h;mkG{SiYx@~)1ny)%78ul~gn8)nY$qLey8-q}^ihdha(p9qpBC*Wj(YFd zG)NpbiF!-a_XeWO2I62VQ#x73@wLD9V~Xqm5eSxbkr*@piW_rQWDgVtIfMX&Iy92Q z2sK=IPhL}MI7S6ZFpd-~NX;{qv^Ib^1a-*c3wdRH*HLWaD)mPN29Bv?pWgSIT@mtu zll<5X$;CTxv+!T{hbhG`E=?>BPjFF9j7nW8{eX=yme-8%`*_4!(4=r^uUIE8M#|U1 zB%FR|FWd0P2i21ECh$Az8DDFM=2G%-BX;BZ=g_YMkJh9M07ifJVDVqQ$18o%C2_F$TH)^nyBAj zt|cz)T`mS_Ug*hBST}wN6JUYCPes!{_RQ&v3f*2@d)dl+N1myVPF7fmtOsJrDyxuS z7}qMG;pkP;krL!-2j+-A%$>Eb+zR%U%~Vp&T+yD6kQZzTa!>w7*dIlec*w)6 z_$0&(NsX}%2K6X0M?V#i-M%&10446XZV+VuEXJtjH^kqeWu=k5Y3;SN7DTgSBTqO( z$K#Yj_+rFNKU6fc;FFsm7?46<`gonC}srBI!0oUpoqsyVmwPE zF(GhgA@{aB7}=60MW!m>Vnfutk7?x0eY>g$D;O}GOigo3KDS|UCQ&jGzn75bU>3yJs~ zMrqDTTh{#c@drxj$+unuFK0GAbi%<+z4Uqw# zx1{Nkvb-nZ+8M7S3~|;Y>ws9r-qi9>T6Y4>4@YD)V{6FT-k)6C=Bs%X5ExMQhUR7Q zP=Kx}T}&hypXukiY@Z96!r&B=?|)2A-l44YU)mf!x;$pOa#q6(XtXhH4$l^RvGq3d zo?w(4Bd;Br9jWql9_o{UrglSC5X4nEQ!|0K#us!Gel|e-68zK%Q_RakJ4~>TOLiwP zPqpJz>xKRde$OYzlTtTq1~NE9v@I7+j+lC~FPp%Ya9jcZYitDjH8L!$XGgwtEP@p0 zo8VN=841pSa}pp;{$QCGXhh?>V8)ALMwD_=nS0 ziP_%-?pg3Y?*kO#ob!?PhU4T_^OOdVti7ja41ngD=qd1M;&eBH?rI8RmV4Mp#)x7f z<07(1*(pdyNXth9ulSGEfx^5Zvi%_;{;$q$WC*E^O+>Cb H9~S=$9s;s( literal 0 HcmV?d00001 diff --git a/img/m/fr-default-medium.jpg b/img/m/fr-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a216e5ea41430cf5f13215ef83141ef99f1347ab GIT binary patch literal 2223 zcmb7Ec|4Ts7k_8od2NGPjiqAjvXi;hwar|2GKy4)Y0)qUm27P!Y9d$2SZ_j%5F&pF?7&Ud+cc>us}-sG?e zKp+4B0WV;=53mD3BywfLf`T_B1wkkjBqJ#)Atfs#D~pyvqvhoBSUGu|JQ|H9VQ~ba zf`Wo9Mp21GRKgP#h$}xqfUpe;l7=8@q8wU|_8N2mwkUrQk>6f8BpoSndU6LD&QfV&M!I3gAnmS;Oy(?OR@GC>N1V7=31w ziJ!V=;zql9#w8n1-M)viapn~m4%y%M(H2*zVm1Eh_}E7I``NG|26mx=h1~-P6ny+6 zAPRwm2mltRK&0YHWZ0n;90meHE;QRl2K0OSU-4wU+wJM4Q|2LewLf+%zBaap>(KR^ z%tOigk+-5(Ns5@X{5PF>Iw9)u7jWYGkn%;S1{lNEm-eSbwv=pZKevC**EyxpTql8& zf# zzbGKTDNtZ&5Fm(vP*ReAV}pQELgDZPbu$f3bJ})d2)7nXUPs;GefkBYW#^SQIQb7+ z61K?2yKTb2Gasw8A}aRUsKrZ^7WJ)Z>+=wJQs+Bwp!C}77K7U6wC0C~b_mKW6<2K# z{2|PGtYMI5vH9smozbDdpD1(x~b4rsFN86 z`nfL~x8@IbNbd`80wyEJ9n>rRd0fszFIo$qxTosz)Q3X@$M5Alh*lj`?dn`oZC2Ay z-5r^RNK3MP`;>#B8r%9o>9;@RHBdN~bDGgIf865fDS4}#KRNLqcMuj|)_53r2 zqxDp)dY@d1$EQDL_{WSsF;e4ydM__zTL-!si}QJfqB*ZEDP4HlvZa)PF8iQi_Cpd6XdF!5OY0NHX=F`bq+Y9_NwNW-Tb6O z!xgNyo=!>SCnb9etLYCykN8ffZ>aq&%+NgC(*ey4**>D8b-mmAu12dpU>eoa%l$2N ztcH`b-SUJ`LrN3d=VILn0g<1-VHq&=RI6GB;0Dyh!gGa0B2eGQAAtkZ&1l=bLQZqB zWa^#TZ?k8szO=u0%-w$tbKYF^tLhX>g-)cM9bG+rnX*2|eqj&sPqJ7e^n^F}sa=)y z>ywpRb&JeQhTQ>$gXv9;m-5(xqlf!d6{7Adw(e+qS=t6DJ=|ujudr@>UwUC?8~*O> zYP1s}p6aQ5E76O@xmeSlw%w;wG<)C!q@XO7i-FE_kZW96)=C4pY44$A^U!+Fymn`r zbakAC@Ujf~&6hn+JjLT73l9K2#s&2BpVS7$*c*H<#qjbka{;w}NZ+6cgx;X|#cu?M@Z+ae^AFdFOr4QOm`v9j+m3t&9^7c${b8 zp(wu^LHDYk!CdlqC*fSng)+_T+{+0CL3!>3%N$l-X;lH^&0WTAi-^U36{}k}FI4f)7N$zCKtA60% zCc>JFyoi$G;+(W2F&t@}Z_rGSt!tFr7Rge;<{D_I@nig1z>M*1Q0>>|BP4%)U>Ptc z_*5YIC&ccF#{N2 zXGQ}r#GXm5lQ7O=JImiRsnrOcdrKU9qZ0PzmVlBp5N`0CO5rj7Wb>OEKi)iZ=tbDt T554%Ek015M9>BbY383dMnILVf literal 0 HcmV?d00001 diff --git a/img/m/fr-default-small.jpg b/img/m/fr-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69e05318a0f3772c8ad55e1d92885c840a8a941a GIT binary patch literal 1252 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxMw02J`ns~FzyvNOUir7nzXcOS4rS?`|J1<&ly$oo{9_u-nx ziLjLXOL?7B8Y)fH0v>Ew9u$1zj+c+SRHNq6>k4y{)V(<(%0Mm_M0c?P*bZh!Mteqi zJPMd#3Jib_W@Kh$;^u@onUP75fmuk=&{05GK`F3t;=+vwFR>Uo1tlgGHeH1JfX$xi z>76pSM{}BH@-nqG-$`3HLBz>gX^L?Xw|m3eWsgFAx1Kl|e2!WE zKH~dL#&GWK2aIFWigq0B*nckc<=RQ}7T2%t?!M@#b%Tldqji`8TZB`|cH2XYzDe8u zoZxm??ZP#8nc=-q?ZS|?_LV2AQainr6Q8?;bNZNTHf2E(T){oT)j(KZ&0Xr9ruxEbYrjszIw@*1>xcin}Hpyz9{Y!lme6`k9FI1EMR-*v`%6S+}`siqcx{MVr*R z9^AMeV;r#R?v$s(nj5|Jj=0Eebq;o`IhErm&^SRyXG{IEe;b;(Rka;-@B3JCYrWs9 zA5vWv9KCSbr$rybS(g}isWcqZvD$cCea($MIa(UZ8wG_gYrJ1)ak7D}`Sm-q8O^0X zHF-?R@@||qTgbJcJMKP%fXxSkRrh6|mrpqL^Mxy?+QsfGRTpFgLhZw?&hPwgbAIRk H;{P`Rw*rR{ literal 0 HcmV?d00001 diff --git a/img/m/fr.jpg b/img/m/fr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed443472f6457de2a66f10fed0c34e25d4620b0f GIT binary patch literal 13454 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 literal 0 HcmV?d00001 diff --git a/img/m/index.php b/img/m/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/m/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/m/it-default-large.jpg b/img/m/it-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..97bf6f2f08d6cd8c84070bfc470dc5a22dbb5347 GIT binary patch literal 11828 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 literal 0 HcmV?d00001 diff --git a/img/m/it-default-medium.jpg b/img/m/it-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..461031f99934d59dbe75a84ed825b9b74101c174 GIT binary patch literal 2607 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 JLI?T(Hvtr}PZR(E literal 0 HcmV?d00001 diff --git a/img/m/it.jpg b/img/m/it.jpg new file mode 100755 index 0000000000000000000000000000000000000000..94802add7e6e15673d950cf943b205f6b139eefa GIT binary patch literal 35628 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 Ksl9)th5rG(VF{}M literal 0 HcmV?d00001 diff --git a/img/macFFBgHack.png b/img/macFFBgHack.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j literal 0 HcmV?d00001 diff --git a/img/os/1.gif b/img/os/1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7c5f3153915ba3acf02926d2b0bbe3ee9356562 GIT binary patch literal 958 zcmZ?wbhEHb6krfwXlG!Ebdu;u)Y@Aqxgt&RkJI{<9Zq{Yy|*kaIojiPvc=)ZbdNJr zBQDHwy*B_>at6M7{%=dl1x9rKukgxZn-k!>Ne!A@4m6~sN zv**s8yJ%X+jwNkNmo8nqcI~E3oA&SDdtiOn>Ah1fZtK6jq2>AhuB)f_|2#hV>CF|- zukU|%W5c)0Yrj6-@a5^ABS(&$IdkU5jqCUCUweJ;%+sfL{yaGR_uIk0-;Y0i`tOQz`~#dG6s|<7&vA#aB|3aY*=uxnS*~{ zM?w>0cMD5QNW#O#N12!`oeFN8_}IWEt{!z`f&+s~kCaB>stX0l%xxU}Wdc78nA?0M zR7@W1C~#zMA@VR-sVFesk%5FV^!g(LATwrMJTWXwref@oYcH4=RNq zcN8N2manVy)w~E8dQBdw4(fXsr{nnRxc>Uj{)3!&WevTbM<4ze@$1WOeOv zXwF*IS@;kOAIict7Z5euI?Og}uA$oNb`2XJxrC2g!AGyzwK?`*mmOnynD(Y^tiU#L z1JmBe#|rR?n|5uXU3bShe#bFh1F^kvq`Wu7>u zO7ZE(>i_nR3VP7tZM_F!RvxMQRJys@1uW02Hkk>Rs@}i2unZC4>Ya^+(m(-D`t3&Z~ zwN0M&X|H{fLyz2;^f~ovi@I6L`6Qtf*Q{qX=RQb51ECt5?0Q@#-N?5 z%yfB;s{RZw+#QqOEwA!kmoLglp3A7+kbI^>@-mULA@fu0-i#8`)4*-HJ`wNtrj}Pm zUXAcNvN5U4(>Hh6?*)>P2;rJawasV2QC2eVJ;NHmWm(%KlZEIme&2tgzgME?hG CC(m{O literal 0 HcmV?d00001 diff --git a/img/os/11.gif b/img/os/11.gif new file mode 100644 index 0000000000000000000000000000000000000000..57abc204b26d3135ce3d3d1371b3536abc095ff4 GIT binary patch literal 608 zcmZ?wbhEHb6krfwc*el+|Ns9V|Nnpc@$22szaPJTfAQ`6qxat)zyJE|^@j(q-`{!h z=Kix+7hin5^7QS^Coj(5e|F{0v!f55oxA<;^opTwHVb!urEkHXOLHZ1=^byH3pCd}7w7a|<^fp0WN|@6v63OLle6-`+cK zee1jpRa4g0O<7*nvox=7Np|PFvi6y|jnmRiSHr7B(=%Jnqg2{CUCA*~-9A#$E<(vRM%+4;&oV*WEJW7C zN75*m&n!aRAd=rOoYOE$Kre`2CsIHom{m29K`okD-HTntn?>25LD7>z%8NnLg+a_3 z7%U8Q0g69a7}*(O8FWClf#QULeQ!f-6RV&|TRU4*SChPttBZ^KBu7K;?pWPm1vzOM z8AUxWZ{cnmJBAf28F<|+S(@1V^;XE3XtJ)*ik9q&kzQdI6{WU9HB_oeJDiV!*(1tR zVugNyK$C?7BO`}_j_?Ye0Q07E#;aBeJB5ff2}h`|5S5ixH;oLs)}#`BpTR0Ja$C;J zgMJfv)OYYXylhNzX=UhU`Lm&MRkN7jbdlH!CYQDzg|JVlB8Dj*BI>?nA}2I78e7;6 NR5cn-7zr>~0{~mk+2;TN literal 0 HcmV?d00001 diff --git a/img/os/12.gif b/img/os/12.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e5f3d24c50a44a22511ac69b9a914a35c3e05df GIT binary patch literal 976 zcmZ?wbhEHb6krfw_|5RETUf5YuL8_!SLaAV5mn^QL3nz8lH%x!n( z?7Tl|(}PKyA5Gr!c>1;{^LIU%yZiZ~y$=`ff4XGfqh$vkFFx>M$$=Lu4nALb`01)6 zuht%WvEjtaZD&60z4&_Xr4NS>9|i~QC^6VWK=CIFBLl;K1|5(?L3x6KV=cpfP8pAa z1(WqyIrm8lALE{?Yd%XwWX7?xQbsZJ6lNNH?3OYNo^&SRP~szdi=ZtDoeP`TT3d>` zIAks|wYQ0Ia~#`g)N(?gQOIo0kAMUPX_M3%7D1yA4lFFZY)zTP$GSS|?O8ZvCNw69 z8V7E=v*7}>M?hTw-cv7gpf#(OG!JjaNd)$!3N}QtL!Th=h&Q-O))L!YQFsX5;DstWnIjc zYg=6UTwL00YEG40d37aaS;&%8b4vE*^qi~t^XrRElgX4zEjgP~T27VRd3R;asU+|z@WvT12P8WCkD1`hp7b~I#T@}OVp>TxaleQ20z`I<2S+S67wt{7u87y$_hp5 zi~U-aTs)b$7rGl-mK-|N&N4a9MMPblIonx=OGr#YTwFq;Imv}XR-B!^mzjaXU4)ZM cf=_;?CkGGn!dbo|q6`y)Io1XTJ2F@U0G9%BzyJUM literal 0 HcmV?d00001 diff --git a/img/os/3.gif b/img/os/3.gif new file mode 100644 index 0000000000000000000000000000000000000000..56d6cefc50d660779daca2a11fd78675b4a853be GIT binary patch literal 1046 zcmdUu{Zra?0LPh9Ls!n6Kdif5Ti3(3YrBlQQs-9Ri74za*<9Wptk|r()~?fPHS20K z`Ob+?BPMliHtP;;;t2zRjdiH#S44b5PGCG}e39ob&kBk-KINa$`(F3@`Sr`Yj9OYy zcp)2?jk}4%)ovE6nh#F29#(f8Qn%+#vWc48Z)-Z=n&RebelApZ7R}y0y3|dy^YiU} z1N|Wrg{yxJZzGxO-wn)ENR4^9hm#p&7 z4Ug(9(r>MbtLR^lQ&{B?kzJxPm$cX+qPZU*_eyA91>_kbc@<>O-xZ!=N=yOSAJ)2L zmz~44j=?KFWvLG#`NzvJ6(ux5NsLkw2qmJdvMKA(k*`ps&NlL+T~%*WU5ia#ip^b* zY3pO!>p*`sWvEY?ez1(OmL|FA80LxY~`!z5& zb1SH64ryAPa~!w!H;;}J&~ZHTT|RwRWUeVZ+Y-^WhP7>Lde)k;HED&D=5}Chi|E-= z12<-5CoP=RKiqZ8@80eI<$rA2l@e4rjg5_@D-~mSu zaP}ln{>CyNxCemeKJfI1QQ4Y99I+3_ox>ZB2f#N7yfT121U@;y9s^7P0z*;f2nZ@c zNVyrD03jrS%_IX;8~#}kQpYgeT5ukOCqZ-?L}$V3G+0>xD|)bM1Thm>HG{YX#1}W? z_NQ@sD!%-5-JV)UH`iUMq#LBd0K{?s&%K<$r*D-X+S1l1aD)}yHo_i4LuT$N{H{!R z@M6}BSv9$tNAY7bZ+_H5B)<@8+V}dw52`bE^tP1Tqh34Lb^s62GDrhC-+76zsJh>1 zJkXa2kHW&!U+Q)r|C7NzO#ewzqWc;m3(t0WK2eI9xA&KwZ=!ja`^E+5B_*gxSF>~P z{#+O@ud%^`bD}dh(pGuYXI_J@I2e@-rr@lw^cy~MgUZ>P^U{+%5|sX+y7%1=8y7xf z-6CY|&Mn*pmA02ZIzjy&A!NYM=4Z_hJ>W;D9PEL6V+Z|k2c_n{srma6A}Ob literal 0 HcmV?d00001 diff --git a/img/os/4.gif b/img/os/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..54a3e55c77b414d1d39404c38fc16eee718737fa GIT binary patch literal 615 zcmYk3Uq};i0LM>Tt!(0-1Zyp8y7iA=e;$rdc3J2zb8>~!^~Z5x>Sa<_YAm(g5V_73 zV~iMw4`bZJJcf-SG>$#UA#oggkmDZK;e*_phYvD(D3J=m^sVpX=ivh%zIXjyt!;y~ zNG(!C5O5U`^B!%U%B}LbNz@gx5%Zdn4}&2wyhIqAnwFuhRgq4kQeJ`~*~8k*m6#{M zlW9yYS^P>6i#jxcEbr`6aZQfksbb8`hViIoE^}OgGM0i?DQ6W^@>&^oKuSRAH?;M0 zH<-mCE29yIrSOJ8lLBTI!q}v0{Vi7>RK6%x{NGMbO0g= zv?Q6+c_L{Tc@7=P(P>O7S}>#n)?u#jARv-yD3{9ozAE0J36vTo@c4dIj4RN_QW&x- z8fmbUlv&{5q(lZtDuZhYl4u7q3#k!`%Twl-Y3aG`zuV$!th^?v>z0uX?(OX%|IPi! zR)HW40uI>0Cx~60W!MkgT;wC?^7$$&$A+EGn>Xgb^tAilyADV5OWT~!-F&C6?$skZ zIeMw4rk@%6#K8M4t@PJh506l1Mg!MQ)eKzddCUwuzMKmk2aWb8-uEYuGR|gusMqgr zeDK11yJFxeGeOopU+k=|_8yzM*j>-`{T?50tHy|_LzltCf}%Iozr~U3eQec<^Jh21 z$oER6spa*0>*&IUp75U5X5EY5dS{)3Kteh<{Ga<-0`LA+zbRZf{LE2hLwx@L&TJS~ literal 0 HcmV?d00001 diff --git a/img/os/5.gif b/img/os/5.gif new file mode 100644 index 0000000000000000000000000000000000000000..cbce89abe3087e03ee31d90465c654e557d84006 GIT binary patch literal 980 zcmZ?wbhEHb6krfwXlG!^$;qkuYdASta7v8G)L7B!@!~TQBxfc{%}$n`lOi`SO>us@ z@`4PN#n~Fm@^qHx>#Zy_SY2$qw$yBWx#h-6n=Li=TWg(mG`Q|+^4Qbjy|2yhKu6%A zuHeJnp~w0nk53IbF(KyU#JCgFBTmkYJUJ`+)a;nkbK*|VjXym(;q27p^V8GL%u6^k zKk34Z^h>icFVD`tJUi#=+`O|3lFlwnIkzb7{F3zZOEWJl&%Urc=i-XoODprQtj@i( zy71zPl1r<~F0U@Xyr%fd+L9}4ORugkzr4Eg%G&Cy>uaxWsJyzd^4g}Vs~hUCZ?3t% zrS8Voy2sn2pX`c%u)F5%p^*Pqyw|N;w|)EeYnvLcZ*IQ6rSZnLhMU`gWZTUhO}BP5 z-`d%7dspl2-R-w_cHi37b7ybIoqb(*_V(Z1-*fLk@7)8F?;o0Q_u!QKhi5!EGV|fF zIS-G|eROicMpg_qTu4~msum?8PO zm3x}0IM1>f!EQa%b$li*S(#wqGDkmlgN~(8%NdqtxqCU8lTtV)$R;XDJUNiYDWqsK z&!h3vfdy=)Zl!k$gr0gaH%pxRa3Zmpja%4DOk#@zn|rUMwpWkFqyq}91|}(U6cisF q=4WP8&Da=p)I(6ou1Y|`BbAGVomWD`pbL-9*Kc7EYId9xt{=9qhCn@Dm zQ_CAYoiE3Zd(3iAlRuZP{0R&B5*PEv$>mQ~ z&7Vh4{^aHSNlW?C)$_*4ffI~*MMfmd;tpPmHbJ|`Tzev12&-elZBCi!Gb{tBnk2p z1KSLTIRzdfVO={|cuq>5?dS~Bbn4OIlkYS5)fBK|N5|^Tg{&z%xKbD2l2MYmo*2w6 z+dKDC)1nn;V>!y5MY+uMrKMFHG(9r;rTO_qq?%l1m{d(9M1<6Or^|_m$g-O-&vTj1 zC1N6_!e*{6#_GIkjg+RQf)JM>&lU@DJ}y3$a!np#MQvVZam8aUnhXkOU38{8X*UB_4FINwp)&vg literal 0 HcmV?d00001 diff --git a/img/os/7.gif b/img/os/7.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3a61298ff7af2434f66bdc7aedde6e45da58671 GIT binary patch literal 596 zcmZ?wbhEHb6krfwIL5#bGRtSpxiu~OYVN$cld>*l&bcW^o*kKUXiCktk~O!MeEIdI z=UC64ds|YLrOdfD<<6%&CEH4BcGYZov}MYnDO+x>Nm&%rbEsv>wK*}1Vplx)hm z^61K(Q&U>C^0o0^-s;X-~c1Idko63sS-dOTuW>_(ECBqUtj?X~o@T_g>Rv^FW)b6B~b*XA_i zlav$@WU*)C(cfvvsx7cyo5RUoL{p!UnM+I1O_pLnVWymsf?Am5IR`0PDNLg#Z8m literal 0 HcmV?d00001 diff --git a/img/os/8.gif b/img/os/8.gif new file mode 100644 index 0000000000000000000000000000000000000000..b16b55530d4418e2bd9115499f7e74c5b5038169 GIT binary patch literal 387 zcmZ?wbhEHb6krfwSjxcghKc3Ru_J%1Y`)0J{0Z}UBP8<2%jS!b$)BWdYTIn=c>*K5xWC{`lE^aRVBz@<&YM3sBiRpy45Z;zIs_ zOt$#~QsDCk=!UeI|Ns9p;0205Sr{1@Oc``Qsz82XU|VotR)L3(nE3Q1MTu)xT8T=v zH#;n`IhxM;Wmc|PQ@fJcl`Mm``mD~1DJQmapKbWLAw}ex`tP#3df22)CvM4$ZR`I}gWOhnKw-iLY7j`=(%Dq_SUUfm* z+e7`)GgEg|7j9XI$DzlO7v(4;WWgS1UK}B8;n|S#ys+Wuq#T8Xhoa?Ky7tBXi+x{y zzwbWq9X@+z;N)nK3Q~VjRL{5%%(8Gc0WuO^0QCJ3m__yiW;11@RK`oTouk=o%v~jR z9m)ln6%}JvlByoA(yHSMT20Usims4Vm-z~?1%}Jnaz#)|HFM5{OEtHJL7@h#Y1}4! zflfT`sTJcuhhCMBi9TovY6+=TNolxv6$?2N*LkVLdnFn-4YYtv2O7E&A2$@Mj9VD# zF6o&T_$TAYuYO%VABJ0 z9LUwk3gU9Kw@T!yYcyP;2-Tv=XKlp-<%*4#TwY^FvN5PLMgjBRTSn`2-DvQw&BchkC^E{>?0O4dB)rotBD zT&^ZtK$%0rj4juRVL`MEB@K?uL~w;R>n|B5k5r$SjrPw@pqPSY>z<&bLLf#sIMMl{0FG9&eZfgUaiHU)DriY#i!6wF=4#N8SI`x1469~We zZJ{WQiftB~pP>A0>ip619W%aB7b^S9(5KP)$vu|>hot19Z*O$EYc$-t(V6cY3--R<^D5a9 z?6^Ddwk!YJHlP2KuzxH+^yETBd-H+|!<}G%&$W|bH~D@4XmsrA-=E*>PF`3Z`0!cE zdE9*>Z%#IcJN5xlM1wC61*ZFkQ%~9x$G87<^xMvV-fbEF?qJ{6ZDFoCIdx}$@MCTw a&t;zPJf`is;{4DTwnEf_*ZzY+>eRpe^R^BE literal 0 HcmV?d00001 diff --git a/img/os/index.php b/img/os/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/os/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/p/1/5/15-home.jpg b/img/p/1/5/15-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5af00dd93c018eda426b33c379a360c43fcecd67 GIT binary patch literal 3535 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 YKgCP~@|hdq6Mlm?JO;hK+&LWoA4;>ozW@LL literal 0 HcmV?d00001 diff --git a/img/p/1/5/15-large.jpg b/img/p/1/5/15-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1c9a858d189d6b2d5ac2be8448c014cc3e58ddd GIT binary patch literal 11546 zcmb7q1yo$m(&yj~gF6J9V8J~|@Zj$5?oJ5q?he5vxNC3??(Xg`fdD(n|GoEpdv?FG zXM1Yes{7vlb@%P6TXo+S-!=h2NihjA00aa800I61-c|s@04PYvKLifYV1j{%fq{mG zL4<>Yg-1q2Mn*zJLP9~s0HUCxqaq;zae(NUSlHOu$Y{8DI9PZXSlC#9E&>4s?gI^j z00V=7g@S~F_5U5-dI0F~5cClAP!Qw*NOTA&bcnY;0MVae!u%QTe*z5nRvG;0u*>L!gO`dK}LLq*ehNxOAtH(1B?douA6{rA(k7unBb6$j(uVp(oDPNeYx zL5rK**=RVXN{u#O-z%){99&>?%Ok1T;C`Z3hL>n2-x%u@b=(kd70>F0nqH|IQyk>O zPqkA-zhibIHZvHLE(o@cCQ?V9rCF#hHazgcvK6aYsy3!P%|>oYUC9`qE4<)$8@HJw zQ%6$1G%l3~05PAgNUt|$^w6JF?meQ>(oPT0T_0~VUu0fC>LrBaHl1m=T1|{B6uRq4 z7Q={snV_B2zqoZHTt>;@xIJ7q!q&^0x;x|O*A_V8k5Zm_<$8Jp9HjM1tbD!G zD*H8WRx={x!zbaUopHFOp7jRcgv;&P>F}#7em@@PBX6XT@4x3pimTMO^_t#^;B{nl z#Pf|p>?`AN!8u=Bk_$m$0|2J1am1GfQm!RZW3fR732UUSGAd@3YFcTPO5(!va`D9q zZ+|Q#7*yy&*1US)HXh`ZiJIb;s>9>rkqj|^>5-D($;B6Ni0ELGbEsOXcqEil#Q%9t z-}BSnc@B3-M=Ez!Wh{5UC({8#lyFun^#R*qZ>Ca#@_vV>396ZFI`>ze*uA-lFG$=hem;GXOr(a9@vpR??PGm48E|OL>>N+!={V!($T=3r`G(jA5t7cwHJj4yB0Is`19~8=0GL^6cj{-lCYE&b0vNMpAYnZZ$Jt@Gnjw? z2xtgM7)Tgs@X_&y3kd+9C@>f}u;`fB@5q?pfLN4lxD>4HJ_Vm+u8OWTzSPYR#C)1p?@h<@j|)Vg95fB+L?n zfwE}$F+F@Wk=X4CwQUV%-JBA4hnx;2C zRXKmmnY$fJ6_Fv6E#u-hxc`U8?bj?)-Eeo{!1kqdI9Xaj(2hH4!aRx~k$1kH)}TCu z=MtJL8bB zu||&Fo{tcgMDsi$3v{WwaEpcWQRmH8u9=E?W^=J~Av+YO&DIUj1s7Uue&6`AsTkTO ziJbQ9*M27!=`{UlbtaMI?*MM(h~w=zAVet{NPCqeD!>JQU;?|c48bSTvFHsz<>>xB zSc>N!;nY%);(aZ7;Rt}{ro3oefH6dgFH^_#c>>B;x+9&!00-xK+#3%!chNQT0}o*+ z!?nU5B^GxY@#~L#`Q4pbg%tyWmW3+IWMTE7>PSak1Kk|$iDBn9--r$wiFgM^W9hg> zH_`WOii|;3RY*`@H$uO79QeQ^O{>1_4oL_j0AJK(GKW_(>UIho4U4g^dQ;D)cAJx> z#HngIPd*ChxXgwWW*c9>XWQ+-c-qYU-3i`U6R!Y_WX83l+VD>02Gx?Hp_;f|!n6%? zw|d*)S^w^13R2u;x3+)Aoy&(J zx!`e$N6lS!OtP`r@J_up6ZZ?c5?MFS5&ziGSLJpDYe$UBuZt13n%ooUrrb5{EWhxM zFRhcKn_$$l8~91n*TonxlC`77gDQ4vlP!t4M_U*JNtyw_H^2kkmOJr#VNSIr?~w`E z{2gjSF)&7S=Jz~QLgd(hpgd=mO`BvrCyNs$EbDoAHJ>R(Y@e9=#gt{MQu3?6qfB&j zhyO|--gE45e6A0<$2xjjT)%gg1LC7YP@7*L6!^3N&*c^4UG8ZrcjdQ{l!=s|qb!o7 zQf`^-r--|$N-U<*!wG2YxsI~_V&~puXE#5H50v!A=0*D(bF_|Gthd@zA!r@AmfAEUAKAr8KxSG|$y+AP z8n!rEe#x6A&G>HjTE42A*v+D%ebC|?f^JyS~5JVj2ZnR!iYJzY|Ndme!ax>e3(glD1AiR|_5eXPsVPr70SUWhm#V?~kZxIb8io0VNV5Iy+ zM0%=FvMCE4&R&-|wDrth+4nM$+btp5hErZ38CGmuy^+o>9Uh4?d0oI;Yut9rL}$1} z^z(e&6UY2_46R5lx4T{dsdu31&SJF4%xYvxcK^1-1M>)#=Tg&-%Q?{j_Pupf77qot zT8Yy?sHDL<2qYvlJOVr%4E)~}1i!05p<|G-ut5XKnOXhf6ENRVFbOK;)=Xg;7&~!%7k=$EAgC4AsM4Ha z^6$iZNp+)MrRfa2zvm%ox1$e#M~SaLa*D^}Ot>fBmK z-#m(Pg6!tc+h*~F)18dE>+ah2Qg-h}JEI*(SsyMf`cf>@0*#HuTk`sB>QXJmHpaib z&DjfkZzX@TieZfu#>4yYk#6KcyjxeVjUVv_)71+-KagMX$YA1JF40kZZkQk8CL$JA zBChZ0MNjQ(w4W5r zK~a!wy!bgKA7FXfc-rDs#>D?xIDr9xDxi- zuBe};gP!N|qOe_bph#QDo~67;ey4d^o|L}vtSXCv*srEC8f==`v;4fVmzMbK{HvZ^J0p&vuYokI%|pZ&hiovnLBic^zhJ` ziFUp)rBg}c*!$MD1fk*u|E^)tUQ)Pwjtey4>Vq^!+|3iYUL}Of*<2EL!T2hL@cJvD zraB6EG|Kxc1=&6n*f&Hr^S#A|I+a3q9!D`#TsBG)2XU30uylIFN=E@<5vg_?c6#_o z8%sOkKx4nUa~%xy)54z(21cqb?S%wm%yq$njsgedona>nG-&3-sbiRtUd_UaXTL&33A2W1PML)M?QI55n2R$@WqGcy z`U1xK6#FkFnV%+EpZB2K$v z7o5^bEUG5dSbV`rsWBF@`XNffh=eQ_+MUW0mYi48@9h45+IQ+&t)#7pZdGRn`<&q@ z`~law-z%ckutRi>S&#fYwW`MLgW6C=a@ncOh{`=^@B1^R}&}~W=(vg5~ zN5Ui05p%OxG9iaEPB-Gy*^t_Ttx!jsBlguwY*qAXkeBN&-A)sk9&roeqZ^qcm$2@I zEK%H6enatO2)p~o*bwNUiQ6=&{nW+&fp^ay^D-VU$BpcW`fx^Zn27Bd$WMnb@mvC} zwMNZ!BT0wPNk{8@o^CC=nN_k6bTe~D$G3N$ov#aFPis@$l&CWVkEB^Agz`y4K zCfdurB&-&b&5F>kG?jAD{=NJ9uPB{hjf4&efP{dAhK2*19{;V8pp!8RDi~Zk#C2Z* z-}!-s_7;=8z3;zG2Lfbo0JmYvcnQkKzj3@=S~I4q4}29w>a3_k+ju1c;fDP^YW_M; zjQ+9BOMuDNNLnrRxQnKu#NHl_Y=x8-`ZA<0CKWFe`755^sa@RZMS}YsN%t@8-5)-R z_V4$k8oez^BMu&I@R7tg6&tPfyGs%MHa5sJN78AL2R&Veg3Uy==}!3U5hHLK!@Id; z%?pbBGJ4fNahHTJ?)ag=z5!5qD40reW&4<-^FBCbCLzv7RBVIFABYRCtQB-mhsf1( zgsiq3XE3p)SdENs^p^B?dM8^LuA~FH^=D7zu_CE3LVQb&C~4$dXk!@>Aw^GR;+KA8 z2PRb%vZ}Z1Ri>dP=WB@ma7zcv+=)wfwpk7iN^-VTNN8+qM4;6`lt$cQXqs>6+$K38 zU$MB^?f0UAhu~F_=DICzuO%Naw9H#^mfw$_V(=2V`drk*S@N|Ugyd4^h#7B^zyPITpZeQ82UR+ogj%YF}$OC>>6;kFVo{BCO^RB_Mj-V3QA!csnO!YvzkZzyD_0#~aNd;+;H6Z#o71M@y02!37t|txRBw;hGPWpr-9kb~sWUo6A z?lq;!P~QnUlm@^8a5Ui<7s+hc5=UX;?3t})L<7PmMZ&pfB}!oK z*qnov=Shtl3^_dFPRF8wd;IkdslqZx^?!U`bn8=B zVaHI9JM2#`i$KNQq&2H8k(14zsp`vQ-|=nI?1yE?Riy#8L&+f!lebR}`GEL?rZe+4 z_ogDJXqEh!W}{J_J^svu`c1`Z?#QJRLzzY2R?) zdrK>5@?lG2=w_qDWL-qe_;U zYSYvut-3ofz8r;1a$;dJHhc|~^@j4Nf5gbu{;hkh3j_TDRZ#si7qnA)?F+b=HaLQ^qYo(Y}}r0yOu@k1&k z!^gxcVYDG@Os?AqwjV2$XpJ0+ZsAtQ^qkr;un;IESHJi?1c@ItmO%Yw74_Fg-}7y> z=JyX`noY*_EByWSE*y5X$qUVS2E~M@*37K~BM4+9wTE^B!b6SITXcyT7bS^93NP^yw^uQ_Qa<-=pepMFOA;T5%bP_3Xh^AXxW;6fK z);0A#7iq=&V*<<_12L(SH>Te*IJ7ucI8&F545Ie&WFCX7($EeA;A>dwgz{R4s9xD~ z=j6iHQ7_#B+KD$W;M_lU|EB<{oVaKHzM-IKxywK7Bl#!;{r}GYcVqu!xsaq9IMrp~ zIVr#gooRpW(3T|dS-{BTmXlQ2=9Xha*ut43McBZZosf+^gN@L^dUEPuVKE*Q!~K=u zCH)^F)Kh4<`zPA?CzrdFo4fzSwz?s#GLvzbD=>^9l)-F8*B`yeWY>&U>$D$CXgwsm z@&(Doi;ym-DW$7vp{sGByWW%VA-BepFePW9_MU7-M<77BO;}>&Rwf|j@C+@NRJb{$ z*`| zV!^ah{Xua0Q{3zg!gY58VT&)S5kSfXFuhShD|h zFaFg4fHxDo|08w%+iC#-0^kAA0Kkqk(~JmLuQVkzzTi6uvIixNr)bzTX>hxD012*5 z&ArcfIS626%%l^A0jv*Gk5`YEx1mK6khH+sp5bpMc0W$?0apdk{__-zFAwB^h zq^B!##g944KIZ@w001RG*6cmDg2K8w_@=$kwS!D7a6sl^-mQLUun`3ko>F)ms}7M# z7y!RB!FDqa-;2i7JI0$63OYQg94@QHqiDsq4fF-y1Rn4SnMoM_9XQL>i~Qf{f5r=* z3b2kuf&NE1`eUK`GuA%=0`NyiVv18R(6@K+o7(!1aSHgGPq~UZaERuoh#{K(zh4wDpj&_oHj zEsB{nRd0NW3HvvDek3S3+>iFRc%aOfLIq2E!(OO;6X6OIMqVVT7GcqG5c;&v_8`5{ zFa6a1J*3j2b~Zh{dc=$0ulk+hj)8t(s&JoOJ)a}>x(ZFO<_Hlv(vO}lR+ma1ULjgYc#x=C@{6!j? z;lBbDazKFo&`K4%J!AW|Bpj^AWgJplHjm=kC( zo`jC6m|}{mQ64rQt}W*8YM@^6+vO(3U)o9Uv$wolz5yt+mKJ`YXc`vSaPl6NJz|o} z#L#7SI5)psD;epcZ2x+v*wJuut4~<@1`zPvIqLQ*uiBiyzNL~&~9~p@hjn zuqw%v`ID3La2u8se3|7#TUW=!I*Rc81>1#IdofMuqFtw{)~$qmST&7lpcFu*jnt!z z?tYzUl0Rc~qW=x>c>r!Et)E}ujN?JDr^siN(%TPI0UE|3$Z@eS-dsGXn)X-J0KCgL zJGk}8_H^LP7$_xxu|}_8(r1txr1+JC<3?oBPV^39!EkP>gJzm%Kk>fV#%viYx*-B5 z&EiYS6|Uo49U(&d{AFlbcfSYbLuKj%{TZH9;sCeN^OOFAy|_d^YF2p-Mg zAY$BJw{S~i2G1W>b2y1+uCzHqJnJ_qFkEg8LyjBfkGQ>f;T>}hW1IkV-yydrLCKJ zAPxEb)T0Qy;@O)+=Ra!|=6GMw6Ju}nGIUGJg(50U@QH@&AS?$@%hy+1$$H*cNJV`e zy@+c7-nI)yx;Z8H(^d-%IPVPfDh|ex2$$XiM|x z4Nx_A>~YIucIdM48uHn-_r5T3-kYLCL;XSQqXqgvY`zGPcn$uJWf)0}8#WAM(MN;_l!hh}iVJC+ zVIvMykD#{2R>K+)8dwmV%GFxCc_E{~A85Anj2ysrV{365u#@7#gsdx%=9uH#K)_H- zak_~=$P^2JSBU#$-(l{1@*+S+v%U7ZU^gh18MnE|bw^RP4K_bk-VUowT_jh%L8*=) zG>09wW}40Ua~aV!)4p;EOR`+>2DdjzhH5w|IzabFeyhJTdR;K~Ui6if=sq!oT|35yX3A1)Q}l9{ zM_Pzwe)MWo9cq^zs`FsLPeo;#I2UJFE)Z@9iXo-av#4jVO=tv^A&F@;m2gK55}GSE zl~i~baQzKXt3|f#bnA)gl=gVicf&hoKyu{nYhXCFo@3V?Lr)x9sTpaJ4UBNvVcCDc zQ&2l5?7|!HpN{YWLjRntqvE#gyfxIaF|WMb;Eg*zk6-Lht^gTlLV6s~=Fxv*%G%bH zdkj7A^|XLua}a~+xV}iBY0{sV?|SEdH3G zdgk5e&i97CbD}dCKi_tyFl%$?kR$W_D*M>^qFxoEz8o78Dm-~tV(ZQGlU!T!Gi@Xs zd#k;wFmrct(bm48+R6_WR`~0Kz>Jm1>ggbVD|&0&#yqp`{%s>#LKJk|6o#z{09W9= zRjgRT5rS}?%=bDr=eI}H;)=b1S6|v@OM*Ch9!?kZuKvhhBP2BP5pfAdo!mrDO zrCVVte5KOwWReD^W7(B*2&*0R33y@J7;EoA$n9+O49$p@NLq!pcUV0J_rAD^c4(

    i=T>}@Av=}$tHMQCRSbD}YXn#v{L_}jkoaO=gQ7P&z2ZmFRh|-rm zbS(3n18N`582RpE(x)Y*o#Tf2{g|0ZPF3` zxq?TsZHP~|*qYe$H8|A(S39rm_rqgSPO-US!-opwB9$XwcY0DIG$^d(PE8hM`kf=v?gvdOfY?{J9vNe;;O&t*DA6hNq@G_DuAYJP zD$k(UC|~Gj83}vr$Bq_{b6PuoXA^BWOBGv>M+EC@Zm1zi*8t;hc%z`vDa z6CuAxw7Z&i1-q@I$|Gx+n%b6oZJWJ3YsgP#*%|fJB+qgT-}KtgD!H--1<$t`JHs}) zPUTlgbAplR<_FD>RU<${`=8R8R)Hy?-|^Mj&K`$1oF|9e<3_}w7tSM}ETsabvN`_> z$aB%zEiqU=Qf06_c7I-6A&>53!Q6q)xZ<_ZAUQ)KOMYXnjl5 z_5~BK#XhMV;Ar|TKOc(fS9~h7z!X%E#n#b+G-7bT2G)8wLqYsR!j*z7=yvebs_xpA z#`Tr2ZHqXp$#K-n+;-y3kTnAz50TCp2^O8AqTiUmh$g;2F#FDFdT7}*(6XIbdCCWQ zuP-(bXj!kg!$ay`8CUK#?8yf)Xq7sRm_$vJYX*&v3t^&r!M8@c+89VVHEW{6-IKfu zwaeJ^S?}dTNb}M6$WOjP&3(GbKZQtyVp}&kja$8HnpIIO%Zu)s!=HwsYGTKiA;idZ zQ2U*Di;j%sF@bcL8gy}b%mgI_&PJ_tJ+Ug#Kzq{$(Slar9$5KlRDIeL z28_zK+8`)}9#obEDy4Sdo|nP2{DtVHD8uA2Picv@FkbK9i)XfYi?JS8z6t)m5j>Ka$j6eB=|1av&nRfP|~zj>H~SUFQmM{kJ^n4@F6 zh~@B^yobt`hP|kMizhyHPA44+*E(3l0jQ~b69b~j2m}Q&epjSDRey7Y>`-SHN}O)S zp1ybkWR?%+FRK;DygFGkHcoo6p46KqxQLr?^Y!i#p^ZbZ+Wpi@@)^OD9ca?SYU{Wv zM!wzlV$`K_Z@K6r)${4I>V&+qhn)w6*EUCxHE@t=2y?o3&NLM zr)?=vb)DucS9PF_c*u19`sDHC1j$F5*7NL^-S9ffKe&!m+9`9;?o&72x!890b*Jm< z4Pf4uztXNH`Q(Iq@8e)|P|VtXdx4$Dn~#S^qx+DF5Yr-L*hkQ(cN+4p1pYNFfE|S# zwHiud)Tm$s{PD}!zQ+?-tsr(wt!y9LpGoW6XP%~oHo#!LYx(xu>8|Bz^~Kh^NkHpc z#l-x<$$u(v(9*O4Y++jyxe01`u6XfU6q)l4n%m?^typsZz1{!O5k)~-v#yMo!VvnM zmaTdVch%!OO{gDRN~`s>*!6hWB(EqXYqxo~YxMVg{*?+2cGRQ z_J~bI=PGzN*vAjhMCsB?8KEh!0Mgx1^}6Qnic*1`^0y&Cef-% fCebRFDi;2ew5r)=Q@I}Lw7MrPtJ%H!ye<7NohnlA literal 0 HcmV?d00001 diff --git a/img/p/1/5/15-medium.jpg b/img/p/1/5/15-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ac000dbeb1e0240d6bcae9312e8a7e7d022acb4 GIT binary patch literal 2043 zcmb7Ec{r4N8-Cw+X3SuQccwAaVKRKjKAN#qQkLw}VK_&JX|aY+*@-I&mE}WB!V!t= zYmLHDjxAYI`UsUJYZ%$Hw8{5Q=St__?|FZJyw~-+e)n@f_w(G()~l^i05&%^GX_8q z06^pewgv$M00lw(g9I8m7#s$JMq`AqSOFYf2#*&Q5*8+ikYIucQAAi6rohAE>HCSH%l%# z!Fn@bI;-P`YvyGOaSOAA)}?PrMG+SAND={r5{TL60YZq50;C-jERn1)28+uu^bk%s zqz(`RZJxeuI;=OW_vTCpL6n}9Zc+5LrbnDqTemQ*A79<~Li-(NZ$^3-wk#jcx$76u zH0R=4!Yz_H6w>NjQbn)&?I*#^uE@s@^jL#ePh2GJ`zu?ABv+e#S>{TNt(fQ{8ly6KV5La)o<*&!-u>$!>gWyS#&tV6I*meGwo>Z zyAA|~hQRR0Z(Bh=3=u`5p7oG|V?5T6VYO`;`ZcF4#wHCW@Yw3@p9VJF`R&NZ@iTWF&v`O`OJv$cdlh~c8FwF1cQ`$=1 zq8)+QNEM%*l;>@+=3WB_S*zAQ*Qh+6HT3Ucr4ue24P_d^%d#!I*pPC4oR$eNe>P@U zi~6vSQK7Uz*S-5NH^An^@Sd3^!>E^GJ;nMxU{ce)hD(-cTV~ap4@5n8o|@6CI-7T< zwk~r6@jSnU=+6tk9jfh`OMSgz$1+`T*#ZsD1X|M|v#RXgD=|Hsx5=RE1XXU=iRTiGXB^<3&jTuaCtGds+-FFn^e zQOyjrDW8Znr~X`_iXe-1I2Q9?->qnNB7rL zi24dJqBi2bA4UKHB8{mJvm7HhzB$}(X@*|Y((-pB=+ZXTRHBbXG(0u0FS9&FlD!iR zHq2lyVgjf}>GE|F>spCJT6Z%?e3jno`nr<#)eMy&sReg=t3<5^nQRb@ z3HCfLGwP#UakC_0NZC%}U}sa*+E=nrM!z!YbTo&4zdZ90iT5%{$kCvC^tRXPD5px4 zdD~{p_US@smTYLhuebauURtW2XOP{(>REA%EGhA5v!v>k`M_5CJgdWpYT!+Hp(LA< zcuj5S^U5YxVVCBoiR_KWN19%Lc3uFiZf3bCdo0Gkz5U{ip;h0kgQwzsN|3cKK})`k z!e&Xu=-@I+{B^SA?$wl*er|C(9!aTD9$9ZdWcaqD0RE`L@8dPbTQVxHc6U6$O++&8 zKEnGWitZ-z6-E8nD*#BO0Wfn(nxW5%*!C7YtFi|luOPNd9q-DJtDT^>WGr6X?;1kA zBJ~_Wk>sNwOZ1=KLiz$rGyb+G-&XLfyR55WjG(DPLFR#--cAlfo2j`cZy~Sczjt+e z3vYMTH;2>Iy~K#%j{RsV{KYN#28n)ad4wsNKXo8tapkDkxsRtWpZ~(uCCEyK`!^aL z>1ZytYOF1Ii$5C5?)&0I6Ny1R5@!e3<$e9bS^2O1H+{-VsrG+K_a=(j6A-l|dO?GpZRH^YPs*fDLhFw)A;yuFlsjw<+6mvZbbb0@`x*MA+(CwiSNx=S zX=<@;LU}nEnmrkxO3zR%t@)*PHpb2|;VQ!A`k1-M5*4z*_mX)b+PPyGx z;ej4Gwya>-q3#*Y<_KpkmW*z*psj08J+Qfy-9~c|m|$}sV(W(<+QwCI?E5rzs(0IE zU#Q>=o+?y`;@&7&m`r#Io}9p)NE^An1-Ol-J>gy!e7=9xaS5N)8o-!7uJmiMb-sBD IvZi1E59(+UQ2+n{ literal 0 HcmV?d00001 diff --git a/img/p/1/5/15-small.jpg b/img/p/1/5/15-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e7b475bcbac9bd9e1b1e51f2f6078049166c75f GIT binary patch literal 1222 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxC@1_d3iQ+Q7E_J0$2A9QaOjSZo z3dE!r^Um4yT<6BEO+T}3gI@z}mK6kgm5~*0FVO8w41xl}A_|6qV0(dnwP$3Qw`_7^ z?8Ro4yY>@in^n{UHOdJBos6oHfr(jAQ9wvo!4RyI38a%(?_=&I$%^$Hr#N@H+u8#) z8UX#u42*X!c9^BWP-A8h6jHpX6qv{=0Mu^c*tqDRX<_rkg_j;dJl-%6a9ix(`aq3U|Kcn0fc+v*2ze)p@*uArE2sBPyco7zB_KH8Pt6l{h&APSkY5bfFrHl7&rFO=y$!b0yJo841Wr!K~j2iZU zC0~SIS!<>5bQ159Kh*l%K(sUI{H=&pnrYXoXB!pdiV9pcSKXy-xhXR0sdu=3;IHSW z>NuHh*DicxH-$m-JpMiFQ6CndLFl+@l3bRkT%WMWZRz?u$ScFS~l0e5A zDkugf9t1lR6v+Z^EiPL+dJP54p6s0Iw70UOcj85$Rw+S7VA?}UnGB4A3<3&{kkkQ+ zV}YF?r&SebnwBVs>igpk8OOlFiH!mZ3paj%hm63^qNk^)%N#qn)$b|)mat~-j|$aW zIV0s3{M_l-^+>AuMa6-e-pt&4&2^r0zn-zk>x=l5to7A#3t2>&m{;BXq^CW{@m-Fm zjm}^B8SEOf1bItM&G`yl9g54YOf3_w?c^d!# literal 0 HcmV?d00001 diff --git a/img/p/1/5/15-thickbox.jpg b/img/p/1/5/15-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..876011964216a084c9e84499bac2066dc1c63d00 GIT binary patch literal 31270 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

    ~_gNQ7BL(1}S| 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 DM+?qI literal 0 HcmV?d00001 diff --git a/img/p/1/5/15.jpg b/img/p/1/5/15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1960498eeac63b2e4c185e87e439fec659721756 GIT binary patch literal 33661 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 literal 0 HcmV?d00001 diff --git a/img/p/1/6/16-large.jpg b/img/p/1/6/16-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df53cf7e1b3b0851d0f6ed8c46fe3a504714c303 GIT binary patch literal 5343 zcmb7I2Ut^0vpxv{LJyG8L4x!is`P|Nk)|{$0#XE#B1J`MN|W9~R|KR9NDUwm6s3cp zB1H{Fnus(hf*^=+1D}5XcklE3_rG_}JX>ex?Ad*HcJ>?+52pc`p7t4S00aU65a|I9 z#{n!r1_mE7i6A51gQS|8F{M2Nzt z(9wAR5C}{Lp&+M(l6n#Ut>ah#bT|gkl97~PWH8b<{xbQa_MdYY{ErMw7Yz-2b(N&8l_D(e6Kk!(>(}@`O6f93LW&JWY;Ipi3clbqh#klRz}?;W67$i;0MbBW7&~raKk;}?$`8bR+B+b8`;|NOM*Zfe zUnjcMP2U8|vaeT45&U)fQ9CB4UxU6B1k$@JtvbAZ`@l}4YKyX`S?VEiz1iTrLKgq4 zV$zrq`5E%1p2KD?#bAEdAKb3H-)~2%>-XOdKf$~lxG}evfv_}pFu!{qVX3vGQ0qD| z;n=GO>5Tor+h&U^vn9%vTzypWr7Y%_D2@vD7vDQ7K8g4D^c`k8niDYpc>-^bVYK|H zoAI$FYdsmuuAmf?p`%_B!E|9MPnvqz$pvQxPwSEvH2Juh56y^Vf+qi-*W;%DOF~Hk zpco7QK}gUCgCHc#9nle7A>6U1X%#$r6F@`OkcG$`rB#Qi5-w|+&PLJ??6ggnD9 z!FG90?LDKcE3H+HH<$%Oc|$geFH{`@mnD+f_6F;lB48Nv3J>K@>G#-qw)k(TFomB? zy+kL1=ct$=1_Jk#x`q|Sisx8Sc6T0I&cUWE_ja#Hua>gg(AgudlVm{k-{*vwW zp6gJ-hf!Ukzi#eH;kmBto?^?%PT+d_Ac2reIQ4KRLMT~iDhT!3d1oaE0>jA5gYzBg z#61}6mNVvHWwKjYd1bRY#(G=(uSfo-Uj>IQ&kJ8;uJ}nq3 zG*&b7fA}DvL}!?aQ=iz(1nv*LC8HW{Ds*ujZ@o&8tbvZXp6z||ScQ39`pSM~F-5%S z^LsrXj5T{Xw_jR|;5tl2h~9a3Yw}{7-bpCd&++xxI&E!d<=m;>*oNoDUv^E!%$48U z$~EG9Erm-q_KR#I|N90 zg){!cksjkURMm-~h3CV|IJ}E7OHg@3k zy%vhg$CJb0vKUQAC!e-Kek?*RBrG{)=J!sZ&;TFA`dGKQlgAzcv9BLLeHGTNZ&`8H zE05m%rn`z8VF^i`RK0%VGK^*QZO}nkBtC@@k{aFM=rx!oO?EPTRbF zqa*U2;NBPFRNuYMg>r7~ofV7R!S_!dRW$^=^@X}`OI-G=yy;iz`(Q`CHQqG`>pf`Z zWi=6g!Jb2ZBWs{Mv$Fa%^&IQd97lY@;_IFYZgsyQjwK-Z z)6jXc7TcGd^QXx#fQ9zTF+5j5vTe$=t}}S6icwC+=rIYA^%C(ay_scm2jl6sycSqf zKf&yPmuooj%oB#s%uKRVLsqkooMpRfYgifsZFwtb?+oF^q~I$29oN-rvom?L#Sp?U zN9}n9xAzLbZsNYwh$+`CtVibKzMKu(ca|RRoP+{vk2yh&2czY@b9*vY(^V#A;s<+^ zvKCj)lc05J=lRB(2@73`3Yg0%5On@+exmccdr5kQTR!LA z`vy<6OW$u0XZ7*WoT|OVg6*rHla*$p4N)K#WKf#u(;+%SZc!;@5el+Xgp6&iz3=NCSBYz>N!aO!p{v7-p3Q zN(=2omeKw#v2KO6sN3xt+g#oI#PI?pqbMY;Qj%|=Lf~FL$1Uw{KXu4t>ToEfUYeE%3J(l`1A`ji=gQF3t&z16%4YtpX z#vplZjZd2474u^K+#bu{$rtg-q(1p66(LS0S^&M&nUo@>6Kj~G=-F{zpwly2(@#Q4bLpsfN|ZM#Ai^=AX@29v=NnB3@WZd z!UY$vb`%cbQtLdnMJ8#sIURCtFSNcTFkKAa%wqQVc-n3zfwm8wqFdcJ^|0h2v(DtU z8iHr9De|?MziJE94%|ZgmC-34!}(t@95oUp%IkGX_HBfp-RL#NhlN(Jd&d0P?2YgT z`B#NBJis9c;x#0)cnJ+1XN9$e|;L~wP;-$_@y`6>RA>!l0r2tt|qLhuOgJU zbC=jnURv74vR}z6e%qC`@~nE4dbQ@lu&T*G{=fyr4&i`A4%@Vvn`+9**|*DEgm0^T znBv|RR9Jks{h2t24htqqMf;PnnR=~7_*s7$Q@M6~ujb9*k5|Ub*FJCXuzfB5?0Tgk zT0MadBe#>>Px&RO^^(A)vTY3?RJKU!0^PtTj%z8G=gyYiCBDUPGGdBVV{S|l?az8? zbXwjNXbjYu5ALC=ZMN-0AVt{u`Q3O8_|kL*oL{)L!$zEIKCT;XbeM7kHfz}Ly%@q% zeKRlISiVES(dh5T9@$)(a+YS{30&s&r<)Otn`{r$`|_S@5bQ@pGJZ+4#bIhDE^=&{ z8U2E}ZE;d@(pj_ABcYnGh<_$3tfLXQc4B4pKiZ+9Fym>Y3X@uR*l%G*4ExOeLdhd# zA+YcOTgU8!Glu|$_t}k|KcPK9+IIkKb3paqa_e8m(vcVd1t5Rd&=`KEGrXi-OS&77 zVzn?;nO;)un8;K^wdF#Niy$aaYpB}x5(c1;>Y7w=Sg4%zZ!5I2-GB@^l+-1S5g%lL zhWA1`NT#5|=nk%#XjQ&&RTxPt9QrLvJj8&6S!pzy77c}mfoY{XXr;qxnfs1x0(6jq z4z81ZyvG#)K(nDjfe=!DTt`EBF~@}?m4ETS|6bBm{D;#W_McDp-y$L~fE3PxAfy}N zAIEm=*Fs5-%?HPuFO5gHt$WW5{)uQcV242b88xAzt&}tT|6rlbmC?FOJ3<7tm#b%e z1G5!8M(bQ&A7^)x?r@}wy>AiQ%!@w+7_<|D4qotA8E)k!AjY&tZ=Z8-zQIv@>%6?< zwv*k(6Z;e|Pg)qteR%#g^6x!$0HwzIBodi6nJl zt(J@#*o`r zDZAR7aoiG&;A}kvY{S2PTe-Vzkin`o^r9kUooNv78nXtG3WYUcLppB!en zXTJOGAY;$|OVt~VC~pfokE$1SLvzLgFjH>PqBCqug^nHAwAxF0RQ!ID4Y-PmTNhhm zG?xcDVmTJ8-)zG_)Ny7~A7too%Tjsxjx)uGvsQe+dgGm$ZKinDd4YmGt58_#0{@wm zihd2TZ|ee&`K6nu=k}J{{w&z>x)Db{Ih;=KQh0AC=J|1#sf_O+Ba6j=>1k~-lj8g; zvHelnihfOIsW670)}$=3p-ZHCTM&`i!K$=unl!Bly{AxUEjh`4a~)01+w`>QbM#}& zb4CK%L2>EBu0(o%SD%xb79Ka?P5NG$drChxKU{2mxb+mPy`0*u^24!vcxY(cSuJkZ zY|)@6ORKlS*j}N$$f&>PZk`Pen-@tRpu( z+g{Y)4{zD^)4YBNL|+?D6;%F)BK8gn)M`7}#tr+Tt_Y>BGX3OFt&n?Ra7ysI4#Nt% zYv$3ry~0s7`1+`t!XT$qhrpH@A3@9DOK(=FdXOD8$TEB2UVO5sV$@>__-CyZ_m2V> z@)?Plg^WKL6;H>GhLj4{$aPiSJY}H7*qzW>T4YZD)xey=iAxT-lXCHrl{qGA z=(POMxi8N!ZO9=+qyJAB-nn2zUfZg^A^VEi1X5;|ZHbtEdBw}1+L7SCV!2S_(`U@x zhli$l3Fmv}WUa?to?y5@-PVkWGS6eVq0;BIW^MUUPPrj zJ9owp1qtV{k4(_z1?5U%U50iu?(5)v?tWGk>NDhh6@d*c^(=<#l?Eygd#w56zPpCh zJdtlNjZB|Sy*QRYA7sV%UE9)A9~TqPyc$sR!z4aHAuf$f&63t6cKh$5x*so$gk2Lh!z?x3txuaKf990;J ziJgADhV};nt&bX+h`!#ws4^#E?oM`0UHN6fJ82J42@8@ld<#x^dI$o`PUch?O0J!F zP9^&KlH30v_a7R9t%WA?6e{eCdEq*@IM*X5JEl87Qap%RA7HV$diAR3Ab~(=)Sf3% zS2)`Wc?H#7NItEfOg#HOis-hkU`sK9>E-mn%=z=!^622^{DWxNh0}y%bj}}{%%$DO z`7&RRw7``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxWncGqIl&E*@9|6KXiT>qIY&!l;McQ~cLtbBIP;mB46 zrT1w+3?uD&a^{DEv;i$p5@29tVM2BQGXo(ER2RleN2mr&2Sx`~PkVQa2DKJr3*~r+z zDe0h!V{qfdjTfO_WV2`b7%LLKJmYuPTb+FC{kp5m*KKy%d-BY}Kv#c_vjM3a%eQ~( zKGVBkU&g7|JhLoV#KkSydgJ+i%(BhZ-osLrA$V|c$)Eem`#T==NjUscUH4t{{N*hx z)27^T?pjdWbmw9myQF!2_S(4FE-`-Gsr~K;Gn9m;^ zo@#74^_gR1(&_GPR|*bjWU!~H+Bp7_o!9Fybt|t$g59gyKYR8H|5mB7KUsF8@UyXG z+>7gH1U^l;-jw#Yhp#YZ^$*3ztB>S3Jz0M`@WGk=o&gf(7iEI9r+8<+d8XGVG~03W z*BeY$F1tOGFYz#Zxes&>I7KpmTrBYUybTZ;@W^avl`-bw0deuf87NW(2t_Jbfif^$ zfEj}cr~?`>jDie`hK_-tFad=PB3K0eEq-nkKAGLHe8auw<4dmX4cgRlxbxMQ6WcnHC3Vj!z2CXC$>X3; zLS*K4RkohUcMnTXiEKZ2s->J+FjINjQa-ch6IEI#r)%Hwa6jzUbx@`40K?zATLl#? zew>~s`ftOvH?Ow7o5;Rws!KO#se||V%cp1A1YE29_3ZGjX7PnqVT(32)SLgm2>?sR Brl|k` literal 0 HcmV?d00001 diff --git a/img/p/1/6/16-small.jpg b/img/p/1/6/16-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9b64a4b3d11031ded2a937570f8e917c62548b8 GIT binary patch literal 916 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxv`kSsvAqv^L=cld?i5Gf=mp00ScnBQq<)04AU(SQ*%a z4Fm**L==EVaR4n~WMz7|VdK}HoH(8So!i_RTCFS|-)fTJ&ad1ZFDvun51YK^FF)2M zhl`?Lmz<4BGZYOLe!QI@D&N-S)gxDe`4HhZQg+bmw}-}6h?ZtBS^C1H=)cYU1wA=k#;T4e^$Vs?{w z#ZA6byQ)gwY(H?^y6SAmMXPQ6nm;Uh`99rx*t&i9j{f)d;9vn-0t^UdBufPifmR9_ zEWB8_@dGSa>=oba?Ra|g9qSA(;bJ#cfjz5chW;_s>2AFKDaYlSU)Z`3!5uTIv{LSW zbM+{6QWih`?ds2N?l$I=nK2TN76k|Gx_au=y5m68!12WZvJMz!9D#>*Hsc8!P~Zs= z3Ouj^MFEgMfJp@&3ychcg^GrOiH-{u8Ygaq`$J%7(bLn@wS_in3(T-OoZfT#LYX6% z`4I!_1KJPHygIt@*Kxtc1ry&&uuo{c(6(Ud`fnY%-*;=Ty!d!g#I`HD=FF9|KCHuae79(M^xDW?}v>((`x-pXIPj7P~n?G0Nyi^!r!VX0{fK{3~N{c5}s LvgXf!hW|GKs2KQj literal 0 HcmV?d00001 diff --git a/img/p/1/6/16-thickbox.jpg b/img/p/1/6/16-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccb830ecf02974e41733ac4fd4ac1cf4a38f2f8d GIT binary patch literal 13142 zcmd6NbzD~6vhaS$hki&AM7p~K>6Q+qyE~LpK)R(HL>ff89#W7l=|(`5mTpk;+vqv( zdG9^BO@UpqobmtKrzuVF)`3FFtD)kU|86=*cccvA{Z_{0U;qFCeA%#A_8JO0z!hj zLLi7B4-zsOGBO$g76ul<|2N!r0Ju;DZ3JyZ2o->U3qiz%+;#yEKp_zjA$Rir6Cenn zj3}s35KH(U5Wfi^w{rj{BFF?ogn>Fz&7Op6J-)%>Nz2>e$~irwLG`8iXmd_`FbvwGtn zr($;_5rp4*|Goo=_m4Y=mZ!GwyJ&XrDOSe>2Q1^^)RMq(=OLkegFU_P(mm= z6aWwcKt=%R^~B`sG#A%H`;-=zG*-R)ta@c-dI_GZL=pIma

    (Sw?gBOF=>k06+(s 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 literal 0 HcmV?d00001 diff --git a/img/p/1/6/16.jpg b/img/p/1/6/16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f0877bac69b713e0d02fabeed7fbd5a1e038f78 GIT binary patch literal 13867 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 literal 0 HcmV?d00001 diff --git a/img/p/1/7/17-large.jpg b/img/p/1/7/17-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34b5f88bc3f98b5cf7d24d4e6434c271f8c86558 GIT binary patch literal 12173 zcmb7q1y~)w^60^x;@)D#-KDs@ySqEZTAbqUt_OELIK|zH7I!EP#r++A_ul`L@5%SF z*_})>lT5OiZ!)v{_WNxUfF>g$EdhXl001Ds7vOCLAPRtjgnZB71P#tG@GvmY&@hN_ zaIo;mh{(uDh)75%s2FG{sOYFjNN6}{=$Kg8*x1M)aPe@k@G!8jvEDm@fCBSC!yv%G zAYh>&p}1k<>l2l{mcfsi zuyR?qa372|+A>*n1WrB_JcbEavE8i>DS(C3+Ix(Vy1NpbF=S1DUhfTY3$dO& zD~qssly~UvocO90;+x7FGB_!Lp7)2|lU{d8n{M2(68~Gr_)c58360s*Ax}(}N*;tr zUftlW9*^s;UzM*lc~|k|{Z3nzrj%`K)!FY^Be$#`y=V}`y}U+d%{)%$ zS?iT(>(XwPhkoHow%!x6oWxYcF7Ks`KLCn2;M}zL4KSH2{G4Wg1w4myZrp9%>0G}| ziCIyeI7L|?#&74fWXt` zu_ zS0vJe7 z_Dxi{N7Z=dL=`iSR#PBXW?Lxd?oTD$WeUiGPQ4g)F72k0O{DDrN~M6_zyogRsrDeJ z$@XBUiOvA0sn(#c%{FU5#+GE(ibzq~v~{`42?^uIVh-e39ENn9%V*qYtqXe#Y86}X z@XP|9kK_kXoM*TV0{bwty!$A9VAz|(sCLn=(ntO)S}r~)Q#e)54^}eDkK!E18@EFn z6pN9xycoS6;;35T;AVie#UisOdhaO_Y2vr{1#R@91 zhbRYr4^5KBpGOX2lmu1P00~PoMploY!~gOi_irVof;2tfkLYl6Q)xKc#Tt8W>9A|9 z)!xQWEY)M*zB)2S@AY)FafM1;Y_1a#wgWxBI-Ess^>lE*SN&Q4NH_-c^yK$#`NLjC%b`;P}4QzLFl}FG8EZ>s;!;psL@)m zKRtMAfx15Jh!f=ANZ6FORt0-%#r0jdLno*e1n1_!RpF$m(S24WQhge7XNM1J)Dn9# zCq&Jx`uyUP+C>KclycscSuTw+Hx%I~|06uhulm(9;BMAW=oy$1j(W&djDvlN0ZSIo zz;@9$qwv!D;o#$8mPhGf!ReCOnruw=cysRM&2e%Q=Hy|6i?$kPQ|4_>i8Vua0yH2tim`?*r!yNZ9-v7duN(iayflwtpl4J{iiIn>tBBNo=s&t>Yi9-3EF zpa)c0$g~^1Fg$0cc406F-K8q!pVf}Gv8!tgaCHdIk2z{OXlMo-eLbRu0#SsJ^R+$?DP^jyUp4Ci#f>WeDXoS)-H zR&+dVtvpJMv7IJLN#D6@Q>DpuA<~hK)}am5DdJGLRL}X8l2Tb_n6M{LcX2u! zQXD5ioR(}9ky@}iBuM$;>ekE~+8FNabVa91I3l;w4xPjJf%Ygv7I&&PwOB~B9HO^bD|yRHIWLcv&L36QW|OVA_Nz(Ns3*1FSf>r_nJT0D==^B6Su&w0 z`pP4ds3Yncu=%X-pcQaW(-7?lNqayELP|ymaskycd{e}oThOFYn9HLA%*U1XIUVjv z3d*_O@uv&wMUlL$jSAW-zX4F4lcYgbYbMc&4)+CRmMXK+%W_O!&z3K6FLg*Z>b?2Y z5&HsVEoR9Whj?f6(w$A;9s`_pg<1!3(9W2BX)+yciC$P@S8vUIOq8PJZ?cQZ;*Qlh z?3#zlM4PZ(R0ckZS*nLxrxa6{led)dNlEt(Nx%91v9&uoF*FM8*b?x&UnKWG$X!2!uqYC)t~17@>e!;cnKvU+a7 zj~X-u)Agi<`JOkh9bp7eqX#O@A&9b+Vg!}n91(=%m)g8PSZf$WmFC!B^V7!h!z|Cg zu=%D_gNZRh@?;1?Oqu_7e)|ul4Km%B(zp#lKq)xepsAmKXX}cmwt>!*!H*V7LJ&&& zBsc;VfCB|Qh7J1s;T#8w5cmf7PD0#uGWjTG^iIS^0PZ}1nzzQ_-vU^mi12nafyp?a zz_Vb(K6pYMKj#+vhYli)?cfM%i5$9}M|NTriF`eGu7*BkkZ-jrFh!tJbLa8VdVM0!kgS~~MBb{MB=U87 zZ_nXAxg4^CBdR5G=~gj*13><~bOc*BEcE~JO!{u#{QogvP!JG;5bSS&{|gD^e)S8B?Cgg5o6C+hM940?gQ-w~q@Pw*xyYE8MT(xbN9 zVc8;<(kAIF-q9G|TMO>vrL-L;3)861^cc2GHX=(-3+_p~ap%PbmMnwuK{s8Fe@2R+ zv@d^{5ENGA;XdxqT`0ucp{gS?yCsi`&hji`v%Jf=ANpiyei>?@vUdVX0B(QdXBpdj z1EdJtuTR#h=Q)_Bp2o0)hOQ((>6$(OV;Sn6e+{Ml_O+UnJrQKLq_`!{U`u%VFo8ef z6S^O@+ts&&zrab12W}N$$uc#*j5>L*TJi}UWUI6jV99x}x+44#Wx##KWs*`l7z^TY zdetCEwfTzsQAtE%Zx;U+M8gvSnmEGU(T`)-g2i62O`#&kQxHTF_Bj2B~X*~QZubH9K4WhXQ3JjUMiU+Dh7 zP=|k`3t&|1JjM=;Hi3!X(R45|n71hh%nP>ywIB6T453tCMTWW9!&K27t%}*RNDTS# zwZwqB7ld<3m~_2YdOzsAe3RBQue;#*aY%K)WC!wavFawPj>EG=#D*s78s7KN5xsS7 z#?KPhn|3y4`B&7S^LF;iVA+W224w6Pg9a3Xs>>_)Ha|1XE(&_?LwTTbEJY&h!(wmQ zg6%>0Bg0JQLS3Nu%`+*x+sZfF1ZMLle)-|7rZLrvaM{#PWDi7kjn&*~ow|L4Of~ez zD#0z{Gu%xtb@v+F=Q=e7%<@HFWErnt7a0FoYz>{xnU85@cBtm#4mBVS)~}7!NGKzg zoZ`uU^Q5@(L@zaQrpfj~kgWhvNccnH$uu}5Q^403l*j*sr2G40a(WPzCd&;*WlM&J zM_#dwLWixUZ6*tWv@eB-3VxiN21gxJW-VqNZaS{*+`pjlk(Bm9#w?p`DFo8ez?usM z)4kkWijr}W?`pVqpCV&dnq^W|AUMrhw`pZ!u28qBt0>N;SB*KTw@#BFO0F^dV9A;e z06U+E_6tvB?s!r=$=MoIKD|8z{anP>$PxsfInO2Uqsju5L=d+zPgvB7GX#SE8w zI?ZQdAfeFmuQcYsA4+M=$5AU%i@rcNOe(hhWjFYtf%C|g$y%JYNWSPpFOT=&T#xl( ziGjnO#8^aiJkkPlP8WiY0kjQXmLM%>g1$0Mn*qHSnRAmddomve488#^Z6_Krw|Hh? zJIQYi!}`xFj)+_u87PGEOodNdO%q!tyGj|>f=$u8693mMM(DA)|lZQ zh|QYXx?cv9!?Kx=`w-b$XY#Nd=2IoY63w}lIhUGs>e~n<%PFE3u&lIeHxcY5zbA?A z>mq<;BUJNfnm+I;FjrD%DpHW3jsBswg?IxbEwApm+qze?%TVAc0~*(s8b|APs4jyW z&oEO_OQ`9~)Pfl>Cj>UFB2ns<3r&ZR7MWxIwTfxE`l`7Gv^zV*kZ_l>PvJkXJ_ma# zvuh+2E)Vkp5wx)sc3qOMh1buIQz!7~Ri7O@F@hW8GW*Ss!)FSYaVNja85=)EzX5)e zNB*qV>QTogjPtqakM_4)FQKPSTBKK?x)14${PBx&JuRh?HhOa4J0t``Jv~q43u3U% zD;WXtKyC{uK^?n`<4~!~C5{GY4O7FOyHAdbrBw}t|*`l@}9iOr2Ijfm5)cqq>1>AtKMfFKgXeREMcD zbI&T3-;@;5pc+AWr}iUbyaL-w-`P1p;U2Y#oNPHU-rDrDR7ciF@^6o7%?OrK%4p+> z^{m#$iz+z3Ei#O+n}c@kNXuu~1MRpR5%@H|3>u*r-T1nKh<3_m|qjjUWwT z9F1@65O`a=TR7sr4?c&e+c}VYi`Wl@!#4rzE}sD2UgPd2eRzi<{K{q6SSH8^g;a%3sQc2}aRm z${RRjj^Peh(a#p6YXqvwZ!v-d@fc;-I+ZfCop~|fWRkCNOdWQDhg)ccZv`~Ceb=W;jUmR$}G8D4$x3EtHwQ=!iOSBsYd;l zQXLtzhnn4wSSvnibwp3Co-^7dX>8&QrjY(Xg{`Kjm_w13j^HpBt`ivpr1-XNa!Bo7 zu3Y|6c)*|~$EvKbs&_3ZRW&B`Q<_Y50>s}MWzh|cRPz$MvHW_BBbQh?)}1>$=md4^ zx$S{P;!?rCgm;4v$kbmQiidU(y`=5ok(161WG0p0x6*nu^nTd|xmy2YWdhUc&}$7U z)*Im9wQ->Byh#;zhw+d<3v6F>ermRc(cnD9;s&T5ZTfMyWfge4n-0xyJ z{A<2@H|++BDk7bJqMU)JieD75Q!iHVvg@cktH^QJI@cYvyejTQ_EW7#6F&=CHtysb zK#tu`djxYsrv{-hAs4N((>nM#%~8uq;V2i9LrwvThD~=~r-4OC-g&!FVcfyG@ysaE z;@+{``WI1z{HgxBzPXv55j6IE>Xwh%*^3r{FE8->hp4@g{ZTd*Ywx^kBTAM48$FG z-m%Fq%pKOEAjx_Rby8M{p;142NaXG}fD6*eIxeE!{JlU|=rU!aHDJ$ku`n>yZx zD^3ne6sw?f%@bLZq?H6BAmEB6X?9di3Rx0t-6}EFqQ0p?OF`DEwh^ueFUraJm~{Ru zHoiz!(z0nk@~vW)S6xPDj8AoGNL3O=T2Dx75l8V3f?j85(F`Ng9w}0m&QP&gXQIS# z)aMu)M0>7~wFgb-#ajy)Bc`TNt1w1fQf5eY;Z_@08TWiC_r_UOrzTb4p&VTRsucV# z3ndh*khY)X6*Y-Cju9Fh7PWR)FM%={70D$01uZ@#(;P18CG(PESEG+=Sm=D8A@)W}&|zcM)|#b&vUg+X<3s z%;j@QGSKn!SI{#Q?If(+e^`WC{cnKkZ5S|sfvSYwC02z;vWy5g7p01KLvmm1eS@As zY!x+q3O|859rgQv0{^ZAgP-2PU-FQ{-vD&EV84L|4II9PfC2~3z|O?GPXLaAqm!}- zU!W-)I|szq^)Tm?{Mx$wm%jlHm9B;UZ=M;u=uZ7$BHj$jBpDrK=hg=J^GGxVCs3#W@fw7aCQ&%)D zzB_eP9hJmKW>NL3!mb*%)S_3NcDaxD=ih&h4u|8|lpok%nEFjkJ?p&zCPZpAy6XqJ z!uVT)&_y#Wk9v3hUvpsx!X za?1xQns~o5tq+B@zU0LvVFo^dO24YhIQ8AsBo#Sc=Bv#AU`O@qIffY&&&bj7_p}C7 zs&BDxpy_Zu(%P+GDQ!c@sJ;kNGr|o(vgjeQy$sxs!fnQz#V5Y-g2 zi8|G~tv`d3)O4y3jtvn&#`ZSu_L_%?c4muo8eNI)uy{P&)|hG5oLgLS11`HY2;QgI z1NP}oX+3LS=h`XA zwWJ*8jhVDZMOSzS*#`XW5E4A_K0#i)B5sYuat*R^H6&MjnXlbM(jucTHlTn5bVD*; zqRWiB_l^Zojd`^D+a_SAaa2RMdK+?Y7A4pfO=ZqdoczQQu-wV-{UX02Yq+UiVv zg`ghd&@R9{O?D;Piu5URnwCjozSD>Y{BG(Ya0rnVVUW#0y{k0d#B{=T)0NjmtPiyi z0Yz(!>`qDOzX0n%CnV0Br41yZ0)W+rRDG|Du~7}A+i2xpE1sQR15?Sw;Cb~!m?x*? zG}8gtQst(|-_lYKb;WamN3ou}-!(6N&v%MS_sk?Q1X{nc?+r6ko27ldygF@UKIb2| z(K6AP*TmNu(EZW{v`D|VaM8U~*&m0v9C#{CS{^@t%uZgmrfz)L22L{~_T|P~# z)OQy5&hOd4-TSrtE}X_`oNP%eQ6=>5C~DIUN=$JZkX5D10qVu!iJwpcL_U=+;kH?P za)HuaYVZFNp6l`L_$Dp&UfqFfycp?8)HOXNcHCY3a0yr23h}B{&NP4sclpJ_+;PvS z(`_7(XK_t!V8J)^Oj0A$58J_R&Nb1mxk#mQ+=q$%5KB>X9y9B`mbP<8G&9Y9Wp4Gc z)Ke4W%L{Shmpjny{^ufR7J{l$TrLRs;lo*^Q)t(UwN+*V)&*q^Kg)MJl)k2|igid1 zH4(4lKqHjuIYdbddM__6VQFoP7V5chH^&?`Q<2#Z+zuO_e#(<=nl-hWF6~_Ts_OH*M=t0tR?mVWJ!vbV(!4C`yc1(=}}se!O~9L@{7aJ0A*L1 z#SRYE(%wwp!LihW(2_wo@=llQ-&NHfZY-YYP+BQpO zJII29@;&S9b)A1lh5WiIVUldz`RI8nb0eUfAIUtGOroSU(=&J1ykM-p!HWlTFo=}K z4w$d6SSRa&A6a8RJB2Q0!2MBkz#w~mJ(W-;6c60b-ZsmTSJbj2iP(Yi>tPy( zxL_L(OnPm!zeIU4*pMkY(@0*0)H?F@I&w9ijm(aYB2vk&~A0-UCyJ*hVG>A80 zB6;q88Hw8q#Iwm{`~a*!;W&Nvna8H<$B;M1`z~FxHwJ_fa=QsPl1MN*x4)0dNEY9{ z0_W&iC!XmA(L~IB#gqd16vCeYzez7co$rFqdhUD^*6G_vxXp!&H&vA(rx-f7@B+OFmB4NlqQ`{ur@jra-?SUqfrw0m=fZL#iNQ{QD zw!_#1C*Z+o09Ym=yaIVZ001Ba#=%c`65)Re%zeoJL;gR{7rYezm$2`9WEk!L9U1;N z3GMqK5E6V0gnmB-f+q%^-1{L=*%%Fc2F$O!Ao<1IbGaqt^qX1rgoF5mAHL}n^sXvI3htSL>=_2)Y*av3 zlL2Yp-45Fhd%g z$G?R)pg_OPe@VjF1Nc>`M$PPQW+4!xiG@;5k!P$Cybh1f!Iv*uQ&?#qi1>s*_XLC9 zs4rgXk_B@oB5ZrL*`Qb-AlM9dJq@C?znCazdPP()EKJG0DS4&Tar6ExzX;WPNo^9o z4w_sLvkMpP|ISoM(gZ^WC+)C3=w~~AK)lkj38d~Iv)rd?VMGeU@J11+<`KnKJIl&3 zK73yx98C>D3m#iLlXD7@_N~p*KewjeZ7sXU2;+J!Yb5&{};gxy49}4a^yw zPj3L}m&+HD+{0k6zP;D@s&bz+_BYFg4PdbW>2%AucTa?QdmtnfiYB&J7#Yi?6lL2( z&DVUgL8AEzkGb}}M0B==%ClQnLM5~*5c0yB8jDI^2E^F{qgID`KwXZ{-n@nJxG~#< z?)DZ?+&x@o1hf?=R|0U>w76v9GL2b3suzg^?PVUC|80 z>4`L4W;{CWSJBiF{IdU212(S6XxwyQkn+XMw)~)6bIq-4|REYEF*b*SIN2#jix=f%&lomhMRvky zv@fhu8nyI2WyQTU@^aPkswXbEYA|w;>T4&v)eZI0^%51Zhr5kVTp85%;5Z@d4e459 zdNtR|BW>9A&}_sSzF9rq2g$FR>`VZ3$Du*V^B4(9BlN*k+u;9=#5Xm9Lz>8jVx&wZ z{%qahm1RK&dQX>o9qyTnb@l^3P&3X7$1FYNvS1v%4Ao%%G)!LvHasq?X=6JsY@V3Z z(4-pMvCq|ZTHWC^ShG~<9ns()7XHzxpQ-mi3Vcw&>jzn?S$vL(%!6hL6$fHNK$*YN zjRtC4a!1XT)a;3av`n)5PoPwd^77a(u^?7sDC13OWcJ~f)qA>nYFkUv9B!B}QV7Xy zRQpwBd)0i*sMlPQ$0_`=ar>`-)deIg?!;r;NKAz6Sxm1s7mkCirG?S_l0J&iqEH*Xfh zf9#IeU0>qw@Zq!OG=6R2?06UXaut9ck>Pgr#UqUv*l_Rh%-esT+i=S5z!cs`)Lh5G z(tvK^kr3z=efFa=s)k>jtWxtc08xWuJGkOoi?yOE@|P?1Pjq&sGVJT;C4}kJcs7+D@RoDhr8Mm?@a9j$NZrHrvD}}WSc2O76Nj+fkq)oA zYUAx;TpBs@`@i>Wa$Sx6ReoJ^JlQ(#KlADQmdmnuX3pTjsQU(JT*$x3t0IIswJ_EF ztu#!M#48>I-&83Zn$QT7R2^KfuG(_5&@+RcKxaEgHce7n&`up*>6tq1>B#Gv1hAq= zkN6{n0R%ukO^Q(Ewx!eeErr2~zdkQRc+eYyF|8fo37KuD``U^*^M8c!{)PhR6L7 z#9W9~95##o!>a8h0tcADG)0I5FmJv`l0y(g0e4`6xwH0k9=1c616=x11WE)P7)h>vp3mOiNk*`*V z;JA3Oo7F{tfstxgC$2Uy?hg%U=(8qhwUy>PsQ0SsdYv zXzy}Km@ES2Vl@b)rV{=nGIoOy!|_8V zG>Zx7tWZw<+ce#O!$=zu3hf9^%ZR|6Auk=adGVSrK_WTCXekmiz*)<rMx)y~thWpp9v_Bd|V|K*@) z_PU#IIUN+%0`*H}ZB0n0Q+PBPWBzscVIzT=xQX90`;j**F?_u5)-`3$1P?l69#$ld zw%HH;h>K$Y*o})y^#dOt;{{N!YQ)KXk`U(;XIwPQG_LSD62U52i^Ei%ZI&tzMGQ+N z<3I)qpgCeff-~LZK?4ajrwv~c?~yj}g^sPYpn>tx9Ah=vBi)1{Bv`E}(O!&Vq81Lq zekeJb*E0#8yu7#FgC+FOsEf_ZFb1-$IVE|E?AJY(aYT;n;(>?QPM{7VJ{sHimO1_l z6*_b@Jmy%ofQ?!Z3Qk?Gh;N#uZ+hFWNPUqH^{&=r&2dX*1tgGE_t z0h5RQ`T8D&1fn0KgvjhdTBp+P$RYDXHn&2URfJ}dZ-v%NbjL2Sfl%Rrr%Y+%nmBk& z5ayvQKtix5cVpfyQ>R7qF^YFV%8YgYI6tsE^2e>Mc?_g>U(0|}x<>7++94iO=LHV6 zew7ay%Ws@{K02svm9f~1OI6jX`(v`ZVs z+Y3201eat))ng1ai^as-#lq5ug+~##jSdh~R{}+22J_042YgLaFhN|lPlv)so=Mc9 ziCm=<15Iy{V0kL>h!-pa?$Z@Znh2C=j1~j=w&gXnYtlU^Vpq7cCrg}TN&8`xsErL|> z2Uf>b=_Jq?wWof;Wj(JFjzKmfH`CBt=CUw9U&lB*_KT11bnNS>uXc|=rhVDio}_Xu zTQw~k;m#V8Cq4es8u=n)8(ucmab*}r--bgFZcz>~5V*%TF{H$|j{>^HFfu{P`O^nF z$_;Bbx=c%*o$GtZk)931*VA>S@qmgo*!ig7!xNDg&}IJ3d7sJ&{x{Pn^ZA?P*~K)E z$n<^kUbBrfJ(e=?AE-eR-s5`XUaNIw4tYc!g6Mr$nEHy8#vV|d+s4*&lDR*D!Y6Nl z0I+ORC2a7PzUP?O&dhA|LugQ_{9C8t#U_K{uBqtCbP!izN~I)&9U{qgbmO36UaJ@b zz5$;5l!9c#eqv&+k1zXtB;N;cdG4+qJXrQ}$z&e*c-< z7qF&MVW!a|5s{DEh>yc6wMgOUw#~hej_dhuvx21PYG0&h5s|K_b%f9y&4D-m1uKd0P^aMdIHbg};9;vYLo2r{ z!r?Fx>vumpoqcQ}?dmXrPbqmxptH0;ljlU=?(mLW52r4U7h@HEPEB2$xjw&(b$#%h zE0D`}Fnch&@BQfg==#3}I_!{Wk>TQb+&* literal 0 HcmV?d00001 diff --git a/img/p/1/7/17-medium.jpg b/img/p/1/7/17-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f7565101b4fd0eb0d45d7ea0ebe1616b33545e6 GIT binary patch literal 1815 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 H?$Cb$7akYz literal 0 HcmV?d00001 diff --git a/img/p/1/8/18-large.jpg b/img/p/1/8/18-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25b98137cd178518a50d0bcd43b49b6430f14568 GIT binary patch literal 9889 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 literal 0 HcmV?d00001 diff --git a/img/p/1/8/18-small.jpg b/img/p/1/8/18-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6a562e157d17aa4c1501be97be42d52f9c80e57 GIT binary patch literal 1121 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox=uTEfkaOVx=t6c5Hby3(tOO$i6Ej=_%wS|< zX8C`Mfrl9=CBQ5I)P7ZgA!x;o_e?!o9{G2g^%PwXHx}IO&c9rPS8=ZWkBDW{R-E89 zD||5@Xr7V)10xF)BMZVzCZNAq8Q9o?o;Cn_6=*UC&@qgxOkd*i{X=i7y*Frl`zYJl z)#OcfRqRa{>s>!fJDCoBVs2gk?N3pOyI8;~`{PqL#Z`AF?40ytg-z+1zZLN;=cV*? z3S%OYb_gD@l?PfYC&&P_24N{EZkU(_1ceNR6&%4R-H-&lJ_B`%5KXHD*>(#YSb&t+E7rOE{ zk7%|_>2LNOYd#xo3ulY|vW#7KXPL|nP%tP70KE+ajI1!1F)|1$8af6RPHYrVFi6}8 z3w?XVKb#vI&+zKr(NjC)EMT!EirsCm`=w|0{+s03AB9XRyuaRFFz|NM8KEtTmnFAu zZ#l-mky^FqTS@zrT_XP(0>l44oi}?*UiWpuu$Q&Rdw$QB`N?@@QM0IO?SBTK9pJPB z4pae#kIKd6y2U`pNeVImBLO)bGB64X7%l|62^2j7mdRb3LYgnDI=Yq412sqp0+pj^ z0Q$yI0IVJqF9NM*aSI}vqMQupWxWNeR~7&&1|>IO%7p+%K?X&`z{Enw#)%6RHXghP z_rAc+qNk^)tM|+^*csxq$x30)lS%Wix7E`it8dAm7Rxe)KC zx;Zjc-Og8Be`oLGyJO3t(EeI*b!F4OpXY1#f45k^^FM=;%cZ-n*Voj3z0B0du&_no K;!j}6-2?!V&PV(J literal 0 HcmV?d00001 diff --git a/img/p/1/8/18-thickbox.jpg b/img/p/1/8/18-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb56e5a6798bcf9a25ef1cdbeb132f566351f057 GIT binary patch literal 27010 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 YrFvAUQoSlvsa};TRIf_^0P^eq*^f>@UH||9 literal 0 HcmV?d00001 diff --git a/img/p/1/8/18.jpg b/img/p/1/8/18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b29f3fe55596270a9d617bfcb8569aa49bf6b910 GIT binary patch literal 29036 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 LCDQ~}Tlc>KBQo16 literal 0 HcmV?d00001 diff --git a/img/p/1/9/19-large.jpg b/img/p/1/9/19-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1726b9711201f6cd7d05b466d00ca0bd5b8235a9 GIT binary patch literal 7234 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 literal 0 HcmV?d00001 diff --git a/img/p/1/9/19-thickbox.jpg b/img/p/1/9/19-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa86db11abcae608f1ab4438263a389faef52d59 GIT binary patch literal 18894 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 MKlt_g^7-rk1pxdR`2YX_ literal 0 HcmV?d00001 diff --git a/img/p/2-46-home.jpg b/img/p/2-46-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf0ae1e37385585e921965afc65bcbe9383151f5 GIT binary patch literal 4440 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 literal 0 HcmV?d00001 diff --git a/img/p/2-46-medium.jpg b/img/p/2-46-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdff1e7f90d4ddba8854e0404130dd394b17d75b GIT binary patch literal 2644 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 Dv3W$r literal 0 HcmV?d00001 diff --git a/img/p/2-46-small.jpg b/img/p/2-46-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0abadf72d096581394630656aeea9a3e1ef6b5a1 GIT binary patch literal 1487 zcmb7DSx{3~7(RDPLK5P=Sy*IC!lITXhP{f=fKowRf})^O4Jo4IFo?<`j38hs6%~U@ zp<*SpD1-{eCaf-qv@%!~3J#)!EGlReg%$;?G`*pUKJ=ykJr8%zne%Pu|MhqD{QwUR z3* zvbbM{4=6;JNnN%CfDjnNX3`+vkkrK?*j%v`bCt-{)1nXv@`KVtE7_lx2Gj@coolQr z>dCX_wdJV7UAD+;LM6Ev#o zF!7;@ZP(*|&eww&`@CHwxQNUb0aOY~eeVP&H&BAj5xXgb5^09I0~dtu)lwQS4=xw*Q#9Vr|h_bjs95|IDDXNsK2$i5913*-#3~yOaSg{u=gBT;+J` zh8&UHFK_lQK4msw`QRT%%;~poky@t51sD|LXkY+C5?*axppCuOW{+w(k1(Cgb?++>jvuDKwQZDw`P>Av&BwlVn0 z*gStjO8<#1kqX4J_>6bhhUUUIPy-%buyprqNS&%{6QP~Se;S2+-I}pa^?dlGL|3?d z$!PG-+-S~f!_eB{2E8z#%=9co>J>|*B&Je5z*mfR%*2j!7JMgE86K4o8pjNbTnjTd2+X zOD+qlH`_1q(StUtBTiz`K93Pzn6N+AE3?4eQF%D=(r=$}rnCZtVHhr~H-}4XYl>1cx literal 0 HcmV?d00001 diff --git a/img/p/2-46-thickbox.jpg b/img/p/2-46-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e38056f4621a1e81274026bcf0097a3efe4d5fae GIT binary patch literal 7778 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 literal 0 HcmV?d00001 diff --git a/img/p/2-47-home.jpg b/img/p/2-47-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb63c3e3f7d9f8e81f2bf8705eacb67686544579 GIT binary patch literal 4130 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 K5piGSVB$ZM9uWfo literal 0 HcmV?d00001 diff --git a/img/p/2-47-large.jpg b/img/p/2-47-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67472a981e6f7ea3c32058047940a915ed1a72cd GIT binary patch literal 5675 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 Qk+6&8x&jDZ0j{S12Wu?E5C8xG literal 0 HcmV?d00001 diff --git a/img/p/2-47-medium.jpg b/img/p/2-47-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4979c2573474399295512eca842d10b8ddc82ed GIT binary patch literal 2486 zcmb7Fc|4SB8-8cC%#7Y)3>gPw;!MidFxHTLNm<5PmdV({h(E{&;`C`+1)0y6)$C?q~Vc@>>9OwA*Y4z+eCX zgFaySHDC=O;P90J1ri!4NfZi+L`h3Xpe3==SS&^wgTcwjf;btx3qp_h9BEVK#^B0y+^@!u1Mf(oA+B%s)y_HWQR z`ySO$rCI;2Z0Nbv)bfn)G$c6K7r2oB2gw1mur5wL+pPD(gT3*|Fgx9nHZN?WkN0se z0VZ1EBWhjDcw;-w;-X}V(-2p3>Q!@DRt_(1;1KOmk9q#%w5r2pNA4Gry27FwV&gXM zVvUp>_)tDG$S;xl_zYsJ0dbLl?v-p^P&Y@{>2q)WzSo3U-csC??ay!v*F9lT(IMYC7CL#?mkc;TP&)ra!8UKhKq zUs9e)-q=jd+_mpgsOrNVN>P{nXXXxr7rvq|ZR_aJTvuO_wWoVKg3NU!Iaf0lk-eq3 zI@y>HT$PvNV)g27;p~CN=GEByFGH#_*m>Dr&4wOfPpm!iw~U@Li@nhudM6eEhFrjw zRz&&IV>WZP4*TodAAIPSggQ57!kO#2;%{le-#l&U?vt^XS$;$_>GiCGUs9x_V)2s) zk5rUs;$r*sJX55*L`9y_qR!*N>{;=fu;R8q4hnjuC@05pX7&M-%YZplEmb@KM?ho6 zsy_k_nF1+G(6v<4`KL}$&Ky?ZZZkM)RPVD4p!a(ZDwhiGRG!~&Km^Qi866WA#X z4*2%cqfco~eM9(U=H7ZC@dlfM9AyR zJa}2Mj)0KL1Lbw;3^x`>{0}yK1-p!HqHGcNZI-zV)O;#pPSickSXjAn z(!L9V0cdl$rfHQC=3uU$g=k&wZ)Z4^+RuKjqD=|}6aPVubzT3@A8^mLtB|uw23?BA zI}Hj*Oi?Pk^00TJA2FqL!(>6RD&NMSjY+pJbSW|+E8wb4)370w!c=_8wbS#)Y)a7U znV30seU;%iI2j0h&KBuCI*_~9VY~G% z2}XS*^Yo)@1qttR@843E(+KD*d;g&@o7g4f=8Z1{x6igXN!I4Nx52!6CQkFAd9SH| zmD$rS8x#el{img}=93xwT#)Z4ruP}iYi3`#?`d5IBGc9)*%PXQZGCaKoF8tc>`Bh= zN@p^{Ih*E-Ypw$aF3w;F623c7Lc1E?3gq6PfOlyKg|_ z3Ng?v`qjlX^AkxI_aC&)^tjwyS3#A3wtMT@%5vtVs?VN^`(y>B1VfE{3f?@~Mq?Od zARjfnYj+6hbD7ytaGf0eqShvoH~mxAVz37NfKx<6MaGyRZ7W$bcCu&0*=NJ?T$dXh zpYZcC5mJXc{GLNwI>vXb5}BhkFX#F1H+ouS8!VOC0jNuWsOKD1{EIA zIm3}v*Jm#-1ON7LsHXz}NP3#B$6oW#B{N7@xE=PA}1TKa!E;+HJUX{=~7% z?Jhf2Zs5#H)Y>o9jAV{UV@hjx+eM6TxM;hOJ;N2wDJ*R|Bi=}IDTpsrHnh2`ACpJk zIA_G=rYPmcR6-;*!SB_8-tr$!6RHN}MTjL&oLUUlsL}3yCknkV=HSE0ppW#5GJC4q zgoesVj>Z+SXKucB0dcj2eC>9jOV4WcOrb7Km*Hb{x9Llja>`XzP|>Kt5)Nr)py@KudKYt&R@&D4c__R)6#fgB;b?Rus= z-?QGU+bUK(*`%2|XE$j;y-n$YjkDH2phuMYGLEC90aRiWhIfi0d@*lHU@3)f~r)68%TWT!>H8u==dpTOB=^6i#m{C6H za9E^~gl-#D5r2LR$WUdzh;Uh+%+a_+l1JTFo?y6Y{hiJs#x#pG!N#7CejD<> ze}`7&hfx3gwK|)2$+=QN%rr9J>Ua_@C}mSXeA?1_vT(#xOBCN7Hs(3s&t?wLHbhSu zZl_qi+n&i)k29D3=pR$U`b|F^sTRR+U30}nPTQ*0(bLJ{#kTZHb?-Uo67>8H5RKmA literal 0 HcmV?d00001 diff --git a/img/p/2-47-small.jpg b/img/p/2-47-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47e09a44b4735f5c9e7318fcf78573da9431cffa GIT binary patch literal 1392 zcmb7DeKb^Q9DeV;bFYsX+&dpQjWRQ3MOfEP+pdo^XdIl_L9uLUYAM>iztO?RhCV2vTWPg)9gFi(*C*6`~LTy-}8HZ&+mCPcQs>x z^p<)_0fGR4zymb*fjhuZRC^&9@Z!2S&S2pBIy!_dOP|GJ>NA-JhHTQnkTPU4Nn?`Y zaCtl)%gDskm}|=B^0-#QHbUWFarRE z(!e5c0_dO&1k;7DOW+JRoMI6;Ku`vuqqzrI7y?idBjKPwiG24>uBy}VwrYy-P<>*b z-Z0uQ7$19e(~GS)e{&z=4f6*IIE5m&zbrXN+iv?n;uR!77$|}*lH&-9F#y4(ENC`| zClIZMEp(xc2#!`Lhfh~r|X2Tn< zHQ0AJr~3{L%s(2ksx0?C5J;iv#I9@Ak5u-NcVu7QWNl9`{65djuRoHm9IyL`euA2f zd1jjPTQmS_T1IKD_>UI|%BF;vgd?IC)L;nWip=`C`UC{zby{`!BswikNUlr0{_%=N z>oi3f@K0u` z*gYzTxnh@#SBvz1Hyz>)CGYL;IyrJ>e=O)mK?`r(}sK-ew^1#MX?7E}ZRJ+&lsk-MYU0(ieKVkB4JU>`ryzPK(`Iw2Qd-aZqK&3dec)fDO zc&vBN8V_g8@678AzyzSgJ6=&hNJq=mq(q+8J1!`yeUkxKp+RB3UMo8JKC>!8u!kT@ z`5A3qDUagf?1x=T9HkpT%GnybUniG$p2=Ms9#!z;1I|Nqq&Z@)FSY(0Yj4zmI4EQ=fPNgJzor>g?wgZe2R=Dr!Na-;L^)7k5U zpUy%J3sGO#DQSt@t_dEkfb#hiOeYFI!CN4Jq9yWZ;eu*yR>+u)Cli@w>xfZ?tKtCA3UlTcj35r)Ir% zl_cZKx}Iwc5K` zJ?_@`ngug=`Hl?swe&QLDRHkR`eD83JNI5ALbo?RfL>rGO zf;;6;@2fmO$eoxaA&H)q4@QGGUM3>97c|OxDaPG{hm+ThYw`2N5;%|ujj8lc_hK8LD4;9>z(@|P&4!ox%tpO literal 0 HcmV?d00001 diff --git a/img/p/2-47-thickbox.jpg b/img/p/2-47-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..274784a9929f351320ebc0a43eaebbfc89c73ba0 GIT binary patch literal 7464 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 BU55Yw literal 0 HcmV?d00001 diff --git a/img/p/2-47.jpg b/img/p/2-47.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f684926bbea6bdec4df5f4da6d04ad6df7376bc8 GIT binary patch literal 4670 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 H7nA=3XPHwz literal 0 HcmV?d00001 diff --git a/img/p/2-48-home.jpg b/img/p/2-48-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..110006570b23636cce798a4163fad1e65684f15c GIT binary patch literal 4141 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 U1^eS?B~p$~Ra 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 U_m>#mM&5I`oo{hS(cByRH#%b4kN^Mx literal 0 HcmV?d00001 diff --git a/img/p/2-48-small.jpg b/img/p/2-48-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1b502ab1577e3aeb51d4d40e8a11012358518fc GIT binary patch literal 1390 zcmb7DYfuwc7`?lj%{#c8Y=B81Bp?+PlpqKyNVkD7LUBltL7-4luuLh924CPPh*k?I zL`wz5SCLx93K+qbL8zeETCHGOl<*uBXDYTRRpwshfFW`kCt^g$wj6|$$Kniu@ zHnp>Z1C+sJu`#$Qffn$8?*RrtFr3M<_5ePH0F=N8h;LlwKW2JTzO{69u7G3m&)J%J z(Z?;|r0j-qz>7$Gw7+dEU)^W1c0ruCokM&xb%J3dv^AMNk+G6NpKckDth1 zuJDD2u%R*pN7b(;)YE_NDyk9I#yC7679Y4+8Je_JLSMQv<;2;yL0Hvh-!G3zIxG#O zzS+D{R`8d5b;iEOSyi{*@^>tp>M$SAn) zozKdm{f1H(1YtTu;IW2n>ssc^RnqzgaU&Z}!B;M%myrNP|C=U)l0uO}=|gK~$Wa^l z&&C^0jTIhOS_f;Sn#ec0Grmp;hUg^(6o=qAYc?+w{va7brRK26C(mS7xGtl$x=ezS z`@Z*2aLizoBjW`{bWheYJ1WN$0z41h&i1|*Gg%t8H1gTN2Sep|`0o#dxZlS;|43`P z-_m$K;N`lEMD}je+v}|$q_)$!**~@q{FIz#xO>`t-c9=Za%`+*WuX~QC7!2Qrqj#9 zm>J}qAi94bqKR_BS+ZR9eqFXAV_|;vrB+#2kL*Rm-MUXaJ6-U|qfeTYX1(13Lw&;D zGkwm%Hc##ZKw-elxx^6?C^Sl);V@lcGLQZ)Z+-Z>1HlT>UJr+ZL-Q?tQx%$l2o7@!0DS=Iau-AmPFG4DHin*2$ zQMVE$De6YwCHb*gi%aho6&WFJJ^{7Bj?H!0rbVNqb$J!0QMsYjJQpVs1bW2FWXIa* z&(>ev@lkT%dDUK4OwhM4^Aj(x+$JmGGZ)ZO$68Lb-mOS};=;Y~zJ(7H+)kz6V|iT< zpCZdm6QRi_%DB<8*uv4C?w`0Wb&G#t1YPwxWO+e+;$V#vcQkDHv7upP1 i4^M@78_#LJtb0B+WJwwB+%@hvU8O#oL#5|hyZ;7`e8Nfq literal 0 HcmV?d00001 diff --git a/img/p/2-48-thickbox.jpg b/img/p/2-48-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82f8d50bc022aee280ddce7e4e8227b921d31326 GIT binary patch literal 7431 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 R!q=|iNThvsDe!#izW^~PRiFR> literal 0 HcmV?d00001 diff --git a/img/p/2-48.jpg b/img/p/2-48.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67cf9de335c5aa81f21deb9b1444aaea1e55fb32 GIT binary patch literal 4639 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 L`bGg*m?QrN8}nZ5 literal 0 HcmV?d00001 diff --git a/img/p/2-49-large.jpg b/img/p/2-49-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15847b08873f5a554fcc45c4b808a23f8e8ebff7 GIT binary patch literal 3948 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 literal 0 HcmV?d00001 diff --git a/img/p/2-49-small.jpg b/img/p/2-49-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6191a37217ff4196008facb19030914daf75880 GIT binary patch literal 1041 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≪ScszsOXV+vAFz!dcP4N9ohrUnh!RD3+KcX=>#XzZI+AbO5g_w-y@#H z6?TO#>-d#%zR+wwsd8}>E$<6${&|X|Juus=UHAYOm(xW_vcl=6oTZjK`dMaKm1rjZ z?s(icD9fsJ&hblZU8KzIa!hIH!*_mkJ+iAHW;8q9GQOpFzDQ?$4E6Tm^OxFbCDHt` z@kc|QyXbQZo}o5@$@k0(E%DD*R36f*Z_gj6=nKepZ|I*=$|j*4kS2JyWsa^YzYJQ~ zZTPo?l~2`PGg~CKKqJYkn9VO%8|j-havLeNA1qX~RyJGMY${#z6dfPi?(vJo(|HW9 zp;nlwf%3y+^w&*oVuDJ>6wW>5h}jkE9|hU+aW!_2gSr#Ev(5HZ25bge szF;*A9V=8by6{8mwap{Ee>U?5l2@8;j^~au*_`_!gYL+m>e(9oJB*^Ys{jB1 literal 0 HcmV?d00001 diff --git a/img/p/2-49.jpg b/img/p/2-49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..754de07394c213ea82834c4fc74cbe0f9b695cf7 GIT binary patch literal 2988 zcmb7Gc{tQx7yr(N7<|W!oy?FD*|$h`#u7D_@Ix3&wqyy}5)sN0Wl-6&C3{h+C`*xj zk}`HBp$KUtW!|s0_kI6)pXdGD`#kqN-+Ruz=Q-zd&iyim8B+jgVrXm#z+eCXg9gAD z1@r&}9KJmvAfbt3L7|XH6e}|`6APLZjb>wIV`Jyw0@*n*9BgbL4~W6yxVgE}oV+0-#MN4D*ju{AO<) zMNOmVQ5bh(&}?O>Ag!+P1RWjijK50;vQfc?!OFbO$2=dyhj^yzp5(emF{(bgHzLK4f4aP%xx^>6uy}#reC>GJT57SVdi1%y zGpcZE>|qNoBV)p@xD03!yLeOA2ny0}5P%_}?7*R*{00n;Kw_AV!ip z-Rj&@=F&df5w$J`knQ_GJZX+jarx!}8G98)HpYLvF^N8Vu)2fZV; z`)_**3`xJ`?zQ`<6q+T`lqvF6x@C0mgRik;T<&JB!%$uuF)S#gp{qlAZpJ|TMw+mR zo1o!w@D%-7%^5buL~ZYWm!in>h#b*cx6UFr5!Vm=uHl-k1m(*72E6j|TIz(=<7v7Y zXH#q67v7*aKTV&jHN#$8@ml5$yJRerKVN`G5~2Olbf^E!{y-r$4qO7OUOb`o(zKDD z^`iQ#>vd<=(5=~W&MoJd(0tnqoS>*Mt13MF`;+|g?7Qd$kq#)4ILzM!{?4QG&$J<6 zFfAD7e<;BJD9A!ofWvn{b&mSO1OSeZ2QgfDf(|L54yh1?b%_y`3l!5nVo~^;6HHq0 zG(WM)Z>dYcVN~U9D3n@ts#$JxupY+)tLc z8FJkK)I9A-Odp%5Q5E297-cdq5M~D<)v~UolX@IX6+E>%1p?hCESH+S3(Lm!T`TIT z|0H=>lMq3z3mU1jpV@7PEUu&rkYX8tr)w1TiL27085sKODxUAu1hF+>jNvS4=zSa`Y5%GEf;MF_tS=q zjmh2*nS)xB9cB-f%)A<kfweTX`@H zL7oKaq%XS!6w1ZaQSs9&+J8zN_;4UT&@;$ggt$-=vJUwUqXto-R}#ac?N@rIRysQAwH=*D7$}NO8e?R=&!?PXg zDpoa}9YsQGt%PF=(s2UjL#o0aME7+6X9s1An+-}yb7l=5!3e=eR}DoD6wBhTiRafz z?7n4u)Ne_;?+)RieF9%c1;4dVTs`^N400iIKrHwT7hmkV+wP&su4ZpSq0&+uknvoF~v4N^@;rp6{$AbCU;s`me;o_YuGQ{{m4WINWhcsToltUh>b7fT{GL2KL z?Ux`z5WLdJw@RyP%2}^{{Q?^vy{An7ybcm14#K%ak@c}G__RVKsP%Oc%Kgu`3P3>h z2nq!;faX`P$LbjX`GFu->+R0@%^s=#s^!;*)HZ)Cw~t+&Fzdj}=}fkq<%^92fE{SL zHlfviA&6@N7^sl{>n(&~01!|3#jfoR0k)+c#4?i$vl22JkqWxCxvz?lT=RHr@64K7*90m-g>-=iV3Js|YP!nQlfpL<~d#BLpuOF#^m zURc+Hr%o^bo7`Xo4pks2Ezf>BTWj&~`c2MHCiM~XTO}&TR%KT${WJQ|O6bA)~+J)}{%-J6|Inj?Ni~)8()~&P-+w$&pbQ$`NYPLVx8fZ^cYxdtL29vsoYs>I z8yB*$0&d^5q6)sY_0K8CdtMzqU+}DMw?~$_VE($XSI^U&k6+^5>_}H`FFt;u4qra^ zd2g!_;?t@d0PpRN_BE8u&V(Hx-CE%>sX6sNv4y6X{Ud4Lpo$b9d3LYe&Hht?!Rl?& zB{Nj@-Gd%_0vnS3mX|RmC9C089h)L{S=YJ?+#^itCdP?$=W~g^?@4(U?5Cq7HC>qs zN@iIa6q7=LP~bQx70r&uqT)r9OZ67o?z;Np0CpNYtfjVSK@ zpmx4~hHa*TT9bHX&&I2Pw9GcMlMU^@~P%}Ja4keQ++!=qrOYuH>8xMGoG^ZhK>;}oZ5o;_Py4BEc{ D-<{#X literal 0 HcmV?d00001 diff --git a/img/p/2/0/20-home.jpg b/img/p/2/0/20-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f45e69d593344629c360d9242f9469dabe83596 GIT binary patch literal 3409 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 Aj{pDw literal 0 HcmV?d00001 diff --git a/img/p/2/0/20-medium.jpg b/img/p/2/0/20-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99303fc10f8b7f6ce46ba5ee503f81f3a6753847 GIT binary patch literal 1823 zcmb7EX;>528lIWVkU)UUBw_OjkN~m>v_wF#hD+FDrC5lHR7lyBiu{9Ae$p zpJFIRav#Kd%+zn3oLf=;bUM@O z=604E~;iyr`UGM$dNoNyU_N z+m3PXBIT|{pS#|h7;VdcX_Niv#TnDOOGhPf=~39%nKl`xHkYn>qslE+1RBmi>a|R> zfAywWYTtC)j@zZEdR2B)wyQ;yQ|__8(7PtF!>q`aCGeDV47#;#_>i>=@4H>HUYsT(%+H5Ob8O4gW?Rf%U?K%7UxAf@g75d5JDIy}j>Td7kt?d3;I z{Pdvb&g(MgzL_OC`N}}`j)t9wyaMxQN4Bc4HP0KHH&qJ`i`O*%=uL@CV*e>(hFDamU{+kbdJ8up6M z=c)4)4MBZ+`?kNl4n)5FmzrR?UV0lUlzU>CUP-epO9 z2NGN#oXv?TSq?S+!rz1*xysS6tjd0<{o!b(Amxbrw-;1#fn{R=!<2xv^&Uct!REeg z*Jc@?k~;cDD`$0&=Jz9YzI47akhMH41Vfhzzyt^43UQy9loE-&ch+Tst-QHB zEPPRnOzq9tu{S5C#%jXkwkh_AJpA=Ri zR{?y6@2Y`M?%nX0NW-c-6Ap5GYyH2dSDV*-<(SubO9RCZCW)@~bcPG#Dlb?K1h6KZ z9f$=rO4;q4`&DHgzP)Jcq*n*+?8srav@_wMA+(?Zy9nqRJ!>jMwm#9K#jiW3`G%#1 z@RxKk+4J1I*J!fHC(&M*o);x5nc3~T+vWt+aCu_BRjJ3LU-qY8m|o{eNlaV)bu`!S zVsDTGdk=xDR=d~b$MlKa(b`tM%%>JV6xevKG_~{Dq1v2Seqw5cVw<2co*UeMet|_< z)P+9UBQxd{X`lsK&r-^c;tb2R`o1iwcUxGL$z%9>*}vqv(TF=e$jwG1F^q4@8vj*) z*!nSrnLYLBwQFRRB}-CLG^Y5+@gva4{IE@7``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxcIc10ypV6AQb5u!5kFh`1rpY!0B6jI2zb&CBkH#Yr!F zcO<{?UXIpt6?1-XOIr(_#-8q!xLf)86+Rw`X$eV>(uV(>#L94 zpX72$zwh*h(;H4cNRN2@HeVlTwX7fm6B8rCVxY^J7zBj`ghdn_!IlDjYR@=3cbU(! zYely&N^UZ%0=XEd4d`Oz@Bw<9Sx`VoSOMZzCXhCU-A5N5F)EzxH*v{bb!l6Bphisr z2B1e7*%5wa1RBEvvQa@%$rW}dg3-2<%`hvnXi`BZ1WtYeA{*aK5$E{~4s)O*8Q9@z1eBKq6@ab`Oq>XhDgoAvndX6l z%b3H{4bslO&R4SA+ziw!CCCU&KETuo2N1mwjiAU9C{~hNe$z-j?d!B!N8xs$9u)yd zpddvRI8cDr6)yY$43~|FP!ZT!^z`&}?MrIQ9N(-qICS1A%0IxU3 zi9GNAh%GiRzT)Dn886neEM%{03l$9!*%>GGe%85!h}Ou`sT%Kobi`^ePSkpCccHyB zS=8OrN9w{Vn|CP{ol}|K&0UxKOoRFA{O=4c4ofbD{VebMxAwAQj!4Bc1xDwRD?9JJ gWw<`^m*~FqKaGFnGxmmjS^Pxdg5%M@!0@~Y055)FkpKVy literal 0 HcmV?d00001 diff --git a/img/p/2/0/20-thickbox.jpg b/img/p/2/0/20-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0f73e88120c8c8ce54e1a4066a2e0115b85b71c GIT binary patch literal 27873 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 literal 0 HcmV?d00001 diff --git a/img/p/2/0/20.jpg b/img/p/2/0/20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a53c6814c6213b39c83357acccecd4530d63f16 GIT binary patch literal 30294 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

    -geq6Z_txC|##WxXGnffGbsG4U+aj6Q; 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 literal 0 HcmV?d00001 diff --git a/img/p/2/4/24-home.jpg b/img/p/2/4/24-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61e14a4c6cc8e7ad5fc43d969b87535e8acc39ca GIT binary patch literal 3322 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 Fn*b6tX0!kR literal 0 HcmV?d00001 diff --git a/img/p/2/4/24-thickbox.jpg b/img/p/2/4/24-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..868fdd3c52de8f5c269f716080886ed1db9823fb GIT binary patch literal 28642 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 literal 0 HcmV?d00001 diff --git a/img/p/2/4/24.jpg b/img/p/2/4/24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a3f0cc3c8ec89a93327aaf50e5b937c5d9ccfe7 GIT binary patch literal 34942 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 H^UMDO3SJ;> literal 0 HcmV?d00001 diff --git a/img/p/2/6/26-home.jpg b/img/p/2/6/26-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1801968340ceabb41d003c1a6119046e70fb17f GIT binary patch literal 3079 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 G$bSI)s~8Lb literal 0 HcmV?d00001 diff --git a/img/p/2/6/26-large.jpg b/img/p/2/6/26-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e2357185e545876121a1e71ac5fb8567c1727f5 GIT binary patch literal 9486 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 AW&i*H literal 0 HcmV?d00001 diff --git a/img/p/2/6/26-medium.jpg b/img/p/2/6/26-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d3b8d85073e831c692e8d2e1ea7dafb85c179d3 GIT binary patch literal 1775 zcmb7EYc!Nw82&Ev%?xw#%@{*M!$f5yqNb}UMAV6?CXz}~IuQ{@IhJ&hP?@5R%KZqd zB)OF6f+iuCF(ublbSR|ga?<6Pvu9Rn_4B-Yul4=d`}y|sKF|BUigv|w2zPdHa)4kM zf?%*9MHgfTp$MYfAP8V%WDFw^Fm)1%NT#Y&sT6ezg+^!MG&+M$q2O$sp~=$H(xPf; z>#$imOqLc)`4bog7y_n-VQMTIg~s~dp{Rx!WXKhAMPVZdVZbN@R@{g50ZBkj$#*hf zGLZyWB5L4R8&<~TiRufZh@umsq5y}ZI7qXU1IZRh&xX23+DeUf9EqKt*{*-CHdwy$ z0DBYZa-d1dL1Jv*NC35>Dpdb;i{9W4hjC}bThBSa`>{^)M*lf3uk)jpYY%mF}N3#GARlaf1TZ=`|z?t$geuKHsOO=NeP)KI)&;u--dtw%D!Z>5WWB z&*|xoDQTP0!8Zk`hR=A?PO6LQqIT^Z`LwF3kQO{l8q)B%(R9F4q%R}#&fOp7=@M1xYfiSs{mtWZ&f@3Xo3^ zq?aSF%Ljzdc@oFAa`r??mzW(*%X{Fog#Xo*8%KBSUp~cfYl8!Z*3!+M+0x-J)K<_77dDgGCZ9N%*-?O0T0pLZw!v;6#g z>GhY!(;I2QPD7^hPfimj70>}k&#rI7FIJR}x}h7?meBe*UtWp7dRYu$PnRz16^yJ} zBZ*D!-`m6MVm8}P~%8eN?WzI7G8Zw80)_7*we5}ukn=LOQ)ZJgd&|Jf==9$tdV_ex0 z5Qa`_2RejdXvtYF+!hoq8?}&RR*g;8o51i(=lL70A?dP+=Aoti;>cTH$K?(^qO0AP zGEVfYes*RmN2{<~TJ*#?`H#0_)(fu0Z;npgdU(XjhI&urzOQcf@|aZ$C_m!C%{8@u zSqGs9C2oroK89g0U+x;1ZFJ>B0`EfHuD+`Ig^$?513JMI@ZlyrR4x0s@3ip3&|2&4 zIZ4`y#WVbOPVqHAI8xSeXty!@VqKH&f<3+J1zV==7cmX!RRbHn*adOqT>Bkiw z7O$a2yr8qhE=%4#q2A3U&uwnr2jtQPh5gI;fM5oMa}0l$HJ)ogM_%;3Yq}PBcZRpS z&`pI>jukLNeuN5TX{b_GS=adUHCGcz4m0epRqlW2*?gm0YcMn%AWc;EfN6-TSOL7s z9^lR>&WX;n2r81ue)@xd+sdqP9^sWpjXGl*85M$r@Z7YS-gS4(<{c{2x2d~h9F`W? zzM=Y-@UET4`{40b zyns~0h3VzvtO_J!E5XOWw!XEdkUwTFIE1aemlao`IecJ${y^^ewB6+ETIM6QLt8%Q z2sK5)esK7`(wESE5;w*wj#i%DHn`+z={a6+e|nwU2}e%Uh=eHg@@o}0H#zz2QJ>oU z(dI^R&3>rgAc8t+kG!rM)`L{FTkFWZFrT$Ow~`*8dQ4sY#<+3t8~!A;wZyi;)?crM^r3@r5MCBE4n}jwe-T2A AC;$Ke literal 0 HcmV?d00001 diff --git a/img/p/2/6/26-small.jpg b/img/p/2/6/26-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..657960993070093543aa4fb4fef066de5a5304d1 GIT binary patch literal 1147 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox=uQ@9phFRWk%^synU#$NC@ang0thJ}i;;=> z|1Aa{pcWXbLo#185y1E7PG(o&xTL+#j{Byk2tloXCR3 z)AI#-r2}RyvTF_S@jNntwXj3-ezu;usoCTGlP4dGuJLnv{ZZcEy2Rn3oT9E|q;ADl zR_}Fl_XBN}5@Y~|J;F|~9~1=y6~MMJGcwvUntYbr>b(6pC^!Te7@1j-6$AY#$Sj~> z=m=KM1X3PkT^`JGO6o9By&lj@%*;&8EZi_XK>r9bum}k&uqqll1{PivP*OHBO>CaL zc+*3u_t@;2zNp09*>W)4*R|2~BX|BTZR_&cwYI8T{SGW+nz}G+s>4Tp0p&!8+uW@yml*|e4I9MhFWd3sUGX zG6({ltq_*L#pESUdb-}%uz98 z@`99g$K5$Z58Uiv+?*`ErsLs4lf%hV=JmbuxO?Z~Y@5q*ACG8%;&a;R_H3hm6vMeV zVHKWdr^LE1tH0n{+H@>xE6_pEWW@lAECHd-0_V5$Zw5yoFb+_XC?kWRfP!Km*ma-? z6le;xievpK(YYL~9HbgK(J~4$2pB3NB2b|7%JV5lZ)h+sj|Zxk696h^W&mn|=>e(- z20~(Epa3L|08^yBz|I1Pqz?9gE{W+y^Nugi=SqHgdcOVS#51!#hG@73^p^#F+t$$P zE%5p9b56EqpCf-Q{mv~pKl8iYBT)~fmmCW<0tHRGSw76V$hg^u;YBJ7ixfxlck|gt zbV?@X>?&T&HZ67KJEfH|AI*)+rsT6N*tzHWGbd4%ez}j*`Kk}Oljb!<#LQz&xHs!j b%GQft%DgrjGGAR+FiY+DbLdf(X`R=`M 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 literal 0 HcmV?d00001 diff --git a/img/p/2/6/26.jpg b/img/p/2/6/26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf547f5144772de0b16275e753df5a9c76e34233 GIT binary patch literal 28689 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 literal 0 HcmV?d00001 diff --git a/img/p/2/7/27-medium.jpg b/img/p/2/7/27-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab04c2c16a07dca0b74faed4069a30c5fcdc3705 GIT binary patch literal 1751 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 hE13RBt$G$&rr@)+H%ln9X-Yb^2>>O!MRouH literal 0 HcmV?d00001 diff --git a/img/p/2/7/27-thickbox.jpg b/img/p/2/7/27-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d05a220394087debecc7a2425053c9956023f560 GIT binary patch literal 34555 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 literal 0 HcmV?d00001 diff --git a/img/p/2/7/27.jpg b/img/p/2/7/27.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a09ffb56587764e6670db5e1f9461672f655934e GIT binary patch literal 59782 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 literal 0 HcmV?d00001 diff --git a/img/p/2/9/29-large.jpg b/img/p/2/9/29-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe6b353f9b27f60fe54b71ef3389fee36aaccea2 GIT binary patch literal 11884 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 ysZf{8kP!X4E-)jeANA#F3cgZmi`+Fl{CZv literal 0 HcmV?d00001 diff --git a/img/p/2/9/29-small.jpg b/img/p/2/9/29-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4105bcdbaf9e49669bce5a8d6d96a01eaca93cc7 GIT binary patch literal 1184 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxw2{1A- zv;4osz{AYQz$Cyd0Q6>-k2bF<)7f2@B|^UKxzM?{%VXxMX_K4p&q{pe7CWcPJUQiP zTv>Pt-@Zy_ppl9K3_!0i0ky*bki*Kr$i^-pA||e205qEeXeA>n({JN+FJr?uFU_Xs zuJF(m@|_U$ifQrV znsRkwcAY%XT4_O`Kang2x|<2;7C|8eu!TTh+B44O*|b@@+d0l2s-Bqv zIb0ZlCI|^A7=qO^fzRD7 zEt-4Oj z64ECmKHk5?^+3Cje($HRSAruArZRVbmrYtIx1`Wfg6;ULYv*t2tn^uP$Sg!m%x3wC zpZUvI9-pv0|M}Oes!Bd5b<7yt_+m`w1o#`O{W*63EUSo^~{0vk6TG?@7C z!$(+T*(=Vo%rpGis5N^aba*-&#CP^+%&KO1V-?aZlUy))ueWoF@L6rHc#&0w22y-|71L(YU8f8(j~ zVy4d9L@w^-2igZtc;JW;U{PEzozGJYjxAtnL`lVr41&P83OopQAt-hQ0(6@`JiGje z%PJG7K~fNy#!!<3gP@`zBr$*@S3s;~zPCh2^R#EF*N+1=$OA)znE_}8JV^j;P&5p5 zOl(w`2(bkiT=oLp)AeF@Y%$Tka&y*V7R_g@AGfo}yFHq#V6WbG{L8_AfmS=^8Xky; zX68ONio6o&wwd+77nkI&c%|7dd;*Ft__4)J^qYQM>HXTiZ|Z5&=Vzt|s~OMSpjmr4 zJ}~+*^QI@8jV7`39&%U}+9Vpuzu0Q-!mU&0<#T3!w^|VM;f9x0)6C_J9g(M|Y?>9^ YIyFY<_oK)uSNJE~;$dJg{`~(Y0JF$qJpcdz literal 0 HcmV?d00001 diff --git a/img/p/2/9/29-thickbox.jpg b/img/p/2/9/29-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c9c7acc94f9dea3f978ce16e2982b47999a698a GIT binary patch literal 31419 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 W@l^U$Mm0vw0?pcg01B~xYyS(I7#P?9 literal 0 HcmV?d00001 diff --git a/img/p/2/9/29.jpg b/img/p/2/9/29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f77be18d1ea2c875c7018e7c8427eb42119b1132 GIT binary patch literal 44471 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 J?flQf{{sv*N#+0m literal 0 HcmV?d00001 diff --git a/img/p/3/0/30-home.jpg b/img/p/3/0/30-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa72ad43171813f12a6f4acaea08ed80f7424d38 GIT binary patch literal 2480 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 literal 0 HcmV?d00001 diff --git a/img/p/3/0/30-small.jpg b/img/p/3/0/30-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7d794a5ef96b37750aadbbd6e9cd7f905caa304 GIT binary patch literal 977 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxHjST z9%djdz$^gd|5~DX_3&|-iwB}o1<~=s=65c;{37Y);vn}WJ zuiXW@_sF6pqG;#os>yr2Z1UHbc;8wX5hzi1O6RS=R z!{A^Q5O_Sn++3#^=nzRkP+Ebz0>}^$WMEWqgom|2zvzW#ph5|dLS%IejKI)_r~?JJ zz=}tcfXWmF7=czWvLMtl0z=!;FtM;P@Pop{k8qy}>@0eEdb+Lqk|RM3dCbd;Oly1v zGuv)o?N}GbC>5~FRe0jc<)Ky*I~Qj^wV1bj$Ikk7q1HMs&+ER*?hg|!{G|Tt=e%d9 z<=qP#mitBKzFRE!%jf2N!6;6-T`uSE$a!#|;m!ZTloOJ1dNtQ;xx8MB>PnB##n+$z GzX<^GF%ZE3 literal 0 HcmV?d00001 diff --git a/img/p/3/0/30-thickbox.jpg b/img/p/3/0/30-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5fa11a9165ca1798112bf08c7ae17c3f569686e2 GIT binary patch literal 16029 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 UAP6=NH{)@v%QYzY_Vw)l0;(9;;{X5v literal 0 HcmV?d00001 diff --git a/img/p/3/0/30.jpg b/img/p/3/0/30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdd92a611787e82c51585fa2779fe2331a3346b1 GIT binary patch literal 17755 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 literal 0 HcmV?d00001 diff --git a/img/p/3/2/32-home.jpg b/img/p/3/2/32-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88fb3e801acb3e8b47c92d93faa761c28b49bf7c GIT binary patch literal 4131 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 PTWzZv1j84O*M z00>`zcmOa5kO+k2h64rPXdD`iLZR_kECxrw6A03HX=xc*IY>s9C@U=uDL_Pd5}8aU ztXQe2KvI+=kx7!DfJpco6j}<6mLkbW%aH!>5I+QnIKUBbM1phxK?IRRQ2Yo`0RRLN zl$853a3C6kMWW!O5-3UjOh_J32qYR5_X7m@Jpw{Pu*@J+fLYDq8^c*@CL#8FUcuS^ z*1^lo#Z4jOI}RIqlxobxx>IH7DXzM2@$MdTCD^&PW1cJO&M){570p;AI$Zq zRd+Eu&@ff2j5BLDwc<2LuE4HT@m{a7Hd}9zDiG+FxvwcNylmDtKgek`&4?yiR_Ih; z>-M+7{%K2(oEvm=Z*%}rKUXTwQA$+37qWzB_mxx%Ht%sQ33_dAz|Ag5+q`Ga zu{`*hYMIi4ObHMGZG{TL~YH1e;#nlA^r~b6!#fam|c(W!r6X zY_4owx;Eg@5%46aMzi-&86_&nqHAaq*0EjGsbbJ?7@4U4GMDazQ?6XCQF7^ouZMEw z#>ia-Zd2()C+RgrK8@Hu+M*GGa-b#)>pFca#g*%`Q!NZII5oi?h zM+X2RY(C2eqUy4*#_)yj8#+Jym?#t4d_=N73Xekb${54Rk)=rRpp-uL#7Khy726j-K)`?A=ykfUvEsJ*x$ zC&&2MU`OCXp3a-Gc=MrX^~6lkz0QpDD8`#yT&8l*{^VYf?}4^_&AjoIa@psY`Q7!a zj^4!WR(@XiIQg8}*FXJ-Hk$6AUz5)y#+ijG(N6W+8J!Pk)XO`N zu*boA|DtW)3u3D6#kdL+3p}fuTvNR5^BEKCuaS;E9}is~8acQ<`n+Gjxc0|Z#Ms2x z?X*w+5l=@>ozxRWKWBZ((rW!Ce~`ONUb(J0yqv>@9a-LkfW$Vak*V8g`UO3_rPR|d zTwP1=afsw}(}}RRAOibq#e&P;LM$Kl)z0@+{<5u-frX-PthyK+z~A!r8&$iiZ(OBl z-L(S1d5*b}aKKji`U+m*NZ-Jqw)9~a!A$6(X}`10pBt33bFKu-GuRa_B7@x`)pi(2 zTL!|r@z;ugfe^!t3Iq9_qsu(W$U+H9oPG52`9=IjDoN%8``PoCnOoYUGT7|#iD`YD zb4-0!x@$$QhDdPNF1_8{{Z)Kc6R;;9Myy#rF9iJk}z|2!9J-SG><=dYAL87$E!8?^YhUVD^;*)m0-k4joCEdbq-IM)si> zJ8r&1wpC{&*d<^0;Om29UT>Ftt^eKf@mtmIp)mZtW^-$2bKAwtlL(@_>S*LWEB92_ zumrRh9*ta=gPz39Xf{Zh8l|neRxPZ(@9`}1ck71L9>9d5mr*w-$uckC>}B;KGmDRG zQfJk>(4?%R;rRaG@Sf}vD=gFgeIC&@HoaF{ShQ&pw^xQ4(!VP!^LW-1KrKVSW!1X+ zc13qkK~q)p`~b2Th&}`P9aZ3RQxr@EXKbE%*GmmHRs_2|HWXfp)3x(g_>?6Q8mjT+3Awd<>mBN>?BC;FNI6s% z?ZCU;HGkr{Q)C>YyUwZQsp5h`g3i&!;sxi~>qDkg4QtBqnT1cc_eSV{z%)^(7@l!A zMQg%#U%JuLH0fBTOsUj#DR#ONH!7uv{YI(!SKlo_35t(OeYfRl>U_EDbNjf_l~a$Z NfiRy>-?-ww{{YhwY0Urt literal 0 HcmV?d00001 diff --git a/img/p/3/2/32-small.jpg b/img/p/3/2/32-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61ad554d0f0ce492766143e23c576ae08452c77c GIT binary patch literal 1283 zcmb7@dr(wW9LLYOk9`C8!Y(fn*hK|lh+PC!;?aUZvJh_Zu)zj4YfLm4&`JYMkRYA` zHG#|+596UM@d|LQ;q3sTV-ygw>wvOMkuMAp0;cWk8ZiCY@1DQzx%cz^-tYHZ-Gpu$ zP$5D4g8+m8Ky(3}8Uz9y!}JRcffmUkNrE6bOeTZHM&T6t#)zST^G&_uYt&EE1<`}qKLkX1Cp_pp z(YCWOy)6BL*YeF4YaL+8hU&N0xEA^&sE`5}8c1#kqC^-FV^a2jHWQd5JPV}F_LZ`*o3V}^L1xA3QpZD8nA`hjd)wJ7^H&=ZV~eVd>NzXlM@ki3@mu*`p97Ub zamkK;wD`8HpA+G>FVQw?a`>R~wK)fqS)^@8BW+0F8`1z`05_wB5-CB+4azu#{xD10 zb>K2*%R^=U=#p5X{bT!FzTixx)-xt~`>(S$;fQ2Q1BjFQme)rgBW)&>$SG3;2-AZC zbK15!o^;7i$czYIP4bh0FP-;%aIp~qTu=-UhYW(b0l;uTn-Y{zBypFLX7=)30g9xe z=8=B`VfbT zX6&?Uu9qw^UQ_>)ETvKt@9QDI6R>tG&ZYnL$F?(Ff>)iNUCZ3!-empN+~KJwVKytN zmMJ;QN0*iIfRf+hN7N<7$_a@OY26+_1R@~DKN%G)8y&q-^Gg1Fng_vd{-1Z>G? zarYS6qDF^czbou+rg{M>8V)AV_e&8)Ox|vvR%BI3qi)devst^rsx*y~qkt>#8Jy~S zr>gnlFk$EK6+e&l4|*hMPtX%Jqmikhb0@pb@Kn=jZ$?jP5zmg+pHI~OdUF8MKwrEx zsk!F`OHsi?7Kf^WNj#u`KJ3U=3H$;ehA!D1M7rx|*H2b8= z=ANe;5mKt;+2Il&>DSY1(m*FwZs8@zkb{HXb>lm}3ud+V#aO;OTykz}$WXAI_;~BK z1=?K=k7V6gx+=3fUa|9j$7yC1x24`mQ0N+2)q2CBY^hH?Ir+rul!iVsU>~k3E!Y)Q zJ~lF=GV#sDRgn(8dozq+;97=ecEsaY?Zf@uN-U?qJ5*Zy=-TM&g;U8NA8V-%>^=H& ZVI4NyVf}Z{A*+>%kNCb1zKGS``3D>HoxA`5 literal 0 HcmV?d00001 diff --git a/img/p/3/2/32-thickbox.jpg b/img/p/3/2/32-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c6dbc048bd378b377fa611f84f98904c34f90e5 GIT binary patch literal 33248 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 M{C~YQH2#18+0?9`^8f$< literal 0 HcmV?d00001 diff --git a/img/p/3/3-home.jpg b/img/p/3/3-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95b305500ca3310ddf78f9e33d05907094740831 GIT binary patch literal 2922 zcmb7Gc|4T)AAg=XT*Dj~qY|M)QZpfE%us1^G~-CFYKBrmX64RJ$h9ov$gwIE!pN0% zmPrw9R_-fF$&$%YN!f?CcK7$+@ALh;`T5oc0bw}w5(~#dkuDwi_E@yl=3woi<<7z^%@00b z6fO_UPX(1{yLY9@h1t;XyAP$D{`3&Tp2A&Y44j-xbhdNLKEeNj7F>AFJLf=Sf*@bxC)$bSX^`h8Q2bO$Uon_t5E3pj5lbXZ}#e;vW1`6)J zCB&9%H$f>bBm`X62{&A-J7qSSsT!--X7~F@S*~9$aRn{S{ATDy?~u+ypqdf-bHIm1 z>HA$xC(f;!?T&ffZfJ%UQm^`IWg1=2a$ToUU2)L)P7u z1j7339qRk4XAMC{$ZSFmL*j0D#Qj+AP-lQ^ZewNXjlFjXu{D{?LrZ?4(I)Z=%)5Ef zUCT_K_k#Q21GhU?jc4MjsGKnyKWUb$lOP>3(B#ILVvJAvE~eS@0!R$&9{IZ`>K*bO zl-2!pHbr`>7hHB71fx8Ol~T_t&r?l8-XbK<{w8jc!qwVu5S+r@NdP?9&P zbfY*&9qwJfC_j-kLpFDBb$$MPVENWLqC*Oc@M!u|{!r%5byWp}FS{J%Tuv_D6gDQ> zpL)Bh@A~|V( zBMR7h6wA%`DtX6V=rT2eOZu1ukG9&aF&wSZ*0ZQuN#cxpf3~_s7fQu=kBd&C=}DHY z!Kd)^Giol8HM|Y{)Ypp)!Vk&E|98i&_a*`-Dke)L(OExL$f;2blA$tVutrBb={ld@D^a zDS9bmcYJqEGPO|xwm;ARNX%HIk7k2X1~xi0ehm;9&zs!bUP@Z35`KL9#7xrpOu->8 zDele<97d(7`yFxRegs#3yXN*rcwoCUWkVT#xue}uH{8aGo9%YO7L{chBB1SDk@MB! z<`-OQt&98?lYrnz1tr>hku%m3UR9>HJRfHBQ})svkDIIbv9e!Xhm)%8UGc$;O}e7h zZ`v5N3sPJ>(N%q0ZsCFK{>G&pCZvoTX~&$YNUB1 zeJVRGhgrU={tq^RH+&rmNzBd3-MP{`MYeIcX)4_@AFixe`(4cQVXugLqrXy zOVG$18^qiS3Y|Rrbl?D zy*cxh+aNSz)SX`Dj%^B?ZmCSGHe=dDWuA;B6`861?(}DmqrT z;eh!p7W{1bu>U$+$hLkka^i9aQrXg{WbEYWeKbkx_6sG$ZdVmQm#-MP-`3c|To(HS zx6ia7u4}XwLnJ@Xpghsb8W@D0SB0y;p0|2mx5?-ds&^N^m{|UCC*^R2smvpE!uZm) zc#g#uM0c3D0j6b^z>Yab#u^=&&TtS(c1!WG8%f=zv4s(0qj-qSkU@O?S@IAM!zXY| zE+THUY8vetGefN%68Y&gA^|&@q7vSMY7mkvixu3y$EoCD?1^9TzdGs9Mw38zcyde> zwF-;v<_KprEeA6`>z99tqUV5Y%bmQ13<=>tb1(ZR;*#WNnii3obXZbA-}i+Bz@gcK zU3jVsG0&FnvV&a6J&(xJh2`RJ(tGBGE+0=dPHa}<+1k904}nBHHEvk$`sIHZ%Gh=s z)LGC6vMsMh`afT;u91*75h~{ z$t>AFFv&y)lNNpC%5aE}sk=XQdfD(nV_I?ZS$T!nnw^DDdSBnn8FMbDDA44 zHhbY3K&o?{>#H@-jm;chOzJC)*mY#0{X%E-7kgba%iWtV>bd(gzPQ`enwAyMJs>lA z7ubJV)v8}3b!7~4Tz~&&Cz?Mf7kzrrtDrq_edAebZ##Qdahs zMVXoH`N(w-a<=)e$skQFMP9?7YOVS5*Wz>^b4|yU&pXbku(A?i(sXd@4HP1J$|@pE)iR)FW+$O3G8;?a!OOH4ap;=IHdkLI0Xww{8KP7 au6jRrsO26Gl*D^z%ToW&?5p6lfxiGpro=-4 literal 0 HcmV?d00001 diff --git a/img/p/3/3-large.jpg b/img/p/3/3-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..048ff8e78f45f686ab496fa2cb17e8a16c549784 GIT binary patch literal 7280 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 M0R_H^7VJ8mJPuvOrC<810YjGE88{CS5$` zrmW(u-h>ODv>@DO{n8&JT-cfI&gL(XDEmFq1&c=+CyXM;vpKTjVag=brq>h!fa$L= z2|@esVNwF7VNS(yA17-L#oNb@{v%Ez-jL||=0Ntaft5fuqh|NDft3Gwn~O*xO~0jC zH2O@`VZ!(IvdN~daPb4Y`9QS(Iw{D-@BCoC@8XlqOq=Vk#=&1H`_R(E+qWID$q^&9 zK|?dv*Y7;?-27^Yp;ZFCl>CsA9Y));#Cj@dlW=woDXy{R{$*qmlELQaf!8jp((b|c zr=QeopG|V3GG_Rvy*yW}+M{Y9nicqvl0RL@Ux;UDMypiM08zIpKT^i&YIo0zsXRev zf)4um@osfMioCK(4pKK4ZS50&KT&p|jh$hjol8AVX)S)<5zr^ zSXeUDnpsFSa`IdX_4p)KEl!R}pQ}AktcoXfL7*W^t*4_6{mmNGgSN`r7+w2Z9l~5o zoZ0pm6mNC#8^Q{CXiBzsrDq5f<iQMi`O=hJ=qRofdme{Ivf4r67{1+>utiyNHZuAB z0^VzT9rtqsbt3VX+_nSEaU3g>{G!$6TYwsBT&v{v@c4X1+>_#@aElqv^O||XX}aXD z?Q2QC8@C;*4}wZ)^{oyZN8N#YgV&3Ey8^34_{*70f=BA7sR{bQnM7${{PXcIBU4sJ zFW3?s#OFL$*a`CM{g61x%w~@iyl4l0s`*uX-Bxt~{S52i8|HUd!#0S%Au_tq7U`x) zK$kj;Oj+xla#g`ODn0nslRgNxin0V1CS_hKwNzQ>C@GtB`1fOQVuIw^)k%*-AdxlA zgm`a{h)a5nq5B_|Ov#TpO~{Ox!@PIu4l5Uo=ESv-z>}Luk~PRlvMGJS3zw8nr?~xy z%0|Pp@eM@r7MKg8p{c3XqelQvKQ~(i*WfXYVb)TnPN>d1?x8)4Jk5H!yHT+LWx#z~VEH2kRweC%32i<5NSo|Uzdy5g+b?Oc_`Dxv2PJg>K9 zhRa*Asx_B%`B|b8r=cipMhqdFU#E29d?DoB$Oah)B%3IMjoFLY&@!_o{Tp1}OQsp` z^0VIf=;;?Mn}o+9y@L}`b7_ztj1T8^OunSYu*-cjE6%AfMbizEMh(HT>kpqzeG?+o zP)?CIw(;N9cy!rB#Z@dQ@XdvLi>J5UbQ@nHqOkW5?m0h&F~y9)?_v_1krp zGc9ZXk=4WPB{wfNVJ&FDa*AND=Iv1YSB4&rcJ+m!1>e=m3B{2_KYa^hInpHG;O+&~ z5vK?YV;8iCRgxN3@0}i$I6EF=J}c0$Zzyl+x$$Y|`JuG`AStK6{|ApozP3MZ_)~UW zm23tIm<=n#>KaYIy);Am$G|aM4IV@F0nOoHrulZmE}dtJHSkW_kg-Jzn?sk_tZ>dS zwZ!JU>mmV4XbN1VOeZ$XAw2<3ZLsF%uqh|D2(HNcPEfXnthY8eT-Gi($SG1Lie5K# z@!H3(Oy*!HI!91NZZxSW+x}KDlr8@nU}SGc!$+0&HHF@w8)|-}iJ)+uQD>7N8gym~ z3?GXYK?zckSMz`<*Jy0xd`^8+Y2ot3f`yV{3D%{c=@%fYrTlNjJsA>uo`0DL-y6 znExXehZAVgs?xe58HBP@mAQ1=UBbA>SxE<)nmyw9n`7#$0Mw*xw0F=0-do$$Owl>+-t|zJ|4|B z^jUX6ywCab_&Z?fIsJ7NqNr54fp3c?{6;+{!!=#8RJ78bz-?Z7>n6EVEmKb19FYh~ z^b|d=|FG~0{NlviroU*}fZ}b*8$jK=VV^f?R*5ddwi0c}u-)9bT30@qxnDQ2ij5Op zkI7n4KS7y@@-cx~Rbr_as_K+9$K2C`B1S1Y6V2B5eu~GD)}D#0$z15}2W2tR`}T-* O@4aFY^DX@D`+ouF-rLLo literal 0 HcmV?d00001 diff --git a/img/p/3/3-medium.jpg b/img/p/3/3-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82b56de65a18fda6275b7aa22994d86094bdcd3a GIT binary patch literal 1712 zcmb7^c~lcu6o+RrGYOIeW*|{GE)bA{z^McT%4P~E#Vstd9A(kSCL&eb5cEJ$F+tW) z&1&lI)y@3qp8zqRCOwquAzm~H3$tV6<>%G z+6*R>Nz+`Uvyh>q#b7d2hrkH<2E`U&*a8NfN@x6UQ{I9IHOLe4L|_AmM8F6ED{n(f z03->4RlM^?roae>lGK2AF<4i5=Uw29pfCv|Q4Ryw;|1?HtVI3#CIaOTt+%4sk5(2QM1f+sPDf6sgib4p1;ab|PTJ|chefpN( zyd=@NIc88>4$N0iM?*Kg*DD_=mhz2mxf~vru*4UH{Mj|z zKD5k<9R0Fdk4jJbK4Elq{J0@4I4Ck`HOf7k&)#gGH)*;Dfan1bptr9zQwfq}iQrl+ zLR;T^E;>mSy}|g7U2^{H=9hcc^A24PjI?)qe}19);vXUk6TvB#I79;ZU}R*$mxRC! zB2X4vOMjKu6-=Aq9COSf=_dmhZ{EJ_;@X>Eu7b=VO_toqHMo%<9rcGUrJLF8`~jn+ zKUrgMnV+tJ7Ph-qmo6K!*k#v$v9F5mLhYvp*F3F$5<6{|am+hPm^C4DNt6{>uavZW zKW%;TLqc8C@tI9Cetj0%g=zVkulTpugxnCcD2Az{!wxfIT^ss}0L5jhh6WptN);6` zt)6>ECx=MvGVO0oe{P>;hKROw%APH0_NhIT<1b1W4=Uw|4?C(egfH8o!dlc-n=a?i>@y)T$c|~$quZ}ezINsGbmDo6`gc@VFpX2s(ZLSk%N?Hy0QB`_t4Fjl+ zoj2^%d?kDHP!GiWXKA%=Z)#l5T~>Pgq2tlsv0;k{C6vGUnNEo0ue9uIC2PAh-%thVKrQ91JKgdle8>4T3Hs zRCWF@q)NgB3)klrv%N%f0aXgd`PYo8S0?q74PVObFS&cO!W+eRx6-ClC&u%x$$PGD z11GU?)t?O5*M0!_EH+Qy*((XRi20WuB*?*ME)Tf8WSaQcR(ND7u&joimo6Ew3Hi}m zJ5rd=1U@xv5}4=S6Tc$*HA^JF-8qtQwb}G(RL%FYB%cx8tsS07SfGEzy$7@%hSpfA zZ7Tc8j5_n3dCPCC16z{(Of>uAG?s35sOyN2bb>klDDQ;j$L@ClC4-OMFI$h=lyZNu zTAIk(%V!27#%Ym3*K7mNkhHq7N;u=8u>%=%e9hY(s9B$PzQ5h9Z0KX0MR#4q^4qR{ zp~C}ioIB!KqN=9f)ALPT@Z=|9XvYh+gWT295c!D3%zecY#T41usVq?}*!Z0*I{GP5 G`R6|kn|Xr( literal 0 HcmV?d00001 diff --git a/img/p/3/3-small.jpg b/img/p/3/3-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79e2636f601f394e4d909b78096781277764f9a9 GIT binary patch literal 1072 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 Hd-Z<+7g!fH literal 0 HcmV?d00001 diff --git a/img/p/3/3.jpg b/img/p/3/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f511332e89a7d59a57d317b33ba2ca58d09d8d8e GIT binary patch literal 17009 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 literal 0 HcmV?d00001 diff --git a/img/p/3/3/33-large.jpg b/img/p/3/3/33-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b598030d0035bf64b392899254bf4d13f6b9fbe7 GIT binary patch literal 15199 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 literal 0 HcmV?d00001 diff --git a/img/p/3/3/33-medium.jpg b/img/p/3/3/33-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed4a6208b6d3f1c380d65524882eda50e08b7944 GIT binary patch literal 2235 zcmb7EYdn@$FSS*ZBD!KEyQ4JwosQ$2FXzK~*7~s4Z~gwydVbIUB7ZC&1t1qEXD0vz z0RV&-Ab$cl0!Rcxv0Ad(EqTLC((6NQ9@ zE&~f7F*p!`Lc_1>paRQJiUWv1%0~bq9D;z55PZL7qJ{6W&}|{UHY?Zc<=$MM&o@c7 zSN(A4)uXb^vc&Ea^k2Pd5E{N3g9m>zG1(YQJb0saSgWn`4DUhA&Ki1YP-C=TH;N(f zTf?|EyEde==CGS5ZOdSA41bIPkq9(; zSsSbig~njX6so$a9&@b~MAK(k!b)+leh`hAt0w-#%KFme-Id)5HWz^y2f(vf^1P1B zeVgl!Ev=%kI>!T|M=nq0d~*@rbzwRj&eI-B5mL0$$>*oXP1%~t=i`6!Xt+n7e);~4 zIo@|nNF~=TOYo8=Y9~8dO>5 zwr!7nkMIljQ}eL9%t%C)V){Ed~jU|k(Q${8{-n}ky zvosHON1F^FU?7*hQDluwVId)u9`m~;ND$QP)PLXSNtH?foOGUM%Gd!$Ev4iF%*GbB)hx zv!QkJn|I%$+j@5LB}3m2sq}6cL3rUIO~QU?b~K#n`-r|dIVZ3ta$NexZYZ$yby62G z2paP@+do=?w!xHHpA&Cq-OpeYry(<*U}IxTk6L8ELcB}=;u78#r-&KEc|Kr&sH>ew zT&(|+wc8?a<%b#$qocRo>`MHCS)&2>_O+MU&n+wNixC%OmulH{Tg3Su(aZ}!N}^Xf zhWxCBlWHA9Tl$@w^=N;jH{8^2m$9nuJ?-!5e-3j7ccIGXvl@C>(={3uZW$w-lDi^gb3Z)e@7^9Y#ujEGN<%hnp-$*GGj2L}XsqrZB&i;c7#lP~2Uan+5KaySX~%81*SeeKq5kUt;J&FmF|3$d&(1wI8eg%~ zYQj%*q)g>uK}pU~L5k=3oJEpB$w|R zMN=uZ246K1CNMUCB?k(%8p6l@B`IoKH%Ox9?sV)xBqe#fm|{xid+;wd1RW_J!|yB| zXUM$V?4CV+<{~m~EvDqUh?LZN&-G)H2H=AIJ`Mpz!$Dtc*>|n~7~F}A3&mg2ZMr$& zBZi%)lNECm@n3^h;XD`O3t7tz34sOi0Zpze`bX!pYAYvnG~bMTv3(!0;>g_|J43Ik z^r7Dgk*ln}W_6lYcP>#X82>Y#|CLN3q`Tak5cleQg6vZ(F*@|@Noz^(%6%N?C~xng zl}sdv6b1%}!#}}HhLA!V3=q9U29g0qSqMclhaqNqRde4`Q-U05v5?Y%dYk}$WEd1@waT01L~K|$!CfMZio-!I1_e*-`+~+mPQQ2 z&+`}lK$2DF0cmaXP2aA8VVlVWG4ASF!1SxnpW2ni1Z<^MYGVZD1oG^<`zrhQwI}-| zyI4>gEG|_U9h@?=dKu^E!fH))_Ssci?w>z-$}=1nmOe8s2h8o=HhR!IzaFDnZZ1)y zKw*1|%D1Txu9(+tqny4ymP;UsxvaRC*lZJ@yk{45b}W8;!0@f|9Pf?kR_e>oGp$Sm z1k-ubCZc@RA7^cCbAmqm=N68=u zvAW}s4WmzoP23x*-yg{`9IaMK83@OTlE*s60uO>ms_!s;cF7v#z|-S%tNnU9T9515 z>x%3JV@M1>`J|N6q<=bBn_9gROc?nJLE`Kx8!<7^djlxr1*2k*C{DyT~YU- nb8h#w2w(e(&?t<5kKogarKQ2tY|*A~thcMu!p_S9`5%7)*M(!` literal 0 HcmV?d00001 diff --git a/img/p/3/3/33-small.jpg b/img/p/3/3/33-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d81d87046aa220a7830f9b5a68ec9b0ecae1761 GIT binary patch literal 1290 zcmb7CdoWyA96smny>{(G@3nU~Ry=kkv<7Q7LPDg*vLtASX_%OjvFka~R!p;vN2bb( zN1IWK8W9P>L^>fzJWIn?64huKAtEEB(Fh_zUXw7kXHB9>|LgCZKhDfK-*B+rO4;&4bI zN%3icK)`)(lZlWvF{TByo&+)w1}6*&!jR^1c=Z1+ofc3m-~b#L&nMoikH|)kWborA-Y( z9be2^&$W(Mm3%M1V0W5dOr6Ke)dP*mqUpnHAE@SkYMt1@YS&6_Zd40C6$I=li&{xT zU71pV0p2kIK#Ve$iPw8!KKjSM^nj z_g<+Iy_b>z;s9eZi8p>?08IclCit{ud(aQ0%t@Kp*d(^{%qSRo?SO#?R+X<?_8v{p_$hIUtHRT^?&rsk2;J{Y}-y z_-o<YJ)$-{n=|e?aMisoIPF;0arPgZWG?kH*B?KePtZE~pA600b+%=? z&1tRaE~hqa#O0!ozdN62(tO~NpV^0&ijTM;bnR8Edb3$Hydqhfhr1w9}+=RJJ()>^C4n`cR`h}g@ z2J+Kg8j74!pJw1ZPngfcPk(7Kti3XtEmWHCyEOPsc;nIGIF2vB*jz3hw0n$(0){c|rDN)Se$8MsdLZLLXcQY$b dF}5y7+D0AYRv7mACHKvRYibe}R&_vk>mNO^o#y}m literal 0 HcmV?d00001 diff --git a/img/p/3/3/33-thickbox.jpg b/img/p/3/3/33-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80b3c0f5561b7cae75dd0fd0a515771cc62b60d3 GIT binary patch literal 24333 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 literal 0 HcmV?d00001 diff --git a/img/p/3/6/36-medium.jpg b/img/p/3/6/36-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad8a49beaf9781158f8d28499f78e2dfc2e50208 GIT binary patch literal 2388 zcmb7Fc|28X7vB2}&dD+C!x0(JL1oPBax%~Jlw_XCRAw^dGvppu0}kpSWXO#}qUcs4 zWV(_eQ^{~p7a@wPk;r006=d zur~qd0!Rd6f5C==7aEI3qflsO42B8I!py>gW5(fF**G9pHar^+2OWm+oCGc|E*5rf zp2Gwl4gwcp{}K=h$Dq)M(C9-1Rvatg|F*q00FMQ%04pRY3?T3z5)bY@2lxR1fdr6n zraugeX2QT!`{!0Y6tsF% zW7$gyn1z?&`K!g1Pbn6WZ)4OwvI8Y%0|qu(Jv*Fq^4DGgw-r^zY4wM$?Ezlc5@nTy z^AWF35G1^AM_5J$9g}EF9&0g0$2f+TENWCWj>aAJ)+GY~JDig!1b`?I1=sWM#Lx&N ziU|ZTL?sRa#D(V+hBL&%d4p)g$mMe6P&|M3B8A?ysTFc>Bav(_Zm(mS?c0BxXT1x@ zZiFl!8Q$7-)2Vo)G9IfXK&tnL6l5x6CsZ^n7RL%aqg5F^^szc>KPX8WYD3sy*xmU?+zV=sZUlp+OSoOC2V6U!dUPU~1HKYHw zyP`lrztl(uwYkuZEc;0t0|CQ4tGaMA#aYX`WMth`&R%A;OZD>`TZBmyQof^dyYRju= zXHYuR)P*86hlbCQ4JK!<&1?z!t+mp%DXHeM*``Vb{9aKijK5m+4awcsJJGxsDm29? zF<;xORvuRIr|kHj(q8VvZ)Nn<4!z4|q?V26i8z}SF}2X{Vy?KQ%ILqbm^>aMm4fN{ z*(G{NTs4h{)8_R#q_eWhtv@5?jN1hQR%hnw?LT>KWPh>!ya!mw?=tjzo;Ns5@|%=p zj)zTJ5`yYyPp)+3YI&t%XHN7Pw$-eVbVX}!A!=5V zx_o#mG?0y^4$q9|?sF9!DHT$3vutcO=Z;_SKIilhX3tRw?n7Ak&_DPH;sFv&oFs@C z>XB7ax5gO!yInO&wT0hmpG^!8c&mQYcz&BT>>4%NdFNswyY>b^_p7^We_SEK&mDl6 z3OjcM3Ximf39>nE+h(=Z(f=jIzjb*%$`*OA*sgtwYHeX{%k9oRxGi#BBOq*qMp_w( za{MET_>;$egK%4M4 z`j##}5t11253MFyrs|BUFZg|Y<1iL`6=E5aWRy^~aq|vpcHV6rYu)N^R9rpNhGd+8 z@!cgY1Dxe8xkZBcl+US5_WWL{;3{*+xtR1OTPRIx$iXFXs^IFGV`oKTOs90nWrBS| z1791uSM%enOpY~R(FN^&#`Ei!{cz0gI)S(%F|Um3TgO|7YL8;ltq37mvp7qdiG`Q{ zD_CpcS|5lvu;2R7roHXwo6d74i|ws(gK_TAQ03d`X%4w4hklL3J zC>DCRz<4M%FL!|vVIyWtqKh*QBH_944^;sHJVb=?K8W0x6==FlbPF}_aYp)jhrN=R z|96fc5b(%>Z~m?@coMMBkt~Sl5n9r^R=56xBT%d6YqRhVU-TWscr3%CJM$B*2HdDm zpH?JH>~v^4Es}Uk5J%4>%5BMs<$Z#K1{Jwtme`Ox)_<1mhNTS_B@UB}!AlCV z0&h9Rj98X~`8b@hm_V(N zN`a@4-Xjv#^bfY#6g_HoCSEZ;Je$?YhcruDS#1e=uj4K(i@Ph^jaOyLbbT@fZ2uyf zVpA%6A4RCN)T*ih?%ua;ms5qm?bqmdZ$!&*4&EekUGrP G*Z&52w6dB2 literal 0 HcmV?d00001 diff --git a/img/p/3/6/36-small.jpg b/img/p/3/6/36-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b52411168323215e59047b065d30987f0d04e722 GIT binary patch literal 1371 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox*TRjy=s9O*DiH)Yy5h0;YP>Q z@c63*$uqf1mRQ%V`LH0@?zPR0<*aA&X32R=z3%w>9OxbqL3FPffSth1$Y{?fk4FI$ zOo0K=M~uvjESya2P(Lv;F*C3T3JEJ32C@n$C^;53PTZ($q+;w8lz8zY)PrpHOsn(b zCttlJ-u&t25sk{0kKffd=D+@wal@^;^WKclPqwCSRoT35zk;88%ypNn3+DR9K~GI= zS0)^`smaPMJQ905xK7dH_odYf+bZg&Y?QxrAoy^7q1@!@or`5J?F-#@Ku9^Grg*h> z&f{#g#ZT;S?QeS*Fwu|w?qP-b?|SyiUJ^LX{60`8d*bWfFQK!uZQ5ftZTvlJ$*hNq z=E$CS^&>QXme{XvlMJsb*PAlzYR@CfXLEaJy?Q!%`K_iET#E~sHv)rCMF1F?z{Cy=5?JU6GAJ54CN5M6 zENm2*c<|x}Sd`l zOLUmzE)}f4Hfd7f6zOYwB#Rlg9ZcXms%Gio9npT+OX;L@>%rUxjbF1k_vJp061x}P zSH8uu_m!DkzVpl%dt(@nAGvaHsr^3pHG#J!G?+JD1iBZT^cg^25?J<63{?vX$3TI^LWM?n5DJ{rZ=JZ!G>Ea~_&vo#g-*izA1~vvDC>VD z{&4*d8;PQnpA()puKxD)bgNtQ)$4fyyPh8Ube)mK>cWfs?RTX1Oghx)yJud4*`(V~ zIl3B>q~Dp$;hS*5ux+K_>gD2JOh0f}G{-4-#O}Q(8NZZ|VHuaKi-6i1TZ{haT^(Fr zZry8b4+%erZ&Cne;jbrmdfHlPwYneAJ@mut!U^#r);AFm=1Xrc;p7#$^tWKsJ~^k! z5^GxnR-KVvyW-Zp?-u`-Tsb*e&7$2o_cfc9Wz!MUuKjc4kAG|zT-2t(*1*Yse18A` Fn*fQ+-uM6j literal 0 HcmV?d00001 diff --git a/img/p/3/6/36-thickbox.jpg b/img/p/3/6/36-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d18acc958d02fd3e70bf7ea14ad13048b94dc6b4 GIT binary patch literal 28777 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 literal 0 HcmV?d00001 diff --git a/img/p/3/6/36.jpg b/img/p/3/6/36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aaf80c7c155b4809495d9a8810778210cfca3098 GIT binary patch literal 27319 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 Ww$8)pYr?t51^zN^^Zx+ifB)I*b%j&_ literal 0 HcmV?d00001 diff --git a/img/p/3/7/37-home.jpg b/img/p/3/7/37-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..237df68c82781680b76bf3a2682c889727e36422 GIT binary patch literal 3026 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 literal 0 HcmV?d00001 diff --git a/img/p/3/7/37-large.jpg b/img/p/3/7/37-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7bb9f9b5b6e4abab6939382345672ce01b4c80b2 GIT binary patch literal 8818 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 a*g9J5ACeqW3Ww|&oCKT}xyR_wtN#bA-U(y? literal 0 HcmV?d00001 diff --git a/img/p/3/7/37-medium.jpg b/img/p/3/7/37-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77c82cc2dd04bbfdc306b0d82cce931e9cb7e3af GIT binary patch literal 1751 zcmb7EdpJ~S9RALki_460X3Q{AxvWYq8Ok(@Tw|%#kV~Q(w@PI*JSCfQE!B3R!IIpH zP@y#$_k=|gsk-}9X3eBb-~zW4Y3-tUNBi24CyYh_~v zAP4{meSoM3SO5$Riw7E5bl@a$I4l+?Eg^xIBuW#B1Ze_6hD1SRNMsU$fXE|cIVz1t zBg!h!<*9TEl|~hB0%6b`EKUlClcLHHWT^i;L^Xgc3D|&*fz$v@hA?DE^Z+P{sbU~8 z-^GxGaCi(>0$r3x=f7JJ10Yz`4Tu;Bzz7CGKX01WdEdR=T3nxXFo{&rK*jRhtOP;b ze!FV}Z9J_y>@;lQ1C^g$djk(O#P^~ToAWc}qE4{#yUSy=W&!rMom|UXqxPIX z)k+7Cb7awT)e!(;VRT>?IpJYcH%LVSP~@lxO`gF-SxBPXARH{r(s`8DP*4|(lPO7B zhI{;^uADM6#M92c(Y`%;zU;Yb1=H{M+T4RNfvfslqfG11E&sGz*RTI}_Fc(c>z9lp-; ztRtqmk8MBe&p%`33=6M-h{)KP4k$P&V)86G zK27OKtxiAZv6Koz$@|vJ#(KJU(suc7&t9#(qozSHx8wL3FFVC?FYHow`@GxXAwJt! zdqPN98jw|R_o0Kk;4{5zLI)=Ch6VG_PQIy9t4_=_-_Vu5RVR1c=R%@zF4d~9n>j@+ zG=3P}I9-&3B<;>GQe*nPtY@TgizoZ|4QiA3d&$8=hv{7+@aSXD$-SB($=Sx5ov~w? zM|CC@H_FdmpiDZbyBTU(RbIN5oQA5s0zpj%L*k3Os5Tj>>ZzD{*mJ`fu^Atb>Sv2q zG*O**+&HW+l(|g^kR5A!rWr-3no_Qy>--6hB6Yrh zYqTWy$B#2L$6oAD@r$eX9;pi^(sFXNo#&2xpx-bmi}sin0mdUrm~k*Eh5NR{lqOf2 zwhl*Xw0p;795#2Cc@sP&u=1+wEi{VY%Gez16b@?i8T~ovX+Yw;I+~5D@M>IA+Xy`m zvL7@ClC4wAyYB1Kx$1jU_5Js)u^w;cpZa29Q}jgy6pZy}%}q#3%I!c|q6P6RJCK7v z?N3)w&KNZm2#o_{)7Xx8`KQLvS{E)q5X*r~3D-|GhkR|;p4($|YgffoPRA6gnc{+( zzc;QM_eF*^YZF34o&Rn|Kb6JkX7~m#*5vLPzr|}$A6LcczN6FqlH^3 zdzj8b6IBgj1ROQiNPk?GcF(fwYyZWHrqLm|jRCjJ zJjn4eXl^9c1PE0Rg~H(<8ZUoZ!G0L-5GQFjIeIBKg=7hI1~>!3{@eaYUgM7mx4cTH zJdvo|p0R~DLCM#EQ=2&^yvFm^i696cUMn0qYx{I%9^_&eYNWMqOHu~WdY9n^DcijL zFK$GX8_oBgjp*qpT^08>K|pN{>ZI{P{LHCabNszxOtZk|x^t|Mr$-NZwr#tfTm==3 z4_B{$S3Hu)gkG?)45sH(wTiKRDq#lS;JANLQM@J_^|D z9CDXUxD$?1!4j!6iW_EXS2!O~NyNt<4Vs7~#i+sb^#x3Y!T39x*&7|Ke?{yOGb||S jFF6#_5LMmYK*mMpD`EX3H%-Ma_rBAMv-f^qE9&|Sf3%8s literal 0 HcmV?d00001 diff --git a/img/p/3/7/37-small.jpg b/img/p/3/7/37-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1db05633685c0d42c54d318748f224228eaa8e8f GIT binary patch literal 1091 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox>u_zWl+JQH-`E=UEctEjbf0hBJn2PnxUu$~_6Hm}Y%eU{$*fQ3?P;3u$5&%cx>R!%&_Yo` zbcZVlg6&~uWVB}#_|E`TBQ6N?ISLREQ~;}D0;y8o2~?y5ayb(-8w)#3A&|!)$igb5 zplIk=vPoD(X_A0bU}E9qgHV64*)y$iQ*BIbGn>$O?$DP>m7WtUc3g4TvBr$~w71OU zJF881GS$zPT<)!(xn?t~v7lh6!=vlEr>FCWrp}Yx%~~6G?8cd2k=4G6$xD{*F$($R zo7kr`l{=y|k4z_U`6=cspejMl}MFC*!F|shS!hFQQD5%JwVCXn8 zP$04K!$(+r*ejlW`79zuHob!7gg!sJ!~xZ$G+Bj^yB8TUJ}_6#K6G3?WUsxFvX(28 z^7d_9P6cKk4dyC0GVfvfSHRG$b}RNs)2kP6ZFZh2?6NO+T%1@TFgGP4{ra3~{c$Q? zcR%dg53~oIkidygU~|5X_9?Z`K=+9O;|1?ly=3CPG}jXOpGK?blQP}~U| zQ8tl{2da}70Hy;bVAg|2G@~GcBG9iOuNK06DsVEv(>x$+5qGEY-4CUXZe?j_7P1GJ za7c>&`(R@9y!ies34xTXrHT@hnH*fS?)tO6zb=p|?=kIyyTjhsn@{?>YA~`kGToHV zeNgkmB5bcUr^ckPvV;}UixT~#g=!1$Bt$NZ+Qq1q`RTQEn8B(o_JQ-_xKq|Sy834t UY!qAA?m6>UpGHpne*6D70lEz^S^xk5 literal 0 HcmV?d00001 diff --git a/img/p/3/7/37-thickbox.jpg b/img/p/3/7/37-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e378c3b5bd49f2e7dee0595b1f3580488723604f GIT binary patch literal 10475 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 literal 0 HcmV?d00001 diff --git a/img/p/3/7/37.jpg b/img/p/3/7/37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..262687ad67c7df3aba9f14ae569c9ca5c42c3211 GIT binary patch literal 7783 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 KkAR8Cx&H!y7-;eU literal 0 HcmV?d00001 diff --git a/img/p/3/8/38-home.jpg b/img/p/3/8/38-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..483ad0b83113539229b47794751effd438b9c00a GIT binary patch literal 3619 zcmb7GcRZEv`+v?f&cQkMjuNuRImjNFDUMQvvO}^*e8~Es>^+Ng2q81d2qEc{j2wFt znb})@k3RMLe*gVm_w%}**XzEX`+n~C`x^IkGI%lxV01LJH2??%03hH1PDTJV00xDg zKA^zC2SJWNz~Kl=GBPANni7phQKC>()U+5XYAiJhg<-^C>F6047|=9K%#8HRwDb)0 zr<*`v;2JoB0)e2Qr$SND|Ic#r9>9_VK|l};au$GMAuufDq!nO4Jt_|ns%(~ol`Ho8XO7OlU9(;LHTaIWkA9jT-{n^QGr4X< z{tRpQyy%S>5WT434udFN`4Cj3KE3`$Y|-ruu=?++{z$h(qTxKl8j{t=zYzb>^(y`^G-?W1l`qmh=HCB$tC zask!7``DJ473HNyCeN`tbvj2E=X!`j_^>05{}PFN#MVhuL&A}>K%mm6TD`9I$@S=3 z_g6-Us|9F%g}->q>;>apbFSE8AMn z%VLwWof+*$B<&HlGZg%vaPmgAtGCBfmXjwoLPyDzcz<-g-5x!zEfO$hUeGz9y&F@^ z)n=c5R=pxxEURt6eP>Q2*}C%HGYFY%N*W}MXddo7`~jBe5@;H6Moj{ z;{KO%E%<{FnSX~`*X9WTaxaPnATW?^a7T?w)$GtJ79;zG~YCO;juM|^V4DQ7CZGNw>2*w3EUbOl=*Z1D1Kbz?w@fsdcR z-IEXmrIS`WkYPTZm+gnwV*bYQv+6}kc~bx9mr)YQG&FNX&-+GL65ClVMskT8N%p%U z@!qw>&|9Y0N*Ic#JiNBY1k@s3E zb3CiC+RP2-GSADgucb*dn#2Y9Eg=f_ZEBH^QGqkt0U%!CQ@jua5`p-CyufL&fq2E~ z=(!~gTp1)z@rtPsEPkPdo}xVvkBJ-Yt}#Biv81Hq=NvV&;wT;yrjFS%;o zc|~#c$Xk?AL9i`Wr?6n$EaFEUh)Mx-iV8+XP7eR=N3goUuy9&#I(jj236%=O*>jQv zkKlM^1IwU<=J!3WZtmr(7FO0F&nthY7E%eiW$)-lVJ7cUaL=XH&{0*RhpCqPbvDoNvK|`J_a@6LLo)?cmc5W;+>P6BoA!0T=MzMU7fL`>*3%KJt353U1`nBxZzppnwi zRdIyfFWl%vlgP5#GzoN`g2x(Hbm!Pj{(Gge!BuMu99Mk65A72Ko2u8AuecCde1jTs z5Sh}1*oKy^1%4_)yYN6kcA9x9TA$_-H8Z7D%V)x99L$pxWVf=Z8V+^kDL9;!Z5X~x z*qJ#2()1%JJ0g8n)O(F4Ep|j$Pk`FW(m9>Hbl+tjp+Ei(&M}Bd4@4z zxIF=3B|q_z$yhY)P^99H_>P(NxYcrPhhO`Un-#OEhCAoL9P4H8kf6fy*7v(lmARG- zbJg!mnZLZ)@NzS3zWPzSB#PtkmF^Gmb*l4q%}sqBP?x>b6yVoP`_95$GRMOZuT;X4yQYfQv;boqCyYG8Ac4V z^82HRnM2Vt(bjICt{%3#j56_hr|pF$46ma@!@jYzg*BO7`^i9RoH8>xO2H~knLb$_ zH+lY*g?Fmu2`+hS0*pF-3|Nu>y_f&gZ7jeoewsQ#J+ARN80GSHuBo*@wOfh%@E&ga zeqildk`3$1H^L+hZm*@2xoFF;*QlTE5nr8tpiSQAh1ZrH^`aTBE)=v1g^TpU!hFLe z2B=TdvL%atZY!Z*iWe_3*qWZn)OqkW73UT0-K-2kXrBv4t}9n7=qyKui4-D*8jMGT*k8I?UBmA&uWQ>r zQ=vlDrMP!m77UiRdI$gkDF5v6>0G#@4itUVKS$kit%vN{I&Cl<{x$&5o2!B_wXLDQk8vLzKG@#7NfK#G9~1s(M>Z;8bf(QVM!RX& zy9lp!@ZPOB?>oCQUnprfv-+<~3!HW-$|pd)ZQ3lLX)s}#u0gc+4z0Jl+AAUh^?k?xm zyp0jyfYbi+T4;D6sop2S@>L1ujrVm$8^O6ACV!Ii5_izq@`6sApEBm*VGn0OH~nf# z02t^@%;u*qg%d!2vrFWiX#HlFe35w)s5b_TN4mhtXFhj8Ef>_~2Tm?6GoG4`5TM@t z$i53|FgWYbb98~b6T zB)LB;K@4B!*7pEq!pFCo`%Kzj9HqdKAxK*$ZrR&#vxMvgmr;e}syY_^UZ(Boo|hfJ zX%!J|-Ql{A(~TH3H#6*r?_umFLJ zTU^D$HNG4Z)I24Y^KYD=UKg0H6r1S;QunYTNfz})74cJ@+Em(px$kyT(cOO{_b%p= z)#u}rMr5a(H(GO7HgYIv@9NfMnDOrx$hmH`Zt+~t`UYr-43%1DhE;$53umN^+ilIM zuTTC&D{7TP(0Ove^DuqY*-z0*$=u0Ci$_|cqt~?Yr^qk`-!1eb0 zMv@G_%KquK$BO~GCn(rsL1DlA3pSU3Qq?sG%v7$P^5*{}D&}Xy2@t;Dpk~4r$BsNO zUKm8|b-)kZH(T6O;dAxhqrHB(#1Y*Kx^tcKGZE)?6CzcXMj8C9SlT!1xuco5{G}W-xdNVc_t$VuD-}+BSR_kD z;v~nRRX-(xwc7%(xU__rjHG*48+)_*{0GWT0VzI_M=eMfe3)GiHBGPpf4Xk7@t4wZaVoFi6v-o3w#-e{ zlCLt7yrgy$SyFE>h3t{vCiPPg(}prcyR-eHbl6AXaNj_G?!9I&Auh2vio@3FSwB_2 zzV^b1%PQ+V`E`<)=8&wD+VajoY;EE@fV;eH%%&&No-}Q>{ zMKZw8J;ai&tiDwHQ3L^ki`L&zpcZ1T(C##Gnt$$0}UAk9R(2)4F?S!6AK#~8wnK`4+jem0}C7LHxnQf1Op9* z2ZQ0UkP(rw{=d^pF9015$OvSF0#X1#=s+lR;7dP%7}7`(6cCaCe-kVmG#Ca72!e-H z6GF;=SO2YpJfXoLC>S8@%L)Jq3Q~y%g$C(r6WRYp@qc_pqP1}G96KTIOfjS@s8R4u z@N*y~8HT$eT{CNxt9ZxDt8|8)ZkqlF3!I!r{4V<5+TGVp>vedBzfw-=5bxL(qxa!= z6e9)0c%Pd4V*#B)nQTU4-&)mOXt{ttKv)q`mM36CMfMKd3!tl^WMpj3>gWEl9WTn~ z)LVwDn!c*qLpsH_($5a&h+soooN;lg?mti{F$fgUP?2E{ch#9hXq5P%k%G;WV9rW{(npSK_D`tnbB ztAoega<~i~CfQ3@7?Q?Rcg?6p-#g+9elFk3 zhKHWsTYU@HVj|X=#GmjBC|Pm~MEMt$pNo4RpglkGr1*YvwtnoF*f*L^`OJ#l*Ce>PwpK#SH0{w+&jldh2Qwq+@@AVL+$a|@)7Sx z4x8CO+g`fo;{5@{ebtpY4m5Y(5L|fPXyPEnANzJW!iRWs`27UUO8i zHVT}gV7`jH0p)n)6#sWFV4{-sy;S|b{?ymvusE^wI~CH)@vgjGICbhBehj|C-zOoiQVZr+~sk@&AdY>Ds$ZYRAlU9M?6heaswn*ClQ7ODx_w;)`&b zi6%^4wf2hRw#eCle*whYvr1(AZMGF1*K*;Pb3xkS-1FtOO!v2n;bIMHyq z$tb9(9Vj8H3{fTS0a;52+-#){&*T%K|Mcy!r zUmc@|zNxzK%wcYg4=UW;Y&x@56Cr5EMRO;p^&|aW;c>=?JOf!P&BCB8-n9Idw|l(? z8JXc^$-mHX`a&sG1KqG>X(SZMcZdphJ@q?vl8a83!Kq49DN-W99GDuN?3m9OH%E3v zLFya2rcV^$EdW8H-s!}kOa?l4H!Ssvj9gZLZ=9qkXJR&Nyh(&91M?cMwZ*7^u_jIIQ+s~N9s*7167*ay z)KVbUo*n6^LuP}zgBg1ls5ef9KZWPmX_Ke9EN8f=6WsYB zy4J2fR+DNqp&CEgdZfNI)B8Q}_?Aw*_*CJ3%|rRr+TxPVKhS2>!||0Vn)P*|vS9xE z{!)9Qux~26ibCN~X-4IydGrEyL^L-|9Cuh<-OYJ?Ez9tzgjU!s=nw5+Y?=$r^}-oi z+IN^RgP4fgBHE9?DVMRjdYXS2MaKw}y=tpGyG4n>_0FEN(=xY?T|1BR%-a&Tl~_^V z5)EM7&ra_3w^0{KeEkUGUCUK>s4PO6A{b@-wf@RQzOrnvee^P>>l7CYV%6ZEsuXTy zn9lLO?4sOTe9~|FnL&9A?(prgH+0ZlT*J9$bNZmT9a+uc@!X<(dSp@0{+Y5-?masf zxO^~Z-qb+d*g!qLhORcRaY<#Rl6K(>S*}quYj3>0x=>=nK?+XrPh>c?vftGZg2J-l+WdFLO*E=jFVALSr+ z-Jpr_y2VF&U#0sn|B1Dr7{bM7)rjc@KruH)o)EpP%kWOyHav>!RWlP2q(6{)Dyx~L zM7R-^pSfkxW*-m;))L7->L8Z8BvQJB)mQhu!vU~>r;bF5PPZohBwc`>sqgb%PfHexD0KC4cjm=-NPmnw^BFP9pGBFWHW_D?Rf z`Oiytp>)_<5*Km_qeI`4Ou}XvPbrA2w;J1_B2V>iAOOU50i$DJle4mMh^b;xuyd*zt2icN{>Sb>=tO{zW(`BIRkK_3gytCw zDZ;OHH1C*f)OW(MO6`*{FihW*udm|p6<|nVll$fmQZ%;77l0b;Vm zG3x@FB>5~jdvuN#-X9k#}}4InBd!!%bgTq zZ(EkU>ylFcAh1fZMP=GF+o=%pQ=2pH0bllH!>~v_;dePTJ{w{K-S+#){IdhWstgNv zjLG`{@WVJC|5V$BtN50%?R+~;lS%4`ooaQ$0iUNTY}#b7!2(B!X7!a@N;k*&qX z=NCYs|i)4>bcCJ1Dn!8)K+_ zkH&|jMF{|DK18$OcQHBS)ON{l`XrbA1GPSG2{V>m!g@!aV}}KUjUV1#H{e=AnP52h z3@i}7JAH#G%zy)974T5*6S%%j1U6P{Oj+_~G(-_ln2|a%!*eY|lnPX@oF});%pWi} zt?mAXEiC%OF%DFrNAG0S3^w?Qqs!{DGhV$lExN)cY!;9;DVy?}!Vf9dFZE*=u0sCS zZ}HZp%hwb=CVmyF65kf`!@pF?;JQl$_X}x=PD4TY@%+0QpkSb3|9X)BtOj%p4louu ztC%V#wzwJ^1sgl3ilgyAyAbI2YIrhp7-3l&bErGjjg7Znv-N(nZMxD-hn{dBVrscVP-dz1Cf1e(yh&=uw^Fbn?l`FM7Zgzg3p$ zxx#DrYcVR7G-Iauo;&Ml9L)RjgEGh zkS3UZ>aymLBmNe-?E7Xao@(h8QwQ}wJ_n2l#OIi)!bt<^BH1Mb9$@Q6Bjv1}<3igJ z91N5>$onVV=#gI4)IN@#h_G+G0J0tYCt7&+pVFXe?nK^oGdvqE>o|!1Lc+6&SZJyl zi#71oQHFoJ1VcZ|xd>yYWD<+Wonxef+G?qTT4!_1F ziicq1N3H~cMD@DJuuz;9n06-{O}ehjDOEQz0`@Zc0@fP)A*T*6)msuSPgg5JYMw&u z$e3cL^41JSMmw54*307TdfKAt)JB4Bov0v8?v9IUCDGQwf<$AR1C+FEx)8u7N#WAS z?%W?f&+Y&AjqvS|;Hl}Ws648=)AyDSBLnev#G;2{)p;(SXP#&de6ff^QCP%LvG@#& z7i%>J$-YDXwi%k;PM1=O^iZ+;-jkD<6`P;7h~{3!MbVYb%(ud2=1l*nsa|$X@Y7Z` zfv>zaH2ZXK01+2~mA?Gs=l4Nu%=A;1-`;I%)oiyKbnrgJ6STKAe!|F{ePa+*R?%VE zMoFFSrReCDR6sMzYp==uRm45T+;_A|_lR6whhg#}tHvNx00Q!YfIiM3j4!Q5gdvnS zrpm4*R%FYaew!_~%5hz=FG=3-IE73D7HI7_2bhCRTU5o?WuGE${+r(BxERs2NT zS~(gAm~B`>9U5zg#s+I6SbiaLlj7yFyyh{#Jzsd9Jdu9(24C-zY{hXz@f<2q<`rpf z$2EA8>(X^v!#1#|%6Mg!LD6wnr)2(%GmK>5rL-Gw`)Ov7EA%3)iT^Udmy&anAu~oW z%9@}zrOJ{@xRMz`j@28N+M@+znC8+oWEAN`3*2gEwY)hd_$5TRA!H0KWfy% z*&((NH`R9?k!`tOj>idq+;l?_Si zW2HMQ2g~KwXS)yLqbJhDspJWW~AtVZ#?OtR@%i#y1!=*FC z&qgkwh21m5(Obh>pR~(?#S>EM$2!*s*b#q5eZQW|H`>cCOD84>3%pLKKT{aRhoC(! zRKL!v&7MD-bjbfaY-qWt7^)cAWPtwItn_-qEiL<$MPSvy`*Zv4d(X3#t8Yd7-mfQa z(vk+A1`M*f-ATASt~~{*Q8(BB`+=OW5Ohn7Y+0u1tZhMhL-Z6aU?ZgZd_1Cv)fs#E z_B~n~<>8dCzuJGL(b~RuG@I^9II!+Rx#V3Tr47m%xt(;Qm=|a6kC)`7MYhi>PP5Y}Y%9SKT`tY5MX~(U9G|An zn$kVr#eVgSJ)t>Ew;e5=EVY29)5%Pe>;3qxKSJLuxz5)teS-NhT;bU}X>Maon85w{ zUa2EmuWOd@GmC-8Gc%WmD`ZT;nCn)UkC}IIBcCQVk@kI1uD??&=cjq;Y)T?m_2Rt% zii)f05~bJBo5`kY$0(J~)FZ#4Kit|HwEwos=SPft6bcFHWNrf`z)KkoC zYR%Js>Q)UU$_bXZY@hu6AJl-DDD>69l&+`D&g;wa9!t{~z_t#lNk%~I7eDJbK0-ok zeXX{L&*Q==EOilMmVP|eJ4CBIHG=-Q1nvCopD@Dbi+S9l%Es^gs*Wc~2L@|UYG^|8 z9w}=6>6C43P>m0ZB}oS3iJDh~_LBKYHI#_41Kk7opBo?YB$P3Nlo?fnMcz5k`9?Dk zc9=2r9Xg)s8k?g>5Myu4{0e^oyn^hY^k@JO5DEka{|>zUX9q3Kap>wXgh0?KRO%C- z6r*qg;)Ro96B=9}(Am*DI2|TQMLS|y9T^?aS!z%>C9k6l_qwDWMt2!`wi)9qc6*H< z8N4!V9HV!?QQvtL5;znKM1T2AuClcMD=-s|1;HSt5yW1PFr`9_Lc83 zEi{=hgvAwt=v<3PM8BVMP>8D8#|CNT^(ja8Q)2b30o3xssT z9U7V)NWb=HZSijYa2hHJC#3CXRPE#{aiyTCQU)#dy+bGzYY@9@l?RWLCFgn1cCb#iPNL= zkPDvb#4`l&JOSOwJ9$LhM@YO-CJ7izD;~CvAJo;iReHJigZkaV0j#W_YN6YA?c0H` z+Fa6lL^lwYzEzT067&ZgM6BN?H((TI&Irwgbo%3Ai=9|&y*dQju*2QGM^1{V9sE^2 zsCv^)u`~Yz8kb6Sbi~dee{EZ(K^4!U`eXR(HPKN;!Q1p~IdKFO3PKs(wU++u_EaPe zOe#9io5t37ayhVyD*_6LKj;n%j2(!tsScF7D0PP-vb8l9!#06lGMHMo7Pk`i?lt-z z!_0k&FC{9ENj^tP3y&FxlpsBI098oQP8k5i=HJ@Hg~3WzoeKt8uAyVJ2mPFXwLS2W zM=P{k3XNiJS-QK@7TH@kFGlYoyLX+E&e}_=p;+mgk*cT;wi{v@6t3Fz@>(or-Rg>s z0oJFTVmcfJoV;k<>RQKAVnDel!%gHh8$vR5DGO)VXY%NH&X^Q{YVCXk#Ug%I(KdUy z9qb;m2zmG5Rze*d7qrS0Kw_SrKB2MbW)z1#vGN6w$cChf0nll}A?O_^K%f<5QAaER zz2;&^gc&f8Pt31tIR!eefJc#xQ3_y~28o!?^l-VBno#&mG`dBF z1Z_|PmI=b@6yDDuA&=D{>`xgYr-8$8#QS_i`~eOU&@#>rj4Nx~dy!@$&9kGmCm%MnT(5 zbZHsdQffE-epXRzz+9xLjPrNOGf;?0#Z>F|tOjm5-#0IBd@oNV$4ofdFY#19(h)ZW zB>;LO$EaPnJ5Xd<>9fu|5Wxs%Y9@9c@;O*V&DV&(lv&a? zmQ2>DDcmRG0qr&vMnZ!xA$%kmO0bi6C?qMe4OuA^5BZ>my{{repa0kEHXG_~U-B#P zxSmm}yd-O#={j~W)75OW$FC{8aTzUy`EasZj8!kP!)9xgT967ME>iA;OupYCe$Ngg z0ZcC@jEA732`PatoEXq3C>ecO%!u3FJy_Bw{G*2G-PWtpG!*k4=$Hk9!N9ul;~5O5 zgjxpzIJKQ~kF6dpp;}xY)LA zboc1TyQ}nCbNmnO+;WU@3@bQ;k|>8=}(+$E=P2z=$Z6P<5;)pvTd`!!03=I{(X z;pPR1un9P?d|ui|nq-IHX_wg4>?ut##h)H9SLi^?s!1ei|Uo zchBHB%i^r%!6oa=pmyS{KpGkO#z7WbN;15I8t!mQz*S+p+TLN4fx}%EL8rb7%}FDY zR!&O;*Rk$Sy_Dc&J-|LJQuXgdK*Iq4{w07MnHgPk9s7T+704pYNpnh5Vp*Wyg9iugd#s;#n$}jxwnn= z7_ZjQb5>|H8`S}c)?Pcfr!Mmgn^+~v1^o+v6+1X(x{5<4a?CeUslsBUS`tc5#jwHmvgua= zoW9Q38}Uer8s9&^03hQ|iw1G|Kp;o}<*y0=e>;C-s-nM#y)N$@t;b>dg6v<{5A6jI zX|C7m=l|>ZD)j{rjH(H;);O=yP}`*(nowqa&faP(FWTaKLbWBQXj|n-KwO~kedciO z-P`d=Z_2{4&>BS5kck{YWau`2HdUw93gIU9D#94))C1SfqD$4y9QkfuNzw{kZ9`E_ z=bj@Gn_!7i6I<;~`p`>HmoA%DDd1GiiySQCgZCo@9zA-un6v%58oqO#Y{X6THC{z+ zB+L~Z8&23$kks6ZF!LX1lN*J-;Waz*uBHvKG8?hapeZEb)p{ zEycI0-Z>r|<#$pn0s;_z40Kcz*Gq18i&?Jwn1u&hu@|WZ@z0B&w4&T@S*%~boB4X@ z-PiquLKdOw_WnG0@W*GE5Lg!p`b29D!Tysc<3_oL6Pb|WFFON0aOF7eLq5NTH9=04 z3UnmG;^X>#p%SJc9k;y0K&n;}?{?R)#l3qYm^0xjT64Fn^Z+a-8-lhOZAlq97q(-a zzD*-z0;t+=fc;hZoV;Np2cIEUEj zv}DQ9ey1p3GV_XTla(qYfScN6)_wA2oz&nfiYOH{&ZWW?{32emO;oYVB@XJRUuGXx z2|-0rU(LaLOok;}?AW>d0i!CB$UD9GwtQYw20+nip?~ldJwY0Nv0=To9QW;xH(?if zbsa;;^Jnia|9OFJBI&FGYT}=IpFY+l*xhDw0jO}=9|p%6m};Zo0>gW4Dhp~i7xNyz zW^Yg|#iktiDQ-q(NJvEkqa?MVJrNup2!Sxy9&6LY*w&9GZs(oeTCW*x=yhgMMX9w{4~(=9Z&< z2WXva10w50`M;l;hZ#unuKKx+iB}BOZa*yV)`jrgkiG3ZU?6eeBk^QKB-rY zk~sN-FvxcdInZW+sUzj?uxYfmKX5KT8pd$UE7_4Z3Um`U56Tnn(XID%vU2GJYqzum zSvwl+B1-|mpEGG;H2pqNh_(aYXEIcpRmyILt#*F>QHdOv5Ed?jY18c-$;QY_kc$xH z%wrpd*%70l6`u6|hmtTCAVCx($RzL1O8?FDe*A*f(V|$POF9M$hdHf>3T7eG$mbih zMp@yQ+I29oFQ+wvT6r?>fyv5D1M`B@G(r;}TX6lya&;4#l(=h$AtY;6b$T1-T*;5- zjse4Ba*B2Pndow~vCDaj!KzY?s3hQE4d>-O+ChOTyJlA9H|?Tf8;)|OdB_CR%xw>E zqiCPIH7N_@_t09@XYigGo=o&qd!RnQu_8^FQhGfC*2^s6pb9nel=WA2>P zYGT!i0RrMkOyhmDU6xIKn8c9rOLH?hbwWIF9K@Xi2oWOUMk+3j>2f&*rW0Z4ZyO{= zip}f#VZ~kQ7sG36N8KDk;IKE)Ud_f-PQ}9~*dpuaZ)ik*kE4hnn{Qm@zPahh9bSp( zW)FC0%ib$Vz!J{k7_FrqII_+iJ_Q;k^6?vAlIE49@-=MF?qY5L{=~EH*kUkIAZ9&S z+6}mRm7F^btxfuk-QM z3D!mkD34aD^Wyl&yx+w>pL+-rV%0VF9{|semcTKn`YygvoAuovozQj?hXHv@ zUNs7tnWqsb!cbkjEz)_yfQl2;_Wt&scA4&)Vv9ip|8bE)S$d~0OR=901Kx0W-BK$X zw*>sUJ?5*J!1J)^$G!LQY8tfTWpgmZW9QXlqIYYVspzJ))sxmg;PeQ*&4v?u72at{ zxqcp!(QMZE4t`^5M>o`BDIgEX9Q)HYv^J+*#diqr4b~^`{VKQ1WuvnF71Dy^)%Hgs z9U+~CnZTZ|O0iAv;n0IG2El~FZz=lyi9`>evR(iREKXtYpBs^!MWyEWR%S`UBp5cF zIuiP4cPGf9r6Xn3!&l!P4|4apdTR;=S3Z8&x^`cf(VY%+**!CY<~|Pf@M1tAn;_J_mne4G9y z+B)eGQa>_T`CfP5^C{5~OC)PrT_;r3sZ8UPNOPg_(D(-ZZUWeo9rM7Za`1i#8h24o zP@Xl?Hpe9HL%1)qRZbWd+C=+!gX6OLU~_cmeH)|Xki+){E~KLB5ntuuerVIBel+6M zw~reSLue(nv_3+24;&#>7il^ocsU7yYuY}b3oX+a0>|LAbsbV#E!6vIJo;E>n&i`k_l_E$7vQ{jY>8 zE*zubg0yvglgyc+Rb2@&cap%{X*@2|SEVAIpw@BE)Ud!Q(O>Jwv74RsqcxkX23XxX z)RD;OyjE7*@ZKRAD_gL2C9dsiZnk~_53JLeID>sb2Ju-ac`91VO5brS(IUifE;Jf8 zCVkR@rB}W>_G6>f7keznLlyOwyDZ&3R@t5l!pefi!|1)KCL*u}7mj;u>(6>i-&){H zNj^8RcgbI<3_{hr@F=Zthf`T~Gx z&byrf5Ci}az5wZSU>ATyAY=nJ6g<%KXfz6iR+N*&$SWx-DPa|{SY;JFq^yEd!D1mI zgi}=`5C}>eNE?Z28}VucHQ7f%B)kTNRzRZ_)ReKxYX7%M?*TY@zzuLig4zHA2O@Ex z^gggjhKiKoel>XzBZo%9K9bDyb$a~)1v`cSC3qSEAt5-%+jdm`kIcy$$<#z@=%ZfR zt7c{;!nc@ttY^yR4Oe)l=+bEMkb+(u#tyd_x7GT)iN!fHS5nF0-MvYjxyfWyKkY|z z|AoCv^}Vi>ox8` zMFea9>XuP4PgVQfUJSB z{oD6*uD_ZmmYemY;%)TxxMV_>k@wp{4bPZaT@LqvVk%XC)IK9nkeJ>y<;_ILCZ-ou z(=SJ!ba7G_?_Cf+ga<}nEIw`v2V{r?Km-zlMt_wVeg#l?G#n0vs>W)0IY-c;Gk8zd z!-9{=7QB>gl;pVOtrwN%@-84S$Ze;RvP3&qPO$Mr^Fv{Rr>EmD3#7+Z{IjizoBaN2 z|E-hfbGTA6tLw98CKEDmUy8hiFM3LtoLlEZ$oS|k&my#wkX4qe z7fa9yeUX7T?!Q~>H1G{n7xAhXp`pfQx=e%bH(1PfGK}7LW%x63l_ZOmK2Aqc_WA14 zqt6#j7YXdNta|pbz7$q*nyI&Fdv&X*G&@N5(P@~*0!{%0Ttx~Pxi6Wyt{4tarchN) z>Dp%Y4Bt~#cb=ftSTV8JOdQ<(*t}a`k^*CkSUpsK)@Lv}y~5^iYv0ib1#5!NQ&WM~ zzyjAG@KR^3L*{4FL<$oqAnaVK89r&zVsGbRqI^^}GH}^bv-`j_E^CslKEpv}kU<}d zI?!A`^m6z31WspF?_mR5G8P@yTiP<7bu`>z7OpUTHmnSsXs0X)@;2_?_VA zq&?KK!qe8?X2~BlItaAgpM)s$>AOL8H3d10{$r-@ZF%JTqUT+Rg}Awpv75_Q+~}ue z=c@{rQ?rSjQsJ3u4+(ce#e>q5`>c9>eliTTGSGOk@`&y7&P3d~eQ180(~)owIape4 z2(D@nh4|JDKmbP}Q|;+2US7)_#Q1M**-}2|4qvC)_a|&jR94=|82fWD4XGDlK#w*O zScBbFRJ$FwDCSo=t&wls8?dFc@Pspc;}$k&M2U4r<$hn?BAQn@H)(tzj_*Hp=#@#F ze@>1gP)EM2H7N#pSHmWT4cZf8uPjCM-+Q`nZF1MC>Sqt)2O2&?WKpoAqCqy==W^yy zSb4oIYis%|J^Pi*!c159n<}+oo?_-*KXYnP;ozRv$$xeKnkejP(G1?jcKy7Q8+7t8 zF+Z2aq>=Iqoi3~{unrD`F=eqAZD%hw&6@m@z8J^|X3DB;y|n>IIJcnr>TJow!T!g_ zAEkiRY;D8*T$BWsiHw8W%m1nbfH;6cr9<`%Rt&FYT_jnhLb*o`+XhVP7=5=xn$E9t;1`;JZvJ*#6m_OlPooP+ry7Oo60; zel*F6Jsrg!j|%hJAXs9K@pf$*QTdoyqXJqVaM@h&+HLiU6e#WWpzAqqO)D;zbnHHE zdC=gGvdxuknfLmlwT|)62xepGmFFr$!?`9jcDzpi#iO_=`V->-<0Fd#+6>Rh(@__w znP`^RcjoM@tXsLlp?j^YtVwKEZ*y*38u@$r(+?*Cc<1)zEF@Lj0^=!LKQ(0gYVM&y8Bo>!pNgV_gpZt8_?oBywzIzp5l= KzqjR_bnrhn+Dsh) literal 0 HcmV?d00001 diff --git a/img/p/3/8/38-small.jpg b/img/p/3/8/38-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fcb9363326d9122e835462f8b5ce24eb0fc60403 GIT binary patch literal 1269 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 OAS3ngLCf@U?tcKB5kk-a literal 0 HcmV?d00001 diff --git a/img/p/3/8/38.jpg b/img/p/3/8/38.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ae301a6c501ec936e3e1a87273b72dd882f3248 GIT binary patch literal 9207 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 PP<9=l?j-zQ=hFWJ{D%bA literal 0 HcmV?d00001 diff --git a/img/p/3/9/39-home.jpg b/img/p/3/9/39-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d01d08f4842b806ccc158ce7e86114253e6e219c GIT binary patch literal 3349 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 literal 0 HcmV?d00001 diff --git a/img/p/3/9/39-large.jpg b/img/p/3/9/39-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..097af0de721d941b4377b959ecdc7c79c964d0fe GIT binary patch literal 9503 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 literal 0 HcmV?d00001 diff --git a/img/p/3/9/39-medium.jpg b/img/p/3/9/39-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9855ef8cec98a39513da32038a863f36ad8b92c GIT binary patch literal 1999 zcmb7Ec~ld567J5ynS{>4A;=K|4hjr3atxw`B*-Y2Tp|MqqH^dHH3$K5Q3Hq^BN$~+ zgh7rtJBSM54kB_YgM@pU0aySUg_0k{Fv!6wVX+ttRz*=!K?$dV!>OvMs^SSG2u~mqR8=7j zh)AZWtE=PGG_^D+S|o}(MIHo1BX=-ZWh_>if>*^;{%@1D14Jdj3-CgNh5(8PqKTla z6WEG?M4>@B-c3_f0G+;Hr`mo1Ipe2I5gse&=68*oq?9!=G#!f!@H}Ovs12ykwaxWRjh&N(dj@28%)NCx>@*|;5I{x{0Af%e8v9?o z7!(?-02%;_L=r^NpxIg?*p!fRKrCv#-nuCI?d=nl*fvom(M(sL^M+;r+#CFU(5;e+ znSAQQG2PRYJHD=J{@!X|X5h?fC_gkyn6k$tlyK*#W4R{`jm;ki(bBHhkm`3V za3W-P!m8sy+55*SVpyy7J#5sQ@NQsIP|3egn;Vn<{#4BK7i#xbTZZVrqb=w0I@a@| zLo&cy5cg7KF@E$|{=bqI80Ve^@=Y?z%tE8L`}COKWCWnV{oqQx)i_wI6b8&vib`_8Q+6RX(HtvxlQW`2sgh zuy4<36#tisUw58PJF-&o@3UgZ_Q?YMxs*$THa_O6qMpn6s-S?9U7PI+$)@x#ek{gt0uOj=|BEiy49 z{k%(EA5EvAOV@waxhW%N#qUWrZRFHlgg#>kQ8yYR7tbbrM1bmT05jO!lCU<2XDRr* zv&e6B>e>UpK^cI(^9Zl(vTpH&|Sn2oO3Eb_LnC<%Tk~{l|$7-GM5L24J$cR+??V|q;!bpegGe_d^!yQ4Xeuw;l#6NmvZn;ao~iU>e( zSR2)V%^l-h?{%^)WA{Bty5W_pHgv%3r%^)8ysCb&>>Z-AAYPJh4 z8GYsMbR)To+q8AIGLY=;^b|h4pgkScjcv5M_VF7deQS58V!TxMBj+*u+w@$bf2y$8 zLg&@fajh%AZeg(;g&%nO;X^$aqo#`UVD92S)QeU6Q;r3yg47K{yH*QTzL1TY`f$qGv4EEXQHGw%kSZ@pa8^GN_J z1?X7Qlp~`h7^S>-VP$0N0oQU+HDQ-pL6jj=bNGY#?xG9p?&!d#1!zIoDs|!<_cvDy z{rzmKd9+6Py@tqw-pf*#0$shtZckob28v-%Z+u6$WR|%-o6fTJ(r z##@uU3H=%hKXvwM=gHeMB~%+0Q{6hF=z s-TSgR%Rk9IVp*CqJB-Ik7yAKwJ-BO`W^%usRJXUS7jsr0aa1_4FCWD literal 0 HcmV?d00001 diff --git a/img/p/3/9/39-small.jpg b/img/p/3/9/39-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ea3d1ca8c5f9d49e3d72c780d2136e147278714 GIT binary patch literal 1208 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox89zC%!_LL9trgMsy)h4 zm213U2{ckpfPo1Z5=a)ZurjkT2`~zqGKc`pK6`f#$IwdjjNcK|^Lm$Aw_)fKIVzEH!;Q*DPz&R?b-a(Sl={?cJneS+ zUGujqh9=%pM;h4z_iCL~Z&B!fCU8KmGI-PP1%J2lY}YAPc(VA?j%?+uF5guD2W9ak z^4k`6J=eI%!zLdXW2zM6D!0MjdE?{4DTPb=vktWXGMT)@Vyew-dwHNA6a_$m35q_r z9~cA`4FeTEIBpb}`0*et{_GVy4;!+G{&T2fbuT<}|9F7+b;-_fCD(%<6)z%Lb9a>f z_WGx{FoQqfSm-yi9c8~Av(~A^PZhSk+@8JVPo=^v{*_ZxE$fY2{V#9nQqgoP`OG~v z^|4pS&r5&)GXU)Xr#%K{pc@2U)Z4P3p7$B(HaT!a1A`O}7=iJnXy_Q2SO|$NP)rL1 z%nB9WzJA)>m<@autiP?13a>==Q@g%9BYC2-={ zQR8XCL31`ncLoV{ZB#b%IrZD;-hp*znVk0=Hwu}=b8F_~bZ&{1vWd0!do#9a$v*!a z*uc}z+CR-v?xp(qUL|LzCPM~R?S_+wenq+W lv^v&02$w!H;SB%lxJtGwA<&9h{iWXN>>= literal 0 HcmV?d00001 diff --git a/img/p/3/9/39-thickbox.jpg b/img/p/3/9/39-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..782173a2626bf808fa7f1ace75f546147df4dd6d GIT binary patch literal 11099 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 ZT3?&xd6y~%UQ5mP?R7sn1gd#I|34_PjOG9U literal 0 HcmV?d00001 diff --git a/img/p/3/9/39.jpg b/img/p/3/9/39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..743b8289a618d2d4d9c52bcc15c4a189a7195030 GIT binary patch literal 8425 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 w#r=cJA+=$NcYrMi_@% literal 0 HcmV?d00001 diff --git a/img/p/4/0/40-home.jpg b/img/p/4/0/40-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82945fe26b42739fdf5ee66d3865231b15b7774e GIT binary patch literal 3886 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 literal 0 HcmV?d00001 diff --git a/img/p/4/0/40-large.jpg b/img/p/4/0/40-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e85cebc56176234a2d03d4a63f9ce8639a21dd42 GIT binary patch literal 11322 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 UU%3DG&F_Eo)&I*>hfzlV4Ue^_6#xJL literal 0 HcmV?d00001 diff --git a/img/p/4/0/40-medium.jpg b/img/p/4/0/40-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb3762ea12f6b0af16a618d5731ab8b3950cb13c GIT binary patch literal 2324 zcmbV~cU03^7RP^S1VS-^0LmVU6d?oBtH4A-K)^woB1N*&0%icE1c*cwP>~#^3M&FBI;@DDrrPVhJ@jj>>ccs9Gq?Jl!(Uq z7%in6(N}*CiHcLQR5H^=@EL$L00Dy!Lm;RiV8SpM6beJY;X=Y<2r)5Hgs7;vgd|d2 z0wp0Tij+a3q|nmR(qczskIJBrN}{FFhnIjLf-_K<2n;5I78eyq|IgyT0#L$$GvEvX zDFa{>2!aCf`v64&BnSK-Px(E4{Wo(Zd1)%8fb4l`8^{2~%X5HhkykIAW>P}jixU}$7)Vrq8E`mBwu z-8p*)H}{K|JT7~B`3D3B;e$i2MMgyvV`Ae-Ny&Hb-A{RtnwgdTI4AcXPx4BhmzI@R z{8IU%zM-+Hx#ic^wq9D_>o;%v2L?yzqaS}C8=v?zJ2(I3>%!vF@;BDT=GOKOdv}j> z$OQr*e_{#hpJ4yNg%WUqp->1Ee#iv^#|RRFg2ImL2}z!DfnU8LrL2EP7;TmDtgc5y z#lV#*?H4hOkWn?9Rbw5Z{XzEMfhGQ5Wd8#DH`gaX3<4579s~tofql1+I@Y}&?0hQa$6XydPaQqIbvy%_- zUuOR!=|bjG|Wp&9k=^=BaEKCDUyrXj8mvkGH{y6p%f zuja}q6&QOpe5gEq*t{Zey6!E7re*jX&1ma-F+^-`Uz^k@N!@Zn9!`P!0Y@<@nwVy~ zSQ1wv)gKqzpZIF3f?Tdh8|=2N+H{+rDrv*<&_}#7<_ts(F)9=7!3**xm20o41w$Bj zs+D1-=0I~MA81h}E1b>hYu~|fd@cmg;|Ww>tG4VE75Z4nl$X_Na>hoj>AdO&-1pSj zc{W?Np;5*6C(Nj3T&~RKWVmX2aU9vqcabhl^NAhwCf58c+9o0OTL5>Ccrlf{ANL!>b+(?yYEw@%$n=`u)hhiPLB^D(gH^A-)jqZ`wC2WS&~Qj>$hu5I zuXQP{lHz|&dDAmDm|z~iQ5yYveTi{rmfu$E2~81HE0YRifuwqp%u% zCfTAzicx?2CTjumsGyUyO?4ek2$;T4Y8k-KxOb*UToNkiSJ)-pYT&BHn~$7!>;{)* zCkJS)T~AJXMq(qn}Y{av&R?ri*w ziwzp^=q-|pH&drzf5xJg^;*-`3_S0rN4v{7H=x!V<+wFn>a3vl(AjAQ&bPhehJ2Mh z0s6=Z{6I_jbmTagrcO6vb+|Y^^f5xjrrr6Ncq?y`Q=?Ge5WV7*)>k<=)pnV!gCra% z?&69kmIs3ROy6J1StJ)kEC#% zxk*c#y}(fE<#^Ynd%ufC4PCPKH^=Z&sBKkq2@(V%hYzeZ%~nxtCB1Fg&MHaiJ%)SP z`RoCB9@npJ*SA3K^0iSW9{^Vwb{f_dAwN_*Y~j7grQw*$Qc{YY|zdiT#;g< zzU+RvMS$fhAJ}??*oRZKS>dZIGwa7<>$!biceAT2r{Zo!RYod*pO7nIO27w;qo~<) zJ~dt8cQ{@0W!eGT4E)L@$Kt;3^Blj=q=BZO#% zu4P@;&QqqN;`$UHSVnJiWPNe7*om>8LUGo``zcXtW_0&@?W<3|2ZXlI2Qw1Kv6{7C xVyMp4w%M08%`SI1O~m}xr}SYG@kfsz-(!Me%Y0KqJWrBwdxyW&J${xy@lPdwOmYAK literal 0 HcmV?d00001 diff --git a/img/p/4/0/40-small.jpg b/img/p/4/0/40-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..daab5386374ef63e1b720e5c85a6d84c8f0fbb9a GIT binary patch literal 1426 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%mqC}AQHg;`kdaxC@&6G9d7vj*8Nq-73K*GyZe(NU;N;>4 zD%dK(z{JSR%*4VBay3wOEl{3;MUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_ zYU1P)6PJ*bQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136 ztZHs)ZENr7?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;G&P778mFHFAhJO8|4yn?`p6*j8(6xhFC_~Ti|Wl#0D znIC4VPOj$4}p$bKkgr%Hd}ct0pg7S~9yo;;p{N&r12wj#HTzmIwKr zJNdTu+T35pZ*FNU+IQy1gY}Gm_qMcubN(^)soSN~-z2uVHB3wX*0F&>_H6anO7^$e z{~1)6kL>??>G*#J?}T+cwf?EiYlE(DN%{BW+#Md=n4GDbQ6&^QVk@?;A({+BD=u*F_SpuG?xIFznwHx~uyWNWU-F30oD>VF? zs_JR8^(>3^Lf6jyB_9*$D*E01xnrE;@2LL_CmBAP|1H_{pW)IC?dz}AkH(2zw#i&@ z=f$nFtM0wL&dRgFSU@^^^?HTo!&>tX?fAGQwe!%`g|bh@rk^z_eW-okn<;*|i_x-V7diqhlwg1(e$AYIWvfVa#=NOu|e2$EO=d+a=aW-2&&VOtF;ghV{ zo!gmJ^|zB6BNAtu1vecjdlgJ!0W$e k^~|U9&J`||nqD}mE4S$Q%Tw{0OHl0||bIY?9yl^j|{Ktw=6Xe5e=2na~d-2wuV1tdz4oP;JyPLgvD z0uq{>yNON5+kW5wpYxCNbnks}oH4%Y+Wk^hyY|{O*P3h1y$REVMd0EiRdrQ>gaiOc zh(CaU2jrD?RPH^~){*0}dUf6Aouw6zo5YQqJi@Nd*7jCB>W|cT9z9V}<8hO^C320& z(bfE|wTmZ@B9H7%D#9$F43M5X_xmIsWW~R5UcyRMgb8beAsD z(lO9cQ(t7c$iT?N%*;$ff0>nqiS-f_Gt=)*NJxp#kdaf8lT$L$Qqwa1KOck^fZ@V9 zgL4L?Bz(X*1`<*R5<)w`O*E36bp=NX@xQ}8)5-SUghxWIqEtd&`31R-$yrISA;70YE-wkuZ!g@i>! z??_5X%gD+pKTuIsd#L_M_nDqP*x3A2|)U{S;YUp4f`KvJJSiKSzuf`cP+`mNAe|oO9oOOT8hQM3M1=`>`iB}g6f&94S~cVkqWvbh zK;LGixZ7Do8%8~DbvKIR+e50hl&?73ne9~=O1N~WWtSV@DQ4dY8Xq!!ZKdN<>MBI> zI(lPuIO4I1jHZc{$4M&YrOzWIXO{TP+v5I@VAs@KHs{V~6jZF3 zy2Qt%t4}r@qrQ;&?(2vhV3toqT)TZNml_$hC-y35t&5{iT5qe;M2Tg%&GsxkqlpdY za4m^y1JNm{G(K*UKTJ%Cw+)N`b(V~}rlj#@?GA59kYtC3k&SPp`0c)%k~zWX%-G0; zVVqedst;Zu(X3FROedRjJsTaQ&(CJ_(5kT3@c$ZID67i(FY?7d#z zStkITIRqf^3!E|PXl)&z)I|W=r+y?fllnNCJ729l1#8^$AL8m!2ZZ0IYth*-qi(~` z%&X%SwVvy&F*q{ZU-yD~kjyU3R~ySGIUG+~;);m_{QAsyZh@)cek}pe!ai2Vv1G== zr#_BAmk%8YK#2yP8Igw-fwJCF=V`8av*5-`2@2*7Ub}z}*JoOwKNfi+f#gszAg#H) zp6iHyrV;Ec{aqH&-ReNTm|FC8g^SPX!c`*&?e=y!N+8d_ zwNh;Ri|x?=%!A)3Kw2zD1u1}wuQqt4WyU7OPf&FoXbV^Xv5^#5`R9bYD+M$;W+SiH2VfEUB@PO`GL0MrtonCCZ1P1mXH(g5(`W0#UNiY*0w3Z zq#DdY*%|!=K-Ig7>8Y8AkHH^vxjr+*Q-?F&88uwEeluFo3mxBNNC5o9pgpvs&>i#d z1YqR$RO}aPzoHGVBs0vexb6Y{vTL2G&ufHUMFpQG?YGCe`R7+#yP73Wm0~fxD6L+d zf)Z3n=LLf9EA@y}X~4-el~h}t z)S%mDlxCMhvw~Vi+a}(vh1H%=(*_lUbd1Bazr<~LoTOuJdAw$BnUpLCR+6%o2>?g& zL#P!uy$WBQ?Ufn1o0jHxUKDTyoGPmLlAlk_p0zcC72DaB@Qi783{>*;&^TM(C6NYH z$5OwZ=JrWNIKVX}cXz*)TodQ}Fj$_~L(0M%S|IcqprBBMUa1P{=V$L@oLoR?nOXS9 zp5DaW@c4uhw{L~QOOT+xsCu8~on@5VxuPjdX3LALTMK;kMLSvPIU6rs6~H($VKPB^1z1C|urP9t2Jt|1xX@9_v~ ze4L|Q4MXUX#tTImwt_0Gf*I~d7(HiY?TNpk2nyIVyWh(E0X)-FR#{eGL*qX>3BSwh z(aj#ZT9%UHml7TwDf)1y5_RnRNKsT#X=_RF9tU^`6V0_SZ#SgF9a-D;DE-@-_}ja< zcq#(WqGVf-OS_XD*(=ka4S&O5{&~Rmib?LYfY8;EM=zvQ)w%p@q1@QZvHFO~B3uEI zx-+@Bfu;NxwZ^Y|R|8WSlH6%im7b2xfhUU0mwK){(C)`xG|}x1G5`GemBhNOEE_}o zuh>Y%?QRI4l#2uNYZ)HU%f|Ea&WTf}+7a1|(c#X?2SsbL5m!DhOy2mSfmEcDQJ{UJ z=}mnnZGAoO$LocqVwE!gAAEN=PmQqJ>t-cprKi~BAwTHfo@f@`e4!TcJ>w{h0Nk^| zIpcymL6%V@1Yn9i9VeRHR8K(w_#4zv&@;xi4g%1f9E@sK_0AzW=u4kZf6hUnh^P0` z{pz&Y2ta7iECF~hWTpe|OGiBAP4}C5a*QOe#)qaggfHNJRA+2iLiZ~hwYwd{=X_ic zf~q&;)6vh4(K!wSeak$13d{4&VoGiaf zyWMF0q;3BTigdoVgAFE#HZXz=t)JzrSg+~TT$k37wER7hw)Jshj{wIWKpMolZ&DJS zPXKJJ;x=apmXM@!MNkP@~*|E0&(52xfH!eTAK+6?D>OU$mG_k28-McXWuku z$&PNeo3nxk0pFL0z3Ccl4YxMm7F*SRvgC=#G2a3PT+^sH~Rx2b=!Ouq(nW|VN?cT72 z%ammOTuWDZyEy3{exM)%r%68xGC2|=I}_hVfvZppCtyTV@zQ|$ouKCOai8zr)?8@y zi;vFhzH{>S>y~9(3`MZx?we>Y74OdN38dN4S;e)qSYhPtm$%dN;I^?+z4Kqs~>g2qv9*J$73ga1R&NBA%uHZLjXn#iVnn==#?&y zD@t6(`%j>^F$~b2Vh?(JjWKld*~CdA=#1;7BIt~9*%5jmn1L4`Nn2H60#Bz4Fg;ZP z{zPLwIK?t4SS<#{5&#QY7||J;GGK|I#fF4)l#`-s9xRc+ZUae@7olDr2uXs&`d zJ9)5ie}yrZfEc|gBu}L60d~?j@iAF*Jvu#Wb#QtIj7nH>G^4{xLzg)%O^xn(zwy&I z;7>U#O9)k^i3Z#Ouq=?C@ZJF4nA_G;?$M-sVs~Zg$vDfFda7h1dv7Gq&5!GB8+1&& z0*Bq_8{8MuV)Li5&k z7|MRiAWft9+Q%vuqM!yN*Q;zDs7c|0LRvMkkG>m}ShT)6Buk_ztq`N#9+Sbd{8;Mw z;aH$`;suHxh%6RmTE5Eu>kJ|k)8~Ch?)v_W>;A==Z7)^S{tisCR?lu75T)$~^OhUj zT46R`JP?bjtBTboCV?~Rob7_Na_Fm(yAx|9I!~nINYwY^SX()@g=QKYzFA8(aWy9B zA-3t67lcmi(_FPhJ+E3RCp~RF%ZhlO7;|2R!-{#uRIoa-t<`X#Ql%mP&X>ek?@RAW zZ?42RIZkaFI9`9Fn#&crp9Io;+H~H&Gdoad7Z=ArIO8zGhU7!Tj;v}% zRG3eMddQic-u)xZr;PxRQxkv~{v7Bu=)EDLB+FXSQglxjY> zC=S}Ja}459k`gA?I{S-}w-a|zibNMRZB{#`|Hv|#Ts4uJ8qrzc=pddTR&?!M*0KN_ zYfAK-uu|MvEpjOdB89ry*(r@tEScntnt9a1z<<!;jrZ2+6USS|G$$`eX!c2p--aR29R`!0|phdqP`$Xm?w;8+cD%;Hb z(rY40`;wljPNDbL6>ciHa%x)7ZX`@;G1JyMixH=WTLQOwe-~?9G7Pc*kYXiy@~nKu zz~JD?sA9Ndjg3rCVH~@Tp@~wE$`9+A;1D0>{5KL2@+u8AG4c-sLm&9WRz{ck%}CSG zQE2@l20^TV+-mWT;C0P?4UPusXrY9PDNzzrUwNE};TR=Z(82IonLx&apFeBg&v+~a zIkgEaZ$3XQm5lnh$8$?XCX`-$(65?*X^<){n_CzCOs}^zj=4}*vnelws`#f+`Sxl? zffB6HwAS-jHe(1|R?+@OhEuK#9eZ@HjsO5yUBrCsQoSZ=m*c|EU)H0&Cry0iw;2VT z)ElR0Jk9hI=KTGc!;_kXUJs7l4lQ?}9IuJjpc?z72$HMK4KgD3-=tiUH= zxj=N`wCAWeBi=k;?1_Kaf!cKsWk#+?&0^LshuZf!J#0IwSx&g9rt3j69XYVHxp|X7?@U)txw9P zw8r0!=4dae@57W=#RD{=sJ8ey;MZd05EE!5h7sCRLZsEkJw`K1 z!B0JIdfl@nR)e>|^9(f@jTF*D?k)PU0JC%W5%48LA2Y;2yT>74d3ChAOLv;`(5h*O z9YzN=sjhA{Dl0oQ9Yr+1Yt;y`t#LgAx~ewa#;!pf(O%eSiRQL!Q5}BRLm|t-6@UOO z>AQ>Tkeu*G<;n+`2^iwX(r#LEOT}ncB@qC4;TB|!>t?rnWk#g)$?Yz@qM3SsM9vp; zqwP~}y?svk>b|jkFNnhOK|ae}NyTXb5Dy#=Azdk|Je8v0+#ewVh=`!FtZh?{y818b zb(8i-o4fHWmDNG&StKc1UCy|)`}L!eJTK(AL}msvkX(HlwUb8!4nJl}%SOKK9}7@& z+#jCvd|YbJD073wvIi>86I0kGn5k<>`5L9th+qC`=gJ<&m&+c)BMQH3@u`HBjy-aD zGPy3I|58X+ZJJ12K=5;ei!JeU7dBeTWEIwPJoeigz2OvXMV#QL)l&-6FzYLNM}{UH zzp4rgFd7us3X872-KI#CJ9hPTqT0fq zQc;3wbC623xRw6>K&LZO3kU6z$sVo`$*T$)^4i(kF-_8qabpssY=T0d6&KhS7|42o zHSn!cTr^P}vLXOs-=2f49oTF%C9`2Up3)MP^yR}rGh5FV_ZJtF?H_eU-T8r$RdLn+ zy6;a+IX{4Pd%F6F9CnP}$1qvo*}Pj4Wx1`=3BV&uSU1eS_i~%uR}SGfHC;YZwnQQm zBBrY*2yUGB&~FG$ts4+CQn)WMBW>xZU#Wp2A>k)z;moG?vx|R9wf)Nr)VRs+3}NVJ z2*5^d(dNuqFrJF7tL4|7v>6->AC~;@f^F68cfr=VKVuXXn#QfznNF-nyGOzDU#;a% zKk`P}iK{h_XIi~!=zC~*uaU9e{w|N5S>k$Tc=7@+|H5}vbjASRtK_APRSKTUTd z(=(Bd38|;J4V~H!9%)CU2@N+G&Wlta1AkMCoz1n`XGsd1^B40o44Rw|GHKGkP~GzN zX26(YwE<{Hdvo_uW!Nk(8C_`F(RnPezu|Liti^Y$>Q3^Z{QfxEjdNT5 z*?h7B>a*V8?P6Yy2Ym;3Xv&?;?=8SJv0$l#Yh|+Kfj>%RDabE??q4X$!gEO@F)2Q# z4ZCA1Wv2un7t~u`SdiNo+nm4oQnUwhe04*px*M!HTA0tFL6!DX@`hc7H!GZm=Odd!mOmZOdFd_ z6kI{ufnE5|eP+>S;_D%0 zN(n3rCxV2Wu2Zu)Lx*Zj`XWP%G^fj z@pBEBsyg78jE0Y$V5c*td2RZpY@-V5#+<=okB3I1}~9!Y^i^=omzLjy>gT)unHanz=wk3?4h}5=KAVxnpvma=K0Tz zNBtc}*hYNVQ9gYHfKMnW3io4)_^8bs=sbigjsQf{w}DV1!2}?rBn@D72lQ4%-@mgB zu|PH-qRmi5PQKMt5M+ze*i#cuKd;1fksixq%GQPRHz#&NRACW0cuoQ^9I%wud_?(I zFW(+&tDF>oHv{x=8DRt_XBrDP zSK@+(ALvkw*cp`8xBGz8U8`(#mupJ9th)63lZQc*JRdY1nt$Ljo(YnamOgvZjJ{!WaQojCP}AtK(oMwA zGcfZ;ozdzus>5`e=+(SxuYH%UnP=;)+hgddgFy*XH&BL%kC5J5)eACR#*8LI0ZmtI z@i#+dcXsusv@M90#Z+)#MDwr3c&tnbY;mDAzhu|0iU2Uo?)&Rq`nefX!kkbU1M@l2 zN?ADuyhpj~Bmx2Y7jo|ugU61T(N^^Dl-tK5#U<*r-xTkzPh(GI;V=v7pq8!4{TytR z$SBk*;s!ItvkBOZHEvHky%+aToL$FQa+|34cqUOj)vOvW?OB89W7ZBAya1xz^lIc! z%UW+&KhATV@Av5d^C>?+JhLX2nj`$%)L=2kffgqp@cl&J(*E5&0Hzp~4;#0BH~&A2_`O_|4zaH%SO|ZRr=o;nq z^@tnSS9D^OMT69I$1i&D&opoh`8&-Sn@ue5tgcqic}?FC=`zo5ELx9BBLJRAmGxfM zWzrh1iT-U?;W;i9?}SeJKoBCN9X%QOZAJvtT)i5RG(^$#5~t=9ZqX(g6=ycPfJIL& z{)_~N^g4>uheRZAkCbfS0!X4V5{LEj73E#ED-`lN8m`r>^BkIGn*9gn<221u@z>bY zb|;%3fL@k>Ueli=s@v32M0LAae-XN@jRh4du@gP~*Ao8UaQ}eK{}WLE{Z6qpag;C^ z`w90O?!S?Zc55QS(f>mfstoOb3*Lnu8BhEV<<95%65OZi27>;S~3Aj_Kc_Hk`;8)j4nNQYt`Z7x55I@A`UfSueX~cteL=Kj@V~Aqm zIZ0GH?P^)Sv)(TAGVOEpBs3zPT0DWjGAC0pn%$W(t$`Q{d-FI!dBxx`3jX}g3&#}L z^xj(S(0QqZRwdR;Gcs3lw!e7mi$$}|#>aA=guieXunM2r_h`_(M#p84JU9|Mjy0nV zE(j~Wa%ZyKa)AY_F|5G4MvbXXK4ov}vdLAyt4Qs14rAZp*n?5A=JQbsC=ehLkwN)` zfhd!&kx)ic&iG{2cs0+Q=&*)ziPvt525Bqk(eiNL9q9uCa0SbKxvMt9usohqxUB;0 zb_gAq8yqk>L z8{FI0sIP7)ukkjTzVPOCIIe9-+hUH39wN5oKiFOAkt~v z(gMxxnP!!xNFn@Bt%z4y`f{5Ure+05&y)KH-wVfl##c}C)~x5%IEFQtkk^JE1`0$3 z>5Ye9gnXUqAONgBL>{~#9cq8nJ~x?7S)5u|sg|qlB&)lZeG040!_?xF&{O`9iDbSx zl&$*YxhT0ww<>3RTgfW=AQ+D>TvjM&ovYIuJ>A?s*aA~qtOj<8UdL37ppTSpBH#2o z;rWkX!~4@kc+KDz0&v{9PAnvHVMF3fNRE^hivY8X<}x+zaw4D9n+3gniK{-P>2ZO7ObhEGYGIT_EsQ(&gvj%Ml?+WOutWl|m_Z66JzDs8WzqF_ zfqi?Tw|Sw!E1h}c1?$~?Gf%9r=Pu*|%I@fxab7T?iCOH^!8t97=rk1{?yo!^2~l~) zz8x5uZIMDBkuhExnmU)585zzdyKMpxS&Fkgq@yZgea&p$IOlS9`$+3XK>YcX$zC%= zmz{aOM?uxYm$f6`zLrYAmQEJS-1)TATgqW2K9wtH(dgN{%f|n`YH56skENpSu+zOn zdqr%PuZwka%Qgr#viP$>cj=@3PL{PR=k@-+E54h2Je177C>jbMhWX~Z@bK%8P4x`p zn2TZdCrb3ZFm2kzu>!qKZ!hDsU+TKuDM*U=kchB1 zmbb9{b=JCDB5QXnxHeGf9Tp4^DsWws`wa(uh>S^&%CauDCZ8R zH`Os@rIS*sIgu>##0nIQx_Q-k`+Jk?aMYeIh2&3zbLXNzX~}W8AH&wK2`YKMmSZi1 zTH-cvL(Bm|<{#p@yw!dCakL+}&W7H31?=zH{76%!qc3p`Meh4U*?5sA*;lw~Wx`BC zd}^#dy|4c2(yBm7!A7y~%Gq+l&_xkW|Jc{-2)6n7ym@f{h8n}Yd2xhq5{gTj!i>c5 znXQ;4s$`uKz7T*`3%QZg`2Ex7<xB!1R(M9t9g(Arc{nT+z=b_(rq&&F(!;j&X(PyQ|r=c63 zl1OGpJ;fYr*;|!a&J3++v^y-KNdeX2V+r35xt^$Q{yKAJIv}D~?z`gP!;=oLsm|u` z@9_EMwiz0@Q)|r0fmE*rDpPr3T{@9{pb+RHmjbB4zzu8@(m!iE>7vxt~);^=Up z(3NQ)dg3BS3G}GMW{VithlnZ9<;&Z_0r&%K((chy6-YZo|4%Ga{(dL(p%9jd8~+fJ zN&w8aiO4oY{|)vJG+4T^<{d>_;zlct|0puIO!GQSxpXY<&D6^SZm=rHG)}V2DaSma zM|h)-Z9(Y0QPk5i8!G0rQYSjKr=|mo=|r{+By+1vu`sS6CCTwkpaL!YrU=sY`35g? zc~9mHQf3l0KA8A`M3RXbm{OVrzrGdu)}E9$Q8|`@eb#;h{Y4u!u*B(fK6DLk%PTA< zAYCc}CUc@RE+7C3`hinX4GecARFo=m8Xi(*KX@f9RvBmvbty$Nnu&GDng*Xw6X$p@ z%`vqwilpGa;544Yri9K~ws~jIqSGL%E*`5CJ<%lVVe}}91?F7%Fo2S?Qt%Go!k$ia z=Pn;_WV#9RgU<7I@S`zSW?NhRtE*g5yscdrF~8}xnvffmWUuhK1;!vYPO;Yhn&vzG zFE?wQRF0y~(wZoO5Hcbnv&0qoGbVduG9F(EJQO`KXruk!SHcMV;lN3|@x>O|u7eF~ z%T{+wN?(l@4&k+!<=j4!KM^4+islGaRgn9?!el~7*B*Cxxck5Ih_L_0+Rqwp6fr(i zV@J-KFGK5KgClBjdqETqM?KA`4)J3LNn)Z;1FClV{c5gyR^l11I^H zjX2`o%zd_pHMS89N(r&txJ=QM^m0(h9%ypQ>#-Fs#1e#g3|3KM8}J(CT|aZj;*<=L z!h#dE3UvO>%Al7+XHwck@oP#Rh7(I}5X77aPD)-#dW95BKd(y3GOCVK@zp@EFP))` z5D9Jbmu>fVg~pbn4Y&IaP7~thu(dL+KCZiF`R~%ep)LBK%NWWXtKm_B@W)-W;Tfz? z;ueS_KkxoKswG3b{#aBa|5Z~PW_~=Nts+>$&U8MR!d#05a4V{O<}Gs~o~9!4ik#bm z*(p>pML9K2sa+UzvB>4=4xHma)Hhs*oyTUC$?1X5!Jdv3Uo1v}Yr-p3mVes#;P$Mh zj+|con+F#~=>o7ehN7Q!8143mHa_K5VR}OHPy1&M{=vXM82ASR|6t&MAqFT2KmQMT C+~3Op literal 0 HcmV?d00001 diff --git a/img/p/4/0/40.jpg b/img/p/4/0/40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66f4e1147993194b3df61c677d163f8d396f2e74 GIT binary patch literal 8809 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 literal 0 HcmV?d00001 diff --git a/img/p/4/1/41-home.jpg b/img/p/4/1/41-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f7dc71ce6db78169c0589ec56c3a1f8b22e2330 GIT binary patch literal 3608 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 HhlT$GF@lwq literal 0 HcmV?d00001 diff --git a/img/p/4/1/41-medium.jpg b/img/p/4/1/41-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32bb8fcf57d47e0309f0064d6705dd101504985a GIT binary patch literal 2087 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 literal 0 HcmV?d00001 diff --git a/img/p/4/2/42-home.jpg b/img/p/4/2/42-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f25953bd37553f68c138ded5970dd4139fad8da7 GIT binary patch literal 3877 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 literal 0 HcmV?d00001 diff --git a/img/p/4/2/42-large.jpg b/img/p/4/2/42-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e5062ed665d7dd8d88b084cbdbb47d9fa294142 GIT binary patch literal 11205 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 literal 0 HcmV?d00001 diff --git a/img/p/4/2/42-medium.jpg b/img/p/4/2/42-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38e9e044341fb476fae8c40e0786912aeb9ad647 GIT binary patch literal 2262 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 literal 0 HcmV?d00001 diff --git a/img/p/4/2/42-small.jpg b/img/p/4/2/42-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92e3b40228cc516e771f7182aa3b3fe8cb882ff6 GIT binary patch literal 1413 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 literal 0 HcmV?d00001 diff --git a/img/p/4/2/42.jpg b/img/p/4/2/42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..331e3b93ca5432e6c89e851243cce08ba7e5371b GIT binary patch literal 8790 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 literal 0 HcmV?d00001 diff --git a/img/p/4/4/44-home.jpg b/img/p/4/4/44-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..daa72999876dcb981b689a17cf06c752bfb6adfd GIT binary patch literal 3080 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 literal 0 HcmV?d00001 diff --git a/img/p/4/4/44-large.jpg b/img/p/4/4/44-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40feb42311accc1fa5c00fcf77df08b17a9f561a GIT binary patch literal 9088 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 L&L~v*asGb*(t^Z6 literal 0 HcmV?d00001 diff --git a/img/p/4/4/44-medium.jpg b/img/p/4/4/44-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5b387d4d620cf4aed801a951e48b592f28a5e29 GIT binary patch literal 1798 zcmb7Ed0bP+7M^==HWC8&LK0F0O=QQ4M5U}spvn(WDIivCfd~j9i)@O|q7W8El=Xp2 zL%|;f8)*$ykg%0aw%3P%r0_t3CA116QVLjbLDL(pcKPp}nSW;Hd}sO2Iinm=Dgf&4 z;^qP%2mlCQKq&_w0tALt8y5n;i4-D{Kp;}dWD-T4s;*9>(r9!IEtIZ-Y0zjW3&pe< zOeRxZQ-{rBu(cRWhRO(p;1~i?jYw2u&}nqW|1HW}0HXj;;E6zM0gOQi1}QthDpjZm zq>A^gkRc+41S9w(3%~!%gGvE{m7_o%fdGsmD1LmD$16#)gLIx(^SqGcSy@|40{;mp<$&-RtMF|rfr%cqw zB%8MfMjFvNGp-YUE#DzrZ{%ifaP#;{Gk5p-tebPMc1g!;qiX$jhtwT8JV2gy>#eC- zk+)_pi+zS9b;b-IA?Mkgc+GL?s2`y{h;&Y#ERmP4@Yr<;+mZOFu#V|VS4HMhY0U|G z+z@Z)S3~L7nVT|}iktHrGQDFaR@-dbJ^bE){_@!P^e)F@BmeHAdk?oCIXUPOw8x-J zefG)OPqZGnv-10Z_-<34{Oc|~_ak3?J-`U9Q~v2fTDe1aOJ|3fFh(~n+GhW>%XlMZ ztCRa_Fi)miZ=KmN==+W5N)zwjS7ezIO+vNiynr3iGc)|%#)J0+Qa190dF*n_7}c() ztiqwM%9pBrDt9S{FK8}lZ>c3`9TXME+pcKn8Ie*I#tylkx|q>+6pT*ZT#$QSokg-X z6k)z1|0`3&)50r3n2VtE8K&Q=`*_aW?We%-4e!6?Yg$`Jf9rcll$V&kvVYr)ONJjA zyB3=^7L?(6zy2S9iW_ucE@`o+E4kldMhP4gvkr@0dW$%Nt1z6vzfA@NFqFf!bb2=$ zXy?PueRSjp4SUBo033n;JMRPsa8XO%8-Qv^(Cm@oxI{JjPbcqRPO%8+$5GtZg;F{C zvrt?faN>9crsSis6Ypw-zWTTa+b8f7R~Hs3N) zR8OWjmBkti3$p2@-1%QSH;l#K>&$Fb|3asjlPTL8F>m80^EzP5IlN#SQL@=s3mH=E ow9(7&hcA}hZi$0RZL0bA^Gt~U$ra3Y2b5QO1%_VyR#SQRcPd_?{{R30 literal 0 HcmV?d00001 diff --git a/img/p/4/4/44-small.jpg b/img/p/4/4/44-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40e9cedf1f0352a2f40d32818c7d3aa076f66504 GIT binary patch literal 1107 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 E1$1VU!2kdN literal 0 HcmV?d00001 diff --git a/img/p/4/4/44.jpg b/img/p/4/4/44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81795b2f9d8132eb34f1cadf190c5bf214568ab8 GIT binary patch literal 8156 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 HUY7n3de!6r literal 0 HcmV?d00001 diff --git a/img/p/4/5/45-home.jpg b/img/p/4/5/45-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f19e48d3916d40e6b72a68f64714ea33f70420be GIT binary patch literal 3624 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 dJobEZ?Ad+n*&7{!WN?B6XDC=GC`d>s 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 NK0JDGe585t^&jX0Rw)1g literal 0 HcmV?d00001 diff --git a/img/p/4/5/45-small.jpg b/img/p/4/5/45-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47c8f3bfc52884d406209cfb5f2f0b742fccfb3b GIT binary patch literal 1254 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 TP7-!fPJu6hPk`Ihr{(_zcZ@xi literal 0 HcmV?d00001 diff --git a/img/p/4/5/45.jpg b/img/p/4/5/45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96b6abb2ce5e318a1db25414c9a763f05d0ac000 GIT binary patch literal 9490 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 H`uu+bgPCz+ literal 0 HcmV?d00001 diff --git a/img/p/de-default-medium.jpg b/img/p/de-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0ee666461c87378d46070c5c514857386e472c1 GIT binary patch literal 2010 zcmbW%dpOkT9suy)%x}hR1~X&EZNeCXLdk6;Qphz7x=6#O!nkEC2D8}`ty{{@Y-pt{ ztxIx^K_fygAxRTuTnm&5rgw=RD8Zf6h7I_xpYSc`wiR^SsaVZob_d15i$O zj&=Y90ss)v05-n@<~AO-R!1lvdkHkZox$h)X@p3FUAqa}>ES_PG=ig(J;BM%)}9ba zHr$~{I8Q$n8Wh1G>?4@%mf9QwYyc1n-AYlwL7bOr{Ogu^AV(gy?uv{u?g99kJ(_{MDZl5|ffsSijs%&&a&>YgXR9-}4I! zi|!Xctg2?$)Yd)Xv^;HXYwvj0+4YM1x_{u!+d9 zTo3^KizS->g8hdJEpkC&Fc2ob<$^$?LJX#Cu9 zHB5BazBXK?5}1%)BRZoG3BF0wolNp5sn z|6~jqcK3FQ`R*m@bylAxZ>gh5MJJ>$a1)><%sv0u>MCr~6hJ0px>=^ko+a%L*)ek$ znVExH32R3a+TApQ)XqG}VS2JYy8+W?vj&%V#cvaGVp9qb1#&`19ans@q&%7a^EXN z>%5;D)h*R`;M|>>+Hn$+oRrjfassl-lHKOX@OG(f!#jS+u&-v}D@!`_I)h&rvNQ~6 z+8d2dzdjjh1I}O46xtSZzB_(=sO@6zi4gaYb$T)mSa4DtI3kEK zZhXY{nvdBp7B^oORGXkwo;5LEIzNeQ_tfjI&*T+TR9q>_s`A2>LSg2yzC8KWirMwy z>#8}%Kcrq5maDuIGXp%gN|)SLBLl*O5COERm zcUAjM=6s+&T8i3rT$4b$d;-Iwl4!^BxA7fgHGwZ_+WFz@8ISf-h1VkUOJ+YtQ=Jng zrW6YjDAky}u`fMJ-KVuu?_M?A^FqSHYl*et%w^yId+T+5cIR9l^}0Pp*eL5?jf0MTP= zClFCpie}bF8go=j_vN=&VOP=KM1#1G%e^-a(pnbqD3rta4MRJrr%U@=IphcYpk2nz z6Vj&E8^+6>VRNCxq`@{)qcy5WBh1jU<5cW{VOMyFu$R9>aOd%Q5_e}npD&x*%l3ZH z9CD#6xl9gOTN$DnZWT~KV+dPN^>n>FF#;i6x%FGz`r^@sCxP?78xr-n#wj4mDE94) z?!&TO+zBkN@Wz6Ld12tI5t{(!Ax2Sk7t>~2WoBxuoli3CtO`J4Htov?aLwf{&n}Pq z1*?)+%g-z7Yt^f()Vg-1=us>`tn4l>FnAx{6Lr%~{C2eVcunOvxvxZd6L3C@x2NbR z#8VIqx^k|=fG6onwQt4&1Wql&4=?`&L8=kb$DbfC2RhY=cSbKaJP@r&bHm>J&cA8&atl4E`w8@u!6Dr>y4$03BHaKDXE@}1i YC1-!5?Cfc?)wQy}|AyawNN{uTPg1vHga7~l literal 0 HcmV?d00001 diff --git a/img/p/de-default-small.jpg b/img/p/de-default-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..11e9c36886bc33382cc8a795c4f7d4ab4863facc GIT binary patch literal 1220 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%mqC}AQHg;`kdaxC@&6G9d7vj*8Nq-73K*GyZe(NU;N;>4 zD%dK(z{JSR%*4VBay3wOEl{3;MUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_ zYU1P)6PJ*bQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136 ztZHs)ZENr7?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;G&P778mFHFAhJOi*hHi=1j?9ZhleV_)E}1i1ED_o0f%I-y=hnAeD{tdU_|+OZD8l z-EpSvkwTNd#>T?l-`n1vUsrK_y$EBnh~TV7eT5kgK^1fSc0ba3@Uy$;X{{Sy#mbHa zJoS<YL{ziZKCa(AdkAx^4_VQ4?b|p_7;4f&ue;O-P#3PuRNRV+f@0q z_vnqj2Yc2E|J-EQdDv*f3?_rJ9WuqS{XJjKMh9L_{C9Mh+4hS*9J-1jDXAGZwpqR9 zf5v!saopVOi5otccl>AA@>D!(-hyjutKx$HE;yLle74M?q2@40pr6Ni9b`Xpwm#+XPSW^zL(Y+g@I3uW7`i zd6I#7%ZKp8Z<8Iae(7A_yXACp{*$ezVs@sK!Xt99*|4jh7%h`?q literal 0 HcmV?d00001 diff --git a/img/p/de-default-thickbox.jpg b/img/p/de-default-thickbox.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c37db26802e3267a1cb4b278991ed9d4dffd9df5 GIT binary patch literal 12500 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 K-Hni^t^Wl!0L!ib literal 0 HcmV?d00001 diff --git a/img/p/en-default-home.jpg b/img/p/en-default-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae66584319cc1119a251037135a73c106c4f9b34 GIT binary patch literal 3026 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 literal 0 HcmV?d00001 diff --git a/img/p/en-default-large.jpg b/img/p/en-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d08a055e03dfb8462820fd6709e102724d0fa868 GIT binary patch literal 6819 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 T@Uq{`&V9IOyE+`^FDL&8dq?EY literal 0 HcmV?d00001 diff --git a/img/p/en.jpg b/img/p/en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d07b871d2d2968a7d8e6a169fe808e4fe1f86e8 GIT binary patch literal 10859 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 literal 0 HcmV?d00001 diff --git a/img/p/es-default-home.jpg b/img/p/es-default-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a047358b8dcd9e1c419a3aaf6419f35254664d16 GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/img/p/es-default-medium.jpg b/img/p/es-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89043661550cf408a514e73af01f85112fa63863 GIT binary patch literal 1802 zcmb7EdpJ~E6yN8}jHWXlXUxzL!g%B&k492rkXLDjrd)ccl$u20hDk}2Jm!{)x{4k* zy{4k1`cU#Hlm;c!m_iR4$weMhdMI<*qVnLwCKRU@fU|Ftxka=wQL0EdTQ z0-&mBYB5oYDfS!@0|61>(VqSzXN%kI5(ZkbGwSqvWxL;Vyn@2YPZljIq2{*QgwQiB zbmvF%Dz5O? zo&L0Sjq5|yIFTxpzTwlpI$36n*Eq5IOw=VLGsn}%EV-+xLpn42kY$9|=HCp+!(WFi zvW!#cl2fta2iB(U_ABdZx9%KvTou9Eo1GO&(4bq-q8+?{B#Rdc9vF+$!bkgeRY%27 zBW^3%*!6x+!iRf-)-jCL+|2 zub~aC_2igTQ9GnHz+c`S^A4`oxlC>90Gf3Tx%|cUi^_-eOBxfxWBf}rc0`1PKsFYn zsE@UE|MZ9$S3d{e>hLqn7o5pxUYa*WZ{tvN|Gb52N8$==s!}Q0L-2Nii5t1%iXt{JtIrhTod8$gQS*k|4`M%d@P7{$jSW@ctgledg_YFO-HfH#7Y;!PZTdi z21a&n0c%jEe>6WcZ$d!G)#%GeQ2t5Pz-lM6SeliZ{-K8vsiV!OEw75xk@FcI_4WI7 z`zD#&n8abX&b8e24}X#ja`3optfLu z12#Dx^j*58_*%utc^>2-yB)ooRXI0N68psd>*ln+(x&-`?s(q@Q;tMg#~*ak(={YL z9yB@UE_AQDNfW!jWiPWyT*K5qxl(Y&*7H0>{&-wxnxrOvTg&yM9Tz-_-dh>0veM(> zH*2mB_S6~lY!2u3OS@Ou7eI&XA2dF{pT9cj34zgfG=978&@9V&a)D8v&l1|4m)|zH z`AX)Rd(D?kWuMWDsO_$|-#V+1O=AmvlFV+keHhW07$QJP94de0EN@`Q571yWtKoWQ zbWSxVWNYJWYzA2z4;j6}B6A zU!5*$vSqa=CnBb#rm{=RqNNQ^2r^<`SU$Uvux_<%Ufv6;cPG0%%Dw%fHAjkL3wcTDLWGk`J9rhide>-n zBQ@+$H?y;ybDhQxN3K1$oBPy&)feQ(^xx-a%9B-cjEUl~7Tf!2h7$S)!_?vdsg7B> zbP5x{qTy<>zek*kj@yq!dpXq%{bTTDyH(Z$@e&7 z{3kr@;LYD!hp0c1umo*;_6%QW^}3iDoVaP1T}TlUXt1(3!^a(*)~?SJ52U7865Z`B MY0Qmd$%<$H0_qf|3jhEB literal 0 HcmV?d00001 diff --git a/img/p/es-default-small.jpg b/img/p/es-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3118b097d6e8cc4d6576824d79d203337d28f71 GIT binary patch literal 1014 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vToxlccbI#jOlU5{m6Wz48JKj4VJuBaCHcWMW|zQ4kao zRx$t@!vQp$k(KFYT*upVr!zqpKA9{tl;>M6(zo;*!ym;BiE-*&hcpC=cMGXJ=lu9) z-+hpK1X0`xG#X+M(Eav|@^}<5!4&8UFfaj~!OY4Da~C6%AcGLIqLQJ4W1_He;KYT> z21Y@JlP+F*2z4WyJ<}s@tG>gX#teE7KA)-6oXor7g4v^!Kldj-_3PzQ_#I?@*5Ubl zFZUhd>=jQ_Tw|<_bt0!;bAERF@4cyQ(_^z53!i%#th*oJ#MohHo3u2A<#0|*h5S># zPq(+6*6H1+AG?~z^hdk1S+?<%<5Rs1gX&to%=!Br=o>`=U_gTaJP;WL6&Va26BPmr z4;oDT01HHW#ZU1};Wwo}y)+W$RQ`F++fzu8S?UGL zP2Bsk`j1oZyC3!Du()Rcxkq3jht8sN28Z#4Iw)EM2t^B6fr0=qF@QV@PjHNa42p)0 zj)ek&6B8BS9u@e{;A$68mh2z$_xzbZr;kh4rhe_NW@&P*QZhIruN-u96{8u0psK~+ zRfcS_&J4>qTrMA9xyo5rU25s+OOFB>c$H=gsx3FlQ{}3UtUmNXJkKQ~WAfhic>=aa zKVMa?VEbaACBpr;t4sU+``Fh#sc@^hA N@A-A^bA9Fin*g)37PtTa literal 0 HcmV?d00001 diff --git a/img/p/es-default-thickbox.jpg b/img/p/es-default-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3db0c85b31976681d993e19baba88af2e33e7bd6 GIT binary patch literal 8105 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 literal 0 HcmV?d00001 diff --git a/img/p/es.jpg b/img/p/es.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28d7b8c81516e80cfc3027882a806825d27fc2f0 GIT binary patch literal 6828 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/img/p/fr-default-home.jpg b/img/p/fr-default-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b69c6bb700a9e3d7e7d3bc92e5aef60a825d4a59 GIT binary patch literal 3648 zcmb7GXEdB^*M6pHqs%Zu^v>bvkwF-}B-#)?Q3s><79vrS=%SMlJp>`5OP9l_5hNHT zdemr%5Jt>9Ipr(wTJN{kx1as|y7ygny)H75JP#l)>0ZI$>e(cX#1I?rjYbD*gu2qPeoP)zdRGL6N@lkS}XerOteTC)$Z&vBjf`IHR7bPt6 z$3>R}<{9JgWwX)R&?Dy?EM<)4qjypm8uV7LyK7Hsy9vW=NBOAaN&ryG9Xa-1M;E@o z+?A$yDUP6A2?n4r2<-0|Kw*@aPytBRGYDoDzVj%48CiLCtRuyB8cL)FiO3=Fof?{{Z;LF4FEFIrj#J_pIZdM9{0TIIrqtyL*Csp>k z@-kkyC=MqlU4e5 z!;Btpv?c0Z*e(d?Gm+NUR}(l^E#ab}8!bynn%iV@arEnrmAmUwlY%c&1NY;ZSw1Lw zYJO1h=$;6^d`nfeo8!w1(%Qq;=l13{1kCK|jUR$S7a!ZO=8%TM718D5O|3AUI~>u4 z<{^!faRev=+4oH~imB?n(R1D`T`S!jcOXA7=@Tk|?{kWS3LZdO0M+G<{+ zQPhZBp?hzcbK~VJ56N$-!@l)))y+NZx591^1N>>de_Q$ZPdr+^qL zRz4xQpx}(Bod|VJEv%WNb6{-Q$lsZ#QUjk#^4xOvSoRX<1*AN=G{0u}`O!^BOh*jl zyY1FGM6}s+i*qn1`I=aAgw;sk~jNBqu); zv0==6VU@AFN!n=pH=N>{9Mh~v*!z1$V)u6-u2IiU%e!L+zJ)bfN7T0Im2#Bj_P<>* z2s*GLU>_si)E4NpNh$AGU-P$hAC2xBAPJ1|z}fePn)qEZ*rdg~E1C5h_7)06qk`Bx z^SBfH1l@WQVy9<6w!hGBFk&E7h_#9{#nc`ZT?lq6GT!P@t;V@Hi6kHD&((P>`xp=X zA=y@s;1*HDQoHN#+#i3;)vkg{cWP{xlSAfDwZ|pwW!gK}iO{Ln=-tM!f#AACJTE%y zLC+AE*{OFP`_ev9 zf>}F{Dl<;9Q&_D7XEQ;MDou2Ua;*-`(Yd}OWj^ex1NQCh{$KS!9O4p#WFH%*qlFyJ zlUdJiTH93mXVmzbv}Ou4sgFiM&Rx@r#OR%6S`VswO&BB4+gv(QD_`<>S>SbZ%x(L?hbg4)Dz_`!EB^Bs&Qps& z^v|?PN?Q9h78BZgw>LIOTMjg~YC73W2mO9mIl9EX>fN0D(JCAK7&-bxK7UII&Yxs} z&)^&$>vPY#y6xG$-94IQpmMfG(MX!V0CTnH!C3)KSAoe-$()g!9K`ms4$U399cET! zK+I_|MM!PHYIuA0_}Y-ev+|2(o1E09k=98mh8@i_`p>_k+RI+qS@C)8SB1v+U%*ST z$3-ZH<7km9D(;T^F@M-jaz^M`=Vzm_qq6XyOn=U33gm#nAPR=U{_b7?$uFy6>ckfi zlks#HAyY~j(47l=|IBDL{?je*iZ9^nhPe2_>x(~(Y zTnV%#m3E?OB@UTd_X7sQ1wA?JNZia7G#t~|FT-{=4UvW+liKkGo(m+nK)I>I)|0i1 zaw61OMc?V&ssk;LWqGjlm(Q=iGbAmq<-YOByB^y~yx4L)8;34r2@XAd>ZcUX2^*1c z^PER`8}LpVE1)WWhKZ*a+^%oW3viVX55TtG4~VfmTfeAN2HBSXK66nW5Tp-%aFpA} zC)QFsOT;>-X7w+Y05EEvXLj}`))F6Er<)k5UY`g;{m>32i8%a2rAV6@h3Ya>y71R% zwoSUJn&S;wf^5A1Nk##>@w3)lS(^go`T@@ia1D5FYZ07tlQWG`_GWmPZ1l_gPubhH z_uZrAM!L)s3o0A~5G=*P1tzy5^GcIaru~v$c#1abtdjwqol9u^L(JN*|w&$FUcA*a3bNe>ftk3mi!`#5spCg-g z8Qh|nD``aF46#iRGb&8-;NnqWs4c0R4&8Ev{{B^bCqDqS&VX$>W%`Hw01yfWA)*m{ zPypBm>8m4YsNZnC9YXjsK@oBEK(s1=5ORzIeTPC>H0a|#0u+9v$*T_nXawS9zr9!a zrIeyRgZy`Xg_QYkSVP3I{bFeU3Hg2j8{!x82_q<+ghDTW{eST|5E7uY27=NXF##De z>ZQA#|J4ZTO)5`CYf$fRTb^D@_ z93g1(K#J8Ajq%8VwQtKNyjVPc%!63oR<0JqNZUj@5iz76<}a-s>ybrtj@rFpA|+pm zt+hxjMZVW!-ZT5$ns`&ocI@pGCOz3$^YYt;#t{qQP$)E~=v#bl2X!d`J^KD`64F*d z)f(;3F136PMiVLbGQon6XIRZmOgJ;|gLjy`mJeyExE~`J7J6G$wZml5E^KPX=}~(-P{g9B5Ll>{(P_34Mu^ZYX)q{hR8n z%m4=v9r5k`yZ~rfY7m_z+?OSSXw9l@p|LM4To*`NC<*4WLIIcf_6pfjgrLM!UY4%+ zX%)Ma)c-t6@HN%W6l{R%-3qWIK24ITE&;b~%ZUtj!fc~ZVFdZ4+7!-MqR{g~xB7di zccT0Q5p(P~S>26+hj|^**KZp(ZZH=L-!Z#3acw-A)MIrOwS*4YDId3uP9Sh;<~XGa zrb67d@HEi;alpqC@CmYy@j6O;XiO!klHVFnG$#XJOx&bKdnfgHR!(QUzKRk3quN95 zWxdStfV9{Jg{W=!+f2#~J3bL@V%ay=E_3K_DZigHR%RL7h$P)VGin}RKKj~_o~pt` zYoz>Gg-0<9jODyQbf``(G!N`etZg|B?72rguOstN`UO+KL5EI3(*fRIN+o`e3|QY? zg=$~qCY5a2Ths+*v$1k#+Y3HEC=wLM-o3S?Y%1Yz{M*ZOD=vMX-W-S*jXw!Lrx+W# z^<*<^MaS@?MI?trJ;qs6rJyO_#!k6Au?iFC>Jui#G0@Tn#hzC)bXu>k0PdCGN8Wew~JnSO+6o8ynd5B`7eJb7lr@; literal 0 HcmV?d00001 diff --git a/img/p/fr-default-large.jpg b/img/p/fr-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70c8ca6b7938871aa95e2f9337bf346693231b35 GIT binary patch literal 8272 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 H9~S=$9s;s( literal 0 HcmV?d00001 diff --git a/img/p/fr-default-medium.jpg b/img/p/fr-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a216e5ea41430cf5f13215ef83141ef99f1347ab GIT binary patch literal 2223 zcmb7Ec|4Ts7k_8od2NGPjiqAjvXi;hwar|2GKy4)Y0)qUm27P!Y9d$2SZ_j%5F&pF?7&Ud+cc>us}-sG?e zKp+4B0WV;=53mD3BywfLf`T_B1wkkjBqJ#)Atfs#D~pyvqvhoBSUGu|JQ|H9VQ~ba zf`Wo9Mp21GRKgP#h$}xqfUpe;l7=8@q8wU|_8N2mwkUrQk>6f8BpoSndU6LD&QfV&M!I3gAnmS;Oy(?OR@GC>N1V7=31w ziJ!V=;zql9#w8n1-M)viapn~m4%y%M(H2*zVm1Eh_}E7I``NG|26mx=h1~-P6ny+6 zAPRwm2mltRK&0YHWZ0n;90meHE;QRl2K0OSU-4wU+wJM4Q|2LewLf+%zBaap>(KR^ z%tOigk+-5(Ns5@X{5PF>Iw9)u7jWYGkn%;S1{lNEm-eSbwv=pZKevC**EyxpTql8& zf# zzbGKTDNtZ&5Fm(vP*ReAV}pQELgDZPbu$f3bJ})d2)7nXUPs;GefkBYW#^SQIQb7+ z61K?2yKTb2Gasw8A}aRUsKrZ^7WJ)Z>+=wJQs+Bwp!C}77K7U6wC0C~b_mKW6<2K# z{2|PGtYMI5vH9smozbDdpD1(x~b4rsFN86 z`nfL~x8@IbNbd`80wyEJ9n>rRd0fszFIo$qxTosz)Q3X@$M5Alh*lj`?dn`oZC2Ay z-5r^RNK3MP`;>#B8r%9o>9;@RHBdN~bDGgIf865fDS4}#KRNLqcMuj|)_53r2 zqxDp)dY@d1$EQDL_{WSsF;e4ydM__zTL-!si}QJfqB*ZEDP4HlvZa)PF8iQi_Cpd6XdF!5OY0NHX=F`bq+Y9_NwNW-Tb6O z!xgNyo=!>SCnb9etLYCykN8ffZ>aq&%+NgC(*ey4**>D8b-mmAu12dpU>eoa%l$2N ztcH`b-SUJ`LrN3d=VILn0g<1-VHq&=RI6GB;0Dyh!gGa0B2eGQAAtkZ&1l=bLQZqB zWa^#TZ?k8szO=u0%-w$tbKYF^tLhX>g-)cM9bG+rnX*2|eqj&sPqJ7e^n^F}sa=)y z>ywpRb&JeQhTQ>$gXv9;m-5(xqlf!d6{7Adw(e+qS=t6DJ=|ujudr@>UwUC?8~*O> zYP1s}p6aQ5E76O@xmeSlw%w;wG<)C!q@XO7i-FE_kZW96)=C4pY44$A^U!+Fymn`r zbakAC@Ujf~&6hn+JjLT73l9K2#s&2BpVS7$*c*H<#qjbka{;w}NZ+6cgx;X|#cu?M@Z+ae^AFdFOr4QOm`v9j+m3t&9^7c${b8 zp(wu^LHDYk!CdlqC*fSng)+_T+{+0CL3!>3%N$l-X;lH^&0WTAi-^U36{}k}FI4f)7N$zCKtA60% zCc>JFyoi$G;+(W2F&t@}Z_rGSt!tFr7Rge;<{D_I@nig1z>M*1Q0>>|BP4%)U>Ptc z_*5YIC&ccF#{N2 zXGQ}r#GXm5lQ7O=JImiRsnrOcdrKU9qZ0PzmVlBp5N`0CO5rj7Wb>OEKi)iZ=tbDt T554%Ek015M9>BbY383dMnILVf literal 0 HcmV?d00001 diff --git a/img/p/fr-default-small.jpg b/img/p/fr-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c3ae1720997765aed869fc50d1e00a75466631f GIT binary patch literal 1259 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTox3wDFX5aD)@hkfd{CZ zNq|`Z=)5TAceZfKN(SyXJUerW*vpG%3XdwdHrx;~nqm($LS6u9K8g)M+gKP_ zMHK{ugq4A&aRBXLWMz71{zmuC>}8UhDrKc}H{BOocecFPe#*P#o4nJtb>pOtN^_m* z->de}Xac`l%c&SMkylyO(ks1LN>>QYO)cWQrc}TrCc7WxWI=Q%8-OigW@NNyl*glh z38ugR=we1@MrKYTP`jT0AcJji0?6qJ}$*mUV4)C+9(OfT=0 zxjmcHG?SO9t@+{FSS=AJYo#g1McnQa-Y+)`_1${nWbhU?`Gb^^Q1)#cXdT)bEa||EIBgQB536{ zi44>2yMtK1osId{UH0?LlsS4F6Fc+PZ);*adz<0hnWVA=_ct0b&RQAPJ{@;18l(g; zt7*tl>bEW+#+zfXAG=oZnIJN@O+j}oWY#4qnZn!;e|-KanJ zzQp&NjN#nd8`AcseA;oeWB;Djhoe>Pl>DR_x}t)cY>2C12ZuB3J5fEIQlRg z#uNLXPiog&`EQAM+!2F`xli$_+ciKI1mW%z7A=Wli zX(Kzc{zL{D4<+qyM>%q4raExVQQJ`7(2=)9pgch7m!OR6*~hEx8Kb5ra|6; zlh%b@+DaMgcpIJun{ut6G-pw2-%HmU9nIHPWMv$CdM%;D;e?o2wB77mO&&TeYZO1j@B5*w#vsMN ze#f#T-s?}62wc3mJB{a7qZbf5IO_lnbRUg#1Eb<+=g9UG*usBWEv OxnAtkdphU;-vj_5sEUyQ literal 0 HcmV?d00001 diff --git a/img/p/fr-default-thickbox.jpg b/img/p/fr-default-thickbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f932656b54d1e0176af2bc6b75b6dc582d48133 GIT binary patch literal 10087 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 literal 0 HcmV?d00001 diff --git a/img/p/fr.jpg b/img/p/fr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed443472f6457de2a66f10fed0c34e25d4620b0f GIT binary patch literal 13454 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 literal 0 HcmV?d00001 diff --git a/img/p/index.php b/img/p/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/p/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/p/it-default-home.jpg b/img/p/it-default-home.jpg new file mode 100755 index 0000000000000000000000000000000000000000..54c4bd95b69038e31ff0f26a62a3acd4def700fe GIT binary patch literal 4601 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 literal 0 HcmV?d00001 diff --git a/img/p/it-default-large.jpg b/img/p/it-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..97bf6f2f08d6cd8c84070bfc470dc5a22dbb5347 GIT binary patch literal 11828 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 literal 0 HcmV?d00001 diff --git a/img/p/it-default-medium.jpg b/img/p/it-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..461031f99934d59dbe75a84ed825b9b74101c174 GIT binary patch literal 2607 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 JLI?T(Hvtr}PZR(E literal 0 HcmV?d00001 diff --git a/img/p/it-default-thickbox.jpg b/img/p/it-default-thickbox.jpg new file mode 100755 index 0000000000000000000000000000000000000000..96fc64a4ef431d6003e3f329b69541edebafe655 GIT binary patch literal 15175 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 literal 0 HcmV?d00001 diff --git a/img/p/it.jpg b/img/p/it.jpg new file mode 100755 index 0000000000000000000000000000000000000000..94802add7e6e15673d950cf943b205f6b139eefa GIT binary patch literal 35628 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 Ksl9)th5rG(VF{}M literal 0 HcmV?d00001 diff --git a/img/s/index.php b/img/s/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/s/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/scenes/1-large_scene.jpg b/img/scenes/1-large_scene.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4e31adc1e3beaa4560a8d3f22f8ae599f281062 GIT binary patch literal 36207 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 literal 0 HcmV?d00001 diff --git a/img/scenes/1.jpg b/img/scenes/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5ece377f908ccb0149a06ccbd3acc8fbb66bc65 GIT binary patch literal 34152 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 literal 0 HcmV?d00001 diff --git a/img/su/2-large.jpg b/img/su/2-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee4eb5fa8140bc6e8b240caa89dc6068a2b197fc GIT binary patch literal 4222 zcmcguXIN8Nw?1j~l13Fm@8Hm)0mTrJP$bfe6d@ETihy(rO(cl4P()M^5eOZFbWs5j zX$n%MC`E=M0s)*6m2!hK&iCB=+(q4$-5AWRu3j2#AJM{{#>qyOL7YXcB$AZ3s;1SAQ75g-TxwAT)Z?z;+x z01)6GFx>(}VIT-QbDJN;#6LSfUqIl!aexcLl!8Ox%�z{qOt#$_zqLiBxbV-srdW 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 literal 0 HcmV?d00001 diff --git a/img/su/de-default-large.jpg b/img/su/de-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..dcc29c8f14dd0455ddb3b39d3176e4f521c9933d GIT binary patch literal 8343 zcmeHscUV(fpY9F;LXUKi5~_f-BhsV=k1dgB}ML|GmB2B5% zK@QTTmn29NG(iZ#v>U&n_r7SKYq%K;UA*4dIHI!7O z0)p>8@Ol_7Whiy-4-WbwU5LPxW4lXWE4o*&P9=;RY zJiI)doF{}%@bU`?3JP*Tg++t}MEC>*1%6)y1ZJGW%)-vX!Y;tg$u02z+~^+xUN(>l zNCga%0ho9}U|tZt4}dX1vVi{4fdAe=OpHFVLfF_jI2i{todB3XU@#Li_;;@vM@KRC z1I)ZEe9~u3SoyEsg~$X5XvAi{V3R#x-z|7;0xx&gB`}ViLr7Re^rZYL1x2OPnp)aA zy65yv|1>j4T(G!!{l?8(Hn(le{!t#JoIX2L!b9af&s*=wrwZJ8^TUZ}cTJ}EtSu;@H;!zC zm1KgL@gqC@-VrhBnQWsM{E3{cyYAhl8T+~>z;D9LBr;T}*wb*P_t@V=%u;r(@C~cQ z$923SQ-pFhDV$)_vnu$Y_J@J$8`ORKg&~<|v@sR^+v%~Xf)=>R(&~u*(I=3JRfp&P2>ft zVMKcaEa#%-qI+0d&OW)pwvqll(~PG=WJp#fM(*F4Q(zpNq+mmthLMx$z}{%Y>Yf$> z(h%Y$4MF&Nf~>qCHj_kIc+R$ zU`ShX!$r-%^OIivt|6YsFIBTEWd$^2pi1cNQ`%hFv5S3wPwpC*Qta1K^qQ^giU70~ z*a|CwR(E;S#iZhsd-r$r>V=E`m_Zbv9`1F#glz2JY+KtOrCiRj5}Tc&DGwYC-M z+uyTpZ@7fv72wMCFaQiMU&9Zksvw;(%lh_H?)KZA7{>S4a~OydpzwH9EN!@n~U@+tvQh zwWaMZsb4+EMenfxibY2p(19c;(RO)4$Y-y1oj0n}Z-WfWDqV}Du7DIHVOO($=aj1p2^Pe^WMtXsgF#qd1l;Bc|%JDFBa4qQCSn@;J`QuxrG)y!ya!ffxd z>xK7e-)$~Cj+nQnU5HCE{+g?C{y0@O(ia_a));mT>E{H70ZXuy;(e9Wml~)#I$+zj zP6w|3JUqaCY3>xOOSbvgDuvIZJVJR~ze{VN+V~w7!>Na(;Z}Pe=ztvOH9Al?;zt!x zZlFF#ttXNcXx;VWEE)Q^)tDwrKi(x1tYU(sq;&APQ*pO*mvY^~YVqMJ>43vJI-ppm ziP}m#>EO*YJka3hYwt%)X!c$QeM<~F1z!^-)^SpcI>qcLmq-Mh*d13LBgv_{@@X|q zBD}S=(Bomk1^voZ>A~n^seH027Sg-NKd=Jn8rS01o8Qf!pJdrj{-y7u?`RM;S;6co z02<%6t10?WzIgv+)U-{r&6(7@?_=ZT(#%bmg9Uv%J*crw^M|m6{KAC&#?*?P%(txP z_Hkho&1j$gF$&x4lqP6{4m5^R9(ReM=Cm&oiswhLbRdy-B6>99G95@&r;TkoE~|Dl zDtCqtp##qI%6;&=tBK9RGyx~k9fI16NP&GjFALq3 z+<@03t>BLyA-)kYx;yv469z0~H;NwNdxKDJi|~Tr^e!K4FYKD;6SNsm<_UBd>gaelT{$yBGezD&dz?dZ*A%rbEgrFYoU^p+HvBy>a-5Y8 z>=L^;yWTck$G6Z-2ELkYQld~bi-Qzo&{33boggWT4k+N(=)f-=gchrMAJuKxwQfqV zq9)|f0W*$~f3qKmiqf1|G?jZdRBv`NH#Cr`5-gV;!GVYIMK3vVBjME+cR6=jCrf?2 zJGAFdavgPtp6^{^g1UIC6L(4RK^VWJ+>_kT2Sl65NtqtkOvS=JdR|4}y4OvV3$43O zlEtGfNEU0C^)EFwBnB(Q+FQ5p4?Z*KbKj5HgGlkjfQ(^Uw0St6fg!;Z7}M`$`=B1ll*o5I&!z-Mec!d~Y4qN=53 z>nQfkK6qXryJRVQPn=cyxi~bsY;&&$N;A$!Q6mTGKuH?V@vjQ-Ka}8~KK}w8eoQZ)aDfhx%=s<-&1JL1RE zBnIH`*M~ldXl!VUZb3Ri>40P>Clu`jRl#ISmxkp|n9XDr_8#-SLu)|XhEDr~+{aFr zxpAG~pab|p6dP*mDjoRrWRr1PHPw>nKoWg9=EM5prS05kP}@-Errn2(SBn{ork8YF zWp%f+zB%Y5({zvzNPZQyiC9!(Yw@G+dwCfQYb1-5?wBypccs2~JsiZG3Mmw~y@{+}+O3*eY4wZi zl$bV<#h3OhXxI1=FJJuBFI~jFLlzGf`|B|ZYz#X`8*tjUH9AcPWi)a@tY`QC(hRxfx+@W6diRMo>w z)Z;vG)DIvTH*GL>5MOd>QGC&))T`PY2EK^c*#%)1pK47CW32xb*U@{*18z)Oyh#$9CHX& zy{+g+odRJM=950O+1HM9?b>+18!MY7OMM_xJ|50Z(I%nE8r%6HuQ3ujG`?jG;%DJm zivC74QTc7L!DHU+@Z)If`N3sb7GuK^9Ice+8Qya6tb-tLb5;0}Q%5uCX^$l8 zPMvy7%@00aXO`bvKJ5GR=qeLpkiwx|>pd_F6Gq(+X~a*3scm8yB%B+ZOZ2&<>$#X| z@$mebr?g%2i|6*wqDqx_~7dlB#aI?IMab~`C2;gPs8_$4*W0US8VqJ=a=B9%CMf^PTZu= zQx-pwTAl*RhDQr`?<8I`jy{hWQ_)k802p$y_97$)K?m4`$^<&vHSP?o{Ef^76F63% zM4?_!UW7ahbu+nE-rl=#B*63GNZU|hP*eSu ziM!F?-XD>i1a+KF_Z>+X#2dyH3=@`5I~LL*vYwBV?qSW64R!~Me4bpTX!aHK(6;iqb6{^NJF;KM5ncP4ciPV2xiP@5s|5WLrP`n%F2ZZKdSOc(Tp z3M&gX$FfXcMO4@_y9B!Vb2dDYb1QZ-BVWH5yVuyJ>vrcIfDwwG_NCDt2$ZDbb642&5{ z3+0WO2XDZye`(iWL+tTlyVCS3GMs1HAEdADzIc%*jRLb5$}AZj6oL-Az{hjJ`w znP5c|*o^T-UZy^y)~$~Uz}?A+tirwY?+eRDPnz(!0T}+R0q4sw^lq^;ZK~NG-4NdC znOC&<_Uz%u5}xdT81dg`{Qq81X=(}0(18MJobW>@WwzZ#DR;|_M6Qd71IB~7i!I!J zfkv3R8&g^$S{d4tw3)u<7V9#CE=|szt72cKeTrC!hf!2uaVygAGU1FVs=mkRz*VfF zQV(9vi=YD^tBR=U?ZLnGq}$MF(pG2XUUqY#ltN)VH}9_p?oK372~Pn|c%X}Pb73&y zAkt8b9BD%k+?;oA5{@?SesX7hH(Ez8Grr5Dx2RwXE?j3a5`vFKi?O%{rCX)iQ#v~Qt~gs zn{ta*6yr9n@vBLTTDHXhoJsH*JFs>J zcn!Rkt+T_xF>5d=e2W|FM`3B91Gqz6HuAwZ@-EpfOsBt-zo~N)(~-MqH7!I`#Ca7V z?%AdwoDsQ%%qxMR0#Fo^q%RILeYuNji=YQmB*_cN?bzadB;kH9ro$=NdZ? zOpf+5B5gj_0k#x4DWGhzC-zWm>l*oLo2-Vz($I^-r$tr@;Bk<#q%7GQ=}B;qtlmdngsG(Ais_y}7M_w>u8so__9e{hg|doe~$HC`67 ze`+lT={(*!;;|i2o%es00@uM8A^g0lwea<2%3TIe?$LpR^3!lP)UgfMNOuDAb!j7`x;fZOa9|kLm|58=>SVaV#e6wgPQN!yFXoRwKsK# zKA&|`L3N);t()Ros0qak_jvMGyeS=ce2Veikw6EwWMT|j7$mv}rUM)mgGGG!RU(vF zL8PR@7NY0ZkHucy{@F6(vl?lLxMcI%J7NZ%todm4`t=W)V^)o+itNHqw;{y?wtB6aYCgIQg@-JQ2O z(#BgKZ74mRxtS^=e_KiAQ)s9Z_{ZuywO6m4D9re!2zx~9yj#+D&4Kmezg@^3pG~9K z>ZGX+wa%TS7JSd3`DxneG@R=C^P$-CN4smd;&wUNov3@@m(;RO*!C(X%54ghaoW4! z5vSNt`v-LiyX&2pGX1nSnY95ix`SUDIwdK71o^IBKQMT^S!0M zYVYaH{=bA}pZhuWZAx_gn=I!?yn^q@ONwR*^Qw`#Szw*8>hK9NDwk<7{7Y>{@{=Ms z2LEI4F4l^TG`ZLd7e*=xCw^^nmYIGq!X~T$N>Rb&7zo?w4$4k#8`|7zn9!{1xcCdB z`ao6MYqN0dQ&y$?Q!>CE2HP9KSo(OcRp+<$aj#^Aa!p)>{QX)sr7&pAQrc*z=?juA zcM*%;-NvLG&e>dRZmlQF|9w6C&zGVn)eB~gZjaRf;q9;{;Xd^=;iD|dX;N5gZlRBQ z9`#k#aI?44E4?*1un z{=jW-sch|+&GlfiIZ}cIEr)X5%Q5WJR>AG+srUrck9>`NGN&w_L-7?xl%3ln$?v{Pax-Wc6xFvsog(Xwl;%chAyNi)^Z%o8EWI@m4l~46{bAIAq4DAl( zu;Lp2)cOZkwPA|XY|K1uuGMZ!Qg8b3GJ7Kd(>DFKB~E`rd52&Bq5#)G8+=9x9tl=> z?o3>5U|G*w1=@w>5*k#qQuu;;E)2oV1b@PIN7nSM#G}V0)$?v%4KBYo+pzlTdHk7< zv7!zRiY<0fxg#t;PzA50EzuG+s5o<5z@6NWsJj$ zOxN+D6Tjm~<*0Jh#^wI&h99I?X$v;bkS0p_LE`3kyIJMimdU0k>8a~jtyN#2EB4JI z%Hju*BJQZrlC9=W@$m!dsbK>Kvxe=xu=>-CqjaB%;il79SvBDqMIt9})pf35Sv71| zdqBC%V-V4u3P8}%U+)AP@S|!h7?xQiGDSOWM=@Fs4Z?~g*l_x=g_X()E$s5#NDvzn z;XoKx4Qh79!C(|+k9?t2g6U-+CIf_c-n~)(tb?BKiSzz?iaFpCnGXK7&|O?PMfOA6 zm%2mtc1!HH@#u-FJK!hFBh1V>!#jQ1b9<9924gf1emWonOYGW}Vii2|v#Xbvco5kZ%D1>= z+pFSRA^qg>3B;PWI@YtdLm68U??*XTl`Pa^ESReTNiq(s{qP;Sp`kxJ)+s?PHqs3{ zHA~}NhG3%-TM}cH#o8~;@=A{_nP)Ty&AT(j=ra10)1RAvw0Cw*LSrKLZrL3>Q-e2w z%wzu56Px8XFS-2^>aHt8-9x9K@x2(erW#XMo>KptKCW?Jb$aYf8#L5|f#;c2{aHw5 z^kD0Q}PK&U1CvxFc?=XK`+wr5uVnrx+E%W_wJ=q;;9^bvnT{;1~ z*gWGw5YOpZ^fcb3>OeOtd&@5g?rV~b_VR9wH^KN?!Lv`%KhvT=fHCVVV_yxC!+gkawPAP z`+7%7(bDjRU1#r#3v1ck&sYejpP1Pn0ie&-e)xr&Lo+@v=PwlQ%=( z#mqZM84SvtVdh{$i4qOW7u(=YU5<9N|uF zD*j5;DT^C-zS&s!3OMzRh*j6Fn$(-X_n>wg$Xl(0J$`eZR*g+RRSwyGWGo8Vp-fAE zyFHE+zhM2#w?>_V_K7A-P|v6_xJd}=KNI%m`*6Jd_Lq_Z7ZW+wPg3m9CDLN}r*ZKI zkVh1ya?)lm!GYzxCh~)@f!dW|waXQYydCuO4~uJv2NA&g zu`2bNfL4XwWda&=qeUAIHImuJZ(VD<@b-Sd^VbUGB&8eTpj-z}3FV4pqIDZVC>bkC z@y2eqn_~CuW_Pph2X?ngoYP6_JL4;HF&*c}9K&iMC6T;aK?hEe*H(WWF;>wdSgo^uxzh%9HeV;Q6n z4{z9{oK_bNt8%2R(!S7^0~z8#hUKhB6N<&!2bPcO#~+qJUH+YQ{r~NMX?1YY6y6g- zTEv)59NNk^=Cd1+E$0Ar=BKi{1{#n3ZMr1bm?KyOK>MGc;Z1Qzv5b|vUYLO9w?Z{d zc99wD2AQ~!H_1spr6OxOEyhZ-s|_s!>M0Xqa7pB~)Q2BL*!MKUGKWhg(h?G{SXD|n zOGemC|78u)!IMAgA$rx>=ffgRQ?YNGAl%Bn+2#r=-~BcEicPivfMff2I{UBsPd^55 H`uu+bgPCz+ literal 0 HcmV?d00001 diff --git a/img/su/de-default-medium.jpg b/img/su/de-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0ee666461c87378d46070c5c514857386e472c1 GIT binary patch literal 2010 zcmbW%dpOkT9suy)%x}hR1~X&EZNeCXLdk6;Qphz7x=6#O!nkEC2D8}`ty{{@Y-pt{ ztxIx^K_fygAxRTuTnm&5rgw=RD8Zf6h7I_xpYSc`wiR^SsaVZob_d15i$O zj&=Y90ss)v05-n@<~AO-R!1lvdkHkZox$h)X@p3FUAqa}>ES_PG=ig(J;BM%)}9ba zHr$~{I8Q$n8Wh1G>?4@%mf9QwYyc1n-AYlwL7bOr{Ogu^AV(gy?uv{u?g99kJ(_{MDZl5|ffsSijs%&&a&>YgXR9-}4I! zi|!Xctg2?$)Yd)Xv^;HXYwvj0+4YM1x_{u!+d9 zTo3^KizS->g8hdJEpkC&Fc2ob<$^$?LJX#Cu9 zHB5BazBXK?5}1%)BRZoG3BF0wolNp5sn z|6~jqcK3FQ`R*m@bylAxZ>gh5MJJ>$a1)><%sv0u>MCr~6hJ0px>=^ko+a%L*)ek$ znVExH32R3a+TApQ)XqG}VS2JYy8+W?vj&%V#cvaGVp9qb1#&`19ans@q&%7a^EXN z>%5;D)h*R`;M|>>+Hn$+oRrjfassl-lHKOX@OG(f!#jS+u&-v}D@!`_I)h&rvNQ~6 z+8d2dzdjjh1I}O46xtSZzB_(=sO@6zi4gaYb$T)mSa4DtI3kEK zZhXY{nvdBp7B^oORGXkwo;5LEIzNeQ_tfjI&*T+TR9q>_s`A2>LSg2yzC8KWirMwy z>#8}%Kcrq5maDuIGXp%gN|)SLBLl*O5COERm zcUAjM=6s+&T8i3rT$4b$d;-Iwl4!^BxA7fgHGwZ_+WFz@8ISf-h1VkUOJ+YtQ=Jng zrW6YjDAky}u`fMJ-KVuu?_M?A^FqSHYl*et%w^yId+T+5cIR9l^}0Pp*eL5?jf0MTP= zClFCpie}bF8go=j_vN=&VOP=KM1#1G%e^-a(pnbqD3rta4MRJrr%U@=IphcYpk2nz z6Vj&E8^+6>VRNCxq`@{)qcy5WBh1jU<5cW{VOMyFu$R9>aOd%Q5_e}npD&x*%l3ZH z9CD#6xl9gOTN$DnZWT~KV+dPN^>n>FF#;i6x%FGz`r^@sCxP?78xr-n#wj4mDE94) z?!&TO+zBkN@Wz6Ld12tI5t{(!Ax2Sk7t>~2WoBxuoli3CtO`J4Htov?aLwf{&n}Pq z1*?)+%g-z7Yt^f()Vg-1=us>`tn4l>FnAx{6Lr%~{C2eVcunOvxvxZd6L3C@x2NbR z#8VIqx^k|=fG6onwQt4&1Wql&4=?`&L8=kb$DbfC2RhY=cSbKaJP@r&bHm>J&cA8&atl4E`w8@u!6Dr>y4$03BHaKDXE@}1i YC1-!5?Cfc?)wQy}|AyawNN{uTPg1vHga7~l literal 0 HcmV?d00001 diff --git a/img/su/de-default-small.jpg b/img/su/de-default-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..11e9c36886bc33382cc8a795c4f7d4ab4863facc GIT binary patch literal 1220 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%mqC}AQHg;`kdaxC@&6G9d7vj*8Nq-73K*GyZe(NU;N;>4 zD%dK(z{JSR%*4VBay3wOEl{3;MUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_ zYU1P)6PJ*bQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136 ztZHs)ZENr7?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;G&P778mFHFAhJOi*hHi=1j?9ZhleV_)E}1i1ED_o0f%I-y=hnAeD{tdU_|+OZD8l z-EpSvkwTNd#>T?l-`n1vUsrK_y$EBnh~TV7eT5kgK^1fSc0ba3@Uy$;X{{Sy#mbHa zJoS<YL{ziZKCa(AdkAx^4_VQ4?b|p_7;4f&ue;O-P#3PuRNRV+f@0q z_vnqj2Yc2E|J-EQdDv*f3?_rJ9WuqS{XJjKMh9L_{C9Mh+4hS*9J-1jDXAGZwpqR9 zf5v!saopVOi5otccl>AA@>D!(-hyjutKx$HE;yLle74M?q2@40pr6Ni9b`Xpwm#+XPSW^zL(Y+g@I3uW7`i zd6I#7%ZKp8Z<8Iae(7A_yXACp{*$ezVs@sK!Xt99*|4jh7%h`?q literal 0 HcmV?d00001 diff --git a/img/su/de.jpg b/img/su/de.jpg new file mode 100755 index 0000000000000000000000000000000000000000..43716f65318bb486962929a0530b495c72153c52 GIT binary patch literal 11205 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 K-Hni^t^Wl!0L!ib literal 0 HcmV?d00001 diff --git a/img/su/en-default-large.jpg b/img/su/en-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83f20252e1df995424cce5269fac77d43a3a7c83 GIT binary patch literal 5919 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 literal 0 HcmV?d00001 diff --git a/img/su/en-default-medium.jpg b/img/su/en-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13546aa40c2e127b333becd0277c132a8544046f GIT binary patch literal 1845 zcmb7EdsvcZ8-HKUf`=DDQ_uu*Qwt5U`dlGInGPxsUCw#TG}F)4rlw0xXQ0_unPN06 zrb$zxX{Oc^n31|HQ)l9AYB~>DQ0f z_`W<}00aR5G#$V=1Z)8iaQNai2@;7wqH$<63Wc`BVlg<#5|4*0AuDSl$<~@+N3eoy zotD{=$&QYWcv}k1$$>_4aCBI70wR$}Gzx8jMq4;oL)H%eT8!TVcnlB@gu_7^0Kcy(-{HypZ~Avobc{Tm9QLr71gezq0MxCB}67Y>J`FN7uNV_C!+Hcf{lr z*0IU-(&Z*RX9$1;Fc1z$z6CQW;Rp~(gscewKG4Sb9R|~ck1??VkuZH^Na>FX__iJe zaQK35g_1r~evLUCBpM7&0&?!%w?|%!xt=gmRbMp84aA|G0h+VFkJNKq-uiwR^U(ZH zU+z20E{fi0-zSc3UVpA*F2YQfUb1&`mai&RR;Se+@Z~2oxdcSWR<2RUXEg0#LsMY` z$@r_ErP}_lucz&xqU+qLG0v&QB;o&(yEnW8-;gxrlmim}#sIctz<>bQV$?7M-0W@O zAPkNN5Y_}LjTsaJ5!VPQfj!6-49_h-JL{kQkpdJ4_Ug1w@mh}?I<@kAy(B4@YLTSn z&0WwY!SID#9JFJRQWGqkJ42SF`ZMC29sz}FFAv>2f zO371q-andX9*Od$_xm`#S2=XAemiM?*Ne2KhQyy8{byfRe%4BjUbvdMA}lk+7vpof z+V6HkG-sK}@07#k{a=GBYR-^T6whW z$`mb1w8FRfoTzL%e~>*f=X2uKGP`ZR9h5RWY0tmP@3<~}Dmij|9V^&fl0Tt($7c^V zY`|dm;T2f5p_ZGY7xC*Oa{b7|A6}uCuA0?OD`#dFiXsg%&rfk}z5N$4&f^VH&8;tQ zj^^4%ogwe)ca*P7zT27FFw?_5WYvp^-bXV99UwL!=3A z^6r+^byFIeZctjqAxV@kA0F}AI7xRu8;VGiI~EbVgva)ZT`j(#d2F;QCAQm0vFRiJ z2LiRxmpu%p`-tPz-jrZOI7RDGP`0gVhT8t9*7<3|y_KYIZ!~T%)bKXMnteLtHHzM{ zp)gz3U3WY)&q~A0jCAV{BlZlU@_zimIeG&wW2~q&bmkU4AVp5tcVdD5DDFO88Q5Bd z|JGhea=Aje3z_o-*^dXKFv0wqQH@d-&EKkTmP$R3uez4sYbisx>{vcfTyaT|H7-!B zx4)I@ZBfY|o4}sj6z`Dr3rW)+CRabU!R&JBe3=ulv_VXx4gk=jZm-!Q#-nbE6iM8D z0(f?mGS|(TEn>}eyZ+7SEY246PqX#LfCeqDH&e;rZ}3czAReGHxiL@>B`}2{EM8hD z9LPXV&f}`;i**;2Vr*UH?H$_v`T-eHRPy;xQ?E%6O4yY*YYp4Qn}z9J&3qJ-r$bX$=VK9>OiqQ~^}72#o%IZ1G&$vY z!IsG2^N&>#C)9;2T{rCAABV7tmjaUVcd>OFb>ro;%H8cXcPm>8#ZwL?ppbi;M&0x4 zH)o*;NPB5@f&FfEQmi$MmHwOlgN2hHN#}yo9b(ta3yx=qbIhH@;ZKeZAMs}TY+aY~ z-P)wH+LprN|75q-%vrsgfWMzr%}V;X6Z19VSh$T=mUWqjPEs{%H+5g$KU*eQfAI^J Q_e@hrw$tjCa^r*F0bzN*$N&HU literal 0 HcmV?d00001 diff --git a/img/su/en-default-small.jpg b/img/su/en-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8cb9417b6f37f4d3290d585930de0e41f2a29663 GIT binary patch literal 968 zcmex=Ur0nsOh{Nlm|s9lUR*+2T2@w8P)tEdUPehuMpg!72qP;iD?1xIFFQN0jF5nk z49VdCAqGJX23-bSW=16jCP7AKLB{__7^H!YWMX1wKmyFHj7%(S>_ABokT+1l|62?^ z%s?#y%mP3ket$O8ELlN@>vdI8u0lum_6zY13?PlN0t`Sik&R_!Vqj(wQVCL&-jJ%BO%hvomv0nC6{;_YHlef>c)Z4VPUNLCy9;eLA$B|RlP2K()<^vt9BmfLW zMqs*tdyG*~k-^Y0P$98#qCw%pi?DFASA6v(nPYm7k-#ON0FG61cZIq+@}4@Ci_|0? z43+R}ym9=y!V|VV6Rx*fc!V$)2>YIV9AhOVzSDDSy3J;b$ygaxm|FOX|%}Kj*_Dl>w9v1U~y)82a0M#uKQZP!}K+>R<)(0>G#S zr7w62V-#diG;~x5Y&1wLgnLoolaGp<=@s$me)}W0bzSz-m@jCT65lBoko-}8AA?Y$ z@ydBThk0gC5S3^wHOXT*9K9xV%{hy55#NvO_6bd<89eeyJqKUct~Us=*k$S}p&)ba z&gHg7hDI;7u9K0xXPOw4Zq@{3UA$2yQK7++xc%Rpy>GT_x%^;R%J6Q2-Z-wP%lu|9=wzV%Y&7 literal 0 HcmV?d00001 diff --git a/img/su/en.jpg b/img/su/en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d07b871d2d2968a7d8e6a169fe808e4fe1f86e8 GIT binary patch literal 10859 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 literal 0 HcmV?d00001 diff --git a/img/su/es-default-large.jpg b/img/su/es-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..83f20252e1df995424cce5269fac77d43a3a7c83 GIT binary patch literal 5919 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 literal 0 HcmV?d00001 diff --git a/img/su/es-default-medium.jpg b/img/su/es-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..13546aa40c2e127b333becd0277c132a8544046f GIT binary patch literal 1845 zcmb7EdsvcZ8-HKUf`=DDQ_uu*Qwt5U`dlGInGPxsUCw#TG}F)4rlw0xXQ0_unPN06 zrb$zxX{Oc^n31|HQ)l9AYB~>DQ0f z_`W<}00aR5G#$V=1Z)8iaQNai2@;7wqH$<63Wc`BVlg<#5|4*0AuDSl$<~@+N3eoy zotD{=$&QYWcv}k1$$>_4aCBI70wR$}Gzx8jMq4;oL)H%eT8!TVcnlB@gu_7^0Kcy(-{HypZ~Avobc{Tm9QLr71gezq0MxCB}67Y>J`FN7uNV_C!+Hcf{lr z*0IU-(&Z*RX9$1;Fc1z$z6CQW;Rp~(gscewKG4Sb9R|~ck1??VkuZH^Na>FX__iJe zaQK35g_1r~evLUCBpM7&0&?!%w?|%!xt=gmRbMp84aA|G0h+VFkJNKq-uiwR^U(ZH zU+z20E{fi0-zSc3UVpA*F2YQfUb1&`mai&RR;Se+@Z~2oxdcSWR<2RUXEg0#LsMY` z$@r_ErP}_lucz&xqU+qLG0v&QB;o&(yEnW8-;gxrlmim}#sIctz<>bQV$?7M-0W@O zAPkNN5Y_}LjTsaJ5!VPQfj!6-49_h-JL{kQkpdJ4_Ug1w@mh}?I<@kAy(B4@YLTSn z&0WwY!SID#9JFJRQWGqkJ42SF`ZMC29sz}FFAv>2f zO371q-andX9*Od$_xm`#S2=XAemiM?*Ne2KhQyy8{byfRe%4BjUbvdMA}lk+7vpof z+V6HkG-sK}@07#k{a=GBYR-^T6whW z$`mb1w8FRfoTzL%e~>*f=X2uKGP`ZR9h5RWY0tmP@3<~}Dmij|9V^&fl0Tt($7c^V zY`|dm;T2f5p_ZGY7xC*Oa{b7|A6}uCuA0?OD`#dFiXsg%&rfk}z5N$4&f^VH&8;tQ zj^^4%ogwe)ca*P7zT27FFw?_5WYvp^-bXV99UwL!=3A z^6r+^byFIeZctjqAxV@kA0F}AI7xRu8;VGiI~EbVgva)ZT`j(#d2F;QCAQm0vFRiJ z2LiRxmpu%p`-tPz-jrZOI7RDGP`0gVhT8t9*7<3|y_KYIZ!~T%)bKXMnteLtHHzM{ zp)gz3U3WY)&q~A0jCAV{BlZlU@_zimIeG&wW2~q&bmkU4AVp5tcVdD5DDFO88Q5Bd z|JGhea=Aje3z_o-*^dXKFv0wqQH@d-&EKkTmP$R3uez4sYbisx>{vcfTyaT|H7-!B zx4)I@ZBfY|o4}sj6z`Dr3rW)+CRabU!R&JBe3=ulv_VXx4gk=jZm-!Q#-nbE6iM8D z0(f?mGS|(TEn>}eyZ+7SEY246PqX#LfCeqDH&e;rZ}3czAReGHxiL@>B`}2{EM8hD z9LPXV&f}`;i**;2Vr*UH?H$_v`T-eHRPy;xQ?E%6O4yY*YYp4Qn}z9J&3qJ-r$bX$=VK9>OiqQ~^}72#o%IZ1G&$vY z!IsG2^N&>#C)9;2T{rCAABV7tmjaUVcd>OFb>ro;%H8cXcPm>8#ZwL?ppbi;M&0x4 zH)o*;NPB5@f&FfEQmi$MmHwOlgN2hHN#}yo9b(ta3yx=qbIhH@;ZKeZAMs}TY+aY~ z-P)wH+LprN|75q-%vrsgfWMzr%}V;X6Z19VSh$T=mUWqjPEs{%H+5g$KU*eQfAI^J Q_e@hrw$tjCa^r*F0bzN*$N&HU literal 0 HcmV?d00001 diff --git a/img/su/es-default-small.jpg b/img/su/es-default-small.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8cb9417b6f37f4d3290d585930de0e41f2a29663 GIT binary patch literal 968 zcmex=Ur0nsOh{Nlm|s9lUR*+2T2@w8P)tEdUPehuMpg!72qP;iD?1xIFFQN0jF5nk z49VdCAqGJX23-bSW=16jCP7AKLB{__7^H!YWMX1wKmyFHj7%(S>_ABokT+1l|62?^ z%s?#y%mP3ket$O8ELlN@>vdI8u0lum_6zY13?PlN0t`Sik&R_!Vqj(wQVCL&-jJ%BO%hvomv0nC6{;_YHlef>c)Z4VPUNLCy9;eLA$B|RlP2K()<^vt9BmfLW zMqs*tdyG*~k-^Y0P$98#qCw%pi?DFASA6v(nPYm7k-#ON0FG61cZIq+@}4@Ci_|0? z43+R}ym9=y!V|VV6Rx*fc!V$)2>YIV9AhOVzSDDSy3J;b$ygaxm|FOX|%}Kj*_Dl>w9v1U~y)82a0M#uKQZP!}K+>R<)(0>G#S zr7w62V-#diG;~x5Y&1wLgnLoolaGp<=@s$me)}W0bzSz-m@jCT65lBoko-}8AA?Y$ z@ydBThk0gC5S3^wHOXT*9K9xV%{hy55#NvO_6bd<89eeyJqKUct~Us=*k$S}p&)ba z&gHg7hDI;7u9K0xXPOw4Zq@{3UA$2yQK7++xc%Rpy>GT_x%^;R%J6Q2-Z-wP%lu|9=wzV%Y&7 literal 0 HcmV?d00001 diff --git a/img/su/es.jpg b/img/su/es.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7d07b871d2d2968a7d8e6a169fe808e4fe1f86e8 GIT binary patch literal 10859 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 literal 0 HcmV?d00001 diff --git a/img/su/fr-default-large.jpg b/img/su/fr-default-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1fb7b9e6d1c052ba75d45a60934217fcf9dbbd6 GIT binary patch literal 7302 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 literal 0 HcmV?d00001 diff --git a/img/su/fr-default-medium.jpg b/img/su/fr-default-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..485a36c72001bb4cd7317d1ac603ee609958aab9 GIT binary patch literal 2290 zcmb7FdpMNo8~(mIXT&!%4pTl1615nIa!N5yp=emOjf6=$poB1K zhpba1g;36N4k!$Tqj0we;762&%35J_Z`C?p{(NtTk5mX;<+ zP~>G{`HiqNy!Hr)Mx(J9?0PJAJxqj%@c)g~T7ZB98~_I-C=VbAAd&#C)&Wuil1NYh z;2(f!3<`ljYt_P7~bZu z`#Wn|4p{IVw~pff>f)(HnmH}5J!WC*JN}z0p@d5v@G@QJd^So4M5A)8^;m zH5KtmJC{~Y`0u^shIQ$SP4Com3L3M5vWJbodMP@YWFNNKs8GTyo9S6(yi6Vf|XM3IFQBw>j~X#{Y-jC|oqW@}p#B4*idVS}UIo)59gPXU9b2k! z+A$y5YN_Hw$~?CFQU7Po2geb~4VF@und68K{d(aNKqj5DI8A?E_=271sp(f@aNx3k z-}YPUB*y#>Jk&d6FY(K!Q=4h5RX{9~>LxK!+x!Z#Y*!*bvdo9;q@XMO1L4~7M)?_y zY!A0y4r#fretuTmrobpT@y+ydO^kS%TdcUvR%of|3CIrX%j&$gcPWa2FC})ze#&GN zj88T`(p`uwq0F2lQ@@RUez7YiFG$uf2~llgOq%?|OoX8-3^c z*bKXW?DlE>v&SwYe3D%5rMOla!Y&_Tp4_PB=9L;Z_-4$W&vw3%0p}{f#QwnM<2Y_= zRh$^qx^;;e3Ie8I?>(!9B076^Y_p~64C*}h85Z8xhdzFCU3UjH8BRZ+wcC~SY>$(R zh(}NX1|0?)wc`hax1z)f$ie1UVnrC|=lvEmB)r(&9Zw$>o!wPbA=G(iJ1>*3c?r1O zJyV8^8Yg|^%sB!Nlro?3sLcLne8u->gNkCVIX@Bwy}Wl9be zw)^*yFX+Zrv2@D@JV`a)om5q6oRg@G7VYAZ#{FM3;kO3*SC^KFbr)>dItb;7%!^#L zp<{ME5s0}2>s?I%PbTo@M8M>*lX!dXs1B~_eF7n`-4FW#^&Ii0t!EU~r&n>8G#!4o zLteIOX7Gp20&7izMqla9UN@MfQD$)}wZiH&Q{}mr!jG;S%)L_n4_{a_4(NXw$F~4^ zfhYvufWSS_-#rK<$N_7jfG9@Ztefip=mA=3b=|37B$_rTyBQVE3Aq!>)#&J_pdH)b z5%pGb4+|ekV#SMam<)|oz(!S#qO!$D;dM}{!+Mhy!nP$CpgAa2-5;Hr3bp$Q6(4A@ z%WDs%hG8$W2&zk7#l8uqk|*%h_y=q|(MG!D)f{C-7~C}7;C5YDaj&tX6)k76Wx~n@ zM-dXEDD8OK{|H{+tuI%m$;w!rOBF?)N+-%c7wWB8Hc3BPKW3}tjN??z#H+k;tXCK-o98qQZ`W?iDSzpRyoRk ge3woqr72l<@>sQ-jW9V+`nh>4yahw*(8OxbUxyu)-~a#s literal 0 HcmV?d00001 diff --git a/img/su/fr-default-small.jpg b/img/su/fr-default-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..335ddd86fb08d99c16a9cc4816bc3d7689a975f0 GIT binary patch literal 1185 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 literal 0 HcmV?d00001 diff --git a/img/su/index.php b/img/su/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/su/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/su/it-default-large.jpg b/img/su/it-default-large.jpg new file mode 100755 index 0000000000000000000000000000000000000000..97bf6f2f08d6cd8c84070bfc470dc5a22dbb5347 GIT binary patch literal 11828 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 literal 0 HcmV?d00001 diff --git a/img/su/it-default-medium.jpg b/img/su/it-default-medium.jpg new file mode 100755 index 0000000000000000000000000000000000000000..461031f99934d59dbe75a84ed825b9b74101c174 GIT binary patch literal 2607 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 JLI?T(Hvtr}PZR(E literal 0 HcmV?d00001 diff --git a/img/su/it.jpg b/img/su/it.jpg new file mode 100755 index 0000000000000000000000000000000000000000..94802add7e6e15673d950cf943b205f6b139eefa GIT binary patch literal 35628 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 Ksl9)th5rG(VF{}M literal 0 HcmV?d00001 diff --git a/img/t/0.gif b/img/t/0.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8847824364c22aceb6dbe5c68526a2f50dc2131 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc*ekBUTU;@_3CY9Ce_u|;k|(kUOF4Pqu;-O-?X#3xVZSv?VC%N zF5TDR6jc(DvpMn1nKPGG=BK5l&73)NUcU3e>-)RAyDRP079Uu+q2B4iy*oEg96Y|H zEOu_#w{PEe^@Q{$_}1(zTwCumEh}`-%q-7x*C(GJ^_^;-5M!~U#roClXl2!A0J*=;&!mheMgmL;o3~! zR`=kl7;y;FiNud96g@cyA5 zuc*$5xSHtL#UWFotlr!?zPH6Gc}jB8j?AT{HVgv_6o0ZXvNOms=zv@SiW3I*O%1Y5 z&9X*DEgdcTOjfR)9aff(j)pw_O>RB{v%RMF&lE6paWT}Dljv|W^q6X9W-ljgY}XuQ zI5&u&ot-OGQQ1OW)@i%p&fUAYOoZ7?lmeI7OP)C4&8jXYC9CP=F3ZmOkds|jRQ^`8 z>26LTA?7EXdL5#>ncr%E_#~@p&cPzi&ZZO5(C^wW>#Py5km(R3kGM7y%Zd#wEt~@W d3Qt;J_B#`qtFc{CKqf+9a)?SBpzaOJBZx`QuE~-o1PO zd^~$+N94?zGgmeGJX&h<|M`^5&62-f?mBbk%)9O8lP6F9|ETlfVz2jGz2EPN{COes zVzuC(4@aLZG3%*K>Fw=ZKEM6{x9dlb9{q6GKBFI8*cg^I8AzS1(<<^lG=# z|92~|FL(WUC-33G_sNojC*k7}{|Eb`|37TLKhN;z{gPXYY<}F#yuIA%&+Y7ohZ5c&jsI~i z<^TWx40HsFKUo;r8KN0~UXGq+5xs)`QHgm{pYIb)n>|tKe9HAg8&%@)+akV z0hNYkF&@bphC+eXP7!HqGY+p$kB&`M@G@HDk#Lxevom^)gr@o#z$mJvlq0cA(T#^8nu(FY8UUt_`~Cm` literal 0 HcmV?d00001 diff --git a/img/t/AdminAddonsCatalog.gif b/img/t/AdminAddonsCatalog.gif new file mode 100644 index 0000000000000000000000000000000000000000..2104e0bed91fad53006e5889705b14bcd36ec799 GIT binary patch literal 1461 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 BAr$}s literal 0 HcmV?d00001 diff --git a/img/t/AdminAppearance.gif b/img/t/AdminAppearance.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e5f79e9b3bd6a1e8231aeff9823f2016bdbadb2 GIT binary patch literal 1025 zcmZ?wbhEHb6krfwXlG!k+F?_@!$y6^TJ;(0jApF#oIc-g#=NZA)1tQ>ot-4PAXRor zj>hs_jb*u7Yl;ommYS}qve{H-vboH3OS#$hDyy9}cDrirKR7ymi;jAm9r>*^|DV{0 zNmFYZw>$K0aht%^UowCeb>nzM^auP-gXwyfgLlJXl%DsC>Rys@n6=E|Bo zE9<|s2fggielRuR(VX;0bF+T0a{RO=_T&EOpPQo}FD!bpsPM^>(r2qHpRK5QzP9f9 zx|-+fYM-yKf4-sq!~XQ&=dAx<)&74~=ig<+-xr;JUyb{JAou^H+;b}%&TpP@ZTFm; zJEq^?HS6x)xnEnG9ZTWnC*Z=?j8Abs(1QdU=Ff%Yn zGw6VLpgh6AagV{ALuLnKkdR6}ht{19&pqb*PJQ)d!^Q$;e(PmtIy8g3MCME9u(5Ro zyS9oLWgNTn^3q8m*2WpnW<(XbvCc3E@niUL;H1YaUOlnIj6+GM#PuSrmT+uvJE!f``Zo|B9vxhr*{9m=$I{NhuI|)y^tAosY+Wfi}Jkr$;Lft>m1{p&+23 zJh92la@vK3Q#jjMq$c`^Jec6l$Z%Cc~Bz4A%n#K3)m)JF{6IJ3p({8rmzYaEWO@i@B9HSNWSFb%@zYhKO&f&{DkI$d|KYxk*`Zf0R z=Y-E+Qht2T?d)vn>2B%oZSCvp?Cb08?3>s#X~u;9<_Qy;CQJa5of9VXPoCU6X;R}oxfzs zoSnP2?%%(=dF`uXNA@2&bm-{OqlZtNJ$drvsnaJ#o@I~WodtNBVUko3x!VWo6vhN}I8Bbl4oGFU~GTxu)?9esr4i(j4SWENrW zTq$Ma!O+~|KG&x76+`WWMa=EIYDy)7iw^tEv#DrkTTqbL)Xc^`%i!Qbcm8=tLVnz7 zT-183M^>+D&xcRTi~<@%&M9aFEM;$CV4L@*(SvpCY(|!CDF=;Q4={Fa6^=Ohd9%fQ Un{bx4jZGUYr)noMF)>&J0PYiWr~m)} literal 0 HcmV?d00001 diff --git a/img/t/AdminAttributesGroups.gif b/img/t/AdminAttributesGroups.gif new file mode 100644 index 0000000000000000000000000000000000000000..897dc0a633f63565e65181c5f877dbe21d453458 GIT binary patch literal 612 zcmZ?wbhEHb6krfwc*ekRt&idHfsPmZ(ylLX`Tu6|t%b&)HZlCa*Yf2;`M2XPzdqjm zerM+M<$_-iX#Bbq^YgIctG%KB@AbU8xa#-2GoOwIe0#k6@4cGW>jaNC3I4w~=i3qE zzdzpnx)A+*i_8DpSuZvkKU%8%|90}fce{UG@cDdW=C3m@?{-x z|Gt{~{o$&AFIRm!o%UxR!-w-7x2G`NUE%UuTQTBkrG$#{awM@@S>?yQ{0d?GpTbz2x81wm(;sJ|6V>x|QMo^{5{g zQvQEG_vN7F&&R8No(p)oT=K(a!8hBCzwb4CajfJ2`+I*+D*k`g^Z(h*hjSPnu66l! zqwxFDAO<=D#h)yU>eE*;PY^ol~#fq*;UA#zxz+Sy)(=-@}j_;9-ysUyDgHfxvn46-E@m7|( z9~K^EW0g~9x#DzSNe8D8Q{RdihD!yyW!O6mZUiv4aH(o$2_zkCIK(N@#Px@x$AJ77$Si4U7PT_FfN2(Z>#~*3 z5JW9v8k;lmHb5|-K!Fe;I80Dbj)Nl?k$~e#e?b4BXV16y!@IrPi#?VS7mvdL7@!OQ zc3o*cfd6vn7ArZAm0Z9+_q03Xnc&nj{^b(xX_D~F^Y7y`Q+g|%J19?J-%9&|5lp+UUlb#oKT}6)T-{+${$d* zg>^$kRMkVO=3%|2uwGYG2NqNr3u)R%G;I-G|CphB!Z18-0+Ai25^ly^`3K4E8p$0x zo!->c#AGsAELKZPOKWQ@o6T-(Yiny<9H0xKT}P z21^^j($662lachvRQ`4BO}pj&H>ma-T*HCr+&N(?4{j5Ub`8L6nM-6Z6WPm$-3`N@ z1|E;c=kxpe`UC=jP$=y0?-z^35{X1AmC9tYfq{X+!9lrPu23kHN~KDr8X6i>tJNBf zMyu88bUM9W4}zeaBkN5(Jf8N+wGL{jFSs2f?YQ^S*rd&aP$l+ABE zLF9Xq(5U!K_n0OoS{WXntEM^jTtB{PzM3F;nHOUVuCYkYsjYM zXOCoLgqcYzu|*~hQ*bpkCM06piEAbrmT@po&BI4*`PF=q8jDZ8OB9{hhc~1Vou;Fd zwcFF)C9;z$8T(&F?!C|;TufQLIdP4gzzC*ct3%_CC5zMPhsh}zq9drhVtrh2!r?Vp rOIC!Hr7zOtSgVS+-)p_DD9&CLx?n?C%K3uG(ig$&b_N3&3~=x-){fS- literal 0 HcmV?d00001 diff --git a/img/t/AdminCMS.gif b/img/t/AdminCMS.gif new file mode 100644 index 0000000000000000000000000000000000000000..176c99a23f6d8391aa7f0629805dde422eeefaa1 GIT binary patch literal 1026 zcmZ?wbhEHb6krfw_|5Zb7=dSLpv@U*>>f`uIC53 z-(73`d3?&xlM^3bTKoRenkSbxe!INx!=)`BA8q{bc-POzn~onpe(KnfGsg~`J$~@? z>CZb7=dSLpv@U*>>f`uIC53 z-(73`d3?&xlM^3bTKoRenkSbxe!INx!=)`BA8q{bc-POzn~onpe(KnfGsg~`J$~@? z>CA$L}@A3J?n>TMxPEI~@ z8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=Wda}Vb(I9|HqM9IoC^-GV{Z@K=l^m{`?Lt|rOb8~Y`OG{f@TTf3ezgJ*7}1R_n+Lm|InU;M-Lu6c<9ifBS(%L zJ9g~&@#7~?o;-Ex)alcw&zw1P?%cVH7cXAAbm{Wt%h#@5yMF!pmFqWe-MV$>&YgSr z?wz{%{KTC%C-1&J|M30&r*9rUeE8_mqsNaQKY8-x>C>mro;`d1{P~L)FJ8TR_4@Ve zH*em&ef##^yLa#3zkmAf+lLPyK7Rc8>C>mrpFe;7`t{qlZ{NRv|MBC;&!0d4{Q2|u z@85s_{{8>|pJ5aX%@9!h$->OQAk3fxay}?eFmN1YQ0I`bNbHqr;^4IEOlWqS+`=;7 zp~AqKiA7C7y{1sXnX!+}NXVhFL**EgP)?RkLP2uERAtweCl8Dcv3JSHbX5p^bUY%W z<*?<;jgLxP-KuIaEecJK4$YKLztUj%nDy*5>?1)(8bh1-fp(BSQ zXwgv?g|tf*hLfN2h#7|;i{W%$aH2&^d(je)q(dGZin2{H4+;|!I!$8F1Skr(_DnGd gs)~@1IMmF>BO)N7Vc@{fz#wU~D(>v8QU?ZW0IbwJT>t<8 literal 0 HcmV?d00001 diff --git a/img/t/AdminCatalog.gif b/img/t/AdminCatalog.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc48e2e06d5bc56d0e24584acf037f84d2b1ae5d GIT binary patch literal 570 zcmZ?wbhEHb6krfwc*ekRv)lOF%abp6wthIR`fOv_w}-25FSGjh=fk%L)sGJ+J=h=m z=ktY+mkK{!sr!7{`Rjvu&(GJ~>a+NABl_R3_h0W#{{Q#KtJB%S-(Q*h{c+3x|Nnn~I`i#L_Rklyzg!Q#y~X}`9|;OD;~F}S$({a{pIfR@7G#>zFhqM zVZ(zx;dj>B-`VW&=i7}RPkP^<(|mcL=*5NR@6Yz$o8tBB?WT9<+8KrpQ2fcl$j+e5 zpaXI;C{7sIr#C1!HMg|3wRd#3aB=qbatX6fn$)b(DkVQtUcgDR$yU@}gr9ZdWOh;O zCL3W95neGd2?^b;QnpRfQi^VljLWA;H?b*;9uu|GS2ENSvOA*8CTe7$pk~jZDx}WG zeL<7m)$-ICbrV?~70o77VM}|fr_XhmRZN>)WX#P)jE#ADC2njmJkq>?o5hA9;>3hR N7RD|mFCG>KYXEG{&A9*o literal 0 HcmV?d00001 diff --git a/img/t/AdminContact.gif b/img/t/AdminContact.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f85b96600197d73fbd783c08a64af98ef9b7e17 GIT binary patch literal 354 zcmZ?wbhEHb6krfwxXQrr|NsB*-@m_q|NhytXZP;iyL$ENk8=w?pO|yz%$cJ{kM^GV zbL7zao|8ZJ?%msd@cq`UTYGoE-?3%kmJOTAcYa>Ke*NUFM^kqHFW&m5Va@sCbx$(a zKC4)DrF_--n6=+`&TPzB@np};lIW%X)qmoNfr0?fynv=D0U9>UH`avBmS7O+ z6Y5&5!JsE~k@La_EgQ|NU4bXeZswgl$e_h8*TA2{!oZ^<$gL*K>f6h}-y$s_rmQI0 z)7UhDK~!E$Oje>NAWkUFyO){CWf=oAM~f>ff0_s@2L}TuC-2@y1|bn%uOmks8LR;x C0fcb? literal 0 HcmV?d00001 diff --git a/img/t/AdminContacts.gif b/img/t/AdminContacts.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e0b0e373c7d21176e9d0a72509af5711c9e5ad3 GIT binary patch literal 604 zcmZ?wbhEHb6krfwc*ejG;VAy~e$?Jd$^5Ao4&M6VRCDm+wtm~3E$42%esVHo>XyfM zZ|{Bc@q2Ff^4%BS%-MWx_rVKirbetxS8bWrf9b^fKMxKcneK7z$%*G2ZaDj~ zYsK}b)|1zFmbNEo{X9N-Z>RVFPY=HT{PXU{hCOYrf4?1kzPD^;hm&u|;U{mtE?GGH z{M_`fPdB)h9=v|#LVV4t8&f@>@9)}n{m0e_CooMnZXPc z1I3>#jO+}S3_2i_KykvrzO%uyskx=KtW>_;vIJHH8A)04ps6!A|k75 zXP05%X>?ZRg0EI08z1kb?=;mn_BkPUVgR3?qZqi zh0M4W>pZ*Mnon<8cYWg7=j&EpIGla4|LXgzWowH9mfk8nnzG{E$*vRE{bsvouS&{X zakT$p>zpIAYAzPdzqCJX_wLQNj-+lV51hH9VbhVc+of+lzbQF+I{wDe)z_C^es$sa zi?vNR8qyX;Mz6b-HZ?MJ!rwZn-x-b@SP-Tid5xzP0TBnXG;B85^!o zI9@sBTzAgl&H0OSijQWuZp%-Z*HCb6X6?b^%qP9NO#OGUeG6~Q%-wx7 zV6xBB+gBaCZTk0BTz-3Q%Fz~vkpvWfvM{nU%xBO6c^Z@_7&!hj*mM5*qSndIEheWr z(_llQ7I#Nc30I-ItC$|IeWAjWltbE5O&>%$8M;p%Ftb|rWoAN4sHCL?!`+)r4GUUb zf_P?T1wHOk_U5Z_IKiOKIn~u(@5Bs~m0TQ#?q|+KIv;dya&quGS-|qxrPHEtnt|h% zQ-?&v=5Zu+x*X@?V&$&MXqa$(4Lj!?rJWBJuW}b>V~%pz@R7qwBgDU8M}gqdNezO{ zNj!>&pB~gy37GQ0BDhgxwqRmRpw|z za~=+yccvy^e`7YIWRypWlD(1DwhUacaO`LW6;uomLeq7`t_QX_u2E3rG zu0YE*?V8{*XCbx|Y!sMGBq&R(1a(*D7P7d8%z_DHOC$``C@cvU6XHAS5(7mu+K*_+ z*$&6M%nqquU{2Fg^Qsn@deO2f5H^J4M?8^6NX(KXfwXH#wnXmJthvQ-1(6*Lw}40} zsI=!|&}B5nIB?W_o0~?_+uPqm4IVvabVpL(GuI3f3(JSZ7hsc_WylkchYZ)T8A7xP z?1nTq3_C#HK2?1HOAwX0RR>-`XiJh1dvWA6Z7*QjvIaJV9W!+)XO@Mw#z`m*w_Wbp z&B&=EyJE4B=xzjKq!+kVv1Cgg92_YBysNp(hk|6}jatv9V|SAP2IQ=^re zwd%xVPv^{E;Nvgn?DYALyT{U(H*e*8z618f>hDtnql-629?UE1+SnBMbvyfLeytPc zuir*P%iWiTSBJa5`tYJV@OIbU>Gw8LeXo6X0Uf#W(xLUU6N>)o+-~ag(YKyo8GIi# zj&_WH)6;)>WF<9uYP~vpx-0$iSkG;vm)!rU@9ZI^e_{ETBdGtHa`^h}nNL0#SH}JY D1k$Mg literal 0 HcmV?d00001 diff --git a/img/t/AdminCurrencies.gif b/img/t/AdminCurrencies.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8672a6103b2de37cbfb6fe47d7072793375051a GIT binary patch literal 358 zcmZ?wbhEHb6krfwxXQp#yfbgfrFn<$9GrZj=f>-+Z3mlYpPjnl+PaE8CFh=;op*lL z%g-;S9GTpGq;1oUHA^nc={?@H=kE5k*OoUQsGWMczjSx;)YFqrK0e-dxar!nb4$-H zs@qq2^#0+UH+Q`L`fBO5rNw)*@4dhF|Nnmm+5p9$ER5_7N(?$6<3WC6U~6`mSTG|{ zL+S96PY(+urUW!C%Dkwv!0DXxp{X_+{A(PA7DTXdF{@ZDt#Fyw|8(t_9??c_S?x_4 zc5EWNyfQU%%)HDZnJqO=l2XDVBEkW3V(iYG5^Nk^+`J;p66`Y40s^e1yaH@uyb>#< fIU{7HdD+;6IhgvCq?wsT_c^gMFz^I8GFSru9^G*O literal 0 HcmV?d00001 diff --git a/img/t/AdminCustomerThreads.gif b/img/t/AdminCustomerThreads.gif new file mode 100644 index 0000000000000000000000000000000000000000..2194c59dbdfb95ed058b5a8a7c7ebbd580f939c8 GIT binary patch literal 587 zcmZ?wbhEHb6krfwc*ejGVkl6u=!|vw8msi_ch@&8&(?W$X4RHSg$u;wc_2`WfKa67S<O)OxmKl} z@Z!RdmbI7XrRrRW^7JZSl3>ced+XstlhV>=9uMx_zy8#t*O#|BR;@c(uJ?9(?TaJx zK7Rd~)3-i<($1b$$GtoEo?TG9CDy6kgFnMU==+s*^Y`A^ykXtkO{d~4L|$zwFKC>4 zzR|eYT+q67MMa?5rFj3iiiM8#n=6){`*CKrSM$~v=Qpoyj99w=#{1n(8M9A3e(`o@ zML@ib)Z3GbY%12Ct5Of|*;}{j;ZJ=K+P5{h@V&pj z=l#}}zSXC)odg!`ybxg_{p{M-+|)BHmWd1c*9>ifi@Ia0)R{;&PQ0)evb;2v-vq=azRca54xAv}g*ja+VE> z;+Jp@S5?u{eB-Ig>&&Rv(i3=Tp@$G}lb?g8;u7XP+g$u;wc_2`WfKa67S<O)OxmKl} z@Z!RdmbI7XrRrRW^7JZSl3>ced+XstlhV>=9uMx_zy8#t*O#|BR;@c(uJ?9(?TaJx zK7Rd~)3-i<($1b$$GtoEo?TG9CDy6kgFnMU==+s*^Y`A^ykXtkO{d~4L|$zwFKC>4 zzR|eYT+q67MMa?5rFj3iiiM8#n=6){`*CKrSM$~v=Qpoyj99w=#{1n(8M9A3e(`o@ zML@ib)Z3GbY%12Ct5Of|*;}{j;ZJ=K+P5{h@V&pj z=l#}}zSXC)odg!`ybxg_{p{M-+|)BHmWd1c*9>ifi@Ia0)R{;&PQ0)evb;2v-vq=azRca54xAv}g*ja+VE> z;+Jp@S5?u{eB-Ig>&&Rv(i3=Tp@$G}lb?g8;u7XP+gsy$-o3qh_by$!w70kS{rmS-RaIxsoJmVd`~Uy{)~#Eo zOqufR*|VcZkADCD{o1u_fq{W**RCxtE}l7aW@~G!r>AFlczAYpHUkcz_>+Z^oq>}< z2P6-&lYw*^fRH%#4wFb0FB>f=7j|)TPp&pM{BsjZs*H zQII3ukH0a4m%D&PfTxy~)s2gZOGHGFN!W;$mw7ca+p<7mCNUc~R$&2lZZ=*~Ax9fA J237^s`nDuvH7P*9>ve4RbMw zbTf(eG>`SRiubj3adC-^jEsqiNk~XYNlD4c$;r>pR|%V=5xqb+aj8-IDzn`6*2P;~ z%C|aH?sTl$=~T1ZrEafl!#?-sgY(i9m*i-zDKXhxZU0yM(XJ-XLtViqCd8bZmU?-1 z&eiobTefVOz31WL1CN#-dc5)Y!(A6&?Y;DR&*gXfue{!W_1(>_t#|iNezJG&qmv7t zonL+S?AiPG?;p7G=Fs)`M{m46b?5!XXaDcN{r~9Qe}+*o8Un81T-9AU}R)*S`fh4 iz{)Ai=66)&HXwA61DpXp4!5RSPiJvV1 literal 0 HcmV?d00001 diff --git a/img/t/AdminDiscounts.gif b/img/t/AdminDiscounts.gif new file mode 100644 index 0000000000000000000000000000000000000000..f61d4f7bdab8288fd16b0c267ac486bbac973683 GIT binary patch literal 248 zcmZ?wbhEHb6krfwIKsfNe*OBVPoK7){k!ww-!o^2>({TpfB*j4o8L!{9GQLXf6tlkTeohVdgVV5bf5pf_uhX7+(7Xs3nM#&2!jqt z3CKpT?es7y z=k-cdoZ+)fq)qgy0*gkU9t%^N$E@DtmbQ`MY!A&N`@+JNSo6YpIg6P@x!9U?TZ)An cs|Hq)$ literal 0 HcmV?d00001 diff --git a/img/t/AdminEmails.gif b/img/t/AdminEmails.gif new file mode 100644 index 0000000000000000000000000000000000000000..94ba79d858a2395433b01146ec15c269dc9d3ac3 GIT binary patch literal 582 zcmZ?wbhEHb6krfwc*ekBo3mxx^*?RP@4Wf=eZ`Siv7OuQKK~xpyfwDx)TYy~u08oV zb<5+gKmR+`9Q3a_a_-jaXYYRIPrWdI-^;_df5g|UaxFdh^Ur_Zj>Grg{QLO*-<-|Y zp1l9(UAV4g?Y)Su6MOG{Uv>0t^_Capv<5Hay}?d7}ys#C^t2? zw6?XkNEzB28*}u_$(fp}n>vX&ib;yinLAICnN?Aen@v(>g^IK^51Xu!hM<_$Qb~!` zYXo$ZbTy2{w70PF=;?{=vS!??c|co%NnnluleLY_UcLjWoEA&jxGgM%&Gw3laha%U z>kA3#Yu^@T)-d4F;*$8ea>Z={4H;d96p0fH7C5po%gtE8z;LXWjn{9^4u^@0`k6%p NGVh!yOjcm91^^RL!pr~w literal 0 HcmV?d00001 diff --git a/img/t/AdminEmployees.gif b/img/t/AdminEmployees.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1ca455c7f667e9a60e910196f04862560ef45d9 GIT binary patch literal 586 zcmV-Q0=4}|Nk%w1VGsZi0OkMy00030|NrDqP~J{a+D%a2Pg31YQQAyW*iu*6aC5^$ zO1nWw!9`8ePFB1}P_jZzs6R@sMNh0kS*Ar@>a%#$qHXQCe(t)0@4SQf%$)YmrS{OL z=*6Gz&8O*A_f#kP}_Ry&9 z$)oPdruWpZV_sQyJ`8g{42nq)fkh68Ne^>A4sbsaVKxt2H4(>jDav;$UpW<;VlG)Z z9K(}mk4X=9JPc_$5>PM{eLf9(KNG%iH+@YgwUc<7SuC}8OL# zXkAv)Z%Y5#*8W{k{9RD~VpjiYUH@)l{%~afab^E91vGAJ;PeoH_xGB!6jLzqoSD?d3rJ|dVU zAT1mzDjz18NiH56EFK*_m zZ*OdAXJTGjb!c-Df+G}QWo2VvU0GIgR~9;gBo|X_VZLy|LT3w_I~aBh3PHt=nTHSs Y5I9kx&;$ep1{gTdKmw+Zg8~5nJGu`CuK)l5 literal 0 HcmV?d00001 diff --git a/img/t/AdminFeatures.gif b/img/t/AdminFeatures.gif new file mode 100644 index 0000000000000000000000000000000000000000..857f861f642b30ed4b4857c67a0851c967e0dcf9 GIT binary patch literal 998 zcmZ?wbhEHb6krfwXlG#H6OvH>Czd?vUiS3+1=DZl&w5-m=V8&Dr&S9c)h>Oytt)4D zOX7~!ltZlvXZq3)POZ8$yW-*0)W)V;zp3m9!Zo!U+i}$}@arpg);a`~AgRFYi40^z7P^=T}cZzkTlY&2#T>oqTxf%Cq~|-`>Ce4rT|< zpq7rq+U!deJdIM^y2TwE7;ZXU=n#|;H!8RhaFD4@#&QKmOOZ>nkg%#-3&X>QEj&`z z+ai8mT+H1ygMp#KUBr3yTQFhsBrxNL0nx&?K#|)+B zQl>-^(=H=sc1&H@ydtMN^qsoBy1hHzWAF1kR{ubML0>*Uet!DEclREVaP!eHEDXDY zVTY0vcI-$JiFT!@in0!-Nis9eWgotFUQ%ALar|Z^iYDdvwv?CT)yqyOYx75>@guU; z1Eq;S@2>w~jx^yoO9dQ!w|jVD8f`@AxT*Z->_1Uds_`@(g9V zM456a^JU6>g)(2I&DUu>m!7y;R#{VfUnXy8dZ*^qP8UOFv`nW~V+dc)!oy!x5j^87({0OHU7R z4n1&wfL;yoeCEhL;Q9tUy}+vl)E7v71MU&v8Gw`?(nF9Q2F{<5GD3C`vcr%WMeHbK zjmT#}$Y8VCIdXz?TRE= z0uIQ!5pW_v&m(pofq4Y6|NCbF0UO|tVT-W%zt-PRV7yUm32%R)O2>~)DUW`={$fnr zhD^O-U%=h82!3o-i061Ao>pyjIY zR&m3ML`yRs94JljeQ#4QtZWpXf3yEbbxM&YG6xWHzoO*Qkc z6jv--#mf^4oczUcvb6@eKv`0}NgNZu^hQcDKVs9_!AA;(R<efx*{#&fNE2^IxLiG&9I1rI&w{jjaS0sbz|tN;K2 literal 0 HcmV?d00001 diff --git a/img/t/AdminGeolocalization.gif b/img/t/AdminGeolocalization.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d5dcd2fd93629e435424559e2179e0af340159d GIT binary patch literal 1065 zcmZ?wbhEHb6krfw_|Cv!Tx~FOf2~vVwy+gdGoS8Dot>1kb?=;mn_BkPUVgR3?qZqi zh0M4W>pZ*Mnon<8cYWg7=j&EpIGla4|LXgzWowH9mfk8nnzG{E$*vRE{bsvouS&{X zakT$p>zpIAYAzPdzqCJX_wLQNj-+lV51hH9VbhVc+of+lzbQF+I{wDe)z_C^es$sa zi?vNR8qyX;Mz6b-HZ?MJ!rwZn-x-b@SP-Tid5xzP0TBnXG;B85^!o zI9@sBTzAgl&H0OSijQWuZp%-Z*HCb6X6?b^%qP9NO#OGUeG6~Q%-wx7 zV6xBB+gBaCZTk0BTz-3Q%Fz~vkpvWfvM{nU%xBO6c^Z@_7&!hj*mM5*qSndIEheWr z(_llQ7I#Nc30I-ItC$|IeWAjWltbE5O&>%$8M;p%Ftb|rWoAN4sHCL?!`+)r4GUUb zf_P?T1wHOk_U5Z_IKiOKIn~u(@5Bs~m0TQ#?q|+KIv;dya&quGS-|qxrPHEtnt|h% zQ-?&v=5Zu+x*X@?V&$&MXqa$(4Lj!?rJWBJuW}b>V~%pz@R7qwBgDU8M}gqdNezO{ zNj!>&pB~gy37GQ0BDhgxwqRmRpw|z za~=+yccvy^e`7YIWRypWlD(1DwhUacaO`LW6;uomLeq7`t_QX_u2E3rG zu0YE*?V8{*XCbx|Y!sMGBq&R(1a(*D7P7d8%z_DHOC$``C@cvU6XHAS5(7mu+K*_+ z*$&6M%nqquU{2Fg^Qsn@deO2f5H^J4M?8^6NX(KXfwXH#wnXmJthvQ-1(6*Lw}40} zsI=!|&}B5nIB?W_o0~?_+uPqm4IVvabVpL(GuI3f3(JSZ7hsc_WylkchYZ)T8A7xP z?1nTq3_C#HK2?1HOAwX0RR>-`XiJh1dvWA6Z7*QjvIaJV9W!+)XO@Mw#z`m*w_Wbp z&B&=EyJE4B=xzjKq!+kVv1Cgg92_YBysNp(hk|6}jatv9V|SAP2IQ=^re zwd%xVPv^{E;Nvgn?DYALyT{U(H*e*8z618f>hDtnql-629?UE1+SnBMbvyfLeytPc zuir*P%iWiTSBJa5`tYJV@OIbU>Gw8LeXo6X0Uf#W(xLUU6N>)o+-~ag(YKyo8GIi# zj&_WH)6;)>WF<9uYP~vpx-0$iSkG;vm)!rU@9ZI^e_{ETBdGtHa`^h}nNL0#SH}JY D1k$Mg literal 0 HcmV?d00001 diff --git a/img/t/AdminGroups.gif b/img/t/AdminGroups.gif new file mode 100644 index 0000000000000000000000000000000000000000..213f3a2c72ad919fa008c1adc9e88a9b375c0137 GIT binary patch literal 1004 zcmZ?wbhEHb6krfwXlG#14k@;a+iaYFI=W1%~VeR*Pru`3@|2J&e|EOjEV%Pr< z-TXgx|Nqpc6D6GoN+v%^*!I6@-Sf0F|NEmHCdN3mRfJ7VbeWauJu}09a%JwaN{1yy zAuDPV*VZTf)qd2`6x=bnW^P~J>Xw346Kl8kWjCG9Z$Deucdm5Wxw6UUE9PCOzT9GZ zb&kRP#Y#_?N<3X_{A`WYu}NO{rurV9o_%;(*^vcR#}-#yTU>N)Y4x*N-j8MnK3`Mx zY948s#Ib<{feEQ|>x&&f= zJnHS27pSjEwD`a=K`o={&kM)E1%jrTx0VDdFL}(Z<#BCCVshKDLk1dNa|{+Xc}l9g zNC?yvH?{Z+8O=MA(V)uJ(x@A>!{dV|f;lh**UKGxo4BGci~L0C0UEUjP6A literal 0 HcmV?d00001 diff --git a/img/t/AdminHome.gif b/img/t/AdminHome.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5c8f1b7eb3db30aa84f5b817b72a862ab2d7c00 GIT binary patch literal 604 zcmZ?wbhEHb6krfwIL5$GW2X``FQmmwXV0vhC1o~e&Yjs(X0oTtrDRvmkw-^N%1pL2 zxx|#k9GRCgXV#oMr;hX_`7AlKrF|dGhE^Ojpd5tdJvJEqyL^ke0TVE7z{9sq@*=71Oe-#;45X%Cej( zaW+e?Eh$--GiBP8J#{uq@@&3*dUIu6O-foy%B++%tJW+jb2)NtPtCp(n<|?vO+GPo zF-Mk_ELpZ>$+0;(n^LCq^*nj@BxO>}oIIB!eLf+5Ay4kzdGqego;H`7s+ue7O5WT% zvZc;tPhZHCB%3{TF8}}kXBad<@h1x-14AH#4#-8IIALJl*$~*&9B5?J($NyYChFPQ zAu6Sm` zxlSPO+C3gdr)2$IH2fu%6~ugHPoLT+&ZNV@AE?ah80ew+OtD>6;C{3IDMdbgFONV) zrw);QUVMD2U%oZjsCXo*H1Vj~)%?gdJb08}hC|>9gV7TwPH8iZm=hlr**RG?nXUvJ XbnxWl(#SNp5#Y?;<~^N>k--`O#F@u4 literal 0 HcmV?d00001 diff --git a/img/t/AdminImages.gif b/img/t/AdminImages.gif new file mode 100644 index 0000000000000000000000000000000000000000..c33d0e62bcd952d0a38b7bc06386827f035474bc GIT binary patch literal 585 zcmZ?wbhEHb6krfwc*ekxG}Zd$`%h(au4PVLRJ%Ly;GKOlt4w+}U+6tp5Zm8zabEEM z|NrOhdfvPCLD8H;Z5#8BUwmA=)U#?;R^6rr^Uv0F9gMiRF89ON?^8BEK6zqxX=7|_ zuk)<+7Z#kEG-vCzx;^0&j>b$`eW7jJ_VShU-oF31@xZMkm)A8fyYuDi_oWvaCmn2G z*J@X}(s$;Ww6}ON0Mq5-eedwK=CIF13SZi1|5)#KykvrzN~?}skx=K$=pFk zvAd^7Mxe<-MPtg;X^b*WGU5{KuCkh%KGu9prZc$}H6)Z|Ep#1?4Vf+NS15|xxN15o zh>CK!1#WBFVIwSJWNXXf$9Z`BP9?1X78ZFAX7wX0O?jM^`91Z7Obl*szjt3sTH4N^ zm-mjMsg8~yo4dQVl@-HhQ!WmZi3bk}HL@}&#dJ)V%`POat+%&tF!yWl2x#>R>kbT^?jJPQD|}{P)V!eRxgpWZ17lYO zr%#VhnHQI^DlB1rSjy(8w5`$EyW_J~C1$OyLN8b zvuoqt-JAC8-qv}zsq<)K|H<|Vr#q*e>z{Fc!n{jU7hayR^xB+rXAWIFfArFYqtBi_ zd;a|S%a<=-y?XWf_3Jlp-n@PL_Wk?!A3l8e`0?YXPoF-2{`}?3m#<&He*5C^Rx04xHm)XR*P+$)%Nn=ftBghK)`f0_+Sb dPYx{3Zf0TSDDjxl)a=;I%u?bp(LjO08UUyF)1&|Z literal 0 HcmV?d00001 diff --git a/img/t/AdminInformation.gif b/img/t/AdminInformation.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8c2fbc90dd4cbe205228b26b73e5a4bfe16f0a4 GIT binary patch literal 617 zcmb_Z&ui0Q0L?~Qf1tI~NrxTl)OFOl!KOG?mW^V6$RJ3uKd?1U)ZjtFKnWg34{O#A zDOEItA|q5Rp@$NSl+Z)@D6@RzP=W{f@E~D`e0q@LL5ippYxh6+j*s^q@A0mzh8DfI zZG?@`2!f2~GgUCfl^`tu@E&I>I{w;`8iv}&sR|0* zlf^osizrowN()nhPUlqWk=p&)lUqh$O=JZiHw`i=i8Z8XMwC~%B4i6NdSBv7h^m6W-OaF^l=!He<5f@I>q$-%22BT38!#27}k^Lx<0AB`hzG&zkN2>rU&b z5O4O4(6N}~Du|6!2lUKoX zi<08M+K*b>+S}UNL7)QyIy*W$yMUm(ySt~Sx3{;aw+{&V`}-$?z@&+jCQY6^dCHV2 zQ>RXyK7IPknX_ijnl)$cyt#Ad0m1wQ3l}U{uz2y}B}C&akmoHzxe*MOc8@F!Vx_$fhojZ5#-@pIh!GnhnA3l2Y=<(ynPoF-0_Uzg7=g(if zc=7V(%h#`8|Ni~^&!0d4|Nmzg1tT>C6o0ZXGcfQn=zszMlqVQC4lzh`$arjc;2^CR zb)Z90nXN}mJLG}Fk3(HYyCp&eViH*!j`z#0opU2YwV{ELl~2J#;D8rbla`l|!2+Yk zrfC`pVTMjF924a2s@@cM8nlW^N_A~m!O(J$NlTf1)`m+doRgGY+ITpVma;esg=G{Z zC?zusiA${LQII&~C8FUs%OG$POXpMp7VC(ej7(m={Jv=g3m!E-VAT#@=26N0^rW!1 nB!}07h0gAMr)N|~D4a+<#LOY6;WI(tVI#93Td+6}2ZJ>Ly?OaE literal 0 HcmV?d00001 diff --git a/img/t/AdminLanguages.gif b/img/t/AdminLanguages.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d5dcd2fd93629e435424559e2179e0af340159d GIT binary patch literal 1065 zcmZ?wbhEHb6krfw_|Cv!Tx~FOf2~vVwy+gdGoS8Dot>1kb?=;mn_BkPUVgR3?qZqi zh0M4W>pZ*Mnon<8cYWg7=j&EpIGla4|LXgzWowH9mfk8nnzG{E$*vRE{bsvouS&{X zakT$p>zpIAYAzPdzqCJX_wLQNj-+lV51hH9VbhVc+of+lzbQF+I{wDe)z_C^es$sa zi?vNR8qyX;Mz6b-HZ?MJ!rwZn-x-b@SP-Tid5xzP0TBnXG;B85^!o zI9@sBTzAgl&H0OSijQWuZp%-Z*HCb6X6?b^%qP9NO#OGUeG6~Q%-wx7 zV6xBB+gBaCZTk0BTz-3Q%Fz~vkpvWfvM{nU%xBO6c^Z@_7&!hj*mM5*qSndIEheWr z(_llQ7I#Nc30I-ItC$|IeWAjWltbE5O&>%$8M;p%Ftb|rWoAN4sHCL?!`+)r4GUUb zf_P?T1wHOk_U5Z_IKiOKIn~u(@5Bs~m0TQ#?q|+KIv;dya&quGS-|qxrPHEtnt|h% zQ-?&v=5Zu+x*X@?V&$&MXqa$(4Lj!?rJWBJuW}b>V~%pz@R7qwBgDU8M}gqdNezO{ zNj!>&pB~gy37GQ0BDhgxwqRmRpwncV{U+gv=l@V5dnEWMMSc5lK31rJ0Cm$iGA+#`{$=mLSp2*3hB zROR`LRTrS(pznUU{6l>-1Otx8#(qz~mV!@4K29qqr{=b1Bj~v>PFleqh`YluR2RIm z8&SbV776c_4&6ZsixE?01ykik(wt%`ym&0PbPQ1{%R`Obuaw`fR+Rj#Eh%qpK@1K3 zNF7V-P-ZZtnVqtmT@x8>TP8;j=PKbmRYAY3fUn9IO78uo&eswO$LfnrG^AWn3qON_ zg^5rny7NMD?Wt`|F%%{gBPgsFRzKn2?P-jCfdLObOcdg;)vB)7D3Ew@8BU2JtMiC5 z6ir;s5SPdszL8QAHDrj19A_rSY1-mVv{(!6r^)sl3lpkiWSgI58wXJO=g4_c`J6n} zJCp9UXL{|oJQD@;igLHH+M{`}q_6N8sy1e_ebf0X`ifOU<(dh#F?(afmHw~mW&`u# zuY(l22wlTwHNC8_v!ID`Y|CULN!?5xK@)Tsf}xIPBDR@Hv>8&ng_O+D7z=oaf!&1C0{vPUz@o>6xg46G^R z?+!c9CgnR!-Ai(TXGG+b3SJom9>Wy3K`S7LCkSFYOEu3{FL0D^_)7N+y_>IF?4Mp1 z*;hpKV%(;Tv?(Vp>w10qKUZ|T%~yRg$EeJ$k-N3(1&!V_X>e;zOFHAS(dIFj)?|(~ zv3=D#y=q%@J6!AHzrCt0=jgUivh5q)-jFS>z45Fs?yfm^*I#?zdVPEPwsy9*cea85 zk&sRQ{Q#f@&h9n$o&XN+0@On}tRyw)*okO+*kw*u$WaoU86J?R-GB8c)%fAuqJ@*f zf>i8#zf%$eu5Ag4`Yiu=cQPg7+?SF%Yvd7CcruvT^Im7rS>GHQ>HMG_(ihrxn4G9T z92nW0l;wrUus4W1z59G%>5+H9oPYWT&WvNy3nPHHrINTOCvR2Fy1Yr>9!UQb<{wGC z?f=mQ?RaT7xFH4$E!%>gL`#x`?_}ucXjhN;<5>Ldm9Rhwj(09kd2vAt_v0SmeVzm@ z39toU%B6=s2yh1WUx9#TIl6FM(D|g}nnn(cQTNH$J#k#_T*A8vAW#k|=G1Qyr>`6f ZIg}E8D$4It&D_CYSdHH^jGrIy)qlM|F4q76 literal 0 HcmV?d00001 diff --git a/img/t/AdminLogs.gif b/img/t/AdminLogs.gif new file mode 100755 index 0000000000000000000000000000000000000000..e5df19aaf2db300b653d232adaddcc758780a56a GIT binary patch literal 1027 zcmZ?wbhEHb6krfwXlGzx)Qe^|jAJuNWH(LXvPk8&Oyjl5{Tu*(**&k=OU6?G{T zb14vWEt2vmk@6~+^{JHetx^c6RSc|E4zAaWs8b1PQVVaIBP-$rhQ@EwX3W7R-yPo$XY%*tvYEXYFdQy48No8~vL%#I>&u z?%W>Iu`Q}|V{G^4*xs!Xy}Kg%_QXuwm(;yJzh`OMge_T9c4ST6UEIH_WWws0$p;gr z9!i*gG-<}MF{VmoHzra^>pPtJkkzzi{K)#hceJ+`M_=*3FBzZe6-@_r{GIckbM| zckkYPAb9%v&8vHlA3uKn{Q1k5FJHZS_4@VeH*em&ef##^yLa#3zyJ90bZt;<~DY+w7@PX;* zY5S^2AAT~wI6udpSz?2RBa=%zk66WUSu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/img/t/AdminMessages.gif b/img/t/AdminMessages.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e0b0e373c7d21176e9d0a72509af5711c9e5ad3 GIT binary patch literal 604 zcmZ?wbhEHb6krfwc*ejG;VAy~e$?Jd$^5Ao4&M6VRCDm+wtm~3E$42%esVHo>XyfM zZ|{Bc@q2Ff^4%BS%-MWx_rVKirbetxS8bWrf9b^fKMxKcneK7z$%*G2ZaDj~ zYsK}b)|1zFmbNEo{X9N-Z>RVFPY=HT{PXU{hCOYrf4?1kzPD^;hm&u|;U{mtE?GGH z{M_`fPdB)h9=v|#LVV4t8&f@>@9)}n{m0e_CooMnZXPc z1I3>#jO+}S3_2i_KykvrzO%uyskx=KtW>_;vIJHH8A)04ps6!A|k75 zXP05%X>?ZRg0EI08z!jY^=N3$m%%bR*UZ`z5XnWsu-o-CVlwtVin>ID~S z7hSAhdik&RqjeiMZ`--MY2lgH#b-N~oo`-owRPpSo)s7RS6}Q}ce8)f-6`uXPv3BL z`o^o%x8Iw!`P!T<*XC`zK5yHN`P*+y-Tq+Kp2rJ!++4Kt=Hgv9m+ZQ=Y!49KUcUGC z%6)fM?Z2~n|K0fqp07Q0Z{4AL>w)O-y$y%&Z#Z&)Ird=d@rT<^JluW~h#u`Y`Do{<$Gc8H-g5?sp6omKbmN6jn=gIdcIE5#tKW9t z__6Qyul;v^9X)#V#EBE9PMtb^`t-ST=Pq2haPi{BOP4NPzI^%0l`Ge-T|0Q;>7k3y z4_|tI^z!qgS6&>y`r^dZ7pJbhJazrmnH#Up-FkiS-k%G1-dw!%=F;7_SMI&Na{t|l zM}Mz9cz6BbyBm+*KX~xq`Sa%=fZ+4@KY#u(jDn#M0*XIbm>C#&8FWC71?33_jy(+0 zCJoI?yF@hnS48Z5At+%nA@lI0 zv$IUn&-4fiALAC+6%IS4sr0;kj$~2T2}MQqzKN{9*LXM&Ek4FArr}ldg2CL~I45F@-<0!RbFWVM_UCKBe6Q>+DNV<#3lF43EDLm= zWZ!YBDP?nP&FP}dJ+TElGZx>N;WO1UX-!P^q0*kSEeSh9v-Tu5U8tzsUpVc0pW{T^ zhI6GJ(_E5wMJ&5HyZUH$%&O2S=UNtApBb{)&#~VoYHL8ro*dsf?hMobia%Kx*%??F zbU=oI{KUZ4b)c!hLr2O~=J<(>CpC5)X%mGdd6r1@92S%i^iw~P`0I-h$2G?lFFITV z8e41(14JAdSseep2^ux>E5YqoIeuy*dU@oaYXZguhPaP#l>@SN!AH{C6$%O|kcE2!T)tluwW zl3(~#|B(4U;S&NPrvye$4~(528aX2{c4k=2tdN-5Au)49qL&B8EC^1VADJ{iI(J%H z-qf`G=^42*QuAh~70k>in4M8LFEe3bMADMT)P=FBi(=B3$0e>0&sY|pu{JJkTTIsC z#OxJG*=rJWRwU)ENX=WFlDjrJdrv~af{fyYStU!eOPA&rtWGanmtMFkqhe)V?&>BUDLj|rej-u)A6#F)0J&!DmxC;c5QFy+tV_8&&1jLCiEX{nQ*vu(&6@L zC%R@G@1J?HcjlSi+2{M`9hf}t;Ns>)~tL4&T^*^u~^( zH+LMnwe#flJtuDOK6!i3sT+Gw-`aQL&hC@<_ME=E@6`RhXKwF5dvE{g2m8+6IdJao z!E^Typ1*(S!h^#XA0EE==*XpqM=m`&`snG^C(o`ueSZDf^Bd2f-+cZ8h;F?AqL;TA zMjlZ7$->OQ5X+zg@;WF_FmOC$*v%p1u_0l4&{DTfF4j}Q>b_GoT$N6ooVq$pB64li zQm?BDO*11nxmZs4%iC3ddZ3ux-h04%^}7kbS~4#!cJ1I=Yxu-l?Cv6zsWMKGErD<_+fmG_m$7wv%G`+&^yl8mBs2rTnC+aA? z?9?QA3zwb^2`-I`T;gASX>d|;?-iCaYgiz_+~{E1QsN=GsoAwtK*q?VA<-d0%0M$` zfx<;c=T=TWi7g5aADXAC`%aQsXy|;5Tbzj_X@>&ip(Yj%J`o84hK7TWPfX_K;b5=^ E03CFPcK`qY literal 0 HcmV?d00001 diff --git a/img/t/AdminOrderMessage.gif b/img/t/AdminOrderMessage.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe8e87068617dbd21e81bab80b1234007cd2f2e3 GIT binary patch literal 1055 zcmd_p+fP#m00!_gaHJ;71`&-}oPh_J8=J{c6f$&z;<$9IHAbC0DBau;GKb2@<^-7{ zv<^yv0UL8zC*lPY3$;ZTSTCHGmVzKuMO$kJZE1T->AAG$9C|K0{vG@B%lH00e4iHV z&CDu|2jYQ70NDAhYDc9e`}D{sKWd6j-91{4OUC{qhz~g-r8Z+i+F8`sA-8d3B@t=SK_cLB1ILObixF zz|SS1P^=X;jR~4ef+n+|*(7W>l{A>YmQI{#)0TJ4R&{E>@6!FyJ$mM{;io^1wO7U} zJEyBJThI2)o|BvCwD}jc66q~-kIH`W_I#_t*`;!Is@=a2xjKeJSBG8KG>dYLuSXZU zruFyfeYXt$e$Y2ySWt{ZN|Rs7wZ*TrEU7Jil_j9EEIpVC{5`ciFbNM%z{Aslp{JDN zQm4D2)g$ScZ~o2Q(#;Nm?8uni;m})y;N##!8>D|uXl)c|BaAO8vjd;BBa?P?(n(DJ z%OPhL$XPf2#6?;?^pi#Ush57{f}gn~&pDpRoR^;S(KbJAgBUx+yzny)hg zK@k*%F&x2g6vIQ|D2zvuNEGGZQ8-K?ID_I0hSMm)Vnj4dQel#bkQB~Yp@u&1uJ- zVdw4{USj_oU+3H=JM!W7`u&ov^WgiLC*+6nb(wh=(?wu>v0_~McFJ*kS#^6~{`&OR z!u0}GTw(Y2KQg*<(me?hp!eoI-{?1Q^<>npyR`}%7B bg&1Jf8=3Ob*v2z(=+UK1m)^T~ucxPH+qP}*-@mV_s=9XV+RT|VfByVg zQc|*a@7{Im)}1+XrlqCj`Sa&frcC+&|9@6i76TDL@h1x-JA)8|4oEG?P6pPt1uA_h zne&_`DL9@saJ^&FB%m>2?VB2XiH;WKh6WZk_hSnhGECT&+zuRAAjLJoO)pWvaB6F+ zuwsFL$l_yH7hL61=w#-6C}F{x(jMUFrK-fj!r#oxt**w!T_eQCDA>@%&(7V}ro<;y jHA9()okv(XjhBy!eKI#^U$;^-qY4iLL;GeWMFwjCH11XL literal 0 HcmV?d00001 diff --git a/img/t/AdminPDF.gif b/img/t/AdminPDF.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5d9488f3a535ca01398e602f01db56b75abddee GIT binary patch literal 616 zcmZ?wbhEHb6krfwc*el+|Ns9F|Nnpg{{7v%cTe7ac=qhs`$tb7KYINB)}4Fz?!CBu z`}O5(SFc_@bLPyeJ^PLxJ$m@?>3#c-?cKZg#;nHh#4Q2fclD#F0TpaXI{C{7sIk2Wwh@rbpy zwX!#LF$oC>_KQl$af)#^Nhzpm>FVkm7?>+Ea7s**)i*Y^w6U?ZbI@d1EXJx}WMXEu z*4ExxPF-C|j>p3J*zseIti1d}XS)P>czHQ>I5~NE_<2Mx+?b}#&dkcm%Pw|-os*f% zP@L&859^C2LDo(g7D*ANC!a4cv*{E#Ha2mKYnbsYP*-qr5atu$;c!Se)KUMHXTk}F t^$a_UrYxxaVep_~R}PPgK#&R}!=6I*t!qV865A)twkUkJLV$z88USl4vTy(Z literal 0 HcmV?d00001 diff --git a/img/t/AdminPPreferences.gif b/img/t/AdminPPreferences.gif new file mode 100644 index 0000000000000000000000000000000000000000..be9175d6f9cbd54c6c7346cb43c21edbd97e6cc5 GIT binary patch literal 265 zcmZ?wbhEHb6krfwIKse?mX>z(=+UK1m)^T~ucxPH+qP}*-@mV_s=9XV+RT|VfByVg zQc|*a@7{Im)}1+XrlqCj`Sa&frcC+&|9@6i76TDL@h1x-JA)8|4oEG?P6pPt1uA_h zne&_`DL9@saJ^&FB%m>2?VB2XiH;WKh6WZk_hSnhGECT&+zuRAAjLJoO)pWvaB6F+ zuwsFL$l_yH7hL61=w#-6C}F{x(jMUFrK-fj!r#oxt**w!T_eQCDA>@%&(7V}ro<;y jHA9()okv(XjhBy!eKI#^U$;^-qY4iLL;GeWMFwjCH11XL literal 0 HcmV?d00001 diff --git a/img/t/AdminPayment.gif b/img/t/AdminPayment.gif new file mode 100644 index 0000000000000000000000000000000000000000..de6b152045d7d43764f21c99002b3508025ec8c6 GIT binary patch literal 1042 zcmeH`{V&u39LK*yoH9?-I!lEfre$qy*0g9>Ia13!Ka=ZWnAMy-$2oD_8K#&OC(lIk zoMImCWa#dDT<)18jv_JP__*(d&L7clz4rR~{ljZ}ySO^rUm+PI#z;1TJYjT2=l8_C z?29ex56R=j6|>@BvExey6PTY9%Z3u)3@2$UA10Ry(#i$Nl_TKh2JY_Q;Q^kW;N=D0 z-r(Z{zP{k+2mbyL5CDOJ5EKN#!4MJxp`j2K1|-sYeEbH5vU@>+ex&@OM=jT+0{F&F(8ctSqe<0!c^McWWt_2X>TUE zudlDazdxg5lv*XER*BMUBpG$mjCyHigDkUQlJ;(j)+En*FVAY8&Tg5Zx6aVpzP;|2 z(c5Pk9dkLIb2%RrIbCx(UGp^q^UcFQKJk8{-BeyLZES$CNuw$2>$e*kprvK2w@Hqc zC?!;we2yu~KvB7^sK*o)*g_Sy*vMkB*lhOD&=7~i;c~esit>28@$qqiKp+$f#bU8U zB9Tg^)6>&~!WDFCO|011;&MU4QHn%!8kVitICZP_4bldsoc`A^9S49RH;)cIVqB8IiWvDVxY}VG=1l zxxXhyP{R}9x@{)awN6Ze6(MD*m1K~A{IZa>j@Lu=j4bS!6&^QrbM46ZG)694i)MZ) zxRp?-B3WEBzvx{MrXU_UYQrfyXX5gLu5V(QY1Ls(G`!J~hQFVAi!USQ8tfJvUbrh> LBva)2IOOVIo7Y}zT63>` z-ObkZ_j}ge=-7CxW5fNP%@6ywJe;uY(X{Q4X6<=8XV24l`=2e?|8&Wr=PQo9SaFtReMX54USToA`2$rZ<;GsEEU KVGd>{25SHfncgq} literal 0 HcmV?d00001 diff --git a/img/t/AdminPreferences.gif b/img/t/AdminPreferences.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2e2f68e5ef240f250a9d38b20d736984b8944ec GIT binary patch literal 991 zcmd5*{ZEon6h08dC=csg%POFvW2L&WQX!$`VnP!SD6)hpAL>K!fI=lDooadhNJm+rbM)4v;!xHI0 zhnoP$xeSZ>VQbd9teU}D+d}f4jxj^r+_))L@+d~Eo*HTVsI4=q(}$G2md?S3lz`lN z^Zamvwv2G-6yIlT;);l< z^QFeibwd-amkc?a?#hTynjG7Q21!+~xiWg{UE1tK>sa68q}#8J_u^eYzZE~T*c}Vg z{Zgl0XMNw4sxa6s{k_#G=5l`FslapD6$AH0HgoD|b@Wts#&~}t{2xYAUbq|aK>HBd z&c#rYwuYqn!^U_#ii7ii;CyNEB;bP802t1flUyn@A|EHtk~EI8A4sl_yb}Vu9Uz(o=_Af!!E56V?(HO5fB>yqLm_Cs{>S<0U5C% zJPb!AAiN0TR5-6SqLOncL=vbLC%V~)lS&0x#`a_&zq3V;6KceOdPWVCR1A#)NuSE88jD&E1l@RIrt4^X0k!j!lUP{m-5Sf%wiB2~nsD0C* z!Fdt@U!cJFQz=3Kydrr~^u(}npmUGIL$d|VvTb&-<4*EioIw(6Qj23gHjb!`bv)%z z!(eB9Za~8Dyn`s4`L5`x5HlULWdOfmhg-@0Cjfg1lU{y=W^=gb_7qnAlbVrL>qF#{ z3ml&gc>!aO=<0#=YF&}Htb0RSb*(`W5L7s(5qT7s?Ku;zvdRvw@?#M#X$}%(u=g(3 z<9ph(t19Rgi$#v++-2|!{mqkGZsctXuPjj=8#yi5bfoZLzMR6xFNZ|`!I-5#$gP-# z85S6kvwZEY`ys*YOqo!zVuvP}&h++ql|5--0ZorFcG3tdP-RK$Ja!*aUid0&zYf7^ LC#~ftII!<8C@gYE literal 0 HcmV?d00001 diff --git a/img/t/AdminProfiles.gif b/img/t/AdminProfiles.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b909d4a5259478a4e25517a125d4e7d16221402 GIT binary patch literal 932 zcmZ?wbhEHb6krfwXlGzhu2oQ}Q&6c_jE#*=NlD4g%`Go4cd9$0)~KY`q@>oYtktfj z)uFE6qh-*qV>a2qY>I*HEHnE#7Oo3zJr>*ht#A!kYoM@hQrf<#lrR#32SbuZn##?Kq9{953@T&u--yS;q?&OsZ z45MH)1h9pG;!hT41_mPr9grj_PcU#aGNf|Icx+hUDCyC3q@r+xf`FQLl!*$5v*#pH zVfI}K3m-Wg>*p|EN_;cVO6Kf-%goZ=H zqmGFJOy)d-N{$bhcqLgTXgED-KEP!h(Ml0(G{g#xD*c3u`P4h9B?v)fsj HnHa1AdT^-5 literal 0 HcmV?d00001 diff --git a/img/t/AdminQuickAccesses.gif b/img/t/AdminQuickAccesses.gif new file mode 100644 index 0000000000000000000000000000000000000000..d876e5e9c066ae926e6125ffd1ca9d58de9f2c9b GIT binary patch literal 971 zcmZ?wbhEHb6krfwXlG#f#c=laa-BOXwC}CfzPm!_?rPn8tMu-#*S^0__x?KlyQ>WD zt~R^3*7W`ctA|_kUvJZYu)*-*W~0YDjUVqYeX`s5$u9G!dw~q=C%bK*?zMcj-}>&p#~7e^D{o=$pktm567 zg7+t@-d`yAaHi(txw?<%>px%3`*<_u^Y!{qw@SZ1EP8#W`OW#xkLMabU26Vxx#jcq zwlCK^zTE8mdb{iE?e4F4y1w4&`F6kW>xkS{xCTws>Y&+0y@$5+9VYc2G`qp|jA}idw<|sR-?BJN}a>%XG{8otKr^l=_ z)Fk}4-Y_or5ReF5c3}eN0k@gPPDv{`4kz>Y%jWkme4MzbyO~2kNJL-*g9D#d_N5t& zk6XLNH2h}da42kO-+Z3mlYpPjnl+PaE8CFh=;op*lL z%g-;S9GTpGq;1oUHA^nc={?@H=kE5k*OoUQsGWMczjSx;)YFqrK0e-dxar!nb4$-H zs@qq2^#0+UH+Q`L`fBO5rNw)*@4dhF|Nnmm+5p9$ER5_7N(?$6<3WC6U~6`mSTG|{ zL+S96PY(+urUW!C%Dkwv!0DXxp{X_+{A(PA7DTXdF{@ZDt#Fyw|8(t_9??c_S?x_4 zc5EWNyfQU%%)HDZnJqO=l2XDVBEkW3V(iYG5^Nk^+`J;p66`Y40s^e1yaH@uyb>#< fIU{7HdD+;6IhgvCq?wsT_c^gMFz^I8GFSru9^G*O literal 0 HcmV?d00001 diff --git a/img/t/AdminRangeWeight.gif b/img/t/AdminRangeWeight.gif new file mode 100644 index 0000000000000000000000000000000000000000..3583c03038df3fb1425cc446125327df58db9235 GIT binary patch literal 1062 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 literal 0 HcmV?d00001 diff --git a/img/t/AdminScenes.gif b/img/t/AdminScenes.gif new file mode 100644 index 0000000000000000000000000000000000000000..4221ace66c1768651ef582bbf09c47164fca26f6 GIT binary patch literal 1053 zcmZ?wbhEHb6krfwc;3v=9wFNqCD$Dz-xsGaDN$)^iptD%wb>cEbF(!T=4mZ0)LvPt zyS74qL$%?$T8k}p#@icAcGS7N&^-|eHZ%SLyX-GM$|!`-&pd+iVQ``WB{qP@@l&;;MZ6MYX)_B%4w<;WEOqtgS7 z_D(V0H}&|;;N!D`JPw4Om>YU>Zt%(Z!KW97MDAO8c1ifzrQuO$RijRM#BTo|zvKV; z6_GI~vlDjyKff|6Y1jV?tD-Nij*35>cX4%0%I^OOrwdXK+`PCpDt+(&OY34TuZz08 zE+%8&|I6#6QqGlJ*${nYV|3Pm|5rA~WFLB;eei$oq5s#m#OEFUpL^m)!IA%kNB);w z4JbPLzxdeylH>nNkN>Z};oW}pN!f}2H8*|gZu&Od@^88ou>Qo%&O2ezm2%?iKvFm+<`I znx9YGem(E`^}O%Z%Y*+%!9aw7;y*#>qSVBa)D(sC%#sWRcTe8{2F0H&j9d)=8FUzc z0F+S}IG!^6=ali-@L)d=hj7{khKG*KY}_I$4igl;MKuHF7#JEIVds-J%{XH)A@LMf z3y-YRlotzJ8+m+!N%5ZF`e*RUw#HN9Btrn(Q&bK zJj69s-TTCfo6Zg`4Lptt3YttxE|Zj<8ooR*eBjK$Z7KIh;$dn#pQO1@#RG)}%nTf6 zQX3){tMkt@$v8JdQrLmHf!#zxVqfy|zBv{J_jWKkFgi3#h^r_W1T-9AU}R*FnZeM& p$RnodHATQBy>C9Rgo?`w28Bm1mzD)GOZeSc@bU2pRyGy}YXGt`wVMC{ literal 0 HcmV?d00001 diff --git a/img/t/AdminSearch.gif b/img/t/AdminSearch.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ddb543b821d150f6a9208c6d80097e648014929 GIT binary patch literal 989 zcmZ?wbhEHb6krfw_|5RtP|Z{6e0O;39^KbyGz@x%>JCU1T+W%JW1Tb@qa@@)FHXEU}vo4Mopter3B?0PYG z&x?6`UoP19YSDpLix0kDeCYMk!>^Yed42fs;iE^79zTBk#EBCpPo6w|`t+GIXU?8I zd+yx13l}b2zI^%W)vMR8UAuAP#_ij;@7}$8@7}!!4<0;v^yu;9$4{O-dHVF}vuDp< zym;~R=g(iie*OOa`_G?0fB*gkdwP@@4FOOHDE?$&WMKHupabH7@&p6NE{5qEj!8>S z2q-!>{P=NvL!yv|fU;fXrNxPdl>_Evlw4YJaw1ehkTrfDnFE5|8r{JIyYnPCc*oq?`j8|~3kP}+5<-!-2 zPC+?~9D@ZyOkBdsP9+Z(Bsw*=a7$VpI91lv!ojQ-mU1GYk%@(!OF+Rup}~EEqPtz; kp(83@Q+2Fo*;G2Kp6i^Uel37=J3GIuMb4E4f&vWI0J2~I=l}o! literal 0 HcmV?d00001 diff --git a/img/t/AdminSearchConf.gif b/img/t/AdminSearchConf.gif new file mode 100644 index 0000000000000000000000000000000000000000..63b11643cf20b43ded1dab4a9a302e73504a625a GIT binary patch literal 355 zcmZ?wbhEHb6krfwSjxaKB~E6_raOCXeW_V=<;lB0d-_7|Z0ou5=*yZ@Z_X?#*>dU4 znOk3`Ok48j*Pk_2E=Oji+*OL=l= z&Xs3hwg3f}m2A28WzM2CNA7+3^6tr;G?h8K?zAksvgX{EEtkHWx%cJIzdw80e2&b^ zx%2MNm31w9t^rMZa^}&WBhymeoLY0`*`G7ZYNo6@a^&8h|Ns9p;0B66Sr{1@%oub) zNd*lET?6D3#$I-asHb-KIp zKRhzehef()(hABZI+}XZMHy9? nRpdDhjrl|ZoOwA7r1-@*Y}8_9W7x4#Qb};%#%YHG92u+u%DkrU literal 0 HcmV?d00001 diff --git a/img/t/AdminSearchEngines.gif b/img/t/AdminSearchEngines.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5dd1e7b247369a3f7394fd079fee02bbc954fc9 GIT binary patch literal 1013 zcmZ?wbhEHb6krfw_|57n&Tt@98);%IN-2yKCVs8E7UK3@UCu+D)(es{a z95`Jue1=B!Y|Xg&Rxt}~lIQ9t&o@k+Z?t|jZ+m8<-StN8 zTN4cK&M>;a(DK}5ha)qBkIf0cFvI!k0ury(w|&3f_55}R$c}w= zB>&aXvhPn)zdfw~_N4mzle%dK8>Sy>nsKOk-qDVQ$GVoD=v{GY!m85~*PflS;oP+A z`}^)4oBsNA_qz)dKi}$pdVb;8hfUufwSIrv@cn7y_oq!io_GFu-uwG~>-T5#f4rRX z^Yy%+Zx;T1wffh)HNW0%`0;YjulKwEd|mhZW^M89dJO$Y2X$GI$ zvQs&YQ(l~_@QWvNG1n|5hgU5D6303v6@5(ter$AW;c2s+cSLd#%c)jDzNj-29m*4A zH6;x~CNLzOW@q6kJmC1~u#>o6^p+I|9wi>ImuYw+^D;4oX}XAp&jgJ`)g}hnlBN#{ zLC+ee=|rrXv*MED!B|_DNfRP3DjZ~F7Fbabp-|vHPa`LyLNOwNxw$bp>q5szSH(sK J7G@>}YXFIfOm_eP literal 0 HcmV?d00001 diff --git a/img/t/AdminShipping.gif b/img/t/AdminShipping.gif new file mode 100644 index 0000000000000000000000000000000000000000..482ceea3cddf5a48431d1f910553c60ea5683cb5 GIT binary patch literal 583 zcmZ?wbhEHb6krfwc*elsZK-&DWA(N=7oCJ9)tm3CN6ml!>A$L}@A3J?n>TMxPEI~@ z8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=Wd5+f(RDWa!bSJAavQ){rZQJNQe-ES%d!H z^xzY5m1xB|ZFumMAk{&AVuyw@uuLxsd5c|?;M=SJfOfhshh85+?XEzs28 zh72O)P(b|vgBfUWL-d*@STakr@tjPqEnP_rTn7WQWwh<(ph%So>OvXeeX9^}UgV~tL?99O|7O)r#S)3(U z#0pkpC9AUrtJuJ1Y-Dq`U=sz(C{j)Z)e&^!=AgqJ(TRA1C-X#4?kPOUGd!DTdUns@ zSzh49ywHn#2`};rujZ9r-D`N2H+VB|^yc2en_O_2i!OJCtJCjhTYv!%L^mT6B3UFx z@<jqM75}l>QN)Aq9K|^V>FKz(G)_+LJWB*LRtwz zccUZex_YrkAwkKMsN_naBxNX@GL>C9l%)a{Q=y8hgo;$5YN}Lq)liih)J%YG?zvwr*Hoy+?UZ=8PZ~odG7A1$vuPF zeV@O1dp}2?nRxrbhOaM;J$-uc_{8tOo`2`5Zx6h_dF;8RSB_u)?!}=m=05r0*2u+~ z`ww@V{&4=}?14Y;@7lWas~bP;UwiNDr|Y)wnVnd=z4*e$-6QKKcxU*?-jOQ>FZ~Ni CJm0_o literal 0 HcmV?d00001 diff --git a/img/t/AdminSlip.gif b/img/t/AdminSlip.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5df19aaf2db300b653d232adaddcc758780a56a GIT binary patch literal 1027 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 AhX4Qo literal 0 HcmV?d00001 diff --git a/img/t/AdminStatuses.gif b/img/t/AdminStatuses.gif new file mode 100644 index 0000000000000000000000000000000000000000..f15768f1336a06d62e156e19f94f304f34fb15a2 GIT binary patch literal 618 zcmZ?wbhEHb6krfwc*ejmz0B?2)%iL7#}BWnTC-#CnK!>SOp9E1<^ADJvu>Z?R#w;0 zzw+X~Q)iw(x^wI4^C@%Z&2LJ2@#p{f!&~;Qp0arDhWj^2={tAp#k-e}FCAX~_|vb8+Z*p*-c~j1Wc$jSJLhB{-MaSd zmaKKl1tO*Qsl+RxY}E@B8<6FCMJw_PcO!;(^;A?!EnZ zc2CWsZFk;%_;7CboKHV~Ebq=Jop|Kg_y0G}Z`-%HV8_wZk8hrszWL7Kix0b&U7S}N zK7I9}J7=anynEpNpZ`Gc?)AeLkMCW3{PEnDns;xW?3$l@<-q)DB|%GCV=C$!uAJC* z{{H(LXBM8@)6zQc#E!#Eym`_{kw_N!;@ zwU%Yq?|=P&d3O~9xj^wJ3nM#&AA=6a08pGTupe*mYie$3Z8Z&5Q3(pNHEr|b%yA8{ zvC&luiEQQc_Lr10GO|_>)tKF+sAZ}zl`1YCXf5RwuGnPDxxmkcPiMcIyR&c;v#xcZ zjv;@%9gBsBl6{kNut!FMPJ{@TOR__nXOo7hm~w`t9#@JWE0fP7KUr073rA%GOTlb* zHFJR`0UnDYC8x>F?CAoA9~7@n)s^te`1sJdTS_%%jf130<6$s eJP=ar;gi<(lWO|Jc&JNMz|N%M$mReA25SI>dNZp4 literal 0 HcmV?d00001 diff --git a/img/t/AdminStockMvt.gif b/img/t/AdminStockMvt.gif new file mode 100755 index 0000000000000000000000000000000000000000..2a85c456cf8fff5023155d8bd8aed23ed6ab7e1c GIT binary patch literal 1709 zcmZ?wbhEHb6k!lyc;?UGk-{F3%Wf0GBCo>~RLJR-#vYYx;GW1Dl&RpK!yZ?z;S$HD zY{cl1%7m(3BGW8j&}?w-Kv8L4UM&uSgW>Kf1H6wMlxuAykaSk&eon9rWy z;^Z8|mfz|msm5sJ%IuTDrl89dmZ|TP#ZlbhDXYaOtIcQ~#9|-8Y8%3$W5*Pbs%+rG zZ0yS6n<^2QA*b)a**qyJxz-@4fHS^KKRnwYvP@Fj7N|@$BugbQTT;P*F}_kgC{@QP zRKh<^);5$Sq)5myk~O|cJ-$@mF-$17RKp{gHLgMHY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C z$yM3OmMKd1b_zBXRu#Dgxv3?I3Kh9IdBs*0wn~X9`AMl(KsHENUr7P1q$Jx`$q^)> z0J76LzbI9~RL?*+*}%*|!OT$4(AdP>++0V&$iUD*-@r)U&`8(N+{)O<%D_MY3Y37h z6{VzE1-ZCE?E>;_l`=|73as??%gf94%8m8%i_-NCEiElUW*8ai0#)c1SLT%@R_Nvx zE5l51Ni9w;$}A|!%+FH*nV6WAUs__T1av9H3%LcpzHo!{iuJ%A(o4?I)vrh_&^OdG z(9g{U`3tPNxFjeQ;S8**i$f|4QuTvUi}Op1l2d`om0_BJVTa!$kV2qqto(~IfsvA! zP;G0~2ExV$P$&N=+=uFAB-e&w-_YfQ9{rvI$+t)9jKYjf0{@vR*uV1}<@%-7-CyyUJd~pBX-8;8$-Mn%A+SMzU zFI~KF{@mF!r%#aDv3%Lm zC5sm=Trhv$+&Qyn&73iP+SDnNCrzBt-`CsI-PPIA-qzaE+|<}mUsqdGT~%38URGLC zTvS+)pO>4Hot2r9o|c-DoRpXl9~T=F9Tgc79u^uB926Mf@8|2|?d9p=?&j*^?BwWR zZ)a;`ZDna;Zf0s?Yy`}fdb&E=TACW_YN{&AN{R~daM-~o)MomJ27c}WbT%v!nIiiThfYlX4dX6 zs@qf6=&d_3)?z}u)$|mLDJeFK3+$Ga*={d4*;#G2v)XERolS3|@ARzD`2{YEO5JzW zIc;vR+tqBnyTN8xi`C9no4t*8dt2=rc2qX)tX|jPyP?5pOS9vycBftK&bvEZ_H;V# z?{wPK60or+W_NGso{6D*XJt1WEIHWjcBtFqaIg1~3BHG>h8>y~er#gEvB`nQCI=mx z5_D{8@Uf{ON2Z4!nI3jzdibF^X(wkV9ba00eogI#Wmy+j=3QDmENjg5^>O--$>t?ljYot>RsU0vPX-M!siJv}`W`+Fx$m@sqZ%sF%B%$qlF z;lhPWmMmGeY}v|{E7z=9(|@XE@$vaf4lY`8ZQ+^Ir!Jg7d-ckt+qZ7sxqb7&y*rN| z-hcGy(bK0--@bkO?%lih@85s;@Zsafk6*rg`S$G_IC4e_+J=DQPZmZ7hW`vYAZtK* zf`Q{S!+%a0j|~eB*6aDqF({g#(4`!?#pLJ35Aj?o(K{+Qjh7xjDB-!wrqR%ubDE+h z*QJC{s$KoI)g>G|nOcqeMRMb# z`8}%oe}0s_`f|QqfSD~UvbiIGiIrPIz-o${tD{*Phi=B>V+W&H+0Kh7U3tJOW0)-{ zvPbZt-$M4nClfSV*qhm`|6Am|n6S`kfno8B8H`UB`U!F|=J@PzSkTaHly+f-WdcJJ NE2EH>91jPBH30b-JO}^) literal 0 HcmV?d00001 diff --git a/img/t/AdminSubDomains.gif b/img/t/AdminSubDomains.gif new file mode 100644 index 0000000000000000000000000000000000000000..8554b38b5d8ef0443b0620522c94c726f7eba902 GIT binary patch literal 1071 zcmd7R?NibR00;12C)ZhelWs20Yipagb=T@e+j-@xyHc3CfrdTU!FTSt8FTUTr&vUar z#lrzO@F%b%2a%J5Kq5ZN$wubBhC-uI=mJ#n7loG!i;9ZSw@^i;n9I~+EUES?sUFX{ zh{NGZ38e%Ap`xOqvbwUWs)|IZCR4~13WdbMGdN@_l}e-0=uA4Zo>^aC&tkDCw}q#8 zC(hhGea6c~^0Lo$=3`pXn9-|P!==mGFLB_NG9muvJw|nV1@Y0f>TzsMe;G+fWc8FY zbhT`#mNP=n^;8vv2nBQHH+(h32!j-1Qf)VBHUiyFtg{nYHVWHG=1kSn7T675I=1;6 zG*_3$GhnrP2A9v^3fO!hadh-TyS+r?xY0XRV(?Y=n9GM|%8f4469>uUs(~!zQ9Jqj zS;{1@#w(#md9+{$$!f%f)wgXB+pE9joaRFf-08ZO2?pq3^Y}b|Q=>p2;5CcHpcn)} zsZ=VH$>ef*cXzj3-K-tx*XeYFgM$zR2`&7_@SO)<0qAT3UH4>ek;LEF9*}efTf0LK zJC|o`2Hggs0_C$=i2olsVUkv5K`*{kTI$- zgdo+**P6|tffuHcAA5|OCb8KmdKzk(4Tz@aB(BIq-+X6yPU&%LmS*}qR{hef%I{Z4 z0{zhiTT4hkgzCG}uvKRhD$eQ)U;X{EqPXXx z`8cg_#fp+=h~Ru!yE7p*+%Sns>)Msc(C*7hun0=tfTdy-inGA(k*wse?r>e5 gC#fg7+zT4_fxXFZ<|p^!@YzYp=|_?AG&peTUjpaoQ~&?~ literal 0 HcmV?d00001 diff --git a/img/t/AdminSuppliers.gif b/img/t/AdminSuppliers.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5cb1f263cafa5c94545520fd8d7dc129be0eef3 GIT binary patch literal 266 zcmZ?wbhEHb6krfwIKsg29|+Ez`G02S|CvCPb_U1;@_A!vh=Dc=Ffg#T zD=74(WX@Ar$m6wI$7{(HuZ9~;N-7>9Lc10?Oq`t3BXodgsild8)KZrw$Fx>_xpP{!W;##QSh{rS*|W!O zx&`08dy%owq<&Mv)C2Wv&Q5;z?C#pNYrUr$8@7oYJ$f{HzIEav*TCsYOHTAS_ls4p z3%Pvxtmj0T{@ul!Hf?(P^l8#u!-h?f*-M=sK73fb%FnEw>&%%m*^6wZ9c*mbni{vj zX~EIX-ko{NPxq_Wvsm|trY><0o38HOFZuufe+EK8@h1x-JA(;>4oD%$PYi4o4zmh8 zbfo%EED7TLB{A>9iWZeA8cH|TOq(pA#xZq6L`|2(9+sm!ilkaB78t*+=9>RbeTv7i z3F=A}8XCNc(t4`K>1>QVy*#`E6ZPbD4AlYy6a{p3wfOin#q`}+^(1w4*fk9~+$ChC WxW)Lzg}qG-w6|>+VQ_I|um%8vSAN+5 literal 0 HcmV?d00001 diff --git a/img/t/AdminTags.gif b/img/t/AdminTags.gif new file mode 100644 index 0000000000000000000000000000000000000000..a01d9ea439b1a44e5e42da66e419728130365bc6 GIT binary patch literal 981 zcmZ?wbhEHb6krfwXlGzZOG_&)E&V6+arW%lbLPyMH*em81q+reS+acj@>Q!=tzNx) z&6+i9*RI{LVZ+9a8#is*w0ZO9ty{Nl+qP}{_U$`%?AW<;=dNA5cJJQ3XV0E}`}XbM zzyH921BVU)(V@eK4<9*l_~;QJdF1HPqsNXNJAVB5$rHygPo6q;>dcul zXV0EJckbNz^XD&LzI^2h5M8-?_3E{2*REf`e&fcCn>TOXx^?T$ojdpL-Mx43-u?Uc zA3S*Q@ZrNpj~+dK{P@X}Cr_U~efI3x^XJcBym;~Q<;z#EUNMY<(GVay1QdU=Ff%YP zG3bDFfbs+b$0i0=4jGRP3l27Our7;eaBw~(ZlShf0b_D=W3#E6N`#>DQ4V1t1(7L* zO>R75ibeq)3ltA9HVG!J@$h7H;^YyHkWnz$;Mgr-p;+)Cu*HLqn}KcB41q;#9sCYW zUtTCaY2#>84!9#>q|(tZYgH!T+0giaRmryO2g4=j_C7i13=fHnrVf5N+qx~Rvz#}&7XgMT7P%dxkqQ0-C7VaH#Bp3+U#@FrX8G8xwWKiU(=TR>lWRZbL#2w zIajCN{d_ZTZPxqm?>1gt*Sx>BX?uOpOuw|XNk9I4?>^Kv@o4wTJBwx>nzrlSwzADd z(euOazq@3XD36`9iv4j4Iu|ISLB- z%DT*&N__GPA`&dplKf&~x<)KQ?3{c|Ox*md#gye)c{JFZ<@H$9)>w)Oo9Vc-F=-l# ZF<7vNs+bzfDsdjXro$s}&B>9$8UUw#}&7XgMT7P%dxkqQ0-C7VaH#Bp3+U#@FrX8G8xwWKiU(=TR>lWRZbL#2w zIajCN{d_ZTZPxqm?>1gt*Sx>BX?uOpOuw|XNk9I4?>^Kv@o4wTJBwx>nzrlSwzADd z(euOazq@3XD36`9iv4j4Iu|ISLB- z%DT*&N__GPA`&dplKf&~x<)KQ?3{c|Ox*md#gye)c{JFZ<@H$9)>w)Oo9Vc-F=-l# ZF<7vNs+bzfDsdjXro$s}&B>9$8UUwot-4PAXRor zj>hs_jb*u7Yl;ommYS}qve{H-vboH3OS#$hDyy9}cDrirKR7ymi;jAm9r>*^|DV{0 zNmFYZw>$K0aht%^UowCeb>nzM^auP-gXwyfgLlJXl%DsC>Rys@n6=E|Bo zE9<|s2fggielRuR(VX;0bF+T0a{RO=_T&EOpPQo}FD!bpsPM^>(r2qHpRK5QzP9f9 zx|-+fYM-yKf4-sq!~XQ&=dAx<)&74~=ig<+-xr;JUyb{JAou^H+;b}%&TpP@ZTFm; zJEq^?HS6x)xnEnG9ZTWnC*Z=?j8Abs(1QdU=Ff%Yn zGw6VLpgh6AagV{ALuLnKkdR6}ht{19&pqb*PJQ)d!^Q$;e(PmtIy8g3MCME9u(5Ro zyS9oLWgNTn^3q8m*2WpnW<(XbvCc3E@niUL;H1YaUOlnIj6+GM#PuSrmT+uvJE!f``Zo|B9vxhr*{9m=$I{NhuI|)y^tAosY+Wfi}Jkr$;Lft>m1{p&+23 zJh92la@vK3Q#jjMq$c`^Jec6l$pckkY9JM*?12v*!! zzI=Jtn#Tc6R~wh!ub6jl_O@qh4!_!T;%)JidlNT2`Tzev166_IPZmaY22}EBI#)}W~M>>Qw?N|gZCb;)9>3co-QMlm5Lx2^&UO87Vp52@_$+7%3$GOq2ZJ>Ldmb%# literal 0 HcmV?d00001 diff --git a/img/t/AdminTranslations.gif b/img/t/AdminTranslations.gif new file mode 100644 index 0000000000000000000000000000000000000000..af91f09a4c9b8f1d5a19ddfef5604e2a3a557cf7 GIT binary patch literal 919 zcmZ?wbhEHb6krfwXlGzxW@ct*XXobT=HcPt=jRs`6ciB=5fc-WkdTm+l$4g1mX(#2 zlao_WP*7G@R#8z=RaI3}Q`6AU(A3n_*4Eb1(b3b>)7RHGG&D3aGBP$cHZd_VH8nLi zH@C2`u(Y(ava+(Vv9YzawX?Icx3_n2aBy;Ra&d8Sb#--fbMx@<@bdEV_V)Ji@$vKX z3knJf4i1iph=`1g3~$?>JMCcQyrV74PR-hOW#jR?d(J;Pe*O8S`)^*p|N8&`e}+*o z8UhrDfZ|UUpc(%ebU-G7@&p4%2}3o9jK_ur2b(#H-#BCxwDmR`CF}@DT$Io!Z7gOa z@?*lW!*V(S6MigcT+kHLziHC~LtsJ}}G8zU9nui2r^n5A~C^RxMF)=Z0@cNeEz+epkgkWV= literal 0 HcmV?d00001 diff --git a/img/t/AdminWebservice.gif b/img/t/AdminWebservice.gif new file mode 100644 index 0000000000000000000000000000000000000000..a37e6ddce98b981a1b72fb78548d2266ae7e82e5 GIT binary patch literal 613 zcmZ?wbhEHb6krfwIL5$W;x(mZ*_kufp14$PS+eg*O z6VtS3$)+ndK`kw-u7m*HaOg=%-6g$t<8Vp2W26S+eVnNzj~- zx;;w{y?OKL&yjOL8~^weZAs}nQnTpF|Ns9PXaE#{vM@3*Bs1uM%m&2?1N)(d8KlZ7J!G$SOrOM2WUS?^6h}r q@v-AFr9>BpO2@;^V$ve)KM!nb<=~c)4_G4O(%9HOb3GFygEat-F$%^2 literal 0 HcmV?d00001 diff --git a/img/t/AdminZones.gif b/img/t/AdminZones.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d5dcd2fd93629e435424559e2179e0af340159d GIT binary patch literal 1065 zcmZ?wbhEHb6krfw_|Cv!Tx~FOf2~vVwy+gdGoS8Dot>1kb?=;mn_BkPUVgR3?qZqi zh0M4W>pZ*Mnon<8cYWg7=j&EpIGla4|LXgzWowH9mfk8nnzG{E$*vRE{bsvouS&{X zakT$p>zpIAYAzPdzqCJX_wLQNj-+lV51hH9VbhVc+of+lzbQF+I{wDe)z_C^es$sa zi?vNR8qyX;Mz6b-HZ?MJ!rwZn-x-b@SP-Tid5xzP0TBnXG;B85^!o zI9@sBTzAgl&H0OSijQWuZp%-Z*HCb6X6?b^%qP9NO#OGUeG6~Q%-wx7 zV6xBB+gBaCZTk0BTz-3Q%Fz~vkpvWfvM{nU%xBO6c^Z@_7&!hj*mM5*qSndIEheWr z(_llQ7I#Nc30I-ItC$|IeWAjWltbE5O&>%$8M;p%Ftb|rWoAN4sHCL?!`+)r4GUUb zf_P?T1wHOk_U5Z_IKiOKIn~u(@5Bs~m0TQ#?q|+KIv;dya&quGS-|qxrPHEtnt|h% zQ-?&v=5Zu+x*X@?V&$&MXqa$(4Lj!?rJWBJuW}b>V~%pz@R7qwBgDU8M}gqdNezO{ zNj!>&pB~gy37GQ0BDhgxwqRmRpw +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/tmp/index.php b/img/tmp/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/tmp/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/index.php b/index.php new file mode 100644 index 000000000..4057bdc9e --- /dev/null +++ b/index.php @@ -0,0 +1,30 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7076 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +$dispatcher = new Dispatcher(); +$dispatcher->dispatch(); diff --git a/init.php b/init.php new file mode 100644 index 000000000..52ec3a486 --- /dev/null +++ b/init.php @@ -0,0 +1,29 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$controller = new FrontController(); +$controller->init(); \ No newline at end of file diff --git a/install-dev/classes/AddConfToFile.php b/install-dev/classes/AddConfToFile.php new file mode 100644 index 000000000..c3205de4b --- /dev/null +++ b/install-dev/classes/AddConfToFile.php @@ -0,0 +1,91 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AddConfToFile +{ + public $fd; + public $file; + public $mode; + public $error = false; + + public function __construct($file, $mode = 'r+') + { + $this->file = $file; + $this->mode = $mode; + $this->checkFile($file); + if ($mode == 'w' AND !$this->error) + if (!$res = @fwrite($this->fd, 'error = 6; + } + + public function __destruct() + { + if (!$this->error) + @fclose($this->fd); + } + + private function checkFile($file) + { + if (!$fd = @fopen($this->file, $this->mode)) + $this->error = 5; + elseif (!is_writable($this->file)) + $this->error = 6; + $this->fd = $fd; + } + + public function writeInFile($name, $data) + { + if (!$res = @fwrite($this->fd, + 'define(\''.$name.'\', \''.$this->checkString($data).'\');'."\n")) + { + $this->error = 6; + return false; + } + return true; + } + + public function writeEndTagPhp() + { + if (!$res = @fwrite($this->fd, '?>'."\n")) { + $this->error = 6; + return false; + } + return true; + } + + public function checkString($string) + { + if (get_magic_quotes_gpc()) + $string = stripslashes($string); + if (!is_numeric($string)) + { + $string = addslashes($string); + $string = strip_tags(nl2br($string)); + } + return $string; + } +} diff --git a/install-dev/classes/ConfigurationTest.php b/install-dev/classes/ConfigurationTest.php new file mode 100644 index 000000000..6b5492e2d --- /dev/null +++ b/install-dev/classes/ConfigurationTest.php @@ -0,0 +1,225 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ConfigurationTest +{ + static function check($tests) + { + $res = array(); + foreach ($tests AS $key => $test) + $res[$key] = self::run($key, $test); + return $res; + } + + static function run($ptr, $arg = 0) + { + if (call_user_func(array('ConfigurationTest', 'test_'.$ptr), $arg)) + return ('ok'); + return ('fail'); + } + + // Misc functions + static function test_phpversion() + { + return version_compare(substr(phpversion(), 0, 3), '5.0', '>='); + } + + static function test_mysql_support() + { + return function_exists('mysql_connect'); + } + + static function test_magicquotes() + { + return !ini_get('magic_quotes_gpc'); + } + + static function test_upload() + { + return ini_get('file_uploads'); + } + + static function test_fopen() + { + return ini_get('allow_url_fopen'); + } + + static function test_system($funcs) + { + foreach ($funcs AS $func) + if (!function_exists($func)) + return false; + return true; + } + + static function test_gd() + { + return function_exists('imagecreatetruecolor'); + } + + static function test_register_globals() + { + return !ini_get('register_globals'); + } + + static function test_gz() + { + if (function_exists('gzencode')) + return !(@gzencode('dd') === false); + return false; + } + + // is_writable dirs + static function test_dir($dir, $recursive = false) + { + if (!file_exists($dir) OR !$dh = opendir($dir)) + return false; + $dummy = rtrim($dir, '/').'/'.uniqid(); + if (@file_put_contents($dummy, 'test')) + { + @unlink($dummy); + if (!$recursive) + return true; + } + elseif (!is_writable($dir)) + return false; + if ($recursive) + { + while (($file = readdir($dh)) !== false) + if (@filetype($dir.$file) == 'dir' AND $file != '.' AND $file != '..') + if (!self::test_dir($dir.$file, true)) + return false; + } + closedir($dh); + return true; + } + + // is_writable files + static function test_file($file) + { + return (file_exists($file) AND is_writable($file)); + } + + static function test_config_dir($dir) + { + return self::test_dir($dir); + } + + static function test_sitemap($dir) + { + return self::test_file($dir); + } + + static function test_root_dir($dir) + { + return self::test_dir($dir); + } + + static function test_log_dir($dir) + { + return self::test_dir($dir); + } + + static function test_admin_dir($dir) + { + return self::test_dir($dir); + } + + static function test_img_dir($dir) + { + return self::test_dir($dir, true); + } + + static function test_module_dir($dir) + { + return self::test_dir($dir, true); + } + + static function test_tools_dir($dir) + { + return self::test_dir($dir); + } + + static function test_cache_dir($dir) + { + return self::test_dir($dir); + } + + static function test_tools_v2_dir($dir) + { + return self::test_dir($dir); + } + + static function test_cache_v2_dir($dir) + { + return self::test_dir($dir); + } + + static function test_download_dir($dir) + { + return self::test_dir($dir); + } + + static function test_mails_dir($dir) + { + return self::test_dir($dir, true); + } + + static function test_translations_dir($dir) + { + return self::test_dir($dir, true); + } + + static function test_theme_lang_dir($dir) + { + if (!file_exists($dir)) + return true; + return self::test_dir($dir, true); + } + + static function test_theme_cache_dir($dir) + { + if (!file_exists($dir)) + return true; + return self::test_dir($dir, true); + } + + static function test_customizable_products_dir($dir) + { + return self::test_dir($dir); + } + + static function test_virtual_products_dir($dir) + { + return self::test_dir($dir); + } + + static function test_mcrypt() + { + return function_exists('mcrypt_encrypt'); + } +} diff --git a/install-dev/classes/GetVersionFromDb.php b/install-dev/classes/GetVersionFromDb.php new file mode 100644 index 000000000..d18c7b02a --- /dev/null +++ b/install-dev/classes/GetVersionFromDb.php @@ -0,0 +1,665 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * This class search Prestashop version from current database structure + * + * @since 1.4.2.3 + * @todo (priority low) compare index keys updates ; compare types range ; add custom methods to search versions with no SQL updates + */ +class GetVersionFromDb +{ + /** + * @var array Because of some errors and differences between some upgrades files and some db.sql files, we need to ignore some fields. + */ + private $ignore = array( + 'blocklink' => array( + 'fields' => array('id_link', 'id_blocklink'), + ), + 'blocklink_lang' => array( + 'fields' => array('id_link', 'id_blocklink'), + 'keys' => array('primary'), + ), + 'cms_block' => array( + 'fields' => array('id_block_cms', 'id_cms_block', 'display_store'), + ), + 'cms_block_lang' => array( + 'fields' => array('id_block_cms', 'id_cms_block'), + ), + 'cms_block_page' => array( + 'fields' => array('id_block_cms_page', 'id_cms_block_page'), + ), + 'cms_lang' => array( + 'types' => array('content'), + ), + 'log_email' => array( + 'keys' => array('date_add', 'id_cart'), + ), + 'newsletter' => array( + 'fields' => array('http_referer'), + ), + 'order_detail' => array( + 'fields' => array('group_reduction', 'ecotax_tax_rate', 'id_currency', 'reduction_percent', 'reduction_amount'), + ), + 'webservice_account' => array( + 'fields' => array('is_module', 'module_name'), + ), + ); + + /** + * @var string Path to install directory + */ + private $installPath; + + /** + * @var array Store schemas of all upgrades + */ + private $schemas = array(); + + /** + * @var array Store db.sql schema + */ + private $generalSchema = null; + + /** + * @var array Store current database schema + */ + private $currentSchema = null; + + /** + * @var bool If set to false, will compare all data of each table to get full error log + */ + private $fastExecution = false; + + /** + * @var bool If true, fields type will be compared too + */ + private $compareTypes = true; + + /** + * @var int Store microtime of the script execution + */ + private $totalTime = 0; + + /** + * @var array Error log + */ + private $errors = array(); + + /** + * @var array Prefix for current database + */ + private $prefix; + + /** + * @var string Found versions + */ + private $versions = array(); + + /** + * Constructor, launch the compare algorithm + * + * @param bool $compareTypes If true, will compare field types + * @param bool $fastExecution If false, will loose some performance but log all errors + */ + public function __construct($compareTypes = true, $fastExecution = false) + { + // added for compatibility prestashop version < 1.3.7 + if(!defined('_PS_CACHE_ENABLED_')) + define('_PS_CACHE_ENABLED_', '0'); + + $this->installPath = INSTALL_PATH . '/'; + $this->prefix = _DB_PREFIX_; + $this->compareTypes = $compareTypes; + $this->fastExecution = $fastExecution; + + $start = microtime(true); + $this->generateSchemasFromUpdates(); + $this->getDatabaseSchema(); + $this->versions = $this->searchCurrentVersion(); + $this->totalTime = microtime(true) - $start; + } + + /** + * @return int Get total execution time of class + */ + public function getTotalTime() + { + return $this->totalTime; + } + + /** + * @return array Get list of differences between current database and all upgrades + */ + public function getErrors($version = null) + { + if (!is_null($version)) + { + return isset($this->errors[$version]) ? $this->errors[$version] : array(); + } + return $this->errors; + } + + /** + * @return string Get found versions + */ + public function getVersions() + { + return $this->versions; + } + + /** + * Add more informations in database schema property in order to fix some troubles with missing data between db.sql and upgrades + */ + private function completeDatabaseSchema() + { + // Add key "discount" in "discount_category" table, because the name is different between the 1.2.2 upgrade and db.sql + if (isset($this->currentSchema['discount_category']['@keys']['id_discount'])) + $this->currentSchema['discount_category']['@keys']['discount'] = $this->currentSchema['discount_category']['@keys']['id_discount']; + } + + /** + * Get the schema of all updates + */ + private function generateSchemasFromUpdates() + { + // Get list of sorted upgrades + $fd = opendir($this->installPath . 'sql/upgrade'); + while ($file = readdir($fd)) + { + if (substr($file, -3, 3) == 'sql' && version_compare(substr($file, 0, -4), INSTALL_VERSION) <= 0) + { + $list[] = $file; + } + } + closedir($fd); + usort($list, 'version_compare'); + $list = array_reverse($list); + + for ($i = 0, $total = count($list); $i < $total - 1; $i++) + { + $file = $list[$i]; + $next = $list[$i + 1]; + + $this->generateSchema(substr($file, 0, -4), substr($next, 0, -4)); + } + } + + /** + * Generate the schema of the given version + * + * @param string $currentVersion Version name + * @param string $nextVersion Next version + */ + private function generateSchema($currentVersion, $nextVersion) + { + static $storeTypes = array(); + + // Load db.sql once + if (is_null($this->generalSchema)) + { + $this->loadGeneralSchema(); + } + + $this->schemas[] = array( + 'name' => $nextVersion, + 'struct' => array(), + ); + + // Read queries in upgrade files, and reverse structure from db.sql + if (!file_exists($this->installPath . 'sql/upgrade/' . $currentVersion . '.sql')) + { + throw new Exception('File sql/upgrade/' . $currentVersion . '.sql not found'); + } + + $struct = (count($this->schemas) >= 2) ? $this->schemas[count($this->schemas) - 2]['struct'] : $this->generalSchema; + $content = file_get_contents($this->installPath . 'sql/upgrade/' . $currentVersion . '.sql'); + $queries = array_reverse(preg_split("/;\s*[\r\n]+/", $content)); + foreach ($queries as $query) + { + $query = trim($query); + + // ALTER TABLE -> add, delete or update fields + if (preg_match('#^alter\s+table\s+`?prefix_([a-z0-9_]+)`?\s+#si', $query, $m)) + { + $table = $m[1]; + + // Alter drop index + preg_match_all('#\s*drop\s+(index|primary key)(\s+`?([a-z0-9_]+)`?)?#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + $name = $m[3][$i]; + if (strtolower($m[1][$i]) == 'primary key') + { + $name = 'primary'; + } + + $struct[$table]['@keys'][$name] = '?'; + $query = str_replace($m[0][$i], '', $query); + } + + // Alter add index + preg_match_all('#\s*add\s+(index|primary key|key|unique key|unique)\s*\(?([a-z0-9_,`\s]+)\)?(\s+\(([a-z0-9_,` ]+)\))?\s*(,|;|$)#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + $name = str_replace(array('`', ' '), array('', ''), $m[2][$i]); + $tmpName = explode(',', $name); + $name = $tmpName[0]; + + if (strtolower($m[1][$i] == 'primary key')) + { + $name = 'primary'; + } + + if (isset($struct[$table]['@keys']) && !isset($struct[$table]['@keys'][$name])) + { + // If key name doesn't exist, we try to match with list of fields and type + $type = strtolower($m[1][$i]); + if ($type == 'primary key') + { + $type = 'primary'; + } + else if ($type == 'key') + { + $type = 'index'; + } + else if ($type == 'unique key') + { + $type = 'unique'; + } + + $fields = ($m[4][$i]) ? $m[4][$i] : $m[2][$i]; + $fields = explode(',', preg_replace('#[\s`]#si', '', $fields)); + + foreach ($struct[$table]['@keys'] as $key => $data) + { + if ($data['type'] == $type && !array_diff($data['fields'], $fields)) + { + // Found it ! + unset($struct[$table]['@keys'][$key]); + break; + } + } + } + else + { + unset($struct[$table]['@keys'][$name]); + } + $query = str_replace($m[0][$i], '', $query); + } + + // Alter add + preg_match_all('#\s*add\s+`?([a-z0-9_]+)`?\s+(([a-z]+)(\([ 0-9,]+\))?(\s+unsigned)?)(\s+not)?(\s+null)?(\s+auto_increment)?(\s+primary)?#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + unset($struct[$table][$m[1][$i]]); + if (strtolower(trim($m[9][$i])) == 'primary') + { + unset($struct[$table]['@keys']['primary']); + } + } + + // Alter drop + preg_match_all('#\s*drop\s+`?([a-z0-9_]+)`?#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + $struct[$table][$m[1][$i]] = '?'; + } + + // Alter change + preg_match_all('#\s*change\s+`([a-z0-9_]+)`\s+`?([a-z0-9_]+)`?\s+([a-z]+)(\s*\([ 0-9,]+\))?(\s+unsigned)?#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + if ($m[1][$i] != $m[2][$i]) + { + unset($struct[$table][$m[1][$i]]); + } + $struct[$table][$m[2][$i]] = '?'; + } + } + // CREATE TABLE -> delete this table from structure + else if (preg_match('#^create\s+table\s+(if\s+not\s+exists\s+)?`?prefix_([a-z0-9_]+)`?#si', $query, $m) && !preg_match('#_tmp[0-9]?$#i', $m[2])) + { + unset($struct[$m[2]]); + } + // DROP TABLE -> add this table in structure + else if (preg_match('#^drop\s*table\s+(if\s+exists\s+)?`?prefix_([a-z0-9_]+)`?#si', $query, $m) && !preg_match('#_tmp[0-9]?$#i', $m[2])) + { + $struct[$m[2]] = array(); + } + } + + $this->schemas[count($this->schemas) - 1]['struct'] = $struct; + } + + /** + * Read db.sql file and load tables structure + */ + private function loadGeneralSchema() + { + $this->generalSchema = array(); + if (!file_exists($this->installPath . 'sql/db.sql')) + { + throw new Exception('File sql/db.sql not found'); + } + + // Get create queries from db.sql file + $content = file_get_contents($this->installPath . 'sql/db.sql'); + $queries = preg_split("/;\s*[\r\n]+/", $content); + foreach ($queries as $query) + { + $query = trim($query); + if (!preg_match('#^create table `?prefix_([a-z0-9_]+)`?\s#i', $query, $m)) + { + continue; + } + + $table = $m[1]; + $this->generalSchema[$table] = array(); + + // Get fields list + preg_match_all('#(\(|,)\s*`?([a-z0-9_]+)`?\s+(([a-z]+)(\([ 0-9,]+\))?(\s+unsigned)?)\s*[^,]*#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + if (in_array(strtolower($m[2][$i]), array('primary', 'key', 'unique', 'index'))) + { + continue; + } + $this->generalSchema[$table][$m[2][$i]] = $this->parseType($m[4][$i]); + } + + // Get index + $this->generalSchema[$table]['@keys'] = array(); + preg_match_all('#(primary\s+key|unique\s+key|key|index)\s+\(?`?([a-z0-9_,` ]+)`?\)?(\s+\(([a-z0-9_,` ]+)\))?\s*(,|\))#si', $query, $m); + for ($i = 0, $total = count($m[0]); $i < $total; $i++) + { + $type = strtolower($m[1][$i]); + if ($type == 'primary key') + { + $type = 'primary'; + } + else if ($type == 'key') + { + $type = 'index'; + } + else if ($type == 'unique key') + { + $type = 'unique'; + } + + $name = str_replace(array('`', ' '), array('', ''), $m[2][$i]); + $tmpName = explode(',', $name); + $name = $tmpName[0]; + if ($type == 'primary') + { + $name = 'primary'; + } + + $fields = ($m[4][$i]) ? $m[4][$i] : $m[2][$i]; + $fields = explode(',', preg_replace('#[\s`]#si', '', $fields)); + + $this->generalSchema[$table]['@keys'][$name] = array( + 'type' => $type, + 'fields' => $fields, + ); + } + } + + $this->schemas[] = array( + 'name' => INSTALL_VERSION, + 'struct' => $this->generalSchema, + ); + } + + /** + * Get the schema of current database + */ + private function getDatabaseSchema() + { + $struct = array(); + $sql = 'SHOW TABLES'; + foreach (Db::getInstance()->executeS($sql) as $row) + { + $table = current($row); + if (substr($table, 0, strlen($this->prefix)) != $this->prefix) + { + continue; + } + + $virtualTable = substr($table, strlen($this->prefix)); + $struct[$virtualTable] = array(); + + // List fields + $sql = 'SHOW FIELDS FROM ' . $table; + foreach (Db::getInstance()->executeS($sql) as $rowField) + { + $struct[$virtualTable][$rowField['Field']] = $this->parseType($rowField['Type']); + } + + // List keys + $struct[$virtualTable]['@keys'] = array(); + $sql = 'SHOW INDEX FROM ' . $table; + foreach (Db::getInstance()->executeS($sql) as $rowIndex) + { + $keyName = strtolower($rowIndex['Key_name']); + $type = 'index'; + if ($keyName == 'primary') + { + $type = 'primary'; + } + else if (!$rowIndex['Non_unique']) + { + $type = 'unique'; + } + + if (!isset($struct[$virtualTable]['@keys'][$keyName])) + { + $struct[$virtualTable]['@keys'][$keyName] = array( + 'type' => $type, + 'fields' => array(), + ); + } + $struct[$virtualTable]['@keys'][$keyName]['fields'][] = $rowIndex['Column_name']; + } + } + + $this->currentSchema = $struct; + $this->completeDatabaseSchema(); + } + + /** + * Launch comparison and search current version + */ + private function searchCurrentVersion() + { + $this->errors = array(); + $version = null; + $versions = array(); + $state = 0; + + // Browse all schema, we will compare all data of listed schema to current database structure, evertytime something is different + // we break and go to next schema + foreach ($this->schemas as $schema) + { + $struct = $schema['struct']; + $this->errors[$schema['name']] = array(); + $isThisVersion = true; + + // Browse all table for schema + foreach ($struct as $table => $fields) + { + // Is this table ignored ? + if (isset($this->ignore[$table]) && !$this->ignore[$table]) + { + continue; + } + + // Check if table exists + if (!isset($this->currentSchema[$table])) + { + $this->errors[$schema['name']][] = "Table '$table' not found"; + $isThisVersion = false; + + if ($this->fastExecution) + { + break; + } + continue; + } + + // Browse all fields for this table + foreach ($fields as $field => $type) + { + if ($field == '@keys') + { + continue; + } + + // Is this field ignored ? + if (isset($this->ignore[$table], $this->ignore[$table]['fields']) && in_array($field, $this->ignore[$table]['fields'])) + { + continue; + } + + // Check if field exists + if (!isset($this->currentSchema[$table][$field])) + { + $this->errors[$schema['name']][] = "Field '$field' in table '$table' not found"; + $isThisVersion = false; + + if ($this->fastExecution) + { + break 2; + } + continue; + } + + // Is this type ignored ? + if (isset($this->ignore[$table], $this->ignore[$table]['types']) && in_array($field, $this->ignore[$table]['types'])) + { + continue; + } + + // Compare the field type, ignore comparaison if we don't know the field type (? char) + if ($this->compareTypes && $type != '?' && $this->currentSchema[$table][$field] != $type) + { + $this->errors[$schema['name']][] = "The field '$field' in table '$table' has a different type ('$type' :: '{$this->currentSchema[$table][$field]}')"; + $isThisVersion = false; + + if ($this->fastExecution) + { + break 2; + } + } + } + + // Compare index + if (isset($fields['@keys'])) + { + foreach ($fields['@keys'] as $name => $data) + { + if ($data == '?') + { + continue; + } + + // Is this index ignored ? + if (isset($this->ignore[$table], $this->ignore[$table]['keys']) && in_array($name, $this->ignore[$table]['keys'])) + { + continue; + } + + // Test if index exists + if (!isset($this->currentSchema[$table]['@keys'][$name])) + { + $this->errors[$schema['name']][] = "Key '$name' in table '$table' not found"; + $isThisVersion = false; + + if ($this->fastExecution) + { + break 2; + } + continue; + } + + // Compare index type + if ($this->currentSchema[$table]['@keys'][$name]['type'] != $data['type']) + { + $this->errors[$schema['name']][] = "Key '$name' in table '$table' has different type ('{$this->currentSchema[$table]['@keys'][$name]['type']}', '{$data['type']}')"; + $isThisVersion = false; + + if ($this->fastExecution) + { + break 2; + } + } + + // Compare list of fields + $diff = array_diff($this->currentSchema[$table]['@keys'][$name]['fields'], $data['fields']); + if ($diff) + { + $this->errors[$schema['name']][] = "Key '$name' in table '$table' has different fields ('" . implode("', '", $diff) . "')"; + $isThisVersion = false; + + if ($this->fastExecution) + { + break 2; + } + } + } + } + } + + if ($isThisVersion) + { + $versions[] = $schema['name']; + $state = 1; + } + + if (!$isThisVersion && $state == 1) + { + break; + } + } + + return ($versions); + } + + /** + * Format correctly a field type name + * + * @param string $type Type name + * @return Parsed type name + */ + private function parseType($type) + { + $type = strtolower(preg_replace('#^([a-z]+).*$#i', '\\1', $type)); + $type = str_replace('boolean', 'tinyint', $type); + + return $type; + } +} diff --git a/install-dev/classes/Language.php b/install-dev/classes/Language.php new file mode 100644 index 000000000..934ff264b --- /dev/null +++ b/install-dev/classes/Language.php @@ -0,0 +1,652 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7442 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class Language extends ObjectModel +{ + public $id; + + /** @var string Name */ + public $name; + + /** @var string 2-letter iso code */ + public $iso_code; + + /** @var string 5-letter iso code */ + public $language_code; + + /** @var bool true if this language is right to left language */ + public $is_rtl = false; + + /** @var boolean Status */ + public $active = true; + + protected $fieldsRequired = array('name', 'iso_code'); + protected $fieldsSize = array('name' => 32, 'iso_code' => 2, 'language_code' => 5); + protected $fieldsValidate = array('name' => 'isGenericName', 'iso_code' => 'isLanguageIsoCode', 'language_code' => 'isLanguageCode', 'active' => 'isBool', 'is_rtl' => 'isBool'); + + protected $table = 'lang'; + protected $identifier = 'id_lang'; + + /** @var array Languages cache */ + protected static $_checkedLangs; + protected static $_LANGUAGES; + protected static $countActiveLanguages; + + protected $webserviceParameters = array( + 'objectNodeName' => 'language', + 'objectsNodeName' => 'languages', + ); + + public function __construct($id = NULL, $id_lang = NULL) + { + parent::__construct($id); + } + + public function getFields() + { + parent::validateFields(); + $fields['name'] = pSQL($this->name); + $fields['iso_code'] = pSQL(strtolower($this->iso_code)); + $fields['language_code'] = pSQL(strtolower($this->language_code)); + $fields['is_rtl'] = (int)$this->is_rtl; + if (empty($fields['language_code'])) + $fields['language_code'] = $fields['iso_code']; + $fields['active'] = (int)$this->active; + return $fields; + } + + public function add($autodate = true, $nullValues = false) + { + if (!parent::add($autodate)) + return false; + + $translationsFiles = array( + 'fields' => '_FIELDS', + 'errors' => '_ERRORS', + 'admin' => '_LANGADM', + 'pdf' => '_LANGPDF', + ); + if (!file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code)) + mkdir(_PS_TRANSLATIONS_DIR_.$this->iso_code); + foreach ($translationsFiles as $file => $var) + if (!file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code.'/'.$file.'.php')) + file_put_contents(_PS_TRANSLATIONS_DIR_.$this->iso_code.'/'.$file.'.php', ''); + + $resUpdateSQL = $this->loadUpdateSQL(); + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return $resUpdateSQL; + + return ($resUpdateSQL AND Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + )); + } + + public function toggleStatus() + { + if (!parent::toggleStatus()) + return false; + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + return (Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + )); + } + + public function checkFiles() + { + return self::checkFilesWithIsoCode($this->iso_code); + } + + + /** + * This functions checks if every files exists for the language $iso_code. + * Concerned files are theses located in translations/$iso_code/ + * and translations/mails/$iso_code . + * + * @param mixed $iso_code + * @returntrue if all files exists + */ + public static function checkFilesWithIsoCode($iso_code) + { + if (isset(self::$_checkedLangs[$iso_code]) AND self::$_checkedLangs[$iso_code]) + return true; + foreach (array_keys(self::getFilesList($iso_code, _THEME_NAME_, false, false, false, true)) as $key) + if (!file_exists($key)) + return false; + self::$_checkedLangs[$iso_code] = true; + return true; + } + + public static function getFilesList($iso_from, $theme_from, $iso_to = false, $theme_to = false, $select = false, $check = false, $modules = false) + { + if (empty($iso_from)) + die(Tools::displayError()); + + $copy = ($iso_to AND $theme_to) ? true : false; + + $lPath_from = _PS_TRANSLATIONS_DIR_.(string)$iso_from.'/'; + $tPath_from = _PS_ROOT_DIR_.'/themes/'.(string)$theme_from.'/'; + $mPath_from = _PS_MAIL_DIR_.(string)$iso_from.'/'; + + if ($copy) + { + $lPath_to = _PS_TRANSLATIONS_DIR_.(string)$iso_to.'/'; + $tPath_to = _PS_ROOT_DIR_.'/themes/'.(string)$theme_to.'/'; + $mPath_to = _PS_MAIL_DIR_.(string)$iso_to.'/'; + } + + $lFiles = array('admin'.'.php', 'errors'.'.php', 'fields'.'.php', 'pdf'.'.php'); + $mFiles = array( + 'account.html', 'account.txt', + 'bankwire.html', 'bankwire.txt', + 'cheque.html', 'cheque.txt', + 'contact.html', 'contact.txt', + 'contact_form.html', 'contact_form.txt', + 'credit_slip.html', 'credit_slip.txt', + 'download_product.html', 'download_product.txt', + 'download-product.tpl', + 'employee_password.html', 'employee_password.txt', + 'forward_msg.html', 'forward_msg.txt', + 'guest_to_customer.html', 'guest_to_customer.txt', + 'in_transit.html', 'in_transit.txt', + 'newsletter.html', 'newsletter.txt', + 'order_canceled.html', 'order_canceled.txt', + 'order_conf.html', 'order_conf.txt', + 'order_customer_comment.html', 'order_customer_comment.txt', + 'order_merchant_comment.html', 'order_merchant_comment.txt', + 'order_return_state.html', 'order_return_state.txt', + 'outofstock.html', 'outofstock.txt', + 'password.html', 'password.txt', + 'password_query.html', 'password_query.txt', + 'payment.html', 'payment.txt', + 'payment_error.html', 'payment_error.txt', + 'preparation.html', 'preparation.txt', + 'refund.html', 'refund.txt', + 'reply_msg.html', 'reply_msg.txt', + 'shipped.html', 'shipped.txt', + 'test.html', 'test.txt', + 'voucher.html', 'voucher.txt', + ); + + $number = -1; + + $files = array(); + $files_tr = array(); + $files_theme = array(); + $files_mail = array(); + $files_modules = array(); + + + // When a copy is made from a theme in specific language + // to an other theme for the same language, + // it's avoid to copy Translations, Mails files + // and modules files which are not override by theme. + if (!$copy OR $iso_from != $iso_to) + { + // Translations files + if (!$check OR ($check AND (string)$iso_from != 'en')) + foreach ($lFiles as $file) + $files_tr[$lPath_from.$file] = ($copy ? $lPath_to.$file : ++$number); + if ($select == 'tr') + return $files_tr; + $files = array_merge($files, $files_tr); + + // Mail files + if (!$check OR ($check AND (string)$iso_from != 'en')) + $files_mail[$mPath_from.'lang.php'] = ($copy ? $mPath_to.'lang.php' : ++$number); + foreach ($mFiles as $file) + $files_mail[$mPath_from.$file] = ($copy ? $mPath_to.$file : ++$number); + if ($select == 'mail') + return $files_mail; + $files = array_merge($files, $files_mail); + + // Modules + if ($modules) + { + $modList = Module::getModulesDirOnDisk(); + foreach ($modList as $mod) + { + $modDir = _PS_MODULE_DIR_.$mod; + // Lang file + if (file_exists($modDir.'/'.(string)$iso_from.'.php')) + $files_modules[$modDir.'/'.(string)$iso_from.'.php'] = ($copy ? $modDir.'/'.(string)$iso_to.'.php' : ++$number); + // Mails files + $modMailDirFrom = $modDir.'/mails/'.(string)$iso_from; + $modMailDirTo = $modDir.'/mails/'.(string)$iso_to; + if (file_exists($modMailDirFrom)) + { + $dirFiles = scandir($modMailDirFrom); + foreach ($dirFiles as $file) + if (file_exists($modMailDirFrom.'/'.$file) AND $file != '.' AND $file != '..' AND $file != '.svn') + $files_modules[$modMailDirFrom.'/'.$file] = ($copy ? $modMailDirTo.'/'.$file : ++$number); + } + } + if ($select == 'modules') + return $files_modules; + $files = array_merge($files, $files_modules); + } + } + else if ($select == 'mail' OR $select == 'tr') + { + return $files; + } + + // Theme files + if (!$check OR ($check AND (string)$iso_from != 'en')) + { + $files_theme[$tPath_from.'lang/'.(string)$iso_from.'.php'] = ($copy ? $tPath_to.'lang/'.(string)$iso_to.'.php' : ++$number); + $module_theme_files = (file_exists($tPath_from.'modules/') ? scandir($tPath_from.'modules/') : array()); + foreach ($module_theme_files as $module) + if ($module !== '.' AND $module != '..' AND $module !== '.svn' AND file_exists($tPath_from.'modules/'.$module.'/'.(string)$iso_from.'.php')) + $files_theme[$tPath_from.'modules/'.$module.'/'.(string)$iso_from.'.php'] = ($copy ? $tPath_to.'modules/'.$module.'/'.(string)$iso_to.'.php' : ++$number); + } + if ($select == 'theme') + return $files_theme; + $files = array_merge($files, $files_theme); + + // Return + return $files; + } + + /** + * loadUpdateSQL will create default lang values when you create a new lang, based on default id lang + * + * @return boolean true if succeed + */ + public function loadUpdateSQL() + { + $tables = Db::getInstance()->ExecuteS('SHOW TABLES LIKE \''._DB_PREFIX_.'%_lang\' '); + $langTables = array(); + + foreach($tables as $table) + foreach($table as $t) + $langTables[] = $t; + + Db::getInstance()->Execute('SET @id_lang_default = (SELECT c.`value` FROM `'._DB_PREFIX_.'configuration` c WHERE c.`name` = \'PS_LANG_DEFAULT\' LIMIT 1)'); + $return = true; + foreach($langTables as $name) + { + $fields = ''; + $columns = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'.$name.'`'); + foreach($columns as $column) + $fields .= $column['Field'].', '; + $fields = rtrim($fields, ', '); + $identifier = 'id_'.str_replace('_lang', '', str_replace(_DB_PREFIX_, '', $name)); + + $sql = 'INSERT IGNORE INTO `'.$name.'` ('.$fields.') (SELECT '; + foreach($columns as $column) { + if ($identifier != $column['Field'] and $column['Field'] != 'id_lang') + $sql .= '(SELECT `'.$column['Field'].'` FROM `'.$name.'` tl WHERE tl.`id_lang` = @id_lang_default AND tl.`'.$identifier.'` = `'.str_replace('_lang', '', $name).'`.`'.$identifier.'`), '; + else + $sql.= '`'.$column['Field'].'`, '; + } + $sql = rtrim($sql, ', '); + $sql .= ' FROM `'._DB_PREFIX_.'lang` CROSS JOIN `'.str_replace('_lang', '', $name).'`) ;'; + $return &= Db::getInstance()->Execute(pSQL($sql)); + } + return $return; + } + + public static function recurseDeleteDir($dir) + { + if (!is_dir($dir)) + return false; + if ($handle = @opendir($dir)) + { + while (false !== ($file = readdir($handle))) + if ($file != '.' && $file != '..') + { + if (is_dir($dir.'/'.$file)) + self::recurseDeleteDir($dir.'/'.$file); + elseif (file_exists($dir.'/'.$file)) + @unlink($dir.'/'.$file); + } + closedir($handle); + } + rmdir($dir); + } + + public function delete() + { + if (empty($this->iso_code)) + $this->iso_code = self::getIsoById($this->id); + + // Database translations deletion + $result = Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'`'); + foreach ($result AS $row) + if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_])) + if (!Db::getInstance()->Execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)($this->id))) + return false; + + // Delete tags + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'tag WHERE id_lang = '.(int)($this->id)); + + // Delete search words + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'search_word WHERE id_lang = '.(int)($this->id)); + + // Files deletion + foreach (self::getFilesList($this->iso_code, _THEME_NAME_, false, false, false, true, true) as $key => $file) + if (file_exists($key)) + unlink($key); + $modList = scandir(_PS_MODULE_DIR_); + foreach ($modList as $mod) + { + self::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'.$this->iso_code); + $files = @scandir(_PS_MODULE_DIR_.$mod.'/mails/'); + if (count($files) <= 2) + self::recurseDeleteDir(_PS_MODULE_DIR_.$mod.'/mails/'); + + if(file_exists(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php')) + { + unlink(_PS_MODULE_DIR_.$mod.'/'.$this->iso_code.'.php'); + $files = @scandir(_PS_MODULE_DIR_.$mod); + if (count($files) <= 2) + self::recurseDeleteDir(_PS_MODULE_DIR_.$mod); + } + } + + if (file_exists(_PS_MAIL_DIR_.$this->iso_code)) + self::recurseDeleteDir(_PS_MAIL_DIR_.$this->iso_code); + if (file_exists(_PS_TRANSLATIONS_DIR_.$this->iso_code)) + self::recurseDeleteDir(_PS_TRANSLATIONS_DIR_.$this->iso_code); + if (!parent::delete()) + return false; + + // delete images + $files_copy = array('/en.jpg', '/en-default-thickbox.jpg', '/en-default-home.jpg', '/en-default-large.jpg', '/en-default-medium.jpg', '/en-default-small.jpg', '/en-default-large_scene.jpg'); + $tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_); + foreach($tos AS $to) + foreach($files_copy AS $file) + { + $name = str_replace('/en', ''.$this->iso_code, $file); + + if (file_exists($to.$name)) + unlink($to.$name); + if (file_exists(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg')) + unlink(dirname(__FILE__).'/../img/l/'.$this->id.'.jpg'); + } + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + + public function deleteSelection($selection) + { + if (!is_array($selection) OR !Validate::isTableOrIdentifier($this->identifier) OR !Validate::isTableOrIdentifier($this->table)) + die(Tools::displayError()); + $result = true; + foreach ($selection AS $id) + { + $this->id = (int)($id); + $result = $result AND $this->delete(); + } + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + + Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + + return $result; + } + + /** + * Return available languages + * + * @param boolean $active Select only active languages + * @return array Languages + */ + public static function getLanguages($active = true) + { + if(!self::$_LANGUAGES) + self::loadLanguages(); + + $languages = array(); + foreach (self::$_LANGUAGES AS $language) + { + if ($active AND !$language['active']) + continue; + $languages[] = $language; + } + return $languages; + } + + public static function getLanguage($id_lang) + { + if (!array_key_exists((int)($id_lang), self::$_LANGUAGES)) + return false; + return self::$_LANGUAGES[(int)($id_lang)]; + } + + /** + * Return iso code from id + * + * @param integer $id_lang Language ID + * @return string Iso code + */ + public static function getIsoById($id_lang) + { + if (isset(self::$_LANGUAGES[(int)$id_lang]['iso_code'])) + return self::$_LANGUAGES[(int)$id_lang]['iso_code']; + return false; + } + + /** + * Return id from iso code + * + * @param string $iso_code Iso code + * @return integer Language ID + */ + public static function getIdByIso($iso_code) + { + if (!Validate::isLanguageIsoCode($iso_code)) + die(Tools::displayError('Fatal error : iso code is not correct : ').$iso_code); + + return Db::getInstance()->getValue('SELECT `id_lang` FROM `'._DB_PREFIX_.'lang` WHERE `iso_code` = \''.pSQL(strtolower($iso_code)).'\''); + } + + public static function getLanguageCodeByIso($iso_code) + { + if (!Validate::isLanguageIsoCode($iso_code)) + die(Tools::displayError('Fatal error : iso code is not correct : ').$iso_code); + + return Db::getInstance()->getValue('SELECT `language_code` FROM `'._DB_PREFIX_.'lang` WHERE `iso_code` = \''.pSQL(strtolower($iso_code)).'\''); + } + + /** + * Return array (id_lang, iso_code) + * + * @param string $iso_code Iso code + * @return array Language (id_lang, iso_code) + */ + public static function getIsoIds($active = true) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `id_lang`, `iso_code` FROM `'._DB_PREFIX_.'lang` '.($active ? 'WHERE active = 1' : '')); + } + + public static function copyLanguageData($from, $to) + { + $result = Db::getInstance()->ExecuteS('SHOW TABLES FROM `'._DB_NAME_.'`'); + foreach ($result AS $row) + if (preg_match('/_lang/', $row['Tables_in_'._DB_NAME_]) AND $row['Tables_in_'._DB_NAME_] != _DB_PREFIX_.'lang') + { + $result2 = Db::getInstance()->ExecuteS('SELECT * FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)($from)); + if (!sizeof($result2)) + continue; + Db::getInstance()->Execute('DELETE FROM `'.$row['Tables_in_'._DB_NAME_].'` WHERE `id_lang` = '.(int)($to)); + $query = 'INSERT INTO `'.$row['Tables_in_'._DB_NAME_].'` VALUES '; + foreach ($result2 AS $row2) + { + $query .= '('; + $row2['id_lang'] = $to; + foreach ($row2 AS $field) + $query .= '\''.pSQL($field, true).'\','; + $query = rtrim($query, ',').'),'; + } + $query = rtrim($query, ','); + Db::getInstance()->Execute($query); + } + return true; + } + + /** + * Load all languages in memory for caching + */ + public static function loadLanguages() + { + self::$_LANGUAGES = array(); + + $result = Db::getInstance()->ExecuteS(' + SELECT `id_lang`, `name`, `iso_code`, `active` + FROM `'._DB_PREFIX_.'lang`'); + + foreach ($result AS $row) + self::$_LANGUAGES[(int)$row['id_lang']] = array('id_lang' => (int)$row['id_lang'], 'name' => $row['name'], 'iso_code' => $row['iso_code'], 'active' => (int)$row['active']); + } + + public function update($nullValues = false) + { + if (!parent::update($nullValues)) + return false; + + // If url_rewrite is not enabled, we don't need to regenerate .htaccess + if(!Configuration::get('PS_REWRITING_SETTINGS')) + return true; + + return Tools::generateHtaccess(dirname(__FILE__).'/../.htaccess', + (int)(Configuration::get('PS_REWRITING_SETTINGS')), + (int)(Configuration::get('PS_HTACCESS_CACHE_CONTROL')), + Configuration::get('PS_HTACCESS_SPECIFIC') + ); + } + + public static function checkAndAddLanguage($iso_code) + { + if (Language::getIdByIso($iso_code)) + return true; + else + { + if(@fsockopen('www.prestashop.com', 80)) + { + $lang = new Language(); + $lang->iso_code = $iso_code; + $lang->active = true; + + if ($lang_pack = Tools::jsonDecode(Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_language_pack.php?version='._PS_VERSION_.'&iso_lang='.$iso_code))) + { + if (isset($lang_pack->name) + && isset($lang_pack->version) + && isset($lang_pack->iso_code)) + $lang->name = $lang_pack->name; + } + if (!$lang->name OR !$lang->add()) + return false; + $insert_id = (int)($lang->id); + + if ($lang_pack) + { + $flag = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/flags/jpeg/'.$iso_code.'.jpg'); + if ($flag != NULL && !preg_match('//', $flag)) + { + $file = fopen(dirname(__FILE__).'/../img/l/'.$insert_id.'.jpg', 'w'); + if ($file) + { + fwrite($file, $flag); + fclose($file); + } + else + self::_copyNoneFlag($insert_id); + } + else + self::_copyNoneFlag($insert_id); + } + else + self::_copyNoneFlag($insert_id); + + $files_copy = array('/en.jpg', '/en-default-thickbox.jpg', '/en-default-home.jpg', '/en-default-large.jpg', '/en-default-medium.jpg', '/en-default-small.jpg', '/en-default-large_scene.jpg'); + $tos = array(_PS_CAT_IMG_DIR_, _PS_MANU_IMG_DIR_, _PS_PROD_IMG_DIR_, _PS_SUPP_IMG_DIR_); + foreach($tos AS $to) + foreach($files_copy AS $file) + { + $name = str_replace('/en', '/'.$iso_code, $file); + copy(dirname(__FILE__).'/../img/l'.$file, $to.$name); + } + return true; + } + else + return false; + } + } + + protected static function _copyNoneFlag($id) + { + return copy(dirname(__FILE__).'/../img/l/none.jpg', dirname(__FILE__).'/../img/l/'.$id.'.jpg'); + } + + private static $_cache_language_installation = null; + public static function isInstalled($iso_code) + { + if (self::$_cache_language_installation === null) + { + self::$_cache_language_installation = array(); + $result = Db::getInstance()->ExecuteS('SELECT `id_lang`, `iso_code` FROM `'._DB_PREFIX_.'lang`'); + foreach ($result as $row) + self::$_cache_language_installation[$row['iso_code']] = $row['id_lang']; + } + return (isset(self::$_cache_language_installation[$iso_code]) ? self::$_cache_language_installation[$iso_code] : false); + } + + public static function countActiveLanguages() + { + if (!self::$countActiveLanguages) + self::$countActiveLanguages = Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'lang` WHERE `active` = 1'); + return self::$countActiveLanguages; + } +} + diff --git a/install-dev/classes/LanguagesManager.php b/install-dev/classes/LanguagesManager.php new file mode 100644 index 000000000..89eb08852 --- /dev/null +++ b/install-dev/classes/LanguagesManager.php @@ -0,0 +1,105 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once("../classes/Validate.php"); + +class LanguageManager +{ + private $url_xml; + private $lang; + private $xml_file; + + function __construct ($url_xml) + { + $this->loadXML($url_xml); + $this->setLanguage(); + $this->getIncludeTradFilename(); + } + + private function loadXML($url_xml) + { + global $errors; + if (!$this->xml_file = simplexml_load_file($url_xml)) + $errors = 'Error when loading XML language file : '.$url_xml; + } + + public function getIdSelectedLang() + { + return $this->lang['id']; + } + + public function getIsoCodeSelectedLang() + { + return $this->lang->idLangPS; + } + + public function countLangs() + { + return sizeof($this->xml_file); + } + + public function getAvailableLangs() + { + return $this->xml_file; + } + + public function getSelectedLang() + { + return $this->lang; + } + + private function getIdByHAL(){ + + if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) + { + $FirstHAL = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); + $iso = $FirstHAL[0]; + if ($iso != "en-us") + foreach ($this->xml_file as $lang) + foreach ($lang->isos->iso as $anIso) + if ($anIso == $iso) + return $lang['id']; + } + else + return 0; + + } + + private function setLanguage() + { + if( isset($_GET['language']) AND Validate::isInt($_GET['language'])) + $id_lang = (int)($_GET['language']); + if (!isset($id_lang)) + $id_lang = ($this->getIdByHAL()); + $this->lang = $this->xml_file->lang[(int)($id_lang)]; + } + + public function getIncludeTradFilename() + { + return ($this->lang == NULL) ? false : dirname(__FILE__).$this->lang['trad_file']; + } +} \ No newline at end of file diff --git a/install-dev/classes/Module.php b/install-dev/classes/Module.php new file mode 100644 index 000000000..221e73be4 --- /dev/null +++ b/install-dev/classes/Module.php @@ -0,0 +1,1074 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7441 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class Module +{ + /** @var integer Module ID */ + public $id = NULL; + + /** @var float Version */ + public $version; + + /** @var string Unique name */ + public $name; + + /** @var string Human name */ + public $displayName; + + /** @var string A little description of the module */ + public $description; + + /** @var string author of the module */ + public $author; + + /** @var int need_instance */ + public $need_instance = 1; + + /** @var string Admin tab correponding to the module */ + public $tab = NULL; + + /** @var boolean Status */ + public $active = false; + + /** @var array current language translations */ + protected $_lang = array(); + + /** @var string Module web path (eg. '/shop/modules/modulename/') */ + protected $_path = NULL; + + /** @var string Fill it if the module is installed but not yet set up */ + public $warning; + + /** @var string Message display before uninstall a module */ + public $beforeUninstall = NULL; + + public $_errors = false; + + protected $table = 'module'; + + protected $identifier = 'id_module'; + + static public $_db; + + /** @var array to store the limited country */ + public $limited_countries = array(); + + /** + * Constructor + * + * @param string $name Module unique name + */ + protected static $modulesCache; + protected static $_hookModulesCache; + + protected static $_INSTANCE = array(); + + protected static $_generateConfigXmlMode = false; + + protected static $l_cache = array(); + + /** + * @var array used by AdminTab to determine which lang file to use (admin.php or module lang file) + */ + public static $classInModule = array(); + + public function __construct($name = NULL) + { + if ($this->name == NULL) + $this->name = $this->id; + if ($this->name != NULL) + { + if (self::$modulesCache == NULL AND !is_array(self::$modulesCache)) + { + self::$modulesCache = array(); + $result = Db::getInstance()->ExecuteS('SELECT * FROM `'.pSQL(_DB_PREFIX_.$this->table).'`'); + foreach ($result as $row) + self::$modulesCache[$row['name']] = $row; + } + if (isset(self::$modulesCache[$this->name])) + { + $this->active = true; + $this->id = self::$modulesCache[$this->name]['id_module']; + foreach (self::$modulesCache[$this->name] AS $key => $value) + if (key_exists($key, $this)) + $this->{$key} = $value; + $this->_path = __PS_BASE_URI__.'modules/'.$this->name.'/'; + } + } + } + + /** + * Insert module into datable + */ + public function install() + { + if (!Validate::isModuleName($this->name)) + die(Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT `id_module` + FROM `'._DB_PREFIX_.'module` + WHERE `name` = \''.pSQL($this->name).'\''); + if ($result) + return false; + $result = Db::getInstance()->AutoExecute(_DB_PREFIX_.$this->table, array('name' => $this->name, 'active' => 1), 'INSERT'); + if (!$result) + return false; + $this->id = Db::getInstance()->Insert_ID(); + return true; + } + + /** + * Delete module from datable + * + * @return boolean result + */ + public function uninstall() + { + if (!Validate::isUnsignedId($this->id)) + return false; + $result = Db::getInstance()->ExecuteS(' + SELECT `id_hook` + FROM `'._DB_PREFIX_.'hook_module` hm + WHERE `id_module` = '.(int)($this->id)); + foreach ($result AS $row) + { + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.(int)($this->id).' + AND `id_hook` = '.(int)($row['id_hook'])); + $this->cleanPositions($row['id_hook']); + } + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'module` + WHERE `id_module` = '.(int)($this->id)); + } + + /** + * This function enable module $name. If an $name is an array, + * this will enable all of them + * + * @param array|string $name + * @return true if succeed + * @since 1.4.1 + */ + public static function enableByName($name) + { + if (!is_array($name)) + $name = array($name); + + foreach ($name as $k=>$v) + $name[$k] = '"'.pSQL($v).'"'; + + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'module` + SET `active`= 1 + WHERE `name` IN ('.implode(',',$name).')'); + } + /** + * Called when module is set to active + */ + public function enable() + { + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'module` + SET `active`= 1 + WHERE `name` = \''.pSQL($this->name).'\''); + } + + /** + * This function disable module $name. If an $name is an array, + * this will disable all of them + * + * @param array|string $name + * @return true if succeed + * @since 1.4.1 + */ + public static function disableByName($name) + { + if (!is_array($name)) + $name = array($name); + + foreach ($name as $k=>$v) + $name[$k] = '"'.pSQL($v).'"'; + + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'module` + SET `active`= 0 + WHERE `name` IN ('.implode(',',$name).')'); + } + + /** + * Called when module is set to deactive + */ + public function disable() + { + return Module::disableByName($this->name); + } + + /** + * Connect module to a hook + * + * @param string $hook_name Hook name + * @return boolean result + */ + public function registerHook($hook_name) + { + if (!Validate::isHookName($hook_name)) + die(Tools::displayError()); + if (!isset($this->id) OR !is_numeric($this->id)) + return false; + + // Check if already register + $result = Db::getInstance()->getRow(' + SELECT hm.`id_module` FROM `'._DB_PREFIX_.'hook_module` hm, `'._DB_PREFIX_.'hook` h + WHERE hm.`id_module` = '.(int)($this->id).' + AND h.`name` = \''.pSQL($hook_name).'\' + AND h.`id_hook` = hm.`id_hook`'); + if ($result) + return true; + + // Get hook id + $result = Db::getInstance()->getRow(' + SELECT `id_hook` + FROM `'._DB_PREFIX_.'hook` + WHERE `name` = \''.pSQL($hook_name).'\''); + if (!isset($result['id_hook'])) + return false; + + // Get module position in hook + $result2 = Db::getInstance()->getRow(' + SELECT MAX(`position`) AS position + FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_hook` = '.(int)($result['id_hook'])); + if (!$result2) + return false; + + // Register module in hook + $return = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook_module` (`id_module`, `id_hook`, `position`) + VALUES ('.(int)($this->id).', '.(int)($result['id_hook']).', '.(int)($result2['position'] + 1).')'); + + $this->cleanPositions((int)($result['id_hook'])); + + return $return; + } + + /** + * Display flags in forms for translations + * + * @param array $languages All languages available + * @param integer $defaultLanguage Default language id + * @param string $ids Multilingual div ids in form + * @param string $id Current div id] + * #param boolean $return define the return way : false for a display, true for a return + */ + public function displayFlags($languages, $defaultLanguage, $ids, $id, $return = false) + { + if (sizeof($languages) == 1) + return false; + $output = ' +

    +
    + '.$this->l('Choose language:').'

    '; + foreach ($languages as $language) + $output .= ''.$language['name'].' '; + $output .= '
    '; + + if ($return) + return $output; + echo $output; + } + + /** + * Unregister module from hook + * + * @param int $id_hook Hook id + * @return boolean result + */ + public function unregisterHook($hook_id) + { + return Db::getInstance()->Execute(' + DELETE + FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.(int)($this->id).' + AND `id_hook` = '.(int)($hook_id)); + } + + /** + * Unregister exceptions linked to module + * + * @param int $id_hook Hook id + * @return boolean result + */ + public function unregisterExceptions($hook_id) + { + return Db::getInstance()->Execute(' + DELETE + FROM `'._DB_PREFIX_.'hook_module_exceptions` + WHERE `id_module` = '.(int)($this->id).' + AND `id_hook` = '.(int)($hook_id)); + } + + /** + * Add exceptions for module->Hook + * + * @param int $id_hook Hook id + * @param array $excepts List of file name + * @return boolean result + */ + public function registerExceptions($id_hook, $excepts) + { + foreach ($excepts AS $except) + { + if (!empty($except)) + { + $result = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook_module_exceptions` (`id_module`, `id_hook`, `file_name`) + VALUES ('.(int)($this->id).', '.(int)($id_hook).', \''.pSQL(strval($except)).'\')'); + if (!$result) + return false; + } + } + return true; + } + + public function editExceptions($id_hook, $excepts) + { + // Cleaning... + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'hook_module_exceptions` + WHERE `id_module` = '.(int)($this->id).' AND `id_hook` ='.(int)($id_hook)); + return $this->registerExceptions($id_hook, $excepts); + } + + + /** + * This function is used to determine the module name + * of an AdminTab which belongs to a module, in order to keep translation + * related to a module in its directory (instead of $_LANGADM) + * + * @param mixed $currentClass the + * @return boolean|string if the class belongs to a module, will return the module name. Otherwise, return false. + */ + public static function getModuleNameFromClass($currentClass) + { + // Module can now define AdminTab keeping the module translations method, + // i.e. in modules/[module name]/[iso_code].php + if (!isset(self::$classInModule[$currentClass])) + { + global $_MODULES; + $_MODULE = array(); + $reflectionClass = new ReflectionClass($currentClass); + $filePath = realpath($reflectionClass->getFileName()); + $realpathModuleDir = realpath(_PS_MODULE_DIR_); + if (substr(realpath($filePath), 0, strlen($realpathModuleDir)) == $realpathModuleDir) + { + self::$classInModule[$currentClass] = substr(dirname($filePath), strlen($realpathModuleDir)+1); + + $id_lang = (!isset($cookie) OR !is_object($cookie)) ? (int)(Configuration::get('PS_LANG_DEFAULT')) : (int)($cookie->id_lang); + $file = _PS_MODULE_DIR_.self::$classInModule[$currentClass].'/'.Language::getIsoById($id_lang).'.php'; + if (Tools::file_exists_cache($file) AND include_once($file)) + $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; + } + else + self::$classInModule[$currentClass] = false; + } + // return name of the module, or false + return self::$classInModule[$currentClass]; + } + + /** + * Return an instance of the specified module + * + * @param string $moduleName Module name + * @return Module instance + */ + static public function getInstanceByName($moduleName) + { + if (!Tools::file_exists_cache(_PS_MODULE_DIR_.$moduleName.'/'.$moduleName.'.php')) + return false; + include_once(_PS_MODULE_DIR_.$moduleName.'/'.$moduleName.'.php'); + if (!class_exists($moduleName, false)) + return false; + + if (!isset(self::$_INSTANCE[$moduleName])) + self::$_INSTANCE[$moduleName] = new $moduleName; + return self::$_INSTANCE[$moduleName]; + } + + /** + * Load modules Ids from Ids + * + * @param array|int $ids Modules ID + * @return Array of module name + */ + static public function preloadModuleNameFromId($ids) + { + static $preloadedModuleNameFromId; + if(!isset($preloadedModuleNameFromId)) { + $preloadedModuleNameFromId = array(); + } + + if(is_array($ids)) + { + foreach($ids as $id) + $preloadedModuleNameFromId[$id] = false; + + $results = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' + SELECT `name`,`id_module` + FROM `'._DB_PREFIX_.'module` + WHERE `id_module` IN ('.join(',',$ids) .');'); + foreach($results as $result) + $preloadedModuleNameFromId[$result['id_module']] = $result['name']; + } + elseif(!isset($preloadedModuleNameFromId[$ids])) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT `name` + FROM `'._DB_PREFIX_.'module` + WHERE `id_module` = '.(int)($ids)); + if($result) + $preloadedModuleNameFromId[$ids] = $result['name']; + else + $preloadedModuleNameFromId[$ids] = false; + } + + + if(is_array($ids)) { + return $preloadedModuleNameFromId; + } else { + if(!isset($preloadedModuleNameFromId[$ids])) + return false; + return $preloadedModuleNameFromId[$ids]; + } + } + + /** + * Return an instance of the specified module + * + * @param integer $id_module Module ID + * @return Module instance + */ + static public function getInstanceById($id_module) + { + $moduleName = Module::preloadModuleNameFromId($id_module); + return ($moduleName ? Module::getInstanceByName($moduleName) : false); + } + + /** + * Return available modules + * + * @param boolean $useConfig in order to use config.xml file in module dir + * @return array Modules + */ + public static function getModulesOnDisk($useConfig = false) + { + global $cookie, $_MODULES; + + $moduleList = array(); + $moduleListCursor = 0; + $moduleNameList = array(); + $modulesNameToCursor = array(); + $errors = array(); + $modules_dir = self::getModulesDirOnDisk(); + foreach ($modules_dir AS $module) + { + $configFile = _PS_MODULE_DIR_.$module.'/config.xml'; + $xml_exist = file_exists($configFile); + if ($xml_exist) + $needNewConfigFile = (filemtime($configFile) < filemtime(_PS_MODULE_DIR_.$module.'/'.$module.'.php')); + else + $needNewConfigFile = true; + if ($useConfig AND $xml_exist) + { + libxml_use_internal_errors(true); + $xml_module = simplexml_load_file($configFile); + foreach (libxml_get_errors() as $error) + $errors[] = '['.$module.'] '.Tools::displayError('Error found in config file:').' '.htmlentities($error->message); + libxml_clear_errors(); + + if (!count($errors) AND (int)$xml_module->need_instance == 0 AND !$needNewConfigFile) + { + $file = _PS_MODULE_DIR_.$module.'/'.Language::getIsoById($cookie->id_lang).'.php'; + if (Tools::file_exists_cache($file) AND include_once($file)) + if(isset($_MODULE) AND is_array($_MODULE)) + $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; + + $xml_module->displayName = Module::findTranslation($xml_module->name, $xml_module->displayName, (string)$xml_module->name); + $xml_module->description = Module::findTranslation($xml_module->name, $xml_module->description, (string)$xml_module->name); + $xml_module->author = Module::findTranslation($xml_module->name, $xml_module->author, (string)$xml_module->name); + + if(isset($xml_module->confirmUninstall)) + $xml_module->confirmUninstall = Module::findTranslation($xml_module->name, $xml_module->confirmUninstall, (string)$xml_module->name); + + + $moduleList[$moduleListCursor] = $xml_module; + $moduleNameList[$moduleListCursor] = '\''.strval($xml_module->name).'\''; + $modulesNameToCursor[strval($xml_module->name)] = $moduleListCursor; + $moduleListCursor++; + } + } + if (!$useConfig OR !$xml_exist OR (isset($xml_module->need_instance) AND (int)$xml_module->need_instance == 1) OR $needNewConfigFile) + { + $file = trim(file_get_contents(_PS_MODULE_DIR_.$module.'/'.$module.'.php')); + if (substr($file, 0, 5) == '') + $file = substr($file, 0, -2); + if (class_exists($module, false) OR eval($file) !== false) + { + $moduleList[$moduleListCursor++] = new $module; + if (!$xml_exist OR $needNewConfigFile) + { + self::$_generateConfigXmlMode = true; + $tmpModule = new $module; + $tmpModule->_generateConfigXml(); + self::$_generateConfigXmlMode = false; + } + } + else + $errors[] = $module; + } + } + + // Get modules information from database + if(!empty($moduleNameList)) + { + $results = Db::getInstance()->executeS('SELECT `id_module`, `active`, `name` FROM `'._DB_PREFIX_.'module` WHERE `name` IN ('.join(',',$moduleNameList).')'); + foreach($results as $result) + { + $moduleCursor = $modulesNameToCursor[$result['name']]; + if (isset($result['active']) AND $result['active']) + $moduleList[$moduleCursor]->active = $result['active']; + if (isset($result['id_module']) AND $result['id_module']) + $moduleList[$moduleCursor]->id = $result['id_module']; + } + } + + if (sizeof($errors)) + { + echo '

    '.Tools::displayError('Parse error(s) in module(s)').'

      '; + foreach ($errors AS $error) + echo '
    1. '.$error.'
    2. '; + echo '
    '; + } + + return $moduleList; + } + + public static function getModulesDirOnDisk() + { + $moduleList = array(); + $modules = scandir(_PS_MODULE_DIR_); + foreach ($modules AS $name) + { + if (Tools::file_exists_cache(_PS_MODULE_DIR_.$name.'/'.$name.'.php')) + { + if (!Validate::isModuleName($name)) + die(Tools::displayError().' (Module '.$name.')'); + $moduleList[] = $name; + } + } + return $moduleList; + } + + /** + * Return non native module + * + * @param int $position Take only positionnables modules + * @return array Modules + */ + public static function getNonNativeModuleList() + { + $db = Db::getInstance(); + + $module_list_xml = _PS_ROOT_DIR_.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'modules_list.xml'; + $nativeModules = simplexml_load_file($module_list_xml); + $nativeModules = $nativeModules->modules; + foreach ($nativeModules as $nativeModulesType) + if (in_array($nativeModulesType['type'],array('native','partner'))) + { + $arrNativeModules[] = '""'; + foreach ($nativeModulesType->module as $module) + $arrNativeModules[] = '"'.pSQL($module['name']).'"'; + } + + return $db->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'module` m + WHERE name NOT IN ('.implode(',',$arrNativeModules).') '); + } + + /** + * Return installed modules + * + * @param int $position Take only positionnables modules + * @return array Modules + */ + public static function getModulesInstalled($position = 0) + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'module` m + '.($position ? ' + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON m.`id_module` = hm.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` k ON hm.`id_hook` = k.`id_hook` + WHERE k.`position` = 1' : '')); + } + + /* + * Execute modules for specified hook + * + * @param string $hook_name Hook Name + * @param array $hookArgs Parameters for the functions + * @return string modules output + */ + public static function hookExec($hook_name, $hookArgs = array(), $id_module = NULL) + { + global $cookie; + if ((!empty($id_module) AND !Validate::isUnsignedId($id_module)) OR !Validate::isHookName($hook_name)) + die(Tools::displayError()); + + global $cart, $cookie; + $live_edit = false; + if (!isset($hookArgs['cookie']) OR !$hookArgs['cookie']) + $hookArgs['cookie'] = $cookie; + if (!isset($hookArgs['cart']) OR !$hookArgs['cart']) + $hookArgs['cart'] = $cart; + $hook_name = strtolower($hook_name); + + if (!isset(self::$_hookModulesCache)) + { + $db = Db::getInstance(_PS_USE_SQL_SLAVE_); + $result = $db->ExecuteS(' + SELECT h.`name` as hook, m.`id_module`, h.`id_hook`, m.`name` as module, h.`live_edit` + FROM `'._DB_PREFIX_.'module` m + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` + AND m.`active` = 1 + ORDER BY hm.`position`', false); + self::$_hookModulesCache = array(); + + if ($result) + while ($row = $db->nextRow()) + { + $row['hook'] = strtolower($row['hook']); + if (!isset(self::$_hookModulesCache[$row['hook']])) + self::$_hookModulesCache[$row['hook']] = array(); + self::$_hookModulesCache[$row['hook']][] = array('id_hook' => $row['id_hook'], 'module' => $row['module'], 'id_module' => $row['id_module'], 'live_edit' => $row['live_edit']); + } + } + + if (!isset(self::$_hookModulesCache[$hook_name])) + return; + + $altern = 0; + $output = ''; + foreach (self::$_hookModulesCache[$hook_name] AS $array) + { + if ($id_module AND $id_module != $array['id_module']) + continue; + if (!($moduleInstance = Module::getInstanceByName($array['module']))) + continue; + + $exceptions = $moduleInstance->getExceptions((int)$array['id_hook'], (int)$array['id_module']); + foreach ($exceptions AS $exception) + if (strstr(basename($_SERVER['PHP_SELF']).'?'.$_SERVER['QUERY_STRING'], $exception['file_name']) && !strstr($_SERVER['QUERY_STRING'], $exception['file_name'])) + continue 2; + + if (is_callable(array($moduleInstance, 'hook'.$hook_name))) + { + $hookArgs['altern'] = ++$altern; + + $display = call_user_func(array($moduleInstance, 'hook'.$hook_name), $hookArgs); + if ($array['live_edit'] && ((Tools::isSubmit('live_edit') AND Tools::getValue('ad') AND (Tools::getValue('liveToken') == sha1(Tools::getValue('ad')._COOKIE_KEY_))))) + { + $live_edit = true; + $output .= ' +
    '; + } + else + $output .= $display; + } + } + return ($live_edit ? '
    ' : '').$output.($live_edit ? '
    ' : ''); + } + + public static function hookExecPayment() + { + global $cart, $cookie; + $hookArgs = array('cookie' => $cookie, 'cart' => $cart); + $id_customer = (int)($cookie->id_customer); + $billing = new Address((int)($cart->id_address_invoice)); + $output = ''; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT h.`id_hook`, m.`name`, hm.`position` + FROM `'._DB_PREFIX_.'module_country` mc + LEFT JOIN `'._DB_PREFIX_.'module` m ON m.`id_module` = mc.`id_module` + INNER JOIN `'._DB_PREFIX_.'module_group` mg ON (m.`id_module` = mg.`id_module`) + INNER JOIN `'._DB_PREFIX_.'customer_group` cg on (cg.`id_group` = mg.`id_group` AND cg.`id_customer` = '.(int)($id_customer).') + LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` + LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` + WHERE h.`name` = \'payment\' + AND mc.id_country = '.(int)($billing->id_country).' + AND m.`active` = 1 + ORDER BY hm.`position`, m.`name` DESC'); + if ($result) + foreach ($result AS $module) + if (($moduleInstance = Module::getInstanceByName($module['name'])) AND is_callable(array($moduleInstance, 'hookpayment'))) + if (!$moduleInstance->currencies OR ($moduleInstance->currencies AND sizeof(Currency::checkPaymentCurrencies($moduleInstance->id)))) + $output .= call_user_func(array($moduleInstance, 'hookpayment'), $hookArgs); + return $output; + } + + /** + * find translation from $_MODULES and put it in self::$l_cache if not already exist + * and return it. + * + * @param string $name name of the module + * @param string $string term to find + * @param string $source additional param for building translation key + * @return string + */ + public static function findTranslation($name, $string, $source) + { + global $_MODULES; + + $cache_key = $name . '|' . $string . '|' . $source; + + if (!isset(self::$l_cache[$cache_key])) + { + if (!is_array($_MODULES)) + return str_replace('"', '"', $string); + // set array key to lowercase for 1.3 compatibility + $_MODULES = array_change_key_case($_MODULES); + $currentKey = '<{'.strtolower($name).'}'.strtolower(_THEME_NAME_).'>'.strtolower($source).'_'.md5($string); + $defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string); + + if (isset($_MODULES[$currentKey])) + $ret = stripslashes($_MODULES[$currentKey]); + elseif (isset($_MODULES[Tools::strtolower($currentKey)])) + $ret = stripslashes($_MODULES[Tools::strtolower($currentKey)]); + elseif (isset($_MODULES[$defaultKey])) + $ret = stripslashes($_MODULES[$defaultKey]); + elseif (isset($_MODULES[Tools::strtolower($defaultKey)])) + $ret = stripslashes($_MODULES[Tools::strtolower($defaultKey)]); + else + $ret = stripslashes($string); + + self::$l_cache[$cache_key] = str_replace('"', '"', $ret); + } + return self::$l_cache[$cache_key]; + } + /** + * Get translation for a given module text + * + * Note: $specific parameter is mandatory for library files. + * Otherwise, translation key will not match for Module library + * when module is loaded with eval() Module::getModulesOnDisk() + * + * @param string $string String to translate + * @param boolean|string $specific filename to use in translation key + * @return string Translation + */ + public function l($string, $specific = false) + { + if (self::$_generateConfigXmlMode) + return $string; + + global $_MODULES, $_MODULE, $cookie; + + $id_lang = (!isset($cookie) OR !is_object($cookie)) ? (int)(Configuration::get('PS_LANG_DEFAULT')) : (int)($cookie->id_lang); + $file = _PS_MODULE_DIR_.$this->name.'/'.Language::getIsoById($id_lang).'.php'; + if (Tools::file_exists_cache($file) AND include_once($file)) + $_MODULES = !empty($_MODULES) ? array_merge($_MODULES, $_MODULE) : $_MODULE; + + $source = $specific ? $specific : $this->name; + $string = str_replace('\'', '\\\'', $string); + $ret = $this->findTranslation($this->name, $string, $source); + return $ret; + } + + /* + * Reposition module + * + * @param boolean $id_hook Hook ID + * @param boolean $way Up (1) or Down (0) + * @param intger $position + */ + public function updatePosition($id_hook, $way, $position = NULL) + { + if (!$res = Db::getInstance()->ExecuteS(' + SELECT hm.`id_module`, hm.`position`, hm.`id_hook` + FROM `'._DB_PREFIX_.'hook_module` hm + WHERE hm.`id_hook` = '.(int)($id_hook).' + ORDER BY hm.`position` '.((int)($way) ? 'ASC' : 'DESC'))) + return false; + foreach ($res AS $key => $values) + if ((int)($values[$this->identifier]) == (int)($this->id)) + { + $k = $key ; + break ; + } + if (!isset($k) OR !isset($res[$k]) OR !isset($res[$k + 1])) + return false; + $from = $res[$k]; + $to = $res[$k + 1]; + + if (isset($position) and !empty($position)) + $to['position'] = (int)($position); + + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'hook_module` + SET `position`= position '.($way ? '-1' : '+1').' + WHERE position between '.(int)(min(array($from['position'], $to['position']))) .' AND '.(int)(max(array($from['position'], $to['position']))).' + AND `id_hook`='.(int)($from['id_hook'])) + AND + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'hook_module` + SET `position`='.(int)($to['position']).' + WHERE `'.pSQL($this->identifier).'` = '.(int)($from[$this->identifier]).' AND `id_hook`='.(int)($to['id_hook'])) + ); + } + + /* + * Reorder modules position + * + * @param boolean $id_hook Hook ID + */ + public function cleanPositions($id_hook) + { + $result = Db::getInstance()->ExecuteS(' + SELECT `id_module` + FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_hook` = '.(int)($id_hook).' + ORDER BY `position`'); + $sizeof = sizeof($result); + for ($i = 0; $i < $sizeof; ++$i) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'hook_module` + SET `position` = '.(int)($i + 1).' + WHERE `id_hook` = '.(int)($id_hook).' + AND `id_module` = '.(int)($result[$i]['id_module'])); + return true; + } + + /* + * Return module position for a given hook + * + * @param boolean $id_hook Hook ID + * @return integer position + */ + public function getPosition($id_hook) + { + if(isset(Hook::$preloadModulesFromHooks)) + if(isset(Hook::$preloadModulesFromHooks[$id_hook])) + if(isset(Hook::$preloadModulesFromHooks[$id_hook]['module_position'][$this->id])) + return Hook::$preloadModulesFromHooks[$id_hook]['module_position'][$this->id]; + else + return 0; + $result = Db::getInstance()->getRow(' + SELECT `position` + FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_hook` = '.(int)($id_hook).' + AND `id_module` = '.(int)($this->id)); + return $result['position']; + } + + public function displayError($error) + { + $output = ' +
    + '.$error.' +
    '; + $this->error = true; + return $output; + } + + public function displayConfirmation($string) + { + $output = ' +
    + '.$string.' +
    '; + return $output; + } + + /* + * Return exceptions for module in hook + * + * @param int $id_hook Hook ID + * @return array Exceptions + */ + protected static $exceptionsCache = NULL; + public function getExceptions($id_hook) + { + if (self::$exceptionsCache == NULL AND !is_array(self::$exceptionsCache)) + { + self::$exceptionsCache = array(); + $result = Db::getInstance()->ExecuteS(' + SELECT CONCAT(id_hook, \'-\', id_module) as `key`, `file_name` as value + FROM `'._DB_PREFIX_.'hook_module_exceptions`'); + foreach ($result as $row) + { + if (empty($row['value'])) + continue; + if (!array_key_exists($row['key'], self::$exceptionsCache)) + self::$exceptionsCache[$row['key']] = array(); + self::$exceptionsCache[$row['key']][] = array('file_name' => $row['value']); + } + } + return (array_key_exists((int)($id_hook).'-'.(int)($this->id), self::$exceptionsCache) ? self::$exceptionsCache[(int)($id_hook).'-'.(int)($this->id)] : array()); + } + + public static function isInstalled($moduleName) + { + Db::getInstance()->ExecuteS('SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name` = \''.pSQL($moduleName).'\''); + return (bool)Db::getInstance()->NumRows(); + } + + public function isRegisteredInHook($hook) + { + if (!$this->id) + return false; + + return Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'hook_module` hm + LEFT JOIN `'._DB_PREFIX_.'hook` h ON (h.`id_hook` = hm.`id_hook`) + WHERE h.`name` = \''.pSQL($hook).'\' + AND hm.`id_module` = '.(int)($this->id) + ); + } + + /* + ** Template management (display, overload, cache) + */ + protected static function _isTemplateOverloadedStatic($moduleName, $template) + { + if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$moduleName.'/'.$template)) + return true; + elseif (Tools::file_exists_cache(_PS_MODULE_DIR_.$moduleName.'/'.$template)) + return false; + return NULL; + } + + protected function _isTemplateOverloaded($template) + { + return self::_isTemplateOverloadedStatic($this->name, $template); + } + + public static function display($file, $template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + if (Configuration::get('PS_FORCE_SMARTY_2')) /* Keep a backward compatibility for Smarty v2 */ + { + $previousTemplate = $smarty->currentTemplate; + $smarty->currentTemplate = substr(basename($template), 0, -4); + } + $smarty->assign('module_dir', __PS_BASE_URI__.'modules/'.basename($file, '.php').'/'); + if (($overloaded = self::_isTemplateOverloadedStatic(basename($file, '.php'), $template)) === NULL) + $result = Tools::displayError('No template found for module').' '.basename($file,'.php'); + else + { + $smarty->assign('module_template_dir', ($overloaded ? _THEME_DIR_ : __PS_BASE_URI__).'modules/'.basename($file, '.php').'/'); + $result = $smarty->fetch(($overloaded ? _PS_THEME_DIR_.'modules/'.basename($file, '.php') : _PS_MODULE_DIR_.basename($file, '.php')).'/'.$template, $cacheId, $compileId); + } + if (Configuration::get('PS_FORCE_SMARTY_2')) /* Keep a backward compatibility for Smarty v2 */ + $smarty->currentTemplate = $previousTemplate; + return $result; + } + + protected function _getApplicableTemplateDir($template) + { + return $this->_isTemplateOverloaded($template) ? _PS_THEME_DIR_ : _PS_MODULE_DIR_.$this->name.'/'; + } + + public function isCached($template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + /* Use Smarty 3 API calls */ + if (!Configuration::get('PS_FORCE_SMARTY_2')) /* PHP version > 5.1.2 */ + return $smarty->isCached($this->_getApplicableTemplateDir($template).$template, $cacheId, $compileId); + /* or keep a backward compatibility if PHP version < 5.1.2 */ + else + return $smarty->is_cached($this->_getApplicableTemplateDir($template).$template, $cacheId, $compileId); + } + + protected function _clearCache($template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + /* Use Smarty 3 API calls */ + if (!Configuration::get('PS_FORCE_SMARTY_2')) /* PHP version > 5.1.2 */ + return $smarty->clearCache($template ? $this->_getApplicableTemplateDir($template).$template : NULL, $cacheId, $compileId); + /* or keep a backward compatibility if PHP version < 5.1.2 */ + else + return $smarty->clear_cache($template ? $this->_getApplicableTemplateDir($template).$template : NULL, $cacheId, $compileId); + } + + protected function _generateConfigXml() + { + $xml = ' + + '.$this->name.' + displayName).']]> + version.']]> + description).']]> + author).']]> + tab).']]>'.(isset($this->confirmUninstall) ? "\n\t".''.$this->confirmUninstall.'' : '').' + '.(int)method_exists($this, 'getContent').' + '.(int)$this->need_instance.''.(isset($this->limited_countries) ? "\n\t".''.(sizeof($this->limited_countries) == 1 ? $this->limited_countries[0] : '').'' : '').' +'; + if (is_writable(_PS_MODULE_DIR_.$this->name.'/')) + file_put_contents(_PS_MODULE_DIR_.$this->name.'/config.xml', utf8_encode($xml)); + } + + /** + * @param string $hook_name + * @return bool if module can be transplanted on hook + */ + public function isHookableOn($hook_name) + { + return is_callable(array($this, 'hook'.ucfirst($hook_name))); + } +} + diff --git a/install-dev/classes/ToolsInstall.php b/install-dev/classes/ToolsInstall.php new file mode 100644 index 000000000..f5d2981fb --- /dev/null +++ b/install-dev/classes/ToolsInstall.php @@ -0,0 +1,191 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +class ToolsInstall +{ + public static function checkDB ($srv, $login, $password, $name, $posted = true, $engine = false) + { + include_once(INSTALL_PATH.'/../classes/Validate.php'); + include_once(INSTALL_PATH.'/../classes/Db.php'); + include_once(INSTALL_PATH.'/../classes/MySQL.php'); + + if($posted) + { + // Check POST data... + $data_check = array( + !isset($_GET['server']) OR empty($_GET['server']), + !Validate::isMailName($_GET['server']), + !isset($_GET['type']) OR empty($_GET['type']), + !Validate::isMailName($_GET['type']), + !isset($_GET['name']) OR empty($_GET['name']), + !Validate::isMailName($_GET['name']), + !isset($_GET['login']) OR empty($_GET['login']), + !Validate::isMailName($_GET['login']), + !isset($_GET['password']) + ); + foreach ($data_check AS $data) + if ($data) + return 8; + } + + switch(MySQL::tryToConnect(trim($srv), trim($login), trim($password), trim($name), trim($engine))) + { + case 0: + if (MySQL::tryUTF8(trim($srv), trim($login), trim($password))) + return true; + return 49; + break; + case 1: + return 25; + break; + case 2: + return 24; + break; + case 3: + return 50; + break; + } + } + + public static function getHttpHost($http = false, $entities = false, $ignore_port = false) + { + $host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']); + if ($ignore_port && $pos = strpos($host, ':')) + $host = substr($host, 0, $pos); + if ($entities) + $host = htmlspecialchars($host, ENT_COMPAT, 'UTF-8'); + if ($http) + $host = 'http://'.$host; + return $host; + } + + public static function sendMail($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort = 25, $smtpEncryption) + { + include(INSTALL_PATH.'/../tools/swift/Swift.php'); + include(INSTALL_PATH.'/../tools/swift/Swift/Connection/SMTP.php'); + include(INSTALL_PATH.'/../tools/swift/Swift/Connection/NativeMail.php'); + + $swift = NULL; + $result = NULL; + try + { + + if($smtpChecked) + { + + $smtp = new Swift_Connection_SMTP($smtpServer, $smtpPort, ($smtpEncryption == "off") ? Swift_Connection_SMTP::ENC_OFF : (($smtpEncryption == "tls") ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_SSL)); + $smtp->setUsername($smtpLogin); + $smtp->setpassword($smtpPassword); + $smtp->setTimeout(5); + $swift = new Swift($smtp); + } + else + { + $swift = new Swift(new Swift_Connection_NativeMail()); + } + + $message = new Swift_Message($subject, $content, $type); + + if ($swift->send($message, $to, $from)) + { + $result = true; + } + else + { + $result = 999; + } + $swift->disconnect(); + } + catch (Swift_Connection_Exception $e) + { + $result = $e->getCode(); + } + catch (Swift_Message_MimeException $e) + { + $result = $e->getCode(); + } + return $result; + } + + public static function getNotificationMail($shopName, $shopUrl, $shopLogo, $firstname, $lastname, $password, $email) + { + $iso_code = $_GET['isoCodeLocalLanguage']; + $pathTpl = INSTALL_PATH.'/../mails/en/employee_password.html'; + $pathTplLocal = INSTALL_PATH.'/../mails/'.$iso_code.'/employee_password.html'; + + $content = (file_exists($pathTplLocal)) ? file_get_contents($pathTplLocal) : file_get_contents($pathTpl); + $content = str_replace('{shop_name}', $shopName, $content); + $content = str_replace('{shop_url}', $shopUrl, $content); + $content = str_replace('{shop_logo}', $shopLogo, $content); + $content = str_replace('{firstname}', $firstname, $content); + $content = str_replace('{lastname}', $lastname, $content); + $content = str_replace('{passwd}', $password, $content); + $content = str_replace('{email}', $email, $content); + return $content; + } + + public static function getLangString($idLang) + { + switch ($idLang) + { + case 'en' : return 'English (English)'; + case 'fr' : return 'Français (French)'; + } + } + + static function strtolower($str) + { + if (function_exists('mb_strtolower')) + return mb_strtolower($str, 'utf-8'); + return strtolower($str); + } + + static function strtoupper($str) + { + if (function_exists('mb_strtoupper')) + return mb_strtoupper($str, 'utf-8'); + return strtoupper($str); + } + + static function ucfirst($str) + { + return self::strtoupper(self::substr($str, 0, 1)).self::substr($str, 1); + } + + static function substr($str, $start, $length = false, $encoding = 'utf-8') + { + if (function_exists('mb_substr')) + return mb_substr($str, $start, ($length === false ? self::strlen($str) : $length), $encoding); + return substr($str, $start, $length); + } + + static function strlen($str) + { + if (function_exists('mb_strlen')) + return mb_strlen($str, 'utf-8'); + return strlen($str); + } +} diff --git a/install-dev/controller.js b/install-dev/controller.js new file mode 100644 index 000000000..2e528bd7b --- /dev/null +++ b/install-dev/controller.js @@ -0,0 +1,1046 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +//constant +verifMailREGEX = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/; +verifNameREGEX = /^[^0-9!<>,;?=+()@#"°{}_$%:]*$/; + +var errorOccured = false; + +//params +configIsOk = false; +createdBase = false; +mailIsOk = false; +smtpChecked = false; +validShopInfos = false; +upgradeCertify = false; +dropdb=false; +application="install"; +customModule="desactivate"; + +function nextTab() +{ + if(verifyThisStep()) + { + showStep(step+1, 'next'); + } +} +function backTab() +{ + if (step != 6) { + showStep(step - 1, 'back'); + } + else { + constructInstallerTabs(); + showStep(1, 'back'); + } +} + +function showStep(aStep, way) +{ + step = aStep; + + //show the sheet + $('div.sheet.shown').fadeOut('fast', function() { + $($('div.sheet')[(step-1)]).fadeIn('slow').addClass('shown'); + }).removeClass('shown'); + + //upgrade the tab + $('#tabs li') + .removeClass("selected") + .removeClass("finished"); + if (step < 6) { + $('#tabs li:nth-child(' + step + ')').addClass("selected"); + $('#tabs li:lt(' + (step - 1) + ')').addClass("finished"); + } + else + { + switch (step) + { + + case 6 : + $('#tabs li:nth-child(1)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(2)').addClass("selected").removeClass("finished"); + $('#tabs li:nth-child(3)').removeClass("selected").removeClass("finished"); + $('#tabs li:nth-child(4)').removeClass("selected").removeClass("finished"); + break; + + case 7 : + $('#tabs li:nth-child(1)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(2)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(3)').addClass("selected").removeClass("finished"); + $('#tabs li:nth-child(4)').removeClass("selected").removeClass("finished"); + break; + + case 8 : + $('#tabs li:nth-child(1)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(2)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(3)').addClass("selected").removeClass("finished"); + $('#tabs li:nth-child(4)').removeClass("selected").removeClass("finished"); + break; + + case 9 : + $('#tabs li:nth-child(1)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(2)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(3)').removeClass("selected").addClass("finished"); + $('#tabs li:nth-child(4)').addClass("selected").removeClass("finished"); + break; + + } + } + + //title of the window and buttons + switch(step) + { + case 1 : + document.title = Step1Title; + $("#btBack") + .attr("disabled", "disabled") + .addClass("disabled") + .show('slow'); + $("#btNext") + .removeAttr("disabled") + .removeClass("disabled") + .show('slow'); + break; + + case 2: + document.title = step2title; + application = "install"; + if (way == 'next') + verifyAndSetRequire(1); + else + verifyAndSetRequire(0); + $("#btBack") + .removeAttr("disabled") + .removeClass("disabled") + .show('slow'); + break; + + case 3: + document.title = step3title; + $("#btBack") + .removeAttr("disabled") + .removeClass("disabled") + .show('slow'); + break; + + case 4: + document.title = step4title; + $("#btBack") + .attr("disabled", "disabled") + .addClass("disabled") + .hide('slow'); + break; + + case 5 : + document.title = step5title; + $("#btBack") + .attr("disabled", "disabled") + .addClass("disabled") + .hide('slow'); + $("#btNext").hide('slow'); + break; + + case 6 : + document.title = step6title; + application = "update"; + if (!upgradeCertify) { + $("#btNext") + .attr("disabled", "disabled") + .addClass("disabled"); + } else { + $("#btNext") + .removeAttr("disabled") + .removeClass("disabled"); + } + $("#btBack") + .removeAttr("disabled") + .removeClass("disabled") + .show('slow'); + break; + + case 7: + document.title = step7title; + verifyAndSetRequire(0); + $("#btBack") + .removeAttr("disabled") + .removeClass("disabled") + .show('slow'); + break; + + case 8 : + document.title = step8title; + $("#btNext") + .attr("disabled", "disabled") + .addClass("disabled"); + $("#btBack") + .removeAttr("disabled") + .removeClass("disabled") + .show('slow'); + break; + + case 9 : + document.title = step9title; + $("#btBack").hide(); + $("#btNext").hide(); + break; + } +} + +function verifyThisStep() +{ + switch (step) + { + case 1 : + if($("#formSetMethod input[type=radio]:checked").val() == "install" ){ + showStep(2, 'next'); + } + else + { + constructUpdaterTabs(); + showStep(6, 'next'); + } + return false; + break; + + case 2 : + return configIsOk; + break; + + case 3 : + createDB(); + return false; + break; + + case 4 : + verifyShopInfos(); + return validShopInfos; + break; + + case 6 : + return true; + break; + + case 7 : + doUpgrade(); + break; + + } + +} + +function setInstallerLanguage () +{ + $("#formSetInstallerLanguage").submit(); +} + +function verifyAndSetRequire(firsttime) +{ + $("div#"+(application == "install" ? "sheet_require" : "sheet_require_update")+" > ul").slideUp("1500"); + $.ajax( + { + url: "model.php", + data: "method=checkConfig&firsttime="+firsttime, + success: function(ret) + { + isUpdate = application == "install" ? "" : "_update"; + testLists = ret.getElementsByTagName('testList'); + + configIsOk = true; + + testListRequired = testLists[0].getElementsByTagName('test'); + for (i = 0; i < testListRequired.length; i++){ + result = testListRequired[i].getAttribute("result"); + $($("div#sheet_require"+isUpdate+" > ul#required"+isUpdate+" .required")[i]) + .removeClass( (result == "fail") ? "ok" : "fail" ) + .addClass(result); + if (result == "fail") configIsOk = false; + } + + + testListOptional = testLists[1].getElementsByTagName('test'); + + for (i = 0; i < testListOptional.length; i++){ + result = testListOptional[i].getAttribute("result"); + $($("div#sheet_require"+isUpdate+" > ul#optional"+isUpdate+" li.optional")[i]) + .removeClass( (result == "fail") ? "ok" : "fail" ) + .addClass(result); + } + + if (!configIsOk) { + $('#btNext').attr({'disabled':'disabled','class':'button little disabled'}); + $('h3#resultConfig'+isUpdate).html(txtConfigIsNotOk).slideDown('slow'); + $('h3#resultConfigHelper').show(); + $("div#sheet_require"+isUpdate+" > ul").slideDown("1500"); + } else { + $("#btNext").removeAttr('disabled'); + $('#btNext').removeClass('disabled'); + $("input#btNext").focus(); + var firsttime = ret.getElementsByTagName('firsttime'); + if (firsttime && firsttime[0].getAttribute("value") == 1) + $("input#btNext").click(); + else + { + $('h3#resultConfig'+isUpdate).html(txtConfigIsOk).slideDown('slow'); + $('h3#resultConfigHelper').hide(); + $("div#sheet_require"+isUpdate+" > ul").slideDown("1500"); + } + } + } + } + ); +} + +function verifyDbAccess () +{ + //local verifications + if($("#dbServer[value=]").length > 0) + { + $("#dbResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtDbServerEmpty).show('slow'); + return false; + } + else + { + $("#dbResultCheck").removeClass("fail").removeClass("ok").removeClass('userInfos').html(''); + } + + if($("#dbLogin[value=]").length > 0) + { + $("#dbResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtDbLoginEmpty).show('slow'); + return false; + } + else + { + $("#dbResultCheck").removeClass("fail").removeClass("ok").removeClass('userInfos').html(''); + } + + if($("#dbName[value=]").length > 0) + { + $("#dbResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtDbNameEmpty).show('slow'); + return false; + } + else + { + $("#dbResultCheck").removeClass("fail").removeClass("ok").removeClass('userInfos').html(''); + } + + //external verifications and sets + $.ajax( + { + cache: false, + url: "model.php", + data: + "method=checkDB" + +"&type=MySQL" + +"&server="+ $("#dbServer").val() + +"&login="+ $("#dbLogin").val() + +"&password="+encodeURIComponent($("#dbPassword").val()) + +"&engine="+$("#dbEngine option:selected").val() + +"&name="+ $("#dbName").val(), + success: function(ret) + { + ret = ret.getElementsByTagName('action')[0]; + if (ret.getAttribute("result") == "ok") + { + $("#dbResultCheck") + .addClass("ok") + .removeClass("fail") + .html(txtError[23]) + .show('slow'); + $("#dbCreateResultCheck") + .hide('slow'); + } else + { + $("#dbResultCheck") + .addClass("fail") + .removeClass("ok") + .html(txtError[parseInt(ret.getAttribute("error"))]) + .show('slow'); + $("#dbCreateResultCheck") + .hide('slow'); + } + } + } + ); + +} + +function createDB() +{ + $("#dbResultCheck").hide(); + $.ajax( + { + url: "model.php", + cache: false, + data: + "method=createDB" + +"&tablePrefix="+ $("#db_prefix").val() + +"&mode="+ $("#dbTableParam input[type=radio]:checked").val()+ + "&type=MySQL"+ + "&server="+ $("#dbServer").val()+ + "&login="+ $("#dbLogin").val()+ + "&password="+encodeURIComponent($("#dbPassword").val())+ + "&engine="+$("#dbEngine option:selected").val()+ + "&name="+ $("#dbName").val()+ + "&language="+ id_lang+ + (dropdb ? "&dropAndCreate=true" : '') + , + success: function(ret) + { + var action_ret; + try { + action_ret = ret.getElementsByTagName('action')[0]; + } catch (e) { + $("#dbCreateResultCheck") + .addClass("fail") + .removeClass("ok") + .removeClass('userInfos') + .html(ret) + .show(); + return; + } + if (action_ret.getAttribute("result") == "ok") + { + var countries_ret = ret.getElementsByTagName('country'); + var timezone_ret = ret.getElementsByTagName('timezone'); + var html = ''; + for (i = 0; countries_ret[i]; i=i+1) + { + html = html + ''; + } + $('#infosCountry').html(html); + html = ''; + for (i = 0; timezone_ret[i]; i=i+1) + { + html = html + ''; + } + $('#infosTimezone').html(html); + showStep(step+1, 'next'); + } + else + { + if (action_ret.getAttribute("error") == "11") + { + $("#dbCreateResultCheck") + .addClass("fail") + .removeClass("ok") + .removeClass('userInfos') + .html( + txtError[11]+ "
    \'"+ + action_ret.getAttribute("sqlQuery") + "\'
    "+ + action_ret.getAttribute("sqlMsgError") + "(" + txtError[18] + " : " + action_ret.getAttribute("sqlNumberError") +")" + ) + .show(); + } + else + { + $("#dbCreateResultCheck") + .addClass("fail") + .removeClass("ok") + .removeClass('userInfos') + .html(txtError[parseInt(action_ret.getAttribute("error"))]) + .show(); + } + } + } + }); +} + + +function verifyMail() +{ + //local verifications + if ($("#testEmail[value=]").length > 0) + { + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtError[0]); + return false; + } + else if (!verifMailREGEX.test( $("#testEmail").val() )) + { + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtError[3]); + return false; + } + else + { + + if (smtpChecked) + { + //local verifications + if($("#smtpSrv[value=]").length > 0) + { + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtSmtpSrvEmpty); + smtpIsOk = false; + return false; + } + } + + + //external verifications and sets + $.ajax( + { + url: "model.php", + cache: false, + data: + "method=checkMail"+ + "&mailMethod= "+(smtpChecked ? "smtp" : "native")+ + "&smtpSrv="+ $("input#smtpSrv").val()+ + "&testEmail="+ $("#testEmail").val()+ + "&smtpLogin="+ $("input#smtpLogin").val()+ + "&smtpPassword="+ $("input#smtpPassword").val()+ + "&smtpPort="+ $("input#smtpPort").val()+ + "&smtpEnc="+ $("select#smtpEnc option:selected").val()+ + "&testMsg="+testMsg+ + "&testSubject="+testSubject + , + success: function(ret) + { + ret = ret.getElementsByTagName('action')[0]; + + if (ret.getAttribute("result") == "ok") + { + $("#mailResultCheck").addClass("ok").removeClass("fail").removeClass('userInfos').html(mailSended); + mailIsOk = true; + } + else + { + mailIsOk = false; + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(txtError[26]); + } + } + } + ); + } +} + +function uploadLogo () +{ + $.ajaxFileUpload + ( + { + url:'xml/uploadLogo.php', + secureuri:false, + fileElementId:'fileToUpload', + dataType: 'json', + success: function (data, status) + { + if(typeof(data.error) != 'undefined') + { + $("#uploadedImage").slideUp('slow', function() + { + if(data.error != '') + { + $("#resultInfosLogo").html( txtError[parseInt(data.error)] ).addClass("fail").show(); + } + else + { + $(this).attr('src', ps_base_uri + 'img/logo.jpg?' + (new Date())) + $(this).show('slow'); + $("#resultInfosLogo").html("").removeClass("fail").hide(); + } + }); + } + }, + error: function (data, status, e) + { + $("#uploadedImage").attr('src', ps_base_uri + 'img/logo.jpg?' + (new Date())); + $("#resultInfosLogo").html("").addClass("fail"); + } + } + ) +} + +function moveLanguage(direction) +{ + + switch (direction) + { + + case "al2wl" : + $("#aLList option:selected").each( + function() + { + $(this).appendTo("#wLList"); + $(this).clone().prependTo("#dLList"); + } + ); + + break; + + case "wl2al" : + if ($("#wLList option").length > 1) + { + $("#wLList option:selected").each( + function() + { + if($(this).val() != "en" ) + { + $(this).appendTo("#aLList"); + $("#dLList option[value = '" + $(this).attr('value') + "']").remove(); + } + } + ); + } + break; + } +} + +function ajaxRefreshField(nthField, idResultField, fieldsList, inputId) +{ + var result = fieldsList[nthField].getAttribute("result"); + if (result != "ok") + { + $("#"+idResultField) + .html( txtError[parseInt(fieldsList[nthField].getAttribute("error"))] ) + .addClass("fail") + .show("slow"); + if (validShopInfos) + $("#"+inputId).focus(); + return false; + } + else + { + $("#"+idResultField) + .html("") + .removeClass("fail") + .show("slow"); + return true; + } +} + +function verifyShopInfos() +{ + urlLanguages = ""; + $("#wLList option").each( + function() + { + urlLanguages += "&infosWL[]=" + $(this).val(); + } + ); + urlLanguages += "&infosDL[]=" + $("#dLList option:selected").val(); + + $.ajax( + { + url: "model.php", + async: false, + cache: false, + data: + "method=checkShopInfos"+ + "&isoCode="+isoCodeLocalLanguage+ + "&infosActivity="+ encodeURIComponent($("select#infosActivity").val())+ + "&infosCountry="+ encodeURIComponent($("select#infosCountry").val())+ + "&infosTimezone="+ encodeURIComponent($("select#infosTimezone").val())+ + "&infosShop="+ encodeURIComponent($("input#infosShop").val())+ + "&infosFirstname="+ encodeURIComponent($("input#infosFirstname").val())+ + "&infosName="+ encodeURIComponent($("input#infosName").val())+ + "&infosEmail="+ encodeURIComponent($("input#infosEmail").val())+ + "&infosPassword="+ encodeURIComponent($("input#infosPassword").val())+ + "&infosPasswordRepeat="+ encodeURIComponent($("input#infosPasswordRepeat").val())+ + "&infosNotification="+ ( ($("#infosNotification:checked").length > 0) ? "on" : "off" )+ + "&countryName="+encodeURIComponent($("select#infosCountry option:selected").attr('rel'))+ + urlLanguages+ + "&catalogMode="+ encodeURIComponent($("input[name=catalogMode]:checked").val())+ + "&infosMailMethod=" + ((smtpChecked) ? "smtp" : "native")+ + "&smtpSrv="+ encodeURIComponent($("input#smtpSrv").val())+ + "&smtpLogin="+ encodeURIComponent($("input#smtpLogin").val())+ + "&smtpPassword="+ encodeURIComponent($("input#smtpPassword").val())+ + "&smtpPort="+ encodeURIComponent($("input#smtpPort").val())+ + "&smtpEnc="+ encodeURIComponent($("select#smtpEnc option:selected").val())+ + "&mailSubject="+ encodeURIComponent(mailSubject)+ + "&isoCodeLocalLanguage="+isoCodeLocalLanguage + , + + success: function(ret) + { + fieldsList = ret.getElementsByTagName('shopConfig')[0].getElementsByTagName('field'); + validShopInfos = true; + if (!ajaxRefreshField(0, "resultInfosShop", fieldsList, "infosShop")) validShopInfos = false; + else if (!ajaxRefreshField(4, "resultInfosShop", fieldsList, "validateShop")) validShopInfos = false; + else if (!ajaxRefreshField(1, "resultInfosFirstname", fieldsList, "infosFirstname")) validShopInfos = false; + else if (!ajaxRefreshField(2, "resultInfosName", fieldsList, "infosName")) validShopInfos = false; + else if (!ajaxRefreshField(3, "resultInfosEmail", fieldsList, "infosEmail")) validShopInfos = false; + else if (!ajaxRefreshField(7, "resultInfosPassword", fieldsList, "infosPassword")) validShopInfos = false; + else if (!ajaxRefreshField(8, "resultInfosPasswordRepeat", fieldsList, "infosPasswordRepeat")) validShopInfos = false; + else if (!ajaxRefreshField(9, "resultInfosLanguages", fieldsList, "infosLanguages")) validShopInfos = false; + else if (!ajaxRefreshField(11, "resultInfosSQL", fieldsList, "infosSQL")) validShopInfos = false; + else if (!ajaxRefreshField(10, "resultInfosNotification", fieldsList, "infosNotification")) validShopInfos = false; + else if (!ajaxRefreshField(5, "resultInfosFirstname", fieldsList, "validateFirstname")) validShopInfos = false; + else if (!ajaxRefreshField(6, "resultInfosName", fieldsList, "validateName")) validShopInfos = false; + else if (!ajaxRefreshField(12, "resultCatalogMode", fieldsList, "validateCatalogMode")) validCatalogMode = false; + else + { + $('#endShopName').html($('input#infosShop').val()); + $('#endFirstName').html($('input#infosFirstname').val()); + $('#endName').html($('input#infosName').val()); + $('#endEmail').html($('input#infosEmail').val()); + } + } + } + ); +} + +function autoCheckField(idField, idResultSpan, typeVerif) +{ + switch (typeVerif) + { + case "required" : + $(idField).blur(function() + { + if($(this).val() == "") + { + $(idResultSpan) + .show("slow") + .addClass("fail") + .html(txtError[0]); + } + else + { + $(idResultSpan) + .hide("slow") + .removeClass("fail") + .html(""); + } + } + ); + break; + + case "mailFormat" : + $(idField).blur( + function() + { + if (!verifMailREGEX.test( $(this).val() )) + { + $(idResultSpan) + .show("slow") + .addClass("fail") + .html(txtError[3]); + } + else + { + $(idResultSpan) + .hide("slow") + .removeClass("fail") + .html(""); + } + } + ); + break; + + case "firstnameFormat" : + $(idField).blur( + function() + { + if (!verifNameREGEX.test( $(this).val() )) + { + $(idResultSpan) + .show("slow") + .addClass("fail") + .html(txtError[47]); + } + else + { + $(idResultSpan) + .hide("slow") + .removeClass("fail") + .html(""); + } + } + ); + break; + + case "nameFormat" : + $(idField).blur( + function() + { + if (!verifNameREGEX.test( $(this).val() )) + { + $(idResultSpan) + .show("slow") + .addClass("fail") + .html(txtError[48]); + } + else + { + $(idResultSpan) + .hide("slow") + .removeClass("fail") + .html(""); + } + } + ); + break; + + default : return false; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//upgrader +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +function constructUpdaterTabs() +{ + $("#tabs") + .empty() + .append("
  • "+txtTabUpdater1+"
  • ") + .append("
  • "+txtTabUpdater2+"
  • ") + .append("
  • "+txtTabUpdater3+"
  • ") + .append("
  • "+txtTabUpdater4+"
  • ") + ; + $(".installerVersion").hide(); + $(".updaterVersion").show(); +} + +function constructInstallerTabs() +{ + $("#tabs") + .empty() + .append("
  • "+txtTabInstaller1+"
  • ") + .append("
  • "+txtTabInstaller2+"
  • ") + .append("
  • "+txtTabInstaller3+"
  • ") + .append("
  • "+txtTabInstaller4+"
  • ") + .append("
  • "+txtTabInstaller5+"
  • ") + ; + $(".installerVersion").show(); + $(".updaterVersion").hide(); +} + +function doUpgrade() +{ + $.ajax( + { + url: "model.php", + cache: false, + data: + "method=doUpgrade&customModule=" + customModule+ "" + , + success: function(ret) + { + var ret; + try { + ret = ret.getElementsByTagName('action')[0]; + } catch (e) { + $("#resultUpdate").html(ret); + showStep(8); + return; + } + + var countSqlError = 0; + if (ret.getAttribute("result") == "ok" || (ret.getAttribute("result") == "fail" && (ret.getAttribute("error") == "34"))) + { + requests = ret.getElementsByTagName('request'); + $("#updateLog").empty(); + + $(requests).each(function() + { + $("#updateLog").append("
    " + $(this).children("sqlQuery").text() + "

    "); + if($(this).attr("result") == "fail") + { + countSqlError++; + $("#updateLog").append("(" + $(this).children("sqlNumberError").text() + ") " + $(this).children("sqlMsgError").text() + "
    "); + } + }); + if (ret.getAttribute("error") == "34") + $("#txtErrorUpdateSQL").html(txtError[35]+" "+countSqlError+" "+txtError[36]); + showStep(9); + } + else + { + $("#resultUpdate").html(txtError[parseInt(ret.getAttribute("error"))]); + showStep(8); + } + }, + error: function (data, status, e) + { + $('#resultUpdate').html('

    Error during install/upgrade: '+data.responseText.replace(/<\/?[^>]+>/gi, '')+'

    You may have to:

    1. Fix the error(s) displayed
    2. Put your database backup
    3. Modify the file settings.inc.php to put the old version for the line with _PS_VERSION_
    4. Restart the upgrade process from the begining

    '); + $('#detailsError').html(data); + showStep(8); + } + }); +} + +function showUpdateLog(){ + $("div#updateLog").toggle('slow'); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// end upgrader +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//when ready.... +$(document).ready( + function() + { + //show container only if JS is available + $("#noJavaScript").hide(); + $("#container").show(); + + //ajax animation + $("#loader").ajaxStart( + function() + { + $(this).fadeIn(); + $("#btNext[disabled!=1], #btBack[disabled!=1]").attr("disabled", "disabled").addClass("disabled").addClass("lockedForAjax"); + } + ); + $("#loader").ajaxComplete( + function(e, xhr, settings) + { + $(this).fadeOut(); + if (!errorOccured) + { + $(".lockedForAjax").removeAttr("disabled").removeClass("disabled").removeClass("lockedForAjax"); + if (step == 1) + $("#btNext[disabled!=1], #btBack[disabled!=1]").attr("disabled", "disabled").addClass("disabled").addClass("lockedForAjax"); + if (step == 6) + { + $('#btNext, #btBack').removeAttr('disabled').removeClass('disabled'); + if (!$('#btDisclaimerOk').is(':checked')) + $("#btNext[disabled!=1]").attr("disabled", "disabled").addClass("disabled").addClass("lockedForAjax"); + } + } + errorOccured = false; + } + ); + //set actions on clicks + $('#btNext').bind("click",nextTab); + $('#btBack').bind("click",backTab); + $('#btVerifyMail').bind("click",verifyMail); + + $('#al2wl, #wl2al').click( + function() + { + moveLanguage(this.id); + } + ); + $('#req_bt_refresh, #req_bt_refresh_update').click( + function() + { + verifyAndSetRequire(0); + } + ); + + //set SMTP pannels states + $("#set_stmp").bind("click", + function() + { + switch ($("input#set_stmp:checked").length) + { + case 0 : + $("div#mailSMTPParam").slideUp('slow'); + smtpChecked = false; + $("#mailResultCheck").addClass("userInfos").removeClass("ok").removeClass('fail').html(""); + break; + + case 1 : + $("div#mailSMTPParam").slideDown('slow'); + smtpChecked = true; + $("#mailResultCheck").addClass("userInfos").removeClass("ok").removeClass('fail').html(""); + break; + } + } + ); + + //preset mail step 4 + $("#testEmail").change( + function() + { + $('#infosEmail').val( $(this).val() ); + } + ); + + //certification needed for upgrade + $('#btDisclaimerOk').click(function() + { + if ($(this).attr('checked')) + { + upgradeCertify = true; + $('#btNext').removeAttr('disabled').removeClass('disabled'); + $('#upgradeProcess').slideDown(500); + } + else + { + upgradeCertify = false; + $('#btNext').attr('disabled', 'disabled').addClass('disabled'); + $('#upgradeProcess').slideUp(500); + } + }); + + //autocheck fields + autoCheckField("#infosShop", "#resultInfosShop", "required"); + autoCheckField("#infosFirstname", "#resultInfosFirstname", "firstnameFormat"); + autoCheckField("#infosName", "#resultInfosName", "nameFormat"); + autoCheckField("#infosEmail", "#resultInfosEmail", "mailFormat"); + autoCheckField("#infosPassword", "#resultInfosPassword", "required"); + autoCheckField("#infosPasswordRepeat", "#resultInfosPasswordRepeat", "required"); + autoCheckField("#infosPasswordRepeat", "#resultInfosPassword", "required"); + + constructInstallerTabs(); + + //show 1st step + step=1; + $("input#btNext").focus(); + + // hide next button for licence validation + $("#btNext") + .attr("disabled", "disabled") + .addClass("disabled"); + + function checkLicenseButton(elt) + { + if ($(elt).is(':checked')) + { + $("#btNext") + .removeAttr('disabled') + .removeClass('disabled'); + } + else + { + $("#btNext") + .attr("disabled", "disabled") + .addClass("disabled"); + } + } + + $('#set_license').click(function() { + checkLicenseButton(this); + }); + $("#customModuleDesactivation").bind('click', + function(){ + if($("#customModuleDesactivation")[0].checked) + customModule = 'desactivate'; + else + customModule = 'take the risk'; + } + ) + } +); diff --git a/install-dev/img/01-gd100.png b/install-dev/img/01-gd100.png new file mode 100644 index 0000000000000000000000000000000000000000..9734819977ea19856c5b9d9c44778afb2e9a5b48 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^oIotd!3HGxMcSSLDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MLwP`jv*DdlK%YvZ_h0Dfa%E7fNxoB6O?o+zSpy89AB33 ztUe^*9FvJ3XNU8|3`d^Rjasq)9wmC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGeg#JY5_^DsCnH`TyUZSxSR_vI3_{%s+W9iN+fe8tYk(=sC<` zyUsr4#$S2v1jbWyU5(;7y9#d~Jkr3- CCNF{j literal 0 HcmV?d00001 diff --git a/install-dev/img/01-pt70.png b/install-dev/img/01-pt70.png new file mode 100644 index 0000000000000000000000000000000000000000..ad00a8ee0d6c5dc8fcbaf17a3749045051cfeff7 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^Y#=rVi0tB)?*>wmC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGejGJzX3_DsCnH`TyUZS&D;EuqQ)E;b6s#7On}?7?NrgzBR05 z@HAo0WG?v}(eQ&$D4waS@b`)J BF0cRq literal 0 HcmV?d00001 diff --git a/install-dev/img/02-gd100.png b/install-dev/img/02-gd100.png new file mode 100644 index 0000000000000000000000000000000000000000..48eb1bb30fe99332e21d5fa35f7ab07223610949 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8eV#6kAr-fh{`~)M&n%|EapYLQw@8J$ekJZpEiJu`72oT9 z7=(%&S2|x4_%+|a!}*#D$C39NX4J8DyQ$7tR%F7NtRlW-;mOhiDieI?bUyPJ*w_7r zNiCy7Lb>&@&%7)X4DlOTpq#cJ*RZRabf1Dj=hJM zG0s*Cs9Eb2{D)8KBhL*J$;GU1>sK%~z0f;2UFlN6Pw`_neAlqeP<#A;31dN5L85}7 ff#C#31|}Yc>HQ(o+~-Gw{LbL%>gTe~DWM4fW5{cq literal 0 HcmV?d00001 diff --git a/install-dev/img/02-pt100.png b/install-dev/img/02-pt100.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6a27c007b6105f1e24f7556ab0804788ea9654 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^U^WLEkTt>lKP!-uEOCt}3C>R|DNig)WpGT%PfAtr z%uP&B4N6T+sVqF1Y6Da>%hSa%q~cc6kN^MenMI_TKd$=EQNY%5I`Pwqu6uuv^Q9?i z-|1DE$aX|8KsfP$#1aoq&jrjUHBUTx>chjsi#v1}ph7KL5K5{^v{$M3Nw3H+7o txV+GW*^6U=rHnX3`(g!VK?a2b3~ZdPrzJP3&jY%W!PC{xWt~$(69BW|Ro(yq literal 0 HcmV?d00001 diff --git a/install-dev/img/02-pt70.png b/install-dev/img/02-pt70.png new file mode 100644 index 0000000000000000000000000000000000000000..d84e1b7ec756ba229bfc3de95b43e24e548e108e GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^U^WLEkTt>lKP!-uEOCt}3C>R|DNig)WpGT%PfAtr z%uP&B4N6T+sVqF1Y6DcX)6>NwSrQu> zwH`IzG7`;_V&3G$ze0&k#k}6}I}iV)YKKYL3k4f^;u@0JZa&;`z$w6@$XI}pfr*EK Y_q7)5e?K`dpeGnSUHx3vIVCg!05^DAM*si- literal 0 HcmV?d00001 diff --git a/install-dev/img/03-gd100.png b/install-dev/img/03-gd100.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a20bafbc7eedcbd496e3209f49673538d887e6 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8Yo0ESAr-fJf*A!58SwB}^IUP#J#%ORgHYB&u{1{Rh!-k6 zoC=8^94|fGICP)B|F>xs zR-RJ62WIn`G_h=H%P47DDe?Wop}8{+9l2Yhz4N%l)}Ac-@idP8|6|85KhwAW`qwLC zBP3hDw`*?HtOoOk$<8T!ot9xji^Z-Nax)u;e6h%`%#Z0}z5TT-_DIK(sSdmqkGKwo zSY>Q9-X{3wazT#E%SsiwA647Tmd9-^d3rFfg3Ew`?}^FnsPb|Xpbr^5UHx3vIVCg! E08zbkJOBUy literal 0 HcmV?d00001 diff --git a/install-dev/img/03-pt100.png b/install-dev/img/03-pt100.png new file mode 100644 index 0000000000000000000000000000000000000000..1b74f7d6a789bfc3612415afe82f9bc88348f5c3 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^AT}Qd8;}%R+`Ae`NtU=qlmzFem6RtIr7}3Cm{gP5<_9|I?zJ|L+PlTfQt`xqhovhJc!4(q8V>0l!wMas}_b)|qc>_`o$-Oz4D` z<&7-nvI37~$E;B%iZJaMo25jysuYO?jB}aEK={{((0s#)E{vBc*>k)cVgh$nNQWTIn2MPB0BiJ62Oc$7{( z*zO6xnVHty?+MSWRLiOw69y(0y4D%rj0ZDwXB9INv$p?B2fjdhnJP1tFy;#{qr${x))GGR;c(SHXYeWq{QB zWqd02ArC%rZ(0_x;(6k~8Alx$HZW`y61p$ZQLg-PpCNIAvEq^( n$MngQzDaPj%GH`MvPdv+{>eJ})h?C==sX5bS3j3^P6lKP!-uEOCt}3C>R|DNig)WpGT%PfAtr z%uP&B4N6T+sVqF1Y6DbM>gnPbQgJKk&;S4S%whsuN4x^c)Mv10x*R^{@aLU9Q^V1V zqMS@0XZ~Nou=>!<0M9*Y%N$i5)TTWS;wTp9&`u0K!StnHL12B;r9_7s{%8XO#zJ-z z4TpmpW-*F0NbUY@pSWRmXJbTz>H*0Om2DZqonagT2@IPPe;zh7xzG%B0E4HipUXO@ GgeCy&Vn^%% literal 0 HcmV?d00001 diff --git a/install-dev/img/04-pt70.png b/install-dev/img/04-pt70.png new file mode 100644 index 0000000000000000000000000000000000000000..5bcd74e8ca174ce6416167d980920d36182f3b9e GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^U^WLEkTt>lKP!-uEOCt}3C>R|DNig)WpGT%PfAtr z%uP&B4N6T+sVqF1Y6DbM?djqeQgJKk&;S4S%wh@5M}z{tNeLWma-GN}kj`w#zsX6> z#MLIF>j6V-qRo{f`aeXf96rh_#C3ZwXbXmSADVoXO1g=K+&2^TY;0_cJXHb6J@7-8dwut`Mc@(7?zbRVDt=?5x8*pfeae MUHx3vIVCg!0ENUw^#A|> literal 0 HcmV?d00001 diff --git a/install-dev/img/05-gd100.png b/install-dev/img/05-gd100.png new file mode 100644 index 0000000000000000000000000000000000000000..7613288415a96fc25bf1d1616042542d35dbb476 GIT binary patch literal 302 zcmV+}0nz@6P)>4o1i4U6h)AJ#S zQ&tcCv3m>0a4>?+m1?+SslL(AP5Lyku?fCF!uHo*WKo<1V-%z%3*m%UPZmTo3EMp7 zK~03Oc;xv%LWPnibAddAcZX9>;%=$Z0saaw0C>a^$Me+xEdT%j07*qoM6N<$g4q9g A1ONa4 literal 0 HcmV?d00001 diff --git a/install-dev/img/05-pt100.png b/install-dev/img/05-pt100.png new file mode 100644 index 0000000000000000000000000000000000000000..efede94542af85d487e9679a44c5bb54f3baf805 GIT binary patch literal 259 zcmV+e0sQ`nP)@D9LMoqL>w61Ii4P2$o%{f`YXl2y6Nq%R2?%% z*^$^ESR8MxZ`|+fU-YVD!f}-&^fgyLBPQca9r>iri`#K&KPo2?BoYnEzOoJKzRt~-b3;-xc@`BhrPObm|002ov JPDHLkV1kN9XaxWO literal 0 HcmV?d00001 diff --git a/install-dev/img/05-pt70.png b/install-dev/img/05-pt70.png new file mode 100644 index 0000000000000000000000000000000000000000..97b6180de5fca3f8179459a2e4a348fcbf56826b GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^AT}Qd8;}%R+`Ae`NtU=qlmzFem6RtIr7}3CCgZF_RJzJ1`pV>B^Gj3HdI*3weHgiXycml zkLgJE#+5GN73?XzcCC**xEyEkEcnA6V8}K@diKIe`VA3GXE(H-n0K@1$uZf0ZR}Sj zD+F){onRJq*~pdkDMzE4T{*}iiP=CsHlcA=8t-N%U&S-8^nC)_7)6wi_pt|Uh;7-q zQBqgu;^A!qmRye~+ORTPFF5#_^{%l^hFWc-Cj*NF!}2hzl5?TA?12tu@O1TaS?83{ F1OSY_S;_za literal 0 HcmV?d00001 diff --git a/install-dev/img/bad.gif b/install-dev/img/bad.gif new file mode 100644 index 0000000000000000000000000000000000000000..adcfa44bb1c0c5e7d25234940b80213f892cf80f GIT binary patch literal 594 zcmZ?wbhEHb6krfwc*el+|NsBruU~(E{`Bj!hkx(f_;cm#&&y}Noj?Ec^x;3pcfLP$ z?A?jOKMw7Eeq`s*9qWE*JiMzh<_5pH%yHQtyWebzgcLesq_9?5%v)-SDBi>_bcbyXKm2 z&DpP-Y97_qJg%#GQCae`D*tmu(xcxZq=1!OvqNuEhtROALM%8F)Cw`+7{kvvBX*pbr6`Ga8Gt$SbKTD5%VE=w}enW|dV?*V?CL zAml62q$?z%?s)37p|YM+lNFzWMw_RloL`fT$i8cKH=B&q6ihsyzwp#Fa&Hp$61TN| z>FFlvFVnv)rDTVWq=ARyM0xR`9}<(2n1wWWxpWy09dYdtFkPh6nc=~}rszFK P=AnbYBu}SC1_o;YGXm6g literal 0 HcmV?d00001 diff --git a/install-dev/img/bg-body.png b/install-dev/img/bg-body.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9aa4c976a3ad579dd4251357bc21cd59f3bda7 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^AT}ol6Oe2{( zJaZG%Q-e|yQz{EjrrH1%8G5=nhE&{2veA$}dHCqhr?<=5BpjX@J)Fqw`FJ98(aaAg p7!>s`;Z_b@WQx}80FKzAUzDmwS?JU03+W)@y zB!1`Wi^Dg@Q|8n0=(|$tMcQLeFPi(U`h)pKUU0TB=-;cX9s8YGvuAmZu|9ilcndSN zoYRT6pF07*qoM6N<$ Eg4R-r>;M1& literal 0 HcmV?d00001 diff --git a/install-dev/img/bg-tab.png b/install-dev/img/bg-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..20d2f2c1ab4236edfc72ef6fb3f5920720d56da3 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bS0V3}$JR=6ABuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%C3w0xhE&{2nzP{9=>rE29ARJ!SsEdcDAIB8P|KlaPNPMq z8a2~qu!(dD&OFYuSVE!6Cqb@jQvUXN3ae96oE~jlFzXP?&t;ucLK6VD6h#IA literal 0 HcmV?d00001 diff --git a/install-dev/img/bg_help.png b/install-dev/img/bg_help.png new file mode 100644 index 0000000000000000000000000000000000000000..f87116b86b09930b9e8dbac7b20c9bc32f0d6566 GIT binary patch literal 908 zcmV;719SX|P)uJ$KMP(B4t2M4#|f^wT- zs@&$fsVw*ILZ(0Z!jzM%i1YiAK`19*^Gx#18o!*}TP2F)wQ@PR%s1pO-}Z8HlX1vj zt+3_fz7;XYI24on4$fVUxz|Ll_CIc}C-+pibC#8=n0yjq9fmAS#~>QMuAUQ@#PmFW-Wrmv6$c z%X605uq-nt`|i|{2hPPxU5vKIvr@)HvIZsf4MgNhbu{B^0+>`Uw5gv$m7=WyPg;<^0+PkzRv-Re2#%XT#X@-$CR~CEipLcF%8rDsh0*=o$-~ z+&9gaGh(@~@z^QM^5nk8=5o*0@6M>@L)t7yARklvj+@Ip<<^<1T$7bcR4V~ zZpq38%US-<$PHP!WI3I%oaHQMIm=o8pUb&!VL8iL&T^KsoaHQMIm=nj@>F@tyl?)2 i#b@A?7dh4Z6kq^ZpkntGQ?_>i0000k~= z>SQJwi8A#;!I&9i<{KtH>@V;i)Hn7f8Z|MFnHVLS8I6X`DGbJ7vn_4u^;{G-O?-s% zaK3N?EpOkC@0@$NWyP5S9MO5K9M(y!IFQDn4%T<9a-mWDG`PwCyc<||W7)Gg^VTA? ze;$BsJJ9odvTcM?H4dg}#1pZpxc#D%Sxw$6RCF5wSf^g!_} zTkmZC&|yB+p1!z{$K+HMIa7=~SD>@K6D26&NqWDJ45G_d<>hq=X13LAf$zAS>dg7gVz^x9xH^zU z3SW{#FaV=sQZyhi6S22J7DF%+icVlALXw3y1cUKuK7G?9Tf*1z2Zh5KBhzAHh)CgU z(7A@K%wPm&Qd-$xU`(L><-~!}amJXGn8|2m>?jznfvIW$fgoqX6l0*PdKOws$Gu8yxnd3_d=8 z4Hyu4=3na1oBuo|a~f-koEwV{u)e`RPs#ieU;tpY#8ev7&R+lk002ovPDHLkV1iI= BM_~W} literal 0 HcmV?d00001 diff --git a/install-dev/img/boutonpt-on.png b/install-dev/img/boutonpt-on.png new file mode 100644 index 0000000000000000000000000000000000000000..17106acfd54af76f8285909d9c96d2eb19a0fe68 GIT binary patch literal 714 zcmV;*0yX`KP){D)P$b%7tgW zNr}L4APyhjOU+KXRyG5#UW4y95q1J$+W@6#DlE%{lNy5ms)YK7^*o=x!vT5f{(tVK z7caTnT8OPrU%-Npn1QiKxHmval8hP{%Bq6l%ml`!C*AVn7i9jDR2a?O#|yb-P>Kqqfq z{R@WL#}pltn5FCh7z?U!C23%EzOGrKV-g|#K*p#VEJXt%CY*`&;4eW})IJzb)pf_x z4X|cMm=h-#LxX0TG^`Pr_ZYFWsbixEHg<$Nai03e(}<3C!4wHhe&hLS_VoNLTEE^Q z+VzD)F-SgQ!I+=H+R9sc%=fOA?@wJ{xP2nD(RsawXxjs8v_$3%oQ4F+HXx5V&@N8n zyVAh=qm>7_a$%{rM_%R=ikCU%PA<-2xWS+{10WDr%Y$9JWCW&)-?oI$FN>&_zS5ol wayM`O^Onp7UgN^KL(vajtN7WPXGV_ literal 0 HcmV?d00001 diff --git a/install-dev/img/boutonpt-over.png b/install-dev/img/boutonpt-over.png new file mode 100644 index 0000000000000000000000000000000000000000..851be19fe9e14d395149ed2d81e703f1b026111a GIT binary patch literal 701 zcmV;u0z& zxql^hb80v{fbHNLloGAKDsr!*vUZ-9gB0sSrThtV3y&UXFt@Dn+x87zDYN-&fEQs6|%VSaiF_l(o+UZTG||fn|>$BosegabbXVgS+k6SK!+e-!f$90*3O%73yf+8 zDFSFLwF`_;2nb9xz}UONa0SU}zC^ELbhT90O5{oeG%`5(FBtAoD~m+M1bZrm`_#%J z2Sx@Gfk$AXAj5(xCh8TVq}|;4D@Aa^-S_LAzh=<}Q?-<8Nar^qT$zQ=5%_dST+)|Bo1~R!O-!n9wh?LU(YsAFj?z2 zGkU=}(LY=`HRCwC#o6SnYP!NUhO(uV>Hd;jt zN)b2i)UDvE2=ys^6J7W&`V6k(rqG?}(p?E^Koqfx(W=!Mdmq4M2F?ekxpaB>7>4H7 z9-2+#SmW$)GEU0?P%lQDk~28|xf;qB*2%k@%(wQ_PL@Qo4f4alLsy_qe2+gTA1`lT z&qY~PPopyyxKA>1lXlw6wl`8#1nP#I%F1GM0L?TWlh zK{Fv#0<_?KT^4y`&-W}U0a|dr#^f7oJOg)uvK^S6rNDZIEaU~sRtNDm;JND?{4xfV z$;-}C$R7dL2B3`aPhRUA;@Jy;DtX1*hz))?zj#C)KojCEMHW*R=!9ad3_z{Cn7lx% zyjU9m)&>BuHURM7wE>eCDBgMB`5B`Mpp3D+q`2op2VDSV+{x?VoDT;a+|B`7m~e8r zRW_6ZXAhkKCFG0MX+bo-QP$_&nCV~NS2#212h@yL&Mjv!SDnbfHNOH300hQ5dTOk| Q0000007*qoM6N<$f(ba#U;qFB literal 0 HcmV?d00001 diff --git a/install-dev/img/bt-hover.png b/install-dev/img/bt-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..9e682dcfa7fc624e63b83b181062bfa566ec4bd3 GIT binary patch literal 752 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 literal 0 HcmV?d00001 diff --git a/install-dev/img/bullet.png b/install-dev/img/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..1da7af138e3986c3cdb20c0ceaf3147dde4e3e03 GIT binary patch literal 1265 zcmVPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$BH8Ae8p8x;^OG!jQ zR5(v%l#5RkR}_b*is8>_+JZb5ide;(f&$f6Tcb9OtraE31tM=2$bty+SfB{Hi;ION z3&^sI3xWu^`q&79Nq)nSNC7@sLodi>LlF7{6Ilu2b?m733`T2R2 zSFY#JpDQaXE6UQ+lCr$KtUP=6Oj)~jt+H<2I>p`HU2$`BQ`W3m^QufyBy9D5`0ydq z)6?9(eVeYH78={jscp-_(wd5;MUSbWqSiDNV!$5!4^qjwyfa&^| zl=SSOsCO47eY-K<*pFp2lB)hg!`eOh?5;* zq&YT`Y}+920MeZs$-K0Qyzf4s?AmTjefvl=2h!Hrpz77y%cw?2M@3z9I0We24+qI< z4<@xSkh3l=ZQ~`Bw?z?Kr6KwJyJWO%-@-Q4kWvMGpG7LBGaWLfrhhNTFKrR&1rTS^P~o#{O!N0G%VwC=&&eSj0qTSylkQ|dItp7kQ4z=JIF0TzCr zR6#Qf6BN`RBv!zZYc*sxZRAv^gl$$gK^Y$($58VH#?JlZINv8#cucDCCC2DQj^#6c zd-_NP{qkgvr1Eegi#<4I_9jKZj*HeQZQIF-%1@9S<^KKqSR5xY*u%(g4nb$t5P!}K zZJ7t7Ke|}vU!E*3kX5;li2S#RKE0lVZ@oyh`jY1irobM|Iook0N12_S<@!KBsir`R zo5Ru9i?*orCg!v!XD(yc?QADRJ%)knJRyd@wg;sP?O%mtd1{Y7(GSzdy-ZWq(;--*TKDe_g(_M29pai_nDa))mZk<(9jTrgM;c*e#`X-4<5XB bFiP!z&_mQfi~x>_00000NkvXXu0mjfzA|AG literal 0 HcmV?d00001 diff --git a/install-dev/img/ico_help.gif b/install-dev/img/ico_help.gif new file mode 100644 index 0000000000000000000000000000000000000000..511538f8ecbee4bc19127abe59ec4f3dcff1254a GIT binary patch literal 1246 zcmV<41R?uJNk%w1VITk?0OkMyG;nTltQS_A)mfa@9cH$o)A`u%67-I~qxn!@EVe#MKz@J*D_X{g+c!t6GK$a%Eo zcC#An^ZG=M&RdHVWTo3ijL*pN|6QQiVxQSyqS|w-+cSa3SBfP|j96`~;2&+fON-5( z(D!bp7Hg&6N|De+k zut9{%DR{v_ip)@!(^r?#8(^EX;{QX8%|wdLFMh_o>Hp#F_hY2nEPBI7kI!MG+_2yM zxa9vXc*LB}`%jV4d$s2+b-z}f*bP>zVxruq+W$<=4W;ZDugprbiJvRnZ4G=9-6A%_JdOkNjlapv|1}|Ap zNg}Qb3rSBc76JxsXr+S(L_1PYA`l}LE5$2F0~t^)4OM*yy1XO_3po`sGC)k*+dwjG z5D9fGThNly2_j-LOkGG7@bO(0Ofn!vRC>>mr#o39OMp~hLoi-Ef^6uGcv3?FE6w0UBN zSgL#fYE(&qCXJ34P*lt?V&q5=4K^dhWH83;pA$hm^bG^T!j2nh)R?ibz=n|~m_r0H zLE+8}4`CQYu&LoPW+N9095J9KfEhU=!oZk4yNQR}P55@OsboeI+AyrH4&a)y5iJ*z zCr1tg^KP4SnjlZ!yuc3w#Letk(8Pw2??P;Nzu@6{2M{qXfDaF&00Zo<5iEcq1dRRr zLN1uF*#Y_e|27oB27G30ki-ZABsf5V2@2tWO?;FA27>}DD8K^~bm0SWItUQQ1{Xdc z;s7EFfQL;cTu7pb4-7Cs4OA#_LjY=Uv4b2F3^2luJdQ9x88O6Ah7~>X_`n`u5Wt21 z8fm=YLjzENFhU7bQaOSZ5B}i*kyTnL0R$Spkp>zr=)i&;IZV04njm0dg;Q3Pz~&NI zlwbh~E9l@tE^46Q0|{{;u!IDJN&vzGPCWoZp&)>e2LcNCfPxw*xd4Cy5+s0t1Q>LR zffHFe;6$fhbV>!71OVWIIeu`k1{phKx`!8Dh#`g-AUNTK1hlH4f){l_zy<+!tO3a& zXas-*tQaz*0uRvg;A;&v@X)|dQ4otm0J#uyfU;z)5W)rpK!Cso)Hcw-1_)RH!2>J! zV8^zsdaEn|K6DWR76`OZKmjeZ06_y&$UuM(0MHvv0BfM2g8?g4(M1>D$e_SG3J2?e z!Wse8YYGQ0;P3$#5Bp%U$vSZH0S+#3(5)`JsNsSeB7b1B%{aK>f*KyfjBI4Y1x@3a IFb4tvJ2E36-v9sr literal 0 HcmV?d00001 diff --git a/install-dev/img/logo.png b/install-dev/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3dda499e88ae89a87848d3187b85ed4de86b914b GIT binary patch literal 15664 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 literal 0 HcmV?d00001 diff --git a/install-dev/img/ombrage-bas.png b/install-dev/img/ombrage-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..0451e3be52db1d686177f106c056d5368dcfdb4f GIT binary patch literal 342 zcmV-c0jd6pP)10000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy_(?=TRCwC#+`Uf2Fcbz*CoSbil^B?K z|A*_uPzeDEA?056M#?+*9O-l7!Hc&~aXhrvUMp{r_j>01CGyY!008>&8~KV{BOj4V zJ+H?YZjryp5}6}YB&GW0%Xzu_3 zfR5zJyzQ5!pDIy#jBg&QByD+Y_e&xUmBHQt0014??u5wX%Ra40BHR?xu-spBme*a07*qoM6N<$fEaktaqG=FU#>$20u2|ptZaI4iMfI)TyM|+m48-V zm6X`PvF`4kM*RskLYJbmXJ_=ZX{Eo|_-66H-pYa%(R*v3O`ZMt)y_Gp-WF>UR?g#m ze)ZwvS;Bf>kI2L>j(#L^T5p&8?Tl6aJjuDs-s|_jJr1-IFZjol&&bBmyiLUTipU}z OkWx=qKbLh*2~7ZBuTwPu literal 0 HcmV?d00001 diff --git a/install-dev/img/phone.png b/install-dev/img/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..862e85be933076c3fcf555727b1c8640012bcb76 GIT binary patch literal 697 zcmV;q0!ICbP)gqbQ00wF@&i@QA*QHP1$jb z4lp=kq4)D^IzF~BH0|=s7eXLRRYLL-%YwJF_s~r$c4iU!&$W$UX|3j3a|2&zrKQ9& zjhWNc%@jq?huhjKx!p60T%pA6n!)95N+?ju1+F;>t)Z5RR2=|wU#@Vju7<8jH$n)H z#v+QWl1DyL09|4X{k=cQFS$$#!`PfwY)&gqS zIP~$Fd5_CV*ZaG?Y=4MIK2N+d9z*FH%zo{EB5VCPP4yK_WS3z|%OnEOuFF6xf6J5` zuM`4xtQlkE2p@U|Sd)8;Gy9K_5CqKjVYR*B`h5#I1`S%{C5&1PDuBsOTARzb(P1ZH z%MMl#J>#8y0s@BzGQtgw)Rz~{Ct|1V`6-%4cX6WNI0-W?JbqG(Bkc}nv-KVwzw@dt ziK{(h_{QMV*oP1{W$yEk0?tO-#uC|Mt|TQwOIYktO7nA&4LqRR?G1{=n7)mmfVUDr ztVFF2UNGh1#3iL6`!VBljX725lQ*MYl&J~{S+Z#gKT8ChhVDk!Re;6qV!Ur0wKUAH zRo`fLm^qNaviQqNM`1d7k90=^EuGyU8>HWTj0?rt$d^wHsQ8ap>&Yv8N}k6wFB`l7 f@!$P!D@Obqdg{q6o(owq00000NkvXXu0mjf(ZD=O literal 0 HcmV?d00001 diff --git a/install-dev/img/puce.gif b/install-dev/img/puce.gif new file mode 100644 index 0000000000000000000000000000000000000000..d32f60750cb016e667add2888efa321a236080d6 GIT binary patch literal 683 zcmV;c0#yA+Nk%w1VG#fk0OkMyoz_H;wioR1%$~hNl+`1h(_NF*9P{(Y8O^_m>*InuE*}lq@ z{{Q#I<#&SsrrTd=raY6%Sf<@oq1auk%~z-0Uzpf0;Ejm0PJwhfD z2X$~`DJVN2JUT!P1Q$aI0bK_SSpybD1PwqZ1qK&e39cY{!r)IBEG!HZIKj`~y8vJW z{JAsdp28CkHuULcVv2}APRNwo@n*vV4huXm^PvTbhyl~8d060p#*8W%c(uu)Bp8bu z8Pv?6;fKSSCV05Gf(2tm5;kWz45F}L1b`z}N|Yer0Ye%JjT}^1f&q;iF&LIqaL`DQ R3JOLDT*x&-K?S2g06Wl5Bn$um literal 0 HcmV?d00001 diff --git a/install-dev/img/shadow-left.png b/install-dev/img/shadow-left.png new file mode 100644 index 0000000000000000000000000000000000000000..f3122811fdbe6ca82162cd4689c03fd98a64f1fe GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 +header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé + +if (function_exists('date_default_timezone_set')) + date_default_timezone_set('Europe/Paris'); + +/* Redefine REQUEST_URI if empty (on some webservers...) */ +$_SERVER['REQUEST_URI'] = str_replace('//', '/', $_SERVER['REQUEST_URI']); +if (!isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_URI'] == '') + $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; +if ($tmp = strpos($_SERVER['REQUEST_URI'], '?')) + $_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $tmp); + +define('INSTALL_VERSION', '1.5.0.0'); +define('MINIMUM_VERSION_TO_UPDATE', '0.8.5'); +define('INSTALL_PATH', dirname(__FILE__)); +if (version_compare(phpversion(), '5.0.0', '<')) +{ + echo ' + + + + + +

    PrestaShop requires PHP5 or later, you are currently running: '.phpversion().'
    + '.lang('If you do not know how to enable it, use our turnkey solution PrestaBox at').' http://www.prestabox.com.

    + '; + die; +} + +require(dirname(__FILE__).'/../config/autoload.php'); +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); +include_once(INSTALL_PATH.'/classes/GetVersionFromDb.php'); + +/* Prevent from bad URI parsing when using index.php */ +$requestUri = str_replace('index.php', '', $_SERVER['REQUEST_URI']); +$tmpBaseUri = substr($requestUri, 0, -1 * (strlen($requestUri) - strrpos($requestUri, '/')) - strlen(substr(substr($requestUri,0,-1), strrpos( substr($requestUri,0,-1),"/" )+1))); +define('PS_BASE_URI', $tmpBaseUri[strlen($tmpBaseUri) - 1] == '/' ? $tmpBaseUri : $tmpBaseUri.'/'); +define('PS_BASE_URI_ABSOLUTE', 'http://'.ToolsInstall::getHttpHost(false, true).PS_BASE_URI); + +/* Old version detection */ +$oldversion = false; +$sameVersions = false; +$tooOld = true; +$installOfOldVersion = false; +if (file_exists(INSTALL_PATH.'/../config/settings.inc.php')) +{ + include(INSTALL_PATH.'/../config/settings.inc.php'); + $oldversion =_PS_VERSION_; + $tooOld = (version_compare($oldversion, MINIMUM_VERSION_TO_UPDATE) == -1); + $sameVersions = (version_compare($oldversion, INSTALL_VERSION) == 0); + $installOfOldVersion = (version_compare($oldversion, INSTALL_VERSION) == 1); +} + +include(INSTALL_PATH.'/classes/LanguagesManager.php'); +$lm = new LanguageManager(dirname(__FILE__).'/langs/list.xml'); +$_LANG = array(); +$_LIST_WORDS = array(); +function lang($txt) { + global $_LANG , $_LIST_WORDS; + return (isset($_LANG[$txt]) ? $_LANG[$txt] : $txt); +} +if ($lm->getIncludeTradFilename()) + include_once($lm->getIncludeTradFilename()); + +?> + + + + + + + + + + <?php echo lang('PrestaShop '.INSTALL_VERSION.' Installer'); ?> + + + + + + + + + + + + + + +
    + +
    + +
    + + + + diff --git a/install-dev/langs/de.php b/install-dev/langs/de.php new file mode 100644 index 000000000..acc28cf86 --- /dev/null +++ b/install-dev/langs/de.php @@ -0,0 +1,285 @@ + klicken Sie auf Weiter zum Fortfahren!'; +$_LANG['Your configuration is invalid. Please fix the issues below:'] = 'Ihre Konfiguration ist nicht gültig,
    bitte beheben Sie diese Probleme:'; +$_LANG['You have to create a database, help available in readme_en.txt'] = 'Sie müssen zunächst eine Datenbank erstellen (Hilfe in der Datei readme.txt verfügbar)'; +$_LANG['If you check this box and your mail configuration is wrong, your installation might be blocked. If so, please uncheck the box to go to the next step.'] = 'Diese Option kann hinderlich sein, wenn Ihre E-Mail-Konfiguration falsch ist, bitte deaktivieren Sie sie, wenn Sie nicht zum nächsten Schritt gehen können.'; +$_LANG['Mcrypt is available (recommended)'] = 'Mcrypt ist verfügbar (empfohlen)'; +$_LANG['Your MySQL server doesn\'t support this engine, please use another one like MyISAM'] = 'Diese Datenbank-Engine wird nicht unterstützt, bitte wählen Sie eine andere als MyISAM'; +$_LANG['Adult'] = 'Erotik und Dessous'; +$_LANG['Animals and Pets'] = 'Tiere'; +$_LANG['Art and Culture'] = 'Kultur und Freizeit'; +$_LANG['Babies'] = 'Baby-Artikel'; +$_LANG['Beauty and Personal Care'] = 'Gesundheit und Schönheit'; +$_LANG['Cars'] = 'Auto und Motorrad'; +$_LANG['Computer Hardware and Software'] = 'Computer & Software'; +$_LANG['Download'] = 'Download'; +$_LANG['Fashion and accessories'] = 'Kleidung und Accessoires'; +$_LANG['Flowers, Gifts and Crafts'] = 'Blumen und Geschenke'; +$_LANG['Food and beverage'] = 'Lebensmittel und Gastronomie'; +$_LANG['HiFi, Photo and Video'] = 'Hifi, Foto und Video'; +$_LANG['Home and Garden'] = 'Haus & Garten'; +$_LANG['Home Appliances'] = 'Haushaltsgeräte'; +$_LANG['Jewelry'] = 'Schmuck'; +$_LANG['Mobile and Telecom'] = 'Telefonie und Kommunikation'; +$_LANG['Services'] = 'Dienstleistungen'; +$_LANG['Shoes and accessories'] = 'Schuhe und Accessoires'; +$_LANG['Sport and Entertainment'] = 'Sport und Freizeit'; +$_LANG['Travel'] = 'Reise und Tourismus'; +$_LANG['Main activity:'] = 'Haupttätigkeit'; +$_LANG['-- Please choose your main activity --'] = '- Wählen Sie eine Tätigkeit --'; +$_LANG['A question about PrestaShop or issues during installation or upgrade? Call us!'] = 'Eine Frage zu PrestaShop oder ein Problem bei der Installation oder beim Upgrade? Rufen Sie uns an!'; +$_LANG['Invalid catalog mode'] = 'Feld Katalog-Modus ungültig'; +$_LANG['Catalog mode:'] = 'Katalog-Modus:'; +$_LANG['Yes'] = 'Ja'; +$_LANG['No'] = 'Nein'; +$_LANG['If you activate this feature, all purchase features will be disabled. You can activate this feature later in your back office'] = 'Wenn Sie diese Option aktivieren, werden alle Kauf-Funktionen deaktiviert. Sie können diese Option später in Ihrem Back-Office aktivieren'; +$_LANG['the already installed version detected is too recent, no update available'] = 'Die bereits installierte Version, die erkannt wurde, ist neu, keine Updates verfügbar'; +$_LANG['This information isn\'t required, it will be used for statistical purposes. This information doesn\'t change anything in your store.'] = 'Diese Information ist nicht erforderlich, sie wird zu statistischen Zwecken verwendet. Diese Information ändert nichts in Ihrem Shop.'; +$_LANG['Invalid shop name'] = 'Ungültiger Shopname'; +$_LANG['Your firstname contains some invalid characters'] = 'Ihr Vorname enthält ungültige Zeichen'; +$_LANG['Your lastname contains some invalid characters'] = 'Ihr Nachname enthält ungültige Zeichen'; + + +$_LANG['(FREE)'] = '(KOSTENLOS)'; +$_LANG['(FREE too!)'] = '(ebenfalls KOSTENLOS!)'; +$_LANG['Shop configuration'] = 'Shop-Konfiguration'; +$_LANG['Database Engine:'] = 'Datenbank-Engine'; +$_LANG['I certify that I backed up my database and application files. I assume all responsibility for any data loss or damage related to this upgrade.'] = 'Ich bestätige, dass ich meine Datenbank und meine Anwendungsdateien durch ein Backup gesichert habe. Ich übernehme die volle Verantwortung für jeglichen Datenverlust oder jegliche Datenbeschädigung, die im Zusammenhang mit diesem Upgrade stehen.'; +$_LANG['The file /img/logo.jpg is not writable, please CHMOD 755 this file or CHMOD 777'] = 'Die Datei /img/logo.jpg kann nicht geschrieben werden, bitte ändern Sie die Dateirechte mit CHMOD 755 oder CHMOD 777'; +$_LANG['If you do not know how to enable it, use our turnkey solution PrestaBox at'] = 'Wenn Sie nicht wissen, wie Sie es aktivieren müssen, nutzen Sie unsere Fertiglösung PrestaBox'; +$_LANG['If you do not know how to fix these issues, use turnkey solution PrestaBox at'] = 'Wenn Sie nicht wissen, wie Sie diese Themen festlegen können, nutzen Sie die Fertiglösung PrestaBox'; +$_LANG['the already installed version detected is too old, no more update available'] = 'Die bereits installierte erkannte Version ist zu alt, es ist kein Update mehr verfügbar'; +$_LANG['Simple mode: Basic installation'] = 'Einfacher Modus: Grundinstallation'; +$_LANG['Full mode: includes'] = 'Komplettmodus: beinhaltet'; +$_LANG['100+ additional modules'] = 'über 100 zusätzliche Module'; +$_LANG['and demo products'] = 'und Demo-Produkte'; +$_LANG['Installation type'] = 'Installationstyp'; +$_LANG['Upgrade in progress'] = 'Upgrade läuft'; +$_LANG['Current query:'] = 'Aktueller Satz:'; +$_LANG['Details about this upgrade'] = 'Mehr über das Upgrade'; +$_LANG['Thank you, you will be able to continue the upgrade process by clicking on the "Next" button.'] = ''; +$_LANG['PrestaShop is upgrading your shop one version after the other, the following upgrade files will be processed:'] = ''; +$_LANG['Upgrade file'] = 'Upgrade-Datei'; +$_LANG['Modifications to process'] = 'Änderungen zum Durchführen'; +$_LANG['(major)'] = '(wichtig)'; +$_LANG['TOTAL'] = '(GESAMT)'; +$_LANG['Estimated time to complete the'] = 'Verbliebene Zeit zum Abschluß von'; +$_LANG['modifications:'] = 'Modifikationen'; +$_LANG['minutes'] = 'Minuten'; +$_LANG['minute'] = 'Minute'; +$_LANG['seconds'] = 'Sekunden'; +$_LANG['second'] = 'Sekunde'; +$_LANG['Depending on your server and the size of your shop'] = 'Anhängig vom Server und der Größer Ihres Shops'; +$_LANG['You did not update your shop for a while,'] = 'Sie haben Ihren Shop seit Längerem nicht upgedatet,'; +$_LANG['stable releases have been made ​​available since.'] = 'wichtige Neuerungen wurden implementiert seit'; +$_LANG['This is not a problem however the update may take several minutes, try to update your shop more frequently.'] = 'Das ist unwesentlich, das Upgrade kann einige Minuten dauern, versuchen Sie, Ihren Shop öfert zu updaten.'; +$_LANG['No files to process, this might be an error.'] = 'Keine Dateien zum Verarbeiten, womöglich ein Fehler'; +$_LANG['Hosting parameters'] = 'Hosting Eigenschaften'; +$_LANG['PrestaShop tries to automatically set the best settings for your server in order the update to be successful.'] = 'Prestashop versucht automatisch, die besten Einstellungen auf dem Server zu machen, damit das Update erfolgreich verläuft.'; +$_LANG['PHP parameter'] = 'PHP Parameter'; +$_LANG['Description'] = 'Beschreibung'; +$_LANG['Current value'] = 'Aktueller Wert'; +$_LANG['Maximum allowed time for the upgrade'] = 'Maximale zugelassene Zeit für das Update'; +$_LANG['Maximum memory allowed for the upgrade'] = 'Maximal zugelassener Speichern für das Update'; +$_LANG['All your settings seem to be OK, go for it!'] = 'Alle Einstellungen scheinen zu stimmen, es kann losgehen!'; +$_LANG['Let\'s go!'] = 'Los!'; +$_LANG['Click on the "Next" button to start the upgrade, this can take several minutes,'] = 'Klicken Sie das "Weiter"-Button um das Upgrade zu starten, es könne einige Minuten dauern.'; +$_LANG['do not close the window and be patient.'] = 'bitte schließen Sie das Fenster nicht.'; +$_LANG['Your update is completed!'] = 'Ihr Upgrade ist abgeschlossen!'; +$_LANG['Your shop version is now'] = 'Ihre Shopversion ist nun'; +$_LANG['New features in PrestaShop v'] = 'Neue Features in Prestashop v'; +$_LANG['Beware, your settings look correct but are not optimal, if you encounter problems (upgrade too long, memory error...), please ask your hosting provider to increase the values of these parameters (max_execution_time & memory_limit).'] = 'Achtung, Ihre Einstellungen sind zwar korrekt, aber nicht optimal. Sollten während des Updates Probleme auftreten (Ausführungszeit, Speicherlimit usw.) kontaktieren Sie bitte Ihr Hostingunternehmen, damit diese Einstellungen angepasst werden (max_execution_time & memory_limit) '; +$_LANG['We strongly recommend that you inform your hosting provider to modify the settings before process to the update.'] = 'Wir empfehlen ausdrücklich, Ihren Hostingprovider zu kontaktieren, um die Einstellungen für das Update anzupassen'; +$_LANG['Module compatibility'] = 'Modulkompatibilität'; +$_LANG['It\'s dangerous to keep non-native modules activated during the update. If you really want to take this risk, uncheck the following box.'] = 'Es wird nicht empfohlen, fremde Module während des Updates aktiviert zu lassen. Wenn Sie trotzdem fortfahren wollen, entfernen Sie die Markierung in der Checkbox'; +$_LANG['You will be able to manually reactivate them in your back-office, once the update process has succeeded.'] = 'Sie können sie später im Adminbereich aktivieren, nachdem das Update abgeschlossen ist.'; +$_LANG['Ok, please desactivate the following modules, I will reactivate them later:'] = 'ok, bitte folgende Module deaktivieren (sie werden später wieder aktiviert):'; +$_LANG['Theme compatibility'] = 'Themenkompatibilität'; +$_LANG['Before updating, you need to check that your theme is compatible with version'] = 'Um fortzufahren müssen Sie bestätigen, dass Ihr Thema mit der aktuellen Version kompatibel ist'; +$_LANG['of PrestaShop.'] = 'von Prestashop'; +$_LANG['Link to the validator'] = 'Link zum Validator'; +$_LANG['Online Theme Validator'] = 'Online Themenvalidator'; +$_LANG['If your theme is not valid, you may experience some problems in your front-office aspect, but don\'t panic ! To solve this, you can make it compatible by correcting the validators errors or by using a theme compatible with '] = 'Sollte Ihr Thema nicht kompatibel sein, könnten einige Probleme im Front-End auftreten. Sie können die Kompatibilität wieder einstellen, indem Sie im Backend Unter Einstellungen die entsprechende Einstellung treffen'; +$_LANG['version'] = 'Version'; +$_LANG['In this aim, use our'] = 'Verwenden Sie dazu unseren'; +$_LANG['Additional Benefits'] = 'Exklusiv Angebot'; +$_LANG['Exclusive offers dedicated to PrestaShop merchants'] = 'Exklusiv Angebot für die Verkäufer PrestaShop'; +$_LANG['PHP magic quotes option is off (recommended)'] = 'Die PHP-Option "magic quotes" ist deaktiviert (empfohlen)'; \ No newline at end of file diff --git a/install-dev/langs/es.php b/install-dev/langs/es.php new file mode 100644 index 000000000..5560c5a47 --- /dev/null +++ b/install-dev/langs/es.php @@ -0,0 +1,285 @@ +gracias por corregir la configuración:'; +$_LANG['You have to create a database, help available in readme_en.txt'] = 'Debe crear una base de datos, puede encontrar ayuda en el archivo readme_es.txt'; +$_LANG['Discover your store'] = 'Descubra su tienda'; +$_LANG['If you check this box and your mail configuration is wrong, your installation might be blocked. If so, please uncheck the box to go to the next step.'] = 'Esta opción se puede bloquear si su configuración de correo electrónico está mal, gracias a desactivarla si usted no puede moverse a la siguiente etapa.'; +$_LANG['A question about PrestaShop or issues during installation or upgrade? Call us!'] = '¿Alguna pregunta sobre PrestaShop o problemas durante su instalación o actualización? ¡Llámenos!'; +$_LANG['Invalid catalog mode'] = 'Campo modo catálogo no válido'; +$_LANG['Catalog mode:'] = 'Modo Catálogo:'; +$_LANG['Yes'] = 'Sí'; +$_LANG['No'] = 'No'; +$_LANG['If you activate this feature, all purchase features will be disabled. You can activate this feature later in your back office'] = 'Si activa esta opción, se desactivarán todas las aplicaciones de compra. Puede activar dicha opción posteriormente en el panel de administración.'; +$_LANG['the already installed version detected is too recent, no update available'] = 'la versi√≥n instalada que se ha detectado es demasiado reciente, no hay ninguna actualizaci√≥n disponible'; +$_LANG['If you do not know how to enable it, use our turnkey solution PrestaBox at'] = 'Si no sabe activarla, utilice nuestra solución PrestaBox en'; +$_LANG['Invalid shop name'] = 'Nombre de la tienda no válido'; +$_LANG['Your firstname contains some invalid characters'] = 'Su nombre contiene caracteres no válidos'; +$_LANG['Your lastname contains some invalid characters'] = 'Su apellido contiene caracteres no válidos'; +$_LANG['Your MySQL server doesn\'t support this engine, please use another one like MyISAM'] = 'El soporte de este motor de base de datos no se puede soportar, elija otro como por ejemplo MyISAM'; +$_LANG['The file /img/logo.jpg is not writable, please CHMOD 755 this file or CHMOD 777'] = 'El archivo /img/logo.jpg no tiene derechos de escritura, por favor efectúe un CHMOD 755 o 777 en el archivo'; +$_LANG['The config/defines.inc.php file was not found. Where did you move it?'] = 'El archivo config/defines.inc.php no se ha encontrado. ¿Dónde se encuentra?'; +$_LANG['All tips and advice about PrestaShop'] = 'Todos los trucos y consejos sobre PrestaShop'; +$_LANG['+33 (0)1.40.18.30.04'] = '+33 (0)1.40.18.30.04'; +$_LANG['the already installed version detected is too old, no more update available'] = 'la versión instalada es demasiado antigua, no existen actualizaciones.'; +$_LANG['Mcrypt is available (recommended)'] = 'Mcrypt está disponible (aconsejable)'; +$_LANG['If you do not know how to fix these issues, use turnkey solution PrestaBox at'] = 'Si no puede solucionar estos problemas, utilice nuestra solución PrestaBox en'; +$_LANG['Database Engine:'] = 'Tipo de base de datos:'; +$_LANG['Installation type'] = 'Tipo de instalación'; +$_LANG['Simple mode: Basic installation'] = 'Modo básico: instalación simplificada'; +$_LANG['(FREE)'] = '(GRATIS)'; +$_LANG['Full mode: includes'] = 'Modo completo: incluido'; +$_LANG['100+ additional modules'] = '100 módulos'; +$_LANG['and demo products'] = 'y productos de demostración'; +$_LANG['(FREE too!)'] = '(¡TAMBIEN GRATIS!)'; +$_LANG['Shop configuration'] = 'Configuración de la tienda'; +$_LANG['Main activity:'] = 'Actividad principal'; +$_LANG['-- Please choose your main activity --'] = '-- Elija una actividad --'; +$_LANG['Adult'] = 'Adulto y lencería'; +$_LANG['Animals and Pets'] = 'Animales'; +$_LANG['Art and Culture'] = 'Cultura y ocio'; +$_LANG['Babies'] = 'Artículos para bebés'; +$_LANG['Beauty and Personal Care'] = 'Salud y belleza'; +$_LANG['Cars'] = 'Automóvil y motos'; +$_LANG['Computer Hardware and Software'] = 'Informática y programas'; +$_LANG['Download'] = 'Descargas'; +$_LANG['Fashion and accessories'] = 'Ropa y complementos'; +$_LANG['Flowers, Gifts and Crafts'] = 'Flores y regalos'; +$_LANG['Food and beverage'] = 'Alimentación y gastronomía'; +$_LANG['HiFi, Photo and Video'] = 'Hifi, foto y vídeo'; +$_LANG['Home and Garden'] = 'Casa y jardín'; +$_LANG['Home Appliances'] = 'Electrodomésticos'; +$_LANG['Jewelry'] = 'Joyería'; +$_LANG['Mobile and Telecom'] = 'Telefonía y comunicación'; +$_LANG['Services'] = 'Servicios'; +$_LANG['Shoes and accessories'] = 'Calzado y complementos'; +$_LANG['Sport and Entertainment'] = 'Deporte y ocio'; +$_LANG['Travel'] = 'Viajes y turismo'; +$_LANG['This information isn\'t required, it will be used for statistical purposes. This information doesn\'t change anything in your store.'] = 'Esta información no es obligatoria, solo se utilizará para estadísticas. Proporcionarla o no, no cambiará nada en su tienda.'; +$_LANG['E-mail:'] = 'Email :'; +$_LANG['I certify that I backed up my database and application files. I assume all responsibility for any data loss or damage related to this upgrade.'] = 'Certifico que he efectuado una copia de seguridad de mi base de datos y de mis archivos. Asumo plenamente la responsabilidad en caso en que se pierdan los datos o se produzca un error relacionado con esta actualización.'; +$_LANG['Upgrade in progress'] = 'Actualización en curso'; +$_LANG['Current query:'] = 'Búsqueda actual:'; +$_LANG['Details about this upgrade'] = 'Detalles sobre esta actualización'; +$_LANG['Thank you, you will be able to continue the upgrade process by clicking on the "Next" button.'] = 'Gracias, puede continuar la actualización, pulsando en "Siguiente".'; +$_LANG['PrestaShop is upgrading your shop one version after the other, the following upgrade files will be processed:'] = 'PrestaShop actualiza las versiones de su tienda de una en una, los siguientes archivos de actualización van a ser tratados:'; +$_LANG['Upgrade file'] = 'Archivo de actualizaciones'; +$_LANG['Modifications to process'] = 'Modificaciones que deben tenerse en cuenta'; +$_LANG['(major)'] = '(majeure)'; +$_LANG['TOTAL'] = 'TOTAL'; +$_LANG['Estimated time to complete the'] = 'Tiempo estimado para realizar la'; +$_LANG['modifications:'] = 'modificaciones :'; +$_LANG['minutes'] = 'minutos'; +$_LANG['minute'] = 'minuto'; +$_LANG['seconds'] = 'segundos'; +$_LANG['second'] = 'segundo'; +$_LANG['Depending on your server and the size of your shop'] = 'En función de la potencia de su servidor y el tamaño de su tienda...'; +$_LANG['You did not update your shop for a while,'] = 'No ha actualizado su tienda desde hace algún tiempo,'; +$_LANG['stable releases have been made ​​available since.'] = 'hay versiones mayores a disposición desde entonces.'; +$_LANG['This is not a problem however the update may take several minutes, try to update your shop more frequently.'] = 'No es un problema pero la actualización puede durar algunos minutos. Intente actualizar su tienda más a menudo.'; +$_LANG['No files to process, this might be an error.'] = 'No hay ningún archivo para tratar, se trata sin duda de un error'; +$_LANG['Hosting parameters'] = 'Parámetros hosting'; +$_LANG['PrestaShop tries to automatically set the best settings for your server in order the update to be successful.'] = 'PrestaShop intenta configurar por usted los parámetros de su servidor para que la actualización se efectúe de manera correcta.'; +$_LANG['PHP parameter'] = 'Parámetro PHP'; +$_LANG['Description'] = 'Descripción'; +$_LANG['Current value'] = 'Valor actual'; +$_LANG['Maximum allowed time for the upgrade'] = 'Tiempo máximo autorizado para la actualización'; +$_LANG['Maximum memory allowed for the upgrade'] = 'Memoria máxima autorizada para la actualización'; +$_LANG['All your settings seem to be OK, go for it!'] = 'Todos los parámetros son correctos, ¡adelante!'; +$_LANG['Beware, your settings look correct but are not optimal, if you encounter problems (upgrade too long, memory error...), please ask your hosting provider to increase the values of these parameters (max_execution_time & memory_limit).'] = 'Atención, los parámetros parecen correctos pero no son óptimos, si encuentra una dificultad (actualización bloqueada antes de su finalización, error de memoria...), pida a su hosting que aumente los valores de dichos parámetros (max_execution_time & memory_limit).'; +$_LANG['We strongly recommend that you inform your hosting provider to modify the settings before process to the update.'] = 'Le aconsejamos que avise a su hosting antes de comenzar la actualización para que modifique los parámetros PHP.'; +$_LANG['Let\'s go!'] = 'El proceso ha comenzado'; +$_LANG['Click on the "Next" button to start the upgrade, this can take several minutes,'] = 'Pulse en "Siguiente" para comenzar la actualización, esto puede llevar unos minutos,'; +$_LANG['do not close the window and be patient.'] = 'no cierre la ventana y espere.'; +$_LANG['Your update is completed!'] = 'La actualización ha concluido con éxito'; +$_LANG['Your shop version is now'] = 'La versión de su tienda ya está'; +$_LANG['New features in PrestaShop v'] = 'Nuevas aplicaciones en dans PrestaShop v'; +$_LANG['Module compatibility'] = 'Compatibilidad Módulos'; +$_LANG['It\'s dangerous to keep non-native modules activated during the update. If you really want to take this risk, uncheck the following box.'] = 'Se desaconseja dejar los módulos no nativos activos durante la actualización. Si realmente desea correr ese riesgo, desactive la siguiente casilla.'; +$_LANG['You will be able to manually reactivate them in your back-office, once the update process has succeeded.'] = 'Después podrá reactivarlos manualmente en el back-office, una vez la actualización haya terminado.'; +$_LANG['Ok, please desactivate the following modules, I will reactivate them later:'] = 'De acuerdo, desactive automáticamente los siguientes módulos, los activaré yo mismo más tarde:'; +$_LANG['Theme compatibility'] = 'Compatibilidad del tema'; +$_LANG['Before updating, you need to check that your theme is compatible with version'] = 'Antes de la actualización, debe comprobar que su tema es compatible con la versión'; +$_LANG['of PrestaShop.'] = 'de PrestaShop'; +$_LANG['Link to the validator'] = 'Link hacia el validador'; +$_LANG['Online Theme Validator'] = 'Validador del tema en línea'; +$_LANG['If your theme is not valid, you may experience some problems in your front-office aspect, but don\'t panic ! To solve this, you can make it compatible by correcting the validators errors or by using a theme compatible with '] = 'Si su tema no es válido, podría tener problemas en la página de su sitio Web, pero no se preocupe, ¡puede hacerlo compatible corrigiendo los errores señalados por el validador o utilizando un tema compatible con la versión!' ; +$_LANG['version'] = 'versión'; +$_LANG['In this aim, use our'] = 'En este objetivo, utilice nuestro'; +$_LANG['Additional Benefits'] = 'Otros beneficios'; +$_LANG['Exclusive offers dedicated to PrestaShop merchants'] = 'Ofertas exclusivas dedicadas a los comerciantes PrestaShop'; +$_LANG['PHP magic quotes option is off (recommended)'] = 'La opción PHP "magic quotes" está desactivada (aconsejable)'; \ No newline at end of file diff --git a/install-dev/langs/fr.php b/install-dev/langs/fr.php new file mode 100644 index 000000000..e0e28351f --- /dev/null +++ b/install-dev/langs/fr.php @@ -0,0 +1,289 @@ +cliquez sur suivant pour continuer !'; +$_LANG['Your configuration is invalid. Please fix the issues below:'] = 'Votre configuration n\'est pas valide,
    merci de corriger ces problèmes :'; +$_LANG['You have to create a database, help available in readme_en.txt'] = 'Vous devez au préalable créer une base de données (aide disponible dans le fichier readme.txt)'; +$_LANG['If you check this box and your mail configuration is wrong, your installation might be blocked. If so, please uncheck the box to go to the next step.'] = 'Cette option peut être bloquante si votre configuration e-mail est erronée, merci de la désactiver si vous ne pouvez pas passer à l\'étape suivante.'; +$_LANG['Mcrypt is available (recommended)'] = 'Mcrypt est disponible (recommandé)'; +$_LANG['Your MySQL server doesn\'t support this engine, please use another one like MyISAM'] = 'Le support de ce moteur de base de donnée n\'est pas supporté, veuillez en choisir un autre tel que MyISAM'; +$_LANG['Adult'] = 'Adulte et lingerie'; +$_LANG['Animals and Pets'] = 'Animaux'; +$_LANG['Art and Culture'] = 'Culture et divertissements'; +$_LANG['Babies'] = 'Articles pour bébé'; +$_LANG['Beauty and Personal Care'] = 'Santé et beauté'; +$_LANG['Cars'] = 'Auto et moto'; +$_LANG['Computer Hardware and Software'] = 'Informatique et logiciels'; +$_LANG['Download'] = 'Téléchargement'; +$_LANG['Fashion and accessories'] = 'Vêtements et accessoires'; +$_LANG['Flowers, Gifts and Crafts'] = 'Fleurs et cadeaux'; +$_LANG['Food and beverage'] = 'Alimentation et gastronomie'; +$_LANG['HiFi, Photo and Video'] = 'Hifi, photo et vidéos'; +$_LANG['Home and Garden'] = 'Maison et jardin'; +$_LANG['Home Appliances'] = 'Électroménager'; +$_LANG['Jewelry'] = 'Bijouterie'; +$_LANG['Mobile and Telecom'] = 'Téléphonie et communication'; +$_LANG['Services'] = 'Services'; +$_LANG['Shoes and accessories'] = 'Chaussures et accessoires'; +$_LANG['Sport and Entertainment'] = 'Sport et loisirs'; +$_LANG['Travel'] = 'Voyage et tourisme'; +$_LANG['Main activity:'] = 'Activité principale'; +$_LANG['-- Please choose your main activity --'] = '-- Choisissez une activité --'; +$_LANG['A question about PrestaShop or issues during installation or upgrade? Call us!'] = 'Une question à propos de PrestaShop ou un problème lors de l\'installation ou la mise à jour ? Appelez-nous !'; +$_LANG['Invalid catalog mode'] = 'Champ mode catalog invalide'; +$_LANG['Catalog mode:'] = 'Mode Catalogue :'; +$_LANG['Yes'] = 'Oui'; +$_LANG['No'] = 'Non'; +$_LANG['If you activate this feature, all purchase features will be disabled. You can activate this feature later in your back office'] = 'Si vous activez cette option, toutes les fonctionnalités d\'achats vont être désactivées. Vous pouvez activer cette option plus tard dans votre back-office'; +$_LANG['the already installed version detected is too recent, no update available'] = 'la version déjà installée qui a été détectée est trop récente, aucune mise à jour disponible'; +$_LANG['This information isn\'t required, it will be used for statistical purposes. This information doesn\'t change anything in your store.'] = 'Cette information n\'est pas obligatoire, elle sera utilisée à des fins statistiques. Cette information ne changera rien dans votre boutique.'; +$_LANG['Invalid shop name'] = 'Nom de boutique invalide'; +$_LANG['Your firstname contains some invalid characters'] = 'Votre prénom contient des caractères invalides'; +$_LANG['Your lastname contains some invalid characters'] = 'Votre nom contient des caractères invalides'; +$_LANG['PrestaShop '.INSTALL_VERSION.' Installer'] = ''; +$_LANG['+33 (0)1.40.18.30.04'] = '+33 (0)1.40.18.30.04'; +$_LANG['(FREE)'] = '(GRATUIT)'; +$_LANG['(FREE too!)'] = '(GRATUIT AUSSI !)'; +$_LANG['Shop configuration'] = 'Configuration de la boutique'; +$_LANG['Database Engine:'] = 'Type de base de données :'; +$_LANG['I certify that I backed up my database and application files. I assume all responsibility for any data loss or damage related to this upgrade.'] = 'Je certifie avoir effectué une sauvegarde de ma base de données et de mes fichiers. J\'assume pleinement l\'ensemble des responsabilités liées à toute perte de données ou dommage lié à cette mise à jour.'; +$_LANG['The file /img/logo.jpg is not writable, please CHMOD 755 this file or CHMOD 777'] = 'Le fichier /img/logo.jpg n\'a pas les droits d\'écriture, merci d\'effectuer un CHMOD 755 ou 777 sur ce fichier'; +$_LANG['If you do not know how to enable it, use our turnkey solution PrestaBox at'] = 'Si vous ne savez pas comment l\'activer, utilisez notre solution PrestaBox sur'; +$_LANG['If you do not know how to fix these issues, use turnkey solution PrestaBox at'] = 'Si vous ne parvenez pas à régler ces problèmes, utilisez notre solution PrestaBox sur'; +$_LANG['the already installed version detected is too old, no more update available'] = 'la version déjà installée est trop ancienne, aucune mise à jour possible.'; +$_LANG['Simple mode: Basic installation'] = 'Mode basique : installation simplifiée'; +$_LANG['Full mode: includes'] = 'Mode complet : inclut'; +$_LANG['100+ additional modules'] = '100 modules'; +$_LANG['and demo products'] = 'et des produits de démonstration'; +$_LANG['Installation type'] = 'Type d\'installation'; +$_LANG['Upgrade in progress'] = 'Mise à jour en cours'; +$_LANG['Current query:'] = 'Requête actuelle :'; +$_LANG['Details about this upgrade'] = 'Détails à propos de cette mise à jour'; +$_LANG['Thank you, you will be able to continue the upgrade process by clicking on the "Next" button.'] = 'Merci, vous pouvez continuer la mise à jour en cliquant sur le bouton "Suivant".'; +$_LANG['PrestaShop is upgrading your shop one version after the other, the following upgrade files will be processed:'] = 'PrestaShop met à jour votre boutique une version après l\'autre, les fichiers de mise à jour suivants vont être traités :'; +$_LANG['Upgrade file'] = 'Fichier de mise à jour'; +$_LANG['Modifications to process'] = 'Modifications à prendre en compte'; +$_LANG['(major)'] = '(majeure)'; +$_LANG['TOTAL'] = 'TOTAL'; +$_LANG['Estimated time to complete the'] = 'Temps estimé pour réaliser les'; +$_LANG['modifications:'] = 'modifications :'; +$_LANG['minutes'] = 'minutes'; +$_LANG['minute'] = 'minute'; +$_LANG['seconds'] = 'secondes'; +$_LANG['second'] = 'seconde'; +$_LANG['Depending on your server and the size of your shop'] = 'Selon la puissance de votre serveur et la taille de votre boutique...'; +$_LANG['You did not update your shop for a while,'] = 'Vous n\'avez pas mis à jour votre boutique depuis un moment,'; +$_LANG['stable releases have been made ​​available since.'] = 'versions majeures ont été mis à disposition depuis.'; +$_LANG['This is not a problem however the update may take several minutes, try to update your shop more frequently.'] = 'Ce n\'est pas un problème cependant la mise à jour risque de durer quelques minutes. A l\'avenir, essayez de mettre à jour votre boutique plus souvent.'; +$_LANG['No files to process, this might be an error.'] = 'Aucun fichier à traiter, il s\'agit probablement d\'une erreur'; +$_LANG['Hosting parameters'] = 'Paramètres hébergement'; +$_LANG['PrestaShop tries to automatically set the best settings for your server in order the update to be successful.'] = 'PrestaShop essaye automatiquement de configurer pour vous les paramètres de votre serveur afin que la mise à jour se déroule correctement.'; +$_LANG['PHP parameter'] = 'Paramètre PHP'; +$_LANG['Description'] = 'Description'; +$_LANG['Current value'] = 'Valeur actuelle'; +$_LANG['Maximum allowed time for the upgrade'] = 'Temps maximum autorisé pour la mise à jour'; +$_LANG['Maximum memory allowed for the upgrade'] = 'Mémoire maximum autorisée pour la mise à jour'; +$_LANG['All your settings seem to be OK, go for it!'] = 'Tous vos paramètres semblent OK, cliquez sur suivant !'; +$_LANG['Let\'s go!'] = 'C\'est parti !'; +$_LANG['Click on the "Next" button to start the upgrade, this can take several minutes,'] = 'Cliquez sur le bouton "Suivant" pour démarrer la mise à jour, cela peut prendre plusieurs minutes,'; +$_LANG['do not close the window and be patient.'] = 'ne fermez pas la fenêtre et soyez patient.'; +$_LANG['Your update is completed!'] = 'Votre mise à jour est terminée !'; +$_LANG['Your shop version is now'] = 'La version de votre boutique est maintenant'; +$_LANG['New features in PrestaShop v'] = 'Nouvelles fonctionnalités dans PrestaShop v'; +$_LANG['Beware, your settings look correct but are not optimal, if you encounter problems (upgrade too long, memory error...), please ask your hosting provider to increase the values of these parameters (max_execution_time & memory_limit).'] = 'Attention, votre paramètres semblent corrects mais ne sont pas optimaux, si jamais vous rencontrez des soucis (mise à jour qui se bloque avant la fin, erreur de mémoire...), merci de demander à votre hébergeur d\'augmenter les valeurs de ces paramètres (max_execution_time & memory_limit).'; +$_LANG['We strongly recommend that you inform your hosting provider to modify the settings before process to the update.'] = 'Nous vous recommandons fortement de prévenir votre hébergeur avant de procéder à la mise à jour afin qu\'il modifie ces paramètres PHP.'; +$_LANG['Module compatibility'] = 'Compatibilité Modules'; +$_LANG['It\'s dangerous to keep non-native modules activated during the update. If you really want to take this risk, uncheck the following box.'] = 'Il est déconseillé de laisser les modules non natifs activés durant la mise à jour. Si vous voulez réellement prendre ce risque, décochez la case ci-dessous.'; +$_LANG['You will be able to manually reactivate them in your back-office, once the update process has succeeded.'] = 'Vous pourrez ensuite les réactiver manuellement dans le back-office, une fois le processus de mise à jour terminé.'; +$_LANG['Ok, please desactivate the following modules, I will reactivate them later:'] = 'D\'accord, désactiver automatiquement les modules suivants, je les réactiverai moi-même plus tard :'; +$_LANG['Theme compatibility'] = 'Compatibilité du thème'; +$_LANG['Before updating, you need to check that your theme is compatible with version'] = 'Avant la mise à jour, vous avez besoin de vérifier que votre thème reste compatible avec la version'; +$_LANG['of PrestaShop.'] = 'de PrestaShop'; +$_LANG['Link to the validator'] = 'Lien vers le validateur'; +$_LANG['Online Theme Validator'] = 'Validateur de Theme en ligne'; +$_LANG['If your theme is not valid, you may experience some problems in your front-office aspect, but don\'t panic ! To solve this, you can make it compatible by correcting the validators errors or by using a theme compatible with '] = 'Si votre thème n\'est pas valide, vous pourrez rencontrer quelques problèmes d\'affichage de votre site, mais inutile de paniquer ! Vous pouvez le rendre compatible en corrigeant les erreurs signalées par le validateur ou en utilisant un thème compatible avec la version' ; +$_LANG['version'] = 'version'; +$_LANG['In this aim, use our'] = 'Dans ce but, utilisez notre'; +$_LANG['Warning, we detected that the version specified in your config/settings.inc.php does not match your SQL database structure.
    File config/settings.inc.php indicates: %1$s
    Our automatic detection tool has detected version: %2$s

    You should edit your config/settings.inc.php file to replace %1$s by %2$s.
    Failure to fix this issue before upgrading may result in severe complications.
    Do not forget to relaunch the installer after this modification by pressing F5 on your web browser.'] = "Attention, nous avons détecté que la version spécifiée dans votre fichier config/settings.inc.php ne correspond pas à celle de la structure de votre base de donnée.
    Le fichier config/settings.inc.php indique : %1\$s
    Notre script de détection de version indique : %2\$s

    Vous devriez éditer votre fichier config/settings.inc.php pour remplacer %1\$s par %2\$s.
    Ne pas résoudre ce problème risque d'entrainer de sévères complications durant la mise à jour.
    N'oubliez pas de relancer l'installeur après ces modifications en appuyant sur F5 sur votre navigateur internet."; +$_LANG['Warning, we detected that the version specified in your config/settings.inc.php does not match your SQL database structure.
    File config/settings.inc.php indicates: %1$s
    Our automatic detection tool has detected a version between %2$s and %3$s

    You should edit your config/settings.inc.php file to replace %1$s by your real shop version.
    Failure to fix this issue before upgrading may result in severe complications.
    Do not forget to relaunch the installer after this modification by pressing F5 on your web browser.'] = "Attention, nous avons détecté que la version spécifiée dans votre fichier config/settings.inc.php ne correspond pas à celle de la structure de votre base de donnée.
    Le fichier config/settings.inc.php indique : %1\$s
    Notre script de détection de version indique une version entre %2\$s et %3\$s

    Vous devriez éditer votre fichier config/settings.inc.php pour remplacer %1\$s par la vraie version de votre magasin.
    Ne pas résoudre ce problème risque d'entrainer de sévères complications durant la mise à jour.
    N'oubliez pas de relancer l'installeur après ces modifications en appuyant sur F5 sur votre navigateur internet."; +$_LANG['Warning, the installer was unable to detect what is your current PrestaShop version from a database structure analysis. This means some fields or tables are missing, and upgrade is under your own risk.'] = "Attention, l'installateur n'a pas été capable de détecter votre version de PrestaShop à partir de l'analyse de votre base de donnée. Cela signifie que certains champs ou tables sont manquants. La mise à jour est à vos risques et périls."; +$_LANG['However the installer has detected that the version stored in your configuration table is %1$s'] = "Cependant l'installeur a détecté que la version sauvée dans votre table de configuration est %1\$s"; +$_LANG['Additional Benefits'] = 'Avantages exclusifs PrestaShop'; +$_LANG['Exclusive offers dedicated to PrestaShop merchants'] = 'Offres réservées aux marchands PrestaShop'; +$_LANG['PHP magic quotes option is off (recommended)'] = 'L\'option PHP "magic quotes" est désactivée (recommandé)'; \ No newline at end of file diff --git a/install-dev/langs/it.php b/install-dev/langs/it.php new file mode 100644 index 000000000..1567ed525 --- /dev/null +++ b/install-dev/langs/it.php @@ -0,0 +1,272 @@ +clicca su successivo per continuare!'; +$_LANG['Your configuration is invalid. Please fix the issues below:'] = 'La tua configurazione non è valida,
    correggi questi problemi:'; +$_LANG['You have to create a database, help available in readme_en.txt'] = 'Devi prima creare un database (aiuto disponibile nel file readme.txt)'; +$_LANG['If you check this box and your mail configuration is wrong, your installation might be blocked. If so, please uncheck the box to go to the next step.'] = 'Se la tua configurazione e-mail è errata, questa opzione può essere bloccata; disattivala se non puoi passare alla fase successiva.'; +$_LANG['Mcrypt is available (recommended)'] = 'Mcrypt è disponibile (consigliato)'; +$_LANG['Your MySQL server doesn\'t support this engine, please use another one like MyISAM'] = 'Il supporto di questo motore di database non è supportato, scegline un altro come MyISAM'; +$_LANG['Adult'] = 'Adulti e indumenti intimi'; +$_LANG['Animals and Pets'] = 'Animali'; +$_LANG['Art and Culture'] = 'Cultura e svaghi'; +$_LANG['Babies'] = 'Articoli per bambini'; +$_LANG['Beauty and Personal Care'] = 'Salute e bellezza'; +$_LANG['Cars'] = 'Auto e moto'; +$_LANG['Computer Hardware and Software'] = 'Informatica e software'; +$_LANG['Download'] = 'Download'; +$_LANG['Fashion and accessories'] = 'Abiti e accessori'; +$_LANG['Flowers, Gifts and Crafts'] = 'Fiori e regali'; +$_LANG['Food and beverage'] = 'Alimentazione e gastronomia'; +$_LANG['HiFi, Photo and Video'] = 'Hifi, foto e video'; +$_LANG['Home and Garden'] = 'Casa e giardinaggio'; +$_LANG['Home Appliances'] = 'Elettrodomestici'; +$_LANG['Jewelry'] = 'Gioielleria'; +$_LANG['Mobile and Telecom'] = 'Telefonia e comunicazioni'; +$_LANG['Services'] = 'Servizi'; +$_LANG['Shoes and accessories'] = 'Scarpe e accessori'; +$_LANG['Sport and Entertainment'] = 'Sport e divertimenti'; +$_LANG['Travel'] = 'Viaggi e turismo'; +$_LANG['Main activity:'] = 'Attività principale'; +$_LANG['-- Please choose your main activity --'] = '-- Scegli un\'attività --'; +$_LANG['A question about PrestaShop or issues during installation or upgrade? Call us!'] = 'Hai domande su PrestaShop o un problema per l\'installazione o l\'aggiornamento? Chiamaci!'; +$_LANG['Invalid catalog mode'] = 'Campo modalità catalogo non valido'; +$_LANG['Catalog mode:'] = 'Modalità catalogo:'; +$_LANG['Yes'] = 'Sì'; +$_LANG['No'] = 'No'; +$_LANG['If you activate this feature, all purchase features will be disabled. You can activate this feature later in your back office'] = 'Se attivi questa opzione, tutte le funzioni di acquisto saranno disattivate. Potrai attivare questa opzione più tardi nel tuo back-office'; +$_LANG['the already installed version detected is too recent, no update available'] = 'la versione già installata individuata è troppo recente, nessun aggiornamento disponibile'; +$_LANG['This information isn\'t required, it will be used for statistical purposes. This information doesn\'t change anything in your store.'] = 'Queste informazioni non sono obbligatorie, saranno utilizzate a fini statistici. Queste informazioni non cambieranno nulla nel tuo negozio.'; +$_LANG['If you do not know how to enable it, use our turnkey solution PrestaBox at'] = 'Se non sai come abilitarlo, usa la nostra soluzione innovativa PrestaBox su'; +$_LANG['Invalid shop name'] = 'nome negozio non valido'; +$_LANG['Your firstname contains some invalid characters'] = 'Il tuo nome contiene dei caratteri non validi'; +$_LANG['Your lastname contains some invalid characters'] = 'Il tuo cognome contiene dei caratteri non validi'; +$_LANG['The file /img/logo.jpg is not writable, please CHMOD 755 this file or CHMOD 777'] = 'Il file /img/logo.jpg non ?scrivibile, ti preghiamo di effettuare CHMOD 755 oppure CHMOD 777'; +$_LANG['the already installed version detected is too old, no more update available'] = 'La versione già installata individuata è troppo vecchia, non ci sono più aggiornamenti disponibili'; +$_LANG['If you do not know how to fix these issues, use turnkey solution PrestaBox at'] = 'Se non sai come correggere questi problemi, usa la soluzione innovativa PrestaBox su'; +$_LANG['Database Engine:'] = 'Motore database'; +$_LANG['Installation type'] = 'Tipo di installazione'; +$_LANG['Simple mode: Basic installation'] = 'Modalità semplice: installazione base'; +$_LANG['(FREE)'] = '(GRATUITO)'; +$_LANG['Full mode: includes'] = 'Modalità completa: include'; +$_LANG['100+ additional modules'] = 'Più di 100 moduli aggiuntivi'; +$_LANG['and demo products'] = 'e prodotti demo'; +$_LANG['(FREE too!)'] = 'GRATUITI!'; +$_LANG['Shop configuration'] = 'Configurazione negozio'; +$_LANG['I certify that I backed up my database and application files. I assume all responsibility for any data loss or damage related to this upgrade.'] = 'Dichiaro di aver effettuato il backup del mio database e dei file di applicazione. Mi assumo tutte le responsabilità per qualsiasi perdita dei dati o danni relativi a questo aggiornamento'; +$_LANG['Upgrade in progress'] = 'Aggiornamento in corso'; +$_LANG['Current query:'] = 'Domanda attuale'; +$_LANG['Details about this upgrade'] = 'Dettagli su questo aggiornamento'; +$_LANG['Thank you, you will be able to continue the upgrade process by clicking on the "Next" button.'] = 'Grazie, potrai continuare il processo di aggiornamento cliccando sul tasto “Successivo”.'; +$_LANG['PrestaShop is upgrading your shop one version after the other, the following upgrade files will be processed:'] = 'Prestashop sta aggiornando il tuo negozio una versione dopo l\'altra; saranno elaborati i seguenti file di aggiornamento:'; +$_LANG['Upgrade file'] = 'Aggiorna file'; +$_LANG['Modifications to process'] = 'Modifiche da elaborare'; +$_LANG['(major)'] = '(maggiore)'; +$_LANG['TOTAL'] = 'TOTALE'; +$_LANG['Estimated time to complete the'] = 'Tempo previsto per completare'; +$_LANG['modifications:'] = 'modifiche:'; +$_LANG['minutes'] = 'minuti'; +$_LANG['minute'] = 'minuto'; +$_LANG['seconds'] = 'secondi'; +$_LANG['second'] = 'secondo'; +$_LANG['Depending on your server and the size of your shop'] = 'In base al tuo server e alle dimensioni del tuo negozio'; +$_LANG['You did not update your shop for a while,'] = 'E\' da un po\' di tempo che non aggiorni il tuo negozio'; +$_LANG['stable releases have been made ​​available since.'] = 'Sono state messe a disposizione importanti novità'; +$_LANG['This is not a problem however the update may take several minutes, try to update your shop more frequently.'] = 'Questo non è un problema, comunque l’aggiornamento può impiegare diversi minuti: cerca di aggiornare il tuo negozio più spesso'; +$_LANG['No files to process, this might be an error.'] = 'Nessun file da elaborare, potrebbe esserci un errore'; +$_LANG['Hosting parameters'] = 'Parametri host'; +$_LANG['PrestaShop tries to automatically set the best settings for your server in order the update to be successful.'] = 'PrestaShop cerca di impostare automaticamente le migliori configurazioni per il tuo server in modo che l’aggiornamento riesca con successo.'; +$_LANG['PHP parameter'] = 'Parametro PHP'; +$_LANG['Description'] = 'Descrizione'; +$_LANG['Current value'] = 'Valuta attuale'; +$_LANG['Maximum allowed time for the upgrade'] = 'Tempo massimo concesso per l\'aggiornamento'; +$_LANG['Maximum memory allowed for the upgrade'] = 'Memoria massima concessa per l\'aggiornamento'; +$_LANG['All your settings seem to be OK, go for it!'] = 'Tutte le impostazioni sembrano OK, procedi pure!'; +$_LANG['Beware, your settings look correct but are not optimal, if you encounter problems (upgrade too long, memory error...), please ask your hosting provider to increase the values of these parameters (max_execution_time & memory_limit).'] = 'Attenzione, le tue impostazioni sembrano corrette ma non ottimali; se incontrassi dei problemi (aggiornamento troppo lungo, errore di memoria...), chiedi al tuo host di aumentare i valori di questi parametri (tempo massimo di esecuzione e limite di memoria).'; +$_LANG['We strongly recommend that you inform your hosting provider to modify the settings before process to the update.'] = 'Ti suggeriamo di informare il tuo host in modo da modificare le impostazioni prima di iniziare l’aggiornamento.'; +$_LANG['Let\'s go!'] = 'Via!'; +$_LANG['Click on the "Next" button to start the upgrade, this can take several minutes,'] = 'Clicca sul tasto “Successivo” per iniziare l’aggiornamento; potrebbero volerci alcuni minuti,'; +$_LANG['do not close the window and be patient.'] = 'non chiudere la finestra e attendi'; +$_LANG['Your update is completed!'] = 'L\'aggiornamento è completo!'; +$_LANG['Your shop version is now'] = 'La tua versione adesso è'; +$_LANG['New features in PrestaShop v'] = 'Nuove caratteristiche in PrestaShop v'; +$_LANG['In this aim, use our'] = 'A questo scopo, utilizzare il nostro'; +$_LANG['Additional Benefits'] = 'Ulteriori vantaggi'; +$_LANG['Exclusive offers dedicated to PrestaShop merchants'] = 'Offerte esclusivo dedicato ai venditori PrestaShop'; +$_LANG['PHP magic quotes option is off (recommended)'] = 'Opzione magic quotes PHP è disattivata (consigliato)'; \ No newline at end of file diff --git a/install-dev/langs/list.xml b/install-dev/langs/list.xml new file mode 100644 index 000000000..a41934cd5 --- /dev/null +++ b/install-dev/langs/list.xml @@ -0,0 +1,53 @@ + + + + + + ../img/l/1.jpg + + + en-us + + en + + + + ../img/l/2.jpg + + + fr-fr + fr + + fr + + + + ../img/l/3.jpg + + + es-es + es + + es + + + + ../img/l/4.jpg + + + de-de + de + + de + + + + ../img/l/5.jpg + + + it-it + it + + it + + diff --git a/install-dev/langs/us.php b/install-dev/langs/us.php new file mode 100644 index 000000000..e8a1ffbfd --- /dev/null +++ b/install-dev/langs/us.php @@ -0,0 +1,85 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7520 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +@set_time_limit(0); +@ini_set('max_execution_time', '0'); + +define('INSTALL_PATH', dirname(__FILE__)); +require(dirname(__FILE__).'/../config/autoload.php'); + +if (file_exists(INSTALL_PATH.'/../config/settings.inc.php')) +{ + // We don't include this file to avoid a conflict with a new install + $content = file_get_contents(INSTALL_PATH.'/../config/settings.inc.php'); + if (preg_match('#define\(\'_PS_VERSION_\',\s*\'([0-9\.]+)\'\);#', $content, $m)) + { + $oldversion = $m[1]; + if (version_compare($oldversion, '1.5.0.0', '<') == 1) + { + include(INSTALL_PATH.'/classes/Module.php'); + include(INSTALL_PATH.'/classes/Language.php'); + } + } +} + +// setting the memory limit to 128M only if current is lower +$memory_limit = ini_get('memory_limit'); +if ( substr($memory_limit,-1) != 'G' + AND ((substr($memory_limit,-1) == 'M' AND substr($memory_limit,0,-1) < 128) + OR is_numeric($memory_limit) AND (intval($memory_limit) < 131072)) +){ + @ini_set('memory_limit','128M'); +} + +/* Redefine REQUEST_URI if empty (on some webservers...) */ +if (!isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_URI'] == '') + $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; +if ($tmp = strpos($_SERVER['REQUEST_URI'], '?')) + $_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $tmp); +$_SERVER['REQUEST_URI'] = str_replace('//', '/', $_SERVER['REQUEST_URI']); + +define('INSTALL_VERSION', '1.5.0.0'); +define('PS_INSTALLATION_IN_PROGRESS', true); +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); +define('SETTINGS_FILE', INSTALL_PATH.'/../config/settings.inc.php'); +define('DEFINES_FILE', INSTALL_PATH.'/../config/defines.inc.php'); +define('INSTALLER__PS_BASE_URI', substr($_SERVER['REQUEST_URI'], 0, -1 * (strlen($_SERVER['REQUEST_URI']) - strrpos($_SERVER['REQUEST_URI'], '/')) - strlen(substr(dirname($_SERVER['REQUEST_URI']), strrpos(dirname($_SERVER['REQUEST_URI']), '/')+1)))); +define('INSTALLER__PS_BASE_URI_ABSOLUTE', 'http://'.ToolsInstall::getHttpHost(false, true).INSTALLER__PS_BASE_URI); + +// XML Header +header('Content-Type: text/xml'); + +// Switching method +if (isset($_GET['method'])) +{ + if (in_array($_GET['method'], array('doUpgrade', 'createDB', 'checkShopInfos'))) + { + global $logger; + $logger = new FileLogger(); + $logger->setFilename(dirname(__FILE__).'/../log/'.@date('Ymd').'_installation.log'); + } + switch ($_GET['method']) + { + case 'checkConfig' : + include_once('xml/checkConfig.php'); + break; + + case 'checkDB' : + include_once('xml/checkDB.php'); + break; + + case 'createDB' : + include_once('xml/createDB.php'); + break; + + case 'checkMail' : + include_once('xml/checkMail.php'); + break; + + case 'checkShopInfos' : + include_once('xml/checkShopInfos.php'); + break; + + case 'doUpgrade' : + include_once('xml/doUpgrade.php'); + break; + + case 'getVersionFromDb' : + include_once('xml/getVersionFromDb.php'); + break; + } +} + diff --git a/install-dev/module_tools.php b/install-dev/module_tools.php new file mode 100644 index 000000000..246699f3c --- /dev/null +++ b/install-dev/module_tools.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function moduleReinstaller($moduleName, $force = false) +{ + $module = Module::getInstanceByName($moduleName); + if (!is_object($module)) + die(Tools::displayError()); + if ($module->id AND ($module->uninstall() OR $force)) + return $module->install(); + return false; +} + diff --git a/install-dev/php/add_missing_rewrite_value.php b/install-dev/php/add_missing_rewrite_value.php new file mode 100644 index 000000000..214349f38 --- /dev/null +++ b/install-dev/php/add_missing_rewrite_value.php @@ -0,0 +1,45 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function add_missing_rewrite_value() +{ + $pages = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'meta` m + LEFT JOIN `'._DB_PREFIX_.'meta_lang` ml ON (m.`id_meta` = ml.`id_meta`) + WHERE ml.`url_rewrite` = \'\' + AND m.`page` != "index" + '); + foreach ($pages as $page) + { + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'meta_lang` + SET `url_rewrite` = "'.pSQL(Tools::str2url($page['title'])).'" + WHERE `id_meta` = '.(int)$page['id_meta'].' + AND `id_lang` = '.(int)$page['id_lang']); + } +} \ No newline at end of file diff --git a/install-dev/php/add_module_to_hook.php b/install-dev/php/add_module_to_hook.php new file mode 100644 index 000000000..851f828ef --- /dev/null +++ b/install-dev/php/add_module_to_hook.php @@ -0,0 +1,58 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function add_module_to_hook($module_name, $hook_name) +{ + $result = false; + + $id_module = Db::getInstance()->getValue(' + SELECT `id_module` FROM `'._DB_PREFIX_.'module` + WHERE `name` = \''.pSQL($module_name).'\'' + ); + + if ((int)$id_module > 0) + { + $id_hook = Db::getInstance()->getValue(' + SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = \''.pSQL($hook_name).'\' + '); + + if ((int)$id_hook > 0) + { + $result = Db::getInstance()->Execute(' + INSERT IGNORE INTO `'._DB_PREFIX_.'hook_module` (`id_module`, `id_hook`, `position`) + VALUES ( + '.(int)$id_module.', + '.(int)$id_hook.', + (SELECT IFNULL( + (SELECT max_position from (SELECT MAX(position)+1 as max_position FROM `'._DB_PREFIX_.'hook_module` WHERE `id_hook` = '.(int)$id_hook.') AS max_position), 1)) + )'); + } + } + + return $result; +} + diff --git a/install-dev/php/add_new_tab.php b/install-dev/php/add_new_tab.php new file mode 100644 index 000000000..b50d7c13c --- /dev/null +++ b/install-dev/php/add_new_tab.php @@ -0,0 +1,65 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7450 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function add_new_tab($className, $name, $id_parent, $returnId = false) +{ + $array = array(); + foreach (explode('|', $name) AS $item) + { + $temp = explode(':', $item); + $array[$temp[0]] = $temp[1]; + } + + if (!(int)Db::getInstance()->getValue('SELECT count(id_tab) FROM `'._DB_PREFIX_.'tab` WHERE `class_name` = \''.pSQL($className).'\' ')) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'tab` (`id_parent`, `class_name`, `module`, `position`) VALUES ('.(int)$id_parent.', \''.pSQL($className).'\', \'\', + (SELECT IFNULL(MAX(t.position),0)+ 1 FROM `'._DB_PREFIX_.'tab` t WHERE t.id_parent = '.(int)$id_parent.'))'); + + foreach (Language::getLanguages() AS $lang) + { + Db::getInstance()->Execute(' + INSERT IGNORE INTO `'._DB_PREFIX_.'tab_lang` (`id_lang`, `id_tab`, `name`) + VALUES ('.(int)$lang['id_lang'].', ( + SELECT `id_tab` + FROM `'._DB_PREFIX_.'tab` + WHERE `class_name` = \''.pSQL($className).'\' LIMIT 0,1 + ), \''.pSQL(isset($array[$lang['iso_code']]) ? $array[$lang['iso_code']] : $array['en']).'\') + '); + } + + Db::getInstance()->Execute('INSERT IGNORE INTO `'._DB_PREFIX_.'access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) + (SELECT `id_profile`, ( + SELECT `id_tab` + FROM `'._DB_PREFIX_.'tab` + WHERE `class_name` = \''.pSQL($className).'\' LIMIT 0,1 + ), 1, 1, 1, 1 FROM `'._DB_PREFIX_.'profile` )'); + + if($returnId) { + return (int)Db::getInstance()->getValue('SELECT `id_tab` + FROM `'._DB_PREFIX_.'tab` + WHERE `class_name` = \''.pSQL($className).'\''); + } +} diff --git a/install-dev/php/alter_blocklink.php b/install-dev/php/alter_blocklink.php new file mode 100644 index 000000000..e7ff185e2 --- /dev/null +++ b/install-dev/php/alter_blocklink.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function alter_blocklink() +{ + // No one will know if the table does not exist :] Thanks Damien for your solution ;) + DB::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'blocklink_lang` CHANGE `id_link` `id_blocklink` INT( 10 ) UNSIGNED NOT NULL'); + + DB::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'blocklink` CHANGE `id_link` `id_blocklink` INT( 10 ) UNSIGNED NOT NULL'); + +} + diff --git a/install-dev/php/alter_cms_block.php b/install-dev/php/alter_cms_block.php new file mode 100644 index 000000000..a338f15f6 --- /dev/null +++ b/install-dev/php/alter_cms_block.php @@ -0,0 +1,40 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function alter_cms_block() +{ + // No one will know if the table does not exist :] Thanks Damien for your solution ;) + DB::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'cms_block_lang` CHANGE `id_block_cms` `id_cms_block` INT( 10 ) UNSIGNED NOT NULL'); + + DB::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'cms_block` CHANGE `id_block_cms` `id_cms_block` INT( 10 ) UNSIGNED NOT NULL'); + + DB::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'cms_block_page` CHANGE `id_block_cms` `id_cms_block` INT( 10 ) UNSIGNED NOT NULL'); + + DB::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'cms_block_page` CHANGE `id_block_cms_page` `id_cms_block_page` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT'); + +} + diff --git a/install-dev/php/blocknewsletter.php b/install-dev/php/blocknewsletter.php new file mode 100644 index 000000000..3be86d866 --- /dev/null +++ b/install-dev/php/blocknewsletter.php @@ -0,0 +1,33 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function blocknewsletter() +{ + // No one will know if the table does not exist :] + DB::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'newsletter ADD `http_referer` VARCHAR(255) NULL'); +} + diff --git a/install-dev/php/check_webservice_account_table.php b/install-dev/php/check_webservice_account_table.php new file mode 100644 index 000000000..74549a511 --- /dev/null +++ b/install-dev/php/check_webservice_account_table.php @@ -0,0 +1,44 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * Check if all needed columns in webservice_account table exists. + * These columns are used for the WebserviceRequest overriding. + * + * @return void + */ +function check_webservice_account_table() +{ + $sql = 'SHOW COLUMNS FROM '._DB_PREFIX_.'webservice_account'; + $return = DB::getInstance()->ExecuteS($sql); + if (count($return) < 7) + { + $sql = 'ALTER TABLE `'._DB_PREFIX_.'webservice_account` ADD `is_module` TINYINT( 2 ) NOT NULL DEFAULT \'0\' AFTER `class_name` , + ADD `module_name` VARCHAR( 50 ) NULL DEFAULT NULL AFTER `is_module`'; + DB::getInstance()->ExecuteS($sql); + } +} \ No newline at end of file diff --git a/install-dev/php/cms_block.php b/install-dev/php/cms_block.php new file mode 100644 index 000000000..242d95de3 --- /dev/null +++ b/install-dev/php/cms_block.php @@ -0,0 +1,33 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +function cms_block() +{ + if (!Db::getInstance()->execute('SELECT `display_store` FROM `'._DB_PREFIX_.'cms_block` LIMIT 1')) + return Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'cms_block` ADD `display_store` TINYINT NOT NULL DEFAULT \'1\''); + return true; +} + diff --git a/install-dev/php/confcleaner.php b/install-dev/php/confcleaner.php new file mode 100644 index 000000000..5c1badab7 --- /dev/null +++ b/install-dev/php/confcleaner.php @@ -0,0 +1,48 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function configuration_double_cleaner() +{ + $result = Db::getInstance()->ExecuteS(' + SELECT name, MIN(id_configuration) AS minid + FROM '._DB_PREFIX_.'configuration + GROUP BY name + HAVING count(name) > 1'); + foreach ($result as $row) + { + DB::getInstance()->Execute(' + DELETE FROM '._DB_PREFIX_.'configuration + WHERE name = \''.addslashes($row['name']).'\' + AND id_configuration != '.(int)($row['minid'])); + } + DB::getInstance()->Execute(' + DELETE FROM '._DB_PREFIX_.'configuration_lang + WHERE id_configuration NOT IN ( + SELECT id_configuration + FROM '._DB_PREFIX_.'configuration)'); +} + diff --git a/install-dev/php/country_to_timezone.php b/install-dev/php/country_to_timezone.php new file mode 100644 index 000000000..a705d3563 --- /dev/null +++ b/install-dev/php/country_to_timezone.php @@ -0,0 +1,278 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$timezones = array( + 'AD' => 'Europe/Andorra', + 'AE' => 'Asia/Dubai', + 'AF' => 'Asia/Kabul', + 'AG' => 'America/Antigua', + 'AI' => 'America/Anguilla', + 'AL' => 'Europe/Tirane', + 'AM' => 'Asia/Yerevan', + 'AN' => 'America/Curacao', + 'AO' => 'Africa/Luanda', + 'AQ' => 'Antarctica/McMurdo', + 'AR' => 'America/Argentina/Buenos_Aires', + 'AS' => 'Pacific/Pago_Pago', + 'AT' => 'Europe/Vienna', + 'AU' => 'Australia/Lord_Howe', + 'AW' => 'America/Aruba', + 'AX' => 'Europe/Mariehamn', + 'AZ' => 'Asia/Baku', + 'BA' => 'Europe/Sarajevo', + 'BB' => 'America/Barbados', + 'BD' => 'Asia/Dhaka', + 'BE' => 'Europe/Brussels', + 'BF' => 'Africa/Ouagadougou', + 'BG' => 'Europe/Sofia', + 'BH' => 'Asia/Bahrain', + 'BI' => 'Africa/Bujumbura', + 'BJ' => 'Africa/Porto-Novo', + 'BL' => 'America/St_Barthelemy', + 'BM' => 'Atlantic/Bermuda', + 'BN' => 'Asia/Brunei', + 'BO' => 'America/La_Paz', + 'BR' => 'America/Noronha', + 'BS' => 'America/Nassau', + 'BT' => 'Asia/Thimphu', + 'BV' => '', + 'BW' => 'Africa/Gaborone', + 'BY' => 'Europe/Minsk', + 'BZ' => 'America/Belize', + 'CA' => 'America/St_Johns', + 'CC' => 'Indian/Cocos', + 'CD' => 'Africa/Kinshasa', + 'CF' => 'Africa/Bangui', + 'CG' => 'Africa/Brazzaville', + 'CH' => 'Europe/Zurich', + 'CI' => 'Africa/Abidjan', + 'CK' => 'Pacific/Rarotonga', + 'CL' => 'America/Santiago', + 'CM' => 'Africa/Douala', + 'CN' => 'Asia/Shanghai', + 'CO' => 'America/Bogota', + 'CR' => 'America/Costa_Rica', + 'CU' => 'America/Havana', + 'CV' => 'Atlantic/Cape_Verde', + 'CX' => 'Indian/Christmas', + 'CY' => 'Asia/Nicosia', + 'CZ' => 'Europe/Prague', + 'DE' => 'Europe/Berlin', + 'DJ' => 'Africa/Djibouti', + 'DK' => 'Europe/Copenhagen', + 'DM' => 'America/Dominica', + 'DO' => 'America/Santo_Domingo', + 'DZ' => 'Africa/Algiers', + 'EC' => 'America/Guayaquil', + 'EE' => 'Europe/Tallinn', + 'EG' => 'Africa/Cairo', + 'EH' => 'Africa/El_Aaiun', + 'ER' => 'Africa/Asmara', + 'ES' => 'Europe/Madrid', + 'ET' => 'Africa/Addis_Ababa', + 'FI' => 'Europe/Helsinki', + 'FJ' => 'Pacific/Fiji', + 'FK' => 'Atlantic/Stanley', + 'FM' => 'Pacific/Chuuk', + 'FO' => 'Atlantic/Faroe', + 'FR' => 'Europe/Paris', + 'GA' => 'Africa/Libreville', + 'GB' => 'Europe/London', + 'GD' => 'America/Grenada', + 'GE' => 'Asia/Tbilisi', + 'GF' => 'America/Cayenne', + 'GG' => 'Europe/Guernsey', + 'GH' => 'Africa/Accra', + 'GI' => 'Europe/Gibraltar', + 'GL' => 'America/Godthab', + 'GM' => 'Africa/Banjul', + 'GN' => 'Africa/Conakry', + 'GP' => 'America/Guadeloupe', + 'GQ' => 'Africa/Malabo', + 'GR' => 'Europe/Athens', + 'GS' => 'Atlantic/South_Georgia', + 'GT' => 'America/Guatemala', + 'GU' => 'Pacific/Guam', + 'GW' => 'Africa/Bissau', + 'GY' => 'America/Guyana', + 'HK' => 'Asia/Hong_Kong', + 'HM' => '', + 'HN' => 'America/Tegucigalpa', + 'HR' => 'Europe/Zagreb', + 'HT' => 'America/Port-au-Prince', + 'HU' => 'Europe/Budapest', + 'ID' => 'Asia/Jakarta', + 'IE' => 'Europe/Dublin', + 'IL' => 'Asia/Jerusalem', + 'IM' => 'Europe/Isle_of_Man', + 'IN' => 'Asia/Kolkata', + 'IO' => 'Indian/Chagos', + 'IQ' => 'Asia/Baghdad', + 'IR' => 'Asia/Tehran', + 'IS' => 'Atlantic/Reykjavik', + 'IT' => 'Europe/Rome', + 'JE' => 'Europe/Jersey', + 'JM' => 'America/Jamaica', + 'JO' => 'Asia/Amman', + 'JP' => 'Asia/Tokyo', + 'KE' => 'Africa/Nairobi', + 'KG' => 'Asia/Bishkek', + 'KH' => 'Asia/Phnom_Penh', + 'KI' => 'Pacific/Tarawa', + 'KM' => 'Indian/Comoro', + 'KN' => 'America/St_Kitts', + 'KP' => 'Asia/Pyongyang', + 'KR' => 'Asia/Seoul', + 'KW' => 'Asia/Kuwait', + 'KY' => 'America/Cayman', + 'KZ' => 'Asia/Almaty', + 'LA' => 'Asia/Vientiane', + 'LB' => 'Asia/Beirut', + 'LC' => 'America/St_Lucia', + 'LI' => 'Europe/Vaduz', + 'LK' => 'Asia/Colombo', + 'LR' => 'Africa/Monrovia', + 'LS' => 'Africa/Maseru', + 'LT' => 'Europe/Vilnius', + 'LU' => 'Europe/Luxembourg', + 'LV' => 'Europe/Riga', + 'LY' => 'Africa/Tripoli', + 'MA' => 'Africa/Casablanca', + 'MC' => 'Europe/Monaco', + 'MD' => 'Europe/Chisinau', + 'ME' => 'Europe/Podgorica', + 'MF' => 'America/Marigot', + 'MG' => 'Indian/Antananarivo', + 'MH' => 'Pacific/Majuro', + 'MK' => 'Europe/Skopje', + 'ML' => 'Africa/Bamako', + 'MM' => 'Asia/Rangoon', + 'MN' => 'Asia/Ulaanbaatar', + 'MO' => 'Asia/Macau', + 'MP' => 'Pacific/Saipan', + 'MQ' => 'America/Martinique', + 'MR' => 'Africa/Nouakchott', + 'MS' => 'America/Montserrat', + 'MT' => 'Europe/Malta', + 'MU' => 'Indian/Mauritius', + 'MV' => 'Indian/Maldives', + 'MW' => 'Africa/Blantyre', + 'MX' => 'America/Mexico_City', + 'MY' => 'Asia/Kuala_Lumpur', + 'MZ' => 'Africa/Maputo', + 'NA' => 'Africa/Windhoek', + 'NC' => 'Pacific/Noumea', + 'NE' => 'Africa/Niamey', + 'NF' => 'Pacific/Norfolk', + 'NG' => 'Africa/Lagos', + 'NI' => 'America/Managua', + 'NL' => 'Europe/Amsterdam', + 'NO' => 'Europe/Oslo', + 'NP' => 'Asia/Kathmandu', + 'NR' => 'Pacific/Nauru', + 'NU' => 'Pacific/Niue', + 'NZ' => 'Pacific/Auckland', + 'OM' => 'Asia/Muscat', + 'PA' => 'America/Panama', + 'PE' => 'America/Lima', + 'PF' => 'Pacific/Tahiti', + 'PG' => 'Pacific/Port_Moresby', + 'PH' => 'Asia/Manila', + 'PK' => 'Asia/Karachi', + 'PL' => 'Europe/Warsaw', + 'PM' => 'America/Miquelon', + 'PN' => 'Pacific/Pitcairn', + 'PR' => 'America/Puerto_Rico', + 'PS' => 'Asia/Gaza', + 'PT' => 'Europe/Lisbon', + 'PW' => 'Pacific/Palau', + 'PY' => 'America/Asuncion', + 'QA' => 'Asia/Qatar', + 'RE' => 'Indian/Reunion', + 'RO' => 'Europe/Bucharest', + 'RS' => 'Europe/Belgrade', + 'RU' => 'Europe/Moscow', + 'RW' => 'Africa/Kigali', + 'SA' => 'Asia/Riyadh', + 'SB' => 'Pacific/Guadalcanal', + 'SC' => 'Indian/Mahe', + 'SD' => 'Africa/Khartoum', + 'SE' => 'Europe/Stockholm', + 'SG' => 'Asia/Singapore', + 'SI' => 'Europe/Ljubljana', + 'SJ' => 'Arctic/Longyearbyen', + 'SK' => 'Europe/Bratislava', + 'SL' => 'Africa/Freetown', + 'SM' => 'Europe/San_Marino', + 'SN' => 'Africa/Dakar', + 'SO' => 'Africa/Mogadishu', + 'SR' => 'America/Paramaribo', + 'ST' => 'Africa/Sao_Tome', + 'SV' => 'America/El_Salvador', + 'SY' => 'Asia/Damascus', + 'SZ' => 'Africa/Mbabane', + 'TC' => 'America/Grand_Turk', + 'TD' => 'Africa/Ndjamena', + 'TF' => 'Indian/Kerguelen', + 'TG' => 'Africa/Lome', + 'TH' => 'Asia/Bangkok', + 'TJ' => 'Asia/Dushanbe', + 'TK' => 'Pacific/Fakaofo', + 'TL' => 'Asia/Dili', + 'TM' => 'Asia/Ashgabat', + 'TN' => 'Africa/Tunis', + 'TO' => 'Pacific/Tongatapu', + 'TR' => 'Europe/Istanbul', + 'TT' => 'America/Port_of_Spain', + 'TV' => 'Pacific/Funafuti', + 'TW' => 'Asia/Taipei', + 'TZ' => 'Africa/Dar_es_Salaam', + 'UA' => 'Europe/Kiev', + 'UG' => 'Africa/Kampala', + 'US' => 'US/Eastern', + 'UY' => 'America/Montevideo', + 'UZ' => 'Asia/Samarkand', + 'VA' => 'Europe/Vatican', + 'VC' => 'America/St_Vincent', + 'VE' => 'America/Caracas', + 'VG' => 'America/Tortola', + 'VI' => 'America/St_Thomas', + 'VN' => 'Asia/Ho_Chi_Minh', + 'VU' => 'Pacific/Efate', + 'WF' => 'Pacific/Wallis', + 'WS' => 'Pacific/Apia', + 'YE' => 'Asia/Aden', + 'YT' => 'Indian/Mayotte', + 'ZA' => 'Africa/Johannesburg', + 'ZM' => 'Africa/Lusaka', + 'ZW' => 'Africa/Harare', +); + + +if (isset($timezones[$_GET['country']]) && $timezones[$_GET['country']]) + die($timezones[$_GET['country']]); +die(''); \ No newline at end of file diff --git a/install-dev/php/create_multistore.php b/install-dev/php/create_multistore.php new file mode 100755 index 000000000..8922783fc --- /dev/null +++ b/install-dev/php/create_multistore.php @@ -0,0 +1,41 @@ +Execute('INSERT INTO '._DB_PREFIX_.'theme (`id_theme`, `name`) VALUES(\'\', \''.pSQL($theme).'\')'); + $res &= Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'shop SET id_theme = (SELECT id_theme FROM '._DB_PREFIX_.'theme WHERE name=\''.pSQL(_THEME_NAME_).'\') WHERE id_shop = 1'); + $shop_domain = Db::getInstance()->getValue('SELECT `value` + FROM `'._DB_PREFIX_.'_configuration` + WHERE `name`=\'PS_SHOP_DOMAIN\''); + $shop_domain_ssl = Db::getInstance()->getValue('SELECT `value` + FROM `'._DB_PREFIX_.'_configuration` + WHERE `name`=\'PS_SHOP_DOMAIN_SSL\''); + if(empty($shop_domain)) + { + $shop_domain = Tools::getHttpHost(); + $shop_domain_ssl = Tools::getHttpHost(); + } + $res &= Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'shop_url` (`id_shop`, `domain`, `domain_ssl`, `uri`, `main`, `active`) + VALUES(1, \''.pSQL($shop_domain).'\', \''.pSQL($shop_domain_ssl).'\', \'\', 1, 1)'); + + // Stock conversion + $sql = 'INSERT INTO `'._DB_PREFIX_.'.stock` (`id_product`, `id_product_attribute`, `id_group_shop`, `id_shop`, `quantity`) + VALUES (SELECT `p.id_product`, 0, 1, 1, `p.quantity` FROM `'._DB_PREFIX_.'.product` p);'; + $res &= Db::getInstance()->Execute($sql); + + $sql = 'INSERT INTO `'._DB_PREFIX_.'.stock` (`id_product`, `id_product_attribute`, `id_group_shop`, `id_shop`, `quantity`) + VALUES (SELECT `id_product`, `id_product_attribute`, 1, 1, `quantity` FROM `'._DB_PREFIX_.'product_attribute` p);'; + $res &= Db::getInstance()->Execute($sql); + + // Add admin tabs + $shopTabId = add_new_tab('AdminShop', 'it:Shops|es:Shops|fr:Boutiques|de:Shops|en:Shops', 0, true); + add_new_tab('AdminGroupShop', 'it:Group Shops|es:Group Shops|fr:Groupes de boutique|de:Group Shops|en:Group Shops', $shopTabId); + add_new_tab('AdminShopUrl', 'it:Shop Urls|es:Shop Urls|fr:URLs de boutique|de:Shop Urls|en:Shop Urls', $shopTabId); + + return $res; +} diff --git a/install-dev/php/customizations.php b/install-dev/php/customizations.php new file mode 100644 index 000000000..821efd80c --- /dev/null +++ b/install-dev/php/customizations.php @@ -0,0 +1,44 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +define('_CONTAINS_REQUIRED_FIELD_', 2); + +function add_required_customization_field_flag() +{ + if (($result = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'customization_field` WHERE `required` = 1')) === false) + return false; + if (Db::getInstance()->numRows()) + { + $productIds = array(); + foreach ($result AS $row) + $productIds[] = (int)($row['id_product']); + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'product` SET `customizable` = '._CONTAINS_REQUIRED_FIELD_.' WHERE `id_product` IN ('.implode(', ', $productIds).')')) + return false; + } + return true; +} + diff --git a/install-dev/php/database_structure.php b/install-dev/php/database_structure.php new file mode 100644 index 000000000..1cccf5456 --- /dev/null +++ b/install-dev/php/database_structure.php @@ -0,0 +1,47 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function group_reduction_column_fix() +{ + if (!Db::getInstance()->execute('SELECT `group_reduction` FROM `'._DB_PREFIX_.'order_detail` LIMIT 1')) + return Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'order_detail` ADD `group_reduction` DECIMAL(10, 2) NOT NULL AFTER `reduction_amount`'); + return true; +} + +function ecotax_tax_application_fix() +{ + if (!Db::getInstance()->execute('SELECT `ecotax_tax_rate` FROM `'._DB_PREFIX_.'order_detail` LIMIT 1')) + return Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'order_detail` ADD `ecotax_tax_rate` DECIMAL(5, 3) NOT NULL AFTER `ecotax`'); + return true; +} + +function id_currency_country_fix() +{ + if (!Db::getInstance()->execute('SELECT `id_currency` FROM `'._DB_PREFIX_.'country` LIMIT 1')) + return Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'country` ADD `id_currency` INT NOT NULL DEFAULT \'0\' AFTER `id_zone`'); + return true; +} \ No newline at end of file diff --git a/install-dev/php/deliverynumber.php b/install-dev/php/deliverynumber.php new file mode 100644 index 000000000..7433868c2 --- /dev/null +++ b/install-dev/php/deliverynumber.php @@ -0,0 +1,55 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function delivery_number_set() +{ + Configuration::loadConfiguration(); + $number = 1; + + // Update each order with a number + $result = Db::getInstance()->ExecuteS(' + SELECT id_order + FROM '._DB_PREFIX_.'orders + ORDER BY id_order'); + foreach ($result as $row) + { + $order = new Order((int)($row['id_order'])); + $history = $order->getHistory(false); + foreach ($history as $row2) + { + $oS = new OrderState((int)($row2['id_order_state']), Configuration::get('PS_LANG_DEFAULT')); + if ($oS->delivery) + { + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'orders SET delivery_number = '.(int)($number++).', `delivery_date` = `date_add` WHERE id_order = '.(int)($order->id)); + break ; + } + } + } + // Add configuration var + Configuration::updateValue('PS_DELIVERY_NUMBER', (int)($number)); +} + diff --git a/install-dev/php/desactivatecustommodules.php b/install-dev/php/desactivatecustommodules.php new file mode 100644 index 000000000..ee7d14aca --- /dev/null +++ b/install-dev/php/desactivatecustommodules.php @@ -0,0 +1,65 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7389 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function desactivate_custom_modules() +{ + $db = Db::getInstance(); + $modulesDirOnDisk = Module::getModulesDirOnDisk(); + + $module_list_xml = _PS_ROOT_DIR_.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'modules_list.xml'; + $nativeModules = simplexml_load_file($module_list_xml); + $nativeModules = $nativeModules->modules; + foreach ($nativeModules as $nativeModulesType) + if (in_array($nativeModulesType['type'],array('native','partner'))) + { + $arrNativeModules[] = '""'; + foreach ($nativeModulesType->module as $module) + $arrNativeModules[] = '"'.pSQL($module['name']).'"'; + } + + $arrNonNative = $db->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'module` m + WHERE name NOT IN ('.implode(',',$arrNativeModules).') '); + + $uninstallMe = array("undefined-modules"); + if (is_array($arrNonNative)) + foreach($arrNonNative as $aModule) + $uninstallMe[] = $aModule['name']; + + if (!is_array($uninstallMe)) + $uninstallMe = array($uninstallMe); + + foreach ($uninstallMe as $k=>$v) + $uninstallMe[$k] = '"'.pSQL($v).'"'; + + return Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'module` + SET `active`= 0 + WHERE `name` IN ('.implode(',',$uninstallMe).')'); +} + diff --git a/install-dev/php/editorial_update.php b/install-dev/php/editorial_update.php new file mode 100644 index 000000000..c355812fc --- /dev/null +++ b/install-dev/php/editorial_update.php @@ -0,0 +1,73 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function editorial_update() +{ + /*Table creation*/ + + if (Db::getInstance()->getValue('SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name`="editorial"')) + { + Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'editorial` ( + `id_editorial` int(10) unsigned NOT NULL auto_increment, + `body_home_logo_link` varchar(255) NOT NULL, + PRIMARY KEY (`id_editorial`)) + ENGINE=MyISAM DEFAULT CHARSET=utf8'); + + Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'editorial_lang` ( + `id_editorial` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `body_title` varchar(255) NOT NULL, + `body_subheading` varchar(255) NOT NULL, + `body_paragraph` text NOT NULL, + `body_logo_subheading` varchar(255) NOT NULL, + PRIMARY KEY (`id_editorial`, `id_lang`)) + ENGINE=MyISAM DEFAULT CHARSET=utf8'); + + if (file_exists(dirname(__FILE__).'/../../modules/editorial/editorial.xml')) + { + $xml = simplexml_load_file(dirname(__FILE__).'/../../modules/editorial/editorial.xml'); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'editorial`(`id_editorial`, `body_home_logo_link`) VALUES(1, "'.(isset($xml->body->home_logo_link) ? pSQL($xml->body->home_logo_link) : '').'")'); + + + $languages = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'lang`'); + foreach ($languages as $language) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'editorial_lang` (`id_editorial`, `id_lang`, `body_title`, `body_subheading`, `body_paragraph`, `body_logo_subheading`) + VALUES (1, '.(int)($language['id_lang']).', + "'.(isset($xml->body->{'title_'.$language['id_lang']}) ? pSQL($xml->body->{'title_'.$language['id_lang']}) : '').'", + "'.(isset($xml->body->{'subheading_'.$language['id_lang']}) ? pSQL($xml->body->{'subheading_'.$language['id_lang']}) : '').'", + "'.(isset($xml->body->{'paragraph_'.$language['id_lang']}) ? pSQL($xml->body->{'paragraph_'.$language['id_lang']}, true) : '').'", + "'.(isset($xml->body->{'logo_subheading_'.$language['id_lang']}) ? pSQL($xml->body->{'logo_subheading_'.$language['id_lang']}) : '').'")'); + + unlink(dirname(__FILE__).'/../../modules/editorial/editorial.xml'); + } + } +} + diff --git a/install-dev/php/generate_ntree.php b/install-dev/php/generate_ntree.php new file mode 100644 index 000000000..5ebc37d7b --- /dev/null +++ b/install-dev/php/generate_ntree.php @@ -0,0 +1,31 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function generate_ntree() +{ + Category::regenerateEntireNtree(); +} diff --git a/install-dev/php/generate_tax_rules.php b/install-dev/php/generate_tax_rules.php new file mode 100644 index 000000000..59f47fb69 --- /dev/null +++ b/install-dev/php/generate_tax_rules.php @@ -0,0 +1,87 @@ +active = 1; + $group->name = 'Rule '.$tax['rate'].'%'; + $group->save(); + $id_tax_rules_group = $group->id; + + + $countries = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'country` c + LEFT JOIN `'._DB_PREFIX_.'zone` z ON (c.`id_zone` = z.`id_zone`) + LEFT JOIN `'._DB_PREFIX_.'tax_zone` tz ON (tz.`id_zone` = z.`id_zone`) + WHERE `id_tax` = '.(int)$id_tax + ); + if ($countries) + { + foreach ($countries AS $country) + { + $res = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'tax_rule` (`id_tax_rules_group`, `id_country`, `id_state`, `state_behavior`, `id_tax`) + VALUES ( + '.(int)$group->id.', + '.(int)$country['id_country'].', + 0, + 0, + '.(int)$id_tax. + ')'); + + } + } + + $states = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'states s + LEFT JOIN `'._DB_PREFIX_.'tax_state ts ON (ts.`id_state` = s.`id_state`) + WHERE `id_tax` = '.(int)$id_tax + ); + + if ($states) + { + foreach ($states AS $state) + { + if (!in_array($state['tax_behavior'], array(PS_PRODUCT_TAX, PS_STATE_TAX, PS_BOTH_TAX))) + $tax_behavior = PS_PRODUCT_TAX; + else + $tax_behavior = $state['tax_behavior']; + + $res = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'tax_rule` (`id_tax_rules_group`, `id_country`, `id_state`, `state_behavior`, `id_tax`) + VALUES ( + '.(int)$group->id.', + '.(int)$state['id_country'].', + '.(int)$state['id_state'].', + '.(int)$tax_behavior.', + '.(int)$id_tax. + ')'); + } + } + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product` + SET `id_tax_rules_group` = '.(int)$group->id.' + WHERE `id_tax` = '.(int)$id_tax + ); + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'carrier` + SET `id_tax_rules_group` = '.(int)$group->id.' + WHERE `id_tax` = '.(int)$id_tax + ); + + + if (Configuration::get('SOCOLISSIMO_OVERCOST_TAX') == $id_tax) + Configuration::updateValue('SOCOLISSIMO_OVERCOST_TAX', $group->id); + } +} + diff --git a/install-dev/php/gridextjs_deprecated.php b/install-dev/php/gridextjs_deprecated.php new file mode 100644 index 000000000..6f83b84c3 --- /dev/null +++ b/install-dev/php/gridextjs_deprecated.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function gridextjs_deprecated() +{ + if (file_exists(dirname(__FILE__).'/../../modules/gridextjs')) + return rename(dirname(__FILE__).'/../../modules/gridextjs', dirname(__FILE__).'/../../modules/gridextjs.deprecated'); + + return true; +} + diff --git a/install-dev/php/invoicenumber.php b/install-dev/php/invoicenumber.php new file mode 100644 index 000000000..fa6156c9c --- /dev/null +++ b/install-dev/php/invoicenumber.php @@ -0,0 +1,55 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function invoice_number_set() +{ + Configuration::loadConfiguration(); + $number = 1; + + // Update each order with a number + $result = Db::getInstance()->ExecuteS(' + SELECT id_order + FROM '._DB_PREFIX_.'orders + ORDER BY id_order'); + foreach ($result as $row) + { + $order = new Order((int)($row['id_order'])); + $history = $order->getHistory(false); + foreach ($history as $row2) + { + $oS = new OrderState((int)($row2['id_order_state']), Configuration::get('PS_LANG_DEFAULT')); + if ($oS->invoice) + { + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'orders SET invoice_number = '.(int)($number++).', `invoice_date` = `date_add` WHERE id_order = '.(int)($order->id)); + break ; + } + } + } + // Add configuration var + Configuration::updateValue('PS_INVOICE_NUMBER', (int)($number)); +} + diff --git a/install-dev/php/migrate_block_info_to_cms_block.php b/install-dev/php/migrate_block_info_to_cms_block.php new file mode 100644 index 000000000..1fc0f8e69 --- /dev/null +++ b/install-dev/php/migrate_block_info_to_cms_block.php @@ -0,0 +1,57 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6594 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function migrate_block_info_to_cms_block() +{ + //get ids cms of block information + $id_blockinfos = Db::getInstance()->getValue('SELECT id_module FROM `'._DB_PREFIX_.'module` WHERE name = \'blockinfos\''); + //get ids cms of block information + $ids_cms = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'block_cms` WHERE `id_block` = '.(int)$id_blockinfos); + //check if block info is installed and active + if (sizeof($ids_cms)) + { + //install module blockcms + if (Module::getInstanceByName('blockcms')->install()) + { + //add new block in new cms block + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cms_block` (`id_cms_category`, `name`, `location`, `position`) VALUES( 1, \'\', 0, 0)'); + $id_block = Db::getInstance()->Insert_ID(); + + $languages = Language::getLanguages(false); + foreach($languages AS $language) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cms_block_lang` (`id_cms_block`, `id_lang`, `name`) VALUES ('.(int)$id_block.', '.(int)$language['id_lang'].', \'Information\')'); + + //save ids cms of block information in new module cms bloc + foreach($ids_cms AS $id_cms) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'cms_block_page` (`id_cms_block`, `id_cms`, `is_category`) VALUES ('.(int)$id_block.', '.(int)$id_cms['id_cms'].', 0)'); + } + else + return true; + } + else + return true; +} \ No newline at end of file diff --git a/install-dev/php/module_tools.php b/install-dev/php/module_tools.php new file mode 100644 index 000000000..aef5f4cf3 --- /dev/null +++ b/install-dev/php/module_tools.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function moduleReinstaller($moduleName, $force = false) +{ + $module = Module::getInstanceByName($moduleName); + if (!is_object($module)) + die(Tools::displayError()); + if ($module->uninstall() OR $force) + return $module->install(); + return false; +} + diff --git a/install-dev/php/move_crossselling.php b/install-dev/php/move_crossselling.php new file mode 100644 index 000000000..44aefb5f9 --- /dev/null +++ b/install-dev/php/move_crossselling.php @@ -0,0 +1,14 @@ +ExecuteS('SELECT FROM `'._DB_PREFIX_.'module` WHERE `name` = \'crossselling\'')) +{ +Db::getInstance()->Execute(' +INSERT INTO `'._DB_PREFIX_.'hook_module` (`id_module`, `id_hook`, `position`) +VALUES ((SELECT `id_module` FROM `'._DB_PREFIX_.'module` WHERE `name` = \'crossselling\'), 9, (SELECT max_position FROM (SELECT MAX(position)+1 as max_position FROM `'._DB_PREFIX_.'hook_module` WHERE `id_hook` = 9) tmp))'); +} + +} + diff --git a/install-dev/php/price_converter.php b/install-dev/php/price_converter.php new file mode 100644 index 000000000..1bf1db474 --- /dev/null +++ b/install-dev/php/price_converter.php @@ -0,0 +1,50 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* Convert product prices from the PS < 1.3 wrong rounding system to the new 1.3 one */ +function convert_product_price() +{ + $taxes = Tax::getTaxes(); + $taxRates = array(); + foreach ($taxes as $data) + $taxRates[$data['id_tax']] = (float)($data['rate']) / 100; + $resource = DB::getInstance()->ExecuteS('SELECT `id_product`, `price`, `id_tax` FROM `'._DB_PREFIX_.'product`', false); + if (!$resource) + die(mysql_error()); + while ($row = DB::getInstance()->nextRow($resource)) + if ($row['id_tax']) + { + $price = $row['price'] * (1 + $taxRates[$row['id_tax']]); + $decimalPart = $price - (int)$price; + if ($decimalPart < 0.000001) + { + $newPrice = (float)(number_format($price, 6, '.', '')); + $newPrice = Tools::floorf($newPrice / (1 + $taxRates[$row['id_tax']]), 6); + DB::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'product` SET `price` = '.$newPrice.' WHERE `id_product` = '.(int)$row['id_product']); + } + } +} diff --git a/install-dev/php/regenerate_level_depth.php b/install-dev/php/regenerate_level_depth.php new file mode 100644 index 000000000..7380d01c5 --- /dev/null +++ b/install-dev/php/regenerate_level_depth.php @@ -0,0 +1,58 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * Regenerate the entire category tree level_depth + */ +function regenerate_level_depth() +{ + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'category` SET `level_depth` = 0 WHERE `id_category` = 1'); + regenerate_children_categories(1, 0); +} + +/** + * Recursively regenerate the level_depth of this category's children + * + * @param int $id_category + * @param int $level_depth + */ +function regenerate_children_categories($id_category, $level_depth) + { + $categories = Db::getInstance()->ExecuteS('SELECT `id_category` FROM `'._DB_PREFIX_.'category` WHERE `id_parent` = '.(int)$id_category); + if (!$categories) + return; + $new_depth = (int)$level_depth + 1; + $cat_ids = ""; + foreach($categories as $category) + { + $cat_ids .= (string)$category['id_category'].','; + regenerate_children_categories($category['id_category'], $new_depth); + } + $cat_ids = substr($cat_ids, 0, -1); + + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'category` SET `level_depth` = '.(int)$new_depth.' WHERE `id_category` IN ('.$cat_ids.')'); + } diff --git a/install-dev/php/remove_duplicate_category_groups.php b/install-dev/php/remove_duplicate_category_groups.php new file mode 100644 index 000000000..a2207a4a5 --- /dev/null +++ b/install-dev/php/remove_duplicate_category_groups.php @@ -0,0 +1,52 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * Removes duplicates from table category_group caused by a bug in category importing in PS < 1.4.2 + */ +function remove_duplicate_category_groups() +{ + $result = Db::getInstance()->ExecuteS(' + SELECT `id_category`, `id_group`, COUNT(*) as `count` + FROM `'._DB_PREFIX_.'category_group` + GROUP BY `id_category`, `id_group` + ORDER BY `count` DESC'); + + foreach($result as $row) + { + if ((int)$row['count'] > 1) + { + $limit = (int)$row['count'] - 1; + $result = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'category_group` + WHERE `id_category` = '.$row['id_category'].' AND `id_group` = '.$row['id_group'].' + LIMIT '.$limit); + } + else + return; + } +} \ No newline at end of file diff --git a/install-dev/php/remove_module_from_hook.php b/install-dev/php/remove_module_from_hook.php new file mode 100644 index 000000000..ae91cf98f --- /dev/null +++ b/install-dev/php/remove_module_from_hook.php @@ -0,0 +1,53 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function remove_module_from_hook($module_name, $hook_name) +{ + $result = false; + + $id_module = Db::getInstance()->getValue(' + SELECT `id_module` FROM `'._DB_PREFIX_.'module` + WHERE `name` = \''.pSQL($module_name).'\'' + ); + + if ((int)$id_module > 0) + { + $id_hook = Db::getInstance()->getValue(' + SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = \''.pSQL($hook_name).'\' + '); + + if ((int)$id_hook > 0) + { + $result = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.(int)$id_module.' AND `id_hook` = '.(int)$id_hook); + } + } + + return $result; +} + diff --git a/install-dev/php/reorderpositions.php b/install-dev/php/reorderpositions.php new file mode 100644 index 000000000..4c4cceee4 --- /dev/null +++ b/install-dev/php/reorderpositions.php @@ -0,0 +1,75 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function reorderpositions() +{ + /* Clean products positions */ + if ($cat = Category::getCategories(1, false, false)) + foreach($cat AS $i => $categ) + Product::cleanPositions((int)$categ['id_category']); + + //clean Category position and delete old position system + Language::loadLanguages(); + $language = Language::getLanguages(); + $cat_parent = Db::getInstance()->ExecuteS('SELECT DISTINCT c.id_parent FROM `'._DB_PREFIX_.'category` c WHERE id_category != 1'); + foreach($cat_parent AS $parent) + { + $result = Db::getInstance()->ExecuteS(' + SELECT DISTINCT c.*, cl.* + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.(int)(Configuration::get('PS_LANG_DEFAULT')).') + WHERE c.id_parent = '.(int)($parent['id_parent']).' + ORDER BY name ASC'); + foreach($result AS $i => $categ) + { + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'category` + SET `position` = '.(int)($i).' + WHERE `id_parent` = '.(int)($categ['id_parent']).' + AND `id_category` = '.(int)($categ['id_category'])); + } + + $result = Db::getInstance()->ExecuteS(' + SELECT DISTINCT c.*, cl.* + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`) + WHERE c.id_parent = '.(int)($parent['id_parent']).' + ORDER BY name ASC'); + + // Remove number from category name + foreach($result AS $i => $categ) + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`) + SET `name` = \''.preg_replace('/^[0-9]+\./', '',$categ['name']).'\' + WHERE c.id_category = '.(int)($categ['id_category']).' AND id_lang = \''.(int)($categ['id_lang']).'\''); + } + + /* Clean CMS positions */ + if ($cms_cat = CMSCategory::getCategories(1, false, false)) + foreach($cms_cat AS $i => $categ) + CMS::cleanPositions((int)($categ['id_cms_category'])); +} \ No newline at end of file diff --git a/install-dev/php/setallgroupsonhomecategory.php b/install-dev/php/setallgroupsonhomecategory.php new file mode 100755 index 000000000..58818a37d --- /dev/null +++ b/install-dev/php/setallgroupsonhomecategory.php @@ -0,0 +1,40 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function setAllGroupsOnHomeCategory() +{ + $results = Group::getGroups(Configuration::get('PS_LANG_DEFAULT')); + $groups = array(); + foreach ($results AS $result) + $groups[] = $result['id_group']; + if (is_array($groups) && sizeof($groups)) + { + $category = new Category(1); + $category->cleanGroups(); + $category->addGroups($groups); + } +} diff --git a/install-dev/php/setdiscountcategory.php b/install-dev/php/setdiscountcategory.php new file mode 100644 index 000000000..c8b2108ce --- /dev/null +++ b/install-dev/php/setdiscountcategory.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function set_discount_category() +{ + $discounts = Db::getInstance()->ExecuteS('SELECT `id_discount` FROM `'._DB_PREFIX_.'discount`'); + $categories = Db::getInstance()->ExecuteS('SELECT `id_category` FROM `'._DB_PREFIX_.'category`'); + foreach ($discounts AS $discount) + foreach ($categories AS $category) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'discount_category` (`id_discount`,`id_category`) VALUES ('.(int)($discount['id_discount']).','.(int)($category['id_category']).')'); +} + + diff --git a/install-dev/php/setpaymentmodule.php b/install-dev/php/setpaymentmodule.php new file mode 100644 index 000000000..f50c4654a --- /dev/null +++ b/install-dev/php/setpaymentmodule.php @@ -0,0 +1,54 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function set_payment_module() +{ + // Get all modules then select only payment ones + $modules = Module::getModulesInstalled(); + foreach ($modules AS $module) + { + $file = _PS_MODULE_DIR_.$module['name'].'/'.$module['name'].'.php'; + if (!file_exists($file)) + continue; + $fd = fopen($file, 'r'); + if (!$fd) + continue ; + $content = fread($fd, filesize($file)); + if (preg_match_all('/extends PaymentModule/U', $content, $matches)) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_country` (id_module, id_country) + SELECT '.(int)($module['id_module']).', id_country FROM `'._DB_PREFIX_.'country` WHERE active = 1'); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_currency` (id_module, id_currency) + SELECT '.(int)($module['id_module']).', id_currency FROM `'._DB_PREFIX_.'currency` WHERE deleted = 0'); + } + fclose($fd); + } +} + + diff --git a/install-dev/php/setpaymentmodulegroup.php b/install-dev/php/setpaymentmodulegroup.php new file mode 100644 index 000000000..b6b84f439 --- /dev/null +++ b/install-dev/php/setpaymentmodulegroup.php @@ -0,0 +1,50 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function set_payment_module_group() +{ + // Get all modules then select only payment ones + $modules = Module::getModulesInstalled(); + foreach ($modules AS $module) + { + $file = _PS_MODULE_DIR_.$module['name'].'/'.$module['name'].'.php'; + if (!file_exists($file)) + continue; + $fd = @fopen($file, 'r'); + if (!$fd) + continue ; + $content = fread($fd, filesize($file)); + if (preg_match_all('/extends PaymentModule/U', $content, $matches)) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'module_group` (id_module, id_group) + SELECT '.(int)($module['id_module']).', id_group FROM `'._DB_PREFIX_.'group`'); + } + fclose($fd); + } +} + diff --git a/install-dev/php/shop_url.php b/install-dev/php/shop_url.php new file mode 100644 index 000000000..969255f8d --- /dev/null +++ b/install-dev/php/shop_url.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function shop_url() +{ + if (!($host = Configuration::get('CANONICAL_URL'))) + $host = Tools::getHttpHost(); + Configuration::updateValue('PS_SHOP_DOMAIN', $host); + Configuration::updateValue('PS_SHOP_DOMAIN_SSL', $host); + return true; +} \ No newline at end of file diff --git a/install-dev/php/update_for_13version.php b/install-dev/php/update_for_13version.php new file mode 100644 index 000000000..488be28e2 --- /dev/null +++ b/install-dev/php/update_for_13version.php @@ -0,0 +1,16 @@ += 0) + return; // if the old version is a 1.4 version + + // Disable the Smarty 3 + Configuration::updateValue('PS_FORCE_SMARTY_2', 1); + // Disable the URL rewritting + Configuration::updateValue('PS_REWRITING_SETTINGS', 0); + // Disable Canonical redirection + Configuration::updateValue('PS_CANONICAL_REDIRECT', 0); +} \ No newline at end of file diff --git a/install-dev/php/update_image_size_in_db.php b/install-dev/php/update_image_size_in_db.php new file mode 100644 index 000000000..ee504f502 --- /dev/null +++ b/install-dev/php/update_image_size_in_db.php @@ -0,0 +1,42 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function update_image_size_in_db() +{ + if (file_exists(realpath(INSTALL_PATH.'/../img').'/logo.jpg')) + { + list($width, $height, $type, $attr) = getimagesize(realpath(INSTALL_PATH.'/../img').'/logo.jpg'); + Configuration::updateValue('SHOP_LOGO_WIDTH', (int)round($width)); + Configuration::updateValue('SHOP_LOGO_HEIGHT', (int)round($height)); + } + if (file_exists(realpath(INSTALL_PATH.'/../modules/editorial').'/homepage_logo.jpg')) + { + list($width, $height, $type, $attr) = getimagesize(realpath(INSTALL_PATH.'/../modules/editorial').'/homepage_logo.jpg'); + Configuration::updateValue('EDITORIAL_IMAGE_WIDTH', (int)round($width)); + Configuration::updateValue('EDITORIAL_IMAGE_HEIGHT', (int)round($height)); + } +} diff --git a/install-dev/php/update_module_followup.php b/install-dev/php/update_module_followup.php new file mode 100644 index 000000000..104660df5 --- /dev/null +++ b/install-dev/php/update_module_followup.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function update_module_followup() +{ + Configuration::loadConfiguration(); + $followup = Module::getInstanceByName('followup'); + if (!$followup->id) + return; + + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'log_email` ADD INDEX `date_add`(`date_add`), ADD INDEX `id_cart`(`id_cart`);'); +} + diff --git a/install-dev/php/update_module_loyalty.php b/install-dev/php/update_module_loyalty.php new file mode 100644 index 000000000..ec26125b4 --- /dev/null +++ b/install-dev/php/update_module_loyalty.php @@ -0,0 +1,45 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +// backward compatibility vouchers should be available in all categories +function update_module_loyalty() +{ + if (Configuration::get('PS_LOYALTY_POINT_VALUE') !== false) + { + $category_list = ''; + + foreach(Category::getSimpleCategories(Configuration::get('PS_LANG_DEFAULT')) as $category) + $category_list .= $category['id_category'].','; + + if (!empty($category_list)) + { + $category_list = rtrim($category_list, ','); + Configuration::updateValue('PS_LOYALTY_VOUCHER_CATEGORY', $category_list); + } + } +} + diff --git a/install-dev/php/update_order_details.php b/install-dev/php/update_order_details.php new file mode 100644 index 000000000..0981d711a --- /dev/null +++ b/install-dev/php/update_order_details.php @@ -0,0 +1,39 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function update_order_details() +{ + $res = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.'order_detail` LIKE \'reduction_percent\''); + + if (sizeof($res) == 0) + { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'order_detail` ADD `reduction_percent` DECIMAL(10, 2) NOT NULL default \'0.00\' AFTER `product_price`'); + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'order_detail` ADD `reduction_amount` DECIMAL(20, 6) NOT NULL default \'0.000000\' AFTER `reduction_percent`'); + } +} + + diff --git a/install-dev/php/update_products_ecotax_v133.php b/install-dev/php/update_products_ecotax_v133.php new file mode 100644 index 000000000..ef304c2c1 --- /dev/null +++ b/install-dev/php/update_products_ecotax_v133.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function update_products_ecotax_v133() +{ + global $oldversion; + if($oldversion < '1.3.3.0') + { + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'product` SET `ecotax` = \'0\' WHERE 1'); + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'order_detail` SET `ecotax` = \'0\' WHERE 1;'); + } +} \ No newline at end of file diff --git a/install-dev/php/updatecarrierurl.php b/install-dev/php/updatecarrierurl.php new file mode 100644 index 000000000..0524888c0 --- /dev/null +++ b/install-dev/php/updatecarrierurl.php @@ -0,0 +1,43 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function update_carrier_url() +{ + // Get all carriers + $sql = ' + SELECT c.`id_carrier`, c.`url` + FROM `'._DB_PREFIX_.'carrier` c'; + $carriers = Db::getInstance()->ExecuteS($sql); + + // Check each one and erase carrier URL if not correct URL + foreach ($carriers as $carrier) + if (!Validate::isAbsoluteUrl($carrier['url'])) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'carrier` + SET `url` = \'\' + WHERE `id_carrier`= '.(int)($carrier['id_carrier'])); +} diff --git a/install-dev/php/updatemodulessql.php b/install-dev/php/updatemodulessql.php new file mode 100644 index 000000000..358d1689f --- /dev/null +++ b/install-dev/php/updatemodulessql.php @@ -0,0 +1,41 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function update_modules_sql() +{ + Configuration::loadConfiguration(); + $blocklink = Module::getInstanceByName('blocklink'); + if ($blocklink->id) + Db::getInstance()->Execute('ALTER IGNORE TABLE `'._DB_PREFIX_.'blocklink_lang` ADD PRIMARY KEY (`id_link`, `id_lang`);'); + $productComments = Module::getInstanceByName('productcomments'); + if ($productComments->id) + { + Db::getInstance()->Execute('ALTER IGNORE TABLE `'._DB_PREFIX_.'product_comment_grade` ADD PRIMARY KEY (`id_product_comment`, `id_product_comment_criterion`);'); + Db::getInstance()->Execute('ALTER IGNORE TABLE `'._DB_PREFIX_.'product_comment_criterion` DROP PRIMARY KEY, ADD PRIMARY KEY (`id_product_comment_criterion`, `id_lang`);'); + Db::getInstance()->Execute('ALTER IGNORE TABLE `'._DB_PREFIX_.'product_comment_criterion_product` ADD PRIMARY KEY(`id_product`, `id_product_comment_criterion`);'); + } +} diff --git a/install-dev/php/updateproductcomments.php b/install-dev/php/updateproductcomments.php new file mode 100644 index 000000000..cb27c60d1 --- /dev/null +++ b/install-dev/php/updateproductcomments.php @@ -0,0 +1,58 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function updateproductcomments() +{ + if (Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'product_comment') !== false) + { + Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.'product_comment_criterion_lang ( + `id_product_comment_criterion` INT( 11 ) UNSIGNED NOT NULL , + `id_lang` INT(11) UNSIGNED NOT NULL , + `name` VARCHAR(64) NOT NULL , + PRIMARY KEY ( `id_product_comment_criterion` , `id_lang` ) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); + Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.'product_comment_criterion_category ( + `id_product_comment_criterion` int(10) unsigned NOT NULL, + `id_category` int(10) unsigned NOT NULL, + PRIMARY KEY(`id_product_comment_criterion`, `id_category`), + KEY `id_category` (`id_category`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment ADD `id_guest` INT(11) NULL AFTER `id_customer`'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment ADD `customer_name` varchar(64) NULL AFTER `content`'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment ADD `deleted` tinyint(1) NOT NULL AFTER `validate`'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment ADD INDEX (id_customer)'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment ADD INDEX (id_guest)'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment ADD INDEX (id_product)'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment_criterion DROP `id_lang`'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment_criterion DROP `name`'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment_criterion ADD `id_product_comment_criterion_type` tinyint(1) NOT NULL AFTER `id_product_comment_criterion`'); + Db::getInstance()->Execute('ALTER TABLE '._DB_PREFIX_.'product_comment_criterion ADD `active` tinyint(1) NOT NULL AFTER `id_product_comment_criterion_type`'); + Db::getInstance()->Execute('ALTER IGNORE TABLE `'._DB_PREFIX_.'product_comment` ADD `title` VARCHAR(64) NULL AFTER `id_guest`;'); + } +} + + diff --git a/install-dev/php/updatetabicon_from_11version.php b/install-dev/php/updatetabicon_from_11version.php new file mode 100644 index 000000000..b621a9e95 --- /dev/null +++ b/install-dev/php/updatetabicon_from_11version.php @@ -0,0 +1,47 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +function updatetabicon_from_11version() +{ + global $oldversion; + if (version_compare($oldversion,'1.5.0.0','<')) + { + + $rows = Db::getInstance()->ExecuteS('SELECT `id_tab`,`class_name` FROM '._DB_PREFIX_.'tab'); + if (sizeof($rows)) + { + $img_dir = scandir(_PS_IMG_DIR_.'/t/'); + $result = true; + foreach ($rows as $tab) + { + if (file_exists(_PS_IMG_DIR_.'/t/'.$tab['id_tab'].'.gif') + AND !file_exists(_PS_IMG_DIR_.'/t/'.$tab['class_name'].'.gif')) + $result &= rename(_PS_IMG_DIR_.'/t/'.$tab['id_tab'].'.gif',_PS_IMG_DIR_.'/t/'.$tab['class_name'].'.gif'); + } + } + } + return true; +} diff --git a/install-dev/php/utf8.php b/install-dev/php/utf8.php new file mode 100644 index 000000000..060dd61af --- /dev/null +++ b/install-dev/php/utf8.php @@ -0,0 +1,135 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +define('_PS_MAGIC_QUOTES_GPC_', get_magic_quotes_gpc()); +define('_PS_MYSQL_REAL_ESCAPE_STRING_', function_exists('mysql_real_escape_string')); + +function latin1_database_to_utf8() +{ + global $requests, $warningExist; + + $tables = array( + array('name' => 'address', 'id' => 'id_address', 'fields' => array('alias', 'company', 'name', 'surname', 'address1', 'address2', 'postcode', 'city', 'other', 'phone', 'phone_mobile')), + array('name' => 'alias', 'id' => 'id_alias', 'fields' => array('alias', 'search')), + array('name' => 'attribute_group_lang', 'id' => 'id_attribute_group', 'lang' => true, 'fields' => array('name', 'public_name')), + array('name' => 'attribute_lang', 'id' => 'id_attribute', 'lang' => true, 'fields' => array('name')), + array('name' => 'carrier', 'id' => 'id_carrier', 'fields' => array('name', 'url')), + array('name' => 'carrier_lang', 'id' => 'id_carrier', 'lang' => true, 'fields' => array('delay')), + array('name' => 'cart', 'id' => 'id_cart', 'fields' => array('gift_message')), + array('name' => 'category_lang', 'id' => 'id_category', 'lang' => true, 'fields' => array('name', 'description', 'link_rewrite', 'meta_title', 'meta_keywords', 'meta_description')), + array('name' => 'configuration', 'id' => 'id_configuration', 'fields' => array('name', 'value')), + array('name' => 'configuration_lang', 'id' => 'id_configuration', 'lang' => true, 'fields' => array('value')), + array('name' => 'contact', 'id' => 'id_contact', 'fields' => array('email')), + array('name' => 'contact_lang', 'id' => 'id_contact', 'lang' => true, 'fields' => array('name', 'description')), + array('name' => 'country', 'id' => 'id_country', 'fields' => array('iso_code')), + array('name' => 'country_lang', 'id' => 'id_country', 'lang' => true, 'fields' => array('name')), + array('name' => 'currency', 'id' => 'id_currency', 'fields' => array('name', 'iso_code', 'sign')), + array('name' => 'customer', 'id' => 'id_customer', 'fields' => array('email', 'passwd', 'name', 'surname')), + array('name' => 'discount', 'id' => 'id_discount', 'fields' => array('name')), + array('name' => 'discount_lang', 'id' => 'id_discount', 'lang' => true, 'fields' => array('description')), + array('name' => 'discount_type_lang', 'id' => 'id_discount_type', 'lang' => true, 'fields' => array('name')), + array('name' => 'employee', 'id' => 'id_employee', 'fields' => array('name', 'surname', 'email', 'passwd')), + array('name' => 'feature_lang', 'id' => 'id_feature', 'lang' => true, 'fields' => array('name')), + array('name' => 'feature_value_lang', 'id' => 'id_feature_value', 'lang' => true, 'fields' => array('value')), + array('name' => 'hook', 'id' => 'id_hook', 'fields' => array('name', 'title', 'description')), + array('name' => 'hook_module_exceptions', 'id' => 'id_hook_module_exceptions', 'fields' => array('file_name')), + array('name' => 'image_lang', 'id' => 'id_image', 'lang' => true, 'fields' => array('legend')), + array('name' => 'image_type', 'id' => 'id_image_type', 'fields' => array('name')), + array('name' => 'lang', 'id' => 'id_lang', 'fields' => array('name', 'iso_code')), + array('name' => 'manufacturer', 'id' => 'id_manufacturer', 'fields' => array('name')), + array('name' => 'message', 'id' => 'id_message', 'fields' => array('message')), + array('name' => 'module', 'id' => 'id_module', 'fields' => array('name')), + array('name' => 'orders', 'id' => 'id_order', 'fields' => array('payment', 'module', 'gift_message', 'shipping_number')), + array('name' => 'order_detail', 'id' => 'id_order_detail', 'fields' => array('product_name', 'product_reference', 'tax_name', 'download_hash')), + array('name' => 'order_discount', 'id' => 'id_order_discount', 'fields' => array('name')), + array('name' => 'order_state', 'id' => 'id_order_state', 'fields' => array('color')), + array('name' => 'order_state_lang', 'id' => 'id_order_state', 'lang' => true, 'fields' => array('name', 'template')), + array('name' => 'product', 'id' => 'id_product', 'fields' => array('ean13', 'reference')), + array('name' => 'product_attribute', 'id' => 'id_product_attribute', 'fields' => array('reference', 'ean13')), + array('name' => 'product_download', 'id' => 'id_product_download', 'fields' => array('display_filename', 'physically_filename')), + array('name' => 'product_lang', 'id' => 'id_product', 'lang' => true, 'fields' => array('description', 'description_short', 'link_rewrite', 'meta_description', 'meta_keywords', 'meta_title', 'name', 'availability')), + array('name' => 'profile_lang', 'id' => 'id_profile', 'lang' => true, 'fields' => array('name')), + array('name' => 'quick_access', 'id' => 'id_quick_access', 'fields' => array('link')), + array('name' => 'quick_access_lang', 'id' => 'id_quick_access', 'lang' => true, 'fields' => array('name')), + array('name' => 'supplier', 'id' => 'id_supplier', 'fields' => array('name')), + array('name' => 'tab', 'id' => 'id_tab', 'fields' => array('class_name')), + array('name' => 'tab_lang', 'id' => 'id_tab', 'lang' => true, 'fields' => array('name')), + array('name' => 'tag', 'id' => 'id_tag', 'fields' => array('name')), + array('name' => 'tax_lang', 'id' => 'id_tax', 'lang' => true, 'fields' => array('name')), + array('name' => 'zone', 'id' => 'id_zone', 'fields' => array('name')) + ); + + foreach ($tables AS $table) + { + /* Latin1 datas' selection */ + if (!Db::getInstance()->Execute('SET NAMES latin1')) + echo 'Cannot change the sql encoding to latin1!'; + $query = 'SELECT `'.$table['id'].'`'; + foreach ($table['fields'] AS $field) + $query .= ', `'.$field.'`'; + if (isset($table['lang']) AND $table['lang']) + $query .= ', `id_lang`'; + $query .= ' FROM `'._DB_PREFIX_.$table['name'].'`'; + $latin1Datas = Db::getInstance()->ExecuteS($query); + if ($latin1Datas === false) + { + $warningExist = true; + $requests .= ' + + + getMsgError()).']]> + getNumberError()).']]> + '."\n"; + } + + if (Db::getInstance()->NumRows()) + { + /* Utf-8 datas' restitution */ + if (!Db::getInstance()->Execute('SET NAMES utf8')) + echo 'Cannot change the sql encoding to utf8!'; + foreach ($latin1Datas AS $latin1Data) + { + $query = 'UPDATE `'._DB_PREFIX_.$table['name'].'` SET'; + foreach ($table['fields'] AS $field) + $query .= ' `'.$field.'` = \''.pSQL($latin1Data[$field]).'\','; + $query = rtrim($query, ','); + $query .= ' WHERE `'.$table['id'].'` = '.(int)($latin1Data[$table['id']]); + if (isset($table['lang']) AND $table['lang']) + $query .= ' AND `id_lang` = '.(int)($latin1Data['id_lang']); + if (!Db::getInstance()->Execute($query)) + { + $warningExist = true; + $requests .= ' + + + getMsgError()).']]> + getNumberError()).']]> + '."\n"; + } + } + } + } +} diff --git a/install-dev/preactivation.php b/install-dev/preactivation.php new file mode 100644 index 000000000..bdf7df9c6 --- /dev/null +++ b/install-dev/preactivation.php @@ -0,0 +1,122 @@ +'), trim($object->{$field.'_'.((int)($_GET['language'])+1)})); + if (ToolsCore::property_exists($object, $field.'_1')) + return str_replace(array('!|', '|!'), array('<', '>'), trim($object->{$field.'_1'})); + return ''; + } + + if ($_GET['request'] == 'form') + { + $p = addslashes(strtolower($_GET['partner'])); + $c = addslashes(strtolower($_GET['country_iso_code'])); + + $context = stream_context_create(array('http' => array('method'=>"GET", 'timeout' => 5))); + $content = @file_get_contents('http://www.prestashop.com/partner/preactivation/fields.php?version=1.0&partner='.$p.'&country_iso_code='.$c, false, $context); + + if ($content && $content[0] == '<') + { + $result = simplexml_load_string($content); + if ($result) + { + $varList = ""; + echo '


    '; + foreach ($result->field as $field) + { + echo '
    '; + if ($field->type == 'text' || $field->type == 'password') + echo 'size) ? 'size="'.$field->size.'"' : '').' value="'.(isset($_GET[trim($field->key)]) ? $_GET[trim($field->key)] : $field->default).'" />'; + elseif ($field->type == 'radio') + { + foreach ($field->values as $key => $value) + echo getPreinstallXmlLang($value, 'label').' value == $field->default ? 'checked="checked"' : '').' />'; + } + elseif ($field->type == 'select') + { + echo ''; + } + elseif ($field->type == 'date') + { + echo ''; + echo ''; + echo ''; + } + if (getPreinstallXmlLang($field, 'help')) + echo ' '.getPreinstallXmlLang($field, 'help'); + echo '

    '; + if ($field->type == 'date') + $varList .= "'&".$field->key."='+$('#".$p."_".$c."_form_".$field->key."_year').val()+'-'+$('#".$p."_".$c."_form_".$field->key."_month').val()+'-'+$('#".$p."_".$c."_form_".$field->key."_day').val()+\n"; + else + $varList .= "'&".$field->key."='+ encodeURIComponent($('#".$p."_".$c."_form_".$field->key."').val())+\n"; + } + echo ' + '; + } + } + + } + + + if ($_GET['request'] == 'send') + { + $context = stream_context_create(array('http' => array('method'=>"GET", 'timeout' => 5))); + $url = 'http://www.prestashop.com/partner/preactivation/actions.php?version=1.0&partner='.addslashes($_GET['partner']); + + // Protect fields + foreach ($_GET as $key => $value) + $_GET[$key] = strip_tags(str_replace(array('\'', '"'), '', trim($value))); + + // Encore Get, Send It and Get Answers + @require_once('../config/settings.inc.php'); + foreach ($_GET as $key => $val) + $url .= '&'.$key.'='.urlencode($val); + $url .= '&security='.md5($_GET['email']._COOKIE_IV_); + $content = @file_get_contents($url, false, $context); + if ($content) + echo $content; + else + echo 'KO|Could not connect with Prestashop.com'; + } + +?> + diff --git a/install-dev/sql/db.sql b/install-dev/sql/db.sql new file mode 100644 index 000000000..3506654e4 --- /dev/null +++ b/install-dev/sql/db.sql @@ -0,0 +1,1883 @@ +SET NAMES 'utf8'; + +CREATE TABLE `PREFIX_access` ( + `id_profile` int(10) unsigned NOT NULL, + `id_tab` int(10) unsigned NOT NULL, + `view` int(11) NOT NULL, + `add` int(11) NOT NULL, + `edit` int(11) NOT NULL, + `delete` int(11) NOT NULL, + PRIMARY KEY (`id_profile`,`id_tab`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_accessory` ( + `id_product_1` int(10) unsigned NOT NULL, + `id_product_2` int(10) unsigned NOT NULL, + KEY `accessory_product` (`id_product_1`,`id_product_2`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_address` ( + `id_address` int(10) unsigned NOT NULL auto_increment, + `id_country` int(10) unsigned NOT NULL, + `id_state` int(10) unsigned default NULL, + `id_customer` int(10) unsigned NOT NULL default '0', + `id_manufacturer` int(10) unsigned NOT NULL default '0', + `id_supplier` int(10) unsigned NOT NULL default '0', + `alias` varchar(32) NOT NULL, + `company` varchar(32) default NULL, + `lastname` varchar(32) NOT NULL, + `firstname` varchar(32) NOT NULL, + `address1` varchar(128) NOT NULL, + `address2` varchar(128) default NULL, + `postcode` varchar(12) default NULL, + `city` varchar(64) NOT NULL, + `other` text, + `phone` varchar(16) default NULL, + `phone_mobile` varchar(16) default NULL, + `vat_number` varchar(32) default NULL, + `dni` varchar(16) DEFAULT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + `active` tinyint(1) unsigned NOT NULL default '1', + `deleted` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_address`), + KEY `address_customer` (`id_customer`), + KEY `id_country` (`id_country`), + KEY `id_state` (`id_state`), + KEY `id_manufacturer` (`id_manufacturer`), + KEY `id_supplier` (`id_supplier`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_alias` ( + `id_alias` int(10) unsigned NOT NULL auto_increment, + `alias` varchar(255) NOT NULL, + `search` varchar(255) NOT NULL, + `active` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`id_alias`), + UNIQUE KEY `alias` (`alias`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attachment` ( + `id_attachment` int(10) unsigned NOT NULL auto_increment, + `file` varchar(40) NOT NULL, + `file_name` varchar(128) NOT NULL, + `mime` varchar(64) NOT NULL, + PRIMARY KEY (`id_attachment`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attachment_lang` ( + `id_attachment` int(10) unsigned NOT NULL auto_increment, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) default NULL, + `description` TEXT, + PRIMARY KEY (`id_attachment`, `id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_attachment` ( + `id_product` int(10) unsigned NOT NULL, + `id_attachment` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_product`,`id_attachment`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute` ( + `id_attribute` int(10) unsigned NOT NULL auto_increment, + `id_attribute_group` int(10) unsigned NOT NULL, + `color` varchar(32) default NULL, + PRIMARY KEY (`id_attribute`), + KEY `attribute_group` (`id_attribute_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute_group` ( + `id_attribute_group` int(10) unsigned NOT NULL auto_increment, + `is_color_group` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id_attribute_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute_group_lang` ( + `id_attribute_group` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + `public_name` varchar(64) NOT NULL, + PRIMARY KEY (`id_attribute_group`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute_impact` ( + `id_attribute_impact` int(10) unsigned NOT NULL auto_increment, + `id_product` int(11) unsigned NOT NULL, + `id_attribute` int(11) unsigned NOT NULL, + `weight` float NOT NULL, + `price` decimal(17,2) NOT NULL, + PRIMARY KEY (`id_attribute_impact`), + UNIQUE KEY `id_product` (`id_product`,`id_attribute`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute_lang` ( + `id_attribute` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + PRIMARY KEY `attribute_lang` (`id_attribute`,`id_lang`), + KEY `id_lang` (`id_lang`,`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_carrier` ( + `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_tax_rules_group` int(10) unsigned DEFAULT '0', + `name` varchar(64) NOT NULL, + `url` varchar(255) DEFAULT NULL, + `active` tinyint(1) unsigned NOT NULL DEFAULT '0', + `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', + `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1', + `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0', + `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0', + `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0', + `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0', + `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0', + `external_module_name` varchar(64) DEFAULT NULL, + `shipping_method` int(2) NOT NULL DEFAULT '0', + PRIMARY KEY (`id_carrier`), + KEY `deleted` (`deleted`,`active`), + KEY `id_tax_rules_group` (`id_tax_rules_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_carrier_lang` ( + `id_carrier` int(10) unsigned NOT NULL, + `id_shop` int(11) unsigned NOT NULL DEFAULT '1', + `id_lang` int(10) unsigned NOT NULL, + `delay` varchar(128) default NULL, + UNIQUE KEY `shipper_lang_index` (`id_lang`,`id_shop`, `id_carrier`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_carrier_zone` ( + `id_carrier` int(10) unsigned NOT NULL, + `id_zone` int(10) unsigned NOT NULL, + PRIMARY KEY `carrier_zone_index` (`id_carrier`,`id_zone`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cart` ( + `id_cart` int(10) unsigned NOT NULL auto_increment, + `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_carrier` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `id_address_delivery` int(10) unsigned NOT NULL, + `id_address_invoice` int(10) unsigned NOT NULL, + `id_currency` int(10) unsigned NOT NULL, + `id_customer` int(10) unsigned NOT NULL, + `id_guest` int(10) unsigned NOT NULL, + `secure_key` varchar(32) NOT NULL default '-1', + `recyclable` tinyint(1) unsigned NOT NULL default '1', + `gift` tinyint(1) unsigned NOT NULL default '0', + `gift_message` text, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_cart`), + KEY `cart_customer` (`id_customer`), + KEY `id_address_delivery` (`id_address_delivery`), + KEY `id_address_invoice` (`id_address_invoice`), + KEY `id_carrier` (`id_carrier`), + KEY `id_lang` (`id_lang`), + KEY `id_currency` (`id_currency`), + KEY `id_guest` (`id_guest`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cart_discount` ( + `id_cart` int(10) unsigned NOT NULL, + `id_discount` int(10) unsigned NOT NULL, + KEY `cart_discount_index` (`id_cart`,`id_discount`), + KEY `id_discount` (`id_discount`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cart_product` ( + `id_cart` int(10) unsigned NOT NULL, + `id_product` int(10) unsigned NOT NULL, + `id_product_attribute` int(10) unsigned default NULL, + `quantity` int(10) unsigned NOT NULL default '0', + `date_add` datetime NOT NULL, + KEY `cart_product_index` (`id_cart`,`id_product`), + KEY `id_product_attribute` (`id_product_attribute`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_category` ( + `id_category` int(10) unsigned NOT NULL auto_increment, + `id_parent` int(10) unsigned NOT NULL, + `level_depth` tinyint(3) unsigned NOT NULL default '0', + `nleft` int(10) unsigned NOT NULL default '0', + `nright` int(10) unsigned NOT NULL default '0', + `active` tinyint(1) unsigned NOT NULL default '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + `position` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`id_category`), + KEY `category_parent` (`id_parent`), + KEY `nleftright` (`nleft`,`nright`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_category_group` ( + `id_category` int(10) unsigned NOT NULL, + `id_group` int(10) unsigned NOT NULL, + UNIQUE KEY `category_group_index` (`id_category`,`id_group`), + KEY `id_category` (`id_category`), + KEY `id_group` (`id_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_category_lang` ( + `id_category` int(10) unsigned NOT NULL, + `id_shop` INT( 11 ) UNSIGNED NOT NULL DEFAULT '1', + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + `description` text, + `link_rewrite` varchar(128) NOT NULL, + `meta_title` varchar(128) default NULL, + `meta_keywords` varchar(255) default NULL, + `meta_description` varchar(255) default NULL, + UNIQUE KEY `category_lang_index` (`id_category`,`id_shop`, `id_lang`), + KEY `category_name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_category_product` ( + `id_category` int(10) unsigned NOT NULL, + `id_product` int(10) unsigned NOT NULL, + `position` int(10) unsigned NOT NULL default '0', + KEY `category_product_index` (`id_category`,`id_product`), + INDEX (`id_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms` ( + `id_cms` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_cms_category` int(10) unsigned NOT NULL, + `position` int(10) unsigned NOT NULL DEFAULT '0', + `active` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_cms`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_lang` ( + `id_cms` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `meta_title` varchar(128) NOT NULL, + `meta_description` varchar(255) default NULL, + `meta_keywords` varchar(255) default NULL, + `content` longtext, + `link_rewrite` varchar(128) NOT NULL, + PRIMARY KEY (`id_cms`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_category` ( + `id_cms_category` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_parent` int(10) unsigned NOT NULL, + `level_depth` tinyint(3) unsigned NOT NULL DEFAULT '0', + `active` tinyint(1) unsigned NOT NULL DEFAULT '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + `position` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`id_cms_category`), + KEY `category_parent` (`id_parent`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_category_lang` ( + `id_cms_category` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + `description` text, + `link_rewrite` varchar(128) NOT NULL, + `meta_title` varchar(128) DEFAULT NULL, + `meta_keywords` varchar(255) DEFAULT NULL, + `meta_description` varchar(255) DEFAULT NULL, + UNIQUE KEY `category_lang_index` (`id_cms_category`,`id_lang`), + KEY `category_name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_configuration` ( + `id_configuration` int(10) unsigned NOT NULL auto_increment, + `id_group_shop` INT(11) UNSIGNED DEFAULT NULL, + `id_shop` INT(11) UNSIGNED DEFAULT NULL, + `name` varchar(32) NOT NULL, + `value` text, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_configuration`), + KEY `name` (`name`), + KEY `id_shop` (`id_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_configuration_lang` ( + `id_configuration` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `value` text, + `date_upd` datetime default NULL, + PRIMARY KEY (`id_configuration`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_connections` ( + `id_connections` int(10) unsigned NOT NULL auto_increment, + `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_guest` int(10) unsigned NOT NULL, + `id_page` int(10) unsigned NOT NULL, + `ip_address` BIGINT NULL DEFAULT NULL, + `date_add` datetime NOT NULL, + `http_referer` varchar(255) default NULL, + PRIMARY KEY (`id_connections`), + KEY `id_guest` (`id_guest`), + KEY `date_add` (`date_add`), + KEY `id_page` (`id_page`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_connections_page` ( + `id_connections` int(10) unsigned NOT NULL, + `id_page` int(10) unsigned NOT NULL, + `time_start` datetime NOT NULL, + `time_end` datetime default NULL, + PRIMARY KEY (`id_connections`,`id_page`,`time_start`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_connections_source` ( + `id_connections_source` int(10) unsigned NOT NULL auto_increment, + `id_connections` int(10) unsigned NOT NULL, + `http_referer` varchar(255) default NULL, + `request_uri` varchar(255) default NULL, + `keywords` varchar(255) default NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_connections_source`), + KEY `connections` (`id_connections`), + KEY `orderby` (`date_add`), + KEY `http_referer` (`http_referer`), + KEY `request_uri` (`request_uri`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_contact` ( + `id_contact` int(10) unsigned NOT NULL auto_increment, + `email` varchar(128) NOT NULL, + `customer_service` tinyint(1) NOT NULL DEFAULT 0, + `position` tinyint(2) unsigned NOT NULL default '0', + PRIMARY KEY (`id_contact`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_contact_lang` ( + `id_contact` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) NOT NULL, + `description` text, + UNIQUE KEY `contact_lang_index` (`id_contact`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_country` ( + `id_country` int(10) unsigned NOT NULL auto_increment, + `id_zone` int(10) unsigned NOT NULL, + `id_currency` int(10) unsigned NOT NULL default '0', + `iso_code` varchar(3) NOT NULL, + `call_prefix` int(10) NOT NULL default '0', + `active` tinyint(1) unsigned NOT NULL default '0', + `contains_states` tinyint(1) NOT NULL default '0', + `need_identification_number` tinyint(1) NOT NULL default '0', + `need_zip_code` tinyint(1) NOT NULL default '1', + `zip_code_format` varchar(12) NOT NULL default '', + `display_tax_label` BOOLEAN NOT NULL, + PRIMARY KEY (`id_country`), + KEY `country_iso_code` (`iso_code`), + KEY `country_` (`id_zone`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_country_lang` ( + `id_country` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(64) NOT NULL, + UNIQUE KEY `country_lang_index` (`id_country`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_currency` ( + `id_currency` int(10) unsigned NOT NULL auto_increment, + `name` varchar(32) NOT NULL, + `iso_code` varchar(3) NOT NULL default '0', + `iso_code_num` varchar(3) NOT NULL default '0', + `sign` varchar(8) NOT NULL, + `blank` tinyint(1) unsigned NOT NULL default '0', + `format` tinyint(1) unsigned NOT NULL default '0', + `decimals` tinyint(1) unsigned NOT NULL default '1', + `conversion_rate` decimal(13,6) NOT NULL, + `deleted` tinyint(1) unsigned NOT NULL default '0', + `active` tinyint(1) unsigned NOT NULL default '1', + PRIMARY KEY (`id_currency`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customer` ( + `id_customer` int(10) unsigned NOT NULL auto_increment, + `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_gender` int(10) unsigned NOT NULL, + `id_default_group` int(10) unsigned NOT NULL DEFAULT '1', + `firstname` varchar(32) NOT NULL, + `lastname` varchar(32) NOT NULL, + `email` varchar(128) NOT NULL, + `passwd` varchar(32) NOT NULL, + `last_passwd_gen` timestamp NOT NULL default CURRENT_TIMESTAMP, + `birthday` date default NULL, + `newsletter` tinyint(1) unsigned NOT NULL default '0', + `ip_registration_newsletter` varchar(15) default NULL, + `newsletter_date_add` datetime default NULL, + `optin` tinyint(1) unsigned NOT NULL default '0', + `secure_key` varchar(32) NOT NULL default '-1', + `note` text, + `active` tinyint(1) unsigned NOT NULL default '0', + `is_guest` tinyint(1) NOT NULL default '0', + `deleted` tinyint(1) NOT NULL default '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_customer`), + KEY `customer_email` (`email`), + KEY `customer_login` (`email`,`passwd`), + KEY `id_customer_passwd` (`id_customer`,`passwd`), + KEY `id_gender` (`id_gender`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customer_group` ( + `id_customer` int(10) unsigned NOT NULL, + `id_group` int(10) unsigned NOT NULL, + PRIMARY KEY `customer_group_index` (`id_customer`,`id_group`), + INDEX customer_login(id_group), + KEY `id_customer` (`id_customer`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customer_message` ( + `id_customer_message` int(10) unsigned NOT NULL auto_increment, + `id_customer_thread` int(11) default NULL, + `id_employee` int(10) unsigned default NULL, + `message` text NOT NULL, + `file_name` varchar(18) DEFAULT NULL, + `ip_address` int(11) default NULL, + `user_agent` varchar(128) default NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_customer_message`), + KEY `id_customer_thread` (`id_customer_thread`), + KEY `id_employee` (`id_employee`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customer_thread` ( + `id_customer_thread` int(11) unsigned NOT NULL auto_increment, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_lang` int(10) unsigned NOT NULL, + `id_contact` int(10) unsigned NOT NULL, + `id_customer` int(10) unsigned default NULL, + `id_order` int(10) unsigned default NULL, + `id_product` int(10) unsigned default NULL, + `status` enum('open','closed','pending1','pending2') NOT NULL default 'open', + `email` varchar(128) NOT NULL, + `token` varchar(12) default NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_customer_thread`), + KEY `id_shop` (`id_shop`), + KEY `id_lang` (`id_lang`), + KEY `id_contact` (`id_contact`), + KEY `id_customer` (`id_customer`), + KEY `id_order` (`id_order`), + KEY `id_product` (`id_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +CREATE TABLE `PREFIX_customization` ( + `id_customization` int(10) unsigned NOT NULL auto_increment, + `id_product_attribute` int(10) unsigned NOT NULL default '0', + `id_cart` int(10) unsigned NOT NULL, + `id_product` int(10) NOT NULL, + `quantity` int(10) NOT NULL, + `quantity_refunded` INT NOT NULL DEFAULT '0', + `quantity_returned` INT NOT NULL DEFAULT '0', + PRIMARY KEY (`id_customization`,`id_cart`,`id_product`), + KEY `id_product_attribute` (`id_product_attribute`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customization_field` ( + `id_customization_field` int(10) unsigned NOT NULL auto_increment, + `id_product` int(10) unsigned NOT NULL, + `type` tinyint(1) NOT NULL, + `required` tinyint(1) NOT NULL, + PRIMARY KEY (`id_customization_field`), + KEY `id_product` (`id_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customization_field_lang` ( + `id_customization_field` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + PRIMARY KEY (`id_customization_field`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customized_data` ( + `id_customization` int(10) unsigned NOT NULL, + `type` tinyint(1) NOT NULL, + `index` int(3) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id_customization`,`type`,`index`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_date_range` ( + `id_date_range` int(10) unsigned NOT NULL auto_increment, + `time_start` datetime NOT NULL, + `time_end` datetime NOT NULL, + PRIMARY KEY (`id_date_range`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_delivery` ( + `id_delivery` int(10) unsigned NOT NULL auto_increment, + `id_carrier` int(10) unsigned NOT NULL, + `id_range_price` int(10) unsigned default NULL, + `id_range_weight` int(10) unsigned default NULL, + `id_zone` int(10) unsigned NOT NULL, + `price` decimal(17,2) NOT NULL, + PRIMARY KEY (`id_delivery`), + KEY `id_zone` (`id_zone`), + KEY `id_carrier` (`id_carrier`,`id_zone`), + KEY `id_range_price` (`id_range_price`), + KEY `id_range_weight` (`id_range_weight`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_discount` ( + `id_discount` int(10) unsigned NOT NULL auto_increment, + `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_discount_type` int(10) unsigned NOT NULL, + `behavior_not_exhausted` TINYINT(3) DEFAULT '1', + `id_customer` int(10) unsigned NOT NULL, + `id_group` int(10) unsigned NOT NULL default 0, + `id_currency` int unsigned NOT NULL default 0, + `name` varchar(32) NOT NULL, + `value` decimal(17,2) NOT NULL default '0.00', + `quantity` int(10) unsigned NOT NULL default '0', + `quantity_per_user` int(10) unsigned NOT NULL default '1', + `cumulable` tinyint(1) unsigned NOT NULL default '0', + `cumulable_reduction` tinyint(1) unsigned NOT NULL default '0', + `date_from` datetime NOT NULL, + `date_to` datetime NOT NULL, + `minimal` decimal(17,2) default NULL, + `active` tinyint(1) unsigned NOT NULL default '0', + `cart_display` tinyint(1) unsigned NOT NULL default '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_discount`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_shop` (`id_shop`), + KEY `discount_name` (`name`), + KEY `discount_customer` (`id_customer`), + KEY `id_discount_type` (`id_discount_type`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_discount_category` ( + `id_category` int(11) unsigned NOT NULL, + `id_discount` int(11) unsigned NOT NULL, + PRIMARY KEY (`id_category`, `id_discount`), + KEY `discount` (`id_discount`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_discount_lang` ( + `id_discount` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `description` text, + PRIMARY KEY (`id_discount`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_discount_type` ( + `id_discount_type` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id_discount_type`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_discount_type_lang` ( + `id_discount_type` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(64) NOT NULL, + PRIMARY KEY (`id_discount_type`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_employee` ( + `id_employee` int(10) unsigned NOT NULL auto_increment, + `id_profile` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL DEFAULT 0, + `lastname` varchar(32) NOT NULL, + `firstname` varchar(32) NOT NULL, + `email` varchar(128) NOT NULL, + `passwd` varchar(32) NOT NULL, + `last_passwd_gen` timestamp NOT NULL default CURRENT_TIMESTAMP, + `stats_date_from` date default NULL, + `stats_date_to` date default NULL, + `bo_color` varchar(32) default NULL, + `bo_theme` varchar(32) default NULL, + `bo_uimode` ENUM('hover','click') default 'click', + `active` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_employee`), + KEY `employee_login` (`email`,`passwd`), + KEY `id_employee_passwd` (`id_employee`,`passwd`), + KEY `id_profile` (`id_profile`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_feature` ( + `id_feature` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id_feature`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_feature_lang` ( + `id_feature` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) default NULL, + PRIMARY KEY (`id_feature`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_feature_product` ( + `id_feature` int(10) unsigned NOT NULL, + `id_product` int(10) unsigned NOT NULL, + `id_feature_value` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_feature`,`id_product`), + KEY `id_feature_value` (`id_feature_value`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_feature_value` ( + `id_feature_value` int(10) unsigned NOT NULL auto_increment, + `id_feature` int(10) unsigned NOT NULL, + `custom` tinyint(3) unsigned default NULL, + PRIMARY KEY (`id_feature_value`), + KEY `feature` (`id_feature`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_feature_value_lang` ( + `id_feature_value` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `value` varchar(255) default NULL, + PRIMARY KEY (`id_feature_value`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_group` ( + `id_group` int(10) unsigned NOT NULL auto_increment, + `reduction` decimal(17,2) NOT NULL default '0.00', + `price_display_method` TINYINT NOT NULL DEFAULT 0, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_group_lang` ( + `id_group` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) NOT NULL, + UNIQUE KEY `attribute_lang_index` (`id_group`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_group_reduction` ( + `id_group_reduction` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_group` INT(10) UNSIGNED NOT NULL, + `id_category` INT(10) UNSIGNED NOT NULL, + `reduction` DECIMAL(4, 3) NOT NULL, + PRIMARY KEY(`id_group_reduction`), + UNIQUE KEY(`id_group`, `id_category`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_group_reduction_cache` ( + `id_product` INT UNSIGNED NOT NULL, + `id_group` INT UNSIGNED NOT NULL, + `reduction` DECIMAL(4, 3) NOT NULL, + PRIMARY KEY(`id_product`, `id_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_guest` ( + `id_guest` int(10) unsigned NOT NULL auto_increment, + `id_operating_system` int(10) unsigned default NULL, + `id_web_browser` int(10) unsigned default NULL, + `id_customer` int(10) unsigned default NULL, + `javascript` tinyint(1) default '0', + `screen_resolution_x` smallint(5) unsigned default NULL, + `screen_resolution_y` smallint(5) unsigned default NULL, + `screen_color` tinyint(3) unsigned default NULL, + `sun_java` tinyint(1) default NULL, + `adobe_flash` tinyint(1) default NULL, + `adobe_director` tinyint(1) default NULL, + `apple_quicktime` tinyint(1) default NULL, + `real_player` tinyint(1) default NULL, + `windows_media` tinyint(1) default NULL, + `accept_language` varchar(8) default NULL, + PRIMARY KEY (`id_guest`), + KEY `id_customer` (`id_customer`), + KEY `id_operating_system` (`id_operating_system`), + KEY `id_web_browser` (`id_web_browser`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_hook` ( + `id_hook` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `title` varchar(64) NOT NULL, + `description` text, + `position` tinyint(1) NOT NULL default '1', + `live_edit` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id_hook`), + UNIQUE KEY `hook_name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_hook_module` ( + `id_module` int(10) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_hook` int(10) unsigned NOT NULL, + `position` tinyint(2) unsigned NOT NULL, + PRIMARY KEY (`id_module`,`id_hook`,`id_shop`), + KEY `id_hook` (`id_hook`), + KEY `id_module` (`id_module`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_hook_module_exceptions` ( + `id_hook_module_exceptions` int(10) unsigned NOT NULL auto_increment, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_module` int(10) unsigned NOT NULL, + `id_hook` int(10) unsigned NOT NULL, + `file_name` varchar(255) default NULL, + PRIMARY KEY (`id_hook_module_exceptions`), + KEY `id_module` (`id_module`), + KEY `id_hook` (`id_hook`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_image` ( + `id_image` int(10) unsigned NOT NULL auto_increment, + `id_product` int(10) unsigned NOT NULL, + `position` tinyint(2) unsigned NOT NULL default '0', + `cover` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_image`), + KEY `image_product` (`id_product`), + UNIQUE KEY `product_position` (`id_product`,`position`), + KEY `id_product_cover` (`id_product`,`cover`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_image_lang` ( + `id_image` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `legend` varchar(128) default NULL, + UNIQUE KEY `image_lang_index` (`id_image`,`id_lang`), + KEY `id_image` (`id_image`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_image_type` ( + `id_image_type` int(10) unsigned NOT NULL auto_increment, + `name` varchar(16) NOT NULL, + `width` int(10) unsigned NOT NULL, + `height` int(10) unsigned NOT NULL, + `products` tinyint(1) NOT NULL default '1', + `categories` tinyint(1) NOT NULL default '1', + `manufacturers` tinyint(1) NOT NULL default '1', + `suppliers` tinyint(1) NOT NULL default '1', + `scenes` tinyint(1) NOT NULL default '1', + `stores` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`id_image_type`), + KEY `image_type_name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_lang` ( + `id_lang` int(10) unsigned NOT NULL auto_increment, + `name` varchar(32) NOT NULL, + `active` tinyint(3) unsigned NOT NULL default '0', + `iso_code` char(2) NOT NULL, + `language_code` char(5) NOT NULL, + PRIMARY KEY (`id_lang`), + KEY `lang_iso_code` (`iso_code`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_manufacturer` ( + `id_manufacturer` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + `active` tinyint(1) NOT NULL default 0, + PRIMARY KEY (`id_manufacturer`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_manufacturer_lang` ( + `id_manufacturer` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `description` text, + `short_description` varchar(254) default NULL, + `meta_title` varchar(128) default NULL, + `meta_keywords` varchar(255) default NULL, + `meta_description` varchar(255) default NULL, + PRIMARY KEY (`id_manufacturer`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_message` ( + `id_message` int(10) unsigned NOT NULL auto_increment, + `id_cart` int(10) unsigned default NULL, + `id_customer` int(10) unsigned NOT NULL, + `id_employee` int(10) unsigned default NULL, + `id_order` int(10) unsigned NOT NULL, + `message` text NOT NULL, + `private` tinyint(1) unsigned NOT NULL default '1', + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_message`), + KEY `message_order` (`id_order`), + KEY `id_cart` (`id_cart`), + KEY `id_customer` (`id_customer`), + KEY `id_employee` (`id_employee`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_message_readed` ( + `id_message` int(10) unsigned NOT NULL, + `id_employee` int(10) unsigned NOT NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_message`,`id_employee`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_meta` ( + `id_meta` int(10) unsigned NOT NULL auto_increment, + `page` varchar(64) NOT NULL, + PRIMARY KEY (`id_meta`), + KEY `meta_name` (`page`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_meta_lang` ( + `id_meta` int(10) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_lang` int(10) unsigned NOT NULL, + `title` varchar(128) default NULL, + `description` varchar(255) default NULL, + `keywords` varchar(255) default NULL, + `url_rewrite` varchar(254) NOT NULL, + PRIMARY KEY (`id_meta`, `id_shop`, `id_lang`), + KEY `id_shop` (`id_shop`), + KEY `id_lang` (`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module` ( + `id_module` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `active` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_module`), + KEY `name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module_country` ( + `id_module` int(10) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_country` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_module`,`id_shop`, `id_country`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module_currency` ( + `id_module` int(10) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_currency` int(11) NOT NULL, + PRIMARY KEY (`id_module`,`id_shop`, `id_currency`), + KEY `id_module` (`id_module`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module_group` ( + `id_module` int(10) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_group` int(11) unsigned NOT NULL, + PRIMARY KEY (`id_module`,`id_shop`, `id_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_operating_system` ( + `id_operating_system` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) default NULL, + PRIMARY KEY (`id_operating_system`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_orders` ( + `id_order` int(10) unsigned NOT NULL auto_increment, + `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_carrier` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `id_customer` int(10) unsigned NOT NULL, + `id_cart` int(10) unsigned NOT NULL, + `id_currency` int(10) unsigned NOT NULL, + `id_address_delivery` int(10) unsigned NOT NULL, + `id_address_invoice` int(10) unsigned NOT NULL, + `secure_key` varchar(32) NOT NULL default '-1', + `payment` varchar(255) NOT NULL, + `conversion_rate` decimal(13,6) NOT NULL default 1, + `module` varchar(255) default NULL, + `recyclable` tinyint(1) unsigned NOT NULL default '0', + `gift` tinyint(1) unsigned NOT NULL default '0', + `gift_message` text, + `shipping_number` varchar(32) default NULL, + `total_discounts` decimal(17,2) NOT NULL default '0.00', + `total_paid` decimal(17,2) NOT NULL default '0.00', + `total_paid_real` decimal(17,2) NOT NULL default '0.00', + `total_products` decimal(17,2) NOT NULL default '0.00', + `total_products_wt` DECIMAL(17, 2) NOT NULL default '0.00', + `total_shipping` decimal(17,2) NOT NULL default '0.00', + `carrier_tax_rate` DECIMAL(10, 3) NOT NULL default '0.00', + `total_wrapping` decimal(17,2) NOT NULL default '0.00', + `invoice_number` int(10) unsigned NOT NULL default '0', + `delivery_number` int(10) unsigned NOT NULL default '0', + `invoice_date` datetime NOT NULL, + `delivery_date` datetime NOT NULL, + `valid` int(1) unsigned NOT NULL default '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_order`), + KEY `id_customer` (`id_customer`), + KEY `id_cart` (`id_cart`), + KEY `invoice_number` (`invoice_number`), + KEY `id_carrier` (`id_carrier`), + KEY `id_lang` (`id_lang`), + KEY `id_currency` (`id_currency`), + KEY `id_address_delivery` (`id_address_delivery`), + KEY `id_address_invoice` (`id_address_invoice`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_shop` (`id_shop`), + INDEX `date_add`(`date_add`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_detail` ( + `id_order_detail` int(10) unsigned NOT NULL auto_increment, + `id_order` int(10) unsigned NOT NULL, + `product_id` int(10) unsigned NOT NULL, + `product_attribute_id` int(10) unsigned default NULL, + `product_name` varchar(255) NOT NULL, + `product_quantity` int(10) unsigned NOT NULL default '0', + `product_quantity_in_stock` int(10) NOT NULL default 0, + `product_quantity_refunded` int(10) unsigned NOT NULL default '0', + `product_quantity_return` int(10) unsigned NOT NULL default '0', + `product_quantity_reinjected` int(10) unsigned NOT NULL default 0, + `product_price` decimal(20,6) NOT NULL default '0.000000', + `reduction_percent` DECIMAL(10, 2) NOT NULL default '0.00', + `reduction_amount` DECIMAL(20, 6) NOT NULL default '0.000000', + `group_reduction` DECIMAL(10, 2) NOT NULL default '0.000000', + `product_quantity_discount` decimal(20,6) NOT NULL default '0.000000', + `product_ean13` varchar(13) default NULL, + `product_upc` varchar(12) default NULL, + `product_reference` varchar(32) default NULL, + `product_supplier_reference` varchar(32) default NULL, + `product_weight` float NOT NULL, + `tax_name` varchar(16) NOT NULL, + `tax_rate` DECIMAL(10, 3) NOT NULL DEFAULT '0.000', + `ecotax` decimal(21,6) NOT NULL default '0.00', + `ecotax_tax_rate` DECIMAL(5,3) NOT NULL DEFAULT '0.000', + `discount_quantity_applied` TINYINT(1) NOT NULL DEFAULT 0, + `download_hash` varchar(255) default NULL, + `download_nb` int(10) unsigned default '0', + `download_deadline` datetime default '0000-00-00 00:00:00', + PRIMARY KEY (`id_order_detail`), + KEY `order_detail_order` (`id_order`), + KEY `product_id` (`product_id`), + KEY `product_attribute_id` (`product_attribute_id`), + KEY `id_order_id_order_detail` (`id_order`, `id_order_detail`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_discount` ( + `id_order_discount` int(10) unsigned NOT NULL auto_increment, + `id_order` int(10) unsigned NOT NULL, + `id_discount` int(10) unsigned NOT NULL, + `name` varchar(32) NOT NULL, + `value` decimal(17,2) NOT NULL default '0.00', + PRIMARY KEY (`id_order_discount`), + KEY `order_discount_order` (`id_order`), + KEY `id_discount` (`id_discount`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_history` ( + `id_order_history` int(10) unsigned NOT NULL auto_increment, + `id_employee` int(10) unsigned NOT NULL, + `id_order` int(10) unsigned NOT NULL, + `id_order_state` int(10) unsigned NOT NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_order_history`), + KEY `order_history_order` (`id_order`), + KEY `id_employee` (`id_employee`), + KEY `id_order_state` (`id_order_state`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_message` ( + `id_order_message` int(10) unsigned NOT NULL auto_increment, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_order_message`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_message_lang` ( + `id_order_message` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + `message` text NOT NULL, + PRIMARY KEY (`id_order_message`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_return` ( + `id_order_return` int(10) unsigned NOT NULL auto_increment, + `id_customer` int(10) unsigned NOT NULL, + `id_order` int(10) unsigned NOT NULL, + `state` tinyint(1) unsigned NOT NULL default '1', + `question` text NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_order_return`), + KEY `order_return_customer` (`id_customer`), + KEY `id_order` (`id_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_return_detail` ( + `id_order_return` int(10) unsigned NOT NULL, + `id_order_detail` int(10) unsigned NOT NULL, + `id_customization` int(10) unsigned NOT NULL default '0', + `product_quantity` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`id_order_return`,`id_order_detail`,`id_customization`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_return_state` ( + `id_order_return_state` int(10) unsigned NOT NULL auto_increment, + `color` varchar(32) default NULL, + PRIMARY KEY (`id_order_return_state`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_return_state_lang` ( + `id_order_return_state` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(64) NOT NULL, + UNIQUE KEY `order_state_lang_index` (`id_order_return_state`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_slip` ( + `id_order_slip` int(10) unsigned NOT NULL auto_increment, + `conversion_rate` decimal(13,6) NOT NULL default 1, + `id_customer` int(10) unsigned NOT NULL, + `id_order` int(10) unsigned NOT NULL, + `shipping_cost` tinyint(3) unsigned NOT NULL default '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_order_slip`), + KEY `order_slip_customer` (`id_customer`), + KEY `id_order` (`id_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_slip_detail` ( + `id_order_slip` int(10) unsigned NOT NULL, + `id_order_detail` int(10) unsigned NOT NULL, + `product_quantity` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`id_order_slip`,`id_order_detail`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_state` ( + `id_order_state` int(10) unsigned NOT NULL auto_increment, + `invoice` tinyint(1) unsigned default '0', + `send_email` tinyint(1) unsigned NOT NULL default '0', + `color` varchar(32) default NULL, + `unremovable` tinyint(1) unsigned NOT NULL, + `hidden` tinyint(1) UNSIGNED NOT NULL default '0', + `logable` tinyint(1) NOT NULL default '0', + `delivery` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_order_state`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_order_state_lang` ( + `id_order_state` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(64) NOT NULL, + `template` varchar(64) NOT NULL, + UNIQUE KEY `order_state_lang_index` (`id_order_state`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_pack` ( + `id_product_pack` int(10) unsigned NOT NULL, + `id_product_item` int(10) unsigned NOT NULL, + `quantity` int(10) unsigned NOT NULL DEFAULT 1, + PRIMARY KEY (`id_product_pack`,`id_product_item`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_page` ( + `id_page` int(10) unsigned NOT NULL auto_increment, + `id_page_type` int(10) unsigned NOT NULL, + `id_object` int(10) unsigned default NULL, + PRIMARY KEY (`id_page`), + KEY `id_page_type` (`id_page_type`), + KEY `id_object` (`id_object`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_page_type` ( + `id_page_type` int(10) unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL, + PRIMARY KEY (`id_page_type`), + KEY `name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_page_viewed` ( + `id_page` int(10) unsigned NOT NULL, + `id_group_shop` INT UNSIGNED NOT NULL DEFAULT '1', + `id_shop` INT UNSIGNED NOT NULL DEFAULT '1', + `id_date_range` int(10) unsigned NOT NULL, + `counter` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_page`, `id_date_range`, `id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_payment_cc` ( + `id_payment_cc` INT NOT NULL auto_increment, + `id_order` INT UNSIGNED NULL, + `id_currency` INT UNSIGNED NOT NULL, + `amount` DECIMAL(10,2) NOT NULL, + `transaction_id` VARCHAR(254) NULL, + `card_number` VARCHAR(254) NULL, + `card_brand` VARCHAR(254) NULL, + `card_expiration` CHAR(7) NULL, + `card_holder` VARCHAR(254) NULL, + `date_add` DATETIME NOT NULL, + PRIMARY KEY (`id_payment_cc`), + KEY `id_order` (`id_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product` ( + `id_product` int(10) unsigned NOT NULL auto_increment, + `id_supplier` int(10) unsigned default NULL, + `id_manufacturer` int(10) unsigned default NULL, + `id_tax_rules_group` int(10) unsigned NOT NULL, + `id_category_default` int(10) unsigned default NULL, + `id_color_default` int(10) unsigned default NULL, + `on_sale` tinyint(1) unsigned NOT NULL default '0', + `online_only` tinyint(1) unsigned NOT NULL default '0', + `ean13` varchar(13) default NULL, + `upc` varchar(12) default NULL, + `ecotax` decimal(17,6) NOT NULL default '0.00', + `quantity` int(10) NOT NULL default '0', + `minimal_quantity` int(10) unsigned NOT NULL default '1', + `price` decimal(20,6) NOT NULL default '0.000000', + `wholesale_price` decimal(20,6) NOT NULL default '0.000000', + `unity` varchar(255) default NULL, + `unit_price_ratio` decimal(20,6) NOT NULL default '0.000000', + `additional_shipping_cost` decimal(20,2) NOT NULL default '0.00', + `reference` varchar(32) default NULL, + `supplier_reference` varchar(32) default NULL, + `location` varchar(64) default NULL, + `width` float NOT NULL default '0', + `height` float NOT NULL default '0', + `depth` float NOT NULL default '0', + `weight` float NOT NULL default '0', + `out_of_stock` int(10) unsigned NOT NULL default '2', + `quantity_discount` tinyint(1) default '0', + `customizable` tinyint(2) NOT NULL default '0', + `uploadable_files` tinyint(4) NOT NULL default '0', + `text_fields` tinyint(4) NOT NULL default '0', + `active` tinyint(1) unsigned NOT NULL default '0', + `available_for_order` tinyint(1) NOT NULL default '1', + `condition` ENUM('new', 'used', 'refurbished') NOT NULL DEFAULT 'new', + `show_price` tinyint(1) NOT NULL default '1', + `indexed` tinyint(1) NOT NULL default '0', + `cache_is_pack` tinyint(1) NOT NULL default '0', + `cache_has_attachments` tinyint(1) NOT NULL default '0', + `cache_default_attribute` int(10) unsigned default NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_product`), + KEY `product_supplier` (`id_supplier`), + KEY `product_manufacturer` (`id_manufacturer`), + KEY `id_category_default` (`id_category_default`), + KEY `id_color_default` (`id_color_default`), + KEY `date_add` (`date_add`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_attribute` ( + `id_product_attribute` int(10) unsigned NOT NULL auto_increment, + `id_product` int(10) unsigned NOT NULL, + `reference` varchar(32) default NULL, + `supplier_reference` varchar(32) default NULL, + `location` varchar(64) default NULL, + `ean13` varchar(13) default NULL, + `upc` varchar(12) default NULL, + `wholesale_price` decimal(20,6) NOT NULL default '0.000000', + `price` decimal(20,6) NOT NULL default '0.000000', + `ecotax` decimal(17,6) NOT NULL default '0.00', + `quantity` int(10) NOT NULL default '0', + `weight` float NOT NULL default '0', + `unit_price_impact` decimal(17,2) NOT NULL default '0.00', + `default_on` tinyint(1) unsigned NOT NULL default '0', + `minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`id_product_attribute`), + KEY `product_attribute_product` (`id_product`), + KEY `reference` (`reference`), + KEY `supplier_reference` (`supplier_reference`), + KEY `product_default` (`id_product`,`default_on`), + KEY `id_product_id_product_attribute` (`id_product_attribute` , `id_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_attribute_combination` ( + `id_attribute` int(10) unsigned NOT NULL, + `id_product_attribute` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_attribute`,`id_product_attribute`), + KEY `id_product_attribute` (`id_product_attribute`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_attribute_image` ( + `id_product_attribute` int(10) unsigned NOT NULL, + `id_image` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_product_attribute`,`id_image`), + KEY `id_image` (`id_image`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_download` ( + `id_product_download` int(10) unsigned NOT NULL auto_increment, + `id_product` int(10) unsigned NOT NULL, + `display_filename` varchar(255) default NULL, + `physically_filename` varchar(255) default NULL, + `date_deposit` datetime NOT NULL, + `date_expiration` datetime default NULL, + `nb_days_accessible` int(10) unsigned default NULL, + `nb_downloadable` int(10) unsigned default '1', + `active` tinyint(1) unsigned NOT NULL default '1', + PRIMARY KEY (`id_product_download`), + KEY `product_active` (`id_product`,`active`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_lang` ( + `id_product` int(10) unsigned NOT NULL, + `id_shop` INT( 11 ) UNSIGNED NOT NULL DEFAULT '1', + `id_lang` int(10) unsigned NOT NULL, + `description` text, + `description_short` text, + `link_rewrite` varchar(128) NOT NULL, + `meta_description` varchar(255) default NULL, + `meta_keywords` varchar(255) default NULL, + `meta_title` varchar(128) default NULL, + `name` varchar(128) NOT NULL, + `available_now` varchar(255) default NULL, + `available_later` varchar(255) default NULL, + UNIQUE KEY `product_lang_index` (`id_product`, `id_shop` , `id_lang`), + KEY `id_lang` (`id_lang`), + KEY `name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_sale` ( + `id_product` int(10) unsigned NOT NULL, + `quantity` int(10) unsigned NOT NULL default '0', + `sale_nbr` int(10) unsigned NOT NULL default '0', + `date_upd` date NOT NULL, + PRIMARY KEY (`id_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_tag` ( + `id_product` int(10) unsigned NOT NULL, + `id_tag` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_product`,`id_tag`), + KEY `id_tag` (`id_tag`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_profile` ( + `id_profile` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id_profile`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_profile_lang` ( + `id_lang` int(10) unsigned NOT NULL, + `id_profile` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + PRIMARY KEY (`id_profile`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_quick_access` ( + `id_quick_access` int(10) unsigned NOT NULL auto_increment, + `new_window` tinyint(1) NOT NULL default '0', + `link` varchar(128) NOT NULL, + PRIMARY KEY (`id_quick_access`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_quick_access_lang` ( + `id_quick_access` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) NOT NULL, + PRIMARY KEY (`id_quick_access`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_range_price` ( + `id_range_price` int(10) unsigned NOT NULL auto_increment, + `id_carrier` int(10) unsigned NOT NULL, + `delimiter1` decimal(20,6) NOT NULL, + `delimiter2` decimal(20,6) NOT NULL, + PRIMARY KEY (`id_range_price`), + UNIQUE KEY `id_carrier` (`id_carrier`,`delimiter1`,`delimiter2`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_range_weight` ( + `id_range_weight` int(10) unsigned NOT NULL auto_increment, + `id_carrier` int(10) unsigned NOT NULL, + `delimiter1` decimal(20,6) NOT NULL, + `delimiter2` decimal(20,6) NOT NULL, + PRIMARY KEY (`id_range_weight`), + UNIQUE KEY `id_carrier` (`id_carrier`,`delimiter1`,`delimiter2`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_referrer` ( + `id_referrer` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `passwd` varchar(32) default NULL, + `http_referer_regexp` varchar(64) default NULL, + `http_referer_like` varchar(64) default NULL, + `request_uri_regexp` varchar(64) default NULL, + `request_uri_like` varchar(64) default NULL, + `http_referer_regexp_not` varchar(64) default NULL, + `http_referer_like_not` varchar(64) default NULL, + `request_uri_regexp_not` varchar(64) default NULL, + `request_uri_like_not` varchar(64) default NULL, + `base_fee` decimal(5,2) NOT NULL default '0.00', + `percent_fee` decimal(5,2) NOT NULL default '0.00', + `click_fee` decimal(5,2) NOT NULL default '0.00', + `cache_visitors` int(11) default NULL, + `cache_visits` int(11) default NULL, + `cache_pages` int(11) default NULL, + `cache_registrations` int(11) default NULL, + `cache_orders` int(11) default NULL, + `cache_sales` decimal(17,2) default NULL, + `cache_reg_rate` decimal(5,4) default NULL, + `cache_order_rate` decimal(5,4) default NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_referrer`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_referrer_cache` ( + `id_connections_source` int(11) unsigned NOT NULL, + `id_referrer` int(11) unsigned NOT NULL, + PRIMARY KEY (`id_connections_source`, `id_referrer`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_scene` ( + `id_scene` int(10) unsigned NOT NULL auto_increment, + `active` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`id_scene`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_scene_category` ( + `id_scene` int(10) unsigned NOT NULL, + `id_category` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_scene`,`id_category`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_scene_lang` ( + `id_scene` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(100) NOT NULL, + PRIMARY KEY (`id_scene`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_scene_products` ( + `id_scene` int(10) unsigned NOT NULL, + `id_product` int(10) unsigned NOT NULL, + `x_axis` int(4) NOT NULL, + `y_axis` int(4) NOT NULL, + `zone_width` int(3) NOT NULL, + `zone_height` int(3) NOT NULL, + PRIMARY KEY (`id_scene`, `id_product`, `x_axis`, `y_axis`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_search_engine` ( + `id_search_engine` int(10) unsigned NOT NULL auto_increment, + `server` varchar(64) NOT NULL, + `getvar` varchar(16) NOT NULL, + PRIMARY KEY (`id_search_engine`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_search_index` ( + `id_product` int(11) unsigned NOT NULL, + `id_word` int(11) unsigned NOT NULL, + `weight` smallint(4) unsigned NOT NULL default 1, + PRIMARY KEY (`id_word`, `id_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_search_word` ( + `id_word` int(10) unsigned NOT NULL auto_increment, + `id_shop` int(11) unsigned NOT NULL default 1, + `id_lang` int(10) unsigned NOT NULL, + `word` varchar(15) NOT NULL, + PRIMARY KEY (`id_word`), + UNIQUE KEY `id_lang` (`id_lang`,`id_shop`, `word`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_specific_price` ( + `id_specific_price` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_product` INT UNSIGNED NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_currency` INT UNSIGNED NOT NULL, + `id_country` INT UNSIGNED NOT NULL, + `id_group` INT UNSIGNED NOT NULL, + `price` DECIMAL(20, 6) NOT NULL, + `from_quantity` SMALLINT UNSIGNED NOT NULL, + `reduction` DECIMAL(20, 6) NOT NULL, + `reduction_type` ENUM('amount', 'percentage') NOT NULL, + `from` DATETIME NOT NULL, + `to` DATETIME NOT NULL, + PRIMARY KEY(`id_specific_price`), + KEY (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `from_quantity`, `from`, `to`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_state` ( + `id_state` int(10) unsigned NOT NULL auto_increment, + `id_country` int(11) unsigned NOT NULL, + `id_zone` int(11) unsigned NOT NULL, + `name` varchar(64) NOT NULL, + `iso_code` char(4) NOT NULL, + `tax_behavior` smallint(1) NOT NULL default '0', + `active` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id_state`), + KEY `id_country` (`id_country`), + KEY `id_zone` (`id_zone`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_subdomain` ( + `id_subdomain` int(10) unsigned NOT NULL auto_increment, + `name` varchar(16) NOT NULL, + PRIMARY KEY (`id_subdomain`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_supplier` ( + `id_supplier` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + `active` tinyint(1) NOT NULL default 0, + PRIMARY KEY (`id_supplier`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_supplier_lang` ( + `id_supplier` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `description` text, + `meta_title` varchar(128) default NULL, + `meta_keywords` varchar(255) default NULL, + `meta_description` varchar(255) default NULL, + PRIMARY KEY (`id_supplier`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tab` ( + `id_tab` int(10) unsigned NOT NULL auto_increment, + `id_parent` int(11) NOT NULL, + `class_name` varchar(64) NOT NULL, + `module` varchar(64) NULL, + `position` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_tab`), + KEY `class_name` (`class_name`), + KEY `id_parent` (`id_parent`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tab_lang` ( + `id_tab` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) default NULL, + PRIMARY KEY (`id_tab`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tag` ( + `id_tag` int(10) unsigned NOT NULL auto_increment, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) NOT NULL, + PRIMARY KEY (`id_tag`), + KEY `tag_name` (`name`), + KEY `id_lang` (`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tax` ( + `id_tax` int(10) unsigned NOT NULL auto_increment, + `rate` DECIMAL(10, 3) NOT NULL, + `active` tinyint(1) unsigned NOT NULL default '1', + PRIMARY KEY (`id_tax`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tax_lang` ( + `id_tax` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) NOT NULL, + UNIQUE KEY `tax_lang_index` (`id_tax`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_timezone ( + id_timezone int(10) unsigned NOT NULL auto_increment, + name VARCHAR(32) NOT NULL, + PRIMARY KEY timezone_index(`id_timezone`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_web_browser` ( + `id_web_browser` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) default NULL, + PRIMARY KEY (`id_web_browser`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_zone` ( + `id_zone` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `active` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id_zone`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_carrier_group` ( + `id_carrier` int(10) unsigned NOT NULL, + `id_group` int(10) unsigned NOT NULL, + UNIQUE KEY `id_carrier` (`id_carrier`,`id_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +CREATE TABLE `PREFIX_stock_mvt` ( + `id_stock_mvt` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_stock` int(11) unsigned NOT NULL, + `id_order` int(11) unsigned DEFAULT NULL, + `id_stock_mvt_reason` int(11) unsigned NOT NULL, + `id_employee` int(11) unsigned NOT NULL, + `quantity` int(11) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_stock_mvt`), + KEY `id_order` (`id_order`), + KEY `id_stock` (`id_stock`), + KEY `id_stock_mvt_reason` (`id_stock_mvt_reason`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_stock_mvt_reason` ( + `id_stock_mvt_reason` int(11) NOT NULL AUTO_INCREMENT, + `sign` tinyint(1) NOT NULL DEFAULT 1, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_stock_mvt_reason`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +CREATE TABLE `PREFIX_stock_mvt_reason_lang` ( + `id_stock_mvt_reason` int(11) NOT NULL, + `id_lang` int(11) NOT NULL, + `name` varchar(255) CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`id_stock_mvt_reason`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_store` ( + `id_store` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_country` int(10) unsigned NOT NULL, + `id_state` int(10) unsigned DEFAULT NULL, + `name` varchar(128) NOT NULL, + `address1` varchar(128) NOT NULL, + `address2` varchar(128) DEFAULT NULL, + `city` varchar(64) NOT NULL, + `postcode` varchar(12) NOT NULL, + `latitude` float(10,6) DEFAULT NULL, + `longitude` float(10,6) DEFAULT NULL, + `hours` varchar(254) DEFAULT NULL, + `phone` varchar(16) DEFAULT NULL, + `fax` varchar(16) DEFAULT NULL, + `email` varchar(128) DEFAULT NULL, + `note` text, + `active` tinyint(1) unsigned NOT NULL DEFAULT '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_store`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_webservice_account` ( + `id_webservice_account` int(11) NOT NULL AUTO_INCREMENT, + `key` varchar(32) NOT NULL, + `description` text NULL, + `class_name` VARCHAR( 50 ) NOT NULL DEFAULT 'WebserviceRequest', + `is_module` TINYINT( 2 ) NOT NULL DEFAULT '0', + `module_name` VARCHAR( 50 ) NULL DEFAULT NULL, + `active` tinyint(2) NOT NULL, + PRIMARY KEY (`id_webservice_account`), + KEY `key` (`key`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_webservice_permission` ( + `id_webservice_permission` int(11) NOT NULL AUTO_INCREMENT, + `resource` varchar(50) NOT NULL, + `method` enum('GET','POST','PUT','DELETE','HEAD') NOT NULL, + `id_webservice_account` int(11) NOT NULL, + PRIMARY KEY (`id_webservice_permission`), + UNIQUE KEY `resource_2` (`resource`,`method`,`id_webservice_account`), + KEY `resource` (`resource`), + KEY `method` (`method`), + KEY `id_webservice_account` (`id_webservice_account`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_required_field` ( + `id_required_field` int(11) NOT NULL AUTO_INCREMENT, + `object_name` varchar(32) NOT NULL, + `field_name` varchar(32) NOT NULL, + PRIMARY KEY (`id_required_field`), + KEY `object_name` (`object_name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_memcached_servers` ( +`id_memcached_server` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , +`ip` VARCHAR( 254 ) NOT NULL , +`port` INT(11) UNSIGNED NOT NULL , +`weight` INT(11) UNSIGNED NOT NULL +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_country_tax` ( + `id_product` int(11) NOT NULL, + `id_country` int(11) NOT NULL, + `id_tax` int(11) NOT NULL, + UNIQUE KEY `id_product` (`id_product`,`id_country`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +CREATE TABLE `PREFIX_tax_rule` ( + `id_tax_rule` int(11) NOT NULL AUTO_INCREMENT, + `id_tax_rules_group` int(11) NOT NULL, + `id_country` int(11) NOT NULL, + `id_state` int(11) NOT NULL, + `id_county` int(11) NOT NULL, + `id_tax` int(11) NOT NULL, + `state_behavior` int(11) NOT NULL, + `county_behavior` int(11) NOT NULL, + PRIMARY KEY (`id_tax_rule`), + KEY `id_tax_rules_group` (`id_tax_rules_group`), + KEY `id_tax` (`id_tax`), + UNIQUE KEY `tax_rule` (`id_tax_rules_group`, `id_country`, `id_state`, `id_county`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tax_rules_group` ( +`id_tax_rules_group` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , +`name` VARCHAR( 50 ) NOT NULL , +`active` INT NOT NULL +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_help_access` ( + `id_help_access` int(11) NOT NULL AUTO_INCREMENT, + `label` varchar(45) NOT NULL, + `version` varchar(8) NOT NULL, + PRIMARY KEY (`id_help_access`), + UNIQUE KEY `label` (`label`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_specific_price_priority` ( + `id_specific_price_priority` INT NOT NULL AUTO_INCREMENT , + `id_product` INT NOT NULL , + `priority` VARCHAR( 80 ) NOT NULL , + PRIMARY KEY ( `id_specific_price_priority` , `id_product` ) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_log` ( + `id_log` int(10) unsigned NOT NULL AUTO_INCREMENT, + `severity` tinyint(1) NOT NULL, + `error_code` int(11) DEFAULT NULL, + `message` text NOT NULL, + `object_type` varchar(32) DEFAULT NULL, + `object_id` int(10) unsigned DEFAULT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_log`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_import_match` ( + `id_import_match` int(10) NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL, + `match` text NOT NULL, + `skip` int(2) NOT NULL, + PRIMARY KEY (`id_import_match`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +CREATE TABLE `PREFIX_county` ( + `id_county` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(64) NOT NULL, + `id_state` int(11) NOT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id_county`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 ; + + +CREATE TABLE `PREFIX_county_zip_code` ( + `id_county` INT NOT NULL , + `from_zip_code` INT NOT NULL , + `to_zip_code` INT NOT NULL , + PRIMARY KEY ( `id_county` , `from_zip_code` , `to_zip_code` ) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_address_format` ( + `id_country` int(10) unsigned NOT NULL, + `format` varchar(255) NOT NULL DEFAULT '', + KEY `country` (`id_country`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_group_shop` ( + `id_group_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(64) CHARACTER SET utf8 NOT NULL, + `share_datas` TINYINT(1) NOT NULL, + `share_stock` TINYINT(1) NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_shop` ( + `id_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_group_shop` int(11) unsigned NOT NULL, + `name` varchar(64) CHARACTER SET utf8 NOT NULL, + `id_category` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_theme` INT(1) UNSIGNED NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id_shop`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_category` (`id_category`), + KEY `id_theme` (`id_theme`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_shop_url` ( + `id_shop_url` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_shop` int(11) unsigned NOT NULL, + `domain` varchar(255) NOT NULL, + `domain_ssl` varchar(255) NOT NULL, + `uri` varchar(64) NOT NULL, + `main` TINYINT(1) NOT NULL, + `active` TINYINT(1) NOT NULL, + PRIMARY KEY (`id_shop_url`), + KEY `id_shop` (`id_shop`), + UNIQUE KEY `shop_url` (`domain`, `uri`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_theme` ( + `id_theme` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(64) NOT NULL, + PRIMARY KEY (`id_theme`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_theme_specific` ( + `id_theme` int(11) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL, + `entity` int(11) unsigned NOT NULL, + `id_object` int(11) unsigned NOT NULL, + PRIMARY KEY (`id_theme`,`id_shop`, `entity`,`id_object`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_stock` ( +`id_stock` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT, +`id_product` INT( 11 ) UNSIGNED NOT NULL, +`id_product_attribute` INT( 11 ) UNSIGNED NOT NULL, +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT(11) UNSIGNED NOT NULL, +`quantity` INT(11) NOT NULL, + PRIMARY KEY (`id_stock`), + KEY `id_product` (`id_product`), + KEY `id_product_attribute` (`id_product_attribute`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_country_shop` ( +`id_country` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_country`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_carrier_shop` ( +`id_carrier` INT( 11 ) UNSIGNED NOT NULL , +`id_shop` INT( 11 ) UNSIGNED NOT NULL , +PRIMARY KEY (`id_carrier`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_shop` ( +`id_cms` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_cms`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_lang_shop` ( +`id_lang` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_lang`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_currency_shop` ( +`id_currency` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_currency`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_contact_shop` ( + `id_contact` INT(11) UNSIGNED NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL, + PRIMARY KEY (`id_contact`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_image_shop` ( +`id_image` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_image`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute_group_shop` ( +`id_attribute` INT(11) UNSIGNED NOT NULL, +`id_group_shop` INT(11) UNSIGNED NOT NULL, + PRIMARY KEY (`id_attribute`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_feature_group_shop` ( +`id_feature` INT(11) UNSIGNED NOT NULL, +`id_group_shop` INT(11) UNSIGNED NOT NULL , + PRIMARY KEY (`id_feature`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_group_group_shop` ( +`id_group` INT( 11 ) UNSIGNED NOT NULL, +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_group`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attribute_group_group_shop` ( +`id_attribute_group` INT( 11 ) UNSIGNED NOT NULL , +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_attribute_group`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tax_rules_group_group_shop` ( + `id_tax_rules_group` INT( 11 ) UNSIGNED NOT NULL, + `id_group_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_tax_rules_group`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_zone_group_shop` ( +`id_zone` INT( 11 ) UNSIGNED NOT NULL , +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_zone`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_manufacturer_group_shop` ( +`id_manufacturer` INT( 11 ) UNSIGNED NOT NULL , +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_manufacturer`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_supplier_group_shop` ( +`id_supplier` INT( 11 ) UNSIGNED NOT NULL, +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_supplier`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_store_shop` ( +`id_store` INT( 11 ) UNSIGNED NOT NULL , +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_store`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_shop` ( +`id_product` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY ( `id_shop` , `id_product` ), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module_shop` ( +`id_module` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_module` , `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_webservice_account_shop` ( +`id_webservice_account` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_webservice_account` , `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; diff --git a/install-dev/sql/db_settings_extends.sql b/install-dev/sql/db_settings_extends.sql new file mode 100644 index 000000000..b71f014d9 --- /dev/null +++ b/install-dev/sql/db_settings_extends.sql @@ -0,0 +1,1142 @@ +SET NAMES 'utf8'; + +/* Carrier */ +INSERT INTO `PREFIX_carrier` (`id_carrier`, `id_tax_rules_group`, `name`, `active`, `deleted`, `shipping_handling`, `is_free`) VALUES (2, 1, 'My carrier', 1, 0, 1, 0); +INSERT INTO `PREFIX_carrier_group` (`id_carrier`, `id_group`) VALUES (2, 1); +INSERT INTO `PREFIX_carrier_shop` (`id_carrier`, `id_shop`) VALUES (2, 1); +INSERT INTO `PREFIX_carrier_lang` (`id_carrier`, `id_lang`, `delay`) VALUES (2, 1, 'Delivery next day!'),(2, 2, 'Livraison le lendemain !'),(2, 3, '¡Entrega día siguiente!'),(2, 4, 'Zustellung am nächsten Tag!'),(2, 5, 'Consegna il giorno dopo!'); +INSERT INTO `PREFIX_carrier_zone` (`id_carrier`, `id_zone`) VALUES (2, 1),(2, 2); + +UPDATE `PREFIX_configuration` SET `value` = '2' WHERE `name` = 'PS_CARRIER_DEFAULT'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('MB_PAY_TO_EMAIL', 'testmerchant@moneybookers.com', NOW(), NOW()), + ('MB_SECRET_WORD', 'mbtest', NOW(), NOW()), + ('MB_HIDE_LOGIN', 1, NOW(), NOW()), + ('MB_ID_LOGO', 1, NOW(), NOW()), + ('MB_ID_LOGO_WALLET', 1, NOW(), NOW()), + ('MB_PARAMETERS', 1, NOW(), NOW()), + ('MB_PARAMETERS_2', 1, NOW(), NOW()), + ('MB_DISPLAY_MODE', 0, NOW(), NOW()), + ('MB_CANCEL_URL', 'http://www.yoursite.com', NOW(), NOW()), + ('MB_LOCAL_METHODS', '2', NOW(), NOW()), + ('MB_INTER_METHODS', '5', NOW(), NOW()), + ('BANK_WIRE_CURRENCIES', '2,1', NOW(), NOW()), + ('CHEQUE_CURRENCIES', '2,1', NOW(), NOW()), + ('PRODUCTS_VIEWED_NBR', '2', NOW(), NOW()), + ('BLOCK_CATEG_DHTML', '1', NOW(), NOW()), + ('BLOCK_CATEG_MAX_DEPTH', '3', NOW(), NOW()), + ('MANUFACTURER_DISPLAY_FORM', '1', NOW(), NOW()), + ('MANUFACTURER_DISPLAY_TEXT', '1', NOW(), NOW()), + ('MANUFACTURER_DISPLAY_TEXT_NB', '5', NOW(), NOW()), + ('NEW_PRODUCTS_NBR', '5', NOW(), NOW()), + ('PS_TOKEN_ENABLE', '1', NOW(), NOW()), + ('PS_STATS_RENDER', 'graphxmlswfcharts', NOW(), NOW()), + ('PS_STATS_OLD_CONNECT_AUTO_CLEAN', 'never', NOW(), NOW()), + ('PS_STATS_GRID_RENDER', 'gridhtml', NOW(), NOW()), + ('BLOCKTAGS_NBR', '10', NOW(), NOW()), + ('CHECKUP_DESCRIPTIONS_LT', '100', NOW(), NOW()), + ('CHECKUP_DESCRIPTIONS_GT', '400', NOW(), NOW()), + ('CHECKUP_IMAGES_LT', '1', NOW(), NOW()), + ('CHECKUP_IMAGES_GT', '2', NOW(), NOW()), + ('CHECKUP_SALES_LT', '1', NOW(), NOW()), + ('CHECKUP_SALES_GT', '2', NOW(), NOW()), + ('CHECKUP_STOCK_LT', '1', NOW(), NOW()), + ('CHECKUP_STOCK_GT', '3', NOW(), NOW()), + ('FOOTER_CMS', '0_3|0_4', NOW(), NOW()), + ('FOOTER_BLOCK_ACTIVATION', '0_3|0_4', NOW(), NOW()), + ('BLOCKADVERT_LINK', 0, NOW(), NOW()), + ('BLOCKSTORE_IMG', 'store.jpg', NOW(), NOW()); + +INSERT INTO `PREFIX_module` (`id_module`, `name`, `active`) VALUES (1, 'homefeatured', 1),(2, 'gsitemap', 1),(3, 'cheque', 1),(4, 'moneybookers', 1),(5, 'editorial', 1), +(6, 'bankwire', 1),(7, 'blockadvertising', 1),(8, 'blockbestsellers', 1),(9, 'blockcart', 1),(10, 'blockcategories', 1),(11, 'blockcurrencies', 1),(12, 'blockcms', 1), +(13, 'blocklanguages', 1),(14, 'blockmanufacturer', 1),(15, 'blockmyaccount', 1),(16, 'blocknewproducts', 1),(17, 'blockpaymentlogo', 1),(18, 'blockpermanentlinks', 1), +(19, 'blocksearch', 1),(20, 'blockspecials', 1),(21, 'blocktags', 1),(22, 'blockuserinfo', 1),(24, 'blockviewed', 1),(25, 'statsdata', 1), +(26, 'statsvisits', 1),(27, 'statssales', 1),(28, 'statsregistrations', 1),(30, 'statspersonalinfos', 1),(31, 'statslive', 1),(32, 'statsequipment', 1),(33, 'statscatalog', 1), +(34, 'graphvisifire', 1),(35, 'graphxmlswfcharts', 1),(36, 'graphgooglechart', 1),(37, 'graphartichow', 1),(39, 'gridhtml', 1),(40, 'statsbestcustomers', 1), +(41, 'statsorigin', 1),(42, 'pagesnotfound', 1),(43, 'sekeywords', 1),(44, 'statsproduct', 1),(45, 'statsbestproducts', 1),(46, 'statsbestcategories', 1), +(47, 'statsbestvouchers', 1),(48, 'statsbestsuppliers', 1),(49, 'statscarrier', 1),(50, 'statsnewsletter', 1),(51, 'statssearch', 1),(52, 'statscheckup', 1),(53, 'statsstock', 1), +(54, 'blockstore', 1),(55, 'statsforecast', 1); + +INSERT INTO `PREFIX_module_shop` (`id_module`, `id_shop`) (SELECT `id_module`, 1 FROM `PREFIX_module`); + + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES + ('myAccountBlock', 'My account block', 'Display extra informations inside the "my account" block', 1); + +INSERT INTO `PREFIX_hook_module` (`id_module`, `id_hook`, `position`) VALUES (3, 1, 1),(6, 1, 2),(4, 1, 3),(4, 4, 3),(8, 2, 1),(3, 4, 1),(6, 4, 2),(9, 6, 1),(16, 6, 2),(8, 6, 3), +(20, 6, 4),(12, 6, 5),(54, 6, 6),(15, 7, 1),(21, 7, 2),(10, 7, 3),(24, 7, 4),(14, 7, 5),(12, 7, 6),(7, 7, 7),(17, 7, 8),(5, 8, 1),(1, 8, 2),(11, 14, 1),(13, 14, 2),(18, 14, 3), +(19, 14, 4),(22, 14, 5),(8, 19, 1),(12, 21, 1),(25, 11, 1),(25, 21, 2),(26, 32, 1),(27, 32, 2),(28, 32, 3),(30, 32, 4),(31, 32, 5),(32, 32, 6),(33, 32, 7),(34, 33, 1), +(35, 33, 2),(36, 33, 3),(37, 33, 4),(39, 37, 1),(40, 32, 8),(41, 32, 9),(42, 32, 10),(43, 32, 11),(42, 14, 6),(43, 14, 7),(44, 32, 12),(45, 32, 13),(46, 32, 15), +(47, 32, 14),(48, 32, 16),(49, 32, 17),(55, 32, 22),(50, 32, 18),(51, 32, 19),(51, 45, 1),(25, 25, 1),(41, 20, 2),(52, 32, 20),(53, 32, 21),(17, 9, 2),(18, 9, 3),(24, 9, 4),(9, 9, 5), +(15, 9, 6),(5, 9, 7),(8, 9, 8),(10, 9, 9),(20, 9, 10),(11, 9, 11),(16, 9, 12),(22, 9, 13),(13, 9, 14),(14, 9, 15),(12, 9, 16),(7, 9, 17),(21, 9, 18),(10, 60, 1),(10, 61, 1),(10, 62, 1), +(54, 9, 19),(10,66,1); + +CREATE TABLE `PREFIX_pagenotfound` ( + `id_pagenotfound` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `id_shop` INTEGER UNSIGNED NOT NULL DEFAULT '1', + `id_group_shop` INTEGER UNSIGNED NOT NULL DEFAULT '1', + `request_uri` VARCHAR(256) NOT NULL, + `http_referer` VARCHAR(256) NOT NULL, + `date_add` DATETIME NOT NULL, + PRIMARY KEY(`id_pagenotfound`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_statssearch` ( + `id_statssearch` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `id_shop` INTEGER UNSIGNED NOT NULL DEFAULT '1', + `id_group_shop` INTEGER UNSIGNED NOT NULL DEFAULT '1', + `keywords` VARCHAR(255) NOT NULL, + `results` INT(6) NOT NULL DEFAULT 0, + `date_add` DATETIME NOT NULL, + PRIMARY KEY(`id_statssearch`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_sekeyword` ( + `id_sekeyword` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `id_shop` INTEGER UNSIGNED NOT NULL DEFAULT '1', + `id_group_shop` INTEGER UNSIGNED NOT NULL DEFAULT '1', + `keyword` VARCHAR(256) NOT NULL, + `date_add` DATETIME NOT NULL, + PRIMARY KEY(`id_sekeyword`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +CREATE TABLE `PREFIX_cms_block` ( + `id_cms_block` int(10) unsigned NOT NULL auto_increment, + `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_cms_category` int(10) unsigned NOT NULL, + `name` varchar(40) NOT NULL, + `location` tinyint(1) unsigned NOT NULL, + `position` int(10) unsigned NOT NULL default '0', + `display_store` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`id_cms_block`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_block_page` ( + `id_cms_block_page` int(10) unsigned NOT NULL auto_increment, + `id_cms_block` int(10) unsigned NOT NULL, + `id_cms` int(10) unsigned NOT NULL, + `is_category` tinyint(1) unsigned NOT NULL, + PRIMARY KEY (`id_cms_block_page`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_block_lang` ( + `id_cms_block` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(40) NOT NULL default '', + PRIMARY KEY (`id_cms_block`, `id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_editorial` ( + `id_editorial` int(10) unsigned NOT NULL auto_increment, + `body_home_logo_link` varchar(255) NOT NULL, + PRIMARY KEY (`id_editorial`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_editorial_lang` ( + `id_editorial` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `body_title` varchar(255) NOT NULL, + `body_subheading` varchar(255) NOT NULL, + `body_paragraph` text NOT NULL, + `body_logo_subheading` varchar(255) NOT NULL, + PRIMARY KEY (`id_editorial`, `id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_editorial` (`id_editorial`, `body_home_logo_link`) VALUES (1, 'http://www.prestashop.com'); +INSERT INTO `PREFIX_editorial_lang` (`id_editorial`, `id_lang`, `body_title`, `body_subheading`, `body_paragraph`, `body_logo_subheading`) VALUES +(1, 1, 'Lorem ipsum dolor sit amet', 'Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua', '

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    ', 'Excepteur sint prestashop cupidatat non proident'), +(1, 2, 'Lorem ipsum dolor sit amet', 'Excepteur sint occaecat cupidatat non proident', '

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    ', 'Lorem ipsum presta shop amet'), +(1, 3, 'Lorem ipsum dolor sit amet', 'Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua', '

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    ', 'Excepteur sint prestashop cupidatat non proident'), +(1, 4, 'Lorem ipsum dolor sit amet', 'Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua', '

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    ', 'Excepteur sint prestashop cupidatat non proident'), +(1, 5, 'Lorem ipsum dolor sit amet', 'Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua', '

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    ', 'Excepteur sint prestashop cupidatat non proident'); + +INSERT INTO `PREFIX_range_price` (`id_range_price`, `id_carrier`, `delimiter1`, `delimiter2`) VALUES (1, 2, 0, 10000); +INSERT INTO `PREFIX_range_weight` (`id_range_weight`, `id_carrier`, `delimiter1`, `delimiter2`) VALUES (1, 2, 0, 10000); +INSERT INTO `PREFIX_delivery` (`id_delivery`, `id_range_price`, `id_range_weight`, `id_carrier`, `id_zone`, `price`) VALUES +(1, NULL, 1, 2, 1, 5.00),(2, NULL, 1, 2, 2, 5.00),(4, 1, NULL, 2, 1, 5.00),(5, 1, NULL, 2, 2, 5.00); + +INSERT INTO `PREFIX_customer_group` (`id_customer`, `id_group`) VALUES (1, 1); +INSERT INTO `PREFIX_category_group` (`id_category`, `id_group`) VALUES (2, 1),(3, 1),(4, 1); + +INSERT INTO `PREFIX_customer` (`id_customer`, `id_gender`, `id_default_group`, `secure_key`, `email`, `passwd`, `birthday`, `lastname`, `newsletter`, `optin`, `firstname`, `active`, `is_guest`, `date_add`, `date_upd`) + VALUES (1, 1, 1, '47ce86627c1f3c792a80773c5d2deaf8', 'pub@prestashop.com', 'ad807bdf0426766c05c64041124d30ce', '1970-01-15', 'DOE', 1, 1, 'John', 1, 0, NOW(), NOW()); +INSERT INTO `PREFIX_connections` (`id_connections`, `id_guest`, `id_page`, `ip_address`, `date_add`, `http_referer`) + VALUES (1, 1, 1, '2130706433', NOW(), 'http://www.prestashop.com'); +INSERT INTO `PREFIX_guest` (`id_guest`, `id_operating_system`, `id_web_browser`, `id_customer`, `javascript`, `screen_resolution_x`, `screen_resolution_y`, `screen_color`, `sun_java`, `adobe_flash`, `adobe_director`, `apple_quicktime`, `real_player`, `windows_media`, `accept_language`) + VALUES (1, 1, 3, 1, 1, 1680, 1050, 32, 1, 1, 0, 1, 1, 0, 'en-us'); + +INSERT INTO `PREFIX_cart` (`id_cart`, `id_carrier`, `id_lang`, `id_address_delivery`, `id_address_invoice`, `id_currency`, `id_customer`, `id_guest`, `recyclable`, `gift`, `date_add`, `date_upd`) + VALUES (1, 2, 2, 6, 6, 1, 1, 1, 1, 0, NOW(), NOW()); +INSERT INTO `PREFIX_cart_product` (`id_cart`, `id_product`, `id_product_attribute`, `quantity`, `date_add`) VALUES (1, 7, 23, 1, NOW()); +INSERT INTO `PREFIX_cart_product` (`id_cart`, `id_product`, `id_product_attribute`, `quantity`, `date_add`) VALUES (1, 9, 0, 1, NOW()); + +INSERT INTO `PREFIX_orders` (`id_order`, `id_carrier`, `id_lang`, `id_customer`, `id_cart`, `id_currency`, `id_address_delivery`, `id_address_invoice`, `secure_key`, `payment`, `module`, `recyclable`, `gift`, `gift_message`, `shipping_number`, `total_discounts`, `total_paid`, `total_paid_real`, `total_products`, `total_products_wt`, `total_shipping`, `total_wrapping`, `invoice_number`, `delivery_number`, `invoice_date`, `delivery_date`, `date_add`, `date_upd`) + VALUES (1, 2, 2, 1, 1, 1, 2, 2, '47ce86627c1f3c792a80773c5d2deaf8', 'Chèque', 'cheque', 0, 0, '', '', '0.00', '625.98', '625.98', '516.72', '618.00', '7.98', '0.00', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NOW(), NOW()); +INSERT INTO `PREFIX_order_detail` (`id_order_detail`, `id_order`, `product_id`, `product_attribute_id`, `product_name`, `product_quantity`, `product_quantity_return`, `product_price`, `product_quantity_discount`, `product_ean13`, `product_reference`, `product_supplier_reference`, `product_weight`, `tax_name`, `tax_rate`, `ecotax`, `download_hash`, `download_nb`, `download_deadline`) + VALUES (1, 1, 7, 23, 'iPod touch - Capacité: 32Go', 1, 0, '392.140500', '0.000000', NULL, NULL, NULL, 0, 'TVA 19.6%', '19.60', '0.00', '', 0, '0000-00-00 00:00:00'); +INSERT INTO `PREFIX_order_detail` (`id_order_detail`, `id_order`, `product_id`, `product_attribute_id`, `product_name`, `product_quantity`, `product_quantity_return`, `product_price`, `product_quantity_discount`, `product_ean13`, `product_reference`, `product_supplier_reference`, `product_weight`, `tax_name`, `tax_rate`, `ecotax`, `download_hash`, `download_nb`, `download_deadline`) + VALUES (2, 1, 9, 0, 'Écouteurs à isolation sonore Shure SE210', 1, 0, '124.581900', '0.000000', NULL, NULL, NULL, 0, 'TVA 19.6%', '19.60', '0.00', '', 0, '0000-00-00 00:00:00'); +INSERT INTO `PREFIX_order_history` (`id_order_history`, `id_employee`, `id_order`, `id_order_state`, `date_add`) VALUES (1, 0, 1, 1, NOW()); + +INSERT INTO `PREFIX_manufacturer` (`id_manufacturer`, `name`, `date_add`, `date_upd`, `active`) VALUES (1, 'Apple Computer, Inc', NOW(), NOW(), 1); +INSERT INTO `PREFIX_manufacturer` (`id_manufacturer`, `name`, `date_add`, `date_upd`, `active`) VALUES(2, 'Shure Incorporated', NOW(), NOW(), 1); + +INSERT INTO `PREFIX_manufacturer_group_shop` (`id_manufacturer`, `id_group_shop`) (SELECT `id_manufacturer`, 1 FROM `PREFIX_manufacturer`); + +INSERT INTO `PREFIX_manufacturer_lang` (`id_manufacturer`, `id_lang`, `description`, `short_description`, `meta_title`, `meta_keywords`, `meta_description`) VALUES +(1, 1, '', '', '', '', ''), +(1, 2, '', '', '', '', ''), +(1, 3, '', '', '', '', ''), +(1, 4, '', '', '', '', ''), +(1, 5, '', '', '', '', ''); + +INSERT INTO `PREFIX_address` (`id_address`, `id_country`, `id_state`, `id_customer`, `id_manufacturer`, `id_supplier`, `alias`, `lastname`, `firstname`, `address1`, `postcode`, `city`, `phone`, `date_add`, `date_upd`, `active`, `deleted`) + VALUES (1, 21, 5, 0, 1, 0, 'manufacturer', 'JOBS', 'STEVE', '1 Infinite Loop', '95014', 'Cupertino', '(800) 275-2273', NOW(), NOW(), 1, 0); +INSERT INTO `PREFIX_address` (`id_address`, `id_country`, `id_state`, `id_customer`, `id_manufacturer`, `id_supplier`, `alias`, `company`, `lastname`, `firstname`, `address1`, `address2`, `postcode`, `city`, `phone`, `date_add`, `date_upd`, `active`, `deleted`) + VALUES (2, 8, 0, 1, 0, 0, 'Mon adresse', 'My Company', 'DOE', 'John', '16, Main street', '2nd floor', '75000', 'Paris ', '0102030405', NOW(), NOW(), 1, 0); + +INSERT INTO `PREFIX_supplier` (`id_supplier`, `name`, `date_add`, `date_upd`, `active`) VALUES (1, 'AppleStore', NOW(), NOW(), 1); +INSERT INTO `PREFIX_supplier` (`id_supplier`, `name`, `date_add`, `date_upd`, `active`) VALUES (2, 'Shure Online Store', NOW(), NOW(), 1); + +INSERT INTO `PREFIX_supplier_group_shop` (`id_supplier`, `id_group_shop`) (SELECT `id_supplier`, 1 FROM `PREFIX_supplier`); + +INSERT INTO `PREFIX_supplier_lang` (`id_supplier`, `id_lang`, `description`, `meta_title`, `meta_keywords`, `meta_description`) VALUES +(1, 1, '', '', '', ''), +(1, 2, '', '', '', ''), +(1, 3, '', '', '', ''), +(1, 4, '', '', '', ''), +(1, 5, '', '', '', ''); + +INSERT INTO `PREFIX_product` (`id_product`, `indexed`, `id_supplier`, `id_manufacturer`, `id_tax_rules_group`, `id_category_default`, `id_color_default`, `on_sale`, `online_only`, `ean13`, `ecotax`, `quantity`, `price`, `wholesale_price`, `reference`, `supplier_reference`, `weight`, `out_of_stock`, `quantity_discount`, `customizable`, `uploadable_files`, `text_fields`, `active`, `date_add`, `date_upd`) VALUES +(1, 1, 1, 1, 1, 2, 2, 0, 0, '0', 0.00, 800, 124.581940, 70.000000, '', '', 0.5, 2, 0, 0, 0, 0, 1, NOW(), NOW()), +(2, 1, 1, 1, 1, 2, 0, 0, 0, '0', 0.00, 100, 66.053500, 33.000000, '', '', 0, 2, 0, 0, 0, 0, 1, NOW(), NOW()), +(5, 1, 1, 1, 1, 4, 0, 0, 0, '0', 0.00, 274, 1504.180602, 1000.000000, '', NULL, 1.36, 2, 0, 0, 0, 0, 1, NOW(), NOW()), +(6, 1, 1, 1, 1, 4, 0, 0, 0, '0', 0.00, 250, 1170.568561, 0.000000, '', NULL, 0.75, 2, 0, 0, 0, 0, 1, NOW(), NOW()), +(7, 1, 0, 0, 1, 2, 0, 0, 0, '', 0.00, 180, 241.638796, 200.000000, '', NULL, 0, 2, 0, 0, 0, 0, 1, NOW(), NOW()), +(8, 1, 0, 0, 1, 3, 0, 0, 1, '', 0.00, 1, 25.041806, 0.000000, '', NULL, 0, 2, 0, 0, 0, 0, 1, NOW(), NOW()), +(9, 1, 2, 2, 1, 3, 0, 0, 1, '', 0.00, 1, 124.581940, 0.000000, '', NULL, 0, 2, 0, 0, 0, 0, 1, NOW(), NOW()); + +INSERT INTO `PREFIX_product_shop` (`id_product`, `id_shop`) (SELECT `id_product`, 1 FROM `PREFIX_product`); + +INSERT INTO `PREFIX_product_lang` (`id_product`, `id_lang`, `description`, `description_short`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `name`, `available_now`, `available_later`) VALUES +(1, 1, '

    Curved ahead of the curve.

    \r\n

    For those about to rock, we give you nine amazing colors. But that''s only part of the story. Feel the curved, all-aluminum and glass design and you won''t want to put iPod nano down.

    \r\n

    Great looks. And brains, too.

    \r\n

    The new Genius feature turns iPod nano into your own highly intelligent, personal DJ. It creates playlists by finding songs in your library that go great together.

    \r\n

    Made to move with your moves.

    \r\n

    The accelerometer comes to iPod nano. Give it a shake to shuffle your music. Turn it sideways to view Cover Flow. And play games designed with your moves in mind.

    ', '

    New design. New features. Now in 8GB and 16GB. iPod nano rocks like never before.

    ', 'ipod-nano', '', '', '', 'iPod Nano', 'In stock', ''), +(1, 2, '

    Des courbes avantageuses.

    \r\n

    Pour les amateurs de sensations, voici neuf nouveaux coloris. Et ce n''est pas tout ! Faites l''expérience du design elliptique en aluminum et verre. Vous ne voudrez plus le lâcher.

    \r\n

    Beau et intelligent.

    \r\n

    La nouvelle fonctionnalité Genius fait d''iPod nano votre DJ personnel. Genius crée des listes de lecture en recherchant dans votre bibliothèque les chansons qui vont bien ensemble.

    \r\n

    Fait pour bouger avec vous.

    \r\n

    iPod nano est équipé de l''accéléromètre. Secouez-le pour mélanger votre musique. Basculez-le pour afficher Cover Flow. Et découvrez des jeux adaptés à vos mouvements.

    ', '

    Nouveau design. Nouvelles fonctionnalités. Désormais en 8 et 16 Go. iPod nano, plus rock que jamais.

    ', 'ipod-nano', '', '', '', 'iPod Nano', 'En stock', ''), +(2, 1, '

    Instant attachment.

    \r\n

    Wear up to 500 songs on your sleeve. Or your belt. Or your gym shorts. iPod shuffle is a badge of musical devotion. Now in new, more brilliant colors.

    \r\n

    Feed your iPod shuffle.

    \r\n

    iTunes is your entertainment superstore. It’s your ultra-organized music collection and jukebox. And it’s how you load up your iPod shuffle in one click.

    \r\n

    Beauty and the beat.

    \r\n

    Intensely colorful anodized aluminum complements the simple design of iPod shuffle. Now in blue, green, pink, red, and original silver.

    ', '

    iPod shuffle, the world’s most wearable music player, now clips on in more vibrant blue, green, pink, and red.

    ', 'ipod-shuffle', '', '', '', 'iPod shuffle', 'In stock', ''), +(2, 2, '

    Un lien immédiat.

    \r\n

    Portez jusqu''à 500 chansons accrochées à votre manche, à votre ceinture ou à votre short. Arborez votre iPod shuffle comme signe extérieur de votre passion pour la musique. Existe désormais en quatre nouveaux coloris encore plus éclatants.

    \r\n

    Emplissez votre iPod shuffle.

    \r\n

    iTunes est un immense magasin dédié au divertissement, une collection musicale parfaitement organisée et un jukebox. Vous pouvez en un seul clic remplir votre iPod shuffle de chansons.

    \r\n

    La musique en technicolor.

    \r\n

    iPod shuffle s''affiche désormais dans de nouveaux coloris intenses qui rehaussent le design épuré du boîtier en aluminium anodisé. Choisissez parmi le bleu, le vert, le rose, le rouge et l''argenté d''origine.

    ', '

    iPod shuffle, le baladeur le plus portable du monde, se clippe maintenant en bleu, vert, rose et rouge.

    ', 'ipod-shuffle', '', '', '', 'iPod shuffle', 'En stock', ''), +(5, 1, '

    MacBook Air is nearly as thin as your index finger. Practically every detail that could be streamlined has been. Yet it still has a 13.3-inch widescreen LED display, full-size keyboard, and large multi-touch trackpad. It’s incomparably portable without the usual ultraportable screen and keyboard compromises.

    The incredible thinness of MacBook Air is the result of numerous size- and weight-shaving innovations. From a slimmer hard drive to strategically hidden I/O ports to a lower-profile battery, everything has been considered and reconsidered with thinness in mind.

    MacBook Air is designed and engineered to take full advantage of the wireless world. A world in which 802.11n Wi-Fi is now so fast and so available, people are truly living untethered — buying and renting movies online, downloading software, and sharing and storing files on the web.

    ', 'MacBook Air is ultrathin, ultraportable, and ultra unlike anything else. But you don’t lose inches and pounds overnight. It’s the result of rethinking conventions. Of multiple wireless innovations. And of breakthrough design. With MacBook Air, mobile computing suddenly has a new standard.', 'macbook-air', '', '', '', 'MacBook Air', '', NULL), +(5, 2, '

    MacBook Air est presque aussi fin que votre index. Pratiquement tout ce qui pouvait être simplifié l''a été. Il n''en dispose pas moins d''un écran panoramique de 13,3 pouces, d''un clavier complet et d''un vaste trackpad multi-touch. Incomparablement portable il vous évite les compromis habituels en matière d''écran et de clavier ultra-portables.

    L''incroyable finesse de MacBook Air est le résultat d''un grand nombre d''innovations en termes de réduction de la taille et du poids. D''un disque dur plus fin à des ports d''E/S habilement dissimulés en passant par une batterie plus plate, chaque détail a été considéré et reconsidéré avec la finesse à l''esprit.

    MacBook Air a été conçu et élaboré pour profiter pleinement du monde sans fil. Un monde dans lequel la norme Wi-Fi 802.11n est désormais si rapide et si accessible qu''elle permet véritablement de se libérer de toute attache pour acheter des vidéos en ligne, télécharger des logicééééiels, stocker et partager des fichiers sur le Web.

    ', 'MacBook Air est ultra fin, ultra portable et ultra différent de tout le reste. Mais on ne perd pas des kilos et des centimètres en une nuit. C''est le résultat d''une réinvention des normes. D''une multitude d''innovations sans fil. Et d''une révolution dans le design. Avec MacBook Air, l''informatique mobile prend soudain une nouvelle dimension.', 'macbook-air', '', '', '', 'MacBook Air', '', NULL), +(6, 1, 'Every MacBook has a larger hard drive, up to 250GB, to store growing media collections and valuable data.

    The 2.4GHz MacBook models now include 2GB of memory standard — perfect for running more of your favorite applications smoothly.', 'MacBook makes it easy to hit the road thanks to its tough polycarbonate case, built-in wireless technologies, and innovative MagSafe Power Adapter that releases automatically if someone accidentally trips on the cord.', 'macbook', '', '', '', 'MacBook', '', NULL), +(6, 2, 'Chaque MacBook est équipé d''un disque dur plus spacieux, d''une capacité atteignant 250 Go, pour stocker vos collections multimédia en expansion et vos données précieuses.

    Le modèle MacBook à 2,4 GHz intègre désormais 2 Go de mémoire en standard. L''idéal pour exécuter en souplesse vos applications préférées.', 'MacBook vous offre la liberté de mouvement grâce à son boîtier résistant en polycarbonate, à ses technologies sans fil intégrées et à son adaptateur secteur MagSafe novateur qui se déconnecte automatiquement si quelqu''un se prend les pieds dans le fil.', 'macbook', '', '', '', 'MacBook', '', NULL), +(7, 1, '

    Five new hands-on applications

    \r\n

    View rich HTML email with photos as well as PDF, Word, and Excel attachments. Get maps, directions, and real-time traffic information. Take notes and read stock and weather reports.

    \r\n

    Touch your music, movies, and more

    \r\n

    The revolutionary Multi-Touch technology built into the gorgeous 3.5-inch display lets you pinch, zoom, scroll, and flick with your fingers.

    \r\n

    Internet in your pocket

    \r\n

    With the Safari web browser, see websites the way they were designed to be seen and zoom in and out with a tap.2 And add Web Clips to your Home screen for quick access to favorite sites.

    \r\n

    What''s in the box

    \r\n
      \r\n
    • iPod touch
    • \r\n
    • Earphones
    • \r\n
    • USB 2.0 cable
    • \r\n
    • Dock adapter
    • \r\n
    • Polishing cloth
    • \r\n
    • Stand
    • \r\n
    • Quick Start guide
    • \r\n
    ', '
      \r\n
    • Revolutionary Multi-Touch interface
    • \r\n
    • 3.5-inch widescreen color display
    • \r\n
    • Wi-Fi (802.11b/g)
    • \r\n
    • 8 mm thin
    • \r\n
    • Safari, YouTube, Mail, Stocks, Weather, Notes, iTunes Wi-Fi Music Store, Maps
    • \r\n
    ', 'ipod-touch', '', '', '', 'iPod touch', '', NULL), +(7, 2, '

    Titre 1

    \r\n

    Titre 2

    \r\n

    Titre 3

    \r\n

    Titre 4

    \r\n
    Titre 5
    \r\n
    Titre 6
    \r\n
      \r\n
    • UL
    • \r\n
    • UL
    • \r\n
    • UL
    • \r\n
    • UL
    • \r\n
    \r\n
      \r\n
    1. OL
    2. \r\n
    3. OL
    4. \r\n
    5. OL
    6. \r\n
    7. OL
    8. \r\n
    \r\n

    paragraphe...

    \r\n

    paragraphe...

    \r\n

    paragraphe...

    \r\n\r\n \r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    th th th
    tdtdtd
    tdtdtd
    \r\n

    Cinq nouvelles applications sous la main

    \r\n

    Consultez vos e-mails au format HTML enrichi, avec photos et pieces jointes au format PDF, Word et Excel. Obtenez des cartes, des itinéraires et des informations sur l''état de la circulation en temps réel. Rédigez des notes et consultez les cours de la Bourse et les bulletins météo.

    \r\n

    Touchez du doigt votre musique et vos vidéos. Entre autres.

    \r\n

    La technologie multi-touch révolutionnaire intégrée au superbe écran de 3,5 pouces vous permet d''effectuer des zooms avant et arrière, de faire défiler et de feuilleter des pages à l''aide de vos seuls doigts.

    \r\n

    Internet dans votre poche

    \r\n

    Avec le navigateur Safari, vous pouvez consulter des sites web dans leur mise en page d''origine et effectuer un zoom avant et arrière d''une simple pression sur l''écran.

    \r\n

    Contenu du coffret

    \r\n
      \r\n
    • iPod touch
    • \r\n
    • Écouteurs
    • \r\n
    • Câble USB 2.0
    • \r\n
    • Adaptateur Dock
    • \r\n
    • Chiffon de nettoyage
    • \r\n
    • Support
    • \r\n
    • Guide de démarrage rapide
    • \r\n
    \r\n

     

    ', '

    Interface multi-touch révolutionnaire
    Écran panoramique couleur de 3,5 pouces
    Wi-Fi (802.11b/g)
    8 mm d''épaisseur
    Safari, YouTube, iTunes Wi-Fi Music Store, Courrier, Cartes, Bourse, Météo, Notes

    ', 'ipod-touch', '', '', '', 'iPod touch', 'En stock', NULL), +(8, 1, '

    Lorem ipsum

    ', '

    Lorem ipsum

    ', 'belkin-leather-folio-for-ipod-nano-black-chocolate', '', '', '', 'Belkin Leather Folio for iPod nano - Black / Chocolate', '', NULL), +(8, 2, '

    Caractéristiques

    \r\n
  • Cuir doux résistant
  • \r\n
  • Accès au bouton Hold
  • \r\n
  • Fermeture magnétique
  • \r\n
  • Accès au Dock Connector
  • \r\n
  • Protège-écran
  • ', '

    Cet étui en cuir tendance assure une protection complète contre les éraflures et les petits aléas de la vie quotidienne. Sa conception élégante et compacte vous permet de glisser votre iPod directement dans votre poche ou votre sac à main.

    ', 'housse-portefeuille-en-cuir-ipod-nano-noir-chocolat', '', '', '', 'Housse portefeuille en cuir (iPod nano) - Noir/Chocolat', '', NULL), +(9, 1, '
    Using Hi-Definition MicroSpeakers to deliver full-range audio, the ergonomic and lightweight design of the SE210 earphones is ideal for premium on-the-go listening on your iPod or iPhone. They offer the most accurate audio reproduction from both portable and home stereo audio sources--for the ultimate in precision highs and rich low end. In addition, the flexible design allows you to choose the most comfortable fit from a variety of wearing positions.

    Features
    \r\n
      \r\n
    • Sound-isolating design
    • \r\n
    • Hi-Definition MicroSpeaker with a single balanced armature driver
    • \r\n
    • Detachable, modular cable so you can make the cable longer or shorter depending on your activity
    • \r\n
    • Connector compatible with earphone ports on both iPod and iPhone
    • \r\n
    \r\nSpecifications
    \r\n
      \r\n
    • Speaker type: Hi-Definition MicroSpeaker
    • \r\n
    • Frequency range: 25Hz-18.5kHz
    • \r\n
    • Impedance (1kHz): 26 Ohms
    • \r\n
    • Sensitivity (1mW): 114 dB SPL/mW
    • \r\n
    • Cable length (with extension): 18.0 in./45.0 cm (54.0 in./137.1 cm)
    • \r\n
    \r\nIn the box
    \r\n
      \r\n
    • Shure SE210 earphones
    • \r\n
    • Extension cable (36.0 in./91.4 cm)
    • \r\n
    • Three pairs foam earpiece sleeves (small, medium, large)
    • \r\n
    • Three pairs soft flex earpiece sleeves (small, medium, large)
    • \r\n
    • One pair triple-flange earpiece sleeves
    • \r\n
    • Carrying case
    • \r\n
    \r\nWarranty
    Two-year limited
    (For details, please visit
    www.shure.com/PersonalAudio/CustomerSupport/ProductReturnsAndWarranty/index.htm.)

    Mfr. Part No.: SE210-A-EFS

    Note: Products sold through this website that do not bear the Apple Brand name are serviced and supported exclusively by their manufacturers in accordance with terms and conditions packaged with the products. Apple''s Limited Warranty does not apply to products that are not Apple-branded, even if packaged or sold with Apple products. Please contact the manufacturer directly for technical support and customer service.
    ', '

    Evolved from personal monitor technology road-tested by pro musicians and perfected by Shure engineers, the lightweight and stylish SE210 delivers full-range audio that''s free from outside noise.

    ', 'ecouteurs-a-isolation-sonore-shure-se210-blanc', '', '', '', 'Shure SE210 Sound-Isolating Earphones for iPod and iPhone', '', NULL), +(9, 2, '

    Basés sur la technologie des moniteurs personnels testée sur la route par des musiciens professionnels et perfectionnée par les ingénieurs Shure, les écouteurs SE210, légers et élégants, fournissent une sortie audio à gamme étendue exempte de tout bruit externe.


    Conception à isolation sonore
    Les embouts à isolation sonore fournis bloquent plus de 90 % du bruit ambiant. Combinés à un design ergonomique séduisant et un câble modulaire, ils minimisent les intrusions du monde extérieur, vous permettant de vous concentrer sur votre musique. Conçus pour les amoureux de la musique qui souhaitent faire évoluer leur appareil audio portable, les écouteurs SE210 vous permettent d''emmener la performance avec vous.

    Micro-transducteur haute définition
    Développés pour une écoute de qualité supérieure en déplacement, les écouteurs SE210 utilisent un seul transducteur à armature équilibrée pour bénéficier d''une gamme audio étendue. Le résultat ? Un confort d''écoute époustouflant qui restitue tous les détails d''un spectacle live.

    \r\n

    Le kit universel Deluxe comprend les éléments suivants :
    - Embouts à isolation sonore
    Les embouts à isolation sonore inclus ont un double rôle : bloquer les bruits ambiants et garantir un maintien et un confort personnalisés. Comme chaque oreille est différente, le kit universel Deluxe comprend trois tailles (S, M, L) d''embouts mousse et flexibles. Choisissez la taille et le style d''embout qui vous conviennent le mieux : une bonne étanchéité est un facteur clé pour optimiser l''isolation sonore et la réponse des basses, ainsi que pour accroître le confort en écoute prolongée.

    - Câble modulaire
    En se basant sur les commentaires de nombreux utilisateurs, les ingénieurs de Shure ont développé une solution de câble détachable pour permettre un degré de personnalisation sans précédent. Le câble de 1 mètre fourni vous permet d''adapter votre confort en fonction de l''activité et de l''application.

    - Étui de transport
    Outre les embouts à isolation sonore et le câble modulaire, un étui de transport compact et résistant est fourni avec les écouteurs SE210 pour vous permettre de ranger vos écouteurs de manière pratique et sans encombres.

    - Garantie limitée de deux ans
    Chaque solution SE210 achetée est couverte par une garantie pièces et main-d''œuvre de deux ans.

    Caractéristiques techniques

    \r\n
      \r\n
    • Type de transducteur : micro-transducteur haute définition
    • \r\n
    • Sensibilité (1 mW) : pression acoustique de 114 dB/mW
    • \r\n
    • Impédance (à 1 kHz) : 26 W
    • \r\n
    • Gamme de fréquences : 25 Hz – 18,5 kHz
    • \r\n
    • Longueur de câble / avec rallonge : 45 cm / 136 cm
    • \r\n
    \r\n

    Contenu du coffret

    \r\n
      \r\n
    • Écouteurs Shure SE210
    • \r\n
    • Kit universel Deluxe (embouts à isolation sonore, câble modulaire, étui de transport)
    • \r\n
    ', '

    Les écouteurs à isolation sonore ergonomiques et légers offrent la reproduction audio la plus fidèle en provenance de sources audio stéréo portables ou de salon.

    ', 'ecouteurs-a-isolation-sonore-shure-se210', '', '', '', 'Écouteurs à isolation sonore Shure SE210', '', NULL), +(7, 3, '

    Cinco nuevas aplicaciones a mano

    \r\n


    Consulta tu correo en formato HTML enriquecido, con fotos y ficheros adjuntos en formato PDF, Word y Excel. Consigue mapas, itinerarios e información sobre el estado de la carreteras en tiempo real. Escribe notas y consulta la bolsa y el tiempo.
    Alcanza con un dedo tu música y tus videos, entre otras cosas.
    La tecnología multi-touch revolucionaria integrada a la magnífica pantalla de 3,5 pulgadas te permitirá efectuar zoom hacia adelante y hacia atrás, y pasar y ojear las páginas solo con la ayuda de tus dedos.

    \r\n

    Internet en tu bolsillo

    \r\n

    Con el navegador Safari, podrás consultar sitios web en su compaginación de origen y efectuar un zoom hacia adelante y hacia atrás con la simple presión de un dedo en la pantalla.

    \r\n

    Contenido del estuche
    * iPod touch
    * Auriculares
    * Cable USB 2.0
    * Adaptador Dock
    * Paño de limpieza
    * Base
    * Guía de inicio rápido
    Título
    Párrafo

    ', '

    Interfaz multi-touch revolucionaria
    Pantalla panorámica color de 3,5 pulgadas
    Wi-Fi (802.11b/g)
    8 mm de espesor
    Safari, YouTube, iTunes Wi-Fi Music Store, Correo, Mapas, Bolsa, El tiempo, Notas

    ', 'ipod-touch', '', '', '', 'iPod touch', 'Disponible', ''), +(1, 3, '

    Curvas aerodinámicas.

    \r\n

    Para los aficionados a las sensaciones fuertes, os presentamos nueve nuevos colores. ¡ Y eso no es todo ! Experimenta el diseño elíptico de aluminio y vidrio. ¡ No querrás separarte de él nunca más !

    \r\n


    Estético e inteligente.

    \r\n

    La nueva aplicación Genius hace de iPod nano tu discjockey personal. Genuis crea listas de lectura buscando en tu biblioteca las canciones que combinan entre si.

    \r\n


    Hecho para moverse contigo.

    iPod nano está equipado de un acelerómetro. Muévelo para mezclar tu música. Voltéalo para mostrar Cover Flow. Y descubre juegos adaptados a tus movimientos.

    ', '

    Nuevo diseño. Nuevas aplicaciones. Ahora disponible en 8 y 16 Go. iPod nano, más rock que nunca.

    ', 'ipod-nano', '', '', '', 'iPod Nano', 'Disponible', ''), +(2, 3, '

    Un enlace inmediato.

    Lleva hasta 500 canciones colgadas de tu manga, de tu cinturón o de tu pantalón. Presume con tu iPod shuffle como signo exterior de tu pasión por la música. Ahora ya existen cuatro nuevos colores más llamativos.

    Llena tu iPod shuffle.

    iTunes es una enorme tienda dedicada a la diversión, una colección de música organizada perfectamente y un jukebox. Con tan solo un clic puedes llenar tu iPod shuffle con canciones.

    La música en tecnicolor.

    iPod shuffle presenta nuevos colores vivos que realzan su diseño estilizado en aluminio anodizado. Elige entre azul, verde, rosa, rojo y el plateado de origen.

    ', '

    iPod shuffle, el walkman más portátil del mundo, ahora en azul, verde, rosa y rojo.

    ', 'ipod-shuffle', '', '', '', 'iPod shuffle', 'Disponible', ''), +(6, 3, '

    Cada MacBook está equipado de un disco duro más espacioso, de una capacidad de hasta 250 Go, para almacenar tus colecciones multimedia en expansión y tus datos más preciados.
    El modelo MacBook de 2,4 GHz integra 2 Go de memoria en estándar. Lo ideal para realizar sin dificultad tus aplicaciones preferidas.

    ', '

    MacBook te ofrece una gran libertad de movimientos gracias a su exterior resistente en policarbonato, a su tecnología sin cable y a su adaptador cargador sector innovador que se desconecta automáticamente si alguien se engancha en el cable.

    ', 'macbook', '', '', '', 'MacBook', 'Disponible', ''), +(5, 3, '

    MacBook Air es casi tan fino como tu dedo. Se ha simplificado al máximo y a pesar de ello dispone de una pantalla panorámica de 13,3 pulgadas, de un teclado completo y de un amplio trackpad multi-touch. Portátil al 100%, te evitará tener que hacer un compromiso en lo que concierne a la pantalla y al teclado.

    La increíble sutileza de MacBook Air es el resultado de un gran número de innovaciones en materia de reducción de tamaño y peso. Desde un disco duro más fino hasta puertos E/S disimulados hábilmente pasando por una batería más plana, cada detalle se consideró para que el resultado fuera lo más fino posible.

    MacBook Air fue creado y elaborado para disfrutar plenamente del mundo inalámbrico. Un mundo en el que la norma Wi-Fi 802.11n es tan rápida y accesible que permite liberarse completamente de cualquier atadura para comprar videos en línea, descargar programas, almacenar y compartir archivos en la Red.

    ', '

    MacBook Air es ultra fino, ultra portátil y ultra diferente de todo el resto. Pero no se pierden kilos y centímetros en tan solo una noche. Todo esto es el resultado de un nuevo invento de normas. De un sinfín de novedades sin cable. Y de una revolución en el diseño. Con MacBook Air, la informática móvil adquiere una nueva dimensión.

    ', 'macbook-air', '', '', '', 'MacBook Air', 'Disponible', ''), +(8, 3, '

    Características

    \r\n
      \r\n
    • Cuero suave resistente
    • \r\n
    • Acceso a la tecla Hold
    • \r\n
    • Cierre magnético
    • \r\n
    • Acceso al Dock Conector
    • \r\n
    • Salva pantallas
    • \r\n
    ', '

    Este estuche de cuero de última moda garantiza una completa protección contra los arañazos y los pequeños contratiempos de la vida diaria. Su diseño elegante y compacto te permite meter tu Ipod directamente en tu bolsillo o en tu bolso.

    ', 'funda-cuero-ipod-nano-negro-chocolate', '', '', '', 'Leather Case (iPod nano) - Negro / Chocolate', 'Disponible', ''), +(9, 3, '

    Los auriculares SE210, ligeros y elegantes, están basados en la tecnología de los monitores personales que los músicos profesionales utilizan en carretera y que los ingenieros de Shure han perfeccionado. También están provistos de una salida audio de gama extendida exenta de todo ruido exterior.

    Creado para un aislamiento sonoro

    \r\n

    Las almohadillas provistas de un aislamiento sonoro bloquean más del 90% del ruido ambiente. Combinadas con un diseño ergonómico atractivo y un cable modular, minimizan las intrusiones del mundo exterior y te permiten concentrarte en tu música. Creados para los apasionados por la música que quieren que su aparato audio móvil evolucione, los auriculares SE210 te permitirán llevar la tecnología allí donde tú vayas.

    Micro-transductor alta definición
    Desarrollados para poder tener una audición de calidad durante los desplazamientos, los auriculares SE210 utilizan un único transductor con un armazón equilibrado para poder disfrutar de una gama audio extendida. ¿El resultado ? Un confort audio increíble que restituye cada detalle de un espectáculo en directo.

    El kit universal Deluxe incluye los siguientes elementos :
    - Almohadillas para aislamiento sonoro
    Las almohadillas para el aislamiento sonoro tienen una doble función : bloquear el ruido ambiente y garantizar una estabilidad y un confort personalizados. Como cada oreja es diferente el kit universal Deluxe incluye tres tallas (S, M, L) de almohadillas de espuma y flexibles. Elige la talla y el estilo de almohadilla que mejor te convenga : un buen aislamiento es un factor clave tanto para optimizar el aislamiento sonoro y la respuesta de los bajos como para aumentar el confort durante una audición prolongada.

    - Cable modular

    \r\n

    Basándose en los comentarios de los numerosos usuarios, los ingenieros de Shure han creado una solución de cable separable para permitir un grado de personalización sin precedentes. El cable de 1 metro te permite adaptar el confort en función de la actividad del momento y de la aplicación.

    - Estuche para el transporte

    \r\n

    Además de las almohadillas de aislamiento sonoro y del cable modular, los auriculares SE210 están provistos de un estuche de transporte compacto y resistente para guardar los auriculares de manera práctica y sin dificultad.
    - Garantía límite de dos años
    Cada solución SE210 tiene una garantía piezas y mano de obra de dos años.

    \r\n


    Características técnicas

    \r\n
      \r\n
    • Tipo de transductor : micro-transductor alta definición
    • \r\n
    • Sensibilidad (1 mW) : presión acústica de 114 dB/mW
    • \r\n
    • Impedancia : (à 1 kHz) : 26 W
    • \r\n
    • Gama de frecuencias : 25 Hz ˆ 18,5 kHz
    • \r\n
    • Longitud del cable / con alargador : 45 cm / 136 cm
    • \r\n
    \r\n


    Contenido de la caja

    \r\n
      \r\n
    • Altavoces Shure SE210
    • \r\n
    • Kit universal Deluxe (almohadillas de aislamiento sonoro, cable modular, estuche de transporte)
    • \r\n
    ', '

    Los auriculares con aislamiento ergonómicos y ligeros ofrecen la reproducción más fiel proveniente de fuentes audio estéreo móviles o de salón.

    ', 'auriculares-aislantes-del-sonido-shure-se210', '', '', '', 'Auriculares aislantes del sonido Shure SE210', 'Disponible', ''), +(1, 4, '

    Immer eine Kurve voraus.

    \r\n

    Für all die, die gleich losrocken wollen, gibt es jetzt neun tolle Farben zur Auswahl. Aber das ist nur ein Teil der Geschichte. Mit seinem runden Design, das komplett aus Aluminium und Glas besteht, werden Sie den iPod nano nicht mehr weglegen wollen.

    \r\n

    Tolles Design. Und viel Köpfchen.

    \r\n

    Die neue Genius-Funktion verwandelt den iPod nano in Ihren hoch intelligenten, persönlichen DJ. Es erstellt Abspiellisten aus den Songs in Ihrer Sammlung, die gut zusammenpassen.

    \r\n

    Passt sich Ihren Bewegungen an.

    \r\n

    Der iPod nano jetzt mit Beschleunigungsmesser. Einmal schütteln, und Ihre Musik wird neu sortiert. Kippen Sie es zur Seite für die Cover Flow-Ansicht. Und spielen Sie mit den Bewegungen, an die Sie denken.

    ', '

    New design. New features. Now in 8GB and 16GB. iPod nano rocks like never before.

    ', 'ipod-nano', '', '', '', 'iPod Nano', 'In stock', ''), +(2, 4, '

    style="font-size: small;">Gleich festmachen.

    \r\n

    Tragen Sie bis zu 500 Songs am Ärmel. Oder an Ihrem Gürtel. Oder an Ihrer Sporthose. iPod shuffle ist ein Erkennungszeichen echter Musikfans. Jetzt in neuen, noch leuchtenderen Farben.

    \r\n

    style="font-size: small;">Füttern Sie Ihren iPod shuffle.

    \r\n

    iTunes ist Ihr Super-Store für Unterhaltung. Es ist Ihre optimal organisierte Musik-Sammlung und Jukebox. Und Sie können Ihren iPod shuffle mit einem Klick laden.

    \r\n

    style="font-size: small;">Die Schöne und der Beat.

    \r\n

    Das farbintensive eloxierte Aluminium ergänzt das schlichte Design des iPod shuffle. Jetzt in Blau, Grün, Rosa, Rot und klassischem Silber.

    ', '

    iPod shuffle, the world’s most wearable music player, now clips on in more vibrant blue, green, pink, and red.

    ', 'ipod-shuffle', '', '', '', 'iPod shuffle', 'In stock', ''), +(5, 4, '

    MacBook Air ist kaum dicker als Ihr Zeigefinger. Nahezu jedes Detail wurde abgeflacht. Und dabei hat es immer noch einen 13,3-Zoll-Widescreen-LED-Display, eine Tastatur in voller Größe und einen großen Multi-Touch-Trackpad. Es besitzt eine unvergleichliche Tragbarkeit, ohne die üblichen Kompromisse für ultraportable Bildschirme und Tastaturen.

    Der unglaublich dünne MacBook Air ist das Ergebnis zahlreicher Innovationen zur Größen- und Gewichtsoptimierung. Die flachere Festplatte, die strategisch versteckten I/O-Ports und eine noch flachere Batterie: Alles wurde immer wieder überdacht, immer mit dem Ziel, es noch dünner zu gestalten.

    Das Design und Konzept von MacBook Air ist voll auf die Vorteile der Kabelfreiheit ausgerichtet. Eine Welt, in der 802.11n WLAN heutzutage so schnell und so leicht verfügbar ist, dass die Menschen heute grenzenlos Filme online kaufen oder mieten, Software downloaden und Dateien über das Internet teilen oder speichern können.

    ', 'MacBook Air is ultrathin, ultraportable, and ultra unlike anything else. But you don’t lose inches and pounds overnight. It’s the result of rethinking conventions. Of multiple wireless innovations. And of breakthrough design. With MacBook Air, mobile computing suddenly has a new standard.', 'macbook-Air', '', '', '', 'MacBook Air', '', NULL), +(6, 4, 'Jedes MacBook verfügt über eine größere Festplatte, bis zu 250GB, zum Speichern immer größer werdender Mediensammlungen und wertvoller Daten.

    Die 2,4 GHz MacBook-Modelle haben nun 2 GB Standard-Arbeitsspeicher - ideal zum reibungslosen Abspielen Ihrer Lieblings-Anwendungen.', 'MacBook makes it easy to hit the road thanks to its tough polycarbonate case, built-in wireless technologies, and innovative MagSafe Power Adapter that releases automatically if someone accidentally trips on the cord.', 'macbook', '', '', '', 'MacBook', '', NULL), +(7, 4, '

    Fünf neue Hands-on-Anwendungen

    \r\n

    Rich-HTML-E-Mails mit Fotos anzeigen sowie PDF-, Word-und Excel-Anhänge. Holen Sie sich Karten, Wegbeschreibungen und Echtzeit-Verkehrsinformationen. Sie können sich Notizen machen und Börsen- und Wetterberichte lesen.

    \r\n

    Berühren Sie Ihre Musik, Filme und vieles mehr

    \r\n

    Mit der revolutionären, in den wunderschönen 3,5-Zoll-Display integrierten Multi-Touch-Technologie können Sie zuziehen, zoomen, scrollen und streichen.

    \r\n

    Internet in Ihrer Tasche

    \r\n

    Mit dem Safari-Webbrowser sehen Sie Webseiten so, wie sie gesehen werden sollten und vergrößern und verkleinern sie mit einer Berührung.2Fügen Sie Web-Clips zu Ihrer Startseite hinzu für den Schnellzugriff auf Ihre bevorzugten Webseiten.

    \r\n

    Zum Set gehören/h3>\r\n
      \r\n
    • der iPod touch
    • \r\n
    • Ohrhörer
    • \r\n
    • USB 2.0-Kabel
    • \r\n
    • Anschluss-Adapter
    • \r\n
    • Poliertuch
    • \r\n
    • Basis
    • \r\n
    • Quick Start Guide
    • \r\n
    ', '
      \r\n
    • Revolutionary Multi-Touch interface
    • \r\n
    • 3.5-inch widescreen color display
    • \r\n
    • Wi-Fi (802.11b/g)
    • \r\n
    • 8 mm thin
    • \r\n
    • Safari, YouTube, Mail, Stocks, Weather, Notes, iTunes Wi-Fi Music Store, Maps
    • \r\n
    ', 'iPod-Touch', '', '', '', 'iPod touch', '', NULL), +(8, 4, '

    Lorem ipsum

    ', '

    Lorem ipsum

    ', 'lederhulle-belkin-fur-ipod-nano-schwarz-schokolade', '', '', '', 'Lederhülle Belkin für ipod nano - Schwarz/Schokolade', '', NULL), +(9, 4, '
    Mit ihren hochauflösenden Micro-Lautsprechern, die vollen Klang liefern und ihrem ergonomischen, leichten Design sind die SE210 Ohrhörer ideal zum mobilen Extraklasse-Musik hören auf Ihrem iPod oder iPhone. Sie bieten die genaueste Tonwiedergabe, sowohl aus tragbaren als auch aus Home-Stereo-Audio-Quellen - für ultimative präzisen Höhen und kraftvolle Bässe. Darüber hinaus ermöglicht das flexible Design optimalen Tragekomfort durch eine Vielzahl von Tragemöglichkeiten.

    Funktionen
    \r\n
      \r\n
    • Klangisolierendes Design
    • \r\n
    • Hochauflösende Micro-Lautsprecher mit Single Balanced Armature-Treiber
    • \r\n
    • Abnehmbare modulare Kabel, die Sie je nach Aktivität länger oder kürzer einstellen können
    • \r\n
    • Kompatibler Stecker mit Kopfhörer-Anschlüssen für iPod und iPhone
    • \r\n
    \r\nDaten
    \r\n
      \r\n
    • Lautsprecher-Typ: Hochauflösende Micro-Lautsprecher
    • \r\n
    • Frequenzbereich: 25Hz-18.5kHz
    • \r\n
    • Impedanz (1kHz): 26 Ohm
    • \r\n
    • Empfindlichkeit (1mW): 114 dB SPL/mW
    • \r\n
    • Kabellänge (mit Erweiterung): 18,0 Zoll/45,0 cm (54,0 Zoll/137,1 cm)
    • \r\n
    \r\nIm Set enthalten
    \r\n
      \r\n
    • Shure SE210 Ohrhörer
    • \r\n
    • Verlängerungskabel (36,0 Zoll/91,4 cm)
    • \r\n
    • Drei Paar Schaumstoff-Hörmuschelhüllen (klein, mittel, groß)
    • \r\n
    • Drei Paar weiche Flex-Hörmuschelhüllen (klein, mittel, groß)
    • \r\n
    • Ein Paar Triple-Flange-Hörmuschelhüllen
    • \r\n
    • Trage-Etui
    • \r\n
    \r\nGarantie
    Zwei Jahre
    (Einzelheiten hierzu finden Sie auf
    www.shure.com/PersonalAudio/CustomerSupport/ProductReturnsAndWarranty/index.htm).

    Mfr. Teilenummer: SE210-A-EFS

    Hinweis: Für Produkte auf dieser Website, die nicht den Markennamen Apple tragen, werden Service und Support ausschließlich von den Herstellern gemäß der den Produkten beiliegenden Nutzungsbedingungen übernommen. Die von Apple angebotene Garantiezeit gilt nicht für Produkte, die kein Apple-Markenzeichen tragen, selbst wenn diese zusammen mit Apple-Produkten verpackt oder verkauft wurden. Bitte wenden Sie sich direkt an den Hersteller für den technischen Support und Kundendienst.
    ', '

    Evolved from personal monitor technology road-tested by pro musicians and perfected by Shure engineers, the lightweight and stylish SE210 delivers full-range audio that''s free from outside noise.

    ', 'klangisolierte-ohrhorer-shure-se210-weib', '', '', '', 'Shure SE210 Klangisolierte Ohrhörer für iPod und iPhone', '', NULL), +(1, 5, '

    Curve mozzafiato.

    \r\n

    Per te che ami le sensazioni forti, ecco nove fantastici colori. Ma non è finito qui. Accarezza il design sinuoso fatto di vetro e alluminio dell\'iPod nano, e non lo lascerai più.

    \r\n

    Bello e intelligente.

    \r\n

    La nuova funzione Genius trasforma l\'iPod nano nel tuo DJ personale. Sa creare delle playlist andando a cercare nella libreria musicale le canzoni che stanno bene insieme.

    \r\n

    Fatto per muoversi con te.

    \r\n

    L\'accelerometro è integrato all\'iPod nano. Scuotilo per dare uno shuffle alla tua musica. Ruotalo di lato per vedere il Cover Flow. E divertiti con i giochi adattati alle tue movenze.

    ', '

    Nuovo design. Nuove funzioni. Adesso in 8GB e 16GB. iPod nano, forte come non mai.

    ', 'ipod-nano', '', '', '', 'iPod Nano', 'In magazzino', ''), +(2, 5, '

    Sempre attaccato.

    \r\n

    Metti 500 canzoni in tasca. O nella cintura. O nei pantaloncini. iPod shuffle ti fa avere le canzoni sempre addosso. Adesso in colori più nuovi e brillanti.

    \r\n

    Ricarica il tuo iPod shuffle.

    \r\n

    iTunes è il tuo superstore del divertimento. La tua raccolta musicale super organizzata, il tuo juke-box. E puoi ricaricare il tuo iPod shuffle con un click.

    \r\n

    Musica coloratissima.

    \r\n

    Complementi dai colori intensi in alluminio anodizzato: questo è il design semplice di iPod shuffle. Adesso in blu, verde rosa, rosso, e argento originale.

    ', '

    iPod shuffle, il lettore musicale più indossabile del mondo, adesso anche nelle tonalità più vibranti di blu, verde, rosa e rosso.

    ', 'ipod-shuffle', '', '', '', 'iPod shuffle', 'In magazzino', ''), +(5, 5, '

    MacBook Air è sottile quasi come il tuo indice. Praticamente ogni dettaglio è stato semplificato al massimo. Eppure riesce ad avere uno schermo LED di 13,3 pollici, tastiera completa, e un ampio track-pad multi-touch. Incredibilmente portatile, non soffre dei compromessi tra schermo e tastiera.

    La sottigliezza incredibile di MacBook Air è il risultato di moltissime innovazioni nel campo della riduzione di dimensioni e peso. Un hard drive più sottile, porte I/O strategicamente nascoste, batteria più piatta: tutto è stato ben calibrato pensando sempre alla sottigliezza.

    MacBook Air è stato progettato e realizzato per godere a pieno dell\'universo del wireless. In un mondo in cui la norma 802.11n Wi-Fi è ormai rapida e disponibile, le persone vivono connesse - acquistano e noleggiano film online, scaricano programmi, condividono e conservano file nel web.

    ', 'MacBook Air è ultra-piatto, ultra-portatile, e ultra come nient\'altro al mondo. Ma non si perdono chili e centimetri in una notte. E\' il risultato di una rielaborazione degli standard. Di moltissime innovazioni sul wireless. E di un design rivoluzionario. Con MacBook Air, l\'informatica mobile acquista una nuova dimensione.', 'macbook-air', '', '', '', 'MacBook Air', '', NULL), +(6, 5, 'Tutti i MacBook hanno un hard drive più ampio, fino a 250GB, per conservare le tue raccolte multimediali e i dati importanti.

    I modelli MacBook a 2,4GHz ora includono 2GB di memoria standard — ideale per le tue applicazioni preferite.', 'MacBook ti offre il massimo della libertà di movimento grazie alla sua struttura resistente in policarbonato, alle tecnologie integrate wireless, e all\'innovativo MagSafe Power Adapter che si stacca automaticamente se qualcuno accidentalmente inciampa nel cavo.', 'macbook', '', '', '', 'MacBook', '', NULL), +(7, 5, '

    Cinque nuove applicazioni sotto mano

    \r\n

    Consulta le tue e-mail in formato rich HTML con foto e allegati PDF, Word, e Excel. Ottieni mappe, indicazioni stradali e sul traffico in tempo reale. Prendi appunti e consulta la Borsa e le previsioni meteo.

    \r\n

    Tocca la musica, i film e altro ancora

    \r\n

    La rivoluzionaria tecnologia Multi-Touch integrata al bellissimo schermo da 3,5 pollici ti permette di zoomare avanti e indietro, sfogliare e far scorrere le pagine con le dita.

    \r\n

    Internet in tasca

    \r\n

    Con il web browser Safari, consulta i siti web nella loro impaginazione originale e usa lo zoom avanti e indietro con la sola pressione delle dita.2 Aggiungi Web Clips al tuo schermo per accedere subito ai siti preferiti.

    \r\n

    Nella confezione

    \r\n
      \r\n
    • iPod touch
    • \r\n
    • Auricolari
    • \r\n
    • Cavo USB 2.0
    • \r\n
    • Adattatore Dock
    • \r\n
    • Panno per la pulizia
    • \r\n
    • Supporto
    • \r\n
    • Guida installazione rapida
    • \r\n
    ', '
      \r\n
    • Interfaccia Multi-Touch rivoluzionaria
    • \r\n
    • Schermo widescreen a colori da 3,5 pollici
    • \r\n
    • Wi-Fi (802.11b/g)
    • \r\n
    • 8 mm di spessore
    • \r\n
    • Safari, YouTube, Mail, Borsa, Meteo, Appunti, iTunes Wi-Fi Music Store, Mappe
    • \r\n
    ', 'ipod-touch', '', '', '', 'iPod touch', '', NULL), +(8, 5, '

    Lorem ipsum

    ', '

    Lorem ipsum

    ', 'custodia-portafoglio-in-pelle-belkin-per-ipod-nano-nero-cioccolato', '', '', '', 'Custodia portafoglio in pelle Belkin per iPod nano - Nero/Cioccolato', '', NULL), +(9, 5, '
    L\'ascolto con la tecnologia dei Micro-Auricolari ad Alta Definizione permette l\'ascolto ideale del tuo iPod o iPhone. E\' quanto ti offre il design leggero, ergonomico ed elegante degli auricolari SE210. Ti garantiscono un rendimento audio ad alto livello di stereo portatili e fissi, per un livello di precisione mai raggiunto prima. Inoltre, la forma flessibile ti peremtte di scegliere la posizione migliore per indossarli.

    Caratteristiche
    \r\n
      \r\n
    • Design di isolamento del suono
    • \r\n
    • Micro-speaker ad alta definizione con driver singolo ad armatura bilanciata
    • \r\n
    • Cavo staccabile e regolabile in modo da poterlo allungare o accorciare in base alle tue attività
    • \r\n
    • Connettore compatibile con porte auricolari sia su iPod che iPhone
    • \r\n
    \r\nSpecifiche tecniche
    \r\n
      \r\n
    • Tipo speaker: MicroSpeaker ad alta definizione
    • \r\n
    • Gamma di frequenza: 25Hz-18.5kHz
    • \r\n
    • Impedenza (1kHz): 26 Ohms
    • \r\n
    • Sensibilità (1mW): 114 dB SPL/mW
    • \r\n
    • Lunghezza cavo (con prolunga): 18.0 in./45,0 cm (54.0 in./137,1 cm)
    • \r\n
    \r\nNella confezione
    \r\n
      \r\n
    • Auricolari Shure SE210
    • \r\n
    • Cavo prolunga (36.0 in./91,4 cm)
    • \r\n
    • Tre paia di imbuti in spugna (small, medium, large)
    • \r\n
    • Tre paia di imbuti morbidi (small, medium, large)
    • \r\n
    • Un paio di imbuti a tripla aletta
    • \r\n
    • Custodia da viaggio
    • \r\n
    \r\nGaranzia
    Due anni limitata
    (Per informazioni, visitare
    www.shure.com/PersonalAudio/CustomerSupport/ProductReturnsAndWarranty/index.htm.)

    Mfr. Parte N.: SE210-A-EFS

    Nota: I prodotti venduti tramite questo sito web e che non hanno il marchio Apple ricevono assistenza esclusivamente dai loro produttori con i termini e le condizioni contenute nella confezione del prodotto. La Garanzia Limitata di Apple non si applica ai prodotti che non appartengono al marchio Apple, anche se imballati o venduti con i prodotti Apple . Contatta direttamente il produttore per supporto tecnico e servizio clienti.
    ', '

    Basati sulla tecnologia all\'avanguardia, testati da musicisti professionisti, e messi a punto da ingegneri Shure, i leggeri ed eleganti SE210 offrono un suono nitido e privo di rumori di fondo.

    ', 'ecouteurs-a-isolation-sonore-shure-se210-blanc', '', '', '', 'auricolari-sound-isolating-shure-se210-per-ipod-e-iphone', '', NULL); + +INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) VALUES +(1, 0, 0, 0, 0, 0, 1, 0.05, 'percentage', '0000-00-00 00:00:00', '0000-00-00 00:00:00'); + +INSERT INTO `PREFIX_category` (`id_category`, `id_parent`, `level_depth`, `nleft`, `nright`, `active`, `date_add`, `date_upd`, `position`) VALUES +(2, 1, 1, 2, 3, 1, NOW(), NOW(), 0),(3, 1, 1, 3, 4, 1, NOW(), NOW(), 1),(4, 1, 1, 4, 5, 1, NOW(), NOW(), 2); + +INSERT INTO `PREFIX_category_lang` (`id_category`, `id_lang`, `name`, `description`, `link_rewrite`, `meta_title`, `meta_keywords`, `meta_description`) VALUES +(2, 1, 'iPods', 'Now that you can buy movies from the iTunes Store and sync them to your iPod, the whole world is your theater.', 'music-ipods', '', '', ''), +(2, 2, 'iPods', 'Il est temps, pour le meilleur lecteur de musique, de remonter sur scène pour un rappel. Avec le nouvel iPod, le monde est votre scène.', 'musique-ipods', '', '', ''), +(3, 1, 'Accessories', 'Wonderful accessories for your iPod', 'accessories-ipod', '', '', ''), +(3, 2, 'Accessoires', 'Tous les accessoires à la mode pour votre iPod', 'accessoires-ipod', '', '', ''), +(4, 1, 'Laptops', 'The latest Intel processor, a bigger hard drive, plenty of memory, and even more new features all fit inside just one liberating inch. The new Mac laptops have the performance, power, and connectivity of a desktop computer. Without the desk part.', 'laptops', 'Apple laptops', 'Apple laptops MacBook Air', 'Powerful and chic Apple laptops'), +(4, 2, 'Portables', 'Le tout dernier processeur Intel, un disque dur plus spacieux, de la mémoire à profusion et d''autres nouveautés. Le tout, dans à peine 2,59 cm qui vous libèrent de toute entrave. Les nouveaux portables Mac réunissent les performances, la puissance et la connectivité d''un ordinateur de bureau. Sans la partie bureau.', 'portables-apple', 'Portables Apple', 'portables apple macbook air', 'portables apple puissants et design'), +(4, 3, 'Portátiles', 'El último procesador Intel, un disco duro más grande, con profusión de memoria y otras novedades. Todo en sólo 2,59 cm libres de cualquier obstrucción. Las nuevas portátiles Mac cumplir rendimiento, potencia y conectividad de una computadora de escritorio. Sin la parte del escritorio.', 'portatiles-apple', 'Portátiles Apple', 'portátiles apple macbook air', 'portátiles apple poderoso y el diseño'), +(3, 3, 'Accesorios', 'Todos los accesorios de moda para tu iPod', 'ipod-accesorios', '', '', ''), +(2, 3, 'iPods', 'Es hora de que el mejor jugador de la música, al escenario para hacer un bis. Con el nuevo iPod, el mundo es tu escenario.', 'musica-ipods', '', '', ''), +(2, 4, 'iPods', 'Now that you can buy movies from the iTunes Store and sync them to your iPod, the whole world is your theater.', 'musik-iPods', '', '', ''), +(3, 4, 'Zubehör', 'Wonderful accessories for your iPod', 'zubehor-ipod', '', '', ''), +(4, 4, 'Laptops', 'The latest Intel processor, a bigger hard drive, plenty of memory, and even more new features all fit inside just one liberating inch. The new Mac laptops have the performance, power, and connectivity of a desktop computer. Without the desk part.', 'laptops', 'Apple laptops', 'Apple MacBook Air-Laptops', 'Powerful and chic Apple laptops'), +(2, 5, 'iPods', 'Adesso che puoi acquistare film dall\'iTunes Store e inserirli nel tuo iPod, il tuo mondo è un palcoscenico.', 'musica-ipods', '', '', ''), +(3, 5, 'Accessori', 'Fantastici accessori per il tuo iPod', 'accessori-ipod', '', '', ''), +(4, 5, 'Laptop', 'L\'ultimissimo processore Intel, hard drive più ampio, moltissima memoria, e ancora più funzioni tutte inserite in 2,54 centimetri. I nuovi laptop Mac offrono le prestazioni, la potenza e la connettività di un computer da tavolo. Senza bisogno del tavolo.', 'laptop', 'laptop Apple', 'laptot Apple MacBook Air', 'Laptop Apple potenti ed eleganti'); + +INSERT INTO `PREFIX_category_product` (`id_category`, `id_product`, `position`) VALUES +(1, 1, 0),(1, 2, 1),(1, 6, 2),(1, 7, 3),(2, 1, 0),(2, 2, 1),(2, 7, 2),(3, 8, 0),(3, 9, 1),(4, 5, 0),(4, 6, 1); + +INSERT INTO `PREFIX_attribute_group` (`id_attribute_group`, `is_color_group`) VALUES (1, 0),(2, 1),(3, 0); +INSERT INTO `PREFIX_attribute_group_group_shop` (`id_attribute_group`, `id_group_shop`) (SELECT `id_attribute_group`, 1 FROM `PREFIX_attribute_group`); +INSERT INTO `PREFIX_attribute_group_lang` (`id_attribute_group`, `id_lang`, `name`, `public_name`) VALUES +(1, 1, 'Disk space', 'Disk space'),(1, 2, 'Capacité', 'Capacité'),(2, 1, 'Color', 'Color'),(2, 2, 'Couleur', 'Couleur'),(3, 1, 'ICU', 'Processor'), +(3, 2, 'ICU', 'Processeur'),(1, 3, 'Capacidad', 'Capacidad'),(2, 3, 'Color', 'Color'),(3, 3, 'ICU', 'Procesador'),(1, 4, 'Speicherplatz', 'Disk space'),(2, 4, 'Farbe', 'Color'),(3, 4, 'ICU', 'Processor'),(1, 5, 'Spazio disco', 'Spazio disco'),(2, 5, 'Colore', 'Colore'),(3, 5, 'ICU', 'Processore'); + +INSERT INTO `PREFIX_attribute_impact` (`id_attribute_impact`, `id_product`, `id_attribute`, `weight`, `price`) VALUES +(1, 1, 2, 0, 60.00),(2, 1, 5, 0, 0.00),(3, 1, 16, 0, 50.00),(4, 1, 15, 0, 0.00),(5, 1, 4, 0, 0.00),(6, 1, 19, 0, 0.00),(7, 1, 3, 0, 0.00),(8, 1, 14, 0, 0.00), +(9, 1, 7, 0, 0.00),(10, 1, 20, 0, 0.00),(11, 1, 6, 0, 0.00),(12, 1, 18, 0, 0.00); + +INSERT INTO `PREFIX_scene` (`id_scene`, `active`) VALUES (1, 1),(2, 1),(3, 1); + +INSERT INTO `PREFIX_scene_category` (`id_scene`, `id_category`) VALUES (1, 2),(2, 2),(3, 4); + +INSERT INTO `PREFIX_scene_lang` (`id_scene`, `id_lang`, `name`) VALUES +(1, 1, 'The iPods Nano'),(1, 2, 'Les iPods Nano'),(1, 3, 'El iPod Nano'),(1, 4, 'Die iPods Nano'),(1, 5, 'Gli iPod Nano'), +(2, 1, 'The iPods'),(2, 2, 'Les iPods'),(2, 3, 'El iPod'),(2, 4, 'Die iPods'),(2, 5, 'Gli iPod'), +(3, 1, 'The MacBooks'),(3, 2, 'Les MacBooks'),(3, 3, 'El MacBook'),(3, 4, 'Die MacBooks'),(3, 5, 'I MacBook'); + +INSERT INTO `PREFIX_scene_products` (`id_scene`, `id_product`, `x_axis`, `y_axis`, `zone_width`, `zone_height`) VALUES +(1, 1, 474, 15, 72, 166),(2, 2, 389, 137, 51, 46),(2, 7, 111, 83, 161, 108),(2, 1, 340, 31, 46, 151),(3, 6, 355, 37, 151, 103),(3, 6, 50, 47, 128, 84), +(3, 5, 198, 47, 137, 92),(1, 1, 394, 14, 73, 168),(1, 1, 318, 14, 69, 168),(1, 1, 244, 14, 66, 169),(1, 1, 180, 13, 59, 168),(1, 1, 6, 12, 30, 175), +(1, 1, 38, 12, 30, 170),(1, 1, 76, 14, 41, 169),(1, 1, 123, 13, 49, 169); + +INSERT INTO `PREFIX_attribute` (`id_attribute`, `id_attribute_group`) VALUES (1, 1),(2, 1),(8, 1),(9, 1),(10, 3),(11, 3),(12, 1),(13, 1); +INSERT INTO `PREFIX_attribute` (`id_attribute`, `id_attribute_group`, `color`) VALUES (3, 2, '#D2D6D5'),(4, 2, '#008CB7'),(5, 2, '#F3349E'),(6, 2, '#93D52D'), +(7, 2, '#FD9812'),(15, 1, ''),(16, 1, ''),(17, 1, ''),(18, 2, '#7800F0'),(19, 2, '#F6EF04'),(20, 2, '#F60409'),(14, 2, '#000000'); + +INSERT INTO `PREFIX_attribute_group_shop` (`id_attribute`, `id_group_shop`) (SELECT `id_attribute`, 1 FROM `PREFIX_attribute`); + +INSERT INTO `PREFIX_attribute_lang` VALUES (1, 1, '2GB'),(1, 2, '2Go'),(1, 3, '2Go'),(2, 1, '4GB'),(2, 2, '4Go'),(2, 3, '4Go'),(3, 1, 'Metal'),(3, 2, 'Metal'),(3, 3, 'Metal'), +(4, 1, 'Blue'),(4, 2, 'Bleu'),(4, 3, 'Azul'),(5, 1, 'Pink'),(5, 2, 'Rose'),(5, 3, 'Rosa'),(6, 1, 'Green'),(6, 2, 'Vert'),(6, 3, 'Verde'),(7, 1, 'Orange'),(7, 2, 'Orange'), +(7, 3, 'Naranja'),(8, 1, 'Optional 64GB solid-state drive'),(8, 2, 'Disque dur SSD (solid-state drive) de 64 Go '),(8, 3, 'SSD (solid-state drive) 64 Go '), +(9, 1, '80GB Parallel ATA Drive @ 4200 rpm'),(9, 2, 'Disque dur PATA de 80 Go à 4 200 tr/min'),(9, 3, 'Disco duro PATA 80 Go 4 200 tr/min'),(10, 1, '1.60GHz Intel Core 2 Duo'), +(10, 2, 'Intel Core 2 Duo à 1,6 GHz'),(10, 3, 'Intel Core 2 Duo para 1,6 GHz'),(11, 1, '1.80GHz Intel Core 2 Duo'),(11, 2, 'Intel Core 2 Duo à 1,8 GHz'), +(11, 3, 'Intel Core 2 Duo para 1,8 GHz'),(12, 1, '80GB: 20,000 Songs'),(12, 2, '80 Go : 20 000 chansons'),(12, 3, '80 Go : 20 000 canciones'),(13, 1, '160GB: 40,000 Songs'), +(13, 2, '160 Go : 40 000 chansons'),(13, 3, '160 Go : 40 000 canciones'),(14, 2, 'Noir'),(14, 3, 'Negro'),(14, 1, 'Black'),(15, 1, '8Go'),(15, 2, '8Go'),(15, 3, '8Go'), +(16, 1, '16Go'),(16, 2, '16Go'),(16, 3, '16Go'),(17, 1, '32Go'),(17, 2, '32Go'),(17, 3, '32Go'),(1, 4, '2GB'),(2, 4, '4GB'),(3, 4, 'Metallic'), +(4, 4, 'Blau'),(5, 4, 'Pink'),(6, 4, 'Grün'),(7, 4, 'Orange'),(8, 4, 'Optionale 64 GB Solid-State-Drive'), +(9, 4, 'Parallele ATA 80GB Drive @ 4200 rpm'),(10, 4, '1.60GHz Intel Core 2 Duo'), +(11, 4, '1.80GHz Intel Core 2 Duo'),(12, 4, '80GB: 20.000 Songs'),(13, 4, '160GB: 40.000 Songs'),(14, 4, 'Schwarz'),(15, 4, '8Go'), +(16, 4, '16Go'),(17, 4, '32Go'),(1, 5, '2GB'),(2, 5, '4GB'),(3, 5, 'Metallico'), +(4, 5, 'Blu'),(5, 5, 'Rosa'),(6, 5, 'Verde'),(7, 5, 'Arancio'),(8, 5, 'Opzionale solid-state drive 64GB'), +(9, 5, '80GB Parallel ATA Drive @ 4200 rpm'),(10, 5, '1.60GHz Intel Core 2 Duo'), +(11, 5, '1.80GHz Intel Core 2 Duo'),(12, 5, '80GB: 20.000 canzoni'),(13, 5, '160GB: 40,000 canzoni'),(14, 5, 'Nero'),(15, 5, '8Go'), +(16, 5, '16Go'),(17, 5, '32Go'); + +INSERT INTO `PREFIX_attribute_lang` (`id_attribute`, `id_lang`, `name`) VALUES +(18, 1, 'Purple'),(18, 2, 'Violet'),(18, 3, 'Violeta'),(19, 1, 'Yellow'),(19, 2, 'Jaune'),(19, 3, 'Amarillo'),(20, 1, 'Red'),(20, 2, 'Rouge'),(20, 3, 'Rojo'),(18, 4, 'Violett'),(19, 4, 'Gelb'),(20, 4, 'Rot'),(18, 5, 'Viola'),(19, 5, 'Giallo'),(20, 5, 'Rosso'); + +INSERT INTO `PREFIX_product_attribute` (`id_product_attribute`, `id_product`, `reference`, `supplier_reference`, `ean13`, `wholesale_price`, `price`, `ecotax`, `quantity`, `weight`, `default_on`, `minimal_quantity`) VALUES +(30, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(29, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 1), +(28, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(27, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 1), +(26, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(25, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 4), +(7, 2, '', '', '', 0.000000, 0.00, 0.00, 10, 0, 0, 1), +(8, 2, '', '', '', 0.000000, 0.00, 0.00, 20, 0, 1, 1), +(9, 2, '', '', '', 0.000000, 0.00, 0.00, 30, 0, 0, 1), +(10, 2, '', '', '', 0.000000, 0.00, 0.00, 40, 0, 0, 1), +(12, 5, '', NULL, '', 0.000000, 751.672241, 0.00, 100, 0, 0, 1), +(13, 5, '', NULL, '', 0.000000, 0.00, 0.00, 99, 0, 1, 1), +(14, 5, '', NULL, '', 0.000000, 225.752508, 0.00, 50, 0, 0, 1), +(15, 5, '', NULL, '', 0.000000, 977.424749, 0.00, 25, 0, 0, 1), +(23, 7, '', NULL, '', 0.000000, 150.501672, 0.00, 70, 0, 0, 1), +(22, 7, '', NULL, '', 0.000000, 75.250836, 0.00, 60, 0, 0, 1), +(19, 7, '', NULL, '', 0.000000, 0.00, 0.00, 50, 0, 1, 1), +(31, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 1, 1), +(32, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(33, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 1), +(34, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(35, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 1), +(36, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(39, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 1), +(40, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1), +(41, 1, '', '', '', 0.000000, 41.806020, 0.00, 50, 0, 0, 1), +(42, 1, '', '', '', 0.000000, 0.00, 0.00, 50, 0, 0, 1); + +INSERT INTO `PREFIX_product_attribute_image` (`id_product_attribute`, `id_image`) VALUES (30, 44),(29, 44),(28, 45),(27, 45),(26, 38),(25, 38),(7, 46),(8, 47),(9, 49), +(10, 48),(12, 0),(13, 0),(14, 0),(15, 0),(23, 0),(22, 0),(19, 0),(31, 37),(32, 37),(33, 40),(34, 40),(35, 41),(36, 41),(39, 39),(40, 39),(41, 42),(42, 42); + +INSERT INTO `PREFIX_product_attribute_combination` (`id_attribute`, `id_product_attribute`) VALUES (3, 9),(3, 12),(3, 13),(3, 14),(3, 15),(3, 29),(3, 30),(4, 7),(4, 25), +(4, 26),(5, 10),(5, 35),(5, 36),(6, 8),(6, 39),(6, 40),(7, 33),(7, 34),(8, 13),(8, 15),(9, 12),(9, 14),(10, 12),(10, 13),(11, 14),(11, 15),(14, 31),(14, 32),(15, 19), +(15, 26),(15, 28),(15, 30),(15, 32),(15, 34),(15, 36),(15, 40),(15, 42),(16, 22),(16, 25),(16, 27),(16, 29),(16, 31),(16, 33),(16, 35),(16, 39),(16, 41),(17, 23),(18, 41),(18, 42),(19, 27),(19, 28); + +INSERT INTO `PREFIX_feature` (`id_feature`) VALUES (1), (2), (3), (4), (5); + +INSERT INTO `PREFIX_feature_group_shop` (`id_feature`, `id_group_shop`) (SELECT `id_feature`, 1 FROM PREFIX_feature); + +INSERT INTO `PREFIX_feature_lang` (`id_feature`, `id_lang`, `name`) VALUES +(1, 1, 'Height'), (1, 2, 'Hauteur'),(2, 1, 'Width'), (2, 2, 'Largeur'),(3, 1, 'Depth'), (3, 2, 'Profondeur'),(4, 1, 'Weight'), (4, 2, 'Poids'),(5, 1, 'Headphone'), (5, 2, 'Prise casque'), +(1, 3, 'Alto'),(2, 3, 'Ancho'),(3, 3, 'Profundo'),(4, 3, 'Peso'),(5, 3, 'Toma auriculares'), +(1, 4, 'Höhe'),(2, 4, 'Breite'),(3, 4, 'Tiefe'),(4, 4, 'Gewicht'),(5, 4, 'Kopfhörer'), +(1, 5, 'Altezza'),(2, 5, 'Larghezza'),(3, 5, 'Profondità'),(4, 5, 'Peso'),(5, 5, 'Auricolare'); + +INSERT INTO `PREFIX_feature_product` (`id_feature`, `id_product`, `id_feature_value`) VALUES +(1, 1, 11),(1, 2, 15),(2, 1, 12),(2, 2, 16),(3, 1, 14),(3, 2, 18),(4, 1, 13),(4, 2, 17),(5, 1, 10),(5, 2, 10),(3, 7, 26),(5, 7, 9),(4, 7, 25),(2, 7, 24),(1, 7, 23); + +INSERT INTO `PREFIX_feature_value` (`id_feature_value`, `id_feature`, `custom`) VALUES +(11, 1, 1),(15, 1, 1),(12, 2, 1),(16, 2, 1),(14, 3, 1),(18, 3, 1),(13, 4, 1),(17, 4, 1),(26, 3, 1),(25, 4, 1),(24, 2, 1),(23, 1, 1),(9, 5, 0),(10, 5, 0); + +INSERT INTO `PREFIX_feature_value_lang` (`id_feature_value`, `id_lang`, `value`) VALUES +(13, 1, '49.2 g'),(13, 2, '49,2 g'),(13, 3, '49,2 g'),(13, 4, '49.2 g'),(13, 5, '49.2 g'),(12, 2, '52,3 mm'),(12, 1, '2.06 in'),(12, 3, '52.3 mm'),(12, 4, '52.3 mm'),(12, 5, '52.3 mm'),(11, 2, '69,8 mm'),(11, 1, '2.75 in'),(11, 3, '69.8 mm'),(11, 4, '69.8 mm'),(11, 5, '69.8 mm'), +(17, 2, '15,5 g'),(17, 1, '15.5 g'),(17, 3, '15.5 g'),(17, 4, '15.5 g'),(17, 5, '15.5 g'),(16, 2, '41,2 mm'),(16, 1, '1.62 in'),(16, 3, '41.2 mm'),(16, 4, '41.2 mm'),(16, 5, '41.2 mm'),(15, 2, '27,3 mm'),(15, 1, '1.07 in'),(15, 3, '27.3 mm'),(15, 4, '27.3 mm'),(15, 5, '27.3 mm'),(9, 1, 'Jack stereo'),(9, 4, 'Jack stereo'),(9, 5, 'Jack stereo'), +(9, 2, 'Jack stéréo'),(9, 3, 'Jack stereo'),(10, 1, 'Mini-jack stereo'),(10, 2, 'Mini-jack stéréo'),(10, 3, 'Mini-jack stéréo'),(10, 4, 'Mini-jack stéréo'),(10, 5, 'Mini-jack stéréo'),(14, 1, '0.26 in'),(14, 2, '6,5 mm'),(14, 3, '6,5 mm'),(14, 4, '6,5 mm'),(14, 5, '6,5 mm'),(18, 4, '10,5 mm'),(18, 5, '10,5 mm)'), +(18, 1, '0.41 in (clip included)'),(18, 2, '10,5 mm (clip compris)'),(18, 3, '10,5 mm (clip incluyendo)'),(26, 2, '8 mm'),(26, 1, '0.31 in'),(26, 3, '8 mm'),(26, 4, '8 mm'),(26, 5, '8 mm'),(25, 2, '120g'),(25, 3, '120g'),(25, 4, '120g'),(25, 5, '120g'),(25, 1, '120g'),(24, 2, '70 mm'),(24, 1, '2.76 in'),(24, 3, '70 mm'),(24, 4, '70 mm'),(24, 5, '70 mm'), +(23, 2, '110 mm'),(23, 3, '110 mm'),(23, 1, '4.33 in'),(23, 4, '4.33 in'),(23, 5, '4.33 in'); + +INSERT INTO `PREFIX_image` (`id_image`, `id_product`, `position`, `cover`) VALUES +(40, 1, 4, 0),(39, 1, 3, 0),(38, 1, 2, 0),(37, 1, 1, 1),(48, 2, 3, 0),(47, 2, 2, 0),(49, 2, 4, 0),(46, 2, 1, 1),(15, 5, 1, 1),(16, 5, 2, 0),(17, 5, 3, 0),(18, 6, 4, 0),(19, 6, 5, 0), +(20, 6, 1, 1),(24, 7, 1, 1),(33, 8, 1, 1),(27, 7, 3, 0),(26, 7, 2, 0),(29, 7, 4, 0),(30, 7, 5, 0),(32, 7, 6, 0),(36, 9, 1, 1),(41, 1, 5, 0),(42, 1, 6, 0),(44, 1, 7, 0),(45, 1, 8, 0); + +INSERT INTO `PREFIX_image_shop` (`id_image`, `id_shop`) (SELECT `id_image`, 1 FROM `PREFIX_image`); + +INSERT INTO `PREFIX_image_lang` (`id_image`, `id_lang`, `legend`) VALUES +(40, 2, 'iPod Nano'),(40, 3, 'iPod Nano'),(40, 4, 'iPod Nano'),(40, 5, 'iPod Nano'),(40, 1, 'iPod Nano'),(39, 2, 'iPod Nano'),(39, 3, 'iPod Nano'),(39, 1, 'iPod Nano'),(39, 4, 'iPod Nano'),(39, 5, 'iPod Nano'), +(38, 2, 'iPod Nano'),(38, 3, 'iPod Nano'),(38, 1, 'iPod Nano'),(38, 4, 'iPod Nano'),(38, 5, 'iPod Nano'), +(37, 2, 'iPod Nano'),(37, 3, 'iPod Nano'),(37, 1, 'iPod Nano'),(37, 4, 'iPod Nano'),(37, 5, 'iPod Nano'),(48, 2, 'iPod shuffle'),(48, 3, 'iPod shuffle'),(48, 1, 'iPod shuffle'),(48, 4, 'iPod shuffle'),(48, 5, 'iPod shuffle'),(47, 2, 'iPod shuffle'),(47, 3, 'iPod shuffle'),(47, 4, 'iPod shuffle'),(47, 5, 'iPod shuffle'), +(47, 1, 'iPod shuffle'),(49, 2, 'iPod shuffle'),(49, 3, 'iPod shuffle'),(49, 1, 'iPod shuffle'),(49, 4, 'iPod shuffle'),(49, 5, 'iPod shuffle'),(46, 2, 'iPod shuffle'),(46, 3, 'iPod shuffle'),(46, 1, 'iPod shuffle'),(46, 4, 'iPod shuffle'),(46, 5, 'iPod shuffle'), +(10, 1, 'luxury-cover-for-ipod-video'),(10, 3, 'luxury-cover-for-ipod-video'),(10, 4, 'luxury-cover-for-ipod-video'),(10, 5, 'luxury-cover-for-ipod-video'),(10, 2, 'housse-luxe-pour-ipod-video'),(11, 1, 'cover'),(11, 2, 'housse'),(11, 3, 'cubrir'),(11, 4, 'cover'),(11, 5, 'cover'), +(12, 1, 'myglove-ipod-nano'),(12, 2, 'myglove-ipod-nano'),(12, 3, 'myglove-ipod-nano'),(12, 4, 'myglove-ipod-nano'),(12, 5, 'myglove-ipod-nano'),(13, 1, 'myglove-ipod-nano'),(13, 2, 'myglove-ipod-nano'),(13, 3, 'myglove-ipod-nano'),(13, 4, 'myglove-ipod-nano'),(13, 5, 'myglove-ipod-nano'), +(14, 1, 'myglove-ipod-nano'),(14, 2, 'myglove-ipod-nano'),(14, 3, 'myglove-ipod-nano'),(14, 4, 'myglove-ipod-nano'),(14, 5, 'myglove-ipod-nano'),(15, 1, 'MacBook Air'),(15, 2, 'macbook-air-1'),(15, 3, 'macbook-air-1'),(15, 4, 'macbook-air-1'),(15, 5, 'macbook-air-1'),(16, 1, 'MacBook Air'),(16, 2, 'macbook-air-2'),(16, 3, 'macbook-air-2'),(16, 4, 'macbook-air-2'),(16, 5, 'macbook-air-2'),(17, 1, 'MacBook Air'),(17, 2, 'macbook-air-3'),(17, 3, 'macbook-air-3'),(17, 4, 'macbook-air-3'),(17, 5, 'macbook-air-3'),(18, 1, 'MacBook Air'),(18, 2, 'macbook-air-4'), +(18, 3, 'macbook-air-4'),(18, 4, 'macbook-air-4'),(18, 5, 'macbook-air-4'),(19, 1, 'MacBook Air'),(19, 2, 'macbook-air-5'),(19, 3, 'macbook-air-5'),(19, 4, 'macbook-air-5'),(19, 5, 'macbook-air-5'),(20, 1, ' MacBook Air SuperDrive'),(20, 2, 'superdrive-pour-macbook-air-1'), +(20, 3, 'superdrive-pour-macbook-air-1'),(20, 4, 'superdrive-pour-macbook-air-1'),(20, 5, 'superdrive-pour-macbook-air-1'),(24, 2, 'iPod touch'),(24, 1, 'iPod touch'),(24, 3, 'iPod touch'),(24, 4, 'iPod touch'),(24, 5, 'iPod touch'),(33, 1, 'housse-portefeuille-en-cuir'),(33, 3, 'housse-portefeuille-en-cuir'),(33, 4, 'housse-portefeuille-en-cuir'),(33, 5, 'housse-portefeuille-en-cuir'), +(26, 1, 'iPod touch'),(26, 2, 'iPod touch'),(26, 3, 'iPod touch'),(26, 4, 'iPod touch'),(26, 5, 'iPod touch'),(27, 1, 'iPod touch'),(27, 2, 'iPod touch'),(27, 3, 'iPod touch'),(27, 4, 'iPod touch'),(27, 5, 'iPod touch'),(29, 1, 'iPod touch'),(29, 2, 'iPod touch'),(29, 3, 'iPod touch'),(29, 4, 'iPod touch'),(29, 5, 'iPod touch'),(30, 1, 'iPod touch'),(30, 2, 'iPod touch'),(30, 3, 'iPod touch'),(30, 4, 'iPod touch'),(30, 5, 'iPod touch'),(32, 1, 'iPod touch'),(32, 2, 'iPod touch'),(32, 3, 'iPod touch'),(32, 4, 'iPod touch'),(32, 5, 'iPod touch'), +(33, 2, 'housse-portefeuille-en-cuir-ipod-nano'),(36, 2, 'Écouteurs à isolation sonore Shure SE210'),(36, 3, 'Auriculares aislantes del sonido Shure SE210'), +(36, 1, 'Shure SE210 Sound-Isolating Earphones for iPod and iPhone'),(36, 4, 'Shure SE210 Sound-Isolating Earphones for iPod and iPhone'),(36, 5, 'Shure SE210 Sound-Isolating Earphones for iPod and iPhone'),(41, 1, 'iPod Nano'),(41, 2, 'iPod Nano'),(41, 3, 'iPod Nano'),(41, 4, 'iPod Nano'),(41, 5, 'iPod Nano'),(42, 1, 'iPod Nano'),(42, 2, 'iPod Nano'), +(42, 3, 'iPod Nano'),(42, 4, 'iPod Nano'),(42, 5, 'iPod Nano'),(44, 1, 'iPod Nano'),(44, 2, 'iPod Nano'),(44, 3, 'iPod Nano'),(44, 4, 'iPod Nano'),(44, 5, 'iPod Nano'),(45, 1, 'iPod Nano'),(45, 2, 'iPod Nano'),(45, 3, 'iPod Nano'),(45, 4, 'iPod Nano'),(45, 5, 'iPod Nano'); + +INSERT INTO `PREFIX_tag` (`id_tag`, `id_lang`, `name`) VALUES (5, 1, 'apple'),(6, 2, 'ipod'),(7, 2, 'nano'),(8, 2, 'apple'),(18, 2, 'shuffle'), +(19, 2, 'macbook'),(20, 2, 'macbookair'),(21, 2, 'air'),(22, 1, 'superdrive'),(27, 2, 'marche'),(26, 2, 'casque'),(25, 2, 'écouteurs'), +(24, 2, 'ipod touch tacticle'),(23, 1, 'Ipod touch'),(28, 1, 'ipod'),(29, 1, 'nano'),(30, 3, 'ipod'),(31, 3, 'nano'),(32, 3, 'apple'),(33, 1, 'shuffle'), +(34, 3, 'shuffle'),(35, 2, 'superdrive'),(36, 3, 'superdrive'),(37, 3, 'Ipod touch'); + +INSERT INTO `PREFIX_product_tag` (`id_product`, `id_tag`) VALUES (1, 5),(1, 6),(1, 7),(1, 8),(1, 28),(1, 29),(1, 30),(1, 31),(1, 32),(2, 6),(2, 18),(2, 28), +(2, 30),(2, 33),(2, 34),(5, 8),(5, 19),(5, 20),(5, 21),(6, 5),(6, 8),(6, 22),(6, 32),(6, 35),(6, 36),(7, 23),(7, 24),(7, 37),(9, 25),(9, 26),(9, 27); + +INSERT INTO `PREFIX_alias` (`alias`, `search`, `active`, `id_alias`) VALUES ('piod', 'ipod', 1, 4),('ipdo', 'ipod', 1, 3); +INSERT INTO `PREFIX_order_message` (`id_order_message`, `date_add`) VALUES (1, NOW()); +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 1, 'Delay', 'Hi, + +Unfortunately, an item on your order is currently out of stock. This may cause a slight delay in delivery. +Please accept our apologies and rest assured that we are working hard to rectify this. + +Best regards,'); + +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 2, 'Délai', 'Bonjour, + +Un des éléments de votre commande est actuellement en réapprovisionnement, ce qui peut légèrement retarder son envoi. + +Merci de votre compréhension. + +Cordialement,'); + +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 3, 'Plazo', 'Hola, + +Uno de los elementos de su solicitud se encuentra actualmente la reposición, el cual poco puede retrasar el envío. + +Gracias por su comprensión. + +Saludos cordiales,'); + +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 4, 'Frist', 'Hi, + +Leider ist einer der Artikel aus Ihrer Bestellung momentan nicht auf Lager. Dies kann zu einer leichten Lieferverzögerung führen. Wir entschuldigen uns hierfür und bemühen uns schnellstens um Abhilfe. + +Mit freundlichen Grüßen,'); + +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 5, 'Ritardo', 'Salve, + +purtroppo un articolo che hai ordinato non è al momento in magazzino. Questo potrebbe provocare un leggero ritardo nella consegna. +Ti preghiamo di scusarci; ci stiamo organizzando per ovviare a questo inconveniente. + +Cordialmente,'); + +/* Block CMS module*/ + +INSERT INTO `PREFIX_cms_block` (`id_cms_block`, `id_cms_category`, `name`, `location`, `position`) VALUES(1, 1, '', 0, 0); +INSERT INTO `PREFIX_cms_block_page` (`id_cms_block_page`, `id_cms_block`, `id_cms`, `is_category`) VALUES(1, 1, 1, 0), (2, 1, 2, 0), (3, 1, 3, 0), (4, 1, 4, 0), (5, 1, 5, 0); +INSERT INTO `PREFIX_cms_block_lang` (`id_cms_block`, `id_lang`, `name`) VALUES (1, 1, 'Information'),(1, 2, 'Informations'),(1, 3, 'Informaciónes'),(1, 4, 'Information'),(1, 5, 'Informazioni'); + +/* Currency/Country module */ +INSERT INTO `PREFIX_module_currency` (`id_module`, `id_currency`) VALUES (3, 1),(3, 2),(3, 3),(4, 1),(4, 2),(4, 3),(6, 1),(6, 2),(6, 3); +INSERT INTO `PREFIX_module_group` (`id_module`, `id_group`) VALUES (3, 1),(4, 1),(6, 1); + +INSERT INTO `PREFIX_module_country` (`id_module`, `id_country`) VALUES (3, 1),(3, 2),(3, 3),(3, 4),(3, 5),(3, 6),(3, 7),(3, 8), +(3, 9),(3, 10),(3, 11),(3, 12),(3, 13),(3, 14),(3, 15),(3, 16),(3, 17),(3, 18),(3, 19),(3, 20),(3, 21),(3, 22),(3, 23),(3, 24), +(3, 25),(3, 26),(3, 27),(3, 28),(3, 29),(3, 30),(3, 31),(3, 32),(3, 33),(3, 34),(4, 1),(4, 2),(4, 3),(4, 4),(4, 5),(4, 6),(4, 7), +(4, 8),(4, 9),(4, 10),(4, 11),(4, 12),(4, 13),(4, 14),(4, 15),(4, 16),(4, 17),(4, 18),(4, 19),(4, 20),(4, 21),(4, 22),(4, 23), +(4, 24),(4, 25),(4, 26),(4, 27),(4, 28),(4, 29),(4, 30),(4, 31),(4, 32),(4, 33),(4, 34),(6, 1),(6, 2),(6, 3),(6, 4),(6, 5),(6, 6), +(6, 7),(6, 8),(6, 9),(6, 10),(6, 11),(6, 12),(6, 13),(6, 14),(6, 15),(6, 16),(6, 17),(6, 18),(6, 19),(6, 20),(6, 21),(6, 22),(6, 23), +(6, 24),(6, 25),(6, 26),(6, 27),(6, 28),(6, 29),(6, 30),(6, 31),(6, 32),(6, 33),(6, 34); + +INSERT INTO `PREFIX_search_index` (`id_product`, `id_word`, `weight`) VALUES (1, 1, 10),(1, 2, 10),(1, 3, 2),(1, 4, 1),(1, 5, 1),(1, 6, 1), +(1, 7, 1),(1, 8, 1),(1, 9, 1),(1, 10, 1),(1, 11, 1),(1, 12, 1),(1, 13, 1),(1, 14, 1),(1, 15, 1),(1, 16, 2),(1, 17, 1),(1, 18, 1),(1, 19, 1), +(1, 20, 1),(1, 21, 1),(1, 22, 1),(1, 23, 1),(1, 24, 1),(1, 25, 1),(1, 26, 1),(1, 27, 1),(1, 28, 1),(1, 29, 1),(1, 30, 1),(1, 31, 2), +(1, 32, 1),(1, 33, 1),(1, 34, 1),(1, 35, 1),(1, 36, 1),(1, 37, 1),(1, 38, 5),(1, 39, 1),(1, 40, 1),(1, 41, 1),(1, 42, 1),(1, 43, 1), +(1, 44, 1),(1, 45, 1),(1, 46, 1),(1, 47, 1),(1, 48, 1),(1, 49, 1),(1, 50, 1),(1, 51, 2),(1, 52, 2),(1, 53, 1),(1, 54, 1),(1, 55, 1), +(1, 56, 1),(1, 57, 1),(1, 58, 1),(1, 59, 1),(1, 60, 1),(1, 61, 1),(1, 62, 1),(1, 63, 1),(1, 64, 1),(1, 65, 1),(1, 66, 1),(1, 67, 3), +(1, 68, 3),(1, 69, 3),(1, 70, 4),(1, 71, 16),(1, 72, 4),(1, 73, 4),(1, 74, 4),(1, 75, 4),(1, 76, 4),(1, 77, 4),(1, 78, 4),(1, 79, 2), +(1, 80, 2),(1, 81, 2),(1, 82, 12),(1, 83, 12),(1, 84, 1),(1, 85, 2),(1, 86, 1),(1, 87, 2),(1, 88, 1),(1, 89, 1),(1, 90, 2),(1, 91, 1), +(1, 92, 1),(1, 93, 1),(1, 94, 1),(1, 95, 4),(1, 96, 1),(1, 97, 1),(1, 98, 1),(1, 99, 1),(1, 100, 1),(1, 101, 1),(1, 102, 1), +(1, 103, 1),(1, 104, 1),(1, 105, 1),(1, 106, 1),(1, 107, 1),(1, 108, 1),(1, 109, 2),(1, 110, 1),(1, 111, 1),(1, 112, 1),(1, 113, 1), +(1, 114, 1),(1, 115, 2),(1, 116, 2),(1, 117, 1),(1, 118, 3),(1, 119, 1),(1, 120, 1),(1, 121, 1),(1, 122, 1),(1, 123, 1),(1, 124, 1), +(1, 125, 1),(1, 126, 1),(1, 127, 1),(1, 128, 1),(1, 129, 1),(1, 130, 1),(1, 131, 1),(1, 132, 1),(1, 133, 1),(1, 134, 1),(1, 135, 1), +(1, 136, 1),(1, 137, 1),(1, 138, 1),(1, 139, 1),(1, 140, 1),(1, 141, 1),(1, 142, 1),(1, 143, 1),(1, 144, 1),(1, 145, 3),(1, 146, 7), +(1, 147, 3),(1, 148, 4),(1, 149, 16),(1, 150, 4),(1, 151, 4),(1, 152, 4),(1, 153, 4),(1, 154, 4),(1, 155, 4),(1, 156, 4),(1, 157, 2), +(1, 158, 2),(1, 159, 2),(1, 160, 9),(1, 161, 8),(1, 162, 1),(1, 163, 2),(1, 164, 1),(1, 165, 1),(1, 166, 1),(1, 167, 1),(1, 168, 1), +(1, 169, 1),(1, 170, 2),(1, 171, 1),(1, 172, 1),(1, 173, 4),(1, 174, 1),(1, 175, 1),(1, 176, 1),(1, 177, 1),(1, 178, 1),(1, 179, 1), +(1, 180, 1),(1, 181, 1),(1, 182, 1),(1, 183, 1),(1, 184, 1),(1, 185, 1),(1, 186, 1),(1, 187, 1),(1, 188, 1),(1, 189, 1),(1, 190, 1), +(1, 191, 1),(1, 192, 1),(1, 193, 1),(1, 194, 1),(1, 195, 1),(1, 196, 1),(1, 197, 1),(1, 198, 1),(1, 199, 1),(1, 200, 1),(1, 201, 1), +(1, 202, 1),(1, 203, 1),(1, 204, 1),(1, 205, 1),(1, 206, 1),(1, 207, 1),(1, 208, 1),(1, 209, 1),(1, 210, 1),(1, 211, 1),(1, 212, 1), +(1, 213, 1),(1, 214, 1),(1, 215, 1),(1, 216, 1),(1, 217, 1),(1, 218, 1),(1, 219, 1),(1, 220, 1),(1, 221, 1),(1, 222, 3),(1, 223, 3), +(1, 224, 3),(1, 225, 4),(1, 226, 16),(1, 227, 4),(1, 228, 4),(1, 229, 4),(1, 230, 4),(1, 231, 4),(1, 232, 4),(1, 233, 4),(1, 234, 2), +(1, 235, 2),(2, 1, 11),(2, 56, 10),(2, 236, 1),(2, 237, 1),(2, 238, 1),(2, 239, 1),(2, 57, 2),(2, 240, 1),(2, 241, 1),(2, 242, 2), +(2, 243, 1),(2, 244, 2),(2, 245, 2),(2, 246, 2),(2, 247, 1),(2, 248, 1),(2, 249, 1),(2, 45, 1),(2, 38, 7),(2, 250, 1),(2, 251, 1),(2, 252, 1), +(2, 253, 1),(2, 254, 1),(2, 255, 1),(2, 256, 1),(2, 257, 1),(2, 19, 1),(2, 258, 1),(2, 259, 1),(2, 260, 1),(2, 261, 1),(2, 262, 1),(2, 263, 1), +(2, 264, 1),(2, 265, 1),(2, 266, 1),(2, 267, 1),(2, 268, 1),(2, 269, 1),(2, 270, 1),(2, 271, 1),(2, 272, 1),(2, 273, 1),(2, 274, 1),(2, 3, 1), +(2, 275, 1),(2, 276, 1),(2, 277, 1),(2, 67, 3),(2, 68, 3),(2, 69, 3),(2, 73, 2),(2, 77, 2),(2, 70, 2),(2, 76, 2),(2, 278, 2),(2, 279, 2), +(2, 80, 2),(2, 81, 2),(2, 82, 15),(2, 280, 14),(2, 281, 1),(2, 282, 1),(2, 90, 2),(2, 283, 1),(2, 284, 1),(2, 285, 1),(2, 286, 1),(2, 287, 2), +(2, 288, 2),(2, 154, 3),(2, 289, 2),(2, 290, 1),(2, 291, 1),(2, 292, 1),(2, 0, 1),(2, 126, 2),(2, 294, 1),(2, 118, 7),(2, 295, 1),(2, 296, 1), +(2, 297, 1),(2, 298, 1),(2, 299, 1),(2, 300, 1),(2, 301, 1),(2, 302, 1),(2, 95, 1),(2, 136, 2),(2, 303, 1),(2, 88, 2),(2, 304, 1),(2, 100, 2), +(2, 101, 2),(2, 305, 1),(2, 306, 1),(2, 307, 1),(2, 308, 1),(2, 309, 1),(2, 310, 1),(2, 311, 1),(2, 312, 1),(2, 313, 1),(2, 314, 1),(2, 315, 1), +(2, 316, 1),(2, 317, 1),(2, 109, 1),(2, 318, 1),(2, 319, 1),(2, 320, 1),(2, 321, 1),(2, 322, 1),(2, 323, 1),(2, 124, 1),(2, 324, 1),(2, 325, 1), +(2, 85, 1),(2, 326, 1),(2, 327, 1),(2, 328, 1),(2, 329, 1),(2, 330, 1),(2, 331, 1),(2, 332, 1),(2, 333, 1),(2, 334, 1),(2, 145, 3),(2, 146, 3), +(2, 147, 3),(2, 151, 2),(2, 155, 2),(2, 148, 2),(2, 335, 2),(2, 336, 2),(2, 158, 2),(2, 159, 2),(2, 160, 11),(2, 337, 10),(2, 338, 1),(2, 339, 1), +(2, 340, 1),(2, 341, 1),(2, 166, 2),(2, 342, 2),(2, 343, 2),(2, 231, 3),(2, 344, 2),(2, 345, 1),(2, 346, 1),(2, 347, 1),(2, 348, 1),(2, 202, 2), +(2, 349, 1),(2, 350, 1),(2, 351, 1),(2, 352, 1),(2, 353, 1),(2, 354, 1),(2, 355, 1),(2, 356, 1),(2, 357, 1),(2, 213, 3),(2, 358, 1),(2, 359, 1), +(2, 179, 2),(2, 180, 2),(2, 360, 1),(2, 361, 1),(2, 362, 1),(2, 363, 1),(2, 364, 1),(2, 365, 1),(2, 366, 1),(2, 367, 1),(2, 368, 1),(2, 369, 1), +(2, 370, 1),(2, 371, 1),(2, 372, 1),(2, 373, 1),(2, 374, 1),(2, 375, 1),(2, 376, 1),(2, 377, 1),(2, 378, 1),(2, 163, 1),(2, 379, 1),(2, 184, 1), +(2, 380, 1),(2, 381, 1),(2, 204, 1),(2, 382, 1),(2, 383, 1),(2, 384, 1),(2, 222, 3),(2, 223, 3),(2, 224, 3),(2, 228, 2),(2, 232, 2),(2, 225, 2), +(2, 385, 2),(2, 386, 2),(2, 234, 2),(2, 235, 2),(5, 387, 10),(5, 388, 1),(5, 389, 1),(5, 390, 1),(5, 391, 1),(5, 392, 1),(5, 393, 1),(5, 394, 1), +(5, 395, 1),(5, 396, 1),(5, 397, 1),(5, 398, 2),(5, 399, 1),(5, 400, 1),(5, 401, 1),(5, 402, 2),(5, 403, 2),(5, 404, 1),(5, 3, 1),(5, 51, 2), +(5, 405, 1),(5, 406, 1),(5, 407, 1),(5, 408, 1),(5, 409, 1),(5, 410, 1),(5, 411, 1),(5, 38, 1),(5, 412, 1),(5, 413, 1),(5, 414, 1),(5, 415, 1), +(5, 416, 1),(5, 47, 1),(5, 417, 1),(5, 418, 1),(5, 419, 2),(5, 420, 1),(5, 421, 1),(5, 422, 1),(5, 423, 1),(5, 424, 1),(5, 425, 1),(5, 426, 1), +(5, 427, 1),(5, 428, 1),(5, 429, 1),(5, 430, 1),(5, 431, 1),(5, 432, 1),(5, 433, 1),(5, 434, 1),(5, 435, 1),(5, 436, 1),(5, 437, 1),(5, 438, 2), +(5, 439, 1),(5, 440, 1),(5, 441, 1),(5, 442, 1),(5, 443, 1),(5, 444, 1),(5, 445, 9),(5, 446, 1),(5, 447, 1),(5, 448, 1),(5, 449, 1),(5, 450, 1), +(5, 451, 1),(5, 452, 1),(5, 453, 1),(5, 454, 1),(5, 65, 1),(5, 455, 1),(5, 456, 1),(5, 457, 1),(5, 458, 1),(5, 237, 2),(5, 459, 1),(5, 460, 1), +(5, 461, 1),(5, 462, 1),(5, 463, 1),(5, 464, 1),(5, 465, 1),(5, 466, 1),(5, 467, 1),(5, 468, 1),(5, 469, 1),(5, 470, 1),(5, 471, 1),(5, 472, 1), +(5, 473, 1),(5, 474, 1),(5, 475, 1),(5, 476, 1),(5, 477, 3),(5, 68, 3),(5, 69, 3),(5, 70, 8),(5, 478, 4),(5, 479, 4),(5, 480, 4),(5, 481, 4), +(5, 482, 8),(5, 483, 8),(5, 484, 4),(5, 485, 4),(5, 486, 4),(5, 487, 4),(5, 488, 14),(5, 489, 3),(5, 490, 1),(5, 283, 2),(5, 491, 1),(5, 103, 2), +(5, 492, 1),(5, 493, 1),(5, 494, 1),(5, 495, 1),(5, 496, 1),(5, 497, 1),(5, 498, 1),(5, 499, 2),(5, 500, 3),(5, 501, 1),(5, 502, 1),(5, 503, 1), +(5, 504, 2),(5, 505, 2),(5, 506, 1),(5, 124, 2),(5, 85, 1),(5, 131, 2),(5, 507, 1),(5, 508, 1),(5, 509, 1),(5, 510, 1),(5, 511, 1),(5, 114, 1), +(5, 512, 1),(5, 513, 1),(5, 514, 1),(5, 118, 1),(5, 515, 1),(5, 516, 1),(5, 517, 1),(5, 518, 1),(5, 519, 1),(5, 520, 1),(5, 521, 1),(5, 522, 1), +(5, 523, 5),(5, 524, 1),(5, 525, 1),(5, 526, 1),(5, 527, 2),(5, 528, 1),(5, 529, 1),(5, 530, 1),(5, 531, 1),(5, 532, 1),(5, 109, 1),(5, 533, 1), +(5, 534, 1),(5, 535, 1),(5, 536, 1),(5, 537, 1),(5, 538, 1),(5, 539, 2),(5, 540, 1),(5, 541, 1),(5, 542, 1),(5, 543, 1),(5, 544, 1),(5, 545, 1), +(5, 546, 9),(5, 90, 2),(5, 547, 1),(5, 548, 1),(5, 549, 1),(5, 550, 1),(5, 551, 1),(5, 552, 1),(5, 553, 1),(5, 554, 1),(5, 555, 1),(5, 556, 1), +(5, 557, 1),(5, 558, 1),(5, 559, 1),(5, 95, 2),(5, 560, 1),(5, 561, 1),(5, 562, 2),(5, 563, 1),(5, 564, 1),(5, 565, 1),(5, 566, 1),(5, 88, 1), +(5, 567, 1),(5, 568, 1),(5, 569, 1),(5, 570, 1),(5, 571, 1),(5, 572, 1),(5, 573, 1),(5, 574, 1),(5, 575, 1),(5, 576, 1),(5, 577, 1),(5, 578, 1), +(5, 579, 1),(5, 580, 1),(5, 581, 1),(5, 582, 1),(5, 583, 3),(5, 146, 7),(5, 147, 3),(5, 584, 4),(5, 148, 8),(5, 585, 4),(5, 586, 8),(5, 587, 8), +(5, 588, 4),(5, 589, 4),(5, 590, 11),(5, 591, 3),(5, 592, 1),(5, 340, 2),(5, 593, 1),(5, 181, 2),(5, 594, 1),(5, 595, 1),(5, 596, 1),(5, 597, 1), +(5, 598, 1),(5, 371, 1),(5, 599, 1),(5, 600, 1),(5, 601, 3),(5, 162, 1),(5, 602, 1),(5, 603, 1),(5, 604, 1),(5, 605, 1),(5, 606, 1),(5, 607, 1), +(5, 163, 1),(5, 608, 1),(5, 609, 1),(5, 610, 1),(5, 611, 1),(5, 190, 1),(5, 612, 1),(5, 613, 1),(5, 614, 3),(5, 354, 1),(5, 615, 1),(5, 616, 1), +(5, 617, 1),(5, 618, 1),(5, 619, 1),(5, 620, 1),(5, 621, 2),(5, 622, 1),(5, 623, 1),(5, 624, 2),(5, 625, 1),(5, 626, 1),(5, 627, 1),(5, 628, 1), +(5, 629, 1),(5, 630, 1),(5, 631, 1),(5, 632, 1),(5, 633, 1),(5, 634, 1),(5, 635, 1),(5, 636, 1),(5, 637, 1),(5, 638, 1),(5, 639, 1),(5, 640, 1), +(5, 641, 1),(5, 642, 1),(5, 643, 1),(5, 644, 1),(5, 645, 5),(5, 646, 5),(5, 348, 1),(5, 647, 1),(5, 648, 1),(5, 649, 1),(5, 650, 1),(5, 651, 1), +(5, 652, 1),(5, 653, 1),(5, 654, 1),(5, 655, 1),(5, 173, 11),(5, 656, 1),(5, 657, 1),(5, 658, 1),(5, 659, 1),(5, 660, 1),(5, 661, 1),(5, 662, 2), +(5, 663, 1),(5, 664, 1),(5, 665, 1),(5, 666, 1),(5, 667, 1),(5, 668, 1),(5, 669, 1),(5, 670, 1),(5, 671, 1),(5, 672, 1),(5, 673, 1),(5, 674, 1), +(5, 675, 1),(5, 676, 1),(5, 677, 1),(5, 678, 1),(5, 679, 1),(5, 680, 1),(5, 681, 1),(5, 682, 3),(5, 223, 3),(5, 224, 3),(5, 225, 8),(5, 683, 4), +(5, 684, 8),(5, 685, 8),(5, 686, 4),(5, 687, 4),(6, 387, 9),(6, 688, 1),(6, 689, 1),(6, 690, 1),(6, 691, 1),(6, 692, 1),(6, 693, 1),(6, 694, 1), +(6, 695, 1),(6, 402, 1),(6, 696, 1),(6, 697, 1),(6, 698, 1),(6, 699, 1),(6, 700, 1),(6, 47, 1),(6, 701, 1),(6, 702, 1),(6, 703, 1),(6, 704, 1), +(6, 705, 1),(6, 706, 1),(6, 415, 1),(6, 707, 1),(6, 444, 1),(6, 708, 1),(6, 709, 1),(6, 710, 1),(6, 711, 1),(6, 712, 1),(6, 713, 1),(6, 714, 1), +(6, 715, 1),(6, 716, 1),(6, 717, 1),(6, 718, 1),(6, 719, 1),(6, 409, 1),(6, 720, 1),(6, 721, 1),(6, 242, 1),(6, 38, 1),(6, 722, 1),(6, 723, 1), +(6, 724, 1),(6, 477, 3),(6, 68, 7),(6, 69, 3),(6, 725, 4),(6, 488, 9),(6, 109, 1),(6, 726, 1),(6, 727, 1),(6, 728, 1),(6, 729, 1),(6, 327, 1),(6, 730, 1), +(6, 731, 1),(6, 732, 1),(6, 505, 1),(6, 733, 1),(6, 734, 1),(6, 735, 1),(6, 736, 1),(6, 737, 1),(6, 738, 1),(6, 739, 1),(6, 740, 1),(6, 510, 1),(6, 741, 1), +(6, 124, 1),(6, 553, 1),(6, 132, 1),(6, 523, 1),(6, 546, 1),(6, 90, 1),(6, 742, 1),(6, 500, 1),(6, 743, 1),(6, 744, 1),(6, 95, 2),(6, 580, 1), +(6, 745, 1),(6, 746, 1),(6, 747, 1),(6, 748, 1),(6, 749, 1),(6, 750, 1),(6, 751, 1),(6, 88, 1),(6, 752, 1),(6, 753, 1),(6, 754, 1),(6, 755, 1), +(6, 756, 1),(6, 757, 1),(6, 758, 1),(6, 583, 3),(6, 146, 3),(6, 147, 3),(6, 590, 9),(6, 759, 1),(6, 637, 1),(6, 760, 1),(6, 221, 1),(6, 761, 1), +(6, 356, 1),(6, 762, 1),(6, 763, 1),(6, 764, 1),(6, 606, 2),(6, 765, 1),(6, 766, 1),(6, 767, 1),(6, 768, 1),(6, 769, 1),(6, 770, 1),(6, 771, 1), +(6, 772, 1),(6, 653, 1),(6, 208, 1),(6, 209, 1),(6, 645, 1),(6, 646, 1),(6, 773, 1),(6, 774, 1),(6, 348, 1),(6, 173, 2),(6, 679, 1),(6, 775, 1), +(6, 776, 1),(6, 777, 1),(6, 778, 1),(6, 779, 1),(6, 780, 1),(6, 781, 1),(6, 782, 1),(6, 783, 1),(6, 784, 1),(6, 785, 1),(6, 786, 1),(6, 165, 1), +(6, 787, 1),(6, 682, 3),(6, 223, 3),(6, 224, 3),(7, 1, 11),(7, 788, 12),(7, 789, 2),(7, 427, 2),(7, 790, 1),(7, 791, 2),(7, 422, 1),(7, 792, 1), +(7, 793, 2),(7, 461, 2),(7, 794, 1),(7, 411, 1),(7, 795, 1),(7, 796, 1),(7, 797, 1),(7, 798, 1),(7, 799, 1),(7, 800, 1),(7, 259, 1),(7, 57, 1), +(7, 801, 1),(7, 802, 1),(7, 803, 1),(7, 804, 1),(7, 723, 1),(7, 60, 1),(7, 805, 1),(7, 806, 1),(7, 807, 1),(7, 51, 4),(7, 808, 1),(7, 809, 1), +(7, 810, 1),(7, 811, 1),(7, 812, 1),(7, 813, 1),(7, 814, 1),(7, 815, 1),(7, 816, 1),(7, 817, 1),(7, 818, 1),(7, 456, 1),(7, 819, 1),(7, 820, 1), +(7, 821, 1),(7, 822, 1),(7, 823, 1),(7, 38, 4),(7, 824, 1),(7, 825, 1),(7, 242, 1),(7, 826, 1),(7, 827, 1),(7, 37, 1),(7, 828, 1),(7, 829, 1), +(7, 830, 1),(7, 831, 1),(7, 832, 1),(7, 833, 1),(7, 834, 1),(7, 835, 1),(7, 836, 1),(7, 837, 1),(7, 838, 1),(7, 839, 1),(7, 840, 1),(7, 841, 1), +(7, 65, 1),(7, 842, 1),(7, 843, 1),(7, 844, 1),(7, 241, 1),(7, 845, 1),(7, 434, 1),(7, 846, 2),(7, 847, 1),(7, 722, 1),(7, 848, 1),(7, 849, 1), +(7, 850, 1),(7, 851, 1),(7, 852, 1),(7, 700, 1),(7, 853, 1),(7, 854, 1),(7, 855, 1),(7, 856, 1),(7, 857, 1),(7, 67, 3),(7, 858, 2),(7, 71, 2), +(7, 859, 2),(7, 81, 2),(7, 860, 2),(7, 861, 2),(7, 862, 2),(7, 82, 11),(7, 863, 11),(7, 864, 1),(7, 531, 2),(7, 865, 2),(7, 525, 1),(7, 866, 1), +(7, 867, 1),(7, 868, 1),(7, 869, 1),(7, 870, 1),(7, 308, 1),(7, 565, 1),(7, 871, 1),(7, 872, 1),(7, 873, 1),(7, 874, 2),(7, 875, 1),(7, 876, 1), +(7, 877, 2),(7, 878, 6),(7, 879, 3),(7, 880, 1),(7, 86, 1),(7, 757, 1),(7, 881, 1),(7, 882, 1),(7, 883, 2),(7, 884, 1),(7, 885, 2),(7, 886, 1), +(7, 887, 1),(7, 131, 2),(7, 888, 1),(7, 889, 1),(7, 890, 1),(7, 891, 1),(7, 892, 1),(7, 893, 1),(7, 894, 1),(7, 895, 1),(7, 896, 1),(7, 897, 1), +(7, 898, 1),(7, 899, 1),(7, 900, 1),(7, 901, 1),(7, 902, 1),(7, 903, 1),(7, 904, 1),(7, 905, 1),(7, 906, 1),(7, 907, 1),(7, 118, 2),(7, 136, 1), +(7, 576, 1),(7, 908, 1),(7, 909, 1),(7, 910, 1),(7, 911, 1),(7, 912, 1),(7, 524, 1),(7, 913, 1),(7, 109, 2),(7, 570, 1),(7, 914, 1),(7, 915, 1), +(7, 916, 2),(7, 917, 1),(7, 918, 1),(7, 919, 1),(7, 920, 1),(7, 921, 1),(7, 922, 1),(7, 923, 1),(7, 924, 1),(7, 925, 1),(7, 124, 2),(7, 926, 1), +(7, 927, 1),(7, 928, 1),(7, 318, 1),(7, 929, 1),(7, 930, 1),(7, 931, 1),(7, 932, 1),(7, 933, 1),(7, 334, 1),(7, 934, 1),(7, 935, 1),(7, 936, 1), +(7, 500, 1),(7, 937, 1),(7, 938, 1),(7, 939, 1),(7, 940, 1),(7, 941, 1),(7, 942, 1),(7, 943, 1),(7, 734, 1),(7, 944, 1),(7, 945, 1),(7, 946, 1), +(7, 947, 1),(7, 948, 1),(7, 949, 1),(7, 567, 1),(7, 145, 3),(7, 950, 4),(7, 951, 2),(7, 149, 2),(7, 952, 2),(7, 159, 2),(7, 953, 2),(7, 954, 2), +(7, 955, 2),(7, 160, 7),(7, 956, 7),(7, 957, 1),(7, 628, 2),(7, 958, 2),(7, 621, 3),(7, 622, 1),(7, 959, 1),(7, 960, 2),(7, 665, 2),(7, 961, 1), +(7, 962, 1),(7, 963, 2),(7, 964, 1),(7, 362, 1),(7, 965, 1),(7, 966, 1),(7, 967, 1),(7, 968, 2),(7, 969, 1),(7, 970, 1),(7, 971, 2),(7, 972, 1), +(7, 164, 1),(7, 165, 1),(7, 973, 1),(7, 974, 2),(7, 975, 1),(7, 976, 2),(7, 977, 1),(7, 978, 1),(7, 979, 1),(7, 980, 1),(7, 981, 1),(7, 982, 1), +(7, 983, 1),(7, 984, 1),(7, 985, 1),(7, 986, 1),(7, 987, 1),(7, 988, 1),(7, 989, 1),(7, 990, 1),(7, 991, 2),(7, 992, 1),(7, 993, 1),(7, 994, 1), +(7, 995, 1),(7, 615, 2),(7, 213, 1),(7, 996, 1),(7, 204, 1),(7, 997, 1),(7, 998, 1),(7, 764, 1),(7, 999, 1),(7, 1000, 1),(7, 1001, 1), +(7, 1002, 2),(7, 1003, 2),(7, 1004, 4),(7, 1005, 2),(7, 1006, 1),(7, 1007, 1),(7, 1008, 1),(7, 1009, 1),(7, 371, 1),(7, 1010, 1),(7, 1011, 1), +(7, 1012, 1),(7, 1013, 1),(7, 1014, 1),(7, 1015, 1),(7, 1016, 1),(7, 1017, 1),(7, 1018, 1),(7, 384, 1),(7, 1019, 1),(7, 1020, 1),(7, 1021, 1), +(7, 1022, 1),(7, 1023, 1),(7, 1024, 1),(7, 606, 1),(7, 765, 1),(7, 1025, 1),(7, 1026, 1),(7, 1027, 1),(7, 1028, 1),(7, 1029, 1),(7, 1030, 1), +(7, 1031, 1),(7, 1032, 1),(7, 1033, 1),(7, 222, 3),(7, 1034, 2),(7, 226, 2),(7, 1035, 2),(7, 235, 2),(7, 1036, 2),(7, 1037, 2),(7, 1038, 2), +(8, 1039, 6),(8, 1040, 6),(8, 1041, 6),(8, 1042, 6),(8, 1043, 6),(8, 1, 6),(8, 2, 6),(8, 1044, 6),(8, 1045, 6),(8, 1046, 2),(8, 1047, 2), +(8, 1048, 3),(8, 1049, 6),(8, 1050, 6),(8, 1051, 8),(8, 1052, 6),(8, 1053, 6),(8, 152, 6),(8, 1054, 6),(8, 1055, 1),(8, 1056, 1),(8, 1057, 1), +(8, 1058, 1),(8, 1059, 1),(8, 1060, 1),(8, 1061, 1),(8, 1062, 1),(8, 1063, 1),(8, 1064, 1),(8, 1065, 1),(8, 1066, 1),(8, 1067, 1),(8, 109, 1), +(8, 570, 1),(8, 1068, 1),(8, 118, 3),(8, 82, 1),(8, 1069, 1),(8, 124, 1),(8, 926, 1),(8, 882, 1),(8, 1070, 1),(8, 1071, 1),(8, 730, 1),(8, 1072, 2), +(8, 1073, 1),(8, 1074, 1),(8, 1075, 1),(8, 1076, 1),(8, 944, 1),(8, 1077, 1),(8, 1078, 1),(8, 1079, 3),(8, 1080, 6),(8, 1081, 6),(8, 1082, 6), +(8, 1083, 6),(8, 229, 6),(8, 1084, 6),(8, 1085, 1),(8, 1023, 1),(8, 1086, 2),(8, 1087, 1),(8, 1088, 1),(8, 1089, 1),(8, 1090, 1),(8, 1091, 1), +(8, 1092, 1),(8, 1093, 1),(8, 1094, 1),(8, 1095, 1),(8, 1096, 1),(8, 1097, 1),(8, 163, 1),(8, 1098, 1),(8, 1099, 1),(8, 669, 1),(8, 1100, 1), +(8, 160, 1),(8, 1101, 1),(8, 1013, 1),(8, 1102, 1),(8, 1103, 1),(8, 1104, 1),(8, 762, 1),(8, 1105, 2),(8, 1106, 1),(8, 1107, 1),(8, 1108, 1), +(8, 1109, 1),(8, 1025, 1),(8, 1110, 1),(8, 1111, 1),(8, 1112, 1),(8, 1113, 3),(9, 1114, 11),(9, 1115, 9),(9, 1116, 7),(9, 850, 8),(9, 1, 8), +(9, 1117, 8),(9, 1118, 1),(9, 442, 4),(9, 41, 1),(9, 1119, 1),(9, 826, 1),(9, 1120, 1),(9, 1121, 1),(9, 1122, 1),(9, 1123, 1),(9, 1124, 2),(9, 1125, 1), +(9, 1126, 1),(9, 1127, 2),(9, 1128, 3),(9, 20, 1),(9, 1129, 1),(9, 1130, 1),(9, 1131, 1),(9, 1132, 1),(9, 1133, 3),(9, 1134, 1),(9, 1135, 1), +(9, 1136, 1),(9, 1137, 1),(9, 3, 3),(9, 1138, 1),(9, 1139, 1),(9, 1140, 1),(9, 1141, 1),(9, 38, 2),(9, 840, 1),(9, 1142, 1),(9, 238, 2),(9, 1143, 1), +(9, 1144, 1),(9, 1145, 2),(9, 430, 1),(9, 845, 1),(9, 81, 1),(9, 1146, 1),(9, 1147, 1),(9, 1148, 1),(9, 1149, 1),(9, 805, 1),(9, 1150, 1),(9, 1151, 1), +(9, 1152, 1),(9, 1153, 1),(9, 1154, 1),(9, 1155, 1),(9, 1156, 1),(9, 1157, 1),(9, 4, 1),(9, 1158, 2),(9, 51, 5),(9, 1159, 1),(9, 1160, 1),(9, 1161, 1), +(9, 1162, 1),(9, 1163, 1),(9, 1164, 1),(9, 851, 4),(9, 1165, 1),(9, 1166, 1),(9, 1167, 1),(9, 1168, 1),(9, 1169, 1),(9, 1170, 1),(9, 1171, 1),(9, 1172, 1), +(9, 448, 1),(9, 1173, 1),(9, 1174, 1),(9, 1175, 1),(9, 1176, 1),(9, 1177, 1),(9, 1178, 1),(9, 1179, 1),(9, 1180, 1),(9, 1181, 1),(9, 1182, 1),(9, 1183, 1), +(9, 1184, 1),(9, 1185, 1),(9, 1186, 1),(9, 1187, 1),(9, 1188, 1),(9, 1189, 1),(9, 1190, 1),(9, 1191, 2),(9, 1192, 2),(9, 1193, 1),(9, 1194, 3), +(9, 1195, 3),(9, 1196, 2),(9, 1197, 2),(9, 1198, 2),(9, 1199, 1),(9, 1200, 1),(9, 1201, 1),(9, 1202, 1),(9, 1203, 1),(9, 1204, 1),(9, 1205, 2), +(9, 1206, 1),(9, 1207, 2),(9, 1208, 1),(9, 1209, 1),(9, 1210, 2),(9, 1211, 1),(9, 1212, 1),(9, 1213, 1),(9, 1214, 1),(9, 1215, 1),(9, 1216, 1), +(9, 22, 1),(9, 1217, 1),(9, 1218, 1),(9, 1219, 4),(9, 1220, 2),(9, 1221, 1),(9, 1222, 1),(9, 1223, 1),(9, 47, 2),(9, 1224, 1),(9, 68, 2), +(9, 1225, 1),(9, 1226, 1),(9, 1227, 1),(9, 1228, 1),(9, 1229, 1),(9, 1230, 1),(9, 1231, 1),(9, 1232, 1),(9, 1233, 1),(9, 1234, 1),(9, 1235, 2), +(9, 1236, 1),(9, 1237, 1),(9, 1238, 1),(9, 1239, 1),(9, 1240, 1),(9, 1241, 1),(9, 1242, 1),(9, 1243, 1),(9, 1244, 1),(9, 1245, 1),(9, 1246, 1), +(9, 1247, 1),(9, 1048, 3),(9, 1248, 3),(9, 942, 17),(9, 1249, 13),(9, 1250, 13),(9, 1251, 11),(9, 1252, 11),(9, 1253, 1),(9, 1254, 2),(9, 1255, 1), +(9, 1256, 1),(9, 1257, 5),(9, 90, 2),(9, 1258, 1),(9, 1259, 1),(9, 1260, 1),(9, 159, 1),(9, 583, 1),(9, 1261, 1),(9, 1262, 1),(9, 910, 1), +(9, 1263, 1),(9, 1264, 1),(9, 1265, 1),(9, 1266, 1),(9, 1267, 1),(9, 1268, 1),(9, 1269, 1),(9, 1270, 2),(9, 1271, 1),(9, 1272, 1),(9, 1273, 1), +(9, 1274, 1),(9, 1275, 1),(9, 1276, 3),(9, 1277, 2),(9, 1278, 1),(9, 103, 1),(9, 1279, 2),(9, 1280, 1),(9, 1065, 1),(9, 1281, 4),(9, 1282, 1), +(9, 1283, 1),(9, 1284, 1),(9, 1285, 1),(9, 85, 1),(9, 1286, 1),(9, 1287, 1),(9, 943, 7),(9, 1288, 3),(9, 1289, 1),(9, 1290, 1),(9, 562, 1), +(9, 1291, 1),(9, 109, 7),(9, 1292, 1),(9, 1293, 1),(9, 118, 2),(9, 136, 2),(9, 1294, 1),(9, 95, 7),(9, 1295, 1),(9, 1296, 1),(9, 918, 1), +(9, 1297, 1),(9, 931, 1),(9, 1298, 1),(9, 1299, 1),(9, 1300, 1),(9, 1301, 1),(9, 1302, 1),(9, 131, 3),(9, 1303, 2),(9, 1304, 2),(9, 1305, 2), +(9, 1306, 1),(9, 1307, 2),(9, 1308, 1),(9, 1309, 1),(9, 1310, 1),(9, 1311, 1),(9, 319, 1),(9, 1312, 2),(9, 1313, 1),(9, 1314, 1),(9, 1315, 1), +(9, 500, 1),(9, 499, 1),(9, 1316, 4),(9, 1317, 1),(9, 1318, 1),(9, 1319, 1),(9, 1320, 1),(9, 1321, 1),(9, 523, 1),(9, 1322, 1),(9, 1323, 1), +(9, 1324, 3),(9, 1325, 3),(9, 1326, 2),(9, 1327, 1),(9, 1328, 1),(9, 1329, 1),(9, 1330, 1),(9, 1331, 1),(9, 1332, 1),(9, 1333, 1),(9, 1334, 1), +(9, 1335, 1),(9, 1336, 1),(9, 1337, 1),(9, 299, 1),(9, 553, 2),(9, 1338, 1),(9, 1339, 1),(9, 1340, 1),(9, 1341, 1),(9, 1342, 1),(9, 1343, 1), +(9, 1344, 1),(9, 330, 1),(9, 544, 1),(9, 1345, 1),(9, 1346, 1),(9, 1347, 1),(9, 1348, 1),(9, 1349, 1),(9, 1350, 1),(9, 1351, 1),(9, 1352, 1), +(9, 1353, 1),(9, 1354, 1),(9, 1355, 1),(9, 1356, 1),(9, 1357, 1),(9, 1358, 1),(9, 1359, 1),(9, 1360, 1),(9, 1361, 1),(9, 1362, 1),(9, 1363, 1), +(9, 1364, 1),(9, 1365, 2),(9, 1366, 1),(9, 1367, 2),(9, 1368, 1),(9, 1369, 1),(9, 505, 2),(9, 1370, 1),(9, 1371, 1),(9, 1372, 2),(9, 570, 1), +(9, 1373, 1),(9, 1374, 1),(9, 1375, 1),(9, 1376, 1),(9, 1055, 3),(9, 1377, 2),(9, 1378, 1),(9, 1379, 1),(9, 730, 1),(9, 1380, 1),(9, 1381, 1), +(9, 1382, 1),(9, 1383, 1),(9, 1384, 2),(9, 1385, 1),(9, 1386, 2),(9, 1387, 1),(9, 1388, 1),(9, 889, 1),(9, 1389, 1),(9, 1390, 1),(9, 1391, 1), +(9, 1392, 1),(9, 1393, 1),(9, 938, 1),(9, 1394, 1),(9, 1395, 1),(9, 1396, 1),(9, 1397, 1),(9, 1398, 1),(9, 1399, 1),(9, 940, 1),(9, 941, 1), +(9, 1400, 1),(9, 1401, 1),(9, 1402, 1),(9, 1079, 3),(9, 1403, 3),(9, 1404, 4),(9, 1405, 4),(9, 1024, 12),(9, 1406, 6),(9, 1407, 6),(9, 1408, 12), +(9, 1409, 11),(9, 1410, 9),(9, 1411, 1),(9, 1412, 2),(9, 1413, 1),(9, 1414, 1),(9, 1415, 1),(9, 1416, 1),(9, 1417, 1),(9, 1418, 5),(9, 1419, 1), +(9, 1420, 1),(9, 1421, 1),(9, 1422, 1),(9, 1423, 1),(9, 1424, 3),(9, 1425, 1),(9, 764, 2),(9, 1426, 1),(9, 1427, 1),(9, 1428, 1),(9, 1429, 1), +(9, 1430, 2),(9, 1431, 1),(9, 1432, 2),(9, 1433, 1),(9, 1434, 1),(9, 1435, 2),(9, 1436, 1),(9, 1437, 3),(9, 1438, 2),(9, 1439, 1),(9, 181, 1), +(9, 1440, 3),(9, 356, 2),(9, 658, 2),(9, 173, 11),(9, 1441, 6),(9, 1442, 5),(9, 1443, 1),(9, 1444, 1),(9, 1445, 2),(9, 1446, 1),(9, 163, 1), +(9, 1447, 1),(9, 1448, 1),(9, 606, 7),(9, 1449, 3),(9, 1450, 1),(9, 1451, 1),(9, 662, 1),(9, 1452, 1),(9, 1453, 1),(9, 213, 2),(9, 1454, 1), +(9, 1455, 1),(9, 1456, 1),(9, 1457, 1),(9, 610, 1),(9, 1458, 1),(9, 1459, 1),(9, 1460, 1),(9, 1461, 1),(9, 1462, 1),(9, 1463, 1),(9, 1464, 2), +(9, 1465, 2),(9, 1466, 2),(9, 1467, 1),(9, 1468, 2),(9, 631, 1),(9, 1469, 2),(9, 1470, 1),(9, 1471, 2),(9, 1472, 1),(9, 1473, 1),(9, 1474, 2), +(9, 1475, 1),(9, 1476, 1),(9, 660, 1),(9, 601, 1),(9, 1477, 4),(9, 635, 1),(9, 1478, 1),(9, 653, 3),(9, 654, 1),(9, 1479, 1),(9, 1480, 1), +(9, 1481, 3),(9, 1482, 3),(9, 1483, 2),(9, 1484, 1),(9, 1485, 1),(9, 1486, 1),(9, 1487, 1),(9, 1488, 2),(9, 1489, 1),(9, 1490, 1),(9, 1491, 1), +(9, 1492, 1),(9, 354, 2),(9, 1493, 1),(9, 593, 1),(9, 1494, 1),(9, 1495, 1),(9, 1496, 1),(9, 1497, 1),(9, 381, 1),(9, 1498, 1),(9, 1499, 1), +(9, 1500, 1),(9, 1501, 1),(9, 1502, 1),(9, 1503, 1),(9, 1504, 1),(9, 1505, 1),(9, 1506, 1),(9, 1507, 1),(9, 1508, 1),(9, 1509, 1),(9, 1510, 1), +(9, 1511, 1),(9, 1512, 1),(9, 1513, 1),(9, 1514, 1),(9, 1515, 1),(9, 1516, 1),(9, 1517, 2),(9, 1518, 1),(9, 1519, 1),(9, 1520, 1),(9, 1521, 1), +(9, 1522, 1),(9, 1523, 1),(9, 669, 1),(9, 1524, 1),(9, 1525, 1),(9, 1526, 1),(9, 191, 1),(9, 1023, 3),(9, 1527, 2),(9, 1528, 1),(9, 1099, 1), +(9, 762, 1),(9, 1529, 1),(9, 1530, 1),(9, 1531, 1),(9, 786, 1),(9, 1532, 2),(9, 1533, 1),(9, 1534, 2),(9, 1535, 1),(9, 1536, 1),(9, 973, 1), +(9, 1537, 1),(9, 1103, 1),(9, 1538, 1),(9, 1539, 1),(9, 1540, 1),(9, 1021, 1),(9, 1541, 1),(9, 1542, 1),(9, 1543, 1),(9, 1544, 1),(9, 1545, 1), +(9, 1546, 1),(9, 1022, 1),(9, 1547, 1),(9, 1548, 1),(9, 1549, 1),(9, 1550, 1),(9, 1551, 1),(9, 1113, 3),(9, 1552, 3); + +INSERT INTO `PREFIX_search_word` (`id_word`, `id_lang`, `word`) VALUES (1, 1, 'ipod'),(2, 1, 'nano'),(3, 1, 'design'),(4, 1, 'features'),(5, 1, '16gb'), +(6, 1, 'rocks'),(7, 1, 'like'),(8, 1, 'never'),(9, 1, 'before'),(10, 1, 'curved'),(11, 1, 'ahead'),(12, 1, 'curve'),(13, 1, 'those'),(14, 1, 'about'), +(15, 1, 'rock,'),(16, 1, 'give'),(17, 1, 'nine'),(18, 1, 'amazing'),(19, 1, 'colors'),(20, 1, 'that''s'),(21, 1, 'only'),(22, 1, 'part'), +(23, 1, 'story'),(24, 1, 'feel'),(25, 1, 'curved,'),(26, 1, 'allaluminum'),(27, 1, 'glass'),(28, 1, 'won''t'),(29, 1, 'want'),(30, 1, 'down'), +(31, 1, 'great'),(32, 1, 'looks'),(33, 1, 'brains,'),(34, 1, 'genius'),(35, 1, 'feature'),(36, 1, 'turns'),(37, 1, 'into'),(38, 1, 'your'), +(39, 1, 'highly'),(40, 1, 'intelligent,'),(41, 1, 'personal'),(42, 1, 'creates'),(43, 1, 'playlists'),(44, 1, 'finding'),(45, 1, 'songs'), +(46, 1, 'library'),(47, 1, 'that'),(48, 1, 'together'),(49, 1, 'made'),(50, 1, 'move'),(51, 1, 'with'),(52, 1, 'moves'),(53, 1, 'accelerometer'), +(54, 1, 'comes'),(55, 1, 'shake'),(56, 1, 'shuffle'),(57, 1, 'music'),(58, 1, 'turn'),(59, 1, 'sideways'),(60, 1, 'view'),(61, 1, 'cover'),(62, 1, 'flow'), +(63, 1, 'play'),(64, 1, 'games'),(65, 1, 'designed'),(66, 1, 'mind'),(67, 1, 'ipods'),(68, 1, 'apple'),(69, 1, 'computer,'),(70, 1, 'metal'), +(71, 1, '16go'),(72, 1, 'yellow'),(73, 1, 'blue'),(74, 1, 'black'),(75, 1, 'orange'),(76, 1, 'pink'),(77, 1, 'green'),(78, 1, 'purple'),(79, 1, 'g'), +(80, 1, 'minijack'),(81, 1, 'stereo'),(82, 2, 'ipod'),(83, 2, 'nano'),(84, 2, 'nouveau'),(85, 2, 'design'),(86, 2, 'nouvelles'),(87, 2, 'fonctionnalité'), +(88, 2, 'désormais'),(89, 2, 'nano,'),(90, 2, 'plus'),(91, 2, 'rock'),(92, 2, 'jamais'),(93, 2, 'courbes'),(94, 2, 'avantageuses'),(95, 2, 'pour'), +(96, 2, 'amateurs'),(97, 2, 'sensations,'),(98, 2, 'voici'),(99, 2, 'neuf'),(100, 2, 'nouveaux'),(101, 2, 'coloris'),(102, 2, 'n''est'),(103, 2, 'tout'), +(104, 2, 'faites'),(105, 2, 'l''expérience'),(106, 2, 'elliptique'),(107, 2, 'aluminum'),(108, 2, 'verre'),(109, 2, 'vous'),(110, 2, 'voudrez'), +(111, 2, 'lâcher'),(112, 2, 'beau'),(113, 2, 'intelligent'),(114, 2, 'nouvelle'),(115, 2, 'genius'),(116, 2, 'fait'),(117, 2, 'd''ipod'),(118, 2, 'votre'), +(119, 2, 'personnel'),(120, 2, 'crée'),(121, 2, 'listes'),(122, 2, 'lecture'),(123, 2, 'recherchant'),(124, 2, 'dans'),(125, 2, 'bibliothèque'), +(126, 2, 'chansons'),(127, 2, 'vont'),(128, 2, 'bien'),(129, 2, 'ensemble'),(130, 2, 'bouger'),(131, 2, 'avec'),(132, 2, 'équipé'),(133, 2, 'l''accéléromè'), +(134, 2, 'secouezle'),(135, 2, 'mélanger'),(136, 2, 'musique'),(137, 2, 'basculezle'),(138, 2, 'afficher'),(139, 2, 'cover'),(140, 2, 'flow'), +(141, 2, 'découvrez'),(142, 2, 'jeux'),(143, 2, 'adaptés'),(144, 2, 'mouvements'),(145, 2, 'ipods'),(146, 2, 'apple'),(147, 2, 'computer,'),(148, 2, 'metal'), +(149, 2, '16go'),(150, 2, 'jaune'),(151, 2, 'bleu'),(152, 2, 'noir'),(153, 2, 'orange'),(154, 2, 'rose'),(155, 2, 'vert'),(156, 2, 'violet'), +(157, 2, 'g'),(158, 2, 'minijack'),(159, 2, 'stéréo'),(160, 3, 'ipod'),(161, 3, 'nano'),(162, 3, 'nuevo'),(163, 3, 'diseño'),(164, 3, 'nuevas'), +(165, 3, 'aplicaciones'),(166, 3, 'ahora'),(167, 3, 'disponible'),(168, 3, 'nano,'),(169, 3, 'rock'),(170, 3, 'nunca'),(171, 3, 'curvas'), +(172, 3, 'aerodinámicas'),(173, 3, 'para'),(174, 3, 'aficionados'),(175, 3, 'sensaciones'),(176, 3, 'fuertes,'),(177, 3, 'presentamos'),(178, 3, 'nueve'), +(179, 3, 'nuevos'),(180, 3, 'colores'),(181, 3, 'todo'),(182, 3, 'experimenta'),(183, 3, 'elíptico'),(184, 3, 'aluminio'),(185, 3, 'vidrio'), +(186, 3, 'querrás'),(187, 3, 'separarte'),(188, 3, 'estético'),(189, 3, 'inteligente'),(190, 3, 'nueva'),(191, 3, 'aplicación'),(192, 3, 'genius'), +(193, 3, 'hace'),(194, 3, 'discjockey'),(195, 3, 'personal'),(196, 3, 'genuis'),(197, 3, 'crea'),(198, 3, 'listas'),(199, 3, 'lectura'),(200, 3, 'buscando'), +(201, 3, 'biblioteca'),(202, 3, 'canciones'),(203, 3, 'combinan'),(204, 3, 'entre'),(205, 3, 'hecho'),(206, 3, 'moverse'),(207, 3, 'contigo'),(208, 3, 'está'), +(209, 3, 'equipado'),(210, 3, 'acelerómetro'),(211, 3, 'muévelo'),(212, 3, 'mezclar'),(213, 3, 'música'),(214, 3, 'voltéalo'),(215, 3, 'mostrar'), +(216, 3, 'cover'),(217, 3, 'flow'),(218, 3, 'descubre'),(219, 3, 'juegos'),(220, 3, 'adaptados'),(221, 3, 'movimientos'),(222, 3, 'ipods'),(223, 3, 'apple'), +(224, 3, 'computer,'),(225, 3, 'metal'),(226, 3, '16go'),(227, 3, 'amarillo'),(228, 3, 'azul'),(229, 3, 'negro'),(230, 3, 'naranja'),(231, 3, 'rosa'), +(232, 3, 'verde'),(233, 3, 'violeta'),(234, 3, 'minijack'),(235, 3, 'stéréo'),(236, 1, 'shuffle,'),(237, 1, 'world'),(238, 1, 'most'),(239, 1, 'wearable'), +(240, 1, 'player,'),(241, 1, 'clips'),(242, 1, 'more'),(243, 1, 'vibrant'),(244, 1, 'blue,'),(245, 1, 'green,'),(246, 1, 'pink,'),(247, 1, 'instant'), +(248, 1, 'attachment'),(249, 1, 'wear'),(250, 1, 'sleeve'),(251, 1, 'belt'),(252, 1, 'shorts'),(253, 1, 'badge'),(254, 1, 'musical'),(255, 1, 'devotion'), +(256, 1, 'new,'),(257, 1, 'brilliant'),(258, 1, 'feed'),(259, 1, 'itunes'),(260, 1, 'entertainment'),(261, 1, 'superstore'),(262, 1, 'ultraorganized'), +(263, 1, 'collection'),(264, 1, 'jukebox'),(265, 1, 'load'),(266, 1, 'click'),(267, 1, 'beauty'),(268, 1, 'beat'),(269, 1, 'intensely'),(270, 1, 'colorful'), +(271, 1, 'anodized'),(272, 1, 'aluminum'),(273, 1, 'complements'),(274, 1, 'simple'),(275, 1, 'red,'),(276, 1, 'original'),(277, 1, 'silver'),(278, 1, '(clip'), +(279, 1, 'compris)'),(280, 2, 'shuffle'),(281, 2, 'shuffle,'),(282, 2, 'baladeur'),(283, 2, 'portable'),(284, 2, 'monde,'),(285, 2, 'clippe'),(286, 2, 'maintenant'), +(287, 2, 'bleu,'),(288, 2, 'vert,'),(289, 2, 'rouge'),(290, 2, 'lien'),(291, 2, 'immédiat'),(292, 2, 'portez'),(294, 2, 'accrochées'),(295, 2, 'manche,'), +(296, 2, 'ceinture'),(297, 2, 'short'),(298, 2, 'arborez'),(299, 2, 'comme'),(300, 2, 'signe'),(301, 2, 'extérieur'),(302, 2, 'passion'),(303, 2, 'existe'), +(304, 2, 'quatre'),(305, 2, 'encore'),(306, 2, 'éclatants'),(307, 2, 'emplissez'),(308, 2, 'itunes'),(309, 2, 'immense'),(310, 2, 'magasin'),(311, 2, 'dédié'), +(312, 2, 'divertissement,'),(313, 2, 'collection'),(314, 2, 'musicale'),(315, 2, 'parfaitement'),(316, 2, 'organisée'),(317, 2, 'jukebox'),(318, 2, 'pouvez'), +(319, 2, 'seul'),(320, 2, 'clic'),(321, 2, 'remplir'),(322, 2, 'technicolor'),(323, 2, 's''affiche'),(324, 2, 'intenses'),(325, 2, 'rehaussent'),(326, 2, 'épuré'), +(327, 2, 'boîtier'),(328, 2, 'aluminium'),(329, 2, 'anodisé'),(330, 2, 'choisissez'),(331, 2, 'parmi'),(332, 2, 'rose,'),(333, 2, 'l''argenté'),(334, 2, 'd''origine'), +(335, 2, '(clip'),(336, 2, 'compris)'),(337, 3, 'shuffle'),(338, 3, 'shuffle,'),(339, 3, 'walkman'),(340, 3, 'portátil'),(341, 3, 'mundo,'),(342, 3, 'azul,'), +(343, 3, 'verde,'),(344, 3, 'rojo'),(345, 3, 'enlace'),(346, 3, 'inmediato'),(347, 3, 'lleva'),(348, 3, 'hasta'),(349, 3, 'colgadas'),(350, 3, 'manga,'), +(351, 3, 'cinturón'),(352, 3, 'pantalón'),(353, 3, 'presume'),(354, 3, 'como'),(355, 3, 'signo'),(356, 3, 'exterior'),(357, 3, 'pasión'),(358, 3, 'existen'), +(359, 3, 'cuatro'),(360, 3, 'llamativos'),(361, 3, 'llena'),(362, 3, 'itunes'),(363, 3, 'enorme'),(364, 3, 'tienda'),(365, 3, 'dedicada'),(366, 3, 'diversión,'), +(367, 3, 'colección'),(368, 3, 'organizada'),(369, 3, 'perfectamente'),(370, 3, 'jukebox'),(371, 3, 'solo'),(372, 3, 'clic'),(373, 3, 'puedes'),(374, 3, 'llenar'), +(375, 3, 'tecnicolor'),(376, 3, 'presenta'),(377, 3, 'vivos'),(378, 3, 'realzan'),(379, 3, 'estilizado'),(380, 3, 'anodizado'),(381, 3, 'elige'),(382, 3, 'rosa,'), +(383, 3, 'plateado'),(384, 3, 'origen'),(385, 3, '(clip'),(386, 3, 'incluyendo)'),(387, 1, 'macbook'),(388, 1, 'ultrathin,'),(389, 1, 'ultraportable,'), +(390, 1, 'ultra'),(391, 1, 'unlike'),(392, 1, 'anything'),(393, 1, 'else'),(394, 1, 'lose'),(395, 1, 'inches'),(396, 1, 'pounds'),(397, 1, 'overnight'), +(398, 1, 'result'),(399, 1, 'rethinking'),(400, 1, 'conventions'),(401, 1, 'multiple'),(402, 1, 'wireless'),(403, 1, 'innovations'),(404, 1, 'breakthrough'), +(405, 1, 'air,'),(406, 1, 'mobile'),(407, 1, 'computing'),(408, 1, 'suddenly'),(409, 1, 'standard'),(410, 1, 'nearly'),(411, 1, 'thin'),(412, 1, 'index'), +(413, 1, 'finger'),(414, 1, 'practically'),(415, 1, 'every'),(416, 1, 'detail'),(417, 1, 'could'),(418, 1, 'streamlined'),(419, 1, 'been'),(420, 1, 'still'), +(421, 1, '133inch'),(422, 1, 'widescreen'),(423, 1, 'display,'),(424, 1, 'fullsize'),(425, 1, 'keyboard,'),(426, 1, 'large'),(427, 1, 'multitouch'), +(428, 1, 'trackpad'),(429, 1, 'incomparably'),(430, 1, 'portable'),(431, 1, 'without'),(432, 1, 'usual'),(433, 1, 'ultraportable'),(434, 1, 'screen'), +(435, 1, 'keyboard'),(436, 1, 'compromisesthe'),(437, 1, 'incredible'),(438, 1, 'thinness'),(439, 1, 'numerous'),(440, 1, 'size'),(441, 1, 'weightshaving'), +(442, 1, 'from'),(443, 1, 'slimmer'),(444, 1, 'hard'),(445, 1, 'drive'),(446, 1, 'strategically'),(447, 1, 'hidden'),(448, 1, 'ports'),(449, 1, 'lowerprofile'), +(450, 1, 'battery,'),(451, 1, 'everything'),(452, 1, 'considered'),(453, 1, 'reconsidered'),(454, 1, 'mindmacbook'),(455, 1, 'engineered'),(456, 1, 'take'), +(457, 1, 'full'),(458, 1, 'advantage'),(459, 1, 'which'),(460, 1, '80211n'),(461, 1, 'wifi'),(462, 1, 'fast'),(463, 1, 'available,'),(464, 1, 'people'), +(465, 1, 'truly'),(466, 1, 'living'),(467, 1, 'untethered'),(468, 1, 'buying'),(469, 1, 'renting'),(470, 1, 'movies'),(471, 1, 'online,'),(472, 1, 'downloading'), +(473, 1, 'software,'),(474, 1, 'sharing'),(475, 1, 'storing'),(476, 1, 'files'),(477, 1, 'laptops'),(478, 1, '80gb'),(479, 1, 'parallel'),(480, 1, '4200'), +(481, 1, '160ghz'),(482, 1, 'intel'),(483, 1, 'core'),(484, 1, 'optional'),(485, 1, '64gb'),(486, 1, 'solidstate'),(487, 1, '180ghz'),(488, 2, 'macbook'), +(489, 2, 'ultra'),(490, 2, 'fin,'),(491, 2, 'différent'),(492, 2, 'reste'),(493, 2, 'mais'),(494, 2, 'perd'),(495, 2, 'kilos'),(496, 2, 'centimètres'), +(497, 2, 'nuit'),(498, 2, 'c''est'),(499, 2, 'résultat'),(500, 2, 'd''une'),(501, 2, 'réinvention'),(502, 2, 'normes'),(503, 2, 'multitude'), +(504, 2, 'd''innovations'),(505, 2, 'sans'),(506, 2, 'révolution'),(507, 2, 'air,'),(508, 2, 'l''informatique'),(509, 2, 'mobile'),(510, 2, 'prend'), +(511, 2, 'soudain'),(512, 2, 'dimension'),(513, 2, 'presque'),(514, 2, 'aussi'),(515, 2, 'index'),(516, 2, 'pratiquement'),(517, 2, 'pouvait'), +(518, 2, 'être'),(519, 2, 'simplifié'),(520, 2, 'n''en'),(521, 2, 'dispose'),(522, 2, 'moins'),(523, 2, 'd''un'),(524, 2, 'écran'),(525, 2, 'panoramique'), +(526, 2, 'pouces,'),(527, 2, 'clavier'),(528, 2, 'complet'),(529, 2, 'vaste'),(530, 2, 'trackpad'),(531, 2, 'multitouch'),(532, 2, 'incomparablemen'), +(533, 2, 'évite'),(534, 2, 'compromis'),(535, 2, 'habituels'),(536, 2, 'matière'),(537, 2, 'd''écran'),(538, 2, 'ultraportablesl'),(539, 2, 'finesse'), +(540, 2, 'grand'),(541, 2, 'nombre'),(542, 2, 'termes'),(543, 2, 'réduction'),(544, 2, 'taille'),(545, 2, 'poids'),(546, 2, 'disque'),(547, 2, 'ports'), +(548, 2, 'habilement'),(549, 2, 'dissimulés'),(550, 2, 'passant'),(551, 2, 'batterie'),(552, 2, 'plate,'),(553, 2, 'chaque'),(554, 2, 'détail'), +(555, 2, 'considéré'),(556, 2, 'reconsidéré'),(557, 2, 'l''espritmacbook'),(558, 2, 'conçu'),(559, 2, 'élaboré'),(560, 2, 'profiter'),(561, 2, 'pleinement'), +(562, 2, 'monde'),(563, 2, 'lequel'),(564, 2, 'norme'),(565, 2, 'wifi'),(566, 2, '80211n'),(567, 2, 'rapide'),(568, 2, 'accessible'),(569, 2, 'qu''elle'), +(570, 2, 'permet'),(571, 2, 'véritablement'),(572, 2, 'libérer'),(573, 2, 'toute'),(574, 2, 'attache'),(575, 2, 'acheter'),(576, 2, 'vidéos'),(577, 2, 'ligne,'), +(578, 2, 'télécharger'),(579, 2, 'logicééééie'),(580, 2, 'stocker'),(581, 2, 'partager'),(582, 2, 'fichiers'),(583, 2, 'portables'),(584, 2, 'macbookair'), +(585, 2, 'pata'),(586, 2, 'intel'),(587, 2, 'core'),(588, 2, '(solidstate'),(589, 2, 'drive)'),(590, 3, 'macbook'),(591, 3, 'ultra'),(592, 3, 'fino,'), +(593, 3, 'diferente'),(594, 3, 'resto'),(595, 3, 'pero'),(596, 3, 'pierden'),(597, 3, 'kilos'),(598, 3, 'centímetros'),(599, 3, 'noche'),(600, 3, 'esto'), +(601, 3, 'resultado'),(602, 3, 'invento'),(603, 3, 'normas'),(604, 3, 'sinfín'),(605, 3, 'novedades'),(606, 3, 'cable'),(607, 3, 'revolución'), +(608, 3, 'air,'),(609, 3, 'informática'),(610, 3, 'móvil'),(611, 3, 'adquiere'),(612, 3, 'dimensión'),(613, 3, 'casi'),(614, 3, 'fino'),(615, 3, 'dedo'), +(616, 3, 'simplificado'),(617, 3, 'máximo'),(618, 3, 'pesar'),(619, 3, 'ello'),(620, 3, 'dispone'),(621, 3, 'pantalla'),(622, 3, 'panorámica'), +(623, 3, 'pulgadas,'),(624, 3, 'teclado'),(625, 3, 'completo'),(626, 3, 'amplio'),(627, 3, 'trackpad'),(628, 3, 'multitouch'),(629, 3, '100%,'), +(630, 3, 'evitará'),(631, 3, 'tener'),(632, 3, 'hacer'),(633, 3, 'compromiso'),(634, 3, 'concierne'),(635, 3, 'increíble'),(636, 3, 'sutileza'), +(637, 3, 'gran'),(638, 3, 'número'),(639, 3, 'innovaciones'),(640, 3, 'materia'),(641, 3, 'reducción'),(642, 3, 'tamaño'),(643, 3, 'peso'),(644, 3, 'desde'), +(645, 3, 'disco'),(646, 3, 'duro'),(647, 3, 'puertos'),(648, 3, 'disimulados'),(649, 3, 'hábilmente'),(650, 3, 'pasando'),(651, 3, 'batería'), +(652, 3, 'plana,'),(653, 3, 'cada'),(654, 3, 'detalle'),(655, 3, 'consideró'),(656, 3, 'fuera'),(657, 3, 'posible'),(658, 3, 'creado'),(659, 3, 'elaborado'), +(660, 3, 'disfrutar'),(661, 3, 'plenamente'),(662, 3, 'mundo'),(663, 3, 'inalámbrico'),(664, 3, 'norma'),(665, 3, 'wifi'),(666, 3, '80211n'), +(667, 3, 'rápida'),(668, 3, 'accesible'),(669, 3, 'permite'),(670, 3, 'liberarse'),(671, 3, 'completamente'),(672, 3, 'cualquier'),(673, 3, 'atadura'), +(674, 3, 'comprar'),(675, 3, 'videos'),(676, 3, 'línea,'),(677, 3, 'descargar'),(678, 3, 'programas,'),(679, 3, 'almacenar'),(680, 3, 'compartir'), +(681, 3, 'archivos'),(682, 3, 'portátiles'),(683, 3, 'pata'),(684, 3, 'intel'),(685, 3, 'core'),(686, 3, '(solidstate'),(687, 3, 'drive)'),(688, 1, 'makes'), +(689, 1, 'easy'),(690, 1, 'road'),(691, 1, 'thanks'),(692, 1, 'tough'),(693, 1, 'polycarbonate'),(694, 1, 'case,'),(695, 1, 'builtin'),(696, 1, 'technologies,'), +(697, 1, 'innovative'),(698, 1, 'magsafe'),(699, 1, 'power'),(700, 1, 'adapter'),(701, 1, 'releases'),(702, 1, 'automatically'),(703, 1, 'someone'), +(704, 1, 'accidentally'),(705, 1, 'trips'),(706, 1, 'cord'),(707, 1, 'larger'),(708, 1, 'drive,'),(709, 1, '250gb,'),(710, 1, 'store'),(711, 1, 'growing'), +(712, 1, 'media'),(713, 1, 'collections'),(714, 1, 'valuable'),(715, 1, 'datathe'),(716, 1, '24ghz'),(717, 1, 'models'),(718, 1, 'include'),(719, 1, 'memory'), +(720, 1, 'perfect'),(721, 1, 'running'),(722, 1, 'favorite'),(723, 1, 'applications'),(724, 1, 'smoothly'),(725, 1, 'superdrive'),(726, 2, 'offre'), +(727, 2, 'liberté'),(728, 2, 'mouvement'),(729, 2, 'grâce'),(730, 2, 'résistant'),(731, 2, 'polycarbonate,'),(732, 2, 'technologies'),(733, 2, 'intégrées'), +(734, 2, 'adaptateur'),(735, 2, 'secteur'),(736, 2, 'magsafe'),(737, 2, 'novateur'),(738, 2, 'déconnecte'),(739, 2, 'automatiquement'),(740, 2, 'quelqu''un'), +(741, 2, 'pieds'),(742, 2, 'spacieux,'),(743, 2, 'capacité'),(744, 2, 'atteignant'),(745, 2, 'collections'),(746, 2, 'multimédia'),(747, 2, 'expansion'), +(748, 2, 'données'),(749, 2, 'précieusesle'),(750, 2, 'modèle'),(751, 2, 'intègre'),(752, 2, 'mémoire'),(753, 2, 'standard'),(754, 2, 'l''idéal'), +(755, 2, 'exécuter'),(756, 2, 'souplesse'),(757, 2, 'applications'),(758, 2, 'préférées'),(759, 3, 'ofrece'),(760, 3, 'libertad'),(761, 3, 'gracias'), +(762, 3, 'resistente'),(763, 3, 'policarbonato,'),(764, 3, 'tecnología'),(765, 3, 'adaptador'),(766, 3, 'cargador'),(767, 3, 'sector'),(768, 3, 'innovador'), +(769, 3, 'desconecta'),(770, 3, 'automáticament'),(771, 3, 'alguien'),(772, 3, 'engancha'),(773, 3, 'espacioso,'),(774, 3, 'capacidad'),(775, 3, 'colecciones'), +(776, 3, 'multimedia'),(777, 3, 'expansión'),(778, 3, 'datos'),(779, 3, 'preciados'),(780, 3, 'modelo'),(781, 3, 'integra'),(782, 3, 'memoria'),(783, 3, 'estándar'), +(784, 3, 'ideal'),(785, 3, 'realizar'),(786, 3, 'dificultad'),(787, 3, 'preferidas'),(788, 1, 'touch'),(789, 1, 'revolutionary'),(790, 1, 'interface'), +(791, 1, '35inch'),(792, 1, 'color'),(793, 1, 'display'),(794, 1, '(80211b'),(795, 1, 'safari,'),(796, 1, 'youtube,'),(797, 1, 'mail,'),(798, 1, 'stocks,'), +(799, 1, 'weather,'),(800, 1, 'notes,'),(801, 1, 'store,'),(802, 1, 'maps'),(803, 1, 'five'),(804, 1, 'handson'),(805, 1, 'rich'),(806, 1, 'html'), +(807, 1, 'email'),(808, 1, 'photos'),(809, 1, 'well'),(810, 1, 'pdf,'),(811, 1, 'word,'),(812, 1, 'excel'),(813, 1, 'attachments'),(814, 1, 'maps,'), +(815, 1, 'directions,'),(816, 1, 'realtime'),(817, 1, 'traffic'),(818, 1, 'information'),(819, 1, 'notes'),(820, 1, 'read'),(821, 1, 'stock'),(822, 1, 'weather'), +(823, 1, 'reports'),(824, 1, 'music,'),(825, 1, 'movies,'),(826, 1, 'technology'),(827, 1, 'built'),(828, 1, 'gorgeous'),(829, 1, 'lets'),(830, 1, 'pinch,'), +(831, 1, 'zoom,'),(832, 1, 'scroll,'),(833, 1, 'flick'),(834, 1, 'fingers'),(835, 1, 'internet'),(836, 1, 'pocket'),(837, 1, 'safari'),(838, 1, 'browser,'), +(839, 1, 'websites'),(840, 1, 'they'),(841, 1, 'were'),(842, 1, 'seen'),(843, 1, 'zoom'),(844, 1, 'tap2'),(845, 1, 'home'),(846, 1, 'quick'),(847, 1, 'access'), +(848, 1, 'sites'),(849, 1, 'what''s'),(850, 1, 'earphones'),(851, 1, 'cable'),(852, 1, 'dock'),(853, 1, 'polishing'),(854, 1, 'cloth'),(855, 1, 'stand'), +(856, 1, 'start'),(857, 1, 'guide'),(858, 1, '32go'),(859, 1, 'jack'),(860, 1, '120g'),(861, 1, '70mm'),(862, 1, '110mm'),(863, 2, 'touch'), +(864, 2, 'interface'),(865, 2, 'révolutionnair'),(866, 2, 'couleur'),(867, 2, 'pouceswifi'),(868, 2, '(80211b'),(869, 2, 'd''épaisseursaf'),(870, 2, 'youtube,'), +(871, 2, 'music'),(872, 2, 'store,'),(873, 2, 'courrier,'),(874, 2, 'cartes,'),(875, 2, 'bourse,'),(876, 2, 'météo,'),(877, 2, 'notes'),(878, 2, 'titre'), +(879, 2, 'paragraphe'),(880, 2, 'cinq'),(881, 2, 'sous'),(882, 2, 'main'),(883, 2, 'consultez'),(884, 2, 'emails'),(885, 2, 'format'),(886, 2, 'html'), +(887, 2, 'enrichi,'),(888, 2, 'photos'),(889, 2, 'pieces'),(890, 2, 'jointes'),(891, 2, 'pdf,'),(892, 2, 'word'),(893, 2, 'excel'),(894, 2, 'obtenez'), +(895, 2, 'itinéraires'),(896, 2, 'informations'),(897, 2, 'l''état'),(898, 2, 'circulation'),(899, 2, 'temps'),(900, 2, 'réel'),(901, 2, 'rédigez'), +(902, 2, 'cours'),(903, 2, 'bourse'),(904, 2, 'bulletins'),(905, 2, 'météo'),(906, 2, 'touchez'),(907, 2, 'doigt'),(908, 2, 'entre'),(909, 2, 'autres'), +(910, 2, 'technologie'),(911, 2, 'intégrée'),(912, 2, 'superbe'),(913, 2, 'pouces'),(914, 2, 'd''effectuer'),(915, 2, 'zooms'),(916, 2, 'avant'), +(917, 2, 'arrière,'),(918, 2, 'faire'),(919, 2, 'défiler'),(920, 2, 'feuilleter'),(921, 2, 'pages'),(922, 2, 'l''aide'),(923, 2, 'seuls'),(924, 2, 'doigts'), +(925, 2, 'internet'),(926, 2, 'poche'),(927, 2, 'navigateur'),(928, 2, 'safari,'),(929, 2, 'consulter'),(930, 2, 'sites'),(931, 2, 'leur'),(932, 2, 'mise'), +(933, 2, 'page'),(934, 2, 'effectuer'),(935, 2, 'zoom'),(936, 2, 'arrière'),(937, 2, 'simple'),(938, 2, 'pression'),(939, 2, 'l''écran'),(940, 2, 'contenu'), +(941, 2, 'coffret'),(942, 2, 'écouteurs'),(943, 2, 'câble'),(944, 2, 'dock'),(945, 2, 'chiffon'),(946, 2, 'nettoyage'),(947, 2, 'support'),(948, 2, 'guide'), +(949, 2, 'démarrage'),(950, 2, 'tacticle'),(951, 2, '32go'),(952, 2, 'jack'),(953, 2, '120g'),(954, 2, '70mm'),(955, 2, '110mm'),(956, 3, 'touch'), +(957, 3, 'interfaz'),(958, 3, 'revolucionaria'),(959, 3, 'color'),(960, 3, 'pulgadas'),(961, 3, '(80211b'),(962, 3, 'espesor'),(963, 3, 'safari,'), +(964, 3, 'youtube,'),(965, 3, 'music'),(966, 3, 'store,'),(967, 3, 'correo,'),(968, 3, 'mapas,'),(969, 3, 'bolsa,'),(970, 3, 'tiempo,'),(971, 3, 'notas'), +(972, 3, 'cinco'),(973, 3, 'mano'),(974, 3, 'consulta'),(975, 3, 'correo'),(976, 3, 'formato'),(977, 3, 'html'),(978, 3, 'enriquecido,'),(979, 3, 'fotos'), +(980, 3, 'ficheros'),(981, 3, 'adjuntos'),(982, 3, 'pdf,'),(983, 3, 'word'),(984, 3, 'excel'),(985, 3, 'consigue'),(986, 3, 'itinerarios'),(987, 3, 'información'), +(988, 3, 'sobre'),(989, 3, 'estado'),(990, 3, 'carreteras'),(991, 3, 'tiempo'),(992, 3, 'real'),(993, 3, 'escribe'),(994, 3, 'bolsa'),(995, 3, 'alcanza'), +(996, 3, 'videos,'),(997, 3, 'otras'),(998, 3, 'cosas'),(999, 3, 'integrada'),(1000, 3, 'magnífica'),(1001, 3, 'permitirá'),(1002, 3, 'efectuar'),(1003, 3, 'zoom'), +(1004, 3, 'hacia'),(1005, 3, 'adelante'),(1006, 3, 'atrás,'),(1007, 3, 'pasar'),(1008, 3, 'ojear'),(1009, 3, 'páginas'),(1010, 3, 'ayuda'),(1011, 3, 'dedos'), +(1012, 3, 'internet'),(1013, 3, 'bolsillo'),(1014, 3, 'navegador'),(1015, 3, 'podrás'),(1016, 3, 'consultar'),(1017, 3, 'sitios'),(1018, 3, 'compaginación'), +(1019, 3, 'atrás'),(1020, 3, 'simple'),(1021, 3, 'presión'),(1022, 3, 'contenido'),(1023, 3, 'estuche'),(1024, 3, 'auriculares'),(1025, 3, 'dock'),(1026, 3, 'paño'), +(1027, 3, 'limpieza'),(1028, 3, 'base'),(1029, 3, 'guía'),(1030, 3, 'inicio'),(1031, 3, 'rápido'),(1032, 3, 'título'),(1033, 3, 'párrafo'),(1034, 3, '32go'), +(1035, 3, 'jack'),(1036, 3, '120g'),(1037, 3, '70mm'),(1038, 3, '110mm'),(1039, 1, 'housse'),(1040, 1, 'portefeuille'),(1041, 1, 'cuir'),(1042, 1, 'belkin'), +(1043, 1, 'pour'),(1044, 1, 'noir'),(1045, 1, 'chocolat'),(1046, 1, 'lorem'),(1047, 1, 'ipsum'),(1048, 1, 'accessories'),(1049, 2, 'housse'),(1050, 2, 'portefeuille'), +(1051, 2, 'cuir'),(1052, 2, '(ipod'),(1053, 2, 'nano)'),(1054, 2, 'chocolat'),(1055, 2, 'étui'),(1056, 2, 'tendance'),(1057, 2, 'assure'),(1058, 2, 'protection'), +(1059, 2, 'complète'),(1060, 2, 'contre'),(1061, 2, 'éraflures'),(1062, 2, 'petits'),(1063, 2, 'aléas'),(1064, 2, 'quotidienne'),(1065, 2, 'conception'), +(1066, 2, 'élégante'),(1067, 2, 'compacte'),(1068, 2, 'glisser'),(1069, 2, 'directement'),(1070, 2, 'caractéristiqu'),(1071, 2, 'doux'),(1072, 2, 'accès'), +(1073, 2, 'bouton'),(1074, 2, 'hold'),(1075, 2, 'fermeture'),(1076, 2, 'magnétique'),(1077, 2, 'connector'),(1078, 2, 'protègeécran'),(1079, 2, 'accessoires'), +(1080, 3, 'leather'),(1081, 3, 'case'),(1082, 3, '(ipod'),(1083, 3, 'nano)'),(1084, 3, 'chocolate'),(1085, 3, 'este'),(1086, 3, 'cuero'),(1087, 3, 'última'), +(1088, 3, 'moda'),(1089, 3, 'garantiza'),(1090, 3, 'completa'),(1091, 3, 'protección'),(1092, 3, 'contra'),(1093, 3, 'arañazos'),(1094, 3, 'pequeños'), +(1095, 3, 'contratiempos'),(1096, 3, 'vida'),(1097, 3, 'diaria'),(1098, 3, 'elegante'),(1099, 3, 'compacto'),(1100, 3, 'meter'),(1101, 3, 'directamente'), +(1102, 3, 'bolso'),(1103, 3, 'característica'),(1104, 3, 'suave'),(1105, 3, 'acceso'),(1106, 3, 'tecla'),(1107, 3, 'hold'),(1108, 3, 'cierre'), +(1109, 3, 'magnético'),(1110, 3, 'conector'),(1111, 3, 'salva'),(1112, 3, 'pantallas'),(1113, 3, 'accesorios'),(1114, 1, 'shure'),(1115, 1, 'se210'), +(1116, 1, 'soundisolating'),(1117, 1, 'iphone'),(1118, 1, 'evolved'),(1119, 1, 'monitor'),(1120, 1, 'roadtested'),(1121, 1, 'musicians'),(1122, 1, 'perfected'), +(1123, 1, 'engineers,'),(1124, 1, 'lightweight'),(1125, 1, 'stylish'),(1126, 1, 'delivers'),(1127, 1, 'fullrange'),(1128, 1, 'audio'),(1129, 1, 'free'), +(1130, 1, 'outside'),(1131, 1, 'noise'),(1132, 1, 'using'),(1133, 1, 'hidefinition'),(1134, 1, 'microspeakers'),(1135, 1, 'deliver'),(1136, 1, 'audio,'), +(1137, 1, 'ergonomic'),(1138, 1, 'ideal'),(1139, 1, 'premium'),(1140, 1, 'onthego'),(1141, 1, 'listening'),(1142, 1, 'offer'),(1143, 1, 'accurate'), +(1144, 1, 'reproduction'),(1145, 1, 'both'),(1146, 1, 'sourcesfor'),(1147, 1, 'ultimate'),(1148, 1, 'precision'),(1149, 1, 'highs'), +(1150, 1, 'addition,'),(1151, 1, 'flexible'),(1152, 1, 'allows'),(1153, 1, 'choose'),(1154, 1, 'comfortable'),(1155, 1, 'variety'), +(1156, 1, 'wearing'),(1157, 1, 'positions'),(1158, 1, 'microspeaker'),(1159, 1, 'single'),(1160, 1, 'balanced'),(1161, 1, 'armature'), +(1162, 1, 'driver'),(1163, 1, 'detachable,'),(1164, 1, 'modular'),(1165, 1, 'make'),(1166, 1, 'longer'),(1167, 1, 'shorter'),(1168, 1, 'depending'), +(1169, 1, 'activity'),(1170, 1, 'connector'),(1171, 1, 'compatible'),(1172, 1, 'earphone'),(1173, 1, 'specifications'),(1174, 1, 'speaker'), +(1175, 1, 'type'),(1176, 1, 'frequency'),(1177, 1, 'range'),(1178, 1, '25hz185khz'),(1179, 1, 'impedance'),(1180, 1, '(1khz)'),(1181, 1, 'ohms'), +(1182, 1, 'sensitivity'),(1183, 1, '(1mw)'),(1184, 1, 'length'),(1185, 1, '(with'),(1186, 1, 'extension)'),(1187, 1, '(540'),(1188, 1, '1371'), +(1189, 1, 'extension'),(1190, 1, '(360'),(1191, 1, 'three'),(1192, 1, 'pairs'),(1193, 1, 'foam'),(1194, 1, 'earpiece'),(1195, 1, 'sleeves'), +(1196, 1, '(small,'),(1197, 1, 'medium,'),(1198, 1, 'large)'),(1199, 1, 'soft'),(1200, 1, 'flex'),(1201, 1, 'pair'),(1202, 1, 'tripleflange'), +(1203, 1, 'carrying'),(1204, 1, 'case'),(1205, 1, 'warranty'),(1206, 1, 'twoyear'),(1207, 1, 'limited'),(1208, 1, '(for'),(1209, 1, 'details,'), +(1210, 1, 'please'),(1211, 1, 'visit'),(1212, 1, 'wwwshurecom'),(1213, 1, 'personalaudio'),(1214, 1, 'customersupport'),(1215, 1, 'productreturnsa'), +(1216, 1, 'indexhtm)'),(1217, 1, 'se210aefs'),(1218, 1, 'note'),(1219, 1, 'products'),(1220, 1, 'sold'),(1221, 1, 'through'),(1222, 1, 'this'), +(1223, 1, 'website'),(1224, 1, 'bear'),(1225, 1, 'brand'),(1226, 1, 'name'),(1227, 1, 'serviced'),(1228, 1, 'supported'),(1229, 1, 'exclusively'), +(1230, 1, 'their'),(1231, 1, 'manufacturers'),(1232, 1, 'accordance'),(1233, 1, 'terms'),(1234, 1, 'conditions'),(1235, 1, 'packaged'), +(1236, 1, 'apple''s'),(1237, 1, 'does'),(1238, 1, 'apply'),(1239, 1, 'applebranded,'),(1240, 1, 'even'),(1241, 1, 'contact'),(1242, 1, 'manufacturer'), +(1243, 1, 'directly'),(1244, 1, 'technical'),(1245, 1, 'support'),(1246, 1, 'customer'),(1247, 1, 'service'),(1248, 1, 'incorporated'), +(1249, 2, 'isolation'),(1250, 2, 'sonore'),(1251, 2, 'shure'),(1252, 2, 'se210'),(1253, 2, 'ergonomiques'),(1254, 2, 'légers'),(1255, 2, 'offrent'), +(1256, 2, 'reproduction'),(1257, 2, 'audio'),(1258, 2, 'fidèle'),(1259, 2, 'provenance'),(1260, 2, 'sources'),(1261, 2, 'salon'),(1262, 2, 'basés'), +(1263, 2, 'moniteurs'),(1264, 2, 'personnels'),(1265, 2, 'testée'),(1266, 2, 'route'),(1267, 2, 'musiciens'),(1268, 2, 'professionnels'),(1269, 2, 'perfectionnée'), +(1270, 2, 'ingénieurs'),(1271, 2, 'shure,'),(1272, 2, 'se210,'),(1273, 2, 'élégants,'),(1274, 2, 'fournissent'),(1275, 2, 'sortie'),(1276, 2, 'gamme'), +(1277, 2, 'étendue'),(1278, 2, 'exempte'),(1279, 2, 'bruit'),(1280, 2, 'externe'),(1281, 2, 'embouts'),(1282, 2, 'fournis'),(1283, 2, 'bloquent'), +(1284, 2, 'ambiant'),(1285, 2, 'combinés'),(1286, 2, 'ergonomique'),(1287, 2, 'séduisant'),(1288, 2, 'modulaire,'),(1289, 2, 'minimisent'),(1290, 2, 'intrusions'), +(1291, 2, 'extérieur,'),(1292, 2, 'permettant'),(1293, 2, 'concentrer'),(1294, 2, 'conçus'),(1295, 2, 'amoureux'),(1296, 2, 'souhaitent'),(1297, 2, 'évoluer'), +(1298, 2, 'appareil'),(1299, 2, 'portable,'),(1300, 2, 'permettent'),(1301, 2, 'd''emmener'),(1302, 2, 'performance'),(1303, 2, 'microtransducte'),(1304, 2, 'haute'), +(1305, 2, 'définition'),(1306, 2, 'développés'),(1307, 2, 'écoute'),(1308, 2, 'qualité'),(1309, 2, 'supérieure'),(1310, 2, 'déplacement,'),(1311, 2, 'utilisent'), +(1312, 2, 'transducteur'),(1313, 2, 'armature'),(1314, 2, 'équilibrée'),(1315, 2, 'bénéficier'),(1316, 2, 'confort'),(1317, 2, 'd''écoute'),(1318, 2, 'époustouflant'), +(1319, 2, 'restitue'),(1320, 2, 'tous'),(1321, 2, 'détails'),(1322, 2, 'spectacle'),(1323, 2, 'live'),(1324, 2, 'universel'),(1325, 2, 'deluxe'), +(1326, 2, 'comprend'),(1327, 2, 'éléments'),(1328, 2, 'suivants'),(1329, 2, 'inclus'),(1330, 2, 'double'),(1331, 2, 'rôle'),(1332, 2, 'bloquer'), +(1333, 2, 'bruits'),(1334, 2, 'ambiants'),(1335, 2, 'garantir'),(1336, 2, 'maintien'),(1337, 2, 'personnalisés'),(1338, 2, 'oreille'),(1339, 2, 'différente,'), +(1340, 2, 'trois'),(1341, 2, 'tailles'),(1342, 2, 'd''embouts'),(1343, 2, 'mousse'),(1344, 2, 'flexibles'),(1345, 2, 'style'),(1346, 2, 'd''embout'), +(1347, 2, 'conviennent'),(1348, 2, 'mieux'),(1349, 2, 'bonne'),(1350, 2, 'étanchéité'),(1351, 2, 'facteur'),(1352, 2, 'optimiser'),(1353, 2, 'l''isolation'), +(1354, 2, 'réponse'),(1355, 2, 'basses,'),(1356, 2, 'ainsi'),(1357, 2, 'accroître'),(1358, 2, 'prolongée'),(1359, 2, 'modulaire'),(1360, 2, 'basant'), +(1361, 2, 'commentaires'),(1362, 2, 'nombreux'),(1363, 2, 'utilisateurs,'),(1364, 2, 'développé'),(1365, 2, 'solution'),(1366, 2, 'détachable'), +(1367, 2, 'permettre'),(1368, 2, 'degré'),(1369, 2, 'personnalisatio'),(1370, 2, 'précédent'),(1371, 2, 'mètre'),(1372, 2, 'fourni'),(1373, 2, 'd''adapter'), +(1374, 2, 'fonction'),(1375, 2, 'l''activité'),(1376, 2, 'l''application'),(1377, 2, 'transport'),(1378, 2, 'outre'),(1379, 2, 'compact'),(1380, 2, 'ranger'), +(1381, 2, 'manière'),(1382, 2, 'pratique'),(1383, 2, 'encombres'),(1384, 2, 'garantie'),(1385, 2, 'limitée'),(1386, 2, 'deux'),(1387, 2, 'achetée'), +(1388, 2, 'couverte'),(1389, 2, 'maind''œuvre'),(1390, 2, 'anscaractérist'),(1391, 2, 'techniques'),(1392, 2, 'type'),(1393, 2, 'sensibilité'), +(1394, 2, 'acoustique'),(1395, 2, 'impédance'),(1396, 2, 'khz)'),(1397, 2, 'fréquences'),(1398, 2, 'longueur'),(1399, 2, 'rallonge'),(1400, 2, '(embouts'), +(1401, 2, 'sonore,'),(1402, 2, 'transport)'),(1403, 2, 'incorporated'),(1404, 2, 'casque'),(1405, 2, 'marche'),(1406, 3, 'aislantes'),(1407, 3, 'sonido'), +(1408, 3, 'shure'),(1409, 3, 'se210'),(1410, 3, 'aislamiento'),(1411, 3, 'ergonómicos'),(1412, 3, 'ligeros'),(1413, 3, 'ofrecen'),(1414, 3, 'reproducción'), +(1415, 3, 'fiel'),(1416, 3, 'proveniente'),(1417, 3, 'fuentes'),(1418, 3, 'audio'),(1419, 3, 'estéreo'),(1420, 3, 'móviles'),(1421, 3, 'salón'),(1422, 3, 'se210,'), +(1423, 3, 'elegantes,'),(1424, 3, 'están'),(1425, 3, 'basados'),(1426, 3, 'monitores'),(1427, 3, 'personales'),(1428, 3, 'músicos'),(1429, 3, 'profesionales'), +(1430, 3, 'utilizan'),(1431, 3, 'carretera'),(1432, 3, 'ingenieros'),(1433, 3, 'perfeccionado'),(1434, 3, 'también'),(1435, 3, 'provistos'),(1436, 3, 'salida'), +(1437, 3, 'gama'),(1438, 3, 'extendida'),(1439, 3, 'exenta'),(1440, 3, 'ruido'),(1441, 3, 'sonoro'),(1442, 3, 'almohadillas'),(1443, 3, 'provistas'), +(1444, 3, 'bloquean'),(1445, 3, 'ambiente'),(1446, 3, 'combinadas'),(1447, 3, 'ergonómico'),(1448, 3, 'atractivo'),(1449, 3, 'modular,'),(1450, 3, 'minimizan'), +(1451, 3, 'intrusiones'),(1452, 3, 'permiten'),(1453, 3, 'concentrarte'),(1454, 3, 'creados'),(1455, 3, 'apasionados'),(1456, 3, 'quieren'),(1457, 3, 'aparato'), +(1458, 3, 'evolucione,'),(1459, 3, 'permitirán'),(1460, 3, 'llevar'),(1461, 3, 'allí'),(1462, 3, 'donde'),(1463, 3, 'vayas'),(1464, 3, 'microtransducto'), +(1465, 3, 'alta'),(1466, 3, 'definición'),(1467, 3, 'desarrollados'),(1468, 3, 'poder'),(1469, 3, 'audición'),(1470, 3, 'calidad'),(1471, 3, 'durante'), +(1472, 3, 'desplazamientos'),(1473, 3, 'único'),(1474, 3, 'transductor'),(1475, 3, 'armazón'),(1476, 3, 'equilibrado'),(1477, 3, 'confort'), +(1478, 3, 'restituye'),(1479, 3, 'espectáculo'),(1480, 3, 'directo'),(1481, 3, 'universal'),(1482, 3, 'deluxe'),(1483, 3, 'incluye'),(1484, 3, 'siguientes'), +(1485, 3, 'elementos'),(1486, 3, 'tienen'),(1487, 3, 'doble'),(1488, 3, 'función'),(1489, 3, 'bloquear'),(1490, 3, 'garantizar'),(1491, 3, 'estabilidad'), +(1492, 3, 'personalizados'),(1493, 3, 'oreja'),(1494, 3, 'tres'),(1495, 3, 'tallas'),(1496, 3, 'espuma'),(1497, 3, 'flexibles'),(1498, 3, 'talla'), +(1499, 3, 'estilo'),(1500, 3, 'almohadilla'),(1501, 3, 'mejor'),(1502, 3, 'convenga'),(1503, 3, 'buen'),(1504, 3, 'factor'),(1505, 3, 'clave'),(1506, 3, 'tanto'), +(1507, 3, 'optimizar'),(1508, 3, 'respuesta'),(1509, 3, 'bajos'),(1510, 3, 'aumentar'),(1511, 3, 'prolongada'),(1512, 3, 'modular'),(1513, 3, 'basándose'), +(1514, 3, 'comentarios'),(1515, 3, 'numerosos'),(1516, 3, 'usuarios,'),(1517, 3, 'solución'),(1518, 3, 'separable'),(1519, 3, 'permitir'),(1520, 3, 'grado'), +(1521, 3, 'personalizació'),(1522, 3, 'precedentes'),(1523, 3, 'metro'),(1524, 3, 'adaptar'),(1525, 3, 'actividad'),(1526, 3, 'momento'),(1527, 3, 'transporte'), +(1528, 3, 'además'),(1529, 3, 'guardar'),(1530, 3, 'manera'),(1531, 3, 'práctica'),(1532, 3, 'garantía'),(1533, 3, 'límite'),(1534, 3, 'años'),(1535, 3, 'tiene'), +(1536, 3, 'piezas'),(1537, 3, 'obra'),(1538, 3, 'técnicas'),(1539, 3, 'tipo'),(1540, 3, 'sensibilidad'),(1541, 3, 'acústica'),(1542, 3, 'impedancia'), +(1543, 3, 'khz)'),(1544, 3, 'frecuencias'),(1545, 3, 'longitud'),(1546, 3, 'alargador'),(1547, 3, 'caja'),(1548, 3, 'altavoces'),(1549, 3, '(almohadillas'), +(1550, 3, 'sonoro,'),(1551, 3, 'transporte)'),(1552, 3, 'incorporated'); + +INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) VALUES +(2, 1, 1, 1, 1, 1), +(2, 2, 1, 1, 1, 1), +(2, 3, 1, 1, 1, 1), +(2, 4, 0, 0, 0, 0), +(2, 5, 1, 1, 1, 1), +(2, 6, 0, 0, 0, 0), +(2, 7, 0, 0, 0, 0), +(2, 8, 0, 0, 0, 0), +(2, 9, 0, 0, 0, 0), +(2, 10, 0, 0, 0, 0), +(2, 11, 0, 0, 0, 0), +(2, 12, 1, 1, 1, 1), +(2, 13, 1, 1, 1, 1), +(2, 14, 0, 0, 0, 0), +(2, 15, 0, 0, 0, 0), +(2, 16, 0, 0, 0, 0), +(2, 17, 1, 1, 1, 1), +(2, 18, 0, 0, 0, 0), +(2, 19, 0, 0, 0, 0), +(2, 20, 1, 1, 1, 1), +(2, 21, 1, 1, 1, 1), +(2, 22, 0, 0, 0, 0), +(2, 23, 0, 0, 0, 0), +(2, 24, 0, 0, 0, 0), +(2, 26, 0, 0, 0, 0), +(2, 27, 0, 0, 0, 0), +(2, 28, 0, 0, 0, 0), +(2, 29, 0, 0, 0, 0), +(2, 30, 0, 0, 0, 0), +(2, 31, 0, 0, 0, 0), +(2, 32, 0, 0, 0, 0), +(2, 33, 0, 0, 0, 0), +(2, 34, 1, 1, 1, 1), +(2, 35, 0, 0, 0, 0), +(2, 36, 0, 0, 0, 0), +(2, 37, 0, 0, 0, 0), +(2, 38, 0, 0, 0, 0), +(2, 39, 0, 0, 0, 0), +(2, 40, 0, 0, 0, 0), +(2, 41, 0, 0, 0, 0), +(2, 42, 1, 1, 1, 1), +(2, 43, 0, 0, 0, 0), +(2, 44, 0, 0, 0, 0), +(2, 46, 0, 0, 0, 0), +(2, 47, 1, 1, 1, 1), +(2, 48, 0, 0, 0, 0), +(2, 49, 1, 1, 1, 1), +(2, 51, 0, 0, 0, 0), +(2, 52, 0, 0, 0, 0), +(2, 53, 0, 0, 0, 0), +(2, 54, 0, 0, 0, 0), +(2, 55, 1, 1, 1, 1), +(2, 56, 0, 0, 0, 0), +(2, 57, 0, 0, 0, 0), +(2, 58, 0, 0, 0, 0), +(2, 59, 1, 1, 1, 1), +(2, 60, 1, 1, 1, 1), +(2, 61, 0, 0, 0, 0), +(2, 62, 0, 0, 0, 0), +(2, 63, 0, 0, 0, 0), +(2, 64, 0, 0, 0, 0), +(2, 65, 0, 0, 0, 0), +(2, 66, 0, 0, 0, 0), +(2, 67, 0, 0, 0, 0), +(2, 68, 0, 0, 0, 0), +(2, 69, 0, 0, 0, 0), +(2, 70, 0, 0, 0, 0), +(2, 71, 0, 0, 0, 0), +(2, 72, 0, 0, 0, 0), +(2, 73, 1, 1, 1, 1), +(2, 80, 0, 0, 0, 0), +(2, 81, 0, 0, 0, 0), +(2, 82, 0, 0, 0, 0), +(2, 83, 0, 0, 0, 0), +(2, 84, 0, 0, 0, 0), +(2, 85, 0, 0, 0, 0), +(2, 86, 0, 0, 0, 0), +(2, 87, 0, 0, 0, 0), +(2, 88, 1, 1, 1, 1), +(3, 1, 1, 1, 1, 1), +(3, 2, 0, 0, 0, 0), +(3, 3, 0, 0, 0, 0), +(3, 4, 0, 0, 0, 0), +(3, 5, 0, 0, 0, 0), +(3, 6, 0, 0, 0, 0), +(3, 7, 0, 0, 0, 0), +(3, 8, 0, 0, 0, 0), +(3, 9, 1, 0, 0, 0), +(3, 10, 0, 0, 0, 0), +(3, 11, 0, 0, 0, 0), +(3, 12, 0, 0, 0, 0), +(3, 13, 0, 0, 0, 0), +(3, 14, 0, 0, 0, 0), +(3, 15, 0, 0, 0, 0), +(3, 16, 0, 0, 0, 0), +(3, 17, 0, 0, 0, 0), +(3, 18, 0, 0, 0, 0), +(3, 19, 0, 0, 0, 0), +(3, 20, 0, 0, 0, 0), +(3, 21, 0, 0, 0, 0), +(3, 22, 0, 0, 0, 0), +(3, 23, 0, 0, 0, 0), +(3, 24, 0, 0, 0, 0), +(3, 26, 0, 0, 0, 0), +(3, 27, 0, 0, 0, 0), +(3, 28, 0, 0, 0, 0), +(3, 29, 0, 0, 0, 0), +(3, 30, 0, 0, 0, 0), +(3, 31, 0, 0, 0, 0), +(3, 32, 1, 1, 1, 1), +(3, 33, 1, 1, 1, 1), +(3, 34, 0, 0, 0, 0), +(3, 35, 0, 0, 0, 0), +(3, 36, 0, 0, 0, 0), +(3, 37, 0, 0, 0, 0), +(3, 38, 0, 0, 0, 0), +(3, 39, 0, 0, 0, 0), +(3, 40, 0, 0, 0, 0), +(3, 41, 0, 0, 0, 0), +(3, 42, 0, 0, 0, 0), +(3, 43, 1, 0, 0, 0), +(3, 44, 0, 0, 0, 0), +(3, 46, 0, 0, 0, 0), +(3, 47, 0, 0, 0, 0), +(3, 48, 0, 0, 0, 0), +(3, 49, 0, 0, 0, 0), +(3, 51, 0, 0, 0, 0), +(3, 52, 0, 0, 0, 0), +(3, 53, 0, 0, 0, 0), +(3, 54, 0, 0, 0, 0), +(3, 55, 0, 0, 0, 0), +(3, 56, 0, 0, 0, 0), +(3, 57, 1, 1, 1, 1), +(3, 58, 0, 0, 0, 0), +(3, 59, 0, 0, 0, 0), +(3, 60, 0, 0, 0, 0), +(3, 61, 0, 0, 0, 0), +(3, 62, 0, 0, 0, 0), +(3, 63, 0, 0, 0, 0), +(3, 64, 0, 0, 0, 0), +(3, 65, 0, 0, 0, 0), +(3, 66, 0, 0, 0, 0), +(3, 67, 0, 0, 0, 0), +(3, 68, 0, 0, 0, 0), +(3, 69, 0, 0, 0, 0), +(3, 70, 0, 0, 0, 0), +(3, 71, 0, 0, 0, 0), +(3, 72, 0, 0, 0, 0), +(3, 73, 0, 0, 0, 0), +(3, 80, 0, 0, 0, 0), +(3, 81, 0, 0, 0, 0), +(3, 82, 0, 0, 0, 0), +(3, 83, 0, 0, 0, 0), +(3, 84, 0, 0, 0, 0), +(3, 85, 0, 0, 0, 0), +(3, 86, 0, 0, 0, 0), +(3, 87, 0, 0, 0, 0), +(3, 88, 1, 1, 1, 1), +(4, 1, 1, 1, 1, 1), +(4, 2, 1, 1, 1, 1), +(4, 3, 1, 1, 1, 1), +(4, 4, 0, 0, 0, 0), +(4, 5, 0, 0, 0, 0), +(4, 6, 1, 1, 1, 1), +(4, 7, 0, 0, 0, 0), +(4, 8, 0, 0, 0, 0), +(4, 9, 0, 0, 0, 0), +(4, 10, 1, 0, 0, 0), +(4, 11, 0, 0, 0, 0), +(4, 12, 1, 1, 1, 1), +(4, 13, 0, 0, 0, 0), +(4, 14, 0, 0, 0, 0), +(4, 15, 0, 0, 0, 0), +(4, 16, 0, 0, 0, 0), +(4, 17, 0, 0, 0, 0), +(4, 18, 0, 0, 0, 0), +(4, 19, 0, 0, 0, 0), +(4, 20, 0, 0, 0, 0), +(4, 21, 0, 0, 0, 0), +(4, 22, 0, 0, 0, 0), +(4, 23, 0, 0, 0, 0), +(4, 24, 0, 0, 0, 0), +(4, 26, 0, 0, 0, 0), +(4, 27, 0, 0, 0, 0), +(4, 28, 0, 0, 0, 0), +(4, 29, 0, 0, 0, 0), +(4, 30, 0, 0, 0, 0), +(4, 31, 0, 0, 0, 0), +(4, 32, 0, 0, 0, 0), +(4, 33, 0, 0, 0, 0), +(4, 34, 0, 0, 0, 0), +(4, 35, 0, 0, 0, 0), +(4, 36, 0, 0, 0, 0), +(4, 37, 0, 0, 0, 0), +(4, 38, 0, 0, 0, 0), +(4, 39, 0, 0, 0, 0), +(4, 40, 0, 0, 0, 0), +(4, 41, 0, 0, 0, 0), +(4, 42, 1, 1, 1, 1), +(4, 43, 1, 0, 0, 0), +(4, 44, 0, 0, 0, 0), +(4, 46, 0, 0, 0, 0), +(4, 47, 0, 0, 0, 0), +(4, 48, 0, 0, 0, 0), +(4, 49, 1, 1, 1, 1), +(4, 51, 0, 0, 0, 0), +(4, 52, 0, 0, 0, 0), +(4, 53, 0, 0, 0, 0), +(4, 54, 1, 1, 1, 1), +(4, 55, 0, 0, 0, 0), +(4, 56, 0, 0, 0, 0), +(4, 57, 0, 0, 0, 0), +(4, 58, 0, 0, 0, 0), +(4, 59, 1, 1, 1, 1), +(4, 60, 0, 0, 0, 0), +(4, 61, 0, 0, 0, 0), +(4, 62, 1, 1, 1, 1), +(4, 63, 1, 1, 1, 1), +(4, 64, 0, 0, 0, 0), +(4, 65, 1, 1, 1, 1), +(4, 66, 0, 0, 0, 0), +(4, 67, 0, 0, 0, 0), +(4, 68, 0, 0, 0, 0), +(4, 69, 0, 0, 0, 0), +(4, 70, 0, 0, 0, 0), +(4, 71, 0, 0, 0, 0), +(4, 72, 0, 0, 0, 0), +(4, 73, 0, 0, 0, 0), +(4, 80, 0, 0, 0, 0), +(4, 81, 0, 0, 0, 0), +(4, 82, 1, 1, 1, 1), +(4, 83, 0, 0, 0, 0), +(4, 84, 0, 0, 0, 0), +(4, 85, 0, 0, 0, 0), +(4, 86, 0, 0, 0, 0), +(4, 87, 0, 0, 0, 0), +(4, 88, 1, 1, 1, 1); + +INSERT INTO `PREFIX_profile` (`id_profile`) VALUES (2),(3),(4); +INSERT INTO `PREFIX_profile_lang` (`id_lang`, `id_profile`, `name`) VALUES +(1, 2, 'Logistician'),(2, 2, 'Logisticien'),(3, 2, 'Logistician'),(4, 2, 'Logistiker'),(5, 2, 'Logista'), +(1, 3, 'Translator'),(2, 3, 'Traducteur'),(3, 3, 'Translator'),(4, 3, 'Übersetzer'),(5, 3, 'Traduttore'), +(1, 4, 'Salesman'),(2, 4, 'Commercial'),(3, 4, 'Salesman'),(4, 4, 'Verkäufer'),(5, 4, 'Venditore'); + +INSERT INTO `PREFIX_store` (`id_store`, `id_country`, `id_state`, `name`, `address1`, `address2`, `city`, `postcode`, `latitude`, `longitude`, `hours`, `phone`, `fax`, `email`, `note`, `active`, `date_add`, `date_upd`) VALUES +(1, 21, 9, 'Dade County', '3030 SW 8th St Miami', '', 'Miami', ' 33135', 25.765005, -80.243797, 'a:7:{i:0;s:13:"09:00 - 19:00";i:1;s:13:"09:00 - 19:00";i:2;s:13:"09:00 - 19:00";i:3;s:13:"09:00 - 19:00";i:4;s:13:"09:00 - 19:00";i:5;s:13:"10:00 - 16:00";i:6;s:13:"10:00 - 16:00";}', '', '', '', '', 1, '2010-11-09 10:53:13', '2010-11-09 10:53:13'), +(2, 21, 9, 'E Fort Lauderdale', '1000 Northeast 4th Ave Fort Lauderdale', '', 'miami', ' 33304', 26.137936, -80.139435, 'a:7:{i:0;s:13:"09:00 - 19:00";i:1;s:13:"09:00 - 19:00";i:2;s:13:"09:00 - 19:00";i:3;s:13:"09:00 - 19:00";i:4;s:13:"09:00 - 19:00";i:5;s:13:"10:00 - 16:00";i:6;s:13:"10:00 - 16:00";}', '', '', '', '', 1, '2010-11-09 10:56:26', '2010-11-09 10:56:26'), +(3, 21, 9, 'Pembroke Pines', '11001 Pines Blvd Pembroke Pines', '', 'miami', '33026', 26.009987, -80.294472, 'a:7:{i:0;s:13:"09:00 - 19:00";i:1;s:13:"09:00 - 19:00";i:2;s:13:"09:00 - 19:00";i:3;s:13:"09:00 - 19:00";i:4;s:13:"09:00 - 19:00";i:5;s:13:"10:00 - 16:00";i:6;s:13:"10:00 - 16:00";}', '', '', '', '', 1, '2010-11-09 10:58:42', '2010-11-09 11:01:11'), +(4, 21, 9, 'Coconut Grove', '2999 SW 32nd Avenue', '', ' Miami', ' 33133', 25.736296, -80.244797, 'a:7:{i:0;s:13:"09:00 - 19:00";i:1;s:13:"09:00 - 19:00";i:2;s:13:"09:00 - 19:00";i:3;s:13:"09:00 - 19:00";i:4;s:13:"09:00 - 19:00";i:5;s:13:"10:00 - 16:00";i:6;s:13:"10:00 - 16:00";}', '', '', '', '', 1, '2010-11-09 11:00:38', '2010-11-09 11:04:52'), +(5, 21, 9, 'N Miami/Biscayne', '12055 Biscayne Blvd', '', 'Miami', '33181', 25.886740, -80.163292, 'a:7:{i:0;s:13:"09:00 - 19:00";i:1;s:13:"09:00 - 19:00";i:2;s:13:"09:00 - 19:00";i:3;s:13:"09:00 - 19:00";i:4;s:13:"09:00 - 19:00";i:5;s:13:"10:00 - 16:00";i:6;s:13:"10:00 - 16:00";}', '', '', '', '', 1, '2010-11-09 11:11:28', '2010-11-09 11:11:28'); + +INSERT INTO `PREFIX_store_shop` (`id_store`, `id_shop`) (SELECT `id_store`, 1 FROM `PREFIX_store`); + +INSERT INTO `PREFIX_stock` (`id_stock`, `id_product`, `id_product_attribute`, `id_group_shop`, `id_shop`, `quantity`) VALUES +(1, 1, 25, 1, 1, 150), +(2, 1, 26, 1, 1, 120), +(3, 1, 27, 1, 1, 230), +(4, 1, 28, 1, 1, 150), +(5, 1, 29, 1, 1, 120), +(6, 1, 30, 1, 1, 230), +(7, 1, 31, 1, 1, 150), +(8, 1, 32, 1, 1, 120), +(9, 1, 33, 1, 1, 230), +(10, 1, 34, 1, 1, 150), +(11, 1, 35, 1, 1, 120), +(12, 1, 36, 1, 1, 230), +(13, 1, 39, 1, 1, 150), +(14, 1, 40, 1, 1, 120), +(15, 1, 41, 1, 1, 230), +(16, 1, 42, 1, 1, 150), +(17, 2, 7, 1, 1, 120), +(18, 2, 8, 1, 1, 230), +(19, 2, 9, 1, 1, 150), +(20, 2, 10, 1, 1, 120), +(21, 5, 12, 1, 1, 230), +(22, 5, 13, 1, 1, 150), +(23, 5, 14, 1, 1, 120), +(24, 5, 15, 1, 1, 230), +(25, 6, 0, 1, 1, 230), +(26, 7, 19, 1, 1, 150), +(27, 7, 22, 1, 1, 120), +(28, 7, 23, 1, 1, 230), +(29, 8, 0, 1, 1, 230), +(30, 9, 0, 1, 1, 150); \ No newline at end of file diff --git a/install-dev/sql/db_settings_lite.sql b/install-dev/sql/db_settings_lite.sql new file mode 100644 index 000000000..a19ac45d9 --- /dev/null +++ b/install-dev/sql/db_settings_lite.sql @@ -0,0 +1,1175 @@ +SET NAMES 'utf8'; + +INSERT INTO `PREFIX_hook` (`id_hook`, `name`, `title`, `description`, `position`, `live_edit`) VALUES +(1, 'payment', 'Payment', NULL, 1, 1), +(2, 'newOrder', 'New orders', NULL, 0, 0), +(3, 'paymentConfirm', 'Payment confirmation', NULL, 0, 0), +(4, 'paymentReturn', 'Payment return', NULL, 0, 0), +(5, 'updateQuantity', 'Quantity update', 'Quantity is updated only when the customer effectively place his order.', 0, 0), +(6, 'rightColumn', 'Right column blocks', NULL, 1, 1), +(7, 'leftColumn', 'Left column blocks', NULL, 1, 1), +(8, 'home', 'Homepage content', NULL, 1, 1), +(9, 'header', 'Header of pages', 'A hook which allow you to do things in the header of each pages', 1, 0), +(10, 'cart', 'Cart creation and update', NULL, 0, 0), +(11, 'authentication', 'Successful customer authentication', NULL, 0, 0), +(12, 'addproduct', 'Product creation', NULL, 0, 0), +(13, 'updateproduct', 'Product Update', NULL, 0, 0), +(14, 'top', 'Top of pages', 'A hook which allow you to do things a the top of each pages.', 1, 0), +(15, 'extraRight', 'Extra actions on the product page (right column).', NULL, 0, 0), +(16, 'deleteproduct', 'Product deletion', 'This hook is called when a product is deleted', 0, 0), +(17, 'productfooter', 'Product footer', 'Add new blocks under the product description', 1, 1), +(18, 'invoice', 'Invoice', 'Add blocks to invoice (order)', 1, 0), +(19, 'updateOrderStatus', 'Order''s status update event', 'Launch modules when the order''s status of an order change.', 0, 0), +(20, 'adminOrder', 'Display in Back-Office, tab AdminOrder', 'Launch modules when the tab AdminOrder is displayed on back-office.', 0, 0), +(21, 'footer', 'Footer', 'Add block in footer', 1, 0), +(22, 'PDFInvoice', 'PDF Invoice', 'Allow the display of extra informations into the PDF invoice', 0, 0), +(23, 'adminCustomers', 'Display in Back-Office, tab AdminCustomers', 'Launch modules when the tab AdminCustomers is displayed on back-office.', 0, 0), +(24, 'orderConfirmation', 'Order confirmation page', 'Called on order confirmation page', 0, 0), +(25, 'createAccount', 'Successful customer create account', 'Called when new customer create account successfuled', 0, 0), +(26, 'customerAccount', 'Customer account page display in front office', 'Display on page account of the customer', 1, 0), +(27, 'orderSlip', 'Called when a order slip is created', 'Called when a quantity of one product change in an order.', 0, 0), +(28, 'productTab', 'Tabs on product page', 'Called on order product page tabs', 0, 0), +(29, 'productTabContent', 'Content of tabs on product page', 'Called on order product page tabs', 0, 0), +(30, 'shoppingCart', 'Shopping cart footer', 'Display some specific informations on the shopping cart page', 0, 0), +(31, 'createAccountForm', 'Customer account creation form', 'Display some information on the form to create a customer account', 1, 0), +(32, 'AdminStatsModules','Stats - Modules', NULL, 1, 0), +(33, 'GraphEngine','Graph Engines', NULL, 0, 0), +(34, 'orderReturn','Product returned', NULL, 0, 0), +(35, 'productActions', 'Product actions', 'Put new action buttons on product page', 1, 0), +(36, 'backOfficeHome', 'Administration panel homepage', NULL, 1, 0), +(37, 'GridEngine','Grid Engines', NULL, 0, 0), +(38, 'watermark','Watermark', NULL, 0, 0), +(39, 'cancelProduct', 'Product cancelled', 'This hook is called when you cancel a product in an order', 0, 0), +(40, 'extraLeft', 'Extra actions on the product page (left column).', NULL, 0, 0), +(41, 'productOutOfStock', 'Product out of stock', 'Make action while product is out of stock', 1, 0), +(42, 'updateProductAttribute', 'Product attribute update', NULL, 0, 0), +(43, 'extraCarrier', 'Extra carrier (module mode)', NULL, 0, 0), +(44, 'shoppingCartExtra', 'Shopping cart extra button', 'Display some specific informations', 1, 0), +(45, 'search', 'Search', NULL, 0, 0), +(46, 'backBeforePayment', 'Redirect in order process', 'Redirect user to the module instead of displaying payment modules', 0, 0), +(47, 'updateCarrier', 'Carrier Update', 'This hook is called when a carrier is updated', 0, 0), +(48, 'postUpdateOrderStatus', 'Post update of order status', NULL, 0, 0), +(49, 'createAccountTop', 'Block above the form for create an account', NULL, 1, 0), +(50, 'backOfficeHeader', 'Administration panel header', NULL , 0, 0), +(51, 'backOfficeTop', 'Administration panel hover the tabs', NULL , 1, 0), +(52, 'backOfficeFooter', 'Administration panel footer', NULL , 1, 0), +(53, 'deleteProductAttribute', 'Product Attribute Deletion', NULL, 0, 0), +(54, 'processCarrier', 'Carrier Process', NULL, 0, 0), +(55, 'orderDetail', 'Order Detail', 'To set the follow-up in smarty when order detail is called', 0, 0), +(56, 'beforeCarrier', 'Before carrier list', 'This hook is display before the carrier list on Front office', 1, 0), +(57, 'orderDetailDisplayed', 'Order detail displayed', 'Displayed on order detail on front office', 1, 0), +(58, 'paymentCCAdded', 'Payment CC added', 'Payment CC added', 0, 0), +(59, 'extraProductComparison', 'Extra Product Comparison', 'Extra Product Comparison', 0, 0), +(60, 'categoryAddition', 'Category creation', '', 0, 0), +(61, 'categoryUpdate', 'Category modification', '', 0, 0), +(62, 'categoryDeletion', 'Category removal', '', 0, 0), +(63, 'beforeAuthentication', 'Before Authentication', 'Before authentication', 0, 0), +(64, 'paymentTop', 'Top of payment page', 'Top of payment page', 0, 0), +(65, 'afterCreateHtaccess', 'After htaccess creation', 'After htaccess creation', 0, 0), +(66, 'afterSaveAdminMeta', 'After save configuration in AdminMeta', 'After save configuration in AdminMeta', 0, 0); + +INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES +(1, 'PS_LANG_DEFAULT', '1', NOW(), NOW()), +(2, 'PS_CURRENCY_DEFAULT', '1', NOW(), NOW()), +(3, 'PS_COUNTRY_DEFAULT', '8', NOW(), NOW()), +(4, 'PS_REWRITING_SETTINGS', '0', NOW(), NOW()), +(5, 'PS_ORDER_OUT_OF_STOCK', '0', NOW(), NOW()), +(6, 'PS_LAST_QTIES', '3', NOW(), NOW()), +(7, 'PS_CART_REDIRECT', '1', NOW(), NOW()), +(8, 'PS_HELPBOX', '1', NOW(), NOW()), +(9, 'PS_CONDITIONS', '1', NOW(), NOW()), +(10, 'PS_RECYCLABLE_PACK', '1', NOW(), NOW()), +(11, 'PS_GIFT_WRAPPING', '1', NOW(), NOW()), +(12, 'PS_GIFT_WRAPPING_PRICE', '0', NOW(), NOW()), +(13, 'PS_STOCK_MANAGEMENT', '1', NOW(), NOW()), +(14, 'PS_NAVIGATION_PIPE', '>', NOW(), NOW()), +(15, 'PS_PRODUCTS_PER_PAGE', '10', NOW(), NOW()), +(16, 'PS_PURCHASE_MINIMUM', '0', NOW(), NOW()), +(17, 'PS_PRODUCTS_ORDER_WAY', '0', NOW(), NOW()), +(18, 'PS_PRODUCTS_ORDER_BY', '4', NOW(), NOW()), +(19, 'PS_DISPLAY_QTIES', '1', NOW(), NOW()), +(20, 'PS_SHIPPING_HANDLING', '2', NOW(), NOW()), +(21, 'PS_SHIPPING_FREE_PRICE', '0', NOW(), NOW()), +(22, 'PS_SHIPPING_FREE_WEIGHT', '0', NOW(), NOW()), +(23, 'PS_SHIPPING_METHOD', '1', NOW(), NOW()), +(24, 'PS_TAX', '1', NOW(), NOW()), +(25, 'PS_SHOP_ENABLE', '1', NOW(), NOW()), +(26, 'PS_NB_DAYS_NEW_PRODUCT', '20', NOW(), NOW()), +(27, 'PS_SSL_ENABLED', '0', NOW(), NOW()), +(28, 'PS_WEIGHT_UNIT', 'kg', NOW(), NOW()), +(29, 'PS_BLOCK_CART_AJAX', '1', NOW(), NOW()), +(30, 'PS_ORDER_RETURN', '0', NOW(), NOW()), +(31, 'PS_ORDER_RETURN_NB_DAYS', '7', NOW(), NOW()), +(32, 'PS_MAIL_TYPE', '3', NOW(), NOW()), +(33, 'PS_PRODUCT_PICTURE_MAX_SIZE', '131072', NOW(), NOW()), +(34, 'PS_PRODUCT_PICTURE_WIDTH', '64', NOW(), NOW()), +(35, 'PS_PRODUCT_PICTURE_HEIGHT', '64', NOW(), NOW()), +(36, 'PS_INVOICE_PREFIX', 'IN', NOW(), NOW()), +(37, 'PS_INVOICE_NUMBER', '1', NOW(), NOW()), +(38, 'PS_DELIVERY_PREFIX', 'DE', NOW(), NOW()), +(39, 'PS_DELIVERY_NUMBER', '1', NOW(), NOW()), +(40, 'PS_INVOICE', '1', NOW(), NOW()), +(41, 'PS_PASSWD_TIME_BACK', '360', NOW(), NOW()), +(42, 'PS_PASSWD_TIME_FRONT', '360', NOW(), NOW()), +(43, 'PS_DISP_UNAVAILABLE_ATTR', '1', NOW(), NOW()), +(44, 'PS_VOUCHERS', '1', NOW(), NOW()), +(45, 'PS_SEARCH_MINWORDLEN', '3', NOW(), NOW()), +(46, 'PS_SEARCH_BLACKLIST', '', NOW(), NOW()), +(47, 'PS_SEARCH_WEIGHT_PNAME', '6', NOW(), NOW()), +(48, 'PS_SEARCH_WEIGHT_REF', '10', NOW(), NOW()), +(49, 'PS_SEARCH_WEIGHT_SHORTDESC', '1', NOW(), NOW()), +(50, 'PS_SEARCH_WEIGHT_DESC', '1', NOW(), NOW()), +(51, 'PS_SEARCH_WEIGHT_CNAME', '3', NOW(), NOW()), +(52, 'PS_SEARCH_WEIGHT_MNAME', '3', NOW(), NOW()), +(53, 'PS_SEARCH_WEIGHT_TAG', '4', NOW(), NOW()), +(54, 'PS_SEARCH_WEIGHT_ATTRIBUTE', '2', NOW(), NOW()), +(55, 'PS_SEARCH_WEIGHT_FEATURE', '2', NOW(), NOW()), +(56, 'PS_SEARCH_AJAX', '1', NOW(), NOW()), +(57, 'PS_TIMEZONE', 'Europe/Paris', NOW(), NOW()), +(58, 'PS_THEME_V11', 0, NOW(), NOW()), +(59, 'PRESTASTORE_LIVE', 1, NOW(), NOW()), +(60, 'PS_TIN_ACTIVE', 0, NOW(), NOW()), +(61, 'PS_SHOW_ALL_MODULES', 0, NOW(), NOW()), +(62, 'PS_BACKUP_ALL', 0, NOW(), NOW()), +(63, 'PS_1_3_UPDATE_DATE', NOW(), NOW(), NOW()), +(64, 'PS_PRICE_ROUND_MODE', 2, NOW(), NOW()), +(65, 'PS_1_3_2_UPDATE_DATE', NOW(), NOW(), NOW()), +(66, 'PS_CONDITIONS_CMS_ID', 3, NOW(), NOW()), +(67, 'TRACKING_DIRECT_TRAFFIC', 0, NOW(), NOW()), +(68, 'PS_META_KEYWORDS', 0, NOW(), NOW()), +(69, 'PS_DISPLAY_JQZOOM', 0, NOW(), NOW()), +(70, 'PS_VOLUME_UNIT', 'cl', NOW(), NOW()), +(71, 'PS_CIPHER_ALGORITHM', 0, NOW(), NOW()), +(72, 'PS_ATTRIBUTE_CATEGORY_DISPLAY', 1, NOW(), NOW()), +(73, 'PS_CUSTOMER_SERVICE_FILE_UPLOAD', 1, NOW(), NOW()), +(74, 'PS_CUSTOMER_SERVICE_SIGNATURE', '', NOW(), NOW()), +(75, 'PS_BLOCK_BESTSELLERS_DISPLAY', 0, NOW(), NOW()), +(76, 'PS_BLOCK_NEWPRODUCTS_DISPLAY', 0, NOW(), NOW()), +(77, 'PS_BLOCK_SPECIALS_DISPLAY', 0, NOW(), NOW()), +(78, 'PS_STOCK_MVT_REASON_DEFAULT', 3, NOW(), NOW()), +(79, 'PS_COMPARATOR_MAX_ITEM', 3, NOW(), NOW()), +(80, 'PS_ORDER_PROCESS_TYPE', 0, NOW(), NOW()), +(81, 'PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW()), +(82, 'PS_TAX_DISPLAY', 0, NOW(), NOW()), +(83, 'PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW()), +(84, 'PS_DISTANCE_UNIT', 'km', NOW(), NOW()), +(85, 'PS_STORES_DISPLAY_CMS', 1, NOW(), NOW()), +(86, 'PS_STORES_DISPLAY_FOOTER', 1, NOW(), NOW()), +(87, 'PS_STORES_SIMPLIFIED', 0, NOW(), NOW()), +(88, 'SHOP_LOGO_WIDTH', 224, NOW(), NOW()), +(89, 'SHOP_LOGO_HEIGHT', 73, NOW(), NOW()), +(90, 'EDITORIAL_IMAGE_WIDTH', 530, NOW(), NOW()), +(91, 'EDITORIAL_IMAGE_HEIGHT', 228, NOW(), NOW()), +(92, 'PS_STATSDATA_CUSTOMER_PAGESVIEWS', 0, NOW(), NOW()), +(93, 'PS_STATSDATA_PAGESVIEWS', 0, NOW(), NOW()), +(94, 'PS_STATSDATA_PLUGINS', 0, NOW(), NOW()), +(95, 'PS_GEOLOCATION_ENABLED', '0', NOW(), NOW()), +(96, 'PS_ALLOWED_COUNTRIES', 'AF;ZA;AX;AL;DZ;DE;AD;AO;AI;AQ;AG;AN;SA;AR;AM;AW;AU;AT;AZ;BS;BH;BD;BB;BY;BE;BZ;BJ;BM;BT;BO;BA;BW;BV;BR;BN;BG;BF;MM;BI;KY;KH;CM;CA;CV;CF;CL;CN;CX;CY;CC;CO;KM;CG;CD;CK;KR;KP;CR;CI;HR;CU;DK;DJ;DM;EG;IE;SV;AE;EC;ER;ES;EE;ET;FK;FO;FJ;FI;FR;GA;GM;GE;GS;GH;GI;GR;GD;GL;GP;GU;GT;GG;GN;GQ;GW;GY;GF;HT;HM;HN;HK;HU;IM;MU;VG;VI;IN;ID;IR;IQ;IS;IL;IT;JM;JP;JE;JO;KZ;KE;KG;KI;KW;LA;LS;LV;LB;LR;LY;LI;LT;LU;MO;MK;MG;MY;MW;MV;ML;MT;MP;MA;MH;MQ;MR;YT;MX;FM;MD;MC;MN;ME;MS;MZ;NA;NR;NP;NI;NE;NG;NU;NF;NO;NC;NZ;IO;OM;UG;UZ;PK;PW;PS;PA;PG;PY;NL;PE;PH;PN;PL;PF;PR;PT;QA;DO;CZ;RE;RO;GB;RU;RW;EH;BL;KN;SM;MF;PM;VA;VC;LC;SB;WS;AS;ST;SN;RS;SC;SL;SG;SK;SI;SO;SD;LK;SE;CH;SR;SJ;SZ;SY;TJ;TW;TZ;TD;TF;TH;TL;TG;TK;TO;TT;TN;TM;TC;TR;TV;UA;UY;US;VU;VE;VN;WF;YE;ZM;ZW', NOW(), NOW()), +(97, 'PS_GEOLOCATION_BEHAVIOR', '0', NOW(), NOW()), +(98, 'PS_LOCALE_LANGUAGE', '', NOW(), NOW()), +(99, 'PS_LOCALE_COUNTRY', '', NOW(), NOW()), +(100, 'PS_ATTACHMENT_MAXIMUM_SIZE', '2', NOW(), NOW()), +(101, 'PS_SMARTY_CACHE', '1', NOW(), NOW()), +(102, 'PS_DIMENSION_UNIT', 'cm', NOW(), NOW()), +(103, 'PS_FORCE_SMARTY_2', '0', NOW(), NOW()), +(104, 'PS_GUEST_CHECKOUT_ENABLED', '0', NOW(), NOW()), +(105, 'PS_DISPLAY_SUPPLIERS', '1', NOW(), NOW()), +(106, 'PS_CATALOG_MODE', '0', NOW(), NOW()), +(107, 'PS_GEOLOCATION_WHITELIST', '209.185.108;209.185.253;209.85.238;209.85.238.11;209.85.238.4;216.239.33.96;216.239.33.97;216.239.33.98;216.239.33.99;216.239.37.98;216.239.37.99;216.239.39.98;216.239.39.99;216.239.41.96;216.239.41.97;216.239.41.98;216.239.41.99;216.239.45.4;216.239.46;216.239.51.96;216.239.51.97;216.239.51.98;216.239.51.99;216.239.53.98;216.239.53.99;216.239.57.96;216.239.57.97;216.239.57.98;216.239.57.99;216.239.59.98;216.239.59.99;216.33.229.163;64.233.173.193;64.233.173.194;64.233.173.195;64.233.173.196;64.233.173.197;64.233.173.198;64.233.173.199;64.233.173.200;64.233.173.201;64.233.173.202;64.233.173.203;64.233.173.204;64.233.173.205;64.233.173.206;64.233.173.207;64.233.173.208;64.233.173.209;64.233.173.210;64.233.173.211;64.233.173.212;64.233.173.213;64.233.173.214;64.233.173.215;64.233.173.216;64.233.173.217;64.233.173.218;64.233.173.219;64.233.173.220;64.233.173.221;64.233.173.222;64.233.173.223;64.233.173.224;64.233.173.225;64.233.173.226;64.233.173.227;64.233.173.228;64.233.173.229;64.233.173.230;64.233.173.231;64.233.173.232;64.233.173.233;64.233.173.234;64.233.173.235;64.233.173.236;64.233.173.237;64.233.173.238;64.233.173.239;64.233.173.240;64.233.173.241;64.233.173.242;64.233.173.243;64.233.173.244;64.233.173.245;64.233.173.246;64.233.173.247;64.233.173.248;64.233.173.249;64.233.173.250;64.233.173.251;64.233.173.252;64.233.173.253;64.233.173.254;64.233.173.255;64.68.80;64.68.81;64.68.82;64.68.83;64.68.84;64.68.85;64.68.86;64.68.87;64.68.88;64.68.89;64.68.90.1;64.68.90.10;64.68.90.11;64.68.90.12;64.68.90.129;64.68.90.13;64.68.90.130;64.68.90.131;64.68.90.132;64.68.90.133;64.68.90.134;64.68.90.135;64.68.90.136;64.68.90.137;64.68.90.138;64.68.90.139;64.68.90.14;64.68.90.140;64.68.90.141;64.68.90.142;64.68.90.143;64.68.90.144;64.68.90.145;64.68.90.146;64.68.90.147;64.68.90.148;64.68.90.149;64.68.90.15;64.68.90.150;64.68.90.151;64.68.90.152;64.68.90.153;64.68.90.154;64.68.90.155;64.68.90.156;64.68.90.157;64.68.90.158;64.68.90.159;64.68.90.16;64.68.90.160;64.68.90.161;64.68.90.162;64.68.90.163;64.68.90.164;64.68.90.165;64.68.90.166;64.68.90.167;64.68.90.168;64.68.90.169;64.68.90.17;64.68.90.170;64.68.90.171;64.68.90.172;64.68.90.173;64.68.90.174;64.68.90.175;64.68.90.176;64.68.90.177;64.68.90.178;64.68.90.179;64.68.90.18;64.68.90.180;64.68.90.181;64.68.90.182;64.68.90.183;64.68.90.184;64.68.90.185;64.68.90.186;64.68.90.187;64.68.90.188;64.68.90.189;64.68.90.19;64.68.90.190;64.68.90.191;64.68.90.192;64.68.90.193;64.68.90.194;64.68.90.195;64.68.90.196;64.68.90.197;64.68.90.198;64.68.90.199;64.68.90.2;64.68.90.20;64.68.90.200;64.68.90.201;64.68.90.202;64.68.90.203;64.68.90.204;64.68.90.205;64.68.90.206;64.68.90.207;64.68.90.208;64.68.90.21;64.68.90.22;64.68.90.23;64.68.90.24;64.68.90.25;64.68.90.26;64.68.90.27;64.68.90.28;64.68.90.29;64.68.90.3;64.68.90.30;64.68.90.31;64.68.90.32;64.68.90.33;64.68.90.34;64.68.90.35;64.68.90.36;64.68.90.37;64.68.90.38;64.68.90.39;64.68.90.4;64.68.90.40;64.68.90.41;64.68.90.42;64.68.90.43;64.68.90.44;64.68.90.45;64.68.90.46;64.68.90.47;64.68.90.48;64.68.90.49;64.68.90.5;64.68.90.50;64.68.90.51;64.68.90.52;64.68.90.53;64.68.90.54;64.68.90.55;64.68.90.56;64.68.90.57;64.68.90.58;64.68.90.59;64.68.90.6;64.68.90.60;64.68.90.61;64.68.90.62;64.68.90.63;64.68.90.64;64.68.90.65;64.68.90.66;64.68.90.67;64.68.90.68;64.68.90.69;64.68.90.7;64.68.90.70;64.68.90.71;64.68.90.72;64.68.90.73;64.68.90.74;64.68.90.75;64.68.90.76;64.68.90.77;64.68.90.78;64.68.90.79;64.68.90.8;64.68.90.80;64.68.90.9;64.68.91;64.68.92;66.249.64;66.249.65;66.249.66;66.249.67;66.249.68;66.249.69;66.249.70;66.249.71;66.249.72;66.249.73;66.249.78;66.249.79;72.14.199;8.6.48', NOW(), NOW()), +(108, 'PS_LOGS_BY_EMAIL', '5', NOW(), NOW()), +(109, 'PS_COOKIE_CHECKIP', '1', NOW(), NOW()), +(110, 'PS_STORES_CENTER_LAT', '25.948969', NOW(), NOW()), +(111, 'PS_STORES_CENTER_LONG', '-80.226439', NOW(), NOW()), +(112, 'PS_HOMEPAGE_PHP_SELF', 'index.php', NOW(), NOW()), +(113, 'PS_USE_ECOTAX', '0', NOW(), NOW()), +(114, 'PS_CANONICAL_REDIRECT', '1', NOW(), NOW()), +(115, 'PS_IMG_UPDATE_TIME', UNIX_TIMESTAMP(), NOW(), NOW()), +(116, 'PS_BACKUP_DROP_TABLE', 1, NOW(), NOW()), +(117, 'PS_LEGACY_IMAGES', '1', NOW(), NOW()); + +INSERT INTO `PREFIX_configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES +(36, 1, 'IN', NOW()),(36, 2, 'FA', NOW()),(36, 3, 'CU', NOW()),(36, 4, 'FA', NOW()),(36, 5, 'FA', NOW()), +(38, 1, 'DE', NOW()),(38, 2, 'LI', NOW()),(38, 3, 'EN', NOW()),(38, 4, 'LI', NOW()),(38, 5, 'BC', NOW()), +(46, 1, 'a|the|of|on|in|and|to', NOW()),(46, 2, 'le|les|de|et|en|des|les|une', NOW()),(46, 3, 'de|los|las|lo|la|en|de|y|el|a', NOW()),(46, 4, '', NOW()),(46, 5, '', NOW()), +(68, 1, 0, NOW()),(68, 2, 0, NOW()),(68, 3, 0, NOW()),(68, 4, 0, NOW()),(68, 5, 0, NOW()), +(74, 1, 'Dear Customer,\r\n\r\nRegards,\r\nCustomer service', NOW()), +(74, 2, 'Cher client,\r\n\r\nCordialement,\r\nLe service client', NOW()), +(74, 3, 'Estimado cliente,\r\n\r\nUn cordial saludo,\r\nAtención al cliente', NOW()), +(74, 4, 'Lieber Kunde,\r\n\r\nMit freundlichen Grüßen,\r\nIhr Kundenservice', NOW()), +(74, 5, 'Gentile Cliente,\r\n\r\nCordiali saluti,\r\nServizio Clienti', NOW()); + +INSERT INTO `PREFIX_lang` (`id_lang`, `name`, `active`, `iso_code`, `language_code`) VALUES +(1, 'English (English)', 1, 'en', 'en-us'),(2, 'Français (French)', 1, 'fr', 'fr'),(3, 'Español (Spanish)', 1, 'es', 'es'),(4, 'Deutsch (German)', 1, 'de', 'de'),(5, 'Italiano (Italian)', 1, 'it', 'it'); + +INSERT INTO `PREFIX_lang_shop` (`id_lang`, `id_shop`) VALUES (1,1), (2,1), (3,1), (4,1), (5,1); + +INSERT INTO `PREFIX_category` (`id_category`, `id_parent`, `level_depth`, `nleft`, `nright`, `active`, `date_add`, `date_upd`, `position`) VALUES (1, 0, 0, 1, 8, 1, NOW(), NOW(), 0); +INSERT INTO `PREFIX_category_lang` (`id_category`, `id_lang`, `name`, `description`, `link_rewrite`, `meta_title`, `meta_keywords`, `meta_description`) VALUES +(1, 1, 'Home', '', 'home', NULL, NULL, NULL),(1, 2, 'Accueil', '', 'home', NULL, NULL, NULL),(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL),(1, 4, 'Start', '', 'home', NULL, NULL, NULL),(1, 5, 'Home page', '', 'home', NULL, NULL, NULL); + +INSERT INTO `PREFIX_order_state` (`id_order_state`, `invoice`, `send_email`, `color`, `unremovable`, `logable`, `delivery`) VALUES +(1, 0, 1, 'lightblue', 1, 0, 0),(2, 1, 1, '#DDEEFF', 1, 1, 0),(3, 1, 1, '#FFDD99', 1, 1, 1),(4, 1, 1, '#EEDDFF', 1, 1, 1),(5, 1, 0, '#DDFFAA', 1, 1, 1), +(6, 0, 1, '#DADADA', 1, 0, 0),(7, 1, 1, '#FFFFBB', 1, 0, 0),(8, 0, 1, '#FFDFDF', 1, 0, 0),(9, 1, 1, '#FFD3D3', 1, 0, 0),(10, 0, 1, 'lightblue', 1, 0, 0),(11, 0, 0, 'lightblue', 1, 0, 0),(12, 0, 0, 'lightblue', 1, 0, 0); + +INSERT INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) VALUES +(1, 1, 'Awaiting cheque payment', 'cheque'), +(2, 1, 'Payment accepted', 'payment'), +(3, 1, 'Preparation in progress', 'preparation'), +(4, 1, 'Shipped', 'shipped'), +(5, 1, 'Delivered', ''), +(6, 1, 'Canceled', 'order_canceled'), +(7, 1, 'Refund', 'refund'), +(8, 1, 'Payment error', 'payment_error'), +(9, 1, 'On backorder', 'outofstock'), +(10, 1, 'Awaiting bank wire payment', 'bankwire'), +(11, 1, 'Awaiting PayPal payment', ''), +(12, 1, 'Payment remotely accepted', ''), +(1, 2, 'En attente du paiement par chèque', 'cheque'), +(2, 2, 'Paiement accepté', 'payment'), +(3, 2, 'Préparation en cours', 'preparation'), +(4, 2, 'En cours de livraison', 'shipped'), +(5, 2, 'Livré', ''), +(6, 2, 'Annulé', 'order_canceled'), +(7, 2, 'Remboursé', 'refund'), +(8, 2, 'Erreur de paiement', 'payment_error'), +(9, 2, 'En attente de réapprovisionnement', 'outofstock'), +(10, 2, 'En attente du paiement par virement bancaire', 'bankwire'), +(11, 2, 'En attente du paiement par PayPal', ''), +(12, 2, 'Paiement à distance accepté', ''), +(1, 3, 'En espera de pago por cheque', 'cheque'), +(2, 3, 'Pago aceptamos', 'payment'), +(3, 3, 'Preparación en curso', 'preparation'), +(4, 3, 'Enviado', 'shipped'), +(5, 3, 'Entregado', ''), +(6, 3, 'Cancelada', 'order_canceled'), +(7, 3, 'Reembolsado', 'refund'), +(8, 3, 'Error de pago', 'payment_error'), +(9, 3, 'Productos fuera de línea', 'outofstock'), +(10, 3, 'En espera de pago por transferencia bancaria', 'bankwire'), +(11, 3, 'En espera de pago por PayPal', ''), +(12, 3, 'Payment remotely accepted', ''), +(1, 4, 'Scheckzahlung wird erwartet', 'cheque'), +(2, 4, 'Zahlung eingegangen', 'payment'), +(3, 4, 'Bestellung eingegangen', 'preparation'), +(4, 4, 'Versendet', 'shipped'), +(5, 4, 'Erfolgreich abgeschlossen', ''), +(6, 4, 'Storniert', 'order_canceled'), +(7, 4, 'Erstattet', 'refund'), +(8, 4, 'Fehler bei der Bezahlung', 'payment_error'), +(9, 4, 'Artikel erwartet', 'outofstock'), +(10, 4, 'Warten auf Zahlungseingang', 'bankwire'), +(11, 4, 'Warten auf Zahlungseingang von PayPal', ''), +(12, 4, 'Payment Anmeldung erfolgreich', ''), +(1, 5, 'In attesa di pagamento con assegno', 'cheque'), +(2, 5, 'Pagamento accettato', 'payment'), +(3, 5, 'Preparazione in corso', 'preparation'), +(4, 5, 'Consegna in corso', 'shipped'), +(5, 5, 'Consegnato', ''), +(6, 5, 'Annullato', 'order_canceled'), +(7, 5, 'Rimborsato', 'refund'), +(8, 5, 'Errore di pagamento', 'payment_error'), +(9, 5, 'In attesa di rifornimento', 'outofstock'), +(10, 5, 'In attesa di pagamento con bonifico bancario', 'bankwire'), +(11, 5, 'In attesa di pagamento con PayPal', ''), +(12, 5, 'Payment remotely accepted', ''); + +INSERT INTO `PREFIX_zone` (`id_zone`, `name`, `active`) VALUES +(1, 'Europe', 1),(2, 'North America', 1),(3, 'Asia', 1),(4, 'Africa', 1), +(5, 'Oceania', 1),(6, 'South America', 1),(7, 'Europe (out E.U)', 1),(8, 'Centrale America/Antilla', 1); + +INSERT INTO `PREFIX_zone_group_shop` (`id_zone`, `id_group_shop`) (SELECT `id_zone`, 1 FROM `PREFIX_zone`); + +INSERT INTO `PREFIX_country` (`id_country`, `id_zone`, `iso_code`, `call_prefix`, `active`, `contains_states`, `need_identification_number`, `need_zip_code`, `zip_code_format`, `display_tax_label`) VALUES +(1, 1, 'DE', 49, 1, 0, 0, 1, 'NNNNN', 1),(2, 1, 'AT', 43, 1, 0, 0, 1, 'NNNN', 1),(3, 1, 'BE', 32, 1, 0, 0, 1, 'NNNN', 1),(4, 2, 'CA', 1, 1, 1, 0, 1, 'LNL NLN', 0),(5, 3, 'CN', 86, 1, 0, 0, 1, 'NNNNNN', 1), +(6, 1, 'ES', 34, 1, 0, 1, 1, 'NNNNN', 1),(7, 1, 'FI', 358, 1, 0, 0, 1, 'NNNNN', 1),(8, 1, 'FR', 33, 1, 0, 0, 1, 'NNNNN', 1),(9, 1, 'GR', 30, 1, 0, 0, 1, 'NNNNN', 1),(10, 1, 'IT', 39, 1, 1, 0, 1, 'NNNNN', 1), +(11, 3, 'JP', 81, 1, 0, 0, 1, 'NNN-NNNN', 1),(12, 1, 'LU', 352, 1, 0, 0, 1, 'NNNN', 1),(13, 1, 'NL', 31, 1, 0, 0, 1, 'NNNN LL', 1),(14, 1, 'PL', 48, 1, 0, 0, 1, 'NN-NNN', 1), +(15, 1, 'PT', 351, 1, 0, 0, 1, 'NNNN NNN', 1),(16, 1, 'CZ', 420, 1, 0, 0, 1, 'NNN NN', 1),(17, 1, 'GB', 44, 1, 0, 0, 1, '', 1),(18, 1, 'SE', 46, 1, 0, 0, 1, 'NNN NN', 1), +(19, 7, 'CH', 41, 1, 0, 0, 1, 'NNNN', 1),(20, 1, 'DK', 45, 1, 0, 0, 1, 'NNNN', 1),(21, 2, 'US', 1, 1, 1, 0, 1, 'NNNNN', 1),(22, 3, 'HK', 852, 1, 0, 0, 0, '', 1),(23, 1, 'NO', 47, 1, 0, 0, 1, 'NNNN', 1), +(24, 5, 'AU', 61, 1, 0, 0, 1, 'NNNN', 1),(25, 3, 'SG', 65, 1, 0, 0, 1, 'NNNNNN', 1),(26, 1, 'IE', 353, 1, 0, 0, 1, '', 1),(27, 5, 'NZ', 64, 1, 0, 0, 1, 'NNNN', 1),(28, 3, 'KR', 82, 1, 0, 0, 1, 'NNN-NNN', 1), +(29, 3, 'IL', 972, 1, 0, 0, 1, 'NNNNN', 1),(30, 4, 'ZA', 27, 1, 0, 0, 1, 'NNNN', 1),(31, 4, 'NG', 234, 1, 0, 0, 1, '', 1),(32, 4, 'CI', 225, 1, 0, 0, 1, '', 1),(33, 4, 'TG', 228, 1, 0, 0, 1, '', 1), +(34, 6, 'BO', 591, 1, 0, 0, 1, '', 1),(35, 4, 'MU', 230, 1, 0, 0, 1, '', 1),(36, 1, 'RO', 40, 1, 0, 0, 1, 'NNNNNN', 1),(37, 1, 'SK', 421, 1, 0, 0, 1, 'NNN NN', 1),(38, 4, 'DZ', 213, 1, 0, 0, 1, 'NNNNN', 1), +(39, 2, 'AS', 0, 1, 0, 0, 1, '', 1),(40, 7, 'AD', 376, 1, 0, 0, 1, 'CNNN', 1),(41, 4, 'AO', 244, 1, 0, 0, 0, '', 1),(42, 8, 'AI', 0, 1, 0, 0, 1, '', 1),(43, 2, 'AG', 0, 1, 0, 0, 1, '', 1), +(44, 6, 'AR', 54, 1, 1, 0, 1, 'LNNNN', 1),(45, 3, 'AM', 374, 1, 0, 0, 1, 'NNNN', 1),(46, 8, 'AW', 297, 1, 0, 0, 1, '', 1),(47, 3, 'AZ', 994, 1, 0, 0, 1, 'CNNNN', 1),(48, 2, 'BS', 0, 1, 0, 0, 1, '', 1), +(49, 3, 'BH', 973, 1, 0, 0, 1, '', 1),(50, 3, 'BD', 880, 1, 0, 0, 1, 'NNNN', 1),(51, 2, 'BB', 0, 1, 0, 0, 1, 'CNNNNN', 1),(52, 7, 'BY', 0, 1, 0, 0, 1, 'NNNNNN', 1),(53, 8, 'BZ', 501, 1, 0, 0, 0, '', 1), +(54, 4, 'BJ', 229, 1, 0, 0, 0, '', 1),(55, 2, 'BM', 0, 1, 0, 0, 1, '', 1),(56, 3, 'BT', 975, 1, 0, 0, 1, '', 1),(57, 4, 'BW', 267, 1, 0, 0, 1, '', 1),(58, 6, 'BR', 55, 1, 0, 0, 1, 'NNNNN-NNN', 1), +(59, 3, 'BN', 673, 1, 0, 0, 1, 'LLNNNN', 1),(60, 4, 'BF', 226, 1, 0, 0, 1, '', 1),(61, 3, 'MM', 95, 1, 0, 0, 1, '', 1),(62, 4, 'BI', 257, 1, 0, 0, 1, '', 1),(63, 3, 'KH', 855, 1, 0, 0, 1, 'NNNNN', 1), +(64, 4, 'CM', 237, 1, 0, 0, 1, '', 1),(65, 4, 'CV', 238, 1, 0, 0, 1, 'NNNN', 1),(66, 4, 'CF', 236, 1, 0, 0, 1, '', 1),(67, 4, 'TD', 235, 1, 0, 0, 1, '', 1),(68, 6, 'CL', 56, 1, 0, 0, 1, 'NNN-NNNN', 1), +(69, 6, 'CO', 57, 1, 0, 0, 1, 'NNNNNN', 1),(70, 4, 'KM', 269, 1, 0, 0, 1, '', 1),(71, 4, 'CD', 242, 1, 0, 0, 1, '', 1),(72, 4, 'CG', 243, 1, 0, 0, 1, '', 1),(73, 8, 'CR', 506, 1, 0, 0, 1, 'NNNNN', 1), +(74, 7, 'HR', 385, 1, 0, 0, 1, 'NNNNN', 1),(75, 8, 'CU', 53, 1, 0, 0, 1, '', 1),(76, 1, 'CY', 357, 1, 0, 0, 1, 'NNNN', 1),(77, 4, 'DJ', 253, 1, 0, 0, 1, '', 1),(78, 8, 'DM', 0, 1, 0, 0, 1, '', 1), +(79, 8, 'DO', 0, 1, 0, 0, 1, '', 1),(80, 3, 'TL', 670, 1, 0, 0, 1, '', 1),(81, 6, 'EC', 593, 1, 0, 0, 1, 'CNNNNNN', 1),(82, 4, 'EG', 20, 1, 0, 0, 0, '', 1),(83, 8, 'SV', 503, 1, 0, 0, 1, '', 1), +(84, 4, 'GQ', 240, 1, 0, 0, 1, '', 1),(85, 4, 'ER', 291, 1, 0, 0, 1, '', 1),(86, 1, 'EE', 372, 1, 0, 0, 1, 'NNNNN', 1),(87, 4, 'ET', 251, 1, 0, 0, 1, '', 1),(88, 8, 'FK', 0, 1, 0, 0, 1, 'LLLL NLL', 1), +(89, 7, 'FO', 298, 1, 0, 0, 1, '', 1),(90, 5, 'FJ', 679, 1, 0, 0, 1, '', 1),(91, 4, 'GA', 241, 1, 0, 0, 1, '', 1),(92, 4, 'GM', 220, 1, 0, 0, 1, '', 1),(93, 3, 'GE', 995, 1, 0, 0, 1, 'NNNN', 1), +(94, 4, 'GH', 233, 1, 0, 0, 1, '', 1),(95, 8, 'GD', 0, 1, 0, 0, 1, '', 1),(96, 7, 'GL', 299, 1, 0, 0, 1, '', 1),(97, 7, 'GI', 350, 1, 0, 0, 1, '', 1),(98, 8, 'GP', 590, 1, 0, 0, 1, '', 1), +(99, 8, 'GU', 0, 1, 0, 0, 1, '', 1),(100, 8, 'GT', 502, 1, 0, 0, 1, '', 1),(101, 7, 'GG', 0, 1, 0, 0, 1, 'LLN NLL', 1),(102, 4, 'GN', 224, 1, 0, 0, 1, '', 1),(103, 4, 'GW', 245, 1, 0, 0, 1, '', 1), +(104, 6, 'GY', 592, 1, 0, 0, 1, '', 1),(105, 8, 'HT', 509, 1, 0, 0, 1, '', 1),(106, 5, 'HM', 0, 1, 0, 0, 1, '', 1),(107, 7, 'VA', 379, 1, 0, 0, 1, 'NNNNN', 1),(108, 8, 'HN', 504, 1, 0, 0, 1, '', 1), +(109, 7, 'IS', 354, 1, 0, 0, 1, 'NNN', 1),(110, 3, 'IN', 91, 1, 0, 0, 1, 'NNN NNN', 1),(111, 3, 'ID', 62, 1, 0, 0, 1, 'NNNNN', 1),(112, 3, 'IR', 98, 1, 0, 0, 1, 'NNNNN-NNNNN', 1), +(113, 3, 'IQ', 964, 1, 0, 0, 1, 'NNNNN', 1),(114, 7, 'IM', 0, 1, 0, 0, 1, 'CN NLL', 1),(115, 8, 'JM', 0, 1, 0, 0, 1, '', 1),(116, 7, 'JE', 0, 1, 0, 0, 1, 'CN NLL', 1),(117, 3, 'JO', 962, 1, 0, 0, 1, '', 1), +(118, 3, 'KZ', 7, 1, 0, 0, 1, 'NNNNNN', 1),(119, 4, 'KE', 254, 1, 0, 0, 1, '', 1),(120, 7, 'KI', 686, 1, 0, 0, 1, '', 1),(121, 3, 'KP', 850, 1, 0, 0, 1, '', 1),(122, 3, 'KW', 965, 1, 0, 0, 1, '', 1), +(123, 3, 'KG', 996, 1, 0, 0, 1, '', 1),(124, 3, 'LA', 856, 1, 0, 0, 1, '', 1),(125, 1, 'LV', 371, 1, 0, 0, 1, 'C-NNNN', 1),(126, 3, 'LB', 961, 1, 0, 0, 1, '', 1),(127, 4, 'LS', 266, 1, 0, 0, 1, '', 1), +(128, 4, 'LR', 231, 1, 0, 0, 1, '', 1),(129, 4, 'LY', 218, 1, 0, 0, 1, '', 1),(130, 1, 'LI', 423, 1, 0, 0, 1, 'NNNN', 1),(131, 1, 'LT', 370, 1, 0, 0, 1, 'NNNNN', 1),(132, 3, 'MO', 853, 1, 0, 0, 0, '', 1), +(133, 7, 'MK', 389, 1, 0, 0, 1, '', 1),(134, 4, 'MG', 261, 1, 0, 0, 1, '', 1),(135, 4, 'MW', 265, 1, 0, 0, 1, '', 1),(136, 3, 'MY', 60, 1, 0, 0, 1, 'NNNNN', 1),(137, 3, 'MV', 960, 1, 0, 0, 1, '', 1), +(138, 4, 'ML', 223, 1, 0, 0, 1, '', 1),(139, 1, 'MT', 356, 1, 0, 0, 1, 'LLL NNNN', 1),(140, 5, 'MH', 692, 1, 0, 0, 1, '', 1),(141, 8, 'MQ', 596, 1, 0, 0, 1, '', 1),(142, 4, 'MR', 222, 1, 0, 0, 1, '', 1), +(143, 1, 'HU', 36, 1, 0, 0, 1, 'NNNN', 1),(144, 4, 'YT', 262, 1, 0, 0, 1, '', 1),(145, 2, 'MX', 52, 1, 1, 1, 1, 'NNNNN', 1),(146, 5, 'FM', 691, 1, 0, 0, 1, '', 1),(147, 7, 'MD', 373, 1, 0, 0, 1, 'C-NNNN', 1), +(148, 7, 'MC', 377, 1, 0, 0, 1, '980NN', 1),(149, 3, 'MN', 976, 1, 0, 0, 1, '', 1),(150, 7, 'ME', 382, 1, 0, 0, 1, 'NNNNN', 1),(151, 8, 'MS', 0, 1, 0, 0, 1, '', 1),(152, 4, 'MA', 212, 1, 0, 0, 1, 'NNNNN', 1), +(153, 4, 'MZ', 258, 1, 0, 0, 1, '', 1),(154, 4, 'NA', 264, 1, 0, 0, 1, '', 1),(155, 5, 'NR', 674, 1, 0, 0, 1, '', 1),(156, 3, 'NP', 977, 1, 0, 0, 1, '', 1),(157, 8, 'AN', 599, 1, 0, 0, 1, '', 1), +(158, 5, 'NC', 687, 1, 0, 0, 1, '', 1),(159, 8, 'NI', 505, 1, 0, 0, 1, 'NNNNNN', 1),(160, 4, 'NE', 227, 1, 0, 0, 1, '', 1),(161, 5, 'NU', 683, 1, 0, 0, 1, '', 1),(162, 5, 'NF', 0, 1, 0, 0, 1, '', 1), +(163, 5, 'MP', 0, 1, 0, 0, 1, '', 1),(164, 3, 'OM', 968, 1, 0, 0, 1, '', 1),(165, 3, 'PK', 92, 1, 0, 0, 1, '', 1),(166, 5, 'PW', 680, 1, 0, 0, 1, '', 1),(167, 3, 'PS', 0, 1, 0, 0, 1, '', 1), +(168, 8, 'PA', 507, 1, 0, 0, 1, 'NNNNNN', 1),(169, 5, 'PG', 675, 1, 0, 0, 1, '', 1),(170, 6, 'PY', 595, 1, 0, 0, 1, '', 1),(171, 6, 'PE', 51, 1, 0, 0, 1, '', 1),(172, 3, 'PH', 63, 1, 0, 0, 1, 'NNNN', 1), +(173, 5, 'PN', 0, 1, 0, 0, 1, 'LLLL NLL', 1),(174, 8, 'PR', 0, 1, 0, 0, 1, 'NNNNN', 1),(175, 3, 'QA', 974, 1, 0, 0, 1, '', 1),(176, 4, 'RE', 262, 1, 0, 0, 1, '', 1),(177, 7, 'RU', 7, 1, 0, 0, 1, 'NNNNNN', 1), +(178, 4, 'RW', 250, 1, 0, 0, 1, '', 1),(179, 8, 'BL', 0, 1, 0, 0, 1, '', 1),(180, 8, 'KN', 0, 1, 0, 0, 1, '', 1),(181, 8, 'LC', 0, 1, 0, 0, 1, '', 1),(182, 8, 'MF', 0, 1, 0, 0, 1, '', 1), +(183, 8, 'PM', 508, 1, 0, 0, 1, '', 1),(184, 8, 'VC', 0, 1, 0, 0, 1, '', 1),(185, 5, 'WS', 685, 1, 0, 0, 1, '', 1),(186, 7, 'SM', 378, 1, 0, 0, 1, 'NNNNN', 1),(187, 4, 'ST', 239, 1, 0, 0, 1, '', 1), +(188, 3, 'SA', 966, 1, 0, 0, 1, '', 1),(189, 4, 'SN', 221, 1, 0, 0, 1, '', 1),(190, 7, 'RS', 381, 1, 0, 0, 1, 'NNNNN', 1),(191, 4, 'SC', 248, 1, 0, 0, 1, '', 1),(192, 4, 'SL', 232, 1, 0, 0, 1, '', 1), +(193, 1, 'SI', 386, 1, 0, 0, 1, 'C-NNNN', 1),(194, 5, 'SB', 677, 1, 0, 0, 1, '', 1),(195, 4, 'SO', 252, 1, 0, 0, 1, '', 1),(196, 8, 'GS', 0, 1, 0, 0, 1, 'LLLL NLL', 1),(197, 3, 'LK', 94, 1, 0, 0, 1, 'NNNNN', 1), +(198, 4, 'SD', 249, 1, 0, 0, 1, '', 1),(199, 8, 'SR', 597, 1, 0, 0, 1, '', 1),(200, 7, 'SJ', 0, 1, 0, 0, 1, '', 1),(201, 4, 'SZ', 268, 1, 0, 0, 1, '', 1),(202, 3, 'SY', 963, 1, 0, 0, 1, '', 1), +(203, 3, 'TW', 886, 1, 0, 0, 1, 'NNNNN', 1),(204, 3, 'TJ', 992, 1, 0, 0, 1, '', 1),(205, 4, 'TZ', 255, 1, 0, 0, 1, '', 1),(206, 3, 'TH', 66, 1, 0, 0, 1, 'NNNNN', 1),(207, 5, 'TK', 690, 1, 0, 0, 1, '', 1), +(208, 5, 'TO', 676, 1, 0, 0, 1, '', 1),(209, 6, 'TT', 0, 1, 0, 0, 1, '', 1),(210, 4, 'TN', 216, 1, 0, 0, 1, '', 1),(211, 7, 'TR', 90, 1, 0, 0, 1, 'NNNNN', 1),(212, 3, 'TM', 993, 1, 0, 0, 1, '', 1), +(213, 8, 'TC', 0, 1, 0, 0, 1, 'LLLL NLL', 1),(214, 5, 'TV', 688, 1, 0, 0, 1, '', 1),(215, 4, 'UG', 256, 1, 0, 0, 1, '', 1),(216, 1, 'UA', 380, 1, 0, 0, 1, 'NNNNN', 1),(217, 3, 'AE', 971, 1, 0, 0, 1, '', 1), +(218, 6, 'UY', 598, 1, 0, 0, 1, '', 1),(219, 3, 'UZ', 998, 1, 0, 0, 1, '', 1),(220, 5, 'VU', 678, 1, 0, 0, 1, '', 1),(221, 6, 'VE', 58, 1, 0, 0, 1, '', 1),(222, 3, 'VN', 84, 1, 0, 0, 1, 'NNNNNN', 1), +(223, 2, 'VG', 0, 1, 0, 0, 1, 'CNNNN', 1),(224, 2, 'VI', 0, 1, 0, 0, 1, '', 1),(225, 5, 'WF', 681, 1, 0, 0, 1, '', 1),(226, 4, 'EH', 0, 1, 0, 0, 1, '', 1),(227, 3, 'YE', 967, 1, 0, 0, 1, '', 1), +(228, 4, 'ZM', 260, 1, 0, 0, 1, '', 1),(229, 4, 'ZW', 263, 1, 0, 0, 1, '', 1),(230, 7, 'AL', 355, 1, 0, 0, 1, 'NNNN', 1),(231, 3, 'AF', 93, 1, 0, 0, 0, '', 1),(232, 5, 'AQ', 0, 1, 0, 0, 1, '', 1), +(233, 1, 'BA', 387, 1, 0, 0, 1, '', 1),(234, 5, 'BV', 0, 1, 0, 0, 1, '', 1),(235, 5, 'IO', 0, 1, 0, 0, 1, 'LLLL NLL', 1),(236, 1, 'BG', 359, 1, 0, 0, 1, 'NNNN', 1),(237, 8, 'KY', 0, 1, 0, 0, 1, '', 1), +(238, 3, 'CX', 0, 1, 0, 0, 1, '', 1),(239, 3, 'CC', 0, 1, 0, 0, 1, '', 1),(240, 5, 'CK', 682, 1, 0, 0, 1, '', 1),(241, 6, 'GF', 594, 1, 0, 0, 1, '', 1),(242, 5, 'PF', 689, 1, 0, 0, 1, '', 1), +(243, 5, 'TF', 0, 1, 0, 0, 1, '', 1),(244, 7, 'AX', 0, 1, 0, 0, 1, 'NNNNN', 1); + +INSERT INTO `PREFIX_country_lang` (`id_country`, `id_lang`, `name`) VALUES +(1, 1, 'Germany'),(1, 2, 'Allemagne'),(1, 3, 'Alemania'),(2, 1, 'Austria'),(2, 2, 'Autriche'),(2, 3, 'Austria'), +(3, 1, 'Belgium'),(3, 2, 'Belgique'),(3, 3, 'Bélgica'),(4, 1, 'Canada'),(4, 2, 'Canada'),(4, 3, 'Canadá'),(5, 1, 'China'), +(5, 2, 'Chine'),(5, 3, 'Porcelana'),(6, 1, 'Spain'),(6, 2, 'Espagne'),(6, 3, 'España'),(7, 1, 'Finland'),(7, 2, 'Finlande'), +(7, 3, 'Finlandia'),(8, 1, 'France'),(8, 2, 'France'),(8, 3, 'Francia'),(9, 1, 'Greece'),(9, 2, 'Grèce'),(9, 3, 'Grecia'), +(10, 1, 'Italy'),(10, 2, 'Italie'),(10, 3, 'Italia'),(11, 1, 'Japan'),(11, 2, 'Japon'),(11, 3, 'Japón'), +(12, 1, 'Luxemburg'),(12, 2, 'Luxembourg'),(12, 3, 'Luxemburgo'),(13, 1, 'Netherlands'),(13, 2, 'Pays-bas'),(13, 3, 'Países Bajos'), +(14, 1, 'Poland'),(14, 2, 'Pologne'),(14, 3, 'Polonia'),(15, 1, 'Portugal'),(15, 2, 'Portugal'),(15, 3, 'Portugal'), +(16, 1, 'Czech Republic'),(16, 2, 'République Tchèque'),(16, 3, 'República Checa'),(17, 1, 'United Kingdom'),(17, 2, 'Royaume-Uni'),(17, 3, 'Reino Unido'), +(18, 1, 'Sweden'),(18, 2, 'Suède'),(18, 3, 'Suecia'),(19, 1, 'Switzerland'),(19, 2, 'Suisse'),(19, 3, 'Suiza'),(20, 1, 'Denmark'), +(20, 2, 'Danemark'),(20, 3, 'Dinamarca'),(21, 1, 'United States'),(21, 2, 'États-Unis'),(21, 3, 'EE.UU.'),(22, 1, 'HongKong'),(22, 2, 'Hong-Kong'), +(22, 3, 'Hong Kong'),(23, 1, 'Norway'),(23, 2, 'Norvège'),(23, 3, 'Noruega'),(24, 1, 'Australia'),(24, 2, 'Australie'),(24, 3, 'Australia'), +(25, 1, 'Singapore'),(25, 2, 'Singapour'),(25, 3, 'Singapur'),(26, 1, 'Ireland'),(26, 2, 'Eire'),(26, 3, 'Irlanda'),(27, 1, 'New Zealand'), +(27, 2, 'Nouvelle-Zélande'),(27, 3, 'Nueva Zelanda'),(28, 1, 'South Korea'),(28, 2, 'Corée du Sud'),(28, 3, 'Corea del Sur'),(29, 1, 'Israel'), +(29, 2, 'Israël'),(29, 3, 'Israel'),(30, 1, 'South Africa'),(30, 2, 'Afrique du Sud'),(30, 3, 'Sudáfrica'),(31, 1, 'Nigeria'),(31, 2, 'Nigeria'), +(31, 3, 'Nigeria'),(32, 1, 'Ivory Coast'),(32, 2, 'Côte d''Ivoire'),(32, 3, 'Costa de Marfil'),(33, 1, 'Togo'),(33, 2, 'Togo'),(33, 3, 'Togo'), +(34, 1, 'Bolivia'),(34, 2, 'Bolivie'),(34, 3, 'Bolivia'),(35, 1, 'Mauritius'),(35, 2, 'Ile Maurice'),(35, 3, 'Mauricio'),(36, 1, 'Romania'), +(36, 2, 'Roumanie'),(36, 3, 'Rumania'),(37, 1, 'Slovakia'),(37, 2, 'Slovaquie'),(37, 3, 'Eslovaquia'),(38, 1, 'Algeria'),(38, 2, 'Algérie'), +(38, 3, 'Argelia'),(39, 1, 'American Samoa'),(39, 2, 'Samoa Américaines'),(39, 3, 'Samoa Americana'),(40, 1, 'Andorra'),(40, 2, 'Andorre'),(40, 3, 'Andorra'), +(41, 1, 'Angola'),(41, 2, 'Angola'),(41, 3, 'Angola'),(42, 1, 'Anguilla'),(42, 2, 'Anguilla'),(42, 3, 'Anguila'),(43, 1, 'Antigua and Barbuda'), +(43, 2, 'Antigua et Barbuda'),(43, 3, 'Antigua y Barbuda'),(44, 1, 'Argentina'),(44, 2, 'Argentine'),(44, 3, 'Argentina'),(45, 1, 'Armenia'), +(45, 2, 'Arménie'),(45, 3, 'Armenia'),(46, 1, 'Aruba'),(46, 2, 'Aruba'),(46, 3, 'Aruba'),(47, 1, 'Azerbaijan'),(47, 2, 'Azerbaïdjan'),(47, 3, 'Azerbaiyán'), +(48, 1, 'Bahamas'),(48, 2, 'Bahamas'),(48, 3, 'Bahamas'),(49, 1, 'Bahrain'),(49, 2, 'Bahreïn'),(49, 3, 'Bahrein'),(50, 1, 'Bangladesh'), +(50, 2, 'Bangladesh'),(50, 3, 'Bangladesh'),(51, 1, 'Barbados'),(51, 2, 'Barbade'),(51, 3, 'Barbados'),(52, 1, 'Belarus'),(52, 2, 'Bélarus'), +(52, 3, 'Belarús'),(53, 1, 'Belize'),(53, 2, 'Belize'),(53, 3, 'Belice'),(54, 1, 'Benin'),(54, 2, 'Bénin'),(54, 3, 'Benin'),(55, 1, 'Bermuda'), +(55, 2, 'Bermudes'),(55, 3, 'Bermudas'),(56, 1, 'Bhutan'),(56, 2, 'Bhoutan'),(56, 3, 'Bhután'),(57, 1, 'Botswana'),(57, 2, 'Botswana'),(57, 3, 'Botswana'), +(58, 1, 'Brazil'),(58, 2, 'Brésil'),(58, 3, 'Brasil'),(59, 1, 'Brunei'),(59, 2, 'Brunéi Darussalam'),(59, 3, 'Brunei'),(60, 1, 'Burkina Faso'), +(60, 2, 'Burkina Faso'),(60, 3, 'Burkina Faso'),(61, 1, 'Burma (Myanmar)'),(61, 2, 'Burma (Myanmar)'),(61, 3, 'Birmania (Myanmar)'),(62, 1, 'Burundi'),(62, 2, 'Burundi'), +(62, 3, 'Burundi'),(63, 1, 'Cambodia'),(63, 2, 'Cambodge'),(63, 3, 'Camboya'),(64, 1, 'Cameroon'),(64, 2, 'Cameroun'),(64, 3, 'Camerún'),(65, 1, 'Cape Verde'),(65, 2, 'Cap-Vert'), +(65, 3, 'Cabo Verde'),(66, 1, 'Central African Republic'),(66, 2, 'Centrafricaine, République'),(66, 3, 'República Centroafricana'),(67, 1, 'Chad'),(67, 2, 'Tchad'),(67, 3, 'Chad'), +(68, 1, 'Chile'),(68, 2, 'Chili'),(68, 3, 'Chile'),(69, 1, 'Colombia'),(69, 2, 'Colombie'),(69, 3, 'Colombia'),(70, 1, 'Comoros'),(70, 2, 'Comores'), +(70, 3, 'Comoras'),(71, 1, 'Congo, Dem. Republic'),(71, 2, 'Congo, Rép. Dém.'),(71, 3, 'Congo, Rep. Dem.'),(72, 1, 'Congo, Republic'),(72, 2, 'Congo, Rép.'),(72, 3, 'Congo, República'), +(73, 1, 'Costa Rica'),(73, 2, 'Costa Rica'),(73, 3, 'Costa Rica'),(74, 1, 'Croatia'),(74, 2, 'Croatie'),(74, 3, 'Croacia'),(75, 1, 'Cuba'), +(75, 2, 'Cuba'),(75, 3, 'Cuba'),(76, 1, 'Cyprus'),(76, 2, 'Chypre'),(76, 3, 'Chipre'),(77, 1, 'Djibouti'),(77, 2, 'Djibouti'),(77, 3, 'Djibouti'),(78, 1, 'Dominica'), +(78, 2, 'Dominica'),(78, 3, 'Dominica'),(79, 1, 'Dominican Republic'),(79, 2, 'République Dominicaine'),(79, 3, 'República Dominicana'),(80, 1, 'East Timor'),(80, 2, 'Timor oriental'), +(80, 3, 'Timor Oriental'),(81, 1, 'Ecuador'),(81, 2, 'Équateur'),(81, 3, 'Ecuador'),(82, 1, 'Egypt'),(82, 2, 'Égypte'),(82, 3, 'Egipto'),(83, 1, 'El Salvador'), +(83, 2, 'El Salvador'),(83, 3, 'El Salvador'),(84, 1, 'Equatorial Guinea'),(84, 2, 'Guinée Équatoriale'),(84, 3, 'Guinea Ecuatorial'),(85, 1, 'Eritrea'), +(85, 2, 'Érythrée'),(85, 3, 'Eritrea'),(86, 1, 'Estonia'),(86, 2, 'Estonie'),(86, 3, 'Estonia'),(87, 1, 'Ethiopia'),(87, 2, 'Éthiopie'),(87, 3, 'Etiopía'), +(88, 1, 'Falkland Islands'),(88, 2, 'Falkland, Îles'),(88, 3, 'Islas Malvinas'),(89, 1, 'Faroe Islands'),(89, 2, 'Féroé, Îles'),(89, 3, 'Islas Feroe'),(90, 1, 'Fiji'),(90, 2, 'Fidji'), +(90, 3, 'Fiji'),(91, 1, 'Gabon'),(91, 2, 'Gabon'),(91, 3, 'Gabón'),(92, 1, 'Gambia'),(92, 2, 'Gambie'),(92, 3, 'Gambia'),(93, 1, 'Georgia'), +(93, 2, 'Géorgie'),(93, 3, 'Georgia'),(94, 1, 'Ghana'),(94, 2, 'Ghana'),(94, 3, 'Ghana'),(95, 1, 'Grenada'),(95, 2, 'Grenade'),(95, 3, 'Granada'), +(96, 1, 'Greenland'),(96, 2, 'Groenland'),(96, 3, 'Groenlandia'),(97, 1, 'Gibraltar'),(97, 2, 'Gibraltar'),(97, 3, 'Gibraltar'),(98, 1, 'Guadeloupe'),(98, 2, 'Guadeloupe'), +(98, 3, 'Guadalupe'),(99, 1, 'Guam'),(99, 2, 'Guam'),(99, 3, 'Guam'),(100, 1, 'Guatemala'),(100, 2, 'Guatemala'),(100, 3, 'Guatemala'),(101, 1, 'Guernsey'), +(101, 2, 'Guernesey'),(101, 3, 'Guernsey'),(102, 1, 'Guinea'),(102, 2, 'Guinée'),(102, 3, 'Guinea'),(103, 1, 'Guinea-Bissau'),(103, 2, 'Guinée-Bissau'), +(103, 3, 'Guinea-Bissau'),(104, 1, 'Guyana'),(104, 2, 'Guyana'),(104, 3, 'Guyana'),(105, 1, 'Haiti'),(105, 2, 'Haîti'),(105, 3, 'Haití'),(106, 1, 'Heard Island and McDonald Islands'),(106, 2, 'Heard, Île et Mcdonald, Îles'), +(106, 3, 'Islas Heard y McDonald Islas'),(107, 1, 'Vatican City State'),(107, 2, 'Saint-Siege (État de la Cité du Vatican)'),(107, 3, 'Ciudad del Vaticano'),(108, 1, 'Honduras'),(108, 2, 'Honduras'),(108, 3, 'Honduras'),(109, 1, 'Iceland'), +(109, 2, 'Islande'),(109, 3, 'Islandia'),(110, 1, 'India'),(110, 2, 'Inde'),(110, 3, 'India'),(111, 1, 'Indonesia'),(111, 2, 'Indonésie'), +(111, 3, 'Indonesia'),(112, 1, 'Iran'),(112, 2, 'Iran'),(112, 3, 'Irán'),(113, 1, 'Iraq'),(113, 2, 'Iraq'),(113, 3, 'Iraq'),(114, 1, 'Man Island'), +(114, 2, 'Man, Île de'),(114, 3, 'Man, Isla'),(115, 1, 'Jamaica'),(115, 2, 'Jamaique'),(115, 3, 'Jamaica'),(116, 1, 'Jersey'),(116, 2, 'Jersey'), +(116, 3, 'Jersey'),(117, 1, 'Jordan'),(117, 2, 'Jordanie'),(117, 3, 'Jordania'),(118, 1, 'Kazakhstan'),(118, 2, 'Kazakhstan'),(118, 3, 'Kazajstán'),(119, 1, 'Kenya'), +(119, 2, 'Kenya'),(119, 3, 'Kenya'),(120, 1, 'Kiribati'),(120, 2, 'Kiribati'),(120, 3, 'Kiribati'),(121, 1, 'Korea, Dem. Republic of'),(121, 2, 'Corée, Rép. Populaire Dém. de'),(121, 3, 'KOREA, DEM. República de'), +(122, 1, 'Kuwait'),(122, 2, 'Koweït'),(122, 3, 'Kuwait'),(123, 1, 'Kyrgyzstan'),(123, 2, 'Kirghizistan'),(123, 3, 'Kirguistán'),(124, 1, 'Laos'),(124, 2, 'Laos'), +(124, 3, 'Laos'),(125, 1, 'Latvia'),(125, 2, 'Lettonie'),(125, 3, 'Letonia'),(126, 1, 'Lebanon'),(126, 2, 'Liban'),(126, 3, 'Líbano'),(127, 1, 'Lesotho'), +(127, 2, 'Lesotho'),(127, 3, 'Lesotho'),(128, 1, 'Liberia'),(128, 2, 'Libéria'),(128, 3, 'Liberia'),(129, 1, 'Libya'),(129, 2, 'Libyenne, Jamahiriya Arabe'),(129, 3, 'Libia'), +(130, 1, 'Liechtenstein'),(130, 2, 'Liechtenstein'),(130, 3, 'Liechtenstein'),(131, 1, 'Lithuania'),(131, 2, 'Lituanie'),(131, 3, 'Lituania'),(132, 1, 'Macau'), +(132, 2, 'Macao'),(132, 3, 'Macao'),(133, 1, 'Macedonia'),(133, 2, 'Macédoine'),(133, 3, 'Macedonia'),(134, 1, 'Madagascar'),(134, 2, 'Madagascar'), +(134, 3, 'Madagascar'),(135, 1, 'Malawi'),(135, 2, 'Malawi'),(135, 3, 'Malawi'),(136, 1, 'Malaysia'),(136, 2, 'Malaisie'),(136, 3, 'Malasia'), +(137, 1, 'Maldives'),(137, 2, 'Maldives'),(137, 3, 'Maldivas'),(138, 1, 'Mali'),(138, 2, 'Mali'),(138, 3, 'Malí'),(139, 1, 'Malta'),(139, 2, 'Malte'), +(139, 3, 'Malta'),(140, 1, 'Marshall Islands'),(140, 2, 'Marshall, Îles'),(140, 3, 'Marshall, Islas'),(141, 1, 'Martinique'),(141, 2, 'Martinique'), +(141, 3, 'Martinica'),(142, 1, 'Mauritania'),(142, 2, 'Mauritanie'),(142, 3, 'Mauritania'),(143, 1, 'Hungary'),(143, 2, 'Hongrie'),(143, 3, 'Hungría'), +(144, 1, 'Mayotte'),(144, 2, 'Mayotte'),(144, 3, 'Mayotte'),(145, 1, 'Mexico'),(145, 2, 'Mexique'),(145, 3, 'México'),(146, 1, 'Micronesia'),(146, 2, 'Micronésie'), +(146, 3, 'Micronesia'),(147, 1, 'Moldova'),(147, 2, 'Moldova'),(147, 3, 'Moldavia'),(148, 1, 'Monaco'),(148, 2, 'Monaco'),(148, 3, 'Mónaco'), +(149, 1, 'Mongolia'),(149, 2, 'Mongolie'),(149, 3, 'Mongolia'),(150, 1, 'Montenegro'),(150, 2, 'Monténégro'),(150, 3, 'Montenegro'),(151, 1, 'Montserrat'), +(151, 2, 'Montserrat'),(151, 3, 'Montserrat'),(152, 1, 'Morocco'),(152, 2, 'Maroc'),(152, 3, 'Marruecos'),(153, 1, 'Mozambique'),(153, 2, 'Mozambique'),(153, 3, 'Mozambique'), +(154, 1, 'Namibia'),(154, 2, 'Namibie'),(154, 3, 'Namibia'),(155, 1, 'Nauru'),(155, 2, 'Nauru'),(155, 3, 'Nauru'),(156, 1, 'Nepal'),(156, 2, 'Népal'), +(156, 3, 'Nepal'),(157, 1, 'Netherlands Antilles'),(157, 2, 'Antilles Néerlandaises'),(157, 3, 'Antillas Neerlandesas'),(158, 1, 'New Caledonia'),(158, 2, 'Nouvelle-Calédonie'),(158, 3, 'Nueva Caledonia'), +(159, 1, 'Nicaragua'),(159, 2, 'Nicaragua'),(159, 3, 'Nicaragua'),(160, 1, 'Niger'),(160, 2, 'Niger'),(160, 3, 'Níger'),(161, 1, 'Niue'), +(161, 2, 'Niué'),(161, 3, 'Niue'),(162, 1, 'Norfolk Island'),(162, 2, 'Norfolk, Île'),(162, 3, 'Norfolk Island'),(163, 1, 'Northern Mariana Islands'),(163, 2, 'Mariannes du Nord, Îles'), +(163, 3, 'Islas Marianas del Norte'),(164, 1, 'Oman'),(164, 2, 'Oman'),(164, 3, 'Omán'),(165, 1, 'Pakistan'),(165, 2, 'Pakistan'),(165, 3, 'Pakistán'), +(166, 1, 'Palau'),(166, 2, 'Palaos'),(166, 3, 'Palau'),(167, 1, 'Palestinian Territories'),(167, 2, 'Palestinien Occupé, Territoire'),(167, 3, 'Territorios Palestinos'),(168, 1, 'Panama'), +(168, 2, 'Panama'),(168, 3, 'Panamá'),(169, 1, 'Papua New Guinea'),(169, 2, 'Papouasie-Nouvelle-Guinée'),(169, 3, 'Papua Nueva Guinea'),(170, 1, 'Paraguay'),(170, 2, 'Paraguay'), +(170, 3, 'Paraguay'),(171, 1, 'Peru'),(171, 2, 'Pérou'),(171, 3, 'Perú'),(172, 1, 'Philippines'),(172, 2, 'Philippines'),(172, 3, 'Filipinas'),(173, 1, 'Pitcairn'), +(173, 2, 'Pitcairn'),(173, 3, 'Pitcairn'),(174, 1, 'Puerto Rico'),(174, 2, 'Porto Rico'),(174, 3, 'Puerto Rico'),(175, 1, 'Qatar'),(175, 2, 'Qatar'),(175, 3, 'Qatar'), +(176, 1, 'Reunion Island'),(176, 2, 'Réunion, Île de la'),(176, 3, 'Reunión, Isla de la'),(177, 1, 'Russian Federation'),(177, 2, 'Russie, Fédération de'),(177, 3, 'Rusia, Federación de'),(178, 1, 'Rwanda'), +(178, 2, 'Rwanda'),(178, 3, 'Rwanda'),(179, 1, 'Saint Barthelemy'),(179, 2, 'Saint-Barthélemy'),(179, 3, 'San Bartolomé'),(180, 1, 'Saint Kitts and Nevis'),(180, 2, 'Saint-Kitts-et-Nevis'), +(180, 3, 'Saint Kitts y Nevis'),(181, 1, 'Saint Lucia'),(181, 2, 'Sainte-Lucie'),(181, 3, 'Santa Lucía'),(182, 1, 'Saint Martin'),(182, 2, 'Saint-Martin'),(182, 3, 'Saint Martin'), +(183, 1, 'Saint Pierre and Miquelon'),(183, 2, 'Saint-Pierre-et-Miquelon'),(183, 3, 'San Pedro y Miquelón'),(184, 1, 'Saint Vincent and the Grenadines'),(184, 2, 'Saint-Vincent-et-Les Grenadines'),(184, 3, 'San Vicente y las Granadinas'),(185, 1, 'Samoa'), +(185, 2, 'Samoa'),(185, 3, 'Samoa'),(186, 1, 'San Marino'),(186, 2, 'Saint-Marin'),(186, 3, 'San Marino'),(187, 1, 'São Tomé and Príncipe'),(187, 2, 'Sao Tomé-et-Principe'),(187, 3, 'Santo Tomé y Príncipe'), +(188, 1, 'Saudi Arabia'),(188, 2, 'Arabie Saoudite'),(188, 3, 'Arabia Saudita'),(189, 1, 'Senegal'),(189, 2, 'Sénégal'),(189, 3, 'Senegal'),(190, 1, 'Serbia'), +(190, 2, 'Serbie'),(190, 3, 'Serbia'),(191, 1, 'Seychelles'),(191, 2, 'Seychelles'),(191, 3, 'Seychelles'),(192, 1, 'Sierra Leone'),(192, 2, 'Sierra Leone'), +(192, 3, 'Sierra Leona'),(193, 1, 'Slovenia'),(193, 2, 'Slovénie'),(193, 3, 'Eslovenia'),(194, 1, 'Solomon Islands'),(194, 2, 'Salomon, Îles'),(194, 3, 'Salomón, Islas'),(195, 1, 'Somalia'), +(195, 2, 'Somalie'),(195, 3, 'Somalia'),(196, 1, 'South Georgia and the South Sandwich Islands'),(196, 2, 'Géorgie du Sud et les Îles Sandwich du Sud'),(196, 3, 'Georgia del Sur e Islas Sandwich del Sur'),(197, 1, 'Sri Lanka'),(197, 2, 'Sri Lanka'), +(197, 3, 'Sri Lanka'),(198, 1, 'Sudan'),(198, 2, 'Soudan'),(198, 3, 'Sudán'),(199, 1, 'Suriname'),(199, 2, 'Suriname'),(199, 3, 'Suriname'),(200, 1, 'Svalbard and Jan Mayen'), +(200, 2, 'Svalbard et Île Jan Mayen'),(200, 3, 'Svalbard y Jan Mayen'),(201, 1, 'Swaziland'),(201, 2, 'Swaziland'),(201, 3, 'Swazilandia'),(202, 1, 'Syria'),(202, 2, 'Syrienne'), +(202, 3, 'Siria'),(203, 1, 'Taiwan'),(203, 2, 'Taïwan'),(203, 3, 'Taiwán'),(204, 1, 'Tajikistan'),(204, 2, 'Tadjikistan'),(204, 3, 'Tayikistán'), +(205, 1, 'Tanzania'),(205, 2, 'Tanzanie'),(205, 3, 'Tanzania'),(206, 1, 'Thailand'),(206, 2, 'Thaïlande'),(206, 3, 'Tailandia'),(207, 1, 'Tokelau'), +(207, 2, 'Tokelau'),(207, 3, 'Tokelau'),(208, 1, 'Tonga'),(208, 2, 'Tonga'),(208, 3, 'Tonga'),(209, 1, 'Trinidad and Tobago'),(209, 2, 'Trinité-et-Tobago'),(209, 3, 'Trinidad y Tobago'), +(210, 1, 'Tunisia'),(210, 2, 'Tunisie'),(210, 3, 'Túnez'),(211, 1, 'Turkey'),(211, 2, 'Turquie'),(211, 3, 'Turquía'),(212, 1, 'Turkmenistan'),(212, 2, 'Turkménistan'), +(212, 3, 'Turkmenistán'),(213, 1, 'Turks and Caicos Islands'),(213, 2, 'Turks et Caiques, Îles'),(213, 3, 'Islas Turcas y Caicos'),(214, 1, 'Tuvalu'),(214, 2, 'Tuvalu'),(214, 3, 'Tuvalu'), +(215, 1, 'Uganda'),(215, 2, 'Ouganda'),(215, 3, 'Uganda'),(216, 1, 'Ukraine'),(216, 2, 'Ukraine'),(216, 3, 'Ucrania'),(217, 1, 'United Arab Emirates'), +(217, 2, 'Émirats Arabes Unis'),(217, 3, 'Emiratos Árabes Unidos'),(218, 1, 'Uruguay'),(218, 2, 'Uruguay'),(218, 3, 'Uruguay'),(219, 1, 'Uzbekistan'),(219, 2, 'Ouzbékistan'), +(219, 3, 'Uzbekistán'),(220, 1, 'Vanuatu'),(220, 2, 'Vanuatu'),(220, 3, 'Vanuatu'),(221, 1, 'Venezuela'),(221, 2, 'Venezuela'),(221, 3, 'Venezuela'), +(222, 1, 'Vietnam'),(222, 2, 'Vietnam'),(222, 3, 'Vietnam'),(223, 1, 'Virgin Islands (British)'),(223, 2, 'Îles Vierges Britanniques'),(223, 3, 'Islas Vírgenes (Británicas)'),(224, 1, 'Virgin Islands (U.S.)'), +(224, 2, 'Îles Vierges des États-Unis'),(224, 3, 'Islas Vírgenes (EE.UU.)'),(225, 1, 'Wallis and Futuna'),(225, 2, 'Wallis et Futuna'),(225, 3, 'Wallis y Futuna'),(226, 1, 'Western Sahara'),(226, 2, 'Sahara Occidental'), +(226, 3, 'Sáhara Occidental'),(227, 1, 'Yemen'),(227, 2, 'Yémen'),(227, 3, 'Yemen'),(228, 1, 'Zambia'),(228, 2, 'Zambie'),(228, 3, 'Zambia'),(229, 1, 'Zimbabwe'), +(229, 2, 'Zimbabwe'),(229, 3, 'Zimbabwe'),(230, 1, 'Albania'),(230, 2, 'Albanie'),(230, 3, 'Albania'),(231, 1, 'Afghanistan'),(231, 2, 'Afghanistan'),(231, 3, 'Afganistán'), +(232, 1, 'Antarctica'),(232, 2, 'Antarctique'),(232, 3, 'Antártida'),(233, 1, 'Bosnia and Herzegovina'),(233, 2, 'Bosnie-Herzégovine'),(233, 3, 'Bosnia y Herzegovina'),(234, 1, 'Bouvet Island'), +(234, 2, 'Bouvet, Île'),(234, 3, 'Isla Bouvet'),(235, 1, 'British Indian Ocean Territory'),(235, 2, 'Océan Indien, Territoire Britannique de L'''),(235, 3, 'British Indian Ocean Territory'),(236, 1, 'Bulgaria'),(236, 2, 'Bulgarie'), +(236, 3, 'Bulgaria'),(237, 1, 'Cayman Islands'),(237, 2, 'Caïmans, Îles'),(237, 3, 'Caimán, Islas'),(238, 1, 'Christmas Island'),(238, 2, 'Christmas, Île'),(238, 3, 'Navidad, Isla de'), +(239, 1, 'Cocos (Keeling) Islands'),(239, 2, 'Cocos (Keeling), Îles'),(239, 3, 'Cocos (Keeling), Islas'),(240, 1, 'Cook Islands'),(240, 2, 'Cook, Îles'),(240, 3, 'Cook, Islas'), +(241, 1, 'French Guiana'),(241, 2, 'Guyane Française'),(241, 3, 'Francés Guayana'),(242, 1, 'French Polynesia'),(242, 2, 'Polynésie Française'),(242, 3, 'Polinesia francés'),(243, 1, 'French Southern Territories'), +(243, 2, 'Terres Australes Françaises'),(243, 3, 'Territorios del sur francés'),(244, 1, 'Åland Islands'),(244, 2, 'Åland, Îles'),(244, 3, 'Islas Åland'); + +INSERT IGNORE INTO `PREFIX_country_lang` (`id_country`, `id_lang`, `name`) + (SELECT `id_country`, id_lang, (SELECT tl.`name` + FROM `PREFIX_country_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_country`=`PREFIX_country`.`id_country`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_country`); + +INSERT INTO `PREFIX_country_shop` (id_shop, id_country) (SELECT 1, id_country FROM PREFIX_country); + +INSERT INTO `PREFIX_state` (`id_state`, `id_country`, `id_zone`, `name`, `iso_code`, `active`) VALUES +(1, 21, 2, 'Alabama', 'AL', 1),(2, 21, 2, 'Alaska', 'AK', 1),(3, 21, 2, 'Arizona', 'AZ', 1),(4, 21, 2, 'Arkansas', 'AR', 1), +(5, 21, 2, 'California', 'CA', 1),(6, 21, 2, 'Colorado', 'CO', 1),(7, 21, 2, 'Connecticut', 'CT', 1),(8, 21, 2, 'Delaware', 'DE', 1), +(9, 21, 2, 'Florida', 'FL', 1),(10, 21, 2, 'Georgia', 'GA', 1),(11, 21, 2, 'Hawaii', 'HI', 1),(12, 21, 2, 'Idaho', 'ID', 1), +(13, 21, 2, 'Illinois', 'IL', 1),(14, 21, 2, 'Indiana', 'IN', 1),(15, 21, 2, 'Iowa', 'IA', 1),(16, 21, 2, 'Kansas', 'KS', 1), +(17, 21, 2, 'Kentucky', 'KY', 1),(18, 21, 2, 'Louisiana', 'LA', 1),(19, 21, 2, 'Maine', 'ME', 1),(20, 21, 2, 'Maryland', 'MD', 1), +(21, 21, 2, 'Massachusetts', 'MA', 1),(22, 21, 2, 'Michigan', 'MI', 1),(23, 21, 2, 'Minnesota', 'MN', 1), +(24, 21, 2, 'Mississippi', 'MS', 1),(25, 21, 2, 'Missouri', 'MO', 1),(26, 21, 2, 'Montana', 'MT', 1),(27, 21, 2, 'Nebraska', 'NE', 1), +(28, 21, 2, 'Nevada', 'NV', 1),(29, 21, 2, 'New Hampshire', 'NH', 1),(30, 21, 2, 'New Jersey', 'NJ', 1),(31, 21, 2, 'New Mexico', 'NM', 1), +(32, 21, 2, 'New York', 'NY', 1),(33, 21, 2, 'North Carolina', 'NC', 1),(34, 21, 2, 'North Dakota', 'ND', 1),(35, 21, 2, 'Ohio', 'OH', 1), +(36, 21, 2, 'Oklahoma', 'OK', 1),(37, 21, 2, 'Oregon', 'OR', 1),(38, 21, 2, 'Pennsylvania', 'PA', 1),(39, 21, 2, 'Rhode Island', 'RI', 1), +(40, 21, 2, 'South Carolina', 'SC', 1),(41, 21, 2, 'South Dakota', 'SD', 1),(42, 21, 2, 'Tennessee', 'TN', 1),(43, 21, 2, 'Texas', 'TX', 1), +(44, 21, 2, 'Utah', 'UT', 1),(45, 21, 2, 'Vermont', 'VT', 1),(46, 21, 2, 'Virginia', 'VA', 1),(47, 21, 2, 'Washington', 'WA', 1), +(48, 21, 2, 'West Virginia', 'WV', 1),(49, 21, 2, 'Wisconsin', 'WI', 1),(50, 21, 2, 'Wyoming', 'WY', 1),(51, 21, 2, 'Puerto Rico', 'PR', 1), +(52, 21, 2, 'US Virgin Islands', 'VI', 1),(53, 21, 2, 'District of Columbia', 'DC', 1); + +INSERT INTO `PREFIX_state` (`id_country`, `id_zone`, `name`, `iso_code`, `tax_behavior`, `active`) VALUES +(145, 2, 'Aguascalientes', 'AGS', 0, 1), +(145, 2, 'Baja California', 'BCN', 0, 1), +(145, 2, 'Baja California Sur', 'BCS', 0, 1), +(145, 2, 'Campeche', 'CAM', 0, 1), +(145, 2, 'Chiapas', 'CHP', 0, 1), +(145, 2, 'Chihuahua', 'CHH', 0, 1), +(145, 2, 'Coahuila', 'COA', 0, 1), +(145, 2, 'Colima', 'COL', 0, 1), +(145, 2, 'Distrito Federal', 'DIF', 0, 1), +(145, 2, 'Durango', 'DUR', 0, 1), +(145, 2, 'Guanajuato', 'GUA', 0, 1), +(145, 2, 'Guerrero', 'GRO', 0, 1), +(145, 2, 'Hidalgo', 'HID', 0, 1), +(145, 2, 'Jalisco', 'JAL', 0, 1), +(145, 2, 'Estado de México', 'MEX', 0, 1), +(145, 2, 'Michoacán', 'MIC', 0, 1), +(145, 2, 'Morelos', 'MOR', 0, 1), +(145, 2, 'Nayarit', 'NAY', 0, 1), +(145, 2, 'Nuevo León', 'NLE', 0, 1), +(145, 2, 'Oaxaca', 'OAX', 0, 1), +(145, 2, 'Puebla', 'PUE', 0, 1), +(145, 2, 'Querétaro', 'QUE', 0, 1), +(145, 2, 'Quintana Roo', 'ROO', 0, 1), +(145, 2, 'San Luis Potosí', 'SLP', 0, 1), +(145, 2, 'Sinaloa', 'SIN', 0, 1), +(145, 2, 'Sonora', 'SON', 0, 1), +(145, 2, 'Tabasco', 'TAB', 0, 1), +(145, 2, 'Tamaulipas', 'TAM', 0, 1), +(145, 2, 'Tlaxcala', 'TLA', 0, 1), +(145, 2, 'Veracruz', 'VER', 0, 1), +(145, 2, 'Yucatán', 'YUC', 0, 1), +(145, 2, 'Zacatecas', 'ZAC', 0, 1); + +INSERT INTO `PREFIX_state` (`id_country`, `id_zone`, `name`, `iso_code`, `active`) VALUES +(4, 2, 'Ontario', 'ON', 1), +(4, 2, 'Quebec', 'QC', 1), +(4, 2, 'British Columbia', 'BC', 1), +(4, 2, 'Alberta', 'AB', 1), +(4, 2, 'Manitoba', 'MB', 1), +(4, 2, 'Saskatchewan', 'SK', 1), +(4, 2, 'Nova Scotia', 'NS', 1), +(4, 2, 'New Brunswick', 'NB', 1), +(4, 2, 'Newfoundland and Labrador', 'NL', 1), +(4, 2, 'Prince Edward Island', 'PE', 1), +(4, 2, 'Northwest Territories', 'NT', 1), +(4, 2, 'Yukon', 'YT', 1), +(4, 2, 'Nunavut', 'NU', 1); + +INSERT INTO `PREFIX_state` (`id_country`, `id_zone`, `name`, `iso_code`, `active`) VALUES +(44, 6, 'Buenos Aires', 'B', 1), +(44, 6, 'Catamarca', 'K', 1), +(44, 6, 'Chaco', 'H', 1), +(44, 6, 'Chubut', 'U', 1), +(44, 6, 'Ciudad de Buenos Aires', 'C', 1), +(44, 6, 'Córdoba', 'X', 1), +(44, 6, 'Corrientes', 'W', 1), +(44, 6, 'Entre Ríos', 'E', 1), +(44, 6, 'Formosa', 'P', 1), +(44, 6, 'Jujuy', 'Y', 1), +(44, 6, 'La Pampa', 'L', 1), +(44, 6, 'La Rioja', 'F', 1), +(44, 6, 'Mendoza', 'M', 1), +(44, 6, 'Misiones', 'N', 1), +(44, 6, 'Neuquén', 'Q', 1), +(44, 6, 'Río Negro', 'R', 1), +(44, 6, 'Salta', 'A', 1), +(44, 6, 'San Juan', 'J', 1), +(44, 6, 'San Luis', 'D', 1), +(44, 6, 'Santa Cruz', 'Z', 1), +(44, 6, 'Santa Fe', 'S', 1), +(44, 6, 'Santiago del Estero', 'G', 1), +(44, 6, 'Tierra del Fuego', 'V', 1), +(44, 6, 'Tucumán', 'T', 1); + +INSERT INTO `PREFIX_state` (`id_country`, `id_zone`, `name`, `iso_code`, `tax_behavior`, `active`) VALUES +(10, 1, 'Agrigento', 'AG', 0, 1), +(10, 1, 'Alessandria', 'AL', 0, 1), +(10, 1, 'Ancona', 'AN', 0, 1), +(10, 1, 'Aosta', 'AO', 0, 1), +(10, 1, 'Arezzo', 'AR', 0, 1), +(10, 1, 'Ascoli Piceno', 'AP', 0, 1), +(10, 1, 'Asti', 'AT', 0, 1), +(10, 1, 'Avellino', 'AV', 0, 1), +(10, 1, 'Bari', 'BA', 0, 1), +(10, 1, 'Barletta-Andria-Trani', 'BT', 0, 1), +(10, 1, 'Belluno', 'BL', 0, 1), +(10, 1, 'Benevento', 'BN', 0, 1), +(10, 1, 'Bergamo', 'BG', 0, 1), +(10, 1, 'Biella', 'BI', 0, 1), +(10, 1, 'Bologna', 'BO', 0, 1), +(10, 1, 'Bolzano', 'BZ', 0, 1), +(10, 1, 'Brescia', 'BS', 0, 1), +(10, 1, 'Brindisi', 'BR', 0, 1), +(10, 1, 'Cagliari', 'CA', 0, 1), +(10, 1, 'Caltanissetta', 'CL', 0, 1), +(10, 1, 'Campobasso', 'CB', 0, 1), +(10, 1, 'Carbonia-Iglesias', 'CI', 0, 1), +(10, 1, 'Caserta', 'CE', 0, 1), +(10, 1, 'Catania', 'CT', 0, 1), +(10, 1, 'Catanzaro', 'CZ', 0, 1), +(10, 1, 'Chieti', 'CH', 0, 1), +(10, 1, 'Como', 'CO', 0, 1), +(10, 1, 'Cosenza', 'CS', 0, 1), +(10, 1, 'Cremona', 'CR', 0, 1), +(10, 1, 'Crotone', 'KR', 0, 1), +(10, 1, 'Cuneo', 'CN', 0, 1), +(10, 1, 'Enna', 'EN', 0, 1), +(10, 1, 'Fermo', 'FM', 0, 1), +(10, 1, 'Ferrara', 'FE', 0, 1), +(10, 1, 'Firenze', 'FI', 0, 1), +(10, 1, 'Foggia', 'FG', 0, 1), +(10, 1, 'Forlì-Cesena', 'FC', 0, 1), +(10, 1, 'Frosinone', 'FR', 0, 1), +(10, 1, 'Genova', 'GE', 0, 1), +(10, 1, 'Gorizia', 'GO', 0, 1), +(10, 1, 'Grosseto', 'GR', 0, 1), +(10, 1, 'Imperia', 'IM', 0, 1), +(10, 1, 'Isernia', 'IS', 0, 1), +(10, 1, 'L''Aquila', 'AQ', 0, 1), +(10, 1, 'La Spezia', 'SP', 0, 1), +(10, 1, 'Latina', 'LT', 0, 1), +(10, 1, 'Lecce', 'LE', 0, 1), +(10, 1, 'Lecco', 'LC', 0, 1), +(10, 1, 'Livorno', 'LI', 0, 1), +(10, 1, 'Lodi', 'LO', 0, 1), +(10, 1, 'Lucca', 'LU', 0, 1), +(10, 1, 'Macerata', 'MC', 0, 1), +(10, 1, 'Mantova', 'MN', 0, 1), +(10, 1, 'Massa', 'MS', 0, 1), +(10, 1, 'Matera', 'MT', 0, 1), +(10, 1, 'Medio Campidano', 'VS', 0, 1), +(10, 1, 'Messina', 'ME', 0, 1), +(10, 1, 'Milano', 'MI', 0, 1), +(10, 1, 'Modena', 'MO', 0, 1), +(10, 1, 'Monza e della Brianza', 'MB', 0, 1), +(10, 1, 'Napoli', 'NA', 0, 1), +(10, 1, 'Novara', 'NO', 0, 1), +(10, 1, 'Nuoro', 'NU', 0, 1), +(10, 1, 'Ogliastra', 'OG', 0, 1), +(10, 1, 'Olbia-Tempio', 'OT', 0, 1), +(10, 1, 'Oristano', 'OR', 0, 1), +(10, 1, 'Padova', 'PD', 0, 1), +(10, 1, 'Palermo', 'PA', 0, 1), +(10, 1, 'Parma', 'PR', 0, 1), +(10, 1, 'Pavia', 'PV', 0, 1), +(10, 1, 'Perugia', 'PG', 0, 1), +(10, 1, 'Pesaro-Urbino', 'PU', 0, 1), +(10, 1, 'Pescara', 'PE', 0, 1), +(10, 1, 'Piacenza', 'PC', 0, 1), +(10, 1, 'Pisa', 'PI', 0, 1), +(10, 1, 'Pistoia', 'PT', 0, 1), +(10, 1, 'Pordenone', 'PN', 0, 1), +(10, 1, 'Potenza', 'PZ', 0, 1), +(10, 1, 'Prato', 'PO', 0, 1), +(10, 1, 'Ragusa', 'RG', 0, 1), +(10, 1, 'Ravenna', 'RA', 0, 1), +(10, 1, 'Reggio Calabria', 'RC', 0, 1), +(10, 1, 'Reggio Emilia', 'RE', 0, 1), +(10, 1, 'Rieti', 'RI', 0, 1), +(10, 1, 'Rimini', 'RN', 0, 1), +(10, 1, 'Roma', 'RM', 0, 1), +(10, 1, 'Rovigo', 'RO', 0, 1), +(10, 1, 'Salerno', 'SA', 0, 1), +(10, 1, 'Sassari', 'SS', 0, 1), +(10, 1, 'Savona', 'SV', 0, 1), +(10, 1, 'Siena', 'SI', 0, 1), +(10, 1, 'Siracusa', 'SR', 0, 1), +(10, 1, 'Sondrio', 'SO', 0, 1), +(10, 1, 'Taranto', 'TA', 0, 1), +(10, 1, 'Teramo', 'TE', 0, 1), +(10, 1, 'Terni', 'TR', 0, 1), +(10, 1, 'Torino', 'TO', 0, 1), +(10, 1, 'Trapani', 'TP', 0, 1), +(10, 1, 'Trento', 'TN', 0, 1), +(10, 1, 'Treviso', 'TV', 0, 1), +(10, 1, 'Trieste', 'TS', 0, 1), +(10, 1, 'Udine', 'UD', 0, 1), +(10, 1, 'Varese', 'VA', 0, 1), +(10, 1, 'Venezia', 'VE', 0, 1), +(10, 1, 'Verbano-Cusio-Ossola', 'VB', 0, 1), +(10, 1, 'Vercelli', 'VC', 0, 1), +(10, 1, 'Verona', 'VR', 0, 1), +(10, 1, 'Vibo Valentia', 'VV', 0, 1), +(10, 1, 'Vicenza', 'VI', 0, 1), +(10, 1, 'Viterbo', 'VT', 0, 1); + +INSERT INTO `PREFIX_currency` (`name`, `iso_code`, `iso_code_num`, `sign`, `blank`, `conversion_rate`, `format`, `deleted`, `active`) VALUES +('Euro', 'EUR', '978', '€', 1, 1, 2, 0, 1), ('Dollar', 'USD', '840', '$', 0, 1.32, 1, 0, 1), ('Pound', 'GBP', '826', '£', 0, 0.8, 1, 0, 1); +/*('Yen', 'JPY', '392', '¥', 0, 113.14, 2, 0, 0), +('Lev', 'BGN', '975', 'лв', 1, 1.96, 2, 0, 0), ('Couronne', 'CZK', '203', 'Kč', 1, 24.58, 2, 0, 0), ('Couronne', 'DKK', '208', 'kr', 1, 7.45, 2, 0, 0), +('Couronne', 'EEK', '233', 'kr', 1, 15.65, 2, 0, 0), ('Forint', 'HUF', '348', 'Ft', 1, 279.65, 2, 0, 0), ('Litas', 'LTL', '440', 'Lt', 1, 3.45, 2, 0, 0), +('Lats letton', 'LVL', '428', 'Ls', 1, 0.71, 2, 0, 0), ('Zloty', 'PLN', '985', 'zł', 1, 3.94, 2, 0, 0), ('Leu', 'RON', '946', 'lei', 1, 4.26, 2, 0, 0), +('Couronne', 'SEK', '752', 'kr', 1, 9.13, 2, 0, 0), ('Franc Suisse', 'CHF', '756', 'CHF', 1, 1.32, 2, 0, 0), ('Couronne', 'NOK', '578', 'kr', 1, 7.90, 2, 0, 0), +('Kuna', 'HRK', '191', 'kn', 1, 7.28, 2, 0, 0), ('Rouble', 'RUB', '643', 'руб', 1, 41.46, 2, 0, 0), ('Livre', 'TRY', '949', 'TL', 1, 1.98, 2, 0, 0), +('Australian Dollar', 'AUD', '036', '$', 1, 1.40, 2, 0, 0), ('Réal', 'BRL', '986', 'R$', 1, 2.28, 2, 0, 0), ('Canadian Dollar', 'CAD', '124', '$', 1, 1.37, 2, 0, 0), +('Yuan renminbi', 'CNY', '156', '¥', 1, 8.96, 2, 0, 0), ('Hong Kong Dollar', 'HKD', '344', '$', 1, 10.37, 2, 0, 0), ('Rupiah', 'IDR', '360', 'Rp', 1, 11956.81, 2, 0, 0), +('Rupees', 'INR', '356', 'rupees', 1, 60.93, 2, 0, 0), ('Won', 'KRW', '410', '₩', 1, 1537.58, 2, 0, 0), ('Mexican Peso', 'MXN', '484', '$', 1, 16.96, 2, 0, 0), +('Ringgit', 'MYR', '458', 'RM', 1, 4.13, 2, 0, 0), ('New-Zeland Dollar', 'NZD', '554', '$', 1, 1.81, 2, 0, 0), ('Peso Phillipin', 'PHP', '608', 'Php', 1, 58.61, 2, 0, 0), +('Singapour Dollar', 'SGD', '702', '$', 1, 1.77, 2, 0, 0), ('Baht', 'THB', '764', '฿', 1, 40.96, 2, 0, 0), ('Rand', 'ZAR', '710', 'R', 1, 9.38, 2, 0, 0);*/ +INSERT INTO `PREFIX_currency_shop` (`id_currency`, `id_shop`) VALUES (1,1), (2,1), (3,1); + +INSERT INTO `PREFIX_image_type` (`id_image_type`, `name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`, `scenes`, `stores`) VALUES +(1, 'small', 45, 45, 1, 1, 1, 1, 0, 0), +(2, 'medium', 80, 80, 1, 1, 1, 1, 0, 1), +(3, 'large', 300, 300, 1, 1, 1, 1, 0, 0), +(4, 'thickbox', 600, 600, 1, 0, 0, 0, 0, 0), +(5, 'category', 500, 150, 0, 1, 0, 0, 0, 0), +(6, 'home', 129, 129, 1, 0, 0, 0, 0, 0), +(7, 'large_scene', 556, 200, 0, 0, 0, 0, 1, 0), +(8, 'thumb_scene', 161, 58, 0, 0, 0, 0, 1, 0); + +INSERT INTO `PREFIX_contact_shop` (`id_contact`, `id_shop`) VALUES (1,1), (2,1); + +INSERT INTO `PREFIX_contact_lang` (`id_contact`, `id_lang`, `name`, `description`) VALUES +(1, 1, 'Webmaster', 'If a technical problem occurs on this website'), +(1, 2, 'Webmaster', 'Si un problème technique survient sur le site'), +(1, 3, 'Webmaster', 'Si se produce un problema técnico en el sitio'), +(1, 4, 'Webmaster', 'Falls ein technisches Problem auf der Webseite auftritt'), +(1, 5, 'Webmaster', 'Se nel sito interviene un problema tecnico'), +(2, 1, 'Customer service', 'For any question about a product, an order'), +(2, 2, 'Service client', 'Pour toute question ou réclamation sur une commande'), +(2, 3, 'Service client', 'Para cualquier pregunta o queja acerca de un pedido'), +(2, 4, 'Kundenservice', 'Bei Fragen oder Reklamationen zu einer Bestellung'), +(2, 5, 'Servizio clienti', 'Per qualsiasi domanda o reclamo riguardo ad un ordine'); + +INSERT INTO `PREFIX_discount_type` (`id_discount_type`) VALUES (1),(2),(3); +INSERT INTO `PREFIX_discount_type_lang` (`id_discount_type`, `id_lang`, `name`) VALUES +(1, 1, 'Discount on order (%)'),(2, 1, 'Discount on order (amount)'),(3, 1, 'Free shipping'), +(1, 2, 'Réduction sur la commande (%)'),(2, 2, 'Réduction sur la commande (montant)'),(3, 2, 'Frais de port gratuits'), +(1, 3, 'Descuento orden (%)'),(2, 3, 'Descuento (el orden de cantidad)'),(3, 3, 'Gastos de envío gratis'), +(1, 4, 'Preisnachlass auf die Bestellung (%)'),(2, 4, 'Preisnachlass auf die Bestellung (Betrag)'),(3, 4, 'Versandkosten gratis'), +(1, 5, 'Sconto sull’ordine (%)'),(2, 5, 'Sconto sull’ordine (importo)'),(3, 5, 'Spese di porto gratuite'); + +INSERT INTO `PREFIX_profile` (`id_profile`) VALUES (1); +INSERT INTO `PREFIX_profile_lang` (`id_profile`, `id_lang`, `name`) VALUES (1, 1, 'Administrator'),(1, 2, 'Administrateur'),(1, 3, 'Administrador'),(1, 4, 'Administrator'),(1, 5, 'Administrator'); + +INSERT INTO `PREFIX_tab` (`id_tab`, `class_name`, `id_parent`, `position`) VALUES (1, 'AdminCatalog', 0, 1),(2, 'AdminCustomers', 0, 2),(3, 'AdminOrders', 0, 3), +(4, 'AdminPayment', 0, 4),(5, 'AdminShipping', 0, 5),(6, 'AdminStats', 0, 6),(7, 'AdminModules', 0, 7),(29, 'AdminEmployees', 0, 8),(8, 'AdminPreferences', 0, 9), +(9, 'AdminTools', 0, 10),(82, 'AdminStores', 9, 11),(60, 'AdminTracking', 1, 1),(10, 'AdminManufacturers', 1, 2),(34, 'AdminSuppliers', 1, 3),(11, 'AdminAttributesGroups', 1, 4), +(36, 'AdminFeatures', 1, 5),(58, 'AdminScenes', 1, 6),(66, 'AdminTags', 1, 7),(68, 'AdminAttachments', 1, 7),(12, 'AdminAddresses', 2, 1),(63, 'AdminGroups', 2, 2), +(65, 'AdminCarts', 2, 3),(42, 'AdminInvoices', 3, 1),(55, 'AdminDeliverySlip', 3, 2),(47, 'AdminReturn', 3, 3),(49, 'AdminSlip', 3, 4),(59, 'AdminMessages', 3, 5), +(13, 'AdminStatuses', 3, 6),(54, 'AdminOrderMessage', 3, 7),(14, 'AdminDiscounts', 4, 4),(15, 'AdminCurrencies', 4, 1),(16, 'AdminTaxes', 4, 2), +(17, 'AdminCarriers', 5, 1),(46, 'AdminStates', 5, 2),(18, 'AdminCountries', 5, 3),(19, 'AdminZones', 5, 5),(20, 'AdminRangePrice', 5, 6), +(21, 'AdminRangeWeight', 5, 7),(51, 'AdminStatsConf', 6, 1),(61, 'AdminSearchEngines', 6, 2),(62, 'AdminReferrers', 6, 3), +(22, 'AdminModulesPositions', 7, 4),(30, 'AdminProfiles', 29, 1),(31, 'AdminAccess', 29, 2),(28, 'AdminContacts', 29, 3),(39, 'AdminContact', 8, 1), +(38, 'AdminAppearance', 8, 2),(56, 'AdminMeta', 8, 3),(27, 'AdminPPreferences', 8, 4),(24, 'AdminEmails', 8, 5),(26, 'AdminImages', 8, 6),(23, 'AdminDb', 8, 7), +(48, 'AdminPDF', 3, 8),(44, 'AdminLocalization', 8, 9),(67, 'AdminSearchConf', 8, 10),(32, 'AdminLanguages', 9, 1),(33, 'AdminTranslations', 9, 2), +(35, 'AdminTabs', 29, 3),(37, 'AdminQuickAccesses', 9, 4),(40, 'AdminAliases', 8, 5),(41, 'AdminImport', 9, 6),(52, 'AdminSubDomains', 9, 7), +(53, 'AdminBackup', 9, 8),(57, 'AdminCMSContent', 9, 9),(64, 'AdminGenerator', 9, 10),(43, 'AdminSearch', -1, 0),(69, 'AdminInformation', 9, 11), +(70, 'AdminPerformance', 8, 11),(71, 'AdminCustomerThreads', 29, 4),(72, 'AdminWebservice', 9, 12),(73, 'AdminStockMvt', 1, 9), +(80, 'AdminAddonsCatalog', 7, 1),(81, 'AdminAddonsMyAccount', 7, 2),(83, 'AdminThemes', 7, 3),(84, 'AdminGeolocation', 8, 12), +(85, 'AdminTaxRulesGroup', 4, 3),(86, 'AdminLogs', 9, 13), (87, 'AdminCounty', 5, 4),(88,'AdminHome',-1,0),(89,'AdminShop', 0, 11), (90,'AdminGroupShop', 89, 1), +(91, 'AdminShopUrl', 89, 2); + +INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) (SELECT 1, id_tab, 1, 1, 1, 1 FROM PREFIX_tab); + +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES +(1, 1, 'Catalog'),(1, 2, 'Customers'),(1, 3, 'Orders'),(1, 4, 'Payment'), +(1, 5, 'Shipping'),(1, 6, 'Stats'),(1, 7, 'Modules'),(1, 8, 'Preferences'),(1, 9, 'Tools'),(1, 10, 'Manufacturers'),(1, 11, 'Attributes and Groups'), +(1, 12, 'Addresses'),(1, 13, 'Statuses'),(1, 14, 'Vouchers'),(1, 15, 'Currencies'),(1, 16, 'Taxes'),(1, 17, 'Carriers'),(1, 18, 'Countries'), +(1, 19, 'Zones'),(1, 20, 'Price Ranges'),(1, 21, 'Weight Ranges'),(1, 22, 'Positions'),(1, 23, 'Database'),(1, 24, 'E-mail'),(1, 26, 'Image'), +(1, 27, 'Products'),(1, 28, 'Contacts'),(1, 29, 'Employees'),(1, 30, 'Profiles'),(1, 31, 'Permissions'),(1, 32, 'Languages'),(1, 33, 'Translations'), +(1, 34, 'Suppliers'),(1, 35, 'Tabs'),(1, 36, 'Features'),(1, 37, 'Quick Access'),(1, 38, 'Appearance'),(1, 39, 'Contact Information'),(1, 40, 'Aliases'), +(1, 41, 'Import'),(1, 42, 'Invoices'),(1, 43, 'Search'),(1, 44, 'Localization'),(1, 46, 'States'),(1, 47, 'Merchandise Returns'),(1, 48, 'PDF'), +(1, 49, 'Credit Slips'),(1, 51, 'Settings'),(1, 52, 'Subdomains'),(1, 53, 'DB backup'),(1, 54, 'Order Messages'), +(1, 55, 'Delivery Slips'),(1, 56, 'SEO & URLs'),(1, 57, 'CMS'),(1, 58, 'Image Mapping'),(1, 59, 'Customer Messages'),(1, 60, 'Tracking'), +(1, 61, 'Search Engines'),(1, 62, 'Referrers'),(1, 63, 'Groups'),(1, 64, 'Generators'),(1, 65, 'Shopping Carts'),(1, 66, 'Tags'),(1, 67, 'Search'), +(1, 68, 'Attachments'),(1, 69, 'Configuration Information'),(1, 70, 'Performance'),(1, 71, 'Customer Service'),(1, 72, 'Webservice'),(1, 73, 'Stock Movements'), +(1, 80, 'Modules & Themes Catalog'),(1, 81, 'My Account'),(1, 82, 'Stores'),(1, 83, 'Themes'),(1, 84, 'Geolocation'),(1, 85, 'Tax Rules'),(1, 86, 'Log'), +(1, 87, 'Counties'),(1, 88, 'Home'), (1, 89, 'Shops'), (1, 90, 'Group Shops'), (1, 91, 'Shop Urls'); + +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES +(2, 1, 'Catalogue'),(2, 2, 'Clients'),(2, 3, 'Commandes'),(2, 4, 'Paiement'),(2, 5, 'Transport'), +(2, 6, 'Stats'),(2, 7, 'Modules'),(2, 8, 'Préférences'),(2, 9, 'Outils'),(2, 10, 'Fabricants'),(2, 11, 'Attributs et groupes'),(2, 12, 'Adresses'),(2, 13, 'Statuts'), +(2, 14, 'Bons de réduction'),(2, 15, 'Devises'),(2, 16, 'Taxes'),(2, 17, 'Transporteurs'),(2, 18, 'Pays'),(2, 19, 'Zones'),(2, 20, 'Tranches de prix'), +(2, 21, 'Tranches de poids'),(2, 22, 'Positions'),(2, 23, 'Base de données'),(2, 24, 'Emails'),(2, 26, 'Images'),(2, 27, 'Produits'),(2, 28, 'Contacts'), +(2, 29, 'Employés'),(2, 30, 'Profils'),(2, 31, 'Permissions'),(2, 32, 'Langues'),(2, 33, 'Traductions'),(2, 34, 'Fournisseurs'),(2, 35, 'Onglets'), +(2, 36, 'Caractéristiques'),(2, 37, 'Accès rapide'),(2, 38, 'Apparence'),(2, 39, 'Coordonnées'),(2, 40, 'Alias'),(2, 41, 'Import'),(2, 42, 'Factures'), +(2, 43, 'Recherche'),(2, 44, 'Localisation'),(2, 46, 'Etats'),(2, 47, 'Retours produits'),(2, 48, 'PDF'),(2, 49, 'Avoirs'), +(2, 51, 'Configuration'),(2, 52, 'Sous domaines'),(2, 53, 'Sauvegarde BDD'),(2, 54, 'Messages prédéfinis'),(2, 55, 'Bons de livraison'), +(2, 56, 'SEO & URLs'),(2, 57, 'CMS'),(2, 58, 'Scènes'),(2, 59, 'Messages clients'),(2, 60, 'Suivi'),(2, 61, 'Moteurs de recherche'), +(2, 62, 'Sites affluents'),(2, 63, 'Groupes'),(2, 64, 'Générateurs'),(2, 65, 'Paniers'),(2, 66, 'Tags'),(2, 67, 'Recherche'), +(2, 68, 'Documents joints'),(2, 69, 'Informations'),(2, 70, 'Performances'),(2, 71, 'SAV'),(2, 72, 'Service web'),(2, 73, 'Mouvements de Stock'), +(2, 80, 'Catalogue de modules et thèmes'),(2, 81, 'Mon compte'),(2, 82, 'Magasins'),(2, 83, 'Thèmes'),(2, 84, 'Géolocalisation'),(2, 85, 'Règles de taxes'),(2, 86, 'Log'), +(2, 87, 'Comtés'),(2,88,'Accueil'), (2, 89, 'Boutiques'), (2, 90, 'Groupes de boutique'), (2, 91, 'URLs de boutique'); + +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES +(3, 1, 'Catálogo'),(3, 2, 'Clientes'),(3, 3, 'Pedidos'),(3, 4, 'Pago'),(3, 5, 'Transporte'), +(3, 6, 'Estadísticas'),(3, 7, 'Módulos'),(3, 8, 'Preferencias'),(3, 9, 'Herramientas'),(3, 10, 'Fabricantes'),(3, 11, 'Atributos y grupos'),(3, 12, 'Direcciones'), +(3, 13, 'Estados'),(3, 14, 'Vales de descuento'),(3, 15, 'Divisas'),(3, 16, 'Impuestos'),(3, 17, 'Transportistas'),(3, 18, 'Países'),(3, 19, 'Zonas'), +(3, 20, 'Franja de precios'),(3, 21, 'Franja de pesos'),(3, 22, 'Posiciones'),(3, 23, 'Base de datos'),(3, 24, 'Emails'),(3, 26, 'Imágenes'), +(3, 27, 'Productos'),(3, 28, 'Contactos'),(3, 29, 'Empleados'),(3, 30, 'Perfiles'),(3, 31, 'Permisos'),(3, 32, 'Idiomas'),(3, 33, 'Traducciones'), +(3, 34, 'Proovedores'),(3, 35, 'Pestañas'),(3, 36, 'Características'),(3, 37, 'Acceso rápido'),(3, 38, 'Aspecto'),(3, 39, 'Datos'),(3, 40, 'Alias'), +(3, 41, 'Importar'),(3, 42, 'Facturas'),(3, 43, 'Búsqueda'),(3, 44, 'Ubicación'),(3, 46, 'Estados'),(3, 47, 'Devolución productos'),(3, 48, 'PDF'), +(3, 49, 'Vales'),(3, 51, 'Configuración'),(3, 52, 'Subcampos'),(3, 53, 'Copia de seguridad'),(3, 54, 'Mensajes de Orden'), +(3, 55, 'Albaranes de entrega'),(3, 56, 'SEO & URLs'),(3, 57, 'CMS'),(3, 58, 'Mapeo de la imagen'),(3, 59, 'Mensajes del cliente'),(3, 60, 'Rastreo'), +(3, 61, 'Motores de búsqueda'),(3, 62, 'Referido'),(3, 63, 'Grupos'),(3, 64, 'Generadores'),(3, 65, 'Carritos'),(3, 66, 'Etiquetas'),(3, 67, 'Búsqueda'),(3, 68, 'Adjuntos'), +(3, 69, 'Informations'),(3, 70, 'Rendimiento'),(3, 72, 'Web service'),(3, 71, 'Servicio al cliente'),(3, 73, 'Movimiento de Stock'), (3, 82, 'Tiendas'),(3, 83, 'Temas'),(3, 84, 'Geolocalización'),(3, 85, 'Reglas de Impuestos'),(3, 86, 'Log'), +(3, 87, 'Condados'),(3,88,'Home'), (3, 89, 'Shops'), (3, 90, 'Group Shops'), (3, 91, 'Shop Urls'); + +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES +(4, 1, 'Katalog'),(4, 2, 'Kunden'),(4, 3, 'Bestellungen'),(4, 4, 'Zahlung'), +(4, 5, 'Versandkosten'),(4, 6, 'Statistik'),(4, 7, 'Module'),(4, 8, 'Voreinstellungen'),(4, 9, 'Tools'),(4, 10, 'Hersteller'),(4, 11, 'Attribute und Gruppen'), +(4, 12, 'Adressen'),(4, 13, 'Status'),(4, 14, 'Gutscheine'),(4, 15, 'Währungen'),(4, 16, 'Steuern'),(4, 17, 'Lieferanten'),(4, 18, 'Länder'), +(4, 19, 'Zonen'),(4, 20, 'Preislagen'),(4, 21, 'Gewichtsklassen'),(4, 22, 'Positionen'),(4, 23, 'Datenbank'),(4, 24, 'E-Mail'),(4, 26, 'Bild'), +(4, 27, 'Produkte'),(4, 28, 'Kontakte'),(4, 29, 'Mitarbeiter'),(4, 30, 'Profile'),(4, 31, 'Berechtigungen'),(4, 32, 'Sprachen'),(4, 33, 'Übersetzungen'), +(4, 34, 'Zulieferer'),(4, 35, 'Tabs'),(4, 36, 'Funktionen'),(4, 37, 'Schnellzugriff'),(4, 38, 'Aussehen'),(4, 39, 'Kontaktinformation'),(4, 40, 'Alias'), +(4, 41, 'Import'),(4, 42, 'Rechnungen'),(4, 43, 'Suche'),(4, 44, 'Lokalisierung'),(4, 46, 'Staaten'),(4, 47, 'Warenrücksendungen'),(4, 48, 'PDF'), +(4, 49, 'Gutscheine'),(4, 51, 'Einstellungen'),(4, 52, 'Subdomains'),(4, 53, 'DB-Backup'),(4, 54, 'Bestellnachrichten'), +(4, 55, 'Lieferscheine'),(4, 56, 'SEO & URLs'),(4, 57, 'CMS'),(4, 58, 'Image Mapping'),(4, 59, 'Kundennachrichten'),(4, 60, 'Tracking'), +(4, 61, 'Suchmaschinen'),(4, 62, 'Referrer'),(4, 63, 'Gruppen'),(4, 64, 'Generatoren'),(4, 65, 'Warenkörbe'),(4, 66, 'Tags'),(4, 67, 'Suche'), +(4, 68, 'Anhänge'),(4, 69, 'Konfigurationsinformationen'),(4, 70, 'Leistung'),(4, 71, 'Kundenservice'),(4, 72, 'Webservice'),(4, 73, 'Lagerbewegungen'), +(4, 80, 'Module und Themenkatalog'),(4, 81, 'Mein Konto'),(4, 82, 'Shops'),(4, 83, 'Themen'),(4, 84, 'Geotargeting'),(4, 85, 'Steuerregeln'),(4, 86, 'Log'), +(4,87,'Counties'),(4,88,'Home'), (4, 89, 'Shops'), (4, 90, 'Group Shops'), (4, 91, 'Shop Urls'); + +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES +(5, 1, 'Catalogo'),(5, 2, 'Clienti'),(5, 3, 'Ordini'),(5, 4, 'Pagamento'), +(5, 5, 'Spedizione'),(5, 6, 'Stat'),(5, 7, 'Moduli'),(5, 8, 'Preferenze'),(5, 9, 'Strumenti'),(5, 10, 'Produttori'),(5, 11, 'Attributi e Gruppi'), +(5, 12, 'Indirizzi'),(5, 13, 'Status'),(5, 14, 'Voucher'),(5, 15, 'Valute'),(5, 16, 'Tasse'),(5, 17, 'Corrieri'),(5, 18, 'Nazioni'), +(5, 19, 'Zone'),(5, 20, 'Fasce di prezzo'),(5, 21, 'Fasce di peso'),(5, 22, 'Posizioni'),(5, 23, 'Database'),(5, 24, 'E-mail'),(5, 26, 'Immagine'), +(5, 27, 'Prodotti'),(5, 28, 'Contatti'),(5, 29, 'Impiegati'),(5, 30, 'Profili'),(5, 31, 'Permessi'),(5, 32, 'Lingue'),(5, 33, 'Traduzioni'), +(5, 34, 'Fornitori'),(5, 35, 'Tab'),(5, 36, 'Caratteristiche'),(5, 37, 'Accesso rapido'),(5, 38, 'Aspetto'),(5, 39, 'Informazioni di contatto'),(5, 40, 'Alias'), +(5, 41, 'Importa'),(5, 42, 'Fatture'),(5, 43, 'Cerca'),(5, 44, 'Localizzazione'),(5, 46, 'Stati'),(5, 47, 'Resi merci'),(5, 48, 'PDF'), +(5, 49, 'Note di credito'),(5, 51, 'Impostazioni'),(5, 52, 'Sottodomini'),(5, 53, 'DB backup'),(5, 54, 'Messaggi ordine'), +(5, 55, 'Note di consegna'),(5, 56, 'SEO & URLs'),(5, 57, 'CMS'),(5, 58, 'Mappatura immagine'),(5, 59, 'Messaggi cliente'),(5, 60, 'Rintracciare'), +(5, 61, 'Motori di ricerca'),(5, 62, 'Referenti'),(5, 63, 'Gruppi'),(5, 64, 'Generatori'),(5, 65, 'Carrelli shopping'),(5, 66, 'Tag'),(5, 67, 'Cerca'), +(5, 68, 'Allegati'),(5, 69, 'Informazioni di configurazione'),(5, 70, 'Performance'),(5, 71, 'Servizio clienti'),(5, 72, 'Webservice'),(5, 73, 'Movimenti magazzino'), +(5, 80, 'Moduli & Temi catalogo'),(5, 81, 'Il mio Account'),(5, 82, 'Negozi'),(5, 83, 'Temi'),(5, 84, 'Geolocalizzazione'),(5, 85, 'Regimi fiscali'),(5, 86, 'Log'), +(5,87,'Counties'),(5,88,'Home'), (5, 89, 'Shops'), (5, 90, 'Group Shops'), (5, 91, 'Shop Urls'); + +INSERT IGNORE INTO `PREFIX_tab_lang` (`id_tab`, `id_lang`, `name`) + (SELECT `id_tab`, id_lang, (SELECT tl.`name` + FROM `PREFIX_tab_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_tab`=`PREFIX_tab`.`id_tab`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_tab`); + +INSERT INTO `PREFIX_quick_access` (`id_quick_access`, `link`, `new_window`) VALUES +(1, 'index.php', 0),(2, '../', 1),(3, 'index.php?tab=AdminCatalog&addcategory', 0),(4, 'index.php?tab=AdminCatalog&addproduct', 0),(5, 'index.php?tab=AdminDiscounts&adddiscount', 0); + +INSERT INTO `PREFIX_quick_access_lang` (`id_quick_access`, `id_lang`, `name`) VALUES +(1, 1, 'Home'),(1, 2, 'Accueil'),(1, 3, 'Inicio'),(1, 4, 'Start'),(1, 5, 'Home page'), +(2, 1, 'My Shop'),(2, 2, 'Ma boutique'),(2, 3, 'Mi tienda'),(2, 4, 'Mein Shop'),(2, 5, 'Il mio negozio'), +(3, 1, 'New category'),(3, 2, 'Nouvelle catégorie'),(3, 3, 'Nueva categoría'),(3, 4, 'Neue Kategorie'),(3, 5, 'Nuova categoria'), +(4, 1, 'New product'),(4, 2, 'Nouveau produit'),(4, 3, 'Nuevo producto'),(4, 4, 'Neues Produkt'),(4, 5, 'Nuovo prodotto'), +(5, 1, 'New voucher'),(5, 2, 'Nouveau bon de réduction'),(5, 3, 'Nuevo cupón'),(5, 4, 'Neuer Ermäßigungsgutschein'),(5, 5, 'Nuovo buono sconto'); + +INSERT INTO `PREFIX_order_return_state` (`id_order_return_state`, `color`) VALUES (1, '#ADD8E6'),(2, '#EEDDFF'),(3, '#DDFFAA'),(4, '#FFD3D3'),(5, '#FFFFBB'); + +INSERT INTO `PREFIX_order_return_state_lang` (`id_order_return_state`, `id_lang`, `name`) VALUES +(1, 1, 'Waiting for confirmation'),(2, 1, 'Waiting for package'),(3, 1, 'Package received'),(4, 1, 'Return denied'),(5, 1, 'Return completed'), +(1, 2, 'En attente de confirmation'),(2, 2, 'En attente du colis'),(3, 2, 'Colis reçu'),(4, 2, 'Retour refusé'),(5, 2, 'Retour terminé'), +(1, 3, 'Pendiente de confirmación'),(2, 3, 'En espera de paquetes'),(3, 3, 'Paquetes recibidos'),(4, 3, 'Volver negó'),(5, 3, 'Diligenciados'), +(1, 4, 'Bestätigung wird erwartet'),(2, 4, 'Paket wird erwartet'),(3, 4, 'Paket erhalten'),(4, 4, 'Rücksendung abgelehnt'),(5, 4, 'Rücksendung beendet'), +(1, 5, 'In attesa di conferma'),(2, 5, 'In attesa del pacco'),(3, 5, 'Pacco ricevuto'),(4, 5, 'Restituzione non accettata'),(5, 5, 'Restituzione terminata'); + +INSERT INTO `PREFIX_meta` (`id_meta`, `page`) VALUES +(1, '404'), +(2, 'best-sales'), +(3, 'contact-form'), +(4, 'index'), +(5, 'manufacturer'), +(6, 'new-products'), +(7, 'password'), +(8, 'prices-drop'), +(9, 'sitemap'), +(10, 'supplier'), +(11, 'address'), +(12, 'addresses'), +(13, 'authentication'), +(14, 'cart'), +(15, 'discount'), +(16, 'history'), +(17, 'identity'), +(18, 'my-account'), +(19, 'order-follow'), +(20, 'order-slip'), +(21, 'order'), +(22, 'search'), +(23, 'stores'), +(24, 'order-opc'), +(25, 'guest-tracking'); + +INSERT INTO `PREFIX_meta_lang` (`id_meta`, `id_shop`, `id_lang`, `title`, `description`, `keywords`, `url_rewrite`) VALUES +(1, 1, 1, '404 error', 'This page cannot be found', 'error, 404, not found', 'page-not-found'), +(1, 1, 2, 'Erreur 404', 'Cette page est introuvable', 'erreur, 404, introuvable', 'page-non-trouvee'), +(1, 1, 3, 'Error 404', 'Esta página no se encuentra', 'error, 404, No se ha encontrado', 'pagina-no-encuentra'), +(2, 1, 1, 'Best sales', 'Our best sales', 'best sales', 'best-sales'), +(2, 1, 2, 'Meilleures ventes', 'Liste de nos produits les mieux vendus', 'meilleures ventes', 'meilleures-ventes'), +(2, 1, 3, 'Los más vendidos', 'Lista de los de mayor venta de productos', 'los más vendidos', 'mas-vendidos'), +(3, 1, 1, 'Contact us', 'Use our form to contact us', 'contact, form, e-mail', 'contact-us'), +(3, 1, 2, 'Contactez-nous', 'Utilisez notre formulaire pour nous contacter', 'contact, formulaire, e-mail', 'contactez-nous'), +(3, 1, 3, 'Contáctenos', 'Use nuestro formulario de contacto con nosotros', 'formulario de contacto, e-mail', 'contactenos'), +(4, 1, 1, '', 'Shop powered by PrestaShop', 'shop, prestashop', ''), +(4, 1, 2, '', 'Boutique propulsée par PrestaShop', 'boutique, prestashop', ''), +(4, 1, 3, '', 'Shop powered by PrestaShop', 'tienda, prestashop', ''), +(5, 1, 1, 'Manufacturers', 'Manufacturers list', 'manufacturer', 'manufacturers'), +(5, 1, 2, 'Fabricants', 'Liste de nos fabricants', 'fabricants', 'fabricants'), +(5, 1, 3, 'Fabricantes', 'Lista de Fabricantes', 'fabricantes', 'fabricantes'), +(6, 1, 1, 'New products', 'Our new products', 'new, products', 'new-products'), +(6, 1, 2, 'Nouveaux produits', 'Liste de nos nouveaux produits', 'nouveau, produit', 'nouveaux-produits'), +(6, 1, 3, 'Nuevos Productos', 'Lista de nuestros nuevos productos', 'nuevo, productos', 'nuevos-productos'), +(7, 1, 1, 'Forgot your password', 'Enter your e-mail address used to register in goal to get e-mail with your new password', 'forgot, password, e-mail, new, reset', 'password-recovery'), +(7, 1, 2, 'Mot de passe oublié', 'Renseignez votre adresse e-mail afin de recevoir votre nouveau mot de passe.', 'mot de passe, oublié, e-mail, nouveau, regénération', 'mot-de-passe-oublie'), +(7, 1, 3, 'Olvidaste tu contraseña', 'Ingrese su dirección de correo electrónico para recibir su nueva contraseña.', 'contraseña, has olvidado, e-mail, nuevo, regeneración', 'contrasena-olvidado'), +(8, 1, 1, 'Prices drop', 'Our special products', 'special, prices drop', 'prices-drop'), +(8, 1, 2, 'Promotions', 'Nos produits en promotion', 'promotion, réduction', 'promotions'), +(8, 1, 3, 'Promociones', 'Nuestros productos promocionales', 'promoción, reducción', 'promocion'), +(9, 1, 1, 'Sitemap', 'Lost ? Find what your are looking for', 'sitemap', 'sitemap'), +(9, 1, 2, 'Plan du site', 'Perdu ? Trouvez ce que vous cherchez', 'plan, site', 'plan-du-site'), +(9, 1, 3, 'Mapa del sitio', '¿Perdido? Encuentra lo que buscas', 'plan, sitio', 'mapa-del-sitio'), +(10, 1, 1, 'Suppliers', 'Suppliers list', 'supplier', 'supplier'), +(10, 1, 2, 'Fournisseurs', 'Liste de nos fournisseurs', 'fournisseurs', 'fournisseurs'), +(10, 1, 3, 'Proveedores', 'Lista de Proveedores', 'proveedores', 'proveedores'), +(11, 1, 1, 'Address', '', '', 'address'), +(11, 1, 2, 'Adresse', '', '', 'adresse'), +(11, 1, 3, 'Dirección', '', '', 'direccion'), +(12, 1, 1, 'Addresses', '', '', 'addresses'), +(12, 1, 2, 'Adresses', '', '', 'adresses'), +(12, 1, 3, 'Direcciones', '', '', 'direcciones'), +(13, 1, 1, 'Authentication', '', '', 'authentication'), +(13, 1, 2, 'Authentification', '', '', 'authentification'), +(13, 1, 3, 'Autenticación', '', '', 'autenticacion'), +(14, 1, 1, 'Cart', '', '', 'cart'), +(14, 1, 2, 'Panier', '', '', 'panier'), +(14, 1, 3, 'Carro de la compra', '', '', 'carro-de-la-compra'), +(15, 1, 1, 'Discount', '', '', 'discount'), +(15, 1, 2, 'Bons de réduction', '', '', 'bons-de-reduction'), +(15, 1, 3, 'Descuento', '', '', 'descuento'), +(16, 1, 1, 'Order history', '', '', 'order-history'), +(16, 1, 2, 'Historique des commandes', '', '', 'historique-des-commandes'), +(16, 1, 3, 'Historial de pedidos', '', '', 'historial-de-pedidos'), +(17, 1, 1, 'Identity', '', '', 'identity'), +(17, 1, 2, 'Identité', '', '', 'identite'), +(17, 1, 3, 'Identidad', '', '', 'identidad'), +(18, 1, 1, 'My account', '', '', 'my-account'), +(18, 1, 2, 'Mon compte', '', '', 'mon-compte'), +(18, 1, 3, 'Mi Cuenta', '', '', 'mi-cuenta'), +(19, 1, 1, 'Order follow', '', '', 'order-follow'), +(19, 1, 2, 'Détails de la commande', '', '', 'details-de-la-commande'), +(19, 1, 3, 'Devolución de productos', '', '', 'devolucion-de-productos'), +(20, 1, 1, 'Order slip', '', '', 'order-slip'), +(20, 1, 2, 'Avoirs', '', '', 'avoirs'), +(20, 1, 3, 'Vales', '', '', 'vales'), +(21, 1, 1, 'Order', '', '', 'order'), +(21, 1, 2, 'Commande', '', '', 'commande'), +(21, 1, 3, 'Carrito', '', '', 'carrito'), +(22, 1, 1, 'Search', '', '', 'search'), +(22, 1, 2, 'Recherche', '', '', 'recherche'), +(22, 1, 3, 'Buscar', '', '', 'buscar'), +(23, 1, 1, 'Stores', '', '', 'stores'), +(23, 1, 2, 'Magasins', '', '', 'magasins'), +(23, 1, 3, 'Tiendas', '', '', 'tiendas'), +(24, 1, 1, 'Order', '', '', 'quick-order'), +(24, 1, 2, 'Commande', '', '', 'commande-rapide'), +(24, 1, 3, 'Carrito', '', '', 'pedido-rapido'), +(25, 1, 1, 'Guest tracking', '', '', 'guest-tracking'), +(25, 1, 2, 'Suivi de commande invité', '', '', 'suivi-commande-invite'), +(25, 1, 3, 'Estado del pedido', '', '', 'estado-pedido'), +(1, 1, 4, 'Fehler 404', 'Seite wurde nicht gefunden', 'Fehler 404, nicht gefunden', 'seite-nicht-gefunden'), +(2, 1, 4, 'Verkaufshits', 'Unsere Verkaufshits', 'Verkaufshits', 'verkaufshits'), +(3, 1, 4, 'Kontaktieren Sie uns', 'Nutzen Sie unser Kontaktformular', 'Kontakt, Formular, E-Mail', 'kontaktieren-sie-uns'), +(4, 1, 4, '', 'Shop powered by PrestaShop', 'Shop, prestashop', ''), +(5, 1, 4, 'Hersteller', 'Herstellerliste', 'Hersteller', 'hersteller'), +(6, 1, 4, 'Neue Produkte', 'Unsere neuen Produkte', 'neu, Produkte', 'neue-Produkte'), +(7, 1, 4, 'Kennwort vergessen', 'Geben Sie die E-Mailadresse ein, die Sie zum Einloggen benutzen, damit Sie eine E-Mail mit dem neuen Kennwort erhalt', 'vergessen, Kennwort, E-Mail, neu, Reset', 'kennwort-wiederherstellung'), +(8, 1, 4, 'Angebote', 'Unsere Sonderangebote', 'besonders, Angebote', 'angebote'), +(9, 1, 4, 'Sitemap', 'Verloren? Finden Sie, was Sie suchen', 'sitemap', 'sitemap'), +(10, 1, 4, 'Zulieferer', 'Zuliefererliste', 'Zulieferer', 'zulieferer'), +(11, 1, 4, 'Adresse', '', '', 'adresse'), +(12, 1, 4, 'Adressen', '', '', 'adressen'), +(13, 1, 4, 'Authentifizierung', '', '', 'authentifizierung'), +(14, 1, 4, 'Warenkorb', '', '', 'warenkorb'), +(15, 1, 4, 'Discount', '', '', 'discount'), +(16, 1, 4, 'Bestellungsverlauf', '', '', 'bestellungsverlauf'), +(17, 1, 4, 'Kennung', '', '', 'kennung'), +(18, 1, 4, 'Mein Konto', '', '', 'mein-Konto'), +(19, 1, 4, 'Bestellungsverfolgung', '', '', 'bestellungsverfolgung'), +(20, 1, 4, 'Bestellschein', '', '', 'bestellschein'), +(21, 1, 4, 'Bestellung', '', '', 'bestellung'), +(22, 1, 4, 'Suche', '', '', 'suche'), +(23, 1, 4, 'Shops', '', '', 'shops'), +(24, 1, 4, 'Bestellung', '', '', 'schnell-bestellung'), +(25, 1, 4, 'Auftragsverfolgung Gast', '', '', 'auftragsverfolgung-gast'), +(1, 1, 5, 'errore 404', 'Impossibile trovare questa pagina', 'errore, 404, non trovato', 'pagina-non-trovata'), +(2, 1, 5, 'Vendite migliori', 'Le nostre vendite migliori', 'vendite migliori', 'vendite-migliori'), +(3, 1, 5, 'Contattaci', 'Usa il nostro modulo per contattarci', 'contatto, modulo, e-mail', 'contattaci'), +(4, 1, 5, '', 'Negozio powered by PrestaShop', 'negozio, prestashop', ''), +(5, 1, 5, 'Produttori', 'Elenco produttori', 'produttore', 'produttori'), +(6, 1, 5, 'Nuovi prodotti', 'I nostri nuovi prodotti', 'nuovi, prodotti', 'nuovi-prodotti'), +(7, 1, 5, 'Hai dimenticato la password', 'Inserisci l\'indirizzo e-mail usato per registrarti per poter ottenere una e-mail with con la tua nuova password', 'dimenticato, password, e-mail, nuovo, reset', 'password-recupero'), +(8, 1, 5, 'Riduzioni prezzi', 'I nostri prodotti speciali', 'speciali, riduzione prezzi', 'riduzione-prezzi'), +(9, 1, 5, 'Mappa del sito', 'Ti sei perso? Trova quello che stai cercando', 'sitemap', 'sitemap'), +(10, 1, 5, 'Fornitori', 'Elenco fornitori', 'fornitori', 'fornitore'), +(11, 1, 5, 'Indirizzo', '', '', 'indirizzo'), +(12, 1, 5, 'Indirizzi', '', '', 'indirizzi'), +(13, 1, 5, 'Autenticazione', '', '', 'autenticazione'), +(14, 1, 5, 'Carrello', '', '', 'carrello'), +(15, 1, 5, 'Sconto', '', '', 'sconto'), +(16, 1, 5, 'Storico ordine', '', '', 'storico-ordine'), +(17, 1, 5, 'Identità', '', '', 'identita'), +(18, 1, 5, 'Il mio account', '', '', 'il-mio-account'), +(19, 1, 5, 'Seguito ordine', '', '', 'seguito-ordine'), +(20, 1, 5, 'Nota di ordine', '', '', 'nota-di-ordine'), +(21, 1, 5, 'Ordine', '', '', 'ordine'), +(22, 1, 5, 'Cerca', '', '', 'cerca'), +(23, 1, 5, 'Negozi', '', '', 'negozi'), +(24, 1, 5, 'Ordine', '', '', 'ordine-veloce'), +(25, 1, 5, 'Ospite di monitoraggio', '', '', 'ospite-monitoraggio'); + +/* Stats */ +INSERT INTO `PREFIX_operating_system` (`name`) VALUES ('Windows XP'),('Windows Vista'),('MacOsX'),('Linux'); +INSERT INTO `PREFIX_web_browser` (`name`) VALUES ('Safari'),('Firefox 2.x'),('Firefox 3.x'),('Opera'),('IE 6.x'),('IE 7.x'),('IE 8.x'),('Google Chrome'); +INSERT INTO `PREFIX_page_type` (`id_page_type`, `name`) VALUES +(13, 'authentication.php'),(11, 'best-sales.php'),(2, 'category.php'),(7, 'cms.php'),(12, 'contact-form.php'),(5, 'index.php'),(4, 'manufacturer.php'), +(3, 'order.php'),(10, 'prices-drop.php'),(1, 'product.php'),(8, 'search.php'),(14, 'sitemap.php'),(9, 'stores.php'),(6, 'supplier.php'); +INSERT INTO `PREFIX_search_engine` (`server`,`getvar`) +VALUES ('google','q'),('aol','q'),('yandex','text'),('ask.com','q'),('nhl.com','q'),('yahoo','p'),('baidu','wd'), +('lycos','query'),('exalead','q'),('search.live','q'),('voila','rdata'),('altavista','q'),('bing','q'),('daum','q'), +('eniro','search_word'),('naver','query'),('msn','q'),('netscape','query'),('cnn','query'),('about','terms'),('mamma','query'), +('alltheweb','q'),('virgilio','qs'),('alice','qs'),('najdi','q'),('mama','query'),('seznam','q'),('onet','qt'),('szukacz','q'), +('yam','k'),('pchome','q'),('kvasir','q'),('sesam','q'),('ozu','q'),('terra','query'),('mynet','q'),('ekolay','q'),('rambler','words'); + +/* SubDomains */ +INSERT INTO `PREFIX_subdomain` (`id_subdomain`, `name`) VALUES (NULL, 'www'); + +/* CMS */ +INSERT INTO `PREFIX_cms` (`id_cms`, `id_cms_category`, `position`, `active`) VALUES (1, 1, 0, 1), (2, 1, 1, 1), (3, 1, 2, 1), (4, 1, 3, 1), (5, 1, 4, 1); +INSERT INTO `PREFIX_cms_shop` (`id_cms`, `id_shop`) VALUES (1,1), (2,1), (3,1), (4,1), (5,1); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(1, 1, 'Delivery', 'Our terms and conditions of delivery', 'conditions, delivery, delay, shipment, pack', '

    Shipments and returns

    Your pack shipment

    Packages are generally dispatched within 2 days after receipt of payment and are shipped via UPS with tracking and drop-off without signature. If you prefer delivery by UPS Extra with required signature, an additional cost will be applied, so please contact us before choosing this method. Whichever shipment choice you make, we will provide you with a link to track your package online.

    Shipping fees include handling and packing fees as well as postage costs. Handling fees are fixed, whereas transport fees vary according to total weight of the shipment. We advise you to group your items in one order. We cannot group two distinct orders placed separately, and shipping fees will apply to each of them. Your package will be dispatched at your own risk, but special care is taken to protect fragile objects.

    Boxes are amply sized and your items are well-protected.

    ', 'delivery'), +(1, 2, 'Livraison', 'Nos conditions générales de livraison', 'conditions, livraison, délais, transport, colis', '

    Livraisons et retours

    Le transport de votre colis

    Les colis sont généralement expédiés en 48h après réception de votre paiement. Le mode d''expédition standard est le Colissimo suivi, remis sans signature. Si vous souhaitez une remise avec signature, un coût supplémentaire s''applique, merci de nous contacter. Quel que soit le mode d''expédition choisi, nous vous fournirons dès que possible un lien qui vous permettra de suivre en ligne la livraison de votre colis.

    Les frais d''expédition comprennent l''emballage, la manutention et les frais postaux. Ils peuvent contenir une partie fixe et une partie variable en fonction du prix ou du poids de votre commande. Nous vous conseillons de regrouper vos achats en une unique commande. Nous ne pouvons pas grouper deux commandes distinctes et vous devrez vous acquitter des frais de port pour chacune d''entre elles. Votre colis est expédié à vos propres risques, un soin particulier est apporté au colis contenant des produits fragiles..

    Les colis sont surdimensionnés et protégés.

    ', 'livraison'), +(2, 1, 'Legal Notice', 'Legal notice', 'notice, legal, credits', '

    Legal

    Credits

    Concept and production:

    This Web site was created using PrestaShop™ open-source software.

    ', 'legal-notice'), +(2, 2, 'Mentions légales', 'Mentions légales', 'mentions, légales, crédits', '

    Mentions légales

    Crédits

    Concept et production :

    Ce site internet a été réalisé en utilisant la solution open-source PrestaShop™ .

    ', 'mentions-legales'), +(3, 1, 'Terms and conditions of use', 'Our terms and conditions of use', 'conditions, terms, use, sell', '

    Your terms and conditions of use

    Rule 1

    Here is the rule 1 content

    \r\n

    Rule 2

    Here is the rule 2 content

    \r\n

    Rule 3

    Here is the rule 3 content

    ', 'terms-and-conditions-of-use'), +(3, 2, 'Conditions d''utilisation', 'Nos conditions générales de ventes', 'conditions, utilisation, générales, ventes', '

    Vos conditions de ventes

    Règle n°1

    Contenu de la règle numéro 1

    \r\n

    Règle n°2

    Contenu de la règle numéro 2

    \r\n

    Règle n°3

    Contenu de la règle numéro 3

    ', 'conditions-generales-de-ventes'), +(4, 1, 'About us', 'Learn more about us', 'about us, informations', '

    About us

    \r\n

    Our company

    Our company

    \r\n

    Our team

    Our team

    \r\n

    Informations

    Informations

    ', 'about-us'), +(4, 2, 'A propos', 'Apprenez-en d''avantage sur nous', 'à propos, informations', '

    A propos

    \r\n

    Notre entreprise

    Notre entreprise

    \r\n

    Notre équipe

    Notre équipe

    \r\n

    Informations

    Informations

    ', 'a-propos'), +(5, 1, 'Secure payment', 'Our secure payment mean', 'secure payment, ssl, visa, mastercard, paypal', '

    Secure payment

    \r\n

    Our secure payment

    With SSL

    \r\n

    Using Visa/Mastercard/Paypal

    About this services

    ', 'secure-payment'), +(5, 2, 'Paiement sécurisé', 'Notre offre de paiement sécurisé', 'paiement sécurisé, ssl, visa, mastercard, paypal', '

    Paiement sécurisé

    \r\n

    Notre offre de paiement sécurisé

    Avec SSL

    \r\n

    Utilisation de Visa/Mastercard/Paypal

    A propos de ces services

    ', 'paiement-securise'), +(1, 3, 'Entrega', 'Nuestras condiciones de entrega', 'condiciones, plazos de entrega, transporte, paquetería', '

    shipping & Returns

    \r\n

    El transporte de su paquete

    \r\n

    Los paquetes son generalmente enviados en 48 horas después de la recepción de su pago. La moda es el estándar expédition Colissimo seguido, entrega sin firma. Si desea una entrega con la firma, un cargo adicional, gracias al contacto con nosotros. Sea cual sea el método de envío seleccionado, vamos a presentar lo antes posible, un vínculo que le permite rastrear el envío en línea de su paquete.

    Gastos de envío incluyen el embalaje, la manipulación y envío. Pueden contener un fijo y una parte variable basado en el precio o el peso de su solicitud. Le recomendamos que para consolidar sus compras en un solo comando. No podemos grupo de dos órdenes distintos y hay que pagar gastos de envío para cada uno. Su paquete es enviado a su propio riesgo, se presta especial atención a las parcelas que contienen objetos frágiles ..

    Los paquetes son de gran tamaño y protegidas.

    ', 'entrega'), +(2, 3, 'Aviso legal', 'Aviso legal', 'términos, condiciones y créditos fotográficos', '

    Pie de imprenta

    \r\n

    Créditos

    \r\n

    \r\n


    Concepto y producción:

    Este sitio web fue creado utilizando la solución de código abierto PrestaShop™.

    ', 'aviso-legal'), +(3, 3, 'Condiciones de uso', 'Condiciones de uso', 'condiciones, el consumo, las ventas generales', '

    Sus condiciones de venta

    \r\n

    Regla N º 1

    \r\n

    Contenido de la Regla Número 1

    \r\n

    Regla N º 2

    \r\n

    Contenido de la Regla N º 2

    \r\n

    Regla N º 3

    \r\n

    Contenido de la Regla Número 3

    ', 'condiciones-de-uso'), +(4, 3, 'Sobre', 'Conozca más sobre nosotros', 'sobre, información', '

    Sobre

    ', 'sobre'), +(5, 3, 'Pago seguro', 'Ofrecemos pago seguro', 'pago seguro, ssl, visa, mastercard, paypal', '

    Pago seguro

    \r\n

    Ofrecemos pago seguro

    \r\n

    SSL

    \r\n

    Utilice Visa / Mastercard / Paypal

    \r\n

    Acerca de estos servicios

    ', 'pago-seguro'), +(1, 4, 'Lieferung', 'Unsere Lieferbedingungen', 'Bedingungen, Lieferung, Frist, Versand, Verpackung', '

    Versand und Rücknahme

    Ihre Versandverpackung

    Pakete werden normalerweise 2 Tage nach Zahlungseingang mit UPS mit Bestellverfolgemöglichkeit und Ablieferung ohne Unterschrift geliefert. Wenn Sie lieber eine UPS-Sendung per Einschreiben erhalten möchten, entstehen zusätzliche Kosten. Bitte kontaktieren Sie uns, bevor Sie dieses Liefermethode wählen. Wir senden Ihnen einen Link für die Bestellverfolgung unabhängig davon, welche Liefermethode Sie wählen.

    Die Versandkosten beinhalten Lade- und Verpackungsgebühren sowie die Portokosten. Die Verladegebühren stehen fest, wobei Transportkosten schwanken, je nach Gesamtgewicht des Pakets. Wir raten Ihnen, mehrere Artikel in einer Bestellung zusammenzufassen. Wir können zwei verschiedene Bestellungen nicht zusammenlegen, und die Versandkosten werden separat für jede Bestellung gerechnet. Ihr Paket wird auf Ihr Risiko versandt, aber zerbrechliche Ware wird besonders sorgsam behandelt.

    Die Versandschachteln sind weit geschnitten und ihre Ware wird gut geschützt verpackt.

    ', 'Lieferung'), +(2, 4, 'Rechtliche Hinweise', 'Rechtliche Hinweise', 'Hinweise, rechtlich, Gutscheine', '

    Legal

    Credits

    Konzept und Gestaltung:

    Diese Webseite wurde hergestellt unter Verwendung von PrestaShop™ open-source software.

    ', 'rechtliche-hinweise'), +(3, 4, 'Allgemeine Nutzungsbedingungen', 'Unsere allgemeinen Nutzungsbedingungen', 'Voraussetzungen, Bedingungen, nutzen, verkaufen', '

    Your terms and conditions of use

    Rule 1

    Here is the rule 1 content

    \r\n

    Rule 2

    Here is the rule 2 content

    \r\n

    Rule 3

    Here is the rule 3 content

    ', 'allgemeine-nutzungsbedingungen'), +(4, 4, 'Über uns', 'Learn more about us', 'über uns, Informationen', '

    About us

    \r\n

    Our company

    Our company

    \r\n

    Our team

    Our team

    \r\n

    Informations

    Informations

    ', 'uber-uns'), +(5, 4, 'Sichere Zahlung', 'Unsere Sicherheits-Zahlungsmethoden', 'Sichere Zahlung, SSL, Visa, MasterCard, PayPal', '

    Secure payment

    \r\n

    Our secure payment

    With SSL

    \r\n

    Using Visa/Mastercard/Paypal

    About this services

    ', 'sichere-zahlung'), +(1, 5, 'Consegna', 'I nostri termini e condizioni di consegna', 'condizioni, consegna, tempo, spedizione, pacco', '

    Spedizioni e resi

    Spedizione del tuo pacco

    I pacchi sono solitamente spediti entro 2 giorni dopo il ricevimento del pagamento e inviati tramite UPS con controllo e consegna senza firma. Se preferisci una consegna con UPS Extra con richiesta di firma, sarà applicato un costo aggiuntivo, pertanto contattaci prima di scegliere questo mezzo. Qualunque tipo di spedizione tu scelga, ti garantiremo un link per controllare online il percorso del tuo pacco.

    Le spese di spedizione comprendono le spese di imballaggio e affrancatura. Le spese di imballaggio sono fisse, mentre quelle di trasporto variano in base al peso totale della spedizione. Ti consigliamo di raggruppare i tuoi articoli in un unico ordine. Non possiamo raggruppare due ordini distinti eseguiti separatamente, e ad ognuno di esso saranno applicate le spese di spedizione. Il tuo pacco sarà inviato sotto la tua responsabilità, ma un\'attenzione particolare è riservata agli oggetti fragili.

    Le scatole hanno dimensioni ragionevoli e i tuoi articoli sono ben protetti.

    ', 'consegna'), +(2, 5, 'Nota Legale', 'Nota legale', 'nota, legale, crediti', '

    Legale

    Crediti

    Creazione e produzione:

    Questo sito web è stato realizzato usando un software open-sourcePrestaShop™.

    ', 'nota-legale'), +(3, 5, 'Termini e condizioni d\'uso', 'I nostri termini e condizioni d\'uso', 'condizioni, termini, uso, vendi', '

    I tuoi termini e condizioni d\'uso

    Regola 1

    Ecco il contenuto della regola 1

    \r\n

    Regola 2

    Ecco il contenuto della regola 2

    \r\n

    Regola 3

    Ecco il contenuto della regola 3

    ', 'termini-e-condizioni-di-uso'), +(4, 5, 'Chi siamo', 'Per sapere chi siamo', 'chi siamo, informazioni', '

    Chi siamo

    \r\n

    La nostra azienda

    La nostra azienda

    \r\n

    Il nostro team

    Il nostro team

    \r\n

    Informazioni

    Informazioni

    ', 'chi-siamo'), +(5, 5, 'Pagamento sicuro', 'Il nostro mezzo di pagamento sicuro', 'pagamento sicuro, ssl, visa, mastercard, paypal', '

    Pagamento sicuro

    \r\n

    Il nostro pagamento sicuro

    Con SSL

    \r\n

    Usando Visa/Mastercard/Paypal

    Cosa sono questi servizi

    ', 'pagamento-sicuro'); + +INSERT INTO `PREFIX_cms_category_lang` (`id_cms_category`, `id_lang`, `name`, `description`, `link_rewrite`, `meta_title`, `meta_keywords`, `meta_description`) VALUES +(1, 1, 'Home', '', 'home', NULL, NULL, NULL), +(1, 2, 'Accueil', '', 'home', NULL, NULL, NULL), +(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL), +(1, 4, 'Start', '', 'Start', NULL, NULL, NULL), +(1, 5, 'Home', '', 'home', NULL, NULL, NULL); + +INSERT INTO `PREFIX_cms_category` (`id_cms_category`, `id_parent`, `level_depth`, `active`, `date_add`, `date_upd`) VALUES(1, 0, 0, 1, NOW(), NOW()); + +/* Carrier */ +INSERT INTO `PREFIX_carrier` (`id_carrier`, `id_tax_rules_group`, `name`, `active`, `deleted`, `shipping_handling`) VALUES (1, 0, 0, 1, 0, 0); + +INSERT INTO `PREFIX_carrier_group` (`id_carrier`, `id_group`) VALUES (1, 1); + +INSERT INTO `PREFIX_carrier_lang` (`id_carrier`, `id_lang`, `delay`) VALUES (1, 1, 'Pick up in-store'),(1, 2, 'Retrait au magasin'),(1, 3, 'Recogida en la tienda'),(1, 4, 'Abholung im Geschäft'),(1, 5, 'Ritiro in magazzino'); + +INSERT INTO `PREFIX_carrier_zone` (`id_carrier`, `id_zone`) VALUES (1, 1); + +INSERT INTO `PREFIX_carrier_shop` (`id_carrier`, `id_shop`) VALUES (1,1); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CARRIER_DEFAULT', '1', NOW(), NOW()); + +/* Timezone */ +INSERT INTO `PREFIX_timezone` (`name`) VALUES ('Africa/Abidjan'),('Africa/Accra'),('Africa/Addis_Ababa'),('Africa/Algiers'), +('Africa/Asmara'),('Africa/Asmera'),('Africa/Bamako'),('Africa/Bangui'),('Africa/Banjul'),('Africa/Bissau'),('Africa/Blantyre'), +('Africa/Brazzaville'),('Africa/Bujumbura'),('Africa/Cairo'),('Africa/Casablanca'),('Africa/Ceuta'),('Africa/Conakry'),('Africa/Dakar'), +('Africa/Dar_es_Salaam'),('Africa/Djibouti'),('Africa/Douala'),('Africa/El_Aaiun'),('Africa/Freetown'),('Africa/Gaborone'),('Africa/Harare'), +('Africa/Johannesburg'),('Africa/Kampala'),('Africa/Khartoum'),('Africa/Kigali'),('Africa/Kinshasa'),('Africa/Lagos'),('Africa/Libreville'), +('Africa/Lome'),('Africa/Luanda'),('Africa/Lubumbashi'),('Africa/Lusaka'),('Africa/Malabo'),('Africa/Maputo'),('Africa/Maseru'), +('Africa/Mbabane'),('Africa/Mogadishu'),('Africa/Monrovia'),('Africa/Nairobi'),('Africa/Ndjamena'),('Africa/Niamey'),('Africa/Nouakchott'), +('Africa/Ouagadougou'),('Africa/Porto-Novo'),('Africa/Sao_Tome'),('Africa/Timbuktu'),('Africa/Tripoli'),('Africa/Tunis'),('Africa/Windhoek'), +('America/Adak'),('America/Anchorage '),('America/Anguilla'),('America/Antigua'),('America/Araguaina'),('America/Argentina/Buenos_Aires'), +('America/Argentina/Catamarca'),('America/Argentina/ComodRivadavia'),('America/Argentina/Cordoba'),('America/Argentina/Jujuy'), +('America/Argentina/La_Rioja'),('America/Argentina/Mendoza'),('America/Argentina/Rio_Gallegos'),('America/Argentina/Salta'), +('America/Argentina/San_Juan'),('America/Argentina/San_Luis'),('America/Argentina/Tucuman'),('America/Argentina/Ushuaia'),('America/Aruba'), +('America/Asuncion'),('America/Atikokan'),('America/Atka'),('America/Bahia'),('America/Barbados'),('America/Belem'),('America/Belize'), +('America/Blanc-Sablon'),('America/Boa_Vista'),('America/Bogota'),('America/Boise'),('America/Buenos_Aires'),('America/Cambridge_Bay'), +('America/Campo_Grande'),('America/Cancun'),('America/Caracas'),('America/Catamarca'),('America/Cayenne'),('America/Cayman'),('America/Chicago'), +('America/Chihuahua'),('America/Coral_Harbour'),('America/Cordoba'),('America/Costa_Rica'),('America/Cuiaba'),('America/Curacao'), +('America/Danmarkshavn'),('America/Dawson'),('America/Dawson_Creek'),('America/Denver'),('America/Detroit'),('America/Dominica'), +('America/Edmonton'),('America/Eirunepe'),('America/El_Salvador'),('America/Ensenada'),('America/Fort_Wayne'),('America/Fortaleza'), +('America/Glace_Bay'),('America/Godthab'),('America/Goose_Bay'),('America/Grand_Turk'),('America/Grenada'),('America/Guadeloupe'), +('America/Guatemala'),('America/Guayaquil'),('America/Guyana'),('America/Halifax'),('America/Havana'),('America/Hermosillo'), +('America/Indiana/Indianapolis'),('America/Indiana/Knox'),('America/Indiana/Marengo'),('America/Indiana/Petersburg'), +('America/Indiana/Tell_City'),('America/Indiana/Vevay'),('America/Indiana/Vincennes'),('America/Indiana/Winamac'),('America/Indianapolis'), +('America/Inuvik'),('America/Iqaluit'),('America/Jamaica'),('America/Jujuy'),('America/Juneau'),('America/Kentucky/Louisville'), +('America/Kentucky/Monticello'),('America/Knox_IN'),('America/La_Paz'),('America/Lima'),('America/Los_Angeles'),('America/Louisville'), +('America/Maceio'),('America/Managua'),('America/Manaus'),('America/Marigot'),('America/Martinique'),('America/Mazatlan'),('America/Mendoza'), +('America/Menominee'),('America/Merida'),('America/Mexico_City'),('America/Miquelon'),('America/Moncton'),('America/Monterrey'), +('America/Montevideo'),('America/Montreal'),('America/Montserrat'),('America/Nassau'),('America/New_York'),('America/Nipigon'), +('America/Nome'),('America/Noronha'),('America/North_Dakota/Center'),('America/North_Dakota/New_Salem'),('America/Panama'), +('America/Pangnirtung'),('America/Paramaribo'),('America/Phoenix'),('America/Port-au-Prince'),('America/Port_of_Spain'),('America/Porto_Acre'), +('America/Porto_Velho'),('America/Puerto_Rico'),('America/Rainy_River'),('America/Rankin_Inlet'),('America/Recife'),('America/Regina'), +('America/Resolute'),('America/Rio_Branco'),('America/Rosario'),('America/Santarem'),('America/Santiago'),('America/Santo_Domingo'), +('America/Sao_Paulo'),('America/Scoresbysund'),('America/Shiprock'),('America/St_Barthelemy'),('America/St_Johns'),('America/St_Kitts'), +('America/St_Lucia'),('America/St_Thomas'),('America/St_Vincent'),('America/Swift_Current'),('America/Tegucigalpa'),('America/Thule'), +('America/Thunder_Bay'),('America/Tijuana'),('America/Toronto'),('America/Tortola'),('America/Vancouver'),('America/Virgin'),('America/Whitehorse'), +('America/Winnipeg'),('America/Yakutat'),('America/Yellowknife'),('Antarctica/Casey'),('Antarctica/Davis'),('Antarctica/DumontDUrville'), +('Antarctica/Mawson'),('Antarctica/McMurdo'),('Antarctica/Palmer'),('Antarctica/Rothera'),('Antarctica/South_Pole'),('Antarctica/Syowa'), +('Antarctica/Vostok'),('Arctic/Longyearbyen'),('Asia/Aden'),('Asia/Almaty'),('Asia/Amman'),('Asia/Anadyr'),('Asia/Aqtau'),('Asia/Aqtobe'), +('Asia/Ashgabat'),('Asia/Ashkhabad'),('Asia/Baghdad'),('Asia/Bahrain'),('Asia/Baku'),('Asia/Bangkok'),('Asia/Beirut'),('Asia/Bishkek'), +('Asia/Brunei'),('Asia/Calcutta'),('Asia/Choibalsan'),('Asia/Chongqing'),('Asia/Chungking'),('Asia/Colombo'),('Asia/Dacca'),('Asia/Damascus'), +('Asia/Dhaka'),('Asia/Dili'),('Asia/Dubai'),('Asia/Dushanbe'),('Asia/Gaza'),('Asia/Harbin'),('Asia/Ho_Chi_Minh'),('Asia/Hong_Kong'),('Asia/Hovd'), +('Asia/Irkutsk'),('Asia/Istanbul'),('Asia/Jakarta'),('Asia/Jayapura'),('Asia/Jerusalem'),('Asia/Kabul'),('Asia/Kamchatka'),('Asia/Karachi'), +('Asia/Kashgar'),('Asia/Kathmandu'),('Asia/Katmandu'),('Asia/Kolkata'),('Asia/Krasnoyarsk'),('Asia/Kuala_Lumpur'),('Asia/Kuching'),('Asia/Kuwait'), +('Asia/Macao'),('Asia/Macau'),('Asia/Magadan'),('Asia/Makassar'),('Asia/Manila'),('Asia/Muscat'),('Asia/Nicosia'),('Asia/Novosibirsk'),('Asia/Omsk'), +('Asia/Oral'),('Asia/Phnom_Penh'),('Asia/Pontianak'),('Asia/Pyongyang'),('Asia/Qatar'),('Asia/Qyzylorda'),('Asia/Rangoon'),('Asia/Riyadh'), +('Asia/Saigon'),('Asia/Sakhalin'),('Asia/Samarkand'),('Asia/Seoul'),('Asia/Shanghai'),('Asia/Singapore'),('Asia/Taipei'),('Asia/Tashkent'), +('Asia/Tbilisi'),('Asia/Tehran'),('Asia/Tel_Aviv'),('Asia/Thimbu'),('Asia/Thimphu'),('Asia/Tokyo'),('Asia/Ujung_Pandang'),('Asia/Ulaanbaatar'), +('Asia/Ulan_Bator'),('Asia/Urumqi'),('Asia/Vientiane'),('Asia/Vladivostok'),('Asia/Yakutsk'),('Asia/Yekaterinburg'),('Asia/Yerevan'), +('Atlantic/Azores'),('Atlantic/Bermuda'),('Atlantic/Canary'),('Atlantic/Cape_Verde'),('Atlantic/Faeroe'),('Atlantic/Faroe'),('Atlantic/Jan_Mayen'), +('Atlantic/Madeira'),('Atlantic/Reykjavik'),('Atlantic/South_Georgia'),('Atlantic/St_Helena'),('Atlantic/Stanley'),('Australia/ACT'), +('Australia/Adelaide'),('Australia/Brisbane'),('Australia/Broken_Hill'),('Australia/Canberra'),('Australia/Currie'),('Australia/Darwin'), +('Australia/Eucla'),('Australia/Hobart'),('Australia/LHI'),('Australia/Lindeman'),('Australia/Lord_Howe'),('Australia/Melbourne'),('Australia/North'), +('Australia/NSW'),('Australia/Perth'),('Australia/Queensland'),('Australia/South'),('Australia/Sydney'),('Australia/Tasmania'),('Australia/Victoria'), +('Australia/West'),('Australia/Yancowinna'),('Europe/Amsterdam'),('Europe/Andorra'),('Europe/Athens'),('Europe/Belfast'),('Europe/Belgrade'), +('Europe/Berlin'),('Europe/Bratislava'),('Europe/Brussels'),('Europe/Bucharest'),('Europe/Budapest'),('Europe/Chisinau'),('Europe/Copenhagen'), +('Europe/Dublin'),('Europe/Gibraltar'),('Europe/Guernsey'),('Europe/Helsinki'),('Europe/Isle_of_Man'),('Europe/Istanbul'),('Europe/Jersey'), +('Europe/Kaliningrad'),('Europe/Kiev'),('Europe/Lisbon'),('Europe/Ljubljana'),('Europe/London'),('Europe/Luxembourg'),('Europe/Madrid'),('Europe/Malta'), +('Europe/Mariehamn'),('Europe/Minsk'),('Europe/Monaco'),('Europe/Moscow'),('Europe/Nicosia'),('Europe/Oslo'),('Europe/Paris'),('Europe/Podgorica'), +('Europe/Prague'),('Europe/Riga'),('Europe/Rome'),('Europe/Samara'),('Europe/San_Marino'),('Europe/Sarajevo'),('Europe/Simferopol'),('Europe/Skopje'), +('Europe/Sofia'),('Europe/Stockholm'),('Europe/Tallinn'),('Europe/Tirane'),('Europe/Tiraspol'),('Europe/Uzhgorod'),('Europe/Vaduz'),('Europe/Vatican'), +('Europe/Vienna'),('Europe/Vilnius'),('Europe/Volgograd'),('Europe/Warsaw'),('Europe/Zagreb'),('Europe/Zaporozhye'),('Europe/Zurich'), +('Indian/Antananarivo'),('Indian/Chagos'),('Indian/Christmas'),('Indian/Cocos'),('Indian/Comoro'),('Indian/Kerguelen'),('Indian/Mahe'),('Indian/Maldives'), +('Indian/Mauritius'),('Indian/Mayotte'),('Indian/Reunion'),('Pacific/Apia'),('Pacific/Auckland'),('Pacific/Chatham'),('Pacific/Easter'),('Pacific/Efate'), +('Pacific/Enderbury'),('Pacific/Fakaofo'),('Pacific/Fiji'),('Pacific/Funafuti'),('Pacific/Galapagos'),('Pacific/Gambier'),('Pacific/Guadalcanal'), +('Pacific/Guam'),('Pacific/Honolulu'),('Pacific/Johnston'),('Pacific/Kiritimati'),('Pacific/Kosrae'),('Pacific/Kwajalein'),('Pacific/Majuro'), +('Pacific/Marquesas'),('Pacific/Midway'),('Pacific/Nauru'),('Pacific/Niue'),('Pacific/Norfolk'),('Pacific/Noumea'),('Pacific/Pago_Pago'),('Pacific/Palau'), +('Pacific/Pitcairn'),('Pacific/Ponape'),('Pacific/Port_Moresby'),('Pacific/Rarotonga'),('Pacific/Saipan'),('Pacific/Samoa'),('Pacific/Tahiti'), +('Pacific/Tarawa'),('Pacific/Tongatapu'),('Pacific/Truk'),('Pacific/Wake'),('Pacific/Wallis'),('Pacific/Yap'),('Brazil/Acre'),('Brazil/DeNoronha'), +('Brazil/East'),('Brazil/West'),('Canada/Atlantic'),('Canada/Central'),('Canada/East-Saskatchewan'),('Canada/Eastern'),('Canada/Mountain'), +('Canada/Newfoundland'),('Canada/Pacific'),('Canada/Saskatchewan'),('Canada/Yukon'),('CET'),('Chile/Continental'),('Chile/EasterIsland'),('CST6CDT'), +('Cuba'),('EET'),('Egypt'),('Eire'),('EST'),('EST5EDT'),('Etc/GMT'),('Etc/GMT+0'),('Etc/GMT+1'),('Etc/GMT+10'),('Etc/GMT+11'),('Etc/GMT+12'), +('Etc/GMT+2'),('Etc/GMT+3'),('Etc/GMT+4'),('Etc/GMT+5'),('Etc/GMT+6'),('Etc/GMT+7'),('Etc/GMT+8'),('Etc/GMT+9'),('Etc/GMT-0'),('Etc/GMT-1'), +('Etc/GMT-10'),('Etc/GMT-11'),('Etc/GMT-12'),('Etc/GMT-13'),('Etc/GMT-14'),('Etc/GMT-2'),('Etc/GMT-3'),('Etc/GMT-4'),('Etc/GMT-5'),('Etc/GMT-6'), +('Etc/GMT-7'),('Etc/GMT-8'),('Etc/GMT-9'),('Etc/GMT0'),('Etc/Greenwich'),('Etc/UCT'),('Etc/Universal'),('Etc/UTC'),('Etc/Zulu'),('Factory'),('GB'), +('GB-Eire'),('GMT'),('GMT+0'),('GMT-0'),('GMT0'),('Greenwich'),('Hongkong'),('HST'),('Iceland'),('Iran'),('Israel'),('Jamaica'),('Japan'),('Kwajalein'), +('Libya'),('MET'),('Mexico/BajaNorte'),('Mexico/BajaSur'),('Mexico/General'),('MST'),('MST7MDT'),('Navajo'),('NZ'),('NZ-CHAT'),('Poland'),('Portugal'), +('PRC'),('PST8PDT'),('ROC'),('ROK'),('Singapore'),('Turkey'),('UCT'),('Universal'),('US/Alaska'),('US/Aleutian'),('US/Arizona'),('US/Central'), +('US/East-Indiana'),('US/Eastern'),('US/Hawaii'),('US/Indiana-Starke'),('US/Michigan'),('US/Mountain'),('US/Pacific'),('US/Pacific-New'),('US/Samoa'), +('UTC'),('W-SU'),('WET'),('Zulu'); + +INSERT INTO `PREFIX_group` (`id_group`, `reduction`, `date_add`, `date_upd`) VALUES (1, 0, NOW(), NOW()); + +INSERT INTO `PREFIX_group_lang` (`id_group`, `id_lang`, `name`) VALUES (1, 1, 'Default'),(1, 2, 'Défaut'),(1, 3, 'Predeterminado'),(1, 4, 'Default'),(1, 5, 'Default'); +INSERT INTO `PREFIX_group_group_shop` (`id_group`, `id_group_shop`) (SELECT `id_group`, 1 FROM `PREFIX_group`); + +INSERT INTO `PREFIX_category_group` (`id_category`, `id_group`) VALUES (1, 1); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_TAX_ADDRESS_TYPE', 'id_address_delivery', NOW(), NOW()); + +INSERT INTO `PREFIX_stock_mvt_reason` (`id_stock_mvt_reason`, `sign`, `date_add`, `date_upd`) VALUES +(1, 1, NOW(), NOW()), (2, -1, NOW(), NOW()), (3, -1, NOW(), NOW()), (4, -1, NOW(), NOW()), (5, 1, NOW(), NOW()); +INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `name`) VALUES +(1, 1, 'Increase'), +(1, 2, 'Augmenter'), +(1, 3, 'Aumentar'), +(1, 4, 'Erhöhen'), +(1, 5, 'Increase'), +(2, 1, 'Decrease'), +(2, 2, 'Diminuer'), +(2, 3, 'Disminuir'), +(2, 4, 'Reduzieren'), +(2, 5, 'Decrease'), +(3, 1, 'Order'), +(3, 2, 'Commande'), +(3, 3, 'Pedido'), +(3, 4, 'Bestellung'), +(3, 5, 'Ordine'), +(4, 1, 'Missing Stock Movement'), +(4, 2, 'Mouvement de stock manquant'), +(4, 3, 'Movimiento de stock que falta'), +(4, 4, 'Lagerbewegung nicht stattgefunden'), +(4, 5, 'Movimento di merce mancante'), +(5, 1, 'Restocking'), +(5, 2, 'Réassort'), +(5, 3, 'Reaprovisionar'), +(5, 4, 'Auffüllung'), +(5, 5, 'Riassortimento'); + +INSERT INTO `PREFIX_address_format` (`id_country`, `format`) +(SELECT `id_country` as id_country, 'firstname lastname\ncompany\nvat_number\naddress1\naddress2\npostcode city\nCountry:name\nphone' as format FROM `PREFIX_country`); + +UPDATE `PREFIX_address_format` set `format`='company +firstname lastname +address1 address2 +city State:name postcode +Country:name +phone' where `id_country`=21; + +INSERT INTO `PREFIX_group_shop` (`id_group_shop`, `name`, `active`, `deleted`) VALUES (1, 'Default', 1, 0); +INSERT INTO `PREFIX_shop` (`id_shop`, `id_group_shop`, `name`, `id_category`, `id_theme`, `active`, `deleted`) VALUES (1, 1, 'Default', 1, 1, 1, 0); +INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES (NULL, 'PS_SHOP_DEFAULT', '1', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES (NULL, 'PS_GROUP_SHOP_DEFAULT', '1', NOW(), NOW()); + +INSERT INTO `PREFIX_theme` (`id_theme`, `name`) VALUES (1, 'prestashop'); diff --git a/install-dev/sql/upgrade/0.9.1.2.sql b/install-dev/sql/upgrade/0.9.1.2.sql new file mode 100644 index 000000000..4ff1333c6 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.1.2.sql @@ -0,0 +1,30 @@ +/* STRUCTURE */ +CREATE TABLE `PREFIX_product_sale` ( +`id_product` INT( 10 ) UNSIGNED NOT NULL , +`quantity` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0', +`nb_vente` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0', +`date_upd` DATE NOT NULL , +PRIMARY KEY ( `id_product` ) +) ENGINE = MYISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_image_type` + ADD `manufacturers` BOOL NOT NULL DEFAULT '1' AFTER `categories`; + +ALTER TABLE `PREFIX_address` + ADD `id_manufacturer` INT( 10 ) UNSIGNED NOT NULL AFTER `id_customer` ; + +ALTER TABLE `PREFIX_address` + ADD `id_supplier` INT( 10 ) UNSIGNED NOT NULL AFTER `id_manufacturer` ; + +ALTER TABLE `PREFIX_order_discount` + ADD `id_discount` INT( 10 ) UNSIGNED NOT NULL AFTER `id_order` ; + +ALTER TABLE `PREFIX_discount` + ADD `quantity_per_user` INT( 10 ) UNSIGNED NOT NULL DEFAULT '1' AFTER `quantity` ; + +ALTER TABLE `PREFIX_contact` CHANGE `position` `position` TINYINT( 2 ) UNSIGNED NOT NULL DEFAULT '0'; + +/* CONTENTS */ + +/* CONFIGURATION VARIABLE */ + diff --git a/install-dev/sql/upgrade/0.9.1.sql b/install-dev/sql/upgrade/0.9.1.sql new file mode 100644 index 000000000..5b0fabb09 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.1.sql @@ -0,0 +1,9 @@ +/* STRUCTURE */ +ALTER TABLE `PREFIX_product` CHANGE `price` `price` DECIMAL(13,6) NOT NULL DEFAULT '0.000000'; + +/* CONTENTS */ +DELETE FROM `PREFIX_carrier_lang` WHERE `id_carrier` = (SELECT c.`id_carrier` FROM `PREFIX_carrier` c WHERE c.`name` = 'My download manager' LIMIT 1); +DELETE FROM `PREFIX_carrier` WHERE `name` = 'My download manager'; + +/* Conf vars */ +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_TAX_NO', '0', NOW(), NOW()); \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.5.1.sql b/install-dev/sql/upgrade/0.9.5.1.sql new file mode 100644 index 000000000..31bc41c99 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.5.1.sql @@ -0,0 +1,66 @@ +/* STRUCTURE */ +ALTER TABLE `PREFIX_order_state` + ADD `logable` TINYINT(1) NOT NULL DEFAULT 0; +ALTER TABLE `PREFIX_product_sale` + CHANGE `nb_vente` `sale_nbr` INT(10) UNSIGNED NOT NULL DEFAULT 0; +ALTER TABLE `PREFIX_carrier` + CHANGE `tax` `id_tax` INT(10) UNSIGNED NULL DEFAULT 0 AFTER `id_carrier`; +ALTER TABLE `PREFIX_carrier` + ADD `shipping_handling` TINYINT(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `deleted`; +ALTER TABLE `PREFIX_address` + CHANGE `id_country` `id_country` INT(10) UNSIGNED NOT NULL DEFAULT 0, + CHANGE `id_customer` `id_customer` INT(10) UNSIGNED NOT NULL DEFAULT 0, + CHANGE `id_manufacturer` `id_manufacturer` INT(10) UNSIGNED NOT NULL DEFAULT 0; +RENAME TABLE `PREFIX_product_attribute_combinaison` TO `PREFIX_product_attribute_combination`; +ALTER TABLE `PREFIX_product_attribute_combination` + DROP INDEX `product_attribute_combinaison_index`, + ADD PRIMARY KEY (`id_attribute`, `id_product_attribute`); + +CREATE TABLE `PREFIX_carrier_zone` ( + id_carrier int(10) unsigned NOT NULL, + id_zone int(10) unsigned NOT NULL, + INDEX carrier_zone_index(id_carrier, id_zone) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tax_zone` ( + id_tax int(10) unsigned NOT NULL, + id_zone int(10) unsigned NOT NULL, + INDEX tax_zone_index(id_tax, id_zone) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +/* CONTENTS */ + +/* Rename old tab */ +UPDATE `PREFIX_tab_lang` SET `name` = 'Produits' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminPPreferences') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +UPDATE `PREFIX_tab_lang` SET `name` = 'Emails' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminEmails') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +UPDATE `PREFIX_tab_lang` SET `name` = 'Images' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminImages') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); + +/* New BankWire state */ +UPDATE `PREFIX_order_state` SET `logable` = 1 WHERE `id_order_state` < 6 AND `id_order_state` > 1; +INSERT INTO `PREFIX_order_state` (`id_order_state`, `invoice`, `send_email`, `color`, `unremovable`, `logable`) VALUES (10, 0, 1, 'lightblue', 1, 0); +INSERT INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) VALUES +(10, 1, 'Awaiting bank wire payment', 'bankwire'), +(10, 2, 'En attente du paiement par virement bancaire', 'bankwire'); + +/* New hook */ +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('updateOrderStatus', 'Order''s status update event', 'Launch modules when the order''s status of an order change.', 0); + +/* Adding zones for tax/carrier */ +INSERT INTO `PREFIX_tax_zone` (id_tax, id_zone) (SELECT id_tax, id_zone FROM `PREFIX_tax` CROSS JOIN `PREFIX_zone`); +INSERT INTO `PREFIX_carrier_zone` (id_carrier, id_zone) (SELECT id_carrier, id_zone FROM `PREFIX_carrier` CROSS JOIN `PREFIX_zone`); + +/* CONFIGURATION VARIABLE */ + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PREFIX_PURCHASE_MINIMUM', '0', NOW(), NOW()), +('PREFIX_SHOP_ENABLE', '1', NOW(), NOW()); + +/* Adding tab Contact */ +/* PHP:add_new_tab(AdminContact, fr:Coordonnées|es:Datos|en:Contact Information|de:Kontaktinformation|it:Informazioni di contatto, 8); */; \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.5.2.sql b/install-dev/sql/upgrade/0.9.5.2.sql new file mode 100644 index 000000000..57f9b765c --- /dev/null +++ b/install-dev/sql/upgrade/0.9.5.2.sql @@ -0,0 +1,5 @@ +/* STRUCTURE */ + +/* CONTENTS */ + +/* CONFIGURATION VARIABLE */ \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.6.1.sql b/install-dev/sql/upgrade/0.9.6.1.sql new file mode 100644 index 000000000..fa371d9b9 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.6.1.sql @@ -0,0 +1,51 @@ +/* STRUCTURE */ + +CREATE TABLE `PREFIX_alias` ( + alias varchar(255) NOT NULL, + search varchar(255) NOT NULL, + active tinyint(1) NOT NULL default 1, + id_alias int(10) NOT NULL auto_increment, + PRIMARY KEY (id_alias), + UNIQUE KEY alias (alias) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_configuration` + ADD UNIQUE `name` (`name`); +ALTER TABLE `PREFIX_product` + ADD `wholesale_price` DECIMAL( 13, 6 ) NOT NULL AFTER `price`; +ALTER TABLE `PREFIX_range_weight` + CHANGE `delimiter1` `delimiter1` DECIMAL( 13, 6 ) NOT NULL DEFAULT '0.000000'; +ALTER TABLE `PREFIX_range_weight` + CHANGE `delimiter2` `delimiter2` DECIMAL( 13, 6 ) NOT NULL DEFAULT '0.000000'; + ALTER TABLE `PREFIX_discount_type_lang` + CHANGE `name` `name` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; + ALTER TABLE `PREFIX_product` + CHANGE `bargain` `on_sale` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0; +ALTER TABLE `PREFIX_image_type` + ADD `suppliers` BOOL NOT NULL DEFAULT 1; + +/* CONTENTS */ + +/* Adding tab alias */ +INSERT INTO `PREFIX_tab` (`id_parent`, `class_name`, `position`) VALUES ((SELECT tmp.id_tab FROM (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp), 'AdminAliases', 9); +INSERT INTO `PREFIX_tab_lang` (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminAliases' LIMIT 1), + 'Alias' FROM `PREFIX_lang`); +INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) + VALUES ('1', (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminAliases' LIMIT 1), '1', '1', '1', '1'); + +/* Adding tab import */ +INSERT INTO `PREFIX_tab` (`id_parent`, `class_name`, `position`) VALUES ((SELECT tmp.id_tab FROM (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp), 'AdminImport', 10); +INSERT INTO `PREFIX_tab_lang` (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminImport' LIMIT 1), + 'Import' FROM `PREFIX_lang`); +INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) + VALUES ('1', (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminImport' LIMIT 1), '1', '1', '1', '1'); + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`) +VALUES ('adminOrder', 'Display in Back-Office, tab AdminOrder', 'Launch modules when the tab AdminOrder is displayed on back-office.'); + + +/* CONFIGURATION VARIABLE */ \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.6.2.sql b/install-dev/sql/upgrade/0.9.6.2.sql new file mode 100644 index 000000000..c55fefbb8 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.6.2.sql @@ -0,0 +1,7 @@ +/* STRUCTURE */ + +ALTER TABLE `PREFIX_product` CHANGE `wholesale_price` `wholesale_price` DECIMAL(13, 6) NULL; + +/* CONTENTS */ + +/* CONFIGURATION VARIABLE */ \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.7.1.sql b/install-dev/sql/upgrade/0.9.7.1.sql new file mode 100644 index 000000000..5a8ded7f5 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.7.1.sql @@ -0,0 +1,14 @@ +/* STRUCTURE */ + +ALTER TABLE `PREFIX_module` ADD INDEX (`name`); + +/* CONTENTS */ + +INSERT INTO `PREFIX_hook` (`name` , `title`, `description`, `position`) VALUES +('footer', 'Footer', 'Add block in footer', 1), +('PDFInvoice', 'PDF Invoice', 'Allow the display of extra informations into the PDF invoice', 0); +UPDATE `PREFIX_hook` SET `description` = 'Add blocks in the header', `position` = '1' WHERE `name` = 'header' LIMIT 1 ; +UPDATE `PREFIX_currency` SET `iso_code` = 'XXX' WHERE `iso_code` IS NULL; + + +/* CONFIGURATION VARIABLE */ \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.7.2.sql b/install-dev/sql/upgrade/0.9.7.2.sql new file mode 100644 index 000000000..c0ebf4949 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.7.2.sql @@ -0,0 +1,21 @@ +/* STRUCTURE */ + +CREATE TABLE `PREFIX_discount_quantity` ( + id_discount_quantity INT UNSIGNED NOT NULL auto_increment, + id_discount_type INT UNSIGNED NOT NULL, + id_product INT UNSIGNED NOT NULL, + id_product_attribute INT UNSIGNED NULL, + quantity INT UNSIGNED NOT NULL, + value DECIMAL(10,2) UNSIGNED NOT NULL, + PRIMARY KEY (id_discount_quantity) +) ENGINE=MYISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_product` ADD quantity_discount BOOL NULL DEFAULT 0 AFTER out_of_stock; + +/* CONTENTS */ + + +/* CONFIGURATION VARIABLE */ + +UPDATE `PREFIX_configuration` SET name = 'PS_TAX', value = 1 WHERE name = 'PS_TAX_NO' AND value = 0; +UPDATE `PREFIX_configuration` SET name = 'PS_TAX', value = 0 WHERE name = 'PS_TAX_NO' AND value = 1; \ No newline at end of file diff --git a/install-dev/sql/upgrade/0.9.sql b/install-dev/sql/upgrade/0.9.sql new file mode 100644 index 000000000..abef1ee07 --- /dev/null +++ b/install-dev/sql/upgrade/0.9.sql @@ -0,0 +1,39 @@ +/* STRUCTURE */ + +ALTER TABLE `PREFIX_currency` ADD `iso_code` VARCHAR( 3 ) NOT NULL DEFAULT '0' AFTER `name`; +ALTER TABLE `PREFIX_product_attribute` ADD `default_on` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `weight`; +ALTER TABLE `PREFIX_carrier` ADD `tax` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `deleted`; + +ALTER TABLE `PREFIX_order_detail` + ADD `download_hash` VARCHAR(255) default NULL AFTER `tax_rate`, + ADD `download_nb` INT(10) unsigned default 0 AFTER `tax_rate`, + ADD `download_deadline` DATETIME DEFAULT NULL AFTER `tax_rate`; + +CREATE TABLE `PREFIX_product_download` ( + `id_product_download` INT(10) unsigned NOT NULL auto_increment, + `id_product` INT(10) unsigned NOT NULL, + `display_filename` VARCHAR(255) default NULL, + `physically_filename` VARCHAR(255) default NULL, + `date_deposit` DATETIME NOT NULL, + `date_expiration` DATETIME default NULL, + `nb_days_accessible` int(10) unsigned default NULL, + `nb_downloadable` int(10) unsigned default 1, + PRIMARY KEY (`id_product_download`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +/* CONTENTS */ + +/* Adding tab Appearance */ +UPDATE `PREFIX_tab` SET `class_name` = 'AdminAppearance' WHERE class_name = 'AdminHomepage'; +UPDATE `PREFIX_tab_lang` SET `name` = 'Appearance' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminAppearance'); +UPDATE `PREFIX_tab_lang` SET `name` = 'Apparence' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminAppearance') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); + +/* Adding iso_code to currency */ +UPDATE `PREFIX_currency` SET `iso_code` = 'XXX'; + +/* Conf vars */ +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_DISPLAY_QTIES', '1', NOW(), NOW()); \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.0.0.1.sql b/install-dev/sql/upgrade/1.0.0.1.sql new file mode 100644 index 000000000..1aafc5d8f --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.1.sql @@ -0,0 +1,122 @@ +/* PHP */ +/* PHP:latin1_database_to_utf8(); */; + +/* STRUCTURE */ +SET NAMES 'utf8'; + +CREATE TABLE PREFIX_attribute_impact ( + id_attribute_impact int(11) NOT NULL AUTO_INCREMENT, + id_product int(11) NOT NULL, + id_attribute int(11) NOT NULL, + weight float NOT NULL, + price decimal(10,2) NOT NULL, + PRIMARY KEY (id_attribute_impact), + UNIQUE KEY id_product (id_product,id_attribute) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_supplier_lang ( + id_supplier INTEGER UNSIGNED NOT NULL, + id_lang INTEGER UNSIGNED NOT NULL, + description TEXT NULL, + INDEX supplier_lang_index(id_supplier, id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_manufacturer_lang ( + id_manufacturer INTEGER UNSIGNED NOT NULL, + id_lang INTEGER UNSIGNED NOT NULL, + description TEXT NULL, + INDEX manufacturer_lang_index(id_manufacturer, id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_state ( + id_state int(10) unsigned NOT NULL AUTO_INCREMENT, + id_country int(11) NOT NULL, + name varchar(64) NOT NULL, + iso_code varchar(3) NOT NULL, + active tinyint(1) NOT NULL default 0, + PRIMARY KEY (id_state) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +ALTER TABLE PREFIX_customer ADD secure_key VARCHAR(32) NOT NULL DEFAULT '-1' AFTER id_gender; +ALTER TABLE PREFIX_orders ADD secure_key VARCHAR(32) NOT NULL DEFAULT '-1' AFTER id_address_invoice; +ALTER TABLE PREFIX_product ADD id_category_default INT NULL AFTER id_tax; +ALTER TABLE PREFIX_category_product ADD position INTEGER UNSIGNED NOT NULL DEFAULT 0 AFTER id_product; +ALTER TABLE PREFIX_product ADD INDEX (id_category_default); +ALTER TABLE PREFIX_order_detail ADD ecotax DECIMAL(10, 2) NOT NULL DEFAULT 0 AFTER tax_rate; +ALTER TABLE PREFIX_employee + CHANGE name lastname VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + CHANGE surname firstname VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; +ALTER TABLE PREFIX_address + CHANGE name lastname VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + CHANGE surname firstname VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; +ALTER TABLE PREFIX_customer + CHANGE name lastname VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , + CHANGE surname firstname VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; +ALTER TABLE PREFIX_quick_access ADD new_window TINYINT( 1 ) NOT NULL DEFAULT 0 AFTER id_quick_access; + +/* CONTENTS */ +UPDATE PREFIX_hook_module SET id_hook = 14 WHERE id_hook = 9; +UPDATE PREFIX_quick_access SET new_window = 1 WHERE id_quick_access = 2 LIMIT 1; +INSERT INTO PREFIX_hook (name, title, description, position) VALUES ('orderConfirmation', 'Order confirmation page', 'Called on order confirmation page', 0); +UPDATE PREFIX_order_detail odt + SET product_price = ( + odt.product_price * ( + SELECT conversion_rate FROM PREFIX_currency c, PREFIX_orders o WHERE o.id_order = odt.id_order AND c.id_currency = o.id_currency + ) +); +UPDATE PREFIX_product p SET p.id_category_default = (SELECT id_category FROM PREFIX_category_product cp WHERE cp.id_product = p.id_product GROUP BY id_product ORDER BY cp.id_category ASC); +UPDATE PREFIX_category_product cp SET cp.position= cp.id_product; + +/* NEW TABS */ + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp), 'AdminPrintPDF', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminPrintPDF' LIMIT 1), + 'Print invoices' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Impression factures' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminPrintPDF') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminPrintPDF' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES (-1, 'AdminSearch', 2); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSearch' LIMIT 1), + 'Search' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Recherche' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminSearch') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSearch' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminPreferences' LIMIT 1) AS tmp), 'AdminLocalization', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminPreferences' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminLocalization' LIMIT 1), + 'Localization' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Localisation' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminLocalization') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminLocalization' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminShipping' LIMIT 1) AS tmp), 'AdminStates', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminShipping' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminStates' LIMIT 1), + 'States' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Etats' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminStates') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (`id_profile`, `id_tab`, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminStates' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_image_type (`name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`) VALUES ('home', 129, 129, 1, 0, 0, 0); + +/* CONFIGURATION VARIABLE */ +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_NB_DAYS_NEW_PRODUCT', 20, NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_WEIGHT_UNIT', 'kg', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_BLOCK_CART_AJAX', '1', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_FO_PROTOCOL', 'http://', NOW(), NOW()); +UPDATE PREFIX_configuration SET name = 'PS_MAIL_SMTP_PORT', value = 25 WHERE name = 'PS_MAIL_SMTP_PORT' AND value = 'default'; +UPDATE PREFIX_configuration SET name = 'PS_MAIL_SMTP_PORT', value = 465 WHERE name = 'PS_MAIL_SMTP_PORT' AND value = 'secure'; + +/* PHP:add_new_tab(AdminPDF, fr:PDF|es:PDF|en:PDF|de:PDF|it:PDF, 3); */; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.0.0.2.sql b/install-dev/sql/upgrade/1.0.0.2.sql new file mode 100644 index 000000000..fb0c72687 --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.2.sql @@ -0,0 +1,13 @@ + +/* STRUCTURE */ +SET NAMES 'utf8'; + +ALTER TABLE PREFIX_currency CHANGE COLUMN conversion_rate conversion_rate DECIMAL(10,6) NOT NULL; + +/* CONTENTS */ + +INSERT INTO PREFIX_image_type (`name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`) VALUES ('thickbox', 600, 600, 1, 0, 0, 0); +INSERT INTO PREFIX_image_type (`name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`) VALUES ('category', 600, 150, 0, 1, 0, 0); +INSERT INTO PREFIX_image_type (`name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`) VALUES ('thickbox', 129, 129, 1, 0, 0, 0); + +/* CONFIGURATION VARIABLE */ diff --git a/install-dev/sql/upgrade/1.0.0.3.sql b/install-dev/sql/upgrade/1.0.0.3.sql new file mode 100644 index 000000000..e82995b59 --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.3.sql @@ -0,0 +1,441 @@ +/* STRUCTURE */ +SET NAMES 'utf8'; + +ALTER TABLE PREFIX_attribute_group_lang DROP INDEX attribute_group_lang_index, ADD PRIMARY KEY (id_attribute_group, id_lang); +ALTER TABLE PREFIX_discount_lang DROP INDEX discount_lang_index, ADD PRIMARY KEY (id_discount, id_lang); +ALTER TABLE PREFIX_discount_type_lang DROP INDEX discount_type_lang_index, ADD PRIMARY KEY (id_discount_type, id_lang); +ALTER TABLE PREFIX_manufacturer_lang DROP INDEX manufacturer_lang_index, ADD PRIMARY KEY (id_manufacturer, id_lang); +ALTER TABLE PREFIX_supplier_lang DROP INDEX supplier_lang_index, ADD PRIMARY KEY (id_supplier, id_lang); +ALTER TABLE PREFIX_profile_lang DROP INDEX profile_lang_index, ADD PRIMARY KEY (id_profile, id_lang); +ALTER TABLE PREFIX_configuration_lang DROP INDEX configuration_lang_index, ADD PRIMARY KEY (id_configuration, id_lang); +ALTER TABLE PREFIX_tab_lang DROP INDEX tab_lang, ADD PRIMARY KEY (id_tab, id_lang); + +ALTER TABLE PREFIX_product ADD id_color_default INT UNSIGNED NULL AFTER id_category_default; +ALTER TABLE PREFIX_attribute_group ADD is_color_group TINYINT(1) NOT NULL DEFAULT 0; +ALTER TABLE PREFIX_attribute ADD color VARCHAR(32) NULL DEFAULT NULL; +ALTER TABLE PREFIX_currency CHANGE conversion_rate conversion_rate DECIMAL(13, 6) NOT NULL ; +ALTER TABLE PREFIX_address ADD id_state INT NULL AFTER id_country; +ALTER TABLE PREFIX_state ADD id_zone INT NULL AFTER id_country; +ALTER TABLE PREFIX_country ADD contains_states tinyint(1) NOT NULL DEFAULT 0; + +UPDATE PREFIX_customer SET secure_key = MD5(RAND()) WHERE secure_key = '-1'; +UPDATE PREFIX_orders o SET secure_key = (SELECT secure_key FROM PREFIX_customer c WHERE c.id_customer = o.id_customer); + +CREATE TABLE PREFIX_order_return ( + id_order_return INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_customer INTEGER UNSIGNED NOT NULL, + id_order INTEGER UNSIGNED NOT NULL, + state tinyint(1) unsigned NOT NULL DEFAULT 0, + question TEXT NOT NULL, + date_add DATETIME NOT NULL, + date_upd DATETIME NOT NULL, + PRIMARY KEY(id_order_return), + INDEX order_return_customer(id_customer) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_order_return_detail ( + id_order_return INTEGER UNSIGNED NOT NULL, + id_order_detail INTEGER UNSIGNED NOT NULL, + product_quantity int(10) unsigned NOT NULL DEFAULT 1, + PRIMARY KEY (id_order_return,id_order_detail) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_order_return_state ( + id_order_return_state int(10) unsigned NOT NULL auto_increment, + color varchar(32) default NULL, + PRIMARY KEY (`id_order_return_state`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_order_return_state_lang ( + id_order_return_state int(10) unsigned NOT NULL, + id_lang int(10) unsigned NOT NULL, + name varchar(64) NOT NULL, + UNIQUE KEY `order_state_lang_index` (`id_order_return_state`,`id_lang`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_order_slip ( + id_order_slip INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_customer INTEGER UNSIGNED NOT NULL, + id_order INTEGER UNSIGNED NOT NULL, + date_add DATETIME NOT NULL, + date_upd DATETIME NOT NULL, + PRIMARY KEY(id_order_slip), + INDEX order_slip_customer(id_customer) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_order_slip_detail ( + id_order_slip INTEGER UNSIGNED NOT NULL, + id_order_detail INTEGER UNSIGNED NOT NULL, + product_quantity int(10) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id_order_slip`,`id_order_detail`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_tax_state ( + id_tax int(10) unsigned NOT NULL, + id_state int(10) unsigned NOT NULL, + INDEX tax_state_index(id_tax, id_state) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* CONTENTS */ + +INSERT INTO PREFIX_order_return_state (`id_order_return_state`, `color`) VALUES +(1, '#ADD8E6'), +(2, '#EEDDFF'), +(3, '#DDFFAA'), +(4, '#FFD3D3'), +(5, '#FFFFBB'); + +INSERT INTO PREFIX_order_return_state_lang (`id_order_return_state`, `id_lang`, `name`) VALUES +(1, 1, 'Waiting for confirmation'), +(2, 1, 'Waiting for package'), +(3, 1, 'Package received'), +(4, 1, 'Return denied'), +(5, 1, 'Return completed'), +(1, 2, 'En attente de confirmation'), +(2, 2, 'En attente du colis'), +(3, 2, 'Colis reçu'), +(4, 2, 'Retour refusé'), +(5, 2, 'Retour terminé'); + +UPDATE PREFIX_country SET contains_states = 1 WHERE id_country = 21; + +INSERT INTO `PREFIX_state` (`id_state`, `id_country`, `id_zone`, `name`, `iso_code`, `active`) VALUES +(1, 21, 2, 'Alabama', 'AL', 1), +(2, 21, 2, 'Alaska', 'AK', 1), +(3, 21, 2, 'Arizona', 'AZ', 1), +(4, 21, 2, 'Arkansas', 'AR', 1), +(5, 21, 2, 'California', 'CA', 1), +(6, 21, 2, 'Colorado', 'CO', 1), +(7, 21, 2, 'Connecticut', 'CT', 1), +(8, 21, 2, 'Delaware', 'DE', 1), +(9, 21, 2, 'Florida', 'FL', 1), +(10, 21, 2, 'Georgia', 'GA', 1), +(11, 21, 2, 'Hawaii', 'HI', 1), +(12, 21, 2, 'Idaho', 'ID', 1), +(13, 21, 2, 'Illinois', 'IL', 1), +(14, 21, 2, 'Indiana', 'IN', 1), +(15, 21, 2, 'Iowa', 'IA', 1), +(16, 21, 2, 'Kansas', 'KS', 1), +(17, 21, 2, 'Kentucky', 'KY', 1), +(18, 21, 2, 'Louisiana', 'LA', 1), +(19, 21, 2, 'Maine', 'ME', 1), +(20, 21, 2, 'Maryland', 'MD', 1), +(21, 21, 2, 'Massachusetts', 'MA', 1), +(22, 21, 2, 'Michigan', 'MI', 1), +(23, 21, 2, 'Minnesota', 'MN', 1), +(24, 21, 2, 'Mississippi', 'MS', 1), +(25, 21, 2, 'Missouri', 'MO', 1), +(26, 21, 2, 'Montana', 'MT', 1), +(27, 21, 2, 'Nebraska', 'NE', 1), +(28, 21, 2, 'Nevada', 'NV', 1), +(29, 21, 2, 'New Hampshire', 'NH', 1), +(30, 21, 2, 'New Jersey', 'NJ', 1), +(31, 21, 2, 'New Mexico', 'NM', 1), +(32, 21, 2, 'New York', 'NY', 1), +(33, 21, 2, 'North Carolina', 'NC', 1), +(34, 21, 2, 'North Dakota', 'ND', 1), +(35, 21, 2, 'Ohio', 'OH', 1), +(36, 21, 2, 'Oklahoma', 'OK', 1), +(37, 21, 2, 'Oregon', 'OR', 1), +(38, 21, 2, 'Pennsylvania', 'PA', 1), +(39, 21, 2, 'Rhode Island', 'RI', 1), +(40, 21, 2, 'South Carolina', 'SC', 1), +(41, 21, 2, 'South Dakota', 'SD', 1), +(42, 21, 2, 'Tennessee', 'TN', 1), +(43, 21, 2, 'Texas', 'TX', 1), +(44, 21, 2, 'Utah', 'UT', 1), +(45, 21, 2, 'Vermont', 'VT', 1), +(46, 21, 2, 'Virginia', 'VA', 1), +(47, 21, 2, 'Washington', 'WA', 1), +(48, 21, 2, 'West Virginia', 'WV', 1), +(49, 21, 2, 'Wisconsin', 'WI', 1), +(50, 21, 2, 'Wyoming', 'WY', 1), +(51, 21, 2, 'Puerto Rico', 'PR', 1), +(52, 21, 2, 'US Virgin Islands', 'VI', 1); + +INSERT INTO `PREFIX_lang` (`name`, `active`, `iso_code`) VALUES +('Deutsch (German)', 1, 'de'), +('Español (Spanish)', 1, 'es'), +('Nederlands (Dutch)', 1, 'nl'), +('Bahasa Indonesia (Indonesian)', 1, 'id'), +('Italiano (Italian)', 1, 'it'), +('Język polski (Polish)', 1, 'pl'), +('Português (Portuguese)', 1, 'pt'), +('Čeština (Czech)', 1, 'cs'), +('Pусский язык (Russian)', 0, 'ru'), +('Türkçe (Turkish)', 0, 'tr'), +('Tiếng Việt (Vietnamese)', 0, 'vn'); + +/* NEW LANGS */ + +INSERT IGNORE INTO `PREFIX_tab_lang` (`id_tab`, `id_lang`, `name`) + (SELECT `id_tab`, id_lang, (SELECT tl.`name` + FROM `PREFIX_tab_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_tab`=`PREFIX_tab`.`id_tab`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_tab`); + +INSERT IGNORE INTO `PREFIX_country_lang` (`id_country`, `id_lang`, `name`) + (SELECT `id_country`, id_lang, (SELECT tl.`name` + FROM `PREFIX_country_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_country`=`PREFIX_country`.`id_country`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_country`); + +INSERT IGNORE INTO `PREFIX_quick_access_lang` (`id_quick_access`, `id_lang`, `name`) + (SELECT `id_quick_access`, id_lang, (SELECT tl.`name` + FROM `PREFIX_quick_access_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_quick_access`=`PREFIX_quick_access`.`id_quick_access`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_quick_access`); + +INSERT IGNORE INTO `PREFIX_attribute_group_lang` (`id_attribute_group`, `id_lang`, `name`, `public_name`) + (SELECT `id_attribute_group`, id_lang, (SELECT tl.`name` + FROM `PREFIX_attribute_group_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_attribute_group`=`PREFIX_attribute_group`.`id_attribute_group`), + (SELECT tl.`public_name` + FROM `PREFIX_attribute_group_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_attribute_group`=`PREFIX_attribute_group`.`id_attribute_group`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_attribute_group`); + +INSERT IGNORE INTO `PREFIX_attribute_lang` (`id_attribute`, `id_lang`, `name`) + (SELECT `id_attribute`, id_lang, (SELECT tl.`name` + FROM `PREFIX_attribute_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_attribute`=`PREFIX_attribute`.`id_attribute`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_attribute`); + +INSERT IGNORE INTO `PREFIX_carrier_lang` (`id_carrier`, `id_lang`, `delay`) + (SELECT `id_carrier`, id_lang, (SELECT tl.`delay` + FROM `PREFIX_carrier_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_carrier`=`PREFIX_carrier`.`id_carrier`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_carrier`); + +INSERT IGNORE INTO `PREFIX_contact_lang` (`id_contact`, `id_lang`, `name`, `description`) + (SELECT `id_contact`, id_lang, (SELECT tl.`name` + FROM `PREFIX_contact_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_contact`=`PREFIX_contact`.`id_contact`), + (SELECT tl.`description` + FROM `PREFIX_contact_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_contact`=`PREFIX_contact`.`id_contact`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_contact`); + +INSERT IGNORE INTO `PREFIX_discount_lang` (`id_discount`, `id_lang`, `description`) + (SELECT `id_discount`, id_lang, (SELECT tl.`description` + FROM `PREFIX_discount_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_discount`=`PREFIX_discount`.`id_discount`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_discount`); + +INSERT IGNORE INTO `PREFIX_discount_type_lang` (`id_discount_type`, `id_lang`, `name`) + (SELECT `id_discount_type`, id_lang, (SELECT tl.`name` + FROM `PREFIX_discount_type_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_discount_type`=`PREFIX_discount_type`.`id_discount_type`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_discount_type`); + +INSERT IGNORE INTO `PREFIX_feature_lang` (`id_feature`, `id_lang`, `name`) + (SELECT `id_feature`, id_lang, (SELECT tl.`name` + FROM `PREFIX_feature_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_feature`=`PREFIX_feature`.`id_feature`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_feature`); + +INSERT IGNORE INTO `PREFIX_feature_value_lang` (`id_feature_value`, `id_lang`, `value`) + (SELECT `id_feature_value`, id_lang, (SELECT tl.`value` + FROM `PREFIX_feature_value_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_feature_value`=`PREFIX_feature_value`.`id_feature_value`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_feature_value`); + +INSERT IGNORE INTO `PREFIX_image_lang` (`id_image`, `id_lang`, `legend`) + (SELECT `id_image`, id_lang, (SELECT tl.`legend` + FROM `PREFIX_image_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_image`=`PREFIX_image`.`id_image`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_image`); + +INSERT IGNORE INTO `PREFIX_manufacturer_lang` (`id_manufacturer`, `id_lang`, `description`) + (SELECT `id_manufacturer`, id_lang, (SELECT tl.`description` + FROM `PREFIX_manufacturer_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_manufacturer`=`PREFIX_manufacturer`.`id_manufacturer`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_manufacturer`); + +INSERT IGNORE INTO `PREFIX_order_return_state_lang` (`id_order_return_state`, `id_lang`, `name`) + (SELECT `id_order_return_state`, id_lang, (SELECT tl.`name` + FROM `PREFIX_order_return_state_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_order_return_state`=`PREFIX_order_return_state`.`id_order_return_state`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_order_return_state`); + +INSERT IGNORE INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) + (SELECT `id_order_state`, id_lang, (SELECT tl.`name` + FROM `PREFIX_order_state_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_order_state`=`PREFIX_order_state`.`id_order_state`), + (SELECT tl.`template` + FROM `PREFIX_order_state_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_order_state`=`PREFIX_order_state`.`id_order_state`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_order_state`); + +INSERT IGNORE INTO `PREFIX_profile_lang` (`id_profile`, `id_lang`, `name`) + (SELECT `id_profile`, id_lang, (SELECT tl.`name` + FROM `PREFIX_profile_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_profile`=`PREFIX_profile`.`id_profile`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_profile`); + +INSERT IGNORE INTO `PREFIX_supplier_lang` (`id_supplier`, `id_lang`, `description`) + (SELECT `id_supplier`, id_lang, (SELECT tl.`description` + FROM `PREFIX_supplier_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_supplier`=`PREFIX_supplier`.`id_supplier`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_supplier`); + +INSERT IGNORE INTO `PREFIX_tax_lang` (`id_tax`, `id_lang`, `name`) + (SELECT `id_tax`, id_lang, (SELECT tl.`name` + FROM `PREFIX_tax_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_tax`=`PREFIX_tax`.`id_tax`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_tax`); + +/* products */ +INSERT IGNORE INTO `PREFIX_product_lang` (`id_product`, `id_lang`, `description`, `description_short`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `name`, `availability`) + (SELECT `id_product`, id_lang, + (SELECT tl.`description` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`description_short` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`link_rewrite` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`meta_description` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`meta_keywords` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`meta_title` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`name` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`), + (SELECT tl.`availability` + FROM `PREFIX_product_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_product`=`PREFIX_product`.`id_product`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_product`); + +/* categories */ +INSERT IGNORE INTO `PREFIX_category_lang` (`id_category`, `id_lang`, `description`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `name`) + (SELECT `id_category`, id_lang, + (SELECT tl.`description` + FROM `PREFIX_category_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_category`=`PREFIX_category`.`id_category`), + (SELECT tl.`link_rewrite` + FROM `PREFIX_category_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_category`=`PREFIX_category`.`id_category`), + (SELECT tl.`meta_description` + FROM `PREFIX_category_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_category`=`PREFIX_category`.`id_category`), + (SELECT tl.`meta_keywords` + FROM `PREFIX_category_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_category`=`PREFIX_category`.`id_category`), + (SELECT tl.`meta_title` + FROM `PREFIX_category_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_category`=`PREFIX_category`.`id_category`), + (SELECT tl.`name` + FROM `PREFIX_category_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_category`=`PREFIX_category`.`id_category`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_category`); + + + +/* NEW TABS */ + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp), 'AdminReturn', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminReturn' LIMIT 1), + 'Merchandise returns (RMAs)' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Retours produit' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminReturn') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminReturn' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp), 'AdminSlip', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSlip' LIMIT 1), + 'Credit slips' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Avoirs' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminSlip') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSlip' LIMIT 1), 1, 1, 1, 1); + + +/* CONFIGURATION VARIABLE */ +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_ORDER_RETURN', '0', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_ORDER_RETURN_NB_DAYS', '7', NOW(), NOW()); +UPDATE PREFIX_configuration SET name = 'PS_SSL_ENABLED' WHERE name = 'PS_FO_PROTOCOL'; +UPDATE PREFIX_configuration SET name = 'PS_SSL_ENABLED', value = 0 WHERE name = 'PS_SSL_ENABLED' AND value = 'http://'; +UPDATE PREFIX_configuration SET name = 'PS_SSL_ENABLED', value = 1 WHERE name = 'PS_SSL_ENABLED' AND value = 'https://'; + diff --git a/install-dev/sql/upgrade/1.0.0.4.sql b/install-dev/sql/upgrade/1.0.0.4.sql new file mode 100644 index 000000000..1d5697ce5 --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.4.sql @@ -0,0 +1,88 @@ +/* STRUCTURE */ +SET NAMES 'utf8'; + +ALTER TABLE PREFIX_order_detail + ADD product_ean13 VARCHAR(13) CHARACTER SET utf8 COLLATE utf8_general_ci NULL AFTER product_price; +ALTER TABLE PREFIX_order_detail + ADD product_quantity_return INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER product_quantity; + +ALTER TABLE PREFIX_state + ADD tax_behavior SMALLINT(1) NOT NULL DEFAULT 0 AFTER iso_code; + +ALTER TABLE PREFIX_product + ADD reduction_from DATE NOT NULL AFTER reduction_percent; +ALTER TABLE PREFIX_product + ADD reduction_to DATE NOT NULL AFTER reduction_from; + +ALTER TABLE PREFIX_range_weight + ADD id_carrier INTEGER UNSIGNED DEFAULT NULL AFTER id_range_weight; +ALTER TABLE PREFIX_range_weight + DROP INDEX range_weight_index, + ADD UNIQUE range_weight_unique (delimiter1, delimiter2, id_carrier); +ALTER TABLE PREFIX_range_price + ADD id_carrier INTEGER UNSIGNED DEFAULT NULL AFTER id_range_price; +ALTER TABLE PREFIX_range_price + DROP INDEX range_price_index, + ADD UNIQUE range_price_unique (delimiter1, delimiter2, id_carrier); + +/* CONTENTS */ +/* One request per insert, if one die, other can be inserted */ +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('adminCustomers', 'Display in Back-Office, tab AdminCustomers', 'Launch modules when the tab AdminCustomers is displayed on back-office.', 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('createAccount', 'Successful customer create account', 'Called when new customer create account successfuled', 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('customerAccount', 'Customer account page display in front office', 'Called when a customer access to his account.', 1); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('orderSlip', 'Called when a order slip is created', 'Called when a quantity of one product change in an order.', 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('productTab', 'Tabs on product page', 'Called on order product page tabs', 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('productTabContent', 'Content of tabs on product page', 'Called on order product page tabs', 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('shoppingCart', 'Shopping cart footer', 'Display some specific informations on the shopping cart page', 0); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_MAIL_TYPE', '3', NOW(), NOW()); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_TOKEN_ENABLE', '0', NOW(), NOW()); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_GIFT_WRAPPING_PRICE', '0', NOW(), NOW()); + +/* NEW RANGES */ + +INSERT IGNORE INTO PREFIX_range_price ( id_carrier, delimiter1, delimiter2 ) + (SELECT c.id_carrier, rp.delimiter1, rp.delimiter2 + FROM PREFIX_range_price rp + CROSS JOIN PREFIX_carrier c + WHERE c.deleted = 0 + AND c.active = 1 + ); + +UPDATE `PREFIX_delivery` d SET d.`id_range_price` = ( + SELECT rw.`id_range_price` FROM `PREFIX_range_price` rw WHERE + rw.`id_carrier` = d.`id_carrier` AND + rw.`delimiter1` = ( + SELECT `delimiter1` FROM `PREFIX_range_price` rw2 WHERE rw2.`id_range_price` = d.`id_range_price` LIMIT 1 + ) AND + rw.`delimiter2` = ( + SELECT `delimiter2` FROM `PREFIX_range_price` rw3 WHERE rw3.`id_range_price` = d.`id_range_price` LIMIT 1 + ) +); + +INSERT IGNORE INTO PREFIX_range_weight ( id_carrier, delimiter1, delimiter2 ) + (SELECT c.id_carrier, rp.delimiter1, rp.delimiter2 + FROM PREFIX_range_weight rp + CROSS JOIN PREFIX_carrier c + WHERE c.deleted = 0 + AND c.active = 1 + ); + +UPDATE `PREFIX_delivery` d SET d.`id_range_weight` = ( + SELECT rw.`id_range_weight` FROM `PREFIX_range_weight` rw WHERE + rw.`id_carrier` = d.`id_carrier` AND + rw.`delimiter1` = ( + SELECT `delimiter1` FROM `PREFIX_range_weight` rw2 WHERE rw2.`id_range_weight` = d.`id_range_weight` LIMIT 1 + ) AND + rw.`delimiter2` = ( + SELECT `delimiter2` FROM `PREFIX_range_weight` rw3 WHERE rw3.`id_range_weight` = d.`id_range_weight` LIMIT 1 + ) +); + +DELETE FROM PREFIX_range_price WHERE id_carrier IS NULL; +DELETE FROM PREFIX_range_weight WHERE id_carrier IS NULL; + +/* CONFIGURATION VARIABLE */ + diff --git a/install-dev/sql/upgrade/1.0.0.5.sql b/install-dev/sql/upgrade/1.0.0.5.sql new file mode 100644 index 000000000..de1edb4bd --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.5.sql @@ -0,0 +1,35 @@ +/* STRUCTURE */ +SET NAMES 'utf8'; + +ALTER TABLE PREFIX_orders + ADD total_wrapping DECIMAL(10,2) NOT NULL DEFAULT 0 AFTER total_shipping; + +ALTER TABLE PREFIX_carrier + ADD range_behavior TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 AFTER shipping_handling; + +ALTER TABLE PREFIX_order_detail + ADD product_supplier_reference VARCHAR(32) NULL AFTER product_reference; + +ALTER TABLE PREFIX_product + ADD supplier_reference VARCHAR(32) NULL AFTER reference; + +ALTER TABLE PREFIX_product_attribute + ADD supplier_reference VARCHAR(32) NULL AFTER reference; + +ALTER TABLE PREFIX_customer + ADD UNIQUE customer_email(email(128)); + +ALTER TABLE PREFIX_product_download + ADD active TINYINT(1) UNSIGNED NOT NULL DEFAULT 1 AFTER nb_downloadable; + + +/* CONTENTS */ +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES ('createAccountForm', 'Customer account creation form', 'Display some information on the form to create a customer account', 1); + +INSERT INTO PREFIX_lang (`name`, `active`, `iso_code`) VALUES +('Română (Romanian)', 0, 'ro'), +('Νεοελληνική (Greek)', 0, 'gr'), +('Slovenčina (Slovak)', 0, 'sk'); + +/* CONFIGURATION VARIABLE */ + diff --git a/install-dev/sql/upgrade/1.0.0.6.sql b/install-dev/sql/upgrade/1.0.0.6.sql new file mode 100644 index 000000000..b2eb0806c --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.6.sql @@ -0,0 +1,11 @@ +/* STRUCTURE */ +SET NAMES 'utf8'; + +ALTER TABLE PREFIX_order_detail + CHANGE product_price product_price DECIMAL(13, 6) NOT NULL DEFAULT '0.000000'; + + +/* CONTENTS */ + +/* CONFIGURATION VARIABLE */ + diff --git a/install-dev/sql/upgrade/1.0.0.7.sql b/install-dev/sql/upgrade/1.0.0.7.sql new file mode 100644 index 000000000..d7b148ca6 --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.7.sql @@ -0,0 +1,21 @@ +/* PHP */ +/* PHP:AttributeGroup::cleanDeadCombinations(); */; + +/* STRUCTURE */ +SET NAMES 'utf8'; + +ALTER TABLE PREFIX_order_detail + ADD product_quantity_discount DECIMAL(13,6) NOT NULL DEFAULT 0 AFTER product_price; +ALTER TABLE PREFIX_country + ADD deleted TINYINT(1) NOT NULL DEFAULT 0; + + +/* CONTENTS */ + +INSERT INTO PREFIX_lang (`name`, `active`, `iso_code`) VALUES +('Norsk (Norwegian)', 0, 'no'), +('ภาษาไทย (Thai)', 0, 'th'), +('Dansk (Danish)', 0, 'dk'); + +/* CONFIGURATION VARIABLE */ + diff --git a/install-dev/sql/upgrade/1.0.0.8.sql b/install-dev/sql/upgrade/1.0.0.8.sql new file mode 100644 index 000000000..254c4f0dc --- /dev/null +++ b/install-dev/sql/upgrade/1.0.0.8.sql @@ -0,0 +1,17 @@ +/* PHP */ +/* PHP:AttributeGroup::cleanDeadCombinations(); */; + +/* STRUCTURE */ +SET NAMES 'utf8'; + +/* CONTENTS */ + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_DISP_UNAVAILABLE_ATTR', '1', NOW(), NOW()); + +INSERT INTO PREFIX_lang (`name`, `active`, `iso_code`) VALUES +('Svenska (Swedish)', 0, 'se'), +('עברית (Hebrew)', 0, 'he'); + +/* CONFIGURATION VARIABLE */ + diff --git a/install-dev/sql/upgrade/1.1.0.1.sql b/install-dev/sql/upgrade/1.1.0.1.sql new file mode 100644 index 000000000..c00a3176e --- /dev/null +++ b/install-dev/sql/upgrade/1.1.0.1.sql @@ -0,0 +1,629 @@ +/* PHP */ +/* PHP:AttributeGroup::cleanDeadCombinations(); */; +/* PHP:configuration_double_cleaner(); */; + +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ +DROP TABLE IF EXISTS PREFIX_gender; +DROP TABLE IF EXISTS PREFIX_search; +ALTER TABLE PREFIX_category_lang + ADD INDEX category_name (name); +ALTER TABLE PREFIX_order_detail + MODIFY COLUMN product_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; +ALTER TABLE PREFIX_order_detail + ADD deleted TINYINT(3) UNSIGNED NOT NULL DEFAULT 0; +ALTER TABLE PREFIX_configuration + MODIFY COLUMN name VARCHAR(32) NOT NULL UNIQUE; +ALTER TABLE PREFIX_orders + ADD invoice_number INTEGER(10) UNSIGNED NOT NULL DEFAULT 0 AFTER total_wrapping; +ALTER TABLE PREFIX_orders + ADD delivery_number INTEGER(10) UNSIGNED NOT NULL DEFAULT 0 AFTER invoice_number; +ALTER TABLE PREFIX_orders + ADD invoice_date DATETIME NOT NULL AFTER delivery_number; +ALTER TABLE PREFIX_orders + ADD delivery_date DATETIME NOT NULL AFTER invoice_date; +ALTER TABLE PREFIX_order_detail + CHANGE product_price product_price DECIMAL(13, 6) NOT NULL DEFAULT 0.000000; +ALTER TABLE PREFIX_order_slip + ADD shipping_cost TINYINT UNSIGNED NOT NULL DEFAULT 0 AFTER id_order; +ALTER TABLE PREFIX_order_state + ADD delivery TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 AFTER logable; +ALTER TABLE PREFIX_country + DROP deleted; +ALTER TABLE PREFIX_product + ADD customizable BOOL NOT NULL DEFAULT 0 AFTER quantity_discount; +ALTER TABLE PREFIX_product + ADD uploadable_files TINYINT NOT NULL DEFAULT 0 AFTER customizable; +ALTER TABLE PREFIX_product + ADD text_fields TINYINT NOT NULL DEFAULT 0 AFTER uploadable_files; +ALTER TABLE PREFIX_product_lang + CHANGE availability available_now VARCHAR(255) NULL; +ALTER TABLE PREFIX_product_lang + ADD available_later VARCHAR(255) NULL AFTER available_now; +ALTER TABLE PREFIX_access + DROP id_access; +ALTER TABLE PREFIX_access + DROP INDEX access_profile; +ALTER TABLE PREFIX_access + DROP INDEX access_tab; +ALTER TABLE PREFIX_access + ADD PRIMARY KEY(id_profile, id_tab); +ALTER TABLE PREFIX_currency + ADD blank TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 AFTER sign; +ALTER TABLE PREFIX_currency + ADD decimals TINYINT(1) UNSIGNED NOT NULL DEFAULT 1 AFTER format; +ALTER TABLE PREFIX_product_attribute + ADD wholesale_price decimal(13,6) NOT NULL DEFAULT 0.000000 AFTER ean13; +ALTER TABLE PREFIX_employee + ADD last_passwd_gen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER passwd; +ALTER TABLE PREFIX_customer + ADD last_passwd_gen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER passwd; +ALTER TABLE PREFIX_customer + ADD ip_registration_newsletter VARCHAR(15) NULL DEFAULT NULL AFTER newsletter; +ALTER TABLE PREFIX_image_type + ADD scenes TINYINT(1) NOT NULL DEFAULT 1; +ALTER TABLE PREFIX_image_lang + CHANGE legend legend VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; + +/* CMS */ +CREATE TABLE PREFIX_cms ( + id_cms INTEGER UNSIGNED NOT NULL auto_increment, + PRIMARY KEY (id_cms) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_cms_lang ( + id_cms INTEGER UNSIGNED NOT NULL auto_increment, + id_lang INTEGER UNSIGNED NOT NULL, + meta_title VARCHAR(128) NOT NULL, + meta_description VARCHAR(255) DEFAULT NULL, + meta_keywords VARCHAR(255) DEFAULT NULL, + content longtext NULL, + link_rewrite VARCHAR(128) NOT NULL, + PRIMARY KEY (id_cms, id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_block_cms ( + id_block INTEGER(10) NOT NULL, + id_cms INTEGER(10) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* PAYMENT MODULE RESTRICTIONS */ +CREATE TABLE `PREFIX_module_country` ( + `id_module` INTEGER UNSIGNED NOT NULL, + `id_country` INTEGER UNSIGNED NOT NULL, + PRIMARY KEY (`id_module`, `id_country`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module_currency` ( + `id_module` INTEGER UNSIGNED NOT NULL, + `id_currency` INTEGER NOT NULL, + PRIMARY KEY (`id_module`, `id_currency`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* ORDER-MESSAGE */ +CREATE TABLE PREFIX_order_message +( + id_order_message int(10) unsigned NOT NULL auto_increment, + date_add datetime NOT NULL, + PRIMARY KEY (id_order_message) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_order_message_lang +( + id_order_message int(10) unsigned NOT NULL, + id_lang int(10) unsigned NOT NULL, + name varchar(128) NOT NULL, + message text NOT NULL, + PRIMARY KEY (id_order_message,id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* SUB-DOMAINS */ +CREATE TABLE PREFIX_subdomain ( + id_subdomain INTEGER(10) NOT NULL AUTO_INCREMENT, + name VARCHAR(16) NOT NULL, + PRIMARY KEY(id_subdomain) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* META-CLASS */ +CREATE TABLE PREFIX_meta ( + id_meta INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + page VARCHAR(64) NOT NULL, + PRIMARY KEY(id_meta), + KEY `meta_name` (`page`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_meta_lang ( + id_meta INTEGER UNSIGNED NOT NULL, + id_lang INTEGER UNSIGNED NOT NULL, + title VARCHAR(255) NULL, + description VARCHAR(255) NULL, + keywords VARCHAR(255) NULL, + PRIMARY KEY (id_meta, id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_discount_category ( + id_discount INTEGER(11) NOT NULL, + id_category INTEGER(11) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* Customized products */ +CREATE TABLE PREFIX_customization ( + id_customization int(10) NOT NULL AUTO_INCREMENT, + id_product_attribute int(10) NOT NULL DEFAULT 0, + id_cart int(10) NOT NULL, + id_product int(10) NOT NULL, + PRIMARY KEY(id_customization, id_cart, id_product) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_customized_data ( + id_customization int(10) NOT NULL, + `type` tinyint(1) NOT NULL, + `index` int(3) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY(id_customization, `type`, `index`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_customization_field ( + id_customization_field int(10) NOT NULL AUTO_INCREMENT, + id_product int(10) NOT NULL, + type tinyint(1) NOT NULL, + required tinyint(1) NOT NULL, + PRIMARY KEY(id_customization_field) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_customization_field_lang ( + id_customization_field int(10) NOT NULL, + id_lang int(10) NOT NULL, + name varchar(255) NOT NULL, + PRIMARY KEY(id_customization_field, id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* Product location */ +ALTER TABLE `PREFIX_product_attribute` ADD `location` VARCHAR(64) NULL AFTER `supplier_reference`; +ALTER TABLE `PREFIX_product` ADD `location` VARCHAR(64) NULL AFTER `supplier_reference`; + +/* Paypal default e-mail fix */ +UPDATE `PREFIX_configuration` SET value = 'paypal@prestashop.com' WHERE name = 'PAYPAL_BUSINESS' AND value = 'your-address@paypal.com'; + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ +INSERT INTO PREFIX_subdomain (id_subdomain, name) VALUES (NULL, 'www'); +UPDATE PREFIX_currency SET blank = 1 WHERE iso_code = 'EUR'; +UPDATE PREFIX_order_state SET delivery = 1 WHERE id_order_state = 3; +UPDATE PREFIX_order_state SET delivery = 1 WHERE id_order_state = 4; +UPDATE PREFIX_order_state SET delivery = 1 WHERE id_order_state = 5; + +/* IMAGE MAPPING */ +UPDATE PREFIX_image_type SET scenes = 0; +INSERT INTO `PREFIX_image_type` (`name` ,`width` ,`height` ,`products` ,`categories` ,`manufacturers` ,`suppliers` ,`scenes`) VALUES ('large_scene', '556', '200', '0', '0', '0', '0', '1'); +INSERT INTO `PREFIX_image_type` (`name` ,`width` ,`height` ,`products` ,`categories` ,`manufacturers` ,`suppliers` ,`scenes`) VALUES ('thumb_scene', '161', '58', '0', '0', '0', '0', '1'); + +/* CONFIGURATION VARIABLE */ +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_INVOICE', '1', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_INVOICE_PREFIX', 'IN', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_DELIVERY_PREFIX', 'DE', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_PRODUCT_PICTURE_MAX_SIZE', '131072', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_PRODUCT_PICTURE_WIDTH', '64', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_PRODUCT_PICTURE_HEIGHT', '64', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_PASSWD_TIME_BACK', '360', NOW(), NOW()); +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_PASSWD_TIME_FRONT', '360', NOW(), NOW()); + +INSERT INTO `PREFIX_configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES ((SELECT id_configuration FROM PREFIX_configuration c WHERE c.name = 'PS_INVOICE_PREFIX' LIMIT 1), 1, 'IN', NOW()); +INSERT INTO `PREFIX_configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES ((SELECT id_configuration FROM PREFIX_configuration c WHERE c.name = 'PS_INVOICE_PREFIX' LIMIT 1), 2, 'FA', NOW()); +INSERT INTO `PREFIX_configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES ((SELECT id_configuration FROM PREFIX_configuration c WHERE c.name = 'PS_DELIVERY_PREFIX' LIMIT 1), 1, 'DE', NOW()); +INSERT INTO `PREFIX_configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES ((SELECT id_configuration FROM PREFIX_configuration c WHERE c.name = 'PS_DELIVERY_PREFIX' LIMIT 1), 2, 'LI', NOW()); + +/* HOOKS/MODULES */ +UPDATE PREFIX_hook SET description = 'This hook is called when a product is deleted' WHERE name = 'deleteProduct' LIMIT 1; +UPDATE PREFIX_hook SET name = 'extraLeft', title = 'Extra actions on the product page (left column).' WHERE name = 'extra' LIMIT 1; +INSERT INTO PREFIX_hook (name, title, position, description) VALUES ('orderReturn', 'Product returned', 0, 'When an order return is made'); +INSERT INTO PREFIX_hook (name, title, position, description) VALUES ('postUpdateOrderStatus', 'Post Order\'s status update event', 0, 'Launch modules when the order\'s status was changed (enables automated workflow).'); +INSERT INTO PREFIX_hook (name, title, position, description) VALUES ('productActions', 'Product actions', 1, 'Put new action buttons on product page'); +INSERT INTO PREFIX_hook (name, title, position, description) VALUES ('cancelProduct', 'Product cancelled', 0, 'This hook is called when you cancel a product in an order'); +INSERT INTO PREFIX_hook (name, title, position) VALUES ('backOfficeHome', 'Administration panel homepage', 1); +INSERT INTO PREFIX_hook (name, title, position, description) VALUES ('extraRight', 'Extra actions on the product page (right column).', 0, NULL); +UPDATE PREFIX_hook SET position = 1 WHERE name = 'top'; +UPDATE PREFIX_hook SET position = 0 WHERE name = 'header'; + +/* ORDER MESSAGES */ +INSERT INTO `PREFIX_order_message` (`id_order_message`, `date_add`) VALUES (1, NOW()); +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 1, 'Delay', 'Hi, + +Unfortunately, an item on your order is currently out of stock. This may cause a slight delay in delivery. +Please accept our apologies and rest assured that we are working hard to rectify this. + +Best regards, +'); +INSERT INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) VALUES +(1, 2, 'Délai', 'Bonjour, + +Un des éléments de votre commande est actuellement en réapprovisionnement, ce qui peut légèrement retarder son envoi. + +Merci de votre compréhension. + +Cordialement, +'); + +/* META */ +INSERT INTO `PREFIX_meta` (`id_meta`, `page`) VALUES +(1, '404'), +(2, 'best-sales'), +(3, 'contact-form'), +(4, 'index'), +(5, 'manufacturer'), +(6, 'new-products'), +(7, 'password'), +(8, 'prices-drop'), +(9, 'sitemap'), +(10, 'supplier'); + +INSERT INTO `PREFIX_meta_lang` (`id_meta`, `id_lang`, `title`, `description`, `keywords`) VALUES +(1, 1, '404 error', 'This page cannot be found', 'error, 404, not found'), +(1, 2, 'Erreur 404', 'Cette page est introuvable', 'erreur, 404, introuvable'), +(2, 1, 'Best sales', 'Our best sales', 'best sales'), +(2, 2, 'Meilleurs ventes', 'Liste de nos produits les mieux vendus', 'meilleurs ventes'), +(3, 1, 'Contact us', 'Use our form to contact us', 'contact, form, e-mail'), +(3, 2, 'Contactez-nous', 'Utilisez notre formulaire pour nous contacter', 'contact, formulaire, e-mail'), +(4, 1, '', 'Shop powered by PrestaShop', 'shop, prestashop'), +(4, 2, '', 'Boutique propulsé par PrestaShop', 'boutique, prestashop'), +(5, 1, 'Manufacturers', 'Manufacturers list', 'manufacturer'), +(5, 2, 'Fabricants', 'Liste de nos fabricants', 'fabricants'), +(6, 1, 'New products', 'Our new products', 'new, products'), +(6, 2, 'Nouveaux produits', 'Liste de nos nouveaux produits', 'nouveau, produit'), +(7, 1, 'Forgot your password', 'Enter your e-mail address used to register in goal to get e-mail with your new password', 'forgot, password, e-mail, new, reset'), +(7, 2, 'Mot de passe oublié', 'Renseignez votre adresse e-mail afin de recevoir votre nouveau mot de passe.', 'mot de passe, oublié, e-mail, nouveau, regénération'), +(8, 1, 'Specials', 'Our special products', 'special, prices drop'), +(8, 2, 'Promotions', 'Nos produits en promotion', 'promotion, réduction'), +(9, 1, 'Sitemap', 'Lost ? Find what your are looking for', 'sitemap'), +(9, 2, 'Plan du site', 'Perdu ? Trouvez ce que vous cherchez', 'plan, site'), +(10, 1, 'Suppliers', 'Suppliers list', 'supplier'), +(10, 2, 'Fournisseurs', 'Liste de nos fournisseurs', 'fournisseurs'); + +/* CMS */ +INSERT INTO `PREFIX_cms` VALUES (1),(2),(3),(4),(5); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(1, 1, 'Delivery', 'Our terms and conditions of delivery', 'conditions, delivery, delay, shipment, pack', '

    Shipments and returns

    Your pack shipment

    Packages are generally dispatched within 2 days after receipt of payment and are shipped via Colissimo with tracking and drop-off without signature. If you prefer delivery by Colissimo Extra with required signature, an additional cost will be applied, so please contact us before choosing this method. Whichever shipment choice you make, we will provide you with a link to track your package online.

    Shipping fees include handling and packing fees as well as postage costs. Handling fees are fixed, whereas transport fees vary according to total weight of the shipment. We advise you to group your items in one order. We cannot group two distinct orders placed separately, and shipping fees will apply to each of them. Your package will be dispatched at your own risk, but special care is taken to protect fragile objects.

    Boxes are amply sized and your items are well-protected.

    ', 'delivery'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(1, 2, 'Livraison', 'Nos conditions générales de livraison', 'conditions, livraison, délais, transport, colis', '

    Livraisons et retours

    Le transport de votre colis

    Les colis sont généralement expédiés en 48h après réception de votre paiement. Le mode d''expédidition standard est le Colissimo suivi, remis sans signature. Si vous souhaitez une remise avec signature, un coût supplémentaire s''applique, merci de nous contacter. Quel que soit le mode d''expédition choisi, nous vous fournirons dès que possible un lien qui vous permettra de suivre en ligne la livraison de votre colis.

    Les frais d''expédition comprennent l''emballage, la manutention et les frais postaux. Ils peuvent contenir une partie fixe et une partie variable en fonction du prix ou du poids de votre commande. Nous vous conseillons de regrouper vos achats en une unique commande. Nous ne pouvons pas grouper deux commandes distinctes et vous devrez vous acquitter des frais de port pour chacune d''entre elles. Votre colis est expédié à vos propres risques, un soin particulier est apporté au colis contenant des produits fragiles..

    Les colis sont surdimensionnés et protégés.

    ', 'livraison'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(2, 1, 'Legal Notice', 'Legal notice', 'notice, legal, credits', '

    Legal

    Credits

    Concept and production:

    This Web site was created using PrestaShop™ open-source software.

    ', 'legal-notice'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(2, 2, 'Mentions légales', 'Mentions légales', 'mentions, légales, crédits', '

    Mentions légales

    Crédits

    Concept et production :

    Ce site internet a été réalisé en utilisant la solution open-source PrestaShop™ .

    ', 'mentions-legales'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(3, 1, 'Terms and conditions of use', 'Our terms and conditions of use', 'conditions, terms, use, sell', '

    Your terms and conditions of use

    Rule 1

    Here is the rule 1 content

    \r\n

    Rule 2

    Here is the rule 2 content

    \r\n

    Rule 3

    Here is the rule 3 content

    ', 'terms-and-conditions-of-use'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(3, 2, 'Conditions d''utilisation', 'Nos conditions générales de ventes', 'conditions, utilisation, générales, ventes', '

    Vos conditions de ventes

    Règle n°1

    Contenu de la règle numéro 1

    \r\n

    Règle n°2

    Contenu de la règle numéro 2

    \r\n

    Règle n°3

    Contenu de la règle numéro 3

    ', 'conditions-generales-de-ventes'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(4, 1, 'About us', 'Learn more about us', 'about us, informations', '

    About us

    \r\n

    Our company

    Our company

    \r\n

    Our team

    Our team

    \r\n

    Informations

    Informations

    ', 'about-us'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(4, 2, 'A propos', 'Apprenez-en d''avantage sur nous', 'à propos, informations', '

    A propos

    \r\n

    Notre entreprise

    Notre entreprise

    \r\n

    Notre équipe

    Notre équipe

    \r\n

    Informations

    Informations

    ', 'a-propos'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(5, 1, 'Secure payment', 'Our secure payment mean', 'secure payment, ssl, visa, mastercard, paypal', '

    Secure payment

    \r\n

    Our secure payment

    With SSL

    \r\n

    Using Visa/Mastercard/Paypal

    About this services

    ', 'secure-payment'); +INSERT INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `meta_title`, `meta_description`, `meta_keywords`, `content`, `link_rewrite`) VALUES +(5, 2, 'Paiement sécurisé', 'Notre offre de paiement sécurisé', 'paiement sécurisé, ssl, visa, mastercard, paypal', '

    Paiement sécurisé

    \r\n

    Notre offre de paiement sécurisé

    Avec SSL

    \r\n

    Utilisation de Visa/Mastercard/Paypal

    A propos de ces services

    ', 'paiement-securise'); + +INSERT INTO PREFIX_block_cms (`id_block`, `id_cms`) VALUES (IFNULL((SELECT id_module FROM PREFIX_module m WHERE m.name = 'blockvariouslinks' LIMIT 1), 0), 3); +INSERT INTO PREFIX_block_cms (`id_block`, `id_cms`) VALUES (IFNULL((SELECT id_module FROM PREFIX_module m WHERE m.name = 'blockvariouslinks' LIMIT 1), 0), 4); +INSERT INTO PREFIX_block_cms (`id_block`, `id_cms`) VALUES (IFNULL((SELECT id_module FROM PREFIX_module m WHERE m.name = 'blockinfos' LIMIT 1), 0), 1); +INSERT INTO PREFIX_block_cms (`id_block`, `id_cms`) VALUES (IFNULL((SELECT id_module FROM PREFIX_module m WHERE m.name = 'blockinfos' LIMIT 1), 0), 2); +INSERT INTO PREFIX_block_cms (`id_block`, `id_cms`) VALUES (IFNULL((SELECT id_module FROM PREFIX_module m WHERE m.name = 'blockinfos' LIMIT 1), 0), 3); +INSERT INTO PREFIX_block_cms (`id_block`, `id_cms`) VALUES (IFNULL((SELECT id_module FROM PREFIX_module m WHERE m.name = 'blockinfos' LIMIT 1), 0), 4); +DELETE FROM PREFIX_block_cms WHERE id_block = 0; + +/* NEW TABS */ +UPDATE PREFIX_tab_lang + SET name = 'Vouchers' + WHERE id_lang = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'en' LIMIT 1) + AND id_tab = (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminDiscounts' LIMIT 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp), 'AdminCMS', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminCMS' LIMIT 1), + 'CMS' FROM PREFIX_lang); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminCMS' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp), 'AdminSubDomains', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSubDomains' LIMIT 1), + 'Subdomains' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Sous domaines' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminSubDomains') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSubDomains' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp), 'AdminOrderMessage', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminOrderMessage' LIMIT 1), + 'Order messages' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Messages prédéfinis' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminOrderMessage') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminOrderMessage' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp), 'AdminDeliverySlip', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminDeliverySlip' LIMIT 1), + 'Delivery slips' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Bons de livraison' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminDeliverySlip') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminDeliverySlip' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp), 'AdminBackup', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminTools' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminBackup' LIMIT 1), + 'Database backup' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Sauvegarde BDD' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminBackup') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminBackup' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminPreferences' LIMIT 1) AS tmp), 'AdminMeta', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminPreferences' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminMeta' LIMIT 1), + 'Meta-tags' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Méta-Tags' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminMeta') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminMeta' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp), 'AdminScenes', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminScenes' LIMIT 1), + 'Image mapping' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Scènes' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminScenes') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminScenes' LIMIT 1), 1, 1, 1, 1); + +/* NEW TEAM TAB */ +UPDATE PREFIX_tab SET position = 10 WHERE class_name = 'AdminTools'; +UPDATE PREFIX_tab SET position = 9 WHERE class_name = 'AdminPreferences'; +UPDATE PREFIX_tab SET position = 8, id_parent = 0 WHERE class_name = 'AdminEmployees'; +UPDATE PREFIX_tab SET position = 1, id_parent = 29 WHERE class_name = 'AdminProfiles'; +UPDATE PREFIX_tab SET position = 2, id_parent = 29 WHERE class_name = 'AdminAccess'; +UPDATE PREFIX_tab SET position = 3, id_parent = 29 WHERE class_name = 'AdminContacts'; +UPDATE PREFIX_tab SET position = 1 WHERE class_name = 'AdminLanguages'; +UPDATE PREFIX_tab SET position = 2 WHERE class_name = 'AdminTranslations'; +UPDATE PREFIX_tab SET position = 3 WHERE class_name = 'AdminTabs'; +UPDATE PREFIX_tab SET position = 4 WHERE class_name = 'AdminQuickAccesses'; +UPDATE PREFIX_tab SET position = 5 WHERE class_name = 'AdminAliases'; +UPDATE PREFIX_tab SET position = 6 WHERE class_name = 'AdminImport'; +UPDATE PREFIX_tab SET position = 7 WHERE class_name = 'AdminSubDomains'; + +/* UPDATE ORDER TABS */ +UPDATE PREFIX_tab SET class_name = 'AdminInvoices' WHERE class_name = 'AdminPrintPDF'; +UPDATE PREFIX_tab SET position = 1 WHERE class_name = 'AdminInvoices'; +UPDATE PREFIX_tab SET position = 2 WHERE class_name = 'AdminReturn'; +UPDATE PREFIX_tab SET position = 3 WHERE class_name = 'AdminSlip'; +UPDATE PREFIX_tab SET position = 4 WHERE class_name = 'AdminOrdersStates'; +UPDATE PREFIX_tab_lang SET name = 'Invoices' WHERE name = 'PDF Invoice'; +UPDATE PREFIX_tab_lang SET name = 'Factures' WHERE name = 'Facture PDF'; + +/* ##################################### */ +/* STATS */ +/* ##################################### */ +CREATE TABLE PREFIX_web_browser ( + id_web_browser INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(64) NULL, + PRIMARY KEY(id_web_browser) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_operating_system ( + id_operating_system INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(64) NULL, + PRIMARY KEY(id_operating_system) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_page_type ( + id_page_type INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(256) NOT NULL, + PRIMARY KEY(id_page_type) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_date_range ( + id_date_range INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + time_start DATETIME NOT NULL, + time_end DATETIME NOT NULL, + PRIMARY KEY(id_date_range) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_page ( + id_page INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, + id_page_type INTEGER(10) UNSIGNED NOT NULL, + id_object VARCHAR(256) NULL, + PRIMARY KEY(id_page) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_page_viewed ( + id_page INTEGER(10) UNSIGNED NOT NULL, + id_date_range INTEGER UNSIGNED NOT NULL, + counter INTEGER UNSIGNED NOT NULL, + PRIMARY KEY(id_page, id_date_range) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_guest ( + id_guest INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, + id_operating_system INTEGER(10) UNSIGNED NULL DEFAULT NULL, + id_web_browser INTEGER(10) UNSIGNED NULL DEFAULT NULL, + id_customer INTEGER(10) UNSIGNED NULL DEFAULT NULL, + javascript BOOL NULL DEFAULT 0, + screen_resolution_x SMALLINT UNSIGNED NULL DEFAULT NULL, + screen_resolution_y SMALLINT UNSIGNED NULL DEFAULT NULL, + screen_color TINYINT UNSIGNED NULL DEFAULT NULL, + sun_java BOOL NULL DEFAULT NULL, + adobe_flash BOOL NULL DEFAULT NULL, + adobe_director BOOL NULL DEFAULT NULL, + apple_quicktime BOOL NULL DEFAULT NULL, + real_player BOOL NULL DEFAULT NULL, + windows_media BOOL NULL DEFAULT NULL, + accept_language VARCHAR(8) NULL DEFAULT NULL, + PRIMARY KEY(id_guest) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_scene` ( + `id_scene` int(10) NOT NULL auto_increment, + `active` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`id_scene`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_scene_category` ( + `id_scene` int(10) NOT NULL, + `id_category` int(10) NOT NULL, + PRIMARY KEY (`id_scene`,`id_category`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_scene_lang` ( + `id_scene` int(10) NOT NULL, + `id_lang` int(10) NOT NULL, + `name` varchar(100) NOT NULL, + PRIMARY KEY (`id_scene`,`id_lang`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_scene_products` ( + `id_scene` int(10) NOT NULL, + `id_product` int(10) NOT NULL, + `x_axis` int(4) NOT NULL, + `y_axis` int(4) NOT NULL, + `zone_width` int(3) NOT NULL, + `zone_height` int(3) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO PREFIX_guest (id_customer) SELECT id_customer FROM PREFIX_customer; + +ALTER TABLE PREFIX_connections ADD id_guest INTEGER(10) UNSIGNED NULL AFTER id_connections; +ALTER TABLE PREFIX_connections ADD id_page INTEGER(10) UNSIGNED NOT NULL AFTER id_guest; +ALTER TABLE PREFIX_connections ADD http_referer VARCHAR(256) NULL; +ALTER TABLE PREFIX_connections CHANGE date date_add DATETIME NOT NULL; + +UPDATE PREFIX_connections, PREFIX_guest SET PREFIX_connections.id_guest=PREFIX_guest.id_guest WHERE PREFIX_connections.id_customer=PREFIX_guest.id_customer; +ALTER TABLE PREFIX_connections CHANGE id_guest id_guest INTEGER(10) UNSIGNED NOT NULL; +ALTER TABLE PREFIX_connections DROP id_customer; + +CREATE TABLE PREFIX_connections_page ( + id_connections INTEGER(10) UNSIGNED NOT NULL, + id_page INTEGER(10) UNSIGNED NOT NULL, + time_start DATETIME NOT NULL, + time_end DATETIME NULL, + PRIMARY KEY(id_connections, id_page, time_start) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_operating_system` (`name`) VALUES ('Windows XP'),('Windows Vista'),('MacOsX'),('Linux'); +INSERT INTO `PREFIX_web_browser` (`name`) VALUES ('Safari'),('Firefox 2.x'),('Firefox 3.x'),('Opera'),('IE 6.x'),('IE 7.x'),('IE 8.x'),('Google Chrome'); +INSERT INTO `PREFIX_page_type` (`name`) VALUES ('product.php'),('category.php'),('order.php'),('manufacturer.php'); + +INSERT INTO `PREFIX_hook` (`name`, `title`, `position`) VALUES +('AdminStatsModules', 'Stats - Modules', 1), +('GraphEngine', 'Graph Engines', 0), +('GridEngine', 'Grid Engines', 0); + +/* Temporary configuration variable used in the following query */ +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('TMP_ID_TAB_STATS', (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStats'), NOW(), NOW()); +INSERT INTO `PREFIX_tab` (`id_parent`, `class_name`, `position`) VALUES + ((SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'TMP_ID_TAB_STATS'), 'AdminStatsModules', 1); +INSERT INTO `PREFIX_tab` (`id_parent`, `class_name`, `position`) VALUES + ((SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'TMP_ID_TAB_STATS'), 'AdminStatsConf', 2); +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES + (1, (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsModules'), 'Modules'); +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES + (2, (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsModules'), 'Modules'); +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES + (1, (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsConf'), 'Settings'); +INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES + (2, (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsConf'), 'Configuration'); +INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) VALUES + (1, (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsModules'), 1, 1, 1, 1); +INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) VALUES + (1, (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsConf'), 1, 1, 1, 1); +DELETE FROM `PREFIX_configuration` WHERE `name` = 'TMP_ID_TAB_STATS'; + +/* ##################################### */ +/* DOUBLE LANGUAGE */ +/* ##################################### */ +INSERT IGNORE INTO `PREFIX_discount_type_lang` (`id_discount_type`, `id_lang`, `name`) + (SELECT `id_discount_type`, id_lang, (SELECT tl.`name` + FROM `PREFIX_discount_type_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_discount_type`=`PREFIX_discount_type`.`id_discount_type`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_discount_type`); + +INSERT IGNORE INTO `PREFIX_cms_lang` (`id_cms`, `id_lang`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `content`) + (SELECT `id_cms`, id_lang, + (SELECT tl.`link_rewrite` + FROM `PREFIX_cms_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_cms`=`PREFIX_cms`.`id_cms`), + (SELECT tl.`meta_description` + FROM `PREFIX_cms_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_cms`=`PREFIX_cms`.`id_cms`), + (SELECT tl.`meta_keywords` + FROM `PREFIX_cms_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_cms`=`PREFIX_cms`.`id_cms`), + (SELECT tl.`meta_title` + FROM `PREFIX_cms_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_cms`=`PREFIX_cms`.`id_cms`), + (SELECT tl.`content` + FROM `PREFIX_cms_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_cms`=`PREFIX_cms`.`id_cms`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_cms`); + +INSERT IGNORE INTO `PREFIX_meta_lang` (`id_meta`, `id_lang`, `description`, `keywords`, `title`) + (SELECT `id_meta`, id_lang, + (SELECT tl.`description` + FROM `PREFIX_meta_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_meta`=`PREFIX_meta`.`id_meta`), + (SELECT tl.`keywords` + FROM `PREFIX_meta_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_meta`=`PREFIX_meta`.`id_meta`), + (SELECT tl.`title` + FROM `PREFIX_meta_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_meta`=`PREFIX_meta`.`id_meta`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_meta`); + +INSERT IGNORE INTO `PREFIX_order_message_lang` (`id_order_message`, `id_lang`, `name`, `message`) + (SELECT `id_order_message`, id_lang, + (SELECT tl.`name` + FROM `PREFIX_order_message_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_order_message`=`PREFIX_order_message`.`id_order_message`), + (SELECT tl.`message` + FROM `PREFIX_order_message_lang` tl + WHERE tl.`id_lang` = (SELECT c.`value` + FROM `PREFIX_configuration` c + WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_order_message`=`PREFIX_order_message`.`id_order_message`) + FROM `PREFIX_lang` CROSS JOIN `PREFIX_order_message`); + +/* PHP */ +/* PHP:invoice_number_set(); */; +/* PHP:delivery_number_set(); */; +/* PHP:set_payment_module(); */; +/* PHP:set_discount_category(); */; diff --git a/install-dev/sql/upgrade/1.1.0.2.sql b/install-dev/sql/upgrade/1.1.0.2.sql new file mode 100644 index 000000000..ee56776c5 --- /dev/null +++ b/install-dev/sql/upgrade/1.1.0.2.sql @@ -0,0 +1,3 @@ +SET NAMES 'utf8'; + +/* ##################################### */ diff --git a/install-dev/sql/upgrade/1.1.0.3.sql b/install-dev/sql/upgrade/1.1.0.3.sql new file mode 100644 index 000000000..5fb70c0ab --- /dev/null +++ b/install-dev/sql/upgrade/1.1.0.3.sql @@ -0,0 +1,10 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +DROP TABLE IF EXISTS PREFIX_product_picture; + +/* PHP */ +/* PHP:moduleReinstaller('blockmyaccount'); */; diff --git a/install-dev/sql/upgrade/1.1.0.4.sql b/install-dev/sql/upgrade/1.1.0.4.sql new file mode 100644 index 000000000..1bd039324 --- /dev/null +++ b/install-dev/sql/upgrade/1.1.0.4.sql @@ -0,0 +1,28 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +ALTER TABLE PREFIX_order_detail + DROP `deleted`, + ADD product_quantity_cancelled INT(10) UNSIGNED NOT NULL AFTER product_quantity_return; + +ALTER TABLE PREFIX_customization ADD quantity INT(10) NOT NULL; + +ALTER TABLE PREFIX_order_return_detail ADD id_customization INT(10) NOT NULL DEFAULT 0 AFTER id_order_detail; +ALTER TABLE PREFIX_order_return_detail DROP PRIMARY KEY; +ALTER TABLE PREFIX_order_return_detail ADD PRIMARY KEY (id_order_return, id_order_detail, id_customization); + + +ALTER TABLE PREFIX_orders + CHANGE payment payment VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + CHANGE module module VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; + +/* ################################# */ +/* CONTENTS */ +/* ################################# */ + +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES + ('productOutOfStock', 'Product out of stock', 'Make action while product is out of stock', 1), + ('updateProductAttribute', 'Product attribute update', NULL, 1); diff --git a/install-dev/sql/upgrade/1.1.0.5.sql b/install-dev/sql/upgrade/1.1.0.5.sql new file mode 100644 index 000000000..08b08b3a5 --- /dev/null +++ b/install-dev/sql/upgrade/1.1.0.5.sql @@ -0,0 +1,20 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +ALTER TABLE PREFIX_product + CHANGE customizable customizable TINYINT(2) NOT NULL DEFAULT 0; +ALTER TABLE PREFIX_connections + CHANGE ip_address ip_address VARCHAR(16) NULL; +ALTER TABLE PREFIX_customer + ADD newsletter_date_add DATETIME NULL; +ALTER TABLE PREFIX_cart_product + ADD date_add DATETIME NOT NULL; + +/* ################################# */ +/* CONTENTS */ +/* ################################# */ + +/* PHP:add_required_customization_field_flag(); */; diff --git a/install-dev/sql/upgrade/1.2.0.1.sql b/install-dev/sql/upgrade/1.2.0.1.sql new file mode 100644 index 000000000..30f47381e --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.1.sql @@ -0,0 +1,1071 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +DROP TABLE IF EXISTS PREFIX_order_customization_return; + +ALTER TABLE PREFIX_cart + ADD id_guest INT UNSIGNED NULL AFTER id_customer; + +ALTER TABLE PREFIX_tab + ADD `module` varchar(64) NULL AFTER class_name; + +ALTER TABLE PREFIX_product + ADD `indexed` tinyint(1) NOT NULL default '0' AFTER `active`; + +ALTER TABLE PREFIX_orders + DROP INDEX `orders_customer`; +ALTER TABLE PREFIX_orders + ADD INDEX id_customer (id_customer); +ALTER TABLE PREFIX_orders + ADD valid INTEGER(1) UNSIGNED NOT NULL DEFAULT '0' AFTER delivery_date; +ALTER TABLE PREFIX_orders + ADD INDEX `id_cart` (`id_cart`); + +ALTER TABLE PREFIX_customer + ADD deleted TINYINT(1) NOT NULL DEFAULT '0' AFTER active; + +ALTER TABLE PREFIX_employee + ADD stats_date_to DATE NULL DEFAULT NULL AFTER last_passwd_gen; +ALTER TABLE PREFIX_employee + ADD stats_date_from DATE NULL DEFAULT NULL AFTER last_passwd_gen; + +ALTER TABLE PREFIX_order_state + ADD hidden TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER unremovable; + +ALTER TABLE PREFIX_carrier + ADD is_module TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER range_behavior; +ALTER TABLE PREFIX_carrier + ADD INDEX deleted (`deleted`, `active`); + +ALTER TABLE PREFIX_state + CHANGE iso_code `iso_code` char(4) NOT NULL; + +ALTER TABLE PREFIX_order_detail + CHANGE product_quantity_cancelled product_quantity_refunded INT(10) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE PREFIX_order_detail + ADD INDEX product_id (product_id); + +ALTER TABLE PREFIX_attribute_lang + ADD INDEX id_lang (`id_lang`, `name`); +ALTER TABLE PREFIX_attribute_lang + ADD INDEX id_lang_2 (`id_lang`); +ALTER TABLE PREFIX_attribute_lang + ADD INDEX id_attribute (`id_attribute`); + +ALTER TABLE PREFIX_block_cms + ADD PRIMARY KEY (`id_block`, `id_cms`); + +/* IGNORE because can raise error data truncated */ +ALTER IGNORE TABLE PREFIX_connections + CHANGE `http_referer` `http_referer` VARCHAR(255) DEFAULT NULL; + +ALTER TABLE PREFIX_connections + ADD INDEX `date_add` (`date_add`); + +ALTER TABLE PREFIX_customer + DROP INDEX `customer_email`; +ALTER TABLE PREFIX_customer + ADD UNIQUE `customer_email` (`email`); + +ALTER TABLE PREFIX_delivery + ADD INDEX id_zone (`id_zone`); +ALTER TABLE PREFIX_delivery + ADD INDEX id_carrier (`id_carrier`, `id_zone`); + +ALTER TABLE PREFIX_feature_product + ADD INDEX `id_feature` (`id_feature`); + +ALTER TABLE PREFIX_hook_module + DROP INDEX `hook_module_index`; +ALTER TABLE PREFIX_hook_module + ADD PRIMARY KEY (id_module,id_hook); +ALTER TABLE PREFIX_hook_module + ADD INDEX id_module (`id_module`); +ALTER TABLE PREFIX_hook_module + ADD INDEX id_hook (`id_hook`); + +ALTER TABLE PREFIX_module + CHANGE `active` `active` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0'; + +ALTER TABLE PREFIX_page + CHANGE `id_object` `id_object` INT UNSIGNED NULL DEFAULT NULL; +ALTER TABLE PREFIX_page + ADD INDEX `id_page_type` (`id_page_type`); +ALTER TABLE PREFIX_page + ADD INDEX `id_object` (`id_object`); + +ALTER TABLE PREFIX_page_type + CHANGE `name` `name` VARCHAR(255) NOT NULL; +ALTER TABLE PREFIX_page_type + ADD INDEX `name` (`name`); + +ALTER TABLE PREFIX_product_attribute + ADD INDEX reference (reference); +ALTER TABLE PREFIX_product_attribute + ADD INDEX supplier_reference (supplier_reference); + +ALTER TABLE PREFIX_product_lang + ADD INDEX id_product (id_product); +ALTER TABLE PREFIX_product_lang + ADD INDEX id_lang (id_lang); +ALTER TABLE PREFIX_product_lang + ADD INDEX `name` (`name`); +ALTER TABLE PREFIX_product_lang + ADD FULLTEXT KEY ftsname (`name`); + +ALTER TABLE PREFIX_cart_discount + ADD INDEX `id_discount` (`id_discount`); + +ALTER TABLE PREFIX_discount_category + ADD PRIMARY KEY (`id_category`,`id_discount`); + +ALTER TABLE PREFIX_image_lang + ADD INDEX id_image (id_image); + +ALTER TABLE PREFIX_range_price + CHANGE `delimiter1` `delimiter1` DECIMAL(13, 6) NOT NULL; +ALTER TABLE PREFIX_range_price + CHANGE `delimiter2` `delimiter2` DECIMAL(13, 6) NOT NULL; +ALTER TABLE PREFIX_range_price + CHANGE `id_carrier` `id_carrier` INT(10) UNSIGNED NOT NULL; +ALTER TABLE PREFIX_range_price + DROP INDEX `range_price_unique`; +ALTER TABLE PREFIX_range_price + ADD UNIQUE KEY `id_carrier` (`id_carrier`,`delimiter1`,`delimiter2`); + +ALTER TABLE PREFIX_range_weight + CHANGE `delimiter1` `delimiter1` DECIMAL(13, 6) NOT NULL; +ALTER TABLE PREFIX_range_weight + CHANGE `delimiter2` `delimiter2` DECIMAL(13, 6) NOT NULL; +ALTER TABLE PREFIX_range_weight + CHANGE `id_carrier` `id_carrier` INT(10) UNSIGNED NOT NULL; +ALTER TABLE PREFIX_range_weight + DROP INDEX `range_weight_unique`; +ALTER TABLE PREFIX_range_weight + ADD UNIQUE KEY `id_carrier` (`id_carrier`,`delimiter1`,`delimiter2`); + +ALTER TABLE PREFIX_scene_products + ADD PRIMARY KEY (`id_scene`, `id_product`, `x_axis`, `y_axis`); + +ALTER TABLE PREFIX_product_lang DROP INDEX fts; +ALTER TABLE PREFIX_product_lang DROP INDEX ftsname ; + +/* KEY management */ +ALTER TABLE PREFIX_attribute_lang DROP INDEX `id_lang_2`; +ALTER TABLE PREFIX_attribute_lang DROP INDEX `id_attribute`; +ALTER TABLE PREFIX_attribute_lang DROP INDEX `attribute_lang_index`, ADD PRIMARY KEY (`id_attribute`, `id_lang`); +ALTER TABLE PREFIX_carrier_zone DROP INDEX `carrier_zone_index`, ADD PRIMARY KEY (`id_carrier`, `id_zone`); +ALTER TABLE PREFIX_discount_category CHANGE `id_discount` `id_discount` int(11) NOT NULL AFTER `id_category`; +ALTER TABLE PREFIX_feature_product DROP INDEX `id_feature`; +ALTER TABLE PREFIX_hook_module DROP INDEX `id_module`; +ALTER TABLE PREFIX_image_lang DROP INDEX `id_image`; +ALTER TABLE PREFIX_product_lang DROP INDEX `id_product`; + +/* ############################################################ */ + +CREATE TABLE `PREFIX_customer_group` ( + `id_customer` int(10) unsigned NOT NULL, + `id_group` int(10) unsigned NOT NULL, + PRIMARY KEY `customer_group_index` (`id_customer`,`id_group`), + INDEX customer_login(id_group) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_category_group ( + id_category INTEGER UNSIGNED NOT NULL, + id_group INTEGER UNSIGNED NOT NULL, + INDEX category_group_index(id_category, id_group) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_group` ( + id_group INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + reduction DECIMAL(10,2) NOT NULL DEFAULT 0, + date_add DATETIME NOT NULL, + date_upd DATETIME NOT NULL, + PRIMARY KEY(id_group) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_group_lang ( + id_group INTEGER UNSIGNED NOT NULL, + id_lang INTEGER UNSIGNED NOT NULL, + name VARCHAR(32) NOT NULL, + UNIQUE INDEX attribute_lang_index(id_group, id_lang) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_message_readed ( + id_message INTEGER UNSIGNED NOT NULL, + id_employee INTEGER UNSIGNED NOT NULL, + date_add DATETIME NOT NULL, + PRIMARY KEY (id_message,id_employee) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attachment` ( + `id_attachment` int(10) unsigned NOT NULL auto_increment, + `file` varchar(40) NOT NULL, + `mime` varchar(32) NOT NULL, + PRIMARY KEY (`id_attachment`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_attachment_lang` ( + `id_attachment` int(10) unsigned NOT NULL auto_increment, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(32) default NULL, + `description` TEXT, + PRIMARY KEY (`id_attachment`, `id_lang`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_attachment` ( + `id_product` int(10) NOT NULL, + `id_attachment` int(10) NOT NULL, + PRIMARY KEY (`id_product`,`id_attachment`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_connections_source` ( + id_connections_source INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_connections INTEGER UNSIGNED NOT NULL, + http_referer VARCHAR(255) NULL, + request_uri VARCHAR(255) NULL, + keywords VARCHAR(255) NULL, + date_add DATETIME NOT NULL, + PRIMARY KEY (id_connections_source), + INDEX connections (id_connections), + INDEX orderby (date_add), + INDEX http_referer (`http_referer`), + INDEX request_uri(`request_uri`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_referrer` ( + `id_referrer` int(10) unsigned NOT NULL auto_increment, + `name` varchar(64) NOT NULL, + `passwd` varchar(32) default NULL, + `http_referer_regexp` varchar(64) default NULL, + `http_referer_like` varchar(64) default NULL, + `request_uri_regexp` varchar(64) default NULL, + `request_uri_like` varchar(64) default NULL, + `http_referer_regexp_not` varchar(64) default NULL, + `http_referer_like_not` varchar(64) default NULL, + `request_uri_regexp_not` varchar(64) default NULL, + `request_uri_like_not` varchar(64) default NULL, + `base_fee` decimal(5,2) NOT NULL default '0.00', + `percent_fee` decimal(5,2) NOT NULL default '0.00', + `click_fee` decimal(5,2) NOT NULL default '0.00', + `cache_visitors` int(11) default NULL, + `cache_visits` int(11) default NULL, + `cache_pages` int(11) default NULL, + `cache_registrations` int(11) default NULL, + `cache_orders` int(11) default NULL, + `cache_sales` decimal(10,2) default NULL, + `cache_reg_rate` decimal(5,4) default NULL, + `cache_order_rate` decimal(5,4) default NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_referrer`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_referrer_cache` ( + `id_connections_source` int(11) NOT NULL, + `id_referrer` int(11) NOT NULL, + PRIMARY KEY (`id_connections_source`, `id_referrer`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_search_engine` ( + id_search_engine INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + server VARCHAR(64) NOT NULL, + getvar VARCHAR(16) NOT NULL, + PRIMARY KEY(id_search_engine) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_module_group` ( + `id_module` INTEGER UNSIGNED NOT NULL, + `id_group` INTEGER NOT NULL, + PRIMARY KEY (`id_module`, `id_group`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_attribute_image` ( + `id_product_attribute` int(10) NOT NULL, + `id_image` int(10) NOT NULL, + PRIMARY KEY (`id_product_attribute`,`id_image`), + KEY `id_image` (`id_image`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_search_index` ( + `id_product` int(11) NOT NULL, + `id_word` int(11) NOT NULL, + `weight` tinyint(4) NOT NULL default '1', + PRIMARY KEY (`id_word`, `id_product`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_search_word` ( + `id_word` int(10) unsigned NOT NULL auto_increment, + `id_lang` int(10) unsigned NOT NULL, + `word` varchar(15) NOT NULL, + PRIMARY KEY (`id_word`), + UNIQUE KEY `id_lang` (`id_lang`,`word`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE PREFIX_timezone ( + id_timezone INTEGER UNSIGNED NOT NULL auto_increment, + name VARCHAR(32) NOT NULL, + PRIMARY KEY timezone_index(`id_timezone`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +INSERT INTO `PREFIX_order_state` (`id_order_state`, `invoice`, `send_email`, `color`, `unremovable`, `logable`, `delivery`) VALUES + (11, 0, 0, 'lightblue', 1, 0, 0); + +INSERT INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) VALUES + (11, 1, 'Awaiting PayPal payment', ''); +INSERT INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) VALUES + (11, 2, 'En attente du paiement par PayPal', ''); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_MINWORDLEN', '3', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_PNAME', '6', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_REF', '10', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_SHORTDESC', '1', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_DESC', '1', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_CNAME', '3', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_MNAME', '3', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_TAG', '4', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_ATTRIBUTE', '2', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_WEIGHT_FEATURE', '2', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_SEARCH_AJAX', '1', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('PS_TIMEZONE', '374', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES + ('BLOCKTAGS_NBR', '10', NOW(), NOW()); + +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES + ('extraCarrier', 'Extra carrier (module mode)', NULL, 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES + ('shoppingCartExtra', 'Shopping cart extra button', 'Display some specific informations', 1); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES + ('search', 'Search', NULL, 0); +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES + ('backBeforePayment', 'Redirect in order process', 'Redirect user to the module instead of displaying payment modules', 0); + +UPDATE PREFIX_orders o SET o.valid = IFNULL(( + SELECT os.logable + FROM PREFIX_order_history oh + LEFT JOIN PREFIX_order_state os ON os.id_order_state = oh.id_order_state + WHERE oh.id_order = o.id_order + ORDER BY oh.date_add DESC, oh.id_order_history DESC + LIMIT 1 +), 0); + +INSERT INTO `PREFIX_search_engine` (`id_search_engine`, `server`,`getvar`) VALUES + (1, 'google','q'), + (2, 'search.aol','query'), + (3, 'yandex.ru','text'), + (4, 'ask.com','q'), + (5, 'nhl.com','q'), + (6, 'search.yahoo','p'), + (7, 'baidu.com','wd'), + (8, 'search.lycos','query'), + (9, 'exalead','q'), + (10, 'search.live.com','q'), + (11, 'search.ke.voila','rdata'), + (12, 'altavista','q') + ON DUPLICATE KEY UPDATE server = server; + +/* GROUPS, CUSTOMERS GROUPS, & CATEGORY GROUPS */ +INSERT INTO `PREFIX_group` (`reduction`, `date_add`, `date_upd`) VALUES (0, NOW(), NOW()); +INSERT INTO `PREFIX_group_lang` (`id_lang`, `id_group`, `name`) ( + SELECT `id_lang`, + (SELECT `id_group` FROM `PREFIX_group` LIMIT 1), + 'Default' FROM `PREFIX_lang`); +UPDATE `PREFIX_group_lang` SET `name` = 'Défaut' + WHERE `id_group` = (SELECT `id_group` FROM `PREFIX_group` LIMIT 1) + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO `PREFIX_customer_group` (`id_customer`, `id_group`) + (SELECT `id_customer`, + (SELECT `id_group` FROM `PREFIX_group` LIMIT 1) FROM `PREFIX_customer`); +INSERT INTO `PREFIX_category_group` (`id_category`, `id_group`) + (SELECT `id_category`, + (SELECT `id_group` FROM `PREFIX_group` LIMIT 1) FROM `PREFIX_category`); + +/* NEW TABS */ +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp), 'AdminMessages', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminOrders' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminMessages' LIMIT 1), + 'Customer messages' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Messages clients' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminMessages') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminMessages' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp), 'AdminTracking', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminTracking' LIMIT 1), + 'Tracking' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Suivi' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminTracking') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminTracking' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminStats' LIMIT 1) AS tmp), 'AdminSearchEngines', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminStats' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSearchEngines' LIMIT 1), + 'Search Engines' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Moteurs de recherche' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminSearchEngines') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSearchEngines' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminStats' LIMIT 1) AS tmp), 'AdminReferrers', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminStats' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminReferrers' LIMIT 1), + 'Referrers' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Sites affluents' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminReferrers') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminReferrers' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCustomers' LIMIT 1) AS tmp), 'AdminGroups', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCustomers' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminGroups' LIMIT 1), + 'Groups' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Groupes' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminGroups') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminGroups' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCustomers' LIMIT 1) AS tmp), 'AdminCarts', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCustomers' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminCarts' LIMIT 1), + 'Carts' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Paniers' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminCarts') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminCarts' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp), 'AdminTags', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminTags' LIMIT 1), + 'Tags' FROM PREFIX_lang); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminTags' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminPreferences' LIMIT 1) AS tmp), 'AdminSearchConf', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminPreferences' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSearchConf' LIMIT 1), + 'Search' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Recherche' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminSearchConf') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminSearchConf' LIMIT 1), 1, 1, 1, 1); + +INSERT INTO PREFIX_tab (id_parent, class_name, position) VALUES ((SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp), 'AdminAttachments', (SELECT tmp.max FROM (SELECT MAX(position) max FROM `PREFIX_tab` WHERE id_parent = (SELECT tmp.`id_tab` FROM (SELECT `id_tab` FROM PREFIX_tab t WHERE t.class_name = 'AdminCatalog' LIMIT 1) AS tmp )) AS tmp)); +INSERT INTO PREFIX_tab_lang (id_lang, id_tab, name) ( + SELECT id_lang, + (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminAttachments' LIMIT 1), + 'Attachments' FROM PREFIX_lang); +UPDATE `PREFIX_tab_lang` SET `name` = 'Documents joints' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminAttachments') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); +INSERT INTO PREFIX_access (id_profile, id_tab, `view`, `add`, edit, `delete`) VALUES ('1', (SELECT id_tab FROM PREFIX_tab t WHERE t.class_name = 'AdminAttachments' LIMIT 1), 1, 1, 1, 1); + +/* CHANGE TABS */ +UPDATE `PREFIX_tab` SET `class_name` = 'AdminStatuses' WHERE `class_name` = 'AdminOrdersStates'; +UPDATE `PREFIX_tab_lang` SET `name` = 'Statuses' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminStatuses') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'en'); +UPDATE `PREFIX_tab_lang` SET `name` = 'Statuts' + WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` t WHERE t.class_name = 'AdminStatuses') + AND `id_lang` = (SELECT `id_lang` FROM `PREFIX_lang` l WHERE l.iso_code = 'fr'); + +INSERT IGNORE INTO PREFIX_product_attribute_image (id_image, id_product_attribute) + (SELECT id_image, id_product_attribute FROM PREFIX_product_attribute WHERE id_image IS NOT NULL); +/* ALTER query must stay here (right after the INSERT INTO PREFIX_product_attribute_image)! */ +ALTER TABLE PREFIX_product_attribute DROP id_image; + +UPDATE PREFIX_category_lang SET link_rewrite = 'home' WHERE id_category = 1; + +/* TIMEZONES */ + +INSERT INTO `PREFIX_timezone` (`id_timezone`, `name`) VALUES +(1, 'Africa/Abidjan'), +(2, 'Africa/Accra'), +(3, 'Africa/Addis_Ababa'), +(4, 'Africa/Algiers'), +(5, 'Africa/Asmara'), +(6, 'Africa/Asmera'), +(7, 'Africa/Bamako'), +(8, 'Africa/Bangui'), +(9, 'Africa/Banjul'), +(10, 'Africa/Bissau'), +(11, 'Africa/Blantyre'), +(12, 'Africa/Brazzaville'), +(13, 'Africa/Bujumbura'), +(14, 'Africa/Cairo'), +(15, 'Africa/Casablanca'), +(16, 'Africa/Ceuta'), +(17, 'Africa/Conakry'), +(18, 'Africa/Dakar'), +(19, 'Africa/Dar_es_Salaam'), +(20, 'Africa/Djibouti'), +(21, 'Africa/Douala'), +(22, 'Africa/El_Aaiun'), +(23, 'Africa/Freetown'), +(24, 'Africa/Gaborone'), +(25, 'Africa/Harare'), +(26, 'Africa/Johannesburg'), +(27, 'Africa/Kampala'), +(28, 'Africa/Khartoum'), +(29, 'Africa/Kigali'), +(30, 'Africa/Kinshasa'), +(31, 'Africa/Lagos'), +(32, 'Africa/Libreville'), +(33, 'Africa/Lome'), +(34, 'Africa/Luanda'), +(35, 'Africa/Lubumbashi'), +(36, 'Africa/Lusaka'), +(37, 'Africa/Malabo'), +(38, 'Africa/Maputo'), +(39, 'Africa/Maseru'), +(40, 'Africa/Mbabane'), +(41, 'Africa/Mogadishu'), +(42, 'Africa/Monrovia'), +(43, 'Africa/Nairobi'), +(44, 'Africa/Ndjamena'), +(45, 'Africa/Niamey'), +(46, 'Africa/Nouakchott'), +(47, 'Africa/Ouagadougou'), +(48, 'Africa/Porto-Novo'), +(49, 'Africa/Sao_Tome'), +(50, 'Africa/Timbuktu'), +(51, 'Africa/Tripoli'), +(52, 'Africa/Tunis'), +(53, 'Africa/Windhoek'), +(54, 'America/Adak'), +(55, 'America/Anchorage '), +(56, 'America/Anguilla'), +(57, 'America/Antigua'), +(58, 'America/Araguaina'), +(59, 'America/Argentina/Buenos_Aires'), +(60, 'America/Argentina/Catamarca'), +(61, 'America/Argentina/ComodRivadavia'), +(62, 'America/Argentina/Cordoba'), +(63, 'America/Argentina/Jujuy'), +(64, 'America/Argentina/La_Rioja'), +(65, 'America/Argentina/Mendoza'), +(66, 'America/Argentina/Rio_Gallegos'), +(67, 'America/Argentina/Salta'), +(68, 'America/Argentina/San_Juan'), +(69, 'America/Argentina/San_Luis'), +(70, 'America/Argentina/Tucuman'), +(71, 'America/Argentina/Ushuaia'), +(72, 'America/Aruba'), +(73, 'America/Asuncion'), +(74, 'America/Atikokan'), +(75, 'America/Atka'), +(76, 'America/Bahia'), +(77, 'America/Barbados'), +(78, 'America/Belem'), +(79, 'America/Belize'), +(80, 'America/Blanc-Sablon'), +(81, 'America/Boa_Vista'), +(82, 'America/Bogota'), +(83, 'America/Boise'), +(84, 'America/Buenos_Aires'), +(85, 'America/Cambridge_Bay'), +(86, 'America/Campo_Grande'), +(87, 'America/Cancun'), +(88, 'America/Caracas'), +(89, 'America/Catamarca'), +(90, 'America/Cayenne'), +(91, 'America/Cayman'), +(92, 'America/Chicago'), +(93, 'America/Chihuahua'), +(94, 'America/Coral_Harbour'), +(95, 'America/Cordoba'), +(96, 'America/Costa_Rica'), +(97, 'America/Cuiaba'), +(98, 'America/Curacao'), +(99, 'America/Danmarkshavn'), +(100, 'America/Dawson'), +(101, 'America/Dawson_Creek'), +(102, 'America/Denver'), +(103, 'America/Detroit'), +(104, 'America/Dominica'), +(105, 'America/Edmonton'), +(106, 'America/Eirunepe'), +(107, 'America/El_Salvador'), +(108, 'America/Ensenada'), +(109, 'America/Fort_Wayne'), +(110, 'America/Fortaleza'), +(111, 'America/Glace_Bay'), +(112, 'America/Godthab'), +(113, 'America/Goose_Bay'), +(114, 'America/Grand_Turk'), +(115, 'America/Grenada'), +(116, 'America/Guadeloupe'), +(117, 'America/Guatemala'), +(118, 'America/Guayaquil'), +(119, 'America/Guyana'), +(120, 'America/Halifax'), +(121, 'America/Havana'), +(122, 'America/Hermosillo'), +(123, 'America/Indiana/Indianapolis'), +(124, 'America/Indiana/Knox'), +(125, 'America/Indiana/Marengo'), +(126, 'America/Indiana/Petersburg'), +(127, 'America/Indiana/Tell_City'), +(128, 'America/Indiana/Vevay'), +(129, 'America/Indiana/Vincennes'), +(130, 'America/Indiana/Winamac'), +(131, 'America/Indianapolis'), +(132, 'America/Inuvik'), +(133, 'America/Iqaluit'), +(134, 'America/Jamaica'), +(135, 'America/Jujuy'), +(136, 'America/Juneau'), +(137, 'America/Kentucky/Louisville'), +(138, 'America/Kentucky/Monticello'), +(139, 'America/Knox_IN'), +(140, 'America/La_Paz'), +(141, 'America/Lima'), +(142, 'America/Los_Angeles'), +(143, 'America/Louisville'), +(144, 'America/Maceio'), +(145, 'America/Managua'), +(146, 'America/Manaus'), +(147, 'America/Marigot'), +(148, 'America/Martinique'), +(149, 'America/Mazatlan'), +(150, 'America/Mendoza'), +(151, 'America/Menominee'), +(152, 'America/Merida'), +(153, 'America/Mexico_City'), +(154, 'America/Miquelon'), +(155, 'America/Moncton'), +(156, 'America/Monterrey'), +(157, 'America/Montevideo'), +(158, 'America/Montreal'), +(159, 'America/Montserrat'), +(160, 'America/Nassau'), +(161, 'America/New_York'), +(162, 'America/Nipigon'), +(163, 'America/Nome'), +(164, 'America/Noronha'), +(165, 'America/North_Dakota/Center'), +(166, 'America/North_Dakota/New_Salem'), +(167, 'America/Panama'), +(168, 'America/Pangnirtung'), +(169, 'America/Paramaribo'), +(170, 'America/Phoenix'), +(171, 'America/Port-au-Prince'), +(172, 'America/Port_of_Spain'), +(173, 'America/Porto_Acre'), +(174, 'America/Porto_Velho'), +(175, 'America/Puerto_Rico'), +(176, 'America/Rainy_River'), +(177, 'America/Rankin_Inlet'), +(178, 'America/Recife'), +(179, 'America/Regina'), +(180, 'America/Resolute'), +(181, 'America/Rio_Branco'), +(182, 'America/Rosario'), +(183, 'America/Santarem'), +(184, 'America/Santiago'), +(185, 'America/Santo_Domingo'), +(186, 'America/Sao_Paulo'), +(187, 'America/Scoresbysund'), +(188, 'America/Shiprock'), +(189, 'America/St_Barthelemy'), +(190, 'America/St_Johns'), +(191, 'America/St_Kitts'), +(192, 'America/St_Lucia'), +(193, 'America/St_Thomas'), +(194, 'America/St_Vincent'), +(195, 'America/Swift_Current'), +(196, 'America/Tegucigalpa'), +(197, 'America/Thule'), +(198, 'America/Thunder_Bay'), +(199, 'America/Tijuana'), +(200, 'America/Toronto'), +(201, 'America/Tortola'), +(202, 'America/Vancouver'), +(203, 'America/Virgin'), +(204, 'America/Whitehorse'), +(205, 'America/Winnipeg'), +(206, 'America/Yakutat'), +(207, 'America/Yellowknife'), +(208, 'Antarctica/Casey'), +(209, 'Antarctica/Davis'), +(210, 'Antarctica/DumontDUrville'), +(211, 'Antarctica/Mawson'), +(212, 'Antarctica/McMurdo'), +(213, 'Antarctica/Palmer'), +(214, 'Antarctica/Rothera'), +(215, 'Antarctica/South_Pole'), +(216, 'Antarctica/Syowa'), +(217, 'Antarctica/Vostok'), +(218, 'Arctic/Longyearbyen'), +(219, 'Asia/Aden'), +(220, 'Asia/Almaty'), +(221, 'Asia/Amman'), +(222, 'Asia/Anadyr'), +(223, 'Asia/Aqtau'), +(224, 'Asia/Aqtobe'), +(225, 'Asia/Ashgabat'), +(226, 'Asia/Ashkhabad'), +(227, 'Asia/Baghdad'), +(228, 'Asia/Bahrain'), +(229, 'Asia/Baku'), +(230, 'Asia/Bangkok'), +(231, 'Asia/Beirut'), +(232, 'Asia/Bishkek'), +(233, 'Asia/Brunei'), +(234, 'Asia/Calcutta'), +(235, 'Asia/Choibalsan'), +(236, 'Asia/Chongqing'), +(237, 'Asia/Chungking'), +(238, 'Asia/Colombo'), +(239, 'Asia/Dacca'), +(240, 'Asia/Damascus'), +(241, 'Asia/Dhaka'), +(242, 'Asia/Dili'), +(243, 'Asia/Dubai'), +(244, 'Asia/Dushanbe'), +(245, 'Asia/Gaza'), +(246, 'Asia/Harbin'), +(247, 'Asia/Ho_Chi_Minh'), +(248, 'Asia/Hong_Kong'), +(249, 'Asia/Hovd'), +(250, 'Asia/Irkutsk'), +(251, 'Asia/Istanbul'), +(252, 'Asia/Jakarta'), +(253, 'Asia/Jayapura'), +(254, 'Asia/Jerusalem'), +(255, 'Asia/Kabul'), +(256, 'Asia/Kamchatka'), +(257, 'Asia/Karachi'), +(258, 'Asia/Kashgar'), +(259, 'Asia/Kathmandu'), +(260, 'Asia/Katmandu'), +(261, 'Asia/Kolkata'), +(262, 'Asia/Krasnoyarsk'), +(263, 'Asia/Kuala_Lumpur'), +(264, 'Asia/Kuching'), +(265, 'Asia/Kuwait'), +(266, 'Asia/Macao'), +(267, 'Asia/Macau'), +(268, 'Asia/Magadan'), +(269, 'Asia/Makassar'), +(270, 'Asia/Manila'), +(271, 'Asia/Muscat'), +(272, 'Asia/Nicosia'), +(273, 'Asia/Novosibirsk'), +(274, 'Asia/Omsk'), +(275, 'Asia/Oral'), +(276, 'Asia/Phnom_Penh'), +(277, 'Asia/Pontianak'), +(278, 'Asia/Pyongyang'), +(279, 'Asia/Qatar'), +(280, 'Asia/Qyzylorda'), +(281, 'Asia/Rangoon'), +(282, 'Asia/Riyadh'), +(283, 'Asia/Saigon'), +(284, 'Asia/Sakhalin'), +(285, 'Asia/Samarkand'), +(286, 'Asia/Seoul'), +(287, 'Asia/Shanghai'), +(288, 'Asia/Singapore'), +(289, 'Asia/Taipei'), +(290, 'Asia/Tashkent'), +(291, 'Asia/Tbilisi'), +(292, 'Asia/Tehran'), +(293, 'Asia/Tel_Aviv'), +(294, 'Asia/Thimbu'), +(295, 'Asia/Thimphu'), +(296, 'Asia/Tokyo'), +(297, 'Asia/Ujung_Pandang'), +(298, 'Asia/Ulaanbaatar'), +(299, 'Asia/Ulan_Bator'), +(300, 'Asia/Urumqi'), +(301, 'Asia/Vientiane'), +(302, 'Asia/Vladivostok'), +(303, 'Asia/Yakutsk'), +(304, 'Asia/Yekaterinburg'), +(305, 'Asia/Yerevan'), +(306, 'Atlantic/Azores'), +(307, 'Atlantic/Bermuda'), +(308, 'Atlantic/Canary'), +(309, 'Atlantic/Cape_Verde'), +(310, 'Atlantic/Faeroe'), +(311, 'Atlantic/Faroe'), +(312, 'Atlantic/Jan_Mayen'), +(313, 'Atlantic/Madeira'), +(314, 'Atlantic/Reykjavik'), +(315, 'Atlantic/South_Georgia'), +(316, 'Atlantic/St_Helena'), +(317, 'Atlantic/Stanley'), +(318, 'Australia/ACT'), +(319, 'Australia/Adelaide'), +(320, 'Australia/Brisbane'), +(321, 'Australia/Broken_Hill'), +(322, 'Australia/Canberra'), +(323, 'Australia/Currie'), +(324, 'Australia/Darwin'), +(325, 'Australia/Eucla'), +(326, 'Australia/Hobart'), +(327, 'Australia/LHI'), +(328, 'Australia/Lindeman'), +(329, 'Australia/Lord_Howe'), +(330, 'Australia/Melbourne'), +(331, 'Australia/North'), +(332, 'Australia/NSW'), +(333, 'Australia/Perth'), +(334, 'Australia/Queensland'), +(335, 'Australia/South'), +(336, 'Australia/Sydney'), +(337, 'Australia/Tasmania'), +(338, 'Australia/Victoria'), +(339, 'Australia/West'), +(340, 'Australia/Yancowinna'), +(341, 'Europe/Amsterdam'), +(342, 'Europe/Andorra'), +(343, 'Europe/Athens'), +(344, 'Europe/Belfast'), +(345, 'Europe/Belgrade'), +(346, 'Europe/Berlin'), +(347, 'Europe/Bratislava'), +(348, 'Europe/Brussels'), +(349, 'Europe/Bucharest'), +(350, 'Europe/Budapest'), +(351, 'Europe/Chisinau'), +(352, 'Europe/Copenhagen'), +(353, 'Europe/Dublin'), +(354, 'Europe/Gibraltar'), +(355, 'Europe/Guernsey'), +(356, 'Europe/Helsinki'), +(357, 'Europe/Isle_of_Man'), +(358, 'Europe/Istanbul'), +(359, 'Europe/Jersey'), +(360, 'Europe/Kaliningrad'), +(361, 'Europe/Kiev'), +(362, 'Europe/Lisbon'), +(363, 'Europe/Ljubljana'), +(364, 'Europe/London'), +(365, 'Europe/Luxembourg'), +(366, 'Europe/Madrid'), +(367, 'Europe/Malta'), +(368, 'Europe/Mariehamn'), +(369, 'Europe/Minsk'), +(370, 'Europe/Monaco'), +(371, 'Europe/Moscow'), +(372, 'Europe/Nicosia'), +(373, 'Europe/Oslo'), +(374, 'Europe/Paris'), +(375, 'Europe/Podgorica'), +(376, 'Europe/Prague'), +(377, 'Europe/Riga'), +(378, 'Europe/Rome'), +(379, 'Europe/Samara'), +(380, 'Europe/San_Marino'), +(381, 'Europe/Sarajevo'), +(382, 'Europe/Simferopol'), +(383, 'Europe/Skopje'), +(384, 'Europe/Sofia'), +(385, 'Europe/Stockholm'), +(386, 'Europe/Tallinn'), +(387, 'Europe/Tirane'), +(388, 'Europe/Tiraspol'), +(389, 'Europe/Uzhgorod'), +(390, 'Europe/Vaduz'), +(391, 'Europe/Vatican'), +(392, 'Europe/Vienna'), +(393, 'Europe/Vilnius'), +(394, 'Europe/Volgograd'), +(395, 'Europe/Warsaw'), +(396, 'Europe/Zagreb'), +(397, 'Europe/Zaporozhye'), +(398, 'Europe/Zurich'), +(399, 'Indian/Antananarivo'), +(400, 'Indian/Chagos'), +(401, 'Indian/Christmas'), +(402, 'Indian/Cocos'), +(403, 'Indian/Comoro'), +(404, 'Indian/Kerguelen'), +(405, 'Indian/Mahe'), +(406, 'Indian/Maldives'), +(407, 'Indian/Mauritius'), +(408, 'Indian/Mayotte'), +(409, 'Indian/Reunion'), +(410, 'Pacific/Apia'), +(411, 'Pacific/Auckland'), +(412, 'Pacific/Chatham'), +(413, 'Pacific/Easter'), +(414, 'Pacific/Efate'), +(415, 'Pacific/Enderbury'), +(416, 'Pacific/Fakaofo'), +(417, 'Pacific/Fiji'), +(418, 'Pacific/Funafuti'), +(419, 'Pacific/Galapagos'), +(420, 'Pacific/Gambier'), +(421, 'Pacific/Guadalcanal'), +(422, 'Pacific/Guam'), +(423, 'Pacific/Honolulu'), +(424, 'Pacific/Johnston'), +(425, 'Pacific/Kiritimati'), +(426, 'Pacific/Kosrae'), +(427, 'Pacific/Kwajalein'), +(428, 'Pacific/Majuro'), +(429, 'Pacific/Marquesas'), +(430, 'Pacific/Midway'), +(431, 'Pacific/Nauru'), +(432, 'Pacific/Niue'), +(433, 'Pacific/Norfolk'), +(434, 'Pacific/Noumea'), +(435, 'Pacific/Pago_Pago'), +(436, 'Pacific/Palau'), +(437, 'Pacific/Pitcairn'), +(438, 'Pacific/Ponape'), +(439, 'Pacific/Port_Moresby'), +(440, 'Pacific/Rarotonga'), +(441, 'Pacific/Saipan'), +(442, 'Pacific/Samoa'), +(443, 'Pacific/Tahiti'), +(444, 'Pacific/Tarawa'), +(445, 'Pacific/Tongatapu'), +(446, 'Pacific/Truk'), +(447, 'Pacific/Wake'), +(448, 'Pacific/Wallis'), +(449, 'Pacific/Yap'), +(450, 'Brazil/Acre'), +(451, 'Brazil/DeNoronha'), +(452, 'Brazil/East'), +(453, 'Brazil/West'), +(454, 'Canada/Atlantic'), +(455, 'Canada/Central'), +(456, 'Canada/East-Saskatchewan'), +(457, 'Canada/Eastern'), +(458, 'Canada/Mountain'), +(459, 'Canada/Newfoundland'), +(460, 'Canada/Pacific'), +(461, 'Canada/Saskatchewan'), +(462, 'Canada/Yukon'), +(463, 'CET'), +(464, 'Chile/Continental'), +(465, 'Chile/EasterIsland'), +(466, 'CST6CDT'), +(467, 'Cuba'), +(468, 'EET'), +(469, 'Egypt'), +(470, 'Eire'), +(471, 'EST'), +(472, 'EST5EDT'), +(473, 'Etc/GMT'), +(474, 'Etc/GMT+0'), +(475, 'Etc/GMT+1'), +(476, 'Etc/GMT+10'), +(477, 'Etc/GMT+11'), +(478, 'Etc/GMT+12'), +(479, 'Etc/GMT+2'), +(480, 'Etc/GMT+3'), +(481, 'Etc/GMT+4'), +(482, 'Etc/GMT+5'), +(483, 'Etc/GMT+6'), +(484, 'Etc/GMT+7'), +(485, 'Etc/GMT+8'), +(486, 'Etc/GMT+9'), +(487, 'Etc/GMT-0'), +(488, 'Etc/GMT-1'), +(489, 'Etc/GMT-10'), +(490, 'Etc/GMT-11'), +(491, 'Etc/GMT-12'), +(492, 'Etc/GMT-13'), +(493, 'Etc/GMT-14'), +(494, 'Etc/GMT-2'), +(495, 'Etc/GMT-3'), +(496, 'Etc/GMT-4'), +(497, 'Etc/GMT-5'), +(498, 'Etc/GMT-6'), +(499, 'Etc/GMT-7'), +(500, 'Etc/GMT-8'), +(501, 'Etc/GMT-9'), +(502, 'Etc/GMT0'), +(503, 'Etc/Greenwich'), +(504, 'Etc/UCT'), +(505, 'Etc/Universal'), +(506, 'Etc/UTC'), +(507, 'Etc/Zulu'), +(508, 'Factory'), +(509, 'GB'), +(510, 'GB-Eire'), +(511, 'GMT'), +(512, 'GMT+0'), +(513, 'GMT-0'), +(514, 'GMT0'), +(515, 'Greenwich'), +(516, 'Hongkong'), +(517, 'HST'), +(518, 'Iceland'), +(519, 'Iran'), +(520, 'Israel'), +(521, 'Jamaica'), +(522, 'Japan'), +(523, 'Kwajalein'), +(524, 'Libya'), +(525, 'MET'), +(526, 'Mexico/BajaNorte'), +(527, 'Mexico/BajaSur'), +(528, 'Mexico/General'), +(529, 'MST'), +(530, 'MST7MDT'), +(531, 'Navajo'), +(532, 'NZ'), +(533, 'NZ-CHAT'), +(534, 'Poland'), +(535, 'Portugal'), +(536, 'PRC'), +(537, 'PST8PDT'), +(538, 'ROC'), +(539, 'ROK'), +(540, 'Singapore'), +(541, 'Turkey'), +(542, 'UCT'), +(543, 'Universal'), +(544, 'US/Alaska'), +(545, 'US/Aleutian'), +(546, 'US/Arizona'), +(547, 'US/Central'), +(548, 'US/East-Indiana'), +(549, 'US/Eastern'), +(550, 'US/Hawaii'), +(551, 'US/Indiana-Starke'), +(552, 'US/Michigan'), +(553, 'US/Mountain'), +(554, 'US/Pacific'), +(555, 'US/Pacific-New'), +(556, 'US/Samoa'), +(557, 'UTC'), +(558, 'W-SU'), +(559, 'WET'), +(560, 'Zulu'); + +/* PHP:blocknewsletter(); */; +/* PHP:set_payment_module_group(); */; +/* PHP:add_new_tab(AdminGenerator, fr:Générateurs|es:Generadores|en:Generators|de:Generatoren|it:Generatori, 9); */; diff --git a/install-dev/sql/upgrade/1.2.0.2.sql b/install-dev/sql/upgrade/1.2.0.2.sql new file mode 100644 index 000000000..605edb065 --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.2.sql @@ -0,0 +1,610 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +CREATE TABLE `PREFIX_pack` ( + `id_product_pack` int(10) unsigned NOT NULL, + `id_product_item` int(10) unsigned NOT NULL, + `quantity` int(10) unsigned NOT NULL DEFAULT 1, + PRIMARY KEY (`id_product_pack`,`id_product_item`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_manufacturer_lang` + ADD `short_description` VARCHAR( 254 ) NULL DEFAULT NULL; +ALTER TABLE `PREFIX_manufacturer_lang` + ADD `meta_title` VARCHAR( 254 ) NULL DEFAULT NULL; +ALTER TABLE `PREFIX_manufacturer_lang` + ADD `meta_keywords` VARCHAR( 254 ) NULL DEFAULT NULL; +ALTER TABLE `PREFIX_manufacturer_lang` + ADD `meta_description` VARCHAR( 254 ) NULL DEFAULT NULL; + +ALTER TABLE `PREFIX_supplier_lang` + ADD `meta_title` VARCHAR( 254 ) NULL DEFAULT NULL; +ALTER TABLE `PREFIX_supplier_lang` + ADD `meta_keywords` VARCHAR( 254 ) NULL DEFAULT NULL; +ALTER TABLE `PREFIX_supplier_lang` + ADD `meta_description` VARCHAR( 254 ) NULL DEFAULT NULL; + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +TRUNCATE TABLE `PREFIX_timezone`; +INSERT INTO `PREFIX_timezone` (`name`) VALUES + ('Africa/Abidjan'), + ('Africa/Accra'), + ('Africa/Addis_Ababa'), + ('Africa/Algiers'), + ('Africa/Asmara'), + ('Africa/Asmera'), + ('Africa/Bamako'), + ('Africa/Bangui'), + ('Africa/Banjul'), + ('Africa/Bissau'), + ('Africa/Blantyre'), + ('Africa/Brazzaville'), + ('Africa/Bujumbura'), + ('Africa/Cairo'), + ('Africa/Casablanca'), + ('Africa/Ceuta'), + ('Africa/Conakry'), + ('Africa/Dakar'), + ('Africa/Dar_es_Salaam'), + ('Africa/Djibouti'), + ('Africa/Douala'), + ('Africa/El_Aaiun'), + ('Africa/Freetown'), + ('Africa/Gaborone'), + ('Africa/Harare'), + ('Africa/Johannesburg'), + ('Africa/Kampala'), + ('Africa/Khartoum'), + ('Africa/Kigali'), + ('Africa/Kinshasa'), + ('Africa/Lagos'), + ('Africa/Libreville'), + ('Africa/Lome'), + ('Africa/Luanda'), + ('Africa/Lubumbashi'), + ('Africa/Lusaka'), + ('Africa/Malabo'), + ('Africa/Maputo'), + ('Africa/Maseru'), + ('Africa/Mbabane'), + ('Africa/Mogadishu'), + ('Africa/Monrovia'), + ('Africa/Nairobi'), + ('Africa/Ndjamena'), + ('Africa/Niamey'), + ('Africa/Nouakchott'), + ('Africa/Ouagadougou'), + ('Africa/Porto-Novo'), + ('Africa/Sao_Tome'), + ('Africa/Timbuktu'), + ('Africa/Tripoli'), + ('Africa/Tunis'), + ('Africa/Windhoek'), + ('America/Adak'), + ('America/Anchorage '), + ('America/Anguilla'), + ('America/Antigua'), + ('America/Araguaina'), + ('America/Argentina/Buenos_Aires'), + ('America/Argentina/Catamarca'), + ('America/Argentina/ComodRivadavia'), + ('America/Argentina/Cordoba'), + ('America/Argentina/Jujuy'), + ('America/Argentina/La_Rioja'), + ('America/Argentina/Mendoza'), + ('America/Argentina/Rio_Gallegos'), + ('America/Argentina/Salta'), + ('America/Argentina/San_Juan'), + ('America/Argentina/San_Luis'), + ('America/Argentina/Tucuman'), + ('America/Argentina/Ushuaia'), + ('America/Aruba'), + ('America/Asuncion'), + ('America/Atikokan'), + ('America/Atka'), + ('America/Bahia'), + ('America/Barbados'), + ('America/Belem'), + ('America/Belize'), + ('America/Blanc-Sablon'), + ('America/Boa_Vista'), + ('America/Bogota'), + ('America/Boise'), + ('America/Buenos_Aires'), + ('America/Cambridge_Bay'), + ('America/Campo_Grande'), + ('America/Cancun'), + ('America/Caracas'), + ('America/Catamarca'), + ('America/Cayenne'), + ('America/Cayman'), + ('America/Chicago'), + ('America/Chihuahua'), + ('America/Coral_Harbour'), + ('America/Cordoba'), + ('America/Costa_Rica'), + ('America/Cuiaba'), + ('America/Curacao'), + ('America/Danmarkshavn'), + ('America/Dawson'), + ('America/Dawson_Creek'), + ('America/Denver'), + ('America/Detroit'), + ('America/Dominica'), + ('America/Edmonton'), + ('America/Eirunepe'), + ('America/El_Salvador'), + ('America/Ensenada'), + ('America/Fort_Wayne'), + ('America/Fortaleza'), + ('America/Glace_Bay'), + ('America/Godthab'), + ('America/Goose_Bay'), + ('America/Grand_Turk'), + ('America/Grenada'), + ('America/Guadeloupe'), + ('America/Guatemala'), + ('America/Guayaquil'), + ('America/Guyana'), + ('America/Halifax'), + ('America/Havana'), + ('America/Hermosillo'), + ('America/Indiana/Indianapolis'), + ('America/Indiana/Knox'), + ('America/Indiana/Marengo'), + ('America/Indiana/Petersburg'), + ('America/Indiana/Tell_City'), + ('America/Indiana/Vevay'), + ('America/Indiana/Vincennes'), + ('America/Indiana/Winamac'), + ('America/Indianapolis'), + ('America/Inuvik'), + ('America/Iqaluit'), + ('America/Jamaica'), + ('America/Jujuy'), + ('America/Juneau'), + ('America/Kentucky/Louisville'), + ('America/Kentucky/Monticello'), + ('America/Knox_IN'), + ('America/La_Paz'), + ('America/Lima'), + ('America/Los_Angeles'), + ('America/Louisville'), + ('America/Maceio'), + ('America/Managua'), + ('America/Manaus'), + ('America/Marigot'), + ('America/Martinique'), + ('America/Mazatlan'), + ('America/Mendoza'), + ('America/Menominee'), + ('America/Merida'), + ('America/Mexico_City'), + ('America/Miquelon'), + ('America/Moncton'), + ('America/Monterrey'), + ('America/Montevideo'), + ('America/Montreal'), + ('America/Montserrat'), + ('America/Nassau'), + ('America/New_York'), + ('America/Nipigon'), + ('America/Nome'), + ('America/Noronha'), + ('America/North_Dakota/Center'), + ('America/North_Dakota/New_Salem'), + ('America/Panama'), + ('America/Pangnirtung'), + ('America/Paramaribo'), + ('America/Phoenix'), + ('America/Port-au-Prince'), + ('America/Port_of_Spain'), + ('America/Porto_Acre'), + ('America/Porto_Velho'), + ('America/Puerto_Rico'), + ('America/Rainy_River'), + ('America/Rankin_Inlet'), + ('America/Recife'), + ('America/Regina'), + ('America/Resolute'), + ('America/Rio_Branco'), + ('America/Rosario'), + ('America/Santarem'), + ('America/Santiago'), + ('America/Santo_Domingo'), + ('America/Sao_Paulo'), + ('America/Scoresbysund'), + ('America/Shiprock'), + ('America/St_Barthelemy'), + ('America/St_Johns'), + ('America/St_Kitts'), + ('America/St_Lucia'), + ('America/St_Thomas'), + ('America/St_Vincent'), + ('America/Swift_Current'), + ('America/Tegucigalpa'), + ('America/Thule'), + ('America/Thunder_Bay'), + ('America/Tijuana'), + ('America/Toronto'), + ('America/Tortola'), + ('America/Vancouver'), + ('America/Virgin'), + ('America/Whitehorse'), + ('America/Winnipeg'), + ('America/Yakutat'), + ('America/Yellowknife'), + ('Antarctica/Casey'), + ('Antarctica/Davis'), + ('Antarctica/DumontDUrville'), + ('Antarctica/Mawson'), + ('Antarctica/McMurdo'), + ('Antarctica/Palmer'), + ('Antarctica/Rothera'), + ('Antarctica/South_Pole'), + ('Antarctica/Syowa'), + ('Antarctica/Vostok'), + ('Arctic/Longyearbyen'), + ('Asia/Aden'), + ('Asia/Almaty'), + ('Asia/Amman'), + ('Asia/Anadyr'), + ('Asia/Aqtau'), + ('Asia/Aqtobe'), + ('Asia/Ashgabat'), + ('Asia/Ashkhabad'), + ('Asia/Baghdad'), + ('Asia/Bahrain'), + ('Asia/Baku'), + ('Asia/Bangkok'), + ('Asia/Beirut'), + ('Asia/Bishkek'), + ('Asia/Brunei'), + ('Asia/Calcutta'), + ('Asia/Choibalsan'), + ('Asia/Chongqing'), + ('Asia/Chungking'), + ('Asia/Colombo'), + ('Asia/Dacca'), + ('Asia/Damascus'), + ('Asia/Dhaka'), + ('Asia/Dili'), + ('Asia/Dubai'), + ('Asia/Dushanbe'), + ('Asia/Gaza'), + ('Asia/Harbin'), + ('Asia/Ho_Chi_Minh'), + ('Asia/Hong_Kong'), + ('Asia/Hovd'), + ('Asia/Irkutsk'), + ('Asia/Istanbul'), + ('Asia/Jakarta'), + ('Asia/Jayapura'), + ('Asia/Jerusalem'), + ('Asia/Kabul'), + ('Asia/Kamchatka'), + ('Asia/Karachi'), + ('Asia/Kashgar'), + ('Asia/Kathmandu'), + ('Asia/Katmandu'), + ('Asia/Kolkata'), + ('Asia/Krasnoyarsk'), + ('Asia/Kuala_Lumpur'), + ('Asia/Kuching'), + ('Asia/Kuwait'), + ('Asia/Macao'), + ('Asia/Macau'), + ('Asia/Magadan'), + ('Asia/Makassar'), + ('Asia/Manila'), + ('Asia/Muscat'), + ('Asia/Nicosia'), + ('Asia/Novosibirsk'), + ('Asia/Omsk'), + ('Asia/Oral'), + ('Asia/Phnom_Penh'), + ('Asia/Pontianak'), + ('Asia/Pyongyang'), + ('Asia/Qatar'), + ('Asia/Qyzylorda'), + ('Asia/Rangoon'), + ('Asia/Riyadh'), + ('Asia/Saigon'), + ('Asia/Sakhalin'), + ('Asia/Samarkand'), + ('Asia/Seoul'), + ('Asia/Shanghai'), + ('Asia/Singapore'), + ('Asia/Taipei'), + ('Asia/Tashkent'), + ('Asia/Tbilisi'), + ('Asia/Tehran'), + ('Asia/Tel_Aviv'), + ('Asia/Thimbu'), + ('Asia/Thimphu'), + ('Asia/Tokyo'), + ('Asia/Ujung_Pandang'), + ('Asia/Ulaanbaatar'), + ('Asia/Ulan_Bator'), + ('Asia/Urumqi'), + ('Asia/Vientiane'), + ('Asia/Vladivostok'), + ('Asia/Yakutsk'), + ('Asia/Yekaterinburg'), + ('Asia/Yerevan'), + ('Atlantic/Azores'), + ('Atlantic/Bermuda'), + ('Atlantic/Canary'), + ('Atlantic/Cape_Verde'), + ('Atlantic/Faeroe'), + ('Atlantic/Faroe'), + ('Atlantic/Jan_Mayen'), + ('Atlantic/Madeira'), + ('Atlantic/Reykjavik'), + ('Atlantic/South_Georgia'), + ('Atlantic/St_Helena'), + ('Atlantic/Stanley'), + ('Australia/ACT'), + ('Australia/Adelaide'), + ('Australia/Brisbane'), + ('Australia/Broken_Hill'), + ('Australia/Canberra'), + ('Australia/Currie'), + ('Australia/Darwin'), + ('Australia/Eucla'), + ('Australia/Hobart'), + ('Australia/LHI'), + ('Australia/Lindeman'), + ('Australia/Lord_Howe'), + ('Australia/Melbourne'), + ('Australia/North'), + ('Australia/NSW'), + ('Australia/Perth'), + ('Australia/Queensland'), + ('Australia/South'), + ('Australia/Sydney'), + ('Australia/Tasmania'), + ('Australia/Victoria'), + ('Australia/West'), + ('Australia/Yancowinna'), + ('Europe/Amsterdam'), + ('Europe/Andorra'), + ('Europe/Athens'), + ('Europe/Belfast'), + ('Europe/Belgrade'), + ('Europe/Berlin'), + ('Europe/Bratislava'), + ('Europe/Brussels'), + ('Europe/Bucharest'), + ('Europe/Budapest'), + ('Europe/Chisinau'), + ('Europe/Copenhagen'), + ('Europe/Dublin'), + ('Europe/Gibraltar'), + ('Europe/Guernsey'), + ('Europe/Helsinki'), + ('Europe/Isle_of_Man'), + ('Europe/Istanbul'), + ('Europe/Jersey'), + ('Europe/Kaliningrad'), + ('Europe/Kiev'), + ('Europe/Lisbon'), + ('Europe/Ljubljana'), + ('Europe/London'), + ('Europe/Luxembourg'), + ('Europe/Madrid'), + ('Europe/Malta'), + ('Europe/Mariehamn'), + ('Europe/Minsk'), + ('Europe/Monaco'), + ('Europe/Moscow'), + ('Europe/Nicosia'), + ('Europe/Oslo'), + ('Europe/Paris'), + ('Europe/Podgorica'), + ('Europe/Prague'), + ('Europe/Riga'), + ('Europe/Rome'), + ('Europe/Samara'), + ('Europe/San_Marino'), + ('Europe/Sarajevo'), + ('Europe/Simferopol'), + ('Europe/Skopje'), + ('Europe/Sofia'), + ('Europe/Stockholm'), + ('Europe/Tallinn'), + ('Europe/Tirane'), + ('Europe/Tiraspol'), + ('Europe/Uzhgorod'), + ('Europe/Vaduz'), + ('Europe/Vatican'), + ('Europe/Vienna'), + ('Europe/Vilnius'), + ('Europe/Volgograd'), + ('Europe/Warsaw'), + ('Europe/Zagreb'), + ('Europe/Zaporozhye'), + ('Europe/Zurich'), + ('Indian/Antananarivo'), + ('Indian/Chagos'), + ('Indian/Christmas'), + ('Indian/Cocos'), + ('Indian/Comoro'), + ('Indian/Kerguelen'), + ('Indian/Mahe'), + ('Indian/Maldives'), + ('Indian/Mauritius'), + ('Indian/Mayotte'), + ('Indian/Reunion'), + ('Pacific/Apia'), + ('Pacific/Auckland'), + ('Pacific/Chatham'), + ('Pacific/Easter'), + ('Pacific/Efate'), + ('Pacific/Enderbury'), + ('Pacific/Fakaofo'), + ('Pacific/Fiji'), + ('Pacific/Funafuti'), + ('Pacific/Galapagos'), + ('Pacific/Gambier'), + ('Pacific/Guadalcanal'), + ('Pacific/Guam'), + ('Pacific/Honolulu'), + ('Pacific/Johnston'), + ('Pacific/Kiritimati'), + ('Pacific/Kosrae'), + ('Pacific/Kwajalein'), + ('Pacific/Majuro'), + ('Pacific/Marquesas'), + ('Pacific/Midway'), + ('Pacific/Nauru'), + ('Pacific/Niue'), + ('Pacific/Norfolk'), + ('Pacific/Noumea'), + ('Pacific/Pago_Pago'), + ('Pacific/Palau'), + ('Pacific/Pitcairn'), + ('Pacific/Ponape'), + ('Pacific/Port_Moresby'), + ('Pacific/Rarotonga'), + ('Pacific/Saipan'), + ('Pacific/Samoa'), + ('Pacific/Tahiti'), + ('Pacific/Tarawa'), + ('Pacific/Tongatapu'), + ('Pacific/Truk'), + ('Pacific/Wake'), + ('Pacific/Wallis'), + ('Pacific/Yap'), + ('Brazil/Acre'), + ('Brazil/DeNoronha'), + ('Brazil/East'), + ('Brazil/West'), + ('Canada/Atlantic'), + ('Canada/Central'), + ('Canada/East-Saskatchewan'), + ('Canada/Eastern'), + ('Canada/Mountain'), + ('Canada/Newfoundland'), + ('Canada/Pacific'), + ('Canada/Saskatchewan'), + ('Canada/Yukon'), + ('CET'), + ('Chile/Continental'), + ('Chile/EasterIsland'), + ('CST6CDT'), + ('Cuba'), + ('EET'), + ('Egypt'), + ('Eire'), + ('EST'), + ('EST5EDT'), + ('Etc/GMT'), + ('Etc/GMT+0'), + ('Etc/GMT+1'), + ('Etc/GMT+10'), + ('Etc/GMT+11'), + ('Etc/GMT+12'), + ('Etc/GMT+2'), + ('Etc/GMT+3'), + ('Etc/GMT+4'), + ('Etc/GMT+5'), + ('Etc/GMT+6'), + ('Etc/GMT+7'), + ('Etc/GMT+8'), + ('Etc/GMT+9'), + ('Etc/GMT-0'), + ('Etc/GMT-1'), + ('Etc/GMT-10'), + ('Etc/GMT-11'), + ('Etc/GMT-12'), + ('Etc/GMT-13'), + ('Etc/GMT-14'), + ('Etc/GMT-2'), + ('Etc/GMT-3'), + ('Etc/GMT-4'), + ('Etc/GMT-5'), + ('Etc/GMT-6'), + ('Etc/GMT-7'), + ('Etc/GMT-8'), + ('Etc/GMT-9'), + ('Etc/GMT0'), + ('Etc/Greenwich'), + ('Etc/UCT'), + ('Etc/Universal'), + ('Etc/UTC'), + ('Etc/Zulu'), + ('Factory'), + ('GB'), + ('GB-Eire'), + ('GMT'), + ('GMT+0'), + ('GMT-0'), + ('GMT0'), + ('Greenwich'), + ('Hongkong'), + ('HST'), + ('Iceland'), + ('Iran'), + ('Israel'), + ('Jamaica'), + ('Japan'), + ('Kwajalein'), + ('Libya'), + ('MET'), + ('Mexico/BajaNorte'), + ('Mexico/BajaSur'), + ('Mexico/General'), + ('MST'), + ('MST7MDT'), + ('Navajo'), + ('NZ'), + ('NZ-CHAT'), + ('Poland'), + ('Portugal'), + ('PRC'), + ('PST8PDT'), + ('ROC'), + ('ROK'), + ('Singapore'), + ('Turkey'), + ('UCT'), + ('Universal'), + ('US/Alaska'), + ('US/Aleutian'), + ('US/Arizona'), + ('US/Central'), + ('US/East-Indiana'), + ('US/Eastern'), + ('US/Hawaii'), + ('US/Indiana-Starke'), + ('US/Michigan'), + ('US/Mountain'), + ('US/Pacific'), + ('US/Pacific-New'), + ('US/Samoa'), + ('UTC'), + ('W-SU'), + ('WET'), + ('Zulu'); + +DELETE FROM `PREFIX_discount_category` +WHERE `id_discount` IN ( + SELECT `id_discount` FROM ( + SELECT dc.`id_discount` + FROM `PREFIX_discount_category` dc + LEFT JOIN `PREFIX_discount`d ON (d.`id_discount` = dc.`id_discount`) + WHERE d.`id_discount` IS NULL + GROUP BY dc.`id_discount`) discount_category_tmp + ); + +DELETE FROM `PREFIX_configuration` WHERE `name` = 'PS_DISPLAY_WITHOUT_TAX'; + +INSERT INTO PREFIX_hook (`name`, `title`, `description`, `position`) VALUES + ('updateCarrier', 'Carrier update', 'This hook is called when a carrier is updated', 0); diff --git a/install-dev/sql/upgrade/1.2.0.3.sql b/install-dev/sql/upgrade/1.2.0.3.sql new file mode 100644 index 000000000..9f6f078ee --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.3.sql @@ -0,0 +1,33 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +ALTER TABLE `PREFIX_customization` + ADD `quantity_refunded` INT NOT NULL DEFAULT '0'; +ALTER TABLE `PREFIX_customization` + ADD `quantity_returned` INT NOT NULL DEFAULT '0'; + +ALTER TABLE `PREFIX_alias` + CHANGE `id_alias` `id_alias` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; +ALTER TABLE `PREFIX_attribute_impact` + CHANGE `id_attribute_impact` `id_attribute_impact` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; +ALTER TABLE `PREFIX_customization` + CHANGE `id_customization` `id_customization` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; +ALTER TABLE `PREFIX_customization_field` + CHANGE `id_customization_field` `id_customization_field` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; +ALTER TABLE `PREFIX_subdomain` + CHANGE `id_subdomain` `id_subdomain` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT; + + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +INSERT INTO `PREFIX_search_engine` (`server`,`getvar`) VALUES + ('bing.com','q'); + +INSERT INTO `PREFIX_hook_module` (`id_module`, `id_hook`, `position`) VALUES + (19, 9, 1); + diff --git a/install-dev/sql/upgrade/1.2.0.4.sql b/install-dev/sql/upgrade/1.2.0.4.sql new file mode 100644 index 000000000..2b4f66a32 --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.4.sql @@ -0,0 +1,10 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + diff --git a/install-dev/sql/upgrade/1.2.0.5.sql b/install-dev/sql/upgrade/1.2.0.5.sql new file mode 100644 index 000000000..7512ab24a --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.5.sql @@ -0,0 +1,17 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +UPDATE `PREFIX_order_state_lang` +SET `name` = 'Shipped' +WHERE `id_order_state` = 4 AND `id_lang` = 1; + +UPDATE `PREFIX_order_state_lang` SET `template` = 'shipped' WHERE `id_order_state` = 4 AND `template` = 'shipping'; + +/* PHP:reorderpositions(); */; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.2.0.6.sql b/install-dev/sql/upgrade/1.2.0.6.sql new file mode 100644 index 000000000..fc88820b8 --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.6.sql @@ -0,0 +1,14 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +ALTER TABLE `PREFIX_configuration` DROP INDEX `configuration_name`; +ALTER TABLE `PREFIX_order_detail` ADD `product_quantity_in_stock` INT(10) NOT NULL DEFAULT 0 AFTER `product_quantity`; +ALTER TABLE `PREFIX_order_detail` ADD `product_quantity_reinjected` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `product_quantity_return`; + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ +UPDATE `PREFIX_product` SET `out_of_stock` = 0 WHERE `id_product` IN ((SELECT `id_product` FROM `PREFIX_product_download`)); diff --git a/install-dev/sql/upgrade/1.2.0.7.sql b/install-dev/sql/upgrade/1.2.0.7.sql new file mode 100644 index 000000000..5cd1d4109 --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.7.sql @@ -0,0 +1,12 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +/* PHP:update_modules_sql(); */; diff --git a/install-dev/sql/upgrade/1.2.0.8.sql b/install-dev/sql/upgrade/1.2.0.8.sql new file mode 100644 index 000000000..eeda18cd2 --- /dev/null +++ b/install-dev/sql/upgrade/1.2.0.8.sql @@ -0,0 +1,10 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ diff --git a/install-dev/sql/upgrade/1.2.1.0.sql b/install-dev/sql/upgrade/1.2.1.0.sql new file mode 100644 index 000000000..d11032a29 --- /dev/null +++ b/install-dev/sql/upgrade/1.2.1.0.sql @@ -0,0 +1,16 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +INSERT INTO PREFIX_configuration (name, value, date_add, date_upd) VALUES ('PS_THEME_V11', 0, NOW(), NOW()); + +/* PHP */ +/* PHP:update_carrier_url(); */; +/* PHP:moduleReinstaller('blocksearch'); */; diff --git a/install-dev/sql/upgrade/1.2.2.0.sql b/install-dev/sql/upgrade/1.2.2.0.sql new file mode 100644 index 000000000..27e0498df --- /dev/null +++ b/install-dev/sql/upgrade/1.2.2.0.sql @@ -0,0 +1,6 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_discount_category` ADD INDEX ( `id_discount` ); + +DELETE FROM `PREFIX_delivery` WHERE `id_range_weight` != NULL AND `id_range_weight` NOT IN (SELECT `id_range_weight` FROM `PREFIX_range_weight`); +DELETE FROM `PREFIX_delivery` WHERE `id_range_price` != NULL AND `id_range_weight` NOT IN (SELECT `id_range_price` FROM `PREFIX_range_price`); diff --git a/install-dev/sql/upgrade/1.2.3.0.sql b/install-dev/sql/upgrade/1.2.3.0.sql new file mode 100644 index 000000000..3f288763f --- /dev/null +++ b/install-dev/sql/upgrade/1.2.3.0.sql @@ -0,0 +1,3 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_category_product` ADD INDEX (`id_product`); diff --git a/install-dev/sql/upgrade/1.2.4.0.sql b/install-dev/sql/upgrade/1.2.4.0.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.2.4.0.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.2.5.0.sql b/install-dev/sql/upgrade/1.2.5.0.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.2.5.0.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.3.0.1.sql b/install-dev/sql/upgrade/1.3.0.1.sql new file mode 100644 index 000000000..b043fd51b --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.1.sql @@ -0,0 +1,92 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +ALTER TABLE `PREFIX_product` +CHANGE `reduction_from` `reduction_from` DATE NOT NULL DEFAULT '1970-01-01', +CHANGE `reduction_to` `reduction_to` DATE NOT NULL DEFAULT '1970-01-01'; + +ALTER TABLE `PREFIX_order_detail` CHANGE `tax_rate` `tax_rate` DECIMAL(10, 3) NOT NULL DEFAULT '0.000'; +ALTER TABLE `PREFIX_group` ADD `price_display_method` TINYINT NOT NULL DEFAULT 0 AFTER `reduction`; + +CREATE TABLE `PREFIX_carrier_group` ( + `id_carrier` int(10) unsigned NOT NULL, + `id_group` int(10) unsigned NOT NULL, + UNIQUE KEY `id_carrier` (`id_carrier`,`id_group`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_country` ADD `need_identification_number` TINYINT( 1 ) NOT NULL; +ALTER TABLE `PREFIX_customer` ADD `dni` VARCHAR( 16 ) NULL AFTER `firstname`; + +ALTER TABLE `PREFIX_image` ADD INDEX `product_position` (`id_product`, `position`); +ALTER TABLE `PREFIX_hook_module` ADD INDEX `id_module` (`id_module`); +ALTER TABLE `PREFIX_customer` ADD INDEX `id_customer_passwd` (`id_customer`, `passwd`); +ALTER TABLE `PREFIX_tag` ADD INDEX `id_lang` (`id_lang`); +ALTER TABLE `PREFIX_customer_group` ADD INDEX `id_customer` (`id_customer`); +ALTER TABLE `PREFIX_category_group` ADD INDEX `id_category` (`id_category`); +ALTER TABLE `PREFIX_image` ADD INDEX `id_product_cover` (`id_product`, `cover`); +ALTER TABLE `PREFIX_employee` ADD INDEX `id_employee_passwd` (`id_employee`, `passwd`); +ALTER TABLE `PREFIX_product_attribute` ADD INDEX `product_default` (`id_product`, `default_on`); +ALTER TABLE `PREFIX_product_download` ADD INDEX `product_active` (`id_product`, `active`); +ALTER TABLE `PREFIX_tab` ADD INDEX `class_name` (`class_name`); +ALTER TABLE `PREFIX_module_currency` ADD INDEX `id_module` (`id_module`); +ALTER TABLE `PREFIX_product_attribute_combination` ADD INDEX `id_product_attribute` (`id_product_attribute`); +ALTER TABLE `PREFIX_orders` ADD INDEX `invoice_number` (`invoice_number`); +ALTER TABLE `PREFIX_product_tag` ADD INDEX `id_tag` (`id_tag`); +ALTER TABLE `PREFIX_cms_lang` CHANGE `id_cms` `id_cms` INT(10) UNSIGNED NOT NULL; +ALTER TABLE `PREFIX_tax` CHANGE `rate` `rate` DECIMAL(10, 3) NOT NULL; + +ALTER TABLE `PREFIX_order_detail` ADD `discount_quantity_applied` TINYINT(1) NOT NULL DEFAULT 0 AFTER `ecotax`; +ALTER TABLE `PREFIX_orders` ADD `total_products_wt` DECIMAL(10, 2) NOT NULL AFTER `total_products`; + +/* ##################################### */ +/* CONTENTS */ +/* ##################################### */ + +UPDATE IGNORE `PREFIX_group` SET `price_display_method` = IFNULL((SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'PS_PRICE_DISPLAY'), 0); + +UPDATE `PREFIX_configuration` +SET `value` = ROUND(value / (1 + ( + SELECT rate FROM ( + SELECT t.`rate`, COUNT(*) n + FROM `PREFIX_orders` o + LEFT JOIN `PREFIX_carrier` c ON (o.`id_carrier` = c.`id_carrier`) + LEFT JOIN `PREFIX_tax` t ON (t.`id_tax` = c.`id_tax`) + WHERE c.`deleted` = 0 + AND c.`shipping_handling` = 1 + GROUP BY o.`id_carrier` + ORDER BY n DESC + LIMIT 1 + ) myrate +) / 100), 6) +WHERE `name` = 'PS_SHIPPING_HANDLING'; + +DELETE FROM `PREFIX_configuration` WHERE `name` = 'PS_PRICE_DISPLAY'; +DELETE FROM `PREFIX_product_attachment` WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product`); +DELETE FROM `PREFIX_discount_quantity` WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product`); +DELETE FROM `PREFIX_pack` WHERE `id_product_pack` NOT IN (SELECT `id_product` FROM `PREFIX_product`) OR `id_product_item` NOT IN (SELECT `id_product` FROM `PREFIX_product`); +DELETE FROM `PREFIX_product_sale` WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product`); +DELETE FROM `PREFIX_scene_products` WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product`); +DELETE FROM `PREFIX_search_index` WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product`); +DELETE FROM `PREFIX_search_word` WHERE `id_word` NOT IN (SELECT `id_word` FROM `PREFIX_search_index`); +DELETE FROM `PREFIX_tag` WHERE `id_lang` NOT IN (SELECT `id_lang` FROM `PREFIX_lang`); +DELETE FROM `PREFIX_search_word` WHERE `id_lang` NOT IN (SELECT `id_lang` FROM `PREFIX_lang`); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PRESTASTORE_LIVE', 1, NOW(), NOW()), +('PS_SHOW_ALL_MODULES', 0, NOW(), NOW()), +('PS_BACKUP_ALL', 0, NOW(), NOW()), +('PS_1_3_UPDATE_DATE', NOW(), NOW(), NOW()), +('PS_PRICE_ROUND_MODE', 2, NOW(), NOW()); +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES +('createAccountTop', 'Block above the form for create an account', NULL , '1'), +('backOfficeHeader', 'Administration panel header', NULL , '0'), +('backOfficeTop', 'Administration panel top hover the tabs', NULL , '1'), +('backOfficeFooter', 'Administration panel footer', NULL , '1'); + +INSERT INTO `PREFIX_carrier_group` (id_carrier, id_group) (SELECT id_carrier, id_group FROM `PREFIX_carrier` c, `PREFIX_group` g WHERE c.active = 1); + +/* PHP */ +/* PHP:convert_product_price(); */; diff --git a/install-dev/sql/upgrade/1.3.0.10.sql b/install-dev/sql/upgrade/1.3.0.10.sql new file mode 100644 index 000000000..5354e7131 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.10.sql @@ -0,0 +1,5 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_order_detail` ADD INDEX `id_order_id_order_detail` (`id_order`, `id_order_detail`); +ALTER TABLE `PREFIX_category_group` ADD INDEX `id_group` (`id_group`); +ALTER TABLE `PREFIX_product` ADD INDEX `date_add` (`date_add`); \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.3.0.2.sql b/install-dev/sql/upgrade/1.3.0.2.sql new file mode 100644 index 000000000..9069781e8 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.2.sql @@ -0,0 +1,147 @@ +SET NAMES 'utf8'; + +/* ##################################### */ +/* STRUCTURE */ +/* ##################################### */ + +ALTER TABLE `PREFIX_product_attachment` +CHANGE `id_product` `id_product` INT(10) UNSIGNED NOT NULL, +CHANGE `id_attachment` `id_attachment` INT(10) UNSIGNED NOT NULL; + +ALTER TABLE `PREFIX_attribute_impact` +CHANGE `id_product` `id_product` INT(11) UNSIGNED NOT NULL, +CHANGE `id_attribute` `id_attribute` INT(11) UNSIGNED NOT NULL; + +ALTER TABLE `PREFIX_block_cms` +CHANGE `id_block` `id_block` INT(10) UNSIGNED NOT NULL, +CHANGE `id_cms` `id_cms` INT(10) UNSIGNED NOT NULL; + +ALTER TABLE `PREFIX_customization` +CHANGE `id_cart` `id_cart` int(10) unsigned NOT NULL, +CHANGE `id_product_attribute` `id_product_attribute` int(10) unsigned NOT NULL default '0'; + +ALTER TABLE `PREFIX_customization_field` +CHANGE `id_product` `id_product` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_customization_field_lang` +CHANGE `id_customization_field` `id_customization_field` int(10) unsigned NOT NULL, +CHANGE `id_lang` `id_lang` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_customized_data` +CHANGE `id_customization` `id_customization` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_discount_category` +CHANGE `id_category` `id_category` int(11) unsigned NOT NULL, +CHANGE `id_discount` `id_discount` int(11) unsigned NOT NULL; + +ALTER TABLE `PREFIX_module_group` +CHANGE `id_group` `id_group` int(11) unsigned NOT NULL; + +ALTER TABLE `PREFIX_order_return_detail` +CHANGE `id_customization` `id_customization` int(10) unsigned NOT NULL default '0'; + +ALTER TABLE `PREFIX_product_attribute_image` +CHANGE `id_product_attribute` `id_product_attribute` int(10) unsigned NOT NULL, +CHANGE `id_image` `id_image` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_referrer_cache` +CHANGE `id_connections_source` `id_connections_source` int(11) unsigned NOT NULL, +CHANGE `id_referrer` `id_referrer` int(11) unsigned NOT NULL; + +ALTER TABLE `PREFIX_scene_category` +CHANGE `id_scene` `id_scene` int(10) unsigned NOT NULL, +CHANGE `id_category` `id_category` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_scene_lang` +CHANGE `id_scene` `id_scene` int(10) unsigned NOT NULL, +CHANGE `id_lang` `id_lang` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_scene_products` +CHANGE `id_scene` `id_scene` int(10) unsigned NOT NULL, +CHANGE `id_product` `id_product` int(10) unsigned NOT NULL; + +ALTER TABLE `PREFIX_search_index` +CHANGE `id_product` `id_product` int(11) unsigned NOT NULL, +CHANGE `id_word` `id_word` int(11) unsigned NOT NULL; + +ALTER TABLE `PREFIX_state` +CHANGE `id_country` `id_country` int(11) unsigned NOT NULL, +CHANGE `id_zone` `id_zone` int(11) unsigned NOT NULL; + +ALTER TABLE `PREFIX_category_lang` +CHANGE `meta_keywords` `meta_keywords` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, +CHANGE `meta_description` `meta_description` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ; + +ALTER TABLE `PREFIX_supplier_lang` +CHANGE `meta_title` `meta_title` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, +CHANGE `meta_keywords` `meta_keywords` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, +CHANGE `meta_description` `meta_description` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ; + +ALTER TABLE `PREFIX_manufacturer_lang` +CHANGE `meta_title` `meta_title` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, +CHANGE `meta_keywords` `meta_keywords` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, +CHANGE `meta_description` `meta_description` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ; + +ALTER TABLE `PREFIX_meta_lang` +CHANGE `title` `title` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ; + +/* ##################################### */ +/* PRICE RANGE */ +/* ##################################### */ + +ALTER TABLE `PREFIX_attribute_impact` CHANGE `price` `price` DECIMAL(17, 2) NOT NULL; + +ALTER TABLE `PREFIX_delivery` CHANGE `price` `price` DECIMAL(17, 2) NOT NULL; + +ALTER TABLE `PREFIX_discount` CHANGE `value` `value` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `minimal` `minimal` DECIMAL(17, 2) NULL DEFAULT NULL; + +ALTER TABLE `PREFIX_discount_quantity` CHANGE `value` `value` DECIMAL(17, 2) UNSIGNED NOT NULL; + +ALTER TABLE `PREFIX_group` CHANGE `reduction` `reduction` DECIMAL(17, 2) NOT NULL DEFAULT '0.00'; + +ALTER TABLE `PREFIX_orders` CHANGE `total_discounts` `total_discounts` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `total_paid` `total_paid` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `total_paid_real` `total_paid_real` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `total_products` `total_products` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `total_products_wt` `total_products_wt` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `total_shipping` `total_shipping` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `total_wrapping` `total_wrapping` DECIMAL(17, 2) NOT NULL DEFAULT '0.00'; + +ALTER TABLE `PREFIX_order_detail` CHANGE `product_price` `product_price` DECIMAL(20, 6) NOT NULL DEFAULT '0.000000', +CHANGE `product_quantity_discount` `product_quantity_discount` DECIMAL(20, 6) NOT NULL DEFAULT '0.000000', +CHANGE `ecotax` `ecotax` decimal(17,2) NOT NULL default '0.00'; + +ALTER TABLE `PREFIX_order_discount` CHANGE `value` `value` DECIMAL(17, 2) NOT NULL DEFAULT '0.00'; + +ALTER TABLE `PREFIX_product` CHANGE `price` `price` DECIMAL(20, 6) NOT NULL DEFAULT '0.000000', +CHANGE `wholesale_price` `wholesale_price` DECIMAL(20, 6) NOT NULL DEFAULT '0.000000', +CHANGE `ecotax` `ecotax` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `reduction_price` `reduction_price` DECIMAL(17, 2) NULL DEFAULT NULL; + +ALTER TABLE `PREFIX_product_attribute` CHANGE `wholesale_price` `wholesale_price` DECIMAL(20, 6) NOT NULL DEFAULT '0.000000', +CHANGE `price` `price` DECIMAL(17, 2) NOT NULL DEFAULT '0.00', +CHANGE `ecotax` `ecotax` DECIMAL(17, 2) NOT NULL DEFAULT '0.00'; + +ALTER TABLE `PREFIX_range_price` CHANGE `delimiter1` `delimiter1` DECIMAL(20, 6) NOT NULL, +CHANGE `delimiter2` `delimiter2` DECIMAL(20, 6) NOT NULL; + +ALTER TABLE `PREFIX_range_weight` CHANGE `delimiter1` `delimiter1` DECIMAL(20, 6) NOT NULL, +CHANGE `delimiter2` `delimiter2` DECIMAL(20, 6) NOT NULL; + +ALTER TABLE `PREFIX_referrer` CHANGE `cache_sales` `cache_sales` DECIMAL(17, 2) NULL DEFAULT NULL; + +UPDATE `PREFIX_configuration` +SET `value` = IFNULL(ROUND(value / (1 + ( + SELECT `rate` + FROM `PREFIX_tax` + WHERE `id_tax` = ( + SELECT `value` + FROM ( + SELECT `value` + FROM `PREFIX_configuration` + WHERE `name` = 'PS_GIFT_WRAPPING_TAX' + )tmp + ) +) / 100), 2), 0) +WHERE `name` = 'PS_GIFT_WRAPPING_PRICE'; diff --git a/install-dev/sql/upgrade/1.3.0.3.sql b/install-dev/sql/upgrade/1.3.0.3.sql new file mode 100644 index 000000000..7adb283eb --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.3.sql @@ -0,0 +1,15 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_tab` CHANGE `id_parent` `id_parent` INT(11) NOT NULL; +INSERT INTO `PREFIX_tab` (`id_tab`, `class_name`, `id_parent`, `position`) +VALUES (43, 'AdminSearch', -1, 0) +ON DUPLICATE KEY +UPDATE `id_parent` = -1; + +ALTER TABLE `PREFIX_search_engine` ADD UNIQUE (`server`,`getvar`); +REPLACE INTO `PREFIX_search_engine` (`server`,`getvar`) +VALUES ('google','q'),('aol','q'),('yandex','text'),('ask.com','q'),('nhl.com','q'),('yahoo','p'),('baidu','wd'), +('lycos','query'),('exalead','q'),('search.live','q'),('voila','rdata'),('altavista','q'),('bing','q'),('daum','q'), +('eniro','search_word'),('naver','query'),('msn','q'),('netscape','query'),('cnn','query'),('about','terms'),('mamma','query'), +('alltheweb','q'),('virgilio','qs'),('alice','qs'),('najdi','q'),('mama','query'),('seznam','q'),('onet','qt'),('szukacz','q'), +('yam','k'),('pchome','q'),('kvasir','q'),('sesam','q'),('ozu','q'),('terra','query'),('mynet','q'),('ekolay','q'),('rambler','words'); \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.3.0.4.sql b/install-dev/sql/upgrade/1.3.0.4.sql new file mode 100644 index 000000000..46ad8ccb4 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.4.sql @@ -0,0 +1,83 @@ +SET NAMES 'utf8'; + +DELETE FROM `PREFIX_tax_state` WHERE `id_tax` NOT IN (SELECT `id_tax` FROM `PREFIX_tax`); + +ALTER TABLE `PREFIX_product` CHANGE `reduction_from` `reduction_from` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00', +CHANGE `reduction_to` `reduction_to` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00'; + +UPDATE `PREFIX_product` +SET `reduction_to` = DATE_ADD(reduction_to, INTERVAL 1 DAY) +WHERE `reduction_from` != `reduction_to`; + +ALTER TABLE `PREFIX_discount` ADD `id_currency` INT UNSIGNED NOT NULL DEFAULT 0 AFTER `id_customer`; +UPDATE `PREFIX_discount` SET `id_currency` = (SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'PS_CURRENCY_DEFAULT' LIMIT 1) WHERE `id_discount_type` = 2; + +ALTER TABLE `PREFIX_address` ADD INDEX (id_country); +ALTER TABLE `PREFIX_address` ADD INDEX (id_state); +ALTER TABLE `PREFIX_address` ADD INDEX (id_manufacturer); +ALTER TABLE `PREFIX_address` ADD INDEX (id_supplier); +ALTER TABLE `PREFIX_carrier` ADD INDEX (id_tax); +ALTER TABLE `PREFIX_cart` ADD INDEX (id_address_delivery); +ALTER TABLE `PREFIX_cart` ADD INDEX (id_address_invoice); +ALTER TABLE `PREFIX_cart` ADD INDEX (id_carrier); +ALTER TABLE `PREFIX_cart` ADD INDEX (id_lang); +ALTER TABLE `PREFIX_cart` ADD INDEX (id_currency); +ALTER TABLE `PREFIX_cart_product` ADD INDEX (id_product_attribute); +ALTER TABLE `PREFIX_connections` ADD INDEX (id_page); +ALTER TABLE `PREFIX_customer` ADD INDEX (id_gender); +ALTER TABLE `PREFIX_customization` ADD INDEX (id_product_attribute); +ALTER TABLE `PREFIX_customization_field` ADD INDEX (id_product); +ALTER TABLE `PREFIX_delivery` ADD INDEX (id_range_price); +ALTER TABLE `PREFIX_delivery` ADD INDEX (id_range_weight); +ALTER TABLE `PREFIX_discount` ADD INDEX (id_discount_type); +ALTER TABLE `PREFIX_discount_quantity` ADD INDEX (id_discount_type); +ALTER TABLE `PREFIX_discount_quantity` ADD INDEX (id_product); +ALTER TABLE `PREFIX_discount_quantity` ADD INDEX (id_product_attribute); +ALTER TABLE `PREFIX_employee` ADD INDEX (id_profile); +ALTER TABLE `PREFIX_feature_product` ADD INDEX (id_feature_value); +ALTER TABLE `PREFIX_guest` ADD INDEX (id_operating_system); +ALTER TABLE `PREFIX_guest` ADD INDEX (id_web_browser); +ALTER TABLE `PREFIX_hook_module_exceptions` ADD INDEX (id_module); +ALTER TABLE `PREFIX_hook_module_exceptions` ADD INDEX (id_hook); +ALTER TABLE `PREFIX_message` ADD INDEX (id_cart); +ALTER TABLE `PREFIX_message` ADD INDEX (id_customer); +ALTER TABLE `PREFIX_message` ADD INDEX (id_employee); +ALTER TABLE `PREFIX_order_detail` ADD INDEX (product_attribute_id); +ALTER TABLE `PREFIX_order_discount` ADD INDEX (id_discount); +ALTER TABLE `PREFIX_order_history` ADD INDEX (id_employee); +ALTER TABLE `PREFIX_order_history` ADD INDEX (id_order_state); +ALTER TABLE `PREFIX_order_return` ADD INDEX (id_order); +ALTER TABLE `PREFIX_order_slip` ADD INDEX (id_order); +ALTER TABLE `PREFIX_orders` ADD INDEX (id_carrier); +ALTER TABLE `PREFIX_orders` ADD INDEX (id_lang); +ALTER TABLE `PREFIX_orders` ADD INDEX (id_currency); +ALTER TABLE `PREFIX_orders` ADD INDEX (id_address_delivery); +ALTER TABLE `PREFIX_orders` ADD INDEX (id_address_invoice); +ALTER TABLE `PREFIX_product` ADD INDEX (id_tax); +ALTER TABLE `PREFIX_product` ADD INDEX (id_category_default); +ALTER TABLE `PREFIX_product` ADD INDEX (id_color_default); +ALTER TABLE `PREFIX_state` ADD INDEX (id_country); +ALTER TABLE `PREFIX_state` ADD INDEX (id_zone); +ALTER TABLE `PREFIX_tab` ADD INDEX (id_parent); +ALTER TABLE `PREFIX_cart` ADD INDEX (id_guest); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) +( + SELECT 'MA_LAST_QTIES', '3', NOW(), NOW() + FROM `PREFIX_module` WHERE `name` = 'mailalerts' +); + +ALTER TABLE `PREFIX_customer` ADD `id_default_group` INT UNSIGNED NOT NULL DEFAULT '1' AFTER `id_gender`; + +UPDATE `PREFIX_customer` c SET `id_default_group` = ( + SELECT ( + IFNULL( + (SELECT g.`id_group` + FROM `PREFIX_group` g + LEFT JOIN `PREFIX_customer_group` cg ON (cg.`id_group` = g.`id_group`) + WHERE g.`reduction` > 0 AND cg.`id_customer` = c.`id_customer` + ORDER BY g.`reduction` + LIMIT 1) + , 1) + ) +); diff --git a/install-dev/sql/upgrade/1.3.0.5.sql b/install-dev/sql/upgrade/1.3.0.5.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.5.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.3.0.6.sql b/install-dev/sql/upgrade/1.3.0.6.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.6.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.3.0.7.sql b/install-dev/sql/upgrade/1.3.0.7.sql new file mode 100755 index 000000000..158212ef5 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.7.sql @@ -0,0 +1,3 @@ +SET NAMES 'utf8'; + +/* PHP:setAllGroupsOnHomeCategory(); */; diff --git a/install-dev/sql/upgrade/1.3.0.8.sql b/install-dev/sql/upgrade/1.3.0.8.sql new file mode 100644 index 000000000..e988c8279 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.8.sql @@ -0,0 +1,5 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_product_attribute` ADD INDEX `id_product_id_product_attribute` (`id_product_attribute` , `id_product`); +ALTER TABLE `PREFIX_image_lang` ADD INDEX `id_image` (`id_image`); + diff --git a/install-dev/sql/upgrade/1.3.0.9.sql b/install-dev/sql/upgrade/1.3.0.9.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.3.0.9.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.3.1.1.sql b/install-dev/sql/upgrade/1.3.1.1.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.3.1.1.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.3.2.1.sql b/install-dev/sql/upgrade/1.3.2.1.sql new file mode 100755 index 000000000..da21b32f2 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.2.1.sql @@ -0,0 +1,3 @@ +SET NAMES 'utf8'; + + diff --git a/install-dev/sql/upgrade/1.3.2.2.sql b/install-dev/sql/upgrade/1.3.2.2.sql new file mode 100755 index 000000000..180ac77b6 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.2.2.sql @@ -0,0 +1,27 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_order_detail` ADD `reduction_percent` DECIMAL(10, 2) NOT NULL AFTER `product_price`; +ALTER TABLE `PREFIX_order_detail` ADD `reduction_amount` DECIMAL(20, 6) NOT NULL AFTER `reduction_percent`; + +ALTER TABLE `PREFIX_country` CHANGE `need_identification_number` `need_identification_number` TINYINT(1) NOT NULL DEFAULT '0'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_1_3_2_UPDATE_DATE', NOW(), NOW(), NOW()); + +ALTER TABLE `PREFIX_search_index` CHANGE `weight` `weight` SMALLINT(4) unsigned NOT NULL DEFAULT '1'; + +ALTER TABLE `PREFIX_image` DROP INDEX `product_position`, ADD UNIQUE `product_position` (`id_product`, `position`); + +ALTER TABLE `PREFIX_zone` DROP `enabled`; + +SET @id_hook = (SELECT id_hook FROM PREFIX_hook WHERE name = 'backOfficeHeader'); +SET @position = (SELECT IFNULL(MAX(position),0)+1 FROM PREFIX_hook_module WHERE id_hook = @id_hook); +INSERT IGNORE INTO PREFIX_hook_module (id_hook, id_module, position) VALUES (@id_hook, (SELECT id_module FROM PREFIX_module WHERE name = 'statsbestcustomers'), @position); +SET @position = @position + 1; +INSERT IGNORE INTO PREFIX_hook_module (id_hook, id_module, position) VALUES (@id_hook, (SELECT id_module FROM PREFIX_module WHERE name = 'statsbestproducts'), @position); +SET @position = @position + 1; +INSERT IGNORE INTO PREFIX_hook_module (id_hook, id_module, position) VALUES (@id_hook, (SELECT id_module FROM PREFIX_module WHERE name = 'statsbestvouchers'), @position); +SET @position = @position + 1; +INSERT IGNORE INTO PREFIX_hook_module (id_hook, id_module, position) VALUES (@id_hook, (SELECT id_module FROM PREFIX_module WHERE name = 'statsbestcategories'), @position); +SET @position = @position + 1; +INSERT IGNORE INTO PREFIX_hook_module (id_hook, id_module, position) VALUES (@id_hook, (SELECT id_module FROM PREFIX_module WHERE name = 'statsbestcarriers'), @position); diff --git a/install-dev/sql/upgrade/1.3.2.3.sql b/install-dev/sql/upgrade/1.3.2.3.sql new file mode 100755 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.3.2.3.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.3.3.0.sql b/install-dev/sql/upgrade/1.3.3.0.sql new file mode 100644 index 000000000..a8c43bb44 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.3.0.sql @@ -0,0 +1,8 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_order_detail` ADD `group_reduction` DECIMAL(10, 2) NOT NULL AFTER `reduction_amount`; +ALTER TABLE `PREFIX_order_detail` ADD `ecotax_tax_rate` DECIMAL(5, 3) NOT NULL AFTER `ecotax`; +ALTER TABLE `PREFIX_product` CHANGE `ecotax` `ecotax` DECIMAL(21, 6) NOT NULL DEFAULT '0.00'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) SELECT 'PS_LOCALE_LANGUAGE', l.`iso_code`, NOW(), NOW() FROM `PREFIX_configuration` c INNER JOIN `PREFIX_lang` l ON (l.`id_lang` = c.`value`) WHERE c.`name` = 'PS_LANG_DEFAULT'; +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) SELECT 'PS_LOCALE_COUNTRY', co.`iso_code`, NOW(), NOW() FROM `PREFIX_configuration` c INNER JOIN `PREFIX_country` co ON (co.`id_country` = c.`value`) WHERE c.`name` = 'PS_COUNTRY_DEFAULT'; diff --git a/install-dev/sql/upgrade/1.3.4.0.sql b/install-dev/sql/upgrade/1.3.4.0.sql new file mode 100644 index 000000000..22c382dd4 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.4.0.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.3.5.0.sql b/install-dev/sql/upgrade/1.3.5.0.sql new file mode 100644 index 000000000..22c382dd4 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.5.0.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.3.6.0.sql b/install-dev/sql/upgrade/1.3.6.0.sql new file mode 100755 index 000000000..083171282 --- /dev/null +++ b/install-dev/sql/upgrade/1.3.6.0.sql @@ -0,0 +1,3 @@ +SET NAMES 'utf8'; + +/* PHP:update_products_ecotax_v133(); */; diff --git a/install-dev/sql/upgrade/1.3.7.0.sql b/install-dev/sql/upgrade/1.3.7.0.sql new file mode 100644 index 000000000..0b4cf1b2f --- /dev/null +++ b/install-dev/sql/upgrade/1.3.7.0.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; diff --git a/install-dev/sql/upgrade/1.4.0.1.sql b/install-dev/sql/upgrade/1.4.0.1.sql new file mode 100644 index 000000000..525c317c0 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.1.sql @@ -0,0 +1,2 @@ +SET NAMES 'utf8'; + diff --git a/install-dev/sql/upgrade/1.4.0.10.sql b/install-dev/sql/upgrade/1.4.0.10.sql new file mode 100644 index 000000000..64833005c --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.10.sql @@ -0,0 +1,20 @@ +SET NAMES 'utf8'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CATALOG_MODE', '0', NOW(), NOW()); + +ALTER TABLE `PREFIX_specific_price` DROP `priority`; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_GEOLOCATION_WHITELIST', '209.185.108;209.185.253;209.85.238;209.85.238.11;209.85.238.4;216.239.33.96;216.239.33.97;216.239.33.98;216.239.33.99;216.239.37.98;216.239.37.99;216.239.39.98;216.239.39.99;216.239.41.96;216.239.41.97;216.239.41.98;216.239.41.99;216.239.45.4;216.239.46;216.239.51.96;216.239.51.97;216.239.51.98;216.239.51.99;216.239.53.98;216.239.53.99;216.239.57.96;216.239.57.97;216.239.57.98;216.239.57.99;216.239.59.98;216.239.59.99;216.33.229.163;64.233.173.193;64.233.173.194;64.233.173.195;64.233.173.196;64.233.173.197;64.233.173.198;64.233.173.199;64.233.173.200;64.233.173.201;64.233.173.202;64.233.173.203;64.233.173.204;64.233.173.205;64.233.173.206;64.233.173.207;64.233.173.208;64.233.173.209;64.233.173.210;64.233.173.211;64.233.173.212;64.233.173.213;64.233.173.214;64.233.173.215;64.233.173.216;64.233.173.217;64.233.173.218;64.233.173.219;64.233.173.220;64.233.173.221;64.233.173.222;64.233.173.223;64.233.173.224;64.233.173.225;64.233.173.226;64.233.173.227;64.233.173.228;64.233.173.229;64.233.173.230;64.233.173.231;64.233.173.232;64.233.173.233;64.233.173.234;64.233.173.235;64.233.173.236;64.233.173.237;64.233.173.238;64.233.173.239;64.233.173.240;64.233.173.241;64.233.173.242;64.233.173.243;64.233.173.244;64.233.173.245;64.233.173.246;64.233.173.247;64.233.173.248;64.233.173.249;64.233.173.250;64.233.173.251;64.233.173.252;64.233.173.253;64.233.173.254;64.233.173.255;64.68.80;64.68.81;64.68.82;64.68.83;64.68.84;64.68.85;64.68.86;64.68.87;64.68.88;64.68.89;64.68.90.1;64.68.90.10;64.68.90.11;64.68.90.12;64.68.90.129;64.68.90.13;64.68.90.130;64.68.90.131;64.68.90.132;64.68.90.133;64.68.90.134;64.68.90.135;64.68.90.136;64.68.90.137;64.68.90.138;64.68.90.139;64.68.90.14;64.68.90.140;64.68.90.141;64.68.90.142;64.68.90.143;64.68.90.144;64.68.90.145;64.68.90.146;64.68.90.147;64.68.90.148;64.68.90.149;64.68.90.15;64.68.90.150;64.68.90.151;64.68.90.152;64.68.90.153;64.68.90.154;64.68.90.155;64.68.90.156;64.68.90.157;64.68.90.158;64.68.90.159;64.68.90.16;64.68.90.160;64.68.90.161;64.68.90.162;64.68.90.163;64.68.90.164;64.68.90.165;64.68.90.166;64.68.90.167;64.68.90.168;64.68.90.169;64.68.90.17;64.68.90.170;64.68.90.171;64.68.90.172;64.68.90.173;64.68.90.174;64.68.90.175;64.68.90.176;64.68.90.177;64.68.90.178;64.68.90.179;64.68.90.18;64.68.90.180;64.68.90.181;64.68.90.182;64.68.90.183;64.68.90.184;64.68.90.185;64.68.90.186;64.68.90.187;64.68.90.188;64.68.90.189;64.68.90.19;64.68.90.190;64.68.90.191;64.68.90.192;64.68.90.193;64.68.90.194;64.68.90.195;64.68.90.196;64.68.90.197;64.68.90.198;64.68.90.199;64.68.90.2;64.68.90.20;64.68.90.200;64.68.90.201;64.68.90.202;64.68.90.203;64.68.90.204;64.68.90.205;64.68.90.206;64.68.90.207;64.68.90.208;64.68.90.21;64.68.90.22;64.68.90.23;64.68.90.24;64.68.90.25;64.68.90.26;64.68.90.27;64.68.90.28;64.68.90.29;64.68.90.3;64.68.90.30;64.68.90.31;64.68.90.32;64.68.90.33;64.68.90.34;64.68.90.35;64.68.90.36;64.68.90.37;64.68.90.38;64.68.90.39;64.68.90.4;64.68.90.40;64.68.90.41;64.68.90.42;64.68.90.43;64.68.90.44;64.68.90.45;64.68.90.46;64.68.90.47;64.68.90.48;64.68.90.49;64.68.90.5;64.68.90.50;64.68.90.51;64.68.90.52;64.68.90.53;64.68.90.54;64.68.90.55;64.68.90.56;64.68.90.57;64.68.90.58;64.68.90.59;64.68.90.6;64.68.90.60;64.68.90.61;64.68.90.62;64.68.90.63;64.68.90.64;64.68.90.65;64.68.90.66;64.68.90.67;64.68.90.68;64.68.90.69;64.68.90.7;64.68.90.70;64.68.90.71;64.68.90.72;64.68.90.73;64.68.90.74;64.68.90.75;64.68.90.76;64.68.90.77;64.68.90.78;64.68.90.79;64.68.90.8;64.68.90.80;64.68.90.9;64.68.91;64.68.92;66.249.64;66.249.65;66.249.66;66.249.67;66.249.68;66.249.69;66.249.70;66.249.71;66.249.72;66.249.73;66.249.78;66.249.79;72.14.199;8.6.48', NOW(), NOW()); + +ALTER TABLE `PREFIX_address` ADD `dni` VARCHAR(16) NULL AFTER `vat_number`; + +UPDATE `PREFIX_address` a SET `dni` = ( + SELECT `dni` + FROM `PREFIX_customer` c + WHERE c.`id_customer` = a.`id_customer` +); + +ALTER TABLE `PREFIX_customer` DROP `dni`; + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('paymentTop', 'Top of payment page', 'Top of payment page', 0); diff --git a/install-dev/sql/upgrade/1.4.0.11.sql b/install-dev/sql/upgrade/1.4.0.11.sql new file mode 100644 index 000000000..f0ea8d56a --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.11.sql @@ -0,0 +1,35 @@ +CREATE TEMPORARY TABLE `PREFIX_tab_tmp` ( + `position` int(10) +); + +INSERT INTO `PREFIX_tab_tmp` (SELECT * FROM (SELECT `position` FROM `PREFIX_tab` WHERE `class_name` = 'AdminTaxes') AS tmp); +UPDATE `PREFIX_tab` SET `position` = (SELECT position FROM PREFIX_tab_tmp tmp) + 1 WHERE `class_name` = 'AdminTaxRulesGroup'; +DROP TABLE PREFIX_tab_tmp; + +DELETE FROM `PREFIX_configuration` WHERE `name` = 'PS_INVOICE_NUMBER'; + +CREATE TABLE `PREFIX_log` ( + `id_log` int(10) unsigned NOT NULL AUTO_INCREMENT, + `severity` tinyint(1) NOT NULL, + `error_code` int(11) DEFAULT NULL, + `message` text NOT NULL, + `object_type` varchar(32) DEFAULT NULL, + `object_id` int(10) unsigned DEFAULT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_log`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_LOGS_BY_EMAIL', '5', NOW(), NOW()); + +ALTER TABLE `PREFIX_tax_rules_group` CHANGE `name` `name` VARCHAR( 50 ) NOT NULL; + +CREATE TABLE `PREFIX_import_match` ( + `id_import_match` int(10) NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL, + `match` text NOT NULL, + `skip` int(2) NOT NULL, + PRIMARY KEY (`id_import_match`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +/* PHP:add_new_tab(AdminLogs, en:Log|fr:Log|es:Log|de:Log|it:Log, 9); */; diff --git a/install-dev/sql/upgrade/1.4.0.12.sql b/install-dev/sql/upgrade/1.4.0.12.sql new file mode 100644 index 000000000..9af34e070 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.12.sql @@ -0,0 +1,7 @@ +ALTER TABLE `PREFIX_product` CHANGE `ecotax` `ecotax` DECIMAL( 17, 6 ) NOT NULL DEFAULT '0.00'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_LAST_SHOP_UPDATE', NOW(), NOW(), NOW()); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_STORES_DISPLAY_SITEMAP', 1, NOW(), NOW()); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_COOKIE_CHECKIP', 1, NOW(), NOW()); \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.4.0.13.sql b/install-dev/sql/upgrade/1.4.0.13.sql new file mode 100644 index 000000000..22c382dd4 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.13.sql @@ -0,0 +1 @@ +SET NAMES 'utf8'; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.4.0.14.sql b/install-dev/sql/upgrade/1.4.0.14.sql new file mode 100644 index 000000000..959066ac0 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.14.sql @@ -0,0 +1,24 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_tax_rule` DROP PRIMARY KEY ; +ALTER TABLE `PREFIX_tax_rule` ADD `id_tax_rule` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ; +ALTER TABLE `PREFIX_tax_rule` ADD INDEX ( `id_tax` ) ; +ALTER TABLE `PREFIX_tax_rule` ADD INDEX ( `id_tax_rules_group` ) ; + +ALTER TABLE `PREFIX_address` MODIFY `dni` VARCHAR(16) NULL AFTER `vat_number`; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('BLOCKSTORE_IMG', 'store.jpg', NOW(), NOW()), +('PS_STORES_CENTER_LAT', '25.948969', NOW(), NOW()), +('PS_STORES_CENTER_LONG', '-80.226439', NOW(), NOW()); + +/* PHP:add_new_tab(AdminInformation, en:Configuration Information|fr:Informations|es:Informations|it:Informazioni di configurazione|de:Konfigurationsinformationen, 9); */; +/* PHP:add_new_tab(AdminPerformance, de:Leistung|en:Performance|it:Performance|fr:Performances|es:Rendimiento, 8); */; +/* PHP:add_new_tab(AdminCustomerThreads, en:Customer Service|de:Kundenservice|fr:SAV|es:Servicio al cliente|it:Servizio clienti, 29); */; +/* PHP:add_new_tab(AdminWebservice, fr:Service web|es:Web service|en:Webservice|de:Webservice|it:Webservice, 9); */; +/* PHP:add_new_tab(AdminAddonsCatalog, fr:Catalogue de modules et thèmes|de:Module und Themenkatalog|en:Modules & Themes Catalog|it:Moduli & Temi catalogo, 7); */; +/* PHP:add_new_tab(AdminAddonsMyAccount, it:Il mio Account|de:Mein Konto|fr:Mon compte|en:My Account, 7); */; +/* PHP:add_new_tab(AdminThemes, es:Temas|it:Temi|de:Themen|en:Themes|fr:Thèmes, 7); */; +/* PHP:add_new_tab(AdminGeolocation, es:Geolocalización|it:Geolocalizzazione|en:Geolocation|de:Geotargeting|fr:Géolocalisation, 8); */; +/* PHP:add_new_tab(AdminTaxRulesGroup, it:Regimi fiscali|es:Reglas de Impuestos|fr:Règles de taxes|de:Steuerregeln|en:Tax Rules, 4); */; +/* PHP:add_new_tab(AdminLogs, en:Log|fr:Log|es:Log|de:Log|it:Log, 9); */; diff --git a/install-dev/sql/upgrade/1.4.0.15.sql b/install-dev/sql/upgrade/1.4.0.15.sql new file mode 100644 index 000000000..7a0227965 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.15.sql @@ -0,0 +1,41 @@ +/* PHP:add_new_tab(AdminCounty, fr:Comtés|es:Condados|en:Counties|de:Counties|it:Counties, 5); */; + +ALTER TABLE `PREFIX_tax_rule` ADD `county_behavior` INT NOT NULL AFTER `state_behavior`; +ALTER TABLE `PREFIX_tax_rule` ADD `id_county` INT NOT NULL AFTER `state_behavior`; + +ALTER TABLE `PREFIX_tax_rule` ADD UNIQUE ( +`id_tax_rules_group` , +`id_country` , +`id_state` , +`id_county` +); + +CREATE TABLE `PREFIX_county` ( + `id_county` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(64) NOT NULL, + `id_state` int(11) NOT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id_county`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 ; + + +CREATE TABLE `PREFIX_county_zip_code` ( + `id_county` INT NOT NULL , + `from_zip_code` INT NOT NULL , + `to_zip_code` INT NOT NULL , + PRIMARY KEY ( `id_county` , `from_zip_code` , `to_zip_code` ) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_HOMEPAGE_PHP_SELF', 'index.php', NOW(), NOW()); + + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) +VALUES ('PS_USE_ECOTAX', + (SELECT IF((SELECT `ecotax` FROM `PREFIX_product` WHERE `ecotax` != 0 LIMIT 1),'1','0')), + NOW(), + NOW()); + +ALTER TABLE `PREFIX_hook` ADD `live_edit` TINYINT NOT NULL DEFAULT '0'; + +UPDATE `PREFIX_hook` SET `live_edit` = '1' WHERE `PREFIX_hook`.`name` IN ('rightColumn', 'leftColumn', 'home'); diff --git a/install-dev/sql/upgrade/1.4.0.16.sql b/install-dev/sql/upgrade/1.4.0.16.sql new file mode 100644 index 000000000..ed45cf3d2 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.16.sql @@ -0,0 +1,38 @@ +INSERT INTO `PREFIX_hook` (`id_hook`, `name`, `title`, `description`, `position`) +VALUES (NULL, 'afterCreateHtaccess', 'After htaccess creation', 'After htaccess creation', 0); + +UPDATE `PREFIX_meta_lang` SET `url_rewrite` = 'kontaktieren-sie-uns' WHERE id_meta = 3 AND id_lang = 4 AND url_rewrite = 'Kontaktieren Sie uns'; +UPDATE `PREFIX_meta_lang` SET `url_rewrite` = 'kennwort-wiederherstellung' WHERE id_meta = 7 AND id_lang = 4 AND url_rewrite = 'Kennwort Wiederherstellung'; +UPDATE `PREFIX_meta_lang` SET `url_rewrite` = 'il-mio-account' WHERE id_meta = 18 AND id_lang = 5 AND url_rewrite = 'il mio-account'; +UPDATE `PREFIX_meta_lang` SET `url_rewrite` = 'nota-di-ordine' WHERE id_meta = 20 AND id_lang = 5 AND url_rewrite = 'nota di-ordine'; + +INSERT INTO `PREFIX_meta` (`page`) VALUES ('order-opc'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) +( + SELECT `id_lang`, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-opc'), 'Order', 'quick-order' + FROM `PREFIX_lang` +); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('guest-tracking'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) +( + SELECT `id_lang`, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'guest-tracking'), 'Guest tracking', 'guest-tracking' + FROM `PREFIX_lang` +); + +UPDATE `PREFIX_hook` SET `live_edit` = '1' WHERE `PREFIX_hook`.`name` IN ('productfooter', 'payment'); + +UPDATE `PREFIX_configuration` SET name = 'PS_GEOLOCATION_ENABLED' WHERE name = 'PS_GEOLOCALIZATION_ENABLED'; +UPDATE `PREFIX_configuration` SET name = 'PS_GEOLOCATION_BEHAVIOR' WHERE name = 'PS_GEOLOCALIZATION_BEHAVIOR'; +UPDATE `PREFIX_configuration` SET name = 'PS_GEOLOCATION_WHITELIST' WHERE name = 'PS_GEOLOCALIZATION_WHITELIST'; +UPDATE `PREFIX_tab` SET class_name = 'AdminGeolocation' WHERE class_name = 'AdminGeolocalization'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_CANONICAL_REDIRECT', '0', NOW(), NOW()); + +ALTER TABLE `PREFIX_webservice_account` ADD `class_name` VARCHAR( 50 ) NOT NULL DEFAULT 'WebserviceRequest' AFTER `key`; +ALTER TABLE `PREFIX_webservice_account` ADD `description` text NULL AFTER `key`; + +/* PHP:add_new_tab(AdminHome, en:Home|fr:Accueil|es:Home|de:Home|it:Home, -1); */; +/* PHP:add_new_tab(AdminStockMvt, de:Lagerbewegungen|fr:Mouvements de Stock|it:Movimenti magazzino|en:Stock Movements, 1); */; +/* PHP:update_for_13version(); */; + diff --git a/install-dev/sql/upgrade/1.4.0.17.sql b/install-dev/sql/upgrade/1.4.0.17.sql new file mode 100644 index 000000000..dc6af7ab0 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.17.sql @@ -0,0 +1,22 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_stock_mvt_reason` ADD `sign` TINYINT(1) NOT NULL AFTER `id_stock_mvt_reason`; +UPDATE `PREFIX_stock_mvt_reason` SET `sign`=-1; +UPDATE `PREFIX_stock_mvt_reason` SET `sign`=1 WHERE `id_stock_mvt_reason`=3; +UPDATE `PREFIX_stock_mvt_reason` SET `id_stock_mvt_reason`=`id_stock_mvt_reason`+2 ORDER BY `id_stock_mvt_reason` DESC; +UPDATE `PREFIX_stock_mvt` SET `id_stock_mvt_reason`=`id_stock_mvt_reason`+2; +UPDATE `PREFIX_stock_mvt_reason_lang` SET `id_stock_mvt_reason`=`id_stock_mvt_reason`+2 ORDER BY `id_stock_mvt_reason` DESC; +INSERT INTO `PREFIX_stock_mvt_reason` (`id_stock_mvt_reason` ,`sign` ,`date_add` ,`date_upd`) VALUES ('1', '1', NOW(), NOW()), ('2', '-1', NOW(), NOW()); + +INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason` ,`id_lang` ,`name`) VALUES +('1', '1', 'Increase'), +('1', '2', 'Augmenter'), +('1', '3', 'Aumentar'), +('1', '4', 'Erhöhen'), +('1', '5', 'Aumento'), +('2', '1', 'Decrease'), +('2', '2', 'Diminuer'), +('2', '3', 'Disminuir'), +('2', '4', 'Reduzieren'), +('2', '5', 'Diminuzione'); + diff --git a/install-dev/sql/upgrade/1.4.0.2.sql b/install-dev/sql/upgrade/1.4.0.2.sql new file mode 100644 index 000000000..7a5b378ca --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.2.sql @@ -0,0 +1,694 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_employee` ADD `bo_color` varchar(32) default NULL AFTER `stats_date_to`; +ALTER TABLE `PREFIX_employee` ADD `bo_theme` varchar(32) default NULL AFTER `bo_color`; +ALTER TABLE `PREFIX_employee` ADD `bo_uimode` ENUM('hover','click') default 'click' AFTER `bo_theme`; +ALTER TABLE `PREFIX_employee` ADD `id_lang` int(10) unsigned NOT NULL default 0 AFTER `id_profile`; + +ALTER TABLE `PREFIX_cms` ADD `id_cms_category` int(10) unsigned NOT NULL default '0' AFTER `id_cms`; +ALTER TABLE `PREFIX_cms` ADD `position` int(10) unsigned NOT NULL default '0' AFTER `id_cms_category`; + +CREATE TABLE `PREFIX_cms_category` ( + `id_cms_category` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_parent` int(10) unsigned NOT NULL, + `level_depth` tinyint(3) unsigned NOT NULL DEFAULT '0', + `active` tinyint(1) unsigned NOT NULL DEFAULT '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + `position` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`id_cms_category`), + KEY `category_parent` (`id_parent`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_cms_category_lang` ( + `id_cms_category` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(128) NOT NULL, + `description` text, + `link_rewrite` varchar(128) NOT NULL, + `meta_title` varchar(128) DEFAULT NULL, + `meta_keywords` varchar(255) DEFAULT NULL, + `meta_description` varchar(255) DEFAULT NULL, + UNIQUE KEY `category_lang_index` (`id_cms_category`,`id_lang`), + KEY `category_name` (`name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_cms_category_lang` VALUES(1, 1, 'Home', '', 'home', NULL, NULL, NULL); +INSERT INTO `PREFIX_cms_category_lang` VALUES(1, 2, 'Accueil', '', 'home', NULL, NULL, NULL); +INSERT INTO `PREFIX_cms_category_lang` VALUES(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL); + +INSERT INTO `PREFIX_cms_category` VALUES(1, 0, 0, 1, NOW(), NOW(),0); + +UPDATE `PREFIX_cms_category` SET `position` = 0; +UPDATE `PREFIX_cms` SET `position` = 0; +UPDATE `PREFIX_cms` SET `id_cms_category` = 0; + +ALTER TABLE `PREFIX_category` ADD `position` int(10) unsigned NOT NULL default '0' AFTER `date_upd`; + +UPDATE `PREFIX_employee` SET `id_lang` = (SELECT `value` FROM `PREFIX_configuration` WHERE `name` LIKE "PS_LANG_DEFAULT"); + +ALTER TABLE `PREFIX_customer` ADD `note` text AFTER `secure_key`; + +ALTER TABLE `PREFIX_contact` ADD `customer_service` tinyint(1) NOT NULL DEFAULT 0 AFTER `email`; + +CREATE TABLE `PREFIX_customer_thread` ( + `id_customer_thread` int(11) unsigned NOT NULL auto_increment, + `id_lang` int(10) unsigned NOT NULL, + `id_contact` int(10) unsigned NOT NULL, + `id_customer` int(10) unsigned default NULL, + `id_order` int(10) unsigned default NULL, + `id_product` int(10) unsigned default NULL, + `status` enum('open','closed','pending1','pending2') NOT NULL default 'open', + `email` varchar(128) NOT NULL, + `token` varchar(12) default NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_customer_thread`), + KEY `id_customer_thread` (`id_customer_thread`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_customer_message` ( + `id_customer_message` int(10) unsigned NOT NULL auto_increment, + `id_customer_thread` int(11) default NULL, + `id_employee` int(10) unsigned default NULL, + `message` text NOT NULL, + `file_name` varchar(18) DEFAULT NULL, + `ip_address` int(11) default NULL, + `user_agent` varchar(128) default NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_customer_message`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_payment_cc` ( + `id_payment_cc` INT NOT NULL auto_increment, + `id_order` INT UNSIGNED NULL, + `id_currency` INT UNSIGNED NOT NULL, + `amount` DECIMAL(10,2) NOT NULL, + `transaction_id` VARCHAR(254) NULL, + `card_number` VARCHAR(254) NULL, + `card_brand` VARCHAR(254) NULL, + `card_expiration` CHAR(7) NULL, + `card_holder` VARCHAR(254) NULL, + `date_add` DATETIME NOT NULL, + PRIMARY KEY (`id_payment_cc`), + KEY `id_order` (`id_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_specific_price` ( + `id_specific_price` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_product` INT UNSIGNED NOT NULL, + `id_shop` TINYINT UNSIGNED NOT NULL, + `id_currency` INT UNSIGNED NOT NULL, + `id_country` INT UNSIGNED NOT NULL, + `id_group` INT UNSIGNED NOT NULL, + `priority` SMALLINT UNSIGNED NOT NULL, + `price` DECIMAL(20, 6) NOT NULL, + `from_quantity` SMALLINT UNSIGNED NOT NULL, + `reduction` DECIMAL(20, 6) NOT NULL, + `reduction_type` ENUM('amount', 'percentage') NOT NULL, + `from` DATETIME NOT NULL, + `to` DATETIME NOT NULL, + PRIMARY KEY(`id_specific_price`), + KEY (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `from_quantity`, `from`, `to`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) + ( SELECT dq.`id_product`, 1, 1, 0, 1, 0, 0.00, dq.`quantity`, IF(dq.`id_discount_type` = 2, dq.`value`, dq.`value` / 100), IF (dq.`id_discount_type` = 2, 'amount', 'percentage'), '0000-00-00 00:00:00', '0000-00-00 00:00:00' + FROM `PREFIX_discount_quantity` dq + INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`) + ); +DROP TABLE `PREFIX_discount_quantity`; + +INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) ( + SELECT + p.`id_product`, + 1, + 0, + 0, + 0, + 0, + 0.00, + 1, + IF(p.`reduction_price` > 0, p.`reduction_price`, p.`reduction_percent` / 100), + IF(p.`reduction_price` > 0, 'amount', 'percentage'), + IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_from`), + IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_to`) + FROM `PREFIX_product` p + WHERE p.`reduction_price` OR p.`reduction_percent` +); +ALTER TABLE `PREFIX_product` + DROP `reduction_price`, + DROP `reduction_percent`, + DROP `reduction_from`, + DROP `reduction_to`; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW()), +('PS_TAX_DISPLAY', 0, NOW(), NOW()), +('PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW()), +('PS_DISTANCE_UNIT', 'km', NOW(), NOW()), +('PS_STORES_DISPLAY_CMS', 0, NOW(), NOW()), +('PS_STORES_DISPLAY_FOOTER', 0, NOW(), NOW()), +('PS_STORES_SIMPLIFIED', 0, NOW(), NOW()), +('PS_STATSDATA_CUSTOMER_PAGESVIEWS', 1, NOW(), NOW()), +('PS_STATSDATA_PAGESVIEWS', 1, NOW(), NOW()), +('PS_STATSDATA_PLUGINS', 1, NOW(), NOW()); + +CREATE TABLE `PREFIX_group_reduction` ( + `id_group_reduction` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_group` INT(10) UNSIGNED NOT NULL, + `id_category` INT(10) UNSIGNED NOT NULL, + `reduction` DECIMAL(4, 3) NOT NULL, + PRIMARY KEY(`id_group_reduction`), + UNIQUE KEY(`id_group`, `id_category`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_product_group_reduction_cache` ( + `id_product` INT UNSIGNED NOT NULL, + `id_group` INT UNSIGNED NOT NULL, + `reduction` DECIMAL(4, 3) NOT NULL, + PRIMARY KEY(`id_product`, `id_group`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_currency` ADD `iso_code_num` varchar(3) NOT NULL default '0' AFTER `iso_code`; +UPDATE `PREFIX_currency` SET iso_code_num = '978' WHERE iso_code LIKE 'EUR' LIMIT 1; +UPDATE `PREFIX_currency` SET iso_code_num = '840' WHERE iso_code LIKE 'USD' LIMIT 1; +UPDATE `PREFIX_currency` SET iso_code_num = '826' WHERE iso_code LIKE 'GBP' LIMIT 1; + +ALTER TABLE `PREFIX_country` ADD `call_prefix` int(10) NOT NULL default '0' AFTER `iso_code`; + +UPDATE `PREFIX_country` SET `call_prefix` = 49 WHERE `iso_code` = 'DE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 43 WHERE `iso_code` = 'AT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 32 WHERE `iso_code` = 'BE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 1 WHERE `iso_code` = 'CA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 86 WHERE `iso_code` = 'CN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 34 WHERE `iso_code` = 'ES' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 358 WHERE `iso_code` = 'FI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 33 WHERE `iso_code` = 'FR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 30 WHERE `iso_code` = 'GR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 39 WHERE `iso_code` = 'IT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 81 WHERE `iso_code` = 'JP' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 352 WHERE `iso_code` = 'LU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 31 WHERE `iso_code` = 'NL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 48 WHERE `iso_code` = 'PL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 351 WHERE `iso_code` = 'PT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 420 WHERE `iso_code` = 'CZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 44 WHERE `iso_code` = 'GB' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 46 WHERE `iso_code` = 'SE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 41 WHERE `iso_code` = 'CH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 45 WHERE `iso_code` = 'DK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 1 WHERE `iso_code` = 'US' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 852 WHERE `iso_code` = 'HK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 47 WHERE `iso_code` = 'NO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 61 WHERE `iso_code` = 'AU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 65 WHERE `iso_code` = 'SG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 353 WHERE `iso_code` = 'IE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 64 WHERE `iso_code` = 'NZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 82 WHERE `iso_code` = 'KR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 972 WHERE `iso_code` = 'IL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 27 WHERE `iso_code` = 'ZA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 234 WHERE `iso_code` = 'NG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 225 WHERE `iso_code` = 'CI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 228 WHERE `iso_code` = 'TG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 591 WHERE `iso_code` = 'BO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 230 WHERE `iso_code` = 'MU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 40 WHERE `iso_code` = 'RO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 421 WHERE `iso_code` = 'SK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 213 WHERE `iso_code` = 'DZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 376 WHERE `iso_code` = 'AD' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 244 WHERE `iso_code` = 'AO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 54 WHERE `iso_code` = 'AR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 374 WHERE `iso_code` = 'AM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 297 WHERE `iso_code` = 'AW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 994 WHERE `iso_code` = 'AZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 973 WHERE `iso_code` = 'BH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 880 WHERE `iso_code` = 'BD' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 501 WHERE `iso_code` = 'BZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 229 WHERE `iso_code` = 'BJ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 975 WHERE `iso_code` = 'BT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 267 WHERE `iso_code` = 'BW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 55 WHERE `iso_code` = 'BR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 673 WHERE `iso_code` = 'BN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 226 WHERE `iso_code` = 'BF' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 95 WHERE `iso_code` = 'MM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 257 WHERE `iso_code` = 'BI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 855 WHERE `iso_code` = 'KH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 237 WHERE `iso_code` = 'CM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 238 WHERE `iso_code` = 'CV' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 236 WHERE `iso_code` = 'CF' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 235 WHERE `iso_code` = 'TD' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 56 WHERE `iso_code` = 'CL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 57 WHERE `iso_code` = 'CO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 269 WHERE `iso_code` = 'KM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 242 WHERE `iso_code` = 'CD' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 243 WHERE `iso_code` = 'CG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 506 WHERE `iso_code` = 'CR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 385 WHERE `iso_code` = 'HR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 53 WHERE `iso_code` = 'CU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 357 WHERE `iso_code` = 'CY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 253 WHERE `iso_code` = 'DJ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 670 WHERE `iso_code` = 'TL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 593 WHERE `iso_code` = 'EC' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 20 WHERE `iso_code` = 'EG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 503 WHERE `iso_code` = 'SV' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 240 WHERE `iso_code` = 'GQ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 291 WHERE `iso_code` = 'ER' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 372 WHERE `iso_code` = 'EE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 251 WHERE `iso_code` = 'ET' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 298 WHERE `iso_code` = 'FO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 679 WHERE `iso_code` = 'FJ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 241 WHERE `iso_code` = 'GA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 220 WHERE `iso_code` = 'GM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 995 WHERE `iso_code` = 'GE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 233 WHERE `iso_code` = 'GH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 299 WHERE `iso_code` = 'GL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 350 WHERE `iso_code` = 'GI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 590 WHERE `iso_code` = 'GP' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 502 WHERE `iso_code` = 'GT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 224 WHERE `iso_code` = 'GN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 245 WHERE `iso_code` = 'GW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 592 WHERE `iso_code` = 'GY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 509 WHERE `iso_code` = 'HT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 379 WHERE `iso_code` = 'VA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 504 WHERE `iso_code` = 'HN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 354 WHERE `iso_code` = 'IS' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 91 WHERE `iso_code` = 'IN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 62 WHERE `iso_code` = 'ID' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 98 WHERE `iso_code` = 'IR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 964 WHERE `iso_code` = 'IQ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 962 WHERE `iso_code` = 'JO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 7 WHERE `iso_code` = 'KZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 254 WHERE `iso_code` = 'KE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 686 WHERE `iso_code` = 'KI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 850 WHERE `iso_code` = 'KP' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 965 WHERE `iso_code` = 'KW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 996 WHERE `iso_code` = 'KG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 856 WHERE `iso_code` = 'LA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 371 WHERE `iso_code` = 'LV' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 961 WHERE `iso_code` = 'LB' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 266 WHERE `iso_code` = 'LS' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 231 WHERE `iso_code` = 'LR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 218 WHERE `iso_code` = 'LY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 423 WHERE `iso_code` = 'LI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 370 WHERE `iso_code` = 'LT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 853 WHERE `iso_code` = 'MO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 389 WHERE `iso_code` = 'MK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 261 WHERE `iso_code` = 'MG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 265 WHERE `iso_code` = 'MW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 60 WHERE `iso_code` = 'MY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 960 WHERE `iso_code` = 'MV' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 223 WHERE `iso_code` = 'ML' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 356 WHERE `iso_code` = 'MT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 692 WHERE `iso_code` = 'MH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 596 WHERE `iso_code` = 'MQ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 222 WHERE `iso_code` = 'MR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 36 WHERE `iso_code` = 'HU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 262 WHERE `iso_code` = 'YT' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 52 WHERE `iso_code` = 'MX' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 691 WHERE `iso_code` = 'FM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 373 WHERE `iso_code` = 'MD' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 377 WHERE `iso_code` = 'MC' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 976 WHERE `iso_code` = 'MN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 382 WHERE `iso_code` = 'ME' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 212 WHERE `iso_code` = 'MA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 258 WHERE `iso_code` = 'MZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 264 WHERE `iso_code` = 'NA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 674 WHERE `iso_code` = 'NR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 977 WHERE `iso_code` = 'NP' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 599 WHERE `iso_code` = 'AN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 687 WHERE `iso_code` = 'NC' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 505 WHERE `iso_code` = 'NI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 227 WHERE `iso_code` = 'NE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 683 WHERE `iso_code` = 'NU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 968 WHERE `iso_code` = 'OM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 92 WHERE `iso_code` = 'PK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 680 WHERE `iso_code` = 'PW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 507 WHERE `iso_code` = 'PA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 675 WHERE `iso_code` = 'PG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 595 WHERE `iso_code` = 'PY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 51 WHERE `iso_code` = 'PE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 63 WHERE `iso_code` = 'PH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 974 WHERE `iso_code` = 'QA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 262 WHERE `iso_code` = 'RE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 7 WHERE `iso_code` = 'RU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 250 WHERE `iso_code` = 'RW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 508 WHERE `iso_code` = 'PM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 685 WHERE `iso_code` = 'WS' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 378 WHERE `iso_code` = 'SM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 239 WHERE `iso_code` = 'ST' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 966 WHERE `iso_code` = 'SA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 221 WHERE `iso_code` = 'SN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 381 WHERE `iso_code` = 'RS' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 248 WHERE `iso_code` = 'SC' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 232 WHERE `iso_code` = 'SL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 386 WHERE `iso_code` = 'SI' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 677 WHERE `iso_code` = 'SB' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 252 WHERE `iso_code` = 'SO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 94 WHERE `iso_code` = 'LK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 249 WHERE `iso_code` = 'SD' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 597 WHERE `iso_code` = 'SR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 268 WHERE `iso_code` = 'SZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 963 WHERE `iso_code` = 'SY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 886 WHERE `iso_code` = 'TW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 992 WHERE `iso_code` = 'TJ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 255 WHERE `iso_code` = 'TZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 66 WHERE `iso_code` = 'TH' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 690 WHERE `iso_code` = 'TK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 676 WHERE `iso_code` = 'TO' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 216 WHERE `iso_code` = 'TN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 90 WHERE `iso_code` = 'TR' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 993 WHERE `iso_code` = 'TM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 688 WHERE `iso_code` = 'TV' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 256 WHERE `iso_code` = 'UG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 380 WHERE `iso_code` = 'UA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 971 WHERE `iso_code` = 'AE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 598 WHERE `iso_code` = 'UY' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 998 WHERE `iso_code` = 'UZ' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 678 WHERE `iso_code` = 'VU' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 58 WHERE `iso_code` = 'VE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 84 WHERE `iso_code` = 'VN' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 681 WHERE `iso_code` = 'WF' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 967 WHERE `iso_code` = 'YE' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 260 WHERE `iso_code` = 'ZM' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 263 WHERE `iso_code` = 'ZW' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 355 WHERE `iso_code` = 'AL' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 93 WHERE `iso_code` = 'AF' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 387 WHERE `iso_code` = 'BA' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 359 WHERE `iso_code` = 'BG' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 682 WHERE `iso_code` = 'CK' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 594 WHERE `iso_code` = 'GF' LIMIT 1; +UPDATE `PREFIX_country` SET `call_prefix` = 689 WHERE `iso_code` = 'PF' LIMIT 1; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CONDITIONS_CMS_ID', IFNULL((SELECT `id_cms` FROM `PREFIX_cms` WHERE `id_cms` = 3), 0), NOW(), NOW()); +CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` ( + `value` text +); +INSERT INTO `PREFIX_configuration_tmp` (SELECT value FROM (SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'PREFIX_CONDITIONS_CMS_ID') AS tmp); + +UPDATE `PREFIX_configuration` SET `value` = IF((SELECT value FROM PREFIX_configuration_tmp), 1, 0) WHERE `name` = 'PREFIX_CONDITIONS'; +DROP TABLE PREFIX_configuration_tmp; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CIPHER_ALGORITHM', 0, NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_ORDER_PROCESS_TYPE', 0, NOW(), NOW()); + +ALTER TABLE `PREFIX_product` ADD `minimal_quantity` INT NOT NULL DEFAULT '1' AFTER `quantity`; +ALTER TABLE `PREFIX_product` ADD `cache_default_attribute` int(10) unsigned default NULL AFTER `indexed`; +ALTER TABLE `PREFIX_product` ADD `cache_has_attachments` TINYINT(1) NOT NULL default '0' AFTER `indexed`; +ALTER TABLE `PREFIX_product` ADD `cache_is_pack` TINYINT(1) NOT NULL default '0' AFTER `indexed`; +ALTER TABLE `PREFIX_product` ADD `available_for_order` TINYINT(1) NOT NULL DEFAULT '1' AFTER `active`; +ALTER TABLE `PREFIX_product` ADD `show_price` TINYINT(1) NOT NULL DEFAULT '1' AFTER `available_for_order`; +ALTER TABLE `PREFIX_product` ADD `online_only` TINYINT(1) NOT NULL DEFAULT '0' AFTER `on_sale`; +ALTER TABLE `PREFIX_product` ADD `condition` ENUM('new', 'used', 'refurbished') NOT NULL DEFAULT 'new' AFTER `available_for_order`; +ALTER TABLE `PREFIX_product` ADD `upc` VARCHAR( 12 ) NULL AFTER `ean13`; + +ALTER TABLE `PREFIX_product_attribute` ADD `upc` VARCHAR( 12 ) NULL AFTER `ean13`; + +SET @defaultOOS = (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK'); +/* Set 0 for every non-attribute product */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = 0 WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product_attribute`); +/* First default attribute in stock */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND default_on = 1 AND quantity > 0 LIMIT 1) WHERE `cache_default_attribute` IS NULL; +/* Then default attribute without stock if we don't care */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND default_on = 1 LIMIT 1) WHERE `cache_default_attribute` IS NULL AND `out_of_stock` = 1 OR `out_of_stock` = IF(@defaultOOS = 1, 2, 1); +/* Next, the default attribute can be any attribute with stock */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND quantity > 0 LIMIT 1) WHERE `cache_default_attribute` IS NULL; +/* If there is still no default attribute, then we go back to the default one */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND default_on = 1 LIMIT 1) WHERE `cache_default_attribute` IS NULL; + +UPDATE `PREFIX_product` p SET +cache_is_pack = (SELECT IF(COUNT(*) > 0, 1, 0) FROM `PREFIX_pack` pp WHERE pp.`id_product_pack` = p.`id_product`), +cache_has_attachments = (SELECT IF(COUNT(*) > 0, 1, 0) FROM `PREFIX_product_attachment` pa WHERE pa.`id_product` = p.`id_product`); + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('deleteProductAttribute', 'Product Attribute Deletion', NULL, 0); +INSERT INTO `PREFIX_hook` (`name` ,`title` ,`description` ,`position`) VALUES ('beforeCarrier', 'Before carrier list', 'This hook is display before the carrier list on Front office', 1); +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('orderDetailDisplayed', 'Order detail displayed', 'Displayed on order detail on front office', 1); + +INSERT INTO `PREFIX_hook_module` (`id_module`, `id_hook`, `position`) VALUES +((SELECT IFNULL((SELECT `id_module` FROM `PREFIX_module` WHERE `name` = 'mailalerts'), 0)), +(SELECT `id_hook` FROM `PREFIX_hook` WHERE `name` = 'deleteProductAttribute'), 1); + +DELETE FROM `PREFIX_hook_module` WHERE `id_module` = 0; + +ALTER TABLE `PREFIX_country` ADD `need_zip_code` TINYINT(1) NOT NULL DEFAULT '1'; +ALTER TABLE `PREFIX_country` ADD `zip_code_format` VARCHAR(12) NOT NULL DEFAULT ''; + +ALTER TABLE `PREFIX_product` ADD `unit_price` DECIMAL(20,6) NOT NULL DEFAULT '0.000000' AFTER `wholesale_price`; +ALTER TABLE `PREFIX_product` ADD `unity` VARCHAR(10) NOT NULL DEFAULT '0.000000' AFTER `unit_price` ; +ALTER TABLE `PREFIX_product_attribute` ADD `unit_price_impact`DECIMAL(17,2) NOT NULL DEFAULT '0.00' AFTER `weight`; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_VOLUME_UNIT', 'cl', NOW(), NOW()); + +ALTER TABLE `PREFIX_carrier` ADD `shipping_external` TINYINT( 1 ) UNSIGNED NOT NULL; +ALTER TABLE `PREFIX_carrier` ADD `external_module_name` varchar(64) DEFAULT NULL; +ALTER TABLE `PREFIX_carrier` ADD `need_range` TINYINT( 1 ) UNSIGNED NOT NULL; + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('processCarrier', 'Carrier Process', NULL, 0); +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('orderDetail', 'Order Detail', 'To set the follow-up in smarty when order detail is called', 0); +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('paymentCCAdded', 'Payment CC added', 'Payment CC added', '0'); +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('extraProductComparison', 'Extra Product Comparison', 'Extra Product Comparison', '0'); + +ALTER TABLE `PREFIX_address` ADD `vat_number` varchar(32) NULL DEFAULT NULL AFTER `phone_mobile`; +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_TAX_ADDRESS_TYPE', 'id_address_delivery', NOW(), NOW()); + + +/* PHP:add_module_to_hook(blockpaymentlogo, header); */; +/* PHP:add_module_to_hook(blockpermanentlinks, header); */; +/* PHP:add_module_to_hook(blockviewed, header); */; +/* PHP:add_module_to_hook(blockcart, header); */; +/* PHP:add_module_to_hook(editorial, header); */; +/* PHP:add_module_to_hook(blockbestsellers, header); */; +/* PHP:add_module_to_hook(blockcategories, header); */; +/* PHP:add_module_to_hook(blockspecials, header); */; +/* PHP:add_module_to_hook(blockcurrencies, header); */; +/* PHP:add_module_to_hook(blocknewproducts, header); */; +/* PHP:add_module_to_hook(blockuserinfo, header); */; +/* PHP:migrate_block_info_to_cms_block(); */; +/* PHP:add_module_to_hook(blockcms, header); */; +/* PHP:add_module_to_hook(blocklanguages, header); */; +/* PHP:add_module_to_hook(blockmanufacturer, header); */; +/* PHP:add_module_to_hook(blockadvertising, header); */; +/* PHP:add_module_to_hook(blocktags, header); */; +/* PHP:add_module_to_hook(blockmyaccount, header); */; + +ALTER TABLE `PREFIX_product` ADD `additional_shipping_cost` DECIMAL(20,2) NOT NULL DEFAULT '0.000000' AFTER `unit_price`; + +ALTER TABLE `PREFIX_currency` ADD `active` TINYINT(1) NOT NULL DEFAULT '1'; +ALTER TABLE `PREFIX_tax` ADD `active` TINYINT(1) NOT NULL DEFAULT '1'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_ATTRIBUTE_CATEGORY_DISPLAY', 1, NOW(), NOW()); + +ALTER TABLE `PREFIX_discount` ADD `cart_display` TINYINT( 4 ) NOT NULL AFTER `active` , ADD `date_add` DATETIME NOT NULL AFTER `cart_display` , ADD `date_upd` DATETIME NOT NULL AFTER `date_add` ; + +ALTER TABLE `PREFIX_carrier` ADD `shipping_method` INT( 2 ) NOT NULL DEFAULT '0'; + +CREATE TABLE `PREFIX_stock_mvt` ( + `id_stock_mvt` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_product` int(11) unsigned DEFAULT NULL, + `id_product_attribute` int(11) unsigned DEFAULT NULL, + `id_order` int(11) unsigned DEFAULT NULL, + `id_stock_mvt_reason` int(11) unsigned NOT NULL, + `id_employee` int(11) unsigned NOT NULL, + `quantity` int(11) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_stock_mvt`), + KEY `id_order` (`id_order`), + KEY `id_product` (`id_product`), + KEY `id_product_attribute` (`id_product_attribute`), + KEY `id_stock_mvt_reason` (`id_stock_mvt_reason`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_stock_mvt_reason` ( + `id_stock_mvt_reason` int(11) NOT NULL AUTO_INCREMENT, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_stock_mvt_reason`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +ALTER TABLE `PREFIX_product` CHANGE `quantity` `quantity` INT( 10 ) NOT NULL DEFAULT '0'; +ALTER TABLE `PREFIX_product_attribute` CHANGE `quantity` `quantity` INT( 10 ) NOT NULL DEFAULT '0'; + +CREATE TABLE `PREFIX_stock_mvt_reason_lang` ( + `id_stock_mvt_reason` int(11) NOT NULL, + `id_lang` int(11) NOT NULL, + `name` varchar(255) CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`id_stock_mvt_reason`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_stock_mvt_reason` (`id_stock_mvt_reason`, `date_add`, `date_upd`) VALUES +(1, NOW(), NOW()), (2, NOW(), NOW()), (3, NOW(), NOW()); + +INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `name`) VALUES +(1, 1, 'Order'), +(1, 2, 'Commande'), +(2, 1, 'Missing Stock Movement'), +(2, 2, 'Mouvement de stock manquant'), +(3, 1, 'Restocking'), +(3, 2, 'Réassort'); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_COMPARATOR_MAX_ITEM', 0, NOW(), NOW()); + +ALTER TABLE `PREFIX_meta_lang` ADD `url_rewrite` VARCHAR( 255 ) NOT NULL , ADD INDEX ( `url_rewrite` ); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('address'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'address'), 'Address', 'address'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'address'), 'Adresse', 'adresse'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'address'), 'Dirección', 'direccion'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('addresses'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'addresses'), 'Addresses', 'addresses'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'addresses'), 'Adresses', 'adresses'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'addresses'), 'Direcciones', 'direcciones'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('authentication'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentication', 'authentication'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentification', 'authentification'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Autenticación', 'autenticacion'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('cart'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'cart'), 'Cart', 'cart'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'cart'), 'Panier', 'panier'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'cart'), 'Carro de la compra', 'carro-de-la-compra'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('discount'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'discount'), 'Discount', 'discount'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'discount'), 'Bons de réduction', 'bons-de-reduction'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'discount'), 'Descuento', 'descuento'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('history'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'history'), 'Order history', 'order-history'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'history'), 'Historique des commandes', 'historique-des-commandes'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'history'), 'Historial de pedidos', 'historial-de-pedidos'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('identity'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'identity'), 'Identity', 'identity'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'identity'), 'Identité', 'identite'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'identity'), 'Identidad', 'identidad'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('my-account'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'my-account'), 'My account', 'my-account'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'my-account'), 'Mon compte', 'mon-compte'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'my-account'), 'Mi Cuenta', 'mi-cuenta'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('order-follow'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-follow'), 'Order follow', 'order-follow'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-follow'), 'Détails de la commande', 'details-de-la-commande'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-follow'), 'Devolución de productos', 'devolucion-de-productos'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('order-slip'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-slip'), 'Order slip', 'order-slip'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-slip'), 'Avoirs', 'avoirs'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order-slip'), 'Vales', 'vales'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('order'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order'), 'Order', 'order'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order'), 'Commande', 'commande'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'order'), 'Carrito', 'carrito'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('search'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'search'), 'Search', 'search'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'search'), 'Recherche', 'recherche'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'search'), 'Buscar', 'buscar'); +INSERT INTO `PREFIX_meta` (`page`) VALUES ('stores'); +INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES +(1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'stores'), 'Stores', 'stores'), +(2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'stores'), 'Magagins', 'magasins'), +(3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'stores'), 'Tiendas', 'tiendas'); + +ALTER TABLE `PREFIX_manufacturer` ADD `active` tinyint(1) NOT NULL default 0; +ALTER TABLE `PREFIX_supplier` ADD `active` tinyint(1) NOT NULL default 0; +UPDATE `PREFIX_manufacturer` SET `active` = 1; +UPDATE `PREFIX_supplier` SET `active` = 1; +ALTER TABLE `PREFIX_cms` ADD `active` tinyint(1) unsigned NOT NULL default 0; +UPDATE `PREFIX_cms` SET `active` = 1; + +ALTER TABLE `PREFIX_cart` ADD `secure_key` varchar(32) NOT NULL default '-1' AFTER `id_guest`; + +ALTER TABLE `PREFIX_order_detail` ADD `product_upc` varchar(12) default NULL AFTER `product_ean13`; + +ALTER TABLE `PREFIX_discount` ADD `id_group` int(10) unsigned NOT NULL default 0; + +CREATE TABLE `PREFIX_store` ( + `id_store` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_country` int(10) unsigned NOT NULL, + `id_state` int(10) unsigned DEFAULT NULL, + `name` varchar(128) NOT NULL, + `address1` varchar(128) NOT NULL, + `address2` varchar(128) DEFAULT NULL, + `city` varchar(64) NOT NULL, + `postcode` varchar(12) NOT NULL, + `latitude` float(10,6) DEFAULT NULL, + `longitude` float(10,6) DEFAULT NULL, + `hours` varchar(254) DEFAULT NULL, + `phone` varchar(16) DEFAULT NULL, + `fax` varchar(16) DEFAULT NULL, + `email` varchar(128) DEFAULT NULL, + `note` text, + `active` tinyint(1) unsigned NOT NULL DEFAULT '0', + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_store`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES +('categoryAddition', '', 'Temporary hook. Must NEVER be used. Will soon be replaced by a generic CRUD hook system.', 0), +('categoryUpdate', '', 'Temporary hook. Must NEVER be used. Will soon be replaced by a generic CRUD hook system.', 0), +('categoryDeletion', '', 'Temporary hook. Must NEVER be used. Will soon be replaced by a generic CRUD hook system.', 0); + + +/* PHP:add_module_to_hook(blockcategories, categoryAddition); */; +/* PHP:add_module_to_hook(blockcategories, categoryUpdate); */; +/* PHP:add_module_to_hook(blockcategories, categoryDeletion); */; + +DELETE FROM `PREFIX_hook_module` WHERE `id_module` = 0; + +CREATE TABLE `PREFIX_required_field` ( + `id_required_field` int(11) NOT NULL AUTO_INCREMENT, + `object_name` varchar(32) NOT NULL, + `field_name` varchar(32) NOT NULL, + PRIMARY KEY (`id_required_field`), + KEY `object_name` (`object_name`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_memcached_servers` ( +`id_memcached_server` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , +`ip` VARCHAR( 254 ) NOT NULL , +`port` INT(11) UNSIGNED NOT NULL , +`weight` INT(11) UNSIGNED NOT NULL +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_webservice_account` ( + `id_webservice_account` int(11) NOT NULL AUTO_INCREMENT, + `key` varchar(32) NOT NULL, + `active` tinyint(2) NOT NULL, + PRIMARY KEY (`id_webservice_account`), + KEY `key` (`key`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_webservice_permission` ( + `id_webservice_permission` int(11) NOT NULL AUTO_INCREMENT, + `resource` varchar(50) NOT NULL, + `method` enum('GET','POST','PUT','DELETE') NOT NULL, + `id_webservice_account` int(11) NOT NULL, + PRIMARY KEY (`id_webservice_permission`), + UNIQUE KEY `resource_2` (`resource`,`method`,`id_webservice_account`), + KEY `resource` (`resource`), + KEY `method` (`method`), + KEY `id_webservice_account` (`id_webservice_account`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + + +/* PHP */ +/* PHP:editorial_update(); */; +/* PHP:reorderpositions(); */; +/* PHP:update_image_size_in_db(); */; +/* PHP:update_order_details(); */; +/* PHP:add_new_tab(AdminInformation, en:Configuration Information|fr:Informations|es:Informations|it:Informazioni di configurazione|de:Konfigurationsinformationen, 9); */; +/* PHP:add_new_tab(AdminCustomerThreads, en:Customer Service|de:Kundenservice|fr:SAV|es:Servicio al cliente|it:Servizio clienti, 29); */; +/* PHP:add_new_tab(AdminAddonsCatalog, fr:Catalogue de modules et thèmes|de:Module und Themenkatalog|en:Modules & Themes Catalog|it:Moduli & Temi catalogo, 7); */; +/* PHP:add_new_tab(AdminAddonsMyAccount, it:Il mio Account|de:Mein Konto|fr:Mon compte|en:My Account, 7); */; +/* PHP:add_new_tab(AdminPerformance, de:Leistung|en:Performance|it:Performance|fr:Performances|es:Rendimiento, 8); */; +/* PHP:add_new_tab(AdminThemes, es:Temas|it:Temi|de:Themen|en:Themes|fr:Thèmes, 7); */; +/* PHP:add_new_tab(AdminWebservice, fr:Service web|es:Web service|en:Webservice|de:Webservice|it:Webservice, 9); */; + diff --git a/install-dev/sql/upgrade/1.4.0.3.sql b/install-dev/sql/upgrade/1.4.0.3.sql new file mode 100644 index 000000000..1df6fd470 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.3.sql @@ -0,0 +1,67 @@ +SET NAMES 'utf8'; + +CREATE TABLE IF NOT EXISTS `PREFIX_country_tax` ( + `id_country_tax` int(11) NOT NULL AUTO_INCREMENT, + `id_country` int(11) NOT NULL, + `id_tax` int(11) NOT NULL, + PRIMARY KEY (`id_country_tax`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_product_country_tax` ( + `id_product` int(11) NOT NULL, + `id_country` int(11) NOT NULL, + `id_tax` int(11) NOT NULL, + UNIQUE KEY `id_product` (`id_product`,`id_country`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +DELETE FROM `PREFIX_tab` WHERE `class_name` = 'AdminStatsModules' LIMIT 1; +DELETE FROM `PREFIX_tab_lang` WHERE `id_tab` NOT IN (SELECT id_tab FROM `PREFIX_tab`); +DELETE FROM `PREFIX_access` WHERE `id_tab` NOT IN (SELECT id_tab FROM `PREFIX_tab`); + +INSERT INTO `PREFIX_module` (`name`, `active`) VALUES ('statsforecast', 1); +INSERT INTO `PREFIX_hook_module` (`id_module`, `id_hook` , `position`) (SELECT id_module, 32, (SELECT max_position from (SELECT MAX(position)+1 as max_position FROM `PREFIX_hook_module` WHERE `id_hook` = 32) tmp) FROM `PREFIX_module` WHERE `name` = 'statsforecast'); + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_GEOLOCATION_ENABLED', '0', NOW(), NOW()), +('PS_ALLOWED_COUNTRIES', +'AF;ZA;AX;AL;DZ;DE;AD;AO;AI;AQ;AG;AN;SA;AR;AM;AW;AU;AT;AZ;BS;BH;BD;BB;BY;BE;BZ;BJ;BM;BT;BO;BA;BW;BV;BR;BN;BG;BF;MM;BI;KY;KH;CM;CA;CV;CF;CL;CN;CX;CY;CC;CO;KM;CG;CD;CK;KR;KP;CR;CI;HR;CU;DK;DJ;DM;EG;IE;SV;AE;EC;ER;ES;EE;ET;FK;FO;FJ;FI;FR;GA;GM;GE;GS;GH;GI;GR;GD;GL;GP;GU;GT;GG;GN;GQ;GW;GY;GF;HT;HM;HN;HK;HU;IM;MU;VG;VI;IN;ID;IR;IQ;IS;IL;IT;JM;JP;JE;JO;KZ;KE;KG;KI;KW;LA;LS;LV;LB;LR;LY;LI;LT;LU;MO;MK;MG;MY;MW;MV;ML;MT;MP;MA;MH;MQ;MR;YT;MX;FM;MD;MC;MN;ME;MS;MZ;NA;NR;NP;NI;NE;NG;NU;NF;NO;NC;NZ;IO;OM;UG;UZ;PK;PW;PS;PA;PG;PY;NL;PE;PH;PN;PL;PF;PR;PT;QA;DO;CZ;RE;RO;UK;RU;RW;EH;BL;KN;SM;MF;PM;VA;VC;LC;SB;WS;AS;ST;SN;RS;SC;SL;SG;SK;SI;SO;SD;LK;SE;CH;SR;SJ;SZ;SY;TJ;TW;TZ;TD;TF;TH;TL;TG;TK;TO;TT;TN;TM;TC;TR;TV;UA;UY;US;VU;VE;VN;WF;YE;ZM;ZW', NOW(), NOW()), +('PS_GEOLOCATION_BEHAVIOR', '0', NOW(), NOW()); + +ALTER TABLE `PREFIX_orders` ADD `conversion_rate` decimal(13,6) NOT NULL default 1 AFTER `payment`; +UPDATE `PREFIX_orders` o SET o.`conversion_rate` = IFNULL(( + SELECT c.`conversion_rate` + FROM `PREFIX_currency` c + WHERE c.`id_currency` = o.`id_currency` + LIMIT 1), 0 +); + +ALTER TABLE `PREFIX_order_slip` ADD `conversion_rate` decimal(13,6) NOT NULL default 1 AFTER `id_order`; +UPDATE `PREFIX_order_slip` os SET os.`conversion_rate` = IFNULL(( + SELECT o.`conversion_rate` + FROM `PREFIX_orders` o + WHERE os.`id_order` = o.`id_order` + LIMIT 1), 0 +); + +UPDATE `PREFIX_configuration` SET `value` = 'gridhtml' WHERE `name` = 'PS_STATS_GRID_RENDER' LIMIT 1; +UPDATE `PREFIX_module` SET `name` = 'gridhtml' WHERE `name` = 'gridextjs' LIMIT 1; + +ALTER TABLE `PREFIX_attachment` CHANGE `mime` `mime` varchar(64) NOT NULL; +ALTER TABLE `PREFIX_attachment` ADD `file_name` varchar(128) NOT NULL default '' AFTER `file`; +UPDATE `PREFIX_attachment` a SET `file_name` = ( + SELECT `name` FROM `PREFIX_attachment_lang` al WHERE al.`id_attachment` = a.`id_attachment` AND al.`id_lang` = ( + SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'PS_LANG_DEFAULT') + ); + +UPDATE `PREFIX_tab` SET `class_name` = 'AdminCMSContent' WHERE `class_name` = 'AdminCMS' LIMIT 1; + +SET @id_timezone = (SELECT `name` FROM `PREFIX_timezone` WHERE `id_timezone` = (SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'PS_TIMEZONE' LIMIT 1) LIMIT 1); +UPDATE `PREFIX_configuration` SET `value` = @id_timezone WHERE `name` = "PS_TIMEZONE" LIMIT 1; + +ALTER TABLE `PREFIX_country` ADD `id_currency` INT NOT NULL DEFAULT '0' AFTER `id_zone`; + +/* PHP */ +/* PHP:group_reduction_column_fix(); */; +/* PHP:ecotax_tax_application_fix(); */; +/* PHP:cms_block(); */; +/* PHP:add_new_tab(AdminGeolocation, es:Geolocalización|it:Geolocalizzazione|en:Geolocation|de:Geotargeting|fr:Géolocalisation, 8); */; diff --git a/install-dev/sql/upgrade/1.4.0.4.sql b/install-dev/sql/upgrade/1.4.0.4.sql new file mode 100644 index 000000000..4ad45113c --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.4.sql @@ -0,0 +1,21 @@ +SET NAMES 'utf8'; +ALTER TABLE `PREFIX_product` CHANGE `ecotax` `ecotax` DECIMAL(21, 6) NOT NULL DEFAULT '0.00'; +/* PHP:move_crossselling(); */; + +UPDATE `PREFIX_cms` SET `id_cms_category` = 1; + +/* PHP:add_new_tab(AdminStores, fr:Magasins|es:Tiendas|en:Stores|de:Shops|it:Negozi, 9); */; + +INSERT IGNORE INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) SELECT 'PS_LOCALE_LANGUAGE', l.`iso_code`, NOW(), NOW() FROM `PREFIX_configuration` c INNER JOIN `PREFIX_lang` l ON (l.`id_lang` = c.`value`) WHERE c.`name` = 'PS_LANG_DEFAULT'; +INSERT IGNORE INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) SELECT 'PS_LOCALE_COUNTRY', co.`iso_code`, NOW(), NOW() FROM `PREFIX_configuration` c INNER JOIN `PREFIX_country` co ON (co.`id_country` = c.`value`) WHERE c.`name` = 'PS_COUNTRY_DEFAULT'; +/* PHP:reorderpositions(); */; + +ALTER TABLE `PREFIX_webservice_permission` CHANGE `method` `method` ENUM( 'GET', 'POST', 'PUT', 'DELETE', 'HEAD' ) NOT NULL; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_ATTACHMENT_MAXIMUM_SIZE', '2', NOW(), NOW()), +('PS_SMARTY_CACHE', '1', NOW(), NOW()); + +ALTER TABLE `PREFIX_product_attribute` CHANGE `price` `price` decimal(20,6) NOT NULL default '0.000000'; +UPDATE `PREFIX_product_attribute` pa SET pa.`price` = pa.`price` / (1 + IFNULL((SELECT t.`rate` FROM `PREFIX_tax` t INNER JOIN `PREFIX_product` p ON (p.`id_tax` = t.`id_tax`) WHERE p.`id_product` = pa.`id_product`) ,0) / 100); + diff --git a/install-dev/sql/upgrade/1.4.0.5.sql b/install-dev/sql/upgrade/1.4.0.5.sql new file mode 100644 index 000000000..42a62d345 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.5.sql @@ -0,0 +1,73 @@ +SET NAMES 'utf8'; + +SET @alias = (SELECT IFNULL((SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = "AdminAliases" LIMIT 1), '0')); +UPDATE `PREFIX_tab` SET `id_parent` = 8 WHERE `id_tab` = @alias LIMIT 1; +SET @stores = (SELECT IFNULL((SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = "AdminStores" LIMIT 1), '0')); +UPDATE `PREFIX_tab` SET `id_parent` = 9 WHERE `id_tab` = @stores LIMIT 1; +SET @pdf = (SELECT IFNULL((SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = "AdminPDF" LIMIT 1), '0')); +UPDATE `PREFIX_tab` SET `id_parent` = 3 WHERE `id_tab` = @pdf LIMIT 1; +SET @tabs = (SELECT IFNULL((SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = "AdminTabs" LIMIT 1), '0')); +UPDATE `PREFIX_tab` SET `id_parent` = 29 WHERE `id_tab` = @tabs LIMIT 1; + +ALTER TABLE `PREFIX_image_type` ADD `stores` tinyint(1) NOT NULL default '1'; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_FORCE_SMARTY_2', '0', NOW(), NOW()), +('PS_DIMENSION_UNIT', 'cm', NOW(), NOW()); + +ALTER TABLE `PREFIX_product` +ADD `width` FLOAT NOT NULL AFTER `location`, +ADD `height` FLOAT NOT NULL AFTER `width`, +ADD `depth` FLOAT NOT NULL AFTER `height`; + +SET @id_module = (SELECT IFNULL((SELECT `id_module` FROM `PREFIX_module` WHERE `name` = "statshome" LIMIT 1), '0')); +DELETE FROM `PREFIX_module` WHERE `id_module` = @id_module; +DELETE FROM `PREFIX_hook_module` WHERE `id_module` = @id_module; + +ALTER TABLE `PREFIX_customer` ADD `is_guest` TINYINT(1) NOT NULL DEFAULT '0' AFTER `deleted`; +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_GUEST_CHECKOUT_ENABLED', '0', NOW(), NOW()); + +ALTER TABLE `PREFIX_category` ADD `nleft` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `level_depth`; +ALTER TABLE `PREFIX_category` ADD `nright` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `nleft`; +ALTER TABLE `PREFIX_category` ADD INDEX `nleftright` (`nleft`, `nright`); + +ALTER TABLE `PREFIX_product` ADD `id_tax_rules_group` int(10) unsigned NOT NULL AFTER `id_tax`; +ALTER TABLE `PREFIX_carrier` ADD `id_tax_rules_group` int(10) unsigned NOT NULL AFTER `id_tax`; +ALTER TABLE `PREFIX_carrier` ADD INDEX ( `id_tax_rules_group` ) ; + +CREATE TABLE `PREFIX_tax_rule` ( +`id_tax_rules_group` INT NOT NULL , +`id_country` INT NOT NULL , +`id_state` INT NOT NULL , +`id_tax` INT NOT NULL , +`state_behavior` INT NOT NULL , +PRIMARY KEY ( `id_tax_rules_group`, `id_country` , `id_state` ) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_tax_rules_group` ( +`id_tax_rules_group` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , +`name` VARCHAR( 32 ) NOT NULL , +`active` INT NOT NULL +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_help_access` ( + `id_help_access` int(11) NOT NULL AUTO_INCREMENT, + `label` varchar(45) NOT NULL, + `version` varchar(8) NOT NULL, + PRIMARY KEY (`id_help_access`), + UNIQUE KEY `label` (`label`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +/* PHP:add_new_tab(AdminTaxRulesGroup, it:Regimi fiscali|es:Reglas de Impuestos|fr:Règles de taxes|de:Steuerregeln|en:Tax Rules, 4); */; +/* PHP:generate_ntree(); */; +/* PHP:generate_tax_rules(); */; +/* PHP:id_currency_country_fix(); */; +/* PHP:update_modules_sql(); */; + +ALTER TABLE `PREFIX_product` DROP `id_tax`; +ALTER TABLE `PREFIX_carrier` DROP `id_tax`; + +DROP TABLE `PREFIX_tax_state`, `PREFIX_tax_zone`, `PREFIX_country_tax`; +ALTER TABLE `PREFIX_orders` ADD `carrier_tax_rate` DECIMAL(10, 3) NOT NULL default '0.00' AFTER `total_shipping`; + +INSERT INTO `PREFIX_hook` (`id_hook`, `name`, `title`, `description`, `position`) VALUES (NULL, 'beforeAuthentication', 'Before Authentication', 'Before authentication', 0); diff --git a/install-dev/sql/upgrade/1.4.0.6.sql b/install-dev/sql/upgrade/1.4.0.6.sql new file mode 100644 index 000000000..f3b33b76d --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.6.sql @@ -0,0 +1,12 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_customer` DROP INDEX `customer_email`; +ALTER TABLE `PREFIX_customer` ADD INDEX `customer_email` (`email`); + +ALTER TABLE `PREFIX_lang` ADD `language_code` char(5) NULL AFTER `iso_code`; +UPDATE `PREFIX_lang` SET language_code = iso_code; +ALTER TABLE `PREFIX_lang` MODIFY `language_code` char(5) NOT NULL; + +DELETE FROM `PREFIX_module` WHERE `name` = 'gridextjs' LIMIT 1; +DELETE FROM `PREFIX_hook_module` WHERE `id_module` NOT IN (SELECT id_module FROM `PREFIX_module`); +UPDATE `PREFIX_configuration` SET `value` = 'gridhtml' WHERE `name` = 'PS_STATS_GRID_RENDER' AND `value` = 'gridextjs' LIMIT 1; diff --git a/install-dev/sql/upgrade/1.4.0.7.sql b/install-dev/sql/upgrade/1.4.0.7.sql new file mode 100644 index 000000000..1edfbdac1 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.7.sql @@ -0,0 +1,10 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_product_attribute` ADD `minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1' AFTER `default_on`; + +ALTER TABLE `PREFIX_orders` ADD `reference` VARCHAR(14) NOT NULL AFTER `id_address_invoice`; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES('PS_DISPLAY_SUPPLIERS', '1', NOW(), NOW()); + +/* PHP:update_products_ecotax_v133(); */; + diff --git a/install-dev/sql/upgrade/1.4.0.8.sql b/install-dev/sql/upgrade/1.4.0.8.sql new file mode 100644 index 000000000..da0a17fcf --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.8.sql @@ -0,0 +1,35 @@ +SET NAMES 'utf8'; + +CREATE TEMPORARY TABLE `PREFIX_tab_tmp1` ( + `id_parent` int(11) +); +INSERT INTO `PREFIX_tab_tmp1` (SELECT * FROM (SELECT `id_parent` FROM `PREFIX_tab` WHERE `class_name` = 'AdminTaxes') AS tmp); + +CREATE TEMPORARY TABLE `PREFIX_tab_tmp2` ( + `position` int(10) +); + +INSERT INTO `PREFIX_tab_tmp2` (SELECT * FROM (SELECT `position` FROM `PREFIX_tab` WHERE `class_name` = 'AdminTaxes') AS tmp2); + +UPDATE `PREFIX_tab` SET `position` = `position` + 1 WHERE `id_parent` = (SELECT id_parent FROM PREFIX_tab_tmp1 AS tmp) AND `position` > (SELECT position FROM PREFIX_tab_tmp2 AS tmp2); +DROP TABLE PREFIX_tab_tmp1; +DROP TABLE PREFIX_tab_tmp2; + +CREATE TEMPORARY TABLE `PREFIX_tab_tmp` ( + `position` int(10) +); + +INSERT INTO `PREFIX_tab_tmp` (SELECT * FROM (SELECT `position` FROM `PREFIX_tab` WHERE `class_name` = 'AdminTaxes') AS tmp); +UPDATE `PREFIX_tab` SET `position` = (SELECT position FROM PREFIX_tab_tmp tmp) + 1 WHERE `class_name` = 'AdminTaxRulesGroup'; +DROP TABLE PREFIX_tab_tmp; + +UPDATE `PREFIX_hook` SET `title` = 'Category creation', description = '' WHERE `name` = 'categoryAddition' LIMIT 1; +UPDATE `PREFIX_hook` SET `title` = 'Category modification', description = '' WHERE `name` = 'categoryUpdate' LIMIT 1; +UPDATE `PREFIX_hook` SET `title` = 'Category removal', description = '' WHERE `name` = 'categoryDeletion' LIMIT 1; + +DELETE FROM `PREFIX_module` WHERE `name` = 'canonicalurl' LIMIT 1; +DELETE FROM `PREFIX_hook_module` WHERE `id_module` NOT IN (SELECT id_module FROM `PREFIX_module`); + +/* PHP:gridextjs_deprecated(); */; +/* PHP:shop_url(); */; +/* PHP:updateproductcomments(); */; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.4.0.9.sql b/install-dev/sql/upgrade/1.4.0.9.sql new file mode 100644 index 000000000..a975b0927 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.0.9.sql @@ -0,0 +1,16 @@ +SET NAMES 'utf8'; + +CREATE TABLE `PREFIX_specific_price_priority` ( +`id_specific_price_priority` INT NOT NULL AUTO_INCREMENT , +`id_product` INT NOT NULL , +`priority` VARCHAR( 80 ) NOT NULL , +PRIMARY KEY ( `id_specific_price_priority` , `id_product` ) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +ALTER TABLE `PREFIX_product` ADD `unit_price_ratio` DECIMAL(20, 6) NOT NULL default '0.00' AFTER `unit_price`; + +UPDATE `PREFIX_product` SET `unit_price_ratio` = IF (`unit_price` != 0, `price` / `unit_price`, 0); + +ALTER TABLE `PREFIX_product` DROP `unit_price`; + +ALTER TABLE `PREFIX_discount` ADD `behavior_not_exhausted` TINYINT(3) DEFAULT '1' AFTER `id_discount_type`; diff --git a/install-dev/sql/upgrade/1.4.1.0.sql b/install-dev/sql/upgrade/1.4.1.0.sql new file mode 100755 index 000000000..fb914c24a --- /dev/null +++ b/install-dev/sql/upgrade/1.4.1.0.sql @@ -0,0 +1,43 @@ +SET NAMES 'utf8'; + +INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`, `live_edit`) VALUES ('afterSaveAdminMeta', 'After save configuration in AdminMeta', 'After save configuration in AdminMeta', 0, 0); + +ALTER TABLE `PREFIX_webservice_account` ADD `is_module` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `class_name` , +ADD `module_name` VARCHAR( 50 ) NULL DEFAULT NULL AFTER `is_module`; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_IMG_UPDATE_TIME', UNIX_TIMESTAMP(), NOW(), NOW()); + +UPDATE `PREFIX_cms_lang` set link_rewrite = "uber-uns" where link_rewrite like "%ber-uns"; + +ALTER TABLE `PREFIX_connections` CHANGE `ip_address` `ip_address` BIGINT NULL DEFAULT NULL; + + +UPDATE `PREFIX_meta_lang` +SET `title` = 'Angebote', `keywords` = 'besonders, Angebote', `url_rewrite` = 'angebote' WHERE url_rewrite = 'preise-fallen'; + +ALTER TABLE `PREFIX_country` ADD `display_tax_label` BOOLEAN NOT NULL DEFAULT '1'; +DROP TABLE IF EXISTS `PREFIX_country_tax`; + +ALTER TABLE `PREFIX_order_detail` +CHANGE `product_quantity_in_stock` `product_quantity_in_stock` INT(10) NOT NULL DEFAULT '0'; + +CREATE TABLE `PREFIX_address_format` ( + `id_country` int(10) unsigned NOT NULL, + `format` varchar(255) NOT NULL DEFAULT '', + KEY `country` (`id_country`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_address_format` (`id_country`, `format`) +(SELECT `id_country` as id_country, 'firstname lastname\ncompany\nvat_number\naddress1\naddress2\npostcode city\ncountry\nphone' as format FROM PREFIX_country); + +UPDATE `PREFIX_address_format` set `format`='firstname lastname +company +address1 +address2 +city State:name postcode +country +phone' where `id_country`=21; + +/* PHP:alter_cms_block(); */; +/* PHP:add_module_to_hook(blockcategories, afterSaveAdminMeta); */; diff --git a/install-dev/sql/upgrade/1.4.2.0.sql b/install-dev/sql/upgrade/1.4.2.0.sql new file mode 100644 index 000000000..d4b66a53e --- /dev/null +++ b/install-dev/sql/upgrade/1.4.2.0.sql @@ -0,0 +1,28 @@ +SET NAMES 'utf8'; + +ALTER TABLE `PREFIX_tab_lang` MODIFY `id_lang` int(10) unsigned NOT NULL AFTER `id_tab`; +ALTER TABLE `PREFIX_carrier` ADD `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0' AFTER `is_module`; + +UPDATE `PREFIX_address_format` SET `format`=REPLACE(REPLACE(`format`, 'state_iso', 'State:name'), 'country', 'Country:name'); + +ALTER TABLE `PREFIX_orders` ADD INDEX `date_add`(`date_add`); + +/* PHP:update_module_followup(); */; + +INSERT IGNORE INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_STOCK_MVT_REASON_DEFAULT', 3, NOW(), NOW()); + +INSERT IGNORE INTO `PREFIX_order_state` (`id_order_state`, `invoice`, `send_email`, `color`, `unremovable`, `logable`, `delivery`) VALUES (12, 0, 0, 'lightblue', 1, 0, 0); + +INSERT IGNORE INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) VALUES +(12, 1, 'Payment remotely accepted', ''), +(12, 2, 'Paiement à distance accepté', ''), +(12, 3, 'Payment remotely accepted', ''), +(12, 4, 'Payment remotely accepted', ''), +(12, 5, 'Payment remotely accepted', ''); + +/* PHP:alter_blocklink(); */; +/* PHP:update_module_loyalty(); */; +/* PHP:remove_module_from_hook(blockcategories, afterCreateHtaccess); */; +/* PHP:updatetabicon_from_11version(); */; + diff --git a/install-dev/sql/upgrade/1.4.2.1.sql b/install-dev/sql/upgrade/1.4.2.1.sql new file mode 100644 index 000000000..bb1503351 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.2.1.sql @@ -0,0 +1,3 @@ +SET NAMES 'utf8'; + +DELETE FROM `PREFIX_configuration_lang` WHERE 1 AND `value` is NULL AND `date_upd` is NULL; diff --git a/install-dev/sql/upgrade/1.4.2.2.sql b/install-dev/sql/upgrade/1.4.2.2.sql new file mode 100644 index 000000000..35f908ba5 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.2.2.sql @@ -0,0 +1,11 @@ +SET NAMES 'utf8'; + +UPDATE `PREFIX_country` SET `display_tax_label` = '1' WHERE `id_country` = 21; + +/* PHP:check_webservice_account_table(); */; +/* PHP:add_module_to_hook(blockcms, leftColumn); */; +/* PHP:add_module_to_hook(blockcms, rightColumn); */; +/* PHP:add_module_to_hook(blockcms, footer); */; + +UPDATE `PREFIX_cart` ca SET `secure_key` = IFNULL((SELECT `secure_key` from `PREFIX_customer` `cu` WHERE `cu`.`id_customer` = `ca`.`id_customer`), -1) WHERE `ca`.`secure_key` = -1; + diff --git a/install-dev/sql/upgrade/1.4.2.3.sql b/install-dev/sql/upgrade/1.4.2.3.sql new file mode 100644 index 000000000..6022be885 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.2.3.sql @@ -0,0 +1,30 @@ +SET NAMES 'utf8'; + +UPDATE `PREFIX_address_format` SET `format`=REPLACE(`format`, 'state', 'State:name'); + +SET @defaultOOS = (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK'); +/* Set 0 for every non-attribute product */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = 0 WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product_attribute`); +/* First default attribute in stock */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND default_on = 1 AND quantity > 0 LIMIT 1) WHERE `cache_default_attribute` IS NULL; +/* Then default attribute without stock if we don't care */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND default_on = 1 LIMIT 1) WHERE `cache_default_attribute` IS NULL AND `out_of_stock` = 1 OR `out_of_stock` = IF(@defaultOOS = 1, 2, 1); +/* Next, the default attribute can be any attribute with stock */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND quantity > 0 LIMIT 1) WHERE `cache_default_attribute` IS NULL; +/* If there is still no default attribute, then we go back to the default one */ +UPDATE `PREFIX_product` p SET `cache_default_attribute` = (SELECT `id_product_attribute` FROM `PREFIX_product_attribute` WHERE `id_product` = p.`id_product` AND default_on = 1 LIMIT 1) WHERE `cache_default_attribute` IS NULL; + +UPDATE `PREFIX_order_state_lang` SET `name` = 'Zahlung eingegangen' WHERE `PREFIX_order_state_lang`.`id_order_state` =2 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Bestellung eingegangen' WHERE `PREFIX_order_state_lang`.`id_order_state` =3 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Versendet' WHERE `PREFIX_order_state_lang`.`id_order_state` =4 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Erfolgreich abgeschlossen' WHERE `PREFIX_order_state_lang`.`id_order_state` =5 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Storniert' WHERE `PREFIX_order_state_lang`.`id_order_state` =6 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Fehler bei der Bezahlung' WHERE `PREFIX_order_state_lang`.`id_order_state` =8 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Artikel erwartet' WHERE `PREFIX_order_state_lang`.`id_order_state` =9 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Warten auf Zahlungseingang' WHERE `PREFIX_order_state_lang`.`id_order_state` =10 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'Warten auf Zahlungseingang von PayPal' WHERE `PREFIX_order_state_lang`.`id_order_state` =11 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); +UPDATE `PREFIX_order_state_lang` SET `name` = 'PayPal Anmeldung erfolgreich' WHERE `PREFIX_order_state_lang`.`id_order_state` =12 AND `PREFIX_order_state_lang`.`id_lang` = (SELECT id_lang FROM `PREFIX_lang` WHERE `iso_code` = 'de'); + +UPDATE `PREFIX_meta_lang` SET `url_rewrite` = 'identita' WHERE `url_rewrite` = 'Identità'; + +/* PHP:add_missing_rewrite_value(); */; diff --git a/install-dev/sql/upgrade/1.4.2.4.sql b/install-dev/sql/upgrade/1.4.2.4.sql new file mode 100644 index 000000000..1d5c1fd1c --- /dev/null +++ b/install-dev/sql/upgrade/1.4.2.4.sql @@ -0,0 +1,10 @@ +SET NAMES 'utf8'; + +INSERT IGNORE INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_BACKUP_DROP_TABLE', 1, NOW(), NOW()); + +UPDATE `PREFIX_tab_lang` SET `name` = 'SEO & URLs' WHERE `id_tab` = (SELECT `id_tab` FROM `PREFIX_tab` WHERE `class_name` = 'AdminMeta' LIMIT 1) AND `id_lang` IN (SELECT `id_lang` FROM `PREFIX_lang` WHERE `iso_code` IN ('en','fr','es','de','it')); + +/* These 3 lines (remove_duplicate, drop index, add unique) MUST stay together in this order */ +/* PHP:remove_duplicate_category_groups(); */; +ALTER TABLE `PREFIX_category_group` DROP INDEX `category_group_index`; +ALTER TABLE `PREFIX_category_group` ADD UNIQUE `category_group_index` (`id_category`,`id_group`); \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.4.2.5.sql b/install-dev/sql/upgrade/1.4.2.5.sql new file mode 100644 index 000000000..a5787c654 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.2.5.sql @@ -0,0 +1,4 @@ +SET NAMES 'utf8'; + +/* Fix wrong category level_depth caused by bug in 1.4.0.13 upgrade script */ +/* PHP:regenerate_level_depth(); */; \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.4.3.sql b/install-dev/sql/upgrade/1.4.3.sql new file mode 100644 index 000000000..fdef3a327 --- /dev/null +++ b/install-dev/sql/upgrade/1.4.3.sql @@ -0,0 +1,16 @@ +SET NAMES 'utf8'; + +UPDATE `PREFIX_address_format` SET `format`='firstname lastname +company +address1 +address2 +city +State:name +postcode +Country:name' +WHERE id_country = (SELECT id_country FROM `PREFIX_country` WHERE `iso_code`='GB'); + +UPDATE `PREFIX_country` SET `contains_states` = 1 WHERE `id_country` = 145; + +INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES +('PS_LEGACY_IMAGES', '1', NOW(), NOW()); \ No newline at end of file diff --git a/install-dev/sql/upgrade/1.5.0.0.sql b/install-dev/sql/upgrade/1.5.0.0.sql new file mode 100755 index 000000000..f7cdde61c --- /dev/null +++ b/install-dev/sql/upgrade/1.5.0.0.sql @@ -0,0 +1,287 @@ +SET NAMES 'utf8'; +CREATE TABLE IF NOT EXISTS `PREFIX_group_shop` ( + `id_group_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(64) CHARACTER SET utf8 NOT NULL, + `share_datas` TINYINT(1) NOT NULL, + `share_stock` TINYINT(1) NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_group_shop` (`id_group_shop`, `name`, `active`) VALUES (1, 'Default', 1); + +CREATE TABLE IF NOT EXISTS `PREFIX_shop` ( + `id_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_group_shop` int(11) unsigned NOT NULL, + `name` varchar(64) CHARACTER SET utf8 NOT NULL, + `id_category` INT(11) UNSIGNED NOT NULL DEFAULT '1', + `id_theme` INT(1) UNSIGNED NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1', + `deleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id_shop`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_category` (`id_category`), + KEY `id_theme` (`id_theme`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_shop` (`id_shop`, `id_group_shop`, `name`, `id_category`, `active`) VALUES (1, 1, 'Default', 1, 1); + +ALTER TABLE `PREFIX_configuration` ADD `id_group_shop` INT(11) UNSIGNED DEFAULT NULL AFTER `id_configuration` , ADD `id_shop` INT(11) UNSIGNED DEFAULT NULL AFTER `id_group_shop`; +ALTER TABLE `PREFIX_configuration` DROP INDEX `name` , ADD INDEX `name` ( `name` ) ; +ALTER TABLE `PREFIX_configuration` ADD INDEX (`id_group_shop`); +ALTER TABLE `PREFIX_configuration` ADD INDEX (`id_shop`); +INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES (NULL, 'PS_SHOP_DEFAULT', '1', NOW(), NOW()); +INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES (NULL, 'PS_GROUP_SHOP_DEFAULT', '1', NOW(), NOW()); + +CREATE TABLE IF NOT EXISTS `PREFIX_shop_url` ( + `id_shop_url` int(11) unsigned NOT NULL AUTO_INCREMENT, + `id_shop` int(11) unsigned NOT NULL, + `domain` varchar(255) NOT NULL, + `domain_ssl` varchar(255) NOT NULL, + `uri` varchar(64) NOT NULL, + `main` TINYINT(1) NOT NULL, + `active` TINYINT(1) NOT NULL, + PRIMARY KEY (`id_shop_url`), + KEY `id_shop` (`id_shop`), + UNIQUE KEY `shop_url` (`domain`, `uri`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_theme` ( + `id_theme` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(64) NOT NULL, + PRIMARY KEY (`id_theme`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_theme` (`id_theme`, `name`) VALUES (1, 'prestashop'); + +CREATE TABLE IF NOT EXISTS `PREFIX_theme_specific` ( + `id_theme` int(11) unsigned NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL, + `entity` int(11) unsigned NOT NULL, + `id_object` int(11) unsigned NOT NULL, + PRIMARY KEY (`id_theme`,`id_shop`, `entity`,`id_object`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE `PREFIX_stock` ( +`id_stock` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT, +`id_product` INT( 11 ) UNSIGNED NOT NULL, +`id_product_attribute` INT( 11 ) UNSIGNED NOT NULL, +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT(11) UNSIGNED NOT NULL, +`quantity` INT(11) NOT NULL, + PRIMARY KEY (`id_stock`), + KEY `id_product` (`id_product`), + KEY `id_product_attribute` (`id_product_attribute`), + KEY `id_group_shop` (`id_group_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_stock` (id_product, id_group_shop, id_shop) (SELECT p.id_product, 1, 1 FROM PREFIX_product p LEFT JOIN PREFIX_product_attribute pa ON (p.id_product = pa.id_product) WHERE pa.id_product_attribute IS NULL); +INSERT INTO `PREFIX_stock` (id_product, id_product_attribute, id_group_shop, id_shop) (SELECT id_product, id_product_attribute, 1, 1 FROM PREFIX_product_attribute); + +CREATE TABLE `PREFIX_country_shop` ( +`id_country` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_country`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_country_shop` (id_shop, id_country) (SELECT 1, id_country FROM PREFIX_country); + +CREATE TABLE `PREFIX_carrier_shop` ( +`id_carrier` INT( 11 ) UNSIGNED NOT NULL , +`id_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_carrier`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_carrier_shop` (id_shop, id_carrier) (SELECT 1, id_carrier FROM PREFIX_carrier); + +CREATE TABLE `PREFIX_cms_shop` ( +`id_cms` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_cms`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_cms_shop` (id_shop, id_cms) (SELECT 1, id_cms FROM PREFIX_cms); + +ALTER TABLE `PREFIX_cms_block` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_cms_block`; + +CREATE TABLE `PREFIX_lang_shop` ( +`id_lang` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_lang`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_lang_shop` (id_shop, id_lang) (SELECT 1, id_lang FROM PREFIX_lang); + +CREATE TABLE `PREFIX_currency_shop` ( +`id_currency` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_currency`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_currency_shop` (id_shop, id_currency) (SELECT 1, id_currency FROM PREFIX_currency); + +ALTER TABLE `PREFIX_discount` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_discount`, ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`; +ALTER TABLE `PREFIX_discount` ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); + +ALTER TABLE `PREFIX_cart` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_cart` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); + +ALTER TABLE `PREFIX_customer` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_customer` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); + +ALTER TABLE `PREFIX_orders` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_order` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); + +ALTER TABLE `PREFIX_customer_thread` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_customer_thread`; +ALTER TABLE `PREFIX_customer_thread` ADD INDEX `id_shop` (`id_shop`), ADD INDEX `id_lang` (`id_lang`), ADD INDEX `id_contact` (`id_contact`), ADD INDEX `id_customer` (`id_customer`), ADD INDEX `id_order` (`id_order`), ADD INDEX `id_product` (`id_product`); + +ALTER TABLE `PREFIX_customer_message` ADD INDEX `id_employee` (`id_employee`); + +ALTER TABLE `PREFIX_meta_lang` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_meta`; +ALTER TABLE `PREFIX_meta_lang` DROP PRIMARY KEY, ADD PRIMARY KEY (`id_meta`, `id_shop`, `id_lang`), ADD INDEX `id_shop` (`id_shop`), ADD INDEX `id_lang` (`id_lang`); + +CREATE TABLE `PREFIX_contact_shop` ( + `id_contact` INT(11) UNSIGNED NOT NULL, + `id_shop` INT(11) UNSIGNED NOT NULL, + PRIMARY KEY (`id_contact`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_contact_shop` (id_shop, id_contact) (SELECT 1, id_contact FROM `PREFIX_contact`); + +CREATE TABLE `PREFIX_image_shop` ( +`id_image` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_image`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_image_shop` (id_shop, id_image) (SELECT 1, id_image FROM PREFIX_image); + +CREATE TABLE `PREFIX_attribute_group_shop` ( +`id_attribute` INT(11) UNSIGNED NOT NULL, +`id_group_shop` INT(11) UNSIGNED NOT NULL, + PRIMARY KEY (`id_attribute`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_attribute_group_shop` (id_group_shop, id_attribute) (SELECT 1, id_attribute FROM PREFIX_attribute); + +CREATE TABLE `PREFIX_feature_group_shop` ( +`id_feature` INT(11) UNSIGNED NOT NULL, +`id_group_shop` INT(11) UNSIGNED NOT NULL , + PRIMARY KEY (`id_feature`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_feature_group_shop` (id_group_shop, id_feature) (SELECT 1, id_feature FROM PREFIX_feature); + +CREATE TABLE `PREFIX_group_group_shop` ( +`id_group` INT( 11 ) UNSIGNED NOT NULL, +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_group`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_group_group_shop` (id_group_shop, id_group) (SELECT 1, id_group FROM PREFIX_group); + +CREATE TABLE `PREFIX_attribute_group_group_shop` ( +`id_attribute_group` INT( 11 ) UNSIGNED NOT NULL , +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_attribute_group`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_attribute_group_group_shop` (id_group_shop, id_attribute_group) (SELECT 1, id_attribute_group FROM PREFIX_attribute_group); + +CREATE TABLE `PREFIX_tax_rules_group_group_shop` ( + `id_tax_rules_group` INT( 11 ) UNSIGNED NOT NULL, + `id_group_shop` INT( 11 ) UNSIGNED NOT NULL, + PRIMARY KEY (`id_tax_rules_group`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_tax_rules_group_group_shop` (`id_tax_rules_group`, `id_group_shop`) (SELECT `id_tax_rules_group`, 1 FROM `PREFIX_tax_rules_group`); + +CREATE TABLE `PREFIX_zone_group_shop` ( +`id_zone` INT( 11 ) UNSIGNED NOT NULL , +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_zone`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_zone_group_shop` (id_group_shop, id_zone) (SELECT 1, id_zone FROM PREFIX_zone); + +CREATE TABLE `PREFIX_manufacturer_group_shop` ( +`id_manufacturer` INT( 11 ) UNSIGNED NOT NULL , +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY (`id_manufacturer`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_manufacturer_group_shop` (id_group_shop, id_manufacturer) (SELECT 1, id_manufacturer FROM PREFIX_manufacturer); + +CREATE TABLE `PREFIX_supplier_group_shop` ( +`id_supplier` INT( 11 ) UNSIGNED NOT NULL, +`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_supplier`, `id_group_shop`), + KEY `id_group_shop` (`id_group_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_supplier_group_shop` (id_group_shop, id_supplier) (SELECT 1, id_supplier FROM PREFIX_supplier); + +CREATE TABLE `PREFIX_store_shop` ( +`id_store` INT( 11 ) UNSIGNED NOT NULL , +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_store`, `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_store_shop` (id_shop, id_store) (SELECT 1, id_store FROM PREFIX_store); + +CREATE TABLE `PREFIX_product_shop` ( +`id_product` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY ( `id_shop` , `id_product` ), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_product_shop` (id_shop, id_product) (SELECT 1, id_product FROM PREFIX_product); + +ALTER TABLE `PREFIX_category_lang` ADD `id_shop` INT( 11 ) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_category`; +ALTER TABLE `PREFIX_category_lang` DROP INDEX `category_lang_index`; +ALTER TABLE `PREFIX_category_lang` ADD UNIQUE KEY( `id_category`, `id_shop`, `id_lang`); + +ALTER TABLE `PREFIX_product_lang` ADD `id_shop` INT( 11 ) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_product`; +ALTER TABLE `PREFIX_product_lang` DROP INDEX `product_lang_index` ; +ALTER TABLE `PREFIX_product_lang` ADD UNIQUE KEY ( `id_product`, `id_shop` , `id_lang`); + +ALTER TABLE `PREFIX_specific_price` CHANGE `id_shop` `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1'; + +ALTER TABLE `PREFIX_hook_module` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_hook`; +ALTER TABLE `PREFIX_hook_module` DROP PRIMARY KEY; +ALTER TABLE `PREFIX_hook_module` ADD PRIMARY KEY (`id_module`,`id_hook`,`id_shop` ); +ALTER TABLE `PREFIX_hook_module_exceptions` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_hook`; + +ALTER TABLE `PREFIX_connections` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1'; +ALTER TABLE `PREFIX_page_viewed` ADD `id_group_shop` INT UNSIGNED NOT NULL DEFAULT '1' AFTER `id_page`, ADD `id_shop` INT UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`; +ALTER TABLE `PREFIX_page_viewed` DROP PRIMARY KEY, ADD PRIMARY KEY (`id_page`, `id_date_range`, `id_shop`); + +CREATE TABLE `PREFIX_module_shop` ( +`id_module` INT( 11 ) UNSIGNED NOT NULL, +`id_shop` INT( 11 ) UNSIGNED NOT NULL, +PRIMARY KEY (`id_module` , `id_shop`), + KEY `id_shop` (`id_shop`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; +INSERT INTO `PREFIX_module_shop` (`id_module`, `id_shop`) (SELECT `id_module`, 1 FROM `PREFIX_module`); + +ALTER TABLE `PREFIX_module_currency` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_module`; +ALTER TABLE `PREFIX_module_currency` DROP PRIMARY KEY; +ALTER TABLE `PREFIX_module_currency` ADD PRIMARY KEY (`id_module`, `id_shop`, `id_currency`); + +ALTER TABLE `PREFIX_module_country` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_module`; +ALTER TABLE `PREFIX_module_country` DROP PRIMARY KEY; +ALTER TABLE `PREFIX_module_country` ADD PRIMARY KEY (`id_module`, `id_shop`, `id_country`); + +ALTER TABLE `PREFIX_module_group` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_module`; +ALTER TABLE `PREFIX_module_group` DROP PRIMARY KEY; +ALTER TABLE `PREFIX_module_group` ADD PRIMARY KEY (`id_module`, `id_shop`, `id_group`); + +ALTER TABLE `PREFIX_carrier_lang` ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_carrier`; +ALTER TABLE `PREFIX_carrier_lang` DROP INDEX `shipper_lang_index`; +ALTER TABLE `PREFIX_carrier_lang` ADD UNIQUE `shipper_lang_index` (`id_carrier`, `id_shop`, `id_lang`); + +ALTER TABLE `PREFIX_search_word` ADD `id_shop` INT(11) NOT NULL DEFAULT '1' AFTER `id_word`; +ALTER TABLE `PREFIX_search_word` DROP INDEX `id_lang`, ADD UNIQUE `id_lang` (`id_lang`,`id_shop`,`word`); + +ALTER TABLE PREFIX_stock_mvt ADD id_stock INT UNSIGNED NOT NULL AFTER id_stock_mvt; +INSERT INTO PREFIX_stock (id_product, id_product_attribute, id_group_shop, id_shop, quantity) SELECT id_product, 0, 1, 1, quantity FROM PREFIX_product; +INSERT INTO PREFIX_stock (id_product, id_product_attribute, id_group_shop, id_shop, quantity) SELECT id_product, id_product_attribute, 1, 1, quantity FROM PREFIX_product_attribute; +UPDATE PREFIX_stock_mvt sm SET sm.id_stock = (SELECT s.id_stock FROM PREFIX_stock s WHERE s.id_product = sm.id_product AND s.id_product_attribute = sm.id_product_attribute); +ALTER TABLE PREFIX_stock_mvt DROP id_product, DROP id_product_attribute; + +/* PHP:create_multistore(); */ diff --git a/install-dev/todo_1.5.txt b/install-dev/todo_1.5.txt new file mode 100644 index 000000000..115deb96e --- /dev/null +++ b/install-dev/todo_1.5.txt @@ -0,0 +1 @@ +Add ALTER id_shop in upgrades for modules pagenotfound, sekeywords and statssearch \ No newline at end of file diff --git a/install-dev/view.css b/install-dev/view.css new file mode 100644 index 000000000..b610bfce0 --- /dev/null +++ b/install-dev/view.css @@ -0,0 +1,594 @@ +@CHARSET "UTF-8"; + +/* +purple #d41958 + +green #7eb423 +*/ + +body{ + background-image : url(img/bg-body.png); + font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; +} + +a:link, a:active, a:visited{ + text-decoration:none; + color:#d41958; +} +a:hover{ + color:#7eb423; +} + +#container{ + margin:1em auto 0 auto; + width:930px; + padding:10px 30px 0px 30px; + font-size:0.8em; + background : #456d01 url(img/bg-ctnr.png) top repeat-x; + display:none; +} + +#loaderSpace{ + height:24px; +} +div#loader{ + float:right; + background-image:url(../img/loadingAnimation.gif); + height:13px; + width:208px; + color:white; + display:none; +} + +div#leftpannel{ + float:left; + width:250px; + margin-top: 15px; +} + +div#leftpannel div#help{ + width:175px; + height:129px; + margin:20px 0; + padding:5px; + background:url('img/bg_help.png') no-repeat; + font-family:Arial, sans-serif; +} +div#leftpannel div#help img.ico_help{float:left; margin:5px;} +div#leftpannel div#help div.content{ + float:right; + width:125px; +} +div#leftpannel div#help div.content p.title{color:#fff;font-weight:bold;font-size:10.5pt;margin:6pt 0 3px 0;} +div#leftpannel div#help div.content p.title_down{color:#383838;font-size:8pt;margin:0;} +div#leftpannel div#help div.content ul{margin:10px 0;padding:0;} +div#leftpannel div#help div.content ul li{clear:both;padding-bottom:5px;list-style-type:none;} +div#leftpannel div#help div.content ul li img, + div#leftpannel div#help div.content ul li a{ float:left; } +div#leftpannel div#help div.content ul li a{ + display:block; + margin-left:6px; + color:#fff; + font-weight:bold; + line-height:17px; + vertical-align:middle; + text-decoration:underline; +} + +ol#tabs{ + list-style-type:none; + margin:0; + padding:0; +} + +ol#tabs li{ + background-color:#CFE5BD; + font-size:1em; + height:25px; + padding-top:10px; + clear:both; + background-color:#699d0f; + color:white; + font-weight:bold; +} + +ol#tabs li.selected{ + background : url(img/bg-tab.png) repeat-x; + height:36px; + padding-top:23px; +} + +ol#tabs li.finished{ + font-weight:normal; +} +ol#tabs li span { + display:block; + padding-left:20px; + margin-left:20px; + height:18px; +} + +ol#tabs li span.number1 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/01-gd100.png', sizingMethod='crop'); +} +html>body ol#tabs li.selected span.number1 { + filter: none; + background: url('img/01-pt100.png') no-repeat; +} + + +ol#tabs li.selected span.number1 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/01-gd100.png', sizingMethod='crop'); +} +html>body ol#tabs li.selected span.number1 { + filter: none; + background: url('img/01-gd100.png') no-repeat; +} + + + +ol#tabs li.finished span.number1 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/01-pt70.png', sizingMethod='crop'); +} +html>body ol#tabs li.finished span.number1 { + filter: none; + background: url('img/01-pt70.png') no-repeat; +} + +ol#tabs li span.number2 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/02-pt100.png', sizingMethod='crop'); +} +html>body ol#tabs li span.number2 { + filter: none; + background: url('img/02-pt100.png') no-repeat; +} + + + +ol#tabs li.selected span.number2 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/02-gd100.png', sizingMethod='crop'); +} +html>body ol#tabs li.selected span.number2 { + filter: none; + background: url('img/02-gd100.png') no-repeat; +} + + +ol#tabs li.finished span.number2 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/02-pt70.png', sizingMethod='crop'); +} +html>body ol#tabs li.finished span.number2 { + filter: none; + background: url('img/02-pt70.png') no-repeat; +} + +ol#tabs li span.number3 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/03-pt100.png', sizingMethod='crop'); +} +html>body ol#tabs li span.number3 { + filter: none; + background: url('img/03-pt100.png') no-repeat; +} + +ol#tabs li.selected span.number3 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/03-gd100.png', sizingMethod='crop'); +} +html>body ol#tabs li.selected span.number3 { + filter: none; + background: url('img/03-gd100.png') no-repeat; +} + +ol#tabs li.finished span.number3 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/03-pt70.png', sizingMethod='crop'); +} +html>body ol#tabs li.finished span.number3 { + filter: none; + background: url('img/03-pt70.png') no-repeat; +} + +ol#tabs li span.number4 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/04-pt100.png', sizingMethod='crop'); +} +html>body ol#tabs li span.number4 { + filter: none; + background: url('img/04-pt100.png') no-repeat; +} + +ol#tabs li.selected span.number4 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/04-gd100.png', sizingMethod='crop'); +} +html>body ol#tabs li.selected span.number4 { + filter: none; + background: url('img/04-gd100.png') no-repeat; +} + +ol#tabs li.finished span.number4 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/04-pt70.png', sizingMethod='crop'); +} +html>body ol#tabs li.finished span.number4 { + filter: none; + background: url('img/04-pt70.png') no-repeat; +} + +ol#tabs li span.number5 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/05-pt100.png', sizingMethod='crop'); +} +html>body ol#tabs li span.number5 { + filter: none; + background: url('img/05-pt100.png') no-repeat; +} + +ol#tabs li.selected span.number5 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/05-gd100.png', sizingMethod='crop'); +} +html>body ol#tabs li.selected span.number5 { + filter: none; + background: url('img/05-gd100.png') no-repeat; +} + +ol#tabs li.finished span.number5 { + background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/05-pt70.png', sizingMethod='crop'); +} +html>body ol#tabs li.finished span.number5 { + filter: none; + background: url('img/05-pt70.png') no-repeat; +} + +div#sheets { + float:left; + background-color:white; + margin-top:15px; + min-height:400px; + +} +* html div#sheets { + height: 400px; +} + +#sheets div.sheet{ + display:none; + width:650px; + padding:1em; +} + +h1{ + color:#7EB423; + margin:0; + text-align:center; +} + +h2{ + color:#7EB423; + font-size:1.3em; + margin:0pt 0pt 0.5em; + text-transform:uppercase; + font-weight:bold; +} + +h3{ + color:#d41958; + margin:2em 0; + font-size:0.9em; +} +p{ + margin : 0.5em 0; +} + +#sheets div#sheet_lang{ + display:block; +} + +ul#langList { + list-style-type:none; +} + +ul#langList img { + margin:0 2px; +} + +input.button { + background:transparent url(img/bt.png) no-repeat scroll 0%; + border:medium none; + color:white; + font-size:0.97em; + font-weight:bold; + margin:0pt 0.1em; + height:26px; + width:177px; + padding-bottom:0.3em; +} +input.button.little{ + background : url(img/boutonpt-on.png) no-repeat; + height:23px; + width:102px; +} + +input.button:hover { + background : url(img/bt-hover.png) no-repeat; +} +input.button.little:hover{ + background : url(img/boutonpt-over.png) no-repeat; +} + +input.button.disabled { + background : url(img/bt-dsbl.png) no-repeat; +} +input.button.little.disabled{ + background : url(img/boutonpt-disabled.png) no-repeat; +} + + +label.disabled, p.disabled{ + color:gray; +} + +input.text { + border:1px gray solid; + width:175px; +} +input.text.required { + border-color:#D41958; +} + +div#buttons{ + clear:both; + margin-right:2px; + margin-bottom:0px; + margin-top:0px; + text-align:right; + height:70px; +} + +* html div#buttons { + margin-bottom:60px; + margin-top:-30px; +} + +div#buttons input{ + margin-top :5px; + margin-left :5px; +} + +div#sheet_require ul, div#sheet_require_update ul{ + list-style-type:none; +} + +div#sheets .ok{ + padding-left: 20px; + background: url(img/ok.gif) left no-repeat; +} + +div#sheets .fail{ + font-weight:bold; + padding-left: 20px; + background: url(img/bad.gif) left no-repeat; + color:#D41958; +} + +.userInfos{ + color:gray; + font-style:italic; + font-size:0.85em; +} +p.userInfos.aligned{ + margin-left:160px; +} + +div#mailSMTPParam{ + display:none; +} + +img#uploadedImage{ + border:3px dashed #E0E0E0; + margin:auto; + padding:3px; +} +ul#footer{ + margin-top:5px; + list-style-type:none; + text-align:center; + font-size:0.7em; + margin-bottom:2px; + color:white; +} +ul#footer li{ + display:inline; +} + +ul#footer a:link, ul#footer a:active, ul#footer a:visited{ + text-decoration:none; + color:white; +} +ul#footer a:hover{ + color:#7eb423; +} + + +label.aligned{ + width:245px; + float:left; + display:block; + text-align:right; + margin-right:1em; +} +input.aligned{ + margin-left:258px; +} +* html input.aligned{ + margin-left:0; +} +span.aligned{ + margin-left:258px; +} +div.field { + margin-bottom:1.5em; +} +span.result{ + display:none; +} +div#disclaimerDivCertify{ + text-align:center; +} +div#updateLog{ + height:200px; + width:100%; + border:gray 1px dashed; + overflow:auto; + display:none; +} + +table#resultInstall{ + width:100%; + margin:10px auto 5px auto; + border:none; +} +table#resultInstall td{ + border-bottom:3px solid #FFF; + background:#F5FFE4; + padding:5px; +} +table#resultInstall td.label{ + width:35%; + text-align:right; +} +table#resultInstall td.resultEnd{width:65%;color:#D41956;font-weight:bold;} +p#alignedLogo{ + text-align:center; +} + +form.aligned{ + border:1px dashed gray; + padding:10px; + width:60%; + margin:20px 0; +} +form.aligned p{ +height:30px; +} +form.aligned label { + display:block; + width:150px; + float:left; +} +form.aligned input.text { + display:block; + width:150px; + float:left; +} + +p.aligned{ + text-align:center; +} +li.title{ + font-weight:bold; + margin:0.5em 0; +} +#infosFirstname{ + text-transform:capitalize; +} +div.request{ + border-top:1px gray dotted; + margin-top:10px; + padding-top:10px; +} +div#PrestaShopLogo{ + background:none; + width:233px; + height:68px; + text-indent:-1000px; + margin:0 auto; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/logo.png', sizingMethod='crop'); +} +html>body div#PrestaShopLogo { + filter: none; + background: url(img/logo.png) left no-repeat; +} + +div.installerVersion, div.updaterVersion { + color:#FFFFFF; + font-size:14px; + text-align:left; + padding:10px; + text-transform:uppercase; +} + +p#dbResultCheck{ + height:auto; +} +div#resultEnd{ + clear:both; +} + +div#noJavaScript{ + margin: 100px 200px 20px 200px; + padding: 100px 30px; + background-color: white; + text-align: center; +} + +a#access, a#access_update, span#box_admin{ + display:block; + width:300px; + height:150px; + background:url('img/btn-installeur.png') top left; + font-family:Arial, sans-serif; +} +a#access:hover,a#access_update:hover{background:url('img/btn-installeur.png') bottom left;} +a#access.BO{float:left;} +a#access.FO{float:right;} +a#access span{display:block;} +a#access span.title{margin:5px 15px;font-size:18pt;font-weight:bold;color:#FFF;} +a#access span.description{margin:10px 20px;color:#FFF;height:63px;} +a#access span.message{margin-left:20px;font-weight:bold;color:#FFF;} +a#access_update{float:left;} +a#access_update span{display:block;} +a#access_update span.title{margin:5px 15px;font-size:18pt;font-weight:bold;color:#FFF;} +a#access_update span.description{margin:10px 20px;color:#FFF;height:63px;} +a#access_update span.message{margin-left:20px;font-weight:bold;color:#FFF;} +h3.no-margin{margin:0;} +iframe#prestastore{width:100%;height:430px;border:none;margin:0px;} +iframe#prestastore_update{clear:both;width:100%;height:430px;border:none;margin-top:15px;} +p#php5_nok { + color:#fff; +} +p#php5_nok a { + color:#fff; + font-weight:bold; + text-decoration:underline; +} +#resultConfigHelper a{ + text-decoration:underline; +} + +#phone_block{ + font-size: 16px; + color: #fff; + height: 25px; + width: 225px; + margin-left: 3px; +} + +#phone_block span{ + font-size: 11px; + display: block; + width: 185px; +} + +.versionInfo{ + color: #D41958; +} \ No newline at end of file diff --git a/install-dev/xml/checkConfig.php b/install-dev/xml/checkConfig.php new file mode 100644 index 000000000..1b4ce6068 --- /dev/null +++ b/install-dev/xml/checkConfig.php @@ -0,0 +1,90 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 +header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé +include_once(INSTALL_PATH.'/classes/ConfigurationTest.php'); + +// Functions list to test with 'test_system' +$funcs = array('fopen', 'fclose', 'fread', 'fwrite', 'rename', 'file_exists', 'unlink', 'rmdir', 'mkdir', 'getcwd', 'chdir', 'chmod'); + +// Test list to execute (function/args) +$tests = array( + 'phpversion' => false, + 'upload' => false, + 'system' => $funcs, + 'gd' => false, + 'mysql_support' => false, + 'config_dir' => INSTALL_PATH.'/../config/', + 'tools_dir' => INSTALL_PATH.'/../tools/smarty/compile/', + 'cache_dir' => INSTALL_PATH.'/../tools/smarty/cache/', + 'tools_v2_dir' => INSTALL_PATH.'/../tools/smarty_v2/compile/', + 'cache_v2_dir' => INSTALL_PATH.'/../tools/smarty_v2/cache/', + 'sitemap' => INSTALL_PATH.'/../sitemap.xml', + 'log_dir' => INSTALL_PATH.'/../log/', + 'img_dir' => INSTALL_PATH.'/../img/', + 'mails_dir' => INSTALL_PATH.'/../mails/', + 'module_dir' => INSTALL_PATH.'/../modules/', + 'theme_lang_dir' => INSTALL_PATH.'/../themes/prestashop/lang/', + 'theme_cache_dir' => INSTALL_PATH.'/../themes/prestashop/cache/', + 'translations_dir' => INSTALL_PATH.'/../translations/', + 'customizable_products_dir' => INSTALL_PATH.'/../upload/', + 'virtual_products_dir' => INSTALL_PATH.'/../download/', +); +$tests_op = array( + 'fopen' => false, + 'register_globals' => false, + 'gz' => false, + 'mcrypt' => false, + 'magicquotes' => false, +); + +// Execute tests +$res = ConfigurationTest::check($tests); +$res_op = ConfigurationTest::check($tests_op); + +$has_error = false; + +// Building XML Tree... +echo ''."\n"; + echo ''."\n"; + echo ''."\n"; + foreach ($res AS $key => $line) + { + if ($line == 'fail') $has_error = true; + echo ''."\n"; + } + echo ''."\n"; + echo ''."\n"; + foreach ($res_op AS $key => $line) + { + if ($line == 'fail') $has_error = true; + echo ''."\n"; + } + echo ''."\n"; +echo ''; + + diff --git a/install-dev/xml/checkDB.php b/install-dev/xml/checkDB.php new file mode 100644 index 000000000..8cbb924a4 --- /dev/null +++ b/install-dev/xml/checkDB.php @@ -0,0 +1,29 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); +$resultDB = ToolsInstall::checkDB($_GET['server'], $_GET['login'], $_GET['password'], $_GET['name'], true, $_GET['engine']); +die("\n"); diff --git a/install-dev/xml/checkMail.php b/install-dev/xml/checkMail.php new file mode 100644 index 000000000..bcd6eded5 --- /dev/null +++ b/install-dev/xml/checkMail.php @@ -0,0 +1,44 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); + +$smtpChecked = (trim($_GET['mailMethod']) == 'smtp'); +$smtpServer = $_GET['smtpSrv']; +$content = $_GET['testMsg']; +$subject = $_GET['testSubject']; +$type = 'text/html'; +$to = $_GET['testEmail']; +$from = 'no-reply@'.ToolsInstall::getHttpHost(false, true, true); +$smtpLogin = $_GET['smtpLogin']; +$smtpPassword = $_GET['smtpPassword']; +$smtpPort = $_GET['smtpPort']; +$smtpEncryption = $_GET['smtpEnc']; + +$result = ToolsInstall::sendMail($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort, $smtpEncryption); +die($result ? '' : ''); + diff --git a/install-dev/xml/checkShopInfos.php b/install-dev/xml/checkShopInfos.php new file mode 100644 index 000000000..d3fa67e34 --- /dev/null +++ b/install-dev/xml/checkShopInfos.php @@ -0,0 +1,287 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7317 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (function_exists('date_default_timezone_set')) + date_default_timezone_set('Europe/Paris'); + +define('_PS_MAGIC_QUOTES_GPC_', get_magic_quotes_gpc()); +define('_PS_MYSQL_REAL_ESCAPE_STRING_', function_exists('mysql_real_escape_string')); + +include(INSTALL_PATH.'/classes/AddConfToFile.php'); +include(INSTALL_PATH.'/../classes/Validate.php'); +include(INSTALL_PATH.'/../classes/Db.php'); +include(INSTALL_PATH.'/../classes/Tools.php'); +include_once(INSTALL_PATH.'/../config/settings.inc.php'); + +Shop::setCurrentShop(); +define('_THEME_NAME_', Shop::getCurrentTheme()); +define('__PS_BASE_URI__', Shop::getCurrentBaseURI()); + +function isFormValid() +{ + global $error; + $validInfos = true; + foreach ($error as $anError) + if ($anError != '') + $validInfos = false; + return $validInfos; +} + +$error = array(); +foreach ($_GET AS &$var) +{ + if (is_string($var)) + $var = html_entity_decode($var, ENT_COMPAT, 'UTF-8'); + elseif (is_array($var)) + foreach ($var AS &$row) + $row = html_entity_decode($row, ENT_COMPAT, 'UTF-8'); +} + +if(!isset($_GET['infosShop']) OR empty($_GET['infosShop'])) + $error['infosShop'] = '0'; +else + $error['infosShop'] = ''; + +if(!isset($_GET['infosFirstname']) OR empty($_GET['infosFirstname'])) + $error['infosFirstname'] = '0'; +else + $error['infosFirstname'] = ''; + +if(!isset($_GET['infosName']) OR empty($_GET['infosName'])) + $error['infosName'] = '0'; +else + $error['infosName'] = ''; + +if(isset($_GET['infosEmail']) AND !Validate::isEmail($_GET['infosEmail'])) + $error['infosEmail'] = '3'; +else + $error['infosEmail'] = ''; + +if (isset($_GET['infosShop']) AND !Validate::isGenericName($_GET['infosShop'])) + $error['validateShop'] = '46'; +else + $error['validateShop'] = ''; + +if (isset($_GET['infosFirstname']) AND !Validate::isName($_GET['infosFirstname'])) + $error['validateFirstname'] = '47'; +else + $error['validateFirstname'] = ''; + +if (isset($_GET['infosName']) AND !Validate::isName($_GET['infosName'])) + $error['validateName'] = '48'; +else + $error['validateName'] = ''; + +if (isset($_GET['catalogMode']) AND !Validate::isInt($_GET['catalogMode'])) + $error['validateCatalogMode'] = '52'; +else + $error['validateCatalogMode'] = ''; + +if(!isset($_GET['infosEmail']) OR empty($_GET['infosEmail'])) + $error['infosEmail'] = '0'; + +if (!isset($_GET['infosPassword']) OR empty($_GET['infosPassword'])) + $error['infosPassword'] = '0'; +else + $error['infosPassword'] = ''; + +if (!isset($_GET['infosPasswordRepeat']) OR empty($_GET['infosPasswordRepeat'])) + $error['infosPasswordRepeat'] = '0'; +else + $error['infosPasswordRepeat'] = ''; + +if($error['infosPassword'] == '' AND $_GET['infosPassword'] != $_GET['infosPasswordRepeat']) + $error['infosPassword'] = '2'; + +if($error['infosPassword'] == '' AND (Tools::strlen($_GET['infosPassword']) < 8 OR !Validate::isPasswdAdmin($_GET['infosPassword']))) + $error['infosPassword'] = '12'; + +///////////////////////////// +// IF ALL IS OK DO THE NEXT// +///////////////////////////// + +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); +$dbInstance = Db::getInstance(); +// set Languages +$error['infosLanguages'] = ''; +if(isFormValid()) +{ + /*$idDefault = array_search($_GET['infosDL'][0], $_GET['infosWL']) + 1; + //prepare the requests + $sqlLanguages = array(); + + $sqlLanguages[] = "UPDATE `"._DB_PREFIX_."configuration` SET `value` = '".$idDefault."' WHERE `"._DB_PREFIX_."configuration`.`id_configuration` =1"; + $sqlLanguages[] = "TRUNCATE TABLE `"._DB_PREFIX_."lang`"; + + foreach ($_GET['infosWL'] AS $wl) + $sqlLanguages[] = "INSERT INTO `"._DB_PREFIX_."lang` (`id_lang` ,`name` ,`active` ,`iso_code`)VALUES (NULL , '".ToolsInstall::getLangString($wl)."', '1', '".pSQL($wl)."')"; + foreach($sqlLanguages AS $query) + if(!Db::getInstance()->Execute($query)) + $error['infosLanguages'] = '11'; + + // Flags copy + if(!$languagesId = Db::getInstance()->ExecuteS('SELECT `id_lang`, `iso_code` FROM `'._DB_PREFIX_.'lang`')) + $error['infosLanguages'] = '11'; + + unset($dbInstance);*/ +} + +// Mail Notification +$error['infosNotification'] = ''; +if (isFormValid()) +{ + if (isset($_GET['infosNotification']) AND $_GET['infosNotification'] == 'on') { + include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); + $smtpChecked = (trim($_GET['infosMailMethod']) == 'smtp'); + $smtpServer = $_GET['smtpSrv']; + $subject = $_GET['infosShop']." - " . $_GET['mailSubject']; + $type = 'text/html'; + $to = $_GET['infosEmail']; + $from = "no-reply@".ToolsInstall::getHttpHost(false, true, true); + $smtpLogin = $_GET['smtpLogin']; + $smtpPassword = $_GET['smtpPassword']; + $smtpPort = $_GET['smtpPort'];//'default','secure' + $smtpEncryption = $_GET['smtpEnc'];//"tls","ssl","off" + $content = ToolsInstall::getNotificationMail($_GET['infosShop'], INSTALLER__PS_BASE_URI_ABSOLUTE, INSTALLER__PS_BASE_URI_ABSOLUTE."img/logo.jpg", ToolsInstall::strtoupper($_GET['infosFirstname']), $_GET['infosName'], $_GET['infosPassword'], $_GET['infosEmail']); + + $result = @ToolsInstall::sendMail($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort, $smtpEncryption); + } +} + +//Insert configuration parameters into the database +$error['infosInsertSQL'] = ''; +if (isFormValid()) +{ + $sqlParams = array(); + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_SHOP_DOMAIN', '".Tools::getHttpHost()."', NOW(), NOW())"; + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_SHOP_DOMAIN_SSL', '".Tools::getHttpHost()."', NOW(), NOW())"; + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_INSTALL_VERSION', '".pSQL(INSTALL_VERSION)."', NOW(), NOW())"; + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_SHOP_NAME', '".pSQL($_GET['infosShop'])."', NOW(), NOW())"; + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_SHOP_EMAIL', '".pSQL($_GET['infosEmail'])."', NOW(), NOW())"; + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_MAIL_METHOD', '".pSQL($_GET['infosMailMethod'] == "smtp" ? "2": "1")."', NOW(), NOW())"; + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = \''.pSQL($_GET['isoCode']).'\' WHERE name = \'PS_LOCALE_LANGUAGE\''; + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = \''.(int)$_GET['catalogMode'].'\' WHERE name = \'PS_CATALOG_MODE\''; + $sqlParams[] = "INSERT IGNORE INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_SHOP_ACTIVITY', '".(int)($_GET['infosActivity'])."', NOW(), NOW())"; + if ((int)($_GET['infosCountry']) != 0) + { + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = '.(int)($_GET['infosCountry']).' WHERE name = \'PS_COUNTRY_DEFAULT\''; + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = "'.pSQL($_GET['infosTimezone']).'" WHERE name = \'PS_TIMEZONE\''; + $sql_isocode = Db::getInstance()->getValue('SELECT `iso_code` FROM `'._DB_PREFIX_.'country` WHERE `id_country` = '.(int)($_GET['infosCountry'])); + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = \''.pSQL($sql_isocode).'\' WHERE name = \'PS_LOCALE_COUNTRY\''; + + } + Language::loadLanguages(); + Configuration::loadConfiguration(); + require_once(dirname(__FILE__).'/../../config/defines.inc.php'); + require_once(dirname(__FILE__).'/../../classes/LocalizationPack.php'); + + + $context = stream_context_create(array('http' => array('timeout' => 5))); + $localization_file = @Tools::file_get_contents('http://www.prestashop.com/download/localization_pack.php?country='.$_GET['countryName'], false, $context); + if (!$localization_file AND file_exists(dirname(__FILE__).'/../../localization/'.strtolower($_GET['countryName']).'.xml')) + $localization_file = @file_get_contents(dirname(__FILE__).'/../../localization/'.strtolower($_GET['countryName']).'.xml'); + if ($localization_file) + { + $localizationPack = new LocalizationPackCore(); + $localizationPack->loadLocalisationPack($localization_file, '', true); + + if (Configuration::get('PS_LANG_DEFAULT') == 1) + { + $sqlParams[] = 'UPDATE `'._DB_PREFIX_.'configuration` SET `value` = (SELECT id_lang FROM '._DB_PREFIX_.'lang WHERE iso_code = \''.pSQL($_GET['isoCode']).'\') WHERE name = \'PS_LANG_DEFAULT\''; + // This request is used when _PS_MODE_DEV_ is set to true + $sqlParams[] = 'UPDATE `'._DB_PREFIX_.'lang` SET `active` = 0 WHERE `iso_code` != \''.pSQL($_GET['isoCode']).'\''; + } + else + $sqlParams[] = 'UPDATE `'._DB_PREFIX_.'lang` SET `active` = 0 WHERE `id_lang` != '.Configuration::get('PS_LANG_DEFAULT'); + } + if (isset($_GET['infosMailMethod']) AND $_GET['infosMailMethod'] == "smtp") + { + $sqlParams[] = "INSERT INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_MAIL_SERVER', '".pSQL($_GET['smtpSrv'])."', NOW(), NOW())"; + $sqlParams[] = "INSERT INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_MAIL_USER', '".pSQL($_GET['smtpLogin'])."', NOW(), NOW())"; + $sqlParams[] = "INSERT INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_MAIL_PASSWD', '".pSQL($_GET['smtpPassword'])."', NOW(), NOW())"; + $sqlParams[] = "INSERT INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_MAIL_SMTP_ENCRYPTION', '".pSQL($_GET['smtpEnc'])."', NOW(), NOW())"; + $sqlParams[] = "INSERT INTO "._DB_PREFIX_."configuration (name, value, date_add, date_upd) VALUES ('PS_MAIL_SMTP_PORT', '".pSQL($_GET['smtpPort'])."', NOW(), NOW())"; + } + $sqlParams[] = 'INSERT INTO '._DB_PREFIX_.'employee (id_employee, lastname, firstname, email, passwd, last_passwd_gen, bo_theme, active, id_profile, id_lang) VALUES (NULL, \''.pSQL(ToolsInstall::ucfirst($_GET['infosName'])).'\', \''.pSQL(ToolsInstall::ucfirst($_GET['infosFirstname'])).'\', \''.pSQL($_GET['infosEmail']).'\', \''.md5(pSQL(_COOKIE_KEY_.$_GET['infosPassword'])).'\', \''.date('Y-m-d h:i:s', strtotime('-360 minutes')).'\', \'oldschool\', 1, 1, (SELECT `value` FROM `'._DB_PREFIX_.'configuration` WHERE `name` = \'PS_LANG_DEFAULT\' LIMIT 1))'; + $sqlParams[] = 'INSERT INTO '._DB_PREFIX_.'contact (id_contact, email, customer_service) VALUES (NULL, \''.pSQL($_GET['infosEmail']).'\', 1), (NULL, \''.pSQL($_GET['infosEmail']).'\', 1)'; + + if (function_exists('mcrypt_encrypt')) + { + $settings = file_get_contents(dirname(__FILE__).'/../../config/settings.inc.php'); + if (!strstr($settings, '_RIJNDAEL_KEY_')) + { + $key_size = mcrypt_get_key_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); + $key = Tools::passwdGen($key_size); + $settings = preg_replace('/define\(\'_COOKIE_KEY_\', \'([a-z0-9=\/+-_]+)\'\);/i', 'define(\'_COOKIE_KEY_\', \'\1\');'."\n".'define(\'_RIJNDAEL_KEY_\', \''.$key.'\');', $settings); + } + if (!strstr($settings, '_RIJNDAEL_IV_')) + { + $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); + $iv = base64_encode(mcrypt_create_iv($iv_size, MCRYPT_RAND)); + $settings = preg_replace('/define\(\'_COOKIE_IV_\', \'([a-z0-9=\/+-_]+)\'\);/i', 'define(\'_COOKIE_IV_\', \'\1\');'."\n".'define(\'_RIJNDAEL_IV_\', \''.$iv.'\');', $settings); + } + if (file_put_contents(dirname(__FILE__).'/../../config/settings.inc.php', $settings)) + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = 1 WHERE name = \'PS_CIPHER_ALGORITHM\''; + } + + if (file_exists(realpath(INSTALL_PATH.'/../img').'/logo.jpg')) + { + list($width, $height, $type, $attr) = getimagesize(realpath(INSTALL_PATH.'/../img').'/logo.jpg'); + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = '.(int)round($width).' WHERE name = \'SHOP_LOGO_WIDTH\''; + $sqlParams[] = 'UPDATE '._DB_PREFIX_.'configuration SET value = '.(int)round($height).' WHERE name = \'SHOP_LOGO_HEIGHT\''; + } + + if ((int)$_GET['catalogMode'] == 1) + { + $sqlParams[] = 'DELETE c, cl FROM `'._DB_PREFIX_.'cms` AS c LEFT JOIN `'._DB_PREFIX_.'cms_lang` AS cl ON c.id_cms = cl.id_cms WHERE 1 AND c.`id_cms` IN (1, 5)'; + } + + $dbInstance = Db::getInstance(); + foreach($sqlParams as $query) + if(!$dbInstance->Execute($query)) + $error['infosInsertSQL'] = '11'; + unset($dbInstance); + + //select the version of Smarty for the version of php + Tools::selectionVersionSmarty(); +} + +////////////////////////// +// Building XML Response// +////////////////////////// + +global $logger; +echo ''."\n"; +foreach ($error AS $key => $line) +{ + if ($line != '') + $logger->logError($key.' => '.$line); + + echo ''."\n"; +} +echo ''; + diff --git a/install-dev/xml/createDB.php b/install-dev/xml/createDB.php new file mode 100644 index 000000000..40335f846 --- /dev/null +++ b/install-dev/xml/createDB.php @@ -0,0 +1,240 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7466 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_PS_MAGIC_QUOTES_GPC_')) + define('_PS_MAGIC_QUOTES_GPC_', get_magic_quotes_gpc()); + +if (!defined('_PS_MYSQL_REAL_ESCAPE_STRING_')) + define('_PS_MYSQL_REAL_ESCAPE_STRING_', function_exists('mysql_real_escape_string')); + +if (function_exists('date_default_timezone_set')) + date_default_timezone_set('Europe/Paris'); + +//delete settings file if it exist +if (file_exists(SETTINGS_FILE)) + if (!unlink(SETTINGS_FILE)) + die(''."\n"); + +include(INSTALL_PATH.'/classes/AddConfToFile.php'); +include(INSTALL_PATH.'/../classes/Validate.php'); +include(INSTALL_PATH.'/../classes/Db.php'); +include(INSTALL_PATH.'/../classes/Tools.php'); + +global $logger; + +//check db access +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); +$resultDB = ToolsInstall::checkDB($_GET['server'], $_GET['login'], $_GET['password'], $_GET['name'], true, $_GET['engine']); +if ($resultDB !== true){ + $logger->logError('Invalid database configuration'); + die("\n"); +} + + +// Check POST data... +$data_check = array( + !isset($_GET['mode']) OR ( $_GET['mode'] != "full" AND $_GET['mode'] != "lite"), + !isset($_GET['tablePrefix']) OR !Validate::isMailName($_GET['tablePrefix']) OR !preg_match('/^[a-z0-9_]*$/i', $_GET['tablePrefix']) +); +foreach ($data_check AS $data) + if ($data) + die(''."\n"); + +// Writing data in settings file +$oldLevel = error_reporting(E_ALL); +$_PS_DIRECTORY_ = str_replace(' ', '%20', INSTALLER__PS_BASE_URI); +$datas = array( + array('_DB_SERVER_', trim($_GET['server'])), + array('_DB_TYPE_', trim($_GET['type'])), + array('_DB_NAME_', trim($_GET['name'])), + array('_DB_USER_', trim($_GET['login'])), + array('_DB_PASSWD_', trim($_GET['password'])), + array('_DB_PREFIX_', trim($_GET['tablePrefix'])), + array('_MYSQL_ENGINE_', $_GET['engine']), + array('_PS_DIRECTORY_', $_PS_DIRECTORY_), + array('_PS_CACHING_SYSTEM_', 'MCached'), + array('_PS_CACHE_ENABLED_', '0'), + array('_MEDIA_SERVER_1_', ''), + array('_MEDIA_SERVER_2_', ''), + array('_MEDIA_SERVER_3_', ''), + array('_COOKIE_KEY_', Tools::passwdGen(56)), + array('_COOKIE_IV_', Tools::passwdGen(8)), + array('_PS_CREATION_DATE_', date('Y-m-d')), + array('_PS_VERSION_', INSTALL_VERSION) +); +error_reporting($oldLevel); +$confFile = new AddConfToFile(SETTINGS_FILE, 'w'); +if ($confFile->error) + die(''."\n"); + +foreach ($datas AS $data){ + $confFile->writeInFile($data[0], $data[1]); +} +$confFile->writeEndTagPhp(); + +// Settings updated, compile and cache directories must be emptied +foreach (array(INSTALL_PATH.'/../tools/smarty/cache/', INSTALL_PATH.'/../tools/smarty/compile/', INSTALL_PATH.'/../tools/smarty_v2/cache/', INSTALL_PATH.'/../tools/smarty_v2/compile/') as $dir) + if (file_exists($dir)) + foreach (scandir($dir) as $file) + if ($file[0] != '.' AND $file != 'index.php') + unlink($dir.$file); + +if ($confFile->error != false) + die(''."\n"); + +//load new settings +include(SETTINGS_FILE); + +//----------- +//import SQL data +//----------- +switch (_DB_TYPE_) { + case "MySQL" : + + $filePrefix = 'PREFIX_'; + $engineType = 'ENGINE_TYPE'; + //send the SQL structure file requests + $structureFile = dirname(__FILE__)."/../sql/db.sql"; + if(!file_exists($structureFile)) + { + $logger->logError('Impossible to access to a MySQL content file. ('.$structureFile.')'); + die(''."\n"); + } + $db_structure_settings =""; + if ( !$db_structure_settings .= file_get_contents($structureFile) ) + { + $logger->logError('Impossible to read the content of a MySQL content file. ('.$structureFile.')'); + die(''."\n"); + } + $db_structure_settings = str_replace(array($filePrefix, $engineType), array($_GET['tablePrefix'], $_GET['engine']), $db_structure_settings); + $db_structure_settings = preg_split("/;\s*[\r\n]+/",$db_structure_settings); + if (isset($_GET['dropAndCreate']) && $_GET['dropAndCreate'] == 'true') + { + array_unshift($db_structure_settings, 'USE `'.trim($_GET['name']).'`;'); + array_unshift($db_structure_settings, 'CREATE DATABASE `'.trim($_GET['name']).'`;'); + array_unshift($db_structure_settings, 'DROP DATABASE `'.trim($_GET['name']).'`;'); + } + foreach($db_structure_settings as $query){ + $query = trim($query); + if(!empty($query)){ + if(!Db::getInstance()->Execute($query)){ + if(Db::getInstance()->getNumberError() == 1050){ + $logger->logError('A Prestashop database already exists, please drop it or change the prefix.'); + die(''."\n"); + } else { + $logger->logError('SQL query: '."\r\n".$query); + $logger->logError('SQL error: '."\r\n".Db::getInstance()->getMsgError()); + die( + '' + ); + } + } + } + } + + //send the SQL data file requests + + $db_data_settings = ""; + + $liteFile = dirname(__FILE__)."/../sql/db_settings_lite.sql"; + if(!file_exists($liteFile)) + die(''."\n"); + if ( !$db_data_settings .= file_get_contents( $liteFile ) ) + die(''."\n"); + + if($_GET['mode'] == "full"){ + $fullFile = dirname(__FILE__)."/../sql/db_settings_extends.sql"; + if(!file_exists($fullFile)) + { + $logger->logError('Impossible to access to a MySQL content file. ('.$fullFile.')'); + die(''."\n"); + } + if (!$db_data_settings .= file_get_contents($fullFile)) + { + $logger->logError('Impossible to read the content of a MySQL content file. ('.$fullFile.')'); + die(''."\n"); + } + } + $db_data_settings .= "\n".'INSERT INTO `PREFIX_shop_url` (`id_shop`, `domain`, `domain_ssl`, `uri`, `main`, `active`) VALUES(1, \''.pSQL(Tools::getHttpHost()).'\', \''.pSQL(Tools::getHttpHost()).'\', \'\', 1, 1);'; + $db_data_settings .= "\n".'UPDATE `PREFIX_customer` SET `passwd` = \''.md5(_COOKIE_KEY_.'123456789').'\' WHERE `id_customer` =1;'; + $db_data_settings .= "\n".'INSERT INTO `PREFIX_configuration` (name, value, date_add, date_upd) VALUES (\'PS_VERSION_DB\', \'' . INSTALL_VERSION . '\', NOW(), NOW());'; + $db_data_settings = str_replace(array($filePrefix, $engineType), array($_GET['tablePrefix'], $_GET['engine']), $db_data_settings); + $db_data_settings = preg_split("/;\s*[\r\n]+/",$db_data_settings); + /* UTF-8 support */ + array_unshift($db_data_settings, 'SET NAMES \'utf8\';'); + foreach($db_data_settings as $query){ + $query = trim($query); + if(!empty($query)){ + if(!Db::getInstance()->Execute($query)){ + if(Db::getInstance()->getNumberError() == 1050){ + die(''."\n"); + } else { + $logger->logError('SQL query: '."\r\n".$query); + $logger->logError('SQL error: '."\r\n".Db::getInstance()->getMsgError()); + die( + '' + ); + } + } + } + } + break; +} +$xml = ''."\n"; + +$countries = Db::getInstance()->ExecuteS(' +SELECT c.`id_country`, cl.`name`, c.`iso_code` FROM `'.$_GET['tablePrefix'].'country` c +INNER JOIN `'.$_GET['tablePrefix'].'country_lang` cl ON (c.`id_country` = cl.`id_country`) +WHERE cl.`id_lang` = '.(int)($_GET['language'] + 1).' +ORDER BY cl.`name`'); + +$timezones = Db::getInstance()->ExecuteS(' +SELECT * FROM `'.$_GET['tablePrefix'].'timezone` +ORDER BY `name`'); + +$xml .= ''."\n"; +foreach ($countries as $country) + $xml .= "\t".''."\n"; +$xml .= ''."\n".''."\n"; +foreach ($timezones as $timezone) + $xml .= "\t".''."\n"; +$xml .= ''."\n"; + +die($xml); + diff --git a/install-dev/xml/doUpgrade.php b/install-dev/xml/doUpgrade.php new file mode 100644 index 000000000..127a29573 --- /dev/null +++ b/install-dev/xml/doUpgrade.php @@ -0,0 +1,386 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7387 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$filePrefix = 'PREFIX_'; +$engineType = 'ENGINE_TYPE'; + +if (function_exists('date_default_timezone_set')) + date_default_timezone_set('Europe/Paris'); + +define('_PS_MODULE_DIR_', realpath(INSTALL_PATH).'/../modules/'); +define('_PS_INSTALLER_PHP_UPGRADE_DIR_', realpath(INSTALL_PATH).'/php/'); +// Only if loyalty module is installed +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_module_loyalty.php'); +// desactivate non-native module +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'desactivatecustommodules.php'); +// utf-8 conversion if needed (before v0.9.8.1 utf-8 was badly supported) +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'utf8.php'); +// Configuration cleaner in order to get unique configuration names +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'confcleaner.php'); +// Order number in goal to add a number to each old orders +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'invoicenumber.php'); +// Order number in goal to add a number to each old orders +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'deliverynumber.php'); +// Set all groups for home category +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'setallgroupsonhomecategory.php'); +// Set payment module for each currency/country +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'setpaymentmodule.php'); +// Set payment module for each group +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'setpaymentmodulegroup.php'); +// Set discount for all categories +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'setdiscountcategory.php'); +// Module installation tools +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'module_tools.php'); +// Customizations +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'customizations.php'); +// Block newsletter +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'blocknewsletter.php'); +// Reorder product positions for drag an drop +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'reorderpositions.php'); +// Clean some module sql structures +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'updatemodulessql.php'); +// Clean carrier URL +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'updatecarrierurl.php'); +// Convert prices to the new 1.3 rounding system +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'price_converter.php'); +// Update editorial module to delete all xml methods +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'editorial_update.php'); +// Update logo and editorial image size +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_image_size_in_db.php'); +// Update product comments +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'updateproductcomments.php'); +// Update order details +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_order_details.php'); +// Update database structure (use algorithms requiring PHP) +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'database_structure.php'); +// Update cms block +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'cms_block.php'); +// Move crossselling +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'move_crossselling.php'); +// generate_tax_rules +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'generate_tax_rules.php'); +// generate_ntree +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'generate_ntree.php'); +// Before version 1.3.3 ecotax are not calculated into the price +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_products_ecotax_v133.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'shop_url.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'gridextjs_deprecated.php'); +// generate level depth +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'regenerate_level_depth.php'); +// add a new tab +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'add_new_tab.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'add_module_to_hook.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_for_13version.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'alter_cms_block.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'alter_blocklink.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_module_loyalty.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'update_module_followup.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'remove_module_from_hook.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'updatetabicon_from_11version.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'check_webservice_account_table.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'add_missing_rewrite_value.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'remove_duplicate_category_groups.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'migrate_block_info_to_cms_block.php'); + +require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'create_multistore.php'); + +//old version detection +global $oldversion, $logger; +$oldversion = false; +if (file_exists(SETTINGS_FILE) AND file_exists(DEFINES_FILE)) +{ + include_once(SETTINGS_FILE); + include_once(DEFINES_FILE); + $oldversion = _PS_VERSION_; +} +else +{ + die(''."\n"); + $logger->logError('The config/settings.inc.php file was not found.'); +} + +if (!file_exists(DEFINES_FILE)) +{ + die(''."\n"); + $logger->logError('The config/settings.inc.php file was not found.'); +} +include_once(SETTINGS_FILE); + +if (!defined('_THEMES_DIR_')) + define('_THEMES_DIR_', __PS_BASE_URI__.'themes/'); +if (!defined('_PS_IMG_')) + define('_PS_IMG_', __PS_BASE_URI__.'img/'); +if (!defined('_PS_JS_DIR_')) + define('_PS_JS_DIR_', __PS_BASE_URI__.'js/'); +if (!defined('_PS_CSS_DIR_')) + define('_PS_CSS_DIR_', __PS_BASE_URI__.'css/'); +include_once(DEFINES_FILE); + +$oldversion = _PS_VERSION_; + +$versionCompare = version_compare(INSTALL_VERSION, _PS_VERSION_); +if ($versionCompare == '-1') +{ + $logger->logError('This installer is too old.'); + die(''."\n"); +} +elseif ($versionCompare == 0) +{ + $logger->logError('You already have the '.INSTALL_VERSION.' version.'); + die(''."\n"); +} +elseif ($versionCompare === false) +{ + $logger->logError('There is no older version. Did you delete or rename the config/settings.inc.php file?'); + die(''."\n"); +} + +//check DB access +include_once(INSTALL_PATH.'/classes/ToolsInstall.php'); +$resultDB = ToolsInstall::checkDB(_DB_SERVER_, _DB_USER_, _DB_PASSWD_, _DB_NAME_, false); +if ($resultDB !== true) +{ + $logger->logError('Invalid database configuration.'); + die("\n"); +} + +//custom sql file creation +$upgradeFiles = array(); +if ($handle = opendir(INSTALL_PATH.'/sql/upgrade')) +{ + while (false !== ($file = readdir($handle))) + if ($file != '.' AND $file != '..') + $upgradeFiles[] = str_replace(".sql", "", $file); + closedir($handle); +} +if (empty($upgradeFiles)) +{ + $logger->logError('Can\'t find the sql upgrade files. Please verify that the /install/sql/upgrade folder is not empty)'); + die(''."\n"); +} +natcasesort($upgradeFiles); +$neededUpgradeFiles = array(); +foreach ($upgradeFiles AS $version) + if (version_compare($version, _PS_VERSION_) == 1 AND version_compare(INSTALL_VERSION, $version) != -1) + $neededUpgradeFiles[] = $version; +if (empty($neededUpgradeFiles)) +{ + $logger->logError('No upgrade is possible.'); + die(''."\n"); +} + + +//refresh conf file +include(INSTALL_PATH.'/classes/AddConfToFile.php'); +$oldLevel = error_reporting(E_ALL); +$mysqlEngine = (defined('_MYSQL_ENGINE_') ? _MYSQL_ENGINE_ : 'MyISAM'); +$datas = array( + array('_DB_SERVER_', _DB_SERVER_), + array('_DB_TYPE_', _DB_TYPE_), + array('_DB_NAME_', _DB_NAME_), + array('_DB_USER_', _DB_USER_), + array('_DB_PASSWD_', _DB_PASSWD_), + array('_DB_PREFIX_', _DB_PREFIX_), + array('_MYSQL_ENGINE_', $mysqlEngine), + array('_PS_CACHING_SYSTEM_', (defined('_PS_CACHING_SYSTEM_') AND _PS_CACHING_SYSTEM_ != 'MemCached') ? _PS_CACHING_SYSTEM_ : 'MCached'), + array('_PS_CACHE_ENABLED_', defined('_PS_CACHE_ENABLED_') ? _PS_CACHE_ENABLED_ : '0'), + array('_MEDIA_SERVER_1_', defined('_MEDIA_SERVER_1_') ? _MEDIA_SERVER_1_ : ''), + array('_MEDIA_SERVER_2_', defined('_MEDIA_SERVER_2_') ? _MEDIA_SERVER_2_ : ''), + array('_MEDIA_SERVER_3_', defined('_MEDIA_SERVER_3_') ? _MEDIA_SERVER_3_ : ''), + array('_PS_DIRECTORY_', __PS_BASE_URI__), + array('_COOKIE_KEY_', _COOKIE_KEY_), + array('_COOKIE_IV_', _COOKIE_IV_), + array('_PS_CREATION_DATE_', defined("_PS_CREATION_DATE_") ? _PS_CREATION_DATE_ : date('Y-m-d')), + array('_PS_VERSION_', INSTALL_VERSION) +); +if (defined('_RIJNDAEL_KEY_')) + $datas[] = array('_RIJNDAEL_KEY_', _RIJNDAEL_KEY_); +if (defined('_RIJNDAEL_IV_')) + $datas[] = array('_RIJNDAEL_IV_', _RIJNDAEL_IV_); +if(!defined('_PS_CACHE_ENABLED_')) + define('_PS_CACHE_ENABLED_', '0'); +if(!defined('_MYSQL_ENGINE_')) + define('_MYSQL_ENGINE_', 'MyISAM'); + +$sqlContent = ''; +if(isset($_GET['customModule']) AND $_GET['customModule'] == 'desactivate') + desactivate_custom_modules(); + +foreach($neededUpgradeFiles AS $version) +{ + $file = INSTALL_PATH.'/sql/upgrade/'.$version.'.sql'; + if (!file_exists($file)) + { + $logger->logError('Error while loading sql upgrade file.'); + die(''."\n"); + } + if (!$sqlContent .= file_get_contents($file)) + { + $logger->logError('Error while loading sql upgrade file.'); + die(''."\n"); + } + $sqlContent .= "\n"; +} + +$sqlContent = str_replace(array($filePrefix, $engineType), array(_DB_PREFIX_, $mysqlEngine), $sqlContent); +$sqlContent = preg_split("/;\s*[\r\n]+/",$sqlContent); + +error_reporting($oldLevel); +$confFile = new AddConfToFile(SETTINGS_FILE, 'w'); +if ($confFile->error) +{ + $logger->logError($confFile->error); + die(''."\n"); +} + +foreach ($datas AS $data){ + $confFile->writeInFile($data[0], $data[1]); +} + +if ($confFile->error != false) +{ + $logger->logError($confFile->error); + die(''."\n"); +} + +// Settings updated, compile and cache directories must be emptied +$arrayToClean = array( + INSTALL_PATH.'/../tools/smarty/cache/', + INSTALL_PATH.'/../tools/smarty/compile/', + INSTALL_PATH.'/../tools/smarty_v2/cache/', + INSTALL_PATH.'/../tools/smarty_v2/compile/'); +foreach ($arrayToClean as $dir) + if (!file_exists($dir)) + $logger->logError('directory '.$dir." doesn't exist and can't be emptied.\r\n"); + else + foreach (scandir($dir) as $file) + if ($file[0] != '.' AND $file != 'index.php' AND $file != '.htaccess') + unlink($dir.$file); + +// delete cache filesystem if activated +$depth = Configuration::get('PS_CACHEFS_DIRECTORY_DEPTH'); +if($depth) +{ + CacheFS::deleteCacheDirectory(); + CacheFS::createCacheDirectories((int)$depth); +} + +//sql file execution +global $requests, $warningExist; +$requests = ''; +$warningExist = false; + +Configuration::loadConfiguration(); + +foreach($sqlContent as $query) +{ + $query = trim($query); + if(!empty($query)) + { + /* If php code have to be executed */ + if (strpos($query, '/* PHP:') !== false) + { + /* Parsing php code */ + $pos = strpos($query, '/* PHP:') + strlen('/* PHP:'); + $phpString = substr($query, $pos, strlen($query) - $pos - strlen(' */;')); + $php = explode('::', $phpString); + preg_match('/\((.*)\)/', $phpString, $pattern); + $paramsString = trim($pattern[0], '()'); + preg_match_all('/([^,]+),? ?/', $paramsString, $parameters); + if (isset($parameters[1])) + $parameters = $parameters[1]; + else + $parameters = array(); + if (is_array($parameters)) + foreach ($parameters AS &$parameter) + $parameter = str_replace('\'', '', $parameter); + + /* Call a simple function */ + if (strpos($phpString, '::') === false) + $phpRes = call_user_func_array(str_replace($pattern[0], '', $php[0]), $parameters); + /* Or an object method */ + else + $phpRes = call_user_func_array(array($php[0], str_replace($pattern[0], '', $php[1])), $parameters); + if ((is_array($phpRes) AND !empty($phpRes['error'])) OR $phpRes === false ) + { + $logger->logError('PHP error: '.$query."\r\n".(empty($phpRes['msg'])?'':' - '.$phpRes['msg'])); + $logger->logError(empty($phpRes['error'])?'':$phpRes['error']); + if (!isset($request)) + $request = ''; + $request .= +' + + + + '."\n"; + } + else + $requests .= +' + + '."\n"; + } + elseif(!Db::getInstance()->Execute($query)) + { + $logger->logError('SQL query: '."\r\n".$query); + $logger->logError('SQL error: '."\r\n".Db::getInstance()->getMsgError()); + $warningExist = true; + $requests .= +' + + getMsgError()).']]> + getNumberError()).']]> + '."\n"; + } + else + $requests .= +' + + '."\n"; + } +} +Configuration::updateValue('PS_HIDE_OPTIMIZATION_TIPS', 0); +Configuration::updateValue('PS_NEED_REBUILD_INDEX', 1); +Configuration::updateValue('PS_VERSION_DB', INSTALL_VERSION); +$result = $warningExist ? ''."\n" : ''."\n"; +$result .= $requests; +die($result.''."\n"); + diff --git a/install-dev/xml/getNonNativeModules.php b/install-dev/xml/getNonNativeModules.php new file mode 100644 index 000000000..75fdc2a15 --- /dev/null +++ b/install-dev/xml/getNonNativeModules.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/../../config/defines.inc.php'); + +$module_list = Module::getNonNativeModuleList(); +if (sizeof($module_list)) + die(Tools::jsonEncode($module_list)); +die(Tools::jsonEncode(array())); + diff --git a/install-dev/xml/getVersionFromDb.php b/install-dev/xml/getVersionFromDb.php new file mode 100644 index 000000000..4a88bd723 --- /dev/null +++ b/install-dev/xml/getVersionFromDb.php @@ -0,0 +1,85 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(SETTINGS_FILE); +include_once(INSTALL_PATH.'/classes/GetVersionFromDb.php'); + +include(INSTALL_PATH.'/classes/LanguagesManager.php'); +$lm = new LanguageManager(INSTALL_PATH.'/langs/list.xml'); +$_LANG = array(); +$_LIST_WORDS = array(); +function lang($txt) { + global $_LANG , $_LIST_WORDS; + return (isset($_LANG[$txt]) ? $_LANG[$txt] : $txt); +} +if ($lm->getIncludeTradFilename()) + include_once($lm->getIncludeTradFilename()); + +$dbVersion = new GetVersionFromDb(); +$versions = $dbVersion->getVersions(); +$psVersionDb = Configuration::get('PS_VERSION_DB'); + +// Usefull debug +/* echo ''; +print_r($versions); +print_r($dbVersion->getErrors()); +exit;*/ + +if (!$versions) +{ + // Desactivate this case temporary + die('<action result="ok" />'); + + $message = lang('Warning, the installer was unable to detect what is your current PrestaShop version from a database structure analysis. This means some fields or tables are missing, and upgrade is under your own risk.'); + if ($psVersionDb) + { + $message .= '<br /><br />' . sprintf(lang('However the installer has detected that the version stored in your configuration table is %1$s'), '<span class="versionInfo">' . $psVersionDb . '</span>'); + } + die('<action result="ko" lang="' . htmlspecialchars($message) . '" />'); +} + +foreach ($versions as $version) +{ + if (version_compare(_PS_VERSION_, $version) == 0) + { + die('<action result="ok" />'); + } +} + +if (count($versions) == 1) +{ + die('<action result="ko" lang="' . htmlspecialchars(sprintf(lang('Warning, we detected that the version specified in your config/settings.inc.php does not match your SQL database structure.<br />File config/settings.inc.php indicates: %1$s<br />Our automatic detection tool has detected version: %2$s<br /><br />You should edit your config/settings.inc.php file to replace %1$s by %2$s.<br />Failure to fix this issue before upgrading may result in severe complications.<br />Do not forget to relaunch the installer after this modification by pressing F5 on your web browser.'), '<span class="versionInfo">' . _PS_VERSION_ . '</span>', '<span class="versionInfo">' . $versions[0] . '</span>')) . '" />'); +} + +if ($psVersionDb && in_array($psVersionDb, $versions)) +{ + die('<action result="ko" lang="' . htmlspecialchars(sprintf(lang('Warning, we detected that the version specified in your config/settings.inc.php does not match your SQL database structure.<br />File config/settings.inc.php indicates: %1$s<br />Our automatic detection tool has detected version: %2$s<br /><br />You should edit your config/settings.inc.php file to replace %1$s by %2$s.<br />Failure to fix this issue before upgrading may result in severe complications.<br />Do not forget to relaunch the installer after this modification by pressing F5 on your web browser.'), '<span class="versionInfo">' . _PS_VERSION_ . '</span>', '<span class="versionInfo">' . $psVersionDb . '</span>')) . '" />'); +} +else +{ + die('<action result="ko" lang="' . htmlspecialchars(sprintf(lang('Warning, we detected that the version specified in your config/settings.inc.php does not match your SQL database structure.<br />File config/settings.inc.php indicates: %1$s<br />Our automatic detection tool has detected a version between %2$s and %3$s<br /><br />You should edit your config/settings.inc.php file to replace %1$s by your real shop version.<br />Failure to fix this issue before upgrading may result in severe complications.<br />Do not forget to relaunch the installer after this modification by pressing F5 on your web browser.'), '<span class="versionInfo">' . _PS_VERSION_ . '</span>', '<span class="versionInfo">' . $versions[count($versions) - 1] . '</span>', '<span class="versionInfo">' . $versions[0] . '</span>')) . '" />'); +} \ No newline at end of file diff --git a/install-dev/xml/uploadLogo.php b/install-dev/xml/uploadLogo.php new file mode 100644 index 000000000..f20542599 --- /dev/null +++ b/install-dev/xml/uploadLogo.php @@ -0,0 +1,116 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +define('INSTALL_PATH', dirname(__FILE__)); + + $error = ""; + $msg = ""; + $fileElementName = 'fileToUpload'; + + if(!empty($_FILES[$fileElementName]['error'])) + { + switch($_FILES[$fileElementName]['error']) + { + + case '1': + $error = '38'; + break; + case '2': + $error = '39'; + break; + case '3': + $error = '40'; + break; + case '4': + $error = '41'; + break; + + case '6': + $error = '42'; + break; + case '7': + $error = '43'; + break; + case '8': + $error = '44'; + break; + case '999': + default: + $error = '999'; + } + } + else + { + if(empty($_FILES[$fileElementName]['tmp_name']) OR $_FILES[$fileElementName]['tmp_name'] == 'none') + { + $error = '41'; + } + else + { + list($width, $height, $type, $attr) = getimagesize($_FILES[$fileElementName]['tmp_name']); + + if($height == 0) + { + $error = '16'; + } + else + { + $newheight = $height > 500 ? 500 : $height; + $percent = $newheight / $height; + $newwidth = $width * $percent; + $newheight = $height * $percent; + $thumb = imagecreatetruecolor($newwidth, $newheight); + switch ($type) { + case 1: + $sourceImage = imagecreatefromgif($_FILES[$fileElementName]['tmp_name']); + break; + case 2: + $sourceImage = imagecreatefromjpeg($_FILES[$fileElementName]['tmp_name']); + break; + case 3: + $sourceImage = imagecreatefrompng($_FILES[$fileElementName]['tmp_name']); + break; + default: + return false; + } + + imagecopyresampled($thumb, $sourceImage, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); + + if(!is_writable(realpath(INSTALL_PATH.'/../../img').'/logo.jpg')) + $error = '58'; + else + { + if(!imagejpeg($thumb, realpath(INSTALL_PATH.'/../../img').'/logo.jpg', 90)) + { + $error = '7'; + } + } + } + } + } + echo "{"; + echo " error: '" . $error . "',\n"; + echo "}"; diff --git a/js/admin-dnd.js b/js/admin-dnd.js new file mode 100644 index 000000000..d55c95f4f --- /dev/null +++ b/js/admin-dnd.js @@ -0,0 +1,168 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$(document).ready(function() { + $('table.tableDnD').tableDnD({ + + onDragStart: function(table, row) { + originalOrder = $.tableDnD.serialize(); + reOrder = ':even'; + if (table.tBodies[0].rows[1] && $('#' + table.tBodies[0].rows[1].id).hasClass('alt_row')) + reOrder = ':odd'; + $('#'+table.id+ '#' + row.id).parent('tr').addClass('myDragClass'); + }, + dragHandle: 'dragHandle', + onDragClass: 'myDragClass', + onDrop: function(table, row) { + if (originalOrder != $.tableDnD.serialize()) { + + var way = (originalOrder.indexOf(row.id) < $.tableDnD.serialize().indexOf(row.id))? 1 : 0; + var ids = row.id.split('_'); + var tableDrag = $('#' + table.id); + var params = ''; + if (table.id == 'cms_category') + params = { + ajaxCMSCategoriesPositions: true, + id_cms_category_parent: ids[1], + id_cms_category_to_move: ids[2], + way: way, + token: token + }; + if (table.id == 'category') + params = { + ajaxCategoriesPositions: true, + id_category_parent: ids[1], + id_category_to_move: ids[2], + way: way, + token: token + }; + if (table.id == 'cms') + params = { + ajaxCMSPositions: true, + id_cms_category: ids[1], + id_cms: ids[2], + way: way, + token: token + }; + if (come_from == 'AdminModulesPositions') + params = { + ajaxModulesPositions: true, + id_hook: ids[0], + id_module: ids[1], + way: way, + token: token + }; + if (table.id == 'product') { + params = { + ajaxProductsPositions: true, + id_category: ids[1], + id_product: ids[2], + way: way, + token: token + }; + } + + $.ajax({ + type: 'POST', + async: false, + url: 'ajax.php?' + $.tableDnD.serialize(), + data: params, + success: function(data) { + if (come_from == 'AdminModulesPositions') { + tableDrag.find('tr').removeClass('alt_row'); + tableDrag.find('tr' + reOrder).addClass('alt_row'); + tableDrag.find('td.positions').each(function(i) { + $(this).html(i+1); + }); + tableDrag.find('td.dragHandle a:hidden').show(); + tableDrag.find('td.dragHandle:first a:even').hide(); + tableDrag.find('td.dragHandle:last a:odd').hide(); + } + else if (table.id == 'product') { + var reg = /_[0-9][0-9]*$/g; + tableDrag.find('tbody tr').each(function(i) { + $(this).attr('id', $(this).attr('id').replace(reg, '_' + i)); + + // Update link position + var up_reg = new RegExp('position=[-]?[0-9]+&'); + + // Up links + $(this).find('td.dragHandle a:odd').attr('href', $(this).find('td.dragHandle a:odd').attr('href').replace(up_reg, 'position='+ (i - 1) +'&')); + + // Down links + $(this).find('td.dragHandle a:even').attr('href', $(this).find('td.dragHandle a:even').attr('href').replace(up_reg, 'position='+ (i + 1) +'&')); + + }); + tableDrag.find('tr').not('.nodrag').removeClass('alt_row'); + tableDrag.find('tr:not(".nodrag"):odd').addClass('alt_row'); + tableDrag.find('tr td.dragHandle a:hidden').show(); + + if (alternate) { + tableDrag.find('tr td.dragHandle:first a:odd').hide(); + tableDrag.find('tr td.dragHandle:last a:even').hide(); + } + else { + tableDrag.find('tr td.dragHandle:first a:even').hide(); + tableDrag.find('tr td.dragHandle:last a:odd').hide(); + } + } + else + { + var reg = /_[0-9]$/g; + tableDrag.find('tbody tr').each(function(i) { + $(this).attr('id', $(this).attr('id').replace(reg, '_' + i)); + + // Update link position + var up_reg = new RegExp('position=[-]?[0-9]+&'); + + // Up links + $(this).find('td.dragHandle a:odd').attr('href', $(this).find('td.dragHandle a:odd').attr('href').replace(up_reg, 'position='+ (i - 1) +'&')); + + // Down links + $(this).find('td.dragHandle a:even').attr('href', $(this).find('td.dragHandle a:even').attr('href').replace(up_reg, 'position='+ (i + 1) +'&')); + + }); + + tableDrag.find('tr').not('.nodrag').removeClass('alt_row'); + tableDrag.find('tr:not(".nodrag"):odd').addClass('alt_row'); + tableDrag.find('tr td.dragHandle a:hidden').show(); + + if (alternate) { + tableDrag.find('tr td.dragHandle:first a:odd').hide(); + tableDrag.find('tr td.dragHandle:last a:even').hide(); + } + else { + tableDrag.find('tr td.dragHandle:first a:even').hide(); + tableDrag.find('tr td.dragHandle:last a:odd').hide(); + } + + } + } + }); + } + } + }); +}) diff --git a/js/admin-scene-cropping.js b/js/admin-scene-cropping.js new file mode 100644 index 000000000..26654efee --- /dev/null +++ b/js/admin-scene-cropping.js @@ -0,0 +1,202 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* global variables */ + +zoneCurrent = 0; +selectionCurrent = null; +valueOfZoneEdited = null; + +// Last item is used to save the current zone and +// allow to replace it if user cancel the editing +lastItemEdited = null; + +/* functions called by cropping events */ + +function showZone(){ + $('#large_scene_image').imgAreaSelect({show:true}); +} + +function hideAutocompleteBox(){ + $('#ajax_choose_product') + .fadeOut('fast') + .find('#product_autocomplete_input').val(''); +} + +function onSelectEnd(img, selection) { + selectionCurrent = selection; + showAutocompleteBox(selection.x1, selection.y1+selection.height); +} + +function undoEdit(){ + hideAutocompleteBox(); + $('#large_scene_image').imgAreaSelect({hide:true}); + $(document).unbind('keydown'); +} + +/* +** Pointer function do handle event by key released +*/ +function handlePressedKey(keyNumber, fct) +{ + // KeyDown isn't handled correctly in editing mode + $(document).keyup(function(event) + { + if (event.keyCode == keyNumber) + fct(); + }); +} + +function showAutocompleteBox(x1, y1) +{ + $('#ajax_choose_product:hidden') + .slideDown('fast'); + $('#product_autocomplete_input').focus(); + handlePressedKey('27', undoEdit); +} + +function editThisZone(aInFixedZoneElement) { + $fixedZoneElement = $(aInFixedZoneElement).parent(); + var x1 = $fixedZoneElement.css('margin-left'); + x1 = x1.substring(0,x1.indexOf('px')); + x1 = parseInt(x1); + var y1 = $fixedZoneElement.css('margin-top'); + y1 = y1.substring(0,y1.indexOf('px')); + y1 = parseInt(y1); + var width = $fixedZoneElement.css('width'); + width = width.substring(0,width.indexOf('px')); + var x2 = x1 + parseInt(width); + var height = $fixedZoneElement.css('height'); + height = height.substring(0,height.indexOf('px')); + var y2 = y1 + parseInt(height); + + valueOfZoneEdited = $fixedZoneElement.find('a').attr('rel'); + + selectionCurrent = new Array(); + selectionCurrent['x1'] = x1; + selectionCurrent['y1'] = y1; + selectionCurrent['width'] = width; + selectionCurrent['height'] = height; + + // Save the last zone + lastEditedItem = $fixedZoneElement; + + $('#product_autocomplete_input').val( $fixedZoneElement.find('p').text() ); + showAutocompleteBox(x1, y1+parseInt(height)); + + $('#large_scene_image').imgAreaSelect({ x1: x1, y1: y1, x2: x2, y2: y2 }); +} + +/* function called by cropping process (buttons clicks) */ + +function deleteProduct(index_zone){ + $('#visual_zone_' + index_zone).fadeOut('fast', function(){ + $(this).remove(); + }); + return false; +} + +function afterTextInserted (event, data, formatted) { + if (data == null) + return false; + + // If the element exist, then the user confirm the editing + // The variable need to be reinitialized to null for the next + if (lastEditedItem != null) + lastEditedItem.remove(); + lastEditedItem = null; + + zoneCurrent++; + var idProduct = data[1]; + var nameProduct = data[0]; + var x1 = selectionCurrent.x1; + var y1 = selectionCurrent.y1; + var width = selectionCurrent.width; + var height = selectionCurrent.height; + addProduct(zoneCurrent, x1, y1, width, height, idProduct, nameProduct); + +} + +function addProduct(zoneIndex, x1, y1, width, height, idProduct, nameProduct){ + $('#large_scene_image') + .imgAreaSelect({hide:true}) + .before('\ + <div class="fixed_zone" id="visual_zone_' + zoneIndex + '" style="color:black;overflow:hidden;margin-left:' + x1 + 'px; margin-top:' + y1 + 'px; width:' + width + 'px; height :' + height + 'px; background-color:white;border:1px solid black; position:absolute;" title="' + nameProduct + '">\ + <input type="hidden" name="zones[' + zoneIndex + '][x1]" value="' + x1 + '"/>\ + <input type="hidden" name="zones[' + zoneIndex + '][y1]" value="' + y1 + '"/>\ + <input type="hidden" name="zones[' + zoneIndex + '][width]" value="' + width + '"/>\ + <input type="hidden" name="zones[' + zoneIndex + '][height]" value="' + height + '"/>\ + <input type="hidden" name="zones[' + zoneIndex + '][id_product]" value="' + idProduct + '"/>\ + <p style="position:absolute;text-align:center;width:100%;" id="p_zone_' + zoneIndex + '">' + nameProduct + '</p>\ + <a style="margin-left:' + (parseInt(width)/2 - 16) + 'px; margin-top:' + (parseInt(height)/2 - 8) + 'px; position:absolute;" href="#" onclick="{deleteProduct(' + zoneIndex + '); return false;}">\ + <img src="../img/admin/delete.gif" alt="" />\ + </a>\ + <a style="margin-left:' + (parseInt(width)/2) + 'px; margin-top:' + (parseInt(height)/2 - 8) + 'px; position:absolute;" href="#" onclick="{editThisZone(this); return false;}">\ + <img src="../img/admin/edit.gif" alt=""/>\ + </a>\ + </div>\ + '); + $('.fixed_zone').css('opacity', '0.8'); + $('#save_scene').fadeIn('slow'); + $('#ajax_choose_product:visible') + .fadeOut('slow') + .find('#product_autocomplete_input').val(''); +} + +$(window).load(function () { + + /* function autocomplete */ + $('#product_autocomplete_input') + .autocomplete('ajax_products_list.php', { + minChars: 1, + autoFill: true, + max:20, + matchContains: true, + mustMatch:true, + scroll:false + }) + .result(afterTextInserted); + + $('#large_scene_image').imgAreaSelect({ + borderWidth: 1, + onSelectEnd: onSelectEnd, + onSelectStart: showZone, + onSelectChange: hideAutocompleteBox, + minHeight:30, + minWidth:30 + }); + + /* load existing products zone */ + for(var i = 0; i < startingData.length; i++) + { + addProduct(i, startingData[i][2], startingData[i][3], startingData[i][4], startingData[i][5], startingData[i][1], startingData[i][0]); + } + zoneCurrent = startingData.length; + + if (startingData.length) + $('#save_scene').show(); + +}); diff --git a/js/admin.js b/js/admin.js new file mode 100644 index 000000000..1ae411879 --- /dev/null +++ b/js/admin.js @@ -0,0 +1,846 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!id_language) + var id_language = Number(1); + +function str2url(str,encoding,ucfirst) +{ + str = str.toUpperCase(); + str = str.toLowerCase(); + + str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g,'a'); + str = str.replace(/[\u00E7\u010D\u0107\u0106]/g,'c'); + str = str.replace(/[\u010F]/g,'d'); + str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118]/g,'e'); + str = str.replace(/[\u00EC\u00ED\u00EE\u00EF]/g,'i'); + str = str.replace(/[\u0142\u0141]/g,'l'); + str = str.replace(/[\u00F1\u0148]/g,'n'); + str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3]/g,'o'); + str = str.replace(/[\u0159]/g,'r'); + str = str.replace(/[\u015B\u015A\u0161]/g,'s'); + str = str.replace(/[\u00DF]/g,'ss'); + str = str.replace(/[\u0165]/g,'t'); + str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F]/g,'u'); + str = str.replace(/[\u00FD\u00FF]/g,'y'); + str = str.replace(/[\u017C\u017A\u017B\u0179\u017E]/g,'z'); + str = str.replace(/[\u00E6]/g,'ae'); + str = str.replace(/[\u0153]/g,'oe'); + str = str.replace(/[\u013E\u013A]/g,'l'); + str = str.replace(/[\u0155]/g,'r'); + + str = str.replace(/[^a-z0-9\s\'\:\/\[\]-]/g,''); + str = str.replace(/[\s\'\:\/\[\]-]+/g,' '); + str = str.replace(/[ ]/g,'-'); + str = str.replace(/[\/]/g,'-'); + + if (ucfirst == 1) { + c = str.charAt(0); + str = c.toUpperCase()+str.slice(1); + } + + return str; +} + +function strToAltImgAttr(str,encoding,ucfirst) +{ + str = str.replace(/[\u0105\u0104\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g,'a'); + str = str.replace(/[\u00E7\u010D\u0107\u0106]/g,'c'); + str = str.replace(/[\u010F]/g,'d'); + str = str.replace(/[\u00E8\u00E9\u00EA\u00EB\u011B\u0119\u0118]/g,'e'); + str = str.replace(/[\u00EC\u00ED\u00EE\u00EF]/g,'i'); + str = str.replace(/[\u0142\u0141]/g,'l'); + str = str.replace(/[\u00F1\u0148]/g,'n'); + str = str.replace(/[\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8\u00D3]/g,'o'); + str = str.replace(/[\u0159]/g,'r'); + str = str.replace(/[\u015B\u015A\u0161]/g,'s'); + str = str.replace(/[\u00DF]/g,'ss'); + str = str.replace(/[\u0165]/g,'t'); + str = str.replace(/[\u00F9\u00FA\u00FB\u00FC\u016F]/g,'u'); + str = str.replace(/[\u00FD\u00FF]/g,'y'); + str = str.replace(/[\u017C\u017A\u017B\u0179\u017E]/g,'z'); + str = str.replace(/[\u00E6]/g,'ae'); + str = str.replace(/[\u0153]/g,'oe'); + str = str.replace(/[\u013E\u013A]/g,'l'); + str = str.replace(/[\u0155]/g,'r'); + + str = str.replace(/[^a-zA-Z0-9\s\'\:\/\[\]-]/g,''); + str = str.replace(/[\s\'\:\/\[\]-]+/g,' '); + + if (ucfirst == 1) { + c = str.charAt(0); + str = c.toUpperCase()+str.slice(1); + } + + return str; +} + +function copy2friendlyURL() +{ + $('#link_rewrite_' + id_language).val(str2url($('#name_' + id_language).val().replace(/^[0-9]+\./, ''), 'UTF-8')); +} + +function copyMeta2friendlyURL() +{ + $('#input_link_rewrite_' + id_language).val(str2url($('#name_' + id_language).val().replace(/^[0-9]+\./, ''), 'UTF-8')); +} + +function updateCurrentText() +{ + $('#current_product').html($('#name_' + id_language).val()); +} +function updateFriendlyURLByName() +{ + $('#link_rewrite_' + id_language).val(str2url($('#name_' + id_language).val(), 'UTF-8')); + $('#friendly-url').html($('#link_rewrite_' + id_language).val()); +} +function updateFriendlyURL() +{ + $('#link_rewrite_' + id_language).val(str2url($('#link_rewrite_' + id_language).val(), 'UTF-8')); + $('#seo #friendly-url').text($('#link_rewrite_' + id_language).val()); +} + +function toggleLanguageFlags(elt) +{ + $(elt).parents('.displayed_flag').siblings('.language_flags').toggle(); +} + +// Kept for retrocompatibility only (out of AdminProducts & AdminCategories) +function changeLanguage(field, fieldsString, id_language_new, iso_code) +{ + var fields = fieldsString.split('¤'); + for (var i = 0; i < fields.length; ++i) + { + getE(fields[i] + '_' + id_language).style.display = 'none'; + getE(fields[i] + '_' + id_language_new).style.display = 'block'; + getE('language_current_' + fields[i]).src = '../img/l/' + id_language_new + '.jpg'; + } + getE('languages_' + field).style.display = 'none'; + id_language = id_language_new; +} + +function changeFormLanguage(id_language_new, iso_code, employee_cookie) +{ + $('.translatable').each(function() { + $(this).find('.lang_' + id_language_new) + .show() + .siblings('div:not(.displayed_flag):not(.clear)').hide(); + $('.language_current').attr('src', '../img/l/' + id_language_new + '.jpg'); + }); + $('.language_flags').hide(); + if (employee_cookie) + $.post("ajax.php", { form_language_id: id_language_new }); + id_language = id_language_new; + updateFriendlyURL(); + updateCurrentText(); +} + +function displayFlags(languages, defaultLanguageID, employee_cookie) +{ + if ($('.translatable')) + { + $('.translatable').each(function() { + if (!$(this).find('.displayed_flag').length > 0) { + $.each(languages, function(key, language) { + if (language['id_lang'] == defaultLanguageID) + { + defaultLanguage = language; + return false; + } + }); + var displayFlags = $('<div></div>') + .addClass('displayed_flag') + .append($('<img>') + .addClass('language_current') + .addClass('pointer') + .attr('src', '../img/l/' + defaultLanguage['id_lang'] + '.jpg') + .attr('alt', defaultLanguage['name']) + .click(function() { + toggleLanguageFlags(this); + }) + ); + var languagesFlags = $('<div></div>') + .addClass('language_flags') + .html('Choose language:<br /><br />'); + $.each(languages, function(key, language) { + var img = $('<img>') + .addClass('pointer') + .css('margin', '0 2px') + .attr('src', '../img/l/' + language['id_lang'] + '.jpg') + .attr('alt', language['name']) + .click(function() { + changeFormLanguage(language['id_lang'], language['iso_code'], employee_cookie); + }); + languagesFlags.append(img); + }); + if ($(this).find('p:last-child').hasClass('clear')) + $(this).find('p:last-child').before(displayFlags).before(languagesFlags); + else + $(this).append(displayFlags).append(languagesFlags); + } + }); + } +} + +function checkAll(pForm) +{ + for (i = 0, n = pForm.elements.length; i < n; i++) + { + var objName = pForm.elements[i].name; + var objType = pForm.elements[i].type; + if (objType = 'checkbox' && objName != 'checkme') + { + box = eval(pForm.elements[i]); + box.checked = !box.checked; + } + } +} + +function checkDelBoxes(pForm, boxName, parent) +{ + for (i = 0; i < pForm.elements.length; i++) + if (pForm.elements[i].name == boxName) + pForm.elements[i].checked = parent; +} + +function checkPaymentBoxes(name, module) +{ + setPaymentBoxes(name, module); + current = $('input#checkedBox_'+ name +'_'+ module + '[type=hidden]'); + $('form#form_'+ name +' input[type=checkbox]').each( + function() + { + if ($(this).attr('name') == module + '_' + name + '[]') + $(this).attr("checked", ((current.val() == 'checked') ? true : false)); + } + ); + current.val() == 'checked' ? current.val('unchecked') : current.val('checked'); +} + +function setPaymentBoxes(name, module) +{ + current = $('input#checkedBox_'+ name +'_'+ module + '[type=hidden]'); + total = 0; + checked = 0; + $('form#form_'+ name +' input[type=checkbox]').each( + function() + { + if ($(this).attr('name') == module + '_' + name + '[]') + { + ($(this).attr("checked") ? checked++ : ''); + total++; + } + } + ); + (checked == total) ? current.val('unchecked') : current.val('checked'); +} + +function getE(name) +{ + if (document.getElementById) + var elem = document.getElementById(name); + else if (document.all) + var elem = document.all[name]; + else if (document.layers) + var elem = document.layers[name]; + return elem; +} + +function changeFormParam(pForm, url, gid) +{ + pForm.action = url; + pForm.elements["groupid"].value = gid; +} + +function addAccessory(event, data, formatted) +{ + if (data == null) + return false; + var productId = data[1]; + var productName = data[0]; + + var $divAccessories = $('#divAccessories'); + var $inputAccessories = $('#inputAccessories'); + var $nameAccessories = $('#nameAccessories'); + + /* delete product from select + add product line to the div, input_name, input_ids elements */ + $divAccessories.html($divAccessories.html() + productName + ' <span onclick="delAccessory(' + productId + ');" style="cursor: pointer;"><img src="../img/admin/delete.gif" /></span><br />'); + $nameAccessories.val($nameAccessories.val() + productName + '¤'); + $inputAccessories.val($inputAccessories.val() + productId + '-'); + $('#product_autocomplete_input').val(''); + $('#product_autocomplete_input').setOptions({ + extraParams: {excludeIds : getAccessorieIds()} + }); +} + + +function delAccessory(id) +{ + var div = getE('divAccessories'); + var input = getE('inputAccessories'); + var name = getE('nameAccessories'); + + // Cut hidden fields in array + var inputCut = input.value.split('-'); + var nameCut = name.value.split('¤'); + + if (inputCut.lenght != nameCut.lenght) + return alert('Bad size'); + + // Reset all hidden fields + input.value = ''; + name.value = ''; + div.innerHTML = ''; + for (i in inputCut) + { + // If empty, error, next + if (!inputCut[i] || !nameCut[i]) + continue ; + + // Add to hidden fields no selected products OR add to select field selected product + if (inputCut[i] != id) + { + input.value += inputCut[i] + '-'; + name.value += nameCut[i] + '¤'; + div.innerHTML += nameCut[i] + ' <span onclick="delAccessory(' + inputCut[i] + ');" style="cursor: pointer;"><img src="../img/admin/delete.gif" /></span><br />'; + } + else + $('#selectAccessories').append('<option selected="selected" value="' + inputCut[i] + '-' + nameCut[i] + '">' + inputCut[i] + ' - ' + nameCut[i] + '</option>'); + } + + $('#product_autocomplete_input').setOptions({ + extraParams: {excludeIds : getAccessorieIds()} + }); +} + +function dontChange(srcText) +{ + if (srcText == '') + return false; + if (window.search_texts) + for (var i in search_texts) + if (srcText == search_texts[i]) + return false; + return true; +} + +function queryType() +{ + var search_type = getE('bo_search_type').value; + var bo_query = getE('bo_query'); + + if (!dontChange(bo_query.value)) + bo_query.value = search_texts[search_type]; +} + +function formSubmit(e, button) +{ + var key; + + key = window.event ? window.event.keyCode : e.which; + if (key == 13) + { + getE(button).focus(); + getE(button).click(); + } +} +function noComma(elem) +{ + getE(elem).value = getE(elem).value.replace(new RegExp(',', 'g'), '.'); +} + +/* Help boxes */ +function addLoadEvent(func) { + var oldonload = window.onload; + if (typeof window.onload != 'function') { + window.onload = func; + } else { + window.onload = function() { + oldonload(); + func(); + } + } +} + +function helpboxParser(current) +{ + // While the span exists and we didn't find the right one, for each attribute, if attribute is "name" and has value == "help_box" + for (var j = 0; j < current.parentNode.getElementsByTagName('span').length; j++) + for(var k = 0; k < current.parentNode.getElementsByTagName('span')[j].attributes.length; k++) + if (current.parentNode.getElementsByTagName('span')[j].attributes[k].name === 'name' && current.parentNode.getElementsByTagName('span')[j].attributes[k].nodeValue === 'help_box') + return j; + + return -1; +} + +if (helpboxes) +{ + $(function() + { + if ($('input')) + { + $('input').focus(function() { $(this).parent().find('.hint:first').css('display', 'block'); }); + $('input').blur(function() { $(this).parent().find('.hint:first').css('display', 'none'); }); + } + }); +} + +/** + * Deprecated + * + * @param id_product + * @param id_image + */ +function changePic(id_product, id_image) +{ + if (id_image == -1) + { + getE('pic').style.display = 'none'; + return; + } + getE('pic').style.display = 'block'; + getE('pic').src = '../img/p/'+parseInt(id_product)+'-'+parseInt(id_image)+'.jpg'; +} + +/* Code generator for Affiliation and vourchers */ +function gencode(size) +{ + getE('code').value = ''; + var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + for (var i = 1; i <= size; ++i) + getE('code').value += chars.charAt(Math.floor(Math.random() * chars.length)); +} + +function free_shipping() +{ + if (getE('id_discount_type').value == 3 && getE('discount_value').value == '') + getE('discount_value').value = '0'; +} + +var newWin = null; + +function closeWin () +{ + if (newWin != null) + if (!newWin.closed) + newWin.close(); +} + +function openWin(url, title, width, height, top, left) +{ + var options; + var sizes; + + closeWin(); + options = 'toolbar=0, location=0, directories=0, statfr=no, menubar=0, scrollbars=yes, resizable=yes'; + sizes = 'width='+width+', height='+height+', top='+top+', left='+left+''; + newWin = window.open(url, title, options+', '+sizes); + newWin.focus(); +} + +function viewTemplates(id_select, id_lang, prefix, ext) +{ + var id_list = document.getElementById(id_select); + var loc = id_list.options[id_list.selectedIndex].value; + if (loc != 0) + openWin (prefix+loc+ext, 'tpl_viewing', '520', '400', '50', '300'); + return ; +} + +function validateImportation(mandatory) +{ + var type_value = []; + var seted_value = []; + var elem; + var col = 'unknow'; + + toggle(getE('error_duplicate_type'), false); + toggle(getE('required_column'), false); + for (i = 0; elem = getE('type_value['+i+']'); i++) + { + if (seted_value[elem.options[elem.selectedIndex].value]) + { + scroll(0,0); + toggle(getE('error_duplicate_type'), true); + return false; + } + else if (elem.options[elem.selectedIndex].value != 'no') + seted_value[elem.options[elem.selectedIndex].value] = true; + } + for (needed in mandatory) + if (!seted_value[mandatory[needed]]) + { + scroll(0,0); + toggle(getE('required_column'), true); + getE('missing_column').innerHTML = mandatory[needed]; + elem = getE('type_value[0]'); + for (i = 0; i < elem.length; ++i) + { + if (elem.options[i].value == mandatory[needed]) + { + getE('missing_column').innerHTML = elem.options[i].innerHTML; + break ; + } + } + return false + } +} + +function askFeatureName(selected, selector) +{ + var elem; + + if (selected.value == 'feature') + { + $('#features_' + selector).show(); + $('#feature_name_' + selector).attr('name', selected.name); + } +} + +function replaceFeature(toReplace, selector) +{ + var elem; + + if ($('#feature_name_' + selector).val() == '') + return false; + + elem = getE(toReplace); + elem.options[elem.selectedIndex].text = $('#feature_name_' + selector).val(); + elem.options[elem.selectedIndex].value = '#F_' + $('#feature_name_' + selector).val(); + $('#features_' + selector).toggle(); + $('#feature_name_' + selector).val(''); + $('#feature_name_' + selector).attr('name', ''); +} + +/* Manage default category on page: edit product */ +function checkDefaultCategory(category_id) +{ + var oldCheckbox = $('.id_category_default'); + oldCheckbox.removeClass('id_category_default'); + var checkbox = $('#categoryBox_'+category_id); + checkbox.attr('checked', 'checked'); + checkbox.addClass('id_category_default'); +} + +function checkDefaultGroup(group_id) +{ + var oldCheckbox = $('.id_group_default'); + oldCheckbox.removeClass('id_group_default'); + var checkbox = $('#groupBox_'+group_id); + checkbox.attr('checked', 'checked'); + checkbox.addClass('id_group_default'); +} + +function chooseTypeTranslation(id_lang) +{ + getE('translation_lang').value = id_lang; + document.getElementById('typeTranslationForm').submit(); +} + + +function showDiv(select_id, while_id, dest) +{ + var select = document.getElementById(select_id); + if (select.options[select.selectedIndex].value == while_id) + return toggle(getE(dest), true); + return toggle(getE(dest)); +} + +function orderDeleteProduct(txtConfirm, txtExplain) +{ + ret = true; + $('table#cancelProducts input[type=checkbox]:checked').each( + function() + { + totalCancel = parseInt($(this).parent().parent().find('td.cancelQuantity input[type=text]').val()); + totalQty = parseInt($(this).parent().find('input#totalQty[type=hidden]').val()); + totalQtyReturn = parseInt($(this).parent().find('input#totalQtyReturn[type=hidden]').val()); + productName = $(this).parent().find('input#productName[type=hidden]').val(); + totalAvailable = totalQty - totalQtyReturn; + if (totalCancel > totalAvailable) + { + alert(txtConfirm + ' : \'' + ' ' + productName + '\' ! \n\n' + txtExplain + ' ('+ totalCancel + ' > ' + totalAvailable +')' + '\n '); + ret = false; + } + } + ); + return ret; +} + +function selectCheckbox(obj) +{ + $(obj).parent().parent().find('td.cancelCheck input[type=checkbox]').attr("checked", true); +} + +function toogleShippingCost(obj) +{ + generateDiscount = $(obj).parent().find('#generateDiscount').attr("checked"); + generateCreditSlip = $(obj).parent().find('#generateCreditSlip').attr("checked"); + if (generateDiscount != true && generateCreditSlip != true) + { + $(obj).parent().find('#spanShippingBack input[type=checkbox]').attr("checked", false); + $(obj).parent().find('#spanShippingBack').css('display', 'none'); + } + else + $(obj).parent().find('#spanShippingBack').css('display', 'block'); +} + +function removeLabel(label, fieldType, type) +{ + $(label).remove(); + if (fieldType == 0) + { + if (type == 0) + customizationUploadableFileNumber--; + else + uploadableFileLabel--; + } + else + { + if (type == 0) + customizationTextFieldNumber--; + else + textFieldLabel--; + } +} + +function browseAndRemoveLabels(newCustomizationFieldNumber, customizationFieldNumber, fieldType, type) +{ + var $current = $('body').find('div[id^="' + (type == 0 ? 'label' : 'newLabel') + 'Container_' + fieldType + '_"]'); + var ids = new Array(); + var pos = $current.length - 1; + + $current.each(function() { + ids[pos--] = $(this).attr('id'); + }); + + for (var i = 0; i < $current.length; i++) + if (customizationFieldNumber > newCustomizationFieldNumber) + { + removeLabel($('#'+ids[i]), fieldType, type); + customizationFieldNumber--; + } + return customizationFieldNumber; +} + +function displayCustomizationProperties(type, force) +{ + var newCustomizationFieldNumber = Math.abs(type == 0 ? parseInt($('#uploadable_files').val()) : parseInt($('#text_fields').val())); + var customizationFieldNumber = Math.abs(type == 0 ? (parseInt(customizationUploadableFileNumber) + parseInt(uploadableFileLabel)) : (parseInt(customizationTextFieldNumber) + parseInt(textFieldLabel))); + var label = type == 0 ? parseInt(uploadableFileLabel) : parseInt(textFieldLabel); + var target = type == 0 ? '#customizationFileProperties' : '#customizationTextFieldProperties'; + /* Add some fields */ + if (newCustomizationFieldNumber > customizationFieldNumber || force) + { + var content = ''; + var j = label; + + for (var i = 0; i < newCustomizationFieldNumber - customizationFieldNumber; i++, j++) + { + var fieldsName = 'newLabel_' + type + '_' + j; + var fieldsContainerName = 'newLabelContainer_' + type + '_' + j; + content += '<div id="' + fieldsContainerName + '">'; + /* Generates input field */ + for (k = 0; k < languages.length; k++) + content += '<div id="' + fieldsName + '_' + languages[k][0] + '" style="display: ' + (parseInt(languages[k][0]) == parseInt(defaultLanguage) ? 'block' : 'none') + '; clear: left; float: left;">' + newLabel + ' #' + (j + 1) + ' <input type="text" name="' + fieldsName + '_' + languages[k][0] + '" value="" /></div>'; + /* Generates language selector & require checkbox */ + content += '<div class="display_flags"><img src="../img/l/' + parseInt(defaultLanguage) + '.jpg" class="pointer" id="language_current_' + fieldsName + '" onclick="showLanguages(\'' + fieldsName + '\');" alt="" /></div><div style="float: left; margin-left: 16px;"><input type="checkbox" name="require_' + type + '_' + j + '" value="1" /> ' + required + '</div><div id="languages_' + fieldsName + '" class="language_flags">' + choose_language + '<br /><br />'; + /* Generate language flags */ + for (k = 0; k < languages.length; k++) + content += '<img src="../img/l/' + parseInt(languages[k][0]) + '.jpg" class="pointer" alt="' + languages[k][2] + '" title="' + languages[k][2] + '" onclick="changeLanguage(\'' + fieldsName + '\', \'' + fieldsName + '\', ' + parseInt(languages[k][0]) + ', \'' + languages[k][1] + '\');" />'; + content += '</div></div>'; + if (type == 0) + uploadableFileLabel++; + else + textFieldLabel++; + } + $(target).append(content); + } + /* Remove */ + else + { + customizationFieldNumber = browseAndRemoveLabels(newCustomizationFieldNumber, customizationFieldNumber, type, 1); + browseAndRemoveLabels(newCustomizationFieldNumber, customizationFieldNumber, type, 0); + } +} + +function showAttributeColorGroup(name, container) +{ + var id_list; + var value; + + id_list = document.getElementById(name); + value = id_list.options[id_list.selectedIndex].value; + if (attributesGroups[value]) + $('#colorAttributeProperties').fadeIn(); + else + $('#colorAttributeProperties').fadeOut(); +} + +function orderOverwriteMessage(sl, text) +{ + var $zone = $('#txt_msg'); + var sl_value = sl.options[sl.selectedIndex].value; + + if (sl_value != '0') + { + if ($zone.val().length > 0 && !confirm(text)) + return ; + $zone.val(sl_value); + } +} + +function setCancelQuantity(itself, id_order_detail, quantity) +{ + $('#cancelQuantity_' + id_order_detail).val($(itself).attr('checked') ? quantity : ''); +} + +function stockManagementActivationAuthorization() +{ + if (getE('PS_STOCK_MANAGEMENT_on').checked) + { + getE('PS_ORDER_OUT_OF_STOCK_on').disabled = false; + getE('PS_ORDER_OUT_OF_STOCK_off').disabled = false; + getE('PS_DISPLAY_QTIES_on').disabled = false; + getE('PS_DISPLAY_QTIES_off').disabled = false; + } + else + { + getE('PS_DISPLAY_QTIES_off').checked = true; + getE('PS_DISPLAY_QTIES_on').disabled = 'disabled'; + getE('PS_DISPLAY_QTIES_off').disabled = 'disabled'; + getE('PS_ORDER_OUT_OF_STOCK_on').checked = true; + getE('PS_ORDER_OUT_OF_STOCK_on').disabled = 'disabled'; + getE('PS_ORDER_OUT_OF_STOCK_off').disabled = 'disabled'; + } +} + +function hookCheckboxes(id, opt, champ) +{ + if (opt == 1 && champ.checked == false) + $('#Ghook'+id).attr('checked', false); + else if (opt == 0) + { + if (champ.checked) + $('.hook'+id).attr('checked', "checked"); + else + $('.hook'+id).attr('checked', false); + } +} + +function changeCMSActivationAuthorization() +{ + if (getE('PS_CONDITIONS_on').checked) + getE('PS_CONDITIONS_CMS_ID').disabled = false; + else + getE('PS_CONDITIONS_CMS_ID').disabled = 'disabled'; +} + +function disableZipFormat() +{ + if ($('#need_zip_code_on').attr('checked') == false) + { + $('.zip_code_format').hide(); + $('#zip_code_format').val(''); + } + else + $('.zip_code_format').show(); +} + + +function spreadFees(id_range) +{ + newVal = $('#fees_all_'+id_range).val().replace(/,/g, '.'); + $('.fees_'+id_range).val(newVal); +} + +function clearAllFees(id_range) +{ + $('#fees_all_'+id_range).val(''); +} + +function toggleDraftWarning(show) +{ + if (show) + $('.draft').slideDown('slow'); + else + $('.draft').slideUp('slow'); +} + +function showOptions(show) +{ + if (show) + $('tr#product_options').slideDown('slow'); + else + $('tr#product_options').slideUp('slow'); +} + +function submitAddProductAndPreview() +{ + $('#fakeSubmitAddProductAndPreview').attr('name','submitAddProductAndPreview'); + $('#product').submit(); +} + +function submitAddcmsAndPreview() +{ + $('#previewSubmitAddcmsAndPreview').attr('name','submitAddcmsAndPreview'); + $('#cms').submit(); +} + +function showHelp(url, label, iso_lang, ps_version, doc_version, country) +{ + trackClickOnHelp(label, doc_version); + $('#help-'+label).attr('src','../img/admin/help2.png'); + window.open(url +'/'+iso_lang+'/doc/'+label+'?version='+ps_version+'&country='+country+'#', '_blank', 'scrollbars=yes,menubar=no,toolbar=no,location=no,width=517,height=600'); + return false; +} + + +function trackClickOnHelp(label, doc_version) +{ + $.ajax({ + url: 'ajax.php', + data: 'submitTrackClickOnHelp&label='+ label +'&version='+doc_version + }); +} + +$(document).ready(function() +{ + $('.multishop_config a').click(function(e) + { + var input = $(this).parent().find('input[type=checkbox]'); + input.attr('checked', (!input.attr('checked')) ? true : false); + return false; + }); + + $('.multishop_config').hover(function() + { + $(this).find('div').fadeIn('fast'); + }, function() + { + $(this).find('div').fadeOut('fast'); + }); +}); \ No newline at end of file diff --git a/js/adminImport.js b/js/adminImport.js new file mode 100644 index 000000000..43297d521 --- /dev/null +++ b/js/adminImport.js @@ -0,0 +1,111 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$(document).ready(function(){ + + $('#saveImportMatchs').unbind('click').click(function(){ + + var newImportMatchs = $('#newImportMatchs').attr('value'); + if (newImportMatchs == '') + alert(errorEmpty); + else + { + var matchFields = ''; + $('.type_value').each( function () { + matchFields += '&'+$(this).attr('id')+'='+$(this).attr('value'); + }); + $.ajax({ + type: 'GET', + url: 'ajax.php', + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&saveImportMatchs&skip='+$('input[name=skip]').attr('value')+'&newImportMatchs='+newImportMatchs+matchFields, + success: function(jsonData) + { + $('#valueImportMatchs').append('<option id="'+jsonData.id+'" value="'+matchFields+'" selected="selected">'+newImportMatchs+'</option>'); + $('#selectDivImportMatchs').fadeIn('slow'); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + alert('TECHNICAL ERROR Details: '+XMLHttpRequest.responseText); + + } + }); + + } + }); + + $('#loadImportMatchs').unbind('click').click(function(){ + + var idToLoad = $('select#valueImportMatchs option:selected').attr('id'); + $.ajax({ + type: 'GET', + url: 'ajax.php', + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&loadImportMatchs&idImportMatchs='+idToLoad, + success: function(jsonData) + { + var matchs = jsonData.matchs.split('|') + $('input[name=skip]').val(jsonData.skip); + for (i=0;i<matchs.length;i++) + $('#type_value\\['+i+'\\]').val(matchs[i]).attr('selected',true); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + alert('TECHNICAL ERROR Details: '+XMLHttpRequest.responseText); + + } + }); + }); + + $('#deleteImportMatchs').unbind('click').click(function(){ + + var idToDelete = $('select#valueImportMatchs option:selected').attr('id'); + $.ajax({ + type: 'GET', + url: 'ajax.php', + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&deleteImportMatchs&idImportMatchs='+idToDelete, + success: function(jsonData) + { + $('select#valueImportMatchs option[id=\''+idToDelete+'\']').remove(); + if ($('select#valueImportMatchs option').length == 0) + $('#selectDivImportMatchs').fadeOut(); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + alert('TECHNICAL ERROR Details: '+XMLHttpRequest.responseText); + + } + }); + + }); +}); \ No newline at end of file diff --git a/js/ajax.js b/js/ajax.js new file mode 100644 index 000000000..76f93f14d --- /dev/null +++ b/js/ajax.js @@ -0,0 +1,131 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +var query; +var lang = Array(); + +function setLang(array_lang) { lang = array_lang; } + +function getQuery() { + var result; + + result = query; + if (result == null) { + if (window.XMLHttpRequest) + result = new XMLHttpRequest(); + else if (window.ActiveXObject) + result = new ActiveXObject('Microsoft.XMLHTTP'); + } + return result; +} + +function onQueryChange() { + if (query.readyState == 4 && query.status == 200) + document.getElementById('ajax_confirmation').innerHTML = '<span class="green bold">'+lang[0]+'</span>'; +} + +function request_failed() { alert(lang[1]); } + +function showActivity() { + document.getElementById('ajax_confirmation').innerHTML = '<span class="bold">'+lang[2]+'</span>'; +} + +function check_for_all_accesses(tabsize, tabnumber) +{ + var i = 0; + var res = 0; + var right = 0; + var rights = new Array('view', 'add', 'edit', 'delete', 'all'); + + while (i != tabsize + 1) + { + if ($('#view'+i).attr('checked') == false || $('#edit'+i).attr('checked') == false || $('#add'+i).attr('checked') == false || $('#delete'+i).attr('checked') == false) + $('#all'+i).attr('checked', false); + else + $('#all'+i).attr('checked', "checked"); + i++; + } + right = 0; + while (right != 5) + { + res = 0; + i = 0; + while (i != tabsize) + { + if ($('#'+rights[right]+i).attr('checked') == true) + res++; + i++; + } + if (res == tabnumber - 1) + $('#'+rights[right]+'all').attr('checked', "checked"); + else + $('#'+rights[right]+'all').attr('checked', false); + right++; + } +} + +function perfect_access_js_gestion(src, action, id_tab, tabsize, tabnumber) +{ + if (id_tab == '-1' && action == 'all') + { + $('.add').attr('checked', src.checked); + $('.edit').attr('checked', src.checked); + $('.delete').attr('checked', src.checked); + $('.view').attr('checked', src.checked); + $('.all').attr('checked', src.checked); + $('.31').attr('checked', "checked"); + } + else if (action == 'all') + $('.'+id_tab).attr('checked', src.checked); + else if (id_tab == '-1') + { + $('.'+action).attr('checked', src.checked); + $('#'+action+'31').attr('checked', "checked"); + } + check_for_all_accesses(tabsize, tabnumber); +} + +function ajax_power(src, action, id_tab, id_profile, token, tabsize, tabnumber) +{ + query = getQuery(); + perfect_access_js_gestion(src, action, id_tab, tabsize, tabnumber); + if (query != null) { + try { + query.open('POST', 'index.php?tab=AdminAccess', true); + query.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + query.onreadystatechange = onQueryChange; + query.send('submitAddaccess=1&action='+action+'&perm='+parseInt(src.checked ? '1' : status = '0')+'&id_tab='+parseInt(id_tab)+'&id_profile='+parseInt(id_profile)+'&token='+token); + showActivity(); + } + catch(exc) { + request_failed(); + } + } + else + alert(lang[3]); +} + +function redirect(new_page) { window.location = new_page; } \ No newline at end of file diff --git a/js/attributesBack.js b/js/attributesBack.js new file mode 100644 index 000000000..0baedf890 --- /dev/null +++ b/js/attributesBack.js @@ -0,0 +1,350 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +var storeUsedGroups = {}; + +function fillCombinaison(wholesale_price, price_impact, weight_impact, unit_impact, reference, supplier_reference, ean, quantity, image, old_attr, id_product_attribute, default_attribute, eco_tax, location, upc, minimal_quantity) +{ + init_elems(); + $('#stock_mvt_attribute').show(); + $('#initial_stock_attribute').hide(); + $('#attribute_quantity').html(quantity); + $('#attribute_quantity').show(); + $('#attr_qty_stock').show(); + getE('minimal_quantity').value = minimal_quantity; + getE('attribute_reference').value = reference; + getE('attribute_supplier_reference').value = supplier_reference; + getE('attribute_ean13').value = ean; + getE('attribute_upc').value = upc; + getE('submitProductAttribute').value = modifyattributegroup; + getE('attribute_wholesale_price').value = Math.abs(wholesale_price); + getE('attribute_price').value = Math.abs(price_impact); + getE('attribute_weight').value = Math.abs(weight_impact); + getE('attribute_unity').value = Math.abs(unit_impact); + if ($('#attribute_ecotax').length != 0) + getE('attribute_ecotax').value = eco_tax; + getE('attribute_location').value = location; + if (default_attribute == 1) + getE('attribute_default').checked = true; + else + getE('attribute_default').checked = false; + + if (price_impact < 0) + { + getE('attribute_price_impact').options[getE('attribute_price_impact').selectedIndex].value = -1; + getE('attribute_price_impact').selectedIndex = 2; + } + else if (!price_impact) + { + getE('attribute_price_impact').options[getE('attribute_price_impact').selectedIndex].value = 0; + getE('attribute_price_impact').selectedIndex = 0; + } + else if (price_impact > 0) + { + getE('attribute_price_impact').options[getE('attribute_price_impact').selectedIndex].value = 1; + getE('attribute_price_impact').selectedIndex = 1; + } + if (weight_impact < 0) + { + getE('attribute_weight_impact').options[getE('attribute_weight_impact').selectedIndex].value = -1; + getE('attribute_weight_impact').selectedIndex = 2; + } + else if (!weight_impact) + { + getE('attribute_weight_impact').options[getE('attribute_weight_impact').selectedIndex].value = 0; + getE('attribute_weight_impact').selectedIndex = 0; + } + else if (weight_impact > 0) + { + getE('attribute_weight_impact').options[getE('attribute_weight_impact').selectedIndex].value = 1; + getE('attribute_weight_impact').selectedIndex = 1; + } + if (unit_impact < 0) + { + getE('attribute_unit_impact').options[getE('attribute_unit_impact').selectedIndex].value = -1; + getE('attribute_unit_impact').selectedIndex = 2; + } + else if (!unit_impact) + { + getE('attribute_unit_impact').options[getE('attribute_unit_impact').selectedIndex].value = 0; + getE('attribute_unit_impact').selectedIndex = 0; + } + else if (unit_impact > 0) + { + getE('attribute_unit_impact').options[getE('attribute_unit_impact').selectedIndex].value = 1; + getE('attribute_unit_impact').selectedIndex = 1; + } + + /* Reset all combination images */ + combinationImages = $('#id_image_attr').find("input[id^=id_image_attr_]"); + combinationImages.each(function() { + this.checked = false; + }); + + /* Check combination images */ + if (typeof(combination_images[id_product_attribute]) != 'undefined') + for (i = 0; i < combination_images[id_product_attribute].length; i++) + getE('id_image_attr_' + combination_images[id_product_attribute][i]).checked = true; + + check_impact(); + check_weight_impact(); + check_unit_impact(); + + var elem = getE('product_att_list'); + for (var i = 0; i < old_attr.length; i++) + { + var opt = document.createElement('option'); + opt.text = old_attr[i++]; + opt.value = old_attr[i]; + + try { + elem.add(opt, null); + } + catch(ex) { + elem.add(opt); + } + } + getE('id_product_attribute').value = id_product_attribute; + if (document.getElementById) + var style = document.getElementById('ResetSpan').style; + else if (document.all) + var style = document.all['ResetSpan'].style; + else if (document.layers) + var style = document.layers['ResetSpan'].style; + if (style.display == 'none') + style.display = 'block'; +} + +function populate_attrs() +{ + var attr_group = getE('attribute_group'); + if (!attr_group) + return; + var attr_name = getE('attribute'); + var number = attr_group.options.length ? attr_group.options[attr_group.selectedIndex].value : 0; + + if (!number) + { + attr_name.options.length = 0; + attr_name.options[0] = new Option('---', 0); + return; + } + + var list = attrs[number]; + attr_name.options.length = 0; + + for(i = 0; i < list.length; i += 2) + attr_name.options[i / 2] = new Option(list[i + 1], list[i]); +} + +function check_impact() +{ + if ($('#attribute_price_impact').get(0).selectedIndex == 0) + { + $('#attribute_price').val('0.00'); + $('#span_impact').hide(); + } + else + $('#span_impact').show(); +} + +function check_weight_impact() +{ + if ($('#attribute_weight_impact').get(0).selectedIndex == 0) + { + $('#span_weight_impact').hide(); + $('#attribute_weight').val('0.00'); + } + else + $('#span_weight_impact').show(); +} + +function check_unit_impact() +{ + if ($('#attribute_unit_impact').get(0).selectedIndex == 0) + { + $('#span_unit_impact').hide(); + $('#attribute_unity').val('0.00'); + } + else + $('#span_unit_impact').show(); +} + +function init_elems() +{ + $('#stock_mvt_attribute').hide(); + $('#initial_stock_attribute').show(); + $('#attr_qty_stock').hide(); + var elem = getE('product_att_list'); + + if (elem.length) + for (i = elem.length - 1; i >= 0; i--) + if (elem[i]) + elem.remove(i); + + getE('attribute_price_impact').selectedIndex = 0; + getE('attribute_weight_impact').selectedIndex = 0; + getE('attribute_unit_impact').selectedIndex = 0; + $('#span_unit_impact').hide(); + $('#unity_third').html($('#unity_second').html()); + if ($('#unity').get(0).value.length > 0) + $('#tr_unit_impact').show(); + else + $('#tr_unit_impact').hide(); + try + { + if (impact.options[impact.selectedIndex].value == 0) + getE('span_impact').style.display = 'none'; + if (impact2.options[impact.selectedIndex].value == 0) + getE('span_weight_impact').style.display = 'none'; + } + catch (e) + { + getE('span_impact').style.display = 'none'; + getE('span_weight_impact').style.display = 'none'; + } +} + +function attr_selectall() +{ + var elem = getE('product_att_list'); + var i; + + for (i = 0; i < elem.length; i++) + elem.options[i].selected = true; +} + +function del_attr_multiple() +{ + var attr = getE('attribute_group'); + + if (!attr) + return ; + var length = attr.length; + var target; + + for (var i = 0; i < length; ++i) + { + elem = attr.options[i]; + if (elem.selected) + { + target = getE('table_' + elem.parentNode.getAttribute('name')); + if (target && getE('result_' + elem.getAttribute('name'))) + { + target.removeChild(getE('result_' + elem.getAttribute('name'))); + if (!target.lastChild || !target.lastChild.id) + toggle(target.parentNode, false); + } + } + } +} + +function create_attribute_row(id, id_group, name, price, weight) +{ + var html = ''; + html += '<tr id="result_'+id+'">'; + html += '<td><input type="hidden" value="'+id+'" name="options['+id_group+']['+id+']" />'+name+'</td>'; + html += '<td>'+i18n_tax_exc+'<input id="related_to_price_impact_ti_'+id+'" class="price_impact" style="width:50px" type="text" value="'+price+'" name="price_impact_'+id+'" onkeyup="calcPrice($(this), false)"></td>'; + html += '<td>'+i18n_tax_inc+'<input id="related_to_price_impact_'+id+'" class="price_impact_ti" style="width:50px" type="text" value="" name="price_impact_ti_'+id+'" onkeyup="calcPrice($(this), true)"></td>'; + html += '<td><input style="width:50px" type="text" value="'+weight+'" name="weight_impact['+id+']"></td>'; + html += '</tr>'; + + return html; +} + +function add_attr_multiple() +{ + var attr = getE('attribute_group'); + if (!attr) + return ; + var length = attr.length; + var target; + var new_elem; + + for (var i = 0; i < length; ++i) + { + elem = attr.options[i]; + if (elem.selected) + { + name = elem.parentNode.getAttribute('name'); + target = $('#table_' + name); + if (target && !getE('result_' + elem.getAttribute('name'))) + { + new_elem = create_attribute_row(elem.getAttribute('name'), elem.parentNode.getAttribute('name'), elem.value, '0.00', '0.00'); + target.append(new_elem); + toggle(target.parent()[0], true); + } + } + } +} + +/** + * Delete one or several attributes from the declination multilist + */ +function del_attr() +{ + $('#product_att_list option:selected').each(function() + { + delete storeUsedGroups[$(this).attr('groupid')]; + $(this).remove(); + }); +} + +/** + * Add an attribute from a group in the declination multilist + */ +function add_attr() +{ + var attr_group = $('#attribute_group option:selected'); + if (attr_group.val() == 0) + return alert('Please choose a group'); + + var attr_name = $('#attribute option:selected'); + if (attr_name.val() == 0) + return alert('Please choose an attribute'); + + if (attr_group.val() in storeUsedGroups) + return alert('You can only add one type of group per combination'); + + storeUsedGroups[attr_group.val()] = true; + $('<option></option>') + .attr('value', attr_name.val()) + .attr('groupid', attr_group.val()) + .text(attr_group.text() + ' : ' + attr_name.text()) + .appendTo('#product_att_list'); +} + +function openCloseLayer(whichLayer) +{ + if (document.getElementById) + var style = document.getElementById(whichLayer).style; + else if (document.all) + var style = document.all[whichLayer].style; + else if (document.layers) + var style = document.layers[whichLayer].style; + style.display = style.display == 'none' ? 'block' : 'none'; +} + diff --git a/js/checkLangPack.js b/js/checkLangPack.js new file mode 100644 index 000000000..0474a8f3d --- /dev/null +++ b/js/checkLangPack.js @@ -0,0 +1,50 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function checkLangPack(){ + $('p#resultCheckLangPack').hide(); + if ($('#iso_code').val().length == 2) + { + $.ajax( + { + url: "ajax_lang_packs.php", + cache: false, + data: {iso_lang:$('#iso_code').val(), ps_version:$('#ps_version').val()}, + dataType : 'json', + success: function(ret) + { + if(typeof ret == 'object') + $('p#resultCheckLangPack').html(langPackOk+' <b>'+ret.name+'</b>) :'+'<br />'+langPackVersion+''+ret.version+' <a href="http://www.prestashop.com/download/lang_packs/gzip/'+ret.version+'/'+$('#iso_code').val()+'.gzip" target="_blank" class="link">'+download+'</a><br />'+langPackInfo).show("slow"); + else if (ret == "offline") + $('p#resultCheckLangPack').show('slow'); + } + }); + } +} + +$(document).ready(function() { + $('p#resultCheckLangPack').hide(); +}); diff --git a/js/cropper/builder.js b/js/cropper/builder.js new file mode 100644 index 000000000..5b15ba939 --- /dev/null +++ b/js/cropper/builder.js @@ -0,0 +1,101 @@ +// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// See scriptaculous.js for full license. + +var Builder = { + NODEMAP: { + AREA: 'map', + CAPTION: 'table', + COL: 'table', + COLGROUP: 'table', + LEGEND: 'fieldset', + OPTGROUP: 'select', + OPTION: 'select', + PARAM: 'object', + TBODY: 'table', + TD: 'table', + TFOOT: 'table', + TH: 'table', + THEAD: 'table', + TR: 'table' + }, + // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, + // due to a Firefox bug + node: function(elementName) { + elementName = elementName.toUpperCase(); + + // try innerHTML approach + var parentTag = this.NODEMAP[elementName] || 'div'; + var parentElement = document.createElement(parentTag); + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" + elementName + "></" + elementName + ">"; + } catch(e) {} + var element = parentElement.firstChild || null; + + // see if browser added wrapping tags + if(element && (element.tagName != elementName)) + element = element.getElementsByTagName(elementName)[0]; + + // fallback to createElement approach + if(!element) element = document.createElement(elementName); + + // abort if nothing could be created + if(!element) return; + + // attributes (or text) + if(arguments[1]) + if(this._isStringOrNumber(arguments[1]) || + (arguments[1] instanceof Array)) { + this._children(element, arguments[1]); + } else { + var attrs = this._attributes(arguments[1]); + if(attrs.length) { + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" +elementName + " " + + attrs + "></" + elementName + ">"; + } catch(e) {} + element = parentElement.firstChild || null; + // workaround firefox 1.0.X bug + if(!element) { + element = document.createElement(elementName); + for(attr in arguments[1]) + element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; + } + if(element.tagName != elementName) + element = parentElement.getElementsByTagName(elementName)[0]; + } + } + + // text, or array of children + if(arguments[2]) + this._children(element, arguments[2]); + + return element; + }, + _text: function(text) { + return document.createTextNode(text); + }, + _attributes: function(attributes) { + var attrs = []; + for(attribute in attributes) + attrs.push((attribute=='className' ? 'class' : attribute) + + '="' + attributes[attribute].toString().escapeHTML() + '"'); + return attrs.join(" "); + }, + _children: function(element, children) { + if(typeof children=='object') { // array can hold nodes and text + children.flatten().each( function(e) { + if(typeof e=='object') + element.appendChild(e) + else + if(Builder._isStringOrNumber(e)) + element.appendChild(Builder._text(e)); + }); + } else + if(Builder._isStringOrNumber(children)) + element.appendChild(Builder._text(children)); + }, + _isStringOrNumber: function(param) { + return(typeof param=='string' || typeof param=='number'); + } +} \ No newline at end of file diff --git a/js/cropper/cropper.css b/js/cropper/cropper.css new file mode 100644 index 000000000..cba90a029 --- /dev/null +++ b/js/cropper/cropper.css @@ -0,0 +1,143 @@ +.imgCrop_wrap { + position: relative; + cursor: crosshair; +} + +.imgCrop_wrap.opera8 .imgCrop_overlay, +.imgCrop_wrap.opera8 .imgCrop_clickArea { + background-color: transparent; +} + +.imgCrop_wrap, +.imgCrop_wrap * { + font-size: 0; +} + +.imgCrop_overlay { + background-color: #000; + opacity: 0.5; + filter:alpha(opacity=50); + position: absolute; + width: 100%; + height: 100%; +} + +.imgCrop_selArea { + position: absolute; + cursor: move; + z-index: 2; +} + +.imgCrop_clickArea { + width: 100%; + height: 100%; + background-color: #FFF; + opacity: 0.01; + filter:alpha(opacity=01); +} + +.imgCrop_marqueeHoriz { + position: absolute; + width: 100%; + height: 1px; + background: transparent url(marqueeHoriz.gif) repeat-x 0 0; + z-index: 3; +} + +.imgCrop_marqueeVert { + position: absolute; + height: 100%; + width: 1px; + background: transparent url(marqueeVert.gif) repeat-y 0 0; + z-index: 3; +} + +.imgCrop_marqueeNorth { top: 0; left: 0; } +.imgCrop_marqueeEast { top: 0; right: 0; } +.imgCrop_marqueeSouth { bottom: 0px; left: 0; } +.imgCrop_marqueeWest { top: 0; left: 0; } + + +.imgCrop_handle { + position: absolute; + border: 1px solid #333; + width: 6px; + height: 6px; + background: #FFF; + opacity: 0.5; + filter:alpha(opacity=50); + z-index: 4; +} + +* html .imgCrop_handle { + width: 8px; + height: 8px; + wid\th: 6px; + hei\ght: 6px; +} + +.imgCrop_handleN { + top: -3px; + left: 0; + cursor: n-resize; +} + +.imgCrop_handleNE { + top: -3px; + right: -3px; + cursor: ne-resize; +} + +.imgCrop_handleE { + top: 0; + right: -3px; + cursor: e-resize; +} + +.imgCrop_handleSE { + right: -3px; + bottom: -3px; + cursor: se-resize; +} + +.imgCrop_handleS { + right: 0; + bottom: -3px; + cursor: s-resize; +} + +.imgCrop_handleSW { + left: -3px; + bottom: -3px; + cursor: sw-resize; +} + +.imgCrop_handleW { + top: 0; + left: -3px; + cursor: w-resize; +} + +.imgCrop_handleNW { + top: -3px; + left: -3px; + cursor: nw-resize; +} + +.imgCrop_dragArea { + width: 100%; + height: 100%; + z-index: 200; + position: absolute; + top: 0; + left: 0; +} + +.imgCrop_previewWrap { + margin: 20px 0 0 20px; + float: left; +} + +#testImage { + position: absolute; +} \ No newline at end of file diff --git a/js/cropper/cropper.js b/js/cropper/cropper.js new file mode 100644 index 000000000..b159988fd --- /dev/null +++ b/js/cropper/cropper.js @@ -0,0 +1,572 @@ +/** + * Copyright (c) 2006, David Spurr (http://www.defusion.org.uk/) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * * Neither the name of the David Spurr nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://www.opensource.org/licenses/bsd-license.php + * + * See scriptaculous.js for full scriptaculous licence + */ + +var CropDraggable=Class.create(); +Object.extend(Object.extend(CropDraggable.prototype,Draggable.prototype),{initialize:function(_1){ +this.options=Object.extend({drawMethod:function(){ +}},arguments[1]||{}); +this.element=$(_1); +this.handle=this.element; +this.delta=this.currentDelta(); +this.dragging=false; +this.eventMouseDown=this.initDrag.bindAsEventListener(this); +Event.observe(this.handle,"mousedown",this.eventMouseDown); +Draggables.register(this); +},draw:function(_2){ +var _3=Position.cumulativeOffset(this.element); +var d=this.currentDelta(); +_3[0]-=d[0]; +_3[1]-=d[1]; +var p=[0,1].map(function(i){ +return (_2[i]-_3[i]-this.offset[i]); +}.bind(this)); +this.options.drawMethod(p); +}}); +var Cropper={}; +Cropper.Img=Class.create(); +Cropper.Img.prototype={initialize:function(_7,_8){ +this.options=Object.extend({ratioDim:{x:0,y:0},minWidth:0,minHeight:0,displayOnInit:false,onEndCrop:Prototype.emptyFunction,captureKeys:true,onloadCoords:null,maxWidth:0,maxHeight:0},_8||{}); +this.img=$(_7); +this.clickCoords={x:0,y:0}; +this.dragging=false; +this.resizing=false; +this.isWebKit=/Konqueror|Safari|KHTML/.test(navigator.userAgent); +this.isIE=/MSIE/.test(navigator.userAgent); +this.isOpera8=/Opera\s[1-8]/.test(navigator.userAgent); +this.ratioX=0; +this.ratioY=0; +this.attached=false; +this.fixedWidth=(this.options.maxWidth>0&&(this.options.minWidth>=this.options.maxWidth)); +this.fixedHeight=(this.options.maxHeight>0&&(this.options.minHeight>=this.options.maxHeight)); +if(typeof this.img=="undefined"){ +return; +} +$A(document.getElementsByTagName("script")).each(function(s){ +if(s.src.match(/cropper\.js/)){ +var _a=s.src.replace(/cropper\.js(.*)?/,""); +var _b=document.createElement("link"); +_b.rel="stylesheet"; +_b.type="text/css"; +_b.href=_a+"cropper.css"; +_b.media="screen"; +document.getElementsByTagName("head")[0].appendChild(_b); +} +}); +if(this.options.ratioDim.x>0&&this.options.ratioDim.y>0){ +var _c=this.getGCD(this.options.ratioDim.x,this.options.ratioDim.y); +this.ratioX=this.options.ratioDim.x/_c; +this.ratioY=this.options.ratioDim.y/_c; +} +this.subInitialize(); +if(this.img.complete||this.isWebKit){ +this.onLoad(); +}else{ +Event.observe(this.img,"load",this.onLoad.bindAsEventListener(this)); +} +},getGCD:function(a,b){ +if(b==0){ +return a; +} +return this.getGCD(b,a%b); +},onLoad:function(){ +var _f="imgCrop_"; +var _10=this.img.parentNode; +var _11=""; +if(this.isOpera8){ +_11=" opera8"; +} +this.imgWrap=Builder.node("div",{"class":_f+"wrap"+_11}); +this.north=Builder.node("div",{"class":_f+"overlay "+_f+"north"},[Builder.node("span")]); +this.east=Builder.node("div",{"class":_f+"overlay "+_f+"east"},[Builder.node("span")]); +this.south=Builder.node("div",{"class":_f+"overlay "+_f+"south"},[Builder.node("span")]); +this.west=Builder.node("div",{"class":_f+"overlay "+_f+"west"},[Builder.node("span")]); +var _12=[this.north,this.east,this.south,this.west]; +this.dragArea=Builder.node("div",{"class":_f+"dragArea"},_12); +this.handleN=Builder.node("div",{"class":_f+"handle "+_f+"handleN"}); +this.handleNE=Builder.node("div",{"class":_f+"handle "+_f+"handleNE"}); +this.handleE=Builder.node("div",{"class":_f+"handle "+_f+"handleE"}); +this.handleSE=Builder.node("div",{"class":_f+"handle "+_f+"handleSE"}); +this.handleS=Builder.node("div",{"class":_f+"handle "+_f+"handleS"}); +this.handleSW=Builder.node("div",{"class":_f+"handle "+_f+"handleSW"}); +this.handleW=Builder.node("div",{"class":_f+"handle "+_f+"handleW"}); +this.handleNW=Builder.node("div",{"class":_f+"handle "+_f+"handleNW"}); +this.selArea=Builder.node("div",{"class":_f+"selArea"},[Builder.node("div",{"class":_f+"marqueeHoriz "+_f+"marqueeNorth"},[Builder.node("span")]),Builder.node("div",{"class":_f+"marqueeVert "+_f+"marqueeEast"},[Builder.node("span")]),Builder.node("div",{"class":_f+"marqueeHoriz "+_f+"marqueeSouth"},[Builder.node("span")]),Builder.node("div",{"class":_f+"marqueeVert "+_f+"marqueeWest"},[Builder.node("span")]),this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW,Builder.node("div",{"class":_f+"clickArea"})]); +this.imgWrap.appendChild(this.img); +this.imgWrap.appendChild(this.dragArea); +this.dragArea.appendChild(this.selArea); +this.dragArea.appendChild(Builder.node("div",{"class":_f+"clickArea"})); +_10.appendChild(this.imgWrap); +this.startDragBind=this.startDrag.bindAsEventListener(this); +Event.observe(this.dragArea,"mousedown",this.startDragBind); +this.onDragBind=this.onDrag.bindAsEventListener(this); +Event.observe(document,"mousemove",this.onDragBind); +this.endCropBind=this.endCrop.bindAsEventListener(this); +Event.observe(document,"mouseup",this.endCropBind); +this.resizeBind=this.startResize.bindAsEventListener(this); +this.handles=[this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW]; +this.registerHandles(true); +if(this.options.captureKeys){ +this.keysBind=this.handleKeys.bindAsEventListener(this); +Event.observe(document,"keypress",this.keysBind); +} +new CropDraggable(this.selArea,{drawMethod:this.moveArea.bindAsEventListener(this)}); +this.setParams(); +},registerHandles:function(_13){ +for(var i=0;i<this.handles.length;i++){ +var _15=$(this.handles[i]); +if(_13){ +var _16=false; +if(this.fixedWidth&&this.fixedHeight){ +_16=true; +}else{ +if(this.fixedWidth||this.fixedHeight){ +var _17=_15.className.match(/([S|N][E|W])$/); +var _18=_15.className.match(/(E|W)$/); +var _19=_15.className.match(/(N|S)$/); +if(_17){ +_16=true; +}else{ +if(this.fixedWidth&&_18){ +_16=true; +}else{ +if(this.fixedHeight&&_19){ +_16=true; +} +} +} +} +} +if(_16){ +_15.hide(); +}else{ +Event.observe(_15,"mousedown",this.resizeBind); +} +}else{ +_15.show(); +Event.stopObserving(_15,"mousedown",this.resizeBind); +} +} +},setParams:function(){ +this.imgW=this.img.width; +this.imgH=this.img.height; +$(this.north).setStyle({height:0}); +$(this.east).setStyle({width:0,height:0}); +$(this.south).setStyle({height:0}); +$(this.west).setStyle({width:0,height:0}); +$(this.imgWrap).setStyle({"width":this.imgW+"px","height":this.imgH+"px"}); +$(this.selArea).hide(); +var _1a={x1:0,y1:0,x2:0,y2:0}; +var _1b=false; +if(this.options.onloadCoords!=null){ +_1a=this.cloneCoords(this.options.onloadCoords); +_1b=true; +}else{ +if(this.options.ratioDim.x>0&&this.options.ratioDim.y>0){ +_1a.x1=Math.ceil((this.imgW-this.options.ratioDim.x)/2); +_1a.y1=Math.ceil((this.imgH-this.options.ratioDim.y)/2); +_1a.x2=_1a.x1+this.options.ratioDim.x; +_1a.y2=_1a.y1+this.options.ratioDim.y; +_1b=true; +} +} +//this.setAreaCoords(_1a,false,false,1); +if(this.options.displayOnInit&&_1b){ +this.selArea.show(); +this.drawArea(); +this.endCrop(); +} +this.attached=true; +},remove:function(){ +if(this.attached){ +this.attached=false; +this.imgWrap.parentNode.insertBefore(this.img,this.imgWrap); +this.imgWrap.parentNode.removeChild(this.imgWrap); +Event.stopObserving(this.dragArea,"mousedown",this.startDragBind); +Event.stopObserving(document,"mousemove",this.onDragBind); +Event.stopObserving(document,"mouseup",this.endCropBind); +this.registerHandles(false); +if(this.options.captureKeys){ +Event.stopObserving(document,"keypress",this.keysBind); +} +} +}, +reset:function(minWidth, minHeight, maxWidth, maxHeight) +{ + if(!this.attached){ + this.onLoad(); + }else{ + this.setParams(); + } + this.endCrop(); + this.options.minWidth = minWidth; + this.options.minHeight = minHeight; + this.options.maxWidth = maxWidth; + this.options.maxHeight = maxHeight; +},handleKeys:function(e){ +var dir={x:0,y:0}; +if(!this.dragging){ +switch(e.keyCode){ +case (37): +dir.x=-1; +break; +case (38): +dir.y=-1; +break; +case (39): +dir.x=1; +break; +case (40): +dir.y=1; +break; +} +if(dir.x!=0||dir.y!=0){ +if(e.shiftKey){ +dir.x*=10; +dir.y*=10; +} +this.moveArea([this.areaCoords.x1+dir.x,this.areaCoords.y1+dir.y]); +Event.stop(e); +} +} +},calcW:function(){ +return (this.areaCoords.x2-this.areaCoords.x1); +},calcH:function(){ +return (this.areaCoords.y2-this.areaCoords.y1); +},moveArea:function(_1e){ +this.setAreaCoords({x1:_1e[0],y1:_1e[1],x2:_1e[0]+this.calcW(),y2:_1e[1]+this.calcH()},true,false); +this.drawArea(); +},cloneCoords:function(_1f){ +return {x1:_1f.x1,y1:_1f.y1,x2:_1f.x2,y2:_1f.y2}; +},setAreaCoords:function(_20,_21,_22,_23,_24){ +if(_21){ +var _25=_20.x2-_20.x1; +var _26=_20.y2-_20.y1; +if(_20.x1<0){ +_20.x1=0; +_20.x2=_25; +} +if(_20.y1<0){ +_20.y1=0; +_20.y2=_26; +} +if(_20.x2>this.imgW){ +_20.x2=this.imgW; +_20.x1=this.imgW-_25; +} +if(_20.y2>this.imgH){ +_20.y2=this.imgH; +_20.y1=this.imgH-_26; +} +}else{ +if(_20.x1<0){ +_20.x1=0; +} +if(_20.y1<0){ +_20.y1=0; +} +if(_20.x2>this.imgW){ +_20.x2=this.imgW; +} +if(_20.y2>this.imgH){ +_20.y2=this.imgH; +} +if(_23!=null){ +if(this.ratioX>0){ +this.applyRatio(_20,{x:this.ratioX,y:this.ratioY},_23,_24); +}else{ +if(_22){ +this.applyRatio(_20,{x:1,y:1},_23,_24); +} +} +var _27=[this.options.minWidth,this.options.minHeight]; +var _28=[this.options.maxWidth,this.options.maxHeight]; +if(_27[0]>0||_27[1]>0||_28[0]>0||_28[1]>0){ +var _29={a1:_20.x1,a2:_20.x2}; +var _2a={a1:_20.y1,a2:_20.y2}; +var _2b={min:0,max:this.imgW}; +var _2c={min:0,max:this.imgH}; +if((_27[0]!=0||_27[1]!=0)&&_22){ +if(_27[0]>0){ +_27[1]=_27[0]; +}else{ +if(_27[1]>0){ +_27[0]=_27[1]; +} +} +} +if((_28[0]!=0||_28[0]!=0)&&_22){ +if(_28[0]>0&&_28[0]<=_28[1]){ +_28[1]=_28[0]; +}else{ +if(_28[1]>0&&_28[1]<=_28[0]){ +_28[0]=_28[1]; +} +} +} +if(_27[0]>0){ +this.applyDimRestriction(_29,_27[0],_23.x,_2b,"min"); +} +if(_27[1]>1){ +this.applyDimRestriction(_2a,_27[1],_23.y,_2c,"min"); +} +if(_28[0]>0){ +this.applyDimRestriction(_29,_28[0],_23.x,_2b,"max"); +} +if(_28[1]>1){ +this.applyDimRestriction(_2a,_28[1],_23.y,_2c,"max"); +} +_20={x1:_29.a1,y1:_2a.a1,x2:_29.a2,y2:_2a.a2}; +} +} +} +this.areaCoords=_20; +},applyDimRestriction:function(_2d,val,_2f,_30,_31){ +var _32; +if(_31=="min"){ +_32=((_2d.a2-_2d.a1)<val); +}else{ +_32=((_2d.a2-_2d.a1)>val); +} +if(_32){ +if(_2f==1){ +_2d.a2=_2d.a1+val; +}else{ +_2d.a1=_2d.a2-val; +} +if(_2d.a1<_30.min){ +_2d.a1=_30.min; +_2d.a2=val; +}else{ +if(_2d.a2>_30.max){ +_2d.a1=_30.max-val; +_2d.a2=_30.max; +} +} +} +},applyRatio:function(_33,_34,_35,_36){ +var _37; +if(_36=="N"||_36=="S"){ +_37=this.applyRatioToAxis({a1:_33.y1,b1:_33.x1,a2:_33.y2,b2:_33.x2},{a:_34.y,b:_34.x},{a:_35.y,b:_35.x},{min:0,max:this.imgW}); +_33.x1=_37.b1; +_33.y1=_37.a1; +_33.x2=_37.b2; +_33.y2=_37.a2; +}else{ +_37=this.applyRatioToAxis({a1:_33.x1,b1:_33.y1,a2:_33.x2,b2:_33.y2},{a:_34.x,b:_34.y},{a:_35.x,b:_35.y},{min:0,max:this.imgH}); +_33.x1=_37.a1; +_33.y1=_37.b1; +_33.x2=_37.a2; +_33.y2=_37.b2; +} +},applyRatioToAxis:function(_38,_39,_3a,_3b){ +var _3c=Object.extend(_38,{}); +var _3d=_3c.a2-_3c.a1; +var _3e=Math.floor(_3d*_39.b/_39.a); +var _3f; +var _40; +var _41=null; +if(_3a.b==1){ +_3f=_3c.b1+_3e; +if(_3f>_3b.max){ +_3f=_3b.max; +_41=_3f-_3c.b1; +} +_3c.b2=_3f; +}else{ +_3f=_3c.b2-_3e; +if(_3f<_3b.min){ +_3f=_3b.min; +_41=_3f+_3c.b2; +} +_3c.b1=_3f; +} +if(_41!=null){ +_40=Math.floor(_41*_39.a/_39.b); +if(_3a.a==1){ +_3c.a2=_3c.a1+_40; +}else{ +_3c.a1=_3c.a1=_3c.a2-_40; +} +} +return _3c; +},drawArea:function(){ +var _42=this.calcW(); +var _43=this.calcH(); +var px="px"; +var _45=[this.areaCoords.x1+px,this.areaCoords.y1+px,_42+px,_43+px,this.areaCoords.x2+px,this.areaCoords.y2+px,(this.img.width-this.areaCoords.x2)+px,(this.img.height-this.areaCoords.y2)+px]; +var _46=this.selArea.style; +_46.left=_45[0]; +_46.top=_45[1]; +_46.width=_45[2]; +_46.height=_45[3]; +var _47=Math.ceil((_42-6)/2)+px; +var _48=Math.ceil((_43-6)/2)+px; +this.handleN.style.left=_47; +this.handleE.style.top=_48; +this.handleS.style.left=_47; +this.handleW.style.top=_48; +this.north.style.height=_45[1]; +var _49=this.east.style; +_49.top=_45[1]; +_49.height=_45[3]; +_49.left=_45[4]; +_49.width=_45[6]; +var _4a=this.south.style; +_4a.top=_45[5]; +_4a.height=_45[7]; +var _4b=this.west.style; +_4b.top=_45[1]; +_4b.height=_45[3]; +_4b.width=_45[0]; +this.subDrawArea(); +this.forceReRender(); +},forceReRender:function(){ +if(this.isIE||this.isWebKit){ +var n=document.createTextNode(" "); +var d,el,fixEL,i; +if(this.isIE){ +fixEl=this.selArea; +}else{ +if(this.isWebKit){ +fixEl=document.getElementsByClassName("imgCrop_marqueeSouth",this.imgWrap)[0]; +d=Builder.node("div",""); +d.style.visibility="hidden"; +var _4e=["SE","S","SW"]; +for(i=0;i<_4e.length;i++){ +el=document.getElementsByClassName("imgCrop_handle"+_4e[i],this.selArea)[0]; +if(el.childNodes.length){ +el.removeChild(el.childNodes[0]); +} +el.appendChild(d); +} +} +} +fixEl.appendChild(n); +fixEl.removeChild(n); +} +},startResize:function(e){ +this.startCoords=this.cloneCoords(this.areaCoords); +this.resizing=true; +this.resizeHandle=Event.element(e).classNames().toString().replace(/([^N|NE|E|SE|S|SW|W|NW])+/,""); +Event.stop(e); +},startDrag:function(e){ +this.selArea.show(); +this.clickCoords=this.getCurPos(e); +this.setAreaCoords({x1:this.clickCoords.x,y1:this.clickCoords.y,x2:this.clickCoords.x,y2:this.clickCoords.y},false,false,null); +this.dragging=true; +this.onDrag(e); +Event.stop(e); +},getCurPos:function(e){ +var el=this.imgWrap,wrapOffsets=Position.cumulativeOffset(el); +while(el.nodeName!="BODY"){ +wrapOffsets[1]-=el.scrollTop||0; +wrapOffsets[0]-=el.scrollLeft||0; +el=el.parentNode; +} +return curPos={x:Event.pointerX(e)-wrapOffsets[0],y:Event.pointerY(e)-wrapOffsets[1]}; +},onDrag:function(e){ +if(this.dragging||this.resizing){ +var _54=null; +var _55=this.getCurPos(e); +var _56=this.cloneCoords(this.areaCoords); +var _57={x:1,y:1}; +if(this.dragging){ +if(_55.x<this.clickCoords.x){ +_57.x=-1; +} +if(_55.y<this.clickCoords.y){ +_57.y=-1; +} +this.transformCoords(_55.x,this.clickCoords.x,_56,"x"); +this.transformCoords(_55.y,this.clickCoords.y,_56,"y"); +}else{ +if(this.resizing){ +_54=this.resizeHandle; +if(_54.match(/E/)){ +this.transformCoords(_55.x,this.startCoords.x1,_56,"x"); +if(_55.x<this.startCoords.x1){ +_57.x=-1; +} +}else{ +if(_54.match(/W/)){ +this.transformCoords(_55.x,this.startCoords.x2,_56,"x"); +if(_55.x<this.startCoords.x2){ +_57.x=-1; +} +} +} +if(_54.match(/N/)){ +this.transformCoords(_55.y,this.startCoords.y2,_56,"y"); +if(_55.y<this.startCoords.y2){ +_57.y=-1; +} +}else{ +if(_54.match(/S/)){ +this.transformCoords(_55.y,this.startCoords.y1,_56,"y"); +if(_55.y<this.startCoords.y1){ +_57.y=-1; +} +} +} +} +} +this.setAreaCoords(_56,false,e.shiftKey,_57,_54); +this.drawArea(); +Event.stop(e); +} +},transformCoords:function(_58,_59,_5a,_5b){ +var _5c=[_58,_59]; +if(_58>_59){ +_5c.reverse(); +} +_5a[_5b+"1"]=_5c[0]; +_5a[_5b+"2"]=_5c[1]; +},endCrop:function(){ +this.dragging=false; +this.resizing=false; +this.options.onEndCrop(this.areaCoords,{width:this.calcW(),height:this.calcH()}); +},subInitialize:function(){ +},subDrawArea:function(){ +}}; +Cropper.ImgWithPreview=Class.create(); +Object.extend(Object.extend(Cropper.ImgWithPreview.prototype,Cropper.Img.prototype),{subInitialize:function(){ +this.hasPreviewImg=false; +if(typeof (this.options.previewWrap)!="undefined"&&this.options.minWidth>0&&this.options.minHeight>0){ +this.previewWrap=$(this.options.previewWrap); +this.previewImg=this.img.cloneNode(false); +this.previewImg.id="imgCrop_"+this.previewImg.id; +this.options.displayOnInit=true; +this.hasPreviewImg=true; +this.previewWrap.addClassName("imgCrop_previewWrap"); +this.previewWrap.setStyle({width:this.options.minWidth+"px",height:this.options.minHeight+"px"}); +this.previewWrap.appendChild(this.previewImg); +} +},subDrawArea:function(){ +if(this.hasPreviewImg){ +var _5d=this.calcW(); +var _5e=this.calcH(); +var _5f={x:this.imgW/_5d,y:this.imgH/_5e}; +var _60={x:_5d/this.options.minWidth,y:_5e/this.options.minHeight}; +var _61={w:Math.ceil(this.options.minWidth*_5f.x)+"px",h:Math.ceil(this.options.minHeight*_5f.y)+"px",x:"-"+Math.ceil(this.areaCoords.x1/_60.x)+"px",y:"-"+Math.ceil(this.areaCoords.y1/_60.y)+"px"}; +var _62=this.previewImg.style; +_62.width=_61.w; +_62.height=_61.h; +_62.left=_61.x; +_62.top=_61.y; +} +}}); + diff --git a/js/cropper/dragdrop.js b/js/cropper/dragdrop.js new file mode 100644 index 000000000..be2a30f53 --- /dev/null +++ b/js/cropper/dragdrop.js @@ -0,0 +1,915 @@ +// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) +// +// See scriptaculous.js for full license. + +/*--------------------------------------------------------------------------*/ + +var Droppables = { + drops: [], + + remove: function(element) { + this.drops = this.drops.reject(function(d) { return d.element==$(element) }); + }, + + add: function(element) { + element = $(element); + var options = Object.extend({ + greedy: true, + hoverclass: null, + tree: false + }, arguments[1] || {}); + + // cache containers + if(options.containment) { + options._containers = []; + var containment = options.containment; + if((typeof containment == 'object') && + (containment.constructor == Array)) { + containment.each( function(c) { options._containers.push($(c)) }); + } else { + options._containers.push($(containment)); + } + } + + if(options.accept) options.accept = [options.accept].flatten(); + + Element.makePositioned(element); // fix IE + options.element = element; + + this.drops.push(options); + }, + + findDeepestChild: function(drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) + if (Element.isParent(drops[i].element, deepest.element)) + deepest = drops[i]; + + return deepest; + }, + + isContained: function(element, drop) { + var containmentNode; + if(drop.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return drop._containers.detect(function(c) { return containmentNode == c }); + }, + + isAffected: function(point, element, drop) { + return ( + (drop.element!=element) && + ((!drop._containers) || + this.isContained(element, drop)) && + ((!drop.accept) || + (Element.classNames(element).detect( + function(v) { return drop.accept.include(v) } ) )) && + Position.within(drop.element, point[0], point[1]) ); + }, + + deactivate: function(drop) { + if(drop.hoverclass) + Element.removeClassName(drop.element, drop.hoverclass); + this.last_active = null; + }, + + activate: function(drop) { + if(drop.hoverclass) + Element.addClassName(drop.element, drop.hoverclass); + this.last_active = drop; + }, + + show: function(point, element) { + if(!this.drops.length) return; + var affected = []; + + if(this.last_active) this.deactivate(this.last_active); + this.drops.each( function(drop) { + if(Droppables.isAffected(point, element, drop)) + affected.push(drop); + }); + + if(affected.length>0) { + drop = Droppables.findDeepestChild(affected); + Position.within(drop.element, point[0], point[1]); + if(drop.onHover) + drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); + + Droppables.activate(drop); + } + }, + + fire: function(event, element) { + if(!this.last_active) return; + Position.prepare(); + + if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) + if (this.last_active.onDrop) + this.last_active.onDrop(element, this.last_active.element, event); + }, + + reset: function() { + if(this.last_active) + this.deactivate(this.last_active); + } +} + +var Draggables = { + drags: [], + observers: [], + + register: function(draggable) { + if(this.drags.length == 0) { + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.updateDrag.bindAsEventListener(this); + this.eventKeypress = this.keyPress.bindAsEventListener(this); + + Event.observe(document, "mouseup", this.eventMouseUp); + Event.observe(document, "mousemove", this.eventMouseMove); + Event.observe(document, "keypress", this.eventKeypress); + } + this.drags.push(draggable); + }, + + unregister: function(draggable) { + this.drags = this.drags.reject(function(d) { return d==draggable }); + if(this.drags.length == 0) { + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + Event.stopObserving(document, "keypress", this.eventKeypress); + } + }, + + activate: function(draggable) { + window.focus(); // allows keypress events if window isn't currently focused, fails for Safari + this.activeDraggable = draggable; + }, + + deactivate: function() { + this.activeDraggable = null; + }, + + updateDrag: function(event) { + if(!this.activeDraggable) return; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; + this._lastPointer = pointer; + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function(event) { + if(!this.activeDraggable) return; + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function(event) { + if(this.activeDraggable) + this.activeDraggable.keyPress(event); + }, + + addObserver: function(observer) { + this.observers.push(observer); + this._cacheObserverCallbacks(); + }, + + removeObserver: function(element) { // element instead of observer fixes mem leaks + this.observers = this.observers.reject( function(o) { return o.element==element }); + this._cacheObserverCallbacks(); + }, + + notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' + if(this[eventName+'Count'] > 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +} + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create(); +Draggable.prototype = { + initialize: function(element) { + var options = Object.extend({ + handle: false, + starteffect: function(element) { + element._opacity = Element.getOpacity(element); + new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); + }, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur}); + }, + endeffect: function(element) { + var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0 + new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity}); + }, + zindex: 1000, + revert: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] } + }, arguments[1] || {}); + + this.element = $(element); + + if(options.handle && (typeof options.handle == 'string')) { + var h = Element.childrenWithClassName(this.element, options.handle, true); + if(h.length>0) this.handle = h[0]; + } + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) + options.scroll = $(options.scroll); + + Element.makePositioned(this.element); // fix IE + + this.delta = this.currentDelta(); + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(Element.getStyle(this.element,'left') || '0'), + parseInt(Element.getStyle(this.element,'top') || '0')]); + }, + + initDrag: function(event) { + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if(src.tagName && ( + src.tagName=='INPUT' || + src.tagName=='SELECT' || + src.tagName=='OPTION' || + src.tagName=='BUTTON' || + src.tagName=='TEXTAREA')) return; + + if(this.element._revert) { + this.element._revert.cancel(); + this.element._revert = null; + } + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = Position.cumulativeOffset(this.element); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if(this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + Draggables.notify('onStart', this, event); + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + Position.prepare(); + Droppables.show(pointer, this.element); + Draggables.notify('onDrag', this, event); + this.draw(pointer); + if(this.options.change) this.options.change(this); + + if(this.options.scroll) { + this.stopScrolling(); + + var p; + if (this.options.scroll == window) { + with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } + } else { + p = Position.page(this.options.scroll); + p[0] += this.options.scroll.scrollLeft; + p[1] += this.options.scroll.scrollTop; + p.push(p[0]+this.options.scroll.offsetWidth); + p.push(p[1]+this.options.scroll.offsetHeight); + } + var speed = [0,0]; + if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); + if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); + if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); + if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); + + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.ghosting) { + Position.relativize(this.element); + Element.remove(this._clone); + this._clone = null; + } + + if(success) Droppables.fire(event, this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && typeof revert == 'function') revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(event.keyCode!=Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.stopScrolling(); + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = Position.cumulativeOffset(this.element); + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + if(this.options.scroll && (this.options.scroll != window)) { + pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; + pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; + } + + var p = [0,1].map(function(i){ + return (point[i]-pos[i]-this.offset[i]) + }.bind(this)); + + if(this.options.snap) { + if(typeof this.options.snap == 'function') { + p = this.options.snap(p[0],p[1],this); + } else { + if(this.options.snap instanceof Array) { + p = p.map( function(v, i) { + return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this)) + } else { + p = p.map( function(v) { + return Math.round(v/this.options.snap)*this.options.snap }.bind(this)) + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + }, + + stopScrolling: function() { + if(this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + Draggables._lastScrollPointer = null; + } + }, + + startScrolling: function(speed) { + this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(this.scroll.bind(this), 10); + }, + + scroll: function() { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + if(this.options.scroll == window) { + with (this._getWindowScroll(this.options.scroll)) { + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var d = delta / 1000; + this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); + } + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + Position.prepare(); + Droppables.show(Draggables._lastPointer, this.element); + Draggables.notify('onDrag', this); + Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); + Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; + Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; + if (Draggables._lastScrollPointer[0] < 0) + Draggables._lastScrollPointer[0] = 0; + if (Draggables._lastScrollPointer[1] < 0) + Draggables._lastScrollPointer[1] = 0; + this.draw(Draggables._lastScrollPointer); + + if(this.options.change) this.options.change(this); + }, + + _getWindowScroll: function(w) { + var T, L, W, H; + with (w.document) { + if (w.document.documentElement && documentElement.scrollTop) { + T = documentElement.scrollTop; + L = documentElement.scrollLeft; + } else if (w.document.body) { + T = body.scrollTop; + L = body.scrollLeft; + } + if (w.innerWidth) { + W = w.innerWidth; + H = w.innerHeight; + } else if (w.document.documentElement && documentElement.clientWidth) { + W = documentElement.clientWidth; + H = documentElement.clientHeight; + } else { + W = body.offsetWidth; + H = body.offsetHeight + } + } + return { top: T, left: L, width: W, height: H }; + } +} + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create(); +SortableObserver.prototype = { + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +} + +var Sortable = { + sortables: {}, + + _findRootElement: function(element) { + while (element.tagName != "BODY") { + if(element.id && Sortable.sortables[element.id]) return element; + element = element.parentNode; + } + }, + + options: function(element) { + element = Sortable._findRootElement($(element)); + if(!element) return; + return Sortable.sortables[element.id]; + }, + + destroy: function(element){ + var s = Sortable.options(element); + + if(s) { + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + + delete Sortable.sortables[s.element.id]; + } + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, + treeTag: 'ul', + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + hoverclass: null, + ghosting: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + format: /^[^_]*_(.*)$/, + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || {}); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + scroll: options.scroll, + scrollSpeed: options.scrollSpeed, + scrollSensitivity: options.scrollSensitivity, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + tree: options.tree, + hoverclass: options.hoverclass, + onHover: Sortable.onHover + //greedy: !options.dropOnEmpty + } + + var options_for_tree = { + onHover: Sortable.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass + } + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if(options.dropOnEmpty || options.tree) { + Droppables.add(element, options_for_tree); + options.droppables.push(element); + } + + (this.findElements(element, options) || []).each( function(e) { + // handles are per-draggable + var handle = options.handle ? + Element.childrenWithClassName(e, options.handle)[0] : e; + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + if(options.tree) e.treeNode = element; + options.droppables.push(e); + }); + + if(options.tree) { + (Sortable.findTreeElements(element, options) || []).each( function(e) { + Droppables.add(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }); + } + + // keep reference + this.sortables[element.id] = options; + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + findTreeElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + onHover: function(element, dropon, overlap) { + if(Element.isParent(dropon, element)) return; + + if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { + return; + } else if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon, overlap) { + var oldParentNode = element.parentNode; + var droponOptions = Sortable.options(dropon); + + if(!Element.isParent(dropon, element)) { + var index; + + var children = Sortable.findElements(dropon, {tag: droponOptions.tag}); + var child = null; + + if(children) { + var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { + offset -= Element.offsetSize (children[index], droponOptions.overlap); + } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + Sortable.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Element.hide(Sortable._marker); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = $('dropmarker') || document.createElement('DIV'); + Element.hide(Sortable._marker); + Element.addClassName(Sortable._marker, 'dropmarker'); + Sortable._marker.style.position = 'absolute'; + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = Position.cumulativeOffset(dropon); + Sortable._marker.style.left = offsets[0] + 'px'; + Sortable._marker.style.top = offsets[1] + 'px'; + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px'; + else + Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; + + Element.show(Sortable._marker); + }, + + _tree: function(element, options, parent) { + var children = Sortable.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) continue; + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: new Array, + position: parent.children.length, + container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase()) + } + + /* Get the element containing the children and recurse over it */ + if (child.container) + this._tree(child.container, options, child) + + parent.children.push (child); + } + + return parent; + }, + + /* Finds the first element of the given tag type within a parent element. + Used for finding the first LI[ST] within a L[IST]I[TEM].*/ + _findChildrenElement: function (element, containerTag) { + if (element && element.hasChildNodes) + for (var i = 0; i < element.childNodes.length; ++i) + if (element.childNodes[i].tagName == containerTag) + return element.childNodes[i]; + + return null; + }, + + tree: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, arguments[1] || {}); + + var root = { + id: null, + parent: null, + children: new Array, + container: element, + position: 0 + } + + return Sortable._tree (element, options, root); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function(node) { + var index = ''; + do { + if (node.id) index = '[' + node.position + ']' + index; + } while ((node = node.parent) != null); + return index; + }, + + sequence: function(element) { + element = $(element); + var options = Object.extend(this.options(element), arguments[1] || {}); + + return $(this.findElements(element, options) || []).map( function(item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }); + }, + + setSequence: function(element, new_sequence) { + element = $(element); + var options = Object.extend(this.options(element), arguments[2] || {}); + + var nodeMap = {}; + this.findElements(element, options).each( function(n) { + if (n.id.match(options.format)) + nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; + n.parentNode.removeChild(n); + }); + + new_sequence.each(function(ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }); + }, + + serialize: function(element) { + element = $(element); + var options = Object.extend(Sortable.options(element), arguments[1] || {}); + var name = encodeURIComponent( + (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); + + if (options.tree) { + return Sortable.tree(element, arguments[1]).children.map( function (item) { + return [name + Sortable._constructIndex(item) + "=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }).flatten().join('&'); + } else { + return Sortable.sequence(element, arguments[1]).map( function(item) { + return name + "[]=" + encodeURIComponent(item); + }).join('&'); + } + } +} + +/* Returns true if child is contained within element */ +Element.isParent = function(child, element) { + if (!child.parentNode || child == element) return false; + + if (child.parentNode == element) return true; + + return Element.isParent(child.parentNode, element); +} + +Element.findChildren = function(element, only, recursive, tagName) { + if(!element.hasChildNodes()) return null; + tagName = tagName.toUpperCase(); + if(only) only = [only].flatten(); + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==tagName && + (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) + elements.push(e); + if(recursive) { + var grandchildren = Element.findChildren(e, only, recursive, tagName); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : []); +} + +Element.offsetSize = function (element, type) { + if (type == 'vertical' || type == 'height') + return element.offsetHeight; + else + return element.offsetWidth; +} \ No newline at end of file diff --git a/js/cropper/index.php b/js/cropper/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/js/cropper/index.php @@ -0,0 +1,11 @@ +<?php + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/cropper/loader.js b/js/cropper/loader.js new file mode 100644 index 000000000..9817b80af --- /dev/null +++ b/js/cropper/loader.js @@ -0,0 +1,90 @@ +var CropImageManager = { + curCrop: null, + + init: function() + { + this.attachCropper(); + }, + + onChange: function(e) + { + var vals = $F(Event.element(e)).split('|'); + this.setImage(vals[0], vals[1], vals[2]); + }, + + setImage: function(imgSrc, w, h) + { + $('testImage').src = imgSrc; + /*$('testImage').width = w; + $('testImage').height = h;*/ + this.attachCropper(w, h); + }, + + attachCropper: function(maxW, maxH) + { + var vals = $F($('imageChoice')).split('|'); + if (!maxW) + maxW = vals[1]; + if (!maxH) + maxH = vals[2]; + if (this.curCrop == null) + this.curCrop = new Cropper.Img('testImage', + { + minWidth: maxW, + minHeight: maxH, + maxWidth: maxW, + maxHeight: maxH, + onEndCrop: onEndCrop + } + ); + else + this.curCrop.reset(maxW, maxH, maxW, maxH); + this.curCrop.aeraCoords = 0; + }, + + removeCropper: function() + { + if (this.curCrop != null) + this.curCrop.remove(); + }, + + resetCropper: function() + { + this.attachCropper(); + } +}; + +function onEndCrop(coords, dimensions) +{ + var vals = $F($('imageChoice')).split('|'); + var id_image = vals[3]; + if (!image) + { + image = id_image; + image_check = id_image; + } + if (image != id_image) + image = id_image; + else + { + if (image != image_check && navigator.appName != "Microsoft Internet Explorer") + image_check = image; + else + { + $(id_image + '_x1').value = coords.x1; + $(id_image + '_y1').value = coords.y1; + $(id_image + '_x2').value = coords.x2; + $(id_image + '_y2').value = coords.y2; + } + } +} + +Event.observe(window, 'load', + function() { + CropImageManager.init(); + Event.observe($('imageChoice'), 'change', CropImageManager.onChange.bindAsEventListener(CropImageManager), false ); + } +); + +var image; +var image_check; \ No newline at end of file diff --git a/js/cropper/prototype.js b/js/cropper/prototype.js new file mode 100644 index 000000000..486564f1e --- /dev/null +++ b/js/cropper/prototype.js @@ -0,0 +1,2006 @@ +/* Prototype JavaScript framework, version 1.5.0_rc0 + * (c) 2005 Sam Stephenson <sam@conio.net> + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://prototype.conio.net/ + * +/*--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.5.0_rc0', + ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', + + emptyFunction: function() {}, + K: function(x) {return x} +} + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +} + +var Abstract = new Object(); + +Object.extend = function(destination, source) { + for (var property in source) { + destination[property] = source[property]; + } + return destination; +} + +Object.inspect = function(object) { + try { + if (object == undefined) return 'undefined'; + if (object == null) return 'null'; + return object.inspect ? object.inspect() : object.toString(); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } +} + +Function.prototype.bind = function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } +} + +Function.prototype.bindAsEventListener = function(object) { + var __method = this; + return function(event) { + return __method.call(object, event || window.event); + } +} + +Object.extend(Number.prototype, { + toColorPart: function() { + var digits = this.toString(16); + if (this < 16) return '0' + digits; + return digits; + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + } +}); + +var Try = { + these: function() { + var returnValue; + + for (var i = 0; i < arguments.length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; + } +} + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create(); +PeriodicalExecuter.prototype = { + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.callback(); + } finally { + this.currentlyExecuting = false; + } + } + } +} +Object.extend(String.prototype, { + gsub: function(pattern, replacement) { + var result = '', source = this, match; + replacement = arguments.callee.prepareReplacement(replacement); + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += (replacement(match) || '').toString(); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = count === undefined ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return this; + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = truncation === undefined ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : this; + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var div = document.createElement('div'); + var text = document.createTextNode(this); + div.appendChild(text); + return div.innerHTML; + }, + + unescapeHTML: function() { + var div = document.createElement('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; + }, + + toQueryParams: function() { + var pairs = this.match(/^\??(.*)$/)[1].split('&'); + return pairs.inject({}, function(params, pairString) { + var pair = pairString.split('='); + params[pair[0]] = pair[1]; + return params; + }); + }, + + toArray: function() { + return this.split(''); + }, + + camelize: function() { + var oStringList = this.split('-'); + if (oStringList.length == 1) return oStringList[0]; + + var camelizedString = this.indexOf('-') == 0 + ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) + : oStringList[0]; + + for (var i = 1, len = oStringList.length; i < len; i++) { + var s = oStringList[i]; + camelizedString += s.charAt(0).toUpperCase() + s.substring(1); + } + + return camelizedString; + }, + + inspect: function() { + return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'"; + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (typeof replacement == 'function') return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +} + +String.prototype.parseQuery = String.prototype.toQueryParams; + +var Template = Class.create(); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; +Template.prototype = { + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + return this.template.gsub(this.pattern, function(match) { + var before = match[1]; + if (before == '\\') return match[2]; + return before + (object[match[3]] || '').toString(); + }); + } +} + +var $break = new Object(); +var $continue = new Object(); + +var Enumerable = { + each: function(iterator) { + var index = 0; + try { + this._each(function(value) { + try { + iterator(value, index++); + } catch (e) { + if (e != $continue) throw e; + } + }); + } catch (e) { + if (e != $break) throw e; + } + }, + + all: function(iterator) { + var result = true; + this.each(function(value, index) { + result = result && !!(iterator || Prototype.K)(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator) { + var result = true; + this.each(function(value, index) { + if (result = !!(iterator || Prototype.K)(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator) { + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function (iterator) { + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator) { + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(pattern, iterator) { + var results = []; + this.each(function(value, index) { + var stringValue = value.toString(); + if (stringValue.match(pattern)) + results.push((iterator || Prototype.K)(value, index)); + }) + return results; + }, + + include: function(object) { + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inject: function(memo, iterator) { + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.collect(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (result == undefined || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (result == undefined || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator) { + var trues = [], falses = []; + this.each(function(value, index) { + ((iterator || Prototype.K)(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value, index) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator) { + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator) { + return this.collect(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.collect(Prototype.K); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (typeof args.last() == 'function') + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + inspect: function() { + return '#<Enumerable:' + this.toArray().inspect() + '>'; + } +} + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray +}); +var $A = Array.from = function(iterable) { + if (!iterable) return []; + if (iterable.toArray) { + return iterable.toArray(); + } else { + var results = []; + for (var i = 0; i < iterable.length; i++) + results.push(iterable[i]); + return results; + } +} + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) + Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0; i < this.length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != undefined || value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(value && value.constructor == Array ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + indexOf: function(object) { + for (var i = 0; i < this.length; i++) + if (this[i] == object) return i; + return -1; + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } +}); +var Hash = { + _each: function(iterator) { + for (var key in this) { + var value = this[key]; + if (typeof value == 'function') continue; + + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + merge: function(hash) { + return $H(hash).inject($H(this), function(mergedHash, pair) { + mergedHash[pair.key] = pair.value; + return mergedHash; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + return pair.map(encodeURIComponent).join('='); + }).join('&'); + }, + + inspect: function() { + return '#<Hash:{' + this.map(function(pair) { + return pair.map(Object.inspect).join(': '); + }).join(', ') + '}>'; + } +} + +function $H(object) { + var hash = Object.extend({}, object || {}); + Object.extend(hash, Enumerable); + Object.extend(hash, Hash); + return hash; +} +ObjectRange = Class.create(); +Object.extend(ObjectRange.prototype, Enumerable); +Object.extend(ObjectRange.prototype, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + do { + iterator(value); + value = value.succ(); + } while (this.include(value)); + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +} + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responderToAdd) { + if (!this.include(responderToAdd)) + this.responders.push(responderToAdd); + }, + + unregister: function(responderToRemove) { + this.responders = this.responders.without(responderToRemove); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (responder[callback] && typeof responder[callback] == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { + Ajax.activeRequestCount++; + }, + + onComplete: function() { + Ajax.activeRequestCount--; + } +}); + +Ajax.Base = function() {}; +Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + parameters: '' + } + Object.extend(this.options, options || {}); + }, + + responseIsSuccess: function() { + return this.transport.status == undefined + || this.transport.status == 0 + || (this.transport.status >= 200 && this.transport.status < 300); + }, + + responseIsFailure: function() { + return !this.responseIsSuccess(); + } +} + +Ajax.Request = Class.create(); +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Request.prototype = Object.extend(new Ajax.Base(), { + initialize: function(url, options) { + this.transport = Ajax.getTransport(); + this.setOptions(options); + this.request(url); + }, + + request: function(url) { + var parameters = this.options.parameters || ''; + if (parameters.length > 0) parameters += '&_='; + + try { + this.url = url; + if (this.options.method == 'get' && parameters.length > 0) + this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; + + Ajax.Responders.dispatch('onCreate', this, this.transport); + + this.transport.open(this.options.method, this.url, + this.options.asynchronous); + + if (this.options.asynchronous) { + this.transport.onreadystatechange = this.onStateChange.bind(this); + setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); + } + + this.setRequestHeaders(); + + var body = this.options.postBody ? this.options.postBody : parameters; + this.transport.send(this.options.method == 'post' ? body : null); + + } catch (e) { + this.dispatchException(e); + } + }, + + setRequestHeaders: function() { + var requestHeaders = + ['X-Requested-With', 'XMLHttpRequest', + 'X-Prototype-Version', Prototype.Version, + 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*']; + + if (this.options.method == 'post') { + requestHeaders.push('Content-type', this.options.contentType); + + /* Force "Connection: close" for Mozilla browsers to work around + * a bug where XMLHttpReqeuest sends an incorrect Content-length + * header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType) + requestHeaders.push('Connection', 'close'); + } + + if (this.options.requestHeaders) + requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); + + for (var i = 0; i < requestHeaders.length; i += 2) + this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState != 1) + this.respondToReadyState(this.transport.readyState); + }, + + header: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) {} + }, + + evalJSON: function() { + try { + return eval('(' + this.header('X-JSON') + ')'); + } catch (e) {} + }, + + evalResponse: function() { + try { + return eval(this.transport.responseText); + } catch (e) { + this.dispatchException(e); + } + }, + + respondToReadyState: function(readyState) { + var event = Ajax.Request.Events[readyState]; + var transport = this.transport, json = this.evalJSON(); + + if (event == 'Complete') { + try { + (this.options['on' + this.transport.status] + || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + if ((this.header('Content-type') || '').match(/^text\/javascript/i)) + this.evalResponse(); + } + + try { + (this.options['on' + event] || Prototype.emptyFunction)(transport, json); + Ajax.Responders.dispatch('on' + event, this, transport, json); + } catch (e) { + this.dispatchException(e); + } + + /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ + if (event == 'Complete') + this.transport.onreadystatechange = Prototype.emptyFunction; + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Updater = Class.create(); + +Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { + initialize: function(container, url, options) { + this.containers = { + success: container.success ? $(container.success) : $(container), + failure: container.failure ? $(container.failure) : + (container.success ? null : $(container)) + } + + this.transport = Ajax.getTransport(); + this.setOptions(options); + + var onComplete = this.options.onComplete || Prototype.emptyFunction; + this.options.onComplete = (function(transport, object) { + this.updateContent(); + onComplete(transport, object); + }).bind(this); + + this.request(url); + }, + + updateContent: function() { + var receiver = this.responseIsSuccess() ? + this.containers.success : this.containers.failure; + var response = this.transport.responseText; + + if (!this.options.evalScripts) + response = response.stripScripts(); + + if (receiver) { + if (this.options.insertion) { + new this.options.insertion(receiver, response); + } else { + Element.update(receiver, response); + } + } + + if (this.responseIsSuccess()) { + if (this.onComplete) + setTimeout(this.onComplete.bind(this), 10); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(); +Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { + initialize: function(container, url, options) { + this.setOptions(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = {}; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(request) { + if (this.options.decay) { + this.decay = (request.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = request.responseText; + } + this.timer = setTimeout(this.onTimerEvent.bind(this), + this.decay * this.frequency * 1000); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $() { + var results = [], element; + for (var i = 0; i < arguments.length; i++) { + element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + results.push(Element.extend(element)); + } + return results.length < 2 ? results[0] : results; +} + +document.getElementsByClassName = function(className, parentElement) { + var children = ($(parentElement) || document.body).getElementsByTagName('*'); + return $A(children).inject([], function(elements, child) { + if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) + elements.push(Element.extend(child)); + return elements; + }); +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Element) + var Element = new Object(); + +Element.extend = function(element) { + if (!element) return; + if (_nativeExtensions) return element; + + if (!element._extended && element.tagName && element != window) { + var methods = Element.Methods, cache = Element.extend.cache; + for (property in methods) { + var value = methods[property]; + if (typeof value == 'function') + element[property] = cache.findOrStore(value); + } + } + + element._extended = true; + return element; +} + +Element.extend.cache = { + findOrStore: function(value) { + return this[value] = this[value] || function() { + return value.apply(null, [this].concat($A(arguments))); + } + } +} + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + Element[Element.visible(element) ? 'hide' : 'show'](element); + } + }, + + hide: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = 'none'; + } + }, + + show: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = ''; + } + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + }, + + update: function(element, html) { + $(element).innerHTML = html.stripScripts(); + setTimeout(function() {html.evalScripts()}, 10); + }, + + replace: function(element, html) { + element = $(element); + if (element.outerHTML) { + element.outerHTML = html.stripScripts(); + } else { + var range = element.ownerDocument.createRange(); + range.selectNodeContents(element); + element.parentNode.replaceChild( + range.createContextualFragment(html.stripScripts()), element); + } + setTimeout(function() {html.evalScripts()}, 10); + }, + + getHeight: function(element) { + element = $(element); + return element.offsetHeight; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).include(className); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).add(className); + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).remove(className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + for (var i = 0; i < element.childNodes.length; i++) { + var node = element.childNodes[i]; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + Element.remove(node); + } + }, + + empty: function(element) { + return $(element).innerHTML.match(/^\s*$/); + }, + + childOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + while (element = element.parentNode) + if (element == ancestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var x = element.x ? element.x : element.offsetLeft, + y = element.y ? element.y : element.offsetTop; + window.scrollTo(x, y); + }, + + getStyle: function(element, style) { + element = $(element); + var value = element.style[style.camelize()]; + if (!value) { + if (document.defaultView && document.defaultView.getComputedStyle) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css.getPropertyValue(style) : null; + } else if (element.currentStyle) { + value = element.currentStyle[style.camelize()]; + } + } + + if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) + if (Element.getStyle(element, 'position') == 'static') value = 'auto'; + + return value == 'auto' ? null : value; + }, + + setStyle: function(element, style) { + element = $(element); + for (var name in style) + element.style[name.camelize()] = style[name]; + }, + + getDimensions: function(element) { + element = $(element); + if (Element.getStyle(element, 'display') != 'none') + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = ''; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = 'none'; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return; + element._overflow = element.style.overflow; + if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') + element.style.overflow = 'hidden'; + }, + + undoClipping: function(element) { + element = $(element); + if (element._overflow) return; + element.style.overflow = element._overflow; + element._overflow = undefined; + } +} + +Object.extend(Element, Element.Methods); + +var _nativeExtensions = false; + +if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { + var HTMLElement = {} + HTMLElement.prototype = document.createElement('div').__proto__; +} + +Element.addMethods = function(methods) { + Object.extend(Element.Methods, methods || {}); + + if(typeof HTMLElement != 'undefined') { + var methods = Element.Methods, cache = Element.extend.cache; + for (property in methods) { + var value = methods[property]; + if (typeof value == 'function') + HTMLElement.prototype[property] = cache.findOrStore(value); + } + _nativeExtensions = true; + } +} + +Element.addMethods(); + +var Toggle = new Object(); +Toggle.display = Element.toggle; + +/*--------------------------------------------------------------------------*/ + +Abstract.Insertion = function(adjacency) { + this.adjacency = adjacency; +} + +Abstract.Insertion.prototype = { + initialize: function(element, content) { + this.element = $(element); + this.content = content.stripScripts(); + + if (this.adjacency && this.element.insertAdjacentHTML) { + try { + this.element.insertAdjacentHTML(this.adjacency, this.content); + } catch (e) { + var tagName = this.element.tagName.toLowerCase(); + if (tagName == 'tbody' || tagName == 'tr') { + this.insertContent(this.contentFromAnonymousTable()); + } else { + throw e; + } + } + } else { + this.range = this.element.ownerDocument.createRange(); + if (this.initializeRange) this.initializeRange(); + this.insertContent([this.range.createContextualFragment(this.content)]); + } + + setTimeout(function() {content.evalScripts()}, 10); + }, + + contentFromAnonymousTable: function() { + var div = document.createElement('div'); + div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>'; + return $A(div.childNodes[0].childNodes[0].childNodes); + } +} + +var Insertion = new Object(); + +Insertion.Before = Class.create(); +Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { + initializeRange: function() { + this.range.setStartBefore(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, this.element); + }).bind(this)); + } +}); + +Insertion.Top = Class.create(); +Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(true); + }, + + insertContent: function(fragments) { + fragments.reverse(false).each((function(fragment) { + this.element.insertBefore(fragment, this.element.firstChild); + }).bind(this)); + } +}); + +Insertion.Bottom = Class.create(); +Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.appendChild(fragment); + }).bind(this)); + } +}); + +Insertion.After = Class.create(); +Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { + initializeRange: function() { + this.range.setStartAfter(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, + this.element.nextSibling); + }).bind(this)); + } +}); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set(this.toArray().concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set(this.select(function(className) { + return className != classNameToRemove; + }).join(' ')); + }, + + toString: function() { + return this.toArray().join(' '); + } +} + +Object.extend(Element.ClassNames.prototype, Enumerable); +var Selector = Class.create(); +Selector.prototype = { + initialize: function(expression) { + this.params = {classNames: []}; + this.expression = expression.toString().strip(); + this.parseExpression(); + this.compileMatcher(); + }, + + parseExpression: function() { + function abort(message) { throw 'Parse error in selector: ' + message; } + + if (this.expression == '') abort('empty expression'); + + var params = this.params, expr = this.expression, match, modifier, clause, rest; + while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { + params.attributes = params.attributes || []; + params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); + expr = match[1]; + } + + if (expr == '*') return this.params.wildcard = true; + + while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { + modifier = match[1], clause = match[2], rest = match[3]; + switch (modifier) { + case '#': params.id = clause; break; + case '.': params.classNames.push(clause); break; + case '': + case undefined: params.tagName = clause.toUpperCase(); break; + default: abort(expr.inspect()); + } + expr = rest; + } + + if (expr.length > 0) abort(expr.inspect()); + }, + + buildMatchExpression: function() { + var params = this.params, conditions = [], clause; + + if (params.wildcard) + conditions.push('true'); + if (clause = params.id) + conditions.push('element.id == ' + clause.inspect()); + if (clause = params.tagName) + conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); + if ((clause = params.classNames).length > 0) + for (var i = 0; i < clause.length; i++) + conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')'); + if (clause = params.attributes) { + clause.each(function(attribute) { + var value = 'element.getAttribute(' + attribute.name.inspect() + ')'; + var splitValueBy = function(delimiter) { + return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; + } + + switch (attribute.operator) { + case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; + case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; + case '|=': conditions.push( + splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() + ); break; + case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; + case '': + case undefined: conditions.push(value + ' != null'); break; + default: throw 'Unknown operator ' + attribute.operator + ' in selector'; + } + }); + } + + return conditions.join(' && '); + }, + + compileMatcher: function() { + this.match = new Function('element', 'if (!element.tagName) return false; \ + return ' + this.buildMatchExpression()); + }, + + findElements: function(scope) { + var element; + + if (element = $(this.params.id)) + if (this.match(element)) + if (!scope || Element.childOf(element, scope)) + return [element]; + + scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); + + var results = []; + for (var i = 0; i < scope.length; i++) + if (this.match(element = scope[i])) + results.push(Element.extend(element)); + + return results; + }, + + toString: function() { + return this.expression; + } +} + +function $$() { + return $A(arguments).map(function(expression) { + return expression.strip().split(/\s+/).inject([null], function(results, expr) { + var selector = new Selector(expr); + return results.map(selector.findElements.bind(selector)).flatten(); + }); + }).flatten(); +} +var Field = { + clear: function() { + for (var i = 0; i < arguments.length; i++) + $(arguments[i]).value = ''; + }, + + focus: function(element) { + $(element).focus(); + }, + + present: function() { + for (var i = 0; i < arguments.length; i++) + if ($(arguments[i]).value == '') return false; + return true; + }, + + select: function(element) { + $(element).select(); + }, + + activate: function(element) { + element = $(element); + element.focus(); + if (element.select) + element.select(); + } +} + +/*--------------------------------------------------------------------------*/ + +var Form = { + serialize: function(form) { + var elements = Form.getElements($(form)); + var queryComponents = new Array(); + + for (var i = 0; i < elements.length; i++) { + var queryComponent = Form.Element.serialize(elements[i]); + if (queryComponent) + queryComponents.push(queryComponent); + } + + return queryComponents.join('&'); + }, + + getElements: function(form) { + form = $(form); + var elements = new Array(); + + for (var tagName in Form.Element.Serializers) { + var tagElements = form.getElementsByTagName(tagName); + for (var j = 0; j < tagElements.length; j++) + elements.push(tagElements[j]); + } + return elements; + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) + return inputs; + + var matchingInputs = new Array(); + for (var i = 0; i < inputs.length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || + (name && input.name != name)) + continue; + matchingInputs.push(input); + } + + return matchingInputs; + }, + + disable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.blur(); + element.disabled = 'true'; + } + }, + + enable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.disabled = ''; + } + }, + + findFirstElement: function(form) { + return Form.getElements(form).find(function(element) { + return element.type != 'hidden' && !element.disabled && + ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + Field.activate(Form.findFirstElement(form)); + }, + + reset: function(form) { + $(form).reset(); + } +} + +Form.Element = { + serialize: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + var parameter = Form.Element.Serializers[method](element); + + if (parameter) { + var key = encodeURIComponent(parameter[0]); + if (key.length == 0) return; + + if (parameter[1].constructor != Array) + parameter[1] = [parameter[1]]; + + return parameter[1].map(function(value) { + return key + '=' + encodeURIComponent(value); + }).join('&'); + } + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + var parameter = Form.Element.Serializers[method](element); + + if (parameter) + return parameter[1]; + } +} + +Form.Element.Serializers = { + input: function(element) { + switch (element.type.toLowerCase()) { + case 'submit': + case 'hidden': + case 'password': + case 'text': + return Form.Element.Serializers.textarea(element); + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element); + } + return false; + }, + + inputSelector: function(element) { + if (element.checked) + return [element.name, element.value]; + }, + + textarea: function(element) { + return [element.name, element.value]; + }, + + select: function(element) { + return Form.Element.Serializers[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + }, + + selectOne: function(element) { + var value = '', opt, index = element.selectedIndex; + if (index >= 0) { + opt = element.options[index]; + value = opt.value || opt.text; + } + return [element.name, value]; + }, + + selectMany: function(element) { + var value = []; + for (var i = 0; i < element.length; i++) { + var opt = element.options[i]; + if (opt.selected) + value.push(opt.value || opt.text); + } + return [element.name, value]; + } +} + +/*--------------------------------------------------------------------------*/ + +var $F = Form.Element.getValue; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = function() {} +Abstract.TimedObserver.prototype = { + initialize: function(element, frequency, callback) { + this.frequency = frequency; + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + } +} + +Form.Element.Observer = Class.create(); +Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(); +Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = function() {} +Abstract.EventObserver.prototype = { + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + var elements = Form.getElements(this.element); + for (var i = 0; i < elements.length; i++) + this.registerCallback(elements[i]); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + case 'password': + case 'text': + case 'textarea': + case 'select-one': + case 'select-multiple': + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +} + +Form.Element.EventObserver = Class.create(); +Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(); +Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) { + var Event = new Object(); +} + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + + element: function(event) { + return event.target || event.srcElement; + }, + + isLeftClick: function(event) { + return (((event.which) && (event.which == 1)) || + ((event.button) && (event.button == 1))); + }, + + pointerX: function(event) { + return event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + pointerY: function(event) { + return event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + stop: function(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + }, + + // find the first node with the given tagName, starting from the + // node the event was triggered on; traverses the DOM upwards + findElement: function(event, tagName) { + var element = Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) + element = element.parentNode; + return element; + }, + + observers: false, + + _observeAndCache: function(element, name, observer, useCapture) { + if (!this.observers) this.observers = []; + if (element.addEventListener) { + this.observers.push([element, name, observer, useCapture]); + element.addEventListener(name, observer, useCapture); + } else if (element.attachEvent) { + this.observers.push([element, name, observer, useCapture]); + element.attachEvent('on' + name, observer); + } + }, + + unloadCache: function() { + if (!Event.observers) return; + for (var i = 0; i < Event.observers.length; i++) { + Event.stopObserving.apply(this, Event.observers[i]); + Event.observers[i][0] = null; + } + Event.observers = false; + }, + + observe: function(element, name, observer, useCapture) { + var element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.attachEvent)) + name = 'keydown'; + + this._observeAndCache(element, name, observer, useCapture); + }, + + stopObserving: function(element, name, observer, useCapture) { + var element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.detachEvent)) + name = 'keydown'; + + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element.detachEvent) { + element.detachEvent('on' + name, observer); + } + } +}); + +/* prevent memory leaks in IE */ +if (navigator.appVersion.match(/\bMSIE\b/)) + Event.observe(window, 'unload', Event.unloadCache, false); +var Position = { + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + // must be called before calling withinIncludingScrolloffset, every time the + // page is scrolled + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + realOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return [valueL, valueT]; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return [valueL, valueT]; + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + p = Element.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') break; + } + } while (element); + return [valueL, valueT]; + }, + + offsetParent: function(element) { + if (element.offsetParent) return element.offsetParent; + if (element == document.body) return element; + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return element; + + return document.body; + }, + + // caches x/y coordinate pair to use with overlap + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = this.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + // within must be called directly before + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + clone: function(source, target) { + source = $(source); + target = $(target); + target.style.position = 'absolute'; + var offsets = this.cumulativeOffset(source); + target.style.top = offsets[1] + 'px'; + target.style.left = offsets[0] + 'px'; + target.style.width = source.offsetWidth + 'px'; + target.style.height = source.offsetHeight + 'px'; + }, + + page: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent==document.body) + if (Element.getStyle(element,'position')=='absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } while (element = element.parentNode); + + return [valueL, valueT]; + }, + + clone: function(source, target) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || {}) + + // find page position of source + source = $(source); + var p = Position.page(source); + + // find coordinate system to use + target = $(target); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(target,'position') == 'absolute') { + parent = Position.offsetParent(target); + delta = Position.page(parent); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if(options.setWidth) target.style.width = source.offsetWidth + 'px'; + if(options.setHeight) target.style.height = source.offsetHeight + 'px'; + }, + + absolutize: function(element) { + element = $(element); + if (element.style.position == 'absolute') return; + Position.prepare(); + + var offsets = Position.positionedOffset(element); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + }, + + relativize: function(element) { + element = $(element); + if (element.style.position == 'relative') return; + Position.prepare(); + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + } +} + +// Safari returns margins on body which is incorrect if the child is absolutely +// positioned. For performance reasons, redefine Position.cumulativeOffset for +// KHTML/WebKit only. +if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { + Position.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return [valueL, valueT]; + } +} \ No newline at end of file diff --git a/js/cropper/scriptaculous.js b/js/cropper/scriptaculous.js new file mode 100644 index 000000000..f61fc57f7 --- /dev/null +++ b/js/cropper/scriptaculous.js @@ -0,0 +1,47 @@ +// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Scriptaculous = { + Version: '1.6.1', + require: function(libraryName) { + // inserting via DOM fails in Safari 2.0, so brute force approach + document.write('<script type="text/javascript" src="'+libraryName+'"></script>'); + }, + load: function() { + if((typeof Prototype=='undefined') || + (typeof Element == 'undefined') || + (typeof Element.Methods=='undefined') || + parseFloat(Prototype.Version.split(".")[0] + "." + + Prototype.Version.split(".")[1]) < 1.5) + throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0"); + + $A(document.getElementsByTagName("script")).findAll( function(s) { + return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) + }).each( function(s) { + var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); + var includes = s.src.match(/\?.*load=([a-z,]*)/); + (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( + function(include) { Scriptaculous.require(path+include+'.js') }); + }); + } +} + +Scriptaculous.load(); \ No newline at end of file diff --git a/js/date.js b/js/date.js new file mode 100644 index 000000000..a9003f7be --- /dev/null +++ b/js/date.js @@ -0,0 +1,467 @@ +/* + * Date prototype extensions. Doesn't depend on any + * other code. Doens't overwrite existing methods. + * + * Adds dayNames, abbrDayNames, monthNames and abbrMonthNames static properties and isLeapYear, + * isWeekend, isWeekDay, getDaysInMonth, getDayName, getMonthName, getDayOfYear, getWeekOfYear, + * setDayOfYear, addYears, addMonths, addDays, addHours, addMinutes, addSeconds methods + * + * Copyright (c) 2006 Jörn Zaefferer and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net) + * + * Additional methods and properties added by Kelvin Luck: firstDayOfWeek, dateFormat, zeroTime, asString, fromString - + * I've added my name to these methods so you know who to blame if they are broken! + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +/** + * An Array of day names starting with Sunday. + * + * @example dayNames[0] + * @result 'Sunday' + * + * @name dayNames + * @type Array + * @cat Plugins/Methods/Date + */ +Date.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + +/** + * An Array of abbreviated day names starting with Sun. + * + * @example abbrDayNames[0] + * @result 'Sun' + * + * @name abbrDayNames + * @type Array + * @cat Plugins/Methods/Date + */ +Date.abbrDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + +/** + * An Array of month names starting with Janurary. + * + * @example monthNames[0] + * @result 'January' + * + * @name monthNames + * @type Array + * @cat Plugins/Methods/Date + */ +Date.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + +/** + * An Array of abbreviated month names starting with Jan. + * + * @example abbrMonthNames[0] + * @result 'Jan' + * + * @name monthNames + * @type Array + * @cat Plugins/Methods/Date + */ +Date.abbrMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + +/** + * The first day of the week for this locale. + * + * @name firstDayOfWeek + * @type Number + * @cat Plugins/Methods/Date + * @author Kelvin Luck + */ +Date.firstDayOfWeek = 1; + +/** + * The format that string dates should be represented as (e.g. 'dd/mm/yyyy' for UK, 'mm/dd/yyyy' for US, 'yyyy-mm-dd' for Unicode etc). + * + * @name format + * @type String + * @cat Plugins/Methods/Date + * @author Kelvin Luck + */ +//Date.format = 'dd/mm/yyyy'; +//Date.format = 'mm/dd/yyyy'; +Date.format = 'yyyy-mm-dd'; +//Date.format = 'dd mmm yy'; + +/** + * The first two numbers in the century to be used when decoding a two digit year. Since a two digit year is ambiguous (and date.setYear + * only works with numbers < 99 and so doesn't allow you to set years after 2000) we need to use this to disambiguate the two digit year codes. + * + * @name format + * @type String + * @cat Plugins/Methods/Date + * @author Kelvin Luck + */ +Date.fullYearStart = '20'; + +(function() { + + /** + * Adds a given method under the given name + * to the Date prototype if it doesn't + * currently exist. + * + * @private + */ + function add(name, method) { + if( !Date.prototype[name] ) { + Date.prototype[name] = method; + } + }; + + /** + * Checks if the year is a leap year. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.isLeapYear(); + * @result true + * + * @name isLeapYear + * @type Boolean + * @cat Plugins/Methods/Date + */ + add("isLeapYear", function() { + var y = this.getFullYear(); + return (y%4==0 && y%100!=0) || y%400==0; + }); + + /** + * Checks if the day is a weekend day (Sat or Sun). + * + * @example var dtm = new Date("01/12/2008"); + * dtm.isWeekend(); + * @result false + * + * @name isWeekend + * @type Boolean + * @cat Plugins/Methods/Date + */ + add("isWeekend", function() { + return this.getDay()==0 || this.getDay()==6; + }); + + /** + * Check if the day is a day of the week (Mon-Fri) + * + * @example var dtm = new Date("01/12/2008"); + * dtm.isWeekDay(); + * @result false + * + * @name isWeekDay + * @type Boolean + * @cat Plugins/Methods/Date + */ + add("isWeekDay", function() { + return !this.isWeekend(); + }); + + /** + * Gets the number of days in the month. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getDaysInMonth(); + * @result 31 + * + * @name getDaysInMonth + * @type Number + * @cat Plugins/Methods/Date + */ + add("getDaysInMonth", function() { + return [31,(this.isLeapYear() ? 29:28),31,30,31,30,31,31,30,31,30,31][this.getMonth()]; + }); + + /** + * Gets the name of the day. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getDayName(); + * @result 'Saturday' + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getDayName(true); + * @result 'Sat' + * + * @param abbreviated Boolean When set to true the name will be abbreviated. + * @name getDayName + * @type String + * @cat Plugins/Methods/Date + */ + add("getDayName", function(abbreviated) { + return abbreviated ? Date.abbrDayNames[this.getDay()] : Date.dayNames[this.getDay()]; + }); + + /** + * Gets the name of the month. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getMonthName(); + * @result 'Janurary' + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getMonthName(true); + * @result 'Jan' + * + * @param abbreviated Boolean When set to true the name will be abbreviated. + * @name getDayName + * @type String + * @cat Plugins/Methods/Date + */ + add("getMonthName", function(abbreviated) { + return abbreviated ? Date.abbrMonthNames[this.getMonth()] : Date.monthNames[this.getMonth()]; + }); + + /** + * Get the number of the day of the year. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getDayOfYear(); + * @result 11 + * + * @name getDayOfYear + * @type Number + * @cat Plugins/Methods/Date + */ + add("getDayOfYear", function() { + var tmpdtm = new Date("1/1/" + this.getFullYear()); + return Math.floor((this.getTime() - tmpdtm.getTime()) / 86400000); + }); + + /** + * Get the number of the week of the year. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.getWeekOfYear(); + * @result 2 + * + * @name getWeekOfYear + * @type Number + * @cat Plugins/Methods/Date + */ + add("getWeekOfYear", function() { + return Math.ceil(this.getDayOfYear() / 7); + }); + + /** + * Set the day of the year. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.setDayOfYear(1); + * dtm.toString(); + * @result 'Tue Jan 01 2008 00:00:00' + * + * @name setDayOfYear + * @type Date + * @cat Plugins/Methods/Date + */ + add("setDayOfYear", function(day) { + this.setMonth(0); + this.setDate(day); + return this; + }); + + /** + * Add a number of years to the date object. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.addYears(1); + * dtm.toString(); + * @result 'Mon Jan 12 2009 00:00:00' + * + * @name addYears + * @type Date + * @cat Plugins/Methods/Date + */ + add("addYears", function(num) { + this.setFullYear(this.getFullYear() + num); + return this; + }); + + /** + * Add a number of months to the date object. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.addMonths(1); + * dtm.toString(); + * @result 'Tue Feb 12 2008 00:00:00' + * + * @name addMonths + * @type Date + * @cat Plugins/Methods/Date + */ + add("addMonths", function(num) { + var tmpdtm = this.getDate(); + + this.setMonth(this.getMonth() + num); + + if (tmpdtm > this.getDate()) + this.addDays(-this.getDate()); + + return this; + }); + + /** + * Add a number of days to the date object. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.addDays(1); + * dtm.toString(); + * @result 'Sun Jan 13 2008 00:00:00' + * + * @name addDays + * @type Date + * @cat Plugins/Methods/Date + */ + add("addDays", function(num) { + this.setDate(this.getDate() + num); + return this; + }); + + /** + * Add a number of hours to the date object. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.addHours(24); + * dtm.toString(); + * @result 'Sun Jan 13 2008 00:00:00' + * + * @name addHours + * @type Date + * @cat Plugins/Methods/Date + */ + add("addHours", function(num) { + this.setHours(this.getHours() + num); + return this; + }); + + /** + * Add a number of minutes to the date object. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.addMinutes(60); + * dtm.toString(); + * @result 'Sat Jan 12 2008 01:00:00' + * + * @name addMinutes + * @type Date + * @cat Plugins/Methods/Date + */ + add("addMinutes", function(num) { + this.setMinutes(this.getMinutes() + num); + return this; + }); + + /** + * Add a number of seconds to the date object. + * + * @example var dtm = new Date("01/12/2008"); + * dtm.addSeconds(60); + * dtm.toString(); + * @result 'Sat Jan 12 2008 00:01:00' + * + * @name addSeconds + * @type Date + * @cat Plugins/Methods/Date + */ + add("addSeconds", function(num) { + this.setSeconds(this.getSeconds() + num); + return this; + }); + + /** + * Sets the time component of this Date to zero for cleaner, easier comparison of dates where time is not relevant. + * + * @example var dtm = new Date(); + * dtm.zeroTime(); + * dtm.toString(); + * @result 'Sat Jan 12 2008 00:01:00' + * + * @name zeroTime + * @type Date + * @cat Plugins/Methods/Date + * @author Kelvin Luck + */ + add("zeroTime", function() { + this.setMilliseconds(0); + this.setSeconds(0); + this.setMinutes(0); + this.setHours(0); + return this; + }); + + /** + * Returns a string representation of the date object according to Date.format. + * (Date.toString may be used in other places so I purposefully didn't overwrite it) + * + * @example var dtm = new Date("01/12/2008"); + * dtm.asString(); + * @result '12/01/2008' // (where Date.format == 'dd/mm/yyyy' + * + * @name asString + * @type Date + * @cat Plugins/Methods/Date + * @author Kelvin Luck + */ + add("asString", function() { + var r = Date.format; + return r + .split('yyyy').join(this.getFullYear()) + .split('yy').join((this.getFullYear() + '').substring(2)) + .split('mmm').join(this.getMonthName(true)) + .split('mm').join(_zeroPad(this.getMonth()+1)) + .split('dd').join(_zeroPad(this.getDate())); + }); + + /** + * Returns a new date object created from the passed String according to Date.format or false if the attempt to do this results in an invalid date object + * (We can't simple use Date.parse as it's not aware of locale and I chose not to overwrite it incase it's functionality is being relied on elsewhere) + * + * @example var dtm = Date.fromString("12/01/2008"); + * dtm.toString(); + * @result 'Sat Jan 12 2008 00:00:00' // (where Date.format == 'dd/mm/yyyy' + * + * @name fromString + * @type Date + * @cat Plugins/Methods/Date + * @author Kelvin Luck + */ + Date.fromString = function(s) + { + var f = Date.format; + var d = new Date('01/01/1977'); + var iY = f.indexOf('yyyy'); + if (iY > -1) { + d.setFullYear(Number(s.substr(iY, 4))); + } else { + // TODO - this doesn't work very well - are there any rules for what is meant by a two digit year? + d.setFullYear(Number(Date.fullYearStart + s.substr(f.indexOf('yy'), 2))); + } + var iM = f.indexOf('mmm'); + if (iM > -1) { + var mStr = s.substr(iM, 3); + for (var i=0; i<Date.abbrMonthNames.length; i++) { + if (Date.abbrMonthNames[i] == mStr) break; + } + d.setMonth(i); + } else { + d.setMonth(Number(s.substr(f.indexOf('mm'), 2)) - 1); + } + d.setDate(Number(s.substr(f.indexOf('dd'), 2))); + if (isNaN(d.getTime())) { + return false; + } + return d; + }; + + // utility method + var _zeroPad = function(num) { + var s = '0'+num; + return s.substring(s.length-2) + //return ('0'+num).substring(-2); // doesn't work on IE :( + }; + +})(); \ No newline at end of file diff --git a/js/gg-translate.js b/js/gg-translate.js new file mode 100644 index 000000000..a7dfb4bd7 --- /dev/null +++ b/js/gg-translate.js @@ -0,0 +1,79 @@ +google.load('language', '1'); +var display_once = 0; +var output_error = '<div class="gg-errors-output error" style="margin:10px;"></div>'; +var gg_current_bt = {}; +var current_translate = ''; +$(function() +{ + // @see gg_language_code declaration in AdminTranslations::displayAutoTranslate() method. + if (!ggIsTranslatable(gg_translate['language_code'])) + { + setErrorMessage('"'+gg_translate['language_code']+'" : '+gg_translate['not_available']); + } + else + { + $('#content').find('input[type="text"], textarea').each(function() + { + $(this).after('<a class="button-translate" title="'+gg_translate['tooltip_title']+'|wait..." ><img src="../img/admin/page_world.png" alt="'+gg_translate['tooltip_title']+'"></a>'); + }); + $('.button-translate').mouseover(function() + { + gg_current_bt = $(this); + }) + .click(function(e) + { + var field = $(this).prev(); + if (current_translate != '') + { + if (field.is('input[type="text"]')) field.val(current_translate); + if (field.is('textarea')) field.html(current_translate); + } + }) + .cluetip({ + splitTitle: '|', // use the invoking element's title attribute to populate the clueTip... + // ...and split the contents into separate divs where there is a "|" + showTitle: true, // hide the clueTip's heading + dropShadow: false, + onShow : function(ct, c_inner) + { + current_translate = ''; + $('#cluetip-inner').html('<img src="../img/loader.gif" alt="loader" />'); + var button = gg_current_bt; + if (button.parent("td").prev().html()) + { + google.language.translate(button.parent("td").prev().html(), 'en', gg_translate['language_code'], function(result) + { + if (!result.error) + { + current_translate = result.translation.replace('&#39;', '\''); + while (current_translate != (current_translate = current_translate.replace('&#39;', '\''))); + $('#cluetip-inner').html(current_translate); + } + else if (display_once == 0) + { + display_once = 1; + $('#cluetip-inner').html('<span class="error">'+result.error.message+'</span>'); + current_translate = ''; + } + }); + } + } + }); + } +}); +function ggIsTranslatable(iso_lang) +{ + if(iso_lang.length == 2) + return google.language.isTranslatable(iso_lang); + else if (iso_lang.length > 2) + { + iso_lang = iso_lang.substring(0, 2); + gg_translate['language_code'] = iso_lang; + return ggIsTranslatable(iso_lang); + } +} +function setErrorMessage(string) +{ + $('#content .path_bar').after(output_error); + $('#content .gg-errors-output:eq(0)').html(string); +} \ No newline at end of file diff --git a/js/hookLiveEdit.js b/js/hookLiveEdit.js new file mode 100644 index 000000000..d28abee49 --- /dev/null +++ b/js/hookLiveEdit.js @@ -0,0 +1,218 @@ +var modules_list = new Array(); +var hooks_list = new Array(); +var hookable_list = new Array(); +var timer; +$(document).ready(function() { + + $('body').css('margin-bottom', '45px'); + $('#fancy').fancybox({ + autoDimensions: true, + autoScale: true, + width: 300, + height: 300, + padding: 0, + hideOnOverlayClick: false, + hideOnContentClick: false, + showCloseButton: false + }); + $('#live_edit_feedback_str').html(''); + $('a').each(function() { + var href = $(this).attr('href'); + var search = $(this).attr('search'); + var hrefAdd = 'live_edit&liveToken=' + get('liveToken') + '&ad=' + get('ad') + '&id_shop=' + get('id_shop'); + if (href != undefined && href != '#' && href.substr(0, baseDir.length) == baseDir) { + if (search.length == 0) { + $(this).attr('search', hrefAdd); + } + else { + $(this).attr('search', search + '&' + hrefAdd); + } + } + }); + getHookableList(); + $('.unregisterHook').unbind('click').click(function() { + id = $(this).attr('id'); + $(this).parent().parent().parent().fadeOut('slow', function() { + $(this).remove(); + }); + return false; + }); + + $('#cancelMove').unbind('click').click(function() { + $('#' + cancelMove + '').sortable('cancel'); + return false; + }); + + $('#saveLiveEdit').unbind('click').click(function() { + saveModulePosition(); + return false; + }); + + $('#closeLiveEdit').unbind('click').click(function() { + $("#live_edit_feedback_str").html('<div style="padding:10px;"><p style="margin-bottom:10px;">' + confirmClose + '</p><p style="height:1.6em;display:block"><a style="margin:auto;float:left" class="button" href="#" onclick="closeLiveEdit();">' + confirm + '</a><a style="margin:auto;float:right;" class="button" href="#" onclick="closeFancybox();">' + cancel + '</a></p></div>'); + $("#fancy").attr('href', '#live_edit_feedback'); + $("#fancy").trigger("click"); + }); + + $('.add_module_live_edit').unbind('click').click(function() { + $("#live_edit_feedback_str").html('<div style="padding:10px"><img src="img/loadingAnimation.gif"></div>'); + $("#fancy").attr('href', '#live_edit_feedback'); + $("#fancy").trigger("click"); + var id = $(this).attr('id'); + getHookableModuleList(id.substr(4, id.length)); + return false; + }); + + $('.dndHook').each(function() { + var id_hook = $(this).attr('id'); + var new_target = ''; + var old_target = ''; + var cancel = false; + + $('#' + id_hook + '').sortable({ + opacity: 0.5, + cursor: 'move', + + connectWith: '.dndHook', + receive: function(event, ui) { + if (new_target == '') { + new_target = event.target.id; + } + }, + start: function(event, ui) { + new_target = ui.item[0].parentNode.id; + }, + stop: function(event, ui) { + + if (cancel) { + $(this).sortable('cancel'); + } + else { + old_target = event.target.id; + cancelMove = old_target; + if (new_target == '') new_target = old_target; + } + }, + change: function(event, ui) { + new_target = $(ui.placeholder).parent().attr('id'); + ids = ui.item[0].id.split('_'); + if ($.inArray(ids[5], hookable_list[new_target]) != -1) { + cancel = false; + ui.placeholder.css({ + visibility: 'visible', + border: '1px solid #72CB67', + background: '#DFFAD3' + }); + } + else { + ui.placeholder.css({ + visibility: 'visible', + border: '1px solid #EC9B9B', + background: '#FAE2E3' + }); + cancel = true; + } + } + }); + $('#' + id_hook + '').disableSelection(); + }); +}); + +function getHookableList() { + $.ajax({ + type: 'GET', + url: baseDir + ad + '/ajax.php', + async: true, + dataType: 'json', + data: 'ajax=true&getHookableList&hooks_list=' + hooks_list + '&modules_list=' + modules_list + '&id_shop=' + get('id_shop'), + success: function(jsonData) { + hookable_list = jsonData; + }, + error: function(XMLHttpRequest, textStatus, errorThrown) { + $('#live_edit_feedback_str').html('<div class="live_edit_feed_back_ko"><img src="img/admin/error.png"><h3>TECHNICAL ERROR:</h3>' + loadFail + '<br><br><a style="margin:auto" class="button" href="#" onclick="closeFancybox();">' + close + '</a></div>'); + $("#fancy").attr('href', '#live_edit_feedback'); + $("#fancy").trigger("click"); + } + }); +} + +function getHookableModuleList(hook) { + + $.ajax({ + type: 'GET', + url: baseDir + ad + '/ajax.php', + async: true, + dataType: 'json', + data: 'ajax=true&getHookableModuleList&hook=' + hook + '&id_shop=' + get('id_shop'), + success: function(jsonData) { + + var select = '<select id="select_module">'; + for (var i = 0; i < jsonData.length; i++) { + select += '<option value="' + jsonData[i].id + '">' + jsonData[i].name + '</option>'; + } + select += '</select>'; + $("#live_edit_feedback_str").html('<div style="padding:10px">' + select + '<br><br><a style="margin:auto" class="button" href="#" >' + add + '</a><br><br><a style="margin:auto" class="button" href="#" onclick="closeFancybox();">' + cancel + '</a>'); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) { + alert("TECHNICAL ERROR: unable to unregister hook \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); + } + }); +} + +function saveModulePosition() { + $("#live_edit_feedback_str").html('<div style="padding:10px"><img src="img/loadingAnimation.gif"></div>'); + $("#fancy").attr('href', '#live_edit_feedback'); + $("#fancy").trigger("click"); + var str = ''; + for (var i = 0; i < hooks_list.length; i++) { + str += '&' + hooks_list[i] + '='; + $('#' + hooks_list[i] + ' > .dndModule').each(function() { + ids = $(this).attr('id').split('_'); + str += ids[1] + '_' + ids[3] + ','; + }); + str = str.substr(0, str.length - 1); + } + $.ajax({ + type: 'GET', + url: baseDir + ad + '/ajax.php', + async: true, + dataType: 'json', + data: 'ajax=true&saveHook&hooks_list=' + hooks_list + str + '&id_shop=' + get('id_shop'), + success: function(jsonData) { + $('#live_edit_feedback_str').html('<div class="live_edit_feed_back_ok"><img src="img/admin/ok2.png"><h3>' + saveOK + '</h3><a style="margin:auto" class="exclusive" href="#" onclick="closeFancybox();">' + close + '</a></div>'); + timer = setTimeout("hideFeedback()", 3000); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) { + $('#live_edit_feedback_str').html('<div class="live_edit_feed_back_ko"><img src="img/admin/error.png"><h3>TECHNICAL ERROR:</h3>' + unableToSaveModulePosition + '<br><br><a style="margin:auto" class="button" href="#" onclick="closeFancybox();">' + close + '</a></div>'); + } + }); +} + +function closeFancybox() { + clearTimeout(timer); + $.fancybox.close(); + $('#live_edit_feedback_str').html(''); +} + +function closeLiveEdit(){ + window.location.href = window.location.protocol+'//'+window.location.host+window.location.pathname; +} + +function hideFeedback() { + $('#live_edit_feed_back').fadeOut('slow', function() { + $.fancybox.close(); + $('#live_edit_feedback_str').html(''); + }); +}; + +function get(name) { + var regexS = "[\\?&]" + name + "=([^&#]*)"; + var regex = new RegExp(regexS); + var results = regex.exec(window.location.href); + if (results == null) { + return ""; + } + else { + return results[1]; + } +} diff --git a/js/index.php b/js/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/js/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/jquery/accordion/accordion.css b/js/jquery/accordion/accordion.css new file mode 100644 index 000000000..376f29059 --- /dev/null +++ b/js/jquery/accordion/accordion.css @@ -0,0 +1,695 @@ + * jQuery UI Accordion @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } + +.ui-widget { +font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; +font-size:1.1em; +} +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { +font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; +font-size:1em; +} +.ui-widget-header { +border:1px solid #E78F08; +color:#FFFFFF; +font-weight:bold; +} +.ui-widget-header a { +color:#FFFFFF; +} +.ui-widget-content { +border:1px solid #DDDDDD; +color:#333333; +display:none; +} +.ui-widget-content a { +color:#333333; +} +.ui-state-default, .ui-widget-content .ui-state-default { +border:1px solid #CCCCCC; +color:#1C94C4; +font-weight:bold; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +} +.ui-state-default a { +color:#1C94C4; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +text-decoration:none; +} +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { +background:#FDF5CE url(fdf5ce.png) repeat-x scroll 50% 50%; +border:1px solid #FBCB09; +color:#C77405; +font-weight:bold; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +} +.ui-state-hover a { +color:#C77405; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +text-decoration:none; +} +.ui-state-active, .ui-widget-content .ui-state-active { +border:1px solid #FBD850; +color:#EB8F00; +font-weight:bold; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +} +.ui-state-active a { +color:#EB8F00; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +text-decoration:none; +} +.ui-state-highlight, .ui-widget-content .ui-state-highlight { +border:1px solid #FED22F; +color:#363636; +} +.ui-state-error, .ui-widget-content .ui-state-error { +border:1px solid #CD0A0A; +color:#FFFFFF; +} +.ui-state-error-text, .ui-widget-content .ui-state-error-text { +color:#FFFFFF; +} +.ui-state-disabled, .ui-widget-content .ui-state-disabled { +background-image:none; +opacity:0.35; +} +.ui-priority-primary, .ui-widget-content .ui-priority-primary { +font-weight:bold; +} +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { +font-weight:normal; +opacity:0.7; +} +.ui-icon { +background-image:url(222222.png); +height:16px; +width:16px; +} +.ui-widget-content .ui-icon { +background-image:url(icons222222.png); +} +.ui-widget-header .ui-icon { +background-image:url(iconsffffff.png); +} +.ui-state-default .ui-icon { +background-image:url(iconsef8c08.png); +} +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { +background-image:url(iconsef8c08.png); +} +.ui-state-active .ui-icon { +background-image:url(iconsef8c08.png); +} +.ui-state-highlight .ui-icon { +background-image:url(icons228ef1.png); +} +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { +background-image:url(iconsffd27a.png); +} +.ui-icon-carat-1-n { +background-position:0 0; +} +.ui-icon-carat-1-ne { +background-position:-16px 0; +} +.ui-icon-carat-1-e { +background-position:-32px 0; +} +.ui-icon-carat-1-se { +background-position:-48px 0; +} +.ui-icon-carat-1-s { +background-position:-64px 0; +} +.ui-icon-carat-1-sw { +background-position:-80px 0; +} +.ui-icon-carat-1-w { +background-position:-96px 0; +} +.ui-icon-carat-1-nw { +background-position:-112px 0; +} +.ui-icon-carat-2-n-s { +background-position:-128px 0; +} +.ui-icon-carat-2-e-w { +background-position:-144px 0; +} +.ui-icon-triangle-1-n { +background-position:0 -16px; +} +.ui-icon-triangle-1-ne { +background-position:-16px -16px; +} +.ui-icon-triangle-1-e { +background-position:-32px -16px; +} +.ui-icon-triangle-1-se { +background-position:-48px -16px; +} +.ui-icon-triangle-1-s { +background-position:-64px -16px; +} +.ui-icon-triangle-1-sw { +background-position:-80px -16px; +} +.ui-icon-triangle-1-w { +background-position:-96px -16px; +} +.ui-icon-triangle-1-nw { +background-position:-112px -16px; +} +.ui-icon-triangle-2-n-s { +background-position:-128px -16px; +} +.ui-icon-triangle-2-e-w { +background-position:-144px -16px; +} +.ui-icon-arrow-1-n { +background-position:0 -32px; +} +.ui-icon-arrow-1-ne { +background-position:-16px -32px; +} +.ui-icon-arrow-1-e { +background-position:-32px -32px; +} +.ui-icon-arrow-1-se { +background-position:-48px -32px; +} +.ui-icon-arrow-1-s { +background-position:-64px -32px; +} +.ui-icon-arrow-1-sw { +background-position:-80px -32px; +} +.ui-icon-arrow-1-w { +background-position:-96px -32px; +} +.ui-icon-arrow-1-nw { +background-position:-112px -32px; +} +.ui-icon-arrow-2-n-s { +background-position:-128px -32px; +} +.ui-icon-arrow-2-ne-sw { +background-position:-144px -32px; +} +.ui-icon-arrow-2-e-w { +background-position:-160px -32px; +} +.ui-icon-arrow-2-se-nw { +background-position:-176px -32px; +} +.ui-icon-arrowstop-1-n { +background-position:-192px -32px; +} +.ui-icon-arrowstop-1-e { +background-position:-208px -32px; +} +.ui-icon-arrowstop-1-s { +background-position:-224px -32px; +} +.ui-icon-arrowstop-1-w { +background-position:-240px -32px; +} +.ui-icon-arrowthick-1-n { +background-position:0 -48px; +} +.ui-icon-arrowthick-1-ne { +background-position:-16px -48px; +} +.ui-icon-arrowthick-1-e { +background-position:-32px -48px; +} +.ui-icon-arrowthick-1-se { +background-position:-48px -48px; +} +.ui-icon-arrowthick-1-s { +background-position:-64px -48px; +} +.ui-icon-arrowthick-1-sw { +background-position:-80px -48px; +} +.ui-icon-arrowthick-1-w { +background-position:-96px -48px; +} +.ui-icon-arrowthick-1-nw { +background-position:-112px -48px; +} +.ui-icon-arrowthick-2-n-s { +background-position:-128px -48px; +} +.ui-icon-arrowthick-2-ne-sw { +background-position:-144px -48px; +} +.ui-icon-arrowthick-2-e-w { +background-position:-160px -48px; +} +.ui-icon-arrowthick-2-se-nw { +background-position:-176px -48px; +} +.ui-icon-arrowthickstop-1-n { +background-position:-192px -48px; +} +.ui-icon-arrowthickstop-1-e { +background-position:-208px -48px; +} +.ui-icon-arrowthickstop-1-s { +background-position:-224px -48px; +} +.ui-icon-arrowthickstop-1-w { +background-position:-240px -48px; +} +.ui-icon-arrowreturnthick-1-w { +background-position:0 -64px; +} +.ui-icon-arrowreturnthick-1-n { +background-position:-16px -64px; +} +.ui-icon-arrowreturnthick-1-e { +background-position:-32px -64px; +} +.ui-icon-arrowreturnthick-1-s { +background-position:-48px -64px; +} +.ui-icon-arrowreturn-1-w { +background-position:-64px -64px; +} +.ui-icon-arrowreturn-1-n { +background-position:-80px -64px; +} +.ui-icon-arrowreturn-1-e { +background-position:-96px -64px; +} +.ui-icon-arrowreturn-1-s { +background-position:-112px -64px; +} +.ui-icon-arrowrefresh-1-w { +background-position:-128px -64px; +} +.ui-icon-arrowrefresh-1-n { +background-position:-144px -64px; +} +.ui-icon-arrowrefresh-1-e { +background-position:-160px -64px; +} +.ui-icon-arrowrefresh-1-s { +background-position:-176px -64px; +} +.ui-icon-arrow-4 { +background-position:0 -80px; +} +.ui-icon-arrow-4-diag { +background-position:-16px -80px; +} +.ui-icon-extlink { +background-position:-32px -80px; +} +.ui-icon-newwin { +background-position:-48px -80px; +} +.ui-icon-refresh { +background-position:-64px -80px; +} +.ui-icon-shuffle { +background-position:-80px -80px; +} +.ui-icon-transfer-e-w { +background-position:-96px -80px; +} +.ui-icon-transferthick-e-w { +background-position:-112px -80px; +} +.ui-icon-folder-collapsed { +background-position:0 -96px; +} +.ui-icon-folder-open { +background-position:-16px -96px; +} +.ui-icon-document { +background-position:-32px -96px; +} +.ui-icon-document-b { +background-position:-48px -96px; +} +.ui-icon-note { +background-position:-64px -96px; +} +.ui-icon-mail-closed { +background-position:-80px -96px; +} +.ui-icon-mail-open { +background-position:-96px -96px; +} +.ui-icon-suitcase { +background-position:-112px -96px; +} +.ui-icon-comment { +background-position:-128px -96px; +} +.ui-icon-person { +background-position:-144px -96px; +} +.ui-icon-print { +background-position:-160px -96px; +} +.ui-icon-trash { +background-position:-176px -96px; +} +.ui-icon-locked { +background-position:-192px -96px; +} +.ui-icon-unlocked { +background-position:-208px -96px; +} +.ui-icon-bookmark { +background-position:-224px -96px; +} +.ui-icon-tag { +background-position:-240px -96px; +} +.ui-icon-home { +background-position:0 -112px; +} +.ui-icon-flag { +background-position:-16px -112px; +} +.ui-icon-calendar { +background-position:-32px -112px; +} +.ui-icon-cart { +background-position:-48px -112px; +} +.ui-icon-pencil { +background-position:-64px -112px; +} +.ui-icon-clock { +background-position:-80px -112px; +} +.ui-icon-disk { +background-position:-96px -112px; +} +.ui-icon-calculator { +background-position:-112px -112px; +} +.ui-icon-zoomin { +background-position:-128px -112px; +} +.ui-icon-zoomout { +background-position:-144px -112px; +} +.ui-icon-search { +background-position:-160px -112px; +} +.ui-icon-wrench { +background-position:-176px -112px; +} +.ui-icon-gear { +background-position:-192px -112px; +} +.ui-icon-heart { +background-position:-208px -112px; +} +.ui-icon-star { +background-position:-224px -112px; +} +.ui-icon-link { +background-position:-240px -112px; +} +.ui-icon-cancel { +background-position:0 -128px; +} +.ui-icon-plus { +background-position:-16px -128px; +} +.ui-icon-plusthick { +background-position:-32px -128px; +} +.ui-icon-minus { +background-position:-48px -128px; +} +.ui-icon-minusthick { +background-position:-64px -128px; +} +.ui-icon-close { +background-position:-80px -128px; +} +.ui-icon-closethick { +background-position:-96px -128px; +} +.ui-icon-key { +background-position:-112px -128px; +} +.ui-icon-lightbulb { +background-position:-128px -128px; +} +.ui-icon-scissors { +background-position:-144px -128px; +} +.ui-icon-clipboard { +background-position:-160px -128px; +} +.ui-icon-copy { +background-position:-176px -128px; +} +.ui-icon-contact { +background-position:-192px -128px; +} +.ui-icon-image { +background-position:-208px -128px; +} +.ui-icon-video { +background-position:-224px -128px; +} +.ui-icon-alert { +background-position:0 -144px; +} +.ui-icon-info { +background-position:-16px -144px; +} +.ui-icon-notice { +background-position:-32px -144px; +} +.ui-icon-help { +background-position:-48px -144px; +} +.ui-icon-check { +background-position:-64px -144px; +} +.ui-icon-bullet { +background-position:-80px -144px; +} +.ui-icon-radio-off { +background-position:-96px -144px; +} +.ui-icon-radio-on { +background-position:-112px -144px; +} +.ui-icon-play { +background-position:0 -160px; +} +.ui-icon-pause { +background-position:-16px -160px; +} +.ui-icon-seek-next { +background-position:-32px -160px; +} +.ui-icon-seek-prev { +background-position:-48px -160px; +} +.ui-icon-seek-end { +background-position:-64px -160px; +} +.ui-icon-seek-first { +background-position:-80px -160px; +} +.ui-icon-stop { +background-position:-96px -160px; +} +.ui-icon-eject { +background-position:-112px -160px; +} +.ui-icon-volume-off { +background-position:-128px -160px; +} +.ui-icon-volume-on { +background-position:-144px -160px; +} +.ui-icon-power { +background-position:0 -176px; +} +.ui-icon-signal-diag { +background-position:-16px -176px; +} +.ui-icon-signal { +background-position:-32px -176px; +} +.ui-icon-battery-0 { +background-position:-48px -176px; +} +.ui-icon-battery-1 { +background-position:-64px -176px; +} +.ui-icon-battery-2 { +background-position:-80px -176px; +} +.ui-icon-battery-3 { +background-position:-96px -176px; +} +.ui-icon-circle-plus { +background-position:0 -192px; +} +.ui-icon-circle-minus { +background-position:-16px -192px; +} +.ui-icon-circle-close { +background-position:-32px -192px; +} +.ui-icon-circle-triangle-e { +background-position:-48px -192px; +} +.ui-icon-circle-triangle-s { +background-position:-64px -192px; +} +.ui-icon-circle-triangle-w { +background-position:-80px -192px; +} +.ui-icon-circle-triangle-n { +background-position:-96px -192px; +} +.ui-icon-circle-arrow-e { +background-position:-112px -192px; +} +.ui-icon-circle-arrow-s { +background-position:-128px -192px; +} +.ui-icon-circle-arrow-w { +background-position:-144px -192px; +} +.ui-icon-circle-arrow-n { +background-position:-160px -192px; +} +.ui-icon-circle-zoomin { +background-position:-176px -192px; +} +.ui-icon-circle-zoomout { +background-position:-192px -192px; +} +.ui-icon-circle-check { +background-position:-208px -192px; +} +.ui-icon-circlesmall-plus { +background-position:0 -208px; +} +.ui-icon-circlesmall-minus { +background-position:-16px -208px; +} +.ui-icon-circlesmall-close { +background-position:-32px -208px; +} +.ui-icon-squaresmall-plus { +background-position:-48px -208px; +} +.ui-icon-squaresmall-minus { +background-position:-64px -208px; +} +.ui-icon-squaresmall-close { +background-position:-80px -208px; +} +.ui-icon-grip-dotted-vertical { +background-position:0 -224px; +} +.ui-icon-grip-dotted-horizontal { +background-position:-16px -224px; +} +.ui-icon-grip-solid-vertical { +background-position:-32px -224px; +} +.ui-icon-grip-solid-horizontal { +background-position:-48px -224px; +} +.ui-icon-gripsmall-diagonal-se { +background-position:-64px -224px; +} +.ui-icon-grip-diagonal-se { +background-position:-80px -224px; +} +.ui-corner-tl { +-moz-border-radius-topleft:4px; +} +.ui-corner-tr { +-moz-border-radius-topright:4px; +} +.ui-corner-bl { +-moz-border-radius-bottomleft:4px; +} +.ui-corner-br { +-moz-border-radius-bottomright:4px; +} +.ui-corner-top { +-moz-border-radius-topleft:4px; +-moz-border-radius-topright:4px; +} +.ui-corner-bottom { +-moz-border-radius-bottomleft:4px; +-moz-border-radius-bottomright:4px; +} +.ui-corner-right { +-moz-border-radius-bottomright:4px; +-moz-border-radius-topright:4px; +} +.ui-corner-left { +-moz-border-radius-bottomleft:4px; +-moz-border-radius-topleft:4px; +} +.ui-corner-all { +-moz-border-radius-bottomleft:4px; +-moz-border-radius-bottomright:4px; +-moz-border-radius-topleft:4px; +-moz-border-radius-topright:4px; +} +.ui-widget-overlay { +background:#666666 url(666666.png) repeat scroll 50% 50%; +opacity:0.5; +} +.ui-widget-shadow { +-moz-border-radius-bottomleft:5px; +-moz-border-radius-bottomright:5px; +-moz-border-radius-topleft:5px; +-moz-border-radius-topright:5px; +background:#000000 url(000000.png) repeat-x scroll 50% 50%; +margin:-5px 0 0 -5px; +opacity:0.2; +padding:5px; +} diff --git a/js/jquery/accordion/accordion.ui.js b/js/jquery/accordion/accordion.ui.js new file mode 100644 index 000000000..cf34b8363 --- /dev/null +++ b/js/jquery/accordion/accordion.ui.js @@ -0,0 +1,402 @@ +/*! + * jQuery UI 1.8.5 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.5",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind("mousedown.ui-disableSelection selectstart.ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this, +h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.createElement("div"),b=document.body;c.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.appendChild(a).offsetHeight===100;b.removeChild(a).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element, +d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); +(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h, +a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)=== +"_")return h;e?this.each(function(){var g=b.data(this,a);if(!g)throw"cannot call methods on "+a+" prior to initialization; attempted to call method '"+d+"'";if(!b.isFunction(g[d]))throw"no such method '"+d+"' for "+a+" widget instance";var i=g[d].apply(g,f);if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget", +widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+ +"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}b.each(d,function(f,h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled", +false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); +(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&& +this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault(); +return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&& +this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- +a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, +b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== +"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&& +a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"), +10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): +f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+ +this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+ +Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left- +this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs= +this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.5"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable"); +if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper; +c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver= +1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left; +this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper= +this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a= +d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options; +if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!= +"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX- +b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()- +c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this, +width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&& +o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t= +p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&& +(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"), +10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery); +(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this); +a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&& +this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass); +this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g= +d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop", +a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.5"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height; +switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>= +i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!= +"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem|| +a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e= +d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery); +(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element, +_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; +f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", +b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top= +a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, +k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"), +c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset= +this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ +a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable, +{version:"1.8.5"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize, +function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n= +(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition= +false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left- +a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize", +b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top", +"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset, +f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left= +a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+ +a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&& +e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative", +height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width= +d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting"); +a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&& +!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d= +e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.5"})})(jQuery); +(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, +arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= +c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, +{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); +if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", +a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+ +this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+ +b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+ +"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, +c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== +document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", +null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): +d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute|| +"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+ +this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"? +2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")}, +_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!= +this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a= +this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable"); +if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>= +0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width= +this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f}, +update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b= +null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this)); +this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a, +null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length|| +d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a== +"string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition== +"absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition== +"relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}}, +_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height- +this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"), +10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))? +this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b= +this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+ +this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])? +g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop(): +e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g== +f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive", +f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive", +g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over= +0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]); +this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}}); +d.extend(d.ui.sortable,{version:"1.8.5"})})(jQuery); +jQuery.effects||function(f,j){function l(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return m.transparent;return m[f.trim(c).toLowerCase()]}function r(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return l(b)}function n(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function o(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in s||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function t(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=r(b.elem,a);b.end=l(b.end);b.colorInit= +true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var m={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189, +183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255, +165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},p=["add","remove","toggle"],s={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=o(n.call(this)),q,u=e.attr("className");f.each(p,function(v, +i){c[i]&&e[i+"Class"](c[i])});q=o(n.call(this));e.attr("className",u);e.animate(t(h,q),a,b,function(){f.each(p,function(v,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a? +f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.5",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!== +null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent(); +var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"}); +c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c|| +typeof c=="number"||f.fx.speeds[c]||!f.effects[c])return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||!f.effects[c])return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||!f.effects[c]||typeof c== +"boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c, +a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/= +e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+ +b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/ +2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10* +a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158; +return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c, +a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery); +(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a); +c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery); +(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/ +3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a); +b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery); +(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","left","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,c/2)}var h={};h[g.size]= +f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery); +(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","left","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e=="show"?1: +0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f= +0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* +f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration, +a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery); +(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a, +b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity= +1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","left","width","height","overflow","opacity"],g=["position","top","left","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=c.effects.setMode(a, +b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};if(m=="box"||m=="both"){if(d.from.y!= +d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);a.css("overflow","hidden").css(a.from); +if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);child.to=c.effects.setTransition(child, +f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,n?e:g);c.effects.removeWrapper(a);b.callback&& +b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","left"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=(h=="pos"?"-=":"+=")+ +e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery); +(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","left"],e=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(e=="show")a.css(f,b=="pos"?-g:g);var i={};i[f]=(e=="show"?b=="pos"? +"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var f=d.closest(".ui-accordion-header");a.active=f.length?f:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",function(g){return a._keydown(g)}).next().attr("role", +"tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(g){a._clickHandler.call(a,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers); +this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(g){c(a.target).attr("tabIndex",-1);c(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected); +a.next().addClass("ui-accordion-content-active")}h=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):h,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(h,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},h=this.active=c([]);this._toggle(h,f,g)}},_toggle:function(a,b,d,f,g){var h=this,e=h.options;h.toShow=a;h.toHide=b;h.data=d;var j=function(){if(h)return h._completed.apply(h,arguments)};h._trigger("changestart",null,h.data);h.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]),toHide:b,complete:j, +down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!f[k]&&!c.easing[k])k="slide";f[k]||(f[k]=function(l){this.slide(l,{easing:k,duration:i||700})}); +f[k](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.5",animations:{slide:function(a, +b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},h={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){h[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);g[i]={value:j[1], +unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(h,{step:function(j,i){if(i.prop=="height")f=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=f*g[i.prop].value+g[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide", +paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +(function(e){e.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},_create:function(){var a=this,b=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!a.options.disabled){var d=e.ui.keyCode;switch(c.keyCode){case d.PAGE_UP:a._move("previousPage", +c);break;case d.PAGE_DOWN:a._move("nextPage",c);break;case d.UP:a._move("previous",c);c.preventDefault();break;case d.DOWN:a._move("next",c);c.preventDefault();break;case d.ENTER:case d.NUMPAD_ENTER:a.menu.element.is(":visible")&&c.preventDefault();case d.TAB:if(!a.menu.active)return;a.menu.select(c);break;case d.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay); +break}}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo(e(this.options.appendTo||"body",b)[0]).mousedown(function(c){var d=a.menu.element[0]; +c.target===d&&setTimeout(function(){e(document).one("mousedown",function(f){f.target!==a.element[0]&&f.target!==d&&!e.ui.contains(d,f.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",null,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");var f=a.previous;if(a.element[0]!==b.activeElement){a.element.focus(); +a.previous=f}if(false!==a._trigger("select",c,{item:d})){a.term=d.value;a.element.val(d.value)}a.close(c);a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a,b){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(e(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a=this,b,c;if(e.isArray(this.options.source)){b=this.options.source;this.source=function(d,f){f(e.ui.autocomplete.filter(b,d.term))}}else if(typeof this.options.source==="string"){c=this.options.source;this.source= +function(d,f){a.xhr&&a.xhr.abort();a.xhr=e.getJSON(c,d,function(g,i,h){h===a.xhr&&f(g);a.xhr=null})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search")!==false)return this._search(a)},_search:function(a){this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(a.length){a= +this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(b){if(typeof b=== +"string")return{label:b,value:b};return e.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1),c;this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position(e.extend({of:this.element},this.options.position));a=b.width("").outerWidth();c=this.element.outerWidth();b.outerWidth(Math.max(a,c))},_renderMenu:function(a,b){var c=this;e.each(b,function(d,f){c._renderItem(a,f)})}, +_renderItem:function(a,b){return e("<li></li>").data("item.autocomplete",b).append(e("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}, +filter:function(a,b){var c=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(d){return c.test(d.label||d.value||d)})}})})(jQuery); +(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(b){a.activate(b,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.attr("scrollTop"),f=this.element.height();if(c<0)this.element.attr("scrollTop",d+c);else c>=f&&this.element.attr("scrollTop",d+c-f+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})}, +deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0); +a.length?this.activate(c,a):this.activate(c,this.element.children(b))}else this.activate(c,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(":first"));else{var b=this.active.offset().top,c=this.element.height(),d=this.element.children("li").filter(function(){var f=e(this).offset().top-b-c+e(this).height();return f<10&&f>-10});d.length||(d=this.element.children(":last"));this.activate(a,d)}else this.activate(a,this.element.children(!this.active|| +this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last"));else{var b=this.active.offset().top,c=this.element.height();result=this.element.children("li").filter(function(){var d=e(this).offset().top-b+c-e(this).height();return d<10&&d>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))}, +hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery); +(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button", +i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button", +function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active"); +b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active"); +g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled", +c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement= +this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle|| +this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed", +true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"), +c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary"); +this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":visible").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); +(function(d,G){function L(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a, +b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.5"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= +f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f== +""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor== +Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); +d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, +_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= +d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; +for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& +this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&& +!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker(); +return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey|| +a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target, +a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat")); +var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| +a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); +d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& +d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, +h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); +this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); +this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), +k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; +a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): +"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& +!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; +b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b= +this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a= +d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a, +"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b== +"object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"? +3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,H){p=o(p)?H:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length).toLowerCase()==p[w].toLowerCase()){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d"); +break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u> +-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24* +60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)== +"'"&&!i("'"))u=false;else l+=a.charAt(j);else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+= +"'";else u=true;break;default:l+=a.charAt(j)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]}, +_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a, +this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+= +parseInt(j[1],10);break;case "w":case "W":g+=parseInt(j[1],10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)}, +_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e? +"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k= +this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a, +"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+ +n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+ +(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ +y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var N= +"",D=0;D<i[1];D++){var J=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c? +f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, +A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&q<j||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==J.getTime()&&g==a.selectedMonth&& +a._keyEvent||M.getTime()==q.getTime()&&M.getTime()==J.getTime()?" "+this._dayOverClass:"")+(K?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(K?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?"&#xa0;":K?'<span class="ui-state-default">'+q.getDate()+ +"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==J.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': +"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+ +a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?"&#xa0;":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, +i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?"&#xa0;":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); +return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.5";window["DP_jQuery_"+y]=d})(jQuery); +(function(c,j){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title"); +if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",f=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog", +"aria-labelledby":f}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var e=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i); +return false}).appendTo(e);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",f).html(d).prependTo(e);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;e.find("*").add(e).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&& +g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog"); +b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,f=d.options;if(f.modal&&!a||!f.stack&&!f.modal)return d._trigger("focus",b);if(f.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ= +f.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show); +a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(f){if(f.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),e=g.filter(":first");g=g.filter(":last");if(f.target===g[0]&&!f.shiftKey){e.focus(1);return false}else if(f.target===e[0]&&f.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false, +f=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(f);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(e,h){h=c.isFunction(h)?{click:h,text:e}:h;e=c("<button></button>",h).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&e.button()});f.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(e){return{position:e.position, +offset:e.offset}}var b=this,d=b.options,f=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(e,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",e,a(h))},drag:function(e,h){b._trigger("drag",e,a(h))},stop:function(e,h){d.position=[h.position.left-f.scrollLeft(),h.position.top-f.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g); +b._trigger("dragStop",e,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}a=a===j?this.options.resizable:a;var d=this,f=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:d._minHeight(), +handles:a,start:function(e,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",e,b(h))},resize:function(e,h){d._trigger("resize",e,b(h))},stop:function(e,h){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();d._trigger("resizeStop",e,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight, +a.height)},_position:function(a){var b=[],d=[0,0],f;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,e){if(+b[g]===b[g]){d[g]=b[g];b[g]=e}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(f=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a); +f||this.uiDialog.hide()},_setOption:function(a,b){var d=this,f=d.uiDialog,g=f.is(":data(resizable)"),e=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);e=true;break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":f.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case "draggable":b? +d._makeDraggable():f.draggable("destroy");break;case "height":e=true;break;case "maxHeight":g&&f.resizable("option","maxHeight",b);e=true;break;case "maxWidth":g&&f.resizable("option","maxWidth",b);e=true;break;case "minHeight":g&&f.resizable("option","minHeight",b);e=true;break;case "minWidth":g&&f.resizable("option","minWidth",b);e=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&f.resizable("destroy");g&&typeof b==="string"&&f.resizable("option","handles",b);!g&&b!==false&& +d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break;case "width":e=true;break}c.Widget.prototype._setOption.apply(d,arguments);e&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:c.support.minHeight?"auto":Math.max(a.minHeight- +b,0)}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.5",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","), +function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b= +(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a, +b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a< +b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery); +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.scrollTo&&d.document){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j= +{top:b.of.pageY,left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/ +2;if(b.at[1]==="bottom")j.top+=k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+parseInt(c.curCSS(this,"marginRight",true))||0,w=m+q+parseInt(c.curCSS(this,"marginBottom",true))||0,i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]=== +"center")i.top-=m/2;i.left=parseInt(i.left);i.top=parseInt(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft(); +b.left=d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0]; +b.left+=a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d= +c(b),g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +(function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=this.value();this.valueDiv.toggleClass("ui-corner-right", +a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.5"})})(jQuery); +(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var a=this,b=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");b.disabled&&this.element.addClass("ui-slider-disabled ui-disabled"); +this.range=d([]);if(b.range){if(b.range===true){this.range=d("<div></div>");if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(b.range==="min"||b.range==="max")this.range.addClass("ui-slider-range-"+b.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle"); +if(b.values&&b.values.length)for(;d(".ui-slider-handle",this.element).length<b.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!a.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");h=a._start(c,f);if(h===false)return}break}i=a.options.step;h=a.options.values&&a.options.values.length?(g=a.values(f)):(g=a.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=a._valueMin();break;case d.ui.keyCode.END:g=a._valueMax();break;case d.ui.keyCode.PAGE_UP:g=a._trimAlignValue(h+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=a._trimAlignValue(h-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +a._valueMax())return;g=a._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===a._valueMin())return;g=a._trimAlignValue(h-i);break}a._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(c,e);a._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(a){var b=this.options,c,e,f,h,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(b.range===true&&this.values(1)===b.min){g+=1;f=d(this.handles[g])}if(this._start(a, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();b=f.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-f.width()/2,top:a.pageY-b.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= +this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= +this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); +c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var e;if(this.options.values&&this.options.values.length){e=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>e||b===1&&c<e))c=e;if(c!==this.values(b)){e=this.values();e[b]=c;a=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e});this.values(b?0:1);a!==false&&this.values(b,c,true)}}else if(c!==this.value()){a=this._trigger("slide",a,{handle:this.handles[b],value:c}); +a!==false&&this.value(c)}},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value= +this._trimAlignValue(a);this._refreshValue();this._change(null,0)}return this._value()},values:function(a,b){var c,e,f;if(arguments.length>1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(a):this.value(); +else return this._values()},_setOption:function(a,b){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(a){case "disabled":if(b){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation(); +this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a)},_values:function(a){var b,c;if(arguments.length){b=this.options.values[a]; +return b=this._trimAlignValue(b)}else{b=this.options.values.slice();for(c=0;c<b.length;c+=1)b[c]=this._trimAlignValue(b[c]);return b}},_trimAlignValue:function(a){if(a<this._valueMin())return this._valueMin();if(a>this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=a%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= +this.options.range,b=this.options,c=this,e=!this._animateOff?b.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({width:f- +g+"%"},{queue:false,duration:b.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:b.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"}, +b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.5"})})(jQuery); +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(a,e){if(a=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[a]=e;this._tabify()}},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var a=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[a].concat(d.makeArray(arguments)))},_ui:function(a,e){return{tab:a,panel:e,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var a= +d(this);a.html(a.data("label.tabs")).removeData("label.tabs")})},_tabify:function(a){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var b=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))b.panels=b.panels.add(b._sanitizeSelector(i));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=b._tabId(f);f.href="#"+i;f=d("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(b.panels[g-1]||b.list);f.data("destroy.tabs",true)}b.panels=b.panels.add(f)}else c.disabled.push(g)});if(a){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(b._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return b.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){this.panels.eq(c.selected).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");b.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[c.selected],b.panels[c.selected]))});this.load(c.selected)}d(window).bind("unload",function(){b.lis.add(b.anchors).unbind(".tabs");b.lis=b.anchors=b.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[c.collapsible?"addClass": +"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);a=0;for(var j;j=this.lis[a];a++)d(j)[d.inArray(a,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs", +function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);b._trigger("show", +null,b._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");b._trigger("show",null,b._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);b.element.dequeue("tabs")})}:function(g,f){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");b.element.dequeue("tabs")};this.anchors.bind(c.event+".tabs", +function(){var g=this,f=d(g).closest("li"),i=b.panels.filter(":not(.ui-tabs-hide)"),l=d(b._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||b.panels.filter(":animated").length||b._trigger("select",null,b._ui(this,l[0]))===false){this.blur();return false}c.selected=b.anchors.index(this);b.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=-1;c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs", +function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this));this.blur();return false}c.cookie&&b._cookie(c.selected,c.cookie);if(l.length){i.length&&b.element.queue("tabs",function(){s(g,i)});b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs", +function(){return false})},_getIndex:function(a){if(typeof a=="string")a=this.anchors.index(this.anchors.filter("[href$="+a+"]"));return a},destroy:function(){var a=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href= +e;var b=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){b.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});a.cookie&&this._cookie(null,a.cookie);return this},add:function(a,e,b){if(b===p)b=this.anchors.length; +var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,a).replace(/#\{label\}/g,e));a=!a.indexOf("#")?a.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=d("#"+a);j.length||(j=d(h.panelTemplate).attr("id",a).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(b>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[b]); +j.insertBefore(this.panels[b])}h.disabled=d.map(h.disabled,function(k){return k>=b?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[b],this.panels[b]));return this},remove:function(a){a=this._getIndex(a);var e=this.options,b=this.lis.eq(a).remove(),c=this.panels.eq(a).remove(); +if(b.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(a+(a+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=a}),function(h){return h>=a?--h:h});this._tabify();this._trigger("remove",null,this._ui(b.find("a")[0],c[0]));return this},enable:function(a){a=this._getIndex(a);var e=this.options;if(d.inArray(a,e.disabled)!=-1){this.lis.eq(a).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(b){return b!=a});this._trigger("enable",null, +this._ui(this.anchors[a],this.panels[a]));return this}},disable:function(a){a=this._getIndex(a);var e=this.options;if(a!=e.selected){this.lis.eq(a).addClass("ui-state-disabled");e.disabled.push(a);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))}return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this}, +load:function(a){a=this._getIndex(a);var e=this,b=this.options,c=this.anchors.eq(a)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(a).addClass("ui-state-processing");if(b.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(b.spinner)}this.xhr=d.ajax(d.extend({},b.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(c.hash)).html(k);e._cleanup();b.cache&&d.data(c,"cache.tabs", +true);e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.error(k,n,a,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(a, +e){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.5"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(a,e){var b=this,c=this.options,h=b._rotate||(b._rotate=function(j){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var k=c.selected;b.select(++k<b.anchors.length?k:0)},a);j&&j.stopPropagation()});e=b._unrotate||(b._unrotate=!e?function(j){j.clientX&&b.rotate(null)}: +function(){t=c.selected;h()});if(a){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(b.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery); + diff --git a/js/jquery/ajaxfileupload.js b/js/jquery/ajaxfileupload.js new file mode 100644 index 000000000..edff89456 --- /dev/null +++ b/js/jquery/ajaxfileupload.js @@ -0,0 +1,53 @@ +/* + * this file come from: + * http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ + * v 1.0 + */ + +jQuery.extend({createUploadIframe:function(id,uri) +{var frameId='jUploadFrame'+id;if(window.ActiveXObject){var io=document.createElement('<iframe id="'+frameId+'" name="'+frameId+'" />');if(typeof uri=='boolean'){io.src='javascript:false';} +else if(typeof uri=='string'){io.src=uri;}} +else{var io=document.createElement('iframe');io.id=frameId;io.name=frameId;} +io.style.position='absolute';io.style.top='-1000px';io.style.left='-1000px';document.body.appendChild(io);return io},createUploadForm:function(id,fileElementId) +{var formId='jUploadForm'+id;var fileId='jUploadFile'+id;var form=$('<form action="" method="POST" name="'+formId+'" id="'+formId+'" enctype="multipart/form-data"></form>');var oldElement=$('#'+fileElementId);var newElement=$(oldElement).clone();$(oldElement).attr('id',fileId);$(oldElement).before(newElement);$(oldElement).appendTo(form);$(form).css('position','absolute');$(form).css('top','-1200px');$(form).css('left','-1200px');$(form).appendTo('body');return form;},ajaxFileUpload:function(s){s=jQuery.extend({},jQuery.ajaxSettings,s);var id=new Date().getTime() +var form=jQuery.createUploadForm(id,s.fileElementId);var io=jQuery.createUploadIframe(id,s.secureuri);var frameId='jUploadFrame'+id;var formId='jUploadForm'+id;if(s.global&&!jQuery.active++) +{jQuery.event.trigger("ajaxStart");} +var requestDone=false;var xml={} +if(s.global) +jQuery.event.trigger("ajaxSend",[xml,s]);var uploadCallback=function(isTimeout) +{var io=document.getElementById(frameId);try +{if(io.contentWindow) +{xml.responseText=io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;xml.responseXML=io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;}else if(io.contentDocument) +{xml.responseText=io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;xml.responseXML=io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;}}catch(e) +{jQuery.handleError(s,xml,null,e);} +if(xml||isTimeout=="timeout") +{requestDone=true;var status;try{status=isTimeout!="timeout"?"success":"error";if(status!="error") +{var data=jQuery.uploadHttpData(xml,s.dataType);if(s.success) +s.success(data,status);if(s.global) +jQuery.event.trigger("ajaxSuccess",[xml,s]);}else +jQuery.handleError(s,xml,status);}catch(e) +{status="error";jQuery.handleError(s,xml,status,e);} +if(s.global) +jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active) +jQuery.event.trigger("ajaxStop");if(s.complete) +s.complete(xml,status);jQuery(io).unbind() +setTimeout(function() +{try +{$(io).remove();$(form).remove();}catch(e) +{jQuery.handleError(s,xml,null,e);}},100) +xml=null}} +if(s.timeout>0) +{setTimeout(function(){if(!requestDone)uploadCallback("timeout");},s.timeout);} +try +{var form=$('#'+formId);$(form).attr('action',s.url);$(form).attr('method','POST');$(form).attr('target',frameId);if(form.encoding) +{form.encoding='multipart/form-data';} +else +{form.enctype='multipart/form-data';} +$(form).submit();}catch(e) +{jQuery.handleError(s,xml,null,e);} +if(window.attachEvent){document.getElementById(frameId).attachEvent('onload',uploadCallback);} +else{document.getElementById(frameId).addEventListener('load',uploadCallback,false);} +return{abort:function(){}};},uploadHttpData:function(r,type){var data=!type;data=type=="xml"||data?r.responseXML:r.responseText;if(type=="script") +jQuery.globalEval(data);if(type=="json") +eval("data = "+data);if(type=="html") +jQuery("<div>").html(data).evalScripts();return data;}}) diff --git a/js/jquery/datepicker/000000.png b/js/jquery/datepicker/000000.png new file mode 100644 index 0000000000000000000000000000000000000000..abdc01082bf3534eafecc5819d28c9574d44ea89 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQY-ImG zFPf9b{J;c_6SHRK%WcbN_hZpM=(Ry;4Rxv2@@2Y=$K57eF$X$=!PC{xWt~$(69B)$ BI)4BF literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/666666.png b/js/jquery/datepicker/666666.png new file mode 100644 index 0000000000000000000000000000000000000000..889ebac732ce70ed78543fceb9207f04c9f8129f GIT binary patch literal 395 zcmV;60d)R}P)<h;3K|Lk000e1NJLTq001Ze003kN1^@s6^ki~+0003}Nkl<ZXo2mQ z(W-+m5C!M@1AeU^?icjFR7le#yUDh=lrxVa!%@&Mf5&k=s5sBFzVybv@8&(9@NJ)z zwTSv&24))v#lVc?;5jhsIDjqlIB0w%5!p8$b~y0vaWHs;8OA|pV3u*v7?^1sR0Fe( zgJNLDaqt|NbsWH!c^o)?)HAYgJgjTroyVa$@b0sEIPmUqFc_F&9CQX|83$?-HOZXp zLQS$NQ<FqxBh(}wSqnAEjI2aWvLXXDNlfNNP12KDs7WkY4>gHbR--1Fm0hSwR%L3E zsBDCq#3O5=CYh0ys7Y32peBjQyr@ZfG7B|{CF`Lk@ycq{B(t&$HOZ<>O%j!jP?LCM zEz~44vJy4PiVV~wF_{-NNl#{>Cb48a)FfV6jhbXucA+L&m8nUhvJq+$kF157WJXq^ pCRveznj|Lkq9*CdEPk>{{sCa@TST=rdf@;7002ovPDHLkV1m`1sDc0h literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/b81900.png b/js/jquery/datepicker/b81900.png new file mode 100644 index 0000000000000000000000000000000000000000..0599bdd9cd8c4eee2d325ec7db4e6a5c9fb45274 GIT binary patch literal 403 zcmV;E0c`$>P)<h;3K|Lk000e1NJLTq001Ze003kN1^@s6^ki~+00046Nkl<ZXo2mQ zL5jmL5Ckhe<OfTBk^i6eKTCeFm*f(IRx4>nngkD_>u5~THrS$0-`C5Xir?E$ed!<P zuZwxlD}384Wi6t<KLfLkgJNLDaqt|NbsWH!c^ou8l8Edb4?7%q^f(y2!3^V|Gce0I zXbj9W4yu9K#z8SK<2ZN@%sLKW%RCMoKk6CTJ08|G@W|uP9C-9uJsf!SI2a7fFb+Bc zvy1~ZiJD|iwxcFlm8nUhvJq+$kF157WJXq^CRveznj|Lkq9*CdEYu{HtcRM!E2~kH z%*uAuB&#wtNmMpMP2!QYP?OBaO4KAPGEkGmWM0%HJ(-1?#FF(;lXzt{YLZ#mj+$gu zrY4EXMyN?VvKDHR8Ci*%WJLyQl9<eknxrSQP?K1)9%>S=tVT^TE89_%tjg3RQP~JJ xiAUB#O)?`ZQIo95Kur>pc~O(}WELOUBoD^|TIj%2`=I~;002ovPDHLkV1l@ws|Wx9 literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/datepicker.css b/js/jquery/datepicker/datepicker.css new file mode 100644 index 000000000..98652379f --- /dev/null +++ b/js/jquery/datepicker/datepicker.css @@ -0,0 +1,875 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://themeroller.com/?ctl=themeroller&tr=&ffDefault=Trebuchet+MS,+Tahoma,+Verdana,+Arial,+sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px +*/ + +.ui-widget { +font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; +font-size:1.1em; +} +.ui-widget-header { +background:#F6A828 url(f6a828.png) repeat-x scroll 50% 50%; +border:1px solid #E78F08; +color:#FFFFFF; +font-weight:bold; +} +.ui-widget-header a { +color:#FFFFFF; +} +.ui-widget-content { +background:#EEEEEE url(eeeeee.png) repeat-x scroll 50% 0; +border:1px solid #DDDDDD; +color:#333333; +display:none; +} +.ui-widget-content a { +color:#488c40; +text-decoration: underline; +} +.ui-state-default, .ui-widget-content .ui-state-default { +background:#F6F6F6 url(f6f6f6.png) repeat-x scroll 50% 50%; +border:1px solid #CCCCCC; +color:#812143; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +} +.ui-state-default a { +color:#812143; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +text-decoration:none; +} +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { +background:#F6F6F6 url(f6f6f6.png) repeat-x scroll 50% 50%; +border:1px solid #CCCCCC; +color:#812143; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +} +.ui-state-hover a { +color:#812143; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +text-decoration:none; +} +.ui-state-active, .ui-widget-content .ui-state-active { +background:#F6F6F6 url(f6f6f6.png) repeat-x scroll 50% 50%; +border:1px solid #CCCCCC; +color:#812143; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +} +.ui-state-active a { +color:#812143; +outline-color:-moz-use-text-color; +outline-style:none; +outline-width:medium; +text-decoration:none; +} +.ui-state-highlight, .ui-widget-content .ui-state-highlight { +background:#FFE45C url(ffe45c.png) repeat-x scroll 50% 0; +border:1px solid #FED22F; +color:#363636; +} +.ui-state-error, .ui-widget-content .ui-state-error { +background:#B81900 url(b81900.png) repeat scroll 50% 50%; +border:1px solid #CD0A0A; +color:#FFFFFF; +} +.ui-state-error-text, .ui-widget-content .ui-state-error-text { +color:#FFFFFF; +} +.ui-state-disabled, .ui-widget-content .ui-state-disabled { +background-image:none; +opacity:0.35; +} +.ui-priority-primary, .ui-widget-content .ui-priority-primary { +font-weight:bold; +} +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { +font-weight:normal; +opacity:0.7; +} +.ui-icon { +background-image:url(222222.png); +height:16px; +width:16px; +} +.ui-widget-content .ui-icon { +background-image:url(icons222222.png); +} +.ui-widget-header .ui-icon { +background-image:url(iconsffffff.png); +} +.ui-state-default .ui-icon { +background-image:url(iconsef8c08.png); +} +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { +background-image:url(iconsef8c08.png); +} +.ui-state-active .ui-icon { +background-image: url("../../../img/admin/less.png"); +background-repeat: no-repeat; +} +.ui-state-highlight .ui-icon { +background-image:url(icons228ef1.png); +} +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { +background-image:url(iconsffd27a.png); +} +.ui-icon-carat-1-n { +background-position:0 0; +} +.ui-icon-carat-1-ne { +background-position:-16px 0; +} +.ui-icon-carat-1-e { +background-position:-32px 0; +} +.ui-icon-carat-1-se { +background-position:-48px 0; +} +.ui-icon-carat-1-s { +background-position:-64px 0; +} +.ui-icon-carat-1-sw { +background-position:-80px 0; +} +.ui-icon-carat-1-w { +background-position:-96px 0; +} +.ui-icon-carat-1-nw { +background-position:-112px 0; +} +.ui-icon-carat-2-n-s { +background-position:-128px 0; +} +.ui-icon-carat-2-e-w { +background-position:-144px 0; +} +.ui-icon-triangle-1-n { +background-position:0 -16px; +} +.ui-icon-triangle-1-ne { +background-position:-16px -16px; +} +.ui-icon-triangle-1-e { +background-position:-32px -16px; +} +.ui-icon-triangle-1-se { +background-position:-48px -16px; +} +.ui-icon-triangle-1-s { +background-image: url('../../../img/admin/more.png'); +} +.ui-state-default .ui-icon-triangle-1-e +{ +background-image: url('../../../img/admin/more.png'); +background-position: 3px 4px; +background-repeat: no-repeat; +} +.ui-state-default .ui-icon-triangle-1-s +{ +background-image: url('../../../img/admin/less.png'); +background-position: 0px 4px; +background-repeat: no-repeat; +} +.ui-icon-triangle-1-sw { +background-position:-80px -16px; +} +.ui-icon-triangle-1-w { +background-position:-96px -16px; +} +.ui-icon-triangle-1-nw { +background-position:-112px -16px; +} +.ui-icon-triangle-2-n-s { +background-position:-128px -16px; +} +.ui-icon-triangle-2-e-w { +background-position:-144px -16px; +} +.ui-icon-arrow-1-n { +background-position:0 -32px; +} +.ui-icon-arrow-1-ne { +background-position:-16px -32px; +} +.ui-icon-arrow-1-e { +background-position:-32px -32px; +} +.ui-icon-arrow-1-se { +background-position:-48px -32px; +} +.ui-icon-arrow-1-s { +background-position:-64px -32px; +} +.ui-icon-arrow-1-sw { +background-position:-80px -32px; +} +.ui-icon-arrow-1-w { +background-position:-96px -32px; +} +.ui-icon-arrow-1-nw { +background-position:-112px -32px; +} +.ui-icon-arrow-2-n-s { +background-position:-128px -32px; +} +.ui-icon-arrow-2-ne-sw { +background-position:-144px -32px; +} +.ui-icon-arrow-2-e-w { +background-position:-160px -32px; +} +.ui-icon-arrow-2-se-nw { +background-position:-176px -32px; +} +.ui-icon-arrowstop-1-n { +background-position:-192px -32px; +} +.ui-icon-arrowstop-1-e { +background-position:-208px -32px; +} +.ui-icon-arrowstop-1-s { +background-position:-224px -32px; +} +.ui-icon-arrowstop-1-w { +background-position:-240px -32px; +} +.ui-icon-arrowthick-1-n { +background-position:0 -48px; +} +.ui-icon-arrowthick-1-ne { +background-position:-16px -48px; +} +.ui-icon-arrowthick-1-e { +background-position:-32px -48px; +} +.ui-icon-arrowthick-1-se { +background-position:-48px -48px; +} +.ui-icon-arrowthick-1-s { +background-position:-64px -48px; +} +.ui-icon-arrowthick-1-sw { +background-position:-80px -48px; +} +.ui-icon-arrowthick-1-w { +background-position:-96px -48px; +} +.ui-icon-arrowthick-1-nw { +background-position:-112px -48px; +} +.ui-icon-arrowthick-2-n-s { +background-position:-128px -48px; +} +.ui-icon-arrowthick-2-ne-sw { +background-position:-144px -48px; +} +.ui-icon-arrowthick-2-e-w { +background-position:-160px -48px; +} +.ui-icon-arrowthick-2-se-nw { +background-position:-176px -48px; +} +.ui-icon-arrowthickstop-1-n { +background-position:-192px -48px; +} +.ui-icon-arrowthickstop-1-e { +background-position:-208px -48px; +} +.ui-icon-arrowthickstop-1-s { +background-position:-224px -48px; +} +.ui-icon-arrowthickstop-1-w { +background-position:-240px -48px; +} +.ui-icon-arrowreturnthick-1-w { +background-position:0 -64px; +} +.ui-icon-arrowreturnthick-1-n { +background-position:-16px -64px; +} +.ui-icon-arrowreturnthick-1-e { +background-position:-32px -64px; +} +.ui-icon-arrowreturnthick-1-s { +background-position:-48px -64px; +} +.ui-icon-arrowreturn-1-w { +background-position:-64px -64px; +} +.ui-icon-arrowreturn-1-n { +background-position:-80px -64px; +} +.ui-icon-arrowreturn-1-e { +background-position:-96px -64px; +} +.ui-icon-arrowreturn-1-s { +background-position:-112px -64px; +} +.ui-icon-arrowrefresh-1-w { +background-position:-128px -64px; +} +.ui-icon-arrowrefresh-1-n { +background-position:-144px -64px; +} +.ui-icon-arrowrefresh-1-e { +background-position:-160px -64px; +} +.ui-icon-arrowrefresh-1-s { +background-position:-176px -64px; +} +.ui-icon-arrow-4 { +background-position:0 -80px; +} +.ui-icon-arrow-4-diag { +background-position:-16px -80px; +} +.ui-icon-extlink { +background-position:-32px -80px; +} +.ui-icon-newwin { +background-position:-48px -80px; +} +.ui-icon-refresh { +background-position:-64px -80px; +} +.ui-icon-shuffle { +background-position:-80px -80px; +} +.ui-icon-transfer-e-w { +background-position:-96px -80px; +} +.ui-icon-transferthick-e-w { +background-position:-112px -80px; +} +.ui-icon-folder-collapsed { +background-position:0 -96px; +} +.ui-icon-folder-open { +background-position:-16px -96px; +} +.ui-icon-document { +background-position:-32px -96px; +} +.ui-icon-document-b { +background-position:-48px -96px; +} +.ui-icon-note { +background-position:-64px -96px; +} +.ui-icon-mail-closed { +background-position:-80px -96px; +} +.ui-icon-mail-open { +background-position:-96px -96px; +} +.ui-icon-suitcase { +background-position:-112px -96px; +} +.ui-icon-comment { +background-position:-128px -96px; +} +.ui-icon-person { +background-position:-144px -96px; +} +.ui-icon-print { +background-position:-160px -96px; +} +.ui-icon-trash { +background-position:-176px -96px; +} +.ui-icon-locked { +background-position:-192px -96px; +} +.ui-icon-unlocked { +background-position:-208px -96px; +} +.ui-icon-bookmark { +background-position:-224px -96px; +} +.ui-icon-tag { +background-position:-240px -96px; +} +.ui-icon-home { +background-position:0 -112px; +} +.ui-icon-flag { +background-position:-16px -112px; +} +.ui-icon-calendar { +background-position:-32px -112px; +} +.ui-icon-cart { +background-position:-48px -112px; +} +.ui-icon-pencil { +background-position:-64px -112px; +} +.ui-icon-clock { +background-position:-80px -112px; +} +.ui-icon-disk { +background-position:-96px -112px; +} +.ui-icon-calculator { +background-position:-112px -112px; +} +.ui-icon-zoomin { +background-position:-128px -112px; +} +.ui-icon-zoomout { +background-position:-144px -112px; +} +.ui-icon-search { +background-position:-160px -112px; +} +.ui-icon-wrench { +background-position:-176px -112px; +} +.ui-icon-gear { +background-position:-192px -112px; +} +.ui-icon-heart { +background-position:-208px -112px; +} +.ui-icon-star { +background-position:-224px -112px; +} +.ui-icon-link { +background-position:-240px -112px; +} +.ui-icon-cancel { +background-position:0 -128px; +} +.ui-icon-plus { +background-position:-16px -128px; +} +.ui-icon-plusthick { +background-position:-32px -128px; +} +.ui-icon-minus { +background-position:-48px -128px; +} +.ui-icon-minusthick { +background-position:-64px -128px; +} +.ui-icon-close { +background-position:-80px -128px; +} +.ui-icon-closethick { +background-position:-96px -128px; +} +.ui-icon-key { +background-position:-112px -128px; +} +.ui-icon-lightbulb { +background-position:-128px -128px; +} +.ui-icon-scissors { +background-position:-144px -128px; +} +.ui-icon-clipboard { +background-position:-160px -128px; +} +.ui-icon-copy { +background-position:-176px -128px; +} +.ui-icon-contact { +background-position:-192px -128px; +} +.ui-icon-image { +background-position:-208px -128px; +} +.ui-icon-video { +background-position:-224px -128px; +} +.ui-icon-alert { +background-position:0 -144px; +} +.ui-icon-info { +background-position:-16px -144px; +} +.ui-icon-notice { +background-position:-32px -144px; +} +.ui-icon-help { +background-position:-48px -144px; +} +.ui-icon-check { +background-position:-64px -144px; +} +.ui-icon-bullet { +background-position:-80px -144px; +} +.ui-icon-radio-off { +background-position:-96px -144px; +} +.ui-icon-radio-on { +background-position:-112px -144px; +} +.ui-icon-play { +background-position:0 -160px; +} +.ui-icon-pause { +background-position:-16px -160px; +} +.ui-icon-seek-next { +background-position:-32px -160px; +} +.ui-icon-seek-prev { +background-position:-48px -160px; +} +.ui-icon-seek-end { +background-position:-64px -160px; +} +.ui-icon-seek-first { +background-position:-80px -160px; +} +.ui-icon-stop { +background-position:-96px -160px; +} +.ui-icon-eject { +background-position:-112px -160px; +} +.ui-icon-volume-off { +background-position:-128px -160px; +} +.ui-icon-volume-on { +background-position:-144px -160px; +} +.ui-icon-power { +background-position:0 -176px; +} +.ui-icon-signal-diag { +background-position:-16px -176px; +} +.ui-icon-signal { +background-position:-32px -176px; +} +.ui-icon-battery-0 { +background-position:-48px -176px; +} +.ui-icon-battery-1 { +background-position:-64px -176px; +} +.ui-icon-battery-2 { +background-position:-80px -176px; +} +.ui-icon-battery-3 { +background-position:-96px -176px; +} +.ui-icon-circle-plus { +background-position:0 -192px; +} +.ui-icon-circle-minus { +background-position:-16px -192px; +} +.ui-icon-circle-close { +background-position:-32px -192px; +} +.ui-icon-circle-triangle-e { +background-position:-48px -192px; +} +.ui-icon-circle-triangle-s { +background-position:-64px -192px; +} +.ui-icon-circle-triangle-w { +background-position:-80px -192px; +} +.ui-icon-circle-triangle-n { +background-position:-96px -192px; +} +.ui-icon-circle-arrow-e { +background-position:-112px -192px; +} +.ui-icon-circle-arrow-s { +background-position:-128px -192px; +} +.ui-icon-circle-arrow-w { +background-position:-144px -192px; +} +.ui-icon-circle-arrow-n { +background-position:-160px -192px; +} +.ui-icon-circle-zoomin { +background-position:-176px -192px; +} +.ui-icon-circle-zoomout { +background-position:-192px -192px; +} +.ui-icon-circle-check { +background-position:-208px -192px; +} +.ui-icon-circlesmall-plus { +background-position:0 -208px; +} +.ui-icon-circlesmall-minus { +background-position:-16px -208px; +} +.ui-icon-circlesmall-close { +background-position:-32px -208px; +} +.ui-icon-squaresmall-plus { +background-position:-48px -208px; +} +.ui-icon-squaresmall-minus { +background-position:-64px -208px; +} +.ui-icon-squaresmall-close { +background-position:-80px -208px; +} +.ui-icon-grip-dotted-vertical { +background-position:0 -224px; +} +.ui-icon-grip-dotted-horizontal { +background-position:-16px -224px; +} +.ui-icon-grip-solid-vertical { +background-position:-32px -224px; +} +.ui-icon-grip-solid-horizontal { +background-position:-48px -224px; +} +.ui-icon-gripsmall-diagonal-se { +background-position:-64px -224px; +} +.ui-icon-grip-diagonal-se { +background-position:-80px -224px; +} +.ui-corner-tl { +-moz-border-radius-topleft:4px; +} +.ui-corner-tr { +-moz-border-radius-topright:4px; +} +.ui-corner-bl { +-moz-border-radius-bottomleft:4px; +} +.ui-corner-br { +-moz-border-radius-bottomright:4px; +} +.ui-corner-top { +-moz-border-radius-topleft:4px; +-moz-border-radius-topright:4px; +} +.ui-corner-bottom { +-moz-border-radius-bottomleft:4px; +-moz-border-radius-bottomright:4px; +} +.ui-corner-right { +-moz-border-radius-bottomright:4px; +-moz-border-radius-topright:4px; +} +.ui-corner-left { +-moz-border-radius-bottomleft:4px; +-moz-border-radius-topleft:4px; +} +.ui-corner-all { +-moz-border-radius-bottomleft:4px; +-moz-border-radius-bottomright:4px; +-moz-border-radius-topleft:4px; +-moz-border-radius-topright:4px; +} +.ui-widget-overlay { +background:#666666 url(666666.png) repeat scroll 50% 50%; +opacity:0.5; +} +.ui-widget-shadow { +-moz-border-radius-bottomleft:5px; +-moz-border-radius-bottomright:5px; +-moz-border-radius-topleft:5px; +-moz-border-radius-topright:5px; +background:#000000 url(000000.png) repeat-x scroll 50% 50%; +margin:-5px 0 0 -5px; +opacity:0.2; +padding:5px; +} + +.ui-datepicker { +padding:0.2em 0.2em 0; +width:17em; +z-index:99; +} +.ui-datepicker-header { +padding:0.2em 0; +position:relative; +} +.ui-datepicker-prev, .ui-datepicker-next { +height:1.8em; +position:absolute; +top:2px; +width:1.8em; +} +.ui-datepicker-prev:hover, .ui-datepicker-next:hover { +top:1px; +} +.ui-datepicker-prev { +left:2px; +} +.ui-datepicker-next { +right:2px; +} +.ui-datepicker-prev:hover { +left:1px; +} +.ui-datepicker-next:hover { +right:1px; +} +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { +display:block; +left:50%; +margin-left:-8px; +margin-top:-8px; +position:absolute; +top:50%; +} +.ui-datepicker-title { +line-height:1.8em; +margin:0 2.3em; +text-align:center; +} +.ui-datepicker-title select { +float:left; +font-size:1em; +margin:1px 0; +} +.ui-datepicker select.ui-datepicker-month-year { +width:100%; +} +.ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { +width:49%; +} +.ui-datepicker-title select.ui-datepicker-year { +float:right; +} +.ui-datepicker table { +border-collapse:collapse; +font-size:0.9em; +margin:0 0 0.4em; +width:100%; +} +.ui-datepicker th { +font-weight:bold; +padding:0.7em 0.3em; +text-align:center; +} +.ui-datepicker td span, .ui-datepicker td a { +display:block; +padding:0.2em; +text-align:right; +text-decoration:none; +} +.ui-datepicker-buttonpane { +background-image:none; +border-bottom:0 none; +border-left:0 none; +border-right:0 none; +margin:0.7em 0 0; +padding:0 0.2em; +} +.ui-datepicker-buttonpane button { +cursor:pointer; +float:right; +margin:0.5em 0.2em 0.4em; +overflow:visible; +padding:0.2em 0.6em 0.3em; +width:auto; +} +.ui-datepicker-buttonpane button.ui-datepicker-current { +float:left; +} +.ui-datepicker.ui-datepicker-multi { +width:auto; +} +.ui-datepicker-multi .ui-datepicker-group { +float:left; +} +.ui-datepicker-multi .ui-datepicker-group table { +margin:0 auto 0.4em; +width:95%; +} +.ui-datepicker-multi-2 .ui-datepicker-group { +width:50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { +width:33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { +width:25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { +border-left-width:0; +} +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { +border-left-width:0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { +clear:left; +} +.ui-datepicker-rtl { +direction:rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { +left:auto; +right:2px; +} +.ui-datepicker-rtl .ui-datepicker-next { +left:2px; +right:auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { +left:auto; +right:1px; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { +left:1px; +right:auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { +clear:right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { +float:left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { +float:right; +} +.ui-datepicker-rtl .ui-datepicker-group { +float:right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { +border-left-width:1px; +border-right-width:0; +} +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { +border-left-width:1px; +border-right-width:0; +} +.ui-datepicker-cover { +display:block; +height:200px; +left:-4px; +position:absolute; +top:-4px; +width:200px; +z-index:-1; +} +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative;zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .2em ; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: 5px; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { border-top: 0; margin-top: -2px; position: relative;overflow: auto; display: none; } +.ui-accordion .ui-accordion-content-active { display: block; } diff --git a/js/jquery/datepicker/eeeeee.png b/js/jquery/datepicker/eeeeee.png new file mode 100644 index 0000000000000000000000000000000000000000..98f298b90503d4b1eebad416af56c3c6f4c911b1 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsR^Dgjv*P1Z*OcAY%t(qaZGrz zKQ4V43%mG&gzZhU!<SXB-MaqZy#366EMZLAjZ+VJC8%x?ir`#>!F_*kar~9f;xh6t zj!b3M<_;5EqZ1LiVN-&s-Gxpd7r$n>>@SA<1xic%w4dz&x{blp)z4*}Q$iB}p;<-K literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/f6a828.png b/js/jquery/datepicker/f6a828.png new file mode 100644 index 0000000000000000000000000000000000000000..39d5824d6af5456f1e89fc7847ea3599ea5fd815 GIT binary patch literal 3762 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 literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/f6f6f6.png b/js/jquery/datepicker/f6f6f6.png new file mode 100644 index 0000000000000000000000000000000000000000..98a8244875a37f1e59c4d7745db5b210c92de87c GIT binary patch literal 895 zcmV-_1AzRAP)<h;3K|Lk000e1NJLTq00031001Kh1^@s6RdHan0008+X+uL$Nkc;* zP;zf(X>4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aI<?kYqDS z)^0ZI?k2URh~(nYD&9ryp$Gqf9(wR(FG_`4MJV2@C}N=(E%D86Otz)!z|Ma2-Z$@k zZ+71R4RX>n^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8<Tr7btG!LbYeuYL3=jbJ-1P$-8}v%B5{;M zwFr{@LH;VQ$xr2Z`O93e*jD$Ht(%&<^58qg<(at}9@o>z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD<oAl_pC|$^ zY~aY5x@}W&?+~G7rEYVs0vEs0eekw!YomTR`~+A$s}`+NHJ>270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo<vzb+5>2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_001{hL_t&t z9b<U%<jH>~1|VSi|NlRB0=Fy!PzMl0wf+0|56WTyNdS$*Fb}K*w|O8JV3UQ50RW0Q VRGDKMj5q)Q002ovPDHLkV1iKFp{W1> literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/fdf5ce.png b/js/jquery/datepicker/fdf5ce.png new file mode 100644 index 0000000000000000000000000000000000000000..744f92551d0ae396487adcafde8f048c66fd5508 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsZE|Pjv*P1Z?7KYJ#4^pG(hv> zKkKpv9svc{-Hp``4(?~LJlLFa@bA9(`CRXA@cx+UFpDI3>q_xkGo9J1?&U^&V?S`N zu5EIidT{MKGo9k5Ei1j)pT!scV!7PE<a4+T|CxW?n~#SxRWfDbhw&d<*iLwF`Q8C^ OJ%gvKpUXO@geCyE2wLp` literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/ffe45c.png b/js/jquery/datepicker/ffe45c.png new file mode 100644 index 0000000000000000000000000000000000000000..55840b3515fc1e0c5e0e410a23baf19eb120bb11 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsRN!ajv*P1Z?7NZJ#4^pG+^b2 zf6*oT`7VUqJz)9afqcW92acPVmp}hJkLz8jRKawISp?v%SwH8Q<wTqAzucC)T3g1V zcrK84_u&Dr{VE@|`{pNvT3ry`Ja5CJf`sM%7v3xA{GU|Py58a+kKKcVQgv+FwN15A k1;KynHxjT0=8RkNCGxr^uWvAX0{Vr))78&qol`;+0Pj_4CjbBd literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/ffffff.png b/js/jquery/datepicker/ffffff.png new file mode 100644 index 0000000000000000000000000000000000000000..2c16183ff13c2403253ee1e26cd7312bd866fc45 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscD`rjv*P1Z*OfBJYvAXaPWHn zZ~e$3_OgOT&NA&CjSVeZzuWCU_%EJ)k6;An8kR67?Z&AGyb@G52;t@Kx)v30ZnNv0 x<X^#rqc?wWa)Gq2{@D1~f39~BA#;wg-?KO5IwybEH38^C22WQ%mvv4FO#lPkNdo`? literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/icons222222.png b/js/jquery/datepicker/icons222222.png new file mode 100644 index 0000000000000000000000000000000000000000..71580d12948b490ce73c10b637941ebee962e8e9 GIT binary patch literal 10566 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 ATmS$7 literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/icons228ef1.png b/js/jquery/datepicker/icons228ef1.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8f19b0b58440060040e949ef560128693272bf GIT binary patch literal 10653 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 literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/iconsef8c08.png b/js/jquery/datepicker/iconsef8c08.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbde060484edac9c446d2797758fe1cc1d8db52 GIT binary patch literal 10636 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 S_4GetOI=MPjRrM`*Z&J(?eCEQ literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/iconsffd27a.png b/js/jquery/datepicker/iconsffd27a.png new file mode 100644 index 0000000000000000000000000000000000000000..d630afa4de0ba01b6b3386bd75ad044b1b4c9976 GIT binary patch literal 10662 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 Gz5hR`-3^KW literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/iconsffffff.png b/js/jquery/datepicker/iconsffffff.png new file mode 100644 index 0000000000000000000000000000000000000000..49a1ef08d5d440617c1fb755c4d9e5744718ba70 GIT binary patch literal 10356 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 literal 0 HcmV?d00001 diff --git a/js/jquery/datepicker/index.php b/js/jquery/datepicker/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/js/jquery/datepicker/index.php @@ -0,0 +1,11 @@ +<?php + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/jquery/datepicker/jquery-ui-personalized-1.6rc4.packed.js b/js/jquery/datepicker/jquery-ui-personalized-1.6rc4.packed.js new file mode 100644 index 000000000..cbe134cc4 --- /dev/null +++ b/js/jquery/datepicker/jquery-ui-personalized-1.6rc4.packed.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(l(B){f H=B.4f.3q,D=B.1G.9t&&(9a(B.1G.3I)<1.9);B.r={3I:"1.6f",9E:{4H:l(K,J,N){f M=B.r[K].3R;1E(f L 7l N){M.59[L]=M.59[L]||[];M.59[L].9B([J,N[L]])}},4s:l(J,L,K){f N=J.59[L];h(!N){p}1E(f M=0;M<N.1r;M++){h(J.1D[N[M][0]]){N[M][1].21(J.2A,K)}}}},6k:l(L,K){f J=B.1G.5Z&&B.1G.3I<9D;h(L.6k&&!J){p L.6k(K)}h(L.8H){p!!(L.8H(K)&16)}3k(K=K.7D){h(K==L){p 1m}}p S},54:{},1o:l(J){h(B.r.54[J]){p B.r.54[J]}f K=B(\'<1J 1j="r-9A">\').2N(J).1o({1K:"3H",2p:"-8I",1Z:"-8I",6t:"97"}).9w("2g");B.r.54[J]=!!((!(/6h|2G/).1P(K.1o("6M"))||(/^[1-9]/).1P(K.1o("31"))||(/^[1-9]/).1P(K.1o("25"))||!(/6Q/).1P(K.1o("9x"))||!(/9P|9M\\(0, 0, 0, 0\\)/).1P(K.1o("9f"))));5c{B("2g").6l(0).9g(K.6l(0))}5g(L){}p B.r.54[J]},9h:l(L,J){h(B(L).1o("3W")=="3v"){p S}f M=(J&&J=="1Z")?"3U":"3T",K=S;h(L[M]>0){p 1m}L[M]=1;K=(L[M]>0);L[M]=0;p K},6j:l(J,L,K){p(J>L)&&(J<(L+K))},9c:l(O,J,N,M,L,K){p B.r.6j(O,N,L)&&B.r.6j(J,M,K)},5J:{9o:8,9p:20,9j:9d,9y:17,au:46,as:40,av:35,aw:13,ax:27,ar:36,aq:45,am:37,al:9S,ao:ap,ay:aH,aI:aJ,aK:aG,aB:aA,aC:34,aD:33,aj:a2,9Y:39,9U:16,9W:32,9X:9,a5:38}};h(D){f E=B.2M,C=B.4f.6m,I="af://ac.a7.ab/an/aa/6i",F=/^6n-/,G=/^7F:/;B.2M=l(K,J,L){f M=L!==4d;p(J=="a9"?(M?E.4s(b,K,J,"7F:"+L):(E.21(b,3K)||"").4X(G,"")):(F.1P(J)?(M?K.a8(I,J.4X(F,"6i:"),L):E.4s(b,K,J.4X(F,"6i:"))):E.21(b,3K)))};B.4f.6m=l(J){p(F.1P(J)?b.3e(l(){b.ad(I,J.4X(F,""))}):C.4s(b,J))}}B.4f.3h({3q:l(){B("*",b).4H(b).3e(l(){B(b).80("3q")});p H.21(b,3K)},ai:l(){p b.2M("2I","ah").1o("7A","").3l("7G.r")},ae:l(){p b.2M("2I","81").1o("7A","6Q").23("7G.r",l(){p S})},a6:l(){f J;h((B.1G.44&&(/(93|7P)/).1P(b.1o("1K")))||(/3H/).1P(b.1o("1K"))){J=b.3z().68(l(){p(/(7P|3H|5M)/).1P(B.42(b,"1K",1))&&(/(6h|7N)/).1P(B.42(b,"3W",1)+B.42(b,"3W-y",1)+B.42(b,"3W-x",1))}).7w(0)}1d{J=b.3z().68(l(){p(/(6h|7N)/).1P(B.42(b,"3W",1)+B.42(b,"3W-y",1)+B.42(b,"3W-x",1))}).7w(0)}p(/5M/).1P(b.1o("1K"))||!J.1r?B(1l):J}});B.3h(B.9V[":"],{2t:l(K,L,J){p!!B.2t(K,J[3])},9T:l(K,L,J){f N=K.1q.4g();l M(O){p!(B(O).7J(":3v")||B(O).3z(":3v").1r)}p(K.9Z>=0&&(("a"==N&&K.7Y)||(/u|3u|a4|1X/.1P(N)&&"3v"!=K.2W&&!K.1u))&&M(K))}});l A(N,J,O,M){l L(Q){f P=B[N][J][Q]||[];p(1L P=="2O"?P.5j(/,?\\s+/):P)}f K=L("a3");h(M.1r==1&&1L M[0]=="2O"){K=K.6v(L("7I"))}p(B.a0(O,K)!=-1)}B.2C=l(J,K){f L=J.5j(".")[0];J=J.5j(".")[1];B.4f[J]=l(P){f N=(1L P=="2O"),O=6P.3R.8U.4s(3K,1);h(N&&P.a1(0,1)=="6u"){p b}h(N&&A(L,J,P,O)){f M=B.2t(b[0],J);p(M?M[P].21(M,O):4d)}p b.3e(l(){f Q=B.2t(b,J);(!Q&&!N&&B.2t(b,J,Z B[L][J](b,P)));(Q&&N&&B.ak(Q[P])&&Q[P].21(Q,O))})};B[L]=B[L]||{};B[L][J]=l(N,O){f M=b;b.6o=L;b.2R=J;b.6g=B[L][J].aE||J;b.6p=L+"-"+J;b.1D=B.3h({},B.2C.5z,B[L][J].5z,B.7v&&B.7v.6l(N)[J],O);b.2A=B(N).23("6H."+J,l(Q,P,R){h(Q.q==N){p M.4S(P,R)}}).23("6G."+J,l(Q,P){h(Q.q==N){p M.6q(P)}}).23("3q",l(){p M.8l()});b.8w()};B[L][J].3R=B.3h({},B.2C.3R,K);B[L][J].7I="4x"};B.2C.3R={8w:l(){},8l:l(){b.2A.7p(b.2R).2Y(b.6p+"-1u "+b.6o+"-1U-1u").6m("6n-1u")},4x:l(L,M){f K=L,J=b;h(1L L=="2O"){h(M===4d){p b.6q(L)}K={};K[L]=M}B.3e(K,l(N,O){J.4S(N,O)})},6q:l(J){p b.1D[J]},4S:l(J,K){b.1D[J]=K;h(J=="1u"){b.2A[K?"2N":"2Y"](b.6p+"-1u "+b.6o+"-1U-1u").2M("6n-1u",K)}},aL:l(){b.4S("1u",S)},9s:l(){b.4S("1u",1m)},9n:l(K,L,M){f J=(K==b.6g?K:b.6g+K);L=L||B.v.9l({2W:J,q:b.2A[0]});p b.2A.80(J,[L,M],b.1D[K])}};B.2C.5z={1u:S};B.r.8b={9q:l(){f J=b;b.2A.23("8P."+b.2R,l(K){p J.7T(K)}).23("8m."+b.2R,l(K){h(J.65){J.65=S;p S}});h(B.1G.44){b.7X=b.2A.2M("2I");b.2A.2M("2I","81")}b.9e=S},9i:l(){b.2A.3l("."+b.2R);(B.1G.44&&b.2A.2M("2I",b.7X))},7T:l(L){(b.2Q&&b.56(L));b.5w=L;f J=b,M=(L.9R==1),K=(1L b.1D.6c=="2O"?B(L.q).3z().4H(L.q).68(b.1D.6c).1r:S);h(!M||K||!b.8a(L)){p 1m}b.5W=!b.1D.6b;h(!b.5W){b.9I=9u(l(){J.5W=1m},b.1D.6b)}h(b.69(L)&&b.6a(L)){b.2Q=(b.6e(L)!==S);h(!b.2Q){L.5p();p 1m}}b.67=l(N){p J.7U(N)};b.66=l(N){p J.56(N)};B(1l).23("7V."+b.2R,b.67).23("7W."+b.2R,b.66);h(!B.1G.5Z){L.5p()}p 1m},7U:l(J){h(B.1G.44&&!J.1X){p b.56(J)}h(b.2Q){b.6d(J);p J.5p()}h(b.69(J)&&b.6a(J)){b.2Q=(b.6e(b.5w,J)!==S);(b.2Q?b.6d(J):b.56(J))}p!b.2Q},56:l(J){B(1l).3l("7V."+b.2R,b.67).3l("7W."+b.2R,b.66);h(b.2Q){b.2Q=S;b.65=1m;b.89(J)}p S},69:l(J){p(26.3g(26.82(b.5w.6J-J.6J),26.82(b.5w.6K-J.6K))>=b.1D.87)},6a:l(J){p b.5W},6e:l(J){},6d:l(J){},89:l(J){},8a:l(J){p 1m}};B.r.8b.5z={6c:z,87:1,6b:0}})(2w);(l($){$.3h($.r,{k:{3I:"1.6f"}});f 3x="k";l 4F(){b.7Z=S;b.3V=z;b.5i=S;b.2S=[];b.3A=S;b.3n=S;b.63="r-k-1J";b.5S="r-k-1I";b.6O="r-k-4p";b.3c="r-k-4c";b.5Y="r-k-9H";b.9C="r-k-1u";b.7o="r-k-2I";b.7m="r-k-7R-1e";b.5q="r-k-9z-9F-9G";b.6r=[];b.6r[""]={9N:"9O",8x:"9L",2H:"9J",9b:"&#85;&#85;",2K:"9k",9m:"&#86;&#86;",3F:"9r",1N:["ag","aY","co","cx","84","ct","cn","cb","bR","bL","bX","c6"],1Q:["c7","ca","c2","c1","84","c0","bY","bZ","c3","c4","c8","bO"],2a:["bN","bM","bK","bQ","bV","bT","bS"],2l:["cs","cr","cp","cq","cu","aM","cw"],5D:["cg","cf","ce","cc","cd","ch","ci"],3E:"5I/4h/3P",1O:0,1t:S};b.24={3G:"3t",2s:"6y",5X:{},2o:z,4Y:"",3s:"...",4e:"",8s:S,4J:S,4m:S,7f:S,3Y:S,41:S,4Z:S,8M:"-10:+10",4q:S,7e:b.5G,2k:"+10",1g:z,1n:z,1C:"cm",4V:z,4O:z,3o:z,88:z,4L:z,8o:1,5N:0,2B:1,3O:12,55:"",58:"",7x:1m,5P:S};$.3h(b.24,b.6r[""]);b.1f=$(\'<1J 1b="\'+b.63+\'" 1j="r-k r-2C r-2C-76 r-5r-6Z r-2E-2v r-5r-3v-cl"></1J>\')}$.3h(4F.3R,{2x:"ck",7a:l(){h(b.7Z){cj.7a.21("",3K)}},bI:l(V){4k(b.24,V||{});p b},7z:l(q,V){f 4C=z;1E(f 5C 7l b.24){f 5E=q.b6("n:"+5C);h(5E){4C=4C||{};5c{4C[5C]=b7(5E)}5g(7L){4C[5C]=5E}}}f 1q=q.1q.4g();f 1I=(1q=="1J"||1q=="1x");h(!q.1b){q.1b="8h"+(++b.6s)}f c=b.6F($(q),1I);c.V=$.3h({},V||{},4C||{});h(1q=="u"){b.8q(q,c)}1d{h(1I){b.8g(q,c)}}},6F:l(q,1I){f 1b=q[0].1b.4X(/([:\\[\\]\\.])/g,"\\\\\\\\$1");p{1b:1b,u:q,2d:0,1M:0,1T:0,1a:0,1c:0,1I:1I,1f:(!1I?b.1f:$(\'<1J 1j="\'+b.5S+\' r-k r-2C r-2C-76 r-5r-6Z r-2E-2v"></1J>\'))}},8q:l(q,c){f u=$(q);h(u.3j(b.2x)){p}f 4Y=b.t(c,"4Y");f 1t=b.t(c,"1t");h(4Y){u[1t?"8t":"8n"](\'<1x 1j="\'+b.6O+\'">\'+4Y+"</1x>")}f 3G=b.t(c,"3G");h(3G=="3t"||3G=="8r"){u.3t(b.4l)}h(3G=="1X"||3G=="8r"){f 3s=b.t(c,"3s");f 4e=b.t(c,"4e");f 4c=$(b.t(c,"8s")?$("<5Q/>").2N(b.3c).2M({79:4e,8v:3s,2T:3s}):$(\'<1X 2W="1X"></1X>\').2N(b.3c).1Y(4e==""?3s:$("<5Q/>").2M({79:4e,8v:3s,2T:3s})));u[1t?"8t":"8n"](4c);4c.8m(l(){h($.k.3A&&$.k.4i==q){$.k.2P()}1d{$.k.4l(q)}p S})}u.2N(b.2x).6N(b.5U).7t(b.64).23("6H.k",l(v,3r,18){c.V[3r]=18}).23("6G.k",l(v,3r){p b.t(c,3r)});$.2t(q,3x,c)},8g:l(q,c){f 6I=$(q);h(6I.3j(b.2x)){p}6I.2N(b.2x).4p(c.1f).23("6H.k",l(v,3r,18){c.V[3r]=18}).23("6G.k",l(v,3r){p b.t(c,3r)});$.2t(q,3x,c);b.6R(c,b.5F(c));b.2V(c);b.5o(c)},b2:l(u,8k,3o,V,30){f c=b.8i;h(!c){f 1b="8h"+(++b.6s);b.2J=$(\'<u 2W="b3" 1b="\'+1b+\'" 2L="1" b9="1K: 3H; 2p: -8Q;"/>\');b.2J.6N(b.5U);$("2g").4p(b.2J);c=b.8i=b.6F(b.2J,S);c.V={};$.2t(b.2J[0],3x,c)}4k(c.V,V||{});b.2J.3N(8k);b.2j=(30?(30.1r?30:[30.6J,30.6K]):z);h(!b.2j){f 5l=5f.8z||1l.2c.5d||1l.2g.5d;f 5m=5f.8A||1l.2c.5h||1l.2g.5h;f 3M=1l.2c.3U||1l.2g.3U;f 3Q=1l.2c.3T||1l.2g.3T;b.2j=[(5l/2)-3y+3M,(5m/2)-bc+3Q]}b.2J.1o("1Z",b.2j[0]+"57").1o("2p",b.2j[1]+"57");c.V.3o=3o;b.3n=1m;b.1f.2N(b.5Y);b.4l(b.2J[0]);h($.51){$.51(b.1f)}$.2t(b.2J[0],3x,c);p b},bb:l(q){f $q=$(q);h(!$q.3j(b.2x)){p}f 1q=q.1q.4g();$.7p(q,3x);h(1q=="u"){$q.4n("."+b.6O).3q().3a().4n("."+b.3c).3q().3a().2Y(b.2x).3l("3t",b.4l).3l("6N",b.5U).3l("7t",b.64)}1d{h(1q=="1J"||1q=="1x"){$q.2Y(b.2x).92()}}},b0:l(q){f $q=$(q);h(!$q.3j(b.2x)){p}f 1q=q.1q.4g();h(1q=="u"){q.1u=S;$q.4n("1X."+b.3c).3e(l(){b.1u=S}).3a().4n("5Q."+b.3c).1o({7u:"1.0",6M:""})}1d{h(1q=="1J"||1q=="1x"){f 1I=$q.5T("."+b.5S);1I.5T().2Y("r-1U-1u")}}b.2S=$.7q(b.2S,l(18){p(18==q?z:18)})},aR:l(q){f $q=$(q);h(!$q.3j(b.2x)){p}f 1q=q.1q.4g();h(1q=="u"){q.1u=1m;$q.4n("1X."+b.3c).3e(l(){b.1u=1m}).3a().4n("5Q."+b.3c).1o({7u:"0.5",6M:"2G"})}1d{h(1q=="1J"||1q=="1x"){f 1I=$q.5T("."+b.5S);1I.5T().2N("r-1U-1u")}}b.2S=$.7q(b.2S,l(18){p(18==q?z:18)});b.2S[b.2S.1r]=q},4Q:l(q){h(!q){p S}1E(f i=0;i<b.2S.1r;i++){h(b.2S[i]==q){p 1m}}p S},1S:l(q){5c{p $.2t(q,3x)}5g(7L){4u"8F aQ 2t 1E b k"}},7K:l(q,1B,18){f V=1B||{};h(1L 1B=="2O"){V={};V[1B]=18}f c=b.1S(q);h(c){h(b.3V==c){b.2P(z)}4k(c.V,V);f n=Z X();4k(c,{2D:z,48:z,4U:z,29:z,2d:n.1p(),1M:n.1v(),1T:n.1i(),1W:n.1p(),2r:n.1v(),2f:n.1i(),1a:n.1v(),1c:n.1i()});b.2V(c)}},aP:l(q,1B,18){b.7K(q,1B,18)},aN:l(q){f c=b.1S(q);h(c){b.2V(c)}},aO:l(q,n,47){f c=b.1S(q);h(c){b.6R(c,n,47);b.2V(c);b.5o(c)}},aT:l(q){f c=b.1S(q);h(c&&!c.1I){b.7c(c)}p(c?b.7h(c):z)},5U:l(v){f c=$.k.1S(v.q);f 2F=1m;f 1t=c.1f.7J(".r-k-8E");c.5i=1m;h($.k.3A){49(v.5J){T 9:$.k.2P(z,"");15;T 13:f 6E=$("3p."+$.k.5q+", 3p."+$.k.7m,c.1f);h(6E[0]){$.k.7k(v.q,c.1M,c.1T,6E[0])}1d{$.k.2P(z,$.k.t(c,"1C"))}p S;15;T 27:$.k.2P(z,$.k.t(c,"1C"));15;T 33:$.k.2e(v.q,(v.1H?-$.k.t(c,"3O"):-$.k.t(c,"2B")),"M");15;T 34:$.k.2e(v.q,(v.1H?+$.k.t(c,"3O"):+$.k.t(c,"2B")),"M");15;T 35:h(v.1H||v.2m){$.k.8K(v.q)}2F=v.1H||v.2m;15;T 36:h(v.1H||v.2m){$.k.72(v.q)}2F=v.1H||v.2m;15;T 37:h(v.1H||v.2m){$.k.2e(v.q,(1t?+1:-1),"D")}2F=v.1H||v.2m;h(v.7O.7H){$.k.2e(v.q,(v.1H?-$.k.t(c,"3O"):-$.k.t(c,"2B")),"M")}15;T 38:h(v.1H||v.2m){$.k.2e(v.q,-7,"D")}2F=v.1H||v.2m;15;T 39:h(v.1H||v.2m){$.k.2e(v.q,(1t?-1:+1),"D")}2F=v.1H||v.2m;h(v.7O.7H){$.k.2e(v.q,(v.1H?+$.k.t(c,"3O"):+$.k.t(c,"2B")),"M")}15;T 40:h(v.1H||v.2m){$.k.2e(v.q,+7,"D")}2F=v.1H||v.2m;15;2G:2F=S}}1d{h(v.5J==36&&v.1H){$.k.4l(b)}1d{2F=S}}h(2F){v.5p();v.by()}},64:l(v){f c=$.k.1S(v.q);h($.k.t(c,"7x")){f 2Z=$.k.8W($.k.t(c,"3E"));f 6w=bw.bC(v.7C==4d?v.5J:v.7C);p v.1H||(6w<" "||!2Z||2Z.bD(6w)>-1)}},4l:l(u){u=u.q||u;h(u.1q.4g()!="u"){u=$("u",u.7D)[0]}h($.k.4Q(u)||$.k.4i==u){p}f c=$.k.1S(u);f 4O=$.k.t(c,"4O");4k(c.V,(4O?4O.21(u,[u,c]):{}));$.k.2P(z,"");$.k.4i=u;$.k.7c(c);h($.k.3n){u.18=""}h(!$.k.2j){$.k.2j=$.k.6z(u);$.k.2j[1]+=u.bu}f 1V=S;$(u).3z().3e(l(){1V|=$(b).1o("1K")=="5M";p!1V});h(1V&&$.1G.6A){$.k.2j[0]-=1l.2c.3U;$.k.2j[1]-=1l.2c.3T}f 1h={1Z:$.k.2j[0],2p:$.k.2j[1]};$.k.2j=z;c.2D=z;c.1f.1o({1K:"3H",6t:"97",2p:"-bm"});$.k.2V(c);1h=$.k.8D(c,1h,1V);c.1f.1o({1K:($.k.3n&&$.51?"93":(1V?"5M":"3H")),6t:"6Q",1Z:1h.1Z+"57",2p:1h.2p+"57"});h(!c.1I){f 2s=$.k.t(c,"2s")||"6y";f 1C=$.k.t(c,"1C");f 3J=l(){$.k.3A=1m;h($.1G.44&&22($.1G.3I,10)<7){$("5e.r-k-7n").1o({25:c.1f.25()+4,31:c.1f.31()+4})}};h($.5u&&$.5u[2s]){c.1f.6y(2s,$.k.t(c,"5X"),1C,3J)}1d{c.1f[2s](1C,3J)}h(1C==""){3J()}h(c.u[0].2W!="3v"){c.u[0].3t()}$.k.3V=c}},2V:l(c){f 6C={25:c.1f.25()+4,31:c.1f.31()+4};f 96=b;c.1f.92().4p(b.90(c)).5k("5e.r-k-7n").1o({25:6C.25,31:6C.31}).3a().5k("1X, .r-k-4o, .r-k-4A, .r-k-5y 3p a").23("bj",l(){$(b).2Y("r-1U-6B")}).23("99",l(){h(!96.4Q(c.1I?c.1f.bh()[0]:c.u[0])){$(b).3z(".r-k-5y").5k("a").2Y("r-1U-6B");$(b).2N("r-1U-6B")}}).3a().5k("."+b.5q+" a").4c("99").3a();f 1F=b.5V(c);f 5n=1F[1];f 25=17;h(5n>1){c.1f.2N("r-k-4E-"+5n).1o("25",(25*5n)+"bo")}1d{c.1f.2Y("r-k-4E-2 r-k-4E-3 r-k-4E-4").25("")}c.1f[(1F[0]!=1||1F[1]!=1?"4H":"3q")+"8Y"]("r-k-4E");c.1f[(b.t(c,"1t")?"4H":"3q")+"8Y"]("r-k-8E");h(c.u&&c.u[0].2W!="3v"&&c==$.k.3V){$(c.u[0]).3t()}},8D:l(c,1h,1V){f 30=c.u?b.6z(c.u[0]):z;f 5l=5f.8z||(1l.2c?1l.2c.5d:1l.2g.5d);f 5m=5f.8A||(1l.2c?1l.2c.5h:1l.2g.5h);f 3M=1l.2c.3U||1l.2g.3U;f 3Q=1l.2c.3T||1l.2g.3T;h(b.t(c,"1t")||(1h.1Z+c.1f.25()-3M)>5l){1h.1Z=26.3g((1V?0:3M),30[0]+(c.u?c.u.25():0)-(1V?3M:0)-c.1f.25()-(1V&&$.1G.6A?1l.2c.3U:0))}1d{1h.1Z-=(1V?3M:0)}h((1h.2p+c.1f.31()-3Q)>5m){1h.2p=26.3g((1V?0:3Q),30[1]-(1V?3Q:0)-(b.3n?0:c.1f.31())-(1V&&$.1G.6A?1l.2c.3T:0))}1d{1h.2p-=(1V?3Q:0)}p 1h},6z:l(3C){3k(3C&&(3C.2W=="3v"||3C.bq!=1)){3C=3C.bn}f 1K=$(3C).1h();p[1K.1Z,1K.2p]},2P:l(u,1C){f c=b.3V;h(!c||(u&&c!=$.2t(u,3x))){p}h(c.4j){b.5L("#"+c.1b,b.4D(c,c.1W,c.2r,c.2f))}c.4j=S;h(b.3A){1C=(1C!=z?1C:b.t(c,"1C"));f 2s=b.t(c,"2s");f 3J=l(){$.k.60(c)};h(1C!=""&&$.5u&&$.5u[2s]){c.1f.62(2s,$.k.t(c,"5X"),1C,3J)}1d{c.1f[(1C==""?"62":(2s=="bl"?"bv":(2s=="bE"?"bF":"62")))](1C,3J)}h(1C==""){b.60(c)}f 4L=b.t(c,"4L");h(4L){4L.21((c.u?c.u[0]:z),[(c.u?c.u.3N():""),c])}b.3A=S;b.4i=z;h(b.3n){b.2J.1o({1K:"3H",1Z:"0",2p:"-8Q"});h($.51){$.bg();$("2g").4p(b.1f)}}b.3n=S}b.3V=z},60:l(c){c.1f.2Y(b.5Y).3l(".r-k-5y")},8N:l(v){h(!$.k.3V){p}f $q=$(v.q);h(($q.3z("#"+$.k.63).1r==0)&&!$q.3j($.k.2x)&&!$q.3j($.k.3c)&&$.k.3A&&!($.k.3n&&$.51)){$.k.2P(z,"")}},2e:l(1b,1h,2y){f q=$(1b);f c=b.1S(q[0]);h(b.4Q(q[0])){p}b.5R(c,1h,2y);b.2V(c)},72:l(1b){f q=$(1b);f c=b.1S(q[0]);h(b.t(c,"7f")&&c.1W){c.2d=c.1W;c.1a=c.1M=c.2r;c.1c=c.1T=c.2f}1d{f n=Z X();c.2d=n.1p();c.1a=c.1M=n.1v();c.1c=c.1T=n.1i()}b.4I(c);b.2e(q)},6x:l(1b,3u,2y){f q=$(1b);f c=b.1S(q[0]);c.5B=S;c["4G"+(2y=="M"?"8T":"8L")]=c["bJ"+(2y=="M"?"8T":"8L")]=22(3u.1D[3u.b4].18,10);b.4I(c);b.2e(q)},7i:l(1b){f q=$(1b);f c=b.1S(q[0]);h(c.u&&c.5B&&!$.1G.44){c.u[0].3t()}c.5B=!c.5B},7k:l(1b,19,U,3p){f q=$(1b);h($(3p).3j(b.7o)||b.4Q(q[0])){p}f c=b.1S(q[0]);c.2d=c.1W=$("a",3p).1Y();c.1M=c.2r=19;c.1T=c.2f=U;h(c.4j){c.48=c.4U=c.29=z}b.5L(1b,b.4D(c,c.1W,c.2r,c.2f));h(c.4j){c.2D=b.1y(Z X(c.2f,c.2r,c.1W));b.2V(c)}},8K:l(1b){f q=$(1b);f c=b.1S(q[0]);c.4j=S;c.48=c.4U=c.29=c.2D=z;b.5L(q,"")},5L:l(1b,3i){f q=$(1b);f c=b.1S(q[0]);3i=(3i!=z?3i:b.4D(c));h(c.u){c.u.3N(3i)}b.5o(c);f 3o=b.t(c,"3o");h(3o){3o.21((c.u?c.u[0]:z),[3i,c])}1d{h(c.u){c.u.4c("cv")}}h(c.1I){b.2V(c)}1d{h(!c.4j){b.2P(z,b.t(c,"1C"));b.4i=c.u[0];h(1L(c.u[0])!="5x"){c.u[0].3t()}b.4i=z}}},5o:l(c){f 55=b.t(c,"55");h(55){f 58=b.t(c,"58")||b.t(c,"3E");f n=b.7h(c);3i=b.4t(58,n,b.3B(c));$(55).3e(l(){$(b).3N(3i)})}},c9:l(n){f 1e=n.4a();p[(1e>0&&1e<6),""]},5G:l(n){f 2z=Z X(n.1i(),n.1v(),n.1p());f 4v=Z X(2z.1i(),1-1,4);f 1O=4v.4a()||7;4v.4P(4v.1p()+1-1O);h(1O<4&&2z<4v){2z.4P(2z.1p()-3);p $.k.5G(2z)}1d{h(2z>Z X(2z.1i(),12-1,28)){1O=Z X(2z.1i()+1,1-1,4).4a()||7;h(1O>4&&(2z.4a()||7)<1O-3){p 1}}}p 26.c5(((2z-4v)/bW)/7)+1},8V:l(1s,18,V){h(1s==z||18==z){4u"74 3K"}18=(1L 18=="5x"?18.61():18+"");h(18==""){p z}f 2k=(V?V.2k:z)||b.24.2k;f 2l=(V?V.2l:z)||b.24.2l;f 2a=(V?V.2a:z)||b.24.2a;f 1Q=(V?V.1Q:z)||b.24.1Q;f 1N=(V?V.1N:z)||b.24.1N;f U=-1;f 19=-1;f 1e=-1;f 3L=-1;f 2h=S;f 2i=l(1R){f 2b=(1k+1<1s.1r&&1s.1w(1k+1)==1R);h(2b){1k++}p 2b};f 4w=l(1R){2i(1R);f 7d=(1R=="@"?14:(1R=="y"?4:(1R=="o"?3:2)));f 2L=7d;f 2X=0;3k(2L>0&&2n<18.1r&&18.1w(2n)>="0"&&18.1w(2n)<="9"){2X=2X*10+22(18.1w(2n++),10);2L--}h(2L==7d){4u"8F 73 at 1K "+2n}p 2X};f 78=l(1R,5a,5v){f 4M=(2i(1R)?5v:5a);f 2L=0;1E(f j=0;j<4M.1r;j++){2L=26.3g(2L,4M[j].1r)}f 1B="";f 8J=2n;3k(2L>0&&2n<18.1r){1B+=18.1w(2n++);1E(f i=0;i<4M.1r;i++){h(1B==4M[i]){p i+1}}2L--}4u"cz 1B at 1K "+8J};f 5A=l(){h(18.1w(2n)!=1s.1w(1k)){4u"cy 2h at 1K "+2n}2n++};f 2n=0;1E(f 1k=0;1k<1s.1r;1k++){h(2h){h(1s.1w(1k)=="\'"&&!2i("\'")){2h=S}1d{5A()}}1d{49(1s.1w(1k)){T"d":1e=4w("d");15;T"D":78("D",2l,2a);15;T"o":3L=4w("o");15;T"m":19=4w("m");15;T"M":19=78("M",1Q,1N);15;T"y":U=4w("y");15;T"@":f n=Z X(4w("@"));U=n.1i();19=n.1v()+1;1e=n.1p();15;T"\'":h(2i("\'")){5A()}1d{2h=1m}15;2G:5A()}}}h(U==-1){U=Z X().1i()}1d{h(U<3y){U+=Z X().1i()-Z X().1i()%3y+(U<=2k?0:-3y)}}h(3L>-1){19=1;1e=3L;bP{f 6V=b.3S(U,19-1);h(1e<=6V){15}19++;1e-=6V}3k(1m)}f n=b.1y(Z X(U,19-1,1e));h(n.1i()!=U||n.1v()+1!=19||n.1p()!=1e){4u"74 n"}p n},b8:"3P-5I-4h",ba:"D, 4h M 3P",aS:"3P-5I-4h",aU:"D, d M y",aZ:"aX, 4h-M-y",aV:"D, d M y",aW:"D, d M 3P",bf:"D, d M 3P",bz:"D, d M y",bx:"@",bB:"3P-5I-4h",4t:l(1s,n,V){h(!n){p""}f 2l=(V?V.2l:z)||b.24.2l;f 2a=(V?V.2a:z)||b.24.2a;f 1Q=(V?V.1Q:z)||b.24.1Q;f 1N=(V?V.1N:z)||b.24.1N;f 2i=l(1R){f 2b=(1k+1<1s.1r&&1s.1w(1k+1)==1R);h(2b){1k++}p 2b};f 5b=l(1R,18,8O){f 2X=""+18;h(2i(1R)){3k(2X.1r<8O){2X="0"+2X}}p 2X};f 6U=l(1R,18,5a,5v){p(2i(1R)?5v[18]:5a[18])};f 2q="";f 2h=S;h(n){1E(f 1k=0;1k<1s.1r;1k++){h(2h){h(1s.1w(1k)=="\'"&&!2i("\'")){2h=S}1d{2q+=1s.1w(1k)}}1d{49(1s.1w(1k)){T"d":2q+=5b("d",n.1p(),2);15;T"D":2q+=6U("D",n.4a(),2l,2a);15;T"o":f 3L=n.1p();1E(f m=n.1v()-1;m>=0;m--){3L+=b.3S(n.1i(),m)}2q+=5b("o",3L,3);15;T"m":2q+=5b("m",n.1v()+1,2);15;T"M":2q+=6U("M",n.1v(),1Q,1N);15;T"y":2q+=(2i("y")?n.1i():(n.8S()%3y<10?"0":"")+n.8S()%3y);15;T"@":2q+=n.1A();15;T"\'":h(2i("\'")){2q+="\'"}1d{2h=1m}15;2G:2q+=1s.1w(1k)}}}}p 2q},8W:l(1s){f 2Z="";f 2h=S;1E(f 1k=0;1k<1s.1r;1k++){h(2h){h(1s.1w(1k)=="\'"&&!2i("\'")){2h=S}1d{2Z+=1s.1w(1k)}}1d{49(1s.1w(1k)){T"d":T"m":T"y":T"@":2Z+="bi";15;T"D":T"M":p z;T"\'":h(2i("\'")){2Z+="\'"}1d{2h=1m}15;2G:2Z+=1s.1w(1k)}}}p 2Z},t:l(c,1B){p c.V[1B]!==4d?c.V[1B]:b.24[1B]},7c:l(c){f 3E=b.t(c,"3E");f 4W=c.u?c.u.3N():z;c.48=c.4U=c.29=z;f n=2o=b.5F(c);f V=b.3B(c);5c{n=b.8V(3E,4W,V)||2o}5g(v){b.7a(v);n=2o}c.2d=n.1p();c.1a=c.1M=n.1v();c.1c=c.1T=n.1i();c.1W=(4W?n.1p():0);c.2r=(4W?n.1v():0);c.2f=(4W?n.1i():0);b.5R(c)},5F:l(c){f n=b.5s(b.t(c,"2o"),Z X());f 1g=b.3f(c,"3d",1m);f 1n=b.3f(c,"3g");n=(1g&&n<1g?1g:n);n=(1n&&n>1n?1n:n);p n},5s:l(n,2o){f 8y=l(1h){f n=Z X();n.4P(n.1p()+1h);p n};f 8B=l(1h,7b){f n=Z X();f U=n.1i();f 19=n.1v();f 1e=n.1p();f 7j=/([+-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g;f 2b=7j.8C(1h);3k(2b){49(2b[2]||"d"){T"d":T"D":1e+=22(2b[1],10);15;T"w":T"W":1e+=22(2b[1],10)*7;15;T"m":T"M":19+=22(2b[1],10);1e=26.3d(1e,7b(U,19));15;T"y":T"Y":U+=22(2b[1],10);1e=26.3d(1e,7b(U,19));15}2b=7j.8C(1h)}p Z X(U,19,1e)};n=(n==z?2o:(1L n=="2O"?8B(n,b.3S):(1L n=="73"?(7s(n)?2o:8y(n)):n)));n=(n&&n.61()=="74 X"?2o:n);h(n){n.8X(0);n.br(0);n.bs(0);n.bt(0)}p b.1y(n)},1y:l(n){h(!n){p z}n.8X(n.98()>12?n.98()+2:0);p n},6R:l(c,n,47){f 95=!(n);f 91=c.1M;f 8Z=c.1T;n=b.5s(n,Z X());c.2d=c.1W=n.1p();c.1a=c.1M=c.2r=n.1v();c.1c=c.1T=c.2f=n.1i();h(91!=c.1M||8Z!=c.1T){b.4I(c)}b.5R(c);h(c.u){c.u.3N(95?"":b.4D(c))}},7h:l(c){f 94=(!c.2f||(c.u&&c.u.3N()=="")?z:b.1y(Z X(c.2f,c.2r,c.1W)));p 94},90:l(c){f 3b=Z X();3b=b.1y(Z X(3b.1i(),3b.1v(),3b.1p()));f 1t=b.t(c,"1t");f 5P=b.t(c,"5P");f 4J=b.t(c,"4J");f 4m=b.t(c,"4m");f 1F=b.5V(c);f 5N=b.t(c,"5N");f 2B=b.t(c,"2B");f 3O=b.t(c,"3O");f 5O=(1F[0]!=1||1F[1]!=1);f 52=b.1y((!c.1W?Z X(bk,9,9):Z X(c.2f,c.2r,c.1W)));f 1g=b.3f(c,"3d",1m);f 1n=b.3f(c,"3g");f 1a=c.1a-5N;f 1c=c.1c;h(1a<0){1a+=12;1c--}h(1n){f 4N=b.1y(Z X(1n.1i(),1n.1v()-1F[1]+1,1n.1p()));4N=(1g&&4N<1g?1g:4N);3k(b.1y(Z X(1c,1a,1))>4N){1a--;h(1a<0){1a=11;1c--}}}f 2H=b.t(c,"2H");2H=(!4m?2H:b.4t(2H,b.1y(Z X(1c,1a-2B,1)),b.3B(c)));f 4o=(b.70(c,-1,1c,1a)?\'<a 1j="r-k-4o r-2E-2v" 43="2w.k.2e(\\\'#\'+c.1b+"\', -"+2B+", \'M\');\\" 2T=\\""+2H+\'"><1x 1j="r-3m r-3m-5K-5H-\'+(1t?"e":"w")+\'">\'+2H+"</1x></a>":(4J?"":\'<a 1j="r-k-4o r-2E-2v r-1U-1u" 2T="\'+2H+\'"><1x 1j="r-3m r-3m-5K-5H-\'+(1t?"e":"w")+\'">\'+2H+"</1x></a>"));f 2K=b.t(c,"2K");2K=(!4m?2K:b.4t(2K,b.1y(Z X(1c,1a+2B,1)),b.3B(c)));f 4A=(b.70(c,+1,1c,1a)?\'<a 1j="r-k-4A r-2E-2v" 43="2w.k.2e(\\\'#\'+c.1b+"\', +"+2B+", \'M\');\\" 2T=\\""+2K+\'"><1x 1j="r-3m r-3m-5K-5H-\'+(1t?"w":"e")+\'">\'+2K+"</1x></a>":(4J?"":\'<a 1j="r-k-4A r-2E-2v r-1U-1u" 2T="\'+2K+\'"><1x 1j="r-3m r-3m-5K-5H-\'+(1t?"w":"e")+\'">\'+2K+"</1x></a>"));f 3F=b.t(c,"3F");f 71=(b.t(c,"7f")&&c.1W?52:3b);3F=(!4m?3F:b.4t(3F,71,b.3B(c)));f 6S=\'<1X 2W="1X" 1j="r-k-bG r-1U-2G r-7r-bH r-2E-2v" 43="2w.k.2P();">\'+b.t(c,"8x")+"</1X>";f 8e=(5P)?\'<1J 1j="r-k-bA r-2C-76">\'+(1t?6S:"")+(b.6Y(c,71)?\'<1X 2W="1X" 1j="r-k-7R r-1U-2G r-7r-4b r-2E-2v" 43="2w.k.72(\\\'#\'+c.1b+"\');\\">"+3F+"</1X>":"")+(1t?"":6S)+"</1J>":"";f 1O=22(b.t(c,"1O"));1O=(7s(1O)?0:1O);f 2a=b.t(c,"2a");f 2l=b.t(c,"2l");f 5D=b.t(c,"5D");f 1N=b.t(c,"1N");f 1Q=b.t(c,"1Q");f 4V=b.t(c,"4V");f 4q=b.t(c,"4q");f 7e=b.t(c,"7e")||b.5G;f 47=c.48?b.1y(Z X(c.29,c.4U,c.48)):52;f 2o=b.5F(c);f 1Y="";1E(f 4B=0;4B<1F[0];4B++){f 4R="";1E(f 4T=0;4T<1F[1];4T++){f 3Z=b.1y(Z X(1c,1a,c.2d));f 3D=" r-2E-2v";f 2u="";h(5O){2u+=\'<1J 1j="r-k-4R r-k-4R-\';49(4T){T 0:2u+="b1";3D=" r-2E-"+(1t?"6W":"1Z");15;T 1F[1]-1:2u+="bd";3D=" r-2E-"+(1t?"1Z":"6W");15;2G:2u+="be";3D="";15}2u+=\'">\'}2u+=\'<1J 1j="r-k-8f r-2C-8f r-5r-6Z\'+3D+\'">\'+(/2v|1Z/.1P(3D)&&4B==0?(1t?4A:4o):"")+(/2v|6W/.1P(3D)&&4B==0?(1t?4o:4A):"")+b.7M(c,1a,1c,1g,1n,3Z,4B>0||4T>0,1N,1Q)+\'</1J><8c 1j="r-k-5y"><50><5t>\';f 50="";1E(f 2U=0;2U<7;2U++){f 1e=(2U+1O)%7;50+="<8p"+((2U+1O+6)%7>=5?\' 1j="r-k-83-3a"\':"")+\'><1x 2T="\'+2a[1e]+\'">\'+5D[1e]+"</1x></8p>"}2u+=50+"</5t></50><53>";f 75=b.3S(1c,1a);h(1c==c.1T&&1a==c.1M){c.2d=26.3d(c.2d,75)}f 77=(b.8j(1c,1a)-1O+7)%7;f 8d=(5O?6:26.b5((77+75)/7));f 1z=b.1y(Z X(1c,1a,1-77));1E(f 6T=0;6T<8d;6T++){2u+="<5t>";f 53="";1E(f 2U=0;2U<7;2U++){f 4K=(4V?4V.21((c.u?c.u[0]:z),[1z]):[1m,""]);f 4z=(1z.1v()!=1a);f 2I=4z||!4K[0]||(1g&&1z<1g)||(1n&&1z>1n);53+=\'<3p 1j="\'+((2U+1O+6)%7>=5?" r-k-83-3a":"")+(4z?" r-k-9v-19":"")+((1z.1A()==3Z.1A()&&1a==c.1M&&c.5i)||(2o.1A()==1z.1A()&&2o.1A()==3Z.1A())?" "+b.5q:"")+(2I?" "+b.7o+" r-1U-1u":"")+(4z&&!4q?"":" "+4K[1]+(1z.1A()>=52.1A()&&1z.1A()<=47.1A()?" "+b.7m:"")+(1z.1A()==3b.1A()?" r-k-3b":""))+\'"\'+((!4z||4q)&&4K[2]?\' 2T="\'+4K[2]+\'"\':"")+(2I?"":" 43=\\"2w.k.7k(\'#"+c.1b+"\',"+1a+","+1c+\', b);p S;"\')+">"+(4z?(4q?1z.1p():"&#6X;"):(2I?1z.1p():\'<a 1j="r-1U-2G\'+(1z.1A()==3b.1A()?" r-1U-9Q":"")+(1z.1A()>=52.1A()&&1z.1A()<=47.1A()?" r-1U-9K":"")+\'" 7Y="#">\'+1z.1p()+"</a>"))+"</3p>";1z.4P(1z.1p()+1);1z=b.1y(1z)}2u+=53+"</5t>"}1a++;h(1a>11){1a=0;1c++}2u+="</53></8c>"+(5O?"</1J>":"");4R+=2u}1Y+=4R}1Y+=(!c.1I?8e:"")+($.1G.44&&22($.1G.3I,10)<7&&!c.1I?\'<5e 79="az:S;" 1j="r-k-7n" aF="0"></5e>\':"");c.5i=S;p 1Y},7M:l(c,1a,1c,1g,1n,3Z,4b,1N,1Q){1g=(c.2D&&1g&&3Z<1g?3Z:1g);f 3Y=b.t(c,"3Y");f 41=b.t(c,"41");f 4Z=b.t(c,"4Z");f 1Y=\'<1J 1j="r-k-2T">\';f 3X="";h(4b||!3Y){3X+=\'<1x 1j="r-k-19">\'+1N[1a]+"</1x> "}1d{f 7Q=(1g&&1g.1i()==1c);f 7B=(1n&&1n.1i()==1c);3X+=\'<3u 1j="r-k-19" 8G="2w.k.6x(\\\'#\'+c.1b+"\', b, \'M\');\\" 43=\\"2w.k.7i(\'#"+c.1b+"\');\\">";1E(f 19=0;19<12;19++){h((!7Q||19>=1g.1v())&&(!7B||19<=1n.1v())){3X+=\'<4x 18="\'+19+\'"\'+(19==1a?\' 4G="4G"\':"")+">"+1Q[19]+"</4x>"}}3X+="</3u>"}h(!4Z){1Y+=3X+((4b||3Y||41)&&(!(3Y&&41))?"&#6X;":"")}h(4b||!41){1Y+=\'<1x 1j="r-k-U">\'+1c+"</1x>"}1d{f 3w=b.t(c,"8M").5j(":");f U=0;f 29=0;h(3w.1r!=2){U=1c-10;29=1c+10}1d{h(3w[0].1w(0)=="+"||3w[0].1w(0)=="-"){U=29=Z X().1i();U+=22(3w[0],10);29+=22(3w[1],10)}1d{U=22(3w[0],10);29=22(3w[1],10)}}U=(1g?26.3g(U,1g.1i()):U);29=(1n?26.3d(29,1n.1i()):29);1Y+=\'<3u 1j="r-k-U" 8G="2w.k.6x(\\\'#\'+c.1b+"\', b, \'Y\');\\" 43=\\"2w.k.7i(\'#"+c.1b+"\');\\">";1E(;U<=29;U++){1Y+=\'<4x 18="\'+U+\'"\'+(U==1c?\' 4G="4G"\':"")+">"+U+"</4x>"}1Y+="</3u>"}h(4Z){1Y+=(4b||3Y||41?"&#6X;":"")+3X}1Y+="</1J>";p 1Y},5R:l(c,1h,2y){f U=c.1c+(2y=="Y"?1h:0);f 19=c.1a+(2y=="M"?1h:0);f 1e=26.3d(c.2d,b.3S(U,19))+(2y=="D"?1h:0);f n=b.1y(Z X(U,19,1e));f 1g=b.3f(c,"3d",1m);f 1n=b.3f(c,"3g");n=(1g&&n<1g?1g:n);n=(1n&&n>1n?1n:n);c.2d=n.1p();c.1a=c.1M=n.1v();c.1c=c.1T=n.1i();h(2y=="M"||2y=="Y"){b.4I(c)}},4I:l(c){f 7g=b.t(c,"88");h(7g){7g.21((c.u?c.u[0]:z),[c.1T,c.1M+1,c])}},5V:l(c){f 1F=b.t(c,"8o");p(1F==z?[1,1]:(1L 1F=="73"?[1,1F]:1F))},3f:l(c,8u,7S){f n=b.5s(b.t(c,8u+"X"),z);p(!7S||!c.2D?n:(!n||c.2D>n?c.2D:n))},3S:l(U,19){p 32-Z X(U,19,32).1p()},8j:l(U,19){p Z X(U,19,1).4a()},70:l(c,1h,7y,7E){f 1F=b.5V(c);f n=b.1y(Z X(7y,7E+(1h<0?1h:1F[1]),1));h(1h<0){n.4P(b.3S(n.1i(),n.1v()))}p b.6Y(c,n)},6Y:l(c,n){f 4r=(!c.2D?z:b.1y(Z X(c.1T,c.1M,c.2d)));4r=(4r&&c.2D<4r?c.2D:4r);f 1g=4r||b.3f(c,"3d");f 1n=b.3f(c,"3g");p((!1g||n>=1g)&&(!1n||n<=1n))},3B:l(c){f 2k=b.t(c,"2k");2k=(1L 2k!="2O"?2k:Z X().1i()%3y+22(2k,10));p{2k:2k,2l:b.t(c,"2l"),2a:b.t(c,"2a"),1Q:b.t(c,"1Q"),1N:b.t(c,"1N")}},4D:l(c,1e,19,U){h(!1e){c.1W=c.2d;c.2r=c.1M;c.2f=c.1T}f n=(1e?(1L 1e=="5x"?1e:b.1y(Z X(U,19,1e))):b.1y(Z X(c.2f,c.2r,c.1W)));p b.4t(b.t(c,"3E"),n,b.3B(c))}});l 4k(q,4y){$.3h(q,4y);1E(f 1B 7l 4y){h(4y[1B]==z||4y[1B]==4d){q[1B]=4y[1B]}}p q}l bU(a){p(a&&(($.1G.5Z&&1L a=="5x"&&a.1r)||(a.8R&&a.8R.61().1R(/\\6P\\(\\)/))))}$.4f.k=l(1D){h(!$.k.6L){$(1l.2g).4p($.k.1f).8P($.k.8N);$.k.6L=1m}f 6D=6P.3R.8U.4s(3K,1);h(1L 1D=="2O"&&(1D=="bp"||1D=="1p")){p $.k["6u"+1D+"4F"].21($.k,[b[0]].6v(6D))}p b.3e(l(){1L 1D=="2O"?$.k["6u"+1D+"4F"].21($.k,[b].6v(6D)):$.k.7z(b,1D)})};$.k=Z 4F();$.k.6L=S;$.k.6s=Z X().1A();$.k.3I="1.6f"})(2w);',62,780,'|||||||||||this|inst|||var||if|||datepicker|function||date||return|target|ui||_get|input|event||||null|||||||||||||||||||false|case|year|settings||Date||new||||||break|||value|month|drawMonth|id|drawYear|else|day|dpDiv|minDate|offset|getFullYear|class|iFormat|document|true|maxDate|css|getDate|nodeName|length|format|isRTL|disabled|getMonth|charAt|span|_daylightSavingAdjust|printDate|getTime|name|duration|options|for|numMonths|browser|ctrlKey|inline|div|position|typeof|selectedMonth|monthNames|firstDay|test|monthNamesShort|match|_getInst|selectedYear|state|isFixed|currentDay|button|html|left||apply|parseInt|bind|_defaults|width|Math|||endYear|dayNames|matches|documentElement|selectedDay|_adjustDate|currentYear|body|literal|lookAhead|_pos|shortYearCutoff|dayNamesShort|metaKey|iValue|defaultDate|top|output|currentMonth|showAnim|data|calender|all|jQuery|markerClassName|period|checkDate|element|stepMonths|widget|rangeStart|corner|handled|default|prevText|unselectable|_dialogInput|nextText|size|attr|addClass|string|_hideDatepicker|_mouseStarted|widgetName|_disabledInputs|title|dow|_updateDatepicker|type|num|removeClass|chars|pos|height|||||||||end|today|_triggerClass|min|each|_getMinMaxDate|max|extend|dateStr|hasClass|while|unbind|icon|_inDialog|onSelect|td|remove|key|buttonText|focus|select|hidden|years|PROP_NAME|100|parents|_datepickerShowing|_getFormatConfig|obj|cornerClass|dateFormat|currentText|showOn|absolute|version|postProcess|arguments|doy|scrollX|val|stepBigMonths|yy|scrollY|prototype|_getDaysInMonth|scrollTop|scrollLeft|_curInst|overflow|monthHtml|changeMonth|selectedDate||changeYear|curCSS|onclick|msie|||endDate|endDay|switch|getDay|secondary|trigger|undefined|buttonImage|fn|toLowerCase|dd|_lastInput|stayOpen|extendRemove|_showDatepicker|navigationAsDateFormat|siblings|prev|append|showOtherMonths|newMinDate|call|formatDate|throw|firstMon|getNumber|option|props|otherMonth|next|row|inlineSettings|_formatDate|multi|Datepicker|selected|add|_notifyChange|hideIfNoPrevNext|daySettings|onClose|names|maxDraw|beforeShow|setDate|_isDisabledDatepicker|group|_setData|col|endMonth|beforeShowDay|dates|replace|appendText|showMonthAfterYear|thead|blockUI|currentDate|tbody|cssCache|altField|_mouseUp|px|altFormat|plugins|shortNames|formatNumber|try|clientWidth|iframe|window|catch|clientHeight|_keyEvent|split|find|browserWidth|browserHeight|cols|_updateAlternate|preventDefault|_dayOverClass|helper|_determineDate|tr|effects|longNames|_mouseDownEvent|object|calendar|defaults|checkLiteral|_selectingMonthYear|attrName|dayNamesMin|attrValue|_getDefaultDate|iso8601Week|triangle|mm|keyCode|circle|_selectDate|fixed|showCurrentAtPos|isMultiMonth|showButtonPanel|img|_adjustInstDate|_inlineClass|children|_doKeyDown|_getNumberOfMonths|mouseDelayMet|showOptions|_dialogClass|safari|_tidyDialog|toString|hide|_mainDivId|_doKeyPress|_preventClickEvent|_mouseUpDelegate|_mouseMoveDelegate|filter|_mouseDistanceMet|_mouseDelayMet|delay|cancel|_mouseDrag|_mouseStart|6rc4|widgetEventPrefix|auto|aaa|isOverAxis|contains|get|removeAttr|aria|namespace|widgetBaseClass|_getData|regional|uuid|display|_|concat|chr|_selectMonthYear|show|_findPos|opera|hover|dims|otherArgs|sel|_newInst|getData|setData|divSpan|pageX|pageY|initialized|cursor|keydown|_appendClass|Array|none|_setDate|controls|dRow|formatName|dim|right|xa0|_isInRange|clearfix|_canAdjustMonth|gotoDate|_gotoToday|number|Invalid|daysInMonth|content|leadDays|getName|src|log|getDaysInMonth|_setDateFromField|origSize|calculateWeek|gotoCurrent|onChange|_getDate|_clickMonthYear|pattern|_selectDay|in|_currentClass|cover|_unselectableClass|removeData|map|priority|isNaN|keypress|opacity|metadata|eq|constrainInput|curYear|_attachDatepicker|MozUserSelect|inMaxYear|charCode|parentNode|curMonth|wairole|selectstart|altKey|getterSetter|is|_optionDatepicker|err|_generateMonthYearHeader|scroll|originalEvent|relative|inMinYear|current|checkRange|_mouseDown|_mouseMove|mousemove|mouseup|_mouseUnselectable|href|debug|triggerHandler|on|abs|week|May|x3c|x3e|distance|onChangeMonthYear|_mouseStop|_mouseCapture|mouse|table|numRows|buttonPanel|header|_inlineDatepicker|dp|_dialogInst|_getFirstDayOfMonth|dateText|destroy|click|after|numberOfMonths|th|_connectDatepicker|both|buttonImageOnly|before|minMax|alt|_init|closeText|offsetNumeric|innerWidth|innerHeight|offsetString|exec|_checkOffset|rtl|Missing|onchange|compareDocumentPosition|5000px|iInit|_clearDate|Year|yearRange|_checkExternalClick|len|mousedown|100px|constructor|getYear|Month|slice|parseDate|_possibleChars|setHours|Class|origYear|_generateHTML|origMonth|empty|static|startDate|clear|self|block|getHours|mouseover|parseFloat|prevBigText|isOver|188|started|backgroundColor|removeChild|hasScroll|_mouseDestroy|COMMA|Next|fix|nextBigText|_trigger|BACKSPACE|CAPS_LOCK|_mouseInit|Today|disable|mozilla|setTimeout|other|appendTo|backgroundImage|CONTROL|days|gen|push|_disableClass|522|plugin|cell|over|dialog|_mouseDelayTimer|Prev|active|Done|rgba|clearText|Clear|transparent|highlight|which|107|tabbable|SHIFT|expr|SPACE|TAB|RIGHT|tabIndex|inArray|substring|190|getter|textarea|UP|scrollParent|w3|setAttributeNS|role|07|org|www|removeAttributeNS|disableSelection|http|January|off|enableSelection|PERIOD|isFunction|NUMPAD_ADD|LEFT|2005|NUMPAD_DECIMAL|110|INSERT|HOME|DOWN||DELETE|END|ENTER|ESCAPE|NUMPAD_DIVIDE|javascript|109|NUMPAD_SUBTRACT|PAGE_DOWN|PAGE_UP|eventPrefix|frameborder|106|111|NUMPAD_ENTER|108|NUMPAD_MULTIPLY|enable|Fri|_refreshDatepicker|_setDateDatepicker|_changeDatepicker|instance|_disableDatepicker|ISO_8601|_getDateDatepicker|RFC_822|RFC_1036|RFC_1123|DD|February|RFC_850|_enableDatepicker|first|_dialogDatepicker|text|selectedIndex|ceil|getAttribute|eval|ATOM|style|COOKIE|_destroyDatepicker|150|last|middle|RFC_2822|unblockUI|parent|0123456789|mouseout|9999|slideDown|1000px|nextSibling|em|isDisabled|nodeType|setMinutes|setSeconds|setMilliseconds|offsetHeight|slideUp|String|TIMESTAMP|stopPropagation|RSS|buttonpane|W3C|fromCharCode|indexOf|fadeIn|fadeOut|close|primary|setDefaults|draw|Tuesday|October|Monday|Sunday|Dec|do|Wednesday|September|Saturday|Friday|isArray|Thursday|86400000|November|Jul|Aug|Jun|Apr|Mar|Sep|Oct|floor|December|Jan|Nov|noWeekends|Feb|August|We|Th|Tu|Mo|Su|Fr|Sa|console|hasDatepicker|accessible|normal|July|March|Tue|Wed|Mon|Sun|June|Thu|change|Sat|April|Unexpected|Unknown'.split('|'),0,{})) diff --git a/js/jquery/datepicker/ui/i18n/index.php b/js/jquery/datepicker/ui/i18n/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/index.php @@ -0,0 +1,11 @@ +<?php + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/jquery/datepicker/ui/i18n/jquery.ui.i18n.all.js b/js/jquery/datepicker/ui/i18n/jquery.ui.i18n.all.js new file mode 100644 index 000000000..b35f81adf --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/jquery.ui.i18n.all.js @@ -0,0 +1,909 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Al Horani -- koko.dw@gmail.com */ +/* خالد الحوراني -- koko.dw@gmail.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + clearText: 'مسح', clearStatus: 'امسح التاريخ الحالي', + closeText: 'إغلاق', closeStatus: 'إغلاق بدون حفظ', + prevText: '&#x3c;السابق', prevStatus: 'عرض الشهر السابق', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'التالي&#x3e;', nextStatus: 'عرض الشهر القادم', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'اليوم', currentStatus: 'عرض الشهر الحالي', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + monthStatus: 'عرض شهر آخر', yearStatus: 'عرض سنة آخرى', + weekHeader: 'أسبوع', weekStatus: 'أسبوع السنة', + dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], + dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayStatus: 'اختر DD لليوم الأول من الأسبوع', dateStatus: 'اختر D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'اختر يوم', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +});/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + clearText: 'изчисти', clearStatus: 'изчисти актуалната дата', + closeText: 'затвори', closeStatus: 'затвори без промени', + prevText: '&#x3c;назад', prevStatus: 'покажи последния месец', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'напред&#x3e;', nextStatus: 'покажи следващия месец', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'днес', currentStatus: '', + monthNames: ['Януари','Февруари','Март','Април','Май','Юни', + 'Юли','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни', + 'Юли','Авг','Сеп','Окт','Нов','Дек'], + monthStatus: 'покажи друг месец', yearStatus: 'покажи друга година', + weekHeader: 'Wk', weekStatus: 'седмица от месеца', + dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'], + dayStatus: 'Сложи DD като първи ден от седмицата', dateStatus: 'Избери D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Избери дата', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); +/* Inicialitzaci� en catal� per a l'extenci� 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + clearText: 'Netejar', clearStatus: '', + closeText: 'Tancar', closeStatus: '', + prevText: '&#x3c;Ant', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Seg&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Avui', currentStatus: '', + monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'mm/dd/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +});/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + clearText: 'Vymazat', clearStatus: 'Vymaže zadané datum', + closeText: 'Zavřít', closeStatus: 'Zavře kalendář beze změny', + prevText: '&#x3c;Dříve', prevStatus: 'Přejít na předchozí měsí', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Později&#x3e;', nextStatus: 'Přejít na další měsíc', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Nyní', currentStatus: 'Přejde na aktuální měsíc', + monthNames: ['leden','únor','březen','duben','květen','červen', + 'červenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bře','dub','kvě','čer', + 'čvc','srp','zář','říj','lis','pro'], + monthStatus: 'Přejít na jiný měsíc', yearStatus: 'Přejít na jiný rok', + weekHeader: 'Týd', weekStatus: 'Týden v roce', + dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','čt','pá','so'], + dayStatus: 'Nastavit DD jako první den v týdnu', dateStatus: '\'Vyber\' DD, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Vyberte datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + clearText: 'Nulstil', clearStatus: 'Nulstil den aktuelle dato', + closeText: 'Luk', closeStatus: 'Luk uden ændringer', + prevText: '&#x3c;Forrige', prevStatus: 'Vis forrige måned', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Næste&#x3e;', nextStatus: 'Vis næste måned', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Idag', currentStatus: 'Vis aktuel måned', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: 'Vis en anden måned', yearStatus: 'Vis et andet år', + weekHeader: 'Uge', weekStatus: 'Årets uge', + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + dayStatus: 'Sæt DD som første ugedag', dateStatus: 'Vælg D, M d', + dateFormat: 'dd-mm-yy', firstDay: 0, + initStatus: 'Vælg en dato', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + clearText: 'löschen', clearStatus: 'aktuelles Datum löschen', + closeText: 'schließen', closeStatus: 'ohne Änderungen schließen', + prevText: '&#x3c;zurück', prevStatus: 'letzten Monat zeigen', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Vor&#x3e;', nextStatus: 'nächsten Monat zeigen', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'heute', currentStatus: '', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + monthStatus: 'anderen Monat anzeigen', yearStatus: 'anderes Jahr anzeigen', + weekHeader: 'Wo', weekStatus: 'Woche des Monats', + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Wähle ein Datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + clearText: 'Vakigi', clearStatus: '', + closeText: 'Fermi', closeStatus: 'Fermi sen modifi', + prevText: '&lt;Anta', prevStatus: 'Vidi la antaŭan monaton', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Sekv&gt;', nextStatus: 'Vidi la sekvan monaton', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Nuna', currentStatus: 'Vidi la nunan monaton', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aŭg','Sep','Okt','Nov','Dec'], + monthStatus: 'Vidi alian monaton', yearStatus: 'Vidi alian jaron', + weekHeader: 'Sb', weekStatus: '', + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'], + dayStatus: 'Uzi DD kiel unua tago de la semajno', dateStatus: 'Elekti DD, MM d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'Elekti la daton', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); +/* Inicializaci�n en espa�ol para la extensi�n 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + clearText: 'Limpiar', clearStatus: '', + closeText: 'Cerrar', closeStatus: '', + prevText: '&#x3c;Ant', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Sig&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Hoy', currentStatus: '', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'], + dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['es']); +});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + clearText: 'حذف تاريخ', clearStatus: 'پاک کردن تاريخ جاري', + closeText: 'بستن', closeStatus: 'بستن بدون اعمال تغييرات', + prevText: '&#x3c;قبلي', prevStatus: 'نمايش ماه قبل', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'بعدي&#x3e;', nextStatus: 'نمايش ماه بعد', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'امروز', currentStatus: 'نمايش ماه جاري', + monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسفند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + monthStatus: 'نمايش ماه متفاوت', yearStatus: 'نمايش سال متفاوت', + weekHeader: 'هف', weekStatus: 'هفتهِ سال', + dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'], + dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'], + dayStatus: 'قبول DD بعنوان اولين روز هفته', dateStatus: 'انتخاب D, M d', + dateFormat: 'yy/mm/dd', firstDay: 6, + initStatus: 'انتخاب تاريخ', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +});/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi� (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + clearText: 'Tyhjenn&auml;', clearStatus: '', + closeText: 'Sulje', closeStatus: '', + prevText: '&laquo;Edellinen', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Seuraava&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'T&auml;n&auml;&auml;n', currentStatus: '', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu', + 'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;', + 'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'], + monthStatus: '', yearStatus: '', + weekHeader: 'Vk', weekStatus: '', + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood@virginbroadband.com.au) and Stéphane Nahmani (sholby@sholby.net). */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + clearText: 'Effacer', clearStatus: 'Effacer la date sélectionnée', + closeText: 'Fermer', closeStatus: 'Fermer sans modifier', + prevText: '&#x3c;Préc', prevStatus: 'Voir le mois précédent', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Suiv&#x3e;', nextStatus: 'Voir le mois suivant', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Courant', currentStatus: 'Voir le mois courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + monthStatus: 'Voir un autre mois', yearStatus: 'Voir une autre année', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + dayStatus: 'Utiliser DD comme premier jour de la semaine', dateStatus: '\'Choisir\' le DD d MM', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: 'Choisir la date', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +});/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + clearText: 'נקה', clearStatus: '', + closeText: 'סגור', closeStatus: '', + prevText: '&#x3c;הקודם', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'הבא&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'היום', currentStatus: '', + monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני', + 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayStatus: 'DD', dateStatus: 'DD, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + clearText: 'izbriši', clearStatus: 'Izbriši trenutni datum', + closeText: 'Zatvori', closeStatus: 'Zatvori kalendar', + prevText: '&#x3c;', prevStatus: 'Prikaži prethodni mjesec', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: '&#x3e;', nextStatus: 'Prikaži slijedeći mjesec', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Danas', currentStatus: 'Današnji datum', + monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipani', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + monthStatus: 'Prikaži mjesece', yearStatus: 'Prikaži godine', + weekHeader: 'Tje', weekStatus: 'Tjedan', + dayNames: ['Nedjalja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + dayStatus: 'Odaber DD za prvi dan tjedna', dateStatus: '\'Datum\' D, M d', + dateFormat: 'dd.mm.yy.', firstDay: 1, + initStatus: 'Odaberi datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +});/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquerycalendar@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + clearText: 'törlés', clearStatus: '', + closeText: 'bezárás', closeStatus: '', + prevText: '&laquo;&nbsp;vissza', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'előre&nbsp;&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'ma', currentStatus: '', + monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Hé', weekStatus: '', + dayNames: ['Vasámap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + clearText: 'Մաքրել', clearStatus: '', + closeText: 'Փակել', closeStatus: '', + prevText: '&#x3c;Նախ.', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Հաջ.&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Այսօր', currentStatus: '', + monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս', + 'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'], + monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս', + 'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'], + monthStatus: '', yearStatus: '', + weekHeader: 'ՇԲՏ', weekStatus: '', + dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'], + dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +});/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + clearText: 'kosongkan', clearStatus: 'bersihkan tanggal yang sekarang', + closeText: 'Tutup', closeStatus: 'Tutup tanpa mengubah', + prevText: '&#x3c;mundur', prevStatus: 'Tampilkan bulan sebelumnya', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'maju&#x3e;', nextStatus: 'Tampilkan bulan berikutnya', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'hari ini', currentStatus: 'Tampilkan bulan sekarang', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + monthStatus: 'Tampilkan bulan yang berbeda', yearStatus: 'Tampilkan tahun yang berbeda', + weekHeader: 'Mg', weekStatus: 'Minggu dalam tahun', + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + dayStatus: 'gunakan DD sebagai awal hari dalam minggu', dateStatus: 'pilih le DD, MM d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'Pilih Tanggal', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['id']); +});/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + clearText: 'Hreinsa', clearStatus: '', + closeText: 'Loka', closeStatus: '', + prevText: '&#x3c; Fyrri', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'N&aelig;sti &#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: '&Iacute; dag', currentStatus: '', + monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;', + 'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n', + 'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Vika', weekStatus: '', + dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'], + dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'], + dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['is']); +});/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Apaella (apaella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + clearText: 'Svuota', clearStatus: 'Annulla', + closeText: 'Chiudi', closeStatus: 'Chiudere senza modificare', + prevText: '&#x3c;Prec', prevStatus: 'Mese precedente', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: 'Mostra l\'anno precedente', + nextText: 'Succ&#x3e;', nextStatus: 'Mese successivo', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: 'Mostra l\'anno successivo', + currentText: 'Oggi', currentStatus: 'Mese corrente', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + monthStatus: 'Seleziona un altro mese', yearStatus: 'Seleziona un altro anno', + weekHeader: 'Sm', weekStatus: 'Settimana dell\'anno', + dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gio','Ve','Sa'], + dayStatus: 'Usa DD come primo giorno della settimana', dateStatus: '\'Seleziona\' D, M d', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: 'Scegliere una data', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + clearText: 'クリア', clearStatus: '日付をクリアします', + closeText: '閉じる', closeStatus: '変更せずに閉じます', + prevText: '&#x3c;前', prevStatus: '前月を表示します', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '前年を表示します', + nextText: '次&#x3e;', nextStatus: '翌月を表示します', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '翌年を表示します', + currentText: '今日', currentStatus: '今月を表示します', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthStatus: '表示する月を変更します', yearStatus: '表示する年を変更します', + weekHeader: '週', weekStatus: '暦週で第何週目かを表します', + dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['日','月','火','水','木','金','土'], + dayNamesMin: ['日','月','火','水','木','金','土'], + dayStatus: '週の始まりをDDにします', dateStatus: 'Md日(D)', + dateFormat: 'yy/mm/dd', firstDay: 0, + initStatus: '日付を選択します', isRTL: false, + showMonthAfterYear: true}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +});/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + clearText: '지우기', clearStatus: '', + closeText: '닫기', closeStatus: '', + prevText: '이전달', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: '다음달', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: '오늘', currentStatus: '', + monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + monthStatus: '', yearStatus: '', + weekHeader: 'Wk', weekStatus: '', + dayNames: ['일','월','화','수','목','금','토'], + dayNamesShort: ['일','월','화','수','목','금','토'], + dayNamesMin: ['일','월','화','수','목','금','토'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +});/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + clearText: 'Išvalyti', clearStatus: '', + closeText: 'Uždaryti', closeStatus: '', + prevText: '&#x3c;Atgal', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Pirmyn&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Šiandien', currentStatus: '', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + monthStatus: '', yearStatus: '', + weekHeader: '', weekStatus: '', + dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + clearText: 'Notīrīt', clearStatus: '', + closeText: 'Aizvērt', closeStatus: '', + prevText: 'Iepr', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Nāka', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Šodien', currentStatus: '', + monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs', + 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn', + 'Jūl','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Nav', weekStatus: '', + dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd-mm-yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +jQuery(function($){ + $.datepicker.regional.nl = { + clearText: 'Wissen', clearStatus: 'Wis de huidige datum', + closeText: 'Sluiten', closeStatus: 'Sluit zonder verandering', + prevText: '←', prevStatus: 'Bekijk de vorige maand', + prevBigText: '«', nextBigStatus: 'Bekijk het vorige jaar', + nextText: '→', nextStatus: 'Bekijk de volgende maand', + nextBigText: '»', nextBigStatus: 'Bekijk het volgende jaar', + currentText: 'Vandaag', currentStatus: 'Bekijk de huidige maand', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + monthStatus: 'Bekijk een andere maand', yearStatus: 'Bekijk een ander jaar', + weekHeader: 'Wk', weekStatus: 'Week van het jaar', + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + dayStatus: 'Stel DD in als eerste dag van de week', dateStatus: 'dd/mm/yy', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: 'Kies een datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional.nl); +});/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['no'] = { + clearText: 'Tøm', clearStatus: '', + closeText: 'Lukk', closeStatus: '', + prevText: '&laquo;Forrige', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Neste&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'I dag', currentStatus: '', + monthNames: ['Januar','Februar','Mars','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Uke', weekStatus: '', + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + clearText: 'Wyczyść', clearStatus: 'Wyczyść obecną datę', + closeText: 'Zamknij', closeStatus: 'Zamknij bez zapisywania', + prevText: '&#x3c;Poprzedni', prevStatus: 'Pokaż poprzedni miesiąc', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Następny&#x3e;', nextStatus: 'Pokaż następny miesiąc', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Dziś', currentStatus: 'Pokaż aktualny miesiąc', + monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', + 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + monthStatus: 'Pokaż inny miesiąc', yearStatus: 'Pokaż inny rok', + weekHeader: 'Tydz', weekStatus: 'Tydzień roku', + dayNames: ['Niedziela','Poniedzialek','Wtorek','Środa','Czwartek','Piątek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'], + dayStatus: 'Ustaw DD jako pierwszy dzień tygodnia', dateStatus: '\'Wybierz\' D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: 'Wybierz datę', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + clearText: 'Limpar', clearStatus: '', + closeText: 'Fechar', closeStatus: '', + prevText: '&#x3c;Anterior', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Pr&oacute;ximo&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Hoje', currentStatus: '', + monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +});/* Romanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Edmond L. (ll_edmond@walla.com). */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + clearText: 'Curat', clearStatus: 'Sterge data curenta', + closeText: 'Inchide', closeStatus: 'Inchide fara schimbare', + prevText: '&#x3c;Anterior', prevStatus: 'Arata luna trecuta', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Urmator&#x3e;', nextStatus: 'Arata luna urmatoare', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Azi', currentStatus: 'Arata luna curenta', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Junie', + 'Julie','August','Septembrie','Octobrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Noi', 'Dec'], + monthStatus: 'Arata o luna diferita', yearStatus: 'Arat un an diferit', + weekHeader: 'Sapt', weekStatus: 'Saptamana anului', + dayNames: ['Duminica', 'Luni', 'Marti', 'Miercuri', 'Joi', 'Vineri', 'Sambata'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sam'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sa'], + dayStatus: 'Seteaza DD ca prima saptamana zi', dateStatus: 'Selecteaza D, M d', + dateFormat: 'mm/dd/yy', firstDay: 0, + initStatus: 'Selecteaza o data', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + clearText: 'Очистить', clearStatus: '', + closeText: 'Закрыть', closeStatus: '', + prevText: '&#x3c;Пред', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'След&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Сегодня', currentStatus: '', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + monthStatus: '', yearStatus: '', + weekHeader: 'Не', weekStatus: '', + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +});/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + clearText: 'Zmazať', clearStatus: '', + closeText: 'Zavrieť', closeStatus: '', + prevText: '&#x3c;Predchádzajúci', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Nasledujúci&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Dnes', currentStatus: '', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ty', weekStatus: '', + dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + clearText: 'Izbri&#x161;i', clearStatus: 'Izbri&#x161;i trenutni datum', + closeText: 'Zapri', closeStatus: 'Zapri brez spreminjanja', + prevText: '&lt;Prej&#x161;nji', prevStatus: 'Prika&#x17E;i prej&#x161;nji mesec', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Naslednji&gt;', nextStatus: 'Prika&#x17E;i naslednji mesec', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Trenutni', currentStatus: 'Prika&#x17E;i trenutni mesec', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + monthStatus: 'Prika&#x17E;i drug mesec', yearStatus: 'Prika&#x17E;i drugo leto', + weekHeader: 'Teden', weekStatus: 'Teden v letu', + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'], + dayStatus: 'Nastavi DD za prvi dan v tednu', dateStatus: 'Izberi DD, d MM yy', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Izbira datuma', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + clearText: 'fshije', clearStatus: 'fshije datën aktuale', + closeText: 'mbylle', closeStatus: 'mbylle pa ndryshime', + prevText: '&#x3c;mbrapa', prevStatus: 'trego muajin e fundit', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Përpara&#x3e;', nextStatus: 'trego muajin tjetër', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'sot', currentStatus: '', + monthNames: ['Janar','Shkurt','Mars','Pril','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + monthStatus: 'trego muajin tjetër', yearStatus: 'trego tjetër vit', + weekHeader: 'Ja', weekStatus: 'Java e muajit', + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayStatus: 'Vendose DD si ditë të parë të javës', dateStatus: '\'Zgjedh\' D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Zgjedhe një datë', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['sv'] = { + clearText: 'Rensa', clearStatus: '', + closeText: 'Stäng', closeStatus: '', + prevText: '&laquo;Förra', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Nästa&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Idag', currentStatus: '', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ve', weekStatus: '', + dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sv']); +}); +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + clearText: 'ลบ', clearStatus: '', + closeText: 'ปิด', closeStatus: '', + prevText: '&laquo;&nbsp;ย้อน', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'ถัดไป&nbsp;&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'วันนี้', currentStatus: '', + monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'กรกฏาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'], + monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['th']); +});/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + clearText: 'temizle', clearStatus: 'geçerli tarihi temizler', + closeText: 'kapat', closeStatus: 'sadece göstergeyi kapat', + prevText: '&#x3c;geri', prevStatus: 'önceki ayı göster', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'ileri&#x3e', nextStatus: 'sonraki ayı göster', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'bugün', currentStatus: '', + monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz', + 'Tem','Ağu','Eyl','Eki','Kas','Ara'], + monthStatus: 'başka ay', yearStatus: 'başka yıl', + weekHeader: 'Hf', weekStatus: 'Ayın haftaları', + dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayStatus: 'Haftanın ilk gününü belirleyin', dateStatus: 'D, M d seçiniz', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Bir tarih seçiniz', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + clearText: 'Очистити', clearStatus: '', + closeText: 'Закрити', closeStatus: '', + prevText: '&#x3c;', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: '&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Сьогодні', currentStatus: '', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','Лис','Гру'], + monthStatus: '', yearStatus: '', + weekHeader: 'Не', weekStatus: '', + dayNames: ['неділя','понеділок','вівторок','середа','четвер','пятниця','суббота'], + dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'], + dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +});/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + clearText: '清除', clearStatus: '清除已选日期', + closeText: '关闭', closeStatus: '不改变当前选择', + prevText: '&#x3c;上月', prevStatus: '显示上月', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '显示上一年', + nextText: '下月&#x3e;', nextStatus: '显示下月', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '显示下一年', + currentText: '今天', currentStatus: '显示本月', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + monthStatus: '选择月份', yearStatus: '选择年份', + weekHeader: '周', weekStatus: '年内周次', + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + dayStatus: '设置 DD 为一周起始', dateStatus: '选择 m月 d日, DD', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '请选择日期', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + clearText: '清除', clearStatus: '清除已選日期', + closeText: '關閉', closeStatus: '不改變目前的選擇', + prevText: '&#x3c;上月', prevStatus: '顯示上月', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '顯示上一年', + nextText: '下月&#x3e;', nextStatus: '顯示下月', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '顯示下一年', + currentText: '今天', currentStatus: '顯示本月', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + monthStatus: '選擇月份', yearStatus: '選擇年份', + weekHeader: '周', weekStatus: '年內周次', + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + dayStatus: '設定 DD 為一周起始', dateStatus: '選擇 m月 d日, DD', + dateFormat: 'yy/mm/dd', firstDay: 1, + initStatus: '請選擇日期', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-ar.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-ar.js new file mode 100644 index 000000000..52101e921 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-ar.js @@ -0,0 +1,26 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Al Horani -- koko.dw@gmail.com */ +/* خالد الحوراني -- koko.dw@gmail.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + clearText: 'مسح', clearStatus: 'امسح التاريخ الحالي', + closeText: 'إغلاق', closeStatus: 'إغلاق بدون حفظ', + prevText: '&#x3c;السابق', prevStatus: 'عرض الشهر السابق', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'التالي&#x3e;', nextStatus: 'عرض الشهر القادم', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'اليوم', currentStatus: 'عرض الشهر الحالي', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + monthStatus: 'عرض شهر آخر', yearStatus: 'عرض سنة آخرى', + weekHeader: 'أسبوع', weekStatus: 'أسبوع السنة', + dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], + dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + dayStatus: 'اختر DD لليوم الأول من الأسبوع', dateStatus: 'اختر D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'اختر يوم', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-bg.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-bg.js new file mode 100644 index 000000000..f11de66bc --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-bg.js @@ -0,0 +1,25 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + clearText: 'изчисти', clearStatus: 'изчисти актуалната дата', + closeText: 'затвори', closeStatus: 'затвори без промени', + prevText: '&#x3c;назад', prevStatus: 'покажи последния месец', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'напред&#x3e;', nextStatus: 'покажи следващия месец', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'днес', currentStatus: '', + monthNames: ['Януари','Февруари','Март','Април','Май','Юни', + 'Юли','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни', + 'Юли','Авг','Сеп','Окт','Нов','Дек'], + monthStatus: 'покажи друг месец', yearStatus: 'покажи друга година', + weekHeader: 'Wk', weekStatus: 'седмица от месеца', + dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'], + dayStatus: 'Сложи DD като първи ден от седмицата', dateStatus: 'Избери D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Избери дата', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-ca.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-ca.js new file mode 100644 index 000000000..414600f23 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-ca.js @@ -0,0 +1,25 @@ +/* Inicialitzaci en catal per a l'extenci 'calendar' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ca'] = { + clearText: 'Netejar', clearStatus: '', + closeText: 'Tancar', closeStatus: '', + prevText: '&#x3c;Ant', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Seg&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Avui', currentStatus: '', + monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny', + 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'], + monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Oct','Nov','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'], + dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'], + dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'mm/dd/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ca']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-cs.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-cs.js new file mode 100644 index 000000000..1f5118f1c --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-cs.js @@ -0,0 +1,25 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + clearText: 'Vymazat', clearStatus: 'Vymaže zadané datum', + closeText: 'Zavřít', closeStatus: 'Zavře kalendář beze změny', + prevText: '&#x3c;Dříve', prevStatus: 'Přejít na předchozí měsí', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Později&#x3e;', nextStatus: 'Přejít na další měsíc', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Nyní', currentStatus: 'Přejde na aktuální měsíc', + monthNames: ['leden','únor','březen','duben','květen','červen', + 'červenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bře','dub','kvě','čer', + 'čvc','srp','zář','říj','lis','pro'], + monthStatus: 'Přejít na jiný měsíc', yearStatus: 'Přejít na jiný rok', + weekHeader: 'Týd', weekStatus: 'Týden v roce', + dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','čt','pá','so'], + dayStatus: 'Nastavit DD jako první den v týdnu', dateStatus: '\'Vyber\' DD, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Vyberte datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-da.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-da.js new file mode 100644 index 000000000..525f3de3c --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-da.js @@ -0,0 +1,25 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + clearText: 'Nulstil', clearStatus: 'Nulstil den aktuelle dato', + closeText: 'Luk', closeStatus: 'Luk uden ændringer', + prevText: '&#x3c;Forrige', prevStatus: 'Vis forrige måned', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Næste&#x3e;', nextStatus: 'Vis næste måned', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Idag', currentStatus: 'Vis aktuel måned', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: 'Vis en anden måned', yearStatus: 'Vis et andet år', + weekHeader: 'Uge', weekStatus: 'Årets uge', + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + dayStatus: 'Sæt DD som første ugedag', dateStatus: 'Vælg D, M d', + dateFormat: 'dd-mm-yy', firstDay: 0, + initStatus: 'Vælg en dato', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-de.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-de.js new file mode 100644 index 000000000..ce8f78391 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-de.js @@ -0,0 +1,25 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + clearText: 'löschen', clearStatus: 'aktuelles Datum löschen', + closeText: 'schließen', closeStatus: 'ohne Änderungen schließen', + prevText: '&#x3c;zurück', prevStatus: 'letzten Monat zeigen', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Vor&#x3e;', nextStatus: 'nächsten Monat zeigen', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'heute', currentStatus: '', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + monthStatus: 'anderen Monat anzeigen', yearStatus: 'anderes Jahr anzeigen', + weekHeader: 'Wo', weekStatus: 'Woche des Monats', + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Wähle ein Datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-eo.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-eo.js new file mode 100644 index 000000000..42e9118ab --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-eo.js @@ -0,0 +1,25 @@ +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +jQuery(function($){ + $.datepicker.regional['eo'] = { + clearText: 'Vakigi', clearStatus: '', + closeText: 'Fermi', closeStatus: 'Fermi sen modifi', + prevText: '&lt;Anta', prevStatus: 'Vidi la antaŭan monaton', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Sekv&gt;', nextStatus: 'Vidi la sekvan monaton', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Nuna', currentStatus: 'Vidi la nunan monaton', + monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio', + 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aŭg','Sep','Okt','Nov','Dec'], + monthStatus: 'Vidi alian monaton', yearStatus: 'Vidi alian jaron', + weekHeader: 'Sb', weekStatus: '', + dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'], + dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'], + dayStatus: 'Uzi DD kiel unua tago de la semajno', dateStatus: 'Elekti DD, MM d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'Elekti la daton', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['eo']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-es.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-es.js new file mode 100644 index 000000000..7d0199279 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-es.js @@ -0,0 +1,25 @@ +/* Inicializacin en espaol para la extensin 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + clearText: 'Limpiar', clearStatus: '', + closeText: 'Cerrar', closeStatus: '', + prevText: '&#x3c;Ant', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Sig&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Hoy', currentStatus: '', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'], + dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['es']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-fa.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-fa.js new file mode 100644 index 000000000..0ce4c7c98 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-fa.js @@ -0,0 +1,25 @@ +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + clearText: 'حذف تاريخ', clearStatus: 'پاک کردن تاريخ جاري', + closeText: 'بستن', closeStatus: 'بستن بدون اعمال تغييرات', + prevText: '&#x3c;قبلي', prevStatus: 'نمايش ماه قبل', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'بعدي&#x3e;', nextStatus: 'نمايش ماه بعد', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'امروز', currentStatus: 'نمايش ماه جاري', + monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور', + 'مهر','آبان','آذر','دي','بهمن','اسفند'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + monthStatus: 'نمايش ماه متفاوت', yearStatus: 'نمايش سال متفاوت', + weekHeader: 'هف', weekStatus: 'هفتهِ سال', + dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'], + dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'], + dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'], + dayStatus: 'قبول DD بعنوان اولين روز هفته', dateStatus: 'انتخاب D, M d', + dateFormat: 'yy/mm/dd', firstDay: 6, + initStatus: 'انتخاب تاريخ', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-fi.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-fi.js new file mode 100644 index 000000000..8dc39c5be --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-fi.js @@ -0,0 +1,25 @@ +/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpi (harrikilpio@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['fi'] = { + clearText: 'Tyhjenn&auml;', clearStatus: '', + closeText: 'Sulje', closeStatus: '', + prevText: '&laquo;Edellinen', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Seuraava&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'T&auml;n&auml;&auml;n', currentStatus: '', + monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu', + 'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'], + monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;', + 'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'], + monthStatus: '', yearStatus: '', + weekHeader: 'Vk', weekStatus: '', + dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'], + dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'], + dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['fi']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-fr.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-fr.js new file mode 100644 index 000000000..512229d4f --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-fr.js @@ -0,0 +1,25 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood@virginbroadband.com.au) and Stéphane Nahmani (sholby@sholby.net). */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + clearText: 'Effacer', clearStatus: 'Effacer la date sélectionnée', + closeText: 'Fermer', closeStatus: 'Fermer sans modifier', + prevText: '&#x3c;Préc', prevStatus: 'Voir le mois précédent', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Suiv&#x3e;', nextStatus: 'Voir le mois suivant', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Courant', currentStatus: 'Voir le mois courant', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun', + 'Jul','Aoû','Sep','Oct','Nov','Déc'], + monthStatus: 'Voir un autre mois', yearStatus: 'Voir une autre année', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'], + dayStatus: 'Utiliser DD comme premier jour de la semaine', dateStatus: '\'Choisir\' le DD d MM', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: 'Choisir la date', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-he.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-he.js new file mode 100644 index 000000000..929e87c92 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-he.js @@ -0,0 +1,25 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + clearText: 'נקה', clearStatus: '', + closeText: 'סגור', closeStatus: '', + prevText: '&#x3c;הקודם', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'הבא&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'היום', currentStatus: '', + monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני', + 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'], + monthNamesShort: ['1','2','3','4','5','6', + '7','8','9','10','11','12'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayStatus: 'DD', dateStatus: 'DD, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: true}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-hr.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-hr.js new file mode 100644 index 000000000..597aa4ae6 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-hr.js @@ -0,0 +1,25 @@ +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +jQuery(function($){ + $.datepicker.regional['hr'] = { + clearText: 'izbriši', clearStatus: 'Izbriši trenutni datum', + closeText: 'Zatvori', closeStatus: 'Zatvori kalendar', + prevText: '&#x3c;', prevStatus: 'Prikaži prethodni mjesec', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: '&#x3e;', nextStatus: 'Prikaži slijedeći mjesec', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Danas', currentStatus: 'Današnji datum', + monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipani', + 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'], + monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip', + 'Srp','Kol','Ruj','Lis','Stu','Pro'], + monthStatus: 'Prikaži mjesece', yearStatus: 'Prikaži godine', + weekHeader: 'Tje', weekStatus: 'Tjedan', + dayNames: ['Nedjalja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'], + dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'], + dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'], + dayStatus: 'Odaber DD za prvi dan tjedna', dateStatus: '\'Datum\' D, M d', + dateFormat: 'dd.mm.yy.', firstDay: 1, + initStatus: 'Odaberi datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hr']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-hu.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-hu.js new file mode 100644 index 000000000..29f2ad375 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-hu.js @@ -0,0 +1,25 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquerycalendar@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + clearText: 'törlés', clearStatus: '', + closeText: 'bezárás', closeStatus: '', + prevText: '&laquo;&nbsp;vissza', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'előre&nbsp;&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'ma', currentStatus: '', + monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', + 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'], + monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', + 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Hé', weekStatus: '', + dayNames: ['Vasámap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'], + dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'], + dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-hy.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-hy.js new file mode 100644 index 000000000..2022efb49 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-hy.js @@ -0,0 +1,25 @@ +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +jQuery(function($){ + $.datepicker.regional['hy'] = { + clearText: 'Մաքրել', clearStatus: '', + closeText: 'Փակել', closeStatus: '', + prevText: '&#x3c;Նախ.', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Հաջ.&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Այսօր', currentStatus: '', + monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս', + 'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'], + monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս', + 'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'], + monthStatus: '', yearStatus: '', + weekHeader: 'ՇԲՏ', weekStatus: '', + dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'], + dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['hy']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-id.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-id.js new file mode 100644 index 000000000..7ff1a3a9e --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-id.js @@ -0,0 +1,25 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + clearText: 'kosongkan', clearStatus: 'bersihkan tanggal yang sekarang', + closeText: 'Tutup', closeStatus: 'Tutup tanpa mengubah', + prevText: '&#x3c;mundur', prevStatus: 'Tampilkan bulan sebelumnya', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'maju&#x3e;', nextStatus: 'Tampilkan bulan berikutnya', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'hari ini', currentStatus: 'Tampilkan bulan sekarang', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + monthStatus: 'Tampilkan bulan yang berbeda', yearStatus: 'Tampilkan tahun yang berbeda', + weekHeader: 'Mg', weekStatus: 'Minggu dalam tahun', + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + dayStatus: 'gunakan DD sebagai awal hari dalam minggu', dateStatus: 'pilih le DD, MM d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: 'Pilih Tanggal', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['id']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-is.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-is.js new file mode 100644 index 000000000..4647f37e9 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-is.js @@ -0,0 +1,25 @@ +/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +jQuery(function($){ + $.datepicker.regional['is'] = { + clearText: 'Hreinsa', clearStatus: '', + closeText: 'Loka', closeStatus: '', + prevText: '&#x3c; Fyrri', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'N&aelig;sti &#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: '&Iacute; dag', currentStatus: '', + monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;', + 'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n', + 'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Vika', weekStatus: '', + dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'], + dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'], + dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['is']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-it.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-it.js new file mode 100644 index 000000000..fb05f5f80 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-it.js @@ -0,0 +1,25 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Apaella (apaella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + clearText: 'Svuota', clearStatus: 'Annulla', + closeText: 'Chiudi', closeStatus: 'Chiudere senza modificare', + prevText: '&#x3c;Prec', prevStatus: 'Mese precedente', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: 'Mostra l\'anno precedente', + nextText: 'Succ&#x3e;', nextStatus: 'Mese successivo', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: 'Mostra l\'anno successivo', + currentText: 'Oggi', currentStatus: 'Mese corrente', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + monthStatus: 'Seleziona un altro mese', yearStatus: 'Seleziona un altro anno', + weekHeader: 'Sm', weekStatus: 'Settimana dell\'anno', + dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gio','Ve','Sa'], + dayStatus: 'Usa DD come primo giorno della settimana', dateStatus: '\'Seleziona\' D, M d', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: 'Scegliere una data', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-ja.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-ja.js new file mode 100644 index 000000000..1ecf40221 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-ja.js @@ -0,0 +1,26 @@ +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + clearText: 'クリア', clearStatus: '日付をクリアします', + closeText: '閉じる', closeStatus: '変更せずに閉じます', + prevText: '&#x3c;前', prevStatus: '前月を表示します', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '前年を表示します', + nextText: '次&#x3e;', nextStatus: '翌月を表示します', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '翌年を表示します', + currentText: '今日', currentStatus: '今月を表示します', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthStatus: '表示する月を変更します', yearStatus: '表示する年を変更します', + weekHeader: '週', weekStatus: '暦週で第何週目かを表します', + dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['日','月','火','水','木','金','土'], + dayNamesMin: ['日','月','火','水','木','金','土'], + dayStatus: '週の始まりをDDにします', dateStatus: 'Md日(D)', + dateFormat: 'yy/mm/dd', firstDay: 0, + initStatus: '日付を選択します', isRTL: false, + showMonthAfterYear: true}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-ko.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-ko.js new file mode 100644 index 000000000..b380311cf --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-ko.js @@ -0,0 +1,25 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ko'] = { + clearText: '지우기', clearStatus: '', + closeText: '닫기', closeStatus: '', + prevText: '이전달', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: '다음달', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: '오늘', currentStatus: '', + monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)', + '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'], + monthStatus: '', yearStatus: '', + weekHeader: 'Wk', weekStatus: '', + dayNames: ['일','월','화','수','목','금','토'], + dayNamesShort: ['일','월','화','수','목','금','토'], + dayNamesMin: ['일','월','화','수','목','금','토'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-lt.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-lt.js new file mode 100644 index 000000000..ab5ee859c --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-lt.js @@ -0,0 +1,25 @@ +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas@avalon.lt> */ +jQuery(function($){ + $.datepicker.regional['lt'] = { + clearText: 'Išvalyti', clearStatus: '', + closeText: 'Uždaryti', closeStatus: '', + prevText: '&#x3c;Atgal', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Pirmyn&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Šiandien', currentStatus: '', + monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', + 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'], + monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir', + 'Lie','Rugp','Rugs','Spa','Lap','Gru'], + monthStatus: '', yearStatus: '', + weekHeader: '', weekStatus: '', + dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'], + dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'], + dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['lt']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-lv.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-lv.js new file mode 100644 index 000000000..981d42b8d --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-lv.js @@ -0,0 +1,25 @@ +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */ +jQuery(function($){ + $.datepicker.regional['lv'] = { + clearText: 'Notīrīt', clearStatus: '', + closeText: 'Aizvērt', closeStatus: '', + prevText: 'Iepr', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Nāka', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Šodien', currentStatus: '', + monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs', + 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn', + 'Jūl','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Nav', weekStatus: '', + dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'], + dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'], + dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd-mm-yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['lv']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-nl.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-nl.js new file mode 100644 index 000000000..200974e7c --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-nl.js @@ -0,0 +1,25 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens <http://mathiasbynens.be/> */ +jQuery(function($){ + $.datepicker.regional.nl = { + clearText: 'Wissen', clearStatus: 'Wis de huidige datum', + closeText: 'Sluiten', closeStatus: 'Sluit zonder verandering', + prevText: '←', prevStatus: 'Bekijk de vorige maand', + prevBigText: '«', nextBigStatus: 'Bekijk het vorige jaar', + nextText: '→', nextStatus: 'Bekijk de volgende maand', + nextBigText: '»', nextBigStatus: 'Bekijk het volgende jaar', + currentText: 'Vandaag', currentStatus: 'Bekijk de huidige maand', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + monthStatus: 'Bekijk een andere maand', yearStatus: 'Bekijk een ander jaar', + weekHeader: 'Wk', weekStatus: 'Week van het jaar', + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + dayStatus: 'Stel DD in als eerste dag van de week', dateStatus: 'dd/mm/yy', + dateFormat: 'dd/mm/yy', firstDay: 1, + initStatus: 'Kies een datum', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional.nl); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-no.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-no.js new file mode 100644 index 000000000..e9a05e838 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-no.js @@ -0,0 +1,25 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['no'] = { + clearText: 'Tøm', clearStatus: '', + closeText: 'Lukk', closeStatus: '', + prevText: '&laquo;Forrige', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Neste&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'I dag', currentStatus: '', + monthNames: ['Januar','Februar','Mars','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Des'], + monthStatus: '', yearStatus: '', + weekHeader: 'Uke', weekStatus: '', + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-pl.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-pl.js new file mode 100644 index 000000000..b8503af84 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-pl.js @@ -0,0 +1,25 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + clearText: 'Wyczyść', clearStatus: 'Wyczyść obecną datę', + closeText: 'Zamknij', closeStatus: 'Zamknij bez zapisywania', + prevText: '&#x3c;Poprzedni', prevStatus: 'Pokaż poprzedni miesiąc', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Następny&#x3e;', nextStatus: 'Pokaż następny miesiąc', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Dziś', currentStatus: 'Pokaż aktualny miesiąc', + monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', + 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + monthStatus: 'Pokaż inny miesiąc', yearStatus: 'Pokaż inny rok', + weekHeader: 'Tydz', weekStatus: 'Tydzień roku', + dayNames: ['Niedziela','Poniedzialek','Wtorek','Środa','Czwartek','Piątek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'], + dayStatus: 'Ustaw DD jako pierwszy dzień tygodnia', dateStatus: '\'Wybierz\' D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: 'Wybierz datę', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-pt.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-pt.js new file mode 100644 index 000000000..484743afe --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-pt.js @@ -0,0 +1,25 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + clearText: 'Limpar', clearStatus: '', + closeText: 'Fechar', closeStatus: '', + prevText: '&#x3c;Anterior', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Pr&oacute;ximo&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Hoje', currentStatus: '', + monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-ro.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-ro.js new file mode 100644 index 000000000..5a0eeaf26 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-ro.js @@ -0,0 +1,25 @@ +/* Romanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Edmond L. (ll_edmond@walla.com). */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + clearText: 'Curat', clearStatus: 'Sterge data curenta', + closeText: 'Inchide', closeStatus: 'Inchide fara schimbare', + prevText: '&#x3c;Anterior', prevStatus: 'Arata luna trecuta', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Urmator&#x3e;', nextStatus: 'Arata luna urmatoare', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Azi', currentStatus: 'Arata luna curenta', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Junie', + 'Julie','August','Septembrie','Octobrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Noi', 'Dec'], + monthStatus: 'Arata o luna diferita', yearStatus: 'Arat un an diferit', + weekHeader: 'Sapt', weekStatus: 'Saptamana anului', + dayNames: ['Duminica', 'Luni', 'Marti', 'Miercuri', 'Joi', 'Vineri', 'Sambata'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sam'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sa'], + dayStatus: 'Seteaza DD ca prima saptamana zi', dateStatus: 'Selecteaza D, M d', + dateFormat: 'mm/dd/yy', firstDay: 0, + initStatus: 'Selecteaza o data', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-ru.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-ru.js new file mode 100644 index 000000000..d52248347 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-ru.js @@ -0,0 +1,25 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + clearText: 'Очистить', clearStatus: '', + closeText: 'Закрыть', closeStatus: '', + prevText: '&#x3c;Пред', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'След&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Сегодня', currentStatus: '', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + monthStatus: '', yearStatus: '', + weekHeader: 'Не', weekStatus: '', + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-sk.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-sk.js new file mode 100644 index 000000000..315f60b94 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-sk.js @@ -0,0 +1,25 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + clearText: 'Zmazať', clearStatus: '', + closeText: 'Zavrieť', closeStatus: '', + prevText: '&#x3c;Predchádzajúci', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Nasledujúci&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Dnes', currentStatus: '', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ty', weekStatus: '', + dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-sl.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-sl.js new file mode 100644 index 000000000..36eca54bf --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-sl.js @@ -0,0 +1,26 @@ +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */ +jQuery(function($){ + $.datepicker.regional['sl'] = { + clearText: 'Izbri&#x161;i', clearStatus: 'Izbri&#x161;i trenutni datum', + closeText: 'Zapri', closeStatus: 'Zapri brez spreminjanja', + prevText: '&lt;Prej&#x161;nji', prevStatus: 'Prika&#x17E;i prej&#x161;nji mesec', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Naslednji&gt;', nextStatus: 'Prika&#x17E;i naslednji mesec', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Trenutni', currentStatus: 'Prika&#x17E;i trenutni mesec', + monthNames: ['Januar','Februar','Marec','April','Maj','Junij', + 'Julij','Avgust','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Avg','Sep','Okt','Nov','Dec'], + monthStatus: 'Prika&#x17E;i drug mesec', yearStatus: 'Prika&#x17E;i drugo leto', + weekHeader: 'Teden', weekStatus: 'Teden v letu', + dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'], + dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'], + dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'], + dayStatus: 'Nastavi DD za prvi dan v tednu', dateStatus: 'Izberi DD, d MM yy', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Izbira datuma', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sl']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-sq.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-sq.js new file mode 100644 index 000000000..49a1ac66f --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-sq.js @@ -0,0 +1,25 @@ +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['sq'] = { + clearText: 'fshije', clearStatus: 'fshije datën aktuale', + closeText: 'mbylle', closeStatus: 'mbylle pa ndryshime', + prevText: '&#x3c;mbrapa', prevStatus: 'trego muajin e fundit', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Përpara&#x3e;', nextStatus: 'trego muajin tjetër', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'sot', currentStatus: '', + monthNames: ['Janar','Shkurt','Mars','Pril','Maj','Qershor', + 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'], + monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer', + 'Kor','Gus','Sht','Tet','Nën','Dhj'], + monthStatus: 'trego muajin tjetër', yearStatus: 'trego tjetër vit', + weekHeader: 'Ja', weekStatus: 'Java e muajit', + dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'], + dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'], + dayStatus: 'Vendose DD si ditë të parë të javës', dateStatus: '\'Zgjedh\' D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Zgjedhe një datë', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['sq']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-sv.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-sv.js new file mode 100644 index 000000000..c51cc9611 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-sv.js @@ -0,0 +1,25 @@ +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +jQuery(function($){ + $.datepicker.regional['se'] = { + clearText: 'Rensa', clearStatus: '', + closeText: 'Stäng', closeStatus: '', + prevText: '&laquo;Förra', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'Nästa&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Idag', currentStatus: '', + monthNames: ['Januari','Februari','Mars','April','Maj','Juni', + 'Juli','Augusti','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + monthStatus: '', yearStatus: '', + weekHeader: 'Ve', weekStatus: '', + dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'], + dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'], + dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['se']); +}); diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-th.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-th.js new file mode 100644 index 000000000..8801f85d6 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-th.js @@ -0,0 +1,25 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + clearText: 'ลบ', clearStatus: '', + closeText: 'ปิด', closeStatus: '', + prevText: '&laquo;&nbsp;ย้อน', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'ถัดไป&nbsp;&raquo;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'วันนี้', currentStatus: '', + monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'กรกฏาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'], + monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'], + monthStatus: '', yearStatus: '', + weekHeader: 'Sm', weekStatus: '', + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd/mm/yy', firstDay: 0, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['th']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-tr.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-tr.js new file mode 100644 index 000000000..c4e115ef9 --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-tr.js @@ -0,0 +1,25 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + clearText: 'temizle', clearStatus: 'geçerli tarihi temizler', + closeText: 'kapat', closeStatus: 'sadece göstergeyi kapat', + prevText: '&#x3c;geri', prevStatus: 'önceki ayı göster', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: 'ileri&#x3e', nextStatus: 'sonraki ayı göster', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'bugün', currentStatus: '', + monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz', + 'Tem','Ağu','Eyl','Eki','Kas','Ara'], + monthStatus: 'başka ay', yearStatus: 'başka yıl', + weekHeader: 'Hf', weekStatus: 'Ayın haftaları', + dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayStatus: 'Haftanın ilk gününü belirleyin', dateStatus: 'D, M d seçiniz', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: 'Bir tarih seçiniz', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-uk.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-uk.js new file mode 100644 index 000000000..59c3d71cc --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-uk.js @@ -0,0 +1,25 @@ +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + clearText: 'Очистити', clearStatus: '', + closeText: 'Закрити', closeStatus: '', + prevText: '&#x3c;', prevStatus: '', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '', + nextText: '&#x3e;', nextStatus: '', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '', + currentText: 'Сьогодні', currentStatus: '', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','Лис','Гру'], + monthStatus: '', yearStatus: '', + weekHeader: 'Не', weekStatus: '', + dayNames: ['неділя','понеділок','вівторок','середа','четвер','пятниця','суббота'], + dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'], + dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'], + dayStatus: 'DD', dateStatus: 'D, M d', + dateFormat: 'dd.mm.yy', firstDay: 1, + initStatus: '', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +}); \ No newline at end of file diff --git a/js/jquery/datepicker/ui/i18n/ui.datepicker-zh.js b/js/jquery/datepicker/ui/i18n/ui.datepicker-zh.js new file mode 100644 index 000000000..d24ee268b --- /dev/null +++ b/js/jquery/datepicker/ui/i18n/ui.datepicker-zh.js @@ -0,0 +1,25 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + clearText: '清除', clearStatus: '清除已选日期', + closeText: '关闭', closeStatus: '不改变当前选择', + prevText: '&#x3c;上月', prevStatus: '显示上月', + prevBigText: '&#x3c;&#x3c;', prevBigStatus: '显示上一年', + nextText: '下月&#x3e;', nextStatus: '显示下月', + nextBigText: '&#x3e;&#x3e;', nextBigStatus: '显示下一年', + currentText: '今天', currentStatus: '显示本月', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一','二','三','四','五','六', + '七','八','九','十','十一','十二'], + monthStatus: '选择月份', yearStatus: '选择年份', + weekHeader: '周', weekStatus: '年内周次', + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + dayStatus: '设置 DD 为一周起始', dateStatus: '选择 m月 d日, DD', + dateFormat: 'yy-mm-dd', firstDay: 1, + initStatus: '请选择日期', isRTL: false}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); diff --git a/js/jquery/datepicker/ui/index.php b/js/jquery/datepicker/ui/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/js/jquery/datepicker/ui/index.php @@ -0,0 +1,11 @@ +<?php + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/jquery/excanvas.min.js b/js/jquery/excanvas.min.js new file mode 100644 index 000000000..12c74f7be --- /dev/null +++ b/js/jquery/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/js/jquery/fancybox/blank.gif b/js/jquery/fancybox/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_close.png b/js/jquery/fancybox/fancy_close.png new file mode 100644 index 0000000000000000000000000000000000000000..07035307ad435f8f2f8eedf0bce50f7ec8a858c2 GIT binary patch literal 1517 zcmV<J1rqv+P)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I000HFNkl<ZNXMO5 zYfO_@7>1To%f)hA(E>uTT$~N#GA0orBqo9-jKM;POccZrXJjTzge4|Sa0ca~7y<+{ z2m7~>41(Jqf9L`mBM6zAjf4;hkjP@@B~d6Xz385|dB5iCM=Ro&JZZmk-uHdZd2i=@ zK0a@Md;u9DFE7t8BO^nxckf<*y<V?uYikSa?(PnvcLL3kj3CdtTYgAM4k&<aNl8h; zr%s*HT)TEHuBD|#UsqSR`|8!JANTe3?aR!}jH#}!j=6B*LNtCqz!O9|tSjHj0!WZn zt|TLe4js~5zkc0t_wHTe)2C0bSgqEHH<HI@v)zC3;>C?SckUFGmX^jwM@NV80+eiP zQ*s##s^a3}Ldwd@cHO*r^T5i=%Fj}=Cr_R@78e&C((#usU;YFS>C)2Dw4tG)YO=*P zWt;6ZfL46;=u!R1$jGM-hhvcpVyCa+S}Q!T2ALHx;BHe#M~BsHHos=s2iW})#C?}q ztqvud-gYjKs<v<69+sb<uOA#7EP;)6GIaa)ZF_8N?5dPdisa;E)AaPTUD!SJzQ9-< zldC+D%Q+tEl#~=*YinzP-ELnZ<^KMDt6VN$*^E>G$zHm2X<Z=i?d>hmYPB(Bn>kzw z=gS!w6cG`jJ$?H00VK+=!cMnBDn?IFkCkj7KmNq~hrkZvU@n=EP}|7Gxw*M}1_lPI zNx@_?IS^|%_ok<(o3gXBH^f+@(X7_g)K~%n0$gMM{{Ab=%gZ*hH99)_Eo>!VJd8_C zE)WMoNsBB#u&}W3BMEnPby>y64F-cra9>kX)4DJoA0KZ5fitNn`NTT4wY3%+fA;Lz zZ+K4ucJi+Mg!m%<>Ug8kSg^LX_JD-5va;NEM#+V_H)8UHgaj8UJ?LiZVx92t@KxlB zb1oz#Bo|{kAO!IDVfOII$VfwRad8C+y?XV^;VEu~g@tQka>%(zhlYl1p7P=0!-vj9 zYiMYw3l0uW##jWq+eZ-;6r@4F%{+PX<X0p#H#cYZmNZ0eu~^)ihBs2ety{O&IlHd} z1_pkFu}Cg09|hvO6EWP6URzH>Gcz;xx78|Q_F7Eb+}ynGO@4TI*h!27r4#SzfR=K~ zhtpe&%-o-olT$}R&!0cHdm}}wbdd`2lO~)PlarHXnm>2$+(ng2^$EtJ+=vwl#Xg-* zSA%x<9|=lJ3CXuACMEY46&1O~{LGm%7HKm<?{=0H8q=5H*g(7!gPDl)@%j1rF%mp` z_N<!`%5qOJ6(=0ptWB&#eVq@Kzwv$q$dI~P1LD-g#Kdx(v){9@P23QKx};r66NwH9 za<$Y;V`F2^+W!R)-b(?u<Z_l1ut%v>8lhZ|+Pv?nF1LcJswy+L%zshO4HzpR4skij zxq<8a{QPpl!oq4$R(*n7$-q`gsjcF2;NWZ?##l9wBW)lu_Bpk)RJgGO&Ey+2dDr3J z*x2~aJFl#)G^5U)q~qh`_b^ru6q9Xf%arlfse$W(T#z5f?cqE0>k)x`c6QcMUS4jN z#$B996B84z1O(|{7{3S{Bb#j7?T~OCi+pq$fP9eGqJ%Evk~i}B@#8tcAnk_QAg)9f z!qn81MJO5W0n6>}?Q|$y25QL`+uU$0x?KbSI<(UOBavf=wCW!^J3Ie)^yty-8!yk& z($YLG4fjwT{k&5mHL@*_7Xi1c4?x$HT^y5qc2zyPPCG3CUKl!f@Zj&~&!7K?fD>&z zDk^G(=74sN=`q$#Wm{gaK5myi7K~vRQ8s=CoB+NC8j<}iKpXzI(SMmt*2r@wST=`s zW7t-}X4hPqXy<B<%Whsd89NMo4pab@j0zq*%rdF0vx9AHdcBo?MJTz<LfJ?xkjOhp z<&!3z{~LHNmSsa(SNT3)6TTu3DA<UK-4-Z80M98|)=%{P^j_ako))ti-s$-tv=1s~ TaV>3W00000NkvXXu0mjftFGKG literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_loading.png b/js/jquery/fancybox/fancy_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..2503017960b3972499d3aa92f89953935ae40934 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_nav_left.png b/js/jquery/fancybox/fancy_nav_left.png new file mode 100644 index 0000000000000000000000000000000000000000..ebaa6a4fd34e51575a01da366312c20618985cbc GIT binary patch literal 1446 zcmV;X1zGxuP)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I000GTNkl<ZNXM;L zYe<_{7}ms?#!KUEvBqoG%-S_LFLRZ)N>R`@usIzf?P{x4#0gFqr~|<XPHerjinPTs ztNS;EP3-o^A3Ah%Vq4bMtstVPphH#_YRtu$*gbD}Khc<&wA+D)<ec-K_c`aio%4Bk z9Ns(u5#jv#^Iplx$&yp2PI;@<YH4e0tM8pVcl@YNpgEEe<azCDH(DeHB*2jqCr<d6 zmzOJU-@YBw+}y0LtgJkK>(;IJySuwjr=+Ar78e&sHZ(Lu;P)*wKU%|U#jmpg5~Q6= zNl8{#mZGz>Q!_F$qJ8n=#Z9x>Jn_n|ZEtTsSzllOW_Wn`!@Rt_=!l4jAl`tKb-5%L zv7js_CMF<1KR>Fcr{|nbr~AR4Y-MG|y0EZdwI6@^^5yrikSZ}TQ5hH*C?{R4Q{?KT zKD6U2SFWfB2M0g0TCEGD5GUP%Y0a>J0W!M1fVuVU?d@ix(YV91PjUK7@OzY8E)OJ~ z&Q30n%8njA8kC)#t?uvd&xMXHQZzI)WQmTB-n1vQM_gQ-{_*3-7UA?*_bJ9=m|W(F zT+IHE$H&L3T3T8zSS*%BTHM>)YZi;eI#;9uNVch|X-go#ckf=VQmKq2-ORBYaGo52 zejy<t%8H7La|o25g_F7>g&!SS;_ltMX3~N9_#ORsfn&tMTp}T$j*yAd)6-A(_4O6g z0=-^ug|9bVkxorbSsNQ0x9sP<y}fnI%gfuOYjkw<E9iO$<3XHiVu9G#$HzyBC_Xno zKmQ#GcXf4{4<k)VO42VbF4}^LejUk_m6e%jesy*A7xd$SFg~@H;9vM({<c=Dy<jjH zo|15CYO3KdQl!ler_T=c9mxd;2X7))Y`zW%2uR163J3taJ(xW>G&EF`laq6qgf=!d ztnQGKnVtDqz_Vx1Y=Kr=TU+Vx?;nS;5H`1m#Lv%9fqI)#T3Y%!3C+yRSpE-E!h;77 zwm7<P`uh65hp|vjEe{F&8>Z1{&Y;%TkkIqz&m9sAKBbnCkzsHry#@vbY{a-wI?zu7 zloV4Q9NtQWLUAT7Ev=G-*4EZ6|HZd^F*!MDB>C#<>PDGN_5sGi_Yq4ZlG7@css!ck z9};wyN<s>`LrygSGPaaLVfqXl2Z+Nkm;ygvo12>(Bf+YwDwC`Hbwy5foiCI>(Z2*F z+nZVe;)K}P*aF<M-?H#Fe6Mqd+*uxvjg9GP{wFl_^MHN9WlJaEq*N-^!o)SGI8SH+ zUKv~NRIZYek^|N$Dk?H^$^0AnT#K;_#IZM>#9Y8tUS3{lK|w(!NULrkdP#x17leSb zXU`h&IIwaw4`8eqNV6{>BDOh|vjhZ0E{e&QDDu0Pe|>%Zmb;{dg@s0w$z&rPA0K~+ zu^J$UblaCq5g(ljxEe?Y`8AmFYt-vOfqZ&;+Eh?bV07kp3Z#jN34<UH(mycX2wWwd ztb5-jv3o7@)ujQlL0*RXeFKlY!KJ0889^bPhRPtGL?*(cM~_TG%5V)>Zfk3!OW_7k zM!Hz%fopN!Lja&lI}y+lIZjBszTeT&@!Ra|?DQ)q4Us*EN5ey8M=zh0NVTlX;X`2G z(+8kuN)-Dfn@v@Ns?$arfE9ks%*_0?uCDGc0&cYN@bK_KngiO{r&oDx0_$@6^x5~= zW5Gx^5k=$2z;)mYpdQiR47B2ZEBzOVMD;v(on_N_Z6xdRarMj<?K!!e{c@alPRcF< zp8%JELdIntyT~#Lyyh6|aQVEo|B8@ungz0wXdsqPlE61j693omTr|rD@>=Ped`)=n zv4Dh?$k=SYcJSdjDa(58`F?t%ZzxBbaRs;9zaA#)un(S!5dZ)H07*qoM6N<$g4RXF AD*ylh literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_nav_right.png b/js/jquery/fancybox/fancy_nav_right.png new file mode 100644 index 0000000000000000000000000000000000000000..873294e969db9160f5ddd4e1ab498ff60b080e3f GIT binary patch literal 1454 zcmV;f1yTBmP)<h;3K|Lk000e1NJLTq0015U0015c1^@s6J20-I000GbNkl<ZNXMmD zZAhC}6t;;mjnT$L7i;{?nyH<^`7u|iRZ0tL1DmU(NS(H|E#d?xOw>Wa6<o3PyNHUT zo$lWdHnH2E{?Ji3C;ecpZi0xSLLD-zP&FUMq}_AEc}3I2r0ok2$-VEn&vWm&=bU?A zAD_LSeSnB?{P=O-)YMc-LPCO{PN$PLH8sgQJ39lYO`vyVBiQrU*M4Y_7?1$_<Kp51 z%gV~sZEbBa4Gj&tii(Out*xye_Vn}|NlQzMEGa38yn6L&1b*Ma6F_5ltoU^%K!!AP zDUoDnXRB}Cyr~}^9yTm5FW<0Qtz$2po~^B|$E&NW-wh27eVm`49~}`9q2dWhnaiWN zhz(^iF)=}B&YX$5ef##Y_4W0ioW+)wmhAKM^LFR{=g*)22oGtKlan<{rBXp$%qjA; zQh%CpQBjd@aB%PwyWKudgjnedxYh~}m|(NM6L7b&rKQDcHk)6t?Gvp2EcQK0p-?D^ z)7{DiQQ3h52UIyZIlBJ-{?p*tB%-@_@7kiHqc@xdoe>`&Z+!IVkxf`V#(j>y7#5eg z5*PD+C=wGBwT+F9xi*_^fd=>X_FBba@wz8b0c3ma+O<tVyt}*mv__+eByQH&4!C_B zfdL^QA)4~?@?!{;Uxk&r62;za5cZltS67#nI1nFyqWwN_kTh6JBm~rca&cBx*5SUs zz7iT>G#c&LYnSBp_4S(*6BG8m#QpsI))yBSw}|WBy?ft)>pk?VIMu|0u-xC@UxO$< zHa9o-0~vR8bXeVyB61x;<Vn1=wA4a&&z?Q|4edlAj92X|>@W6T@vgyO$TgWvPslhu zJ>BGvFeN3$D2UT9wO!c-2M2E;RvddB6cm(&J}nRg`1!DUaA;_#J})n?kc`&W*6f~w z$XoI8@o`6>)z;Ql1O^7iqc4Qr?IQ^Y2vDQmrd_^#`AagIo}RXO6Tw=o)=2K&OZ?8A zJDVKcH{^2p2j~ms)bf#Ff5Y^8{ZZ7~8Zw%koV0nHJ||9`FbS!%u(0sL`TfAafI}Du zN;}#qfQDkqhr?T=R;!O@W@c89(aOq-SHe5pO)Do4INRL6f8R{+tE;Q)Wir`E=nLN^ zERjf#VBjT`yZ^}0T`IW~brs!I17PDwDHNtJpz(@u7&_Ci&*x`nXGh4eva-_hHlhTo z>wKX6jrLg})!Ef*2q(qH#unh5y~V~`*!#E2<B^dOBia3e2km@dS8zGf2{<g3N)2#v z4JyuK8h~5IrYpj#swxY(w)PUeaN&ZPOXk1G=UVjTlE%(-5_199`uh52s#K~=NUI(p zQi;IZ2p5o%kzvB+z|PS;fW8tS)470%*ymKvk`NH5QB1x@k>5W2>+0$@y%jAkE;d^% z7KiBQ=;#CV)c|?K?OZZNymTtyIv@+;=i$b0QLhID@u{gPOF=<_+1<WVAdQWUZRa#Z z|3ZH~aE>^cd)FbceJt|Pr3Z2#UW)pC9hbbpr%#_w3xu>9DucKZSqKjwKC}oa!!=;B zxw)ARh3h~maWUsB$KtMw06>R!GGHKatdM5?eS3TRA2TyEQ!m{-s9LkQG(13d^zuqc z)WBRWF9N%+J^)=)qIgeo*i|*CI?Xfzc;V-hCr|!<<;s<R2sqJ3!^6V|=^fC_dwPz? zCNY=WtIw{>9veooizpgD1ug<#0d<J}2A~Q5o9MqtB&y?g7uhzG$3`-jzo%=iXvfMG zyf24%=0tW1_zWlniW!C6cZzM2c+5fO@OZs-{)&)tnkkti8i?hUB=Jd;!vFRBE}CtX zJXZQ9UlaRwctFA=GIpEX3I6;}%C^2czMtOc8_LyWJi)8ye+F~v<)btZr2qf`07*qo IM6N<$g1U{<%>V!Z literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_e.png b/js/jquery/fancybox/fancy_shadow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2eda0893649371f8d92b92976d8542cdd1b601ed GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W@!3HGnP3ltxQbwLGjv*Y^lSRZuw<aVc{9r!v zzu||u!2i}q_dR~t3;b_b^^^VS|K?ZB8~^XG_{w!8oq^%4vdDkV`fo3Qx*0rO{an^L HB{Ts5hz}+y literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_n.png b/js/jquery/fancybox/fancy_shadow_n.png new file mode 100644 index 0000000000000000000000000000000000000000..69aa10e233b039077e7dc600177ddb1eb46217e3 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{H!3HFK_`(+gDML>e#}JO|p{EaWGAM`~zK|Yh zF7SQ+m+Ig>B0@o-N8?trihfzZ+Vp1~`{zf0o*#X0$hUAi%N$P)W1wCJ22WQ%mvv4F FO#q)zAp-ya literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_ne.png b/js/jquery/fancybox/fancy_shadow_ne.png new file mode 100644 index 0000000000000000000000000000000000000000..79f6980a3ba5c43de120d963dbba2516b8f27ac7 GIT binary patch literal 347 zcmV-h0i^zkP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0003ZNkl<ZILob+ zYmUP(2!scm9HHv{Z@20hg4sW&`WCrWD{Ukze&AtXz?PZ%&(H3+n@gIzGf7{0`*}Q6 zU?$1ez5~p@W$0it0aj-To6dgw9c$1i7D%OG!a>dR9Yb&V8f!h)aDezHAsc|y@|hdQ zYJb}?8~~zFbQ)ku!Ey)KSukutuvdZ@MKMX|x|A3tPyx?YVhN^6z!Mi4Mj2f#%<;nh z2{>?YAzu|{u^;Oq!;f7Z4tPBpJEmZ+^GZ#$=9nz(K+UmK7}|u&EPi%aRt_C3qOFB_ zHc`~N>51%{?ijG?xsHt>MwRChgk=x_z0gh3O2xSL)-6?+2LKZL74~Q>MZjWtwukkA tvjRC=&j+0R$&bLyT7MhBcTXDISHC&xXU0&5CWHV0002ovPDHLkV1fX+la~Mh literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_nw.png b/js/jquery/fancybox/fancy_shadow_nw.png new file mode 100644 index 0000000000000000000000000000000000000000..7182cd938ae98e7e28c65a0bc55df576042ff9f5 GIT binary patch literal 324 zcmV-K0lWT*P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0003CNkl<ZILob+ z0SbdK3`LtX^$4>2-&4CO{qhKP$XKD&mgeXEM77>~`RA}h@U^Z##eQZVtM>a-K?QT4 z&(8BFf(rD5V61)2I__wHYuRwoaDIqw5Vdr_JSDVr){#J@r;{vbDL|tRyCiirf~4OF zX-l=Ecm>@yR)1nSMt~dy90Zb`^`)TQbhf8jR@fA!l6V$musRyB9Y{p$SCW}!$3==V zk)fW)Xo{s^ez$t+XhmZj;ts)!kTok<c^04|Sp~$jhS^pDUB$D=oTAxsnTV<p4fKK4 zNSd2c)Ay-YB9Np_#01msEE@t?H_Zjs10X&l++nv(x=EqHe!2VGMEci7vK?tQ04#6s W>vmM>z)zt70000<MNUMnLSTa1AdgxA literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_s.png b/js/jquery/fancybox/fancy_shadow_s.png new file mode 100644 index 0000000000000000000000000000000000000000..d8858bfb78efb8d7268736920efa1eae8873f89c GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{H!3HFK_`(+gDKk$O#}JO|uBQ(2HW&yTIgq$g zagp$^d~T7VKYI4JH)Z!&uXw<ncKMol#jdq^(f#w%3)s9ve=?Ts5l(saxU?N;0)wZk KpUXO@geCxTMkF=> literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_se.png b/js/jquery/fancybox/fancy_shadow_se.png new file mode 100644 index 0000000000000000000000000000000000000000..541e3ffd3e88224b34a4d2097c66a780e6060aeb GIT binary patch literal 352 zcmV-m0iXVfP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0003eNkl<ZILnPx zQEo#q2s6B1q1rim{|imM!P*4&1D)scq(+LOB-pV5#lEiB8-QK&0U!bV)PB|M`vmZ; zH30+wt2=z(@9-jd)}axQ0SUnIH@v3N9sqC=f<^lfV$h>{pM9=`y8<_<TSUg>I<ghE zvLrB*Cs__s16iX97ZIUy8iUPEkD0_6=WtQ=I#6vcQP-=HgBRh0z@R+sfj}*%Ch|fA zaZ<S;u-=(Gic47q0ha_XDu|PlvD!^|NMI{HNTu2|ItwN=Nxn&icM<p5L8LJ$<bLCz zC@`e?T@?QtE<G4z#i<8FESgmNO(83Ll3J%+Zo=8rGEE3lX_PM$5|_3bNqtDHf~Ik* y(1(B+eif5_o;>vWD02WY@RZ<9dgjNmAB|sYF}Xw>7Sq@O0000<MNUMnLSTa0oRGBu literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_sw.png b/js/jquery/fancybox/fancy_shadow_sw.png new file mode 100644 index 0000000000000000000000000000000000000000..b451689fa7b57b7432820e4c06d0864c143c79ab GIT binary patch literal 340 zcmV-a0jvIrP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%0003SNkl<ZILob* zQEmev3`Cz{H@QL7``>eMf9z;FC21=)67q_`W0*0KnS4AR00W2`RGn3i8UfsEegLO@ zPhds?2e1Tm)FK3=bymIAx?X=YFo3Mdh7W<X(zEJK)}8{4uq!tx`w9X?=5(B*cqp(p zTm}e%&W*2n=vLvZs$Q<TW?CS;3Z)fx5NRq?x}af0)IB@IL(%r>?@I#8s#svp!&PB> zwah<EovWVO9S&@jSlX>@Ngd|l0N4SCfzvjtQnd$dZ0yM)N$X+lqdtN!Pt{Wn*_<zW zvsH)K(f`E`h=emGB(+1;sh{6~*cFFuSfb|Iq|Q5_2eK@Xw7K;TxND=>`0U}m1^#r1 mwpaW{;a?9KKt^WrpTAEd?0j1W(3L*`0000<MNUMnLSTYY!jj4W literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_shadow_w.png b/js/jquery/fancybox/fancy_shadow_w.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4e4a887f18384a204563c0048c9cd1328f7faa GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W@!3HGnP3ltxQhJ^)jv*Y^lmGnxZ_mu((a~wh zq?x9`cF~7N-~dyqv9qD|6t>P{ho=rRL|66mGO)=r*Hk83F#~lnc)I$ztaD0e0sy?& B8X5oq literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_title_left.png b/js/jquery/fancybox/fancy_title_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6049223d1ec6af46e100499c01f6489c9e2c6240 GIT binary patch literal 503 zcmV<T0SNwyP)<h;3K|Lk000e1NJLTq000jF001Be1ONa4XC>+)0005LNkl<ZD9??P zO(?^07{|Z%W=v)qQ^LF)MiS+%ykt&Z4;<VmvK^enX*E(xaly@TC*>qcp<H&*;%GUH zSSwb<w5iEU9?#$Z?`8Y{SAM_S|MPpE|MPsG?*qtB245A_&_F9kD*mj49tPwhFBPd7 zWy82^54mI8&w*s9MHa_c?>9&~$uJw{{r<S0=$-bSoRQY>Uub~E?-XJ#Upm4Fe%-Gl z!u%tb0N102a|s5;SPlQvJlFCTBbvYaK@wIW6Gjx@?i20AlVDJcHNfh25WRlbF6CIq zv9_ZnqOH`}ppaUR0@%ZcM9zpDt2uQM>f+Z#wIMmyuui3DeoYXWE|hQ{D$te=Yhgkq zIvyj+$t8T|S1wITzUftNOe(E+Qjn$kDotY;I5}1lRgwi=?K26ke)djLR5W2|!7CVH z<stJtbtHwTf&-(z6S*D4ftH{iJ(zHLPj7@AyYVr}OrjkuC`TjuFagg&AlZtdnF_f7 z26STt(=}_WK40h}`fWwQ-#PrCj9cu)AjUBT4;FuoEIeSZqL_<p<T3{^j8XX-7-3}< t?VP0<?MnN_ON4w@(#E6u{|YKB@F!Z~63BzUt+@aI002ovPDHLkV1h7a;{N~u literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_title_main.png b/js/jquery/fancybox/fancy_title_main.png new file mode 100644 index 0000000000000000000000000000000000000000..8044271f29b5d4e4471570e75cdce90bf9a1497c GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfw!2%>J-`tuAq|`lK978y+CnqGNCkUke_%Gig ukvFM-ftpWh!il7Wg7kz7Y?7xB@G*olNlgoj4E_Yv!r<xZ=d#Wzp$Pzd&l|D; literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_title_over.png b/js/jquery/fancybox/fancy_title_over.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f458f4bb8770466e44ba97dd8fe1f2936090db GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9<t|uoXBt-BqFsxu$a&+Mg Q1)v0jr>mdKI;Vst0Ha3^zyJUM literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancy_title_right.png b/js/jquery/fancybox/fancy_title_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d9db2a7c6e570aec993d3665cbc13620115e2 GIT binary patch literal 506 zcmV<W0R{evP)<h;3K|Lk000e1NJLTq000jF001Be1ONa4XC>+)0005ONkl<ZD9?RU zODKd<7(HgjV~o6q62@bJB+9EiGFF}o7IqXF3oEfwNGZhzJIh%qD^Ut%GYd^D$zq6U ziYfBQsF6pmbIm{cXa0ZOZ+Xu5-FwbG9}o`{j4&XMrE}7e3Ja2uK$<~Ac{_XA_D(OC zAq~l-7^5gcIS(7i;T$tBQxlqe4*%Zk7YPCPeh)G^BZA<O)#|%?mowZBWbq{`f+tj# zi}fc-I2uE?LQuo9=I@30e3@(H6=v#)i-O_V2?%kwk9_J#4E0CAwyTeCA*StAVF~qn zB5RBNM@z7=KS2j}_=WHtq6}6#Y0$t`UOI4tYUFXeQ3GdO3h@y{0}AP(DHhy}5`LCR zclfg(ttdqX&Cz?>xjQB-g>5=x46nGBwseihc$zfz<QToW!e;p;!C=c2+BLQ$UaUOI zP%JpnkNPN6!*Ot(U<h`UBUky7Cf~4sHz4~?Z^xV%MJH-d@b{tNC?1?)hF~}9P|QGu z<8b-p@~*ln*D#4ebfA`ct?Do>vTFh(=tCRj6cJ4M&ASrCAq-HbokPnRBAHVa2(-|l wYU(UxfYLN;K<jOEC|g+~&7S?gg8wh@4{Jmc$jZ#sod5s;07*qoM6N<$f@3$_C;$Ke literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancybox-x.png b/js/jquery/fancybox/fancybox-x.png new file mode 100644 index 0000000000000000000000000000000000000000..c2130f8698f682d68b1550bffedecfe19eaa1a81 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^j6m$c!3HGFo#yKTDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MY*0Xjv*Ddw)7kFH5l+P-xcE$W)3=fYI&uMKVzWNT*W|n zhqlRY)q0r(8Mg&Fu_zpISivgz+b7g)c6G&O{~njE??Y{u-MM!p^=9_W+X-j8mhfK? zj`H2Yy;kp%)!V-M3;EVThyB(Z@o88wpMja-vy^g)SgE!<&|(HpS3j3^P6<r_$?-(w literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancybox-y.png b/js/jquery/fancybox/fancybox-y.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef399b9908976fc36f760fad7876a4d9c38e006 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj*!3HGP#J-sfq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6$N>^IEGZ*^681?Yf#{6Zf~e!I`r4y-J+3m*Ue*gH=cNZ zzpU%p61aCO%jt%FH<vH6>UKW&bEWLcUAGzK?;SYE)E{9#W9O8@uj{O@89qzNU(dkI YVCW(7-@(*!CeU;SPgg&ebxsLQ07`N|KL7v# literal 0 HcmV?d00001 diff --git a/js/jquery/fancybox/fancybox.png b/js/jquery/fancybox/fancybox.png new file mode 100644 index 0000000000000000000000000000000000000000..65e14f68fd83b87f75c22c0c074e7b20bf20a133 GIT binary patch literal 15287 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 ZMt7F5hocMxav&E)U0Fw|QQ>vO{{ZOG+C=~W literal 0 HcmV?d00001 diff --git a/js/jquery/ifxtransfer.js b/js/jquery/ifxtransfer.js new file mode 100644 index 000000000..fb689214a --- /dev/null +++ b/js/jquery/ifxtransfer.js @@ -0,0 +1,13 @@ +/** + * Interface Elements for jQuery + * FX - transfer + * + * http://interface.eyecon.ro + * + * Copyright (c) 2006 Stefan Petre + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1.2=q;1.Q.P=i(o){p m.O(\'s\',i(){R 1.A.w(m,o)})};1.A.w=i(e,o){5(1.2==q){1(\'S\',n).V(\'<t N="2"></t>\');1.2=1(\'#2\')}1.2.3(\'B\',\'T\').3(\'W\',\'L\');I z=m;z.c=1(e);5(!o||!o.4){p}5(o.4.H==K&&n.G(o.4)){o.4=n.G(o.4)}J 5(!o.4.M){p}5(!o.a){o.a=U}z.a=o.a;z.4=o.4;z.b=o.10;z.9=o.9;5(z.b){1.2.19(z.b)}z.g=0;z.h=0;5(1.18){z.g=(6(1.2.3(\'17\'))||0)+(6(1.2.3(\'1a\'))||0)+(6(1.2.3(\'X\'))||0)+(6(1.2.3(\'1d\'))||0);z.h=(6(1.2.3(\'1c\'))||0)+(6(1.2.3(\'16\'))||0)+(6(1.2.3(\'15\'))||0)+(6(1.2.3(\'Z\'))||0)}z.7=1.u(1.k.v(z.c.l(0)),1.k.r(z.c.l(0)));z.8=1.u(1.k.v(z.4),1.k.r(z.4));z.7.j-=z.g;z.7.d-=z.h;z.8.j-=z.g;z.8.d-=z.h;z.11=o.9;1.2.3(\'C\',z.7.j+\'f\').3(\'E\',z.7.d+\'f\').3(\'F\',z.7.y+\'f\').3(\'D\',z.7.x+\'f\').13({F:z.8.y,D:z.8.x,C:z.8.j,E:z.8.d},z.a,i(){5(z.b)1.2.1b(z.b);1.2.3(\'B\',\'1e\');5(z.9&&z.9.H==Y){z.9.14(z.c.l(0),[z.4])}1.12(z.c.l(0),\'s\')})};',62,77,'|jQuery|transferHelper|css|to|if|parseInt|start|end|complete|duration|classname|el|hb||px|diffWidth|diffHeight|function|wb|iUtil|get|this|document||return|null|getSize|interfaceFX|div|extend|getPosition|itransferTo||||fx|display|width|left|height|top|getElementById|constructor|var|else|String|absolute|childNodes|id|queue|TransferTo|fn|new|body|block|500|append|position|paddingLeft|Function|paddingBottom|className|callback|dequeue|animate|apply|paddingTop|borderBottomWidth|borderLeftWidth|boxModel|addClass|borderRightWidth|removeClass|borderTopWidth|paddingRight|none'.split('|'),0,{})) diff --git a/js/jquery/imgareaselect/border-anim-h.gif b/js/jquery/imgareaselect/border-anim-h.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec9f5da73bc898de604c0c1b34f57a81440f896b GIT binary patch literal 219 zcmZ?wbhEHbWMg1tSjfQe|Nnmm1_m=TGay6pKewN2NU*bGfUA+70W%{|Lh+xJb5Uwy zNotBhd1gt5LSj~8MNWQVie6@3T0Vo~PZkC)hW`vYK$Q$20~wf@Mf8F|;*4Aj%qZeh a8gPg=vSL-=!WV#5oTUZ3cuOlQgEauT=O=Uk literal 0 HcmV?d00001 diff --git a/js/jquery/imgareaselect/border-anim-v.gif b/js/jquery/imgareaselect/border-anim-v.gif new file mode 100644 index 0000000000000000000000000000000000000000..331cc90b0e4e4d0c1e01ead2f9bab6aed61d2e06 GIT binary patch literal 219 zcmZ?wbhEHbWMp7tSjfQe|Nnmm1_m=TGay6pKewN2NU*bGfUA+70W%{|Lh+xJb5Uwy zNotBhd1gt5LSj~8MNWQVie6@3T0Vo~PZkC)hW`vYK$Q$20~wf@Mf8F|;*4Aj%qZeh a8gPg=vSL-=!WV#5oTUZ3cuOlQgEauTp(k_z literal 0 HcmV?d00001 diff --git a/js/jquery/imgareaselect/border-h.gif b/js/jquery/imgareaselect/border-h.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2aa5b0d09bf7215199dbf9a291b34b11d0352d4 GIT binary patch literal 72 zcmZ?wbhEHbWMg1tSjfQe|Nnmm1_m=TGay6ppOkY^YGO%hib8p2NrpmVR$@g?eqxGV XW?ou8gAPy~14tJG6LU)|D}yxvaY_|= literal 0 HcmV?d00001 diff --git a/js/jquery/imgareaselect/border-v.gif b/js/jquery/imgareaselect/border-v.gif new file mode 100644 index 0000000000000000000000000000000000000000..4bfd55564099537d38d4112f550b8974744de3ca GIT binary patch literal 72 zcmZ?wbhEHbWMp7tSjfQe|Nnmm1_m=TGay6ppOkY^YGO%hib8p2NrpmVR$@g?eqxGV XW?ou8gAPy~14tJG6LU)|D}yxvaW)ls literal 0 HcmV?d00001 diff --git a/js/jquery/imgareaselect/imgareaselect-animated.css b/js/jquery/imgareaselect/imgareaselect-animated.css new file mode 100644 index 000000000..82d3d42fb --- /dev/null +++ b/js/jquery/imgareaselect/imgareaselect-animated.css @@ -0,0 +1,41 @@ +/* + * imgAreaSelect animated border style + */ + +.imgareaselect-border1 { + background: url(border-anim-v.gif) repeat-y left top; +} + +.imgareaselect-border2 { + background: url(border-anim-h.gif) repeat-x left top; +} + +.imgareaselect-border3 { + background: url(border-anim-v.gif) repeat-y right top; +} + +.imgareaselect-border4 { + background: url(border-anim-h.gif) repeat-x left bottom; +} + +.imgareaselect-border1, .imgareaselect-border2, +.imgareaselect-border3, .imgareaselect-border4 { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-handle { + background-color: #fff; + border: solid 1px #000; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-outer { + background-color: #000; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-selection { +} \ No newline at end of file diff --git a/js/jquery/imgareaselect/imgareaselect-default.css b/js/jquery/imgareaselect/imgareaselect-default.css new file mode 100644 index 000000000..18bf07b24 --- /dev/null +++ b/js/jquery/imgareaselect/imgareaselect-default.css @@ -0,0 +1,41 @@ +/* + * imgAreaSelect default style + */ + +.imgareaselect-border1 { + background: url(border-v.gif) repeat-y left top; +} + +.imgareaselect-border2 { + background: url(border-h.gif) repeat-x left top; +} + +.imgareaselect-border3 { + background: url(border-v.gif) repeat-y right top; +} + +.imgareaselect-border4 { + background: url(border-h.gif) repeat-x left bottom; +} + +.imgareaselect-border1, .imgareaselect-border2, +.imgareaselect-border3, .imgareaselect-border4 { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-handle { + background-color: #fff; + border: solid 1px #000; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-outer { + background-color: #000; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-selection { +} \ No newline at end of file diff --git a/js/jquery/imgareaselect/imgareaselect-deprecated.css b/js/jquery/imgareaselect/imgareaselect-deprecated.css new file mode 100644 index 000000000..e2809ccff --- /dev/null +++ b/js/jquery/imgareaselect/imgareaselect-deprecated.css @@ -0,0 +1,36 @@ +/* + * imgAreaSelect style to be used with deprecated options + */ + +.imgareaselect-border1, .imgareaselect-border2, +.imgareaselect-border3, .imgareaselect-border4 { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-border1 { + border: solid 1px #000; +} + +.imgareaselect-border2 { + border: dashed 1px #fff; +} + +.imgareaselect-handle { + background-color: #fff; + border: solid 1px #000; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.imgareaselect-outer { + background-color: #000; + opacity: 0.4; + filter: alpha(opacity=40); +} + +.imgareaselect-selection { + background-color: #fff; + opacity: 0; + filter: alpha(opacity=0); +} diff --git a/js/jquery/imgareaselect/index.php b/js/jquery/imgareaselect/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/js/jquery/imgareaselect/index.php @@ -0,0 +1,11 @@ +<?php + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/jquery/imgareaselect/jquery.imgareaselect.pack.js b/js/jquery/imgareaselect/jquery.imgareaselect.pack.js new file mode 100644 index 000000000..01c1d1006 --- /dev/null +++ b/js/jquery/imgareaselect/jquery.imgareaselect.pack.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(m($){1o W=2o.4F,F=2o.4E,M=2o.4D,G=2o.4C;m S(){v $("<4B/>")};$.R=m(X,b){1o L=$(X),2x,A=S(),1k=S(),I=S().u(S()).u(S()).u(S()),B=S().u(S()).u(S()).u(S()),E=$([]),1D,H,q,1g,12,U,1n,1f,1b=0,1B="1A",2e,2d,25,24,1M=10,N,P,1H,c,f,l,j,g={c:0,f:0,l:0,j:0,C:0,J:0},$p,d,i,o,w,h,2k;m 11(x){v x+1g.D-1f.D};m 1m(y){v y+1g.q-1f.q};m 19(x){v x-1g.D+1f.D};m 18(y){v y-1g.q+1f.q};m 1y(3G){v 3G.4A-1f.D};m 1x(3F){v 3F.4z-1f.q};m 14(2W){1o 1i=2W||25,1h=2W||24;v{c:G(g.c*1i),f:G(g.f*1h),l:G(g.l*1i),j:G(g.j*1h),C:G(g.l*1i)-G(g.c*1i),J:G(g.j*1h)-G(g.f*1h)}};m 2t(c,f,l,j,2V){1o 1i=2V||25,1h=2V||24;g={c:G(c/1i),f:G(f/1h),l:G(l/1i),j:G(j/1h)};g.C=(l=11(g.l))-(c=11(g.c));g.J=(j=11(g.j))-(f=11(g.f))};m 1c(){a(!L.C()){v}1g={D:G(L.2n().D),q:G(L.2n().q)};12=L.C();U=L.J();a($().4y=="1.3.2"&&$.1l.33&&1B=="26"){1g.q+=F(V.3E.2l,$("1r").2l());1g.D+=F(V.3E.2m,$("1r").2m())}1f=$.4x(1n.r("1p"),["1A","4w"])+1?{D:G(1n.2n().D)-1n.2m(),q:G(1n.2n().q)-1n.2l()}:1B=="26"?{D:$(V).2m(),q:$(V).2l()}:{D:0,q:0};H=11(0);q=1m(0)};m 1s(3B){a(!1H){v}A.r({D:11(g.c),q:1m(g.f)}).u(1k).C(w=g.C).J(h=g.J);1k.u(I).u(E).r({D:0,q:0});I.C(F(w-I.2U()+I.3z(),0)).J(F(h-I.3D()+I.4v(),0));$(B[0]).r({D:H,q:q,C:g.c,J:U});$(B[1]).r({D:H+g.c,q:q,C:w,J:g.f});$(B[2]).r({D:H+g.l,q:q,C:12-g.l,J:U});$(B[3]).r({D:H+g.c,q:q+g.j,C:w,J:U-g.j});w-=E.2U();h-=E.3D();2H(E.3n){15 8:$(E[4]).r({D:w/2});$(E[5]).r({D:w,q:h/2});$(E[6]).r({D:w/2,q:h});$(E[7]).r({q:h/2});15 4:E.3C(1,3).r({D:w});E.3C(2,4).r({q:h})}a(3B!==Y){a($.R.1Y!=2L){$(V).T($.R.1Y,$.R.3A)}a(b.1J){$(V)[$.R.1Y]($.R.3A=2L)}}a($.1l.1X&&I.2U()-I.3z()==2){I.r("3y",0);3t(m(){I.r("3y","4u")},0)}};m 1Z(2T,2p){b.1G?2T.4t(b.1G,2p):2T.1t()};m 1d(2S){1o x=19(1y(2S))-g.c,y=18(1x(2S))-g.f;a(!2k){1c();2k=1a;A.1j("4s",m(){2k=Y})}N="";a(b.2r){a(y<=1M){N="n"}Z{a(y>=g.J-1M){N="s"}}a(x<=1M){N+="w"}Z{a(x>=g.C-1M){N+="e"}}}A.r("2R",N?N+"-17":b.1U?"4r":"");a(1D){1D.4q()}};m 2O(4p){$("1r").r("2R","");a(b.4o||g.C*g.J==0){1Z(A.u(B),m(){$(Q).1t()})}b.1R(X,14());$(V).T("O",2f);A.O(1d)};m 2v(1L){a(1L.2K!=1){v Y}1c();a(N){$("1r").r("2R",N+"-17");c=11(g[/w/.2h(N)?"l":"c"]);f=1m(g[/n/.2h(N)?"j":"f"]);$(V).O(2f).1j("1K",2O);A.T("O",1d)}Z{a(b.1U){2e=H+g.c-1y(1L);2d=q+g.f-1x(1L);A.T("O",1d);$(V).O(2P).1j("1K",m(){b.1R(X,14());$(V).T("O",2P);A.O(1d)})}Z{L.1F(1L)}}v Y};m 29(){l=F(H,M(H+12,c+W(j-f)*P*(l>c||-1)));j=G(F(q,M(q+U,f+W(l-c)/P*(j>f||-1))));l=G(l)};m 2a(){j=F(q,M(q+U,f+W(l-c)/P*(j>f||-1)));l=G(F(H,M(H+12,c+W(j-f)*P*(l>c||-1))));j=G(j)};m 28(){a(W(l-c)<b.2j){l=c-b.2j*(l<c||-1);a(l<H){c=H+b.2j}Z{a(l>H+12){c=H+12-b.2j}}}a(W(j-f)<b.2i){j=f-b.2i*(j<f||-1);a(j<q){f=q+b.2i}Z{a(j>q+U){f=q+U-b.2i}}}l=F(H,M(l,H+12));j=F(q,M(j,q+U));a(P){a(W(l-c)/P>W(j-f)){2a()}Z{29()}}a(W(l-c)>b.3x){l=c-b.3x*(l<c||-1);a(P){2a()}}a(W(j-f)>b.3w){j=f-b.3w*(j<f||-1);a(P){29()}}g={c:19(M(c,l)),l:19(F(c,l)),f:18(M(f,j)),j:18(F(f,j)),C:W(l-c),J:W(j-f)};1s();b.1S(X,14())};m 2f(2Q){l=N==""||/w|e/.2h(N)||P?1y(2Q):11(g.l);j=N==""||/n|s/.2h(N)||P?1x(2Q):1m(g.j);28();v Y};m 1w(3v,3u){l=(c=3v)+g.C;j=(f=3u)+g.J;g=$.1V(g,{c:19(c),f:18(f),l:19(l),j:18(j)});1s();b.1S(X,14())};m 2P(2g){c=F(H,M(2e+1y(2g),H+12-g.C));f=F(q,M(2d+1x(2g),q+U-g.J));1w(c,f);2g.4n();v Y};m 2N(){1c();l=c;j=f;28();N="";a(B.1Q(":4m(:4l)")){A.u(B).1t().2w(b.1G||0)}1H=1a;$(V).T("1K",2M).O(2f).1j("1K",2O);A.T("O",1d);b.31(X,14())};m 2M(){$(V).T("O",2N);1Z(A.u(B));g={c:19(c),f:18(f),l:19(c),j:18(f),C:0,J:0};b.1S(X,14());b.1R(X,14())};m 2u(2c){a(2c.2K!=1||B.1Q(":4k")){v Y}1c();2e=c=1y(2c);2d=f=1x(2c);$(V).1j("O",2N).1j("1K",2M);v Y};m 1E(){35(Y)};m 2q(){2x=1a;A.u(B).r({30:""});a(b.2y){1H=1a;1c();1s();A.u(B).1t().2w(b.1G||0)}3t(m(){b.32(X,14())},0)};1o 2L=m(13){1o k=b.1J,d,t,2G=13.4j||13.2K;d=!1u(k.2I)&&(13.2b||13.3q.2b)?k.2I:!1u(k.22)&&13.3r?k.22:!1u(k.23)&&13.3s?k.23:!1u(k.2J)?k.2J:10;a(k.2J=="17"||(k.23=="17"&&13.3s)||(k.22=="17"&&13.3r)||(k.2I=="17"&&(13.2b||13.3q.2b))){2H(2G){15 37:d=-d;15 39:t=F(c,l);c=M(c,l);l=F(t+d,c);a(P){2a()}1v;15 38:d=-d;15 40:t=F(f,j);f=M(f,j);j=F(t+d,f);a(P){29()}1v;3p:v}28()}Z{c=M(c,l);f=M(f,j);2H(2G){15 37:1w(F(c-d,H),f);1v;15 38:1w(c,F(f-d,q));1v;15 39:1w(c+M(d,12-19(l)),f);1v;15 40:1w(c,f+M(d,U-18(j)));1v;3p:v}}v Y};m 1I(3o,2F){3k(27 4i 2F){a(b[27]!==1O){3o.r(2F[27],b[27])}}};m 2s(K){a(K.1T){(1n=$(K.1T)).3e(A.u(B))}b=$.1V(b,K);1c();$p=L;3m($p.3n&&!$p.1Q("1r")){a(!1u($p.r("z-2E"))&&$p.r("z-2E")>1b){1b=$p.r("z-2E")}a($p.r("1p")=="26"){1B="26"}$p=$p.1T()}a(!1u(b.1q)){1b=b.1q}a(K.2D!=3l){E.4h();E=$([]);i=K.2D?K.2D=="4g"?4:8:0;3m(i--){E=E.u(S())}E.21(b.1C+"-4f").r({1p:"1A",4e:0,1q:1b+1||1});a(!4d(E.r("C"))){E.C(5).J(5)}a(o=b.2C){E.r({2C:o,2z:"3h"})}1I(E,{3i:"2B-20",3g:"2A-20",3j:"1e"})}25=b.4c/12||1;24=b.4b/U||1;a(K.c!=3l){2t(K.c,K.f,K.l,K.j);K.2y=!K.1t}a(K.1J){b.1J=$.1V({23:1,22:"17"},K.1J)}B.21(b.1C+"-4a");1k.21(b.1C+"-49");3k(i=0;i++<4;){$(I[i-1]).21(b.1C+"-2B"+i)}1I(1k,{48:"2A-20",47:"1e"});1I(I,{3j:"1e",2C:"2B-C"});1I(B,{46:"2A-20",45:"1e"});a(o=b.3i){$(I[0]).r({2z:"3h",3f:o})}a(o=b.3g){$(I[1]).r({2z:"44",3f:o})}A.3e(1k.u(I).u(E).u(1D));a($.1l.1X){a(o=B.r("3d").3c(/1e=([0-9]+)/)){B.r("1e",o[1]/1W)}a(o=I.r("3d").3c(/1e=([0-9]+)/)){I.r("1e",o[1]/1W)}}a(K.1t){1Z(A.u(B))}Z{a(K.2y&&2x){1H=1a;A.u(B).2w(b.1G||0);1s()}}P=(d=(b.43||"").42(/:/))[0]/d[1];a(b.1P||b.1z===Y){A.T("O",1d).T("1F",2v);L.u(B).T("1F",2u);$(3b).T("17",1E);L.u(L.3a()).T("36",1E)}Z{a(b.1z||b.1P===Y){a(b.2r||b.1U){A.O(1d).1F(2v)}a(!b.41){L.u(B).1F(2u)}$(3b).17(1E);L.u(L.3a()).36(1E)}}b.1z=b.1P=1O};Q.3Z=m(){v b};Q.2X=2s;Q.3Y=14;Q.3X=2t;Q.3W=m 35(34){1c();1s(34);c=11(g.c);f=1m(g.f);l=11(g.l);j=1m(g.j)};a($.1l.1X){L.3V("3U","3T")}$.R.1Y=$.1l.1X||$.1l.33?"3S":"3R";a($.1l.3Q){1D=S().r({C:"1W%",J:"1W%",1p:"1A",1q:1b+2||2})}2s(b=$.1V({1C:"3P",1U:1a,2r:1a,1T:"1r",32:m(){},31:m(){},1S:m(){},1R:m(){}},b));A.u(B).r({30:"2Z",1p:1B,3O:"2Z",1q:1b||"0"});A.r({1q:1b+2||2});1k.u(I).r({1p:"1A"});X.2Y||X.3N=="2Y"||!L.1Q("3M")?2q():L.1j("3L",2q)};$.2p.R=m(16){16=16||{};Q.3K(m(){a($(Q).1N("R")){$(Q).1N("R").2X(16)}Z{a(16.1z===1O&&16.1P===1O){16.1z=1a}$(Q).1N("R",3J $.R(Q,16))}});a(16.3I){v $(Q).1N("R")}v Q}})(3H);',62,290,'||||||||||if|_7|x1|||y1|_20|||y2||x2|function||||top|css|||add|return|||||_a|_d|width|left|_e|_2|_4|_10|_c|height|_4d|_8|_3|_1d|mousemove|_1e|this|imgAreaSelect|_5|unbind|_13|document|_1|_6|false|else||_22|_12|_48|_28|case|_4f|resize|_25|_24|true|_16|_2c|_32|opacity|_15|_11|sy|sx|one|_b|browser|_23|_14|var|position|zIndex|body|_2d|hide|isNaN|break|_3e|evY|evX|enable|absolute|_17|classPrefix|_f|_46|mousedown|fadeSpeed|_1f|_49|keys|mouseup|_38|_1c|data|undefined|disable|is|onSelectEnd|onSelectChange|parent|movable|extend|100|msie|keyPress|_30|color|addClass|ctrl|shift|_1b|_1a|fixed|option|_3c|_3a|_3b|altKey|_45|_19|_18|_36|_41|test|minHeight|minWidth|_21|scrollTop|scrollLeft|offset|Math|fn|_47|resizable|_4c|_2a|_44|_37|fadeIn|_9|show|borderStyle|background|border|borderWidth|handles|index|_4b|key|switch|alt|arrows|which|_2f|_43|_42|_34|_39|_3d|cursor|_33|_31|outerWidth|_2b|_29|setOptions|complete|hidden|visibility|onSelectStart|onInit|safari|_4e|doUpdate|scroll||||parents|window|match|filter|append|borderColor|borderColor2|solid|borderColor1|borderOpacity|for|null|while|length|_4a|default|originalEvent|ctrlKey|shiftKey|setTimeout|_40|_3f|maxHeight|maxWidth|margin|innerWidth|onKeyPress|_2e|slice|outerHeight|documentElement|_27|_26|jQuery|instance|new|each|load|img|readyState|overflow|imgareaselect|opera|keypress|keydown|on|unselectable|attr|update|setSelection|getSelection|getOptions||persistent|split|aspectRatio|dashed|outerOpacity|outerColor|selectionOpacity|selectionColor|selection|outer|imageHeight|imageWidth|parseInt|fontSize|handle|corners|remove|in|keyCode|animated|visible|not|preventDefault|autoHide|_35|toggle|move|mouseout|fadeOut|auto|innerHeight|relative|inArray|jquery|pageY|pageX|div|round|min|max|abs'.split('|'))) diff --git a/js/jquery/index.php b/js/jquery/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/js/jquery/index.php @@ -0,0 +1,11 @@ +<?php + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/js/jquery/iutil.prestashop-modifications.js b/js/jquery/iutil.prestashop-modifications.js new file mode 100644 index 000000000..183915dcf --- /dev/null +++ b/js/jquery/iutil.prestashop-modifications.js @@ -0,0 +1,26 @@ +/** + * Interface Elements for jQuery + * utility function + * + * http://interface.eyecon.ro + * + * Copyright (c) 2006 Stefan Petre + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * MODIFIED FOR PRESTASHOP (16 september 2008) + * + * + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('9.J={1C:6(e){4 x=0;4 y=0;4 7=e.Y;4 12=1H;c(9(e).8(\'A\')==\'T\'){4 N=7.B;4 Q=7.z;12=1f;7.B=\'1r\';7.A=\'1q\';7.z=\'1d\'}4 3=e;R(3){x+=3.1h+(3.O&&!9.1m.1i?d(3.O.17)||0:0);y+=3.1n+(3.O&&!9.1m.1i?d(3.O.18)||0:0);3=3.1t}3=e;R(3&&3.1e&&3.1e.16()!=\'f\'){x-=3.u||0;y-=3.F||0;3=3.1D}c(12==1f){7.A=\'T\';7.z=Q;7.B=N}a{x:x,y:y}},1B:6(3){4 x=0,y=0;R(3){x+=3.1h||0;y+=3.1n||0;3=3.1t}a{x:x,y:y}},1s:6(e){4 w=9.8(e,\'1E\');4 h=9.8(e,\'1G\');4 o=0;4 q=0;4 7=e.Y;c(9(e).8(\'A\')!=\'T\'){o=e.V;q=e.U}p{4 N=7.B;4 Q=7.z;7.B=\'1r\';7.A=\'1q\';7.z=\'1d\';o=e.V;q=e.U;7.A=\'T\';7.z=Q;7.B=N}a{w:w,h:h,o:o,q:q}},1F:6(3){a{o:3.V||0,q:3.U||0}},1I:6(e){4 h,w,C;c(e){w=e.I;h=e.G}p{C=5.j;w=1c.14||P.14||(C&&C.I)||5.f.I;h=1c.10||P.10||(C&&C.G)||5.f.G}a{w:w,h:h}},1p:6(e){4 t=0,l=0,w=0,h=0,s=0,E=0;c(e&&e.1u.16()!=\'f\'){t=e.F;l=e.u;w=e.15;h=e.W;s=0;E=0}p{c(5.j){t=5.j.F;l=5.j.u;w=5.j.15;h=5.j.W}p c(5.f){t=5.f.F;l=5.f.u;w=5.f.15;h=5.f.W}s=P.14||5.j.I||5.f.I||0;E=P.10||5.j.G||5.f.G||0}a{t:t,l:l,w:w,h:h,s:s,E:E}},1v:6(e,D){4 3=9(e);4 t=3.8(\'1w\')||\'\';4 r=3.8(\'1x\')||\'\';4 b=3.8(\'1A\')||\'\';4 l=3.8(\'1z\')||\'\';c(D)a{t:d(t)||0,r:d(r)||0,b:d(b)||0,l:d(l)};p a{t:t,r:r,b:b,l:l}},1y:6(e,D){4 3=9(e);4 t=3.8(\'1J\')||\'\';4 r=3.8(\'1M\')||\'\';4 b=3.8(\'27\')||\'\';4 l=3.8(\'28\')||\'\';c(D)a{t:d(t)||0,r:d(r)||0,b:d(b)||0,l:d(l)};p a{t:t,r:r,b:b,l:l}},26:6(e,D){4 3=9(e);4 t=3.8(\'18\')||\'\';4 r=3.8(\'22\')||\'\';4 b=3.8(\'23\')||\'\';4 l=3.8(\'17\')||\'\';c(D)a{t:d(t)||0,r:d(r)||0,b:d(b)||0,l:d(l)||0};p a{t:t,r:r,b:b,l:l}},2e:6(L){4 x=L.2d||(L.2b+(5.j.u||5.f.u))||0;4 y=L.2c||(L.29+(5.j.F||5.f.F))||0;a{x:x,y:y}},X:6(g,13){13(g);g=g.1O;R(g){9.J.X(g,13);g=g.1L}},1N:6(g){9.J.X(g,6(3){19(4 Z 1T 3){c(1Z 3[Z]===\'6\'){3[Z]=1a}}})},1X:6(3,H){4 k=9.J.1p();4 11=9.J.1s(3);c(!H||H==\'1W\')9(3).8({1U:k.t+((1g.1o(k.h,k.E)-k.t-11.q)/2)+\'1j\'});c(!H||H==\'20\')9(3).8({1Y:k.l+((1g.1o(k.w,k.s)-k.l-11.o)/2)+\'1j\'})},2f:6(3,1l){4 1k=9(\'25[@M*="S"]\',3||5),S;1k.24(6(){S=K.M;K.M=1l;K.Y.2a="21:1R.1P.1V(M=\'"+S+"\')"})}};[].1b||(1S.1Q.1b=6(v,n){n=(n==1a)?0:n;4 m=K.1K;19(4 i=n;i<m;i++)c(K[i]==v)a i;a-1});',62,140,'|||el|var|document|function|es|css|jQuery|return||if|parseInt||body|nodeEl|||documentElement|clientScroll||||wb|else|hb||iw||scrollLeft|||||position|display|visibility|de|toInteger|ih|scrollTop|clientHeight|axis|clientWidth|iUtil|this|event|src|oldVisibility|currentStyle|self|oldPosition|while|png|none|offsetHeight|offsetWidth|scrollHeight|traverseDOM|style|attr|innerHeight|windowSize|restoreStyles|func|innerWidth|scrollWidth|toLowerCase|borderLeftWidth|borderTopWidth|for|null|indexOf|window|absolute|tagName|true|Math|offsetLeft|opera|px|images|emptyGIF|browser|offsetTop|max|getScroll|block|hidden|getSize|offsetParent|nodeName|getMargins|marginTop|marginRight|getPadding|marginLeft|marginBottom|getPositionLite|getPosition|parentNode|width|getSizeLite|height|false|getClient|paddingTop|length|nextSibling|paddingRight|purgeEvents|firstChild|Microsoft|prototype|DXImageTransform|Array|in|top|AlphaImageLoader|vertically|centerEl|left|typeof|horizontally|progid|borderRightWidth|borderBottomWidth|each|img|getBorder|paddingBottom|paddingLeft|clientY|filter|clientX|pageY|pageX|getPointer|fixPNG'.split('|'),0,{})) + +/* Backwards compability to make JQuery to work with interface */ +;(function($){ +$.extend( +{ dequeue : function(elem, effect) + { + $(elem).dequeue(effect); + } +} +); +})(jQuery); diff --git a/js/jquery/jqminmax-compressed.js b/js/jquery/jqminmax-compressed.js new file mode 100644 index 000000000..9836c1555 --- /dev/null +++ b/js/jquery/jqminmax-compressed.js @@ -0,0 +1,3 @@ +/* jQMinMax v0.1 - Copyright (c) 2006 Dave Cardwell (http://davecardwell.co.uk/) + Released under the MIT License (http://www.opensource.org/licenses/mit-license.php) */ +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[(function(e){return d[e]})];e=(function(){return'\\w+'});c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('u m(){$.5={D:y,v:y};$(G).12(m(){8 h=G.W(\'I\');$(h).e({\'3\':\'J\',\'6-3\':\'K\'});$(\'L\').M(h);$.5.v=(h.s&&h.s==2);$(h).N();b($.5.v)o;$.5.D=O;$.5.A();$(\':5\').5()});$.5.A=m(){8 p=u E(\'6-3\',\'6-4\',\'9-3\',\'9-4\');8 5=u E();Q(8 i=0;i<p.R;i++){8 n="$.e(a,\'"+p[i]+"\')!=\'S\'&&"+"$.e(a,\'"+p[i]+"\')!=\'z\'&&"+"$.e(a,\'"+p[i]+"\')!=f.g";b(p[i].U(2)==\'x\')n+="&&$.e(a,\'"+p[i]+"\')!=\'X\'";$.n[\':\'][p[i]]=n;5[i]=\'(\'+n+\')\'}$.n[\':\'][\'5\']=5.Y(\'||\')};$.Z.5=m(){o $(c).10(m(){8 7={\'6-3\':r(c,\'6-3\'),\'9-3\':r(c,\'9-3\'),\'6-4\':r(c,\'6-4\'),\'9-4\':r(c,\'9-4\')};8 3=c.s;8 4=c.w;8 k=3;8 l=4;b(7[\'9-3\']!=f.g&&k>7[\'9-3\'])k=7[\'9-3\'];b(7[\'6-3\']!=f.g&&k<7[\'6-3\'])k=7[\'6-3\'];b(7[\'9-4\']!=f.g&&l>7[\'9-4\'])l=7[\'9-4\'];b(7[\'6-4\']!=f.g&&l<7[\'6-4\'])l=7[\'6-4\'];b(k!=3)$(c).e(\'3\',k);b(l!=4)$(c).e(\'4\',l)})};m r(t,p){8 q=$(t).e(p);b(q==f.g||q==\'z\')o f.g;8 j;j=q.B(/^\\+?(\\d*(?:\\.\\d+)?)%$/);b(j){o T.V(C((/3$/.h(p)?$(t).F().H(0).s:$(t).F().H(0).w)*j[1]/P))}j=q.B(/^\\+?(\\d*(?:\\.\\d+)?)(?:11)?$/);b(j){o C(j[1])}o f.g}}();',62,65,'|||width|height|minmax|min|constraint|var|max||if|this||css|window|undefined|test||result|newWidth|newHeight|function|expr|return||raw|calculate|offsetWidth|obj|new|native|offsetHeight||false|auto|expressions|match|Number|active|Array|parent|document|get|div|1px|2px|body|append|remove|true|100|for|length|0px|Math|charAt|round|createElement|none|join|fn|each|px|ready'.split('|'),0,{})) diff --git a/js/jquery/jquery-1.4.4.min.js b/js/jquery/jquery-1.4.4.min.js new file mode 100644 index 000000000..8f3ca2e2d --- /dev/null +++ b/js/jquery/jquery-1.4.4.min.js @@ -0,0 +1,167 @@ +/*! + * jQuery JavaScript Library v1.4.4 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Nov 11 19:04:53 2010 -0500 + */ +(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= +h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"|| +h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--; +if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z], +z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j, +s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v= +s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)|| +[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u, +false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this, +a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e= +c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, +a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan", +colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType=== +1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "), +l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this, +"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r= +a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b= +w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this, +Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp= +c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U}; +var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!== +"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V, +xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d, +a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d= +1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d=== +"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}}); +c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i, +[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*")); +return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!== +B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, +POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()=== +i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m= +i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g, +"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n=== +"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1; +for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"), +i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML; +c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})}, +not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1, +"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d= +c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a, +b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")): +this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay", +d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b, +d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)=== +"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L|| +1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a=== +b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&& +h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle; +for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+= +parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px", +height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells= +f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a, +"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/js/jquery/jquery-colorpicker.js b/js/jquery/jquery-colorpicker.js new file mode 100644 index 000000000..7f4189458 --- /dev/null +++ b/js/jquery/jquery-colorpicker.js @@ -0,0 +1,573 @@ +/* + mColorPicker + Version: 1.0 r21 + + Copyright (c) 2010 Meta100 LLC. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise + to promote the sale, use or other dealings in this Software + without prior written authorization. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ + +// After this script loads set: +// $.fn.mColorPicker.init.replace = '.myclass' +// to have this script apply to input.myclass, +// instead of the default input[type=color] +// To turn of automatic operation and run manually set: +// $.fn.mColorPicker.init.replace = false +// To use manually call like any other jQuery plugin +// $('input.foo').mColorPicker({options}) +// options: +// imageFolder - Change to move image location. +// swatches - Initial colors in the swatch, must an array of 10 colors. +// init: +// $.fn.mColorPicker.init.enhancedSwatches - Turn of saving and loading of swatch to cookies. +// $.fn.mColorPicker.init.allowTransparency - Turn off transperancy as a color option. +// $.fn.mColorPicker.init.showLogo - Turn on/off the meta100 logo (You don't really want to turn it off, do you?). + +(function($){ + + $.fn.mColorPicker = function(options) { + + $o = $.extend($.fn.mColorPicker.defaults, options); + + if ($o.swatches.length < 10) $o.swatches = $.fn.mColorPicker.defaults.swatches + if ($("div#mColorPicker").length < 1) $.fn.mColorPicker.drawPicker(); + + this.each(function () { + + $.fn.mColorPicker.drawPickerTriggers($(this)); + }); + + $('.mColorPickerInput').unbind().bind('keyup', function () { + + try { + + $(this).css({ + 'background-color': $(this).val() + }).css({ + 'color': $.fn.mColorPicker.textColor($(this).css('background-color')) + }).trigger('change'); + } catch (r) {} + }); + }; + + $.fn.mColorPicker.currentColor = false; + $.fn.mColorPicker.currentValue = false; + $.fn.mColorPicker.color = false; + + $.fn.mColorPicker.init = { + replace: '[type=color]', + enhancedSwatches: true, + allowTransparency: true, + showLogo: true + }; + + $.fn.mColorPicker.defaults = { + imageFolder: '../img/admin/', + swatches: [ + "#ffffff", + "#ffff00", + "#00ff00", + "#00ffff", + "#0000ff", + "#ff00ff", + "#ff0000", + "#4c2b11", + "#3b3b3b", + "#000000" + ] + }; + + $.fn.mColorPicker.drawPickerTriggers = function ($t) { + + if ($t[0].nodeName.toLowerCase() != 'input') return false + if ($t.data('mColorPicker') == 'true') return false + + var id = $t.attr('id'), + currentTime = new Date(), + hidden = false; + + if (id == '') id = $t.attr('name'); + if (id == '') id = 'color_' + Math.round(Math.random() * currentTime.getTime()); + + $t.attr('id', id); + + if ($t.attr('text') == 'hidden' || $t.attr('data-text') == 'hidden') hidden = true; + + var color = $t.val(), + width = ($t.width() > 0)? $t.width(): parseInt($t.css('width'), 10), + height = ($t.height())? $t.height(): parseInt($t.css('height'), 10), + flt = $t.css('float'), + image = (color == 'transparent')? "url('" + $o.imageFolder + "/grid.gif')": '', + colorPicker = ''; + + $('body').append('<span id="color_work_area"></span>'); + $('span#color_work_area').append($t.clone(true)); + colorPicker = $('span#color_work_area').html().replace(/type=[^a-z]*color[^a-z]*/gi, (hidden)? 'type="hidden"': 'type="text"'); + $('span#color_work_area').html('').remove(); + $t.after( + (hidden)? '<span style="cursor:pointer;border:1px solid black;float:' + flt + ';width:' + width + 'px;height:' + height + 'px;" id="icp_' + id + '">&nbsp;</span>': '' + ).after(colorPicker).remove(); + + if (hidden) { + + $('#icp_' + id).css({ + 'background-color': color, + 'background-image': image, + 'display': 'inline-block' + }); + } else { + + $('#' + id).css({ + 'background-color': color, + 'background-image': image + }).css({ + 'color': $.fn.mColorPicker.textColor($('#' + id).css('background-color')) + }).after( + '<span style="cursor:pointer;" id="icp_' + id + '"><img src="' + $o.imageFolder + 'color.png" style="border:0;margin:0 0 0 3px" align="absmiddle"></span>' + ).addClass('mColorPickerInput'); + } + + $('#icp_' + id).bind('click', function () { + + $.fn.mColorPicker.colorShow(id, hidden); + }).data('mColorPicker', 'true'); + }; + + $.fn.mColorPicker.drawPicker = function () { + + $(document.createElement("div")).attr( + "id","mColorPicker" + ).css( + 'display','none' + ).html( + '<div id="mColorPickerWrapper"><div id="mColorPickerImg" class="mColor"></div><div id="mColorPickerImgGray" class="mColor"></div><div id="mColorPickerSwatches"><div class="mClear"></div></div></div>' + ).appendTo("body"); + + $(document.createElement("div")).attr("id","mColorPickerBg").css({ + 'display': 'none' + }).appendTo("body"); + + for (n = 9; n > -1; n--) { + + $(document.createElement("div")).attr({ + 'id': 'cell' + n, + 'class': "mPastColor" + ((n > 0)? ' mNoLeftBorder': '') + }).html( + '&nbsp;' + ).prependTo("#mColorPickerSwatches"); + } + + $('#mColorPicker').css({ + 'border':'1px solid #ccc', + 'color':'#fff', + 'z-index':999998, + 'width':'194px', + 'height':'157px', + 'font-size':'12px', + 'font-family':'times' + }); + + $('.mPastColor').css({ + 'height':'18px', + 'width':'18px', + 'border':'1px solid #000', + 'float':'left' + }); + + $('#colorPreview').css({ + 'height':'50px' + }); + + $('.mNoLeftBorder').css({ + 'border-left':0 + }); + + $('.mClear').css({ + 'clear':'both' + }); + + $('#mColorPickerWrapper').css({ + 'position':'relative', + 'border':'solid 1px gray', + 'z-index':999999 + }); + + $('#mColorPickerImg').css({ + 'height':'128px', + 'width':'192px', + 'border':0, + 'cursor':'crosshair', + 'background-image':"url('" + $o.imageFolder + "colorpicker.png')" + }); + + $('#mColorPickerImgGray').css({ + 'height':'8px', + 'width':'192px', + 'border':0, + 'cursor':'crosshair', + 'background-image':"url('" + $o.imageFolder + "graybar.jpg')" + }); + + $('#mColorPickerInput').css({ + 'border':'solid 1px gray', + 'font-size':'10pt', + 'margin':'3px', + 'width':'80px' + }); + + $('#mColorPickerImgGrid').css({ + 'border':0, + 'height':'20px', + 'width':'20px', + 'vertical-align':'text-bottom' + }); + + $('#mColorPickerSwatches').css({ + 'border-right':'1px solid #000' + }); + + $('#mColorPickerFooter').css({ + 'background-image':"url('" + $o.imageFolder + "grid.gif')", + 'position': 'relative', + 'height':'26px' + }); + + if ($.fn.mColorPicker.init.allowTransparency) $('#mColorPickerFooter').prepend('<span id="mColorPickerTransparent" class="mColor" style="font-size:16px;color:#000;padding-right:30px;padding-top:3px;cursor:pointer;overflow:hidden;float:right;">transparent</span>'); + if ($.fn.mColorPicker.init.showLogo) $('#mColorPickerFooter').prepend('<a href="http://meta100.com/" title="Meta100 - Designing Fun" alt="Meta100 - Designing Fun" style="float:right;" target="_blank"><img src="' + $o.imageFolder + 'meta100.png" title="Meta100 - Designing Fun" alt="Meta100 - Designing Fun" style="border:0;border-left:1px solid #aaa;right:0;position:absolute;"/></a>'); + + $("#mColorPickerBg").click(function() { + + $("#mColorPickerBg").hide(); + $("#mColorPicker").fadeOut() + }); + + var swatch = ($.fn.mColorPicker.init.enhancedSwatches)? $.fn.mColorPicker.getCookie('swatches'): $o.swatches, + i = 0; + + if (swatch == null) swatch = $o.swatches; + else swatch = swatch.split('||'); + + if (swatch.length < 10) swatch = $o.swatches; + + $(".mPastColor").each(function() { + + $(this).css('background-color', swatch[i++].toLowerCase()); + }); + }; + + $.fn.mColorPicker.colorShow = function (id, updateInput) { + + var $e = $("#icp_" + id); + pos = $e.offset(), + $i = $("#" + id); + hex = $i.attr('data-hex') || $i.attr('hex'), + pickerTop = pos.top + $e.outerHeight(), + pickerLeft = pos.left, + $d = $(document), + $m = $("#mColorPicker"); + + // KEEP COLOR PICKER IN VIEWPORT + if (pickerTop + $m.height() > $d.height()) pickerTop = pos.top - $m.height(); + if (pickerLeft + $m.width() > $d.width()) pickerLeft = pos.left - $m.width() + $e.outerWidth(); + + $m.css({ + 'top':(pickerTop) + "px", + 'left':(pickerLeft) + "px", + 'position':'absolute' + }).fadeIn("fast"); + + $("#mColorPickerBg").css({ + 'z-index':999990, + 'background':'black', + 'opacity': .01, + 'position':'absolute', + 'top':0, + 'left':0, + 'width': parseInt($d.width(), 10) + 'px', + 'height': parseInt($d.height(), 10) + 'px' + }).show(); + + var def = $i.val(); + + $('#colorPreview span').text(def); + $('#colorPreview').css('background', def); + $('#color').val(def); + + if (updateInput) $.fn.mColorPicker.currentColor = $e.css('background-color'); + else $.fn.mColorPicker.currentColor = $i.css('background-color'); + + if (hex == 'true') $.fn.mColorPicker.currentColor = $.fn.mColorPicker.RGBtoHex($.fn.mColorPicker.currentColor); + + $("#mColorPickerInput").val($.fn.mColorPicker.currentColor); + $('.mColor, .mPastColor').bind('mousemove', function(e) { + + var offset = $(this).offset(); + + $.fn.mColorPicker.color = $(this).css("background-color"); + + if ($(this).hasClass('mPastColor') && hex == 'true') $.fn.mColorPicker.color = $.fn.mColorPicker.RGBtoHex($.fn.mColorPicker.color); + else if ($(this).hasClass('mPastColor') && hex != 'true') $.fn.mColorPicker.color = $.fn.mColorPicker.hexToRGB($.fn.mColorPicker.color); + else if ($(this).attr('id') == 'mColorPickerTransparent') $.fn.mColorPicker.color = 'transparent'; + else if (!$(this).hasClass('mPastColor')) $.fn.mColorPicker.color = $.fn.mColorPicker.whichColor(e.pageX - offset.left, e.pageY - offset.top + (($(this).attr('id') == 'mColorPickerImgGray')? 128: 0), hex); + + $.fn.mColorPicker.setInputColor(id, $.fn.mColorPicker.color, updateInput); + }).click(function() { + + $.fn.mColorPicker.colorPicked(id); + }); + + $('#mColorPickerInput').bind('keyup', function (e) { + + try { + + $.fn.mColorPicker.color = $('#mColorPickerInput').val(); + $.fn.mColorPicker.setInputColor(id, $.fn.mColorPicker.color, updateInput); + + if (e.which == 13) { + $.fn.mColorPicker.colorPicked(id); + } + } catch (r) {} + }).bind('blur', function () { + + $.fn.mColorPicker.setInputColor(id, $.fn.mColorPicker.currentColor, updateInput); + }); + + $('#mColorPickerWrapper').bind('mouseleave', function () { + + $.fn.mColorPicker.setInputColor(id, $.fn.mColorPicker.currentColor, updateInput); + }); + }; + + $.fn.mColorPicker.setInputColor = function (id, color, updateInput) { + + var image = (color == 'transparent')? "url('" + $o.imageFolder + "grid.gif')": '', + textColor = $.fn.mColorPicker.textColor(color); + + if (updateInput) $("#icp_" + id).css({'background-color': color, 'background-image': image}); + $("#" + id).val(color).css({'background-color': color, 'background-image': image, 'color' : textColor}).trigger('change'); + if(typeof(employeePage) != 'undefined') + $('body').css('background-color', color); + $("#mColorPickerInput").val(color); + }; + + $.fn.mColorPicker.textColor = function (val) { + + if (typeof val == 'undefined' || val == 'transparent') return "black"; + val = $.fn.mColorPicker.RGBtoHex(val); + return (parseInt(val.substr(1, 2), 16) + parseInt(val.substr(3, 2), 16) + parseInt(val.substr(5, 2), 16) < 400)? 'white': 'black'; + }; + + $.fn.mColorPicker.setCookie = function (name, value, days) { + + var cookie_string = name + "=" + escape(value), + expires = new Date(); + expires.setDate(expires.getDate() + days); + cookie_string += "; expires=" + expires.toGMTString(); + + document.cookie = cookie_string; + }; + + $.fn.mColorPicker.getCookie = function (name) { + + var results = document.cookie.match ( '(^|;) ?' + name + '=([^;]*)(;|$)' ); + + if (results) return (unescape(results[2])); + else return null; + }; + + $.fn.mColorPicker.colorPicked = function (id) { + + $(".mColor, .mPastColor, #mColorPickerInput, #mColorPickerWrapper").unbind(); + $("#mColorPickerBg").hide(); + $("#mColorPicker").fadeOut(); + + if ($.fn.mColorPicker.init.enhancedSwatches) $.fn.mColorPicker.addToSwatch(); + + $("#" + id).trigger('colorpicked'); + }; + + $.fn.mColorPicker.addToSwatch = function (color) { + + var swatch = [] + i = 0; + + if (typeof color == 'string') $.fn.mColorPicker.color = color.toLowerCase(); + + $.fn.mColorPicker.currentValue = $.fn.mColorPicker.currentColor = $.fn.mColorPicker.color; + + if ($.fn.mColorPicker.color != 'transparent') swatch[0] = $.fn.mColorPicker.color.toLowerCase(); + + $('.mPastColor').each(function() { + + $.fn.mColorPicker.color = $(this).css('background-color').toLowerCase(); + + if ($.fn.mColorPicker.color != swatch[0] && $.fn.mColorPicker.RGBtoHex($.fn.mColorPicker.color) != swatch[0] && $.fn.mColorPicker.hexToRGB($.fn.mColorPicker.color) != swatch[0] && swatch.length < 10) swatch[swatch.length] = $.fn.mColorPicker.color; + + $(this).css('background-color', swatch[i++]) + }); + + if ($.fn.mColorPicker.init.enhancedSwatches) $.fn.mColorPicker.setCookie('swatches', swatch.join('||'), 365); + }; + + $.fn.mColorPicker.whichColor = function (x, y, hex) { + + var colorR = colorG = colorB = 255; + + if (x < 32) { + + colorG = x * 8; + colorB = 0; + } else if (x < 64) { + + colorR = 256 - (x - 32 ) * 8; + colorB = 0; + } else if (x < 96) { + + colorR = 0; + colorB = (x - 64) * 8; + } else if (x < 128) { + + colorR = 0; + colorG = 256 - (x - 96) * 8; + } else if (x < 160) { + + colorR = (x - 128) * 8; + colorG = 0; + } else { + + colorG = 0; + colorB = 256 - (x - 160) * 8; + } + + if (y < 64) { + + colorR += (256 - colorR) * (64 - y) / 64; + colorG += (256 - colorG) * (64 - y) / 64; + colorB += (256 - colorB) * (64 - y) / 64; + } else if (y <= 128) { + + colorR -= colorR * (y - 64) / 64; + colorG -= colorG * (y - 64) / 64; + colorB -= colorB * (y - 64) / 64; + } else if (y > 128) { + + colorR = colorG = colorB = 256 - ( x / 192 * 256 ); + } + + colorR = Math.round(Math.min(colorR, 255)); + colorG = Math.round(Math.min(colorG, 255)); + colorB = Math.round(Math.min(colorB, 255)); + + if (hex == 'true') { + + colorR = colorR.toString(16); + colorG = colorG.toString(16); + colorB = colorB.toString(16); + + if (colorR.length < 2) colorR = 0 + colorR; + if (colorG.length < 2) colorG = 0 + colorG; + if (colorB.length < 2) colorB = 0 + colorB; + + return "#" + colorR + colorG + colorB; + } + + return "rgb(" + colorR + ', ' + colorG + ', ' + colorB + ')'; + }; + + $.fn.mColorPicker.RGBtoHex = function (color) { + + color = color.toLowerCase(); + + if (typeof color == 'undefined') return ''; + if (color.indexOf('#') > -1 && color.length > 6) return color; + if (color.indexOf('rgb') < 0) return color; + + if (color.indexOf('#') > -1) { + + return '#' + color.substr(1, 1) + color.substr(1, 1) + color.substr(2, 1) + color.substr(2, 1) + color.substr(3, 1) + color.substr(3, 1); + } + + var hexArray = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"], + decToHex = "#", + code1 = 0; + + color = color.replace(/[^0-9,]/g, '').split(","); + + for (var n = 0; n < color.length; n++) { + + code1 = Math.floor(color[n] / 16); + decToHex += hexArray[code1] + hexArray[color[n] - code1 * 16]; + } + + return decToHex; + }; + + $.fn.mColorPicker.hexToRGB = function (color) { + + color = color.toLowerCase(); + + if (typeof color == 'undefined') return ''; + if (color.indexOf('rgb') > -1) return color; + if (color.indexOf('#') < 0) return color; + + var c = color.replace('#', ''); + + if (c.length < 6) c = c.substr(0, 1) + c.substr(0, 1) + c.substr(1, 1) + c.substr(1, 1) + c.substr(2, 1) + c.substr(2, 1); + + return 'rgb(' + parseInt(c.substr(0, 2), 16) + ', ' + parseInt(c.substr(2, 2), 16) + ', ' + parseInt(c.substr(4, 2), 16) + ')'; + } + + if ($.fn.mColorPicker.init.replace == '[type=color]') { + + $(document).ready(function () { + + $('input').filter(function(index) { + + return this.getAttribute("type") == 'color'; + }).mColorPicker(); + + $(document).bind('ajaxSuccess', function () { + + $('input').filter(function(index) { + + return this.getAttribute("type") == 'color'; + }).mColorPicker(); + }); + }); + } else if ($.fn.mColorPicker.init.replace) { + + $(document).ready(function () { + + $('input' + $.fn.mColorPicker.init.replace).mColorPicker(); + + $(document).bind('ajaxSuccess', function () { + + $('input' + $.fn.mColorPicker.init.replace).mColorPicker(); + }); + }); + } +})(jQuery); diff --git a/js/jquery/jquery-fieldselection.js b/js/jquery/jquery-fieldselection.js new file mode 100644 index 000000000..47ca18ba3 --- /dev/null +++ b/js/jquery/jquery-fieldselection.js @@ -0,0 +1,84 @@ +/* + * jQuery plugin: fieldSelection - v0.1.0 - last change: 2006-12-16 + * (c) 2006 Alex Brem <alex@0xab.cd> - http://blog.0xab.cd + */ + +(function() { + + var fieldSelection = { + + getSelection: function() { + + var e = this.jquery ? this[0] : this; + + return ( + + /* mozilla / dom 3.0 */ + ('selectionStart' in e && function() { + var l = e.selectionEnd - e.selectionStart; + console.log(e); + return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) }; + }) || + + /* exploder */ + (document.selection && function() { + + e.focus(); + + var r = document.selection.createRange(); + if (r == null) { + return { start: 0, end: e.value.length, length: 0 } + } + + var re = e.createTextRange(); + var rc = re.duplicate(); + re.moveToBookmark(r.getBookmark()); + rc.setEndPoint('EndToStart', re); + + return { start: rc.text.length, end: rc.text.length + r.text.length, length: r.text.length, text: r.text }; + }) || + + /* browser not supported */ + function() { + return { start: 0, end: e.value.length, length: 0 }; + } + + )(); + + }, + + replaceSelection: function() { + + var e = this.jquery ? this[0] : this; + var text = arguments[0] || ''; + + return ( + + /* mozilla / dom 3.0 */ + ('selectionStart' in e && function() { + e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length); + return this; + }) || + + /* exploder */ + (document.selection && function() { + e.focus(); + document.selection.createRange().text = text; + return this; + }) || + + /* browser not supported */ + function() { + e.value += text; + return this; + } + + )(); + + } + + }; + + jQuery.each(fieldSelection, function(i) { jQuery.fn[i] = this; }); + +})(); diff --git a/js/jquery/jquery-typewatch.pack.js b/js/jquery/jquery-typewatch.pack.js new file mode 100644 index 000000000..89a3ed671 --- /dev/null +++ b/js/jquery/jquery-typewatch.pack.js @@ -0,0 +1,89 @@ +/* + * TypeWatch 2.0 - Original by Denny Ferrassoli / Refactored by Charles Christolini + * + * Examples/Docs: www.dennydotnet.com + * + * Copyright(c) 2007 Denny Ferrassoli - DennyDotNet.com + * Coprright(c) 2008 Charles Christolini - BinaryPie.com + * Modified by Lucas CHERIFI @ PrestaShop : now this plugin works with the Dean Edward's JS Packer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html +*/ + +(function(jQuery) { + jQuery.fn.typeWatch = function(o){ + // Options + var options = jQuery.extend({ + wait : 750, + callback : function() { }, + highlight : true, + captureLength : 2 + }, o); + + function checkElement(timer, override) { + var elTxt = jQuery(timer.el).val(); + + // Fire if text > options.captureLength AND text != saved txt OR if override AND text > options.captureLength + if ((elTxt.length > options.captureLength && elTxt.toUpperCase() != timer.text) + || (override && elTxt.length > options.captureLength)) { + timer.text = elTxt.toUpperCase(); + timer.cb(elTxt); + } + }; + + function watchElement(elem) { + // Must be text or textarea + if (elem.type.toUpperCase() == "TEXT" || elem.nodeName.toUpperCase() == "TEXTAREA") { + + // Allocate timer element + var timer = { + timer : null, + text : jQuery(elem).val().toUpperCase(), + cb : options.callback, + el : elem, + wait : options.wait + }; + + // Set focus action (highlight) + if (options.highlight) { + jQuery(elem).focus( + function() { + this.select(); + }); + } + + // Key watcher / clear and reset the timer + var startWatch = function(evt) { + var timerWait = timer.wait; + var overrideBool = false; + + if (evt.keyCode == 13 && this.type.toUpperCase() == "TEXT") { + timerWait = 1; + overrideBool = true; + } + + var timerCallbackFx = function() + { + checkElement(timer, overrideBool); + } + + // Clear timer + clearTimeout(timer.timer); + timer.timer = setTimeout(timerCallbackFx, timerWait); + + }; + + jQuery(elem).keydown(startWatch); + } + }; + + // Watch Each Element + return this.each(function(index){ + watchElement(this); + }); + + }; + +})(jQuery); diff --git a/js/jquery/jquery-ui-1.8.10.custom.min.js b/js/jquery/jquery-ui-1.8.10.custom.min.js new file mode 100755 index 000000000..7d4ff1cec --- /dev/null +++ b/js/jquery/jquery-ui-1.8.10.custom.min.js @@ -0,0 +1,782 @@ +/*! + * jQuery UI 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.10",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&& +b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); +;/*! + * jQuery UI Widget 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h, +a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h; +e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options, +this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")}, +widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this}, +enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); +;/*! + * jQuery UI Mouse 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(true===c.data(b.target,a.widgetName+".preventClickEvent")){c.removeData(b.target,a.widgetName+".preventClickEvent");b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent= +a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted= +this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a); +return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent", +true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&& +this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== +"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"? +0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"), +10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor== +Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop(): +f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY; +if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/ +b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top- +this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!= +this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.10"}); +d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver= +0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs= +c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a, +true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver= +0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor= +a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})}, +stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!= +document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop- +c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()- +(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable", +"snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h= +c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative", +{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height, +left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element, +a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a, +b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery); +;/* + * jQuery UI Droppable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Droppables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.mouse.js + * jquery.ui.draggable.js + */ +(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this); +a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&& +this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass); +this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g= +d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop", +a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.10"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height; +switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>= +i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!= +"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem|| +a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e= +d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery); +;/* + * jQuery UI Resizable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element, +_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; +f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing"); +this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top= +null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+ +this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d= +[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b= +this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b, +a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a, +c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize, +originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.10"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize= +b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width", +"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})}; +if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height- +g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width, +height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d= +e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options, +d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper? +d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height= +a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&& +/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable"); +b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/ +(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting"); +a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&& +!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d= +e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.10"})})(jQuery); +;/* + * jQuery UI Sortable 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, +arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= +c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, +{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); +if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", +a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+ +this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+ +b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+ +"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, +c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== +document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length- +1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null}); +this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&& +a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating? +"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating? +c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top; +return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h= +d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)}); +return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g= +d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent= +this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top= +e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0]; +if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder); +c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length=== +1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer= +this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])): +b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height== +""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent= +this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"), +10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions= +{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()|| +document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth, +b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!= +document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): +e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX- +this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top< +this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&& +this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter= +this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show(); +this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0], +this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out", +g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b|| +this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position, +originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.10"})})(jQuery); +;/* + * jQuery UI Accordion 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", +function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+ +a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), +e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| +e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", +tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.10",animations:{slide:function(a,b){a= +c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);f[i]={value:j[1], +unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide", +paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=false;var f=d.ui.keyCode; +switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem= +null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo|| +"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"), +i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source=== +"string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)}, +_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!== +this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position))}, +_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b); +else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})}, +deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0); +e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e, +g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first")); +this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery); +;/* + * jQuery UI Button 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button", +i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button", +function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active"); +b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active"); +g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled", +c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement= +this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle|| +this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed", +true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"), +c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":"ui-button-icon-only"); +b.removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this, +arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"); +a.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&& +c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex", +-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role", +"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose= +b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&& +a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index"); +isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ); +d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}}); +c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f, +h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g= +d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize, +position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f, +h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length=== +1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in +l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled"); +break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e= +this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&& +this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.10",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length=== +0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), +height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); +b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances, +function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery); +;/* + * jQuery UI Slider 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled"); +this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a], +value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value= +this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value(); +else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation(); +this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b]; +return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, +_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate); +if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, +1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.10"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ +g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", +function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= +d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, +url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.10"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&& +a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery); +;/* + * jQuery UI Datepicker 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker + * + * Depends: + * jquery.ui.core.js + */ +(function(d,G){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= +"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", +"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", +minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]== +null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.10"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase(); +f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f== +""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{}); +b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass); +this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup", +this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs, +function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null: +f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({}, +e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b); +this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]? +d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey|| +a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target, +e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b, +"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true}, +_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos= +d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b, +c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&& +d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout", +function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!= +-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a, +"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))), +parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left, +b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b); +this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear= +false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay= +d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a); +else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort, +g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){var v=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&v?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,v,H){p=o(p)?H:v;for(v=0;v<p.length;v++)if(b.substr(s,p[v].length).toLowerCase()==p[v].toLowerCase()){s+=p[v].length;return v+1}throw"Unknown name at position "+ +s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(k)if(a.charAt(z)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var w=new Date(m("@"));c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;case "!":w=new Date((m("!")-this._ticksTo1970)/1E4);c=w.getFullYear();j=w.getMonth()+ +1;l=w.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y", +RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&& +a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M", +b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+= +"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth= +f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g= +(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j, +l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay= +a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(), +b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n= +this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+ +(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+ +(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a, +"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z= +this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var M="",D=0;D<i[1];D++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]- +1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,C>0||D>0,z,w)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q= +(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F= +p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,J=B&&!H||!F[0]||k&&q<k||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!v?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today": +""))+'"'+((!B||v)&&F[2]?' title="'+F[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!v?"&#xa0;":J?'<span class="ui-state-default">'+q.getDate()+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+= +P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">', +o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&& +l)?"&#xa0;":""));a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+ +a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker, +[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.10";window["DP_jQuery_"+y]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.10"})})(jQuery); +;/* + * jQuery UI Effects 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0]; +h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c, +a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.10",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c, +a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent", +border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c); +return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments); +else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c), +b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c, +a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a== +e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c= +g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/ +h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c, +a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery); +;/* + * jQuery UI Effects Blind 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a, +g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Bounce 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/ +3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a); +b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery); +;/* + * jQuery UI Effects Clip 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position, +c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Drop 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e== +"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Explode 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f= +0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fade 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], +10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration, +a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery); +;/* + * jQuery UI Effects Scale 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a, +b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity= +1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"], +p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}}; +if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a); +a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from); +child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a, +n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Shake 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]= +(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery); +;/* + * jQuery UI Effects Slide 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e); +var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Transfer 1.8.10 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/js/jquery/jquery.autocomplete.js b/js/jquery/jquery.autocomplete.js new file mode 100644 index 000000000..a8d6d6a3c --- /dev/null +++ b/js/jquery/jquery.autocomplete.js @@ -0,0 +1,758 @@ +/* + * Autocomplete - jQuery plugin 1.0.2 + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 6844 2011-06-03 14:46:51Z dMetzger $ + * + */ + +;(function($) { + +$.fn.extend({ + autocomplete: function(urlOrData, options) { + var isUrl = typeof urlOrData == "string"; + options = $.extend({}, $.Autocompleter.defaults, { + url: isUrl ? urlOrData : null, + data: isUrl ? null : urlOrData, + delay: isUrl ? $.Autocompleter.defaults.delay : 10, + max: options && !options.scroll ? 10 : 150 + }, options); + + // if highlight is set to false, replace it with a do-nothing function + options.highlight = options.highlight || function(value) { return value; }; + + // if the formatMatch option is not specified, then use formatItem for backwards compatibility + options.formatMatch = options.formatMatch || options.formatItem; + + return this.each(function() { + new $.Autocompleter(this, options); + }); + }, + result: function(handler) { + return this.bind("result", handler); + }, + search: function(handler) { + return this.trigger("search", [handler]); + }, + flushCache: function() { + return this.trigger("flushCache"); + }, + setOptions: function(options){ + return this.trigger("setOptions", [options]); + }, + unautocomplete: function() { + return this.trigger("unautocomplete"); + } +}); + +$.Autocompleter = function(input, options) { + + var KEY = { + UP: 38, + DOWN: 40, + DEL: 46, + TAB: 9, + RETURN: 13, + ESC: 27, + COMMA: 188, + PAGEUP: 33, + PAGEDOWN: 34, + BACKSPACE: 8 + }; + + // Create $ object for input element + var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); + + var timeout; + var previousValue = ""; + var cache = $.Autocompleter.Cache(options); + var hasFocus = 0; + var lastKeyPressCode; + var config = { + mouseDownOnSelect: false + }; + var select = $.Autocompleter.Select(options, input, selectCurrent, config); + + var blockSubmit; + + // prevent form submit in opera when selecting with return key + $.browser.opera && $(input.form).bind("submit.autocomplete", function() { + if (blockSubmit) { + blockSubmit = false; + return false; + } + }); + + // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all + $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { + // track last key pressed + lastKeyPressCode = event.keyCode; + switch(event.keyCode) { + + case KEY.UP: + event.preventDefault(); + if ( select.visible() ) { + select.prev(); + } else { + onChange(0, true); + } + break; + + case KEY.DOWN: + event.preventDefault(); + if ( select.visible() ) { + select.next(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEUP: + event.preventDefault(); + if ( select.visible() ) { + select.pageUp(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEDOWN: + event.preventDefault(); + if ( select.visible() ) { + select.pageDown(); + } else { + onChange(0, true); + } + break; + + // matches also semicolon + case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: + case KEY.TAB: + case KEY.RETURN: + if( selectCurrent() ) { + // stop default to prevent a form submit, Opera needs special handling + event.preventDefault(); + blockSubmit = true; + return false; + } + break; + + case KEY.ESC: + select.hide(); + break; + + default: + clearTimeout(timeout); + timeout = setTimeout(onChange, options.delay); + break; + } + }).focus(function(){ + // track whether the field has focus, we shouldn't process any + // results if the field no longer has focus + hasFocus++; + }).blur(function() { + hasFocus = 0; + if (!config.mouseDownOnSelect) { + hideResults(); + } + }).click(function() { + // show select when clicking in a focused field + if ( hasFocus++ > 1 && !select.visible() ) { + onChange(0, true); + } + }).bind("search", function() { + // TODO why not just specifying both arguments? + var fn = (arguments.length > 1) ? arguments[1] : null; + function findValueCallback(q, data) { + var result; + if( data && data.length ) { + for (var i=0; i < data.length; i++) { + if( data[i].result.toLowerCase() == q.toLowerCase() ) { + result = data[i]; + break; + } + } + } + if( typeof fn == "function" ) fn(result); + else $input.trigger("result", result && [result.data, result.value]); + } + $.each(trimWords($input.val()), function(i, value) { + request(value, findValueCallback, findValueCallback); + }); + }).bind("flushCache", function() { + cache.flush(); + }).bind("setOptions", function() { + $.extend(options, arguments[1]); + // if we've updated the data, repopulate + if ( "data" in arguments[1] ) + cache.populate(); + }).bind("unautocomplete", function() { + select.unbind(); + $input.unbind(); + $(input.form).unbind(".autocomplete"); + }); + + + function selectCurrent() { + var selected = select.selected(); + if( !selected ) + return false; + + var v = selected.result; + previousValue = v; + + if ( options.multiple ) { + var words = trimWords($input.val()); + if ( words.length > 1 ) { + v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v; + } + v += options.multipleSeparator; + } + + $input.val(v); + hideResultsNow(); + $input.trigger("result", [selected.data, selected.value]); + return true; + } + + function onChange(crap, skipPrevCheck) { + if( lastKeyPressCode == KEY.DEL ) { + select.hide(); + return; + } + + var currentValue = $input.val(); + + if ( !skipPrevCheck && currentValue == previousValue ) + return; + + previousValue = currentValue; + + currentValue = lastWord(currentValue); + if ( currentValue.length >= options.minChars) { + $input.addClass(options.loadingClass); + if (!options.matchCase) + currentValue = currentValue.toLowerCase(); + request(currentValue, receiveData, hideResultsNow); + } else { + stopLoading(); + select.hide(); + } + }; + + function trimWords(value) { + if ( !value ) { + return [""]; + } + var words = value.split( options.multipleSeparator ); + var result = []; + $.each(words, function(i, value) { + if ( $.trim(value) ) + result[i] = $.trim(value); + }); + return result; + } + + function lastWord(value) { + if ( !options.multiple ) + return value; + var words = trimWords(value); + return words[words.length - 1]; + } + + // fills in the input box w/the first match (assumed to be the best match) + // q: the term entered + // sValue: the first matching result + function autoFill(q, sValue){ + // autofill in the complete box w/the first match as long as the user hasn't entered in more data + // if the last user key pressed was backspace, don't autofill + if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { + // fill in the value (keep the case the user has typed) + $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); + // select the portion of the value not typed by the user (so the next character will erase) + $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length); + } + }; + + function hideResults() { + clearTimeout(timeout); + timeout = setTimeout(hideResultsNow, 200); + }; + + function hideResultsNow() { + var wasVisible = select.visible(); + select.hide(); + clearTimeout(timeout); + stopLoading(); + if (options.mustMatch) { + // call search and run callback + $input.search( + function (result){ + // if no value found, clear the input box + if( !result ) { + if (options.multiple) { + var words = trimWords($input.val()).slice(0, -1); + $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); + } + else + $input.val( "" ); + } + } + ); + } + if (wasVisible) + // position cursor at end of input field + $.Autocompleter.Selection(input, input.value.length, input.value.length); + }; + + function receiveData(q, data) { + if ( data && data.length && hasFocus ) { + stopLoading(); + select.display(data, q); + autoFill(q, data[0].value); + select.show(); + } else { + hideResultsNow(); + } + }; + + function request(term, success, failure) { + if (!options.matchCase) + term = term.toLowerCase(); + var data = cache.load(term); + // recieve the cached data + if (data && data.length) { + success(term, data); + // if an AJAX url has been supplied, try loading the data now + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + + var extraParams = { + timestamp: +new Date() + }; + $.each(options.extraParams, function(key, param) { + extraParams[key] = typeof param == "function" ? param() : param; + }); + + $.ajax({ + // try to leverage ajaxQueue plugin to abort previous requests + mode: "abort", + // limit abortion to this input + port: "autocomplete" + input.name, + dataType: options.dataType, + url: options.url, + data: $.extend({ + q: lastWord(term), + limit: options.max + }, extraParams), + success: function(data) { + var parsed = options.parse && options.parse(data) || parse(data); + cache.add(term, parsed); + success(term, parsed); + } + }); + } else { + // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match + select.emptyList(); + failure(term); + } + }; + + function parse(data) { + var parsed = []; + var rows = data.split("\n"); + for (var i=0; i < rows.length; i++) { + var row = $.trim(rows[i]); + if (row) { + row = row.split("|"); + parsed[parsed.length] = { + data: row, + value: row[0], + result: options.formatResult && options.formatResult(row, row[0]) || row[0] + }; + } + } + return parsed; + }; + + function stopLoading() { + $input.removeClass(options.loadingClass); + }; + +}; + +$.Autocompleter.defaults = { + inputClass: "ac_input", + resultsClass: "ac_results", + loadingClass: "ac_loading", + minChars: 1, + delay: 400, + matchCase: false, + matchSubset: true, + matchContains: false, + cacheLength: 10, + max: 100, + mustMatch: false, + extraParams: {}, + selectFirst: true, + formatItem: function(row) { return row[0]; }, + formatMatch: null, + autoFill: false, + width: 0, + multiple: false, + multipleSeparator: ", ", + highlight: function(value, term) { + return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"); + }, + scroll: true, + scrollHeight: 180 +}; + +$.Autocompleter.Cache = function(options) { + + var data = {}; + var length = 0; + + function matchSubset(s, sub) { + if (!options.matchCase) + s = s.toLowerCase(); + var i = s.indexOf(sub); + if (i == -1) return false; + return i == 0 || options.matchContains; + }; + + function add(q, value) { + if (length > options.cacheLength){ + flush(); + } + if (!data[q]){ + length++; + } + data[q] = value; + } + + function populate(){ + if( !options.data ) return false; + // track the matches + var stMatchSets = {}, + nullData = 0; + + // no url was specified, we need to adjust the cache length to make sure it fits the local data store + if( !options.url ) options.cacheLength = 1; + + // track all options for minChars = 0 + stMatchSets[""] = []; + + // loop through the array and create a lookup structure + for ( var i = 0, ol = options.data.length; i < ol; i++ ) { + var rawValue = options.data[i]; + // if rawValue is a string, make an array otherwise just reference the array + rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; + + var value = options.formatMatch(rawValue, i+1, options.data.length); + if ( value === false ) + continue; + + var firstChar = value.charAt(0).toLowerCase(); + // if no lookup array for this character exists, look it up now + if( !stMatchSets[firstChar] ) + stMatchSets[firstChar] = []; + + // if the match is a string + var row = { + value: value, + data: rawValue, + result: options.formatResult && options.formatResult(rawValue) || value + }; + + // push the current match into the set list + stMatchSets[firstChar].push(row); + + // keep track of minChars zero items + if ( nullData++ < options.max ) { + stMatchSets[""].push(row); + } + }; + + // add the data items to the cache + $.each(stMatchSets, function(i, value) { + // increase the cache size + options.cacheLength++; + // add to the cache + add(i, value); + }); + } + + // populate any existing data + setTimeout(populate, 25); + + function flush(){ + data = {}; + length = 0; + } + + return { + flush: flush, + add: add, + populate: populate, + load: function(q) { + if (!options.cacheLength || !length) + return null; + /* + * if dealing w/local data and matchContains than we must make sure + * to loop through all the data collections looking for matches + */ + if( !options.url && options.matchContains ){ + // track all matches + var csub = []; + // loop through all the data grids for matches + for( var k in data ){ + // don't search through the stMatchSets[""] (minChars: 0) cache + // this prevents duplicates + if( k.length > 0 ){ + var c = data[k]; + $.each(c, function(i, x) { + // if we've got a match, add it to the array + if (matchSubset(x.value, q)) { + csub.push(x); + } + }); + } + } + return csub; + } else + // if the exact item exists, use it + if (data[q]){ + return data[q]; + } else + if (options.matchSubset) { + for (var i = q.length - 1; i >= options.minChars; i--) { + var c = data[q.substr(0, i)]; + if (c) { + var csub = []; + $.each(c, function(i, x) { + if (matchSubset(x.value, q)) { + csub[csub.length] = x; + } + }); + return csub; + } + } + } + return null; + } + }; +}; + +$.Autocompleter.Select = function (options, input, select, config) { + var CLASSES = { + ACTIVE: "ac_over" + }; + + var listItems, + active = -1, + data, + term = "", + needsInit = true, + element, + list; + + // Create results + function init() { + if (!needsInit) + return; + element = $("<div/>") + .hide() + .addClass(options.resultsClass) + .css("position", "absolute") + .appendTo(document.body); + + list = $("<ul/>").appendTo(element).mouseover( function(event) { + if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { + active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); + $(target(event)).addClass(CLASSES.ACTIVE); + } + }).click(function(event) { + $(target(event)).addClass(CLASSES.ACTIVE); + select(); + // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus + input.focus(); + return false; + }).mousedown(function() { + config.mouseDownOnSelect = true; + }).mouseup(function() { + config.mouseDownOnSelect = false; + }); + + if( options.width > 0 ) + element.css("width", options.width); + + needsInit = false; + } + + function target(event) { + var element = event.target; + while(element && element.tagName != "LI") + element = element.parentNode; + // more fun with IE, sometimes event.target is empty, just ignore it then + if(!element) + return []; + return element; + } + + function moveSelect(step) { + listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); + movePosition(step); + var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); + if(options.scroll) { + var offset = 0; + listItems.slice(0, active).each(function() { + offset += this.offsetHeight; + }); + if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { + list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); + } else if(offset < list.scrollTop()) { + list.scrollTop(offset); + } + } + }; + + function movePosition(step) { + active += step; + if (active < 0) { + active = listItems.size() - 1; + } else if (active >= listItems.size()) { + active = 0; + } + } + + function limitNumberOfItems(available) { + return options.max && options.max < available + ? options.max + : available; + } + + function fillList() { + list.empty(); + var max = limitNumberOfItems(data.length); + for (var i=0; i < max; i++) { + if (!data[i]) + continue; + var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term); + if ( formatted === false ) + continue; + var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; + $.data(li, "ac_data", data[i]); + } + listItems = list.find("li"); + if ( options.selectFirst ) { + listItems.slice(0, 1).addClass(CLASSES.ACTIVE); + active = 0; + } + // apply bgiframe if available + if ( $.fn.bgiframe ) + list.bgiframe(); + } + + return { + display: function(d, q) { + init(); + data = d; + term = q; + fillList(); + }, + next: function() { + moveSelect(1); + }, + prev: function() { + moveSelect(-1); + }, + pageUp: function() { + if (active != 0 && active - 8 < 0) { + moveSelect( -active ); + } else { + moveSelect(-8); + } + }, + pageDown: function() { + if (active != listItems.size() - 1 && active + 8 > listItems.size()) { + moveSelect( listItems.size() - 1 - active ); + } else { + moveSelect(8); + } + }, + hide: function() { + element && element.hide(); + listItems && listItems.removeClass(CLASSES.ACTIVE); + active = -1; + }, + visible : function() { + return element && element.is(":visible"); + }, + current: function() { + return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); + }, + show: function() { + var offset = $(input).offset(); + element.css({ + width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), + top: offset.top + input.offsetHeight, + left: offset.left + }).show(); + if(options.scroll) { + list.css({ + maxHeight: options.scrollHeight, + overflow: 'auto' + }); + + if($.browser.msie && typeof document.body.style.maxHeight === "undefined") { + var listHeight = 0; + listItems.each(function() { + listHeight += this.offsetHeight; + }); + var scrollbarsVisible = listHeight > options.scrollHeight; + list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight ); + if (!scrollbarsVisible) { + // IE doesn't recalculate width when scrollbar disappears + listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); + } + } + + } + }, + selected: function() { + var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); + return selected && selected.length && $.data(selected[0], "ac_data"); + }, + emptyList: function (){ + list && list.empty(); + }, + unbind: function() { + element && element.remove(); + } + }; +}; + +$.Autocompleter.Selection = function(field, start, end) { + if( field.createTextRange ){ + var selRange = field.createTextRange(); + selRange.collapse(true); + selRange.moveStart("character", start); + selRange.moveEnd("character", end); + selRange.select(); + } else if( field.setSelectionRange ){ + field.setSelectionRange(start, end); + } else { + if( field.selectionStart ){ + field.selectionStart = start; + field.selectionEnd = end; + } + } + field.focus(); +}; + +})(jQuery); diff --git a/js/jquery/jquery.cluetip.js b/js/jquery/jquery.cluetip.js new file mode 100644 index 000000000..fa7cc0725 --- /dev/null +++ b/js/jquery/jquery.cluetip.js @@ -0,0 +1,42 @@ +/* + * documentation & download : http://plugins.learningjquery.com/cluetip/ +*/ +/* + * jQuery clueTip plugin + * Version 0.9.8 (05/22/2008) + * @requires jQuery v1.1.4+ + * @requires Dimensions plugin (for jQuery versions < 1.2.5) + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +;(function($){var $cluetip,$cluetipInner,$cluetipOuter,$cluetipTitle,$cluetipArrows,$dropShadow,imgCount;$.fn.cluetip=function(js,options){if(typeof js=='object'){options=js;js=null;} +return this.each(function(index){var $this=$(this);var opts=$.extend(false,{},$.fn.cluetip.defaults,options||{},$.metadata?$this.metadata():$.meta?$this.data():{});var cluetipContents=false;var cluezIndex=parseInt(opts.cluezIndex,10)-1;var isActive=false,closeOnDelay=0;if(!$('#cluetip').length){$cluetipInner=$('<div id="cluetip-inner"></div>');$cluetipTitle=$('<h3 id="cluetip-title"></h3>');$cluetipOuter=$('<div id="cluetip-outer"></div>').append($cluetipInner).prepend($cluetipTitle);$cluetip=$('<div id="cluetip"></div>').css({zIndex:opts.cluezIndex}).append($cluetipOuter).append('<div id="cluetip-extra"></div>')[insertionType](insertionElement).hide();$('<div id="cluetip-waitimage"></div>').css({position:'absolute',zIndex:cluezIndex-1}).insertBefore('#cluetip').hide();$cluetip.css({position:'absolute',zIndex:cluezIndex});$cluetipOuter.css({position:'relative',zIndex:cluezIndex+1});$cluetipArrows=$('<div id="cluetip-arrows" class="cluetip-arrows"></div>').css({zIndex:cluezIndex+1}).appendTo('#cluetip');} +var dropShadowSteps=(opts.dropShadow)?+opts.dropShadowSteps:0;if(!$dropShadow){$dropShadow=$([]);for(var i=0;i<dropShadowSteps;i++){$dropShadow=$dropShadow.add($('<div></div>').css({zIndex:cluezIndex-i-1,opacity:.1,top:1+i,left:1+i}));};$dropShadow.css({position:'absolute',backgroundColor:'#000'}).prependTo($cluetip);} +var tipAttribute=$this.attr(opts.attribute),ctClass=opts.cluetipClass;if(!tipAttribute&&!opts.splitTitle&&!js)return true;if(opts.local&&opts.hideLocal){$(tipAttribute+':first').hide();} +var tOffset=parseInt(opts.topOffset,10),lOffset=parseInt(opts.leftOffset,10);var tipHeight,wHeight;var defHeight=isNaN(parseInt(opts.height,10))?'auto':(/\D/g).test(opts.height)?opts.height:opts.height+'px';var sTop,linkTop,posY,tipY,mouseY,baseline;var tipInnerWidth=isNaN(parseInt(opts.width,10))?275:parseInt(opts.width,10);var tipWidth=tipInnerWidth+(parseInt($cluetip.css('paddingLeft'))||0)+(parseInt($cluetip.css('paddingRight'))||0)+dropShadowSteps;var linkWidth=this.offsetWidth;var linkLeft,posX,tipX,mouseX,winWidth;var tipParts;var tipTitle=(opts.attribute!='title')?$this.attr(opts.titleAttribute):'';if(opts.splitTitle){if(tipTitle==undefined){tipTitle='';} +tipParts=tipTitle.split(opts.splitTitle);tipTitle=tipParts.shift();} +var localContent;var activate=function(event){if(!opts.onActivate($this)){return false;} +isActive=true;$cluetip.removeClass().css({width:tipInnerWidth});if(tipAttribute==$this.attr('href')){$this.css('cursor',opts.cursor);} +$this.attr('title','');if(opts.hoverClass){$this.addClass(opts.hoverClass);} +linkTop=posY=$this.offset().top;linkLeft=$this.offset().left;mouseX=event.pageX;mouseY=event.pageY;if($this[0].tagName.toLowerCase()!='area'){sTop=$(document).scrollTop();winWidth=$(window).width();} +if(opts.positionBy=='fixed'){posX=linkWidth+linkLeft+lOffset;$cluetip.css({left:posX});}else{posX=(linkWidth>linkLeft&&linkLeft>tipWidth)||linkLeft+linkWidth+tipWidth+lOffset>winWidth?linkLeft-tipWidth-lOffset:linkWidth+linkLeft+lOffset;if($this[0].tagName.toLowerCase()=='area'||opts.positionBy=='mouse'||linkWidth+tipWidth>winWidth){if(mouseX+20+tipWidth>winWidth){$cluetip.addClass(' cluetip-'+ctClass);posX=(mouseX-tipWidth-lOffset)>=0?mouseX-tipWidth-lOffset-parseInt($cluetip.css('marginLeft'),10)+parseInt($cluetipInner.css('marginRight'),10):mouseX-(tipWidth/2);}else{posX=mouseX+lOffset;}} +var pY=posX<0?event.pageY+tOffset:event.pageY;$cluetip.css({left:(posX>0&&opts.positionBy!='bottomTop')?posX:(mouseX+(tipWidth/2)>winWidth)?winWidth/2-tipWidth/2:Math.max(mouseX-(tipWidth/2),0)});} +wHeight=$(window).height();if(js){$cluetipInner.html(js);cluetipShow(pY);} +else if(tipParts){var tpl=tipParts.length;for(var i=0;i<tpl;i++){if(i==0){$cluetipInner.html(tipParts[i]);}else{$cluetipInner.append('<div class="split-body">'+tipParts[i]+'</div>');}};cluetipShow(pY);} +else if(!opts.local&&tipAttribute.indexOf('#')!=0){if(cluetipContents&&opts.ajaxCache){$cluetipInner.html(cluetipContents);cluetipShow(pY);} +else{var ajaxSettings=opts.ajaxSettings;ajaxSettings.url=tipAttribute;ajaxSettings.beforeSend=function(){$cluetipOuter.children().empty();if(opts.waitImage){$('#cluetip-waitimage').css({top:mouseY+20,left:mouseX+20}).show();}};ajaxSettings.error=function(){if(isActive){$cluetipInner.html('<i>sorry, the contents could not be loaded</i>');}};ajaxSettings.success=function(data){cluetipContents=opts.ajaxProcess(data);if(isActive){$cluetipInner.html(cluetipContents);}};ajaxSettings.complete=function(){imgCount=$('#cluetip-inner img').length;if(imgCount&&!$.browser.opera){$('#cluetip-inner img').load(function(){imgCount--;if(imgCount<1){$('#cluetip-waitimage').hide();if(isActive)cluetipShow(pY);}});}else{$('#cluetip-waitimage').hide();if(isActive)cluetipShow(pY);}};$.ajax(ajaxSettings);}}else if(opts.local){var $localContent=$(tipAttribute+':first');var localCluetip=$.fn.wrapInner?$localContent.wrapInner('<div></div>').children().clone(true):$localContent.html();$.fn.wrapInner?$cluetipInner.empty().append(localCluetip):$cluetipInner.html(localCluetip);cluetipShow(pY);}};var cluetipShow=function(bpY){$cluetip.addClass('cluetip-'+ctClass);if(opts.truncate){var $truncloaded=$cluetipInner.text().slice(0,opts.truncate)+'...';$cluetipInner.html($truncloaded);} +function doNothing(){};tipTitle?$cluetipTitle.show().html(tipTitle):(opts.showTitle)?$cluetipTitle.show().html('&nbsp;'):$cluetipTitle.hide();if(opts.sticky){var $closeLink=$('<div id="cluetip-close"><a href="#">'+opts.closeText+'</a></div>');(opts.closePosition=='bottom')?$closeLink.appendTo($cluetipInner):(opts.closePosition=='title')?$closeLink.prependTo($cluetipTitle):$closeLink.prependTo($cluetipInner);$closeLink.click(function(){cluetipClose();return false;});if(opts.mouseOutClose){if($.fn.hoverIntent&&opts.hoverIntent){$cluetip.hoverIntent({over:doNothing,timeout:opts.hoverIntent.timeout,out:function(){$closeLink.trigger('click');}});}else{$cluetip.hover(doNothing,function(){$closeLink.trigger('click');});}}else{$cluetip.unbind('mouseout');}} +var direction='';$cluetipOuter.css({overflow:defHeight=='auto'?'visible':'auto',height:defHeight});tipHeight=defHeight=='auto'?Math.max($cluetip.outerHeight(),$cluetip.height()):parseInt(defHeight,10);tipY=posY;baseline=sTop+wHeight;if(opts.positionBy=='fixed'){tipY=posY-opts.dropShadowSteps+tOffset;}else if((posX<mouseX&&Math.max(posX,0)+tipWidth>mouseX)||opts.positionBy=='bottomTop'){if(posY+tipHeight+tOffset>baseline&&mouseY-sTop>tipHeight+tOffset){tipY=mouseY-tipHeight-tOffset;direction='top';}else{tipY=mouseY+tOffset;direction='bottom';}}else if(posY+tipHeight+tOffset>baseline){tipY=(tipHeight>=wHeight)?sTop:baseline-tipHeight-tOffset;}else if($this.css('display')=='block'||$this[0].tagName.toLowerCase()=='area'||opts.positionBy=="mouse"){tipY=bpY-tOffset;}else{tipY=posY-opts.dropShadowSteps;} +if(direction==''){posX<linkLeft?direction='left':direction='right';} +$cluetip.css({top:tipY+'px'}).removeClass().addClass('clue-'+direction+'-'+ctClass).addClass(' cluetip-'+ctClass);if(opts.arrows){var bgY=(posY-tipY-opts.dropShadowSteps);$cluetipArrows.css({top:(/(left|right)/.test(direction)&&posX>=0&&bgY>0)?bgY+'px':/(left|right)/.test(direction)?0:''}).show();}else{$cluetipArrows.hide();} +$dropShadow.hide();$cluetip.hide()[opts.fx.open](opts.fx.open!='show'&&opts.fx.openSpeed);if(opts.dropShadow)$dropShadow.css({height:tipHeight,width:tipInnerWidth}).show();if($.fn.bgiframe){$cluetip.bgiframe();} +if(opts.delayedClose>0){closeOnDelay=setTimeout(cluetipClose,opts.delayedClose);} +opts.onShow($cluetip,$cluetipInner);};var inactivate=function(){isActive=false;$('#cluetip-waitimage').hide();if(!opts.sticky||(/click|toggle/).test(opts.activation)){cluetipClose();clearTimeout(closeOnDelay);};if(opts.hoverClass){$this.removeClass(opts.hoverClass);} +$('.cluetip-clicked').removeClass('cluetip-clicked');};var cluetipClose=function(){$cluetipOuter.parent().hide().removeClass().end().children().empty();if(tipTitle){$this.attr(opts.titleAttribute,tipTitle);} +$this.css('cursor','');if(opts.arrows)$cluetipArrows.css({top:''});};if((/click|toggle/).test(opts.activation)){$this.click(function(event){if($cluetip.is(':hidden')||!$this.is('.cluetip-clicked')){activate(event);$('.cluetip-clicked').removeClass('cluetip-clicked');$this.addClass('cluetip-clicked');}else{inactivate(event);} +this.blur();return false;});}else if(opts.activation=='focus'){$this.focus(function(event){activate(event);});$this.blur(function(event){inactivate(event);});}else{$this.click(function(){if($this.attr('href')&&$this.attr('href')==tipAttribute&&!opts.clickThrough){return false;}});var mouseTracks=function(evt){if(opts.tracking==true){var trackX=posX-evt.pageX;var trackY=tipY?tipY-evt.pageY:posY-evt.pageY;$this.mousemove(function(evt){$cluetip.css({left:evt.pageX+trackX,top:evt.pageY+trackY});});}};if($.fn.hoverIntent&&opts.hoverIntent){$this.mouseover(function(){$this.attr('title','');}).hoverIntent({sensitivity:opts.hoverIntent.sensitivity,interval:opts.hoverIntent.interval,over:function(event){activate(event);mouseTracks(event);},timeout:opts.hoverIntent.timeout,out:function(event){inactivate(event);$this.unbind('mousemove');}});}else{$this.hover(function(event){activate(event);mouseTracks(event);},function(event){inactivate(event);$this.unbind('mousemove');});}}});};$.fn.cluetip.defaults={width:275,height:'auto',cluezIndex:97,positionBy:'auto',topOffset:15,leftOffset:15,local:false,hideLocal:true,attribute:'rel',titleAttribute:'title',splitTitle:'',showTitle:true,cluetipClass:'default',hoverClass:'',waitImage:true,cursor:'help',arrows:false,dropShadow:true,dropShadowSteps:6,sticky:false,mouseOutClose:false,activation:'hover',clickThrough:false,tracking:false,delayedClose:0,closePosition:'top',closeText:'Close',truncate:0,fx:{open:'show',openSpeed:''},hoverIntent:{sensitivity:3,interval:50,timeout:0},onActivate:function(e){return true;},onShow:function(ct,c){},ajaxCache:true,ajaxProcess:function(data){data=data.replace(/<s(cript|tyle)(.|\s)*?\/s(cript|tyle)>/g,'').replace(/<(link|title)(.|\s)*?\/(link|title)>/g,'');return data;},ajaxSettings:{dataType:'html'},debug:false};var insertionType='appendTo',insertionElement='body';$.cluetip={};$.cluetip.setup=function(options){if(options&&options.insertionType&&(options.insertionType).match(/appendTo|prependTo|insertBefore|insertAfter/)){insertionType=options.insertionType;} +if(options&&options.insertionElement){insertionElement=options.insertionElement;}};})(jQuery); diff --git a/js/jquery/jquery.dimensions.js b/js/jquery/jquery.dimensions.js new file mode 100644 index 000000000..ddbd642ab --- /dev/null +++ b/js/jquery/jquery.dimensions.js @@ -0,0 +1,12 @@ +/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * $LastChangedDate: 2011-06-03 16:46:51 +0200 (ven. 03 juin 2011) $ + * $Rev: 6844 $ + * + * Version: 1.2 + * + * Requires: jQuery 1.2+ + */ +(function($){$.dimensions={version:'1.2'};$.each(['Height','Width'],function(i,name){$.fn['inner'+name]=function(){if(!this[0])return;var torl=name=='Height'?'Top':'Left',borr=name=='Height'?'Bottom':'Right';return this.is(':visible')?this[0]['client'+name]:num(this,name.toLowerCase())+num(this,'padding'+torl)+num(this,'padding'+borr);};$.fn['outer'+name]=function(options){if(!this[0])return;var torl=name=='Height'?'Top':'Left',borr=name=='Height'?'Bottom':'Right';options=$.extend({margin:false},options||{});var val=this.is(':visible')?this[0]['offset'+name]:num(this,name.toLowerCase())+num(this,'border'+torl+'Width')+num(this,'border'+borr+'Width')+num(this,'padding'+torl)+num(this,'padding'+borr);return val+(options.margin?(num(this,'margin'+torl)+num(this,'margin'+borr)):0);};});$.each(['Left','Top'],function(i,name){$.fn['scroll'+name]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(name=='Left'?val:$(window)['scrollLeft'](),name=='Top'?val:$(window)['scrollTop']()):this['scroll'+name]=val;}):this[0]==window||this[0]==document?self[(name=='Left'?'pageXOffset':'pageYOffset')]||$.boxModel&&document.documentElement['scroll'+name]||document.body['scroll'+name]:this[0]['scroll'+name];};});$.fn.extend({position:function(){var left=0,top=0,elem=this[0],offset,parentOffset,offsetParent,results;if(elem){offsetParent=this.offsetParent();offset=this.offset();parentOffset=offsetParent.offset();offset.top-=num(elem,'marginTop');offset.left-=num(elem,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&$.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return $(offsetParent);}});function num(el,prop){return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;};})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.easing.1.3.js b/js/jquery/jquery.easing.1.3.js new file mode 100644 index 000000000..0369b1d17 --- /dev/null +++ b/js/jquery/jquery.easing.1.3.js @@ -0,0 +1,146 @@ +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built In easIng capabilities added In jQuery 1.1 + * to offer multiple easIng options + * + * Copyright (c) 2007 George Smith + * Licensed under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + */ + +// t: current time, b: begInnIng value, c: change In value, d: duration +jQuery.easing['jswing'] = jQuery.easing['swing']; + +jQuery.extend( jQuery.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); diff --git a/js/jquery/jquery.fancybox-1.3.4.js b/js/jquery/jquery.fancybox-1.3.4.js new file mode 100644 index 000000000..a8520051d --- /dev/null +++ b/js/jquery/jquery.fancybox-1.3.4.js @@ -0,0 +1,1156 @@ +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. + * + * Version: 1.3.4 (11/11/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +;(function($) { + var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right, + + selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], + + ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, + + loadingTimer, loadingFrame = 1, + + titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }), + + isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest, + + /* + * Private methods + */ + + _abort = function() { + loading.hide(); + + imgPreloader.onerror = imgPreloader.onload = null; + + if (ajaxLoader) { + ajaxLoader.abort(); + } + + tmp.empty(); + }, + + _error = function() { + if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) { + loading.hide(); + busy = false; + return; + } + + selectedOpts.titleShow = false; + + selectedOpts.width = 'auto'; + selectedOpts.height = 'auto'; + + tmp.html( '<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>' ); + + _process_inline(); + }, + + _start = function() { + var obj = selectedArray[ selectedIndex ], + href, + type, + title, + str, + emb, + ret; + + _abort(); + + selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); + + ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts); + + if (ret === false) { + busy = false; + return; + } else if (typeof ret == 'object') { + selectedOpts = $.extend(selectedOpts, ret); + } + + title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || ''; + + if (obj.nodeName && !selectedOpts.orig) { + selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); + } + + if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) { + title = selectedOpts.orig.attr('alt'); + } + + href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null; + + if ((/^(?:javascript)/i).test(href) || href == '#') { + href = null; + } + + if (selectedOpts.type) { + type = selectedOpts.type; + + if (!href) { + href = selectedOpts.content; + } + + } else if (selectedOpts.content) { + type = 'html'; + + } else if (href) { + if (href.match(imgRegExp)) { + type = 'image'; + + } else if (href.match(swfRegExp)) { + type = 'swf'; + + } else if ($(obj).hasClass("iframe")) { + type = 'iframe'; + + } else if (href.indexOf("#") === 0) { + type = 'inline'; + + } else { + type = 'ajax'; + } + } + + if (!type) { + _error(); + return; + } + + if (type == 'inline') { + obj = href.substr(href.indexOf("#")); + type = $(obj).length > 0 ? 'inline' : 'ajax'; + } + + selectedOpts.type = type; + selectedOpts.href = href; + selectedOpts.title = title; + + if (selectedOpts.autoDimensions) { + if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') { + selectedOpts.width = 'auto'; + selectedOpts.height = 'auto'; + } else { + selectedOpts.autoDimensions = false; + } + } + + if (selectedOpts.modal) { + selectedOpts.overlayShow = true; + selectedOpts.hideOnOverlayClick = false; + selectedOpts.hideOnContentClick = false; + selectedOpts.enableEscapeButton = false; + selectedOpts.showCloseButton = false; + } + + selectedOpts.padding = parseInt(selectedOpts.padding, 10); + selectedOpts.margin = parseInt(selectedOpts.margin, 10); + + tmp.css('padding', (selectedOpts.padding + selectedOpts.margin)); + + $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { + $(this).replaceWith(content.children()); + }); + + switch (type) { + case 'html' : + tmp.html( selectedOpts.content ); + _process_inline(); + break; + + case 'inline' : + if ( $(obj).parent().is('#fancybox-content') === true) { + busy = false; + return; + } + + $('<div class="fancybox-inline-tmp" />') + .hide() + .insertBefore( $(obj) ) + .bind('fancybox-cleanup', function() { + $(this).replaceWith(content.children()); + }).bind('fancybox-cancel', function() { + $(this).replaceWith(tmp.children()); + }); + + $(obj).appendTo(tmp); + + _process_inline(); + break; + + case 'image': + busy = false; + + $.fancybox.showActivity(); + + imgPreloader = new Image(); + + imgPreloader.onerror = function() { + _error(); + }; + + imgPreloader.onload = function() { + busy = true; + + imgPreloader.onerror = imgPreloader.onload = null; + + _process_image(); + }; + + imgPreloader.src = href; + break; + + case 'swf': + selectedOpts.scrolling = 'no'; + + str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"><param name="movie" value="' + href + '"></param>'; + emb = ''; + + $.each(selectedOpts.swf, function(name, val) { + str += '<param name="' + name + '" value="' + val + '"></param>'; + emb += ' ' + name + '="' + val + '"'; + }); + + str += '<embed src="' + href + '" type="application/x-shockwave-flash" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"' + emb + '></embed></object>'; + + tmp.html(str); + + _process_inline(); + break; + + case 'ajax': + busy = false; + + $.fancybox.showActivity(); + + selectedOpts.ajax.win = selectedOpts.ajax.success; + + ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, { + url : href, + data : selectedOpts.ajax.data || {}, + error : function(XMLHttpRequest, textStatus, errorThrown) { + if ( XMLHttpRequest.status > 0 ) { + _error(); + } + }, + success : function(data, textStatus, XMLHttpRequest) { + var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader; + if (o.status == 200) { + if ( typeof selectedOpts.ajax.win == 'function' ) { + ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest); + + if (ret === false) { + loading.hide(); + return; + } else if (typeof ret == 'string' || typeof ret == 'object') { + data = ret; + } + } + + tmp.html( data ); + _process_inline(); + } + } + })); + + break; + + case 'iframe': + _show(); + break; + } + }, + + _process_inline = function() { + var + w = selectedOpts.width, + h = selectedOpts.height; + + if (w.toString().indexOf('%') > -1) { + w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px'; + + } else { + w = w == 'auto' ? 'auto' : w + 'px'; + } + + if (h.toString().indexOf('%') > -1) { + h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px'; + + } else { + h = h == 'auto' ? 'auto' : h + 'px'; + } + + tmp.wrapInner('<div style="width:' + w + ';height:' + h + ';overflow: ' + (selectedOpts.scrolling == 'auto' ? 'auto' : (selectedOpts.scrolling == 'yes' ? 'scroll' : 'hidden')) + ';position:relative;"></div>'); + + selectedOpts.width = tmp.width(); + selectedOpts.height = tmp.height(); + + _show(); + }, + + _process_image = function() { + selectedOpts.width = imgPreloader.width; + selectedOpts.height = imgPreloader.height; + + $("<img />").attr({ + 'id' : 'fancybox-img', + 'src' : imgPreloader.src, + 'alt' : selectedOpts.title + }).appendTo( tmp ); + + _show(); + }, + + _show = function() { + var pos, equal; + + loading.hide(); + + if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { + $.event.trigger('fancybox-cancel'); + + busy = false; + return; + } + + busy = true; + + $(content.add( overlay )).unbind(); + + $(window).unbind("resize.fb scroll.fb"); + $(document).unbind('keydown.fb'); + + if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') { + wrap.css('height', wrap.height()); + } + + currentArray = selectedArray; + currentIndex = selectedIndex; + currentOpts = selectedOpts; + + if (currentOpts.overlayShow) { + overlay.css({ + 'background-color' : currentOpts.overlayColor, + 'opacity' : currentOpts.overlayOpacity, + 'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto', + 'height' : $(document).height() + }); + + if (!overlay.is(':visible')) { + if (isIE6) { + $('select:not(#fancybox-tmp select)').filter(function() { + return this.style.visibility !== 'hidden'; + }).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() { + this.style.visibility = 'inherit'; + }); + } + + overlay.show(); + } + } else { + overlay.hide(); + } + + final_pos = _get_zoom_to(); + + _process_title(); + + if (wrap.is(":visible")) { + $( close.add( nav_left ).add( nav_right ) ).hide(); + + pos = wrap.position(), + + start_pos = { + top : pos.top, + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); + + content.fadeTo(currentOpts.changeFade, 0.3, function() { + var finish_resizing = function() { + content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish); + }; + + $.event.trigger('fancybox-change'); + + content + .empty() + .removeAttr('filter') + .css({ + 'border-width' : currentOpts.padding, + 'width' : final_pos.width - currentOpts.padding * 2, + 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 + }); + + if (equal) { + finish_resizing(); + + } else { + fx.prop = 0; + + $(fx).animate({prop: 1}, { + duration : currentOpts.changeSpeed, + easing : currentOpts.easingChange, + step : _draw, + complete : finish_resizing + }); + } + }); + + return; + } + + wrap.removeAttr("style"); + + content.css('border-width', currentOpts.padding); + + if (currentOpts.transitionIn == 'elastic') { + start_pos = _get_zoom_from(); + + content.html( tmp.contents() ); + + wrap.show(); + + if (currentOpts.opacity) { + final_pos.opacity = 0; + } + + fx.prop = 0; + + $(fx).animate({prop: 1}, { + duration : currentOpts.speedIn, + easing : currentOpts.easingIn, + step : _draw, + complete : _finish + }); + + return; + } + + if (currentOpts.titlePosition == 'inside' && titleHeight > 0) { + title.show(); + } + + content + .css({ + 'width' : final_pos.width - currentOpts.padding * 2, + 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 + }) + .html( tmp.contents() ); + + wrap + .css(final_pos) + .fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); + }, + + _format_title = function(title) { + if (title && title.length) { + if (currentOpts.titlePosition == 'float') { + return '<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">' + title + '</td><td id="fancybox-title-float-right"></td></tr></table>'; + } + + return '<div id="fancybox-title-' + currentOpts.titlePosition + '">' + title + '</div>'; + } + + return false; + }, + + _process_title = function() { + titleStr = currentOpts.title || ''; + titleHeight = 0; + + title + .empty() + .removeAttr('style') + .removeClass(); + + if (currentOpts.titleShow === false) { + title.hide(); + return; + } + + titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr); + + if (!titleStr || titleStr === '') { + title.hide(); + return; + } + + title + .addClass('fancybox-title-' + currentOpts.titlePosition) + .html( titleStr ) + .appendTo( 'body' ) + .show(); + + switch (currentOpts.titlePosition) { + case 'inside': + title + .css({ + 'width' : final_pos.width - (currentOpts.padding * 2), + 'marginLeft' : currentOpts.padding, + 'marginRight' : currentOpts.padding + }); + + titleHeight = title.outerHeight(true); + + title.appendTo( outer ); + + final_pos.height += titleHeight; + break; + + case 'over': + title + .css({ + 'marginLeft' : currentOpts.padding, + 'width' : final_pos.width - (currentOpts.padding * 2), + 'bottom' : currentOpts.padding + }) + .appendTo( outer ); + break; + + case 'float': + title + .css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1) + .appendTo( wrap ); + break; + + default: + title + .css({ + 'width' : final_pos.width - (currentOpts.padding * 2), + 'paddingLeft' : currentOpts.padding, + 'paddingRight' : currentOpts.padding + }) + .appendTo( wrap ); + break; + } + + title.hide(); + }, + + _set_navigation = function() { + if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) { + $(document).bind('keydown.fb', function(e) { + if (e.keyCode == 27 && currentOpts.enableEscapeButton) { + e.preventDefault(); + $.fancybox.close(); + + } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') { + e.preventDefault(); + $.fancybox[ e.keyCode == 37 ? 'prev' : 'next'](); + } + }); + } + + if (!currentOpts.showNavArrows) { + nav_left.hide(); + nav_right.hide(); + return; + } + + if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { + nav_left.show(); + } + + if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { + nav_right.show(); + } + }, + + _finish = function () { + if (!$.support.opacity) { + content.get(0).style.removeAttribute('filter'); + wrap.get(0).style.removeAttribute('filter'); + } + + if (selectedOpts.autoDimensions) { + content.css('height', 'auto'); + } + + wrap.css('height', 'auto'); + + if (titleStr && titleStr.length) { + title.show(); + } + + if (currentOpts.showCloseButton) { + close.show(); + } + + _set_navigation(); + + if (currentOpts.hideOnContentClick) { + content.bind('click', $.fancybox.close); + } + + if (currentOpts.hideOnOverlayClick) { + overlay.bind('click', $.fancybox.close); + } + + $(window).bind("resize.fb", $.fancybox.resize); + + if (currentOpts.centerOnScroll) { + $(window).bind("scroll.fb", $.fancybox.center); + } + + if (currentOpts.type == 'iframe') { + $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content); + } + + wrap.show(); + + busy = false; + + $.fancybox.center(); + + currentOpts.onComplete(currentArray, currentIndex, currentOpts); + + _preload_images(); + }, + + _preload_images = function() { + var href, + objNext; + + if ((currentArray.length -1) > currentIndex) { + href = currentArray[ currentIndex + 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + + if (currentIndex > 0) { + href = currentArray[ currentIndex - 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + }, + + _draw = function(pos) { + var dim = { + width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), + height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), + + top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), + left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) + }; + + if (typeof final_pos.opacity !== 'undefined') { + dim.opacity = pos < 0.5 ? 0.5 : pos; + } + + wrap.css(dim); + + content.css({ + 'width' : dim.width - currentOpts.padding * 2, + 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 + }); + }, + + _get_viewport = function() { + return [ + $(window).width() - (currentOpts.margin * 2), + $(window).height() - (currentOpts.margin * 2), + $(document).scrollLeft() + currentOpts.margin, + $(document).scrollTop() + currentOpts.margin + ]; + }, + + _get_zoom_to = function () { + var view = _get_viewport(), + to = {}, + resize = currentOpts.autoScale, + double_padding = currentOpts.padding * 2, + ratio; + + if (currentOpts.width.toString().indexOf('%') > -1) { + to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); + } else { + to.width = currentOpts.width + double_padding; + } + + if (currentOpts.height.toString().indexOf('%') > -1) { + to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); + } else { + to.height = currentOpts.height + double_padding; + } + + if (resize && (to.width > view[0] || to.height > view[1])) { + if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { + ratio = (currentOpts.width ) / (currentOpts.height ); + + if ((to.width ) > view[0]) { + to.width = view[0]; + to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); + } + + if ((to.height) > view[1]) { + to.height = view[1]; + to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); + } + + } else { + to.width = Math.min(to.width, view[0]); + to.height = Math.min(to.height, view[1]); + } + } + + to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); + to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); + + return to; + }, + + _get_obj_pos = function(obj) { + var pos = obj.offset(); + + pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; + pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; + + pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; + pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; + + pos.width = obj.width(); + pos.height = obj.height(); + + return pos; + }, + + _get_zoom_from = function() { + var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, + from = {}, + pos, + view; + + if (orig && orig.length) { + pos = _get_obj_pos(orig); + + from = { + width : pos.width + (currentOpts.padding * 2), + height : pos.height + (currentOpts.padding * 2), + top : pos.top - currentOpts.padding - 20, + left : pos.left - currentOpts.padding - 20 + }; + + } else { + view = _get_viewport(); + + from = { + width : currentOpts.padding * 2, + height : currentOpts.padding * 2, + top : parseInt(view[3] + view[1] * 0.5, 10), + left : parseInt(view[2] + view[0] * 0.5, 10) + }; + } + + return from; + }, + + _animate_loading = function() { + if (!loading.is(':visible')){ + clearInterval(loadingTimer); + return; + } + + $('div', loading).css('top', (loadingFrame * -40) + 'px'); + + loadingFrame = (loadingFrame + 1) % 12; + }; + + /* + * Public methods + */ + + $.fn.fancybox = function(options) { + if (!$(this).length) { + return this; + } + + $(this) + .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) + .unbind('click.fb') + .bind('click.fb', function(e) { + e.preventDefault(); + + if (busy) { + return; + } + + busy = true; + + $(this).blur(); + + selectedArray = []; + selectedIndex = 0; + + var rel = $(this).attr('rel') || ''; + + if (!rel || rel == '' || rel === 'nofollow') { + selectedArray.push(this); + + } else { + selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); + selectedIndex = selectedArray.index( this ); + } + + _start(); + + return; + }); + + return this; + }; + + $.fancybox = function(obj) { + var opts; + + if (busy) { + return; + } + + busy = true; + opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; + + selectedArray = []; + selectedIndex = parseInt(opts.index, 10) || 0; + + if ($.isArray(obj)) { + for (var i = 0, j = obj.length; i < j; i++) { + if (typeof obj[i] == 'object') { + $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); + } else { + obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); + } + } + + selectedArray = jQuery.merge(selectedArray, obj); + + } else { + if (typeof obj == 'object') { + $(obj).data('fancybox', $.extend({}, opts, obj)); + } else { + obj = $({}).data('fancybox', $.extend({content : obj}, opts)); + } + + selectedArray.push(obj); + } + + if (selectedIndex > selectedArray.length || selectedIndex < 0) { + selectedIndex = 0; + } + + _start(); + }; + + $.fancybox.showActivity = function() { + clearInterval(loadingTimer); + + loading.show(); + loadingTimer = setInterval(_animate_loading, 66); + }; + + $.fancybox.hideActivity = function() { + loading.hide(); + }; + + $.fancybox.next = function() { + return $.fancybox.pos( currentIndex + 1); + }; + + $.fancybox.prev = function() { + return $.fancybox.pos( currentIndex - 1); + }; + + $.fancybox.pos = function(pos) { + if (busy) { + return; + } + + pos = parseInt(pos); + + selectedArray = currentArray; + + if (pos > -1 && pos < currentArray.length) { + selectedIndex = pos; + _start(); + + } else if (currentOpts.cyclic && currentArray.length > 1) { + selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; + _start(); + } + + return; + }; + + $.fancybox.cancel = function() { + if (busy) { + return; + } + + busy = true; + + $.event.trigger('fancybox-cancel'); + + _abort(); + + selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); + + busy = false; + }; + + // Note: within an iframe use - parent.$.fancybox.close(); + $.fancybox.close = function() { + if (busy || wrap.is(':hidden')) { + return; + } + + busy = true; + + if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { + busy = false; + return; + } + + _abort(); + + $(close.add( nav_left ).add( nav_right )).hide(); + + $(content.add( overlay )).unbind(); + + $(window).unbind("resize.fb scroll.fb"); + $(document).unbind('keydown.fb'); + + content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); + + if (currentOpts.titlePosition !== 'inside') { + title.empty(); + } + + wrap.stop(); + + function _cleanup() { + overlay.fadeOut('fast'); + + title.empty().hide(); + wrap.hide(); + + $.event.trigger('fancybox-cleanup'); + + content.empty(); + + currentOpts.onClosed(currentArray, currentIndex, currentOpts); + + currentArray = selectedOpts = []; + currentIndex = selectedIndex = 0; + currentOpts = selectedOpts = {}; + + busy = false; + } + + if (currentOpts.transitionOut == 'elastic') { + start_pos = _get_zoom_from(); + + var pos = wrap.position(); + + final_pos = { + top : pos.top , + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + if (currentOpts.opacity) { + final_pos.opacity = 1; + } + + title.empty().hide(); + + fx.prop = 1; + + $(fx).animate({ prop: 0 }, { + duration : currentOpts.speedOut, + easing : currentOpts.easingOut, + step : _draw, + complete : _cleanup + }); + + } else { + wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); + } + }; + + $.fancybox.resize = function() { + if (overlay.is(':visible')) { + overlay.css('height', $(document).height()); + } + + $.fancybox.center(true); + }; + + $.fancybox.center = function() { + var view, align; + + if (busy) { + return; + } + + align = arguments[0] === true ? 1 : 0; + view = _get_viewport(); + + if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { + return; + } + + wrap + .stop() + .animate({ + 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), + 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) + }, typeof arguments[0] == 'number' ? arguments[0] : 200); + }; + + $.fancybox.init = function() { + if ($("#fancybox-wrap").length) { + return; + } + + $('body').append( + tmp = $('<div id="fancybox-tmp"></div>'), + loading = $('<div id="fancybox-loading"><div></div></div>'), + overlay = $('<div id="fancybox-overlay"></div>'), + wrap = $('<div id="fancybox-wrap"></div>') + ); + + outer = $('<div id="fancybox-outer"></div>') + .append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>') + .appendTo( wrap ); + + outer.append( + content = $('<div id="fancybox-content"></div>'), + close = $('<a id="fancybox-close"></a>'), + title = $('<div id="fancybox-title"></div>'), + + nav_left = $('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'), + nav_right = $('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>') + ); + + close.click($.fancybox.close); + loading.click($.fancybox.cancel); + + nav_left.click(function(e) { + e.preventDefault(); + $.fancybox.prev(); + }); + + nav_right.click(function(e) { + e.preventDefault(); + $.fancybox.next(); + }); + + if ($.fn.mousewheel) { + wrap.bind('mousewheel.fb', function(e, delta) { + if (busy) { + e.preventDefault(); + + } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { + e.preventDefault(); + $.fancybox[ delta > 0 ? 'prev' : 'next'](); + } + }); + } + + if (!$.support.opacity) { + wrap.addClass('fancybox-ie'); + } + + if (isIE6) { + loading.addClass('fancybox-ie6'); + wrap.addClass('fancybox-ie6'); + + $('<iframe id="fancybox-hide-sel-frame" src="' + (/^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank' ) + '" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(outer); + } + }; + + $.fn.fancybox.defaults = { + padding : 10, + margin : 40, + opacity : false, + modal : false, + cyclic : false, + scrolling : 'auto', // 'auto', 'yes' or 'no' + + width : 560, + height : 340, + + autoScale : true, + autoDimensions : true, + centerOnScroll : false, + + ajax : {}, + swf : { wmode: 'transparent' }, + + hideOnOverlayClick : true, + hideOnContentClick : false, + + overlayShow : true, + overlayOpacity : 0.7, + overlayColor : '#777', + + titleShow : true, + titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' + titleFormat : null, + titleFromAlt : false, + + transitionIn : 'fade', // 'elastic', 'fade' or 'none' + transitionOut : 'fade', // 'elastic', 'fade' or 'none' + + speedIn : 300, + speedOut : 300, + + changeSpeed : 300, + changeFade : 'fast', + + easingIn : 'swing', + easingOut : 'swing', + + showCloseButton : true, + showNavArrows : true, + enableEscapeButton : true, + enableKeyboardNav : true, + + onStart : function(){}, + onCancel : function(){}, + onComplete : function(){}, + onCleanup : function(){}, + onClosed : function(){}, + onError : function(){} + }; + + $(document).ready(function() { + $.fancybox.init(); + }); + +})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.flot.min.js b/js/jquery/jquery.flot.min.js new file mode 100644 index 000000000..31f465b83 --- /dev/null +++ b/js/jquery/jquery.flot.min.js @@ -0,0 +1 @@ +(function(){jQuery.color={};jQuery.color.make=function(G,H,J,I){var A={};A.r=G||0;A.g=H||0;A.b=J||0;A.a=I!=null?I:1;A.add=function(C,D){for(var E=0;E<C.length;++E){A[C.charAt(E)]+=D}return A.normalize()};A.scale=function(C,D){for(var E=0;E<C.length;++E){A[C.charAt(E)]*=D}return A.normalize()};A.toString=function(){if(A.a>=1){return"rgb("+[A.r,A.g,A.b].join(",")+")"}else{return"rgba("+[A.r,A.g,A.b,A.a].join(",")+")"}};A.normalize=function(){function C(E,D,F){return D<E?E:(D>F?F:D)}A.r=C(0,parseInt(A.r),255);A.g=C(0,parseInt(A.g),255);A.b=C(0,parseInt(A.b),255);A.a=C(0,A.a,1);return A};A.clone=function(){return jQuery.color.make(A.r,A.b,A.g,A.a)};return A.normalize()};jQuery.color.extract=function(E,F){var A;do{A=E.css(F).toLowerCase();if(A!=""&&A!="transparent"){break}E=E.parent()}while(!jQuery.nodeName(E.get(0),"body"));if(A=="rgba(0, 0, 0, 0)"){A="transparent"}return jQuery.color.parse(A)};jQuery.color.parse=function(A){var F,H=jQuery.color.make;if(F=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10))}if(F=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10),parseFloat(F[4]))}if(F=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55)}if(F=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55,parseFloat(F[4]))}if(F=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(A)){return H(parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16))}if(F=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(A)){return H(parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16))}var G=jQuery.trim(A).toLowerCase();if(G=="transparent"){return H(255,255,255,0)}else{F=B[G];return H(F[0],F[1],F[2])}};var B={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();(function(C){function B(l,W,X,E){var O=[],g={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02},x2axis:{autoscaleMargin:null},y2axis:{autoscaleMargin:0.02},series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,tickColor:"rgba(0,0,0,0.15)",labelMargin:5,borderWidth:2,borderColor:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},P=null,AC=null,AD=null,Y=null,AJ=null,s={xaxis:{},yaxis:{},x2axis:{},y2axis:{}},e={left:0,right:0,top:0,bottom:0},y=0,Q=0,I=0,t=0,L={processOptions:[],processRawData:[],processDatapoints:[],draw:[],bindEvents:[],drawOverlay:[]},G=this;G.setData=f;G.setupGrid=k;G.draw=AH;G.getPlaceholder=function(){return l};G.getCanvas=function(){return P};G.getPlotOffset=function(){return e};G.width=function(){return I};G.height=function(){return t};G.offset=function(){var AK=AD.offset();AK.left+=e.left;AK.top+=e.top;return AK};G.getData=function(){return O};G.getAxes=function(){return s};G.getOptions=function(){return g};G.highlight=AE;G.unhighlight=x;G.triggerRedrawOverlay=q;G.pointOffset=function(AK){return{left:parseInt(T(AK,"xaxis").p2c(+AK.x)+e.left),top:parseInt(T(AK,"yaxis").p2c(+AK.y)+e.top)}};G.hooks=L;b(G);r(X);c();f(W);k();AH();AG();function Z(AM,AK){AK=[G].concat(AK);for(var AL=0;AL<AM.length;++AL){AM[AL].apply(this,AK)}}function b(){for(var AK=0;AK<E.length;++AK){var AL=E[AK];AL.init(G);if(AL.options){C.extend(true,g,AL.options)}}}function r(AK){C.extend(true,g,AK);if(g.grid.borderColor==null){g.grid.borderColor=g.grid.color}if(g.xaxis.noTicks&&g.xaxis.ticks==null){g.xaxis.ticks=g.xaxis.noTicks}if(g.yaxis.noTicks&&g.yaxis.ticks==null){g.yaxis.ticks=g.yaxis.noTicks}if(g.grid.coloredAreas){g.grid.markings=g.grid.coloredAreas}if(g.grid.coloredAreasColor){g.grid.markingsColor=g.grid.coloredAreasColor}if(g.lines){C.extend(true,g.series.lines,g.lines)}if(g.points){C.extend(true,g.series.points,g.points)}if(g.bars){C.extend(true,g.series.bars,g.bars)}if(g.shadowSize){g.series.shadowSize=g.shadowSize}for(var AL in L){if(g.hooks[AL]&&g.hooks[AL].length){L[AL]=L[AL].concat(g.hooks[AL])}}Z(L.processOptions,[g])}function f(AK){O=M(AK);U();m()}function M(AN){var AL=[];for(var AK=0;AK<AN.length;++AK){var AM=C.extend(true,{},g.series);if(AN[AK].data){AM.data=AN[AK].data;delete AN[AK].data;C.extend(true,AM,AN[AK]);AN[AK].data=AM.data}else{AM.data=AN[AK]}AL.push(AM)}return AL}function T(AM,AK){var AL=AM[AK];if(!AL||AL==1){return s[AK]}if(typeof AL=="number"){return s[AK.charAt(0)+AL+AK.slice(1)]}return AL}function U(){var AP;var AV=O.length,AK=[],AN=[];for(AP=0;AP<O.length;++AP){var AS=O[AP].color;if(AS!=null){--AV;if(typeof AS=="number"){AN.push(AS)}else{AK.push(C.color.parse(O[AP].color))}}}for(AP=0;AP<AN.length;++AP){AV=Math.max(AV,AN[AP]+1)}var AL=[],AO=0;AP=0;while(AL.length<AV){var AR;if(g.colors.length==AP){AR=C.color.make(100,100,100)}else{AR=C.color.parse(g.colors[AP])}var AM=AO%2==1?-1:1;AR.scale("rgb",1+AM*Math.ceil(AO/2)*0.2);AL.push(AR);++AP;if(AP>=g.colors.length){AP=0;++AO}}var AQ=0,AW;for(AP=0;AP<O.length;++AP){AW=O[AP];if(AW.color==null){AW.color=AL[AQ].toString();++AQ}else{if(typeof AW.color=="number"){AW.color=AL[AW.color].toString()}}if(AW.lines.show==null){var AU,AT=true;for(AU in AW){if(AW[AU].show){AT=false;break}}if(AT){AW.lines.show=true}}AW.xaxis=T(AW,"xaxis");AW.yaxis=T(AW,"yaxis")}}function m(){var AW=Number.POSITIVE_INFINITY,AQ=Number.NEGATIVE_INFINITY,Ac,Aa,AZ,AV,AL,AR,Ab,AX,AP,AO,AK,Ai,Af,AT;for(AK in s){s[AK].datamin=AW;s[AK].datamax=AQ;s[AK].used=false}function AN(Al,Ak,Aj){if(Ak<Al.datamin){Al.datamin=Ak}if(Aj>Al.datamax){Al.datamax=Aj}}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];AR.datapoints={points:[]};Z(L.processRawData,[AR,AR.data,AR.datapoints])}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];var Ah=AR.data,Ae=AR.datapoints.format;if(!Ae){Ae=[];Ae.push({x:true,number:true,required:true});Ae.push({y:true,number:true,required:true});if(AR.bars.show){Ae.push({y:true,number:true,required:false,defaultValue:0})}AR.datapoints.format=Ae}if(AR.datapoints.pointsize!=null){continue}if(AR.datapoints.pointsize==null){AR.datapoints.pointsize=Ae.length}AX=AR.datapoints.pointsize;Ab=AR.datapoints.points;insertSteps=AR.lines.show&&AR.lines.steps;AR.xaxis.used=AR.yaxis.used=true;for(Aa=AZ=0;Aa<Ah.length;++Aa,AZ+=AX){AT=Ah[Aa];var AM=AT==null;if(!AM){for(AV=0;AV<AX;++AV){Ai=AT[AV];Af=Ae[AV];if(Af){if(Af.number&&Ai!=null){Ai=+Ai;if(isNaN(Ai)){Ai=null}}if(Ai==null){if(Af.required){AM=true}if(Af.defaultValue!=null){Ai=Af.defaultValue}}}Ab[AZ+AV]=Ai}}if(AM){for(AV=0;AV<AX;++AV){Ai=Ab[AZ+AV];if(Ai!=null){Af=Ae[AV];if(Af.x){AN(AR.xaxis,Ai,Ai)}if(Af.y){AN(AR.yaxis,Ai,Ai)}}Ab[AZ+AV]=null}}else{if(insertSteps&&AZ>0&&Ab[AZ-AX]!=null&&Ab[AZ-AX]!=Ab[AZ]&&Ab[AZ-AX+1]!=Ab[AZ+1]){for(AV=0;AV<AX;++AV){Ab[AZ+AX+AV]=Ab[AZ+AV]}Ab[AZ+1]=Ab[AZ-AX+1];AZ+=AX}}}}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];Z(L.processDatapoints,[AR,AR.datapoints])}for(Ac=0;Ac<O.length;++Ac){AR=O[Ac];Ab=AR.datapoints.points,AX=AR.datapoints.pointsize;var AS=AW,AY=AW,AU=AQ,Ad=AQ;for(Aa=0;Aa<Ab.length;Aa+=AX){if(Ab[Aa]==null){continue}for(AV=0;AV<AX;++AV){Ai=Ab[Aa+AV];Af=Ae[AV];if(!Af){continue}if(Af.x){if(Ai<AS){AS=Ai}if(Ai>AU){AU=Ai}}if(Af.y){if(Ai<AY){AY=Ai}if(Ai>Ad){Ad=Ai}}}}if(AR.bars.show){var Ag=AR.bars.align=="left"?0:-AR.bars.barWidth/2;if(AR.bars.horizontal){AY+=Ag;Ad+=Ag+AR.bars.barWidth}else{AS+=Ag;AU+=Ag+AR.bars.barWidth}}AN(AR.xaxis,AS,AU);AN(AR.yaxis,AY,Ad)}for(AK in s){if(s[AK].datamin==AW){s[AK].datamin=null}if(s[AK].datamax==AQ){s[AK].datamax=null}}}function c(){function AK(AM,AL){var AN=document.createElement("canvas");AN.width=AM;AN.height=AL;if(C.browser.msie){AN=window.G_vmlCanvasManager.initElement(AN)}return AN}y=l.width();Q=l.height();l.html("");if(l.css("position")=="static"){l.css("position","relative")}if(y<=0||Q<=0){throw"Invalid dimensions for plot, width = "+y+", height = "+Q}if(C.browser.msie){window.G_vmlCanvasManager.init_(document)}P=C(AK(y,Q)).appendTo(l).get(0);Y=P.getContext("2d");AC=C(AK(y,Q)).css({position:"absolute",left:0,top:0}).appendTo(l).get(0);AJ=AC.getContext("2d");AJ.stroke()}function AG(){AD=C([AC,P]);if(g.grid.hoverable){AD.mousemove(D)}if(g.grid.clickable){AD.click(d)}Z(L.bindEvents,[AD])}function k(){function AL(AT,AU){function AP(AV){return AV}var AS,AO,AQ=AU.transform||AP,AR=AU.inverseTransform;if(AT==s.xaxis||AT==s.x2axis){AS=AT.scale=I/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.min);if(AQ==AP){AT.p2c=function(AV){return(AV-AO)*AS}}else{AT.p2c=function(AV){return(AQ(AV)-AO)*AS}}if(!AR){AT.c2p=function(AV){return AO+AV/AS}}else{AT.c2p=function(AV){return AR(AO+AV/AS)}}}else{AS=AT.scale=t/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.max);if(AQ==AP){AT.p2c=function(AV){return(AO-AV)*AS}}else{AT.p2c=function(AV){return(AO-AQ(AV))*AS}}if(!AR){AT.c2p=function(AV){return AO-AV/AS}}else{AT.c2p=function(AV){return AR(AO-AV/AS)}}}}function AN(AR,AT){var AQ,AS=[],AP;AR.labelWidth=AT.labelWidth;AR.labelHeight=AT.labelHeight;if(AR==s.xaxis||AR==s.x2axis){if(AR.labelWidth==null){AR.labelWidth=y/(AR.ticks.length>0?AR.ticks.length:1)}if(AR.labelHeight==null){AS=[];for(AQ=0;AQ<AR.ticks.length;++AQ){AP=AR.ticks[AQ].label;if(AP){AS.push('<div class="tickLabel" style="float:left;width:'+AR.labelWidth+'px">'+AP+"</div>")}}if(AS.length>0){var AO=C('<div style="position:absolute;top:-10000px;width:10000px;font-size:smaller">'+AS.join("")+'<div style="clear:left"></div></div>').appendTo(l);AR.labelHeight=AO.height();AO.remove()}}}else{if(AR.labelWidth==null||AR.labelHeight==null){for(AQ=0;AQ<AR.ticks.length;++AQ){AP=AR.ticks[AQ].label;if(AP){AS.push('<div class="tickLabel">'+AP+"</div>")}}if(AS.length>0){var AO=C('<div style="position:absolute;top:-10000px;font-size:smaller">'+AS.join("")+"</div>").appendTo(l);if(AR.labelWidth==null){AR.labelWidth=AO.width()}if(AR.labelHeight==null){AR.labelHeight=AO.find("div").height()}AO.remove()}}}if(AR.labelWidth==null){AR.labelWidth=0}if(AR.labelHeight==null){AR.labelHeight=0}}function AM(){var AP=g.grid.borderWidth;for(i=0;i<O.length;++i){AP=Math.max(AP,2*(O[i].points.radius+O[i].points.lineWidth/2))}e.left=e.right=e.top=e.bottom=AP;var AO=g.grid.labelMargin+g.grid.borderWidth;if(s.xaxis.labelHeight>0){e.bottom=Math.max(AP,s.xaxis.labelHeight+AO)}if(s.yaxis.labelWidth>0){e.left=Math.max(AP,s.yaxis.labelWidth+AO)}if(s.x2axis.labelHeight>0){e.top=Math.max(AP,s.x2axis.labelHeight+AO)}if(s.y2axis.labelWidth>0){e.right=Math.max(AP,s.y2axis.labelWidth+AO)}I=y-e.left-e.right;t=Q-e.bottom-e.top}var AK;for(AK in s){K(s[AK],g[AK])}if(g.grid.show){for(AK in s){F(s[AK],g[AK]);p(s[AK],g[AK]);AN(s[AK],g[AK])}AM()}else{e.left=e.right=e.top=e.bottom=0;I=y;t=Q}for(AK in s){AL(s[AK],g[AK])}if(g.grid.show){h()}AI()}function K(AN,AQ){var AM=+(AQ.min!=null?AQ.min:AN.datamin),AK=+(AQ.max!=null?AQ.max:AN.datamax),AP=AK-AM;if(AP==0){var AL=AK==0?1:0.01;if(AQ.min==null){AM-=AL}if(AQ.max==null||AQ.min!=null){AK+=AL}}else{var AO=AQ.autoscaleMargin;if(AO!=null){if(AQ.min==null){AM-=AP*AO;if(AM<0&&AN.datamin!=null&&AN.datamin>=0){AM=0}}if(AQ.max==null){AK+=AP*AO;if(AK>0&&AN.datamax!=null&&AN.datamax<=0){AK=0}}}}AN.min=AM;AN.max=AK}function F(AP,AS){var AO;if(typeof AS.ticks=="number"&&AS.ticks>0){AO=AS.ticks}else{if(AP==s.xaxis||AP==s.x2axis){AO=0.3*Math.sqrt(y)}else{AO=0.3*Math.sqrt(Q)}}var AX=(AP.max-AP.min)/AO,AZ,AT,AV,AW,AR,AM,AL;if(AS.mode=="time"){var AU={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var AY=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var AN=0;if(AS.minTickSize!=null){if(typeof AS.tickSize=="number"){AN=AS.tickSize}else{AN=AS.minTickSize[0]*AU[AS.minTickSize[1]]}}for(AR=0;AR<AY.length-1;++AR){if(AX<(AY[AR][0]*AU[AY[AR][1]]+AY[AR+1][0]*AU[AY[AR+1][1]])/2&&AY[AR][0]*AU[AY[AR][1]]>=AN){break}}AZ=AY[AR][0];AV=AY[AR][1];if(AV=="year"){AM=Math.pow(10,Math.floor(Math.log(AX/AU.year)/Math.LN10));AL=(AX/AU.year)/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM}if(AS.tickSize){AZ=AS.tickSize[0];AV=AS.tickSize[1]}AT=function(Ac){var Ah=[],Af=Ac.tickSize[0],Ai=Ac.tickSize[1],Ag=new Date(Ac.min);var Ab=Af*AU[Ai];if(Ai=="second"){Ag.setUTCSeconds(A(Ag.getUTCSeconds(),Af))}if(Ai=="minute"){Ag.setUTCMinutes(A(Ag.getUTCMinutes(),Af))}if(Ai=="hour"){Ag.setUTCHours(A(Ag.getUTCHours(),Af))}if(Ai=="month"){Ag.setUTCMonth(A(Ag.getUTCMonth(),Af))}if(Ai=="year"){Ag.setUTCFullYear(A(Ag.getUTCFullYear(),Af))}Ag.setUTCMilliseconds(0);if(Ab>=AU.minute){Ag.setUTCSeconds(0)}if(Ab>=AU.hour){Ag.setUTCMinutes(0)}if(Ab>=AU.day){Ag.setUTCHours(0)}if(Ab>=AU.day*4){Ag.setUTCDate(1)}if(Ab>=AU.year){Ag.setUTCMonth(0)}var Ak=0,Aj=Number.NaN,Ad;do{Ad=Aj;Aj=Ag.getTime();Ah.push({v:Aj,label:Ac.tickFormatter(Aj,Ac)});if(Ai=="month"){if(Af<1){Ag.setUTCDate(1);var Aa=Ag.getTime();Ag.setUTCMonth(Ag.getUTCMonth()+1);var Ae=Ag.getTime();Ag.setTime(Aj+Ak*AU.hour+(Ae-Aa)*Af);Ak=Ag.getUTCHours();Ag.setUTCHours(0)}else{Ag.setUTCMonth(Ag.getUTCMonth()+Af)}}else{if(Ai=="year"){Ag.setUTCFullYear(Ag.getUTCFullYear()+Af)}else{Ag.setTime(Aj+Ab)}}}while(Aj<Ac.max&&Aj!=Ad);return Ah};AW=function(Aa,Ad){var Af=new Date(Aa);if(AS.timeformat!=null){return C.plot.formatDate(Af,AS.timeformat,AS.monthNames)}var Ab=Ad.tickSize[0]*AU[Ad.tickSize[1]];var Ac=Ad.max-Ad.min;var Ae=(AS.twelveHourClock)?" %p":"";if(Ab<AU.minute){fmt="%h:%M:%S"+Ae}else{if(Ab<AU.day){if(Ac<2*AU.day){fmt="%h:%M"+Ae}else{fmt="%b %d %h:%M"+Ae}}else{if(Ab<AU.month){fmt="%b %d"}else{if(Ab<AU.year){if(Ac<AU.year){fmt="%b"}else{fmt="%b %y"}}else{fmt="%y"}}}}return C.plot.formatDate(Af,fmt,AS.monthNames)}}else{var AK=AS.tickDecimals;var AQ=-Math.floor(Math.log(AX)/Math.LN10);if(AK!=null&&AQ>AK){AQ=AK}AM=Math.pow(10,-AQ);AL=AX/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2;if(AL>2.25&&(AK==null||AQ+1<=AK)){AZ=2.5;++AQ}}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM;if(AS.minTickSize!=null&&AZ<AS.minTickSize){AZ=AS.minTickSize}if(AS.tickSize!=null){AZ=AS.tickSize}AP.tickDecimals=Math.max(0,(AK!=null)?AK:AQ);AT=function(Ac){var Ae=[];var Af=A(Ac.min,Ac.tickSize),Ab=0,Aa=Number.NaN,Ad;do{Ad=Aa;Aa=Af+Ab*Ac.tickSize;Ae.push({v:Aa,label:Ac.tickFormatter(Aa,Ac)});++Ab}while(Aa<Ac.max&&Aa!=Ad);return Ae};AW=function(Aa,Ab){return Aa.toFixed(Ab.tickDecimals)}}AP.tickSize=AV?[AZ,AV]:AZ;AP.tickGenerator=AT;if(C.isFunction(AS.tickFormatter)){AP.tickFormatter=function(Aa,Ab){return""+AS.tickFormatter(Aa,Ab)}}else{AP.tickFormatter=AW}}function p(AO,AQ){AO.ticks=[];if(!AO.used){return }if(AQ.ticks==null){AO.ticks=AO.tickGenerator(AO)}else{if(typeof AQ.ticks=="number"){if(AQ.ticks>0){AO.ticks=AO.tickGenerator(AO)}}else{if(AQ.ticks){var AP=AQ.ticks;if(C.isFunction(AP)){AP=AP({min:AO.min,max:AO.max})}var AN,AK;for(AN=0;AN<AP.length;++AN){var AL=null;var AM=AP[AN];if(typeof AM=="object"){AK=AM[0];if(AM.length>1){AL=AM[1]}}else{AK=AM}if(AL==null){AL=AO.tickFormatter(AK,AO)}AO.ticks[AN]={v:AK,label:AL}}}}}if(AQ.autoscaleMargin!=null&&AO.ticks.length>0){if(AQ.min==null){AO.min=Math.min(AO.min,AO.ticks[0].v)}if(AQ.max==null&&AO.ticks.length>1){AO.max=Math.max(AO.max,AO.ticks[AO.ticks.length-1].v)}}}function AH(){Y.clearRect(0,0,y,Q);var AL=g.grid;if(AL.show&&!AL.aboveData){S()}for(var AK=0;AK<O.length;++AK){AA(O[AK])}Z(L.draw,[Y]);if(AL.show&&AL.aboveData){S()}}function N(AL,AR){var AO=AR+"axis",AK=AR+"2axis",AN,AQ,AP,AM;if(AL[AO]){AN=s[AO];AQ=AL[AO].from;AP=AL[AO].to}else{if(AL[AK]){AN=s[AK];AQ=AL[AK].from;AP=AL[AK].to}else{AN=s[AO];AQ=AL[AR+"1"];AP=AL[AR+"2"]}}if(AQ!=null&&AP!=null&&AQ>AP){return{from:AP,to:AQ,axis:AN}}return{from:AQ,to:AP,axis:AN}}function S(){var AO;Y.save();Y.translate(e.left,e.top);if(g.grid.backgroundColor){Y.fillStyle=R(g.grid.backgroundColor,t,0,"rgba(255, 255, 255, 0)");Y.fillRect(0,0,I,t)}var AL=g.grid.markings;if(AL){if(C.isFunction(AL)){AL=AL({xmin:s.xaxis.min,xmax:s.xaxis.max,ymin:s.yaxis.min,ymax:s.yaxis.max,xaxis:s.xaxis,yaxis:s.yaxis,x2axis:s.x2axis,y2axis:s.y2axis})}for(AO=0;AO<AL.length;++AO){var AK=AL[AO],AQ=N(AK,"x"),AN=N(AK,"y");if(AQ.from==null){AQ.from=AQ.axis.min}if(AQ.to==null){AQ.to=AQ.axis.max}if(AN.from==null){AN.from=AN.axis.min}if(AN.to==null){AN.to=AN.axis.max}if(AQ.to<AQ.axis.min||AQ.from>AQ.axis.max||AN.to<AN.axis.min||AN.from>AN.axis.max){continue}AQ.from=Math.max(AQ.from,AQ.axis.min);AQ.to=Math.min(AQ.to,AQ.axis.max);AN.from=Math.max(AN.from,AN.axis.min);AN.to=Math.min(AN.to,AN.axis.max);if(AQ.from==AQ.to&&AN.from==AN.to){continue}AQ.from=AQ.axis.p2c(AQ.from);AQ.to=AQ.axis.p2c(AQ.to);AN.from=AN.axis.p2c(AN.from);AN.to=AN.axis.p2c(AN.to);if(AQ.from==AQ.to||AN.from==AN.to){Y.beginPath();Y.strokeStyle=AK.color||g.grid.markingsColor;Y.lineWidth=AK.lineWidth||g.grid.markingsLineWidth;Y.moveTo(AQ.from,AN.from);Y.lineTo(AQ.to,AN.to);Y.stroke()}else{Y.fillStyle=AK.color||g.grid.markingsColor;Y.fillRect(AQ.from,AN.to,AQ.to-AQ.from,AN.from-AN.to)}}}Y.lineWidth=1;Y.strokeStyle=g.grid.tickColor;Y.beginPath();var AM,AP=s.xaxis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=s.xaxis.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,0);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,t)}AP=s.yaxis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=AP.max){continue}Y.moveTo(0,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}AP=s.x2axis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=AP.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,-5);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,5)}AP=s.y2axis;for(AO=0;AO<AP.ticks.length;++AO){AM=AP.ticks[AO].v;if(AM<=AP.min||AM>=AP.max){continue}Y.moveTo(I-5,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I+5,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}Y.stroke();if(g.grid.borderWidth){var AR=g.grid.borderWidth;Y.lineWidth=AR;Y.strokeStyle=g.grid.borderColor;Y.strokeRect(-AR/2,-AR/2,I+AR,t+AR)}Y.restore()}function h(){l.find(".tickLabels").remove();var AK=['<div class="tickLabels" style="font-size:smaller;color:'+g.grid.color+'">'];function AM(AP,AQ){for(var AO=0;AO<AP.ticks.length;++AO){var AN=AP.ticks[AO];if(!AN.label||AN.v<AP.min||AN.v>AP.max){continue}AK.push(AQ(AN,AP))}}var AL=g.grid.labelMargin+g.grid.borderWidth;AM(s.xaxis,function(AN,AO){return'<div style="position:absolute;top:'+(e.top+t+AL)+"px;left:"+Math.round(e.left+AO.p2c(AN.v)-AO.labelWidth/2)+"px;width:"+AO.labelWidth+'px;text-align:center" class="tickLabel">'+AN.label+"</div>"});AM(s.yaxis,function(AN,AO){return'<div style="position:absolute;top:'+Math.round(e.top+AO.p2c(AN.v)-AO.labelHeight/2)+"px;right:"+(e.right+I+AL)+"px;width:"+AO.labelWidth+'px;text-align:right" class="tickLabel">'+AN.label+"</div>"});AM(s.x2axis,function(AN,AO){return'<div style="position:absolute;bottom:'+(e.bottom+t+AL)+"px;left:"+Math.round(e.left+AO.p2c(AN.v)-AO.labelWidth/2)+"px;width:"+AO.labelWidth+'px;text-align:center" class="tickLabel">'+AN.label+"</div>"});AM(s.y2axis,function(AN,AO){return'<div style="position:absolute;top:'+Math.round(e.top+AO.p2c(AN.v)-AO.labelHeight/2)+"px;left:"+(e.left+I+AL)+"px;width:"+AO.labelWidth+'px;text-align:left" class="tickLabel">'+AN.label+"</div>"});AK.push("</div>");l.append(AK.join(""))}function AA(AK){if(AK.lines.show){a(AK)}if(AK.bars.show){n(AK)}if(AK.points.show){o(AK)}}function a(AN){function AM(AY,AZ,AR,Ad,Ac){var Ae=AY.points,AS=AY.pointsize,AW=null,AV=null;Y.beginPath();for(var AX=AS;AX<Ae.length;AX+=AS){var AU=Ae[AX-AS],Ab=Ae[AX-AS+1],AT=Ae[AX],Aa=Ae[AX+1];if(AU==null||AT==null){continue}if(Ab<=Aa&&Ab<Ac.min){if(Aa<Ac.min){continue}AU=(Ac.min-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(Aa<=Ab&&Aa<Ac.min){if(Ab<Ac.min){continue}AT=(Ac.min-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.min}}if(Ab>=Aa&&Ab>Ac.max){if(Aa>Ac.max){continue}AU=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(Aa>=Ab&&Aa>Ac.max){if(Ab>Ac.max){continue}AT=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.max}}if(AU<=AT&&AU<Ad.min){if(AT<Ad.min){continue}Ab=(Ad.min-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.min}else{if(AT<=AU&&AT<Ad.min){if(AU<Ad.min){continue}Aa=(Ad.min-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.min}}if(AU>=AT&&AU>Ad.max){if(AT>Ad.max){continue}Ab=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.max}else{if(AT>=AU&&AT>Ad.max){if(AU>Ad.max){continue}Aa=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.max}}if(AU!=AW||Ab!=AV){Y.moveTo(Ad.p2c(AU)+AZ,Ac.p2c(Ab)+AR)}AW=AT;AV=Aa;Y.lineTo(Ad.p2c(AT)+AZ,Ac.p2c(Aa)+AR)}Y.stroke()}function AO(AX,Ae,Ac){var Af=AX.points,AR=AX.pointsize,AS=Math.min(Math.max(0,Ac.min),Ac.max),Aa,AV=0,Ad=false;for(var AW=AR;AW<Af.length;AW+=AR){var AU=Af[AW-AR],Ab=Af[AW-AR+1],AT=Af[AW],AZ=Af[AW+1];if(Ad&&AU!=null&&AT==null){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill();Ad=false;continue}if(AU==null||AT==null){continue}if(AU<=AT&&AU<Ae.min){if(AT<Ae.min){continue}Ab=(Ae.min-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.min}else{if(AT<=AU&&AT<Ae.min){if(AU<Ae.min){continue}AZ=(Ae.min-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.min}}if(AU>=AT&&AU>Ae.max){if(AT>Ae.max){continue}Ab=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.max}else{if(AT>=AU&&AT>Ae.max){if(AU>Ae.max){continue}AZ=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.max}}if(!Ad){Y.beginPath();Y.moveTo(Ae.p2c(AU),Ac.p2c(AS));Ad=true}if(Ab>=Ac.max&&AZ>=Ac.max){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.max));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.max));AV=AT;continue}else{if(Ab<=Ac.min&&AZ<=Ac.min){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.min));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.min));AV=AT;continue}}var Ag=AU,AY=AT;if(Ab<=AZ&&Ab<Ac.min&&AZ>=Ac.min){AU=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(AZ<=Ab&&AZ<Ac.min&&Ab>=Ac.min){AT=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.min}}if(Ab>=AZ&&Ab>Ac.max&&AZ<=Ac.max){AU=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(AZ>=Ab&&AZ>Ac.max&&Ab<=Ac.max){AT=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.max}}if(AU!=Ag){if(Ab<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(Ag),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AU),Ac.p2c(Aa))}Y.lineTo(Ae.p2c(AU),Ac.p2c(Ab));Y.lineTo(Ae.p2c(AT),Ac.p2c(AZ));if(AT!=AY){if(AZ<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(AT),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AY),Ac.p2c(Aa))}AV=Math.max(AT,AY)}if(Ad){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill()}}Y.save();Y.translate(e.left,e.top);Y.lineJoin="round";var AP=AN.lines.lineWidth,AK=AN.shadowSize;if(AP>0&&AK>0){Y.lineWidth=AK;Y.strokeStyle="rgba(0,0,0,0.1)";var AQ=Math.PI/18;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/2),Math.cos(AQ)*(AP/2+AK/2),AN.xaxis,AN.yaxis);Y.lineWidth=AK/2;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/4),Math.cos(AQ)*(AP/2+AK/4),AN.xaxis,AN.yaxis)}Y.lineWidth=AP;Y.strokeStyle=AN.color;var AL=V(AN.lines,AN.color,0,t);if(AL){Y.fillStyle=AL;AO(AN.datapoints,AN.xaxis,AN.yaxis)}if(AP>0){AM(AN.datapoints,0,0,AN.xaxis,AN.yaxis)}Y.restore()}function o(AN){function AP(AU,AT,Ab,AR,AV,AZ,AY){var Aa=AU.points,AQ=AU.pointsize;for(var AS=0;AS<Aa.length;AS+=AQ){var AX=Aa[AS],AW=Aa[AS+1];if(AX==null||AX<AZ.min||AX>AZ.max||AW<AY.min||AW>AY.max){continue}Y.beginPath();Y.arc(AZ.p2c(AX),AY.p2c(AW)+AR,AT,0,AV,false);if(Ab){Y.fillStyle=Ab;Y.fill()}Y.stroke()}}Y.save();Y.translate(e.left,e.top);var AO=AN.lines.lineWidth,AL=AN.shadowSize,AK=AN.points.radius;if(AO>0&&AL>0){var AM=AL/2;Y.lineWidth=AM;Y.strokeStyle="rgba(0,0,0,0.1)";AP(AN.datapoints,AK,null,AM+AM/2,Math.PI,AN.xaxis,AN.yaxis);Y.strokeStyle="rgba(0,0,0,0.2)";AP(AN.datapoints,AK,null,AM/2,Math.PI,AN.xaxis,AN.yaxis)}Y.lineWidth=AO;Y.strokeStyle=AN.color;AP(AN.datapoints,AK,V(AN.points,AN.color),0,2*Math.PI,AN.xaxis,AN.yaxis);Y.restore()}function AB(AV,AU,Ad,AQ,AY,AN,AL,AT,AS,Ac,AZ){var AM,Ab,AR,AX,AO,AK,AW,AP,Aa;if(AZ){AP=AK=AW=true;AO=false;AM=Ad;Ab=AV;AX=AU+AQ;AR=AU+AY;if(Ab<AM){Aa=Ab;Ab=AM;AM=Aa;AO=true;AK=false}}else{AO=AK=AW=true;AP=false;AM=AV+AQ;Ab=AV+AY;AR=Ad;AX=AU;if(AX<AR){Aa=AX;AX=AR;AR=Aa;AP=true;AW=false}}if(Ab<AT.min||AM>AT.max||AX<AS.min||AR>AS.max){return }if(AM<AT.min){AM=AT.min;AO=false}if(Ab>AT.max){Ab=AT.max;AK=false}if(AR<AS.min){AR=AS.min;AP=false}if(AX>AS.max){AX=AS.max;AW=false}AM=AT.p2c(AM);AR=AS.p2c(AR);Ab=AT.p2c(Ab);AX=AS.p2c(AX);if(AL){Ac.beginPath();Ac.moveTo(AM,AR);Ac.lineTo(AM,AX);Ac.lineTo(Ab,AX);Ac.lineTo(Ab,AR);Ac.fillStyle=AL(AR,AX);Ac.fill()}if(AO||AK||AW||AP){Ac.beginPath();Ac.moveTo(AM,AR+AN);if(AO){Ac.lineTo(AM,AX+AN)}else{Ac.moveTo(AM,AX+AN)}if(AW){Ac.lineTo(Ab,AX+AN)}else{Ac.moveTo(Ab,AX+AN)}if(AK){Ac.lineTo(Ab,AR+AN)}else{Ac.moveTo(Ab,AR+AN)}if(AP){Ac.lineTo(AM,AR+AN)}else{Ac.moveTo(AM,AR+AN)}Ac.stroke()}}function n(AM){function AL(AS,AR,AU,AP,AT,AW,AV){var AX=AS.points,AO=AS.pointsize;for(var AQ=0;AQ<AX.length;AQ+=AO){if(AX[AQ]==null){continue}AB(AX[AQ],AX[AQ+1],AX[AQ+2],AR,AU,AP,AT,AW,AV,Y,AM.bars.horizontal)}}Y.save();Y.translate(e.left,e.top);Y.lineWidth=AM.bars.lineWidth;Y.strokeStyle=AM.color;var AK=AM.bars.align=="left"?0:-AM.bars.barWidth/2;var AN=AM.bars.fill?function(AO,AP){return V(AM.bars,AM.color,AO,AP)}:null;AL(AM.datapoints,AK,AK+AM.bars.barWidth,0,AN,AM.xaxis,AM.yaxis);Y.restore()}function V(AM,AK,AL,AO){var AN=AM.fill;if(!AN){return null}if(AM.fillColor){return R(AM.fillColor,AL,AO,AK)}var AP=C.color.parse(AK);AP.a=typeof AN=="number"?AN:0.4;AP.normalize();return AP.toString()}function AI(){l.find(".legend").remove();if(!g.legend.show){return }var AP=[],AN=false,AV=g.legend.labelFormatter,AU,AR;for(i=0;i<O.length;++i){AU=O[i];AR=AU.label;if(!AR){continue}if(i%g.legend.noColumns==0){if(AN){AP.push("</tr>")}AP.push("<tr>");AN=true}if(AV){AR=AV(AR,AU)}AP.push('<td class="legendColorBox"><div style="border:1px solid '+g.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+AU.color+';overflow:hidden"></div></div></td><td class="legendLabel">'+AR+"</td>")}if(AN){AP.push("</tr>")}if(AP.length==0){return }var AT='<table style="font-size:smaller;color:'+g.grid.color+'">'+AP.join("")+"</table>";if(g.legend.container!=null){C(g.legend.container).html(AT)}else{var AQ="",AL=g.legend.position,AM=g.legend.margin;if(AM[0]==null){AM=[AM,AM]}if(AL.charAt(0)=="n"){AQ+="top:"+(AM[1]+e.top)+"px;"}else{if(AL.charAt(0)=="s"){AQ+="bottom:"+(AM[1]+e.bottom)+"px;"}}if(AL.charAt(1)=="e"){AQ+="right:"+(AM[0]+e.right)+"px;"}else{if(AL.charAt(1)=="w"){AQ+="left:"+(AM[0]+e.left)+"px;"}}var AS=C('<div class="legend">'+AT.replace('style="','style="position:absolute;'+AQ+";")+"</div>").appendTo(l);if(g.legend.backgroundOpacity!=0){var AO=g.legend.backgroundColor;if(AO==null){AO=g.grid.backgroundColor;if(AO&&typeof AO=="string"){AO=C.color.parse(AO)}else{AO=C.color.extract(AS,"background-color")}AO.a=1;AO=AO.toString()}var AK=AS.children();C('<div style="position:absolute;width:'+AK.width()+"px;height:"+AK.height()+"px;"+AQ+"background-color:"+AO+';"> </div>').prependTo(AS).css("opacity",g.legend.backgroundOpacity)}}}var w=[],J=null;function AF(AR,AP,AM){var AX=g.grid.mouseActiveRadius,Aj=AX*AX+1,Ah=null,Aa=false,Af,Ad;for(Af=0;Af<O.length;++Af){if(!AM(O[Af])){continue}var AY=O[Af],AQ=AY.xaxis,AO=AY.yaxis,Ae=AY.datapoints.points,Ac=AY.datapoints.pointsize,AZ=AQ.c2p(AR),AW=AO.c2p(AP),AL=AX/AQ.scale,AK=AX/AO.scale;if(AY.lines.show||AY.points.show){for(Ad=0;Ad<Ae.length;Ad+=Ac){var AT=Ae[Ad],AS=Ae[Ad+1];if(AT==null){continue}if(AT-AZ>AL||AT-AZ<-AL||AS-AW>AK||AS-AW<-AK){continue}var AV=Math.abs(AQ.p2c(AT)-AR),AU=Math.abs(AO.p2c(AS)-AP),Ab=AV*AV+AU*AU;if(Ab<=Aj){Aj=Ab;Ah=[Af,Ad/Ac]}}}if(AY.bars.show&&!Ah){var AN=AY.bars.align=="left"?0:-AY.bars.barWidth/2,Ag=AN+AY.bars.barWidth;for(Ad=0;Ad<Ae.length;Ad+=Ac){var AT=Ae[Ad],AS=Ae[Ad+1],Ai=Ae[Ad+2];if(AT==null){continue}if(O[Af].bars.horizontal?(AZ<=Math.max(Ai,AT)&&AZ>=Math.min(Ai,AT)&&AW>=AS+AN&&AW<=AS+Ag):(AZ>=AT+AN&&AZ<=AT+Ag&&AW>=Math.min(Ai,AS)&&AW<=Math.max(Ai,AS))){Ah=[Af,Ad/Ac]}}}}if(Ah){Af=Ah[0];Ad=Ah[1];Ac=O[Af].datapoints.pointsize;return{datapoint:O[Af].datapoints.points.slice(Ad*Ac,(Ad+1)*Ac),dataIndex:Ad,series:O[Af],seriesIndex:Af}}return null}function D(AK){if(g.grid.hoverable){H("plothover",AK,function(AL){return AL.hoverable!=false})}}function d(AK){H("plotclick",AK,function(AL){return AL.clickable!=false})}function H(AL,AK,AM){var AN=AD.offset(),AS={pageX:AK.pageX,pageY:AK.pageY},AQ=AK.pageX-AN.left-e.left,AO=AK.pageY-AN.top-e.top;if(s.xaxis.used){AS.x=s.xaxis.c2p(AQ)}if(s.yaxis.used){AS.y=s.yaxis.c2p(AO)}if(s.x2axis.used){AS.x2=s.x2axis.c2p(AQ)}if(s.y2axis.used){AS.y2=s.y2axis.c2p(AO)}var AT=AF(AQ,AO,AM);if(AT){AT.pageX=parseInt(AT.series.xaxis.p2c(AT.datapoint[0])+AN.left+e.left);AT.pageY=parseInt(AT.series.yaxis.p2c(AT.datapoint[1])+AN.top+e.top)}if(g.grid.autoHighlight){for(var AP=0;AP<w.length;++AP){var AR=w[AP];if(AR.auto==AL&&!(AT&&AR.series==AT.series&&AR.point==AT.datapoint)){x(AR.series,AR.point)}}if(AT){AE(AT.series,AT.datapoint,AL)}}l.trigger(AL,[AS,AT])}function q(){if(!J){J=setTimeout(v,30)}}function v(){J=null;AJ.save();AJ.clearRect(0,0,y,Q);AJ.translate(e.left,e.top);var AL,AK;for(AL=0;AL<w.length;++AL){AK=w[AL];if(AK.series.bars.show){z(AK.series,AK.point)}else{u(AK.series,AK.point)}}AJ.restore();Z(L.drawOverlay,[AJ])}function AE(AM,AK,AN){if(typeof AM=="number"){AM=O[AM]}if(typeof AK=="number"){AK=AM.data[AK]}var AL=j(AM,AK);if(AL==-1){w.push({series:AM,point:AK,auto:AN});q()}else{if(!AN){w[AL].auto=false}}}function x(AM,AK){if(AM==null&&AK==null){w=[];q()}if(typeof AM=="number"){AM=O[AM]}if(typeof AK=="number"){AK=AM.data[AK]}var AL=j(AM,AK);if(AL!=-1){w.splice(AL,1);q()}}function j(AM,AN){for(var AK=0;AK<w.length;++AK){var AL=w[AK];if(AL.series==AM&&AL.point[0]==AN[0]&&AL.point[1]==AN[1]){return AK}}return -1}function u(AN,AM){var AL=AM[0],AR=AM[1],AQ=AN.xaxis,AP=AN.yaxis;if(AL<AQ.min||AL>AQ.max||AR<AP.min||AR>AP.max){return }var AO=AN.points.radius+AN.points.lineWidth/2;AJ.lineWidth=AO;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AK=1.5*AO;AJ.beginPath();AJ.arc(AQ.p2c(AL),AP.p2c(AR),AK,0,2*Math.PI,false);AJ.stroke()}function z(AN,AK){AJ.lineWidth=AN.bars.lineWidth;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AM=C.color.parse(AN.color).scale("a",0.5).toString();var AL=AN.bars.align=="left"?0:-AN.bars.barWidth/2;AB(AK[0],AK[1],AK[2]||0,AL,AL+AN.bars.barWidth,0,function(){return AM},AN.xaxis,AN.yaxis,AJ,AN.bars.horizontal)}function R(AM,AL,AQ,AO){if(typeof AM=="string"){return AM}else{var AP=Y.createLinearGradient(0,AQ,0,AL);for(var AN=0,AK=AM.colors.length;AN<AK;++AN){var AR=AM.colors[AN];if(typeof AR!="string"){AR=C.color.parse(AO).scale("rgb",AR.brightness);AR.a*=AR.opacity;AR=AR.toString()}AP.addColorStop(AN/(AK-1),AR)}return AP}}}C.plot=function(G,E,D){var F=new B(C(G),E,D,C.plot.plugins);return F};C.plot.plugins=[];C.plot.formatDate=function(H,E,G){var L=function(N){N=""+N;return N.length==1?"0"+N:N};var D=[];var M=false;var K=H.getUTCHours();var I=K<12;if(G==null){G=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(E.search(/%p|%P/)!=-1){if(K>12){K=K-12}else{if(K==0){K=12}}}for(var F=0;F<E.length;++F){var J=E.charAt(F);if(M){switch(J){case"h":J=""+K;break;case"H":J=L(K);break;case"M":J=L(H.getUTCMinutes());break;case"S":J=L(H.getUTCSeconds());break;case"d":J=""+H.getUTCDate();break;case"m":J=""+(H.getUTCMonth()+1);break;case"y":J=""+H.getUTCFullYear();break;case"b":J=""+G[H.getUTCMonth()];break;case"p":J=(I)?("am"):("pm");break;case"P":J=(I)?("AM"):("PM");break}D.push(J);M=false}else{if(J=="%"){M=true}else{D.push(J)}}}return D.join("")};function A(E,D){return D*Math.floor(E/D)}})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.hoverIntent.minified.js b/js/jquery/jquery.hoverIntent.minified.js new file mode 100644 index 000000000..f86ad8792 --- /dev/null +++ b/js/jquery/jquery.hoverIntent.minified.js @@ -0,0 +1,9 @@ +/** +* hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+ +* <http://cherne.net/brian/resources/jquery.hoverIntent.html> +* +* @param f onMouseOver function || An object with configuration options +* @param g onMouseOut function || Nothing (use configuration options object) +* @author Brian Cherne <brian@cherne.net> +*/ +(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY;};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev]);}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev]);};var handleHover=function(e){var p=(e.type=="mouseover"?e.fromElement:e.toElement)||e.relatedTarget;while(p&&p!=this){try{p=p.parentNode;}catch(e){p=this;}}if(p==this){return false;}var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);}if(e.type=="mouseover"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob);},cfg.timeout);}}};return this.mouseover(handleHover).mouseout(handleHover);};})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.idTabs.modified.js b/js/jquery/jquery.idTabs.modified.js new file mode 100644 index 000000000..161ab0019 --- /dev/null +++ b/js/jquery/jquery.idTabs.modified.js @@ -0,0 +1,34 @@ +/* idTabs ~ Sean Catchpole - Version 1.0 */ + +/* Options (in any order): + + start (number|string) + Index number of default tab. ex: idTabs(0) + String of id of default tab. ex: idTabs("#tab1") + default: class "selected" or index 0 + + return (boolean) + True - Url will change. ex: idTabs(true) + False - Url will not change. ex: idTabs(false) + default: false + + click (function) + Function will be called when a tab is clicked. ex: idTabs(foo) + If the function returns true, idTabs will show/hide content (as usual). + If the function returns false, idTabs will not take any action. + The function is passed three variables: + The id of the element to be shown + an array of all id's that can be shown + and the element containing the tabs + + MODIFIED BY PRESTASHOP + +*/ + +(function($){$.fn.idTabs=function(){var s={"start":null,"return":false,"click":null};for(var i=0;i<arguments.length;++i){var n={},a=arguments[i];switch(typeof a){case"object":$.extend(n,a);break;case"number":case"string":n.start=a;break;case"boolean":n["return"]=a;break;case"function":n.click=a;break;};$.extend(s,n);} +var self=this;var list=$("a[href^='#']",this).click(function(){if($("a.selected",self)[0]==this) +return s["return"];var id="#"+this.href.split('#')[1];var aList=[];var idList=[];$("a",self).each(function(){if(this.href.match(/#/)){aList[aList.length]=this;idList[idList.length]="#"+this.href.split('#')[1];}});if(s.click&&!s.click(id,idList,self))return s["return"];for(i in aList)$(aList[i]).removeClass("selected");for(i in idList){$(idList[i]).addClass('block_hidden_only_for_screen');} +$(this).addClass("selected");$(id).removeClass('block_hidden_only_for_screen');return s["return"];});var test;if(typeof s.start=="number"&&(test=list.filter(":eq("+s.start+")")).length) +test.click();else if(typeof s.start=="string"&&(test=list.filter("[href='#"+s.start+"']")).length) +test.click();else if((test=list.filter(".selected")).length) +test.removeClass("selected").click();else list.filter(":first").click();return this;};$(function(){$(".idTabs").each(function(){$(this).idTabs();});});})(jQuery) diff --git a/js/jquery/jquery.jgrowl-1.2.1.min.js b/js/jquery/jquery.jgrowl-1.2.1.min.js new file mode 100644 index 000000000..981438e47 --- /dev/null +++ b/js/jquery/jquery.jgrowl-1.2.1.min.js @@ -0,0 +1,4 @@ + +(function($){$.jGrowl=function(m,o){if($('#jGrowl').size()==0)$('<div id="jGrowl"></div>').addClass($.jGrowl.defaults.position).appendTo('body');$('#jGrowl').jGrowl(m,o);};$.fn.jGrowl=function(m,o){if($.isFunction(this.each)){var args=arguments;return this.each(function(){var self=this;if($(this).data('jGrowl.instance')==undefined){$(this).data('jGrowl.instance',$.extend(new $.fn.jGrowl(),{notifications:[],element:null,interval:null}));$(this).data('jGrowl.instance').startup(this);} +if($.isFunction($(this).data('jGrowl.instance')[m])){$(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'),$.makeArray(args).slice(1));}else{$(this).data('jGrowl.instance').create(m,o);}});};};$.extend($.fn.jGrowl.prototype,{defaults:{pool:0,header:'',group:'',sticky:false,position:'top-right',glue:'after',theme:'default',corners:'10px',check:250,life:3000,speed:'normal',easing:'swing',closer:true,closeTemplate:'&times;',closerTemplate:'<div>[ close all ]</div>',log:function(e,m,o){},beforeOpen:function(e,m,o){},open:function(e,m,o){},beforeClose:function(e,m,o){},close:function(e,m,o){},animateOpen:{opacity:'show'},animateClose:{opacity:'hide'}},notifications:[],element:null,interval:null,create:function(message,o){var o=$.extend({},this.defaults,o);this.notifications[this.notifications.length]={message:message,options:o};o.log.apply(this.element,[this.element,message,o]);},render:function(notification){var self=this;var message=notification.message;var o=notification.options;var notification=$('<div class="jGrowl-notification'+((o.group!=undefined&&o.group!='')?' '+o.group:'')+'"><div class="close">'+o.closeTemplate+'</div><div class="header">'+o.header+'</div><div class="message">'+message+'</div></div>').data("jGrowl",o).addClass(o.theme).children('div.close').bind("click.jGrowl",function(){$(this).parent().trigger('jGrowl.close');}).parent();(o.glue=='after')?$('div.jGrowl-notification:last',this.element).after(notification):$('div.jGrowl-notification:first',this.element).before(notification);$(notification).bind("mouseover.jGrowl",function(){$(this).data("jGrowl").pause=true;}).bind("mouseout.jGrowl",function(){$(this).data("jGrowl").pause=false;}).bind('jGrowl.beforeOpen',function(){o.beforeOpen.apply(self.element,[self.element,message,o]);}).bind('jGrowl.open',function(){o.open.apply(self.element,[self.element,message,o]);}).bind('jGrowl.beforeClose',function(){o.beforeClose.apply(self.element,[self.element,message,o]);}).bind('jGrowl.close',function(){$(this).data('jGrowl').pause=true;$(this).trigger('jGrowl.beforeClose').animate(o.animateClose,o.speed,o.easing,function(){$(this).remove();o.close.apply(self.element,[self.element,message,o]);});}).trigger('jGrowl.beforeOpen').animate(o.animateOpen,o.speed,o.easing,function(){$(this).data("jGrowl").created=new Date();}).trigger('jGrowl.open');if($.fn.corner!=undefined)$(notification).corner(o.corners);if($('div.jGrowl-notification:parent',this.element).size()>1&&$('div.jGrowl-closer',this.element).size()==0&&this.defaults.closer!=false){$(this.defaults.closerTemplate).addClass('jGrowl-closer').addClass(this.defaults.theme).appendTo(this.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){$(this).siblings().children('div.close').trigger("click.jGrowl");if($.isFunction(self.defaults.closer))self.defaults.closer.apply($(this).parent()[0],[$(this).parent()[0]]);});};},update:function(){$(this.element).find('div.jGrowl-notification:parent').each(function(){if($(this).data("jGrowl")!=undefined&&$(this).data("jGrowl").created!=undefined&&($(this).data("jGrowl").created.getTime()+$(this).data("jGrowl").life)<(new Date()).getTime()&&$(this).data("jGrowl").sticky!=true&&($(this).data("jGrowl").pause==undefined||$(this).data("jGrowl").pause!=true)){$(this).trigger('jGrowl.close');}});if(this.notifications.length>0&&(this.defaults.pool==0||$(this.element).find('div.jGrowl-notification:parent').size()<this.defaults.pool)){this.render(this.notifications.shift());} +if($(this.element).find('div.jGrowl-notification:parent').size()<2){$(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){$(this).remove();});};},startup:function(e){this.element=$(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');this.interval=setInterval(function(){$(e).data('jGrowl.instance').update();},this.defaults.check);if($.browser.msie&&parseInt($.browser.version)<7&&!window["XMLHttpRequest"])$(this.element).addClass('ie6');},shutdown:function(){$(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove();clearInterval(this.interval);}});$.jGrowl.defaults=$.fn.jGrowl.prototype.defaults;})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.jqzoom.js b/js/jquery/jquery.jqzoom.js new file mode 100644 index 000000000..5a73f0578 --- /dev/null +++ b/js/jquery/jquery.jqzoom.js @@ -0,0 +1,80 @@ +//************************************************************** +// jQZoom allows you to realize a small magnifier window,close +// to the image or images on your web page easily. +// +// jqZoom version 1.2 +// Author Doc. Ing. Renzi Marco(www.mind-projects.it) +// Released on Dec 05 2007 +// i'm searching for a job,pick me up!!! +// mail: renzi.mrc@gmail.com +//************************************************************** + +(function($) { + $.fn.jqueryzoom = function(options) { + var settings = { + xzoom: 200, //zoomed width default width + yzoom: 200, //zoomed div default width + offset: 10, //zoomed div default offset + position: "right" //zoomed div default position,offset position is to the right of the image + }; + + if(options) + $.extend(settings, options); + + var noalt =''; + + $(this).hover(function() { + var imageLeft = $(this).get(0).offsetLeft; + var imageTop = $(this).get(0).offsetTop; + var imageWidth = $(this).get(0).offsetWidth; + var imageHeight = $(this).get(0).offsetHeight; + + noalt = $(this).attr("alt"); + var bigimage = noalt; + $(this).attr("alt", ''); + + if($("div.zoomdiv").get().length == 0) + $(this).after("<div class='zoomdiv'><img class='bigimg' src='"+bigimage+"'/></div>"); + + if(settings.position == "right") + leftpos = imageLeft + imageWidth + settings.offset; + else + leftpos = imageLeft - settings.xzoom - settings.offset; + + $("div.zoomdiv").css({top: imageTop,left: leftpos}); + $("div.zoomdiv").width(settings.xzoom); + $("div.zoomdiv").height(settings.yzoom); + $("div.zoomdiv").show(); + + $(document.body).mousemove(function(e) { + var bigwidth = $(".bigimg").get(0).offsetWidth; + var bigheight = $(".bigimg").get(0).offsetHeight; + var scaley ='x'; + var scalex= 'y'; + + if(isNaN(scalex)|isNaN(scaley)) { + var scalex = Math.round(bigwidth/imageWidth) ; + var scaley = Math.round(bigheight/imageHeight); + } + + mouse = new MouseEvent(e); + + scrolly = mouse.y - imageTop - ($("div.zoomdiv").height()*1/scaley)/2 ; + $("div.zoomdiv").get(0).scrollTop = scrolly * scaley ; + scrollx = mouse.x - imageLeft - ($("div.zoomdiv").width()*1/scalex)/2 ; + $("div.zoomdiv").get(0).scrollLeft = (scrollx) * scalex ; + }); + }, function() { + $(this).attr("alt", noalt); + $("div.zoomdiv").hide(); + $(document.body).unbind("mousemove"); + $(".lenszoom").remove(); + $("div.zoomdiv").remove(); + }); + } +})(jQuery); + +function MouseEvent(e) { + this.x = e.pageX + this.y = e.pageY +} \ No newline at end of file diff --git a/js/jquery/jquery.pngFix.pack.js b/js/jquery/jquery.pngFix.pack.js new file mode 100644 index 000000000..f39c17dff --- /dev/null +++ b/js/jquery/jquery.pngFix.pack.js @@ -0,0 +1,11 @@ +/** + * -------------------------------------------------------------------- + * jQuery-Plugin "pngFix" + * Version: 1.1, 11.09.2007 + * by Andreas Eberhard, andreas.eberhard@gmail.com + * http://jquery.andreaseberhard.de/ + * + * Copyright (c) 2007 Andreas Eberhard + * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php) + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(s($){3.1s.1k=s(j){j=3.1a({12:\'1m.1j\'},j);8 k=(n.P=="r 10 Z"&&U(n.v)==4&&n.v.E("14 5.5")!=-1);8 l=(n.P=="r 10 Z"&&U(n.v)==4&&n.v.E("14 6.0")!=-1);o(3.17.16&&(k||l)){3(2).L("1r[@m$=.M]").z(s(){3(2).7(\'q\',3(2).q());3(2).7(\'p\',3(2).p());8 a=\'\';8 b=\'\';8 c=(3(2).7(\'K\'))?\'K="\'+3(2).7(\'K\')+\'" \':\'\';8 d=(3(2).7(\'A\'))?\'A="\'+3(2).7(\'A\')+\'" \':\'\';8 e=(3(2).7(\'C\'))?\'C="\'+3(2).7(\'C\')+\'" \':\'\';8 f=(3(2).7(\'B\'))?\'B="\'+3(2).7(\'B\')+\'" \':\'\';8 g=(3(2).7(\'R\'))?\'1d:\'+3(2).7(\'R\')+\';\':\'\';8 h=(3(2).1c().7(\'1b\'))?\'19:18;\':\'\';o(2.9.y){a+=\'y:\'+2.9.y+\';\';2.9.y=\'\'}o(2.9.t){a+=\'t:\'+2.9.t+\';\';2.9.t=\'\'}o(2.9.w){a+=\'w:\'+2.9.w+\';\';2.9.w=\'\'}8 i=(2.9.15);b+=\'<x \'+c+d+e+f;b+=\'9="13:11;1q-1p:1o-1n;O:W-V;N:1l;\'+g+h;b+=\'q:\'+3(2).q()+\'u;\'+\'p:\'+3(2).p()+\'u;\';b+=\'J:I:H.r.G\'+\'(m=\\\'\'+3(2).7(\'m\')+\'\\\', D=\\\'F\\\');\';b+=i+\'"></x>\';o(a!=\'\'){b=\'<x 9="13:11;O:W-V;\'+a+h+\'q:\'+3(2).q()+\'u;\'+\'p:\'+3(2).p()+\'u;\'+\'">\'+b+\'</x>\'}3(2).1i();3(2).1h(b)});3(2).L("*").z(s(){8 a=3(2).T(\'N-S\');o(a.E(".M")!=-1){8 b=a.X(\'1g("\')[1].X(\'")\')[0];3(2).T(\'N-S\',\'1f\');3(2).Q(0).Y.J="I:H.r.G(m=\'"+b+"\',D=\'F\')"}});3(2).L("1e[@m$=.M]").z(s(){8 a=3(2).7(\'m\');3(2).Q(0).Y.J=\'I:H.r.G\'+\'(m=\\\'\'+a+\'\\\', D=\\\'F\\\');\';3(2).7(\'m\',j.12)})}1t 3}})(3);',62,92,'||this|jQuery||||attr|var|style|||||||||||||src|navigator|if|height|width|Microsoft|function|padding|px|appVersion|margin|span|border|each|class|alt|title|sizingMethod|indexOf|scale|AlphaImageLoader|DXImageTransform|progid|filter|id|find|png|background|display|appName|get|align|image|css|parseInt|block|inline|split|runtimeStyle|Explorer|Internet|relative|blankgif|position|MSIE|cssText|msie|browser|hand|cursor|extend|href|parent|float|input|none|url|after|hide|gif|pngFix|transparent|blank|line|pre|space|white|img|fn|return'.split('|'),0,{})) \ No newline at end of file diff --git a/js/jquery/jquery.scrollTo-1.4.2-min.js b/js/jquery/jquery.scrollTo-1.4.2-min.js new file mode 100644 index 000000000..5e7877810 --- /dev/null +++ b/js/jquery/jquery.scrollTo-1.4.2-min.js @@ -0,0 +1,11 @@ +/** + * jQuery.ScrollTo - Easy element scrolling using jQuery. + * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * Date: 5/25/2009 + * @author Ariel Flesler + * @version 1.4.2 + * + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + */ +;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.serialScroll-1.2.2-min.js b/js/jquery/jquery.serialScroll-1.2.2-min.js new file mode 100644 index 000000000..d716124f9 --- /dev/null +++ b/js/jquery/jquery.serialScroll-1.2.2-min.js @@ -0,0 +1,10 @@ +/* + * jQuery.SerialScroll - Animated scrolling of series + * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * Date: 06/14/2009 + * @author Ariel Flesler + * @version 1.2.2 + * http://flesler.blogspot.com/2008/02/jqueryserialscroll.html + */ +;(function(a){var b=a.serialScroll=function(c){return a(window).serialScroll(c)};b.defaults={duration:1e3,axis:"x",event:"click",start:0,step:1,lock:!0,cycle:!0,constant:!0};a.fn.serialScroll=function(c){return this.each(function(){var t=a.extend({},b.defaults,c),s=t.event,i=t.step,r=t.lazy,e=t.target?this:document,u=a(t.target||this,e),p=u[0],m=t.items,h=t.start,g=t.interval,k=t.navigation,l;if(!r){m=d()}if(t.force){f({},h)}a(t.prev||[],e).bind(s,-i,q);a(t.next||[],e).bind(s,i,q);if(!p.ssbound){u.bind("prev.serialScroll",-i,q).bind("next.serialScroll",i,q).bind("goto.serialScroll",f)}if(g){u.bind("start.serialScroll",function(v){if(!g){o();g=!0;n()}}).bind("stop.serialScroll",function(){o();g=!1})}u.bind("notify.serialScroll",function(x,w){var v=j(w);if(v>-1){h=v}});p.ssbound=!0;if(t.jump){(r?u:d()).bind(s,function(v){f(v,j(v.target))})}if(k){k=a(k,e).bind(s,function(v){v.data=Math.round(d().length/k.length)*k.index(this);f(v,this)})}function q(v){v.data+=h;f(v,this)}function f(B,z){if(!isNaN(z)){B.data=z;z=p}var C=B.data,v,D=B.type,A=t.exclude?d().slice(0,-t.exclude):d(),y=A.length,w=A[C],x=t.duration;if(D){B.preventDefault()}if(g){o();l=setTimeout(n,t.interval)}if(!w){v=C<0?0:y-1;if(h!=v){C=v}else{if(!t.cycle){return}else{C=y-v-1}}w=A[C]}if(!w||t.lock&&u.is(":animated")||D&&t.onBefore&&t.onBefore(B,w,u,d(),C)===!1){return}if(t.stop){u.queue("fx",[]).stop()}if(t.constant){x=Math.abs(x/i*(h-C))}u.scrollTo(w,x,t).trigger("notify.serialScroll",[C])}function n(){u.trigger("next.serialScroll")}function o(){clearTimeout(l)}function d(){return a(m,p)}function j(w){if(!isNaN(w)){return w}var x=d(),v;while((v=x.index(w))==-1&&w!=p){w=w.parentNode}return v}})}})(jQuery); \ No newline at end of file diff --git a/js/jquery/jquery.tablednd_0_5.js b/js/jquery/jquery.tablednd_0_5.js new file mode 100644 index 000000000..54e584787 --- /dev/null +++ b/js/jquery/jquery.tablednd_0_5.js @@ -0,0 +1,308 @@ +/** + * TableDnD plug-in for JQuery, allows you to drag and drop table rows + * Copyright (c) Denis Howlett <denish@isocra.com> + * Licensed like jQuery, see http://docs.jquery.com/License. +*/ +jQuery.tableDnD = { + /** Keep hold of the current table being dragged */ + currentTable : null, + /** Keep hold of the current drag object if any */ + dragObject: null, + /** The current mouse offset */ + mouseOffset: null, + /** Remember the old value of Y so that we don't do too much processing */ + oldY: 0, + + /** Actually build the structure */ + build: function(options) { + // Set up the defaults if any + + this.each(function() { + // This is bound to each matching table, set up the defaults and override with user options + this.tableDnDConfig = jQuery.extend({ + onDragStyle: null, + onDropStyle: null, + // Add in the default class for whileDragging + onDragClass: "tDnD_whileDrag", + onDrop: null, + onDragStart: null, + scrollAmount: 5, + serializeRegexp: /[^\-]*$/, // The regular expression to use to trim row IDs + serializeParamName: null, // If you want to specify another parameter name instead of the table ID + dragHandle: null // If you give the name of a class here, then only Cells with this class will be draggable + }, options || {}); + // Now make the rows draggable + jQuery.tableDnD.makeDraggable(this); + }); + + // Now we need to capture the mouse up and mouse move event + // We can use bind so that we don't interfere with other event handlers + jQuery(document) + .bind('mousemove', jQuery.tableDnD.mousemove) + .bind('mouseup', jQuery.tableDnD.mouseup); + + // Don't break the chain + return this; + }, + + /** This function makes all the rows on the table draggable apart from those marked as "NoDrag" */ + makeDraggable: function(table) { + var config = table.tableDnDConfig; + if (table.tableDnDConfig.dragHandle) { + // We only need to add the event to the specified cells + var cells = jQuery("td."+table.tableDnDConfig.dragHandle, table); + cells.each(function() { + // The cell is bound to "this" + jQuery(this).mousedown(function(ev) { + jQuery.tableDnD.dragObject = this.parentNode; + jQuery.tableDnD.currentTable = table; + jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev); + if (config.onDragStart) { + // Call the onDrop method if there is one + config.onDragStart(table, this); + } + return false; + }); + }) + } else { + // For backwards compatibility, we add the event to the whole row + var rows = jQuery("tbody tr", table); // get all the rows as a wrapped set + rows.each(function() { + // Iterate through each row, the row is bound to "this" + var row = jQuery(this); + if (! row.hasClass("nodrag")) { + row.mousedown(function(ev) { + if (ev.target.tagName == "TD") { + jQuery.tableDnD.dragObject = this; + jQuery.tableDnD.currentTable = table; + jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev); + if (config.onDragStart) { + // Call the onDrop method if there is one + config.onDragStart(table, this); + } + return false; + } + }).css("cursor", "move"); // Store the tableDnD object + } + }); + } + }, + + updateTables: function() { + this.each(function() { + // this is now bound to each matching table + if (this.tableDnDConfig) { + jQuery.tableDnD.makeDraggable(this); + } + }) + }, + + /** Get the mouse coordinates from the event (allowing for browser differences) */ + mouseCoords: function(ev){ + if(ev.pageX || ev.pageY){ + return {x:ev.pageX, y:ev.pageY}; + } + return { + x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, + y:ev.clientY + document.body.scrollTop - document.body.clientTop + }; + }, + + /** Given a target element and a mouse event, get the mouse offset from that element. + To do this we need the element's position and the mouse position */ + getMouseOffset: function(target, ev) { + ev = ev || window.event; + + var docPos = this.getPosition(target); + var mousePos = this.mouseCoords(ev); + return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y}; + }, + + /** Get the position of an element by going up the DOM tree and adding up all the offsets */ + getPosition: function(e){ + var left = 0; + var top = 0; + /** Safari fix -- thanks to Luis Chato for this! */ + if (e.offsetHeight == 0) { + /** Safari 2 doesn't correctly grab the offsetTop of a table row + this is detailed here: + http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/ + the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild. + note that firefox will return a text node as a first child, so designing a more thorough + solution may need to take that into account, for now this seems to work in firefox, safari, ie */ + e = e.firstChild; // a table cell + } + + while (e.offsetParent){ + left += e.offsetLeft; + top += e.offsetTop; + e = e.offsetParent; + } + + left += e.offsetLeft; + top += e.offsetTop; + + return {x:left, y:top}; + }, + + mousemove: function(ev) { + if (jQuery.tableDnD.dragObject == null) { + return; + } + + var dragObj = jQuery(jQuery.tableDnD.dragObject); + var config = jQuery.tableDnD.currentTable.tableDnDConfig; + var mousePos = jQuery.tableDnD.mouseCoords(ev); + var y = mousePos.y - jQuery.tableDnD.mouseOffset.y; + //auto scroll the window + var yOffset = window.pageYOffset; + if (document.all) { + // Windows version + //yOffset=document.body.scrollTop; + if (typeof document.compatMode != 'undefined' && + document.compatMode != 'BackCompat') { + yOffset = document.documentElement.scrollTop; + } + else if (typeof document.body != 'undefined') { + yOffset=document.body.scrollTop; + } + + } + + if (mousePos.y-yOffset < config.scrollAmount) { + window.scrollBy(0, -config.scrollAmount); + } else { + var windowHeight = window.innerHeight ? window.innerHeight + : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight; + if (windowHeight-(mousePos.y-yOffset) < config.scrollAmount) { + window.scrollBy(0, config.scrollAmount); + } + } + + + if (y != jQuery.tableDnD.oldY) { + // work out if we're going up or down... + var movingDown = y > jQuery.tableDnD.oldY; + // update the old value + jQuery.tableDnD.oldY = y; + // update the style to show we're dragging + if (config.onDragClass) { + dragObj.addClass(config.onDragClass); + } else { + dragObj.css(config.onDragStyle); + } + // If we're over a row then move the dragged row to there so that the user sees the + // effect dynamically + var currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y); + if (currentRow) { + // TODO worry about what happens when there are multiple TBODIES + if (movingDown && jQuery.tableDnD.dragObject != currentRow) { + jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow.nextSibling); + } else if (! movingDown && jQuery.tableDnD.dragObject != currentRow) { + jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow); + } + } + } + + return false; + }, + + /** We're only worried about the y position really, because we can only move rows up and down */ + findDropTargetRow: function(draggedRow, y) { + var rows = jQuery.tableDnD.currentTable.rows; + for (var i=0; i<rows.length; i++) { + var row = rows[i]; + var rowY = this.getPosition(row).y; + var rowHeight = parseInt(row.offsetHeight)/2; + if (row.offsetHeight == 0) { + rowY = this.getPosition(row.firstChild).y; + rowHeight = parseInt(row.firstChild.offsetHeight)/2; + } + // Because we always have to insert before, we need to offset the height a bit + if ((y > rowY - rowHeight) && (y < (rowY + rowHeight))) { + // that's the row we're over + // If it's the same as the current row, ignore it + if (row == draggedRow) {return null;} + var config = jQuery.tableDnD.currentTable.tableDnDConfig; + if (config.onAllowDrop) { + if (config.onAllowDrop(draggedRow, row)) { + return row; + } else { + return null; + } + } else { + // If a row has nodrop class, then don't allow dropping (inspired by John Tarr and Famic) + var nodrop = jQuery(row).hasClass("nodrop"); + if (! nodrop) { + return row; + } else { + return null; + } + } + return row; + } + } + return null; + }, + + mouseup: function(e) { + if (jQuery.tableDnD.currentTable && jQuery.tableDnD.dragObject) { + var droppedRow = jQuery.tableDnD.dragObject; + var config = jQuery.tableDnD.currentTable.tableDnDConfig; + // If we have a dragObject, then we need to release it, + // The row will already have been moved to the right place so we just reset stuff + if (config.onDragClass) { + jQuery(droppedRow).removeClass(config.onDragClass); + } else { + jQuery(droppedRow).css(config.onDropStyle); + } + jQuery.tableDnD.dragObject = null; + if (config.onDrop) { + // Call the onDrop method if there is one + config.onDrop(jQuery.tableDnD.currentTable, droppedRow); + } + jQuery.tableDnD.currentTable = null; // let go of the table too + } + }, + + serialize: function() { + if (jQuery.tableDnD.currentTable) { + return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable); + } else { + return "Error: No Table id set, you need to set an id on your table and every row"; + } + }, + + serializeTable: function(table) { + var result = ""; + var tableId = table.id; + var rows = jQuery("tbody tr", table); + for (var i=0; i<rows.length; i++) { + if (result.length > 0) result += "&"; + var rowId = rows[i].id; + if (rowId && rowId && table.tableDnDConfig && table.tableDnDConfig.serializeRegexp) { + rowId = rowId.match(table.tableDnDConfig.serializeRegexp)[0]; + } + + result += tableId + '[]=' + rowId; + } + return result; + }, + + serializeTables: function() { + var result = ""; + this.each(function() { + // this is now bound to each matching table + result += jQuery.tableDnD.serializeTable(this); + }); + return result; + } + +} +jQuery.fn.extend( + { + tableDnD : jQuery.tableDnD.build, + tableDnDUpdate : jQuery.tableDnD.updateTables, + tableDnDSerialize: jQuery.tableDnD.serializeTables + } +); \ No newline at end of file diff --git a/js/jquery/thickbox-modified.js b/js/jquery/thickbox-modified.js new file mode 100644 index 000000000..6d9dfa1ae --- /dev/null +++ b/js/jquery/thickbox-modified.js @@ -0,0 +1,40 @@ +/* + * Thickbox 3.1 - One Box To Rule Them All. + * By Cody Lindley (http://www.codylindley.com) + * Copyright (c) 2007 cody lindley + * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php + * + * Patched Version by Jamie Thompson - Fixes IE7 Positioning Issues + * http://jamazon.co.uk/web/2008/03/17/thickbox-31-ie7-positioning-bug/ + * Patched Version by PrestaShop - Translated fields + * http://www.prestashop.com +*/ + + +$.browser.msie6=$.browser.msie&&/MSIE 6\.0/i.test(window.navigator.userAgent)&&!/MSIE 7\.0/i.test(window.navigator.userAgent);$(document).ready(function(){tb_init('a.thickbox, area.thickbox, input.thickbox');imgLoader=new Image();imgLoader.src=tb_pathToImage;});function tb_init(domChunk){$(domChunk).click(function(){var t=this.title||this.name||null;var a=this.href||this.alt;var g=this.rel||false;tb_show(t,a,g);this.blur();return false;}).removeClass('thickbox');} +function tb_show(caption,url,imageGroup){try{if(typeof document.body.style.maxHeight==="undefined"){$("body","html").css({height:"100%",width:"100%"});$("html").css("overflow","hidden");if(document.getElementById("TB_HideSelect")===null){$("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");$("#TB_overlay").click(tb_remove);}}else{if(document.getElementById("TB_overlay")===null){$("body").append("<div id='TB_overlay'></div><div id='TB_window'></div>");$("#TB_overlay").click(tb_remove);}} +if(tb_detectMacXFF()){$("#TB_overlay").addClass("TB_overlayMacFFBGHack");}else{$("#TB_overlay").addClass("TB_overlayBG");} +if(caption===null){caption="";} +$("body").append("<div id='TB_load'><img src='"+imgLoader.src+"' /></div>");$('#TB_load').show();var baseURL;if(url.indexOf("?")!==-1){baseURL=url.substr(0,url.indexOf("?"));}else{baseURL=url;} +var urlString=/\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;var urlType=baseURL.toLowerCase().match(urlString);if(urlType=='.jpg'||urlType=='.jpeg'||urlType=='.png'||urlType=='.gif'||urlType=='.bmp'){TB_PrevCaption="";TB_PrevURL="";TB_PrevHTML="";TB_NextCaption="";TB_NextURL="";TB_NextHTML="";TB_imageCount="";TB_FoundURL=false;if(imageGroup){TB_TempArray=$("a[@rel="+imageGroup+"]").get();for(TB_Counter=0;((TB_Counter<TB_TempArray.length)&&(TB_NextHTML===""));TB_Counter++){var urlTypeTemp=TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);if(!(TB_TempArray[TB_Counter].href==url)){if(TB_FoundURL){TB_NextCaption=TB_TempArray[TB_Counter].title;TB_NextURL=TB_TempArray[TB_Counter].href;TB_NextHTML="<span id='TB_next'>&nbsp;&nbsp;<a href='#'>"+ThickboxI18nNext+"</a></span>";}else{TB_PrevCaption=TB_TempArray[TB_Counter].title;TB_PrevURL=TB_TempArray[TB_Counter].href;TB_PrevHTML="<span id='TB_prev'>&nbsp;&nbsp;<a href='#'>"+ThickboxI18nPrev+"</a></span>";}}else{TB_FoundURL=true;TB_imageCount=ThickboxI18nImage+' '+(TB_Counter+1)+' '+ThickboxI18nOf+' '+(TB_TempArray.length);}}} +imgPreloader=new Image();imgPreloader.onload=function(){imgPreloader.onload=null;var pagesize=tb_getPageSize();var x=pagesize[0]-150;var y=pagesize[1]-150;var imageWidth=imgPreloader.width;var imageHeight=imgPreloader.height;if(imageWidth>x){imageHeight=imageHeight*(x/imageWidth);imageWidth=x;if(imageHeight>y){imageWidth=imageWidth*(y/imageHeight);imageHeight=y;}}else if(imageHeight>y){imageWidth=imageWidth*(y/imageHeight);imageHeight=y;if(imageWidth>x){imageHeight=imageHeight*(x/imageWidth);imageWidth=x;}} +TB_WIDTH=imageWidth+30;TB_HEIGHT=imageHeight+60;$("#TB_window").append("<img id='TB_Image' src='"+url+"' width='"+imageWidth+"' height='"+imageHeight+"' alt='"+caption+"'/>"+"<div id='TB_caption'>"+caption+"<div id='TB_secondLine'>"+TB_imageCount+TB_PrevHTML+TB_NextHTML+"</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='"+ThickboxI18nClose+"'>"+ThickboxI18nClose+"</a> "+ThickboxI18nOrEscKey+"</div>");$("#TB_closeWindowButton").click(tb_remove);if(!(TB_PrevHTML==="")){function goPrev(){if($(document).unbind("click",goPrev)){$(document).unbind("click",goPrev);} +$("#TB_window").remove();$("body").append("<div id='TB_window'></div>");tb_show(TB_PrevCaption,TB_PrevURL,imageGroup);return false;} +$("#TB_prev").click(goPrev);} +if(!(TB_NextHTML==="")){function goNext(){$("#TB_window").remove();$("body").append("<div id='TB_window'></div>");tb_show(TB_NextCaption,TB_NextURL,imageGroup);return false;} +$("#TB_next").click(goNext);} +document.onkeydown=function(e){if(e==null){keycode=event.keyCode;}else{keycode=e.which;} +if(keycode==27){tb_remove();}else if(keycode==190){if(!(TB_NextHTML=="")){document.onkeydown="";goNext();}}else if(keycode==188){if(!(TB_PrevHTML=="")){document.onkeydown="";goPrev();}}};tb_position();$("#TB_load").remove();$("#TB_Image").click(tb_remove);$("#TB_window").css({display:"block"});};imgPreloader.src=url;}else{var queryString=url.replace(/^[^\?]+\??/,'');var params=tb_parseQuery(queryString);TB_WIDTH=(params['width']*1)+30||630;TB_HEIGHT=(params['height']*1)+40||440;ajaxContentW=TB_WIDTH-30;ajaxContentH=TB_HEIGHT-45;if(url.indexOf('TB_iframe')!=-1){urlNoQuery=url.split('TB_');$("#TB_iframeContent").remove();if(params['modal']!="true"){$("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='"+ThickboxI18nClose+"'>"+ThickboxI18nClose+"</a> "+ThickboxI18nOrEscKey+"</div></div><iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW+29)+"px;height:"+(ajaxContentH+17)+"px;' > </iframe>");}else{$("#TB_overlay").unbind();$("#TB_window").append("<iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW+29)+"px;height:"+(ajaxContentH+17)+"px;'> </iframe>");}}else{if($("#TB_window").css("display")!="block"){if(params['modal']!="true"){$("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='"+ThickboxI18nClose+"'>"+ThickboxI18nClose+"</a> "+ThickboxI18nOrEscKey+"</div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px'></div>");}else{$("#TB_overlay").unbind();$("#TB_window").append("<div id='TB_ajaxContent' class='TB_modal' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px;'></div>");}}else{$("#TB_ajaxContent")[0].style.width=ajaxContentW+"px";$("#TB_ajaxContent")[0].style.height=ajaxContentH+"px";$("#TB_ajaxContent")[0].scrollTop=0;$("#TB_ajaxWindowTitle").html(caption);}} +$("#TB_closeWindowButton").click(tb_remove);if(url.indexOf('TB_inline')!=-1){$("#TB_ajaxContent").append($('#'+params['inlineId']).children());$("#TB_window").unload(function(){$('#'+params['inlineId']).append($("#TB_ajaxContent").children());});tb_position();$("#TB_load").remove();$("#TB_window").css({display:"block"});}else if(url.indexOf('TB_iframe')!=-1){tb_position();if($.browser.safari){$("#TB_load").remove();$("#TB_window").css({display:"block"});}}else{$("#TB_ajaxContent").load(url+="&random="+(new Date().getTime()),function(){tb_position();$("#TB_load").remove();tb_init("#TB_ajaxContent a.thickbox");$("#TB_window").css({display:"block"});});}} +if(!params['modal']){document.onkeyup=function(e){if(e==null){keycode=event.keyCode;}else{keycode=e.which;} +if(keycode==27){tb_remove();}};}}catch(e){}} +function tb_showIframe(){$("#TB_load").remove();$("#TB_window").css({display:"block"});} +function tb_remove(){$("#TB_imageOff").unbind("click");$("#TB_closeWindowButton").unbind("click");$("#TB_window").fadeOut("fast",function(){$('#TB_window,#TB_overlay,#TB_HideSelect').trigger("unload").unbind().remove();});$("#TB_load").remove();if(typeof document.body.style.maxHeight=="undefined"){$("body","html").css({height:"auto",width:"auto"});$("html").css("overflow","");} +document.onkeydown="";document.onkeyup="";return false;} +function tb_position(){$("#TB_window").css({marginLeft:'-'+parseInt((TB_WIDTH/2),10)+'px',width:TB_WIDTH+'px'});if(!(jQuery.browser.msie6)){$("#TB_window").css({marginTop:'-'+parseInt((TB_HEIGHT/2),10)+'px'});}} +function tb_parseQuery(query){var Params={};if(!query){return Params;} +var Pairs=query.split(/[;&]/);for(var i=0;i<Pairs.length;i++){var KeyVal=Pairs[i].split('=');if(!KeyVal||KeyVal.length!=2){continue;} +var key=unescape(KeyVal[0]);var val=unescape(KeyVal[1]);val=val.replace(/\+/g,' ');Params[key]=val;} +return Params;} +function tb_getPageSize(){var de=document.documentElement;var w=window.innerWidth||self.innerWidth||(de&&de.clientWidth)||document.body.clientWidth;var h=window.innerHeight||self.innerHeight||(de&&de.clientHeight)||document.body.clientHeight;arrayPageSize=[w,h];return arrayPageSize;} +function tb_detectMacXFF(){var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf('mac')!=-1&&userAgent.indexOf('firefox')!=-1){return true;}} diff --git a/js/pluginDetect.js b/js/pluginDetect.js new file mode 100644 index 000000000..168c97998 --- /dev/null +++ b/js/pluginDetect.js @@ -0,0 +1 @@ +/* PluginDetect v0.6.3 [ onWindowLoaded getVersion Java(OTF) QT DevalVR Shockwave Flash WMP Silverlight VLC ] by Eric Gerds www.pinlady.net/PluginDetect */ if(!PluginDetect){var PluginDetect={getNum:function(b,c){if(!this.num(b)){return null}var a;if(typeof c=="undefined"){a=/[\d][\d\.\_,-]*/.exec(b)}else{a=(new RegExp(c)).exec(b)}return a?a[0].replace(/[\.\_-]/g,","):null},hasMimeType:function(c){if(PluginDetect.isIE){return null}var b,a,d,e=c.constructor==String?[c]:c;for(d=0;d<e.length;d++){b=navigator.mimeTypes[e[d]];if(b&&b.enabledPlugin){a=b.enabledPlugin;if(a.name||a.description){return b}}}return null},findNavPlugin:function(g,d){var a=g.constructor==String?g:g.join(".*"),e=d===false?"":"\\d",b,c=new RegExp(a+".*"+e+"|"+e+".*"+a,"i"),f=navigator.plugins;for(b=0;b<f.length;b++){if(c.test(f[b].description)||c.test(f[b].name)){return f[b]}}return null},AXO:window.ActiveXObject,getAXO:function(b,a){var f=null,d,c=false;try{f=new this.AXO(b);c=true}catch(d){}if(typeof a!="undefined"){delete f;return c}return f},num:function(a){return(typeof a!="string"?false:(/\d/).test(a))},compareNums:function(g,e){var d=this,c,b,a,f=window.parseInt;if(!d.num(g)||!d.num(e)){return 0}if(d.plugin&&d.plugin.compareNums){return d.plugin.compareNums(g,e)}c=g.split(",");b=e.split(",");for(a=0;a<Math.min(c.length,b.length);a++){if(f(c[a],10)>f(b[a],10)){return 1}if(f(c[a],10)<f(b[a],10)){return -1}}return 0},formatNum:function(b){if(!this.num(b)){return null}var a,c=b.replace(/\s/g,"").replace(/[\.\_]/g,",").split(",").concat(["0","0","0","0"]);for(a=0;a<4;a++){if(/^(0+)(.+)$/.test(c[a])){c[a]=RegExp.$2}}if(!(/\d/).test(c[0])){c[0]="0"}return c[0]+","+c[1]+","+c[2]+","+c[3]},initScript:function(){var $=this,userAgent=navigator.userAgent;$.isIE=/*@cc_on!@*/false;$.IEver=$.isIE&&((/MSIE\s*(\d\.?\d*)/i).exec(userAgent))?parseFloat(RegExp.$1,10):-1;$.ActiveXEnabled=false;if($.isIE){var x,progid=["Msxml2.XMLHTTP","Msxml2.DOMDocument","Microsoft.XMLDOM","ShockwaveFlash.ShockwaveFlash","TDCCtl.TDCCtl","Shell.UIHelper","Scripting.Dictionary","wmplayer.ocx"];for(x=0;x<progid.length;x++){if($.getAXO(progid[x],1)){$.ActiveXEnabled=true;break}}$.head=typeof document.getElementsByTagName!="undefined"?document.getElementsByTagName("head")[0]:null}$.isGecko=!$.isIE&&typeof navigator.product=="string"&&(/Gecko/i).test(navigator.product)&&(/Gecko\s*\/\s*\d/i).test(userAgent)?true:false;$.GeckoRV=$.isGecko?$.formatNum((/rv\s*\:\s*([\.\,\d]+)/i).test(userAgent)?RegExp.$1:"0.9"):null;$.isSafari=!$.isIE&&(/Safari\s*\/\s*\d/i).test(userAgent)?true:false;$.isChrome=(/Chrome\s*\/\s*\d/i).test(userAgent)?true:false;$.onWindowLoaded(0)},init:function(c,a){if(typeof c!="string"){return -3}c=c.toLowerCase().replace(/\s/g,"");var b=this,d;if(typeof b[c]=="undefined"){return -3}d=b[c];b.plugin=d;if(typeof d.installed=="undefined"||a==true){d.installed=null;d.version=null;d.version0=null;d.getVersionDone=null;d.$=b}b.garbage=false;if(b.isIE&&!b.ActiveXEnabled){if(b.plugin!=b.java){return -2}}return 1},isMinVersion:function(g,e,c,b){return -3},getVersion:function(e,b,a){var d=PluginDetect,c=d.init(e),f;if(c<0){return null}f=d.plugin;if(f.getVersionDone!=1){f.getVersion(b,a);if(f.getVersionDone===null){f.getVersionDone=1}}d.cleanup();return(f.version||f.version0);return null},getInfo:function(f,c,b){var a={};return a},cleanup:function(){var a=this;if(a.garbage&&typeof window.CollectGarbage!="undefined"){window.CollectGarbage()}},isActiveXObject:function(b){var d=this,a,g,f="/",c='<object width="1" height="1" style="display:none" '+d.plugin.getCodeBaseVersion(b)+">"+d.plugin.HTML+"<"+f+"object>";if(d.head.firstChild){d.head.insertBefore(document.createElement("object"),d.head.firstChild)}else{d.head.appendChild(document.createElement("object"))}d.head.firstChild.outerHTML=c;try{d.head.firstChild.classid=d.plugin.classID}catch(g){}a=false;try{if(d.head.firstChild.object){a=true}}catch(g){}try{if(a&&d.head.firstChild.readyState<4){d.garbage=true}}catch(g){}d.head.removeChild(d.head.firstChild);return a},codebaseSearch:function(c){var e=this;if(!e.ActiveXEnabled){return null}if(typeof c!="undefined"){return e.isActiveXObject(c)};var j=[0,0,0,0],g,f,b=e.plugin.digits,i=function(k,m){var l=(k==0?m:j[0])+","+(k==1?m:j[1])+","+(k==2?m:j[2])+","+(k==3?m:j[3]);return e.isActiveXObject(l)};var h,d,a=false;for(g=0;g<b.length;g++){h=b[g]*2;j[g]=0;for(f=0;f<20;f++){if(h==1&&g>0&&a){break}if(h-j[g]>1){d=Math.round((h+j[g])/2);if(i(g,d)){j[g]=d;a=true}else{h=d}}else{if(h-j[g]==1){h--;if(!a&&i(g,h)){a=true}break}else{if(!a&&i(g,h)){a=true}break}}}if(!a){return null}}return j.join(",")},dummy1:0}}PluginDetect.onDetectionDone=function(g,e,d,a){return -1};PluginDetect.onWindowLoaded=function(c){var b=PluginDetect,a=window;if(b.EventWinLoad===true){}else{b.winLoaded=false;b.EventWinLoad=true;if(typeof a.addEventListener!="undefined"){a.addEventListener("load",b.runFuncs,false)}else{if(typeof a.attachEvent!="undefined"){a.attachEvent("onload",b.runFuncs)}else{if(typeof a.onload=="function"){b.funcs[b.funcs.length]=a.onload}a.onload=b.runFuncs}}}if(typeof c=="function"){b.funcs[b.funcs.length]=c}};PluginDetect.funcs=[0];PluginDetect.runFuncs=function(){var b=PluginDetect,a;b.winLoaded=true;for(a=0;a<b.funcs.length;a++){if(typeof b.funcs[a]=="function"){b.funcs[a](b);b.funcs[a]=null}}};PluginDetect.quicktime={mimeType:["video/quicktime","application/x-quicktimeplayer","image/x-macpaint","image/x-quicktime"],progID:"QuickTimeCheckObject.QuickTimeCheck.1",progID0:"QuickTime.QuickTime",classID:"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B",minIEver:7,HTML:'<param name="src" value="A14999.mov" /><param name="controller" value="false" />',getCodeBaseVersion:function(a){return'codebase="#version='+a+'"'},digits:[8,64,16,0],clipTo3digits:function(f){if(f===null||typeof f=="undefined"){return null}var e,d,h,g=this.$;e=f.split(",");if(g.compareNums(f,"7,60,0,0")<0&&g.compareNums(f,"7,50,0,0")>=0){d=e[0]+","+e[1].charAt(0)+","+e[1].charAt(1)+","+e[2]}else{d=e[0]+","+e[1]+","+e[2]+","+e[3]}h=d.split(",");return h[0]+","+h[1]+","+h[2]+",0"},getVersion:function(){var a=null,d,b=this.$,e=true;if(!b.isIE){if(navigator.platform&&(/linux/i).test(navigator.platform)){e=false}if(e){d=b.findNavPlugin(["QuickTime","(Plug-in|Plugin)"]);if(d&&d.name&&b.hasMimeType(this.mimeType)){a=b.getNum(d.name)}}this.installed=a?1:-1}else{var c;if(b.IEver>=this.minIEver&&b.getAXO(this.progID0,1)){a=b.codebaseSearch()}else{c=b.getAXO(this.progID);if(c&&c.QuickTimeVersion){a=c.QuickTimeVersion.toString(16);a=a.charAt(0)+"."+a.charAt(1)+"."+a.charAt(2)}}this.installed=a?1:(b.getAXO(this.progID0,1)?0:-1)}this.version=this.clipTo3digits(b.formatNum(a))}};PluginDetect.java={mimeType:"application/x-java-applet",classID:"clsid:8AD9C840-044E-11D1-B3E9-00805F499D93",DTKclassID:"clsid:CAFEEFAC-DEC7-0000-0000-ABCDEFFEDCBA",DTKmimeType:"application/npruntime-scriptable-plugin;DeploymentToolkit",JavaVersions:[[1,9,2,25],[1,8,2,25],[1,7,2,25],[1,6,2,25],[1,5,2,25],[1,4,2,25],[1,3,1,25]],searchJavaPluginAXO:function(){var h=null,a=this,c=a.$,g=[],j=[1,5,0,14],i=[1,6,0,2],f=[1,3,1,0],e=[1,4,2,0],d=[1,5,0,7],b=false;if(!c.ActiveXEnabled){return null};if(c.IEver>=a.minIEver){g=a.searchJavaAXO(i,i,b);if(g.length>0&&b){g=a.searchJavaAXO(j,j,b)}}else{if(g.length==0){g=a.searchJavaAXO(f,e,false)}}if(g.length>0){h=g[0]}a.JavaPlugin_versions=[].concat(g);return h},searchJavaAXO:function(l,i,m){var n,f,h=this.$,p,k,a,e,g,j,b,q=[];if(h.compareNums(l.join(","),i.join(","))>0){i=l}i=h.formatNum(i.join(","));var o,d="1,4,2,0",c="JavaPlugin."+l[0]+""+l[1]+""+l[2]+""+(l[3]>0?("_"+(l[3]<10?"0":"")+l[3]):"");for(n=0;n<this.JavaVersions.length;n++){f=this.JavaVersions[n];p="JavaPlugin."+f[0]+""+f[1];g=f[0]+"."+f[1]+".";for(a=f[2];a>=0;a--){b="JavaWebStart.isInstalled."+g+a+".0";if(h.compareNums(f[0]+","+f[1]+","+a+",0",i)>=0&&!h.getAXO(b,1)){continue}o=h.compareNums(f[0]+","+f[1]+","+a+",0",d)<0?true:false;for(e=f[3];e>=0;e--){k=a+"_"+(e<10?"0"+e:e);j=p+k;if(h.getAXO(j,1)&&(o||h.getAXO(b,1))){q[q.length]=g+k;if(!m){return q}}if(j==c){return q}}if(h.getAXO(p+a,1)&&(o||h.getAXO(b,1))){q[q.length]=g+a;if(!m){return q}}if(p+a==c){return q}}}return q},minIEver:7,getFromMimeType:function(a){var h,f,c=this.$,j=new RegExp(a),d,k,i={},e=0,b,g=[""];for(h=0;h<navigator.mimeTypes.length;h++){k=navigator.mimeTypes[h];if(j.test(k.type)&&k.enabledPlugin){k=k.type.substring(k.type.indexOf("=")+1,k.type.length);d="a"+c.formatNum(k);if(typeof i[d]=="undefined"){i[d]=k;e++}}}for(f=0;f<e;f++){b="0,0,0,0";for(h in i){if(i[h]){d=h.substring(1,h.length);if(c.compareNums(d,b)>0){b=d}}}g[f]=i["a"+b];i["a"+b]=null}if(!(/windows|macintosh/i).test(navigator.userAgent)){g=[g[0]]}return g},queryJavaHandler:function(){var b=PluginDetect.java,a=window.java,c;b.hasRun=true;try{if(typeof a.lang!="undefined"&&typeof a.lang.System!="undefined"){b.value=[a.lang.System.getProperty("java.version")+" ",a.lang.System.getProperty("java.vendor")+" "]}}catch(c){}},queryJava:function(){var c=this,d=c.$,b=navigator.userAgent,f;if(typeof window.java!="undefined"&&navigator.javaEnabled()&&!c.hasRun){if(d.isGecko){if(d.hasMimeType("application/x-java-vm")){try{var g=document.createElement("div"),a=document.createEvent("HTMLEvents");a.initEvent("focus",false,true);g.addEventListener("focus",c.queryJavaHandler,false);g.dispatchEvent(a)}catch(f){}if(!c.hasRun){c.queryJavaHandler()}}}else{if((/opera.9\.(0|1)/i).test(b)&&(/mac/i).test(b)){}else{if(!c.hasRun){c.queryJavaHandler()}}}}return c.value},forceVerifyTag:[],jar:[],VENDORS:["Sun Microsystems Inc.","Apple Computer, Inc."],init:function(){var a=this,b=a.$;if(typeof a.app!="undefined"){a.delJavaApplets(b)}a.hasRun=false;a.value=[null,null];a.useTag=[2,2,2];a.app=[0,0,0,0,0,0];a.appi=3;a.queryDTKresult=null;a.OTF=0;a.BridgeResult=[[null,null],[null,null],[null,null]];a.JavaActive=[0,0,0];a.All_versions=[];a.DeployTK_versions=[];a.MimeType_versions=[];a.JavaPlugin_versions=[];a.funcs=[];var c=a.NOTF;if(c){c.$=b;if(c.javaInterval){clearInterval(c.javaInterval)}c.EventJavaReady=null;c.javaInterval=null;c.count=0;c.intervalLength=250;c.countMax=40}a.lateDetection=b.winLoaded;if(!a.lateDetection){b.onWindowLoaded(a.delJavaApplets)}},getVersion:function(f,l){var h,d=this,g=d.$,j=null,n=null,e=null,c=navigator.javaEnabled();if(d.getVersionDone===null){d.init()}var k;if(typeof l!="undefined"&&l.constructor==Array){for(k=0;k<d.useTag.length;k++){if(typeof l[k]=="number"){d.useTag[k]=l[k]}}}for(k=0;k<d.forceVerifyTag.length;k++){d.useTag[k]=d.forceVerifyTag[k]}if(typeof f!="undefined"){d.jar[d.jar.length]=f}if(d.getVersionDone==0){if(!d.version||d.useAnyTag()){h=d.queryExternalApplet(f);if(h[0]){e=h[0];n=h[1]}}d.EndGetVersion(e,n);return}var i=d.queryDeploymentToolKit();if(typeof i=="string"&&i.length>0){j=i;n=d.VENDORS[0]}if(!g.isIE){var q,m,b,o,a;a=g.hasMimeType(d.mimeType);o=(a&&c)?true:false;if(d.MimeType_versions.length==0&&a){h=d.getFromMimeType("application/x-java-applet.*jpi-version.*=");if(h[0]!=""){if(!j){j=h[0]}d.MimeType_versions=h}}if(!j&&a){h="Java[^\\d]*Plug-in";b=g.findNavPlugin(h);if(b){h=new RegExp(h,"i");q=h.test(b.description)?g.getNum(b.description):null;m=h.test(b.name)?g.getNum(b.name):null;if(q&&m){j=(g.compareNums(g.formatNum(q),g.formatNum(m))>=0)?q:m}else{j=q||m}}}if(!j&&a&&(/macintosh.*safari/i).test(navigator.userAgent)){b=g.findNavPlugin("Java.*\\d.*Plug-in.*Cocoa",false);if(b){q=g.getNum(b.description);if(q){j=q}}}if(j){d.version0=j;if(c){e=j}}if(!e||d.useAnyTag()){b=d.queryExternalApplet(f);if(b[0]){e=b[0];n=b[1]}}if(!e){b=d.queryJava();if(b[0]){d.version0=b[0];e=b[0];n=b[1];if(d.installed==-0.5){d.installed=0.5}}}if(d.installed===null&&!e&&o&&!(/macintosh.*ppc/i).test(navigator.userAgent)){h=d.getFromMimeType("application/x-java-applet.*version.*=");if(h[0]!=""){e=h[0]}}if(!e&&o){if(/macintosh.*safari/i.test(navigator.userAgent)){if(d.installed===null){d.installed=0}else{if(d.installed==-0.5){d.installed=0.5}}}}}else{if(!j&&i!=-1){j=d.searchJavaPluginAXO();if(j){n=d.VENDORS[0]}}if(!j){d.JavaFix()}if(j){d.version0=j;if(c&&g.ActiveXEnabled){e=j}}if(!e||d.useAnyTag()){h=d.queryExternalApplet(f);if(h[0]){e=h[0];n=h[1]}}}if(d.installed===null){d.installed=e?1:(j?-0.2:-1)}d.EndGetVersion(e,n)},EndGetVersion:function(b,d){var a=this,c=a.$;if(a.version0){a.version0=c.formatNum(c.getNum(a.version0))}if(b){a.version=c.formatNum(c.getNum(b));a.vendor=(typeof d=="string"?d:"")}if(a.getVersionDone!=1){a.getVersionDone=0}},queryDeploymentToolKit:function(){var d=this,g=d.$,i,b,h=null,a=null;if((g.isGecko&&g.compareNums(g.GeckoRV,g.formatNum("1.6"))<=0)||g.isSafari||(g.isIE&&!g.ActiveXEnabled)){d.queryDTKresult=0}if(d.queryDTKresult!==null){return d.queryDTKresult}if(g.isIE&&g.IEver>=6){d.app[0]=g.instantiate("object",[],[]);h=g.getObject(d.app[0])}else{if(!g.isIE&&g.hasMimeType(d.DTKmimeType)){d.app[0]=g.instantiate("object",["type",d.DTKmimeType],[]);h=g.getObject(d.app[0])}}if(h){if(g.isIE&&g.IEver>=6){try{h.classid=d.DTKclassID}catch(i){}}try{var c,f=h.jvms;if(f){a=f.getLength();if(typeof a=="number"){for(b=0;b<a;b++){c=f.get(a-1-b);if(c){c=c.version;if(g.getNum(c)){d.DeployTK_versions[b]=c}}}}}}catch(i){}}g.hideObject(h);d.queryDTKresult=d.DeployTK_versions.length>0?d.DeployTK_versions[0]:(a==0?-1:0);return d.queryDTKresult},queryExternalApplet:function(d){var c=this,e=c.$,h=c.BridgeResult,b=c.app,g=c.appi,a="&nbsp;&nbsp;&nbsp;&nbsp;";if(typeof d!="string"||!(/\.jar\s*$/).test(d)){return[null,null]}if(c.OTF<1){c.OTF=1}if(!e.isIE){if((e.isGecko||e.isChrome)&&!e.hasMimeType(c.mimeType)&&!c.queryJava()[0]){return[null,null]}}if(c.OTF<2){c.OTF=2}if(!b[g]&&c.canUseObjectTag()&&c.canUseThisTag(0)){b[1]=e.instantiate("object",[],[],a);b[g]=e.isIE?e.instantiate("object",["archive",d,"code","A.class","type",c.mimeType],["archive",d,"code","A.class","mayscript","true","scriptable","true"],a):e.instantiate("object",["archive",d,"classid","java:A.class","type",c.mimeType],["archive",d,"mayscript","true","scriptable","true"],a);h[0]=[0,0];c.query1Applet(g)}if(!b[g+1]&&c.canUseAppletTag()&&c.canUseThisTag(1)){b[g+1]=e.instantiate("applet",["archive",d,"code","A.class","alt",a,"mayscript","true"],["mayscript","true"],a);h[1]=[0,0];c.query1Applet(g+1)}if(e.isIE&&!b[g+2]&&c.canUseObjectTag()&&c.canUseThisTag(2)){b[g+2]=e.instantiate("object",["classid",c.classID],["archive",d,"code","A.class","mayscript","true","scriptable","true"],a);h[2]=[0,0];c.query1Applet(g+2)};var j,f=0;for(j=0;j<h.length;j++){if(b[g+j]||c.canUseThisTag(j)){f++}else{break}}if(f==h.length){c.getVersionDone=1;if(c.forceVerifyTag.length>0){c.getVersionDone=0}}return c.getBR()},canUseAppletTag:function(){return((!this.$.isIE||navigator.javaEnabled())?true:false)},canUseObjectTag:function(){return((!this.$.isIE||this.$.ActiveXEnabled)?true:false)},useAnyTag:function(){var b=this,a;for(a=0;a<b.useTag.length;a++){if(b.canUseThisTag(a)){return true}}return false},canUseThisTag:function(c){var a=this,b=a.$;if(a.useTag[c]==3){return true}if(!a.version0||!navigator.javaEnabled()||(b.isIE&&!b.ActiveXEnabled)){if(a.useTag[c]==2){return true}if(a.useTag[c]==1&&!a.getBR()[0]){return true}}return false},getBR:function(){var b=this.BridgeResult,a;for(a=0;a<b.length;a++){if(b[a][0]){return[b[a][0],b[a][1]]}}return[b[0][0],b[0][1]]},delJavaApplets:function(b){var c=b.java.app,a;for(a=c.length-1;a>=0;a--){b.uninstantiate(c[a])}},query1Applet:function(g){var f,c=this,d=c.$,a=null,h=null,b=d.getObject(c.app[g],true);try{if(b){a=b.getVersion()+" ";h=b.getVendor()+" ";if(d.num(a)){c.BridgeResult[g-c.appi]=[a,h];d.hideObject(c.app[g])}if(d.isIE&&a&&b.readyState!=4){d.garbage=true;d.uninstantiate(c.app[g])}}}catch(f){}},NOTF:{isJavaActive:function(){}},append:function(e,d){for(var c=0;c<d.length;c++){e[e.length]=d[c]}},getInfo:function(){var m={};return m},JavaFix:function(){}};PluginDetect.devalvr={mimeType:"application/x-devalvrx",progID:"DevalVRXCtrl.DevalVRXCtrl.1",classID:"clsid:5D2CF9D0-113A-476B-986F-288B54571614",getVersion:function(){var a=null,g,c=this.$,f;if(!c.isIE){g=c.findNavPlugin("DevalVR");if(g&&g.name&&c.hasMimeType(this.mimeType)){a=g.description.split(" ")[3]}this.installed=a?1:-1}else{var b,h,d;h=c.getAXO(this.progID,1);if(h){b=c.instantiate("object",["classid",this.classID],["src",""]);d=c.getObject(b);if(d){try{if(d.pluginversion){a="00000000"+d.pluginversion.toString(16);a=a.substr(a.length-8,8);a=parseInt(a.substr(0,2),16)+","+parseInt(a.substr(2,2),16)+","+parseInt(a.substr(4,2),16)+","+parseInt(a.substr(6,2),16)}}catch(f){}}c.uninstantiate(b)}this.installed=a?1:(h?0:-1)}this.version=c.formatNum(a)}};PluginDetect.flash={mimeType:["application/x-shockwave-flash","application/futuresplash"],progID:"ShockwaveFlash.ShockwaveFlash",classID:"clsid:D27CDB6E-AE6D-11CF-96B8-444553540000",getVersion:function(){var c=function(i){if(!i){return null}var e=/[\d][\d\,\.\s]*[rRdD]{0,1}[\d\,]*/.exec(i);return e?e[0].replace(/[rRdD\.]/g,",").replace(/\s/g,""):null};var j,g=this.$,h,f,b=null,a=null,d=null;if(!g.isIE){j=g.findNavPlugin("Flash");if(j&&j.description&&g.hasMimeType(this.mimeType)){b=c(j.description)}}else{for(f=15;f>2;f--){a=g.getAXO(this.progID+"."+f);if(a){d=f.toString();break}}if(d=="6"){try{a.AllowScriptAccess="always"}catch(h){return"6,0,21,0"}}try{b=c(a.GetVariable("$version"))}catch(h){}if(!b&&d){b=d}}this.installed=b?1:-1;this.version=g.formatNum(b);return true}};PluginDetect.shockwave={mimeType:"application/x-director",progID:"SWCtl.SWCtl",classID:"clsid:166B1BCA-3F9C-11CF-8075-444553540000",getVersion:function(){var a=null,b=null,f,d,c=this.$;if(!c.isIE){d=c.findNavPlugin("Shockwave for Director");if(d&&d.description&&c.hasMimeType(this.mimeType)){a=c.getNum(d.description)}}else{try{b=c.getAXO(this.progID).ShockwaveVersion("")}catch(f){}if(typeof b=="string"&&b.length>0){a=c.getNum(b)}else{if(c.getAXO(this.progID+".8",1)){a="8"}else{if(c.getAXO(this.progID+".7",1)){a="7"}else{if(c.getAXO(this.progID+".1",1)){a="6"}}}}}this.installed=a?1:-1;this.version=c.formatNum(a)}};PluginDetect.div=null;PluginDetect.pluginSize=1;PluginDetect.DOMbody=null;PluginDetect.uninstantiate=function(a){var c,b=this;if(!a){return}try{if(a[0]&&a[0].firstChild){a[0].removeChild(a[0].firstChild)}if(a[0]&&b.div){b.div.removeChild(a[0])}if(b.div&&b.div.childNodes.length==0){b.div.parentNode.removeChild(b.div);b.div=null;if(b.DOMbody&&b.DOMbody.parentNode){b.DOMbody.parentNode.removeChild(b.DOMbody)}b.DOMbody=null}a[0]=null}catch(c){}};PluginDetect.getObject=function(b,a){var f,c=this,d=null;try{if(b&&b[0]&&b[0].firstChild){d=b[0].firstChild}}catch(f){}try{if(a&&d&&typeof d.focus!="undefined"&&typeof document.hasFocus!="undefined"&&!document.hasFocus()){d.focus()}}catch(f){}return d};PluginDetect.getContainer=function(a){var c,b=null;if(a&&a[0]){b=a[0]}return b};PluginDetect.hideObject=function(a){var b=this.getObject(a);if(b&&b.style){b.style.height="0"}};PluginDetect.instantiate=function(h,b,c,a){var j=function(d){var e=d.style;if(!e){return}e.border="0px";e.padding="0px";e.margin="0px";e.fontSize=(g.pluginSize+3)+"px";e.height=(g.pluginSize+3)+"px";e.visibility="visible";if(d.tagName&&d.tagName.toLowerCase()=="div"){e.width="100%";e.display="block"}else{if(d.tagName&&d.tagName.toLowerCase()=="span"){e.width=g.pluginSize+"px";e.display="inline"}}};var k,l=document,g=this,p,i=(l.getElementsByTagName("body")[0]||l.body),o=l.createElement("span"),n,f,m="/";if(typeof a=="undefined"){a=""}p="<"+h+' width="'+g.pluginSize+'" height="'+g.pluginSize+'" ';for(n=0;n<b.length;n=n+2){p+=b[n]+'="'+b[n+1]+'" '}p+=">";for(n=0;n<c.length;n=n+2){p+='<param name="'+c[n]+'" value="'+c[n+1]+'" />'}p+=a+"<"+m+h+">";if(!g.div){g.div=l.createElement("div");f=l.getElementById("plugindetect");if(f){j(f);f.appendChild(g.div)}else{if(i){try{if(i.firstChild&&typeof i.insertBefore!="undefined"){i.insertBefore(g.div,i.firstChild)}else{i.appendChild(g.div)}}catch(k){}}else{try{l.write('<div id="pd33993399">o<'+m+"div>");i=(l.getElementsByTagName("body")[0]||l.body);i.appendChild(g.div);i.removeChild(l.getElementById("pd33993399"))}catch(k){try{g.DOMbody=l.createElement("body");l.getElementsByTagName("html")[0].appendChild(g.DOMbody);g.DOMbody.appendChild(g.div)}catch(k){}}}}j(g.div)}if(g.div&&g.div.parentNode&&g.div.parentNode.parentNode){g.div.appendChild(o);try{o.innerHTML=p}catch(k){}j(o);return[o]}return[null]};PluginDetect.windowsmediaplayer={mimeType:["application/x-mplayer2","application/asx"],progID:"wmplayer.ocx",classID:"clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6",getVersion:function(){var a=null,e=this.$,b=null;this.installed=-1;if(!e.isIE){if(e.hasMimeType(this.mimeType)){if(e.findNavPlugin(["Windows","Media","(Plug-in|Plugin)"],false)||e.findNavPlugin(["Flip4Mac","Windows","Media"],false)){this.installed=0}var d=e.isGecko&&e.compareNums(e.GeckoRV,e.formatNum("1.8"))<0;if(!d&&e.findNavPlugin(["Windows","Media","Firefox Plugin"],false)){var c=e.instantiate("object",["type",this.mimeType[0]],[]),f=e.getObject(c);if(f){a=f.versionInfo}e.uninstantiate(c)}}}else{b=e.getAXO(this.progID);if(b){a=b.versionInfo}}if(a){this.installed=1}this.version=e.formatNum(a)}};PluginDetect.silverlight={mimeType:"application/x-silverlight",progID:"AgControl.AgControl",digits:[9,20,9,12,31],getVersion:function(){var c=this.$,j=document,g=null,b=null,f=false;if(!c.isIE){var a=[null,null],e=c.findNavPlugin("Silverlight Plug-in",false),h=c.isGecko&&c.compareNums(c.GeckoRV,c.formatNum("1.6"))<=0;if(e&&c.hasMimeType(this.mimeType)){g=c.formatNum(e.description);if(g){p=g.split(",");if(parseInt(p[2],10)>=30226&&parseInt(p[0],10)<2){p[0]="2"}g=p.join(",")}if(c.isGecko&&!h){f=true}if(!f&&!h&&g){a=c.instantiate("object",["type",this.mimeType],[]);b=c.getObject(a);if(b){if(typeof b.IsVersionSupported!="undefined"){f=true}if(!f){b.data="data:"+this.mimeType+",";if(typeof b.IsVersionSupported!="undefined"){f=true}}}c.uninstantiate(a)}}}else{b=c.getAXO(this.progID);var p=[1,0,1,1,1],l,k,o,i=function(d){return(d<10?"0":"")+d.toString()},m=function(q,d,s,t,r){return(q+"."+d+"."+s+i(t)+i(r)+".0")},n=function(d,s){var q,r=m((d==0?s:p[0]),(d==1?s:p[1]),(d==2?s:p[2]),(d==3?s:p[3]),(d==4?s:p[4]));try{return b.IsVersionSupported(r)}catch(q){}return false};if(b&&typeof b.IsVersionSupported!="undefined"){for(l=0;l<this.digits.length;l++){o=p[l];for(k=o+(l==0?0:1);k<=this.digits[l];k++){if(n(l,k)){f=true;p[l]=k}else{break}}if(!f){break}}if(f){g=m(p[0],p[1],p[2],p[3],p[4])}}}this.installed=f?1:-1;this.version=c.formatNum(g)}};PluginDetect.vlc={mimeType:"application/x-vlc-plugin",progID:"VideoLAN.VLCPlugin",compareNums:function(d,c){var j=d.split(","),h=c.split(","),g,b,a,f,e,i;for(g=0;g<Math.min(j.length,h.length);g++){i=/([\d]+)([a-z]?)/.test(j[g]);b=parseInt(RegExp.$1,10);f=(g==2&&RegExp.$2.length>0)?RegExp.$2.charCodeAt(0):-1;i=/([\d]+)([a-z]?)/.test(h[g]);a=parseInt(RegExp.$1,10);e=(g==2&&RegExp.$2.length>0)?RegExp.$2.charCodeAt(0):-1;if(b!=a){return(b>a?1:-1)}if(g==2&&f!=e){return(f>e?1:-1)}}return 0},getVersion:function(){var b=this.$,d,a=null,c;if(!b.isIE){if(b.hasMimeType(this.mimeType)){d=b.findNavPlugin(["VLC","(Plug-in|Plugin)"],false);if(d&&d.description){a=b.getNum(d.description,"[\\d][\\d\\.]*[a-z]*")}}this.installed=a?1:-1}else{d=b.getAXO(this.progID);if(d){try{a=b.getNum(d.VersionInfo,"[\\d][\\d\\.]*[a-z]*")}catch(c){}}this.installed=d?1:-1}this.version=b.formatNum(a)}};PluginDetect.initScript(); \ No newline at end of file diff --git a/js/price.js b/js/price.js new file mode 100644 index 000000000..7e887aedf --- /dev/null +++ b/js/price.js @@ -0,0 +1,224 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function getTax() +{ + if (noTax) + return 0; + var selectedTax = document.getElementById('id_tax_rules_group'); + var taxId = selectedTax.options[selectedTax.selectedIndex].value; + return taxesArray[taxId]; +} + +function getEcotaxTaxIncluded() +{ + return ($('#ecotax').length && $('#ecotax').val() != '') ? parseFloat($('#ecotax').val()) : 0; +} + +function getEcotaxTaxExcluded() +{ + return getEcotaxTaxIncluded() / (1 + ecotaxTaxRate); +} + +function formatPrice(price) +{ + var fixedToSix = (Math.round(price * 1000000) / 1000000); + return (Math.round(fixedToSix) == fixedToSix + 0.000001 ? fixedToSix + 0.000001 : fixedToSix); +} + +function calcPriceTI() +{ + var tax = getTax(); + var priceTE = parseFloat(document.getElementById('priceTE').value.replace(/,/g, '.')); + var newPrice = priceTE * ((tax / 100) + 1); + document.getElementById('priceTI').value = (isNaN(newPrice) == true || newPrice < 0) ? '' : + ps_round(newPrice, 2); + document.getElementById('finalPrice').innerHTML = (isNaN(newPrice) == true || newPrice < 0) ? '' : + ps_round(newPrice, 2).toFixed(2); + document.getElementById('finalPriceWithoutTax').innerHTML = (isNaN(priceTE) == true || priceTE < 0) ? '' : + (ps_round(priceTE, 2) + getEcotaxTaxExcluded()).toFixed(2); + calcReduction(); + document.getElementById('priceTI').value = parseFloat(document.getElementById('priceTI').value) + getEcotaxTaxIncluded(); + document.getElementById('finalPrice').innerHTML = parseFloat(document.getElementById('priceTI').value); +} + +function calcPriceTE() +{ + var tax = getTax(); + var priceTI = parseFloat(document.getElementById('priceTI').value.replace(/,/g, '.')); + var newPrice = ps_round(priceTI - getEcotaxTaxIncluded(), 2) / ((tax / 100) + 1); + document.getElementById('priceTE').value = (isNaN(newPrice) == true || newPrice < 0) ? '' : + ps_round(newPrice.toFixed(6), 6); + document.getElementById('finalPrice').innerHTML = (isNaN(newPrice) == true || newPrice < 0) ? '' : + ps_round(priceTI.toFixed(2), 2); + document.getElementById('finalPriceWithoutTax').innerHTML = (isNaN(newPrice) == true || newPrice < 0) ? '' : + ps_round(newPrice.toFixed(2), 2) + getEcotaxTaxExcluded(); + calcReduction(); +} + +function calcImpactPriceTI() +{ + var tax = getTax(); + var priceTE = parseFloat(document.getElementById('attribute_price').value.replace(/,/g, '.')); + var newPrice = priceTE * ((tax / 100) + 1); + $('#attribute_priceTI').val((isNaN(newPrice) == true || newPrice < 0) ? '' :ps_round(newPrice.toFixed(6), 6)); + var total = ps_round((parseFloat($('#attribute_priceTI').val())*parseInt($('#attribute_price_impact').val())+parseFloat($('#finalPrice').html())), 2); + if (isNaN(total) || total < 0) + $('#attribute_new_total_price').html('0.00'); + else + $('#attribute_new_total_price').html(total); +} + +function calcImpactPriceTE() +{ + var tax = getTax(); + var priceTI = parseFloat(document.getElementById('attribute_priceTI').value.replace(/,/g, '.')); + priceTI = (isNaN(priceTI)) ? 0 : ps_round(priceTI); + var newPrice = ps_round(priceTI, 2) / ((tax / 100) + 1); + $('#attribute_price').val((isNaN(newPrice) == true || newPrice < 0) ? '' :ps_round(newPrice.toFixed(6), 6)); + var total = ps_round((parseFloat($('#attribute_priceTI').val())*parseInt($('#attribute_price_impact').val())+parseFloat($('#finalPrice').html())), 2); + if (isNaN(total) || total < 0) + $('#attribute_new_total_price').html('0.00'); + else + $('#attribute_new_total_price').html(total); +} + +function calcReduction() +{ + if (parseFloat($('#reduction_price').val()) > 0) + reductionPrice(); + else if (parseFloat($('#reduction_percent').val()) > 0) + reductionPercent(); +} + +function reductionPrice() +{ + var tax = getTax(); + var price = document.getElementById('priceTI'); + var priceWhithoutTaxes = document.getElementById('priceTE'); + var newprice = document.getElementById('finalPrice'); + var newpriceWithoutTax = document.getElementById('finalPriceWithoutTax'); + var curPrice = price.value; + + document.getElementById('reduction_percent').value = 0; + if (isInReductionPeriod()) + { + var rprice = document.getElementById('reduction_price'); + if (parseFloat(curPrice) <= parseFloat(rprice.value)) + rprice.value = curPrice; + if (parseFloat(rprice.value) < 0 || isNaN(parseFloat(curPrice))) + rprice.value = 0; + curPrice = curPrice - rprice.value; + } + + newprice.innerHTML = (ps_round(parseFloat(curPrice),2) + getEcotaxTaxIncluded()).toFixed(2); + var rpriceWithoutTaxes = ps_round(rprice.value / ((tax / 100) + 1), 2); + newpriceWithoutTax.innerHTML = ps_round(priceWhithoutTaxes.value - rpriceWithoutTaxes,2).toFixed(2); +} + +function reductionPercent() +{ + var tax = getTax(); + var price = document.getElementById('priceTI'); + var newprice = document.getElementById('finalPrice'); + var newpriceWithoutTax = document.getElementById('finalPriceWithoutTax'); + var curPrice = price.value; + + document.getElementById('reduction_price').value = 0; + if (isInReductionPeriod()) + { + var newprice = document.getElementById('finalPrice'); + var rpercent = document.getElementById('reduction_percent'); + + if (parseFloat(rpercent.value) >= 100) + rpercent.value = 100; + if (parseFloat(rpercent.value) < 0) + rpercent.value = 0; + curPrice = price.value * (1 - (rpercent.value / 100)); + } + + newprice.innerHTML = (ps_round(parseFloat(curPrice),2) + getEcotaxTaxIncluded()).toFixed(2); + newpriceWithoutTax.innerHTML = ps_round(parseFloat(ps_round(curPrice, 2) / ((tax / 100) + 1)),2).toFixed(2); +} + +function isInReductionPeriod() +{ + var start = document.getElementById('reduction_from').value; + var end = document.getElementById('reduction_to').value; + + if (start == end && start != "" && start != "0000-00-00 00:00:00") return true; + + var sdate = new Date(start.replace(/-/g,'/')); + var edate = new Date(end.replace(/-/g,'/')); + var today = new Date(); + + return (sdate <= today && edate >= today); +} + +function decimalTruncate(source, decimals) +{ + if (typeof(decimals) == 'undefined') + decimals = 6; + source = source.toString(); + var pos = source.indexOf('.'); + return parseFloat(source.substr(0, pos + decimals + 1)); +} + +function unitPriceWithTax(type) +{ + var tax = getTax(); + var priceWithTax = parseFloat(document.getElementById(type+'_price').value.replace(/,/g, '.')); + var newPrice = priceWithTax * ((tax / 100) + 1); + $('#'+type+'_price_with_tax').html((isNaN(newPrice) == true || newPrice < 0) ? '0.00' : ps_round(newPrice, 2).toFixed(2)); +} + +function unitySecond() +{ + $('#unity_second').html($('#unity').val()); + if ($('#unity').get(0).value.length > 0) + { + $('#unity_third').html($('#unity').val()); + $('#tr_unit_impact').show(); + } + else + $('#tr_unit_impact').hide(); +} + +function changeCurrencySpecificPrice(index) +{ + var id_currency = $('#spm_currency_' + index).val(); + if (currencies[id_currency]["format"] == 2 || currencies[id_currency]["format"] == 4) + { + $('#spm_currency_sign_pre_' + index).html(''); + $('#spm_currency_sign_post_' + index).html(' ' + currencies[id_currency]["sign"]); + } + else if (currencies[id_currency]["format"] == 1 || currencies[id_currency]["format"] == 3) + { + $('#spm_currency_sign_post_' + index).html(''); + $('#spm_currency_sign_pre_' + index).html(currencies[id_currency]["sign"] + ' '); + } +} + diff --git a/js/sendMailTest.js b/js/sendMailTest.js new file mode 100644 index 000000000..c79c8a836 --- /dev/null +++ b/js/sendMailTest.js @@ -0,0 +1,80 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +//constant +verifMailREGEX = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/; + +function verifyMail(testMsg, testSubject) +{ + $("#mailResultCheck").removeClass("ok").removeClass('fail').html('<img src="../img/admin/ajax-loader.gif" alt="" />'); + $("#mailResultCheck").slideDown("slow"); + + //local verifications + if ($("#testEmail[value=]").length > 0) + { + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(errorMail); + return false; + } + else if (!verifMailREGEX.test( $("#testEmail").val() )) + { + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(errorMail); + return false; + } + else + { + //external verifications and sets + $.ajax( + { + url: "ajax_send_mail_test.php", + cache: false, + data: + "mailMethod="+(($("input#PS_MAIL_METHOD").val() == 2) ? "smtp" : "native")+ + "&smtpSrv="+ $("input#PS_MAIL_SERVER").val()+ + "&testEmail="+ $("#testEmail").val()+ + "&smtpLogin="+ $("input#PS_MAIL_USER").val()+ + "&smtpPassword="+ $("input#PS_MAIL_PASSWD").val()+ + "&smtpPort="+ $("input#PS_MAIL_SMTP_PORT").val()+ + "&smtpEnc="+ $("select#PS_MAIL_SMTP_ENCRYPTION").val()+ + "&testMsg="+textMsg+ + "&testSubject="+textSubject + , + success: function(ret) + { + if (ret == "ok") + { + $("#mailResultCheck").addClass("ok").removeClass("fail").removeClass('userInfos').html(textSendOk); + mailIsOk = true; + } + else + { + mailIsOk = false; + $("#mailResultCheck").addClass("fail").removeClass("ok").removeClass('userInfos').html(textSendError); + } + } + } + ); + } +} \ No newline at end of file diff --git a/js/tabpane.js b/js/tabpane.js new file mode 100644 index 000000000..908c6037a --- /dev/null +++ b/js/tabpane.js @@ -0,0 +1,287 @@ +/*----------------------------------------------------------------------------\ +| Tab Pane 1.02 | +|-----------------------------------------------------------------------------| +| Created by Erik Arvidsson | +| (http://webfx.eae.net/contact.html#erik) | +| For WebFX (http://webfx.eae.net/) | +|-----------------------------------------------------------------------------| +| Copyright (c) 2002, 2003, 2006 Erik Arvidsson | +|-----------------------------------------------------------------------------| +| Licensed under the Apache License, Version 2.0 (the "License"); you may not | +| use this file except in compliance with the License. You may obtain a copy | +| of the License at http://www.apache.org/licenses/LICENSE-2.0 | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | +| WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | +| License for the specific language governing permissions and limitations | +| under the License. | +\----------------------------------------------------------------------------*/ + +function hasSupport() { + + if (typeof hasSupport.support != "undefined") + return hasSupport.support; + + var ie55 = /msie 5\.[56789]/i.test( navigator.userAgent ); + + hasSupport.support = ( typeof document.implementation != "undefined" && + document.implementation.hasFeature( "html", "1.0" ) || ie55 ) + + // IE55 has a serious DOM1 bug... Patch it! + if ( ie55 ) { + document._getElementsByTagName = document.getElementsByTagName; + document.getElementsByTagName = function ( sTagName ) { + if ( sTagName == "*" ) + return document.all; + else + return document._getElementsByTagName( sTagName ); + }; + } + + return hasSupport.support; +} + +function WebFXTabPane( el ) { + if ( !hasSupport() || el == null ) return; + + this.element = el; + this.element.tabPane = this; + this.pages = []; + this.selectedIndex = null; + + // add class name tag to class name + this.element.className = this.classNameTag + " " + this.element.className; + + // add tab row + this.tabRow = document.createElement( "div" ); + this.tabRow.className = "tab-row"; + el.insertBefore( this.tabRow, el.firstChild ); + + var tabIndex = pos_select; + this.selectedIndex = tabIndex; + + // loop through child nodes and add them + var cs = el.childNodes; + var n; + for (var i = 0; i < cs.length; i++) { + if (cs[i].nodeType == 1 && cs[i].className == "tab-page") { + this.addTabPage( cs[i] ); + } + } +} + +WebFXTabPane.prototype.classNameTag = "dynamic-tab-pane-control"; + +WebFXTabPane.prototype.setSelectedIndex = function ( n ) { + if (this.selectedIndex != n) { + if (this.selectedIndex != null && this.pages[ this.selectedIndex ] != null ) + this.pages[ this.selectedIndex ].hide(); + this.selectedIndex = n; + this.pages[ this.selectedIndex ].show(); + + // Add-on jQuery + loadTab(this.selectedIndex+1); + } +}; + +WebFXTabPane.prototype.getSelectedIndex = function () { + return this.selectedIndex; +}; + +WebFXTabPane.prototype.addTabPage = function ( oElement ) { + if ( !hasSupport() ) return; + + if ( oElement.tabPage == this ) // already added + return oElement.tabPage; + + var n = this.pages.length; + var tp = this.pages[n] = new WebFXTabPage( oElement, this, n ); + tp.tabPane = this; + + // move the tab out of the box + this.tabRow.appendChild( tp.tab ); + + if ( n == this.selectedIndex ) + tp.show(); + else + tp.hide(); + + return tp; +}; + +WebFXTabPane.prototype.dispose = function () { + this.element.tabPane = null; + this.element = null; + this.tabRow = null; + + for (var i = 0; i < this.pages.length; i++) { + this.pages[i].dispose(); + this.pages[i] = null; + } + this.pages = null; +}; + +function WebFXTabPage( el, tabPane, nIndex ) { + if ( !hasSupport() || el == null ) return; + + this.element = el; + this.element.tabPage = this; + this.index = nIndex; + + var cs = el.childNodes; + for (var i = 0; i < cs.length; i++) { + if (cs[i].nodeType == 1 && cs[i].className == "tab") { + this.tab = cs[i]; + break; + } + } + + var a = document.createElement( "A" ); + this.aElement = a; + a.href = "#"; + a.onclick = function () { return false; }; + while ( this.tab.hasChildNodes() ) + a.appendChild( this.tab.firstChild ); + this.tab.appendChild( a ); + + var oThis = this; + this.tab.onclick = function () { oThis.select(); }; + this.tab.onmouseover = function () { WebFXTabPage.tabOver( oThis ); }; + this.tab.onmouseout = function () { WebFXTabPage.tabOut( oThis ); }; +} + +WebFXTabPage.prototype.show = function () { + var el = this.tab; + var s = el.className + " selected"; + s = s.replace(/ +/g, " "); + el.className = s; + + this.element.style.display = "block"; + pos_select = this.element.id.substring(4, 5) - 1; + document.getElementById('tabs').value = pos_select; + loadTab(pos_select+1); +}; + +WebFXTabPage.prototype.hide = function () { + var el = this.tab; + var s = el.className; + s = s.replace(/ selected/g, ""); + el.className = s; + + this.element.style.display = "none"; +}; + +WebFXTabPage.prototype.select = function () { + this.tabPane.setSelectedIndex( this.index ); +}; + +WebFXTabPage.prototype.dispose = function () { + this.aElement.onclick = null; + this.aElement = null; + this.element.tabPage = null; + this.tab.onclick = null; + this.tab.onmouseover = null; + this.tab.onmouseout = null; + this.tab = null; + this.tabPane = null; + this.element = null; +}; + +WebFXTabPage.tabOver = function ( tabpage ) { + var el = tabpage.tab; + var s = el.className + " hover"; + s = s.replace(/ +/g, " "); + el.className = s; +}; + +WebFXTabPage.tabOut = function ( tabpage ) { + var el = tabpage.tab; + var s = el.className; + s = s.replace(/ hover/g, ""); + el.className = s; +}; + + +// This function initializes all uninitialized tab panes and tab pages +function setupAllTabs() { + if ( !hasSupport() ) return; + + var all = document.getElementsByTagName( "*" ); + var l = all.length; + var tabPaneRe = /tab\-pane/; + var tabPageRe = /tab\-page/; + var cn, el; + var parentTabPane; + + for ( var i = 0; i < l; i++ ) { + el = all[i] + cn = el.className; + + // no className + if ( cn == "" ) continue; + + // uninitiated tab pane + if ( tabPaneRe.test( cn ) && !el.tabPane ) + new WebFXTabPane( el ); + + // unitiated tab page wit a valid tab pane parent + else if ( tabPageRe.test( cn ) && !el.tabPage && + tabPaneRe.test( el.parentNode.className ) ) { + el.parentNode.tabPane.addTabPage( el ); + } + } +} + +function disposeAllTabs() { + if ( !hasSupport() ) return; + + var all = document.getElementsByTagName( "*" ); + var l = all.length; + var tabPaneRe = /tab\-pane/; + var cn, el; + var tabPanes = []; + + for ( var i = 0; i < l; i++ ) { + el = all[i] + cn = el.className; + + // no className + if ( cn == "" ) continue; + + // tab pane + if ( tabPaneRe.test( cn ) && el.tabPane ) + tabPanes[tabPanes.length] = el.tabPane; + } + + for (var i = tabPanes.length - 1; i >= 0; i--) { + tabPanes[i].dispose(); + tabPanes[i] = null; + } +} + +// Select the right tabs +if (!pos_select) + pos_select = 0; + +// DOM2 +if ( typeof window.addEventListener != "undefined" ) + window.addEventListener( "load", setupAllTabs, false ); + +// IE +else if ( typeof window.attachEvent != "undefined" ) { + window.attachEvent( "onload", setupAllTabs ); + window.attachEvent( "onunload", disposeAllTabs ); +} + +else { + if ( window.onload != null ) { + var oldOnload = window.onload; + window.onload = function ( e ) { + oldOnload( e ); + setupAllTabs(); + }; + } + else + window.onload = setupAllTabs; +} \ No newline at end of file diff --git a/js/tiny_mce/langs/en.js b/js/tiny_mce/langs/en.js new file mode 100755 index 000000000..d3e24c71a --- /dev/null +++ b/js/tiny_mce/langs/en.js @@ -0,0 +1 @@ +tinyMCE.addI18n({en:{common:{"more_colors":"More colors","invalid_data":"Error: Invalid values entered, these are marked in red.","popup_blocked":"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.","clipboard_no_support":"Currently not supported by your browser, use keyboard shortcuts instead.","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\\nDo you want more information about this issue?","not_set":"-- Not set --","class_name":"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply","edit_confirm":"Do you want to use the WYSIWYG mode for this textarea?"},contextmenu:{full:"Full",right:"Right",center:"Center",left:"Left",align:"Alignment"},insertdatetime:{"day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","inserttime_desc":"Insert time","insertdate_desc":"Insert date","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Print"},preview:{"preview_desc":"Preview"},directionality:{"rtl_desc":"Direction right to left","ltr_desc":"Direction left to right"},layer:{content:"New layer...","absolute_desc":"Toggle absolute positioning","backward_desc":"Move backward","forward_desc":"Move forward","insertlayer_desc":"Insert new layer"},save:{"save_desc":"Save","cancel_desc":"Cancel all changes"},nonbreaking:{"nonbreaking_desc":"Insert non-breaking space character"},iespell:{download:"ieSpell not detected. Do you want to install it now?","iespell_desc":"Run spell checking"},advhr:{"delta_height":"","delta_width":"","advhr_desc":"Horizontal rule"},emotions:{"delta_height":"","delta_width":"","emotions_desc":"Emotions"},searchreplace:{"replace_desc":"Find/Replace","delta_width":"","delta_height":"","search_desc":"Find"},advimage:{"delta_width":"","image_desc":"Insert/edit image","delta_height":""},advlink:{"delta_height":"","delta_width":"","link_desc":"Insert/edit link"},xhtmlxtras:{"attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":"","attribs_desc":"Insert/Edit Attributes","ins_desc":"Insertion","del_desc":"Deletion","acronym_desc":"Acronym","abbr_desc":"Abbreviation","cite_desc":"Citation"},style:{"delta_height":"","delta_width":"",desc:"Edit CSS Style"},paste:{"plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Select All","paste_word_desc":"Paste from Word","paste_text_desc":"Paste as Plain Text"},"paste_dlg":{"word_title":"Use CTRL+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V on your keyboard to paste the text into the window."},table:{"merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":"",cell:"Cell",col:"Column",row:"Row",del:"Delete table","copy_row_desc":"Copy table row","cut_row_desc":"Cut table row","paste_row_after_desc":"Paste table row after","paste_row_before_desc":"Paste table row before","props_desc":"Table properties","cell_desc":"Table cell properties","row_desc":"Table row properties","merge_cells_desc":"Merge table cells","split_cells_desc":"Split merged table cells","delete_col_desc":"Remove column","col_after_desc":"Insert column after","col_before_desc":"Insert column before","delete_row_desc":"Delete row","row_after_desc":"Insert row after","row_before_desc":"Insert row before",desc:"Inserts a new table"},autosave:{"warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\\n\\nAre you sure you want to restore the saved content?.","restore_content":"Restore auto-saved content.","unload_msg":"The changes you made will be lost if you navigate away from this page."},fullscreen:{desc:"Toggle fullscreen mode"},media:{"delta_height":"","delta_width":"",edit:"Edit embedded media",desc:"Insert / edit embedded media"},fullpage:{desc:"Document properties","delta_width":"","delta_height":""},template:{desc:"Insert predefined template content"},visualchars:{desc:"Visual control characters on/off."},spellchecker:{desc:"Toggle spellchecker",menu:"Spellchecker settings","ignore_word":"Ignore word","ignore_words":"Ignore all",langs:"Languages",wait:"Please wait...",sug:"Suggestions","no_sug":"No suggestions","no_mpell":"No misspellings found."},pagebreak:{desc:"Insert page break."},advlist:{types:"Types",def:"Default","lower_alpha":"Lower alpha","lower_greek":"Lower greek","lower_roman":"Lower roman","upper_alpha":"Upper alpha","upper_roman":"Upper roman",circle:"Circle",disc:"Disc",square:"Square"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/es.js b/js/tiny_mce/langs/es.js new file mode 100755 index 000000000..ff1d88526 --- /dev/null +++ b/js/tiny_mce/langs/es.js @@ -0,0 +1 @@ +tinyMCE.addI18n({es:{common:{"more_colors":"M\u00e1s colores","invalid_data":"Error: Introdujo un valor no v\u00e1lido, est\u00e1n marcados en rojo.","popup_blocked":"Lo sentimos, su bloqueo de ventanas emergentes ha deshabilitado una ventana que provee funcionalidades a la aplicaci\u00f3n. Necesita deshabilitar este bloqueo en este sitio para poder utilizar todas las funciones.","clipboard_no_support":"Su navegador no soporta las funciones de cortapapeles, use los accesos por teclado.","clipboard_msg":"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\\n \u00bfDesea obtener m\u00e1s informaci\u00f3n acerca de este tema?","not_set":"-- Ninguno --","class_name":"Clase",browse:"Examinar",close:"Cerrar",cancel:"Cancelar",update:"Actualizar",insert:"Insertar",apply:"Aplicar","edit_confirm":" \u00bfDesea utilizar el modo WYSIWYG para esta caja de texto?"},contextmenu:{full:"Justificado",right:"Derecha",center:"Centrado",left:"Izquierda",align:"Alineaci\u00f3n"},insertdatetime:{"day_short":"Dom,Lun,Mar,Mie,Jue,Vie,Sab,Dom","day_long":"Domingo,Lunes,Martes,Mi\u00e9rcoles,Jueves,Viernes,S\u00e1bado,Domingo","months_short":"Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic","months_long":"Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre","inserttime_desc":"Insertar hora","insertdate_desc":"Insertar fecha","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Imprimir"},preview:{"preview_desc":"Vista previa"},directionality:{"rtl_desc":"Direcci\u00f3n derecha a izquierda","ltr_desc":"Direcci\u00f3n izquierda a derecha"},layer:{content:"Nueva capa...","absolute_desc":"Cambiar a posici\u00f3n absoluta","backward_desc":"Retroceder","forward_desc":"Avanzar","insertlayer_desc":"Insertar nueva capa"},save:{"save_desc":"Guardar","cancel_desc":"Cancelar todos los cambios"},nonbreaking:{"nonbreaking_desc":"Insertar caracter de espacio \'non-breaking\'"},iespell:{download:"No se detect\u00f3 \'ieSpell\'. \u00bfDesea instalarlo ahora?","iespell_desc":"Corrector ortogr\u00e1fico"},advhr:{"advhr_desc":"Regla horizontal","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emoticones","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Buscar/Reemplazar","search_desc":"Buscar","delta_width":"","delta_height":""},advimage:{"image_desc":"Insertar/editar imagen","delta_width":"","delta_height":""},advlink:{"link_desc":"Insertar/editar hiperv\u00ednculo","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Insertar/Editar atributos","ins_desc":"Inserci\u00f3n","del_desc":"Borrado","acronym_desc":"Acr\u00f3nimo","abbr_desc":"Abreviatura","cite_desc":"Cita","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Editar Estilo CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Elegir todo","paste_word_desc":"Pegar desde Word","paste_text_desc":"Pegar como texto plano"},"paste_dlg":{"word_title":"Use CTRL+V en su teclado para pegar el texto en la ventana.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V en su teclado para pegar el texto en la ventana."},table:{cell:"Celda",col:"Columna",row:"Fila",del:"Eliminar tabla","copy_row_desc":"Copiar fila","cut_row_desc":"Cortar fila","paste_row_after_desc":"Pegar filas (despu\u00e9s)","paste_row_before_desc":"Pegar filas (antes)","props_desc":"Propiedades de la tabla","cell_desc":"Propiedades de la celda","row_desc":"Propiedades de la fila","merge_cells_desc":"Vincular celdas","split_cells_desc":"Dividir celdas","delete_col_desc":"Suprimir columna","col_after_desc":"Insertar columna (despu\u00e9s)","col_before_desc":"Insertar columna (antes)","delete_row_desc":"Suprimir fila","row_after_desc":"Insertar fila (despu\u00e9s)","row_before_desc":"Insertar fila (antes)",desc:"Inserta una nueva tabla","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Se reestablece en contenido guardado, perder\u00e1 todo el contenido que est\u00e1 actualmente en el editor.\\n\\nEst\u00e1 seguro de que quiere reestablecer el contenido guardado.","restore_content":"Reestablecer contenido guardado autom\u00e1ticamente","unload_msg":"Los cambios realizados se perder\u00e1n si sale de esta p\u00e1gina."},fullscreen:{desc:"Cambiar a modo Pantalla Completa"},media:{edit:"Editar medio embebido",desc:"Insertar/editar medio embebido","delta_height":"","delta_width":""},fullpage:{desc:"Propiedades del documento","delta_width":"Ancho","delta_height":"Alto"},template:{desc:"Insertar contenido de plantilla predefinida"},visualchars:{desc:"Caracteres de control ON/OFF."},spellchecker:{desc:"Cambiar a corrector ortogr\u00e1fico",menu:"Configuraci\u00f3n de corrector ortogr\u00e1fico","ignore_word":"Ignorar","ignore_words":"Ignorar todo",langs:"Idiomas",wait:"Espere...",sug:"Sugerencias","no_sug":"Sin sugerencias","no_mpell":"No se encontraron errores."},pagebreak:{desc:"Insertar fin de p\u00e1gina"},advlist:{types:"Tipo",def:"Preestablecido","lower_alpha":"Menos opaco","lower_greek":"Menos greek","lower_roman":"Menos roman","upper_alpha":"M\u00e1s opaco","upper_roman":"M\u00e1s roman",circle:"Circulo",disc:"Disc",square:"Cuadro"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/et.js b/js/tiny_mce/langs/et.js new file mode 100755 index 000000000..6d1fbb0c4 --- /dev/null +++ b/js/tiny_mce/langs/et.js @@ -0,0 +1 @@ +tinyMCE.addI18n({et:{common:{more_colors:"Rohkem v\u00e4rve",invalid_data:"Viga: Kehtetud v\u00e4\u00e4rtused sisestatud, need on m\u00e4rgitud punasega.",popup_blocked:"Vabandust, aga Teie h\u00fcpikakna t\u00f5kestaja on blokeerinud akna, mis varustab rakenduse funktsionaalsust. Palun lubage h\u00fcpikaknad sellel kodulehel, et t\u00e4ielikult kasutada seda vahendit.",clipboard_no_support:"Hetkel ei ole toetatud Teie lehitseja poolt, kasutage klaviatuuri otseteid selle asemel.",clipboard_msg:"Kopeeri/L\u00f5ika/Kleebi ei ole saadaval Mozillas ja Firefoxis.\\nKas soovite rohkem infot selle probleemi kohta?",not_set:"-- Seadmata --",class_name:"Klass",browse:"Sirvi",close:"Sule",cancel:"T\u00fchista",update:"Uuenda",insert:"Sisesta",apply:"Rakenda",edit_confirm:"Kas soovite kasutada WYSIWYG re\u017eiimi sellel tekstialal?"},contextmenu:{full:"T\u00e4is",right:"Parem",center:"Kesk",left:"Vasak",align:"Joondus"},insertdatetime:{day_short:"P,E,T,K,N,R,L,P",day_long:"P\u00fchap\u00e4ev,Esmasp\u00e4ev,Teisip\u00e4ev,Kolmap\u00e4ev,Neljap\u00e4ev,Reede,Laup\u00e4ev,P\u00fchap\u00e4ev",months_short:"Jaan,Veeb,M\u00e4rts,Apr,Mai,Juuni,Juuli,Aug,Sept,Okt,Nov,Dets",months_long:"Jaanuar,Veebruar,M\u00e4rts,Aprill,Mai,Juuni,Juuli,August,September,Oktoober,November,Detsember",inserttime_desc:"Sisesta aeg",insertdate_desc:"Sisesta kuup\u00e4ev",time_fmt:"%T:%M:%S",date_fmt:"%A-%k-%p"},print:{print_desc:"Print"},preview:{preview_desc:"Eelvaade"},directionality:{rtl_desc:"Suund paremalt vasakule",ltr_desc:"Suund vasakult paremale"},layer:{content:"Uus kiht...",absolute_desc:"L\u00fclita \u00fcmber absoluutne positsioneerimine",backward_desc:"Liiguta tagasi",forward_desc:"Liiguta edasi",insertlayer_desc:"Sisesta uus kiht"},save:{save_desc:"Salvesta",cancel_desc:"T\u00fchista k\u00f5ik muudatused"},nonbreaking:{nonbreaking_desc:"Sisesta mittekatkestav t\u00fchik"},iespell:{download:"ie\u00d5igekiri tuvastamata. Kas soovite paigaldada n\u00fc\u00fcd?",iespell_desc:"\u00d5igekirja kontroll"},advhr:{advhr_desc:"Horisontaalne joonlaud",delta_height:"",delta_width:""},emotions:{emotions_desc:"Emotsioonid",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Otsi/Asenda",search_desc:"Otsi",delta_width:"",delta_height:""},advimage:{image_desc:"Sisesta/redigeeri pilt",delta_width:"",delta_height:""},advlink:{link_desc:"Sisesta/redigeeri link",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Sisesta muuda atribuute",ins_desc:"Lisandus",del_desc:"Kustutus",acronym_desc:"Akron\u00fc\u00fcm",abbr_desc:"L\u00fchend",cite_desc:"Tsitaat",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Redigeeri CSS stiili",delta_height:"",delta_width:""},paste:{selectall_desc:"Vali k\u00f5ik",paste_word_desc:"Kleebi Wordist",paste_text_desc:"Kleebi tavalise tekstina",plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode."},paste_dlg:{word_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks.",text_linebreaks:"J\u00e4ta reavahetused",text_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks."},table:{cell:"Lahter",col:"Veerg",row:"Rida",del:"Kustuta tabel",copy_row_desc:"Kopeeri tabeli rida",cut_row_desc:"L\u00f5ika tabeli rida",paste_row_after_desc:"Kleebi tabeli rida j\u00e4rgi",paste_row_before_desc:"Kleebi tabeli rida ette",props_desc:"Tabeli omadused",cell_desc:"Tabeli lahtri omadused",row_desc:"Tabeli rea omadused",merge_cells_desc:"\u00dchenda tabeli lahtrid",split_cells_desc:"Eralda \u00fchendatud tabeli lahtrid",delete_col_desc:"Kustuta veerg",col_after_desc:"Sisesta veerg j\u00e4rgi",col_before_desc:"Sisesta veerg ette",delete_row_desc:"Kustuta rida",row_after_desc:"Sisesta rida j\u00e4rgi",row_before_desc:"Sisesta rida ette",desc:"Sisestab uue tabeli",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{unload_msg:"Tehtud muudatused kaovad, kui lahkute siit lehelt.",warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\\n\\nAre you sure you want to restore the saved content?.",restore_content:"Restore auto-saved content."},fullscreen:{desc:"L\u00fclita \u00fcmber t\u00e4isekraani re\u017eiim"},media:{edit:"Redigeeri manustatud meedia",desc:"Sisesta / redigeeri manustatud meedia",delta_height:"",delta_width:""},fullpage:{desc:"Dokumendi omadused",delta_width:"",delta_height:""},template:{desc:"Sisesta eeldefineeritud \u0161ablooni sisu"},visualchars:{desc:"Visuaalsed kontrollt\u00e4hem\u00e4rgid sisse/v\u00e4lja"},spellchecker:{desc:"L\u00fclita \u00fcmber \u00f5igekirja kontroll",menu:"\u00d5igekirja kontrolli seaded",ignore_word:"J\u00e4ta s\u00f5na vahele",ignore_words:"J\u00e4ra k\u00f5ik vahele",langs:"Keeled",wait:"Palun oota...",sug:"Soovitused",no_sug:"Soovitusi pole",no_mpell:"Valesti kirjutamisi ei leitud."},pagebreak:{desc:"Sisesta lehevahetus."},advlist:{types:"Types",def:"Default",lower_alpha:"Lower alpha",lower_greek:"Lower greek",lower_roman:"Lower roman",upper_alpha:"Upper alpha",upper_roman:"Upper roman",circle:"Circle",disc:"Disc",square:"Square"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/fi.js b/js/tiny_mce/langs/fi.js new file mode 100755 index 000000000..d5282dc61 --- /dev/null +++ b/js/tiny_mce/langs/fi.js @@ -0,0 +1 @@ +tinyMCE.addI18n({fi:{common:{more_colors:"Enemm\u00e4n v\u00e4rej\u00e4",invalid_data:"Virhe: Sy\u00f6tit virheellisi\u00e4 arvoja, ne n\u00e4kyv\u00e4t punaisina.",popup_blocked:"Sinulla on k\u00e4yt\u00f6ss\u00e4si ohjelma, joka est\u00e4\u00e4 ponnahdusikkunoiden n\u00e4yt\u00f6n. Sinun t\u00e4ytyy kytke\u00e4 ponnahdusikkunoiden esto pois p\u00e4\u00e4lt\u00e4 voidaksesi hy\u00f6dynt\u00e4\u00e4 t\u00e4ysin t\u00e4t\u00e4 ty\u00f6kalua.",clipboard_no_support:"Selaimesi ei ole tuettu, k\u00e4yt\u00e4 sen sijaan n\u00e4pp\u00e4inoikoteit\u00e4.",clipboard_msg:"Kopioi/Leikkaa/Liit\u00e4 ei ole k\u00e4ytett\u00e4viss\u00e4 Mozilla ja Firefox -selaimilla.\\nHaluatko lis\u00e4tietoa t\u00e4st\u00e4 ongelmasta?",not_set:"-- Ei m\u00e4\u00e4ritetty --",class_name:"Luokka",browse:"Selaa",close:"Sulje",cancel:"Peru",update:"P\u00e4ivit\u00e4",insert:"Lis\u00e4\u00e4",apply:"K\u00e4yt\u00e4",edit_confirm:"Haluatko k\u00e4ytt\u00e4\u00e4 WYSIWYG-tilaa t\u00e4ss\u00e4 tekstikent\u00e4ss\u00e4?"},contextmenu:{full:"Molemmille puolille",right:"Oikealle",center:"Keskelle",left:"Vasemmalle",align:"Tasaus"},insertdatetime:{day_short:"su,ma,ti,ke,to,pe,la,su",day_long:"sunnuntai,maanantai,tiistai,keskiviikko,torstai,perjantai,lauantai,sunnuntai",months_short:"tammi,helmi,maalis,huhti,touko,kes\u00e4,hein\u00e4,elo,syys,loka,marras,joulu",months_long:"tammikuu,helmikuu,maaliskuu,huhtikuu,toukokuu,kes\u00e4kuu,hein\u00e4kuu,elokuu,syyskuu,lokakuu,marraskuu,joulukuu",inserttime_desc:"Lis\u00e4\u00e4 kellonaika",insertdate_desc:"Lis\u00e4\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4",time_fmt:"%H:%M:%S",date_fmt:"%d.%m.%Y"},print:{print_desc:"Tulosta"},preview:{preview_desc:"Esikatselu"},directionality:{rtl_desc:"Suunta oikealta vasemmalle",ltr_desc:"Suunta vasemmalta oikealle"},layer:{content:"Uusi taso...",absolute_desc:"Absoluuttinen sijainti",backward_desc:"Siirr\u00e4 taaksep\u00e4in",forward_desc:"Siirr\u00e4 eteenp\u00e4in",insertlayer_desc:"Lis\u00e4\u00e4 uusi taso"},save:{save_desc:"Tallenna",cancel_desc:"Peru kaikki muutokset"},nonbreaking:{nonbreaking_desc:"Lis\u00e4\u00e4 tyhj\u00e4 merkki (nbsp)"},iespell:{download:"ieSpell-ohjelmaa ei havaittu. Haluatko asentaa sen nyt?",iespell_desc:"Oikeinkirjoituksen tarkistus"},advhr:{advhr_desc:"Vaakatasoviivain",delta_height:"",delta_width:""},emotions:{emotions_desc:"Hymi\u00f6t",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Etsi ja korvaa",search_desc:"Etsi",delta_width:"",delta_height:""},advimage:{image_desc:"Lis\u00e4\u00e4/muokkaa kuvaa",delta_width:"",delta_height:""},advlink:{link_desc:"Lis\u00e4\u00e4/muokkaa linkki\u00e4",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Lis\u00e4\u00e4/muokkaa attribuutteja",ins_desc:"Lis\u00e4ys",del_desc:"Poisto",acronym_desc:"Kirjainlyhenne",abbr_desc:"Lyhenne",cite_desc:"Sitaatti",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Muokkaa CSS-tyylej\u00e4",delta_height:"",delta_width:""},paste:{plaintext_mode:"Liitt\u00e4minen on nyt pelkk\u00e4n\u00e4 tekstin\u00e4. Klikkaa uudelleen vaihtaaksesi takaisin tavalliseen tilaan.",plaintext_mode_sticky:"Liitt\u00e4minen on nyt pelkk\u00e4n\u00e4 tekstin\u00e4. Klikkaa uudelleen vaihtaaksesi takaisin tavalliseen tilaan. Palaat takaisin tavalliseen tilaan liitetty\u00e4si jotakin.",selectall_desc:"Valitse kaikki",paste_word_desc:"Liit\u00e4 Wordist\u00e4",paste_text_desc:"Liit\u00e4 pelkk\u00e4n\u00e4 tekstin\u00e4"},paste_dlg:{word_title:"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan.",text_linebreaks:"S\u00e4ilyt\u00e4 rivinvaihdot",text_title:"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan."},table:{cellprops_delta_width:"80",cell:"Solu",col:"Sarake",row:"Rivi",del:"Poista taulukko",copy_row_desc:"Kopioi taulukon rivi",cut_row_desc:"Leikkaa taulukon rivi",paste_row_after_desc:"Liit\u00e4 taulukon rivi j\u00e4lkeen",paste_row_before_desc:"Liit\u00e4 taulukon rivi ennen",props_desc:"Taulukon asetukset",cell_desc:"Taulukon solun asetukset",row_desc:"Taulukon rivin asetukset",merge_cells_desc:"Yhdist\u00e4 taulukon solut",split_cells_desc:"Jaa yhdistetyt taulukon solut",delete_col_desc:"Poista sarake",col_after_desc:"Lis\u00e4\u00e4 sarake j\u00e4lkeen",col_before_desc:"Lis\u00e4\u00e4 sarake ennen",delete_row_desc:"Poista rivi",row_after_desc:"Lis\u00e4\u00e4 rivi j\u00e4lkeen",row_before_desc:"Lis\u00e4\u00e4 rivi ennen",desc:"Lis\u00e4\u00e4 uusi taulukko",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{warning_message:"Jos palautat automaattisesti tallennetun sis\u00e4ll\u00f6n, menet\u00e4t t\u00e4ll\u00e4 hetkell\u00e4 editorissa olevan sis\u00e4ll\u00f6n.\\n\\nHaluatko varmasti palauttaa tallennetun sis\u00e4ll\u00f6n?",restore_content:"Palauta automaattisesti tallennettu sis\u00e4lt\u00f6.",unload_msg:"Tekem\u00e4si muutokset menetet\u00e4\u00e4n jos poistut t\u00e4lt\u00e4 sivulta."},fullscreen:{desc:"Kokoruututila"},media:{edit:"Muokkaa upotettua mediaa",desc:"Lis\u00e4\u00e4/muokkaa upotettua mediaa",delta_height:"",delta_width:""},fullpage:{desc:"Tiedoston asetukset",delta_width:"",delta_height:""},template:{desc:"Lis\u00e4\u00e4 esim\u00e4\u00e4ritetty\u00e4 sivupohjasis\u00e4lt\u00f6\u00e4"},visualchars:{desc:"N\u00e4yt\u00e4/piilota muotoilumerkit."},spellchecker:{desc:"Oikeinkirjoituksen tarkistus",menu:"Oikeinkirjoituksen asetukset",ignore_word:"Ohita sana",ignore_words:"Ohita kaikki",langs:"Kielet",wait:"Odota ole hyv\u00e4...",sug:"Ehdotukset",no_sug:"Ei ehdotuksia",no_mpell:"Virheit\u00e4 ei l\u00f6ytynyt."},pagebreak:{desc:"Lis\u00e4\u00e4 sivunvaihto."},advlist:{types:"Tyypit",def:"Oletus",lower_alpha:"pienet kirjaimet: a, b, c",lower_greek:"pienet kirjaimet: \u03b1, \u03b2, \u03b3",lower_roman:"pienet kirjaimet: i, ii, iii",upper_alpha:"isot kirjaimet: A, B, C",upper_roman:"isot kirjaimet: I, II, III",circle:"Pallo",disc:"Ympyr\u00e4",square:"Neli\u00f6"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/fr.js b/js/tiny_mce/langs/fr.js new file mode 100755 index 000000000..c968352f6 --- /dev/null +++ b/js/tiny_mce/langs/fr.js @@ -0,0 +1 @@ +tinyMCE.addI18n({fr:{common:{more_colors:"Plus de couleurs",invalid_data:"Erreur : saisie de valeurs incorrectes. Elles sont mises en \u00e9vidence en rouge.",popup_blocked:"D\u00e9sol\u00e9, nous avons d\u00e9tect\u00e9 que votre bloqueur de popup a bloqu\u00e9 une fen\u00eatre dont l\'application a besoin. Vous devez d\u00e9sactiver votre bloqueur de popup pour pouvoir utiliser cet outil.",clipboard_no_support:"Actuellement non support\u00e9 par votre navigateur.\\n Veuillez utiliser les raccourcis clavier \u00e0 la place.",clipboard_msg:"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\\nSouhaitez-vous avoir plus d\'informations sur ce sujet ?",not_set:"-- non d\u00e9fini --",class_name:"Classe",browse:"parcourir",close:"Fermer",cancel:"Annuler",update:"Mettre \u00e0 jour",insert:"Ins\u00e9rer",apply:"Appliquer",edit_confirm:"Souhaitez-vous utiliser le mode WYSIWYG pour cette zone de texte ?"},contextmenu:{full:"Justifi\u00e9",right:"Droite",center:"Centr\u00e9",left:"Gauche",align:"Alignement"},insertdatetime:{day_short:"Dim,Lun,Mar,Mer,Jeu,Ven,Sam,Dim",day_long:"Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche",months_short:"Jan,F\u00e9v,Mar,Avr,Mai,Juin,Juil,Ao\u00fbt,Sep,Oct,Nov,D\u00e9c",months_long:"Janvier,F\u00e9vrier,Mars,Avril,Mai,Juin,Juillet,Ao\u00fbt,Septembre,Octobre,Novembre,D\u00e9cembre",inserttime_desc:"Ins\u00e9rer l\'heure",insertdate_desc:"Ins\u00e9rer la date",time_fmt:"%H:%M:%S",date_fmt:"%d-%m-%Y"},print:{print_desc:"Imprimer"},preview:{preview_desc:"Pr\u00e9visualiser"},directionality:{rtl_desc:"\u00c9criture de droite \u00e0 gauche",ltr_desc:"\u00c9criture de gauche \u00e0 droite"},layer:{content:"Nouvelle couche\u2026",absolute_desc:"Activer le positionnement absolu",backward_desc:"D\u00e9placer vers l\'arri\u00e8re",forward_desc:"D\u00e9placer vers l\'avant",insertlayer_desc:"Ins\u00e9rer une nouvelle couche"},save:{save_desc:"Enregistrer",cancel_desc:"Annuler toutes les modifications"},nonbreaking:{nonbreaking_desc:"Ins\u00e9rer une espace ins\u00e9cable"},iespell:{download:"ieSpell n\'est pas install\u00e9. Souhaitez-vous l\'installer maintenant ?",iespell_desc:"Lancer le v\u00e9rificateur d\'orthographe"},advhr:{delta_height:"Ecart de hauteur",delta_width:"Ecart de largeur",advhr_desc:"Ins\u00e9rer un trait horizontal"},emotions:{emotions_desc:"\u00c9motic\u00f4nes",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Rechercher / remplacer",search_desc:"Rechercher",delta_width:"",delta_height:""},advimage:{image_desc:"Ins\u00e9rer / \u00e9diter une image",delta_width:"",delta_height:""},advlink:{link_desc:"Ins\u00e9rer / \u00e9diter un lien",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Ins\u00e9rer / \u00e9diter les attributs",ins_desc:"Ins\u00e9r\u00e9",del_desc:"Barr\u00e9",acronym_desc:"Acronyme",abbr_desc:"Abr\u00e9viation",cite_desc:"Citation",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"\u00c9diter la feuille de style (CSS)",delta_height:"",delta_width:""},paste:{plaintext_mode:"Le collage est actuellement en mode texte non format\u00e9. Cliquez \u00e0 nouveau pour revenir en mode de collage ordinaire.",plaintext_mode_sticky:"Le collage est actuellement en mode texte non format\u00e9. Cliquez \u00e0 nouveau pour revenir en mode de collage ordinaire. Apr\u00e8s avoir coll\u00e9 quelque chose, vous retournerez en mode de collage ordinaire.",selectall_desc:"Tout s\u00e9lectionner",paste_word_desc:"Coller un texte cr\u00e9\u00e9 sous Word",paste_text_desc:"Coller comme texte brut"},paste_dlg:{word_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre.",text_linebreaks:"Conserver les retours \u00e0 la ligne",text_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre."},table:{cell:"Cellule",col:"Colonne",row:"Ligne",del:"Effacer le tableau",copy_row_desc:"Copier la ligne",cut_row_desc:"Couper la ligne",paste_row_after_desc:"Coller la ligne apr\u00e8s",paste_row_before_desc:"Coller la ligne avant",props_desc:"Propri\u00e9t\u00e9s du tableau",cell_desc:"Propri\u00e9t\u00e9s de la cellule",row_desc:"Propri\u00e9t\u00e9s de la ligne",merge_cells_desc:"Fusionner les cellules",split_cells_desc:"Scinder les cellules fusionn\u00e9es",delete_col_desc:"Effacer la colonne",col_after_desc:"Ins\u00e9rer une colonne apr\u00e8s",col_before_desc:"Ins\u00e9rer une colonne avant",delete_row_desc:"Effacer la ligne",row_after_desc:"Ins\u00e9rer une ligne apr\u00e8s",row_before_desc:"Ins\u00e9rer une ligne avant",desc:"Ins\u00e9rer un nouveau tableau",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{warning_message:"Si vous restaurez le contenu sauv\u00e9, vous perdrez le contenu qui est actuellement dans l\'\u00e9diteur.\\n\\n\u00cates-vous s\u00fbr de vouloir restaurer le contenu sauv\u00e9 ?",restore_content:"Restaurer le contenu auto-sauvegard\u00e9.",unload_msg:"Les modifications apport\u00e9es seront perdus si vous quittez cette page."},fullscreen:{desc:"Passer en mode plein \u00e9cran"},media:{edit:"\u00c9diter un m\u00e9dia incorpor\u00e9",desc:"Ins\u00e9rer / \u00e9diter un m\u00e9dia incorpor\u00e9",delta_height:"",delta_width:""},fullpage:{desc:"Propri\u00e9t\u00e9s du document",delta_width:"",delta_height:""},template:{desc:"Ins\u00e9rer un mod\u00e8le pr\u00e9d\u00e9fini."},visualchars:{desc:"Activer les caract\u00e8res de mise en page."},spellchecker:{desc:"Activer le v\u00e9rificateur d\'orthographe",menu:"Param\u00e8tres du v\u00e9rificateur d\'orthographe",ignore_word:"Ignorer le mot",ignore_words:"Tout ignorer",langs:"Langues",wait:"Veuillez patienter\u2026",sug:"Suggestions",no_sug:"Aucune suggestion",no_mpell:"Aucune erreur trouv\u00e9e."},pagebreak:{desc:"Ins\u00e9rer un saut de page."},advlist:{types:"Types",def:"D\u00e9faut",lower_alpha:"Alpha minuscule",lower_greek:"Grec minuscule",lower_roman:"Romain minuscule",upper_alpha:"Alpha majuscule",upper_roman:"Romain majuscule",circle:"Cercle",disc:"Disque",square:"Carr\u00e9"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/gl.js b/js/tiny_mce/langs/gl.js new file mode 100755 index 000000000..18586e925 --- /dev/null +++ b/js/tiny_mce/langs/gl.js @@ -0,0 +1 @@ +tinyMCE.addI18n({gl:{common:{more_colors:"Mais cores",invalid_data:"Error: Introducidos valores non v\u00e1lidos, est\u00e1n marcados en vermello.",popup_blocked:"O seu bloqueador de vent\u00e1s emerxentes deshabilitou unha vent\u00e1 que precisa pra o funcionamento da aplicaci\u00f3n. Precisa deshabilita-lo bloqueo de `popups` neste sitio pra utilizar \u00f3 m\u00e1ximo esta ferramenta.",clipboard_no_support:"O seu navegador non soporta estas funci\u00f3ns, use os atallos de teclado.",clipboard_msg:"Copiar/Cortar/Pegar non est\u00e1 disponible en Mozilla e Firefox.\\n\u00bfDesexa obter mais informaci\u00f3n sobre de este asunto?",not_set:"-- Ning\u00fan --",class_name:"Clase",browse:"Examinar",close:"Cerrar",cancel:"Cancelar",update:"Actualizar",insert:"Insertar",apply:"Apricar",edit_confirm:"\u00bfDesexa utiliza-lo modo WYSIWYG pra esta caixa de texto?"},contextmenu:{full:"Xustificado",right:"Dereita",center:"Centrado",left:"Esquerda",align:"Ali\u00f1amento"},insertdatetime:{day_short:"Dom,Lun,Mar,M\u00e9r,Xov,Ver,S\u00e1b,Dom",day_long:"Domingo,Luns,Martes,M\u00e9rcores,Xoves,Venres,S\u00e1bado,Domingo",months_short:"Xan,Feb,Mar,Abr,Mai,Xu\u00f1,Xul,Ago,Set,Out,Nov,Dec",months_long:"Xaneito,Febreiro,Marzo,Abril,Maio,Xu\u00f1o,Xullo,Agosto,Setembro,Outubro,Novembro,Decembro",inserttime_desc:"Insertar hora",insertdate_desc:"Insertar data",time_fmt:"%H:%M:%S",date_fmt:"%d-%m-%Y"},print:{print_desc:"Imprimir"},preview:{preview_desc:"Vista previa"},directionality:{rtl_desc:"Direcci\u00f3n dereita a esquerda",ltr_desc:"Direcci\u00f3n esquerda a dereita"},layer:{content:"Nova capa...",absolute_desc:"Posici\u00f3n absoluta",backward_desc:"Recuar",forward_desc:"Avanzar",insertlayer_desc:"Insertar nova capa"},save:{save_desc:"Gardar",cancel_desc:"Cancelar todo-los cambios"},nonbreaking:{nonbreaking_desc:"Insertar espacio non colapsable"},iespell:{download:"Non se detectou \'ieSpell\'. \u00bfDesexa instala-lo agora?",iespell_desc:"Corrector ortogr\u00e1fico"},advhr:{advhr_desc:"Regra horizontal",delta_height:"",delta_width:""},emotions:{emotions_desc:"Emoticones",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Buscar/Reemplazar",search_desc:"Buscar",delta_width:"",delta_height:""},advimage:{image_desc:"Insertar/editar imaxe",delta_width:"",delta_height:""},advlink:{link_desc:"Insertar/editar hiperv\u00ednculo",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Insertar/Editar atributos",ins_desc:"Inserci\u00f3n",del_desc:"Borrado",acronym_desc:"Acr\u00f3nimo",abbr_desc:"Abreviatura",cite_desc:"Cita",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Editar Estilo CSS",delta_height:"",delta_width:""},paste:{selectall_desc:"Seleccionar todo",paste_word_desc:"Pegar desde Word",paste_text_desc:"Pegar como texto simple",plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode."},paste_dlg:{word_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00e1.",text_linebreaks:"Manter salto de li\u00f1as",text_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00e1."},table:{cell:"Celda",col:"Columna",row:"Fila",del:"Eliminar t\u00e1boa",copy_row_desc:"Copiar fila",cut_row_desc:"Cortar fila",paste_row_after_desc:"Pegar filas (desp\u00f3is)",paste_row_before_desc:"Pegar filas (antes)",props_desc:"Propiedades da t\u00e1boa",cell_desc:"Propiedades da celda",row_desc:"Propiedades da fila",merge_cells_desc:"Vincular celdas",split_cells_desc:"Dividir celdas",delete_col_desc:"Suprimir columna",col_after_desc:"Insertar columna (desp\u00f3is)",col_before_desc:"Insertar columna (antes)",delete_row_desc:"Suprimir fila",row_after_desc:"Insertar fila (desp\u00f3is)",row_before_desc:"Insertar fila (antes)",desc:"Inserta unha nova t\u00e1boa",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{unload_msg:"Os cambios realizados perderanse se sae desta p\u00e1xina.",warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\\n\\nAre you sure you want to restore the saved content?.",restore_content:"Restore auto-saved content."},fullscreen:{desc:"Cambiar a modo Pantalla Completa"},media:{edit:"Editar medio embebido",desc:"Insertar/editar medio embebido",delta_height:"",delta_width:""},fullpage:{desc:"Propiedades do documento",delta_width:"",delta_height:""},template:{desc:"Insertar contido de plantilla predefinida"},visualchars:{desc:"Caracteres de control ON/OFF."},spellchecker:{desc:"Conmutar corrector ortogr\u00e1fico",menu:"Configuraci\u00f3n de corrector ortogr\u00e1fico",ignore_word:"Ignorar verba",ignore_words:"Ignorar todo",langs:"Idiomas",wait:"Agarde...",sug:"Suxerencias",no_sug:"Sen suxerencias",no_mpell:"Non se atoparon erros."},pagebreak:{desc:"Insertar fin de p\u00e1xina"},advlist:{types:"Types",def:"Default",lower_alpha:"Lower alpha",lower_greek:"Lower greek",lower_roman:"Lower roman",upper_alpha:"Upper alpha",upper_roman:"Upper roman",circle:"Circle",disc:"Disc",square:"Square"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/he.js b/js/tiny_mce/langs/he.js new file mode 100755 index 000000000..b3d6a0cbe --- /dev/null +++ b/js/tiny_mce/langs/he.js @@ -0,0 +1 @@ +tinyMCE.addI18n({he:{common:{more_colors:"\u05e2\u05d5\u05d3 \u05e6\u05d1\u05e2\u05d9\u05dd",invalid_data:"\u05e9\u05d2\u05d9\u05d0\u05d4: \u05d4\u05d5\u05e7\u05dc\u05d3 \u05de\u05d9\u05d3\u05e2 \u05dc\u05d0 \u05ea\u05e7\u05e0\u05d9. \u05d4\u05de\u05d9\u05d3\u05e2 \u05e1\u05d5\u05de\u05df \u05d1\u05d0\u05d3\u05d5\u05dd.",popup_blocked:"\u05d7\u05d5\u05e1\u05dd \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05de\u05d5\u05e7\u05e4\u05e6\u05d9\u05dd \u05de\u05e0\u05e2 \u05de\u05d7\u05dc\u05d5\u05df \u05d7\u05e9\u05d5\u05d1 \u05de\u05dc\u05d4\u05e4\u05ea\u05d7,\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05db\u05dc\u05d9 \u05d6\u05d4 \u05e2\u05dc\u05d9\u05da \u05dc\u05d1\u05d8\u05dc \u05d0\u05ea \u05d7\u05d5\u05e1\u05dd \u05d4\u05e4\u05e8\u05d9\u05d8\u05d9\u05dd",clipboard_no_support:"\u05db\u05e8\u05d2\u05e2 \u05dc\u05d0 \u05e0\u05ea\u05de\u05da \u05e2\u05dc \u05d9\u05d3\u05d9 \u05d4\u05d3\u05e4\u05d3\u05e4\u05df \u05e9\u05dc\u05da. \u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e7\u05d9\u05e6\u05d5\u05e8\u05d9 \u05d4\u05de\u05e7\u05dc\u05d3\u05ea.",clipboard_msg:"\n \u05d4\u05e2\u05ea\u05e7\u05d4/\u05d2\u05d6\u05d9\u05e8\u05d4 \u05d5\u05d4\u05d3\u05d1\u05e7\u05d4 \u05d0\u05d9\u05e0\u05dd \u05d6\u05de\u05d9\u05e0\u05d9\u05dd \u05d1 Mozilla \u05d5\u05d1-Firefox.\n \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e7\u05d1\u05dc \u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3 \u05e2\u05dc \u05d4\u05e0\u05d5\u05e9\u05d0?\n ",not_set:"-- \u05dc\u05d0 \u05d4\u05d5\u05d2\u05d3\u05e8 --",class_name:"\u05de\u05d7\u05dc\u05e7\u05d4",browse:"\u05e2\u05d9\u05d5\u05df",close:"\u05e1\u05d2\u05d9\u05e8\u05d4",cancel:"\u05d1\u05d9\u05d8\u05d5\u05dc",update:"\u05e2\u05d3\u05db\u05d5\u05df",insert:"\u05d4\u05d5\u05e1\u05e4\u05d4",apply:"\u05d0\u05d9\u05e9\u05d5\u05e8",edit_confirm:"\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e2\u05d5\u05e8\u05da \u05d4\u05de\u05ea\u05e7\u05d3\u05dd?"},contextmenu:{full:"\u05e9\u05e0\u05d9 \u05d4\u05e6\u05d3\u05d3\u05d9\u05dd",right:"\u05d9\u05de\u05d9\u05df",center:"\u05d0\u05de\u05e6\u05e2",left:"\u05e9\u05de\u05d0\u05dc",align:"\u05d9\u05d9\u05e9\u05d5\u05e8"},insertdatetime:{day_short:"\u05d9\u05d5\u05dd \u05d0\',\u05d9\u05d5\u05dd \u05d1\',\u05d9\u05d5\u05dd \u05d2\',\u05d9\u05d5\u05dd \u05d3\',\u05d9\u05d5\u05dd \u05d4\',\u05d9\u05d5\u05dd \u05d5\',\u05e9\u05d1\u05ea,\u05d9\u05d5\u05dd \u05d0\'",day_long:"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df,\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9,\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9,\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9,\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9,\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9,\u05d9\u05d5\u05dd \u05e9\u05d1\u05ea,\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df",months_short:"\u05d9\u05e0\u05d5\u05d0\u05e8,\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8,\u05de\u05e8\u05e5,\u05d0\u05e4\u05e8\u05d9\u05dc,\u05de\u05d0\u05d9,\u05d9\u05d5\u05e0\u05e2,\u05d9\u05d5\u05dc\u05d9,\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8,\u05e1\u05e4\u05d8\u05de\u05d1\u05e8,\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8,\u05e0\u05d5\u05d1\u05de\u05d1\u05e8,\u05d3\u05e6\u05de\u05d1\u05e8",months_long:"\u05d9\u05e0\u05d5\u05d0\u05e8,\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8,\u05de\u05e8\u05e5,\u05d0\u05e4\u05e8\u05d9\u05dc,\u05de\u05d0\u05d9,\u05d9\u05d5\u05e0\u05e2,\u05d9\u05d5\u05dc\u05d9,\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8,\u05e1\u05e4\u05d8\u05de\u05d1\u05e8,\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8,\u05e0\u05d5\u05d1\u05de\u05d1\u05e8,\u05d3\u05e6\u05de\u05d1\u05e8",inserttime_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05d6\u05de\u05df",insertdate_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05ea\u05d0\u05e8\u05d9\u05da",time_fmt:"%H:%M:%S",date_fmt:"%d-%m-%Y"},print:{print_desc:"\u05d4\u05d3\u05e4\u05e1\u05d4"},preview:{preview_desc:"\u05ea\u05e6\u05d5\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4"},directionality:{rtl_desc:"\u05db\u05d9\u05d5\u05d5\u05df \u05d8\u05e7\u05e1\u05d8 \u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc",ltr_desc:"\u05db\u05d9\u05d5\u05d5\u05df \u05d8\u05e7\u05e1\u05d8 \u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df"},layer:{content:"\u05e9\u05db\u05d1\u05d4 \u05d7\u05d3\u05e9\u05d4...",absolute_desc:"\u05d1\u05d7\u05d9\u05e8\u05ea \u05de\u05d9\u05e7\u05d5\u05dd \u05de\u05d5\u05d7\u05dc\u05d8",backward_desc:"\u05d4\u05e2\u05d1\u05e8\u05d4 \u05d0\u05d7\u05d5\u05e8\u05d4",forward_desc:"\u05d4\u05e2\u05d1\u05e8\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4",insertlayer_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05e9\u05db\u05d1\u05d4 \u05d7\u05d3\u05e9\u05d4"},save:{save_desc:"\u05e9\u05de\u05d9\u05e8\u05d4",cancel_desc:"\u05d1\u05d9\u05d8\u05d5\u05dc \u05db\u05dc \u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05dd"},nonbreaking:{nonbreaking_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05e8\u05d5\u05d5\u05d7"},iespell:{download:" \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 ieSpell. \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05ea\u05e7\u05d9\u05df?",iespell_desc:"\u05d1\u05d3\u05d9\u05e7\u05ea \u05d0\u05d9\u05d5\u05ea \u05d1\u05d0\u05e0\u05d2\u05dc\u05d9\u05ea"},advhr:{advhr_desc:"\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9",delta_height:"",delta_width:""},emotions:{emotions_desc:"\u05e1\u05de\u05d9\u05d9\u05dc\u05d9\u05dd",delta_height:"",delta_width:""},searchreplace:{replace_desc:"\u05d4\u05d7\u05dc\u05e4\u05d4",search_desc:"\u05d7\u05d9\u05e4\u05d5\u05e9",delta_width:"",delta_height:""},advimage:{image_desc:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05ea\u05de\u05d5\u05e0\u05d4",delta_width:"",delta_height:""},advlink:{link_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"\u05d4\u05db\u05e0\u05e1/\u05e2\u05e8\u05d5\u05da \u05ea\u05db\u05d5\u05e0\u05d5\u05ea",ins_desc:"\u05d4\u05db\u05e0\u05e1\u05d4",del_desc:"\u05de\u05d7\u05d9\u05e7\u05d4",acronym_desc:"\u05e8\u05d0\u05e9\u05d9 \u05ea\u05d9\u05d1\u05d5\u05ea",abbr_desc:"\u05e7\u05d9\u05e6\u05d5\u05e8",cite_desc:"\u05e6\u05d9\u05d8\u05d5\u05d8",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"\u05e2\u05d3\u05db\u05d5\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea CSS",delta_height:"",delta_width:""},paste:{plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",selectall_desc:"\u05d1\u05d7\u05e8 \u05d4\u05db\u05dc",paste_word_desc:"\u05d4\u05d3\u05d1\u05e7\u05d4 \u05de-WORD",paste_text_desc:"\u05d4\u05d3\u05d1\u05e7\u05d4 \u05db\u05d8\u05e7\u05e1\u05d8 \u05d1\u05dc\u05d1\u05d3"},paste_dlg:{word_title:"\u05d4\u05d3\u05d1\u05d9\u05e7\u05d5 \u05d1\u05d7\u05dc\u05d5\u05df \u05d6\u05d4 \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05de\u05e7\u05e9\u05d9\u05dd CTRL+V.",text_linebreaks:"\u05d4\u05e9\u05d0\u05e8 \u05d0\u05ea \u05e9\u05d5\u05e8\u05d5\u05ea \u05d4\u05e8\u05d5\u05d5\u05d7",text_title:"\u05d4\u05d3\u05d1\u05d9\u05e7\u05d5 \u05d1\u05d7\u05dc\u05d5\u05df \u05d6\u05d4 \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05de\u05e7\u05e9\u05d9\u05dd CTRL+V."},table:{cell:"\u05ea\u05d0",col:"\u05e2\u05de\u05d5\u05d3\u05d4",row:"\u05e9\u05d5\u05e8\u05d4",del:"\u05de\u05d7\u05d9\u05e7\u05ea \u05d8\u05d1\u05dc\u05d4",copy_row_desc:"\u05d4\u05e2\u05ea\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4",cut_row_desc:"\u05d2\u05d6\u05d9\u05e8\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4",paste_row_after_desc:"\u05d4\u05d3\u05d1\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4 \u05d0\u05d7\u05e8\u05d9",paste_row_before_desc:"\u05d4\u05d3\u05d1\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4 \u05dc\u05e4\u05e0\u05d9",props_desc:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05d4\u05d8\u05d1\u05dc\u05d4",cell_desc:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05ea\u05d0 \u05d1\u05d8\u05d1\u05dc\u05d4",row_desc:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4",merge_cells_desc:"\u05d0\u05d9\u05d7\u05d5\u05d3 \u05ea\u05d0\u05d9\u05dd \u05d1\u05d8\u05d1\u05dc\u05d4",split_cells_desc:"\u05e4\u05d9\u05e6\u05d5\u05dc \u05ea\u05d0\u05d9\u05dd \u05d1\u05d8\u05d1\u05dc\u05d4",delete_col_desc:"\u05d4\u05e1\u05e8\u05ea \u05e2\u05de\u05d5\u05d3\u05d4",col_after_desc:"\u05d4\u05db\u05e0\u05e1\u05ea \u05e2\u05de\u05d5\u05d3\u05d4 \u05de\u05e9\u05de\u05d0\u05dc",col_before_desc:"\u05d4\u05db\u05e0\u05e1\u05ea \u05e2\u05de\u05d5\u05d3\u05d4 \u05de\u05d9\u05de\u05d9\u05df",delete_row_desc:"\u05de\u05d7\u05d9\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4",row_after_desc:"\u05d4\u05db\u05e0\u05e1\u05ea \u05e9\u05d5\u05e8\u05d4 \u05de\u05ea\u05d7\u05ea",row_before_desc:"\u05d4\u05db\u05e0\u05e1\u05ea \u05e9\u05d5\u05e8\u05d4 \u05de\u05e2\u05dc",desc:"\u05d4\u05db\u05e0\u05e1\u05ea \u05d0\u05d5 \u05e2\u05e8\u05d9\u05db\u05ea \u05d8\u05d1\u05dc\u05d4",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{warning_message:"\u05d0\u05dd \u05ea\u05e9\u05d7\u05d6\u05e8 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05dc\u05d2\u05e8\u05d9\u05e1\u05d0 \u05d4\u05e9\u05de\u05d5\u05e8\u05d4, \u05ea\u05d0\u05d1\u05d3 \u05d0\u05ea \u05db\u05dc \u05d4\u05ea\u05d5\u05db\u05df \u05e9\u05e0\u05de\u05e6\u05d0 \u05db\u05e2\u05ea \u05d1\u05e2\u05d5\u05e8\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d0\u05ea\u05d4 \u05e8\u05d5\u05e6\u05d4 \u05dc\u05e9\u05d7\u05d6\u05e8 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05dc\u05d2\u05d9\u05e8\u05e1\u05d0 \u05d4\u05e9\u05de\u05d5\u05e8\u05d4?.",restore_content:"\u05e9\u05d7\u05d6\u05d5\u05e8 \u05dc\u05d2\u05d9\u05e8\u05e1\u05d0 \u05e9\u05de\u05d5\u05e8\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea",unload_msg:"\u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05e9\u05d1\u05d9\u05e6\u05e2\u05ea \u05dc\u05d0 \u05d9\u05e9\u05de\u05e8\u05d5 \u05d0\u05dd \u05ea\u05e2\u05d1\u05d5\u05e8 \u05de\u05d3\u05e3 \u05d6\u05d4"},fullscreen:{desc:"\u05de\u05e2\u05d1\u05e8 \u05dc\u05de\u05e1\u05da \u05de\u05dc\u05d0/\u05d7\u05dc\u05e7\u05d9"},media:{edit:"\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05e8\u05d8\u05d5\u05df",desc:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05e8\u05d8\u05d5\u05df",delta_height:"",delta_width:""},fullpage:{desc:"\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05e2\u05de\u05d5\u05d3",delta_width:"",delta_height:""},template:{desc:"Insert predefined template content"},visualchars:{desc:"\u05d4\u05e6\u05d2/\u05d4\u05e1\u05ea\u05e8 \u05ea\u05d5\u05d5\u05d9 \u05d1\u05e7\u05e8\u05d4"},spellchecker:{desc:"\u05d4\u05e4\u05e2\u05dc\u05ea \u05d1\u05d5\u05d3\u05e7 \u05d0\u05d9\u05d5\u05ea",menu:"\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d1\u05d5\u05d3\u05e7 \u05d0\u05d9\u05d5\u05ea",ignore_word:"\u05dc\u05d4\u05ea\u05e2\u05dc\u05dd \u05de\u05d4\u05de\u05d9\u05dc\u05d4",ignore_words:"\u05dc\u05d4\u05ea\u05e2\u05dc\u05dd \u05de\u05d4\u05db\u05dc",langs:"\u05e9\u05e4\u05d5\u05ea",wait:"\u05e0\u05d0 \u05dc\u05d4\u05de\u05ea\u05d9\u05df..",sug:"\u05d4\u05e6\u05e2\u05d5\u05ea",no_sug:"\u05d0\u05d9\u05df \u05d4\u05e6\u05e2\u05d5\u05ea",no_mpell:"\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea \u05d0\u05d9\u05d5\u05ea"},pagebreak:{desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05de\u05e2\u05d1\u05e8 \u05d3\u05e3"},advlist:{types:"\u05e1\u05d5\u05d2\u05d9\u05dd",def:"\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc",lower_alpha:"Lower alpha",lower_greek:"Lower greek",lower_roman:"Lower roman",upper_alpha:"Upper alpha",upper_roman:"Upper roman",circle:"\u05e2\u05d2\u05d5\u05dc",disc:"\u05d3\u05d9\u05e1\u05e7",square:"\u05de\u05e8\u05d5\u05d1\u05e2"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/hu.js b/js/tiny_mce/langs/hu.js new file mode 100755 index 000000000..833a7953f --- /dev/null +++ b/js/tiny_mce/langs/hu.js @@ -0,0 +1 @@ +tinyMCE.addI18n({hu:{common:{"more_colors":"T\u00f6bb sz\u00edn","invalid_data":"Hiba: \u00c9rv\u00e9nytelen adatok, pirossal jel\u00f6lve.","popup_blocked":"A felugr\u00f3 ablakok tilt\u00e1sa miatt nem siker\u00fclt megjelen\u00edteni egy, az alkalmaz\u00e1shoz sz\u00fcks\u00e9ges ablakot. Enged\u00e9lyezze a b\u00f6ng\u00e9sz\u0151j\u00e9ben a felugr\u00f3 ablakokat, hogy minden funkci\u00f3t haszn\u00e1lhasson.","clipboard_no_support":"Jelenleg nem t\u00e1mogatja a b\u00f6ng\u00e9sz\u0151je, haszn\u00e1lja a billenty\u0171kombin\u00e1ci\u00f3kat helyette.","clipboard_msg":"A M\u00e1sol\u00e1s/Kiv\u00e1g\u00e1s/Besz\u00far\u00e1s funkci\u00f3k nem \u00e9rhet\u0151ek el Mozilla \u00e9s Firefox alatt.\\nK\u00edv\u00e1n t\u00f6bbet tudni err\u0151l a t\u00e9m\u00e1r\u00f3l?","not_set":"-- Nincs megadva --","class_name":"Oszt\u00e1ly",browse:"Tall\u00f3z\u00e1s",close:"Bez\u00e1r\u00e1s",cancel:"M\u00e9gsem",update:"Friss\u00edt\u00e9s",insert:"Besz\u00far\u00e1s",apply:"Alkalmaz\u00e1s","edit_confirm":"Haszn\u00e1lni k\u00edv\u00e1nja a sz\u00f6vegszerkeszt\u0151 m\u00f3dot ebben a sz\u00f6vegdobozban?"},contextmenu:{full:"Sorkiz\u00e1r\u00e1s",right:"Jobbra",center:"K\u00f6z\u00e9pre",left:"Balra",align:"Igaz\u00edt\u00e1s"},insertdatetime:{"day_short":"V,H,K,Sze,Cs,P,Szo,V","day_long":"vas\u00e1rnap,h\u00e9tf\u0151,kedd,szerda,cs\u00fct\u00f6rt\u00f6k,p\u00e9ntek,szombat,vas\u00e1rnap","months_short":"jan,feb,m\u00e1r,\u00e1pr,m\u00e1j,j\u00fan,j\u00fal,aug,szept,okt,nov,dec","months_long":"janu\u00e1r,febru\u00e1r,m\u00e1rcius,\u00e1prilis,m\u00e1jus,j\u00fanius,j\u00falius,augusztus,szeptember,okt\u00f3ber,november,december","inserttime_desc":"Id\u0151 besz\u00far\u00e1sa","insertdate_desc":"D\u00e1tum besz\u00far\u00e1sa","time_fmt":"%H:%M:%S","date_fmt":"%Y.%m.%d."},print:{"print_desc":"Nyomtat\u00e1s"},preview:{"preview_desc":"El\u0151n\u00e9zet"},directionality:{"rtl_desc":"Jobbr\u00f3l balra","ltr_desc":"Balr\u00f3l jobbra"},layer:{content:"\u00daj r\u00e9teg...","absolute_desc":"Abszol\u00fat poz\u00edci\u00f3 ki-/bekapcsol\u00e1sa","backward_desc":"Mozgat\u00e1s h\u00e1tra","forward_desc":"Mozgat\u00e1s el\u0151re","insertlayer_desc":"\u00daj r\u00e9teg besz\u00far\u00e1sa"},save:{"save_desc":"Ment\u00e9s","cancel_desc":"\u00d6sszes v\u00e1ltoz\u00e1s visszavon\u00e1sa"},nonbreaking:{"nonbreaking_desc":"Nemsort\u00f6r\u0151 sz\u00f3k\u00f6z besz\u00far\u00e1sa"},iespell:{download:"ieSpell nem tal\u00e1lhat\u00f3. Telep\u00edti most?","iespell_desc":"Helyes\u00edr\u00e1s-ellen\u0151rz\u00e9s futtat\u00e1sa"},advhr:{"advhr_desc":"V\u00edzszintes vonal","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Hangulatjelek","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Keres\u00e9s/Csere","search_desc":"Keres\u00e9s","delta_width":"","delta_height":""},advimage:{"image_desc":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","delta_width":"","delta_height":""},advlink:{"link_desc":"Link besz\u00far\u00e1sa/szerkeszt\u00e9s","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Tulajdons\u00e1gok besz\u00far\u00e1sa/szerkeszt\u00e9se","ins_desc":"Besz\u00fart","del_desc":"T\u00f6r\u00f6lt","acronym_desc":"Bet\u0171sz\u00f3","abbr_desc":"R\u00f6vid\u00edt\u00e9s","cite_desc":"Id\u00e9zet","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"CSS st\u00edlus szerkeszt\u00e9se","delta_height":"","delta_width":""},paste:{"plaintext_mode":"A besz\u00far\u00e1s mostant\u00f3l egyszer\u0171 sz\u00f6veg m\u00f3dban van. Kattintson ide \u00fajra ezen m\u00f3d ki/be kapcsol\u00e1s\u00e1hoz.","plaintext_mode_sticky":"A besz\u00far\u00e1s mostant\u00f3l egyszer\u0171 sz\u00f6veg m\u00f3dban van. Kattintson ide \u00fajra ezen m\u00f3d ki/be kapcsol\u00e1s\u00e1hoz. Miut\u00e1n besz\u00far valamit, visszaker\u00fcl norm\u00e1l m\u00f3dba.","selectall_desc":"Mindent kijel\u00f6l","paste_word_desc":"Besz\u00far\u00e1s Wordb\u0151l","paste_text_desc":"Besz\u00far\u00e1s sz\u00f6vegk\u00e9nt"},"paste_dlg":{"word_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez.","text_linebreaks":"Sort\u00f6r\u00e9sek megtart\u00e1sa","text_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez."},table:{cell:"Cella",col:"Oszlop",row:"Sor",del:"T\u00e1bl\u00e1zat t\u00f6rl\u00e9se","copy_row_desc":"Sor m\u00e1sol\u00e1sa","cut_row_desc":"Sor kiv\u00e1g\u00e1sa","paste_row_after_desc":"Sor bem\u00e1sol\u00e1sa ut\u00e1na","paste_row_before_desc":"Sor bem\u00e1sol\u00e1sa el\u00e9","props_desc":"T\u00e1bl\u00e1zat tulajdons\u00e1gai","cell_desc":"Cella tulajdons\u00e1gai","row_desc":"Sor tulajdons\u00e1gai","merge_cells_desc":"Cell\u00e1k \u00f6sszevon\u00e1sa","split_cells_desc":"Cell\u00e1k feloszt\u00e1sa","delete_col_desc":"Oszlop t\u00f6rl\u00e9se","col_after_desc":"Oszlop besz\u00far\u00e1sa ut\u00e1na","col_before_desc":"Oszlop besz\u00far\u00e1sa el\u00e9","delete_row_desc":"Sor t\u00f6rl\u00e9se","row_after_desc":"Sor besz\u00far\u00e1sa ut\u00e1na","row_before_desc":"Sor besz\u00far\u00e1sa el\u00e9",desc:"T\u00e1bl\u00e1zat besz\u00far\u00e1sa/szerkeszt\u00e9se","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Ha visszat\u00f6lti a mentett be\u00e1ll\u00edt\u00e1sokat, a jelenlegi \u00e1llapot elv\u00e9sz.\\n\\nBiztosan visszat\u00f6lti a mentett \u00e1llapotot?.","restore_content":"Automatikus ment\u00e9s bet\u00f6lt\u00e9se.","unload_msg":"A m\u00f3dos\u00edt\u00e1sok nem lesznek mentve, ha elhagyja az oldalt."},fullscreen:{desc:"Teljesk\u00e9perny\u0151s m\u00f3d ki-/bekapcsol\u00e1sa"},media:{edit:"Be\u00e1gyazott m\u00e9dia szerkeszt\u00e9se",desc:"Be\u00e1gyazott m\u00e9dia besz\u00far\u00e1sa/szerkeszt\u00e9se","delta_height":"","delta_width":""},fullpage:{desc:"Dokumentum tulajdons\u00e1gai","delta_width":"","delta_height":""},template:{desc:"Sablon beilleszt\u00e9se"},visualchars:{desc:"Vizu\u00e1lis vez\u00e9rl\u0151karakterek be/ki."},spellchecker:{desc:"Helyes\u00edr\u00e1s-ellen\u0151rz\u0151 ki-/bekapcsol\u00e1sa",menu:"Helyes\u00edr\u00e1s-ellen\u0151rz\u0151 tulajdons\u00e1gai","ignore_word":"Sz\u00f3 kihagy\u00e1sa","ignore_words":"Mindet kihagy",langs:"Nyelvek",wait:"K\u00e9rem, v\u00e1rjon...",sug:"Aj\u00e1nl\u00e1sok","no_sug":"Nincs aj\u00e1nl\u00e1s","no_mpell":"Nem tal\u00e1ltam helyes\u00edr\u00e1si hib\u00e1t."},pagebreak:{desc:"Oldalt\u00f6r\u00e9s besz\u00far\u00e1sa."},advlist:{types:"T\u00edpusok",def:"Alap\u00e9rtelmezett","lower_alpha":"Kisbet\u0171s abc","lower_greek":"Kisbet\u0171s g\u00f6r\u00f6g","lower_roman":"Lisbet\u0171s r\u00f3mai","upper_alpha":"Nagybet\u0171s ABC","upper_roman":"Nagybet\u0171s r\u00f3mai",circle:"K\u00f6r",disc:"Lemez",square:"N\u00e9gyzet"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/id.js b/js/tiny_mce/langs/id.js new file mode 100755 index 000000000..e3a97dfe0 --- /dev/null +++ b/js/tiny_mce/langs/id.js @@ -0,0 +1 @@ +tinyMCE.addI18n({id:{common:{more_colors:"More colors",invalid_data:"Error: nilai invalid, ditandai dengan dengan warna merah",popup_blocked:"Maaf, popup-blocker anda telah menonaktifkan jendela aplikasi yang menyediakan fungsionalitas. Nonaktifkan popup-blocker untuk sepenuhnya memanfaatkan alat ini.",clipboard_no_support:"Tidak didukung Browser, gunakan shortcut dari keyboard.",clipboard_msg:"Copy/Cut/Paste tidak tersedia pada Mozilla dan Firefox.\\nButuh info selengkapnya?",not_set:"-- Not set --",class_name:"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply",edit_confirm:"Gunakan mode WYSIWYG untuk textarea ini?"},contextmenu:{full:"Penuh",right:"Kanan",center:"Tengah",left:"Kiri",align:"Alignment"},insertdatetime:{day_short:"Min,Sen,Sel,Rab,Kam,Jum,Sab,Min",day_long:"Minggu,Senin,Selasa,Rabu,Kamis,Jumat,Sabtu,Minggu",months_short:"Jan,Feb,Mar,Apr,Mei,Jun,Jul,Ags,Sep,Okt,Nov,Des",months_long:"Januari,Februari,Maren,April,Mei,Juni,Juli,Agustus,September,Oktober,November,Desember",inserttime_desc:"sisipkan waktu",insertdate_desc:"sisipkan tanggal",time_fmt:"%H:%M:%S",date_fmt:"%Y-%m-%d"},print:{print_desc:"Cetak"},preview:{preview_desc:"Preview"},directionality:{rtl_desc:"Arah kanan ke kiri",ltr_desc:"Arah kiri ke kanan"},layer:{content:"Layer baru...",absolute_desc:"Beralih posisi absolut",backward_desc:"Pindah ke belakang",forward_desc:"Pindah ke depan",insertlayer_desc:"sisipkan layer Baru"},save:{save_desc:"Simpan",cancel_desc:"Batalkan semua perubahan"},nonbreaking:{nonbreaking_desc:"sisipkan karakter non-breaking space"},iespell:{download:"ieSpell tidak terdeteksi. Instal sekarang?",iespell_desc:"Jalankan spell checking"},advhr:{advhr_desc:"Horizontal rule",delta_height:"",delta_width:""},emotions:{emotions_desc:"Emotions",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Cari/Ganti",search_desc:"Cari",delta_width:"",delta_height:""},advimage:{image_desc:"sisipkan/Ubah Gambar",delta_width:"",delta_height:""},advlink:{link_desc:"Sisipkan/Ubah link",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Sisip/Ubah Atribut",ins_desc:"Penyisipan",del_desc:"Penghapusan",acronym_desc:"Akronim",abbr_desc:"Singkatan/Kependekan Kata",cite_desc:"Kutipan",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Ubah CSS Style",delta_height:"",delta_width:""},paste:{selectall_desc:"Select All",paste_word_desc:"Paste from Word",paste_text_desc:"Paste as Plain Text",plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode."},paste_dlg:{word_title:"Gunakan CTRL+V pada keyboard untuk paste.",text_linebreaks:"Keep linebreaks",text_title:"Gunakan CTRL+V pada keyboard untuk paste."},table:{cell:"Cell",col:"Column",row:"Row",del:"Hapus Tabel",copy_row_desc:"Copy row tabel",cut_row_desc:"Cut row tabel",paste_row_after_desc:"Paste row tabel sesudah",paste_row_before_desc:"Paste row tabel sebelum",props_desc:"Properti tabel",cell_desc:"Properti cell tabel",row_desc:"Properti row tabel",merge_cells_desc:"Merge cell tabel",split_cells_desc:"Pisahkan cell tabel yang di-merge",delete_col_desc:"Hapus column",col_after_desc:"Sisipkan column setelah",col_before_desc:"Sisipkan column sebelum",delete_row_desc:"Hapus row",row_after_desc:"Sisipkan row sesudah",row_before_desc:"Sisipkan row sebelum",desc:"Sisipkan tabel baru",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{unload_msg:"Perubahan yang dilakukan akan hilang jika Anda pindah dari halaman ini.",warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\\n\\nAre you sure you want to restore the saved content?.",restore_content:"Restore auto-saved content."},fullscreen:{desc:"Toggle fullscreen mode"},media:{edit:"Edit embedded media",desc:"Insert / edit embedded media",delta_height:"",delta_width:""},fullpage:{desc:"Properti Dokumen",delta_width:"",delta_height:""},template:{desc:"Menyisipkan template standar isi"},visualchars:{desc:"Pengendalian visual karakter on/off"},spellchecker:{desc:"Toggle spellchecker",menu:"Pengaturan Spellchecker ",ignore_word:"Abaikan kata",ignore_words:"Abaikan semua",langs:"Bahasa",wait:"Harap tunggu...",sug:"Saran",no_sug:"Tidak ada saran",no_mpell:"Tidak ada misspellings ditemukan."},pagebreak:{desc:"Sisipkan page break."},advlist:{types:"Types",def:"Default",lower_alpha:"Lower alpha",lower_greek:"Lower greek",lower_roman:"Lower roman",upper_alpha:"Upper alpha",upper_roman:"Upper roman",circle:"Circle",disc:"Disc",square:"Square"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/it.js b/js/tiny_mce/langs/it.js new file mode 100755 index 000000000..17c2117f8 --- /dev/null +++ b/js/tiny_mce/langs/it.js @@ -0,0 +1 @@ +tinyMCE.addI18n({it:{common:{more_colors:"Colori aggiuntivi",invalid_data:"Errore: valori inseriti non validi, sono marcati in rosso.",popup_blocked:"Spiacente, ma il blocco popup ha disabilitato una finestra che fornisce funzionalit\u00e0 dell\'applicazione. Si deve disabilitare il blocco popup per questo sito per poter utlizzare appieno questo strumento.",clipboard_no_support:"Attualmente non supportato dal browser in uso, usare le scorciatoie da tastiera.",clipboard_msg:"Copia/Taglia/Incolla non \u00e8 disponibile in Mozilla e Firefox.\\nSi desidera avere maggiori informazioni su questo problema?",not_set:"-- Non impostato --",class_name:"Classe",browse:"Sfoglia",close:"Chiudi",cancel:"Annulla",update:"Aggiorna",insert:"Inserisci",apply:"Applica",edit_confirm:"Usare la modalit\u00e0 WYSIWYG per questa textarea?"},contextmenu:{full:"Giustifica",right:"Allinea a destra",center:"Centra",left:"Allinea a sinistra",align:"Allineamento"},insertdatetime:{day_short:"Dom,Lun,Mar,Mer,Gio,Ven,Sab,Dom",day_long:"Domenica,Luned\u00ec,Marted\u00ec,Mercoled\u00ec,Gioved\u00ec,Venerd\u00ec,Sabato,Domenica",months_short:"Gen,Feb,Mar,Apr,Mag,Giu,Lug,Ago,Set,Ott,Nov,Dic",months_long:"Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre",inserttime_desc:"Inserisci ora",insertdate_desc:"Inserisci data",time_fmt:"%H:%M:%S",date_fmt:"%Y-%m-%d"},print:{print_desc:"Stampa"},preview:{preview_desc:"Anteprima"},directionality:{rtl_desc:"Direzione da destra a sinistra",ltr_desc:"Direzione da sinistra a destra"},layer:{content:"Nuovo layer...",absolute_desc:"Attiva/Disattiva posizionamento assoluto",backward_desc:"Porta in sfondo",forward_desc:"Porta in rilievo",insertlayer_desc:"Inserisci nuovo layer"},save:{save_desc:"Salva",cancel_desc:"Cancella tutte le modifiche"},nonbreaking:{nonbreaking_desc:"Inserisci uno spazio"},iespell:{download:"ieSpell non rilevato. Installarlo ora?",iespell_desc:"Esegui controllo ortografico"},advhr:{advhr_desc:"Riga orizzontale",delta_height:"",delta_width:""},emotions:{emotions_desc:"Faccine",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Trova/Sostituisci",search_desc:"Trova",delta_width:"",delta_height:""},advimage:{image_desc:"Inserisci/modifica immagine",delta_width:"",delta_height:""},advlink:{link_desc:"Inserisci/modifica collegamento",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Inserisci/modifica attributi",ins_desc:"Inserimento",del_desc:"Cancellamento",acronym_desc:"Acronimo",abbr_desc:"Abbreviazione",cite_desc:"Citazione",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Modifica stile CSS",delta_height:"",delta_width:""},paste:{plaintext_mode:"Incolla adesso e in modalit\u00e0 testo. Clicca nuovamente per tornare alla modalit\u00e0 normale.",plaintext_mode_sticky:"Incolla adesso e in modalit\u00e0 testo. Clicca nuovamente per tornare alla modalit\u00e0 normale. Dopo che avrai incollato qualcosa tornerai alla modalit\u00e0 normale",selectall_desc:"Seleziona tutto",paste_word_desc:"Incolla da Word",paste_text_desc:"Incolla come testo semplice"},paste_dlg:{word_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra.",text_linebreaks:"Mantieni interruzioni di riga",text_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra."},table:{cell:"Cella",col:"Colonna",row:"Riga",del:"Elimina tabella",copy_row_desc:"Copia riga",cut_row_desc:"Taglia riga",paste_row_after_desc:"Incolla riga dopo",paste_row_before_desc:"Incolla riga prima",props_desc:"Propriet\u00e0 tabella",cell_desc:"Propriet\u00e0 cella",row_desc:"Propriet\u00e0 riga",merge_cells_desc:"Unisci celle",split_cells_desc:"Separa celle",delete_col_desc:"Elimina colonna",col_after_desc:"Inserisci colonna dopo",col_before_desc:"Inserisci colonna prima",delete_row_desc:"Elimina riga",row_after_desc:"Inserisci riga dopo",row_before_desc:"Inserisci riga prima",desc:"Inserisci una nuova tabella",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{warning_message:"Se ripristini i dati salvati automaticamente perderai i dati attuali dell\'editor\\n\\nSei sicuro di voler ripristinare i dati?.",restore_content:"Ripristina i dati salvati automaticamente",unload_msg:"I cambiamenti effettuati saranno persi se si abbandona la pagina corrente."},fullscreen:{desc:"Attiva/disattiva modalit\u00e0 a tutto schermo"},media:{edit:"Modifica file multimediale",desc:"Inserisci/modifica file multimediale",delta_height:"",delta_width:""},fullpage:{desc:"Propriet\u00e0 Documento",delta_width:"",delta_height:""},template:{desc:"Inserisci contenuto da modello predefinito"},visualchars:{desc:"Attiva/disattiva caratteri di controllo visuale."},spellchecker:{desc:"Attiva/disattiva controllo ortografico",menu:"Impostazioni controllo ortografico",ignore_word:"Ignora parola",ignore_words:"Ignora tutto",langs:"Lingue",wait:"Attendere prego...",sug:"Suggerimenti",no_sug:"Nessun suggerimento",no_mpell:"Nessun errore rilevato."},pagebreak:{desc:"Inserisci intterruzione di pagina."},advlist:{types:"Tipi",def:"Default",lower_alpha:"Minuscolo alfanumerico",lower_greek:"Minuscolo lettera greca",lower_roman:"Minuscolo lettere romane",upper_alpha:"Maiuscolo alfanumerico",upper_roman:"Maiuscolo lettere romane",circle:"Cerchio",disc:"Punto",square:"Quadrato"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/lt.js b/js/tiny_mce/langs/lt.js new file mode 100755 index 000000000..6a28fdad8 --- /dev/null +++ b/js/tiny_mce/langs/lt.js @@ -0,0 +1 @@ +tinyMCE.addI18n({lt:{common:{more_colors:"Daugiau spalv\u0173",invalid_data:"Klaida: Blogai \u012fvestos reik\u0161m\u0117s, kurios pa\u017eym\u0117tos raudonai.",popup_blocked:"Atsipra\u0161ome, ta\u010diau pasteb\u0117jome, kad j\u016bs\u0173 i\u0161kylan\u010di\u0173 lang\u0173 blokavimo programa i\u0161jung\u0117 lang\u0105, kuris teikia aplikacijai funkcionalum\u0105. Tur\u0117tum\u0117te atjungti i\u0161kylan\u010di\u0173 lang\u0173 blokavim\u0105 \u0161iam tinklalapiui, kad i\u0161naudotum\u0117te visas galimybes.",clipboard_no_support:"\u0160i nar\u0161ykl\u0117 nepalaiko \u0161io veikimo, tod\u0117l naudokite klaviat\u016bros spar\u010diuosius klavi\u0161us.",clipboard_msg:"Kopijavimas/i\u0161kirpimas/\u012fd\u0117jimas paspaudus \u0161\u012f mygtuk\u0105 negalimas Mozilla ir Firefox nar\u0161ykl\u0117se.\\nNukopijuoti galima paspaudus: Ctrl + C, i\u0161kirpti: Ctrl + X, \u012fd\u0117ti: Ctrl + V.\\nAr norite daugiau informacijos apie \u0161i\u0105 problem\u0105?",not_set:"-- Nenurodyta --",class_name:"Klas\u0117",browse:"Nar\u0161yti",close:"U\u017everti",cancel:"Atsisakyti",update:"Atnaujinti",insert:"\u012eterpti",apply:"Taikyti",edit_confirm:"Ar norite naudoti tekst\u0173 redaktoriaus re\u017eim\u0105 \u0161iam teksto redagavimo langui?"},contextmenu:{full:"I\u0161 abiej\u0173 pusi\u0173",right:"De\u0161in\u0117je",center:"Centre",left:"Kair\u0117je",align:"Lygiavimas"},insertdatetime:{day_short:"Sekm,Pirm,Antr,Tre\u010d,Ketv,Penk,\u0160e\u0161t,Sekm",day_long:"Sekmadienis,Pirmadienis,Antradienis,Tre\u010diadienis,Ketvirtadienis,Penktadienis,\u0160e\u0161tadienis,Sekmadienis",months_short:"Sau,Vas,Kov,Bal,Geg,Bir,Lie,Rugpj,Rugs,Spa,Lapkr,Gruo",months_long:"Sausis,Vasaris,Kovas,Balandis,Gegu\u017e\u0117,Bir\u017eelis,Liepa,Rugpj\u016btis,Rugs\u0117jis,Spalis,Lapkritis,Gruodis",inserttime_desc:"\u012eterpti laik\u0105",insertdate_desc:"\u012eterpti dat\u0105",time_fmt:"%H:%M:%S",date_fmt:"%Y-%m-%d"},print:{print_desc:"Spausdinti"},preview:{preview_desc:"Per\u017ei\u016bra"},directionality:{rtl_desc:"Kryptis i\u0161 de\u0161in\u0117s \u012f kair\u0119",ltr_desc:"Kryptis i\u0161 kair\u0117s \u012f de\u0161in\u0119"},layer:{content:"Naujas sluoksnis...",absolute_desc:"Perjungti absoliut\u0173 pozicionavim\u0105",backward_desc:"Perkelti atgal",forward_desc:"Perkelti \u012f priek\u012f",insertlayer_desc:"\u012eterpti nauj\u0105 sluoksn\u012f"},save:{save_desc:"I\u0161saugoti",cancel_desc:"Atsisakyti vis\u0173 pakeitim\u0173"},nonbreaking:{nonbreaking_desc:"\u012eterpti jungiamojo tarpo simbol\u012f"},iespell:{download:"ieSpell neaptiktas. Ar norite dabar j\u012f \u012fdiegti?",iespell_desc:"Paleisti ra\u0161ybos tikrintuv\u0119"},advhr:{delta_width:"10",advhr_desc:"Horizontali linija",delta_height:""},emotions:{emotions_desc:"Jaustukai",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Ie\u0161koti/Pakeisti",delta_width:"10",delta_height:"20",search_desc:"Ie\u0161koti"},advimage:{delta_width:"10",image_desc:"\u012eterpti/Redaguoti paveiksl\u0117l\u012f",delta_height:""},advlink:{delta_width:"10",link_desc:"\u012eterpti/Redaguoti nuorod\u0105",delta_height:""},xhtmlxtras:{attribs_delta_width:"10",ins_delta_width:"10",del_delta_width:"10",acronym_delta_width:"10",abbr_delta_width:"10",cite_delta_width:"10",attribs_desc:"\u012eterpti/Redaguoti atributus",ins_desc:"\u012eterpimas",del_desc:"Panaikinimas",acronym_desc:"Akronimas",abbr_desc:"Santrumpa",cite_desc:"Citavimas",attribs_delta_height:"",ins_delta_height:"",del_delta_height:"",acronym_delta_height:"",abbr_delta_height:"",cite_delta_height:""},style:{delta_width:"40",desc:"Redaguoti CSS stili\u0173",delta_height:""},paste:{plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",selectall_desc:"Visk\u0105 pa\u017eym\u0117ti",paste_word_desc:"\u012ed\u0117ti i\u0161 Word",paste_text_desc:"\u012ed\u0117ti kaip paprast\u0105 tekst\u0105"},paste_dlg:{word_title:"Naudokite CTRL+V tekstui \u012fd\u0117ti \u012f \u0161\u012f lang\u0105.",text_linebreaks:"Palikti eilu\u010di\u0173 l\u016b\u017eius",text_title:"Naudokite CTRL+V tekstui \u012fd\u0117ti \u012f \u0161\u012f lang\u0105."},table:{merge_cells_delta_width:"10",table_delta_width:"10",cellprops_delta_width:"10",rowprops_delta_width:"10",cell:"Langelis",col:"Stulpelis",row:"Eilut\u0117",del:"\u0160alinti lentel\u0119",copy_row_desc:"Kopijuoti lentel\u0117s eilut\u0119",cut_row_desc:"I\u0161kirpti lentel\u0117s eilut\u0119",paste_row_after_desc:"\u012ed\u0117ti lentel\u0117s eilut\u0119 po",paste_row_before_desc:"\u012ed\u0117ti lentel\u0117s eilut\u0119 prie\u0161",props_desc:"Lentel\u0117s nustatymai",cell_desc:"Lentel\u0117s langelio nustatymai",row_desc:"Lentel\u0117s eilut\u0117s nustatymai",merge_cells_desc:"Sujungti lentel\u0117s langelius",split_cells_desc:"Skaidyti sulietus lentel\u0117s langelius",delete_col_desc:"\u0160alinti stulpel\u012f",col_after_desc:"\u012eterpti stulpel\u012f po",col_before_desc:"\u012eterpti stulpel\u012f prie\u0161",delete_row_desc:"\u0160alinti eilut\u0119",row_after_desc:"\u012eterpti eilut\u0119 po",row_before_desc:"\u012eterpti eilut\u0119 prie\u0161",desc:"\u012eterpti/Redaguoti lentel\u0119",merge_cells_delta_height:"",table_delta_height:"",cellprops_delta_height:"",rowprops_delta_height:""},autosave:{warning_message:"Jei atstatysite i\u0161saugot\u0105 turin\u012f, prarasite esam\u0105 turin\u012f redaktoriaus lange.\\n\\nAr tikrai norite atstatyti i\u0161saugot\u0105 turin\u012f?",restore_content:"Atstatyti automati\u0161kai i\u0161saugot\u0105 turin\u012f.",unload_msg:"Visi pakeitimai bus prarasti, jei i\u0161eisite i\u0161 \u0161io puslapio."},fullscreen:{desc:"Perjungti viso ekrano re\u017eim\u0105"},media:{delta_width:"10",edit:"Redaguoti integruot\u0105 daugialyp\u0119 terp\u0119",desc:"\u012eterpti/redaguoti integruot\u0105 daugialyp\u0119 terp\u0119",delta_height:""},fullpage:{desc:"Dokumento nustatymai",delta_width:"10",delta_height:""},template:{desc:"\u012eterpti numatyt\u0105 \u0161ablono turin\u012f"},visualchars:{desc:"Vizualiniai valdymo simboliai \u012fjungti/i\u0161jungti."},spellchecker:{desc:"Perjungti ra\u0161ybos tikrintuv\u0119",menu:"Ra\u0161ybos tikrintuv\u0117s nustatymai",ignore_word:"Ignoruoti \u017eod\u012f",ignore_words:"Ignoruoti visk\u0105",langs:"Kalbos",wait:"Pra\u0161ome palaukti...",sug:"Pasi\u016blymai",no_sug:"Pasi\u016blym\u0173 nerasta",no_mpell:"Klaid\u0173 nerasta."},pagebreak:{desc:"\u012eterpti puslapio pabaigos \u017eym\u0119."},advlist:{types:"Tipai",def:"Numatytasis",lower_alpha:"Ma\u017eosiomis raid\u0117mis",lower_greek:"Ma\u017eaisiais graik\u0173",lower_roman:"Ma\u017eaisiais rom\u0117n\u0173",upper_alpha:"Did\u017eiosiomis raid\u0117mis",upper_roman:"Did\u017eiaisiais rom\u0117n\u0173",circle:"Apskritimas",disc:"Diskas",square:"Kvadratas"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/lv.js b/js/tiny_mce/langs/lv.js new file mode 100755 index 000000000..2f6e3a976 --- /dev/null +++ b/js/tiny_mce/langs/lv.js @@ -0,0 +1 @@ +tinyMCE.addI18n({lv:{common:{more_colors:"Vair\u0101k kr\u0101su",invalid_data:"K\u013c\u016bda: Ievad\u012btas neder\u012bgas v\u0113rt\u012bbas. T\u0101s ir atz\u012bm\u0113tas sarkan\u0101 kr\u0101s\u0101.",popup_blocked:"Atvainojiet, bet m\u0113s esam konstat\u0113ju\u0161i, ka J\u016bsu uzleco\u0161o logu blo\u0137\u0113t\u0101js ir atsp\u0113jojis logu, kas nodro\u0161ina programmas funkcionalit\u0101ti. Lai piln\u012bb\u0101 izmantotu \u0161o r\u012bku, Jums ir j\u0101atsl\u0113dz uzleco\u0161o logu blo\u0137\u0113tajs \u0161ai vietnei. ",clipboard_no_support:"\u0160obr\u012bd J\u016bsu p\u0101rl\u016bks neatbalsta \u0161o iesp\u0113ju, t\u0101 viet\u0101 l\u016bdzu izmantotjiet tastat\u016bras sa\u012bsin\u0101jumtausti\u0146us.",clipboard_msg:"Iesp\u0113ja Kop\u0113t/Izgriezt/Iekop\u0113t nav pieejama p\u0101rl\u016bkiem Mozilla and Firefox.\\nVai J\u016bs v\u0113laties uzzin\u0101t vair\u0101k par \u0161o probl\u0113mu?",not_set:"-- Nav nor\u0101d\u012bts --",class_name:"Klase",browse:"P\u0101rl\u016bkot",close:"Aizv\u0113rt",cancel:"Atcelt",update:"Atjaunin\u0101t",insert:"Ievietot",apply:"Apstiprin\u0101t",edit_confirm:"Vai tu v\u0113lies izmantot WYSIWYG \u0161im teksta laukam?"},contextmenu:{full:"Pilns",right:"Pa labi",center:"Centr\u0113ts",left:"Pa kreisi",align:"Novietojums"},insertdatetime:{day_short:"Sv\u0113,Pir,Otr,Tre,Cet,Pie,Ses,Sv\u0113",day_long:"Sv\u0113tdiena,Pirmdiena,Otrdiena,Tre\u0161diena,Ceturtdiena,Piektdiena,Sestdiena,Sv\u0113tdiena",months_short:"Jan,Feb,Mar,Apr,Mai,J\u016bn,J\u016bl,Aug,Sep,Okt,Nov,Dec",months_long:"Janv\u0101ris,Febru\u0101ris,Marts,Apr\u012blis,Maijs,J\u016bnijs,J\u016blijs,Augusts,Seprembris,Oktobris,Novembris,Decembris",inserttime_desc:"Ievietot laiku",insertdate_desc:"Ievietot datumu",time_fmt:"%H:%M:%S",date_fmt:"%Y-%m-%d"},print:{print_desc:"Druk\u0101t"},preview:{preview_desc:"Priek\u0161skat\u012bt"},directionality:{rtl_desc:"Virziens no lab\u0101s uz kreiso",ltr_desc:"Virziens no kreis\u0101s uz labo"},layer:{content:"Jauns sl\u0101nis...",absolute_desc:"Iestat\u012bt/Nov\u0101kt absol\u016bto novietojumu ",backward_desc:"Atpaka\u013c",forward_desc:"Uz priek\u0161u",insertlayer_desc:"Ievietot jaunu sl\u0101ni"},save:{save_desc:"Saglab\u0101t",cancel_desc:"Atcelt visas izmai\u0146as"},nonbreaking:{nonbreaking_desc:"Ievietot tuk\u0161uma simbolu"},iespell:{download:"ieSpell netika atrasts. Vai J\u016bs v\u0113laties to uzst\u0101d\u012bt?",iespell_desc:"Uzs\u0101kt pareizrakst\u012bbas p\u0101rbaudi"},advhr:{advhr_desc:"Horizont\u0101la sv\u012btra",delta_height:"",delta_width:""},emotions:{emotions_desc:"Smaidi\u0146i",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Mekl\u0113t/Aizvietot",search_desc:"Mekl\u0113t",delta_width:"",delta_height:""},advimage:{image_desc:"Ievietot/Redi\u0123\u0113t att\u0113lu",delta_width:"",delta_height:""},advlink:{link_desc:"Ievietot/Redi\u0123\u0113t saiti",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Pielikt/redi\u0123\u0113t \u012bpa\u0161\u012bbas",ins_desc:"Insertion",del_desc:"Deletion",acronym_desc:"Acronym",abbr_desc:"Sa\u012bsin\u0101jums",cite_desc:"Cit\u0101ts",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Edit CSS Style",delta_height:"",delta_width:""},paste:{selectall_desc:"Iez\u012bm\u0113t visu",paste_word_desc:"Iekop\u0113t no Word",paste_text_desc:"Iekop\u0113t ka parasto tekstu",plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode."},paste_dlg:{word_title:"Izmantojiet CTRL+V uz j\u016bsu tastat\u016bras lai iekop\u0113t tekstu log\u0101.",text_linebreaks:"Sagl\u0101b\u0101t l\u012bniju sadal\u012bt\u0101jus",text_title:"Izmantojiet CTRL+V uz j\u016bsu tastat\u016bras lai iekop\u0113t tekstu log\u0101."},table:{cell:"Aile",col:"St\u0101bs",row:"Rinda",del:"Izdz\u0113st tabulu",copy_row_desc:"Kop\u0113t tabulas rindu",cut_row_desc:"Izgriezt tabulas rindu",paste_row_after_desc:"Ielikt tabulas rindu aiz",paste_row_before_desc:"Ielikt tabulas rindu priek\u0161\u0101",props_desc:"Tabulas \u012bpa\u0161\u012bbas",cell_desc:"Tabulas ailes \u012bpa\u0161\u012bbas",row_desc:"Tabulas rindas \u012bpa\u0161\u012bbas",merge_cells_desc:"Apvienot tabulas ailes",split_cells_desc:"Sadal\u012bt apvienotas tabules ailes",delete_col_desc:"Izdz\u0113st stabu",col_after_desc:"Ielikt jaunu stabu aiz",col_before_desc:"Ielikt jaunu stabu priek\u0161\u0101",delete_row_desc:"Izdz\u0113st rindu",row_after_desc:"Ielikt jaunu rindu aiz",row_before_desc:"Ielikt jaunu rindu priek\u0161\u0101",desc:"Ielikt jaunu tabulu",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{unload_msg:"The changes you made will be lost if you navigate away from this page.",warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\\n\\nAre you sure you want to restore the saved content?.",restore_content:"Restore auto-saved content."},fullscreen:{desc:"Toggle fullscreen mode"},media:{edit:"Edit embedded media",desc:"Insert / edit embedded media",delta_height:"",delta_width:""},fullpage:{desc:"Document properties",delta_width:"",delta_height:""},template:{desc:"Insert predefined template content"},visualchars:{desc:"Visual control characters on/off."},spellchecker:{desc:"Toggle spellchecker",menu:"Spellchecker settings",ignore_word:"Ignore word",ignore_words:"Ignore all",langs:"Languages",wait:"Please wait...",sug:"Suggestions",no_sug:"No suggestions",no_mpell:"No misspellings found."},pagebreak:{desc:"Insert page break."},advlist:{types:"Types",def:"Default",lower_alpha:"Lower alpha",lower_greek:"Lower greek",lower_roman:"Lower roman",upper_alpha:"Upper alpha",upper_roman:"Upper roman",circle:"Circle",disc:"Disc",square:"Square"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/nl.js b/js/tiny_mce/langs/nl.js new file mode 100755 index 000000000..50af4b4a7 --- /dev/null +++ b/js/tiny_mce/langs/nl.js @@ -0,0 +1 @@ +tinyMCE.addI18n({nl:{common:{"more_colors":"Meer kleuren","invalid_data":"Fout: Er zijn ongeldige waardes ingevoerd, deze zijn rood gemarkeerd.","popup_blocked":"U zult uw popup-blocker tijdelijk moeten uitschakelen voor deze website om gebruik te kunnen maken van alle functies van deze teksteditor.","clipboard_no_support":"Kopi\u00ebren/knippen/plakken wordt niet ondersteund door uw browser, gebruik hiervoor de sneltoetsen.","clipboard_msg":"Kopi\u00ebren/knippen/plakken is niet beschikbaar in Mozilla en Firefox.\\nWilt u meer informatie over deze beperking?","not_set":"- Standaard -","class_name":"Klasse",browse:"Bladeren",close:"Sluiten",cancel:"Annuleren",update:"Bijwerken",insert:"Invoegen",apply:"Toepassen","edit_confirm":"Weet u zeker dat u tekst in WYSIWYG mode wilt bewerken in dit tekstveld?"},contextmenu:{full:"Uitvullen",right:"Rechts",center:"Centreren",left:"Links",align:"Uitlijning"},insertdatetime:{"day_short":"zo,ma,di,wo,do,vr,za,zo","day_long":"Zondag,Maandag,Dinsdag,Woensdag,Donderdag,Vrijdag,Zaterdag,Zondag","months_short":"Jan,Feb,Mar,Apr,Mei,Jun,Jul,Aug,Sep,Okt,Nov,Dec","months_long":"Januari,Februari,Maart,April,Mei,Juni,Juli,Augustus,September,Oktober,November,December","inserttime_desc":"Tijd invoegen","insertdate_desc":"Datum invoegen","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Afdrukken"},preview:{"preview_desc":"Voorbeeld"},directionality:{"rtl_desc":"Van rechts naar links","ltr_desc":"Van links naar rechts"},layer:{content:"Nieuwe laag...","absolute_desc":"Absoluut positioneren inschakelen","backward_desc":"Vorige laag","forward_desc":"Volgende laag","insertlayer_desc":"Nieuwe laag invoegen"},save:{"save_desc":"Opslaan","cancel_desc":"Alle wijzigingen annuleren"},nonbreaking:{"nonbreaking_desc":"Open ruimte invoegen"},iespell:{download:"ieSpell niet gevonden. Wilt u deze nu installeren?","iespell_desc":"Spellingcontrole"},advhr:{"advhr_desc":"Scheidingslijn","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emoties","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Zoeken/Vervangen","search_desc":"Zoeken","delta_width":"","delta_height":""},advimage:{"image_desc":"Afbeelding invoegen/bewerken","delta_width":"","delta_height":""},advlink:{"link_desc":"Link invoegen/bewerken","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Attributen invoegen/bewerken","ins_desc":"Ingevoegd","del_desc":"Verwijderd","acronym_desc":"Synoniem","abbr_desc":"Afkorting","cite_desc":"Citaat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"CSS Stijl bewerken","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Plakken is nu in plattetekstmoduse. Klik nog een keer om terug te gaan naar normaal plakken.","plaintext_mode_sticky":"Plakken is nu in plattetekstmodus. Klik nog een keer om terug te gaan naar normaal plakken. Nadat u iets plakt, keert u terug naar normaal plakken.","selectall_desc":"Alles selecteren","paste_word_desc":"Vanuit Word plakken","paste_text_desc":"Als platte tekst plakken"},"paste_dlg":{"word_title":"Gebruik Ctrl+V om tekst in het venster te plakken.","text_linebreaks":"Regelafbreking bewaren","text_title":"Gebruik Ctrl+V om tekst in het venster te plakken."},table:{cell:"Cel",col:"Kolom",row:"Rij",del:"Tabel verwijderen","copy_row_desc":"Rij kopi\u00ebren","cut_row_desc":"Rij knippen","paste_row_after_desc":"Rij onder plakken","paste_row_before_desc":"Rij boven plakken","props_desc":"Tabeleigenschappen","cell_desc":"Cel-eigenschappen","row_desc":"Rij-eigenschappen","merge_cells_desc":"Cellen samenvoegen","split_cells_desc":"Cellen splitsen","delete_col_desc":"Kolom verwijderen","col_after_desc":"Kolom rechts invoegen","col_before_desc":"Kolom links invoegen","delete_row_desc":"Rij verwijderen","row_after_desc":"Rij onder invoegen","row_before_desc":"Rij boven invoegen",desc:"Nieuwe tabel invoegen","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Als u de opgeslagen inhoud laadt, verliest u de inhoud die zich momenteel in de editor bevindt.\\n\\nWeet u zeker dat u de opgeslagen inhoud wilt laden?","restore_content":"Automatisch opgeslagen inhoud laden.","unload_msg":"De wijzigingen zullen verloren gaan als u nu deze pagina verlaat."},fullscreen:{desc:"Volledig scherm"},media:{edit:"Media bewerken",desc:"Media invoegen/bewerken","delta_height":"","delta_width":""},fullpage:{desc:"Documenteigenschappen","delta_width":"","delta_height":""},template:{desc:"Voorgedefinieerd sjabloon invoegen"},visualchars:{desc:"Zichtbare symbolen"},spellchecker:{desc:"Spellingcontrole",menu:"Instellingen spellingcontrole","ignore_word":"Woord negeren","ignore_words":"Alles negeren",langs:"Talen",wait:"Een ogenblik geduld\u2026",sug:"Suggesties","no_sug":"Geen suggesties","no_mpell":"Geen spelfouten gevonden."},pagebreak:{desc:"Pagina-einde invoegen"},advlist:{types:"Types",def:"Standaard","lower_alpha":"Alfa (klein)","lower_greek":"Griekse letters (klein)","lower_roman":"Romeinse letters (klein)","upper_alpha":"Alfa (groot)","upper_roman":"Romeinse letters (groot)",circle:"Cirkel",disc:"Schijf",square:"Vierkant"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/no.js b/js/tiny_mce/langs/no.js new file mode 100755 index 000000000..43e63a702 --- /dev/null +++ b/js/tiny_mce/langs/no.js @@ -0,0 +1 @@ +tinyMCE.addI18n({no:{common:{"more_colors":"Flere farger","invalid_data":"Feil: Ugyldig verdi er skrevet inn, disse er merket med r\u00f8dt","popup_blocked":"Beklager, men vi har registrert at din popup-sperrer har blokkert et vindu i nettleseren. Du m\u00e5 oppheve popup-sperren for at nettstedet skal f\u00e5 tilgang til dette verkt\u00f8yet","clipboard_no_support":"For tiden ikke st\u00f8ttet av din nettleser, bruk tastatursnarveier i stedet.","clipboard_msg":"Klipp ut / Kopier /Lim inn fungerer ikke i Mozilla og Firefox. Vil du vite mer om dette?","not_set":"--Ikke satt--","class_name":"Klasse",browse:"Bla gjennom",close:"Lukk",cancel:"Avbryt",update:"Oppdater",insert:"Sett inn",apply:"Bruk","edit_confirm":"Vil du bruke WYSIWYG-editoren for dette tekstfeltet?"},contextmenu:{full:"Full",right:"H\u00f8yre",center:"Midtstilt",left:"Venstre",align:"Justering"},insertdatetime:{"day_short":"S\u00f8n,Man,Tir,Ons,Tor,Fre,L\u00f8r,S\u00f8n","day_long":"s\u00f8ndag,mandag,tirsdag,onsdag,torsdag,fredag,l\u00f8rdag,s\u00f8ndag","months_short":"jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des","months_long":"januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember","inserttime_desc":"Sett inn tid","insertdate_desc":"Sett inn dato","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Skriv ut"},preview:{"preview_desc":"Forh\u00e5ndsvisning"},directionality:{"rtl_desc":"Retning h\u00f8yre mot venstre","ltr_desc":"Retning venstre mot h\u00f8yre"},layer:{content:"Nytt lag ...","absolute_desc":"Sl\u00e5 p\u00e5/av absolutt plassering","backward_desc":"Flytt bakover","forward_desc":"Flytt fremover","insertlayer_desc":"Sett inn nytt lag"},save:{"save_desc":"Lagre","cancel_desc":"Kanseller alle endringer"},nonbreaking:{"nonbreaking_desc":"Sett inn karakter for hardt mellomrom"},iespell:{download:"ieSpell ikke funnet. \u00d8nsker du \u00e5 installere ieSpell?","iespell_desc":"Stavekontroll"},advhr:{"advhr_desc":"Horisontal linje","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Hum\u00f8rfjes","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"S\u00f8k/Erstatt","search_desc":"S\u00f8k","delta_width":"","delta_height":""},advimage:{"image_desc":"Sett inn/editer bilde","delta_width":"","delta_height":""},advlink:{"link_desc":"Sett inn/editer lenke","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Sett inn/Editer egenskaper","ins_desc":"Innsetting","del_desc":"Sletting","acronym_desc":"Akronym","abbr_desc":"Forkortelse","cite_desc":"Sitat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Rediger CSS-stil","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Lim inn er n\u00e5 i vanlig tekst modus. Klikk igjen for \u00e5 bytte til vanlig innlimings modus.","plaintext_mode_sticky":"Lim inn er n\u00e5 i vanlig tekst modus. Klikk igjen for \u00e5 bytte til vanlig innlimings modus. Etter at du limer inn noe vil du g\u00e5 tilbake til ordin\u00e6r innliming.","selectall_desc":"Merk alt","paste_word_desc":"Lim inn fra Word","paste_text_desc":"Lim inn som ren tekst"},"paste_dlg":{"word_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn teksten i dette vinduet.","text_linebreaks":"Behold tekstbryting","text_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn teksten i dette vinduet."},table:{cell:"Celle",col:"Kolonne",row:"Rad",del:"Slett tabell","copy_row_desc":"Kopier rad","cut_row_desc":"Slett rad","paste_row_after_desc":"Lime inn rad etter","paste_row_before_desc":"Lime inn rad foran","props_desc":"Tabell egenskaper","cell_desc":"Celle egenskaper","row_desc":"Rad egenskaper","merge_cells_desc":"Sl\u00e5 sammen celler","split_cells_desc":"Splitte sammensl\u00e5tte celler","delete_col_desc":"Slett kolonne","col_after_desc":"Sett inn kolonne etter","col_before_desc":"Sett inn kolonne forand","delete_row_desc":"Slett rad","row_after_desc":"Sett inn rad etter","row_before_desc":"Sett inn rad foran",desc:"Setter inn ny tabell","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Hvis du gjenoppretter tidligere lagret innhold s\u00e5 vil du miste alt n\u00e5v\u00e6rende innhold i editoren.\\n\\nEr du sikker du vil gjenopprette tidligere lagret innhold?.","restore_content":"Gjenopprette autolagret innhold.","unload_msg":"Utf\u00f8rte endringer g\u00e5r tapt hvis du navigerer vekk fra denne siden!"},fullscreen:{desc:"Sl\u00e5 fullskjermmodus av/p\u00e5"},media:{edit:"Editer innebygget objekt",desc:"Sett inn/editer innebygget objekt","delta_height":"","delta_width":""},fullpage:{desc:"Dokument egenskaper","delta_width":"","delta_height":""},template:{desc:"Sett inn forh\u00e5ndsdefinert malinnhold"},visualchars:{desc:"Visuelle konktrolltegn p\u00e5/av"},spellchecker:{desc:"Stavekontroll p\u00e5/av",menu:"Oppsett stavekontroll","ignore_word":"Ignorer ord","ignore_words":"Ignorer alt",langs:"Spr\u00e5k",wait:"Vennligst vent ...",sug:"Forslag","no_sug":"Ingen forslag","no_mpell":"Ingen stavefeil funnet."},pagebreak:{desc:"Sett inn sideskift"},advlist:{types:"Types",def:"Standard","lower_alpha":"Sm\u00e5 alfanumerisk","lower_greek":"Sm\u00e5 gresk","lower_roman":"Sm\u00e5 roman","upper_alpha":"Store alfanumerisk","upper_roman":"Store roman",circle:"Sirkel",disc:"Plate",square:"Firkant"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/pl.js b/js/tiny_mce/langs/pl.js new file mode 100755 index 000000000..7b3672e19 --- /dev/null +++ b/js/tiny_mce/langs/pl.js @@ -0,0 +1 @@ +tinyMCE.addI18n({pl:{common:{"more_colors":"Wi\u0119cej kolor\u00f3w","invalid_data":"B\u0142\u0105d: Zosta\u0142y wprowadzone b\u0142\u0119dne dane, s\u0105 zaznaczone na czerwono.","popup_blocked":"Zauwa\u017cyli\u015bmy, \u017ce opcja blokowania wyskakuj\u0105cych okienek wy\u0142\u0105czy\u0142a okno, kt\u00f3re dostarcza funkcjonalno\u015b\u0107 aplikacji. Aby w pe\u0142ni wykorzysta\u0107 to narz\u0119dzie musisz wy\u0142\u0105czy\u0107 blokowanie wyskakuj\u0105cych okienek na tej stronie.","clipboard_no_support":"Aktualnie nie jest obs\u0142ugiwany przez Twoj\u0105 przegl\u0105dark\u0119, u\u017cyj skr\u00f3t\u00f3w klawiaturowych w zamian.","clipboard_msg":"Akcje Kopiuj/Wytnij/Wklej nie s\u0105 dost\u0119pne w Mozilli i Firefox.\\nCzy chcesz wi\u0119cej informacji o tym problemie?","not_set":"-- Brak --","class_name":"Klasa",browse:"Przegl\u0105daj",close:"Zamknij",cancel:"Anuluj",update:"Aktualizuj",insert:"Wstaw",apply:"Zastosuj","edit_confirm":"Czy chcesz u\u017cy\u0107 trybu WYSIWYG dla tego pola formularza?"},contextmenu:{full:"Wyjustuj",right:"Do prawej",center:"Do \u015brodka",left:"Do lewej",align:"Wyr\u00f3wnanie"},insertdatetime:{"day_short":"N,Pn,Wt,\u015ar,Cz,Pt,So,N","day_long":"Niedziela, Poniedzia\u0142ek, Wtorek, \u015aroda, Czwartek, Pi\u0105tek, Sobota, Niedziela","months_short":"Sty,Lut,Mar,Kwi,Maj,Cze,Lip,Sie,Wrz,Pa\u017a,Lis,Gru","months_long":"Stycze\u0144, Luty, Marzec, Kwiecie\u0144, Maj, Czerwiec, Lipiec, Sierpie\u0144, Wrzesie\u0144, Pa\u017adziernik, Listopad, Grudzie\u0144","inserttime_desc":"Wstaw czas","insertdate_desc":"Wstaw dat\u0119","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Drukuj"},preview:{"preview_desc":"Podgl\u0105d"},directionality:{"rtl_desc":"Kierunek od prawej do lewej","ltr_desc":"Kierunek od lewej do prawej"},layer:{content:"Nowa warstwa...","absolute_desc":"Prze\u0142\u0105cz pozycjonowanie absolutne","backward_desc":"Przesu\u0144 pod sp\u00f3d","forward_desc":"Przesu\u0144 na wierzch","insertlayer_desc":"Wstaw now\u0105 warstw\u0119"},save:{"save_desc":"Zachowaj","cancel_desc":"Anuluj wszystkie zmiany"},nonbreaking:{"nonbreaking_desc":"Wstaw tward\u0105 spacj\u0119"},iespell:{download:"ieSpell nie wykryte. Czy przeprowadzi\u0107 instalacj\u0119 tego komponentu?","iespell_desc":"Sprawd\u017a pisowni\u0119"},advhr:{"advhr_desc":"Pozioma linia","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emotikony","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Znajd\u017a/zamie\u0144","search_desc":"Znajd\u017a","delta_width":"","delta_height":""},advimage:{"image_desc":"Wstaw/edytuj obraz","delta_width":"","delta_height":""},advlink:{"link_desc":"Wstaw/edytuj link","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Wstaw / Edytuj atrybuty","ins_desc":"Wstawienie","del_desc":"Usuni\u0119cie","acronym_desc":"Akronim","abbr_desc":"Skr\u00f3t","cite_desc":"Cytat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Edytuj Style CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Wklejanie jest teraz dost\u0119pne w trybie tekstowym. Kliknij ponownie, aby prze\u0142\u0105czy\u0107 si\u0119 z powrotem do trybu wklejania sformatowanego tekstu.","plaintext_mode_sticky":"Wklejanie jest teraz dost\u0119pne w trybie tekstowym. Kliknij ponownie, aby prze\u0142\u0105czy\u0107 si\u0119 z powrotem do trybu wklejania sformatowanego tekstu. Po wklejeniu tekstu nast\u0105pi powr\u00f3t do trybu wklejania sformatowanego tekstu.","selectall_desc":"Zaznacz wszystko","paste_word_desc":"Wklej z Worda","paste_text_desc":"Wklej jako zwyk\u0142y tekst"},"paste_dlg":{"word_title":"U\u017cyj CTRL+V na swojej klawiaturze \u017ceby wklei\u0107 tekst do okna.","text_linebreaks":"Zachowaj ko\u0144ce linii.","text_title":"U\u017cyj CTRL+V na swojej klawiaturze \u017ceby wklei\u0107 tekst do okna."},table:{cell:"Kom\u00f3rka",col:"Kolumna",row:"Wiersz",del:"Usu\u0144 tabel\u0119","copy_row_desc":"Kopiuj wiersz...","cut_row_desc":"Wytnij wiersz...","paste_row_after_desc":"Wklej wiersz po...","paste_row_before_desc":"Wklej wiersz przed...","props_desc":"W\u0142a\u015bciwo\u015bci tabeli","cell_desc":"W\u0142a\u015bciwo\u015bci kom\u00f3rki","row_desc":"W\u0142a\u015bciwo\u015bci wiersza","merge_cells_desc":"Po\u0142\u0105cz kom\u00f3rki","split_cells_desc":"Podziel po\u0142\u0105czone kom\u00f3rki","delete_col_desc":"Usu\u0144 kolumn\u0119","col_after_desc":"Wstaw kolumn\u0119 po...","col_before_desc":"Wstaw kolumn\u0119 przed...","delete_row_desc":"Usu\u0144 wiersz","row_after_desc":"Wstaw nowy wiersz po...","row_before_desc":"Wstaw nowy wiersz przed...",desc:"Wstaw now\u0105 tabel\u0119","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Je\u015bli przywr\u00f3cisz zapisan\u0105 tre\u015b\u0107, stracisz ca\u0142\u0105 tre\u015b\u0107, kt\u00f3ra teraz si\u0119 znajduje w edytorze.\\n\\nJeste\u015b pewien, \u017ce chcesz przywr\u00f3ci\u0107 zapisan\u0105 tre\u015b\u0107?","restore_content":"Przywr\u00f3\u0107 tre\u015b\u0107 zapisan\u0105 automatycznie.","unload_msg":"Zmiany, kt\u00f3rych dokona\u0142e\u015b zostan\u0105 utracone je\u015bli opu\u015bcisz t\u0119 stron\u0119."},fullscreen:{desc:"Prze\u0142\u0105cz tryb pe\u0142noekranowy"},media:{"delta_height":"",edit:"Edytuj wbudowane media",desc:"Wstaw/edytuj wbudowane media","delta_width":""},fullpage:{desc:"W\u0142a\u015bciwo\u015bci dokumentu","delta_width":"","delta_height":""},template:{desc:"Wstaw tre\u015b\u0107 szablonu"},visualchars:{desc:"W\u0142\u0105cz/wy\u0142\u0105cz znaki kontrolne."},spellchecker:{desc:"Sprawdzanie pisowni",menu:"Ustawienia sprawdzania pisowni","ignore_word":"Ignoruj s\u0142owo","ignore_words":"Ignoruj wszystkie",langs:"J\u0119zyki",wait:"Prosz\u0119 czeka\u0107...",sug:"Sugestie","no_sug":"Brak sugestii","no_mpell":"Nie znaleziono b\u0142\u0119d\u00f3w."},pagebreak:{desc:"Wstaw znak nowej strony."},advlist:{types:"Rodzaje",def:"Domy\u015blny","lower_alpha":"Ma\u0142e alfabetu","lower_greek":"Ma\u0142e greckie","lower_roman":"Ma\u0142e rzymskie","upper_alpha":"Du\u017ce alfabetu","upper_roman":"Du\u017ce rzymskie",circle:"Ko\u0142o",disc:"Elipsa",square:"Kwadrat"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/pt.js b/js/tiny_mce/langs/pt.js new file mode 100755 index 000000000..a260d0ed1 --- /dev/null +++ b/js/tiny_mce/langs/pt.js @@ -0,0 +1 @@ +tinyMCE.addI18n({pt:{common:{more_colors:"Mais Cores",invalid_data:"Erro: Valores inv\u00e1lidos marcados em vermelho.",popup_blocked:"Detectamos que o seu bloqueador de popups bloqueou uma janela que \u00e9 essencial para a aplica\u00e7\u00e3o. Voc\u00ea precisa desativar o bloqueador de janelas de popups para utilizar esta ferramenta.",clipboard_no_support:"O seu browser n\u00e3o suporta esta fun\u00e7\u00e3o, use os atalhos do teclado.",clipboard_msg:"Copiar/recortar/colar n\u00e3o est\u00e1 dispon\u00edvel no Mozilla e Firefox.\\nDeseja mais informa\u00e7\u00f5es sobre este problema?",not_set:"-- N/A --",class_name:"Classe",browse:"Procurar",close:"Fechar",cancel:"Cancelar",update:"Atualizar",insert:"Inserir",apply:"Aplicar",edit_confirm:"Deseja usar o modo de edi\u00e7\u00e3o avan\u00e7ado neste campo de texto?"},contextmenu:{full:"Justificado",right:"Direita",center:"Centro",left:"Esquerda",align:"Alinhamento"},insertdatetime:{day_short:"Dom,Seg,Ter,Qua,Qui,Sex,Sab,Dom",day_long:"Domingo,Segunda-feira,Ter\u00e7a-feira,Quarta-feira,Quinta-feira,Sexta-feira,S\u00e1bado,Domingo",months_short:"Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez",months_long:"Janeiro,Fevereiro,Mar\u00e7o,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro",inserttime_desc:"Inserir hora",insertdate_desc:"Inserir data",time_fmt:"%H:%M:%S",date_fmt:"%d-%m-%Y"},print:{print_desc:"Imprimir"},preview:{preview_desc:"Pr\u00e9-visualizar"},directionality:{rtl_desc:"Da direita para esquerda",ltr_desc:"Da esquerda para direita"},layer:{content:"Nova camada...",absolute_desc:"Alternar o posicionamento absoluto",backward_desc:"Mover para tr\u00e1s",forward_desc:"Mover para frente",insertlayer_desc:"Inserir nova camada"},save:{save_desc:"Salvar",cancel_desc:"Cancelar todas as altera\u00e7\u00f5es"},nonbreaking:{nonbreaking_desc:"Inserir um espa\u00e7o \"sem quebra\""},iespell:{download:"Plugin de ortografia n\u00e3o-detectado. Deseja instalar agora?",iespell_desc:"Verificar ortografia"},advhr:{advhr_desc:"Separador horizontal",delta_height:"",delta_width:""},emotions:{emotions_desc:"Emoticons",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Localizar/substituir",search_desc:"Localizar",delta_width:"",delta_height:""},advimage:{image_desc:"Inserir/editar imagem",delta_width:"",delta_height:""},advlink:{link_desc:"Inserir/editar hyperlink",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Inserir/Editar atributos",ins_desc:"Inserir",del_desc:"Apagar",acronym_desc:"Acr\u00f4nimo",abbr_desc:"Abrevia\u00e7\u00e3o",cite_desc:"Cita\u00e7\u00e3o",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Editar CSS",delta_height:"",delta_width:""},paste:{plaintext_mode:"Comando colar est\u00e1 em modo texto simples. Clique novamente para voltar para o modo normal.",plaintext_mode_sticky:"Comando colar est\u00e1 em modo texto simples. Clique novamente para voltar para o modo normal. Depois de colar alguma coisa retornar\u00e1 para o modo normal.",selectall_desc:"Selecionar tudo",paste_word_desc:"Colar (copiado do WORD)",paste_text_desc:"Colar como texto simples"},paste_dlg:{word_title:"Use CTRL+V para colar o texto na janela.",text_linebreaks:"Manter quebras de linha",text_title:"Use CTRL+V para colar o texto na janela."},table:{cell:"C\u00e9lula",col:"Coluna",row:"Linha",del:"Apagar tabela",copy_row_desc:"Copiar linha",cut_row_desc:"Recortar linha",paste_row_after_desc:"Colar linha depois",paste_row_before_desc:"Colar linha antes",props_desc:"Propriedades da tabela",cell_desc:"Propriedades das c\u00e9lulas",row_desc:"Propriedades das linhas",merge_cells_desc:"Unir c\u00e9lulas",split_cells_desc:"Dividir c\u00e9lulas",delete_col_desc:"Remover coluna",col_after_desc:"Inserir coluna depois",col_before_desc:"Inserir coluna antes",delete_row_desc:"Apagar linha",row_after_desc:"Inserir linha depois",row_before_desc:"Inserir linha antes",desc:"Inserir nova tabela",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{warning_message:"Se restaurar o conte\u00fado, voc\u00ea ir\u00e1 perder tudo que est\u00e1 atualmente no editor.\\n\\nTem certeza que quer restaurar o conte\u00fado salvo?",restore_content:"Restaura conte\u00fado salvo automaticamente.",unload_msg:"As mudan\u00e7as efetuadas ser\u00e3o perdidas se sair desta p\u00e1gina."},fullscreen:{desc:"Tela Inteira"},media:{edit:"Editar m\u00eddia incorporada",desc:"Inserir/Editar m\u00eddia incorporada",delta_height:"",delta_width:""},fullpage:{desc:"Propriedades do Documento",delta_width:"",delta_height:""},template:{desc:"Inserir template"},visualchars:{desc:"Caracteres de controle visual ligado/desligado"},spellchecker:{desc:"Alternar verifica\u00e7\u00e3o ortogr\u00e1fica",menu:"Configura\u00e7\u00f5es de ortografia",ignore_word:"Ignorar palavra",ignore_words:"Ignorar tudo",langs:"Linguagens",wait:"Aguarde...",sug:"Sugest\u00f5es",no_sug:"Sem sugest\u00f5es",no_mpell:"N\u00e3o foram detectados erros de ortografia."},pagebreak:{desc:"Inserir quebra de p\u00e1gina."},advlist:{types:"Tipos",def:"Padr\u00e3o",lower_alpha:"Alfabeto min\u00fasculo",lower_greek:"Alfabeto grego",lower_roman:"Num. romanos min\u00fasculos",upper_alpha:"Alfabeto mai\u00fasculos",upper_roman:"Num. romanos mai\u00fasculos",circle:"C\u00edrculo",disc:"Disco",square:"Quadrado"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/ro.js b/js/tiny_mce/langs/ro.js new file mode 100755 index 000000000..8f83a149f --- /dev/null +++ b/js/tiny_mce/langs/ro.js @@ -0,0 +1 @@ +tinyMCE.addI18n({ro:{common:{more_colors:"Mai multe culori",invalid_data:"Ave\u0163i erori. Datele gre\u015fite sunt \u00een ro\u015fu.",popup_blocked:"Ne pare r\u0103u, dar un popup-blocker a dezativat o fereastr\u0103 care d\u0103 func\u0163ionalitate aplica\u0163iei.Trebuie s\u0103 dezactiva\u0163i acel popup-blocker pentru acest site pentru a folosi aplica\u0163ia la capacitate maxim\u0103.",clipboard_no_support:"Deocamdat\u0103 nu este suportat\u0103 de browser. V\u0103 rug\u0103m s\u0103 folosi\u0163i combina\u0163ii de taste.",clipboard_msg:"Copiere/T\u0103iere/Lipire nu sunt disponibile \u00een Mozilla \u015fi Firefox.\\nDori\u0163i mai multe informa\u0163ii despre aceast\u0103 problem\u0103?",not_set:"-- Nestat\u0103 --",class_name:"Clas\u0103",browse:"R\u0103sfoie\u015fte",close:"\u00cenchide",cancel:"Anulare",update:"Actualizeaz\u0103",insert:"Insereaz\u0103",apply:"Aplic\u0103",edit_confirm:"Dori\u0163i s\u0103 folosi\u0163i un editor avansat pentru aceast\u0103 zon\u0103 de text?"},contextmenu:{full:"Justify",right:"Dreapta",center:"Centru",left:"St\u00e2nga",align:"Aliniere"},insertdatetime:{day_short:"Dum,Lun,Mar,Mie,Joi,Vin,S\u00e2m,Dum",day_long:"Duminic\u0103,Luni,Mar\u0163i,Miercuri,Joi,Vineri,S\u00e2mb\u0103t\u0103,Duminic\u0103",months_short:"Ian,Feb,Mar,Apr,Mai,Iun,Iul,Aug,Sep,Oct,Noi,Dec",months_long:"Ianuarie,Februarie,Martie,Aprilie,Mai,Iunie,Iulie,August,Septembrie,Octombrie,Noiembrie,Decembrie ",inserttime_desc:"Insereaz\u0103 or\u0103",insertdate_desc:"Insereaz\u0103 dat\u0103",time_fmt:"%H:%M:%S",date_fmt:"%Y-%m-%d"},print:{print_desc:"Imprimare"},preview:{preview_desc:"Previzualizare"},directionality:{rtl_desc:"Direc\u0163ia de la dreapta la st\u00e2nga",ltr_desc:"Direc\u0163ia de la st\u00e2nga la dreapta"},layer:{content:"Strat nou ...",absolute_desc:"Pozi\u0163ionare absolut\u0103",backward_desc:"Mut\u0103 \u00eenapoi",forward_desc:"Mut\u0103 \u00eenainte",insertlayer_desc:"Insereaz\u0103 stat nou"},save:{save_desc:"Salveaz\u0103",cancel_desc:"Anuleaz\u0103 toate schimb\u0103rile"},nonbreaking:{nonbreaking_desc:"Insereaz\u0103 caracterul spa\u0163iu"},iespell:{download:"ieSpell nu a fost detectat. Dori\u0163i s\u0103-l instala\u0163i?",iespell_desc:"Ruleaz\u0103 corectorul de limb\u0103"},advhr:{advhr_desc:"Linie orizontal\u0103",delta_height:"",delta_width:""},emotions:{emotions_desc:"Figurine",delta_height:"",delta_width:""},searchreplace:{replace_desc:"Caut\u0103/\u00cenlocuie\u015fte",search_desc:"Caut\u0103",delta_width:"",delta_height:""},advimage:{image_desc:"Inserare/editare imagine",delta_width:"",delta_height:""},advlink:{link_desc:"Inserare/editare leg\u0103tur\u0103",delta_height:"",delta_width:""},xhtmlxtras:{attribs_desc:"Insereaz\u0103/editeaz\u0103 atribute",ins_desc:"Inserare",del_desc:"\u015etergere",acronym_desc:"Acronim",abbr_desc:"Abreviere",cite_desc:"Citat",attribs_delta_height:"",attribs_delta_width:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_width:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Editare CSS",delta_height:"",delta_width:""},paste:{plaintext_mode:"Lipirea este acum \u00een modul text simplu. Ap\u0103sa\u0163i din nou pentru comutarea la modul normal de lipire.",plaintext_mode_sticky:"Lipirea este acum \u00een modul text simplu. Ap\u0103sa\u0163i aici pentru comutarea la modul normal de lipire. Dup\u0103 ce ve\u0163i lipi ceva ve\u0163i reveni la modul normal de lipire.",selectall_desc:"Selecteaz\u0103 tot",paste_word_desc:"Lipire din Word",paste_text_desc:"Lipire ca text simplu"},paste_dlg:{word_title:"Folosi\u0163i CTRL+V pentru a lipi \u00een aceast\u0103 zon\u0103.",text_linebreaks:"P\u0103streaz\u0103 separatoarele de linii.",text_title:"Folosi\u0163i CTRL+V pentru a lipi \u00een aceast\u0103 zon\u0103."},table:{cell:"Celul\u0103",col:"Coloan\u0103",row:"R\u00e2nd",del:"\u015eterge tabel",copy_row_desc:"Copiaz\u0103 r\u00e2nd",cut_row_desc:"Taie r\u00e2nd",paste_row_after_desc:"Lipe\u015fte r\u00e2nd dup\u0103",paste_row_before_desc:"Lipe\u015fte r\u00e2nd \u00eenainte",props_desc:"Propriet\u0103\u0163i tabel",cell_desc:"Propriet\u0103\u0163i celul\u0103",row_desc:"Propriet\u0103\u0163i r\u00e2nd",merge_cells_desc:"Uni\u0163i celule",split_cells_desc:"Separa\u0163i celule unite",delete_col_desc:"\u015eterge coloan\u0103",col_after_desc:"Inserare coloan\u0103 dup\u0103",col_before_desc:"Inserare coloan\u0103 \u00eenainte",delete_row_desc:"\u015eterge r\u00e2nd",row_after_desc:"Inserare r\u00e2nd dup\u0103",row_before_desc:"Inserare r\u00e2nd \u00eenainte",desc:"Insereaz\u0103 tabel nou",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:"",table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_delta_height:"",rowprops_delta_width:""},autosave:{warning_message:"Daca restaurati continutul salvat vei pierde tot continutul existent din editor.\\n\\nSigur doriti sa restaurati continutul salvat?.",restore_content:"Restaureaz\u0103 con\u0163inutul salvat automat.",unload_msg:"Modific\u0103rile nu vor fi salvate."},fullscreen:{desc:"Mod ecran complet"},media:{edit:"Editeaz\u0103 media",desc:"Insereaz\u0103 / editeaz\u0103 media",delta_height:"",delta_width:""},fullpage:{desc:"Propriet\u0103\u0163i document",delta_width:"",delta_height:""},template:{desc:"Insereaz\u0103 un \u015fablon predefinit"},visualchars:{desc:"Comut\u0103 caracterele vizuale de control"},spellchecker:{desc:"Activare/dezactivare dic\u0163ionar",menu:"Set\u0103ri dic\u0163ionar",ignore_word:"Ignor\u0103 cuv\u00e2nt",ignore_words:"Ignor\u0103 toate",langs:"Limbi",wait:"V\u0103 rog a\u015ftepta\u0163i...",sug:"Sugestii",no_sug:"Nu sunt sugestii.",no_mpell:"Nu sunt gre\u015feli."},pagebreak:{desc:"Insereaz\u0103 un separator de pagin\u0103"},advlist:{types:"Tipuri",def:"Implicit",lower_alpha:"Minuscule alfabetice",lower_greek:"Minuscule grece\u015fti",lower_roman:"Minuscule romane",upper_alpha:"Majuscule alfabetice",upper_roman:"Majuscule romane",circle:"Cerc",disc:"Disc",square:"P\u0103trat"}}}); \ No newline at end of file diff --git a/js/tiny_mce/langs/ru.js b/js/tiny_mce/langs/ru.js new file mode 100755 index 000000000..ca333d7c3 --- /dev/null +++ b/js/tiny_mce/langs/ru.js @@ -0,0 +1 @@ +tinyMCE.addI18n({ru:{common:{"more_colors":"\u0414\u0440\u0443\u0433\u0438\u0435 \u0446\u0432\u0435\u0442\u0430...","invalid_data":"\u041e\u0448\u0438\u0431\u043a\u0430: \u0412\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u043c.","popup_blocked":"\u0411\u043b\u043e\u043a\u0438\u0440\u0430\u0442\u043e\u0440 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u043a\u043e\u043d \u0437\u0430\u043a\u0440\u044b\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e. \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0430\u0439\u0442\u0435.","clipboard_no_support":"\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0412\u0430\u0448\u0438\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438.","clipboard_msg":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0440\u0435\u0437\u043a\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 Firefox.\\r\\n\u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e?","not_set":"- \u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e -","class_name":"\u041a\u043b\u0430\u0441\u0441",browse:"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",close:"\u0417\u0430\u043a\u0440\u044b\u0442\u044c",cancel:"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c",update:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c",insert:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c",apply:"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c","edit_confirm":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c WYSIWYG \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f?"},contextmenu:{full:"\u041f\u043e \u0448\u0438\u0440\u0438\u043d\u0435",right:"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",center:"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",left:"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435"},insertdatetime:{"day_short":"\u0432\u0441,\u043f\u043d,\u0432\u0442,\u0441\u0440,\u0447\u0442,\u043f\u0442,\u0441\u0431,\u0432\u0441","day_long":"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435,\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a,\u0432\u0442\u043e\u0440\u043d\u0438\u043a,\u0441\u0440\u0435\u0434\u0430,\u0447\u0435\u0442\u0432\u0435\u0440\u0433,\u043f\u044f\u0442\u043d\u0438\u0446\u0430,\u0441\u0443\u0431\u0431\u043e\u0442\u0430,\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435","months_short":"\u044f\u043d\u0432,\u0444\u0435\u0432,\u043c\u0430\u0440\u0442,\u0430\u043f\u0440,\u043c\u0430\u0439,\u0438\u044e\u043d\u044c,\u0438\u044e\u043b\u044c,\u0430\u0432\u0433,\u0441\u0435\u043d,\u043e\u043a\u0442,\u043d\u043e\u044f,\u0434\u0435\u043a","months_long":"\u044f\u043d\u0432\u0430\u0440\u044c,\u0444\u0435\u0432\u0440\u0430\u043b\u044c,\u043c\u0430\u0440\u0442,\u0430\u043f\u0440\u0435\u043b\u044c,\u043c\u0430\u0439,\u0438\u044e\u043d\u044c,\u0438\u044e\u043b\u044c,\u0430\u0432\u0433\u0443\u0441\u0442,\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c,\u043e\u043a\u0442\u044f\u0431\u0440\u044c,\u043d\u043e\u044f\u0431\u0440\u044c,\u0434\u0435\u043a\u0430\u0431\u0440\u044c","inserttime_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f","insertdate_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443","time_fmt":"%H:%M:%S","date_fmt":"%d.%m.%Y"},print:{"print_desc":"\u041f\u0435\u0447\u0430\u0442\u044c"},preview:{"preview_desc":"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440"},directionality:{"rtl_desc":"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","ltr_desc":"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e"},layer:{content:"\u041d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439","absolute_desc":"\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","backward_desc":"\u041d\u0430 \u0437\u0430\u0434\u043d\u0438\u0439 \u043f\u043b\u0430\u043d","forward_desc":"\u041d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u043b\u0430\u043d","insertlayer_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u043e\u0439"},save:{"save_desc":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c","cancel_desc":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f"},nonbreaking:{"nonbreaking_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0435\u043b"},iespell:{download:"ieSpell \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c?","iespell_desc":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u044e"},advhr:{"advhr_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c","delta_height":"","delta_width":""},emotions:{"emotions_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0430\u0439\u043b","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c","search_desc":"\u041d\u0430\u0439\u0442\u0438","delta_width":"","delta_height":""},advimage:{"delta_width":"200","image_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","delta_height":""},advlink:{"delta_width":"200","link_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","delta_height":""},xhtmlxtras:{"attribs_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442","ins_desc":"\u0417\u0430\u043c\u0435\u043d\u0430","del_desc":"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435","acronym_desc":"\u0410\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0446\u0438\u044f","abbr_desc":"\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435","cite_desc":"\u0426\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c CSS \u0441\u0442\u0438\u043b\u044c","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435","paste_word_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 Word","paste_text_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442"},"paste_dlg":{"word_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e.","text_linebreaks":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a","text_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e."},table:{"cellprops_delta_width":"30",cell:"\u042f\u0447\u0435\u0439\u043a\u0430",col:"\u0421\u0442\u043e\u043b\u0431\u0435\u0446",row:"\u0421\u0442\u0440\u043e\u043a\u0430",del:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443","copy_row_desc":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","cut_row_desc":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","paste_row_after_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443","paste_row_before_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","props_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b","cell_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438","row_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438","merge_cells_desc":"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438","split_cells_desc":"\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443","delete_col_desc":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446","col_after_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043f\u0440\u0430\u0432\u0430","col_before_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043b\u0435\u0432\u0430","delete_row_desc":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","row_after_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443","row_before_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443",desc:"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u0412\u0441\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044f\u043d\u044b.\\n\\n\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f?","restore_content":"\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435","unload_msg":"\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044f\u043d\u044b, \u0435\u0441\u043b\u0438 \u0412\u044b \u0443\u0439\u0434\u0435\u0442\u0435 \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b."},fullscreen:{desc:"\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c"},media:{edit:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0438\u043f\u0430",desc:"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043b\u0438\u043f","delta_height":"","delta_width":""},fullpage:{desc:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430","delta_width":"","delta_height":""},template:{desc:"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d"},visualchars:{desc:"\u0412\u0441\u0435 \u0437\u043d\u0430\u043a\u0438"},spellchecker:{desc:"\u041f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",menu:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f","ignore_word":"\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c","ignore_words":"\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435",langs:"\u042f\u0437\u044b\u043a\u0438",wait:"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435...",sug:"\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b","no_sug":"\u041d\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432","no_mpell":"\u041e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e."},pagebreak:{desc:"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b"},advlist:{types:"\u0421\u0438\u043c\u0432\u043e\u043b\u044b",def:"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435","lower_alpha":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b","lower_greek":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b","lower_roman":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b","upper_alpha":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b","upper_roman":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b",circle:"\u041a\u0440\u0443\u0433\u0438",disc:"\u041e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438",square:"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b"}}}); \ No newline at end of file diff --git a/js/tiny_mce/license.txt b/js/tiny_mce/license.txt new file mode 100644 index 000000000..1837b0acb --- /dev/null +++ b/js/tiny_mce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/js/tiny_mce/plugins/advimage/css/advimage.css b/js/tiny_mce/plugins/advimage/css/advimage.css new file mode 100644 index 000000000..228530f9e --- /dev/null +++ b/js/tiny_mce/plugins/advimage/css/advimage.css @@ -0,0 +1,13 @@ +#src_list, #over_list, #out_list {width:280px;} +.mceActionPanel {margin-top:7px;} +.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;} +.checkbox {border:0;} +.panel_wrapper div.current {height:305px;} +#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;} +#align, #classlist {width:150px;} +#width, #height {vertical-align:middle; width:50px; text-align:center;} +#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;} +#class_list {width:180px;} +input {width: 280px;} +#constrain, #onmousemovecheck {width:auto;} +#id, #dir, #lang, #usemap, #longdesc {width:200px;} diff --git a/js/tiny_mce/plugins/advimage/editor_plugin.js b/js/tiny_mce/plugins/advimage/editor_plugin.js new file mode 100644 index 000000000..5e9bfd296 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/editor_plugin_src.js b/js/tiny_mce/plugins/advimage/editor_plugin_src.js new file mode 100644 index 000000000..cf3348565 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/editor_plugin_src.js @@ -0,0 +1,50 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.AdvancedImagePlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceAdvImage', function() { + // Internal image object like a flash placeholder + if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) + return; + + ed.windowManager.open({ + file : url + '/image.htm', + width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)), + height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('image', { + title : 'advimage.image_desc', + cmd : 'mceAdvImage' + }); + }, + + getInfo : function() { + return { + longname : 'Advanced image', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/advimage', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/image.htm b/js/tiny_mce/plugins/advimage/image.htm new file mode 100644 index 000000000..ed16b3d4a --- /dev/null +++ b/js/tiny_mce/plugins/advimage/image.htm @@ -0,0 +1,235 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advimage_dlg.dialog_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/validate.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/image.js"></script> + <link href="css/advimage.css" rel="stylesheet" type="text/css" /> +</head> +<body id="advimage" style="display: none" role="application" aria-labelledby="app_title"> + <span id="app_title" style="display:none">{#advimage_dlg.dialog_title}</span> + <form onsubmit="ImageDialog.insert();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advimage_dlg.tab_general}</a></span></li> + <li id="appearance_tab" aria-controls="appearance_panel"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#advimage_dlg.tab_appearance}</a></span></li> + <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advimage_dlg.tab_advanced}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#advimage_dlg.general}</legend> + + <table role="presentation" class="properties"> + <tr> + <td class="column1"><label id="srclabel" for="src">{#advimage_dlg.src}</label></td> + <td colspan="2"><table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input name="src" type="text" id="src" value="" class="mceFocus" onchange="ImageDialog.showPreviewImage(this.value);" aria-required="true" /></td> + <td id="srcbrowsercontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + <tr> + <td><label for="src_list">{#advimage_dlg.image_list}</label></td> + <td><select id="src_list" name="src_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;document.getElementById('title').value=this.options[this.selectedIndex].text;ImageDialog.showPreviewImage(this.options[this.selectedIndex].value);"><option value=""></option></select></td> + </tr> + <tr> + <td class="column1"><label id="altlabel" for="alt">{#advimage_dlg.alt}</label></td> + <td colspan="2"><input id="alt" name="alt" type="text" value="" /></td> + </tr> + <tr> + <td class="column1"><label id="titlelabel" for="title">{#advimage_dlg.title}</label></td> + <td colspan="2"><input id="title" name="title" type="text" value="" /></td> + </tr> + </table> + </fieldset> + + <fieldset> + <legend>{#advimage_dlg.preview}</legend> + <div id="prev"></div> + </fieldset> + </div> + + <div id="appearance_panel" class="panel"> + <fieldset> + <legend>{#advimage_dlg.tab_appearance}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td class="column1"><label id="alignlabel" for="align">{#advimage_dlg.align}</label></td> + <td><select id="align" name="align" onchange="ImageDialog.updateStyle('align');ImageDialog.changeAppearance();"> + <option value="">{#not_set}</option> + <option value="baseline">{#advimage_dlg.align_baseline}</option> + <option value="top">{#advimage_dlg.align_top}</option> + <option value="middle">{#advimage_dlg.align_middle}</option> + <option value="bottom">{#advimage_dlg.align_bottom}</option> + <option value="text-top">{#advimage_dlg.align_texttop}</option> + <option value="text-bottom">{#advimage_dlg.align_textbottom}</option> + <option value="left">{#advimage_dlg.align_left}</option> + <option value="right">{#advimage_dlg.align_right}</option> + </select> + </td> + <td rowspan="6" valign="top"> + <div class="alignPreview"> + <img id="alignSampleImg" src="img/sample.gif" alt="{#advimage_dlg.example_img}" /> + Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam + nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum + edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam + erat volutpat. + </div> + </td> + </tr> + + <tr role="group" aria-labelledby="widthlabel"> + <td class="column1"><label id="widthlabel" for="width">{#advimage_dlg.dimensions}</label></td> + <td class="nowrap"> + <span style="display:none" id="width_voiceLabel">{#advimage_dlg.width}</span> + <input name="width" type="text" id="width" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeHeight();" aria-labelledby="width_voiceLabel" /> x + <span style="display:none" id="height_voiceLabel">{#advimage_dlg.height}</span> + <input name="height" type="text" id="height" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeWidth();" aria-labelledby="height_voiceLabel" /> px + </td> + </tr> + + <tr> + <td>&nbsp;</td> + <td><table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td> + <td><label id="constrainlabel" for="constrain">{#advimage_dlg.constrain_proportions}</label></td> + </tr> + </table></td> + </tr> + + <tr> + <td class="column1"><label id="vspacelabel" for="vspace">{#advimage_dlg.vspace}</label></td> + <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" /> + </td> + </tr> + + <tr> + <td class="column1"><label id="hspacelabel" for="hspace">{#advimage_dlg.hspace}</label></td> + <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" /></td> + </tr> + + <tr> + <td class="column1"><label id="borderlabel" for="border">{#advimage_dlg.border}</label></td> + <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" /></td> + </tr> + + <tr> + <td><label for="class_list">{#class_name}</label></td> + <td colspan="2"><select id="class_list" name="class_list" class="mceEditableSelect"><option value=""></option></select></td> + </tr> + + <tr> + <td class="column1"><label id="stylelabel" for="style">{#advimage_dlg.style}</label></td> + <td colspan="2"><input id="style" name="style" type="text" value="" onchange="ImageDialog.changeAppearance();" /></td> + </tr> + + <!-- <tr> + <td class="column1"><label id="classeslabel" for="classes">{#advimage_dlg.classes}</label></td> + <td colspan="2"><input id="classes" name="classes" type="text" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> + </tr> --> + </table> + </fieldset> + </div> + + <div id="advanced_panel" class="panel"> + <fieldset> + <legend>{#advimage_dlg.swap_image}</legend> + + <input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="ImageDialog.setSwapImage(this.checked);" aria-controls="onmouseoversrc onmouseoutsrc" /> + <label id="onmousemovechecklabel" for="onmousemovecheck">{#advimage_dlg.alt_image}</label> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0" width="100%"> + <tr> + <td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{#advimage_dlg.mouseover}</label></td> + <td><table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="onmouseoversrc" name="onmouseoversrc" type="text" value="" /></td> + <td id="onmouseoversrccontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + <tr> + <td><label for="over_list">{#advimage_dlg.image_list}</label></td> + <td><select id="over_list" name="over_list" onchange="document.getElementById('onmouseoversrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td> + </tr> + <tr> + <td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{#advimage_dlg.mouseout}</label></td> + <td class="column2"><table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="onmouseoutsrc" name="onmouseoutsrc" type="text" value="" /></td> + <td id="onmouseoutsrccontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + <tr> + <td><label for="out_list">{#advimage_dlg.image_list}</label></td> + <td><select id="out_list" name="out_list" onchange="document.getElementById('onmouseoutsrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td> + </tr> + </table> + </fieldset> + + <fieldset> + <legend>{#advimage_dlg.misc}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td class="column1"><label id="idlabel" for="id">{#advimage_dlg.id}</label></td> + <td><input id="id" name="id" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label id="dirlabel" for="dir">{#advimage_dlg.langdir}</label></td> + <td> + <select id="dir" name="dir" onchange="ImageDialog.changeAppearance();"> + <option value="">{#not_set}</option> + <option value="ltr">{#advimage_dlg.ltr}</option> + <option value="rtl">{#advimage_dlg.rtl}</option> + </select> + </td> + </tr> + + <tr> + <td class="column1"><label id="langlabel" for="lang">{#advimage_dlg.langcode}</label></td> + <td> + <input id="lang" name="lang" type="text" value="" /> + </td> + </tr> + + <tr> + <td class="column1"><label id="usemaplabel" for="usemap">{#advimage_dlg.map}</label></td> + <td> + <input id="usemap" name="usemap" type="text" value="" /> + </td> + </tr> + + <tr> + <td class="column1"><label id="longdesclabel" for="longdesc">{#advimage_dlg.long_desc}</label></td> + <td><table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="longdesc" name="longdesc" type="text" value="" /></td> + <td id="longdesccontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + </table> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/advimage/img/sample.gif b/js/tiny_mce/plugins/advimage/img/sample.gif new file mode 100644 index 0000000000000000000000000000000000000000..53bf6890b507741c10910c9e2217ad8247b98e8d GIT binary patch literal 1624 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 WE}n@{k&&Vq!n33@nsG^i002Ao7W&ix literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/advimage/js/image.js b/js/tiny_mce/plugins/advimage/js/image.js new file mode 100644 index 000000000..d75f7a7e0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/js/image.js @@ -0,0 +1,445 @@ +var ImageDialog = { + preInit : function() { + var url; + + tinyMCEPopup.requireLangPack(); + + if (url = tinyMCEPopup.getParam("external_image_list_url")) + document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); + }, + + init : function(ed) { + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(); + + tinyMCEPopup.resizeToInnerSize(); + this.fillClassList('class_list'); + this.fillFileList('src_list', 'tinyMCEImageList'); + this.fillFileList('over_list', 'tinyMCEImageList'); + this.fillFileList('out_list', 'tinyMCEImageList'); + TinyMCE_EditableSelects.init(); + + if (n.nodeName == 'IMG') { + nl.src.value = dom.getAttrib(n, 'src'); + nl.width.value = dom.getAttrib(n, 'width'); + nl.height.value = dom.getAttrib(n, 'height'); + nl.alt.value = dom.getAttrib(n, 'alt'); + nl.title.value = dom.getAttrib(n, 'title'); + nl.vspace.value = this.getAttrib(n, 'vspace'); + nl.hspace.value = this.getAttrib(n, 'hspace'); + nl.border.value = this.getAttrib(n, 'border'); + selectByValue(f, 'align', this.getAttrib(n, 'align')); + selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true); + nl.style.value = dom.getAttrib(n, 'style'); + nl.id.value = dom.getAttrib(n, 'id'); + nl.dir.value = dom.getAttrib(n, 'dir'); + nl.lang.value = dom.getAttrib(n, 'lang'); + nl.usemap.value = dom.getAttrib(n, 'usemap'); + nl.longdesc.value = dom.getAttrib(n, 'longdesc'); + nl.insert.value = ed.getLang('update'); + + if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover'))) + nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); + + if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout'))) + nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); + + if (ed.settings.inline_styles) { + // Move attribs to styles + if (dom.getAttrib(n, 'align')) + this.updateStyle('align'); + + if (dom.getAttrib(n, 'hspace')) + this.updateStyle('hspace'); + + if (dom.getAttrib(n, 'border')) + this.updateStyle('border'); + + if (dom.getAttrib(n, 'vspace')) + this.updateStyle('vspace'); + } + } + + // Setup browse button + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '260px'; + + // Setup browse button + document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image'); + if (isVisible('overbrowser')) + document.getElementById('onmouseoversrc').style.width = '260px'; + + // Setup browse button + document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image'); + if (isVisible('outbrowser')) + document.getElementById('onmouseoutsrc').style.width = '260px'; + + // If option enabled default contrain proportions to checked + if (ed.getParam("advimage_constrain_proportions", true)) + f.constrain.checked = true; + + // Check swap image if valid data + if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value) + this.setSwapImage(true); + else + this.setSwapImage(false); + + this.changeAppearance(); + this.showPreviewImage(nl.src.value, 1); + }, + + insert : function(file, title) { + var ed = tinyMCEPopup.editor, t = this, f = document.forms[0]; + + if (f.src.value === '') { + if (ed.selection.getNode().nodeName == 'IMG') { + ed.dom.remove(ed.selection.getNode()); + ed.execCommand('mceRepaint'); + } + + tinyMCEPopup.close(); + return; + } + + if (tinyMCEPopup.getParam("accessibility_warnings", 1)) { + if (!f.alt.value) { + tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) { + if (s) + t.insertAndClose(); + }); + + return; + } + } + + t.insertAndClose(); + }, + + insertAndClose : function() { + var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el; + + tinyMCEPopup.restoreSelection(); + + // Fixes crash in Safari + if (tinymce.isWebKit) + ed.getWin().focus(); + + if (!ed.settings.inline_styles) { + args = { + vspace : nl.vspace.value, + hspace : nl.hspace.value, + border : nl.border.value, + align : getSelectValue(f, 'align') + }; + } else { + // Remove deprecated values + args = { + vspace : '', + hspace : '', + border : '', + align : '' + }; + } + + tinymce.extend(args, { + src : nl.src.value.replace(/ /g, '%20'), + width : nl.width.value, + height : nl.height.value, + alt : nl.alt.value, + title : nl.title.value, + 'class' : getSelectValue(f, 'class_list'), + style : nl.style.value, + id : nl.id.value, + dir : nl.dir.value, + lang : nl.lang.value, + usemap : nl.usemap.value, + longdesc : nl.longdesc.value + }); + + args.onmouseover = args.onmouseout = ''; + + if (f.onmousemovecheck.checked) { + if (nl.onmouseoversrc.value) + args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';"; + + if (nl.onmouseoutsrc.value) + args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';"; + } + + el = ed.selection.getNode(); + + if (el && el.nodeName == 'IMG') { + ed.dom.setAttribs(el, args); + } else { + ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1}); + ed.dom.setAttribs('__mce_tmp', args); + ed.dom.setAttrib('__mce_tmp', 'id', ''); + ed.undoManager.add(); + } + + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); + tinyMCEPopup.close(); + }, + + getAttrib : function(e, at) { + var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; + + if (ed.settings.inline_styles) { + switch (at) { + case 'align': + if (v = dom.getStyle(e, 'float')) + return v; + + if (v = dom.getStyle(e, 'vertical-align')) + return v; + + break; + + case 'hspace': + v = dom.getStyle(e, 'margin-left') + v2 = dom.getStyle(e, 'margin-right'); + + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'vspace': + v = dom.getStyle(e, 'margin-top') + v2 = dom.getStyle(e, 'margin-bottom'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'border': + v = 0; + + tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { + sv = dom.getStyle(e, 'border-' + sv + '-width'); + + // False or not the same as prev + if (!sv || (sv != v && v !== 0)) { + v = 0; + return false; + } + + if (sv) + v = sv; + }); + + if (v) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + } + } + + if (v = dom.getAttrib(e, at)) + return v; + + return ''; + }, + + setSwapImage : function(st) { + var f = document.forms[0]; + + f.onmousemovecheck.checked = st; + setBrowserDisabled('overbrowser', !st); + setBrowserDisabled('outbrowser', !st); + + if (f.over_list) + f.over_list.disabled = !st; + + if (f.out_list) + f.out_list.disabled = !st; + + f.onmouseoversrc.disabled = !st; + f.onmouseoutsrc.disabled = !st; + }, + + fillClassList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { + cl = []; + + tinymce.each(v.split(';'), function(v) { + var p = v.split('='); + + cl.push({'title' : p[0], 'class' : p[1]}); + }); + } else + cl = tinyMCEPopup.editor.dom.getClasses(); + + if (cl.length > 0) { + lst.options.length = 0; + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + + tinymce.each(cl, function(o) { + lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + lst.options.length = 0; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.elements.width.value = f.elements.height.value = ''; + }, + + updateImageData : function(img, st) { + var f = document.forms[0]; + + if (!st) { + f.elements.width.value = img.width; + f.elements.height.value = img.height; + } + + this.preloadImg = img; + }, + + changeAppearance : function() { + var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg'); + + if (img) { + if (ed.getParam('inline_styles')) { + ed.dom.setAttrib(img, 'style', f.style.value); + } else { + img.align = f.align.value; + img.border = f.border.value; + img.hspace = f.hspace.value; + img.vspace = f.vspace.value; + } + } + }, + + changeHeight : function() { + var f = document.forms[0], tp, t = this; + + if (!f.constrain.checked || !t.preloadImg) { + return; + } + + if (f.width.value == "" || f.height.value == "") + return; + + tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height; + f.height.value = tp.toFixed(0); + }, + + changeWidth : function() { + var f = document.forms[0], tp, t = this; + + if (!f.constrain.checked || !t.preloadImg) { + return; + } + + if (f.width.value == "" || f.height.value == "") + return; + + tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width; + f.width.value = tp.toFixed(0); + }, + + updateStyle : function(ty) { + var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); + + if (tinyMCEPopup.editor.settings.inline_styles) { + // Handle align + if (ty == 'align') { + dom.setStyle(img, 'float', ''); + dom.setStyle(img, 'vertical-align', ''); + + v = getSelectValue(f, 'align'); + if (v) { + if (v == 'left' || v == 'right') + dom.setStyle(img, 'float', v); + else + img.style.verticalAlign = v; + } + } + + // Handle border + if (ty == 'border') { + dom.setStyle(img, 'border', ''); + + v = f.border.value; + if (v || v == '0') { + if (v == '0') + img.style.border = '0 none none'; + else + img.style.border = v + 'px solid black'; + } + } + + // Handle hspace + if (ty == 'hspace') { + dom.setStyle(img, 'marginLeft', ''); + dom.setStyle(img, 'marginRight', ''); + + v = f.hspace.value; + if (v) { + img.style.marginLeft = v + 'px'; + img.style.marginRight = v + 'px'; + } + } + + // Handle vspace + if (ty == 'vspace') { + dom.setStyle(img, 'marginTop', ''); + dom.setStyle(img, 'marginBottom', ''); + + v = f.vspace.value; + if (v) { + img.style.marginTop = v + 'px'; + img.style.marginBottom = v + 'px'; + } + } + + // Merge + dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img'); + } + }, + + changeMouseMove : function() { + }, + + showPreviewImage : function(u, st) { + if (!u) { + tinyMCEPopup.dom.setHTML('prev', ''); + return; + } + + if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true)) + this.resetImageData(); + + u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u); + + if (!st) + tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this);" onerror="ImageDialog.resetImageData();" />'); + else + tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this, 1);" />'); + } +}; + +ImageDialog.preInit(); +tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/js/tiny_mce/plugins/advimage/langs/ar_dlg.js b/js/tiny_mce/plugins/advimage/langs/ar_dlg.js new file mode 100755 index 000000000..e9d89e5fc --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.advimage_dlg',{image_list:"Image list",align_right:"\u064a\u0645\u064a\u0646",align_left:"\u064a\u0633\u0627\u0631",align_textbottom:"\u0627\u0633\u0641\u0644 \u0627\u0644\u0646\u0635",align_texttop:"\u0627\u0639\u0644\u0649 \u0627\u0644\u0646\u0635",align_bottom:"\u0627\u0633\u0641\u0644",align_middle:"Middle",align_top:"\u0627\u0644\u0627\u0639\u0644\u0649",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"\u0645\u0634\u0627\u0647\u062f\u0647",title:"\u0627\u0644\u0639\u0646\u0648\u0627\u0646",general:"\u0639\u0627\u0645",tab_advanced:"\u062e\u064a\u0627\u0631\u0627\u062a \u0645\u062a\u0642\u062f\u0645\u0647",tab_appearance:"\u0627\u0644\u0645\u0638\u0647\u0631",tab_general:"\u0639\u0627\u0645"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/az_dlg.js b/js/tiny_mce/plugins/advimage/langs/az_dlg.js new file mode 100755 index 000000000..44491ae2b --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.advimage_dlg',{image_list:"\u015e\u0259kil siyah\u0131s\u0131",align_right:"Sa\u011fa",align_left:"Sola",align_textbottom:"M\u0259tn a\u015fa\u011f\u0131s\u0131 il\u0259",align_texttop:"M\u0259tn yuxar\u0131 il\u0259",align_bottom:"A\u015fa\u011f\u0131 il\u0259",align_middle:"M\u0259rk\u0259z il\u0259",align_top:"Yuxar\u0131 il\u0259",align_baseline:"Bin\u00f6vr\u0259 il\u0259",align:"Tarazla\u015fd\u0131rma",hspace:"\u00dcf\u00fcqi f\u0259za",vspace:"\u015eaquli f\u0259za",dimensions:"\u00d6l\u00e7\u00fcl\u0259r",border:"S\u0259rh\u0259d",list:"\u015e\u0259kil siyah\u0131s\u0131",alt:"\u015e\u0259kil t\u0259sviri",src:"\u015e\u0259kil \u00fcnvan\u0131",dialog_title:"\u015e\u0259kil \u0259lav\u0259/redakt\u0259 et",missing_alt:"\u018fminsiniz ki, \u015f\u0259kl\u0259 t\u0259svir yazmadan davam etm\u0259k ist\u0259yirsiniz? T\u0259svirsiz \u015f\u0259kil i\u015f qabiliyy\u0259ti a\u015fa\u011f\u0131 olan v\u0259 ya \u015f\u0259klin s\u00f6nd\u00fcr\u00fclm\u00fc\u015f funksiyas\u0131 il\u0259 m\u0259tn b\u0259l\u0259d\u00e7isind\u0259n istifad\u0259 ed\u0259n istifad\u0259\u00e7il\u0259r\u0259 \u0259l\u00e7atmaz ola bil\u0259r.",example_img:"Xarici g\u00f6r\u00fcn\u00fc\u015f\u0259 ilkin bax\u0131\u015f",misc:"M\u00fcxt\u0259lif",mouseout:"si\u00e7an\u0131 uzaqla\u015fd\u0131rd\u0131qda",mouseover:"si\u00e7an\u0131 g\u0259tirdikd\u0259",alt_image:"Alternativ \u015f\u0259kil",swap_image:"\u015e\u0259kli d\u0259yi\u015f",map:"X\u0259rit\u0259-\u015f\u0259kil",id:"\u0130dentifikator",rtl:"Sa\u011fda-sola",ltr:"Solda-sa\u011fa",classes:"Sinifl\u0259r",style:"Stil",long_desc:"\u018ftrafl\u0131 t\u0259svir\u0259 ke\u00e7id",langcode:"Dil kodu",langdir:"Dilin istiqam\u0259tl\u0259ndirilm\u0259si",constrain_proportions:"Proporsiyalar\u0131 saxla",preview:"\u0130lkin bax\u0131\u015f",title:"Ad\u0131",general:"\u00dcmumi",tab_advanced:"\u018flav\u0259",tab_appearance:"G\u00f6r\u00fcn\u00fc\u015f",tab_general:"\u00dcmumi"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/be_dlg.js b/js/tiny_mce/plugins/advimage/langs/be_dlg.js new file mode 100755 index 000000000..e06998ef0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.advimage_dlg',{image_list:"\u0421\u043f\u0456\u0441 \u043c\u0430\u043b\u044e\u043d\u043a\u0430\u045e",align_right:"\u041d\u0430\u043f\u0440\u0430\u0432\u0430",align_left:"\u041d\u0430\u043b\u0435\u0432\u0430",align_textbottom:"\u041f\u0430 \u043d\u0456\u0437\u0435 \u0442\u044d\u043a\u0441\u0442\u0443",align_texttop:"\u041f\u0430 \u0432\u0435\u0440\u0441\u0435 \u0442\u044d\u043a\u0441\u0442\u0443",align_bottom:"\u041f\u0430 \u043d\u0456\u0437\u0435",align_middle:"\u041f\u0430 \u0446\u044d\u043d\u0442\u0440\u044b",align_top:"\u041f\u0430 \u0432\u0435\u0440\u0441\u0435",align_baseline:"\u041f\u0430 \u043f\u0430\u0434\u0441\u0442\u0430\u0432\u0435",align:"\u0412\u044b\u0440\u0430\u045e\u043d\u043e\u045e\u0432\u0430\u043d\u043d\u0435",hspace:"\u0413\u0430\u0440\u044b\u0437\u0430\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0430\u0441\u0442\u043e\u0440\u0430",vspace:"\u0412\u0435\u0440\u0442\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0430\u0441\u0442\u043e\u0440\u0430",dimensions:"\u041f\u0430\u043c\u0435\u0440\u044b",border:"\u041c\u044f\u0436\u0430",list:"\u0421\u043f\u0456\u0441 \u043c\u0430\u043b\u044e\u043d\u043a\u0430\u045e",alt:"\u0410\u043f\u0456\u0441\u0430\u043d\u043d\u0435 \u043c\u0430\u043b\u044e\u043d\u043a\u0430",src:"\u0410\u0434\u0440\u0430\u0441 \u043c\u0430\u043b\u044e\u043d\u043a\u0430",dialog_title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c/\u0440\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u043c\u0430\u043b\u044e\u043d\u0430\u043a",missing_alt:"\u0412\u044b \u045e\u043f\u044d\u045e\u043d\u0435\u043d\u044b\u044f, \u0448\u0442\u043e \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u043f\u0440\u0430\u0446\u044f\u0433\u043d\u0443\u0446\u044c \u0431\u0435\u0437 \u0430\u043f\u0456\u0441\u0430\u043d\u043d\u044f \u043c\u0430\u043b\u044e\u043d\u043a\u0430? \u0411\u0435\u0437 \u044f\u0433\u043e \u043c\u0430\u043b\u044e\u043d\u0430\u043a \u043c\u043e\u0436\u0430 \u0431\u044b\u0446\u044c \u043d\u0435\u0434\u0430\u0441\u0442\u0443\u043f\u043d\u0430 \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u0447\u0430\u043c \u0437 \u0430\u0431\u043c\u0435\u0436\u0430\u0432\u0430\u043d\u0430\u0439 \u043f\u0440\u0430\u0446\u0430\u0437\u0434\u043e\u043b\u044c\u043d\u0430\u0441\u0446\u044e, \u0430\u0431\u043e \u0432\u044b\u043a\u0430\u0440\u044b\u0441\u0442\u043e\u045e\u0432\u0430\u043b\u044b\u043c \u0442\u044d\u043a\u0441\u0442\u0430\u0432\u044b \u0431\u0440\u0430\u045e\u0437\u044d\u0440, \u0430\u0431\u043e \u044f\u043a\u0456\u044f \u0433\u043b\u044f\u0434\u0437\u044f\u0446\u044c \u0441\u0442\u0430\u0440\u043e\u043d\u043a\u0456 \u0437 \u0430\u0434\u043a\u043b\u044e\u0447\u0430\u043d\u044b\u043c\u0456 \u043c\u0430\u043b\u044e\u043d\u043a\u0430\u043c\u0456.",example_img:"\u041f\u0430\u043f\u044f\u0440\u044d\u0434\u043d\u0456 \u043f\u0440\u0430\u0433\u043b\u044f\u0434 \u0432\u043e\u043d\u043a\u0430\u0432\u0430\u0433\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0443",misc:"\u0420\u043e\u0437\u043d\u0430\u0435",mouseout:"\u043f\u0440\u044b \u0430\u0434\u0432\u044f\u0434\u0437\u0435\u043d\u043d\u0456 \u043c\u044b\u0448\u044b",mouseover:"\u043f\u0440\u044b \u043d\u0430\u0432\u044f\u0434\u0437\u0435\u043d\u043d\u0456 \u043c\u044b\u0448\u044b",alt_image:"\u0410\u043b\u044c\u0442\u044d\u0440\u043d\u0430\u0442\u044b\u045e\u043d\u044b \u043c\u0430\u043b\u044e\u043d\u0430\u043a",swap_image:"\u041f\u0430\u043c\u044f\u043d\u044f\u0446\u044c \u043c\u0430\u043b\u044e\u043d\u0430\u043a",map:"\u041c\u0430\u043b\u044e\u043d\u0430\u043a-\u043a\u0430\u0440\u0442\u0430",id:"\u0406\u0434\u044d\u043d\u0442\u044b\u0444\u0456\u043a\u0430\u0442\u0430\u0440",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u0430",ltr:"\u0417\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0430",classes:"\u041a\u043b\u0430\u0441\u044b",style:"\u0421\u0442\u044b\u043b\u044c",long_desc:"\u0421\u043f\u0430\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0430\u0434\u0440\u0430\u0431\u044f\u0437\u043d\u0430\u0435 \u0430\u043f\u0456\u0441\u0430\u043d\u043d\u0435",langcode:"\u041a\u043e\u0434 \u043c\u043e\u0432\u044b",langdir:"\u041a\u0456\u0440\u0443\u043d\u0430\u043a \u043c\u043e\u0432\u044b",constrain_proportions:"\u0417\u0430\u0445\u043e\u045e\u0432\u0430\u0446\u044c \u043f\u0440\u0430\u043f\u043e\u0440\u0446\u044b\u0456",preview:"\u041f\u0430\u043f\u044f\u0440\u044d\u0434\u043d\u0456 \u043f\u0440\u0430\u0433\u043b\u044f\u0434",title:"\u041d\u0430\u0437\u043e\u045e",general:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f",tab_advanced:"\u0414\u0430\u0434\u0430\u0442\u043a\u043e\u0432\u044b\u044f",tab_appearance:"\u0412\u043e\u043d\u043a\u0430\u0432\u044b \u0432\u044b\u0433\u043b\u044f\u0434",tab_general:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/bg_dlg.js b/js/tiny_mce/plugins/advimage/langs/bg_dlg.js new file mode 100755 index 000000000..90fa58d05 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.advimage_dlg',{image_list:"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438",align_right:"\u0414\u044f\u0441\u043d\u043e",align_left:"\u041b\u044f\u0432\u043e",align_textbottom:"\u0422\u0435\u043a\u0441\u0442 \u0434\u043e\u043b\u0443",align_texttop:"\u0422\u0435\u043a\u0441\u0442 \u0433\u043e\u0440\u0435",align_bottom:"\u0414\u043e\u043b\u0443",align_middle:"\u0426\u0435\u043d\u0442\u044a\u0440",align_top:"\u0413\u043e\u0440\u0435",align_baseline:"\u0411\u0430\u0437\u043e\u0432\u0430 \u043b\u0438\u043d\u0438\u044f",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",hspace:"\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435",vspace:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u0440\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435",dimensions:"\u0420\u0430\u0437\u043c\u0435\u0440\u0438",border:"\u0420\u0430\u043c\u043a\u0430",list:"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438",alt:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",src:"URL \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",dialog_title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",missing_alt:"\u0421\u0438\u0433\u0443\u0440\u0435\u043d \u043b\u0438 \u0441\u0442\u0435 \u0447\u0435 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430? \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u044a\u043f\u043d\u0430 \u0437\u0430 \u043d\u044f\u043a\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0441 \u043d\u0435\u0434\u044a\u0437\u0438, \u0438\u043b\u0438 \u0437\u0430 \u0442\u0435\u0437\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0449\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0431\u0440\u0430\u0443\u0437\u044a\u0440, \u0438\u043b\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0449\u0438 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.",example_img:"\u041f\u0440\u0435\u0433\u043b\u0435\u0434 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0442\u0430",misc:"\u0420\u0430\u0437\u043d\u0438",mouseout:"\u0437\u0430 mouse out",mouseover:"\u0437\u0430 mouse over",alt_image:"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",swap_image:"\u0421\u043c\u0435\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",map:"\u041a\u0430\u0440\u0442\u0438\u043d\u0430 \u043a\u0430\u0440\u0442\u0430",id:"Id",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",classes:"\u041a\u043b\u0430\u0441\u043e\u0432\u0435",style:"\u0421\u0442\u0438\u043b",long_desc:"\u0425\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 \u043a\u044a\u043c \u0434\u044a\u043b\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",constrain_proportions:"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438\u0442\u0435",preview:"\u041f\u0440\u0435\u0433\u043b\u0435\u0434",title:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435",general:"\u041e\u0431\u0449\u0438",tab_advanced:"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",tab_appearance:"\u0412\u044a\u043d\u0448\u0435\u043d \u0432\u0438\u0434",tab_general:"\u041e\u0431\u0449\u0438"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/bn_dlg.js b/js/tiny_mce/plugins/advimage/langs/bn_dlg.js new file mode 100755 index 000000000..3ba89300f --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.advimage_dlg',{"image_list":"Image list","align_right":"Right","align_left":"Left","align_textbottom":"Text bottom","align_texttop":"Text top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL","dialog_title":"Insert/edit image","missing_alt":"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.","example_img":"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over","alt_image":"Alternative image","swap_image":"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style","long_desc":"Long description link",langcode:"Language code",langdir:"Language direction","constrain_proportions":"Constrain proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/br_dlg.js b/js/tiny_mce/plugins/advimage/langs/br_dlg.js new file mode 100755 index 000000000..77c725c84 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.advimage_dlg',{image_list:"Lista de imagens",align_right:"Direita",align_left:"Esquerda",align_textbottom:"Base do texto",align_texttop:"Topo do texto",align_bottom:"Abaixo",align_middle:"Meio",align_top:"Topo",align_baseline:"Sobre a linha de texto",align:"Alinhamento",hspace:"Espa\u00e7o horizontal",vspace:"Espa\u00e7o vertical",dimensions:"Dimens\u00f5es",border:"Limite",list:"Lista de imagens",alt:"Descri\u00e7\u00e3o da imagem",src:"Endere\u00e7o da imagem",dialog_title:"Inserir/editar imagem",missing_alt:"Tem certeza que deseja continuar sem acrescentar uma descri\u00e7\u00e3o \u00e0\u00a0imagem? (Isto pode gerar problemas de acessibilidade em alguns navegadores)",example_img:"Pr\u00e9-visualiza\u00e7\u00e3o",misc:"Misto",mouseout:"mouseout",mouseover:"mouseover",alt_image:"Imagem alternativa",swap_image:"Trocar imagem",map:"Mapa de imagem",id:"Id",rtl:"Da direita para a esquerda",ltr:"Da esquerda para a direita",classes:"Classes",style:"Estilo",long_desc:"Descri\u00e7\u00e3o extensa",langcode:"C\u00f3digo de idioma",langdir:"Dire\u00e7\u00e3o do texto",constrain_proportions:"Manter propor\u00e7\u00f5es",preview:"Pr\u00e9-Visualiza\u00e7\u00e3o",title:"T\u00edtulo",general:"Geral",tab_advanced:"Avan\u00e7ado",tab_appearance:"Apar\u00eancia",tab_general:"Geral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/bs_dlg.js b/js/tiny_mce/plugins/advimage/langs/bs_dlg.js new file mode 100755 index 000000000..78330038a --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.advimage_dlg',{image_list:"Lista slika",align_right:"Desno",align_left:"Lijevo",align_textbottom:"Dno teksta",align_texttop:"Vrh teksta",align_bottom:"Dno",align_middle:"Sredina",align_top:"Vrh",align_baseline:"Osnovna linija",align:"Poravnavanje",hspace:"Vodoravni razmak",vspace:"Okomiti razmak",dimensions:"Dimenzije",border:"Obrub",list:"Lista slika",alt:"Opis slike",src:"URL slike",dialog_title:"Umetni/uredi sliku",missing_alt:"Jeste li sigurni da \u017eelite izostaviti opis slike? Slika mo\u017ee biti nedostupna ljudima s pote\u0161ko\u0107ama ili onima koji koriste preglednike bez prikaza slika.",example_img:"Prikaz slike",misc:"Razno",mouseout:"za izlazak mi\u0161a van slike",mouseover:"za prelazak mi\u0161a preko slike",alt_image:"Alternativna slika",swap_image:"Izmjenjiva slika",map:"Karta slike",id:"Id",rtl:"S desna na lijevo",ltr:"S lijeva na desno",classes:"Klase",style:"Stil",long_desc:"Poveznica dugog opisa",langcode:"Kod jezika",langdir:"Smjer jezika",constrain_proportions:"Zadr\u017ei proporcije",preview:"Prikaz",title:"Naslov",general:"Osnovno",tab_advanced:"Napredno",tab_appearance:"Izgled",tab_general:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ca_dlg.js b/js/tiny_mce/plugins/advimage/langs/ca_dlg.js new file mode 100755 index 000000000..ace03f87e --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.advimage_dlg',{"image_list":"Llista d\'imatges","align_right":"A la dreta","align_left":"A l\'esquerra","align_textbottom":"Baix del text","align_texttop":"Dalt del text","align_bottom":"Inferior","align_middle":"Mitjan lloc","align_top":"Superior","align_baseline":"L\u00ednia de base",align:"Alineaci\u00f3",hspace:"Espai horitzontal",vspace:"Espai vertical",dimensions:"Dimensions",border:"Vora",list:"Llista de la imatge",alt:"Descripci\u00f3 de la imatge",src:"URL de la imatge","dialog_title":"Insereix/edita imatge","missing_alt":"Esteu segur que voleu continuar sense incloure una descripci\u00f3 de la imatge? La imatge pot no ser accessible a usuaris amb discapacitats, o a aquells que utilitzin navegadors de text o que naveguin amb les imatges desactivades.","example_img":"Aparen\u00e7a imatge previsualitzada",misc:"Miscel\u00b7l\u00e0nia",mouseout:"quan el ratol\u00ed marxa",mouseover:"quan el ratol\u00ed arriba","alt_image":"Imatge alternativa","swap_image":"Canvia imatge",map:"Mapa de la imatge",id:"Id",rtl:"De dreta a esquerra",ltr:"D\'esquerra a dreta",classes:"Classes",style:"Estil","long_desc":"Enlla\u00e7 a la descripci\u00f3 llarga",langcode:"Codi de l\'idioma",langdir:"Direcci\u00f3 de l\'idioma","constrain_proportions":"Mant\u00e9 la proporci\u00f3",preview:"Previsualitzaci\u00f3",title:"T\u00edtol",general:"General","tab_advanced":"Avan\u00e7at","tab_appearance":"Aparen\u00e7a","tab_general":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ch_dlg.js b/js/tiny_mce/plugins/advimage/langs/ch_dlg.js new file mode 100755 index 000000000..7fad9ba18 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.advimage_dlg',{image_list:"\u56fe\u7247\u6e05\u5355",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u9760\u4e0b",align_middle:"\u7f6e\u4e2d",align_top:"\u9760\u4e0a",align_baseline:"\u57fa\u51c6\u7ebf",align:"\u5bf9\u9f50\u65b9\u5f0f",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u6e05\u5355",alt:"\u56fe\u7247\u8bf4\u660e",src:"\u56fe\u7247URL",dialog_title:"\u63d2\u5165/\u7f16\u8f91\u56fe\u7247",missing_alt:"\u56fe\u7247\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\uff0c\u662f\u5426\u7ee7\u7eed\uff1f",example_img:"\u56fe\u7247\u5916\u89c2\u9884\u89c8",misc:"\u5176\u5b83",mouseout:"\u9f20\u6807\u79fb\u51fa",mouseover:"\u9f20\u6807\u79fb\u5165",alt_image:"\u53d6\u4ee3\u56fe\u7247",swap_image:"\u56fe\u7247\u5207\u6362",map:"\u56fe\u7247 Map",id:"ID",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",long_desc:"\u957f\u8fde\u7ed3",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",constrain_proportions:"\u7ea6\u675f\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u6807\u9898",general:"\u4e00\u822c",tab_advanced:"\u9ad8\u7ea7",tab_appearance:"\u5916\u89c2",tab_general:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/cn_dlg.js b/js/tiny_mce/plugins/advimage/langs/cn_dlg.js new file mode 100755 index 000000000..3e7ae01c1 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.advimage_dlg',{"image_list":"\u56fe\u7247\u5217\u8868","align_right":"\u9760\u53f3","align_left":"\u9760\u5de6","align_textbottom":"\u6587\u5b57\u5e95\u90e8","align_texttop":"\u6587\u5b57\u9876\u90e8","align_bottom":"\u5e95\u90e8","align_middle":"\u4e2d\u95f4","align_top":"\u9876\u90e8","align_baseline":"\u57fa\u7ebf",align:"\u5bf9\u9f50",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u5217\u8868",alt:"\u56fe\u7247\u8bf4\u660e",src:"\u56fe\u7247\u5730\u5740URL","dialog_title":"\u63d2\u5165/\u7f16\u8f91\u56fe\u7247","missing_alt":"\u56fe\u7247\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\uff0c\u662f\u5426\u7ee7\u7eed\uff1f","example_img":"\u56fe\u7247\u9884\u89c8",misc:"\u5176\u5b83",mouseout:"\u9f20\u6807\u79fb\u51fa",mouseover:"\u9f20\u6807\u79fb\u5165","alt_image":"\u66ff\u4ee3\u56fe\u7247","swap_image":"\u56fe\u7247\u5207\u6362",map:"\u56fe\u7247 Map",id:"Id\u540d\u79f0",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",classes:"\u7c7b\u522b",style:"\u6837\u5f0f","long_desc":"\u957f\u8fde\u7ed3",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u6587\u672c\u65b9\u5411","constrain_proportions":"\u7ea6\u675f\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u6807\u9898",general:"\u5e38\u89c4","tab_advanced":"\u9ad8\u7ea7","tab_appearance":"\u5916\u89c2","tab_general":"\u5e38\u89c4"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/cs_dlg.js b/js/tiny_mce/plugins/advimage/langs/cs_dlg.js new file mode 100755 index 000000000..8d344591d --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.advimage_dlg',{image_list:"Seznam obr\u00e1zk\u016f",align_right:"Vpravo",align_left:"Vlevo",align_textbottom:"Se spodkem \u0159\u00e1dku",align_texttop:"S vrchem \u0159\u00e1dku",align_bottom:"Dol\u016f",align_middle:"Na st\u0159ed \u0159\u00e1dku",align_top:"Nahoru",align_baseline:"Na z\u00e1kladnu",align:"Zarovn\u00e1n\u00ed",hspace:"Horizont\u00e1ln\u00ed odsazen\u00ed",vspace:"Vertik\u00e1ln\u00ed odsazen\u00ed",dimensions:"Rozm\u011bry",border:"R\u00e1me\u010dek",list:"Seznam obr\u00e1zk\u016f",alt:"Popis obr\u00e1zku",src:"URL obr\u00e1zku",dialog_title:"Vlo\u017eit/upravit obr\u00e1zek",missing_alt:"Skute\u010dn\u011b chcete pokra\u010dovat bez vlo\u017een\u00e9ho popisu obr\u00e1zku? Bez popisu m\u016f\u017ee b\u00fdt obr\u00e1zek nep\u0159\u00edstupn\u00fd u\u017eivatel\u016fm se zrakov\u00fdm posti\u017een\u00edm, u\u017eivatel\u016fm textov\u00fdch prohl\u00ed\u017ee\u010d\u016f nebo u\u017eivatel\u016fm, kte\u0159\u00ed maj\u00ed vypnuto zobrazov\u00e1n\u00ed obr\u00e1zk\u016f.",example_img:"P\u0159\u00edklad obr\u00e1zku",misc:"R\u016fzn\u00e9",mouseout:"Po odjet\u00ed my\u0161i...",mouseover:"P\u0159i najet\u00ed my\u0161i...",alt_image:"Alternativn\u00ed obr\u00e1zek",swap_image:"P\u0159epnout obr\u00e1zek",map:"Obr\u00e1zkov\u00e1 mapa",id:"ID",rtl:"Zprava doleva",ltr:"Zleva doprava",classes:"T\u0159\u00eddy",style:"Styl",long_desc:"Dlouh\u00fd popis",langcode:"K\u00f3d jazyka",langdir:"Sm\u011br textu",constrain_proportions:"Zachovat proporce",preview:"N\u00e1hled",title:"Titulek",general:"Obecn\u00e9 parametry",tab_advanced:"Roz\u0161\u00ed\u0159en\u00e9",tab_appearance:"Vzhled",tab_general:"Obecn\u00e9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/cy_dlg.js b/js/tiny_mce/plugins/advimage/langs/cy_dlg.js new file mode 100755 index 000000000..cc2651076 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.advimage_dlg',{image_list:"Rhestr delweddau",align_right:"De",align_left:"Chwith",align_textbottom:"Gwaelod testun",align_texttop:"Pen testun",align_bottom:"Gwaelod",align_middle:"Canol",align_top:"Pen",align_baseline:"Gwaelodlin",align:"Aliniad",hspace:"Gofod llorweddol",vspace:"Gofod fertigol",dimensions:"Dimensiynau",border:"Border",list:"Rhestr delweddau",alt:"Disgrifiad delwedd",src:"URL delwedd",dialog_title:"Mewnosod/golygu delwedd",missing_alt:"A ydych chi\'n si\u0175r eich bod eisiau parhau heb cynnwys Disgrifiad Delwedd? Hebddo fo ni fydd y delwedd yn hygyrchol i ddefnyddwyr gyda anableddau, neu sy\'n defnyddio porwr testun, neu sy\'n pori\'r we gyda delweddau wedi\'u diffodd.",example_img:"Delwedd rhagolygiad ymddangosiad",misc:"Amrywiol",mouseout:"ar gyfer llygoden allan",mouseover:"ar gyfer llygoden drosti",alt_image:"Delwedd arall",swap_image:"Cyfnewid delwedd",map:"Map delweddau",id:"Id",rtl:"De i\'r chwith",ltr:"Chwith i\'r dde",classes:"Dosbarthiadau",style:"Arddull",long_desc:"Cyswllt disgrifiad hir",langcode:"Cod iaith",langdir:"Cyfeiriad iaith",constrain_proportions:"Cynfyngu cyfraneddau",preview:"Rhagolwg",title:"Teitl",general:"Cyffredinol",tab_advanced:"Uwch",tab_appearance:"Ymddangosiad",tab_general:"Cyffredinol"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/da_dlg.js b/js/tiny_mce/plugins/advimage/langs/da_dlg.js new file mode 100755 index 000000000..046bb976b --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.advimage_dlg',{image_list:"Billedliste",align_right:"H\u00f8jre",align_left:"Venstre",align_textbottom:"Tekstbund",align_texttop:"Teksttop",align_bottom:"Bund",align_middle:"Midte",align_top:"Top",align_baseline:"Grundlinje",align:"Justering",hspace:"Horisontal afstand",vspace:"Vertikal afstand",dimensions:"Dimentioner",border:"Kant",list:"Billedliste",alt:"Billedbeskrivelse",src:"Billed-URL",dialog_title:"Inds\u00e6t/rediger billede",missing_alt:"Er du sikker p\u00e5, at du vil forts\u00e6tte uden at inkludere en billedebeskrivelse? Uden denne er billedet m\u00e5ske ikke tilg\u00e6ngeligt for nogle brugere med handicaps, eller for dem der bruger en tekstbrowser, eller som browser internettet med billeder sl\u00e5et fra.",example_img:"Forh\u00e5ndsvisning af billede",misc:"Diverse",mouseout:"for mus-ud",mouseover:"for mus-over",alt_image:"Alternativt billede",swap_image:"Byt billede",map:"Billede map",id:"Id",rtl:"H\u00f8jre til venstre",ltr:"Venstre til h\u00f8jre",classes:"Klasser",style:"Stil",long_desc:"Lang beskrivelseslink",langcode:"Sprogkode",langdir:"Sprogretning",constrain_proportions:"Bibehold proportioner",preview:"Vis",title:"Titel",general:"Generelt",tab_advanced:"Avanceret",tab_appearance:"Udseende",tab_general:"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/de_dlg.js b/js/tiny_mce/plugins/advimage/langs/de_dlg.js new file mode 100755 index 000000000..cf3561f17 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.advimage_dlg',{image_list:"Bilderliste",align_right:"Rechts",align_left:"Links",align_textbottom:"Unten im Text",align_texttop:"Oben im Text",align_bottom:"Unten",align_middle:"Mittig",align_top:"Oben",align_baseline:"Zeile",align:"Ausrichtung",hspace:"Horizontaler Abstand",vspace:"Vertikaler Abstand",dimensions:"Ausma\u00dfe",border:"Rahmen",list:"Bilderliste",alt:"Beschreibung",src:"Adresse",dialog_title:"Bild einf\u00fcgen/bearbeiten",missing_alt:"Wollen Sie wirklich keine Beschreibung eingeben? Bestimmte Benutzer mit k\u00f6rperlichen Einschr\u00e4nkungen k\u00f6nnen so nicht darauf zugreifen, ebenso solche, die einen Textbrowser benutzen oder die Anzeige von Bildern deaktiviert haben.",example_img:"Aussehen der Vorschau",misc:"Verschiedenes",mouseout:"bei keinem Mauskontakt",mouseover:"bei Mauskontakt",alt_image:"Alternatives Bild",swap_image:"Bild austauschen",map:"Image-Map",id:"ID",rtl:"Rechts nach links",ltr:"Links nach rechts",classes:"Klassen",style:"Format",long_desc:"Ausf\u00fchrliche Beschreibung",langcode:"Sprachcode",langdir:"Schriftrichtung",constrain_proportions:"Seitenverh\u00e4ltnis beibehalten",preview:"Vorschau",title:"Titel",general:"Allgemein",tab_advanced:"Erweitert",tab_appearance:"Aussehen",tab_general:"Allgemein"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/dv_dlg.js b/js/tiny_mce/plugins/advimage/langs/dv_dlg.js new file mode 100755 index 000000000..b03dd065b --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/el_dlg.js b/js/tiny_mce/plugins/advimage/langs/el_dlg.js new file mode 100755 index 000000000..2ed51002d --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.advimage_dlg',{image_list:"\u039b\u03af\u03c3\u03c4\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03c9\u03bd",align_right:"\u0394\u03b5\u03be\u03b9\u03ac",align_left:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",align_textbottom:"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03ba\u03ac\u03c4\u03c9",align_texttop:"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf \u03c0\u03ac\u03bd\u03c9",align_bottom:"\u039a\u03ac\u03c4\u03c9",align_middle:"\u039c\u03ad\u03c3\u03b7",align_top:"\u03a0\u03ac\u03bd\u03c9",align_baseline:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",hspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1",vspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03ac\u03b8\u03b5\u03c4\u03b7",dimensions:"\u0394\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2",border:"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf",list:"\u039b\u03af\u03c3\u03c4\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03c9\u03bd",alt:"\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",src:"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",dialog_title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",missing_alt:"\u03a3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2; \u03a7\u03c9\u03c1\u03af\u03c2 \u03b1\u03c5\u03c4\u03ae\u03bd\u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03b2\u03ac\u03c3\u03b9\u03bc\u03b7 \u03c3\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03bc\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1, \u03ae \u03c3\'\u03b1\u03c5\u03c4\u03bf\u03cd\u03c2 \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03bf\u03cd\u03bd \u03c6\u03c5\u03bb\u03bb\u03bf\u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5, \u03ae \u03b2\u03bb\u03ad\u03c0\u03bf\u03c5\u03bd \u03c4\u03bf \u0399\u03bd\u03c4\u03b5\u03c1\u03bd\u03b5\u03c4 \u03c7\u03c9\u03c1\u03af\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2.",example_img:"\u0394\u03bf\u03ba\u03b9\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1",misc:"\u0394\u03b9\u03ac\u03c6\u03bf\u03c1\u03b1",mouseout:"\u03b3\u03b9\u03b1 mouse out",mouseover:"\u03b3\u03b9\u03b1 mouse over",alt_image:"\u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1",swap_image:"\u0391\u03bd\u03c4\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",map:"\u03a7\u03ac\u03c1\u03c4\u03b7\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",id:"Id",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",classes:"\u039a\u03bb\u03ac\u03c3\u03b5\u03b9\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",long_desc:"\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03c0\u03bb\u03ae\u03c1\u03bf\u03c5\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",constrain_proportions:"\u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03bf\u03b3\u03af\u03b1\u03c2 \u03c0\u03bb. - \u03cd\u03c8\u03bf\u03c5\u03c2",preview:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7",title:"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2",general:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",tab_advanced:"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2",tab_appearance:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7",tab_general:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/en_dlg.js b/js/tiny_mce/plugins/advimage/langs/en_dlg.js new file mode 100755 index 000000000..e14dcf4ed --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.advimage_dlg',{"image_list":"Image list","align_right":"Right","align_left":"Left","align_textbottom":"Text bottom","align_texttop":"Text top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL","dialog_title":"Insert/edit image","missing_alt":"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.","example_img":"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over","alt_image":"Alternative image","swap_image":"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style","long_desc":"Long description link",langcode:"Language code",langdir:"Language direction","constrain_proportions":"Constrain proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/es_dlg.js b/js/tiny_mce/plugins/advimage/langs/es_dlg.js new file mode 100755 index 000000000..89fbf7369 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.advimage_dlg',{"image_list":"Lista de imagen","align_right":"Derecha","align_left":"Izquierda","align_textbottom":"Texto abajo","align_texttop":"Texto arriba","align_bottom":"Debajo","align_middle":"Medio","align_top":"Arriba","align_baseline":"L\u00ednea base",align:"Alineaci\u00f3n",hspace:"Espacio horizontal",vspace:"Espacio vertical",dimensions:"Dimensiones",border:"Bordes",list:"Lista de imagen",alt:"Descripci\u00f3n de la imagen",src:"URL de la imagen","dialog_title":"Insertar/editar imagen","missing_alt":" \u00bfEsta seguro de continuar sin introducir una descripci\u00f3n a la imagen? Sin ella puede no ser accesible para usuarios con discapacidades, o para aquellos que usen navegadores de modo texto, o tengan deshabilitadas las im\u00e1genes de la p\u00e1gina.","example_img":"Vista previa de la imagen",misc:"Miscel\u00e1neo",mouseout:"para mouseout",mouseover:"para mouseover","alt_image":"Imagen alternativa","swap_image":"Intercambiar imagen",map:"Mapa de imagen",id:"Id",rtl:"Derecha a izquierda",ltr:"Izquierda a derecha",classes:"Clases",style:"Estilos","long_desc":"V\u00ednculo para descripci\u00f3n larga",langcode:"C\u00f3digo del lenguaje",langdir:"Direcci\u00f3n del lenguaje","constrain_proportions":"Bloquear relaci\u00f3n de aspecto",preview:"Vista previa",title:"T\u00edtulo",general:"General","tab_advanced":"Avanzado","tab_appearance":"Apariencia","tab_general":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/et_dlg.js b/js/tiny_mce/plugins/advimage/langs/et_dlg.js new file mode 100755 index 000000000..7fc429760 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.advimage_dlg',{image_list:"Piltide nimekiri",align_right:"Paremal",align_left:"Vasakul",align_textbottom:"Tekst all",align_texttop:"Tekst \u00fcleval",align_bottom:"All",align_middle:"Keskel",align_top:"\u00dcleval",align_baseline:"Baas",align:"Joondus",hspace:"Horisontaalne vahe",vspace:"Vertikaalne vahe",dimensions:"M\u00f5\u00f5tmed",border:"Raam",list:"Piltide nimekiri",alt:"Pildi kirjeldus",src:"Pildi URL",dialog_title:"Sisesta/muuda pilti",missing_alt:"Oled kindel, et soovid j\u00e4tkata pildile kirjeldust lisamata?",example_img:"Eelvaate pildi v\u00e4limus",misc:"Mitmesugune",mouseout:"\u201eKursor maas\u201c",mouseover:"\u201eKursor peal\u201c",alt_image:"Alternatiivne pilt",swap_image:"Vaheta pilti",map:"Pildi kaart",id:"ID",rtl:"Paremalt vasakule",ltr:"Vasakult paremale",classes:"Klassid",style:"Stiil",long_desc:"Pikk kirjelduse link",langcode:"Keele kood",langdir:"Keele suund",constrain_proportions:"Piira proportioone",preview:"Eelvaade",title:"Pealkiri",general:"\u00dcldine",tab_advanced:"P\u00f5hjalikum",tab_appearance:"V\u00e4limus",tab_general:"\u00dcldine"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/eu_dlg.js b/js/tiny_mce/plugins/advimage/langs/eu_dlg.js new file mode 100755 index 000000000..1a2d8242e --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.advimage_dlg',{image_list:"Irudi-zerrenda",align_right:"Eskuinean",align_left:"Ezkerrean",align_textbottom:"Testua behean",align_texttop:"Testua goian",align_bottom:"Behean",align_middle:"Tartean",align_top:"Goian",align_baseline:"Oinarri-marra",align:"Alineazioa",hspace:"Tarte horizontala",vspace:"Tarte bertikala",dimensions:"Tamaina",border:"Inguruko marra",list:"Irudi-zerrenda",alt:"Irudiaren deskribapena",src:"Irudiaren URL helbidea",dialog_title:"Irudia txertatu/editatu",missing_alt:"Irudiaren deskribapena gehitu gabe jarraitu nahi duzu? Hau horrela, ezgaitasunak dituztenentzat edo testu nabigatzaile bat darabiltenentzat ez da irisgarria izango.",example_img:"Nola ikusiko den",misc:"Bestelakoak",mouseout:"xagua kentzen denean",mouseover:"xagua gainean dagoenean",alt_image:"Ordezko irudia",swap_image:"Irudia ordezkatu",map:"Irudi-mapa",id:"Id",rtl:"Eskuinetik ezkerrera",ltr:"Ezkerretik eskuinera",classes:"Klaseak",style:"Estiloa",long_desc:"Deskribaepn luzearen lotura",langcode:"Hizkuntza-kodea",langdir:"Hizkuntzaren norabidea",constrain_proportions:"Proportzioak mantendu",preview:"Aurrebista",title:"Izenburua",general:"Orokorra",tab_advanced:"Aurreratua",tab_appearance:"Itxura",tab_general:"Orokorra"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/fa_dlg.js b/js/tiny_mce/plugins/advimage/langs/fa_dlg.js new file mode 100755 index 000000000..105e3f332 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.advimage_dlg',{image_list:"\u0644\u06cc\u0633\u062a \u062a\u0635\u0648\u06cc\u0631",align_right:"\u0631\u0627\u0633\u062a",align_left:"\u0686\u067e",align_textbottom:"\u0645\u062a\u0646 \u067e\u0627\u06cc\u06cc\u0646",align_texttop:"\u0645\u062a\u0646 \u0628\u0627\u0644\u0627",align_bottom:"\u067e\u0627\u06cc\u06cc\u0646",align_middle:"\u0648\u0633\u0637",align_top:"\u0628\u0627\u0644\u0627",align_baseline:"\u062e\u0637 \u067e\u0627\u06cc\u0647",align:"\u062a\u0631\u0627\u0632",hspace:"\u0641\u0627\u0635\u0644\u0647 \u0627\u0641\u0642\u06cc",vspace:"\u0641\u0627\u0635\u0644\u0647 \u0639\u0645\u0648\u062f\u06cc",dimensions:"\u0627\u0628\u0639\u0627\u062f",border:"\u062d\u0627\u0634\u06cc\u0647",list:"\u0644\u06cc\u0633\u062a \u062a\u0635\u0648\u06cc\u0631",alt:"\u062a\u0648\u0636\u06cc\u062d \u062a\u0635\u0648\u06cc\u0631",src:"\u0622\u062f\u0631\u0633 \u062a\u0635\u0648\u06cc\u0631 (URL)",dialog_title:"\u062f\u0631\u062c/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u062a\u0635\u0648\u06cc\u0631",missing_alt:"\u0622\u06cc\u0627 \u0634\u0645\u0627 \u0627\u0632 \u0627\u062f\u0627\u0645\u0647 \u0628\u062f\u0648\u0646 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062a\u0648\u0636\u06cc\u062d \u0628\u0631\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062f\u0627\u0631\u06cc\u062f\u061f \u0628\u062f\u0648\u0646 \u0622\u0646 \u0645\u0645\u06a9\u0646 \u0646\u06cc\u0633\u062a \u062a\u0635\u0627\u0648\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0628\u0631\u062e\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u06cc \u06a9\u0647 \u0642\u0627\u0628\u0644\u06cc\u062a \u062f\u06cc\u062f\u0646 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0631\u0627 \u0646\u062f\u0627\u0631\u0646\u062f \u060c \u06cc\u0627 \u0622\u0646\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0632 \u06cc\u06a9 \u0645\u0631\u0648\u0631\u06af\u0631 \u0645\u062a\u0646\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f \u060c \u06cc\u0627 \u062f\u0631 \u062d\u0627\u0644 \u062f\u06cc\u062f\u0646 \u0648\u0628 \u0628\u062f\u0648\u0646 \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc \u0628\u0627\u0634\u0646\u062f \u060c \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u0628\u0627\u0634\u062f.",example_img:"\u062a\u0635\u0648\u06cc\u0631 \u067e\u06cc\u0634 \u0646\u0645\u0627\u06cc\u0634 \u0638\u0627\u0647\u0631",misc:"\u0645\u062a\u0641\u0631\u0642\u0647",mouseout:"\u0628\u0631\u0627\u06cc \u0631\u0641\u062a\u0646 \u0645\u0648\u0633",mouseover:"\u0628\u0631\u0627\u06cc \u0622\u0645\u062f\u0646 \u0645\u0648\u0633",alt_image:"\u062a\u0635\u0648\u06cc\u0631 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646",swap_image:"\u062a\u0639\u0648\u06cc\u0636 \u062a\u0635\u0648\u06cc\u0631",map:"\u0646\u0642\u0634\u0647 \u062a\u0635\u0648\u06cc\u0631",id:"\u0634\u0646\u0627\u0633\u0647",rtl:"\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e",ltr:"\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a",classes:"\u06a9\u0644\u0627\u0633 \u0647\u0627",style:"\u0627\u0633\u062a\u06cc\u0644",long_desc:"\u0644\u06cc\u0646\u06a9 \u062a\u0648\u0636\u06cc\u062d \u0637\u0648\u0644\u0627\u0646\u06cc",langcode:"\u06a9\u062f \u0632\u0628\u0627\u0646",langdir:"\u062c\u0647\u062a \u0632\u0628\u0627\u0646",constrain_proportions:"\u062d\u0641\u0638 \u062a\u0646\u0627\u0633\u0628",preview:"\u067e\u06cc\u0634 \u0646\u0645\u0627\u06cc\u0634",title:"\u0639\u0646\u0648\u0627\u0646",general:"\u0639\u0645\u0648\u0645\u06cc",tab_advanced:"\u067e\u06cc\u0634\u0631\u0641\u062a\u0647",tab_appearance:"\u0638\u0627\u0647\u0631",tab_general:"\u0639\u0645\u0648\u0645\u06cc"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/fi_dlg.js b/js/tiny_mce/plugins/advimage/langs/fi_dlg.js new file mode 100755 index 000000000..496d05d9e --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.advimage_dlg',{image_list:"Kuvalista",align_right:"Oikealla",align_left:"Vasemmalla",align_textbottom:"Teksti alhaalla",align_texttop:"Teksti ylh\u00e4\u00e4ll\u00e4",align_bottom:"Alhaalla",align_middle:"Keskell\u00e4",align_top:"Ylh\u00e4\u00e4ll\u00e4",align_baseline:"Rivill\u00e4",align:"Tasaus",hspace:"vaakasuora tila",vspace:"pystysuora tila",dimensions:"Mitat",border:"Kehys",list:"Kuvalista",alt:"Kuvan kuvaus",src:"Kuvan URL",dialog_title:"Lis\u00e4\u00e4/muokkaa kuvaa",missing_alt:"Haluatko varmasti jatkaa lis\u00e4\u00e4m\u00e4tt\u00e4 kuvausta? Kuvauksen puuttuminen saattaa h\u00e4irit\u00e4 sellaisia, jotka k\u00e4ytt\u00e4v\u00e4t tekstipohjaista selainta tai ovat kytkeneet kuvien n\u00e4kymisen pois p\u00e4\u00e4lt\u00e4.",example_img:"Ulkoasun esikatselukuva",misc:"Sekalaiset",mouseout:"mouseoutille",mouseover:"mouseoverille",alt_image:"Vaihtoehtoinen kuva",swap_image:"Vaihda kuva",map:"Kuvakartta",id:"Id",rtl:"Oikealta vasemmalle",ltr:"Vasemmalta oikealle",classes:"Luokat",style:"Tyyli",long_desc:"Pitk\u00e4n kuvauksen linkki",langcode:"Kielen koodi",langdir:"Kielen suunta",constrain_proportions:"S\u00e4ilyt\u00e4 mittasuhteet",preview:"Esikatselu",title:"Otsikko",general:"Yleiset",tab_advanced:"Edistynyt",tab_appearance:"N\u00e4kyminen",tab_general:"Yleiset"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/fr_dlg.js b/js/tiny_mce/plugins/advimage/langs/fr_dlg.js new file mode 100755 index 000000000..1aa451bbc --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.advimage_dlg',{image_list:"Liste d\'images",align_right:"Droite (flottant)",align_left:"Gauche (flottant)",align_textbottom:"Texte en bas",align_texttop:"Texte en haut",align_bottom:"En bas",align_middle:"Au milieu",align_top:"En haut",align_baseline:"Normal",align:"Alignement",hspace:"Espacement horizontal",vspace:"Espacement vertical",dimensions:"Dimensions",border:"Bordure",list:"Liste d\'images",alt:"Description de l\'image",src:"URL de l\'image",dialog_title:"Ins\u00e9rer / \u00e9diter une image",missing_alt:"\u00cates-vous s\u00fbr de vouloir continuer sans d\u00e9finir de description pour l\'image ? Sans elle, l\'image peut ne pas \u00eatre accessible \u00e0 certains utilisateurs handicap\u00e9s, ceux utilisant un navigateur texte ou ceux qui naviguent sans affichage des images.",example_img:"Apparence de l\'image",misc:"Divers",mouseout:"\u00e0 la sortie de la souris",mouseover:"au survol de la souris",alt_image:"Image alternative",swap_image:"Image de remplacement",map:"Image cliquable",id:"Id",rtl:"De droite \u00e0 gauche",ltr:"De gauche \u00e0 droite",classes:"Classes",style:"Style",long_desc:"Description longue du lien",langcode:"Code de la langue",langdir:"Sens de lecture",constrain_proportions:"Conserver les proportions",preview:"Pr\u00e9visualisation",title:"Titre",general:"G\u00e9n\u00e9ral",tab_advanced:"Avanc\u00e9",tab_appearance:"Apparence",tab_general:"G\u00e9n\u00e9ral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/gl_dlg.js b/js/tiny_mce/plugins/advimage/langs/gl_dlg.js new file mode 100755 index 000000000..83fbb83ea --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.advimage_dlg',{image_list:"Lista de imaxes",align_right:"Dereita",align_left:"Esquerda",align_textbottom:"Texto abaixo",align_texttop:"Texto arriba",align_bottom:"Abaixo",align_middle:"Medio",align_top:"Arriba",align_baseline:"Li\u00f1a base",align:"Ali\u00f1amento",hspace:"Espacio horizontal",vspace:"Espacio vertical",dimensions:"Dimensi\u00f3ns",border:"Bordes",list:"Lista de imaxes",alt:"Descripci\u00f3n da imaxe",src:"URL da imaxe",dialog_title:"Insertar/editar imaxe",missing_alt:"\u00bfEsta seguro de continuar sen introducir unha descripci\u00f3n \u00e1 imaxe? Sen ela pode non ser accesible pra usuarios con discapacidades, ou pra aqueles que usen navegadores de modo texto, ou te\u00f1an deshabilitadas as imaxes da p\u00e1xina.",example_img:"Vista previa da imaxe",misc:"Miscel\u00e1neo",mouseout:"pra mouseout",mouseover:"pra mouseover",alt_image:"Imaxe alternativa",swap_image:"Intercambiar imaxe",map:"Mapa de imaxe",id:"Id",rtl:"Dereita a esquerda",ltr:"Esquerda a dereita",classes:"Clases",style:"Estilos",long_desc:"V\u00ednculo pra descripci\u00f3n larga",langcode:"C\u00f3digo do idioma",langdir:"Direcci\u00f3n do idioma",constrain_proportions:"Bloquear proporci\u00f3ns",preview:"Vista previa",title:"T\u00edtulo",general:"Xeral",tab_advanced:"Avanzado",tab_appearance:"Apariencia",tab_general:"Xeral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/gu_dlg.js b/js/tiny_mce/plugins/advimage/langs/gu_dlg.js new file mode 100755 index 000000000..bbceb8c14 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/he_dlg.js b/js/tiny_mce/plugins/advimage/langs/he_dlg.js new file mode 100755 index 000000000..834d4680a --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.advimage_dlg',{image_list:"\u05e8\u05e9\u05d9\u05de\u05ea \u05ea\u05de\u05d5\u05e0\u05d5\u05ea",align_right:"\u05dc\u05d9\u05de\u05d9\u05df",align_left:"\u05dc\u05e9\u05de\u05d0\u05dc",align_textbottom:"\u05d8\u05e7\u05e1\u05d8 \u05ea\u05d7\u05ea\u05d5\u05df",align_texttop:"\u05d8\u05e7\u05e1\u05d8 \u05e2\u05dc\u05d9\u05d5\u05df",align_bottom:"\u05ea\u05d7\u05ea\u05d9\u05ea",align_middle:"\u05d0\u05de\u05e6\u05e2",align_top:"\u05e2\u05dc\u05d9\u05d5\u05df",align_baseline:"\u05e7\u05d5 \u05d1\u05e1\u05d9\u05e1\u05d9",align:"\u05d9\u05e9\u05d5\u05e8",hspace:"\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9",vspace:"\u05e7\u05d5 \u05d0\u05e0\u05db\u05d9",dimensions:"\u05de\u05d9\u05de\u05d3\u05d9\u05dd",border:"\u05d2\u05d1\u05d5\u05dc",list:"\u05e8\u05e9\u05d9\u05de\u05ea \u05ea\u05de\u05d5\u05e0\u05d5\u05ea",alt:"\u05ea\u05d9\u05d0\u05d5\u05e8 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4",src:"URL \u05e9\u05dc \u05d4\u05ea\u05de\u05d5\u05e0\u05d4",dialog_title:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05ea\u05de\u05d5\u05e0\u05d4",missing_alt:"\u05dc\u05d4\u05de\u05e9\u05d9\u05da \u05de\u05d1\u05dc\u05d9 \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05ea\u05d9\u05d0\u05d5\u05e8 \u05dc\u05ea\u05de\u05d5\u05e0\u05d4?",example_img:"\u05ea\u05e6\u05d5\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4 \u05e9\u05dc \u05d4\u05ea\u05de\u05d5\u05e0\u05d4",misc:"\u05e9\u05d5\u05e0\u05d5\u05ea",mouseout:"\u05d4\u05e1\u05de\u05df \u05e2\u05d1\u05e8 \u05d0\u05ea \u05d4\u05ea\u05de\u05d5\u05e0\u05d4",mouseover:"\u05d1\u05e2\u05ea \u05de\u05e2\u05d1\u05e8 \u05d4\u05e1\u05de\u05df \u05e2\u05dc \u05d4\u05ea\u05de\u05d5\u05e0\u05d4",alt_image:"\u05ea\u05de\u05d5\u05e0\u05d4 \u05d7\u05dc\u05d9\u05e4\u05d9\u05ea",swap_image:"\u05d4\u05d7\u05dc\u05e4\u05ea \u05ea\u05de\u05d5\u05e0\u05d4",map:"Image map",id:"Id",rtl:"\u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc",ltr:"\u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df",classes:"Classes",style:"\u05e1\u05d2\u05e0\u05d5\u05df",long_desc:"\u05ea\u05d9\u05d0\u05d5\u05e8 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d0\u05e8\u05d5\u05da",langcode:"\u05e7\u05d5\u05d3 \u05d4\u05e9\u05e4\u05d4",langdir:"\u05db\u05d9\u05d5\u05d5\u05df \u05d4\u05e9\u05e4\u05d4",constrain_proportions:"\u05e9\u05de\u05d9\u05e8\u05d4 \u05e2\u05dc \u05e4\u05e8\u05d5\u05e4\u05d5\u05e8\u05e6\u05d9\u05d5\u05ea",preview:"\u05ea\u05e6\u05d5\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4",title:"\u05db\u05d5\u05ea\u05e8\u05ea",general:"\u05db\u05dc\u05dc\u05d9",tab_advanced:"\u05de\u05ea\u05e7\u05d3\u05dd",tab_appearance:"\u05de\u05e8\u05d0\u05d4",tab_general:"\u05db\u05dc\u05dc\u05d9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/hi_dlg.js b/js/tiny_mce/plugins/advimage/langs/hi_dlg.js new file mode 100755 index 000000000..288201b47 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/hr_dlg.js b/js/tiny_mce/plugins/advimage/langs/hr_dlg.js new file mode 100755 index 000000000..8b0ac01d6 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.advimage_dlg',{image_list:"Lista slika",align_right:"Desno",align_left:"Lijevo",align_textbottom:"Dno teksta",align_texttop:"Vrh teksta",align_bottom:"Dno",align_middle:"Sredina",align_top:"Vrh",align_baseline:"Osnovna linija",align:"Poravnavanje",hspace:"Vodoravni razmak",vspace:"Okomiti razmak",dimensions:"Dimenzije",border:"Obrub",list:"Lista slika",alt:"Opis slike",src:"URL slike",dialog_title:"Umetni/uredi sliku",missing_alt:"Jeste li sigurni da \u017eelite izostaviti opis slike? Slika mo\u017ee biti nedostupna ljudima s pote\u0161ko\u0107ama ili onima koji koriste preglednike bez prikaza slika.",example_img:"Prikaz slike",misc:"Razno",mouseout:"za izlazak mi\u0161a van slike",mouseover:"za prelazak mi\u0161a preko slike",alt_image:"Alternativna slika",swap_image:"Izmjenjiva slika",map:"Karta slike",id:"Id",rtl:"S desna na lijevo",ltr:"S lijeva na desno",classes:"Klase",style:"Stil",long_desc:"Poveznica dugog opisa",langcode:"Kod jezika",langdir:"Smjer jezika",constrain_proportions:"Zadr\u017ei proporcije",preview:"Prikaz",title:"Naslov",general:"Osnovno",tab_advanced:"Napredno",tab_appearance:"Izgled",tab_general:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/hu_dlg.js b/js/tiny_mce/plugins/advimage/langs/hu_dlg.js new file mode 100755 index 000000000..98768e2d0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.advimage_dlg',{"image_list":"K\u00e9plista","align_right":"Jobbra","align_left":"Balra","align_textbottom":"Sz\u00f6veg alj\u00e1hoz","align_texttop":"Sz\u00f6veg tetej\u00e9hez","align_bottom":"Lentre","align_middle":"K\u00f6z\u00e9pre","align_top":"Fentre","align_baseline":"Alapvonalhoz",align:"Igaz\u00edt\u00e1s",hspace:"V\u00edzszintes t\u00e1vols\u00e1g",vspace:"F\u00fcgg\u0151leges t\u00e1vols\u00e1g",dimensions:"Dimenzi\u00f3k",border:"Keret",list:"K\u00e9plista",alt:"K\u00e9p helyettes\u00edt\u0151 sz\u00f6vege",src:"K\u00e9p URL","dialog_title":"K\u00e9p besz\u00far\u00e1s/szerkeszt\u00e9s","missing_alt":"Biztosan folytatja helyettes\u00edt\u0151 sz\u00f6veg n\u00e9lk\u00fcl? En\u00e9lk\u00fcl a korl\u00e1toz\u00e1ssal \u00e9l\u0151k, sz\u00f6veges b\u00f6ng\u00e9sz\u0151t haszn\u00e1l\u00f3k \u00e9s a k\u00e9pek megjelen\u00edt\u00e9s\u00e9t letilt\u00f3 felhaszn\u00e1l\u00f3k h\u00e1tr\u00e1nyban lesznek.","example_img":"El\u0151n\u00e9zeti k\u00e9p",misc:"Vegyes",mouseout:"K\u00e9p az eg\u00e9rkurzor lev\u00e9telekor",mouseover:"K\u00e9p az eg\u00e9rkurzor f\u00f6l\u00e9vitelekor","alt_image":"Alternat\u00edv k\u00e9p","swap_image":"K\u00e9pcsere",map:"K\u00e9p t\u00e9rk\u00e9p",id:"Id",rtl:"Jobbr\u00f3l balra",ltr:"Balr\u00f3l jobbra",classes:"Class-ok",style:"Style","long_desc":"B\u0151vebb le\u00edr\u00e1s link",langcode:"Nyelv k\u00f3d",langdir:"Nyelv \u00edr\u00e1s ir\u00e1ny","constrain_proportions":"Ar\u00e1nytart\u00e1s",preview:"El\u0151n\u00e9zet",title:"C\u00edm",general:"\u00c1ltal\u00e1nos","tab_advanced":"Halad\u00f3","tab_appearance":"Megjelen\u00e9s","tab_general":"\u00c1ltal\u00e1nos"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/hy_dlg.js b/js/tiny_mce/plugins/advimage/langs/hy_dlg.js new file mode 100755 index 000000000..e4b15a96e --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.advimage_dlg',{image_list:"\u0546\u056f\u0561\u0580\u0576\u0565\u0580\u056b \u0581\u0561\u0576\u056f",align_right:"\u0538\u057d\u057f \u0561\u057b \u0565\u0566\u0580\u056b",align_left:"\u0538\u057d\u057f \u0571\u0561\u056d \u0565\u0566\u0580\u056b",align_textbottom:"\u0538\u057d\u057f \u057f\u0565\u0584\u057d\u057f\u056b \u057d\u057f\u0578\u0580\u056b\u0576 \u0565\u0566\u0580\u056b",align_texttop:"\u0538\u057d\u057f \u057f\u0565\u0584\u057d\u057f\u056b \u057e\u0565\u0580\u056b\u0576 \u0565\u0566\u0580\u056b",align_bottom:"\u0538\u057d\u057f \u057d\u057f\u0578\u0580\u056b\u0576 \u0565\u0566\u0580\u056b",align_middle:"\u053f\u0565\u0576\u057f\u0580\u0578\u0576\u0561\u0581\u0576\u0565\u056c",align_top:"\u0538\u057d\u057f \u057e\u0565\u0580\u056b \u0565\u0566\u0580\u056b",align_baseline:"\u0538\u057d\u057f \u0562\u0561\u0566\u0561\u0575\u056b\u0576 \u0563\u056e\u056b",align:"\u0540\u0561\u057e\u0561\u057d\u0561\u0580\u0565\u0581\u0578\u0582\u0574",hspace:"\u0540\u0578\u0580\u056b\u0566. \u0570\u0565\u057c\u0561\u0581\u0578\u0582\u0574",vspace:"\u0548\u0582\u0572\u0572. \u0570\u0565\u057c\u0561\u0581\u0578\u0582\u0574",dimensions:"\u0549\u0561\u0583\u057d\u0565\u0580",border:"\u0535\u0566\u0580",list:"\u0546\u056f\u0561\u0580\u0576\u0565\u0580\u056b \u0581\u0561\u0576\u056f",alt:"\u0546\u056f\u0561\u0580\u0561\u0563\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576",src:"\u0546\u056f\u0561\u0580\u056b \u0570\u0561\u057d\u0581\u0565",dialog_title:"\u0531\u057e\u0565\u056c\u0561\u0581\u0576\u0565\u056c / \u0583\u0578\u0583\u0578\u056d\u0565\u056c \u0576\u056f\u0561\u0580",missing_alt:"\u0534\u0578\u0582\u0584 \u056b\u0580\u0578\u055e\u0584 \u0579\u0565\u0584 \u0581\u0561\u0576\u056f\u0561\u0576\u0578\u0582\u0574 \u0576\u056f\u0561\u0580\u0561\u0563\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576 \u0576\u0565\u0580\u0561\u057c\u0565\u056c\u0589",example_img:"\u0546\u056f\u0561\u0580\u056b \u0564\u056b\u057f\u0574\u0561\u0576 \u057f\u0565\u057d\u0584",misc:"\u0531\u0575\u056c",mouseout:"\u0570\u0565\u057c\u0561\u0581\u0574\u0561\u0576 \u057a\u0561\u0570\u056b\u0576",mouseover:"\u0544\u0578\u057f\u0565\u0581\u0574\u0561\u0576 \u057a\u0561\u0570\u056b\u0576",alt_image:"\u0531\u056c\u057f\u0565\u0580\u0576\u0561\u057f\u056b\u057e \u0576\u056f\u0561\u0580",swap_image:"Swap",map:"\u0546\u056f\u0561\u0580\u056b map",id:"Id",rtl:"\u0531\u057b\u056b\u0581 \u0571\u0561\u056d",ltr:"\u0541\u0561\u056d\u056b\u0581 \u0561\u057b",classes:"\u0534\u0561\u057d\u0565\u0580",style:"\u0548\u0573",long_desc:"\u0544\u0561\u0576\u0580\u0561\u0574\u0561\u057d\u0576 \u0562\u0561\u0581\u0561\u057f\u0580\u0578\u0582\u0569\u0575\u0561\u0576 \u0570\u0572\u0578\u0582\u0574",langcode:"\u053c\u0565\u0566\u057e\u056b \u056f\u0578\u0564",langdir:"\u053c\u0565\u0566\u057e\u056b \u0578\u0582\u0572\u0572\u057e\u0561\u056e\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568",constrain_proportions:"\u054a\u0561\u0570\u057a\u0561\u0576\u0565\u056c \u0579\u0561\u0583\u0565\u0580\u056b \u0570\u0561\u0580\u0561\u0562\u0565\u0580\u0561\u056f\u0581\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568",preview:"\u0546\u0561\u056d\u0561\u0564\u056b\u057f\u0578\u0582\u0574",title:"\u054e\u0565\u0580\u0576\u0561\u0563\u056b\u0580",general:"\u0540\u056b\u0574\u0576\u0561\u056f\u0561\u0576",tab_advanced:"\u053c\u0580\u0561\u0581\u0578\u0582\u0581\u056b\u0579",tab_appearance:"\u054f\u0565\u057d\u0584",tab_general:"\u0540\u056b\u0574\u0576\u0561\u056f\u0561\u0576"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ia_dlg.js b/js/tiny_mce/plugins/advimage/langs/ia_dlg.js new file mode 100755 index 000000000..62229ec04 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.advimage_dlg',{image_list:"\u56fe\u7247\u6e05\u5355",align_right:"\u5c45\u53f3",align_left:"\u5c45\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u5e95\u90e8",align_middle:"\u4e2d\u90e8",align_top:"\u9876\u90e8",align_baseline:"\u57fa\u7ebf",align:"\u5bf9\u9f50\u65b9\u5f0f",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u6e05\u5355",alt:"\u56fe\u7247\u8bf4\u660e",src:"\u56fe\u7247\u5730\u5740",dialog_title:"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247",missing_alt:" \u662f\u5426\u4e0d\u4e3a\u56fe\u7247\u52a0\u5165\u8bf4\u660e\u6587\u5b57\uff0c\u5982\u679c\u4e0d\u52a0\u5165\u8bf4\u660e\u6587\u5b57\uff0c\u5c06\u5bfc\u81f4\u4e0d\u652f\u6301\u56fe\u7247\u7684\u6d4f\u89c8\u5668\u5ffd\u7565\u672c\u5185\u5bb9",example_img:"\u9884\u89c8\u56fe\u7247",misc:"\u5176\u5b83",mouseout:"\u9f20\u6807\u79fb\u51fa",mouseover:"\u9f20\u6807\u5212\u8fc7",alt_image:"\u4ea4\u66ff\u56fe\u7247",swap_image:"\u5207\u6362\u56fe\u7247",map:"\u56fe\u7247\u70ed\u70b9",id:"Id",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",classes:"\u6837\u5f0f\u7c7b",style:"\u6837\u5f0f",long_desc:"\u63cf\u8ff0",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u67e5\u627e",general:"\u57fa\u672c",tab_advanced:"\u9ad8\u7ea7",tab_appearance:"\u5916\u89c2",tab_general:"\u57fa\u672c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/id_dlg.js b/js/tiny_mce/plugins/advimage/langs/id_dlg.js new file mode 100755 index 000000000..560b25441 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.advimage_dlg',{image_list:"Daftar Gambar",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensi",border:"Border",list:"Daftar Gambar",alt:"Deskripsi Gambar",src:"URL Gambar",dialog_title:"sisipkan/Ubah Gambar",missing_alt:"Yakin ingin melanjutkan tanpa menyertakan deskripsi gambar? Gambar mungkin tidak dapat diakses oleh beberapa pengguna yang yang memiliki keterbatasan, atau mereka yang menggunakan modus teks browser, atau berselancar di Web dengan gambar dimatikan.",example_img:"Gambar pra-tampil",misc:"Rupa-rupa",mouseout:"untuk mouse out",mouseover:"untuk mouse over",alt_image:"Alternatif gambar",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Kanan ke kiri",ltr:"Kiri ke kanan",classes:"Classes",style:"Style",long_desc:"Deskripsi panjang link",langcode:"Kode bahasa",langdir:"Bahasa",constrain_proportions:"Proporsi dibatasi",preview:"Preview",title:"Judul",general:"Umun",tab_advanced:"Advanced",tab_appearance:"Tampilan",tab_general:"Umum"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/is_dlg.js b/js/tiny_mce/plugins/advimage/langs/is_dlg.js new file mode 100755 index 000000000..e396e06ef --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"J\u00f6fnun",hspace:"L\u00e1r\u00e9tt loftun",vspace:"L\u00f3\u00f0r\u00e9tt loftun",dimensions:"St\u00e6r\u00f0ir",border:"Rammi",list:"Myndalisti",alt:"L\u00fdsing",src:"Sl\u00f3\u00f0 \u00e1 mynd",dialog_title:"Setja inn/breyta mynd",missing_alt:"Ertu viss um a\u00f0 halda \u00e1fram \u00e1n l\u00fdsingu myndar? \u00c1n hennar er myndin \u00f3a\u00f0genginleg fyrir suma notendur me\u00f0 skj\u00e1lesara, texta vafra e\u00f0a me\u00f0 sl\u00f6kkt \u00e1 birtingu mynda \u00ed vafranum s\u00ednum.",example_img:"Birting prufumyndar",misc:"\u00ddmislegt",mouseout:"\u00feegar m\u00fas fer af",mouseover:"\u00feegar m\u00fas er yfir",alt_image:"\u00d6nnur mynd",swap_image:"Skipta mynd \u00fat",map:"Image map",id:"Id",rtl:"H\u00e6gri til vinstri",ltr:"Vinstri til h\u00e6gri",classes:"Klasar",style:"St\u00edll",long_desc:"L\u00f6ng l\u00fdsing \u00e1 hlekki",langcode:"K\u00f3\u00f0i tungum\u00e1ls",langdir:"\u00c1tt tungum\u00e1ls",constrain_proportions:"Halda hlutf\u00f6llum",preview:"Forsko\u00f0un",title:"Titill",general:"Almennt",tab_advanced:"N\u00e1nar",tab_appearance:"\u00datlit",tab_general:"Almennt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/it_dlg.js b/js/tiny_mce/plugins/advimage/langs/it_dlg.js new file mode 100755 index 000000000..79c8e873f --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.advimage_dlg',{image_list:"Lista immagini",align_right:"A destra",align_left:"A sinistra",align_textbottom:"In basso al testo",align_texttop:"In alto al testo",align_bottom:"In basso",align_middle:"In mezzo",align_top:"In alto",align_baseline:"Alla base",align:"Allineamento",hspace:"Spaziatura orizzontale",vspace:"Spaziatura verticale",dimensions:"Dimensioni",border:"Bordo",list:"Lista immagini",alt:"Descrizione immagine",src:"URL immagine",dialog_title:"Inserisci/modifica immagine",missing_alt:"Sicuro di continuare senza includere una descrizione dell\'immagine? Senza di essa l\'immagine pu\u00f2 non essere accessibile ad alcuni utenti con disabilit\u00e0, o per coloro che usano un browser testuale oppure che hanno disabilitato la visualizzazione delle immagini nel loro browser.",example_img:"Anteprima aspetto immagine",misc:"Impostazioni varie",mouseout:"quando mouse fuori",mouseover:"quando mouse sopra",alt_image:"Immagine alternativa",swap_image:"Sostituisci immagine",map:"Immagine come mappa",id:"Id",rtl:"Destra verso sinistraa",ltr:"Sinistra verso destra",classes:"Classe",style:"Stile",long_desc:"Descrizione del collegamento",langcode:"codice lingua",langdir:"Direzione testo",constrain_proportions:"Mantieni proporzioni",preview:"Anteprima",title:"Titolo",general:"Generale",tab_advanced:"Avanzate",tab_appearance:"Aspetto",tab_general:"Generale"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ja_dlg.js b/js/tiny_mce/plugins/advimage/langs/ja_dlg.js new file mode 100755 index 000000000..28d5f859d --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.advimage_dlg',{"image_list":"\u4e00\u89a7\u304b\u3089\u9078\u3076","align_right":"Right","align_left":"Left","align_textbottom":"Text bottom","align_texttop":"Text top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"\u914d\u7f6e",hspace:"\u5de6\u53f3\u4f59\u767d",vspace:"\u4e0a\u4e0b\u4f59\u767d",dimensions:"\u30b5\u30a4\u30ba",border:"\u67a0\u7dda",list:"\u4e00\u89a7\u304b\u3089\u9078\u3076",alt:"\u753b\u50cf\u306e\u8aac\u660e",src:"\u753b\u50cfURL","dialog_title":"\u753b\u50cf\u306e\u633f\u5165/\u7de8\u96c6","missing_alt":"\u753b\u50cf\u306e\u8aac\u660e\u6587\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u76ee\u306e\u4e0d\u81ea\u7531\u306a\u65b9\u3084\u30c6\u30ad\u30b9\u30c8\u30d6\u30e9\u30a6\u30b6\u3092\u5229\u7528\u3055\u308c\u3066\u3044\u308b\u65b9\u3078\u914d\u616e\u3057\u3001\u753b\u50cf\u8aac\u660e\u3092\u5165\u529b\u3059\u308b\u3053\u3068\u3092\u304a\u85a6\u3081\u3057\u307e\u3059\u3002","example_img":"Appearance preview image",misc:"\u305d\u306e\u4ed6",mouseout:"\u30de\u30a6\u30b9\u30a2\u30a6\u30c8\u6642",mouseover:"\u30de\u30a6\u30b9\u30aa\u30fc\u30d0\u30fc\u6642","alt_image":"\u753b\u50cf\u5207\u66ff\u3092\u884c\u3046","swap_image":"\u30ed\u30fc\u30eb\u30aa\u30fc\u30d0\u30fc\u52b9\u679c",map:"\u30a4\u30e1\u30fc\u30b8\u30de\u30c3\u30d7",id:"Id",rtl:"\u53f3\u304b\u3089\u5de6",ltr:"\u5de6\u304b\u3089\u53f3",classes:"\u30af\u30e9\u30b9",style:"\u30b9\u30bf\u30a4\u30eb","long_desc":"\u8a73\u7d30\u8aac\u660e\u30ea\u30f3\u30af",langcode:"\u8a00\u8a9e\u30b3\u30fc\u30c9",langdir:"\u6587\u7ae0\u306e\u65b9\u5411","constrain_proportions":"\u7e26\u6a2a\u6bd4\u306e\u4fdd\u5b58",preview:"\u30d7\u30ec\u30d3\u30e5\u30fc",title:"\u30bf\u30a4\u30c8\u30eb",general:"\u4e00\u822c","tab_advanced":"\u9ad8\u5ea6\u306a\u8a2d\u5b9a","tab_appearance":"\u8868\u793a","tab_general":"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ka_dlg.js b/js/tiny_mce/plugins/advimage/langs/ka_dlg.js new file mode 100755 index 000000000..c29f0483c --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.advimage_dlg',{image_list:"\u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d4\u10d1\u10d8\u10e1 \u10e1\u10d8\u10d0",align_right:"\u10db\u10d0\u10e0\u10ef\u10d5\u10d4\u10dc\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_left:"\u10db\u10d0\u10e0\u10ea\u10ee\u10d4\u10dc\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_textbottom:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10e5\u10d5\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_texttop:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10d6\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_bottom:"\u10e5\u10d5\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_middle:"\u10ea\u10d4\u10dc\u10e2\u10e0\u10d6\u10d4",align_top:"\u10d6\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_baseline:"\u10e1\u10d0\u10d1\u10d0\u10d6\u10d8\u10e1\u10dd \u10ee\u10d0\u10d6\u10d6\u10d4",align:"\u10db\u10dd\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",hspace:"\u10f0\u10dd\u10e0\u10d8\u10d6\u10dd\u10dc\u10e2. \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",vspace:"\u10d5\u10d4\u10e0\u10e2. \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",dimensions:"\u10d6\u10dd\u10db\u10d4\u10d1\u10d8",border:"\u10e9\u10d0\u10e0\u10e9\u10dd",list:"\u10e1\u10d8\u10d0",alt:"\u10d0\u10e6\u10ec\u10d4\u10e0\u10d0",src:"\u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8",dialog_title:"\u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",missing_alt:"\u10d0\u10e0 \u10d2\u10e1\u10e3\u10e0\u10d7 \u10d0\u10e6\u10ec\u10d4\u10e0\u10d8\u10e1 \u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d0? \u10d0\u10e6\u10ec\u10d4\u10e0\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10e1\u10e3\u10e0\u10d0\u10d7\u10d8 \u10e8\u10d4\u10d8\u10eb\u10da\u10d4\u10d1\u10d0 \u10d6\u10dd\u10d2\u10d8 \u10db\u10dc\u10d0\u10ee\u10d5\u10d4\u10da\u10d8\u10e1\u10d7\u10d5\u10d8\u10e1 \u10d8\u10e7\u10dd\u10e1 \u10db\u10d8\u10e3\u10ec\u10d5\u10d3\u10dd\u10db\u10d4\u10da\u10d8.",example_img:"\u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",misc:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7\u10d8 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",mouseout:"\u10e1\u10d8\u10db\u10e8\u10d5\u10d8\u10d3\u10d4\u10e8\u10d8",mouseover:"\u10d9\u10e3\u10e0\u10e1\u10dd\u10e0\u10d8\u10e1 \u10db\u10d8\u10e7\u10d5\u10d0\u10dc\u10d8\u10e1\u10d0\u10e1",alt_image:"\u10d0\u10da\u10e2\u10d4\u10e0\u10dc\u10d0\u10e2\u10d8\u10e3\u10da\u10d8 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d0",swap_image:"\u10d3\u10d8\u10dc\u10d0\u10db\u10d8\u10e3\u10e0\u10d8 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d0",map:"\u10d1\u10db\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10e0\u10e3\u10e5\u10d0",id:"\u10d4\u10da\u10d4\u10db\u10d4\u10dc\u10e2\u10d8\u10e1 \u10e1\u10d0\u10ee\u10d4\u10da\u10ec\u10dd\u10d3\u10d4\u10d1\u10d0",rtl:"\u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ea\u10e1\u10dc\u10d8\u10d5",ltr:"\u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d5",classes:"\u10d9\u10da\u10d0\u10e1\u10d4\u10d1\u10d8",style:"\u10e1\u10e2\u10d8\u10da\u10d8",long_desc:"\u10d1\u10db\u10e3\u10da\u10d8 \u10e1\u10e0\u10e3\u10da \u10d0\u10e6\u10ec\u10d4\u10e0\u10d0\u10d6\u10d4",langcode:"\u10d4\u10dc\u10d8\u10e1 \u10d9\u10dd\u10d3\u10d8",langdir:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10db\u10d8\u10db\u10d0\u10e0\u10d7\u10e3\u10da\u10d4\u10d1\u10d0",constrain_proportions:"\u10de\u10e0\u10dd\u10de\u10dd\u10e0\u10ea\u10d8\u10d4\u10d1\u10d8\u10e1 \u10e8\u10d4\u10dc\u10d0\u10ee\u10d5\u10d0",preview:"\u10ec\u10d8\u10dc\u10d0\u10e1\u10ec\u10d0\u10e0 \u10d3\u10d0\u10d7\u10d5\u10d0\u10da\u10d8\u10d4\u10e0\u10d4\u10d1\u10d0",title:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",general:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",tab_advanced:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7",tab_appearance:"\u10db\u10d3\u10d2\u10dd\u10db\u10d0\u10e0\u10d4\u10dd\u10d1\u10d0",tab_general:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/kl_dlg.js b/js/tiny_mce/plugins/advimage/langs/kl_dlg.js new file mode 100755 index 000000000..c2b9b0d54 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/km_dlg.js b/js/tiny_mce/plugins/advimage/langs/km_dlg.js new file mode 100755 index 000000000..6a788bcf5 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.advimage_dlg',{image_list:"\u1794\u1789\u17d2\u1787\u17b8\u179a\u17bc\u1794\u1797\u17b6\u1796",align_right:"\u179f\u17d2\u178f\u17b6\u17c6",align_left:"\u1786\u17d2\u179c\u17c1\u1784",align_textbottom:"\u1780\u17d2\u179a\u17c4\u1798\u17a2\u178f\u17d2\u1790\u1794\u1791",align_texttop:"\u179b\u17be\u17a2\u178f\u17d2\u1790\u1794\u1791",align_bottom:"\u1780\u17d2\u179a\u17c4\u1798",align_middle:"\u1780\u178e\u17d2\u178f\u17b6\u179b",align_top:"\u179b\u17be",align_baseline:"\u1781\u17d2\u179f\u17c2\u1782\u17c4\u179b",align:"\u1780\u17b6\u179a\u178f\u1798\u17d2\u179a\u17b9\u1798",hspace:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1795\u17d2\u178f\u17c1\u1780",vspace:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1794\u1789\u17d2\u1788\u179a",dimensions:"\u179c\u17b7\u1798\u17b6\u178f\u17d2\u179a",border:"\u179f\u17ca\u17bb\u1798",list:"\u1794\u1789\u17d2\u1787\u17b8\u179a\u17bc\u1794\u1797\u17b6\u1796",alt:"\u1796\u17b7\u1796\u178e\u17cc\u1793\u17b6\u179a\u17bc\u1794\u1797\u17b6\u1796",src:"\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793URL\u179a\u17bc\u1794\u1797\u17b6\u1796",dialog_title:"\u1794\u1789\u17d2\u1785\u17bc\u179b/\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u179a\u17bc\u1794\u1797\u17b6\u1796",missing_alt:"\u178f\u17be\u17a2\u17d2\u1793\u1780\u1796\u17b7\u178f\u1787\u17b6\u1785\u1784\u17cb\u1794\u1793\u17d2\u178f\u179a\u178a\u17c4\u1799\u1798\u17b7\u1793\u1794\u17b6\u1793\u1794\u1789\u17d2\u1785\u17bc\u179b\u1780\u17b6\u179a\u1796\u17b7\u1796\u178e\u17cc\u1793\u17b6\u179a\u17bc\u1794\u1797\u17b6\u1796\u17ac? \u1794\u17be\u1798\u17b7\u1793\u1798\u17b6\u1793\u17a2\u178f\u17d2\u1790\u1794\u1791\u1796\u178e\u17cc\u1793\u17b6\u1791\u17c1 \u17a2\u17d2\u1793\u1780\u1794\u17d2\u179a\u17be\u1798\u17bd\u1799\u1785\u17c6\u1793\u17bd\u1793\u178a\u17c2\u179b\u1787\u17b6\u1787\u1793\u17a2\u179f\u1798\u178f\u17d2\u178f\u1797\u17b6\u1796 \u17ac\u1780\u17cf\u17a2\u17d2\u1793\u1780\u1794\u17d2\u179a\u17be\u17a7\u1794\u1780\u179a\u178e\u17cd\u179a\u17bb\u1780\u179a\u1780\u178f\u17c2\u17a2\u178f\u17d2\u1790\u1794\u1791 \u1793\u17b7\u1784\u17a2\u17d2\u1793\u1780\u178a\u17c2\u179b\u179a\u1780\u1798\u17be\u179b\u179b\u17be\u1794\u178e\u17d2\u178f\u17b6\u1789\u178a\u17c4\u1799\u1794\u17b7\u1791\u179a\u17bc\u1794\u1797\u17b6\u1796 \u1793\u17b9\u1784\u1798\u17b7\u1793\u17a2\u17b6\u1785\u1798\u17be\u179b\u1783\u17be\u1789\u179a\u17bc\u1794\u1797\u17b6\u1796\u1793\u17c1\u17c7\u1794\u17b6\u1793\u17a1\u17be\u1799\u17d4",example_img:"\u1798\u17be\u179b\u179a\u17bc\u1794\u179a\u17b6\u1784\u179a\u17bc\u1794\u1797\u17b6\u1796\u1787\u17b6\u1798\u17bb\u1793",misc:"\u1795\u17d2\u179f\u17c1\u1784\u17d7",mouseout:"\u1780\u178e\u17d2\u178f\u17bb\u179a\u1785\u17c1\u1789\u1780\u17d2\u179a\u17c5",mouseover:"\u1780\u178e\u17d2\u178f\u17bb\u179a\u178a\u17b6\u1780\u17cb\u179b\u17be",alt_image:"\u179a\u17bc\u1794\u1797\u17b6\u1796\u1787\u17c6\u1793\u17bd\u179f",swap_image:"\u179a\u17bc\u1794\u1797\u17b6\u1796\u1794\u17d2\u178a\u17bc\u179a",map:"\u1795\u17c2\u1793\u1791\u17b8\u179a\u17bc\u1794\u1797\u17b6\u1796",id:"\u179b.\u179f.",rtl:"\u1796\u17b8\u179f\u17d2\u178f\u17b6\u17c6\u1791\u17c5\u1786\u17d2\u179c\u17c1\u1784",ltr:"\u1796\u17b8\u1786\u17d2\u179c\u17c1\u1784\u1791\u17c5\u179f\u17d2\u178f\u17b6\u17c6",classes:"\u1790\u17d2\u1793\u17b6\u1780\u17cb",style:"\u179a\u1785\u1793\u17b6\u1794\u17d2\u1798\u17d0\u1791",long_desc:"\u1796\u17b7\u1796\u178e\u17cc\u1793\u17b6\u1796\u17b7\u179f\u17d2\u178f\u17b6\u179a\u178f\u17c6\u178e",langcode:"\u1780\u17bc\u178a\u1797\u17b6\u179f\u17b6",langdir:"\u1791\u17b7\u179f\u1797\u17b6\u179f\u17b6",constrain_proportions:"\u1794\u1784\u17d2\u1781\u17c6\u17b2\u17d2\u1799\u1798\u17b6\u1793\u179f\u1798\u17b6\u1798\u17b6\u178f\u17d2\u179a",preview:"\u1798\u17be\u179b\u1787\u17b6\u1798\u17bb\u1793",title:"\u1785\u17c6\u178e\u1784\u1787\u17be\u1784",general:"\u1791\u17bc\u1791\u17c5",tab_advanced:"\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb",tab_appearance:"\u179a\u17bc\u1794\u179a\u17b6\u1784",tab_general:"\u1791\u17bc\u1791\u17c5"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ko_dlg.js b/js/tiny_mce/plugins/advimage/langs/ko_dlg.js new file mode 100755 index 000000000..c3096d4f5 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.advimage_dlg',{image_list:"\uc774\ubbf8\uc9c0 \ubaa9\ub85d",align_right:"\uc6b0",align_left:"\uc88c",align_textbottom:"\ubb38\uc790\uc5f4 \uc544\ub798\ub85c",align_texttop:"\ubb38\uc790\uc5f4 \uc704\ub85c",align_bottom:"\ud558",align_middle:"\uc911\uc559",align_top:"\uc0c1",align_baseline:"\uae30\uc900\uc120",align:"\uc815\ub82c",hspace:"\uc88c\uc6b0 \uc5ec\ubc31",vspace:"\uc0c1\ud558 \uc5ec\ubc31",dimensions:"\ud06c\uae30",border:"\ud14c\ub450\ub9ac\uc120",list:"\uc774\ubbf8\uc9c0 \ubaa9\ub85d",alt:"\uc774\ubbf8\uc9c0 \uc124\uba85",src:"\uc774\ubbf8\uc9c0 URL",dialog_title:"\uc774\ubbf8\uc9c0\uc758 \uc0bd\uc785/\ud3b8\uc9d1",missing_alt:"\uc774\ubbf8\uc9c0 \uc124\uba85\uc774 \uc5c6\uc2b5\ub2c8\ub2e4\ub9cc \uc88b\uc2b5\ub2c8\uae4c? \uc774\ubbf8\uc9c0 \uc124\uba85\uc774 \uc5c6\ub294 \uacbd\uc6b0, \ub9f9\uc778\uc774\ub098 \ud14d\uc2a4\ud2b8 \ube0c\ub77c\uc6b0\uc800\ub97c \uc774\uc6a9\ud558\uace0 \uc788\ub294 \ubd84, \ub610 \uc774\ubbf8\uc9c0 \ud45c\uc2dc\ub97c OFF(\uc73c)\ub85c \ud558\uace0 \uc788\ub294 \uc720\uc800\uc758 \uc811\uadfc\uc131\uc774 \uc800\ud558\ub429\ub2c8\ub2e4.",example_img:"\ubbf8\ub9ac\ubcf4\uae30 \uc774\ubbf8\uc9c0",misc:"\uadf8 \uc678",mouseout:"\ub9c8\uc6b0\uc2a4 \uc544\uc6c3 \uc774\ubbf8\uc9c0",mouseover:"\ub9c8\uc6b0\uc2a4 \uc624\ubc84 \uc774\ubbf8\uc9c0",alt_image:"\ub300\uccb4 \uc774\ubbf8\uc9c0",swap_image:"\ub864 \uc624\ubc84 \ud6a8\uacfc",map:"\uc774\ubbf8\uc9c0 \ub9f5",id:"Id",rtl:"\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd",ltr:"\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd",classes:"\ud074\ub798\uc2a4",style:"\uc2a4\ud0c0\uc77c",long_desc:"\uc124\uba85 \ub9c1\ud06c",langcode:"\uc5b8\uc5b4 \ucf54\ub4dc",langdir:"\ubb38\uc790 \ubc29\ud5a5",constrain_proportions:"\uc885\ud6a1\ube44 \ubcf4\uc874",preview:"\ubbf8\ub9ac\ubcf4\uae30",title:"\uc81c\ubaa9",general:"\uc77c\ubc18",tab_advanced:"\uace0\uae09",tab_appearance:"\ud45c\uc2dc",tab_general:"\uc77c\ubc18"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/lb_dlg.js b/js/tiny_mce/plugins/advimage/langs/lb_dlg.js new file mode 100755 index 000000000..809f7adc0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.advimage_dlg',{image_list:"Billerl\u00ebscht",align_right:"Riets",align_left:"L\u00e9nks",align_textbottom:"\u00cbnnen am Text",align_texttop:"Uewen am Text",align_bottom:"\u00cbnnen",align_middle:"M\u00ebtteg",align_top:"Uewen",align_baseline:"Zeil",align:"Ausriichtung",hspace:"Horizontalen Ofstand",vspace:"Vertikalen Ofstand",dimensions:"Ausmoossen",border:"Rumm",list:"Billerl\u00ebschten",alt:"Beschreiwung",src:"Adress",dialog_title:"Bild af\u00fcgen/beaarbechten",missing_alt:"W\u00ebll Dir wierklech keng Beschreiwung aginn? Best\u00ebmmt Benotzer mat kierperlechen Aschr\u00e4nkungen k\u00ebnnen sou net dorop zougr\u00e4ifen, genau sou d\u00e9i, d\u00e9i een Textbrowser benotzen oder d\'Uweise vu Biller desaktiv\u00e9iert hunn.",example_img:"Ausgesinn vun der Virschau",misc:"Verschiddenes",mouseout:"bei kengem Mauskontakt",mouseover:"bei Mauskontakt",alt_image:"Alternativt Bild",swap_image:"Bild austauschen",map:"Image-Map",id:"ID",rtl:"Riets no l\u00e9nks",ltr:"L\u00e9nks no riets",classes:"Klassen",style:"Format",long_desc:"Ausf\u00e9ierlech Beschreiwung",langcode:"Sproochcode",langdir:"Schr\u00ebftrichtung",constrain_proportions:"S\u00e4iteverh\u00e4ltnis b\u00e4ibehalen",preview:"Virschau",title:"Titel",general:"Allgemeng",tab_advanced:"Erweidert",tab_appearance:"Ausgesinn",tab_general:"Allgemeng"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/lt_dlg.js b/js/tiny_mce/plugins/advimage/langs/lt_dlg.js new file mode 100755 index 000000000..af56c5a6f --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.advimage_dlg',{image_list:"Paveiksl\u0117li\u0173 s\u0105ra\u0161as",align_right:"De\u0161in\u0117je",align_left:"Kair\u0117je",align_textbottom:"Teksto apa\u010dioje",align_texttop:"Teksto vir\u0161uje",align_bottom:"Apa\u010dioje",align_middle:"Viduryje",align_top:"Vir\u0161uje",align_baseline:"Pradiniame ta\u0161ke",align:"Lygiavimas",hspace:"Horizontalus tarpas",vspace:"Vertikalus tarpas",dimensions:"I\u0161matavimai",border:"R\u0117melis",list:"Paveiksl\u0117li\u0173 s\u0105ra\u0161as",alt:"Paveiksl\u0117lio apra\u0161as",src:"Paveiksl\u0117lio URL adresas",dialog_title:"\u012eterpti/redaguoti paveiksl\u0117l\u012f",missing_alt:"Ar norite t\u0119sti ne\u012fved\u0119 paveiksl\u0117lio apra\u0161o? Be apra\u0161o jo neatpa\u017eins \u017emon\u0117s su negalia, tie kurie naudoja tekstines nar\u0161ykles, arba tie, kurie nar\u0161o internet\u0105 i\u0161jung\u0119 paveiksl\u0117li\u0173 rodym\u0105.",example_img:"I\u0161vaizdos per\u017ei\u016bros paveiksl\u0117lis",misc:"\u012evair\u016bs",mouseout:"nuvedant pel\u0119",mouseover:"u\u017evedant pele",alt_image:"Alternatyvus paveiksl\u0117lis",swap_image:"Sukeisti paveiksl\u0117l\u012f",map:"Paveiksl\u0117lio planas",id:"Id",rtl:"I\u0161 de\u0161in\u0117s \u012f kair\u0119",ltr:"I\u0161 kair\u0117s \u012f de\u0161in\u0119",classes:"Klas\u0117s",style:"Stilius",long_desc:"Ilgo apra\u0161o nuoroda",langcode:"Kalbos kodas",langdir:"Kalbos teksto kryptis",constrain_proportions:"Priverstin\u0117s proporcijos",preview:"Per\u017ei\u016bra",title:"Pavadinimas",general:"Bendra",tab_advanced:"I\u0161pl\u0117sta",tab_appearance:"I\u0161vaizda",tab_general:"Bendra"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/lv_dlg.js b/js/tiny_mce/plugins/advimage/langs/lv_dlg.js new file mode 100755 index 000000000..b4e6546e0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.advimage_dlg',{image_list:"Att\u0113lu saraksts",align_right:"Pa labi",align_left:"Pa kreisi",align_textbottom:"Teksta apak\u0161a",align_texttop:"Teksta aug\u0161a",align_bottom:"Apak\u0161a",align_middle:"Vidus",align_top:"Aug\u0161a",align_baseline:"Pati apak\u0161a",align:"Novietojums",hspace:"Horizont\u0101l\u0101 atstarpe",vspace:"Vertik\u0101l\u0101 atstarpe",dimensions:"Izm\u0113ri",border:"Apmale",list:"Att\u0113lu saraksts",alt:"Att\u0113la apraksts",src:"Att\u0113la URL",dialog_title:"Ievietot/Redi\u0123\u0113t att\u0113lu",missing_alt:"Vai esat p\u0101rliecin\u0101ti, ka v\u0113laties turpin\u0101t, neiek\u013caujot bildes aprakstu? Bez apraksta bilde neb\u016bs saprotama lietot\u0101jiem ar nesp\u0113ju redz\u0113t, vai lietotajiem, kas lieto teksta p\u0101rl\u016bkus, vai izsl\u0113gu\u0161i bil\u017eu r\u0101d\u012b\u0161anu.",example_img:"Att\u0113la izskata priek\u0161skats",misc:"Da\u017e\u0101di",mouseout:"kad pele \u0101rpus",mouseover:"kad pele virs",alt_image:"Otra bilde",swap_image:"Main\u012bt bildi",map:"Att\u0113lkarte",id:"Id",rtl:"No lab\u0101s uz kreiso",ltr:"No kreis\u0101s uz labo",classes:"Klases",style:"Stils",long_desc:"Saite uz garo aprakstu",langcode:"Valodas kods",langdir:"Valodas virziens",constrain_proportions:"Saglab\u0101t proporcijas",preview:"Priek\u0161skats",title:"Nosaukums",general:"Iestat\u012bjumi",tab_advanced:"Papildiestat\u012bjumi",tab_appearance:"Izskats",tab_general:"Iestat\u012bjumi"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/mk_dlg.js b/js/tiny_mce/plugins/advimage/langs/mk_dlg.js new file mode 100755 index 000000000..fd9b0b778 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.advimage_dlg',{image_list:"Lista slika",align_right:"Desno",align_left:"Levo",align_textbottom:"Dno teksta",align_texttop:"Vrh teksta",align_bottom:"Dno",align_middle:"Sredina",align_top:"Vrh",align_baseline:"Osnovna linija",align:"Poravnavanje",hspace:"Vodoravni razmak",vspace:"Okomiti razmak",dimensions:"Dimenzije",border:"Obrub",list:"Lista slika",alt:"Opis slike",src:"URL slike",dialog_title:"\u0412\u043c\u0435\u0442\u043d\u0438/uredi sliku",missing_alt:"Jeste li sigurni da \u017eelite izostaviti opis slike? Slika mo\u017ee biti nedostupna ljudima s pote\u0161ko\u0107ama ili onima koji koriste preglednike bez prikaza slika.",example_img:"Prikaz slike",misc:"Razno",mouseout:"za izlazak mi\u0161a van slike",mouseover:"za prelazak mi\u0161a preko slike",alt_image:"Alternativna slika",swap_image:"Izmjenjiva slika",map:"Karta slike",id:"Id",rtl:"S desna na levo",ltr:"S leva na desno",classes:"Klase",style:"Stil",long_desc:"Poveznica dugog opisa",langcode:"Kod jezika",langdir:"Smjer jezika",constrain_proportions:"Zadr\u017ei proporcije",preview:"Prikaz",title:"\u041d\u0430\u0441\u043b\u043e\u0432",general:"Osnovno",tab_advanced:"Napredno",tab_appearance:"Izgled",tab_general:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ml_dlg.js b/js/tiny_mce/plugins/advimage/langs/ml_dlg.js new file mode 100755 index 000000000..5a0c99e13 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/mn_dlg.js b/js/tiny_mce/plugins/advimage/langs/mn_dlg.js new file mode 100755 index 000000000..7cf152d95 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.advimage_dlg',{image_list:"\u0417\u0443\u0440\u0433\u0438\u0439\u043d \u0436\u0430\u0433\u0441\u0430\u0430\u043b\u0442",align_right:"\u0411\u0430\u0440\u0443\u0443\u043d",align_left:"\u0417\u04af\u04af\u043d",align_textbottom:"\u0411\u0438\u0447\u0432\u044d\u0440\u0438\u0439\u043d \u0434\u043e\u043e\u0440",align_texttop:"\u0411\u0438\u0447\u0432\u044d\u0440\u0438\u0439\u043d \u0434\u044d\u044d\u0440",align_bottom:"\u0414\u043e\u043e\u0440",align_middle:"\u0414\u0443\u043d\u0434",align_top:"\u0414\u044d\u044d\u0440",align_baseline:"\u041c\u04e9\u0440",align:"\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",hspace:"\u0425\u044d\u0432\u0442\u044d\u044d \u0430\u043b\u0441\u043b\u0430\u043b\u0442",vspace:"\u0411\u043e\u0441\u043e\u043e \u0430\u043b\u0441\u043b\u0430\u043b\u0442",dimensions:"\u0425\u044d\u043c\u0436\u044d\u044d\u0441",border:"\u0425\u04af\u0440\u044d\u044d",list:"\u0417\u0443\u0440\u0433\u0438\u0439\u043d \u0436\u0430\u0433\u0441\u0430\u0430\u043b\u0442",alt:"\u0422\u0430\u0439\u043b\u0431\u0430\u0440",src:"\u0425\u0430\u044f\u0433",dialog_title:"\u0417\u0443\u0440\u0430\u0433 \u043e\u0440\u0443\u0443\u043b\u0430\u0445/\u0437\u0430\u0441\u0430\u0445",missing_alt:"\u0422\u0430 \u04af\u043d\u044d\u0445\u044d\u044d\u0440 \u0442\u0430\u0439\u043b\u0431\u0430\u0440 \u0445\u0438\u0439\u0445\u0433\u04af\u0439 \u0431\u0430\u0439\u0445\u044b\u0433 \u0445\u04af\u0441\u044d\u0436 \u0431\u0430\u0439\u043d\u0430 \u0443\u0443? \u0417\u0430\u0440\u0438\u043c \u0445\u04e9\u0433\u0436\u043b\u0438\u0439\u043d \u0431\u044d\u0440\u0445\u0448\u044d\u044d\u043b\u0442\u044d\u0439 \u044d\u0441\u0432\u044d\u043b \u0431\u0438\u0447\u0432\u044d\u0440 \u0445\u04e9\u0442\u04e9\u0447 \u0430\u0448\u0438\u0433\u043b\u0430\u0436 \u0431\u0443\u0439 \u044d\u0441\u0432\u044d\u043b \u0437\u0443\u0440\u0430\u0433 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445\u044b\u0433 \u0445\u0430\u0430\u0441\u0430\u043d \u0445\u044d\u0440\u044d\u0433\u043b\u044d\u0433\u0447\u0438\u0434 \u0445\u0430\u043d\u0434\u0430\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0433\u04af\u0439\u0433 \u0430\u043d\u0445\u0430\u0430\u0440\u043d\u0430 \u0443\u0443.",example_img:"\u041d\u044f\u0433\u0442\u043b\u0430\u043d \u0445\u0430\u0440\u0430\u0445",misc:"\u042f\u043d\u0437 \u0431\u04af\u0440\u0438\u0439\u043d \u0437\u04af\u0439\u043b\u0441",mouseout:"\u0425\u0443\u043b\u0433\u0430\u043d\u0430 \u0433\u0430\u0440\u0430\u0445\u0430\u0434",mouseover:"\u0425\u0443\u043b\u0433\u0430\u043d\u0430 \u043e\u0440\u043e\u0445\u043e\u0434",alt_image:"\u0425\u043e\u0451\u0440\u0434\u043e\u0433\u0447 \u0437\u0443\u0440\u0430\u0433",swap_image:"\u0417\u0443\u0440\u0430\u0433 \u0441\u043e\u043b\u0438\u0445",map:"\u0411\u04af\u0441\u0447\u0438\u043b\u0441\u0430\u043d \u0437\u0443\u0440\u0430\u0433",id:"\u0422\u0422",rtl:"\u0411\u0430\u0440\u0443\u0443\u043d\u0430\u0430\u0441 \u0437\u04af\u04af\u043d",ltr:"\u0417\u04af\u04af\u043d\u044d\u044d\u0441 \u0431\u0430\u0440\u0443\u0443\u043d",classes:"\u0410\u043d\u0433\u0438",style:"\u0424\u043e\u0440\u043c\u0430\u0442",long_desc:"\u0414\u044d\u043b\u0433\u044d\u0440\u044d\u043d\u0433\u04af\u0439 \u0442\u0430\u0439\u043b\u0431\u0430\u0440",langcode:"\u0425\u044d\u043b\u043d\u0438\u0439 \u043a\u043e\u0434",langdir:"\u0411\u0438\u0447\u0433\u0438\u0439\u043d \u0447\u0438\u0433\u043b\u044d\u043b",constrain_proportions:"\u0425\u044d\u043c\u0436\u044d\u044d\u0441",preview:"\u041d\u044f\u0433\u0442\u043b\u0430\u043d \u0445\u0430\u0440\u0430\u0445",title:"\u0413\u0430\u0440\u0447\u0438\u0433",general:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439",tab_advanced:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d",tab_appearance:"\u0425\u0430\u0440\u0430\u0433\u0434\u0430\u0446",tab_general:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ms_dlg.js b/js/tiny_mce/plugins/advimage/langs/ms_dlg.js new file mode 100755 index 000000000..c221996a4 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.advimage_dlg',{image_list:"Senarai imej",align_right:"Kanan",align_left:"Kiri",align_textbottom:"Teks bawah",align_texttop:"Teks atas",align_bottom:"Bawah",align_middle:"Tengah",align_top:"Atas",align_baseline:"Garis pangkal",align:"Penyelarian",hspace:"Ruangan ufuk",vspace:"Ruangan tegak",dimensions:"Dimensi",border:"Sempadan",list:"Senarai imej",alt:"Huraian imej",src:"URL imej",dialog_title:"Sisip/sunting imej",missing_alt:"Adakah anda pasti untuk teruskan tanpa masukkan huraian imej? Tanpa huraian, imej mungkin tidak dapat difahami oleh orang yang kurang upaya, orang yang menggunakan pelayaran teks.",example_img:"Penglihatan pratonton imej",misc:"Pelbagai",mouseout:"untuk tetikus di luar",mouseover:"untuk tetikus di atas",alt_image:"Imej alternatif",swap_image:"Tukar imej",map:"Imej map",id:"Id",rtl:"Kanan ke kiri",ltr:"Kiri ke kanan",classes:"Kelas-kelas",style:"Gaya",long_desc:"Pautan huraian panjang",langcode:"Kod bahasa",langdir:"Arah bahasa",constrain_proportions:"Kadar tahanan",preview:"Pratonton",title:"Tajuk",general:"Am",tab_advanced:"Lanjutan",tab_appearance:"Penglihatan",tab_general:"Am"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/my_dlg.js b/js/tiny_mce/plugins/advimage/langs/my_dlg.js new file mode 100755 index 000000000..46de27e8b --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.advimage_dlg',{image_list:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f \u1005\u102c\u101b\u1004\u103a\u1038",align_right:"\u100a\u102c",align_left:"\u1018\u101a\u103a",align_textbottom:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001\u1010\u103d\u1004\u103a \u1005\u102c\u101e\u102c\u1038",align_texttop:"\u1011\u102d\u1015\u103a\u1010\u103d\u1004\u103a \u1005\u102c\u101e\u102c\u1038",align_bottom:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001",align_middle:"\u1021\u101c\u101a\u103a",align_top:"\u1011\u102d\u1015\u103a",align_baseline:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001\u1019\u103b\u1009\u103a\u1038",align:"\u1001\u103b\u102d\u1014\u103a\u100a\u102d\u103e\u1019\u103e\u102f",hspace:"\u1021\u101c\u103b\u103e\u102c\u1038\u101c\u102d\u102f\u1000\u103a \u1000\u103d\u1000\u103a\u101c\u1015\u103a",vspace:"\u1031\u1012\u102b\u1004\u103a\u101c\u102d\u102f\u1000\u103a \u1000\u103d\u1000\u103a\u101c\u1015\u103a",dimensions:"\u1021\u1010\u102d\u102f\u1004\u103a\u1038\u1021\u1011\u103d\u102c\u1019\u103b\u102c\u1038",border:"\u1014\u101a\u103a\u1005\u100a\u103a\u1038",list:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f \u1005\u102c\u101b\u1004\u103a\u1038",alt:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f \u1005\u102c\u100a\u103d\u103e\u1014\u103a\u1038",src:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f URL",dialog_title:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f \u1011\u100a\u103a\u1037/\u103c\u1015\u1004\u103a",missing_alt:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f\u1005\u102c\u100a\u103d\u103e\u1014\u103a\u1038\u1019\u1015\u102b\u1018\u1032 \u1006\u1000\u103a\u101c\u1000\u103a\u101c\u102f\u1015\u103a\u1031\u1006\u102c\u1004\u103a\u101c\u102d\u102f\u1010\u102c \u1031\u101e\u1001\u103b\u102c\u101b\u1032\u1037\u101c\u102c\u1038? \u1011\u102d\u102f\u101e\u102d\u102f\u1037 \u1031\u1016\u102c\u103a\u103c\u1015\u1001\u103b\u1000\u103a \u1005\u102c\u100a\u103d\u103e\u1014\u103a\u1038 \u1019\u1015\u102b\u101c\u103b\u103e\u1004\u103a \u101b\u102f\u1015\u103a\u1015\u1036\u102f\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1015\u102d\u1010\u103a\u1011\u102c\u1038\u103c\u1015\u102e\u1038 Web \u1000\u102d\u102f\u103c\u1000\u100a\u103a\u1037\u101b\u103e\u102f\u1031\u1014\u1031\u101e\u102c (\u101e\u102d\u102f\u1037) \u1005\u102c\u101e\u102c\u1038 \u1018\u1031\u101b\u102c\u1000\u103a\u1007\u102c\u1000\u102d\u102f \u1021\u101e\u1036\u102f\u1038\u103c\u1015\u102f\u1031\u1014\u1031\u101e\u102c (\u101e\u102d\u102f\u1037) \u1000\u102d\u102f\u101a\u103a\u1001\u1014\u1039\u1013\u102c\u1019\u101e\u1014\u103a\u1005\u103d\u1019\u103a\u1038\u1031\u101e\u102c \u1021\u1001\u103b\u102d\u102f\u1037\u101e\u1036\u102f\u1038\u101e\u1030\u1019\u103b\u102c\u1038 \u1011\u102d\u102f\u101b\u102f\u1015\u103a\u1015\u1036\u102f\u1000\u102d\u102f \u101b\u101a\u1030\u101e\u1036\u102f\u1038\u1005\u103d\u1032\u1014\u102d\u102f\u1004\u103a\u1019\u100a\u103a \u1019\u101f\u102f\u1010\u103a\u1015\u102b\u104b",example_img:"\u1021\u1005\u1019\u103a\u1038\u103c\u1000\u100a\u103a\u1037 \u101b\u102f\u1015\u103a\u1015\u1036\u102f \u1021\u101e\u103d\u1004\u103a\u1021\u103c\u1015\u1004\u103a",misc:"\u1031\u101e\u102c\u1004\u103a\u1038\u1031\u103c\u1015\u102c\u1004\u103a\u1038\u1031\u1011\u103d\u101c\u102c",mouseout:"For Mouse Out",mouseover:"For Mouse Over",alt_image:"\u1021\u1011\u1030\u1038\u103c\u1015\u102f \u101b\u102f\u1015\u103a\u1015\u1036\u102f",swap_image:"Swap Image",map:"Image Map",id:"ID",rtl:"\u100a\u102c\u1019\u103e \u1018\u101a\u103a",ltr:"\u1018\u101a\u103a\u1019\u103e \u100a\u102c",classes:"Class \u1019\u103b\u102c\u1038",style:"\u1005\u1010\u102d\u102f\u1004\u103a",long_desc:"\u101b\u103e\u100a\u103a\u101c\u103b\u102c\u1038\u1031\u101e\u102c \u1031\u1016\u102c\u103a\u103c\u1015\u1001\u103b\u1000\u103a \u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u101c\u102d\u1015\u103a\u1005\u102c",langcode:"\u1018\u102c\u101e\u102c\u1005\u1000\u102c\u1038 \u1000\u102f\u1010\u103a",langdir:"\u1005\u102c\u1031\u101b\u1038\u101e\u102c\u1038\u1019\u103e\u102f \u1025\u102e\u1038\u1010\u100a\u103a\u1001\u103b\u1000\u103a",constrain_proportions:"\u1021\u1001\u103b\u102d\u102f\u1038\u1021\u1005\u102c\u1038 \u1011\u102d\u1014\u103a\u1038\u100a\u102d\u103e",preview:"\u1021\u1005\u1019\u103a\u1038\u103c\u1000\u100a\u103a\u1037",title:"\u1031\u1001\u102b\u1004\u103a\u1038\u1005\u102e\u1038\u1021\u1019\u100a\u103a",general:"\u1021\u1031\u1011\u103d\u1031\u1011\u103d",tab_advanced:"\u1021\u1011\u1030\u1038",tab_appearance:"\u1021\u101e\u103d\u1004\u103a\u1021\u103c\u1015\u1004\u103a",tab_general:"\u1021\u1031\u1011\u103d\u1031\u1011\u103d"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/nb_dlg.js b/js/tiny_mce/plugins/advimage/langs/nb_dlg.js new file mode 100755 index 000000000..9d6a6e377 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.advimage_dlg',{"image_list":"Bildeliste","align_right":"H\u00f8yre","align_left":"Venstre","align_textbottom":"Tekst bunn","align_texttop":"Tekst topp","align_bottom":"Bunn","align_middle":"Midtstilt","align_top":"Topp","align_baseline":"Grunnlinje",align:"Justering",hspace:"Horisontal avstand",vspace:"Vertikal avstand",dimensions:"Dimensjoner",border:"Ramme",list:"Bildeliste",alt:"Bildebeskrivelse",src:"Bildets URL","dialog_title":"Sett inn / endre bilde","missing_alt":"Er du sikker p\u00e5 at du vil fortsette uten \u00e5 sette inn en beskrivelse av bildet? Uten beskrivelse vil bildet ikke gi mening for enkelte funksjonshemmede eller for personer som bruker en nettleser med bildevisning avsl\u00e5tt.","example_img":"Utseende Forh\u00e5ndsvisning bilde",misc:"Annet",mouseout:"for musepeker utenfor",mouseover:"for musepeker p\u00e5","alt_image":"Alternativt bilde","swap_image":"Bytt bilde",map:"Bildekart",id:"Id",rtl:"H\u00f8yre mot venstre",ltr:"Venstre mot h\u00f8yre",classes:"Klasser",style:"Stil","long_desc":"Lang beskrivelse",langcode:"Spr\u00e5kkode",langdir:"Skriftretning","constrain_proportions":"Behold st\u00f8rrelsesforhold",preview:"Forh\u00e5ndsvisning",title:"Tittel",general:"Generelt","tab_advanced":"Avansert","tab_appearance":"Utseende","tab_general":"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/nl_dlg.js b/js/tiny_mce/plugins/advimage/langs/nl_dlg.js new file mode 100755 index 000000000..a004b3e24 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.advimage_dlg',{"image_list":"Lijst","align_right":"Rechts","align_left":"Links","align_textbottom":"Onderkant tekst","align_texttop":"Bovenkant tekst","align_bottom":"Onder","align_middle":"Midden","align_top":"Boven","align_baseline":"Basislijn",align:"Uitlijning",hspace:"Horizontale ruimte",vspace:"Verticale ruimte",dimensions:"Afmetingen",border:"Rand",list:"Lijst",alt:"Beschrijving",src:"Bestand/URL","dialog_title":"Afbeelding invoegen/bewerken","missing_alt":"Wilt u de afbeelding zonder beschrijving invoegen? De afbeelding wordt dan mogelijk niet opgemerkt door mensen met een visuele handicap, of welke zonder afbeeldingen browsen.","example_img":"Voorbeeldweergave",misc:"Diversen",mouseout:"Bij muis uit",mouseover:"Bij muis over","alt_image":"Alternatieve afbeeldingen","swap_image":"Afbeelding wisselen",map:"Afbeeldingsplattegrond",id:"Id",rtl:"Van rechts naar links",ltr:"Van links naar rechts",classes:"Klasses",style:"Stijl","long_desc":"Uitgebreide beschrijving",langcode:"Taalcode",langdir:"Taalrichting","constrain_proportions":"Verhouding behouden",preview:"Voorbeeld",title:"Titel",general:"Algemeen","tab_advanced":"Geavanceerd","tab_appearance":"Weergave","tab_general":"Algemeen"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/nn_dlg.js b/js/tiny_mce/plugins/advimage/langs/nn_dlg.js new file mode 100755 index 000000000..60cec12bb --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.advimage_dlg',{image_list:"Liste med bilete",align_right:"H\u00f8gre",align_left:"Venstre",align_textbottom:"Tekst botn",align_texttop:"Tekst topp",align_bottom:"Botn",align_middle:"Midtstilt",align_top:"Topp",align_baseline:"Basislinje",align:"Justering",hspace:"Horisontal avstand",vspace:"Vertikal avstand",dimensions:"Dimensjonar",border:"Ramme",list:"Bileteliste",alt:"Bileteomtale",src:"Bilete-URL",dialog_title:"Set inn / endre bilete",missing_alt:"Er du sikker p\u00e5 at du vil fortsetje utan \u00e5 setje inn ei omtale av biletet? Utan omtale vil biletet ikkje gje meining for enkelte funksjonshemma eller for personar som bruker ein nettlesar med biletvisinga avsl\u00e5tt.",example_img:"Sj\u00e5 f\u00f8rebels utkast av bilete",misc:"Anna",mouseout:"for musepeikar utanfor",mouseover:"for musepeikar over",alt_image:"Alternativt bilete",swap_image:"Byt bilete",map:"Biletekart",id:"Id",rtl:"H\u00f8gre mot venstre",ltr:"Venstre mot h\u00f8gre",classes:"Klasser",style:"Stil",long_desc:"Lang omtale",langcode:"Spr\u00e5kkode",langdir:"Skriftretning",constrain_proportions:"Behald proporsjonar",preview:"Sj\u00e5 f\u00f8rebels utkast",title:"Tittel",general:"Generelt",tab_advanced:"Avansert",tab_appearance:"Utsj\u00e5nad",tab_general:"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/no_dlg.js b/js/tiny_mce/plugins/advimage/langs/no_dlg.js new file mode 100755 index 000000000..1f2d40f52 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.advimage_dlg',{"image_list":"Liste over bilder","align_right":"H\u00f8yre","align_left":"Venstre","align_textbottom":"Tekst bunn","align_texttop":"Tekst topp","align_bottom":"Bunn","align_middle":"Midtstilt","align_top":"Topp","align_baseline":"Basislinje",align:"Justering",hspace:"Horisontal avstand",vspace:"Vertikal avstand",dimensions:"Dimensjoner",border:"Ramme",list:"Bildeliste",alt:"Bildebeskrivelse",src:"Bilde URL","dialog_title":"Sett inn/editer bilde","missing_alt":"Er du sikker du vil fortsette uten \u00e5 sette inn bildebeskrivelse? Uten beskrivelse vil ikke bildet gi mening for enkelte funksjonshemmde eller personer som bruker nettleser med avsl\u00e5tt bildevising.","example_img":"Utseende forh\u00e5ndsvisning",misc:"Diverse",mouseout:"for musepeker utenfor",mouseover:"for musepeker over","alt_image":"Alternativt bilde","swap_image":"Bytt bilde",map:"Bildekart",id:"Id",rtl:"H\u00f8yre mot venstre",ltr:"Venstre mot h\u00f8yre",classes:"Klasse",style:"Stil","long_desc":"Lang beskrivelse",langcode:"Spr\u00e5k kode",langdir:"Skriftretning","constrain_proportions":"Behold proporsjoner",preview:"Forh\u00e5ndsvisning",title:"Tittel",general:"Generelt","tab_advanced":"Avansert","tab_appearance":"Utseende","tab_general":"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/pl_dlg.js b/js/tiny_mce/plugins/advimage/langs/pl_dlg.js new file mode 100755 index 000000000..fa8b023a5 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.advimage_dlg',{"image_list":"Lista obrazk\u00f3w","align_right":"Prawy","align_left":"Lewy","align_textbottom":"Tekst dolny","align_texttop":"Tekst g\u00f3rny","align_bottom":"Dolny","align_middle":"\u015arodkowy","align_top":"G\u00f3rny","align_baseline":"G\u0142\u00f3wna linia",align:"Wyr\u00f3wnanie",hspace:"Odst\u0119p poziomy",vspace:"Odst\u0119p pionowy",dimensions:"Rozmiary",border:"Obramowanie",list:"Lista obrazk\u00f3w",alt:"Opis obrazka",src:"URL obrazka","dialog_title":"Wklej/edytuj obraz","missing_alt":"Czy jeste\u015b pewien, \u017ce chcesz kontynuowa\u0107 bez opisu obrazka? Obrazek bez opisu mo\u017ce nie by\u0107 dost\u0119pny dla u\u017cytkownik\u00f3w u\u017cywaj\u0105cych tekstowe przegl\u0105darki lub przegl\u0105daj\u0105cych stron\u0119 z wy\u0142\u0105czonymi obrazkami.","example_img":"Podgl\u0105d wygl\u0105du obrazka",misc:"R\u00f3\u017cne",mouseout:"dla mouseout",mouseover:"dla mouseover","alt_image":"alternatywny obrazek","swap_image":"Zamiana obrazka",map:"Mapa obrazu",id:"Id",rtl:"Z prawej do lewej",ltr:"Z lewej do prawej",classes:"Klasy",style:"Styl","long_desc":"D\u0142ugi opis linku",langcode:"Kod j\u0119zyka",langdir:"Kierunek j\u0119zyka","constrain_proportions":"Zachowaj proporcje",preview:"Podgl\u0105d",title:"Tytu\u0142",general:"Og\u00f3lne","tab_advanced":"Zaawansowane","tab_appearance":"Wygl\u0105d","tab_general":"Og\u00f3lne"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ps_dlg.js b/js/tiny_mce/plugins/advimage/langs/ps_dlg.js new file mode 100755 index 000000000..58a4ac5ce --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/pt_dlg.js b/js/tiny_mce/plugins/advimage/langs/pt_dlg.js new file mode 100755 index 000000000..ba7d07e3a --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.advimage_dlg',{image_list:"Lista de imagens",align_right:"Direita",align_left:"Esquerda",align_textbottom:"Base do texto",align_texttop:"Topo do texto",align_bottom:"Abaixo",align_middle:"Meio",align_top:"Topo",align_baseline:"Sobre a linha de texto",align:"Alinhamento",hspace:"Espa\u00e7o horizontal",vspace:"Espa\u00e7o vertical",dimensions:"Dimens\u00f5es",border:"Limite",list:"Lista de imagens",alt:"Descri\u00e7\u00e3o da imagem",src:"Endere\u00e7o da imagem",dialog_title:"Inserir/editar imagem",missing_alt:"Tem certeza que deseja continuar sem acrescentar uma descri\u00e7\u00e3o \u00e0 imagem? (Isto pode gerar problemas de acessibilidade em alguns navegadores)",example_img:"Pr\u00e9-Visualiza\u00e7\u00e3o",misc:"Misto",mouseout:"mouseout",mouseover:"mouseover",alt_image:"Imagem alternativa",swap_image:"Trocar imagem",map:"Mapa de imagem",id:"Id",rtl:"Da direita para a esquerda",ltr:"Da esquerda para a direita",classes:"Classes",style:"Estilo",long_desc:"Descri\u00e7\u00e3o extensa",langcode:"C\u00f3digo do idioma",langdir:"Dire\u00e7\u00e3o do texto",constrain_proportions:"Manter propor\u00e7\u00f5es",preview:"Pr\u00e9-Visualiza\u00e7\u00e3o",title:"T\u00edtulo",general:"Geral",tab_advanced:"Avan\u00e7ado",tab_appearance:"Apar\u00eancia",tab_general:"Geral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ro_dlg.js b/js/tiny_mce/plugins/advimage/langs/ro_dlg.js new file mode 100755 index 000000000..2df6247d0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.advimage_dlg',{image_list:"List\u0103 de imagini",align_right:"Dreapta",align_left:"St\u00e2nga",align_textbottom:"Textul jos",align_texttop:"Textul sus",align_bottom:"Jos",align_middle:"La mijloc",align_top:"Sus",align_baseline:"Baseline",align:"Aliniere",hspace:"Spa\u0163iu orizontal",vspace:"Spa\u0163iu vertical",dimensions:"Dimensiuni",border:"Bordur\u0103",list:"List\u0103 imagini",alt:"Descriere imagine",src:"URL imagine",dialog_title:"Inserare/editare imagine",missing_alt:"Sigur dori\u0163i s\u0103 continua\u0163i f\u0103r\u0103 a introduce o descriere a imaginii?",example_img:"Imagine mic\u0103",misc:"Diverse",mouseout:"Pentru maus \u00een afar\u0103",mouseover:"Pentru maus deasupra",alt_image:"Imagine alternativ\u0103",swap_image:"Schimb\u0103 imaginea",map:"Hart\u0103 imagine",id:"Id",rtl:"De la dreapta la st\u00e2nga",ltr:"De la st\u00e2nga la dreapta",classes:"Clase",style:"Stil",long_desc:"Descriere leg\u0103tur\u0103",langcode:"Cod limb\u0103",langdir:"Direc\u0163ie limb\u0103",constrain_proportions:"Men\u0163ine propor\u0163ii",preview:"Previzualizare",title:"Titlu",general:"General",tab_advanced:"Avansat",tab_appearance:"Afi\u015fare",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ru_dlg.js b/js/tiny_mce/plugins/advimage/langs/ru_dlg.js new file mode 100755 index 000000000..2b984e5c3 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advimage_dlg',{"image_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a","align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_textbottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","align_texttop":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_middle":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_baseline":"\u041f\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",hspace:"\u0413\u043e\u0440\u0438\u0437. \u043e\u0442\u0441\u0442\u0443\u043f",vspace:"\u0412\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f",dimensions:"\u0420\u0430\u0437\u043c\u0435\u0440",border:"\u0413\u0440\u0430\u043d\u0438\u0446\u0430",list:"\u0421\u043f\u0438\u0441\u043e\u043a",alt:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",src:"\u0410\u0434\u0440\u0435\u0441","dialog_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","missing_alt":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f? \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c.","example_img":"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f",misc:"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b",mouseout:"\u0412 \u043f\u043e\u043a\u043e\u0435",mouseover:"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438","alt_image":"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","swap_image":"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",map:"\u041a\u0430\u0440\u0442\u0430 \u0441\u0441\u044b\u043b\u043e\u043a",id:"\u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",classes:"\u041a\u043b\u0430\u0441\u0441\u044b",style:"\u0421\u0442\u0438\u043b\u044c","long_desc":"\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","constrain_proportions":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438",preview:"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",title:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",general:"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","tab_advanced":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","tab_appearance":"\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435","tab_general":"\u041e\u0431\u0449\u0435\u0435"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/sc_dlg.js b/js/tiny_mce/plugins/advimage/langs/sc_dlg.js new file mode 100755 index 000000000..ff2ef1bf5 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.advimage_dlg',{image_list:"\u56fe\u7247\u5217\u8868",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u4e0b\u65b9",align_middle:"\u5c45\u4e2d",align_top:"\u4e0a\u65b9",align_baseline:"\u57fa\u7ebf",align:"\u5bf9\u9f50\u65b9\u5f0f",hspace:"\u5782\u76f4\u95f4\u8ddd",vspace:"\u6c34\u51c6\u95f4\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u5217\u8868",alt:"\u56fe\u7247\u8bf4\u660e",src:"\u56fe\u7247\u7f51\u5740",dialog_title:"\u63d2\u5165/\u7f16\u8f91\u56fe\u7247",missing_alt:"\u8bf7\u95ee\u662f\u5426\u786e\u5b9a\u4e0d\u4e3a\u56fe\u7247\u52a0\u5165\u8bf4\u660e\u6587\u5b57\uff1f\u82e5\u6ca1\u6709\u52a0\u5165\u8bf4\u660e\u6587\u5b57\uff0c\u5f53\u7528\u6237\u4f7f\u7528\u4e0d\u8bfb\u5165\u56fe\u7247\u6216\u6587\u5b57\u4f53\u7684\u6d41\u89c8\u5668\u65f6\uff0c\u5c06\u4f1a\u770b\u4e0d\u5230\u8fd9\u4e2a\u56fe\u7247\u3002 ",example_img:"\u9884\u89c8\u56fe\u7247",misc:"\u5176\u4ed6",mouseout:"\u6ed1\u9f20\u79fb\u51fa\u56fe\u7247",mouseover:"\u6ed1\u9f20\u79fb\u5165\u56fe\u7247",alt_image:"\u66ff\u6362\u56fe\u7247",swap_image:"\u5bf9\u6362\u56fe\u7247",map:"\u56fe\u7247\u5730\u56fe",id:"Id",rtl:"\u7531\u53f3\u5230\u5de6",ltr:"\u7531\u5de6\u5230\u53f3",classes:"\u7c7b\u578b",style:"\u6837\u5f0f",long_desc:"\u957f\u63cf\u8ff0\u8fde\u7ed3",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u67e5\u627e",general:"\u4e00\u822c",tab_advanced:"\u9ad8\u7ea7",tab_appearance:"\u5916\u89c2",tab_general:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/se_dlg.js b/js/tiny_mce/plugins/advimage/langs/se_dlg.js new file mode 100755 index 000000000..5caed52d9 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.advimage_dlg',{image_list:"Bildlista",align_right:"V\u00e4nster",align_left:"H\u00f6ger",align_textbottom:"Botten av texten",align_texttop:"Toppen av texten",align_bottom:"Botten",align_middle:"Mitten",align_top:"Toppen",align_baseline:"Baslinje",align:"Justering",hspace:"Horisontalrymd",vspace:"Vertikalrymd",dimensions:"Dimensioner",border:"Ram",list:"Bildlista",alt:"Bildens beskrivning",src:"Bildens URL",dialog_title:"Infoga/redigera bild",missing_alt:"Vill du forts\u00e4tta utan bildbeskrivning. Icke grafiska webbl\u00e4sare kommer inte kunna tolka bilden f\u00f6r anv\u00e4ndaren.",example_img:"Exempelbild",misc:"\u00d6vrigt",mouseout:"vid musen utanf\u00f6r",mouseover:"vid musen ovanf\u00f6r",alt_image:"Alternativbild",swap_image:"Utbytningsbild",map:"L\u00e4nkkarta",id:"Id",rtl:"H\u00f6ger till v\u00e4nster",ltr:"V\u00e4nster till h\u00f6ger",classes:"Klasser",style:"Stil",long_desc:"L\u00e5ng beskrivning",langcode:"Spr\u00e5kkod",langdir:"Skriftriktning",constrain_proportions:"Bibeh\u00e5ll proportionerna",preview:"F\u00f6rhandsvisning",title:"Titel",general:"Generellt",tab_advanced:"Avancerat",tab_appearance:"Utseende",tab_general:"Generellt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/si_dlg.js b/js/tiny_mce/plugins/advimage/langs/si_dlg.js new file mode 100755 index 000000000..54e9220c3 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/sk_dlg.js b/js/tiny_mce/plugins/advimage/langs/sk_dlg.js new file mode 100755 index 000000000..227f7668c --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.advimage_dlg',{image_list:"Zoznam obr\u00e1zkov",align_right:"Vpravo",align_left:"V\u013eavo",align_textbottom:"So spodkom riadku",align_texttop:"S vrcholom riadku",align_bottom:"Dole",align_middle:"Na stred riadku",align_top:"Hore",align_baseline:"Na z\u00e1klad\u0148u",align:"Zarovnanie",hspace:"Horizont\u00e1lne odsadenie",vspace:"Vertik\u00e1lne odsadenie",dimensions:"Rozmery",border:"Or\u00e1movanie",list:"Zoznam obr\u00e1zkov",alt:"Popis obr\u00e1zku",src:"URL obr\u00e1zka",dialog_title:"Vlo\u017ei\u0165/upravi\u0165 obr\u00e1zok",missing_alt:"Naozaj chcete pokra\u010dova\u0165 bez vlo\u017een\u00e9ho popisu obr\u00e1zka? Bez popisu m\u00f4\u017ee by\u0165 obr\u00e1zok nepr\u00edstupn\u00fd u\u017e\u00edvate\u013eom so zrakov\u00fdm postihnut\u00edm, u\u017e\u00edvate\u013eom textov\u00fdch prehliada\u010dov alebo u\u017e\u00edvate\u013eom, ktor\u00ed maj\u00fa vypnut\u00e9 zobrazovanie obr\u00e1zkov.",example_img:"Pr\u00edklad obr\u00e1zka",misc:"R\u00f4zne",mouseout:"Po odjazden\u00ed my\u0161i",mouseover:"Pri nabehnut\u00ed my\u0161i",alt_image:"Alternat\u00edvny obr\u00e1zok",swap_image:"Prepnutie obr\u00e1zka",map:"Obr\u00e1zkov\u00e1 mapa",id:"ID",rtl:"Sprava do\u013eava",ltr:"Z\u013eava doprava",classes:"Triedy",style:"\u0160t\u00fdl",long_desc:"Dlh\u00fd popis",langcode:"K\u00f3d jazyka",langdir:"Smer textu",constrain_proportions:"Zachova\u0165 pomer str\u00e1n",preview:"N\u00e1h\u013ead",title:"Titulok",general:"Obecn\u00e9 parametre",tab_advanced:"Roz\u0161\u00edren\u00e9",tab_appearance:"Vzh\u013ead",tab_general:"Obecn\u00e9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/sl_dlg.js b/js/tiny_mce/plugins/advimage/langs/sl_dlg.js new file mode 100755 index 000000000..4a1b53f3e --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.advimage_dlg',{image_list:"Seznam slik",align_right:"desno, plavajo\u010de",align_left:"levo, plavajo\u010de",align_textbottom:"dno besedila",align_texttop:"vrh besedila",align_bottom:"dno",align_middle:"sredina",align_top:"vrh",align_baseline:"osnovna \u010drta",align:"Poravnava",hspace:"Prostor le/de",vspace:"Prostor zg/sp",dimensions:"Dimenzije",border:"Obroba",list:"Seznam slik",alt:"Opis slike",src:"Naslov URL slike",dialog_title:"Vstavi/uredi sliko",missing_alt:"Zares \u017eelite nadaljevati, brez da bi dolo\u010dili opis slike? Brez njega slika nekaterim uporabnikom ne bo na voljo (izklopljen prikaz slik, tekstni brskalnik ali ljudje s slab\u0161im vidom).",example_img:"Predogled izgleda",misc:"Razno",mouseout:"pri mi\u0161ki izven",mouseover:"pri mi\u0161ki nad",alt_image:"Nadomestna slika",swap_image:"Zamenjava slike",map:"Karta slike",id:"Id",rtl:"Od desne proti levi",ltr:"Od leve proti desni",classes:"Razredi",style:"Slog",long_desc:"Povezava do opisa",langcode:"Koda jezika",langdir:"Smer jezika",constrain_proportions:"Zakleni razmerje",preview:"Predogled",title:"Naslov",general:"Splo\u0161no",tab_advanced:"Napredno",tab_appearance:"Izgled",tab_general:"Splo\u0161no"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/sq_dlg.js b/js/tiny_mce/plugins/advimage/langs/sq_dlg.js new file mode 100755 index 000000000..1e400c7b7 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.advimage_dlg',{image_list:"Lista e fotove",align_right:"Djathtas",align_left:"Majtas",align_textbottom:"Posht\u00eb tekstit",align_texttop:"Sip\u00ebr tekstit",align_bottom:"Fund",align_middle:"Mes",align_top:"Krye",align_baseline:"Vij\u00eb fundore",align:"Drejtimi",hspace:"Hap\u00ebsira horizontale",vspace:"Hap\u00ebsira vertikale",dimensions:"P\u00ebrmasat",border:"Korniza",list:"Lista e fotove",alt:"P\u00ebrshkrimi i fotos",src:"URL e fotos",dialog_title:"Fut/edito foto",missing_alt:"Jeni t\u00eb sigurt q\u00eb doni t\u00eb vazhdoni pa p\u00ebrfshir\u00eb nj\u00eb p\u00ebrshkrim alternativ? Pa t\u00eb, foto mund t\u00eb jet\u00eb e pa aksesueshme nga njer\u00ebz me shikim t\u00eb kufizuar, q\u00eb p\u00ebrdorin shfletues q\u00eb nuk i shfaqin fotot apo i kan\u00eb \u00e7aktivizuar ato.",example_img:"Paraqitje e fotos",misc:"T\u00eb Ndryshme",mouseout:"n\u00eb mouse-in jasht\u00eb",mouseover:"n\u00eb mouse-in sip\u00ebr",alt_image:"P\u00ebrshkrimi alternativ",swap_image:"Nd\u00ebrro foto",map:"Harta e fotos",id:"Id",rtl:"Djathtas-Majtas",ltr:"Majtas-Djathtas",classes:"Klasat",style:"Stili",long_desc:"Lidhja e p\u00ebrshkrimit t\u00eb gjat\u00eb",langcode:"Kodi i gjuh\u00ebs",langdir:"Drejtimi i gjuh\u00ebs",constrain_proportions:"Ruaj raportet",preview:"Paraqitje",title:"Titulli",general:"T\u00eb P\u00ebrgjithshme",tab_advanced:"T\u00eb Avancuara",tab_appearance:"Pamja",tab_general:"T\u00eb P\u00ebrgjithshme"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/sr_dlg.js b/js/tiny_mce/plugins/advimage/langs/sr_dlg.js new file mode 100755 index 000000000..bfc6cee31 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.advimage_dlg',{image_list:"Lista slika",align_right:"Desno",align_left:"Levo",align_textbottom:"Dno teksta",align_texttop:"Vrh teksta",align_bottom:"Dno",align_middle:"Sredina",align_top:"Vrh",align_baseline:"Osnovna linija",align:"Poravnavanje",hspace:"Horizontalni razmak",vspace:"Vertikalni razmak",dimensions:"Dimenzije",border:"Ivice",list:"Lista slika",alt:"Opis slike",src:"URL slike",dialog_title:"Ubaci/uredi sliku",missing_alt:"Da li ste sigurni da \u017eelite da izostavite opis slike? Slika mo\u017ee biti nedostupna ljudima s pote\u0161ko\u0107ama ili onima koji koriste pretra\u017eiva\u010de bez prikaza slika.",example_img:"Prikaz slike",misc:"Razno",mouseout:"za izlazak mi\u0161a sa slike",mouseover:"za prelazak mi\u0161a preko slike",alt_image:"Alternativna slika",swap_image:"Promeni slika",map:"Mapa slike",id:"Id",rtl:"S desna na levo",ltr:"S leva na desno",classes:"Klase",style:"Stil",long_desc:"Link dugog opisa",langcode:"Kod jezika",langdir:"Smer jezika",constrain_proportions:"Zadr\u017ei proporcije",preview:"Pregled",title:"Naslov",general:"Osnovno",tab_advanced:"Napredno",tab_appearance:"Izgled",tab_general:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/sv_dlg.js b/js/tiny_mce/plugins/advimage/langs/sv_dlg.js new file mode 100755 index 000000000..3cc2c99e0 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.advimage_dlg',{"image_list":"Bildlista","align_right":"H\u00f6ger","align_left":"V\u00e4nster","align_textbottom":"Botten av texten","align_texttop":"Toppen av texten","align_bottom":"Botten","align_middle":"Mitten","align_top":"Toppen","align_baseline":"Baslinje",align:"Justering",hspace:"Horisontalrymd",vspace:"Vertikalrymd",dimensions:"Dimensioner",border:"Ram",list:"Bildlista",alt:"Bildens beskrivning",src:"Bildens URL","dialog_title":"Infoga/redigera bild","missing_alt":"Vill du forts\u00e4tta utan bildbeskrivning?\\nIcke grafiska webbl\u00e4sare kommer inte att kunna tolka bilden f\u00f6r anv\u00e4ndaren.","example_img":"Exempelbild",misc:"\u00d6vrigt",mouseout:"vid musen utanf\u00f6r",mouseover:"vid musen ovanf\u00f6r","alt_image":"Alternativbild","swap_image":"Utbytningsbild",map:"L\u00e4nkkarta",id:"Id",rtl:"H\u00f6ger till v\u00e4nster",ltr:"V\u00e4nster till h\u00f6ger",classes:"Klasser",style:"Stil","long_desc":"L\u00e5ng beskrivning",langcode:"Spr\u00e5kkod",langdir:"Skriftriktning","constrain_proportions":"Bibeh\u00e5ll proportionerna",preview:"F\u00f6rhandsvisning",title:"Titel",general:"Generellt","tab_advanced":"Avancerat","tab_appearance":"Utseende","tab_general":"Generellt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ta_dlg.js b/js/tiny_mce/plugins/advimage/langs/ta_dlg.js new file mode 100755 index 000000000..bd7e4a36d --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/te_dlg.js b/js/tiny_mce/plugins/advimage/langs/te_dlg.js new file mode 100755 index 000000000..764258dc1 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/th_dlg.js b/js/tiny_mce/plugins/advimage/langs/th_dlg.js new file mode 100755 index 000000000..a2cf71d75 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.advimage_dlg',{image_list:"\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e23\u0e39\u0e1b",align_right:"\u0e02\u0e27\u0e32",align_left:"\u0e0b\u0e49\u0e32\u0e22",align_textbottom:"\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e2d\u0e22\u0e39\u0e48\u0e25\u0e48\u0e32\u0e07",align_texttop:"\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e2d\u0e22\u0e39\u0e48\u0e1a\u0e19",align_bottom:"\u0e25\u0e48\u0e32\u0e07",align_middle:"\u0e01\u0e25\u0e32\u0e07",align_top:"\u0e1a\u0e19",align_baseline:"\u0e40\u0e2a\u0e49\u0e19\u0e1e\u0e37\u0e49\u0e19",align:"\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07\u0e08\u0e31\u0e14\u0e27\u0e32\u0e07",hspace:"\u0e23\u0e30\u0e22\u0e30\u0e2b\u0e48\u0e32\u0e07\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19",vspace:"\u0e23\u0e30\u0e22\u0e30\u0e2b\u0e48\u0e32\u0e07\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07",dimensions:"\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07",border:"\u0e01\u0e23\u0e2d\u0e1a",list:"\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e23\u0e39\u0e1b",alt:"\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e23\u0e39\u0e1b",src:"\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e23\u0e39\u0e1b",dialog_title:"\u0e40\u0e1e\u0e34\u0e48\u0e21/\u0e41\u0e01\u0e49\u0e44\u0e02 image",missing_alt:"\u0e04\u0e38\u0e13\u0e41\u0e19\u0e48\u0e43\u0e08\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e43\u0e2a\u0e48\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e ? \u0e01\u0e32\u0e23\u0e43\u0e2a\u0e48\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e23\u0e39\u0e1b\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e1c\u0e39\u0e49\u0e1e\u0e34\u0e01\u0e32\u0e23\u0e17\u0e32\u0e07\u0e2a\u0e32\u0e22\u0e15\u0e32\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e23\u0e39\u0e49\u0e44\u0e14\u0e49\u0e27\u0e48\u0e32\u0e23\u0e39\u0e1b\u0e04\u0e38\u0e13\u0e04\u0e37\u0e2d\u0e23\u0e39\u0e1b\u0e2d\u0e30\u0e44\u0e23",example_img:"\u0e14\u0e39\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30\u0e02\u0e2d\u0e07\u0e23\u0e39\u0e1b",misc:"\u0e40\u0e1a\u0e47\u0e14\u0e40\u0e15\u0e25\u0e47\u0e14",mouseout:"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e2d\u0e32\u0e40\u0e21\u0e49\u0e32\u0e2a\u0e4c\u0e2d\u0e2d\u0e01",mouseover:"\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e2d\u0e32\u0e40\u0e21\u0e49\u0e32\u0e2a\u0e4c\u0e0a\u0e35\u0e49",alt_image:"\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e23\u0e39\u0e1b",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"\u0e02\u0e27\u0e32\u0e44\u0e1b\u0e0b\u0e49\u0e32\u0e22",ltr:"\u0e0b\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e02\u0e27\u0e32",classes:"\u0e04\u0e25\u0e32\u0e2a",style:"\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",long_desc:"\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e25\u0e34\u0e49\u0e07\u0e04\u0e4c",langcode:"\u0e42\u0e04\u0e49\u0e14\u0e20\u0e32\u0e29\u0e32",langdir:"\u0e17\u0e34\u0e28\u0e17\u0e32\u0e07\u0e01\u0e32\u0e23\u0e2d\u0e48\u0e32\u0e19",constrain_proportions:"\u0e04\u0e07\u0e2a\u0e31\u0e14\u0e2a\u0e48\u0e27\u0e19",preview:"\u0e14\u0e39\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07",title:"\u0e0a\u0e37\u0e48\u0e2d",general:"\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",tab_advanced:"\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07",tab_appearance:"\u0e25\u0e31\u0e01\u0e29\u0e13\u0e30",tab_general:"\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/tn_dlg.js b/js/tiny_mce/plugins/advimage/langs/tn_dlg.js new file mode 100755 index 000000000..b41d05870 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/tr_dlg.js b/js/tiny_mce/plugins/advimage/langs/tr_dlg.js new file mode 100755 index 000000000..405161019 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.advimage_dlg',{image_list:"Resim listesi",align_right:"Sa\u011f",align_left:"Sol",align_textbottom:"Metin altta",align_texttop:"Metin \u00fcstte",align_bottom:"Alt",align_middle:"Orta",align_top:"\u00dcst",align_baseline:"Taban hizas\u0131",align:"Hizalama",hspace:"Yatay bo\u015fluk",vspace:"Dikey bo\u015fluk",dimensions:"Boyutlar",border:"Kenarl\u0131k",list:"Resim listesi",alt:"Resim a\u00e7\u0131klamas\u0131",src:"Resmin URL\'si",dialog_title:"Resim ekle/d\u00fczenle",missing_alt:"Resim a\u00e7\u0131klamas\u0131 girmeden devam etmek istedi\u011finize emini misiniz? Bu olmadan taray\u0131c\u0131da resimleri kapatanlar, metin bazl\u0131 taray\u0131c\u0131lar veya resim baz\u0131 engelli kullan\u0131c\u0131lar g\u00f6remeyeceklerdir.",example_img:"Resim \u00f6nizleme g\u00f6r\u00fcn\u00fcm\u00fc",misc:"\u00c7e\u015fitli",mouseout:"Fare d\u0131\u015f\u0131ndayken",mouseover:"Fare \u00fczerindeyken",alt_image:"Alternatif resim",swap_image:"Resmi takas et",map:"Resim haritas\u0131",id:"Id",rtl:"Soldan sa\u011fa",ltr:"Sa\u011fdan sola",classes:"S\u0131n\u0131fla",style:"Stil",long_desc:"Uzun a\u00e7\u0131klamal\u0131 ba\u011flant\u0131",langcode:"Dil kodu",langdir:"Dil y\u00f6n\u00fc",constrain_proportions:"Oran\u0131 s\u0131n\u0131rla",preview:"\u00d6nizleme",title:"Ba\u015fl\u0131k",general:"Genel",tab_advanced:"Geli\u015fmi\u015f",tab_appearance:"G\u00f6r\u00fcn\u00fcm",tab_general:"Genel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/tt_dlg.js b/js/tiny_mce/plugins/advimage/langs/tt_dlg.js new file mode 100755 index 000000000..10f8162f8 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.advimage_dlg',{image_list:"\u5716\u7247\u6e05\u55ae",align_right:"\u5c45\u53f3",align_left:"\u5c45\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u5e95\u90e8",align_middle:"\u4e2d\u90e8",align_top:"\u9802\u90e8",align_baseline:"\u57fa\u7dda",align:"\u5c0d\u9f4a\u65b9\u5f0f",hspace:"\u6c34\u5e73\u9593\u8ddd",vspace:"\u5782\u76f4\u9593\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u908a\u6846",list:"\u5716\u7247\u6e05\u55ae",alt:"\u5716\u7247\u8aaa\u660e",src:"\u5716\u7247\u4f4d\u5740",dialog_title:"\u63d2\u5165/\u7de8\u8f2f \u5716\u7247",missing_alt:" \u662f\u5426\u4e0d\u7232\u5716\u7247\u52a0\u5165\u8aaa\u660e\u6587\u5b57\uff0c\u5982\u679c\u4e0d\u52a0\u5165\u8aaa\u660e\u6587\u5b57\uff0c\u5c07\u5c0e\u81f4\u4e0d\u652f\u63f4\u5716\u7247\u7684\u700f\u89bd\u5668\u5ffd\u7565\u672c\u5167\u5bb9",example_img:"\u9810\u89bd\u5716\u7247",misc:"\u5176\u4ed6",mouseout:"\u6ed1\u9f20\u79fb\u51fa",mouseover:"\u6ed1\u9f20\u5283\u904e",alt_image:"\u4ea4\u66ff\u5716\u7247",swap_image:"\u5207\u63db\u5716\u7247",map:"\u5716\u7247\u71b1\u9ede",id:"Id",rtl:"\u5f9e\u53f3\u5230\u5de6",ltr:"\u5f9e\u5de6\u5230\u53f3",classes:"\u6a23\u5f0f\u985e",style:"\u6a23\u5f0f",long_desc:"\u63cf\u8ff0",langcode:"\u8a9e\u8a00\u7de8\u78bc",langdir:"\u8a9e\u8a00\u66f8\u5beb\u65b9\u5411",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",preview:"\u9810\u89bd",title:"\u641c\u5c0b",general:"\u57fa\u672c",tab_advanced:"\u9032\u968e",tab_appearance:"\u5916\u89c0",tab_general:"\u57fa\u672c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/tw_dlg.js b/js/tiny_mce/plugins/advimage/langs/tw_dlg.js new file mode 100755 index 000000000..19058a4bd --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.advimage_dlg',{image_list:"\u5716\u7247\u6e05\u55ae",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u9760\u4e0b",align_middle:"\u7f6e\u4e2d",align_top:"\u9760\u4e0a",align_baseline:"\u57fa\u6e96\u7dda",align:"\u5c0d\u9f4a\u65b9\u5f0f",hspace:"\u6c34\u5e73\u9593\u8ddd",vspace:"\u5782\u76f4\u9593\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u908a\u6846",list:"\u5716\u7247\u6e05\u55ae",alt:"\u5716\u7247\u8aaa\u660e",src:"\u5716\u7247URL",dialog_title:"\u63d2\u5165/\u7de8\u8f2f\u5716\u7247",missing_alt:"\u5716\u7247\u6c92\u6709\u8aaa\u660e\u6587\u5b57\uff0c\u662f\u5426\u7e7c\u7e8c\uff1f",example_img:"\u5716\u7247\u5916\u89c0\u9810\u89bd",misc:"\u5176\u5b83",mouseout:"\u6ed1\u9f20\u79fb\u51fa",mouseover:"\u6ed1\u9f20\u79fb\u5165",alt_image:"\u53d6\u4ee3\u5716\u7247",swap_image:"\u5716\u7247\u5207\u63db",map:"\u5716\u7247 Map",id:"ID",rtl:"\u5f9e\u53f3\u5230\u5de6",ltr:"\u5f9e\u5de6\u5230\u53f3",classes:"\u985e\u5225",style:"\u6a23\u5f0f",long_desc:"\u9577\u63cf\u8ff0\u9023\u7d50",langcode:"\u8a9e\u8a00\u7de8\u78bc",langdir:"\u8a9e\u8a00\u66f8\u5beb\u65b9\u5411",constrain_proportions:"\u9396\u5b9a\u6bd4\u4f8b",preview:"\u9810\u89bd",title:"\u6a19\u984c",general:"\u4e00\u822c",tab_advanced:"\u9032\u968e",tab_appearance:"\u5916\u89c0",tab_general:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/uk_dlg.js b/js/tiny_mce/plugins/advimage/langs/uk_dlg.js new file mode 100755 index 000000000..133e52016 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.advimage_dlg',{image_list:"\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044c",align_right:"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_left:"\u041f\u043e \u043b\u0456\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_textbottom:"\u041f\u043e \u043d\u0438\u0436\u043d\u044c\u043e\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0443",align_texttop:"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u044c\u043e\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0443",align_bottom:"\u041f\u043e \u043d\u0438\u0436\u043d\u044c\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_middle:"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",align_top:"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u044c\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_baseline:"\u041f\u043e \u0431\u0430\u0437\u043e\u0432\u0456\u0439 \u043b\u0456\u043d\u0456\u0457",align:"\u0412\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f",hspace:"\u0413\u043e\u0440\u0438\u0437. \u0432\u0456\u0434\u0441\u0442\u0443\u043f",vspace:"\u0412\u0435\u0440\u0442. \u0432\u0456\u0434\u0441\u0442\u0443\u043f",dimensions:"\u0420\u043e\u0437\u043c\u0456\u0440\u0438",border:"\u0420\u0430\u043c\u043a\u0430",list:"\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044c",alt:"\u041e\u043f\u0438\u0441",src:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",dialog_title:"\u0414\u043e\u0434\u0430\u0442\u0438/\u0437\u043c\u0456\u043d\u0438\u0442\u0438 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",missing_alt:"\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u043d\u0456, \u0449\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u0431\u0435\u0437 \u043e\u043f\u0438\u0441\u0443 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f? \u0411\u0435\u0437 \u0446\u044c\u043e\u0433\u043e, \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u043d\u0435 \u0431\u0443\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u043c \u0434\u0435\u044f\u043a\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043c \u0437 \u0432\u0430\u0434\u0430\u043c\u0438, \u0430\u0431\u043e \u0442\u0438\u043c, \u0445\u0442\u043e \u043a\u043e\u0440\u0438\u0442\u0443\u0454\u0442\u044c\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0438\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0430\u0447\u0430\u043c\u0438, \u0430\u0431\u043e \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u0430\u0454 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0438 \u0437 \u0432\u0438\u043c\u043a\u043d\u0435\u043d\u0438\u043c\u0438 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f\u043c\u0438.",example_img:"\u0412\u0438\u0433\u043b\u044f\u0434 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0443 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",misc:"\u0406\u043d\u0448\u0435",mouseout:"\u043f\u0440\u0438 \u0432\u0456\u0434\u0432\u0435\u0434\u0435\u043d\u043d\u0456",mouseover:"\u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u043d\u0456",alt_image:"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0435 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",swap_image:"\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u0437\u0430\u043c\u0456\u043d\u043d\u0438\u043a",map:"\u041c\u0430\u043f\u0430 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",id:"\u0406\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u043e\u0440",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043b\u0456\u0432\u043e\u0440\u0443\u0447",ltr:"\u0417\u043b\u0456\u0432\u0430 \u043f\u0440\u0430\u0432\u043e\u0440\u0443\u0447",classes:"\u041a\u043b\u0430\u0441\u0438",style:"\u0421\u0442\u0438\u043b\u044c",long_desc:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u043f\u043e\u0432\u043d\u0438\u0439 \u043e\u043f\u0438\u0441",langcode:"\u041a\u043e\u0434 \u043c\u043e\u0432\u0438",langdir:"\u041d\u0430\u043f\u0440\u044f\u043c\u043e\u043a \u043c\u043e\u0432\u0438",constrain_proportions:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0456\u0457",preview:"\u041f\u0435\u0440\u0435\u0433\u043b\u044f\u0434",title:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",general:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435",tab_advanced:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e",tab_appearance:"\u0412\u0438\u0433\u043b\u044f\u0434",tab_general:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/ur_dlg.js b/js/tiny_mce/plugins/advimage/langs/ur_dlg.js new file mode 100755 index 000000000..d7e609de9 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.advimage_dlg',{image_list:"Image list",align_right:"Right",align_left:"Left",align_textbottom:"Text bottom",align_texttop:"Text top",align_bottom:"Bottom",align_middle:"Middle",align_top:"Top",align_baseline:"Baseline",align:"Alignment",hspace:"Horizontal space",vspace:"Vertical space",dimensions:"Dimensions",border:"Border",list:"Image list",alt:"Image description",src:"Image URL",dialog_title:"Insert/edit image",missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",example_img:"Appearance preview image",misc:"Miscellaneous",mouseout:"for mouse out",mouseover:"for mouse over",alt_image:"Alternative image",swap_image:"Swap image",map:"Image map",id:"Id",rtl:"Right to left",ltr:"Left to right",classes:"Classes",style:"Style",long_desc:"Long description link",langcode:"Language code",langdir:"Language direction",constrain_proportions:"Constrain proportions",preview:"Preview",title:"Title",general:"General",tab_advanced:"Advanced",tab_appearance:"Appearance",tab_general:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/vi_dlg.js b/js/tiny_mce/plugins/advimage/langs/vi_dlg.js new file mode 100755 index 000000000..31fbfc937 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.advimage_dlg',{image_list:"Danh s\u00e1ch \u1ea3nh",align_right:"Ph\u1ea3i",align_left:"Tr\u00e1i",align_textbottom:"V\u0103n b\u1ea3n d\u01b0\u1edbi c\u00f9ng",align_texttop:"V\u0103n b\u1ea3n tr\u00ean c\u00f9ng",align_bottom:"D\u01b0\u1edbi c\u00f9ng",align_middle:"Gi\u1eefa",align_top:"Tr\u00ean c\u00f9ng",align_baseline:"D\u00f2ng c\u01a1 s\u1edf",align:"Canh l\u1ec1",hspace:"Kho\u1ea3ng c\u00e1ch ngang",vspace:"Kho\u1ea3ng c\u00e1ch d\u1ecdc",dimensions:"K\u00edch th\u01b0\u1edbc",border:"Vi\u1ec1n",list:"Danh s\u00e1ch \u1ea3nh",alt:"M\u00f4 t\u1ea3 \u1ea3nh",src:"URL \u1ea3nh",dialog_title:"Ch\u00e8n/s\u1eeda \u1ea3nh",missing_alt:"Ti\u1ebfp t\u1ee5c v\u1edbi \u0111\u01b0\u1eddng d\u1eabn kh\u00f4ng t\u1ed3n t\u1ea1i ?.",example_img:"Hi\u1ec3n th\u1ecb h\u00ecnh \u1ea3nh xem tr\u01b0\u1edbc",misc:"Linh tinh",mouseout:"cho chu\u1ed9t ra",mouseover:"cho chu\u1ed9t l\u00ean",alt_image:"\u1ea2nh thay th\u1ebf",swap_image:"Trao \u0111\u1ed5i \u1ea3nh",map:"S\u01a1 \u0111\u1ed3 \u1ea3nh",id:"Id",rtl:"Ph\u1ea3i qua tr\u00e1i",ltr:"Tr\u00e1i qua ph\u1ea3i",classes:"L\u1edbp",style:"Ki\u1ec3u d\u00e1ng",long_desc:"Li\u00ean k\u1ebft m\u00f4 t\u1ea3 d\u00e0i",langcode:"M\u00e3 ng\u00f4n ng\u1eef",langdir:"H\u01b0\u1edbng ng\u00f4n ng\u1eef",constrain_proportions:"R\u00e0ng bu\u1ed9c t\u1ec9 l\u1ec7",preview:"Xem tr\u01b0\u1edbc",title:"Ti\u00eau \u0111\u1ec1",general:"Chung",tab_advanced:"N\u00e2ng cao",tab_appearance:"Xu\u1ea5t hi\u1ec7n",tab_general:"Chung"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js new file mode 100755 index 000000000..90ea29895 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.advimage_dlg',{"image_list":"\u56fe\u7247\u5217\u8868","align_right":"\u53f3\u5bf9\u9f50","align_left":"\u5de6\u5bf9\u9f50","align_textbottom":"\u6587\u5b57\u4e0b\u65b9","align_texttop":"\u6587\u5b57\u4e0a\u65b9","align_bottom":"\u5e95\u7aef\u5bf9\u9f50","align_middle":"\u5c45\u4e2d\u5bf9\u9f50","align_top":"\u9876\u7aef\u5bf9\u9f50","align_baseline":"\u5e95\u7ebf",align:"\u5bf9\u9f50",hspace:"\u6c34\u5e73\u8ddd\u79bb",vspace:"\u5782\u76f4\u8ddd\u79bb",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u5217\u8868",alt:"\u56fe\u7247\u63cf\u8ff0",src:"\u56fe\u7247\u94fe\u63a5","dialog_title":"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247","missing_alt":"\u56fe\u7247\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\uff0c\u60a8\u662f\u5426\u8981\u7ee7\u7eed\uff1f\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\u7684\u56fe\u7247\uff0c\u53ef\u80fd\u7ed9\u6b8b\u75be\u4eba\u58eb\u3001\u6587\u672c\u6d4f\u89c8\u5668\u6216\u5173\u95ed\u56fe\u7247\u529f\u80fd\u7684\u6d4f\u89c8\u5668\u8bbf\u95ee\u9020\u6210\u56f0\u96be\u3002","example_img":"\u5916\u89c2\u9884\u89c8\u56fe",misc:"\u5176\u4ed6",mouseout:"\u9f20\u6807\u6ed1\u51fa",mouseover:"\u9f20\u6807\u6ed1\u5165","alt_image":"\u66ff\u6362\u56fe\u7247","swap_image":"\u56fe\u7247\u5207\u6362",map:"\u56fe\u7247map",id:"ID",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",classes:"\u7c7b\u522b",style:"\u6837\u5f0f","long_desc":"\u957f\u63cf\u8ff0\u94fe\u63a5",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u6587\u5b57\u65b9\u5411","constrain_proportions":"\u4fdd\u6301\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u6807\u9898",general:"\u666e\u901a","tab_advanced":"\u9ad8\u7ea7","tab_appearance":"\u5916\u89c2","tab_general":"\u666e\u901a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/zh_dlg.js b/js/tiny_mce/plugins/advimage/langs/zh_dlg.js new file mode 100755 index 000000000..f7982e9b3 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.advimage_dlg',{image_list:"\u56fe\u7247\u6e05\u5355",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u9760\u4e0b",align_middle:"\u7f6e\u4e2d",align_top:"\u9760\u4e0a",align_baseline:"\u57fa\u51c6\u7ebf",align:"\u5bf9\u9f50\u65b9\u5f0f",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u6e05\u5355",alt:"\u56fe\u7247\u8bf4\u660e",src:"\u56fe\u7247URL",dialog_title:"\u63d2\u5165/\u7f16\u8f91\u56fe\u7247",missing_alt:"\u56fe\u7247\u6ca1\u6709\u8bf4\u660e\u6587\u5b57\uff0c\u662f\u5426\u7ee7\u7eed\uff1f",example_img:"\u56fe\u7247\u5916\u89c2\u9884\u89c8",misc:"\u5176\u5b83",mouseout:"\u9f20\u6807\u79fb\u51fa",mouseover:"\u9f20\u6807\u79fb\u5165",alt_image:"\u53d6\u4ee3\u56fe\u7247",swap_image:"\u56fe\u7247\u5207\u6362",map:"\u56fe\u7247 Map",id:"ID",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",long_desc:"\u957f\u8fde\u7ed3",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",constrain_proportions:"\u7ea6\u675f\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u6807\u9898",general:"\u4e00\u822c",tab_advanced:"\u9ad8\u7ea7",tab_appearance:"\u5916\u89c2",tab_general:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advimage/langs/zu_dlg.js b/js/tiny_mce/plugins/advimage/langs/zu_dlg.js new file mode 100755 index 000000000..e6509e493 --- /dev/null +++ b/js/tiny_mce/plugins/advimage/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.advimage_dlg',{image_list:"\u56fe\u7247\u6e05\u5355",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_textbottom:"\u6587\u5b57\u4e0b\u65b9",align_texttop:"\u6587\u5b57\u4e0a\u65b9",align_bottom:"\u4e0b\u65b9",align_middle:"\u5c45\u4e2d",align_top:"\u4e0a\u65b9",align_baseline:"\u57fa\u7ebf",align:"\u5bf9\u9f50\u65b9\u5f0f",hspace:"\u5782\u76f4\u95f4\u8ddd",vspace:"\u6c34\u51c6\u95f4\u8ddd",dimensions:"\u5c3a\u5bf8",border:"\u8fb9\u6846",list:"\u56fe\u7247\u6e05\u5355",alt:"\u56fe\u7247\u8bf4\u660e",src:"\u56fe\u7247\u7f51\u5740",dialog_title:"\u63d2\u5165/\u7f16\u8f91\u56fe\u7247",missing_alt:"\u8bf7\u95ee\u662f\u5426\u786e\u5b9a\u4e0d\u4e3a\u56fe\u7247\u52a0\u5165\u8bf4\u660e\u6587\u5b57\uff1f\u82e5\u6ca1\u6709\u52a0\u5165\u8bf4\u660e\u6587\u5b57\uff0c\u5f53\u4f7f\u7528\u8005\u4f7f\u7528\u4e0d\u8bfb\u5165\u56fe\u7247\u6216\u6587\u5b57\u4f53\u7684\u6d41\u89c8\u5668\u65f6\uff0c\u5c06\u4f1a\u770b\u4e0d\u5230\u8fd9\u4e2a\u56fe\u7247\u3002",example_img:"\u9884\u89c8\u56fe\u7247",misc:"\u5176\u5b83",mouseout:"\u6ed1\u9f20\u79fb\u51fa\u56fe\u7247",mouseover:"\u6ed1\u9f20\u79fb\u5165\u56fe\u7247",alt_image:"\u66ff\u6362\u56fe\u7247",swap_image:"\u5bf9\u6362\u56fe\u7247",map:"\u56fe\u7247\u5730\u56fe",id:"Id",rtl:"\u7531\u53f3\u5230\u5de6",ltr:"\u7531\u5de6\u5230\u53f3",classes:"\u7c7b\u578b",style:"\u6837\u5f0f",long_desc:"\u957f\u63cf\u8ff0\u8fde\u7ed3",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",preview:"\u9884\u89c8",title:"\u67e5\u627e",general:"\u4e00\u822c",tab_advanced:"\u9ad8\u7ea7",tab_appearance:"\u5916\u89c2",tab_general:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/css/advlink.css b/js/tiny_mce/plugins/advlink/css/advlink.css new file mode 100644 index 000000000..66c654935 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/css/advlink.css @@ -0,0 +1,8 @@ +.mceLinkList, .mceAnchorList, #targetlist {width:280px;} +.mceActionPanel {margin-top:7px;} +.panel_wrapper div.current {height:320px;} +#classlist, #title, #href {width:280px;} +#popupurl, #popupname {width:200px;} +#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;} +#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;} +#events_panel input {width:200px;} diff --git a/js/tiny_mce/plugins/advlink/editor_plugin.js b/js/tiny_mce/plugins/advlink/editor_plugin.js new file mode 100644 index 000000000..90568fc97 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/editor_plugin_src.js b/js/tiny_mce/plugins/advlink/editor_plugin_src.js new file mode 100644 index 000000000..5742c20a8 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/editor_plugin_src.js @@ -0,0 +1,61 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.AdvancedLinkPlugin', { + init : function(ed, url) { + this.editor = ed; + + // Register commands + ed.addCommand('mceAdvLink', function() { + var se = ed.selection; + + // No selection and not in link + if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A')) + return; + + ed.windowManager.open({ + file : url + '/link.htm', + width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)), + height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('link', { + title : 'advlink.link_desc', + cmd : 'mceAdvLink' + }); + + ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink'); + + ed.onNodeChange.add(function(ed, cm, n, co) { + cm.setDisabled('link', co && n.nodeName != 'A'); + cm.setActive('link', n.nodeName == 'A' && !n.name); + }); + }, + + getInfo : function() { + return { + longname : 'Advanced link', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/advlink', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/js/advlink.js b/js/tiny_mce/plugins/advlink/js/advlink.js new file mode 100644 index 000000000..d12bf1811 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/js/advlink.js @@ -0,0 +1,523 @@ +/* Functions for the advlink plugin popup */ + +tinyMCEPopup.requireLangPack(); + +var templates = { + "window.open" : "window.open('${url}','${target}','${options}')" +}; + +function preinit() { + var url; + + if (url = tinyMCEPopup.getParam("external_link_list_url")) + document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); +} + +function changeClass() { + var f = document.forms[0]; + + f.classes.value = getSelectValue(f, 'classlist'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + var inst = tinyMCEPopup.editor; + var elm = inst.selection.getNode(); + var action = "insert"; + var html; + + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); + document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); + document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href'); + document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href'); + document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); + + // Link list + html = getLinkListHTML('linklisthref','href'); + if (html == "") + document.getElementById("linklisthrefrow").style.display = 'none'; + else + document.getElementById("linklisthrefcontainer").innerHTML = html; + + // Resize some elements + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '260px'; + + if (isVisible('popupurlbrowser')) + document.getElementById('popupurl').style.width = '180px'; + + elm = inst.dom.getParent(elm, "A"); + if (elm != null && elm.nodeName == "A") + action = "update"; + + formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); + + setPopupControlsDisabled(true); + + if (action == "update") { + var href = inst.dom.getAttrib(elm, 'href'); + var onclick = inst.dom.getAttrib(elm, 'onclick'); + + // Setup form data + setFormValue('href', href); + setFormValue('title', inst.dom.getAttrib(elm, 'title')); + setFormValue('id', inst.dom.getAttrib(elm, 'id')); + setFormValue('style', inst.dom.getAttrib(elm, "style")); + setFormValue('rel', inst.dom.getAttrib(elm, 'rel')); + setFormValue('rev', inst.dom.getAttrib(elm, 'rev')); + setFormValue('charset', inst.dom.getAttrib(elm, 'charset')); + setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang')); + setFormValue('dir', inst.dom.getAttrib(elm, 'dir')); + setFormValue('lang', inst.dom.getAttrib(elm, 'lang')); + setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('type', inst.dom.getAttrib(elm, 'type')); + setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus')); + setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur')); + setFormValue('onclick', onclick); + setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick')); + setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown')); + setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup')); + setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover')); + setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove')); + setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout')); + setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress')); + setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown')); + setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup')); + setFormValue('target', inst.dom.getAttrib(elm, 'target')); + setFormValue('classes', inst.dom.getAttrib(elm, 'class')); + + // Parse onclick data + if (onclick != null && onclick.indexOf('window.open') != -1) + parseWindowOpen(onclick); + else + parseFunction(onclick); + + // Select by the values + selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir')); + selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel')); + selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev')); + selectByValue(formObj, 'linklisthref', href); + + if (href.charAt(0) == '#') + selectByValue(formObj, 'anchorlist', href); + + addClassesToList('classlist', 'advlink_styles'); + + selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true); + selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true); + } else + addClassesToList('classlist', 'advlink_styles'); +} + +function checkPrefix(n) { + if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email'))) + n.value = 'mailto:' + n.value; + + if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external'))) + n.value = 'http://' + n.value; +} + +function setFormValue(name, value) { + document.forms[0].elements[name].value = value; +} + +function parseWindowOpen(onclick) { + var formObj = document.forms[0]; + + // Preprocess center code + if (onclick.indexOf('return false;') != -1) { + formObj.popupreturn.checked = true; + onclick = onclick.replace('return false;', ''); + } else + formObj.popupreturn.checked = false; + + var onClickData = parseLink(onclick); + + if (onClickData != null) { + formObj.ispopup.checked = true; + setPopupControlsDisabled(false); + + var onClickWindowOptions = parseOptions(onClickData['options']); + var url = onClickData['url']; + + formObj.popupname.value = onClickData['target']; + formObj.popupurl.value = url; + formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); + formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); + + formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); + formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); + + if (formObj.popupleft.value.indexOf('screen') != -1) + formObj.popupleft.value = "c"; + + if (formObj.popuptop.value.indexOf('screen') != -1) + formObj.popuptop.value = "c"; + + formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; + formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; + formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; + formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; + formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; + formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; + formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; + + buildOnClick(); + } +} + +function parseFunction(onclick) { + var formObj = document.forms[0]; + var onClickData = parseLink(onclick); + + // TODO: Add stuff here +} + +function getOption(opts, name) { + return typeof(opts[name]) == "undefined" ? "" : opts[name]; +} + +function setPopupControlsDisabled(state) { + var formObj = document.forms[0]; + + formObj.popupname.disabled = state; + formObj.popupurl.disabled = state; + formObj.popupwidth.disabled = state; + formObj.popupheight.disabled = state; + formObj.popupleft.disabled = state; + formObj.popuptop.disabled = state; + formObj.popuplocation.disabled = state; + formObj.popupscrollbars.disabled = state; + formObj.popupmenubar.disabled = state; + formObj.popupresizable.disabled = state; + formObj.popuptoolbar.disabled = state; + formObj.popupstatus.disabled = state; + formObj.popupreturn.disabled = state; + formObj.popupdependent.disabled = state; + + setBrowserDisabled('popupurlbrowser', state); +} + +function parseLink(link) { + link = link.replace(new RegExp('&#39;', 'g'), "'"); + + var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); + + // Is function name a template function + var template = templates[fnName]; + if (template) { + // Build regexp + var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); + var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; + var replaceStr = ""; + for (var i=0; i<variableNames.length; i++) { + // Is string value + if (variableNames[i].indexOf("'${") != -1) + regExp += "'(.*)'"; + else // Number value + regExp += "([0-9]*)"; + + replaceStr += "$" + (i+1); + + // Cleanup variable name + variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), ""); + + if (i != variableNames.length-1) { + regExp += "\\s*,\\s*"; + replaceStr += "<delim>"; + } else + regExp += ".*"; + } + + regExp += "\\);?"; + + // Build variable array + var variables = []; + variables["_function"] = fnName; + var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>'); + for (var i=0; i<variableNames.length; i++) + variables[variableNames[i]] = variableValues[i]; + + return variables; + } + + return null; +} + +function parseOptions(opts) { + if (opts == null || opts == "") + return []; + + // Cleanup the options + opts = opts.toLowerCase(); + opts = opts.replace(/;/g, ","); + opts = opts.replace(/[^0-9a-z=,]/g, ""); + + var optionChunks = opts.split(','); + var options = []; + + for (var i=0; i<optionChunks.length; i++) { + var parts = optionChunks[i].split('='); + + if (parts.length == 2) + options[parts[0]] = parts[1]; + } + + return options; +} + +function buildOnClick() { + var formObj = document.forms[0]; + + if (!formObj.ispopup.checked) { + formObj.onclick.value = ""; + return; + } + + var onclick = "window.open('"; + var url = formObj.popupurl.value; + + onclick += url + "','"; + onclick += formObj.popupname.value + "','"; + + if (formObj.popuplocation.checked) + onclick += "location=yes,"; + + if (formObj.popupscrollbars.checked) + onclick += "scrollbars=yes,"; + + if (formObj.popupmenubar.checked) + onclick += "menubar=yes,"; + + if (formObj.popupresizable.checked) + onclick += "resizable=yes,"; + + if (formObj.popuptoolbar.checked) + onclick += "toolbar=yes,"; + + if (formObj.popupstatus.checked) + onclick += "status=yes,"; + + if (formObj.popupdependent.checked) + onclick += "dependent=yes,"; + + if (formObj.popupwidth.value != "") + onclick += "width=" + formObj.popupwidth.value + ","; + + if (formObj.popupheight.value != "") + onclick += "height=" + formObj.popupheight.value + ","; + + if (formObj.popupleft.value != "") { + if (formObj.popupleft.value != "c") + onclick += "left=" + formObj.popupleft.value + ","; + else + onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',"; + } + + if (formObj.popuptop.value != "") { + if (formObj.popuptop.value != "c") + onclick += "top=" + formObj.popuptop.value + ","; + else + onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',"; + } + + if (onclick.charAt(onclick.length-1) == ',') + onclick = onclick.substring(0, onclick.length-1); + + onclick += "');"; + + if (formObj.popupreturn.checked) + onclick += "return false;"; + + // tinyMCE.debug(onclick); + + formObj.onclick.value = onclick; + + if (formObj.href.value == "") + formObj.href.value = url; +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib.toLowerCase()]; + var dom = tinyMCEPopup.editor.dom; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + // Clean up the style + if (attrib == 'style') + value = dom.serializeStyle(dom.parseStyle(value), 'a'); + + dom.setAttrib(elm, attrib, value); +} + +function getAnchorListHTML(id, target) { + var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = ""; + + html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" o2nfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value='; + html += 'this.options[this.selectedIndex].value;">'; + html += '<option value="">---</option>'; + + for (i=0, len=nodes.length; i<len; i++) { + if ((name = ed.dom.getAttrib(nodes[i], "name")) != "") + html += '<option value="#' + name + '">' + name + '</option>'; + } + + html += '</select>'; + + return html; +} + +function insertAction() { + var inst = tinyMCEPopup.editor; + var elm, elementArray, i; + + elm = inst.selection.getNode(); + checkPrefix(document.forms[0].href); + + elm = inst.dom.getParent(elm, "A"); + + // Remove element if there is no href + if (!document.forms[0].href.value) { + i = inst.selection.getBookmark(); + inst.dom.remove(elm, 1); + inst.selection.moveToBookmark(i); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + return; + } + + // Create new anchor elements + if (elm == null) { + inst.getDoc().execCommand("unlink", false, null); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); + + elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); + for (i=0; i<elementArray.length; i++) + setAllAttribs(elm = elementArray[i]); + } else + setAllAttribs(elm); + + // Don't move caret if selection was image + if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') { + inst.focus(); + inst.selection.select(elm); + inst.selection.collapse(0); + tinyMCEPopup.storeSelection(); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); +} + +function setAllAttribs(elm) { + var formObj = document.forms[0]; + var href = formObj.href.value.replace(/ /g, '%20'); + var target = getSelectValue(formObj, 'targetlist'); + + setAttrib(elm, 'href', href); + setAttrib(elm, 'title'); + setAttrib(elm, 'target', target == '_self' ? '' : target); + setAttrib(elm, 'id'); + setAttrib(elm, 'style'); + setAttrib(elm, 'class', getSelectValue(formObj, 'classlist')); + setAttrib(elm, 'rel'); + setAttrib(elm, 'rev'); + setAttrib(elm, 'charset'); + setAttrib(elm, 'hreflang'); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + setAttrib(elm, 'tabindex'); + setAttrib(elm, 'accesskey'); + setAttrib(elm, 'type'); + setAttrib(elm, 'onfocus'); + setAttrib(elm, 'onblur'); + setAttrib(elm, 'onclick'); + setAttrib(elm, 'ondblclick'); + setAttrib(elm, 'onmousedown'); + setAttrib(elm, 'onmouseup'); + setAttrib(elm, 'onmouseover'); + setAttrib(elm, 'onmousemove'); + setAttrib(elm, 'onmouseout'); + setAttrib(elm, 'onkeypress'); + setAttrib(elm, 'onkeydown'); + setAttrib(elm, 'onkeyup'); + + // Refresh in old MSIE + if (tinyMCE.isMSIE5) + elm.outerHTML = elm.outerHTML; +} + +function getSelectValue(form_obj, field_name) { + var elm = form_obj.elements[field_name]; + + if (!elm || elm.options == null || elm.selectedIndex == -1) + return ""; + + return elm.options[elm.selectedIndex].value; +} + +function getLinkListHTML(elm_id, target_form_element, onchange_func) { + if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0) + return ""; + + var html = ""; + + html += '<select id="' + elm_id + '" name="' + elm_id + '"'; + html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value='; + html += 'this.options[this.selectedIndex].value;'; + + if (typeof(onchange_func) != "undefined") + html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);'; + + html += '"><option value="">---</option>'; + + for (var i=0; i<tinyMCELinkList.length; i++) + html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>'; + + html += '</select>'; + + return html; + + // tinyMCE.debug('-- image list start --', html, '-- image list end --'); +} + +function getTargetListHTML(elm_id, target_form_element) { + var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';'); + var html = ''; + + html += '<select id="' + elm_id + '" name="' + elm_id + '" onf2ocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value='; + html += 'this.options[this.selectedIndex].value;">'; + html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>'; + html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>'; + html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>'; + html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>'; + + for (var i=0; i<targets.length; i++) { + var key, value; + + if (targets[i] == "") + continue; + + key = targets[i].split('=')[0]; + value = targets[i].split('=')[1]; + + html += '<option value="' + key + '">' + value + ' (' + key + ')</option>'; + } + + html += '</select>'; + + return html; +} + +// While loading +preinit(); +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/advlink/langs/ar_dlg.js b/js/tiny_mce/plugins/advlink/langs/ar_dlg.js new file mode 100755 index 000000000..4ff541876 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.advlink_dlg',{target_name:"\u0627\u0633\u0645 \u0627\u0644\u0647\u062f\u0641",classes:"\u0635\u0646\u0641",style:"\u0634\u0643\u0644",id:"Id",popup_position:"\u0645\u0648\u0642\u0639 (X/Y)",langdir:"\u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u0644\u063a\u0629",popup_size:"\u062d\u062c\u0645",popup_dependent:"\u062e\u0627\u0636\u0639 (Mozilla/Firefox only)",popup_resizable:"\u062a\u063a\u064a\u064a\u0631 \u062d\u062c\u0645 \u0646\u0627\u0641\u0630\u0629",popup_location:"\u0639\u0631\u0636 \u0634\u0631\u064a\u0637 \u0627\u0644\u0645\u0648\u0642\u0639",popup_menubar:"\u0639\u0631\u0636 \u0634\u0631\u064a\u0637 \u0627\u0644\u0642\u0648\u0627\u0626\u0645",popup_toolbar:"\u0625\u0638\u0647\u0627\u0631 \u0634\u0631\u064a\u0637 \u0627\u0644\u0623\u062f\u0648\u0627\u062a",popup_statusbar:"\u0639\u0631\u0636 \u0634\u0631\u064a\u0637 \u0627\u0644\u062d\u0627\u0644\u0629",popup_scrollbars:"\u0639\u0631\u0636 \u0623\u0634\u0631\u0637\u0629 \u0627\u0644\u062a\u0645\u0631\u064a\u0631",popup_return:"\u0625\u062f\u0631\u0627\u062c \'\u0639\u0648\u062f\u0629 \u0643\u0627\u0630\u0628\u0629\' \'return false\'",popup_name:"\u0627\u0633\u0645 \u0627\u0644\u0646\u0627\u0641\u0630\u0629",popup_url:"\u0631\u0627\u0628\u0637 \u0637\u0641\u0648 \u0639\u0644\u0649 \u0627\u0644\u0633\u0637\u062d",popup:"\u062c\u0627\u0641\u0627 \u0633\u0643\u0631\u064a\u0628\u062a",target_blank:"\u0641\u064a \u0641\u062a\u062d \u0646\u0627\u0641\u0630\u0629 \u062c\u062f\u064a\u062f\u0629",target_top:"\u0641\u062a\u062d \u0641\u064a \u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0639\u0644\u0648\u064a (\u064a\u062d\u0644 \u0645\u062d\u0644 \u0643\u0627\u0641\u0629 \u0627\u0644\u0625\u0637\u0627\u0631\u0627\u062a)",target_parent:"\u0641\u062a\u062d \u0641\u064a \u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0623\u0635\u0644",target_same:"\u0641\u062a\u062d \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0625\u0637\u0627\u0631",anchor_names:"\u0645\u0631\u062a\u0643\u0632\u0627\u062a",popup_opts:"\u062e\u064a\u0627\u0631\u0627\u062a",advanced_props:"\u062e\u0635\u0627\u0626\u0635 \u0645\u062a\u0642\u062f\u0645\u0629",event_props:"\u0623\u062d\u062f\u0627\u062b",popup_props:"\u062e\u0635\u0627\u0626\u0635 \u0645\u0631\u0628\u0639 \u0637\u0641\u0648 \u0639\u0644\u0649 \u0627\u0644\u0633\u0637\u062d ",general_props:"\u0627\u0644\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0639\u0627\u0645\u0629",advanced_tab:"\u0645\u062a\u0642\u062f\u0645",events_tab:"\u0623\u062d\u062f\u0627\u062b",popup_tab:"\u064a\u0645\u0631\u0628\u0639 \u0637\u0641\u0648 \u0639\u0644\u0649 \u0627\u0644\u0633\u0637\u062d",general_tab:"\u0639\u0627\u0645",list:"\u0642\u0627\u0626\u0645\u0647 \u0627\u0644\u0645\u0648\u0627\u0642\u0639",is_external:"\u0627\u0644\u0631\u0627\u0628\u0637 \u064a\u0628\u062f\u0648 \u0627\u0646\u0647 \u0644\u0645\u0648\u0642\u0639 \u062e\u0627\u0631\u062c\u0649 \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0646 \u0646\u0636\u0639 http://",is_email:"\u0627\u0644\u0631\u0627\u0628\u0637 \u0631\u0628\u0645\u0627 \u0628\u0631\u064a\u062f \u0627\u0644\u0627\u0643\u062a\u0631\u0648\u0646\u0649 \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0646 \u0646\u0636\u0639 \u0648\u0633\u0645 \u0631\u0627\u0628\u0637 \u0627\u0644\u0628\u0631\u064a\u062f",titlefield:"\u0627\u0633\u0645 \u0627\u0644\u0631\u0627\u0628\u0637",target:"Target",url:"\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0631\u0627\u0628\u0637",title:"\u0627\u062f\u062e\u0627\u0644 -\u062a\u0639\u062f\u064a\u0644 \u0631\u0627\u0628\u0637",link_list:"\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0648\u0627\u0628\u0637",rtl:"\u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0625\u0644\u0649 \u0627\u0644\u064a\u0633\u0627\u0631",ltr:"\u0645\u0646 \u0627\u0644\u064a\u0633\u0627\u0631 \u0625\u0644\u0649 \u0627\u0644\u064a\u0645\u064a\u0646",accesskey:"\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0648\u0635\u0648\u0644",tabindex:" Tab \u0641\u0647\u0631\u0633",rev:"\u0639\u0644\u0627\u0642\u0629 \u0627\u0644\u0647\u062f\u0641 \u0644\u0635\u0641\u062d\u0629",rel:"\u0627\u0644\u0639\u0644\u0627\u0642\u0629 \u0627\u0644\u0635\u0641\u062d\u0629 \u0644\u0627\u0633\u062a\u0647\u062f\u0627\u0641",mime:"\u0627\u0644\u0647\u062f\u0641 \u0646\u0648\u0639 \u0627\u0644\u0645\u0644\u0641",encoding:"\u0631\u0645\u0632 \u0627\u0644\u0644\u063a\u0629",langcode:"Language code",target_langcode:"\u0644\u063a\u0629 \u0627\u0644\u0647\u062f\u0641"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/az_dlg.js b/js/tiny_mce/plugins/advlink/langs/az_dlg.js new file mode 100755 index 000000000..7ed1896d5 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.advlink_dlg',{target_name:"H\u0259d\u0259f ad\u0131",classes:"Sinifl\u0259r",style:"Sil",id:"\u0130dentifikator",popup_position:"M\u00f6vqe (X/Y)",langdir:"Dil istiqam\u0259ti",popup_size:"\u00f6l\u00e7\u00fc",popup_dependent:"As\u0131l\u0131 olan (yaln\u0131z Mozilla/Firefox)",popup_resizable:"P\u0259nc\u0259r\u0259 \u00f6l\u00e7\u00fcs\u00fcn\u00fc d\u0259yi\u015fil\u0259n et",popup_location:"\u00dcnvan s\u0259trini g\u00f6st\u0259r",popup_menubar:"Menyu s\u0259trini g\u00f6st\u0259r",popup_toolbar:"Al\u0259tl\u0259r panelini g\u00f6st\u0259r",popup_statusbar:"M\u0259tn v\u0259ziyy\u0259tini g\u00f6st\u0259r",popup_scrollbars:"F\u0131rlanan\u0131n zolaqlar\u0131n\u0131 g\u00f6st\u0259r",popup_return:"\'return false\' \u0259lav\u0259 et",popup_name:"P\u0259nc\u0259r\u0259nin ad\u0131",popup_url:"\u00dcz\u0259 \u00e7\u0131xan p\u0259nc\u0259r\u0259nin \u00fcnvan\u0131",popup:"\u00dcz\u0259 \u00e7\u0131xan Javascript-p\u0259nc\u0259r\u0259",target_blank:"Yeni p\u0259nc\u0259r\u0259d\u0259 a\u00e7",target_top:"Yuxar\u0131 \u00e7\u0259r\u00e7iv\u0259d\u0259 a\u00e7 (dig\u0259rl\u0259rini d\u0259 doldurur)",target_parent:"Ana p\u0259nc\u0259r\u0259d\u0259 a\u00e7 / \u00e7\u0259r\u00e7iv\u0259",target_same:"Bu p\u0259nc\u0259r\u0259d\u0259 a\u00e7 / \u00e7\u0259r\u00e7iv\u0259",anchor_names:"L\u00f6vb\u0259r",popup_opts:"Parametrl\u0259r",advanced_props:"\u018flav\u0259 x\u00fcsusiyy\u0259tl\u0259r",event_props:"Hadis\u0259l\u0259r",popup_props:"\u00dcz\u0259 \u00e7\u0131xan p\u0259nc\u0259r\u0259l\u0259rin x\u00fcsusiyy\u0259tl\u0259ti",general_props:"\u00dcmumi x\u00fcsusiyy\u0259tl\u0259ri",advanced_tab:"\u018flav\u0259l\u0259r",events_tab:"Hadis\u0259l\u0259r",popup_tab:"\u00dcz\u0259 \u00e7\u0131xan p\u0259nc\u0259r\u0259",general_tab:"\u00dcmumi",list:"Ke\u00e7id siyah\u0131s\u0131",is_external:"Daxil edil\u0259n \u00fcnvan xarici ke\u00e7id\u0259 b\u0259nz\u0259yir. http:// prefiksini \u0259lav\u0259 etm\u0259k ist\u0259yirsiniz?",is_email:"Daxil edil\u0259n \u00fcnvan e-po\u00e7ta b\u0259nz\u0259yir. mailto: prefiksini \u0259lav\u0259 etm\u0259k ist\u0259yirsiniz?",titlefield:"Ad\u0131",target:"H\u0259d\u0259f",url:"Ke\u00e7id \u00fcnvan\u0131",title:"Ke\u00e7idi \u0259lav\u0259/redakt\u0259 et",link_list:"Ke\u00e7id siyah\u0131s\u0131",rtl:"Sa\u011fda-sola",ltr:"Solda-sa\u011fa",accesskey:"Giri\u015f klavi\u015fi",tabindex:"Hesab indeksi",rev:"H\u0259d\u0259fin p\u0259nc\u0259r\u0259y\u0259 m\u00fcnasib\u0259ti",rel:"P\u0259nc\u0259r\u0259nin h\u0259d\u0259f\u0259 m\u00fcnasib\u0259ti",mime:"H\u0259d\u0259fli MIME-n\u00f6v",encoding:"H\u0259d\u0259fli kodla\u015fd\u0131rma",langcode:"Dil kodu",target_langcode:"H\u0259d\u0259fli dil"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/be_dlg.js b/js/tiny_mce/plugins/advlink/langs/be_dlg.js new file mode 100755 index 000000000..09c18446b --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.advlink_dlg',{target_name:"\u041d\u0430\u0437\u043e\u045e \u043c\u044d\u0442\u044b",classes:"\u041a\u043b\u0430\u0441\u044b",style:"\u0421\u0442\u044b\u043b\u044c",id:"\u0406\u0434\u044d\u043d\u0442\u044b\u0444\u0456\u043a\u0430\u0442\u0430\u0440",popup_position:"\u041f\u0430\u0437\u0456\u0446\u044b\u044f (X/Y)",langdir:"\u041a\u0456\u0440\u0443\u043d\u0430\u043a \u043c\u043e\u0432\u044b",popup_size:"\u041f\u0430\u043c\u0435\u0440",popup_dependent:"\u0417\u0430\u043b\u0435\u0436\u043d\u044b\u044f (\u0442\u043e\u043b\u044c\u043a\u0456 Mozilla/Firefox)",popup_resizable:"\u0417\u0440\u0430\u0431\u0456\u0446\u044c \u043f\u0430\u043c\u0435\u0440 \u0430\u043a\u043d\u0430 \u0437\u043c\u044f\u043d\u044f\u043d\u044b\u043c",popup_location:"\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u0440\u0430\u0434\u043e\u043a \u0430\u0434\u0440\u0430\u0441\u0443",popup_menubar:"\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u0440\u0430\u0434\u043e\u043a \u043c\u0435\u043d\u044e",popup_toolbar:"\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u043f\u0430\u043d\u044d\u043b\u0456 \u043f\u0440\u044b\u043b\u0430\u0434",popup_statusbar:"\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u0440\u0430\u0434\u043e\u043a \u0441\u0442\u0430\u043d\u0443",popup_scrollbars:"\u041f\u0430\u043a\u0430\u0437\u0430\u0446\u044c \u043f\u0430\u043b\u043e\u0441\u044b \u043f\u0440\u0430\u0433\u043e\u0440\u0442\u043a\u0456",popup_return:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c \'return false\'",popup_name:"\u041d\u0430\u0437\u043e\u045e \u0430\u043a\u043d\u0430",popup_url:"\u0410\u0434\u0440\u0430\u0441 \u0443\u0441\u043f\u043b\u044b\u0432\u0430\u043b\u044c\u043d\u0430\u0433\u0430 \u0430\u043a\u043d\u0430",popup:"\u0423\u0441\u043f\u043b\u044b\u0432\u0430\u043b\u044c\u043d\u0430\u0435 Javascript-\u0430\u043a\u043d\u043e",target_blank:"\u0410\u0434\u043a\u0440\u044b\u0446\u044c \u0443 \u043d\u043e\u0432\u044b\u043c \u0430\u043a\u043d\u0435",target_top:"\u0410\u0434\u043a\u0440\u044b\u0446\u044c \u0443 \u0432\u0435\u0440\u0445\u043d\u0456\u043c \u0444\u0440\u044d\u0439\u043c\u0435 (\u0437\u0430\u043c\u044f\u0448\u0447\u0430\u0435 \u045e\u0441\u0451 \u0430\u0441\u0442\u0430\u0442\u043d\u0456\u044f)",target_parent:"\u0410\u0434\u043a\u0440\u044b\u0446\u044c \u0443 \u0431\u0430\u0446\u044c\u043a\u043e\u045e\u0441\u043a\u0456\u043c \u0430\u043a\u043d\u0435 / \u0444\u0440\u044d\u0439\u043c\u0435",target_same:"\u0410\u0434\u043a\u0440\u044b\u0446\u044c \u0443 \u0433\u044d\u0442\u044b\u043c \u0430\u043a\u043d\u0435 / \u0444\u0440\u044d\u0439\u043c\u0435",anchor_names:"\u042f\u043a\u0430\u0440\u044b",popup_opts:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b",advanced_props:"\u0414\u0430\u0434\u0430\u0442\u043a\u043e\u0432\u044b\u044f \u045e\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456",event_props:"\u041f\u0430\u0434\u0437\u0435\u0456",popup_props:"\u0423\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456 \u045e\u0441\u043f\u043b\u044b\u0432\u0430\u043b\u044c\u043d\u0430\u0433\u0430 \u0430\u043a\u043d\u0430",general_props:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f \u045e\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456",advanced_tab:"\u0414\u0430\u0434\u0430\u0442\u043a\u043e\u0432\u044b\u044f",events_tab:"\u041f\u0430\u0434\u0437\u0435\u0456",popup_tab:"\u0423\u0441\u043f\u043b\u044b\u0432\u0430\u043b\u044c\u043d\u0430\u0435 \u0430\u043a\u043d\u043e",general_tab:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f",list:"\u0421\u043f\u0456\u0441 \u0441\u043f\u0430\u0441\u044b\u043b\u0430\u043a",is_external:"\u0423\u0432\u0435\u0434\u0437\u0435\u043d\u044b \u0430\u0434\u0440\u0430\u0441 \u043f\u0430\u0434\u043e\u0431\u043d\u044b \u043d\u0430 \u0432\u043e\u043d\u043a\u0430\u0432\u0443\u044e \u0441\u043f\u0430\u0441\u044b\u043b\u043a\u0443, \u0432\u044b \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u0434\u0430\u0434\u0430\u0446\u044c \u043f\u0440\u044d\u0444\u0456\u043a\u0441 http://?",is_email:"\u0423\u0432\u0435\u0434\u0437\u0435\u043d\u044b \u0430\u0434\u0440\u0430\u0441 \u043f\u0430\u0434\u043e\u0431\u043d\u044b \u043d\u0430 email, \u0432\u044b \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u0434\u0430\u0434\u0430\u0446\u044c \u043f\u0440\u044d\u0444\u0456\u043a\u0441 mailto:?",titlefield:"\u041d\u0430\u0437\u043e\u045e",target:"\u041c\u044d\u0442\u0430",url:"\u0410\u0434\u0440\u0430\u0441 \u0441\u043f\u0430\u0441\u044b\u043b\u043a\u0456",title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c/\u0440\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u0441\u043f\u0430\u0441\u044b\u043b\u043a\u0443",link_list:"\u0421\u043f\u0456\u0441 \u0441\u043f\u0430\u0441\u044b\u043b\u0430\u043a",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u0430",ltr:"\u0417\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0430",accesskey:"\u041a\u043b\u0430\u0432\u0456\u0448\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0443",tabindex:"\u0410\u0437\u043d\u0430\u0447\u043d\u0456\u043a \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u044b\u0456",rev:"\u0421\u0442\u0430\u045e\u043b\u0435\u043d\u043d\u0435 \u043c\u044d\u0442\u0430 \u0434\u0430 \u0441\u0442\u0430\u0440\u043e\u043d\u043a\u0456",rel:"\u0421\u0442\u0430\u045e\u043b\u0435\u043d\u043d\u0435 \u0441\u0442\u0430\u0440\u043e\u043d\u043a\u0430 \u0434\u0430 \u043c\u044d\u0442\u044b",mime:"\u041c\u044d\u0442\u0430\u0432\u044b MIME-\u0442\u044b\u043f",encoding:"\u041c\u044d\u0442\u0430\u0432\u0430\u044f \u043a\u0430\u0434\u043e\u045e\u043a\u0430",langcode:"\u041a\u043e\u0434 \u043c\u043e\u0432\u044b",target_langcode:"\u041c\u044d\u0442\u0430\u0432\u0430\u044f \u043c\u043e\u0432\u0430"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/bg_dlg.js b/js/tiny_mce/plugins/advlink/langs/bg_dlg.js new file mode 100755 index 000000000..ea83f6253 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.advlink_dlg',{target_name:"\u0418\u043c\u0435 \u043d\u0430 \u0446\u0435\u043b",classes:"\u041a\u043b\u0430\u0441\u043e\u0432\u0435",style:"\u0421\u0442\u0438\u043b",id:"Id",popup_position:"\u041f\u043e\u0437\u0438\u0446\u0438\u044f (X/Y)",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",popup_size:"\u0420\u0430\u0437\u043c\u0435\u0440",popup_dependent:"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u0438 (Mozilla/Firefox only)",popup_resizable:"\u0420\u0430\u0437\u0440\u0435\u0448\u0438 \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0446\u0438\u0442\u0435",popup_location:"\u041f\u043e\u043a\u0430\u0436\u0438 location bar",popup_menubar:"\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u0435\u043d\u0442\u0430\u0442\u0430 \u0441 \u043c\u0435\u043d\u044e\u0442\u0430",popup_toolbar:"\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u0435\u043d\u0442\u0438\u0442\u0435 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438",popup_statusbar:"\u041f\u043e\u043a\u0430\u0436\u0438 status bar",popup_scrollbars:"\u041f\u043e\u043a\u0430\u0436\u0438 \u0441\u043a\u0440\u043e\u043b\u0435\u0440\u0438",popup_return:"\u0412\u043c\u044a\u043a\u043d\u0438 \'return false\'",popup_name:"\u0418\u043c\u0435 \u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430",popup_url:"URL \u043d\u0430 popup-\u0430",popup:"Javascript popup",target_blank:"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u043d\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446",target_top:"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u043d\u0430\u0439-\u0433\u043e\u0440\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c (\u0437\u0430\u043c\u0435\u0441\u0442\u0432\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u043e\u0432\u0435)",target_parent:"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u0433\u043e\u0440\u043d\u0438\u044f \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 / \u0444\u0440\u0435\u0439\u043c",target_same:"\u041e\u0442\u0432\u043e\u0440\u0438 \u0432 \u0442\u043e\u0437\u0438 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 / \u0444\u0440\u0435\u0439\u043c",anchor_names:"\u041a\u043e\u0442\u0432\u0438",popup_opts:"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",advanced_props:"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",event_props:"\u0421\u044a\u0431\u0438\u0442\u0438\u044f",popup_props:"Popup \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",general_props:"\u041e\u0431\u0449\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",advanced_tab:"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",events_tab:"\u0421\u044a\u0431\u0438\u0442\u0438\u044f",popup_tab:"Popup",general_tab:"\u041e\u0431\u0449\u0438",list:"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438",is_external:"URL-\u0442\u043e \u043a\u043e\u0435\u0442\u043e \u0432\u044a\u0432\u0435\u0434\u043e\u0445\u0442\u0435 \u0435 \u0432\u044a\u043d\u0448\u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430, \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0438\u044f\u0442 http:// \u043f\u0440\u0435\u0444\u0438\u043a\u0441?",is_email:"URL-\u0442\u043e \u043a\u043e\u0435\u0442\u043e \u0432\u044a\u0432\u0435\u0434\u043e\u0445\u0442\u0435 \u0435 email \u0430\u0434\u0440\u0435\u0441, \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0438\u044f\u0442 mailto: \u043f\u0440\u0435\u0444\u0438\u043a\u0441?",titlefield:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435",target:"\u0426\u0435\u043b",url:"URL \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430",title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430",link_list:"\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0438",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",accesskey:"\u041a\u043b\u0430\u0432\u0438\u0448",tabindex:"\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u043d\u043e\u0441\u0442",rev:"\u0412\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0446\u0435\u043b - \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",rel:"\u0412\u0437\u0430\u0438\u043c\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0446\u0435\u043b",mime:"MIME \u0442\u0438\u043f",encoding:"\u041a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0442\u0435",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",target_langcode:"\u0415\u0437\u0438\u043a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/bn_dlg.js b/js/tiny_mce/plugins/advlink/langs/bn_dlg.js new file mode 100755 index 000000000..f71254efd --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.advlink_dlg',{"target_name":"Target name",classes:"Classes",style:"Style",id:"Id","popup_position":"Position (X/Y)",langdir:"Language direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox only)","popup_resizable":"Make window resizable","popup_location":"Show location bar","popup_menubar":"Show menu bar","popup_toolbar":"Show toolbars","popup_statusbar":"Show status bar","popup_scrollbars":"Show scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window name","popup_url":"Popup URL",popup:"Javascript popup","target_blank":"Open in new window","target_top":"Open in top frame (replaces all frames)","target_parent":"Open in parent window / frame","target_same":"Open in this window / frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced properties","event_props":"Events","popup_props":"Popup properties","general_props":"General properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link list","is_external":"The URL you entered seems to external link, do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link","link_list":"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code","target_langcode":"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/br_dlg.js b/js/tiny_mce/plugins/advlink/langs/br_dlg.js new file mode 100755 index 000000000..0045d0049 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.advlink_dlg',{target_name:"Nome do alvo",classes:"Classes",style:"Estilo",id:"Id",popup_position:"Posi\u00e7\u00e3o (X/Y)",langdir:"Dire\u00e7\u00e3o do texto",popup_size:"Tamanho",popup_dependent:"Dependente (Mozilla/Firefox apenas)",popup_resizable:"Permitir altera\u00e7\u00e3o do tamanho da janela",popup_location:"Mostrar barra de endere\u00e7os",popup_menubar:"Mostrar barra de menu",popup_toolbar:"Mostrar barras de ferramentas",popup_statusbar:"Mostrar barra de status",popup_scrollbars:"Mostrar barras de scroll",popup_return:"Inserir \'return false\'",popup_name:"Nome da janela",popup_url:"URL do popup",popup:"Popup javascript",target_blank:"Abrir numa nova janela",target_top:"Abrir na p\u00e1gina inteira (substitui todos os quadros)",target_parent:"Abrir na janela/quadro pai",target_same:"Abrir nesta janela/quadro",anchor_names:"\u00c2ncoras",popup_opts:"Op\u00e7\u00f5es",advanced_props:"Propriedades avan\u00e7adas",event_props:"Eventos",popup_props:"Propriedades de popup",general_props:"Propriedades gerais",advanced_tab:"Avan\u00e7ado",events_tab:"Eventos",popup_tab:"Popup",general_tab:"Geral",list:"Lista de hyperlinks",is_external:"A URL digitada parece conduzir a um link externo. Deseja acrescentar o (necess\u00e1rio) prefixo http://?",is_email:"A URL digitada parece ser um endere\u00e7o de e-mail. Deseja acrescentar o (necess\u00e1rio) prefixo mailto:?",titlefield:"T\u00edtulo",target:"Alvo",url:"URL do hyperlink",title:"Inserir/editar hyperlink",link_list:"Lista de hyperlinks",rtl:"Da direita para a esquerda",ltr:"Da esquerda para a direita",accesskey:"Chave de acesso",tabindex:"Tabindex",rev:"Rela\u00e7\u00e3o alvo/p\u00e1gina",rel:"Rela\u00e7\u00e3o p\u00e1gina/alvo",mime:"Tipo MIME alvo",encoding:"Codifica\u00e7\u00e3o de caracteres",langcode:"C\u00f3digo da linguagem",target_langcode:"linguagem alvo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/bs_dlg.js b/js/tiny_mce/plugins/advlink/langs/bs_dlg.js new file mode 100755 index 000000000..4c5fb4873 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.advlink_dlg',{target_name:"Ime mete",classes:"Klasa",style:"Stil",id:"Id",popup_position:"Pozicija (X/Y)",langdir:"Smjer jezika",popup_size:"Veli\u010dina",popup_dependent:"Ovisan (samo za Mozilla/Firefox)",popup_resizable:"Prozor promjenjive veli\u010dine",popup_location:"Poka\u017ei traku lokacije",popup_menubar:"Poka\u017ei izbornik",popup_toolbar:"Poka\u017ei alatne trake",popup_statusbar:"Poka\u017ei statusnu traku",popup_scrollbars:"Poka\u017ei kliza\u010de",popup_return:"Umetni \'return false\'",popup_name:"Ime prozora",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Otvori u novom prozoru",target_top:"Otvori u gornjem okviru (zamjenjuje sve okvire)",target_parent:"Otvori u izvornom prozoru / okvir",target_same:"Otovori u novom prozoru / okviru",anchor_names:"Sidra",popup_opts:"Opcije",advanced_props:"Napredna svojstva",event_props:"Doga\u0111aji",popup_props:"Svojstva popup prozora",general_props:"Osnovna svojstva",advanced_tab:"Napredno",events_tab:"Doga\u0111aj",popup_tab:"Popup",general_tab:"Osnovno",list:"Lista poveznica",is_external:"URL koji ste unijeli izgleda kao vanjska poveznica, \u017eelite li dodati potrebni http:// prefiks?",is_email:"URL koji ste unijeli izgleda kao e-mail adresa, \u017eelite li dodati potrebni mailto: prefiks?",titlefield:"Naslov",target:"Meta",url:"URL poveznice",title:"Umetni/uredi poveznicu",link_list:"Lista poveznica",rtl:"S desna na lijevo",ltr:"S lijeva na desno",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Odnos mete prema stranici",rel:"Odnos stranice prema meti",mime:"MIME tip",encoding:"Kodiranje znakova",langcode:"Kod jezika",target_langcode:"Jezik"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ca_dlg.js b/js/tiny_mce/plugins/advlink/langs/ca_dlg.js new file mode 100755 index 000000000..c45dd2e21 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.advlink_dlg',{"target_name":"Nom del dest\u00ed",classes:"Classes",style:"Estil",id:"Id","popup_position":"Posici\u00f3 (X/Y)",langdir:"Direcci\u00f3 de l\'idioma","popup_size":"Mida","popup_dependent":"Dependent (nom\u00e9s Mozilla/Firefox)","popup_resizable":"Fes la finestra redimensionable","popup_location":"Mostra la barra d\'ubicaci\u00f3","popup_menubar":"Mostra la barra de men\u00fa","popup_toolbar":"Mostra la barra d\'eines","popup_statusbar":"Mostra la barra d\'estat","popup_scrollbars":"Mostra les barres de despla\u00e7ament","popup_return":"Insereix \'return false\'","popup_name":"Nom de la finestra","popup_url":"URL de la finestra emergent",popup:"Finestra emergent javascript","target_blank":"Obre en una nova finestra","target_top":"Obre en el marc superior (reempla\u00e7a tots els marcs)","target_parent":"Obre en la finestra / marc pare","target_same":"Obre en aquesta finestra / marc","anchor_names":"\u00c0ncores","popup_opts":"Opcions","advanced_props":"Propietats avan\u00e7ades","event_props":"Esdeveniments","popup_props":"Propietats de la finestra emergent","general_props":"Propietats generals","advanced_tab":"Avan\u00e7at","events_tab":"Esdeveniments","popup_tab":"Finestra emergent","general_tab":"General",list:"Llista d\'enlla\u00e7os","is_external":"L\'URL que heu introdu\u00eft sembla ser un enlla\u00e7 extern, voleu afegir-hi el prefix requerit http:// ?","is_email":"L\'URL que heu introdu\u00eft sembla ser una adre\u00e7a de correu electr\u00f2nic, voleu afegir-hi el prefix requerit mailto: ?",titlefield:"T\u00edtol",target:"Objectiu",url:"URL de l\'enlla\u00e7",title:"Insereix/edita enlla\u00e7","link_list":"Llista d\'enlla\u00e7os",rtl:"De dreta a esquerra",ltr:"D\'esquerra a dreta",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relaci\u00f3 de dest\u00ed a p\u00e0gina",rel:"Relaci\u00f3 de p\u00e0gina a dest\u00ed",mime:"Tipus MIME del dest\u00ed",encoding:"Codificaci\u00f3 de car\u00e0cters del dest\u00ed",langcode:"Codi de l\'idioma","target_langcode":"Idioma del dest\u00ed"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ch_dlg.js b/js/tiny_mce/plugins/advlink/langs/ch_dlg.js new file mode 100755 index 000000000..c9dd3ab74 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.advlink_dlg',{target_name:"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",id:"ID",popup_position:"\u4f4d\u7f6e\uff08X/Y\uff09",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",popup_size:"\u5927\u5c0f",popup_dependent:"\u6d4f\u89c8\u5668\u9650\u5236\uff08\u4ec5\u652f\u63f4 Mozilla/Firefox\uff09",popup_resizable:"\u5f39\u7a97\u53ef\u8c03\u6574\u5927\u5c0f",popup_location:"\u663e\u793a\u5730\u5740\u680f",popup_menubar:"\u663e\u793a\u83dc\u5355\u5217",popup_toolbar:"\u663e\u793a\u5de5\u5177\u5217",popup_statusbar:"\u663e\u793a\u72b6\u6001\u5217",popup_scrollbars:"\u663e\u793a\u6eda\u52a8\u6761",popup_return:"\u63d2\u5165 \"return false\"",popup_name:"\u89c6\u7a97\u540d\u79f0",popup_url:"\u5f39\u51fa\u89c6\u7a97URL",popup:"JavaScript \u5f39\u51fa\u89c6\u7a97",target_blank:"\u5728\u65b0\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",target_top:"\u5728\u9876\u90e8\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",target_parent:"\u5728\u7236\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",target_same:"\u5728\u76ee\u524d\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",anchor_names:"\u4e66\u7b7e",popup_opts:"\u9009\u9879",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5f39\u51fa\u89c6\u7a97\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7\u5c5e\u6027",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5f39\u51fa\u89c6\u7a97",general_tab:"\u4e00\u822c",list:"\u8d85\u8fde\u7ed3\u6e05\u5355",is_external:"\u60a8\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u4e3a\u5916\u90e8\u8d85\u8fde\u7ed3\uff0c\u662f\u5426\u8981\u52a0\u4e0a \"http://\" ?",is_email:"\u60a8\u8f93\u5165\u7684\u4f3c\u4e4e\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u52a0 mailto:?",titlefield:"\u6807\u9898",target:"\u76ee\u6807",url:"\u8d85\u8fde\u7ed3URL",title:"\u63d2\u5165/\u7f16\u8f91\u8d85\u8fde\u7ed3",link_list:"\u8d85\u8fde\u7ed3\u6e05\u5355",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",accesskey:"\u5feb\u901f\u952e",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6807\u5230\u7f51\u9875\u7684\u5173\u7cfb",rel:"\u7f51\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u76ee\u6807\u8bed\u8a00\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801",target_langcode:"\u76ee\u6807\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/cn_dlg.js b/js/tiny_mce/plugins/advlink/langs/cn_dlg.js new file mode 100755 index 000000000..90d554311 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.advlink_dlg',{"target_name":"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",id:"Id\u7f16\u53f7","popup_position":"\u4f4d\u7f6e (X/Y)",langdir:"\u6587\u672c\u65b9\u5411","popup_size":"\u6587\u672c\u5927\u5c0f","popup_dependent":"\u6d4f\u89c8\u5668\u9650\u5236(\u4ec5\u652f\u6280Mozilla/Firefox)","popup_resizable":"\u7a97\u53e3\u5927\u5c0f\u53ef\u8c03","popup_location":"\u663e\u793a\u5730\u5740\u680f","popup_menubar":"\u663e\u793a\u83dc\u5355\u680f","popup_toolbar":"\u663e\u793a\u5de5\u5177\u680f","popup_statusbar":"\u663e\u793a\u72b6\u6001\u680f","popup_scrollbars":"\u663e\u793a\u6eda\u52a8\u6761","popup_return":"\u63d2\u5165 \"return false\"","popup_name":"\u65b0\u7a97\u53e3\u540d\u79f0","popup_url":"\u5f39\u7a97URL\u5730\u5740",popup:"JavaScript \u5f39\u51fa","target_blank":"\u5728\u65b0\u7a97\u53e3\u6253\u5f00","target_top":"\u5728\u9876\u90e8\u7a97\u53e3\u6253\u5f00\u8d85\u94fe\u63a5","target_parent":"\u5728\u7236\u7ea7\u7a97\u53e3\u6253\u5f00\u8d85\u94fe\u63a5","target_same":"\u5728\u76ee\u524d\u7a97\u53e3\u6253\u5f00\u8d85\u94fe\u63a5","anchor_names":"\u951a\u70b9","popup_opts":"\u9009\u9879","advanced_props":"\u9ad8\u7ea7\u5c5e\u6027","event_props":"\u4e8b\u4ef6","popup_props":"\u5f39\u51fa\u5c5e\u6027","general_props":"\u5e38\u89c4\u5c5e\u6027","advanced_tab":"\u9ad8\u7ea7","events_tab":"\u4e8b\u4ef6","popup_tab":"\u5f39\u7a97","general_tab":"\u5e38\u89c4",list:"\u94fe\u63a5\u5217\u8868","is_external":"\u60a8\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u4e3a\u5916\u90e8\u8d85\u8fde\u7ed3\uff0c\u662f\u5426\u8981\u52a0\u4e0a \u201chttp://\u201d\u524d\u7f00?","is_email":"\u60a8\u8f93\u5165\u7684\u4f3c\u4e4e\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740,\u662f\u5426\u9700\u8981\u52a0 mailto:\uff1f",titlefield:"\u6807\u9898",target:"\u76ee\u6807",url:"\u94fe\u63a5URL\u5730\u5740",title:"\u63d2\u5165/\u7f16\u8f91\u94fe\u63a5","link_list":"\u94fe\u63a5\u5217\u8868",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",accesskey:"\u5feb\u6377\u952e",tabindex:"Tab\u952e\u8bbf\u95ee\u987a\u5e8f",rev:"\u76ee\u6807\u5230\u7f51\u9875\u7684\u5173\u7cfb",rel:"\u7f51\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u76ee\u6807\u5b57\u7b26\u96c6\uff08UTF-8\uff09",langcode:"\u8bed\u8a00\u7f16\u7801","target_langcode":"\u76ee\u6807\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/cs_dlg.js b/js/tiny_mce/plugins/advlink/langs/cs_dlg.js new file mode 100755 index 000000000..a1f3ab1bf --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.advlink_dlg',{target_name:"N\u00e1zev c\u00edle",classes:"T\u0159\u00eddy",style:"Styl",id:"ID",popup_position:"Um\u00edst\u011bn\u00ed (X/Y)",langdir:"Sm\u011br textu",popup_size:"Velikost",popup_dependent:"Z\u00e1vislost (pouze Mozilla/Firefox)",popup_resizable:"Umo\u017enit zm\u011bnu velikosti",popup_location:"Zobrazit pole s adresou",popup_menubar:"Zobrazit nab\u00eddku",popup_toolbar:"Zobrazit n\u00e1strojovou li\u0161tu",popup_statusbar:"Zobrazit stavov\u00fd \u0159\u00e1dek",popup_scrollbars:"Zobrazit posuvn\u00edky",popup_return:"Vlo\u017eit \'return false\'",popup_name:"N\u00e1zev okna",popup_url:"URL vyskakovac\u00edho okna",popup:"Javascriptov\u00e9 okno",target_blank:"Otev\u0159\u00edt v nov\u00e9m okn\u011b/r\u00e1mu",target_top:"Otev\u0159\u00edt v hlavn\u00edm okn\u011b/r\u00e1mu (nahradit v\u0161echny r\u00e1my)",target_parent:"Otev\u0159\u00edt v nad\u0159azen\u00e9m okn\u011b/r\u00e1mu",target_same:"Otev\u0159\u00edt v tomto okn\u011b/r\u00e1mu",anchor_names:"Z\u00e1lo\u017eka",popup_opts:"Mo\u017enosti",advanced_props:"Roz\u0161\u00ed\u0159en\u00e9 parametry",event_props:"Ud\u00e1losti",popup_props:"Vlastnosti vyskakovac\u00edho okna",general_props:"Obecn\u00e9 parametry",advanced_tab:"Roz\u0161\u00ed\u0159en\u00e9",events_tab:"Ud\u00e1losti",popup_tab:"Vyskakovac\u00ed okno",general_tab:"Obecn\u00e9",list:"Seznam odkaz\u016f",is_external:"Zadan\u00e9 URL vypad\u00e1 jako extern\u00ed odkaz, chcete doplnit povinn\u00fd prefix http://?",is_email:"Zadan\u00e9 URL vypad\u00e1 jako e-mailov\u00e1 adresa, chcete doplnit povinn\u00fd prefix mailto:?",titlefield:"Titulek",target:"C\u00edl",url:"URL odkazu",title:"Vlo\u017eit/upravit odkaz",link_list:"Seznam odkaz\u016f",rtl:"Zprava doleva",ltr:"Zleva doprava",accesskey:"Kl\u00e1vesov\u00e1 zkratka",tabindex:"Po\u0159ad\u00ed pro tabul\u00e1tor",rev:"Vztah c\u00edle ke str\u00e1nce",rel:"Vztah str\u00e1nky k c\u00edli",mime:"MIME typ",encoding:"K\u00f3dov\u00e1n\u00ed",langcode:"K\u00f3d jazyka",target_langcode:"Jazyk c\u00edle"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/cy_dlg.js b/js/tiny_mce/plugins/advlink/langs/cy_dlg.js new file mode 100755 index 000000000..37acc679c --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.advlink_dlg',{target_name:"Enw targed",classes:"Dosbarthiadau",style:"Arddull",id:"Id",popup_position:"Safle (X/Y)",langdir:"Cyfeiriad iaith",popup_size:"Maint",popup_dependent:"Dibynnol (dim ond Mozilla/Firefox)",popup_resizable:"Gwneud ffenest yn ailfeintiol",popup_location:"Dangos bar lleoliad",popup_menubar:"Dangos bar dewislen",popup_toolbar:"Dangos barrau offer",popup_statusbar:"Dangor bar statws",popup_scrollbars:"Dangos bar sgrolio",popup_return:"Mewnosod \'return false\'",popup_name:"Enw ffenest",popup_url:"URL naidlen",popup:"Naidlen JavaScript",target_blank:"Agor mewn ffenest newydd",target_top:"Agor mewn pen ffr\u00e2m (amnewid pob ffr\u00e2m)",target_parent:"Agos mewn y ffenest / ffr\u00e2m rhiant",target_same:"Agos mewn y ffenest / ffr\u00e2m yma",anchor_names:"Angorau",popup_opts:"Dewisiadau",advanced_props:"Priodweddau uwch",event_props:"Digwyddiadau",popup_props:"Priodweddau cyffredinol",general_props:"Priodweddau cyfferdinol",advanced_tab:"Uwch",events_tab:"Digwyddiadau",popup_tab:"Naidlen",general_tab:"Cyffredinol",list:"Rhestr cysylltau",is_external:"Mae\'r URL a rydych wedi rhoi yn edrych fel cyswllt allannol, ydych chi eisiau ychwanegu\'r rhagddodiad http:// sydd angen?",is_email:"Mae\'r URL a rydych wedi rhoi yn edrych fel cyferiad e-bost, ydych chi eisiau ychwanegu\'r rhagddodiad mailto: sydd angen?",titlefield:"Teitl",target:"Targed",url:"URL cyswllt",title:"Mewnosod/Golygu cyswllt",link_list:"Rhestr cysylltau",rtl:"De i\'r chwith",ltr:"Chwith i\'r dde",accesskey:"Bysell mynediad",tabindex:"Trefn tabio",rev:"Perthynas y targed i\'r tudalen",rel:"Perthynas y tudalen i\'r targed",mime:"Math MIME targed",encoding:"Amgodiad nodau targed",langcode:"Cod iaith",target_langcode:"Iaith targed"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/da_dlg.js b/js/tiny_mce/plugins/advlink/langs/da_dlg.js new file mode 100755 index 000000000..cac424619 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.advlink_dlg',{target_name:"Destinationsnavn",classes:"Klasser",style:"Stil",id:"Id",popup_position:"Position (X/Y)",langdir:"Sprogretning",popup_size:"St\u00f8rrelse",popup_dependent:"Afh\u00e6ngig (Kun Mozilla/Firefox)",popup_resizable:"Lad det v\u00e6re muligt at \u00e6ndre st\u00f8rrelsen p\u00e5 vinduet",popup_location:"Vis adresselinje",popup_menubar:"Vis menulinje",popup_toolbar:"Vis v\u00e6rkt\u00f8jslinjer",popup_statusbar:"Vis statuslinje",popup_scrollbars:"Vis rullepanel",popup_return:"Inds\u00e6t \'return false\'",popup_name:"Vinduesnavn",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"\u00c5ben i nyt vindue",target_top:"\u00c5ben i \u00f8verste vindue / ramme (erstatter alle rammer)",target_parent:"\u00c5ben i overliggende vindue / ramme",target_same:"\u00c5ben i dette vindue / ramme",anchor_names:"Ankre",popup_opts:"Indstillinger",advanced_props:"Avancerede egenskaber",event_props:"H\u00e6ndelser",popup_props:"Popup egenskaber",general_props:"Generelle egenskaber",advanced_tab:"Advanceret",events_tab:"H\u00e6ndelser",popup_tab:"Popup",general_tab:"Generelt",list:"Liste over links",is_external:"Den URL, der er indtastet, ser ud til at v\u00e6re et eksternt link. Vil du have tilf\u00f8jet det p\u00e5kr\u00e6vede http:// foran?",is_email:"Den URL, der er indtastet, ser ud til at v\u00e6re en emailadresse. Vil du have tilf\u00f8jet det p\u00e5kr\u00e6vede mailto: foran?",titlefield:"Titel",target:"M\u00e5l",url:"Link URL",title:"Inds\u00e6t/rediger link",link_list:"Liste over links",rtl:"H\u00f8jre mod venstre",ltr:"Venstre mod h\u00f8jre",accesskey:"Genvejstast",tabindex:"Tabindex",rev:"Relativ destination til side",rel:"Relativ side til destination",mime:"Destinations-MIME-type",encoding:"Destinationstegns\u00e6t",langcode:"Sprogkode",target_langcode:"Destinationssprog"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/de_dlg.js b/js/tiny_mce/plugins/advlink/langs/de_dlg.js new file mode 100755 index 000000000..e18e7c158 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.advlink_dlg',{target_name:"Name der Zielseite",classes:"Klassen",style:"Format",id:"ID",popup_position:"Position (X/Y)",langdir:"Schriftrichtung",popup_size:"Gr\u00f6\u00dfe",popup_dependent:"Vom Elternfenster abh\u00e4ngig <br /> (nur Mozilla/Firefox) ",popup_resizable:"Vergr\u00f6\u00dfern des Fenster zulassen",popup_location:"Adressleiste anzeigen",popup_menubar:"Browsermen\u00fc anzeigen",popup_toolbar:"Werkzeugleisten anzeigen",popup_statusbar:"Statusleiste anzeigen",popup_scrollbars:"Scrollbalken anzeigen",popup_return:"Link trotz Popup folgen",popup_name:"Name des Fensters",popup_url:"Popup-Adresse",popup:"JavaScript-Popup",target_blank:"In neuem Fenster \u00f6ffnen",target_top:"Im obersten Frame \u00f6ffnen (sprengt das Frameset)",target_parent:"Im \u00fcbergeordneten Fenster/Frame \u00f6ffnen",target_same:"Im selben Fenster/Frame \u00f6ffnen",anchor_names:"Anker",popup_opts:"Optionen",advanced_props:"Erweiterte Eigenschaften",event_props:"Ereignisse",popup_props:"Popup-Eigenschaften",general_props:"Allemeine Eigenschaften",advanced_tab:"Erweitert",events_tab:"Ereignisse",popup_tab:"Popup",general_tab:"Allgemein",list:"Linkliste",is_external:"Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http://\" voranstellen?",is_email:"Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?",titlefield:"Titel",target:"Fenster",url:"Adresse",title:"Link einf\u00fcgen/bearbeiten",link_list:"Linkliste",rtl:"Rechts nach links",ltr:"Links nach rechts",accesskey:"Tastenk\u00fcrzel",tabindex:"Tabindex",rev:"Beziehung des Linkziels zur Seite",rel:"Beziehung der Seite zum Linkziel",mime:"MIME-Type der Zielseite",encoding:"Zeichenkodierung der Zielseite",langcode:"Sprachcode",target_langcode:"Sprache der Zielseite"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/dv_dlg.js b/js/tiny_mce/plugins/advlink/langs/dv_dlg.js new file mode 100755 index 000000000..84d7ebe14 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/el_dlg.js b/js/tiny_mce/plugins/advlink/langs/el_dlg.js new file mode 100755 index 000000000..b4e2a61d9 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.advlink_dlg',{target_name:"\u038c\u03bd\u03bf\u03bc\u03b1 \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",classes:"\u039a\u03bb\u03ac\u03c3\u03b5\u03b9\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",id:"Id",popup_position:"\u0398\u03ad\u03c3\u03b7 (X/Y)",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",popup_size:"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2",popup_dependent:"\u0395\u03be\u03b1\u03c1\u03c4\u03ce\u03bc\u03b5\u03bd\u03bf (\u03bc\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 Mozilla/Firefox)",popup_resizable:"\u039d\u03b1 \u03b1\u03bb\u03bb\u03ac\u03b6\u03bf\u03c5\u03bd \u03bf\u03b9 \u03b4\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5",popup_location:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c4\u03bf\u03c0\u03bf\u03b8\u03b5\u03c3\u03af\u03b1\u03c2",popup_menubar:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03bc\u03b5\u03bd\u03bf\u03cd",popup_toolbar:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03c9\u03bd",popup_statusbar:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2",popup_scrollbars:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c1\u03ac\u03b2\u03b4\u03c9\u03bd \u03ba\u03cd\u03bb\u03b9\u03c3\u03b7\u03c2",popup_return:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \'return false\'",popup_name:"\u038c\u03bd\u03bf\u03bc\u03b1 \u03c0\u03b1\u03c1\u03b1\u03b8\u03cd\u03c1\u03bf\u03c5",popup_url:"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c4\u03bf\u03c5 Popup",popup:"Javascript popup",target_blank:"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03b5 \u03bd\u03ad\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf",target_top:"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03c4\u03bf \u03c0\u03b9\u03bf \u03c0\u03ac\u03bd\u03c9 frame (\u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03b8\u03b9\u03c3\u03c4\u03ac \u03cc\u03bb\u03b1 \u03c4\u03b1 frames)",target_parent:"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03c4\u03bf \u03b3\u03bf\u03bd\u03b9\u03ba\u03cc window / frame",target_same:"\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c3\u03b5 \u03af\u03b4\u03b9\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf / frame",anchor_names:"Anchors",popup_opts:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2",advanced_props:"\u03a0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",event_props:"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1",popup_props:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 Popup",general_props:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ad\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",advanced_tab:"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2",events_tab:"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1",popup_tab:"Popup",general_tab:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",list:"\u039b\u03af\u03c3\u03c4\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03c9\u03bd",is_external:"\u0397 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c0\u03bf\u03c5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03be\u03c9\u03c4\u03b5\u03c1\u03b9\u03ba\u03cc\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2, \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf http:// ;",is_email:"\u0397 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c0\u03bf\u03c5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 email, \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c0\u03b1\u03c1\u03b1\u03af\u03c4\u03b7\u03c4\u03bf mailto: ;",titlefield:"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2",target:"\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2",url:"\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae URL \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5",link_list:"\u039b\u03af\u03c3\u03c4\u03b1 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03c9\u03bd",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",accesskey:"\u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",tabindex:"Tabindex",rev:"\u03a3\u03c7\u03ad\u03c3\u03b7 \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c2 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 (REV)",rel:"\u03a3\u03c7\u03ad\u03c3\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1\u03c2 \u03c0\u03c1\u03bf\u03c2 \u03c3\u03c4\u03cc\u03c7\u03bf (REL)",mime:"\u03a4\u03cd\u03c0\u03bf\u03c2 MIME \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",encoding:"\u039a\u03c9\u03b4\u03b9\u03ba\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",target_langcode:"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1 \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/en_dlg.js b/js/tiny_mce/plugins/advlink/langs/en_dlg.js new file mode 100644 index 000000000..dba4e88ce --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.advlink_dlg',{"target_name":"Target name",classes:"Classes",style:"Style",id:"Id","popup_position":"Position (X/Y)",langdir:"Language direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox only)","popup_resizable":"Make window resizable","popup_location":"Show location bar","popup_menubar":"Show menu bar","popup_toolbar":"Show toolbars","popup_statusbar":"Show status bar","popup_scrollbars":"Show scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window name","popup_url":"Popup URL",popup:"Javascript popup","target_blank":"Open in new window","target_top":"Open in top frame (replaces all frames)","target_parent":"Open in parent window / frame","target_same":"Open in this window / frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced properties","event_props":"Events","popup_props":"Popup properties","general_props":"General properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link list","is_external":"The URL you entered seems to external link, do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link","link_list":"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code","target_langcode":"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/es_dlg.js b/js/tiny_mce/plugins/advlink/langs/es_dlg.js new file mode 100755 index 000000000..aaede5138 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.advlink_dlg',{"target_name":"Nombre del Target",classes:"Clases",style:"Estilo",id:"Id","popup_position":"Posici\u00f3n (X/Y)",langdir:"Direcci\u00f3n del lenguaje","popup_size":"Tama\u00f1o","popup_dependent":"Dependientes (s\u00f3lo Mozilla/Firefox)","popup_resizable":"Permitir cambiar el tama\u00f1o de la ventana","popup_location":"Barra de localizaci\u00f3n","popup_menubar":"Barra de men\u00fa","popup_toolbar":"Barra de herramientas","popup_statusbar":"Barra de estado","popup_scrollbars":"Barras de desplazamiento","popup_return":"Insertar \'return false\'","popup_name":"Nombre de la ventana","popup_url":"URL de la ventana emergente",popup:"Javascript popup","target_blank":"Abrir en ventana nueva","target_top":"Abrir en el marco superior (reemplaza todos los marcos)","target_parent":"Abrir en ventana padre / marco","target_same":"Abrir en esta ventana / marco","anchor_names":"Anclas","popup_opts":"Opciones","advanced_props":"Propiedades avanzadas","event_props":"Eventos","popup_props":"Propiedades de ventanas emergentes","general_props":"Propiedades generales","advanced_tab":"Avanzado","events_tab":"Eventos","popup_tab":"Ventana emergente","general_tab":"General",list:"Lista de v\u00ednculos","is_external":"La URL que ha introducido parece ser un v\u00ednculo externo, \u00bfdesea agregar el prefijo http:// necesario?","is_email":"La URL que ha introducido parece ser una direci\u00f3n de correo, \u00bfdesea agregar el prefijo mailto: necesario?",titlefield:"T\u00edtulo",target:"Destino",url:"URL del hiperv\u00ednculo",title:"Insertar/editar hiperv\u00ednculo","link_list":"Lista de v\u00ednculo",rtl:"Derecha a izquierda",ltr:"Izquierda a derecha",accesskey:"Tecla de acceso",tabindex:"Indice de tabulaci\u00f3n",rev:"Relaci\u00f3n target a p\u00e1gina",rel:"Relaci\u00f3n p\u00e1gina a target",mime:"Tipo MIME del Target",encoding:"Codificaci\u00f3n de caracteres del Target",langcode:"C\u00f3digo del lenguaje","target_langcode":"Lenguaje del Target"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/et_dlg.js b/js/tiny_mce/plugins/advlink/langs/et_dlg.js new file mode 100755 index 000000000..954cdd59a --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.advlink_dlg',{target_name:"Sihtm\u00e4rgi nimi",classes:"Klassid",style:"Stiil",id:"ID",popup_position:"Positsioon (X/Y)",langdir:"Keele suund",popup_size:"Suurus",popup_dependent:"S\u00f5ltuv (ainult Mozilla/Firefox)",popup_resizable:"Muuda akna suurus muudetavaks",popup_location:"N\u00e4ita asukohariba",popup_menubar:"N\u00e4ita men\u00fc\u00fcriba",popup_toolbar:"N\u00e4ita seadistusriba",popup_statusbar:"N\u00e4ita staatuse riba",popup_scrollbars:"N\u00e4ita kerimisribasid",popup_return:"Sisesta \'tagasiminek eba\u00f5nnestus\'",popup_name:"Akna nimi",popup_url:"Pop-up\u2019i URL",popup:"Javascript\u2019i pop-up",target_blank:"Ava uues aknas",target_top:"Ava k\u00f5rgeimas raamis (asenda k\u00f5ik raamid)",target_parent:"Ava pea-aknas/raamis",target_same:"Ava selles aknas/raamis",anchor_names:"Ankrud",popup_opts:"Valikud",advanced_props:"\u00dcldised seadistused",event_props:"S\u00fcndmused",popup_props:"Pop-up\u2019i seadistus",general_props:"\u00dcldised seadistused",advanced_tab:"P\u00f5hjalikum",events_tab:"S\u00fcndmused",popup_tab:"Pop-up",general_tab:"\u00dcldine",list:"Linkide nimekiri",is_external:"URL, mille sisestasid, tundub olevat v\u00e4line link, kas soovid sellele lisada http://?",is_email:" URL, mille sisestasid, tundub olevat e-posti aadress, kas soovid sellele lisada mailto: funktsiooni?",titlefield:"Pealkiri",target:"Sihtm\u00e4rk",url:" URL\u2019i link",title:"Sisesta muuda linki",link_list:"Linkide list",rtl:"Paremalt vasakule",ltr:"Vasakult paremale",accesskey:"Ligip\u00e4\u00e4suklahv",tabindex:"Sisujuht",rev:"Seo sihtm\u00e4rk lehega",rel:"Seo leht sihtm\u00e4rgiga",mime:"M\u00e4rgista MIME t\u00fc\u00fcp",encoding:"Sihtm\u00e4rgi kodeering",langcode:"Keele kood",target_langcode:"Sihtm\u00e4rgi keel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/eu_dlg.js b/js/tiny_mce/plugins/advlink/langs/eu_dlg.js new file mode 100755 index 000000000..430a5dd54 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.advlink_dlg',{target_name:"Helburuaren izena",classes:"Klaseak",style:"Estiloa",id:"Id",popup_position:"Kokapena (X/Y)",langdir:"Hizkuntzaren norabidea",popup_size:"Tamaina",popup_dependent:"Menpekoa (Mozilla/Firefoxen bakarrik)",popup_resizable:"Leihoaren tamaina aldatzea aktibatu",popup_location:"Helbide-barra erakutsi",popup_menubar:"Menu-barra erakutsi",popup_toolbar:"Tresna-barrak erakutsi",popup_statusbar:"Egoera-barra erakutsi",popup_scrollbars:"Gora-behera barra erakutsi",popup_return:"\'return false\' txertatu",popup_name:"Leihoaren izena",popup_url:"Popuparen URL helbidea",popup:"Javascript popupa",target_blank:"Leiho berrian ireki",target_top:"Gorengo markoan ireki (marko guztiak ordezkatzen ditu)",target_parent:"Leiho/marko gurasoan ireki",target_same:"Leiho/marko honetan ireki",anchor_names:"Aingurak",popup_opts:"Aukerak",advanced_props:"Aukera aurreratuak",event_props:"Ebentuak",popup_props:"Popuparen aukerak",general_props:"Aukera orokorrak",advanced_tab:"Gehigarriak",events_tab:"Ebentuak",popup_tab:"Popupa",general_tab:"Orokorra",list:"Lotura-zerrenda",is_external:"Sartutako helbideak kanpoko webgune batena dirudi, aurretik http:// gehitzea nahi duzu?",is_email:"Sartutako helbideak e-posta bat dirudi, aurretik mailto: gehitzea nahi duzu?",titlefield:"Izenburua",target:"Helburua",url:"Loturaren URL helbidea",title:"Lotura txertatu/editatu",link_list:"Lotura-zerrenda",rtl:"Eskuinetik ezkerrera",ltr:"Ezkerretik eskuinera",accesskey:"Laster-tekla",tabindex:"Tabulazio ordena",rev:"Helburuaren eta orrialdearen arteko erlazioa",rel:"Orrialdearen eta helburuaren arteko erlazioa",mime:"Helburuaren MIME mota",encoding:"Helburuaren karaktere-kodeketa",langcode:"Hizkuntza-kodea",target_langcode:"Helburu-hizkuntza"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/fa_dlg.js b/js/tiny_mce/plugins/advlink/langs/fa_dlg.js new file mode 100755 index 000000000..fc5872261 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.advlink_dlg',{target_name:"\u0646\u0627\u0645 \u0645\u0642\u0635\u062f (Target)",classes:"\u06a9\u0644\u0627\u0633 \u0647\u0627",style:"\u0627\u0633\u062a\u06cc\u0644",id:"\u0634\u0646\u0627\u0633\u0647",popup_position:"\u0645\u0648\u0642\u0639\u06cc\u062a (X/Y)",langdir:"\u062c\u0647\u062a \u0632\u0628\u0627\u0646",popup_size:"\u0627\u0646\u062f\u0627\u0632\u0647",popup_dependent:"\u0648\u0627\u0628\u0633\u062a\u0647 (\u0641\u0642\u0637 Mozilla/Firefox)",popup_resizable:"\u0627\u06cc\u062c\u0627\u062f \u067e\u0646\u062c\u0631\u0647 \u0642\u0627\u0628\u0644 \u0627\u0646\u062f\u0627\u0632\u0647 \u0628\u0646\u062f\u06cc \u0645\u062c\u062f\u062f",popup_location:"\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u0627\u0631 \u0645\u06a9\u0627\u0646",popup_menubar:"\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u0627\u0631 \u0645\u0646\u0648",popup_toolbar:"\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u0627\u0631 \u0627\u0628\u0632\u0627\u0631",popup_statusbar:"\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u0627\u0631 \u0648\u0636\u0639\u06cc\u062a",popup_scrollbars:"\u0646\u0645\u0627\u06cc\u0634 \u0646\u0648\u0627\u0631 \u067e\u06cc\u0645\u0627\u06cc\u0634 \u0647\u0627",popup_return:"\u062f\u0631\u062c \'return false\'",popup_name:"\u0646\u0627\u0645 \u067e\u0646\u062c\u0631\u0647",popup_url:"URL \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 (Popup)",popup:"\u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648\u06cc Javascript",target_blank:"\u0628\u0627\u0632\u0634\u062f\u0646 \u062f\u0631 \u067e\u0646\u062c\u0631\u0647 \u062c\u062f\u06cc\u062f",target_top:"\u0628\u0627\u0632\u0634\u062f\u0646 \u062f\u0631 \u0642\u0627\u0628 \u0628\u0627\u0644\u0627 (Top Frame) (\u062a\u0645\u0627\u0645\u06cc \u0642\u0627\u0628 \u0647\u0627 \u0631\u0627 \u062a\u0639\u0648\u06cc\u0636 \u0645\u06cc \u06a9\u0646\u062f)",target_parent:"\u0628\u0627\u0632\u0634\u062f\u0646 \u062f\u0631 \u067e\u0646\u062c\u0631\u0647 / \u0642\u0627\u0628 \u0648\u0627\u0644\u062f (Parent Frame)",target_same:"\u0628\u0627\u0632\u0634\u062f\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0646\u062c\u0631\u0647 / \u0642\u0627\u0628 (Frame)",anchor_names:"\u0644\u0646\u06af\u0631\u0647\u0627 (Anchor)",popup_opts:"\u06af\u0632\u06cc\u0646\u0647 \u0647\u0627",advanced_props:"\u0645\u0634\u062e\u0635\u0627\u062a \u067e\u06cc\u0634\u0631\u0641\u062a\u0647",event_props:"\u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627",popup_props:"\u0645\u0634\u062e\u0635\u0627\u062a \u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 (Popup)",general_props:"\u0645\u0634\u062e\u0635\u0627\u062a \u0639\u0645\u0648\u0645\u06cc",advanced_tab:"\u067e\u06cc\u0634\u0631\u0641\u062a\u0647",events_tab:"\u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627",popup_tab:"\u067e\u0646\u062c\u0631\u0647 \u0628\u0627\u0632\u0634\u0648 (Popup)",general_tab:"\u0639\u0645\u0648\u0645\u06cc",list:"\u0644\u06cc\u0633\u062a \u0644\u06cc\u0646\u06a9",is_external:"URL \u06cc \u06a9\u0647 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0622\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u0644\u06cc\u0646\u06a9 \u062e\u0627\u0631\u062c\u06cc \u0645\u06cc \u0628\u0627\u0634\u062f \u060c \u0622\u06cc\u0627 \u0645\u0627\u06cc\u0644\u06cc\u062f \u062a\u0627 \u067e\u06cc\u0634\u0648\u0646\u062f \u0644\u0627\u0632\u0645\u0647 //:http \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0646\u0645\u0627\u0626\u06cc\u062f\u061f",is_email:"URL \u06cc \u06a9\u0647 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0622\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u0622\u062f\u0631\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u0645\u06cc \u0628\u0627\u0634\u062f \u060c \u0622\u06cc\u0627 \u0645\u0627\u06cc\u0644\u06cc\u062f \u062a\u0627 \u067e\u06cc\u0634\u0648\u0646\u062f \u0644\u0627\u0632\u0645\u0647 :mailto \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0646\u0645\u0627\u0626\u06cc\u062f\u061f",titlefield:"\u0639\u0646\u0648\u0627\u0646",target:"\u0645\u0642\u0635\u062f (Target)",url:"URL \u0644\u06cc\u0646\u06a9",title:"\u062f\u0631\u062c/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0644\u06cc\u0646\u06a9",link_list:"\u0644\u06cc\u0633\u062a \u0644\u06cc\u0646\u06a9",rtl:"\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e",ltr:"\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a",accesskey:"Accesskey",tabindex:"Tabindex",rev:"\u0631\u0627\u0628\u0637\u0647 \u0645\u0642\u0635\u062f (Target) \u0628\u0627 \u0635\u0641\u062d\u0647",rel:"\u0631\u0627\u0628\u0637\u0647 \u0635\u0641\u062d\u0647 \u0628\u0627 \u0645\u0642\u0635\u062f (Target)",mime:"\u0646\u0648\u0639 MIME \u0645\u0642\u0635\u062f (Target)",encoding:"\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0645\u0642\u0635\u062f (Target)",langcode:"\u06a9\u062f \u0632\u0628\u0627\u0646",target_langcode:"\u0632\u0628\u0627\u0646 \u0645\u0642\u0635\u062f (Target)"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/fi_dlg.js b/js/tiny_mce/plugins/advlink/langs/fi_dlg.js new file mode 100755 index 000000000..0b3b568f7 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.advlink_dlg',{target_name:"Kohteen nimi",classes:"Luokat",style:"Tyyli",id:"Id",popup_position:"Sijainti (X/Y)",langdir:"Kielen suunta",popup_size:"Koko",popup_dependent:"Riippuvainen (vain Mozilla/Firefox)",popup_resizable:"Tee ikkunan koko muokattavaksi",popup_location:"N\u00e4yt\u00e4 sijaintipalkki",popup_menubar:"N\u00e4yt\u00e4 valikkopalkki",popup_toolbar:"N\u00e4yt\u00e4 ty\u00f6kalut",popup_statusbar:"N\u00e4yt\u00e4 tilapalkki",popup_scrollbars:"N\u00e4yt\u00e4 vierityspalkit",popup_return:"Lis\u00e4\u00e4 \'return false\'",popup_name:"Ikkunan nimi",popup_url:"Ponnahdusikkunan URL",popup:"JavaScript-ponnahdusikkuna",target_blank:"Avaa uudessa ikkunassa",target_top:"Avaa ylimm\u00e4ss\u00e4 ruudussa (korvaa kaikki ruudut)",target_parent:"Avaa ylemm\u00e4ss\u00e4 ikkunassa",target_same:"Avaa t\u00e4ss\u00e4 ikkunassa",anchor_names:"Ankkurit",popup_opts:"Valinta",advanced_props:"Edistyneet asetukset",event_props:"Tapahtumat (events)",popup_props:"Ponnahdusikkunan asetukset",general_props:"Yleiset asetukset",advanced_tab:"Edistynyt",events_tab:"Tapahtumat",popup_tab:"Ponnahdusikkuna",general_tab:"Yleiset",list:"Linkkilista",is_external:"Sy\u00f6tt\u00e4m\u00e4si URL n\u00e4ytt\u00e4\u00e4 olevan sivuston ulkoinen osoite, haluatko lis\u00e4t\u00e4 http://-etuliitteen?",is_email:"Sy\u00f6tt\u00e4m\u00e4si URL n\u00e4ytt\u00e4\u00e4 olevan s\u00e4hk\u00f6postiosoite, haluatko lis\u00e4t\u00e4 mailto:-etuliitteen?",titlefield:"Otsikko",target:"Kohde (target)",url:"Linkin URL",title:"Lis\u00e4\u00e4/muokkaa linkki\u00e4",link_list:"Linkkilista",rtl:"Oikealta vasemmalle",ltr:"Vasemmalta oikealle",accesskey:"Pikan\u00e4pp\u00e4in",tabindex:"Tabulaattori-indeksi",rev:"Kohteen suhde sivuun",rel:"Sivun suhde kohteeseen",mime:"Kohteen MIME-tyyppi",encoding:"Kohteen merkist\u00f6koodaus",langcode:"Kielen koodi",target_langcode:"Kohteen kieli"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/fr_dlg.js b/js/tiny_mce/plugins/advlink/langs/fr_dlg.js new file mode 100755 index 000000000..2213e0de6 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.advlink_dlg',{target_name:"Nom de la cible",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Sens de lecture",popup_size:"Taille",popup_dependent:"D\u00e9pendante (seulement sous Mozilla/Firefox)",popup_resizable:"Autoriser le redimensionnement de la fen\u00eatre",popup_location:"Afficher la barre d\'adresse",popup_menubar:"Afficher la barre de menu",popup_toolbar:"Afficher la barre d\'outils",popup_statusbar:"Afficher la barre d\'\u00e9tat",popup_scrollbars:"Afficher les ascenseurs",popup_return:"Ins\u00e9rer \'return false\'",popup_name:"Nom de la fen\u00eatre",popup_url:"URL de la popup",popup:"Popup Javascript",target_blank:"Ouvrir dans une nouvelle fen\u00eatre",target_top:"Ouvrir dans le cadre principal (remplace tous les cadres)",target_parent:"Ouvrir dans la fen\u00eatre / le cadre parent",target_same:"Ouvrir dans cette fen\u00eatre / dans ce cadre",anchor_names:"Ancres",popup_opts:"Options",advanced_props:"Propri\u00e9t\u00e9s avanc\u00e9es",event_props:"\u00c9v\u00e8nements",popup_props:"Propri\u00e9t\u00e9s de la popup",general_props:"Propri\u00e9t\u00e9s g\u00e9n\u00e9rales",advanced_tab:"Avanc\u00e9",events_tab:"\u00c9v\u00e8nements",popup_tab:"Popup",general_tab:"G\u00e9n\u00e9ral",list:"Liste de liens",is_external:"L\'URL que vous avez saisie semble \u00eatre une adresse web externe. Souhaitez-vous ajouter le pr\u00e9fixe \u00ab http:// \u00bb ?",is_email:"L\'URL que vous avez saisie semble \u00eatre une adresse e-mail, souhaitez-vous ajouter le pr\u00e9fixe \u00ab mailto: \u00bb ?",titlefield:"Titre",target:"Cible",url:"URL du lien",title:"Ins\u00e9rer / \u00e9diter un lien",link_list:"Liste des liens",rtl:"Droite \u00e0 gauche",ltr:"Gauche \u00e0 droite",accesskey:"Touche d\'acc\u00e8s rapide",tabindex:"Tabindex",rev:"Relation de la cible \u00e0 la page",rel:"Relation de la page \u00e0 la cible",mime:"Type MIME de la cible",encoding:"Encodage de la cible",langcode:"Code de la langue",target_langcode:"Langue de la cible"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/gl_dlg.js b/js/tiny_mce/plugins/advlink/langs/gl_dlg.js new file mode 100755 index 000000000..382156bc5 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.advlink_dlg',{target_name:"Nome do obxetivo",classes:"Clases",style:"Estilo",id:"Id",popup_position:"Posici\u00f3n (X/Y)",langdir:"Direcci\u00f3n da lenguaxe",popup_size:"Tama\u00f1o",popup_dependent:"Dependentes (s\u00f3lo Mozilla/Firefox)",popup_resizable:"Permitir cambia-lo tama\u00f1o da vent\u00e1",popup_location:"Barra de localizaci\u00f3n",popup_menubar:"Barra de men\u00fa",popup_toolbar:"Barra de ferramentas",popup_statusbar:"Barra de estado",popup_scrollbars:"Barras de desprazamento",popup_return:"Insertar \'return false\'",popup_name:"Nome da vent\u00e1",popup_url:"URL da vent\u00e1 emerxente",popup:"Javascript popup",target_blank:"Abrir en vent\u00e1 nova",target_top:"Abrir no marco superior (reemplaza todo-los marcos)",target_parent:"Abrir na vent\u00e1 / marco padre",target_same:"Abrir nesta vent\u00e1 / marco",anchor_names:"\u00c1ncoras",popup_opts:"Opci\u00f3ns",advanced_props:"Propiedades avanzadas",event_props:"Eventos",popup_props:"Propiedades de vent\u00e1s emerxentes",general_props:"Propiedades xerales",advanced_tab:"Avanzado",events_tab:"Eventos",popup_tab:"Ventana emerxente",general_tab:"Xeral",list:"Lista de v\u00ednculos",is_external:"A URL introducida semella ser un v\u00ednculo externo, \u00bfDesexa engadi-lo prefixo necesario http://?",is_email:"A URL introducida semella ser un enderezo de e-mail, \u00bfDesexa engadi-lo prefixo necesario mailto:?",titlefield:"T\u00edtulo",target:"Destino",url:"URL do hiperv\u00ednculo",title:"Insertar/editar hiperv\u00ednculo",link_list:"Lista de v\u00ednculo",rtl:"Dereita a esquerda",ltr:"Esquerda a dereita",accesskey:"Tecla de acceso",tabindex:"\u00cdndice de tabulaci\u00f3n",rev:"Relaci\u00f3n obxetivo a p\u00e1xina",rel:"Relaci\u00f3n p\u00e1xina a obxetivo",mime:"Tipo MIME do obxetivo",encoding:"Codificaci\u00f3n de caracteres do obxetivo",langcode:"C\u00f3digo da lenguaxe",target_langcode:"Lenguaxe do obxetivo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/gu_dlg.js b/js/tiny_mce/plugins/advlink/langs/gu_dlg.js new file mode 100755 index 000000000..89f92a18f --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/he_dlg.js b/js/tiny_mce/plugins/advlink/langs/he_dlg.js new file mode 100755 index 000000000..4981261bc --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"\u05e1\u05d2\u05e0\u05d5\u05df",id:"\u05de\u05e1\u05e4\u05e8 \u05e1\u05d9\u05d3\u05d5\u05e8\u05d9",popup_position:"\u05de\u05d9\u05e7\u05d5\u05dd (X/Y)",langdir:"\u05db\u05d9\u05d5\u05d5\u05df \u05d4\u05e9\u05e4\u05d4",popup_size:"\u05d2\u05d5\u05d3\u05dc",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"\u05d7\u05dc\u05d5\u05df \u05d3\u05d9\u05e0\u05d0\u05de\u05d9(resizable)",popup_location:"\u05d4\u05e6\u05d2\u05ea location bar ",popup_menubar:"\u05d4\u05e6\u05d2\u05ea \u05ea\u05e4\u05e8\u05d9\u05d8",popup_toolbar:"\u05d4\u05e6\u05d2\u05ea \u05e1\u05e8\u05d2\u05dc\u05d9 \u05db\u05dc\u05d9\u05dd",popup_statusbar:"\u05d4\u05e6\u05d2\u05ea \u05e9\u05d5\u05e8\u05ea \u05e1\u05d8\u05d0\u05d8\u05d5\u05e1",popup_scrollbars:"\u05d4\u05e6\u05d2\u05ea \u05e4\u05e1 \u05d2\u05dc\u05d9\u05dc\u05d4",popup_return:"\u05d9\u05e9 \u05dc\u05d4\u05db\u05e0\u05d9\u05e1 \'return false\'",popup_name:"\u05e9\u05dd \u05d4\u05d7\u05dc\u05d5\u05df",popup_url:"\u05d7\u05dc\u05d5\u05df \u05de\u05d5\u05e7\u05e4\u05e5 URL",popup:"\u05d7\u05dc\u05d5\u05df \u05de\u05d5\u05e7\u05e4\u05e5 javascript",target_blank:"\u05e4\u05ea\u05d9\u05d7\u05d4 \u05d1\u05d7\u05dc\u05d5\u05df \u05d7\u05d3\u05e9",target_top:"\u05e4\u05ea\u05d9\u05d7\u05d4 \u05d1\u05d7\u05dc\u05d5\u05df \u05d4\u05d1\u05df \u05d4\u05e8\u05d0\u05e9\u05d9(\u05de\u05d7\u05dc\u05d9\u05e3 \u05d0\u05ea \u05db\u05dc \u05d7\u05dc\u05d5\u05e0\u05d5\u05ea \u05d4\u05d1\u05e0\u05d9\u05dd)",target_parent:"\u05e4\u05ea\u05d9\u05d7\u05d4 \u05d1\u05dc\u05d5\u05df \u05d4\u05d0\u05d1\u05d0/\u05d7\u05dc\u05d5\u05df \u05d1\u05df",target_same:"\u05e4\u05ea\u05d9\u05d7\u05d4 \u05d1\u05d7\u05dc\u05d5\u05df \u05d7\u05d3\u05e9/\u05d7\u05dc\u05d5\u05df \u05d1\u05df",anchor_names:"\u05e7\u05d9\u05e9\u05d5\u05e8 \u05dc\u05e1\u05d9\u05de\u05e0\u05d9\u05d4",popup_opts:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea",advanced_props:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05de\u05ea\u05e7\u05d3\u05de\u05d5\u05ea",event_props:"\u05de\u05d0\u05d5\u05e8\u05e2\u05d5\u05ea",popup_props:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05d7\u05dc\u05d5\u05df \u05de\u05d5\u05e7\u05e4\u05e5",general_props:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05db\u05dc\u05dc\u05d9\u05d5\u05ea",advanced_tab:"\u05de\u05ea\u05e7\u05d3\u05dd",events_tab:"\u05d0\u05e8\u05d5\u05e2\u05d9\u05dd",popup_tab:"\u05d7\u05dc\u05d5\u05df \u05de\u05d5\u05e7\u05e4\u05e5",general_tab:"\u05db\u05dc\u05dc\u05d9",list:"\u05e8\u05e9\u05d9\u05de\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd",is_external:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4-URL \u05e9\u05d4\u05d5\u05db\u05e0\u05e1\u05d4 \u05d4\u05d9\u05d0 \u05db\u05db\u05dc \u05d4\u05e0\u05e8\u05d0\u05d4 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05d0\u05ea \u05d4\u05e7\u05d9\u05d3\u05d5\u05de\u05ea http:// \u05d4\u05e0\u05d3\u05e8\u05e9\u05ea?",is_email:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4-URL \u05e9\u05d4\u05d5\u05db\u05e0\u05e1\u05d4 \u05d4\u05d9\u05d0 \u05db\u05db\u05dc \u05d4\u05e0\u05e8\u05d0\u05d4 \u05db\u05ea\u05d5\u05d1\u05ea \u05de\u05d9\u05d9\u05dc \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05d0\u05ea \u05d4\u05e7\u05d9\u05d3\u05d5\u05de\u05ea MAILTO \u05d4\u05e0\u05d3\u05e8\u05e9\u05ea?",titlefield:"\u05db\u05d5\u05ea\u05e8\u05ea \u05d4\u05e7\u05d9\u05e9\u05d5\u05e8",target:"\u05d9\u05e2\u05d3",url:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05e7\u05d9\u05e9\u05d5\u05e8",title:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8",link_list:"\u05e8\u05e9\u05d9\u05de\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd",rtl:"\u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc",ltr:"\u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"\u05e7\u05d5\u05d3 \u05d4\u05e9\u05e4\u05d4",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/hi_dlg.js b/js/tiny_mce/plugins/advlink/langs/hi_dlg.js new file mode 100755 index 000000000..095fc8940 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/hr_dlg.js b/js/tiny_mce/plugins/advlink/langs/hr_dlg.js new file mode 100755 index 000000000..55c2999d0 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.advlink_dlg',{target_name:"Ime mete",classes:"Klasa",style:"Stil",id:"Id",popup_position:"Pozicija (X/Y)",langdir:"Smjer jezika",popup_size:"Veli\u010dina",popup_dependent:"Ovisan (samo za Mozilla/Firefox)",popup_resizable:"Prozor promjenjive veli\u010dine",popup_location:"Poka\u017ei traku lokacije",popup_menubar:"Poka\u017ei izbornik",popup_toolbar:"Poka\u017ei alatne trake",popup_statusbar:"Poka\u017ei statusnu traku",popup_scrollbars:"Poka\u017ei kliza\u010de",popup_return:"Umetni \'return false\'",popup_name:"Ime prozora",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Otvori u novom prozoru",target_top:"Otvori u gornjem okviru (zamjenjuje sve okvire)",target_parent:"Otvori u izvornom prozoru / okvir",target_same:"Otovori u novom prozoru / okviru",anchor_names:"Sidra",popup_opts:"Opcije",advanced_props:"Napredna svojstva",event_props:"Doga\u0111aji",popup_props:"Svojstva popup prozora",general_props:"Osnovna svojstva",advanced_tab:"Napredno",events_tab:"Doga\u0111aj",popup_tab:"Popup",general_tab:"Osnovno",list:"Lista poveznica",is_external:"URL koji ste unijeli izgleda kao vanjska poveznica, \u017eelite li dodati potrebni http:// prefiks?",is_email:"URL koji ste unijeli izgleda kao e-mail adresa, \u017eelite li dodati potrebni mailto: prefiks?",titlefield:"Naslov",target:"Meta",url:"URL poveznice",title:"Umetni/uredi poveznicu",link_list:"Lista poveznica",rtl:"S desna na lijevo",ltr:"S lijeva na desno",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Odnos mete prema stranici",rel:"Odnos stranice prema meti",mime:"MIME tip",encoding:"Kodiranje znakova",langcode:"Kod jezika",target_langcode:"Jezik"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/hu_dlg.js b/js/tiny_mce/plugins/advlink/langs/hu_dlg.js new file mode 100755 index 000000000..36fa87497 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.advlink_dlg',{"target_name":"C\u00e9l neve",classes:"Class-ok",style:"Style",id:"Id","popup_position":"Poz\u00edci\u00f3 (X/Y)",langdir:"Nyelv \u00edr\u00e1s ir\u00e1ny","popup_size":"M\u00e9ret","popup_dependent":"F\u00fcgg\u0151 (csak Mozilla/Firefox)","popup_resizable":"\u00c1tm\u00e9retezhet\u0151 ablak","popup_location":"C\u00edm mez\u0151 mutat\u00e1sa","popup_menubar":"Men\u00fcsor mutat\u00e1sa","popup_toolbar":"Eszk\u00f6zsor mutat\u00e1sa","popup_statusbar":"St\u00e1tuszsor mutat\u00e1sa","popup_scrollbars":"G\u00f6rget\u0151s\u00e1vok mutat\u00e1sa","popup_return":"\'return false\' besz\u00far\u00e1sa","popup_name":"Ablakn\u00e9v","popup_url":"Felugr\u00f3 ablak URL",popup:"JavaScript felugr\u00f3 ablak","target_blank":"\u00daj ablakban megnyit\u00e1s","target_top":"Azonos ablakban/keretben megnyit\u00e1s legfel\u00fcl","target_parent":"Sz\u00fcl\u0151 ablakban/keretben megnyit\u00e1s","target_same":"Azonos ablakban/keretben megnyit\u00e1s","anchor_names":"Horgonyok","popup_opts":"Be\u00e1ll\u00edt\u00e1sok","advanced_props":"Halad\u00f3 tulajdons\u00e1gok","event_props":"Esem\u00e9nyek","popup_props":"Felugr\u00f3 ablak tulajdons\u00e1gai","general_props":"\u00c1ltal\u00e1nos tulajdons\u00e1gok","advanced_tab":"Halad\u00f3","events_tab":"Esem\u00e9nyek","popup_tab":"Felugr\u00f3 ablak","general_tab":"\u00c1ltal\u00e1nos",list:"Link lista","is_external":"A be\u00edrt URL k\u00fcls\u0151 hivatkoz\u00e1snak t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges http://-t el\u00e9 tenni?","is_email":"A be\u00edrt URL e-mail c\u00edmnek t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges mailto:-t el\u00e9 tenni?",titlefield:"C\u00edm",target:"Target",url:"Link URL",title:"Link besz\u00far\u00e1s/szerkeszt\u00e9s","link_list":"Link lista",rtl:"Jobbr\u00f3l balra",ltr:"Balr\u00f3l jobbra",accesskey:"Gyorsgomb",tabindex:"Tabindex",rev:"C\u00e9l kapcsolata az oldallal",rel:"Oldal kapcsolata a c\u00e9llal",mime:"C\u00e9l MIME t\u00edpus",encoding:"C\u00e9l karakterk\u00f3dol\u00e1s",langcode:"Nyelv k\u00f3d","target_langcode":"C\u00e9l nyelv"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/hy_dlg.js b/js/tiny_mce/plugins/advlink/langs/hy_dlg.js new file mode 100755 index 000000000..9bee85bff --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.advlink_dlg',{target_name:"Target name",classes:"\u0534\u0561\u057d\u0565\u0580",style:"\u0548\u0573",id:"Id",popup_position:"\u054f\u0565\u0572\u0561\u056f\u0561\u0575\u0578\u0582\u0574 (X / Y)",langdir:"\u0548\u0582\u0572\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576",popup_size:"\u0549\u0561\u0583\u057d",popup_dependent:"Dependent (\u0574\u056b\u0561\u0575\u0576 Mozilla / Firefox)",popup_resizable:"\u0539\u0578\u0582\u0575\u056c\u0561\u057f\u0580\u0565\u056c \u0579\u0561\u0583\u0565\u0580\u056b \u0583\u0578\u0583\u0578\u056d\u0578\u0582\u0574",popup_location:"\u0551\u0578\u0582\u0581\u0561\u0564\u0580\u0565\u056c location \u057e\u0561\u0570\u0561\u0576\u0561\u056f\u0568",popup_menubar:"\u0551\u0578\u0582\u0581\u0561\u0564\u0580\u0565\u056c \u0574\u0565\u0576\u0575\u0578\u0582\u0576",popup_toolbar:"\u0551\u0578\u0582\u0581\u0561\u0564\u0580\u0565\u056c \u0563\u0578\u0580\u056e\u056b\u0584\u0561\u0575\u056b\u0576 \u057e\u0561\u0570\u0561\u0576\u0561\u056f\u0576\u0565\u0580\u0568",popup_statusbar:"\u0551\u0578\u0582\u0581\u0561\u0564\u0580\u0565\u056c \u057d\u057f\u0561\u057f\u0578\u0582\u057d\u0568",popup_scrollbars:"\u0551\u0578\u0582\u0581\u0561\u0564\u0580\u0565\u056c \u057d\u0584\u0580\u0578\u056c\u056c\u0576\u0565\u0580\u0568",popup_return:"\u054f\u0565\u0572\u0561\u0564\u0580\u0565\u056c \'return false\'",popup_name:"\u054a\u0561\u057f\u0578\u0582\u0570\u0561\u0576\u056b \u0561\u0576\u057e\u0561\u0576\u0578\u0582\u0574",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"\u0532\u0561\u0581\u0565\u056c \u0576\u0578\u0580 \u057a\u0561\u057f\u0578\u0582\u0570\u0561\u0576\u0578\u0582\u0574",target_top:"\u0532\u0561\u0581\u0565\u056c \u057e\u0565\u0580\u056b\u0576 \u0586\u0580\u0565\u0575\u0574\u0578\u0582\u0574 (\u0583\u0578\u0583\u0578\u056d\u0565\u056c \u0562\u0578\u056c\u0578\u0580 \u0586\u0580\u0565\u0575\u0574\u0565\u0580\u0568)",target_parent:"\u0532\u0561\u0581\u0565\u056c \u0570\u056b\u0574\u0576\u0561\u056f\u0561\u0576 \u057a\u0561\u057f\u0578\u0582\u0570\u0561\u0576\u0578\u0582\u0574 / \u0586\u0580\u0565\u0575\u0574\u0578\u0582\u0574",target_same:"\u0532\u0561\u0581\u0565\u056c \u0561\u0575\u057d \u057a\u0561\u057f\u0578\u0582\u0570\u0561\u0576\u0578\u0582\u0574 / \u0586\u0580\u0565\u0575\u0574\u0578\u0582\u0574",anchor_names:"\u053d\u0561\u0580\u056b\u057d\u056d",popup_opts:"\u054a\u0561\u0580\u0561\u0574\u0565\u057f\u0580\u0565\u0580",advanced_props:"\u053c\u0580\u0561\u0581\u0578\u0582\u0581\u056b\u0579 \u0564\u0565\u057a\u0584\u0565\u0580",event_props:"\u0534\u0565\u057a\u0584\u0565\u0580",popup_props:"Popup \u057a\u0561\u0580\u0561\u0574\u0565\u057f\u0580\u0565\u0580",general_props:"\u0538\u0576\u0564\u0570\u0561\u0576\u0578\u0582\u0580 \u057a\u0561\u0580\u0561\u0574\u0565\u057f\u0580\u0565\u0580",advanced_tab:"\u053c\u0580\u0561\u0581\u0578\u0582\u0581\u056b\u0579",events_tab:"\u0534\u0565\u057a\u0584\u0565\u0580",popup_tab:"Popup",general_tab:"\u0540\u056b\u0574\u0576\u0561\u056f\u0561\u0576",list:"\u0540\u0572\u0578\u0582\u0574\u0576\u0565\u0580\u056b \u0581\u0561\u0576\u056f",is_external:"\u0546\u0565\u0580\u0561\u056e\u057e\u0561\u056e URL \u0570\u0561\u057d\u0581\u0565\u0576 \u0576\u0574\u0561\u0576 \u0567 \u0561\u0580\u057f\u0561\u0584\u056b\u0576 \u0570\u0572\u0574\u0561\u0576, \u0534\u0578\u0582\u0584 \u0581\u0561\u0576\u056f\u0561\u0576\u0578\u0582\u055e\u0574 \u0565\u0584 \u0561\u057e\u0565\u056c\u0561\u0581\u0576\u0565\u056c http://",is_email:"\u0546\u0565\u0580\u0561\u056e\u057e\u0561\u056e URL \u0570\u0561\u057d\u0581\u0565\u0576 \u0576\u0574\u0561\u0576 \u0567 email \u0570\u0561\u057d\u0581\u0565\u056b, \u0534\u0578\u0582\u0584 \u0581\u0561\u0576\u056f\u0561\u0576\u0578\u0582\u055e\u0574 \u0565\u0584 \u0561\u057e\u0565\u056c\u0561\u0581\u0576\u0565\u056c mailto:",titlefield:"\u054e\u0565\u0580\u0576\u0561\u0563\u056b\u0580",target:"\u0532\u0561\u0581\u0565\u056c ...",url:"\u0540\u0561\u057d\u0581\u0565",title:"\u054f\u0565\u0572\u0561\u0564\u0580\u0565\u056c / \u0583\u0578\u0583\u0578\u056d\u0565\u056c \u0570\u0572\u0578\u0582\u0574",link_list:"\u0540\u0572\u0578\u0582\u0574\u0576\u0565\u0580\u056b \u0581\u0561\u0576\u056f",rtl:"\u0531\u057b\u056b\u0581 \u0571\u0561\u056d",ltr:"\u0541\u0561\u056d\u056b\u0581 \u0561\u057b",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"\u053c\u0565\u0566\u057e\u056b \u056f\u0578\u0564",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ia_dlg.js b/js/tiny_mce/plugins/advlink/langs/ia_dlg.js new file mode 100755 index 000000000..9759b649f --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.advlink_dlg',{target_name:"\u76ee\u6807\u540d\u79f0",classes:"\u6837\u5f0f\u7c7b",style:"\u6837\u5f0f",id:"Id",popup_position:"\u5750\u6807 (X/Y)",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",popup_size:"\u5927\u5c0f",popup_dependent:"\u4ece\u5c5e\u4e8e ( \u4ec5 Mozilla/Firefox \u6709\u6548 )",popup_resizable:"\u53ef\u8c03\u6574\u7a97\u53e3\u5927\u5c0f",popup_location:"\u663e\u793a\u5730\u5740\u680f",popup_menubar:"\u663e\u793a\u83dc\u5355\u5217",popup_toolbar:"\u663e\u793a\u5de5\u5177\u5217",popup_statusbar:"\u663e\u793a\u72b6\u6001\u5217",popup_scrollbars:"\u663e\u793a\u6eda\u52a8\u6761",popup_return:"\u63d2\u5165 \'return false\'",popup_name:"\u7a97\u53e3\u540d\u79f0",popup_url:"\u5f39\u51fa\u7a97\u53e3\u5730\u5740",popup:"Javascript \u5feb\u663e\u7a97\u53e3",target_blank:"\u5728\u65b0\u7a97\u53e3\u6253\u5f00",target_top:"\u5728\u9876\u5c42\u7a97\u53e3\u6253\u5f00",target_parent:"\u5728\u7236\u7a97\u53e3\u6253\u5f00",target_same:"\u5728\u5f53\u524d\u7a97\u53e3\u6253\u5f00",anchor_names:"\u951a\u70b9",popup_opts:"\u9009\u9879",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5feb\u663e\u7a97\u53e3\u5c5e\u6027",general_props:"\u57fa\u672c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5feb\u663e\u7a97\u53e3",general_tab:"\u57fa\u672c",list:"\u8fde\u7ed3\u6e05\u5355",is_external:"\u60a8\u8f93\u5165\u7684\u7f51\u5740\u5e94\u8be5\u662f\u4e00\u4e2a\u5916\u90e8\u8fde\u7ed3\uff0c\u662f\u5426\u9700\u8981\u5728\u7f51\u5740\u524d\u52a0\u4e0a http:// ?",is_email:"\u60a8\u8f93\u5165\u7684\u5e94\u8be5\u662f\u4e00\u4e2a\u7535\u5b50\u90ae\u5bc4\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u5728\u7f51\u5740\u524d\u52a0\u4e0a mailto: ? ",titlefield:"\u67e5\u627e",target:"\u76ee\u6807",url:"\u8fde\u7ed3\u5730\u5740",title:"\u63d2\u5165/\u7f16\u8f91 \u8fde\u7ed3",link_list:"\u8fde\u7ed3\u6e05\u5355",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",accesskey:"\u5feb\u901f\u952e",tabindex:"Tab\u7d22\u5f15",rev:"rev",rel:"rel",mime:"\u76ee\u6807 MIME \u7c7b\u578b",encoding:"\u76ee\u6807\u8bed\u8a00\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801",target_langcode:"\u76ee\u6807\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/id_dlg.js b/js/tiny_mce/plugins/advlink/langs/id_dlg.js new file mode 100755 index 000000000..cefdb1b56 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.advlink_dlg',{target_name:"Nama Target",classes:"Classes",style:"Style",id:"Id",popup_position:"Posisi (X/Y)",langdir:"Bahasa",popup_size:"Ukuran",popup_dependent:"Tergantung (khusus Mozilla/Firefox)",popup_resizable:"Jadikan window resizable",popup_location:"Tampilkan location bar",popup_menubar:"Tampilkan menu bar",popup_toolbar:"Tampilkan toolbars",popup_statusbar:"Tampilkan status bar",popup_scrollbars:"Tampilkan scrollbars",popup_return:"sisipkan \'return false\'",popup_name:"Nama Window",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Buka pada Window baru",target_top:"Buka pada frame atas (Gantikan semua frame)",target_parent:"Buka pada parent window/frame",target_same:"Buka pada window/frame ini",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Properti Pop-Up",general_props:"Properti Umum",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"Umum",list:"Daftar Link",is_external:"URL yang Anda sisipkan tampaknya link eksternal, Anda ingin menambahkan awalan \'http://\'?",is_email:"URL yang Anda sisipkan tampaknya e-mail, Anda ingin menambahkan awalan \'mailto:\'?",titlefield:"Judul",target:"Target",url:"Link URL",title:"Sisipkan/Ubah link",link_list:"Daftar Link",rtl:"Kanan ke kiri",ltr:"Kiri ke kanan",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Hubungan target dengan page",rel:"Hubungan page dengan target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Kode Bahasa",target_langcode:"Bahasa Target"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ii_dlg.js b/js/tiny_mce/plugins/advlink/langs/ii_dlg.js new file mode 100755 index 000000000..c5501ef77 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ii_dlg.js @@ -0,0 +1,52 @@ +tinyMCE.addI18n('ii.advlink_dlg',{ +title:"\u63D2\u5165/\u7F16\u8F91\u8FDE\u7ED3", +url:"\u8FDE\u7ED3\u4F4D\u5740", +target:"\u76EE\u6807", +titlefield:"\u67E5\u627E", +is_email:"\u60A8\u8F93\u5165\u7684\u7F51\u5740\u5E94\u8BE5\u662F\u4E00\u4E2A\u7535\u5B50\u90AE\u5BC4\u5730\u5740\uFF0C\u662F\u5426\u9700\u8981\u5728\u90AE\u5740\u524D\u65B9\u52A0\u5165mailto:\uFF1F", +is_external:"\u60A8\u8F93\u5165\u7684\u7F51\u5740\u5E94\u8BE5\u662F\u4E00\u4E2A\u5916\u90E8\u8FDE\u7ED3\uFF0C\u662F\u5426\u9700\u8981\u5728\u7F51\u5740\u524D\u65B9\u52A0\u5165http://\uFF1F", +list:"\u8FDE\u7ED3\u6E05\u5355", +general_tab:"\u4E00\u822C", +popup_tab:"\u5F39\u51FA\u7A97\u53E3", +events_tab:"\u4E8B\u4EF6", +advanced_tab:"\u9AD8\u7EA7", +general_props:"\u4E00\u822C\u5C5E\u6027", +popup_props:"\u5F39\u51FA\u7A97\u53E3\u5C5E\u6027", +event_props:"\u4E8B\u4EF6", +advanced_props:"\u9AD8\u7EA7\u5C5E\u6027", +popup_opts:"\u9009\u9879", +anchor_names:"\u951A\u70B9", +target_same:"\u6253\u5F00\u5728\u65B0\u7A97\u53E3/\u6846\u67B6", +target_parent:"\u6253\u5F00\u5728\u7236\u7A97\u53E3/\u6846\u67B6", +target_top:"\u6253\u5F00\u5728\u6700\u4E0A\u5C42\u7684\u6846\u67B6(\u66FF\u6362\u6240\u6709\u6846\u67B6)", +target_blank:"\u6253\u5F00\u5728\u65B0\u7A97\u53E3", +popup:"Javascript\u5F39\u51FA\u7A97\u53E3", +popup_url:"\u5F39\u51FA\u7A97\u53E3\u7F51\u5740", +popup_name:"\u7A97\u53E3\u540D\u79F0", +popup_return:"\u63D2\u5165'return false'", +popup_scrollbars:"\u663E\u793A\u8FB9\u6761", +popup_statusbar:"\u663E\u793A\u72B6\u6001\u680F", +popup_toolbar:"\u663E\u793A\u5DE5\u5177\u5217", +popup_menubar:"\u663E\u793A\u529F\u80FD\u8868", +popup_location:"\u663E\u793A\u7F51\u5740\u5217", +popup_resizable:"\u53EF\u8C03\u6574\u7A97\u53E3\u5C3A\u5BF8", +popup_dependent:"\u4ECE\u5C5E(\u53EA\u6709Mozilla/Firefox\u6709\u6548)", +popup_size:"\u5C3A\u5BF8", +popup_position:"\u5EA7\u6807(X/Y)", +id:"Id", +style:"\u6837\u5F0F", +classes:"\u7C7B\u578B", +target_name:"\u76EE\u6807\u540D\u79F0", +langdir:"\u8BED\u8A00\u4E66\u5199\u65B9\u5411", +target_langcode:"\u76EE\u7684\u8BED\u8A00", +langcode:"\u8BED\u8A00\u7F16\u7801", +encoding:"\u7F16\u7801", +mime:"\u76EE\u6807MIME\u7C7B\u578B", +rel:"\u9875\u5230\u76EE\u6807\u7684\u5173\u7CFB", +rev:"\u76EE\u6807\u5230\u9875\u7684\u5173\u7CFB", +tabindex:"Tab\u7D22\u5F15", +accesskey:"\u5FEB\u901F\u952E", +ltr:"\u7531\u5DE6\u5230\u53F3", +rtl:"\u7531\u53F3\u5230\u5DE6", +link_list:"\u8FDE\u7ED3\u6E05\u5355" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/is_dlg.js b/js/tiny_mce/plugins/advlink/langs/is_dlg.js new file mode 100755 index 000000000..759fd70e4 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.advlink_dlg',{target_name:"Target heiti",classes:"Klasi",style:"St\u00edll",id:"Id",popup_position:"Sta\u00f0setning (X/Y)",langdir:"\u00c1tt tungum\u00e1ls",popup_size:"St\u00e6r\u00f0",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Leyfa breytingu st\u00e6r\u00f0ar \u00e1 glugga",popup_location:"Birta vefsl\u00f3\u00f0",popup_menubar:"Birta valmynd",popup_toolbar:"Show toolbars",popup_statusbar:"Birta st\u00f6\u00f0u sl\u00e1",popup_scrollbars:"Birta runusl\u00e1",popup_return:"B\u00e6ta vi\u00f0 \'return false\'",popup_name:"Heiti gluggans",popup_url:"Sl\u00f3\u00f0 sprettigluggans",popup:"Javascript sprettigluggi",target_blank:"Opna \u00ed n\u00fdjum glugga",target_top:"Opna \u00ed efsta ramma (kemur \u00ed sta\u00f0inn fyrir alla ramma)",target_parent:"Opna \u00ed yfir glugga / ramma",target_same:"Opna \u00ed \u00feessum glugga / ramma",anchor_names:"Anchors",popup_opts:"M\u00f6guleikar",advanced_props:"Frekari eiginleikar",event_props:"Vi\u00f0bur\u00f0ir",popup_props:"Eiginleikar sprettiglugga",general_props:"Almennir eiginleikar",advanced_tab:"N\u00e1nar",events_tab:"Vi\u00f0bur\u00f0ir",popup_tab:"Sprettigluggi",general_tab:"Almennt",list:"Listi hlekkja",is_external:"Sl\u00f3\u00f0in sem \u00fe\u00fa skr\u00e1\u00f0ir vir\u00f0ist vera sl\u00f3\u00f0 utan vefs, vilt \u00fe\u00fa b\u00e6ta vi\u00f0 forskeytinu http://?",is_email:"Sl\u00f3\u00f0in sem \u00fe\u00fa skr\u00e1\u00f0ir vir\u00f0ist vera netfang, vilt \u00fe\u00fa b\u00e6ta vi\u00f0 forskeytinu mailto:?",titlefield:"Titill",target:"Target",url:"Sl\u00f3\u00f0",title:"Setja inn/breyta hlekk",link_list:"Listi hlekkja",rtl:"H\u00e6gri til vinstri",ltr:"Vinstri til h\u00e6gri",accesskey:"Fl\u00fdtihnappur",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"K\u00f3\u00f0i tungum\u00e1ls",target_langcode:"\u00c6tla\u00f0 tungum\u00e1l"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/it_dlg.js b/js/tiny_mce/plugins/advlink/langs/it_dlg.js new file mode 100755 index 000000000..8af57349b --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.advlink_dlg',{target_name:"Nome target",classes:"Classe",style:"Stile",id:"Id",popup_position:"Posizione (X/Y)",langdir:"Direzione del testo",popup_size:"Dimensioni",popup_dependent:"Dipendente (Solo in Mozilla/Firefox)",popup_resizable:"Rendi la finestra ridimensionabile",popup_location:"Mostra barra navigazione",popup_menubar:"Mostra barra menu",popup_toolbar:"Mostra barre strumenti",popup_statusbar:"Mostra barra di stato",popup_scrollbars:"Mostra barre di scorrimento",popup_return:"Inserisci \'return false\'",popup_name:"Nome finestra",popup_url:"URL Popup",popup:"Popup Javascript",target_blank:"Apri in una nuova finestra",target_top:"Apri nella cornice superiore (sostituisce tutte le cornici)",target_parent:"Apri nella finestra / cornice genitore",target_same:"Apri in questa finestra / cornice",anchor_names:"Ancore",popup_opts:"Opzioni",advanced_props:"Propriet\u00e0 avanzate",event_props:"Eventi",popup_props:"Propriet\u00e0 popup",general_props:"Propriet\u00e0 generali",advanced_tab:"Avanzate",events_tab:"Eventi",popup_tab:"Popup",general_tab:"Generale",list:"Lista collegamenti",is_external:"L\'URL inserito sembra essere un link esterno. Aggiungere il necessario prefisso http:// ?",is_email:"L\'URL inserito sembra essere un indirizzo email. Aggiungere il necessario prefisso mailto: ?",titlefield:"Titolo",target:"Target",url:"URL collegamento",title:"Inserisci/modifica link",link_list:"Lista collegamenti",rtl:"Destra verso sinistra",ltr:"Sinistra verso destra",accesskey:"Carattere di accesso",tabindex:"Indice tabulazione",rev:"Relazione da target a pagina",rel:"Relazione da pagina a target",mime:"Tipo MIME del target",encoding:"Codifica carattere del target",langcode:"Lingua",target_langcode:"Lingua del target"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ja_dlg.js b/js/tiny_mce/plugins/advlink/langs/ja_dlg.js new file mode 100755 index 000000000..54e9a0124 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.advlink_dlg',{"target_name":"\u30bf\u30fc\u30b2\u30c3\u30c8\u540d",classes:"\u30af\u30e9\u30b9",style:"\u30b9\u30bf\u30a4\u30eb",id:"ID","popup_position":"\u4f4d\u7f6e (X/Y)",langdir:"\u6587\u7ae0\u306e\u65b9\u5411","popup_size":"\u30b5\u30a4\u30ba","popup_dependent":"Dependent (Mozilla/Firefox\u306e\u307f)","popup_resizable":"\u30a6\u30a4\u30f3\u30c9\u30a6\u306e\u30b5\u30a4\u30ba\u5909\u66f4\u3092\u8a31\u53ef\u3059\u308b","popup_location":"\u30a2\u30c9\u30ec\u30b9\u30d0\u30fc\u3092\u8868\u793a","popup_menubar":"\u30e1\u30cb\u30e5\u30fc\u30d0\u30fc\u3092\u8868\u793a","popup_toolbar":"\u30c4\u30fc\u30eb\u30d0\u30fc\u3092\u8868\u793a","popup_statusbar":"\u30b9\u30c6\u30fc\u30bf\u30b9\u30d0\u30fc\u3092\u8868\u793a","popup_scrollbars":"\u30b9\u30af\u30ed\u30fc\u30eb\u30d0\u30fc\u3092\u8868\u793a","popup_return":"\'return false\'\u3092\u633f\u5165\u3059\u308b","popup_name":"\u30a6\u30a4\u30f3\u30c9\u30a6\u540d","popup_url":"\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7URL",popup:"Javascript\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7","target_blank":"\u65b0\u3057\u3044\u30a6\u30a4\u30f3\u30c9\u30a6\u3067\u958b\u304f","target_top":"\u30c8\u30c3\u30d7\u306e\u30d5\u30ec\u30fc\u30e0\u3067\u958b\u304f","target_parent":"\u89aa\u30a6\u30a4\u30f3\u30c9\u30a6/\u89aa\u30d5\u30ec\u30fc\u30e0\u3067\u958b\u304f","target_same":"\u3053\u306e\u30a6\u30a4\u30f3\u30c9\u30a6/\u30d5\u30ec\u30fc\u30e0\u3067\u958b\u304f","anchor_names":"\u30a2\u30f3\u30ab\u30fc","popup_opts":"\u30aa\u30d7\u30b7\u30e7\u30f3","advanced_props":"\u9ad8\u5ea6\u306a\u8a2d\u5b9a","event_props":"\u30a4\u30d9\u30f3\u30c8","popup_props":"\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7","general_props":"\u4e00\u822c","advanced_tab":"\u4e0a\u7d1a\u8005\u5411\u3051","events_tab":"\u30a4\u30d9\u30f3\u30c8","popup_tab":"\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7","general_tab":"\u4e00\u822c",list:"\u4e00\u89a7\u304b\u3089\u9078\u3076","is_external":"\u30ea\u30f3\u30af\u306bhttp://\u3092\u4ed8\u52a0\u3057\u307e\u3059\u304b\uff1f","is_email":"\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u5165\u529b\u3055\u308c\u307e\u3057\u305f\u3002\u30ea\u30f3\u30af\u306bmailto:\u3092\u4ed8\u52a0\u3057\u307e\u3059\u304b\uff1f",titlefield:"\u30bf\u30a4\u30c8\u30eb",target:"\u30bf\u30fc\u30b2\u30c3\u30c8",url:"\u30ea\u30f3\u30afURL",title:"\u30ea\u30f3\u30af\u306e\u633f\u5165/\u7de8\u96c6","link_list":"\u4e00\u89a7\u304b\u3089\u9078\u3076",rtl:"\u53f3\u304b\u3089\u5de6",ltr:"\u5de6\u304b\u3089\u53f3",accesskey:"\u30a2\u30af\u30bb\u30b9\u30ad\u30fc",tabindex:"\u30bf\u30d6\u30a4\u30f3\u30c7\u30c3\u30af\u30b9",rev:"\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u3053\u306e\u30da\u30fc\u30b8\u306b\u5bfe\u3059\u308b\u95a2\u4fc2",rel:"\u3053\u306e\u30da\u30fc\u30b8\u306e\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u5bfe\u3059\u308b\u95a2\u4fc2",mime:"\u30bf\u30fc\u30b2\u30c3\u30c8\u306eMIME\u30bf\u30a4\u30d7",encoding:"\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u6587\u5b57\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0",langcode:"\u8a00\u8a9e\u30b3\u30fc\u30c9","target_langcode":"\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u8a00\u8a9e"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ka_dlg.js b/js/tiny_mce/plugins/advlink/langs/ka_dlg.js new file mode 100755 index 000000000..2032210c4 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.advlink_dlg',{target_name:"\u10db\u10d8\u10d6\u10dc\u10d8\u10e1 \u10e1\u10d0\u10ee\u10d4\u10da\u10d8",classes:"\u10d9\u10da\u10d0\u10e1\u10d4\u10d1\u10d8",style:"\u10e1\u10e2\u10d8\u10da\u10d8",id:"\u10e1\u10d0\u10ee\u10d4\u10da\u10d8",popup_position:"\u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10d0 (X/Y)",langdir:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10db\u10d8\u10db\u10d0\u10e0\u10d7\u10e3\u10da\u10d1\u10d0",popup_size:"\u10d6\u10dd\u10db\u10d0",popup_dependent:"\u10d3\u10d0\u10db\u10dd\u10d9\u10d8\u10d3\u10d4\u10d1\u10e3\u10da\u10d4\u10d1\u10d0 (\u10db\u10ee\u10dd\u10da\u10dd\u10d3 Firefox)",popup_resizable:"\u10d6\u10dd\u10db\u10d8\u10e1 \u10ea\u10d5\u10da\u10d8\u10da\u10d4\u10d1\u10d8\u10e1 \u10d3\u10d0\u10e8\u10d5\u10d4\u10d1\u10d0",popup_location:"\u10d2\u10d0\u10dc\u10da\u10d0\u10d2\u10d4\u10d1\u10d8\u10e1 \u10de\u10d0\u10dc\u10d4\u10da\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10e9\u10d4\u10dc\u10d0",popup_menubar:"\u10db\u10d4\u10dc\u10d8\u10e3\u10e1 \u10d2\u10d0\u10db\u10dd\u10e9\u10d4\u10dc\u10d0",popup_toolbar:"\u10d8\u10dc\u10e1\u10e2\u10e0\u10e3\u10db\u10d4\u10dc\u10e2\u10d4\u10d1\u10d8\u10e1 \u10de\u10d0\u10dc\u10d4\u10da\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10e9\u10d4\u10dc\u10d0",popup_statusbar:"\u10db\u10d3\u10d2\u10dd\u10db\u10d0\u10e0\u10d4\u10dd\u10d1\u10d8\u10e1 \u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10e9\u10d4\u10dc\u10d0",popup_scrollbars:"\u10d2\u10d0\u10d3\u10d0\u10ee\u10d5\u10d4\u10d5\u10d8\u10e1 \u10d5\u10d4\u10da\u10d4\u10d1\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10e9\u10d4\u10dc\u10d0",popup_return:"\'return false\' \u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d0",popup_name:"\u10e4\u10d0\u10dc\u10ef\u10e0\u10d8\u10e1 \u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",popup_url:"\u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8",popup:"\u10d2\u10d0\u10e8\u10da\u10d0 Java-\u10e1 \u10d2\u10d0\u10db\u10dd\u10e7\u10d4\u10dc\u10d4\u10d1\u10d8\u10d7",target_blank:"\u10d0\u10ee\u10d0\u10da \u10e4\u10d0\u10dc\u10ef\u10d0\u10e0\u10d0\u10e8\u10d8 \u10d2\u10d0\u10ee\u10e1\u10dc\u10d0",target_top:"\u10d6\u10d4\u10d3\u10d0 \u10d9\u10d0\u10d3\u10e0\u10e8\u10d8 \u10d2\u10d0\u10ee\u10e1\u10dc\u10d0",target_parent:"\u10e1\u10d0\u10d9\u10e3\u10d7\u10d0\u10e0\u10d0 \u10e4\u10d0\u10dc\u10ef\u10d0\u10e0\u10d0\u10e8\u10d8 \u10d2\u10d0\u10ee\u10e1\u10dc\u10d0",target_same:"\u10db\u10dd\u10ea\u10d4\u10db\u10e3\u10da \u10e4\u10d0\u10dc\u10ef\u10d0\u10e0\u10d0\u10e8\u10d8 \u10d2\u10d0\u10ee\u10e1\u10dc\u10d0",anchor_names:"\u10e6\u10e3\u10d6\u10d4\u10d1\u10d8",popup_opts:"\u10db\u10d0\u10ee\u10d0\u10e1\u10d8\u10d0\u10d7\u10d4\u10d1\u10da\u10d4\u10d1\u10d8",advanced_props:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7\u10d8 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",event_props:"\u10db\u10dd\u10d5\u10da\u10d4\u10dc\u10d4\u10d1\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",popup_props:"\u10d2\u10d0\u10e8\u10da\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",general_props:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",advanced_tab:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7",events_tab:"\u10db\u10dd\u10d5\u10da\u10d4\u10dc\u10d0",popup_tab:"\u10d2\u10d0\u10e8\u10da\u10d0",general_tab:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd",list:"\u10e1\u10d8\u10d0",is_external:"\u10e8\u10d4\u10e7\u10d5\u10d0\u10dc\u10d8\u10da\u10d8 \u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8 \u10d2\u10d0\u10d5\u10e1 \u10d2\u10d0\u10e0\u10d4 \u10d1\u10db\u10e3\u10da\u10e1, \u10d3\u10d0\u10d5\u10d0\u10db\u10d0\u10d7\u10dd\u10e2 \u10de\u10e0\u10d4\u10e4\u10d8\u10e5\u10e1\u10d8 http://?",is_email:" \u10e8\u10d4\u10e7\u10d5\u10d0\u10dc\u10d8\u10da\u10d8 \u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8 \u10d2\u10d0\u10d5\u10e1 \u10d4\u10da.\u10e4\u10dd\u10e1\u10e2\u10d8\u10e1 \u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10e1, \u10d3\u10d0\u10d5\u10d0\u10db\u10d0\u10e2\u10dd\u10d7 \u10de\u10e0\u10d4\u10e4\u10d8\u10e5\u10e1\u10d8 mailto:?",titlefield:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",target:"\u10db\u10d8\u10d6\u10d0\u10dc\u10d8",url:"\u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8",title:"\u10d1\u10db\u10e3\u10da\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",link_list:"\u10d1\u10db\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10e1\u10d8\u10d0",rtl:"\u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d5",ltr:"\u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d5",accesskey:"\u10e8\u10d4\u10e0\u10ec\u10d4\u10d5\u10d8\u10e1 \u10d2\u10d0\u10e1\u10d0\u10e6\u10d4\u10d1\u10d8",tabindex:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",rev:"\u10db\u10d8\u10d6\u10dc\u10d8\u10e1 \u10d3\u10d0\u10db\u10dd\u10d9\u10d8\u10d3\u10d4\u10d1\u10e3\u10da\u10d4\u10d1\u10d0 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d7\u10d0\u10dc",rel:"\u10d2\u10d5\u10d4\u10e0\u10d3\u10d8\u10e1 \u10d3\u10d0\u10db\u10dd\u10d9\u10d8\u10d3\u10d4\u10d1\u10e3\u10da\u10d4\u10d1\u10d0 \u10db\u10d8\u10d6\u10d0\u10dc\u10d7\u10d0\u10dc",mime:"MIME \u10db\u10d8\u10d6\u10dc\u10d8\u10e1 \u10e2\u10d8\u10de\u10d8",encoding:"\u10db\u10d8\u10d6\u10dc\u10d8\u10e1 \u10d9\u10dd\u10d3\u10d8\u10e0\u10d4\u10d1\u10d0",langcode:"\u10d4\u10dc\u10d8\u10e1 \u10d9\u10dd\u10d3\u10d8",target_langcode:"\u10db\u10d8\u10d6\u10dc\u10d8\u10e1 \u10d4\u10dc\u10d0"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/kl_dlg.js b/js/tiny_mce/plugins/advlink/langs/kl_dlg.js new file mode 100755 index 000000000..435a1f5a1 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/km_dlg.js b/js/tiny_mce/plugins/advlink/langs/km_dlg.js new file mode 100755 index 000000000..359c368ca --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.advlink_dlg',{target_name:"\u1788\u17d2\u1798\u17c4\u17c7\u1782\u17c4\u179b\u178a\u17c5",classes:"\u1790\u17d2\u1793\u17b6\u1780\u17cb",style:"\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798",id:"\u179b\u179f.",popup_position:"\u1791\u17b8\u178f\u17b6\u17c6\u1784 (X/Y)",langdir:"\u1791\u17b7\u179f\u178a\u17c5\u1797\u17b6\u179f\u17b6",popup_size:"\u1791\u17c6\u17a0\u17c6",popup_dependent:"\u17a2\u17b6\u179f\u17d2\u179a\u17d0\u1799 (Mozilla/Firefox \u178f\u17c2\u1794\u17c9\u17bb\u178e\u17d2\u178e\u17c4\u17c7)",popup_resizable:"\u17b1\u17d2\u1799\u1794\u1784\u17d2\u17a2\u17bd\u1785\u17a2\u17b6\u1785\u1794\u17d2\u178f\u17bc\u179a\u1791\u17c6\u17a0\u17c6\u1794\u17b6\u1793",popup_location:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u179a\u1794\u17b6\u179a\u1791\u17b8\u178f\u17b6\u17c6\u1784",popup_menubar:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u179a\u1794\u17b6\u179a\u1798\u17c9\u17ba\u1793\u17bb\u1799",popup_toolbar:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u179a\u1794\u17b6\u179a\u17a7\u1794\u1780\u179a\u178e\u17cd",popup_statusbar:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u179a\u1794\u17b6\u179a\u179f\u17d2\u1790\u17b6\u1793\u1797\u17b6\u1796",popup_scrollbars:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u179a\u1794\u17b6\u179a\u179a\u1798\u17bc\u179a",popup_return:"\u1794\u1789\u17d2\u1785\u17bc\u179b\'return false\'",popup_name:"\u1788\u17d2\u1798\u17c4\u17c7\u1794\u1784\u17d2\u17a2\u17bc\u1785",popup_url:"\u17a2\u17b6\u179f\u178a\u17d2\u178b\u17b6\u1793\u1794\u1784\u17d2\u17a2\u17bd\u1785\u179b\u17c1\u1785\u17a1\u17be\u1784",popup:"\u1794\u1784\u17d2\u17a2\u17bd\u1785\u179b\u17c1\u1785\u17a1\u17be\u1784 Javascript",target_blank:"\u1794\u17be\u1780\u1780\u17d2\u1793\u17bb\u1784\u1794\u1784\u17d2\u17a2\u17bd\u1785\u1790\u17d2\u1798\u17b8",target_top:"\u1794\u17be\u1780\u1780\u17d2\u1793\u17bb\u1784\u179f\u17ca\u17bb\u1798\u179b\u17be (\u1787\u17c6\u1793\u17bd\u179f\u1782\u17d2\u179a\u1794\u17cb\u179f\u17ca\u17bb\u1798\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb)",target_parent:"\u1794\u17be\u1780\u1780\u17d2\u1793\u17bb\u1784\u1794\u1784\u17d2\u17a2\u17bd\u1785/\u179f\u17ca\u17bb\u1798\u1798\u17c1",target_same:"\u1794\u17be\u1780\u1780\u17d2\u1793\u17bb\u1784\u1794\u1784\u17d2\u17a2\u17bd\u1785/\u179f\u17ca\u17bb\u1798\u1793\u17c1\u17c7",anchor_names:"\u1799\u17bb\u1790\u17d2\u1780\u17b6",popup_opts:"\u1787\u1798\u17d2\u179a\u17be\u179f\u179b\u17c1\u1785\u17a1\u17be\u1784",advanced_props:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb",event_props:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1796\u17d2\u179a\u17b9\u178f\u17d2\u178f\u17b7\u1780\u17b6\u179a\u178e\u17cd",popup_props:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u179b\u17c1\u1785\u17a1\u17be\u1784",general_props:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1791\u17bc\u1791\u17c5",advanced_tab:"\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb",events_tab:"\u1796\u17d2\u179a\u17b9\u178f\u17d2\u178f\u17b7\u1780\u17b6\u179a\u178e\u17cd",popup_tab:"\u179b\u17c1\u1785\u17a1\u17be\u1784",general_tab:"\u1791\u17bc\u1791\u17c5",list:"\u1794\u1789\u17d2\u1787\u17b8\u178f\u17c6\u178e",is_external:"\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u178a\u17c2\u179b\u17a2\u17d2\u1793\u1780\u1794\u17b6\u1793\u1794\u1789\u17d2\u1785\u17bc\u179b\u1791\u17c6\u1793\u1784\u1787\u17b6\u178f\u17c6\u178e\u1791\u17c5\u1780\u17d2\u179a\u17c5, \u178f\u17be\u17a2\u17d2\u1793\u1780\u1785\u1784\u17cb\u179f\u179a\u179f\u17c1\u179a http:// \u1793\u17c5\u178a\u17be\u1798\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u1791\u17c1?",is_email:"\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u178a\u17c2\u179b\u17a2\u17d2\u1793\u1780\u1794\u17b6\u1793\u1794\u1789\u17d2\u1785\u17bc\u179b\u1791\u17c6\u1793\u1784\u1787\u17b6\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u17a2\u17ca\u17b8\u1798\u17c2\u179b, \u178f\u17be\u17a2\u17d2\u1793\u1780\u1785\u1784\u17cb\u179f\u179a\u179f\u17c1\u179a mailto: \u1793\u17c5\u178a\u17be\u1798\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u1791\u17c1?",titlefield:"\u1785\u17c6\u178e\u1784\u1787\u17be\u1784",target:"\u1782\u17c4\u179b\u178a\u17c5",url:"\u17a2\u17b6\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u178f\u17c6\u178e",title:"\u1794\u1789\u17d2\u1785\u17bc\u179b/\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u178f\u17c6\u178e",link_list:"\u1794\u1789\u17d2\u1787\u17b8\u178f\u17c6\u178e",rtl:"\u1796\u17b8\u179f\u17d2\u178f\u17b6\u17c6\u1791\u17c5\u1786\u17d2\u179c\u17c1\u1784",ltr:"\u1796\u17b8\u1786\u17d2\u179c\u17c1\u1784\u1791\u17c5\u179f\u17d2\u178f\u17b6\u17c6",accesskey:"\u1782\u17d2\u179a\u17b6\u1794\u17cb\u1785\u17bb\u1785\u1795\u17d2\u179b\u17bc\u179c\u1780\u17b6\u178f\u17cb",tabindex:"\u1795\u17d2\u1791\u17b6\u17c6\u1784\u179b\u17b7\u1794\u17b7\u1780\u17d2\u179a\u1798",rev:"\u1791\u17c6\u1793\u17b6\u1780\u17cb\u1791\u17c6\u1793\u1784\u1782\u17c4\u179b\u178a\u17c5\u1791\u17c5\u1793\u17b9\u1784\u1791\u17c6\u1796\u17d0\u179a",rel:"\u1791\u17c6\u1793\u17b6\u1780\u17cb\u1791\u17c6\u1793\u1784\u1791\u17c6\u1796\u17d0\u179a\u1791\u17c5\u1793\u17b9\u1784\u1782\u17c4\u179b\u178a\u17c5",mime:"\u1794\u17d2\u179a\u1797\u17c1\u1791 MIME \u1782\u17c4\u179b\u178a\u17c5",encoding:"\u1780\u17b6\u179a\u179c\u17c1\u1785\u1780\u17bc\u178a\u178f\u17bd\u17a2\u1780\u17d2\u179f\u179a\u179a\u1794\u179f\u17cb\u1782\u17c4\u179b\u178a\u17c5",langcode:"\u1780\u17bc\u178a\u1797\u17b6\u179f\u17b6",target_langcode:"\u1797\u17b6\u179f\u17b6\u1782\u17c4\u179b\u178a\u17c5"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ko_dlg.js b/js/tiny_mce/plugins/advlink/langs/ko_dlg.js new file mode 100755 index 000000000..bc49a99ba --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.advlink_dlg',{target_name:"Target \uc774\ub984",classes:"\ud074\ub798\uc2a4",style:"\uc2a4\ud0c0\uc77c",id:"Id",popup_position:"\uc704\uce58(X/Y)",langdir:"\ud398\uc774\uc9c0 \ubb38\uc790 \ubc29\ud5a5",popup_size:"\ud06c\uae30",popup_dependent:"\uc5f0\ub3d9 (Mozilla/Firefox\ub9cc)",popup_resizable:"\ud06c\uae30\ubcc0\uacbd \uac00\ub2a5",popup_location:"\uc8fc\uc18c\ubc14\ub97c \ud45c\uc2dc",popup_menubar:"\uba54\ub274\ub97c \ud45c\uc2dc",popup_toolbar:"\ud234\ubc14\ub97c \ud45c\uc2dc",popup_statusbar:"\uc0c1\ud0dc\uc904\uc744 \ud45c\uc2dc",popup_scrollbars:"\uc2a4\ud06c\ub864\ubc14\ub97c \ud45c\uc2dc",popup_return:"\'return false\'\ub97c \uc0bd\uc785",popup_name:"Window \uc774\ub984",popup_url:"\ud31d\uc5c5 URL",popup:"Javascript \ud31d\uc5c5",target_blank:"\uc0c8\ucc3d\uc73c\ub85c \uc5f4\ub9b0\ub2e4",target_top:"\ucd5c\uc0c1\uc704 \ud504\ub808\uc784\uc73c\ub85c \uc5f4\ub9b0\ub2e4 (\ubaa8\ub4e0 \ud504\ub808\uc784 \ubcc0\uacbd)",target_parent:"\ubd80\ubaa8\ucc3d/\ud504\ub808\uc784\uc73c\ub85c \uc5f4\ub9b0\ub2e4",target_same:"\uc774 \ucc3d/\ud504\ub808\uc784\uc73c\ub85c \uc5f4\ub9b0\ub2e4",anchor_names:"\uc5e5\ucee4",popup_opts:"\uc635\uc158",advanced_props:"\uace0\uae09\uc758 \uc124\uc815",event_props:"\uc774\ubca4\ud2b8",popup_props:"\ud31d\uc5c5 \uc124\uc815",general_props:"\uc77c\ubc18 \uc124\uc815",advanced_tab:"\uace0\uae09",events_tab:"\uc774\ubca4\ud2b8",popup_tab:"\ud31d\uc5c5",general_tab:"\uc77c\ubc18",list:"\ub9c1\ud06c \ubaa9\ub85d",is_external:"\uc678\ubd80URL\uc774 \uc785\ub825\ub418\uc5c8\uc2b5\ub2c8\ub2e4.URL\uc758 \uc55e\uc5d0http://\ub97c \ubd99\uc785\ub2c8\uae4c?",is_email:"\uba54\uc77c\uc8fc\uc18c\uac00 \uc785\ub825\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uba54\uc77c\uc8fc\uc18c\uc758 \uc55e\uc5d0 mailto:\ub97c \ubd99\uc785\ub2c8\uae4c?",titlefield:"\uc81c\ubaa9",target:"Target",url:"\ub9c1\ud06c URL",title:"\ub9c1\ud06c\uc758 \uc0bd\uc785/\ud3b8\uc9d1",link_list:"\ub9c1\ud06c \ubaa9\ub85d",rtl:"\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd",ltr:"\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd",accesskey:"\uc561\uc138\uc2a4 \ud0a4",tabindex:"\ud0ed \uc778\ub371\uc2a4",rev:"\ub9c1\ud06c\ub85c\ubd80\ud130\uc758 \uad00\uacc4",rel:"\ub9c1\ud06c\uc5d0 \uad00\uacc4",mime:"MIME\ud0c0\uc785",encoding:"\ubb38\uc790 \uc778\ucf54\ub529",langcode:"\uc5b8\uc5b4 \ucf54\ub4dc",target_langcode:"\ud398\uc774\uc9c0 \uc5b8\uc5b4"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/lb_dlg.js b/js/tiny_mce/plugins/advlink/langs/lb_dlg.js new file mode 100755 index 000000000..0b456356a --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.advlink_dlg',{target_name:"Numm vun der Zils\u00e4it",classes:"Klassen",style:"Format",id:"ID",popup_position:"Positioun (X/Y)",langdir:"Schr\u00ebftrichtung",popup_size:"Gr\u00e9isst",popup_dependent:"Vun der Elteref\u00ebnster onofh\u00e4ngeg <br /> (n\u00ebmmen Mozilla/Firefox) ",popup_resizable:"Vergr\u00e9isseren vun der F\u00ebnster zouloossen",popup_location:"Adressleescht uweisen",popup_menubar:"Browsermen\u00fc uweisen",popup_toolbar:"Geschirleeschten uweisen",popup_statusbar:"Statusleeschten uweisen",popup_scrollbars:"Scrollbalken uweisen",popup_return:"Link trotz Popup suiv\u00e9ieren",popup_name:"Numm vun der F\u00ebnster",popup_url:"Popup-Adress",popup:"JavaScript-Popup",target_blank:"An enger neier F\u00ebnster opmaachen",target_top:"Am ieweschte Frame opmaacheen (sprengt d\'Frameset)",target_parent:"An der iwwergeuerdneter F\u00ebnster/Frame opmaachen",target_same:"An der selwechter F\u00ebnster/Frame opmaachen",anchor_names:"Anker",popup_opts:"Optiounen",advanced_props:"Erweidert Eegeschaften",event_props:"Evenement",popup_props:"Popup-Eegeschaften",general_props:"Allgemeng Eegeschaften",advanced_tab:"Erweidert",events_tab:"Evenement",popup_tab:"Popup",general_tab:"Allgemeng",list:"Linkl\u00ebscht",is_external:"D\u00ebs Adress sch\u00e9ngt een externe Link ze sinn. W\u00ebllt Dir den dofir ben\u00e9idegte Pr\u00e4fix \"http://\" virdru setzen?",is_email:"D\u00ebs Adress sch\u00e9ngt eng Email-Adress ze sinn. W\u00ebllt Dir den dofir ben\u00e9idegte Pr\u00e4fix \"mailto:\" virdru setzen?",titlefield:"Titel",target:"F\u00ebnster",url:"Adress",title:"Link af\u00fcgen/beaarbechten",link_list:"Linkl\u00ebscht",rtl:"Riets no l\u00e9nks",ltr:"L\u00e9nks no riets",accesskey:"Tastekierzel",tabindex:"Tabindex",rev:"Bez\u00e9iung vum Linkzil zur S\u00e4it",rel:"Bez\u00e9iung vun der S\u00e4it zum Linkzil",mime:"MIME-Typ vun der Zils\u00e4it",encoding:"Zeechekod\u00e9ierung vun der Zils\u00e4it",langcode:"Sproochcode",target_langcode:"Sprooch vun der Zils\u00e4it"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/lt_dlg.js b/js/tiny_mce/plugins/advlink/langs/lt_dlg.js new file mode 100755 index 000000000..e477b4554 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.advlink_dlg',{target_name:"Paskirties vardas",classes:"Klas\u0117s",style:"Stilius",id:"Id",popup_position:"Pozicija (X/Y)",langdir:"Kalbos kryptis",popup_size:"Dydis",popup_dependent:"Proporcionaliai (tik Mozilla/Firefox)",popup_resizable:"Galima koreguoti lango i\u0161matavimus",popup_location:"Rodyti adres\u0173 juost\u0105",popup_menubar:"Rodyti meniu juost\u0105",popup_toolbar:"Rodyti \u012franki\u0173 juost\u0105",popup_statusbar:"Rodyti b\u016bsenos juost\u0105",popup_scrollbars:"Rodyti slankjuostes",popup_return:"\u012eterpti \u201ereturn false\u201c",popup_name:"Lango vardas",popup_url:"I\u0161kylan\u010dio lango URL adresas",popup:"Javascript i\u0161kylantis langas",target_blank:"Atverti naujame lange",target_top:"Atverti vir\u0161utiniame lange (pakei\u010dia visus langus)",target_parent:"Atverti t\u0117viniame lange",target_same:"Atverti tame pa\u010diame lange",anchor_names:"Prierai\u0161ai",popup_opts:"Nustatymai",advanced_props:"I\u0161pl\u0117stiniai nustatymai",event_props:"\u012evykiai",popup_props:"I\u0161kylan\u010dio lango nustatymai",general_props:"Bendri nustatymai",advanced_tab:"I\u0161pl\u0117sta",events_tab:"\u012evykiai",popup_tab:"I\u0161kylantis langas",general_tab:"Bendra",list:"Nuorod\u0173 s\u0105ra\u0161as",is_external:"URL adresas, kur\u012f \u012fved\u0117te yra i\u0161orin\u0117 nuoroda, ar norite prid\u0117ti reikaling\u0105 http:// prefiks\u0105?",is_email:"URL adresas, kur\u012f \u012fved\u0117te yra el. pa\u0161to adresas, ar norite prid\u0117ti reikaling\u0105 mailto: prefiks\u0105?",titlefield:"Pavadinimas",target:"Paskirtis",url:"Nuorodos URL adresas",title:"\u012eterpti/Redaguoti nuorod\u0105",link_list:"Nuorod\u0173 s\u0105ra\u0161as",rtl:"I\u0161 de\u0161in\u0117s \u012f kair\u0119",ltr:"I\u0161 kair\u0117s \u012f de\u0161in\u0119",accesskey:"Prieigos klavi\u0161as",tabindex:"Tabuliavimo indeksas",rev:"Ry\u0161ys paskirties su puslapiu",rel:"Ry\u0161ys puslapio su paskirtimi",mime:"Paskirties MIME tipas",encoding:"Kalbos koduot\u0117",langcode:"Kalbos kodas",target_langcode:"Paskirties kalba"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/lv_dlg.js b/js/tiny_mce/plugins/advlink/langs/lv_dlg.js new file mode 100755 index 000000000..b5f94ee40 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.advlink_dlg',{target_name:"M\u0113r\u0137a nosaukums",classes:"Klases",style:"St\u012bls",id:"Id",popup_position:"Poz\u012bcija (X/Y)",langdir:"Valodas virziens",popup_size:"Izm\u0113rs",popup_dependent:"Atkar\u012bgs (tikai priek\u0161 Mozilla/Firefox)",popup_resizable:"Iedot iesp\u0113ju main\u012bt loga izmerus",popup_location:"Par\u0101d\u012bt adreses joslu",popup_menubar:"Par\u0101d\u012bt izvelnes joslu",popup_toolbar:"Par\u0101d\u012bt r\u012bkjoslu",popup_statusbar:"Par\u0101d\u012bt status bar",popup_scrollbars:"Par\u0101d\u012bt scrollbars",popup_return:"Ielikt \'return false\'",popup_name:"Loga nosaukums",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Atvert jaun\u0101j\u0101 log\u0101",target_top:"Atvert pa virsu \u0161im r\u0101m\u012bm (aizvieto visus r\u0101mjus)",target_parent:"Atvert \u0161aj\u0101 log\u0101 / r\u0101m\u012b",target_same:"Atvert \u0161aj\u0101 log\u0101 / r\u0101m\u012b",anchor_names:"Enkuri",popup_opts:"Opcijas",advanced_props:"Advanced \u012bpa\u0161\u012bbas",event_props:"Notikumi",popup_props:"Popup \u012bpa\u0161\u012bbas",general_props:"Kop\u012bgas \u012bpa\u0161\u012bbas",advanced_tab:"Advanced",events_tab:"Notikumi",popup_tab:"Popup",general_tab:"Kop\u012bgais",list:"Link list",is_external:"Ievad\u012btais URL \u0161\u0137iet ir \u0101r\u0113j\u0101 saite, vai J\u016bs v\u0113laties pirms t\u0101s pievienot http:// pried\u0113kli?",is_email:"Ievad\u012btais URL \u0161\u0137iet ir e-pasta adrese, vai J\u016bs v\u0113laties pirms t\u0101s pievienot mailto: pried\u0113kli?",titlefield:"Nosaukums",target:"M\u0113r\u0137is",url:"Saites URL",title:"Ievietot/Redi\u0123\u0113t saiti",link_list:"Sakaru saraksts",rtl:"No labas puses uz kreiso",ltr:"No kreisas puses uz labo",accesskey:"Pieejas poga",tabindex:"Tabindex",rev:"M\u0113r\u0137a attiec\u012bbas pret lapu",rel:"Lapas attiec\u012bbas pret m\u0113r\u0137i",mime:"M\u0113r\u0137a MIME tips",encoding:"M\u0113r\u0137a valodas koda tabula",langcode:"Valodas kods",target_langcode:"M\u0113r\u0137a valoda"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/mk_dlg.js b/js/tiny_mce/plugins/advlink/langs/mk_dlg.js new file mode 100755 index 000000000..96bd02fed --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.advlink_dlg',{target_name:"Ime mete",classes:"Klasa",style:"Stil",id:"Id",popup_position:"Pozicija (X/Y)",langdir:"Smjer jezika",popup_size:"Veli\u010dina",popup_dependent:"Ovisan (samo za Mozilla/Firefox)",popup_resizable:"Prozor promjenjive veli\u010dine",popup_location:"Poka\u017ei traku lokacije",popup_menubar:"Poka\u017ei izbornik",popup_toolbar:"Poka\u017ei alatne trake",popup_statusbar:"Poka\u017ei statusnu traku",popup_scrollbars:"Poka\u017ei kliza\u010de",popup_return:"\u0412\u043c\u0435\u0442\u043d\u0438 \'return false\'",popup_name:"Ime prozora",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Otvori u novom prozoru",target_top:"Otvori u gornjem okviru (zamjenjuje sve okvire)",target_parent:"Otvori u izvornom prozoru / okvir",target_same:"Otovori u novom prozoru / okviru",anchor_names:"Sidra",popup_opts:"Opcije",advanced_props:"Napredna svojstva",event_props:"Doga\u0111aji",popup_props:"Svojstva popup prozora",general_props:"Osnovna svojstva",advanced_tab:"Napredno",events_tab:"Doga\u0111aj",popup_tab:"Popup",general_tab:"Osnovno",list:"Lista poveznica",is_external:"URL koji ste uneli izgleda kao vanjska poveznica, \u017eelite li dodati potrebni http:// prefiks?",is_email:"URL koji ste uneli izgleda kao e-mail adresa, \u017eelite li dodati potrebni mailto: prefiks?",titlefield:"\u041d\u0430\u0441\u043b\u043e\u0432",target:"Meta",url:"URL poveznice",title:"\u0412\u043c\u0435\u0442\u043d\u0438/uredi poveznicu",link_list:"Lista poveznica",rtl:"S desna na levo",ltr:"S leva na desno",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Odnos mete prema stranici",rel:"Odnos stranice prema meti",mime:"MIME tip",encoding:"Kodiranje znakova",langcode:"Kod jezika",target_langcode:"Jezik"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ml_dlg.js b/js/tiny_mce/plugins/advlink/langs/ml_dlg.js new file mode 100755 index 000000000..2649a7fde --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/mn_dlg.js b/js/tiny_mce/plugins/advlink/langs/mn_dlg.js new file mode 100755 index 000000000..06afa8184 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.advlink_dlg',{target_name:"\u0422\u043e\u0432\u043b\u043e\u0441\u043e\u043d \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u044b \u043d\u044d\u0440",classes:"\u0410\u043d\u0433\u0438",style:"\u0424\u043e\u0440\u043c\u0430\u0442",id:"\u0422\u0422",popup_position:"\u0411\u0430\u0439\u0440\u043b\u0430\u043b (X/Y)",langdir:"\u0411\u0438\u0447\u0433\u0438\u0439\u043d \u0447\u0438\u0433\u043b\u044d\u043b",popup_size:"\u0425\u044d\u043c\u0436\u044d\u044d",popup_dependent:"\u042d\u0445 \u0446\u043e\u043d\u0445\u043d\u043e\u043e\u0441 \u0445\u0430\u043c\u0430\u0430\u0440\u0430\u043b\u0442\u0430\u0439 (\u0417\u04e9\u0432\u0445\u04e9\u043d Mozilla/Firefox)",popup_resizable:"\u0426\u043e\u043d\u0445 \u0442\u043e\u043c\u0440\u0443\u0443\u043b\u0430\u0445\u044b\u0433 \u0437\u04e9\u0432\u0448\u04e9\u04e9\u0440\u04e9\u0445",popup_location:"\u0425\u0430\u044f\u0433\u0438\u0439\u043d \u0441\u0430\u043c\u0431\u0430\u0440 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",popup_menubar:"\u0425\u04e9\u0442\u04e9\u0447\u0438\u0439\u043d \u0446\u044d\u0441 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",popup_toolbar:"\u0411\u0430\u0433\u0430\u0436 \u0441\u0430\u043c\u0431\u0430\u0440 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",popup_statusbar:"\u0422\u04e9\u043b\u04e9\u0432 \u0441\u0430\u043c\u0431\u0430\u0440 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",popup_scrollbars:"\u0413\u04af\u0439\u043b\u0433\u044d\u0433\u0447 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",popup_return:"\u041f\u043e\u043f\u0430\u043f \u0431\u0430\u0439\u0441\u0430\u043d \u0447 \u0445\u043e\u043b\u0431\u043e\u043e\u0441\u044b\u0433 \u0434\u0430\u0433\u0430\u043d\u0430",popup_name:"\u0426\u043e\u043d\u0445\u043d\u044b \u043d\u044d\u0440",popup_url:"\u041f\u043e\u043f\u0430\u043f-\u0445\u0430\u044f\u0433",popup:"\u0416\u0430\u0432\u0430\u0441\u043a\u0440\u0438\u043f\u0442-\u043f\u043e\u043f\u0430\u043f",target_blank:"\u0428\u0438\u043d\u044d \u0446\u043e\u043d\u0445\u043e\u043d\u0434 \u043d\u044d\u044d\u0445",target_top:"\u0425\u0430\u043c\u0433\u0438\u0439\u043d \u0434\u044d\u044d\u0434 \u0446\u043e\u043d\u0445/\u0444\u0440\u044d\u0439\u043c\u0434 \u043d\u044d\u044d\u0445",target_parent:"\u042d\u0445 \u0446\u043e\u043d\u0445/\u0444\u0440\u044d\u0439\u043c\u0434 \u043d\u044d\u044d\u0445",target_same:"\u0422\u0443\u0445\u0430\u0439\u043d \u0446\u043e\u043d\u0445/\u0444\u0440\u044d\u0439\u043c\u0434 \u043d\u044d\u044d\u0445",anchor_names:"\u0413\u0430\u0434\u0430\u0441",popup_opts:"\u0421\u043e\u043d\u0433\u043e\u043b\u0442",advanced_props:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d \u0448\u0438\u043d\u0436",event_props:"\u04ae\u0437\u044d\u0433\u0434\u044d\u043b",popup_props:"\u041f\u043e\u043f\u0430\u043f-\u0448\u0438\u043d\u0436",general_props:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439 \u0448\u0438\u043d\u0436",advanced_tab:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d",events_tab:"\u04ae\u0437\u044d\u0433\u0434\u044d\u043b",popup_tab:"\u041f\u043e\u043f\u0430\u043f",general_tab:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439",list:"\u0425\u043e\u043b\u0431\u043e\u043e\u0441\u044b\u043d \u0436\u0430\u0433\u0441\u0430\u0430\u043b\u0442",is_external:"\u0425\u0430\u044f\u0433 \u0434\u044d\u044d\u0440 \u0433\u0430\u0434\u0430\u0430\u0434 \u0445\u043e\u043b\u0431\u043e\u043e\u0441 \u0431\u0430\u0439\u0433\u0430\u0430 \u0445\u0430\u0440\u0430\u0433\u0434\u0430\u043d\u0430. \u0422\u0430 \u0437\u04e9\u0432 \u0445\u043e\u043b\u0431\u043e\u043e\u0441 \u0431\u043e\u043b\u0433\u043e\u0445\u044b\u043d \u0442\u0443\u043b\u0434 http:// \u043d\u044d\u043c\u044d\u0445\u0438\u0439\u0433 \u0445\u04af\u0441\u044d\u0436 \u0431\u0430\u0439\u043d\u0430 \u0443\u0443?",is_email:"\u0425\u0430\u044f\u0433 \u0434\u044d\u044d\u0440 \u0418\u043c\u044d\u0439\u043b \u0445\u0430\u044f\u0433 \u0431\u0430\u0439\u0445 \u0448\u0438\u0433 \u0445\u0430\u0440\u0430\u0433\u0434\u0430\u043d\u0430. \u0422\u0430 \u0442\u04af\u04af\u043d\u0434 \u0448\u0430\u0430\u0440\u0434\u043b\u0430\u0433\u0430\u0442\u0430\u0439 mailto: \u043d\u044d\u043c\u044d\u0445\u0438\u0439\u0433 \u0445\u04af\u0441\u044d\u0436 \u0431\u0430\u0439\u043d\u0430 \u0443\u0443?",titlefield:"\u0413\u0430\u0440\u0447\u0438\u0433",target:"\u0426\u043e\u043d\u0445",url:"\u0425\u0430\u044f\u0433",title:"\u0425\u043e\u043b\u0431\u043e\u043e\u0441 \u043e\u0440\u0443\u0443\u043b\u0430\u0445/\u0437\u0430\u0441\u0430\u0445",link_list:"\u0425\u043e\u043b\u0431\u043e\u043e\u0441\u044b\u043d \u0436\u0430\u0433\u0441\u0430\u0430\u043b\u0442",rtl:"\u0411\u0430\u0440\u0443\u0443\u043d\u0430\u0430\u0441 \u0437\u04af\u04af\u043d",ltr:"\u0417\u04af\u04af\u043d\u044d\u044d\u0441 \u0431\u0430\u0440\u0443\u0443\u043d",accesskey:"\u0422\u043e\u0432\u0447\u0438\u043b\u0431\u043e\u0440",tabindex:"\u0422\u0430\u0431\u0443\u043b\u0430\u0442\u043e\u0440 \u0438\u043d\u0434\u0435\u043a\u0441",rev:"\u0425\u0443\u0443\u0434\u0430\u0441\u043d\u0430\u0430\u0441 \u0442\u043e\u0432\u043b\u043e\u0441\u043e\u043d \u0445\u043e\u043b\u0431\u043e\u043e\u0441\u043e\u043e\u0441 \u0445\u043e\u043b\u0431\u043e\u043b\u0442",rel:"\u0422\u043e\u0432\u043b\u043e\u0441\u043e\u043d \u0445\u043e\u043b\u0431\u043e\u043e\u0441\u043e\u043e\u0441 \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u044b \u0445\u043e\u043b\u0431\u043e\u043b\u0442",mime:"\u0422\u043e\u0432\u043b\u043e\u0441\u043e\u043d \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u044b MIME \u0442\u04e9\u0440\u04e9\u043b",encoding:"\u0422\u043e\u0432\u043b\u043e\u0441\u043e\u043d \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u044b \u043a\u043e\u0434\u0447\u0438\u043b\u043e\u043b",langcode:"\u0425\u044d\u043b\u043d\u0438\u0439 \u043a\u043e\u0434",target_langcode:"\u0422\u043e\u0432\u043b\u043e\u0441\u043e\u043d \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u044b \u0445\u044d\u043b"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ms_dlg.js b/js/tiny_mce/plugins/advlink/langs/ms_dlg.js new file mode 100755 index 000000000..c3267c04a --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.advlink_dlg',{target_name:"Nama sasaran",classes:"Kelas-kelas",style:"Gaya",id:"Id",popup_position:"Posisi (X/Y)",langdir:"Arah bahasa",popup_size:"Saiz",popup_dependent:"Tanggungan (Hanya Mozilla/Firefox)",popup_resizable:"Jadikan tetingkap boleh diubahsuai",popup_location:"Tunjuk bar lokasi",popup_menubar:"Tunjuk bar menu",popup_toolbar:"Tunjuk bar alatan",popup_statusbar:"Tunjuk bar status",popup_scrollbars:"Tunjuk bar gulung",popup_return:"Masukkan \'return false\'",popup_name:"Nama tetingkap",popup_url:"Popup URL",popup:"Popup Javascript ",target_blank:"Buka dalam tetingkap baru.",target_top:"Buka bingkaian atas (gantikan kesemua bingkai)",target_parent:"Buka dalam tetingkap yang lain",target_same:"Buka tetingkap ini",anchor_names:"Sauh",popup_opts:"Pilihan",advanced_props:"Alatan lanjutan",event_props:"Peristiwa",popup_props:"Alatan Popup",general_props:"Alatan am",advanced_tab:"Lanjutan",events_tab:"Peristiwa",popup_tab:"Popup",general_tab:"Am",list:"Senarai pautan",is_external:"URL yang dimasukkan adalah pautan luar, tambah \"http://\" di awalan?",is_email:"URL yang dimasukkan adalah alamat emel, tambah \"mailto\": di awalan?",titlefield:"Tajuk",target:"Sasaran",url:"Pautan URL",title:"Sisip/sunting pautan",link_list:"Senarai pautan",rtl:"Kanan ke kiri",ltr:"Kiri ke kanan",accesskey:"Kunci akses",tabindex:"Tanda indeks",rev:"Kaitan sasaran kepada halaman",rel:"Kaitan halaman kepada sasaran",mime:"Sasaran jenis MIME",encoding:"Sasaran enkod perkataan",langcode:"Kod bahasa",target_langcode:"Bahasa sasaran"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/my_dlg.js b/js/tiny_mce/plugins/advlink/langs/my_dlg.js new file mode 100755 index 000000000..02cc985a2 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/nb_dlg.js b/js/tiny_mce/plugins/advlink/langs/nb_dlg.js new file mode 100755 index 000000000..fc29ce712 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.advlink_dlg',{"target_name":"M\u00e5lnavn",classes:"Klasser",style:"Stil",id:"Id","popup_position":"Posisjon (X/Y)",langdir:"Skriftretning","popup_size":"St\u00f8rrelse","popup_dependent":"Avhengig vindu (bare i Mozilla/Firefox)","popup_resizable":"Gj\u00f8r vinduet skalerbart","popup_location":"Vis plasseringslinje","popup_menubar":"Vis menylinje","popup_toolbar":"Vis verkt\u00f8ylinjer","popup_statusbar":"Vis statuslinje","popup_scrollbars":"Vis rullefelt","popup_return":"Sett inn \'return false\'","popup_name":"Vindunavn","popup_url":"Popup URL",popup:"Javascript-popup","target_blank":"\u00c5pne i nytt vindu","target_top":"\u00c5pne i toppvindu (erstatter alle rammer)","target_parent":"\u00c5pne i overordnet vindu/ramme","target_same":"\u00c5pne i samme vindu/ramme","anchor_names":"Anker","popup_opts":"Innstillinger","advanced_props":"Generelle egenskaper","event_props":"Hendelser","popup_props":"Popup-egenskaper","general_props":"Generelle egenskaper","advanced_tab":"Avansert","events_tab":"Hendelser","popup_tab":"Popup","general_tab":"Generelt",list:"Lenkeliste","is_external":"URL\'en du oppga synes \u00e5 v\u00e6re en ekstern lenke, \u00f8nsker du \u00e5 legge til den n\u00f8dvendige http:// prefix?","is_email":"URL\'en du oppga synes \u00e5 v\u00e6re en email adresse, \u00f8nsker du \u00e5 legge til den n\u00f8dvendige mailto: prefix?",titlefield:"Tittel",target:"M\u00e5l",url:"Lenkens URL",title:"Sett inn / rediger lenke","link_list":"Lenkeliste",rtl:"H\u00f8yre mot venstre",ltr:"Venstre mot h\u00f8yre",accesskey:"Hurtigtast",tabindex:"Tabulatorindeks",rev:"M\u00e5lets forhold til siden",rel:"Sidens forhold til m\u00e5let",mime:"M\u00e5lets MIME-type",encoding:"Tegnkonvertering",langcode:"Spr\u00e5kkode","target_langcode":"M\u00e5lspr\u00e5k"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/nl_dlg.js b/js/tiny_mce/plugins/advlink/langs/nl_dlg.js new file mode 100755 index 000000000..f6a51bb35 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.advlink_dlg',{"target_name":"Doel",classes:"Klassen",style:"Stijl",id:"Id","popup_position":"Positie (X/Y)",langdir:"Taalrichting","popup_size":"Grootte","popup_dependent":"Afhankelijk (Alleen Mozilla/Firefox)","popup_resizable":"Aanpasbaar venster","popup_location":"Lokatiebalk weergeven","popup_menubar":"Menubalk weergeven","popup_toolbar":"Werkbalk weergeven","popup_statusbar":"Statusbalk weergeven","popup_scrollbars":"Scrollbalken weergeven","popup_return":"\'return false\' invoegen","popup_name":"Venstertitel","popup_url":"Popup URL",popup:"Javascript popup","target_blank":"In nieuw venster openen","target_top":"In bovenste frame openen (vervangt gehele pagina)","target_parent":"In bovenliggend venster / frame openen","target_same":"In dit venster / frame openen","anchor_names":"Ankers","popup_opts":"Opties","advanced_props":"Geavanceerde eigenschappen","event_props":"Gebeurtenissen","popup_props":"Popup eigenschappen","general_props":"Algemene eigenschappen","advanced_tab":"Geavanceerd","events_tab":"Gebeurtenissen","popup_tab":"Popup","general_tab":"Algemeen",list:"Lijst","is_external":"De ingevoerde URL lijkt op een externe link. Wilt u de vereiste http:// tekst voorvoegen?","is_email":"De ingevoerde URL lijkt op een e-mailadres. Wilt u de vereiste mailto: tekst voorvoegen?",titlefield:"Titel",target:"Doel",url:"URL",title:"Link invoegen/bewerken","link_list":"Lijst",rtl:"Van rechts naar links",ltr:"Van links naar rechts",accesskey:"Toegangstoets",tabindex:"Tabvolgorde",rev:"Relatie van doel tot pagina",rel:"Relatie van pagina tot doel",mime:"MIME type",encoding:"Taalcodering",langcode:"Taalcode","target_langcode":"Taal"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/nn_dlg.js b/js/tiny_mce/plugins/advlink/langs/nn_dlg.js new file mode 100755 index 000000000..82ccda6a4 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.advlink_dlg',{target_name:"M\u00e5lnamn",classes:"Klasser",style:"Stil",id:"Id",popup_position:"Posisjon (X/Y)",langdir:"Skriftretning",popup_size:"Storleik",popup_dependent:"Avhengig vindu (berre i Mozilla/Firefox)",popup_resizable:"Gjer vindauget skalerbart",popup_location:"Vis plasseringsline",popup_menubar:"Vis menyline",popup_toolbar:"Vis verktyliner",popup_statusbar:"Vis statusline",popup_scrollbars:"Vis rullefelt",popup_return:"Set inn \\\'return false\\\'",popup_name:"Namn p\u00e5 vindauge",popup_url:"Popup URL",popup:"Javascript-popup",target_blank:"Opne i nytt vindauge",target_top:"Opne i toppvindauge (erstattar alle rammer)",target_parent:"Opne i overordna vindauge/ramme",target_same:"Opne i same vindauge/ramme",anchor_names:"Anker",popup_opts:"Innstillingar",advanced_props:"Generelle eigenskapar",event_props:"Hendingar",popup_props:"Popup-eigenskapar",general_props:"Generelt",advanced_tab:"Avansert",events_tab:"Hendingar",popup_tab:"Popup",general_tab:"Generelt",list:"Lenkjeliste",is_external:"URL-en du skreiv inn ser ut til \u00e5 vere ei eksern lenkje. \u00d8nskjer du \u00e5 leggje til det obligatoriske http://-prefikset?",is_email:"URL-en du skreiv inn ser ut til \u00e5 vere ei e-postadresse. \u00d8nskjer du \u00e5 leggje til det obligatoriske mailto:-prefikset?",titlefield:"Tittel",target:"M\u00e5l",url:"Lenkje-URL",title:"Set inn / rediger lenkje",link_list:"Lenkjeliste",rtl:"H\u00f8gre mot venstre",ltr:"Venstre mot h\u00f8gre",accesskey:"Hurtigtast",tabindex:"Tabulatorindeks",rev:"M\u00e5let sitt forhold til sida",rel:"Sida sitt forhold til m\u00e5let",mime:"M\u00e5let sin MIME-type",encoding:"Teiknkonvertering",langcode:"Spr\u00e5kkode",target_langcode:"M\u00e5lspr\u00e5k"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/no_dlg.js b/js/tiny_mce/plugins/advlink/langs/no_dlg.js new file mode 100755 index 000000000..d4c59261f --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.advlink_dlg',{"target_name":"M\u00e5lnavn",classes:"Klasse",style:"Stil",id:"Id","popup_position":"Posisjon (X/Y)",langdir:"Skriftretning","popup_size":"St\u00f8rrelse","popup_dependent":"Avhengig vindu (kun i Mozilla/Firefox)","popup_resizable":"Gj\u00f8r vinduet skalerbart","popup_location":"Vis plasseringslinje","popup_menubar":"Vis menylinje","popup_toolbar":"Vis verkt\u00f8ylinjer","popup_statusbar":"Vis statusline","popup_scrollbars":"Vis rullefelt","popup_return":"Sett inn \\\'return false\\\'","popup_name":"Navn p\u00e5 vindu","popup_url":"Popup URL",popup:"Javascript popup","target_blank":"\u00c5pne i nytt vindu","target_top":"\u00c5pne i toppvindu (erstatter alle rammer)","target_parent":"\u00c5pne i overordnet vindu/ramme","target_same":"\u00c5pne i samme vindu/ramme","anchor_names":"Anker","popup_opts":"Innstillinger","advanced_props":"Avanserte egenskaper","event_props":"Hendelser","popup_props":"Popup egenskaper","general_props":"Generelle egenskaper","advanced_tab":"Avansert","events_tab":"Hendelser","popup_tab":"Popup","general_tab":"Generelt",list:"Liste over lenker","is_external":"URLen du skrev inn ser ut til \u00e5 v\u00e6re en ekstern lenke. \u00d8nsker du \u00e5 legge til obligatorisk http://-prefiks?","is_email":"URLen du skrev inn ser ut til \u00e5 v\u00e6re Epost adresse. \u00d8nsker du \u00e5 legge til obligatorisk mailto:-prefiks?",titlefield:"Tittel",target:"M\u00e5l",url:"Lenke URL",title:"Sett inn/editer lenke","link_list":"Liste over lenker",rtl:"H\u00f8yre mot venstre",ltr:"Venstre mot h\u00f8yre",accesskey:"Hurtigtast",tabindex:"Tabulator indeks",rev:"Forholdet mellom m\u00e5l og side",rel:"Forholdet mellom side og m\u00e5l",mime:"M\u00e5l MIME type",encoding:"M\u00e5l karakter koding",langcode:"Spr\u00e5kkode","target_langcode":"M\u00e5lspr\u00e5k"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/pl_dlg.js b/js/tiny_mce/plugins/advlink/langs/pl_dlg.js new file mode 100755 index 000000000..037898a04 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.advlink_dlg',{"target_name":"Nazwa celu",classes:"Klasy",style:"Styl",id:"Id","popup_position":"Pozycja (X/Y)",langdir:"Kierunek czytania tekstu","popup_size":"Rozmiar","popup_dependent":"Zale\u017cny (Mozilla/Firefox wy\u0142\u0105cznie)","popup_resizable":"Stw\u00f3rz okno z mo\u017cliwo\u015bci\u0105 zmiany rozmiaru","popup_location":"Poka\u017c pasek adresu","popup_menubar":"Poka\u017c pasek menu","popup_toolbar":"Poka\u017c narz\u0119dzia","popup_statusbar":"Poka\u017c pasek statusu","popup_scrollbars":"Poka\u017c paski przewijania","popup_return":"Wstaw \'return false\'","popup_name":"Nazwa okna","popup_url":"URL okna",popup:"Wyskakuj\u0105ce okno","target_blank":"Otw\u00f3rz w nowym oknie","target_top":"Otw\u00f3rz w g\u00f3rnej ramce (zamie\u0144 wszystkie ramki)","target_parent":"Otw\u00f3rz w nadrz\u0119dnym oknie / ramce","target_same":"Otw\u00f3rz w tym oknie / ramce","anchor_names":"Kotwice","popup_opts":"Opcje","advanced_props":"Zaawansowae w\u0142a\u015bciwo\u015bci","event_props":"Zdarzenia","popup_props":"W\u0142a\u015bciwo\u015bci okna","general_props":"W\u0142a\u015bciwo\u015bci og\u00f3lne","advanced_tab":"Zaawansowane","events_tab":"Zdarzenia","popup_tab":"Popup","general_tab":"Og\u00f3lne",list:"Lista link\u00f3w","is_external":"Podany adres wydaje si\u0119 by\u0107 zewn\u0119trznym linkiem, czy chcesz doda\u0107 wymagany prefiks http://?","is_email":"Podany adres wydaje si\u0119 by\u0107 adresem emailowym, czy chcesz doda\u0107 wymagany prefiks mailto:?",titlefield:"Tytu\u0142",target:"Cel",url:"URL linka",title:"Wstaw/edytuj link","link_list":"Lista odno\u015bnik\u00f3w",rtl:"Kierunek z prawej do lewej",ltr:"Kierunek z lewej do prawej",accesskey:"Klawisz skr\u00f3tu",tabindex:"Numer tab",rev:"Relacje celu do strony",rel:"Relacje strony do celu",mime:"Docelowy typ MIME",encoding:"Kodowanie znak\u00f3w celu",langcode:"Kod j\u0119zyka","target_langcode":"Docelowy kod j\u0119zyka"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ps_dlg.js b/js/tiny_mce/plugins/advlink/langs/ps_dlg.js new file mode 100755 index 000000000..525473137 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/pt_dlg.js b/js/tiny_mce/plugins/advlink/langs/pt_dlg.js new file mode 100755 index 000000000..7a7a4a205 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.advlink_dlg',{target_name:"Nome do alvo",classes:"Classes",style:"Estilo",id:"Id",popup_position:"Posi\u00e7\u00e3o (X/Y)",langdir:"Dire\u00e7\u00e3o do texto",popup_size:"Tamanho",popup_dependent:"Dependente (Mozilla/Firefox apenas)",popup_resizable:"Permitir altera\u00e7\u00e3o do tamanho da janela",popup_location:"Mostrar a barra de endere\u00e7os",popup_menubar:"Mostrar a barra de menu",popup_toolbar:"Mostrar a barra de ferramentas",popup_statusbar:"Mostrar a barra de status",popup_scrollbars:"Mostrar as barras de scroll",popup_return:"Inserir \"return false\"",popup_name:"Nome da janela",popup_url:"URL do popup",popup:"Popup javascript",target_blank:"Abrir numa nova janela",target_top:"Abrir na p\u00e1gina inteira (substitui todos os quadros)",target_parent:"Abrir na janela/quadro pai",target_same:"Abrir nesta janela/quadro",anchor_names:"\u00c2ncoras",popup_opts:"Op\u00e7\u00f5es",advanced_props:"Propriedades avan\u00e7adas",event_props:"Eventos",popup_props:"Propriedades de popup",general_props:"Propriedades gerais",advanced_tab:"Avan\u00e7ado",events_tab:"Eventos",popup_tab:"Popup",general_tab:"Geral",list:"Lista de hyperlinks",is_external:"A URL digitada parece conduzir a um link externo. Deseja acrescentar o prefixo necess\u00e1rio http://?",is_email:"A URL digitada parece ser um endere\u00e7o de e-mail. Deseja acrescentar o prefixo necess\u00e1rio mailto:?",titlefield:"T\u00edtulo",target:"Alvo",url:"URL do hyperlink",title:"Inserir/editar hyperlink",link_list:"Lista de hyperlinks",rtl:"Da direita para a esquerda",ltr:"Da esquerda para a direita",accesskey:"Chave de acesso",tabindex:"Tabindex",rev:"Rela\u00e7\u00e3o alvo/p\u00e1gina",rel:"Rela\u00e7\u00e3o p\u00e1gina/alvo",mime:"Tipo MIME alvo",encoding:"Codifica\u00e7\u00e3o de caracteres",langcode:"C\u00f3digo do idioma",target_langcode:"Idioma alvo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ro_dlg.js b/js/tiny_mce/plugins/advlink/langs/ro_dlg.js new file mode 100755 index 000000000..fa5e4d6e3 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.advlink_dlg',{target_name:"Nume \u0163int\u0103",classes:"Clase",style:"Stil",id:"Id",popup_position:"Pozi\u0163ie (X/Y)",langdir:"Direc\u0163ie limb\u0103",popup_size:"M\u0103rime",popup_dependent:"Dependent (Mozilla/Firefox)?",popup_resizable:"Fereastr\u0103 redimensionabil\u0103?",popup_location:"Arat\u0103 bara de adrese",popup_menubar:"Arat\u0103 meniul",popup_toolbar:"Arat\u0103 toolbar-uri",popup_statusbar:"Arat\u0103 bara de stare",popup_scrollbars:"Arat\u0103 barele de derulare",popup_return:"Insereaz\u0103 \'return false\'",popup_name:"Nume fereastr\u0103",popup_url:"URL Popup",popup:"Javascript Popup",target_blank:"Deschide \u00een fereastr\u0103 nou\u0103",target_top:"Deschide \u00een frame-ul cel mai mare (\u00eenlocuie\u015fte celelalte frame-uri)",target_parent:"Deschide leg\u0103tura \u00een fereastra/cadrul p\u0103rinte",target_same:"Deschide leg\u0103tura \u00een aceea\u015fi fereastr\u0103/acela\u015fi cadru",anchor_names:"Ancore",popup_opts:"Op\u0163iuni",advanced_props:"Propriet\u0103\u0163i avansate",event_props:"Evenimente",popup_props:"Propriet\u0103\u0163i popup",general_props:"Propriet\u0103\u0163i generale",advanced_tab:"Avansat",events_tab:"Evenimente",popup_tab:"Popup",general_tab:"General",list:"List\u0103 de leg\u0103turi",is_external:"URL-ul pe care l-a\u0163i introdus pare a fi o leg\u0103tur\u0103 extern\u0103. Dori\u0163i s\u0103 adaug \u015fi prefixul http:// necesar?",is_email:"URL-ul pe care l-a\u0163i introdus pare a fi o adres\u0103 de e-mail. Dori\u0163i s\u0103 adaug \u015fi prefixul mailto: necesar?",titlefield:"Titlu",target:"\u0162int\u0103",url:"URL leg\u0103tur\u0103",title:"Insereaz\u0103/editeaz\u0103 link",link_list:"List\u0103 leg\u0103turi",rtl:"Dreapta la st\u00e2nga",ltr:"St\u00e2nga la dreapta",accesskey:"Cheie de acces",tabindex:"Tabindex",rev:"Rela\u0163ia \u0163intei cu pagina",rel:"Rela\u0163ia paginii cu \u0163inta",mime:"MIME type \u0163int\u0103",encoding:"Set de caractere \u0163int\u0103",langcode:"Cod limb\u0103",target_langcode:"Limb\u0103"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ru_dlg.js b/js/tiny_mce/plugins/advlink/langs/ru_dlg.js new file mode 100755 index 000000000..4c67e390e --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advlink_dlg',{"target_name":"\u0418\u043c\u044f \u0446\u0435\u043b\u0438",classes:"\u041a\u043b\u0430\u0441\u0441\u044b",style:"\u0421\u0442\u0438\u043b\u044c",id:"\u0418\u043c\u044f","popup_position":"\u041f\u043e\u0437\u0438\u0446\u0438\u044f (X/Y)",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","popup_size":"\u0420\u0430\u0437\u043c\u0435\u0440","popup_dependent":"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Firefox)","popup_resizable":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440","popup_location":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u044c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f","popup_menubar":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043c\u0435\u043d\u044e","popup_toolbar":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432","popup_statusbar":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f","popup_scrollbars":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0441\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438","popup_return":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \'return false\'","popup_name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430","popup_url":"\u0410\u0434\u0440\u0435\u0441",popup:"\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Java","target_blank":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435","target_top":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043a\u0430\u0434\u0440\u0435 (\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u0434\u0440\u044b)","target_parent":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043e\u043a\u043d\u0435/\u043a\u0430\u0434\u0440\u0435","target_same":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u043d\u0435/\u043a\u0430\u0434\u0440\u0435","anchor_names":"\u042f\u043a\u043e\u0440\u044f","popup_opts":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430","advanced_props":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","event_props":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439","popup_props":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f","general_props":"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","advanced_tab":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f","popup_tab":"\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435","general_tab":"\u041e\u0431\u0449\u0435\u0435",list:"\u0421\u043f\u0438\u0441\u043e\u043a","is_external":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 http://?","is_email":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 mailto:?",titlefield:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",target:"\u0426\u0435\u043b\u044c",url:"\u0410\u0434\u0440\u0435\u0441",title:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0441\u044b\u043b\u043a\u0438","link_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",accesskey:"\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430",tabindex:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",rev:"\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0438 \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435",rel:"\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043a \u0446\u0435\u043b\u0438",mime:"MIME \u0442\u0438\u043f \u0446\u0435\u043b\u0438",encoding:"\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u0446\u0435\u043b\u0438",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430","target_langcode":"\u042f\u0437\u044b\u043a \u0446\u0435\u043b\u0438"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/sc_dlg.js b/js/tiny_mce/plugins/advlink/langs/sc_dlg.js new file mode 100755 index 000000000..151cba4b0 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.advlink_dlg',{target_name:"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u578b",style:"\u6837\u5f0f",id:"Id",popup_position:"\u5ea7\u6807(X/Y)",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",popup_size:"\u5c3a\u5bf8",popup_dependent:"\u4ece\u5c5e(\u53ea\u6709Mozilla/Firefox\u6709\u6548)",popup_resizable:"\u53ef\u8c03\u6574\u89c6\u7a97\u5c3a\u5bf8",popup_location:"\u663e\u793a\u7f51\u5740\u5217",popup_menubar:"\u663e\u793a\u529f\u80fd\u8868",popup_toolbar:"\u663e\u793a\u5de5\u5177\u680f",popup_statusbar:"\u663e\u793a\u72b6\u6001\u680f",popup_scrollbars:"\u663e\u793a\u8fb9\u6761",popup_return:"\u63d2\u5165\'return false\'",popup_name:"\u7a97\u53e3\u540d\u79f0",popup_url:"\u5f39\u51fa\u7a97\u53e3\u7f51\u5740",popup:"Javascript\u5f39\u51fa\u7a97\u53e3",target_blank:"\u6253\u5f00\u5728\u65b0\u89c6\u7a97",target_top:"\u6253\u5f00\u5728\u6700\u4e0a\u5c42\u7684\u6846\u67b6(\u66ff\u6362\u6240\u6709\u6846\u67b6)",target_parent:"\u6253\u5f00\u5728\u7236\u89c6\u7a97/\u6846\u67b6",target_same:"\u6253\u5f00\u5728\u65b0\u89c6\u7a97/\u6846\u67b6",anchor_names:"\u951a\u70b9",popup_opts:"\u9009\u9879",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5f39\u51fa\u89c6\u7a97\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5f39\u51fa\u7a97\u53e3",general_tab:"\u4e00\u822c",list:"\u94fe\u7ed3\u6e05\u5355",is_external:"\u60a8\u8f93\u5165\u7684\u7f51\u5740\u5e94\u8be5\u662f\u4e00\u4e2a\u5916\u90e8\u8fde\u7ed3\uff0c\u662f\u5426\u9700\u8981\u5728\u7f51\u5740\u524d\u65b9\u52a0\u5165http://\uff1f ",is_email:"\u60a8\u8f93\u5165\u7684\u7f51\u5740\u5e94\u8be5\u662f\u4e00\u4e2a\u7535\u5b50\u90ae\u5bc4\u4f4d\u5740\uff0c\u662f\u5426\u9700\u8981\u5728\u90ae\u5740\u524d\u65b9\u52a0\u5165mailto:\uff1f ",titlefield:"\u67e5\u627e",target:"\u76ee\u6807",url:"\u94fe\u7ed3\u4f4d\u5740",title:"\u63d2\u5165/\u7f16\u8f91\u8fde\u7ed3",link_list:"\u94fe\u7ed3\u6e05\u5355",rtl:"\u7531\u53f3\u5230\u5de6",ltr:"\u7531\u5de6\u5230\u53f3",accesskey:"\u5feb\u6377\u952e",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6807\u5230\u9875\u7684\u5173\u7cfb",rel:"\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801",target_langcode:"\u76ee\u7684\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/se_dlg.js b/js/tiny_mce/plugins/advlink/langs/se_dlg.js new file mode 100755 index 000000000..093ddba29 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.advlink_dlg',{target_name:"M\u00e5lnamn",classes:"Klasser",style:"Stil",id:"Id",popup_position:"Position (x/y)",langdir:"Skriftriktning",popup_size:"Storlek",popup_dependent:"Beroende av (Mozilla/Firefox enbart)",popup_resizable:"Skalbart f\u00f6nster",popup_location:"Adressraden",popup_menubar:"Menyrad",popup_toolbar:"Verktygsf\u00e4lt",popup_statusbar:"Statusf\u00e4lt",popup_scrollbars:"Rullningslister",popup_return:"Infoga \'return false\'",popup_name:"F\u00f6nsternamn",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"\u00d6ppna i nytt f\u00f6nster",target_top:"\u00d6ppna i toppramen (ers\u00e4tter alla ramar)",target_parent:"\u00d6ppna i \u00f6verliggande f\u00f6nster/ram",target_same:"\u00d6ppna i detta f\u00f6nster/ram",anchor_names:"Bokm\u00e4rken",popup_opts:"Inst\u00e4llningar",advanced_props:"Avancerade inst\u00e4llningar",event_props:"H\u00e4ndelser",popup_props:"Popup-inst\u00e4llningar",general_props:"Generella inst\u00e4llningar",advanced_tab:"Avancerat",events_tab:"H\u00e4ndelser",popup_tab:"Popup",general_tab:"Generellt",list:"L\u00e4nklista",is_external:"L\u00e4nken du angav verkar vara en extern adress. Vill du infoga http:// prefixet p\u00e5 l\u00e4nken?",is_email:"L\u00e4nken du angav verkar vara en e-post adress. Vill du infoga mailto: prefixet p\u00e5 l\u00e4nken?",titlefield:"Titel",target:"M\u00e5l",url:"L\u00e4nkens URL",title:"Infoga/redigera l\u00e4nk",link_list:"L\u00e4nklista",rtl:"H\u00f6ger till v\u00e4nster",ltr:"V\u00e4nster till h\u00f6ger",accesskey:"Snabbtangent",tabindex:"Tabbindex",rev:"Omv\u00e4nd relation (rev)",rel:"Relation (rel attribut)",mime:"MIME type",encoding:"Teckenformattering",langcode:"Spr\u00e5kkod",target_langcode:"M\u00e5lspr\u00e5k"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/si_dlg.js b/js/tiny_mce/plugins/advlink/langs/si_dlg.js new file mode 100755 index 000000000..f24e10b58 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/sk_dlg.js b/js/tiny_mce/plugins/advlink/langs/sk_dlg.js new file mode 100755 index 000000000..eba5b7260 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.advlink_dlg',{target_name:"N\u00e1zov cie\u013ea",classes:"Triedy",style:"\u0160t\u00fdl",id:"ID",popup_position:"Umiestnenie (X/Y)",langdir:"Smer textu",popup_size:"Ve\u013ekos\u0165",popup_dependent:"Z\u00e1vislos\u0165 (iba Mozilla/Firefox)",popup_resizable:"Umo\u017eni\u0165 zmenu ve\u013ekosti",popup_location:"Zobrazi\u0165 li\u0161tu umiestnen\u00ed",popup_menubar:"Zobrazi\u0165 ponuku",popup_toolbar:"Zobrazi\u0165 n\u00e1strojov\u00fa li\u0161tu",popup_statusbar:"Zobrazi\u0165 stavov\u00fd riadok",popup_scrollbars:"Zobrazi\u0165 posuvn\u00edky",popup_return:"Vlo\u017ei\u0165 \'return false\'",popup_name:"N\u00e1zov okna",popup_url:"URL vyskakovacieho okna",popup:"JavaScriptov\u00e9 okno",target_blank:"Otvori\u0165 v novom okne",target_top:"Otvori\u0165 v hlavnom okne/r\u00e1me (nahradi\u0165 v\u0161etky r\u00e1my)",target_parent:"Otvori\u0165 v nadradenom okne/r\u00e1me",target_same:"Otvori\u0165 v rovnakom okne/r\u00e1me",anchor_names:"Z\u00e1lo\u017eka",popup_opts:"Mo\u017enosti",advanced_props:"Roz\u0161\u00edren\u00e9 parametre",event_props:"Udalosti",popup_props:"Vlastnosti vyskakovacieho okna",general_props:"Obecn\u00e9 parametre",advanced_tab:"Roz\u0161\u00edren\u00e9",events_tab:"Udalosti",popup_tab:"Vyskakovacie okno",general_tab:"Obecn\u00e9",list:"Zoznam odkazov",is_external:"Zadan\u00e1 URL vyzer\u00e1 ako extern\u00fd odkaz, chcete doplni\u0165 povinn\u00fd prefix http://?",is_email:"Zadan\u00e1 URL vyzer\u00e1 ako e-mailov\u00e1 adresa, chcete doplni\u0165 povinn\u00fd prefix mailto:?",titlefield:"Titulok",target:"Cie\u013e",url:"URL odkazu",title:"Vlo\u017ei\u0165/upravi\u0165 odkaz",link_list:"Zoznam odkazov",rtl:"Sprava do\u013eava",ltr:"Z\u013eava doprava",accesskey:"Kl\u00e1vesov\u00e1 skratka",tabindex:"Poradie pre tabul\u00e1tor",rev:"Vz\u0165ah cie\u013ea k str\u00e1nke",rel:"Vz\u0165ah str\u00e1nky k cie\u013eu",mime:"MIME typ",encoding:"K\u00f3dovanie",langcode:"K\u00f3d jazyka",target_langcode:"Jazyk cie\u013ea"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/sl_dlg.js b/js/tiny_mce/plugins/advlink/langs/sl_dlg.js new file mode 100755 index 000000000..5d3777621 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.advlink_dlg',{target_name:"Ime cilja",classes:"Razredi",style:"Slog",id:"Id",popup_position:"Polo\u017eaj (X/Y)",langdir:"Smer pisave",popup_size:"Velikost",popup_dependent:"Odvisno (le za Mozillo/Firefox)",popup_resizable:"Omogo\u010di pvoe\u010devanje okna",popup_location:"Prika\u017ei vrstico naslova",popup_menubar:"Prika\u017ei meni",popup_toolbar:"Prika\u017ei orodjarno",popup_statusbar:"Prika\u017ei vrstico stanja",popup_scrollbars:"Prika\u017ei drsnike",popup_return:"Vstavi \\\'return false\\\'",popup_name:"Ime okna",popup_url:"Naslov URL okna",popup:"Dodatno okno z javascriptom",target_blank:"Odpri v novem oknu",target_top:"Odpri v vrhnjem okviru (nadomesti vse okvire)",target_parent:"Odpri v nadrejenem oknu / okviru",target_same:"Odpri v tem oknu / okviru",anchor_names:"Sidra",popup_opts:"Mo\u017enosti",advanced_props:"Napredne lastnosti",event_props:"Dogodki",popup_props:"Lastnosti okna",general_props:"Splo\u0161ne lastnosti",advanced_tab:"Napredno",events_tab:"Dogodki",popup_tab:"Dodatno okno",general_tab:"Splo\u0161no",list:"Seznam povezav",is_external:"Vneseni naslov verjetno predstavlja zunanjo povezavo, \u017eelite da dodam zahtevano predpono",is_email:"Vneseni naslov verjetno prestavlja e-naslov, \u017eelite da dodam zahtevano predpono \\\'mailto:\\\'?",titlefield:"Naslov",target:"Cilj",url:"Naslov URL",title:"Vstavi/uredi povezavo",link_list:"Seznam povezav",rtl:"Od desne proti levi",ltr:"Od leve proti desni",accesskey:"Tipka dostopa",tabindex:"Zap. \u0161t.",rev:"Razmerje cilja do strani",rel:"Razmerje strani do cilja",mime:"Tip MIME cilja",encoding:"Kodiranje znakov cilja",langcode:"Koda jezika",target_langcode:"Jezik cilja"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/sq_dlg.js b/js/tiny_mce/plugins/advlink/langs/sq_dlg.js new file mode 100755 index 000000000..84914b6c4 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.advlink_dlg',{target_name:"Emri",classes:"Klasat",style:"Stili",id:"Id",popup_position:"Pozicioni (X/Y)",langdir:"Drejtimi i gjuh\u00ebs",popup_size:"Madh\u00ebsia",popup_dependent:"I varur (vet\u00ebm Mozilla/Firefox)",popup_resizable:"B\u00ebje dritaren t\u00eb zmadhueshme",popup_location:"Shfaq shiritin e adres\u00ebs",popup_menubar:"Shfaq menun\u00eb",popup_toolbar:"Shfaq butonat",popup_statusbar:"Shfaq shiritin e statusit",popup_scrollbars:"Shfaq ashensor\u00ebt",popup_return:"Fut \'return false\'",popup_name:"Emri i dritares",popup_url:"URL e popup",popup:"Popup me Javascript",target_blank:"Hape n\u00eb dritare t\u00eb re",target_top:"Hape n\u00eb frame-in e m\u00ebsip\u00ebrm",target_parent:"Hape n\u00eb dritaren m\u00ebm\u00eb / frame",target_same:"Hape n\u00eb k\u00ebt\u00eb dritare / frame",anchor_names:"Lidhjet",popup_opts:"Opsionet",advanced_props:"Tipare t\u00eb avancuara",event_props:"Ngjarjet",popup_props:"Tiparet e popup",general_props:"Tipare t\u00eb p\u00ebrgjithshme",advanced_tab:"T\u00eb Avancuara",events_tab:"Ngjarjet",popup_tab:"Popup",general_tab:"T\u00eb P\u00ebrgjithshme",list:"Lista e lidhjeve",is_external:"Adresa q\u00eb keni futur duket si lidhje e jashtme. D\u00ebshironi t\u00eb shtoni prefiksin http://?",is_email:"Adresa q\u00eb keni futur duket si email. D\u00ebshironi t\u00eb shtoni prefiksin mailto:?",titlefield:"Titulli",target:"Sh\u00ebnjestra",url:"URL e lidhjes",title:"Fut/edito lidhje",link_list:"Lista e lidhjeve",rtl:"Djathtas-Majtas",ltr:"Majtas-Djathtas",accesskey:"Butoni i aksesit",tabindex:"Indeksi i Tab",rev:"Marr\u00ebdh\u00ebnia sh\u00ebnjest\u00ebr-faqe",rel:"Marr\u00ebdh\u00ebnia faqe-sh\u00ebnjest\u00ebr",mime:"Tipi MIME i sh\u00ebnjestr\u00ebs",encoding:"Kodimi i karaktereve t\u00eb sh\u00ebnjestr\u00ebs",langcode:"Kodi i gjuh\u00ebs",target_langcode:"Gjuha e sh\u00ebnjestr\u00ebs"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/sr_dlg.js b/js/tiny_mce/plugins/advlink/langs/sr_dlg.js new file mode 100755 index 000000000..3a5c3e974 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.advlink_dlg',{target_name:"Ime mete",classes:"Klasa",style:"Stil",id:"Id",popup_position:"Pozicija (X/Y)",langdir:"Smer jezika",popup_size:"Veli\u010dina",popup_dependent:"Zavistan (samo za Mozilla/Firefox)",popup_resizable:"Prozor promenljive veli\u010dine",popup_location:"Prika\u017ei traku lokacije",popup_menubar:"Prika\u017ei Meni",popup_toolbar:"Prika\u017ei trake sa alatima",popup_statusbar:"Prika\u017ei statusnu traku",popup_scrollbars:"Prika\u017ei kliza\u010de",popup_return:"Ubaci \'return false\'",popup_name:"Ime prozora",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Otvori u novom prozoru",target_top:"Otvori u gornjem ramu (zamenjuje sve ramove)",target_parent:"Otvori u izvornom prozoru / ramu",target_same:"Otovori u novom prozoru / ramu",anchor_names:"Sidra",popup_opts:"Opcije",advanced_props:"Napredna svojstva",event_props:"Doga\u0111aji",popup_props:"Detalji popup prozora",general_props:"Detalji",advanced_tab:"Napredno",events_tab:"Doga\u0111aji",popup_tab:"Popup",general_tab:"Op\u0161te opcije",list:"Lista linkova",is_external:"URL koji ste uneli izgleda kao spolja\u0161nji link, da li \u017eelite da dodate neophodni http:// prefiks?",is_email:"URL koji ste uneli izgleda kao e-mail adresa, da li \u017eelite da dodate neophodni mailto: prefiks?",titlefield:"Naslov",target:"Meta",url:"URL link",title:"Ubaci/izmeni link",link_list:"Lista linkova",rtl:"S desna na levo",ltr:"S leva na desno",accesskey:"Taster za pristup",tabindex:"Tabindex",rev:"Odnos mete prema stranici",rel:"Odnos stranice prema meti",mime:"MIME tip",encoding:"Kodiranje znakova",langcode:"Kod jezika",target_langcode:"Jezik"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/sv_dlg.js b/js/tiny_mce/plugins/advlink/langs/sv_dlg.js new file mode 100755 index 000000000..272f76233 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.advlink_dlg',{"target_name":"M\u00e5lnamn",classes:"Klasser",style:"Stil",id:"Id","popup_position":"Position (x/y)",langdir:"Skriftriktning","popup_size":"Storlek","popup_dependent":"Beroende av (Mozilla/Firefox enbart)","popup_resizable":"Skalbart f\u00f6nster","popup_location":"Adressraden","popup_menubar":"Menyrad","popup_toolbar":"Verktygsf\u00e4lt","popup_statusbar":"Statusf\u00e4lt","popup_scrollbars":"Rullningslister","popup_return":"Infoga \'return false\'","popup_name":"F\u00f6nsternamn","popup_url":"Popup URL",popup:"Javascript popup","target_blank":"\u00d6ppna i nytt f\u00f6nster","target_top":"\u00d6ppna i toppramen (ers\u00e4tter alla ramar)","target_parent":"\u00d6ppna i \u00f6verliggande f\u00f6nster/ram","target_same":"\u00d6ppna i detta f\u00f6nster/ram","anchor_names":"Bokm\u00e4rken","popup_opts":"Inst\u00e4llningar","advanced_props":"Avancerade inst\u00e4llningar","event_props":"H\u00e4ndelser","popup_props":"Popup-inst\u00e4llningar","general_props":"Generella inst\u00e4llningar","advanced_tab":"Avancerat","events_tab":"H\u00e4ndelser","popup_tab":"Popup","general_tab":"Generellt",list:"L\u00e4nklista","is_external":"L\u00e4nken du angav verkar vara en extern adress. Vill du infoga http:// prefixet p\u00e5 l\u00e4nken?","is_email":"L\u00e4nken du angav verkar vara en e-post adress. Vill du infoga mailto: prefixet p\u00e5 l\u00e4nken?",titlefield:"Titel",target:"M\u00e5l",url:"L\u00e4nkens URL",title:"Infoga/redigera l\u00e4nk","link_list":"L\u00e4nklista",rtl:"H\u00f6ger till v\u00e4nster",ltr:"V\u00e4nster till h\u00f6ger",accesskey:"Snabbtangent",tabindex:"Tabbindex",rev:"Omv\u00e4nd relation (rev)",rel:"Relation (rel attribut)",mime:"MIME type",encoding:"Teckenformattering",langcode:"Spr\u00e5kkod","target_langcode":"M\u00e5lspr\u00e5k"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ta_dlg.js b/js/tiny_mce/plugins/advlink/langs/ta_dlg.js new file mode 100755 index 000000000..cf932189a --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/te_dlg.js b/js/tiny_mce/plugins/advlink/langs/te_dlg.js new file mode 100755 index 000000000..92c3d0306 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/th_dlg.js b/js/tiny_mce/plugins/advlink/langs/th_dlg.js new file mode 100755 index 000000000..dd0eb79c8 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.advlink_dlg',{target_name:"\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22",classes:"\u0e04\u0e25\u0e32\u0e2a",style:"\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",id:"Id",popup_position:"\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07 (X/Y)",langdir:"\u0e17\u0e34\u0e28\u0e17\u0e32\u0e07\u0e01\u0e32\u0e23\u0e2d\u0e48\u0e32\u0e19",popup_size:"\u0e02\u0e19\u0e32\u0e14",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e02\u0e19\u0e32\u0e14\u0e02\u0e2d\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49",popup_location:"\u0e41\u0e2a\u0e14\u0e07\u0e0a\u0e48\u0e2d\u0e07\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48",popup_menubar:"\u0e41\u0e2a\u0e14\u0e07\u0e41\u0e16\u0e1a\u0e40\u0e21\u0e19\u0e39",popup_toolbar:"\u0e41\u0e2a\u0e14\u0e07\u0e17\u0e39\u0e25\u0e1a\u0e32\u0e23\u0e4c",popup_statusbar:"\u0e41\u0e2a\u0e14\u0e07\u0e41\u0e16\u0e1a\u0e2a\u0e16\u0e32\u0e19\u0e30",popup_scrollbars:"\u0e41\u0e2a\u0e14\u0e07\u0e2a\u0e01\u0e23\u0e2d\u0e25\u0e1a\u0e32\u0e23\u0e4c",popup_return:"\u0e40\u0e1e\u0e34\u0e48\u0e21 \'return false\'",popup_name:"\u0e0a\u0e37\u0e48\u0e2d\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07",popup_url:"\u0e1b\u0e4a\u0e2d\u0e1b-\u0e2d\u0e31\u0e1e URL",popup:"\u0e08\u0e32\u0e27\u0e32 \u0e1b\u0e4a\u0e2d\u0e1b-\u0e2d\u0e31\u0e1e",target_blank:"\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e43\u0e2b\u0e21\u0e48",target_top:"\u0e40\u0e1b\u0e34\u0e14\u0e17\u0e35\u0e48\u0e40\u0e1f\u0e23\u0e21\u0e1a\u0e19 (\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e17\u0e38\u0e01\u0e40\u0e1f\u0e23\u0e21)",target_parent:"\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e40\u0e14\u0e34\u0e21 / \u0e40\u0e1f\u0e23\u0e21",target_same:"\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07\u0e43\u0e2b\u0e21\u0e48 / \u0e40\u0e1f\u0e23\u0e21",anchor_names:"\u0e0a\u0e37\u0e48\u0e2d\u0e25\u0e34\u0e49\u0e07\u0e04\u0e4c",popup_opts:"\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01",advanced_props:"\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07",event_props:"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",popup_props:"\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e1b\u0e4a\u0e2d\u0e1b-\u0e2d\u0e31\u0e1e",general_props:"\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",advanced_tab:"\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07",events_tab:"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",popup_tab:"\u0e1b\u0e4a\u0e2d\u0e1b-\u0e2d\u0e31\u0e1e",general_tab:"\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",list:"\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e25\u0e34\u0e49\u0e07\u0e04\u0e4c",is_external:"URL \u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e1b\u0e49\u0e2d\u0e19\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e20\u0e32\u0e22\u0e19\u0e2d\u0e01\u0e25\u0e34\u0e07\u0e04\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21 http:// \u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48 ?",is_email:"URL \u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e1b\u0e49\u0e2d\u0e19\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e27\u0e48\u0e32\u0e08\u0e30\u0e21\u0e35\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e2d\u0e22\u0e39\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21 mailto: \u0e19\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48 ",titlefield:"\u0e0a\u0e37\u0e48\u0e2d",target:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22",url:"\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48 \u0e25\u0e34\u0e49\u0e07\u0e04\u0e4c",title:"\u0e40\u0e1e\u0e34\u0e48\u0e21/\u0e41\u0e01\u0e49\u0e44\u0e02 \u0e25\u0e34\u0e49\u0e07\u0e04\u0e4c",link_list:"\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e25\u0e34\u0e49\u0e07\u0e04\u0e4c",rtl:"\u0e02\u0e27\u0e32\u0e44\u0e1b\u0e0b\u0e49\u0e32\u0e22",ltr:"\u0e0b\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e02\u0e27\u0e32",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 MIME type",encoding:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23",langcode:"\u0e42\u0e04\u0e49\u0e14\u0e20\u0e32\u0e29\u0e32",target_langcode:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 \u0e20\u0e32\u0e29\u0e32"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/tn_dlg.js b/js/tiny_mce/plugins/advlink/langs/tn_dlg.js new file mode 100755 index 000000000..ecd0d5ad4 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/tr_dlg.js b/js/tiny_mce/plugins/advlink/langs/tr_dlg.js new file mode 100755 index 000000000..2b39f826d --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.advlink_dlg',{target_name:"Hedef ad\u0131",classes:"S\u0131n\u0131fla",style:"Stil",id:"Id",popup_position:"Konum (X/Y)",langdir:"Dil y\u00f6n\u00fc",popup_size:"Boyut",popup_dependent:"Ba\u011f\u0131ml\u0131 (Sadece Mozilla Firefox)",popup_resizable:"Pencereyi boyutland\u0131r\u0131labilir yap",popup_location:"Aderes \u00e7ubu\u011funu g\u00f6ster",popup_menubar:"Men\u00fc \u00e7ubu\u011funu g\u00f6ster",popup_toolbar:"Ara\u00e7 kutusunu g\u00f6ster",popup_statusbar:"Durum \u00e7ubu\u011funu g\u00f6ster",popup_scrollbars:"Kayd\u0131rma \u00e7ubuklar\u0131n\u0131 g\u00f6ster",popup_return:"Ekle \'return false\'",popup_name:"Pencere ad\u0131",popup_url:"A\u00e7\u0131l\u0131r pencere URL\'si",popup:"Javascript a\u00e7\u0131l\u0131r pencere",target_blank:"Yeni pencerede a\u00e7",target_top:"\u00dcst \u00e7er\u00e7evede a\u00e7 (t\u00fcm \u00e7er\u00e7eveleri de\u011fi\u015ftir) ",target_parent:"Ana pencerede / \u00e7er\u00e7evede a\u00e7",target_same:"Pencerede / \u00e7er\u00e7evede a\u00e7",anchor_names:"Nesne tutucular",popup_opts:"Se\u00e7enekler",advanced_props:"Geli\u015fmi\u015f \u00f6zellikler",event_props:"Olaylar",popup_props:"A\u00e7\u0131l\u0131r pencere \u00f6zellikleri",general_props:"Genel \u00f6zellikler",advanced_tab:"Geli\u015fmi\u015f",events_tab:"Olaylar",popup_tab:"A\u00e7\u0131l\u0131r pencere",general_tab:"Genel",list:"Ba\u011flant\u0131 listesi",is_external:"Girdi\u011fiz URL d\u0131\u015f ba\u011flant\u0131 gibi g\u00f6r\u00fcn\u00fcyor; gerekli olan http:// \u00f6nekinin eklenmesini ister misiniz?",is_email:"Girdi\u011finiz URL e-posta adresi gibi g\u00f6r\u00fcn\u00fcyor; gerekli olan mailto: \u00f6nekinin eklenmesini ister misiniz? prefix?",titlefield:"Ba\u015fl\u0131k",target:"Hedef",url:"Ba\u011flant\u0131 URL\'si",title:"Ba\u011flant\u0131 ekle/d\u00fczenle",link_list:"Ba\u011flant\u0131 listesi",rtl:"Soldan sa\u011fa",ltr:"Sa\u011fdan sola",accesskey:"Eri\u015fim tu\u015fu",tabindex:"Sekme indeksi",rev:"Sayfadan hedefe ili\u015fki",rel:"Hedeften sayfaya ili\u015fki",mime:"Hedef MIME tipi",encoding:"Hedef karakter kodlama",langcode:"Dil kodu",target_langcode:"Hedef dil"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/tt_dlg.js b/js/tiny_mce/plugins/advlink/langs/tt_dlg.js new file mode 100755 index 000000000..1f89be18a --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.advlink_dlg',{target_name:"\u76ee\u6a19\u540d\u7a31",classes:"\u6a23\u5f0f\u985e",style:"\u6a23\u5f0f",id:"Id",popup_position:"\u5ea7\u6a19 (X/Y)",langdir:"\u8a9e\u8a00\u66f8\u5beb\u65b9\u5411",popup_size:"\u5927\u5c0f",popup_dependent:"\u5f9e\u5c6c\u65bc ( \u50c5 Mozilla/Firefox \u6709\u6548 )",popup_resizable:"\u53ef\u8abf\u6574\u7a97\u53e3\u5927\u5c0f",popup_location:"\u986f\u793a\u4f4d\u5740\u6b04",popup_menubar:"\u986f\u793a\u529f\u80fd\u8868\u5217",popup_toolbar:"\u986f\u793a\u5de5\u5177\u5217",popup_statusbar:"\u986f\u793a\u72c0\u614b\u5217",popup_scrollbars:"\u986f\u793a\u6372\u8ef8",popup_return:"\u63d2\u5165 \'return false\'",popup_name:"\u7a97\u53e3\u540d\u7a31",popup_url:"\u5f48\u51fa\u7a97\u53e3\u4f4d\u5740",popup:"Javascript \u5feb\u986f\u7a97\u53e3",target_blank:"\u5728\u65b0\u7a97\u53e3\u6253\u958b",target_top:"\u5728\u9802\u5c64\u7a97\u53e3\u6253\u958b",target_parent:"\u5728\u7236\u7a97\u53e3\u6253\u958b",target_same:"\u5728\u7576\u524d\u7a97\u53e3\u6253\u958b",anchor_names:"\u9328\u9ede",popup_opts:"\u9078\u9805",advanced_props:"\u9032\u968e\u5c6c\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5feb\u986f\u8996\u7a97\u5c6c\u6027",general_props:"\u57fa\u672c\u5c6c\u6027",advanced_tab:"\u9032\u968e",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5feb\u986f\u7a97\u53e3",general_tab:"\u57fa\u672c",list:"\u9023\u7d50\u6e05\u55ae",is_external:"\u60a8\u8f38\u5165\u7684\u7db2\u5740\u61c9\u8a72\u662f\u4e00\u500b\u5916\u90e8\u9023\u7d50\uff0c\u662f\u5426\u9700\u8981\u5728\u7db2\u5740\u524d\u52a0\u4e0a http:// ?",is_email:"\u60a8\u8f38\u5165\u7684\u61c9\u8a72\u662f\u4e00\u500b\u96fb\u5b50\u90f5\u4ef6\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u5728\u7db2\u5740\u524d\u52a0\u4e0a mailto: ? ",titlefield:"\u641c\u5c0b",target:"\u76ee\u6a19",url:"\u9023\u7d50\u5730\u5740",title:"\u63d2\u5165/\u7de8\u8f2f \u9023\u7d50",link_list:"\u9023\u7d50\u6e05\u55ae",rtl:"\u5f9e\u53f3\u5230\u5de6",ltr:"\u5f9e\u5de6\u5230\u53f3",accesskey:"\u5feb\u901f\u9375",tabindex:"Tab\u7d22\u5f15",rev:"rev",rel:"rel",mime:"\u76ee\u6a19 MIME \u985e\u578b",encoding:"\u76ee\u7684\u8a9e\u8a00\u7de8\u78bc",langcode:"\u8a9e\u8a00\u7de8\u78bc",target_langcode:"\u76ee\u7684\u8a9e\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/tw_dlg.js b/js/tiny_mce/plugins/advlink/langs/tw_dlg.js new file mode 100755 index 000000000..9334653cc --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.advlink_dlg',{target_name:"\u76ee\u6a19\u540d\u7a31",classes:"\u985e\u5225",style:"\u6a23\u5f0f",id:"ID",popup_position:"\u4f4d\u7f6e(X/Y)",langdir:"\u8a9e\u8a00\u66f8\u5beb\u65b9\u5411",popup_size:"\u5927\u5c0f",popup_dependent:"\u700f\u89bd\u5668\u9650\u5236(\u50c5\u652f\u63f4 Mozilla/Firefox)",popup_resizable:"\u5f48\u7a97\u53ef\u8abf\u6574\u5927\u5c0f",popup_location:"\u986f\u793a\u5730\u5740\u6b04",popup_menubar:"\u986f\u793a\u529f\u80fd\u9078\u55ae\u5217",popup_toolbar:"\u986f\u793a\u5de5\u5177\u5217",popup_statusbar:"\u986f\u793a\u72c0\u614b\u5217",popup_scrollbars:"\u986f\u793a\u6efe\u52d5\u689d",popup_return:"\u63d2\u5165 \"return false\"",popup_name:"\u8996\u7a97\u540d\u7a31",popup_url:"\u5f48\u51fa\u8996\u7a97URL",popup:"JavaScript \u5f48\u51fa\u8996\u7a97",target_blank:"\u5728\u65b0\u8996\u7a97\u6253\u958b\u8d85\u9023\u7d50",target_top:"\u5728\u9802\u90e8\u8996\u7a97\u6253\u958b\u8d85\u9023\u7d50",target_parent:"\u5728\u7236\u8996\u7a97\u6253\u958b\u8d85\u9023\u7d50",target_same:"\u5728\u76ee\u524d\u8996\u7a97\u6253\u958b\u8d85\u9023\u7d50",anchor_names:"\u66f8\u7c64",popup_opts:"\u9078\u9805",advanced_props:"\u9ad8\u7d1a\u5c6c\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5f48\u51fa\u8996\u7a97\u5c6c\u6027",general_props:"\u4e00\u822c\u5c6c\u6027",advanced_tab:"\u9ad8\u7d1a\u5c6c\u6027",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5f48\u51fa\u8996\u7a97",general_tab:"\u4e00\u822c",list:"\u8d85\u9023\u7d50\u6e05\u55ae",is_external:"\u60a8\u8f38\u5165\u7684 URL \u4f3c\u4e4e\u70ba\u5916\u90e8\u8d85\u9023\u7d50\uff0c\u662f\u5426\u8981\u52a0\u4e0a \"http://\" \uff1f",is_email:"\u60a8\u8f38\u5165\u7684\u4f3c\u4e4e\u662f\u96fb\u5b50\u90f5\u4ef6\u5730\u5740,\u662f\u5426\u9700\u8981\u52a0 mailto:\uff1f",titlefield:"\u6a19\u984c",target:"\u76ee\u6a19",url:"\u8d85\u9023\u7d50URL",title:"\u63d2\u5165/\u7de8\u8f2f\u8d85\u9023\u7d50",link_list:"\u8d85\u9023\u7d50\u6e05\u55ae",rtl:"\u5f9e\u53f3\u5230\u5de6",ltr:"\u5f9e\u5de6\u5230\u53f3",accesskey:"\u5feb\u901f\u9375",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6a19\u5230\u7db2\u9801\u7684\u95dc\u4fc2",rel:"\u7db2\u9801\u5230\u76ee\u6a19\u7684\u95dc\u4fc2",mime:"\u76ee\u6a19MIME\u985e\u578b",encoding:"\u76ee\u6a19\u8a9e\u8a00\u7de8\u78bc",langcode:"\u8a9e\u8a00\u7de8\u78bc",target_langcode:"\u76ee\u6a19\u8a9e\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/uk_dlg.js b/js/tiny_mce/plugins/advlink/langs/uk_dlg.js new file mode 100755 index 000000000..6a00141ea --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.advlink_dlg',{target_name:"\u041d\u0430\u0437\u0432\u0430 \u0446\u0456\u043b\u0456",classes:"\u041a\u043b\u0430\u0441\u0438",style:"\u0421\u0442\u0438\u043b\u044c",id:"\u0406\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u043e\u0440",popup_position:"\u041f\u043e\u0437\u0438\u0446\u0456\u044f (X/Y)",langdir:"\u041d\u0430\u043f\u0440\u044f\u043c \u043c\u043e\u0432\u0438",popup_size:"\u0420\u043e\u0437\u043c\u0456\u0440",popup_dependent:"\u0417\u0430\u043b\u0435\u0436\u043d\u0438\u0439 (\u043b\u0438\u0448\u0435 \u0434\u043b\u044f Mozilla/Firefox)",popup_resizable:"\u0414\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u0438 \u0437\u043c\u0456\u043d\u044e\u0432\u0430\u0442\u0438 \u0440\u043e\u0437\u043c\u0456\u0440",popup_location:"\u041f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u044c location",popup_menubar:"\u041f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043c\u0435\u043d\u044e",popup_toolbar:"\u041f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0456 \u0456\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0456\u0432",popup_statusbar:"\u041f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0430\u0442\u0443\u0441",popup_scrollbars:"\u041f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0441\u043a\u0440\u043e\u043b\u0435\u0440\u0438",popup_return:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \'return false\'",popup_name:"\u041d\u0430\u0437\u0432\u0430 \u0432\u0456\u043a\u043d\u0430",popup_url:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u043d\u0430 \u0432\u0438\u0440\u0438\u043d\u0430\u044e\u0447\u0435 \u0432\u0456\u043a\u043d\u043e",popup:"\u0412\u0438\u0440\u0438\u043d\u0430\u044e\u0447\u0435 \u0432\u0456\u043a\u043d\u043e Javascript",target_blank:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432 \u043d\u043e\u0432\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456",target_top:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0443 \u0432\u0435\u0440\u0445\u043d\u044c\u043e\u043c\u0443 \u0444\u0440\u0435\u0439\u043c\u0456 (\u0437\u0430\u043c\u0456\u043d\u0438\u0442\u0438 \u0432\u0441\u0456 \u0444\u0440\u0435\u0439\u043c\u0438)",target_parent:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432 \u0431\u0430\u0442\u044c\u043a\u0456\u0432\u0441\u044c\u043a\u043e\u043c\u0443 \u0432\u0456\u043a\u043d\u0456 / \u0444\u0440\u0435\u0439\u043c\u0456",target_same:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432 \u0446\u044c\u043e\u043c\u0443 \u0436 \u0432\u0456\u043a\u043d\u0456 / \u0444\u0440\u0435\u0439\u043c\u0456",anchor_names:"\u042f\u043a\u043e\u0440\u0456",popup_opts:"\u0412\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456",advanced_props:"\u0420\u043e\u0437\u0448\u0438\u0440\u0435\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456",event_props:"\u041f\u043e\u0434\u0456\u0457",popup_props:"\u0412\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0432\u0438\u0440\u0438\u043d\u0430\u044e\u0447\u043e\u0433\u043e \u0432\u0456\u043a\u043d\u0430",general_props:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456",advanced_tab:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e",events_tab:"\u041f\u043e\u0434\u0456\u0457",popup_tab:"\u0412\u0438\u0440\u0438\u043d\u0430\u044e\u0447\u0435 \u0432\u0456\u043a\u043d\u043e",general_tab:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435",list:"\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u044c",is_external:"\u0412\u0432\u0435\u0434\u0435\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u0441\u0445\u043e\u0436\u0435 \u043d\u0430 \u0437\u043e\u0432\u043d\u0456\u0448\u043d\u0454 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u0438 \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0438\u0439 \u043f\u0440\u0435\u0444\u0456\u043a\u0441 http://?",is_email:"\u0412\u0432\u0435\u0434\u0435\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u0441\u0445\u043e\u0436\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0443 \u0435\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0457 \u043f\u043e\u0448\u0442\u0438, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u0438 \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0438\u0439 \u043f\u0440\u0435\u0444\u0456\u043a\u0441 mailto:?",titlefield:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",target:"\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432...",url:"\u0410\u0434\u0440\u0435\u0441\u0430",title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043c\u0456\u043d\u0438\u0442\u0438 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f",link_list:"\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u044c",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043b\u0456\u0432\u043e\u0440\u0443\u0447",ltr:"\u0417\u043b\u0456\u0432\u0430 \u043f\u0440\u0430\u0432\u043e\u0440\u0443\u0447",accesskey:"\u041a\u043b\u0430\u0432\u0456\u0448\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0443",tabindex:"\u0422\u0430\u0431\u0456\u043d\u0434\u0435\u043a\u0441",rev:"\u0417\u0432\'\u044f\u0437\u043e\u043a \u043c\u0456\u0436 \u0446\u0456\u043b\u043b\u044e \u0442\u0430 \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u043e\u044e",rel:"\u0417\u0432\'\u044f\u0437\u043e\u043a \u043c\u0456\u0436 \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u043e\u044e \u0442\u0430 \u0446\u0456\u043b\u043b\u044e",mime:"MIME \u0442\u0438\u043f \u0446\u0456\u043b\u0456",encoding:"\u041a\u043e\u0434\u0443\u0432\u0430\u043d\u043d\u044f \u0446\u0456\u043b\u0456",langcode:"\u041a\u043e\u0434 \u043c\u043e\u0432\u0438",target_langcode:"\u041c\u043e\u0432\u0430 \u0446\u0456\u043b\u0456"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/ur_dlg.js b/js/tiny_mce/plugins/advlink/langs/ur_dlg.js new file mode 100755 index 000000000..2c6ded889 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.advlink_dlg',{target_name:"Target name",classes:"Classes",style:"Style",id:"Id",popup_position:"Position (X/Y)",langdir:"Language direction",popup_size:"Size",popup_dependent:"Dependent (Mozilla/Firefox only)",popup_resizable:"Make window resizable",popup_location:"Show location bar",popup_menubar:"Show menu bar",popup_toolbar:"Show toolbars",popup_statusbar:"Show status bar",popup_scrollbars:"Show scrollbars",popup_return:"Insert \'return false\'",popup_name:"Window name",popup_url:"Popup URL",popup:"Javascript popup",target_blank:"Open in new window",target_top:"Open in top frame (replaces all frames)",target_parent:"Open in parent window / frame",target_same:"Open in this window / frame",anchor_names:"Anchors",popup_opts:"Options",advanced_props:"Advanced properties",event_props:"Events",popup_props:"Popup properties",general_props:"General properties",advanced_tab:"Advanced",events_tab:"Events",popup_tab:"Popup",general_tab:"General",list:"Link list",is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/edit link",link_list:"Link list",rtl:"Right to left",ltr:"Left to right",accesskey:"Accesskey",tabindex:"Tabindex",rev:"Relationship target to page",rel:"Relationship page to target",mime:"Target MIME type",encoding:"Target character encoding",langcode:"Language code",target_langcode:"Target language"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/vi_dlg.js b/js/tiny_mce/plugins/advlink/langs/vi_dlg.js new file mode 100755 index 000000000..9d72fbb27 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.advlink_dlg',{target_name:"T\u00ean \u0111\u00edch",classes:"L\u1edbp",style:"Ki\u1ec3u d\u00e1ng",id:"Id",popup_position:"V\u1ecb tr\u00ed (X/Y)",langdir:"H\u01b0\u1edbng ng\u00f4n ng\u1eef",popup_size:"K\u00edch th\u01b0\u1edbc",popup_dependent:"Ph\u1ee5 thu\u1ed9c (ch\u1ec9 Mozilla/Firefox)",popup_resizable:"L\u00e0m cho c\u1eeda s\u1ed5 c\u00f3 th\u1ec3 thay \u0111\u1ed5i k\u00edch c\u1ee1",popup_location:"Hi\u1ec7n th\u1ecb thanh v\u1ecb tr\u00ed",popup_menubar:"Hi\u1ec3n th\u1ecb thanh th\u1ef1c \u0111\u01a1n",popup_toolbar:"Hi\u1ec7n th\u1ecb thanh c\u00f4ng c\u1ee5",popup_statusbar:"Hi\u1ec7n th\u1ecb thanh tr\u1ea1ng th\u00e1i",popup_scrollbars:"Hi\u1ec3n th\u1ecb thanh cu\u1ed9n",popup_return:"Ch\u00e8n \'return false\'",popup_name:"T\u00ean c\u1eeda s\u1ed5",popup_url:"URL b\u1eadt l\u00ean",popup:"Javascript b\u1eadt l\u00ean",target_blank:"M\u1edf trong c\u1eeda s\u1ed5 m\u1edbi",target_top:"M\u1edf trong khung tr\u00ean c\u00f9ng (thay th\u1ebf t\u1ea5t c\u00e1c khung)",target_parent:"M\u1edf trong c\u1eeda s\u1ed5/khung cha",target_same:"M\u1edf trong c\u1eeda s\u1ed5/khung n\u00e0y",anchor_names:"M\u1ecf neo",popup_opts:"T\u00f9y ch\u1ecdn",advanced_props:"Thu\u1ed9c t\u00ednh n\u00e2ng cao",event_props:"S\u1ef1 ki\u1ec7n",popup_props:"Thu\u1ed9c t\u00ednh b\u1eadt l\u00ean",general_props:"Thu\u1ed9c t\u00ednh chung",advanced_tab:"N\u00e2ng cao",events_tab:"S\u1ef1 ki\u1ec7n",popup_tab:"B\u1eadt l\u00ean",general_tab:"Chung",list:"Danh s\u00e1ch li\u00ean k\u1ebft",is_external:"URL b\u1ea1n \u0111\u00e3 nh\u1eadp c\u00f3 v\u1ebb l\u00e0 m\u1ed9t li\u00ean k\u1ebft ngo\u00e0i, b\u1ea1n c\u00f3 mu\u1ed1n th\u00eam ti\u1ec1n t\u1ed1 http://?",is_email:"URL b\u1ea1n \u0111\u00e3 nh\u1eadp c\u00f3 v\u1ebb l\u00e0 m\u1ed9t \u0111\u1ecba ch\u1ec9 \u0111i\u1ec7n th\u01b0, B\u1ea1n c\u00f3 mu\u1ed1n th\u00eam ti\u1ec1n t\u1ed1 mailto?",titlefield:"Ti\u00eau \u0111\u1ec1",target:"\u0110\u00edch",url:"URL Li\u00ean k\u1ebft",title:"Th\u00eam/S\u1eeda Li\u00ean k\u1ebft",link_list:"Danh s\u00e1ch li\u00ean k\u1ebft",rtl:"Ph\u1ea3i qua tr\u00e1i",ltr:"Tr\u00e1i qua ph\u1ea3i",accesskey:"Ph\u00edm truy c\u1eadp",tabindex:"Ch\u1ec9 m\u1ee5c th\u1ebb",rev:"\u0110\u00edch li\u00ean quan t\u1edbi trang",rel:"Trang li\u00ean quan t\u1edbi \u0111\u00edch",mime:"Ki\u1ec3u MIME \u0111\u00edch",encoding:"M\u00e3 h\u00f3a k\u00fd t\u1ef1 \u0111\u00edch",langcode:"M\u00e3 ng\u00f4n ng\u1eef",target_langcode:"Ng\u00f4n ng\u1eef \u0111\u00edch"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js new file mode 100755 index 000000000..1fdcbbefc --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.advlink_dlg',{"target_name":"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",id:"ID","popup_position":"\u4f4d\u7f6e(X/Y)",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411","popup_size":"\u5927\u5c0f","popup_dependent":"\u9650\u5236(\u4ec5\u652f\u6301Mozilla/Firefox)","popup_resizable":"\u7a97\u53e3\u53ef\u8c03\u6574\u5927\u5c0f","popup_location":"\u663e\u793a\u5730\u5740\u680f","popup_menubar":"\u663e\u793a\u83dc\u5355\u680f","popup_toolbar":"\u663e\u793a\u5de5\u5177\u680f","popup_statusbar":"\u663e\u793a\u72b6\u6001\u680f","popup_scrollbars":"\u663e\u793a\u6eda\u52a8\u6761","popup_return":"\u63d2\u5165\'return false\'","popup_name":"\u7a97\u53e3\u540d\u79f0","popup_url":"\u5f39\u51faURL",popup:"Javascript\u5f39\u7a97","target_blank":"\u5728\u65b0\u7a97\u53e3\u6253\u5f00","target_top":"\u5728\u9876\u90e8\u6846\u67b6\u6253\u5f00\uff08\u91cd\u7f6e\u6240\u6709\u6846\u67b6\uff09","target_parent":"\u5728\u7236\u7a97\u53e3/\u6846\u67b6\u6253\u5f00","target_same":"\u5728\u5f53\u524d\u7a97\u53e3/\u6846\u67b6\u6253\u5f00","anchor_names":"\u951a","popup_opts":"\u9009\u9879","advanced_props":"\u9ad8\u7ea7\u5c5e\u6027","event_props":"\u4e8b\u4ef6","popup_props":"\u5f39\u51fa\u5c5e\u6027","general_props":"\u666e\u901a\u5c5e\u6027","advanced_tab":"\u9ad8\u7ea7","events_tab":"\u4e8b\u4ef6","popup_tab":"\u5f39\u51fa","general_tab":"\u666e\u901a",list:"\u94fe\u63a5\u5217\u8868","is_external":"\u60a8\u8f93\u5165\u7684URL\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\uff0c\u662f\u5426\u8981\u52a0\u4e0a\"http://\"\u524d\u7f00\uff1f","is_email":"\u60a8\u8f93\u5165URL\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u52a0\"mailto:\"\u524d\u7f00\uff1f",titlefield:"\u6807\u9898",target:"\u6253\u5f00\u65b9\u5f0f",url:"\u8d85\u94fe\u63a5URL",title:"\u63d2\u5165/\u7f16\u8f91 \u8d85\u94fe\u63a5","link_list":"\u94fe\u63a5\u5217\u8868",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",accesskey:"\u5feb\u6377\u952e",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6807\u5230\u7f51\u9875\u7684\u5173\u7cfb",rel:"\u7f51\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u76ee\u6807\u8bed\u8a00\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801","target_langcode":"\u76ee\u6807\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/zh_dlg.js b/js/tiny_mce/plugins/advlink/langs/zh_dlg.js new file mode 100755 index 000000000..6f9be24b7 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.advlink_dlg',{target_name:"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u522b",style:"\u6837\u5f0f",id:"ID",popup_position:"\u4f4d\u7f6e(X/Y)",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",popup_size:"\u5927\u5c0f",popup_dependent:"\u6d4f\u89c8\u5668\u9650\u5236(\u4ec5\u652f\u63f4 Mozilla/Firefox)",popup_resizable:"\u5f39\u7a97\u53ef\u8c03\u6574\u5927\u5c0f",popup_location:"\u663e\u793a\u5730\u5740\u680f",popup_menubar:"\u663e\u793a\u83dc\u5355\u5217",popup_toolbar:"\u663e\u793a\u5de5\u5177\u5217",popup_statusbar:"\u663e\u793a\u72b6\u6001\u5217",popup_scrollbars:"\u663e\u793a\u6eda\u52a8\u6761",popup_return:"\u63d2\u5165 \"return false\"",popup_name:"\u89c6\u7a97\u540d\u79f0",popup_url:"\u5f39\u51fa\u89c6\u7a97URL",popup:"JavaScript \u5f39\u51fa\u89c6\u7a97",target_blank:"\u5728\u65b0\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",target_top:"\u5728\u9876\u90e8\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",target_parent:"\u5728\u7236\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",target_same:"\u5728\u76ee\u524d\u89c6\u7a97\u6253\u5f00\u8d85\u8fde\u7ed3",anchor_names:"\u4e66\u7b7e",popup_opts:"\u9009\u9879",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5f39\u51fa\u89c6\u7a97\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7\u5c5e\u6027",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5f39\u51fa\u89c6\u7a97",general_tab:"\u4e00\u822c",list:"\u8d85\u8fde\u7ed3\u6e05\u5355",is_external:"\u60a8\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u4e3a\u5916\u90e8\u8d85\u8fde\u7ed3\uff0c\u662f\u5426\u8981\u52a0\u4e0a \"http://\" \uff1f",is_email:"\u60a8\u8f93\u5165\u7684\u4f3c\u4e4e\u662f\u7535\u5b50\u90ae\u4ef6\u5730\u5740,\u662f\u5426\u9700\u8981\u52a0 mailto:\uff1f",titlefield:"\u6807\u9898",target:"\u76ee\u6807",url:"\u8d85\u8fde\u7ed3URL",title:"\u63d2\u5165/\u7f16\u8f91\u8d85\u8fde\u7ed3",link_list:"\u8d85\u8fde\u7ed3\u6e05\u5355",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",accesskey:"\u5feb\u901f\u952e",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6807\u5230\u7f51\u9875\u7684\u5173\u7cfb",rel:"\u7f51\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u76ee\u6807\u8bed\u8a00\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801",target_langcode:"\u76ee\u6807\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/langs/zu_dlg.js b/js/tiny_mce/plugins/advlink/langs/zu_dlg.js new file mode 100755 index 000000000..0587a3918 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.advlink_dlg',{target_name:"\u76ee\u6807\u540d\u79f0",classes:"\u7c7b\u578b",style:"\u6837\u5f0f",id:"Id",popup_position:"\u5ea7\u6807(X/Y)",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",popup_size:"\u5c3a\u5bf8",popup_dependent:"\u4ece\u5c5e(\u53ea\u6709Mozilla/Firefox\u6709\u6548)",popup_resizable:"\u53ef\u8c03\u6574\u89c6\u7a97\u5c3a\u5bf8",popup_location:"\u663e\u793a\u7f51\u5740\u5217",popup_menubar:"\u663e\u793a\u529f\u80fd\u8868",popup_toolbar:"\u663e\u793a\u5de5\u5177\u5217",popup_statusbar:"\u663e\u793a\u72b6\u6001\u680f",popup_scrollbars:"\u663e\u793a\u8fb9\u6761",popup_return:"\u63d2\u5165\'return false\'",popup_name:"\u7a97\u53e3\u540d\u79f0",popup_url:"\u5feb\u663e\u89c6\u7a97\u7f51\u5740",popup:"Javascript\u5feb\u663e\u89c6\u7a97",target_blank:"\u6253\u5f00\u5728\u65b0\u89c6\u7a97",target_top:"\u6253\u5f00\u5728\u6700\u4e0a\u5c42\u7684\u6846\u67b6(\u66ff\u6362\u6240\u6709\u6846\u67b6)",target_parent:"\u6253\u5f00\u5728\u7236\u89c6\u7a97/\u6846\u67b6",target_same:"\u6253\u5f00\u5728\u65b0\u89c6\u7a97/\u6846\u67b6",anchor_names:"\u951a\u70b9",popup_opts:"\u9009\u9879",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",event_props:"\u4e8b\u4ef6",popup_props:"\u5feb\u663e\u89c6\u7a97\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",events_tab:"\u4e8b\u4ef6",popup_tab:"\u5feb\u663e\u89c6\u7a97",general_tab:"\u4e00\u822c",list:"\u8fde\u7ed3\u6e05\u5355",is_external:"\u60a8\u8f93\u5165\u7684\u7f51\u5740\u5e94\u8be5\u662f\u4e00\u4e2a\u5916\u90e8\u8fde\u7ed3\uff0c\u662f\u5426\u9700\u8981\u5728\u7f51\u5740\u524d\u65b9\u52a0\u5165http://\uff1f",is_email:"\u60a8\u8f93\u5165\u7684\u7f51\u5740\u5e94\u8be5\u662f\u4e00\u4e2a\u7535\u5b50\u90ae\u5bc4\u5730\u5740\uff0c\u662f\u5426\u9700\u8981\u5728\u90ae\u5740\u524d\u65b9\u52a0\u5165mailto:\uff1f",titlefield:"\u67e5\u627e",target:"\u76ee\u6807",url:"\u8fde\u7ed3\u4f4d\u5740",title:"\u63d2\u5165/\u7f16\u8f91\u8fde\u7ed3",link_list:"\u8fde\u7ed3\u6e05\u5355",rtl:"\u7531\u53f3\u5230\u5de6",ltr:"\u7531\u5de6\u5230\u53f3",accesskey:"\u5feb\u901f\u952e",tabindex:"Tab\u7d22\u5f15",rev:"\u76ee\u6807\u5230\u9875\u7684\u5173\u7cfb",rel:"\u9875\u5230\u76ee\u6807\u7684\u5173\u7cfb",mime:"\u76ee\u6807MIME\u7c7b\u578b",encoding:"\u7f16\u7801",langcode:"\u8bed\u8a00\u7f16\u7801",target_langcode:"\u76ee\u7684\u8bed\u8a00"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/advlink/link.htm b/js/tiny_mce/plugins/advlink/link.htm new file mode 100644 index 000000000..6c2d9a5d0 --- /dev/null +++ b/js/tiny_mce/plugins/advlink/link.htm @@ -0,0 +1,338 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advlink_dlg.title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/validate.js"></script> + <script type="text/javascript" src="js/advlink.js"></script> + <link href="css/advlink.css" rel="stylesheet" type="text/css" /> +</head> +<body id="advlink" style="display: none" role="application" onload="javascript:mcTabs.displayTab('general_tab','general_panel', true);" aria-labelledby="app_label"> + <span class="mceVoiceLabel" id="app_label" style="display:none;">{#advlink_dlg.title}</span> + <form onsubmit="insertAction();return false;" action="#"> + <div class="tabs" role="presentation"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel" ><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advlink_dlg.general_tab}</a></span></li> + <li id="popup_tab" aria-controls="popup_panel" ><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{#advlink_dlg.popup_tab}</a></span></li> + <li id="events_tab" aria-controls="events_panel"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#advlink_dlg.events_tab}</a></span></li> + <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advlink_dlg.advanced_tab}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper" role="presentation"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#advlink_dlg.general_props}</legend> + + <table border="0" cellpadding="4" cellspacing="0" role="presentation"> + <tr> + <td class="nowrap"><label id="hreflabel" for="href">{#advlink_dlg.url}</label></td> + <td><table border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="href" name="href" type="text" class="mceFocus" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" aria-required="true" /></td> + <td id="hrefbrowsercontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + <tr id="linklisthrefrow"> + <td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td> + <td colspan="2" id="linklisthrefcontainer"><select id="linklisthref"><option value=""></option></select></td> + </tr> + <tr> + <td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td> + <td colspan="2" id="anchorlistcontainer"><select id="anchorlist"><option value=""></option></select></td> + </tr> + <tr> + <td><label id="targetlistlabel" for="targetlist">{#advlink_dlg.target}</label></td> + <td id="targetlistcontainer"><select id="targetlist"><option value=""></option></select></td> + </tr> + <tr> + <td class="nowrap"><label id="titlelabel" for="title">{#advlink_dlg.titlefield}</label></td> + <td><input id="title" name="title" type="text" value="" /></td> + </tr> + <tr> + <td><label id="classlabel" for="classlist">{#class_name}</label></td> + <td> + <select id="classlist" name="classlist" onchange="changeClass();"> + <option value="" selected="selected">{#not_set}</option> + </select> + </td> + </tr> + </table> + </fieldset> + </div> + + <div id="popup_panel" class="panel"> + <fieldset> + <legend>{#advlink_dlg.popup_props}</legend> + + <input type="checkbox" id="ispopup" name="ispopup" class="radio" onclick="setPopupControlsDisabled(!this.checked);buildOnClick();" /> + <label id="ispopuplabel" for="ispopup">{#advlink_dlg.popup}</label> + + <table border="0" cellpadding="0" cellspacing="4" role="presentation" > + <tr> + <td class="nowrap"><label for="popupurl">{#advlink_dlg.popup_url}</label>&nbsp;</td> + <td> + <table border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" name="popupurl" id="popupurl" value="" onchange="buildOnClick();" /></td> + <td id="popupurlbrowsercontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + <tr> + <td class="nowrap"><label for="popupname">{#advlink_dlg.popup_name}</label>&nbsp;</td> + <td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td> + </tr> + <tr role="group" aria-labelledby="popup_size_label"> + <td class="nowrap"><label id="popup_size_label">{#advlink_dlg.popup_size}</label>&nbsp;</td> + <td class="nowrap"> + <span style="display:none" id="width_voiceLabel">{#advlink_dlg.width}</span> + <input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" aria-labelledby="width_voiceLabel" /> x + <span style="display:none" id="height_voiceLabel">{#advlink_dlg.height}</span> + <input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" aria-labelledby="height_voiceLabel" /> px + </td> + </tr> + <tr role="group" aria-labelledby="popup_position_label center_hint"> + <td class="nowrap" id="labelleft"><label id="popup_position_label">{#advlink_dlg.popup_position}</label>&nbsp;</td> + <td class="nowrap"> + <span style="display:none" id="x_voiceLabel">X</span> + <input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" aria-labelledby="x_voiceLabel" /> / + <span style="display:none" id="y_voiceLabel">Y</span> + <input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" aria-labelledby="y_voiceLabel" /> <span id="center_hint">(c /c = center)</span> + </td> + </tr> + </table> + + <fieldset> + <legend>{#advlink_dlg.popup_opts}</legend> + + <table border="0" cellpadding="0" cellspacing="4" role="presentation" > + <tr> + <td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popuplocationlabel" for="popuplocation">{#advlink_dlg.popup_location}</label></td> + <td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{#advlink_dlg.popup_scrollbars}</label></td> + </tr> + <tr> + <td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{#advlink_dlg.popup_menubar}</label></td> + <td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popupresizablelabel" for="popupresizable">{#advlink_dlg.popup_resizable}</label></td> + </tr> + <tr> + <td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{#advlink_dlg.popup_toolbar}</label></td> + <td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popupdependentlabel" for="popupdependent">{#advlink_dlg.popup_dependent}</label></td> + </tr> + <tr> + <td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td> + <td class="nowrap"><label id="popupstatuslabel" for="popupstatus">{#advlink_dlg.popup_statusbar}</label></td> + <td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" checked="checked" /></td> + <td class="nowrap"><label id="popupreturnlabel" for="popupreturn">{#advlink_dlg.popup_return}</label></td> + </tr> + </table> + </fieldset> + </fieldset> + </div> + + <div id="advanced_panel" class="panel"> + <fieldset> + <legend>{#advlink_dlg.advanced_props}</legend> + + <table border="0" cellpadding="0" cellspacing="4" role="presentation" > + <tr> + <td class="column1"><label id="idlabel" for="id">{#advlink_dlg.id}</label></td> + <td><input id="id" name="id" type="text" value="" /></td> + </tr> + + <tr> + <td><label id="stylelabel" for="style">{#advlink_dlg.style}</label></td> + <td><input type="text" id="style" name="style" value="" /></td> + </tr> + + <tr> + <td><label id="classeslabel" for="classes">{#advlink_dlg.classes}</label></td> + <td><input type="text" id="classes" name="classes" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> + </tr> + + <tr> + <td><label id="targetlabel" for="target">{#advlink_dlg.target_name}</label></td> + <td><input type="text" id="target" name="target" value="" onchange="selectByValue(this.form,'targetlist',this.value,true);" /></td> + </tr> + + <tr> + <td class="column1"><label id="dirlabel" for="dir">{#advlink_dlg.langdir}</label></td> + <td> + <select id="dir" name="dir"> + <option value="">{#not_set}</option> + <option value="ltr">{#advlink_dlg.ltr}</option> + <option value="rtl">{#advlink_dlg.rtl}</option> + </select> + </td> + </tr> + + <tr> + <td><label id="hreflanglabel" for="hreflang">{#advlink_dlg.target_langcode}</label></td> + <td><input type="text" id="hreflang" name="hreflang" value="" /></td> + </tr> + + <tr> + <td class="column1"><label id="langlabel" for="lang">{#advlink_dlg.langcode}</label></td> + <td> + <input id="lang" name="lang" type="text" value="" /> + </td> + </tr> + + <tr> + <td><label id="charsetlabel" for="charset">{#advlink_dlg.encoding}</label></td> + <td><input type="text" id="charset" name="charset" value="" /></td> + </tr> + + <tr> + <td><label id="typelabel" for="type">{#advlink_dlg.mime}</label></td> + <td><input type="text" id="type" name="type" value="" /></td> + </tr> + + <tr> + <td><label id="rellabel" for="rel">{#advlink_dlg.rel}</label></td> + <td><select id="rel" name="rel"> + <option value="">{#not_set}</option> + <option value="lightbox">Lightbox</option> + <option value="alternate">Alternate</option> + <option value="designates">Designates</option> + <option value="stylesheet">Stylesheet</option> + <option value="start">Start</option> + <option value="next">Next</option> + <option value="prev">Prev</option> + <option value="contents">Contents</option> + <option value="index">Index</option> + <option value="glossary">Glossary</option> + <option value="copyright">Copyright</option> + <option value="chapter">Chapter</option> + <option value="subsection">Subsection</option> + <option value="appendix">Appendix</option> + <option value="help">Help</option> + <option value="bookmark">Bookmark</option> + <option value="nofollow">No Follow</option> + <option value="tag">Tag</option> + </select> + </td> + </tr> + + <tr> + <td><label id="revlabel" for="rev">{#advlink_dlg.rev}</label></td> + <td><select id="rev" name="rev"> + <option value="">{#not_set}</option> + <option value="alternate">Alternate</option> + <option value="designates">Designates</option> + <option value="stylesheet">Stylesheet</option> + <option value="start">Start</option> + <option value="next">Next</option> + <option value="prev">Prev</option> + <option value="contents">Contents</option> + <option value="index">Index</option> + <option value="glossary">Glossary</option> + <option value="copyright">Copyright</option> + <option value="chapter">Chapter</option> + <option value="subsection">Subsection</option> + <option value="appendix">Appendix</option> + <option value="help">Help</option> + <option value="bookmark">Bookmark</option> + </select> + </td> + </tr> + + <tr> + <td><label id="tabindexlabel" for="tabindex">{#advlink_dlg.tabindex}</label></td> + <td><input type="text" id="tabindex" name="tabindex" value="" /></td> + </tr> + + <tr> + <td><label id="accesskeylabel" for="accesskey">{#advlink_dlg.accesskey}</label></td> + <td><input type="text" id="accesskey" name="accesskey" value="" /></td> + </tr> + </table> + </fieldset> + </div> + + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#advlink_dlg.event_props}</legend> + + <table border="0" cellpadding="0" cellspacing="4" role="presentation" > + <tr> + <td class="column1"><label for="onfocus">onfocus</label></td> + <td><input id="onfocus" name="onfocus" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onblur">onblur</label></td> + <td><input id="onblur" name="onblur" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onclick">onclick</label></td> + <td><input id="onclick" name="onclick" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="ondblclick">ondblclick</label></td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onmousedown">onmousedown</label></td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onmouseup">onmouseup</label></td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onmouseover">onmouseover</label></td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onmousemove">onmousemove</label></td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onmouseout">onmouseout</label></td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onkeypress">onkeypress</label></td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onkeydown">onkeydown</label></td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> + </tr> + + <tr> + <td class="column1"><label for="onkeyup">onkeyup</label></td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/contextmenu/editor_plugin.js b/js/tiny_mce/plugins/contextmenu/editor_plugin.js new file mode 100644 index 000000000..4ee89b189 --- /dev/null +++ b/js/tiny_mce/plugins/contextmenu/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,i,f,d;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if(k.ctrlKey&&!d){return}if(i){j.selection.setRng(i)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageX);a.add(j.getDoc(),"click",function(l){g(j,l)});a.cancel(k)});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=null;if(k&&k.button==2){i=j.selection.getRng();return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage&"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js new file mode 100644 index 000000000..9c4def83e --- /dev/null +++ b/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js @@ -0,0 +1,156 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM; + + /** + * This plugin a context menu to TinyMCE editor instances. + * + * @class tinymce.plugins.ContextMenu + */ + tinymce.create('tinymce.plugins.ContextMenu', { + /** + * Initializes the plugin, this will be executed after the plugin has been created. + * This call is done before the editor instance has finished it's initialization so use the onInit event + * of the editor instance to intercept that event. + * + * @method init + * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. + * @param {string} url Absolute URL to where the plugin is located. + */ + init : function(ed) { + var t = this, lastRng, showMenu, contextmenuNeverUseNative; + + t.editor = ed; + + contextmenuNeverUseNative = ed.settings.contextmenu_never_use_native; + + /** + * This event gets fired when the context menu is shown. + * + * @event onContextMenu + * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event. + * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed. + */ + t.onContextMenu = new tinymce.util.Dispatcher(this); + + showMenu = ed.onContextMenu.add(function(ed, e) { + if (e.ctrlKey && !contextmenuNeverUseNative) return; + + // Restore the last selection since it was removed + if (lastRng) + ed.selection.setRng(lastRng); + + t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageX); + Event.add(ed.getDoc(), 'click', function(e) { + hide(ed, e); + }); + Event.cancel(e); + }); + + ed.onRemove.add(function() { + if (t._menu) + t._menu.removeAll(); + }); + + function hide(ed, e) { + lastRng = null; + + // Since the contextmenu event moves + // the selection we need to store it away + if (e && e.button == 2) { + lastRng = ed.selection.getRng(); + return; + } + + if (t._menu) { + t._menu.removeAll(); + t._menu.destroy(); + Event.remove(ed.getDoc(), 'click', hide); + } + }; + + ed.onMouseDown.add(hide); + ed.onKeyDown.add(hide); + ed.onKeyDown.add(function(ed, e) { + if (e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode === 121) { + Event.cancel(e); + showMenu(ed, e); + } + }); + }, + + /** + * Returns information about the plugin as a name/value array. + * The current keys are longname, author, authorurl, infourl and version. + * + * @method getInfo + * @return {Object} Name/value array containing information about the plugin. + */ + getInfo : function() { + return { + longname : 'Contextmenu', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/contextmenu', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + _getMenu : function(ed) { + var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2; + + if (m) { + m.removeAll(); + m.destroy(); + } + + p1 = DOM.getPos(ed.getContentAreaContainer()); + p2 = DOM.getPos(ed.getContainer()); + + m = ed.controlManager.createDropMenu('contextmenu', { + offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0), + offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0), + constrain : 1, + keyboard_focus: true + }); + + t._menu = m; + + m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col); + m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col); + m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'}); + + if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) { + m.addSeparator(); + m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); + m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); + } + + m.addSeparator(); + m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); + + m.addSeparator(); + am = m.addMenu({title : 'contextmenu.align'}); + am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'}); + am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'}); + am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'}); + am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'}); + + t.onContextMenu.dispatch(t, m, el, col); + + return m; + } + }); + + // Register plugin + tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu); +})(); diff --git a/js/tiny_mce/plugins/fullscreen/editor_plugin.js b/js/tiny_mce/plugins/fullscreen/editor_plugin.js new file mode 100644 index 000000000..1f51fac24 --- /dev/null +++ b/js/tiny_mce/plugins/fullscreen/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent({format:"raw"}),{format:"raw"});tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent({format:"raw"}),{format:"raw"});d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().firstChild);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js new file mode 100644 index 000000000..cb966a28c --- /dev/null +++ b/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js @@ -0,0 +1,159 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var DOM = tinymce.DOM; + + tinymce.create('tinymce.plugins.FullScreenPlugin', { + init : function(ed, url) { + var t = this, s = {}, vp, posCss; + + t.editor = ed; + + // Register commands + ed.addCommand('mceFullScreen', function() { + var win, de = DOM.doc.documentElement; + + if (ed.getParam('fullscreen_is_enabled')) { + if (ed.getParam('fullscreen_new_window')) + closeFullscreen(); // Call to close in new window + else { + DOM.win.setTimeout(function() { + tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc); + tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format : 'raw'}), {format : 'raw'}); + tinyMCE.remove(ed); + DOM.remove('mce_fullscreen_container'); + de.style.overflow = ed.getParam('fullscreen_html_overflow'); + DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow')); + DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly')); + tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings + }, 10); + } + + return; + } + + if (ed.getParam('fullscreen_new_window')) { + win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); + try { + win.resizeTo(screen.availWidth, screen.availHeight); + } catch (e) { + // Ignore + } + } else { + tinyMCE.oldSettings = tinyMCE.settings; // Store old settings + s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto'; + s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1); + vp = DOM.getViewPort(); + s.fullscreen_scrollx = vp.x; + s.fullscreen_scrolly = vp.y; + + // Fixes an Opera bug where the scrollbars doesn't reappear + if (tinymce.isOpera && s.fullscreen_overflow == 'visible') + s.fullscreen_overflow = 'auto'; + + // Fixes an IE bug where horizontal scrollbars would appear + if (tinymce.isIE && s.fullscreen_overflow == 'scroll') + s.fullscreen_overflow = 'auto'; + + // Fixes an IE bug where the scrollbars doesn't reappear + if (tinymce.isIE && (s.fullscreen_html_overflow == 'visible' || s.fullscreen_html_overflow == 'scroll')) + s.fullscreen_html_overflow = 'auto'; + + if (s.fullscreen_overflow == '0px') + s.fullscreen_overflow = ''; + + DOM.setStyle(DOM.doc.body, 'overflow', 'hidden'); + de.style.overflow = 'hidden'; //Fix for IE6/7 + vp = DOM.getViewPort(); + DOM.win.scrollTo(0, 0); + + if (tinymce.isIE) + vp.h -= 1; + + // Use fixed position if it exists + if (tinymce.isIE6) + posCss = 'absolute;top:' + vp.y; + else + posCss = 'fixed;top:0'; + + n = DOM.add(DOM.doc.body, 'div', { + id : 'mce_fullscreen_container', + style : 'position:' + posCss + ';left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'}); + DOM.add(n, 'div', {id : 'mce_fullscreen'}); + + tinymce.each(ed.settings, function(v, n) { + s[n] = v; + }); + + s.id = 'mce_fullscreen'; + s.width = n.clientWidth; + s.height = n.clientHeight - 15; + s.fullscreen_is_enabled = true; + s.fullscreen_editor_id = ed.id; + s.theme_advanced_resizing = false; + s.save_onsavecallback = function() { + ed.setContent(tinyMCE.get(s.id).getContent({format : 'raw'}), {format : 'raw'}); + ed.execCommand('mceSave'); + }; + + tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) { + s[k] = v; + }); + + if (s.theme_advanced_toolbar_location === 'external') + s.theme_advanced_toolbar_location = 'top'; + + t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s); + t.fullscreenEditor.onInit.add(function() { + t.fullscreenEditor.setContent(ed.getContent()); + t.fullscreenEditor.focus(); + }); + + t.fullscreenEditor.render(); + + t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container'); + t.fullscreenElement.update(); + //document.body.overflow = 'hidden'; + + t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() { + var vp = tinymce.DOM.getViewPort(), fed = t.fullscreenEditor, outerSize, innerSize; + + // Get outer/inner size to get a delta size that can be used to calc the new iframe size + outerSize = fed.dom.getSize(fed.getContainer().firstChild); + innerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('iframe')[0]); + + fed.theme.resizeTo(vp.w - outerSize.w + innerSize.w, vp.h - outerSize.h + innerSize.h); + }); + } + }); + + // Register buttons + ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'}); + + ed.onNodeChange.add(function(ed, cm) { + cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled')); + }); + }, + + getInfo : function() { + return { + longname : 'Fullscreen', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/fullscreen', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/fullscreen/fullscreen.htm b/js/tiny_mce/plugins/fullscreen/fullscreen.htm new file mode 100644 index 000000000..4c4f27e48 --- /dev/null +++ b/js/tiny_mce/plugins/fullscreen/fullscreen.htm @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title></title> + <script type="text/javascript" src="../../tiny_mce.js"></script> + <script type="text/javascript"> + function patchCallback(settings, key) { + if (settings[key]) + settings[key] = "window.opener." + settings[key]; + } + + var settings = {}, paSe = window.opener.tinyMCE.activeEditor.settings, oeID = window.opener.tinyMCE.activeEditor.id; + + // Clone array + for (var n in paSe) + settings[n] = paSe[n]; + + // Override options for fullscreen + for (var n in paSe.fullscreen_settings) + settings[n] = paSe.fullscreen_settings[n]; + + // Patch callbacks, make them point to window.opener + patchCallback(settings, 'urlconverter_callback'); + patchCallback(settings, 'insertlink_callback'); + patchCallback(settings, 'insertimage_callback'); + patchCallback(settings, 'setupcontent_callback'); + patchCallback(settings, 'save_callback'); + patchCallback(settings, 'onchange_callback'); + patchCallback(settings, 'init_instance_callback'); + patchCallback(settings, 'file_browser_callback'); + patchCallback(settings, 'cleanup_callback'); + patchCallback(settings, 'execcommand_callback'); + patchCallback(settings, 'oninit'); + + // Set options + delete settings.id; + settings['mode'] = 'exact'; + settings['elements'] = 'fullscreenarea'; + settings['add_unload_trigger'] = false; + settings['ask'] = false; + settings['document_base_url'] = window.opener.tinyMCE.activeEditor.documentBaseURI.getURI(); + settings['fullscreen_is_enabled'] = true; + settings['fullscreen_editor_id'] = oeID; + settings['theme_advanced_resizing'] = false; + settings['strict_loading_mode'] = true; + + settings.save_onsavecallback = function() { + window.opener.tinyMCE.get(oeID).setContent(tinyMCE.get('fullscreenarea').getContent({format : 'raw'}), {format : 'raw'}); + window.opener.tinyMCE.get(oeID).execCommand('mceSave'); + window.close(); + }; + + function unloadHandler(e) { + moveContent(); + } + + function moveContent() { + window.opener.tinyMCE.get(oeID).setContent(tinyMCE.activeEditor.getContent()); + } + + function closeFullscreen() { + moveContent(); + window.close(); + } + + function doParentSubmit() { + moveContent(); + + if (window.opener.tinyMCE.selectedInstance.formElement.form) + window.opener.tinyMCE.selectedInstance.formElement.form.submit(); + + window.close(); + + return false; + } + + function render() { + var e = document.getElementById('fullscreenarea'), vp, ed, ow, oh, dom = tinymce.DOM; + + e.value = window.opener.tinyMCE.get(oeID).getContent(); + + vp = dom.getViewPort(); + settings.width = vp.w; + settings.height = vp.h - 15; + + tinymce.dom.Event.add(window, 'resize', function() { + var vp = dom.getViewPort(); + + tinyMCE.activeEditor.theme.resizeTo(vp.w, vp.h); + }); + + tinyMCE.init(settings); + } + + // Add onunload + tinymce.dom.Event.add(window, "beforeunload", unloadHandler); + </script> +</head> +<body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no"> +<form onsubmit="doParentSubmit();"> +<textarea id="fullscreenarea" style="width:100%; height:100%"></textarea> +</form> + +<script type="text/javascript"> + render(); +</script> + +</body> +</html> diff --git a/js/tiny_mce/plugins/inlinepopups/editor_plugin.js b/js/tiny_mce/plugins/inlinepopups/editor_plugin.js new file mode 100644 index 000000000..88529868d --- /dev/null +++ b/js/tiny_mce/plugins/inlinepopups/editor_plugin.js @@ -0,0 +1 @@ +(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(s,j){var z=this,i,k="",r=z.editor,g=0,v=0,h,m,o,q,l,x,y,n;s=s||{};j=j||{};if(!s.inline){return z.parent(s,j)}n=z._frontWindow();if(n&&d.get(n.id+"_ifr")){n.focussedElement=d.get(n.id+"_ifr").contentWindow.document.activeElement}if(!s.type){z.bookmark=r.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240)+(tinymce.isIE?8:0);s.min_width=parseInt(s.min_width||150);s.min_height=parseInt(s.min_height||100);s.max_width=parseInt(s.max_width||2000);s.max_height=parseInt(s.max_height||2000);s.left=s.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(s.width/2)));s.top=s.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(s.height/2)));s.movable=s.resizable=true;j.mce_width=s.width;j.mce_height=s.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=s.auto_focus;z.features=s;z.params=j;z.onOpen.dispatch(z,s,j);if(s.type){k+=" mceModal";if(s.type){k+=" mce"+s.type.substring(0,1).toUpperCase()+s.type.substring(1)}s.resizable=false}if(s.statusbar){k+=" mceStatusbar"}if(s.resizable){k+=" mceResizable"}if(s.minimizable){k+=" mceMinimizable"}if(s.maximizable){k+=" mceMaximizable"}if(s.movable){k+=" mceMovable"}z._addAll(d.doc.body,["div",{id:i,role:"dialog","aria-labelledby":s.type?i+"_content":i+"_title","class":(r.settings.inlinepopups_skin||"clearlooks2")+(tinymce.isIE&&window.getSelection?" ie9":""),style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},s.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft",tabindex:"0"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight",tabindex:"0"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!s.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;v+=d.get(i+"_top").clientHeight;v+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:s.top,left:s.left,width:s.width+g,height:s.height+v});y=s.url||s.file;if(y){if(tinymce.relaxedDomain){y+=(y.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}y=tinymce._addVer(y)}if(!s.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:s.width,height:s.height});d.setAttrib(i+"_ifr","src",y)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(s.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",s.content.replace("\n","<br />"));a.add(i,"keyup",function(f){var p=27;if(f.keyCode===p){s.button_func(false);return a.cancel(f)}});a.add(i,"keydown",function(f){var t,p=9;if(f.keyCode===p){t=d.select("a.mceCancel",i+"_wrapper")[0];if(t&&t!==f.target){t.focus()}else{d.get(i+"_ok").focus()}return a.cancel(f)}})}o=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=z.windows[i];z.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return z._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return z._startDrag(i,t,u.className.substring(13))}}}}}});q=a.add(i,"click",function(f){var p=f.target;z.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":z.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":s.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});a.add([i+"_left",i+"_right"],"focus",function(p){var t=d.get(i+"_ifr");if(t){var f=t.contentWindow.document.body;var u=d.select(":input:enabled,*[tabindex=0]",f);if(p.target.id===(i+"_left")){u[u.length-1].focus()}else{u[0].focus()}}else{d.get(i+"_ok").focus()}});x=z.windows[i]={id:i,mousedown_func:o,click_func:q,element:new b(i,{blocker:1,container:r.getContainer()}),iframeElement:new b(i+"_ifr"),features:s,deltaWidth:g,deltaHeight:v};x.iframeElement.on("focus",function(){z.focus(i)});if(z.count==0&&z.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(z.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:z.zIndex-1}});d.show("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","true")}else{d.setStyle("mceModalBlocker","z-index",z.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}d.setAttrib(i,"aria-hidden","false");z.focus(i);z._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}z.count++;return x},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h;if(f.focussedElement){f.focussedElement.focus()}else{if(d.get(h+"_ok")){d.get(f.id+"_ok").focus()}else{if(d.get(f.id+"_ifr")){d.get(f.id+"_ifr").focus()}}}}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;g<h.length;g++){f._addAll(k,h[g])}}}},_startDrag:function(v,G,E){var o=this,u,z,C=d.doc,f,l=o.windows[v],h=l.element,y=h.getXY(),x,q,F,g,A,s,r,j,i,m,k,n,B;g={x:0,y:0};A=d.getViewPort();A.w-=2;A.h-=2;j=G.screenX;i=G.screenY;m=k=n=B=0;u=a.add(C,"mouseup",function(p){a.remove(C,"mouseup",u);a.remove(C,"mousemove",z);if(f){f.remove()}h.moveBy(m,k);h.resizeBy(n,B);q=h.getSize();d.setStyles(v+"_ifr",{width:q.w-l.deltaWidth,height:q.h-l.deltaHeight});o._fixIELayout(v,1);return a.cancel(p)});if(E!="Move"){D()}function D(){if(f){return}o._fixIELayout(v,0);d.add(C.body,"div",{id:"mceEventBlocker","class":"mceEventBlocker "+(o.editor.settings.inlinepopups_skin||"clearlooks2"),style:{zIndex:o.zIndex+1}});if(tinymce.isIE6||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceEventBlocker",{position:"absolute",left:A.x,top:A.y,width:A.w-2,height:A.h-2})}f=new b("mceEventBlocker");f.update();x=h.getXY();q=h.getSize();s=g.x+x.x-A.x;r=g.y+x.y-A.y;d.add(f.get(),"div",{id:"mcePlaceHolder","class":"mcePlaceHolder",style:{left:s,top:r,width:q.w,height:q.h}});F=new b("mcePlaceHolder")}z=a.add(C,"mousemove",function(w){var p,H,t;D();p=w.screenX-j;H=w.screenY-i;switch(E){case"ResizeW":m=p;n=0-p;break;case"ResizeE":n=p;break;case"ResizeN":case"ResizeNW":case"ResizeNE":if(E=="ResizeNW"){m=p;n=0-p}else{if(E=="ResizeNE"){n=p}}k=H;B=0-H;break;case"ResizeS":case"ResizeSW":case"ResizeSE":if(E=="ResizeSW"){m=p;n=0-p}else{if(E=="ResizeSE"){n=p}}B=H;break;case"mceMove":m=p;k=H;break}if(n<(t=l.features.min_width-q.w)){if(m!==0){m+=n-t}n=t}if(B<(t=l.features.min_height-q.h)){if(k!==0){k+=B-t}B=t}n=Math.min(n,l.features.max_width-q.w);B=Math.min(B,l.features.max_height-q.h);m=Math.max(m,A.x-(s+A.x));k=Math.max(k,A.y-(r+A.y));m=Math.min(m,(A.w+A.x)-(s+q.w+A.x));k=Math.min(k,(A.h+A.y)-(r+q.h+A.y));if(m+k!==0){if(s+m<0){m=0}if(r+k<0){k=0}F.moveTo(s+m,r+k)}if(n+B!==0){F.resizeTo(q.w+n,q.h+B)}return a.cancel(w)});return a.cancel(G)},resizeBy:function(g,h,i){var f=this.windows[i];if(f){f.element.resizeBy(g,h);f.iframeElement.resizeBy(g,h)}},close:function(i,k){var g=this,f,j=d.doc,h,k;k=g._findId(k||i);if(!g.windows[k]){g.parent(i);return}g.count--;if(g.count==0){d.remove("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","false");g.editor.focus()}if(f=g.windows[k]){g.onClose.dispatch(g);a.remove(j,"mousedown",f.mousedownFunc);a.remove(j,"click",f.clickFunc);a.clear(k);a.clear(k+"_ifr");d.setAttrib(k+"_ifr","src",'javascript:""');f.element.remove();delete g.windows[k];h=g._frontWindow();if(h){g.focus(h.id)}}},_frontWindow:function(){var g,f=0;e(this.windows,function(h){if(h.zIndex>f){g=h;f=h.zIndex}});return g},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h&k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js new file mode 100644 index 000000000..3de9ecac3 --- /dev/null +++ b/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js @@ -0,0 +1,696 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; + + tinymce.create('tinymce.plugins.InlinePopups', { + init : function(ed, url) { + // Replace window manager + ed.onBeforeRenderUI.add(function() { + ed.windowManager = new tinymce.InlineWindowManager(ed); + DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css"); + }); + }, + + getInfo : function() { + return { + longname : 'InlinePopups', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/inlinepopups', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { + InlineWindowManager : function(ed) { + var t = this; + + t.parent(ed); + t.zIndex = 300000; + t.count = 0; + t.windows = {}; + }, + + open : function(f, p) { + var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u, parentWindow; + + f = f || {}; + p = p || {}; + + // Run native windows + if (!f.inline) + return t.parent(f, p); + + parentWindow = t._frontWindow(); + if (parentWindow && DOM.get(parentWindow.id + '_ifr')) { + parentWindow.focussedElement = DOM.get(parentWindow.id + '_ifr').contentWindow.document.activeElement; + } + + // Only store selection if the type is a normal window + if (!f.type) + t.bookmark = ed.selection.getBookmark(1); + + id = DOM.uniqueId(); + vp = DOM.getViewPort(); + f.width = parseInt(f.width || 320); + f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0); + f.min_width = parseInt(f.min_width || 150); + f.min_height = parseInt(f.min_height || 100); + f.max_width = parseInt(f.max_width || 2000); + f.max_height = parseInt(f.max_height || 2000); + f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0))); + f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0))); + f.movable = f.resizable = true; + p.mce_width = f.width; + p.mce_height = f.height; + p.mce_inline = true; + p.mce_window_id = id; + p.mce_auto_focus = f.auto_focus; + + // Transpose +// po = DOM.getPos(ed.getContainer()); +// f.left -= po.x; +// f.top -= po.y; + + t.features = f; + t.params = p; + t.onOpen.dispatch(t, f, p); + + if (f.type) { + opt += ' mceModal'; + + if (f.type) + opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1); + + f.resizable = false; + } + + if (f.statusbar) + opt += ' mceStatusbar'; + + if (f.resizable) + opt += ' mceResizable'; + + if (f.minimizable) + opt += ' mceMinimizable'; + + if (f.maximizable) + opt += ' mceMaximizable'; + + if (f.movable) + opt += ' mceMovable'; + + // Create DOM objects + t._addAll(DOM.doc.body, + ['div', {id : id, role : 'dialog', 'aria-labelledby': f.type ? id + '_content' : id + '_title', 'class' : (ed.settings.inlinepopups_skin || 'clearlooks2') + (tinymce.isIE && window.getSelection ? ' ie9' : ''), style : 'width:100px;height:100px'}, + ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt}, + ['div', {id : id + '_top', 'class' : 'mceTop'}, + ['div', {'class' : 'mceLeft'}], + ['div', {'class' : 'mceCenter'}], + ['div', {'class' : 'mceRight'}], + ['span', {id : id + '_title'}, f.title || ''] + ], + + ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, + ['div', {id : id + '_left', 'class' : 'mceLeft', tabindex : '0'}], + ['span', {id : id + '_content'}], + ['div', {id : id + '_right', 'class' : 'mceRight', tabindex : '0'}] + ], + + ['div', {id : id + '_bottom', 'class' : 'mceBottom'}, + ['div', {'class' : 'mceLeft'}], + ['div', {'class' : 'mceCenter'}], + ['div', {'class' : 'mceRight'}], + ['span', {id : id + '_status'}, 'Content'] + ], + + ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}], + ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], + ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}], + ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}] + ] + ] + ); + + DOM.setStyles(id, {top : -10000, left : -10000}); + + // Fix gecko rendering bug, where the editors iframe messed with window contents + if (tinymce.isGecko) + DOM.setStyle(id, 'overflow', 'auto'); + + // Measure borders + if (!f.type) { + dw += DOM.get(id + '_left').clientWidth; + dw += DOM.get(id + '_right').clientWidth; + dh += DOM.get(id + '_top').clientHeight; + dh += DOM.get(id + '_bottom').clientHeight; + } + + // Resize window + DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh}); + + u = f.url || f.file; + if (u) { + if (tinymce.relaxedDomain) + u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain; + + u = tinymce._addVer(u); + } + + if (!f.type) { + DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'}); + DOM.setStyles(id + '_ifr', {width : f.width, height : f.height}); + DOM.setAttrib(id + '_ifr', 'src', u); + } else { + DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok'); + + if (f.type == 'confirm') + DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel'); + + DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'}); + DOM.setHTML(id + '_content', f.content.replace('\n', '<br />')); + + Event.add(id, 'keyup', function(evt) { + var VK_ESCAPE = 27; + if (evt.keyCode === VK_ESCAPE) { + f.button_func(false); + return Event.cancel(evt); + } + }); + + Event.add(id, 'keydown', function(evt) { + var cancelButton, VK_TAB = 9; + if (evt.keyCode === VK_TAB) { + cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0]; + if (cancelButton && cancelButton !== evt.target) { + cancelButton.focus(); + } else { + DOM.get(id + '_ok').focus(); + } + return Event.cancel(evt); + } + }); + } + + // Register events + mdf = Event.add(id, 'mousedown', function(e) { + var n = e.target, w, vp; + + w = t.windows[id]; + t.focus(id); + + if (n.nodeName == 'A' || n.nodeName == 'a') { + if (n.className == 'mceMax') { + w.oldPos = w.element.getXY(); + w.oldSize = w.element.getSize(); + + vp = DOM.getViewPort(); + + // Reduce viewport size to avoid scrollbars + vp.w -= 2; + vp.h -= 2; + + w.element.moveTo(vp.x, vp.y); + w.element.resizeTo(vp.w, vp.h); + DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); + DOM.addClass(id + '_wrapper', 'mceMaximized'); + } else if (n.className == 'mceMed') { + // Reset to old size + w.element.moveTo(w.oldPos.x, w.oldPos.y); + w.element.resizeTo(w.oldSize.w, w.oldSize.h); + w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); + + DOM.removeClass(id + '_wrapper', 'mceMaximized'); + } else if (n.className == 'mceMove') + return t._startDrag(id, e, n.className); + else if (DOM.hasClass(n, 'mceResize')) + return t._startDrag(id, e, n.className.substring(13)); + } + }); + + clf = Event.add(id, 'click', function(e) { + var n = e.target; + + t.focus(id); + + if (n.nodeName == 'A' || n.nodeName == 'a') { + switch (n.className) { + case 'mceClose': + t.close(null, id); + return Event.cancel(e); + + case 'mceButton mceOk': + case 'mceButton mceCancel': + f.button_func(n.className == 'mceButton mceOk'); + return Event.cancel(e); + } + } + }); + + // Make sure the tab order loops within the dialog. + Event.add([id + '_left', id + '_right'], 'focus', function(evt) { + var iframe = DOM.get(id + '_ifr'); + if (iframe) { + var body = iframe.contentWindow.document.body; + var focusable = DOM.select(':input:enabled,*[tabindex=0]', body); + if (evt.target.id === (id + '_left')) { + focusable[focusable.length - 1].focus(); + } else { + focusable[0].focus(); + } + } else { + DOM.get(id + '_ok').focus(); + } + }); + + // Add window + w = t.windows[id] = { + id : id, + mousedown_func : mdf, + click_func : clf, + element : new Element(id, {blocker : 1, container : ed.getContainer()}), + iframeElement : new Element(id + '_ifr'), + features : f, + deltaWidth : dw, + deltaHeight : dh + }; + + w.iframeElement.on('focus', function() { + t.focus(id); + }); + + // Setup blocker + if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') { + DOM.add(DOM.doc.body, 'div', { + id : 'mceModalBlocker', + 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker', + style : {zIndex : t.zIndex - 1} + }); + + DOM.show('mceModalBlocker'); // Reduces flicker in IE + DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true'); + } else + DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1); + + if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel)) + DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); + + DOM.setAttrib(id, 'aria-hidden', 'false'); + t.focus(id); + t._fixIELayout(id, 1); + + // Focus ok button + if (DOM.get(id + '_ok')) + DOM.get(id + '_ok').focus(); + t.count++; + + return w; + }, + + focus : function(id) { + var t = this, w; + + if (w = t.windows[id]) { + w.zIndex = this.zIndex++; + w.element.setStyle('zIndex', w.zIndex); + w.element.update(); + + id = id + '_wrapper'; + DOM.removeClass(t.lastId, 'mceFocus'); + DOM.addClass(id, 'mceFocus'); + t.lastId = id; + + if (w.focussedElement) { + w.focussedElement.focus(); + } else if (DOM.get(id + '_ok')) { + DOM.get(w.id + '_ok').focus(); + } else if (DOM.get(w.id + '_ifr')) { + DOM.get(w.id + '_ifr').focus(); + } + } + }, + + _addAll : function(te, ne) { + var i, n, t = this, dom = tinymce.DOM; + + if (is(ne, 'string')) + te.appendChild(dom.doc.createTextNode(ne)); + else if (ne.length) { + te = te.appendChild(dom.create(ne[0], ne[1])); + + for (i=2; i<ne.length; i++) + t._addAll(te, ne[i]); + } + }, + + _startDrag : function(id, se, ac) { + var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh; + + // Get positons and sizes +// cp = DOM.getPos(t.editor.getContainer()); + cp = {x : 0, y : 0}; + vp = DOM.getViewPort(); + + // Reduce viewport size to avoid scrollbars while dragging + vp.w -= 2; + vp.h -= 2; + + sex = se.screenX; + sey = se.screenY; + dx = dy = dw = dh = 0; + + // Handle mouse up + mu = Event.add(d, 'mouseup', function(e) { + Event.remove(d, 'mouseup', mu); + Event.remove(d, 'mousemove', mm); + + if (eb) + eb.remove(); + + we.moveBy(dx, dy); + we.resizeBy(dw, dh); + sz = we.getSize(); + DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight}); + t._fixIELayout(id, 1); + + return Event.cancel(e); + }); + + if (ac != 'Move') + startMove(); + + function startMove() { + if (eb) + return; + + t._fixIELayout(id, 0); + + // Setup event blocker + DOM.add(d.body, 'div', { + id : 'mceEventBlocker', + 'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'), + style : {zIndex : t.zIndex + 1} + }); + + if (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel)) + DOM.setStyles('mceEventBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); + + eb = new Element('mceEventBlocker'); + eb.update(); + + // Setup placeholder + p = we.getXY(); + sz = we.getSize(); + sx = cp.x + p.x - vp.x; + sy = cp.y + p.y - vp.y; + DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}}); + ph = new Element('mcePlaceHolder'); + }; + + // Handle mouse move/drag + mm = Event.add(d, 'mousemove', function(e) { + var x, y, v; + + startMove(); + + x = e.screenX - sex; + y = e.screenY - sey; + + switch (ac) { + case 'ResizeW': + dx = x; + dw = 0 - x; + break; + + case 'ResizeE': + dw = x; + break; + + case 'ResizeN': + case 'ResizeNW': + case 'ResizeNE': + if (ac == "ResizeNW") { + dx = x; + dw = 0 - x; + } else if (ac == "ResizeNE") + dw = x; + + dy = y; + dh = 0 - y; + break; + + case 'ResizeS': + case 'ResizeSW': + case 'ResizeSE': + if (ac == "ResizeSW") { + dx = x; + dw = 0 - x; + } else if (ac == "ResizeSE") + dw = x; + + dh = y; + break; + + case 'mceMove': + dx = x; + dy = y; + break; + } + + // Boundary check + if (dw < (v = w.features.min_width - sz.w)) { + if (dx !== 0) + dx += dw - v; + + dw = v; + } + + if (dh < (v = w.features.min_height - sz.h)) { + if (dy !== 0) + dy += dh - v; + + dh = v; + } + + dw = Math.min(dw, w.features.max_width - sz.w); + dh = Math.min(dh, w.features.max_height - sz.h); + dx = Math.max(dx, vp.x - (sx + vp.x)); + dy = Math.max(dy, vp.y - (sy + vp.y)); + dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x)); + dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y)); + + // Move if needed + if (dx + dy !== 0) { + if (sx + dx < 0) + dx = 0; + + if (sy + dy < 0) + dy = 0; + + ph.moveTo(sx + dx, sy + dy); + } + + // Resize if needed + if (dw + dh !== 0) + ph.resizeTo(sz.w + dw, sz.h + dh); + + return Event.cancel(e); + }); + + return Event.cancel(se); + }, + + resizeBy : function(dw, dh, id) { + var w = this.windows[id]; + + if (w) { + w.element.resizeBy(dw, dh); + w.iframeElement.resizeBy(dw, dh); + } + }, + + close : function(win, id) { + var t = this, w, d = DOM.doc, fw, id; + + id = t._findId(id || win); + + // Probably not inline + if (!t.windows[id]) { + t.parent(win); + return; + } + + t.count--; + + if (t.count == 0) { + DOM.remove('mceModalBlocker'); + DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'false'); + t.editor.focus(); + } + + if (w = t.windows[id]) { + t.onClose.dispatch(t); + Event.remove(d, 'mousedown', w.mousedownFunc); + Event.remove(d, 'click', w.clickFunc); + Event.clear(id); + Event.clear(id + '_ifr'); + + DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak + w.element.remove(); + delete t.windows[id]; + + fw = t._frontWindow(); + + if (fw) + t.focus(fw.id); + } + }, + + // Find front most window + _frontWindow : function() { + var fw, ix = 0; + // Find front most window and focus that + each (this.windows, function(w) { + if (w.zIndex > ix) { + fw = w; + ix = w.zIndex; + } + }); + return fw; + }, + + setTitle : function(w, ti) { + var e; + + w = this._findId(w); + + if (e = DOM.get(w + '_title')) + e.innerHTML = DOM.encode(ti); + }, + + alert : function(txt, cb, s) { + var t = this, w; + + w = t.open({ + title : t, + type : 'alert', + button_func : function(s) { + if (cb) + cb.call(s || t, s); + + t.close(null, w.id); + }, + content : DOM.encode(t.editor.getLang(txt, txt)), + inline : 1, + width : 400, + height : 130 + }); + }, + + confirm : function(txt, cb, s) { + var t = this, w; + + w = t.open({ + title : t, + type : 'confirm', + button_func : function(s) { + if (cb) + cb.call(s || t, s); + + t.close(null, w.id); + }, + content : DOM.encode(t.editor.getLang(txt, txt)), + inline : 1, + width : 400, + height : 130 + }); + }, + + // Internal functions + + _findId : function(w) { + var t = this; + + if (typeof(w) == 'string') + return w; + + each(t.windows, function(wo) { + var ifr = DOM.get(wo.id + '_ifr'); + + if (ifr && w == ifr.contentWindow) { + w = wo.id; + return false; + } + }); + + return w; + }, + + _fixIELayout : function(id, s) { + var w, img; + + if (!tinymce.isIE6) + return; + + // Fixes the bug where hover flickers and does odd things in IE6 + each(['n','s','w','e','nw','ne','sw','se'], function(v) { + var e = DOM.get(id + '_resize_' + v); + + DOM.setStyles(e, { + width : s ? e.clientWidth : '', + height : s ? e.clientHeight : '', + cursor : DOM.getStyle(e, 'cursor', 1) + }); + + DOM.setStyle(id + "_bottom", 'bottom', '-1px'); + + e = 0; + }); + + // Fixes graphics glitch + if (w = this.windows[id]) { + // Fixes rendering bug after resize + w.element.hide(); + w.element.show(); + + // Forced a repaint of the window + //DOM.get(id).style.filter = ''; + + // IE has a bug where images used in CSS won't get loaded + // sometimes when the cache in the browser is disabled + // This fix tries to solve it by loading the images using the image object + each(DOM.select('div,a', id), function(e, i) { + if (e.currentStyle.backgroundImage != 'none') { + img = new Image(); + img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); + } + }); + + DOM.get(id).style.filter = ''; + } + } + }); + + // Register plugin + tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); +})(); + diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif new file mode 100644 index 0000000000000000000000000000000000000000..94abd08763fffdaa0dd5c5afb470a97294f2b94d GIT binary patch literal 818 zcmV-21I_$LNk%w1VITk?0OkMyy?1uhZf>Is3*B5?sT&&Hqoc$;Jkrt6&k+&QHa5gV zL)l77I5;@fLqpYMWV<abwUm?7QBkxrGu*<$+j)7$S6A9;Y1?*oyK8FI)Y8t+&Cwbf z0|Nuh0s^}{Jk10I;B0K)Vq&Z$B;j>+*+oUyj*ia`4%)P|vrSClaB!?EE7K$--(_XZ zOH0lO2-#9n!;Fik78a-!6wR}-yS%#378ch%J=j4(x@2V5*3{b0&C|=t(mFcQDJi8A z60bTsucxKY8XD3{O5bW~+gDfHP*AZbD54S)*gHGL#>A(co5`c08yg$Yzr7_TCCA9d zs-U0MFfhzxW4%d9s-K?K($LSkxy-Sz(7?Xdn3%wSe#oDmxL#e?qN1My0^C(q&nzt3 zjEvWFbJcly)5*uu)6w93eACp@*{!X#QBc56PRYv1%goBm&CA4*kj9vnyFx<e!NJmB zU(r85yc`_bZEdF@Amh5a-++MIVq($7!@-4wp8x>N00960|JK*lA^8LV00000EC2ui z03ZM$000O7fPaF6goTEOh>41ejE#<k00IISkBo0Jbrv!(m5O!&HzaZ~Rh@@>5-A-Y zDMkRMg$FSdD>XGe76Lo4g8*<LeI;2PArd&ee`G#*8(@BZ2^+ahyj*HueO=FJ9Yr1} zuuU>}CUeivLI}B6rYIE)9Vh306CXDUKb=<uW-bx)&*Zqs<6}#uA5xIGnDC4PhjS*P zC=iju(Gn3OJ~%k%@Z5zDL<n$dq#{5R1oJwc3$mgGDMoH24Cyc?<->Dfx`}wT=u<6# zD$n)U&_b6YEgl901IUC4zyf`27&(S$$E;fb{Wx)wm4^u-0<a*$Fr`SgtZ4n*=@8{X znnQYzW|c$BfC1VUE*c1!VTjAScy#S%)!|~rgM5Un%<`AEu^$T`cnDZR$Q_cij?u>H zv*CdXLINn%=tH`+>C>qDxJcmTfS@*Z45S!AI|Ya#EOHOnP2`2|1;88Ju#tey5e=^) w9O1*fx%21Hn;(HtX3!cMK%gku&b_<$??7lEkM$&p`Sa-0r)T3DnWI1eJD_KQDgXcg literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif new file mode 100644 index 0000000000000000000000000000000000000000..e671094cb0eb210b756117f992cf5ca2caa698fd GIT binary patch literal 280 zcmZ?wbhEHb3}BFB*v!Ci>hy`^<m7ADuRePG@c#XKPoF(yU|_g*<J$lK|A7olp!kyo zET{t_L1r+p91UP`UcJ}i^;v8FNsT=zne#GMt$UN@ldE&S#OrFsy6NBF{a+(j;Nim2 z?Qz%e<Q(1E0n=AFtc_ZKV@=uVw`KYFHdOeWYdZa6%dD!n-S=;s)!6NqefMKe-TC*w z|2Nb#lr^@twRcoCD|Pnv^_O>ZOqepYsb$*CnUiMCojPaU!rn<NOP4KQv2xYwHEY+c zU9x`D<}F)SY}~eU*X|v=_wC<ce&Fzt<$IY=oIG{<%-M72FI+rx{L<BH*KaU43*WqZ U@BRsWMY$(WpFI~>5M;0h0LDv<C;$Ke literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif new file mode 100644 index 0000000000000000000000000000000000000000..6baf64ad321ab3d35330f2aaae7504aa519644bd GIT binary patch literal 1195 zcmV;c1XTM+Nk%w1VRQg60K^&qo}rxY@9u7Ug;85$H#j%{|NpDH#%p|xwZqR~a)67K zo_>*_&)DBrWN@OfznH1FT4{BUps!wTd|YdJ0002^_xJYp^u)%)d3$)z&B_1&{{R30 z000000000000000A^8LW000^QEC2ui0CWH_000I5phk>jX`ZJhqHH^=Zk(=iEn-2g z?|i>wBOI?nEE<hGAVKJBHkC}LRHw8|uQ|)eIy`!bJS~BXm5Ryb<~eQN_P*b+o2{PH zd+R&iu7i8!V@(u;go93bJ%&1pK8SicjyXhygMT}bi<FFefj)#epLLy&kbIIAnwF)b zJer$;XswiOtfZKeMii=9ri+P(y*q_dViy3%$j7b}$;}rd#?8tZ8I;n<&jiuZ%+1}` z+1uBJ*U91K%jE#)<J1(@)#~ir^yTy1*7DHkuKL>ih2q)UH?AHyg7~@-@+VH6!(;c_ zxnl@0-@$+5z5y6S@uA0c2rFuI7V_gjj3zt(raakjrMZ$WvB8W9atTdoP;NHMsS_E` zo&bQ*s1XAOQ5i;$x=5;&g^B@Cqe`7hmFm-~ShGUCs<o?Bu3o)rfXbk(*|TWVo|US$ zty>0c-^w)`cdp#12=eOP%eQY|sD1+r)(d#BVZMbAD~4*IvE#>(BS&T|xw7TPlrL+3 zoO$zRs18Dl9!<J*Y0#!qs}7CYbb;5fU$1UmTDEB0si8jD&AYen-@kPOe-Qii@ZQ3K z7l(cPLGs_si5ou-HG=i)*t2WbUVVFn<=(M(-@g2H_z2_47e9}Fz=HSi<IA5vA1eL# z1>)zw58wX%{rd5@fPehOCg6KeHK5@Cf($n3po0lM*gyda7AK*C5k5#^gBwbip@gwr zxFA#zlxU)f<rQ$^iV%><Vu>n3pyG@#n&{$-F`k&?i#Os}T#YskFu{;S5}9I=NKOD% zl13IcK><t>xnz`3B3WgWQ!)wLkXuHn<Ny+cDW;eyj%lU@P@Q>Z0c5HvW}0r6=_Z<B z#>pm`ce)8x0(|!A=bwNAx@Vw%7Dp(bgC44=paU%GsGm?BAnBx(R%)rGkzT6lrjlmL z>8F%>3M!~kDPZcUsHUnas#2}$>Z=O03hS(=%1Z03TZN@7Sh{A#Yp+%P3hY!W2w?27 z$R?|-vc)dz?6bx;3+=SXN=q&OwHg>}*IdYMD_6JPx&>~yY8|WCxyGKWSi0&O#%{ZU z8SB}+^3J<iz4l&)Z@!foyV}2{`3vyC4hZa8d8-**TLGitW}30hMf@AY!!0K<#mbe} z9LCU17u|5ivL`ZjA$tcNdnK!PvUe$~3>(S<94K>q#ugahfi?d(AAt1bTp(;R8!O__ z4hjuog&|&Ow1y6L_~6nY!bY^QK&A*J1XR};BaJ(<m^F?pcD>@)KE`%6)&h8Wq?g93 z?c|kAwoPS{a3?9ZmalP{H`@ZtDW{vp&e>*|d8!$>oy!S+xSFqx+4!8sJ}P<SiyC?; z<&rOodFGc3FzV;Vem-g_=%Rm0dg+@Udn>KTu0Ct)uD=R<?5jq5?d{gy{%r2LFUx!H J$!ZV+06W;kU)}%! literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif new file mode 100644 index 0000000000000000000000000000000000000000..497307a85ad32e00b67c5f27d6f3b46ac566d89b GIT binary patch literal 915 zcmV;E18n?9Nk%w1VITk?0OkMy&&j~|k1Co}49|EKqh~0+ri!6j6Z*7U`lU1e^XU7^ zod5p+om&^t%*Cs9J)E4I)z#6vZX5cfOQfZw_J9bzzPy@aE7*uE$H2Mzs7<(K4$*}x z?4CLJokRMqQrd$ZlS~7knw0jXHTSe!o0*mDqeS+82K9OY`oWCJ%E-LEy7!Ya^?nJ( z#>DxVCHlB}`m%1))6x2zDYdq=`Kv|wmLm3t8~B<$_Jb3xuB^__&G?WTylN4utE$1m z!1=ILv9hrCi66PSxc~e2>z6G0pe^@^5&5A-&VntacS+opK(T{V_m()r#KOD0y0na8 z%goB5UmeoU$gX`!&(O}**3|y@@xQ>n(9zHMmpZewvaqqQx45?Js#L_q!_309tE{Tf zhBEo9Vadb0m3v>7ePP{-Blnp<{MWPlxL*0GU8$dvuduJ(k1^BK(#Ocgm{14%#gX`? zRrPxW_?tJVsi*s^Ih9Zd`n!Ms{rtGOx2&zJ_Iw2Oc>wp7H`dqHA^8LV00000EC2ui z03ZM$000O7fPaF6gntbM4p9Oi0#ObH4TX}Ee_sv)5lUSnX(L@q5dschl$1*XVQCp1 zeyy$<2VnwB5T%0+1Q8<=Os>AJM<Wpgk);g`NC#QJ%&$lc#ghcdz0KAc8w9nIPrB9C z*AY*W00zp<3Rdb0);|USg;N*2=nMAj%^eq0gi-=&-+rO6w*Un=4+5kNDiFZ~xEBQR zfRn(Zz#s>0j(~$f5C*s#Z5#}WQsM?UH3Y?cED>eUzkt6a5bO}dMvwr^Xb5l#@FPJS zeS!wHvEmgRmp@>-3c_NDJ)uzN1ZkynBnOke0ssw~U_pYYQEhN&DagSGI<2(wiP}L< z2e47_&4?6KK!XdoP`Bdkv!miI0SHd)Rj>ff-abVV5}Gn#$6lukSl~7CfghoAf$`$8 z5@&CbciebnJ`7g|k8#ol6q!Rhs*3^IC>>Kxp>@zA1EAR&LqLOw8f*9N5TStp1}s%3 zVM*boLJ~NtT^KPTcxVj-0|X>-(j<kBZT(tY5u#;{1vnZ$5D{TV1d$IK;8<7#giD3) zR3t$WPd>+l5M`Wq2O|PlKt>1?^svPY_j#uua~0?Tgn$1%K*EI<CJ4rY+`aLga{KuZ p;S3Y*(Zh)wvY~~2S9sx|Ef7$_ToWQj=){fp`OpFs$Vn0i06Ts(yS)Ga literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif new file mode 100644 index 0000000000000000000000000000000000000000..c894b2e83522ae29d32e0ed57007d1285c715a7f GIT binary patch literal 911 zcmd6kdrwkv06>2i?j<x$Fc&q=@P#<CjHy{o!`u@3%Qe?r%SElVW?R#it<7cE3u4+* z^O4zWLS)c%sAyRWy=E#@W@#;agk-5Gh=9Blk?LD?KEXLVnY^PZ2hPL-8kpmOW#c>m zAoXC1c4Wxs^ZEJtUB4q<T9{d!{ejg#Ev}K=sC{By{AIT;tyqjMht09F{8*tf&FhVG zx?7K18)Pqy^V3%ILfL(JtyEbhZu{_Us<6CqaZb1DcA5-7O$I$$CoQRy4)?#3bl{#f zx7WMg{Gxx|v)0x8P}!^A*zhWQ)OMS>T{UQ1HY%Uh+pQ*t&D_y5<X!i4sD=hczOT9+ zZs*FI!Ov@}uGjBAy?pzzvsdHstgTp0yJA>9>e1Hjx9TtBow%m&!&jTd_<n5C?Xv&P z`J48i6R`?I0Pw)>f1dxIfK5J>hhd07SSo@<yf^@e1PHE-yA7fU0t8{)M?x771ffs` zR$FyPCTnQqAuQG-MQ9hJ{brXGtCZKMRQD7N=71tIRx`j9^E9!U6{_l9yj77HGoi?c z)=k7Dmg=H2Mk~LzL>U1ANej1zBgs@J)fS$HxTwj{ShgdWQ_Y8V1_h@vv!qzRzyB@+ z)6#Z?iW=a9&+kg`Kr%f7CfA71iK;1=LJ}Gy$VX4NJcj@#Eg2?3moI4LKhG1RIoI;k zR(9^*MkqfeXOWI?@z07&C`6+;+5U$r@?g~7SE`^9EI4NyQM);aP&a^Qu#OXmrWw+; zlBPWv*b`t#;?w$Wfug|f{7_}xnb%jXB(rC~MUS#+NW!T2av4Ypxp0F2N<hUQT%?#| z#`}b0TL~YvEx;jcCMAz-U*g(=Hh0Iv{PrdnHnpu7IES%hpxGDAY-pQwVY9(!1D12c z*sS054gt9-Qs|;gq;vOMa!U&|foU=yo+~V(8V~CeExI>_qva>Vv^VISDi|>EX(%41 z@Cm688>Uf+QlLkXaIO#&z;q&UJDY-1!mg;(MFDCGS{6p8a!wV<G08a^8xR9TJDicC Q$ibXr>F{_rmktj70is)Xxc~qF literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2a2ad454db194e428a7b9da40f62d5376a17428 GIT binary patch literal 769 zcmb7?=`WiB0LI^D)(HC`v6*aD4AW#LGRb0Oi$t<fW)_L~Kx~mM4a>H~CP=nb%N%8n zy02ceuewTUUDeW|RaMp*TlLV6R$o=rQOY{@AME+?`}QQiCwU%4Jq)?`{5B8=ECT1T z+wH!7{<!M4+^W_x3X9mvt_8U*Jv?fkfX)#zho;^a)qkj<V5?d`5osSQsRa$~gqAMJ z;>zji$)-UA>D9({)xO1SJGLHK54Mat(}s4_unMiKjB85EHng*~!Ddt+?(c5uHG4ZI zsc>jP#5Y6w6Wj5!Y<hs+bU!o%27{ex{L}eAcpo{y03Z+uIIo>=0^oK*&D+R;Yh@ze z7vfi;q<Qcix+@`mxieE@%Hh|uvSI=oWth?&>FW{owiOfGqcB@XkwUZ0j?Km4{qjE- z6c!Z|O1!?5l~+^}tE#<g>*^aCo0?lZ$rLKBwT;dI+nLO(UEMvb-ad9elEWPw8Xg(t zx$y<#6T+{PQ@$ecjAT|iC%dxnP5yoH$I`OLFU5*drPiz>bidcu^@a^2v}rP3-`?4^ z?Cl>M-Z(n8ot*x$0~Z|;ku35!-qAHSQN*GM3tW8AN#VWJNrHQD+6qXfO_zB^6eFVU z<cf)?cxIBg&kt7{lseNC#imOygk%_3#B7GlPJ-i{Jkb5%0xi-Rl|0kmE@#Bi&~@km z=3+-8JFQeO(6Q9>OjzupAb0*`W8}<a38zcJed8@^j^=hNN3twNrKHx3=VLE8BVz_x ztHMH8|4hMPuWq{BC%Pqu+_xsF3r<(fW@Gg-as&bSc({K<4n7S|lnxI-ORQ80JbZ*> zQVeE5Djt<<RtxaXp0SAh9i51HD`jqU$fBR8MUx&V^Y)=-cDj0w7e+8^gapqgW1~l| z26;z{Y>a0+Owme6r2OGio7DoTWqkhGKj0`0*1-*<$#uL5YH*kC8Z>wpCvYO~asp;G r-~A;>$wp)vkltB=c_?k6Zw*FUgrbAm;sB08O9+}m=}H3OFd*zN8L+JA literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif new file mode 100644 index 0000000000000000000000000000000000000000..43a735f22c81d6d7d99c1ba9f034f38bfdd1a92b GIT binary patch literal 92 zcmZ?wbhEHb<YM4sSj52a{`GSP28ON6=G?h*=KufyKsE#@{$v3&bU-9XEd#Tn27|Dp lx5hJt39I*7Y(09VtW<RR)W@1l^Cat@NFCPt>&D4o4FLHO9PR)B literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css new file mode 100644 index 000000000..a50d4fc57 --- /dev/null +++ b/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css @@ -0,0 +1,90 @@ +/* Clearlooks 2 */ + +/* Reset */ +.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block} + +/* General */ +.clearlooks2 {position:absolute; direction:ltr} +.clearlooks2 .mceWrapper {position:static} +.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%} +.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)} +.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none} + +/* Top */ +.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px} +.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)} +.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)} +.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0} +.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold} +.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0} +.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px} +.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0} +.clearlooks2 .mceFocus .mceTop span {color:#FFF} + +/* Middle */ +.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0} +.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)} +.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0} +.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF} +.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)} + +/* Bottom */ +.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px} +.clearlooks2 .mceBottom {left:0; bottom:0; width:100%} +.clearlooks2 .mceBottom div {top:0} +.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px} +.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px} +.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0} +.clearlooks2 .mceBottom span {display:none} +.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px} +.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0} +.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px} +.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0} +.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px} + +/* Actions */ +.clearlooks2 a {width:29px; height:16px; top:3px;} +.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0} +.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0} +.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0} +.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0} +.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px} +.clearlooks2 .mceMovable .mceMove {display:block} +.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px} +.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px} +.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px} +.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px} +.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} +.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} +.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px} +.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px} +.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px} + +/* Resize */ +.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px} +.clearlooks2 .mceResizable .mceResize {display:block} +.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none} +.clearlooks2 .mceMinimizable .mceMin {display:block} +.clearlooks2 .mceMaximizable .mceMax {display:block} +.clearlooks2 .mceMaximized .mceMed {display:block} +.clearlooks2 .mceMaximized .mceMax {display:none} +.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize} +.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize} +.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize} +.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;} +.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize} +.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize} +.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize} +.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize} + +/* Alert/Confirm */ +.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0} +.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px} +.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal} +.clearlooks2 a:hover {font-weight:bold;} +.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5} +.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px} +.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)} +.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px} +.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto} +.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)} diff --git a/js/tiny_mce/plugins/inlinepopups/template.htm b/js/tiny_mce/plugins/inlinepopups/template.htm new file mode 100644 index 000000000..f9ec64219 --- /dev/null +++ b/js/tiny_mce/plugins/inlinepopups/template.htm @@ -0,0 +1,387 @@ +<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> --> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Template for dialogs</title> +<link rel="stylesheet" type="text/css" href="skins/clearlooks2/window.css" /> +</head> +<body> + +<div class="mceEditor"> + <div class="clearlooks2" style="width:400px; height:100px; left:10px;"> + <div class="mceWrapper"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Blured</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:420px;"> + <div class="mceWrapper mceMovable mceFocus"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Focused</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:120px;"> + <div class="mceWrapper mceMovable mceFocus mceStatusbar"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:120px;"> + <div class="mceWrapper mceMovable mceFocus mceStatusbar mceResizable"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar, Resizable</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:230px;"> + <div class="mceWrapper mceMovable mceFocus mceResizable mceMaximizable"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Resizable, Maximizable</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:230px;"> + <div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximizable"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Blurred, Maximizable, Statusbar, Resizable</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:10px; top:340px;"> + <div class="mceWrapper mceMovable mceFocus mceResizable mceMaximized mceMinimizable mceMaximizable"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Maximized, Maximizable, Minimizable</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:100px; left:420px; top:340px;"> + <div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximized mceMinimizable mceMaximizable"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Blured</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span>Content</span> + <div class="mceRight"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Statusbar text.</span> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceMin" href="#"></a> + <a class="mceMax" href="#"></a> + <a class="mceMed" href="#"></a> + <a class="mceClose" href="#"></a> + <a class="mceResize mceResizeN" href="#"></a> + <a class="mceResize mceResizeS" href="#"></a> + <a class="mceResize mceResizeW" href="#"></a> + <a class="mceResize mceResizeE" href="#"></a> + <a class="mceResize mceResizeNW" href="#"></a> + <a class="mceResize mceResizeNE" href="#"></a> + <a class="mceResize mceResizeSW" href="#"></a> + <a class="mceResize mceResizeSE" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:130px; left:10px; top:450px;"> + <div class="mceWrapper mceMovable mceFocus mceModal mceAlert"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Alert</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span> + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + </span> + <div class="mceRight"></div> + <div class="mceIcon"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceButton mceOk" href="#">Ok</a> + <a class="mceClose" href="#"></a> + </div> + </div> + + <div class="clearlooks2" style="width:400px; height:130px; left:420px; top:450px;"> + <div class="mceWrapper mceMovable mceFocus mceModal mceConfirm"> + <div class="mceTop"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + <span>Confirm</span> + </div> + + <div class="mceMiddle"> + <div class="mceLeft"></div> + <span> + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + </span> + <div class="mceRight"></div> + <div class="mceIcon"></div> + </div> + + <div class="mceBottom"> + <div class="mceLeft"></div> + <div class="mceCenter"></div> + <div class="mceRight"></div> + </div> + + <a class="mceMove" href="#"></a> + <a class="mceButton mceOk" href="#">Ok</a> + <a class="mceButton mceCancel" href="#">Cancel</a> + <a class="mceClose" href="#"></a> + </div> + </div> +</div> + +</body> +</html> diff --git a/js/tiny_mce/plugins/media/css/media.css b/js/tiny_mce/plugins/media/css/media.css new file mode 100644 index 000000000..fd04898ca --- /dev/null +++ b/js/tiny_mce/plugins/media/css/media.css @@ -0,0 +1,17 @@ +#id, #name, #hspace, #vspace, #class_name, #align { width: 100px } +#hspace, #vspace { width: 50px } +#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px } +#flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px } +#width, #height { width: 40px } +#src, #media_type { width: 250px } +#class { width: 120px } +#prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto } +.panel_wrapper div.current { height: 420px; overflow: auto } +#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none } +.mceAddSelectValue { background-color: #DDDDDD } +#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px } +#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px } +#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px } +#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px } +#qt_qtsrc { width: 200px } +iframe {border: 1px solid gray} diff --git a/js/tiny_mce/plugins/media/editor_plugin.js b/js/tiny_mce/plugins/media/editor_plugin.js new file mode 100644 index 000000000..bac0df218 --- /dev/null +++ b/js/tiny_mce/plugins/media/editor_plugin.js @@ -0,0 +1 @@ +(function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m<f.length;m++){k=f[m][0];q={name:k,clsids:tinymce.explode(f[m][1]||""),mimes:tinymce.explode(f[m][2]||""),codebase:f[m][3]};for(p=0;p<q.clsids.length;p++){l["clsid:"+q.clsids[p]]=q}for(p=0;p<q.mimes.length;p++){l[q.mimes[p]]=q}l["mceItem"+k]=q;l[k.toLowerCase()]=q;a+=(a?"|":"")+k}tinymce.each(n.getParam("media_types","video=mp4,m4v,ogv,webm;silverlight=xap;flash=swf,flv;shockwave=dcr;quicktime=mov,qt,mpg,mp3,mpeg;shockwave=dcr;windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;realmedia=rm,ra,ram;java=jar").split(";"),function(v){var s,u,t;v=v.split(/=/);u=tinymce.explode(v[1].toLowerCase());for(s=0;s<u.length;s++){t=l[v[0].toLowerCase()];if(t){l[u[s]]=t}}});a=new RegExp("write("+a+")\\(([^)]+)\\)");r.lookup=l;n.onPreInit.add(function(){n.schema.addValidElements("object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]");n.parser.addNodeFilter("object,embed,video,audio,script,iframe",function(s){var t=s.length;while(t--){r.objectToImg(s[t])}});n.serializer.addNodeFilter("img",function(s,u,t){var v=s.length,w;while(v--){w=s[v];if((w.attr("class")||"").indexOf("mceItemMedia")!==-1){r.imgToObject(w,t)}}})});n.onInit.add(function(){if(n.theme&&n.theme.onResolveName){n.theme.onResolveName.add(function(i,s){if(s.name==="img"&&n.dom.hasClass(s.node,"mceItemMedia")){s.name="media"}})}if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(s,t,i){if(i.nodeName==="IMG"&&i.className.indexOf("mceItemMedia")!==-1){t.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});n.addCommand("mceMedia",function(){var s,i;i=n.selection.getNode();if(o(i)){s=g.parse(n.dom.getAttrib(i,"data-mce-json"));tinymce.each(d,function(t){var u=n.dom.getAttrib(i,t);if(u){s[t]=u}});s.type=r.getType(i.className).name.toLowerCase()}if(!s){s={type:"flash",video:{sources:[]},params:{}}}n.windowManager.open({file:j+"/media.htm",width:430+parseInt(n.getLang("media.delta_width",0)),height:500+parseInt(n.getLang("media.delta_height",0)),inline:1},{plugin_url:j,data:s})});n.addButton("media",{title:"media.desc",cmd:"mceMedia"});n.onNodeChange.add(function(s,i,t){i.setActive("media",o(t))})},convertUrl:function(k,n){var j=this,m=j.editor,l=m.settings,o=l.url_converter,i=l.url_converter_scope||j;if(!k){return k}if(n){return m.documentBaseURI.toAbsolute(k)}return o.call(i,k,"src","object")},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||"320";n.height=m.height||"240";return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(x,n){var t=this,o=t.editor,A,E,j,s,F,w,D,u,k,C,r,p,y,B,m,v,l,z;function q(i,G){var K,J,L,I,H;H=o.getParam("flash_video_player_url",t.convertUrl(t.url+"/moxieplayer.swf"));if(H){K=o.documentBaseURI;D.params.src=H;if(o.getParam("flash_video_player_absvideourl",true)){i=K.toAbsolute(i||"",true);G=K.toAbsolute(G||"",true)}L="";J=o.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(J,function(N,M){N=N.replace(/\$url/,i||"");N=N.replace(/\$poster/,G||"");if(N.length>0){L+=(L?"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=g.parse(x.attr("data-mce-json"));p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ php?controller=TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||"320";n.height=m.height||"240";return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(x,n){var t=this,o=t.editor,A,E,j,s,F,w,D,u,k,C,r,p,y,B,m,v,l,z;function q(i,G){var K,J,L,I,H;H=o.getParam("flash_video_player_url",t.convertUrl(t.url+"/moxieplayer.swf"));if(H){K=o.documentBaseURI;D.params.src=H;if(o.getParam("flash_video_player_absvideourl",true)){i=K.toAbsolute(i||"",true);G=K.toAbsolute(G||"",true)}L="";J=o.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(J,function(N,M){N=N.replace(/\$url/,i||"");N=N.replace(/\$poster/,G||"");if(N.length>0){L+=(L?"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=g.parse(x.attr("data-mce-json"));p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ php?controller=TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||"320";n.height=m.height||"240";return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(x,n){var t=this,o=t.editor,A,E,j,s,F,w,D,u,k,C,r,p,y,B,m,v,l,z;function q(i,G){var K,J,L,I,H;H=o.getParam("flash_video_player_url",t.convertUrl(t.url+"/moxieplayer.swf"));if(H){K=o.documentBaseURI;D.params.src=H;if(o.getParam("flash_video_player_absvideourl",true)){i=K.toAbsolute(i||"",true);G=K.toAbsolute(G||"",true)}L="";J=o.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(J,function(N,M){N=N.replace(/\$url/,i||"");N=N.replace(/\$poster/,G||"");if(N.length>0){L+=(L?"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=g.parse(x.attr("data-mce-json"));p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ php?controller=TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||"320";n.height=m.height||"240";return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(x,n){var t=this,o=t.editor,A,E,j,s,F,w,D,u,k,C,r,p,y,B,m,v,l,z;function q(i,G){var K,J,L,I,H;H=o.getParam("flash_video_player_url",t.convertUrl(t.url+"/moxieplayer.swf"));if(H){K=o.documentBaseURI;D.params.src=H;if(o.getParam("flash_video_player_absvideourl",true)){i=K.toAbsolute(i||"",true);G=K.toAbsolute(G||"",true)}L="";J=o.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(J,function(N,M){N=N.replace(/\$url/,i||"");N=N.replace(/\$poster/,G||"");if(N.length>0){L+=(L&"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=g.parse(x.attr("data-mce-json"));p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ &g,"")}if(G&&G.length>0){v.attr(i,G)}});for(F in D.params){v.attr(F,D.params[F])}v.attr({style:z,src:D.params.src});x.replace(v);return}if(this.editor.settings.media_use_script){v=new b("script",1).attr("type","text/javascript");w=new b("#text",3);w.value="write"+p.name+"("+g.serialize(tinymce.extend(D.params,{width:x.attr("width"),height:x.attr("height")}))+");";v.append(w);x.replace(v);return}if(p.name==="Video"&&D.video.sources[0]){A=new b("video",1).attr(tinymce.extend({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z},D.video.attrs));if(D.video.attrs){l=D.video.attrs.poster}k=D.video.sources=c(D.video.sources);for(y=0;y<k.length;y++){if(/\.mp4$/.test(k[y].src)){m=k[y].src}}if(!k[0].type){A.attr("src",k[0].src);k.splice(0,1)}for(y=0;y<k.length;y++){u=new b("source",1).attr(k[y]);u.shortEnded=true;A.append(u)}if(m){q(m,l);p=t.getType("flash")}else{D.params.src=""}}if(D.params.src){if(/\.flv$/i.test(D.params.src)){q(D.params.src,"")}if(n&&n.force_absolute){D.params.src=o.documentBaseURI.toAbsolute(D.params.src)}E=new b("object",1).attr({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z});tinymce.each(d,function(i){if(D[i]&&i!="type"){E.attr(i,D[i])}});for(F in D.params){r=new b("param",1);r.shortEnded=true;w=D.params[F];if(F==="src"&&p.name==="WindowsMedia"){F="url"}r.attr({name:F,value:w});E.append(r)}if(this.editor.getParam("media_strict",true)){E.attr({data:D.params.src,type:p.mimes[0]})}else{E.attr({classid:"clsid:"+p.clsids[0],codebase:p.codebase});j=new b("embed",1);j.shortEnded=true;j.attr({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z,type:p.mimes[0]});for(F in D.params){j.attr(F,D.params[F])}tinymce.each(d,function(i){if(D[i]&&i!="type"){j.attr(i,D[i])}});E.append(j)}if(D.object_html){w=new b("#text",3);w.raw=true;w.value=D.object_html;E.append(w)}if(A){A.append(E)}}if(A){if(D.video_html){w=new b("#text",3);w.raw=true;w.value=D.video_html;A.append(w)}}if(A||E){x.replace(A||E)}else{x.remove()}},objectToImg:function(y){var F,j,A,p,G,H,u,w,t,B,z,q,o,D,x,k,E,n,C=this.lookup,l,v,s=this.editor.settings.url_converter,m=this.editor.settings.url_converter_scope;function r(i){return new tinymce.html.Serializer({inner:true,validate:false}).serialize(i)}if(!y.parent){return}if(y.name==="script"){if(y.firstChild){l=a.exec(y.firstChild.value)}if(!l){return}n=l[1];E={video:{},params:g.parse(l[2])};w=E.params.width;t=E.params.height}E=E||{video:{},params:{}};G=new b("img",1);G.attr({src:this.editor.theme.url+"/img/trans.gif"});H=y.name;if(H==="video"){A=y;F=y.getAll("object")[0];j=y.getAll("embed")[0];w=A.attr("width");t=A.attr("height");u=A.attr("id");E.video={attrs:{},sources:[]};v=E.video.attrs;for(H in A.attributes.map){v[H]=A.attributes.map[H]}x=y.attr("src");if(x){E.video.sources.push({src:s.call(m,x,"src","video")})}k=A.getAll("source");for(z=0;z<k.length;z++){x=k[z].remove();E.video.sources.push({src:s.call(m,x.attr("src"),"src","source"),type:x.attr("type"),media:x.attr("media")})}if(v.poster){v.poster=s.call(m,v.poster,"poster","video")}}if(y.name==="object"){F=y;j=y.getAll("embed")[0]}if(y.name==="embed"){j=y}if(y.name==="iframe"){p=y;n="Iframe"}if(F){w=w||F.attr("width");t=t||F.attr("height");B=B||F.attr("style");u=u||F.attr("id");D=F.getAll("param");for(z=0;z<D.length;z++){o=D[z];H=o.remove().attr("name");if(!h[H]){E.params[H]=o.attr("value")}}E.params.src=E.params.src||F.attr("data")}if(j){w=w||j.attr("width");t=t||j.attr("height");B=B||j.attr("style");u=u||j.attr("id");for(H in j.attributes.map){if(!h[H]&&!E.params[H]){E.params[H]=j.attributes.map[H]}}}if(p){w=p.attr("width");t=p.attr("height");B=B||p.attr("style");u=p.attr("id");tinymce.each(d,function(i){G.attr(i,p.attr(i))});for(H in p.attributes.map){if(!h[H]&&!E.params[H]){E.params[H]=p.attributes.map[H]}}}if(E.params.movie){E.params.src=E.params.src||E.params.movie;delete E.params.movie}if(E.params.src){E.params.src=s.call(m,E.params.src,"src","object")}if(A){n=C.video.name}if(F&&!n){n=(C[(F.attr("clsid")||"").toLowerCase()]||C[(F.attr("type")||"").toLowerCase()]||{}).name}if(j&&!n){n=(C[(j.attr("type")||"").toLowerCase()]||{}).name}y.replace(G);if(j){j.remove()}if(F){q=r(F.remove());if(q){E.object_html=q}}if(A){q=r(A.remove());if(q){E.video_html=q}}G.attr({id:u,"class":"mceItemMedia mceItem"+(n||"Flash"),style:B,width:w||"320",height:t||"240","data-mce-json":g.serialize(E,"'")})}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/editor_plugin_src.js b/js/tiny_mce/plugins/media/editor_plugin_src.js new file mode 100644 index 000000000..156769463 --- /dev/null +++ b/js/tiny_mce/plugins/media/editor_plugin_src.js @@ -0,0 +1,770 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var rootAttributes = tinymce.explode('id,name,width,height,style,align,class,hspace,vspace,bgcolor,type'), excludedAttrs = tinymce.makeMap(rootAttributes.join(',')), Node = tinymce.html.Node, + mediaTypes, scriptRegExp, JSON = tinymce.util.JSON, mimeTypes; + + // Media types supported by this plugin + mediaTypes = [ + // Type, clsid:s, mime types, codebase + ["Flash", "d27cdb6e-ae6d-11cf-96b8-444553540000", "application/x-shockwave-flash", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"], + ["ShockWave", "166b1bca-3f9c-11cf-8075-444553540000", "application/x-director", "http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"], + ["WindowsMedia", "6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a", "application/x-mplayer2", "http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"], + ["QuickTime", "02bf25d5-8c17-4b23-bc80-d3488abddc6b", "video/quicktime", "http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"], + ["RealMedia", "cfcdaa03-8be4-11cf-b84b-0020afbbccfa", "audio/x-pn-realaudio-plugin", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"], + ["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"], + ["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"], + ["Iframe"], + ["Video"] + ]; + + function toArray(obj) { + var undef, out, i; + + if (obj && !obj.splice) { + out = []; + + for (i = 0; true; i++) { + if (obj[i]) + out[i] = obj[i]; + else + break; + } + + return out; + } + + return obj; + }; + + tinymce.create('tinymce.plugins.MediaPlugin', { + init : function(ed, url) { + var self = this, lookup = {}, i, y, item, name; + + function isMediaImg(node) { + return node && node.nodeName === 'IMG' && ed.dom.hasClass(node, 'mceItemMedia'); + }; + + self.editor = ed; + self.url = url; + + // Parse media types into a lookup table + scriptRegExp = ''; + for (i = 0; i < mediaTypes.length; i++) { + name = mediaTypes[i][0]; + + item = { + name : name, + clsids : tinymce.explode(mediaTypes[i][1] || ''), + mimes : tinymce.explode(mediaTypes[i][2] || ''), + codebase : mediaTypes[i][3] + }; + + for (y = 0; y < item.clsids.length; y++) + lookup['clsid:' + item.clsids[y]] = item; + + for (y = 0; y < item.mimes.length; y++) + lookup[item.mimes[y]] = item; + + lookup['mceItem' + name] = item; + lookup[name.toLowerCase()] = item; + + scriptRegExp += (scriptRegExp ? '|' : '') + name; + } + + // Handle the media_types setting + tinymce.each(ed.getParam("media_types", + "video=mp4,m4v,ogv,webm;" + + "silverlight=xap;" + + "flash=swf,flv;" + + "shockwave=dcr;" + + "quicktime=mov,qt,mpg,mp3,mpeg;" + + "shockwave=dcr;" + + "windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" + + "realmedia=rm,ra,ram;" + + "java=jar" + ).split(';'), function(item) { + var i, extensions, type; + + item = item.split(/=/); + extensions = tinymce.explode(item[1].toLowerCase()); + for (i = 0; i < extensions.length; i++) { + type = lookup[item[0].toLowerCase()]; + + if (type) + lookup[extensions[i]] = type; + } + }); + + scriptRegExp = new RegExp('write(' + scriptRegExp + ')\\(([^)]+)\\)'); + self.lookup = lookup; + + ed.onPreInit.add(function() { + // Allow video elements + ed.schema.addValidElements('object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]'); + + // Convert video elements to image placeholder + ed.parser.addNodeFilter('object,embed,video,audio,script,iframe', function(nodes) { + var i = nodes.length; + + while (i--) + self.objectToImg(nodes[i]); + }); + + // Convert image placeholders to video elements + ed.serializer.addNodeFilter('img', function(nodes, name, args) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + if ((node.attr('class') || '').indexOf('mceItemMedia') !== -1) + self.imgToObject(node, args); + } + }); + }); + + ed.onInit.add(function() { + // Display "media" instead of "img" in element path + if (ed.theme && ed.theme.onResolveName) { + ed.theme.onResolveName.add(function(theme, path_object) { + if (path_object.name === 'img' && ed.dom.hasClass(path_object.node, 'mceItemMedia')) + path_object.name = 'media'; + }); + } + + // Add contect menu if it's loaded + if (ed && ed.plugins.contextmenu) { + ed.plugins.contextmenu.onContextMenu.add(function(plugin, menu, element) { + if (element.nodeName === 'IMG' && element.className.indexOf('mceItemMedia') !== -1) + menu.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'}); + }); + } + }); + + // Register commands + ed.addCommand('mceMedia', function() { + var data, img; + + img = ed.selection.getNode(); + if (isMediaImg(img)) { + data = JSON.parse(ed.dom.getAttrib(img, 'data-mce-json')); + + // Add some extra properties to the data object + tinymce.each(rootAttributes, function(name) { + var value = ed.dom.getAttrib(img, name); + + if (value) + data[name] = value; + }); + + data.type = self.getType(img.className).name.toLowerCase(); + } + + if (!data) { + data = { + type : 'flash', + video: {sources:[]}, + params: {} + }; + } + + ed.windowManager.open({ + file : url + '/media.htm', + width : 430 + parseInt(ed.getLang('media.delta_width', 0)), + height : 500 + parseInt(ed.getLang('media.delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + data : data + }); + }); + + // Register buttons + ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'}); + + // Update media selection status + ed.onNodeChange.add(function(ed, cm, node) { + cm.setActive('media', isMediaImg(node)); + }); + }, + + convertUrl : function(url, force_absolute) { + var self = this, editor = self.editor, settings = editor.settings, + urlConverter = settings.url_converter, + urlConverterScope = settings.url_converter_scope || self; + + if (!url) + return url; + + if (force_absolute) + return editor.documentBaseURI.toAbsolute(url); + + return urlConverter.call(urlConverterScope, url, 'src', 'object'); + }, + + getInfo : function() { + return { + longname : 'Media', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/media', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + /** + * Converts the JSON data object to an img node. + */ + dataToImg : function(data, force_absolute) { + var self = this, editor = self.editor, baseUri = editor.documentBaseURI, sources, attrs, img, i; + + data.params.src = self.convertUrl(data.params.src, force_absolute); + + attrs = data.video.attrs; + if (attrs) + attrs.src = self.convertUrl(attrs.src, force_absolute); + + if (attrs) + attrs.poster = self.convertUrl(attrs.poster, force_absolute); + + sources = toArray(data.video.sources); + if (sources) { + for (i = 0; i < sources.length; i++) + sources[i].src = self.convertUrl(sources[i].src, force_absolute); + } + + img = self.editor.dom.create('img', { + id : data.id, + style : data.style, + align : data.align, + src : self.editor.theme.url + '/img/trans.gif', + 'class' : 'mceItemMedia mceItem' + self.getType(data.type).name, + 'data-mce-json' : JSON.serialize(data, "'") + }); + + img.width = data.width || "320"; + img.height = data.height || "240"; + + return img; + }, + + /** + * Converts the JSON data object to a HTML string. + */ + dataToHtml : function(data, force_absolute) { + return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {force_absolute : force_absolute}); + }, + + /** + * Converts the JSON data object to a HTML string. + */ + htmlToData : function(html) { + var fragment, img, data; + + data = { + type : 'flash', + video: {sources:[]}, + params: {} + }; + + fragment = this.editor.parser.parse(html); + img = fragment.getAll('img')[0]; + + if (img) { + data = JSON.parse(img.attr('data-mce-json')); + data.type = this.getType(img.attr('class')).name.toLowerCase(); + + // Add some extra properties to the data object + tinymce.each(rootAttributes, function(name) { + var value = img.attr(name); + + if (value) + data[name] = value; + }); + } + + return data; + }, + + /** + * Get type item by extension, class, clsid or mime type. + * + * @method getType + * @param {String} value Value to get type item by. + * @return {Object} Type item object or undefined. + */ + getType : function(value) { + var i, values, typeItem; + + // Find type by checking the classes + values = tinymce.explode(value, ' '); + for (i = 0; i < values.length; i++) { + typeItem = this.lookup[values[i]]; + + if (typeItem) + return typeItem; + } + }, + + /** + * Converts a tinymce.html.Node image element to video/object/embed. + */ + imgToObject : function(node, args) { + var self = this, editor = self.editor, video, object, embed, iframe, name, value, data, + source, sources, params, param, typeItem, i, item, mp4Source, replacement, + posterSrc, style; + + // Adds the flash player + function addPlayer(video_src, poster_src) { + var baseUri, flashVars, flashVarsOutput, params, flashPlayer; + + flashPlayer = editor.getParam('flash_video_player_url', self.convertUrl(self.url + '/moxieplayer.swf')); + if (flashPlayer) { + baseUri = editor.documentBaseURI; + data.params.src = flashPlayer; + + // Convert the movie url to absolute urls + if (editor.getParam('flash_video_player_absvideourl', true)) { + video_src = baseUri.toAbsolute(video_src || '', true); + poster_src = baseUri.toAbsolute(poster_src || '', true); + } + + // Generate flash vars + flashVarsOutput = ''; + flashVars = editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}); + tinymce.each(flashVars, function(value, name) { + // Replace $url and $poster variables in flashvars value + value = value.replace(/\$url/, video_src || ''); + value = value.replace(/\$poster/, poster_src || ''); + + if (value.length > 0) + flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value); + }); + + if (flashVarsOutput.length) + data.params.flashvars = flashVarsOutput; + + params = editor.getParam('flash_video_player_params', { + allowfullscreen: true, + allowscriptaccess: true + }); + + tinymce.each(params, function(value, name) { + data.params[name] = "" + value; + }); + } + }; + + data = JSON.parse(node.attr('data-mce-json')); + typeItem = this.getType(node.attr('class')); + + style = node.attr('data-mce-style') + if (!style) { + style = node.attr('style'); + + if (style) + style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img')); + } + + // Handle iframe + if (typeItem.name === 'Iframe') { + replacement = new Node('iframe', 1); + + tinymce.each(rootAttributes, function(name) { + var value = node.attr(name); + + if (name == 'class' && value) + value = value.replace(/mceItem.+ ?/g, ''); + + if (value && value.length > 0) + replacement.attr(name, value); + }); + + for (name in data.params) + replacement.attr(name, data.params[name]); + + replacement.attr({ + style: style, + src: data.params.src + }); + + node.replace(replacement); + + return; + } + + // Handle scripts + if (this.editor.settings.media_use_script) { + replacement = new Node('script', 1).attr('type', 'text/javascript'); + + value = new Node('#text', 3); + value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, { + width: node.attr('width'), + height: node.attr('height') + })) + ');'; + + replacement.append(value); + node.replace(replacement); + + return; + } + + // Add HTML5 video element + if (typeItem.name === 'Video' && data.video.sources[0]) { + // Create new object element + video = new Node('video', 1).attr(tinymce.extend({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }, data.video.attrs)); + + // Get poster source and use that for flash fallback + if (data.video.attrs) + posterSrc = data.video.attrs.poster; + + sources = data.video.sources = toArray(data.video.sources); + for (i = 0; i < sources.length; i++) { + if (/\.mp4$/.test(sources[i].src)) + mp4Source = sources[i].src; + } + + if (!sources[0].type) { + video.attr('src', sources[0].src); + sources.splice(0, 1); + } + + for (i = 0; i < sources.length; i++) { + source = new Node('source', 1).attr(sources[i]); + source.shortEnded = true; + video.append(source); + } + + // Create flash fallback for video if we have a mp4 source + if (mp4Source) { + addPlayer(mp4Source, posterSrc); + typeItem = self.getType('flash'); + } else + data.params.src = ''; + } + + // Do we have a params src then we can generate object + if (data.params.src) { + // Is flv movie add player for it + if (/\.flv$/i.test(data.params.src)) + addPlayer(data.params.src, ''); + + if (args && args.force_absolute) + data.params.src = editor.documentBaseURI.toAbsolute(data.params.src); + + // Create new object element + object = new Node('object', 1).attr({ + id : node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style + }); + + tinymce.each(rootAttributes, function(name) { + if (data[name] && name != 'type') + object.attr(name, data[name]); + }); + + // Add params + for (name in data.params) { + param = new Node('param', 1); + param.shortEnded = true; + value = data.params[name]; + + // Windows media needs to use url instead of src for the media URL + if (name === 'src' && typeItem.name === 'WindowsMedia') + name = 'url'; + + param.attr({name: name, value: value}); + object.append(param); + } + + // Setup add type and classid if strict is disabled + if (this.editor.getParam('media_strict', true)) { + object.attr({ + data: data.params.src, + type: typeItem.mimes[0] + }); + } else { + object.attr({ + classid: "clsid:" + typeItem.clsids[0], + codebase: typeItem.codebase + }); + + embed = new Node('embed', 1); + embed.shortEnded = true; + embed.attr({ + id: node.attr('id'), + width: node.attr('width'), + height: node.attr('height'), + style : style, + type: typeItem.mimes[0] + }); + + for (name in data.params) + embed.attr(name, data.params[name]); + + tinymce.each(rootAttributes, function(name) { + if (data[name] && name != 'type') + embed.attr(name, data[name]); + }); + + object.append(embed); + } + + // Insert raw HTML + if (data.object_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.object_html; + object.append(value); + } + + // Append object to video element if it exists + if (video) + video.append(object); + } + + if (video) { + // Insert raw HTML + if (data.video_html) { + value = new Node('#text', 3); + value.raw = true; + value.value = data.video_html; + video.append(value); + } + } + + if (video || object) + node.replace(video || object); + else + node.remove(); + }, + + /** + * Converts a tinymce.html.Node video/object/embed to an img element. + * + * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this: + * <img class="mceItemMedia mceItemFlash" width="100" height="100" data-mce-json="{..}" /> + * + * The JSON structure will be like this: + * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}} + */ + objectToImg : function(node) { + var object, embed, video, iframe, img, name, id, width, height, style, i, html, + param, params, source, sources, data, type, lookup = this.lookup, + matches, attrs, urlConverter = this.editor.settings.url_converter, + urlConverterScope = this.editor.settings.url_converter_scope; + + function getInnerHTML(node) { + return new tinymce.html.Serializer({ + inner: true, + validate: false + }).serialize(node); + }; + + // If node isn't in document + if (!node.parent) + return; + + // Handle media scripts + if (node.name === 'script') { + if (node.firstChild) + matches = scriptRegExp.exec(node.firstChild.value); + + if (!matches) + return; + + type = matches[1]; + data = {video : {}, params : JSON.parse(matches[2])}; + width = data.params.width; + height = data.params.height; + } + + // Setup data objects + data = data || { + video : {}, + params : {} + }; + + // Setup new image object + img = new Node('img', 1); + img.attr({ + src : this.editor.theme.url + '/img/trans.gif' + }); + + // Video element + name = node.name; + if (name === 'video') { + video = node; + object = node.getAll('object')[0]; + embed = node.getAll('embed')[0]; + width = video.attr('width'); + height = video.attr('height'); + id = video.attr('id'); + data.video = {attrs : {}, sources : []}; + + // Get all video attributes + attrs = data.video.attrs; + for (name in video.attributes.map) + attrs[name] = video.attributes.map[name]; + + source = node.attr('src'); + if (source) + data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', 'video')}); + + // Get all sources + sources = video.getAll("source"); + for (i = 0; i < sources.length; i++) { + source = sources[i].remove(); + + data.video.sources.push({ + src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'), + type: source.attr('type'), + media: source.attr('media') + }); + } + + // Convert the poster URL + if (attrs.poster) + attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', 'video'); + } + + // Object element + if (node.name === 'object') { + object = node; + embed = node.getAll('embed')[0]; + } + + // Embed element + if (node.name === 'embed') + embed = node; + + // Iframe element + if (node.name === 'iframe') { + iframe = node; + type = 'Iframe'; + } + + if (object) { + // Get width/height + width = width || object.attr('width'); + height = height || object.attr('height'); + style = style || object.attr('style'); + id = id || object.attr('id'); + + // Get all object params + params = object.getAll("param"); + for (i = 0; i < params.length; i++) { + param = params[i]; + name = param.remove().attr('name'); + + if (!excludedAttrs[name]) + data.params[name] = param.attr('value'); + } + + data.params.src = data.params.src || object.attr('data'); + } + + if (embed) { + // Get width/height + width = width || embed.attr('width'); + height = height || embed.attr('height'); + style = style || embed.attr('style'); + id = id || embed.attr('id'); + + // Get all embed attributes + for (name in embed.attributes.map) { + if (!excludedAttrs[name] && !data.params[name]) + data.params[name] = embed.attributes.map[name]; + } + } + + if (iframe) { + // Get width/height + width = iframe.attr('width'); + height = iframe.attr('height'); + style = style || iframe.attr('style'); + id = iframe.attr('id'); + + tinymce.each(rootAttributes, function(name) { + img.attr(name, iframe.attr(name)); + }); + + // Get all iframe attributes + for (name in iframe.attributes.map) { + if (!excludedAttrs[name] && !data.params[name]) + data.params[name] = iframe.attributes.map[name]; + } + } + + // Use src not movie + if (data.params.movie) { + data.params.src = data.params.src || data.params.movie; + delete data.params.movie; + } + + // Convert the URL to relative/absolute depending on configuration + if (data.params.src) + data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object'); + + if (video) + type = lookup.video.name; + + if (object && !type) + type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name; + + if (embed && !type) + type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name; + + // Replace the video/object/embed element with a placeholder image containing the data + node.replace(img); + + // Remove embed + if (embed) + embed.remove(); + + // Serialize the inner HTML of the object element + if (object) { + html = getInnerHTML(object.remove()); + + if (html) + data.object_html = html; + } + + // Serialize the inner HTML of the video element + if (video) { + html = getInnerHTML(video.remove()); + + if (html) + data.video_html = html; + } + + // Set width/height of placeholder + img.attr({ + id : id, + 'class' : 'mceItemMedia mceItem' + (type || 'Flash'), + style : style, + width : width || "320", + height : height || "240", + "data-mce-json" : JSON.serialize(data, "'") + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/js/embed.js b/js/tiny_mce/plugins/media/js/embed.js new file mode 100644 index 000000000..6fe25de09 --- /dev/null +++ b/js/tiny_mce/plugins/media/js/embed.js @@ -0,0 +1,73 @@ +/** + * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. + */ + +function writeFlash(p) { + writeEmbed( + 'D27CDB6E-AE6D-11cf-96B8-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'application/x-shockwave-flash', + p + ); +} + +function writeShockWave(p) { + writeEmbed( + '166B1BCA-3F9C-11CF-8075-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', + 'application/x-director', + p + ); +} + +function writeQuickTime(p) { + writeEmbed( + '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', + 'video/quicktime', + p + ); +} + +function writeRealMedia(p) { + writeEmbed( + 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'audio/x-pn-realaudio-plugin', + p + ); +} + +function writeWindowsMedia(p) { + p.url = p.src; + writeEmbed( + '6BF52A52-394A-11D3-B153-00C04F79FAA6', + 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', + 'application/x-mplayer2', + p + ); +} + +function writeEmbed(cls, cb, mt, p) { + var h = '', n; + + h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"'; + h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : ''; + h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : ''; + h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : ''; + h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : ''; + h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : ''; + h += '>'; + + for (n in p) + h += '<param name="' + n + '" value="' + p[n] + '">'; + + h += '<embed type="' + mt + '"'; + + for (n in p) + h += n + '="' + p[n] + '" '; + + h += '></embed></object>'; + + document.write(h); +} diff --git a/js/tiny_mce/plugins/media/js/media.js b/js/tiny_mce/plugins/media/js/media.js new file mode 100644 index 000000000..2c10f9e89 --- /dev/null +++ b/js/tiny_mce/plugins/media/js/media.js @@ -0,0 +1,354 @@ +(function() { + var url; + + if (url = tinyMCEPopup.getParam("media_external_list_url")) + document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); + + function get(id) { + return document.getElementById(id); + } + + function getVal(id) { + var elm = get(id); + + if (elm.nodeName == "SELECT") + return elm.options[elm.selectedIndex].value; + + if (elm.type == "checkbox") + return elm.checked; + + return elm.value; + } + + function setVal(id, value) { + if (typeof(value) != 'undefined') { + var elm = get(id); + + if (elm.nodeName == "SELECT") + selectByValue(document.forms[0], id, value); + else if (elm.type == "checkbox") { + if (typeof(value) == 'string') + elm.checked = value.toLowerCase() === 'true' ? true : false; + else + elm.checked = !!value; + } else + elm.value = value; + } + } + + window.Media = { + init : function() { + var html, editor; + + this.editor = editor = tinyMCEPopup.editor; + + // Setup file browsers and color pickers + get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); + get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); + get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource1','video_altsource1','media','media'); + get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource2','video_altsource2','media','media'); + get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); + + html = this.getMediaListHTML('medialist', 'src', 'media', 'media'); + if (html == "") + get("linklistrow").style.display = 'none'; + else + get("linklistcontainer").innerHTML = html; + + if (isVisible('filebrowser')) + get('src').style.width = '230px'; + + if (isVisible('filebrowser_altsource1')) + get('video_altsource1').style.width = '220px'; + + if (isVisible('filebrowser_altsource2')) + get('video_altsource2').style.width = '220px'; + + if (isVisible('filebrowser_poster')) + get('video_poster').style.width = '220px'; + + this.data = tinyMCEPopup.getWindowArg('data'); + this.dataToForm(); + this.preview(); + }, + + insert : function() { + var editor = tinyMCEPopup.editor; + + this.formToData(); + editor.execCommand('mceRepaint'); + tinyMCEPopup.restoreSelection(); + editor.selection.setNode(editor.plugins.media.dataToImg(this.data)); + tinyMCEPopup.close(); + }, + + preview : function() { + get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true); + }, + + moveStates : function(to_form, field) { + var data = this.data, editor = this.editor, data = this.data, + mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; + + defaultStates = { + // QuickTime + quicktime_autoplay : true, + quicktime_controller : true, + + // Flash + flash_play : true, + flash_loop : true, + flash_menu : true, + + // WindowsMedia + windowsmedia_autostart : true, + windowsmedia_enablecontextmenu : true, + windowsmedia_invokeurls : true, + + // RealMedia + realmedia_autogotourl : true, + realmedia_imagestatus : true + }; + + function parseQueryParams(str) { + var out = {}; + + if (str) { + tinymce.each(str.split('&'), function(item) { + var parts = item.split('='); + + out[unescape(parts[0])] = unescape(parts[1]); + }); + } + + return out; + }; + + function setOptions(type, names) { + var i, name, formItemName, value, list; + + if (type == data.type || type == 'global') { + names = tinymce.explode(names); + for (i = 0; i < names.length; i++) { + name = names[i]; + formItemName = type == 'global' ? name : type + '_' + name; + + if (type == 'global') + list = data; + else if (type == 'video') { + list = data.video.attrs; + + if (!list && !to_form) + data.video.attrs = list = {}; + } else + list = data.params; + + if (list) { + if (to_form) { + setVal(formItemName, list[name]); + } else { + delete list[name]; + + value = getVal(formItemName); + if (type == 'video' && value === true) + value = name; + + if (defaultStates[formItemName]) { + if (value !== defaultStates[formItemName]) { + value = "" + value; + list[name] = value; + } + } else if (value) { + value = "" + value; + list[name] = value; + } + } + } + } + } + } + + if (!to_form) { + data.type = get('media_type').options[get('media_type').selectedIndex].value; + data.width = getVal('width'); + data.height = getVal('height'); + + // Switch type based on extension + src = getVal('src'); + if (field == 'src') { + ext = src.replace(/^.*\.([^.]+)$/, '$1'); + if (typeInfo = mediaPlugin.getType(ext)) + data.type = typeInfo.name.toLowerCase(); + + setVal('media_type', data.type); + } + + if (data.type == "video") { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src: getVal('src')}; + } + } + + // Hide all fieldsets and show the one active + get('video_options').style.display = 'none'; + get('flash_options').style.display = 'none'; + get('quicktime_options').style.display = 'none'; + get('shockwave_options').style.display = 'none'; + get('windowsmedia_options').style.display = 'none'; + get('realmedia_options').style.display = 'none'; + + if (get(data.type + '_options')) + get(data.type + '_options').style.display = 'block'; + + setVal('media_type', data.type); + + setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars'); + setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc'); + setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); + setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); + setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); + setOptions('video', 'poster,autoplay,loop,preload,controls'); + setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); + + if (to_form) { + if (data.type == 'video') { + if (data.video.sources[0]) + setVal('src', data.video.sources[0].src); + + src = data.video.sources[1]; + if (src) + setVal('video_altsource1', src.src); + + src = data.video.sources[2]; + if (src) + setVal('video_altsource2', src.src); + } else { + // Check flash vars + if (data.type == 'flash') { + tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { + if (value == '$url') + data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src; + }); + } + + setVal('src', data.params.src); + } + } else { + src = getVal("src"); + + // YouTube + if (src.match(/youtube.com(.+)v=([^&]+)/)) { + data.width = 425; + data.height = 350; + data.params.frameborder = '0'; + data.type = 'iframe'; + src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1]; + setVal('src', src); + setVal('media_type', data.type); + } + + // Google video + if (src.match(/video.google.com(.+)docid=([^&]+)/)) { + data.width = 425; + data.height = 326; + data.type = 'flash'; + src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en'; + setVal('src', src); + setVal('media_type', data.type); + } + + if (data.type == 'video') { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src : src}; + + src = getVal("video_altsource1"); + if (src) + data.video.sources[1] = {src : src}; + + src = getVal("video_altsource2"); + if (src) + data.video.sources[2] = {src : src}; + } else + data.params.src = src; + + // Set default size + setVal('width', data.width || 320); + setVal('height', data.height || 240); + } + }, + + dataToForm : function() { + this.moveStates(true); + }, + + formToData : function(field) { + if (field == "width" || field == "height") + this.changeSize(field); + + if (field == 'source') { + this.moveStates(false, field); + setVal('source', this.editor.plugins.media.dataToHtml(this.data)); + this.panel = 'source'; + } else { + if (this.panel == 'source') { + this.data = this.editor.plugins.media.htmlToData(getVal('source')); + this.dataToForm(); + this.panel = ''; + } + + this.moveStates(false, field); + this.preview(); + } + }, + + beforeResize : function() { + this.width = parseInt(getVal('width') || "320", 10); + this.height = parseInt(getVal('height') || "240", 10); + }, + + changeSize : function(type) { + var width, height, scale, size; + + if (get('constrain').checked) { + width = parseInt(getVal('width') || "320", 10); + height = parseInt(getVal('height') || "240", 10); + + if (type == 'width') { + this.height = Math.round((width / this.width) * height); + setVal('height', this.height); + } else { + this.width = Math.round((height / this.height) * width); + setVal('width', this.width); + } + } + }, + + getMediaListHTML : function() { + if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { + var html = ""; + + html += '<select id="linklist" name="linklist" style="width: 250px" onchange="this.form.src.value=this.options[this.selectedIndex].value;Media.formToData(\'src\');">'; + html += '<option value="">---</option>'; + + for (var i=0; i<tinyMCEMediaList.length; i++) + html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>'; + + html += '</select>'; + + return html; + } + + return ""; + } + }; + + tinyMCEPopup.requireLangPack(); + tinyMCEPopup.onInit.add(function() { + Media.init(); + }); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ar_dlg.js b/js/tiny_mce/plugins/media/langs/ar_dlg.js new file mode 100755 index 000000000..7249ba54b --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"\u0639\u0627\u0645",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"\u064a\u0633\u0627\u0631",align_bottom:"\u0627\u0633\u0641\u0644",align_right:"\u064a\u0645\u064a\u0646",align_top:"\u0627\u0644\u0627\u0639\u0644\u0649",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/az_dlg.js b/js/tiny_mce/plugins/media/langs/az_dlg.js new file mode 100755 index 000000000..64e11576a --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.media_dlg',{list:"Siyah\u0131",file:"Fayl/\u00fcnvan",advanced:"\u018flav\u0259l\u0259r",general:"\u00dcmumi",title:"Mediya-obyekti \u0259lav\u0259/redakt\u0259 et",align_top_left:"\u00dcst sol",align_center:"M\u0259tk\u0259z",align_left:"Sol",align_bottom:"Alt",align_right:"Sa\u011f",align_top:"\u00dcst",qt_stream_warn:"Haz\u0131rki ax\u0131lan rtsp m\u0259nb\u0259l\u0259ri QT Src sah\u0259sin\u0259 \u0259lav\u0259 edilm\u0259lidir.\\nSiz h\u0259m\u00e7inin Src sah\u0259sin\u0259 qeyri-ax\u0131lan versiyan\u0131 da \u0259lav\u0259 etm\u0259lisiniz..",qtsrc:"QT Src",progress:"\u0130l\u0259rl\u0259yi\u015f",sound:"S\u0259s",swstretchvalign:"Uzat D-D\u00fczl\u0259ndir",swstretchhalign:"Uzat Y-D\u00fczl\u0259ndir",swstretchstyle:"Uzatma stili",scriptcallbacks:"Skript \u00e7a\u011f\u0131r\u0131mlar\u0131",align_top_right:"\u00dcst sa\u011f",uimode:"UI \u00dcsulu",rate:"Norma",playcount:"Oynatma say\u0131",defaultframe:"Susmaya g\u00f6r\u0259 \u00e7\u0259r\u00e7iv\u0259",currentposition:"Haz\u0131rki m\u00f6vqe",currentmarker:"Haz\u0131rki marker",captioningid:"Ba\u015fl\u0131qland\u0131rma id",baseurl:"Baza URL",balance:"Balans",windowlessvideo:"P\u0259nc\u0259r\u0259siz vide",stretchtofit:"S\u0131\u011facaq q\u0259d\u0259r \u00f6l\u00e7\u00fcl\u0259ndir",mute:"S\u0259ssiz",invokeurls:"\u00c7a\u011f\u0131r\u0131lacaq URL \u00fcnvanlar",fullscreen:"Tam ekran",enabled:"Yan\u0131l\u0131b",autostart:"Avtomatik ba\u015flat",volume:"S\u0259s",target:"H\u0259d\u0259f",qtsrcchokespeed:"Drossel s\u00fcr\u0259ti",href:"Href",endtime:"Bit\u0259c\u0259k zaman",starttime:"Ba\u015flan\u011f\u0131c zaman",enablejavascript:"JavaScript-i yand\u0131r",correction:"D\u0259yi\u015fiklik yoxdur",targetcache:"H\u0259d\u0259f ke\u015f",playeveryframe:"H\u0259r \u00e7\u0259r\u00e7iv\u0259ni oynat",kioskmode:"Kiosk \u00fcsulu",controller:"\u0130dar\u0259\u00e7i",menu:"Menyunu g\u00f6st\u0259r",loop:"\u0130lm\u0259k",play:"Avtomatik oynat",hspace:"\u00dcf\u00fcqi f\u0259za",vspace:"\u015eaquli f\u0259za",class_name:"Sinif",name:"Ad\u0131",id:"\u0130dentifikator",type:"N\u00f6v",size:"\u00d6\u00e7\u00fcl\u0259ri",preview:"\u0130lkin bax\u0131\u015f",constrain_proportions:"Proporsiyalar\u0131 saxla",controls:"Kontroller",numloop:"R\u0259q\u0259mli ilm\u0259l\u0259r",console:"Konsol",cache:"Ke\u015f",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"T\u0259m\u0259l",bgcolor:"Fon",wmode:"WMode",salign:"SAlign",align:"Tarazla\u015fmaq",scale:"Miqyas",quality:"Keyfiyy\u0259t",shuffle:"Qar\u0131\u015fd\u0131r",prefetch:"\u00d6n-g\u0259tirm\u0259",nojava:"Java yox",maintainaspect:"Aspekti qoru",imagestatus:"\u015e\u0259kil statusu",center:"M\u0259rk\u0259z",autogotourl:"Avtomatik gedil\u0259c\u0259k URL",shockwave_options:"Shockwave nizamlamalar\u0131",rmp_options:"Real media player nizamlamalar\u0131",wmp_options:"Windows media player nizamlamalar\u0131",qt_options:"Quicktime nizamlamalar\u0131",flash_options:"Flash nizamlamalar\u0131",hidden:"Gizli",align_bottom_left:"A\u015fa\u011f\u0131 sol",align_bottom_right:"A\u015fa\u011f\u0131 sa\u011f",flv_options:"Fla\u015f video nizamlamalar\u0131",flv_scalemode:"Miqyas \u00fcsulu",flv_buffer:"Bufer",flv_startimage:"Ba\u015flan\u011f\u0131c \u015f\u0259kil",flv_starttime:"Ba\u015flan\u011f\u0131c zaman",flv_defaultvolume:"Susmaya g\u00f6r\u0259 s\u0259s",flv_hiddengui:"Gizli GUI",flv_autostart:"Avtomatik ba\u015flat",flv_loop:"\u0130lm\u0259",flv_showscalemodes:"\u00d6l\u00e7\u0259k rejiml\u0259ri g\u00f6st\u0259r",flv_smoothvideo:"Videonu yum\u015falt",flv_jscallback:"JS \u00c7a\u011f\u0131r\u0131mlar\u0131"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/be_dlg.js b/js/tiny_mce/plugins/media/langs/be_dlg.js new file mode 100755 index 000000000..2f2ed6c7d --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.media_dlg',{list:"\u0421\u043f\u0456\u0441",file:"\u0424\u0430\u0439\u043b/\u0430\u0434\u0440\u0430\u0441",advanced:"\u0414\u0430\u0434\u0430\u0442\u043a\u043e\u0432\u044b\u044f",general:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f",title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c/\u0440\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u043c\u0435\u0434\u044b\u044f-\u0430\u0431\'\u0435\u043a\u0442",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"\u0410\u0434\u043b\u044e\u0441\u0442\u0440\u0430\u0432\u0430\u0446\u044c \u043c\u0435\u043d\u044e",loop:"\u0417\u0430\u0446\u044b\u043a\u043b\u0456\u0446\u044c",play:"\u041f\u0440\u0430\u0439\u0433\u0440\u0430\u0432\u0430\u0446\u044c \u0430\u045e\u0442\u0430\u043c\u0430\u0442\u044b\u0447\u043d\u0430",hspace:"\u0413\u0430\u0440\u044b\u0437\u0430\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0430\u0441\u0442\u043e\u0440\u0430",vspace:"\u0412\u0435\u0440\u0442\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0430\u0441\u0442\u043e\u0440\u0430",class_name:"\u041a\u043b\u0430\u0441",name:"\u041d\u0430\u0437\u043e\u045e",id:"\u0406\u0434\u044d\u043d\u0442\u044b\u0444\u0456\u043a\u0430\u0442\u0430\u0440",type:"\u0422\u044b\u043f",size:"\u041f\u0430\u043c\u0435\u0440\u044b",preview:"\u041f\u0430\u043f\u044f\u0440\u044d\u0434\u043d\u0456 \u043f\u0440\u0430\u0433\u043b\u044f\u0434",constrain_proportions:"\u0417\u0430\u0445\u043e\u045e\u0432\u0430\u0446\u044c \u043f\u0440\u0430\u043f\u043e\u0440\u0446\u044b\u0456",controls:"Controls",numloop:"Num loops",console:"Console",cache:"\u041a\u044d\u0448",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"\u0410\u0441\u043d\u043e\u0432\u0430",bgcolor:"\u0424\u043e\u043d",wmode:"WMode",salign:"SAlign",align:"\u0412\u044b\u0440\u0430\u045e\u043d\u043e\u045e\u0432\u0430\u043d\u043d\u0435",scale:"\u041c\u0430\u0448\u0442\u0430\u0431",quality:"\u042f\u043a\u0430\u0441\u0446\u044c",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"\u0421\u043a\u0440\u044b\u0442\u043e\u0435",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/bg_dlg.js b/js/tiny_mce/plugins/media/langs/bg_dlg.js new file mode 100755 index 000000000..ef620292f --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.media_dlg',{list:"\u0421\u043f\u0438\u0441\u044a\u043a",file:"\u0424\u0430\u0439\u043b/URL",advanced:"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",general:"\u041e\u0431\u0449\u0438",title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0430",align_top_left:"\u0413\u043e\u0440\u0435 \u043b\u044f\u0432\u043e",align_center:"\u0426\u0435\u043d\u0442\u044a\u0440",align_left:"\u041b\u044f\u0432\u043e",align_bottom:"\u0414\u043e\u043b\u0443",align_right:"\u0414\u044f\u0441\u043d\u043e",align_top:"\u0413\u043e\u0440\u0435",qt_stream_warn:"\u041f\u043e\u0442\u043e\u0447\u043d\u0438\u0442\u0435 rtsp \u0440\u0435\u0441\u0443\u0440\u0441\u0438 \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u044f\u0442 \u0432 QT Src \u043f\u043e\u043b\u0435\u0442\u043e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0437\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438.\\n\u0422\u0440\u044f\u0431\u0432\u0430 \u0441\u044a\u0449\u043e \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0435 \u043f\u043e\u0442\u043e\u0447\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0432 Src \u043f\u043e\u043b\u0435\u0442\u043e..",qtsrc:"QT Src",progress:"\u041f\u0440\u043e\u0433\u0440\u0435\u0441",sound:"\u0417\u0432\u0443\u043a",swstretchvalign:"\u0420\u0430\u0437\u043f\u044a\u0432\u0430\u043d\u0435 V-Align",swstretchhalign:"\u0420\u0430\u0437\u043f\u044a\u0432\u0430\u043d\u0435 H-Align",swstretchstyle:"\u0421\u0442\u0438\u043b \u043d\u0430 \u0440\u0430\u0437\u043f\u044a\u0432\u0430\u043d\u0435",scriptcallbacks:"Script callbacks",align_top_right:"\u0413\u043e\u0440\u0435 \u0434\u044f\u0441\u043d\u043e",uimode:"UI \u0440\u0435\u0436\u0438\u043c",rate:"\u0411\u044a\u0440\u0437\u0438\u043d\u0430",playcount:"\u0411\u0440\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f",defaultframe:"\u041d\u0430\u0447\u0430\u043b\u0435\u043d \u043a\u0430\u0434\u044a\u0440",currentposition:"\u0422\u0435\u043a\u0443\u0449\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f",currentmarker:"\u0422\u0435\u043a\u0443\u0449 \u043c\u0430\u0440\u043a\u0435\u0440",captioningid:"Captioning id",baseurl:"\u0411\u0430\u0437\u043e\u0432\u043e URL",balance:"\u0411\u0430\u043b\u0430\u043d\u0441",windowlessvideo:"\u0412\u0438\u0434\u0435\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446",stretchtofit:"\u0420\u0430\u0437\u043f\u044a\u043d\u0438",mute:"\u0417\u0430\u0433\u043b\u0443\u0448\u0438",invokeurls:"Invoke URLs",fullscreen:"\u0426\u044f\u043b \u0435\u043a\u0440\u0430\u043d",enabled:"\u0412\u043a\u043b\u044e\u0447\u0435\u043d",autostart:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435",volume:"\u0421\u0438\u043b\u0430 \u043d\u0430 \u0437\u0432\u0443\u043a\u0430",target:"\u0426\u0435\u043b",qtsrcchokespeed:"\u041f\u0440\u0435\u0434\u0435\u043b\u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442",href:"Href",endtime:"\u0412\u0440\u0435\u043c\u0435 \u0437\u0430 \u043a\u0440\u0430\u0439",starttime:"\u0412\u0440\u0435\u043c\u0435 \u0437\u0430 \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435",enablejavascript:"\u0412\u043a\u043b\u044e\u0447\u0438 JavaScript",correction:"\u0411\u0435\u0437 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438",targetcache:"\u0426\u0435\u043b\u0435\u0432\u0438 \u043a\u0435\u0448",playeveryframe:"\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u0439 \u0432\u0441\u0435\u043a\u0438 \u043a\u0430\u0434\u044a\u0440",kioskmode:"Kiosk \u0440\u0435\u0436\u0438\u043c",controller:"\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440",menu:"\u041f\u043e\u043a\u0430\u0436\u0438 \u043c\u0435\u043d\u044e",loop:"\u041f\u043e\u0432\u0442\u0430\u0440\u044f\u0439",play:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435",hspace:"H-Space",vspace:"V-Space",class_name:"\u041a\u043b\u0430\u0441",name:"\u0418\u043c\u0435",id:"Id",type:"\u0422\u0438\u043f",size:"\u0420\u0430\u0437\u043c\u0435\u0440\u0438",preview:"\u041f\u0440\u0435\u0433\u043b\u0435\u0434",constrain_proportions:"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438\u0442\u0435",controls:"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",numloop:"\u0411\u0440\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f",console:"\u041a\u043e\u043d\u0437\u043e\u043b\u0430",cache:"\u041a\u0435\u0448",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"\u041e\u0441\u043d\u043e\u0432\u0430",bgcolor:"\u0424\u043e\u043d",wmode:"WMode",salign:"SAlign",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",scale:"\u041f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u0438",quality:"\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e",shuffle:"\u0420\u0430\u0437\u0431\u044a\u0440\u043a\u0430\u0439",prefetch:"\u0421\u0432\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u043d\u043e",nojava:"\u0411\u0435\u0437 JAVA",maintainaspect:"\u041f\u043e\u0434\u0434\u044a\u0440\u0436\u0430\u0439 \u0441\u044a\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u0442\u043e",imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",center:"\u0426\u0435\u043d\u0442\u044a\u0440",autogotourl:"\u041e\u0442\u0438\u0434\u0438 \u043d\u0430 URL",shockwave_options:"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Shockwave",rmp_options:"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Real media player",wmp_options:"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Windows media player",qt_options:"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Quicktime",flash_options:"\u041e\u043f\u0446\u0438\u0438 \u0437\u0430 Flash",hidden:"\u0421\u043a\u0440\u0438\u0442",align_bottom_left:"\u0414\u043e\u043b\u0443 \u043b\u044f\u0432\u043e",align_bottom_right:"\u0414\u043e\u043b\u0443 \u0434\u044f\u0441\u043d\u043e",flv_options:"\u0412\u0438\u0434\u0435\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430 Flash",flv_scalemode:"\u0420\u0435\u0436\u0438\u043c \u043d\u0430 \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435",flv_buffer:"\u0411\u0443\u0444\u0435\u0440",flv_startimage:"\u041d\u0430\u0447\u0430\u043b\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",flv_starttime:"\u041d\u0430\u0447\u0430\u043b\u043d\u043e \u0432\u0440\u0435\u043c\u0435",flv_defaultvolume:"\u0421\u0438\u043b\u0430 \u043d\u0430 \u0437\u0432\u0443\u043a\u0430 \u043f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",flv_hiddengui:"\u0421\u043a\u0440\u0438\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",flv_autostart:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u043d \u0441\u0442\u0430\u0440\u0442",flv_loop:"\u041f\u043e\u0432\u0442\u0430\u0440\u044f\u0439",flv_showscalemodes:"\u041f\u043e\u043a\u0430\u0436\u0438 \u0440\u0435\u0436\u0438\u043c\u0438\u0442\u0435 \u043d\u0430 \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435",flv_smoothvideo:"\u0413\u043b\u0430\u0434\u043a\u043e \u0432\u0438\u0434\u0435\u043e",flv_jscallback:"JS \u043f\u043e\u0434\u0434\u0440\u044a\u0436\u043a\u0430"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/bn_dlg.js b/js/tiny_mce/plugins/media/langs/bn_dlg.js new file mode 100755 index 000000000..9c4bdd847 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.media_dlg',{list:"\u09b2\u09bf\u09b8\u09cd\u099f",file:"\u09ab\u09be\u0987\u09b2/\u0987\u0989 \u0986\u09b0 \u098f\u09b2",advanced:"\u098f\u09a1\u09ad\u09be\u09a8\u09cd\u09b8\u09a1",general:"\u099c\u09c7\u09a8\u09be\u09b0\u09c7\u09b2",title:"\u0987\u09a8\u09b8\u09be\u09b0\u09cd\u099f/ \u098f\u09ae\u09ac\u09c7\u09a1\u09c7\u09a1 \u09ae\u09bf\u09a1\u09bf\u09df\u09be \u098f\u09a1\u09bf\u099f \u0995\u09b0\u09be","align_top_left":"\u0989\u09aa\u09b0\u09c7\u09b0 \u09ac\u09be\u09ae \u0995\u09cb\u09a8\u09c7","align_center":"\u09ae\u09be\u099d\u0996\u09be\u09a8\u09c7","align_left":"\u09ac\u09be\u09ae\u09c7","align_bottom":"\u09a8\u09bf\u099a\u09c7","align_right":"\u09a1\u09be\u09a8\u09c7","align_top":"\u0989\u09aa\u09b0\u09c7","qt_stream_warn":"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks","align_top_right":"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL","shockwave_options":"Shockwave options","rmp_options":"Real media player options","wmp_options":"Windows media player options","qt_options":"Quicktime options","flash_options":"Flash options",hidden:"Hidden","align_bottom_left":"Bottom left","align_bottom_right":"Bottom right","flv_options":"Flash video options","flv_scalemode":"Scale mode","flv_buffer":"Buffer","flv_startimage":"Start image","flv_starttime":"Start time","flv_defaultvolume":"Default volumne","flv_hiddengui":"Hidden GUI","flv_autostart":"Auto start","flv_loop":"Loop","flv_showscalemodes":"Show scale modes","flv_smoothvideo":"Smooth video","flv_jscallback":"JS Callback","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/br_dlg.js b/js/tiny_mce/plugins/media/langs/br_dlg.js new file mode 100755 index 000000000..437a7d770 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.media_dlg',{list:"Lista",file:"Arquivo/URL",advanced:"Avan\u00e7ado",general:"Geral",title:"Inserir/Editar m\u00eddia incorporada",align_top_left:"Topo \u00e0\u00a0 esquerda",align_center:"Centro",align_left:"Esquerda",align_bottom:"Abaixo",align_right:"Direita",align_top:"Topo",qt_stream_warn:"Fluxos de recursos rtsp devem ser acrescentados ao campo QT Src no Modo Avan\u00e7ado.\\NUma vers\u00e3o sem fluxo tamb\u00e9m deve ser acrescentada ao campo Src.",qtsrc:"QT Src",progress:"Progresso",sound:"Som",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"callbacks de script",align_top_right:"Topo \u00e0\u00a0 direita",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Frame padr\u00e3o",currentposition:"Posi\u00e7\u00e3o actual",currentmarker:"Marcador actual",captioningid:"Id de legenda",baseurl:"Base URL",balance:"Stereo",windowlessvideo:"V\u00eddeo sem janela",stretchtofit:"Estender",mute:"Mudo",invokeurls:"Invocar URLs",fullscreen:"Ecr\u00e3 inteiro",enabled:"Activado",autostart:"Execu\u00e7\u00e3o autom\u00e1tica",volume:"Volume",target:"Alvo",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Hora do fim",starttime:"Hora de in\u00edcio",enablejavascript:"Disponibilizar javaScript",correction:"Sem correc\u00e7\u00f5es",targetcache:"Cache alvo",playeveryframe:"Executar todas as frames",kioskmode:"Modo Quiosque",controller:"Controlador",menu:"Mostrar menu",loop:"Repeti\u00e7\u00e3o autom\u00e1tica",play:"Execu\u00e7\u00e3o autom\u00e1tica",hspace:"Espa\u00e7o horizontal",vspace:"Espa\u00e7o vertical",class_name:"Classe",name:"Nome",id:"Id",type:"Tipo",size:"Dimens\u00f5es",preview:"Previs\u00e3o",constrain_proportions:"Manter propor\u00e7\u00f5es",controls:"Controles",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Fundo",wmode:"WMode",salign:"SAlign",align:"Alinhamento",scale:"Escala",quality:"Qualidade",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Centro",autogotourl:"Auto goto URL",shockwave_options:"Op\u00e7\u00f5es Shockwave",rmp_options:"Op\u00e7\u00f5es Real Media Player",wmp_options:"Op\u00e7\u00f5es Windows Media Player",qt_options:"Op\u00e7\u00f5es Quicktime",flash_options:"Op\u00e7\u00f5es Flash",hidden:"Oculto",align_bottom_left:"Abaixo \u00e0\u00a0 esquerda",align_bottom_right:"Abaixo \u00e0\u00a0 direita",flv_options:"Op\u00e7\u00f5es de Flash video",flv_scalemode:"Modo escala",flv_buffer:"Buffer",flv_startimage:"Imagem inicial",flv_starttime:"Hora inicial",flv_defaultvolume:"Volume padr\u00e3o",flv_hiddengui:"GUI oculta",flv_autostart:"Execu\u00e7\u00e3o Autom\u00e1tica",flv_loop:"Loop",flv_showscalemodes:"Mostrar modos escala",flv_smoothvideo:"Smooth video",flv_jscallback:"JS callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/bs_dlg.js b/js/tiny_mce/plugins/media/langs/bs_dlg.js new file mode 100755 index 000000000..36435b4b5 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ca_dlg.js b/js/tiny_mce/plugins/media/langs/ca_dlg.js new file mode 100755 index 000000000..d10ef41d6 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.media_dlg',{list:"Llista",file:"Fitxer/URL",advanced:"Avan\u00e7at",general:"General",title:"Insereix / edita multim\u00e8dia incrustada","align_top_left":"Superior esquerra","align_center":"Centre","align_left":"Esquerra","align_bottom":"Inferior","align_right":"Dreta","align_top":"Superior","qt_stream_warn":"Els recursos rtsp fets flux s\'haurien d\'afegir al camp QT Src sota la pestanya avan\u00e7ada.\\nTamb\u00e9 haur\u00edeu d\'afegir una versi\u00f3 no feta flux al camp Src..",qtsrc:"QT Src",progress:"Progr\u00e9s",sound:"S\u00f2",swstretchvalign:"Alineaci\u00f3 vertical de l\'extensor",swstretchhalign:"Alineaci\u00f3 horitzontal de l\'extensor",swstretchstyle:"Estil de l\'extensor",scriptcallbacks:"Crides de retorn a script","align_top_right":"Superior dreta",uimode:"Mode UI",rate:"Velocitat",playcount:"Compte de reproducci\u00f3",defaultframe:"Marc per defecte",currentposition:"Posici\u00f3 actual",currentmarker:"Retolador actual",captioningid:"Id nominal",baseurl:"URL base",balance:"Equilibri",windowlessvideo:"V\u00eddeo sense finestra",stretchtofit:"Estirar fins a encaixar",mute:"Silenci",invokeurls:"Invoca els URL",fullscreen:"Pantalla completa",enabled:"Habilitat",autostart:"Inici autom\u00e0tic",volume:"Volumen",target:"Dest\u00ed",qtsrcchokespeed:"Velocitat",href:"Href",endtime:"Fi",starttime:"Inici",enablejavascript:"Habilita el javascript",correction:"Sense correcci\u00f3",targetcache:"Target cache",playeveryframe:"Reprodueix cada marc",kioskmode:"Mode quiosc",controller:"Controlador",menu:"Mostra el men\u00fa",loop:"Bucle",play:"Reproducci\u00f3 autom\u00e0tica",hspace:"Espai horitzontal",vspace:"Espai vertical","class_name":"Classe",name:"Nom",id:"Id",type:"Tipus",size:"Dimensions",preview:"Previsualitzaci\u00f3","constrain_proportions":"Mant\u00e9 les proporcions",controls:"Controls",numloop:"Nre. bucles",console:"Consola",cache:"Mem\u00f2ria cau",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Fons",wmode:"Mode W",salign:"Alinea S",align:"Alinea",scale:"Escala",quality:"Qualitat",shuffle:"Shuffle",prefetch:"Prec\u00e0rrega",nojava:"Sense java",maintainaspect:"Mant\u00e9 l\'aspecte",imagestatus:"Estat de la imatge",center:"Alinea al centre",autogotourl:"URL goto autom\u00e0tic","shockwave_options":"Opcions del Shockwave","rmp_options":"Opcions del Real media player","wmp_options":"Opcions del Windows media player","qt_options":"Opcions del Quicktime","flash_options":"Opcions del Flash",hidden:"Ocult","align_bottom_left":"Inferior esquerra","align_bottom_right":"Inferior dreta","flv_options":"Opcions de v\u00eddeo Flash","flv_scalemode":"Mode d\'escalat","flv_buffer":"Mem\u00f2ria interm\u00e8dia","flv_startimage":"Imatge d\'inici","flv_starttime":"Hora d\'inici","flv_defaultvolume":"Volumen per defecte","flv_hiddengui":"GUI ocult","flv_autostart":"Inici autom\u00e0tic","flv_loop":"Bucle","flv_showscalemodes":"Mostra els modes d\'escalat","flv_smoothvideo":"V\u00eddeo suau","flv_jscallback":"Crida de retorn JS","html5_video_options":"Opcions de v\u00eddeo HTML5",altsource1:"Font alternatiu 1",altsource2:"Font alternatiu 2",preload:"Pre-c\u00e0rrega",poster:"Anunci",source:"Font"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ch_dlg.js b/js/tiny_mce/plugins/media/langs/ch_dlg.js new file mode 100755 index 000000000..b5baf9e1b --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.media_dlg',{list:"\u5217\u8868",file:"\u5a92\u4f53URL",advanced:"\u9ad8\u7ea7",general:"\u4e00\u822c",title:"\u63d2\u5165/\u7f16\u8f91\u5a92\u4f53",align_top_left:"\u5de6\u4e0a",align_center:"\u7f6e\u4e2d",align_left:"\u9760\u5de6",align_bottom:"\u9760\u4e0b",align_right:"\u9760\u53f3",align_top:"\u9760\u4e0a",qt_stream_warn:"\u4e32\u6d41\u5a92\u4f53rtsp\u8d44\u6e90\u5e94\u8be5\u52a0\u5230\u300c\u9ad8\u7ea7\u300d\u4e2dQT src. \\n\u540c\u65f6\u589e\u52a0\u975e\u4e32\u6d41\u5a92\u4f53\u8d44\u6e90\u5230src.",qtsrc:"QT Src",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u7f29\u653e\u81f3\u5782\u76f4\u5bf9\u9f50",swstretchhalign:"\u7f29\u653e\u81f3\u6c34\u5e73\u5bf9\u9f50",swstretchstyle:"\u7f29\u653e\u6837\u5f0f",scriptcallbacks:"Script \u553f\u53eb",align_top_right:"\u53f3\u4e0a",uimode:"\u9762\u677f\u6a21\u5f0f",rate:"\u6bd4\u7387",playcount:"\u64ad\u653e\u6b21\u6570",defaultframe:"\u9884\u8bbe\u753b\u9762",currentposition:"\u76ee\u524d\u4f4d\u7f6e",currentmarker:"\u76ee\u524d\u6807\u8bb0",captioningid:"\u5b57\u5e55\u7f16\u53f7",baseurl:"\u57fa\u5e95 URL",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u89c6\u7a97\u64ad\u653e",stretchtofit:"\u7f29\u653e\u81f3\u6700\u4f73\u5927\u5c0f",mute:"\u9759\u97f3",invokeurls:"\u5f15\u7528\u7684 URLs",fullscreen:"\u5168\u8424\u5e55",enabled:"\u53ef\u7528",autostart:"\u81ea\u52a8\u64ad\u653e",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"\u963b\u585e\u901f\u5ea6",href:"\u8d85\u8fde\u7ed3",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528 JavaScript",correction:"\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u9010\u683c\u64ad\u653e",kioskmode:"Kiosk\u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u9009\u9879",loop:"\u5faa\u73af",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",class_name:"\u7c7b\u522b",name:"\u540d\u79f0",id:"ID",type:"\u7c7b\u578b",size:"\u5927\u5c0f",preview:"\u9884\u89c8",constrain_proportions:"\u7ea6\u675f\u6bd4\u4f8b",controls:"\u63a7\u5236",numloop:"\u5faa\u73af\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash \u53d8\u91cf",base:"\u57fa\u5e95",bgcolor:"\u80cc\u666f\u8272",wmode:"\u89c6\u7a97\u6a21\u5f0f",salign:"SAlign",align:"\u5bf9\u9f50",scale:"\u7f29\u653e",quality:"\u54c1\u8d28",shuffle:"\u968f\u673a",prefetch:"\u9884\u8f7d",nojava:"No Java",maintainaspect:"\u9501\u5b9a\u6bd4\u4f8b",imagestatus:"\u56fe\u7247\u72b6\u6001",center:"\u7f6e\u4e2d",autogotourl:"\u81ea\u52a8\u8f6c\u81f3 URL",shockwave_options:"Shockwave \u9009\u9879",rmp_options:"Real Media Player \u9009\u9879",wmp_options:"Windows Media Player \u9009\u9879",qt_options:"Quick Time \u9009\u9879",flash_options:"Flash \u9009\u9879",hidden:"\u9690\u85cf",align_bottom_left:"\u5de6\u4e0b",align_bottom_right:"\u53f3\u4e0b",flv_options:"Flash\u5f71\u7247\u9009\u9879",flv_scalemode:"\u7f29\u653e\u6a21\u5f0f",flv_buffer:"\u7f13\u51b2\u533a",flv_startimage:"\u5f00\u59cb\u753b\u9762",flv_starttime:"\u5f00\u59cb\u65f6\u95f4",flv_defaultvolume:"\u9884\u8bbe\u97f3\u91cf",flv_hiddengui:"\u9690\u85cf GUI",flv_autostart:"\u81ea\u52a8\u64ad\u653e",flv_loop:"\u5faa\u73af",flv_showscalemodes:"\u663e\u793a\u7f29\u653e\u6a21\u5f0f",flv_smoothvideo:"\u5e73\u6ed1\u64ad\u653e",flv_jscallback:"Script \u553f\u53eb"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/cn_dlg.js b/js/tiny_mce/plugins/media/langs/cn_dlg.js new file mode 100755 index 000000000..4432e2e5a --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6\u4f4d\u7f6e/URL",advanced:"\u9ad8\u7ea7",general:"\u5e38\u89c4",title:"\u63d2\u5165/\u7f16\u8f91\u5d4c\u5165\u5f0f\u5a92\u4f53","align_top_left":"\u5de6\u4e0a","align_center":"\u5c45\u4e2d","align_left":"\u5c45\u5de6","align_bottom":"\u5c45\u4e0b","align_right":"\u5c45\u53f3","align_top":"\u5c45\u4e0a","qt_stream_warn":"\u6d41\u5a92\u4f53\u7684RTSP\u8d44\u6e90\u5e94\u6dfb\u52a0\u5230\u5728\u9ad8\u7ea7\u9009\u9879\u5361\u7684Qt src\u5b57\u6bb5\u3002\\ n\u60a8\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u975e\u6d41\u5a92\u4f53\u7248\u672c\u7684",qtsrc:"QuickTime\u6e90\u6587\u4ef6",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u7f29\u653e\u81f3\u5782\u76f4\u5bf9\u9f50",swstretchhalign:"\u7f29\u653e\u81f3\u6c34\u5e73\u5bf9\u9f50",swstretchstyle:"\u7f29\u653e\u6837\u5f0f",scriptcallbacks:"\u811a\u672c\u8fd4\u56de","align_top_right":"\u53f3\u4e0a",uimode:"\u9762\u677f\u6a21\u5f0f",rate:"\u6bd4\u7279\u7387",playcount:"\u64ad\u653e\u6b21\u6570",defaultframe:"\u9884\u8bbe\u753b\u9762",currentposition:"\u5f53\u524d\u4f4d\u7f6e",currentmarker:"\u5f53\u524d\u6807\u8bc6",captioningid:"\u5b57\u5e55\u6807\u8bc6",baseurl:"\u57fa\u672cURL",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u89c6\u7a97\u64ad\u653e",stretchtofit:"\u7f29\u653e\u81f3\u6700\u4f73\u5927\u5c0f",mute:"\u9759\u97f3",invokeurls:"\u5f15\u7528\u7684 URLs",fullscreen:"\u5168\u5c4f",enabled:"\u53ef\u7528",autostart:"\u81ea\u52a8\u64ad\u653e",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"\u963b\u585e\u901f\u5ea6",href:"\u8d85\u94fe\u63a5",endtime:"\u5f00\u59cb\u65f6\u95f4",starttime:"\u7ed3\u675f\u65f6\u95f4",enablejavascript:"\u542f\u7528JavaScript",correction:"\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u9010\u5e27\u64ad\u653e",kioskmode:"Kiosk\u6a21\u5f0f",controller:"\u63a7\u5236\u5668",menu:"\u663e\u793a\u83dc\u5355",loop:"\u5faa\u73af",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd","class_name":"\u7c7b\u522b",name:"\u540d\u79f0",id:"Id\u7f16\u53f7",type:"\u5a92\u4f53\u7c7b\u578b",size:"\u5c3a\u5bf8",preview:"\u9884\u89c8","constrain_proportions":"\u7ea6\u675f\u6bd4\u4f8b",controls:"\u63a7\u4ef6",numloop:"\u5faa\u73af\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"\u81ea\u52a8\u94fe\u63a5",liveconnect:"SWLiveConnect\u5c5e\u6027",flashvars:"Flash\u53c2\u6570",base:"\u57fa\u5e95",bgcolor:"\u80cc\u666f",wmode:"\u7a97\u53e3\u6a21\u5f0f",salign:"SAlign\u53c2\u6570",align:"\u5bf9\u9f50",scale:"\u7f29\u653e",quality:"\u54c1\u8d28",shuffle:"\u968f\u673a",prefetch:"\u9884\u8f7d",nojava:"\u5173\u95edjava",maintainaspect:"\u9501\u5b9a\u6bd4\u4f8b",imagestatus:"\u56fe\u7247\u72b6\u6001",center:"\u5c45\u4e2d",autogotourl:"\u81ea\u52a8\u8f6c\u81f3 URL","shockwave_options":"Shockwave\u9009\u9879","rmp_options":"Real media player\u9009\u9879","wmp_options":"Windows media player\u9009\u9879","qt_options":"Quicktime\u9009\u9879","flash_options":"Flash\u9009\u9879",hidden:"\u9690\u85cf","align_bottom_left":"\u5de6\u4e0b","align_bottom_right":"\u53f3\u4e0b","flv_options":"Flash video\u9009\u9879","flv_scalemode":"\u7f29\u653e\u6a21\u5f0f","flv_buffer":"\u7f13\u51b2\u5927\u5c0f","flv_startimage":"\u5f00\u59cb\u56fe\u7247","flv_starttime":"\u5f00\u59cb\u65f6\u95f4","flv_defaultvolume":"\u521d\u59cb\u97f3\u91cf\u5927\u5c0f","flv_hiddengui":"\u9690\u85cf\u63a7\u4ef6","flv_autostart":"\u81ea\u52a8\u5f00\u59cb","flv_loop":"\u5faa\u73af\u64ad\u653e","flv_showscalemodes":"\u663e\u793a\u7f29\u653e\u6a21\u5f0f","flv_smoothvideo":"\u5e73\u6ed1\u64ad\u653e","flv_jscallback":"JS\u8fd4\u56de","html5_video_options":"HTML5 Video\u9009\u9879",altsource1:"\u66ff\u4ee3\u6765\u6e90 1",altsource2:"\u66ff\u4ee3\u6765\u6e90 2",preload:"\u9884\u8f7d",poster:"\u6807\u8bed",source:"\u6e90\u4ee3\u7801"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/cs_dlg.js b/js/tiny_mce/plugins/media/langs/cs_dlg.js new file mode 100755 index 000000000..2527e0297 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.media_dlg',{list:"Seznam",file:"Soubor/URL",advanced:"Roz\u0161\u00ed\u0159en\u00e9",general:"Obecn\u00e9",title:"Vlo\u017eit/upravit vkl\u00e1dan\u00e1 m\u00e9dia",align_top_left:"Nahoru vlevo",align_center:"Na st\u0159ed",align_left:"Vlevo",align_bottom:"Dol\u016f",align_right:"Vpravo",align_top:"Nahoru",qt_stream_warn:"Streamovan\u00e9 rtsp zdroje mohou b\u00fdt p\u0159id\u00e1ny do pole \'Soubor/URL streamu pro QT\' na z\u00e1lo\u017ece \'Roz\u0161\u00ed\u0159en\u00e9\'.\\nYM\u016f\u017eete tak\u00e9 p\u0159idat nestreamovanou verzi do pole \'Soubor/URL\'.",qtsrc:"Soubor/URL streamu pro QT",progress:"Pr\u016fb\u011bh",sound:"Zvuk",swstretchvalign:"Zarovn\u00e1n\u00ed vert. rozta\u017een\u00ed",swstretchhalign:"Zarovn\u00e1n\u00ed horiz. rozta\u017een\u00ed",swstretchstyle:"Styl rozta\u017een\u00ed",scriptcallbacks:"Skripty zp\u011btn\u00fdch vol\u00e1n\u00ed",align_top_right:"Nahoru vpravo",uimode:"Re\u017eim ovl\u00e1dac\u00edho panelu",rate:"Relativn\u00ed rychlost",playcount:"Po\u010det p\u0159ehr\u00e1n\u00ed",defaultframe:"V\u00fdchoz\u00ed sn\u00edmek",currentposition:"Aktu\u00e1ln\u00ed pozice",currentmarker:"Aktu\u00e1ln\u00ed z\u00e1lo\u017eka",captioningid:"ID popisku m\u00e9dia",baseurl:"Z\u00e1kladn\u00ed URL",balance:"Vyv\u00e1\u017een\u00ed",windowlessvideo:"Video bez okna",stretchtofit:"Rozt\u00e1hnout do okna",mute:"Ztlumit",invokeurls:"Po\u017eadovat URL",fullscreen:"Cel\u00e1 obrazovka",enabled:"Povolit ovl\u00e1dac\u00ed panel",autostart:"Automatick\u00e9 spu\u0161t\u011bn\u00ed",volume:"Hlasitost",target:"C\u00edl",qtsrcchokespeed:"Sn\u00ed\u017een\u00ed rychlosti",href:"Odkaz",endtime:"\u010cas ukon\u010den\u00ed",starttime:"Po\u010d\u00e1te\u010dn\u00ed \u010das",enablejavascript:"Povolit Javascript",correction:"Bez korekc\u00ed",targetcache:"C\u00edlov\u00e1 mezipam\u011b\u0165",playeveryframe:"P\u0159ehr\u00e1t ka\u017ed\u00fd sn\u00edmek",kioskmode:"Zak\u00e1zat ukl\u00e1d\u00e1n\u00ed",controller:"Ovl\u00e1dac\u00ed panel",menu:"Zobrazit nab\u00eddku",loop:"Opakov\u00e1n\u00ed",play:"Automatick\u00e9 p\u0159ehr\u00e1v\u00e1n\u00ed",hspace:"Horizont\u00e1ln\u00ed odsazen\u00ed",vspace:"Vertik\u00e1ln\u00ed odsazen\u00ed",class_name:"T\u0159\u00edda",name:"N\u00e1zev",id:"ID",type:"Typ",size:"Rozm\u011bry",preview:"N\u00e1hled",constrain_proportions:"Zachovat proporce",controls:"Ovl\u00e1dac\u00ed panel",numloop:"Po\u010det opakov\u00e1n\u00ed",console:"Konzola",cache:"Mezipam\u011b\u0165",autohref:"Automatick\u00e9 na\u010dten\u00ed",liveconnect:"Spustit Javu (SWLiveConnect)",flashvars:"Parametry (Flashvars)",base:"Z\u00e1kladn\u00ed slo\u017eka",bgcolor:"Pozad\u00ed",wmode:"Re\u017eim okna",salign:"Zarovn\u00e1n\u00ed okna",align:"Zarovn\u00e1n\u00ed",scale:"Pom\u011br",quality:"Kvalita",shuffle:"N\u00e1hodn\u011b",prefetch:"P\u0159edna\u010dten\u00ed",nojava:"Nespout\u011bt Javu",maintainaspect:"Zachovat pom\u011br stran",imagestatus:"Stav obrazu",center:"Na st\u0159ed",autogotourl:"Automatick\u00fd p\u0159echod na URL",shockwave_options:"Mo\u017enosti Shockwave",rmp_options:"Mo\u017enosti p\u0159ehr\u00e1va\u010de Real media",wmp_options:"Mo\u017enosti p\u0159ehr\u00e1va\u010de Windows media",qt_options:"Mo\u017enosti Quicktime",flash_options:"Mo\u017enosti Flashe",hidden:"Skr\u00fdt",align_bottom_left:"Dol\u016f vlevo",align_bottom_right:"Dol\u016f vpravo",flv_options:"Mo\u017enosti Flash video",flv_scalemode:"Zm\u011bna velikosti",flv_buffer:"Z\u00e1sobn\u00edk",flv_startimage:"Po\u010d\u00e1te\u010dn\u00ed obr\u00e1zek",flv_starttime:"Po\u010d\u00e1te\u010dn\u00ed \u010das",flv_defaultvolume:"V\u00fdchoz\u00ed hlasitost",flv_hiddengui:"Skryt\u00fd ovl\u00e1dac\u00ed panel",flv_autostart:"Automatick\u00e9 spu\u0161t\u011bn\u00ed",flv_loop:"Opakov\u00e1n\u00ed",flv_showscalemodes:"Zobrazit volby zm\u011bny velikosti",flv_smoothvideo:"Vyhlazen\u00e9 video",flv_jscallback:"Zp\u011btn\u00e9 vol\u00e1n\u00ed Javascriptu",html5_video_options:"Mo\u017enosti HTML5 video",altsource1:"Alternativn\u00ed zdroj 1",altsource2:"Alternativn\u00ed zdroj 2",preload:"P\u0159edna\u010d\u00edst",poster:"Obr\u00e1zek (zobraz\u00ed se p\u0159i nedostupnosti videa)",source:"Zdroj"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/cy_dlg.js b/js/tiny_mce/plugins/media/langs/cy_dlg.js new file mode 100755 index 000000000..b731a8adf --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.media_dlg',{list:"Rhestr",file:"Ffeil/URL",advanced:"Uwch",general:"Cyffredinol",title:"Mewnosod / golygu cyfrwng planedig",align_top_left:"Pen canol",align_center:"Canol",align_left:"Chwith",align_bottom:"Gwaelod",align_right:"De",align_top:"Pen",qt_stream_warn:"Dylai adnoddau RTSP ffrydio cael eu ychwanegu i\'r maes Fynhonell QT o dan y tab Uwch.\\n Dylai chi hefyd ychwanegu fersiwn heb-ffrydio i\'r maes Fynhonell.",qtsrc:"Fynhonell QT",progress:"Cynnydd",sound:"Sain",swstretchvalign:"Aliniad fertigol ymestyn",swstretchhalign:"Aliniad llorweddol ymestyn",swstretchstyle:"Arddull ymestyn",scriptcallbacks:"N\u00f4l-galwadau sgript",align_top_right:"Pen dde",uimode:"Modd UI",rate:"Cyfradd",playcount:"Cyfrif chwarae",defaultframe:"Ffr\u00e2m rhagosodedig",currentposition:"Lleoliad cyfredol",currentmarker:"Marciwr cyfredol",captioningid:"Id egluro",baseurl:"URL seiledig",balance:"Cydbwysedd",windowlessvideo:"Fideo heb-ffenest",stretchtofit:"Ymestun i ffitio",mute:"Mudo",invokeurls:"Defnyddio URLs",fullscreen:"Sgrin llawn",enabled:"Wedi\'i galluogi",autostart:"Awto-cychwyn",volume:"Cyfrol",target:"Targed",qtsrcchokespeed:"Tagu cyflymder",href:"Href",endtime:"Amser gorffen",starttime:"Amser dechrae",enablejavascript:"Galluogi JavaScript",correction:"Dim cywiriad",targetcache:"Storfa targed",playeveryframe:"Chwarae pob ffr\u00e2m",kioskmode:"Modd ciosk",controller:"Rheolydd",menu:"Dangos dewislen",loop:"Dolen",play:"Awto-chwarae",hspace:"Gofod llorweddol",vspace:"Gofod fertigol",class_name:"Dosbarth",name:"Enw",id:"Id",type:"Math",size:"Dimensiynau",preview:"Rhagolygu",constrain_proportions:"Cynfyngu cyfraneddau",controls:"Rheolyddion",numloop:"Nifer o dolenau",console:"Consol",cache:"Storfa",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Sail",bgcolor:"Cefndir",wmode:"Modd-W",salign:"Alinio-S",align:"Alinio",scale:"Gradd",quality:"Ansawdd",shuffle:"Cymysgu",prefetch:"Cyn-n\u00f4l",nojava:"Dim java",maintainaspect:"Cynnal agwedd",imagestatus:"Statws delwedd",center:"Canol",autogotourl:"URL awto-mynd-i",shockwave_options:"Dewisiadau Shockwave",rmp_options:"Dewisiadau Real Media Player",wmp_options:"Dewisiadau Windows Media Player",qt_options:"Dewisiadau Quicktime",flash_options:"Dewisiadau Flash",hidden:"Wedi\'i cuddio",align_bottom_left:"Gwaelod chwith",align_bottom_right:"Gwaelod dde",flv_options:"Dewisiadau fideo Flash",flv_scalemode:"Modd graddfa",flv_buffer:"Buffer",flv_startimage:"Delwedd cychwyn",flv_starttime:"Amser cychwyn",flv_defaultvolume:"Cyfrol rhagosodedig",flv_hiddengui:"GUI wedi\'i cuddio",flv_autostart:"Awto-cychwyn",flv_loop:"Doleni",flv_showscalemodes:"Dangos moddau graddfa",flv_smoothvideo:"Fideo llyfn",flv_jscallback:"N\u00f4l-galwad JS"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/da_dlg.js b/js/tiny_mce/plugins/media/langs/da_dlg.js new file mode 100755 index 000000000..471139b34 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.media_dlg',{list:"Liste",file:"Fil/URL",advanced:"Avanceret",general:"Generelt",title:"Inds\u00e6t/rediger indlejret mediefil",align_top_left:"\u00d8verste venstre hj\u00f8rne",align_center:"Centreret",align_left:"Venstre",align_bottom:"Bund",align_right:"H\u00f8jret",align_top:"Top",qt_stream_warn:"Streamede rtsp resourcer skal tilf\u00f8jes til QT Src feltet under tabben avanceret.\\nDu skal ogs\u00e5 tilf\u00f8je en ikke streamet version til Src feltet..",qtsrc:"QT Src",progress:"Fremskridt",sound:"Lyd",swstretchvalign:"Str\u00e6k V-justering",swstretchhalign:"Str\u00e6k H-justering",swstretchstyle:"Str\u00e6k stil",scriptcallbacks:"Script callbacks",align_top_right:"\u00d8verste h\u00f8jre hj\u00f8rne",uimode:"UI-tilstand",rate:"Vurder",playcount:"Afspil indhold",defaultframe:"Standard ramme",currentposition:"Aktuel position",currentmarker:"Aktuel mark\u00f8r",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Vinduesl\u00f8s video",stretchtofit:"Str\u00e6k for at tilpasse",mute:"Lydl\u00f8s",invokeurls:"Aktiver URL\'er",fullscreen:"Fulssk\u00e6rm",enabled:"Valgt",autostart:"Afspil automatisk",volume:"Lydstyrke",target:"M\u00e5l",qtsrcchokespeed:"Choke-hastighed",href:"Href",endtime:"Sluttidspunkt",starttime:"Starttidspunkt",enablejavascript:"Tillad JavaScript",correction:"Ingen korrektion",targetcache:"M\u00e5l-cache",playeveryframe:"Afsplil alle rammer",kioskmode:"Kiosk-tilstand",controller:"Controller",menu:"Vis menu",loop:"Gentag",play:"Start",hspace:"H-afstand",vspace:"V-afstand",class_name:"Klasse",name:"Navn",id:"Id",type:"Type",size:"Dimensioner",preview:"Vis udskrift",constrain_proportions:"Bevar proportioner",controls:"Kontroller",numloop:"Antal loops",console:"Konsol",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Baggrund",wmode:"WMode",salign:"SAlign",align:"Juster",scale:"Skaler",quality:"Kvalitet",shuffle:"Bland",prefetch:"Forh\u00e5ndshent",nojava:"Ingen java",maintainaspect:"Bevar aspekt",imagestatus:"Billedstatus",center:"Center",autogotourl:"Auto g\u00e5 til URL",shockwave_options:"Shockwave options",rmp_options:"Real media player egenskaber",wmp_options:"Windows media player egenskaber",qt_options:"Quicktime egenskaber",flash_options:"Flash egenskaber",hidden:"Skjul",align_bottom_left:"Nederste venstre hj\u00f8rne",align_bottom_right:"\u00d8verste h\u00f8jre hj\u00f8rne",flv_options:"Flash video egenskaber",flv_scalemode:"Skaleringstilstand",flv_buffer:"Buffer",flv_startimage:"Startbillede",flv_starttime:"Starttidspunkt",flv_defaultvolume:"Standard lydstyrke",flv_hiddengui:"Skjul sk\u00e6rmbillede",flv_autostart:"Autostart",flv_loop:"Gentag",flv_showscalemodes:"Vis skaleringstilstande",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback",html5_video_options:"HTML5 Video Indstillinger",altsource1:"Alternativ kilde 1",altsource2:"Alternativ kilde 2",preload:"Forudindl\u00e6s",poster:"Poster",source:"Kilde"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/de_dlg.js b/js/tiny_mce/plugins/media/langs/de_dlg.js new file mode 100755 index 000000000..e7d3cfde3 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.media_dlg',{list:"Liste",file:"Datei/URL",advanced:"Erweitert",general:"Allgemein",title:"Multimedia-Inhalte einf\u00fcgen/bearbeiten",align_top_left:"Oben Links",align_center:"Zentriert",align_left:"Links",align_bottom:"Unten",align_right:"Rechts",align_top:"Oben",qt_stream_warn:"In den Erweiterten Einstellungen sollten im Feld \'QT Src\' gestreamte RTSP Resourcen hinzugef\u00fcgt werden.\\nZus\u00e4tzlich sollten Sie dort auch eine nicht-gestreamte Resource angeben.",qtsrc:"Angabe zu QT Src",progress:"Fortschritt",sound:"Ton",swstretchvalign:"Stretch V-Ausrichtung",swstretchhalign:"Stretch H-Ausrichtung",swstretchstyle:"Stretch-Art",scriptcallbacks:"Script callbacks",align_top_right:"Oben Rechts",uimode:"UI Modus",rate:"Rate",playcount:"Z\u00e4hler",defaultframe:"Frame-Voreinstellung",currentposition:"Aktuelle Position",currentmarker:"Aktueller Marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Fensterloses Video",stretchtofit:"Anzeigefl\u00e4che an verf\u00fcgbaren Platz anpassen",mute:"Stumm",invokeurls:"Invoke URLs",fullscreen:"Vollbild",enabled:"Aktiviert",autostart:"Autostart",volume:"Lautst\u00e4rke",target:"Ziel",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Endzeitpunkt",starttime:"Startzeitpunkt",enablejavascript:"JavaScript aktivieren",correction:"Ohne Korrektur",targetcache:"Ziel zwischenspeichern",playeveryframe:"Jeden Frame abspielen",kioskmode:"Kioskmodus",controller:"Controller",menu:"Men\u00fc anzeigen",loop:"Wiederholung",play:"Automatisches Abspielen",hspace:"Horizontaler Abstand",vspace:"Vertikaler Abstand",class_name:"CSS-Klasse",name:"Name",id:"Id",type:"Typ",size:"Abmessungen",preview:"Vorschau",constrain_proportions:"Proportionen erhalten",controls:"Steuerung",numloop:"Anzahl Wiederholungen",console:"Konsole",cache:"Zwischenspeicher",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvariablen",base:"Base",bgcolor:"Hintergrund",wmode:"WMode",salign:"S-Ausrichtung",align:"Ausrichtung",scale:"Skalierung",quality:"Qualit\u00e4t",shuffle:"Zuf\u00e4llige Wiedergabe",prefetch:"Prefetch",nojava:"Kein Java",maintainaspect:"Bildverh\u00e4ltnis beibehalten",imagestatus:"Bildstatus",center:"Zentriert",autogotourl:"Auto goto URL",shockwave_options:"Shockwave-Optionen",rmp_options:"Optionen f\u00fcr Real Media Player",wmp_options:"Optionen f\u00fcr Windows Media Player",qt_options:"Quicktime-Optionen",flash_options:"Flash-Optionen",hidden:"Versteckt",align_bottom_left:"Unten Links",align_bottom_right:"Unten Rechts",flv_options:"Optionen f\u00fcr Flash Video",flv_scalemode:"Skalierungsmodus",flv_buffer:"Puffer",flv_startimage:"Startbild",flv_starttime:"Startzeitpunkt",flv_defaultvolume:"Standardlautst\u00e4rke",flv_hiddengui:"Versteckte GUI",flv_autostart:"Autostart",flv_loop:"Wiederholung",flv_showscalemodes:"Skalierungsmodi anzeigen",flv_smoothvideo:"Smooth Video",flv_jscallback:"JS Callback",html5_video_options:"HTML5 Video Optionen",altsource1:"Alternative Quelle 1",altsource2:"Alternative Quelle 2",preload:"Preload",poster:"Poster",source:"Quelle"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/dv_dlg.js b/js/tiny_mce/plugins/media/langs/dv_dlg.js new file mode 100755 index 000000000..205d6ee56 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/el_dlg.js b/js/tiny_mce/plugins/media/langs/el_dlg.js new file mode 100755 index 000000000..efcf71821 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.media_dlg',{list:"\u039b\u03af\u03c3\u03c4\u03b1",file:"\u0391\u03c1\u03c7\u03b5\u03af\u03bf/URL",advanced:"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2",general:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b5\u03bd\u03c3\u03c9\u03bc\u03b1\u03c4\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd media",align_top_left:"\u03a0\u03ac\u03bd\u03c9 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",align_center:"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf",align_left:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",align_bottom:"\u039a\u03ac\u03c4\u03c9",align_right:"\u0394\u03b5\u03be\u03b9\u03ac",align_top:"\u03a0\u03ac\u03bd\u03c9",qt_stream_warn:"\u03a0\u03b7\u03b3\u03ad\u03c2 \u03c1\u03bf\u03ce\u03bd rtsp \u03b8\u03b1 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03c4\u03b5\u03b8\u03bf\u03cd\u03bd \u03c3\u03c4\u03bf \u03c0\u03b5\u03b4\u03af\u03bf \u03a0\u03b7\u03b3\u03ae QT \u03ba\u03ac\u03c4\u03c9 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03ba\u03b1\u03c1\u03c4\u03ad\u03bb\u03b1 \u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2.\\n\u0395\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03bb\u03cc \u03b8\u03b1 \u03ae\u03c4\u03b1\u03bd \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03b1\u03c0\u03bb\u03ae (\u03cc\u03c7\u03b9 \u03c1\u03bf\u03ae\u03c2) \u03c0\u03b7\u03b3\u03ae..",qtsrc:"\u03a0\u03b7\u03b3\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",progress:"\u03a0\u03c1\u03cc\u03bf\u03b4\u03bf\u03c2",sound:"\u0389\u03c7\u03bf\u03c2",swstretchvalign:"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7",swstretchhalign:"\u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7",swstretchstyle:"\u03a3\u03c4\u03c5\u03bb \u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7\u03c2",scriptcallbacks:"Script callbacks",align_top_right:"\u03a0\u03ac\u03bd\u03c9 \u03b4\u03b5\u03be\u03b9\u03ac",uimode:"\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 UI",rate:"\u03a1\u03c5\u03b8\u03bc\u03cc\u03c2",playcount:"\u03a0\u03cc\u03c3\u03b5\u03c2 \u03c6\u03bf\u03c1\u03ad\u03c2 \u03b8\u03b1 \u03c0\u03b1\u03af\u03be\u03b5\u03b9",defaultframe:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf \u03ba\u03b1\u03c1\u03ad",currentposition:"\u03a4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1 \u03b8\u03ad\u03c3\u03b7",currentmarker:"\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03c3\u03b7\u03bc\u03ac\u03b4\u03b9",captioningid:"Captioning id",baseurl:"URL \u03b2\u03ac\u03c3\u03b7\u03c2",balance:"\u0399\u03c3\u03bf\u03c1\u03c1\u03bf\u03c0\u03af\u03b1",windowlessvideo:"\u0392\u03af\u03bd\u03c4\u03b5\u03bf \u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf",stretchtofit:"\u0395\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7 \u03ce\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c7\u03c9\u03c1\u03ad\u03c3\u03b5\u03b9",mute:"\u03a3\u03af\u03b3\u03b1\u03c3\u03b7",invokeurls:"\u039a\u03bb\u03ae\u03c3\u03b7 URLs",fullscreen:"\u03a0\u03bb\u03ae\u03c1\u03b7\u03c2 \u03bf\u03b8\u03cc\u03bd\u03b7",enabled:"\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",autostart:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7",volume:"\u0388\u03bd\u03c4\u03b1\u03c3\u03b7",target:"\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03bb\u03ae\u03be\u03b7\u03c2",starttime:"\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03ad\u03bd\u03b1\u03c1\u03be\u03b7\u03c2",enablejavascript:"\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 JavaScript",correction:"\u03a7\u03c9\u03c1\u03af\u03c2 \u03b4\u03b9\u03cc\u03c1\u03b8\u03c9\u03c3\u03b7",targetcache:"\u039c\u03bd\u03ae\u03bc\u03b7 cache \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",playeveryframe:"\u03a0\u03b1\u03af\u03be\u03b9\u03bc\u03bf \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b1\u03c1\u03ad",kioskmode:"\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 Kiosk",controller:"\u0395\u03bb\u03b5\u03b3\u03ba\u03c4\u03ae\u03c2",menu:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03bc\u03b5\u03bd\u03bf\u03cd",loop:"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7",play:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03bf \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7",hspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1",vspace:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03ac\u03b8\u03b5\u03c4\u03b7",class_name:"\u039a\u03bb\u03ac\u03c3\u03b7",name:"\u038c\u03bd\u03bf\u03bc\u03b1",id:"Id",type:"\u03a4\u03cd\u03c0\u03bf\u03c2",size:"\u0394\u03b9\u03b1\u03c3\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2",preview:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7",constrain_proportions:"\u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03bf\u03b3\u03af\u03b1\u03c2 \u03c0\u03bb. - \u03cd\u03c8\u03bf\u03c5\u03c2",controls:"\u03a7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c1\u03b9\u03b1",numloop:"\u03a0\u03cc\u03c3\u03b5\u03c2 \u03c6\u03bf\u03c1\u03ad\u03c2 \u03b8\u03b1 \u03c0\u03b1\u03af\u03be\u03b5\u03b9",console:"\u039a\u03bf\u03bd\u03c3\u03cc\u03bb\u03b1",cache:"\u039c\u03bd\u03ae\u03bc\u03b7 cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"\u039c\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ad\u03c2 Flash",base:"\u0392\u03ac\u03c3\u03b7",bgcolor:"\u03a6\u03cc\u03bd\u03c4\u03bf",wmode:"WMode",salign:"SAlign",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",scale:"\u039a\u03bb\u03af\u03bc\u03b1\u03ba\u03b1",quality:"\u03a0\u03bf\u03b9\u03cc\u03c4\u03b7\u03c4\u03b1",shuffle:"\u03a4\u03c5\u03c7\u03b1\u03af\u03b1 \u03c3\u03b5\u03b9\u03c1\u03ac",prefetch:"\u03a0\u03c1\u03bf\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7",nojava:"\u03a7\u03c9\u03c1\u03af\u03c2 java",maintainaspect:"\u0394\u03b9\u03b1\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 \u03b1\u03bd\u03b1\u03bb\u03bf\u03b3\u03af\u03b1\u03c2 \u03c0\u03bb. - \u03cd\u03c8\u03bf\u03c5\u03c2",imagestatus:"\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",center:"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf",autogotourl:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf URL",shockwave_options:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Shockwave",rmp_options:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Real media player",wmp_options:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Windows media player",qt_options:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Quicktime",flash_options:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 Flash",hidden:"\u039a\u03c1\u03c5\u03c6\u03cc",align_bottom_left:"\u039a\u03ac\u03c4\u03c9 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",align_bottom_right:"\u039a\u03ac\u03c4\u03c9 \u03b4\u03b5\u03be\u03b9\u03ac",flv_options:"\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf Flash",flv_scalemode:"\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03ba\u03bb\u03af\u03bc\u03b1\u03ba\u03b1\u03c2",flv_buffer:"\u0395\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03b7 \u03bc\u03bd\u03ae\u03bc\u03b7",flv_startimage:"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03b1\u03c1\u03c7\u03ae\u03c2",flv_starttime:"\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03ad\u03bd\u03b1\u03c1\u03be\u03b7\u03c2",flv_defaultvolume:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7 \u03ad\u03bd\u03c4\u03b1\u03c3\u03b7",flv_hiddengui:"\u039a\u03c1\u03c5\u03bc\u03bc\u03ad\u03bd\u03bf GUI",flv_autostart:"\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7",flv_loop:"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7",flv_showscalemodes:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b9\u03ce\u03bd \u03ba\u03bb\u03af\u03bc\u03b1\u03ba\u03b1\u03c2",flv_smoothvideo:"\u039f\u03bc\u03b1\u03bb\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf",flv_jscallback:"JS Callback",html5_video_options:"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/en_dlg.js b/js/tiny_mce/plugins/media/langs/en_dlg.js new file mode 100644 index 000000000..e191cee09 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media","align_top_left":"Top left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks","align_top_right":"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL","shockwave_options":"Shockwave options","rmp_options":"Real media player options","wmp_options":"Windows media player options","qt_options":"Quicktime options","flash_options":"Flash options",hidden:"Hidden","align_bottom_left":"Bottom left","align_bottom_right":"Bottom right","flv_options":"Flash video options","flv_scalemode":"Scale mode","flv_buffer":"Buffer","flv_startimage":"Start image","flv_starttime":"Start time","flv_defaultvolume":"Default volumne","flv_hiddengui":"Hidden GUI","flv_autostart":"Auto start","flv_loop":"Loop","flv_showscalemodes":"Show scale modes","flv_smoothvideo":"Smooth video","flv_jscallback":"JS Callback","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/es_dlg.js b/js/tiny_mce/plugins/media/langs/es_dlg.js new file mode 100755 index 000000000..84edec616 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.media_dlg',{list:"Lista",file:"Archivo/URL",advanced:"Avanzado",general:"General",title:"Insertar/editar medio embebido","align_top_left":"Arriba Izda.","align_center":"Centrado","align_left":"Izquierda","align_bottom":"Debajo","align_right":"Derecha","align_top":"Arriba","qt_stream_warn":"Los recursos rtsp de Streaming deber\u00edan a\u00f1adirse en el campo QT Src de la pesta\u00f1a avanzada.\\nAdem\u00e1s deber\u00eda a\u00f1adir una versi\u00f3n no Streaming en el campo Src.",qtsrc:"QT Src",progress:"Progreso",sound:"Sonido",swstretchvalign:"Alin. V. Estiramiento",swstretchhalign:"Alin. H. Estiramiento",swstretchstyle:"Estilo estiramiento",scriptcallbacks:"Script callbacks","align_top_right":"Arriba Dcha.",uimode:"Modo UI",rate:"Ratio",playcount:"Cuantas reproducciones",defaultframe:"Frame predet.",currentposition:"Posici\u00f3n actual",currentmarker:"Marcador actual",captioningid:"Captioning id",baseurl:"URL Base",balance:"Balance",windowlessvideo:"Video sin ventana",stretchtofit:"Estirar para ajustar",mute:"Silencio",invokeurls:"Invocar URLs",fullscreen:"Pantalla Completa",enabled:"Habilitado",autostart:"Comienzo Autom\u00e1tico",volume:"Volumen",target:"Target",qtsrcchokespeed:"Vel. de choque",href:"Href",endtime:"Fin",starttime:"Inicio",enablejavascript:"Habilitar JavaScript",correction:"Sin correci\u00f3n",targetcache:"Target cache",playeveryframe:"Reproducir todo los frames",kioskmode:"Kiosk mode",controller:"Controller",menu:"Mostrar Men\u00fa",loop:"Repetitivo",play:"Comienzo Autom\u00e1tico",hspace:"H-Space",vspace:"V-Space","class_name":"Clase",name:"Nombre",id:"Id",type:"Tipo",size:"Dimensiones",preview:"Vista Previa","constrain_proportions":"Bloquear relaci\u00f3n de aspecto",controls:"Controles",numloop:"N\u00fam. repeticiones",console:"Consola",cache:"Cach\u00e9",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Fondo",wmode:"WMode",salign:"SAlign",align:"Alineaci\u00f3n",scale:"Scale",quality:"Calidad",shuffle:"Aleatorio",prefetch:"Preb\u00fasqueda",nojava:"No java",maintainaspect:"Mantener aspecto",imagestatus:"Estado de imagen",center:"Centrado",autogotourl:"Ir a URL autom\u00e1t.","shockwave_options":"Opciones Shockwave","rmp_options":"Opciones Real media player","wmp_options":"Opciones Windows media player","qt_options":"Opciones Quicktime","flash_options":"Opciones Flash",hidden:"Hidden","align_bottom_left":"Debajo Izda.","align_bottom_right":"Debajo Dcha.","flv_options":"Opciones Video Flash","flv_scalemode":"Modo escalado","flv_buffer":"Buffer","flv_startimage":"Imagen inicio","flv_starttime":"Tiempo inicio","flv_defaultvolume":"Volumen predet.","flv_hiddengui":"Ocultar GUI","flv_autostart":"Inicio auto.","flv_loop":"Repetitivo","flv_showscalemodes":"Mostrar modos escala","flv_smoothvideo":"Video suave","flv_jscallback":"JS Callback","html5_video_options":"Opciones Video HTML5",altsource1:"Fuente alternativa 1",altsource2:"Fuente alternativa 2",preload:"Precarga",poster:"P\u00f3ster",source:"Fuente"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/et_dlg.js b/js/tiny_mce/plugins/media/langs/et_dlg.js new file mode 100755 index 000000000..25e5ee1b7 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.media_dlg',{list:"Nimekiri",file:"Fail/URL",advanced:"T\u00e4psem",general:"\u00dcldine",title:"Sisesta/muuda meediat",align_top_left:"\u00dcleval vasakul",align_center:"Keskel",align_left:"Vasakul",align_bottom:"All",align_right:"Paremal",align_top:"\u00dcleval",qt_stream_warn:"Striimitav variant peaks olema lisatud.",qtsrc:"QT Src",progress:"Progress",sound:"Heli",swstretchvalign:"Venita V-joondust",swstretchhalign:"Venita H-joondust",swstretchstyle:"Venita stiili",scriptcallbacks:"Skripti tagasikutse",align_top_right:"Pleval paremal",uimode:"UI Reziim",rate:"Hinda",playcount:"M\u00e4ngukorrad",defaultframe:"Vaikimisi raam",currentposition:"Antud positioon",currentmarker:"Antud marker",captioningid:"Tiitri ID",baseurl:"Baas URL",balance:"Tasakaal",windowlessvideo:"Aknata video",stretchtofit:"Venita sobivaks",mute:"Vaigista",invokeurls:"N\u00e4ita URL\u2019e",fullscreen:"T\u00e4isekraan",enabled:"Lubatud",autostart:"Auto-start",volume:"Valjudus",target:"Sihtm\u00e4rk",qtsrcchokespeed:"Kiirus",href:"Href",endtime:"L\u00f5pu aeg",starttime:"Stardi aeg",enablejavascript:"Luba JavaScript\u2019i",correction:"Parandust ei ole",targetcache:"Sihtm\u00e4rgi vahem\u00e4lu",playeveryframe:"M\u00e4ngi igat raami",kioskmode:"Kioski reziim",controller:"Kontrollija",menu:"N\u00e4ita men\u00fc\u00fcd",loop:"Auto-kordus",play:"Auto-start",hspace:"H-vahe",vspace:"V-vahe",class_name:"Klass",name:"Nime",id:"ID",type:"T\u00fc\u00fcp",size:"M\u00f5\u00f5dud",preview:"Eelvaade",constrain_proportions:"S\u00e4ilita proportsioon",controls:"Kontrollid",numloop:"Kordused",console:"Konsool",cache:"Vahem\u00e4lu",autohref:"Auto-HREF",liveconnect:"SWLive-\u00dchendus",flashvars:"Flashiv\u00e4rk",base:"Baas",bgcolor:"Taust",wmode:"WMoodus",salign:"SJoondus",align:"Joondus",scale:"M\u00f5\u00f5tkava",quality:"Kvaliteet",shuffle:"Sega",prefetch:"Prefetch",nojava:"Ilma java\u2019ta",maintainaspect:"S\u00e4ilitamise aspekt",imagestatus:"Pildi staatus",center:"Keskel",autogotourl:"Auto-URL",shockwave_options:"Shockwave\u2019i seaded",rmp_options:"Real media player\u2019i seaded",wmp_options:"Windows media player\u2019i seaded",qt_options:"Quicktime\u2019 seaded",flash_options:"Flash\u2019i seaded",hidden:"Peidetud",align_bottom_left:"All vasakul",align_bottom_right:"All paremal",flv_options:"Flash video seaded",flv_scalemode:"Skaala reziim",flv_buffer:"Puffer",flv_startimage:"Stardi pilt",flv_starttime:"Stardi aeg",flv_defaultvolume:"Vaikimisi helitugevus",flv_hiddengui:"Peidetud GUI",flv_autostart:"Auto-start",flv_loop:"Auto.kordus",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Sujuv video",flv_jscallback:"JS tagasikutse"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/eu_dlg.js b/js/tiny_mce/plugins/media/langs/eu_dlg.js new file mode 100755 index 000000000..84ae35711 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.media_dlg',{list:"Zerrenda",file:"Fitxategia/URL",advanced:"Aurreratua",general:"Orokorra",title:"Sartu / editatu ahokatutako euskarria",align_top_left:"Goian ezkerran",align_center:"Erdian",align_left:"Ezkerrean",align_bottom:"Behean",align_right:"Eskuinean",align_top:"Goian",qt_stream_warn:"Streaming bidez ematen diren rtsp baliabideak aurreratuak fitxa n dagoen QT Src eremuan gehitu behar dira.\\n Streaming gabeko bertsio bat ere gehitu beharko zenuke.",qtsrc:"QT Src",progress:"Aurrerapena",sound:"Soinua",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Goian eskuinean",uimode:"UI Modua",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Uneko posizioa",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balanzea",windowlessvideo:"Lehiogabeko bideoa",stretchtofit:"Neurrikoa izateko zabaldu",mute:"Ixilik",invokeurls:"URLa deitu",fullscreen:"Pantaila osoa",enabled:"Gaituta",autostart:"Automatikoki hasi",volume:"Bolumena",target:"Helburua",qtsrcchokespeed:"Talka abiadura",href:"Href",endtime:"Noiz bukatu",starttime:"Noiz hasi",enablejavascript:"Gaitu JavaScript",correction:"Zuzenketarik ez",targetcache:"Helburu katxea",playeveryframe:"Marko guztiak erreproduzitu",kioskmode:"Kiosko modua",controller:"Controller",menu:"Erakutsi menua",loop:"Begizta",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Klasea",name:"Izena",id:"Id",type:"Mota",size:"Tamaina",preview:"Aurrebista",constrain_proportions:"Itxura erlazioa blokeatu",controls:"Kontrolak",numloop:"Begizta kopurua",console:"Konsola",cache:"Katxea",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Oinarria",bgcolor:"Atzea",wmode:"WMode",salign:"SAlign",align:"Lerrokatu",scale:"Eskalatu",quality:"Kalitatea",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"Java ez",maintainaspect:"Maintain aspect",imagestatus:"Irudi edoera",center:"Erdian",autogotourl:"Automatikoi joan URLra",shockwave_options:"Shockwave aukerak",rmp_options:"Real media player aukerak",wmp_options:"Windows media player aukerak",qt_options:"Quicktime aukerak",flash_options:"Flash aukerak",hidden:"Ezkutuan",align_bottom_left:"Behean ezkerrean",align_bottom_right:"Behean eskuinean",flv_options:"Flash bideo aukerak",flv_scalemode:"Eskala modua",flv_buffer:"Buffer",flv_startimage:"Hasiera irudia",flv_starttime:"Noiz hasi",flv_defaultvolume:"Bolumen lehenetsia",flv_hiddengui:"Ezkutuko GUI",flv_autostart:"Auto start",flv_loop:"Begizta",flv_showscalemodes:"Erakutsi eskala moduak",flv_smoothvideo:"Bideo leuna",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/fa_dlg.js b/js/tiny_mce/plugins/media/langs/fa_dlg.js new file mode 100755 index 000000000..bcaf3a01f --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.media_dlg',{list:"\u0644\u06cc\u0633\u062a",file:"\u0641\u0627\u06cc\u0644/URL",advanced:"\u067e\u06cc\u0634\u0631\u0641\u062a\u0647",general:"\u0639\u0645\u0648\u0645\u06cc",title:"\u062f\u0631\u062c / \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0631\u0633\u0627\u0646\u0647 \u062c\u0627\u0633\u0627\u0632\u06cc \u0634\u062f\u0647 (Embeded Media)",align_top_left:"\u0628\u0627\u0644\u0627 \u0686\u067e",align_center:"\u0648\u0633\u0637",align_left:"\u0686\u067e",align_bottom:"\u067e\u0627\u06cc\u06cc\u0646",align_right:"\u0631\u0627\u0633\u062a",align_top:"\u0628\u0627\u0644\u0627",qt_stream_warn:"\u0645\u0646\u0627\u0628\u0639 Streamed rtsp \u0628\u0627\u06cc\u062f \u062f\u0631 \u0628\u0631\u06af\u0647 (Tab) \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u062f\u0631 \u0641\u06cc\u0644\u062f \u0645\u0646\u0628\u0639 QT \u0627\u0636\u0627\u0641\u0647 \u0634\u0648\u062f.\\n\u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u063a\u06cc\u0631 streamed \u0631\u0627 \u062f\u0631 \u0641\u06cc\u0644\u062f \u0645\u0646\u0628\u0639 \u0627\u0636\u0627\u0641\u0647 \u0646\u0645\u0627\u0626\u06cc\u062f..",qtsrc:"\u0645\u0646\u0628\u0639 QT",progress:"\u067e\u06cc\u0634\u0631\u0641\u062a",sound:"\u0635\u062f\u0627",swstretchvalign:"\u06a9\u0634\u06cc\u062f\u0646 \u062a\u0631\u0627\u0632 \u0639\u0645\u0648\u062f\u06cc",swstretchhalign:"\u06a9\u0634\u06cc\u062f\u0646 \u062a\u0631\u0627\u0632 \u0627\u0641\u0642\u06cc",swstretchstyle:"\u06a9\u0634\u06cc\u062f\u0646 \u0627\u0633\u062a\u06cc\u0644",scriptcallbacks:"\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a Callbacks",align_top_right:"\u0628\u0627\u0644\u0627 \u0631\u0627\u0633\u062a",uimode:"\u062d\u0627\u0644\u062a UI",rate:"\u0646\u0631\u062e",playcount:"\u062a\u0639\u062f\u0627\u062f \u067e\u062e\u0634",defaultframe:"\u0641\u0631\u06cc\u0645 \u067e\u06cc\u0634\u0641\u0631\u0636",currentposition:"\u0645\u0648\u0642\u0639\u06cc\u062a \u0641\u0639\u0644\u06cc",currentmarker:"\u0646\u0634\u0627\u0646\u06af\u0631 \u0641\u0639\u0644\u06cc",captioningid:"\u0634\u0646\u0627\u0633\u0647 \u0639\u0646\u0648\u0627\u0646",baseurl:"URL \u067e\u0627\u06cc\u0647",balance:"\u062a\u0648\u0627\u0632\u0646 (Balance)",windowlessvideo:"\u0648\u06cc\u062f\u0626\u0648\u06cc \u06a9\u0645 \u067e\u0646\u062c\u0631\u0647",stretchtofit:"\u06a9\u0634\u06cc\u062f\u0646 \u062c\u0647\u062a \u06af\u0646\u062c\u0627\u0646\u062f\u0646 \u06a9\u0627\u0645\u0644",mute:"\u0628\u06cc \u0635\u062f\u0627",invokeurls:"Invoke URLs",fullscreen:"\u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647",enabled:"\u0641\u0639\u0627\u0644 \u0634\u062f\u0647",autostart:"\u0634\u0631\u0648\u0639 \u0627\u062a\u0648\u0645\u0627\u062a\u06cc\u06a9",volume:"\u0628\u0644\u0646\u062f\u06cc \u0635\u062f\u0627",target:"\u0645\u0642\u0635\u062f (Target)",qtsrcchokespeed:"\u0633\u0631\u0639\u062a Choke",href:"Href",endtime:"\u0632\u0645\u0627\u0646 \u067e\u0627\u06cc\u0627\u0646",starttime:"\u0632\u0645\u0627\u0646 \u0634\u0631\u0648\u0639",enablejavascript:"\u0641\u0639\u0627\u0644 \u0628\u0648\u062f\u0646 JavaScript",correction:"\u0628\u062f\u0648\u0646 \u062a\u0635\u062d\u06cc\u062d",targetcache:"\u06a9\u0634 \u0645\u0642\u0635\u062f (Target Cache)",playeveryframe:"\u067e\u062e\u0634 \u0647\u0631 \u0641\u0631\u06cc\u0645 (Frame)",kioskmode:"\u062d\u0627\u0644\u062a Kiosk",controller:"\u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647",menu:"\u0646\u0645\u0627\u06cc\u0634 \u0645\u0646\u0648",loop:"\u062d\u0644\u0642\u0647 (Loop)",play:"\u067e\u062e\u0634 \u0627\u062a\u0648\u0645\u0627\u062a\u06cc\u06a9",hspace:"\u0641\u0627\u0635\u0644\u0647 \u0627\u0641\u0642\u06cc",vspace:"\u0641\u0627\u0635\u0644\u0647 \u0639\u0645\u0648\u062f\u06cc",class_name:"\u06a9\u0644\u0627\u0633",name:"\u0646\u0627\u0645",id:"\u0634\u0646\u0627\u0633\u0647",type:"\u0646\u0648\u0639",size:"\u0627\u0628\u0639\u0627\u062f",preview:"\u067e\u06cc\u0634 \u0646\u0645\u0627\u06cc\u0634",constrain_proportions:"\u062d\u0641\u0638 \u062a\u0646\u0627\u0633\u0628",controls:"\u06a9\u0646\u062a\u0631\u0644 \u0647\u0627",numloop:"\u062a\u0639\u062f\u0627\u062f \u062d\u0644\u0642\u0647 \u0647\u0627",console:"\u06a9\u0646\u0633\u0648\u0644",cache:"\u06a9\u0634",autohref:"HREF \u0627\u062a\u0648\u0645\u0627\u062a\u06cc\u06a9",liveconnect:"\u0627\u0631\u062a\u0628\u0627\u0637 SWLive",flashvars:"\u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc Flash",base:"\u067e\u0627\u06cc\u0647 (Base)",bgcolor:"\u0632\u0645\u06cc\u0646\u0647",wmode:"WMode",salign:"SAlign",align:"\u062a\u0631\u0627\u0632",scale:"\u0645\u0642\u06cc\u0627\u0633",quality:"\u06a9\u06cc\u0641\u06cc\u062a",shuffle:"\u062f\u0631 \u0647\u0645 \u0622\u0645\u06cc\u062e\u062a\u0646",prefetch:"\u067e\u06cc\u0634 \u0648\u0627\u06a9\u0634\u06cc",nojava:"\u0628\u062f\u0648\u0646 java",maintainaspect:"\u062d\u0641\u0638 \u062a\u0646\u0627\u0633\u0628 \u0648\u062c\u0648\u0647",imagestatus:"\u0648\u0636\u0639\u06cc\u062a \u062a\u0635\u0648\u06cc\u0631",center:"\u0648\u0633\u0637",autogotourl:"\u0631\u0641\u062a\u0646 \u0627\u062a\u0648\u0645\u0627\u062a\u06cc\u06a9 \u0628\u0647 URL",shockwave_options:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a Shockwave",rmp_options:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a Real media player",wmp_options:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a Windows media player",qt_options:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a Quicktime",flash_options:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0641\u0644\u0634",hidden:"\u0645\u062e\u0641\u06cc",align_bottom_left:"\u067e\u0627\u06cc\u06cc\u0646 \u0686\u067e",align_bottom_right:"\u067e\u0627\u06cc\u06cc\u0646 \u0631\u0627\u0633\u062a",flv_options:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0648\u06cc\u062f\u0626\u0648\u06cc \u0641\u0644\u0634",flv_scalemode:"\u062d\u0627\u0644\u062a \u0645\u0642\u06cc\u0627\u0633",flv_buffer:"\u0628\u0627\u0641\u0631 (Buffer)",flv_startimage:"\u062a\u0635\u0648\u06cc\u0631 \u0634\u0631\u0648\u0639",flv_starttime:"\u0632\u0645\u0627\u0646 \u0634\u0631\u0648\u0639",flv_defaultvolume:"\u0628\u0644\u0646\u062f\u06cc \u0635\u062f\u0627\u06cc \u067e\u06cc\u0634\u0641\u0631\u0636",flv_hiddengui:"GUI \u0645\u062e\u0641\u06cc",flv_autostart:"\u0634\u0631\u0648\u0639 \u0627\u062a\u0648\u0645\u0627\u062a\u06cc\u06a9",flv_loop:"\u062d\u0644\u0642\u0647 (Loop)",flv_showscalemodes:"\u0646\u0645\u0627\u06cc\u0634 \u062d\u0627\u0644\u062a \u0647\u0627\u06cc \u0645\u0642\u06cc\u0627\u0633",flv_smoothvideo:"\u0648\u06cc\u062f\u0626\u0648\u06cc \u0635\u0627\u0641",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/fi_dlg.js b/js/tiny_mce/plugins/media/langs/fi_dlg.js new file mode 100755 index 000000000..d950a0ceb --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.media_dlg',{list:"Lista",file:"Tiedosto/URL",advanced:"Edistyneet",general:"Yleiset",title:"Lis\u00e4\u00e4/muokkaa upotettua mediaa",align_top_left:"Yl\u00e4-vasemmalla",align_center:"Keskell\u00e4",align_left:"Vasemmalla",align_bottom:"Alhaalla",align_right:"Oikealla",align_top:"Ylh\u00e4\u00e4ll\u00e4",qt_stream_warn:"Streamatut rtsp-resurssit tulisi lis\u00e4t\u00e4 QT Src -kentt\u00e4\u00e4n edistynyt-v\u00e4lilehdelle.\\nSinun kannattaa lis\u00e4t\u00e4 my\u00f6s ei-streamattu versio Src-kentt\u00e4\u00e4n.",qtsrc:"QT Src",progress:"Eteneminen",sound:"\u00c4\u00e4ni",swstretchvalign:"Venyt\u00e4 pystysuunnassa",swstretchhalign:"Venyt\u00e4 vaakasuunnassa",swstretchstyle:"Venytystyyli",scriptcallbacks:"Skriptin takaisinkutsut",align_top_right:"Yl\u00e4-oikealla",uimode:"UI-moodi",rate:"Rate",playcount:"Toistolaskin",defaultframe:"Oletusruutu",currentposition:"T\u00e4m\u00e4nhetkinen sijainti",currentmarker:"T\u00e4m\u00e4nhetkinen merkki",captioningid:"Otsikointi-id",baseurl:"Perus URL-osoitteet",balance:"Tasapaino",windowlessvideo:"Ikkunaton video",stretchtofit:"Venyt\u00e4 sopimaan",mute:"Hiljennys",invokeurls:"Kutsu URL-osoitteet",fullscreen:"Kokoruutu",enabled:"P\u00e4\u00e4ll\u00e4",autostart:"Automaattinen aloitus",volume:"\u00c4\u00e4nen voimakkuus",target:"Kohde",qtsrcchokespeed:"Choke-nopeus",href:"Href",endtime:"Lopetusaika",starttime:"Aloitusaika",enablejavascript:"Salli JavaScript",correction:"Ei korjausta",targetcache:"Kohteen v\u00e4limuisti",playeveryframe:"Toista jokainen ruutu",kioskmode:"Kioskitila",controller:"Ohjain",menu:"N\u00e4yt\u00e4 valikko",loop:"Silmukka",play:"Automaattinen toisto",hspace:"Vaakatason tila",vspace:"Pystytason tila",class_name:"Luokka",name:"Nimi",id:"Tunniste",type:"Tyyppi",size:"Mitat",preview:"Esikatselu",constrain_proportions:"S\u00e4ilyt\u00e4 mittasuhteet",controls:"Kontrollit",numloop:"Toistojen m\u00e4\u00e4r\u00e4",console:"Konsoli",cache:"V\u00e4limuisti",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash-muuttujat",base:"Perusta",bgcolor:"Tausta",wmode:"WMode",salign:"SAlign",align:"Tasaus",scale:"Skaala",quality:"Laatu",shuffle:"Sekoita",prefetch:"Esinouda",nojava:"Ei Javaa",maintainaspect:"S\u00e4ilyt\u00e4 kuvasuhde",imagestatus:"Kuvan tila",center:"Keskit\u00e4",autogotourl:"Mene automaattisesti URL:iin",shockwave_options:"Shockwaven asetukset",rmp_options:"Real media playerin asetukset",wmp_options:"Windows media playerin asetukset",qt_options:"Quicktimen asetukset",flash_options:"Flashin asetukset",hidden:"Piilotettu",align_bottom_left:"Ala-vasemmalla",align_bottom_right:"Ala-oikealla",flv_options:"Flash videon asetukset",flv_scalemode:"Skaalausmoodi",flv_buffer:"Puskuri",flv_startimage:"Aloituskuva",flv_starttime:"Aloitusaika",flv_defaultvolume:"Oletus\u00e4\u00e4nenpaine",flv_hiddengui:"Piilotettu k\u00e4ytt\u00f6liittym\u00e4",flv_autostart:"Automaattinen aloitus",flv_loop:"Silmukka",flv_showscalemodes:"N\u00e4yt\u00e4 skaalausmoodit",flv_smoothvideo:"Smoothi video",flv_jscallback:"JS takaisinkutsu",html5_video_options:"HTML5 videoasetukset",altsource1:"Vaihtoehtoinen l\u00e4hde 1",altsource2:"Vaihtoehtoinen l\u00e4hde 2",preload:"Esilataa",poster:"Posteri",source:"L\u00e4hde"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/fr_dlg.js b/js/tiny_mce/plugins/media/langs/fr_dlg.js new file mode 100755 index 000000000..4a3f5d4a7 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.media_dlg',{list:"Liste",file:"Fichier / URL",advanced:"Avanc\u00e9",general:"G\u00e9n\u00e9ral",title:"Ins\u00e9rer / \u00e9diter un fichier m\u00e9dia",align_top_left:"En haut \u00e0 gauche",align_center:"Centr\u00e9",align_left:"Gauche",align_bottom:"Bas",align_right:"Droite",align_top:"Haut",qt_stream_warn:"Les ressources rtsp en streaming doivent \u00eatre ajout\u00e9es au champ \u00ab Source QT \u00bb dans l\'onglet avanc\u00e9.\\nVous devriez aussi ajouter une version n\'\u00e9tant pas en streaming au champ \u00ab source QT \u00bb.",qtsrc:"Source QT",progress:"Progression",sound:"Son",swstretchvalign:"Stretch vertical",swstretchhalign:"Stretch horizontal",swstretchstyle:"Stretch style",scriptcallbacks:"Callback de script",align_top_right:"En haut \u00e0 droite",uimode:"Mode UI",rate:"Taux",playcount:"Compteur",defaultframe:"Image par d\u00e9faut",currentposition:"Position actuelle",currentmarker:"Marqueur actuel",captioningid:"ID sous-titrage",baseurl:"Adresse de base",balance:"Balance",windowlessvideo:"Vid\u00e9o sans fen\u00eatre",stretchtofit:"\u00c9tendre pour adapter la taille",mute:"Muet",invokeurls:"Invoquer URLs",fullscreen:"Plein \u00e9cran",enabled:"Activ\u00e9",autostart:"Lire automatiquement",volume:"Volume",target:"Cible",qtsrcchokespeed:"D\u00e9bit maximum",href:"Href",endtime:"Fin",starttime:"D\u00e9but",enablejavascript:"Activer le JavaScript",correction:"Pas de correction",targetcache:"Cache cible",playeveryframe:"Jouer toutes les images",kioskmode:"Mode kiosque",controller:"Contr\u00f4leur",menu:"Afficher le menu",loop:"Lire en boucle",play:"Lecture automatique",hspace:"Espacement horizontal",vspace:"Espacement vertical",class_name:"Classe",name:"Nom",id:"Id",type:"Type",size:"Dimensions",preview:"Pr\u00e9visualisation",constrain_proportions:"Conserver les proportions",controls:"Contr\u00f4les",numloop:"Nombre de tours",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Variables flash",base:"Base",bgcolor:"Fond",wmode:"WMode",salign:"SAlign",align:"Alignement",scale:"\u00c9chelle",quality:"Qualit\u00e9",shuffle:"Al\u00e9atoire",prefetch:"Pr\u00e9chargement",nojava:"Pas java",maintainaspect:"Maintenir l\'aspect",imagestatus:"Statut de l\'image",center:"Centrer",autogotourl:"Aller automatiquement \u00e0 l\'URL",shockwave_options:"Options Shockwave",rmp_options:"Options Real media player",wmp_options:"Windows media player options",qt_options:"Options Quicktime",flash_options:"Options Flash",hidden:"Cach\u00e9",align_bottom_left:"En bas \u00e0 gauche",align_bottom_right:"En bas \u00e0 droite",flv_options:"Options de la vid\u00e9o Flash",flv_scalemode:"\u00c9chelle",flv_buffer:"Tampon",flv_startimage:"Image de d\u00e9marrage",flv_starttime:"Temps au d\u00e9but",flv_defaultvolume:"Volume par d\u00e9faut",flv_hiddengui:"Interface utilisateur cach\u00e9e",flv_autostart:"D\u00e9marrage automatique",flv_loop:"En boucle",flv_showscalemodes:"Montrer les diff\u00e9rentes \u00e9chelles",flv_smoothvideo:"Vid\u00e9o adoucie",flv_jscallback:"Callback JavaScript",html5_video_options:"Options Vid\u00e9o HTML 5",altsource1:"Source alternative 1",altsource2:"Source alternative 2",preload:"Pr\u00e9chargement",poster:"Poster",source:"Source"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/gl_dlg.js b/js/tiny_mce/plugins/media/langs/gl_dlg.js new file mode 100755 index 000000000..14a05f8b1 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.media_dlg',{list:"Lista",file:"Arquivo/URL",advanced:"Avanzado",general:"Xeral",title:"Insertar/editar medio embebido",align_top_left:"Arriba Izda.",align_center:"Centrado",align_left:"Esquerda",align_bottom:"Abaixo",align_right:"Dereita",align_top:"Arriba",qt_stream_warn:"Os recursos rtsp de Streaming deber\u00edan engadirse no campo QT Src da pesta\u00f1a avanzada.\\nAdem\u00e1is deber\u00eda engadir unha versi\u00f3n no Streaming no campo Src.",qtsrc:"QT Src",progress:"Progreso",sound:"Son",swstretchvalign:"Esturar ali\u00f1. V.",swstretchhalign:"Estirar ali\u00f1. H.",swstretchstyle:"Estilo estiramento",scriptcallbacks:"Script callbacks",align_top_right:"Arriba Dta.",uimode:"Modo UI",rate:"Relaci\u00f3n",playcount:"Cantas reproducci\u00f3ns",defaultframe:"Frame predet.",currentposition:"Posici\u00f3n actual",currentmarker:"Marcador actual",captioningid:"Id de lenda",baseurl:"URL Base",balance:"Balance",windowlessvideo:"Video sen vent\u00e1",stretchtofit:"Estirar pra axustar",mute:"Silencio",invokeurls:"Invocar URLs",fullscreen:"Pantalla Completa",enabled:"Habilitado",autostart:"Comezo Autom\u00e1tico",volume:"Volume",target:"Obxetivo",qtsrcchokespeed:"Vel. de choque",href:"Href",endtime:"Fin",starttime:"Inicio",enablejavascript:"Habilitar JavaScript",correction:"Sen correci\u00f3n",targetcache:"Obxetivo cache",playeveryframe:"Reproducir t\u00f3dolos frames",kioskmode:"Modo kiosco",controller:"Controller",menu:"Mostrar Men\u00fa",loop:"Repetitivo",play:"Comezo Autom\u00e1tico",hspace:"Espacio H.",vspace:"Espacio V.",class_name:"Clase",name:"Nome",id:"Id",type:"Tipo",size:"Tama\u00f1o",preview:"Vista Previa",constrain_proportions:"Bloquear proporci\u00f3ns",controls:"Controis",numloop:"N\u00fam. repetici\u00f3ns",console:"Consola",cache:"Cach\u00e9",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Fondo",wmode:"WMode",salign:"SAlign",align:"Ali\u00f1aci\u00f3n",scale:"Escala",quality:"Calidade",shuffle:"Aleatorio",prefetch:"PreBusca",nojava:"No java",maintainaspect:"Manter aspecto",imagestatus:"Estado de imaxe",center:"Centrado",autogotourl:"Ir a URL autom\u00e1t.",shockwave_options:"Opci\u00f3ns Shockwave",rmp_options:"Opci\u00f3ns Real media player",wmp_options:"Opci\u00f3ns Windows media player",qt_options:"Opci\u00f3ns Quicktime",flash_options:"Opci\u00f3ns Flash",hidden:"Oculto",align_bottom_left:"Abaixo Izda.",align_bottom_right:"Abaixo Dta.",flv_options:"Opci\u00f3ns Video Flash",flv_scalemode:"Modo escalado",flv_buffer:"Buffer",flv_startimage:"Imaxe inicio",flv_starttime:"Tempo inicio",flv_defaultvolume:"Volume predet.",flv_hiddengui:"Ocultar GUI",flv_autostart:"Inicio auto.",flv_loop:"Repetitivo",flv_showscalemodes:"Mostrar modos escala",flv_smoothvideo:"Video suave",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/gu_dlg.js b/js/tiny_mce/plugins/media/langs/gu_dlg.js new file mode 100755 index 000000000..c666774a4 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/he_dlg.js b/js/tiny_mce/plugins/media/langs/he_dlg.js new file mode 100755 index 000000000..15ca07ac5 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.media_dlg',{list:"\u05e8\u05e9\u05d9\u05de\u05d4",file:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5",advanced:"\u05de\u05ea\u05e7\u05d3\u05dd",general:"\u05db\u05dc\u05dc\u05d9",title:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05e8\u05d8\u05d5\u05df",align_top_left:"\u05e9\u05de\u05d0\u05dc \u05dc\u05de\u05e2\u05dc\u05d4",align_center:"\u05de\u05e8\u05db\u05d6",align_left:"\u05dc\u05e9\u05de\u05d0\u05dc",align_bottom:"\u05dc\u05de\u05d8\u05d4",align_right:"\u05d9\u05de\u05d9\u05df",align_top:"\u05dc\u05de\u05e2\u05dc\u05d4",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"\u05d4\u05ea\u05e7\u05d3\u05de\u05d5\u05ea",sound:"\u05e6\u05dc\u05d9\u05dc",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"\u05d9\u05de\u05d9\u05df \u05dc\u05de\u05e2\u05dc\u05d4",uimode:"\u05de\u05e6\u05d1 \u05ea\u05e6\u05d5\u05d2\u05d4",rate:"\u05e7\u05e6\u05d1",playcount:"\u05de\u05e1\u05e4\u05e8 \u05d4\u05e9\u05de\u05e2\u05d5\u05ea",defaultframe:"Default frame",currentposition:"\u05de\u05d9\u05e7\u05d5\u05dd \u05e0\u05d5\u05db\u05d7\u05d9",currentmarker:"\u05e1\u05de\u05df \u05e0\u05d5\u05db\u05d7\u05d9",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"\u05de\u05ea\u05d7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4",mute:"\u05d4\u05e9\u05ea\u05e7",invokeurls:"Invoke URLs",fullscreen:"\u05de\u05e1\u05da \u05de\u05dc\u05d0",enabled:"\u05de\u05d5\u05e4\u05e2\u05dc",autostart:"\u05d4\u05ea\u05d7\u05dc \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea",volume:"\u05e2\u05d5\u05e6\u05de\u05d4",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"\u05d4\u05e6\u05d2\u05ea \u05ea\u05e4\u05e8\u05d9\u05d8",loop:"\u05e0\u05d2\u05d9\u05e0\u05d4 \u05de\u05d7\u05d6\u05d5\u05e8\u05d9\u05ea",play:"\u05e0\u05d2\u05d9\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea \u05e2\u05dd \u05d4\u05d8\u05e2\u05d9\u05e0\u05d4",hspace:"\u05e8\u05d5\u05d5\u05d7 \u05d0\u05d5\u05e4\u05e7\u05d9",vspace:"\u05e8\u05d5\u05d5\u05d7 \u05d0\u05e0\u05db\u05d9",class_name:"Class",name:"Name",id:"Id",type:"\u05e1\u05d5\u05d2",size:"\u05e8\u05d5\u05d7\u05d1 \u05d5\u05d2\u05d5\u05d1\u05d4",preview:"\u05ea\u05e6\u05d5\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4",constrain_proportions:"\u05e9\u05de\u05d5\u05e8 \u05e2\u05dc \u05e4\u05e8\u05d5\u05e4\u05d5\u05e8\u05e6\u05d9\u05d5\u05ea",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"\u05e6\u05d1\u05e2 \u05e8\u05e7\u05e2",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"\u05d0\u05d9\u05db\u05d5\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"\u05de\u05e8\u05db\u05d6",autogotourl:"Auto goto URL",shockwave_options:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea Shockwave",rmp_options:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d2\u05df Real Media",wmp_options:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05de\u05d3\u05d9\u05d4 \u05e4\u05dc\u05d9\u05d9\u05e8",qt_options:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea Quicktime",flash_options:"\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e4\u05dc\u05d0\u05e9",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback",html5_video_options:"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/hi_dlg.js b/js/tiny_mce/plugins/media/langs/hi_dlg.js new file mode 100755 index 000000000..21619d699 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/hr_dlg.js b/js/tiny_mce/plugins/media/langs/hr_dlg.js new file mode 100755 index 000000000..f80bcfaa9 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/hu_dlg.js b/js/tiny_mce/plugins/media/langs/hu_dlg.js new file mode 100755 index 000000000..7cf8c9558 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.media_dlg',{list:"Lista",file:"F\u00e1jl/URL",advanced:"Halad\u00f3",general:"\u00c1ltal\u00e1nos",title:"Be\u00e1gyazott m\u00e9dia besz\u00far\u00e1sa/szerkeszt\u00e9se","align_top_left":"Bal-fent","align_center":"K\u00f6z\u00e9pen","align_left":"Balra","align_bottom":"Lent","align_right":"Jobbra","align_top":"Fent","qt_stream_warn":"Streamelt rtsp forr\u00e1sok a QT Src mez\u0151be val\u00f3k a halad\u00f3 lapon.\\nHozz\u00e1 kellene adnia egy nem streamelt verzi\u00f3t a Src mez\u0151ben.",qtsrc:"QT Src",progress:"Folymat",sound:"Hang",swstretchvalign:"Ny\u00fajt\u00e1s F-igaz\u00edt\u00e1s",swstretchhalign:"Ny\u00fajt\u00e1s V-igaz\u00edt\u00e1s",swstretchstyle:"Ny\u00fajt\u00e1s st\u00edlus",scriptcallbacks:"Script callbacks","align_top_right":"Jobb-fent",uimode:"UI M\u00f3d",rate:"Rate",playcount:"Lej\u00e1tsz\u00e1ssz\u00e1m",defaultframe:"Alap\u00e9rtelmezett frame",currentposition:"Aktu\u00e1lis poz\u00edci\u00f3",currentmarker:"Aktu\u00e1lis marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Ablak n\u00e9lk\u00fcli vide\u00f3",stretchtofit:"Ny\u00fajtva igaz\u00edt\u00e1s",mute:"N\u00e9ma",invokeurls:"URL-ek bevon\u00e1sa",fullscreen:"Teljes k\u00e9perny\u0151",enabled:"Enged\u00e9lyezve",autostart:"Automatikus kezd\u00e9s",volume:"Hanger\u0151",target:"C\u00e9l",qtsrcchokespeed:"Folyt\u00e1s sebess\u00e9ge",href:"Href",endtime:"Z\u00e1r\u00f3 id\u0151",starttime:"Kezd\u00e9si id\u0151",enablejavascript:"JavaScript enged\u00e9se",correction:"Nincs jav\u00edt\u00e1s",targetcache:"C\u00e9l cache",playeveryframe:"Minden kocka lej\u00e1tsz\u00e1sa",kioskmode:"Kiosk m\u00f3d",controller:"Vez\u00e9rl\u0151",menu:"Men\u00fc mutat\u00e1sa",loop:"Ism\u00e9tl\u00e9s",play:"Automatikus lej\u00e1tsz\u00e1s",hspace:"V-t\u00e1v",vspace:"F-t\u00e1v","class_name":"Oszt\u00e1ly",name:"N\u00e9v",id:"Id",type:"T\u00edpus",size:"Dimenzi\u00f3k",preview:"El\u0151n\u00e9zet","constrain_proportions":"Ar\u00e1nytart\u00e1s",controls:"Kezel\u0151k",numloop:"Ism\u00e9tl\u00e9ssz\u00e1m",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"H\u00e1tt\u00e9r",wmode:"WM\u00f3d",salign:"SElrendez\u00e9s",align:"Elrendez\u00e9s",scale:"Nagy\u00edt\u00e1s",quality:"Min\u0151s\u00e9g",shuffle:"V\u00e9letlenszer\u0171",prefetch:"El\u0151t\u00f6lt\u00e9s",nojava:"Nincs java",maintainaspect:"Ar\u00e1nytart\u00e1s",imagestatus:"K\u00e9p \u00e1llapot",center:"K\u00f6z\u00e9pre",autogotourl:"Automatikus URL-re ugr\u00e1s","shockwave_options":"Shockwave be\u00e1ll\u00edt\u00e1sai","rmp_options":"Real media player be\u00e1ll\u00edt\u00e1sai","wmp_options":"Windows media player be\u00e1ll\u00edt\u00e1sai","qt_options":"Quicktime be\u00e1ll\u00edt\u00e1sai","flash_options":"Flash be\u00e1ll\u00edt\u00e1sai",hidden:"Rejtett","align_bottom_left":"Bal-lent","align_bottom_right":"Bal-jobbra","flv_options":"Flash vide\u00f3 be\u00e1ll\u00edt\u00e1sai","flv_scalemode":"Nagy\u00edt\u00e1s m\u00f3d","flv_buffer":"Buffer","flv_startimage":"Start k\u00e9p","flv_starttime":"Start id\u0151","flv_defaultvolume":"Alap\u00e9rtelmezett hanger\u0151","flv_hiddengui":"Rejtett GUI","flv_autostart":"Aut\u00f3 start","flv_loop":"Ism\u00e9tl\u00e9s","flv_showscalemodes":"Nagy\u00edt\u00e1si m\u00f3dok mutat\u00e1sa","flv_smoothvideo":"Vide\u00f3 sim\u00edt\u00e1sa","flv_jscallback":"JS Callback","html5_video_options":"HTML5 Video be\u00e1ll\u00edt\u00e1sok",altsource1:"Alternat\u00edv forr\u00e1s 1",altsource2:"Alternat\u00edv forr\u00e1s 2",preload:"El\u0151t\u00f6lt\u00e9s",poster:"Hozz\u00e1ad\u00f3",source:"Forr\u00e1s"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/hy_dlg.js b/js/tiny_mce/plugins/media/langs/hy_dlg.js new file mode 100755 index 000000000..0d7dd886d --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.media_dlg',{list:"\u0421\u043f\u0438\u0441\u043e\u043a",file:"\u0424\u0430\u0439\u043b / URL",advanced:"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",general:"\u041e\u0431\u0449\u0435\u0435",title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c / \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab \\ nYou should also add a non streamed version to the Src field ..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"\u0411\u0430\u043b\u0430\u043d\u0441",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"\u0410\u0432\u0442\u043e\u0441\u0442\u0430\u0440\u0442",volume:"\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044e",loop:"\u041b\u0443\u043f",play:"\u0410\u0432\u0442\u043e\u043f\u043b\u0435\u0439",hspace:"\u0433\u043e\u0440. \u043e\u0442\u0441\u0442\u0443\u043f",vspace:"\u0432\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f",class_name:"\u041a\u043b\u0430\u0441\u0441",name:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",id:"Id",type:"\u0422\u0438\u043f",size:"\u0420\u0430\u0437\u043c\u0435\u0440\u044b",preview:"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",constrain_proportions:"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438",controls:"Controls",numloop:"Num loops",console:"Console",cache:"\u041a\u044d\u0448",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"\u0424\u043e\u043d",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ia_dlg.js b/js/tiny_mce/plugins/media/langs/ia_dlg.js new file mode 100755 index 000000000..b03a3c7d9 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6/\u5730\u5740",advanced:"\u9ad8\u7ea7",general:"\u57fa\u672c",title:"\u63d2\u5165/\u7f16\u8f91 \u5a92\u4f53",align_top_left:"\u9876\u90e8\u5c45\u5de6",align_center:"\u5c45\u4e2d",align_left:"\u5c45\u5de6",align_bottom:"\u5e95\u90e8",align_right:"\u5c45\u53f3",align_top:"\u9876\u90e8",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u7f29\u653e\u81f3\u5782\u76f4\u5bf9\u9f50",swstretchhalign:"\u7f29\u653e\u81f3\u6c34\u5e73\u5bf9\u9f50",swstretchstyle:"\u7f29\u653e\u6837\u5f0f",scriptcallbacks:"\u811a\u672c\u56de\u6863",align_top_right:"\u9876\u90e8\u5c45\u53f3",uimode:"UI \u6a21\u5f0f",rate:"\u7801\u7387",playcount:"\u64ad\u653e\u6b21\u6570",defaultframe:"\u9ed8\u8ba4\u5e27",currentposition:"\u5f53\u524d\u4f4d\u7f6e",currentmarker:"\u5f53\u524d\u6807\u7b7e",captioningid:"\u5b57\u5e55 id",baseurl:"Base URL",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u7a97\u53e3\u89c6\u9891",stretchtofit:"\u7f29\u653e\u81f3\u5408\u9002\u5927\u5c0f",mute:"\u9759\u97f3",invokeurls:"\u8c03\u7528\u7684URLs",fullscreen:"\u5168\u5c4f\u5e55",enabled:"\u542f\u7528",autostart:"\u81ea\u52a8\u5f00\u59cb",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528 JavaScript",correction:"\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u9010\u5e27\u64ad\u653e",kioskmode:"Kiosk \u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u83dc\u5355",loop:"\u5faa\u73af",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",class_name:"\u7c7b\u540d",name:"\u540d\u79f0",id:"Id",type:"\u7c7b\u578b",size:"\u5927\u5c0f",preview:"\u9884\u89c8",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",controls:"\u63a7\u5236",numloop:"\u5faa\u73af\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash\u53d8\u6570",base:"\u57fa\u7ebf",bgcolor:"\u80cc\u666f\u8272",wmode:"WMode",salign:"SAlign",align:"\u5bf9\u9f50",scale:"\u7f29\u653e",quality:"\u54c1\u8d28",shuffle:"\u968f\u673a",prefetch:"\u9884\u8bfb",nojava:"No java",maintainaspect:"\u7ef4\u62a4\u72b6\u6001",imagestatus:"\u56fe\u50cf\u72b6\u6001",center:"\u5c45\u4e2d",autogotourl:"\u81ea\u52a8\u8df3\u8f6c URL",shockwave_options:"Shockwave \u9009\u9879",rmp_options:"Real media player \u9009\u9879",wmp_options:"Windows media player \u9009\u9879",qt_options:"Quicktime \u9009\u9879",flash_options:"Flash \u9009\u9879",hidden:"\u9690\u85cf",align_bottom_left:"\u5e95\u90e8\u5c45\u5de6",align_bottom_right:"\u5e95\u90e8\u5c45\u53f3",flv_options:"Flash \u89c6\u9891\u9009\u9879",flv_scalemode:"\u7f29\u653e\u6a21\u5f0f",flv_buffer:"\u7f13\u51b2",flv_startimage:"\u5f00\u59cb\u56fe\u50cf",flv_starttime:"\u5f00\u59cb\u65f6\u95f4",flv_defaultvolume:"\u9ed8\u8ba4\u58f0\u97f3",flv_hiddengui:"\u9690\u85cfGUI",flv_autostart:"\u81ea\u52a8\u5f00\u59cb",flv_loop:"\u5faa\u73af",flv_showscalemodes:"\u663e\u793a\u7f29\u653e\u6a21\u5f0f",flv_smoothvideo:"\u5e73\u6ed1\u89c6\u9891",flv_jscallback:"JS \u56de\u6a94"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/id_dlg.js b/js/tiny_mce/plugins/media/langs/id_dlg.js new file mode 100755 index 000000000..a5781c4c0 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Atas Kiri",align_center:"Tengah",align_left:"Kiri",align_bottom:"Bawah",align_right:"Kanan",align_top:"Atas",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Atas Kanan",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bawah Kiri",align_bottom_right:"Bawah kanan",flv_options:"Opsi Flash video",flv_scalemode:"Mode Skala",flv_buffer:"Buffer",flv_startimage:"Gambar Mulai",flv_starttime:"Waktu mulai",flv_defaultvolume:"Volume suara default",flv_hiddengui:"GUI tersembunyi",flv_autostart:"Mulai otomatis",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ii_dlg.js b/js/tiny_mce/plugins/media/langs/ii_dlg.js new file mode 100755 index 000000000..931f5c8f5 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ii_dlg.js @@ -0,0 +1,103 @@ +tinyMCE.addI18n('ii.media_dlg',{ +title:"\u63D2\u5165/\u7F16\u8F91\u5D4C\u5165\u5A92\u4F53", +general:"\u4E00\u822C", +advanced:"\u9AD8\u7EA7", +file:"\u6587\u4EF6/\u7F51\u5740", +list:"\u5217\u8868", +size:"\u5C3A\u5BF8", +preview:"\u9884\u89C8", +constrain_proportions:"\u4FDD\u6301\u6BD4\u4F8B", +type:"\u7C7B\u578B", +id:"Id", +name:"\u540D\u79F0", +class_name:"\u7C7B\u578B", +vspace:"\u6C34\u51C6\u95F4\u8DDD", +hspace:"\u5782\u76F4\u95F4\u8DDD", +play:"\u81EA\u52A8\u64AD\u653E", +loop:"\u56DE\u5708\u64AD\u653E", +menu:"\u663E\u793A\u529F\u80FD\u8868", +quality:"\u54C1\u8D28", +scale:"\u6BD4\u4F8B", +align:"\u5BF9\u9F50", +salign:"SAlign", +wmode:"\u7A97\u53E3\u6A21\u5F0F", +bgcolor:"\u80CC\u666F\u8272", +base:"\u57FA\u5E95", +flashvars:"\u53C2\u6570", +liveconnect:"SWLiveConnect", +autohref:"\u81EA\u52A8HREF", +cache:"\u7F13\u5B58", +hidden:"\u9690\u85CF", +controller:"\u63A7\u5236\u53F0", +kioskmode:"Kiosk\u6A21\u5F0F", +playeveryframe:"\u64AD\u653E\u6BCF\u4E00\u5E27", +targetcache:"\u76EE\u6807\u7F13\u5B58", +correction:"\u6CA1\u6709\u4FEE\u6B63", +enablejavascript:"\u542F\u7528JavaScript", +starttime:"\u5F00\u59CB\u65F6\u95F4", +endtime:"\u7ED3\u675F\u65F6\u95F4", +href:"\u8FDE\u7ED3", +qtsrcchokespeed:"Choke speed", +target:"\u76EE\u6807", +volume:"\u97F3\u91CF", +autostart:"\u81EA\u52A8\u5F00\u59CB", +enabled:"\u542F\u7528", +fullscreen:"\u5168\u5C4F", +invokeurls:"\u76F8\u5173URLs", +mute:"\u9759\u97F3", +stretchtofit:"\u62C9\u4F38", +windowlessvideo:"\u65E0\u8FB9\u6846", +balance:"\u5E73\u8861", +baseurl:"\u57FA\u51C6URL", +captioningid:"Captioning id", +currentmarker:"\u5F53\u524D\u6807\u8BB0", +currentposition:"\u5F53\u524D\u4F4D\u7F6E", +defaultframe:"\u9ED8\u8BA4\u5E27", +playcount:"\u64AD\u653E\u8BA1\u6570", +rate:"\u5E27\u7387", +uimode:"\u9762\u677F\u6A21\u5F0F", +flash_options:"Flash\u9009\u9879", +qt_options:"Quicktime\u9009\u9879", +wmp_options:"Windows media player\u9009\u9879", +rmp_options:"Real media player\u9009\u9879", +shockwave_options:"Shockwave\u9009\u9879", +autogotourl:"\u81EA\u52A8\u8F6C\u5230URL", +center:"\u4E2D\u5FC3", +imagestatus:"\u56FE\u50CF\u72B6\u6001", +maintainaspect:"Maintain aspect", +nojava:"No java", +prefetch:"\u9884\u8BFB\u53D6", +shuffle:"Shuffle", +console:"\u63A7\u5236\u53F0", +numloop:"\u56DE\u5708\u6B21\u6570", +controls:"\u63A7\u5236\u5668", +scriptcallbacks:"\u811A\u672C\u56DE\u6863", +swstretchstyle:"\u62C9\u5347\u6A21\u5F0F", +swstretchhalign:"\u6C34\u51C6\u62C9\u5347", +swstretchvalign:"\u5782\u76F4\u62C9\u5347", +sound:"\u58F0\u97F3", +progress:"\u8FDB\u5EA6", +qtsrc:"QT Src", +qt_stream_warn:"\u6D41\u5F0Frtsp\u8D44\u6E90\u5E94\u8BE5\u6DFB\u52A0\u5230\u201C\u9AD8\u7EA7\u201D\u4E2DQT Src\u3002\n\u540C\u65F6\u6DFB\u52A0\u975E\u6D41\u5F0F\u8D44\u6E90\u5230Src\u3002", +align_top:"\u4E0A\u65B9", +align_right:"\u9760\u53F3", +align_bottom:"\u4E0B\u65B9", +align_left:"\u9760\u5DE6", +align_center:"\u4E2D\u95F4", +align_top_left:"\u5DE6\u4E0A", +align_top_right:"\u53F3\u4E0A", +align_bottom_left:"\u5DE6\u4E0B", +align_bottom_right:"\u53F3\u4E0B", +flv_options:"Flash\u89C6\u9891\u9009\u9879", +flv_scalemode:"Scale mode", +flv_buffer:"\u7F13\u51B2", +flv_startimage:"\u5F00\u59CB\u753B\u9762", +flv_starttime:"\u5F00\u59CB\u65F6\u95F4", +flv_defaultvolume:"\u9884\u8BBE\u97F3\u91CF", +flv_hiddengui:"\u9690\u85CFGUI", +flv_autostart:"\u81EA\u52A8\u64AD\u653E", +flv_loop:"\u56DE\u5708", +flv_showscalemodes:"Show scale modes", +flv_smoothvideo:"\u5E73\u6ED1\u56FE\u50CF", +flv_jscallback:"JS\u56DE\u6863" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/is_dlg.js b/js/tiny_mce/plugins/media/langs/is_dlg.js new file mode 100755 index 000000000..4d20a5cb4 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.media_dlg',{list:"Listi",file:"Skr\u00e1/Sl\u00f3\u00f0",advanced:"\u00cdtarlegt",general:"Almennt",title:"Setja inn / Breyta birtingu margmi\u00f0lunar",align_top_left:"Efst vinstri",align_center:"Mi\u00f0ja",align_left:"Vinstri",align_bottom:"Ne\u00f0st",align_right:"H\u00e6gri",align_top:"Efst",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Sta\u00f0a",sound:"Hlj\u00f3\u00f0",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Efst h\u00e6gri",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Upprunalegur rammi",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Gluggalaust myndband",stretchtofit:"Teigja til a\u00f0 passa",mute:"Dempa",invokeurls:"Virkja sl\u00f3\u00f0ir",fullscreen:"Heilskj\u00e1r",enabled:"Virkt",autostart:"Byrja sj\u00e1lfvirkt",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"S\u00fdna valmynd",loop:"Endurtaka",play:"Sj\u00e1lfvirk spilun",hspace:"L\u00e1r-bil",vspace:"L\u00f3\u00f0r-bil",class_name:"Flokkur",name:"Nafn",id:"Id",type:"Ger\u00f0",size:"V\u00edddir",preview:"Forsko\u00f0un",constrain_proportions:"Halda hlutf\u00f6llum",controls:"Stj\u00f3rn",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Bakgrunnur",wmode:"WMode",salign:"SAlign",align:"J\u00f6fnun",scale:"A\u00f0l\u00f6gun",quality:"G\u00e6\u00f0i",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"Ekkert java",maintainaspect:"Halda hlutf\u00f6llum",imagestatus:"Sta\u00f0a myndar",center:"Mi\u00f0ja",autogotourl:"Auto goto URL",shockwave_options:"Shockwave m\u00f6guleikar",rmp_options:"Real media player m\u00f6guleikar",wmp_options:"Windows media player m\u00f6guleikar",qt_options:"Quicktime m\u00f6guleikar",flash_options:"Flash m\u00f6guleikar",hidden:"Hidden",align_bottom_left:"Ne\u00f0st vinstri",align_bottom_right:"Ne\u00f0st h\u00e6gri",flv_options:"Flash m\u00f6guleikar",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/it_dlg.js b/js/tiny_mce/plugins/media/langs/it_dlg.js new file mode 100755 index 000000000..36e80448f --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.media_dlg',{list:"Lista",file:"File/URL",advanced:"Avanzate",general:"Generale",title:"Inserisci/modifica file multimediale",align_top_left:"Alto a sinistra",align_center:"Centro",align_left:"Sinistra",align_bottom:"Basso",align_right:"Destra",align_top:"Alto",qt_stream_warn:"Le risorse rstp \'streamed\' devono essere aggiunte al campo Sorgente QT nella tabella Avanzate.\\nSi dovrebbe inserire anche una versione non \'streamed\' al campo Sorgente..",qtsrc:"Sorgente QT",progress:"Avanzamento",sound:"Suono",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Alto a destra",uimode:"Modalit\u00e0 Interfaccia Utente",rate:"Qualit\u00e0",playcount:"Conteggio esecuzione",defaultframe:"frame predefinito",currentposition:"Posizione corrente",currentmarker:"Indicatore corrente",captioningid:"Didascalia dell\'Id",baseurl:"URL base",balance:"Bilanciamento",windowlessvideo:"Video senza finestra",stretchtofit:"Adatta dimensioni",mute:"Muto",invokeurls:"Invoca URLs",fullscreen:"Tutto schermo",enabled:"Abilitato",autostart:"Avvio automatico",volume:"Volume",target:"Target",qtsrcchokespeed:"Velocit\u00e0 cursore",href:"Href",endtime:"Ora fine",starttime:"Ora inizio",enablejavascript:"Abilita JavaScript",correction:"Nessuna correzione",targetcache:"Cache del target",playeveryframe:"Esegui ogni frame",kioskmode:"Modalit\u00e0 Kiosk",controller:"Controller",menu:"Mostra menu",loop:"Riproduzione ciclica",play:"Esecuzione automatica",hspace:"H-Space",vspace:"V-Space",class_name:"Classe",name:"Nome",id:"Id",type:"Tipo",size:"Dimensioni",preview:"Anteprima",constrain_proportions:"Mantieni proporzioni",controls:"Controlli",numloop:"Numero cicli",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Sfondo",wmode:"WMode",salign:"SAlign",align:"Allineamento",scale:"Scala",quality:"Qualit\u00e0",shuffle:"Shuffle",prefetch:"Precaricamento",nojava:"No java",maintainaspect:"Mantieni aspetto",imagestatus:"Stato immagine",center:"Centra",autogotourl:"Vai a URL automatico",shockwave_options:"Opzioni Shockwave",rmp_options:"Opzioni Real media player",wmp_options:"Opzioni Windows media player",qt_options:"Opzioni Quicktime",flash_options:"Opzioni Flash",hidden:"Nascosto",align_bottom_left:"Basso a sinistra",align_bottom_right:"Basso a destra",flv_options:"Opzioni video Flash",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Immagine avvio",flv_starttime:"Tempo avvio",flv_defaultvolume:"Volume predefinito",flv_hiddengui:"GUI nascosta",flv_autostart:"Avvio automatico",flv_loop:"Riproduzione ciclica",flv_showscalemodes:"Mostra scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ja_dlg.js b/js/tiny_mce/plugins/media/langs/ja_dlg.js new file mode 100755 index 000000000..5fa0f6436 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.media_dlg',{list:"\u4e00\u89a7\u304b\u3089\u9078\u3076",file:"\u30d5\u30a1\u30a4\u30eb/URL",advanced:"\u4e0a\u7d1a\u8005\u5411\u3051",general:"\u4e00\u822c",title:"\u57cb\u3081\u8fbc\u307f\u30e1\u30c7\u30a3\u30a2\u306e\u633f\u5165/\u7de8\u96c6","align_top_left":"\u5de6\u4e0a","align_center":"\u4e2d\u592e","align_left":"\u5de6","align_bottom":"\u4e0b","align_right":"\u53f3","align_top":"\u4e0a","qt_stream_warn":"rtsp\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u30ea\u30bd\u30fc\u30b9\u3092\u300c\u4e0a\u7d1a\u8005\u5411\u3051\u300d\u30bf\u30d6\u306e\u300cQT Src\u300d\u6b04\u306b\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\\n\u307e\u305f\u3001\u300cSrc\u300d\u6b04\u306b\u306f\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u3067\u306f\u306a\u3044\u30d0\u30fc\u30b8\u30e7\u30fc\u30f3\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",qtsrc:"QT Src",progress:"Progress",sound:"\u30b5\u30a6\u30f3\u30c9",swstretchvalign:"\u5782\u76f4\u4f4d\u7f6e",swstretchhalign:"\u6c34\u5e73\u4f4d\u7f6e",swstretchstyle:"\u4f38\u7e2e",scriptcallbacks:"\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30a4\u30d9\u30f3\u30c8","align_top_right":"\u53f3\u4e0a",uimode:"UI\u8868\u793a\u30e2\u30fc\u30c9",rate:"\u518d\u751f\u30ec\u30fc\u30c8",playcount:"\u518d\u751f\u56de\u6570",defaultframe:"\u30c7\u30d5\u30a9\u30eb\u30c8\u30d5\u30ec\u30fc\u30e0",currentposition:"\u518d\u751f\u4f4d\u7f6e\uff08\u79d2\u5358\u4f4d\uff09",currentmarker:"\u30de\u30fc\u30ab\u30fc\u756a\u53f7",captioningid:"\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\u8868\u793a\u8981\u7d20ID",baseurl:"Base URL",balance:"\u30b9\u30c6\u30ec\u30aa\u306e\u30d0\u30e9\u30f3\u30b9",windowlessvideo:"windowless\u30e2\u30fc\u30c9",stretchtofit:"\u81ea\u52d5\u30b5\u30a4\u30ba\u5909\u66f4",mute:"\u30df\u30e5\u30fc\u30c8",invokeurls:"URL\u3092\u958b\u304f",fullscreen:"\u30d5\u30eb\u30b9\u30af\u30ea\u30fc\u30f3",enabled:"\u6709\u52b9\u306b\u3059\u308b",autostart:"\u81ea\u52d5\u518d\u751f",volume:"\u97f3\u91cf",target:"\u30bf\u30fc\u30b2\u30c3\u30c8",qtsrcchokespeed:"\u518d\u751f\u30c7\u30fc\u30bf\u30ec\u30fc\u30c8",href:"\u30ea\u30f3\u30af\u5148URL",endtime:"\u7d42\u4e86\u30d5\u30ec\u30fc\u30e0",starttime:"\u958b\u59cb\u30d5\u30ec\u30fc\u30e0",enablejavascript:"JavaScript\u3092\u6709\u52b9\u306b\u3059\u308b",correction:"No correction",targetcache:"\u30bf\u30fc\u30b2\u30c3\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5",playeveryframe:"\u5168\u30d5\u30ec\u30fc\u30e0\u518d\u751f",kioskmode:"Kiosk\u30e2\u30fc\u30c9",controller:"\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u8868\u793a",menu:"\u30e1\u30cb\u30e5\u30fc\u3092\u8868\u793a",loop:"\u7e70\u308a\u8fd4\u3057\u518d\u751f",play:"\u81ea\u52d5\u518d\u751f",hspace:"\u5de6\u53f3\u4f59\u767d",vspace:"\u4e0a\u4e0b\u4f59\u767d","class_name":"\u30af\u30e9\u30b9",name:"\u540d\u524d",id:"ID",type:"\u30bf\u30a4\u30d7",size:"\u30b5\u30a4\u30ba",preview:"\u30d7\u30ec\u30d3\u30e5\u30fc","constrain_proportions":"\u7e26\u6a2a\u6bd4\u3092\u4fdd\u5b58",controls:"\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u8868\u793a",numloop:"\u7e70\u308a\u8fd4\u3057\u56de\u6570",console:"\u30b3\u30f3\u30bd\u30fc\u30eb",cache:"\u30ad\u30e3\u30c3\u30b7\u30e5",autohref:"\u81ea\u52d5\u8aad\u8fbc",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"\u80cc\u666f\u8272",wmode:"WMode",salign:"SAlign",align:"\u914d\u7f6e",scale:"\u4f38\u7e2e",quality:"\u54c1\u8cea",shuffle:"\u30b7\u30e3\u30c3\u30d5\u30eb",prefetch:"\u30d7\u30ea\u30d5\u30a7\u30c3\u30c1",nojava:"Java\u3092\u7981\u6b62",maintainaspect:"\u7e26\u6a2a\u6bd4\u4fdd\u5b58",imagestatus:"\u30b9\u30c6\u30fc\u30bf\u30b9\u8868\u793a",center:"\u30bb\u30f3\u30bf\u30ea\u30f3\u30b0",autogotourl:"autogotourl","shockwave_options":"Shockwave\u30aa\u30d7\u30b7\u30e7\u30f3","rmp_options":"Real media player\u30aa\u30d7\u30b7\u30e7\u30f3","wmp_options":"Windows media player\u30aa\u30d7\u30b7\u30e7\u30f3","qt_options":"Quicktime\u30aa\u30d7\u30b7\u30e7\u30f3","flash_options":"Flash\u30aa\u30d7\u30b7\u30e7\u30f3",hidden:"\u975e\u8868\u793a","align_bottom_left":"\u5de6\u4e0b","align_bottom_right":"\u53f3\u4e0b","flv_options":"Flash video\u30aa\u30d7\u30b7\u30e7\u30f3","flv_scalemode":"\u4f38\u7e2e\u30e2\u30fc\u30c9","flv_buffer":"\u30d0\u30c3\u30d5\u30a1\u79d2\u6570","flv_startimage":"\u521d\u671f\u753b\u50cfURL","flv_starttime":"\u958b\u59cb\u30d5\u30ec\u30fc\u30e0","flv_defaultvolume":"\u97f3\u91cf","flv_hiddengui":"\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u975e\u8868\u793a","flv_autostart":"\u81ea\u52d5\u518d\u751f","flv_loop":"\u7e70\u308a\u8fd4\u3057\u518d\u751f","flv_showscalemodes":"\u4f38\u7e2e\u5207\u66ff\u30dc\u30bf\u30f3\u8868\u793a","flv_smoothvideo":"\u30b9\u30e0\u30fc\u30b8\u30f3\u30b0","flv_jscallback":"JS\u30b3\u30fc\u30eb\u30d0\u30c3\u30af","html5_video_options":"HTML5 Video \u30aa\u30d7\u30b7\u30e7\u30f3",altsource1:"\u4ee3\u66ff\u30bd\u30fc\u30b91",altsource2:"\u4ee3\u66ff\u30bd\u30fc\u30b92",preload:"preload\u5c5e\u6027",poster:"poster\u5c5e\u6027",source:"HTML"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ka_dlg.js b/js/tiny_mce/plugins/media/langs/ka_dlg.js new file mode 100755 index 000000000..09ee13cc7 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.media_dlg',{list:"\u10e9\u10d0\u10db\u10dd\u10dc\u10d0\u10d7\u10d5\u10d0\u10da\u10d8",file:"\u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8",advanced:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7",general:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd",title:"\u10d9\u10da\u10d8\u10de\u10d8\u10e1 \u10db\u10d0\u10ee\u10d0\u10e1\u10d8\u10d0\u10d7\u10d4\u10d1\u10da\u10d4\u10d1\u10d8",align_top_left:"\u10db\u10d0\u10e0\u10ea\u10ee\u10d4\u10dc\u10d0 \u10d6\u10d4\u10d3\u10d0 \u10d9\u10e3\u10d7\u10ee\u10d4",align_center:"\u10ea\u10d4\u10dc\u10e2\u10e0\u10d8",align_left:"\u10db\u10d0\u10e0\u10ea\u10ee\u10d4\u10dc\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_bottom:"\u10e5\u10d5\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_right:"\u10db\u10d0\u10e0\u10ef\u10d5\u10d4\u10dc\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_top:"\u10d6\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",qt_stream_warn:"\u10dc\u10d0\u10d9\u10d0\u10d3\u10dd\u10d5\u10d0\u10dc\u10d8 rtsp \u10e0\u10d4\u10e1\u10e3\u10e0\u10e1\u10d4\u10d1\u10d8 \u10e3\u10dc\u10d3\u10d0 \u10e9\u10d0\u10d0\u10db\u10d0\u10e2\u10dd\u10d7 QT Src \u10d5\u10d4\u10da\u10e8\u10d8, \"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7\" \u10d2\u10d5\u10d4\u10e0\u10d3\u10d6\u10d4.\n\u10ee\u10dd\u10da\u10dd \u10d0\u10e0\u10d0 \u10dc\u10d0\u10d9\u10d0\u10d3\u10dd\u10d5\u10d0\u10dc\u10d8 \u10d5\u10d4\u10e0\u10e1\u10d8\u10d0 - Src \u10d5\u10d4\u10da\u10e8\u10d8.",qtsrc:"QT Src",progress:"\u10de\u10e0\u10dd\u10d2\u10e0\u10d4\u10e1\u10d8",sound:"\u10ee\u10db\u10d0",swstretchvalign:"\u10d5\u10d4\u10e0\u10e2. \u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0 \u10d2\u10d0\u10ec\u10d4\u10da\u10d5\u10d8\u10d7",swstretchhalign:"\u10f0\u10dd\u10e0\u10d8\u10d6. \u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0 \u10d2\u10d0\u10ec\u10d4\u10da\u10d5\u10d8\u10d7",swstretchstyle:"\u10d2\u10d0\u10ec\u10d4\u10da\u10d5\u10d8\u10e1 \u10e1\u10e2\u10d8\u10da\u10d8",scriptcallbacks:"\u10e1\u10e5\u10e0\u10d8\u10de\u10e2\u10d8\u10e1 \u10db\u10ee\u10d0\u10e0\u10d3\u10d0\u10ed\u10d4\u10e0\u10d0",align_top_right:"\u10db\u10d0\u10e0\u10ef\u10d5\u10d4\u10dc\u10d0 \u10d6\u10d4\u10d3\u10d0 \u10d9\u10e3\u10d7\u10ee\u10d4",uimode:"\u10d8\u10dc\u10e2\u10d4\u10e0\u10e4\u10d4\u10d8\u10e1\u10d8\u10e1 \u10e0\u10d4\u10df\u10d8\u10db\u10d8",rate:"\u10e0\u10d4\u10d8\u10e2\u10d8\u10dc\u10d2\u10d8",playcount:"\u10dc\u10d0\u10ee\u10d5\u10d4\u10d1\u10d8\u10e1 \u10db\u10d7\u10d5\u10da\u10d4\u10da\u10d8",defaultframe:"\u10db\u10d7\u10d0\u10d5\u10d0\u10e0\u10d8 \u10d9\u10d0\u10d3\u10e0\u10d8",currentposition:"\u10db\u10dd\u10ea\u10d4\u10db\u10e3\u10da\u10d8 \u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10d0",currentmarker:"\u10db\u10dd\u10ea\u10d4\u10db\u10e3\u10da\u10d8 \u10db\u10d0\u10e0\u10d9\u10d4\u10e0\u10d8",captioningid:"\u10e1\u10e3\u10d1\u10e2\u10d8\u10e2\u10e0\u10d4\u10d1\u10d8\u10e1 \u10e1\u10d0\u10ee\u10d4\u10da\u10d8",baseurl:"\u10e1\u10d0\u10d1\u10d0\u10d6\u10d8\u10e1\u10dd \u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8",balance:"\u10d1\u10d0\u10da\u10d0\u10dc\u10e1\u10d8",windowlessvideo:"\u10e4\u10d0\u10dc\u10ef\u10e0\u10d8\u10e1 \u10d5\u10d8\u10d3\u10d4\u10dd",stretchtofit:"\u10e4\u10d0\u10dc\u10ef\u10e0\u10d8\u10e1 \u10d6\u10dd\u10db\u10d0\u10d6\u10d4",mute:"\u10ee\u10db\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4",invokeurls:"\u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10eb\u10d0\u10ee\u10d4\u10d1\u10d0",fullscreen:"\u10db\u10d7\u10d4\u10da \u10d4\u10d9\u10e0\u10d0\u10dc\u10d6\u10d4",enabled:"\u10e9\u10d0\u10e0\u10d7\u10e3\u10da\u10d8\u10d0",autostart:"\u10d0\u10d5\u10e2\u10dd\u10d2\u10d0\u10e8\u10d5\u10d4\u10d1\u10d0",volume:"\u10ee\u10db\u10d0",target:"\u10db\u10d8\u10d6\u10d0\u10dc\u10d8",qtsrcchokespeed:"\u10e1\u10d8\u10ee\u10e8\u10d8\u10e0\u10d4",href:"\u10d1\u10db\u10e3\u10da\u10d8",endtime:"\u10d3\u10d0\u10e1\u10e0\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10d3\u10e0\u10dd",starttime:"\u10d3\u10d0\u10ec\u10e7\u10d4\u10d1\u10d8\u10e1 \u10d3\u10e0\u10dd",enablejavascript:"JavaScript-\u10d8\u10e1 \u10e9\u10d0\u10e0\u10d7\u10d5\u10d0",correction:"\u10d9\u10dd\u10e0\u10d4\u10e5\u10e2\u10d8\u10e0\u10d4\u10d1\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4",targetcache:"\u10e5\u10d4\u10e8\u10d8",playeveryframe:"\u10e7\u10d5\u10d4\u10da\u10d0 \u10d9\u10d0\u10d3\u10e0\u10d8\u10e1 \u10d0\u10e1\u10d0\u10ee\u10d5\u10d0",kioskmode:"\u10d9\u10d8\u10dd\u10e1\u10d9\u10d8\u10e1 \u10e0\u10d4\u10df\u10d8\u10db\u10d8",controller:"\u10db\u10d0\u10e0\u10d7\u10d5\u10d0",menu:"\u10db\u10d4\u10dc\u10d8\u10e3\u10e1 \u10d2\u10d0\u10db\u10dd\u10e9\u10d4\u10dc\u10d0",loop:"\u10d2\u10d0\u10db\u10d4\u10dd\u10e0\u10d4\u10d1\u10d0",play:"\u10d0\u10d5\u10e2\u10dd\u10d2\u10d0\u10e8\u10d5\u10d4\u10d1\u10d0",hspace:"\u10f0\u10dd\u10e0\u10d8\u10d6. \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",vspace:"\u10d5\u10d4\u10e0\u10e2. \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",class_name:"\u10d9\u10da\u10d0\u10e1\u10d8",name:"\u10e1\u10d0\u10ee\u10d4\u10da\u10ec\u10dd\u10d3\u10d4\u10d1\u10d0",id:"\u10d8\u10d3\u10d4\u10dc\u10e2\u10d8\u10e4\u10d8\u10d9\u10d0\u10e2\u10dd\u10e0\u10d8",type:"\u10e2\u10d8\u10de\u10d8",size:"\u10d6\u10dd\u10db\u10d4\u10d1\u10d8",preview:"\u10ec\u10d8\u10dc\u10d0\u10e1\u10ec\u10d0\u10e0\u10d8 \u10d3\u10d0\u10d7\u10d5\u10d0\u10da\u10d8\u10d4\u10e0\u10d4\u10d1\u10d0",constrain_proportions:"\u10de\u10e0\u10dd\u10de\u10dd\u10e0\u10ea\u10d8\u10d4\u10d1\u10d8\u10e1 \u10e8\u10d4\u10dc\u10d0\u10e0\u10e9\u10e3\u10dc\u10d4\u10d1\u10d0",controls:"\u10db\u10d0\u10e0\u10d7\u10d5\u10d0",numloop:"\u10d2\u10d0\u10db\u10d4\u10dd\u10e0\u10d4\u10d1\u10d0\u10d7\u10d0 \u10e0\u10d8\u10ea\u10ee\u10d5\u10d8",console:"\u10d9\u10dd\u10dc\u10e1\u10dd\u10da\u10d8",cache:"\u10e5\u10d4\u10e8\u10d8",autohref:"\u10d0\u10d5\u10e2\u10dd \u10d1\u10db\u10e3\u10da\u10d8",liveconnect:"SWLiveConnect",flashvars:"Flas \u10d1\u10e0\u10eb\u10d0\u10dc\u10d4\u10d1\u10d4\u10d1\u10d8",base:"Base",bgcolor:"\u10e4\u10dd\u10dc\u10d8",wmode:"\u10e4\u10d0\u10dc\u10ef\u10d0\u10e0\u10d0",salign:"\u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",align:"\u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",scale:"\u10db\u10d8\u10d3\u10d0\u10db\u10dd",quality:"\u10ee\u10d0\u10e0\u10d8\u10e1\u10ee\u10d8",shuffle:"\u0412 \u0440\u0430\u0437\u0431\u0440\u043e\u0441",prefetch:"\u10d0\u10db\u10dd\u10d9\u10e0\u10d4\u10e4\u10d0",nojava:"Java-\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4",maintainaspect:"\u10d6\u10dd\u10db\u10d8\u10e1 \u10d3\u10d0\u10db\u10d0\u10ee\u10e1\u10dd\u10d5\u10e0\u10d4\u10d1\u10d0",imagestatus:"\u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10e1\u10e2\u10d0\u10e2\u10e3\u10e1\u10d8",center:"\u10ea\u10d4\u10dc\u10e2\u10e0\u10d8",autogotourl:"\u10db\u10d8\u10e1\u10d0\u10db\u10d0\u10e0\u10d7\u10d6\u10d4 \u10d0\u10d5\u10e2\u10dd \u10d2\u10d0\u10d3\u10d0\u10e1\u10d5\u10da\u10d0",shockwave_options:"Shockwave \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",rmp_options:"Real Media \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",wmp_options:"Windows Media \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",qt_options:"Quicktime \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",flash_options:"Flash \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",hidden:"\u10d3\u10d0\u10e4\u10d0\u10e0\u10e3\u10da\u10d8",align_bottom_left:"\u10db\u10d0\u10e0\u10ea\u10ee\u10d4\u10dc\u10d0 \u10e5\u10d5\u10d4\u10d3\u10d0 \u10d9\u10e3\u10d7\u10ee\u10d4",align_bottom_right:"\u10db\u10d0\u10e0\u10ef\u10d5\u10d4\u10dc\u10d0 \u10e5\u10d5\u10d4\u10d3\u10d0 \u10d9\u10e3\u10d7\u10ee\u10d4",flv_options:"Flash \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",flv_scalemode:"\u10db\u10d0\u10e1\u10e8\u10e2\u10d0\u10d1\u10d8",flv_buffer:"\u10d1\u10e3\u10e4\u10d4\u10e0\u10d8",flv_startimage:"\u10e1\u10d0\u10ec\u10e7\u10d8\u10e1\u10d8 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d0",flv_starttime:"\u10d3\u10d0\u10ec\u10e7\u10d4\u10d1\u10d8\u10e1 \u10d3\u10e0\u10dd",flv_defaultvolume:"\u10e1\u10e2\u10d0\u10dc\u10d3\u10d0\u10e0\u10e2\u10e3\u10da\u10d8 \u10ee\u10db\u10d0",flv_hiddengui:"\u10d3\u10d0\u10e4\u10d0\u10e0\u10e3\u10da\u10d8 \u10d8\u10dc\u10e2\u10d4\u10e0\u10e4\u10d4\u10d8\u10e1\u10d8",flv_autostart:"\u10d0\u10d5\u10e2\u10dd \u10ee\u10db\u10d0",flv_loop:"\u10d2\u10d0\u10db\u10d4\u10dd\u10e0\u10d4\u10d1\u10d0",flv_showscalemodes:"\u10db\u10d0\u10e8\u10e2\u10d0\u10d1\u10d8\u10e1 \u10e0\u10d4\u10df\u10d8\u10db\u10d8",flv_smoothvideo:"\u10d7\u10d0\u10dc\u10d0\u10d5\u10d0\u10e0\u10d8 \u10d5\u10d8\u10d3\u10d4\u10dd",flv_jscallback:"JS \u10db\u10ee\u10d0\u10e0\u10d3\u10d0\u10ed\u10d4\u10e0\u10d0",html5_video_options:"HTML5-\u10d5\u10d8\u10d3\u10d4\u10dd\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",altsource1:"\u10d0\u10da\u10e2\u10d4\u10e0\u10dc\u10d0\u10e2\u10d8\u10e3\u10da\u10d8 \u10ec\u10e7\u10d0\u10e0\u10dd 1",altsource2:"\u10d0\u10da\u10e2\u10d4\u10e0\u10dc\u10d0\u10e2\u10d8\u10e3\u10da\u10d8 \u10ec\u10e7\u10d0\u10e0\u10dd 2",preload:"\u10ec\u10d8\u10dc\u10d0\u10e1\u10ec\u10d0\u10e0\u10d8 \u10e9\u10d0\u10db\u10dd\u10e2\u10d5\u10d8\u10e0\u10d7\u10d5\u10d0",poster:"\u10de\u10dd\u10e1\u10e2\u10d4\u10e0\u10d8",source:"\u10ec\u10e7\u10d0\u10e0\u10dd"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/kl_dlg.js b/js/tiny_mce/plugins/media/langs/kl_dlg.js new file mode 100755 index 000000000..8f995ec01 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/km_dlg.js b/js/tiny_mce/plugins/media/langs/km_dlg.js new file mode 100755 index 000000000..420b5f57a --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.media_dlg',{list:"\u1794\u1789\u17d2\u1787\u17b8",file:"\u17af\u1780\u179f\u17b6\u179a/\u17a2\u179f\u1799\u178a\u17d2\u178b\u17b6\u1793\u00a0URL",advanced:"\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb",general:"\u1791\u17bc\u1791\u17c5",title:"\u1794\u1789\u17d2\u1785\u17bc\u179b / \u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u1798\u17c1\u178c\u17c0\u1794\u1784\u17d2\u1780\u1794\u17cb",align_top_left:"\u179b\u17be\u1786\u17d2\u179c\u17c1\u1784",align_center:"\u1780\u178e\u17d2\u178a\u17b6\u179b",align_left:"\u1786\u17d2\u179c\u17c1\u1784",align_bottom:"\u1794\u17b6\u178f",align_right:"\u179f\u17d2\u178a\u17b6\u17c6",align_top:"\u1780\u17c6\u1796\u17bc\u179b",qt_stream_warn:"\u1794\u17d2\u179a\u1797\u1796\u179f\u17d2\u1791\u17d2\u179a\u17b8\u1798 rtsp (\u1796\u17b7\u1792\u17b8\u1780\u17b6\u179a\u1794\u1784\u17d2\u17a0\u17bc\u179a\u1796\u17c1\u179b\u1796\u17b7\u178f)\u1782\u17bd\u179a\u178f\u17d2\u179a\u17bc\u179c\u1794\u1793\u17d2\u1790\u17c2\u1798\u1791\u17c5\u1780\u17d2\u1793\u17bb\u1784\u179c\u17b6\u179b QT Src \u1780\u17d2\u179a\u17c4\u1798\u1795\u17d2\u1791\u17b6\u17c6\u1784\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb\u00a0\u17d4n\u179f\u17d2\u179a\u1794\u1782\u17d2\u1793\u17b6\u1793\u17c1\u17c7 \u17a2\u17d2\u1793\u1780\u1782\u17bd\u179a\u1794\u1793\u17d2\u1790\u17c2\u1798\u1780\u17c6\u178e\u17c2\u1798\u17b7\u1793\u1798\u17c2\u1793\u179f\u17d2\u1791\u17d2\u179a\u17b8\u1798\u1791\u17c5\u1780\u17d2\u1793\u17bb\u1784\u179c\u17b6\u179b\u1794\u17d2\u179a\u1797\u1796 Src\u00a0\u17d4\"",qtsrc:"\u1794\u17d2\u179a\u1797\u1796 QT",progress:"\u179c\u178c\u17d2\u178d\u1793\u1797\u17b6\u1796",sound:"\u179f\u1798\u17d2\u179b\u17c1\u1784",swstretchvalign:"\u1791\u17b6\u1789\u178f\u1798\u17d2\u179a\u17b9\u1798\u1794\u1789\u17d2\u1788\u179a",swstretchhalign:"\u1791\u17b6\u1789\u178f\u1798\u17d2\u179a\u17b9\u1798\u1795\u17d2\u178a\u17c1\u1780",swstretchstyle:"\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798\u1791\u17b6\u1789\u179c\u17c2\u1784",scriptcallbacks:"\u179f\u17d2\u1782\u17d2\u179a\u17b8\u1794\u17a0\u17c5\u1798\u1780\u179c\u17b7\u1789",align_top_right:"\u179b\u17be\u179f\u17d2\u178a\u17b6\u17c6",uimode:"\u1798\u17c9\u17bc\u178a UI",rate:"\u17a2\u178f\u17d2\u179a\u17b6",playcount:"\u1785\u17c6\u1793\u17bd\u1793\u178a\u1784\u1785\u17b6\u1780\u17cb",defaultframe:"\u179f\u1793\u17d2\u179b\u17b9\u1780\u179b\u17c6\u1793\u17b6\u17c6\u178a\u17be\u1798",currentposition:"\u1791\u17b8\u178f\u17b6\u17c6\u1784\u1794\u1785\u17d2\u1785\u17bb\u1794\u17d2\u1794\u1793\u17d2\u1793",currentmarker:"\u1785\u17c6\u178e\u17b6\u17c6\u1794\u1785\u17d2\u1785\u17bb\u1794\u17d2\u1794\u1793\u17d2\u1793",captioningid:"\u179f\u179b.\u1785\u17c6\u178e\u1784\u1787\u17be\u1784\u178f\u17bc\u1785",baseurl:"URL\u00a0\u1782\u17c4\u179b",balance:"\u179f\u1798\u178f\u17bb\u179b\u17d2\u1799",windowlessvideo:"\u1797\u17b6\u1796\u1799\u1793\u17d2\u178f\u1782\u17d2\u1798\u17b6\u1793\u1794\u1784\u17d2\u17a2\u17bd\u1785",stretchtofit:"\u1791\u17b6\u1789\u17b1\u17d2\u1799\u179f\u1798",mute:"\u1794\u17b7\u1791\u179f\u1798\u17d2\u179b\u17c1\u1784",invokeurls:"\u17a0\u17c5 URLs",fullscreen:"\u1796\u17c1\u1789\u17a2\u17c1\u1780\u17d2\u179a\u1784\u17cb",enabled:"\u1794\u17b6\u1793\u1794\u17be\u1780\u1794\u17d2\u179a\u17be",autostart:"\u179f\u17d2\u179c\u17d0\u1799\u1785\u17b6\u1794\u17cb\u1795\u17d2\u178a\u17be\u1798",volume:"\u1780\u1798\u17d2\u179a\u17b7\u178f\u179f\u1798\u17d2\u179b\u17c1\u1784",target:"\u1782\u17c4\u179b\u178a\u17c5",qtsrcchokespeed:"\u1794\u1784\u17d2\u17a2\u1793\u17cb\u179b\u17d2\u1794\u17bf\u1793",href:"\u178f\u17c6\u178e\u1781\u17d2\u1796\u179f\u17cb",endtime:"\u179c\u17c1\u179b\u17b6\u1794\u1789\u17d2\u1785\u1794\u17cb",starttime:"\u179c\u17c1\u179b\u17b6\u1785\u17b6\u1794\u17cb\u1795\u17d2\u178a\u17be\u1798",enablejavascript:"\u1794\u17be\u1780\u1794\u17d2\u179a\u17be\u00a0JavaScript",correction:"\u1782\u17d2\u1798\u17b6\u1793\u1780\u17b6\u179a\u1780\u17c2\u178f\u1798\u17d2\u179a\u17bc\u179c",targetcache:"\u1783\u17d2\u179b\u17b6\u17c6\u1784\u179f\u1798\u17d2\u1784\u17b6\u178f\u17cb\u1782\u17c4\u179b\u178a\u17c5",playeveryframe:"\u1785\u17b6\u1780\u17cb\u1782\u17d2\u179a\u1794\u17cb\u179f\u1793\u17d2\u179b\u17b9\u1780",kioskmode:"\u1798\u17c9\u17bc\u178a Kiosk",controller:"\u1794\u17d2\u179a\u178a\u17b6\u1794\u17cb\u1794\u1789\u17d2\u1787\u17b6",menu:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u1798\u17c9\u17ba\u1793\u17bb\u1799",loop:"\u179a\u1784\u17d2\u179c\u17b7\u179b\u1787\u17bb\u17c6",play:"\u1785\u17b6\u1780\u17cb\u179f\u17d2\u179c\u17d0\u1799\u1794\u17d2\u179a\u179c\u178f\u17d2\u178f\u17b7",hspace:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1795\u17d2\u178a\u17c1\u1780",vspace:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1794\u1789\u17d2\u1788\u179a",class_name:"\u1790\u17d2\u1793\u17b6\u1780\u17cb",name:"\u1788\u17d2\u1798\u17c4\u17c7",id:"\u179b\u179f.",type:"\u1794\u17d2\u179a\u1797\u17c1\u1791",size:"\u179c\u17b7\u1798\u17b6\u178f\u17d2\u179a",preview:"\u1798\u17be\u179b\u1787\u17b6\u1798\u17bb\u1793",constrain_proportions:"\u1794\u1784\u17d2\u1781\u17c6\u17b2\u17d2\u1799\u1798\u17b6\u1793\u179f\u1798\u17b6\u1798\u17b6\u178f\u17d2\u179a",controls:"\u1794\u1789\u17d2\u1787\u17b6",numloop:"\u1785\u17c6\u1793\u17bd\u1793\u179a\u1784\u17d2\u179c\u17b7\u179b\u1787\u17bb\u17c6",console:"\u1786\u17b6\u1780\u1782\u17d2\u179a\u1794\u17cb\u1782\u17d2\u179a\u1784",cache:"\u1783\u17d2\u179b\u17b6\u17c6\u1784\u179f\u1798\u17d2\u1784\u17b6\u178f\u17cb",autohref:"\u179f\u17d2\u179c\u17d0\u1799HREF",liveconnect:"SW\u1797\u17d2\u1787\u17b6\u1794\u17cb\u1795\u17d2\u1791\u17b6\u179b\u17cb",flashvars:"\u17a2\u1790\u17c1\u179a Flash",base:"\u1782\u17c4\u179b",bgcolor:"\u1795\u17d2\u1791\u17c2\u1781\u17b6\u1784\u1780\u17d2\u179a\u17c4\u1799",wmode:"\u1798\u17c9\u17bc\u178a\u1794\u1784\u17d2\u17a2\u17bd\u1785",salign:"\u178f\u1798\u17d2\u179a\u17b9\u1798\u1787\u17d2\u179a\u17bb\u1784",align:"\u178f\u1798\u17d2\u179a\u17b9\u1798",scale:"\u1798\u17b6\u178f\u17d2\u179a\u178a\u17d2\u178b\u17b6\u1793",quality:"\u1782\u17bb\u178e\u1797\u17b6\u1796",shuffle:"\u1794\u1784\u17d2\u17a2\u17bc\u179f",prefetch:"\u1799\u1780\u1798\u17bb\u1793",nojava:"\u1782\u17d2\u1798\u17b6\u1793 java",maintainaspect:"\u179a\u1780\u17d2\u179f\u17b6\u179f\u1798\u17b6\u1798\u17b6\u178f\u17d2\u179a",imagestatus:"\u179f\u17d2\u1790\u17b6\u1793\u1797\u17b6\u1796\u179a\u17bc\u1794\u1797\u17b6\u1796",center:"\u1780\u178e\u17d2\u178a\u17b6\u179b",autogotourl:"\u179f\u17d2\u179c\u17d0\u1799\u1791\u17c5\u1780\u17b6\u1793\u17cb URL",shockwave_options:"\u1787\u1798\u17d2\u179a\u17be\u179f Shockwav",rmp_options:"\u1787\u1798\u17d2\u179a\u17be\u179f\u1780\u1798\u17d2\u1798\u179c\u17b7\u1792\u17b8\u1785\u17b6\u1780\u17cb Real Media",wmp_options:"\u1787\u1798\u17d2\u179a\u17be\u179f\u1780\u1798\u17d2\u1798\u179c\u17b7\u1792\u17b8\u1785\u17b6\u1780\u17cb Window Media",qt_options:"\u1787\u1798\u17d2\u179a\u17be\u179f Quicktime",flash_options:"\u1787\u1798\u17d2\u179a\u17be\u179f Flash",hidden:"\u1794\u17c6\u1796\u17bd\u1793",align_bottom_left:"\u1780\u17d2\u179a\u17c4\u1798\u1786\u17d2\u179c\u17c1\u1784",align_bottom_right:"\u1780\u17d2\u179a\u17c4\u1798\u179f\u17d2\u178a\u17b6\u17c6",flv_options:"\u1787\u1798\u17d2\u179a\u17be\u179f\u1797\u17b6\u1796\u1799\u1793\u17d2\u178f Flash",flv_scalemode:"\u1798\u17c9\u17bc\u178a\u1798\u17b6\u178f\u17d2\u179a\u178a\u17d2\u178b\u17b6\u1793",flv_buffer:"\u179f\u178f\u17b7\u1794\u178e\u17d2\u178a\u17c4\u17c7\u17a2\u17b6\u179f\u1793\u17d2\u1793",flv_startimage:"\u179a\u17bc\u1794\u1797\u17b6\u1796\u1785\u17b6\u1794\u17cb\u1795\u17d2\u178a\u17be\u1798",flv_starttime:"\u179c\u17c1\u179b\u17b6\u1785\u17b6\u1794\u17cb\u1795\u17d2\u178a\u17be\u1798",flv_defaultvolume:"\u1780\u1798\u17d2\u179a\u17b7\u178f\u179f\u1798\u17d2\u179b\u17c1\u1784\u179b\u17c6\u1793\u17b6\u17c6\u178a\u17be\u1798",flv_hiddengui:"\u1785\u17c6\u178e\u17bb\u1785\u1794\u17d2\u179a\u1791\u17b6\u1780\u17cb\u17a2\u17d2\u1793\u1780\u1794\u17d2\u179a\u17be\u1780\u17d2\u179a\u17b6\u17a0\u17d2\u179c\u17b7\u1780\u1794\u17c6\u1796\u17bd\u1793",flv_autostart:"\u1785\u17b6\u1794\u17cb\u1795\u17d2\u178a\u17be\u1798\u179f\u17d2\u179c\u17d0\u1799\u1794\u17d2\u179a\u179c\u178f\u17d2\u178f\u17b7",flv_loop:"\u179a\u1784\u17d2\u179c\u17b7\u179b\u1787\u17bb\u17c6",flv_showscalemodes:"\u1794\u1784\u17d2\u17a0\u17b6\u1789\u1798\u17c9\u17bc\u178a\u1798\u17b6\u178f\u17d2\u179a\u178a\u17d2\u178b\u17b6\u1793",flv_smoothvideo:"\u179a\u179b\u17bc\u1793\u1797\u17b6\u1796\u1799\u1793\u17d2\u178f",flv_jscallback:"\u17a0\u17c5JS\u1798\u1780\u179c\u17b7\u1789",html5_video_options:"\u1787\u1798\u17d2\u179a\u17be\u179f\u1797\u17b6\u1796\u1799\u1793\u17d2\u178f HTML5",altsource1:"\u1794\u17d2\u179a\u1797\u1796\u1787\u17c6\u1793\u17bd\u179f\u17e1",altsource2:"\u1794\u17d2\u179a\u1797\u1796\u1787\u17c6\u1793\u17bd\u179f\u17e2",preload:"\u1795\u17d2\u1791\u17bb\u1780\u1787\u17b6\u1798\u17bb\u1793",poster:"\u1795\u17d2\u1791\u17b6\u17c6\u1784\u1795\u17d2\u179f\u1796\u17d2\u179c\u1795\u17d2\u179f\u17b6\u1799",source:"\u1794\u17d2\u179a\u1797\u1796"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ko_dlg.js b/js/tiny_mce/plugins/media/langs/ko_dlg.js new file mode 100755 index 000000000..878337af8 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.media_dlg',{list:"\ubaa9\ub85d",file:"\ud30c\uc77c/URL",advanced:"\uace0\uae09",general:"\uc77c\ubc18",title:"\ubbf8\ub514\uc5b4\uc758 \uc0bd\uc785/\ud3b8\uc9d1",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"JavaScript\ub97c \ud5c8\uac00",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"\uba54\ub274 \ud45c\uc2dc",loop:"\uc5f0\uc18d \uc7ac\uc0dd",play:"\uc790\ub3d9 \uc7ac\uc0dd",hspace:"\uc88c\uc6b0 \uc5ec\ubc31",vspace:"\uc0c1\ud558 \uc5ec\ubc31",class_name:"Class",name:"Name",id:"Id",type:"\ud0c0\uc785",size:"\ud06c\uae30",preview:"\ubbf8\ub9ac\ubcf4\uae30",constrain_proportions:"\uc885\ud6a1\ube44 \uc720\uc9c0",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"\uc2a4\ucf00\uc77c",quality:"\ud488\uc9c8",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/lb_dlg.js b/js/tiny_mce/plugins/media/langs/lb_dlg.js new file mode 100755 index 000000000..e3ee25947 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.media_dlg',{list:"L\u00ebscht",file:"Datei/URL",advanced:"Erweidert",general:"Allgemeng",title:"Multimedia-Inhalt abannen/beaarbechten",align_top_left:"Uewe L\u00e9nks",align_center:"Zentr\u00e9iert",align_left:"L\u00e9nks",align_bottom:"\u00cbnnen",align_right:"Riets",align_top:"Uewen",qt_stream_warn:"An den erweiderten Astellunge sollten am Feld \'QT Src\' gestreamte RTSP Ressourcen b\u00e4igesat ginn.\\nZous\u00e4tzlech sollt Dir do och eng net-gestreamte Ressource uginn.",qtsrc:"QT Src",progress:"Fortschr\u00ebtt",sound:"Toun",swstretchvalign:"Stretch V-Ausriichtung",swstretchhalign:"Stretch H-Ausriichtung",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Uewe Riets",uimode:"UI Modus",rate:"Quote",playcount:"Zieler",defaultframe:"Frame-Virastellung",currentposition:"Aktuell Positioun",currentmarker:"Aktuelle Marker",captioningid:"Beschr\u00ebftungs Id",baseurl:"Basis-URL",balance:"Balance",windowlessvideo:"F\u00ebnsterlose Video",stretchtofit:"Breet un d\u00e9i verf\u00fcgbar Plaz upassen",mute:"Stomm",invokeurls:"URLen opruffen",fullscreen:"Vollbild",enabled:"Aktiv\u00e9iert",autostart:"Autostart",volume:"Lautst\u00e4rkt",target:"Zil",qtsrcchokespeed:"Vitesse drosselen",href:"Href",endtime:"Endz\u00e4itpunkt",starttime:"Startz\u00e4itpunkt",enablejavascript:"JavaScript aktiv\u00e9ieren",correction:"Ouni Korrektur",targetcache:"Zil zw\u00ebschesp\u00e4icheren",playeveryframe:"All Frame ofspillen",kioskmode:"Kioskmodus",controller:"Kontroller",menu:"Men\u00fc uweisen",loop:"Widderhuelung",play:"Automatesch Ofspillen",hspace:"Horizontalen Ofstand",vspace:"Vertikalen Ofstand",class_name:"CSS-Klass",name:"Numm",id:"Id",type:"Typ",size:"Ofmiessungen",preview:"Virschau",constrain_proportions:"Proportiounen erhalen",controls:"Steierung",numloop:"Unzuel Widderhuelungen",console:"Konsol",cache:"Zw\u00ebschesp\u00e4icher",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash-Variablen",base:"Basis",bgcolor:"Hannergrond",wmode:"WMode",salign:"S-Ausriichtung",align:"Ausriichtung",scale:"Skal\u00e9ierung",quality:"Qualit\u00e9it",shuffle:"Zouf\u00e4lleg Widdergab",prefetch:"Prefetch",nojava:"Kee Java",maintainaspect:"Bildverh\u00e4ltnis b\u00e4ibehalen",imagestatus:"Bildstatus",center:"Zentr\u00e9iert",autogotourl:"Auto goto URL",shockwave_options:"Shockwave-Optiounen",rmp_options:"Optiounen fir Real Media Player",wmp_options:"Optiounen fir Windows Media Player",qt_options:"Quicktime-Optiounen",flash_options:"Flash-Optiounen",hidden:"Verstoppt",align_bottom_left:"\u00cbnne L\u00e9nks",align_bottom_right:"\u00cbnne Riets",flv_options:"Optiounen fir Flash Video",flv_scalemode:"Skal\u00e9ierungsmodus",flv_buffer:"Puffer",flv_startimage:"Startbild",flv_starttime:"Startz\u00e4itpunkt",flv_defaultvolume:"Standardlautst\u00e4rk",flv_hiddengui:"Verstoppte GUI",flv_autostart:"Autostart",flv_loop:"Widderhuelung",flv_showscalemodes:"Skal\u00e9ierungsmodi uweisen",flv_smoothvideo:"Smooth Video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/lt_dlg.js b/js/tiny_mce/plugins/media/langs/lt_dlg.js new file mode 100755 index 000000000..848dca958 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.media_dlg',{list:"S\u0105ra\u0161as",file:"Failas/URL",advanced:"I\u0161pl\u0117sta",general:"Bendra",title:"\u012eterpti/redaguoti integruot\u0105 daugialyp\u0119 terp\u0119",align_top_left:"Vir\u0161uje, kair\u0117je",align_center:"Centre",align_left:"Kair\u0117je",align_bottom:"Apa\u010dioje",align_right:"De\u0161in\u0117je",align_top:"Vir\u0161uje",qt_stream_warn:"Transliuojami rtsp i\u0161tekliai tur\u0117t\u0173 b\u016bti prid\u0117ti prie QT Src lauko \u201ePapildom\u0173 nustatym\u0173\u201c kortel\u0117je.\\nTaip pat reikt\u0173 prid\u0117ti ir netransliuojam\u0105j\u0105 Src lauko versij\u0105.",qtsrc:"QT Src",progress:"Progresas",sound:"Garsas",swstretchvalign:"I\u0161tempti V-lygiavim\u0105",swstretchhalign:"I\u0161tempti H-lygiavim\u0105",swstretchstyle:"I\u0161tempti stili\u0173",scriptcallbacks:"Scenarijaus atgalinis atsakas",align_top_right:"Vir\u0161uje, de\u0161in\u0117je",uimode:"UI re\u017eimas",rate:"Da\u017enis",playcount:"Grojimo kartai",defaultframe:"Numatytas kadras",currentposition:"Dabartin\u0117 pozicija",currentmarker:"Dabartinis \u017eymeklis",captioningid:"Antra\u0161t\u0117s id",baseurl:"Prad\u017eios URL adresas",balance:"Balansas",windowlessvideo:"Vaizdas be lango",stretchtofit:"I\u0161tempti iki atitikimo",mute:"Nutildyti",invokeurls:"I\u0161kviesti URL adresus",fullscreen:"Viso ekrano re\u017eimas",enabled:"\u012ejungta",autostart:"Automatinis paleidimas",volume:"Garsis",target:"Paskirtis",qtsrcchokespeed:"Dusinimo greitis",href:"Href",endtime:"Pabaigos laikas",starttime:"Prad\u017eios laikas",enablejavascript:"\u012egalinti JavaScript",correction:"Joki\u0173 korekcij\u0173",targetcache:"Paskirties laikinoji talpykla",playeveryframe:"Paleisti kiekvien\u0105 kadr\u0105",kioskmode:"Kiosko re\u017eimas",controller:"Valdiklis",menu:"Rodyti meniu",loop:"Kartoti",play:"Automatinis paleidimas",hspace:"Horizontalus tarpas",vspace:"Vertikalus tarpas",class_name:"Klas\u0117",name:"Vardas",id:"Id",type:"Tipas",size:"I\u0161matavimai",preview:"Per\u017ei\u016bra",constrain_proportions:"Priverstin\u0117s proporcijos",controls:"Valdikliai",numloop:"Cikl\u0173 kiekis",console:"Konsol\u0117",cache:"Laikinoji talpykla",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash kintamieji",base:"Baz\u0117",bgcolor:"Fono spalva",wmode:"W-re\u017eimas",salign:"S-lygiavimas",align:"Lygiavimas",scale:"Mastelis",quality:"Kokyb\u0117",shuffle:"Atsitiktinis mai\u0161ymasis",prefetch:"I\u0161ankstinis duom. i\u0161rinkimas",nojava:"Be Java",maintainaspect:"I\u0161laikyti aspekt\u0105",imagestatus:"Paveiksl\u0117lio b\u016bsena",center:"Centre",autogotourl:"Automatinis \u0117jimas URL adresu",shockwave_options:"Shockwave nustatymai",rmp_options:"Real media player nustatymai",wmp_options:"Windows media player nustatymai",qt_options:"Quicktime nustatymai",flash_options:"Flash nustatymai",hidden:"Pasl\u0117pta",align_bottom_left:"Apa\u010dioje, kair\u0117je",align_bottom_right:"Apa\u010dioje, de\u0161in\u0117je",flv_options:"Flash vaizdo nustatymai",flv_scalemode:"Mastelio re\u017eimas",flv_buffer:"Buferis",flv_startimage:"Prad\u017eios paveiksl\u0117lis",flv_starttime:"Prad\u017eios laikas",flv_defaultvolume:"Pradinis garsis",flv_hiddengui:"Pasl\u0117pta grafin\u0117 s\u0105saja",flv_autostart:"Auto grojimas",flv_loop:"Kartoti",flv_showscalemodes:"Rodyti mastelio re\u017eimus",flv_smoothvideo:"Tolygus vaizdas",flv_jscallback:"JS atgalinis atsakas"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/lv_dlg.js b/js/tiny_mce/plugins/media/langs/lv_dlg.js new file mode 100755 index 000000000..40285808c --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/mk_dlg.js b/js/tiny_mce/plugins/media/langs/mk_dlg.js new file mode 100755 index 000000000..56f0b106a --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ml_dlg.js b/js/tiny_mce/plugins/media/langs/ml_dlg.js new file mode 100755 index 000000000..6799e9d82 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/mn_dlg.js b/js/tiny_mce/plugins/media/langs/mn_dlg.js new file mode 100755 index 000000000..b3106204c --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.media_dlg',{list:"\u0416\u0430\u0433\u0441\u0430\u0430\u043b\u0442",file:"\u0424\u0430\u0439\u043b/URL",advanced:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d",general:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439",title:"\u041c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 \u0430\u0433\u0443\u0443\u043b\u0433\u0430 \u0431\u0443\u0443\u043b\u0433\u0430\u0445/ \u0437\u0430\u0441\u0432\u0430\u0440\u043b\u0430\u0445",align_top_left:"\u0417\u04af\u04af\u043d \u0434\u044d\u044d\u0434",align_center:"\u0413\u043e\u043b\u0434",align_left:"\u0417\u04af\u04af\u043d",align_bottom:"\u0414\u043e\u043e\u0440",align_right:"\u0411\u0430\u0440\u0443\u0443\u043d",align_top:"\u0414\u044d\u044d\u0440",qt_stream_warn:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e\u043d \u0434\u0430\u0445\u044c \'QT Src\' \u0442\u0430\u043b\u0431\u0430\u0440\u0442 \u0446\u0430\u0446\u0430\u0436 \u0431\u0443\u0439 rtsp \u043d\u04e9\u04e9\u0446\u0438\u0439\u0433 \u043e\u0440\u0443\u0443\u043b\u0436 \u04e9\u0433\u043d\u04e9.\\n\u041c\u04e9\u043d \u0442\u0430 \u0442\u044d\u043d\u0434 \u0446\u0430\u0446\u0430\u0430\u0433\u04af\u0439 \u043d\u04e9\u04e9\u0446\u0438\u0439\u0433 \u043d\u044d\u043c\u044d\u0445 \u0445\u044d\u0440\u044d\u0433\u0442\u044d\u0439.",qtsrc:"QT Src",progress:"\u042f\u0432\u0446",sound:"\u0414\u0443\u0443",swstretchvalign:"Stretch V-\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",swstretchhalign:"Stretch H-\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"\u0411\u0430\u0440\u0443\u0443\u043d \u0434\u044d\u044d\u0434",uimode:"UI \u0433\u043e\u0440\u0438\u043c",rate:"Rate",playcount:"\u0422\u043e\u043e\u043b\u0443\u0443\u0440",defaultframe:"\u0424\u0440\u044d\u0439\u043c-\u04e9\u0433\u04e9\u0433\u0434\u043c\u04e9\u043b \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",currentposition:"\u0418\u0434\u044d\u0432\u0445\u0442\u044d\u0439 \u0431\u0430\u0439\u0440\u043b\u0430\u043b",currentmarker:"\u0418\u0434\u044d\u0432\u0445\u0442\u044d\u0439 \u0442\u044d\u043c\u0434\u044d\u0433\u043b\u044d\u0433\u0447",captioningid:"Captioning id",baseurl:"\u04ae\u043d\u0434\u0441\u044d\u043d URL",balance:"\u0422\u044d\u043d\u0446\u0432\u044d\u0440\u0436\u04af\u04af\u043b\u044d\u043b\u0442",windowlessvideo:"\u0426\u043e\u043d\u0445\u0433\u04af\u0439 \u0432\u0438\u0434\u0435\u043e",stretchtofit:"\u0425\u0430\u0440\u0443\u0443\u043b\u0430\u0445 \u043c\u0443\u0436\u0438\u0439\u0433 \u0441\u0443\u043b \u0431\u0430\u0439\u0433\u0430\u0430 \u0437\u0430\u0439\u0434 \u0442\u0430\u0430\u0440\u0443\u0443\u043b\u0430\u0445",mute:"\u0414\u0443\u0443\u0433\u04af\u0439",invokeurls:"\u0414\u0443\u0443\u0434\u0430\u0445 URLs",fullscreen:"\u0414\u044d\u043b\u0433\u044d\u0446 \u0434\u04af\u04af\u0440\u044d\u043d",enabled:"\u0418\u0434\u044d\u0432\u0445\u0442\u044d\u0439",autostart:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u044d\u0445\u043b\u044d\u043b",volume:"\u0414\u0443\u0443",target:"\u0422\u043e\u0432\u043b\u043e\u0441\u043e\u043d",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"\u0422\u04e9\u0433\u0441\u04e9\u0445 \u0446\u0430\u0433",starttime:"\u042d\u0445\u043b\u044d\u0445 \u0446\u0430\u0433",enablejavascript:"JavaScript \u0438\u0434\u044d\u0432\u0445\u0436\u04af\u04af\u043b\u044d\u0445",correction:"\u0417\u0430\u0441\u0432\u0430\u0440\u0433\u04af\u0439",targetcache:"\u0417\u043e\u0440\u0438\u043b\u0433\u044b\u0433 \u0442\u04af\u0440 \u0445\u0430\u0434\u0433\u0430\u043b\u043d\u0430",playeveryframe:"\u0424\u0440\u044d\u0439\u043c \u0431\u04af\u0440\u0438\u0439\u0433 \u0442\u043e\u0433\u043b\u0443\u0443\u043b\u043d\u0430",kioskmode:"\u041a\u0438\u043e\u0441\u043a \u0433\u043e\u0440\u0438\u043c",controller:"Controller",menu:"\u0426\u044d\u0441 \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",loop:"\u0414\u0430\u0432\u0442\u0430\u043b\u0442",play:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0430\u0430\u0440 \u0442\u043e\u0433\u043b\u0443\u0443\u043b\u043d\u0430",hspace:"\u0425\u044d\u0432\u0442\u044d\u044d \u0430\u043b\u0441\u043b\u0430\u043b\u0442",vspace:"\u0411\u043e\u0441\u043e\u043e \u0430\u043b\u0441\u043b\u0430\u043b\u0442",class_name:"CSS-\u0430\u043d\u0433\u0438",name:"\u041d\u044d\u0440",id:"\u0422\u0442",type:"\u0422\u04e9\u0440\u04e9\u043b",size:"\u0425\u044d\u043c\u0436\u044d\u044d",preview:"\u041d\u044f\u0433\u0442\u043b\u0430\u0445",constrain_proportions:"\u0425\u0430\u0440\u044c\u0446\u0430\u0430\u0433 \u0431\u0430\u0440\u0438\u0445",controls:"\u0423\u0434\u0438\u0440\u0434\u043b\u0430\u0433\u0430",numloop:"\u0414\u0430\u0432\u0442\u0430\u0445 \u0442\u043e\u043e",console:"\u041a\u043e\u043d\u0441\u043e\u043b",cache:"\u0417\u0430\u0432\u0441\u0440\u044b\u043d \u0445\u0430\u0434\u0433\u0430\u043b\u0430\u0433\u0447",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"\u0424\u043b\u044d\u0439\u0448 \u0445\u0443\u0432\u044c\u0441\u0430\u0433\u0447",base:"\u0421\u0443\u0443\u0440\u044c",bgcolor:"\u0414\u044d\u0432\u0441\u0433\u044d\u0440",wmode:"WMode",salign:"S-\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",align:"\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",scale:"\u0425\u0443\u0432\u0430\u0430\u0440\u0438\u043b\u0430\u043b\u0442",quality:"\u0427\u0430\u043d\u0430\u0440",shuffle:"\u0421\u0430\u043d\u0430\u043c\u0441\u0430\u0440\u0433\u04af\u0439\u0433\u044d\u044d\u0440 \u0442\u043e\u0433\u043b\u0443\u0443\u043b\u0430\u0445",prefetch:"Prefetch",nojava:"\u0416\u0430\u0432\u0430\u0433\u04af\u0439",maintainaspect:"\u0417\u0443\u0440\u0433\u0438\u0439\u043d \u0445\u0430\u0440\u044c\u0446\u0430\u0430\u0433 \u0445\u0430\u0434\u0433\u0430\u043b\u0430\u043d\u0430",imagestatus:"\u0417\u0443\u0440\u0433\u0438\u0439\u043d \u0442\u04e9\u043b\u04e9\u0432",center:"\u0413\u043e\u043b\u043b\u0443\u0443\u043b\u0441\u0430\u043d",autogotourl:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0430\u0430\u0440 \u043e\u0447\u0438\u0445 URL",shockwave_options:"Shockwave-\u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",rmp_options:"Real Media Player-\u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",wmp_options:"Windows Media Player-\u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",qt_options:"Quicktime-\u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",flash_options:"\u0424\u043b\u044d\u0439\u0448-\u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",hidden:"\u0414\u0430\u043b\u0434\u0430\u043b\u0441\u0430\u043d",align_bottom_left:"\u0417\u04af\u04af\u043d \u0434\u043e\u043e\u0434",align_bottom_right:"\u0411\u0430\u0440\u0443\u0443\u043d \u0434\u043e\u043e\u0434",flv_options:"\u0424\u043b\u044d\u0439\u0448 \u0432\u0438\u0434\u0435\u043e\u043d\u044b \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",flv_scalemode:"\u0425\u0443\u0432\u0430\u0430\u0440\u044c\u0442 \u0433\u043e\u0440\u0438\u043c",flv_buffer:"\u0411\u0443\u0444\u0435\u0440",flv_startimage:"\u042d\u0445\u043b\u044d\u043b \u0437\u0443\u0440\u0430\u0433",flv_starttime:"\u042d\u0445\u043b\u044d\u0445 \u0446\u0430\u0433",flv_defaultvolume:"\u04e8\u0433\u04e9\u0433\u0434\u043c\u04e9\u043b \u0434\u0443\u0443",flv_hiddengui:"\u0414\u0430\u043b\u0434 GUI",flv_autostart:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u044d\u0445\u043b\u04af\u04af\u043b\u044d\u043b\u0442",flv_loop:"\u0414\u0430\u0432\u0442\u0430\u043b\u0442",flv_showscalemodes:"\u0425\u0443\u0432\u0430\u0430\u0440\u044c\u0442 \u0433\u043e\u0440\u0438\u043c \u0445\u0430\u0440\u0443\u0443\u043b\u0430\u0445",flv_smoothvideo:"Smooth \u0412\u0438\u0434\u0435\u043e",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ms_dlg.js b/js/tiny_mce/plugins/media/langs/ms_dlg.js new file mode 100755 index 000000000..743d9cfe4 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.media_dlg',{list:"Senarai",file:"Fail/URL",advanced:"Lanjutan",general:"Am",title:"Masukkan / sunting media",align_top_left:"Kiri atas",align_center:"Tengah",align_left:"Kiri",align_bottom:"Bawah",align_right:"Kanan",align_top:"Atas",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch Selarian-Tegak",swstretchhalign:"Bentangan Selarian-Ufuk",swstretchstyle:"Gaya bentangan",scriptcallbacks:"Panggilan balik skrip",align_top_right:"Kanan atas",uimode:"Mod Grafik",rate:"Undi",playcount:"Kira",defaultframe:"Bingkai asal",currentposition:"Posisi semasa",currentmarker:"Penanda semasa",captioningid:"Tajuk id",baseurl:"URL dasar",balance:"Baki",windowlessvideo:"Tetingkap tanpa video",stretchtofit:"Bujurkan supaya sesuai",mute:"Bisu",invokeurls:"Panggil URL",fullscreen:"Skrin penuh",enabled:"Dibolehkan",autostart:"Auto mula",volume:"Ketinggian suara",target:"Sasaran",qtsrcchokespeed:"Kelajuan sumbatan",href:"Href",endtime:"Masa tamat",starttime:"Masa bermula",enablejavascript:"Bolehkan JavaScript",correction:"Tiada pembetulan",targetcache:"Sasaran tersembunyi",playeveryframe:"Main setiap bingkai",kioskmode:"Mode toko",controller:"Kendali",menu:"Tunjuk menu",loop:"Gelung",play:"Auto main",hspace:"Ruangan-Datar",vspace:"Ruangan-Tegak",class_name:"Kelas",name:"Nama",id:"Id",type:"Jenis",size:"Dimensi",preview:"Pratonton",constrain_proportions:"Kadar tahanan",controls:"Kendali",numloop:"Nombor gelungan",console:"Konsol",cache:"Tempat menyembunyikan",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Dasar",bgcolor:"Latar belakang",wmode:"WMod",salign:"SLuruskan",align:"Luruskan",scale:"Ukuran",quality:"Kualiti",shuffle:"Merangkak",prefetch:"Preambilan",nojava:"Java tidak dibenarkan",maintainaspect:"Pelihara aspek",imagestatus:"Status imej",center:"Tengah",autogotourl:"Auto pergi-ke URL",shockwave_options:"Shockwave",rmp_options:"Pemain Real media",wmp_options:"Pemain Windows media",qt_options:"Quicktime",flash_options:"Flash",hidden:"Tersorok",align_bottom_left:"Bawah kiri",align_bottom_right:"Bawah kanan",flv_options:"Alatan flash video",flv_scalemode:"Skala mod",flv_buffer:"Buffer",flv_startimage:"Start imej",flv_starttime:"Masa mula",flv_defaultvolume:"Bunyi asal",flv_hiddengui:"GUI tersorok",flv_autostart:"Auto mula",flv_loop:"Gegelung",flv_showscalemodes:"Tunjuk skala mod",flv_smoothvideo:"Perlahankan video",flv_jscallback:"JS Callback",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field.."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/my_dlg.js b/js/tiny_mce/plugins/media/langs/my_dlg.js new file mode 100755 index 000000000..675092633 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.media_dlg',{list:"\u1005\u102c\u101b\u1004\u103a\u1038",file:"\u1016\u102d\u102f\u1004\u103a/URL",advanced:"\u1021\u1011\u1030\u1038",general:"\u1021\u1031\u1011\u103d\u1031\u1011\u103d",title:"\u1019\u102e\u1012\u102e\u101a\u102c \u103c\u1019\u103e\u102f\u1015\u103a\u1011\u100a\u103a\u1037 / \u103c\u1015\u102f\u103c\u1015\u1004\u103a",align_top_left:"\u1011\u102d\u1015\u103a\u1006\u1036\u102f\u1038\u1018\u101a\u103a\u1018\u1000\u103a",align_center:"\u1021\u101c\u101a\u103a\u1017\u101f\u102d\u102f",align_left:"\u1018\u101a\u103a",align_bottom:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001",align_right:"\u100a\u102c\u1018\u1000\u103a",align_top:"\u1011\u102d\u1015\u103a\u1015\u102d\u102f\u1004\u103a\u1038",qt_stream_warn:"Streamed rtsp resources \u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1021\u1011\u1030\u1038 tab \u1031\u1021\u102c\u1000\u103a\u101b\u103e\u102d QT Src field \u1010\u103d\u1004\u103a \u1011\u100a\u103a\u1037\u101e\u1004\u103a\u1037\u101e\u100a\u103a\u104bn non streamed version \u1000\u102d\u102f\u101c\u100a\u103a\u1038 Src field.. \u1010\u103d\u1004\u103a \u1011\u100a\u103a\u1037\u1031\u1015\u1038\u101e\u1004\u103a\u1037\u101e\u100a\u103a\u104b",qtsrc:"QT SRC",progress:"\u101c\u102f\u1015\u103a\u1031\u1006\u102c\u1004\u103a\u1019\u103e\u102f \u1021\u1031\u103c\u1001\u1021\u1031\u1014",sound:"\u1021\u101e\u1036",swstretchvalign:"V-Align \u103c\u1016\u1004\u103a\u1037 \u1006\u103d\u1032\u1006\u1014\u103a\u1037",swstretchhalign:"H-Align \u103c\u1016\u1004\u103a\u1037 \u1006\u103d\u1032\u1006\u1014\u103a\u1037",swstretchstyle:"\u1006\u103d\u1032\u1006\u1014\u103a\u1037\u1019\u103e\u102f \u1005\u1010\u102d\u102f\u1004\u103a",scriptcallbacks:"Script callbacks",align_top_right:"\u1011\u102d\u1015\u103a\u1006\u1036\u102f\u1038 \u100a\u102c\u1018\u1000\u103a",uimode:"UI \u1019\u102f(\u1012\u103a)",rate:"\u1014\u103e\u102f\u1014\u103a\u1038",playcount:"\u1016\u103d\u1004\u103a\u1037\u101c\u103e\u1005\u103a\u1019\u103e\u102f \u1021\u1031\u101b\u1021\u1010\u103d\u1000\u103a",defaultframe:"\u1019\u1030\u101c \u1016\u101b\u102d\u1019\u103a",currentposition:"\u101c\u1000\u103a\u101b\u103e\u102d \u1031\u1014\u101b\u102c",currentmarker:"\u101c\u1000\u103a\u101b\u103e\u102d \u1021\u1019\u103e\u1010\u103a\u1021\u101e\u102c\u1038",captioningid:"\u1031\u1001\u102b\u1004\u103a\u1038\u1005\u1009\u103a\u1010\u1015\u103a\u103c\u1001\u1004\u103a\u1038 id",baseurl:"\u1021\u1031\u103c\u1001\u1001\u1036 URL",balance:"\u1001\u103b\u102d\u1014\u103a\u100a\u102d\u103e\u1019\u103e\u102f",windowlessvideo:"\u101d\u1004\u103a\u1038\u1012\u102d\u102f\u1038\u1019\u1015\u102b\u1031\u101e\u102c \u1017\u103d\u102e\u1012\u102e\u101a\u102d\u102f",stretchtofit:"\u1021\u1036\u1037\u1000\u102d\u102f\u1000\u103a\u103c\u1016\u1005\u103a\u1031\u1005\u101b\u1014\u103a \u1006\u103d\u1032\u1006\u1014\u103a\u1037",mute:"\u1021\u101e\u1036\u1015\u102d\u1010\u103a",invokeurls:"\u1031\u1016\u102c\u103a\u103c\u1015 URL \u1019\u103b\u102c\u1038",fullscreen:"\u1005\u1000\u101b\u1004\u103a \u1021\u103c\u1015\u100a\u103a\u1037",enabled:"\u1016\u103d\u1004\u103a\u1037\u1011\u102c\u1038\u1031\u101e\u102c",autostart:"\u1021\u101c\u102d\u102f\u101c\u102d\u102f \u1005\u1016\u103d\u1004\u103a\u1037",volume:"\u1021\u101e\u1036 \u1021\u1010\u102d\u102f\u1038\u1021\u1000\u103b\u101a\u103a",target:"\u101b\u100a\u103a\u1019\u103e\u1014\u103a\u1038\u1001\u103b\u1000\u103a(\u1010\u102c\u1038\u1002\u1000\u103a)",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"\u1021\u1006\u1036\u102f\u1038\u101e\u1010\u103a\u1001\u103b\u102d\u1014\u103a",starttime:"\u1021\u1005\u103c\u1015\u102f\u1001\u103b\u102d\u1014\u103a",enablejavascript:"JavaScript \u1016\u103d\u1004\u103a\u1037\u101b\u1014\u103a",correction:"\u1021\u1019\u103e\u1014\u103a\u1019\u103c\u1015\u1004\u103a\u1015\u102b",targetcache:"\u1010\u102c\u1038\u1002\u1000\u103a cache",playeveryframe:"\u1016\u101b\u102d\u1019\u103a\u1021\u102c\u1038\u101c\u1036\u102f\u1038\u1000\u102d\u102f \u1016\u103d\u1004\u103a\u1037\u1015\u102b",kioskmode:"Kiosk \u1019\u102f(\u1012\u103a)",controller:"\u1011\u102d\u1014\u103a\u1038\u1001\u103b\u102f\u1015\u103a\u1001\u101c\u102f\u1015\u103a",menu:"\u1019\u102e\u1014\u1030\u1038\u1005\u102c\u101b\u1004\u103a\u1038\u1000\u102d\u102f \u103c\u1015\u1011\u102c\u1038\u1015\u102b",loop:"\u103c\u1015\u1014\u103a\u101b\u1005\u103a\u1016\u103d\u1004\u103a\u1037\u1015\u102b",play:"\u1021\u101c\u102d\u102f\u101c\u102d\u102f\u1016\u103d\u1004\u103a\u1037",hspace:"H-\u1000\u103d\u1000\u103a\u101c\u1015\u103a",vspace:"V-\u1000\u103d\u1000\u103a\u101c\u1015\u103a",class_name:"class \u1021\u1019\u100a\u103a",name:"\u1021\u1019\u100a\u103a",id:"ID",type:"\u1021\u1019\u103b\u102d\u102f\u1038\u1021\u1005\u102c\u1038",size:"\u1021\u1010\u102d\u102f\u1004\u103a\u1038\u1021\u1011\u103d\u102c\u1019\u103b\u102c\u1038",preview:"\u1021\u1005\u1019\u103a\u1038\u103c\u1000\u100a\u103a\u1037\u101b\u1014\u103a",constrain_proportions:"\u103c\u1019\u1004\u103a\u1000\u103d\u1004\u103a\u1038\u1021\u1001\u103b\u102d\u102f\u1038\u1000\u102d\u102f \u1011\u102d\u1014\u103a\u1038\u100a\u103e\u102d\u1015\u102b",controls:"\u1011\u102d\u1014\u103a\u1038\u1001\u103b\u102f\u1015\u103a\u1019\u103e\u102f\u1019\u103b\u102c\u1038",numloop:"\u103c\u1015\u1014\u103a\u101b\u1005\u103a\u101b\u1014\u103a \u1021\u103c\u1000\u102d\u1019\u103a\u1021\u1031\u101b\u1021\u1010\u103d\u1000\u103a",console:"CONSOLE",cache:"CACHE",autohref:"\u1021\u101c\u102d\u102f\u101c\u102d\u102fHREF\u1011\u100a\u103a\u1037",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"\u1021\u1031\u103c\u1001\u1001\u1036",bgcolor:"\u1031\u1014\u102c\u1000\u103a\u1001\u1036",wmode:"WMode",salign:"SAlign",align:"Align",scale:"\u1005\u1031\u1000\u1038",quality:"\u1021\u101b\u100a\u103a\u1021\u1031\u101e\u103d\u1038",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain aspect",imagestatus:"\u101b\u102f\u1015\u103a\u1015\u1036\u102f\u1021\u1031\u103c\u1001\u1021\u1031\u1014",center:"\u1021\u101c\u101a\u103a\u1017\u101f\u102d\u102f",autogotourl:"\u1021\u101c\u102d\u102f\u101c\u102d\u102f\u101e\u103d\u102c\u1038\u101b\u1014\u103a URL",shockwave_options:"Shockwave \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",rmp_options:"Real media player \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",wmp_options:"Windows media player \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",qt_options:"Quicktime \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",flash_options:"Flash \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",hidden:"\u101d\u103e\u1000\u103a\u1011\u102c\u1038\u1031\u101e\u102c",align_bottom_left:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001\u1018\u101a\u103a",align_bottom_right:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001\u100a\u102c",flv_options:"Flash \u1017\u103d\u102e\u1012\u102e\u101a\u102d\u102f\u1006\u102d\u102f\u1004\u103a\u101b\u102c \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",flv_scalemode:"\u1005\u1031\u1000\u1038 mode",flv_buffer:"Buffer",flv_startimage:"\u1021\u1005\u101b\u102f\u1015\u103a\u1015\u1036\u102f",flv_starttime:"\u1005\u1010\u1004\u103a\u1001\u103b\u102d\u1014\u103a",flv_defaultvolume:"\u1019\u1030\u101c \u1021\u101e\u1036\u1021\u1000\u103b\u101a\u103a",flv_hiddengui:"Hidden GUI",flv_autostart:"\u1021\u101c\u102d\u102f\u101c\u102d\u102f\u1005\u1016\u103d\u1004\u103a\u1037",flv_loop:"\u103c\u1015\u1014\u103a\u1031\u1000\u103b\u102c\u1037",flv_showscalemodes:"\u1005\u1031\u1000\u1038 mode\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u103c\u1015\u1015\u102b",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback",html5_video_options:"HTML5 \u1017\u103d\u102e\u1012\u102e\u101a\u102d\u102f \u1031\u101b\u103d\u1038\u1001\u103b\u101a\u103a\u1005\u101b\u102c\u1019\u103b\u102c\u1038",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"\u1015\u102d\u102f\u1005\u1010\u102c",source:"\u101b\u1004\u103a\u1038\u103c\u1019\u1005\u103a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/nb_dlg.js b/js/tiny_mce/plugins/media/langs/nb_dlg.js new file mode 100755 index 000000000..e8fe8b692 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.media_dlg',{list:"Liste",file:"Fil/URL",advanced:"Avansert",general:"Generelt",title:"Sett inn / rediger inkludert objekt","align_top_left":"Topp venstre","align_center":"Midtstill","align_left":"Venstre","align_bottom":"Bunn","align_right":"H\u00f8yre","align_top":"Topp","qt_stream_warn":"Streamede rtsp-ressurser b\u00f8r legges til QT Src-felt i avansert-fanen.\\nDu b\u00f8r ogs\u00e5 legge til en ikke-streamet versjon i Src-felt",qtsrc:"QT Src",progress:"Framdrift",sound:"Lyd",swstretchvalign:"Strekk V-justering",swstretchhalign:"Strekk H-justering",swstretchstyle:"Strekkstil",scriptcallbacks:"Skript-referanser","align_top_right":"Topp h\u00f8yre",uimode:"UI-modus",rate:"Rate",playcount:"Teller",defaultframe:"Standardramme",currentposition:"Aktiv posisjon",currentmarker:"Aktiv mark\u00f8r",captioningid:"Fang opp id",baseurl:"Utgangsadresse (URL)",balance:"Balanse",windowlessvideo:"Video uten vindu",stretchtofit:"Strekk for \u00e5 passe inn",mute:"Demp",invokeurls:"Aktiviser URL-er",fullscreen:"Fullskjerm",enabled:"Kj\u00f8rbar",autostart:"Autostart",volume:"Volum",target:"M\u00e5l",qtsrcchokespeed:"Choke-hastighet",href:"Href",endtime:"Stopptid",starttime:"Starttid",enablejavascript:"Tillat Javaskript",correction:"Ingen korreksjon",targetcache:"M\u00e5l-mellomlagring",playeveryframe:"Spill hver ramme",kioskmode:"Kiosk-modus",controller:"Kontroller",menu:"Vis meny",loop:"L\u00f8kke",play:"Autostart",hspace:"Horisontal avstand",vspace:"Vertikal avstand","class_name":"Klasse",name:"Navn",id:"Id",type:"Type",size:"St\u00f8rrelse",preview:"Forh\u00e5ndsvisning","constrain_proportions":"Behold st\u00f8rrelsesforhold",controls:"Kontroller",numloop:"Antall gjennoml\u00f8p",console:"Konsoll",cache:"Mellomlager",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash-variabler",base:"Base",bgcolor:"Bakgrunn",wmode:"W-modus",salign:"S-justering",align:"Justering",scale:"Skalering",quality:"Kvalitet",shuffle:"Miks",prefetch:"Forh\u00e5ndsregistrer",nojava:"Ingen Java",maintainaspect:"Behold st\u00f8rrelsesforhold",imagestatus:"Bildestatus",center:"Midtstill",autogotourl:"Auto-g\u00e5-til-URL","shockwave_options":"Shockwave-innstillinger","rmp_options":"Real mediaplayer-innstillinger","wmp_options":"Windows mediaplayer-innstillinger","qt_options":"Quicktime-innstillinger","flash_options":"Flash-egenskaper",hidden:"Skjult","align_bottom_left":"Bunn venstre","align_bottom_right":"Bunn h\u00f8yre","flv_options":"Flash video-valg","flv_scalemode":"Skalering","flv_buffer":"Buffer","flv_startimage":"Startbilde","flv_starttime":"Starttid","flv_defaultvolume":"Standardvolum","flv_hiddengui":"Skjult GUI","flv_autostart":"Auto-start","flv_loop":"L\u00f8kke","flv_showscalemodes":"Vis skalering","flv_smoothvideo":"Jevn video","flv_jscallback":"JS-tilbakekall","html5_video_options":"HTML5-videovalg",altsource1:"Alternativ kilde 1",altsource2:"Alternativ kilde 2",preload:"Forh\u00e5ndsvis",poster:"Poster",source:"Kilde"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/nl_dlg.js b/js/tiny_mce/plugins/media/langs/nl_dlg.js new file mode 100755 index 000000000..22da230cd --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.media_dlg',{list:"Lijst",file:"Bestand/URL",advanced:"Geavanceerd",general:"Algemeen",title:"Media invoegen/bewerken","align_top_left":"Linksboven","align_center":"Centreren","align_left":"Links","align_bottom":"Onder","align_right":"Rechts","align_top":"Boven","qt_stream_warn":"Gestreamde RTSP bronnen dienen op het tabblad geavanceerd bij Quicktime bron te worden opgegeven.\\nDe niet-gestreamde versie kan dan bij het tabblad algemeen worden opgegeven.",qtsrc:"Quicktime bron",progress:"Voortgang",sound:"Geluid",swstretchvalign:"V-Schaal",swstretchhalign:"H-Schaal",swstretchstyle:"Schaal",scriptcallbacks:"Script callbacks","align_top_right":"Rechtsboven",uimode:"UI Modus",rate:"Snelheid",playcount:"Afspeelteller",defaultframe:"Standaard frame",currentposition:"Huidige positie",currentmarker:"Huidige markering",captioningid:"Ondertiteling id",baseurl:"Basis URL",balance:"Balans",windowlessvideo:"Video zonder venster",stretchtofit:"Passend maken",mute:"Dempen",invokeurls:"URLs laden",fullscreen:"Volledig scherm",enabled:"Ingeschakeld",autostart:"Automatisch afspelen",volume:"Volume",target:"Doel",qtsrcchokespeed:"Chokesnelheid",href:"Href",endtime:"Eindtijd",starttime:"Starttijd",enablejavascript:"JavaScript Inschakelen",correction:"Geen correctie",targetcache:"Doelcache",playeveryframe:"Elk frame afspelen",kioskmode:"Kioskmodus",controller:"Controller",menu:"Menu weergeven",loop:"Herhalen",play:"Automatisch afspelen",hspace:"H-Ruimte",vspace:"V-Ruimte","class_name":"Klasse",name:"Naam",id:"Id",type:"Type",size:"Afmetingen",preview:"Voorbeeld","constrain_proportions":"Verhouding bewaren",controls:"Bediening",numloop:"Aantal herhalingen",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Variabelen",base:"Basis",bgcolor:"Achtergrond",wmode:"WMode",salign:"Schaaluitlijning",align:"Uitlijning",scale:"Schaal",quality:"Kwaliteit",shuffle:"Willekeurige volgorde",prefetch:"Voorladen",nojava:"Geen java",maintainaspect:"Verhouding bewaren",imagestatus:"Afbeeldingstatus",center:"Centreren",autogotourl:"Automatisch naar URL","shockwave_options":"Shockwave opties","rmp_options":"Real mediaspeler opties","wmp_options":"Windows mediaspeler opties","qt_options":"Quicktime opties","flash_options":"Flash opties",hidden:"Verborgen","align_bottom_left":"Linksonder","align_bottom_right":"Rechtsonder","flv_options":"Flash video-opties","flv_scalemode":"Schaalmodus","flv_buffer":"Buffer","flv_startimage":"Startafbeelding","flv_starttime":"Starttijd","flv_defaultvolume":"Standaard volume","flv_hiddengui":"GUI verbergen","flv_autostart":"Automatisch afspelen","flv_loop":"Herhalen","flv_showscalemodes":"Schaalmodus weergeven","flv_smoothvideo":"Soepele video","flv_jscallback":"JS Callback","html5_video_options":"HTML5 Video Opties",altsource1:"Alternatieve bron 1",altsource2:"Alternatieve bron 2",preload:"Voorladen",poster:"Poster",source:"Bron"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/nn_dlg.js b/js/tiny_mce/plugins/media/langs/nn_dlg.js new file mode 100755 index 000000000..e223605dd --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.media_dlg',{list:"Liste",file:"Fil/URL",advanced:"Avansert",general:"Generelt",title:"Set inn / rediger inkludert objekt",align_top_left:"Topp venstre",align_center:"Midt",align_left:"Venstre",align_bottom:"Botn",align_right:"H\u00f8gre",align_top:"Topp",qt_stream_warn:"Streama rtsp-ressursar b\u00f8r leggsst til QT Src field i avansert-fana.\\nDu b\u00f8r ogs\u00e5 leggje til ein ikkje-streama versjon i src field",qtsrc:"QT Src",progress:"Framdrift",sound:"Lyd",swstretchvalign:"Strekk V-justering",swstretchhalign:"Strekk H-justering",swstretchstyle:"Strekkstil",scriptcallbacks:"Skript-referanser",align_top_right:"Top h\u00f8gre",uimode:"UI-modus",rate:"Rate",playcount:"Tellar",defaultframe:"Standardramme",currentposition:"Aktiv posisjon",currentmarker:"Aktiv mark\u00f8r",captioningid:"Fange opp id",baseurl:"Base URL",balance:"Balanse",windowlessvideo:"Video utan vindauge",stretchtofit:"Strekk for \u00e5 passe inn",mute:"Demp",invokeurls:"Aktiviser URL-ar",fullscreen:"Fullskjerm",enabled:"K\u00f8yrbar",autostart:"Autostart",volume:"Volum",target:"M\u00e5l",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Stopptid",starttime:"Starttid",enablejavascript:"Tillat Javaskript",correction:"Ingen korreksjon",targetcache:"M\u00e5l-cache",playeveryframe:"Spel kvar ramme",kioskmode:"Kiosk-modus",controller:"Kontroller",menu:"Vis meny",loop:"Lykkje",play:"Autostart",hspace:"Horisontal avstand",vspace:"Vertikal avstand",class_name:"Klasse",name:"Namn",id:"Id",type:"Type",size:"Storleik",preview:"Sj\u00e5 f\u00f8rebels utkast",constrain_proportions:"Behald proporsjonar",controls:"Kontroller",numloop:"Antal gjennoml\u00f8p",console:"Konsoll",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash-variablar",base:"Base",bgcolor:"Bakgrunn",wmode:"W-modus",salign:"S-justering",align:"Justering",scale:"Skalering",quality:"Kvalitet",shuffle:"Miks",prefetch:"Registrer p\u00e5 f\u00f8rehand",nojava:"Ikke Java",maintainaspect:"Behald proporsjonar",imagestatus:"Status for bilete",center:"Midtstill",autogotourl:"Auto-g\u00e5-til-URL",shockwave_options:"Shockwave-innstillinger",rmp_options:"Real mediaplayer-innstillingar",wmp_options:"Windows mediaplayer-innstillingar",qt_options:"Quicktime-innstillingar",flash_options:"Flash-eigenskapar",hidden:"Skjult",align_bottom_left:"Botn venste",align_bottom_right:"Botn h\u00f8gre",flv_options:"Flash video-val",flv_scalemode:"Skalering",flv_buffer:"Buffer",flv_startimage:"Startbilde",flv_starttime:"Starttid",flv_defaultvolume:"Standardvolum",flv_hiddengui:"Skjult GUI",flv_autostart:"Autostart",flv_loop:"L\u00f8kke",flv_showscalemodes:"Vis skalering",flv_smoothvideo:"Jamn video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/no_dlg.js b/js/tiny_mce/plugins/media/langs/no_dlg.js new file mode 100755 index 000000000..7d5c9a089 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.media_dlg',{list:"Liste",file:"Fil/URL",advanced:"Avansert",general:"Generelt",title:"Sett inn/rediger inkludert objekt","align_top_left":"Topp venstre","align_center":"Midten","align_left":"Venstre","align_bottom":"Bunn","align_right":"H\u00f8yre","align_top":"Topp","qt_stream_warn":"Streamede rtsp ressurser b\u00f8r legges til QT Src-feltet under fanen avansert.\\nDu b\u00f8r ogs\u00e5 legge til en ikke-streamet versjon i src-feltet.",qtsrc:"QT Src",progress:"Fremdrift",sound:"Lyd",swstretchvalign:"Strekk V-justering",swstretchhalign:"Strekk H-justering",swstretchstyle:"Strekk stil",scriptcallbacks:"Skript referanser","align_top_right":"Topp h\u00f8yre",uimode:"UI-modus",rate:"Rate",playcount:"Teller",defaultframe:"Standard ramme",currentposition:"Aktiv posisjon",currentmarker:"Aktiv mark\u00f8r",captioningid:"Fange opp id",baseurl:"Utgangsadresse (URL)",balance:"Balanse",windowlessvideo:"Video uten vindu",stretchtofit:"Strekk for \u00e5 passe",mute:"Dempe",invokeurls:"Aktiver URLer",fullscreen:"Fullskjerm",enabled:"Aktivert",autostart:"Autostart",volume:"Volum",target:"M\u00e5l",qtsrcchokespeed:"Choke-hastighet",href:"Href",endtime:"Stopp tid",starttime:"Start tid",enablejavascript:"Tillat Javaskript",correction:"Ingen korreksjon",targetcache:"M\u00e5l-mellomlagring",playeveryframe:"Spill hver ramme",kioskmode:"Kiosk-modus",controller:"Kontroller",menu:"Vis meny",loop:"L\u00f8kke",play:"Autostart",hspace:"H-avstand",vspace:"V-avstand","class_name":"Klasse",name:"Navn",id:"Id",type:"Type",size:"Dimmensjoner",preview:"Forh\u00e5ndsvis","constrain_proportions":"Behold proporsjoner",controls:"Kontroller",numloop:"Antall gjennomganger",console:"Konsoll",cache:"Mellomlager",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash variabler",base:"Base",bgcolor:"Bakgrunn",wmode:"W-modus",salign:"S-justering",align:"Justering",scale:"Skala",quality:"Kvalitet",shuffle:"Mikse",prefetch:"Hente p\u00e5 forh\u00e5nd",nojava:"Ingen Java",maintainaspect:"Behold st\u00f8rrelsesforhold",imagestatus:"Bildestatus",center:"Midtstill",autogotourl:"Auto g\u00e5-til URL","shockwave_options":"Shockwave egenskaper","rmp_options":"Real mediaplayer egenskaper","wmp_options":"Windows Media Player egenskaper","qt_options":"Quicktime egenskaper","flash_options":"Flash egenskaper",hidden:"Skjult","align_bottom_left":"Bunn venste","align_bottom_right":"Bunn h\u00f8gre","flv_options":"Flash video egenskaper","flv_scalemode":"Skalerings modus","flv_buffer":"Buffer","flv_startimage":"Startbilde","flv_starttime":"Starttid","flv_defaultvolume":"Standardvolum","flv_hiddengui":"Skjult GUI","flv_autostart":"Autostart","flv_loop":"L\u00f8kke","flv_showscalemodes":"Vis skalering","flv_smoothvideo":"Jevn video","flv_jscallback":"JS-tilbakekall","html5_video_options":"HTML5-videovalg",altsource1:"Alternativ kilde 1",altsource2:"Alternativ kilde 2",preload:"Forh\u00e5ndsvis",poster:"Poster",source:"Kilde"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/pl_dlg.js b/js/tiny_mce/plugins/media/langs/pl_dlg.js new file mode 100755 index 000000000..7b8695faa --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.media_dlg',{list:"Lista",file:"Plik/URL",advanced:"Zaawansowane",general:"G\u0142\u00f3wne",title:"Wstaw/Edytuj wbudowane media","align_top_left":"G\u00f3rny lewy","align_center":"\u015arodek","align_left":"Lewo","align_bottom":"D\u00f3\u0142","align_right":"Prawo","align_top":"G\u00f3ra","qt_stream_warn":"Emitowane \u017ar\u00f3d\u0142a rtsp powinny by\u0107 dodane do pola QT Src w zak\u0142adce zaawansowane.nPowiniene\u015b r\u00f3wnie\u017c doda\u0107 niestrumieniow\u0105 wersj\u0119 do pola Src.",qtsrc:"QT Src",progress:"Post\u0119p",sound:"D\u017awi\u0119k",swstretchvalign:"Wyr\u00f3wnaj w pionie",swstretchhalign:"Wyr\u00f3wnaj w poziomie",swstretchstyle:"Styl rozci\u0105gania",scriptcallbacks:"Funkcje zwrotne skryptu","align_top_right":"G\u00f3rny prawy",uimode:"Tryb UI",rate:"Tempo",playcount:"Ilo\u015b\u0107 odtworze\u0144",defaultframe:"Domy\u015blna ramka",currentposition:"Aktualna pozycja",currentmarker:"Aktualny znacznik",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balans",windowlessvideo:"Wideo bez okienka",stretchtofit:"Rozci\u0105gnij aby dopasowa\u0107",mute:"Wycisz",invokeurls:"Odwo\u0142aj si\u0119 do URLi",fullscreen:"Pe\u0142ny ekran",enabled:"Aktywny",autostart:"Auto start",volume:"G\u0142o\u015bno\u015b\u0107",target:"Cel",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Ko\u0144cowy czas",starttime:"Pocz\u0105tkowy czas",enablejavascript:"W\u0142\u0105cz JavaScript",correction:"Bez korekcji",targetcache:"Target cache",playeveryframe:"Odtwarzaj ka\u017cd\u0105 ramk\u0119",kioskmode:"Tryb kiosku",controller:"Kontroler",menu:"Poka\u017c menu",loop:"Zap\u0119tlenie",play:"Autoodtwarzanie",hspace:"H-Space",vspace:"V-Space","class_name":"Klasa",name:"Nazwa",id:"Id",type:"Typ",size:"Wymiary",preview:"Podgl\u0105d","constrain_proportions":"Zachowaj proporcje",controls:"Controls",numloop:"Liczba powt\u00f3rze\u0144",console:"Konsola",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Baza",bgcolor:"T\u0142o",wmode:"WMode",salign:"SAlign",align:"Wyr\u00f3wnaj",scale:"Skala",quality:"Jako\u015b\u0107",shuffle:"Losuj",prefetch:"Prze\u0142aduj",nojava:"Bez javy",maintainaspect:"Utrzymaj aspekt",imagestatus:"Obraz statusu",center:"Wy\u015brodkuj",autogotourl:"Automatycznie przejd\u017a pod adres","shockwave_options":"Opcje Shockwave","rmp_options":"Opcje Real media player","wmp_options":"Opcje Windows media player","qt_options":"Opcje Quicktime","flash_options":"Opcje flasha",hidden:"Ukryty","align_bottom_left":"Dolny lewy","align_bottom_right":"Dolny prawy","flv_options":"Opcje wideo flasha","flv_scalemode":"Tryb skalowania","flv_buffer":"Bufor","flv_startimage":"Obraz startowy","flv_starttime":"Czas startu","flv_defaultvolume":"Domy\u015blna g\u0142o\u015bno\u015b\u0107","flv_hiddengui":"Ukryte GUI","flv_autostart":"Autostart","flv_loop":"Zap\u0119tlaj","flv_showscalemodes":"Pokazuj tryby skali","flv_smoothvideo":"P\u0142ynne wideo","flv_jscallback":"Funkcja zwrotna JS","html5_video_options":"Opcje HTML5 Video",altsource1:"Alternatywne \u017ar\u00f3d\u0142o 1",altsource2:"Alternatywne \u017ar\u00f3d\u0142o 2",preload:"Prze\u0142aduj",poster:"Obraz",source:"\u0179r\u00f3d\u0142o"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ps_dlg.js b/js/tiny_mce/plugins/media/langs/ps_dlg.js new file mode 100755 index 000000000..f9d802ef4 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/pt_dlg.js b/js/tiny_mce/plugins/media/langs/pt_dlg.js new file mode 100755 index 000000000..0747dd04e --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.media_dlg',{list:"Lista",file:"Arquivo/URL",advanced:"Avan\u00e7ado",general:"Geral",title:"Inserir/Editar m\u00eddia incorporada",align_top_left:"Topo esquerda",align_center:"Centro",align_left:"Esquerda",align_bottom:"Abaixo",align_right:"Direita",align_top:"Topo",qt_stream_warn:"Fluxos de recursos rtsp devem ser acrescentados ao campo QT Src no Modo Avan\u00e7ado.\\Numa vers\u00e3o sem fluxo tamb\u00e9m deve ser acrescentada ao campo Src.",qtsrc:"QT Src",progress:"Progresso",sound:"Som",swstretchvalign:"For\u00e7ar V-Alinhamento",swstretchhalign:"For\u00e7ar H-Alinhamento",swstretchstyle:"For\u00e7ar Estilo",scriptcallbacks:"Retornos de script",align_top_right:"Topo direita",uimode:"Modo UI",rate:"Taxa",playcount:"Contagem de ouvintes",defaultframe:"Frame padr\u00e3o",currentposition:"Posi\u00e7\u00e3o atual",currentmarker:"Marcador atual",captioningid:"Id de legenda",baseurl:"URL Base",balance:"Stereo",windowlessvideo:"V\u00eddeo sem janela",stretchtofit:"Estender",mute:"Mudo",invokeurls:"Chamar URLs",fullscreen:"Tela inteira",enabled:"Ativado",autostart:"Execu\u00e7\u00e3o autom\u00e1tica",volume:"Volume",target:"Alvo",qtsrcchokespeed:"Diminuir Velocidade",href:"Link",endtime:"Hora do fim",starttime:"Hora de in\u00edcio",enablejavascript:"Disponibilizar javaScript",correction:"Sem correc\u00e7\u00f5es",targetcache:"Cache alvo",playeveryframe:"Executar todas as frames",kioskmode:"Modo Quiosque",controller:"Controlador",menu:"Mostrar menu",loop:"Repeti\u00e7\u00e3o autom\u00e1tica",play:"Execu\u00e7\u00e3o autom\u00e1tica",hspace:"Espa\u00e7o horizontal",vspace:"Espa\u00e7o vertical",class_name:"Classe",name:"Nome",id:"Id",type:"Tipo",size:"Dimens\u00f5es",preview:"Previs\u00e3o",constrain_proportions:"Manter propor\u00e7\u00f5es",controls:"Controles",numloop:"Repeti\u00e7\u00f5es",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Fundo",wmode:"WMode",salign:"SAlign",align:"Alinhamento",scale:"Escala",quality:"Qualidade",shuffle:"Aleat\u00f3rio",prefetch:"Pr\u00e9-buscar",nojava:"Sem java",maintainaspect:"Manter aspecto",imagestatus:"Status da imagem",center:"Centro",autogotourl:"Auto abrir URL",shockwave_options:"Op\u00e7\u00f5es Shockwave",rmp_options:"Op\u00e7\u00f5es Real Media Player",wmp_options:"Op\u00e7\u00f5es Windows Media Player",qt_options:"Op\u00e7\u00f5es Quicktime",flash_options:"Op\u00e7\u00f5es Flash",hidden:"Oculto",align_bottom_left:"Abaixo esquerda",align_bottom_right:"Abaixo direita",flv_options:"Op\u00e7\u00f5es de Flash video",flv_scalemode:"Modo escala",flv_buffer:"Buffer",flv_startimage:"Imagem inicial",flv_starttime:"Hora inicial",flv_defaultvolume:"Volume padr\u00e3o",flv_hiddengui:"GUI oculta",flv_autostart:"Execu\u00e7\u00e3o Autom\u00e1tica",flv_loop:"Repeti\u00e7\u00e3o",flv_showscalemodes:"Mostrar modos escala",flv_smoothvideo:"Suavilizar video",flv_jscallback:"Retorno de JS",html5_video_options:"Op\u00e7\u00f5es de v\u00eddeo HTML5",altsource1:"C\u00f3digo alternativo 1",altsource2:"C\u00f3digo alternativo 2",preload:"Pr\u00e9-carregar",poster:"Poster",source:"Fonte"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ro_dlg.js b/js/tiny_mce/plugins/media/langs/ro_dlg.js new file mode 100755 index 000000000..7c08c7a24 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.media_dlg',{list:"List\u0103",file:"Fi\u015fier/URL",advanced:"Avansat\u0103",general:"General",title:"Insereaz\u0103 / editeaz\u0103 media",align_top_left:"St\u00e2nga sus",align_center:"Centru",align_left:"St\u00e2nga",align_bottom:"Jos",align_right:"Dreapta",align_top:"Sus",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progres",sound:"Sunet",swstretchvalign:"Stretch V-Aliniere",swstretchhalign:"Stretch H-Aliniere",swstretchstyle:"Stil strech",scriptcallbacks:"Script callback",align_top_right:"Dreapta sus",uimode:"Mod UI",rate:"Vot",playcount:"Numar red\u0103ri",defaultframe:"Frame implicit",currentposition:"Pozi\u0163ie curent\u0103",currentmarker:"Marcator curent",captioningid:"Titlu id",baseurl:"URL baz\u0103",balance:"Balan\u0163\u0103",windowlessvideo:"Video f\u0103r\u0103 fereastr\u0103",stretchtofit:"\u00centinde pentru a se \u00eencadra",mute:"Mut",invokeurls:"Invoc\u0103 URL-uri",fullscreen:"Ecran complet",enabled:"Activat",autostart:"Pornire automat\u0103",volume:"Volum",target:"Tin\u0163a",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Timp de sf\u00e2r\u015fit",starttime:"Timp de \u00eenceput",enablejavascript:"Activeaz\u0103 JavaScript",correction:"F\u0103r\u0103 corecturi",targetcache:"Target cache",playeveryframe:"Red\u0103 fiecare frame",kioskmode:"Mod Kiosk",controller:"Controler",menu:"Arat\u0103 meniu",loop:"Repetare",play:"Redare automat\u0103",hspace:"H-Space",vspace:"V-Space",class_name:"Clas\u0103",name:"Nume",id:"Id",type:"Tip",size:"Dimensiuni",preview:"Previzualizare",constrain_proportions:"Men\u0163inere propor\u0163ii",controls:"Controale",numloop:"Num\u0103r de repet\u0103ri",console:"Consola",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Variabile Flash",base:"URL de baza",bgcolor:"Fundal",wmode:"WMode",salign:"SAlign",align:"Aliniere",scale:"Scar\u0103",quality:"Calitate",shuffle:"Aleator",prefetch:"Prefetch",nojava:"F\u0103r\u0103 java",maintainaspect:"Men\u0163ine aspect",imagestatus:"Status imagine",center:"Centru",autogotourl:"Auto goto URL",shockwave_options:"Op\u0163iuni Shockwave",rmp_options:"Op\u0163iuni Real media player",wmp_options:"Op\u0163iuni Windows media player",qt_options:"Op\u0163iuni QuickTime",flash_options:"Op\u0163iuni Flash",hidden:"Ascuns",align_bottom_left:"St\u00e2nga jos",align_bottom_right:"Dreapta jos",flv_options:"Op\u0163iuni Flash video",flv_scalemode:"Moduri scal\u0103",flv_buffer:"Buffer",flv_startimage:"Imagine start ",flv_starttime:"Timp start",flv_defaultvolume:"Volum implicit",flv_hiddengui:"GUI ascuns",flv_autostart:"Auto pornire",flv_loop:"Repetare",flv_showscalemodes:"Afi\u015fare moduri scalare",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ru_dlg.js b/js/tiny_mce/plugins/media/langs/ru_dlg.js new file mode 100755 index 000000000..8d19a3afa --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.media_dlg',{list:"\u0421\u043f\u0438\u0441\u043e\u043a",file:"\u0410\u0434\u0440\u0435\u0441",advanced:"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",general:"\u041e\u0431\u0449\u0435\u0435",title:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043b\u0438\u043f\u0430","align_top_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_center":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","qt_stream_warn":"\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 rtsp \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u043b\u0435 QT Src.",qtsrc:"QT Src",progress:"\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441",sound:"\u0417\u0432\u0443\u043a",swstretchvalign:"\u0412\u0435\u0440. \u0432\u044b\u0440-\u0435 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u044f",swstretchhalign:"\u0413\u043e\u0440. \u0432\u044b\u0440-\u0435 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u044f",swstretchstyle:"\u0421\u0442\u0438\u043b\u044c \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u0435",scriptcallbacks:"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430","align_top_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",uimode:"\u0420\u0435\u0436\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430",rate:"\u0420\u0435\u0439\u0442\u0438\u043d\u0433",playcount:"\u0429\u0435\u0442\u0447\u0438\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439",defaultframe:"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u0430\u0434\u0440",currentposition:"\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f",currentmarker:"\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440",captioningid:"\u0418\u043c\u044f \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432",baseurl:"\u0411\u0430\u0437\u043e\u0440\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441",balance:"\u0411\u0430\u043b\u0430\u043d\u0441",windowlessvideo:"\u041e\u043a\u043e\u043d\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e",stretchtofit:"\u041f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430",mute:"\u0411\u0435\u0437 \u0437\u0432\u0443\u043a\u0430",invokeurls:"\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441",fullscreen:"\u041d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d",enabled:"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e",autostart:"\u0410\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a",volume:"\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c",target:"\u0426\u0435\u043b\u044c",qtsrcchokespeed:"Choke speed",href:"\u0421\u0441\u044b\u043b\u043a\u0430",endtime:"\u0412\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f",starttime:"\u0412\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430",enablejavascript:"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c JavaScript",correction:"\u0411\u0435\u0437 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438",targetcache:"\u041a\u044d\u0448 \u0446\u0435\u043b\u0438",playeveryframe:"\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440",kioskmode:"\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043e\u0441\u043a",controller:"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",menu:"\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044e",loop:"\u041f\u043e\u0432\u0442\u043e\u0440",play:"\u0410\u0432\u0442\u0437\u0430\u043f\u0443\u0441\u043a",hspace:"\u0413\u043e\u0440. \u043e\u0442\u0441\u0442\u0443\u043f",vspace:"\u0412\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f","class_name":"\u041a\u043b\u0430\u0441\u0441",name:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",id:"\u0418\u043c\u044f",type:"\u0422\u0438\u043f",size:"\u0420\u0430\u0437\u043c\u0435\u0440\u044b",preview:"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","constrain_proportions":"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438",controls:"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",numloop:"\u041f\u043e\u0432\u0442\u043e\u0440\u044b",console:"\u041a\u043e\u043d\u0441\u043e\u043b\u044c",cache:"\u041a\u044d\u0448",autohref:"\u0410\u0432\u0442\u043e-\u0441\u0441\u044b\u043b\u043a\u0430",liveconnect:"SWLiveConnect",flashvars:"Flash \u043a\u043e\u043c\u0430\u043d\u0434\u044b",base:"Base",bgcolor:"\u0424\u043e\u043d",wmode:"\u041e\u043a\u043d\u043e",salign:"\u0412\u044b\u0440-\u0435",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",scale:"\u041e\u0431\u043b\u0430\u0441\u0442\u044c",quality:"\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e",shuffle:"\u0412 \u0440\u0430\u0437\u0431\u0440\u043e\u0441",prefetch:"\u0423\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0430\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430",nojava:"\u0411\u0435\u0437 Java",maintainaspect:"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440",imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f",center:"\u0426\u0435\u043d\u0442\u0440",autogotourl:"\u0410\u0432\u0442\u043e\u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441","shockwave_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Shockwave","rmp_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Real Media","wmp_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Windows Media","qt_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Quicktime","flash_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Flash",hidden:"\u0421\u043a\u0440\u044b\u0442\u044b\u0439","align_bottom_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_bottom_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","flv_options":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Flash","flv_scalemode":"\u041c\u0430\u0441\u0448\u0442\u0430\u0431","flv_buffer":"\u0411\u0443\u0444\u0435\u0440","flv_startimage":"\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","flv_starttime":"\u0421\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f","flv_defaultvolume":"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0437\u0432\u0443\u043a","flv_hiddengui":"\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441","flv_autostart":"\u0410\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a","flv_loop":"\u041f\u043e\u0432\u0442\u043e\u0440","flv_showscalemodes":"\u0420\u0435\u0436\u0438\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430","flv_smoothvideo":"\u041f\u043b\u0430\u0432\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e","flv_jscallback":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 JS","html5_video_options":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b HTML5 Video",altsource1:"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a 1",altsource2:"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a 2",preload:"\u041f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430",poster:"\u041f\u043e\u0441\u0442\u0435\u0440",source:"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/sc_dlg.js b/js/tiny_mce/plugins/media/langs/sc_dlg.js new file mode 100755 index 000000000..679998cf5 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6/\u7f51\u5740",advanced:"\u9ad8\u7ea7",general:"\u4e00\u822c",title:"\u63d2\u5165/\u7f16\u8f91\u5d4c\u5165\u5a92\u4f53",align_top_left:"\u5de6\u4e0a",align_center:"\u4e2d\u95f4",align_left:"\u9760\u5de6",align_bottom:"\u4e0b\u65b9",align_right:"\u9760\u53f3",align_top:"\u4e0a\u65b9",qt_stream_warn:"\u6d41\u5f0frtsp\u8d44\u6e90\u5e94\u8be5\u6dfb\u52a0\u5230\u300c\u9ad8\u7ea7\u300d\u4e2dQT Src\u3002 \\n\u540c\u65f6\u6dfb\u52a0\u975e\u6d41\u5f0f\u8d44\u6e90\u5230Src\u3002 ",qtsrc:"QT Src",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u5782\u76f4\u62c9\u5347",swstretchhalign:"\u6c34\u51c6\u62c9\u5347",swstretchstyle:"\u62c9\u5347\u6a21\u5f0f",scriptcallbacks:"\u811a\u672c\u56de\u8c03",align_top_right:"\u53f3\u4e0a",uimode:"\u5916\u89c2\u6a21\u5f0f",rate:"\u5e27\u7387",playcount:"\u64ad\u653e\u8ba1\u6570",defaultframe:"\u9ed8\u8ba4\u5e27",currentposition:"\u5f53\u524d\u4f4d\u7f6e",currentmarker:"\u5f53\u524d\u6807\u8bb0",captioningid:"Captioning id",baseurl:"\u57fa\u51c6URL",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u8fb9\u6846",stretchtofit:"\u62c9\u4f38",mute:"\u9759\u97f3",invokeurls:"\u76f8\u5173URLs",fullscreen:"\u5168\u5c4f",enabled:"\u542f\u7528",autostart:"\u81ea\u52a8\u5f00\u59cb",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"Choke speed",href:"\u8fde\u7ed3",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528JavaScript",correction:"\u6ca1\u6709\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u64ad\u653e\u6bcf\u4e00\u5e27",kioskmode:"Kiosk\u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u529f\u80fd\u8868",loop:"\u56de\u5708\u64ad\u653e",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u5782\u76f4\u95f4\u8ddd",vspace:"\u6c34\u51c6\u95f4\u8ddd",class_name:"\u7c7b\u578b",name:"\u540d\u79f0",id:"Id",type:"\u7c7b\u578b",size:"\u5c3a\u5bf8",preview:"\u9884\u89c8",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",controls:"\u63a7\u5236\u5668",numloop:"\u56de\u5708\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"\u81ea\u52a8HREF",liveconnect:"SWLiveConnect",flashvars:"\u53c2\u6570",base:"\u57fa\u5e95",bgcolor:"\u80cc\u666f\u8272",wmode:"\u89c6\u7a97\u6a21\u5f0f",salign:"SAlign",align:"\u5bf9\u9f50",scale:"\u6bd4\u4f8b",quality:"\u54c1\u8d28",shuffle:"Shuffle",prefetch:"\u9884\u8bfb\u53d6",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"\u56fe\u50cf\u72b6\u6001",center:"\u4e2d\u5fc3",autogotourl:"\u81ea\u52a8\u8f6c\u5230URL",shockwave_options:"Shockwave\u9009\u9879",rmp_options:"Real media player\u9009\u9879",wmp_options:"Windows media player\u9009\u9879",qt_options:"Quicktime\u9009\u9879",flash_options:"Flash\u9009\u9879",hidden:"\u9690\u85cf",align_bottom_left:"\u5de6\u4e0b",align_bottom_right:"\u53f3\u4e0b",flv_options:"Flash\u89c6\u9891\u9009\u9879",flv_scalemode:"Scale mode",flv_buffer:"\u7f13\u51b2",flv_startimage:"\u5f00\u59cb\u753b\u9762",flv_starttime:"\u5f00\u59cb\u65f6\u95f4",flv_defaultvolume:"\u9ed8\u8ba4\u97f3\u91cf",flv_hiddengui:"\u9690\u85cfGUI",flv_autostart:"\u81ea\u52a8\u64ad\u653e",flv_loop:"\u56de\u5708",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"\u5e73\u6ed1\u56fe\u50cf",flv_jscallback:"JS\u56de\u8c03"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/se_dlg.js b/js/tiny_mce/plugins/media/langs/se_dlg.js new file mode 100755 index 000000000..fe1755ac3 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.media_dlg',{list:"Lista",file:"Fil/URL",advanced:"Avancerat",general:"Generellt",title:"Infoga/redigera inb\u00e4ddad media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullsk\u00e4rm",enabled:"Enabled",autostart:"Starta automatiskt",volume:"Volym",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Spela varje bildruta",kioskmode:"Kiosk mode",controller:"Controller",menu:"Visa menyn",loop:"Loopa",play:"Spela upp automatiskt",hspace:"H-Space",vspace:"V-Space",class_name:"Klass",name:"Namn",id:"Id",type:"Typ",size:"Dimensioner",preview:"F\u00f6rhandsvisning",constrain_proportions:"Bibeh\u00e5ll proportionerna",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Bakgrundsf\u00e4rg",wmode:"WMode",salign:"SAlign",align:"Justera",scale:"Skala",quality:"Kvalit\u00e9",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/si_dlg.js b/js/tiny_mce/plugins/media/langs/si_dlg.js new file mode 100755 index 000000000..6ac7ae79d --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/sk_dlg.js b/js/tiny_mce/plugins/media/langs/sk_dlg.js new file mode 100755 index 000000000..176c2ebb9 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.media_dlg',{list:"Zoznam",file:"S\u00fabor/URL",advanced:"Roz\u0161\u00edren\u00e9",general:"Obecn\u00e9",title:"Vlo\u017ei\u0165/upravi\u0165 vkladan\u00e9 m\u00e9di\u00e1",align_top_left:"Hore v\u013eavo",align_center:"Na stred",align_left:"V\u013eavo",align_bottom:"Dolu",align_right:"Vpravo",align_top:"Hore",qt_stream_warn:"Streamovan\u00e9 rtsp zdroje m\u00f4\u017eu by\u0165 pridan\u00e9 do polia \'S\u00fabor/URL streamu pre QT\' na z\u00e1lo\u017eke \'Roz\u0161\u00edren\u00e9\'.\\nYM\u00f4\u017ete tie\u017e prida\u0165 nie streamovan\u00fa verziu do polia \'S\u00fabor/URL\'.",qtsrc:"S\u00fabor/URL streamu pre QT",progress:"Priebeh",sound:"Zvuk",swstretchvalign:"Zarovnanie vert. roztiahnutia",swstretchhalign:"Zarovnanie horiz. roztiahnutia",swstretchstyle:"\u0160t\u00fdl roztiahnutia",scriptcallbacks:"Skripty sp\u00e4tn\u00fdch volan\u00ed",align_top_right:"Hore vpravo",uimode:"Re\u017eim ovl\u00e1dacieho panelu",rate:"Relat\u00edvna r\u00fdchlos\u0165",playcount:"Po\u010d\u00edtadlo prehrat\u00ed",defaultframe:"Predvolen\u00fd sn\u00edmok",currentposition:"Aktu\u00e1lna poz\u00edcia",currentmarker:"Aktu\u00e1lna z\u00e1lo\u017eka",captioningid:"ID popisku m\u00e9dia",baseurl:"Z\u00e1kladn\u00e1 URL",balance:"Rovnov\u00e1ha",windowlessvideo:"Video bez okna",stretchtofit:"Roztiahn\u00fa\u0165 do okna",mute:"Uml\u010da\u0165",invokeurls:"Po\u017eadova\u0165 URL",fullscreen:"Cel\u00e1 obrazovka",enabled:"Povoli\u0165 ovl\u00e1dac\u00ed panel",autostart:"Automatick\u00e9 spustenie",volume:"Hlasitos\u0165",target:"Cie\u013e",qtsrcchokespeed:"Zn\u00ed\u017eenie r\u00fdchlosti",href:"Odkaz",endtime:"Koncov\u00fd \u010das",starttime:"Po\u010diato\u010dn\u00fd \u010das",enablejavascript:"Povoli\u0165 JavaScript",correction:"Bez korekci\u00ed",targetcache:"Cie\u013eov\u00e1 medzipam\u00e4\u0165",playeveryframe:"Prehra\u0165 ka\u017ed\u00fd sn\u00edmok",kioskmode:"Zak\u00e1za\u0165 ukladanie",controller:"Ovl\u00e1dac\u00ed panel",menu:"Zobrazi\u0165 ponuku",loop:"Opakovanie",play:"Automatick\u00e9 prehr\u00e1vanie",hspace:"Horizont\u00e1lne odsadenie",vspace:"Vertik\u00e1lne odsadenie",class_name:"Trieda",name:"N\u00e1zov",id:"ID",type:"Typ",size:"Rozmery",preview:"N\u00e1h\u013ead",constrain_proportions:"Zachova\u0165 proporcie",controls:"Ovl\u00e1dac\u00ed panel",numloop:"Po\u010det opakovan\u00ed",console:"Konzola",cache:"Medzipam\u00e4\u0165",autohref:"Automatick\u00e9 na\u010d\u00edtanie",liveconnect:"Spusti\u0165 Javu (SWLiveConnect)",flashvars:"Parametre (Flashvars)",base:"Z\u00e1kladn\u00fd prie\u010dinok",bgcolor:"Pozadie",wmode:"Re\u017eim okna",salign:"Zarovnanie okna",align:"Zarovnanie",scale:"Pomer",quality:"Kvalita",shuffle:"N\u00e1hodne",prefetch:"Predna\u010d\u00edtanie",nojava:"Nesp\u00fa\u0161\u0165a\u0165 Javu",maintainaspect:"Zachova\u0165 pomer str\u00e1n",imagestatus:"Stav obrazu",center:"Na stred",autogotourl:"Automatick\u00fd prechod na URL",shockwave_options:"Mo\u017enosti Shockwave",rmp_options:"Mo\u017enosti prehr\u00e1va\u010da Real media",wmp_options:"Mo\u017enosti prehr\u00e1va\u010da Windows media",qt_options:"Mo\u017enosti Quicktime",flash_options:"Mo\u017enosti Flashu",hidden:"Skry\u0165",align_bottom_left:"Dolu v\u013eavo",align_bottom_right:"Dolu vpravo",flv_options:"Mo\u017enosti Flash video",flv_scalemode:"Zmena ve\u013ekosti",flv_buffer:"Z\u00e1sobn\u00edk",flv_startimage:"Po\u010diato\u010dn\u00fd obr\u00e1zok",flv_starttime:"Po\u010diato\u010dn\u00fd \u010das",flv_defaultvolume:"Predvolen\u00e1 hlasitos\u0165",flv_hiddengui:"Skryt\u00fd ovl\u00e1dac\u00ed panel",flv_autostart:"Automatick\u00e9 spustenie",flv_loop:"Opakovanie",flv_showscalemodes:"Zobrazi\u0165 vo\u013eby zmeny ve\u013ekosti",flv_smoothvideo:"Vyhladzovan\u00fd obraz",flv_jscallback:"Sp\u00e4tn\u00e9 volanie JavaScriptu",html5_video_options:"Mo\u017enosti HTML5 video",altsource1:"Alternat\u00edvny zdroj 1",altsource2:"Alternat\u00edvny zdroj 2",preload:"Predna\u010d\u00edtanie",poster:"Obr\u00e1zok (zobraz\u00ed sa pri nedostupnosti videa)",source:"Zdroj"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/sl_dlg.js b/js/tiny_mce/plugins/media/langs/sl_dlg.js new file mode 100755 index 000000000..2c564aec0 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.media_dlg',{list:"Seznam",file:"Datoteka/URL",advanced:"Napredno",general:"Splo\u0161no",title:"Vstavi / uredi multimedijsko vsebino",align_top_left:"zgoraj levo",align_center:"sredina",align_left:"levo",align_bottom:"spodaj",align_right:"desno",align_top:"zgoraj",qt_stream_warn:"V polje \"QT vir\" pod zavihkom napredno, morajo biti dodani Preto\u010dni RTSP viri.nNepreto\u010dna razli\u010dica mora biti dodana v polje \"vir\".",qtsrc:"QT vir",progress:"Napredek",sound:"Zvok",swstretchvalign:"raztegni n-poravnano",swstretchhalign:"raztegni v-poravnano",swstretchstyle:"Slog raztegovanja",scriptcallbacks:"Povratni klici",align_top_right:"zgoraj desno",uimode:"Na\u010din uporabni\u0161kega vmesnika",rate:"Ocena",playcount:"\u0160tevilo predvajanj",defaultframe:"Privzeti okvir",currentposition:"Trenutni polo\u017eaj",currentmarker:"Trenutna oznaka",captioningid:"Oznaka podnapisov",baseurl:"Temeljni URL",balance:"Ravnovesje",windowlessvideo:"Video brez okna",stretchtofit:"Raz\u0161iri",mute:"Uti\u0161aj",invokeurls:"Naslovi URLje",fullscreen:"Cel zaslon",enabled:"Omogo\u010deno",autostart:"Samodejno predvajaj",volume:"Glasnost",target:"Cilj",qtsrcchokespeed:"Hitrost predpomnenja",href:"Povezava",endtime:"Kon\u010dni \u010das",starttime:"Za\u010detni \u010das",enablejavascript:"Omogo\u010di JavaScript",correction:"Brez popravkov",targetcache:"Ciljno predpomnjenje",playeveryframe:"Predvajaj vsak okvir",kioskmode:"Kiosk na\u010din",controller:"Nadzorni element",menu:"Prika\u017ei meni",loop:"Ponavljaj",play:"Samodejno predvajaj",hspace:"H-razmik",vspace:"V-razmik",class_name:"Razred",name:"Ime",id:"Id",type:"Tip",size:"Dimenzije",preview:"Predogled",constrain_proportions:"Obdr\u017ei razmerje",controls:"Nadzorni elementi",numloop:"\u0160t. zank",console:"Konzola",cache:"Predpomnjenje",autohref:"Avtomatska povezava",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Osnova",bgcolor:"Ozadje",wmode:"WM na\u010din",salign:"S-poravnava",align:"Poravnava",scale:"Stopnja pove\u010dave",quality:"Kakovost",shuffle:"Pome\u0161aj",prefetch:"Predpomnenje",nojava:"Brez Jave",maintainaspect:"Zakleni razmerje",imagestatus:"Slika stanja",center:"Sredina",autogotourl:"Samodejno na URL",shockwave_options:"Mo\u017enosti Shockwave",rmp_options:"Mo\u017enosti Real media player",wmp_options:"Mo\u017enosti Windows media player",qt_options:"Mo\u017enosti Quicktime",flash_options:"Mo\u017enosti Flash",hidden:"Skrito",align_bottom_left:"spodaj levo",align_bottom_right:"spodaj desno",flv_options:"Mo\u017enosti videa Flash",flv_scalemode:"Na\u010din pove\u010devanja",flv_buffer:"Medpomnjenje",flv_startimage:"Za\u010detna slika",flv_starttime:"Za\u010detni \u010das",flv_defaultvolume:"Privzeta glasnost",flv_hiddengui:"Skrit up. vmesnik",flv_autostart:"Samodejni zagon",flv_loop:"Zanka",flv_showscalemodes:"Prika\u017ei na\u010dine pove\u010dave",flv_smoothvideo:"Glajenje videa",flv_jscallback:"JS povratni klic",html5_video_options:"HTML5 video nastavitve",altsource1:"Alternativni vir 1",altsource2:"Alternativni vir 2",preload:"Predpomnenje",poster:"Poster",source:"Vir"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/sq_dlg.js b/js/tiny_mce/plugins/media/langs/sq_dlg.js new file mode 100755 index 000000000..878010bc4 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.media_dlg',{list:"Lista",file:"Skedari/URL",advanced:"T\u00eb Avancuara",general:"T\u00eb P\u00ebrgjithshme",title:"Fut / edito media",align_top_left:"Krye-majtas",align_center:"Qend\u00ebr",align_left:"Majtas",align_bottom:"Fund",align_right:"Djathtas",align_top:"Krye",qt_stream_warn:"Risurset rtsp duhet t\u00eb shtohen n\u00eb fush\u00ebn QT Src n\u00eb opsionet e avancuara.\\nDuhet t\u00eb shtoni gjithashtu nj\u00eb version jo stream n\u00eb fush\u00ebn src..",qtsrc:"QT Src",progress:"Progresi",sound:"Z\u00ebri",swstretchvalign:"Zmadho Drejtim-V",swstretchhalign:"Zmadho Drejtim-H",swstretchstyle:"Stili i zmadhimit",scriptcallbacks:"Script Callbacks",align_top_right:"Krye-djathtas",uimode:"M\u00ebnyra UI",rate:"Raporti",playcount:"Numri i luajtjeve",defaultframe:"Kuadri fillestar",currentposition:"Pozicioni aktual",currentmarker:"Sh\u00ebnjuesi aktual",captioningid:"Id e titullit",baseurl:"URL baz\u00eb",balance:"Balanci",windowlessvideo:"Video pa dritare",stretchtofit:"Zmadho me p\u00ebrshtatje",mute:"Mbyll z\u00ebrin",invokeurls:"Th\u00ebrrit URL",fullscreen:"Pamje e plot\u00eb",enabled:"Aktivizuar",autostart:"Nisje automatike",volume:"Volumi",target:"Sh\u00ebnjestra",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"Koha e p\u00ebrfundimit",starttime:"Koha e nisjes",enablejavascript:"Aktivizo JavaScript",correction:"Pa rregullime",targetcache:"Cache sh\u00ebnjestr\u00ebn",playeveryframe:"Luaj \u00e7do kuader",kioskmode:"M\u00ebnyra Kiosk",controller:"Kontrollues",menu:"Shfaq menu",loop:"Lak",play:"Luaj automatikisht",hspace:"Hap\u00ebsira-H",vspace:"Hap\u00ebsira-V",class_name:"Klasa",name:"Emri",id:"Id",type:"Tipi",size:"P\u00ebrmasat",preview:"Paraqitje",constrain_proportions:"Ruaj raportet",controls:"Kontrollet",numloop:"Numri lak\u00ebve",console:"Konsola",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Baza",bgcolor:"Fusha",wmode:"WMode",salign:"Drejtimi S",align:"Drejtimi",scale:"Shkalla",quality:"Cil\u00ebsia",shuffle:"Shuffle",prefetch:"Para ngarko",nojava:"Pa Java",maintainaspect:"Ruaj raportet",imagestatus:"Statusi fotos",center:"Qend\u00ebr",autogotourl:"Shko n\u00eb URL automatikisht",shockwave_options:"Opsionet e Shockwave",rmp_options:"Opsionet e Real media player",wmp_options:"Opsionet e Windows media player",qt_options:"Opsionet e Quicktime",flash_options:"Opsionet e Flash",hidden:"Fshehur",align_bottom_left:"Fund-majtas",align_bottom_right:"Fund-djathtas",flv_options:"Opsionet e videos Flash",flv_scalemode:"M\u00ebnyra e shkall\u00ebs",flv_buffer:"Buffer",flv_startimage:"Foto fillestare",flv_starttime:"Foto p\u00ebrfundimtare",flv_defaultvolume:"Volumi fillestar",flv_hiddengui:"GUI e fshehur",flv_autostart:"Nis automatikisht",flv_loop:"Lak",flv_showscalemodes:"Trego shkall\u00ebt",flv_smoothvideo:"Video pa ngecje",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/sr_dlg.js b/js/tiny_mce/plugins/media/langs/sr_dlg.js new file mode 100755 index 000000000..e65e6e2e5 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/sv_dlg.js b/js/tiny_mce/plugins/media/langs/sv_dlg.js new file mode 100755 index 000000000..0fcac5622 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.media_dlg',{list:"Lista",file:"Fil/URL",advanced:"Avancerat",general:"Generellt",title:"Infoga/redigera inb\u00e4ddad media","align_top_left":"Top left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks","align_top_right":"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullsk\u00e4rm",enabled:"Enabled",autostart:"Starta automatiskt",volume:"Volym",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Spela varje bildruta",kioskmode:"Kiosk mode",controller:"Controller",menu:"Visa menyn",loop:"Loopa",play:"Spela upp automatiskt",hspace:"H-Space",vspace:"V-Space","class_name":"Klass",name:"Namn",id:"Id",type:"Typ",size:"Dimensioner",preview:"F\u00f6rhandsvisning","constrain_proportions":"Bibeh\u00e5ll proportionerna",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Bakgrundsf\u00e4rg",wmode:"WMode",salign:"SAlign",align:"Justera",scale:"Skala",quality:"Kvalit\u00e9",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL","shockwave_options":"Shockwave options","rmp_options":"Real media player options","wmp_options":"Windows media player options","qt_options":"Quicktime options","flash_options":"Flash options",hidden:"Hidden","align_bottom_left":"Bottom left","align_bottom_right":"Bottom right","flv_options":"Flash video options","flv_scalemode":"Scale mode","flv_buffer":"Buffer","flv_startimage":"Start image","flv_starttime":"Start time","flv_defaultvolume":"Default volumne","flv_hiddengui":"Hidden GUI","flv_autostart":"Auto start","flv_loop":"Loop","flv_showscalemodes":"Show scale modes","flv_smoothvideo":"Smooth video","flv_jscallback":"JS Callback","html5_video_options":"HTML5 Filmegenskaper",altsource1:"Alternativk\u00e4lla 1",altsource2:"Alternativk\u00e4lla 2",preload:"Preload",poster:"Poster",source:"Source"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ta_dlg.js b/js/tiny_mce/plugins/media/langs/ta_dlg.js new file mode 100755 index 000000000..ee10a44ae --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/te_dlg.js b/js/tiny_mce/plugins/media/langs/te_dlg.js new file mode 100755 index 000000000..f62cf0182 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/th_dlg.js b/js/tiny_mce/plugins/media/langs/th_dlg.js new file mode 100755 index 000000000..b1eb3a92d --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.media_dlg',{list:"\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23",file:"\u0e44\u0e1f\u0e25\u0e4c/URL",advanced:"\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07",general:"\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",title:"\u0e40\u0e1e\u0e34\u0e48\u0e21 / \u0e41\u0e01\u0e49\u0e44\u0e02 \u0e21\u0e35\u0e40\u0e14\u0e35\u0e22",align_top_left:"\u0e1a\u0e19 \u0e0b\u0e49\u0e32\u0e22",align_center:"\u0e01\u0e25\u0e32\u0e07",align_left:"\u0e0b\u0e49\u0e32\u0e22",align_bottom:"\u0e25\u0e48\u0e32\u0e07",align_right:"\u0e02\u0e27\u0e32",align_top:"\u0e1a\u0e19",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"\u0e1a\u0e19 \u0e02\u0e27\u0e32",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"\u0e40\u0e25\u0e48\u0e19\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",volume:"Volume",target:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"\u0e41\u0e1c\u0e07\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21",menu:"\u0e41\u0e2a\u0e14\u0e07\u0e40\u0e21\u0e19\u0e39",loop:"\u0e40\u0e25\u0e48\u0e19\u0e0b\u0e49\u0e33",play:"\u0e40\u0e25\u0e48\u0e19\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",hspace:"\u0e23\u0e30\u0e22\u0e30\u0e2b\u0e48\u0e32\u0e07\u0e41\u0e19\u0e27\u0e19\u0e2d\u0e19",vspace:"\u0e23\u0e30\u0e22\u0e30\u0e2b\u0e48\u0e32\u0e07\u0e41\u0e19\u0e27\u0e15\u0e31\u0e49\u0e07",class_name:"\u0e04\u0e25\u0e32\u0e2a",name:"\u0e0a\u0e37\u0e48\u0e2d",id:"Id",type:"\u0e0a\u0e19\u0e34\u0e14",size:"\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07",preview:"\u0e14\u0e39\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07",constrain_proportions:"\u0e04\u0e07\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e2a\u0e48\u0e27\u0e19",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",wmode:"WMode",salign:"SAlign",align:"Align",scale:"\u0e02\u0e19\u0e32\u0e14",quality:"\u0e04\u0e27\u0e32\u0e21\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"\u0e25\u0e48\u0e32\u0e07 \u0e0b\u0e49\u0e32\u0e22",align_bottom_right:"\u0e25\u0e48\u0e32\u0e07 \u0e02\u0e27\u0e32",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/tn_dlg.js b/js/tiny_mce/plugins/media/langs/tn_dlg.js new file mode 100755 index 000000000..f6f8cf0a9 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/tr_dlg.js b/js/tiny_mce/plugins/media/langs/tr_dlg.js new file mode 100755 index 000000000..d36786bb3 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.media_dlg',{list:"Listele",file:"Dosya/URL",advanced:"Geli\u015fmi\u015f",general:"Genel",title:"T\u00fcmle\u015fik medya ekle / d\u00fczenle",align_top_left:"Sol \u00fcst",align_center:"Orta",align_left:"Sol",align_bottom:"Alt",align_right:"Sa\u011f",align_top:"\u00dcst",qt_stream_warn:"Ak\u0131\u015f rtsp kaynaklar\u0131 geli\u015fmi\u015f alt\u0131ndaki QT Kay. alan\u0131na girilmeli.\\nKay. alan\u0131na ayr\u0131ca ak\u0131\u015fkan olmayan eklenir.",qtsrc:"QT Kay.",progress:"\u0130lerle",sound:"Ses",swstretchvalign:"Esnetme D-Hiza",swstretchhalign:"Esnetme Y-Hiza",swstretchstyle:"Esnetme stili",scriptcallbacks:"Script \u00e7a\u011f\u0131r",align_top_right:"Sa\u011f \u00fcst",uimode:"UI Modu",rate:"Oran",playcount:"Oynatma say\u0131s\u0131",defaultframe:"Varsay\u0131lan \u00e7er\u00e7eve",currentposition:"Se\u00e7ili konum",currentmarker:"Se\u00e7ili i\u015faret\u00e7i",captioningid:"Ba\u015fl\u0131k id",baseurl:"Ge\u00e7erli URL",balance:"Denge",windowlessvideo:"Penceresiz video",stretchtofit:"S\u0131\u011facak \u015fekilde boyutland\u0131r",mute:"Sessiz",invokeurls:"Ba\u015flatma URL\'si",fullscreen:"Tam ekran",enabled:"Aktif",autostart:"Otomatik ba\u015flat",volume:"Ses d\u00fczeyi",target:"Hedef",qtsrcchokespeed:"S\u0131k\u0131\u015ft\u0131rma h\u0131z\u0131",href:"Href",endtime:"Biti\u015f zaman\u0131",starttime:"Ba\u015flang\u0131\u00e7 zaman\u0131",enablejavascript:"Javascript Aktif",correction:"D\u00fczeltme yok",targetcache:"Hedef \u00f6nbellek",playeveryframe:"Her \u00e7er\u00e7eveyi oynat",kioskmode:"Kiosk modu",controller:"Kontroller",menu:"Men\u00fcy\u00fc g\u00f6ster",loop:"D\u00f6nd\u00fcr",play:"Otomatik oynat",hspace:"Yatay bo\u015fluk",vspace:"Dikey bo\u015fluk",class_name:"S\u0131n\u0131f",name:"\u0130sim",id:"Id",type:"Tip",size:"Boyutlar",preview:"\u00d6nizleme",constrain_proportions:"Oran\u0131 s\u0131n\u0131rla",controls:"Kontroller",numloop:"D\u00f6ng\u00fc say\u0131s\u0131",console:"Konsol",cache:"\u00d6nbellek",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash de\u011fi\u015fkeni",base:"Taban",bgcolor:"Arkaplan",wmode:"WModu",salign:"SHizala",align:"Hizala",scale:"\u00d6l\u00e7ek",quality:"Kalite",shuffle:"Kar\u0131\u015ft\u0131r",prefetch:"\u00d6n belle\u011fe al",nojava:"Java yok",maintainaspect:"Orant\u0131y\u0131 koru",imagestatus:"Resim durumu",center:"Orta",autogotourl:"URL\'e otomatik git",shockwave_options:"Shockware se\u00e7enekleri",rmp_options:"Real media player se\u00e7enekleri",wmp_options:"Windows media player se\u00e7enekleri",qt_options:"Quicktime se\u00e7enekleri",flash_options:"Flash se\u00e7enekleri",hidden:"Gizli",align_bottom_left:"Sol alt",align_bottom_right:"Sa\u011f alt",flv_options:"Flash video se\u00e7enekleri",flv_scalemode:"\u00d6l\u00e7ek modu",flv_buffer:"Tampon",flv_startimage:"Resmi ba\u015flat",flv_starttime:"Ba\u015flang\u0131\u00e7 zaman\u0131",flv_defaultvolume:"Varsay\u0131lan ses d\u00fczeyi",flv_hiddengui:"Gizli GUI",flv_autostart:"Otomatik ba\u015flat",flv_loop:"D\u00f6nd\u00fcr",flv_showscalemodes:"\u00d6l\u00e7ek modunu g\u00f6ster",flv_smoothvideo:"D\u00fczg\u00fcn video",flv_jscallback:"JS \u00c7e\u011f\u0131r"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/tt_dlg.js b/js/tiny_mce/plugins/media/langs/tt_dlg.js new file mode 100755 index 000000000..e2374c94b --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6/\u5730\u5740",advanced:"\u9032\u968e",general:"\u57fa\u672c",title:"\u63d2\u5165/\u7de8\u8f2f \u5a92\u9ad4",align_top_left:"\u9802\u90e8\u5c45\u5de6",align_center:"\u7f6e\u4e2d",align_left:"\u5c45\u5de6",align_bottom:"\u5e95\u90e8",align_right:"\u5c45\u53f3",align_top:"\u9802\u90e8",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"\u9032\u5ea6",sound:"\u8072\u97f3",swstretchvalign:"\u7e2e\u653e\u81f3\u5782\u76f4\u5c0d\u9f4a",swstretchhalign:"\u7e2e\u653e\u81f3\u6c34\u5e73\u5c0d\u9f4a",swstretchstyle:"\u7e2e\u653e\u6a23\u5f0f",scriptcallbacks:"\u8173\u672c\u56de\u6a94",align_top_right:"\u9802\u90e8\u5c45\u53f3",uimode:"UI \u6a21\u5f0f",rate:"\u78bc\u7387",playcount:"\u64ad\u653e\u6b21\u6578",defaultframe:"\u9810\u8a2d\u683c",currentposition:"\u7576\u524d\u4f4d\u7f6e",currentmarker:"\u7576\u524d\u6a19\u7c64",captioningid:"\u5b57\u5e55 id",baseurl:"Base URL",balance:"\u5e73\u8861",windowlessvideo:"\u7121\u8996\u7a97\u5f71\u50cf",stretchtofit:"\u7e2e\u653e\u81f3\u5408\u9069\u5927\u5c0f",mute:"\u975c\u97f3",invokeurls:"\u8abf\u7528\u7684URLs",fullscreen:"\u5168\u87a2\u5e55",enabled:"\u5553\u7528",autostart:"\u81ea\u52d5\u958b\u59cb",volume:"\u97f3\u91cf",target:"\u76ee\u6a19",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"\u7d50\u675f\u6642\u9593",starttime:"\u958b\u59cb\u6642\u9593",enablejavascript:"\u5553\u7528 JavaScript",correction:"\u4fee\u6b63",targetcache:"\u76ee\u6a19\u66ab\u5b58",playeveryframe:"\u9010\u683c\u64ad\u653e",kioskmode:"Kiosk \u6a21\u5f0f",controller:"\u63a7\u5236\u81fa",menu:"\u986f\u793a\u529f\u80fd\u8868",loop:"\u8ff4\u5708",play:"\u81ea\u52d5\u64ad\u653e",hspace:"\u6c34\u5e73\u9593\u8ddd",vspace:"\u5782\u76f4\u9593\u8ddd",class_name:"\u985e\u540d",name:"\u540d\u7a31",id:"Id",type:"\u985e\u578b",size:"\u5927\u5c0f",preview:"\u9810\u89bd",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",controls:"\u63a7\u5236",numloop:"\u8ff4\u5708\u6b21\u6578",console:"\u63a7\u5236\u81fa",cache:"\u66ab\u5b58",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash\u8b8a\u6578",base:"\u57fa\u7dda",bgcolor:"\u80cc\u666f\u8272",wmode:"WMode",salign:"SAlign",align:"\u5c0d\u9f4a",scale:"\u7e2e\u653e",quality:"\u54c1\u8cea",shuffle:"\u96a8\u6a5f",prefetch:"\u9810\u8b80",nojava:"No java",maintainaspect:"\u7dad\u8b77\u72c0\u614b",imagestatus:"\u5716\u50cf\u72c0\u614b",center:"\u7f6e\u4e2d",autogotourl:"\u81ea\u52d5\u8df3\u8f49 URL",shockwave_options:"Shockwave \u9078\u9805",rmp_options:"Real media player \u9078\u9805",wmp_options:"Windows media player \u9078\u9805",qt_options:"Quicktime \u9078\u9805",flash_options:"Flash \u9078\u9805",hidden:"\u96b1\u85cf",align_bottom_left:"\u5e95\u90e8\u5c45\u5de6",align_bottom_right:"\u5e95\u90e8\u5c45\u53f3",flv_options:"Flash \u5f71\u50cf\u9078\u9805",flv_scalemode:"\u7e2e\u653e\u6a21\u5f0f",flv_buffer:"\u7de9\u885d",flv_startimage:"\u958b\u59cb\u5716\u50cf",flv_starttime:"\u958b\u59cb\u6642\u9593",flv_defaultvolume:"\u9810\u8a2d\u8072\u97f3",flv_hiddengui:"\u96b1\u85cfGUI",flv_autostart:"\u81ea\u52d5\u958b\u59cb",flv_loop:"\u8ff4\u5708",flv_showscalemodes:"\u986f\u793a\u7e2e\u653e\u6a21\u5f0f",flv_smoothvideo:"\u5e73\u6ed1\u5f71\u50cf",flv_jscallback:"JS \u56de\u6a94"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/tw_dlg.js b/js/tiny_mce/plugins/media/langs/tw_dlg.js new file mode 100755 index 000000000..fb448411b --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.media_dlg',{list:"\u5217\u8868",file:"\u5a92\u9ad4URL",advanced:"\u9032\u968e",general:"\u4e00\u822c",title:"\u63d2\u5165/\u7de8\u8f2f\u5a92\u9ad4",align_top_left:"\u5de6\u4e0a",align_center:"\u7f6e\u4e2d",align_left:"\u9760\u5de6",align_bottom:"\u9760\u4e0b",align_right:"\u9760\u53f3",align_top:"\u9760\u4e0a",qt_stream_warn:"\u4e32\u6d41\u5a92\u9ad4rtsp\u8cc7\u6e90\u61c9\u8a72\u52a0\u5230\u300c\u9032\u968e\u300d\u4e2dQT src\u3002 \\n\u540c\u6642\u589e\u52a0\u975e\u4e32\u6d41\u5a92\u9ad4\u8cc7\u6e90\u5230src\u3002",qtsrc:"QT Src",progress:"\u9032\u5ea6",sound:"\u8072\u97f3",swstretchvalign:"\u7e2e\u653e\u81f3\u5782\u76f4\u5c0d\u9f4a",swstretchhalign:"\u7e2e\u653e\u81f3\u6c34\u5e73\u5c0d\u9f4a",swstretchstyle:"\u7e2e\u653e\u6a23\u5f0f",scriptcallbacks:"Script \u547c\u53eb",align_top_right:"\u53f3\u4e0a",uimode:"\u5916\u89c0\u6a21\u5f0f",rate:"\u6bd4\u7387",playcount:"\u64ad\u653e\u6b21\u6578",defaultframe:"\u9810\u8a2d\u756b\u9762",currentposition:"\u76ee\u524d\u4f4d\u7f6e",currentmarker:"\u76ee\u524d\u6a19\u8a18",captioningid:"\u5b57\u5e55\u7de8\u865f",baseurl:"\u57fa\u5e95 URL",balance:"\u5e73\u8861",windowlessvideo:"\u7121\u8996\u7a97\u64ad\u653e",stretchtofit:"\u7e2e\u653e\u81f3\u9069\u5408\u5927\u5c0f",mute:"\u975c\u97f3",invokeurls:"\u5f15\u7528\u7684 URLs",fullscreen:"\u5168\u87a2\u5e55",enabled:"\u53ef\u7528",autostart:"\u81ea\u52d5\u64ad\u653e",volume:"\u97f3\u91cf",target:"\u76ee\u6a19",qtsrcchokespeed:"\u963b\u585e\u901f\u5ea6",href:"\u8d85\u9023\u7d50",endtime:"\u7d50\u675f\u6642\u9593",starttime:"\u958b\u59cb\u6642\u9593",enablejavascript:"\u555f\u7528 JavaScript",correction:"\u4fee\u6b63",targetcache:"\u76ee\u6a19\u66ab\u5b58",playeveryframe:"\u9010\u756b\u9762\u64ad\u653e",kioskmode:"Kiosk\u6a21\u5f0f",controller:"\u63a7\u5236\u9762\u677f",menu:"\u986f\u793a\u9078\u9805",loop:"\u5faa\u74b0",play:"\u81ea\u52d5\u64ad\u653e",hspace:"\u6c34\u5e73\u9593\u8ddd",vspace:"\u5782\u76f4\u9593\u8ddd",class_name:"\u985e\u5225",name:"\u540d\u7a31",id:"ID",type:"\u985e\u578b",size:"\u5927\u5c0f",preview:"\u9810\u89bd",constrain_proportions:"\u9396\u5b9a\u6bd4\u4f8b",controls:"\u63a7\u5236",numloop:"\u5faa\u74b0\u6b21\u6578",console:"\u63a7\u5236\u53f0",cache:"\u66ab\u5b58",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash \u8b8a\u6578",base:"\u57fa\u5e95",bgcolor:"\u80cc\u666f\u8272",wmode:"\u8996\u7a97\u6a21\u5f0f",salign:"SAlign",align:"\u5c0d\u9f4a",scale:"\u7e2e\u653e",quality:"\u54c1\u8cea",shuffle:"\u96a8\u6a5f",prefetch:"\u9810\u5148\u8f09\u5165",nojava:"No Java",maintainaspect:"\u9396\u5b9a\u6bd4\u4f8b",imagestatus:"\u5716\u7247\u72c0\u614b",center:"\u7f6e\u4e2d",autogotourl:"\u81ea\u52d5\u8f49\u81f3 URL",shockwave_options:"Shockwave \u9078\u9805",rmp_options:"Real Media Player \u9078\u9805",wmp_options:"Windows Media Player \u9078\u9805",qt_options:"Quick Time \u9078\u9805",flash_options:"Flash \u9078\u9805",hidden:"\u96b1\u85cf",align_bottom_left:"\u5de6\u4e0b",align_bottom_right:"\u53f3\u4e0b",flv_options:"Flash\u5f71\u7247\u9078\u9805",flv_scalemode:"\u7e2e\u653e\u6a21\u5f0f",flv_buffer:"\u7de9\u885d\u5340",flv_startimage:"\u958b\u59cb\u756b\u9762",flv_starttime:"\u958b\u59cb\u6642\u9593",flv_defaultvolume:"\u9810\u8a2d\u97f3\u91cf",flv_hiddengui:"\u96b1\u85cf GUI",flv_autostart:"\u81ea\u52d5\u64ad\u653e",flv_loop:"\u5faa\u74b0",flv_showscalemodes:"\u986f\u793a\u7e2e\u653e\u6a21\u5f0f",flv_smoothvideo:"\u5e73\u6ed1\u64ad\u653e",flv_jscallback:"Script \u547c\u53eb"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/uk_dlg.js b/js/tiny_mce/plugins/media/langs/uk_dlg.js new file mode 100755 index 000000000..9379de0e9 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.media_dlg',{list:"\u0421\u043f\u0438\u0441\u043e\u043a",file:"\u0424\u0430\u0439\u043b/URL",advanced:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e",general:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435",title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 / \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0432\u0431\u0443\u0434\u043e\u0432\u0430\u043d\u0456 \u043c\u0435\u0434\u0456\u0430",align_top_left:"\u0417\u0432\u0435\u0440\u0445\u0443 \u0437\u043b\u0456\u0432\u0430",align_center:"\u0426\u0435\u043d\u0442\u0440",align_left:"\u041b\u0456\u0432\u043e",align_bottom:"\u041d\u0438\u0437",align_right:"\u041f\u0440\u0430\u0432\u043e",align_top:"\u0412\u0435\u0440\u0445",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"\u0414\u0436\u0435\u0440\u0435\u043b\u043e QT",progress:"\u0425\u0456\u0434",sound:"\u0417\u0432\u0443\u043a",swstretchvalign:"\u0420\u043e\u0437\u0442\u044f\u0433\u043d\u0443\u0442\u0438 \u0432\u0435\u0440\u0442. \u0432\u0438\u0440\u0456\u0432\u043d\u044e\u0430\u043d\u043d\u044f",swstretchhalign:"\u0420\u043e\u0437\u0442\u044f\u0433\u043d\u0443\u0442\u0438 \u0433\u043e\u0440\u0438\u0437. \u0432\u0438\u0440\u0456\u0432\u043d\u044e\u0430\u043d\u043d\u044f",swstretchstyle:"\u0420\u043e\u0437\u0442\u044f\u0433\u043d\u0443\u0442\u0438\u0439 \u0441\u0442\u0438\u043b\u044c",scriptcallbacks:"\u0417\u0432\u043e\u0440\u043e\u0442\u043d\u0456\u0439 \u0432\u0438\u043a\u043b\u0438\u043a \u0441\u0446\u0435\u043d\u0430\u0440\u0456\u044e",align_top_right:"\u0417\u0432\u0435\u0440\u0445\u0443 \u0437\u043f\u0440\u0430\u0432\u0430",uimode:"\u0420\u0435\u0436\u0438\u043c \u0456\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443",rate:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c",playcount:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u0432\u0430\u043d\u044c",defaultframe:"\u041a\u0430\u0434\u0440 \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0430\u043d\u043d\u044f\u043c",currentposition:"\u041f\u043e\u0442\u043e\u0447\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0456\u044f",currentmarker:"\u041f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440",captioningid:"\u0406\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0434\u043f\u0438\u0441\u0443",baseurl:"\u041e\u0441\u043d\u043e\u0432\u043d\u0435 \u043f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f",balance:"\u0411\u0430\u043b\u0430\u043d\u0441",windowlessvideo:"Windowless video",stretchtofit:"\u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438, \u0449\u043e\u0431 \u0432\u043c\u0456\u0441\u0442\u0438\u043b\u043e\u0441\u044c",mute:"\u0417\u0430\u0433\u043b\u0443\u0448\u0438\u0442\u0438",invokeurls:"\u0412\u0438\u043a\u043b\u0438\u043a\u0430\u0442\u0438 URLs",fullscreen:"\u041f\u043e\u0432\u043d\u0438\u0439 \u0435\u043a\u0440\u0430\u043d",enabled:"\u0414\u043e\u0437\u0432\u043e\u043b\u0435\u043d\u0438\u0439",autostart:"\u0410\u0432\u0442\u043e\u0441\u0442\u0430\u0440\u0442",volume:"\u0413\u0443\u0447\u043d\u0456\u0441\u0442\u044c",target:"\u0426\u0456\u043b\u044c",qtsrcchokespeed:"\u0428\u0432\u0438\u0434\u043a\u0456\u0441\u0442\u044c \u0437\u0430\u0433\u0430\u0441\u0430\u043d\u043d\u044f",href:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f",endtime:"\u0427\u0430\u0441 \u043a\u0456\u043d\u0446\u044f",starttime:"\u0427\u0430\u0441 \u043f\u043e\u0447\u0430\u0442\u043a\u0443",enablejavascript:"\u0414\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0438 JavaScript",correction:"\u0411\u0435\u0437 \u043a\u043e\u0440\u0435\u043a\u0446\u0456\u0457",targetcache:"\u0426\u0456\u043b\u044c\u043e\u0432\u0438\u0439 \u043a\u0435\u0448",playeveryframe:"\u041f\u0440\u043e\u0433\u0440\u0430\u0432\u0430\u0442\u0438 \u043a\u043e\u0436\u0435\u043d \u043a\u0430\u0434\u0440",kioskmode:"\u041f\u043e\u0432\u043d\u043e\u0435\u043a\u0440\u0430\u043d\u043d\u0438\u0439 \u0440\u0435\u0436\u0438\u043c",controller:"\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440",menu:"\u041f\u043e\u043a\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043c\u0435\u043d\u044e",loop:"\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0432\u0430\u0442\u0438",play:"\u0410\u0432\u0442\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u0432\u043d\u043d\u044f",hspace:"\u0433\u043e\u0440.\u0432\u0456\u0434\u0441\u0442\u0443\u043f",vspace:"\u0432\u0435\u0440\u0442.\u0432\u0456\u0434\u0441\u0442\u0443\u043f",class_name:"\u041a\u043b\u0430\u0441",name:"\u041d\u0430\u0437\u0432\u0430",id:"\u0406\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u043e\u0440",type:"\u0422\u0438\u043f",size:"\u0420\u043e\u0437\u043c\u0456\u0440\u0438",preview:"\u041f\u0435\u0440\u0435\u0433\u043b\u044f\u0434",constrain_proportions:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0456\u0457",controls:"\u041a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f",numloop:"\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0456\u0432",console:"\u041a\u043e\u043d\u0441\u043e\u043b\u044c",cache:"\u041a\u0435\u0448",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438",base:"\u0411\u0430\u0437\u0430",bgcolor:"\u0424\u043e\u043d",wmode:"W-\u0440\u0435\u0436\u0438\u043c",salign:"S-\u0412\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f",align:"\u0412\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f",scale:"\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f",quality:"\u042f\u043a\u0456\u0441\u0442\u044c",shuffle:"\u041f\u0435\u0440\u0435\u0442\u0430\u0441\u0443\u0432\u0430\u0442\u0438",prefetch:"\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0454 \u0432\u0438\u043b\u0443\u0447\u0435\u043d\u043d\u044f",nojava:"\u0411\u0435\u0437 Java",maintainaspect:"\u0412\u0434\u0435\u0440\u0436\u0443\u0432\u0430\u0442\u0438 \u0440\u0430\u043a\u0443\u0440\u0441",imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",center:"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",autogotourl:"\u041f\u043e\u0441\u0438\u043b\u0430\u043d\u043d\u044f \u0430\u0432\u0442\u043e\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443",shockwave_options:"\u041e\u043f\u0446\u0456\u0457 Shockwave",rmp_options:"\u041e\u043f\u0446\u0456\u0457 Real media player",wmp_options:"\u041e\u043f\u0446\u0456\u0457 Windows media player",qt_options:"\u041e\u043f\u0446\u0456\u0457 Quicktime",flash_options:"\u041e\u043f\u0446\u0456\u0457 Flash",hidden:"\u041f\u0440\u0438\u0445\u043e\u0432\u0430\u043d\u0438\u0439",align_bottom_left:"\u0417\u043d\u0438\u0437\u0443 \u0437\u043b\u0456\u0432\u0430",align_bottom_right:"\u0417\u043d\u0438\u0437\u0443 \u0437\u043f\u0440\u0430\u0432\u0430",flv_options:"\u041e\u043f\u0446\u0456\u0457 Flash video",flv_scalemode:"\u0420\u0435\u0436\u0438\u043c \u043c\u0430\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f",flv_buffer:"\u0411\u0443\u0444\u0435\u0440",flv_startimage:"\u041f\u043e\u0447\u0430\u0442\u043a\u043e\u0432\u0435 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",flv_starttime:"\u041f\u043e\u0447\u0430\u0442\u043a\u043e\u0432\u0438\u0439 \u0447\u0430\u0441",flv_defaultvolume:"\u0413\u0443\u0447\u043d\u0456\u0441\u0442\u044c \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0430\u043d\u043d\u044f\u043c",flv_hiddengui:"\u0421\u0445\u043e\u0432\u0430\u043d\u0438\u0439 \u0433\u0440\u0430\u0444\u0456\u0447\u043d\u0438\u0439 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044c\u043a\u0438\u0439 \u0456\u043d\u0444\u0435\u0440\u0444\u0435\u0439\u0441",flv_autostart:"\u0410\u0432\u0442\u043e\u043f\u043e\u0447\u0430\u0442\u043e\u043a",flv_loop:"\u041f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u043d\u044f",flv_showscalemodes:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0436\u0438\u043c\u0438 \u043c\u0430\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043d\u043d\u044f",flv_smoothvideo:"\u041f\u043b\u0430\u0432\u043d\u0435 \u0432\u0456\u0434\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0432\u0456\u0434\u0435\u043e",flv_jscallback:"\u0417\u0432\u043e\u0440\u043e\u0442\u043d\u0456\u0439 \u0432\u0438\u043a\u043b\u0438\u043a JS"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/ur_dlg.js b/js/tiny_mce/plugins/media/langs/ur_dlg.js new file mode 100755 index 000000000..37e5eb47d --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert / edit embedded media",align_top_left:"Top left",align_center:"Center",align_left:"Left",align_bottom:"Bottom",align_right:"Right",align_top:"Top",qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\\nYou should also add a non streamed version to the Src field..",qtsrc:"QT Src",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch style",scriptcallbacks:"Script callbacks",align_top_right:"Top right",uimode:"UI Mode",rate:"Rate",playcount:"Play count",defaultframe:"Default frame",currentposition:"Current position",currentmarker:"Current marker",captioningid:"Captioning id",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless video",stretchtofit:"Stretch to fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Fullscreen",enabled:"Enabled",autostart:"Auto start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke speed",href:"Href",endtime:"End time",starttime:"Start time",enablejavascript:"Enable JavaScript",correction:"No correction",targetcache:"Target cache",playeveryframe:"Play every frame",kioskmode:"Kiosk mode",controller:"Controller",menu:"Show menu",loop:"Loop",play:"Auto play",hspace:"H-Space",vspace:"V-Space",class_name:"Class",name:"Name",id:"Id",type:"Type",size:"Dimensions",preview:"Preview",constrain_proportions:"Constrain proportions",controls:"Controls",numloop:"Num loops",console:"Console",cache:"Cache",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"Image status",center:"Center",autogotourl:"Auto goto URL",shockwave_options:"Shockwave options",rmp_options:"Real media player options",wmp_options:"Windows media player options",qt_options:"Quicktime options",flash_options:"Flash options",hidden:"Hidden",align_bottom_left:"Bottom left",align_bottom_right:"Bottom right",flv_options:"Flash video options",flv_scalemode:"Scale mode",flv_buffer:"Buffer",flv_startimage:"Start image",flv_starttime:"Start time",flv_defaultvolume:"Default volumne",flv_hiddengui:"Hidden GUI",flv_autostart:"Auto start",flv_loop:"Loop",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"Smooth video",flv_jscallback:"JS Callback"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/vi_dlg.js b/js/tiny_mce/plugins/media/langs/vi_dlg.js new file mode 100755 index 000000000..d9ecaef24 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.media_dlg',{list:"Danh s\u00e1ch",file:"T\u1eadp tin/URL",advanced:"N\u00e2ng cao",general:"Chung",title:"Ch\u00e8n / s\u1eeda ph\u01b0\u01a1ng ti\u1ec7n truy\u1ec1n th\u00f4ng nh\u00fang",align_top_left:"Tr\u00ean c\u00f9ng tr\u00e1i",align_center:"Gi\u1eefa",align_left:"Tr\u00e1i",align_bottom:"D\u01b0\u1edbi c\u00f9ng",align_right:"Ph\u1ea3i",align_top:"Tr\u00ean c\u00f9ng",qt_stream_warn:"Ngu\u1ed3n rtsp theo lu\u1ed3ng n\u00ean \u0111\u01b0\u1ee3c th\u00eam v\u00e0o tr\u01b0\u1eddng QT Src d\u01b0\u1edbi th\u1ebb n\u00e2ng cao.\\nB\u1ea1n c\u0169ng n\u00ean th\u00eam m\u1ed9t phi\u00ean b\u1ea3n kh\u00f4ng theo lu\u1ed3ng v\u00e0o tr\u01b0\u1eddng Src..",qtsrc:"QT Src",progress:"\u0110ang ti\u1ebfn tri\u1ec3n",sound:"\u00c2m thanh",swstretchvalign:"D\u00e3n theo V-Align",swstretchhalign:"D\u00e3n theo H-Align",swstretchstyle:"Ki\u1ec3u d\u00e3n",scriptcallbacks:"H\u00e0m g\u1ecdi ng\u01b0\u1ee3c Script",align_top_right:"Tr\u00ean c\u00f9ng ph\u1ea3i",uimode:"Ch\u1ebf \u0111\u1ed9 UI",rate:"T\u1ed1c \u0111\u1ed9",playcount:"\u0110\u1ebfm l\u1ea7n ph\u00e1t",defaultframe:"Khung m\u1eb7c \u0111\u1ecbnh",currentposition:"V\u1ecb tr\u00ed hi\u1ec7n th\u1eddi",currentmarker:"B\u1ed9 t\u1ea1o hi\u1ec7n th\u1eddi",captioningid:"id \u0111\u1ea7u \u0111\u1ec1",baseurl:"Base URL",balance:"C\u00e2n b\u1eb1ng",windowlessvideo:"Video kh\u00f4ng c\u1eeda s\u1ed5",stretchtofit:"D\u00e3n \u0111\u1ec3 ph\u00f9 h\u1ee3p",mute:"T\u1eaft \u00e2m thanh",invokeurls:"URL tri\u1ec7u g\u1ecdi",fullscreen:"To\u00e0n m\u00e0n h\u00ecnh",enabled:"Cho ph\u00e9p",autostart:"T\u1ef1 \u0111\u1ed9ng b\u1eaft \u0111\u1ea7u",volume:"\u00c2m l\u01b0\u1ee3ng",target:"\u0110\u00edch",qtsrcchokespeed:"T\u1ed1c \u0111\u1ed9 Choke",href:"Href",endtime:"Th\u1eddi gian k\u1ebft th\u00fac",starttime:"Th\u1eddi gian b\u1eaft \u0111\u1ea7u",enablejavascript:"Cho ph\u00e9p JavaScript",correction:"Kh\u00f4ng ch\u1ec9nh",targetcache:"B\u1ed9 nh\u1edb \u0111\u1ec7m \u0111\u00edch",playeveryframe:"Ph\u00e1t t\u1ea5t c\u1ea3 khung",kioskmode:"Ch\u1ebf \u0111\u1ed9 Kiosk",controller:"Tr\u00ecnh \u0111i\u1ec1u khi\u1ec3n",menu:"Hi\u1ec3n th\u1ecb menu",loop:"L\u1eb7p",play:"T\u1ef1 \u0111\u1ed9ng ph\u00e1t",hspace:"H-Space",vspace:"V-Space",class_name:"L\u1edbp",name:"T\u00ean",id:"Id",type:"Ki\u1ec3u",size:"K\u00edch th\u01b0\u1edbc",preview:"Xem tr\u01b0\u1edbc",constrain_proportions:"R\u00e0ng bu\u1ed9c t\u1ec9 l\u1ec7",controls:"\u0110i\u1ec1u khi\u1ec3n",numloop:"S\u1ed1 l\u1eb7p",console:"B\u00e0n \u0111i\u1ec1u khi\u1ec3n",cache:"B\u1ed9 nh\u1edb \u0111\u1ec7m",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flashvars",base:"C\u01a1 s\u1edf",bgcolor:"N\u1ec1n",wmode:"WMode",salign:"SAlign",align:"Canh l\u1ec1",scale:"T\u1ec9 l\u1ec7",quality:"Ch\u1ea5t l\u01b0\u1ee3ng",shuffle:"Kh\u00f4ng theo tr\u1eadt t\u1ef1",prefetch:"T\u00ecm n\u1ea1p tr\u01b0\u1edbc",nojava:"Kh\u00f4ng c\u00f3 java",maintainaspect:"Duy tr\u00ec c\u1ea1nh",imagestatus:"Tr\u1ea1ng th\u00e1i \u1ea3nh",center:"Gi\u1eefa",autogotourl:"T\u1ef1 \u0111\u1ed9ng nh\u1ea3y t\u1edbi URL",shockwave_options:"T\u00f9y ch\u1ecdn Shockwave",rmp_options:"T\u00f9y ch\u1ecdn tr\u00ecnh ch\u01a1i media Real",wmp_options:"T\u00f9y ch\u1ecdn tr\u00ecnh ch\u01a1i media Windows",qt_options:"T\u00f9y ch\u1ecdn Quicktime",flash_options:"T\u00f9y ch\u1ecdn Flash",hidden:"\u1ea8n",align_bottom_left:"D\u01b0\u1edbi c\u00f9ng tr\u00e1i",align_bottom_right:"D\u01b0\u1edbi c\u00f9ng ph\u1ea3i",flv_options:"T\u00f9y ch\u1ecdn video Flash",flv_scalemode:"Ch\u1ebf \u0111\u1ed9 thang",flv_buffer:"B\u1ed9 \u0111\u1ec7m",flv_startimage:"\u1ea2nh b\u1eaft \u0111\u1ea7u",flv_starttime:"Th\u1eddi gian b\u1eaft \u0111\u1ea7u",flv_defaultvolume:"\u00c2m l\u01b0\u1ee3ng m\u1eb7c \u0111\u1ecbnh",flv_hiddengui:"\u1ea8n GUI",flv_autostart:"T\u1ef1 b\u1eaft \u0111\u1ea7u",flv_loop:"L\u1eb7p",flv_showscalemodes:"Hi\u1ec3n th\u1ecb ch\u1ebf \u0111\u1ed9 thang",flv_smoothvideo:"Video m\u01b0\u1ee3t",flv_jscallback:"H\u00e0m g\u1ecdi ng\u01b0\u1ee3c JS"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/media/langs/zh-cn_dlg.js new file mode 100755 index 000000000..ee4fa6ea9 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6/URL",advanced:"\u9ad8\u7ea7",general:"\u666e\u901a",title:"\u63d2\u5165/\u7f16\u8f91 \u5d4c\u5165\u5f0f\u5a92\u4f53","align_top_left":"\u5de6\u4e0a","align_center":"\u5c45\u4e2d","align_left":"\u5c45\u5de6","align_bottom":"\u5c45\u4e0b","align_right":"\u5c45\u53f3","align_top":"\u5c45\u4e0a","qt_stream_warn":"\u6d41\u5a92\u4f53RTSP\u8d44\u6e90\u5e94\u6dfb\u52a0\u5230\u9ad8\u7ea7\u9009\u9879\u7684QT\u8d44\u6e90\u4e2d\u3002n\u540c\u65f6\uff0c\u60a8\u4e5f\u53ef\u4ee5\u5728\u8fd9\u91cc\u52a0\u5165\u4e00\u4e2a\u975e\u6d41\u5a92\u4f53\u3002",qtsrc:"QT\u8d44\u6e90",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u5782\u76f4\u62c9\u4f38",swstretchhalign:"\u6c34\u5e73\u62c9\u4f38",swstretchstyle:"\u62c9\u4f38\u65b9\u5f0f",scriptcallbacks:"\u811a\u672c\u56de\u8c03","align_top_right":"\u53f3\u4e0a",uimode:"\u5916\u89c2\u6a21\u5f0f",rate:"\u6bd4\u7387",playcount:"\u64ad\u653e\u6b21\u6570",defaultframe:"\u9ed8\u8ba4\u5e27",currentposition:"\u5f53\u524d\u4f4d\u7f6e",currentmarker:"\u5f53\u524d\u6807\u8bb0",captioningid:"\u5b57\u5e55ID",baseurl:"\u57fa\u7840\u8def\u5f84",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u8fb9\u6846",stretchtofit:"\u62c9\u4f38\u5230\u9002\u5408",mute:"\u9759\u97f3",invokeurls:"\u5f15\u7528URL",fullscreen:"\u5168\u5c4f",enabled:"\u542f\u7528",autostart:"\u81ea\u52a8\u64ad\u653e",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"\u9650\u5236\u901f\u5ea6",href:"\u8d85\u94fe\u63a5",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528JavaScript",correction:"\u65e0\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u9010\u5e27\u64ad\u653e",kioskmode:"\u5168\u5c4f\u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u83dc\u5355",loop:"\u5faa\u73af",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u6c34\u5e73\u8ddd\u79bb",vspace:"\u5782\u76f4\u8ddd\u79bb","class_name":"\u7c7b\u522b",name:"\u540d\u79f0",id:"ID",type:"\u7c7b\u578b",size:"\u5c3a\u5bf8",preview:"\u9884\u89c8","constrain_proportions":"\u4fdd\u6301\u6bd4\u4f8b",controls:"\u64ad\u653e\u63a7\u5236",numloop:"\u5faa\u73af\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"\u81ea\u52a8\u8df3\u8f6c",liveconnect:"JavaScript\u5f00\u542f",flashvars:"Flash\u53d8\u91cf",base:"\u57fa\u7840\u8def\u5f84",bgcolor:"\u80cc\u666f",wmode:"\u7a97\u4f53\u6a21\u5f0f",salign:"\u5a92\u4f53\u5bf9\u9f50",align:"\u6587\u672c\u5bf9\u9f50",scale:"\u7f29\u653e",quality:"\u753b\u8d28",shuffle:"\u968f\u673a",prefetch:"\u9884\u52a0\u8f7d",nojava:"\u65e0java",maintainaspect:"\u4fdd\u6301\u5916\u89c2",imagestatus:"\u56fe\u7247\u72b6\u6001",center:"\u5c45\u4e2d",autogotourl:"\u81ea\u52a8\u8f6c\u5230URL","shockwave_options":"Shockwave\u9009\u9879","rmp_options":"Real media player\u9009\u9879","wmp_options":"Windows media player\u9009\u9879","qt_options":"Quicktime\u9009\u9879","flash_options":"Flash\u9009\u9879",hidden:"\u9690\u85cf","align_bottom_left":"\u5de6\u4e0b","align_bottom_right":"\u53f3\u4e0b","flv_options":"FLV\u9009\u9879","flv_scalemode":"\u7f29\u653e\u6a21\u5f0f","flv_buffer":"\u7f13\u51b2","flv_startimage":"\u5f00\u59cb\u753b\u9762","flv_starttime":"\u5f00\u59cb\u65f6\u95f4","flv_defaultvolume":"\u9ed8\u8ba4\u97f3\u91cf","flv_hiddengui":"\u9690\u85cfGUI","flv_autostart":"\u81ea\u52a8\u64ad\u653e","flv_loop":"\u5faa\u73af","flv_showscalemodes":"\u663e\u793a\u7f29\u653e\u6a21\u5f0f","flv_smoothvideo":"\u6d88\u9664\u952f\u9f7f","flv_jscallback":"JS\u56de\u8c03","html5_video_options":"HTML5\u89c6\u9891\u9009\u9879",altsource1:"\u66ff\u4ee3\u8d44\u6e901",altsource2:"\u66ff\u4ee3\u8d44\u6e902",preload:"\u9884\u52a0\u8f7d",poster:"\u6d77\u62a5",source:"\u8d44\u6e90"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/zh_dlg.js b/js/tiny_mce/plugins/media/langs/zh_dlg.js new file mode 100755 index 000000000..e6700c05a --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.media_dlg',{list:"\u5217\u8868",file:"\u5a92\u4f53URL",advanced:"\u9ad8\u7ea7",general:"\u4e00\u822c",title:"\u63d2\u5165/\u7f16\u8f91\u5a92\u4f53",align_top_left:"\u5de6\u4e0a",align_center:"\u7f6e\u4e2d",align_left:"\u9760\u5de6",align_bottom:"\u9760\u4e0b",align_right:"\u9760\u53f3",align_top:"\u9760\u4e0a",qt_stream_warn:"\u4e32\u6d41\u5a92\u4f53rtsp\u8d44\u6e90\u5e94\u8be5\u52a0\u5230\u300c\u9ad8\u7ea7\u300d\u4e2dQT src\u3002 \\n\u540c\u65f6\u589e\u52a0\u975e\u4e32\u6d41\u5a92\u4f53\u8d44\u6e90\u5230src\u3002",qtsrc:"QT Src",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u7f29\u653e\u81f3\u5782\u76f4\u5bf9\u9f50",swstretchhalign:"\u7f29\u653e\u81f3\u6c34\u5e73\u5bf9\u9f50",swstretchstyle:"\u7f29\u653e\u6837\u5f0f",scriptcallbacks:"Script \u553f\u53eb",align_top_right:"\u53f3\u4e0a",uimode:"\u9762\u677f\u6a21\u5f0f",rate:"\u6bd4\u7387",playcount:"\u64ad\u653e\u6b21\u6570",defaultframe:"\u9884\u8bbe\u753b\u9762",currentposition:"\u76ee\u524d\u4f4d\u7f6e",currentmarker:"\u76ee\u524d\u6807\u8bb0",captioningid:"\u5b57\u5e55\u7f16\u53f7",baseurl:"\u57fa\u5e95 URL",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u89c6\u7a97\u64ad\u653e",stretchtofit:"\u7f29\u653e\u81f3\u6700\u4f73\u5927\u5c0f",mute:"\u9759\u97f3",invokeurls:"\u5f15\u7528\u7684 URLs",fullscreen:"\u5168\u8424\u5e55",enabled:"\u53ef\u7528",autostart:"\u81ea\u52a8\u64ad\u653e",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"\u963b\u585e\u901f\u5ea6",href:"\u8d85\u8fde\u7ed3",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528 JavaScript",correction:"\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u9010\u683c\u64ad\u653e",kioskmode:"Kiosk\u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u9009\u9879",loop:"\u5faa\u73af",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u6c34\u5e73\u95f4\u8ddd",vspace:"\u5782\u76f4\u95f4\u8ddd",class_name:"\u7c7b\u522b",name:"\u540d\u79f0",id:"ID",type:"\u7c7b\u578b",size:"\u5927\u5c0f",preview:"\u9884\u89c8",constrain_proportions:"\u7ea6\u675f\u6bd4\u4f8b",controls:"\u63a7\u5236",numloop:"\u5faa\u73af\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"AutoHREF",liveconnect:"SWLiveConnect",flashvars:"Flash \u53d8\u91cf",base:"\u57fa\u5e95",bgcolor:"\u80cc\u666f\u8272",wmode:"\u89c6\u7a97\u6a21\u5f0f",salign:"SAlign",align:"\u5bf9\u9f50",scale:"\u7f29\u653e",quality:"\u54c1\u8d28",shuffle:"\u968f\u673a",prefetch:"\u9884\u8f7d",nojava:"No Java",maintainaspect:"\u9501\u5b9a\u6bd4\u4f8b",imagestatus:"\u56fe\u7247\u72b6\u6001",center:"\u7f6e\u4e2d",autogotourl:"\u81ea\u52a8\u8f6c\u81f3 URL",shockwave_options:"Shockwave \u9009\u9879",rmp_options:"Real Media Player \u9009\u9879",wmp_options:"Windows Media Player \u9009\u9879",qt_options:"Quick Time \u9009\u9879",flash_options:"Flash \u9009\u9879",hidden:"\u9690\u85cf",align_bottom_left:"\u5de6\u4e0b",align_bottom_right:"\u53f3\u4e0b",flv_options:"Flash\u5f71\u7247\u9009\u9879",flv_scalemode:"\u7f29\u653e\u6a21\u5f0f",flv_buffer:"\u7f13\u885d\u533a",flv_startimage:"\u5f00\u59cb\u753b\u9762",flv_starttime:"\u5f00\u59cb\u65f6\u95f4",flv_defaultvolume:"\u9884\u8bbe\u97f3\u91cf",flv_hiddengui:"\u9690\u85cf GUI",flv_autostart:"\u81ea\u52a8\u64ad\u653e",flv_loop:"\u5faa\u73af",flv_showscalemodes:"\u663e\u793a\u7f29\u653e\u6a21\u5f0f",flv_smoothvideo:"\u5e73\u6ed1\u64ad\u653e",flv_jscallback:"Script \u553f\u53eb"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/langs/zu_dlg.js b/js/tiny_mce/plugins/media/langs/zu_dlg.js new file mode 100755 index 000000000..269c54f68 --- /dev/null +++ b/js/tiny_mce/plugins/media/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.media_dlg',{list:"\u5217\u8868",file:"\u6587\u4ef6/\u7f51\u5740",advanced:"\u9ad8\u7ea7",general:"\u4e00\u822c",title:"\u63d2\u5165/\u7f16\u8f91\u5d4c\u5165\u5a92\u4f53",align_top_left:"\u5de6\u4e0a",align_center:"\u4e2d\u95f4",align_left:"\u9760\u5de6",align_bottom:"\u4e0b\u65b9",align_right:"\u9760\u53f3",align_top:"\u4e0a\u65b9",qt_stream_warn:"\u6d41\u5f0frtsp\u8d44\u6e90\u5e94\u8be5\u6dfb\u52a0\u5230\u201c\u9ad8\u7ea7\u201d\u4e2dQT Src\u3002\\n\u540c\u65f6\u6dfb\u52a0\u975e\u6d41\u5f0f\u8d44\u6e90\u5230Src\u3002",qtsrc:"QT Src",progress:"\u8fdb\u5ea6",sound:"\u58f0\u97f3",swstretchvalign:"\u5782\u76f4\u62c9\u5347",swstretchhalign:"\u6c34\u51c6\u62c9\u5347",swstretchstyle:"\u62c9\u5347\u6a21\u5f0f",scriptcallbacks:"\u811a\u672c\u56de\u6863",align_top_right:"\u53f3\u4e0a",uimode:"\u9762\u677f\u6a21\u5f0f",rate:"\u5e27\u7387",playcount:"\u64ad\u653e\u8ba1\u6570",defaultframe:"\u9ed8\u8ba4\u5e27",currentposition:"\u5f53\u524d\u4f4d\u7f6e",currentmarker:"\u5f53\u524d\u6807\u8bb0",captioningid:"Captioning id",baseurl:"\u57fa\u51c6URL",balance:"\u5e73\u8861",windowlessvideo:"\u65e0\u8fb9\u6846",stretchtofit:"\u62c9\u4f38",mute:"\u9759\u97f3",invokeurls:"\u76f8\u5173URLs",fullscreen:"\u5168\u5c4f",enabled:"\u542f\u7528",autostart:"\u81ea\u52a8\u5f00\u59cb",volume:"\u97f3\u91cf",target:"\u76ee\u6807",qtsrcchokespeed:"Choke speed",href:"\u8fde\u7ed3",endtime:"\u7ed3\u675f\u65f6\u95f4",starttime:"\u5f00\u59cb\u65f6\u95f4",enablejavascript:"\u542f\u7528JavaScript",correction:"\u6ca1\u6709\u4fee\u6b63",targetcache:"\u76ee\u6807\u7f13\u5b58",playeveryframe:"\u64ad\u653e\u6bcf\u4e00\u5e27",kioskmode:"Kiosk\u6a21\u5f0f",controller:"\u63a7\u5236\u53f0",menu:"\u663e\u793a\u529f\u80fd\u8868",loop:"\u56de\u5708\u64ad\u653e",play:"\u81ea\u52a8\u64ad\u653e",hspace:"\u5782\u76f4\u95f4\u8ddd",vspace:"\u6c34\u51c6\u95f4\u8ddd",class_name:"\u7c7b\u578b",name:"\u540d\u79f0",id:"Id",type:"\u7c7b\u578b",size:"\u5c3a\u5bf8",preview:"\u9884\u89c8",constrain_proportions:"\u4fdd\u6301\u6bd4\u4f8b",controls:"\u63a7\u5236\u5668",numloop:"\u56de\u5708\u6b21\u6570",console:"\u63a7\u5236\u53f0",cache:"\u7f13\u5b58",autohref:"\u81ea\u52a8HREF",liveconnect:"SWLiveConnect",flashvars:"\u53c2\u6570",base:"\u57fa\u5e95",bgcolor:"\u80cc\u666f\u8272",wmode:"\u89c6\u7a97\u6a21\u5f0f",salign:"SAlign",align:"\u5bf9\u9f50",scale:"\u6bd4\u4f8b",quality:"\u54c1\u8d28",shuffle:"Shuffle",prefetch:"\u9884\u8bfb\u53d6",nojava:"No java",maintainaspect:"Maintain aspect",imagestatus:"\u56fe\u50cf\u72b6\u6001",center:"\u4e2d\u5fc3",autogotourl:"\u81ea\u52a8\u8f6c\u5230URL",shockwave_options:"Shockwave\u9009\u9879",rmp_options:"Real media player\u9009\u9879",wmp_options:"Windows media player\u9009\u9879",qt_options:"Quicktime\u9009\u9879",flash_options:"Flash\u9009\u9879",hidden:"\u9690\u85cf",align_bottom_left:"\u5de6\u4e0b",align_bottom_right:"\u53f3\u4e0b",flv_options:"Flash\u89c6\u9891\u9009\u9879",flv_scalemode:"Scale mode",flv_buffer:"\u7f13\u51b2",flv_startimage:"\u5f00\u59cb\u753b\u9762",flv_starttime:"\u5f00\u59cb\u65f6\u95f4",flv_defaultvolume:"\u9884\u8bbe\u97f3\u91cf",flv_hiddengui:"\u9690\u85cfGUI",flv_autostart:"\u81ea\u52a8\u64ad\u653e",flv_loop:"\u56de\u5708",flv_showscalemodes:"Show scale modes",flv_smoothvideo:"\u5e73\u6ed1\u56fe\u50cf",flv_jscallback:"JS\u56de\u6863"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/media/media.htm b/js/tiny_mce/plugins/media/media.htm new file mode 100644 index 000000000..807a537dc --- /dev/null +++ b/js/tiny_mce/plugins/media/media.htm @@ -0,0 +1,812 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#media_dlg.title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="js/media.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/validate.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <link href="css/media.css" rel="stylesheet" type="text/css" /> +</head> +<body style="display: none" role="application"> +<form onsubmit="Media.insert();return false;" action="#"> + <div class="tabs" role="presentation"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');Media.formToData();" onmousedown="return false;">{#media_dlg.general}</a></span></li> + <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');Media.formToData();" onmousedown="return false;">{#media_dlg.advanced}</a></span></li> + <li id="source_tab" aria-controls="source_panel"><span><a href="javascript:mcTabs.displayTab('source_tab','source_panel');Media.formToData('source');" onmousedown="return false;">{#media_dlg.source}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#media_dlg.general}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td><label for="media_type">{#media_dlg.type}</label></td> + <td> + <select id="media_type" name="media_type" onchange="Media.formToData('type');"> + <option value="video">HTML5 Video</option> + <option value="flash">Flash</option> + <option value="quicktime">QuickTime</option> + <option value="shockwave">Shockwave</option> + <option value="windowsmedia">Windows Media</option> + <option value="realmedia">Real Media</option> + <option value="iframe">Iframe</option> + </select> + </td> + </tr> + <tr> + <td><label for="src">{#media_dlg.file}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="src" name="src" type="text" value="" class="mceFocus" onchange="Media.formToData();" /></td> + <td id="filebrowsercontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + <tr id="linklistrow"> + <td><label for="linklist">{#media_dlg.list}</label></td> + <td id="linklistcontainer"><select id="linklist"><option value=""></option></select></td> + </tr> + <tr> + <td><label for="width">{#media_dlg.size}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="text" id="width" name="width" value="" class="size" onchange="Media.formToData('width');" onfocus="Media.beforeResize();" /> x <input type="text" id="height" name="height" value="" class="size" onfocus="Media.beforeResize();" onchange="Media.formToData('height');" /></td> + <td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" checked="checked" /></td> + <td><label id="constrainlabel" for="constrain">{#media_dlg.constrain_proportions}</label></td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> + + <fieldset> + <legend>{#media_dlg.preview}</legend> + <div id="prev"></div> + </fieldset> + </div> + + <div id="advanced_panel" class="panel"> + <fieldset> + <legend>{#media_dlg.advanced}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0" width="100%"> + <tr> + <td><label for="id">{#media_dlg.id}</label></td> + <td><input type="text" id="id" name="id" onchange="Media.formToData();" /></td> + <td><label for="name">{#media_dlg.name}</label></td> + <td><input type="text" id="name" name="name" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="align">{#media_dlg.align}</label></td> + <td> + <select id="align" name="align" onchange="Media.formToData();"> + <option value="">{#not_set}</option> + <option value="top">{#media_dlg.align_top}</option> + <option value="right">{#media_dlg.align_right}</option> + <option value="bottom">{#media_dlg.align_bottom}</option> + <option value="left">{#media_dlg.align_left}</option> + </select> + </td> + + <td><label for="bgcolor">{#media_dlg.bgcolor}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');Media.formToData();" /></td> + <td id="bgcolor_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="vspace">{#media_dlg.vspace}</label></td> + <td><input type="text" id="vspace" name="vspace" class="number" onchange="Media.formToData();" /></td> + <td><label for="hspace">{#media_dlg.hspace}</label></td> + <td><input type="text" id="hspace" name="hspace" class="number" onchange="Media.formToData();" /></td> + </tr> + </table> + </fieldset> + + <fieldset id="video_options"> + <legend>{#media_dlg.html5_video_options}</legend> + + <table role="presentation"> + <tr> + <td><label for="video_altsource1">{#media_dlg.altsource1}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="video_altsource1" name="video_altsource1" onchange="Media.formToData();" style="width: 240px" /></td> + <td id="video_altsource1_filebrowser">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="video_altsource2">{#media_dlg.altsource2}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="video_altsource2" name="video_altsource2" onchange="Media.formToData();" style="width: 240px" /></td> + <td id="video_altsource2_filebrowser">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="video_poster">{#media_dlg.poster}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="video_poster" name="video_poster" onchange="Media.formToData();" style="width: 240px" /></td> + <td id="video_poster_filebrowser">&nbsp;</td> + </tr> + </table> + </td> + </tr> + </table> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="video_autoplay" name="video_autoplay" onchange="Media.formToData();" /></td> + <td><label for="video_autoplay">{#media_dlg.play}</label></td> + </tr> + </table> + </td> + + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="video_loop" name="video_loop" onchange="Media.formToData();" /></td> + <td><label for="video_loop">{#media_dlg.loop}</label></td> + </tr> + </table> + </td> + + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="video_preload" name="video_preload" onchange="Media.formToData();" /></td> + <td><label for="video_preload">{#media_dlg.preload}</label></td> + </tr> + </table> + </td> + + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="video_controls" name="video_controls" onchange="Media.formToData();" /></td> + <td><label for="video_controls">{#media_dlg.controls}</label></td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> + + <fieldset id="flash_options"> + <legend>{#media_dlg.flash_options}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td><label for="flash_quality">{#media_dlg.quality}</label></td> + <td> + <select id="flash_quality" name="flash_quality" onchange="Media.formToData();"> + <option value="">{#not_set}</option> + <option value="high">high</option> + <option value="low">low</option> + <option value="autolow">autolow</option> + <option value="autohigh">autohigh</option> + <option value="best">best</option> + </select> + </td> + + <td><label for="flash_scale">{#media_dlg.scale}</label></td> + <td> + <select id="flash_scale" name="flash_scale" onchange="Media.formToData();"> + <option value="">{#not_set}</option> + <option value="showall">showall</option> + <option value="noborder">noborder</option> + <option value="exactfit">exactfit</option> + <option value="noscale">noscale</option> + </select> + </td> + </tr> + + <tr> + <td><label for="flash_wmode">{#media_dlg.wmode}</label></td> + <td> + <select id="flash_wmode" name="flash_wmode" onchange="Media.formToData();"> + <option value="">{#not_set}</option> + <option value="window">window</option> + <option value="opaque">opaque</option> + <option value="transparent">transparent</option> + </select> + </td> + + <td><label for="flash_salign">{#media_dlg.salign}</label></td> + <td> + <select id="flash_salign" name="flash_salign" onchange="Media.formToData();"> + <option value="">{#not_set}</option> + <option value="l">{#media_dlg.align_left}</option> + <option value="t">{#media_dlg.align_top}</option> + <option value="r">{#media_dlg.align_right}</option> + <option value="b">{#media_dlg.align_bottom}</option> + <option value="tl">{#media_dlg.align_top_left}</option> + <option value="tr">{#media_dlg.align_top_right}</option> + <option value="bl">{#media_dlg.align_bottom_left}</option> + <option value="br">{#media_dlg.align_bottom_right}</option> + </select> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="flash_play">{#media_dlg.play}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="flash_loop">{#media_dlg.loop}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="flash_menu">{#media_dlg.menu}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="Media.formToData();" /></td> + <td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td> + </tr> + </table> + </td> + </tr> + </table> + + <table role="presentation"> + <tr> + <td><label for="flash_base">{#media_dlg.base}</label></td> + <td><input type="text" id="flash_base" name="flash_base" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="flash_flashvars">{#media_dlg.flashvars}</label></td> + <td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="Media.formToData();" /></td> + </tr> + </table> + </fieldset> + + <fieldset id="quicktime_options"> + <legend>{#media_dlg.qt_options}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_loop" name="quicktime_loop" onchange="Media.formToData();" /></td> + <td><label for="quicktime_loop">{#media_dlg.loop}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_autoplay" name="quicktime_autoplay" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="quicktime_autoplay">{#media_dlg.play}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_cache" name="quicktime_cache" onchange="Media.formToData();" /></td> + <td><label for="quicktime_cache">{#media_dlg.cache}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_controller" name="quicktime_controller" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="quicktime_controller">{#media_dlg.controller}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_correction" name="quicktime_correction" onchange="Media.formToData();" /></td> + <td><label for="quicktime_correction">{#media_dlg.correction}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_enablejavascript" name="quicktime_enablejavascript" onchange="Media.formToData();" /></td> + <td><label for="quicktime_enablejavascript">{#media_dlg.enablejavascript}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_kioskmode" name="quicktime_kioskmode" onchange="Media.formToData();" /></td> + <td><label for="quicktime_kioskmode">{#media_dlg.kioskmode}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_autohref" name="quicktime_autohref" onchange="Media.formToData();" /></td> + <td><label for="quicktime_autohref">{#media_dlg.autohref}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_playeveryframe" name="quicktime_playeveryframe" onchange="Media.formToData();" /></td> + <td><label for="quicktime_playeveryframe">{#media_dlg.playeveryframe}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="quicktime_targetcache" name="quicktime_targetcache" onchange="Media.formToData();" /></td> + <td><label for="quicktime_targetcache">{#media_dlg.targetcache}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="quicktime_scale">{#media_dlg.scale}</label></td> + <td><select id="quicktime_scale" name="quicktime_scale" class="mceEditableSelect" onchange="Media.formToData();"> + <option value="">{#not_set}</option> + <option value="tofit">tofit</option> + <option value="aspect">aspect</option> + </select> + </td> + + <td colspan="2">&nbsp;</td> + </tr> + + <tr> + <td><label for="quicktime_starttime">{#media_dlg.starttime}</label></td> + <td><input type="text" id="quicktime_starttime" name="quicktime_starttime" onchange="Media.formToData();" /></td> + + <td><label for="quicktime_endtime">{#media_dlg.endtime}</label></td> + <td><input type="text" id="quicktime_endtime" name="quicktime_endtime" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="quicktime_target">{#media_dlg.target}</label></td> + <td><input type="text" id="quicktime_target" name="quicktime_target" onchange="Media.formToData();" /></td> + + <td><label for="quicktime_href">{#media_dlg.href}</label></td> + <td><input type="text" id="quicktime_href" name="quicktime_href" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="quicktime_qtsrcchokespeed">{#media_dlg.qtsrcchokespeed}</label></td> + <td><input type="text" id="quicktime_qtsrcchokespeed" name="quicktime_qtsrcchokespeed" onchange="Media.formToData();" /></td> + + <td><label for="quicktime_volume">{#media_dlg.volume}</label></td> + <td><input type="text" id="quicktime_volume" name="quicktime_volume" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="quicktime_qtsrc">{#media_dlg.qtsrc}</label></td> + <td colspan="4"> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="quicktime_qtsrc" name="quicktime_qtsrc" onchange="Media.formToData();" /></td> + <td id="qtsrcfilebrowsercontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> + + <fieldset id="windowsmedia_options"> + <legend>{#media_dlg.wmp_options}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_autostart" name="windowsmedia_autostart" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_autostart">{#media_dlg.autostart}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_enabled" name="windowsmedia_enabled" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_enabled">{#media_dlg.enabled}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_enablecontextmenu" name="windowsmedia_enablecontextmenu" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_enablecontextmenu">{#media_dlg.menu}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_fullscreen" name="windowsmedia_fullscreen" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_fullscreen">{#media_dlg.fullscreen}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_invokeurls" name="windowsmedia_invokeurls" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_invokeurls">{#media_dlg.invokeurls}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_mute" name="windowsmedia_mute" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_mute">{#media_dlg.mute}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_stretchtofit" name="windowsmedia_stretchtofit" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_stretchtofit">{#media_dlg.stretchtofit}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="windowsmedia_windowlessvideo" name="windowsmedia_windowlessvideo" onchange="Media.formToData();" /></td> + <td><label for="windowsmedia_windowlessvideo">{#media_dlg.windowlessvideo}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="windowsmedia_balance">{#media_dlg.balance}</label></td> + <td><input type="text" id="windowsmedia_balance" name="windowsmedia_balance" onchange="Media.formToData();" /></td> + + <td><label for="windowsmedia_baseurl">{#media_dlg.baseurl}</label></td> + <td><input type="text" id="windowsmedia_baseurl" name="windowsmedia_baseurl" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="windowsmedia_captioningid">{#media_dlg.captioningid}</label></td> + <td><input type="text" id="windowsmedia_captioningid" name="windowsmedia_captioningid" onchange="Media.formToData();" /></td> + + <td><label for="windowsmedia_currentmarker">{#media_dlg.currentmarker}</label></td> + <td><input type="text" id="windowsmedia_currentmarker" name="windowsmedia_currentmarker" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="windowsmedia_currentposition">{#media_dlg.currentposition}</label></td> + <td><input type="text" id="windowsmedia_currentposition" name="windowsmedia_currentposition" onchange="Media.formToData();" /></td> + + <td><label for="windowsmedia_defaultframe">{#media_dlg.defaultframe}</label></td> + <td><input type="text" id="windowsmedia_defaultframe" name="windowsmedia_defaultframe" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="windowsmedia_playcount">{#media_dlg.playcount}</label></td> + <td><input type="text" id="windowsmedia_playcount" name="windowsmedia_playcount" onchange="Media.formToData();" /></td> + + <td><label for="windowsmedia_rate">{#media_dlg.rate}</label></td> + <td><input type="text" id="windowsmedia_rate" name="windowsmedia_rate" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="windowsmedia_uimode">{#media_dlg.uimode}</label></td> + <td><input type="text" id="windowsmedia_uimode" name="windowsmedia_uimode" onchange="Media.formToData();" /></td> + + <td><label for="windowsmedia_volume">{#media_dlg.volume}</label></td> + <td><input type="text" id="windowsmedia_volume" name="windowsmedia_volume" onchange="Media.formToData();" /></td> + </tr> + + </table> + </fieldset> + + <fieldset id="realmedia_options"> + <legend>{#media_dlg.rmp_options}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_autostart" name="realmedia_autostart" onchange="Media.formToData();" /></td> + <td><label for="realmedia_autostart">{#media_dlg.autostart}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_loop" name="realmedia_loop" onchange="Media.formToData();" /></td> + <td><label for="realmedia_loop">{#media_dlg.loop}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_autogotourl" name="realmedia_autogotourl" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="realmedia_autogotourl">{#media_dlg.autogotourl}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_center" name="realmedia_center" onchange="Media.formToData();" /></td> + <td><label for="realmedia_center">{#media_dlg.center}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_imagestatus" name="realmedia_imagestatus" checked="checked" onchange="Media.formToData();" /></td> + <td><label for="realmedia_imagestatus">{#media_dlg.imagestatus}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_maintainaspect" name="realmedia_maintainaspect" onchange="Media.formToData();" /></td> + <td><label for="realmedia_maintainaspect">{#media_dlg.maintainaspect}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_nojava" name="realmedia_nojava" onchange="Media.formToData();" /></td> + <td><label for="realmedia_nojava">{#media_dlg.nojava}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_prefetch" name="realmedia_prefetch" onchange="Media.formToData();" /></td> + <td><label for="realmedia_prefetch">{#media_dlg.prefetch}</label></td> + </tr> + </table> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="realmedia_shuffle" name="realmedia_shuffle" onchange="Media.formToData();" /></td> + <td><label for="realmedia_shuffle">{#media_dlg.shuffle}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + &nbsp; + </td> + </tr> + + <tr> + <td><label for="realmedia_console">{#media_dlg.console}</label></td> + <td><input type="text" id="realmedia_console" name="realmedia_console" onchange="Media.formToData();" /></td> + + <td><label for="realmedia_controls">{#media_dlg.controls}</label></td> + <td><input type="text" id="realmedia_controls" name="realmedia_controls" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="realmedia_numloop">{#media_dlg.numloop}</label></td> + <td><input type="text" id="realmedia_numloop" name="realmedia_numloop" onchange="Media.formToData();" /></td> + + <td><label for="realmedia_scriptcallbacks">{#media_dlg.scriptcallbacks}</label></td> + <td><input type="text" id="realmedia_scriptcallbacks" name="realmedia_scriptcallbacks" onchange="Media.formToData();" /></td> + </tr> + </table> + </fieldset> + + <fieldset id="shockwave_options"> + <legend>{#media_dlg.shockwave_options}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td><label for="shockwave_swstretchstyle">{#media_dlg.swstretchstyle}</label></td> + <td> + <select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="Media.formToData();"> + <option value="none">{#not_set}</option> + <option value="meet">Meet</option> + <option value="fill">Fill</option> + <option value="stage">Stage</option> + </select> + </td> + + <td><label for="shockwave_swvolume">{#media_dlg.volume}</label></td> + <td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="Media.formToData();" /></td> + </tr> + + <tr> + <td><label for="shockwave_swstretchhalign">{#media_dlg.swstretchhalign}</label></td> + <td> + <select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="Media.formToData();"> + <option value="none">{#not_set}</option> + <option value="left">{#media_dlg.align_left}</option> + <option value="center">{#media_dlg.align_center}</option> + <option value="right">{#media_dlg.align_right}</option> + </select> + </td> + + <td><label for="shockwave_swstretchvalign">{#media_dlg.swstretchvalign}</label></td> + <td> + <select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="Media.formToData();"> + <option value="none">{#not_set}</option> + <option value="meet">Meet</option> + <option value="fill">Fill</option> + <option value="stage">Stage</option> + </select> + </td> + </tr> + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="Media.formToData();" checked="checked" /></td> + <td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="Media.formToData();" checked="checked" /></td> + <td><label for="shockwave_sound">{#media_dlg.sound}</label></td> + </tr> + </table> + </td> + </tr> + + + <tr> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="Media.formToData();" /></td> + <td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td> + </tr> + </table> + </td> + + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="Media.formToData();" checked="checked" /></td> + <td><label for="shockwave_progress">{#media_dlg.progress}</label></td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> + </div> + + <div id="source_panel" class="panel"> + <fieldset> + <legend>{#media_dlg.source}</legend> + <textarea id="source" style="width: 100%; height: 390px"></textarea> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/media/moxieplayer.swf b/js/tiny_mce/plugins/media/moxieplayer.swf new file mode 100644 index 0000000000000000000000000000000000000000..2a040358df0d1f8eb784d2ec0919626198d6eb47 GIT binary patch literal 33931 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 literal 0 HcmV?d00001 diff --git a/js/tiny_mce/plugins/pagebreak/editor_plugin.js b/js/tiny_mce/plugins/pagebreak/editor_plugin.js new file mode 100644 index 000000000..4c8e55670 --- /dev/null +++ b/js/tiny_mce/plugins/pagebreak/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='<img src="'+b.theme.url+'/img/trans.gif" class="mcePageBreak mceItemNoResize" />',a="mcePageBreak",c=b.getParam("pagebreak_separator","<!-- pagebreak -->"),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/<img[^>]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js new file mode 100644 index 000000000..1c1b17207 --- /dev/null +++ b/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js @@ -0,0 +1,74 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.PageBreakPlugin', { + init : function(ed, url) { + var pb = '<img src="' + ed.theme.url + '/img/trans.gif" class="mcePageBreak mceItemNoResize" />', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', '<!-- pagebreak -->'), pbRE; + + pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); + + // Register commands + ed.addCommand('mcePageBreak', function() { + ed.execCommand('mceInsertContent', 0, pb); + }); + + // Register buttons + ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls}); + + ed.onInit.add(function() { + if (ed.theme.onResolveName) { + ed.theme.onResolveName.add(function(th, o) { + if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls)) + o.name = 'pagebreak'; + }); + } + }); + + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls)) + ed.selection.select(e); + }); + + ed.onNodeChange.add(function(ed, cm, n) { + cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls)); + }); + + ed.onBeforeSetContent.add(function(ed, o) { + o.content = o.content.replace(pbRE, pb); + }); + + ed.onPostProcess.add(function(ed, o) { + if (o.get) + o.content = o.content.replace(/<img[^>]+>/g, function(im) { + if (im.indexOf('class="mcePageBreak') !== -1) + im = sep; + + return im; + }); + }); + }, + + getInfo : function() { + return { + longname : 'PageBreak', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/pagebreak', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/editor_plugin.js b/js/tiny_mce/plugins/paste/editor_plugin.js new file mode 100644 index 000000000..9b7cdf672 --- /dev/null +++ b/js/tiny_mce/plugins/paste/editor_plugin.js @@ -0,0 +1 @@ +(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=false;function h(m,k){var l=d.dom,i,j;f.onPreProcess.dispatch(f,m);m.node=l.create("div",0,m.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){j=l.select("p,h1,h2,h3,h4,h5,h6,pre",m.node);if(j.length==1&&m.content.indexOf("__MCE_ITEM__")===-1){l.remove(j.reverse(),true)}}}f.onPostProcess.dispatch(f,m);m.content=d.serializer.serialize(m.node,{getInner:1});if((!k)&&(d.pasteAsPlainText)){f._insertPlainText(d,l,m.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(m.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:r.replace(/\r?\n/g,"<br />")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},'\uFEFF\uFEFF<br data-mce-bogus="1">');if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort().y}o.setStyles(l,{position:"absolute",left:-10000,top:i,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,1);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="<pre>"+o.encode(r).replace(/\r?\n/g,"<br />")+"</pre>"}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}if(b(d,"paste_block_drop")){d.onInit.add(function(){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})})}f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\sphp?controller=TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\sphp?controller=TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\sphp?controller=TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g,"$1"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(k,"paste_convert_middot_lists")){d([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s&gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/&quot;/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l<d.length;l++){o=d[l];j=h.getStyle(m,o);if(j){n[o]=j;k++}}}h.setAttrib(m,"style","");if(d&&k>0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f<d){n=tinymce.inArray(m,f);o=i.getParents(h.parentNode,s);h=o[o.length-1-n]||h}}}c(i.select("span",t),function(v){var p=v.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(d){c(d,function(h){if(h.constructor==RegExp){v=v.replace(h,"")}else{v=v.replace(h[0],h[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.decode(tinymce.html.Entities.encodeRaw(v));if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"<br />"]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"</p><p>"],[/\n/g,"<br />"]])}}if((l=v.indexOf("</p><p>"))!=-1){k=v.lastIndexOf("</p><p>");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t<u;t++){p+="</"+e[t].nodeName.toLowerCase()+">";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+'<span id="_plain_text_marker">&nbsp;</span>');window.setTimeout(function(){var d=x.get("_plain_text_marker"),A,h,w,i;s.select(d,false);z.execCommand("Delete",false,null);d=null;A=s.getStart();h=x.getViewPort(n);w=x.getPos(A).y;i=A.clientHeight;if((w<h.y)||(w+i>h.y+h.h)){z.body.scrollTop=w<h.y&w:w-h.h+25}},0)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/editor_plugin_src.js b/js/tiny_mce/plugins/paste/editor_plugin_src.js new file mode 100644 index 000000000..0d26dd132 --- /dev/null +++ b/js/tiny_mce/plugins/paste/editor_plugin_src.js @@ -0,0 +1,930 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + var each = tinymce.each, + defs = { + paste_auto_cleanup_on_paste : true, + paste_enable_default_filters : true, + paste_block_drop : false, + paste_retain_style_properties : "none", + paste_strip_class_attributes : "mso", + paste_remove_spans : false, + paste_remove_styles : false, + paste_remove_styles_if_webkit : true, + paste_convert_middot_lists : true, + paste_convert_headers_to_strong : false, + paste_dialog_width : "450", + paste_dialog_height : "400", + paste_text_use_dialog : false, + paste_text_sticky : false, + paste_text_notifyalways : false, + paste_text_linebreaktype : "p", + paste_text_replacements : [ + [/\u2026/g, "..."], + [/[\x93\x94\u201c\u201d]/g, '"'], + [/[\x60\x91\x92\u2018\u2019]/g, "'"] + ] + }; + + function getParam(ed, name) { + return ed.getParam(name, defs[name]); + } + + tinymce.create('tinymce.plugins.PastePlugin', { + init : function(ed, url) { + var t = this; + + t.editor = ed; + t.url = url; + + // Setup plugin events + t.onPreProcess = new tinymce.util.Dispatcher(t); + t.onPostProcess = new tinymce.util.Dispatcher(t); + + // Register default handlers + t.onPreProcess.add(t._preProcess); + t.onPostProcess.add(t._postProcess); + + // Register optional preprocess handler + t.onPreProcess.add(function(pl, o) { + ed.execCallback('paste_preprocess', pl, o); + }); + + // Register optional postprocess + t.onPostProcess.add(function(pl, o) { + ed.execCallback('paste_postprocess', pl, o); + }); + + ed.onKeyDown.addToTop(function(ed, e) { + // Block ctrl+v from adding an undo level since the default logic in tinymce.Editor will add that + if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) + return false; // Stop other listeners + }); + + // Initialize plain text flag + ed.pasteAsPlainText = false; + + // This function executes the process handlers and inserts the contents + // force_rich overrides plain text mode set by user, important for pasting with execCommand + function process(o, force_rich) { + var dom = ed.dom, rng, nodes; + + // Execute pre process handlers + t.onPreProcess.dispatch(t, o); + + // Create DOM structure + o.node = dom.create('div', 0, o.content); + + // If pasting inside the same element and the contents is only one block + // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element + if (tinymce.isGecko) { + rng = ed.selection.getRng(true); + if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) { + nodes = dom.select('p,h1,h2,h3,h4,h5,h6,pre', o.node); + + // Is only one block node and it doesn't contain word stuff + if (nodes.length == 1 && o.content.indexOf('__MCE_ITEM__') === -1) + dom.remove(nodes.reverse(), true); + } + } + + // Execute post process handlers + t.onPostProcess.dispatch(t, o); + + // Serialize content + o.content = ed.serializer.serialize(o.node, {getInner : 1}); + + // Plain text option active? + if ((!force_rich) && (ed.pasteAsPlainText)) { + t._insertPlainText(ed, dom, o.content); + + if (!getParam(ed, "paste_text_sticky")) { + ed.pasteAsPlainText = false; + ed.controlManager.setActive("pastetext", false); + } + } else { + t._insert(o.content); + } + } + + // Add command for external usage + ed.addCommand('mceInsertClipboardContent', function(u, o) { + process(o, true); + }); + + if (!getParam(ed, "paste_text_use_dialog")) { + ed.addCommand('mcePasteText', function(u, v) { + var cookie = tinymce.util.Cookie; + + ed.pasteAsPlainText = !ed.pasteAsPlainText; + ed.controlManager.setActive('pastetext', ed.pasteAsPlainText); + + if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) { + if (getParam(ed, "paste_text_sticky")) { + ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); + } else { + ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); + } + + if (!getParam(ed, "paste_text_notifyalways")) { + cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31)) + } + } + }); + } + + ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'}); + ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'}); + + // This function grabs the contents from the clipboard by adding a + // hidden div and placing the caret inside it and after the browser paste + // is done it grabs that contents and processes that + function grabContent(e) { + var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent; + + // Check if browser supports direct plaintext access + if (e.clipboardData || dom.doc.dataTransfer) { + textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text'); + + if (ed.pasteAsPlainText) { + e.preventDefault(); + process({content : textContent.replace(/\r?\n/g, '<br />')}); + return; + } + } + + if (dom.get('_mcePaste')) + return; + + // Create container to paste into + n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF<br data-mce-bogus="1">'); + + // If contentEditable mode we need to find out the position of the closest element + if (body != ed.getDoc().body) + posY = dom.getPos(ed.selection.getStart(), body).y; + else + posY = body.scrollTop + dom.getViewPort().y; + + // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles + dom.setStyles(n, { + position : 'absolute', + left : -10000, + top : posY, + width : 1, + height : 1, + overflow : 'hidden' + }); + + if (tinymce.isIE) { + // Store away the old range + oldRng = sel.getRng(); + + // Select the container + rng = dom.doc.body.createTextRange(); + rng.moveToElementText(n); + rng.execCommand('Paste'); + + // Remove container + dom.remove(n); + + // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due + // to IE security settings so we pass the junk though better than nothing right + if (n.innerHTML === '\uFEFF') { + ed.execCommand('mcePasteWord'); + e.preventDefault(); + return; + } + + // Restore the old range and clear the contents before pasting + sel.setRng(oldRng); + sel.setContent(''); + + // For some odd reason we need to detach the the mceInsertContent call from the paste event + // It's like IE has a reference to the parent element that you paste in and the selection gets messed up + // when it tries to restore the selection + setTimeout(function() { + // Process contents + process({content : n.innerHTML}); + }, 0); + + // Block the real paste event + return tinymce.dom.Event.cancel(e); + } else { + function block(e) { + e.preventDefault(); + }; + + // Block mousedown and click to prevent selection change + dom.bind(ed.getDoc(), 'mousedown', block); + dom.bind(ed.getDoc(), 'keydown', block); + + or = ed.selection.getRng(); + + // Move caret into hidden div + n = n.firstChild; + rng = ed.getDoc().createRange(); + rng.setStart(n, 0); + rng.setEnd(n, 1); + sel.setRng(rng); + + // Wait a while and grab the pasted contents + window.setTimeout(function() { + var h = '', nl; + + // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit + if (!dom.select('div.mcePaste > div.mcePaste').length) { + nl = dom.select('div.mcePaste'); + + // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string + each(nl, function(n) { + var child = n.firstChild; + + // WebKit inserts a DIV container with lots of odd styles + if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { + dom.remove(child, 1); + } + + // Remove apply style spans + each(dom.select('span.Apple-style-span', n), function(n) { + dom.remove(n, 1); + }); + + // Remove bogus br elements + each(dom.select('br[data-mce-bogus]', n), function(n) { + dom.remove(n); + }); + + // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV + if (n.parentNode.className != 'mcePaste') + h += n.innerHTML; + }); + } else { + // Found WebKit weirdness so force the content into plain text mode + h = '<pre>' + dom.encode(textContent).replace(/\r?\n/g, '<br />') + '</pre>'; + } + + // Remove the nodes + each(dom.select('div.mcePaste'), function(n) { + dom.remove(n); + }); + + // Restore the old selection + if (or) + sel.setRng(or); + + process({content : h}); + + // Unblock events ones we got the contents + dom.unbind(ed.getDoc(), 'mousedown', block); + dom.unbind(ed.getDoc(), 'keydown', block); + }, 0); + } + } + + // Check if we should use the new auto process method + if (getParam(ed, "paste_auto_cleanup_on_paste")) { + // Is it's Opera or older FF use key handler + if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { + ed.onKeyDown.addToTop(function(ed, e) { + if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) + grabContent(e); + }); + } else { + // Grab contents on paste event on Gecko and WebKit + ed.onPaste.addToTop(function(ed, e) { + return grabContent(e); + }); + } + } + + // Block all drag/drop events + if (getParam(ed, "paste_block_drop")) { + ed.onInit.add(function() { + ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { + e.preventDefault(); + e.stopPropagation(); + + return false; + }); + }); + } + + // Add legacy support + t._legacySupport(); + }, + + getInfo : function() { + return { + longname : 'Paste text/word', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/paste', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + }, + + _preProcess : function(pl, o) { + var ed = this.editor, + h = o.content, + grep = tinymce.grep, + explode = tinymce.explode, + trim = tinymce.trim, + len, stripClass; + + //console.log('Before preprocess:' + o.content); + + function process(items) { + each(items, function(v) { + // Remove or replace + if (v.constructor == RegExp) + h = h.replace(v, ''); + else + h = h.replace(v[0], v[1]); + }); + } + + if (ed.settings.paste_enable_default_filters == false) { + return; + } + + // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser + if (tinymce.isIE && document.documentMode >= 9) + process([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g, '$1']]); + + // Detect Word content and process it more aggressive + if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { + o.wordContent = true; // Mark the pasted contents as word specific content + //console.log('Word contents detected.'); + + // Process away some basic content + process([ + /^\s*(&nbsp;)+/gi, // &nbsp; entities at the start of contents + /(&nbsp;|<br[^>]*>)+\s*$/gi // &nbsp; entities at the end of contents + ]); + + if (getParam(ed, "paste_convert_headers_to_strong")) { + h = h.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>"); + } + + if (getParam(ed, "paste_convert_middot_lists")) { + process([ + [/<!--\[if !supportLists\]-->/gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker + [/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers + [/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF) + ]); + } + + process([ + // Word comments like conditional comments etc + /<!--[\s\S]+?-->/gi, + + // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags + /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, + + // Convert <s> into <strike> for line-though + [/<(\/?)s>/gi, "<$1strike>"], + + // Replace nsbp entites to char since it's easier to handle + [/&nbsp;/gi, "\u00a0"] + ]); + + // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag. + // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot. + do { + len = h.length; + h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1"); + } while (len != h.length); + + // Remove all spans if no styles is to be retained + if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) { + h = h.replace(/<\/?span[^>]*>/gi, ""); + } else { + // We're keeping styles, so at least clean them up. + // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx + + process([ + // Convert <span style="mso-spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of same length + [/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi, + function(str, spaces) { + return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : ""; + } + ], + + // Examine all styles: delete junk, transform some, and keep the rest + [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, + function(str, tag, style) { + var n = [], + i = 0, + s = explode(trim(style).replace(/&quot;/gi, "'"), ";"); + + // Examine each style definition within the tag's style attribute + each(s, function(v) { + var name, value, + parts = explode(v, ":"); + + function ensureUnits(v) { + return v + ((v !== "0") && (/\d$/.test(v)))? "px" : ""; + } + + if (parts.length == 2) { + name = parts[0].toLowerCase(); + value = parts[1].toLowerCase(); + + // Translate certain MS Office styles into their CSS equivalents + switch (name) { + case "mso-padding-alt": + case "mso-padding-top-alt": + case "mso-padding-right-alt": + case "mso-padding-bottom-alt": + case "mso-padding-left-alt": + case "mso-margin-alt": + case "mso-margin-top-alt": + case "mso-margin-right-alt": + case "mso-margin-bottom-alt": + case "mso-margin-left-alt": + case "mso-table-layout-alt": + case "mso-height": + case "mso-width": + case "mso-vertical-align-alt": + n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value); + return; + + case "horiz-align": + n[i++] = "text-align:" + value; + return; + + case "vert-align": + n[i++] = "vertical-align:" + value; + return; + + case "font-color": + case "mso-foreground": + n[i++] = "color:" + value; + return; + + case "mso-background": + case "mso-highlight": + n[i++] = "background:" + value; + return; + + case "mso-default-height": + n[i++] = "min-height:" + ensureUnits(value); + return; + + case "mso-default-width": + n[i++] = "min-width:" + ensureUnits(value); + return; + + case "mso-padding-between-alt": + n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value); + return; + + case "text-line-through": + if ((value == "single") || (value == "double")) { + n[i++] = "text-decoration:line-through"; + } + return; + + case "mso-zero-height": + if (value == "yes") { + n[i++] = "display:none"; + } + return; + } + + // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name + if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) { + return; + } + + // If it reached this point, it must be a valid CSS style + n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case + } + }); + + // If style attribute contained any valid styles the re-write it; otherwise delete style attribute. + if (i > 0) { + return tag + ' style="' + n.join(';') + '"'; + } else { + return tag; + } + } + ] + ]); + } + } + + // Replace headers with <strong> + if (getParam(ed, "paste_convert_headers_to_strong")) { + process([ + [/<h[1-6][^>]*>/gi, "<p><strong>"], + [/<\/h[1-6][^>]*>/gi, "</strong></p>"] + ]); + } + + process([ + // Copy paste from Java like Open Office will produce this junk on FF + [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, ''] + ]); + + // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). + // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. + stripClass = getParam(ed, "paste_strip_class_attributes"); + + if (stripClass !== "none") { + function removeClasses(match, g1) { + if (stripClass === "all") + return ''; + + var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "), + function(v) { + return (/^(?!mso)/i.test(v)); + } + ); + + return cls.length ? ' class="' + cls.join(" ") + '"' : ''; + }; + + h = h.replace(/ class="([^"]+)"/gi, removeClasses); + h = h.replace(/ class=([\-\w]+)/gi, removeClasses); + } + + // Remove spans option + if (getParam(ed, "paste_remove_spans")) { + h = h.replace(/<\/?span[^>]*>/gi, ""); + } + + //console.log('After preprocess:' + h); + + o.content = h; + }, + + /** + * Various post process items. + */ + _postProcess : function(pl, o) { + var t = this, ed = t.editor, dom = ed.dom, styleProps; + + if (ed.settings.paste_enable_default_filters == false) { + return; + } + + if (o.wordContent) { + // Remove named anchors or TOC links + each(dom.select('a', o.node), function(a) { + if (!a.href || a.href.indexOf('#_Toc') != -1) + dom.remove(a, 1); + }); + + if (getParam(ed, "paste_convert_middot_lists")) { + t._convertLists(pl, o); + } + + // Process styles + styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties + + // Process only if a string was specified and not equal to "all" or "*" + if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) { + styleProps = tinymce.explode(styleProps.replace(/^none$/i, "")); + + // Retains some style properties + each(dom.select('*', o.node), function(el) { + var newStyle = {}, npc = 0, i, sp, sv; + + // Store a subset of the existing styles + if (styleProps) { + for (i = 0; i < styleProps.length; i++) { + sp = styleProps[i]; + sv = dom.getStyle(el, sp); + + if (sv) { + newStyle[sp] = sv; + npc++; + } + } + } + + // Remove all of the existing styles + dom.setAttrib(el, 'style', ''); + + if (styleProps && npc > 0) + dom.setStyles(el, newStyle); // Add back the stored subset of styles + else // Remove empty span tags that do not have class attributes + if (el.nodeName == 'SPAN' && !el.className) + dom.remove(el, true); + }); + } + } + + // Remove all style information or only specifically on WebKit to avoid the style bug on that browser + if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { + each(dom.select('*[style]', o.node), function(el) { + el.removeAttribute('style'); + el.removeAttribute('data-mce-style'); + }); + } else { + if (tinymce.isWebKit) { + // We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." /> + // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles + each(dom.select('*', o.node), function(el) { + el.removeAttribute('data-mce-style'); + }); + } + } + }, + + /** + * Converts the most common bullet and number formats in Office into a real semantic UL/LI list. + */ + _convertLists : function(pl, o) { + var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html; + + // Convert middot lists into real semantic lists + each(dom.select('p', o.node), function(p) { + var sib, val = '', type, html, idx, parents; + + // Get text node value at beginning of paragraph + for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling) + val += sib.nodeValue; + + val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/&nbsp;/g, '\u00a0'); + + // Detect unordered lists look for bullets + if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val)) + type = 'ul'; + + // Detect ordered lists 1., a. or ixv. + if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val)) + type = 'ol'; + + // Check if node value matches the list pattern: o&nbsp;&nbsp; + if (type) { + margin = parseFloat(p.style.marginLeft || 0); + + if (margin > lastMargin) + levels.push(margin); + + if (!listElm || type != lastType) { + listElm = dom.create(type); + dom.insertAfter(listElm, p); + } else { + // Nested list element + if (margin > lastMargin) { + listElm = li.appendChild(dom.create(type)); + } else if (margin < lastMargin) { + // Find parent level based on margin value + idx = tinymce.inArray(levels, margin); + parents = dom.getParents(listElm.parentNode, type); + listElm = parents[parents.length - 1 - idx] || listElm; + } + } + + // Remove middot or number spans if they exists + each(dom.select('span', p), function(span) { + var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); + + // Remove span with the middot or the number + if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html)) + dom.remove(span); + else if (/^__MCE_ITEM__[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(html)) + dom.remove(span); + }); + + html = p.innerHTML; + + // Remove middot/list items + if (type == 'ul') + html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*(&nbsp;|\u00a0)+\s*/, ''); + else + html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/, ''); + + // Create li and add paragraph data into the new li + li = listElm.appendChild(dom.create('li', 0, html)); + dom.remove(p); + + lastMargin = margin; + lastType = type; + } else + listElm = lastMargin = 0; // End list element + }); + + // Remove any left over makers + html = o.node.innerHTML; + if (html.indexOf('__MCE_ITEM__') != -1) + o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); + }, + + /** + * Inserts the specified contents at the caret position. + */ + _insert : function(h, skip_undo) { + var ed = this.editor, r = ed.selection.getRng(); + + // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells. + if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) + ed.getDoc().execCommand('Delete', false, null); + + ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo}); + }, + + /** + * Instead of the old plain text method which tried to re-create a paste operation, the + * new approach adds a plain text mode toggle switch that changes the behavior of paste. + * This function is passed the same input that the regular paste plugin produces. + * It performs additional scrubbing and produces (and inserts) the plain text. + * This approach leverages all of the great existing functionality in the paste + * plugin, and requires minimal changes to add the new functionality. + * Speednet - June 2009 + */ + _insertPlainText : function(ed, dom, h) { + var i, len, pos, rpos, node, breakElms, before, after, + w = ed.getWin(), + d = ed.getDoc(), + sel = ed.selection, + is = tinymce.is, + inArray = tinymce.inArray, + linebr = getParam(ed, "paste_text_linebreaktype"), + rl = getParam(ed, "paste_text_replacements"); + + function process(items) { + each(items, function(v) { + if (v.constructor == RegExp) + h = h.replace(v, ""); + else + h = h.replace(v[0], v[1]); + }); + }; + + if ((typeof(h) === "string") && (h.length > 0)) { + // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line + if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) { + process([ + /[\n\r]+/g + ]); + } else { + // Otherwise just get rid of carriage returns (only need linefeeds) + process([ + /\r+/g + ]); + } + + process([ + [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them + [/<br[^>]*>|<\/tr>/gi, "\n"], // Single linebreak for <br /> tags and table rows + [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], // Table cells get tabs betweem them + /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags + [/&nbsp;/gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) + [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. + [/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks + /^\s+|\s+$/g // Trim the front & back + ]); + + h = dom.decode(tinymce.html.Entities.encodeRaw(h)); + + // Delete any highlighted text before pasting + if (!sel.isCollapsed()) { + d.execCommand("Delete", false, null); + } + + // Perform default or custom replacements + if (is(rl, "array") || (is(rl, "array"))) { + process(rl); + } + else if (is(rl, "string")) { + process(new RegExp(rl, "gi")); + } + + // Treat paragraphs as specified in the config + if (linebr == "none") { + process([ + [/\n+/g, " "] + ]); + } + else if (linebr == "br") { + process([ + [/\n/g, "<br />"] + ]); + } + else { + process([ + /^\s+|\s+$/g, + [/\n\n/g, "</p><p>"], + [/\n/g, "<br />"] + ]); + } + + // This next piece of code handles the situation where we're pasting more than one paragraph of plain + // text, and we are pasting the content into the middle of a block node in the editor. The block + // node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining). + // The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the + // pasted text is prepended to "Para B". Any other paragraphs of pasted text are placed between + // "Para A" and "Para B". This code solves a host of problems with the original plain text plugin and + // now handles styles correctly. (Pasting plain text into a styled paragraph is supposed to make the + // plain text take the same style as the existing paragraph.) + if ((pos = h.indexOf("</p><p>")) != -1) { + rpos = h.lastIndexOf("</p><p>"); + node = sel.getNode(); + breakElms = []; // Get list of elements to break + + do { + if (node.nodeType == 1) { + // Don't break tables and break at body + if (node.nodeName == "TD" || node.nodeName == "BODY") { + break; + } + + breakElms[breakElms.length] = node; + } + } while (node = node.parentNode); + + // Are we in the middle of a block node? + if (breakElms.length > 0) { + before = h.substring(0, pos); + after = ""; + + for (i=0, len=breakElms.length; i<len; i++) { + before += "</" + breakElms[i].nodeName.toLowerCase() + ">"; + after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">"; + } + + if (pos == rpos) { + h = before + after + h.substring(pos+7); + } + else { + h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7); + } + } + } + + // Insert content at the caret, plus add a marker for repositioning the caret + ed.execCommand("mceInsertRawHTML", false, h + '<span id="_plain_text_marker">&nbsp;</span>'); + + // Reposition the caret to the marker, which was placed immediately after the inserted content. + // Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers. + // The second part of the code scrolls the content up if the caret is positioned off-screen. + // This is only necessary for WebKit browsers, but it doesn't hurt to use for all. + window.setTimeout(function() { + var marker = dom.get('_plain_text_marker'), + elm, vp, y, elmHeight; + + sel.select(marker, false); + d.execCommand("Delete", false, null); + marker = null; + + // Get element, position and height + elm = sel.getStart(); + vp = dom.getViewPort(w); + y = dom.getPos(elm).y; + elmHeight = elm.clientHeight; + + // Is element within viewport if not then scroll it into view + if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) { + d.body.scrollTop = y < vp.y ? y : y - vp.h + 25; + } + }, 0); + } + }, + + /** + * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine. + */ + _legacySupport : function() { + var t = this, ed = t.editor; + + // Register command(s) for backwards compatibility + ed.addCommand("mcePasteWord", function() { + ed.windowManager.open({ + file: t.url + "/pasteword.htm", + width: parseInt(getParam(ed, "paste_dialog_width")), + height: parseInt(getParam(ed, "paste_dialog_height")), + inline: 1 + }); + }); + + if (getParam(ed, "paste_text_use_dialog")) { + ed.addCommand("mcePasteText", function() { + ed.windowManager.open({ + file : t.url + "/pastetext.htm", + width: parseInt(getParam(ed, "paste_dialog_width")), + height: parseInt(getParam(ed, "paste_dialog_height")), + inline : 1 + }); + }); + } + + // Register button for backwards compatibility + ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"}); + } + }); + + // Register plugin + tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin); +})(); diff --git a/js/tiny_mce/plugins/paste/js/pastetext.js b/js/tiny_mce/plugins/paste/js/pastetext.js new file mode 100644 index 000000000..81b1d6a01 --- /dev/null +++ b/js/tiny_mce/plugins/paste/js/pastetext.js @@ -0,0 +1,36 @@ +tinyMCEPopup.requireLangPack(); + +var PasteTextDialog = { + init : function() { + this.resize(); + }, + + insert : function() { + var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines; + + // Convert linebreaks into paragraphs + if (document.getElementById('linebreaks').checked) { + lines = h.split(/\r?\n/); + if (lines.length > 1) { + h = ''; + tinymce.each(lines, function(row) { + h += '<p>' + row + '</p>'; + }); + } + } + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('content'); + + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } +}; + +tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); diff --git a/js/tiny_mce/plugins/paste/js/pasteword.js b/js/tiny_mce/plugins/paste/js/pasteword.js new file mode 100644 index 000000000..959bf3992 --- /dev/null +++ b/js/tiny_mce/plugins/paste/js/pasteword.js @@ -0,0 +1,51 @@ +tinyMCEPopup.requireLangPack(); + +var PasteWordDialog = { + init : function() { + var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; + + // Create iframe + el.innerHTML = '<iframe id="iframe" src="javascript:\'\';" frameBorder="0" style="border: 1px solid gray"></iframe>'; + ifr = document.getElementById('iframe'); + doc = ifr.contentWindow.document; + + // Force absolute CSS urls + css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; + css = css.concat(tinymce.explode(ed.settings.content_css) || []); + tinymce.each(css, function(u) { + cssHTML += '<link href="' + ed.documentBaseURI.toAbsolute('' + u) + '" rel="stylesheet" type="text/css" />'; + }); + + // Write content into iframe + doc.open(); + doc.write('<html><head>' + cssHTML + '</head><body class="mceContentBody" spellcheck="false"></body></html>'); + doc.close(); + + doc.designMode = 'on'; + this.resize(); + + window.setTimeout(function() { + ifr.contentWindow.focus(); + }, 10); + }, + + insert : function() { + var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('iframe'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } + } +}; + +tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); diff --git a/js/tiny_mce/plugins/paste/langs/ar_dlg.js b/js/tiny_mce/plugins/paste/langs/ar_dlg.js new file mode 100755 index 000000000..a5d0c9ed5 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.paste_dlg',{word_title:"\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0639\u0644\u0649 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d \u0644\u0644\u0635\u0642 \u0627\u0644\u0646\u0635 \u0641\u064a \u0627\u0644\u0625\u0637\u0627\u0631.( CTRL+V )",text_linebreaks:"\u0627\u062d\u062a\u0641\u0638 \u0628\u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0623\u0633\u0637\u0631",text_title:"\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0639\u0644\u0649 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d \u0644\u0644\u0635\u0642 \u0627\u0644\u0646\u0635 \u0641\u064a \u0627\u0644\u0625\u0637\u0627\u0631.( CTRL+V )"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/az_dlg.js b/js/tiny_mce/plugins/paste/langs/az_dlg.js new file mode 100755 index 000000000..8371ae1e0 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.paste_dlg',{word_title:"P\u0259nc\u0259r\u0259y\u0259 s\u00f6z \u0259lav\u0259 etm\u0259k \u00fc\u00e7\u00fcn CTRL+V klavi\u015f birl\u0259\u015fm\u0259sini istifad\u0259 edin.",text_linebreaks:"S\u0259tr s\u0131nmalar\u0131n\u0131 saxla",text_title:"P\u0259nc\u0259r\u0259y\u0259 m\u0259tn \u0259lav\u0259 etm\u0259k \u00fc\u00e7\u00fcn CTRL+V klavi\u015f birl\u0259\u015fm\u0259sini istifad\u0259 edin."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/be_dlg.js b/js/tiny_mce/plugins/paste/langs/be_dlg.js new file mode 100755 index 000000000..63d134b09 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.paste_dlg',{word_title:"\u0412\u044b\u043a\u0430\u0440\u044b\u0441\u0442\u0430\u0439\u0446\u0435 \u0441\u043f\u0430\u043b\u0443\u0447\u044d\u043d\u043d\u0435 \u043a\u043b\u0430\u0432\u0456\u0448 CTRL+V \u043a\u0430\u0431 \u0443\u0441\u0442\u0430\u0432\u0456\u0446\u044c \u0442\u044d\u043a\u0441\u0442 \u0443 \u0430\u043a\u043d\u043e.",text_linebreaks:"\u0417\u0430\u0445\u043e\u045e\u0432\u0430\u0446\u044c \u043f\u0430\u0440\u044b\u0432\u044b \u0440\u0430\u0434\u043a\u043e\u045e",text_title:"\u0412\u044b\u043a\u0430\u0440\u044b\u0441\u0442\u0430\u0439\u0446\u0435 \u0441\u043f\u0430\u043b\u0443\u0447\u044d\u043d\u043d\u0435 \u043a\u043b\u0430\u0432\u0456\u0448 CTRL+V \u043a\u0430\u0431 \u0443\u0441\u0442\u0430\u0432\u0456\u0446\u044c \u0442\u044d\u043a\u0441\u0442 \u0443 \u0430\u043a\u043d\u043e."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/bg_dlg.js b/js/tiny_mce/plugins/paste/langs/bg_dlg.js new file mode 100755 index 000000000..2761efa81 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.paste_dlg',{word_title:"\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 CTRL+V \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430 \u0437\u0430 \u0434\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430.",text_linebreaks:"\u0417\u0430\u043f\u0430\u0437\u0438 \u043d\u043e\u0432\u0438\u0442\u0435 \u0440\u0435\u0434\u043e\u0432\u0435",text_title:"\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 CTRL+V \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430 \u0437\u0430 \u0434\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446\u0430."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/bn_dlg.js b/js/tiny_mce/plugins/paste/langs/bn_dlg.js new file mode 100755 index 000000000..592080db9 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.paste_dlg',{"word_title":"Use CTRL+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/br_dlg.js b/js/tiny_mce/plugins/paste/langs/br_dlg.js new file mode 100755 index 000000000..679cd6c52 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.paste_dlg',{word_title:"Use CTRL+V para colar o texto na janela.",text_linebreaks:"Manter quebras de linha",text_title:"Use CTRL+V para colar o texto na janela."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/bs_dlg.js b/js/tiny_mce/plugins/paste/langs/bs_dlg.js new file mode 100755 index 000000000..51ae381f2 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.paste_dlg',{word_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor.",text_linebreaks:"Zadr\u017ei prijelome",text_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ca_dlg.js b/js/tiny_mce/plugins/paste/langs/ca_dlg.js new file mode 100755 index 000000000..ac180fb11 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.paste_dlg',{"word_title":"Amb el teclat utilitzeu CTRL+V per a enganxar el text dins la finestra.","text_linebreaks":"Conserva els salts de l\u00ednia","text_title":"Amb el teclat utilitzeu CTRL+V per a enganxar el text dins la finestra."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ch_dlg.js b/js/tiny_mce/plugins/paste/langs/ch_dlg.js new file mode 100755 index 000000000..1762781c0 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.paste_dlg',{word_title:"\u7528 Ctrl+V \u5c06\u5185\u5bb9\u8d34\u4e0a\u3002",text_linebreaks:"\u4fdd\u7559\u5206\u884c\u7b26\u53f7",text_title:"\u7528 Ctrl+V \u5c06\u5185\u5bb9\u8d34\u4e0a\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/cn_dlg.js b/js/tiny_mce/plugins/paste/langs/cn_dlg.js new file mode 100755 index 000000000..274905a94 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.paste_dlg',{"word_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u5185\u5bb9","text_linebreaks":"\u4fdd\u7559\u5206\u884c\u7b26\u53f7","text_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u5185\u5bb9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/cs_dlg.js b/js/tiny_mce/plugins/paste/langs/cs_dlg.js new file mode 100755 index 000000000..104458b93 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.paste_dlg',{word_title:"Pou\u017eijte CTRL+V pro vlo\u017een\u00ed textu do okna.",text_linebreaks:"Zachovat zalamov\u00e1n\u00ed \u0159\u00e1dk\u016f",text_title:"Pou\u017eijte CTRL+V pro vlo\u017een\u00ed textu do okna."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/cy_dlg.js b/js/tiny_mce/plugins/paste/langs/cy_dlg.js new file mode 100755 index 000000000..c7b6ac74f --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.paste_dlg',{word_title:"Defnyddiwch CTRL+V ar eich bysellfwrdd i ludo\'r testun i fewn i\'r ffenest.",text_linebreaks:"Cadw toriadau llinell",text_title:"Defnyddiwch CTRL+V ar eich bysellfwrdd i ludo\'r testun i fewn i\'r ffenest."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/da_dlg.js b/js/tiny_mce/plugins/paste/langs/da_dlg.js new file mode 100755 index 000000000..e5c175d30 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.paste_dlg',{word_title:"Anvend CTRL+V p\u00e5 tastaturet for at inds\u00e6tte teksten.",text_linebreaks:"Bevar linieskift",text_title:"Anvend CTRL+V p\u00e5 tastaturet for at inds\u00e6tte teksten."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/de_dlg.js b/js/tiny_mce/plugins/paste/langs/de_dlg.js new file mode 100755 index 000000000..316384588 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.paste_dlg',{word_title:"Dr\u00fccken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00fcgen.",text_linebreaks:"Zeilenumbr\u00fcche beibehalten",text_title:"Dr\u00fccken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00fcgen."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/dv_dlg.js b/js/tiny_mce/plugins/paste/langs/dv_dlg.js new file mode 100755 index 000000000..250d9b953 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/el_dlg.js b/js/tiny_mce/plugins/paste/langs/el_dlg.js new file mode 100755 index 000000000..0ca1903b0 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.paste_dlg',{word_title:"\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 CTRL+V \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf.",text_linebreaks:"\u039d\u03b1 \u03ba\u03c1\u03b1\u03c4\u03b7\u03b8\u03bf\u03cd\u03bd \u03c4\u03b1 linebreaks",text_title:"\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 CTRL+V \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/en_dlg.js b/js/tiny_mce/plugins/paste/langs/en_dlg.js new file mode 100644 index 000000000..ad41eb95b --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use CTRL+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/es_dlg.js b/js/tiny_mce/plugins/paste/langs/es_dlg.js new file mode 100755 index 000000000..82d8dc278 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.paste_dlg',{"word_title":"Use CTRL+V en su teclado para pegar el texto en la ventana.","text_linebreaks":"Keep linebreaks","text_title":"Use CTRL+V en su teclado para pegar el texto en la ventana."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/et_dlg.js b/js/tiny_mce/plugins/paste/langs/et_dlg.js new file mode 100755 index 000000000..c9a4fa90e --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.paste_dlg',{word_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks.",text_linebreaks:"J\u00e4ta reavahetused",text_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/eu_dlg.js b/js/tiny_mce/plugins/paste/langs/eu_dlg.js new file mode 100755 index 000000000..cd54c8d0a --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.paste_dlg',{word_title:"Erabili CTRL+V testua lehioan itsasteko.",text_linebreaks:"Mantendu lerro-jauziak",text_title:"Erabili CTRL+V testua lehioan itsasteko."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/fa_dlg.js b/js/tiny_mce/plugins/paste/langs/fa_dlg.js new file mode 100755 index 000000000..c555ac8ea --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.paste_dlg',{word_title:"\u062c\u0647\u062a \u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u0645\u062a\u0646 \u062f\u0631 \u067e\u0646\u062c\u0631\u0647 \u0627\u0632 CTRL+V \u0628\u0631 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u06a9\u0644\u06cc\u062f \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u0627\u0626\u06cc\u062f.",text_linebreaks:"\u062d\u0641\u0638 \u0642\u0637\u0639 \u062e\u0637\u0648\u0637",text_title:"\u062c\u0647\u062a \u0686\u0633\u0628\u0627\u0646\u062f\u0646 \u0645\u062a\u0646 \u062f\u0631 \u067e\u0646\u062c\u0631\u0647 \u0627\u0632 CTRL+V \u0628\u0631 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u06a9\u0644\u06cc\u062f \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u0627\u0626\u06cc\u062f."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/fi_dlg.js b/js/tiny_mce/plugins/paste/langs/fi_dlg.js new file mode 100755 index 000000000..d4e2b284f --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.paste_dlg',{word_title:"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan.",text_linebreaks:"S\u00e4ilyt\u00e4 rivinvaihdot",text_title:"Paina Ctrl+V liitt\u00e4\u00e4ksesi sis\u00e4ll\u00f6n ikkunaan."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/fr_dlg.js b/js/tiny_mce/plugins/paste/langs/fr_dlg.js new file mode 100755 index 000000000..1431de182 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.paste_dlg',{word_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre.",text_linebreaks:"Conserver les retours \u00e0 la ligne",text_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/gl_dlg.js b/js/tiny_mce/plugins/paste/langs/gl_dlg.js new file mode 100755 index 000000000..4c4bcb61d --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.paste_dlg',{word_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00e1.",text_linebreaks:"Manter salto de li\u00f1as",text_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00e1."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/gu_dlg.js b/js/tiny_mce/plugins/paste/langs/gu_dlg.js new file mode 100755 index 000000000..c8a537d0d --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/he_dlg.js b/js/tiny_mce/plugins/paste/langs/he_dlg.js new file mode 100755 index 000000000..e69c41565 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.paste_dlg',{word_title:"\u05d4\u05d3\u05d1\u05d9\u05e7\u05d5 \u05d1\u05d7\u05dc\u05d5\u05df \u05d6\u05d4 \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05de\u05e7\u05e9\u05d9\u05dd CTRL+V.",text_linebreaks:"\u05d4\u05e9\u05d0\u05e8 \u05d0\u05ea \u05e9\u05d5\u05e8\u05d5\u05ea \u05d4\u05e8\u05d5\u05d5\u05d7",text_title:"\u05d4\u05d3\u05d1\u05d9\u05e7\u05d5 \u05d1\u05d7\u05dc\u05d5\u05df \u05d6\u05d4 \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05de\u05e7\u05e9\u05d9\u05dd CTRL+V."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/hi_dlg.js b/js/tiny_mce/plugins/paste/langs/hi_dlg.js new file mode 100755 index 000000000..6a6a903f2 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/hr_dlg.js b/js/tiny_mce/plugins/paste/langs/hr_dlg.js new file mode 100755 index 000000000..a1dbefe79 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.paste_dlg',{word_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor.",text_linebreaks:"Zadr\u017ei prijelome",text_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/hu_dlg.js b/js/tiny_mce/plugins/paste/langs/hu_dlg.js new file mode 100755 index 000000000..7f4fb7e7b --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.paste_dlg',{"word_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez.","text_linebreaks":"Sort\u00f6r\u00e9sek megtart\u00e1sa","text_title":"Haszn\u00e1lja a Ctrl+V-t a billenty\u0171zet\u00e9n a beilleszt\u00e9shez."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/hy_dlg.js b/js/tiny_mce/plugins/paste/langs/hy_dlg.js new file mode 100755 index 000000000..7bfd0adb2 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.paste_dlg',{word_title:"\u0555\u0563\u057f\u0561\u0563\u0578\u0580\u056e\u0565\u0584 CTRL + V \u057a\u0561\u057f\u0573\u0565\u0576\u057e\u0561\u056e \u057f\u0565\u0584\u057d\u057f\u056b \u057f\u0565\u0572\u0561\u0564\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580",text_linebreaks:"\u054a\u0561\u0570\u057a\u0561\u0576\u0565\u056c \u057f\u0578\u0572\u0561\u0564\u0561\u0580\u0571\u0565\u0580\u0568",text_title:"\u0555\u0563\u057f\u0561\u0563\u0578\u0580\u056e\u0565\u0584 CTRL + V \u057a\u0561\u057f\u0573\u0565\u0576\u057e\u0561\u056e \u057f\u0565\u0584\u057d\u057f\u056b \u057f\u0565\u0572\u0561\u0564\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ia_dlg.js b/js/tiny_mce/plugins/paste/langs/ia_dlg.js new file mode 100755 index 000000000..b7906e916 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.paste_dlg',{word_title:"\u5c06\u590d\u5236(CTRL + C)\u7684\u5185\u5bb9\u7c98\u8d34(CTRL + V)\u5230\u7a97\u53e3\u3002",text_linebreaks:"\u4fdd\u7559\u5206\u884c\u7b26\u53f7\u53f7",text_title:"\u5c06\u590d\u5236(CTRL + C)\u7684\u5185\u5bb9\u7c98\u8d34(CTRL + V)\u5230\u7a97\u53e3\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/id_dlg.js b/js/tiny_mce/plugins/paste/langs/id_dlg.js new file mode 100755 index 000000000..316ad15cc --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.paste_dlg',{word_title:"Gunakan CTRL+V pada keyboard untuk paste.",text_linebreaks:"Keep linebreaks",text_title:"Gunakan CTRL+V pada keyboard untuk paste."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ii_dlg.js b/js/tiny_mce/plugins/paste/langs/ii_dlg.js new file mode 100755 index 000000000..13ebf0abf --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ii_dlg.js @@ -0,0 +1,5 @@ +tinyMCE.addI18n('ii.paste_dlg',{ +text_title:"\u5728\u952E\u76D8\u4E0A\u540C\u65F6\u6309\u4E0BCTRL\u548CV\u952E\uFF0C\u4EE5\u7C98\u8D34\u6587\u5B57\u5230\u6B64\u7A97\u53E3\u3002", +text_linebreaks:"\u4FDD\u7559\u5206\u884C\u7B26\u53F7\u53F7", +word_title:"\u5728\u952E\u76D8\u4E0A\u540C\u65F6\u6309\u4E0BCTRL\u548CV\u952E\uFF0C\u4EE5\u7C98\u8D34\u6587\u5B57\u5230\u6B64\u7A97\u53E3\u3002" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/is_dlg.js b/js/tiny_mce/plugins/paste/langs/is_dlg.js new file mode 100755 index 000000000..a0e80907f --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.paste_dlg',{word_title:"Nota\u00f0u CTRL+V \u00e1 lyklabo\u00f0rinu til a\u00f0 l\u00edma textanum \u00ed ritilinn.",text_linebreaks:"Halda endingu l\u00edna",text_title:"Nota\u00f0u CTRL+V \u00e1 lyklabor\u00f0inu til a\u00f0 l\u00edma textanum \u00ed ritilinn."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/it_dlg.js b/js/tiny_mce/plugins/paste/langs/it_dlg.js new file mode 100755 index 000000000..70da57811 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.paste_dlg',{word_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra.",text_linebreaks:"Mantieni interruzioni di riga",text_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ja_dlg.js b/js/tiny_mce/plugins/paste/langs/ja_dlg.js new file mode 100755 index 000000000..77ec5302c --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.paste_dlg',{"word_title":"Ctrl+V(\u30ad\u30fc\u30dc\u30fc\u30c9)\u3067\u30c6\u30ad\u30b9\u30c8\u3092\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002","text_linebreaks":"\u6539\u884c\u3092\u4fdd\u6301\u3059\u308b","text_title":"Ctrl+V(\u30ad\u30fc\u30dc\u30fc\u30c9)\u3067\u30c6\u30ad\u30b9\u30c8\u3092\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ka_dlg.js b/js/tiny_mce/plugins/paste/langs/ka_dlg.js new file mode 100755 index 000000000..d0a6b0383 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.paste_dlg',{word_title:"\u0418\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10e9\u10d0\u10e1\u10d0\u10e1\u10db\u10d4\u10da\u10d0\u10d3 \u10d2\u10d0\u10db\u10dd\u10d8\u10e7\u10d4\u10dc\u10d4\u10d7 \u10d9\u10da\u10d0\u10d5\u10d8\u10d0\u10e2\u10e3\u10e0\u10e3\u10da\u10d8 \u10d9\u10dd\u10db\u10d1\u10d8\u10dc\u10d0\u10ea\u10d8\u10d0 CTRL+V.",text_linebreaks:"\u10d2\u10d0\u10d3\u10d0\u10e2\u10d0\u10dc\u10d8\u10da\u10d8 \u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d4\u10d1\u10d8\u10e1 \u10e8\u10d4\u10dc\u10d0\u10ee\u10d5\u10d0",text_title:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10e9\u10d0\u10e1\u10d0\u10e1\u10db\u10d4\u10da\u10d0\u10d3 \u10d2\u10d0\u10db\u10dd\u10d8\u10e7\u10d4\u10dc\u10d4\u10d7 \u10d9\u10da\u10d0\u10d5\u10d8\u10d0\u10e2\u10e3\u10e0\u10e3\u10da\u10d8 \u10d9\u10dd\u10db\u10d1\u10d8\u10dc\u10d0\u10ea\u10d8\u10d0 CTRL+V."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/kl_dlg.js b/js/tiny_mce/plugins/paste/langs/kl_dlg.js new file mode 100755 index 000000000..94c8b5c80 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/km_dlg.js b/js/tiny_mce/plugins/paste/langs/km_dlg.js new file mode 100755 index 000000000..8c3c36c8e --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.paste_dlg',{word_title:"\u1794\u17d2\u179a\u17be CTRL V \u1793\u17c5\u179b\u17be\u1780\u17d2\u178a\u17b6\u179a\u1785\u17bb\u1785\u178a\u17be\u1798\u17d2\u1794\u17b8\u1794\u17b7\u1791\u1797\u17d2\u1787\u17b6\u1794\u17cb\u17a2\u178f\u17d2\u1790\u1794\u1791\u1791\u17c5\u1793\u17b9\u1784\u1794\u1784\u17d2\u17a2\u17bd\u1785\u1793\u17c1\u17c7\u00a0\u17d4",text_linebreaks:"\u179a\u1780\u17d2\u179f\u17b6\u179f\u1789\u17d2\u1789\u17b6\u1785\u17bb\u17c7\u1794\u1793\u17d2\u1791\u17b6\u178f\u17cb",text_title:"\u1794\u17d2\u179a\u17be CTRL V \u1793\u17c5\u179b\u17be\u1780\u17d2\u178a\u17b6\u179a\u1785\u17bb\u1785\u178a\u17be\u1798\u17d2\u1794\u17b8\u1794\u17b7\u1791\u1797\u17d2\u1787\u17b6\u1794\u17cb\u17a2\u178f\u17d2\u1790\u1794\u1791\u1791\u17c5\u1793\u17b9\u1784\u1794\u1784\u17d2\u17a2\u17bd\u1785\u1793\u17c1\u17c7\u00a0\u17d4"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ko_dlg.js b/js/tiny_mce/plugins/paste/langs/ko_dlg.js new file mode 100755 index 000000000..4c009fe66 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.paste_dlg',{word_title:"\uc708\ub3c4\uc6b0\uc5d0 \ud14d\uc2a4\ud2b8\ub97c \ubd99\uc774\ub824\uba74 \ud0a4\ubcf4\ub4dc\ub85cCtrl+V\ub97c \uc785\ub825\ud574 \uc8fc\uc138\uc694.",text_linebreaks:"\uac1c\ud589\uc744 \ubcf4\uad00 \uc720\uc9c0",text_title:"\uc708\ub3c4\uc6b0\uc5d0 \ud14d\uc2a4\ud2b8\ub97c \ubd99\uc774\ub824\uba74 \ud0a4\ubcf4\ub4dc\ub85c Ctrl+V\ub97c \uc785\ub825\ud574 \uc8fc\uc138\uc694."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/lb_dlg.js b/js/tiny_mce/plugins/paste/langs/lb_dlg.js new file mode 100755 index 000000000..381de1072 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.paste_dlg',{word_title:"Dr\u00e9ckt op \u00c4rer Tastatur Ctrl+V, um den Text an ze f\u00fcgen.",text_linebreaks:"Zeilen\u00ebmbr\u00ebch b\u00e4ibehalen",text_title:"Dr\u00e9ckt op \u00c4rer Tastatur Ctrl+V, fir den Text an ze f\u00fcgen."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/lt_dlg.js b/js/tiny_mce/plugins/paste/langs/lt_dlg.js new file mode 100755 index 000000000..d1eac566b --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.paste_dlg',{word_title:"Naudokite CTRL+V tekstui \u012fd\u0117ti \u012f \u0161\u012f lang\u0105.",text_linebreaks:"Palikti eilu\u010di\u0173 l\u016b\u017eius",text_title:"Naudokite CTRL+V tekstui \u012fd\u0117ti \u012f \u0161\u012f lang\u0105."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/lv_dlg.js b/js/tiny_mce/plugins/paste/langs/lv_dlg.js new file mode 100755 index 000000000..b9f8ef963 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.paste_dlg',{word_title:"Izmantojiet CTRL+V uz j\u016bsu tastat\u016bras lai iekop\u0113t tekstu log\u0101.",text_linebreaks:"Sagl\u0101b\u0101t l\u012bniju sadal\u012bt\u0101jus",text_title:"Izmantojiet CTRL+V uz j\u016bsu tastat\u016bras lai iekop\u0113t tekstu log\u0101."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/mk_dlg.js b/js/tiny_mce/plugins/paste/langs/mk_dlg.js new file mode 100755 index 000000000..dffbe0d85 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.paste_dlg',{word_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor.",text_linebreaks:"Zadr\u017ei prelome",text_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ml_dlg.js b/js/tiny_mce/plugins/paste/langs/ml_dlg.js new file mode 100755 index 000000000..e22058716 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/mn_dlg.js b/js/tiny_mce/plugins/paste/langs/mn_dlg.js new file mode 100755 index 000000000..76f212ddc --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.paste_dlg',{word_title:"\u0422\u0430 \u0431\u0438\u0447\u0432\u044d\u0440 \u043e\u0440\u0443\u0443\u043b\u0430\u0445\u044b\u0433 \u0445\u04af\u0441\u0432\u044d\u043b Ctrl+V \u0434\u044d\u044d\u0440 \u0434\u0430\u0440\u043d\u0430 \u0443\u0443.",text_linebreaks:"\u041c\u04e9\u0440 \u0442\u0430\u0441\u043b\u0430\u043b\u0442\u044b\u0433 \u04af\u043b\u0434\u044d\u044d\u043d\u044d",text_title:"\u0422\u0430 \u0431\u0438\u0447\u0432\u044d\u0440 \u043e\u0440\u0443\u0443\u043b\u0430\u0445\u044b\u0433 \u0445\u04af\u0441\u0432\u044d\u043b Ctrl+V \u0434\u044d\u044d\u0440 \u0434\u0430\u0440\u043d\u0430 \u0443\u0443."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ms_dlg.js b/js/tiny_mce/plugins/paste/langs/ms_dlg.js new file mode 100755 index 000000000..46b55d666 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.paste_dlg',{word_title:"Guna CTRL+V pada papan kekunci anda untuk teks ke dalam tetingkap.",text_linebreaks:"Biarkan garisan pemisah",text_title:"Guna CTRL+V pada papan kekunci anda untuk Tempel teks ke dalam tetingkap."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/my_dlg.js b/js/tiny_mce/plugins/paste/langs/my_dlg.js new file mode 100755 index 000000000..5b598ca0e --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.paste_dlg',{word_title:"\u101d\u1004\u103a\u1038\u1012\u102d\u102f\u1038\u1011\u1032\u101e\u102d\u102f\u1037 \u1005\u102c\u101e\u102c\u1038\u1000\u102d\u102f \u1000\u1030\u1038\u103c\u1016\u100a\u103a\u1037\u101b\u1014\u103a \u101e\u1004\u103a\u1037 \u1000\u102e\u1038\u1018\u102f\u1010\u103a\u101c\u1000\u103a\u1000\u103d\u1000\u103a\u101b\u103e\u102d CTRL V \u1000\u102d\u102f \u101e\u1036\u102f\u1038\u1015\u102b",text_linebreaks:"\u1005\u102c\u1031\u103c\u1000\u102c\u1004\u103a\u1038\u1001\u103d\u1032\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1001\u103d\u1032\u101c\u103b\u103e\u1000\u103a\u1011\u102c\u1038\u1015\u102b",text_title:"\u101d\u1004\u103a\u1038\u1012\u102d\u102f\u1038\u1011\u1032\u101e\u102d\u102f\u1037 \u1005\u102c\u101e\u102c\u1038\u1000\u102d\u102f \u1000\u1030\u1038\u103c\u1016\u100a\u103a\u1037\u101b\u1014\u103a \u101e\u1004\u103a\u1037 \u1000\u102e\u1038\u1018\u102f\u1010\u103a\u101c\u1000\u103a\u1000\u103d\u1000\u103a\u101b\u103e\u102d CTRL V \u1000\u102d\u102f \u101e\u1036\u102f\u1038\u1015\u102b"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/nb_dlg.js b/js/tiny_mce/plugins/paste/langs/nb_dlg.js new file mode 100755 index 000000000..bfb2266f8 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.paste_dlg',{"word_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn i dette vinduet.","text_linebreaks":"Behold tekstbryting","text_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn i dette vinduet."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/nl_dlg.js b/js/tiny_mce/plugins/paste/langs/nl_dlg.js new file mode 100755 index 000000000..bac8ac046 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.paste_dlg',{"word_title":"Gebruik Ctrl+V om tekst in het venster te plakken.","text_linebreaks":"Regelafbreking bewaren","text_title":"Gebruik Ctrl+V om tekst in het venster te plakken."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/nn_dlg.js b/js/tiny_mce/plugins/paste/langs/nn_dlg.js new file mode 100755 index 000000000..0f421ae7f --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.paste_dlg',{word_title:"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn i dette vindauget.",text_linebreaks:"Behald tekstbryting",text_title:"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn i dette vindauget."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/no_dlg.js b/js/tiny_mce/plugins/paste/langs/no_dlg.js new file mode 100755 index 000000000..3f8e333d0 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.paste_dlg',{"word_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn teksten i dette vinduet.","text_linebreaks":"Behold tekstbryting","text_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn teksten i dette vinduet."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/pl_dlg.js b/js/tiny_mce/plugins/paste/langs/pl_dlg.js new file mode 100755 index 000000000..54fd41c37 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.paste_dlg',{"word_title":"U\u017cyj CTRL+V na swojej klawiaturze \u017ceby wklei\u0107 tekst do okna.","text_linebreaks":"Zachowaj ko\u0144ce linii.","text_title":"U\u017cyj CTRL+V na swojej klawiaturze \u017ceby wklei\u0107 tekst do okna."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ps_dlg.js b/js/tiny_mce/plugins/paste/langs/ps_dlg.js new file mode 100755 index 000000000..721f1010a --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/pt_dlg.js b/js/tiny_mce/plugins/paste/langs/pt_dlg.js new file mode 100755 index 000000000..f49d5dd4b --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.paste_dlg',{word_title:"Use CTRL+V para colar o texto na janela.",text_linebreaks:"Manter quebras de linha",text_title:"Use CTRL+V para colar o texto na janela."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ro_dlg.js b/js/tiny_mce/plugins/paste/langs/ro_dlg.js new file mode 100755 index 000000000..91a8d2140 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.paste_dlg',{word_title:"Folosi\u0163i CTRL+V pentru a lipi \u00een aceast\u0103 zon\u0103.",text_linebreaks:"P\u0103streaz\u0103 separatoarele de linii.",text_title:"Folosi\u0163i CTRL+V pentru a lipi \u00een aceast\u0103 zon\u0103."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ru_dlg.js b/js/tiny_mce/plugins/paste/langs/ru_dlg.js new file mode 100755 index 000000000..b360b075d --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.paste_dlg',{"word_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e.","text_linebreaks":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a","text_title":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u043e."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/sc_dlg.js b/js/tiny_mce/plugins/paste/langs/sc_dlg.js new file mode 100755 index 000000000..5bc79d234 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.paste_dlg',{word_title:"\u5728\u952e\u76d8\u4e0a\u540c\u65f6\u6309\u4e0bCTRL\u548cV\u952e\uff0c\u4ee5\u8d34\u4e0a\u6587\u5b57\u5230\u6b64\u89c6\u7a97\u3002 ",text_linebreaks:"\u4fdd\u7559\u6362\u884c\u7b26\u53f7",text_title:"\u5728\u952e\u76d8\u4e0a\u540c\u65f6\u6309\u4e0bCTRL\u548cV\u952e\uff0c\u4ee5\u8d34\u4e0a\u6587\u5b57\u5230\u6b64\u89c6\u7a97\u3002 "}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/se_dlg.js b/js/tiny_mce/plugins/paste/langs/se_dlg.js new file mode 100755 index 000000000..8c7e86bfb --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.paste_dlg',{word_title:"Anv\u00e4nd ctrl-v p\u00e5 ditt tangentbord f\u00f6r att klistra in i detta f\u00f6nster.",text_linebreaks:"Spara radbrytningar",text_title:"Anv\u00e4nd ctrl-v p\u00e5 ditt tangentbord f\u00f6r att klistra in i detta f\u00f6nster."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/si_dlg.js b/js/tiny_mce/plugins/paste/langs/si_dlg.js new file mode 100755 index 000000000..058c014fa --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/sk_dlg.js b/js/tiny_mce/plugins/paste/langs/sk_dlg.js new file mode 100755 index 000000000..eb3b2dba7 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.paste_dlg',{word_title:"Pou\u017eite CTRL+V pre vlo\u017eenie textu do okna.",text_linebreaks:"Zachova\u0165 zalamovanie riadkov",text_title:"Pou\u017eite CTRL+V pre vlo\u017eenie textu do okna."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/sl_dlg.js b/js/tiny_mce/plugins/paste/langs/sl_dlg.js new file mode 100755 index 000000000..1757bcd43 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.paste_dlg',{word_title:"Uporabite kombinacijo tipk CTRL+V, da prilepite vsebino v okno.",text_linebreaks:"Obdr\u017ei prelome vrstic",text_title:"Uporabite kombinacijo tipk CTRL+V, da prilepite vsebino v okno."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/sq_dlg.js b/js/tiny_mce/plugins/paste/langs/sq_dlg.js new file mode 100755 index 000000000..7e763e4d3 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.paste_dlg',{word_title:"P\u00ebrdor CTRL+V p\u00ebr t\u00eb ngjitur tekstin.",text_linebreaks:"Ruaj linjat e reja",text_title:"P\u00ebrdor CTRL+V p\u00ebr t\u00eb ngjitur tekstin."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/sr_dlg.js b/js/tiny_mce/plugins/paste/langs/sr_dlg.js new file mode 100755 index 000000000..841442a11 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.paste_dlg',{word_title:"Koristite CTRL+V na tastaturi da zalepite tekst u prozor.",text_linebreaks:"Zadr\u017ei prelome",text_title:"Koristite CTRL+V na tastaturi da zalepite tekst u prozor."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/sv_dlg.js b/js/tiny_mce/plugins/paste/langs/sv_dlg.js new file mode 100755 index 000000000..1c99e2b1b --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.paste_dlg',{"word_title":"Anv\u00e4nd ctrl-v p\u00e5 ditt tangentbord f\u00f6r att klistra in i detta f\u00f6nster.","text_linebreaks":"Spara radbrytningar","text_title":"Anv\u00e4nd ctrl-v p\u00e5 ditt tangentbord f\u00f6r att klistra in i detta f\u00f6nster."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ta_dlg.js b/js/tiny_mce/plugins/paste/langs/ta_dlg.js new file mode 100755 index 000000000..0865a582c --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/te_dlg.js b/js/tiny_mce/plugins/paste/langs/te_dlg.js new file mode 100755 index 000000000..f7117790c --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/th_dlg.js b/js/tiny_mce/plugins/paste/langs/th_dlg.js new file mode 100755 index 000000000..646a460fe --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/tn_dlg.js b/js/tiny_mce/plugins/paste/langs/tn_dlg.js new file mode 100755 index 000000000..2c5c22db7 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/tr_dlg.js b/js/tiny_mce/plugins/paste/langs/tr_dlg.js new file mode 100755 index 000000000..99e1b73da --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.paste_dlg',{word_title:"Pencereye metin yap\u0131\u015ft\u0131rmak i\u00e7in klavyeden CTRL+V i kullan\u0131n.",text_linebreaks:"Sat\u0131r kesmelerini tut",text_title:"Pencereye metin yap\u0131\u015ft\u0131rmak i\u00e7in klavyeden CTRL+V i kullan\u0131n."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/tt_dlg.js b/js/tiny_mce/plugins/paste/langs/tt_dlg.js new file mode 100755 index 000000000..4eea8875f --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.paste_dlg',{word_title:"\u5c07\u8907\u88fd(CTRL + C)\u7684\u5167\u5bb9\u8cbc\u4e0a(CTRL + V)\u5230\u8996\u7a97\u3002",text_linebreaks:"\u4fdd\u7559\u5206\u884c\u7b26\u865f\u865f",text_title:"\u5c07\u8907\u88fd(CTRL + C)\u7684\u5167\u5bb9\u8cbc\u4e0a(CTRL + V)\u5230\u8996\u7a97\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/tw_dlg.js b/js/tiny_mce/plugins/paste/langs/tw_dlg.js new file mode 100755 index 000000000..ae63d51a4 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.paste_dlg',{word_title:"\u7528 Ctrl+V \u5c07\u5167\u5bb9\u8cbc\u4e0a\u3002",text_linebreaks:"\u4fdd\u7559\u63db\u884c\u7b26\u865f",text_title:"\u7528 Ctrl+V \u5c07\u5167\u5bb9\u8cbc\u4e0a\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/uk_dlg.js b/js/tiny_mce/plugins/paste/langs/uk_dlg.js new file mode 100755 index 000000000..7a1f28ac1 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.paste_dlg',{word_title:"\u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443 \u0443 \u0432\u0456\u043a\u043d\u043e.",text_linebreaks:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438 \u0440\u044f\u0434\u043a\u0456\u0432",text_title:"\u0412\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443 \u0443 \u0432\u0456\u043a\u043d\u043e."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/ur_dlg.js b/js/tiny_mce/plugins/paste/langs/ur_dlg.js new file mode 100755 index 000000000..94ac588e8 --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.paste_dlg',{word_title:"Use CTRL+V on your keyboard to paste the text into the window.",text_linebreaks:"Keep linebreaks",text_title:"Use CTRL+V on your keyboard to paste the text into the window."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/vi_dlg.js b/js/tiny_mce/plugins/paste/langs/vi_dlg.js new file mode 100755 index 000000000..63a74d27f --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.paste_dlg',{word_title:"S\u1eed d\u1ee5ng CTRL+V tr\u00ean b\u00e0n ph\u00edm \u0111\u1ec3 d\u00e1n v\u0103n b\u1ea3n v\u00e0o c\u1eeda s\u1ed5.",text_linebreaks:"Gi\u1eef ng\u1eaft d\u00f2ng",text_title:"S\u1eed d\u1ee5ng CTRL+V tr\u00ean b\u00e0n ph\u00edm \u0111\u1ec3 d\u00e1n v\u0103n b\u1ea3n v\u00e0o c\u1eeda s\u1ed5."}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/paste/langs/zh-cn_dlg.js new file mode 100755 index 000000000..4abd1a96c --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.paste_dlg',{"word_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002","text_linebreaks":"\u4fdd\u7559\u65ad\u884c","text_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/zh_dlg.js b/js/tiny_mce/plugins/paste/langs/zh_dlg.js new file mode 100755 index 000000000..94fb061eb --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.paste_dlg',{word_title:"\u7528 Ctrl+V \u5c06\u5185\u5bb9\u8d34\u4e0a\u3002",text_linebreaks:"\u4fdd\u7559\u5206\u884c\u7b26\u53f7",text_title:"\u7528 Ctrl+V \u5c06\u5185\u5bb9\u8d34\u4e0a\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/langs/zu_dlg.js b/js/tiny_mce/plugins/paste/langs/zu_dlg.js new file mode 100755 index 000000000..c977b26ad --- /dev/null +++ b/js/tiny_mce/plugins/paste/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.paste_dlg',{word_title:"\u5728\u952e\u76d8\u4e0a\u540c\u65f6\u6309\u4e0bCTRL\u548cV\u952e\uff0c\u4ee5\u8d34\u4e0a\u6587\u5b57\u5230\u6b64\u89c6\u7a97\u3002",text_linebreaks:"\u4fdd\u7559\u5206\u884c\u7b26\u53f7\u53f7",text_title:"\u5728\u952e\u76d8\u4e0a\u540c\u65f6\u6309\u4e0bCTRL\u548cV\u952e\uff0c\u4ee5\u8d34\u4e0a\u6587\u5b57\u5230\u6b64\u89c6\u7a97\u3002"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/pastetext.htm b/js/tiny_mce/plugins/paste/pastetext.htm new file mode 100644 index 000000000..b65594547 --- /dev/null +++ b/js/tiny_mce/plugins/paste/pastetext.htm @@ -0,0 +1,27 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#paste.paste_text_desc}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="js/pastetext.js"></script> +</head> +<body onresize="PasteTextDialog.resize();" style="display:none; overflow:hidden;"> + <form name="source" onsubmit="return PasteTextDialog.insert();" action="#"> + <div style="float: left" class="title">{#paste.paste_text_desc}</div> + + <div style="float: right"> + <input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label> + </div> + + <br style="clear: both" /> + + <div>{#paste_dlg.text_title}</div> + + <textarea id="content" name="content" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea> + + <div class="mceActionPanel"> + <input type="submit" name="insert" value="{#insert}" id="insert" /> + <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> + </div> + </form> +</body> +</html> \ No newline at end of file diff --git a/js/tiny_mce/plugins/paste/pasteword.htm b/js/tiny_mce/plugins/paste/pasteword.htm new file mode 100644 index 000000000..0f6bb4121 --- /dev/null +++ b/js/tiny_mce/plugins/paste/pasteword.htm @@ -0,0 +1,21 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#paste.paste_word_desc}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="js/pasteword.js"></script> +</head> +<body onresize="PasteWordDialog.resize();" style="display:none; overflow:hidden;"> + <form name="source" onsubmit="return PasteWordDialog.insert();" action="#"> + <div class="title">{#paste.paste_word_desc}</div> + + <div>{#paste_dlg.word_title}</div> + + <div id="iframecontainer"></div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/preview/editor_plugin.js b/js/tiny_mce/plugins/preview/editor_plugin.js new file mode 100644 index 000000000..dc917297a --- /dev/null +++ b/js/tiny_mce/plugins/preview/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/preview/editor_plugin_src.js b/js/tiny_mce/plugins/preview/editor_plugin_src.js new file mode 100644 index 000000000..9eac705b2 --- /dev/null +++ b/js/tiny_mce/plugins/preview/editor_plugin_src.js @@ -0,0 +1,53 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.Preview', { + init : function(ed, url) { + var t = this, css = tinymce.explode(ed.settings.content_css); + + t.editor = ed; + + // Force absolute CSS urls + tinymce.each(css, function(u, k) { + css[k] = ed.documentBaseURI.toAbsolute(u); + }); + + ed.addCommand('mcePreview', function() { + ed.windowManager.open({ + file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"), + width : parseInt(ed.getParam("plugin_preview_width", "550")), + height : parseInt(ed.getParam("plugin_preview_height", "600")), + resizable : "yes", + scrollbars : "yes", + popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"), + inline : ed.getParam("plugin_preview_inline", 1) + }, { + base : ed.documentBaseURI.getURI() + }); + }); + + ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'}); + }, + + getInfo : function() { + return { + longname : 'Preview', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/preview', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('preview', tinymce.plugins.Preview); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/preview/example.html b/js/tiny_mce/plugins/preview/example.html new file mode 100644 index 000000000..48202224d --- /dev/null +++ b/js/tiny_mce/plugins/preview/example.html @@ -0,0 +1,28 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<script language="javascript" src="../../tiny_mce_popup.js"></script> +<script type="text/javascript" src="jscripts/embed.js"></script> +<script type="text/javascript"> +tinyMCEPopup.onInit.add(function(ed) { + var dom = tinyMCEPopup.dom; + + // Load editor content_css + tinymce.each(ed.settings.content_css.split(','), function(u) { + dom.loadCSS(ed.documentBaseURI.toAbsolute(u)); + }); + + // Place contents inside div container + dom.setHTML('content', ed.getContent()); +}); +</script> +<title>Example of a custom preview page</title> +</head> +<body> + +Editor contents: <br /> +<div id="content"> +<!-- Gets filled with editor contents --> +</div> + +</body> +</html> diff --git a/js/tiny_mce/plugins/preview/jscripts/embed.js b/js/tiny_mce/plugins/preview/jscripts/embed.js new file mode 100644 index 000000000..6fe25de09 --- /dev/null +++ b/js/tiny_mce/plugins/preview/jscripts/embed.js @@ -0,0 +1,73 @@ +/** + * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. + */ + +function writeFlash(p) { + writeEmbed( + 'D27CDB6E-AE6D-11cf-96B8-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'application/x-shockwave-flash', + p + ); +} + +function writeShockWave(p) { + writeEmbed( + '166B1BCA-3F9C-11CF-8075-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', + 'application/x-director', + p + ); +} + +function writeQuickTime(p) { + writeEmbed( + '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', + 'video/quicktime', + p + ); +} + +function writeRealMedia(p) { + writeEmbed( + 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'audio/x-pn-realaudio-plugin', + p + ); +} + +function writeWindowsMedia(p) { + p.url = p.src; + writeEmbed( + '6BF52A52-394A-11D3-B153-00C04F79FAA6', + 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', + 'application/x-mplayer2', + p + ); +} + +function writeEmbed(cls, cb, mt, p) { + var h = '', n; + + h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"'; + h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : ''; + h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : ''; + h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : ''; + h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : ''; + h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : ''; + h += '>'; + + for (n in p) + h += '<param name="' + n + '" value="' + p[n] + '">'; + + h += '<embed type="' + mt + '"'; + + for (n in p) + h += n + '="' + p[n] + '" '; + + h += '></embed></object>'; + + document.write(h); +} diff --git a/js/tiny_mce/plugins/preview/preview.html b/js/tiny_mce/plugins/preview/preview.html new file mode 100644 index 000000000..c09a7f059 --- /dev/null +++ b/js/tiny_mce/plugins/preview/preview.html @@ -0,0 +1,17 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<script type="text/javascript" src="../../tiny_mce_popup.js"></script> +<script type="text/javascript" src="jscripts/embed.js"></script> +<script type="text/javascript"><!-- +document.write('<base href="' + tinyMCEPopup.getWindowArg("base") + '">'); +// --> +</script> +<title>{#preview.preview_desc}</title> +</head> +<body id="content"> +<script type="text/javascript"> + document.write(tinyMCEPopup.editor.getContent()); +</script> +</body> +</html> diff --git a/js/tiny_mce/plugins/searchreplace/langs/ar_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ar_dlg.js new file mode 100755 index 000000000..43266970d --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ar_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ar.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/az_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/az_dlg.js new file mode 100755 index 000000000..0f07b4c0d --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/az_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('az.searchreplace_dlg',{ +searchnext_desc:"S\u00F6zl\u0259ri axtar", +notfound:"Axtar\u0131\u015F bitdi. S\u0259tr tap\u0131lmad\u0131.", +search_title:"Axtar", +replace_title:"Axtar/D\u0259yi\u015F", +allreplaced:"B\u00FCt\u00FCn qar\u015F\u0131la\u015Fm\u0131\u015F s\u0259trl\u0259r d\u0259yi\u015Fdirildi.", +findwhat:"N\u0259 axtar\u0131ls\u0131n", +replacewith:"N\u0259y\u0259 d\u0259yi\u015Filsin", +direction:"\u0130stiqam\u0259tl\u0259ndirm\u0259", +up:"Yuxar\u0131", +down:"A\u015Fa\u011F\u0131", +mcase:"Registr\u0131 n\u0259z\u0259r\u0259 al", +findnext:"Sonrak\u0131n\u0131 axtar", +replace:"D\u0259yi\u015F", +replaceall:"Ham\u0131s\u0131n\u0131 d\u0259yi\u015F" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/be_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/be_dlg.js new file mode 100755 index 000000000..243009233 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/be_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('be.searchreplace_dlg',{ +searchnext_desc:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456 \u0437\u043D\u043E\u045E", +notfound:"\u041F\u043E\u0448\u0443\u043A \u0441\u043A\u043E\u043D\u0447\u0430\u043D\u044B. \u0420\u0430\u0434\u043E\u043A \u043D\u0435 \u0437\u043D\u043E\u0439\u0434\u0437\u0435\u043D\u0430\u044F.", +search_title:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456", +replace_title:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456/\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C", +allreplaced:"\u0423\u0441\u0435 \u0441\u0443\u0441\u0442\u0440\u0430\u043A\u0430\u0435\u043C\u044B\u044F \u0440\u0430\u0434\u043A\u0456 \u0431\u044B\u043B\u0456 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B\u044F.", +findwhat:"\u0428\u0442\u043E \u0437\u043D\u0430\u0439\u0441\u0446\u0456", +replacewith:"\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C \u043D\u0430", +direction:"\u041A\u0456\u0440\u0443\u043D\u0430\u043A", +up:"\u0423\u0432\u0435\u0440\u0445", +down:"\u0423\u043D\u0456\u0437", +mcase:"\u0423\u043B\u0456\u0447\u0432\u0430\u0446\u044C \u0440\u044D\u0433\u0456\u0441\u0442\u0440", +findnext:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443\u044E", +replace:"\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C", +replaceall:"\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C \u0443\u0441\u0451" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/bg_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/bg_dlg.js new file mode 100755 index 000000000..8d08e686a --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/bg_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('bg.searchreplace_dlg',{ +searchnext_desc:"\u0422\u044A\u0440\u0441\u0438 \u043E\u0442\u043D\u043E\u0432\u043E", +notfound:"\u0422\u044A\u0440\u0441\u0435\u043D\u0435\u0442\u043E \u0437\u0430\u0432\u044A\u0440\u0448\u0438. \u0422\u044A\u0440\u0441\u0435\u043D\u0438\u0442\u0435 \u0434\u0443\u043C\u0438 \u043D\u0435 \u0431\u044F\u0445\u0430 \u043E\u0442\u043A\u0440\u0438\u0442\u0438.", +search_title:"\u0422\u044A\u0440\u0441\u0438", +replace_title:"\u0422\u044A\u0440\u0441\u0438/\u0417\u0430\u043C\u0435\u0441\u0442\u0438", +allreplaced:"\u0412\u0441\u0438\u0447\u043A\u0438 \u043D\u0430\u043C\u0435\u0440\u0435\u043D\u0438 \u0434\u0443\u043C\u0438 \u0431\u044F\u0445\u0430 \u0437\u0430\u043C\u0435\u0441\u0442\u0435\u043D\u0438.", +findwhat:"\u0422\u044A\u0440\u0441\u0438", +replacewith:"\u0417\u0430\u043C\u0435\u0441\u0442\u0438 \u0441", +direction:"\u041F\u043E\u0441\u043E\u043A\u0430", +up:"\u041D\u0430\u0433\u043E\u0440\u0435", +down:"\u041D\u0430\u0434\u043E\u043B\u0443", +mcase:"\u0421\u044A\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u043D\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u044A\u0440\u0430", +findnext:"\u0422\u044A\u0440\u0441\u0438 \u0441\u043B\u0435\u0434\u0432\u0430\u0449\u0438", +replace:"\u0417\u0430\u043C\u0435\u0441\u0442\u0438", +replaceall:"\u0417\u0430\u043C\u0435\u0441\u0442\u0438 \u0432\u0441\u0438\u0447\u043A\u0438" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js new file mode 100755 index 000000000..ca9a11afb --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('bn.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/br_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/br_dlg.js new file mode 100755 index 000000000..a4da5b044 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/br_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('br.searchreplace_dlg',{ +searchnext_desc:"Localizar novamente", +notfound:"A pesquisa foi conclu\u00EDda sem resultados.", +search_title:"Localizar", +replace_title:"Localizar/substituir", +allreplaced:"Todas as substitui\u00E7\u00F5es foram efetuadas.", +findwhat:"Localizar", +replacewith:"Substituir com", +direction:"Dire\u00E7\u00E3o", +up:"Acima", +down:"Abaixo", +mcase:"Diferenciar mai\u00FAsculas/min\u00FAsculas", +findnext:"Localizar pr\u00F3ximo", +replace:"Substituir", +replaceall:"Substituir todos" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/bs_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/bs_dlg.js new file mode 100755 index 000000000..3651ed9e6 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/bs_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('bs.searchreplace_dlg',{ +searchnext_desc:"Prona\u0111i opet", +notfound:"Pretra\u017Eivanje je zavr\u0161eno. Tra\u017Eeni tekst nije prona\u0111en.", +search_title:"Prona\u0111i", +replace_title:"Prona\u0111i/Zamijeni", +allreplaced:"Sva pojavljivanja tra\u017Eenog teksta su zamijenjena.", +findwhat:"Prona\u0111i tekst", +replacewith:"Zamijeni sa", +direction:"Smjer", +up:"Gore", +down:"Dolje", +mcase:"Match case", +findnext:"Prona\u0111i sljede\u0107e", +replace:"Zamijeni", +replaceall:"Zamijeni sve" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ca_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ca_dlg.js new file mode 100755 index 000000000..ac195038e --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ca_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ca.searchreplace_dlg',{ +searchnext_desc:"Cerca de nou", +notfound:"S\'ha completat la cerca. No s\'ha trobat la cadena cercada.", +search_title:"Cerca", +replace_title:"Cerca/Reempla\u00E7a", +allreplaced:"S\'han reempla\u00E7at totes les ocurr\u00E8ncies de la cadena cercada.", +findwhat:"Cerca", +replacewith:"Reempla\u00E7a amb", +direction:"Direcci\u00F3", +up:"Amunt", +down:"Avall", +mcase:"Distingeix maj\u00FAscules/min\u00FAscules", +findnext:"Seg\u00FCent", +replace:"Reempla\u00E7a", +replaceall:"Reempla\u00E7a-ho tot" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ch_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ch_dlg.js new file mode 100755 index 000000000..c0f372579 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ch_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ch.searchreplace_dlg',{ +searchnext_desc:"\u518D\u6B21\u67E5\u627E", +notfound:"\u67E5\u627E\u5DF2\u5B8C\u6210!\u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6807\u3002", +search_title:"\u67E5\u627E", +replace_title:"\u67E5\u627E/\u66FF\u6362", +allreplaced:"\u5DF2\u66FF\u6362\u6240\u6709\u5339\u914D\u7684\u7B26\u4E32.", +findwhat:"\u67E5\u627E\u76EE\u6807", +replacewith:"\u66FF\u6362\u4E3A", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5927\u5C0F\u5199\u5339\u914D", +findnext:"\u4E0B\u4E00\u4E2A", +replace:"\u66FF\u6362", +replaceall:"\u66FF\u6362\u5168\u90E8" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/cs_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/cs_dlg.js new file mode 100755 index 000000000..54deecfd4 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/cs_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('cs.searchreplace_dlg',{ +searchnext_desc:"Naj\u00EDt dal\u0161\u00ED", +notfound:"Hled\u00E1n\u00ED bylo dokon\u010Deno. Hledan\u00FD text nebyl nalezen.", +search_title:"Naj\u00EDt", +replace_title:"Naj\u00EDt/nahradit", +allreplaced:"V\u0161echny v\u00FDskyty byly nahrazeny.", +findwhat:"Co hledat", +replacewith:"\u010C\u00EDm nahradit", +direction:"Sm\u011Br", +up:"Nahoru", +down:"Dol\u016F", +mcase:"Rozli\u0161ovat velikost", +findnext:"Naj\u00EDt dal\u0161\u00ED", +replace:"Nahradit", +replaceall:"Nahradit v\u0161e" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js new file mode 100755 index 000000000..113420400 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('cy.searchreplace_dlg',{ +searchnext_desc:"Canfod eto", +notfound:"Mae'r chwiliad wedi cwblhau. Methu canfod y llinyn chwiliad.", +search_title:"Canfod", +replace_title:"Canfod/Amnewid", +allreplaced:"Amnewidwyd pob digwyddiad o'r llinyn chwiliad.", +findwhat:"Canfod beth", +replacewith:"Adnewid gyda", +direction:"Cyfeiriad", +up:"I fyny", +down:"I lawr", +mcase:"Cydweddu priflythrennedd", +findnext:"Canfod nesaf", +replace:"Amnewid", +replaceall:"Amnewid pob un" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/da_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/da_dlg.js new file mode 100755 index 000000000..5f20235e1 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/da_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('da.searchreplace_dlg',{ +searchnext_desc:"S\u00F8g igen", +notfound:"S\u00F8gningen gav intet resultat.", +search_title:"S\u00F8g", +replace_title:"S\u00F8g / erstat", +allreplaced:"Alle forekomster af s\u00F8gestrengen er erstattet.", +findwhat:"S\u00F8g efter", +replacewith:"Erstat med", +direction:"Retning", +up:"Op", +down:"Ned", +mcase:"Forskel p\u00E5 store og sm\u00E5 bogstaver", +findnext:"Find n\u00E6ste", +replace:"Erstat", +replaceall:"Erstat alle" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/de_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/de_dlg.js new file mode 100755 index 000000000..6bb60d6ee --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/de_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('de.searchreplace_dlg',{ +searchnext_desc:"Weitersuchen", +notfound:"Die Suche ist am Ende angelangt. Die Zeichenkette konnte nicht gefunden werden.", +search_title:"Suchen", +replace_title:"Suchen/Ersetzen", +allreplaced:"Alle Vorkommen der Zeichenkette wurden ersetzt.", +findwhat:"Zu suchender Text", +replacewith:"Ersetzen durch", +direction:"Suchrichtung", +up:"Aufw\u00E4rts", +down:"Abw\u00E4rts", +mcase:"Gro\u00DF-/Kleinschreibung beachten", +findnext:"Weitersuchen", +replace:"Ersetzen", +replaceall:"Alle ersetzen" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/dv_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/dv_dlg.js new file mode 100755 index 000000000..219e9b6de --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/dv_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('dv.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/el_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/el_dlg.js new file mode 100755 index 000000000..f2127e497 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/el_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('el.searchreplace_dlg',{ +searchnext_desc:"\u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03BE\u03B1\u03BD\u03AC", +notfound:"\u0397 \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03C4\u03B5\u03BB\u03B5\u03AF\u03C9\u03C3\u03B5. \u03A4\u03BF \u03B6\u03B7\u03C4\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5.", +search_title:"\u0395\u03CD\u03C1\u03B5\u03C3\u03B7", +replace_title:"\u0395\u03CD\u03C1\u03B5\u03C3\u03B7/\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7", +allreplaced:"\u038C\u03BB\u03B5\u03C2 \u03BF\u03B9 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03C3\u03B5\u03B9\u03C2 \u03C4\u03BF\u03C5 \u03B6\u03B7\u03C4\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AC\u03B8\u03B7\u03BA\u03B1\u03BD.", +findwhat:"\u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03C4\u03BF\u03C5", +replacewith:"\u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BC\u03B5", +direction:"\u039A\u03B1\u03C4\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7", +up:"\u03A0\u03AC\u03BD\u03C9", +down:"\u039A\u03AC\u03C4\u03C9", +mcase:"\u03A4\u03B1\u03AF\u03C1\u03B9\u03B1\u03C3\u03BC\u03B1 \u03BA\u03B5\u03C6\u03B1\u03BB\u03B1\u03AF\u03B1/\u03BC\u03B9\u03BA\u03C1\u03AC", +findnext:"\u0392\u03C1\u03B5\u03C2 \u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF", +replace:"\u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7", +replaceall:"\u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4. \u03CC\u03BB\u03C9\u03BD" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/en_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/en_dlg.js new file mode 100755 index 000000000..3dd3453dc --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/en_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('en.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/es_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/es_dlg.js new file mode 100755 index 000000000..e4cd3a98f --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/es_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('es.searchreplace_dlg',{ +searchnext_desc:"Buscar de nuevo", +notfound:"La b\u00FAsqueda se ha completado. No se encontr\u00F3 el texto introducido.", +search_title:"Buscar", +replace_title:"Buscar/Reemplazar", +allreplaced:"Se ha reemplazado el texto.", +findwhat:"Qu\u00E9 buscar", +replacewith:"Reemplazar por", +direction:"Direcci\u00F3n", +up:"Arriba", +down:"Abajo", +mcase:"Min\u00FAs./May\u00FAs.", +findnext:"Buscar siguiente", +replace:"Reemplazar", +replaceall:"Reemplazar todo" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/et_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/et_dlg.js new file mode 100755 index 000000000..635c16663 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/et_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('et.searchreplace_dlg',{ +searchnext_desc:"Otsi uuesti", +notfound:"Otsing on l\u00F5petatud. Otsis\u00F5na ei leitud.", +search_title:"Otsi", +replace_title:"Otsi/Asenda", +allreplaced:"K\u00F5ik otsis\u00F5na ilmingud on asendatud.", +findwhat:"Otsi mida", +replacewith:"Asenda millega", +direction:"Suund", +up:"\u00DCles", +down:"Alla", +mcase:"Vasta suurusele", +findnext:"Otsi j\u00E4rgmine", +replace:"Asenda", +replaceall:"Asenda k\u00F5ik" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js new file mode 100755 index 000000000..657387c2b --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('eu.searchreplace_dlg',{ +searchnext_desc:"Berriz bilatu", +notfound:"Bilaketa bukatu da. Bilatutakoa ez da aurkitu.", +search_title:"Bilatu", +replace_title:"Bilatu/Ordezkatu", +allreplaced:"Bilatutakoaren agerpen guztiak ordezkatu dira.", +findwhat:"Zer bilatu", +replacewith:"Zerekin ordezkatu", +direction:"Norabidea", +up:"Gorantz", +down:"Beherantz", +mcase:"Maiuskulak eta minuskulak kontuan hartu", +findnext:"Hurrengoa", +replace:"Ordezkatu", +replaceall:"Ordezkatu guztiak" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/fa_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/fa_dlg.js new file mode 100755 index 000000000..13a245f77 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/fa_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('fa.searchreplace_dlg',{ +searchnext_desc:"\u062C\u0633\u062A\u062C\u0648\u06CC \u0645\u062C\u062F\u062F", +notfound:"\u062C\u0633\u062A\u062C\u0648 \u06A9\u0627\u0645\u0644 \u0634\u062F. \u06A9\u0644\u0645\u0647 \u062C\u0633\u062A\u062C\u0648 \u0634\u062F\u0647 \u06CC\u0627\u0641\u062A \u0646\u0634\u062F", +search_title:"\u062C\u0633\u062A\u062C\u0648", +replace_title:"\u062C\u0633\u062A\u062C\u0648/\u062A\u0639\u0648\u06CC\u0636", +allreplaced:"\u062A\u0645\u0627\u0645\u06CC \u06A9\u0644\u0645\u0627\u062A \u06CC\u0627\u0641\u062A \u0634\u062F\u0647 \u062A\u063A\u06CC\u06CC\u0631 \u06CC\u0627\u0641\u062A\u0646\u062F", +findwhat:"\u062C\u0633\u062A\u062C\u0648\u06CC \u0686\u0647 \u0686\u06CC\u0632\u06CC", +replacewith:"\u062A\u0639\u0648\u06CC\u0636 \u0628\u0627", +direction:"\u062C\u0647\u062A", +up:"\u0628\u0627\u0644\u0627", +down:"\u067E\u0627\u06CC\u06CC\u0646", +mcase:"\u0647\u0645\u0633\u0627\u0646 \u0628\u0648\u062F\u0646 \u062D\u0631\u0648\u0641", +findnext:"\u062C\u0633\u062A\u062C\u0648\u06CC \u0628\u0639\u062F\u06CC", +replace:"\u062A\u0639\u0648\u06CC\u0636", +replaceall:"\u062A\u0639\u0648\u06CC\u0636 \u0647\u0645\u0647" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/fi_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/fi_dlg.js new file mode 100755 index 000000000..f796ac626 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/fi_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('fi.searchreplace_dlg',{ +searchnext_desc:"Etsi uudestaan", +notfound:"Haku on valmis. Haettua teksti\u00E4 ei l\u00F6ytynyt.", +search_title:"Haku", +replace_title:"Etsi ja korvaa", +allreplaced:"Kaikki l\u00F6ydetyt merkkijonot korvattiin.", +findwhat:"Etsit\u00E4\u00E4n", +replacewith:"Korvataan", +direction:"Suunta", +up:"Yl\u00F6s", +down:"Alas", +mcase:"Huomioi isot ja pienet kirjaimet", +findnext:"Etsi seuraavaa", +replace:"Korvaa", +replaceall:"Korvaa kaikki" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/fr_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/fr_dlg.js new file mode 100755 index 000000000..2905ed0fb --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/fr_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('fr.searchreplace_dlg',{ +searchnext_desc:"Suivant", +notfound:"La recherche est termin\u00E9e. La cha\u00EEne recherch\u00E9e n'a pas \u00E9t\u00E9 trouv\u00E9e.", +search_title:"Rechercher", +replace_title:"Rechercher / remplacer", +allreplaced:"Toutes les occurrences de la cha\u00EEne recherch\u00E9e ont \u00E9t\u00E9 remplac\u00E9es.", +findwhat:"Rechercher ceci", +replacewith:"Remplacer par", +direction:"Direction", +up:"Vers le haut", +down:"Vers le bas", +mcase:"Sensible \u00E0 la casse", +findnext:"Rechercher le suivant", +replace:"Remplacer", +replaceall:"Tout remplacer" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js new file mode 100755 index 000000000..e2335259a --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('gl.searchreplace_dlg',{ +searchnext_desc:"Buscar outra vez", +notfound:"A busca rematou. No se atopou o texto buscado.", +search_title:"Buscar", +replace_title:"Buscar/Reemplazar", +allreplaced:"T\u00F3da-las coincidencias do texto buscado foron reemplazadas.", +findwhat:"Localizar", +replacewith:"Reemplazar por", +direction:"Direcci\u00F3n", +up:"Arriba", +down:"Abaixo", +mcase:"Min\u00FAs./Mai\u00FAs.", +findnext:"Buscar seginte", +replace:"Reemplazar", +replaceall:"Reemplazar todo" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/gu_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/gu_dlg.js new file mode 100755 index 000000000..bf131957c --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/gu_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('gu.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/he_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/he_dlg.js new file mode 100755 index 000000000..43b068c15 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/he_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('he.searchreplace_dlg',{ +searchnext_desc:"\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05D1\u05D0", +notfound:"\u05D4\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DD. \u05E4\u05E8\u05D9\u05D8 \u05D4\u05D7\u05D9\u05E4\u05D5\u05E9 \u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0.", +search_title:"\u05D7\u05D9\u05E4\u05D5\u05E9", +replace_title:"\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D5\u05D4\u05D7\u05DC\u05E4\u05D4", +allreplaced:"\u05DB\u05DC \u05E4\u05E8\u05D9\u05D8\u05D9 \u05D4\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05D5\u05D7\u05DC\u05E4\u05D5", +findwhat:"\u05DC\u05D7\u05E4\u05E9 \u05D0\u05EA", +replacewith:"\u05DC\u05D4\u05D7\u05DC\u05D9\u05E3 \u05D1", +direction:"\u05DB\u05D9\u05D5\u05D5\u05DF", +up:"\u05DC\u05DE\u05E2\u05DC\u05D4", +down:"\u05DC\u05DE\u05D8\u05D4", +mcase:"\u05D4\u05EA\u05D0\u05DD \u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05E8\u05D9\u05E9\u05D9\u05D5\u05EA", +findnext:"\u05D7\u05E4\u05E9 \u05D0\u05EA \u05D4\u05D1\u05D0", +replace:"\u05D4\u05D7\u05DC\u05E4\u05D4", +replaceall:"\u05D4\u05D7\u05DC\u05E4\u05EA \u05D4\u05DB\u05DC" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js new file mode 100755 index 000000000..15d231d38 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('hi.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/hr_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/hr_dlg.js new file mode 100755 index 000000000..8e72be796 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/hr_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('hr.searchreplace_dlg',{ +searchnext_desc:"Prona\u0111i opet", +notfound:"Pretra\u017Eivanje je zavr\u0161eno. Tra\u017Eeni tekst nije prona\u0111en.", +search_title:"Prona\u0111i", +replace_title:"Prona\u0111i/Zamijeni", +allreplaced:"Sva pojavljivanja tra\u017Eenog teksta su zamijenjena.", +findwhat:"Prona\u0111i tekst", +replacewith:"Zamijeni sa", +direction:"Smjer", +up:"Gore", +down:"Dolje", +mcase:"Match case", +findnext:"Prona\u0111i sljede\u0107e", +replace:"Zamijeni", +replaceall:"Zamijeni sve" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/hu_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/hu_dlg.js new file mode 100755 index 000000000..3fa2e38ba --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/hu_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('hu.searchreplace_dlg',{ +searchnext_desc:"Keres\u00E9s megint", +notfound:"A keres\u00E9s v\u00E9get \u00E9rt. A keresett sz\u00F6vegr\u00E9sz nem tal\u00E1lhat\u00F3.", +search_title:"Keres\u00E9s", +replace_title:"Keres\u00E9s/Csere", +allreplaced:"A keresett r\u00E9szsz\u00F6veg minden el\u0151fordul\u00E1sa cser\u00E9lve lett.", +findwhat:"Mit cser\u00E9l", +replacewith:"Mire cser\u00E9l", +direction:"Ir\u00E1ny", +up:"Fel", +down:"Le", +mcase:"Kis- \u00E9s nagybet\u0171k megk\u00FCl\u00F6nb\u00F6ztet\u00E9se", +findnext:"Keres\u00E9s", +replace:"Csere", +replaceall:"Minden tal\u00E1lat cser\u00E9je" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js new file mode 100755 index 000000000..b20b726b8 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('hy.searchreplace_dlg',{ +searchnext_desc:"\u0546\u0578\u0580\u056B\u0581 \u0578\u0580\u0578\u0576\u0565\u056C", +notfound:"\u0548\u0580\u0578\u0576\u0578\u0582\u0574\u0568 \u0561\u057E\u0561\u0580\u057F\u057E\u0565\u0581\u0589 \u0548\u0579\u056B\u0576\u0579 \u0579\u056B \u0563\u057F\u0576\u057E\u0565\u056C", +search_title:"\u0548\u0580\u0578\u0576\u0565\u056C", +replace_title:"\u0548\u0580\u0578\u0576\u0565\u056C / \u0553\u0578\u0583\u0578\u056D\u0565\u056C", +allreplaced:"\u0532\u0578\u056C\u0578\u0580 \u0563\u057F\u0576\u057E\u0561\u056E\u0576\u0565\u0580\u0568 \u0583\u0578\u0583\u0578\u056D\u057E\u0565\u0581\u056B\u0576", +findwhat:"\u0548\u0580\u0578\u0576\u0565\u056C", +replacewith:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C", +direction:"\u0548\u0582\u0572\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576", +up:"\u054E\u0565\u0580\u0587 ", +down:"\u0546\u0565\u0580\u0584\u0587", +mcase:"\u0540\u0561\u0577\u057E\u056B \u0561\u057C\u0576\u0565\u056C \u057C\u0565\u0563\u056B\u057D\u057F\u0578\u0580\u0568", +findnext:"\u0533\u057F\u0576\u0565\u056C \u0570\u0561\u057B\u0578\u0580\u0564\u0568", +replace:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C", +replaceall:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C \u0562\u0561\u056C\u0578\u0580\u0568" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js new file mode 100755 index 000000000..4ed8a950b --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ia.searchreplace_dlg',{ +searchnext_desc:"\u518D\u6B21\u67E5\u627E", +notfound:"\u67E5\u627E\u5DF2\u5B8C\u6210 ! \u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6807\u3002 ", +search_title:"\u67E5\u627E", +replace_title:"\u67E5\u627E/\u66FF\u6362", +allreplaced:"\u5DF2\u66FF\u6362\u6240\u6709\u5339\u914D\u7684\u5B57\u7B26\u4E32.", +findwhat:"\u67E5\u627E\u76EE\u6807", +replacewith:"\u66FF\u6362\u4E3A", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u533A\u5206\u5927\u5C0F\u5199", +findnext:"\u67E5\u627E\u4E0B\u4E00\u4E2A", +replace:"\u66FF\u6362", +replaceall:"\u5168\u90E8\u66FF\u6362" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/id_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/id_dlg.js new file mode 100755 index 000000000..14f09607e --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/id_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('id.searchreplace_dlg',{ +searchnext_desc:"Cari Lagi", +notfound:"Pencarian selesai. Hasil tidak ditemukan.", +search_title:"Cari", +replace_title:"Cari/Ganti", +allreplaced:"Seluruh kata dari string pencarian telah digantikan", +findwhat:"Cari apa...", +replacewith:"Ganti dengan...", +direction:"Arah", +up:"Atas", +down:"Bawah", +mcase:"Match case", +findnext:"Cari selanjutnya", +replace:"Ganti", +replaceall:"Ganti semua" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ii_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ii_dlg.js new file mode 100755 index 000000000..917ec52a5 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ii_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ii.searchreplace_dlg',{ +searchnext_desc:"\u518D\u6B21\u67E5\u627E", +notfound:"\u67E5\u627E\u5DF2\u5B8C\u6210!\u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6807\u3002", +search_title:"\u67E5\u627E", +replace_title:"\u67E5\u627E/\u66FF\u6362", +allreplaced:"\u5DF2\u66FF\u6362\u6240\u6709\u5339\u914D\u7684\u7B26\u4E32.", +findwhat:"\u67E5\u627E\u76EE\u6807", +replacewith:"\u66FF\u6362\u4E3A", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5927\u5C0F\u5199\u5339\u914D", +findnext:"\u4E0B\u4E00\u4E2A", +replace:"\u66FF\u6362", +replaceall:"\u66FF\u6362\u5168\u90E8" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/is_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/is_dlg.js new file mode 100755 index 000000000..6834e9ccc --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/is_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('is.searchreplace_dlg',{ +searchnext_desc:"Finna aftur", +notfound:"Leitinni er loki\u00F0. Leitarstrengurinn fannst ekki.", +search_title:"Finna", +replace_title:"Finna/Skipta \u00FAt", +allreplaced:"\u00D6llum ni\u00F0urst\u00F6\u00F0um leitar var skipt \u00FAt.", +findwhat:"Finna hva\u00F0", +replacewith:"Skipta \u00FAt me\u00F0", +direction:"\u00C1tt", +up:"Upp", +down:"Ni\u00F0ur", +mcase:"Match case", +findnext:"Finna n\u00E6sta", +replace:"Skipta \u00FAt", +replaceall:"Skipta \u00FAt \u00F6llu" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/it_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/it_dlg.js new file mode 100755 index 000000000..9f1f8fc06 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/it_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('it.searchreplace_dlg',{ +searchnext_desc:"Trova successivo", +notfound:"Ricerca completata. Nessun risultato trovato.", +search_title:"Trova", +replace_title:"Trova/Sostituisci", +allreplaced:"Tutte le occorrenze del criterio di ricerca sono state sostituite.", +findwhat:"Trova:", +replacewith:"Sostituisci con:", +direction:"Direzione", +up:"Avanti", +down:"Indietro", +mcase:"Maiuscole/minuscole", +findnext:"Trova succ.", +replace:"Sostituisci", +replaceall:"Sost. tutto" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ja_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ja_dlg.js new file mode 100755 index 000000000..a1011edff --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ja_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ja.searchreplace_dlg',{ +searchnext_desc:"\u518D\u691C\u7D22", +notfound:"\u6700\u5F8C\u307E\u3067\u691C\u7D22\u3057\u307E\u3057\u305F\u304C\u3001\u691C\u7D22\u6587\u5B57\u5217\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002", +search_title:"\u691C\u7D22", +replace_title:"\u691C\u7D22/\u7F6E\u63DB", +allreplaced:"\u5168\u3066\u7F6E\u63DB\u3055\u308C\u307E\u3057\u305F\u3002", +findwhat:"\u691C\u7D22\u6587\u5B57\u5217", +replacewith:"\u7F6E\u63DB\u6587\u5B57\u5217", +direction:"\u65B9\u5411", +up:"\u4E0A\u3078", +down:"\u4E0B\u3078", +mcase:"\u5927\u6587\u5B57/\u5C0F\u6587\u5B57\u3092\u533A\u5225\u3059\u308B", +findnext:"\u6B21\u3078", +replace:"\u7F6E\u63DB", +replaceall:"\u5168\u3066\u7F6E\u63DB" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js new file mode 100755 index 000000000..bb768db96 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ka.searchreplace_dlg',{ +searchnext_desc:"\u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7 \u10DE\u10DD\u10D5\u10DC\u10D0", +notfound:"\u10EB\u10D4\u10D1\u10DC\u10D0 \u10D3\u10D0\u10E1\u10E0\u10E3\u10DA\u10D4\u10D1\u10E3\u10DA\u10D8\u10D0. \u10E8\u10D4\u10E1\u10D0\u10E2\u10E7\u10D5\u10D8\u10E1\u10D1\u10D8 \u10D0\u10E0 \u10D0\u10E0\u10D8\u10E1 \u10DC\u10D0\u10DE\u10DD\u10D5\u10DC\u10D8.", +search_title:"\u10EB\u10D8\u10D4\u10D1\u10D0", +replace_title:"\u10DB\u10DD\u10EB\u10D4\u10D1\u10DC\u10D0 \u10D3\u10D0 \u10E8\u10D4\u10EA\u10D5\u10DA\u10D0", +allreplaced:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10DB\u10DC\u10D8\u10E8\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0 \u10E8\u10D4\u10EA\u10D5\u10DA\u10D8\u10DA\u10D8\u10D0.", +findwhat:"\u10EB\u10D4\u10D5\u10DC\u10D0", +replacewith:"\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0 ..", +direction:"\u10DB\u10D8\u10DB\u10D0\u10E0\u10D7\u10E3\u10DA\u10D4\u10D1\u10D0", +up:"\u10D6\u10D4\u10DB\u10DD\u10D7 ", +down:"\u10E5\u10D5\u10D4\u10DB\u10DD\u10D7", +mcase:"\u10E0\u10D4\u10D2\u10D8\u10E1\u10E2\u10E0\u10D8\u10E1 \u10D2\u10D0\u10D7\u10D5\u10D0\u10DA\u10D8\u10E1\u10EC\u10D8\u10DC\u10D4\u10D1\u10D0", +findnext:"\u10D8\u10DE\u10DD\u10D5\u10DC\u10D4 \u10E8\u10D4\u10DB\u10D3\u10D4\u10D2", +replace:"\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0", +replaceall:"\u10E7\u10D5\u10D4\u10DA\u10D0\u10E4\u10D4\u10E0\u10D8\u10E1 \u10E8\u10D4\u10EA\u10D5\u10DA\u10D0" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/kl_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/kl_dlg.js new file mode 100755 index 000000000..a13037ff6 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/kl_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('kl.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ko_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ko_dlg.js new file mode 100755 index 000000000..a619ae761 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ko_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ko.searchreplace_dlg',{ +searchnext_desc:"\uC7AC\uAC80\uC0C9", +notfound:"\uAC80\uC0C9\uC774 \uC644\uB8CC\uD588\uC2B5\uB2C8\uB2E4. \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC740 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.", +search_title:"\uAC80\uC0C9", +replace_title:"\uAC80\uC0C9/\uCE58\uD658", +allreplaced:"\uBAA8\uB450 \uCE58\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", +findwhat:"\uAC80\uC0C9 \uBB38\uC790\uC5F4", +replacewith:"\uCE58\uD658 \uBB38\uC790\uC5F4", +direction:"\uBC29\uD5A5", +up:"\uC704\uC5D0", +down:"\uC544\uB798\uC5D0", +mcase:"\uB300\uBB38\uC790/\uC18C\uBB38\uC790\uB97C \uAD6C\uBCC4", +findnext:"\uAC80\uC0C9", +replace:"\uCE58\uD658", +replaceall:"\uBAA8\uB450 \uCE58\uD658" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/lb_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/lb_dlg.js new file mode 100755 index 000000000..3099001f1 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/lb_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('lb.searchreplace_dlg',{ +searchnext_desc:"Weidersichen", +notfound:"D'Sich ass um Enn ukomm. D'Zeechekette konnt net fonnt ginn.", +search_title:"Sichen", +replace_title:"Sichen/Ersetzen", +allreplaced:"All d'Virkomme vun der Zeechekette goufen ersat.", +findwhat:"Ze sichenden Text", +replacewith:"Ersetzen duerch", +direction:"Sichrichtung", +up:"No uewen", +down:"No \u00EBnnen", +mcase:"Grouss-/Klengschreiwung beuechten", +findnext:"Weidersichen", +replace:"Ersetzen", +replaceall:"All ersetzen" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/lt_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/lt_dlg.js new file mode 100755 index 000000000..234d23da3 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/lt_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('lt.searchreplace_dlg',{ +searchnext_desc:"Ie\u0161koti dar kart\u0105", +notfound:"Paie\u0161ka baigta. Paie\u0161kos fraz\u0117 nerasta.", +search_title:"Ie\u0161koti", +replace_title:"Ie\u0161koti/Pakeisti", +allreplaced:"Visi paie\u0161kos fraz\u0117s pasikartojimai pakeisti.", +findwhat:"Ko ie\u0161koti", +replacewith:"Kuo pakeisti", +direction:"Kryptis", +up:"\u012E vir\u0161\u0173", +down:"\u012E apa\u010Di\u0105", +mcase:"Visi\u0161kas atitikimas", +findnext:"Ie\u0161koti sek.", +replace:"Pakeisti", +replaceall:"Pakeisti visus" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/lv_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/lv_dlg.js new file mode 100755 index 000000000..febce65f6 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/lv_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('lv.searchreplace_dlg',{ +searchnext_desc:"Mekl\u0113t v\u0113lreiz", +notfound:"Mekl\u0113\u0161ana pabeigta. Mekl\u0113t\u0101 fr\u0101ze/v\u0101rds netika atrasta.", +search_title:"Mekl\u0113t", +replace_title:"Mekl\u0113t/Aizvietot", +allreplaced:"Visas fr\u0101zes/v\u0101rdi tika veiksm\u012Bgi aizvietoti.", +findwhat:"Ko atrast", +replacewith:"Aizvietot ar", +direction:"Virziens", +up:"Uz aug\u0161u", +down:"Uz leju", +mcase:"Re\u0123istrj\u016Bt\u012Bgs", +findnext:"Mekl\u0113t n\u0101kamo", +replace:"Aizvietot", +replaceall:"Aizvietot visu" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/mk_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/mk_dlg.js new file mode 100755 index 000000000..f8b1b2d55 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/mk_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('mk.searchreplace_dlg',{ +searchnext_desc:"Prona\u0111i opet", +notfound:"Pretra\u017Eivanje je zavr\u0161eno. Tra\u017Eeni tekst nije prona\u0111en.", +search_title:"Prona\u0111i", +replace_title:"Prona\u0111i/Zameni", +allreplaced:"Sva pojavljivanja tra\u017Eenog teksta su zamenjena.", +findwhat:"Prona\u0111i tekst", +replacewith:"Zameni sa", +direction:"Smjer", +up:"Gore", +down:"Dolje", +mcase:"Match case", +findnext:"Prona\u0111i sljede\u0107e", +replace:"Zameni", +replaceall:"Zameni sve" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ml_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ml_dlg.js new file mode 100755 index 000000000..4715f8af6 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ml_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ml.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/mn_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/mn_dlg.js new file mode 100755 index 000000000..b58c6e11c --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/mn_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('mn.searchreplace_dlg',{ +searchnext_desc:"\u0426\u0430\u0430\u0448 \u0445\u0430\u0439\u0445", +notfound:"\u0425\u0430\u0439\u043B\u0442 \u0442\u04E9\u0433\u0441\u0433\u04E9\u043B\u0434 \u0445\u04AF\u0440\u044D\u0432. \u0422\u044D\u043C\u0434\u044D\u0433\u0442 \u043C\u04E9\u0440 \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439.", +search_title:"\u0425\u0430\u0439\u0445", +replace_title:"\u0425\u0430\u0439\u0445/\u043E\u0440\u043B\u0443\u0443\u043B\u0430\u0445", +allreplaced:"\u0422\u044D\u043C\u0434\u044D\u0433\u0442 \u043C\u04E9\u0440\u0438\u0439\u043D \u0431\u04AF\u0445 \u0442\u043E\u0445\u0438\u043E\u043B\u0434\u043B\u0443\u0443\u0434 \u043E\u0440\u043B\u0443\u0443\u043B\u0430\u0433\u0434\u0441\u0430\u043D.", +findwhat:"\u0425\u0430\u0439\u0445 \u0431\u0438\u0447\u0432\u044D\u0440", +replacewith:"\u041E\u0440\u043B\u0443\u0443\u043B\u0430\u0433\u0430", +direction:"\u0425\u0430\u0439\u0445 \u0447\u0438\u0433\u043B\u044D\u043B", +up:"\u0413\u044D\u0434\u0440\u044D\u0433", +down:"\u0426\u0430\u0430\u0448", +mcase:"\u0422\u043E\u043C/\u0416\u0438\u0436\u0438\u0433 \u0431\u0438\u0447\u0438\u043B\u0442 \u044F\u043B\u0433\u0430\u0445", +findnext:"\u0426\u0430\u0430\u0448 \u0445\u0430\u0439\u0445", +replace:"\u041E\u0440\u043B\u0443\u0443\u043B", +replaceall:"\u0411\u04AF\u0433\u0434\u0438\u0439\u0433 \u043E\u0440\u043B\u0443\u0443\u043B" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ms_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ms_dlg.js new file mode 100755 index 000000000..7b1c9e2b7 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ms_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ms.searchreplace_dlg',{ +searchnext_desc:"Cari lagi", +notfound:"Carian tamat. Perkataan yang dicari tiada.", +search_title:"Cari", +replace_title:"Cari/Ganti", +allreplaced:"Kesemua perkataan telah digantikan.", +findwhat:"Cari apa", +replacewith:"Ganti dengan", +direction:"Arah", +up:"Atas", +down:"Bawah", +mcase:"Samakan kes", +findnext:"Carian seterusnya", +replace:"Ganti", +replaceall:"Ganti kesemuanya" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/nb_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/nb_dlg.js new file mode 100755 index 000000000..14242ab32 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/nb_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('nb.searchreplace_dlg',{ +searchnext_desc:"S\u00F8k igjen", +notfound:"S\u00F8ket er avsluttet. Fant ikke s\u00F8kestrengen.", +search_title:"S\u00F8k", +replace_title:"S\u00F8k/Erstatt", +allreplaced:"Alle forekomster av s\u00F8kestrengen er erstattet.", +findwhat:"Finn hva", +replacewith:"Erstatt med", +direction:"Retning", +up:"Oppover", +down:"Nedover", +mcase:"Skill mellom store og sm\u00E5 tegn", +findnext:"Finn neste", +replace:"Erstatt", +replaceall:"Erstatt alt" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/nl_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/nl_dlg.js new file mode 100755 index 000000000..00866e4ff --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/nl_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('nl.searchreplace_dlg',{ +searchnext_desc:"Opnieuw zoeken", +notfound:"Het doorzoeken is voltooid. De zoekterm kon niet meer worden gevonden.", +search_title:"Zoeken", +replace_title:"Zoeken/Vervangen", +allreplaced:"Alle instanties van de zoekterm zijn vervangen.", +findwhat:"Zoeken naar", +replacewith:"Vervangen door", +direction:"Richting", +up:"Omhoog", +down:"Omlaag", +mcase:"Identieke hoofdletters/kleine letters", +findnext:"Zoeken", +replace:"Vervangen", +replaceall:"Alles verv." +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/nn_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/nn_dlg.js new file mode 100755 index 000000000..6896f6adb --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/nn_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('nn.searchreplace_dlg',{ +searchnext_desc:"S\u00F8k igjen", +notfound:"S\u00F8ket avslutta. Fann ikkje s\u00F8kjestrengen.", +search_title:"S\u00F8k", +replace_title:"S\u00F8k/Erstatt", +allreplaced:"Alle f\u00F8rekomstar av s\u00F8kjestrengen er erstatta.", +findwhat:"Finn kva", +replacewith:"Erstatt med", +direction:"Retning", +up:"Oppover", +down:"Nedover", +mcase:"Skill mellom store og sm\u00E5 teikn", +findnext:"Finn neste", +replace:"Erstatt", +replaceall:"Erstatt alt" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/no_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/no_dlg.js new file mode 100755 index 000000000..4477793ff --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/no_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('no.searchreplace_dlg',{ +searchnext_desc:"S\u00F8k igjen", +notfound:"S\u00F8ket avsluttet. Fant ikke s\u00F8kestrengen.", +search_title:"S\u00F8k", +replace_title:"S\u00F8k/Erstatt", +allreplaced:"Alle forekomster av s\u00F8kestrengen er erstattet.", +findwhat:"Finn hva", +replacewith:"Erstatt med", +direction:"Retning", +up:"Oppover", +down:"Nedover", +mcase:"Skille mellom store og sm\u00E5 bokstaver", +findnext:"Finn neste", +replace:"Erstatt", +replaceall:"Erstatt alle" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/pl_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/pl_dlg.js new file mode 100755 index 000000000..cdab6a339 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/pl_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('pl.searchreplace_dlg',{ +searchnext_desc:"Znajd\u017A ponownie", +notfound:"Wyszukiwanie zako\u0144czone. Poszukiwany fragment nie zosta\u0142 znaleziony.", +search_title:"Znajd\u017A", +replace_title:"Znajd\u017A/Zamie\u0144", +allreplaced:"Wszystkie wyst\u0105pienia szukanego fragmentu zosta\u0142y zast\u0105pione.", +findwhat:"Znajd\u017A...", +replacewith:"Zamie\u0144 z...", +direction:"Kierunek", +up:"W g\u00F3r\u0119", +down:"W d\u00F3\u0142", +mcase:"Dopasuj wielko\u015B\u0107 liter", +findnext:"Znajd\u017A nast\u0119pny", +replace:"Zamie\u0144", +replaceall:"Zamien wszystko" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js new file mode 100755 index 000000000..8429408b9 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ps.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/pt_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/pt_dlg.js new file mode 100755 index 000000000..8de81d1e0 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/pt_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('pt.searchreplace_dlg',{ +searchnext_desc:"Localizar novamente", +notfound:"A pesquisa foi conclu\u00EDda sem resultados.", +search_title:"Localizar", +replace_title:"Localizar/substituir", +allreplaced:"Todas as substitui\u00E7\u00F5es foram efetuadas.", +findwhat:"Localizar", +replacewith:"Substituir com", +direction:"Dire\u00E7\u00E3o", +up:"Acima", +down:"Abaixo", +mcase:"Diferenciar mai\u00FAsculas", +findnext:"Localizar pr\u00F3ximo", +replace:"Substituir", +replaceall:"Substituir todos" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ro_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ro_dlg.js new file mode 100755 index 000000000..160111a20 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ro_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ro.searchreplace_dlg',{ +searchnext_desc:"Caut\u0103 din nou", +notfound:"C\u0103utarea a fost terminat\u0103. Nu am g\u0103sit termenul c\u0103utat.", +search_title:"Caut\u0103", +replace_title:"Caut\u0103/\u00EEnlocuie\u015Fte", +allreplaced:"Toate instan\u0163ele termenului c\u0103utat au fost \u00EEnlocuite.", +findwhat:"Termen c\u0103utat:", +replacewith:"\u00CEnlocuie\u015Fte cu:", +direction:"Direc\u0163ia", +up:"\u00CEn sus", +down:"\u00CEn jos", +mcase:"Conteaz\u0103 litere mici/mari?", +findnext:"Caut\u0103 urm\u0103torul", +replace:"\u00CEnlocuie\u015Fte", +replaceall:"\u00CEnlocuie\u015Fte toate" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ru_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ru_dlg.js new file mode 100755 index 000000000..86527fbf2 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ru_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ru.searchreplace_dlg',{ +searchnext_desc:"\u041D\u0430\u0439\u0442\u0438 \u0435\u0449\u0435", +notfound:"\u041F\u043E\u0438\u0441\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D. \u0421\u043E\u043E\u0442\u0432\u0435\u0441\u0442\u0432\u0438\u0439 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.", +search_title:"\u041F\u043E\u0438\u0441\u043A", +replace_title:"\u041F\u043E\u0438\u0441\u043A \u0438 \u0437\u0430\u043C\u0435\u043D\u0430", +allreplaced:"\u0412\u0441\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0431\u044B\u043B\u0438 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B.", +findwhat:"\u041F\u043E\u0438\u0441\u043A", +replacewith:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430", +direction:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435", +up:"\u0412\u0432\u0435\u0440\u0445 ", +down:"\u0412\u043D\u0438\u0437", +mcase:"\u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0440\u0435\u0433\u0438\u0441\u0442\u0440", +findnext:"\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435", +replace:"\u0417\u0430\u043C\u0435\u043D\u0430", +replaceall:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/sc_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/sc_dlg.js new file mode 100755 index 000000000..1b1dc5947 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/sc_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('sc.searchreplace_dlg',{ +searchnext_desc:"\u518D\u6B21\u67E5\u627E", +notfound:"\u67E5\u627E\u5DF2\u5B8C\u6210!\u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6807\u3002 ", +search_title:"\u67E5\u627E", +replace_title:"\u67E5\u627E/\u66FF\u6362", +allreplaced:"\u5DF2\u66FF\u6362\u6240\u6709\u5339\u914D\u7684\u7B26\u4E32.", +findwhat:"\u67E5\u627E\u76EE\u6807", +replacewith:"\u66FF\u6362\u4E3A", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5927\u5C0F\u5199\u5339\u914D", +findnext:"\u4E0B\u4E00\u4E2A", +replace:"\u66FF\u6362", +replaceall:"\u66FF\u6362\u5168\u90E8" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/se_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/se_dlg.js new file mode 100755 index 000000000..0daa0cbf5 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/se_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('se.searchreplace_dlg',{ +searchnext_desc:"S\u00F6k igen", +notfound:"S\u00F6kningen har slutf\u00F6rts. S\u00F6kstr\u00E4ngen kunde inte hittas.", +search_title:"S\u00F6k", +replace_title:"S\u00F6k/ers\u00E4tt", +allreplaced:"Alla st\u00E4llen d\u00E4r s\u00F6kstr\u00E4ngen kunde hittas har ersatts.", +findwhat:"Hitta vad", +replacewith:"Ers\u00E4tt med", +direction:"Riktning", +up:"Upp\u00E5t", +down:"Ner\u00E5t", +mcase:"Matcha gemener/versaler", +findnext:"Hitta n\u00E4sta", +replace:"Ers\u00E4tt", +replaceall:"Ers\u00E4tt alla" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/si_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/si_dlg.js new file mode 100755 index 000000000..36a3df7ef --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/si_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('si.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/sk_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/sk_dlg.js new file mode 100755 index 000000000..99443872d --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/sk_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('sk.searchreplace_dlg',{ +searchnext_desc:"H\u013Eada\u0165 \u010Falej", +notfound:"H\u013Eadanie bolo dokon\u010Den\u00E9. H\u013Eadan\u00FD text nebol n\u00E1jden\u00FD.", +search_title:"H\u013Eada\u0165", +replace_title:"H\u013Eada\u0165 a nahradi\u0165", +allreplaced:"V\u0161etky v\u00FDskyty boli nahraden\u00E9.", +findwhat:"H\u013Eada\u0165 \u010Do", +replacewith:"Nahradi\u0165 \u010D\u00EDm", +direction:"Smer", +up:"Nahor", +down:"Nadol", +mcase:"Rozli\u0161ova\u0165 mal\u00E9 a VE\u013DK\u00C9 p\u00EDsmen\u00E1", +findnext:"H\u013Eada\u0165 dalej", +replace:"Nahradi\u0165", +replaceall:"Nahradi\u0165 v\u0161etko" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/sl_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/sl_dlg.js new file mode 100755 index 000000000..32d6986de --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/sl_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('sl.searchreplace_dlg',{ +searchnext_desc:"Najdi znova", +notfound:"Preiskovanje zaklju\u010Deno. Iskanega besedila nisem na\u0161el.", +search_title:"Najdi", +replace_title:"Najdi/zamenjaj", +allreplaced:"Vse pojavitve iskanega besedila so bile zamenjane.", +findwhat:"I\u0161\u010Dem za", +replacewith:"Zamenjam z", +direction:"Smer", +up:"navzgor", +down:"navzdol", +mcase:"ujemanje velikosti", +findnext:"Najdi nasled.", +replace:"Zamenjaj", +replaceall:"Zamenjaj vse" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js new file mode 100755 index 000000000..1b806c8da --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('sq.searchreplace_dlg',{ +searchnext_desc:"K\u00EBrko p\u00EBrs\u00EBri", +notfound:"K\u00EBrkimi p\u00EBrfundoi dhe nuk ktheu asnj\u00EB rezultat.", +search_title:"K\u00EBrko", +replace_title:"K\u00EBrko/Z\u00EBvend\u00EBso", +allreplaced:"T\u00EB gjitha tekstet e gjetura u z\u00EBvend\u00EBsuan.", +findwhat:"K\u00EBrko p\u00EBr", +replacewith:"Z\u00EBvend\u00EBso me", +direction:"Drejtimi", +up:"Lart", +down:"Posht\u00EB", +mcase:"P\u00EBrshtat madh\u00EBsin\u00EB e g\u00EBrm\u00EBs", +findnext:"K\u00EBrko tjetr\u00EBn", +replace:"Z\u00EBvend\u00EBso", +replaceall:"Z\u00EBv. t\u00EB gjitha" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/sr_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/sr_dlg.js new file mode 100755 index 000000000..1116d5581 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/sr_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('sr.searchreplace_dlg',{ +searchnext_desc:"Prona\u0111i opet", +notfound:"Pretra\u017Eivanje je zavr\u0161eno. Tra\u017Eeni tekst nije prona\u0111en.", +search_title:"Prona\u0111i", +replace_title:"Prona\u0111i/Zameni", +allreplaced:"Sva pojavljivanja tra\u017Eenog teksta su zamenjena.", +findwhat:"Prona\u0111i tekst", +replacewith:"Zameni sa", +direction:"Smjer", +up:"Gore", +down:"Dolje", +mcase:"Match case", +findnext:"Prona\u0111i sljede\u0107e", +replace:"Zameni", +replaceall:"Zameni sve" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/sv_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/sv_dlg.js new file mode 100755 index 000000000..657a820aa --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/sv_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('sv.searchreplace_dlg',{ +searchnext_desc:"S\u00F6k igen", +notfound:"S\u00F6kningen har slutf\u00F6rts. S\u00F6kstr\u00E4ngen kunde inte hittas.", +search_title:"S\u00F6k", +replace_title:"S\u00F6k/ers\u00E4tt", +allreplaced:"Alla st\u00E4llen d\u00E4r s\u00F6kstr\u00E4ngen kunde hittas har ersatts.", +findwhat:"Hitta vad", +replacewith:"Ers\u00E4tt med", +direction:"Riktning", +up:"Upp\u00E5t", +down:"Ner\u00E5t", +mcase:"Matcha gemener/versaler", +findnext:"Hitta n\u00E4sta", +replace:"Ers\u00E4tt", +replaceall:"Ers\u00E4tt alla" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js new file mode 100755 index 000000000..b9a0ebcea --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ta.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/te_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/te_dlg.js new file mode 100755 index 000000000..cc4e81429 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/te_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('te.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/th_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/th_dlg.js new file mode 100755 index 000000000..254513072 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/th_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('th.searchreplace_dlg',{ +searchnext_desc:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07", +notfound:"\u0E01\u0E32\u0E23\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E2A\u0E34\u0E49\u0E19\u0E2A\u0E38\u0E14 \u0E40\u0E23\u0E32\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E2D\u0E30\u0E44\u0E23\u0E40\u0E25\u0E22", +search_title:"\u0E04\u0E49\u0E19\u0E2B\u0E32", +replace_title:"\u0E04\u0E49\u0E19\u0E2B\u0E32/\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48", +allreplaced:"\u0E17\u0E38\u0E01\u0E04\u0E33\u0E17\u0E35\u0E48\u0E43\u0E2A\u0E48\u0E16\u0E39\u0E01\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27", +findwhat:"\u0E04\u0E49\u0E19\u0E2B\u0E32", +replacewith:"\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48\u0E14\u0E49\u0E27\u0E22", +direction:"\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07", +up:"\u0E1A\u0E19", +down:"\u0E25\u0E48\u0E32\u0E07", +mcase:"\u0E40\u0E2B\u0E21\u0E37\u0E2D\u0E19\u0E17\u0E38\u0E01\u0E2D\u0E22\u0E48\u0E32\u0E07", +findnext:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E15\u0E48\u0E2D\u0E44\u0E1B", +replace:"\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48", +replaceall:"\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/tr_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/tr_dlg.js new file mode 100755 index 000000000..f04a83b3a --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/tr_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('tr.searchreplace_dlg',{ +searchnext_desc:"Tekrar ara", +notfound:"Arama tamamland\u0131. Aranan metin bulunamad\u0131.", +search_title:"Bul", +replace_title:"Bul/De\u011Fi\u015Ftir", +allreplaced:"Aranan metin bulundu\u011Fu yerlede de\u011Fi\u015Ftirildi.", +findwhat:"Aranan", +replacewith:"Yeni de\u011Fer", +direction:"Y\u00F6n", +up:"Yukar\u0131", +down:"A\u015Fa\u011F\u0131", +mcase:"B\u00FCy\u00FCk/k\u00FC\u00E7\u00FCk duyarl\u0131", +findnext:"Sonrakini bul", +replace:"De\u011Fi\u015Ftir", +replaceall:"T\u00FCm\u00FCn\u00FC de\u011Fi\u015Ftir" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/tt_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/tt_dlg.js new file mode 100755 index 000000000..454571675 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/tt_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('tt.searchreplace_dlg',{ +searchnext_desc:"\u518D\u6B21\u641C\u5C0B", +notfound:"\u641C\u5C0B\u5DF2\u5B8C\u6210 ! \u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6A19\u3002 ", +search_title:"\u641C\u5C0B", +replace_title:"\u641C\u5C0B/\u53D6\u4EE3", +allreplaced:"\u5DF2\u53D6\u4EE3\u6240\u6709\u5339\u914D\u7684\u5B57\u4E32.", +findwhat:"\u641C\u5C0B\u76EE\u6A19", +replacewith:"\u53D6\u4EE3\u7232", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5340\u5206\u5927\u5C0F\u5BEB", +findnext:"\u641C\u5C0B\u4E0B\u4E00\u500B", +replace:"\u53D6\u4EE3", +replaceall:"\u5168\u90E8\u53D6\u4EE3" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js new file mode 100755 index 000000000..a63eec0d8 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('tw.searchreplace_dlg',{ +searchnext_desc:"\u7E7C\u7E8C\u641C\u5C0B", +notfound:"\u641C\u5C0B\u5B8C\u7562\uFF0C\u6C92\u6709\u627E\u5230\u7B26\u5408\u7684\u5B57\u4E32\u3002", +search_title:"\u641C\u5C0B", +replace_title:"\u641C\u5C0B/\u66FF\u63DB", +allreplaced:"\u6240\u6709\u7B26\u5408\u7684\u5B57\u4E32\u5747\u5DF2\u66FF\u63DB\u3002", +findwhat:"\u641C\u5C0B\u76EE\u6A19", +replacewith:"\u66FF\u63DB\u70BA", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5340\u5206\u5927\u5C0F\u5BEB", +findnext:"\u641C\u5C0B\u4E0B\u4E00\u500B", +replace:"\u66FF\u63DB", +replaceall:"\u5168\u90E8\u66FF\u63DB" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/uk_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/uk_dlg.js new file mode 100755 index 000000000..8b4a22f02 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/uk_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('uk.searchreplace_dlg',{ +searchnext_desc:"\u0417\u043D\u0430\u0439\u0442\u0438 \u0449\u0435", +notfound:"\u041F\u043E\u0448\u0443\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E. \u041F\u043E\u0448\u0443\u043A\u043E\u0432\u0438\u0439 \u0440\u044F\u0434\u043E\u043A \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E.", +search_title:"\u0428\u0443\u043A\u0430\u0442\u0438", +replace_title:"\u0428\u0443\u043A\u0430\u0442\u0438/\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438", +allreplaced:"\u0412\u0441\u0456 \u0432\u0445\u043E\u0434\u0436\u0435\u043D\u043D\u044F \u0440\u044F\u0434\u043A\u0430 \u0431\u0443\u043B\u0438 \u0437\u0430\u043C\u0456\u043D\u0435\u043D\u0456.", +findwhat:"\u0417\u043D\u0430\u0439\u0442\u0438", +replacewith:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430", +direction:"\u041D\u0430\u043F\u0440\u044F\u043C\u043E\u043A \u043F\u043E\u0448\u0443\u043A\u0443", +up:"\u0412\u0433\u043E\u0440\u0443", +down:"\u0412\u043D\u0438\u0437", +mcase:"\u0412\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0454\u0441\u0442\u0440", +findnext:"\u0417\u043D\u0430\u0439\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0435", +replace:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438", +replaceall:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0441\u0435" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/ur_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/ur_dlg.js new file mode 100755 index 000000000..bb93e8517 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/ur_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('ur.searchreplace_dlg',{ +searchnext_desc:"Find again", +notfound:"The search has been completed. The search string could not be found.", +search_title:"Find", +replace_title:"Find/Replace", +allreplaced:"All occurrences of the search string were replaced.", +findwhat:"Find what", +replacewith:"Replace with", +direction:"Direction", +up:"Up", +down:"Down", +mcase:"Match case", +findnext:"Find next", +replace:"Replace", +replaceall:"Replace all" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/vi_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/vi_dlg.js new file mode 100755 index 000000000..bbcfcff40 --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/vi_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('vi.searchreplace_dlg',{ +searchnext_desc:"T\u00ECm l\u1EA1i", +notfound:"Vi\u1EC7c t\u00ECm ki\u1EBFm \u0111\u00E3 ho\u00E0n th\u00E0nh. Chu\u1ED7i t\u00ECm ki\u1EBFm kh\u00F4ng \u0111\u01B0\u1EE3c t\u00ECm th\u1EA5y.", +search_title:"T\u00ECm ki\u1EBFm", +replace_title:"T\u00ECm/Thay th\u1EBF", +allreplaced:"T\u1EA5t c\u1EA3 c\u00E1c l\u1EA7n xu\u1EA5t hi\u1EC7n c\u1EE7a c\u00E1c chu\u1ED7i t\u00ECm ki\u1EBFm \u0111\u01B0\u1EE3c thay th\u1EBF.", +findwhat:"T\u00ECm ki\u1EBFm g\u00EC", +replacewith:"Thay th\u1EBF v\u1EDBi", +direction:"H\u01B0\u1EDBng", +up:"L\u00EAn", +down:"Xu\u1ED1ng", +mcase:"Theo c\u1EA3 ch\u1EEF hoa", +findnext:"T\u00ECm k\u1EBF ti\u1EBFp", +replace:"Thay th\u1EBF", +replaceall:"Thay th\u1EBF t\u1EA5t" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/zh_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/zh_dlg.js new file mode 100755 index 000000000..56b4592ca --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/zh_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('zh.searchreplace_dlg',{ +searchnext_desc:"\u7E7C\u7E8C\u641C\u5C0B", +notfound:"\u641C\u5C0B\u5B8C\u7562\uFF0C\u6C92\u6709\u627E\u5230\u7B26\u5408\u7684\u5B57\u7B26\u4E32\u3002", +search_title:"\u641C\u5C0B", +replace_title:"\u641C\u5C0B/\u53D6\u4EE3", +allreplaced:"\u6240\u6709\u7B26\u5408\u7684\u5B57\u7B26\u4E32\u5747\u5DF2\u53D6\u4EE3\u3002", +findwhat:"\u641C\u5C0B\u76EE\u6A19", +replacewith:"\u53D6\u4EE3\u70BA", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5340\u5206\u5927\u5C0F\u5BEB", +findnext:"\u5C0B\u627E\u4E0B\u4E00\u500B", +replace:"\u53D6\u4EE3", +replaceall:"\u5168\u90E8\u53D6\u4EE3" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/searchreplace/langs/zu_dlg.js b/js/tiny_mce/plugins/searchreplace/langs/zu_dlg.js new file mode 100755 index 000000000..81ef7273b --- /dev/null +++ b/js/tiny_mce/plugins/searchreplace/langs/zu_dlg.js @@ -0,0 +1,16 @@ +tinyMCE.addI18n('zu.searchreplace_dlg',{ +searchnext_desc:"\u518D\u6B21\u67E5\u627E", +notfound:"\u67E5\u627E\u5DF2\u5B8C\u6210!\u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6807\u3002", +search_title:"\u67E5\u627E", +replace_title:"\u67E5\u627E/\u66FF\u6362", +allreplaced:"\u5DF2\u66FF\u6362\u6240\u6709\u5339\u914D\u7684\u7B26\u4E32.", +findwhat:"\u67E5\u627E\u76EE\u6807", +replacewith:"\u66FF\u6362\u4E3A", +direction:"\u65B9\u5411", +up:"\u5411\u4E0A", +down:"\u5411\u4E0B", +mcase:"\u5927\u5C0F\u5199\u5339\u914D", +findnext:"\u4E0B\u4E00\u4E2A", +replace:"\u66FF\u6362", +replaceall:"\u66FF\u6362\u5168\u90E8" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/css/props.css b/js/tiny_mce/plugins/style/css/props.css new file mode 100644 index 000000000..5550b093c --- /dev/null +++ b/js/tiny_mce/plugins/style/css/props.css @@ -0,0 +1,13 @@ +#text_font {width:250px;} +#text_size {width:70px;} +.mceAddSelectValue {background:#DDD;} +select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;} +#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;} +#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;} +#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;} +.panel_wrapper div.current {padding-top:10px;height:230px;} +.delim {border-left:1px solid gray;} +.tdelim {border-bottom:1px solid gray;} +#block_display {width:145px;} +#list_type {width:115px;} +.disabled {background:#EEE;} diff --git a/js/tiny_mce/plugins/style/editor_plugin.js b/js/tiny_mce/plugins/style/editor_plugin.js new file mode 100644 index 000000000..5027b1f7c --- /dev/null +++ b/js/tiny_mce/plugins/style/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:320+parseInt(a.getLang("style.delta_height",0)),inline:1},{plugin_url:b,style_text:a.selection.getNode().style.cssText})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/editor_plugin_src.js b/js/tiny_mce/plugins/style/editor_plugin_src.js new file mode 100644 index 000000000..ddbe50501 --- /dev/null +++ b/js/tiny_mce/plugins/style/editor_plugin_src.js @@ -0,0 +1,55 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.StylePlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceStyleProps', function() { + ed.windowManager.open({ + file : url + '/props.htm', + width : 480 + parseInt(ed.getLang('style.delta_width', 0)), + height : 320 + parseInt(ed.getLang('style.delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + style_text : ed.selection.getNode().style.cssText + }); + }); + + ed.addCommand('mceSetElementStyle', function(ui, v) { + if (e = ed.selection.getNode()) { + ed.dom.setAttrib(e, 'style', v); + ed.execCommand('mceRepaint'); + } + }); + + ed.onNodeChange.add(function(ed, cm, n) { + cm.setDisabled('styleprops', n.nodeName === 'BODY'); + }); + + // Register buttons + ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'}); + }, + + getInfo : function() { + return { + longname : 'Style', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/style', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/js/props.js b/js/tiny_mce/plugins/style/js/props.js new file mode 100644 index 000000000..c1cf6be83 --- /dev/null +++ b/js/tiny_mce/plugins/style/js/props.js @@ -0,0 +1,635 @@ +tinyMCEPopup.requireLangPack(); + +var defaultFonts = "" + + "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + + "Courier New, Courier, mono=Courier New, Courier, mono;" + + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + + "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + + "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + + "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif"; + +var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger"; +var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; +var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%"; +var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; +var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900"; +var defaultTextStyle = "normal;italic;oblique"; +var defaultVariant = "normal;small-caps"; +var defaultLineHeight = "normal"; +var defaultAttachment = "fixed;scroll"; +var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y"; +var defaultPosH = "left;center;right"; +var defaultPosV = "top;center;bottom"; +var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom"; +var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none"; +var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset"; +var defaultBorderWidth = "thin;medium;thick"; +var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none"; + +function init() { + var ce = document.getElementById('container'), h; + + ce.style.cssText = tinyMCEPopup.getWindowArg('style_text'); + + h = getBrowserHTML('background_image_browser','background_image','image','advimage'); + document.getElementById("background_image_browser").innerHTML = h; + + document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color'); + document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color'); + document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top'); + document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right'); + document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom'); + document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left'); + + fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true); + fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true); + fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true); + fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true); + fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true); + fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true); + fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true); + fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true); + fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true); + + fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true); + fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true); + + fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true); + fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true); + fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true); + fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true); + fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true); + fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true); + fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true); + fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true); + fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true); + + fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true); + fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true); + fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true); + fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true); + + fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true); + fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true); + + fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true); + fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true); + + fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true); + fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true); + + fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true); + + fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true); + + fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true); + fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true); + + TinyMCE_EditableSelects.init(); + setupFormData(); + showDisabledControls(); +} + +function setupFormData() { + var ce = document.getElementById('container'), f = document.forms[0], s, b, i; + + // Setup text fields + + selectByValue(f, 'text_font', ce.style.fontFamily, true, true); + selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true); + selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize)); + selectByValue(f, 'text_weight', ce.style.fontWeight, true, true); + selectByValue(f, 'text_style', ce.style.fontStyle, true, true); + selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true); + selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight)); + selectByValue(f, 'text_case', ce.style.textTransform, true, true); + selectByValue(f, 'text_variant', ce.style.fontVariant, true, true); + f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color); + updateColor('text_color_pick', 'text_color'); + f.text_underline.checked = inStr(ce.style.textDecoration, 'underline'); + f.text_overline.checked = inStr(ce.style.textDecoration, 'overline'); + f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through'); + f.text_blink.checked = inStr(ce.style.textDecoration, 'blink'); + + // Setup background fields + + f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor); + updateColor('background_color_pick', 'background_color'); + f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true); + selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true); + selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true); + selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0))); + selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true); + selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1))); + + // Setup block fields + + selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true); + selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing)); + selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true); + selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing)); + selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true); + selectByValue(f, 'block_text_align', ce.style.textAlign, true, true); + f.block_text_indent.value = getNum(ce.style.textIndent); + selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent)); + selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true); + selectByValue(f, 'block_display', ce.style.display, true, true); + + // Setup box fields + + f.box_width.value = getNum(ce.style.width); + selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width)); + + f.box_height.value = getNum(ce.style.height); + selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height)); + selectByValue(f, 'box_float', ce.style.cssFloat || ce.style.styleFloat, true, true); + + selectByValue(f, 'box_clear', ce.style.clear, true, true); + + setupBox(f, ce, 'box_padding', 'padding', ''); + setupBox(f, ce, 'box_margin', 'margin', ''); + + // Setup border fields + + setupBox(f, ce, 'border_style', 'border', 'Style'); + setupBox(f, ce, 'border_width', 'border', 'Width'); + setupBox(f, ce, 'border_color', 'border', 'Color'); + + updateColor('border_color_top_pick', 'border_color_top'); + updateColor('border_color_right_pick', 'border_color_right'); + updateColor('border_color_bottom_pick', 'border_color_bottom'); + updateColor('border_color_left_pick', 'border_color_left'); + + f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value); + f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value); + f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value); + f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value); + + // Setup list fields + + selectByValue(f, 'list_type', ce.style.listStyleType, true, true); + selectByValue(f, 'list_position', ce.style.listStylePosition, true, true); + f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + + // Setup box fields + + selectByValue(f, 'positioning_type', ce.style.position, true, true); + selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true); + selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true); + f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : ""; + + f.positioning_width.value = getNum(ce.style.width); + selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width)); + + f.positioning_height.value = getNum(ce.style.height); + selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height)); + + setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']); + + s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1"); + s = s.replace(/,/g, ' '); + + if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) { + f.positioning_clip_top.value = getNum(getVal(s, 0)); + selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); + f.positioning_clip_right.value = getNum(getVal(s, 1)); + selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1))); + f.positioning_clip_bottom.value = getNum(getVal(s, 2)); + selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2))); + f.positioning_clip_left.value = getNum(getVal(s, 3)); + selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3))); + } else { + f.positioning_clip_top.value = getNum(getVal(s, 0)); + selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); + f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value; + } + +// setupBox(f, ce, '', 'border', 'Color'); +} + +function getMeasurement(s) { + return s.replace(/^([0-9.]+)(.*)$/, "$2"); +} + +function getNum(s) { + if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s)) + return s.replace(/[^0-9.]/g, ''); + + return s; +} + +function inStr(s, n) { + return new RegExp(n, 'gi').test(s); +} + +function getVal(s, i) { + var a = s.split(' '); + + if (a.length > 1) + return a[i]; + + return ""; +} + +function setValue(f, n, v) { + if (f.elements[n].type == "text") + f.elements[n].value = v; + else + selectByValue(f, n, v, true, true); +} + +function setupBox(f, ce, fp, pr, sf, b) { + if (typeof(b) == "undefined") + b = ['Top', 'Right', 'Bottom', 'Left']; + + if (isSame(ce, pr, sf, b)) { + f.elements[fp + "_same"].checked = true; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + f.elements[fp + "_right"].value = ""; + f.elements[fp + "_right"].disabled = true; + f.elements[fp + "_bottom"].value = ""; + f.elements[fp + "_bottom"].disabled = true; + f.elements[fp + "_left"].value = ""; + f.elements[fp + "_left"].disabled = true; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + f.elements[fp + "_left_measurement"].disabled = true; + f.elements[fp + "_bottom_measurement"].disabled = true; + f.elements[fp + "_right_measurement"].disabled = true; + } + } else { + f.elements[fp + "_same"].checked = false; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); + f.elements[fp + "_right"].disabled = false; + + setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); + f.elements[fp + "_bottom"].disabled = false; + + setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left"].disabled = false; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); + selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); + selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left_measurement"].disabled = false; + f.elements[fp + "_bottom_measurement"].disabled = false; + f.elements[fp + "_right_measurement"].disabled = false; + } + } +} + +function isSame(e, pr, sf, b) { + var a = [], i, x; + + if (typeof(b) == "undefined") + b = ['Top', 'Right', 'Bottom', 'Left']; + + if (typeof(sf) == "undefined" || sf == null) + sf = ""; + + a[0] = e.style[pr + b[0] + sf]; + a[1] = e.style[pr + b[1] + sf]; + a[2] = e.style[pr + b[2] + sf]; + a[3] = e.style[pr + b[3] + sf]; + + for (i=0; i<a.length; i++) { + if (a[i] == null) + return false; + + for (x=0; x<a.length; x++) { + if (a[x] != a[i]) + return false; + } + } + + return true; +}; + +function hasEqualValues(a) { + var i, x; + + for (i=0; i<a.length; i++) { + if (a[i] == null) + return false; + + for (x=0; x<a.length; x++) { + if (a[x] != a[i]) + return false; + } + } + + return true; +} + +function applyAction() { + var ce = document.getElementById('container'), ed = tinyMCEPopup.editor; + + generateCSS(); + + tinyMCEPopup.restoreSelection(); + ed.dom.setAttrib(ed.selection.getNode(), 'style', tinyMCEPopup.editor.dom.serializeStyle(tinyMCEPopup.editor.dom.parseStyle(ce.style.cssText))); +} + +function updateAction() { + applyAction(); + tinyMCEPopup.close(); +} + +function generateCSS() { + var ce = document.getElementById('container'), f = document.forms[0], num = new RegExp('[0-9]+', 'g'), s, t; + + ce.style.cssText = ""; + + // Build text styles + ce.style.fontFamily = f.text_font.value; + ce.style.fontSize = f.text_size.value + (isNum(f.text_size.value) ? (f.text_size_measurement.value || 'px') : ""); + ce.style.fontStyle = f.text_style.value; + ce.style.lineHeight = f.text_lineheight.value + (isNum(f.text_lineheight.value) ? f.text_lineheight_measurement.value : ""); + ce.style.textTransform = f.text_case.value; + ce.style.fontWeight = f.text_weight.value; + ce.style.fontVariant = f.text_variant.value; + ce.style.color = f.text_color.value; + + s = ""; + s += f.text_underline.checked ? " underline" : ""; + s += f.text_overline.checked ? " overline" : ""; + s += f.text_linethrough.checked ? " line-through" : ""; + s += f.text_blink.checked ? " blink" : ""; + s = s.length > 0 ? s.substring(1) : s; + + if (f.text_none.checked) + s = "none"; + + ce.style.textDecoration = s; + + // Build background styles + + ce.style.backgroundColor = f.background_color.value; + ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; + ce.style.backgroundRepeat = f.background_repeat.value; + ce.style.backgroundAttachment = f.background_attachment.value; + + if (f.background_hpos.value != "") { + s = ""; + s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; + s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); + ce.style.backgroundPosition = s; + } + + // Build block styles + + ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); + ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); + ce.style.verticalAlign = f.block_vertical_alignment.value; + ce.style.textAlign = f.block_text_align.value; + ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); + ce.style.whiteSpace = f.block_whitespace.value; + ce.style.display = f.block_display.value; + + // Build box styles + + ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); + ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); + ce.style.styleFloat = f.box_float.value; + ce.style.cssFloat = f.box_float.value; + + ce.style.clear = f.box_clear.value; + + if (!f.box_padding_same.checked) { + ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); + ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); + ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); + } else + ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + + if (!f.box_margin_same.checked) { + ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); + ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); + ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); + } else + ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + + // Build border styles + + if (!f.border_style_same.checked) { + ce.style.borderTopStyle = f.border_style_top.value; + ce.style.borderRightStyle = f.border_style_right.value; + ce.style.borderBottomStyle = f.border_style_bottom.value; + ce.style.borderLeftStyle = f.border_style_left.value; + } else + ce.style.borderStyle = f.border_style_top.value; + + if (!f.border_width_same.checked) { + ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); + ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); + ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); + } else + ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + + if (!f.border_color_same.checked) { + ce.style.borderTopColor = f.border_color_top.value; + ce.style.borderRightColor = f.border_color_right.value; + ce.style.borderBottomColor = f.border_color_bottom.value; + ce.style.borderLeftColor = f.border_color_left.value; + } else + ce.style.borderColor = f.border_color_top.value; + + // Build list styles + + ce.style.listStyleType = f.list_type.value; + ce.style.listStylePosition = f.list_position.value; + ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; + + // Build positioning styles + + ce.style.position = f.positioning_type.value; + ce.style.visibility = f.positioning_visibility.value; + + if (ce.style.width == "") + ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); + + if (ce.style.height == "") + ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); + + ce.style.zIndex = f.positioning_zindex.value; + ce.style.overflow = f.positioning_overflow.value; + + if (!f.positioning_placement_same.checked) { + ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); + ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); + ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); + } else { + s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.top = s; + ce.style.right = s; + ce.style.bottom = s; + ce.style.left = s; + } + + if (!f.positioning_clip_same.checked) { + s = "rect("; + s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); + s += ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } else { + s = "rect("; + t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; + s += t + " "; + s += t + " "; + s += t + " "; + s += t + ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } + + ce.style.cssText = ce.style.cssText; +} + +function isNum(s) { + return new RegExp('[0-9]+', 'g').test(s); +} + +function showDisabledControls() { + var f = document.forms, i, a; + + for (i=0; i<f.length; i++) { + for (a=0; a<f[i].elements.length; a++) { + if (f[i].elements[a].disabled) + tinyMCEPopup.editor.dom.addClass(f[i].elements[a], "disabled"); + else + tinyMCEPopup.editor.dom.removeClass(f[i].elements[a], "disabled"); + } + } +} + +function fillSelect(f, s, param, dval, sep, em) { + var i, ar, p, se; + + f = document.forms[f]; + sep = typeof(sep) == "undefined" ? ";" : sep; + + if (em) + addSelectValue(f, s, "", ""); + + ar = tinyMCEPopup.getParam(param, dval).split(sep); + for (i=0; i<ar.length; i++) { + se = false; + + if (ar[i].charAt(0) == '+') { + ar[i] = ar[i].substring(1); + se = true; + } + + p = ar[i].split('='); + + if (p.length > 1) { + addSelectValue(f, s, p[0], p[1]); + + if (se) + selectByValue(f, s, p[1]); + } else { + addSelectValue(f, s, p[0], p[0]); + + if (se) + selectByValue(f, s, p[0]); + } + } +} + +function toggleSame(ce, pre) { + var el = document.forms[0].elements, i; + + if (ce.checked) { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = true; + el[pre + "_bottom"].disabled = true; + el[pre + "_left"].disabled = true; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = true; + el[pre + "_bottom_measurement"].disabled = true; + el[pre + "_left_measurement"].disabled = true; + } + } else { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = false; + el[pre + "_bottom"].disabled = false; + el[pre + "_left"].disabled = false; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = false; + el[pre + "_bottom_measurement"].disabled = false; + el[pre + "_left_measurement"].disabled = false; + } + } + + showDisabledControls(); +} + +function synch(fr, to) { + var f = document.forms[0]; + + f.elements[to].value = f.elements[fr].value; + + if (f.elements[fr + "_measurement"]) + selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/style/langs/ar_dlg.js b/js/tiny_mce/plugins/style/langs/ar_dlg.js new file mode 100755 index 000000000..448d4401a --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"\u064a\u0633\u0627\u0631",bottom:"\u0627\u0633\u0641\u0644",right:"\u064a\u0645\u064a\u0646",top:"\u0627\u0644\u0627\u0639\u0644\u0649",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/az_dlg.js b/js/tiny_mce/plugins/style/langs/az_dlg.js new file mode 100755 index 000000000..5d52d9b9f --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.style_dlg',{text_lineheight:"S\u0259tr h\u00fcnd\u00fcrl\u00fcy\u00fc",text_variant:"Variant",text_style:"Stil",text_weight:"\u00c7\u0259kisi",text_size:"\u00d6l\u00e7\u00fcs\u00fc",text_font:"\u015erift",text_props:"M\u0259tn",positioning_tab:"M\u00f6vqe",list_tab:"Siyah\u0131",border_tab:"S\u0259rh\u0259d",box_tab:"Konteyner",block_tab:"Blok",background_tab:"Fon",text_tab:"M\u0259tn",apply:"T\u0259tbiq et",title:"CSS stili redakt\u0259 et",clip:"K\u0259sm\u0259k",placement:"Yerl\u0259\u015fdirm\u0259",overflow:"Axma",zindex:"Z-indeks",visibility:"G\u00f6r\u00fcn\u00fc\u015f",positioning_type:"N\u00f6v",position:"M\u00f6vqe",bullet_image:"Marker \u015f\u0259kli",list_type:"N\u00f6v",color:"R\u0259ng",height:"H\u00fcnd\u00fcrl\u00fck",width:"En",style:"Stil",margin:"Sah\u0259l\u0259r",left:"Soldan",bottom:"A\u015fa\u011f\u0131dan",right:"Sa\u011fdan",top:"Yuxar\u0131dan",same:"Ham\u0131s\u0131 \u00fc\u00e7\u00fcn eyni",padding:"Doldurma",box_clear:"T\u0259mizl\u0259",box_float:"\u00dcz\u0259n",box_height:"Uzunlu\u011fu",box_width:"Eni",block_display:"N\u00fcmayis",block_whitespace:"Bo\u015fluq",block_text_indent:"M\u0259tn bo\u015flu\u011fu",block_text_align:"M\u0259tn tara\u015fla\u015fd\u0131r\u0131lmas\u0131",block_vertical_alignment:"\u015eaquli tarazla\u015fd\u0131r\u0131lma",block_letterspacing:"Simvol aras\u0131 bo\u015fluqlar",block_wordspacing:"S\u00f6zaras\u0131 bo\u015fluqlar",background_vpos:"\u015eaquli m\u00f6vqe",background_hpos:"\u00dcf\u00fcqi m\u00f6vqe",background_attachment:"B\u0259rkitm\u0259k",background_repeat:"T\u0259krar",background_image:"fon \u015f\u0259kli",background_color:"Fon r\u0259ngi",text_none:"he\u00e7 biri",text_blink:"Yan\u0131b-s\u00f6n\u0259n",text_case:"Registr",text_striketrough:"\u00fcst\u00fcnd\u0259n x\u0259tt",text_underline:"alt\u0131ndan x\u0259tt",text_overline:"\u00fcz\u0259rind\u0259n x\u0259tt",text_decoration:"B\u0259z\u0259k",text_color:"\u015e\u0259kil"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/be_dlg.js b/js/tiny_mce/plugins/style/langs/be_dlg.js new file mode 100755 index 000000000..d497669e6 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.style_dlg',{text_lineheight:"\u0412\u044b\u0448\u044b\u043d\u044f \u0440\u0430\u0434\u043a\u0430",text_variant:"\u041d\u0430\u043f\u0456\u0441\u0430\u043d\u043d\u0435",text_style:"\u0421\u0442\u044b\u043b\u044c",text_weight:"\u0412\u0430\u0433\u0430",text_size:"\u041f\u0430\u043c\u0435\u0440",text_font:"\u0428\u0440\u044b\u0444\u0442",text_props:"\u0422\u044d\u043a\u0441\u0442",positioning_tab:"\u041f\u0430\u0437\u0456\u0446\u044b\u044f\u043d\u0430\u0432\u0430\u043d\u043d\u0435",list_tab:"\u0421\u043f\u0456\u0441",border_tab:"\u041c\u044f\u0436\u0430",box_tab:"\u041a\u0430\u043d\u0442\u044d\u0439\u043d\u0435\u0440",block_tab:"\u0411\u043b\u043e\u043a",background_tab:"\u0424\u043e\u043d",text_tab:"\u0422\u044d\u043a\u0441\u0442",apply:"\u0423\u0436\u044b\u0446\u044c",title:"\u0420\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u0441\u0442\u044b\u043b\u044c CSS",clip:"\u0410\u0431\u0440\u0430\u0437\u0430\u043d\u043d\u0435",placement:"\u0420\u0430\u0437\u043c\u044f\u0448\u0447\u044d\u043d\u043d\u0435",overflow:"\u0410\u0431\u0446\u044f\u0447\u044d\u043d\u043d\u0435",zindex:"Z-\u0430\u0437\u043d\u0430\u0447\u043d\u0456\u043a",visibility:"\u0411\u0430\u0447\u043d\u0430\u0441\u0446\u044c",positioning_type:"\u0422\u044b\u043f",position:"\u041f\u0430\u0437\u0456\u0446\u044b\u044f",bullet_image:"\u041c\u0430\u043b\u044e\u043d\u0430\u043a \u043c\u0430\u0440\u043a\u0435\u0440\u0430",list_type:"\u0422\u044b\u043f",color:"\u041a\u043e\u043b\u0435\u0440",height:"\u0412\u044b\u0448\u044b\u043d\u044f",width:"\u0428\u044b\u0440\u044b\u043d\u044f",style:"\u0421\u0442\u044b\u043b\u044c",margin:"\u041f\u0430\u043b\u0456",left:"\u0417\u043b\u0435\u0432\u0430",bottom:"\u0417\u043d\u0456\u0437\u0443",right:"\u0421\u043f\u0440\u0430\u0432\u0430",top:"\u0417\u0432\u0435\u0440\u0445\u0443",same:"\u0410\u0434\u043d\u043e\u043b\u044c\u043a\u0430\u0432\u0430 \u0434\u043b\u044f \u045e\u0441\u0456\u0445",padding:"\u041d\u0430\u0431\u0456\u0432\u0430\u043d\u043d\u0435",box_clear:"\u0410\u0447\u044b\u0441\u0446\u0456\u0446\u044c",box_float:"\u042f\u043a\u043e\u0435 \u043f\u043b\u0430\u0432\u0430\u0435",box_height:"\u0412\u044b\u0448\u044b\u043d\u044f",box_width:"\u0428\u044b\u0440\u044b\u043d\u044f",block_display:"\u0410\u0434\u043b\u044e\u0441\u0442\u0440\u0430\u0432\u0430\u043d\u043d\u0435",block_whitespace:"\u041f\u0440\u0430\u0431\u0435\u043b",block_text_indent:"\u0412\u043e\u0434\u0441\u0442\u0443\u043f \u0442\u044d\u043a\u0441\u0442\u0443",block_text_align:"\u0412\u044b\u0440\u0430\u045e\u043d\u043e\u045e\u0432\u0430\u043d\u043d\u0435 \u0442\u044d\u043a\u0441\u0442\u0443",block_vertical_alignment:"\u0412\u0435\u0440\u0442\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u0435 \u0432\u044b\u0440\u0430\u045e\u043d\u043e\u045e\u0432\u0430\u043d\u043d\u0435",block_letterspacing:"\u041f\u0440\u0430\u043c\u0435\u0436\u043a\u0456 \u043f\u0430\u043c\u0456\u0436 \u0437\u043d\u0430\u043a\u0430\u043c\u0456",block_wordspacing:"\u041f\u0440\u0430\u043c\u0435\u0436\u043a\u0456 \u043f\u0430\u043c\u0456\u0436 \u0441\u043b\u043e\u0432\u0430\u043c\u0456",background_vpos:"\u0412\u0435\u0440\u0442\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0437\u0456\u0446\u044b\u044f",background_hpos:"\u0413\u0430\u0440\u044b\u0437\u0430\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0437\u0456\u0446\u044b\u044f",background_attachment:"\u041f\u0440\u044b\u043c\u0430\u0446\u0430\u0432\u0430\u043d\u043d\u0435",background_repeat:"\u041f\u0430\u045e\u0442\u043e\u0440",background_image:"\u0424\u043e\u043d\u0430\u0432\u044b \u043c\u0430\u043b\u044e\u043d\u0430\u043a",background_color:"\u041a\u043e\u043b\u0435\u0440 \u0444\u043e\u043d\u0443",text_none:"\u043d\u0456\u044f\u043a\u0430\u0433\u0430",text_blink:"\u044f\u043a\u0456 \u043c\u0456\u0433\u0446\u0456\u0446\u044c",text_case:"\u0420\u044d\u0433\u0456\u0441\u0442\u0440",text_striketrough:"\u043f\u0435\u0440\u0430\u043a\u0440\u044d\u0441\u043b\u0435\u043d\u044b",text_underline:"\u043f\u0430\u0434\u043a\u0440\u044d\u0441\u043b\u0435\u043d\u044b",text_overline:"\u043d\u0430\u0434\u043a\u0440\u044d\u0441\u043b\u0435\u043d\u044b",text_decoration:"\u0423\u043f\u0440\u044b\u0433\u043e\u0436\u0432\u0430\u043d\u043d\u0435",text_color:"\u041a\u043e\u043b\u0435\u0440"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/bg_dlg.js b/js/tiny_mce/plugins/style/langs/bg_dlg.js new file mode 100755 index 000000000..e12c15d2f --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.style_dlg',{text_lineheight:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430",text_variant:"\u041f\u0440\u043e\u043c\u0435\u043d\u043b\u0438\u0432",text_style:"\u0421\u0442\u0438\u043b",text_weight:"\u0422\u0435\u0433\u043b\u043e",text_size:"\u0420\u0430\u0437\u043c\u0435\u0440",text_font:"\u0428\u0440\u0438\u0444\u0442",text_props:"\u0422\u0435\u043a\u0441\u0442",positioning_tab:"\u041f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0430\u043d\u0435",list_tab:"\u0421\u043f\u0438\u0441\u044a\u043a",border_tab:"\u0420\u0430\u043c\u043a\u0430",box_tab:"\u041a\u0443\u0442\u0438\u044f",block_tab:"\u0411\u043b\u043e\u043a",background_tab:"\u0424\u043e\u043d",text_tab:"\u0422\u0435\u043a\u0441\u0442",apply:"\u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438",title:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 CSS \u0441\u0442\u0438\u043b",clip:"\u041e\u0442\u0440\u0435\u0436\u0438",placement:"\u0420\u0430\u0437\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435",overflow:"Overflow",zindex:"Z-index",visibility:"\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442",positioning_type:"\u0422\u0438\u043f",position:"\u041f\u043e\u0437\u0438\u0446\u0438\u044f",bullet_image:"\u0413\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0432\u043e\u0434\u0430\u0447\u0438\u0442\u0435",list_type:"\u0422\u0438\u043f",color:"\u0426\u0432\u044f\u0442",height:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",style:"\u0421\u0442\u0438\u043b",margin:"Margin",left:"\u041b\u044f\u0432\u043e",bottom:"\u0414\u043e\u043b\u0443",right:"\u0414\u044f\u0441\u043d\u043e",top:"\u0413\u043e\u0440\u0435",same:"\u0417\u0430 \u0432\u0441\u0438\u0447\u043a\u0438",padding:"Padding",box_clear:"\u0418\u0437\u0447\u0438\u0441\u0442\u0438",box_float:"Float",box_height:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",box_width:"\u0428\u0438\u0440\u0438\u043d\u0430",block_display:"\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435",block_whitespace:"\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b",block_text_indent:"\u041e\u0442\u0441\u0442\u044a\u043f \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430",block_text_align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430",block_vertical_alignment:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",block_letterspacing:"\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0431\u0443\u043a\u0432\u0438\u0442\u0435",block_wordspacing:"\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0443\u043c\u0438\u0442\u0435",background_vpos:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f",background_hpos:"\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f",background_attachment:"\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u0438",background_repeat:"\u041f\u043e\u0432\u0442\u043e\u0440\u0438",background_image:"\u0424\u043e\u043d\u043e\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",background_color:"\u0424\u043e\u043d\u0438\u0432 \u0446\u0432\u044f\u0442",text_none:"\u043d\u0438\u0449\u043e",text_blink:"\u043c\u0438\u0433\u0430",text_case:"\u0420\u0435\u0433\u0438\u0441\u0442\u044a\u0440",text_striketrough:"\u0437\u0430\u0447\u0435\u0440\u0442\u0430\u043d",text_underline:"\u043f\u043e\u0434\u0447\u0435\u0440\u0442\u0430\u043d",text_overline:"\u043d\u0430\u0434\u0447\u0435\u0440\u0442\u0430\u043d",text_decoration:"\u0414\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u044f",text_color:"\u0426\u0432\u044f\u0442"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/bn_dlg.js b/js/tiny_mce/plugins/style/langs/bn_dlg.js new file mode 100755 index 000000000..b8eb00c27 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.style_dlg',{"text_lineheight":"Line height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text indent","block_text_align":"Text align","block_vertical_alignment":"Vertical alignment","block_letterspacing":"Letter spacing","block_wordspacing":"Word spacing","background_vpos":"Vertical position","background_hpos":"Horizontal position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background image","background_color":"Background color","text_none":"none","text_blink":"blink","text_case":"Case","text_striketrough":"strikethrough","text_underline":"underline","text_overline":"overline","text_decoration":"Decoration","text_color":"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/br_dlg.js b/js/tiny_mce/plugins/style/langs/br_dlg.js new file mode 100755 index 000000000..c18da7133 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.style_dlg',{text_lineheight:"Altura da linha",text_variant:"Variante",text_style:"Estilo",text_weight:"Peso",text_size:"Tamanho",text_font:"Fonte",text_props:"Texto",positioning_tab:"Posicionamento",list_tab:"Lista",border_tab:"Limites",box_tab:"Caixa",block_tab:"Bloco",background_tab:"Fundo",text_tab:"Texto",apply:"Aplicar",title:"Editar CSS",clip:"Clip",placement:"Posicionamento",overflow:"Overflow",zindex:"Z-index",visibility:"Visibilidade",positioning_type:"Tipo",position:"Posi\u00e7\u00e3o",bullet_image:"Imagem de lista",list_type:"Tipo",color:"Cor",height:"Altura",width:"Largura",style:"Estilo",margin:"Margem",left:"Esquerda",bottom:"Abaixo",right:"Direita",top:"Topo",same:"O mesmo para todos",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Altura",box_width:"Largura",block_display:"Display",block_whitespace:"Espa\u00e7o",block_text_indent:"Indent",block_text_align:"Alinhamento de texto",block_vertical_alignment:"Alinhamento vertical",block_letterspacing:"Espa\u00e7amento de letras",block_wordspacing:"Espa\u00e7amento de palavras",background_vpos:"Posi\u00e7\u00e3o vertical",background_hpos:"Posi\u00e7\u00e3o horizontal",background_attachment:"Fixar",background_repeat:"Repetir",background_image:"Imagem de fundo",background_color:"Cor de fundo",text_none:"nenhum",text_blink:"Piscar",text_case:"Mai\u00fascula/min\u00fascula",text_striketrough:"Riscado",text_underline:"Sublinhado",text_overline:"Sobrelinha",text_decoration:"Decora\u00e7\u00e3o",text_color:"Cor"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/bs_dlg.js b/js/tiny_mce/plugins/style/langs/bs_dlg.js new file mode 100755 index 000000000..51d2e1610 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ca_dlg.js b/js/tiny_mce/plugins/style/langs/ca_dlg.js new file mode 100755 index 000000000..a6b25e476 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.style_dlg',{"text_lineheight":"Al\u00e7ada de l\u00ednia","text_variant":"Variant","text_style":"Estil","text_weight":"Pes","text_size":"Mida","text_font":"Font","text_props":"Text","positioning_tab":"Posicionament","list_tab":"Llista","border_tab":"Contorn","box_tab":"Quadre","block_tab":"Bloc","background_tab":"Fons","text_tab":"Text",apply:"Aplica",title:"Edita l\'estil CSS",clip:"Retall",placement:"Empla\u00e7ament",overflow:"Desbordament",zindex:"\u00cdndex Z",visibility:"Visibilitat","positioning_type":"Tipus",position:"Posici\u00f3","bullet_image":"Imatge pic","list_type":"Tipus",color:"Color",height:"Al\u00e7ada",width:"Amplada",style:"Estil",margin:"Marge",left:"Esquerra",bottom:"Avall",right:"Dreta",top:"Dalt",same:"Igual per a tot",padding:"Separaci\u00f3","box_clear":"Buida","box_float":"Flota","box_height":"Al\u00e7ada","box_width":"Amplada","block_display":"Visualitzaci\u00f3","block_whitespace":"Espai en blanc","block_text_indent":"Sagna el text","block_text_align":"Alinea el text","block_vertical_alignment":"Alineaci\u00f3 vertical","block_letterspacing":"Espaiat entre lletres","block_wordspacing":"Espaiat entre paraules","background_vpos":"Posici\u00f3 vertical","background_hpos":"Posici\u00f3 horitzontal","background_attachment":"Adjunt","background_repeat":"Repeteix","background_image":"Imatge de fons","background_color":"Color de fons","text_none":"cap","text_blink":"parpelleig","text_case":"Cas","text_striketrough":"barrat","text_underline":"subratllat","text_overline":"sobreratllat","text_decoration":"Decoraci\u00f3","text_color":"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ch_dlg.js b/js/tiny_mce/plugins/style/langs/ch_dlg.js new file mode 100755 index 000000000..e99e154e2 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u53d8\u91cf",text_style:"\u6837\u5f0f",text_weight:"\u5b57\u91cd",text_size:"\u6587\u5b57\u5927\u5c0f",text_font:"\u5b57\u4f53",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u8fb9\u6846",box_tab:"\u65b9\u5757",block_tab:"\u533a\u5757",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u5957\u7528",title:"\u7f16\u8f91 CSS \u6837\u5f0f\u8868",clip:"\u526a\u8f91",placement:"\u653e\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z-\u5750\u6807",visibility:"\u53ef\u89c1",positioning_type:"\u7c7b\u578b",position:"\u4f4d\u7f6e",bullet_image:"\u56fe\u7247\u9879\u76ee\u7b26\u53f7",list_type:"\u7c7b\u8868\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8",width:"\u5bbd",style:"\u6837\u5f0f",margin:"\u5916\u8fb9\u8ddd",left:"\u5de6\u4fa7",bottom:"\u9760\u4e0b",right:"\u53f3\u4fa7",top:"\u5b9a\u90e8",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5185\u8fb9\u8ddd",box_clear:"\u6e05\u9664\u6d6e\u52a8",box_float:"\u6d6e\u52a8",box_height:"\u9ad8",box_width:"\u5bbd",block_display:"\u663e\u793a",block_whitespace:"\u7a7a\u683c",block_text_indent:"\u6587\u5b57\u7f29\u6392",block_text_align:"\u6587\u5b57\u5bf9\u9f50",block_vertical_alignment:"\u5782\u76f4\u5bf9\u9f50",block_letterspacing:"\u5b57\u6bcd\u95f4\u8ddd",block_wordspacing:"\u95f4\u8ddd",background_vpos:"\u5782\u76f4\u4f4d\u7f6e",background_hpos:"\u6c34\u5e73\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u590d",background_image:"\u80cc\u666f\u56fe\u7247",background_color:"\u80cc\u666f\u989c\u8272",text_none:"\u65e0",text_blink:"\u95ea\u70c1",text_case:"\u5b57\u578b",text_striketrough:"\u5220\u9664\u7ebf",text_underline:"\u5e95\u7ebf",text_overline:"\u4e0a\u5212\u7ebf",text_decoration:"\u88c5\u9970",text_color:"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/cn_dlg.js b/js/tiny_mce/plugins/style/langs/cn_dlg.js new file mode 100755 index 000000000..1fad24fe0 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.style_dlg',{"text_lineheight":"\u884c\u9ad8","text_variant":"\u6587\u672c\u53d8\u91cf\uff08\u4e2d\u6587\u65e0\u6548\uff09","text_style":"\u6837\u5f0f","text_weight":"\u9ad8\u5ea6","text_size":"\u5b57\u4f53\u5927\u5c0f","text_font":"\u5b57\u4f53","text_props":"\u6587\u672c","positioning_tab":"\u653e\u7f6e","list_tab":"\u5217\u8868","border_tab":"\u8fb9\u6846","box_tab":"\u65b9\u5757","block_tab":"\u533a\u5757","background_tab":"\u80cc\u666f","text_tab":"\u6587\u672c",apply:"\u5e94\u7528",title:"\u7f16\u8f91CSS\u6837\u5f0f",clip:"\u526a\u8f91",placement:"\u653e\u7f6e",overflow:"\u6ea2\u51fa",zindex:"\u5143\u7d20\u5806\u53e0\u987a\u5e8f\uff08Z-index)",visibility:"\u53ef\u89c1","positioning_type":"\u7c7b\u578b",position:"\u4f4d\u7f6e","bullet_image":"\u56fe\u7247\u9879\u76ee\u7b26\u53f7","list_type":"\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",style:"\u6837\u5f0f",margin:"\u5916\u8fb9\u6846",left:"\u5de6\u4fa7",bottom:"\u5e95\u90e8",right:"\u53f3\u4fa7",top:"\u9876\u90e8",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5185\u8fb9\u6846","box_clear":"\u6e05\u9664\u6d6e\u52a8","box_float":"\u6d6e\u52a8","box_height":"\u9ad8\u5ea6","box_width":"\u5bbd\u5ea6","block_display":"\u663e\u793a\u65b9\u5f0f","block_whitespace":"\u7a7a\u683c","block_text_indent":"\u6587\u672c\u7f29\u8fdb","block_text_align":"\u6587\u672c\u5bf9\u9f50\u65b9\u5f0f","block_vertical_alignment":"\u5782\u76f4\u5bf9\u9f50","block_letterspacing":"\u5b57\u6bcd\u95f4\u8ddd","block_wordspacing":"\u95f4\u8ddd","background_vpos":"\u5782\u76f4\u4f4d\u7f6e","background_hpos":"\u6c34\u5e73\u4f4d\u7f6e","background_attachment":"\u9644\u4ef6","background_repeat":"\u91cd\u590d","background_image":"\u80cc\u666f\u56fe\u7247","background_color":"\u80cc\u666f\u989c\u8272","text_none":"\u65e0","text_blink":"\u95ea\u70c1","text_case":"\u5b57\u578b","text_striketrough":"\u5220\u9664\u7ebf","text_underline":"\u4e0b\u5212\u7ebf","text_overline":"\u4e0a\u5212\u7ebf","text_decoration":"\u88c5\u9970","text_color":"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/cs_dlg.js b/js/tiny_mce/plugins/style/langs/cs_dlg.js new file mode 100755 index 000000000..bac01dcba --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.style_dlg',{text_lineheight:"V\u00fd\u0161ka \u0159\u00e1dku",text_variant:"Varianta",text_style:"Styl textu",text_weight:"Tu\u010dnost p\u00edsma",text_size:"Velikost",text_font:"P\u00edsmo",text_props:"Text",positioning_tab:"Um\u00edst\u011bn\u00ed",list_tab:"Seznam",border_tab:"Ohrani\u010den\u00ed",box_tab:"Box",block_tab:"Blok",background_tab:"Pozad\u00ed",text_tab:"Text",apply:"Pou\u017e\u00edt",title:"Upravit CSS styl",clip:"O\u0159ez\u00e1n\u00ed (clip)",placement:"Um\u00edst\u011bni",overflow:"P\u0159ete\u010den\u00ed (overflow)",zindex:"Z-index",visibility:"Viditelnost",positioning_type:"Typ",position:"Um\u00edst\u011bn\u00ed",bullet_image:"Styl odr\u00e1\u017eek",list_type:"Typ",color:"Barva",height:"V\u00fd\u0161ka",width:"\u0160\u00ed\u0159ka",style:"Styl",margin:"Okraje (margin)",left:"Vlevo",bottom:"Dole",right:"Vpravo",top:"Naho\u0159e",same:"Stejn\u00e9 pro v\u0161echny",padding:"Odsazen\u00ed (padding)",box_clear:"Vy\u010distit",box_float:"Plovouc\u00ed",box_height:"V\u00fd\u0161ka",box_width:"\u0160\u00ed\u0159ka",block_display:"Blokov\u00e9 zobrazen\u00ed",block_whitespace:"Zalamov\u00e1n\u00ed textu",block_text_indent:"Odsazen\u00ed textu",block_text_align:"Zarovn\u00e1n\u00ed textu",block_vertical_alignment:"Vertik\u00e1ln\u00ed zarovn\u00e1n\u00ed",block_letterspacing:"Rozestup znak\u016f",block_wordspacing:"Rozestup slov",background_vpos:"Vertik\u00e1ln\u00ed um\u00edst\u011bn\u00ed",background_hpos:"Horizont\u00e1ln\u00ed um\u00edst\u011bn\u00ed",background_attachment:"Rolov\u00e1n\u00ed",background_repeat:"Opakov\u00e1n\u00ed",background_image:"Obr\u00e1zek pozad\u00ed",background_color:"Barva pozad\u00ed",text_none:"\u017e\u00e1dn\u00e1",text_blink:"blik\u00e1n\u00ed",text_case:"Velk\u00e1 p\u00edsmena",text_striketrough:"p\u0159e\u0161krtnut\u00ed",text_underline:"podtr\u017een\u00ed",text_overline:"nadtr\u017een\u00ed",text_decoration:"Dekorace",text_color:"Barva"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/cy_dlg.js b/js/tiny_mce/plugins/style/langs/cy_dlg.js new file mode 100755 index 000000000..1c0b5bcf1 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.style_dlg',{text_lineheight:"Uchder llinell",text_variant:"Amrywiad",text_style:"Arddull",text_weight:"Pwysau",text_size:"Maint",text_font:"Ffont",text_props:"Testun",positioning_tab:"Lleoli",list_tab:"Rhestr",border_tab:"Border",box_tab:"Blwch",block_tab:"Bloc",background_tab:"Cefndir",text_tab:"Testun",apply:"Gosod",title:"Golygu Arddull CSS",clip:"Clip",placement:"Gosodiad",overflow:"Gorlif",zindex:"Mynegai-Z",visibility:"Gwelededd",positioning_type:"Math",position:"Lleoliad",bullet_image:"Delwedd bwled",list_type:"Math",color:"Lliw",height:"Uchder",width:"Lled",style:"Arddull",margin:"Ymyl",left:"Chwith",bottom:"Gwaelod",right:"De",top:"Pen",same:"Yr un ar gyfer pob un",padding:"Padio",box_clear:"Clirio",box_float:"Arnofio",box_height:"Uchder",box_width:"Lled",block_display:"Arddangos",block_whitespace:"Whitespace",block_text_indent:"Mewnoli tetun",block_text_align:"Alinio testun",block_vertical_alignment:"Aliniad fertigol",block_letterspacing:"Bylchiad lythyren",block_wordspacing:"Bylchiad gair",background_vpos:"Lleoliad fertigol",background_hpos:"Lleoliad llorweddol",background_attachment:"Atodiad",background_repeat:"Ailadrodd",background_image:"Delwedd cefndir",background_color:"Lliw cefndir",text_none:"Dim un",text_blink:"Blincio",text_case:"Llythrennau bach/mawr",text_striketrough:"Taro drwodd",text_underline:"Llinell o dan",text_overline:"Llinell drosodd",text_decoration:"Addurniadau",text_color:"Lliw"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/da_dlg.js b/js/tiny_mce/plugins/style/langs/da_dlg.js new file mode 100755 index 000000000..0edb86878 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.style_dlg',{text_lineheight:"Linieh\u00f8jde",text_variant:"Variant",text_style:"Stil",text_weight:"V\u00e6gt",text_size:"St\u00f8rrelse",text_font:"Skrifttype",text_props:"Tekst",positioning_tab:"Positionering",list_tab:"Liste",border_tab:"Kant",box_tab:"Boks",block_tab:"Blok",background_tab:"Baggrund",text_tab:"Tekst",apply:"Anvend",title:"Rediger CSS stil",clip:"Klip",placement:"Placering",overflow:"Overl\u00f8b",zindex:"Z-index",visibility:"Synlighed",positioning_type:"Type",position:"Position",bullet_image:"Punktopstillings-billede",list_type:"Type",color:"Farve",height:"H\u00f8jde",width:"Bredde",style:"Style",margin:"Margin",left:"Venstre",bottom:"Bund",right:"H\u00f8jre",top:"Top",same:"Ens for alle",padding:"Afstand til indhold",box_clear:"Ryd",box_float:"Flydende",box_height:"H\u00f8jde",box_width:"Bredde",block_display:"Vis",block_whitespace:"Mellemrum",block_text_indent:"Tekstindrykning",block_text_align:"Tekstjustering",block_vertical_alignment:"Vertikal justering",block_letterspacing:"Afstand mellem bogstaver",block_wordspacing:"Afstand mellem ord",background_vpos:"Vertikal position",background_hpos:"Horisontal position",background_attachment:"Vedh\u00e6ftede fil",background_repeat:"Gentag",background_image:"Baggrundsbillede",background_color:"Baggrundsfarve",text_none:"ingen",text_blink:"blink",text_case:"Vesaltilstand",text_striketrough:"gennemstreget",text_underline:"understreget",text_overline:"overstreget",text_decoration:"Dekoration",text_color:"Farve"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/de_dlg.js b/js/tiny_mce/plugins/style/langs/de_dlg.js new file mode 100755 index 000000000..65e3497b0 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.style_dlg',{text_lineheight:"Zeilenh\u00f6he",text_variant:"Variante",text_style:"Stil",text_weight:"Dicke",text_size:"Gr\u00f6\u00dfe",text_font:"Schriftart",text_props:"Text",positioning_tab:"Positionierung",list_tab:"Liste",border_tab:"Rahmen",box_tab:"Box",block_tab:"Block",background_tab:"Hintergrund",text_tab:"Text",apply:"\u00dcbernehmen",title:"CSS-Styles bearbeiten",clip:"Ausschnitt",placement:"Platzierung",overflow:"Verhalten bei \u00dcbergr\u00f6\u00dfe",zindex:"Z-Wert",visibility:"Sichtbar",positioning_type:"Art der Positionierung",position:"Positionierung",bullet_image:"Listenpunkt-Grafik",list_type:"Listenpunkt-Art",color:"Textfarbe",height:"H\u00f6he",width:"Breite",style:"Format",margin:"\u00c4u\u00dferer Abstand",left:"Links",bottom:"Unten",right:"Rechts",top:"Oben",same:"Alle gleich",padding:"Innerer Abstand",box_clear:"Umflie\u00dfung verhindern",box_float:"Umflie\u00dfung",box_height:"H\u00f6he",box_width:"Breite",block_display:"Umbruchverhalten",block_whitespace:"Automatischer Umbruch",block_text_indent:"Einr\u00fcckung",block_text_align:"Ausrichtung",block_vertical_alignment:"Vertikale Ausrichtung",block_letterspacing:"Buchstabenabstand",block_wordspacing:"Wortabstand",background_vpos:"Position Y",background_hpos:"Position X",background_attachment:"Wasserzeicheneffekt",background_repeat:"Wiederholung",background_image:"Hintergrundbild",background_color:"Hintergrundfarbe",text_none:"keine",text_blink:"blinkend",text_case:"Schreibung",text_striketrough:"durchgestrichen",text_underline:"unterstrichen",text_overline:"\u00fcberstrichen",text_decoration:"Gestaltung",text_color:"Farbe"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/dv_dlg.js b/js/tiny_mce/plugins/style/langs/dv_dlg.js new file mode 100755 index 000000000..0c4efa4bb --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/el_dlg.js b/js/tiny_mce/plugins/style/langs/el_dlg.js new file mode 100755 index 000000000..586a8a16d --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.style_dlg',{text_lineheight:"\u038e\u03c8\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2",text_variant:"\u03a0\u03b1\u03c1\u03b1\u03bb\u03bb\u03b1\u03b3\u03ae",text_style:"\u03a3\u03c4\u03c5\u03bb",text_weight:"\u0392\u03ac\u03c1\u03bf\u03c2",text_size:"\u039c\u03ad\u03b3\u03b5\u03b8\u03bf\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ac\u03c4\u03c9\u03bd",text_font:"\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac",text_props:"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf",positioning_tab:"\u03a4\u03bf\u03c0\u03bf\u03b8\u03ad\u03c4\u03b7\u03c3\u03b7",list_tab:"\u039b\u03af\u03c3\u03c4\u03b1",border_tab:"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf",box_tab:"\u039a\u03bf\u03c5\u03c4\u03af",block_tab:"\u039c\u03c0\u03bb\u03bf\u03ba",background_tab:"\u03a6\u03cc\u03bd\u03c4\u03bf",text_tab:"\u039a\u03b5\u03af\u03bc\u03b5\u03bd\u03bf",apply:"\u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae",title:"\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03a3\u03c4\u03c5\u03bb CSS",clip:"Clip",placement:"\u03a4\u03bf\u03c0\u03bf\u03b8\u03ad\u03c4\u03b7\u03c3\u03b7",overflow:"\u03a5\u03c0\u03b5\u03c1\u03c7\u03b5\u03af\u03bb\u03b9\u03c3\u03b7",zindex:"Z-index",visibility:"\u039f\u03c1\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1",positioning_type:"\u03a4\u03cd\u03c0\u03bf\u03c2",position:"\u0398\u03ad\u03c3\u03b7",bullet_image:"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c4\u03b5\u03bb\u03b5\u03af\u03b1\u03c2",list_type:"\u03a4\u03cd\u03c0\u03bf\u03c2",color:"\u03a7\u03c1\u03ce\u03bc\u03b1",height:"\u038e\u03c8\u03bf\u03c2",width:"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",margin:"\u03a0\u03b5\u03c1\u03b9\u03b8\u03ce\u03c1\u03b9\u03bf",left:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",bottom:"\u039a\u03ac\u03c4\u03c9",right:"\u0394\u03b5\u03be\u03b9\u03ac",top:"\u03a0\u03ac\u03bd\u03c9",same:"\u038a\u03b4\u03b9\u03bf \u03b3\u03b9\u03b1 \u03cc\u03bb\u03b1",padding:"\u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1",box_clear:"Clear",box_float:"Float",box_height:"\u038e\u03c8\u03bf\u03c2",box_width:"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2",block_display:"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7",block_whitespace:"\u039a\u03b5\u03bd\u03cc\u03c2 \u03c7\u03ce\u03c1\u03bf\u03c2",block_text_indent:"\u0395\u03c3\u03bf\u03c7\u03ae \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5",block_text_align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5",block_vertical_alignment:"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",block_letterspacing:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03c9\u03bd",block_wordspacing:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03bb\u03ad\u03be\u03b5\u03c9\u03bd",background_vpos:"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03b8\u03ad\u03c3\u03b7",background_hpos:"\u039f\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03b8\u03ad\u03c3\u03b7",background_attachment:"\u03a0\u03c1\u03bf\u03c3\u03ac\u03c1\u03c4\u03b7\u03bc\u03b1",background_repeat:"\u0395\u03c0\u03b1\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7",background_image:"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",background_color:"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",text_none:"\u039a\u03b1\u03bc\u03af\u03b1",text_blink:"\u039d\u03b1 \u03b1\u03bd\u03b1\u03b2\u03bf\u03c3\u03b2\u03ae\u03bd\u03b5\u03b9",text_case:"\u039a\u03b5\u03c6./\u039c\u03b9\u03ba\u03c1\u03ac",text_striketrough:"\u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7",text_underline:"\u03a5\u03c0\u03bf\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7",text_overline:"\u03a5\u03c0\u03b5\u03c1\u03b3\u03c1\u03ac\u03bc\u03bc\u03b9\u03c3\u03b7",text_decoration:"\u0394\u03b9\u03b1\u03ba\u03cc\u03c3\u03bc\u03b7\u03c3\u03b7",text_color:"\u03a7\u03c1\u03ce\u03bc\u03b1"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/en_dlg.js b/js/tiny_mce/plugins/style/langs/en_dlg.js new file mode 100644 index 000000000..0bd435eee --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text indent","block_text_align":"Text align","block_vertical_alignment":"Vertical alignment","block_letterspacing":"Letter spacing","block_wordspacing":"Word spacing","background_vpos":"Vertical position","background_hpos":"Horizontal position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background image","background_color":"Background color","text_none":"none","text_blink":"blink","text_case":"Case","text_striketrough":"strikethrough","text_underline":"underline","text_overline":"overline","text_decoration":"Decoration","text_color":"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/es_dlg.js b/js/tiny_mce/plugins/style/langs/es_dlg.js new file mode 100755 index 000000000..b37cce32c --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.style_dlg',{"text_lineheight":"Ancho de la fila","text_variant":"Variante","text_style":"Estilo","text_weight":"Peso","text_size":"Tama\u00f1o","text_font":"Fuente","text_props":"Texto","positioning_tab":"Posici\u00f3n","list_tab":"Lista","border_tab":"Borde","box_tab":"Caja","block_tab":"Bloque","background_tab":"Fondo","text_tab":"Texto",apply:"Aplicar",title:"Editar Estilo CSS",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibilidad","positioning_type":"Tipo",position:"Posici\u00f3n","bullet_image":"Imagen de la vi\u00f1eta","list_type":"Tipo",color:"Color",height:"Alto",width:"Ancho",style:"Estilo",margin:"Margen",left:"Izquierda",bottom:"Debajo",right:"Derecha",top:"Arriba",same:"Lo mismo en todos",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Alto","box_width":"Ancho","block_display":"Display","block_whitespace":"Espacio en blanco","block_text_indent":"Sangr\u00eda","block_text_align":"Alineaci\u00f3n del texto","block_vertical_alignment":"Alineaci\u00f3n vertical","block_letterspacing":"Espacio entre letra","block_wordspacing":"Espacio entre palabra","background_vpos":"Posici\u00f3n vertical","background_hpos":"Posici\u00f3n horizontal","background_attachment":"Adjunto","background_repeat":"Repetici\u00f3n","background_image":"Imagen de fondo","background_color":"Color de fondo","text_none":"Ninguno","text_blink":"Parpadeo","text_case":"Min\u00fas./May\u00fas.","text_striketrough":"Tachado","text_underline":"Subrayado","text_overline":"Subrayado superior","text_decoration":"Decorativos","text_color":"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/et_dlg.js b/js/tiny_mce/plugins/style/langs/et_dlg.js new file mode 100755 index 000000000..8940e8e0c --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.style_dlg',{text_lineheight:"Joone k\u00f5rgus",text_variant:"Variant",text_style:"Stiil",text_weight:"Raskus",text_size:"Suurus",text_font:"Font",text_props:"Tekst",positioning_tab:"Positsioneerimine",list_tab:"Nimekiri",border_tab:"Raam",box_tab:"Kast",block_tab:"Plokk",background_tab:"Taust",text_tab:"Tekst",apply:"Rakenda",title:"Muuda CSS stiili",clip:"Klipp",placement:"Asetus",overflow:"\u00dclevool",zindex:"Z-viit",visibility:"N\u00e4htavus",positioning_type:"T\u00fc\u00fcp",position:"Positsioon",bullet_image:"Punkt pilt",list_type:"T\u00fc\u00fcp",color:"V\u00e4rv",height:"K\u00f5rgus",width:"Laius",style:"Stiil",margin:"Serv",left:"Vasakul",bottom:"All",right:"Paremal",top:"\u00dcleval",same:"Sama k\u00f5igile",padding:"T\u00e4idis",box_clear:"Puhas",box_float:"H\u00f5ljuv",box_height:"K\u00f5rgus",box_width:"Laius",block_display:"Kuva",block_whitespace:"T\u00fchimik",block_text_indent:"Teksti taandus",block_text_align:"Teksti joondus",block_vertical_alignment:"Vertikaalne joondus",block_letterspacing:"T\u00e4he avardamine",block_wordspacing:"S\u00f5nade avardamine",background_vpos:"Vertikaalne asend",background_hpos:"Horisontaalne asend",background_attachment:"Manus",background_repeat:"Kordus",background_image:"Tausta pilt",background_color:"Tausta v\u00e4rv",text_none:"mitte \u00fckski",text_blink:"vilgutus",text_case:"Kast",text_striketrough:"l\u00e4bikriipsutus",text_underline:"alajoon",text_overline:"\u00fclejoon",text_decoration:"Dekoratioon",text_color:"V\u00e4rv"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/eu_dlg.js b/js/tiny_mce/plugins/style/langs/eu_dlg.js new file mode 100755 index 000000000..06aa6e0ce --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.style_dlg',{text_lineheight:"Lerro garaiera",text_variant:"Aldaera",text_style:"Estiloa",text_weight:"Weight",text_size:"Tamaina",text_font:"Letra-tipoa",text_props:"Testua",positioning_tab:"Kokapena",list_tab:"Zerrenda",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Atzea",text_tab:"Testua",apply:"Apikatu",title:"Aldatu CSS estiloa",clip:"Klip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Ikusgarritasuna",positioning_type:"Mora",position:"Kokapena",bullet_image:"Bulet-irudia",list_type:"Mota",color:"Kolorea",height:"Altuera",width:"Zabalera",style:"Estiloa",margin:"Margina",left:"Ezkerra",bottom:"Behera",right:"Eskuina",top:"Gora",same:"Guztientzat berdina",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Altuera",box_width:"Zabalera",block_display:"Erakutsi",block_whitespace:"Zuriunea",block_text_indent:"Koska",block_text_align:"Testu lerrokatzea",block_vertical_alignment:"Lerrokatze bertikala",block_letterspacing:"Letra banaketa",block_wordspacing:"Hitz banaketa",background_vpos:"Posizio bertikala",background_hpos:"Posizio horizontala",background_attachment:"Eranskina",background_repeat:"Errepikatu",background_image:"Atzeko irudia",background_color:"Atzeko kolorea",text_none:"Bat ere ez",text_blink:"Keinada",text_case:"Minus./Maius.",text_striketrough:"Marratua",text_underline:"Azpimarra",text_overline:"Goimarra",text_decoration:"Apaingarriak",text_color:"Kolorea"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/fa_dlg.js b/js/tiny_mce/plugins/style/langs/fa_dlg.js new file mode 100755 index 000000000..5a8bfdd3c --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.style_dlg',{text_lineheight:"\u0628\u0644\u0646\u062f\u06cc \u062e\u0637",text_variant:"\u0646\u0648\u0639 \u062a\u063a\u06cc\u06cc\u0631",text_style:"\u0627\u0633\u062a\u06cc\u0644",text_weight:"\u062d\u0627\u0644\u062a",text_size:"\u0627\u0646\u062f\u0627\u0632\u0647",text_font:"\u0642\u0644\u0645",text_props:"\u0645\u062a\u0646",positioning_tab:"\u0645\u0648\u0642\u0639\u06cc\u062a",list_tab:"\u0644\u06cc\u0633\u062a",border_tab:"\u062d\u0627\u0634\u06cc\u0647",box_tab:"\u062c\u0639\u0628\u0647",block_tab:"\u0628\u0644\u0648\u06a9",background_tab:"\u0632\u0645\u06cc\u0646\u0647",text_tab:"\u0645\u062a\u0646",apply:"\u0628\u06a9\u0627\u0631\u06af\u06cc\u0631\u06cc",title:"\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0627\u0633\u062a\u06cc\u0644 CSS",clip:"\u0628\u0631\u0634 (Clip)",placement:"\u0645\u0648\u0642\u0639\u06cc\u062a \u0645\u06a9\u0627\u0646\u06cc",overflow:"\u0633\u0631 \u0631\u06cc\u0632",zindex:"\u0645\u062d\u0648\u0631 Z",visibility:"\u0642\u0627\u0628\u0644\u06cc\u062a \u0631\u0648\u06cc\u062a",positioning_type:"\u0646\u0648\u0639",position:"\u0645\u0648\u0642\u0639\u06cc\u062a",bullet_image:"\u062a\u0635\u0648\u06cc\u0631 \u06af\u0644\u0648\u0644\u0647",list_type:"\u0646\u0648\u0639",color:"\u0631\u0646\u06af",height:"\u0627\u0631\u062a\u0641\u0627\u0639",width:"\u067e\u0647\u0646\u0627",style:"\u0627\u0633\u062a\u06cc\u0644",margin:"\u062d\u0627\u0634\u06cc\u0647",left:"\u0686\u067e",bottom:"\u067e\u0627\u06cc\u06cc\u0646",right:"\u0631\u0627\u0633\u062a",top:"\u0628\u0627\u0644\u0627",same:"\u0647\u0645\u0633\u0627\u0646 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647",padding:"\u0644\u0627\u06cc\u0647 \u06af\u0630\u0627\u0631\u06cc",box_clear:"\u067e\u0627\u06a9 \u0633\u0627\u0632\u06cc",box_float:"\u0634\u0646\u0627\u0648\u0631",box_height:"\u0627\u0631\u062a\u0641\u0627\u0639",box_width:"\u067e\u0647\u0646\u0627",block_display:"\u0646\u0645\u0627\u06cc\u0634",block_whitespace:"\u0641\u0627\u0635\u0644\u0647 \u0633\u0641\u06cc\u062f",block_text_indent:"\u062a\u0648\u0631\u0641\u062a\u06af\u06cc \u0645\u062a\u0646",block_text_align:"\u062a\u0631\u0627\u0632 \u0645\u062a\u0646",block_vertical_alignment:"\u062a\u0631\u0627\u0632 \u0639\u0645\u0648\u062f\u06cc",block_letterspacing:"\u0641\u0627\u0635\u0644\u0647 \u062d\u0631\u0648\u0641",block_wordspacing:"\u0641\u0627\u0635\u0644\u0647 \u06a9\u0644\u0645\u0627\u062a",background_vpos:"\u0645\u0648\u0642\u0639\u06cc\u062a \u0639\u0645\u0648\u062f\u06cc",background_hpos:"\u0645\u0648\u0642\u0639\u06cc\u062a \u0627\u0641\u0642\u06cc",background_attachment:"\u0632\u0645\u06cc\u0645\u0647",background_repeat:"\u062a\u06a9\u0631\u0627\u0631",background_image:"\u062a\u0635\u0648\u06cc\u0631 \u0632\u0645\u06cc\u0646\u0647",background_color:"\u0631\u0646\u06af \u0632\u0645\u06cc\u0646\u0647",text_none:"\u0647\u06cc\u0686 \u06a9\u062f\u0627\u0645",text_blink:"\u0686\u0634\u0645\u06a9 \u0632\u0646",text_case:"\u062d\u0627\u0644\u062a",text_striketrough:"\u062e\u0637 \u0648\u0633\u0637",text_underline:"\u0632\u06cc\u0631 \u062e\u0637",text_overline:"\u0628\u0627\u0644\u0627 \u062e\u0637",text_decoration:"\u0622\u0631\u0627\u06cc\u0634",text_color:"\u0631\u0646\u06af"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/fi_dlg.js b/js/tiny_mce/plugins/style/langs/fi_dlg.js new file mode 100755 index 000000000..02289edc3 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.style_dlg',{text_lineheight:"Rivin korkeus",text_variant:"Variantti",text_style:"Tyyli",text_weight:"Paino",text_size:"Koko",text_font:"Kirjasin",text_props:"Teksti",positioning_tab:"Sijainti",list_tab:"Lista",border_tab:"Kehys",box_tab:"Laatikko",block_tab:"Palkki",background_tab:"Tausta",text_tab:"Teksti",apply:"K\u00e4yt\u00e4",title:"Muokkaa CSS-tyyli\u00e4",clip:"Leike",placement:"Sijoittelu",overflow:"Ylivuoto",zindex:"Z-indeksi",visibility:"N\u00e4kyvyys",positioning_type:"Tyyppi",position:"Sijainti",bullet_image:"Listauskuva",list_type:"Tyyppi",color:"V\u00e4ri",height:"Korkeus",width:"Leveys",style:"Tyyli",margin:"Marginaali",left:"Vasemmalla",bottom:"Alhaalla",right:"Oikealla",top:"Ylh\u00e4\u00e4ll\u00e4",same:"Sama kaikille",padding:"Tyhj\u00e4 tila",box_clear:"Nollaus",box_float:"Kellunta",box_height:"Korkeus",box_width:"Leveys",block_display:"N\u00e4ytt\u00f6",block_whitespace:"Tyhj\u00e4 tila",block_text_indent:"Tekstin sisennys",block_text_align:"Tekstin asettelu",block_vertical_alignment:"Pystyasettelu",block_letterspacing:"Kirjainten v\u00e4listys",block_wordspacing:"Sanojen v\u00e4listys",background_vpos:"Pystyasettelu",background_hpos:"Vaaka-asettelu",background_attachment:"Liite",background_repeat:"Toistuvuus",background_image:"Taustakuva",background_color:"Taustav\u00e4ri",text_none:"ei mit\u00e4\u00e4n",text_blink:"V\u00e4l\u00e4hdys",text_case:"Isot/pienet kirjaimet",text_striketrough:"Yliviivattu",text_underline:"Alleviivattu (Ctrl+U)",text_overline:"Yliviivattu",text_decoration:"Koristelu",text_color:"V\u00e4ri"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/fr_dlg.js b/js/tiny_mce/plugins/style/langs/fr_dlg.js new file mode 100755 index 000000000..16710c6fe --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.style_dlg',{text_lineheight:"Hauteur de ligne",text_variant:"Variante",text_style:"Style",text_weight:"Gras",text_size:"Taille",text_font:"Police",text_props:"Texte",positioning_tab:"Positionnement",list_tab:"Liste",border_tab:"Bordure",box_tab:"Bo\u00eete",block_tab:"Bloc",background_tab:"Fond",text_tab:"Texte",apply:"Appliquer",title:"\u00c9diter la feuille de style",clip:"Clip",placement:"Placement",overflow:"D\u00e9bordement",zindex:"Z-index",visibility:"Visibilit\u00e9",positioning_type:"Type",position:"Position",bullet_image:"Image de puce",list_type:"Type",color:"Couleur",height:"Hauteur",width:"Largeur",style:"Style",margin:"Marge",left:"Gauche",bottom:"Bas",right:"Droit",top:"Haut",same:"Identique pour tous",padding:"Espacement",box_clear:"Vider",box_float:"Flottant",box_height:"Hauteur",box_width:"Largeur",block_display:"Affichage",block_whitespace:"Fin de ligne",block_text_indent:"Indentation du texte",block_text_align:"Alignement du texte",block_vertical_alignment:"Alignement vertical",block_letterspacing:"Espacement des lettres",block_wordspacing:"Espacement des mots ",background_vpos:"Position verticale",background_hpos:"Position horizontale",background_attachment:"Attachement",background_repeat:"R\u00e9p\u00e9ter",background_image:"Image de fond",background_color:"Couleur de fond",text_none:"aucun",text_blink:"clignotant",text_case:"Casse",text_striketrough:"barr\u00e9",text_underline:"soulign\u00e9",text_overline:"ligne au-dessus",text_decoration:"D\u00e9coration",text_color:"Couleur"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/gl_dlg.js b/js/tiny_mce/plugins/style/langs/gl_dlg.js new file mode 100755 index 000000000..0b37ea4e1 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.style_dlg',{text_lineheight:"Ancho da fila",text_variant:"Variante",text_style:"Estilo",text_weight:"Peso",text_size:"Tama\u00f1o",text_font:"Fonte",text_props:"Texto",positioning_tab:"Posici\u00f3n",list_tab:"Lista",border_tab:"Borde",box_tab:"Caixa",block_tab:"Bloque",background_tab:"Fondo",text_tab:"Texto",apply:"Aplicar",title:"Editar Estilo CSS",clip:"Clip",placement:"Colocaci\u00f3n",overflow:"Desbodramento",zindex:"\u00cdndize Z",visibility:"Visibilidade",positioning_type:"Tipo",position:"Posici\u00f3n",bullet_image:"Imaxe da vi\u00f1eta",list_type:"Tipo",color:"Cor",height:"Alto",width:"Ancho",style:"Estilo",margin:"Marxe",left:"Esquerda",bottom:"Abaixo",right:"Dereita",top:"Arriba",same:"O mesmo en todos",padding:"Recheo",box_clear:"Limpar",box_float:"Float",box_height:"Alto",box_width:"Ancho",block_display:"Display",block_whitespace:"Espacio en branco",block_text_indent:"Sangr\u00eda",block_text_align:"Ali\u00f1aci\u00f3n do texto",block_vertical_alignment:"Ali\u00f1aci\u00f3n vertical",block_letterspacing:"Espacio entre letras",block_wordspacing:"Espacio entre verbas",background_vpos:"Posici\u00f3n vertical",background_hpos:"Posici\u00f3n horizontal",background_attachment:"Adxunto",background_repeat:"Repetir",background_image:"Imaxe de fondo",background_color:"Cor de fondo",text_none:"Neng\u00fan",text_blink:"Parpadeo",text_case:"Min\u00fas./May\u00fas.",text_striketrough:"Tachado",text_underline:"Suli\u00f1ado",text_overline:"Li\u00f1a superior",text_decoration:"Decorativos",text_color:"Cor"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/gu_dlg.js b/js/tiny_mce/plugins/style/langs/gu_dlg.js new file mode 100755 index 000000000..0cd6116a7 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/he_dlg.js b/js/tiny_mce/plugins/style/langs/he_dlg.js new file mode 100755 index 000000000..a29c03358 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.style_dlg',{text_lineheight:"\u05d2\u05d5\u05d1\u05d4 \u05e9\u05d5\u05e8\u05d4",text_variant:"Variant",text_style:"\u05e1\u05d2\u05e0\u05d5\u05df",text_weight:"\u05e2\u05d5\u05d1\u05d9",text_size:"\u05d2\u05d5\u05d3\u05dc",text_font:"\u05e4\u05d5\u05e0\u05d8",text_props:"\u05d8\u05e7\u05e1\u05d8",positioning_tab:"\u05de\u05d9\u05e7\u05d5\u05dd",list_tab:"\u05e8\u05e9\u05d9\u05de\u05d4",border_tab:"\u05d2\u05d1\u05d5\u05dc",box_tab:"\u05e7\u05d5\u05e4\u05e1\u05d0",block_tab:"\u05d7\u05e1\u05d5\u05dd",background_tab:"\u05e8\u05e7\u05e2",text_tab:"\u05d8\u05e7\u05e1\u05d8",apply:"\u05d4\u05d7\u05dc",title:"\u05e2\u05d3\u05db\u05d5\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea CSS",clip:"\u05e7\u05dc\u05d9\u05e4",placement:"\u05de\u05d9\u05e7\u05d5\u05dd",overflow:"\u05d2\u05dc\u05d9\u05e9\u05d4",zindex:"Z-index",visibility:"\u05e8\u05d0\u05d5\u05ea",positioning_type:"\u05e1\u05d5\u05d2",position:"\u05de\u05d9\u05e7\u05d5\u05dd",bullet_image:"Bullet image",list_type:"\u05e1\u05d5\u05d2",color:"\u05e6\u05d1\u05e2",height:"\u05d2\u05d5\u05d1\u05d4",width:"\u05e8\u05d5\u05d7\u05d1",style:"\u05e1\u05d2\u05e0\u05d5\u05df",margin:"\u05e9\u05d5\u05dc\u05d9\u05d9\u05dd",left:"\u05e9\u05de\u05d0\u05dc",bottom:"\u05ea\u05d7\u05ea\u05d9\u05ea",right:"\u05d9\u05de\u05d9\u05df",top:"\u05e2\u05dc\u05d9\u05d5\u05df",same:"\u05d0\u05d5\u05ea\u05d5 \u05d3\u05d1\u05e8 \u05e2\u05d1\u05d5\u05e8 \u05db\u05d5\u05dc\u05dd",padding:"\u05e8\u05d9\u05e4\u05d5\u05d3",box_clear:"\u05e0\u05e7\u05d4",box_float:"\u05d4\u05e6\u05e4\u05d4",box_height:"\u05d2\u05d5\u05d1\u05d4",box_width:"\u05e8\u05d5\u05d7\u05d1",block_display:"\u05d4\u05e6\u05d2",block_whitespace:"\u05e8\u05d5\u05d5\u05d7",block_text_indent:"\u05d4\u05d6\u05d7\u05d4",block_text_align:"\u05de\u05d9\u05e7\u05d5\u05dd \u05d8\u05e7\u05e1\u05d8",block_vertical_alignment:"Vertical alignment",block_letterspacing:"\u05de\u05e8\u05d7\u05e7 \u05d1\u05d9\u05df \u05d0\u05d5\u05ea\u05d9\u05d5\u05ea",block_wordspacing:"\u05de\u05e8\u05d7\u05e7 \u05d1\u05d9\u05df \u05de\u05d9\u05dc\u05d9\u05dd",background_vpos:"\u05de\u05d9\u05e7\u05d5\u05dd \u05e8\u05d5\u05d7\u05d1\u05d9",background_hpos:"\u05de\u05d9\u05e7\u05d5\u05dd \u05d0\u05d5\u05e4\u05e7\u05d9",background_attachment:"\u05e7\u05d1\u05e6\u05d9\u05dd \u05de\u05e6\u05d5\u05e8\u05e4\u05d9\u05dd",background_repeat:"\u05d7\u05d6\u05d5\u05e8",background_image:"\u05ea\u05de\u05d5\u05e0\u05ea \u05e8\u05e7\u05e2",background_color:"\u05e6\u05d1\u05e2 \u05e8\u05e7\u05e2",text_none:"\u05dc\u05dc\u05d0",text_blink:"\u05d4\u05d1\u05d4\u05d5\u05d1",text_case:"Case",text_striketrough:"\u05e7\u05d5 \u05d7\u05d5\u05e6\u05d4",text_underline:"\u05e9\u05d5\u05e8\u05d4 \u05de\u05ea\u05d7\u05ea",text_overline:"\u05e9\u05d5\u05e8\u05d4 \u05de\u05e2\u05dc",text_decoration:"\u05e2\u05d9\u05e6\u05d5\u05d1",text_color:"\u05e6\u05d1\u05e2"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/hi_dlg.js b/js/tiny_mce/plugins/style/langs/hi_dlg.js new file mode 100755 index 000000000..de82f9238 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/hr_dlg.js b/js/tiny_mce/plugins/style/langs/hr_dlg.js new file mode 100755 index 000000000..4fe1faea4 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/hu_dlg.js b/js/tiny_mce/plugins/style/langs/hu_dlg.js new file mode 100755 index 000000000..1915c45e9 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.style_dlg',{"text_lineheight":"Sormagass\u00e1g","text_variant":"V\u00e1ltozat","text_style":"St\u00edlus","text_weight":"Sz\u00e9less\u00e9g","text_size":"M\u00e9ret","text_font":"Bet\u0171t\u00edpus","text_props":"Sz\u00f6veg","positioning_tab":"Poz\u00edci\u00f3","list_tab":"Lista","border_tab":"Keret","box_tab":"Doboz","block_tab":"Blokk","background_tab":"H\u00e1tt\u00e9r","text_tab":"Sz\u00f6veg",apply:"Alkalmaz",title:"CSS st\u00edlus szerkest\u00e9se",clip:"Lev\u00e1g\u00e1s",placement:"Elhelyez\u00e9s",overflow:"Kifut\u00e1s",zindex:"Z-index",visibility:"L\u00e1that\u00f3s\u00e1g","positioning_type":"T\u00edpus",position:"Poz\u00edci\u00f3","bullet_image":"Elemk\u00e9p","list_type":"T\u00edpus",color:"Sz\u00edn",height:"Magass\u00e1g",width:"Sz\u00e9less\u00e9g",style:"St\u00edlus",margin:"Marg\u00f3",left:"Balra",bottom:"Lent",right:"Jobbra",top:"Fel\u00fcl",same:"Mindenhol ugyanaz",padding:"Bels\u0151 marg\u00f3","box_clear":"Lebeg\u00e9s (float) t\u00f6rl\u00e9se","box_float":"Lebeg\u00e9s (float)","box_height":"Magass\u00e1g","box_width":"Sz\u00e9less\u00e9g","block_display":"Megjelen\u00edt\u00e9s","block_whitespace":"\u00dcres helyek","block_text_indent":"Sz\u00f6veg beh\u00faz\u00e1sa","block_text_align":"Sz\u00f6veg igaz\u00edt\u00e1sa","block_vertical_alignment":"F\u00fcgg\u0151leges igaz\u00edt\u00e1s","block_letterspacing":"Bet\u0171t\u00e1vols\u00e1g","block_wordspacing":"Sz\u00f3t\u00e1vols\u00e1g","background_vpos":"F\u00fcgg\u0151leges hely","background_hpos":"V\u00edzszintes hely","background_attachment":"Csatolm\u00e1ny","background_repeat":"Ism\u00e9tl\u00e9s","background_image":"H\u00e1tt\u00e9rk\u00e9p","background_color":"H\u00e1tt\u00e9rsz\u00edn","text_none":"egyik sem","text_blink":"villog\u00e1s","text_case":"eset","text_striketrough":"\u00e1th\u00faz\u00e1s","text_underline":"alulh\u00faz\u00e1s","text_overline":"fel\u00fclh\u00faz\u00e1s","text_decoration":"dekor\u00e1ci\u00f3","text_color":"sz\u00edn"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/hy_dlg.js b/js/tiny_mce/plugins/style/langs/hy_dlg.js new file mode 100755 index 000000000..8e5f689be --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.style_dlg',{text_lineheight:"\u054f\u0578\u0572\u056b \u0562\u0561\u0580\u0571\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576",text_variant:"Variant",text_style:"\u0548\u0573",text_weight:"\u0540\u0561\u057d\u057f\u0578\u0582\u0569\u0575\u0578\u0582\u0576",text_size:"\u0549\u0561\u0583\u057d",text_font:"\u054f\u0561\u057c\u0561\u057f\u0565\u057d\u0561\u056f",text_props:"\u054f\u0565\u0584\u057d\u057f",positioning_tab:"\u054f\u0565\u0572\u0561\u056f\u0561\u0575\u0578\u0582\u0574",list_tab:"\u0551\u0578\u0582\u0581\u0561\u056f",border_tab:"\u0535\u0566\u0580",box_tab:"Box",block_tab:"\u0532\u056c\u0578\u056f",background_tab:"\u0556\u0578\u0576",text_tab:"\u054f\u0565\u0584\u057d\u057f",apply:"\u0540\u0561\u057d\u057f\u0561\u057f\u0565\u056c",title:"CSS \u0578\u0573\u0565\u0580\u056b \u056d\u0574\u0562\u0561\u0563\u0580\u0578\u0582\u0574",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"\u054f\u0565\u057d\u0561\u0576\u0565\u056c\u056b\u0578\u0582\u0569\u0575\u0578\u0582\u0576",positioning_type:"\u054f\u0565\u057d\u0561\u056f",position:"\u0534\u056b\u0580\u0584",bullet_image:"Bullet image",list_type:"\u054f\u0565\u057d\u0561\u056f",color:"\u0533\u0578\u0582\u0575\u0576",height:"\u0532\u0561\u0580\u0571\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576",width:"\u053c\u0561\u0575\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",style:"\u0548\u0573",margin:"Margin",left:"\u0541\u0561\u056d\u056b\u0581",bottom:"\u0546\u0565\u0580\u0584\u0587\u056b\u0581",right:"\u0531\u057b\u056b\u0581",top:"\u054e\u0565\u0580\u0587\u056b\u0581",same:"\u0544\u056b\u0587\u0576\u0578\u0582\u0575\u0576 \u0561\u0574\u0565\u0576 \u056b\u0576\u0579\u056b \u0570\u0561\u0574\u0561\u0580",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"\u0532\u0561\u0580\u0571\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576",box_width:"\u053c\u0561\u0575\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"\u054f\u0565\u0584\u057d\u057f\u056b \u0570\u0561\u057e\u0561\u057d\u0561\u0580\u0565\u0581\u0578\u0582\u0574",block_vertical_alignment:"\u0548\u0582\u0572\u0572\u0561\u0570\u0561\u0575\u0561\u0581 \u0570\u0561\u057e\u0561\u057d\u0561\u0580\u0565\u0581\u0578\u0582\u0574",block_letterspacing:"\u0532\u0561\u0581\u0561\u0580\u056f\u0576\u0565\u0580 \u057f\u0561\u057c\u0565\u0580\u056b \u0574\u056b\u057b\u0587",block_wordspacing:"\u0532\u0561\u0581\u0561\u0580\u056f\u0576\u0565\u0580 \u0562\u0561\u057c\u0565\u0580\u056b \u0574\u056b\u057b\u0587",background_vpos:"\u0548\u0582\u0572\u0572\u0561\u0570\u0561\u0575\u0561\u0581 \u057f\u0565\u0572\u0561\u056f\u0561\u0575\u0578\u0582\u0574",background_hpos:"\u0540\u0578\u0580\u056b\u0566\u0578\u0576\u0561\u056f\u0561\u0576 \u057f\u0565\u0572\u0561\u056f\u0561\u0575\u0578\u0582\u0574",background_attachment:"Attachment",background_repeat:"\u053f\u0580\u056f\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",background_image:"\u0556\u0578\u0576\u0561\u0575\u056b\u0576 \u0576\u056f\u0561\u0580",background_color:"\u0556\u0578\u0576\u056b \u0563\u0578\u0582\u0575\u0576",text_none:"\u0578\u0579\u056b\u0576\u0579",text_blink:"\u0569\u0561\u0580\u0569\u0578\u0582\u0574\u0576\u0565\u0580",text_case:"Case",text_striketrough:"\u0561\u0580\u057f\u0561\u0563\u056e\u057e\u0561\u056e",text_underline:"\u057d\u057f\u0578\u0580\u056b\u0576 \u0563\u056b\u056e",text_overline:"\u057e\u0565\u0580\u056b\u0576 \u0563\u056b\u056e",text_decoration:"\u0541\u0587\u0561\u057e\u0578\u0580\u0578\u0582\u0574",text_color:"\u0533\u0578\u0582\u0575\u0576"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ia_dlg.js b/js/tiny_mce/plugins/style/langs/ia_dlg.js new file mode 100755 index 000000000..2edb17560 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u53d8\u4f53",text_style:"\u6837\u5f0f",text_weight:"\u5bbd\u5ea6",text_size:"\u5927\u5c0f",text_font:"\u5b57\u4f53",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u8fb9\u6846",box_tab:"\u76d2\u6a21\u578b",block_tab:"\u533a\u5757",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u5e94\u7528",title:"\u7f16\u8f91 CSS \u6837\u5f0f\u8868",clip:"\u526a\u8f91",placement:"\u5e03\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z\u5750\u6807",visibility:"\u662f\u5426\u53ef\u89c1",positioning_type:"\u4f4d\u7f6e\u7c7b\u578b",position:"\u56fe\u7247\u4f4d\u7f6e",bullet_image:"\u6e05\u5355\u56fe\u7247",list_type:"\u5217\u8868\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",style:"\u6837\u5f0f",margin:"\u8fb9\u8ddd",left:"\u5de6\u4fa7",bottom:"\u5e95\u90e8",right:"\u53f3\u4fa7",top:"\u9876\u90e8",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5185\u8fb9\u8ddd",box_clear:"\u6e05\u9664",box_float:"\u6d6e\u52a8",box_height:"\u9ad8\u5ea6",box_width:"\u5bbd\u5ea6",block_display:"\u663e\u793a\u65b9\u5f0f",block_whitespace:"\u7a7a\u683c",block_text_indent:"\u6587\u5b57\u7f29\u8fdb",block_text_align:"\u6587\u5b57\u5bf9\u9f50",block_vertical_alignment:"\u5782\u76f4\u5bf9\u9f50\u65b9\u5f0f",block_letterspacing:"\u5b57\u6bcd\u95f4\u8ddd",block_wordspacing:"\u8bcd\u95f4\u8ddd",background_vpos:"\u5782\u76f4\u4f4d\u7f6e",background_hpos:"\u6c34\u5e73\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u590d",background_image:"\u80cc\u666f\u56fe\u7247",background_color:"\u80cc\u666f\u989c\u8272",text_none:"\u65e0",text_blink:"\u95ea\u70c1",text_case:"\u5b57\u4f53",text_striketrough:"\u4e2d\u5212\u7ebf",text_underline:"\u5e95\u7ebf",text_overline:"\u4e0a\u5212\u7ebf",text_decoration:"\u88c5\u9970",text_color:"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/id_dlg.js b/js/tiny_mce/plugins/style/langs/id_dlg.js new file mode 100755 index 000000000..326756fb9 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ii_dlg.js b/js/tiny_mce/plugins/style/langs/ii_dlg.js new file mode 100755 index 000000000..8293d0902 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ii_dlg.js @@ -0,0 +1,63 @@ +tinyMCE.addI18n('ii.style_dlg',{ +title:"\u7F16\u8F91CSS\u6837\u5F0F\u8868", +apply:"\u5E94\u7528", +text_tab:"\u6587\u5B57", +background_tab:"\u80CC\u666F", +block_tab:"\u5757", +box_tab:"\u7BB1\u578B", +border_tab:"\u8FB9\u6846", +list_tab:"\u5217\u8868", +positioning_tab:"\u4F4D\u7F6E", +text_props:"\u6587\u5B57", +text_font:"\u5B57\u4F53", +text_size:"\u5C3A\u5BF8", +text_weight:"\u5BBD\u5EA6", +text_style:"\u6837\u5F0F", +text_variant:"\u53D8\u4F53", +text_lineheight:"\u884C\u9AD8", +text_case:"\u5B57\u4F53", +text_color:"\u989C\u8272", +text_decoration:"\u4FEE\u9970", +text_overline:"\u4E0A\u5212\u7EBF", +text_underline:"\u5E95\u7EBF", +text_striketrough:"\u5220\u9664\u7EBF", +text_blink:"\u95EA\u70C1", +text_none:"\u65E0", +background_color:"\u80CC\u666F\u989C\u8272", +background_image:"\u80CC\u666F\u56FE\u7247", +background_repeat:"\u91CD\u590D", +background_attachment:"\u9644\u4EF6", +background_hpos:"\u5782\u76F4\u4F4D\u7F6E", +background_vpos:"\u6C34\u51C6\u4F4D\u7F6E", +block_wordspacing:"\u5355\u5B57\u95F4\u8DDD", +block_letterspacing:"\u5B57\u5143\u95F4\u8DDD", +block_vertical_alignment:"\u6C34\u51C6\u5BF9\u9F50\u65B9\u5F0F", +block_text_align:"\u6587\u5B57\u5BF9\u9F50", +block_text_indent:"\u6587\u5B57\u7F29\u6392", +block_whitespace:"\u7A7A\u767D", +block_display:"\u663E\u793A\u65B9\u5F0F", +box_width:"\u5BBD\u5EA6", +box_height:"\u9AD8\u5EA6", +box_float:"\u6D6E\u52A8", +box_clear:"\u6E05\u9664", +padding:"\u7559\u767D", +same:"\u5168\u90E8\u4E00\u6837", +top:"\u4E0A\u65B9", +right:"\u9760\u53F3", +bottom:"\u4E0B\u65B9", +left:"\u9760\u5DE6", +margin:"\u8FB9\u754C", +style:"\u6837\u5F0F", +width:"\u5BBD\u5EA6", +height:"\u9AD8\u5EA6", +color:"\u989C\u8272", +list_type:"\u7C7B\u578B", +bullet_image:"\u9879\u76EE\u56FE\u793A", +position:"\u56FE\u793A\u4F4D\u7F6E", +positioning_type:"\u7C7B\u578B", +visibility:"\u53EF\u89C1\u6027", +zindex:"Z\u8F74\u6DF1\u5EA6", +overflow:"\u6EA2\u51FA", +placement:"\u5E03\u7F6E", +clip:"\u526A\u8F91" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/is_dlg.js b/js/tiny_mce/plugins/style/langs/is_dlg.js new file mode 100755 index 000000000..54b974ba9 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/it_dlg.js b/js/tiny_mce/plugins/style/langs/it_dlg.js new file mode 100755 index 000000000..45109f854 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.style_dlg',{text_lineheight:"Altezza linea",text_variant:"Variante",text_style:"Stile",text_weight:"Spessore",text_size:"Dimensione",text_font:"Carattere",text_props:"Testo",positioning_tab:"Posizionamento",list_tab:"Liste",border_tab:"Bordi",box_tab:"Contenitore",block_tab:"Blocco",background_tab:"Sfondo",text_tab:"Testo",apply:"Applica",title:"Modifica stile CSS",clip:"Clip",placement:"Piazzamento",overflow:"Overflow",zindex:"Z-index",visibility:"Visibilit\u00e0",positioning_type:"Tipo",position:"Posizione",bullet_image:"Immagine Punto",list_type:"Tipo",color:"Colore",height:"Altezza",width:"Larghezza",style:"Stile",margin:"Margine",left:"Sinistro",bottom:"Inferiore",right:"Destro",top:"Superiore",same:"Uguale per tutti",padding:"Spazio dal bordo",box_clear:"Pulito",box_float:"Fluttuante",box_height:"Altezza",box_width:"Larghezza",block_display:"Visualizzazione",block_whitespace:"Whitespace",block_text_indent:"Indentazione testo",block_text_align:"Allineamento testo",block_vertical_alignment:"Allineamento verticale",block_letterspacing:"Spaziatura caratteri",block_wordspacing:"Spaziatura parole",background_vpos:"Posizione verticale",background_hpos:"Posizione orizzontale",background_attachment:"Allegato",background_repeat:"Repetizione",background_image:"Immagine sfondo",background_color:"Colore sfondo",text_none:"nessuna",text_blink:"lampeggiante",text_case:"Tipo",text_striketrough:"barrato",text_underline:"sottolineato",text_overline:"sopralineato",text_decoration:"Decorazione",text_color:"Colore"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ja_dlg.js b/js/tiny_mce/plugins/style/langs/ja_dlg.js new file mode 100755 index 000000000..700f19489 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.style_dlg',{"text_lineheight":"\u884c\u9ad8\u3055","text_variant":"\u5909\u5f62","text_style":"\u30b9\u30bf\u30a4\u30eb","text_weight":"\u592a\u3055","text_size":"\u30b5\u30a4\u30ba","text_font":"\u30d5\u30a9\u30f3\u30c8","text_props":"Text","positioning_tab":"\u30dd\u30b8\u30b7\u30e7\u30f3","list_tab":"\u30ea\u30b9\u30c8","border_tab":"\u67a0\u7dda","box_tab":"\u30dc\u30c3\u30af\u30b9","block_tab":"\u30d6\u30ed\u30c3\u30af","background_tab":"\u80cc\u666f","text_tab":"\u6587\u5b57",apply:"\u9069\u7528",title:"CSS\u7de8\u96c6",clip:"\u5207\u308a\u629c\u304d",placement:"\u4f4d\u7f6e",overflow:"\u30aa\u30fc\u30d0\u30fc\u30d5\u30ed\u30fc",zindex:"Z-Index",visibility:"\u8868\u793a","positioning_type":"\u914d\u7f6e\u65b9\u6cd5",position:"\u30de\u30fc\u30ab\u30fc\u8868\u793a\u4f4d\u7f6e","bullet_image":"\u30de\u30fc\u30ab\u30fc\u753b\u50cf","list_type":"\u30de\u30fc\u30ab\u30fc\u7a2e\u985e",color:"\u8272",height:"\u9ad8\u3055",width:"\u5e45",style:"\u30b9\u30bf\u30a4\u30eb",margin:"\u30de\u30fc\u30b8\u30f3",left:"\u5de6",bottom:"\u4e0b",right:"\u53f3",top:"\u4e0a",same:"\u5168\u3066\u540c\u3058\u306b\u3059\u308b",padding:"\u30d1\u30c7\u30a3\u30f3\u30b0","box_clear":"\u56de\u308a\u8fbc\u307f\u89e3\u9664","box_float":"\u56de\u308a\u8fbc\u307f","box_height":"\u9ad8\u3055","box_width":"\u5e45","block_display":"\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4","block_whitespace":"\u7a7a\u767d\u6587\u5b57","block_text_indent":"\u30a4\u30f3\u30c7\u30f3\u30c8","block_text_align":"\u6c34\u5e73\u914d\u7f6e","block_vertical_alignment":"\u5782\u76f4\u914d\u7f6e","block_letterspacing":"\u6587\u5b57\u9593\u9694","block_wordspacing":"\u5358\u8a9e\u611f\u899a","background_vpos":"\u5782\u76f4\u4f4d\u7f6e","background_hpos":"\u6c34\u5e73\u4f4d\u7f6e","background_attachment":"Attachment","background_repeat":"\u7e70\u308a\u8fd4\u3057","background_image":"\u80cc\u666f\u753b\u50cf","background_color":"\u80cc\u666f\u8272","text_none":"\u306a\u3057","text_blink":"\u70b9\u6ec5","text_case":"\u5927\u6587\u5b57/\u5c0f\u6587\u5b57","text_striketrough":"\u6253\u6d88\u3057\u7dda","text_underline":"\u4e0b\u7dda","text_overline":"\u4e0a\u7dda","text_decoration":"\u88c5\u98fe","text_color":"\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ka_dlg.js b/js/tiny_mce/plugins/style/langs/ka_dlg.js new file mode 100755 index 000000000..6d2acf423 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.style_dlg',{text_lineheight:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d8\u10e1 \u10e1\u10d8\u10db\u10d0\u10e6\u10da\u10d4",text_variant:"\u10d5\u10d0\u10e0\u10d8\u10d0\u10dc\u10e2\u10d8",text_style:"\u10e1\u10e2\u10d8\u10da\u10d8",text_weight:"\u10e1\u10d8\u10e1\u10e5\u10d4",text_size:"\u10d6\u10dd\u10db\u10d0",text_font:"\u10e8\u10e0\u10d8\u10e4\u10e2\u10d8",text_props:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8",positioning_tab:"\u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10dd\u10dc\u10d8\u10e0\u10d4\u10d1\u10d0",list_tab:"\u10e1\u10d8\u10d0",border_tab:"\u10e1\u10d0\u10d6\u10e6\u10d5\u10d0\u10e0\u10d8",box_tab:"\u10d9\u10d8\u10d3\u10d4\u10d4\u10d1\u10d8",block_tab:"\u10d1\u10da\u10dd\u10d9\u10d8",background_tab:"\u10e4\u10dd\u10dc\u10d8",text_tab:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8",apply:"\u10d2\u10d0\u10db\u10dd\u10d5\u10d8\u10e7\u10d4\u10dc\u10dd\u10d7",title:"CSS \u10e1\u10e2\u10d8\u10da\u10d8\u10e1 \u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10dd\u10e0\u10d8",clip:"\u10db\u10dd\u10d9\u10d5\u10d4\u10d7\u10d0",placement:"\u10d2\u10d0\u10dc\u10d7\u10d0\u10d5\u10e1\u10d4\u10d1\u10d0",overflow:"\u10d2\u10d0\u10d3\u10d0\u10d5\u10e1\u10d4\u10d1\u10d0",zindex:"Z-\u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d8",visibility:"\u10ee\u10d8\u10da\u10d5\u10d0\u10d3\u10dd\u10d1\u10d0",positioning_type:"\u10e2\u10d8\u10de\u10d8",position:"\u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10d0",bullet_image:"\u10db\u10d0\u10e0\u10d9\u10d4\u10e0\u10d8",list_type:"\u10e2\u10d8\u10de\u10d8",color:"\u10e4\u10d4\u10e0\u10d8",height:"\u10e1\u10d8\u10db\u10d0\u10e6\u10da\u10d4",width:"\u10e1\u10d8\u10d2\u10d0\u10dc\u10d4",style:"\u10e1\u10e2\u10d8\u10da\u10d8",margin:"\u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",left:"\u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d5",bottom:"\u10e5\u10d5\u10d4\u10db\u10dd\u10d7",right:"\u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d5",top:"\u10d6\u10d4\u10db\u10dd\u10d7",same:"\u10e7\u10d5\u10d4\u10da\u10d0\u10e1\u10d7\u10d5\u10d8\u10e1 \u10d4\u10e0\u10d7\u10dc\u10d0\u10d4\u10e0\u10d0\u10d3",padding:"\u10db\u10d8\u10dc\u10d3\u10d5\u10e0\u10d4\u10d1\u10d8",box_clear:"\u10db\u10dd\u10e1\u10e3\u10e4\u10d7\u10d0\u10d5\u10d4\u10d1\u10d0",box_float:"\u10db\u10dd\u10ea\u10e3\u10e0\u10d0\u10d5\u10d4",box_height:"\u10e1\u10d8\u10db\u10d0\u10e6\u10da\u10d4",box_width:"\u10e1\u10d8\u10d2\u10d0\u10dc\u10d4",block_display:"\u10d0\u10e1\u10d0\u10ee\u10d5\u10d0",block_whitespace:"\u10e1\u10d8\u10d5\u10e0\u10ea\u10d4",block_text_indent:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",block_text_align:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",block_vertical_alignment:"\u10d5\u10d4\u10e0\u10e2\u10d8\u10d9\u10d0\u10da\u10e3\u10e0\u10d8 \u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",block_letterspacing:"\u10d0\u10e1\u10dd\u10d4\u10d1\u10e1 \u10e8\u10dd\u10e0\u10d8\u10e1 \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",block_wordspacing:"\u10e1\u10d8\u10e2\u10e7\u10d5\u10d4\u10d1\u10e1 \u10e8\u10dd\u10e0\u10d8\u10e1 \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",background_vpos:"\u10d5\u10d4\u10e0\u10e2\u10d8\u10d9\u10d0\u10da\u10e3\u10e0\u10d8 \u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10d0",background_hpos:"\u10f0\u10dd\u10e0\u10d8\u10d6\u10dd\u10dc\u10e2\u10d0\u10da\u10e3\u10e0\u10d8 \u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10d0",background_attachment:"\u10db\u10d8\u10d1\u10db\u10d0",background_repeat:"\u10d2\u10d0\u10db\u10d4\u10dd\u10e0\u10d4\u10d1\u10d0",background_image:"\u10e4\u10dd\u10dc\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d4\u10d1\u10d0",background_color:"\u10e4\u10dd\u10dc\u10d8\u10e1 \u10e4\u10d4\u10e0\u10d8",text_none:"\u10e7\u10d5\u10d4\u10da\u10d0\u10e4\u10e0\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4",text_blink:"\u10db\u10dd\u10ea\u10d8\u10db\u10ea\u10d8\u10db\u10d4",text_case:"\u10e0\u10d4\u10d2\u10d8\u10e1\u10e2\u10e0\u10d8",text_striketrough:"\u10d2\u10d0\u10d3\u10d0\u10ee\u10d0\u10d6\u10e3\u10da\u10d8",text_underline:"\u10db\u10dd\u10ee\u10d0\u10d6\u10e3\u10da\u10d8",text_overline:"\u10d6\u10d4\u10d3\u10d0 \u10ee\u10d0\u10d6\u10d8\u10d7",text_decoration:"\u10d2\u10d0\u10e4\u10dd\u10e0\u10db\u10d4\u10d1\u10d0",text_color:"\u10e4\u10d4\u10e0\u10d8"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/kl_dlg.js b/js/tiny_mce/plugins/style/langs/kl_dlg.js new file mode 100755 index 000000000..eef4f01c3 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/km_dlg.js b/js/tiny_mce/plugins/style/langs/km_dlg.js new file mode 100755 index 000000000..479a159fe --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.style_dlg',{text_lineheight:"\u1780\u1798\u17d2\u1796\u179f\u17cb\u1787\u17bd\u179a",text_variant:"\u1780\u17c6\u179b\u17b6\u1799",text_style:"\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798",text_weight:"\u1780\u1798\u17d2\u179a\u17b6\u179f\u17cb",text_size:"\u1791\u17c6\u17a0\u17c6",text_font:"\u1796\u17bb\u1798\u17d2\u1796\u17a2\u1780\u17d2\u179f\u179a",text_props:"\u17a2\u178f\u17d2\u1790\u1794\u1791",positioning_tab:"\u1780\u17b6\u179a\u1780\u17c6\u178e\u178f\u17cb\u1791\u17b8\u178f\u17b6\u17c6\u1784",list_tab:"\u1794\u1789\u17d2\u1787\u17b8",border_tab:"\u179f\u17ca\u17bb\u1798",box_tab:"\u1794\u17d2\u179a\u17a2\u1794\u17cb",block_tab:"\u1794\u17d2\u179b\u17bb\u1780",background_tab:"\u1795\u17d2\u1791\u17c2\u1781\u17b6\u1784\u1780\u17d2\u179a\u17c4\u1799",text_tab:"\u17a2\u178f\u17d2\u1790\u1794\u1791",apply:"\u17a2\u1793\u17bb\u179c\u178f\u17d2\u178f",title:"\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798 CSS",clip:"\u178f\u1798\u17d2\u1794\u17c0\u178f\u1781\u17d2\u1791\u17b6\u179f\u17cb",placement:"\u1780\u17b6\u179a\u178a\u17b6\u1780\u17cb",overflow:"\u179b\u17be\u179f\u1785\u17c6\u178e\u17bb\u17c7",zindex:"\u17a2\u17d0\u1780\u17d2\u179f Z",visibility:"\u1797\u17b6\u1796\u17a2\u17b6\u1785\u1798\u17be\u179b\u1783\u17be\u1789",positioning_type:"\u1794\u17d2\u179a\u1797\u17c1\u1791",position:"\u1791\u17b8\u178f\u17b6\u17c6\u1784",bullet_image:"\u179a\u17bc\u1794\u1797\u17b6\u1796\u1785\u17c6\u178e\u17bb\u1785",list_type:"\u1794\u17d2\u179a\u1797\u17c1\u1791",color:"\u1796\u178e\u17cc",height:"\u1780\u1798\u17d2\u1796\u179f\u17cb",width:"\u1791\u1791\u17b9\u1784",style:"\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798",margin:"\u179a\u17b9\u1798",left:"\u1786\u17d2\u179c\u17c1\u1784",bottom:"\u1794\u17b6\u178f",right:"\u179f\u17d2\u178a\u17b6\u17c6",top:"\u1780\u17c6\u1796\u17bc\u179b",same:"\u178f\u17bc\u1785\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb",padding:"\u1785\u1793\u17d2\u179b\u17c4\u17c7",box_clear:"\u179f\u17c6\u17a2\u17b6\u178f",box_float:"\u17a2\u178e\u17d2\u178a\u17c2\u178f",box_height:"\u1780\u1798\u17d2\u1796\u179f\u17cb",box_width:"\u1791\u1791\u17b9\u1784",block_display:"\u1794\u1784\u17d2\u17a0\u17b6\u1789",block_whitespace:"\u1791\u1791\u17c1\u179f\u17d2\u17a2\u17b6\u178f",block_text_indent:"\u1785\u17bc\u179b\u1794\u1793\u17d2\u1791\u17b6\u178f\u17cb\u17a2\u178f\u17d2\u1790\u1794\u1791",block_text_align:"\u178f\u1798\u17d2\u179a\u17b9\u1798\u17a2\u178f\u17d2\u1790\u1794\u1791",block_vertical_alignment:"\u178f\u1798\u17d2\u179a\u17b9\u1798\u1794\u1789\u17d2\u1788\u179a",block_letterspacing:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u17a2\u1780\u17d2\u179f\u179a",block_wordspacing:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1796\u17b6\u1780\u17d2\u1799",background_vpos:"\u1791\u17b8\u178f\u17b6\u17c6\u1784\u1794\u1789\u17d2\u1788\u179a",background_hpos:"\u1791\u17b8\u178f\u17b6\u17c6\u1784\u1795\u17d2\u178a\u17c1\u1780",background_attachment:"\u17af\u1780\u179f\u17b6\u179a\u1797\u17d2\u1787\u17b6\u1794\u17cb",background_repeat:"\u1792\u17d2\u179c\u17be\u1798\u17d2\u178a\u1784\u1791\u17c0\u178f",background_image:"\u179a\u17bc\u1794\u1797\u17b6\u1796\u1795\u17d2\u1791\u17c3\u1781\u17b6\u1784\u1780\u17d2\u179a\u17c4\u1799",background_color:"\u1796\u178e\u17cc\u1795\u17d2\u1791\u17c3\u1781\u17b6\u1784\u1780\u17d2\u179a\u17c4\u1799",text_none:"\u1782\u17d2\u1798\u17b6\u1793",text_blink:"\u1797\u17d2\u179b\u17b9\u1794\u1797\u17d2\u179b\u17c2\u178f",text_case:"\u1780\u179a\u178e\u17b8",text_striketrough:"\u1794\u1793\u17d2\u1791\u17b6\u178f\u17cb\u1786\u17bc\u178f",text_underline:"\u1782\u17bc\u179f\u1794\u1793\u17d2\u1791\u17b6\u178f\u17cb\u1780\u17d2\u179a\u17c4\u1798",text_overline:"\u1782\u17bc\u179f\u1794\u1793\u17d2\u1791\u17b6\u178f\u17cb\u179b\u17be",text_decoration:"\u1780\u17b6\u179a\u178f\u17bb\u1794\u178f\u17c2\u1784",text_color:"\u1796\u178e\u17cc"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ko_dlg.js b/js/tiny_mce/plugins/style/langs/ko_dlg.js new file mode 100755 index 000000000..05cd8362e --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.style_dlg',{text_lineheight:"\ud589 \ub192\uc774",text_variant:"Variant",text_style:"\uc2a4\ud0c0\uc77c",text_weight:"\uad75\uae30",text_size:"\ud06c\uae30",text_font:"\ud3f0\ud2b8",text_props:"\ud14d\uc2a4\ud2b8",positioning_tab:"\uc704\uce58",list_tab:"\ub9ac\uc2a4\ud2b8",border_tab:"\ud14c\ub450\ub9ac\uc120",box_tab:"\ubc15\uc2a4",block_tab:"\ube14\ub85d",background_tab:"\ubc30\uacbd",text_tab:"\ud14d\uc2a4\ud2b8",apply:"\uc801\uc6a9",title:"CSS\ud3b8\uc9d1",clip:"Clip",placement:"\uc704\uce58(placement)",overflow:"\uc624\ubc84\ud50c\ub85c\uc6b0",zindex:"Z-index",visibility:"\uac00\uc2dc\uc131",positioning_type:"\ud0c0\uc785",position:"\uc704\uce58",bullet_image:"\ube14\ub9bf \uc774\ubbf8\uc9c0",list_type:"\ubaa9\ub85d\uc885\ub958",color:"\uc0c9",height:"\ub192\uc774",width:"\ud3ed",style:"\uc2a4\ud0c0\uc77c",margin:"\ub9c8\uc9c4",left:"\uc88c",bottom:"\ud558",right:"\uc6b0",top:"\uc0c1",same:"\ubaa8\ub450 \ub611\uac19\uc774",padding:"padding",box_clear:"Clear",box_float:"float",box_height:"\ub192\uc774",box_width:"\ud3ed",block_display:"\ud45c\uc2dc",block_whitespace:"\uacf5\ubc31 \ubb38\uc790",block_text_indent:"\ub4e4\uc5ec\uc4f0\uae30",block_text_align:"\ud14d\uc2a4\ud2b8 \uc815\ub82c",block_vertical_alignment:"\uc218\uc9c1 \uc704\uce58",block_letterspacing:"\ubb38\uc790 \uac04\uaca9",block_wordspacing:"\ub2e8\uc5b4 \uac04\uaca9",background_vpos:"\uc218\uc9c1 \uc704\uce58",background_hpos:"\uc218\ud3c9 \uc704\uce58",background_attachment:"\ucca8\ubd80",background_repeat:"\ubc18\ubcf5",background_image:"\ubc30\uacbd \uc774\ubbf8\uc9c0",background_color:"\ubc30\uacbd\uc0c9",text_none:"\uc5c6\uc74c",text_blink:"\uc810\uba78",text_case:"\ub300/\uc18c\ubb38\uc790",text_striketrough:"\ucde8\uc18c\uc120",text_underline:"\ubc11\uc904",text_overline:"\uc717\uc904",text_decoration:"\uc7a5\uc2dd",text_color:"\uc0c9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/lb_dlg.js b/js/tiny_mce/plugins/style/langs/lb_dlg.js new file mode 100755 index 000000000..56009130c --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.style_dlg',{text_lineheight:"Zeilenh\u00e9icht",text_variant:"Variant",text_style:"Stil",text_weight:"D\u00e9ckt",text_size:"Gr\u00e9isst",text_font:"Schr\u00ebftaart",text_props:"Text",positioning_tab:"Position\u00e9ierung",list_tab:"L\u00ebscht",border_tab:"Rumm",box_tab:"Box",block_tab:"Block",background_tab:"Hannergrond",text_tab:"Text",apply:"Iwwerhuelen",title:"CSS-Styles beaarbechten",clip:"Ausschn\u00ebtt",placement:"Plaz\u00e9ierung",overflow:"Verhale bei Iwwergr\u00e9isst",zindex:"Z-W\u00e4ert",visibility:"Siichtbar",positioning_type:"Aart vun der Position\u00e9ierung",position:"Position\u00e9ierung",bullet_image:"L\u00ebschtepunkt-Grafik",list_type:"L\u00ebschtepunkt-Aart",color:"Textfuerf",height:"H\u00e9icht",width:"Breet",style:"Format",margin:"Baussechten Ofstand",left:"L\u00e9nks",bottom:"\u00cbnnen",right:"Riets",top:"Uewen",same:"All selwecht",padding:"Banneschten Ofstand",box_clear:"\u00cbmfl\u00e9issung verh\u00ebnneren",box_float:"\u00cbmfl\u00e9issung",box_height:"H\u00e9icht",box_width:"Breet",block_display:"\u00cbmbrochverhalen",block_whitespace:"Automateschen \u00cbmbroch",block_text_indent:"Ar\u00e9ckung",block_text_align:"Ausriichtung",block_vertical_alignment:"Vertikal Ausriichtung",block_letterspacing:"Buschtawenofstand",block_wordspacing:"Wuertofstand",background_vpos:"Positioun Y",background_hpos:"Positioun X",background_attachment:"Waasserzeecheneffekt",background_repeat:"Widderhuelung",background_image:"Hannergrondbild",background_color:"Hannergrondfuerf",text_none:"keng",text_blink:"bl\u00ebnkend",text_case:"Schreiwung",text_striketrough:"duerchgestrach",text_underline:"\u00ebnnerstrach",text_overline:"iwwerstrach",text_decoration:"Gestaltung",text_color:"Fuerf"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/lt_dlg.js b/js/tiny_mce/plugins/style/langs/lt_dlg.js new file mode 100755 index 000000000..06cb8500e --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.style_dlg',{text_lineheight:"Eilut\u0117s auk\u0161tis",text_variant:"Variantas",text_style:"Stilius",text_weight:"Storis",text_size:"Dydis",text_font:"\u0160riftas",text_props:"Tekstas",positioning_tab:"Pozicionavimas",list_tab:"S\u0105ra\u0161as",border_tab:"R\u0117melis",box_tab:"D\u0117\u017eut\u0117",block_tab:"Blokas",background_tab:"Fonas",text_tab:"Tekstas",apply:"Taikyti",title:"Redaguoti CSS stili\u0173",clip:"\u012era\u0161as",placement:"Talpinimas",overflow:"Perpildymas",zindex:"Z-indeksas",visibility:"Matomumas",positioning_type:"Tipas",position:"Pozicija",bullet_image:"\u017denklelio paveiksl\u0117lis",list_type:"Tipas",color:"Spalva",height:"Auk\u0161tis",width:"Ilgis",style:"Stilius",margin:"Para\u0161t\u0117",left:"Kair\u0117je",bottom:"Apa\u010dioje",right:"De\u0161in\u0117je",top:"Vir\u0161uje",same:"Tas pats visiems",padding:"U\u017epildymas",box_clear:"I\u0161valyti",box_float:"Slankus",box_height:"Auk\u0161tis",box_width:"Ilgis",block_display:"Rodymas",block_whitespace:"Tarpai",block_text_indent:"Teksto atitraukimas",block_text_align:"Teksto lygiavimas",block_vertical_alignment:"Vertikalus lygiavimas",block_letterspacing:"Tarpai tarp raid\u017ei\u0173",block_wordspacing:"Tarpai tarp \u017eod\u017ei\u0173",background_vpos:"Vertikali pozicija",background_hpos:"Horizontali pozicija",background_attachment:"Priedas",background_repeat:"Kartoti",background_image:"Fono paveiksl\u0117lis",background_color:"Fono spalva",text_none:"joks",text_blink:"mirks\u0117jimas",text_case:"Ma\u017eosios/did\u017eiosios raid\u0117s",text_striketrough:"perbraukta",text_underline:"pabraukta apa\u010dioje",text_overline:"pabraukta vir\u0161uje",text_decoration:"Dekoracija",text_color:"Spalva"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/lv_dlg.js b/js/tiny_mce/plugins/style/langs/lv_dlg.js new file mode 100755 index 000000000..c3a3b5c0c --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Klips",placement:"Izvietojums",overflow:"P\u0101rm\u0113rs",zindex:"Z-index",visibility:"Redzam\u012bba",positioning_type:"Tips",position:"Poz\u012bcija",bullet_image:"Bullet bilde",list_type:"Tips",color:"Kr\u0101sa",height:"Augstums",width:"Platums",style:"St\u012bls",margin:"Mala",left:"Pa kreisi",bottom:"Apak\u0161a",right:"Pa labi",top:"Aug\u0161a",same:"Same for all",padding:"Atstarpe",box_clear:"Clear",box_float:"Float",box_height:"Augstums",box_width:"Platums",block_display:"Display",block_whitespace:"Tuk\u0161ais laukums",block_text_indent:"\u00c9crit indent",block_text_align:"Teksta izl\u012bdzin\u0101jums",block_vertical_alignment:"Vertik\u0101lais izl\u012bdzin\u0101jums",block_letterspacing:"Burtu atstarpe",block_wordspacing:"V\u0101rdu atstarpe",background_vpos:"Vertik\u0101l\u0101 poz\u012bcija",background_hpos:"Horizont\u0101l\u0101 poz\u012bcija",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/mk_dlg.js b/js/tiny_mce/plugins/style/langs/mk_dlg.js new file mode 100755 index 000000000..00b5428fa --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ml_dlg.js b/js/tiny_mce/plugins/style/langs/ml_dlg.js new file mode 100755 index 000000000..c56213510 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/mn_dlg.js b/js/tiny_mce/plugins/style/langs/mn_dlg.js new file mode 100755 index 000000000..3ac2a8cc7 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.style_dlg',{text_lineheight:"\u041c\u04e9\u0440\u043d\u0438\u0439 \u04e9\u043d\u0434\u04e9\u0440",text_variant:"\u0412\u0430\u0440\u0438\u0430\u043d\u0442",text_style:"\u0425\u044d\u043b\u0431\u044d\u0440",text_weight:"\u04e8\u0440\u0433\u04e9\u043d \u043d\u0430\u0440\u0438\u0439\u043d",text_size:"\u0425\u044d\u043c\u0436\u044d\u044d",text_font:"\u0424\u043e\u043d\u0442",text_props:"\u0411\u0438\u0447\u0432\u044d\u0440",positioning_tab:"\u0411\u0430\u0439\u0440\u0448\u0438\u043b",list_tab:"\u0416\u0430\u0433\u0441\u0430\u0430\u043b\u0442",border_tab:"\u0425\u04af\u0440\u044d\u044d",box_tab:"\u0425\u0430\u0439\u0440\u0446\u0430\u0433",block_tab:"\u0411\u043b\u043e\u043a",background_tab:"\u0414\u044d\u0432\u0441\u0433\u044d\u0440",text_tab:"\u0411\u0438\u0447\u0432\u044d\u0440",apply:"\u0425\u044d\u0440\u044d\u0433\u043b\u044d\u0445",title:"CSS-Styles \u0437\u0430\u0441\u0432\u0430\u0440\u043b\u0430\u0445",clip:"\u0422\u0430\u0439\u0440\u0434\u0430\u0441",placement:"\u0411\u0430\u0439\u0440\u0448\u0438\u043b",overflow:"\u0425\u044d\u0442\u044d\u0440\u0441\u044d\u043d \u0445\u044d\u043c\u0436\u044d\u044d\u043d\u0438\u0439 \u0445\u0430\u0440\u044c\u0446\u0430\u0430",zindex:"Z \u0443\u0442\u0433\u0430",visibility:"\u0425\u0430\u0440\u0430\u0433\u0434\u0430\u0445\u0443\u0439\u0446",positioning_type:"\u0411\u0430\u0439\u0440\u0448\u043b\u044b\u043d \u0442\u04e9\u0440\u04e9\u043b",position:"\u0411\u0430\u0439\u0440\u0448\u0438\u043b",bullet_image:"\u0413\u0440\u0430\u0444\u0438\u043a \u0442\u043e\u043e\u0447\u0438\u043b\u0442\u044b\u043d \u0446\u044d\u0433",list_type:"\u0422\u043e\u043e\u0447\u0438\u043b\u0442\u044b\u043d \u0446\u044d\u0433\u0438\u0439\u043d \u0445\u044d\u043b\u0431\u044d\u0440",color:"\u0411\u0438\u0447\u0432\u044d\u0440\u0438\u0439\u043d \u04e9\u043d\u0433\u04e9",height:"\u04e8\u043d\u0434\u04e9\u0440",width:"\u04e8\u0440\u0433\u04e9\u043d",style:"\u0424\u043e\u0440\u043c\u0430\u0442",margin:"\u0413\u0430\u0434\u0430\u0430\u0434 \u0437\u0430\u0439",left:"\u0417\u04af\u04af\u043d",bottom:"\u0414\u043e\u043e\u0440",right:"\u0411\u0430\u0440\u0443\u0443\u043d",top:"\u0414\u044d\u044d\u0440",same:"\u0411\u04af\u0433\u0434 \u0438\u0436\u0438\u043b",padding:"\u0414\u043e\u0442\u043e\u043e\u0434 \u0437\u0430\u0439",box_clear:"\u0413\u04af\u0439\u043b\u0433\u044d\u043b\u0442 \u0445\u0430\u0430\u0445",box_float:"\u0413\u04af\u0439\u043b\u0433\u044d\u043b\u0442",box_height:"\u04e8\u043d\u0434\u04e9\u0440",box_width:"\u04e8\u0440\u0433\u04e9\u043d",block_display:"\u041e\u0440\u043e\u043e\u0445 \u0445\u044d\u043b\u0431\u044d\u0440",block_whitespace:"\u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u043c\u04e9\u0440 \u043e\u0440\u043e\u043e\u043b\u0442",block_text_indent:"\u0414\u043e\u0433\u043e\u043b \u043c\u04e9\u0440",block_text_align:"\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",block_vertical_alignment:"\u0411\u043e\u0441\u043e\u043e \u0436\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",block_letterspacing:"\u04ae\u0441\u044d\u0433 \u0445\u043e\u043e\u0440\u043e\u043d\u0434\u044b\u043d \u0437\u0430\u0439",block_wordspacing:"\u04ae\u0433 \u0445\u043e\u043e\u0440\u043e\u043d\u0434\u044b\u043d \u0437\u0430\u0439",background_vpos:"\u0411\u0430\u0439\u0440\u043b\u0430\u043b Y",background_hpos:"\u0411\u0430\u0439\u0440\u043b\u0430\u043b X",background_attachment:"\u0423\u0441\u0430\u043d \u0442\u044d\u043c\u0434\u0433\u0438\u0439\u043d \u044d\u0444\u0444\u0435\u043a\u0442",background_repeat:"\u0414\u0430\u0432\u0442\u0430\u043b\u0442",background_image:"\u0414\u044d\u0432\u0441\u0433\u044d\u0440 \u0437\u0443\u0440\u0430\u0433",background_color:"\u0414\u044d\u0432\u0441\u0433\u044d\u0440 \u04e9\u043d\u0433\u04e9",text_none:"\u0431\u0430\u0439\u0445\u0433\u04af\u0439",text_blink:"\u0430\u043d\u0438\u0432\u0447\u0438\u043b\u0442",text_case:"\u0411\u0438\u0447\u0432\u044d\u0440",text_striketrough:"\u0434\u0430\u0440\u0441\u0430\u043d",text_underline:"\u0434\u043e\u043e\u0433\u0443\u0443\u0440 \u043d\u044c \u0437\u0443\u0440\u0441\u0430\u043d",text_overline:"\u0434\u044d\u044d\u0433\u04af\u04af\u0440 \u043d\u044c \u0437\u0443\u0440\u0441\u0430\u043d",text_decoration:"\u0427\u0438\u043c\u044d\u0433\u043b\u044d\u043b",text_color:"\u04e8\u043d\u0433\u04e9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ms_dlg.js b/js/tiny_mce/plugins/style/langs/ms_dlg.js new file mode 100755 index 000000000..deea226cd --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.style_dlg',{text_lineheight:"Tinggi garisan",text_variant:"Varian",text_style:"Gaya",text_weight:"Beban",text_size:"Saiz",text_font:"Huruf",text_props:"Teks",positioning_tab:"Kedudukan",list_tab:"Senarai",border_tab:"Sempadan",box_tab:"Kotak",block_tab:"Landasan",background_tab:"Latar belakang",text_tab:"Teks",apply:"Guna",title:"Sunting Gaya CSS",clip:"Klip",placement:"Penempatan",overflow:"Limpahan",zindex:"Indeks-Z",visibility:"Kelihatan",positioning_type:"Jenis",position:"Posisi",bullet_image:"Imej peluru",list_type:"Jenis",color:"Warna",height:"Tinggi",width:"Lebar",style:"Gaya",margin:"Ruangan tepi",left:"Kiri",bottom:"Bawah",right:"Kanan",top:"Atas",same:"Samakan kesemuanya",padding:"Lapisan",box_clear:"Ruangan jelas",box_float:"Apungan",box_height:"Tinggi",box_width:"Lebar",block_display:"Pamer",block_whitespace:"Ruangan putih",block_text_indent:"Takukan teks",block_text_align:"Penjajaran teks",block_vertical_alignment:"Penjajaran tegak",block_letterspacing:"Jarak huruf",block_wordspacing:"Jarak perkataan",background_vpos:"Posisi tegak",background_hpos:"Posisi mengufuk",background_attachment:"Sisipan",background_repeat:"Ulangan",background_image:"Imej Latar",background_color:"Warna Latar",text_none:"tiada",text_blink:"kelip",text_case:"Kes",text_striketrough:"garis tengah",text_underline:"garis bawah",text_overline:"garis atas",text_decoration:"Dekorasi",text_color:"Warna"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/my_dlg.js b/js/tiny_mce/plugins/style/langs/my_dlg.js new file mode 100755 index 000000000..06ff3d272 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.style_dlg',{text_lineheight:"\u1005\u102c\u1031\u103c\u1000\u102c\u1004\u103a\u1038 \u1021\u103c\u1019\u1004\u103a\u1037",text_variant:"\u1015\u1036\u102f\u1005\u1036\u1000\u103d\u1032",text_style:"\u1005\u102c\u101c\u1036\u102f\u1038 \u1005\u1010\u102d\u102f\u1004\u103a",text_weight:"\u1005\u102c\u101c\u1036\u102f\u1038 \u1021\u1011\u1030\u1021\u1015\u102b\u1038",text_size:"\u1005\u102c\u101c\u1036\u102f\u1038 \u1021\u101b\u103d\u101a\u103a",text_font:"\u1005\u102c\u101c\u1036\u102f\u1038 \u1031\u1016\u102c\u1004\u103a\u1037",text_props:"\u1005\u102c\u101e\u102c\u1038",positioning_tab:"\u1010\u100a\u103a\u1031\u1014\u101b\u102c",list_tab:"\u1005\u102c\u101b\u1004\u103a\u1038",border_tab:"\u1014\u101a\u103a\u1005\u100a\u103a\u1038",box_tab:"\u1015\u1036\u102f\u1038",block_tab:"\u1021\u1000\u103d\u1000\u103a",background_tab:"\u1031\u1014\u102c\u1000\u103a\u1001",text_tab:"\u1005\u102c\u101e\u102c\u1038",apply:"\u1021\u101e\u1036\u102f\u1038\u103c\u1015\u102f\u1019\u100a\u103a",title:"CSS \u1005\u1010\u102d\u102f\u1004\u103a \u103c\u1015\u102f\u103c\u1015\u1004\u103a\u101b\u1014\u103a",clip:"\u1000\u101c\u1005\u103a",placement:"\u1031\u1014\u101b\u102c\u1021\u1011\u102c\u1038\u1021\u101e\u102d\u102f",overflow:"\u101c\u103b\u103e\u1036\u1011\u103d\u1000\u103a\u1019\u103e\u102f",zindex:"Z-Index",visibility:"\u103c\u1019\u1004\u103a\u1014\u102d\u102f\u1004\u103a\u1005\u103d\u1019\u103a\u1038",positioning_type:"\u1021\u1019\u103b\u102d\u102f\u1038\u1021\u1005\u102c\u1038",position:"\u1010\u100a\u103a\u1031\u1014\u101b\u102c",bullet_image:"\u1021\u1019\u103e\u1010\u103a\u1021\u101e\u102c\u1038 \u101b\u102f\u1015\u103a\u1015\u1036\u102f",list_type:"\u1021\u1019\u102d\u103b\u102f\u1038\u1021\u1005\u102c\u1038",color:"\u1021\u1031\u101b\u102c\u1004\u103a",height:"\u1021\u103c\u1019\u1004\u103a\u1037",width:"\u1021\u1000\u103b\u101a\u103a",style:"\u1005\u1010\u102d\u102f\u1004\u103a",margin:"\u1031\u1018\u1038\u1019\u103b\u1009\u103a\u1038",left:"\u1018\u101a\u103a",bottom:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001",right:"\u100a\u102c",top:"\u1021\u1011\u1000\u103a",same:"\u1021\u102c\u1038\u101c\u1036\u102f\u1038\u1021\u1010\u1030\u1010\u1030",padding:"\u1031\u1018\u1038\u1021\u1000\u102c\u1000\u103d\u1000\u103a\u101c\u1015\u103a",box_clear:"\u1015\u101a\u103a\u101b\u103e\u1004\u103a\u1038",box_float:"\u1031\u1019\u103b\u102c\u101c\u103d\u1004\u103a\u1037",box_height:"\u1021\u103c\u1019\u1004\u103a\u1037",box_width:"\u1021\u1000\u103b\u101a\u103a",block_display:"\u103c\u1015\u101e\u1015\u1036\u102f \u103c\u1019\u1004\u103a\u1000\u103d\u1004\u103a\u1038",block_whitespace:"\u1021\u103c\u1016\u1030\u1031\u101b\u102c\u1004\u103a\u1000\u103d\u1000\u103a\u101c\u1015\u103a",block_text_indent:"\u1005\u102c\u101e\u102c\u1038 Indent",block_text_align:"\u1005\u102c\u101e\u102c\u1038 \u1001\u103b\u102d\u1014\u103a\u100a\u102d\u103e\u1015\u1036\u102f",block_vertical_alignment:"\u1031\u1012\u102b\u1004\u103a\u101c\u102d\u102f\u1000\u103a \u1001\u103b\u102d\u1014\u103a\u100a\u102d\u103e\u1019\u103e\u102f",block_letterspacing:"\u1005\u102c\u101c\u1036\u102f\u1038 \u1021\u1000\u103d\u102c\u1021\u1031\u101d\u1038",block_wordspacing:"\u1005\u1000\u102c\u1038\u101c\u1036\u102f\u1038 \u1021\u1000\u103d\u102c\u1021\u1031\u101d\u1038",background_vpos:"\u1031\u1012\u102b\u1004\u103a\u101c\u102d\u102f\u1000\u103a \u1010\u100a\u103a\u1031\u1014\u101b\u102c",background_hpos:"\u1021\u101c\u103b\u102c\u1038\u101c\u102d\u102f\u1000\u103a \u1010\u100a\u103a\u1031\u1014\u101b\u102c",background_attachment:"\u1010\u103d\u1032\u1001\u103b\u102d\u1010\u103a\u1019\u103e\u102f",background_repeat:"\u103c\u1015\u1014\u103a\u1031\u1000\u103b\u102c\u1037",background_image:"\u1031\u1014\u102c\u1000\u103a\u1001\u1036 \u101b\u102f\u1015\u103a\u1015\u1036\u102f",background_color:"\u1031\u1014\u102c\u1000\u103a\u1001\u1036 \u1021\u1031\u101b\u102c\u1004\u103a",text_none:"\u1010\u1005\u103a\u1001\u102f\u1019\u103b\u103e\u1019\u101f\u102f\u1010\u103a",text_blink:"\u1019\u103e\u102d\u1010\u103a\u1010\u102f\u1010\u103a\u1019\u103e\u102d\u1010\u103a\u1010\u102f\u1010\u103a",text_case:"\u1031\u1000\u1037\u1005\u103a(\u1005\u102c\u101c\u1036\u102f\u1038\u1021\u103c\u1000\u102e\u1038\u1021\u1031\u101e\u1038)",text_striketrough:"\u103c\u1016\u1010\u103a\u1019\u103b\u1009\u103a\u1038",text_underline:"\u1031\u1021\u102c\u1000\u103a\u1019\u103b\u1009\u103a\u1038",text_overline:"\u1021\u1031\u1015\u102b\u103a\u1019\u103b\u1009\u103a\u1038",text_decoration:"\u1021\u101c\u103e\u1021\u1015\u1021\u103c\u1015\u1004\u103a\u1021\u1006\u1004\u103a",text_color:"\u1021\u1031\u101b\u102c\u1004\u103a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/nb_dlg.js b/js/tiny_mce/plugins/style/langs/nb_dlg.js new file mode 100755 index 000000000..485802e87 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.style_dlg',{"text_lineheight":"Linjeh\u00f8yde","text_variant":"Variant","text_style":"Skriftstil","text_weight":"Skriftvekt","text_size":"Skriftst\u00f8rrelse","text_font":"Skrifttype","text_props":"Skriftegenskaper","positioning_tab":"Posisjon","list_tab":"Liste","border_tab":"Ramme","box_tab":"Boks","block_tab":"Blokk","background_tab":"Bakgrunn","text_tab":"Tekst",apply:"Legg til",title:"Rediger CSS-stil",clip:"Klipp",placement:"Plassering",overflow:"Overfyll",zindex:"Z-indeks",visibility:"Synlighet","positioning_type":"Type",position:"Posisjon","bullet_image":"Punktbilde","list_type":"Type",color:"Farge",height:"H\u00f8yde",width:"Bredde",style:"Stil",margin:"Marg",left:"Venstre",bottom:"Bunn",right:"H\u00f8yre",top:"Topp",same:"Lik i alle",padding:"Utfylling","box_clear":"Slett","box_float":"Flyt","box_height":"H\u00f8yde","box_width":"Bredde","block_display":"Framvising","block_whitespace":"Mellomrom","block_text_indent":"Innrykk","block_text_align":"Justering","block_vertical_alignment":"Vertikal justering","block_letterspacing":"Bokstavmellomrom","block_wordspacing":"Ordmellomrom","background_vpos":"Vertikal posisjon","background_hpos":"Horisontal posisjon","background_attachment":"Vedlegg","background_repeat":"Gjenta","background_image":"Bakgrunnsbilde","background_color":"Bakgrunnsfarge","text_none":"Ingen","text_blink":"Blink","text_case":"Store / sm\u00e5 bokstaver","text_striketrough":"Gjennomstreking","text_underline":"Senke skrift","text_overline":"Heve skrift","text_decoration":"Dekorasjon","text_color":"Farge"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/nl_dlg.js b/js/tiny_mce/plugins/style/langs/nl_dlg.js new file mode 100755 index 000000000..5bcc2c5a1 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.style_dlg',{"text_lineheight":"Lijnhoogte","text_variant":"Variant","text_style":"Stijl","text_weight":"Gewicht","text_size":"Tekengrootte","text_font":"Lettertype","text_props":"Tekst","positioning_tab":"Positionering","list_tab":"Lijst","border_tab":"Rand","box_tab":"Box","block_tab":"Blok","background_tab":"Achtergrond","text_tab":"Tekst",apply:"Toepassen",title:"CSS Stijl bewerken",clip:"Clip",placement:"Plaatsing",overflow:"Overvloeien",zindex:"Z-index",visibility:"Zichtbaarheid","positioning_type":"Type",position:"Positie","bullet_image":"Opsommingsteken","list_type":"Type",color:"Kleur",height:"Hoogte",width:"Breedte",style:"Stijl",margin:"Marge",left:"Links",bottom:"Onder",right:"Rechts",top:"Boven",same:"Alles hetzelfde",padding:"Opening","box_clear":"Vrijhouden","box_float":"Zweven","box_height":"Hoogte","box_width":"Breedte","block_display":"Weergave","block_whitespace":"Witruimte","block_text_indent":"Inspringen","block_text_align":"Tekstuitlijning","block_vertical_alignment":"Verticale uitlijning","block_letterspacing":"Letterruimte","block_wordspacing":"Woordruimte","background_vpos":"Verticale positie","background_hpos":"Horizontale positie","background_attachment":"Bijlage","background_repeat":"Herhalen","background_image":"Achtergrondafbeelding","background_color":"Achtergrondkleur","text_none":"Niets","text_blink":"Knipperen","text_case":"Hoofdlettergebruik","text_striketrough":"Doorhalen","text_underline":"Onderstrepen","text_overline":"Overhalen","text_decoration":"Decoratie","text_color":"Kleur"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/nn_dlg.js b/js/tiny_mce/plugins/style/langs/nn_dlg.js new file mode 100755 index 000000000..563b80bdb --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.style_dlg',{text_lineheight:"Linjeh\u00f8gd",text_variant:"Variant",text_style:"Skriftstil",text_weight:"Skriftvekt",text_size:"Skriftstorleik",text_font:"Skrifttype",text_props:"Eigenskapar for skrift",positioning_tab:"Posisjon",list_tab:"Liste",border_tab:"Ramme",box_tab:"Boks",block_tab:"Blokk",background_tab:"Bakgrunn",text_tab:"Tekst",apply:"Legg til",title:"Rediger CSS-stil",clip:"Klipp",placement:"Plassering",overflow:"Overfylt",zindex:"Z-indeks",visibility:"Synlegheit",positioning_type:"Type",position:"Posisjon",bullet_image:"Kulepunktbilete",list_type:"Type",color:"Farge",height:"H\u00f8gd",width:"Breidd",style:"Stil",margin:"Marg",left:"Venstre",bottom:"Bunn",right:"H\u00f8gre",top:"Topp",same:"Likt i alle",padding:"Utfylling",box_clear:"Slett",box_float:"Flyt",box_height:"H\u00f8gd",box_width:"Breidd",block_display:"Framsyning",block_whitespace:"Mellomrom",block_text_indent:"Innrykk",block_text_align:"Justering",block_vertical_alignment:"Vertikal justering",block_letterspacing:"Bokstavmellomrom",block_wordspacing:"Ordmellomrom",background_vpos:"Vertikal posisjon",background_hpos:"Horisontal posisjon",background_attachment:"Vedlegg",background_repeat:"Gjenta",background_image:"Bakgrunnsbilete",background_color:"Bakgrunnsfarge",text_none:"Ingen",text_blink:"Blink",text_case:"Kapitelar/minusklar",text_striketrough:"Gjennomstreking",text_underline:"Senka skrift",text_overline:"Heva skrift",text_decoration:"Dekorasjon",text_color:"Farge"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/no_dlg.js b/js/tiny_mce/plugins/style/langs/no_dlg.js new file mode 100755 index 000000000..db721c185 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.style_dlg',{"text_lineheight":"Linjeh\u00f8yde","text_variant":"Variant","text_style":"Skriftstil","text_weight":"Skriftvekt","text_size":"Skriftst\u00f8rrelse","text_font":"Skrifttype","text_props":"Tekst","positioning_tab":"Posisjon","list_tab":"Liste","border_tab":"Ramme","box_tab":"Boks","block_tab":"Blokk","background_tab":"Bakgrunn","text_tab":"Tekst",apply:"Bruk",title:"Rediger CSS-stil",clip:"Klipp",placement:"Plassering",overflow:"Overfylt",zindex:"Z-indeks",visibility:"Synlighet","positioning_type":"Type",position:"Posisjon","bullet_image":"Punkt bilde","list_type":"Type",color:"Farge",height:"H\u00f8yde",width:"Bredde",style:"Stil",margin:"Marg",left:"Venstre",bottom:"Bunn",right:"H\u00f8yre",top:"Topp",same:"Likt for alle",padding:"Utfylling","box_clear":"Slette","box_float":"Flytende","box_height":"H\u00f8yde","box_width":"Bredde","block_display":"Visning","block_whitespace":"Mellomrom","block_text_indent":"Innrykk","block_text_align":"Justering","block_vertical_alignment":"Vertikal justering","block_letterspacing":"Bokstav mellomrom","block_wordspacing":"Mellomrom","background_vpos":"Vertikal posisjon","background_hpos":"Horisontal posisjon","background_attachment":"Vedlegg","background_repeat":"Repetere","background_image":"Bakgrunnsbilde","background_color":"Bakgrunnsfarge","text_none":"Ingen","text_blink":"Blinke","text_case":"Store/sm\u00e5 bokstaver","text_striketrough":"Gjennomstreke","text_underline":"Senke skrift","text_overline":"Heve skrift","text_decoration":"Dekorasjon","text_color":"Farge"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/pl_dlg.js b/js/tiny_mce/plugins/style/langs/pl_dlg.js new file mode 100755 index 000000000..a015749f9 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.style_dlg',{"text_lineheight":"Wysoko\u015b\u0107 linii","text_variant":"Wariant","text_style":"Styl","text_weight":"Waga","text_size":"Rozmiar","text_font":"Wz\u00f3r czcionki","text_props":"Tekst","positioning_tab":"Pozycjonowanie","list_tab":"Lista","border_tab":"Obramowanie","box_tab":"Boks","block_tab":"Blok","background_tab":"T\u0142o","text_tab":"Text",apply:"Zastosuj",title:"Edytuj style CSS",clip:"Klip",placement:"Umieszczenie",overflow:"Przepe\u0142niony",zindex:"Z-index",visibility:"Widoczno\u015b\u0107","positioning_type":"Typ",position:"Pozycja","bullet_image":"Obrazek listy","list_type":"Typ",color:"Kolor",height:"Wysoko\u015b\u0107",width:"Szeroko\u015b\u0107",style:"Styl",margin:"Margines",left:"Lewy",bottom:"D\u00f3\u0142",right:"Prawy",top:"G\u00f3ra",same:"To samo dla wszystkich",padding:"Odst\u0119py","box_clear":"Op\u0142ywanie (Clear)","box_float":"Op\u0142ywanie (Float)","box_height":"Wysoko\u015b\u0107","box_width":"Szeroko\u015b\u0107","block_display":"Spos\u00f3b wy\u015bwietlania","block_whitespace":"Bia\u0142e znaki","block_text_indent":"Przesuni\u0119cie tekstu","block_text_align":"Wyr\u00f3wnanie tekstu","block_vertical_alignment":"Pionowe wyr\u00f3wnanie","block_letterspacing":"Odst\u0119p mi\u0119dzy literami","block_wordspacing":"Odst\u0119p mi\u0119dzy wyrazami","background_vpos":"Pozycja pionowa","background_hpos":"Pozycja pozioma","background_attachment":"Za\u0142\u0105cznik","background_repeat":"Powt\u00f3rz","background_image":"Obrazek t\u0142a","background_color":"Kolor t\u0142a","text_none":"\u017caden","text_blink":"miganie","text_case":"Znaki","text_striketrough":"przekre\u015blenie","text_underline":"podkre\u015blenie","text_overline":"nadkre\u015blenie","text_decoration":"Dekoracja","text_color":"Kolor"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ps_dlg.js b/js/tiny_mce/plugins/style/langs/ps_dlg.js new file mode 100755 index 000000000..82735a531 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/pt_dlg.js b/js/tiny_mce/plugins/style/langs/pt_dlg.js new file mode 100755 index 000000000..d9c174715 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.style_dlg',{text_lineheight:"Altura da linha",text_variant:"Variante",text_style:"Estilo",text_weight:"Peso",text_size:"Tamanho",text_font:"Fonte",text_props:"Texto",positioning_tab:"Posicionamento",list_tab:"Lista",border_tab:"Limites",box_tab:"Caixa",block_tab:"Bloco",background_tab:"Fundo",text_tab:"Texto",apply:"Aplicar",title:"Editar CSS",clip:"Clip",placement:"Posicionamento",overflow:"Overflow",zindex:"Z-index",visibility:"Visibilidade",positioning_type:"Tipo",position:"Posi\u00e7\u00e3o",bullet_image:"Imagem de lista",list_type:"Tipo",color:"Cor",height:"Altura",width:"Largura",style:"Estilo",margin:"Margem",left:"Esquerda",bottom:"Abaixo",right:"Direita",top:"Topo",same:"O mesmo para todos",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Altura",box_width:"Largura",block_display:"Display",block_whitespace:"Espa\u00e7o",block_text_indent:"Indent",block_text_align:"Alinhamento de texto",block_vertical_alignment:"Alinhamento vertical",block_letterspacing:"Espa\u00e7amento de letras",block_wordspacing:"Espa\u00e7amento de palavras",background_vpos:"Posi\u00e7\u00e3o vertical",background_hpos:"Posi\u00e7\u00e3o horizontal",background_attachment:"Fixar",background_repeat:"Repetir",background_image:"Imagem de fundo",background_color:"Cor de fundo",text_none:"nenhum",text_blink:"Piscar",text_case:"Mai\u00fascula",text_striketrough:"Riscado",text_underline:"Sublinhado",text_overline:"Sobrelinha",text_decoration:"Decora\u00e7\u00e3o",text_color:"Cor"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ro_dlg.js b/js/tiny_mce/plugins/style/langs/ro_dlg.js new file mode 100755 index 000000000..89792a51d --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.style_dlg',{text_lineheight:"\u00cen\u0103l\u0163ime linie",text_variant:"Variant\u0103",text_style:"Stil",text_weight:"Greutate",text_size:"M\u0103rime",text_font:"Font",text_props:"Text",positioning_tab:"Pozi\u0163ionare",list_tab:"List\u0103",border_tab:"Bordur\u0103",box_tab:"Box",block_tab:"Block",background_tab:"Fundal",text_tab:"Text",apply:"Aplic\u0103",title:"Editare CSS",clip:"Clip",placement:"Plasament",overflow:"Overflow",zindex:"Z-index",visibility:"Vizibilitate",positioning_type:"Tip",position:"Pozi\u0163ionare",bullet_image:"Imagine",list_type:"Tip",color:"Culoare",height:"\u00cen\u0103l\u0163ime",width:"L\u0103\u0163ime",style:"Stil",margin:"Margini",left:"St\u00e2nga",bottom:"Jos",right:"Dreapta",top:"Sus",same:"La fel pentru toate",padding:"Margini interne",box_clear:"Normal\u0103",box_float:"Plutitoare",box_height:"\u00cen\u0103l\u0163ime",box_width:"L\u0103\u0163ime",block_display:"Afi\u015fare",block_whitespace:"Spa\u0163iu alb",block_text_indent:"Indentare text",block_text_align:"Aliniere text",block_vertical_alignment:"Aliniere vertical\u0103",block_letterspacing:"Spa\u0163iere litere",block_wordspacing:"Spa\u0163iere cuvinte",background_vpos:"Pozi\u0163ionare vertical\u0103",background_hpos:"Pozi\u0163ionare orizontal\u0103",background_attachment:"Ata\u015fament",background_repeat:"Repet\u0103",background_image:"Imagine fundal",background_color:"Culoare fundal",text_none:"Nici unul",text_blink:"Clipire",text_case:"Caz",text_striketrough:"T\u0103iere",text_underline:"Sub linie",text_overline:"Peste linie",text_decoration:"Decora\u0163ii",text_color:"Culoare"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ru_dlg.js b/js/tiny_mce/plugins/style/langs/ru_dlg.js new file mode 100755 index 000000000..c7acb88d8 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.style_dlg',{"text_lineheight":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438","text_variant":"\u0412\u0430\u0440\u0438\u0430\u043d\u0442","text_style":"\u0421\u0442\u0438\u043b\u044c","text_weight":"\u0422\u043e\u043b\u0449\u0438\u043d\u0430","text_size":"\u0420\u0430\u0437\u043c\u0435\u0440","text_font":"\u0428\u0440\u0438\u0444\u0442","text_props":"\u0422\u0435\u043a\u0441\u0442","positioning_tab":"\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435","list_tab":"\u0421\u043f\u0438\u0441\u043e\u043a","border_tab":"\u0413\u0440\u0430\u043d\u0438\u0446\u0430","box_tab":"\u041a\u0440\u0430\u044f","block_tab":"\u0411\u043b\u043e\u043a","background_tab":"\u0424\u043e\u043d","text_tab":"\u0422\u0435\u043a\u0441\u0442",apply:"\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c",title:"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 CSS \u0441\u0442\u0438\u043b\u044f",clip:"\u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435",placement:"\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435",overflow:"\u041f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435",zindex:"Z-\u0438\u043d\u0434\u0435\u043a\u0441",visibility:"\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c","positioning_type":"\u0422\u0438\u043f",position:"\u041f\u043e\u0437\u0438\u0446\u0438\u044f","bullet_image":"\u041c\u0430\u0440\u043a\u0435\u0440","list_type":"\u0422\u0438\u043f",color:"\u0426\u0432\u0435\u0442",height:"\u0412\u044b\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",style:"\u0421\u0442\u0438\u043b\u044c",margin:"\u041e\u0442\u0441\u0442\u0443\u043f",left:"\u0421\u043b\u0435\u0432\u0430",bottom:"\u0421\u043d\u0438\u0437\u0443",right:"\u0421\u043f\u0440\u0430\u0432\u0430",top:"\u0412\u0432\u0435\u0440\u0445",same:"\u041e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445",padding:"\u041f\u043e\u043b\u044f","box_clear":"\u042f\u0432\u043d\u044b\u0439","box_float":"\u041f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0439","box_height":"\u0412\u044b\u0441\u043e\u0442\u0430","box_width":"\u0428\u0438\u0440\u0438\u043d\u0430","block_display":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","block_whitespace":"\u041f\u0440\u043e\u0431\u0435\u043b","block_text_indent":"\u041e\u0442\u0441\u0442\u0443\u043f \u0442\u0435\u043a\u0441\u0442\u0430","block_text_align":"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","block_vertical_alignment":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","block_letterspacing":"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u0443\u043a\u0432\u0430\u043c\u0438","block_wordspacing":"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u0432\u0430\u043c\u0438","background_vpos":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f","background_hpos":"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f","background_attachment":"\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430","background_repeat":"\u041f\u043e\u0432\u0442\u043e\u0440","background_image":"\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","background_color":"\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430","text_none":"\u0411\u0435\u0437 \u0432\u0441\u0435\u0433\u043e","text_blink":"\u041c\u0435\u0440\u0446\u0430\u044e\u0449\u0438\u0439","text_case":"\u0420\u0435\u0433\u0438\u0441\u0442\u0440","text_striketrough":"\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","text_underline":"\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","text_overline":"\u0421 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0435\u0440\u0442\u043e\u0439","text_decoration":"\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435","text_color":"\u0426\u0432\u0435\u0442"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/sc_dlg.js b/js/tiny_mce/plugins/style/langs/sc_dlg.js new file mode 100755 index 000000000..9b473d702 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u53d8\u4f53",text_style:"\u6837\u5f0f",text_weight:"\u5bbd\u5ea6",text_size:"\u5c3a\u5bf8",text_font:"\u5b57\u4f53",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u8fb9\u6846",box_tab:"\u7bb1\u578b",block_tab:"\u5757",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u5e94\u7528",title:"\u7f16\u8f91CSS\u6837\u5f0f\u8868\u5355",clip:"\u526a\u8f91",placement:"\u5e03\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z\u8f74\u6df1\u5ea6",visibility:"\u53ef\u89c1\u6027",positioning_type:"\u7c7b\u578b",position:"\u56fe\u793a\u4f4d\u7f6e",bullet_image:"\u4e13\u6848\u56fe\u793a",list_type:"\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",style:"\u6837\u5f0f",margin:"\u8fb9\u754c",left:"\u9760\u5de6",bottom:"\u4e0b\u65b9",right:"\u9760\u53f3",top:"\u4e0a\u65b9",same:"\u5168\u90e8\u4e00\u6837",padding:"\u7559\u767d",box_clear:"\u6e05\u9664",box_float:"\u6d6e\u52a8",box_height:"\u9ad8\u5ea6",box_width:"\u5bbd\u5ea6",block_display:"\u663e\u793a\u65b9\u5f0f",block_whitespace:"\u7a7a\u767d",block_text_indent:"\u6587\u5b57\u7f29\u6392",block_text_align:"\u6587\u5b57\u5bf9\u9f50",block_vertical_alignment:"\u6c34\u51c6\u5bf9\u9f50\u65b9\u5f0f",block_letterspacing:"\u5b57\u5143\u95f4\u8ddd",block_wordspacing:"\u5355\u5b57\u95f4\u8ddd",background_vpos:"\u6c34\u51c6\u4f4d\u7f6e",background_hpos:"\u5782\u76f4\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u590d",background_image:"\u80cc\u666f\u56fe\u7247",background_color:"\u80cc\u666f\u989c\u8272",text_none:"\u65e0",text_blink:"\u95ea\u70c1",text_case:"\u5b57\u4f53",text_striketrough:"\u5220\u9664\u7ebf",text_underline:"\u5e95\u7ebf",text_overline:"\u4e0a\u5212\u7ebf",text_decoration:"\u4fee\u9970",text_color:"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/se_dlg.js b/js/tiny_mce/plugins/style/langs/se_dlg.js new file mode 100755 index 000000000..f650e8d76 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.style_dlg',{text_lineheight:"Radh\u00f6jd",text_variant:"Variant",text_style:"Stil",text_weight:"Tjocklek",text_size:"Storlek",text_font:"Typsnitt",text_props:"Text",positioning_tab:"Positionering",list_tab:"Listor",border_tab:"Ramar",box_tab:"Box",block_tab:"Block",background_tab:"Bakgrund",text_tab:"Text",apply:"Applicera",title:"Redigera inline CSS",clip:"Besk\u00e4rning",placement:"Placering",overflow:"\u00d6verfl\u00f6de",zindex:"Z-index",visibility:"Synlighet",positioning_type:"Positionstyp",position:"Position",bullet_image:"Punktbild",list_type:"Listtyp",color:"F\u00e4rg",height:"H\u00f6jd",width:"Bredd",style:"Stil",margin:"Marginal",left:"V\u00e4nster",bottom:"Botten",right:"H\u00f6ger",top:"Toppen",same:"Samma f\u00f6r alla",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"H\u00f6jd",box_width:"Bredd",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Textindrag",block_text_align:"Textjustering",block_vertical_alignment:"Vertikal justering",block_letterspacing:"Teckenmellanrum",block_wordspacing:"Ordavbrytning",background_vpos:"Vertikal position",background_hpos:"Horisontell position",background_attachment:"F\u00e4stpunkt",background_repeat:"Upprepning",background_image:"Bakgrundsbild",background_color:"Bakgrundsf\u00e4rg",text_none:"Inget",text_blink:"Blinka",text_case:"Sm\u00e5/stora",text_striketrough:"Genomstruken",text_underline:"Understruken",text_overline:"\u00d6verstruken",text_decoration:"Dekoration",text_color:"F\u00e4rg"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/si_dlg.js b/js/tiny_mce/plugins/style/langs/si_dlg.js new file mode 100755 index 000000000..00edbb357 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/sk_dlg.js b/js/tiny_mce/plugins/style/langs/sk_dlg.js new file mode 100755 index 000000000..72ba466c7 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.style_dlg',{text_lineheight:"V\u00fd\u0161ka riadkov",text_variant:"Varianta",text_style:"\u0160t\u00fdl textu",text_weight:"Tu\u010dnos\u0165 p\u00edsma",text_size:"Ve\u013ekos\u0165",text_font:"P\u00edsmo",text_props:"Text",positioning_tab:"Umiesnenie",list_tab:"Zoznam",border_tab:"Or\u00e1movanie",box_tab:"Box",block_tab:"Blok",background_tab:"Pozadie",text_tab:"Text",apply:"Pou\u017ei\u0165",title:"Upravi\u0165 CSS \u0161t\u00fdl",clip:"Orezanie (clip)",placement:"Umiestnenie",overflow:"Prete\u010denie (overflow)",zindex:"Z-index",visibility:"Vidite\u013enos\u0165",positioning_type:"Typ",position:"Umiestnenie",bullet_image:"\u0160t\u00fdl odr\u00e1\u017eok",list_type:"Typ",color:"Farba",height:"V\u00fd\u0161ka",width:"\u0160\u00edrka",style:"\u0160t\u00fdl",margin:"Okraje (margin)",left:"V\u013eavo",bottom:"Dole",right:"Vpravo",top:"Hore",same:"Rovnak\u00e9 pre v\u0161etky",padding:"Odsadenie (padding)",box_clear:"Vy\u010disti\u0165",box_float:"Pl\u00e1vaj\u00faci",box_height:"V\u00fd\u0161ka",box_width:"\u0160\u00edrka",block_display:"Blokov\u00e9 zobrazenie",block_whitespace:"Zalamovanie textu",block_text_indent:"Odsadenie textu",block_text_align:"Zarovnanie textu",block_vertical_alignment:"Vertik\u00e1lne zarovnanie",block_letterspacing:"Rozstup znakov",block_wordspacing:"Rozstup slov",background_vpos:"Vertik\u00e1lne umiestnenie",background_hpos:"Horizont\u00e1lne umiestnenie",background_attachment:"Rolovanie",background_repeat:"Opakovanie",background_image:"Obr\u00e1zok pozadia",background_color:"Farba pozadia",text_none:"\u017eiadna",text_blink:"blikanie",text_case:"Ve\u013ek\u00e9 p\u00edsmen\u00e1",text_striketrough:"pre\u010diarknutie",text_underline:"pod\u010diarknutie",text_overline:"nad\u010diarknutie",text_decoration:"Dekor\u00e1cia",text_color:"Farba"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/sl_dlg.js b/js/tiny_mce/plugins/style/langs/sl_dlg.js new file mode 100755 index 000000000..047979577 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.style_dlg',{text_lineheight:"Vi\u0161ina vrstice",text_variant:"Razli\u010dica",text_style:"Slog",text_weight:"Ute\u017e",text_size:"Velikost",text_font:"Pisava",text_props:"Besedilo",positioning_tab:"Polo\u017eaj",list_tab:"Seznam",border_tab:"Obroba",box_tab:"Okvir",block_tab:"Blok",background_tab:"Ozadje",text_tab:"Besedilo",apply:"Uporabi",title:"Uredi sloge CSS",clip:"Obre\u017ei",placement:"Polo\u017eaj",overflow:"Prelivanje",zindex:"Z-indeks",visibility:"Vidnost",positioning_type:"Vrsta",position:"Polo\u017eaj",bullet_image:"Slika alineje",list_type:"Vrsta",color:"Barva",height:"Vi\u0161ina",width:"\u0160irina",style:"Slog",margin:"Rob",left:"Levo",bottom:"Spodaj",right:"Desno",top:"Zgoraj",same:"Enako za vse",padding:"Podlaganje",box_clear:"\u010cisto",box_float:"Plavojo\u010de",box_height:"Vi\u0161ina",box_width:"\u0160irina",block_display:"Prikaz",block_whitespace:"Beli prostor",block_text_indent:"Zamik besedila",block_text_align:"Poravnava besedila",block_vertical_alignment:"Navpi\u010dna poravnava",block_letterspacing:"Razmik znakov",block_wordspacing:"Razmik besed",background_vpos:"Navpi\u010dni polo\u017eaj",background_hpos:"Vodoravni polo\u017eaj",background_attachment:"Priponka",background_repeat:"Ponavljaj",background_image:"Slika ozadja",background_color:"Barva ozadja",text_none:"brez",text_blink:"utripajo\u010de",text_case:"Velikost",text_striketrough:"pre\u010drtano",text_underline:"pod\u010drtano",text_overline:"nad\u010drtano",text_decoration:"Okras",text_color:"Barva"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/sq_dlg.js b/js/tiny_mce/plugins/style/langs/sq_dlg.js new file mode 100755 index 000000000..7d5942b84 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.style_dlg',{text_lineheight:"Gjat\u00ebsia e linj\u00ebs",text_variant:"Varianti",text_style:"Stili",text_weight:"Pesha",text_size:"Madh\u00ebsia",text_font:"Teksti",text_props:"Teksti",positioning_tab:"Pozicionimi",list_tab:"Lista",border_tab:"Korniza",box_tab:"Kuti",block_tab:"Bllok",background_tab:"Fusha",text_tab:"Teksti",apply:"Apliko",title:"Edito t\u00eb gjitha stilet",clip:"Prerja",placement:"Vendosja",overflow:"Mbivendosja",zindex:"Indeksi Z",visibility:"Shikueshm\u00ebria",positioning_type:"Tipi",position:"Pozicioni",bullet_image:"Foto ndar\u00ebse",list_type:"Tipi",color:"Ngjyra",height:"Gjat\u00ebsia",width:"Gjer\u00ebsia",style:"Stili",margin:"Hap\u00ebsira",left:"Majtas",bottom:"Fund",right:"Djathtas",top:"Krye",same:"E nj\u00ebjt\u00eb p\u00ebr t\u00eb gjitha",padding:"Hap\u00ebsira e br\u00ebndshme",box_clear:"Pastro",box_float:"Pluskimi",box_height:"Gjat\u00ebsia",box_width:"Gjer\u00ebsia",block_display:"Shfaqja",block_whitespace:"Hap\u00ebsira bosh",block_text_indent:"Kryerradha",block_text_align:"Drejtimi i tekstit",block_vertical_alignment:"Drejtimi vertikal",block_letterspacing:"Hap\u00ebsira e g\u00ebrmave",block_wordspacing:"Hap\u00ebsira e fjal\u00ebve",background_vpos:"Pozicionimi vertikal",background_hpos:"Pozicionimi horizontal",background_attachment:"Bashk\u00ebngjitja",background_repeat:"P\u00ebrs\u00ebritja",background_image:"Foto e fush\u00ebs",background_color:"Ngjyra e fush\u00ebs",text_none:"asnj\u00eb",text_blink:"fik-ndiz",text_case:"Madh\u00ebsia e g\u00ebrm\u00ebs",text_striketrough:"n\u00eb mes",text_underline:"n\u00ebn linj\u00eb",text_overline:"mbi linj\u00eb",text_decoration:"Zbukurimi",text_color:"Ngjyra"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/sr_dlg.js b/js/tiny_mce/plugins/style/langs/sr_dlg.js new file mode 100755 index 000000000..8a8d022c6 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/sv_dlg.js b/js/tiny_mce/plugins/style/langs/sv_dlg.js new file mode 100755 index 000000000..6a8d3e459 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.style_dlg',{"text_lineheight":"Radh\u00f6jd","text_variant":"Variant","text_style":"Stil","text_weight":"Tjocklek","text_size":"Storlek","text_font":"Typsnitt","text_props":"Text","positioning_tab":"Positionering","list_tab":"Listor","border_tab":"Ramar","box_tab":"Box","block_tab":"Block","background_tab":"Bakgrund","text_tab":"Text",apply:"Applicera",title:"Redigera inline CSS",clip:"Besk\u00e4rning",placement:"Placering",overflow:"\u00d6\u0096verfl\u00f6de",zindex:"Z-index",visibility:"Synlighet","positioning_type":"Positionstyp",position:"Position","bullet_image":"Punktbild","list_type":"Listtyp",color:"F\u00e4rg",height:"H\u00f6jd",width:"Bredd",style:"Stil",margin:"Marginal",left:"V\u00e4nster",bottom:"Botten",right:"H\u00f6ger",top:"Toppen",same:"Samma f\u00f6r alla",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"H\u00f6jd","box_width":"Bredd","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Textindrag","block_text_align":"Textjustering","block_vertical_alignment":"Vertikal justering","block_letterspacing":"Teckenmellanrum","block_wordspacing":"Ordavbrytning","background_vpos":"Vertikal position","background_hpos":"Horisontell position","background_attachment":"F\u00e4stpunkt","background_repeat":"Upprepning","background_image":"Bakgrundsbild","background_color":"Bakgrundsf\u00e4rg","text_none":"Inget","text_blink":"Blinka","text_case":"Sm\u00e5/stora","text_striketrough":"Genomstruken","text_underline":"Understruken","text_overline":"\u00d6verstruken","text_decoration":"Dekoration","text_color":"F\u00e4rg"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ta_dlg.js b/js/tiny_mce/plugins/style/langs/ta_dlg.js new file mode 100755 index 000000000..a8fd368d5 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/te_dlg.js b/js/tiny_mce/plugins/style/langs/te_dlg.js new file mode 100755 index 000000000..29e896cb7 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/th_dlg.js b/js/tiny_mce/plugins/style/langs/th_dlg.js new file mode 100755 index 000000000..984aeee58 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.style_dlg',{text_lineheight:"\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e39\u0e07\u0e02\u0e2d\u0e07\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14",text_variant:"Variant",text_style:"\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",text_weight:"\u0e19\u0e49\u0e33\u0e2b\u0e19\u0e31\u0e01",text_size:"\u0e02\u0e19\u0e32\u0e14",text_font:"\u0e15\u0e31\u0e27\u0e2b\u0e19\u0e31\u0e07\u0e2a\u0e37\u0e2d",text_props:"\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21",positioning_tab:"Positioning",list_tab:"List",border_tab:"\u0e01\u0e23\u0e2d\u0e1a",box_tab:"Box",block_tab:"Block",background_tab:"\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",text_tab:"\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21",apply:"\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19",title:"\u0e41\u0e01\u0e49\u0e44\u0e02 CSS",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"\u0e2a\u0e35",height:"\u0e2a\u0e39\u0e07",width:"\u0e01\u0e27\u0e49\u0e32\u0e07",style:"\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",margin:"Margin",left:"\u0e0b\u0e49\u0e32\u0e22",bottom:"\u0e25\u0e48\u0e32\u0e07",right:"\u0e02\u0e27\u0e32",top:"\u0e1a\u0e19",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21 indent",block_text_align:"\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21 align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"\u0e23\u0e39\u0e1b\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",background_color:"\u0e2a\u0e35\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"\u0e2a\u0e35"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/tn_dlg.js b/js/tiny_mce/plugins/style/langs/tn_dlg.js new file mode 100755 index 000000000..5124240dd --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/tr_dlg.js b/js/tiny_mce/plugins/style/langs/tr_dlg.js new file mode 100755 index 000000000..8e6591bbd --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.style_dlg',{text_lineheight:"\u00c7izgi y\u00fcksekli\u011fi",text_variant:"De\u011fi\u015fken",text_style:"Stil",text_weight:"Kal\u0131nl\u0131k",text_size:"Boyut",text_font:"Yaz\u0131 tipi",text_props:"Metin",positioning_tab:"Konumland\u0131rma",list_tab:"Listele",border_tab:"Kenarl\u0131k",box_tab:"Kutu",block_tab:"Blok",background_tab:"Arkaplan",text_tab:"Metin",apply:"Uygula",title:"CSS Stilini D\u00fczenle",clip:"K\u0131rp",placement:"Yerle\u015ftir",overflow:"Ta\u015fma",zindex:"Z-indeksi",visibility:"G\u00f6r\u00fcn\u00fcrl\u00fck",positioning_type:"Tip",position:"Konum",bullet_image:"Madde imi resmi",list_type:"Tip",color:"Renk",height:"Y\u00fckseklik",width:"Geni\u015flik",style:"Stil",margin:"Kenar bo\u015flu\u011fu",left:"Sol",bottom:"Alt",right:"Sa\u011f",top:"\u00dcst",same:"T\u00fcm\u00fc i\u00e7in",padding:"Dolgu",box_clear:"Serbest",box_float:"Kayan",box_height:"Y\u00fckseklik",box_width:"Geni\u015flik",block_display:"G\u00f6r\u00fcnt\u00fcle",block_whitespace:"Bo\u015fluk",block_text_indent:"Metnin girintisini art\u0131r",block_text_align:"Metin hizala",block_vertical_alignment:"Dikey hizalama",block_letterspacing:"harf bo\u015flu\u011fu",block_wordspacing:"Kelime bo\u015flu\u011fu",background_vpos:"Dikey konum",background_hpos:"Yatay konum",background_attachment:"Eklenti",background_repeat:"Tekrarla",background_image:"Arkaplan resmi",background_color:"Arkaplan rengi",text_none:"hi\u00e7biri",text_blink:"yan\u0131p s\u00f6nen",text_case:"Ko\u015ful",text_striketrough:"\u00fcst\u00fc \u00e7izgili",text_underline:"alt \u00e7izgi",text_overline:"\u00fcst \u00e7izgi",text_decoration:"Dekorasyon",text_color:"Renk"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/tt_dlg.js b/js/tiny_mce/plugins/style/langs/tt_dlg.js new file mode 100755 index 000000000..cdd6b191f --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u8b8a\u9ad4",text_style:"\u6a23\u5f0f",text_weight:"\u5bec\u5ea6",text_size:"\u5927\u5c0f",text_font:"\u5b57\u9ad4",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u908a\u6846",box_tab:"\u76d2\u6a21\u578b",block_tab:"\u5340\u584a",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u61c9\u7528",title:"\u7de8\u8f2f CSS \u6a23\u5f0f\u8868",clip:"\u526a\u8f2f",placement:"\u4f48\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z\u5ea7\u6a19",visibility:"\u662f\u5426\u53ef\u898b",positioning_type:"\u4f4d\u7f6e\u985e\u578b",position:"\u5716\u7247\u4f4d\u7f6e",bullet_image:"\u6e05\u55ae\u5716\u7247",list_type:"\u5217\u8868\u985e\u578b",color:"\u9854\u8272",height:"\u9ad8\u5ea6",width:"\u5bec\u5ea6",style:"\u6a23\u5f0f",margin:"\u908a\u8ddd",left:"\u5de6\u5074",bottom:"\u5e95\u90e8",right:"\u53f3\u5074",top:"\u9802\u90e8",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5167\u908a\u8ddd",box_clear:"\u6e05\u9664",box_float:"\u6d6e\u52d5",box_height:"\u9ad8\u5ea6",box_width:"\u5bec\u5ea6",block_display:"\u986f\u793a\u65b9\u5f0f",block_whitespace:"\u7a7a\u683c",block_text_indent:"\u6587\u5b57\u7e2e\u6392",block_text_align:"\u6587\u5b57\u5c0d\u9f4a",block_vertical_alignment:"\u5782\u76f4\u5c0d\u9f4a\u65b9\u5f0f",block_letterspacing:"\u5b57\u6bcd\u9593\u8ddd",block_wordspacing:"\u8a5e\u9593\u8ddd",background_vpos:"\u5782\u76f4\u4f4d\u7f6e",background_hpos:"\u6c34\u5e73\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u5fa9",background_image:"\u80cc\u666f\u5716\u7247",background_color:"\u80cc\u666f\u9854\u8272",text_none:"\u7121",text_blink:"\u9583\u720d",text_case:"\u5b57\u9ad4",text_striketrough:"\u4e2d\u5283\u7dda",text_underline:"\u5e95\u7dda",text_overline:"\u4e0a\u5283\u7dda",text_decoration:"\u88dd\u98fe",text_color:"\u9854\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/tw_dlg.js b/js/tiny_mce/plugins/style/langs/tw_dlg.js new file mode 100755 index 000000000..d7a4ae160 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u8b8a\u9ad4",text_style:"\u6a23\u5f0f",text_weight:"\u5b57\u5bec",text_size:"\u5b57\u578b\u5927\u5c0f",text_font:"\u5b57\u9ad4",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u908a\u6846",box_tab:"\u65b9\u584a",block_tab:"\u5340\u584a",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u5957\u7528",title:"\u7de8\u8f2f CSS \u6a23\u5f0f\u8868",clip:"\u526a\u8f2f",placement:"\u4f48\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z-\u5750\u6a19",visibility:"\u53ef\u898b",positioning_type:"\u985e\u578b",position:"\u4f4d\u7f6e",bullet_image:"\u5716\u7247\u9805\u76ee\u7b26\u865f",list_type:"\u985e\u578b\u5217\u8868",color:"\u984f\u8272",height:"\u9ad8",width:"\u5bec",style:"\u6a23\u5f0f",margin:"\u5916\u908a\u8ddd",left:"\u5de6\u5074",bottom:"\u9760\u4e0b",right:"\u53f3\u5074",top:"\u9802\u90e8",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5167\u908a\u8ddd",box_clear:"\u6e05\u9664\u6d6e\u52d5",box_float:"\u6d6e\u52d5",box_height:"\u9ad8",box_width:"\u5bec",block_display:"\u986f\u793a",block_whitespace:"\u7a7a\u683c",block_text_indent:"\u6587\u5b57\u7e2e\u6392",block_text_align:"\u6587\u5b57\u5c0d\u9f4a",block_vertical_alignment:"\u5782\u76f4\u5c0d\u9f4a",block_letterspacing:"\u5b57\u6bcd\u9593\u8ddd",block_wordspacing:"\u8a5e\u9593\u8ddd",background_vpos:"\u5782\u76f4\u4f4d\u7f6e",background_hpos:"\u6c34\u5e73\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u8907",background_image:"\u80cc\u666f\u5716\u7247",background_color:"\u80cc\u666f\u984f\u8272",text_none:"\u7121",text_blink:"\u9583\u720d",text_case:"\u5b57\u578b",text_striketrough:"\u522a\u9664\u7dda",text_underline:"\u5e95\u7dda",text_overline:"\u4e0a\u5283\u7dda",text_decoration:"\u88dd\u98fe",text_color:"\u984f\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/uk_dlg.js b/js/tiny_mce/plugins/style/langs/uk_dlg.js new file mode 100755 index 000000000..f323e392a --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.style_dlg',{text_lineheight:"\u0412\u0438\u0441\u043e\u0442\u0430 \u0440\u044f\u0434\u043a\u0443",text_variant:"\u0412\u0430\u0440\u0456\u0430\u043d\u0442",text_style:"\u0421\u0442\u0438\u043b\u044c",text_weight:"\u0422\u043e\u0432\u0449\u0438\u043d\u0430",text_size:"\u0420\u043e\u0437\u043c\u0456\u0440",text_font:"\u0428\u0440\u0438\u0444\u0442",text_props:"\u0422\u0435\u043a\u0441\u0442",positioning_tab:"\u041f\u043e\u0437\u0438\u0446\u0456\u043e\u043d\u0443\u0432\u0430\u043d\u043d\u044f",list_tab:"\u0421\u043f\u0438\u0441\u043e\u043a",border_tab:"\u0420\u0430\u043c\u043a\u0430",box_tab:"\u042f\u0449\u0438\u043a(box)",block_tab:"\u0411\u043b\u043e\u043a",background_tab:"\u0424\u043e\u043d",text_tab:"\u0422\u0435\u043a\u0441\u0442",apply:"\u0417\u0430\u0441\u0442\u043e\u0441\u0443\u0432\u0430\u0442\u0438",title:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043d\u043d\u044f CSS \u0441\u0442\u0438\u043b\u044e",clip:"\u0421\u043a\u0440\u0456\u043f\u043b\u0435\u043d\u043d\u044f",placement:"\u0420\u043e\u0437\u043c\u0456\u0449\u0435\u043d\u043d\u044f",overflow:"\u041f\u0435\u0440\u0435\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f",zindex:"Z-\u0456\u043d\u0434\u0435\u043a\u0441",visibility:"\u0412\u0438\u0434\u0438\u043c\u0456\u0441\u0442\u044c",positioning_type:"\u0422\u0438\u043f",position:"\u041f\u043e\u0437\u0438\u0446\u0456\u044f",bullet_image:"\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f \u0437\u043d\u0430\u0447\u043a\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0443",list_type:"\u0422\u0438\u043f",color:"\u041a\u043e\u043b\u0456\u0440",height:"\u0412\u0438\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",style:"\u0421\u0442\u0438\u043b\u044c",margin:"Margin",left:"\u041b\u0456\u0432\u043e\u0440\u0443\u0447",bottom:"\u0417\u043d\u0438\u0437\u0443",right:"\u041f\u0440\u0430\u0432\u043e\u0440\u0443\u0447",top:"\u0412\u0433\u043e\u0440\u0443",same:"\u041e\u0434\u043d\u0430\u043a\u043e\u0435 \u0434\u043b\u044f \u0432\u0441\u0456\u0445",padding:"\u0412\u043d\u0443\u0442\u0440\u0456\u0448\u043d\u0456\u0439 \u0432\u0456\u0434\u0441\u0442\u0443\u043f",box_clear:"\u041e\u0447\u0438\u0441\u0442\u043a\u0430",box_float:"\u041f\u043b\u0430\u0432\u0430\u043d\u043d\u044f",box_height:"\u0412\u0438\u0441\u043e\u0442\u0430",box_width:"\u0428\u0438\u0440\u0438\u043d\u0430",block_display:"\u0412\u0456\u0434\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u0438",block_whitespace:"\u041f\u0440\u043e\u0431\u0456\u043b",block_text_indent:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f",block_text_align:"\u0412\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f \u0442\u0435\u043a\u0441\u0442\u0443",block_vertical_alignment:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0435 \u0432\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f",block_letterspacing:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f\u0438 \u043c\u0456\u0436 \u043b\u0456\u0442\u0435\u0440\u0430\u043c\u0438",block_wordspacing:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f\u0438 \u043c\u0456\u0436 \u0441\u043b\u043e\u0432\u0430\u043c\u0438",background_vpos:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0456\u044f",background_hpos:"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0456\u044f",background_attachment:"\u0412\u043a\u043b\u0430\u0434\u0435\u043d\u043d\u044f",background_repeat:"\u041f\u043e\u0432\u0442\u043e\u0440",background_image:"\u0424\u043e\u043d\u043e\u0432\u0435 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",background_color:"\u041a\u043e\u043b\u0456\u0440 \u0444\u043e\u043d\u0443",text_none:"\u041d\u0456\u0447\u043e\u0433\u043e",text_blink:"\u041c\u0435\u0440\u0435\u0445\u0442\u0456\u043d\u043d\u044f",text_case:"\u0420\u0435\u0433\u0456\u0441\u0442\u0440",text_striketrough:"\u0417\u0430\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u0438\u0439",text_underline:"\u041f\u0456\u0434\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u0438\u0439",text_overline:"\u041d\u0430\u0434\u043a\u0440\u0435\u0441\u043b\u0435\u043d\u0438\u0439",text_decoration:"\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043d\u044f",text_color:"\u041a\u043e\u043b\u0456\u0440"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/ur_dlg.js b/js/tiny_mce/plugins/style/langs/ur_dlg.js new file mode 100755 index 000000000..c52148f24 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.style_dlg',{text_lineheight:"Line height",text_variant:"Variant",text_style:"Style",text_weight:"Weight",text_size:"Size",text_font:"Font",text_props:"Text",positioning_tab:"Positioning",list_tab:"List",border_tab:"Border",box_tab:"Box",block_tab:"Block",background_tab:"Background",text_tab:"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility",positioning_type:"Type",position:"Position",bullet_image:"Bullet image",list_type:"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for all",padding:"Padding",box_clear:"Clear",box_float:"Float",box_height:"Height",box_width:"Width",block_display:"Display",block_whitespace:"Whitespace",block_text_indent:"Text indent",block_text_align:"Text align",block_vertical_alignment:"Vertical alignment",block_letterspacing:"Letter spacing",block_wordspacing:"Word spacing",background_vpos:"Vertical position",background_hpos:"Horizontal position",background_attachment:"Attachment",background_repeat:"Repeat",background_image:"Background image",background_color:"Background color",text_none:"none",text_blink:"blink",text_case:"Case",text_striketrough:"strikethrough",text_underline:"underline",text_overline:"overline",text_decoration:"Decoration",text_color:"Color"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/vi_dlg.js b/js/tiny_mce/plugins/style/langs/vi_dlg.js new file mode 100755 index 000000000..43c54aefd --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.style_dlg',{text_lineheight:"Chi\u1ec1u cao \u0111\u01b0\u1eddng",text_variant:"Bi\u1ebfn \u0111\u1ed5i",text_style:"Ki\u1ec3u d\u00e1ng",text_weight:"Tr\u1ecdng l\u01b0\u1ee3ng",text_size:"K\u00edch c\u1ee1",text_font:"Ph\u00f4ng",text_props:"V\u0103n b\u1ea3n",positioning_tab:"V\u1ecb tr\u00ed",list_tab:"Danh s\u00e1ch",border_tab:"Vi\u1ec1n",box_tab:"H\u1ed9p",block_tab:"Kh\u1ed1i",background_tab:"N\u1ec1n",text_tab:"V\u0103n b\u1ea3n",apply:"\u00c1p d\u1ee5ng",title:"S\u1eeda ki\u1ec3u d\u00e1ng CSS",clip:"Ghim",placement:"S\u1eafp \u0111\u1eb7t",overflow:"Tr\u00e0n",zindex:"Ch\u1ec9 m\u1ee5c Z",visibility:"Nh\u00ecn th\u1ea5y",positioning_type:"Ki\u1ec3u",position:"V\u1ecb tr\u00ed",bullet_image:"\u1ea2nh Bullet",list_type:"Ki\u1ec3u",color:"M\u00e0u",height:"Chi\u1ec1u cao",width:"Chi\u1ec1u r\u1ed9ng",style:"Ki\u1ec3u",margin:"Bi\u00ean",left:"Tr\u00e1i",bottom:"D\u01b0\u1edbi",right:"Ph\u1ea3i",top:"Tr\u00ean",same:"\u00c1p d\u1ee5ng cho t\u1ea5t c\u1ea3",padding:"\u0110\u1ec7m l\u00f3t",box_clear:"L\u00e0m s\u1ea1ch",box_float:"N\u1ed5i",box_height:"Chi\u1ec1u cao",box_width:"Chi\u1ec1u r\u1ed9ng",block_display:"Hi\u1ec3n th\u1ecb",block_whitespace:"Kho\u1ea3ng tr\u1eafng",block_text_indent:"Th\u1ee5t d\u00f2ng v\u0103n b\u1ea3n",block_text_align:"Canh l\u1ec1 v\u0103n b\u1ea3n",block_vertical_alignment:"Canh l\u1ec1 d\u1ecdc",block_letterspacing:"Kho\u1ea3ng c\u00e1c k\u00fd t\u1ef1",block_wordspacing:"Kho\u1ea3ng c\u00e1c t\u1eeb",background_vpos:"V\u1ecb tr\u00ed d\u1ecdc",background_hpos:"V\u1ecb tr\u00ed ngang",background_attachment:"\u0110\u00ednh k\u00e8m",background_repeat:"L\u1eb7p l\u1ea1i",background_image:"\u1ea2nh n\u1ec1n",background_color:"M\u00e0u n\u1ec1n",text_none:"kh\u00f4ng",text_blink:"nh\u1ea5p nh\u00e1y",text_case:"Bo\u0323c",text_striketrough:"g\u1ea1ch xuy\u00ean",text_underline:"g\u1ea1ch d\u01b0\u1edbi",text_overline:"g\u1ea1ch tr\u00ean",text_decoration:"Trang tr\u00ed",text_color:"M\u00e0u"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/style/langs/zh-cn_dlg.js new file mode 100755 index 000000000..ac56b1418 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.style_dlg',{"text_lineheight":"\u884c\u9ad8","text_variant":"\u53d8\u5f62","text_style":"\u6837\u5f0f","text_weight":"\u7c97\u7ec6","text_size":"\u5927\u5c0f","text_font":"\u5b57\u4f53","text_props":"\u6587\u672c","positioning_tab":"\u4f4d\u7f6e","list_tab":"\u5217\u8868","border_tab":"\u8fb9\u6846","box_tab":"Box","block_tab":"\u533a\u5757","background_tab":"\u80cc\u666f","text_tab":"\u6587\u672c",apply:"\u5e94\u7528",title:"\u7f16\u8f91CSS\u6837\u5f0f",clip:"\u526a\u8f91",placement:"\u653e\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z-Index",visibility:"\u53ef\u89c1","positioning_type":"\u7c7b\u578b",position:"\u4f4d\u7f6e","bullet_image":"\u56fe\u7247\u9879\u76ee\u7b26\u53f7","list_type":"\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",style:"\u6837\u5f0f",margin:"\u5916\u8fb9\u8ddd",left:"\u5de6",bottom:"\u4e0b",right:"\u53f3",top:"\u4e0a",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5185\u8fb9\u8ddd","box_clear":"\u6e05\u9664\u6d6e\u52a8","box_float":"\u6d6e\u52a8","box_height":"\u9ad8\u5ea6","box_width":"\u5bbd\u5ea6","block_display":"\u663e\u793a","block_whitespace":"\u7a7a\u683c","block_text_indent":"\u6587\u5b57\u7f29\u6392","block_text_align":"\u6587\u5b57\u5bf9\u9f50","block_vertical_alignment":"\u5782\u76f4\u5bf9\u9f50","block_letterspacing":"\u5b57\u95f4\u8ddd","block_wordspacing":"\u8bcd\u95f4\u8ddd","background_vpos":"\u5782\u76f4\u4f4d\u7f6e","background_hpos":"\u6c34\u5e73\u4f4d\u7f6e","background_attachment":"\u9644\u4ef6","background_repeat":"\u91cd\u590d","background_image":"\u80cc\u666f\u56fe\u7247","background_color":"\u80cc\u666f\u989c\u8272","text_none":"\u65e0","text_blink":"\u95ea\u70c1","text_case":"\u5b57\u4f53\u5f62\u5f0f","text_striketrough":"\u5220\u9664\u7ebf","text_underline":"\u4e0b\u5212\u7ebf","text_overline":"\u4e0a\u5212\u7ebf","text_decoration":"\u5b57\u4f53\u88c5\u9970","text_color":"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/zh_dlg.js b/js/tiny_mce/plugins/style/langs/zh_dlg.js new file mode 100755 index 000000000..2f5dc0216 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u53d8\u91cf",text_style:"\u6837\u5f0f",text_weight:"\u5b57\u91cd",text_size:"\u6587\u5b57\u5927\u5c0f",text_font:"\u5b57\u4f53",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u8fb9\u6846",box_tab:"\u65b9\u5757",block_tab:"\u533a\u5757",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u5957\u7528",title:"\u7f16\u8f91 CSS \u6837\u5f0f\u8868",clip:"\u526a\u8f91",placement:"\u653e\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z-\u5750\u6807",visibility:"\u53ef\u89c1",positioning_type:"\u7c7b\u578b",position:"\u4f4d\u7f6e",bullet_image:"\u56fe\u7247\u9879\u76ee\u7b26\u53f7",list_type:"\u7c7b\u8868\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8",width:"\u5bbd",style:"\u6837\u5f0f",margin:"\u5916\u8fb9\u8ddd",left:"\u5de6\u4fa7",bottom:"\u9760\u4e0b",right:"\u53f3\u4fa7",top:"\u5b9a\u90e8",same:"\u5168\u90e8\u76f8\u540c",padding:"\u5185\u8fb9\u8ddd",box_clear:"\u6e05\u9664\u6d6e\u52a8",box_float:"\u6d6e\u52a8",box_height:"\u9ad8",box_width:"\u5bbd",block_display:"\u663e\u793a",block_whitespace:"\u7a7a\u683c",block_text_indent:"\u6587\u5b57\u7f29\u6392",block_text_align:"\u6587\u5b57\u5bf9\u9f50",block_vertical_alignment:"\u5782\u76f4\u5bf9\u9f50",block_letterspacing:"\u5b57\u6bcd\u95f4\u8ddd",block_wordspacing:"\u95f4\u8ddd",background_vpos:"\u5782\u76f4\u4f4d\u7f6e",background_hpos:"\u6c34\u5e73\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u590d",background_image:"\u80cc\u666f\u56fe\u7247",background_color:"\u80cc\u666f\u989c\u8272",text_none:"\u65e0",text_blink:"\u95ea\u70c1",text_case:"\u5b57\u578b",text_striketrough:"\u5220\u9664\u7ebf",text_underline:"\u5e95\u7ebf",text_overline:"\u4e0a\u5212\u7ebf",text_decoration:"\u88c5\u9970",text_color:"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/langs/zu_dlg.js b/js/tiny_mce/plugins/style/langs/zu_dlg.js new file mode 100755 index 000000000..8ef113491 --- /dev/null +++ b/js/tiny_mce/plugins/style/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.style_dlg',{text_lineheight:"\u884c\u9ad8",text_variant:"\u53d8\u4f53",text_style:"\u6837\u5f0f",text_weight:"\u5bbd\u5ea6",text_size:"\u5c3a\u5bf8",text_font:"\u5b57\u4f53",text_props:"\u6587\u5b57",positioning_tab:"\u4f4d\u7f6e",list_tab:"\u5217\u8868",border_tab:"\u8fb9\u6846",box_tab:"\u7bb1\u578b",block_tab:"\u5757",background_tab:"\u80cc\u666f",text_tab:"\u6587\u5b57",apply:"\u5e94\u7528",title:"\u7f16\u8f91CSS\u6837\u5f0f\u8868",clip:"\u526a\u8f91",placement:"\u5e03\u7f6e",overflow:"\u6ea2\u51fa",zindex:"Z\u8f74\u6df1\u5ea6",visibility:"\u53ef\u89c1\u6027",positioning_type:"\u7c7b\u578b",position:"\u56fe\u793a\u4f4d\u7f6e",bullet_image:"\u9879\u76ee\u56fe\u793a",list_type:"\u7c7b\u578b",color:"\u989c\u8272",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",style:"\u6837\u5f0f",margin:"\u8fb9\u754c",left:"\u9760\u5de6",bottom:"\u4e0b\u65b9",right:"\u9760\u53f3",top:"\u4e0a\u65b9",same:"\u5168\u90e8\u4e00\u6837",padding:"\u7559\u767d",box_clear:"\u6e05\u9664",box_float:"\u6d6e\u52a8",box_height:"\u9ad8\u5ea6",box_width:"\u5bbd\u5ea6",block_display:"\u663e\u793a\u65b9\u5f0f",block_whitespace:"\u7a7a\u767d",block_text_indent:"\u6587\u5b57\u7f29\u6392",block_text_align:"\u6587\u5b57\u5bf9\u9f50",block_vertical_alignment:"\u6c34\u51c6\u5bf9\u9f50\u65b9\u5f0f",block_letterspacing:"\u5b57\u5143\u95f4\u8ddd",block_wordspacing:"\u5355\u5b57\u95f4\u8ddd",background_vpos:"\u6c34\u51c6\u4f4d\u7f6e",background_hpos:"\u5782\u76f4\u4f4d\u7f6e",background_attachment:"\u9644\u4ef6",background_repeat:"\u91cd\u590d",background_image:"\u80cc\u666f\u56fe\u7247",background_color:"\u80cc\u666f\u989c\u8272",text_none:"\u65e0",text_blink:"\u95ea\u70c1",text_case:"\u5b57\u4f53",text_striketrough:"\u5220\u9664\u7ebf",text_underline:"\u5e95\u7ebf",text_overline:"\u4e0a\u5212\u7ebf",text_decoration:"\u4fee\u9970",text_color:"\u989c\u8272"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/style/props.htm b/js/tiny_mce/plugins/style/props.htm new file mode 100644 index 000000000..b5a3d15d9 --- /dev/null +++ b/js/tiny_mce/plugins/style/props.htm @@ -0,0 +1,838 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#style_dlg.title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="js/props.js"></script> + <link href="css/props.css" rel="stylesheet" type="text/css" /> +</head> + +<body id="styleprops" style="display: none" role="application" aria-labelledby="app_title"> +<span id="app_title" style="display:none">{#style_dlg.title}</span> +<form onsubmit="updateAction();return false;" action="#"> +<div class="tabs"> + <ul> + <li id="text_tab" class="current" aria-controls="text_panel"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{#style_dlg.text_tab}</a></span></li> + <li id="background_tab" aria-controls="background_panel"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{#style_dlg.background_tab}</a></span></li> + <li id="block_tab" aria-controls="block_panel"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{#style_dlg.block_tab}</a></span></li> + <li id="box_tab" aria-controls="box_panel"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{#style_dlg.box_tab}</a></span></li> + <li id="border_tab" aria-controls="border_panel"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{#style_dlg.border_tab}</a></span></li> + <li id="list_tab" aria-controls="list_panel"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{#style_dlg.list_tab}</a></span></li> + <li id="positioning_tab" aria-controls="positioning_panel"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{#style_dlg.positioning_tab}</a></span></li> + </ul> +</div> + +<div class="panel_wrapper"> +<div id="text_panel" class="panel current"> + <fieldset> + <legend>{#style_dlg.text}</legend> + <table role="presentation" border="0" width="100%"> + <tr> + <td><label for="text_font">{#style_dlg.text_font}</label></td> + <td colspan="3"> + <select id="text_font" name="text_font" class="mceEditableSelect mceFocus"></select> + </td> + </tr> + <tr> + <td><label for="text_size">{#style_dlg.text_size}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td> + <td>&nbsp;</td> + <td> + <label id="text_size_measurement_label" for="text_size_measurement" style="display: none; visibility: hidden;">Text Size Measurement Unit</label> + <select id="text_size_measurement" name="text_size_measurement" aria-labelledby="text_size_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td><label for="text_weight">{#style_dlg.text_weight}</label></td> + <td> + <select id="text_weight" name="text_weight"></select> + </td> + </tr> + <tr> + <td><label for="text_style">{#style_dlg.text_style}</label></td> + <td> + <select id="text_style" name="text_style" class="mceEditableSelect"></select> + </td> + <td><label for="text_variant">{#style_dlg.text_variant}</label></td> + <td> + <select id="text_variant" name="text_variant"></select> + </td> + </tr> + <tr> + <td><label for="text_lineheight">{#style_dlg.text_lineheight}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td> + <select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select> + </td> + <td>&nbsp;</td> + <td> + <label id="text_lineheight_measurement_label" for="text_lineheight_measurement" style="display: none; visibility: hidden;">Line Height Measurement Unit</label> + <select id="text_lineheight_measurement" name="text_lineheight_measurement" aria-labelledby="text_lineheight_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td><label for="text_case">{#style_dlg.text_case}</label></td> + <td> + <select id="text_case" name="text_case"></select> + </td> + </tr> + <tr> + <td><label for="text_color">{#style_dlg.text_color}</label></td> + <td colspan="2"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td> + <td id="text_color_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + <tr> + <td valign="top" style="vertical-align: top; padding-top: 3px;">{#style_dlg.text_decoration}</td> + <td colspan="2"> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td> + <td><label for="text_underline">{#style_dlg.text_underline}</label></td> + </tr> + <tr> + <td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td> + <td><label for="text_overline">{#style_dlg.text_overline}</label></td> + </tr> + <tr> + <td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td> + <td><label for="text_linethrough">{#style_dlg.text_striketrough}</label></td> + </tr> + <tr> + <td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td> + <td><label for="text_blink">{#style_dlg.text_blink}</label></td> + </tr> + <tr> + <td><input id="text_none" name="text_none" class="checkbox" type="checkbox" /></td> + <td><label for="text_none">{#style_dlg.text_none}</label></td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> + +<div id="background_panel" class="panel"> + <fieldset> + <legend>{#style_dlg.background}</legend> + <table role="presentation" border="0"> + <tr> + <td><label for="background_color">{#style_dlg.background_color}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td> + <td id="background_color_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="background_image">{#style_dlg.background_image}</label></td> + <td><table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="background_image" name="background_image" type="text" /></td> + <td id="background_image_browser">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="background_repeat">{#style_dlg.background_repeat}</label></td> + <td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="background_attachment">{#style_dlg.background_attachment}</label></td> + <td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="background_hpos">{#style_dlg.background_hpos}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td> + <td>&nbsp;</td> + <td> + <label id="background_hpos_measurement_label" for="background_hpos_measurement" style="display: none; visibility: hidden;">Horizontal position measurement unit</label> + <select id="background_hpos_measurement" name="background_hpos_measurement" aria-labelledby="background_hpos_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="background_vpos">{#style_dlg.background_vpos}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td> + <td>&nbsp;</td> + <td> + + <label id="background_vpos_measurement_label" for="background_vpos_measurement" style="display: none; visibility: hidden;">Vertical position measurement unit</label> + <select id="background_vpos_measurement" name="background_vpos_measurement" aria-labelledby="background_vpos_measurement_label">></select></td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> + +<div id="block_panel" class="panel"> + <fieldset> + <legend>{#style_dlg.block}</legend> + <table role="presentation" border="0"> + <tr> + <td><label for="block_wordspacing">{#style_dlg.block_wordspacing}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td> + <td>&nbsp;</td> + <td> + <label id="block_wordspacing_measurement_label" for="block_wordspacing_measurement" style="display: none; visibility: hidden;">Word spacing measurement unit</label> + <select id="block_wordspacing_measurement" name="block_wordspacing_measurement" aria-labelledby="block_wordspacing_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="block_letterspacing">{#style_dlg.block_letterspacing}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td> + <td>&nbsp;</td> + <td> + <label id="block_letterspacing_measurement_label" for="block_letterspacing_measurement" style="display: none; visibility: hidden;">Letter spacing measurement unit</label> + <select id="block_letterspacing_measurement" name="block_letterspacing_measurement" aria-labelledby="block_letterspacing_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="block_vertical_alignment">{#style_dlg.block_vertical_alignment}</label></td> + <td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="block_text_align">{#style_dlg.block_text_align}</label></td> + <td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="block_text_indent">{#style_dlg.block_text_indent}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="block_text_indent" name="block_text_indent" /></td> + <td>&nbsp;</td> + <td> + <label id="block_text_indent_measurement_label" for="block_text_indent_measurement" style="display: none; visibility: hidden;">Text Indent Measurement Unit</label> + + <select id="block_text_indent_measurement" name="block_text_indent_measurement" aria-labelledby="block_text_indent_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + + <tr> + <td><label for="block_whitespace">{#style_dlg.block_whitespace}</label></td> + <td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="block_display">{#style_dlg.block_display}</label></td> + <td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td> + </tr> + </table> + </fieldset> +</div> + +<div id="box_panel" class="panel"> + <fieldset> + <legend>{#style_dlg.box}</legend> + <table role="presentation" border="0"> + <tr> + <td><label for="box_width">{#style_dlg.box_width}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td> + <td>&nbsp;</td> + <td> + <label id="box_width_measurement_label" for="box_width_measurement" style="display: none; visibility: hidden;">Box Width Measurement Unit</label> + <select id="box_width_measurement" name="box_width_measurement" aria-labelledby="box_width_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td>&nbsp;&nbsp;&nbsp;<label for="box_float">{#style_dlg.box_float}</label></td> + <td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="box_height">{#style_dlg.box_height}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td> + <td>&nbsp;</td> + <td> + <label id="box_height_measurement_label" for="box_height_measurement" style="display: none; visibility: hidden;">Box Height Measurement Unit</label> + <select id="box_height_measurement" name="box_height_measurement" aria-labelledby="box_height_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td>&nbsp;&nbsp;&nbsp;<label for="box_clear">{#style_dlg.box_clear}</label></td> + <td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td> + </tr> + </table> +<div style="float: left; width: 49%"> + <fieldset> + <legend>{#style_dlg.padding}</legend> + + <table role="presentation" border="0"> + <tr> + <td>&nbsp;</td> + <td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{#style_dlg.same}</label></td> + </tr> + <tr> + <td><label for="box_padding_top">{#style_dlg.top}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td> + <td>&nbsp;</td> + <td> + <label id="box_padding_top_measurement_label" for="box_padding_top_measurement" style="display: none; visibility: hidden;">Padding Top Measurement Unit</label> + <select id="box_padding_top_measurement" name="box_padding_top_measurement" aria-labelledby="box_padding_top_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td><label for="box_padding_right">{#style_dlg.right}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="box_padding_right_measurement_label" for="box_padding_right_measurement" style="display: none; visibility: hidden;">Padding Right Measurement Unit</label> + <select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled" aria-labelledby="box_padding_right_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td><label for="box_padding_bottom">{#style_dlg.bottom}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="box_padding_bottom_measurement_label" for="box_padding_bottom_measurement" style="display: none; visibility: hidden;">Padding Bottom Measurement Unit</label> + <select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled" aria-labelledby="box_padding_bottom_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td><label for="box_padding_left">{#style_dlg.left}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="box_padding_left_measurement_label" for="box_padding_left_measurement" style="display: none; visibility: hidden;">Padding Left Measurement Unit</label> + <select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled" aria-labelledby="box_padding_left_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> + +<div style="float: right; width: 49%"> + <fieldset> + <legend>{#style_dlg.margin}</legend> + + <table role="presentation" border="0"> + <tr> + <td>&nbsp;</td> + <td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{#style_dlg.same}</label></td> + </tr> + <tr> + <td><label for="box_margin_top">{#style_dlg.top}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td> + <td>&nbsp;</td> + <td> + <label id="box_margin_top_measurement_label" for="box_margin_top_measurement" style="display: none; visibility: hidden;">Margin Top Measurement Unit</label> + <select id="box_margin_top_measurement" name="box_margin_top_measurement" aria-labelledby="box_margin_top_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td><label for="box_margin_right">{#style_dlg.right}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="box_margin_right_measurement_label" for="box_margin_right_measurement" style="display: none; visibility: hidden;">Margin Right Measurement Unit</label> + <select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled" aria-labelledby="box_margin_right_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td><label for="box_margin_bottom">{#style_dlg.bottom}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="box_margin_bottom_measurement_label" for="box_margin_bottom_measurement" style="display: none; visibility: hidden;">Margin Bottom Measurement Unit</label> + <select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled" aria-labelledby="box_margin_bottom_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td><label for="box_margin_left">{#style_dlg.left}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="box_margin_left_measurement_label" for="box_margin_left_measurement" style="display: none; visibility: hidden;">Margin Left Measurement Unit</label> + <select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled" aria-labelledby="box_margin_left_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> +<br style="clear: both" /> +</div> + +<div id="border_panel" class="panel"> + <fieldset> + <legend>{#style_dlg.border}</legend> + <table role="presentation" border="0" cellspacing="0" cellpadding="0" width="100%"> + <tr> + <td class="tdelim">&nbsp;</td> + <td class="tdelim delim">&nbsp;</td> + <td class="tdelim">{#style_dlg.style}</td> + <td class="tdelim delim">&nbsp;</td> + <td class="tdelim">{#style_dlg.width}</td> + <td class="tdelim delim">&nbsp;</td> + <td class="tdelim">{#style_dlg.color}</td> + </tr> + + <tr> + <td>&nbsp;</td> + <td class="delim">&nbsp;</td> + <td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{#style_dlg.same}</label></td> + <td class="delim">&nbsp;</td> + <td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{#style_dlg.same}</label></td> + <td class="delim">&nbsp;</td> + <td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{#style_dlg.same}</label></td> + </tr> + + <tr> + <td>{#style_dlg.top}</td> + <td class="delim">&nbsp;</td> + <td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td> + <td>&nbsp;</td> + <td> + <label id="border_width_top_measurement_label" for="border_width_top_measurement" style="display: none; visibility: hidden;">Width top Measurement Unit</label> + <select id="border_width_top_measurement" name="border_width_top_measurement" aria-labelledby="border_width_top_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td> + <td id="border_color_top_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td>{#style_dlg.right}</td> + <td class="delim">&nbsp;</td> + <td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td> + <td>&nbsp;</td> + <td> + <label id="border_width_right_measurement_label" for="border_width_right_measurement" style="display: none; visibility: hidden;">Width Right Measurement Unit</label> + <select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled" aria-labelledby="border_width_right_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td> + <td id="border_color_right_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td>{#style_dlg.bottom}</td> + <td class="delim">&nbsp;</td> + <td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td> + <td>&nbsp;</td> + <td> + <label id="border_width_bottom_measurement_label" for="border_width_bottom_measurement" style="display: none; visibility: hidden;">Width Bottom Measurement Unit</label> + <select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled" aria-labelledby="border_width_bottom_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td> + <td id="border_color_bottom_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td>{#style_dlg.left}</td> + <td class="delim">&nbsp;</td> + <td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td> + <td>&nbsp;</td> + <td> + <label id="border_width_left_measurement_label" for="border_width_left_measurement" style="display: none; visibility: hidden;">Width Left Measurement Unit</label> + <select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled" aria-labelledby="border_width_left_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td class="delim">&nbsp;</td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td> + <td id="border_color_left_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> + +<div id="list_panel" class="panel"> +<fieldset> + <legend>{#style_dlg.list}</legend> + <table role="presentation" border="0"> + <tr> + <td><label for="list_type">{#style_dlg.list_type}</label></td> + <td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="list_bullet_image">{#style_dlg.bullet_image}</label></td> + <td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td> + </tr> + + <tr> + <td><label for="list_position">{#style_dlg.position}</label></td> + <td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td> + </tr> + </table> +</fieldset> +</div> + +<div id="positioning_panel" class="panel"> +<fieldset> + <legend>{#style_dlg.position}</legend> +<table role="presentation" border="0"> + <tr> + <td><label for="positioning_type">{#style_dlg.positioning_type}</label></td> + <td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td> + <td>&nbsp;&nbsp;&nbsp;<label for="positioning_visibility">{#style_dlg.visibility}</label></td> + <td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td> + </tr> + + <tr> + <td><label for="positioning_width">{#style_dlg.width}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_width_measurement_label" for="positioning_width_measurement" style="display: none; visibility: hidden;">Positioning width Measurement Unit</label> + <select id="positioning_width_measurement" name="positioning_width_measurement" aria-labelledby="positioning_width_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td>&nbsp;&nbsp;&nbsp;<label for="positioning_zindex">{#style_dlg.zindex}</label></td> + <td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td> + </tr> + + <tr> + <td><label for="positioning_height">{#style_dlg.height}</label></td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_height_measurement_label" for="positioning_height_measurement" style="display: none; visibility: hidden;">Positioning Height Measurement Unit</label> + <select id="positioning_height_measurement" name="positioning_height_measurement" aria-labelledby="positioning_height_measurement_label"></select> + </td> + </tr> + </table> + </td> + <td>&nbsp;&nbsp;&nbsp;<label for="positioning_overflow">{#style_dlg.overflow}</label></td> + <td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td> + </tr> +</table> + +<div style="float: left; width: 49%"> + <fieldset> + <legend>{#style_dlg.placement}</legend> + + <table role="presentation" border="0"> + <tr> + <td>&nbsp;</td> + <td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{#style_dlg.same}</label></td> + </tr> + <tr> + <td>{#style_dlg.top}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_placement_top_measurement_label" for="positioning_placement_top_measurement" style="display: none; visibility: hidden;">Placement Top Measurement Unit</label> + <select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement" aria-labelledby="positioning_placement_top_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td>{#style_dlg.right}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_placement_right_measurement_label" for="positioning_placement_right_measurement" style="display: none; visibility: hidden;">Placement Right Measurement Unit</label> + <select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled" aria-labelledby="positioning_placement_right_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td>{#style_dlg.bottom}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_placement_bottom_measurement_label" for="positioning_placement_bottom_measurement" style="display: none; visibility: hidden;">Placement Bottom Measurement Unit</label> + <select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled" aria-labelledby="positioning_placement_bottom_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td>{#style_dlg.left}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_placement_left_measurement_label" for="positioning_placement_left_measurement" style="display: none; visibility: hidden;">Placement Left Measurement Unit</label> + <select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled" aria-labelledby="positioning_placement_left_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> + +<div style="float: right; width: 49%"> + <fieldset> + <legend>{#style_dlg.clip}</legend> + + <table role="presentation" border="0"> + <tr> + <td>&nbsp;</td> + <td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{#style_dlg.same}</label></td> + </tr> + <tr> + <td>{#style_dlg.top}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_clip_top_measurement_label" for="positioning_clip_top_measurement" style="display: none; visibility: hidden;">Clip Top Measurement Unit</label> + <select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement" aria-labelledby="positioning_clip_top_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td>{#style_dlg.right}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_clip_right_measurement_label" for="positioning_clip_right_measurement" style="display: none; visibility: hidden;">Clip Right Measurement Unit</label> + <select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled" aria-labelledby="positioning_clip_right_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td>{#style_dlg.bottom}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_clip_bottom_measurement_label" for="positioning_clip_bottom_measurement" style="display: none; visibility: hidden;">Clip Bottom Measurement Unit</label> + <select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled" aria-labelledby="positioning_clip_bottom_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td>{#style_dlg.left}</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td> + <td>&nbsp;</td> + <td> + <label id="positioning_clip_left_measurement_label" for="positioning_clip_left_measurement" style="display: none; visibility: hidden;">Clip Left Measurement Unit</label> + <select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled" aria-labelledby="positioning_clip_left_measurement_label"></select> + </td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> +</div> +<br style="clear: both" /> +</div> +</fieldset> +</div> + +<div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" /> +</div> +</form> + +<div style="display: none"> + <div id="container"></div> +</div> + +</body> +</html> diff --git a/js/tiny_mce/plugins/table/cell.htm b/js/tiny_mce/plugins/table/cell.htm new file mode 100644 index 000000000..4afb6afa3 --- /dev/null +++ b/js/tiny_mce/plugins/table/cell.htm @@ -0,0 +1,178 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#table_dlg.cell_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/cell.js"></script> + <link href="css/cell.css" rel="stylesheet" type="text/css" /> +</head> +<body id="tablecell" style="display: none" role="application"> + <form onsubmit="updateAction();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li> + <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#table_dlg.general_props}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td><label for="align">{#table_dlg.align}</label></td> + <td> + <select id="align" name="align" class="mceFocus"> + <option value="">{#not_set}</option> + <option value="center">{#table_dlg.align_middle}</option> + <option value="left">{#table_dlg.align_left}</option> + <option value="right">{#table_dlg.align_right}</option> + </select> + </td> + + <td><label for="celltype">{#table_dlg.cell_type}</label></td> + <td> + <select id="celltype" name="celltype"> + <option value="td">{#table_dlg.td}</option> + <option value="th">{#table_dlg.th}</option> + </select> + </td> + </tr> + + <tr> + <td><label for="valign">{#table_dlg.valign}</label></td> + <td> + <select id="valign" name="valign"> + <option value="">{#not_set}</option> + <option value="top">{#table_dlg.align_top}</option> + <option value="middle">{#table_dlg.align_middle}</option> + <option value="bottom">{#table_dlg.align_bottom}</option> + </select> + </td> + + <td><label for="scope">{#table_dlg.scope}</label></td> + <td> + <select id="scope" name="scope"> + <option value="">{#not_set}</option> + <option value="col">{#table.col}</option> + <option value="row">{#table.row}</option> + <option value="rowgroup">{#table_dlg.rowgroup}</option> + <option value="colgroup">{#table_dlg.colgroup}</option> + </select> + </td> + + </tr> + + <tr> + <td><label for="width">{#table_dlg.width}</label></td> + <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td> + + <td><label for="height">{#table_dlg.height}</label></td> + <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td> + </tr> + + <tr id="styleSelectRow"> + <td><label for="class">{#class_name}</label></td> + <td colspan="3"> + <select id="class" name="class" class="mceEditableSelect"> + <option value="" selected="selected">{#not_set}</option> + </select> + </td> + </tr> + </table> + </fieldset> + </div> + + <div id="advanced_panel" class="panel"> + <fieldset> + <legend>{#table_dlg.advanced_props}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="column1"><label for="id">{#table_dlg.id}</label></td> + <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> + </tr> + + <tr> + <td><label for="style">{#table_dlg.style}</label></td> + <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td> + </tr> + + <tr> + <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> + <td> + <select id="dir" name="dir" style="width: 200px"> + <option value="">{#not_set}</option> + <option value="ltr">{#table_dlg.ltr}</option> + <option value="rtl">{#table_dlg.rtl}</option> + </select> + </td> + </tr> + + <tr> + <td class="column1"><label for="lang">{#table_dlg.langcode}</label></td> + <td> + <input id="lang" name="lang" type="text" value="" style="width: 200px" /> + </td> + </tr> + + <tr> + <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td> + <td id="backgroundimagebrowsercontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr role="group" aria-labelledby="bordercolor_label"> + <td class="column1"><label id="bordercolor_label" for="bordercolor">{#table_dlg.bordercolor}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td> + <td id="bordercolor_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr role="group" aria-labelledby="bgcolor_label"> + <td class="column1"><label id="bgcolor_label" for="bgcolor">{#table_dlg.bgcolor}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td> + <td id="bgcolor_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <div> + <select id="action" name="action"> + <option value="cell">{#table_dlg.cell_cell}</option> + <option value="row">{#table_dlg.cell_row}</option> + <option value="all">{#table_dlg.cell_all}</option> + </select> + </div> + + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/table/css/cell.css b/js/tiny_mce/plugins/table/css/cell.css new file mode 100644 index 000000000..a47cc1a1e --- /dev/null +++ b/js/tiny_mce/plugins/table/css/cell.css @@ -0,0 +1,17 @@ +/* CSS file for cell dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#class { + width: 150px; +} \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/css/row.css b/js/tiny_mce/plugins/table/css/row.css new file mode 100644 index 000000000..0e397db3e --- /dev/null +++ b/js/tiny_mce/plugins/table/css/row.css @@ -0,0 +1,25 @@ +/* CSS file for row dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#rowtype,#align,#valign,#class,#height { + width: 150px; +} + +#height { + width: 50px; +} + +.col2 { + padding-left: 20px; +} diff --git a/js/tiny_mce/plugins/table/css/table.css b/js/tiny_mce/plugins/table/css/table.css new file mode 100644 index 000000000..8f107831e --- /dev/null +++ b/js/tiny_mce/plugins/table/css/table.css @@ -0,0 +1,13 @@ +/* CSS file for table dialog in the table plugin */ + +.panel_wrapper div.current { + height: 245px; +} + +.advfield { + width: 200px; +} + +#class { + width: 150px; +} diff --git a/js/tiny_mce/plugins/table/editor_plugin.js b/js/tiny_mce/plugins/table/editor_plugin.js new file mode 100644 index 000000000..67b8cc859 --- /dev/null +++ b/js/tiny_mce/plugins/table/editor_plugin.js @@ -0,0 +1 @@ +(function(c){var d=c.each;function b(f,g){var h=g.ownerDocument,e=h.createRange(),j;e.setStartBefore(g);e.setEnd(f.endContainer,f.endOffset);j=h.createElement("body");j.appendChild(e.cloneContents());return j.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(H,G,K){var f,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;f=[];d(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);d(O,function(P,Q){Q+=M;d(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(f[Q]){while(f[Q][R]){R++}}U=h(W,"rowspan");V=h(W,"colspan");for(T=Q;T<Q+U;T++){if(!f[T]){f[T]=[]}for(S=R;S<R+V;S++){f[T][S]={part:N,real:T==Q&&S==R,elm:W,rowspan:U,colspan:V}}}})});M+=O.length})}function z(M,O){var N;N=f[O];if(N){return N[M]}}function h(N,M){return parseInt(N.getAttribute(M)||1)}function s(O,M,N){if(O){N=parseInt(N);if(N===1){O.removeAttribute(M,1)}else{O.setAttribute(M,N,1)}}}function j(M){return M&&(G.hasClass(M.elm,"mceSelected")||M==o)}function k(){var M=[];d(H.rows,function(N){d(N.cells,function(O){if(G.hasClass(O,"mceSelected")||O==o.elm){M.push(N);return false}})});return M}function r(){var M=G.createRng();M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H)}function e(M){var N;c.walk(M,function(P){var O;if(P.nodeType==3){d(G.getParents(P.parentNode,null,M).reverse(),function(Q){Q=A(Q,false);if(!N){N=O=Q}else{if(O){O.appendChild(Q)}}O=Q});if(O){O.innerHTML=c.isIE?"&nbsp;":'<br data-mce-bogus="1" />'}return false}},"childNodes");M=A(M,false);s(M,"rowspan",1);s(M,"colspan",1);if(N){M.appendChild(N)}else{if(!c.isIE){M.innerHTML='<br data-mce-bogus="1" />'}}return M}function q(){var M=G.createRng();d(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}d(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=f[Math.min(f.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=f[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=f[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(e(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(e(P.cells[0]),P.cells[0])}}}}}function C(){d(f,function(M,N){d(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=h(P,"colspan");R=h(P,"rowspan");if(S>1||R>1){s(P,"rowspan",1);s(P,"colspan",1);for(Q=0;Q<S-1;Q++){G.insertAfter(e(P),P)}u(O,N,R-1,S)}}})})}function p(V,S,Y){var P,O,X,W,U,R,T,M,V,N,Q;if(V){pos=F(V);P=pos.x;O=pos.y;X=P+(S-1);W=O+(Y-1)}else{P=L.x;O=L.y;X=D.x;W=D.y}T=z(P,O);M=z(X,W);if(T&&M&&T.part==M.part){C();t();T=z(P,O).elm;s(T,"colspan",(X-P)+1);s(T,"rowspan",(W-O)+1);for(R=O;R<=W;R++){for(U=P;U<=X;U++){if(!f[R]||!f[R][U]){continue}V=f[R][U].elm;if(V!=T){N=c.grep(V.childNodes);d(N,function(Z){T.appendChild(Z)});if(N.length){N=c.grep(T.childNodes);Q=0;d(N,function(Z){if(Z.nodeName=="BR"&&G.getAttrib(Z,"data-mce-bogus")&&Q++<N.length-1){T.removeChild(Z)}})}G.remove(V)}}}q()}}function l(Q){var M,S,P,R,T,U,N,V,O;d(f,function(W,X){d(W,function(Z,Y){if(j(Z)){Z=Z.elm;T=Z.parentNode;U=A(T,false);M=X;if(Q){return false}}});if(Q){return !M}});for(R=0;R<f[0].length;R++){if(!f[M][R]){continue}S=f[M][R].elm;if(S!=P){if(!Q){O=h(S,"rowspan");if(O>1){s(S,"rowspan",O+1);continue}}else{if(M>0&&f[M-1][R]){V=f[M-1][R].elm;O=h(V,"rowspan");if(O>1){s(V,"rowspan",O+1);continue}}}N=e(S);s(N,"colspan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function g(N){var O,M;d(f,function(P,Q){d(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});d(f,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=h(P,"colspan");Q=h(P,"rowspan");if(R==1){if(!N){G.insertAfter(e(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(e(P),P);u(O,T,Q-1,R)}}else{s(P,"colspan",P.colSpan+1)}M=P}})}function n(){var M=[];d(f,function(N,O){d(N,function(Q,P){if(j(Q)&&c.inArray(M,P)===-1){d(f,function(T){var R=T[P].elm,S;S=h(R,"colspan");if(S>1){s(R,"colspan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");d(Q.cells,function(S){var T=h(S,"rowspan");if(T>1){s(S,"rowspan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);d(f[R.y],function(S){var T;S=S.elm;if(S!=O){T=h(S,"rowspan");if(T<=1){G.remove(S)}else{s(S,"rowspan",T-1)}O=S}})}N=k();d(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();d(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;d(f,function(S){var R;Q=0;d(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}d(O,function(T){var S=T.cells.length,R;for(i=0;i<S;i++){R=T.cells[i];s(R,"colspan",1);s(R,"rowspan",1)}for(i=S;i<Q;i++){T.appendChild(e(T.cells[S-1]))}for(i=Q;i<S;i++){G.remove(T.cells[i])}if(N){M.parentNode.insertBefore(T,M)}else{G.insertAfter(T,M)}})}function F(M){var N;d(f,function(O,P){d(O,function(R,Q){if(R.elm==M){N={x:Q,y:P};return false}});return !N});return N}function w(M){L=F(M)}function I(){var O,N,M;N=M=0;d(f,function(P,Q){d(P,function(S,R){var U,T;if(j(S)){S=f[Q][R];if(R>N){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=f[y][P];if(!S.real){if(P-(S.colspan-1)<P){P-=S.colspan-1}}}for(x=P;x<=N;x++){S=f[O][x];if(!S.real){if(O-(S.rowspan-1)<O){O-=S.rowspan-1}}}for(y=O;y<=T;y++){for(x=P;x<=U;x++){S=f[y][x];if(S.real){Q=S.colspan-1;R=S.rowspan-1;if(Q){if(x+Q>N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(f[y][x]){G.addClass(f[y][x].elm,"mceSelected")}}}}}c.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:g,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}c.create("tinymce.plugins.TablePlugin",{init:function(f,g){var e,k;function j(n){var m=f.selection,l=f.dom.getParent(n||m.getNode(),"table");if(l){return new a(l,f.dom,m)}}function h(){f.getBody().style.webkitUserSelect="";f.dom.removeClass(f.dom.select("td.mceSelected,th.mceSelected"),"mceSelected")}d([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(l){f.addButton(l[0],{title:l[1],cmd:l[2],ui:l[3]})});if(!c.isIE){f.onClick.add(function(l,m){m=m.target;if(m.nodeName==="TABLE"){l.selection.select(m);l.nodeChanged()}})}f.onPreProcess.add(function(m,n){var l,o,p,r=m.dom,q;l=r.select("table",n.node);o=l.length;while(o--){p=l[o];r.setAttrib(p,"data-mce-style","");if((q=r.getAttrib(p,"width"))){r.setStyle(p,"width",q);r.setAttrib(p,"width","")}if((q=r.getAttrib(p,"height"))){r.setStyle(p,"height",q);r.setAttrib(p,"height","")}}});f.onNodeChange.add(function(m,l,q){var o;q=m.selection.getStart();o=m.dom.getParent(q,"td,th,caption");l.setActive("table",q.nodeName==="TABLE"||!!o);if(o&&o.nodeName==="CAPTION"){o=0}l.setDisabled("delete_table",!o);l.setDisabled("delete_col",!o);l.setDisabled("delete_table",!o);l.setDisabled("delete_row",!o);l.setDisabled("col_after",!o);l.setDisabled("col_before",!o);l.setDisabled("row_after",!o);l.setDisabled("row_before",!o);l.setDisabled("row_props",!o);l.setDisabled("cell_props",!o);l.setDisabled("split_cells",!o);l.setDisabled("merge_cells",!o)});f.onInit.add(function(m){var l,p,q=m.dom,n;e=m.windowManager;m.onMouseDown.add(function(r,s){if(s.button!=2){h();p=q.getParent(s.target,"td,th");l=q.getParent(p,"table")}});q.bind(m.getDoc(),"mouseover",function(u){var s,r,t=u.target;if(p&&(n||t!=p)&&(t.nodeName=="TD"||t.nodeName=="TH")){r=q.getParent(t,"table");if(r==l){if(!n){n=j(r);n.setStartCell(p);m.getBody().style.webkitUserSelect="none"}n.setEndCell(t)}s=m.selection.getSel();if(s.removeAllRanges){s.removeAllRanges()}else{s.empty()}u.preventDefault()}});m.onMouseUp.add(function(A,B){var s,u=A.selection,C,D=u.getSel(),r,v,t,z;if(p){if(n){A.getBody().style.webkitUserSelect=""}function w(E,G){var F=new c.dom.TreeWalker(E,E);do{if(E.nodeType==3&&c.trim(E.nodeValue).length!=0){if(G){s.setStart(E,0)}else{s.setEnd(E,E.nodeValue.length)}return}if(E.nodeName=="BR"){if(G){s.setStartBefore(E)}else{s.setEndBefore(E)}return}}while(E=(G?F.next():F.prev()))}C=q.select("td.mceSelected,th.mceSelected");if(C.length>0){s=q.createRng();v=C[0];z=C[C.length-1];w(v,1);r=new c.dom.TreeWalker(v,q.getParent(C[0],"table"));do{if(v.nodeName=="TD"||v.nodeName=="TH"){if(!q.hasClass(v,"mceSelected")){break}t=v}}while(v=r.next());w(t);u.setRng(s)}A.nodeChanged();p=n=l=null}});m.onKeyUp.add(function(r,s){h()});if(m&&m.plugins.contextmenu){m.plugins.contextmenu.onContextMenu.add(function(t,r,v){var w,u=m.selection,s=u.getNode()||m.getBody();if(m.dom.getParent(v,"td")||m.dom.getParent(v,"th")||m.dom.select("td.mceSelected,th.mceSelected").length){r.removeAll();if(s.nodeName=="A"&&!m.dom.getAttrib(s,"name")){r.add({title:"advanced.link_desc",icon:"link",cmd:m.plugins.advlink?"mceAdvLink":"mceLink",ui:true});r.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});r.addSeparator()}if(s.nodeName=="IMG"&&s.className.indexOf("mceItem")==-1){r.add({title:"advanced.image_desc",icon:"image",cmd:m.plugins.advimage?"mceAdvImage":"mceImage",ui:true});r.addSeparator()}r.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});r.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});r.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});r.addSeparator();w=r.addMenu({title:"table.cell"});w.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});w.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});w.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});w=r.addMenu({title:"table.row"});w.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});w.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});w.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});w.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});w.addSeparator();w.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});w.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});w.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!k);w.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!k);w=r.addMenu({title:"table.col"});w.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});w.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});w.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{r.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!c.isIE){function o(){var r;for(r=m.getBody().lastChild;r&&r.nodeType==3&&!r.nodeValue.length;r=r.previousSibling){}if(r&&r.nodeName=="TABLE"){m.dom.add(m.getBody(),"p",null,'<br mce_bogus="1" />')}}if(c.isGecko){m.onKeyDown.add(function(s,u){var r,t,v=s.dom;if(u.keyCode==37||u.keyCode==38){r=s.selection.getRng();t=v.getParent(r.startContainer,"table");if(t&&s.getBody().firstChild==t){if(b(r,t)){r=v.createRng();r.setStartBefore(t);r.setEndBefore(t);s.selection.setRng(r);u.preventDefault()}}}})}m.onKeyUp.add(o);m.onSetContent.add(o);m.onVisualAid.add(o);m.onPreProcess.add(function(r,t){var s=t.node.lastChild;if(s&&s.childNodes.length==1&&s.firstChild.nodeName=="BR"){r.dom.remove(s)}});o()}});d({mceTableSplitCells:function(l){l.split()},mceTableMergeCells:function(m){var n,o,l;l=f.dom.getParent(f.selection.getNode(),"th,td");if(l){n=l.rowSpan;o=l.colSpan}if(!f.dom.select("td.mceSelected,th.mceSelected").length){e.open({url:g+"/merge_cells.htm",width:240+parseInt(f.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(f.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:n,cols:o,onaction:function(p){m.merge(l,p.cols,p.rows)},plugin_url:g})}else{m.merge()}},mceTableInsertRowBefore:function(l){l.insertRow(true)},mceTableInsertRowAfter:function(l){l.insertRow()},mceTableInsertColBefore:function(l){l.insertCol(true)},mceTableInsertColAfter:function(l){l.insertCol()},mceTableDeleteCol:function(l){l.deleteCols()},mceTableDeleteRow:function(l){l.deleteRows()},mceTableCutRow:function(l){k=l.cutRows()},mceTableCopyRow:function(l){k=l.copyRows()},mceTablePasteRowBefore:function(l){l.pasteRows(k,true)},mceTablePasteRowAfter:function(l){l.pasteRows(k)},mceTableDelete:function(l){l.deleteTable()}},function(m,l){f.addCommand(l,function(){var n=j();if(n){m(n);f.execCommand("mceRepaint");h()}})});d({mceInsertTable:function(l){e.open({url:g+"/table.htm",width:400+parseInt(f.getLang("table.table_delta_width",0)),height:320+parseInt(f.getLang("table.table_delta_height",0)),inline:1},{plugin_url:g,action:l?l.action:0})},mceTableRowProps:function(){e.open({url:g+"/row.htm",width:400+parseInt(f.getLang("table.rowprops_delta_width",0)),height:295+parseInt(f.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:g})},mceTableCellProps:function(){e.open({url:g+"/cell.htm",width:400+parseInt(f.getLang("table.cellprops_delta_width",0)),height:295+parseInt(f.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:g})}},function(m,l){f.addCommand(l,function(n,o){m(o)})})}});c.PluginManager.add("table",c.plugins.TablePlugin)})(tinymce); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/editor_plugin_src.js b/js/tiny_mce/plugins/table/editor_plugin_src.js new file mode 100644 index 000000000..100c330c2 --- /dev/null +++ b/js/tiny_mce/plugins/table/editor_plugin_src.js @@ -0,0 +1,1198 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var each = tinymce.each; + + // Checks if the selection/caret is at the start of the specified block element + function isAtStart(rng, par) { + var doc = par.ownerDocument, rng2 = doc.createRange(), elm; + + rng2.setStartBefore(par); + rng2.setEnd(rng.endContainer, rng.endOffset); + + elm = doc.createElement('body'); + elm.appendChild(rng2.cloneContents()); + + // Check for text characters of other elements that should be treated as content + return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; + }; + + /** + * Table Grid class. + */ + function TableGrid(table, dom, selection) { + var grid, startPos, endPos, selectedCell; + + buildGrid(); + selectedCell = dom.getParent(selection.getStart(), 'th,td'); + if (selectedCell) { + startPos = getPos(selectedCell); + endPos = findEndPos(); + selectedCell = getCell(startPos.x, startPos.y); + } + + function cloneNode(node, children) { + node = node.cloneNode(children); + node.removeAttribute('id'); + + return node; + } + + function buildGrid() { + var startY = 0; + + grid = []; + + each(['thead', 'tbody', 'tfoot'], function(part) { + var rows = dom.select('> ' + part + ' tr', table); + + each(rows, function(tr, y) { + y += startY; + + each(dom.select('> td, > th', tr), function(td, x) { + var x2, y2, rowspan, colspan; + + // Skip over existing cells produced by rowspan + if (grid[y]) { + while (grid[y][x]) + x++; + } + + // Get col/rowspan from cell + rowspan = getSpanVal(td, 'rowspan'); + colspan = getSpanVal(td, 'colspan'); + + // Fill out rowspan/colspan right and down + for (y2 = y; y2 < y + rowspan; y2++) { + if (!grid[y2]) + grid[y2] = []; + + for (x2 = x; x2 < x + colspan; x2++) { + grid[y2][x2] = { + part : part, + real : y2 == y && x2 == x, + elm : td, + rowspan : rowspan, + colspan : colspan + }; + } + } + }); + }); + + startY += rows.length; + }); + }; + + function getCell(x, y) { + var row; + + row = grid[y]; + if (row) + return row[x]; + }; + + function getSpanVal(td, name) { + return parseInt(td.getAttribute(name) || 1); + }; + + function setSpanVal(td, name, val) { + if (td) { + val = parseInt(val); + + if (val === 1) + td.removeAttribute(name, 1); + else + td.setAttribute(name, val, 1); + } + } + + function isCellSelected(cell) { + return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell); + }; + + function getSelectedRows() { + var rows = []; + + each(table.rows, function(row) { + each(row.cells, function(cell) { + if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { + rows.push(row); + return false; + } + }); + }); + + return rows; + }; + + function deleteTable() { + var rng = dom.createRng(); + + rng.setStartAfter(table); + rng.setEndAfter(table); + + selection.setRng(rng); + + dom.remove(table); + }; + + function cloneCell(cell) { + var formatNode; + + // Clone formats + tinymce.walk(cell, function(node) { + var curNode; + + if (node.nodeType == 3) { + each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { + node = cloneNode(node, false); + + if (!formatNode) + formatNode = curNode = node; + else if (curNode) + curNode.appendChild(node); + + curNode = node; + }); + + // Add something to the inner node + if (curNode) + curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br data-mce-bogus="1" />'; + + return false; + } + }, 'childNodes'); + + cell = cloneNode(cell, false); + setSpanVal(cell, 'rowspan', 1); + setSpanVal(cell, 'colspan', 1); + + if (formatNode) { + cell.appendChild(formatNode); + } else { + if (!tinymce.isIE) + cell.innerHTML = '<br data-mce-bogus="1" />'; + } + + return cell; + }; + + function cleanup() { + var rng = dom.createRng(); + + // Empty rows + each(dom.select('tr', table), function(tr) { + if (tr.cells.length == 0) + dom.remove(tr); + }); + + // Empty table + if (dom.select('tr', table).length == 0) { + rng.setStartAfter(table); + rng.setEndAfter(table); + selection.setRng(rng); + dom.remove(table); + return; + } + + // Empty header/body/footer + each(dom.select('thead,tbody,tfoot', table), function(part) { + if (part.rows.length == 0) + dom.remove(part); + }); + + // Restore selection to start position if it still exists + buildGrid(); + + // Restore the selection to the closest table position + row = grid[Math.min(grid.length - 1, startPos.y)]; + if (row) { + selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); + selection.collapse(true); + } + }; + + function fillLeftDown(x, y, rows, cols) { + var tr, x2, r, c, cell; + + tr = grid[y][x].elm.parentNode; + for (r = 1; r <= rows; r++) { + tr = dom.getNext(tr, 'tr'); + + if (tr) { + // Loop left to find real cell + for (x2 = x; x2 >= 0; x2--) { + cell = grid[y + r][x2].elm; + + if (cell.parentNode == tr) { + // Append clones after + for (c = 1; c <= cols; c++) + dom.insertAfter(cloneCell(cell), cell); + + break; + } + } + + if (x2 == -1) { + // Insert nodes before first cell + for (c = 1; c <= cols; c++) + tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); + } + } + } + }; + + function split() { + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan, newCell, i; + + if (isCellSelected(cell)) { + cell = cell.elm; + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan > 1 || rowSpan > 1) { + setSpanVal(cell, 'rowspan', 1); + setSpanVal(cell, 'colspan', 1); + + // Insert cells right + for (i = 0; i < colSpan - 1; i++) + dom.insertAfter(cloneCell(cell), cell); + + fillLeftDown(x, y, rowSpan - 1, colSpan); + } + } + }); + }); + }; + + function merge(cell, cols, rows) { + var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count; + + // Use specified cell and cols/rows + if (cell) { + pos = getPos(cell); + startX = pos.x; + startY = pos.y; + endX = startX + (cols - 1); + endY = startY + (rows - 1); + } else { + // Use selection + startX = startPos.x; + startY = startPos.y; + endX = endPos.x; + endY = endPos.y; + } + + // Find start/end cells + startCell = getCell(startX, startY); + endCell = getCell(endX, endY); + + // Check if the cells exists and if they are of the same part for example tbody = tbody + if (startCell && endCell && startCell.part == endCell.part) { + // Split and rebuild grid + split(); + buildGrid(); + + // Set row/col span to start cell + startCell = getCell(startX, startY).elm; + setSpanVal(startCell, 'colspan', (endX - startX) + 1); + setSpanVal(startCell, 'rowspan', (endY - startY) + 1); + + // Remove other cells and add it's contents to the start cell + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + if (!grid[y] || !grid[y][x]) + continue; + + cell = grid[y][x].elm; + + if (cell != startCell) { + // Move children to startCell + children = tinymce.grep(cell.childNodes); + each(children, function(node) { + startCell.appendChild(node); + }); + + // Remove bogus nodes if there is children in the target cell + if (children.length) { + children = tinymce.grep(startCell.childNodes); + count = 0; + each(children, function(node) { + if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1) + startCell.removeChild(node); + }); + } + + // Remove cell + dom.remove(cell); + } + } + } + + // Remove empty rows etc and restore caret location + cleanup(); + } + }; + + function insertRow(before) { + var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan; + + // Find first/last row + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + cell = cell.elm; + rowElm = cell.parentNode; + newRow = cloneNode(rowElm, false); + posY = y; + + if (before) + return false; + } + }); + + if (before) + return !posY; + }); + + for (x = 0; x < grid[0].length; x++) { + // Cell not found could be because of an invalid table structure + if (!grid[posY][x]) + continue; + + cell = grid[posY][x].elm; + + if (cell != lastCell) { + if (!before) { + rowSpan = getSpanVal(cell, 'rowspan'); + if (rowSpan > 1) { + setSpanVal(cell, 'rowspan', rowSpan + 1); + continue; + } + } else { + // Check if cell above can be expanded + if (posY > 0 && grid[posY - 1][x]) { + otherCell = grid[posY - 1][x].elm; + rowSpan = getSpanVal(otherCell, 'rowspan'); + if (rowSpan > 1) { + setSpanVal(otherCell, 'rowspan', rowSpan + 1); + continue; + } + } + } + + // Insert new cell into new row + newCell = cloneCell(cell); + setSpanVal(newCell, 'colspan', cell.colSpan); + + newRow.appendChild(newCell); + + lastCell = cell; + } + } + + if (newRow.hasChildNodes()) { + if (!before) + dom.insertAfter(newRow, rowElm); + else + rowElm.parentNode.insertBefore(newRow, rowElm); + } + }; + + function insertCol(before) { + var posX, lastCell; + + // Find first/last column + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell)) { + posX = x; + + if (before) + return false; + } + }); + + if (before) + return !posX; + }); + + each(grid, function(row, y) { + var cell, rowSpan, colSpan; + + if (!row[posX]) + return; + + cell = row[posX].elm; + if (cell != lastCell) { + colSpan = getSpanVal(cell, 'colspan'); + rowSpan = getSpanVal(cell, 'rowspan'); + + if (colSpan == 1) { + if (!before) { + dom.insertAfter(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } else { + cell.parentNode.insertBefore(cloneCell(cell), cell); + fillLeftDown(posX, y, rowSpan - 1, colSpan); + } + } else + setSpanVal(cell, 'colspan', cell.colSpan + 1); + + lastCell = cell; + } + }); + }; + + function deleteCols() { + var cols = []; + + // Get selected column indexes + each(grid, function(row, y) { + each(row, function(cell, x) { + if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { + each(grid, function(row) { + var cell = row[x].elm, colSpan; + + colSpan = getSpanVal(cell, 'colspan'); + + if (colSpan > 1) + setSpanVal(cell, 'colspan', colSpan - 1); + else + dom.remove(cell); + }); + + cols.push(x); + } + }); + }); + + cleanup(); + }; + + function deleteRows() { + var rows; + + function deleteRow(tr) { + var nextTr, pos, lastCell; + + nextTr = dom.getNext(tr, 'tr'); + + // Move down row spanned cells + each(tr.cells, function(cell) { + var rowSpan = getSpanVal(cell, 'rowspan'); + + if (rowSpan > 1) { + setSpanVal(cell, 'rowspan', rowSpan - 1); + pos = getPos(cell); + fillLeftDown(pos.x, pos.y, 1, 1); + } + }); + + // Delete cells + pos = getPos(tr.cells[0]); + each(grid[pos.y], function(cell) { + var rowSpan; + + cell = cell.elm; + + if (cell != lastCell) { + rowSpan = getSpanVal(cell, 'rowspan'); + + if (rowSpan <= 1) + dom.remove(cell); + else + setSpanVal(cell, 'rowspan', rowSpan - 1); + + lastCell = cell; + } + }); + }; + + // Get selected rows and move selection out of scope + rows = getSelectedRows(); + + // Delete all selected rows + each(rows.reverse(), function(tr) { + deleteRow(tr); + }); + + cleanup(); + }; + + function cutRows() { + var rows = getSelectedRows(); + + dom.remove(rows); + cleanup(); + + return rows; + }; + + function copyRows() { + var rows = getSelectedRows(); + + each(rows, function(row, i) { + rows[i] = cloneNode(row, true); + }); + + return rows; + }; + + function pasteRows(rows, before) { + var selectedRows = getSelectedRows(), + targetRow = selectedRows[before ? 0 : selectedRows.length - 1], + targetCellCount = targetRow.cells.length; + + // Calc target cell count + each(grid, function(row) { + var match; + + targetCellCount = 0; + each(row, function(cell, x) { + if (cell.real) + targetCellCount += cell.colspan; + + if (cell.elm.parentNode == targetRow) + match = 1; + }); + + if (match) + return false; + }); + + if (!before) + rows.reverse(); + + each(rows, function(row) { + var cellCount = row.cells.length, cell; + + // Remove col/rowspans + for (i = 0; i < cellCount; i++) { + cell = row.cells[i]; + setSpanVal(cell, 'colspan', 1); + setSpanVal(cell, 'rowspan', 1); + } + + // Needs more cells + for (i = cellCount; i < targetCellCount; i++) + row.appendChild(cloneCell(row.cells[cellCount - 1])); + + // Needs less cells + for (i = targetCellCount; i < cellCount; i++) + dom.remove(row.cells[i]); + + // Add before/after + if (before) + targetRow.parentNode.insertBefore(row, targetRow); + else + dom.insertAfter(row, targetRow); + }); + }; + + function getPos(target) { + var pos; + + each(grid, function(row, y) { + each(row, function(cell, x) { + if (cell.elm == target) { + pos = {x : x, y : y}; + return false; + } + }); + + return !pos; + }); + + return pos; + }; + + function setStartCell(cell) { + startPos = getPos(cell); + }; + + function findEndPos() { + var pos, maxX, maxY; + + maxX = maxY = 0; + + each(grid, function(row, y) { + each(row, function(cell, x) { + var colSpan, rowSpan; + + if (isCellSelected(cell)) { + cell = grid[y][x]; + + if (x > maxX) + maxX = x; + + if (y > maxY) + maxY = y; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + }); + }); + + return {x : maxX, y : maxY}; + }; + + function setEndCell(cell) { + var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; + + endPos = getPos(cell); + + if (startPos && endPos) { + // Get start/end positions + startX = Math.min(startPos.x, endPos.x); + startY = Math.min(startPos.y, endPos.y); + endX = Math.max(startPos.x, endPos.x); + endY = Math.max(startPos.y, endPos.y); + + // Expand end positon to include spans + maxX = endX; + maxY = endY; + + // Expand startX + for (y = startY; y <= maxY; y++) { + cell = grid[y][startX]; + + if (!cell.real) { + if (startX - (cell.colspan - 1) < startX) + startX -= cell.colspan - 1; + } + } + + // Expand startY + for (x = startX; x <= maxX; x++) { + cell = grid[startY][x]; + + if (!cell.real) { + if (startY - (cell.rowspan - 1) < startY) + startY -= cell.rowspan - 1; + } + } + + // Find max X, Y + for (y = startY; y <= endY; y++) { + for (x = startX; x <= endX; x++) { + cell = grid[y][x]; + + if (cell.real) { + colSpan = cell.colspan - 1; + rowSpan = cell.rowspan - 1; + + if (colSpan) { + if (x + colSpan > maxX) + maxX = x + colSpan; + } + + if (rowSpan) { + if (y + rowSpan > maxY) + maxY = y + rowSpan; + } + } + } + } + + // Remove current selection + dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + + // Add new selection + for (y = startY; y <= maxY; y++) { + for (x = startX; x <= maxX; x++) { + if (grid[y][x]) + dom.addClass(grid[y][x].elm, 'mceSelected'); + } + } + } + }; + + // Expose to public + tinymce.extend(this, { + deleteTable : deleteTable, + split : split, + merge : merge, + insertRow : insertRow, + insertCol : insertCol, + deleteCols : deleteCols, + deleteRows : deleteRows, + cutRows : cutRows, + copyRows : copyRows, + pasteRows : pasteRows, + getPos : getPos, + setStartCell : setStartCell, + setEndCell : setEndCell + }); + }; + + tinymce.create('tinymce.plugins.TablePlugin', { + init : function(ed, url) { + var winMan, clipboardRows; + + function createTableGrid(node) { + var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); + + if (tblElm) + return new TableGrid(tblElm, ed.dom, selection); + }; + + function cleanup() { + // Restore selection possibilities + ed.getBody().style.webkitUserSelect = ''; + ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); + }; + + // Register buttons + each([ + ['table', 'table.desc', 'mceInsertTable', true], + ['delete_table', 'table.del', 'mceTableDelete'], + ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], + ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], + ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], + ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], + ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], + ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], + ['row_props', 'table.row_desc', 'mceTableRowProps', true], + ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], + ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], + ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] + ], function(c) { + ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); + }); + + // Select whole table is a table border is clicked + if (!tinymce.isIE) { + ed.onClick.add(function(ed, e) { + e = e.target; + + if (e.nodeName === 'TABLE') { + ed.selection.select(e); + ed.nodeChanged(); + } + }); + } + + ed.onPreProcess.add(function(ed, args) { + var nodes, i, node, dom = ed.dom, value; + + nodes = dom.select('table', args.node); + i = nodes.length; + while (i--) { + node = nodes[i]; + dom.setAttrib(node, 'data-mce-style', ''); + + if ((value = dom.getAttrib(node, 'width'))) { + dom.setStyle(node, 'width', value); + dom.setAttrib(node, 'width', ''); + } + + if ((value = dom.getAttrib(node, 'height'))) { + dom.setStyle(node, 'height', value); + dom.setAttrib(node, 'height', ''); + } + } + }); + + // Handle node change updates + ed.onNodeChange.add(function(ed, cm, n) { + var p; + + n = ed.selection.getStart(); + p = ed.dom.getParent(n, 'td,th,caption'); + cm.setActive('table', n.nodeName === 'TABLE' || !!p); + + // Disable table tools if we are in caption + if (p && p.nodeName === 'CAPTION') + p = 0; + + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_col', !p); + cm.setDisabled('delete_table', !p); + cm.setDisabled('delete_row', !p); + cm.setDisabled('col_after', !p); + cm.setDisabled('col_before', !p); + cm.setDisabled('row_after', !p); + cm.setDisabled('row_before', !p); + cm.setDisabled('row_props', !p); + cm.setDisabled('cell_props', !p); + cm.setDisabled('split_cells', !p); + cm.setDisabled('merge_cells', !p); + }); + + ed.onInit.add(function(ed) { + var startTable, startCell, dom = ed.dom, tableGrid; + + winMan = ed.windowManager; + + // Add cell selection logic + ed.onMouseDown.add(function(ed, e) { + if (e.button != 2) { + cleanup(); + + startCell = dom.getParent(e.target, 'td,th'); + startTable = dom.getParent(startCell, 'table'); + } + }); + + dom.bind(ed.getDoc(), 'mouseover', function(e) { + var sel, table, target = e.target; + + if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { + table = dom.getParent(target, 'table'); + if (table == startTable) { + if (!tableGrid) { + tableGrid = createTableGrid(table); + tableGrid.setStartCell(startCell); + + ed.getBody().style.webkitUserSelect = 'none'; + } + + tableGrid.setEndCell(target); + } + + // Remove current selection + sel = ed.selection.getSel(); + + if (sel.removeAllRanges) + sel.removeAllRanges(); + else + sel.empty(); + + e.preventDefault(); + } + }); + + ed.onMouseUp.add(function(ed, e) { + var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; + + // Move selection to startCell + if (startCell) { + if (tableGrid) + ed.getBody().style.webkitUserSelect = ''; + + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); + + return; + } + + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); + + return; + } + } while (node = (start ? walker.next() : walker.prev())); + }; + + // Try to expand text selection as much as we can only Gecko supports cell selection + selectedCells = dom.select('td.mceSelected,th.mceSelected'); + if (selectedCells.length > 0) { + rng = dom.createRng(); + node = selectedCells[0]; + endNode = selectedCells[selectedCells.length - 1]; + + setPoint(node, 1); + walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); + + do { + if (node.nodeName == 'TD' || node.nodeName == 'TH') { + if (!dom.hasClass(node, 'mceSelected')) + break; + + lastNode = node; + } + } while (node = walker.next()); + + setPoint(lastNode); + + sel.setRng(rng); + } + + ed.nodeChanged(); + startCell = tableGrid = startTable = null; + } + }); + + ed.onKeyUp.add(function(ed, e) { + cleanup(); + }); + + // Add context menu + if (ed && ed.plugins.contextmenu) { + ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { + var sm, se = ed.selection, el = se.getNode() || ed.getBody(); + + if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { + m.removeAll(); + + if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { + m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); + m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); + m.addSeparator(); + } + + if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { + m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); + m.addSeparator(); + } + + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); + m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); + m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); + m.addSeparator(); + + // Cell menu + sm = m.addMenu({title : 'table.cell'}); + sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); + sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); + sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); + + // Row menu + sm = m.addMenu({title : 'table.row'}); + sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); + sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); + sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); + sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); + sm.addSeparator(); + sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); + sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); + sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); + sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); + + // Column menu + sm = m.addMenu({title : 'table.col'}); + sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); + sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); + sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); + } else + m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); + }); + } + + // Fixes an issue on Gecko where it's impossible to place the caret behind a table + // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled + if (!tinymce.isIE) { + function fixTableCaretPos() { + var last; + + // Skip empty text nodes form the end + for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; + + if (last && last.nodeName == 'TABLE') + ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />'); + }; + + // Fixes an bug where it's impossible to place the caret before a table in Gecko + // this fix solves it by detecting when the caret is at the beginning of such a table + // and then manually moves the caret infront of the table + if (tinymce.isGecko) { + ed.onKeyDown.add(function(ed, e) { + var rng, table, dom = ed.dom; + + // On gecko it's not possible to place the caret before a table + if (e.keyCode == 37 || e.keyCode == 38) { + rng = ed.selection.getRng(); + table = dom.getParent(rng.startContainer, 'table'); + + if (table && ed.getBody().firstChild == table) { + if (isAtStart(rng, table)) { + rng = dom.createRng(); + + rng.setStartBefore(table); + rng.setEndBefore(table); + + ed.selection.setRng(rng); + + e.preventDefault(); + } + } + } + }); + } + + ed.onKeyUp.add(fixTableCaretPos); + ed.onSetContent.add(fixTableCaretPos); + ed.onVisualAid.add(fixTableCaretPos); + + ed.onPreProcess.add(function(ed, o) { + var last = o.node.lastChild; + + if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR') + ed.dom.remove(last); + }); + + fixTableCaretPos(); + } + }); + + // Register action commands + each({ + mceTableSplitCells : function(grid) { + grid.split(); + }, + + mceTableMergeCells : function(grid) { + var rowSpan, colSpan, cell; + + cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); + if (cell) { + rowSpan = cell.rowSpan; + colSpan = cell.colSpan; + } + + if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { + winMan.open({ + url : url + '/merge_cells.htm', + width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), + height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), + inline : 1 + }, { + rows : rowSpan, + cols : colSpan, + onaction : function(data) { + grid.merge(cell, data.cols, data.rows); + }, + plugin_url : url + }); + } else + grid.merge(); + }, + + mceTableInsertRowBefore : function(grid) { + grid.insertRow(true); + }, + + mceTableInsertRowAfter : function(grid) { + grid.insertRow(); + }, + + mceTableInsertColBefore : function(grid) { + grid.insertCol(true); + }, + + mceTableInsertColAfter : function(grid) { + grid.insertCol(); + }, + + mceTableDeleteCol : function(grid) { + grid.deleteCols(); + }, + + mceTableDeleteRow : function(grid) { + grid.deleteRows(); + }, + + mceTableCutRow : function(grid) { + clipboardRows = grid.cutRows(); + }, + + mceTableCopyRow : function(grid) { + clipboardRows = grid.copyRows(); + }, + + mceTablePasteRowBefore : function(grid) { + grid.pasteRows(clipboardRows, true); + }, + + mceTablePasteRowAfter : function(grid) { + grid.pasteRows(clipboardRows); + }, + + mceTableDelete : function(grid) { + grid.deleteTable(); + } + }, function(func, name) { + ed.addCommand(name, function() { + var grid = createTableGrid(); + + if (grid) { + func(grid); + ed.execCommand('mceRepaint'); + cleanup(); + } + }); + }); + + // Register dialog commands + each({ + mceInsertTable : function(val) { + winMan.open({ + url : url + '/table.htm', + width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), + height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), + inline : 1 + }, { + plugin_url : url, + action : val ? val.action : 0 + }); + }, + + mceTableRowProps : function() { + winMan.open({ + url : url + '/row.htm', + width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }, + + mceTableCellProps : function() { + winMan.open({ + url : url + '/cell.htm', + width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), + height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + } + }, function(func, name) { + ed.addCommand(name, function(ui, val) { + func(val); + }); + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); +})(tinymce); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/js/cell.js b/js/tiny_mce/plugins/table/js/cell.js new file mode 100644 index 000000000..38bbe79ff --- /dev/null +++ b/js/tiny_mce/plugins/table/js/cell.js @@ -0,0 +1,284 @@ +tinyMCEPopup.requireLangPack(); + +var ed; + +function init() { + ed = tinyMCEPopup.editor; + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') + + var inst = ed; + var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th"); + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style")); + + // Get table cell data + var celltype = tdElm.nodeName.toLowerCase(); + var align = ed.dom.getAttrib(tdElm, 'align'); + var valign = ed.dom.getAttrib(tdElm, 'valign'); + var width = trimSize(getStyle(tdElm, 'width', 'width')); + var height = trimSize(getStyle(tdElm, 'height', 'height')); + var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); + var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); + var className = ed.dom.getAttrib(tdElm, 'class'); + var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + var id = ed.dom.getAttrib(tdElm, 'id'); + var lang = ed.dom.getAttrib(tdElm, 'lang'); + var dir = ed.dom.getAttrib(tdElm, 'dir'); + var scope = ed.dom.getAttrib(tdElm, 'scope'); + + // Setup form + addClassesToList('class', 'table_cell_styles'); + TinyMCE_EditableSelects.init(); + + if (!ed.dom.hasClass(tdElm, 'mceSelected')) { + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.backgroundimage.value = backgroundimage; + formObj.width.value = width; + formObj.height.value = height; + formObj.id.value = id; + formObj.lang.value = lang; + formObj.style.value = ed.dom.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className, true, true); + selectByValue(formObj, 'celltype', celltype); + selectByValue(formObj, 'dir', dir); + selectByValue(formObj, 'scope', scope); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + } else + tinyMCEPopup.dom.hide('action'); +} + +function updateAction() { + var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0]; + + tinyMCEPopup.restoreSelection(); + el = ed.selection.getStart(); + tdElm = ed.dom.getParent(el, "td,th"); + trElm = ed.dom.getParent(el, "tr"); + tableElm = ed.dom.getParent(el, "table"); + + // Cell is selected + if (ed.dom.hasClass(tdElm, 'mceSelected')) { + // Update all selected sells + tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) { + updateCell(td); + }); + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + return; + } + + switch (getSelectValue(formObj, 'action')) { + case "cell": + var celltype = getSelectValue(formObj, 'celltype'); + var scope = getSelectValue(formObj, 'scope'); + + function doUpdate(s) { + if (s) { + updateCell(tdElm); + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + } + }; + + if (ed.getParam("accessibility_warnings", 1)) { + if (celltype == "th" && scope == "") + tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate); + else + doUpdate(1); + + return; + } + + updateCell(tdElm); + break; + + case "row": + var cell = trElm.firstChild; + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + cell = updateCell(cell, true); + } while ((cell = nextCell(cell)) != null); + + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i<rows.length; i++) { + var cell = rows[i].firstChild; + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + cell = updateCell(cell, true); + } while ((cell = nextCell(cell)) != null); + } + + break; + } + + ed.addVisual(); + ed.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); +} + +function nextCell(elm) { + while ((elm = elm.nextSibling) != null) { + if (elm.nodeName == "TD" || elm.nodeName == "TH") + return elm; + } + + return null; +} + +function updateCell(td, skip_id) { + var inst = ed; + var formObj = document.forms[0]; + var curCellType = td.nodeName.toLowerCase(); + var celltype = getSelectValue(formObj, 'celltype'); + var doc = inst.getDoc(); + var dom = ed.dom; + + if (!skip_id) + dom.setAttrib(td, 'id', formObj.id.value); + + dom.setAttrib(td, 'align', formObj.align.value); + dom.setAttrib(td, 'vAlign', formObj.valign.value); + dom.setAttrib(td, 'lang', formObj.lang.value); + dom.setAttrib(td, 'dir', getSelectValue(formObj, 'dir')); + dom.setAttrib(td, 'style', ed.dom.serializeStyle(ed.dom.parseStyle(formObj.style.value))); + dom.setAttrib(td, 'scope', formObj.scope.value); + dom.setAttrib(td, 'class', getSelectValue(formObj, 'class')); + + // Clear deprecated attributes + ed.dom.setAttrib(td, 'width', ''); + ed.dom.setAttrib(td, 'height', ''); + ed.dom.setAttrib(td, 'bgColor', ''); + ed.dom.setAttrib(td, 'borderColor', ''); + ed.dom.setAttrib(td, 'background', ''); + + // Set styles + td.style.width = getCSSSize(formObj.width.value); + td.style.height = getCSSSize(formObj.height.value); + if (formObj.bordercolor.value != "") { + td.style.borderColor = formObj.bordercolor.value; + td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle; + td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth; + } else + td.style.borderColor = ''; + + td.style.backgroundColor = formObj.bgcolor.value; + + if (formObj.backgroundimage.value != "") + td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')"; + else + td.style.backgroundImage = ''; + + if (curCellType != celltype) { + // changing to a different node type + var newCell = doc.createElement(celltype); + + for (var c=0; c<td.childNodes.length; c++) + newCell.appendChild(td.childNodes[c].cloneNode(1)); + + for (var a=0; a<td.attributes.length; a++) + ed.dom.setAttrib(newCell, td.attributes[a].name, ed.dom.getAttrib(td, td.attributes[a].name)); + + td.parentNode.replaceChild(newCell, td); + td = newCell; + } + + dom.setAttrib(td, 'style', dom.serializeStyle(dom.parseStyle(td.style.cssText))); + + return td; +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = ed.dom.serializeStyle(st); +} + +function changedSize() { + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(formObj.style.value); + + var width = formObj.width.value; + if (width != "") + st['width'] = getCSSSize(width); + else + st['width'] = ""; + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = ed.dom.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + st['border-color'] = formObj.bordercolor.value; + + formObj.style.value = ed.dom.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = ed.dom.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['width']) + formObj.width.value = trimSize(st['width']); + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } + + if (st['border-color']) { + formObj.bordercolor.value = st['border-color']; + updateColor('bordercolor_pick','bordercolor'); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/table/js/merge_cells.js b/js/tiny_mce/plugins/table/js/merge_cells.js new file mode 100644 index 000000000..fc2a0481e --- /dev/null +++ b/js/tiny_mce/plugins/table/js/merge_cells.js @@ -0,0 +1,27 @@ +tinyMCEPopup.requireLangPack(); + +var MergeCellsDialog = { + init : function() { + var f = document.forms[0]; + + f.numcols.value = tinyMCEPopup.getWindowArg('cols', 1); + f.numrows.value = tinyMCEPopup.getWindowArg('rows', 1); + }, + + merge : function() { + var func, f = document.forms[0]; + + tinyMCEPopup.restoreSelection(); + + func = tinyMCEPopup.getWindowArg('onaction'); + + func({ + cols : f.numcols.value, + rows : f.numrows.value + }); + + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(MergeCellsDialog.init, MergeCellsDialog); diff --git a/js/tiny_mce/plugins/table/js/row.js b/js/tiny_mce/plugins/table/js/row.js new file mode 100644 index 000000000..2c8d0fbde --- /dev/null +++ b/js/tiny_mce/plugins/table/js/row.js @@ -0,0 +1,232 @@ +tinyMCEPopup.requireLangPack(); + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + var trElm = dom.getParent(inst.selection.getStart(), "tr"); + var formObj = document.forms[0]; + var st = dom.parseStyle(dom.getAttrib(trElm, "style")); + + // Get table row data + var rowtype = trElm.parentNode.nodeName.toLowerCase(); + var align = dom.getAttrib(trElm, 'align'); + var valign = dom.getAttrib(trElm, 'valign'); + var height = trimSize(getStyle(trElm, 'height', 'height')); + var className = dom.getAttrib(trElm, 'class'); + var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor')); + var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + var id = dom.getAttrib(trElm, 'id'); + var lang = dom.getAttrib(trElm, 'lang'); + var dir = dom.getAttrib(trElm, 'dir'); + + selectByValue(formObj, 'rowtype', rowtype); + + // Any cells selected + if (dom.select('td.mceSelected,th.mceSelected', trElm).length == 0) { + // Setup form + addClassesToList('class', 'table_row_styles'); + TinyMCE_EditableSelects.init(); + + formObj.bgcolor.value = bgcolor; + formObj.backgroundimage.value = backgroundimage; + formObj.height.value = height; + formObj.id.value = id; + formObj.lang.value = lang; + formObj.style.value = dom.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className, true, true); + selectByValue(formObj, 'dir', dir); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + updateColor('bgcolor_pick', 'bgcolor'); + } else + tinyMCEPopup.dom.hide('action'); +} + +function updateAction() { + var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0]; + var action = getSelectValue(formObj, 'action'); + + tinyMCEPopup.restoreSelection(); + trElm = dom.getParent(inst.selection.getStart(), "tr"); + tableElm = dom.getParent(inst.selection.getStart(), "table"); + + // Update all selected rows + if (dom.select('td.mceSelected,th.mceSelected', trElm).length > 0) { + tinymce.each(tableElm.rows, function(tr) { + var i; + + for (i = 0; i < tr.cells.length; i++) { + if (dom.hasClass(tr.cells[i], 'mceSelected')) { + updateRow(tr, true); + return; + } + } + }); + + inst.addVisual(); + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); + return; + } + + switch (action) { + case "row": + updateRow(trElm); + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i<rows.length; i++) + updateRow(rows[i], true); + + break; + + case "odd": + case "even": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i<rows.length; i++) { + if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even")) + updateRow(rows[i], true, true); + } + + break; + } + + inst.addVisual(); + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); +} + +function updateRow(tr_elm, skip_id, skip_parent) { + var inst = tinyMCEPopup.editor; + var formObj = document.forms[0]; + var dom = inst.dom; + var curRowType = tr_elm.parentNode.nodeName.toLowerCase(); + var rowtype = getSelectValue(formObj, 'rowtype'); + var doc = inst.getDoc(); + + // Update row element + if (!skip_id) + dom.setAttrib(tr_elm, 'id', formObj.id.value); + + dom.setAttrib(tr_elm, 'align', getSelectValue(formObj, 'align')); + dom.setAttrib(tr_elm, 'vAlign', getSelectValue(formObj, 'valign')); + dom.setAttrib(tr_elm, 'lang', formObj.lang.value); + dom.setAttrib(tr_elm, 'dir', getSelectValue(formObj, 'dir')); + dom.setAttrib(tr_elm, 'style', dom.serializeStyle(dom.parseStyle(formObj.style.value))); + dom.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class')); + + // Clear deprecated attributes + dom.setAttrib(tr_elm, 'background', ''); + dom.setAttrib(tr_elm, 'bgColor', ''); + dom.setAttrib(tr_elm, 'height', ''); + + // Set styles + tr_elm.style.height = getCSSSize(formObj.height.value); + tr_elm.style.backgroundColor = formObj.bgcolor.value; + + if (formObj.backgroundimage.value != "") + tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')"; + else + tr_elm.style.backgroundImage = ''; + + // Setup new rowtype + if (curRowType != rowtype && !skip_parent) { + // first, clone the node we are working on + var newRow = tr_elm.cloneNode(1); + + // next, find the parent of its new destination (creating it if necessary) + var theTable = dom.getParent(tr_elm, "table"); + var dest = rowtype; + var newParent = null; + for (var i = 0; i < theTable.childNodes.length; i++) { + if (theTable.childNodes[i].nodeName.toLowerCase() == dest) + newParent = theTable.childNodes[i]; + } + + if (newParent == null) { + newParent = doc.createElement(dest); + + if (theTable.firstChild.nodeName == 'CAPTION') + inst.dom.insertAfter(newParent, theTable.firstChild); + else + theTable.insertBefore(newParent, theTable.firstChild); + } + + // append the row to the new parent + newParent.appendChild(newRow); + + // remove the original + tr_elm.parentNode.removeChild(tr_elm); + + // set tr_elm to the new node + tr_elm = newRow; + } + + dom.setAttrib(tr_elm, 'style', dom.serializeStyle(dom.parseStyle(tr_elm.style.cssText))); +} + +function changedBackgroundImage() { + var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; + var st = dom.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; + var st = dom.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } +} + +function changedSize() { + var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; + var st = dom.parseStyle(formObj.style.value); + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; + var st = dom.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + + formObj.style.value = dom.serializeStyle(st); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/table/js/table.js b/js/tiny_mce/plugins/table/js/table.js new file mode 100644 index 000000000..77e9044fa --- /dev/null +++ b/js/tiny_mce/plugins/table/js/table.js @@ -0,0 +1,450 @@ +tinyMCEPopup.requireLangPack(); + +var action, orgTableWidth, orgTableHeight, dom = tinyMCEPopup.editor.dom; + +function insertTable() { + var formObj = document.forms[0]; + var inst = tinyMCEPopup.editor, dom = inst.dom; + var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption, frame, rules; + var html = '', capEl, elm; + var cellLimit, rowLimit, colLimit; + + tinyMCEPopup.restoreSelection(); + + if (!AutoValidator.validate(formObj)) { + tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); + return false; + } + + elm = dom.getParent(inst.selection.getNode(), 'table'); + + // Get form data + cols = formObj.elements['cols'].value; + rows = formObj.elements['rows'].value; + border = formObj.elements['border'].value != "" ? formObj.elements['border'].value : 0; + cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : ""; + cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : ""; + align = getSelectValue(formObj, "align"); + frame = getSelectValue(formObj, "tframe"); + rules = getSelectValue(formObj, "rules"); + width = formObj.elements['width'].value; + height = formObj.elements['height'].value; + bordercolor = formObj.elements['bordercolor'].value; + bgcolor = formObj.elements['bgcolor'].value; + className = getSelectValue(formObj, "class"); + id = formObj.elements['id'].value; + summary = formObj.elements['summary'].value; + style = formObj.elements['style'].value; + dir = formObj.elements['dir'].value; + lang = formObj.elements['lang'].value; + background = formObj.elements['backgroundimage'].value; + caption = formObj.elements['caption'].checked; + + cellLimit = tinyMCEPopup.getParam('table_cell_limit', false); + rowLimit = tinyMCEPopup.getParam('table_row_limit', false); + colLimit = tinyMCEPopup.getParam('table_col_limit', false); + + // Validate table size + if (colLimit && cols > colLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); + return false; + } else if (rowLimit && rows > rowLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); + return false; + } else if (cellLimit && cols * rows > cellLimit) { + tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); + return false; + } + + // Update table + if (action == "update") { + dom.setAttrib(elm, 'cellPadding', cellpadding, true); + dom.setAttrib(elm, 'cellSpacing', cellspacing, true); + dom.setAttrib(elm, 'border', border); + dom.setAttrib(elm, 'align', align); + dom.setAttrib(elm, 'frame', frame); + dom.setAttrib(elm, 'rules', rules); + dom.setAttrib(elm, 'class', className); + dom.setAttrib(elm, 'style', style); + dom.setAttrib(elm, 'id', id); + dom.setAttrib(elm, 'summary', summary); + dom.setAttrib(elm, 'dir', dir); + dom.setAttrib(elm, 'lang', lang); + + capEl = inst.dom.select('caption', elm)[0]; + + if (capEl && !caption) + capEl.parentNode.removeChild(capEl); + + if (!capEl && caption) { + capEl = elm.ownerDocument.createElement('caption'); + + if (!tinymce.isIE) + capEl.innerHTML = '<br data-mce-bogus="1"/>'; + + elm.insertBefore(capEl, elm.firstChild); + } + + if (width && inst.settings.inline_styles) { + dom.setStyle(elm, 'width', width); + dom.setAttrib(elm, 'width', ''); + } else { + dom.setAttrib(elm, 'width', width, true); + dom.setStyle(elm, 'width', ''); + } + + // Remove these since they are not valid XHTML + dom.setAttrib(elm, 'borderColor', ''); + dom.setAttrib(elm, 'bgColor', ''); + dom.setAttrib(elm, 'background', ''); + + if (height && inst.settings.inline_styles) { + dom.setStyle(elm, 'height', height); + dom.setAttrib(elm, 'height', ''); + } else { + dom.setAttrib(elm, 'height', height, true); + dom.setStyle(elm, 'height', ''); + } + + if (background != '') + elm.style.backgroundImage = "url('" + background + "')"; + else + elm.style.backgroundImage = ''; + +/* if (tinyMCEPopup.getParam("inline_styles")) { + if (width != '') + elm.style.width = getCSSSize(width); + }*/ + + if (bordercolor != "") { + elm.style.borderColor = bordercolor; + elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; + elm.style.borderWidth = border == "" ? "1px" : border; + } else + elm.style.borderColor = ''; + + elm.style.backgroundColor = bgcolor; + elm.style.height = getCSSSize(height); + + inst.addVisual(); + + // Fix for stange MSIE align bug + //elm.outerHTML = elm.outerHTML; + + inst.nodeChanged(); + inst.execCommand('mceEndUndoLevel'); + + // Repaint if dimensions changed + if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) + inst.execCommand('mceRepaint'); + + tinyMCEPopup.close(); + return true; + } + + // Create new table + html += '<table'; + + html += makeAttrib('id', id); + html += makeAttrib('border', border); + html += makeAttrib('cellpadding', cellpadding); + html += makeAttrib('cellspacing', cellspacing); + html += makeAttrib('data-mce-new', '1'); + + if (width && inst.settings.inline_styles) { + if (style) + style += '; '; + + // Force px + if (/^[0-9\.]+$/.test(width)) + width += 'px'; + + style += 'width: ' + width; + } else + html += makeAttrib('width', width); + +/* if (height) { + if (style) + style += '; '; + + style += 'height: ' + height; + }*/ + + //html += makeAttrib('height', height); + //html += makeAttrib('bordercolor', bordercolor); + //html += makeAttrib('bgcolor', bgcolor); + html += makeAttrib('align', align); + html += makeAttrib('frame', frame); + html += makeAttrib('rules', rules); + html += makeAttrib('class', className); + html += makeAttrib('style', style); + html += makeAttrib('summary', summary); + html += makeAttrib('dir', dir); + html += makeAttrib('lang', lang); + html += '>'; + + if (caption) { + if (!tinymce.isIE) + html += '<caption><br data-mce-bogus="1"/></caption>'; + else + html += '<caption></caption>'; + } + + for (var y=0; y<rows; y++) { + html += "<tr>"; + + for (var x=0; x<cols; x++) { + if (!tinymce.isIE) + html += '<td><br data-mce-bogus="1"/></td>'; + else + html += '<td></td>'; + } + + html += "</tr>"; + } + + html += "</table>"; + + // Move table + if (inst.settings.fix_table_elements) { + var patt = ''; + + inst.focus(); + inst.selection.setContent('<br class="_mce_marker" />'); + + tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { + if (patt) + patt += ','; + + patt += n + ' ._mce_marker'; + }); + + tinymce.each(inst.dom.select(patt), function(n) { + inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); + }); + + dom.setOuterHTML(dom.select('br._mce_marker')[0], html); + } else + inst.execCommand('mceInsertContent', false, html); + + tinymce.each(dom.select('table[data-mce-new]'), function(node) { + var td = dom.select('td', node); + + try { + // IE9 might fail to do this selection + inst.selection.select(td[0], true); + inst.selection.collapse(); + } catch (ex) { + // Ignore + } + + dom.setAttrib(node, 'data-mce-new', ''); + }); + + inst.addVisual(); + inst.execCommand('mceEndUndoLevel'); + + tinyMCEPopup.close(); +} + +function makeAttrib(attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value == "") + return ""; + + // XML encode it + value = value.replace(/&/g, '&amp;'); + value = value.replace(/\"/g, '&quot;'); + value = value.replace(/</g, '&lt;'); + value = value.replace(/>/g, '&gt;'); + + return ' ' + attrib + '="' + value + '"'; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); + var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; + var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = ""; + var inst = tinyMCEPopup.editor, dom = inst.dom; + var formObj = document.forms[0]; + var elm = dom.getParent(inst.selection.getNode(), "table"); + + action = tinyMCEPopup.getWindowArg('action'); + + if (!action) + action = elm ? "update" : "insert"; + + if (elm && action != "insert") { + var rowsAr = elm.rows; + var cols = 0; + for (var i=0; i<rowsAr.length; i++) + if (rowsAr[i].cells.length > cols) + cols = rowsAr[i].cells.length; + + cols = cols; + rows = rowsAr.length; + + st = dom.parseStyle(dom.getAttrib(elm, "style")); + border = trimSize(getStyle(elm, 'border', 'borderWidth')); + cellpadding = dom.getAttrib(elm, 'cellpadding', ""); + cellspacing = dom.getAttrib(elm, 'cellspacing', ""); + width = trimSize(getStyle(elm, 'width', 'width')); + height = trimSize(getStyle(elm, 'height', 'height')); + bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); + bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); + align = dom.getAttrib(elm, 'align', align); + frame = dom.getAttrib(elm, 'frame'); + rules = dom.getAttrib(elm, 'rules'); + className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); + id = dom.getAttrib(elm, 'id'); + summary = dom.getAttrib(elm, 'summary'); + style = dom.serializeStyle(st); + dir = dom.getAttrib(elm, 'dir'); + lang = dom.getAttrib(elm, 'lang'); + background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; + + orgTableWidth = width; + orgTableHeight = height; + + action = "update"; + formObj.insert.value = inst.getLang('update'); + } + + addClassesToList('class', "table_styles"); + TinyMCE_EditableSelects.init(); + + // Update form + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'tframe', frame); + selectByValue(formObj, 'rules', rules); + selectByValue(formObj, 'class', className, true, true); + formObj.cols.value = cols; + formObj.rows.value = rows; + formObj.border.value = border; + formObj.cellpadding.value = cellpadding; + formObj.cellspacing.value = cellspacing; + formObj.width.value = width; + formObj.height.value = height; + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.id.value = id; + formObj.summary.value = summary; + formObj.style.value = style; + formObj.dir.value = dir; + formObj.lang.value = lang; + formObj.backgroundimage.value = background; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + // Disable some fields in update mode + if (action == "update") { + formObj.cols.disabled = true; + formObj.rows.disabled = true; + } +} + +function changedSize() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + +/* var width = formObj.width.value; + if (width != "") + st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : ""; + else + st['width'] = "";*/ + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedBorder() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + // Update border width if the element has a color + if (formObj.border.value != "" && formObj.bordercolor.value != "") + st['border-width'] = formObj.border.value + "px"; + + formObj.style.value = dom.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + + if (formObj.bordercolor.value != "") { + st['border-color'] = formObj.bordercolor.value; + + // Add border-width if it's missing + if (!st['border-width']) + st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; + } + + formObj.style.value = dom.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = dom.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['width']) + formObj.width.value = trimSize(st['width']); + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } + + if (st['border-color']) { + formObj.bordercolor.value = st['border-color']; + updateColor('bordercolor_pick','bordercolor'); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/table/langs/ar_dlg.js b/js/tiny_mce/plugins/table/langs/ar_dlg.js new file mode 100755 index 000000000..4870568cc --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.table_dlg',{rules_border:"\u0627\u0644\u062d\u062f\u0648\u062f",rules_box:"\u0635\u0646\u062f\u0648\u0642",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"\u0623\u062f\u0646\u0627\u0647",rules_above:"\u0623\u0639\u0644\u0649",rules_void:"\u0623\u0644\u063a\u0649",rules:"\u0642\u0648\u0627\u0639\u062f",frame_all:"\u0643\u0627\u0641\u0629",frame_cols:"\u0623\u0639\u0645\u062f\u0629",frame_rows:"\u0627\u0644\u0635\u0641\u0648\u0641",frame_groups:"\u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0627\u062a",frame_none:"\u0644\u0627 \u0634\u064a\u0621",frame:"\u0627\u0644\u0625\u0637\u0627\u0631",caption:"\u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u062a\u0648\u0636\u064a\u062d\u064a\u0629",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"\u0644\u0642\u062f \u062a\u062c\u0627\u0648\u0632\u062a \u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062f\u062f \u0645\u0646 \u0627\u0644\u062e\u0644\u0627\u064a\u0627 {$cells}.",row_limit:"\u0644\u0642\u062f \u062a\u062c\u0627\u0648\u0632\u062a \u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062f\u062f \u0627\u0644\u0635\u0641\u0648\u0641 {$rows}.",col_limit:"\u0644\u0642\u062f \u062a\u062c\u0627\u0648\u0632\u062a \u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062f\u062f \u0623\u0639\u0645\u062f\u0629 {$cols}.",colgroup:"\u0645\u062c\u0645\u0648\u0639\u0629 \u0623\u0639\u0645\u062f\u0629 ",rowgroup:" \u0645\u062c\u0645\u0648\u0639\u0629 \u0635\u0641",scope:"\u0646\u0637\u0627\u0642",tfoot:"\u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u0642\u062f\u0645",tbody:" \u0627\u0644\u062c\u062f\u0648\u0644 \u062c\u0633\u062f",thead:"\u0627\u0644\u062c\u062f\u0648\u0644 \u0631\u0626\u064a\u0633",row_all:"\u062a\u062d\u062f\u064a\u062b \u0643\u0627\u0641\u0629 \u0627\u0644\u0635\u0641\u0648\u0641 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644",row_even:" \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0635\u0641\u0648\u0641 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644 \u0632\u0648\u062c\u0649 \u0639\u062f\u062f",row_odd:"\u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0635\u0641\u0648\u0641 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644 \u0645\u0641\u0631\u062f",row_row:"\u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0635\u0641 \u0627\u0644\u062d\u0627\u0644\u064a",cell_all:"\u062d\u062f\u064a\u062b \u0643\u0627\u0641\u0629 \u0627\u0644\u062e\u0644\u0627\u064a\u0627 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644",cell_row:"\u062a\u062d\u062f\u064a\u062b \u0643\u0627\u0641\u0629 \u0627\u0644\u062e\u0644\u0627\u064a\u0627 \u0641\u064a \u0627\u0644\u0635\u0641",cell_cell:"\u062a\u062d\u062f\u064a\u062b \u0627\u0644\u062e\u0644\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629",th:"\u0631\u0623\u0633",td:"\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a",summary:"\u0645\u0644\u062e\u0635",bgimage:"\u0635\u0648\u0631\u0629 \u0627\u0644\u062e\u0644\u0641\u064a\u0629",rtl:"\u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0625\u0644\u0649 \u0627\u0644\u064a\u0633\u0627\u0631",ltr:"\u0645\u0646 \u0627\u0644\u064a\u0633\u0627\u0631 \u0625\u0644\u0649 \u0627\u0644\u064a\u0645\u064a\u0646",mime:"\u0627\u0644\u0647\u062f\u0641 \u0646\u0648\u0639 \u0627\u0644\u0645\u0644\u0641",langcode:"\u0631\u0645\u0632 \u0627\u0644\u0644\u063a\u0629",langdir:"\u0627\u062a\u062c\u0627\u0647 \u0644\u063a\u0629",style:"\u0634\u0643\u0644",id:"Id",merge_cells_title:"\u062f\u0645\u062c \u0627\u0644\u062e\u0644\u0627\u064a\u0627",bgcolor:"\u0644\u0648\u0646 \u0627\u0644\u062e\u0644\u0641\u064a\u0629",bordercolor:"\u0644\u0648\u0646 \u0627\u0644\u062d\u062f\u0648\u062f",align_bottom:"\u0627\u0633\u0641\u0644",align_top:"\u0627\u0644\u0627\u0639\u0644\u0649",valign:"\u0627\u0644\u0645\u062d\u0627\u0630\u0627\u0629 \u0627\u0644\u0639\u0645\u0648\u062f\u064a\u0629",cell_type:"\u0646\u0648\u0639 \u0627\u0644\u062e\u0644\u064a\u0629",cell_title:"\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u062e\u0644\u064a\u0629",row_title:"\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u0635\u0641",align_middle:"\u0648\u0633\u0637",align_right:"\u064a\u0645\u064a\u0646",align_left:"\u064a\u0633\u0627\u0631",align_default:"\u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a",align:"\u0627\u0644\u0645\u062d\u0627\u0630\u0627\u0629",border:"\u0627\u0644\u062d\u062f\u0648\u062f",cellpadding:"\u0628\u0637\u0627\u0646\u0629 \u0627\u0644\u062e\u0644\u0627\u064a\u0627",cellspacing:"\u0628\u062a\u0628\u0627\u0639\u062f \u0627\u0644\u062e\u0644\u0627\u064a\u0627 ",rows:"\u0627\u0644\u0635\u0641\u0648\u0641",cols:"\u0623\u0639\u0645\u062f\u0629",height:"\u0637\u0648\u0644",width:"\u0639\u0631\u0636",title:"\u0625\u062f\u0631\u0627\u062c \u062c\u062f\u0648\u0644 / \u062a\u0639\u062f\u064a\u0644",rowtype:"\u0635\u0641 \u0641\u064a \u062c\u0632\u0621 \u0627\u0644\u062c\u062f\u0648\u0644",advanced_props:"\u0627\u0644\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0639\u0627\u0645\u0629",general_props:"General properties",advanced_tab:"\u0645\u062a\u0642\u062f\u0645",general_tab:"\u0639\u0627\u0645"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/az_dlg.js b/js/tiny_mce/plugins/table/langs/az_dlg.js new file mode 100755 index 000000000..ba254dc96 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.table_dlg',{rules_border:"s\u0259rh\u0259d",rules_box:"konteyner",rules_vsides:"\u015faquli t\u0259r\u0259fl\u0259r",rules_rhs:"sa\u011f \u00fcf\u00fcqi t\u0259r\u0259fl\u0259r",rules_lhs:"sol \u00fcf\u00fcqi t\u0259r\u0259fl\u0259r",rules_hsides:"\u00fcf\u00fcqi t\u0259r\u0259fl\u0259r",rules_below:"a\u015fa\u011f\u0131dan",rules_above:"yuxar\u0131dan",rules_void:"he\u00e7 n\u0259",rules:"X\u0259ttl\u0259r",frame_all:"ham\u0131s\u0131",frame_cols:"s\u00fctunlar",frame_rows:"s\u0259trl\u0259r",frame_groups:"qruplar",frame_none:"he\u00e7n\u0259",frame:"\u00c7\u0259r\u00e7iv\u0259",caption:"C\u0259dv\u0259l ba\u015fl\u0131\u011f\u0131",missing_scope:"\u018fminsiniz ki, ba\u015fl\u0131q \u00f6z\u0259yinin h\u0259ddini g\u00f6st\u0259rm\u0259d\u0259n davam etm\u0259k ist\u0259yirsiniz? Bunsuz b\u0259zi i\u015f qabiliyy\u0259ti a\u015fa\u011f\u0131 olan istifad\u0259\u00e7il\u0259r\u0259 c\u0259dv\u0259lin m\u0259lumatlar\u0131 v\u0259 t\u0259rkibini anlamaq \u00e7\u0259tin olacaq.",cell_limit:"Siz \u00f6z\u0259kl\u0259rd\u0259 {$cells} maksimum say\u0131 a\u015fd\u0131n\u0131z.",row_limit:"Siz s\u0259trl\u0259rd\u0259 {$rows} maksimum say\u0131 a\u015fd\u0131n\u0131z.",col_limit:"Siz s\u00fctunlarda {$cols} maksimum say\u0131 a\u015fd\u0131n\u0131z.",colgroup:"S\u00fctun qrupu",rowgroup:"S\u0259tr qrupu",scope:"H\u0259dd",tfoot:"C\u0259dv\u0259lin a\u015fa\u011f\u0131 hiss\u0259si",tbody:"C\u0259dv\u0259lin \u0259sas hiss\u0259si",thead:"C\u0259dv\u0259lin yuxar\u0131 hiss\u0259si",row_all:"C\u0259dv\u0259ld\u0259ki b\u00fct\u00fcn s\u0259trl\u0259ri yenil\u0259",row_even:"C\u0259dv\u0259ld\u0259ki c\u00fct (\u0259d\u0259d) s\u0259trl\u0259ri yenil\u0259",row_odd:"C\u0259d\u0259ld\u0259ki t\u0259k (\u0259d\u0259d) s\u0259trl\u0259ri yenil\u0259",row_row:"Haz\u0131rki s\u0259tri yenil\u0259",cell_all:"C\u0259dv\u0259ld\u0259ki b\u00fct\u00fcn \u00f6z\u0259kl\u0259ri yenil\u0259",cell_row:"S\u0259trd\u0259ki b\u00fct\u00fcn \u00f6z\u0259kl\u0259ri yenil\u0259",cell_cell:"Haz\u0131rki \u00f6z\u0259yi yenil\u0259",th:"Ba\u015fl\u0131q",td:"Veril\u0259nl\u0259r",summary:"X\u00fclas\u0259",bgimage:"Fon \u015f\u0259kli",rtl:"Sa\u011fda-sola",ltr:"Solda-sa\u011fa",mime:"H\u0259d\u0259fli MIME-n\u00f6v",langcode:"Dil kodu",langdir:"Dil istiqam\u0259ti",style:"Stil",id:"\u0130dentifikator",merge_cells_title:"\u00d6z\u0259k stili",bgcolor:"Fon r\u0259ngi",bordercolor:"S\u0259rh\u0259d r\u0259ngi",align_bottom:"A\u015fa\u011f\u0131 il\u0259",align_top:"Yuxar\u0131 il\u0259",valign:"\u015eaquli tarazla\u015fma",cell_type:"\u00d6z\u0259k n\u00f6v\u00fc",cell_title:"\u00d6z\u0259k x\u00fcsusiyy\u0259ti",row_title:"S\u0259tr x\u00fcsusiyy\u0259ti",align_middle:"M\u0259rk\u0259z il\u0259",align_right:"Sa\u011fa",align_left:"Sola",align_default:"Default",align:"Tarazla\u015fd\u0131rma",border:"S\u0259rh\u0259d",cellpadding:"\u00d6z\u0259kl\u0259rd\u0259 doldurma",cellspacing:"\u00d6z\u0259kl\u0259r aras\u0131ndak\u0131 m\u0259saf\u0259",rows:"S\u0259trl\u0259r",cols:"S\u00fctunlar",height:"H\u00fcnd\u00fcrl\u00fcy\u00fc",width:"Eni",title:"C\u0259dv\u0259li \u0259lav\u0259 et/d\u0259yi\u015fdir",rowtype:"C\u0259dv\u0259l hiss\u0259sind\u0259ki s\u0259tr",advanced_props:"\u018flav\u0259 x\u00fcsusiyy\u0259tl\u0259r",general_props:"\u00dcmumi x\u00fcsusiyy\u0259tl\u0259r",advanced_tab:"\u018flav\u0259l\u0259r",general_tab:"\u00dcmumi"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/be_dlg.js b/js/tiny_mce/plugins/table/langs/be_dlg.js new file mode 100755 index 000000000..ee49c0d1e --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.table_dlg',{rules_border:"\u043c\u044f\u0436\u0430",rules_box:"\u043a\u0430\u043d\u0442\u044d\u0439\u043d\u0435\u0440",rules_vsides:"\u0432\u0435\u0440\u0442\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u044f \u0431\u0430\u043a\u0456",rules_rhs:"\u043f\u0440\u0430\u0432\u044b\u044f \u0433\u0430\u0440\u044b\u0437\u0430\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u044f \u0431\u0430\u043a\u0456",rules_lhs:"\u043b\u0435\u0432\u044b\u044f \u0433\u0430\u0440\u044b\u0437\u0430\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u044f \u0431\u0430\u043a\u0456",rules_hsides:"\u0433\u0430\u0440\u044b\u0437\u0430\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u044f \u0431\u0430\u043a\u0456",rules_below:"\u0437\u043d\u0456\u0437\u0443",rules_above:"\u0437\u0432\u0435\u0440\u0445\u0443",rules_void:"\u043d\u0456\u0448\u0442\u043e",rules:"\u041b\u0456\u043d\u0435\u0439\u043a\u0456",frame_all:"\u0443\u0441\u0451",frame_cols:"\u0441\u043b\u0443\u043f\u043a\u0456",frame_rows:"\u0440\u0430\u0434\u043a\u0456",frame_groups:"\u0433\u0440\u0443\u043f\u044b",frame_none:"\u043d\u0456\u0447\u043e\u0433\u0430",frame:"\u0420\u0430\u043c\u043a\u0430",caption:"\u0417\u0430\u0433\u0430\u043b\u043e\u0432\u0430\u043a \u0442\u0430\u0431\u043b\u0456\u0446\u044b",missing_scope:"\u0412\u044b \u0441\u0430\u043f\u0440\u0430\u045e\u0434\u044b \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u043f\u0440\u0430\u0446\u044f\u0433\u043d\u0443\u0446\u044c \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044f \u043c\u0435\u0436 \u0433\u044d\u0442\u0430\u0433\u0430 \u0432\u043e\u0447\u043a\u0430 \u0437\u0430\u0433\u0430\u043b\u043e\u045e\u043a\u0430? \u0411\u0435\u0437 \u0433\u044d\u0442\u0430\u0433\u0430 \u043d\u0435\u043a\u0430\u0442\u043e\u0440\u044b\u043c \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u0447\u0430\u043c \u0437 \u0430\u0431\u043c\u0435\u0436\u0430\u0432\u0430\u043d\u0430\u0439 \u043f\u0440\u0430\u0446\u0430\u0437\u0434\u043e\u043b\u044c\u043d\u0430\u0441\u0446\u044e \u043c\u043e\u0436\u0430 \u0431\u044b\u0446\u044c \u0446\u044f\u0436\u043a\u0430 \u0437\u0440\u0430\u0437\u0443\u043c\u0435\u0446\u044c \u0443\u0442\u0440\u044b\u043c\u0430\u043d\u043d\u0435 \u0430\u0431\u043e \u0434\u0430\u0434\u0437\u0435\u043d\u044b\u044f \u0442\u0430\u0431\u043b\u0456\u0446\u044b.",cell_limit:"\u0412\u044b \u043f\u0435\u0440\u0430\u0432\u044b\u0441\u0456\u043b\u0456 \u043c\u0430\u043a\u0441\u0456\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043b\u044c\u043a\u0430\u0441\u0446\u044c \u0443 {$cells} \u0432\u043e\u0447\u0430\u043a.",row_limit:"\u0412\u044b \u043f\u0435\u0440\u0430\u0432\u044b\u0441\u0456\u043b\u0456 \u043c\u0430\u043a\u0441\u0456\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043b\u044c\u043a\u0430\u0441\u0446\u044c \u0443 {$rows} \u0440\u0430\u0434\u043a\u043e\u045e.",col_limit:"\u0412\u044b \u043f\u0435\u0440\u0430\u0432\u044b\u0441\u0456\u043b\u0456 \u043c\u0430\u043a\u0441\u0456\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043b\u044c\u043a\u0430\u0441\u0446\u044c \u0443 {$cols} \u0441\u043b\u0443\u043f\u043a\u043e\u045e.",colgroup:"\u0413\u0440\u0443\u043f\u0430 \u0441\u043b\u0443\u043f\u043a\u043e\u045e",rowgroup:"\u0413\u0440\u0443\u043f\u0430 \u0440\u0430\u0434\u043a\u043e\u045e",scope:"\u041c\u0435\u0436\u044b",tfoot:"\u041d\u0456\u0436\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u043a\u0430 \u0442\u0430\u0431\u043b\u0456\u0446\u044b",tbody:"\u0410\u0441\u043d\u043e\u045e\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043a\u0430 \u0442\u0430\u0431\u043b\u0456\u0446\u044b",thead:"\u0412\u0435\u0440\u0445\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u043a\u0430 \u0442\u0430\u0431\u043b\u0456\u0446\u044b",row_all:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u0443\u0441\u0435 \u0440\u0430\u0434\u043a\u0456 \u045e \u0442\u0430\u0431\u043b\u0456\u0446\u044b",row_even:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u0446\u043e\u0442\u043d\u044b\u044f \u0440\u0430\u0434\u043a\u0456 \u045e \u0442\u0430\u0431\u043b\u0456\u0446\u044b",row_odd:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u043d\u044f\u0446\u043e\u0442\u043d\u044b\u044f \u0440\u0430\u0434\u043a\u0456 \u045e \u0442\u0430\u0431\u043b\u0456\u0446\u044b",row_row:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u0431\u044f\u0433\u0443\u0447\u044b \u0440\u0430\u0434\u043e\u043a",cell_all:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u0443\u0441\u0435 \u0432\u043e\u0447\u043a\u0456 \u045e \u0442\u0430\u0431\u043b\u0456\u0446\u044b",cell_row:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u0443\u0441\u0435 \u0432\u043e\u0447\u043a\u0456 \u045e \u0440\u0430\u0434\u043a\u0443",cell_cell:"\u0410\u0431\u043d\u0430\u0432\u0456\u0446\u044c \u0431\u044f\u0433\u0443\u0447\u0430\u0435 \u0432\u043e\u0447\u043a\u0430",th:"\u0417\u0430\u0433\u0430\u043b\u043e\u0432\u0430\u043a",td:"\u0414\u0430\u0434\u0437\u0435\u043d\u044b\u044f",summary:"\u0417\u0432\u043e\u0434\u043a\u0430",bgimage:"\u0424\u043e\u043d\u0430\u0432\u044b \u043c\u0430\u043b\u044e\u043d\u0430\u043a",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u0430",ltr:"\u0417\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0430",mime:"\u041c\u044d\u0442\u0430\u0432\u044b MIME-\u0442\u044b\u043f",langcode:"\u041a\u043e\u0434 \u043c\u043e\u0432\u044b",langdir:"\u041a\u0456\u0440\u0443\u043d\u0430\u043a \u043c\u043e\u0432\u044b",style:"\u0421\u0442\u044b\u043b\u044c",id:"\u0406\u0434\u044d\u043d\u0442\u044b\u0444\u0456\u043a\u0430\u0442\u0430\u0440",merge_cells_title:"\u0417\u043b\u0456\u0446\u044c \u0432\u043e\u0447\u043a\u0456",bgcolor:"\u041a\u043e\u043b\u0435\u0440 \u0444\u043e\u043d\u0443",bordercolor:"\u041a\u043e\u043b\u0435\u0440 \u043c\u044f\u0436\u044b",align_bottom:"\u041f\u0430 \u043d\u0456\u0437\u0435",align_top:"\u041f\u0430 \u0432\u0435\u0440\u0441\u0435",valign:"\u0412\u0435\u0440\u0442\u044b\u043a\u0430\u043b\u044c\u043d\u0430\u0435 \u0432\u044b\u0440\u0430\u045e\u043d\u043e\u045e\u0432\u0430\u043d\u043d\u0435",cell_type:"\u0422\u044b\u043f \u0432\u043e\u0447\u043a\u0430",cell_title:"\u0423\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456 \u0432\u043e\u0447\u043a\u0430",row_title:"\u0423\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456 \u0440\u0430\u0434\u043a\u0430",align_middle:"\u041f\u0430 \u0446\u044d\u043d\u0442\u0440\u044b",align_right:"\u041d\u0430\u043f\u0440\u0430\u0432\u0430",align_left:"\u041d\u0430\u043b\u0435\u0432\u0430",align_default:"\u041f\u0430 \u0437\u043c\u0430\u045e\u0447\u0430\u043d\u043d\u0456",align:"\u0412\u044b\u0440\u0430\u045e\u043d\u043e\u045e\u0432\u0430\u043d\u043d\u0435",border:"\u041c\u044f\u0436\u0430",cellpadding:"\u041d\u0430\u0431\u0456\u0432\u0430\u043d\u043d\u0435 \u045e \u0432\u043e\u0447\u043a\u0430\u0445",cellspacing:"\u0410\u0434\u043b\u0435\u0433\u043b\u0430\u0441\u0446\u044c \u043f\u0430\u043c\u0456\u0436 \u0432\u043e\u0447\u043a\u0430\u043c\u0456",rows:"\u0420\u0430\u0434\u043a\u0456",cols:"\u0421\u043b\u0443\u043f\u043a\u0456",height:"\u0412\u044b\u0448\u044b\u043d\u044f",width:"\u0428\u044b\u0440\u044b\u043d\u044f",title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c/\u0437\u043c\u044f\u043d\u0456\u0446\u044c \u0442\u0430\u0431\u043b\u0456\u0446\u0443",rowtype:"\u0420\u0430\u0434\u043e\u043a \u0443 \u0447\u0430\u0441\u0442\u043a\u0456 \u0442\u0430\u0431\u043b\u0456\u0446\u044b",advanced_props:"\u0414\u0430\u0434\u0430\u0442\u043a\u043e\u0432\u044b\u044f \u045e\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456",general_props:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f \u045e\u043b\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456",advanced_tab:"\u0414\u0430\u0434\u0430\u0442\u043a\u043e\u0432\u044b\u044f",general_tab:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/bg_dlg.js b/js/tiny_mce/plugins/table/langs/bg_dlg.js new file mode 100755 index 000000000..e04585109 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"\u041f\u0440\u0430\u0432\u0438\u043b\u0430",frame_all:"\u0432\u0441\u0438\u0447\u043a\u0438",frame_cols:"\u043a\u043e\u043b\u043e\u043d\u0438",frame_rows:"\u0440\u0435\u0434\u043e\u0432\u0435",frame_groups:"\u0433\u0440\u0443\u043f\u0438",frame_none:"\u0431\u0435\u0437",frame:"\u0424\u0440\u0435\u0439\u043c",caption:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",missing_scope:"\u0421\u0438\u0433\u0443\u0440\u0435\u043d \u043b\u0438 \u0441\u0442\u0435 \u0447\u0435 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u0434\u0430 \u0441\u043b\u043e\u0436\u0438\u0442\u0435 \u043e\u0431\u0445\u0432\u0430\u0442 \u043d\u0430 \u0433\u043b\u0430\u0432\u0430\u0442\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e, \u043d\u044f\u043a\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 \u0441 \u043d\u0435\u0434\u044a\u0437\u0438 \u043c\u043e\u0433\u0430\u0442 \u0434\u0430 \u0438\u043c\u0430\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0434\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0430\u0442 \u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430.",cell_limit:"\u041f\u0440\u0435\u0432\u0438\u0448\u0438\u0445\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430\u0442\u0430 \u0431\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0435\u0442\u043a\u0438: {$cells}.",row_limit:"\u041f\u0440\u0435\u0432\u0438\u0448\u0438\u0445\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430\u0442\u0430 \u0431\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u0434\u043e\u0432\u0435: {$rows}.",col_limit:"\u041f\u0440\u0435\u0432\u0438\u0448\u0438\u0445\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430\u0442\u0430 \u0431\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043b\u043e\u043d\u0438: {$cols}.",colgroup:"\u0413\u0440\u0443\u043f\u0430 \u043a\u043e\u043b\u043e\u043d\u0438",rowgroup:"\u0413\u0440\u0443\u043f\u0430 \u0440\u0435\u0434\u043e\u0432\u0435",scope:"\u041e\u0431\u0445\u0432\u0430\u0442",tfoot:"\u0414\u044a\u043d\u043e \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",tbody:"\u0422\u044f\u043b\u043e \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",thead:"\u0413\u043b\u0430\u0432\u0430 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",row_all:"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u0440\u0435\u0434\u043e\u0432\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",row_even:"\u041e\u0431\u043d\u043e\u0432\u0438 \u0447\u0435\u0442\u043d\u0438\u0442\u0435 \u0440\u0435\u0434\u043e\u0432\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",row_odd:"\u041e\u0431\u043d\u043e\u0432\u0438 \u043d\u0435\u0447\u0435\u0442\u043d\u0438\u0442\u0435 \u0440\u0435\u0434\u043e\u0432\u0435 \u0432 \u0442\u0430\u043b\u0438\u0446\u0430\u0442\u0430",row_row:"\u041e\u0431\u043d\u043e\u0432\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u044f \u0440\u0435\u0434",cell_all:"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",cell_row:"\u041e\u0431\u043d\u043e\u0432\u0438 \u0432\u0441\u0438\u0447\u043a\u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0430 \u0440\u0435\u0434\u0430",cell_cell:"\u041e\u0431\u043d\u043e\u0432\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u043a\u043b\u0435\u0442\u043a\u0430Update current cell",th:"\u0413\u043b\u0430\u0432\u0430",td:"\u0414\u0430\u043d\u0438\u043d",summary:"\u041e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435",bgimage:"\u0424\u043e\u043d\u043e\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",mime:"MIME \u0442\u0438\u043f",langcode:"\u041a\u043e\u0434 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0435\u0437\u0438\u043a\u0430",style:"\u0421\u0442\u0438\u043b",id:"Id",merge_cells_title:"\u0421\u043b\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",bgcolor:"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0444\u043e\u043d\u0430",bordercolor:"\u0426\u0432\u044f\u0442 \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430",align_bottom:"\u0414\u043e\u043b\u0443",align_top:"\u0413\u043e\u0440\u0435",valign:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",cell_type:"\u0422\u0438\u043f \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430",cell_title:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430",row_title:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430",align_middle:"\u0426\u0435\u043d\u0442\u044a\u0440",align_right:"\u0414\u044f\u0441\u043d\u043e",align_left:"\u041b\u044f\u0432\u043e",align_default:"\u041f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",align:"\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",border:"\u0420\u0430\u043c\u043a\u0430",cellpadding:"Padding \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",cellspacing:"\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u044a\u0436\u0434\u0443 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",rows:"\u0420\u0435\u0434\u043e\u0432\u0435",cols:"\u041a\u043e\u043b\u043e\u043d\u0438",height:"\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0430",rowtype:"\u0420\u043e\u043b\u044f \u043d\u0430 \u0440\u0435\u0434\u0430",advanced_props:"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",general_props:"\u041e\u0431\u0449\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",advanced_tab:"\u0417\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u043d\u0430\u043b\u0438",general_tab:"\u041e\u0431\u0449\u0438"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/bn_dlg.js b/js/tiny_mce/plugins/table/langs/bn_dlg.js new file mode 100755 index 000000000..9912fbe20 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table caption","missing_scope":"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head","row_all":"Update all rows in table","row_even":"Update even rows in table","row_odd":"Update odd rows in table","row_row":"Update current row","cell_all":"Update all cells in table","cell_row":"Update all cells in row","cell_cell":"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id","merge_cells_title":"Merge table cells",bgcolor:"Background color",bordercolor:"Border color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical alignment","cell_type":"Cell type","cell_title":"Table cell properties","row_title":"Table row properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part","advanced_props":"Advanced properties","general_props":"General properties","advanced_tab":"Advanced","general_tab":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/br_dlg.js b/js/tiny_mce/plugins/table/langs/br_dlg.js new file mode 100755 index 000000000..97847f467 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.table_dlg',{rules_border:"Limites",rules_box:"Box",rules_vsides:"Vsides",rules_rhs:"Rhs",rules_lhs:"Lhs",rules_hsides:"Hsides",rules_below:"abaixo",rules_above:"acima",rules_void:"void",rules:"Regras",frame_all:"Todos",frame_cols:"colunas",frame_rows:"Linhas",frame_groups:"Grupos",frame_none:"Nenhum",frame:"Frame",caption:"T\u00edtulo da tabela",missing_scope:"Tem certeza de que quer continuar sem especificar um escopo para esta c\u00e9lula? (Isso poder\u00e1 causar dificuldades a usu\u00e1rios deficientes)",cell_limit:"Excedeu o n\u00famero m\u00e1ximo de c\u00e9lulas de {$cells}.",row_limit:"Excedeu o n\u00famero m\u00e1ximo de linhas de {$rows}.",col_limit:"Excedeu o n\u00famero m\u00e1ximo de colunas de {$cols}.",colgroup:"Grupo colunas",rowgroup:"Grupo linhas",scope:"Alcance",tfoot:"Rodap\u00e9 da tabela",tbody:"Corpo da tabela",thead:"Topo da tabela",row_all:"Atualizar todas as linhas",row_even:"Atualizar linhas pares",row_odd:"Atualizar linhas \u00edmpares",row_row:"Atcualizar esta linha",cell_all:"Atualizar todas as c\u00e9lulas na tabela",cell_row:"Atualizar todas as c\u00e9lulas na linha",cell_cell:"Atualizar esta c\u00e9lula",th:"Campo",td:"Dados",summary:"Sum\u00e1rio",bgimage:"Imagem de fundo",rtl:"Da direita para a esquerda",ltr:"Da esquerda para a direita",mime:"MIME alvo",langcode:"C\u00f3digo da linguagem",langdir:"Dire\u00e7\u00e3o do texto",style:"Estilo",id:"Id",merge_cells_title:"Unir c\u00e9lulas",bgcolor:"Cor de fundo",bordercolor:"Cor dos limites",align_bottom:"Abaixo",align_top:"Topo",valign:"Alinhamento vertical",cell_type:"Tipo de c\u00e9lula",cell_title:"Propriedades de c\u00e9lulas",row_title:"Propriedades de linhas",align_middle:"Centro",align_right:"Direita",align_left:"Esquerda",align_default:"Padr\u00e3o",align:"Alinhamento",border:"Limites",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Linhas",cols:"Colunas",height:"Altura",width:"Largura",title:"Inserir/modificar tabela",rowtype:"Linha na parte da tabela",advanced_props:"Propriedades avan\u00e7adas",general_props:"Propriedades gerais",advanced_tab:"Avan\u00e7ado",general_tab:"Geral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/bs_dlg.js b/js/tiny_mce/plugins/table/langs/bs_dlg.js new file mode 100755 index 000000000..b1926862c --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Opis tablice",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"Prema\u0161ili ste maksimalni broj \u0107elija ({$cells}).",row_limit:"Prema\u0161ili ste maksimalni broj redaka ({$rows}).",col_limit:"Prema\u0161ili ste maksimalni broj stupaca ({$cols}).",colgroup:"Grupa stupaca",rowgroup:"Grupa redaka",scope:"Domet",tfoot:"Podno\u017eje tablice",tbody:"Tijelo tablice",thead:"Zaglavlje tablice",row_all:"Primjeni na sve retke u tablici",row_even:"Primjeni na parne retke u tablici",row_odd:"Primjeni na neparne retke u tablici",row_row:"Primjeni na odabrani redak",cell_all:"Primjeni na sve \u0107elije u tablici",cell_row:"Primjeni na sve \u0107elije u retku",cell_cell:"Primjeni na odabranu \u0107eliju",th:"Zaglavlje",td:"Podatkovna",summary:"Sa\u017eetak",bgimage:"Slika pozadine",rtl:"S desna na lijevo",ltr:"S lijeva na desno",mime:"MIME tip",langcode:"Kod jezika",langdir:"Smjer jezika",style:"Stil",id:"Id",merge_cells_title:"Spoji \u0107elije",bgcolor:"Background color",bordercolor:"Boja obruba",align_bottom:"Dno",align_top:"Vrh",valign:"Okomito poravnavanje",cell_type:"Tip \u0107elije",cell_title:"Svojstva \u0107elije",row_title:"Svojstva retka",align_middle:"Sredina",align_right:"Desno",align_left:"Lijevo",align_default:"Zadano",align:"Poravnavanje",border:"Obrub",cellpadding:"Dopuna \u0107elije",cellspacing:"Razmak \u0107elija",rows:"Redaka",cols:"Stupaca",height:"Visina",width:"\u0160irina",title:"Umetni/uredi tablicu",rowtype:"Row in table part",advanced_props:"Napredna svojstva",general_props:"Osnovna svojstva",advanced_tab:"Napredno",general_tab:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ca_dlg.js b/js/tiny_mce/plugins/table/langs/ca_dlg.js new file mode 100755 index 000000000..60736026f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.table_dlg',{"rules_border":"vora","rules_box":"quadre","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"per sota de","rules_above":"per damunt de","rules_void":"buit",rules:"Regles","frame_all":"tot","frame_cols":"columnes","frame_rows":"files","frame_groups":"grups","frame_none":"cap",frame:"Marc",caption:"T\u00edtol de la taula","missing_scope":"Esteu segur que voleu continuar sense indicar un abast per a aquesta cel\u00b7la de cap\u00e7alera. Pot ser dif\u00edcil per a alguns usuaris amb discapacitats entendre el contingut o les dades mostrades a la taula.","cell_limit":"Heu superat el nombre m\u00e0xim de cel\u00b7les de {$cells}..","row_limit":"Heu superat el nombre m\u00e0xim de files de {$rows}.","col_limit":"Heu superat el nombre m\u00e0xim de columnes de {$cols}.",colgroup:"Grup de columnes",rowgroup:"Grup de files",scope:"Abast",tfoot:"Peu de la taula",tbody:"Cos de la taula",thead:"Cap\u00e7alera de la taula","row_all":"Actualitza totes les files","row_even":"Actualitza les files parells","row_odd":"Actualitza les files senars","row_row":"Actualitza la fila","cell_all":"Actualitza totes les cel\u00b7les de la taula","cell_row":"Actualitza totes les cel\u00b7les de la fila","cell_cell":"Actualitza la cel\u00b7la",th:"Cap\u00e7alera",td:"Dades",summary:"Resum",bgimage:"Imatge de fons",rtl:"De dreta a esquerra",ltr:"D\'esquerra a dreta",mime:"Tipus MIME",langcode:"Codi de l\'idioma",langdir:"Direcci\u00f3 de l\'idioma",style:"Estil",id:"Id","merge_cells_title":"Fusiona cel\u00b7les",bgcolor:"Color de fons",bordercolor:"Color de vora","align_bottom":"A baix","align_top":"A dalt",valign:"Alineaci\u00f3 vertical","cell_type":"Tipus de cel\u00b7la","cell_title":"Propietats de cel\u00b7la","row_title":"Propietats de fila","align_middle":"Centre","align_right":"Dreta","align_left":"Esquerra","align_default":"Per defecte",align:"Alineaci\u00f3",border:"Vora",cellpadding:"Separaci\u00f3 de cel\u00b7la",cellspacing:"Espaiat de cel\u00b7la",rows:"Files",cols:"Columnes",height:"Al\u00e7ada",width:"Amplada",title:"Insereix/Modifica taula",rowtype:"Fila","advanced_props":"Propietats avan\u00e7ades","general_props":"Propietats generals","advanced_tab":"Avan\u00e7at","general_tab":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ch_dlg.js b/js/tiny_mce/plugins/table/langs/ch_dlg.js new file mode 100755 index 000000000..3fcb9e288 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.table_dlg',{rules_border:"\u5916\u6846",rules_box:"\u76d2\u578b",rules_vsides:"\u5782\u76f4",rules_rhs:"\u53f3\u8fb9",rules_lhs:"\u5de6\u8fb9",rules_hsides:"\u6c34\u5e73",rules_below:"\u4e0b",rules_above:"\u4e0a",rules_void:"\u7a7a",rules:"\u89c4\u5219",frame_all:"\u5168\u90e8",frame_cols:"\u680f",frame_rows:"\u884c",frame_groups:"\u7fa4\u7ec4",frame_none:"\u65e0",frame:"\u6846\u67b6",caption:"\u8868\u683c\u6807\u9898",missing_scope:"\u4f60\u786e\u5b9a\u4e0d\u6307\u5b9a\u8868\u683c\u5934\u90e8\u50a8\u5b58\u683c\u4e00\u4e2a\u8303\u56f4\u5417\uff1f\u6ca1\u6709\u5b83\uff0c\u6216\u8bb8\u5bf9\u90a3\u4e9b\u6709\u969c\u788d\u7684\u7528\u6237\u7406\u89e3\u8868\u683c\u5c55\u793a\u7684\u5185\u5bb9\u6216\u6570\u636e\u66f4\u52a0\u7684\u56f0\u96be\u3002",cell_limit:"\u5df2\u8d85\u8fc7\u6700\u5927\u50a8\u5b58\u683c\u9650\u5236{$cells} \u50a8\u5b58\u683c\u3002",row_limit:"\u5df2\u8d85\u8fc7\u6700\u5927\u884c\u6570\u9650\u5236 {$rows} \u5217\u3002",col_limit:"\u5df2\u8d85\u8fc7\u6700\u5927\u680f\u6570\u9650\u5236 {$cols} \u680f\u3002",colgroup:"\u680f\u7fa4\u7ec4",rowgroup:"\u884c\u7fa4\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u683c\u4e3b\u4f53",thead:"\u8868\u5934",row_all:"\u66f4\u65b0\u8868\u683c\u7684\u6240\u6709\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6570\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6570\u884c",row_row:"\u66f4\u65b0\u76ee\u524d\u884c",cell_all:"\u66f4\u65b0\u6240\u6709\u50a8\u5b58\u683c",cell_row:"\u66f4\u65b0\u76ee\u524d\u884c\u7684\u50a8\u5b58\u683c",cell_cell:"\u66f4\u65b0\u76ee\u524d\u50a8\u5b58\u683c",th:"\u8868\u5934",td:"\u5185\u5bb9",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",mime:"MIME \u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"ID",merge_cells_title:"\u5408\u5e76\u50a8\u5b58\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272",align_bottom:"\u9760\u4e0b",align_top:"\u9760\u4e0a",valign:"\u5782\u76f4\u5bf9\u9f50",cell_type:"\u50a8\u5b58\u683c\u7c7b\u578b",cell_title:"\u50a8\u5b58\u683c\u6807\u9898",row_title:"\u884c\u5c5e\u6027",align_middle:"\u7f6e\u4e2d\u5bf9\u9f50",align_right:"\u9760\u53f3\u5bf9\u9f50",align_left:"\u9760\u5de6\u5bf9\u9f50",align_default:"\u9ed8\u8ba4",align:"\u5bf9\u9f50\u65b9\u5f0f",border:"\u8fb9\u6846",cellpadding:"\u50a8\u5b58\u683c\u8fb9\u8ddd",cellspacing:"\u50a8\u5b58\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u680f\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91\u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",general_tab:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/cn_dlg.js b/js/tiny_mce/plugins/table/langs/cn_dlg.js new file mode 100755 index 000000000..889880d7f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.table_dlg',{"rules_border":"\u8868\u683c\u8fb9\u6846","rules_box":"\u65b9\u5757","rules_vsides":"\u5782\u76f4","rules_rhs":"\u53f3\u8fb9","rules_lhs":"\u5de6\u8fb9","rules_hsides":"\u6c34\u5e73","rules_below":"\u4e0b","rules_above":"\u4e0a","rules_void":"\u7a7a",rules:"\u89c4\u5219","frame_all":"\u5168\u90e8","frame_cols":"\u5217","frame_rows":"\u884c","frame_groups":"\u7ec4","frame_none":"\u65e0",frame:"\u6846\u67b6",caption:"\u8868\u683c\u6807\u9898","missing_scope":"\u4f60\u786e\u5b9a\u4e0d\u6307\u5b9a\u8868\u683c\u5934\u90e8\u50a8\u5b58\u683c\u4e00\u4e2a\u8303\u56f4\u5417\uff1f\u6ca1\u6709\u5b83\uff0c\u6216\u8bb8\u5bf9\u90a3\u4e9b\u6709\u969c\u788d\u7684\u7528\u6237\u7406\u89e3\u8868\u683c\u5c55\u793a\u7684\u5185\u5bb9\u6216\u6570\u636e\u66f4\u52a0\u7684\u56f0\u96be\u3002","cell_limit":"\u5df2\u8d85\u8fc7\u6700\u5927\u50a8\u5b58\u683c\u9650\u5236{$cells} \u50a8\u5b58\u683c\u3002","row_limit":"\u5df2\u8d85\u8fc7\u6700\u5927\u884c\u6570\u9650\u5236 {$rows} \u884c","col_limit":"\u5df2\u8d85\u8fc7\u6700\u5927\u884c\u6570\u9650\u5236 {$cols} \u5217",colgroup:"\u5217\u7ec4",rowgroup:"\u884c\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u683c\u4e3b\u4f53",thead:"\u8868\u5934","row_all":"\u66f4\u65b0\u8868\u683c\u7684\u6240\u6709\u884c","row_even":"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6570\u884c","row_odd":"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6570\u884c","row_row":"\u66f4\u65b0\u76ee\u524d\u884c","cell_all":"\u66f4\u65b0\u6240\u6709\u50a8\u5b58\u683c","cell_row":"\u66f4\u65b0\u76ee\u524d\u884c\u7684\u50a8\u5b58\u683c","cell_cell":"\u66f4\u65b0\u76ee\u524d\u50a8\u5b58\u683c",th:"\u8868\u5934",td:"\u5185\u5bb9",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",mime:"MIME \u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"Id\u7f16\u53f7","merge_cells_title":"\u5408\u4f75\u50a8\u5b58\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272","align_bottom":"\u5c45\u4e0b","align_top":"\u5c45\u4e0a",valign:"\u5782\u76f4\u5bf9\u9f50","cell_type":"\u50a8\u5b58\u683c\u7c7b\u578b","cell_title":"\u50a8\u5b58\u683c\u5c5e\u6027","row_title":"\u884c\u5c5e\u6027","align_middle":"\u5c45\u4e2d","align_right":"\u5c45\u53f3","align_left":"\u5c45\u5de6","align_default":"\u9ed8\u8ba4",align:"\u5bf9\u9f50",border:"\u8fb9\u6846",cellpadding:"\u8868\u683c\u8fb9\u8ddd",cellspacing:"\u8868\u683c\u95f4\u8ddd",rows:"\u884c",cols:"\u5217",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u4fee\u6539\u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e","advanced_props":"\u9ad8\u7ea7\u9009\u9879","general_props":"\u5e38\u89c4\u9009\u9879","advanced_tab":"\u9ad8\u7ea7","general_tab":"\u5e38\u89c4"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/cs_dlg.js b/js/tiny_mce/plugins/table/langs/cs_dlg.js new file mode 100755 index 000000000..58acd350a --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.table_dlg',{rules_border:"r\u00e1me\u010dek okolo",rules_box:"box okolo",rules_vsides:"vlevo a vpravo",rules_rhs:"vpravo",rules_lhs:"vlevo",rules_hsides:"naho\u0159e a dole",rules_below:"dole",rules_above:"naho\u0159e",rules_void:"\u017e\u00e1dn\u00fd",rules:"Vykreslen\u00ed m\u0159\u00ed\u017eky",frame_all:"v\u0161e",frame_cols:"sloupce",frame_rows:"\u0159\u00e1dky",frame_groups:"oblasti a skupiny sloupc\u016f",frame_none:"\u017e\u00e1dn\u00e1",frame:"R\u00e1me\u010dek tabulky",caption:"Nadpis tabulky",missing_scope:"Skute\u010dn\u011b chcete pokra\u010dovat bez ur\u010den\u00ed oblasti hlavi\u010dky t\u00e9to tabulky? Bez n\u00ed m\u016f\u017ee u n\u011bkter\u00fdch u\u017eivatel\u016f doch\u00e1zet k ur\u010dit\u00fdm probl\u00e9m\u016fm p\u0159i interpretaci a zobrazov\u00e1n\u00ed dat v tabulce.",cell_limit:"P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det bun\u011bk {$cells}.",row_limit:"P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det \u0159\u00e1dk\u016f {$rows}.",col_limit:"P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det sloupc\u016f {$cols}.",colgroup:"Skupina sloupc\u016f",rowgroup:"Skupina \u0159\u00e1dk\u016f",scope:"Hlavi\u010dka pro",tfoot:"Pata tabulky",tbody:"T\u011blo tabulky",thead:"Hlavi\u010dka tabulky",row_all:"Aktualizovat v\u0161echny \u0159\u00e1dky tabulky",row_even:"Aktualizovat sud\u00e9 \u0159\u00e1dky tabulky",row_odd:"Aktualizovat lich\u00e9 \u0159\u00e1dky tabulky",row_row:"Aktualizovat zvolen\u00fd \u0159\u00e1dek",cell_all:"Aktualizovat v\u0161echny bu\u0148ky v tabulce",cell_row:"Aktualizovat v\u0161echny bu\u0148ky v \u0159\u00e1dku",cell_cell:"Aktualizovat zvolenou bu\u0148ku",th:"Z\u00e1hlav\u00ed",td:"Data",summary:"Shrnut\u00ed obsahu",bgimage:"Obr\u00e1zek pozad\u00ed",rtl:"Zprava doleva",ltr:"Zleva doprava",mime:"MIME typ c\u00edle",langcode:"K\u00f3d jazyka",langdir:"Sm\u011br textu",style:"Styl",id:"ID",merge_cells_title:"Spojit bu\u0148ky",bgcolor:"Barva pozad\u00ed",bordercolor:"Barva r\u00e1me\u010dku",align_bottom:"Dol\u016f",align_top:"Nahoru",valign:"Vertik\u00e1ln\u00ed zarovn\u00e1n\u00ed",cell_type:"Typ bu\u0148ky",cell_title:"Vlastnosti bu\u0148ky",row_title:"Vlastnosti \u0159\u00e1dku",align_middle:"Na st\u0159ed",align_right:"Vpravo",align_left:"Vlevo",align_default:"V\u00fdchoz\u00ed",align:"Zarovn\u00e1n\u00ed",border:"R\u00e1me\u010dek",cellpadding:"Odsazen\u00ed obsahu",cellspacing:"Rozestup bun\u011bk",rows:"\u0158\u00e1dky",cols:"Sloupce",height:"V\u00fd\u0161ka",width:"\u0160\u00ed\u0159ka",title:"Vlo\u017eit/upravit tabulku",rowtype:"Typ \u0159\u00e1dku",advanced_props:"Roz\u0161\u00ed\u0159en\u00e9 parametry",general_props:"Obecn\u00e9 parametry",advanced_tab:"Roz\u0161\u00ed\u0159en\u00e9",general_tab:"Obecn\u00e9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/cy_dlg.js b/js/tiny_mce/plugins/table/langs/cy_dlg.js new file mode 100755 index 000000000..e4628528f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"o dan",rules_above:"above",rules_void:"void",rules:"Rheolau",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Ffr\u00e2m",caption:"Egluryn tabl",missing_scope:"A ydych chi\'n si\u0175r eich bod eisiau parhau heb penodi cwmpas i\'r cell pennyn yma? Hebddo fo, efallai fydd o\'n anodd i rhai ddefnyddwyr gyda anableddau i ddeallt y cynnwys neu\'r data yn y tabl.",cell_limit:"Rydych wedi mynd tu twnt i\'r nifer uchafswm {$cells} o celloedd.",row_limit:"Rydych wedi mynd tu twnt i\'r nifer uchafswm {$rows} o rhesi.",col_limit:"Rydych wedi mynd tu twnt i\'r nifer uchafswm {$cols} o golofnau.",colgroup:"Gr\u0175p Colofnau",rowgroup:"Gr\u0175p Rhesi",scope:"Cwmpas",tfoot:"Troed Tabl",tbody:"Corff Tabl",thead:"Pen Tabl",row_all:"Diweddaru pob rhes yn y tabl",row_even:"Diweddaru rhesi eilrif yn y tabl",row_odd:"Diweddaru rhesi odrif yn y tabl",row_row:"Diweddaru rhes cyfredol",cell_all:"Diweddaru pob cell yn y tabl",cell_row:"Diweddaru pob cell yn y rhes",cell_cell:"Diweddaru cell cyfredol",th:"Pennyn",td:"Data",summary:"Crynodeb",bgimage:"Delwedd cefndir",rtl:"De i\'r chwith",ltr:"Chwith i\'r dde",mime:"Math MIME targed",langcode:"Cod iaith",langdir:"Cyfeiriad iaith",style:"Arddull",id:"Id",merge_cells_title:"Cyfuno celloedd tabl",bgcolor:"Lliw cefndir",bordercolor:"Lliw border",align_bottom:"Gwaelod",align_top:"Pen",valign:"Aliniad ferigol",cell_type:"Math cell",cell_title:"Priodweddau cell tabl",row_title:"Priodweddau rhes tabl",align_middle:"Canol",align_right:"De",align_left:"Chwith",align_default:"Rhagosodedig",align:"Aliniad",border:"Border",cellpadding:"Padio celloedd",cellspacing:"Bylchiad celloedd",rows:"Rhesi",cols:"Colofnau",height:"Uchder",width:"Lled",title:"Mewnosod/Golygu tabl",rowtype:"Rhes mewn rhan tabl",advanced_props:"Priodweddau uwch",general_props:"Priodweddau cyffredinol",advanced_tab:"Uwch",general_tab:"Cyffredinol"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/da_dlg.js b/js/tiny_mce/plugins/table/langs/da_dlg.js new file mode 100755 index 000000000..04c34b848 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.table_dlg',{rules_border:"kant",rules_box:"boks",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"under",rules_above:"over",rules_void:"void",rules:"Regler",frame_all:"alle",frame_cols:"kolonner",frame_rows:"r\u00e6kker",frame_groups:"grupper",frame_none:"ingen",frame:"Ramme",caption:"Tabeloverskrift",missing_scope:"Er du sikker p\u00e5, du vil forts\u00e6tte uden at angive forklaring for denne overskriftscelle? Uden forklaring vil v\u00e6re sv\u00e6rt for f.ek.s blinde at l\u00e6se og forst\u00e5 indholdet i tabellen.",cell_limit:"Du har overskredet antallet af tilladte celler p\u00e5 {$cells}.",row_limit:"Du har overskredet antallet af tilladte r\u00e6kker p\u00e5 {$rows}.",col_limit:"Du har overskredet antallet af tilladte kolonner p\u00e5 {$cols}.",colgroup:"Kolonnegruppe",rowgroup:"R\u00e6kkegruppe",scope:"Forklaring",tfoot:"Tabelfod",tbody:"Tabelkrop",thead:"Tabelhoved",row_all:"Opdater alle r\u00e6kker",row_even:"Opdater lige r\u00e6kker",row_odd:"Opdater ulige r\u00e6kker",row_row:"Opdater aktuelle celle",cell_all:"Opdater alle celler i tabellen",cell_row:"Opdater alle celler i r\u00e6kken",cell_cell:"Opdater aktuelle celle",th:"Hoved",td:"Data",summary:"Beskrivelse",bgimage:"Baggrundsbillede",rtl:"H\u00f8jre mod venstre",ltr:"Venstre mod h\u00f8jre",mime:"Destinations-MIME-type",langcode:"Sprogkode",langdir:"Sprogretning",style:"Style",id:"Id",merge_cells_title:"Flet celler",bgcolor:"Baggrundsfarve",bordercolor:"Kantfarve",align_bottom:"Bund",align_top:"Top",valign:"Vertikal justering",cell_type:"Celletype",cell_title:"Celleegenskaber",row_title:"R\u00e6kkeegenskaber",align_middle:"Centreret",align_right:"H\u00f8jre",align_left:"Venstre",align_default:"Standard",align:"Justering",border:"Kant",cellpadding:"Afstand til celleindhold",cellspacing:"Afstand mellem celler",rows:"R\u00e6kker",cols:"Kolonner",height:"H\u00f8jde",width:"Bredde",title:"Inds\u00e6t/rediger tabel",rowtype:"Row in table part",advanced_props:"Avancerede egenskaber",general_props:"Generelle egenskaber",advanced_tab:"Avanceret",general_tab:"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/de_dlg.js b/js/tiny_mce/plugins/table/langs/de_dlg.js new file mode 100755 index 000000000..8e34ae724 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.table_dlg',{rules_border:"alle 4 Seiten (Border)",rules_box:"alle 4 Seiten (Box)",rules_vsides:"links und rechts",rules_rhs:"nur rechts",rules_lhs:"nur links",rules_hsides:"oben und unten",rules_below:"nur unten",rules_above:"nur oben",rules_void:"keins",rules:"Gitter",frame_all:"zwischen allen Zellen",frame_cols:"zwischen Spalten",frame_rows:"zwischen Zeilen",frame_groups:"zwischen Gruppen",frame_none:"keine",frame:"Rahmen",caption:"Beschriftung der Tabelle",missing_scope:"Wollen Sie wirklich keine Beziehung f\u00fcr diese \u00dcberschrift angeben? Benutzer mit k\u00f6rperlichen Einschr\u00e4nkungen k\u00f6nnten Schwierigkeiten haben, den Inhalt der Tabelle zu verstehen.",cell_limit:"Sie haben die maximale Zellenzahl von {$cells} \u00fcberschritten.",row_limit:"Sie haben die maximale Zeilenzahl von {$rows} \u00fcberschritten.",col_limit:"Sie haben die maximale Spaltenzahl von {$cols} \u00fcberschritten.",colgroup:"Horizontal gruppieren",rowgroup:"Vertikal gruppieren",scope:"Bezug",tfoot:"Tabellenfu\u00df",tbody:"Tabelleninhalt",thead:"Tabellenkopf",row_all:"Alle Zeilen ver\u00e4ndern",row_even:"Gerade Zeilen ver\u00e4ndern",row_odd:"Ungerade Zeilen ver\u00e4ndern",row_row:"Diese Zeile ver\u00e4ndern",cell_all:"Alle Zellen der Tabelle ver\u00e4ndern",cell_row:"Alle Zellen in dieser Zeile ver\u00e4ndern",cell_cell:"Diese Zelle ver\u00e4ndern",th:"\u00dcberschrift",td:"Textzelle",summary:"Zusammenfassung",bgimage:"Hintergrundbild",rtl:"Rechts nach links",ltr:"Links nach rechts",mime:"MIME-Type des Inhalts",langcode:"Sprachcode",langdir:"Schriftrichtung",style:"Format",id:"ID",merge_cells_title:"Zellen vereinen",bgcolor:"Hintergrundfarbe",bordercolor:"Rahmenfarbe",align_bottom:"Unten",align_top:"Oben",valign:"Vertikale Ausrichtung",cell_type:"Zellentyp",cell_title:"Eigenschaften der Zelle",row_title:"Eigenschaften der Zeile",align_middle:"Mittig",align_right:"Rechts",align_left:"Links",align_default:"Standard",align:"Ausrichtung",border:"Rahmen",cellpadding:"Abstand innerhalb der Zellen",cellspacing:"Zellenabstand",rows:"Zeilen",cols:"Spalten",height:"H\u00f6he",width:"Breite",title:"Tabelle einf\u00fcgen/bearbeiten",rowtype:"Gruppierung",advanced_props:"Erweiterte Einstellungen",general_props:"Allgemeine Einstellungen",advanced_tab:"Erweitert",general_tab:"Allgemein"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/dv_dlg.js b/js/tiny_mce/plugins/table/langs/dv_dlg.js new file mode 100755 index 000000000..20816e3a7 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/el_dlg.js b/js/tiny_mce/plugins/table/langs/el_dlg.js new file mode 100755 index 000000000..3810efe9c --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.table_dlg',{rules_border:"\u03c0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf",rules_box:"\u03ba\u03bf\u03c5\u03c4\u03af",rules_vsides:"\u03ba\u03ac\u03b8\u03b5\u03c4\u03b5\u03c2 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ad\u03c2",rules_rhs:"\u03b4\u03b5\u03be\u03b9\u03ac \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ac",rules_lhs:"\u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ae \u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b1 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ac",rules_hsides:"\u03bf\u03c1\u03b9\u03b6\u03cc\u03bd\u03c4\u03b9\u03b5\u03c2 \u03c0\u03bb\u03b5\u03c5\u03c1\u03ad\u03c2",rules_below:"\u03b1\u03c0\u03cc \u03ba\u03ac\u03c4\u03c9",rules_above:"\u03b1\u03c0\u03cc \u03c0\u03ac\u03bd\u03c9",rules_void:"\u03ba\u03b5\u03bd\u03cc",rules:"\u039a\u03b1\u03bd\u03cc\u03bd\u03b5\u03c2",frame_all:"\u03cc\u03bb\u03b1",frame_cols:"\u03c3\u03c4\u03ae\u03bb\u03b5\u03c2",frame_rows:"\u03b3\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2",frame_groups:"\u03bf\u03bc\u03ac\u03b4\u03b5\u03c2",frame_none:"\u03ba\u03b1\u03bd\u03ad\u03bd\u03b1",frame:"Frame",caption:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",missing_scope:"\u03a3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5 \u03c7\u03c9\u03c1\u03af\u03c2 \u03bd\u03b1 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03b9 \u03c4\u03b7\u03bd \u03b5\u03bc\u03b2\u03ad\u03bb\u03b5\u03b9\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd \u03c4\u03b7\u03c2 \u03ba\u03bf\u03c1\u03c5\u03c6\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1. \u03a7\u03c9\u03c1\u03af\u03c2 \u03b1\u03c5\u03c4\u03ae, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03cd\u03c3\u03ba\u03bf\u03bb\u03bf \u03b3\u03b9\u03b1 \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03bc\u03b5 \u03c0\u03c1\u03bf\u03b2\u03bb\u03ae\u03bc\u03b1\u03c4\u03b1 \u03bd\u03b1 \u03ba\u03b1\u03c4\u03b1\u03bb\u03ac\u03b2\u03bf\u03c5\u03bd \u03c4\u03bf \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1.",cell_limit:"\u0388\u03c7\u03b5\u03c4\u03b5 \u03be\u03b5\u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03cc\u03c1\u03b9\u03bf \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 {$cells}.",row_limit:"\u0388\u03c7\u03b5\u03c4\u03b5 \u03be\u03b5\u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03cc\u03c1\u03b9\u03bf \u03c4\u03c9\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 {$rows}.",col_limit:"\u0388\u03c7\u03b5\u03c4\u03b5 \u03be\u03b5\u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03c4\u03bf \u03cc\u03c1\u03b9\u03bf \u03c4\u03c9\u03bd \u03c3\u03c4\u03b7\u03bb\u03c9\u03bd \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 {$cols}.",colgroup:"\u039f\u03bc\u03ac\u03b4\u03b1 \u03c3\u03c4\u03b7\u03bb\u03ce\u03bd",rowgroup:"\u039f\u03bc\u03ac\u03b4\u03b1 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd",scope:"\u0395\u03bc\u03b2\u03ad\u03bb\u03b5\u03b9\u03b1",tfoot:"\u0392\u03ac\u03c3\u03b7 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",tbody:"\u03a3\u03ce\u03bc\u03b1 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",thead:"\u039a\u03bf\u03c1\u03c5\u03c6\u03ae \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",row_all:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",row_even:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03b6\u03c5\u03b3\u03ce\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",row_odd:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03bc\u03bf\u03bd\u03ce\u03bd \u03b3\u03c1\u03b1\u03bc\u03bc\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",row_row:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2",cell_all:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c4\u03bf\u03c5 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",cell_row:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c4\u03b7\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2",cell_cell:"\u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd",th:"\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1",td:"\u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1",summary:"\u03a0\u03b5\u03c1\u03af\u03bb\u03b7\u03c8\u03b7",bgimage:"\u0395\u03b9\u03ba\u03cc\u03bd\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",mime:"\u03a4\u03cd\u03c0\u03bf\u03c2 MIME \u03c3\u03c4\u03cc\u03c7\u03bf\u03c5",langcode:"\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2",style:"\u03a3\u03c4\u03c5\u03bb",id:"Id",merge_cells_title:"\u03a3\u03c5\u03b3\u03c7\u03ce\u03bd\u03b5\u03c5\u03c3\u03b7 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",bgcolor:"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c6\u03cc\u03bd\u03c4\u03bf\u03c5",bordercolor:"\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c0\u03bb\u03b1\u03b9\u03c3\u03af\u03bf\u03c5",align_bottom:"\u039a\u03ac\u03c4\u03c9",align_top:"\u03a0\u03ac\u03bd\u03c9",valign:"\u039a\u03b1\u03c4\u03b1\u03ba\u03cc\u03c1\u03c5\u03c6\u03b7 \u03c3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",cell_type:"\u03a4\u03cd\u03c0\u03bf\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd",cell_title:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03ba\u03b5\u03bb\u03b9\u03bf\u03cd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",row_title:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",align_middle:"\u039a\u03ad\u03bd\u03c4\u03c1\u03bf",align_right:"\u0394\u03b5\u03be\u03b9\u03ac",align_left:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",align_default:"\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03b7",align:"\u03a3\u03c4\u03bf\u03af\u03c7\u03b9\u03c3\u03b7",border:"\u03a0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf",cellpadding:"\u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd",cellspacing:"\u0391\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03ba\u03b5\u03bb\u03b9\u03ce\u03bd",rows:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ad\u03c2",cols:"\u03a3\u03c4\u03ae\u03bb\u03b5\u03c2",height:"\u038e\u03c8\u03bf\u03c2",width:"\u03a0\u03bb\u03ac\u03c4\u03bf\u03c2",title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",rowtype:"\u0393\u03c1\u03b1\u03bc\u03bc\u03ae \u03c3\u03b5 \u03bc\u03ad\u03c1\u03bf\u03c2 \u03c0\u03af\u03bd\u03b1\u03ba\u03b1",advanced_props:"\u03a0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03b5\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",general_props:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ad\u03c2 \u03b9\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",advanced_tab:"\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c7\u03c9\u03c1\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5\u03c2",general_tab:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/en_dlg.js b/js/tiny_mce/plugins/table/langs/en_dlg.js new file mode 100644 index 000000000..deee0f15f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table caption","missing_scope":"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head","row_all":"Update all rows in table","row_even":"Update even rows in table","row_odd":"Update odd rows in table","row_row":"Update current row","cell_all":"Update all cells in table","cell_row":"Update all cells in row","cell_cell":"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id","merge_cells_title":"Merge table cells",bgcolor:"Background color",bordercolor:"Border color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical alignment","cell_type":"Cell type","cell_title":"Table cell properties","row_title":"Table row properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part","advanced_props":"Advanced properties","general_props":"General properties","advanced_tab":"Advanced","general_tab":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/es_dlg.js b/js/tiny_mce/plugins/table/langs/es_dlg.js new file mode 100755 index 000000000..1e41db657 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"debajo","rules_above":"encima","rules_void":"vac\u00edo",rules:"Reglas","frame_all":"todos","frame_cols":"cols","frame_rows":"filas","frame_groups":"grupos","frame_none":"ninguno",frame:"Recuadro",caption:"Subt\u00edtulo de la tabla","missing_scope":" \u00bfEst\u00e1 seguro que desea continuar sin especificar el alcance del encabezado de celda? Sin \u00e9l podr\u00eda ser dificultoso para algunos usuarios entender el contenido o los datos mostrados en la tabla.","cell_limit":"Ha superado el n\u00famero m\u00e1ximo de celdas: {$cells}.","row_limit":"Ha superado el n\u00famero m\u00e1ximo de filas: {$rows}.","col_limit":"Ha superado el n\u00famero m\u00e1ximo de columnas: {$cols}.",colgroup:"Grupo de columnas",rowgroup:"Grupo de filas",scope:"Alcance",tfoot:"Pie de la tabla",tbody:"Cuerpo de la tabla",thead:"Encabezado de la tabla","row_all":"Actualizar todas las filas","row_even":"Actualizar filas pares","row_odd":"Actualizar filas impares","row_row":"Actualizar fila actual","cell_all":"Actualizar todas las celdas en la tabla","cell_row":"Actualizar todas las celdas en la fila","cell_cell":"Actualizar celda actual",th:"Encabezado",td:"Datos",summary:"Resumen",bgimage:"Imagen de fondo",rtl:"Derecha a izquierda",ltr:"Izquierda a derecha",mime:"Tipo MIME",langcode:"C\u00f3digo del lenguaje",langdir:"Direcci\u00f3n del lenguaje",style:"Estilo",id:"Id","merge_cells_title":"Vincular celdas",bgcolor:"Color de fondo",bordercolor:"Color del borde","align_bottom":"Debajo","align_top":"Arriba",valign:"Alineaci\u00f3n vertical","cell_type":"Tipo de celda","cell_title":"Propiedades de la celda","row_title":"Propiedades de la fila","align_middle":"Centrado","align_right":"Derecha","align_left":"Izquierda","align_default":"Predet.",align:"Alineaci\u00f3n",border:"Borde",cellpadding:"Relleno de celda",cellspacing:"Espaciado de celda",rows:"Filas",cols:"Cols",height:"Alto",width:"Ancho",title:"Insertar/Modificar tabla",rowtype:"Tipo de fila","advanced_props":"Propiedades avanzadas","general_props":"Propiedades generales","advanced_tab":"Avanzado","general_tab":"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/et_dlg.js b/js/tiny_mce/plugins/table/langs/et_dlg.js new file mode 100755 index 000000000..504e54537 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.table_dlg',{rules_border:"raam",rules_box:"kast",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"all",rules_above:"\u00fcleval",rules_void:"t\u00fchi",rules:"Reeglid",frame_all:"k\u00f5ik",frame_cols:"veerud",frame_rows:"read",frame_groups:"grupid",frame_none:"mitte \u00fckski",frame:"Raam",caption:"Tabeli seletus",missing_scope:"Oled kindel, et soovid j\u00e4tkata t\u00e4psustamata antud tabeli p\u00e4ise nime?",cell_limit:"Oled j\u00f5udnud maksimaalse arvu elementideni",row_limit:"Oled j\u00f5udnud maksimaalse arvu ridadeni",col_limit:"Oled j\u00f5udnud maksemaalse arvu veegudeni.",colgroup:"Veeru grupp",rowgroup:"Rea grupp",scope:"Ulatus",tfoot:"Tabeli jalus",tbody:"Tabeli sisu",thead:"Tabeli p\u00e4is",row_all:"Uuenda k\u00f5iki ridu tabelis",row_even:"Uuenda paaris ridu tabelis",row_odd:"Uuenda paarituid ridu tabelis",row_row:"Uuenda antud rida",cell_all:"Uuenda k\u00f5iki lahtreid tabelis",cell_row:"Uuenda k\u00f5iki lahtreid reas",cell_cell:"Uuenda antud lahtrit",th:"P\u00e4is",td:"Info",summary:"Kokkuv\u00f5te",bgimage:"Tausta pilt",rtl:"Paremalt vasakule",ltr:"Vasakult paremale",mime:"M\u00e4rgista MIME t\u00fc\u00fcp",langcode:"Keele kood",langdir:"Keele suund",style:"Stiil",id:"ID",merge_cells_title:"\u00dchenda lahtrid",bgcolor:"Tausta v\u00e4rv",bordercolor:"Raami v\u00e4rv",align_bottom:"All",align_top:"\u00dcleval",valign:"Vertikaalne joondus",cell_type:"Veeru t\u00fc\u00fcp",cell_title:"Tabeli veeru seaded",row_title:"Tabeli rea seaded",align_middle:"Keskel",align_right:"Parem",align_left:"Vasak",align_default:"Vaikimisi",align:"Joondus",border:"Raam",cellpadding:"Veeru t\u00e4ide",cellspacing:"Veeru laius",rows:"Ridu",cols:"Veerge",height:"K\u00f5rgus",width:"Laius",title:"Sisesta/muuda tabelit",rowtype:"Rida rea osas",advanced_props:"T\u00e4psustatud seaded",general_props:"\u00dcldised seaded",advanced_tab:"T\u00e4psustatud",general_tab:"\u00dcldine"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/eu_dlg.js b/js/tiny_mce/plugins/table/langs/eu_dlg.js new file mode 100755 index 000000000..4e78d7541 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"azpian",rules_above:"gainean",rules_void:"hutsa",rules:"Erregelak",frame_all:"guztiak",frame_cols:"zutabeak",frame_rows:"lerroak",frame_groups:"taldeak",frame_none:"Bat ere ez",frame:"Markoa",caption:"Taularen azpititulua",missing_scope:"Taularen goiburukoari eremu bat zehaztu gabe jarritu nahi duzula ziur zaude? Eremu hori gabe, ezintasunak dituzten erabiltzaileentzat zaila izango da taularen datuak ulertzea.",cell_limit:"Gelaxka kopuru maximoa ({$cells}) gainditu duzu..",row_limit:"Lerro kopuru maximoa ({$rows}) gainditu duzu.",col_limit:"Zutabe kopuru maximoa ({$cols}) gainditu duzu.",colgroup:"Zutabe Taldea",rowgroup:"Lerro Taldea",scope:"Eremua",tfoot:"Taularen Oina",tbody:"Taularen Gorputza",thead:"Taularen Goiburukoa",row_all:"Eguneratu lerro guztiak",row_even:"Eguneratu lerro bakoitiak",row_odd:"Eguneratu lerro bikoitiak",row_row:"Eguneratu uneko lerroa",cell_all:"Eguneratu gelaxka guztiak",cell_row:"Eguneratu lerroko gelaxka guztiak",cell_cell:"Eguneratu uneko gelaxka",th:"Goiburua",td:"Datuak",summary:"Laburpena",bgimage:"Atzeko irudia",rtl:"Eskuinetik ezkerrera",ltr:"Ezkerretik eskuinera",mime:"Helburuareb MIME mota",langcode:"Hizkuntza kodea",langdir:"Hizkuntza norabidea",style:"Estiloa",id:"Id",merge_cells_title:"Bateratu gelaxkak",bgcolor:"Atzeko kolorea",bordercolor:"Ertz kolorea",align_bottom:"Behean",align_top:"Goian",valign:"Lerrokatze bertikala",cell_type:"Gelaxka mota",cell_title:"Gelaxka ezaugarriak",row_title:"Lerro ezaugarriak",align_middle:"Erdian",align_right:"Eskuinera",align_left:"Ezkerrera",align_default:"Lehenetsia",align:"Lerrokatzea",border:"Ertza",cellpadding:"Gelaxkaren betegarria",cellspacing:"Gelaxkaren tartea",rows:"Lerroak",cols:"Zutabeak",height:"Altuera",width:"Zabalera",title:"Txertatu/Aldatu taula",rowtype:"Lerro mota",advanced_props:"Ezaugarri aurreratuak",general_props:"Ezaugarri orokorrak",advanced_tab:"Aurreratua",general_tab:"Orokorra"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/fa_dlg.js b/js/tiny_mce/plugins/table/langs/fa_dlg.js new file mode 100755 index 000000000..3ef675054 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.table_dlg',{rules_border:"\u062d\u0627\u0634\u06cc\u0647",rules_box:"\u062c\u0639\u0628\u0647",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"\u067e\u0627\u06cc\u06cc\u0646",rules_above:"\u0628\u0627\u0644\u0627",rules_void:"\u062e\u0627\u0644\u06cc",rules:"\u062e\u0637 \u0647\u0627",frame_all:"\u0647\u0645\u0647",frame_cols:"\u0633\u062a\u0648\u0646 \u0647\u0627",frame_rows:"\u0633\u0637\u0631\u0647\u0627",frame_groups:"\u06af\u0631\u0648\u0647 \u0647\u0627",frame_none:"\u0647\u06cc\u0686 \u06a9\u062f\u0627\u0645",frame:"\u0642\u0627\u0628 (Frame)",caption:"\u0639\u0646\u0648\u0627\u0646 \u062c\u062f\u0648\u0644",missing_scope:"\u0622\u06cc\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u06cc\u06cc\u0646 \u0645\u062d\u062f\u0648\u062f\u0647 \u0628\u0631\u0627\u06cc \u0633\u0644\u0648\u0644 \u0639\u0646\u0648\u0627\u0646 \u062c\u062f\u0648\u0644\u060c \u0627\u062f\u0627\u0645\u0647 \u0645\u06cc \u062f\u0647\u06cc\u062f\u061f. \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062f\u0631\u06a9 \u0645\u062d\u062a\u0648\u0627 \u06cc\u0627 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0631\u0627\u06cc \u0628\u0639\u0636\u06cc \u0627\u0632 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0645\u0634\u06a9\u0644 \u0628\u0627\u0634\u062f.",cell_limit:"\u0634\u0645\u0627 \u0627\u0632 \u062a\u0639\u062f\u0627\u062f \u062d\u062f\u0627\u06a9\u062b\u0631 {$cells} \u0633\u0644\u0648\u0644 \u062a\u062c\u0627\u0648\u0632 \u06a9\u0631\u062f\u06cc\u062f.",row_limit:"\u0634\u0645\u0627 \u0627\u0632 \u062a\u0639\u062f\u0627\u062f \u062d\u062f\u0627\u06a9\u062b\u0631 {$rows} \u0633\u0637\u0631 \u062a\u062c\u0627\u0648\u0632 \u06a9\u0631\u062f\u06cc\u062f.",col_limit:"\u0634\u0645\u0627 \u0627\u0632 \u062a\u0639\u062f\u0627\u062f \u062d\u062f\u0627\u06a9\u062b\u0631 {$cols} \u0633\u062a\u0648\u0646 \u062a\u062c\u0627\u0648\u0632 \u06a9\u0631\u062f\u06cc\u062f.",colgroup:"\u06af\u0631\u0648\u0647 \u0633\u062a\u0648\u0646",rowgroup:"\u06af\u0631\u0648\u0647 \u0633\u0637\u0631",scope:"\u0645\u062d\u062f\u0648\u062f\u0647",tfoot:"\u067e\u0627\u06cc\u06cc\u0646 \u062c\u062f\u0648\u0644",tbody:"\u0628\u062f\u0646\u0647 \u062c\u062f\u0648\u0644",thead:"\u0628\u0627\u0644\u0627\u06cc \u062c\u062f\u0648\u0644",row_all:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u062a\u0645\u0627\u0645\u06cc \u0633\u0637\u0631\u0647\u0627 \u062f\u0631 \u062c\u062f\u0648\u0644",row_even:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u0637\u0631\u0647\u0627\u06cc \u0632\u0648\u062c \u062f\u0631 \u062c\u062f\u0648\u0644",row_odd:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u0637\u0631\u0647\u0627\u06cc \u0641\u0631\u062f \u062f\u0631 \u062c\u062f\u0648\u0644",row_row:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u0637\u0631 \u0641\u0639\u0644\u06cc",cell_all:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u062a\u0645\u0627\u0645\u06cc \u0633\u0644\u0648\u0644 \u0647\u0627\u06cc \u062c\u062f\u0648\u0644",cell_row:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u062a\u0645\u0627\u0645\u06cc \u0633\u0644\u0648\u0644 \u0647\u0627\u06cc \u0633\u0637\u0631",cell_cell:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u0644\u0648\u0644 \u0641\u0639\u0644\u06cc",th:"\u0633\u0631 \u062c\u062f\u0648\u0644",td:"\u062f\u0627\u062f\u0647",summary:"\u062e\u0644\u0627\u0635\u0647",bgimage:"\u062a\u0635\u0648\u06cc\u0631 \u0632\u0645\u06cc\u0646\u0647",rtl:"\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e",ltr:"\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a",mime:"\u0646\u0648\u0639 MIME \u0645\u0642\u0635\u062f (Target)",langcode:"\u06a9\u062f \u0632\u0628\u0627\u0646",langdir:"\u062c\u0647\u062a \u0632\u0628\u0627\u0646",style:"\u0627\u0633\u062a\u06cc\u0644",id:"\u0634\u0646\u0627\u0633\u0647",merge_cells_title:"\u0627\u062f\u063a\u0627\u0645 \u0633\u0644\u0648\u0644 \u0647\u0627\u06cc \u062c\u062f\u0648\u0644",bgcolor:"\u0631\u0646\u06af \u0632\u0645\u06cc\u0646\u0647",bordercolor:"\u0631\u0646\u06af \u062d\u0627\u0634\u06cc\u0647",align_bottom:"\u067e\u0627\u06cc\u06cc\u0646",align_top:"\u0628\u0627\u0644\u0627",valign:"\u062a\u0631\u0627\u0632 \u0639\u0645\u0648\u062f\u06cc",cell_type:"\u0646\u0648\u0639 \u0633\u0644\u0648\u0644",cell_title:"\u0645\u0634\u062e\u0635\u0627\u062a \u0633\u0644\u0648\u0644 \u062c\u062f\u0648\u0644",row_title:"\u0645\u0634\u062e\u0635\u0627\u062a \u0633\u0637\u0631 \u062c\u062f\u0648\u0644",align_middle:"\u0648\u0633\u0637",align_right:"\u0631\u0627\u0633\u062a",align_left:"\u0686\u067e",align_default:"\u067e\u06cc\u0634\u0641\u0631\u0636",align:"\u062a\u0631\u0627\u0632",border:"\u062d\u0627\u0634\u06cc\u0647",cellpadding:"\u0644\u0627\u06cc\u0647 \u06af\u0630\u0627\u0631\u06cc \u0633\u0644\u0648\u0644 \u0647\u0627",cellspacing:"\u0641\u0627\u0635\u0644\u0647 \u0633\u0644\u0648\u0644 \u0647\u0627",rows:"\u0633\u0637\u0631\u0647\u0627",cols:"\u0633\u062a\u0648\u0646 \u0647\u0627",height:"\u0627\u0631\u062a\u0641\u0627\u0639",width:"\u067e\u0647\u0646\u0627",title:"\u062f\u0631\u062c/\u0627\u0635\u0644\u0627\u062d \u062c\u062f\u0648\u0644",rowtype:"\u0633\u0637\u0631 \u062f\u0631 \u0628\u062e\u0634 \u062c\u062f\u0648\u0644",advanced_props:"\u0645\u0634\u062e\u0635\u0627\u062a \u067e\u06cc\u0634\u0631\u0641\u062a\u0647",general_props:"\u0645\u0634\u062e\u0635\u0627\u062a \u0639\u0645\u0648\u0645\u06cc",advanced_tab:"\u067e\u06cc\u0634\u0631\u0641\u062a\u0647",general_tab:"\u0639\u0645\u0648\u0645\u06cc"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/fi_dlg.js b/js/tiny_mce/plugins/table/langs/fi_dlg.js new file mode 100755 index 000000000..78a1129db --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.table_dlg',{rules_border:"kehys",rules_box:"laatikko",rules_vsides:"pystysuorat reunat",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"vaakasuorat reunat",rules_below:"alapuoli",rules_above:"yl\u00e4puoli",rules_void:"tyhj\u00e4",rules:"S\u00e4\u00e4nn\u00f6t",frame_all:"kaikki",frame_cols:"sarakkeet",frame_rows:"rivit",frame_groups:"ryhm\u00e4t",frame_none:"ei mit\u00e4\u00e4n",frame:"kehys",caption:"Taulukon seloste",missing_scope:"Haluatko varmasti jatkaa m\u00e4\u00e4ritt\u00e4m\u00e4tt\u00e4 tilaa t\u00e4lle taulukon otsakesolulle? Ilman sit\u00e4 joidenkin k\u00e4ytt\u00e4jien voi olla vaikea ymm\u00e4rt\u00e4\u00e4 taulukon sis\u00e4lt\u00e4m\u00e4\u00e4 informaatiota.",cell_limit:"Olet ylitt\u00e4nyt suurimman sallitun m\u00e4\u00e4r\u00e4n soluja {$cells}.",row_limit:"Olet ylitt\u00e4nyt suurimman sallitun m\u00e4\u00e4r\u00e4n rivej\u00e4 {$rows}.",col_limit:"Olet ylitt\u00e4nyt suurimman sallitun m\u00e4\u00e4r\u00e4n sarakkeita {$cols}.",colgroup:"Sarake ryhm\u00e4",rowgroup:"Rivi ryhm\u00e4",scope:"Tila",tfoot:"Taulukon alaosa",tbody:"Taulukon runko",thead:"Taulukon otsake",row_all:"P\u00e4ivit\u00e4 kaikki taulukon rivit",row_even:"P\u00e4ivit\u00e4 taulukon parilliset rivit",row_odd:"P\u00e4ivit\u00e4 taulukon parittomat rivit",row_row:"P\u00e4ivit\u00e4 rivi",cell_all:"P\u00e4ivit\u00e4 kaikki taulukon solut",cell_row:"P\u00e4ivit\u00e4 kaikki rivin solut",cell_cell:"P\u00e4ivit\u00e4 solu",th:"Otsake",td:"Tietue",summary:"Yhteenveto",bgimage:"Taustakuva",rtl:"Oikealta vasemmalle",ltr:"Vasemmalta oikealle",mime:"Kohteen MIME-tyyppi",langcode:"Kielen koodi",langdir:"Kielen suunta",style:"Tyyli",id:"Id",merge_cells_title:"Yhdist\u00e4 taulukon solut",bgcolor:"Taustan v\u00e4ri",bordercolor:"Kehyksen v\u00e4ri",align_bottom:"Alas",align_top:"Yl\u00f6s",valign:"Pystysuunnan tasaus",cell_type:"Solun tyyppi",cell_title:"Taulukon solun asetukset",row_title:"Taulukon rivin asetukset",align_middle:"Keskitetty",align_right:"Oikea",align_left:"Vasen",align_default:"Oletus",align:"Tasaus",border:"Kehys",cellpadding:"Solun tyhj\u00e4 tila",cellspacing:"Solun v\u00e4li",rows:"Rivit",cols:"Sarakkeet",height:"Korkeus",width:"Leveys",title:"Lis\u00e4\u00e4/muokkaa taulukkoa",rowtype:"Rivi taulukon osassa",advanced_props:"Edistyneet asetukset",general_props:"Yleiset asetukset",advanced_tab:"Edistynyt",general_tab:"Yleiset"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/fr_dlg.js b/js/tiny_mce/plugins/table/langs/fr_dlg.js new file mode 100755 index 000000000..cc69de577 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.table_dlg',{rules_border:"bordure",rules_box:"bo\u00eete",rules_vsides:"verticales",rules_rhs:"\u00e0 droite",rules_lhs:"\u00e0 gauche",rules_hsides:"horizontales",rules_below:"au-dessous",rules_above:"au-dessus",rules_void:"aucune",rules:"R\u00e8gles",frame_all:"tous",frame_cols:"colonnes",frame_rows:"lignes",frame_groups:"groupe",frame_none:"aucun",frame:"Cadre",caption:"Afficher la l\u00e9gende du tableau",missing_scope:"\u00cates-vous s\u00fbr de vouloir continuer sans sp\u00e9cifier de port\u00e9e pour cette cellule de titre ? Sans port\u00e9e, cela peut \u00eatre difficile pour certains utilisateurs de comprendre le contenu ou les donn\u00e9es affich\u00e9es dans le tableau.",cell_limit:"Vous avez d\u00e9pass\u00e9 le nombre maximum de cellules ({$cells}).",row_limit:"Vous avez d\u00e9pass\u00e9 le nombre maximum de lignes ({$rows}).",col_limit:"Vous avez d\u00e9pass\u00e9 le nombre maximum de colonnes ({$cols}).",colgroup:"Groupe de colonnes",rowgroup:"Groupe de lignes",scope:"Port\u00e9e",tfoot:"Pied de tableau",tbody:"Corps de tableau",thead:"En-t\u00eates de tableau",row_all:"Mettre \u00e0 jour toutes les lignes du tableau",row_even:"Mettre \u00e0 jour les lignes paires",row_odd:"Mettre \u00e0 jour les lignes impaires",row_row:"Mettre \u00e0 jour la ligne courante",cell_all:"Mettre \u00e0 jour toutes les cellules du tableau",cell_row:"Mettre \u00e0 jour toutes les cellules de la ligne",cell_cell:"Mettre \u00e0 jour la cellule courante",th:"Titre",td:"Donn\u00e9es",summary:"R\u00e9sum\u00e9",bgimage:"Image de fond",rtl:"de droite \u00e0 gauche",ltr:"De gauche \u00e0 droite",mime:"Type MIME de la cible",langcode:"Code de la langue",langdir:"Sens de lecture",style:"Style",id:"Id",merge_cells_title:"Fusionner les cellules",bgcolor:"Couleur du fond",bordercolor:"Couleur de la bordure",align_bottom:"Bas",align_top:"Haut",valign:"Alignement vertical",cell_type:"Type de cellule",cell_title:"Propri\u00e9t\u00e9s de la cellule",row_title:"Propri\u00e9t\u00e9s de la ligne",align_middle:"Centr\u00e9",align_right:"Droite",align_left:"Gauche",align_default:"Par d\u00e9faut",align:"Alignement",border:"Bordure",cellpadding:"Espacement dans les cellules",cellspacing:"Espacement entre les cellules",rows:"Lignes",cols:"Colonnes",height:"Hauteur",width:"Largeur",title:"Ins\u00e9rer / modifier un tableau",rowtype:"Type de ligne",advanced_props:"Propri\u00e9t\u00e9s avanc\u00e9es",general_props:"Propri\u00e9t\u00e9s g\u00e9n\u00e9rales",advanced_tab:"Avanc\u00e9",general_tab:"G\u00e9n\u00e9ral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/gl_dlg.js b/js/tiny_mce/plugins/table/langs/gl_dlg.js new file mode 100755 index 000000000..2075f2900 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.table_dlg',{rules_border:"borde",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"debaixo",rules_above:"encima",rules_void:"vac\u00edo",rules:"Regras",frame_all:"todos",frame_cols:"columnas",frame_rows:"filas",frame_groups:"grupos",frame_none:"ning\u00fan",frame:"Recadro",caption:"Subt\u00edtulo da t\u00e1boa",missing_scope:"\u00bfEst\u00e1 seguro que desexa continuar sen especifica-lo \u00e1mbito do encabezado de celda? Sen \u00e9l podr\u00eda ser dificultoso pra algunos usuarios entende-lo contido ou os datos mostrados na t\u00e1boa.",cell_limit:"Super\u00f3u o n\u00famero m\u00e1ximo de celdas: {$cells}.",row_limit:"Super\u00f3u o n\u00famero m\u00e1ximo de filas: {$rows}.",col_limit:"Super\u00f3u o n\u00famero m\u00e1ximo de columnas: {$cols}.",colgroup:"Grupo de columnas",rowgroup:"Grupo de filas",scope:"\u00c1mbito",tfoot:"Pe da t\u00e1boa",tbody:"Corpo da t\u00e1boa",thead:"Encabezamento da t\u00e1boa",row_all:"Actualizar todalas filas",row_even:"Actualizar filas pares",row_odd:"Actualizar filas impares",row_row:"Actualizar fila actual",cell_all:"Actualizar todalas celdas na t\u00e1boa",cell_row:"Actualizar todalas celdas na fila",cell_cell:"Actualizar celda actual",th:"Encabezamento",td:"Datos",summary:"Resumen",bgimage:"Imaxe de fondo",rtl:"Dereita a esquerda",ltr:"Esquerda a dereita",mime:"Tipo MIME",langcode:"C\u00f3digo da lenguaxe",langdir:"Direcci\u00f3n da lenguaxe",style:"Estilo",id:"Id",merge_cells_title:"Unir celdas",bgcolor:"Cor de fondo",bordercolor:"Cor do borde",align_bottom:"Abaixo",align_top:"Arriba",valign:"Ali\u00f1aci\u00f3n vertical",cell_type:"Tipo de celda",cell_title:"Propiedades da celda",row_title:"Propiedades da fila",align_middle:"Centrado",align_right:"Dereita",align_left:"Esquerda",align_default:"Predet.",align:"Ali\u00f1aci\u00f3n",border:"Borde",cellpadding:"Relleno de celda",cellspacing:"Espaciado de celda",rows:"Filas",cols:"Cols",height:"Alto",width:"Ancho",title:"Insertar/Modificar t\u00e1boa",rowtype:"Tipo de fila",advanced_props:"Propiedades avanzadas",general_props:"Propiedades xerales",advanced_tab:"Avanzado",general_tab:"Xeral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/gu_dlg.js b/js/tiny_mce/plugins/table/langs/gu_dlg.js new file mode 100755 index 000000000..68b75a0cc --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/he_dlg.js b/js/tiny_mce/plugins/table/langs/he_dlg.js new file mode 100755 index 000000000..156611443 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.table_dlg',{rules_border:"\u05d2\u05d1\u05d5\u05dc",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"\u05de\u05ea\u05d7\u05ea",rules_above:"\u05de\u05e2\u05dc",rules_void:"void",rules:"\u05d7\u05d5\u05e7\u05d9\u05dd",frame_all:"\u05d4\u05db\u05d5\u05dc",frame_cols:"\u05e2\u05de\u05d5\u05d3\u05d5\u05ea",frame_rows:"\u05e9\u05d5\u05e8\u05d5\u05ea",frame_groups:"\u05e7\u05d1\u05d5\u05e6\u05d5\u05ea",frame_none:"\u05dc\u05dc\u05d0",frame:"Frame",caption:"\u05db\u05d5\u05ea\u05e8\u05ea \u05d4\u05d8\u05d1\u05dc\u05d4",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"\u05d7\u05e8\u05d9\u05d2\u05d4 \u05de\u05de\u05e1\u05e4\u05e8 \u05d4\u05de\u05e7\u05e1\u05d9\u05de\u05d0\u05dc\u05d9 \u05e9\u05dc \u05d4\u05ea\u05d0\u05d9\u05dd \u05d1\u05d8\u05d1\u05dc\u05d4 \u05e9\u05dc {$cells}.",row_limit:"\u05d7\u05e8\u05d9\u05d2\u05d4 \u05de\u05de\u05e1\u05e4\u05e8 \u05d4\u05de\u05e7\u05e1\u05d9\u05de\u05d0\u05dc\u05d9 \u05e9\u05dc \u05d4\u05e9\u05d5\u05e8\u05d5\u05ea \u05e9\u05dc {$rows}.",col_limit:"\u05d7\u05e8\u05d9\u05d2\u05d4 \u05de\u05de\u05e1\u05e4\u05e8 \u05d4\u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d4\u05de\u05e7\u05e1\u05d9\u05de\u05d0\u05dc\u05d9 \u05e9\u05dc {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"\u05e9\u05d5\u05e8\u05d4 \u05ea\u05d7\u05ea\u05d9\u05ea",tbody:"\u05e9\u05d5\u05e8\u05d4 \u05e8\u05d2\u05d9\u05dc\u05d4",thead:"\u05e9\u05d5\u05e8\u05ea \u05db\u05d5\u05ea\u05e8\u05ea",row_all:"\u05e2\u05d3\u05db\u05d5\u05df\u05db\u05dc \u05d4\u05e9\u05d5\u05e8\u05d5\u05ea \u05d1\u05d8\u05d1\u05dc\u05d4",row_even:"\u05e2\u05d3\u05db\u05d5\u05df \u05e9\u05d5\u05e8\u05d5\u05ea \u05d6\u05d5\u05d2\u05d9\u05d5\u05ea \u05d1\u05d8\u05d1\u05dc\u05d4",row_odd:"\u05e2\u05d3\u05db\u05d5\u05df \u05e9\u05d5\u05e8\u05d5\u05ea \u05d0\u05d9-\u05d6\u05d5\u05d2\u05d9\u05d5\u05ea \u05d1\u05d8\u05d1\u05dc\u05d4",row_row:"\u05e2\u05d3\u05db\u05d5\u05df \u05e9\u05d5\u05e8\u05d4 \u05e0\u05d5\u05db\u05d7\u05d9\u05ea",cell_all:"\u05e2\u05d3\u05db\u05d5\u05df \u05db\u05dc \u05ea\u05d0\u05d9 \u05d4\u05d8\u05d1\u05dc\u05d4",cell_row:"\u05e2\u05d3\u05db\u05d5\u05df \u05db\u05dc \u05ea\u05d0\u05d9 \u05d4\u05e9\u05d5\u05e8\u05d4",cell_cell:"\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d0 \u05e0\u05d5\u05db\u05d7\u05d9",th:"\u05db\u05d5\u05ea\u05e8\u05ea",td:"\u05ea\u05d0 \u05de\u05d9\u05d3\u05e2",summary:"\u05ea\u05de\u05e6\u05d9\u05ea",bgimage:"\u05ea\u05de\u05d5\u05e0\u05ea \u05e8\u05e7\u05e2",rtl:"\u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc",ltr:"\u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df",mime:"Target MIME type",langcode:"\u05e7\u05d5\u05d3 \u05d4\u05e9\u05e4\u05d4",langdir:"\u05db\u05d9\u05d5\u05d5\u05df \u05d4\u05e9\u05e4\u05d4",style:"\u05e2\u05d9\u05e6\u05d5\u05d1",id:"Id",merge_cells_title:"\u05d0\u05d7\u05d3 \u05ea\u05d0\u05d9\u05dd \u05d1\u05d8\u05d1\u05dc\u05d4",bgcolor:"\u05e6\u05d1\u05e2 \u05d4\u05e8\u05e7\u05e2",bordercolor:"\u05e6\u05d1\u05e2 \u05d4\u05d2\u05d1\u05d5\u05dc",align_bottom:"\u05ea\u05d7\u05ea\u05d9\u05ea",align_top:"\u05e2\u05dc\u05d9\u05d5\u05df",valign:"\u05d9\u05e9\u05d5\u05e8 \u05d0\u05e0\u05db\u05d9",cell_type:"\u05e1\u05d2\u05e0\u05d5\u05df \u05d4\u05ea\u05d0",cell_title:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05ea\u05d0 \u05d1\u05d8\u05d1\u05dc\u05d4",row_title:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4",align_middle:"\u05d0\u05de\u05e6\u05e2",align_right:"\u05dc\u05d9\u05de\u05d9\u05df",align_left:"\u05dc\u05e9\u05de\u05d0\u05dc",align_default:"Default",align:"\u05d9\u05e9\u05d5\u05e8 \u05d0\u05d5\u05e4\u05e7\u05d9",border:"\u05d2\u05d1\u05d5\u05dc",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"\u05e9\u05d5\u05e8\u05d5\u05ea",cols:"\u05e2\u05de\u05d5\u05d3\u05d5\u05ea",height:"\u05d2\u05d5\u05d1\u05d4",width:"\u05e8\u05d5\u05d7\u05d1",title:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05d8\u05d1\u05dc\u05d4",rowtype:"\u05e1\u05d5\u05d2 \u05d4\u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4",advanced_props:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05de\u05ea\u05e7\u05d3\u05de\u05d5\u05ea",general_props:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05db\u05dc\u05dc\u05d9\u05d5\u05ea",advanced_tab:"\u05de\u05ea\u05e7\u05d3\u05dd",general_tab:"\u05db\u05dc\u05dc\u05d9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/hi_dlg.js b/js/tiny_mce/plugins/table/langs/hi_dlg.js new file mode 100755 index 000000000..563089b94 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/hr_dlg.js b/js/tiny_mce/plugins/table/langs/hr_dlg.js new file mode 100755 index 000000000..511eb922e --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Opis tablice",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"Prema\u0161ili ste maksimalni broj \u0107elija ({$cells}).",row_limit:"Prema\u0161ili ste maksimalni broj redaka ({$rows}).",col_limit:"Prema\u0161ili ste maksimalni broj stupaca ({$cols}).",colgroup:"Grupa stupaca",rowgroup:"Grupa redaka",scope:"Domet",tfoot:"Podno\u017eje tablice",tbody:"Tijelo tablice",thead:"Zaglavlje tablice",row_all:"Primjeni na sve retke u tablici",row_even:"Primjeni na parne retke u tablici",row_odd:"Primjeni na neparne retke u tablici",row_row:"Primjeni na odabrani redak",cell_all:"Primjeni na sve \u0107elije u tablici",cell_row:"Primjeni na sve \u0107elije u retku",cell_cell:"Primjeni na odabranu \u0107eliju",th:"Zaglavlje",td:"Podatkovna",summary:"Sa\u017eetak",bgimage:"Slika pozadine",rtl:"S desna na lijevo",ltr:"S lijeva na desno",mime:"MIME tip",langcode:"Kod jezika",langdir:"Smjer jezika",style:"Stil",id:"Id",merge_cells_title:"Spoji \u0107elije",bgcolor:"Background color",bordercolor:"Boja obruba",align_bottom:"Dno",align_top:"Vrh",valign:"Okomito poravnavanje",cell_type:"Tip \u0107elije",cell_title:"Svojstva \u0107elije",row_title:"Svojstva retka",align_middle:"Sredina",align_right:"Desno",align_left:"Lijevo",align_default:"Zadano",align:"Poravnavanje",border:"Obrub",cellpadding:"Dopuna \u0107elije",cellspacing:"Razmak \u0107elija",rows:"Redaka",cols:"Stupaca",height:"Visina",width:"\u0160irina",title:"Umetni/uredi tablicu",rowtype:"Row in table part",advanced_props:"Napredna svojstva",general_props:"Osnovna svojstva",advanced_tab:"Napredno",general_tab:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/hu_dlg.js b/js/tiny_mce/plugins/table/langs/hu_dlg.js new file mode 100755 index 000000000..0a2b8c167 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.table_dlg',{"rules_border":"keret","rules_box":"doboz","rules_vsides":"f. oldalak","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"v. oldalak","rules_below":"alatta","rules_above":"f\u00f6l\u00f6tte","rules_void":"sehol",rules:"Vonalak","frame_all":"mind","frame_cols":"oszlopok","frame_rows":"sorok","frame_groups":"csoportok","frame_none":"nincs",frame:"Keret",caption:"C\u00edmsor","missing_scope":"Biztosan folytatni akarja an\u00e9lk\u00fcl, hogy hat\u00f3k\u00f6rt adna ennek a fejl\u00e9ccell\u00e1nak? Korl\u00e1toz\u00e1sokkal \u00e9l\u0151k sz\u00e1m\u00e1ra neh\u00e9z lesz meg\u00e9rteni a t\u00e1bl\u00e1zat tartalm\u00e1t.","cell_limit":"T\u00fall\u00e9pte a maxim\u00e1lis cellasz\u00e1mot, ami {$cells}.","row_limit":"T\u00fall\u00e9pte a maxim\u00e1lis sorsz\u00e1mot, ami {$rows}.","col_limit":"T\u00fall\u00e9pte a maxim\u00e1lis oszlopsz\u00e1mot, ami {$cols}.",colgroup:"Oszlop csoport",rowgroup:"Sor csoport",scope:"Hat\u00f3k\u00f6r",tfoot:"T\u00e1bl\u00e1zat l\u00e1b",tbody:"T\u00e1bl\u00e1zat test",thead:"T\u00e1bl\u00e1zat fej","row_all":"Minden sor friss\u00edt\u00e9se","row_even":"P\u00e1ros sorok friss\u00edt\u00e9se","row_odd":"P\u00e1ratlan sorok friss\u00edt\u00e9se","row_row":"Sor friss\u00edt\u00e9se","cell_all":"T\u00e1bl\u00e1zat \u00f6sszes cell\u00e1j\u00e1nak friss\u00edt\u00e9se","cell_row":"Sor \u00f6sszes cell\u00e1j\u00e1nak friss\u00edt\u00e9se","cell_cell":"Cella friss\u00edt\u00e9se",th:"Fejl\u00e9c",td:"Adat",summary:"\u00d6sszegz\u00e9s",bgimage:"H\u00e1tt\u00e9rk\u00e9p",rtl:"Jobbr\u00f3l balra",ltr:"Balr\u00f3l jobbra",mime:"C\u00e9l MIME t\u00edpus",langcode:"Nyelvk\u00f3d",langdir:"\u00cdr\u00e1s ir\u00e1ny",style:"St\u00edlus",id:"Id","merge_cells_title":"Cell\u00e1k \u00f6sszevon\u00e1sa",bgcolor:"H\u00e1tt\u00e9rsz\u00edn",bordercolor:"Keretsz\u00edn","align_bottom":"Le","align_top":"Fel",valign:"F\u00fcgg\u0151leges igaz\u00edt\u00e1s","cell_type":"Cellat\u00edpus","cell_title":"Cella tulajdons\u00e1gai","row_title":"Sor tulajdons\u00e1gai","align_middle":"K\u00f6z\u00e9pre","align_right":"Jobbra","align_left":"Balra","align_default":"Alap\u00e9rtelmezett",align:"Igaz\u00edt\u00e1s",border:"Keret",cellpadding:"Cella bels\u0151k\u00f6z",cellspacing:"Cellak\u00f6z",rows:"Sorok",cols:"Oszlopok",height:"Magass\u00e1g",width:"Sz\u00e9less\u00e9g",title:"T\u00e1bl\u00e1zat besz\u00far\u00e1sa/szerkeszt\u00e9se",rowtype:"Sor a t\u00e1bl\u00e1ban","advanced_props":"Halad\u00f3 tulajdons\u00e1gok","general_props":"\u00c1ltal\u00e1nos tulajdons\u00e1gok","advanced_tab":"Halad\u00f3","general_tab":"\u00c1ltal\u00e1nos"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/hy_dlg.js b/js/tiny_mce/plugins/table/langs/hy_dlg.js new file mode 100755 index 000000000..3f1805a26 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"\u0424\u0440\u0435\u0439\u043c",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table",cell_limit:"You\'ve exceeded the maximum number of cells of ($ cells)",row_limit:"You\'ve exceeded the maximum number of rows of ($ rows)",col_limit:"You\'ve exceeded the maximum number of columns of ($ cols)",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"\u041d\u0438\u0436\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u0441\u0438\u043d\u0430",tbody:"\u0422\u0435\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b",thead:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b",row_all:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435",row_even:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435",row_odd:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435",row_row:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443",cell_all:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435",cell_row:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435",cell_cell:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443",th:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",td:"\u0414\u0430\u043d\u043d\u044b\u0435",summary:"\u041e\u0431\u0449\u0435\u0435",bgimage:"\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",mime:"Target MIME-\u0442\u0438\u043f",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430",style:"\u0421\u0442\u0438\u043b\u044c",id:"Id",merge_cells_title:"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438",bgcolor:"\u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430",bordercolor:"\u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b",align_bottom:"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",align_top:"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",valign:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",cell_type:"\u0422\u0438\u043f \u044f\u0447\u0435\u0439\u043a\u0438",cell_title:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044f\u0447\u0435\u0439\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b",row_title:"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b",align_middle:"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",align_right:"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_left:"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_default:"\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",border:"\u0413\u0440\u0430\u043d\u0438\u0446\u0430",cellpadding:"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445",cellspacing:"\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438",rows:"\u0421\u0440\u043e\u043a\u0438",cols:"\u0421\u0442\u043e\u043b\u0431\u0446\u044b",height:"\u0412\u044b\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",title:"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 / \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b",rowtype:"Row in table part",advanced_props:"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430",general_props:"\u041e\u0431\u0449\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430",advanced_tab:"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",general_tab:"\u041e\u0431\u0449\u0435\u0435"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ia_dlg.js b/js/tiny_mce/plugins/table/langs/ia_dlg.js new file mode 100755 index 000000000..3b8f5feaf --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.table_dlg',{rules_border:"\u8fb9\u6846",rules_box:"\u76d2",rules_vsides:"\u5782\u76f4\u5927\u5c0f",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"\u6c34\u5e73\u5927\u5c0f",rules_below:"\u4e4b\u4e0b",rules_above:"\u4e4b\u4e0a",rules_void:"\u7a7a",rules:"\u6807\u5c3a",frame_all:"\u5168\u90e8",frame_cols:"\u5217",frame_rows:"\u884c",frame_groups:"\u7ec4",frame_none:"\u65e0",frame:"\u8fb9\u6846",caption:"\u8868\u683c\u6807\u9898",missing_scope:"\u60a8\u786e\u5b9a\u4e0d\u6307\u5b9a\u8868\u5934\u50a8\u5b58\u683c\u7684\u8303\u56f4\u5417\uff1f\u5982\u679c\u4e0d\u6307\u5b9a\uff0c\u90e8\u5206\u4f7f\u7528\u8005\u5c06\u5f88\u96be\u67e5\u770b\u8868\u683c\u5185\u5bb9",cell_limit:"\u5df2\u8d85\u8fc7\u9650\u5236\uff0c\u6700\u591a\u4e3a{$cells} \u50a8\u5b58\u683c\u3002",row_limit:"\u5df2\u8d85\u8fc7\u9650\u5236\uff0c\u6700\u591a\u4e3a {$rows} \u884c\u3002",col_limit:"\u5df2\u8d85\u8fc7\u9650\u5236\uff0c\u6700\u591a\u4e3a {$cols} \u5217\u3002",colgroup:"\u5217\u7ec4",rowgroup:"\u884c\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u811a",tbody:"\u8868\u4f53",thead:"\u8868\u5934",row_all:"\u66f4\u65b0\u8868\u683c\u7684\u5168\u90e8\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6570\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6570\u884c",row_row:"\u66f4\u65b0\u6240\u5728\u884c",cell_all:"\u66f4\u65b0\u5168\u90e8\u50a8\u5b58\u683c",cell_row:"\u66f4\u65b0\u5f53\u524d\u884c\u7684\u50a8\u5b58\u683c",cell_cell:"\u66f4\u65b0\u76ee\u524d\u7684\u50a8\u5b58\u683c",th:"\u8868\u5934",td:"\u8868\u683c",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",mime:"\u76ee\u6807 MIME \u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"Id",merge_cells_title:"\u5408\u5e76\u50a8\u5b58\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272",align_bottom:"\u5e95\u90e8",align_top:"\u9876\u90e8",valign:"\u5782\u76f4\u5bf9\u9f50\u65b9\u5f0f",cell_type:"\u50a8\u5b58\u683c \u7c7b\u522b",cell_title:"\u50a8\u5b58\u683c \u5c5e\u6027",row_title:"\u884c \u5c5e\u6027",align_middle:"\u5c45\u4e2d",align_right:"\u5c45\u53f3",align_left:"\u5c45\u5de6",align_default:"\u9ed8\u8ba4",align:"\u5bf9\u9f50\u65b9\u5f0f",border:"\u8fb9\u6846",cellpadding:"\u50a8\u5b58\u683c\u5185\u8ddd",cellspacing:"\u50a8\u5b58\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u5217\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91 \u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",general_props:"\u57fa\u672c \u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",general_tab:"\u57fa\u672c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/id_dlg.js b/js/tiny_mce/plugins/table/langs/id_dlg.js new file mode 100755 index 000000000..d14fd155b --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Yakin ingin melanjutkan tanpa menetapkan cakupan sel header tabel ini. Tanpa itu, mungkin sulit bagi beberapa pengguna yang memiliki keterbatasan untuk memahami isi atau data yang ditampilkan dari tabel.",cell_limit:"Anda telah melebihi jumlah maksimum cell {$cells}.",row_limit:"Anda telah melebihi jumlah maksimum row {$rows}.",col_limit:"Anda telah melebihi jumlah maksimum kolom {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Gambar Background",rtl:"Kanan ke kiri",ltr:"Kiri ke kanan",mime:"Target MIME type",langcode:"Kode Bahasa",langdir:"Bahasa",style:"Style",id:"Id",merge_cells_title:"Merge cell tabel",bgcolor:"Warna Background",bordercolor:"Warna Border",align_bottom:"Bawah",align_top:"Atas",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Properti cell tabel",row_title:"Properti row tabel",align_middle:"Tengah",align_right:"Kanan",align_left:"Kiri",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Tinggi",width:"Lebar",title:"Sisipkan/Ubah Tabel",rowtype:"Row in table part",advanced_props:"Properti Advanced",general_props:"Properti Umum",advanced_tab:"Advanced",general_tab:"Umum"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ii_dlg.js b/js/tiny_mce/plugins/table/langs/ii_dlg.js new file mode 100755 index 000000000..21d028198 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ii_dlg.js @@ -0,0 +1,74 @@ +tinyMCE.addI18n('ii.table_dlg',{ +general_tab:"\u4E00\u822C", +advanced_tab:"\u9AD8\u7EA7", +general_props:"\u4E00\u822C\u5C5E\u6027", +advanced_props:"\u9AD8\u7EA7\u5C5E\u6027", +rowtype:"\u884C\u6240\u5728\u7684\u8868\u683C\u4F4D\u7F6E", +title:"\u63D2\u5165/\u7F16\u8F91\u8868\u683C", +width:"\u5BBD\u5EA6", +height:"\u9AD8\u5EA6", +cols:"\u5217\u6570", +rows:"\u884C\u6570", +cellspacing:"\u50A8\u5B58\u683C\u95F4\u8DDD", +cellpadding:"\u50A8\u5B58\u683C\u7559\u767D", +border:"\u8FB9\u6846", +align:"\u5BF9\u9F50\u65B9\u5F0F", +align_default:"\u9884\u8BBE", +align_left:"\u9760\u5DE6", +align_right:"\u9760\u53F3", +align_middle:"\u5C45\u4E2D", +row_title:"\u884C\u5C5E\u6027", +cell_title:"\u50A8\u5B58\u683C\u5C5E\u6027", +cell_type:"\u50A8\u5B58\u683C\u522B", +valign:"\u6C34\u51C6\u5BF9\u9F50\u65B9\u5F0F", +align_top:"\u4E0A\u65B9", +align_bottom:"\u4E0B\u65B9", +bordercolor:"\u8FB9\u6846\u989C\u8272", +bgcolor:"\u80CC\u666F\u989C\u8272", +merge_cells_title:"\u5408\u5E76\u50A8\u5B58\u683C", +id:"Id", +style:"\u6837\u5F0F", +langdir:"\u8BED\u8A00\u4E66\u5199\u65B9\u5411", +langcode:"\u8BED\u8A00\u7F16\u7801", +mime:"\u76EE\u6807MIME\u7C7B\u578B", +ltr:"\u7531\u5DE6\u5230\u53F3", +rtl:"\u7531\u53F3\u5230\u5DE6", +bgimage:"\u80CC\u666F\u56FE\u7247", +summary:"\u6982\u8981", +td:"\u6570\u636E", +th:"\u8868\u5934", +cell_cell:"\u66F4\u65B0\u6240\u7684\u50A8\u5B58\u683C", +cell_row:"\u66F4\u65B0\u6240\u5728\u884C\u7684\u5168\u90E8\u50A8\u5B58\u683C", +cell_all:"\u66F4\u65B0\u8868\u683C\u5185\u7684\u5168\u90E8\u50A8\u5B58\u683C", +row_row:"\u66F4\u65B0\u6240\u5728\u884C", +row_odd:"\u66F4\u65B0\u8868\u683C\u5185\u7684\u5947\u6570\u884C", +row_even:"\u66F4\u65B0\u8868\u683C\u5185\u7684\u5076\u6570\u884C", +row_all:"\u66F4\u65B0\u8868\u683C\u5185\u5168\u90E8\u884C", +thead:"\u8868\u5934", +tbody:"\u8868\u8EAB", +tfoot:"\u8868\u5C3E", +scope:"\u8303\u56F4", +rowgroup:"\u884C\u7FA4\u7EC4", +colgroup:"\u5217\u7FA4\u7EC4", +col_limit:"\u5DF2\u8D85\u8FC7\u53EF\u7528\u6570\uFF0C\u6700\u9AD8\u7684\u5217\u6570\u4E3A{$cols}\u5217\u3002", +row_limit:"\u5DF2\u8D85\u8FC7\u53EF\u7528\u6570\uFF0C\u6700\u9AD8\u7684\u884C\u6570\u4E3A{$rows}\u884C\u3002", +cell_limit:"\u5DF2\u8D85\u8FC7\u53EF\u7528\u6570\uFF0C\u6700\u9AD8\u7684\u50A8\u5B58\u683C\u6570\u4E3A{$cells}\u683C\u3002", +missing_scope:"\u6807\u9898\u884C\u7F3A\u5931\uFF01", +caption:"\u8868\u683C\u6807\u9898", +frame:"\u8FB9\u6846", +frame_none:"\u65E0", +frame_groups:"\u7FA4\u7EC4", +frame_rows:"\u884C", +frame_cols:"\u5217", +frame_all:"\u5168\u90E8", +rules:"\u7EBF\u6761", +rules_void:"\u7A7A", +rules_above:"\u4E0A", +rules_below:"\u4E0B", +rules_hsides:"\u6C34\u51C6\u8FB9", +rules_lhs:"\u5DE6\u8FB9", +rules_rhs:"\u53F3\u8FB9", +rules_vsides:"\u5782\u76F4\u8FB9", +rules_box:"\u76D2\u578B", +rules_border:"\u5916\u6846" +}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/is_dlg.js b/js/tiny_mce/plugins/table/langs/is_dlg.js new file mode 100755 index 000000000..b2fb158ad --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.table_dlg',{rules_border:"rammi",rules_box:"box",rules_vsides:"vsides",rules_rhs:"hhl",rules_lhs:"vhl",rules_hsides:"hli\u00f0ar",rules_below:"ne\u00f0an",rules_above:"ofan",rules_void:"\u00f3gilt",rules:"Rules",frame_all:"allt",frame_cols:"d\u00e1lkar",frame_rows:"ra\u00f0ir",frame_groups:"h\u00f3par",frame_none:"ekkert",frame:"rammi",caption:"T\u00f6fluval",missing_scope:"Ertu viss um a\u00f0 \u00fe\u00fa viljir halda \u00e1fram \u00e1n \u00feess a\u00f0 skilgreina innihaldi\u00f0 fyrir \u00feessa t\u00f6flu fyrirs\u00f6gn. \u00c1n hennar getur veri\u00f0 erfitt fyrir suma notendur me\u00f0 h\u00f6mlun a\u00f0 skilja innihaldi\u00f0 e\u00f0a \u00fea\u00f0 efni sem er til sta\u00f0ar \u00ed t\u00f6flunni.",cell_limit:"\u00de\u00fa ert komin yfir leyfilegan fj\u00f6lda reita {$cells}.",row_limit:"\u00de\u00fa ert komin yfir leyfilegna fj\u00f6lda ra\u00f0a {$rows}.",col_limit:"\u00de\u00fa ert komin yfir leyfilegan fj\u00f6lda d\u00e1lka {$cols}.",colgroup:"D\u00e1lkah\u00f3pur",rowgroup:"Ra\u00f0arh\u00f3pur",scope:"Umfang",tfoot:"T\u00f6fluf\u00f3tur",tbody:"T\u00f6flusv\u00e6\u00f0i",thead:"Fyrirs\u00f6gn t\u00f6flu",row_all:"Uppf\u00e6ra allar ra\u00f0ir \u00ed t\u00f6flunni",row_even:"Uppf\u00e6ra sl\u00e9ttra\u00f0ir",row_odd:"Uppf\u00e6ra oodara\u00f0ir",row_row:"Uppf\u00e6ra n\u00faverandi r\u00f6\u00f0",cell_all:"Uppf\u00e6ra alla reiti i t\u00f6flunni",cell_row:"Uppf\u00e6ra alla reiti \u00ed r\u00f6\u00f0inni",cell_cell:"Uppf\u00e6ra n\u00faverandi reit",th:"Fyrirs\u00f6gn",td:"G\u00f6gn",summary:"Yfirlit",bgimage:"Bakgrunnsmynd",rtl:"Fr\u00e1 h\u00e6gri til vinstri",ltr:"Fr\u00e1 vinstri til h\u00e6gri",mime:"Velja MIME tegund",langcode:"Tungum\u00e1la k\u00f3\u00f0i",langdir:"Tungum\u00e1la \u00e1tt",style:"St\u00edll",id:"id",merge_cells_title:"Sameina reiti",bgcolor:"Bakgrunnslitur",bordercolor:"Rammalitur",align_bottom:"Ne\u00f0st",align_top:"Efst",valign:"L\u00f3\u00f0r\u00e9tt j\u00f6fnun",cell_type:"Reitartegund",cell_title:"Eiginleikar reits",row_title:"Eiginleikar ra\u00f0ar",align_middle:"Mi\u00f0ja",align_right:"H\u00e6gri",align_left:"Vinstri",align_default:"St\u00f6\u00f0lu\u00f0",align:"J\u00f6fnun",border:"Rammi",cellpadding:"Reita \u00f6ndun",cellspacing:"Reitabil",rows:"Ra\u00f0ir",cols:"Cols",height:"H\u00e6\u00f0",width:"Breidd",title:"Setja inn/Breyta t\u00f6flu",rowtype:"R\u00f6\u00f0 \u00ed t\u00f6fluhluta",advanced_props:"Frekari eiginleikar",general_props:"Almennir eiginleikar",advanced_tab:"N\u00e1nar",general_tab:"Almennt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/it_dlg.js b/js/tiny_mce/plugins/table/langs/it_dlg.js new file mode 100755 index 000000000..35bc2d95f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.table_dlg',{rules_border:"bordo",rules_box:"box",rules_vsides:"lato vert.",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"lato orizz.",rules_below:"sotto",rules_above:"sopra",rules_void:"vuoto",rules:"Regole",frame_all:"tutte",frame_cols:"colonne",frame_rows:"righe",frame_groups:"gruppi",frame_none:"nessuna",frame:"Cornice",caption:"Table caption",missing_scope:"Sicuro di proseguire senza aver specificato uno scope per l\'intestazione di questa tabella? Senza di esso, potrebbe essere difficoltoso per alcuni utenti con disabilit\u00e0 capire il contenuto o i dati mostrati nella tabella.",cell_limit:"Superato il numero massimo di celle di {$cells}.",row_limit:"Superato il numero massimo di righe di {$rows}.",col_limit:"Superato il numero massimo di colonne di {$cols}.",colgroup:"Gruppo colonna",rowgroup:"Gruppo riga",scope:"Scope",tfoot:"Pedice tabella",tbody:"Corpo tabella",thead:"Intestazione tabella",row_all:"Update tutte le righe della tabella",row_even:"Aggiorna righe pari della tabella",row_odd:"Aggiorna righe dispari della tabella",row_row:"Aggiorna riga corrente",cell_all:"Aggiorna tutte le celle della tabella",cell_row:"Aggiorna tutte le celle della riga",cell_cell:"Aggiorna cella corrente",th:"Intestazione",td:"Data",summary:"Sommario",bgimage:"Immagine sfondo",rtl:"Destra verso sinistra",ltr:"Sinistra verso destra",mime:"Tipo MIME del target",langcode:"Lingua",langdir:"Direzione testo",style:"Stile",id:"Id",merge_cells_title:"Unisci celle",bgcolor:"Colore sfondo",bordercolor:"Colore bordo",align_bottom:"In basso",align_top:"In alto",valign:"Allineamento verticale",cell_type:"Tipo cella",cell_title:"Propriet\u00e0 cella",row_title:"Propriet\u00e0 riga",align_middle:"Centra",align_right:"A destra",align_left:"A sinistra",align_default:"Predefinito",align:"Allineamento",border:"Bordo",cellpadding:"Padding celle",cellspacing:"Spaziatura celle",rows:"Righe",cols:"Colonne",height:"Altezza",width:"Larghezza",title:"Inserisci/Modifica tabella",rowtype:"Riga in una parte di tabella",advanced_props:"Propriet\u00e0 avanzate",general_props:"Propriet\u00e0 generali",advanced_tab:"Avanzate",general_tab:"Generale"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ja_dlg.js b/js/tiny_mce/plugins/table/langs/ja_dlg.js new file mode 100755 index 000000000..b79166a01 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.table_dlg',{"rules_border":"\u4e0a\u4e0b\u5de6\u53f3(border)","rules_box":"\u4e0a\u4e0b\u5de6\u53f3(box)","rules_vsides":"\u5de6\u53f3","rules_rhs":"\u53f3","rules_lhs":"\u5de6","rules_hsides":"\u4e0a\u4e0b","rules_below":"\u4e0b","rules_above":"\u4e0a","rules_void":"\u306a\u3057",rules:"\u8868\u306e\u5916\u67a0","frame_all":"\u5168\u3066","frame_cols":"\u5217","frame_rows":"\u884c","frame_groups":"\u30b0\u30eb\u30fc\u30d7\u6bce","frame_none":"\u306a\u3057",frame:"\u30bb\u30eb\u67a0\u7dda",caption:"\u8868\u306b\u898b\u51fa\u3057\u3092\u4ed8\u3051\u308b","missing_scope":"\u8868\u306e\u30b9\u30b3\u30fc\u30d7\u5c5e\u6027\u3092\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u305b\u3093\u304c\u3088\u308d\u3057\u3044\u3067\u3059\u304b\uff1f","cell_limit":"\u30bb\u30eb\u306e\u6700\u5927\u6570\u3092\u8d85\u3048\u307e\u3057\u305f\u3002","row_limit":"\u884c\u306e\u6700\u5927\u6570\u3092\u8d85\u3048\u307e\u3057\u305f\u3002","col_limit":"\u5217\u306e\u6700\u5927\u6570\u3092\u8d85\u3048\u307e\u3057\u305f\u3002",colgroup:"\u5217\u30b0\u30eb\u30fc\u30d7",rowgroup:"\u884c\u30b0\u30eb\u30fc\u30d7",scope:"\u30b9\u30b3\u30fc\u30d7",tfoot:"\u8868\u30d5\u30c3\u30bf",tbody:"\u8868\u30dc\u30c7\u30a3",thead:"\u8868\u30d8\u30c3\u30c0","row_all":"\u5168\u3066\u306e\u884c\u306e\u66f4\u65b0","row_even":"\u5076\u6570\u884c\u306e\u66f4\u65b0","row_odd":"\u5947\u6570\u884c\u306e\u66f4\u65b0","row_row":"\u9078\u629e\u884c\u306e\u66f4\u65b0","cell_all":"\u5168\u3066\u306e\u30bb\u30eb\u306e\u66f4\u65b0","cell_row":"\u884c\u5185\u306e\u30bb\u30eb\u306e\u66f4\u65b0","cell_cell":"\u9078\u629e\u30bb\u30eb\u306e\u66f4\u65b0",th:"\u30d8\u30c3\u30c0",td:"\u30c7\u30fc\u30bf",summary:"\u30b5\u30de\u30ea\u30fc",bgimage:"\u80cc\u666f\u753b\u50cf",rtl:"\u53f3\u304b\u3089\u5de6",ltr:"\u5de6\u304b\u3089\u53f3",mime:"\u30bf\u30fc\u30b2\u30c3\u30c8\u306eMIME\u30bf\u30a4\u30d7",langcode:"\u8a00\u8a9e\u30b3\u30fc\u30c9",langdir:"\u6587\u7ae0\u306e\u65b9\u5411",style:"\u30b9\u30bf\u30a4\u30eb",id:"ID","merge_cells_title":"\u30bb\u30eb\u306e\u7d50\u5408",bgcolor:"\u80cc\u666f\u8272",bordercolor:"\u67a0\u7dda\u306e\u8272","align_bottom":"\u4e0b\u63c3\u3048","align_top":"\u4e0a\u63c3\u3048",valign:"\u5782\u76f4\u65b9\u5411\u306e\u914d\u7f6e","cell_type":"\u30bb\u30eb\u7a2e\u5225","cell_title":"\u30bb\u30eb\u306e\u30d7\u30ed\u30d1\u30c6\u30a3","row_title":"\u884c\u306e\u30d7\u30ed\u30d1\u30c6\u30a3","align_middle":"\u4e2d\u592e\u63c3\u3048","align_right":"\u53f3\u63c3\u3048","align_left":"\u5de6\u63c3\u3048","align_default":"\u30c7\u30d5\u30a9\u30eb\u30c8",align:"\u914d\u7f6e",border:"\u67a0\u7dda",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"\u884c",cols:"\u5217",height:"\u9ad8\u3055",width:"\u5e45",title:"\u8868\u306e\u633f\u5165/\u7de8\u96c6",rowtype:"\u884c","advanced_props":"\u4e0a\u7d1a\u8005\u5411\u3051","general_props":"\u4e00\u822c","advanced_tab":"\u4e0a\u7d1a\u8005\u5411\u3051","general_tab":"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ka_dlg.js b/js/tiny_mce/plugins/table/langs/ka_dlg.js new file mode 100755 index 000000000..757007531 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.table_dlg',{rules_border:"\u10e1\u10d0\u10d6\u10e6\u10d5\u10d0\u10e0\u10d8",rules_box:"\u10d9\u10dd\u10da\u10dd\u10e4\u10d8",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"wesebi",frame_all:"\u10e7\u10d5\u10d4\u10da\u10d0",frame_cols:"\u10e1\u10d5\u10d4\u10e2\u10d4\u10d1\u10d8",frame_rows:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d4\u10d1\u10d8",frame_groups:"\u10ef\u10d2\u10e3\u10e4\u10d4\u10d1\u10d8",frame_none:"none",frame:"\u10d9\u10d0\u10d3\u10e0\u10d8",caption:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",missing_scope:"\u10d7\u10e3 \u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8 \u10d0\u10e0 \u10d8\u10e5\u10dc\u10d4\u10d1\u10d0 \u10db\u10d8\u10d7\u10d8\u10d7\u10d4\u10d1\u10e3\u10da\u10d8, \u10e8\u10d4\u10d8\u10eb\u10da\u10d4\u10d1\u10d0 \u10e7\u10d5\u10d4\u10da\u10d0\u10db \u10d5\u10d4\u10e0 \u10dc\u10d0\u10ee\u10dd\u10e1 \u10d8\u10dc\u10e4\u10dd\u10e0\u10db\u10d0\u10ea\u10d8\u10d0.",cell_limit:"\u10db\u10d8\u10e6\u10ec\u10d4\u10e3\u10da\u10d8\u10d0 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10d6\u10e6\u10d5\u10d0\u10e0\u10d8, $ \u10e3\u10ef\u10e0\u10d0.",row_limit:"\u10db\u10d8\u10e6\u10ec\u10d4\u10e3\u10da\u10d8\u10d0 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10d6\u10e6\u10d5\u10d0\u10e0\u10d8, $ \u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d8.",col_limit:"\u10db\u10d8\u10e6\u10ec\u10d4\u10e3\u10da\u10d8\u10d0 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10d6\u10e6\u10d5\u10d0\u10e0\u10d8, $ \u10e1\u10d5\u10d4\u10e2\u10d8.",colgroup:"\u10e1\u10d5\u10d4\u10e2\u10d4\u10d1\u10d8\u10e1 \u10ef\u10d2\u10e3\u10e4\u10d8",rowgroup:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d4\u10d1\u10d8\u10e1 \u10ef\u10d2\u10e3\u10e4\u10d8",scope:"\u10db\u10d8\u10d3\u10d0\u10db\u10dd",tfoot:"\u10d3\u10d0\u10e1\u10e0\u10e3\u10da\u10d4\u10d1\u10d0",tbody:"\u10e1\u10ee\u10d4\u10e3\u10da\u10d8",thead:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",row_all:"\u10ea\u10ee\u10e0\u10d8\u10da\u10e1\u10d8 \u10e7\u10d5\u10d4\u10da\u10d0 \u10e3\u10ef\u10e0\u10d8\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",row_even:"\u10ea\u10ee\u10e0\u10d8\u10da\u10e8\u10d8 \u10da\u10e3\u10ec\u10d8\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d4\u10d1\u10d8\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",row_odd:"\u10ea\u10ee\u10e0\u10e3\u10da\u10e1\u10d8 \u10d9\u10d4\u10dc\u10e2\u10d8 \u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d4\u10d1\u10d8\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",row_row:"\u10db\u10dd\u10ea\u10d4\u10db\u10e3\u10da\u10d8 \u10e1\u10e2\u10d8\u10e0\u10e5\u10dd\u10dc\u10d8\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",cell_all:"\u10ea\u10ee\u10e0\u10d8\u10da\u10e1\u10d8 \u10e7\u10d5\u10d4\u10da\u10d0 \u10e3\u10ef\u10e0\u10d8\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",cell_row:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10e8\u10d8 \u10e7\u10d5\u10d4\u10da\u10d0 \u10e3\u10ef\u10e0\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",cell_cell:"\u10db\u10dd\u10ea\u10d4\u10db\u10e3\u10da\u10d8 \u10e3\u10ef\u10e0\u10d8\u10e1 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d0",th:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",td:"\u10db\u10dd\u10dc\u10d0\u10ea\u10d4\u10db\u10d4\u10d1\u10d8",summary:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd",bgimage:"\u10e4\u10dd\u10dc\u10e3\u10e0\u10d8 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10ee\u10e3\u10da\u10d1\u10d0",rtl:"\u10db\u10d0\u10e0\u10d5\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d5",ltr:"\u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d5",mime:"MIME \u10db\u10d8\u10d6\u10dc\u10d8\u10e1 \u10e2\u10d8\u10de\u10d8",langcode:"\u10d4\u10dc\u10d8\u10e1 \u10d9\u10dd\u10d3\u10d8",langdir:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10db\u10d8\u10db\u10d0\u10e0\u10d7\u10e3\u10da\u10d4\u10d1\u10d0",style:"\u10e1\u10e2\u10d8\u10da\u10d8",id:"\u10e1\u10d0\u10ee\u10d4\u10da\u10d8",merge_cells_title:"\u10e3\u10ef\u10e0\u10d4\u10d1\u10d8\u10e1 \u10d2\u10d0\u10d4\u10e0\u10d7\u10d8\u10d0\u10dc\u10d4\u10d1\u10d0",bgcolor:"\u10e8\u10d4\u10d5\u10e1\u10d4\u10d1\u10d8\u10e1 \u10e4\u10d4\u10e0\u10d8",bordercolor:"\u10e1\u10d0\u10d6\u10e6\u10d5\u10e0\u10d4\u10d1\u10d8\u10e1 \u10e4\u10d4\u10e0\u10d8",align_bottom:"\u10e5\u10d5\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_top:"\u10d6\u10d4\u10d3\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",valign:"\u10d5\u10d4\u10e0\u10e2\u10d8\u10d9\u10d0\u10da\u10e3\u10e0\u10d8 \u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",cell_type:"\u10e2\u10d8\u10de\u10d8",cell_title:"\u10e3\u10ef\u10e0\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",row_title:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",align_middle:"\u10ea\u10d4\u10dc\u10e2\u10e0\u10d6\u10d4",align_right:"\u10db\u10d0\u10e0\u10ef\u10d5\u10d4\u10dc\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_left:"\u10db\u10d0\u10e0\u10ea\u10ee\u10d4\u10dc\u10d0 \u10d9\u10d8\u10d3\u10d4\u10d6\u10d4",align_default:"\u10e1\u10d0\u10ec\u10d8\u10e1\u10d0\u10d3",align:"\u10d2\u10d0\u10e1\u10ec\u10dd\u10e0\u10d4\u10d1\u10d0",border:"\u10e1\u10d0\u10d6\u10e6\u10d5\u10d0\u10e0\u10d8",cellpadding:"\u10e3\u10ef\u10e0\u10d4\u10d1\u10e1 \u10e8\u10dd\u10e0\u10d8\u10e1 \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",cellspacing:"\u10e3\u10ef\u10e0\u10d4\u10d1\u10e1 \u10e8\u10dd\u10e0\u10d8\u10e1 \u10d3\u10d0\u10e8\u10dd\u10e0\u10d4\u10d1\u10d0",rows:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d4\u10d1\u10d8",cols:"\u10e1\u10d5\u10d4\u10e2\u10d4\u10d1\u10d8",height:"\u10e1\u10d8\u10db\u10d0\u10e6\u10da\u10d4",width:"\u10e1\u10d8\u10d2\u10d0\u10dc\u10d4",title:"\u10ea\u10ee\u10e0\u10d8\u10da\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",rowtype:"\u10e1\u10e2\u10e0\u10d8\u10e5\u10dd\u10dc\u10d8\u10e1 \u10e0\u10d8\u10de\u10d8",advanced_props:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7\u10d8 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",general_props:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",advanced_tab:"\u10d3\u10d0\u10db\u10d0\u10e2\u10d4\u10d1\u10d8\u10d7",general_tab:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/kl_dlg.js b/js/tiny_mce/plugins/table/langs/kl_dlg.js new file mode 100755 index 000000000..0370cd248 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/km_dlg.js b/js/tiny_mce/plugins/table/langs/km_dlg.js new file mode 100755 index 000000000..3f6c38952 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.table_dlg',{rules_border:"\u179f\u17ca\u17bb\u1798",rules_box:"\u1794\u17d2\u179a\u17a2\u1794\u17cb",rules_vsides:"\u1782\u17c2\u1798\u1794\u1789\u17d2\u1788\u179a",rules_rhs:"\u1782\u17c2\u1798\u179f\u17d2\u178a\u17b6\u17c6",rules_lhs:"\u1782\u17c2\u1798\u1786\u17d2\u179c\u17c1\u1784",rules_hsides:"\u1782\u17c2\u1798\u1795\u17d2\u178a\u17c1\u1780",rules_below:"\u1780\u17d2\u179a\u17c4\u1798",rules_above:"\u179b\u17be",rules_void:"\u1791\u17b8\u1785\u17c6\u17a0",rules:"\u1785\u17d2\u1794\u17b6\u1794\u17cb",frame_all:"\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb",frame_cols:"\u1785\u17c6\u1793\u17bd\u1793\u1787\u17bd\u179a\u1788\u179a",frame_rows:"\u1785\u17c6\u1793\u17bd\u1793\u1787\u17bd\u179a\u1795\u17d2\u178a\u17c1\u1780",frame_groups:"\u1780\u17d2\u179a\u17bb\u1798",frame_none:"\u1782\u17d2\u1798\u17b6\u1793",frame:"\u179f\u1793\u17d2\u179b\u17b9\u1780",caption:"\u1785\u17c6\u178e\u1784\u1787\u17be\u1784\u178f\u17bc\u1785\u178f\u17b6\u179a\u17b6\u1784",missing_scope:"\u17a2\u17d2\u1793\u1780\u1794\u17d2\u179a\u17b6\u1780\u178a\u1787\u17b6\u1785\u1784\u17cb\u1794\u1793\u17d2\u178f\u178a\u17c4\u1799\u1798\u17b7\u1793\u1794\u17b6\u1793\u1780\u17c6\u178e\u178f\u17cb\u179c\u17b7\u179f\u17b6\u179b\u1797\u17b6\u1796\u179f\u1798\u17d2\u179a\u17b6\u1794\u17cb\u1780\u17d2\u179a\u17a1\u17b6\u1780\u17d2\u1794\u17b6\u179b\u17ac? \u1794\u17be\u1782\u17d2\u1798\u17b6\u1793\u179c\u17b6 \u1782\u17ba\u17a2\u17b6\u1785\u1787\u17b6\u1780\u17b6\u179a\u179b\u17c6\u1794\u17b6\u1780\u179f\u1798\u17d2\u179a\u17b6\u1794\u17cb\u17a2\u17d2\u1793\u1780\u1794\u17d2\u179a\u17be\u1794\u17d2\u179a\u17b6\u179f\u17cb\u17a2\u179f\u1798\u178f\u17d2\u1790\u1797\u17b6\u1796\u1798\u17bd\u1799\u1785\u17c6\u1793\u17bd\u1793\u1780\u17d2\u1793\u17bb\u1784\u1780\u17b6\u179a\u1799\u179b\u17cb\u17a2\u178f\u17d2\u1790\u1793\u17d0\u1799 \u17ac\u1791\u17b7\u1793\u17d2\u1793\u1793\u17d0\u1799\u178a\u17c2\u179b\u1794\u1784\u17d2\u17a0\u17b6\u1789\u1780\u17d2\u1793\u17bb\u1784\u178f\u17b6\u179a\u17b6\u1784\u1798\u17bd\u1799\u1793\u17c1\u17c7 \u17d4",cell_limit:"\u17a2\u17d2\u1793\u1780\u1794\u17b6\u1793\u1792\u17d2\u179c\u17be\u179b\u17be\u179f\u1785\u17c6\u1793\u17bd\u1793\u17a2\u178f\u17b7\u1794\u179a\u1798\u17b6{$cells}\u1793\u17c3\u1780\u17d2\u179a\u17a1\u17b6\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb\u00a0\u17d4",row_limit:"\u17a2\u17d2\u1793\u1780\u1794\u17b6\u1793\u1792\u17d2\u179c\u17be\u179b\u17be\u179f\u1785\u17c6\u1793\u17bd\u1793\u17a2\u178f\u17b7\u1794\u179a\u1798\u17b6{$rows}\u1793\u17c3\u1787\u17bd\u179a\u178a\u17c1\u1780\u00a0\u17d4",col_limit:"\u17a2\u17d2\u1793\u1780\u1794\u17b6\u1793\u1792\u17d2\u179c\u17be\u179b\u17be\u179f\u1785\u17c6\u1793\u17bd\u1793\u17a2\u178f\u17b7\u1794\u179a\u1798\u17b6{$cols}\u1793\u17c3\u1787\u17bd\u179a\u1788\u179a\u00a0\u17d4",colgroup:"\u1780\u17d2\u179a\u17bb\u1798\u1787\u17bd\u179a\u1788\u179a",rowgroup:"\u1780\u17d2\u179a\u17bb\u1798\u1787\u17bd\u179a\u178a\u17c1\u1780",scope:"\u179c\u17b7\u179f\u17b6\u179b\u1797\u17b6\u1796",tfoot:"\u1787\u17be\u1784\u178f\u17b6\u179a\u17b6\u1784",tbody:"\u178f\u17bd\u178f\u17b6\u179a\u17b6\u1784",thead:"\u1780\u17d2\u1794\u17b6\u179b\u178f\u17b6\u179a\u17b6\u1784",row_all:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1787\u17bd\u179a\u178a\u17c1\u1780\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb\u1780\u17d2\u1793\u17bb\u1784\u178f\u17b6\u179a\u17b6\u1784",row_even:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1787\u17bd\u179a\u178a\u17c1\u1780\u1782\u17bc\u179a\u1791\u17b6\u17c6\u1784\u17a1\u17b6\u1799\u1780\u17d2\u1793\u17bb\u1784\u178f\u17b6\u179a\u17b6\u1784",row_odd:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1787\u17bd\u179a\u178a\u17c1\u1780\u179f\u17c1\u179f\u1791\u17b6\u17c6\u1784\u17a1\u17b6\u1799\u1780\u17d2\u1793\u17bb\u1784\u178f\u17b6\u179a\u17b6\u1784",row_row:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1787\u17bd\u179a\u178a\u17c1\u1780\u1794\u1785\u17d2\u1785\u17bb\u1794\u17d2\u1794\u1793\u17d2\u1793",cell_all:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1780\u17d2\u179a\u17a1\u17b6\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb\u1780\u17d2\u1793\u17bb\u1784\u178f\u17b6\u179a\u17b6\u1784",cell_row:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1780\u17d2\u179a\u17a1\u17b6\u1791\u17b6\u17c6\u1784\u17a2\u179f\u17cb\u1780\u17d2\u1793\u17bb\u1784\u1787\u17bd\u179a\u178a\u17c1\u1780",cell_cell:"\u1794\u1793\u17d2\u1791\u17b6\u1793\u17cb\u179f\u1798\u17d0\u1799\u1780\u17d2\u179a\u17a1\u17b6\u1794\u1785\u17d2\u1785\u17bb\u1794\u17d2\u1794\u1793\u17d2\u1793",th:"\u1780\u17d2\u1794\u17b6\u179b\u178f\u17b6\u179a\u17b6\u1784",td:"\u1791\u17b7\u1793\u17d2\u1793\u1793\u17d0\u1799",summary:"\u179f\u1784\u17d2\u1781\u17c1\u1794",bgimage:"\u179a\u17bc\u1794\u1797\u17b6\u1796\u1795\u17d2\u1791\u17c3\u1781\u17b6\u1784\u1780\u17d2\u179a\u17c4\u1799",rtl:"\u1796\u17b8\u179f\u17d2\u178f\u17b6\u17c6\u1791\u17c5\u1786\u17d2\u179c\u17c1\u1784",ltr:"\u1796\u17b8\u1786\u17d2\u179c\u17c1\u1784\u1791\u17c5\u179f\u17d2\u178a\u17b6\u17c6",mime:"\u1794\u17d2\u179a\u1797\u17c1\u1791\u1782\u17c4\u179b\u178a\u17c5 MIME",langcode:"\u1780\u17bc\u178a\u1797\u17b6\u179f\u17b6",langdir:"\u1791\u17b7\u179f\u178a\u17c5\u1797\u17b6\u179f\u17b6",style:"\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798",id:"\u179b\u179f.",merge_cells_title:"\u179a\u17c6\u179b\u17b6\u1799\u1780\u17d2\u179a\u17a1\u17b6\u178f\u17b6\u179a\u17b6\u1784\u1794\u1789\u17d2\u1785\u17bc\u179b\u1782\u17d2\u1793\u17b6",bgcolor:"\u1796\u178e\u17cc\u1795\u17d2\u1791\u17c3\u1781\u17b6\u1784\u1780\u17d2\u179a\u17c4\u1799",bordercolor:"\u1796\u178e\u17cc\u179f\u17ca\u17bb\u1798",align_bottom:"\u1794\u17b6\u178f",align_top:"\u1780\u17c6\u1796\u17bc\u179b",valign:"\u1780\u17b6\u179a\u178f\u1798\u17d2\u179a\u17b9\u1798\u1794\u1789\u17d2\u1788\u179a",cell_type:"\u1794\u17d2\u179a\u1797\u17c1\u1791\u1780\u17d2\u179a\u17a1\u17b6",cell_title:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1780\u17d2\u179a\u17a1\u17b6\u178f\u17b6\u179a\u17b6\u1784",row_title:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1787\u17bd\u179a\u178a\u17c1\u1780\u178f\u17b6\u179a\u17b6\u1784",align_middle:"\u1780\u178e\u17d2\u178a\u17b6\u179b",align_right:"\u179f\u17d2\u178a\u17b6\u17c6",align_left:"\u1786\u17d2\u179c\u17c1\u1784",align_default:"\u179b\u17c6\u1793\u17b6\u17c6\u178a\u17be\u1798",align:"\u1780\u17b6\u179a\u178f\u1798\u17d2\u179a\u17b9\u1798",border:"\u179f\u17ca\u17bb\u1798",cellpadding:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1780\u17d2\u179a\u17a1\u17b6",cellspacing:"\u1782\u1798\u17d2\u179b\u17b6\u178f\u1780\u17d2\u1793\u17bb\u1784\u1780\u17d2\u179a\u17a1\u17b6",rows:"\u1785\u17c6\u1793\u17bd\u1793\u1787\u17bd\u179a\u178a\u17c1\u1780",cols:"\u1785\u17c6\u1793\u17bd\u1793\u1787\u17bd\u179a\u1788\u179a",height:"\u1780\u1798\u17d2\u1796\u179f\u17cb",width:"\u1791\u1791\u17b9\u1784",title:"\u1794\u1789\u17d2\u1785\u17bc\u179b/\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u178f\u17b6\u179a\u17b6\u1784",rowtype:"\u1791\u17b8\u178f\u17b6\u17c6\u1784\u1787\u17bd\u179a\u178a\u17c1\u1780\u1780\u17d2\u1793\u17bb\u1784\u178f\u17b6\u179a\u17b6\u1784",advanced_props:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb",general_props:"\u179b\u1780\u17d2\u1781\u178e\u17c8\u179f\u1798\u17d2\u1794\u178f\u17d2\u178f\u17b7\u1791\u17bc\u1791\u17c5",advanced_tab:"\u1780\u1798\u17d2\u179a\u17b7\u178f\u1781\u17d2\u1796\u179f\u17cb",general_tab:"\u1791\u17bc\u1791\u17c5"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ko_dlg.js b/js/tiny_mce/plugins/table/langs/ko_dlg.js new file mode 100755 index 000000000..348608a58 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"\uc88c\uc6b0\ubc94\uc704\ub9cc",rules_rhs:"\uc6b0\uce21 \ubc94\uc704\ub9cc",rules_lhs:"\uc88c\uce21 \ubc94\uc704\ub9cc",rules_hsides:"\uc0c1\ud558\ubc94\uc704\ub9cc",rules_below:"\uc544\ub798",rules_above:"\uc704",rules_void:"Void",rules:"Rules",frame_all:"\ubaa8\ub450",frame_cols:"\uc5f4",frame_rows:"\ud589",frame_groups:"\uadf8\ub8f9",frame_none:"\uc5c6\uc74c",frame:"Frame",caption:"\ud45c\uc81c",missing_scope:"\uc774 \ud45c \ud5e4\ub354\uc140\uc5d0 scope\uc18d\uc131\uc744 \uc9c0\uc815\ud558\uc9c0\uc54a\uc544\ub3c4 \uad1c\ucc2e\uc2b5\ub2c8\uae4c? \uc9c0\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0, \uc2dc\uac04\uc801\uc73c\ub85c \ud14c\uc774\ube14\uc758 \uad6c\uc870\ub97c \ud30c\uc545\ud558\ub294 \uac83\uc774 \uc5b4\ub824\uc6b4 \ubd84\uc758 \uc811\uadfc\uc131\uc774 \uc800\ud558\ud569\ub2c8\ub2e4.",cell_limit:"\uc140\uc218\uc758 \uc0c1\ud55c{$cells}\ub97c \ub118\uc5c8\uc2b5\ub2c8\ub2e4.",row_limit:"\ud589\uc218\uc758 \uc0c1\ud55c{$rows}\ub97c \ub118\uc5c8\uc2b5\ub2c8\ub2e4.",col_limit:"\ub82c\uc218\uc758 \uc0c1\ud55c{$cols}\ub97c \ub118\uc5c8\uc2b5\ub2c8\ub2e4.",colgroup:"\uc5f4\uadf8\ub8f9",rowgroup:"\ud589\uadf8\ub8f9",scope:"Scope",tfoot:"\ud14c\uc774\ube14 \ud48b\ud130",tbody:"Table Body",thead:"Table Head",row_all:"\uc804\ud589\uc744 \uac31\uc2e0",row_even:"\uc9dd\uc218\ud589\uc744 \uac31\uc2e0",row_odd:"\ud640\uc218\ud589\uc744 \uac31\uc2e0",row_row:"\ud604\uc7ac\uc758 \ud589\uc744 \uac31\uc2e0",cell_all:"\ud14c\uc774\ube14\uc758 \ubaa8\ub4e0 \uc140\uc744 \uac31\uc2e0",cell_row:"\ud589\uc758 \uc804\uc140\uc744 \uac31\uc2e0",cell_cell:"\ud604\uc7ac\uc758 \uc140\uc744 \uac31\uc2e0",th:"Header",td:"Data",summary:"\uc694\uc57d",bgimage:"\ubc30\uacbd \uc774\ubbf8\uc9c0",rtl:"\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd",ltr:"\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd",mime:"Target MIME \ud0c0\uc785",langcode:"\uc5b8\uc5b4 \ucf54\ub4dc",langdir:"\ubb38\uc790 \ubc29\ud5a5",style:"\uc2a4\ud0c0\uc77c",id:"Id",merge_cells_title:"\uc140 \uacb0\ud569",bgcolor:"\ubc30\uacbd\uc0c9",bordercolor:"\ud14c\ub450\ub9ac\uc120\uc0c9",align_bottom:"\ud558",align_top:"\uc0c1",valign:"\uc218\uc9c1 \uc704\uce58",cell_type:"\uc140 \uc885\ub958",cell_title:"\uc140 \uc124\uc815",row_title:"\ud589 \uc124\uc815",align_middle:"\uac00\uc6b4\ub370 \ub9de\ucda4",align_right:"\uc624\ub978\ucabd \ub9de\ucda4",align_left:"\uc67c\ucabd \ub9de\ucda4",align_default:"\uae30\ubcf8\uac12",align:"\uc815\ub82c",border:"\ud14c\ub450\ub9ac\uc120",cellpadding:"\uc140\ub0b4 \uc5ec\ubc31",cellspacing:"\uc140 \uac04\uaca9",rows:"\ud589",cols:"\ub82c",height:"\ub192\uc774",width:"\ud3ed",title:"\ud14c\uc774\ube14\uc758 \uc0bd\uc785/\ud3b8\uc9d1",rowtype:"\ud589",advanced_props:"\uace0\uae09 \uc124\uc815",general_props:"\uc77c\ubc18 \uc124\uc815",advanced_tab:"\uace0\uae09",general_tab:"\uc77c\ubc18"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/lb_dlg.js b/js/tiny_mce/plugins/table/langs/lb_dlg.js new file mode 100755 index 000000000..cbcef1e52 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.table_dlg',{rules_border:"all 4 S\u00e4iten (Bord)",rules_box:"all 4 S\u00e4iten (Box)",rules_vsides:"l\u00e9nks a riets",rules_rhs:"n\u00ebmmen riets",rules_lhs:"n\u00ebmmen l\u00e9nks",rules_hsides:"uewen an \u00ebnnen",rules_below:"n\u00ebmmen \u00ebnnen",rules_above:"n\u00ebmmen uewen",rules_void:"keen",rules:"Gitter",frame_all:"zw\u00ebschen allen Zellen",frame_cols:"zw\u00ebschen Spalten",frame_rows:"zw\u00ebschen Zeilen",frame_groups:"zw\u00ebschen Gruppen",frame_none:"keng",frame:"Rumm",caption:"Beschr\u00ebftung vun der Tabelle",missing_scope:"W\u00ebllt Dir wierklech keng Bez\u00e9iung fir d\u00ebs Iwwerschr\u00ebft uginn? Benotzer mat kierperlechen Aschr\u00e4nkungen k\u00ebnne Schwieregkeeten hunn, den Inhalt vun der Tabelle ze verstoen.",cell_limit:"Dir hutt d\u00e9i maximal Zellenzuel vun {$cells} iwwerschratt.",row_limit:"Dir hutt d\u00e9i maximal Zeilenzuel vun {$rows} iwwerschratt.",col_limit:"Dir hutt d\u00e9i maximal Spaltenzuel vun {$cols} iwwerschratt.",colgroup:"Horizontal grupp\u00e9ieren",rowgroup:"Vertikal grupp\u00e9ieren",scope:"Bezuch",tfoot:"Tabellefouss",tbody:"Tabelleninhalt",thead:"Tabellekapp",row_all:"All d\'Zeilen ver\u00e4nneren",row_even:"Grued Zeilen ver\u00e4nneren",row_odd:"Ongrued Zeilen ver\u00e4nneren",row_row:"D\u00ebs Zeil ver\u00e4nneren",cell_all:"All Zellen der Tabelle ver\u00e4nneren",cell_row:"All Zellen an d\u00ebser Zeil ver\u00e4nneren",cell_cell:"D\u00ebs Zell ver\u00e4nneren",th:"Iwwerschr\u00ebft",td:"Textzell",summary:"Zesummefaassung",bgimage:"Hannergrondbild",rtl:"Riets no l\u00e9nks",ltr:"L\u00e9nks no riets",mime:"MIME-Typ vum Inhalt",langcode:"Sproochecode",langdir:"Schr\u00ebftrichtung",style:"Format",id:"ID",merge_cells_title:"Zelle vereenen",bgcolor:"Hannergrondfuerf",bordercolor:"Fuerf vun der Rumm",align_bottom:"\u00cbnnen",align_top:"Uewen",valign:"Vertikal Ausriichtung",cell_type:"Zellentyp",cell_title:"Eegeschafte vun der Zell",row_title:"Eegeschafte vun der Zeil",align_middle:"M\u00ebtteg",align_right:"Riets",align_left:"L\u00e9nks",align_default:"Standard",align:"Ausriichtung",border:"Rumm",cellpadding:"Ofstand innerhalb vun den Zellen",cellspacing:"Zellenofstand",rows:"Zeilen",cols:"Spalten",height:"H\u00e9icht",width:"Breet",title:"Tabelle af\u00fcgen/beaarbechten",rowtype:"Grupp\u00e9ierung",advanced_props:"Erweidert Astellungen",general_props:"Allgemeng Astellungen",advanced_tab:"Erweidert",general_tab:"Allgemeng"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/lt_dlg.js b/js/tiny_mce/plugins/table/langs/lt_dlg.js new file mode 100755 index 000000000..4cecfd142 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.table_dlg',{rules_border:"r\u0117melis",rules_box:"d\u0117\u017eut\u0117",rules_vsides:"vert. pus\u0117s",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hor. pus\u0117s",rules_below:"apatinis",rules_above:"vir\u0161utinis",rules_void:"negaliojantis",rules:"Taisykl\u0117s",frame_all:"visi",frame_cols:"stulpeliai",frame_rows:"eilut\u0117s",frame_groups:"grup\u0117s",frame_none:"joks",frame:"R\u0117melis",caption:"Lentel\u0117s antra\u0161t\u0117",missing_scope:"Ar norite t\u0119sti nenurod\u0119 galiojimo srities \u0161iam lentel\u0117s vir\u0161utiniam langeliui. Be nurodymo, kai kuriems naudotojams su negalia gali b\u016bti sunku suprasti lentel\u0117je atvaizduojam\u0173 duomen\u0173 turin\u012f.",cell_limit:"Vir\u0161ijote did\u017eiausi\u0105 ({$cells}) langeli\u0173 kiek\u012f.",row_limit:"Vir\u0161ijote did\u017eiausi\u0105 ({$rows}) eilu\u010di\u0173 kiek\u012f.",col_limit:"Vir\u0161ijote did\u017eiausi\u0105 ({$cols}) stulpeli\u0173 kiek\u012f.",colgroup:"Stulpeli\u0173 grup\u0117",rowgroup:"Eilu\u010di\u0173 grup\u0117",scope:"Galiojimo sritis",tfoot:"Lentel\u0117s apa\u010dia",tbody:"Lentel\u0117s vidus",thead:"Lentel\u0117s vir\u0161us",row_all:"Atnaujinti visas lentel\u0117s eilutes",row_even:"Atnaujinti lygines lentel\u0117s eilutes",row_odd:"Atnaujinti nelygines lentel\u0117s eilutes",row_row:"Atnaujinti dabartin\u0119 eilut\u0119",cell_all:"Atnaujinti visus lentel\u0117s langelius",cell_row:"Atnaujinti visus eilut\u0117s langelius",cell_cell:"Atnaujinti dabartin\u012f langel\u012f",th:"Antra\u0161t\u0117",td:"Duomenys",summary:"Apibendrinimas",bgimage:"Fono paveiksl\u0117lis",rtl:"I\u0161 de\u0161in\u0117s \u012f kair\u0119",ltr:"I\u0161 kair\u0117s \u012f de\u0161in\u0119",mime:"Paskirties MIME tipas",langcode:"Kalbos kodas",langdir:"Kalbos kryptis",style:"Stilius",id:"Id",merge_cells_title:"Sujungti lentel\u0117s langelius",bgcolor:"Fono spalva",bordercolor:"R\u0117melio spalva",align_bottom:"Apa\u010dioje",align_top:"Vir\u0161uje",valign:"Vertikalus lygiavimas",cell_type:"Langelio tipas",cell_title:"Lentel\u0117s langeli\u0173 nustatymai",row_title:"Lentel\u0117s eilut\u0117s nustatymai",align_middle:"Centruoti",align_right:"Lygiuoti de\u0161in\u0117je",align_left:"Lygiuoti kair\u0117je",align_default:"Standartinis",align:"Lygiavimas",border:"R\u0117melis",cellpadding:"Tarpas langelio viduje",cellspacing:"Tarpas tarp langeli\u0173",rows:"Eilut\u0117s",cols:"Stulpeliai",height:"Auk\u0161tis",width:"Ilgis",title:"\u012eterpti/modifikuoti lentel\u0119",rowtype:"Eilut\u0117 lentel\u0117s dalyje",advanced_props:"I\u0161pl\u0117stiniai nustatymai",general_props:"Bendri nustatymai",advanced_tab:"I\u0161pl\u0117sta",general_tab:"Bendra"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/lv_dlg.js b/js/tiny_mce/plugins/table/langs/lv_dlg.js new file mode 100755 index 000000000..7e9ff1c75 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/mk_dlg.js b/js/tiny_mce/plugins/table/langs/mk_dlg.js new file mode 100755 index 000000000..168ba3863 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Opis tablice",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"Prema\u0161ili ste maksimalni broj \u0107elija ({$cells}).",row_limit:"Prema\u0161ili ste maksimalni broj redaka ({$rows}).",col_limit:"Prema\u0161ili ste maksimalni broj stupaca ({$cols}).",colgroup:"Grupa stupaca",rowgroup:"Grupa redaka",scope:"Domet",tfoot:"Podno\u017eje tablice",tbody:"Telo tablice",thead:"Zaglavlje tablice",row_all:"Primjeni na sve retke u tablici",row_even:"Primjeni na parne retke u tablici",row_odd:"Primjeni na neparne retke u tablici",row_row:"Primjeni na odabrani redak",cell_all:"Primjeni na sve \u0107elije u tablici",cell_row:"Primjeni na sve \u0107elije u retku",cell_cell:"Primjeni na odabranu \u0107eliju",th:"Zaglavlje",td:"Podatkovna",summary:"Sa\u017eetak",bgimage:"Slika pozadine",rtl:"S desna na levo",ltr:"S leva na desno",mime:"MIME tip",langcode:"Kod jezika",langdir:"Smjer jezika",style:"Stil",id:"Id",merge_cells_title:"Spoji \u0107elije",bgcolor:"Background color",bordercolor:"Boja obruba",align_bottom:"Dno",align_top:"Vrh",valign:"Okomito poravnavanje",cell_type:"Tip \u0107elije",cell_title:"Svojstva \u0107elije",row_title:"Svojstva retka",align_middle:"Sredina",align_right:"Desno",align_left:"Levo",align_default:"Zadano",align:"Poravnavanje",border:"Obrub",cellpadding:"Dopuna \u0107elije",cellspacing:"Razmak \u0107elija",rows:"Redaka",cols:"Stupaca",height:"Visina",width:"\u0160irina",title:"\u0412\u043c\u0435\u0442\u043d\u0438/uredi tablicu",rowtype:"Row in table part",advanced_props:"Napredna svojstva",general_props:"Osnovna svojstva",advanced_tab:"Napredno",general_tab:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ml_dlg.js b/js/tiny_mce/plugins/table/langs/ml_dlg.js new file mode 100755 index 000000000..824cd03f2 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.table_dlg',{rules_border:"\u0d05\u0d24\u0d3f\u0d30\u0d41\u0d4d",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"\u0d24\u0d3e\u0d34\u0d46",rules_above:"\u0d2e\u0d41\u0d15\u0d33\u0d3f\u0d32\u0d4d\u200d",rules_void:"void",rules:"Rules",frame_all:"\u0d0e\u0d32\u0d4d\u0d32\u0d3e\u0d02",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/mn_dlg.js b/js/tiny_mce/plugins/table/langs/mn_dlg.js new file mode 100755 index 000000000..95c3a531d --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"\u0434\u043e\u043e\u0440",rules_above:"\u0434\u044d\u044d\u0440",rules_void:"void",rules:"\u0428\u0443\u0433\u0430\u043c",frame_all:"\u0431\u04af\u0445",frame_cols:"\u0411\u0430\u0433\u0430\u043d\u0430",frame_rows:"\u041c\u04e9\u0440",frame_groups:"\u0411\u04af\u043b\u044d\u0433",frame_none:"\u0431\u0430\u0439\u0445\u0433\u04af\u0439",frame:"\u0424\u0440\u044d\u0439\u043c",caption:"\u0425\u04af\u0441\u043d\u044d\u0433\u0442\u0438\u0439\u043d \u0442\u0430\u0439\u043b\u0431\u0430\u0440",missing_scope:"\u0422\u0430 \u044d\u043d\u044d \u0433\u0430\u0440\u0447\u0433\u0438\u0439\u043d \u0445\u0443\u0432\u044c\u0434 \u04af\u043d\u044d\u0445\u044d\u044d\u0440 \u0442\u0430\u0439\u043b\u0431\u0430\u0440 \u0445\u0438\u0439\u0445\u0433\u04af\u0439 \u0431\u0430\u0439\u0445\u044b\u0433 \u0445\u04af\u0441\u044d\u0436 \u0431\u0430\u0439\u043d\u0430 \u0443\u0443? \u0417\u0430\u0440\u0438\u043c \u0445\u04e9\u0433\u0436\u043b\u0438\u0439\u043d \u0431\u044d\u0440\u0445\u0448\u044d\u044d\u043b\u0442\u044d\u0439 \u0445\u04af\u043c\u04af\u04af\u0441 \u0445\u04af\u0441\u043d\u044d\u0433\u0442\u0438\u0439\u043d \u0430\u0433\u0443\u0443\u043b\u0433\u044b\u0433 \u043e\u0439\u043b\u0433\u043e\u0445\u043e\u0434 \u0445\u04af\u043d\u0434\u0440\u044d\u043b\u0442\u044d\u0439 \u0431\u0430\u0439\u0445 \u0431\u043e\u043b\u043d\u043e.",cell_limit:"\u041d\u04af\u0434\u043d\u0438\u0439 \u0442\u043e\u043e\u043d\u044b \u0445\u044f\u0437\u0433\u0430\u0430\u0440 {$cells}-\u0441 \u0445\u044d\u0442\u044d\u0440\u043b\u044d\u044d.",row_limit:"\u041c\u04e9\u0440\u0438\u0439\u043d \u0442\u043e\u043e\u043d\u044b \u0445\u044f\u0437\u0433\u0430\u0430\u0440 {$rows}-\u0441 \u0445\u044d\u0442\u044d\u0440\u043b\u044d\u044d.",col_limit:"\u0411\u0430\u0433\u0430\u043d\u044b\u043d \u0442\u043e\u043e\u043d\u044b \u0445\u044f\u0437\u0433\u0430\u0430\u0440 {$cols}-\u0441 \u0445\u044d\u0442\u044d\u0440\u043b\u044d\u044d.",colgroup:"\u0425\u044d\u0432\u0442\u044d\u044d \u0431\u04af\u043b\u044d\u0433\u043b\u044d\u0445",rowgroup:"\u0411\u043e\u0441\u043e\u043e \u0431\u04af\u043b\u044d\u0433\u043b\u044d\u0445",scope:"\u0423\u044f\u043b\u0434\u0430\u0430",tfoot:"\u0425\u04af\u0441\u043d\u044d\u0433\u0442\u0438\u0439\u043d \u0445\u04e9\u043b",tbody:"\u0425\u04af\u0441\u043d\u044d\u0433\u0442\u0438\u0439\u043d \u0430\u0433\u0443\u0443\u043b\u0433\u0430",thead:"\u0425\u04af\u0441\u043d\u044d\u0433\u0442\u0438\u0439\u043d \u0442\u043e\u043b\u0433\u043e\u0439",row_all:"\u0411\u04af\u0445 \u043c\u04e9\u0440\u0438\u0439\u043d \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",row_even:"\u0422\u044d\u0433\u0448 \u043c\u04e9\u0440\u04af\u04af\u0434\u0438\u0439\u0433 \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",row_odd:"\u0421\u043e\u043d\u0434\u0433\u043e\u0439 \u043c\u04e9\u0440\u04af\u04af\u0434\u0438\u0439\u0433 \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",row_row:"\u042d\u043d\u044d \u043c\u04e9\u0440\u0438\u0439\u0433 \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",cell_all:"\u0425\u04af\u0441\u043d\u044d\u0433\u0442\u0438\u0439\u043d \u0431\u04af\u0445 \u043d\u04af\u0434\u0438\u0439\u0433 \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",cell_row:"\u042d\u043d\u044d \u043c\u04e9\u0440\u04e9\u043d \u0434\u04e9\u0445 \u0431\u04af\u0445 \u043d\u04af\u0434\u0438\u0439\u0433 \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",cell_cell:"\u042d\u043d\u044d \u043d\u04af\u0434\u0438\u0439\u0433 \u04e9\u04e9\u0440\u0447\u043b\u04e9\u0445",th:"\u0413\u0430\u0440\u0447\u0438\u0433",td:"\u0411\u0438\u0447\u0432\u044d\u0440 \u043d\u04af\u0434",summary:"\u0414\u04af\u0433\u043d\u044d\u043b\u0442",bgimage:"\u0414\u044d\u0432\u0441\u0433\u044d\u0440 \u0437\u0443\u0440\u0430\u0433",rtl:"\u0411\u0430\u0440\u0443\u0443\u043d\u0430\u0430\u0441 \u0437\u04af\u04af\u043d",ltr:"\u0417\u04af\u04af\u043d\u044d\u044d\u0441 \u0431\u0430\u0440\u0443\u0443\u043d",mime:"\u0410\u0433\u0443\u0443\u043b\u0433\u044b\u043d MIME-\u0442\u04e9\u0440\u04e9\u043b",langcode:"\u0425\u044d\u043b\u043d\u0438\u0439 \u043a\u043e\u0434",langdir:"\u0411\u0438\u0447\u0433\u0438\u0439\u043d \u0447\u0438\u0433\u043b\u044d\u043b",style:"\u0425\u044d\u043b\u0431\u044d\u0440\u0436\u04af\u04af\u043b\u044d\u043b\u0442",id:"\u0422\u0422",merge_cells_title:"\u041d\u04af\u0434 \u043d\u044d\u0433\u0442\u0433\u044d\u0445",bgcolor:"\u0414\u044d\u0432\u0441\u0433\u044d\u0440 \u04e9\u043d\u0433\u04e9",bordercolor:"\u0425\u04af\u0440\u044d\u044d\u043d\u0438\u0439 \u04e9\u043d\u0433\u04e9",align_bottom:"\u0414\u043e\u043e\u0440",align_top:"\u0414\u044d\u044d\u0440",valign:"\u0411\u043e\u0441\u043e\u043e \u0436\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",cell_type:"\u041d\u04af\u0434\u043d\u0438\u0439 \u0442\u04e9\u0440\u04e9\u043b",cell_title:"\u041d\u04af\u0434\u043d\u0438\u0439 \u0448\u0438\u043d\u0436",row_title:"\u041c\u04e9\u0440\u0438\u0439\u043d \u0448\u0438\u043d\u0436",align_middle:"\u0413\u043e\u043b\u0434",align_right:"\u0411\u0430\u0440\u0443\u0443\u043d",align_left:"\u0417\u04af\u04af\u043d",align_default:"\u04e8\u0433\u04e9\u0433\u0434\u043c\u04e9\u043b",align:"\u0416\u0438\u0433\u0434\u0440\u04af\u04af\u043b\u044d\u043b\u0442",border:"\u0425\u04af\u0440\u044d\u044d",cellpadding:"\u041d\u04af\u0434\u043d\u0438\u0439 \u0434\u043e\u0442\u043e\u043e\u0434 \u0430\u043b\u0441\u043b\u0430\u043b\u0442",cellspacing:"\u041d\u04af\u0434\u043d\u0438\u0439 \u0430\u043b\u0441\u043b\u0430\u043b\u0442",rows:"\u041c\u04e9\u0440",cols:"\u0411\u0430\u0433\u0430\u043d\u0430",height:"\u04e8\u043d\u0434\u04e9\u0440",width:"\u04e8\u0440\u0433\u04e9\u043d",title:"\u0425\u04af\u0441\u043d\u044d\u0433\u0442 \u043e\u0440\u0443\u0443\u043b\u0430\u0445/\u0437\u0430\u0441\u0430\u0445",rowtype:"\u041c\u04e9\u0440\u0438\u0439\u043d \u0442\u04e9\u0440\u04e9\u043b",advanced_props:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",general_props:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439 \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",advanced_tab:"\u04e8\u0440\u0433\u04e9\u0442\u0433\u04e9\u0441\u04e9\u043d",general_tab:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ms_dlg.js b/js/tiny_mce/plugins/table/langs/ms_dlg.js new file mode 100755 index 000000000..019e26558 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.table_dlg',{rules_border:"sempadan",rules_box:"kotak",rules_vsides:"tepian tegak",rules_rhs:"hs-kanan",rules_lhs:"hs-kiri",rules_hsides:"tepian datar",rules_below:"bawah",rules_above:"atas",rules_void:"batal",rules:"Peraturan",frame_all:"semua",frame_cols:"kol",frame_rows:"row",frame_groups:"kumpulan",frame_none:"tiada",frame:"Bingkai",caption:"Tajuk jadual",missing_scope:"Adakah anda pasti terhadap skop sel jadual ini. Ia mungkin memberi kesan kepada OKU memahami isi jadual.",cell_limit:"Anda telah melebihi maxima sel dibenarkan iaitu {$cells}.",row_limit:"Anda telah melebihi maxima row dibenarkan iaitu {$rows}.",col_limit:"Anda telah melebihi maxima kolum dibenarkan iaitu {$cols}.",colgroup:"Kumpulan kol",rowgroup:"Kumpulan row",scope:"Skop",tfoot:"Penutup jadual Foot",tbody:"Isi jadual",thead:"Pembuka jadual",row_all:"Baharui semua row dalam jadual",row_even:"Baharui row genap dalam jadual",row_odd:"Baharui row ganjil dalam jadual",row_row:"Baharui row semasa",cell_all:"Baharui semua sel dalam jadual",cell_row:"Baharui semua sel dalam row",cell_cell:"Baharui sel ini",th:"Kepala",td:"Data",summary:"Kesimpulan",bgimage:"Imej latar",rtl:"Kanan ke kiri",ltr:"Kiri ke kanan",mime:"Sasaran jenis MIME",langcode:"Kod bahasa",langdir:"Arah bahasa",style:"Gaya",id:"Id",merge_cells_title:"Gabung sel jadual",bgcolor:"Warna latar",bordercolor:"Warna sempadan",align_bottom:"Bawah",align_top:"Atas",valign:"Penjajaran tegak",cell_type:"Jenis sel",cell_title:"Alatan sel jadual",row_title:"Alatan row jadual",align_middle:"Tengah",align_right:"Kanan",align_left:"Kiri",align_default:"Asal",align:"Penyelarian",border:"Sempadan",cellpadding:"Lapisan sel",cellspacing:"Ruang sel",rows:"Row",cols:"Kol",height:"Tinggi",width:"Lebar",title:"Masuk/Ubah jadual",rowtype:"Row dalam jadual",advanced_props:"Alatan lanjutan",general_props:"Alatan am",advanced_tab:"Lanjutan",general_tab:"Am"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/my_dlg.js b/js/tiny_mce/plugins/table/langs/my_dlg.js new file mode 100755 index 000000000..bea78df83 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.table_dlg',{rules_border:"\u1014\u101a\u103a\u1005\u100a\u103a\u1038",rules_box:"\u1015\u1036\u102f\u1038",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"\u1031\u1021\u102c\u1000\u103a\u1010\u103d\u1004\u103a",rules_above:"\u1021\u1011\u1000\u103a\u1010\u103d\u1004\u103a",rules_void:"void",rules:"\u1005\u100a\u103a\u1038\u1019\u103b\u1009\u103a\u1038\u1019\u103b\u102c\u1038",frame_all:"\u1021\u102c\u1038\u101c\u1036\u102f\u1038",frame_cols:"\u1031\u1000\u102c\u103a\u101c\u1036\u1019\u103b\u102c\u1038",frame_rows:"\u1021\u1010\u1014\u103a\u1038\u1019\u103b\u102c\u1038",frame_groups:"\u1021\u102f\u1015\u103a\u1005\u102f\u1019\u103b\u102c\u1038",frame_none:"\u1010\u1005\u103a\u1001\u102f\u1019\u103b\u103e\u1019\u101f\u102f\u1010\u103a",frame:"\u1016\u101b\u102d\u1019\u103a",caption:"\u1007\u101a\u102c\u1038\u1000\u103d\u1000\u103a \u1031\u1001\u102b\u1004\u103a\u1038\u1005\u1009\u103a",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You",row_limit:"You",col_limit:"You",colgroup:"\u1031\u1000\u102c\u103a\u101c\u1036 \u1021\u102f\u1015\u103a\u1005\u102f",rowgroup:"\u1021\u1010\u1014\u103a\u1038 \u1021\u102f\u1015\u103a\u1005\u102f",scope:"Scope",tfoot:"\u1007\u101a\u102c\u1038 \u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001",tbody:"\u1007\u101a\u102c\u1038 \u1000\u102d\u102f\u101a\u103a\u1011\u100a\u103a",thead:"\u1007\u101a\u102c\u1038 \u1014\u1016\u1030\u1038\u1005\u100a\u103a\u1038",row_all:"\u1007\u101a\u102c\u1038\u1011\u1032\u1019\u103e \u1021\u1010\u1014\u103a\u1038\u1021\u102c\u1038\u101c\u1036\u102f\u1038\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",row_even:"\u1007\u101a\u102c\u1038\u1011\u1032\u1019\u103e \u1005\u1036\u102f \u1021\u1010\u1014\u103a\u1038\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",row_odd:"\u1007\u101a\u102c\u1038\u1011\u1032\u1019\u103e \u1019 \u1021\u1010\u1014\u103a\u1038\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",row_row:"\u101c\u1000\u103a\u101b\u103e\u102d \u1021\u1010\u1014\u103a\u1038\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",cell_all:"\u1007\u101a\u102c\u1038\u1011\u1032\u1019\u103e \u1021\u1000\u103d\u1000\u103a\u1021\u102c\u1038\u101c\u1036\u102f\u1038\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",cell_row:"\u1021\u1010\u1014\u103a\u1038\u1011\u1032\u1019\u103e \u1021\u1000\u103d\u1000\u103a\u1021\u102c\u1038\u101c\u1036\u102f\u1038\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",cell_cell:"\u101c\u1000\u103a\u101b\u103e\u102d \u1021\u1000\u103d\u1000\u103a\u1000\u102d\u102f \u1021\u101e\u1005\u103a\u103c\u1016\u100a\u103a\u1037\u1005\u103d\u1000\u103a\u1015\u102b",th:"\u1031\u1001\u102b\u1004\u103a\u1038\u1005\u102e\u1038\u1015\u102d\u102f\u1004\u103a\u1038",td:"\u1021\u1001\u103b\u1000\u103a\u1021\u101c\u1000\u103a",summary:"\u1021\u1014\u103e\u1005\u103a\u1001\u103b\u102f\u1015\u103a",bgimage:"\u1031\u1014\u102c\u1000\u103a\u1001\u1036 \u101b\u102f\u1015\u103a\u1015\u1036\u102f",rtl:"\u100a\u102c\u1019\u103e \u1018\u101a\u103a",ltr:"\u1018\u101a\u103a\u1019\u103e \u100a\u102c",mime:"Target MIME type",langcode:"\u1018\u102c\u101e\u102c\u1005\u1000\u102c\u1038 \u1000\u102f\u1010\u103a",langdir:"\u1005\u102c\u1031\u101b\u1038\u101e\u102c\u1038\u1019\u103e\u102f \u1025\u102e\u1038\u1010\u100a\u103a\u1001\u103b\u1000\u103a",style:"\u1005\u1010\u102d\u102f\u1004\u103a",id:"ID",merge_cells_title:"\u1007\u101a\u102c\u1038\u1000\u103d\u1000\u103a\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1031\u1015\u102b\u1004\u103a\u1038\u1015\u102b",bgcolor:"\u1031\u1014\u102c\u1000\u103a\u1001\u1036 \u1021\u1031\u101b\u102c\u1004\u103a",bordercolor:"\u1014\u101a\u103a\u1005\u100a\u103a\u1038 \u1021\u1031\u101b\u102c\u1004\u103a",align_bottom:"\u1031\u1021\u102c\u1000\u103a\u1031\u103c\u1001",align_top:"\u1011\u102d\u1015\u103a",valign:"\u1031\u1012\u102b\u1004\u103a\u101c\u102d\u102f\u1000\u103a \u1001\u103b\u102d\u1014\u103a\u100a\u102d\u103e\u1019\u103e\u102f",cell_type:"\u1021\u1000\u103d\u1000\u103a \u1021\u1019\u103b\u102d\u102f\u1038\u1021\u1005\u102c\u1038",cell_title:"\u1007\u101a\u102c\u1038\u1000\u103d\u1000\u103a \u101d\u102d\u1031\u101e\u101e \u101c\u1000\u1039\u1001\u100f\u102c\u1019\u103b\u102c\u1038",row_title:"\u1007\u101a\u102c\u1038 \u1021\u1010\u1014\u103a\u1038 \u101d\u102d\u1031\u101e\u101e \u101c\u1000\u1039\u1001\u100f\u102c\u1019\u103b\u102c\u1038",align_middle:"\u1017\u101f\u102d\u102f",align_right:"\u100a\u102c",align_left:"\u1018\u101a\u103a",align_default:"\u1019\u1030\u101c",align:"\u1001\u103b\u102d\u1014\u103a\u100a\u102d\u103e\u1019\u103e\u102f",border:"\u1014\u101a\u103a\u1005\u1015\u103a\u1005\u100a\u103a\u1038",cellpadding:"\u1000\u103d\u1000\u103a\u1031\u1018\u1038\u1031\u1014\u101b\u102c\u101c\u103d\u1010\u103a",cellspacing:"\u1000\u103d\u1000\u103a\u103c\u1000\u102c\u1038\u101c\u1015\u103a",rows:"\u1021\u1010\u1014\u103a\u1038",cols:"\u1031\u1000\u102c\u103a\u101c\u1036",height:"\u1021\u103c\u1019\u1004\u103a\u1037",width:"\u1021\u1000\u103b\u101a\u103a",title:"\u1007\u101a\u102c\u1038 \u1011\u100a\u103a\u1037/\u103c\u1015\u102f\u103c\u1015\u1004\u103a",rowtype:"\u1021\u1010\u1014\u103a\u1038\u101b\u103e\u102d\u1019\u100a\u103a\u1037 \u1007\u101a\u102c\u1038 \u1021\u1015\u102d\u102f\u1004\u103a\u1038",advanced_props:"\u1021\u1011\u1030\u1038 \u101d\u102d\u1031\u101e\u101e\u101c\u1000\u1039\u1001\u100f\u102c\u1019\u103b\u102c\u1038",general_props:"\u1021\u1031\u1011\u103d\u1031\u1011\u103d \u101d\u102d\u1031\u101e\u101e\u101c\u1000\u1039\u1001\u100f\u102c\u1019\u103b\u102c\u1038",advanced_tab:"\u1021\u1011\u1030\u1038",general_tab:"\u1021\u1031\u1011\u103d\u1031\u1011\u103d"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/nb_dlg.js b/js/tiny_mce/plugins/table/langs/nb_dlg.js new file mode 100755 index 000000000..f8a9ea849 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.table_dlg',{"rules_border":"ramme","rules_box":"boks","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsider","rules_below":"under","rules_above":"over","rules_void":"ingen",rules:"Streker","frame_all":"alle","frame_cols":"kolonner","frame_rows":"rader","frame_groups":"grupper","frame_none":"ingen",frame:"Ramme",caption:"Tabelloverskrift","missing_scope":"Er du sikker p\u00e5 at du vil fortsette uten \u00e5 angi et omr\u00e5de for denne overskrifscellen? Uten dette kan det bli vanskelig for enkelte funksjonshemmede brukere \u00e5 forst\u00e5 innholdet eller dataene som blir presentert i tabellen.","cell_limit":"Du har overskredet maksimalt antall celler p\u00e5 {$cells}.","row_limit":"Du har overskredet maksimalt antall rader p\u00e5 {$rows}.","col_limit":"Du har overskredet maksimalt antall kolonner p\u00e5 {$cols}.",colgroup:"Kolonnegruppe",rowgroup:"Radgruppe",scope:"Omr\u00e5de",tfoot:"Tabellfot",tbody:"Tabellkropp",thead:"Tabellhode","row_all":"Oppdater alle rader","row_even":"Oppdater partallsrader","row_odd":"Oppdater oddetallsrader","row_row":"Oppdater aktuell rad","cell_all":"Oppdater alle celler i tabellen","cell_row":"Oppdater alle celler i raden","cell_cell":"Oppdater aktuell celle",th:"Overskrift",td:"Data",summary:"Sammendrag",bgimage:"Bakgrunnsbilde",rtl:"H\u00f8yre mot venstre",ltr:"Venstre mot h\u00f8yre",mime:"M\u00e5lets MIME-type",langcode:"Spr\u00e5kkode",langdir:"Skriftretning",style:"Stil",id:"Id","merge_cells_title":"Sl\u00e5 sammen celler",bgcolor:"Bakgrunn",bordercolor:"Rammefarge","align_bottom":"Bunn","align_top":"Topp",valign:"Vertikal justering","cell_type":"Celletype","cell_title":"Celleegenskaper","row_title":"Radegenskaper","align_middle":"Midtstilt","align_right":"H\u00f8yre","align_left":"Venstre","align_default":"Standard",align:"Justering",border:"Ramme",cellpadding:"Cellefylling",cellspacing:"Celleavstand",rows:"Rader",cols:"Kolonner",height:"H\u00f8yde",width:"Bredde",title:"Sett inn / rediger tabell",rowtype:"Rad i tabell","advanced_props":"Generelle egenskaper","general_props":"Generelt","advanced_tab":"Avansert","general_tab":"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/nl_dlg.js b/js/tiny_mce/plugins/table/langs/nl_dlg.js new file mode 100755 index 000000000..fa7f2225f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.table_dlg',{"rules_border":"Rand","rules_box":"Box","rules_vsides":"Verticale zijden","rules_rhs":"Rechterzijkant","rules_lhs":"Linkerzijkant","rules_hsides":"Horizontale zijden","rules_below":"Onder","rules_above":"Boven","rules_void":"Geen",rules:"Hulplijnen","frame_all":"Alles","frame_cols":"Kolommen","frame_rows":"Rijen","frame_groups":"Groepen","frame_none":"Geen",frame:"Frame",caption:"Tabelbeschrijving","missing_scope":"Weet u zeker dat u door wilt gaan met het toewijzen van een kop zonder een bereik op te geven? Mensen met een visuele handicap kunnen hierdoor waarschijnlijk slecht bij de gegevens.","cell_limit":"U heeft het maximale aantal cellen van {$cells} overschreden.","row_limit":"U heeft hebt het maximale aantal rijen van {$rows} overschreden.","col_limit":"U heeft het maximale aantal kolommen van {$cols} overschreden.",colgroup:"Kolomgroep",rowgroup:"Rijgroep",scope:"Bereik",tfoot:"Tabelvoet",tbody:"Tabellichaam",thead:"Tabelkop","row_all":"Alle rijen bijwerken","row_even":"Even rijen bijwerken","row_odd":"Oneven rijen bijwerken","row_row":"Huidige rij bijwerken","cell_all":"Alle cellen in tabel bijwerken","cell_row":"Alle cellen in rij bijwerken","cell_cell":"Huidige cel bijwerken",th:"Kop",td:"Gegevens",summary:"Samenvatting",bgimage:"Achtergrondafbeelding",rtl:"Van rechts naar links",ltr:"Van links naar rechts",mime:"Doel MIME type",langcode:"Taalcode",langdir:"Taalrichting",style:"Stijl",id:"Id","merge_cells_title":"Cellen samenvoegen",bgcolor:"Achtergrondkleur",bordercolor:"Randkleur","align_bottom":"Onder","align_top":"Boven",valign:"Verticale uitlijning","cell_type":"Celtype","cell_title":"Celeigenschappen","row_title":"Rij-eigenschappen","align_middle":"Centreren","align_right":"Rechts","align_left":"Links","align_default":"Standaard",align:"Uitlijning",border:"Rand",cellpadding:"Ruimte in cel",cellspacing:"Ruimte om cel",rows:"Rijen",cols:"Kolommen",height:"Hoogte",width:"Breedte",title:"Tabel invoegen/bewerken",rowtype:"Rijtype","advanced_props":"Geavanceerde eigenschappen","general_props":"Algemene eigenschappen","advanced_tab":"Geavanceerd","general_tab":"Algemeen"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/nn_dlg.js b/js/tiny_mce/plugins/table/langs/nn_dlg.js new file mode 100755 index 000000000..5e145db2f --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.table_dlg',{rules_border:"ramme",rules_box:"boks",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"under",rules_above:"over",rules_void:"ingen",rules:"Strekar",frame_all:"alle",frame_cols:"kolonnar",frame_rows:"rader",frame_groups:"grupper",frame_none:"ingen",frame:"Ramme",caption:"Tabelloverskrift",missing_scope:"Er du sikker p\u00e5 at du vil fortsetje utan \u00e5 angi eit omr\u00e5de for denne overskrifscella? Utan dette kan det bli vanskeleg for enkelte funksjonshemma brukarar \u00e5 forst\u00e5 innhaldet eller dataane som blir presenterte i tabellen.",cell_limit:"Du har fleire enn maksimalt tal celler p\u00e5 {$cells}.",row_limit:"Du har fleire enn maksimalt tal rader p\u00e5 {$rows}.",col_limit:"Du har fleire enn maksimalt tal kolonner p\u00e5 {$cols}.",colgroup:"Kolonnegruppe",rowgroup:"Radgruppe",scope:"Omr\u00e5de",tfoot:"Tabellfot",tbody:"Tabellkropp",thead:"Tabellhovud",row_all:"Oppdater alle rader",row_even:"Oppdater partallrader",row_odd:"Oppdater oddetallrader",row_row:"Oppdater aktuell rad",cell_all:"Oppdater alle celler i tabellen",cell_row:"Oppdater alle celler i rada",cell_cell:"Oppdater aktuell celle",th:"Overskrift",td:"Data",summary:"Samandrag",bgimage:"Bakgrunnsbilete",rtl:"H\u00f8gre mot venstre",ltr:"Venstre mot h\u00f8gre",mime:"M\u00e5let sin MIME-type",langcode:"Spr\u00e5kkode",langdir:"Skriftretning",style:"Stil",id:"Id",merge_cells_title:"Sl\u00e5 saman celler",bgcolor:"Bakgrunn",bordercolor:"Rammefarge",align_bottom:"Botn",align_top:"Topp",valign:"Vertikal justering",cell_type:"Celletype",cell_title:"Celleeigenskapar",row_title:"Radeigenskapar",align_middle:"Midtstilt",align_right:"H\u00f8gre",align_left:"Venstre",align_default:"Standard",align:"Justering",border:"Ramme",cellpadding:"Cellefylling",cellspacing:"Celleavstand",rows:"Rader",cols:"Kolonner",height:"H\u00f8gd",width:"Breidd",title:"Set inn / rediger tabell",rowtype:"Rad i tabell",advanced_props:"Generelle eigenskapar",general_props:"Generelt",advanced_tab:"Avansert",general_tab:"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/no_dlg.js b/js/tiny_mce/plugins/table/langs/no_dlg.js new file mode 100755 index 000000000..ec7c0af45 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.table_dlg',{"rules_border":"ramme","rules_box":"boks","rules_vsides":"vside","rules_rhs":"hs","rules_lhs":"vs","rules_hsides":"hside","rules_below":"under","rules_above":"over","rules_void":"tom",rules:"Streker","frame_all":"alle","frame_cols":"kolonner","frame_rows":"rader","frame_groups":"grupper","frame_none":"ingen",frame:"Ramme",caption:"Tabell tittel","missing_scope":"Er du sikker du vil fortsette uten \u00e5 angi tittel for denne overskrifscellen? Uten denne kan det bli vanskelig for enkelte funksjonshemmede brukere \u00e5 forst\u00e5 innhold eller data som presenteres i tabellen.","cell_limit":"Du har overg\u00e5tt maksimalt antall tillatt celler p\u00e5 {$cells}.","row_limit":"Du har overg\u00e5tt maksimalt antall tillatte rader p\u00e5 {$rows}.","col_limit":"Du har overg\u00e5tt maksimalt antall tillatte kolonner p\u00e5 {$cols}.",colgroup:"Kolonne gruppe",rowgroup:"Rad gruppe",scope:"Tittel",tfoot:"Tabell foot",tbody:"Tabell body",thead:"Tabell head","row_all":"Oppdater alle rader","row_even":"Oppdater rader med partall","row_odd":"Oppdater rader med oddetall","row_row":"Oppdater aktuell rad","cell_all":"Oppdater alle celler i tabellen","cell_row":"Oppdater alle celler i raden","cell_cell":"Oppdater aktuell celle",th:"Overskrift",td:"Data",summary:"Sammendrag",bgimage:"Bakgrunnsbilde",rtl:"H\u00f8yre mot venstre",ltr:"Venstre mot h\u00f8yre",mime:"M\u00e5lets MIME-type",langcode:"Spr\u00e5k kode",langdir:"Skriftretning",style:"Stil",id:"Id","merge_cells_title":"Sl\u00e5 sammen celler",bgcolor:"Bakgrunnsfarge",bordercolor:"Rammefarge","align_bottom":"Bunn","align_top":"Topp",valign:"Vertikal justering","cell_type":"Celle type","cell_title":"Celle egenskaper","row_title":"Rad egenskaper","align_middle":"Midtstilt","align_right":"H\u00f8yre","align_left":"Venstre","align_default":"Standard",align:"Justering",border:"Ramme",cellpadding:"Cellefylling",cellspacing:"Celleavstand",rows:"Rader",cols:"Kolonner",height:"H\u00f8yde",width:"Bredde",title:"Sett inn/editer tabell",rowtype:"Rad i tabell","advanced_props":"Avanserte egenskaper","general_props":"Generelle egenskaper","advanced_tab":"Avansert","general_tab":"Generelt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/pl_dlg.js b/js/tiny_mce/plugins/table/langs/pl_dlg.js new file mode 100755 index 000000000..7e78c474d --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"pod","rules_above":"nad","rules_void":"void",rules:"Prowadnice","frame_all":"wszystkie","frame_cols":"kolumny","frame_rows":"wiersze","frame_groups":"grupy","frame_none":"brak",frame:"Ramka",caption:"Nag\u0142\u00f3wek tabeli","missing_scope":"Jeste\u015b pewny \u017ce chcesz kontynuowa\u0107 bez definiowania zasi\u0119gu dla kom\u00f3rki tabeli. Bez niej, mo\u017ce by\u0107 trudne dla niekt\u00f3rych u\u017cytkownik\u00f3w zrozuminie zawarto\u015bci albo danych wy\u015bwietlanych poza tabel\u0105.","cell_limit":"Przekroczy\u0142e\u015b maksymaln\u0105 liczb\u0119 kom\u00f3rek kt\u00f3ra wynosi {$cells}.","row_limit":"Przekroczy\u0142e\u015b maksymaln\u0105 liczb\u0119 wierszy kt\u00f3ra wynosi {$rows}.","col_limit":"Przekroczy\u0142e\u015b maksymaln\u0105 liczb\u0119 kolumn kt\u00f3ra wynosi {$cols}.",colgroup:"Grupa kolumn",rowgroup:"Grupa wierszy",scope:"Zakres",tfoot:"Stopka tabeli",tbody:"Cia\u0142o tabeli",thead:"Nag\u0142\u00f3wek tabeli","row_all":"Zmie\u0144 wszystkie wiersze","row_even":"Zmie\u0144 parzyste wiersze","row_odd":"Zmie\u0144 nieparzyste wiersze","row_row":"Zmie\u0144 aktualny wiersz","cell_all":"Zmie\u0144 wszytkie kom\u00f3rki w tabeli","cell_row":"Zmie\u0144 wszytkie kom\u00f3rki w wierszu","cell_cell":"Zmie\u0144 aktualn\u0105 kom\u00f3rk\u0119",th:"Nag\u0142owek",td:"Dane",summary:"Podsumowanie",bgimage:"Obrazek t\u0142a",rtl:"Kierunek z prawej do lewej",ltr:"Kierunek z lewej do prawej",mime:"Docelowy typ MIME",langcode:"Kod j\u0119zyka",langdir:"Kierunek czytania tekstu",style:"Styl",id:"Id","merge_cells_title":"Po\u0142\u0105cz kom\u00f3rki",bgcolor:"Kolor t\u0142a",bordercolor:"Kolor ramki","align_bottom":"D\u00f3\u0142","align_top":"G\u00f3ra",valign:"Pionowe wyr\u00f3wnanie","cell_type":"Typ kom\u00f3rki","cell_title":"W\u0142a\u015bciwo\u015bci kom\u00f3rki","row_title":"W\u0142a\u015bciwo\u015bci wiersza","align_middle":"\u015arodek","align_right":"Prawy","align_left":"Lewy","align_default":"Domy\u015blnie",align:"Wyr\u00f3wnanie",border:"Ramka",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Wiersze",cols:"Kolumny",height:"Wysoko\u015b\u0107",width:"Szeroko\u015b\u0107",title:"Wklej/Zmie\u0144 tabel\u0119",rowtype:"Wiersz w cz\u0119\u015bci tabeli","advanced_props":"Zaawansowane w\u0142a\u015bciwo\u015bci","general_props":"G\u0142\u00f3wne w\u0142a\u015bciwo\u015bci","advanced_tab":"Zaawansowane","general_tab":"G\u0142\u00f3wne"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ps_dlg.js b/js/tiny_mce/plugins/table/langs/ps_dlg.js new file mode 100755 index 000000000..686211c8b --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/pt_dlg.js b/js/tiny_mce/plugins/table/langs/pt_dlg.js new file mode 100755 index 000000000..7534c5cd9 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.table_dlg',{rules_border:"Limites",rules_box:"Box",rules_vsides:"Vsides",rules_rhs:"Rhs",rules_lhs:"Lhs",rules_hsides:"Hsides",rules_below:"abaixo",rules_above:"acima",rules_void:"void",rules:"Regras",frame_all:"Todos",frame_cols:"colunas",frame_rows:"Linhas",frame_groups:"Grupos",frame_none:"Nenhum",frame:"Frame",caption:"T\u00edtulo da tabela",missing_scope:"Tem certeza de que quer continuar sem especificar um escopo para esta c\u00e9lula? (Isso poder\u00e1 causar dificuldades a usu\u00e1rios deficientes)",cell_limit:"Excedeu o n\u00famero m\u00e1ximo de c\u00e9lulas de {$cells}.",row_limit:"Excedeu o n\u00famero m\u00e1ximo de linhas de {$rows}.",col_limit:"Excedeu o n\u00famero m\u00e1ximo de colunas de {$cols}.",colgroup:"Grupo colunas",rowgroup:"Grupo linhas",scope:"Alcance",tfoot:"Rodap\u00e9 da tabela",tbody:"Corpo da tabela",thead:"Topo da tabela",row_all:"Atualizar todas as linhas",row_even:"Atualizar linhas pares",row_odd:"Atualizar linhas \u00edmpares",row_row:"Atualizar esta linha",cell_all:"Atualizar todas as c\u00e9lulas na tabela",cell_row:"Atualizar todas as c\u00e9lulas na linha",cell_cell:"Atualizar esta c\u00e9lula",th:"Campo",td:"Dados",summary:"Sum\u00e1rio",bgimage:"Imagem de fundo",rtl:"Da direita para a esquerda",ltr:"Da esquerda para a direita",mime:"MIME alvo",langcode:"C\u00f3digo do idioma",langdir:"Dire\u00e7\u00e3o do texto",style:"Estilo",id:"Id",merge_cells_title:"Unir c\u00e9lulas",bgcolor:"Cor de fundo",bordercolor:"Cor dos limites",align_bottom:"Abaixo",align_top:"Topo",valign:"Alinha. vert.",cell_type:"Tipo c\u00e9l.",cell_title:"Propriedades de c\u00e9lulas",row_title:"Propriedades de linhas",align_middle:"Centro",align_right:"Direita",align_left:"Esquerda",align_default:"Padr\u00e3o",align:"Alinha.",border:"Limites",cellpadding:"Enchimento da C\u00e9lula",cellspacing:"Espa\u00e7amento da C\u00e9lula",rows:"Linhas",cols:"Colunas",height:"Altura",width:"Largura",title:"Inserir/modificar tabela",rowtype:"Linha na parte da tabela",advanced_props:"Propriedades avan\u00e7adas",general_props:"Propriedades gerais",advanced_tab:"Avan\u00e7ado",general_tab:"Geral"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ro_dlg.js b/js/tiny_mce/plugins/table/langs/ro_dlg.js new file mode 100755 index 000000000..5e4a11880 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"dedesubt",rules_above:"deasupra",rules_void:"gol",rules:"Reguli",frame_all:"toate",frame_cols:"coloane",frame_rows:"r\u00e2nduri",frame_groups:"grupuri",frame_none:"niciuna",frame:"Frame",caption:"Titlu tabel",missing_scope:"Sigur dori\u0163i s\u0103 l\u0103sa\u0163i scopul necompletat? ",cell_limit:"A\u0163i dep\u0103\u015fit num\u0103rul maxim de celule: {$cells}.",row_limit:"A\u0163i dep\u0103\u015fit num\u0103rul maxim de r\u00e2nduri: {$rows}.",col_limit:"A\u0163i dep\u0103\u015fit num\u0103rul maxim de coloane: {$cols}.",colgroup:"Grupeaz\u0103 celule",rowgroup:"Grupeaz\u0103 r\u00e2nduri",scope:"Scop",tfoot:"Subsol tabel",tbody:"Corp tabel",thead:"Antet tabel",row_all:"Actualizeaz\u0103 toate r\u00e2ndurile",row_even:"Actualizeaz\u0103 r\u00e2ndurile pare",row_odd:"Actualizeaz\u0103 r\u00e2ndurile impare",row_row:"Actualizeaz\u0103 r\u00e2nd curent",cell_all:"Actualizeaz\u0103 toate celulele din tabel",cell_row:"Actualizeaz\u0103 toate celulele din r\u00e2nd",cell_cell:"Actualizeaz\u0103 celula curent\u0103",th:"Antet",td:"Date",summary:"Sumar",bgimage:"Imagine de fundal",rtl:"De la dreapta la st\u00e2nga",ltr:"De la st\u00e2nga la dreapta",mime:"MIME type \u0163int\u0103",langcode:"Cod limb\u0103",langdir:"Direc\u0163ie limb\u0103",style:"Stil",id:"Id",merge_cells_title:"Uni\u0163i celulele",bgcolor:"Culoare fundal",bordercolor:"Culoare bordur\u0103",align_bottom:"Jos",align_top:"Sus",valign:"Aliniere vertical\u0103",cell_type:"Tip celul\u0103",cell_title:"Propriet\u0103\u0163i celul\u0103",row_title:"Propriet\u0103\u0163i r\u00e2nd",align_middle:"Centru",align_right:"Dreapta",align_left:"St\u00e2nga",align_default:"Implicit\u0103",align:"Aliniere",border:"Bordur\u0103",cellpadding:"Spa\u0163iu \u00een celule",cellspacing:"Spa\u0163iu \u00eentre celule",rows:"R\u00e2nduri",cols:"Coloane",height:"\u00cen\u0103l\u0163ime",width:"L\u0103\u0163ime",title:"Inserare/modificare tabel",rowtype:"R\u0103nd \u00een tabel",advanced_props:"Propriet\u0103\u0163i avansate",general_props:"Propriet\u0103\u0163i generale",advanced_tab:"Avansat",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ru_dlg.js b/js/tiny_mce/plugins/table/langs/ru_dlg.js new file mode 100755 index 000000000..0721ef80c --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"\u041f\u0440\u0430\u0432\u0438\u043b\u0430","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"\u041a\u0430\u0434\u0440",caption:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","missing_scope":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043b\u043e\u043b\u0432\u043a\u0430? \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c.","cell_limit":"\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0432\u0439 \u043f\u0440\u0435\u0434\u0435\u043b, \u0432 $ \u044f\u0447\u0435\u0435\u043a.","row_limit":"\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0432\u0439 \u043f\u0440\u0435\u0434\u0435\u043b, \u0432 $ \u0441\u0442\u0440\u043e\u043a.","col_limit":"\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0432\u0439 \u043f\u0440\u0435\u0434\u0435\u043b, \u0432 $ \u043a\u043e\u043b\u043e\u043d\u043e\u043a.",colgroup:"\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432",rowgroup:"\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u0440\u043e\u043a",scope:"\u041e\u0431\u043b\u0430\u0441\u0442\u044c",tfoot:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435",tbody:"\u0422\u0435\u043b\u043e",thead:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","row_all":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","row_even":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","row_odd":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","row_row":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443","cell_all":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435","cell_row":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435","cell_cell":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443",th:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",td:"\u0414\u0430\u043d\u043d\u044b\u0435",summary:"\u041e\u0431\u0449\u0435\u0435",bgimage:"\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e",ltr:"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",mime:"MIME \u0442\u0438\u043f \u0446\u0435\u043b\u0438",langcode:"\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430",langdir:"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430",style:"\u0421\u0442\u0438\u043b\u044c",id:"\u0418\u043c\u044f","merge_cells_title":"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438",bgcolor:"\u0426\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438",bordercolor:"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",valign:"\u0412\u0435\u0440\u0442. \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","cell_type":"\u0422\u0438\u043f","cell_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438","row_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438","align_middle":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","align_default":"\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",align:"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435",border:"\u0413\u0440\u0430\u043d\u0438\u0446\u0430",cellpadding:"\u041e\u0442\u0441\u0442\u0443\u043f\u044b \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445",cellspacing:"\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438",rows:"\u0421\u0442\u0440\u043e\u043a\u0438",cols:"\u0421\u0442\u043e\u043b\u0431\u0446\u044b",height:"\u0412\u044b\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",title:"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b",rowtype:"\u0422\u0438\u043f \u0441\u0442\u0440\u043e\u043a\u0438","advanced_props":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","general_props":"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","advanced_tab":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","general_tab":"\u041e\u0431\u0449\u0435\u0435"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/sc_dlg.js b/js/tiny_mce/plugins/table/langs/sc_dlg.js new file mode 100755 index 000000000..863e499f0 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.table_dlg',{rules_border:"\u5916\u6846",rules_box:"\u76d2\u578b",rules_vsides:"\u5782\u76f4\u8fb9",rules_rhs:"\u53f3\u8fb9",rules_lhs:"\u5de6\u8fb9",rules_hsides:"\u6c34\u51c6\u8fb9",rules_below:"\u4e0b",rules_above:"\u4e0a",rules_void:"\u7a7a",rules:"\u7ebf\u6761",frame_all:"\u5168\u90e8",frame_cols:"\u5217",frame_rows:"\u884c",frame_groups:"\u7fa4\u7ec4",frame_none:"\u65e0",frame:"\u8fb9\u6846",caption:"\u8868\u683c\u6807\u9898",missing_scope:"\u6807\u9898\u884c\u7f3a\u5931\uff01 ",cell_limit:"\u5df2\u8d85\u8fc7\u53ef\u7528\u6570\uff0c\u6700\u9ad8\u7684\u5355\u683c\u6570\u4e3a{$cells}\u683c\u3002 ",row_limit:"\u5df2\u8d85\u8fc7\u53ef\u7528\u6570\uff0c\u6700\u9ad8\u7684\u884c\u6570\u4e3a{$rows}\u884c\u3002 ",col_limit:"\u5df2\u8d85\u8fc7\u53ef\u7528\u6570\uff0c\u6700\u9ad8\u7684\u5217\u6570\u4e3a{$cols}\u5217\u3002 ",colgroup:"\u5217\u7fa4\u7ec4",rowgroup:"\u884c\u7fa4\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u8eab",thead:"\u8868\u5934",row_all:"\u66f4\u65b0\u8868\u683c\u5185\u5168\u90e8\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u5185\u7684\u5076\u6570\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u5185\u7684\u5947\u6570\u884c",row_row:"\u66f4\u65b0\u6240\u5728\u884c",cell_all:"\u66f4\u65b0\u8868\u683c\u5185\u7684\u5168\u90e8\u5355\u683c",cell_row:"\u66f4\u65b0\u6240\u5728\u884c\u7684\u5168\u90e8\u5355\u683c",cell_cell:"\u66f4\u65b0\u6240\u7684\u5355\u683c",th:"\u8868\u5934",td:"\u6570\u636e",summary:"\u6982\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u7531\u53f3\u5230\u5de6",ltr:"\u7531\u5de6\u5230\u53f3",mime:"\u76ee\u6807MIME\u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"Id",merge_cells_title:"\u5408\u5e76\u5355\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272",align_bottom:"\u4e0b\u65b9",align_top:"\u4e0a\u65b9",valign:"\u6c34\u51c6\u5bf9\u9f50\u65b9\u5f0f",cell_type:"\u5355\u683c\u522b",cell_title:"\u5355\u683c\u5c5e\u6027",row_title:"\u884c\u5c5e\u6027",align_middle:"\u5c45\u4e2d",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_default:"\u9884\u8bbe",align:"\u5bf9\u9f50\u65b9\u5f0f",border:"\u8fb9\u6846",cellpadding:"\u5355\u683c\u7559\u767d",cellspacing:"\u5355\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u5217\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91\u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",general_tab:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/se_dlg.js b/js/tiny_mce/plugins/table/langs/se_dlg.js new file mode 100755 index 000000000..de5c4b7e6 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Regler",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Ram",caption:"\u00d6verskrift",missing_scope:"\u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta utan att ange en omfattning, denna underl\u00e4ttar f\u00f6r icke-grafiska webbl\u00e4sare.",cell_limit:"Du kan inte skapa en tabell med fler \u00e4n {$cells} celler.",row_limit:"Du kan inte ange fler \u00e4n {$rows} rader.",col_limit:"Du kan inte ange fler \u00e4n {$cols} kolumner.",colgroup:"Kolumngrupp",rowgroup:"Radgrupp",scope:"Omfattning",tfoot:"tabellfot",tbody:"tabellkropp",thead:"tabellhuvud",row_all:"Uppdatera alla rader i tabellen",row_even:"Uppdatera j\u00e4mna rader i tabellen",row_odd:"Uppdatera udda rader i tabellen",row_row:"Uppdatera nuvarande rad",cell_all:"Uppdatera alla celler i tabellen",cell_row:"Uppdatera alla celler i raden",cell_cell:"Uppdatera nuvarande cell",th:"Huvud",td:"Data",summary:"Sammanfattning",bgimage:"Bakgrundsbild",rtl:"H\u00f6ger till v\u00e4nster",ltr:"V\u00e4nster till h\u00f6ger",langcode:"Spr\u00e5kkod",langdir:"Skriftriktning",style:"Stil",id:"Id",merge_cells_title:"Sammanfoga celler",bgcolor:"Bakgrundsf\u00e4rg",bordercolor:"Ramf\u00e4rg",align_bottom:"Botten",align_top:"Toppen",valign:"Vertikal justering",cell_type:"Celltyp",cell_title:"Tabellcellsinst\u00e4llningar",row_title:"Tabellradsinst\u00e4llningar",align_middle:"Mitten",align_right:"H\u00f6ger",align_left:"V\u00e4nster",align_default:"Ingen",align:"Justering",border:"Ram",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rader",cols:"Kolumner",height:"H\u00f6jd",width:"Bredd",title:"Infoga/redigera ny tabell",rowtype:"Radtyp",advanced_props:"Avancerade inst\u00e4llningar",general_props:"Generella inst\u00e4llningar",advanced_tab:"Avancerat",general_tab:"Generellt",mime:"Target MIME type"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/si_dlg.js b/js/tiny_mce/plugins/table/langs/si_dlg.js new file mode 100755 index 000000000..abd3e9d66 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/sk_dlg.js b/js/tiny_mce/plugins/table/langs/sk_dlg.js new file mode 100755 index 000000000..f232c30d4 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.table_dlg',{rules_border:"or\u00e1movanie okolo",rules_box:"box okolo",rules_vsides:"v\u013eavo a vpravo",rules_rhs:"vpravo",rules_lhs:"v\u013eavo",rules_hsides:"hore a dole",rules_below:"dole",rules_above:"hore",rules_void:"\u017eiadne",rules:"Vykreslenie mrie\u017eky",frame_all:"v\u0161etko",frame_cols:"st\u013apce",frame_rows:"riadky",frame_groups:"oblasti a skupiny st\u013apcov",frame_none:"\u017eiadna",frame:"Or\u00e1movanie tabu\u013eky",caption:"Nadpis tabu\u013eky",missing_scope:"Skuto\u010dne chcete pokra\u010dova\u0165 bez ur\u010denia oblasti hlavi\u010dky tejto tabu\u013eky? Bez nej m\u00f4\u017ee u niektor\u00fdch u\u017e\u00edvate\u013eov doch\u00e1dza\u0165 k ur\u010dit\u00fdm probl\u00e9mom pri intepret\u00e1cii a zobrazovan\u00ed d\u00e1t v tabu\u013eke.",cell_limit:"Prekro\u010dili ste maxim\u00e1lny po\u010det buniek {$cells}.",row_limit:"Prekro\u010dili ste maxim\u00e1lny po\u010det riadkov {$rows}.",col_limit:"Prekro\u010dili ste maxim\u00e1lny po\u010det st\u013apcov {$cols}.",colgroup:"Skupina st\u013apcov",rowgroup:"Skupina riadkov",scope:"Hlavi\u010dka pre",tfoot:"P\u00e4ta tabu\u013eky",tbody:"Telo tabu\u013eky",thead:"Hlavi\u010dka tabu\u013eky",row_all:"Aktualizova\u0165 v\u0161etky riadky tabu\u013eky",row_even:"Aktualizova\u0165 p\u00e1rne riadky tabu\u013eky",row_odd:"Aktualizova\u0165 nep\u00e1rne riadky tabu\u013eky",row_row:"Aktualizova\u0165 aktu\u00e1lny riadok",cell_all:"Aktualizova\u0165 v\u0161etky bunky v tabu\u013eke",cell_row:"Aktualizova\u0165 v\u0161etky bunky v riadku",cell_cell:"Aktualizova\u0165 aktu\u00e1lnu bunku",th:"Hlavi\u010dka",td:"D\u00e1ta",summary:"Obsah tabu\u013eky",bgimage:"Obr\u00e1zok pozadia",rtl:"Sprava do\u013eava",ltr:"Z\u013eava doprava",mime:"MIME typ cie\u013ea",langcode:"K\u00f3d jazyka",langdir:"Smer textu",style:"\u0160t\u00fdl",id:"ID",merge_cells_title:"Zl\u00fa\u010di\u0165 bunky",bgcolor:"Farba pozadia",bordercolor:"Farba or\u00e1movania",align_bottom:"Dolu",align_top:"Hore",valign:"Vertik\u00e1lne zarovnanie",cell_type:"Typ bunky",cell_title:"Vlastnosti bunky",row_title:"Vlastnosti riadkov",align_middle:"Na stred",align_right:"Vpravo",align_left:"V\u013eavo",align_default:"Predvolen\u00e9",align:"Zarovnanie",border:"Or\u00e1movanie",cellpadding:"Odsadenie obsahu",cellspacing:"Rozstup buniek",rows:"Riadky",cols:"St\u013apce",height:"V\u00fd\u0161ka",width:"\u0160\u00edrka",title:"Vlo\u017ei\u0165/Upravi\u0165 tabu\u013eku",rowtype:"Typ riadku",advanced_props:"Roz\u0161\u00edren\u00e9 parametre",general_props:"Obecn\u00e9 parametre",advanced_tab:"Roz\u0161\u00edren\u00e9",general_tab:"Obecn\u00e9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/sl_dlg.js b/js/tiny_mce/plugins/table/langs/sl_dlg.js new file mode 100755 index 000000000..f5e9464c0 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.table_dlg',{rules_border:"obroba",rules_box:"\u0161katla",rules_vsides:"n-strani",rules_rhs:"d-strani",rules_lhs:"l-strani",rules_hsides:"v-strani",rules_below:"pod",rules_above:"nad",rules_void:"prazno",rules:"Pravila",frame_all:"vse",frame_cols:"stolpci",frame_rows:"vrstice",frame_groups:"skupine",frame_none:"brez",frame:"Okvir",caption:"Opis tabele",missing_scope:"Ste prepri\u010dani, da \u017eelite nadaljevati brez dolo\u010denega dosega? Brez dosega je razumevanje tabele lahko ote\u017eeno ljudem s slab\u0161o zaznavo!",cell_limit:"Presegli ste dovoljeno \u0161tevilo celic: {$cells}.",row_limit:"Presegli ste dovoljeno \u0161tevilo vrstic: {$rows}.",col_limit:"Presegli ste dovoljeno \u0161tevilo stolpcev: {$cols}.",colgroup:"Skup. stolp.",rowgroup:"Skup. vrst.",scope:"Doseg",tfoot:"Noga tabele",tbody:"Telo tabele",thead:"Glava tabele",row_all:"Posodobi vse vrstice",row_even:"Posodobi sode vrstice",row_odd:"Posodobi lihe vrstice",row_row:"Posodobi trenutno vrstico",cell_all:"Posodobi vse celice tabele",cell_row:"Posodobi vse celice vrstice",cell_cell:"Posodobi trenutno celico",th:"Glava",td:"Podatek",summary:"Povzetek",bgimage:"Slika ozadja",rtl:"Od desne proti levi",ltr:"Od leve proti desni",mime:"Ciljni tip MIME",langcode:"Koda jezika",langdir:"Smer pisave",style:"Slog",id:"Oznaka",merge_cells_title:"Spoji celice",bgcolor:"Barva ozadja",bordercolor:"Barva obrobe",align_bottom:"Dno",align_top:"Vrh",valign:"Navpi\u010dna poravnava",cell_type:"Tip celice",cell_title:"Lastnosti celice",row_title:"Lastnosti vrstice",align_middle:"Sredina",align_right:"Desno",align_left:"Levo",align_default:"Privzeto",align:"Poravnava",border:"Obroba",cellpadding:"Podlaganje celic",cellspacing:"Razmik celic",rows:"Vrstic",cols:"Stolpcev",height:"Vi\u0161ina",width:"\u0160irina",title:"Vstavi/posodobi tabelo",rowtype:"Vrstica v tabeli",advanced_props:"Napredne lastnosti",general_props:"Splo\u0161ne lastnosti",advanced_tab:"Napredno",general_tab:"Splo\u0161no"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/sq_dlg.js b/js/tiny_mce/plugins/table/langs/sq_dlg.js new file mode 100755 index 000000000..15aa4531c --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.table_dlg',{rules_border:"korniz\u00eb",rules_box:"kuti",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"posht\u00eb",rules_above:"sip\u00ebr",rules_void:"zbrazur",rules:"Rregullat",frame_all:"t\u00eb gjitha",frame_cols:"kolona",frame_rows:"rreshta",frame_groups:"grupe",frame_none:"asnj\u00eb",frame:"Korniza",caption:"Krijo hap\u00ebsir\u00eb p\u00ebr titull",missing_scope:"Jeni t\u00eb sigurt q\u00eb nuk doni t\u00eb vendosni objektiv p\u00ebr k\u00ebt\u00eb qeliz\u00eb t\u00eb kok\u00ebs. Pa t\u00eb mund t\u00eb jet\u00eb e v\u00ebshtir\u00eb p\u00ebr disa p\u00ebrdorues me aft\u00ebsi t\u00eb kufizuara t\u00eb lexojn\u00eb p\u00ebrmbajtjen e tabel\u00ebs.",cell_limit:"Keni kaluar numrin maksimal t\u00eb qelizave {$cells}.",row_limit:"Keni kaluar numrin maksimal t\u00eb rreshtave: {$rows}.",col_limit:"Keni kaluar numrin maksimal t\u00eb kolonave: {$cols}.",colgroup:"Grup Kolonash",rowgroup:"Grup Rreshtash",scope:"Objektivi",tfoot:"K\u00ebmb\u00ebt e Tabel\u00ebs",tbody:"Trupin e Tabel\u00ebs",thead:"Kok\u00ebn e Tabel\u00ebs",row_all:"Rifresko t\u00eb gjitha rreshtat n\u00eb tabel\u00eb",row_even:"Rifresko rreshtat \u00e7ift",row_odd:"Rifresko rreshtat tek",row_row:"Rifresko rreshtin aktual",cell_all:"Rifresko t\u00eb gjitha qelizat",cell_row:"Rifresko t\u00eb gjitha qelizat n\u00eb rresht",cell_cell:"Rifresko qeliz\u00ebn aktuale",th:"Kok\u00eb",td:"T\u00eb dh\u00ebna",summary:"P\u00ebrmbledhja",bgimage:"Foto e fush\u00ebs",rtl:"Djathtas-Majtas",ltr:"Majtas-Djathtas",mime:"Tipi MIME i sh\u00ebnjestr\u00ebs",langcode:"Kodi i gjuh\u00ebs",langdir:"Drejtimi i gjuh\u00ebs",style:"Stili",id:"Id",merge_cells_title:"Bashko qelizat",bgcolor:"Ngjyra e fush\u00ebs",bordercolor:"Ngjyra e korniz\u00ebs",align_bottom:"Fund",align_top:"Krye",valign:"Drejtimi vertikal",cell_type:"Tipi i qeliz\u00ebs",cell_title:"Tiparet e qeliz\u00ebs",row_title:"Tiparet e rreshtit",align_middle:"Qend\u00ebr",align_right:"Djathtas",align_left:"Majtas",align_default:"Paracaktuar",align:"Drejtimi",border:"Korniza",cellpadding:"Hap\u00ebsira e br\u00ebndshme",cellspacing:"Hap\u00ebsira midis qelizave",rows:"Rreshta",cols:"Kolona",height:"Gjat\u00ebsia",width:"Gjer\u00ebsia",title:"Fut/Edito tabel\u00eb",rowtype:"Rresht n\u00eb",advanced_props:"Tipare t\u00eb avancuara",general_props:"Tipare t\u00eb p\u00ebrgjithshme",advanced_tab:"T\u00eb avancuara",general_tab:"T\u00eb p\u00ebrgjithshme"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/sr_dlg.js b/js/tiny_mce/plugins/table/langs/sr_dlg.js new file mode 100755 index 000000000..49e051f80 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.table_dlg',{rules_border:"sve ivice",rules_box:"sve strane",rules_vsides:"levo i desno",rules_rhs:"samo desno",rules_lhs:"samo levo",rules_hsides:"gornja i donja",rules_below:"ispod",rules_above:"iznad",rules_void:"prazno",rules:"Linije",frame_all:"sve",frame_cols:"kolone",frame_rows:"redovi",frame_groups:"grupe",frame_none:"bez rama",frame:"ram",caption:"Opis tabele",missing_scope:"Da li ste sigurni da \u017eelite da nastavite a da niste definisali obim \u0107elije zaglavlja tabele. Kada nije definisan, korisnicima sa smetnjama u razvoju mo\u017eda ne\u0107e biti razumljiv njihov sadr\u017eaj.",cell_limit:"Prema\u0161ili ste maksimalni broj \u0107elija ({$cells}).",row_limit:"Prema\u0161ili ste maksimalni broj redova ({$rows}).",col_limit:"Prema\u0161ili ste maksimalni broj kolona ({$cols}).",colgroup:"Grupa kolona",rowgroup:"Grupa redova",scope:"Obim",tfoot:"Podno\u017eje tabele",tbody:"Sadr\u017eaj tabele",thead:"Zaglavlje tabele",row_all:"Primeni na sve redove u tabeli",row_even:"Primeni na parne redove u tabeli",row_odd:"Primeni na neparne redove u tabeli",row_row:"Primeni na izabrani red",cell_all:"Primeni na sve \u0107elije u tabeli",cell_row:"Primeni na sve \u0107elije u redu",cell_cell:"Primeni na izabranu \u0107eliju",th:"Zaglavlje",td:"Podaci",summary:"Prikaz",bgimage:"Slika pozadine",rtl:"S desna na levo",ltr:"S leva na desno",mime:"MIME tip",langcode:"Kod jezika",langdir:"Smer jezika",style:"Stil",id:"Id",merge_cells_title:"Spoji \u0107elije",bgcolor:"Boja pozadine",bordercolor:"Boja ivice",align_bottom:"Dno",align_top:"Vrh",valign:"Vertikalno poravnavanje",cell_type:"Tip \u0107elije",cell_title:"Svojstva \u0107elije",row_title:"Svojstva reda",align_middle:"Sredina",align_right:"Desno",align_left:"Levo",align_default:"Zadato",align:"Poravnavanje",border:"Ivica",cellpadding:"Dopuna \u0107elije",cellspacing:"Razmak \u0107elija",rows:"Redova",cols:"Kolona",height:"Visina",width:"\u0160irina",title:"Ubaci/uredi tabelu",rowtype:"Red u tabeli",advanced_props:"Napredna svojstva",general_props:"Osnovna svojstva",advanced_tab:"Napredno",general_tab:"Osnovno"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/sv_dlg.js b/js/tiny_mce/plugins/table/langs/sv_dlg.js new file mode 100755 index 000000000..687daa4d3 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Regler","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Ram",caption:"\u00d6verskrift","missing_scope":"\u00d6\u0084r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta utan att ange en omfattning, denna underl\u00e4ttar f\u00f6r icke-grafiska webbl\u00e4sare.","cell_limit":"Du kan inte skapa en tabell med fler \u00e4n {$cells} celler.","row_limit":"Du kan inte ange fler \u00e4n {$rows} rader.","col_limit":"Du kan inte ange fler \u00e4n {$cols} kolumner.",colgroup:"Kolumngrupp",rowgroup:"Radgrupp",scope:"Omfattning",tfoot:"tabellfot",tbody:"tabellkropp",thead:"tabellhuvud","row_all":"Uppdatera alla rader i tabellen","row_even":"Uppdatera j\u00e4mna rader i tabellen","row_odd":"Uppdatera udda rader i tabellen","row_row":"Uppdatera nuvarande rad","cell_all":"Uppdatera alla celler i tabellen","cell_row":"Uppdatera alla celler i raden","cell_cell":"Uppdatera nuvarande cell",th:"Huvud",td:"Data",summary:"Sammanfattning",bgimage:"Bakgrundsbild",rtl:"H\u00f6ger till v\u00e4nster",ltr:"V\u00e4nster till h\u00f6ger",mime:"Target MIME type",langcode:"Spr\u00e5kkod",langdir:"Skriftriktning",style:"Stil",id:"Id","merge_cells_title":"Sammanfoga celler",bgcolor:"Bakgrundsf\u00e4rg",bordercolor:"Ramf\u00e4rg","align_bottom":"Botten","align_top":"Toppen",valign:"Vertikal justering","cell_type":"Celltyp","cell_title":"Tabellcellsinst\u00e4llningar","row_title":"Tabellradsinst\u00e4llningar","align_middle":"Mitten","align_right":"H\u00f6ger","align_left":"V\u00e4nster","align_default":"Ingen",align:"Justering",border:"Ram",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rader",cols:"Kolumner",height:"H\u00f6jd",width:"Bredd",title:"Infoga/redigera ny tabell",rowtype:"Radtyp","advanced_props":"Avancerade inst\u00e4llningar","general_props":"Generella inst\u00e4llningar","advanced_tab":"Avancerat","general_tab":"Generellt"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ta_dlg.js b/js/tiny_mce/plugins/table/langs/ta_dlg.js new file mode 100755 index 000000000..3d60f8959 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/te_dlg.js b/js/tiny_mce/plugins/table/langs/te_dlg.js new file mode 100755 index 000000000..6ce7b3c14 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/th_dlg.js b/js/tiny_mce/plugins/table/langs/th_dlg.js new file mode 100755 index 000000000..cd8f8ab4d --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07 image",rtl:"\u0e02\u0e27\u0e32\u0e44\u0e1b\u0e0b\u0e49\u0e32\u0e22",ltr:"\u0e0b\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e02\u0e27\u0e32",mime:"\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 MIME type",langcode:"\u0e42\u0e04\u0e4a\u0e14\u0e20\u0e32\u0e29\u0e32",langdir:"\u0e17\u0e34\u0e28\u0e17\u0e32\u0e07\u0e01\u0e32\u0e23\u0e2d\u0e48\u0e32\u0e19",style:"\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"\u0e2a\u0e35\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",bordercolor:"\u0e2a\u0e35\u0e01\u0e23\u0e2d\u0e1a",align_bottom:"\u0e25\u0e48\u0e32\u0e07",align_top:"\u0e1a\u0e19",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e40\u0e0b\u0e25\u0e25\u0e4c\u0e43\u0e19\u0e32\u0e23\u0e32\u0e07",row_title:"\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e41\u0e16\u0e27\u0e43\u0e19\u0e15\u0e32\u0e23\u0e32\u0e07",align_middle:"\u0e01\u0e25\u0e32\u0e07",align_right:"\u0e02\u0e27\u0e32",align_left:"\u0e0b\u0e49\u0e32\u0e22",align_default:"\u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19",align:"\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07\u0e08\u0e31\u0e14\u0e27\u0e32\u0e07",border:"\u0e01\u0e23\u0e2d\u0e1a",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"\u0e41\u0e16\u0e27",cols:"\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e1e\u0e4c",height:"\u0e2a\u0e39\u0e07",width:"\u0e01\u0e27\u0e49\u0e32\u0e07",title:"\u0e40\u0e1e\u0e34\u0e48\u0e21/\u0e41\u0e01\u0e49\u0e44\u0e02 \u0e15\u0e32\u0e23\u0e32\u0e07",rowtype:"Row in table part",advanced_props:"\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07",general_props:"\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",advanced_tab:"\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07",general_tab:"\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/tn_dlg.js b/js/tiny_mce/plugins/table/langs/tn_dlg.js new file mode 100755 index 000000000..d342f79fd --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/tr_dlg.js b/js/tiny_mce/plugins/table/langs/tr_dlg.js new file mode 100755 index 000000000..3ce108fd6 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.table_dlg',{rules_border:"kenarl\u0131k",rules_box:"kutu",rules_vsides:"dikey kenarlar",rules_rhs:"sa\u011f yatay kenarlar",rules_lhs:"sol yatay kenarlar",rules_hsides:"yatay kenarlar",rules_below:"alt\u0131nda",rules_above:"\u00fcst\u00fcnde",rules_void:"yok",rules:"\u00c7izgiler",frame_all:"t\u00fcm\u00fc",frame_cols:"s\u00fctunlar",frame_rows:"sat\u0131rlar",frame_groups:"gruplar",frame_none:"hi\u00e7biri",frame:"\u00c7er\u00e7eve",caption:"Tablo ba\u015fl\u0131\u011f\u0131",missing_scope:"Tablo ba\u015fl\u0131k h\u00fccresi i\u00e7in bir kapsam belirlemeden devam etmek istedi\u011finize emin misiniz? Bu de\u011fer olmadan, engelli kullan\u0131c\u0131lar tabloda g\u00f6sterilen verileri ve i\u00e7eri\u011fi anlamas\u0131 zordur.",cell_limit:"Maksimum h\u00fccre say\u0131s\u0131 ($cells) a\u015f\u0131ld\u0131.",row_limit:"Maksimum sat\u0131r say\u0131s\u0131 ($rows) a\u015f\u0131ld\u0131.",col_limit:"Maksimum s\u00fctun say\u0131s\u0131 ($cols) a\u015f\u0131ld\u0131.",colgroup:"S\u00fctun Grubu",rowgroup:"Sat\u0131r Grubu",scope:"Kapsam",tfoot:"Tablo Alt\u0131",tbody:"Tablo G\u00f6vdesi",thead:"Tablo Ba\u015fl\u0131\u011f\u0131",row_all:"Tablodaki t\u00fcm sat\u0131rlar\u0131 g\u00fcncelle",row_even:"Tablodaki \u00e7ift nolu sat\u0131rlar\u0131 g\u00fcncelle",row_odd:"Tablodaki tek nolu sat\u0131rlar\u0131 g\u00fcncelle",row_row:"Se\u00e7ili sat\u0131r\u0131 g\u00fcncelle",cell_all:"Tablodaki t\u00fcm h\u00fccreleri g\u00fcncelle",cell_row:"Sat\u0131rdaki t\u00fcm h\u00fccreleri g\u00fcncelle",cell_cell:"Se\u00e7ili h\u00fccreleri g\u00fcncelle",th:"Ba\u015fl\u0131k",td:"Veri",summary:"\u00d6zet",bgimage:"Arkaplan resmi",rtl:"Soldan sa\u011fa",ltr:"Sa\u011fdan sola",mime:"Hedef MIME tipi",langcode:"Dil kodu",langdir:"Dil y\u00f6n\u00fc",style:"Stil",id:"Id",merge_cells_title:"Tablo h\u00fccrelerini birle\u015ftir",bgcolor:"Arkaplan rengi",bordercolor:"Kenarl\u0131k rengi",align_bottom:"Alt",align_top:"\u00dcst",valign:"Dikey hizalama",cell_type:"H\u00fccre tipi",cell_title:"Tablo h\u00fccre \u00f6zellikleri",row_title:"Tablo sat\u0131r \u00f6zellikleri",align_middle:"Orta",align_right:"Sa\u011f",align_left:"Sol",align_default:"Varsay\u0131lan",align:"Hizalama",border:"Kenarl\u0131k",cellpadding:"H\u00fccre d\u0131\u015f\u0131 bo\u015flu\u011fu",cellspacing:"H\u00fccre i\u00e7i bo\u015flu\u011fu",rows:"Sat\u0131rlar",cols:"S\u00fctunlar",height:"Y\u00fckseklik",width:"Geni\u015flik",title:"Tablo Ekle/D\u00fczenle",rowtype:"Tablo b\u00f6l\u00fcm\u00fcndeki sat\u0131r",advanced_props:"Geli\u015fmi\u015f \u00f6zellikler",general_props:"Genel \u00f6zellikler",advanced_tab:"Geli\u015fmi\u015f",general_tab:"Genel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/tt_dlg.js b/js/tiny_mce/plugins/table/langs/tt_dlg.js new file mode 100755 index 000000000..638e8a920 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.table_dlg',{rules_border:"\u908a\u6846",rules_box:"\u76d2",rules_vsides:"\u5782\u76f4\u5927\u5c0f",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"\u6c34\u5e73\u5927\u5c0f",rules_below:"\u4e4b\u4e0b",rules_above:"\u4e4b\u4e0a",rules_void:"\u7a7a",rules:"\u5c3a\u898f",frame_all:"\u5168\u90e8",frame_cols:"\u5217",frame_rows:"\u884c",frame_groups:"\u7d44",frame_none:"\u7121",frame:"\u908a\u6846",caption:"\u8868\u683c\u6a19\u984c",missing_scope:"\u60a8\u78ba\u5b9a\u4e0d\u6307\u5b9a\u8868\u982d\u5132\u5b58\u683c\u7684\u7bc4\u570d\u55ce\uff1f\u5982\u679c\u4e0d\u6307\u5b9a\uff0c\u90e8\u5206\u4f7f\u7528\u8005\u5c07\u5f88\u96e3\u67e5\u770b\u8868\u683c\u5167\u5bb9",cell_limit:"\u5df2\u8d85\u904e\u9650\u5236\uff0c\u6700\u591a\u7232{$cells} \u5132\u5b58\u683c\u3002",row_limit:"\u5df2\u8d85\u904e\u9650\u5236\uff0c\u6700\u591a\u7232 {$rows} \u884c\u3002",col_limit:"\u5df2\u8d85\u904e\u9650\u5236\uff0c\u6700\u591a\u7232 {$cols} \u5217\u3002",colgroup:"\u5217\u7d44",rowgroup:"\u884c\u7d44",scope:"\u7bc4\u570d",tfoot:"\u8868\u8173",tbody:"\u8868\u9ad4",thead:"\u8868\u982d",row_all:"\u66f4\u65b0\u8868\u683c\u7684\u5168\u90e8\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6578\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6578\u884c",row_row:"\u66f4\u65b0\u6240\u5728\u884c",cell_all:"\u66f4\u65b0\u5168\u90e8\u5132\u5b58\u683c",cell_row:"\u66f4\u65b0\u7576\u524d\u884c\u7684\u5132\u5b58\u683c",cell_cell:"\u66f4\u65b0\u76ee\u524d\u7684\u5132\u5b58\u683c",th:"\u8868\u982d",td:"\u8868\u683c",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u5716\u7247",rtl:"\u5f9e\u53f3\u5230\u5de6",ltr:"\u5f9e\u5de6\u5230\u53f3",mime:"\u76ee\u6a19 MIME \u985e\u578b",langcode:"\u8a9e\u8a00\u7de8\u78bc",langdir:"\u8a9e\u8a00\u66f8\u5beb\u65b9\u5411",style:"\u6a23\u5f0f",id:"Id",merge_cells_title:"\u5408\u4f75\u5132\u5b58\u683c",bgcolor:"\u80cc\u666f\u9854\u8272",bordercolor:"\u908a\u6846\u9854\u8272",align_bottom:"\u5e95\u90e8",align_top:"\u9802\u90e8",valign:"\u5782\u76f4\u5c0d\u9f4a\u65b9\u5f0f",cell_type:"\u5132\u5b58\u683c \u985e\u5225",cell_title:"\u5132\u5b58\u683c \u5c6c\u6027",row_title:"\u884c \u5c6c\u6027",align_middle:"\u7f6e\u4e2d",align_right:"\u5c45\u53f3",align_left:"\u5c45\u5de6",align_default:"\u9810\u8a2d",align:"\u5c0d\u9f4a\u65b9\u5f0f",border:"\u908a\u6846",cellpadding:"\u5132\u5b58\u683c\u5167\u8ddd",cellspacing:"\u5132\u5b58\u683c\u9593\u8ddd",rows:"\u884c\u6578",cols:"\u5217\u6578",height:"\u9ad8\u5ea6",width:"\u5bec\u5ea6",title:"\u63d2\u5165/\u7de8\u8f2f \u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9032\u968e\u5c6c\u6027",general_props:"\u57fa\u672c \u5c6c\u6027",advanced_tab:"\u9032\u968e",general_tab:"\u57fa\u672c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/tw_dlg.js b/js/tiny_mce/plugins/table/langs/tw_dlg.js new file mode 100755 index 000000000..6cd369e74 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.table_dlg',{rules_border:"\u5916\u6846",rules_box:"\u76d2\u578b",rules_vsides:"\u5782\u76f4",rules_rhs:"\u53f3\u908a",rules_lhs:"\u5de6\u908a",rules_hsides:"\u6c34\u5e73",rules_below:"\u4e0b",rules_above:"\u4e0a",rules_void:"\u7a7a",rules:"\u898f\u5247",frame_all:"\u5168\u90e8",frame_cols:"\u6b04",frame_rows:"\u884c",frame_groups:"\u7fa4\u7d44",frame_none:"\u7121",frame:"\u6846\u67b6",caption:"\u8868\u683c\u6a19\u984c",missing_scope:"\u60a8\u78ba\u5b9a\u4e0d\u6307\u5b9a\u8868\u683c\u982d\u90e8\u5132\u5b58\u683c\u4e00\u500b\u7bc4\u570d\u55ce\uff1f\u6c92\u6709\u5b83\uff0c\u6216\u8a31\u5c0d\u90a3\u4e9b\u6709\u969c\u7919\u7684\u4f7f\u7528\u8005\u7406\u89e3\u8868\u683c\u5c55\u793a\u7684\u5167\u5bb9\u6216\u6578\u64da\u66f4\u52a0\u7684\u56f0\u96e3\u3002",cell_limit:"\u5df2\u8d85\u904e\u6700\u5927\u5132\u5b58\u683c\u9650\u5236{$cells} \u5132\u5b58\u683c\u3002",row_limit:"\u5df2\u8d85\u904e\u6700\u5927\u884c\u6578\u9650\u5236 {$rows} \u5217\u3002",col_limit:"\u5df2\u8d85\u904e\u6700\u5927\u6b04\u6578\u9650\u5236 {$cols} \u6b04\u3002",colgroup:"\u6b04\u7fa4\u7d44",rowgroup:"\u884c\u7fa4\u7d44",scope:"\u7bc4\u570d",tfoot:"\u8868\u5c3e",tbody:"\u8868\u683c\u4e3b\u9ad4",thead:"\u8868\u982d",row_all:"\u66f4\u65b0\u8868\u683c\u7684\u6240\u6709\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6578\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6578\u884c",row_row:"\u66f4\u65b0\u76ee\u524d\u884c",cell_all:"\u66f4\u65b0\u6240\u6709\u5132\u5b58\u683c",cell_row:"\u66f4\u65b0\u76ee\u524d\u884c\u7684\u5132\u5b58\u683c",cell_cell:"\u66f4\u65b0\u76ee\u524d\u5132\u5b58\u683c",th:"\u8868\u982d",td:"\u8cc7\u6599",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u5716\u7247",rtl:"\u5f9e\u53f3\u5230\u5de6",ltr:"\u5f9e\u5de6\u5230\u53f3",mime:"MIME \u985e\u578b",langcode:"\u8a9e\u8a00\u7de8\u78bc",langdir:"\u8a9e\u8a00\u66f8\u5beb\u65b9\u5411",style:"\u6a23\u5f0f",id:"ID",merge_cells_title:"\u5408\u4f75\u5132\u5b58\u683c",bgcolor:"\u80cc\u666f\u984f\u8272",bordercolor:"\u908a\u6846\u984f\u8272",align_bottom:"\u9760\u4e0b",align_top:"\u9760\u4e0a",valign:"\u5782\u76f4\u5c0d\u9f4a",cell_type:"\u5132\u5b58\u683c\u985e\u578b",cell_title:"\u5132\u5b58\u683c\u6a19\u984c",row_title:"\u884c\u5c6c\u6027",align_middle:"\u7f6e\u4e2d\u5c0d\u9f4a",align_right:"\u9760\u53f3\u5c0d\u9f4a",align_left:"\u9760\u5de6\u5c0d\u9f4a",align_default:"\u9810\u8a2d",align:"\u5c0d\u9f4a\u65b9\u5f0f",border:"\u908a\u6846",cellpadding:"\u5132\u5b58\u683c\u908a\u8ddd",cellspacing:"\u5132\u5b58\u683c\u9593\u8ddd",rows:"\u884c\u6578",cols:"\u6b04\u6578",height:"\u9ad8\u5ea6",width:"\u5bec\u5ea6",title:"\u63d2\u5165/\u7de8\u8f2f\u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9032\u968e\u5c6c\u6027",general_props:"\u4e00\u822c\u5c6c\u6027",advanced_tab:"\u9032\u968e",general_tab:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/uk_dlg.js b/js/tiny_mce/plugins/table/langs/uk_dlg.js new file mode 100755 index 000000000..e3ae70236 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.table_dlg',{rules_border:"\u0440\u0430\u043c\u043a\u0430",rules_box:"\u0431\u043e\u043a\u0441",rules_vsides:"v-\u0441\u0442\u043e\u0440\u043e\u043d\u0438",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"h-\u0441\u0442\u043e\u0440\u043e\u043d\u0438",rules_below:"\u0437\u043d\u0438\u0437\u0443",rules_above:"\u0437\u0432\u0435\u0440\u0445\u0443",rules_void:"\u043f\u0443\u0441\u0442\u043e",rules:"\u041f\u0440\u0430\u0432\u0438\u043b\u0430",frame_all:"\u0432\u0441\u0456",frame_cols:"\u0441\u0442\u043e\u0432\u043f\u0446\u0456",frame_rows:"\u0440\u044f\u0434\u043a\u0438",frame_groups:"\u0433\u0440\u0443\u043f\u0438",frame_none:"\u043d\u0456\u044f\u043a\u0438\u0439",frame:"\u0424\u0440\u0435\u0439\u043c",caption:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0456",missing_scope:"\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438 \u043d\u0435 \u0432\u043a\u0430\u0437\u0430\u0432\u0448\u0438 \u043c\u0435\u0436\u0456 \u0434\u043b\u044f \u0446\u0456\u0454\u0457 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443. \u0411\u0435\u0437 \u0446\u044c\u043e\u0433\u043e \u0434\u0435\u044f\u043a\u0438\u043c \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043c \u0431\u0443\u0434\u0435 \u0432\u0430\u0436\u043a\u043e \u0437\u0440\u043e\u0437\u0443\u043c\u0456\u0442\u0438 \u0437\u043c\u0456\u0441\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0456.",cell_limit:"\u0412\u0438 \u043f\u0435\u0440\u0435\u0432\u0438\u0449\u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u043a\u043e\u043c\u0456\u0440\u043e\u043a: {$cells}.",row_limit:"\u0412\u0438 \u043f\u0435\u0440\u0435\u0432\u0438\u0449\u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0440\u044f\u0434\u043a\u0456\u0432: {$rows}.",col_limit:"\u0412\u0438 \u043f\u0435\u0440\u0435\u0432\u0438\u0449\u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443 \u043a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0441\u0442\u043e\u0432\u043f\u0446\u0456\u0432: {$cols}.",colgroup:"\u0413\u0440\u0443\u043f\u0430 \u0441\u0442\u043e\u0432\u043f\u0446\u0456\u0432",rowgroup:"\u0413\u0440\u0443\u043f\u0430 \u043a\u043e\u043c\u0456\u0440\u043e\u043a",scope:"\u0420\u043e\u0437\u043c\u0430\u0445",tfoot:"\u041d\u0438\u0436\u043d\u044f \u0447\u0430\u0441\u0442\u0438\u043d\u0430",tbody:"\u0422\u0456\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0456",thead:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0456",row_all:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u044f\u0434\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0456",row_even:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u043f\u0430\u0440\u043d\u0456 \u0440\u044f\u0434\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0456",row_odd:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u043d\u0435\u043f\u0430\u0440\u043d\u0456 \u0440\u044f\u0434\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446",row_row:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0440\u044f\u0434\u043e\u043a",cell_all:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0456",cell_row:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0432 \u0440\u044f\u0434\u043a\u0443",cell_cell:"\u041e\u043d\u043e\u0432\u0438\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0443 \u043a\u043e\u043c\u0456\u0440\u043a\u0443",th:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",td:"\u0414\u0430\u043d\u043d\u0456",summary:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435",bgimage:"\u0424\u043e\u043d\u043e\u0432\u0435 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0456\u0432\u043e",ltr:"\u0417\u043b\u0456\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",mime:"MIME-\u0442\u0438\u043f \u0446\u0456\u043b\u0456",langcode:"\u041a\u043e\u0434 \u043c\u043e\u0432\u0438",langdir:"\u041d\u0430\u043f\u0440\u044f\u043c \u043c\u043e\u0432\u0438",style:"\u0421\u0442\u0438\u043b\u044c",id:"\u0406\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u043e\u0440",merge_cells_title:"\u041e\u0431\'\u0454\u0434\u043d\u0430\u0442\u0438 \u043a\u043e\u043c\u0456\u0440\u043a\u0438",bgcolor:"\u041a\u043e\u043b\u0456\u0440 \u0444\u043e\u043d\u0443",bordercolor:"\u041a\u043e\u043b\u0456\u0440 \u0433\u0440\u0430\u043d\u0438\u0446\u0456",align_bottom:"\u041f\u043e \u043d\u0438\u0436\u043d\u044c\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_top:"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e",valign:"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0435 \u0432\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f",cell_type:"\u0422\u0438\u043f \u043a\u043e\u043c\u0456\u0440\u043a\u0438",cell_title:"\u0412\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u043a\u043e\u043c\u0456\u0440\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0456",row_title:"\u0412\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456 \u0440\u044f\u0434\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0456",align_middle:"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",align_right:"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_left:"\u041f\u043e \u043b\u0456\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",align_default:"\u0417\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0430\u043d\u043d\u044f\u043c",align:"\u0412\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f",border:"\u0420\u0430\u043c\u043a\u0430",cellpadding:"\u0412\u0456\u0434\u0441\u0442\u0443\u043f\u0438 \u0443 \u043a\u043e\u043c\u0456\u0440\u043a\u0430\u0445",cellspacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043d\u044c \u043c\u0456\u0436 \u043a\u043e\u043c\u0456\u0440\u043a\u0430\u043c\u0438",rows:"\u0420\u044f\u0434\u043a\u0438",cols:"\u0421\u0442\u043e\u0432\u043f\u0446\u0456",height:"\u0412\u0438\u0441\u043e\u0442\u0430",width:"\u0428\u0438\u0440\u0438\u043d\u0430",title:"\u0414\u043e\u0434\u0430\u0442\u0438/\u0417\u043c\u0456\u043d\u0438\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044e",rowtype:"\u0420\u044f\u0434\u043e\u043a \u0432 \u0447\u0430\u0441\u0442\u0438\u043d\u0456 \u0442\u0430\u0431\u043b\u0438\u0446\u0456",advanced_props:"\u0420\u043e\u0437\u0448\u0438\u0440\u0435\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456",general_props:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0456 \u0432\u043b\u0430\u0441\u0442\u0438\u0432\u043e\u0441\u0442\u0456",advanced_tab:"\u0414\u043e\u0434\u0430\u0442\u043a\u043e\u0432\u043e",general_tab:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/ur_dlg.js b/js/tiny_mce/plugins/table/langs/ur_dlg.js new file mode 100755 index 000000000..7232648b1 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.table_dlg',{rules_border:"border",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"below",rules_above:"above",rules_void:"void",rules:"Rules",frame_all:"all",frame_cols:"cols",frame_rows:"rows",frame_groups:"groups",frame_none:"none",frame:"Frame",caption:"Table caption",missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",cell_limit:"You\'ve exceeded the maximum number of cells of {$cells}.",row_limit:"You\'ve exceeded the maximum number of rows of {$rows}.",col_limit:"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Table Foot",tbody:"Table Body",thead:"Table Head",row_all:"Update all rows in table",row_even:"Update even rows in table",row_odd:"Update odd rows in table",row_row:"Update current row",cell_all:"Update all cells in table",cell_row:"Update all cells in row",cell_cell:"Update current cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background image",rtl:"Right to left",ltr:"Left to right",mime:"Target MIME type",langcode:"Language code",langdir:"Language direction",style:"Style",id:"Id",merge_cells_title:"Merge table cells",bgcolor:"Background color",bordercolor:"Border color",align_bottom:"Bottom",align_top:"Top",valign:"Vertical alignment",cell_type:"Cell type",cell_title:"Table cell properties",row_title:"Table row properties",align_middle:"Center",align_right:"Right",align_left:"Left",align_default:"Default",align:"Alignment",border:"Border",cellpadding:"Cellpadding",cellspacing:"Cellspacing",rows:"Rows",cols:"Cols",height:"Height",width:"Width",title:"Insert/Modify table",rowtype:"Row in table part",advanced_props:"Advanced properties",general_props:"General properties",advanced_tab:"Advanced",general_tab:"General"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/vi_dlg.js b/js/tiny_mce/plugins/table/langs/vi_dlg.js new file mode 100755 index 000000000..a182b002a --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.table_dlg',{rules_border:"vi\u1ec1n",rules_box:"box",rules_vsides:"vsides",rules_rhs:"rhs",rules_lhs:"lhs",rules_hsides:"hsides",rules_below:"d\u01b0\u1edbi",rules_above:"tr\u00ean",rules_void:"tr\u1ed1ng kh\u00f4ng",rules:"Th\u01b0\u1edbc",frame_all:"t\u1ea5t",frame_cols:"c\u1ed9t",frame_rows:"h\u00e0ng",frame_groups:"nh\u00f3m",frame_none:"kh\u00f4ng",frame:"Khung",caption:"Ch\u00fa t\u00edch b\u1ea3ng",missing_scope:"Ti\u1ebfp t\u1ee5c v\u1edbi \u0111\u01b0\u1eddng d\u1eabn kh\u00f4ng t\u1ed3n t\u1ea1i ?",cell_limit:"B\u1ea1n \u0111\u00e3 v\u01b0\u1ee3t qu\u00e1 s\u1ed1 t\u1ed1i \u0111a \u00f4 c\u1ee7a {$cells}.",row_limit:"B\u1ea1n \u0111\u00e3 v\u01b0\u1ee3t qu\u00e1 s\u1ed1 t\u1ed1i \u0111a h\u00e0ng c\u1ee7a {$rows}.",col_limit:"B\u1ea1n \u0111\u00e3 v\u01b0\u1ee3t qu\u00e1 s\u1ed1 t\u1ed1i \u0111a c\u1ed9t c\u1ee7a {$cols}.",colgroup:"Nh\u00f3m c\u1ed9t",rowgroup:"Nh\u00f3m h\u00e0ng",scope:"Ph\u1ea1m vi",tfoot:"Ch\u00e2n b\u1ea3ng",tbody:"Th\u00e2n b\u1ea3n",thead:"\u0110\u1ea7u b\u1ea3ng",row_all:"C\u1eadp nh\u1eadt t\u1ea5t h\u00e0ng trong b\u1ea3ng",row_even:"C\u1eadp nh\u1eadt h\u00e0ng ch\u1eb5n trong b\u1ea3ng",row_odd:"C\u1eadp nh\u1eadt h\u00e0ng l\u1ebb trong b\u1ea3ng",row_row:"C\u1eadp nh\u1eadt h\u00e0ng hi\u1ec7n th\u1eddi",cell_all:"C\u1eadp nh\u1ea5t t\u1ea5t c\u00e1c \u00f4 trong b\u1ea3ng",cell_row:"C\u1eadp nh\u1ea5t t\u1ea5t c\u00e1c \u00f4 trong h\u00e0ng",cell_cell:"C\u1eadp nh\u1eadt \u00f4 hi\u1ec7n th\u1eddi",th:"\u0110\u1ea7u \u0111\u1ec1",td:"D\u1eef li\u1ec7u",summary:"T\u00f3m l\u01b0\u1ee3c",bgimage:"\u1ea2nh n\u1ec1n",rtl:"Ph\u1ea3i qua tr\u00e1i",ltr:"Tr\u00e1i qua ph\u1ea3i",mime:"Ki\u1ec3u MIME \u0111\u00edch",langcode:"M\u00e3 ng\u00f4n ng\u1eef",langdir:"H\u01b0\u1edbng ng\u00f4n ng\u1eef",style:"Ki\u1ec3u d\u00e1ng",id:"Id",merge_cells_title:"K\u1ebft h\u1ee3p c\u00e1c \u00f4 c\u1ee7a b\u1ea3ng",bgcolor:"M\u00e0u n\u1ec1n",bordercolor:"M\u00e0u vi\u1ec1n",align_bottom:"D\u01b0\u1edbi",align_top:"Tr\u00ean",valign:"Canh l\u1ec1 d\u1ecdc",cell_type:"Lo\u1ea1i \u00f4",cell_title:"Thu\u1ed9c t\u00ednh \u00f4",row_title:"Thu\u1ed9c t\u00ednh h\u00e0ng",align_middle:"Gi\u1eefa",align_right:"Ph\u1ea3i",align_left:"Tr\u00e1i",align_default:"M\u1eb7c \u0111\u1ecbnh",align:"Canh l\u1ec1",border:"Vi\u1ec1n",cellpadding:"Kho\u1ea3ng l\u00f3t \u00f4",cellspacing:"Kho\u1ea3ng c\u00e1ch \u00f4",rows:"H\u00e0ng",cols:"C\u1ed9t",height:"Chi\u1ec1u cao",width:"Chi\u1ec1u r\u1ed9ng",title:"Ch\u00e8n/S\u1eeda b\u1ea3ng",rowtype:"H\u00e0ng trong t\u1eebng ph\u1ea7n b\u1ea3ng",advanced_props:"Thu\u1ed9c t\u00ednh n\u00e2ng cao",general_props:"Thu\u1ed9c t\u00ednh chung",advanced_tab:"N\u00e2ng cao",general_tab:"Chung"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/table/langs/zh-cn_dlg.js new file mode 100755 index 000000000..bfcad0871 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.table_dlg',{"rules_border":"\u8fb9\u6846","rules_box":"\u6846","rules_vsides":"\u5782\u76f4","rules_rhs":"\u53f3\u8fb9","rules_lhs":"\u5de6\u8fb9","rules_hsides":"\u6c34\u5e73","rules_below":"\u4e0b","rules_above":"\u4e0a","rules_void":"\u7a7a",rules:"\u89c4\u5219","frame_all":"\u5168\u90e8","frame_cols":"\u5217","frame_rows":"\u884c","frame_groups":"\u5206\u7ec4","frame_none":"\u65e0",frame:"\u6846\u67b6",caption:"\u683c\u6807\u9898","missing_scope":"\u60a8\u6ca1\u6709\u6307\u5b9a\u8868\u683c\u7684\u6807\u9898\u5355\u5143\uff0c\u5982\u679c\u4e0d\u8bbe\u7f6e\uff0c\u53ef\u80fd\u4f1a\u4f7f\u7528\u6237\u96be\u4ee5\u7406\u89e3\u60a8\u7684\u8868\u683c\u7684\u5185\u5bb9\u3002\u60a8\u8981\u7ee7\u7eed\u5417\uff1f","cell_limit":"\u5df2\u7ecf\u8d85\u51fa\u6700\u5927\u5355\u5143\u683c\u6570{$cells}\u3002","row_limit":"\u5df2\u7ecf\u8d85\u51fa\u6700\u5927\u884c\u6570{$rows}\u3002","col_limit":"\u5df2\u7ecf\u8d85\u51fa\u6700\u5927\u5217\u6570{$cols}\u3002",colgroup:"\u5217\u5206\u7ec4",rowgroup:"\u884c\u5206\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u683c\u4e3b\u4f53",thead:"\u8868\u5934","row_all":"\u66f4\u65b0\u8868\u683c\u7684\u6240\u6709\u884c","row_even":"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6570\u884c","row_odd":"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6570\u884c","row_row":"\u66f4\u65b0\u5f53\u524d\u884c","cell_all":"\u66f4\u65b0\u6240\u6709\u5355\u5143\u683c","cell_row":"\u66f4\u65b0\u5f53\u524d\u884c\u7684\u5355\u5143\u683c","cell_cell":"\u66f4\u65b0\u5f53\u524d\u5355\u5143\u683c",th:"\u8868\u5934",td:"\u5185\u5bb9",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",mime:"\u76ee\u6807MIME\u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"ID","merge_cells_title":"\u5408\u5e76\u5355\u5143\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272","align_bottom":"\u9760\u4e0b","align_top":"\u9760\u4e0a",valign:"\u5782\u76f4\u5bf9\u9f50","cell_type":"\u5355\u5143\u683c\u7c7b\u578b","cell_title":"\u5355\u5143\u683c\u5c5e\u6027","row_title":"\u884c\u5c5e\u6027","align_middle":"\u5c45\u4e2d","align_right":"\u53f3\u5bf9\u9f50","align_left":"\u5de6\u5bf9\u9f50","align_default":"\u9ed8\u8ba4",align:"\u5bf9\u9f50",border:"\u8fb9\u6846",cellpadding:"\u5355\u5143\u683c\u8fb9\u8ddd",cellspacing:"\u5355\u5143\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u5217\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91 \u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e","advanced_props":"\u9ad8\u7ea7\u5c5e\u6027","general_props":"\u666e\u901a\u5c5e\u6027","advanced_tab":"\u9ad8\u7ea7","general_tab":"\u666e\u901a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/zh_dlg.js b/js/tiny_mce/plugins/table/langs/zh_dlg.js new file mode 100755 index 000000000..496c27eff --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.table_dlg',{rules_border:"\u5916\u6846",rules_box:"\u76d2\u578b",rules_vsides:"\u5782\u76f4",rules_rhs:"\u53f3\u8fb9",rules_lhs:"\u5de6\u8fb9",rules_hsides:"\u6c34\u5e73",rules_below:"\u4e0b",rules_above:"\u4e0a",rules_void:"\u7a7a",rules:"\u89c4\u5219",frame_all:"\u5168\u90e8",frame_cols:"\u680f",frame_rows:"\u884c",frame_groups:"\u7fa4\u7ec4",frame_none:"\u65e0",frame:"\u6846\u67b6",caption:"\u8868\u683c\u6807\u9898",missing_scope:"\u4f60\u786e\u5b9a\u4e0d\u6307\u5b9a\u8868\u683c\u5934\u90e8\u50a8\u5b58\u683c\u4e00\u4e2a\u8303\u56f4\u5417\uff1f\u6ca1\u6709\u5b83\uff0c\u6216\u8bb8\u5bf9\u90a3\u4e9b\u6709\u969c\u788d\u7684\u7528\u6237\u7406\u89e3\u8868\u683c\u5c55\u793a\u7684\u5185\u5bb9\u6216\u6570\u636e\u66f4\u52a0\u7684\u56f0\u96be\u3002",cell_limit:"\u5df2\u8d85\u8fc7\u6700\u5927\u50a8\u5b58\u683c\u9650\u5236{$cells} \u50a8\u5b58\u683c\u3002",row_limit:"\u5df2\u8d85\u8fc7\u6700\u5927\u884c\u6570\u9650\u5236 {$rows} \u5217\u3002",col_limit:"\u5df2\u8d85\u8fc7\u6700\u5927\u680f\u6570\u9650\u5236 {$cols} \u680f\u3002",colgroup:"\u680f\u7fa4\u7ec4",rowgroup:"\u884c\u7fa4\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u683c\u4e3b\u4f53",thead:"\u8868\u5934",row_all:"\u66f4\u65b0\u8868\u683c\u7684\u6240\u6709\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u7684\u5076\u6570\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u7684\u5947\u6570\u884c",row_row:"\u66f4\u65b0\u76ee\u524d\u884c",cell_all:"\u66f4\u65b0\u6240\u6709\u50a8\u5b58\u683c",cell_row:"\u66f4\u65b0\u76ee\u524d\u884c\u7684\u50a8\u5b58\u683c",cell_cell:"\u66f4\u65b0\u76ee\u524d\u50a8\u5b58\u683c",th:"\u8868\u5934",td:"\u5185\u5bb9",summary:"\u6458\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u4ece\u53f3\u5230\u5de6",ltr:"\u4ece\u5de6\u5230\u53f3",mime:"MIME \u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"ID",merge_cells_title:"\u5408\u4f75\u50a8\u5b58\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272",align_bottom:"\u9760\u4e0b",align_top:"\u9760\u4e0a",valign:"\u5782\u76f4\u5bf9\u9f50",cell_type:"\u50a8\u5b58\u683c\u7c7b\u578b",cell_title:"\u50a8\u5b58\u683c\u6807\u9898",row_title:"\u884c\u5c5e\u6027",align_middle:"\u7f6e\u4e2d\u5bf9\u9f50",align_right:"\u9760\u53f3\u5bf9\u9f50",align_left:"\u9760\u5de6\u5bf9\u9f50",align_default:"\u9ed8\u8ba4",align:"\u5bf9\u9f50\u65b9\u5f0f",border:"\u8fb9\u6846",cellpadding:"\u50a8\u5b58\u683c\u8fb9\u8ddd",cellspacing:"\u50a8\u5b58\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u680f\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91\u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",general_tab:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/langs/zu_dlg.js b/js/tiny_mce/plugins/table/langs/zu_dlg.js new file mode 100755 index 000000000..4ac0335d3 --- /dev/null +++ b/js/tiny_mce/plugins/table/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.table_dlg',{rules_border:"\u5916\u6846",rules_box:"\u76d2\u578b",rules_vsides:"\u5782\u76f4\u8fb9",rules_rhs:"\u53f3\u8fb9",rules_lhs:"\u5de6\u8fb9",rules_hsides:"\u6c34\u51c6\u8fb9",rules_below:"\u4e0b",rules_above:"\u4e0a",rules_void:"\u7a7a",rules:"\u7ebf\u6761",frame_all:"\u5168\u90e8",frame_cols:"\u5217",frame_rows:"\u884c",frame_groups:"\u7fa4\u7ec4",frame_none:"\u65e0",frame:"\u8fb9\u6846",caption:"\u8868\u683c\u6807\u9898",missing_scope:"\u6807\u9898\u884c\u7f3a\u5931\uff01",cell_limit:"\u5df2\u8d85\u8fc7\u53ef\u7528\u6570\uff0c\u6700\u9ad8\u7684\u50a8\u5b58\u683c\u6570\u4e3a{$cells}\u683c\u3002",row_limit:"\u5df2\u8d85\u8fc7\u53ef\u7528\u6570\uff0c\u6700\u9ad8\u7684\u884c\u6570\u4e3a{$rows}\u884c\u3002",col_limit:"\u5df2\u8d85\u8fc7\u53ef\u7528\u6570\uff0c\u6700\u9ad8\u7684\u5217\u6570\u4e3a{$cols}\u5217\u3002",colgroup:"\u5217\u7fa4\u7ec4",rowgroup:"\u884c\u7fa4\u7ec4",scope:"\u8303\u56f4",tfoot:"\u8868\u5c3e",tbody:"\u8868\u8eab",thead:"\u8868\u5934",row_all:"\u66f4\u65b0\u8868\u683c\u5185\u5168\u90e8\u884c",row_even:"\u66f4\u65b0\u8868\u683c\u5185\u7684\u5076\u6570\u884c",row_odd:"\u66f4\u65b0\u8868\u683c\u5185\u7684\u5947\u6570\u884c",row_row:"\u66f4\u65b0\u6240\u5728\u884c",cell_all:"\u66f4\u65b0\u8868\u683c\u5185\u7684\u5168\u90e8\u50a8\u5b58\u683c",cell_row:"\u66f4\u65b0\u6240\u5728\u884c\u7684\u5168\u90e8\u50a8\u5b58\u683c",cell_cell:"\u66f4\u65b0\u6240\u7684\u50a8\u5b58\u683c",th:"\u8868\u5934",td:"\u6570\u636e",summary:"\u6982\u8981",bgimage:"\u80cc\u666f\u56fe\u7247",rtl:"\u7531\u53f3\u5230\u5de6",ltr:"\u7531\u5de6\u5230\u53f3",mime:"\u76ee\u6807MIME\u7c7b\u578b",langcode:"\u8bed\u8a00\u7f16\u7801",langdir:"\u8bed\u8a00\u4e66\u5199\u65b9\u5411",style:"\u6837\u5f0f",id:"Id",merge_cells_title:"\u5408\u5e76\u50a8\u5b58\u683c",bgcolor:"\u80cc\u666f\u989c\u8272",bordercolor:"\u8fb9\u6846\u989c\u8272",align_bottom:"\u4e0b\u65b9",align_top:"\u4e0a\u65b9",valign:"\u6c34\u51c6\u5bf9\u9f50\u65b9\u5f0f",cell_type:"\u50a8\u5b58\u683c\u522b",cell_title:"\u50a8\u5b58\u683c\u5c5e\u6027",row_title:"\u884c\u5c5e\u6027",align_middle:"\u5c45\u4e2d",align_right:"\u9760\u53f3",align_left:"\u9760\u5de6",align_default:"\u9884\u8bbe",align:"\u5bf9\u9f50\u65b9\u5f0f",border:"\u8fb9\u6846",cellpadding:"\u50a8\u5b58\u683c\u7559\u767d",cellspacing:"\u50a8\u5b58\u683c\u95f4\u8ddd",rows:"\u884c\u6570",cols:"\u5217\u6570",height:"\u9ad8\u5ea6",width:"\u5bbd\u5ea6",title:"\u63d2\u5165/\u7f16\u8f91\u8868\u683c",rowtype:"\u884c\u6240\u5728\u7684\u8868\u683c\u4f4d\u7f6e",advanced_props:"\u9ad8\u7ea7\u5c5e\u6027",general_props:"\u4e00\u822c\u5c5e\u6027",advanced_tab:"\u9ad8\u7ea7",general_tab:"\u4e00\u822c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/table/merge_cells.htm b/js/tiny_mce/plugins/table/merge_cells.htm new file mode 100644 index 000000000..d231090e7 --- /dev/null +++ b/js/tiny_mce/plugins/table/merge_cells.htm @@ -0,0 +1,32 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#table_dlg.merge_cells_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/validate.js"></script> + <script type="text/javascript" src="js/merge_cells.js"></script> +</head> +<body style="margin: 8px" role="application"> +<form onsubmit="MergeCellsDialog.merge();return false;" action="#"> + <fieldset> + <legend>{#table_dlg.merge_cells_title}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="3" width="100%"> + <tr> + <td><label for="numcols">{#table_dlg.cols}</label>:</td> + <td align="right"><input type="text" id="numcols" name="numcols" value="" class="number min1 mceFocus" style="width: 30px" aria-required="true" /></td> + </tr> + <tr> + <td><label for="numrows">{#table_dlg.rows}</label>:</td> + <td align="right"><input type="text" id="numrows" name="numrows" value="" class="number min1" style="width: 30px" aria-required="true" /></td> + </tr> + </table> + </fieldset> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/table/row.htm b/js/tiny_mce/plugins/table/row.htm new file mode 100644 index 000000000..c197ff6c7 --- /dev/null +++ b/js/tiny_mce/plugins/table/row.htm @@ -0,0 +1,157 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#table_dlg.row_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/row.js"></script> + <link href="css/row.css" rel="stylesheet" type="text/css" /> +</head> +<body id="tablerow" style="display: none" role="application"> + <form onsubmit="updateAction();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li> + <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#table_dlg.general_props}</legend> + + <table role="presentation" border="0" cellpadding="4" cellspacing="0"> + <tr> + <td><label for="rowtype">{#table_dlg.rowtype}</label></td> + <td class="col2"> + <select id="rowtype" name="rowtype" class="mceFocus"> + <option value="thead">{#table_dlg.thead}</option> + <option value="tbody">{#table_dlg.tbody}</option> + <option value="tfoot">{#table_dlg.tfoot}</option> + </select> + </td> + </tr> + + <tr> + <td><label for="align">{#table_dlg.align}</label></td> + <td class="col2"> + <select id="align" name="align"> + <option value="">{#not_set}</option> + <option value="center">{#table_dlg.align_middle}</option> + <option value="left">{#table_dlg.align_left}</option> + <option value="right">{#table_dlg.align_right}</option> + </select> + </td> + </tr> + + <tr> + <td><label for="valign">{#table_dlg.valign}</label></td> + <td class="col2"> + <select id="valign" name="valign"> + <option value="">{#not_set}</option> + <option value="top">{#table_dlg.align_top}</option> + <option value="middle">{#table_dlg.align_middle}</option> + <option value="bottom">{#table_dlg.align_bottom}</option> + </select> + </td> + </tr> + + <tr id="styleSelectRow"> + <td><label for="class">{#class_name}</label></td> + <td class="col2"> + <select id="class" name="class" class="mceEditableSelect"> + <option value="" selected="selected">{#not_set}</option> + </select> + </td> + </tr> + + <tr> + <td><label for="height">{#table_dlg.height}</label></td> + <td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td> + </tr> + </table> + </fieldset> + </div> + + <div id="advanced_panel" class="panel"> + <fieldset> + <legend>{#table_dlg.advanced_props}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="column1"><label for="id">{#table_dlg.id}</label></td> + <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> + </tr> + + <tr> + <td><label for="style">{#table_dlg.style}</label></td> + <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td> + </tr> + + <tr> + <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> + <td> + <select id="dir" name="dir" style="width: 200px"> + <option value="">{#not_set}</option> + <option value="ltr">{#table_dlg.ltr}</option> + <option value="rtl">{#table_dlg.rtl}</option> + </select> + </td> + </tr> + + <tr> + <td class="column1"><label for="lang">{#table_dlg.langcode}</label></td> + <td> + <input id="lang" name="lang" type="text" value="" style="width: 200px" /> + </td> + </tr> + + <tr> + <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td> + <td id="backgroundimagebrowsercontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td class="column1"><label for="bgcolor" id="bgcolor_label">{#table_dlg.bgcolor}</label></td> + <td> + <span role="group" aria-labelledby="bgcolor_label"> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td> + <td id="bgcolor_pickcontainer">&nbsp;</td> + </tr> + </table> + </span> + </td> + </tr> + </table> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <div> + <select id="action" name="action"> + <option value="row">{#table_dlg.row_row}</option> + <option value="odd">{#table_dlg.row_odd}</option> + <option value="even">{#table_dlg.row_even}</option> + <option value="all">{#table_dlg.row_all}</option> + </select> + </div> + + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/table/table.htm b/js/tiny_mce/plugins/table/table.htm new file mode 100644 index 000000000..4a873b0a6 --- /dev/null +++ b/js/tiny_mce/plugins/table/table.htm @@ -0,0 +1,188 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#table_dlg.title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/validate.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/table.js"></script> + <link href="css/table.css" rel="stylesheet" type="text/css" /> +</head> +<body id="table" style="display: none" role="application" aria-labelledby="app_title"> + <span style="display:none;" id="app_title">{#table_dlg.title}</span> + <form onsubmit="insertTable();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" aria-controls="general_panel" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li> + <li id="advanced_tab" aria-controls="advanced_panel"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#table_dlg.general_props}</legend> + <table role="presentation" border="0" cellpadding="4" cellspacing="0" width="100%"> + <tr> + <td><label id="colslabel" for="cols">{#table_dlg.cols}</label></td> + <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" class="required number min1 mceFocus" aria-required="true" /></td> + <td><label id="rowslabel" for="rows">{#table_dlg.rows}</label></td> + <td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" class="required number min1" aria-required="true" /></td> + </tr> + <tr> + <td><label id="cellpaddinglabel" for="cellpadding">{#table_dlg.cellpadding}</label></td> + <td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" class="number" /></td> + <td><label id="cellspacinglabel" for="cellspacing">{#table_dlg.cellspacing}</label></td> + <td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" class="number" /></td> + </tr> + <tr> + <td><label id="alignlabel" for="align">{#table_dlg.align}</label></td> + <td><select id="align" name="align"> + <option value="">{#not_set}</option> + <option value="center">{#table_dlg.align_middle}</option> + <option value="left">{#table_dlg.align_left}</option> + <option value="right">{#table_dlg.align_right}</option> + </select></td> + <td><label id="borderlabel" for="border">{#table_dlg.border}</label></td> + <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" class="number" /></td> + </tr> + <tr id="width_row"> + <td><label id="widthlabel" for="width">{#table_dlg.width}</label></td> + <td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td> + <td><label id="heightlabel" for="height">{#table_dlg.height}</label></td> + <td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td> + </tr> + <tr id="styleSelectRow" > + <td><label id="classlabel" for="class">{#class_name}</label></td> + <td colspan="3" > + <select id="class" name="class" class="mceEditableSelect"> + <option value="" selected="selected">{#not_set}</option> + </select></td> + </tr> + <tr> + <td class="column1" ><label for="caption">{#table_dlg.caption}</label></td> + <td><input id="caption" name="caption" type="checkbox" class="checkbox" value="true" /></td> + </tr> + </table> + </fieldset> + </div> + + <div id="advanced_panel" class="panel"> + <fieldset> + <legend>{#table_dlg.advanced_props}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="column1"><label for="id">{#table_dlg.id}</label></td> + <td><input id="id" name="id" type="text" value="" class="advfield" /></td> + </tr> + + <tr> + <td class="column1"><label for="summary">{#table_dlg.summary}</label></td> + <td><input id="summary" name="summary" type="text" value="" class="advfield" /></td> + </tr> + + <tr> + <td><label for="style">{#table_dlg.style}</label></td> + <td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td> + </tr> + + <tr> + <td class="column1"><label id="langlabel" for="lang">{#table_dlg.langcode}</label></td> + <td> + <input id="lang" name="lang" type="text" value="" class="advfield" /> + </td> + </tr> + + <tr> + <td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> + <td> + <table role="presentation" aria-labelledby="backgroundimage_label" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td> + <td id="backgroundimagebrowsercontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr> + <td class="column1"><label for="tframe">{#table_dlg.frame}</label></td> + <td> + <select id="tframe" name="tframe" class="advfield"> + <option value="">{#not_set}</option> + <option value="void">{#table_dlg.rules_void}</option> + <option value="above">{#table_dlg.rules_above}</option> + <option value="below">{#table_dlg.rules_below}</option> + <option value="hsides">{#table_dlg.rules_hsides}</option> + <option value="lhs">{#table_dlg.rules_lhs}</option> + <option value="rhs">{#table_dlg.rules_rhs}</option> + <option value="vsides">{#table_dlg.rules_vsides}</option> + <option value="box">{#table_dlg.rules_box}</option> + <option value="border">{#table_dlg.rules_border}</option> + </select> + </td> + </tr> + + <tr> + <td class="column1"><label for="rules">{#table_dlg.rules}</label></td> + <td> + <select id="rules" name="rules" class="advfield"> + <option value="">{#not_set}</option> + <option value="none">{#table_dlg.frame_none}</option> + <option value="groups">{#table_dlg.frame_groups}</option> + <option value="rows">{#table_dlg.frame_rows}</option> + <option value="cols">{#table_dlg.frame_cols}</option> + <option value="all">{#table_dlg.frame_all}</option> + </select> + </td> + </tr> + + <tr> + <td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> + <td> + <select id="dir" name="dir" class="advfield"> + <option value="">{#not_set}</option> + <option value="ltr">{#table_dlg.ltr}</option> + <option value="rtl">{#table_dlg.rtl}</option> + </select> + </td> + </tr> + + <tr role="group" aria-labelledby="bordercolor_label"> + <td class="column1"><label id="bordercolor_label" for="bordercolor">{#table_dlg.bordercolor}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td> + <td id="bordercolor_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + + <tr role="group" aria-labelledby="bgcolor_label"> + <td class="column1"><label id="bgcolor_label" for="bgcolor">{#table_dlg.bgcolor}</label></td> + <td> + <table role="presentation" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td> + <td id="bgcolor_pickcontainer">&nbsp;</td> + </tr> + </table> + </td> + </tr> + </table> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/abbr.htm b/js/tiny_mce/plugins/xhtmlxtras/abbr.htm new file mode 100644 index 000000000..30a894f7c --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/abbr.htm @@ -0,0 +1,142 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#xhtmlxtras_dlg.title_abbr_element}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/element_common.js"></script> + <script type="text/javascript" src="js/abbr.js"></script> + <link rel="stylesheet" type="text/css" href="css/popup.css" /> +</head> +<body style="display: none" role="application" aria-labelledby="app_title"> +<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_abbr_element}</span> +<form onsubmit="insertAbbr();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> + <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> + <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> + </tr> + <tr> + <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> + <td><input id="id" name="id" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> + <td> + <select id="class" name="class" class="field mceEditableSelect"> + <option value="">{#not_set}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> + <td><input id="style" name="style" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> + <td> + <select id="dir" name="dir" class="field"> + <option value="">{#not_set}</option> + <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> + <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> + <td> + <input id="lang" name="lang" type="text" value="" class="field" /> + </td> + </tr> + </table> + </fieldset> + </div> + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label for="onfocus">onfocus</label>:</td> + <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onblur">onblur</label>:</td> + <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onclick">onclick</label>:</td> + <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="ondblclick">ondblclick</label>:</td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousedown">onmousedown</label>:</td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseup">onmouseup</label>:</td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseover">onmouseover</label>:</td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousemove">onmousemove</label>:</td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseout">onmouseout</label>:</td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeypress">onkeypress</label>:</td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeydown">onkeydown</label>:</td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeyup">onkeyup</label>:</td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAbbr();" style="display: none;" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/acronym.htm b/js/tiny_mce/plugins/xhtmlxtras/acronym.htm new file mode 100644 index 000000000..c10934592 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/acronym.htm @@ -0,0 +1,142 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#xhtmlxtras_dlg.title_acronym_element}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/element_common.js"></script> + <script type="text/javascript" src="js/acronym.js"></script> + <link rel="stylesheet" type="text/css" href="css/popup.css" /> +</head> +<body style="display: none" role="application" aria-labelledby="app_title"> +<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_acronym_element}</span> +<form onsubmit="insertAcronym();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> + <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> + <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> + </tr> + <tr> + <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> + <td><input id="id" name="id" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> + <td> + <select id="class" name="class" class="field mceEditableSelect"> + <option value="">{#not_set}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> + <td><input id="style" name="style" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> + <td> + <select id="dir" name="dir" class="field"> + <option value="">{#not_set}</option> + <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> + <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> + <td> + <input id="lang" name="lang" type="text" value="" class="field" /> + </td> + </tr> + </table> + </fieldset> + </div> + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label for="onfocus">onfocus</label>:</td> + <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onblur">onblur</label>:</td> + <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onclick">onclick</label>:</td> + <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="ondblclick">ondblclick</label>:</td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousedown">onmousedown</label>:</td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseup">onmouseup</label>:</td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseover">onmouseover</label>:</td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousemove">onmousemove</label>:</td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseout">onmouseout</label>:</td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeypress">onkeypress</label>:</td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeydown">onkeydown</label>:</td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeyup">onkeyup</label>:</td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAcronym();" style="display: none;" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/attributes.htm b/js/tiny_mce/plugins/xhtmlxtras/attributes.htm new file mode 100644 index 000000000..e8d606a34 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/attributes.htm @@ -0,0 +1,149 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#xhtmlxtras_dlg.attribs_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="js/attributes.js"></script> + <link rel="stylesheet" type="text/css" href="css/attributes.css" /> +</head> +<body style="display: none" role="application" aria-labelledby="app_title"> +<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.attribs_title}</span> +<form onsubmit="insertAction();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_attrib_tab}</a></span></li> + <li id="events_tab" aria-controls="events_panel"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_events_tab}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#xhtmlxtras_dlg.attribute_attrib_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> + <td><input id="title" name="title" type="text" value="" class="mceFocus" /></td> + </tr> + <tr> + <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> + <td><input id="id" name="id" type="text" value="" /></td> + </tr> + <tr> + <td><label id="classlabel" for="classlist">{#class_name}</label></td> + <td> + <select id="classlist" name="classlist" class="mceEditableSelect"> + <option value="" selected="selected">{#not_set}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> + <td><input id="style" name="style" type="text" value="" /></td> + </tr> + <tr> + <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> + <td> + <select id="dir" name="dir"> + <option value="">{#not_set}</option> + <option value="ltr">{#xhtmlxtras_dlg.option_ltr}</option> + <option value="rtl">{#xhtmlxtras_dlg.option_rtl}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> + <td> + <input id="lang" name="lang" type="text" value="" /> + </td> + </tr> + <tr> + <td><label id="tabindexlabel" for="tabindex">{#xhtmlxtras_dlg.attribute_label_tabindex}</label></td> + <td><input type="text" id="tabindex" name="tabindex" value="" /></td> + </tr> + + <tr> + <td><label id="accesskeylabel" for="accesskey">{#xhtmlxtras_dlg.attribute_label_accesskey}</label></td> + <td><input type="text" id="accesskey" name="accesskey" value="" /></td> + </tr> + </table> + </fieldset> + </div> + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#xhtmlxtras_dlg.attribute_events_tab}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label for="onfocus">onfocus</label>:</td> + <td><input id="onfocus" name="onfocus" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onblur">onblur</label>:</td> + <td><input id="onblur" name="onblur" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onclick">onclick</label>:</td> + <td><input id="onclick" name="onclick" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="ondblclick">ondblclick</label>:</td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousedown">onmousedown</label>:</td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseup">onmouseup</label>:</td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseover">onmouseover</label>:</td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousemove">onmousemove</label>:</td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseout">onmouseout</label>:</td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeypress">onkeypress</label>:</td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeydown">onkeydown</label>:</td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeyup">onkeyup</label>:</td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/cite.htm b/js/tiny_mce/plugins/xhtmlxtras/cite.htm new file mode 100644 index 000000000..0ac6bdb66 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/cite.htm @@ -0,0 +1,142 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#xhtmlxtras_dlg.title_cite_element}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/element_common.js"></script> + <script type="text/javascript" src="js/cite.js"></script> + <link rel="stylesheet" type="text/css" href="css/popup.css" /> +</head> +<body style="display: none" role="application" aria-labelledby="app_title"> +<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_cite_element}</span> +<form onsubmit="insertCite();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> + <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> + <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> + </tr> + <tr> + <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> + <td><input id="id" name="id" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> + <td> + <select id="class" name="class" class="field mceEditableSelect"> + <option value="">{#not_set}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> + <td><input id="style" name="style" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> + <td> + <select id="dir" name="dir" class="field"> + <option value="">{#not_set}</option> + <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> + <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> + <td> + <input id="lang" name="lang" type="text" value="" class="field" /> + </td> + </tr> + </table> + </fieldset> + </div> + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label for="onfocus">onfocus</label>:</td> + <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onblur">onblur</label>:</td> + <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onclick">onclick</label>:</td> + <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="ondblclick">ondblclick</label>:</td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousedown">onmousedown</label>:</td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseup">onmouseup</label>:</td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseover">onmouseover</label>:</td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousemove">onmousemove</label>:</td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseout">onmouseout</label>:</td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeypress">onkeypress</label>:</td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeydown">onkeydown</label>:</td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeyup">onkeyup</label>:</td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeCite();" style="display: none;" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css new file mode 100644 index 000000000..85b1b376d --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css @@ -0,0 +1,11 @@ +.panel_wrapper div.current { + height: 290px; +} + +#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey { + width: 200px; +} + +#events_panel input { + width: 200px; +} diff --git a/js/tiny_mce/plugins/xhtmlxtras/css/popup.css b/js/tiny_mce/plugins/xhtmlxtras/css/popup.css new file mode 100644 index 000000000..034b98527 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/css/popup.css @@ -0,0 +1,9 @@ +input.field, select.field {width:200px;} +input.picker {width:179px; margin-left: 5px;} +input.disabled {border-color:#F2F2F2;} +img.picker {vertical-align:text-bottom; cursor:pointer;} +h1 {padding: 0 0 5px 0;} +.panel_wrapper div.current {height:160px;} +#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;} +a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;} +#datetime {width:180px;} diff --git a/js/tiny_mce/plugins/xhtmlxtras/del.htm b/js/tiny_mce/plugins/xhtmlxtras/del.htm new file mode 100644 index 000000000..5f667510f --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/del.htm @@ -0,0 +1,162 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#xhtmlxtras_dlg.title_del_element}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/element_common.js"></script> + <script type="text/javascript" src="js/del.js"></script> + <link rel="stylesheet" type="text/css" href="css/popup.css" /> +</head> +<body id="xhtmlxtrasins" style="display: none" role="application" aria-labelledby="app_title"> +<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_del_element}</span> +<form onsubmit="insertDel();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> + <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> + <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse" role="button" aria-labelledby="datetimelabel"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td> + </tr> + </table> + </td> + </tr> + <tr> + <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> + <td><input id="cite" name="cite" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> + <td><input id="title" name="title" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> + <td><input id="id" name="id" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> + <td> + <select id="class" name="class" class="field mceEditableSelect"> + <option value="">{#not_set}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> + <td><input id="style" name="style" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> + <td> + <select id="dir" name="dir" class="field"> + <option value="">{#not_set}</option> + <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> + <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> + <td> + <input id="lang" name="lang" type="text" value="" class="field" /> + </td> + </tr> + </table> + </fieldset> + </div> + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label for="onfocus">onfocus</label>:</td> + <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onblur">onblur</label>:</td> + <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onclick">onclick</label>:</td> + <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="ondblclick">ondblclick</label>:</td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousedown">onmousedown</label>:</td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseup">onmouseup</label>:</td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseover">onmouseover</label>:</td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousemove">onmousemove</label>:</td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseout">onmouseout</label>:</td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeypress">onkeypress</label>:</td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeydown">onkeydown</label>:</td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeyup">onkeyup</label>:</td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeDel();" style="display: none;" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js new file mode 100644 index 000000000..d53b7e201 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380,height:370,inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js new file mode 100644 index 000000000..225d27402 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js @@ -0,0 +1,132 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', { + init : function(ed, url) { + // Register commands + ed.addCommand('mceCite', function() { + ed.windowManager.open({ + file : url + '/cite.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAcronym', function() { + ed.windowManager.open({ + file : url + '/acronym.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAbbr', function() { + ed.windowManager.open({ + file : url + '/abbr.htm', + width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), + height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceDel', function() { + ed.windowManager.open({ + file : url + '/del.htm', + width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceIns', function() { + ed.windowManager.open({ + file : url + '/ins.htm', + width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), + height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), + inline : 1 + }, { + plugin_url : url + }); + }); + + ed.addCommand('mceAttributes', function() { + ed.windowManager.open({ + file : url + '/attributes.htm', + width : 380, + height : 370, + inline : 1 + }, { + plugin_url : url + }); + }); + + // Register buttons + ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'}); + ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'}); + ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'}); + ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'}); + ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'}); + ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'}); + + ed.onNodeChange.add(function(ed, cm, n, co) { + n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS'); + + cm.setDisabled('cite', co); + cm.setDisabled('acronym', co); + cm.setDisabled('abbr', co); + cm.setDisabled('del', co); + cm.setDisabled('ins', co); + cm.setDisabled('attribs', n && n.nodeName == 'BODY'); + cm.setActive('cite', 0); + cm.setActive('acronym', 0); + cm.setActive('abbr', 0); + cm.setActive('del', 0); + cm.setActive('ins', 0); + + // Activate all + if (n) { + do { + cm.setDisabled(n.nodeName.toLowerCase(), 0); + cm.setActive(n.nodeName.toLowerCase(), 1); + } while (n = n.parentNode); + } + }); + + ed.onPreInit.add(function() { + // Fixed IE issue where it can't handle these elements correctly + ed.dom.create('abbr'); + }); + }, + + getInfo : function() { + return { + longname : 'XHTML Xtras Plugin', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://wiki.moxiecode.com/index.php?controller=TinyMCE:Plugins/xhtmlxtras', + version : tinymce.majorVersion + "." + tinymce.minorVersion + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin); +})(); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/ins.htm b/js/tiny_mce/plugins/xhtmlxtras/ins.htm new file mode 100644 index 000000000..d001ac7c4 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/ins.htm @@ -0,0 +1,162 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#xhtmlxtras_dlg.title_ins_element}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/editable_selects.js"></script> + <script type="text/javascript" src="js/element_common.js"></script> + <script type="text/javascript" src="js/ins.js"></script> + <link rel="stylesheet" type="text/css" href="css/popup.css" /> +</head> +<body id="xhtmlxtrasins" style="display: none" role="application" aria-labelledby="app_title"> +<span style="display:none;" id="app_title">{#xhtmlxtras_dlg.title_ins_element}</span> +<form onsubmit="insertIns();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li> + <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> --> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> + <td> + <table role="presentation" border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> + <td ><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse" role="button" aria-labelledby="datetimelabel"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td> + </tr> + </table> + </td> + </tr> + <tr > + <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> + <td><input id="cite" name="cite" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend> + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> + <td><input id="title" name="title" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> + <td><input id="id" name="id" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> + <td> + <select id="class" name="class" class="field mceEditableSelect"> + <option value="">{#not_set}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> + <td><input id="style" name="style" type="text" value="" class="field" /></td> + </tr> + <tr> + <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> + <td> + <select id="dir" name="dir" class="field"> + <option value="">{#not_set}</option> + <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> + <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> + </select> + </td> + </tr> + <tr> + <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> + <td> + <input id="lang" name="lang" type="text" value="" class="field" /> + </td> + </tr> + </table> + </fieldset> + </div> + <div id="events_panel" class="panel"> + <fieldset> + <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend> + + <table role="presentation" border="0" cellpadding="0" cellspacing="4"> + <tr> + <td class="label"><label for="onfocus">onfocus</label>:</td> + <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onblur">onblur</label>:</td> + <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onclick">onclick</label>:</td> + <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="ondblclick">ondblclick</label>:</td> + <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousedown">onmousedown</label>:</td> + <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseup">onmouseup</label>:</td> + <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseover">onmouseover</label>:</td> + <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmousemove">onmousemove</label>:</td> + <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onmouseout">onmouseout</label>:</td> + <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeypress">onkeypress</label>:</td> + <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeydown">onkeydown</label>:</td> + <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> + </tr> + + <tr> + <td class="label"><label for="onkeyup">onkeyup</label>:</td> + <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> + </tr> + </table> + </fieldset> + </div> + </div> + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeIns();" style="display: none;" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js new file mode 100644 index 000000000..1790e83d3 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js @@ -0,0 +1,28 @@ +/** + * abbr.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('abbr'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAbbr() { + SXE.insertElement('abbr'); + tinyMCEPopup.close(); +} + +function removeAbbr() { + SXE.removeElement('abbr'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js new file mode 100644 index 000000000..93b8d259a --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js @@ -0,0 +1,28 @@ +/** + * acronym.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('acronym'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAcronym() { + SXE.insertElement('acronym'); + tinyMCEPopup.close(); +} + +function removeAcronym() { + SXE.removeElement('acronym'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js new file mode 100644 index 000000000..f3b297d6c --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js @@ -0,0 +1,125 @@ +/** + * attributes.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + tinyMCEPopup.resizeToInnerSize(); + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + var elm = inst.selection.getNode(); + var f = document.forms[0]; + var onclick = dom.getAttrib(elm, 'onclick'); + + setFormValue('title', dom.getAttrib(elm, 'title')); + setFormValue('id', dom.getAttrib(elm, 'id')); + setFormValue('style', dom.getAttrib(elm, "style")); + setFormValue('dir', dom.getAttrib(elm, 'dir')); + setFormValue('lang', dom.getAttrib(elm, 'lang')); + setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); + setFormValue('onblur', dom.getAttrib(elm, 'onblur')); + setFormValue('onclick', onclick); + setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); + setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); + setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); + setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); + setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); + setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); + setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); + setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); + setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); + className = dom.getAttrib(elm, 'class'); + + addClassesToList('classlist', 'advlink_styles'); + selectByValue(f, 'classlist', className, true); + + TinyMCE_EditableSelects.init(); +} + +function setFormValue(name, value) { + if(value && document.forms[0].elements[name]){ + document.forms[0].elements[name].value = value; + } +} + +function insertAction() { + var inst = tinyMCEPopup.editor; + var elm = inst.selection.getNode(); + + setAllAttribs(elm); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib.toLowerCase()]; + var inst = tinyMCEPopup.editor; + var dom = inst.dom; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value != "") { + dom.setAttrib(elm, attrib.toLowerCase(), value); + + if (attrib == "style") + attrib = "style.cssText"; + + if (attrib.substring(0, 2) == 'on') + value = 'return true;' + value; + + if (attrib == "class") + attrib = "className"; + + elm[attrib]=value; + } else + elm.removeAttribute(attrib); +} + +function setAllAttribs(elm) { + var f = document.forms[0]; + + setAttrib(elm, 'title'); + setAttrib(elm, 'id'); + setAttrib(elm, 'style'); + setAttrib(elm, 'class', getSelectValue(f, 'classlist')); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + setAttrib(elm, 'tabindex'); + setAttrib(elm, 'accesskey'); + setAttrib(elm, 'onfocus'); + setAttrib(elm, 'onblur'); + setAttrib(elm, 'onclick'); + setAttrib(elm, 'ondblclick'); + setAttrib(elm, 'onmousedown'); + setAttrib(elm, 'onmouseup'); + setAttrib(elm, 'onmouseover'); + setAttrib(elm, 'onmousemove'); + setAttrib(elm, 'onmouseout'); + setAttrib(elm, 'onkeypress'); + setAttrib(elm, 'onkeydown'); + setAttrib(elm, 'onkeyup'); + + // Refresh in old MSIE +// if (tinyMCE.isMSIE5) +// elm.outerHTML = elm.outerHTML; +} + +function insertAttribute() { + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); +tinyMCEPopup.requireLangPack(); diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/cite.js b/js/tiny_mce/plugins/xhtmlxtras/js/cite.js new file mode 100644 index 000000000..b73ef4735 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/cite.js @@ -0,0 +1,28 @@ +/** + * cite.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('cite'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertCite() { + SXE.insertElement('cite'); + tinyMCEPopup.close(); +} + +function removeCite() { + SXE.removeElement('cite'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/del.js b/js/tiny_mce/plugins/xhtmlxtras/js/del.js new file mode 100644 index 000000000..a5397f7e6 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/del.js @@ -0,0 +1,53 @@ +/** + * del.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('del'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); + elm.removeAttribute('data-mce-new'); +} + +function insertDel() { + var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL'); + + if (elm == null) { + var s = SXE.inst.selection.getContent(); + if(s.length > 0) { + insertInlineElement('del'); + var elementArray = SXE.inst.dom.select('del[data-mce-new]'); + for (var i=0; i<elementArray.length; i++) { + var elm = elementArray[i]; + setElementAttribs(elm); + } + } + } else { + setElementAttribs(elm); + } + tinyMCEPopup.editor.nodeChanged(); + tinyMCEPopup.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); +} + +function removeDel() { + SXE.removeElement('del'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js b/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js new file mode 100644 index 000000000..6df1b7759 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js @@ -0,0 +1,229 @@ +/** + * element_common.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +tinyMCEPopup.requireLangPack(); + +function initCommonAttributes(elm) { + var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom; + + // Setup form data for common element attributes + setFormValue('title', dom.getAttrib(elm, 'title')); + setFormValue('id', dom.getAttrib(elm, 'id')); + selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true); + setFormValue('style', dom.getAttrib(elm, 'style')); + selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir')); + setFormValue('lang', dom.getAttrib(elm, 'lang')); + setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); + setFormValue('onblur', dom.getAttrib(elm, 'onblur')); + setFormValue('onclick', dom.getAttrib(elm, 'onclick')); + setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); + setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); + setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); + setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); + setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); + setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); + setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); + setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); + setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); +} + +function setFormValue(name, value) { + if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value; +} + +function insertDateTime(id) { + document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S"); +} + +function getDateTime(d, fmt) { + fmt = fmt.replace("%D", "%m/%d/%y"); + fmt = fmt.replace("%r", "%I:%M:%S %p"); + fmt = fmt.replace("%Y", "" + d.getFullYear()); + fmt = fmt.replace("%y", "" + d.getYear()); + fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); + fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); + fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); + fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); + fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); + fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); + fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); + fmt = fmt.replace("%%", "%"); + + return fmt; +} + +function addZeros(value, len) { + var i; + + value = "" + value; + + if (value.length < len) { + for (i=0; i<(len-value.length); i++) + value = "0" + value; + } + + return value; +} + +function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { + if (!form_obj || !form_obj.elements[field_name]) + return; + + var sel = form_obj.elements[field_name]; + + var found = false; + for (var i=0; i<sel.options.length; i++) { + var option = sel.options[i]; + + if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { + option.selected = true; + found = true; + } else + option.selected = false; + } + + if (!found && add_custom && value != '') { + var option = new Option('Value: ' + value, value); + option.selected = true; + sel.options[sel.options.length] = option; + } + + return found; +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib.toLowerCase()]; + tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value); +} + +function setAllCommonAttribs(elm) { + setAttrib(elm, 'title'); + setAttrib(elm, 'id'); + setAttrib(elm, 'class'); + setAttrib(elm, 'style'); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + /*setAttrib(elm, 'onfocus'); + setAttrib(elm, 'onblur'); + setAttrib(elm, 'onclick'); + setAttrib(elm, 'ondblclick'); + setAttrib(elm, 'onmousedown'); + setAttrib(elm, 'onmouseup'); + setAttrib(elm, 'onmouseover'); + setAttrib(elm, 'onmousemove'); + setAttrib(elm, 'onmouseout'); + setAttrib(elm, 'onkeypress'); + setAttrib(elm, 'onkeydown'); + setAttrib(elm, 'onkeyup');*/ +} + +SXE = { + currentAction : "insert", + inst : tinyMCEPopup.editor, + updateElement : null +} + +SXE.focusElement = SXE.inst.selection.getNode(); + +SXE.initElementDialog = function(element_name) { + addClassesToList('class', 'xhtmlxtras_styles'); + TinyMCE_EditableSelects.init(); + + element_name = element_name.toLowerCase(); + var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()); + if (elm != null && elm.nodeName.toUpperCase() == element_name.toUpperCase()) { + SXE.currentAction = "update"; + } + + if (SXE.currentAction == "update") { + initCommonAttributes(elm); + SXE.updateElement = elm; + } + + document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); +} + +SXE.insertElement = function(element_name) { + var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName; + + if (elm == null) { + var s = SXE.inst.selection.getContent(); + if(s.length > 0) { + tagName = element_name; + + insertInlineElement(element_name); + var elementArray = tinymce.grep(SXE.inst.dom.select(element_name)); + for (var i=0; i<elementArray.length; i++) { + var elm = elementArray[i]; + + if (SXE.inst.dom.getAttrib(elm, 'data-mce-new')) { + elm.id = ''; + elm.setAttribute('id', ''); + elm.removeAttribute('id'); + elm.removeAttribute('data-mce-new'); + + setAllCommonAttribs(elm); + } + } + } + } else { + setAllCommonAttribs(elm); + } + SXE.inst.nodeChanged(); + tinyMCEPopup.execCommand('mceEndUndoLevel'); +} + +SXE.removeElement = function(element_name){ + element_name = element_name.toLowerCase(); + elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()); + if(elm && elm.nodeName.toUpperCase() == element_name.toUpperCase()){ + tinyMCE.execCommand('mceRemoveNode', false, elm); + SXE.inst.nodeChanged(); + tinyMCEPopup.execCommand('mceEndUndoLevel'); + } +} + +SXE.showRemoveButton = function() { + document.getElementById("remove").style.display = ''; +} + +SXE.containsClass = function(elm,cl) { + return (elm.className.indexOf(cl) > -1) ? true : false; +} + +SXE.removeClass = function(elm,cl) { + if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { + return true; + } + var classNames = elm.className.split(" "); + var newClassNames = ""; + for (var x = 0, cnl = classNames.length; x < cnl; x++) { + if (classNames[x] != cl) { + newClassNames += (classNames[x] + " "); + } + } + elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end +} + +SXE.addClass = function(elm,cl) { + if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; + return true; +} + +function insertInlineElement(en) { + var ed = tinyMCEPopup.editor, dom = ed.dom; + + ed.getDoc().execCommand('FontName', false, 'mceinline'); + tinymce.each(dom.select('span,font'), function(n) { + if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') + dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1); + }); +} diff --git a/js/tiny_mce/plugins/xhtmlxtras/js/ins.js b/js/tiny_mce/plugins/xhtmlxtras/js/ins.js new file mode 100644 index 000000000..71a8a261f --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/js/ins.js @@ -0,0 +1,53 @@ +/** + * ins.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function init() { + SXE.initElementDialog('ins'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); + elm.removeAttribute('data-mce-new'); +} + +function insertIns() { + var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS'); + + if (elm == null) { + var s = SXE.inst.selection.getContent(); + if(s.length > 0) { + insertInlineElement('ins'); + var elementArray = SXE.inst.dom.select('ins[data-mce-new]'); + for (var i=0; i<elementArray.length; i++) { + var elm = elementArray[i]; + setElementAttribs(elm); + } + } + } else { + setElementAttribs(elm); + } + tinyMCEPopup.editor.nodeChanged(); + tinyMCEPopup.execCommand('mceEndUndoLevel'); + tinyMCEPopup.close(); +} + +function removeIns() { + SXE.removeElement('ins'); + tinyMCEPopup.close(); +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js new file mode 100755 index 000000000..ca09a91b6 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ar_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ar.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"\u0639\u0627\u0645",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/az_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/az_dlg.js new file mode 100755 index 000000000..8f1a0ee5c --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/az_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('az.xhtmlxtras_dlg',{attribs_title:"Atribut \u0259lav\u0259/redakt\u0259 et",option_rtl:"Sa\u011fda-sola",option_ltr:"Solda-sa\u011fa",insert_date:"Haz\u0131rki tarixi/vaxt\u0131 \u0259lav\u0259 et",remove:"L\u0259\u011fv et",title_cite_element:"Sitat elementi",title_abbr_element:"Abbreviatura elementi",title_acronym_element:"Akronim elementi",title_del_element:"Silinmi\u015f m\u0259tnin elementi",title_ins_element:"\u018flav\u0259 edilmi\u015f m\u0259tnin elementi",fieldset_events_tab:"Element hadis\u0259l\u0259ri",fieldset_attrib_tab:"Element atributlar\u0131",fieldset_general_tab:"\u00dcmumi nizamlamalar",events_tab:"Hadis\u0259l\u0259r",attrib_tab:"Atributlar",general_tab:"\u00dcmumi",attribute_attrib_tab:"Atributlar",attribute_events_tab:"Hadis\u0259l\u0259r",attribute_label_accesskey:"Giri\u015f klavi\u015fi",attribute_label_tabindex:"Hesab indeksi",attribute_label_langcode:"Dil",attribute_option_rtl:"Sa\u011fda-sola",attribute_option_ltr:"Solda-sa\u011fa",attribute_label_langdir:"M\u0259tnin istiqam\u0259ti",attribute_label_datetime:"Tarix/vaxt",attribute_label_cite:"Sitat",attribute_label_style:"Stil",attribute_label_class:"Sinif",attribute_label_id:"\u0130dentifikator",attribute_label_title:"Ad\u0131"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/be_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/be_dlg.js new file mode 100755 index 000000000..f1b9776cb --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/be_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('be.xhtmlxtras_dlg',{attribs_title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c/\u0440\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u0430\u0442\u0440\u044b\u0431\u0443\u0442\u044b",option_rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u0430",option_ltr:"\u0417\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0430",insert_date:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044c \u0431\u044f\u0433\u0443\u0447\u0443\u044e \u0434\u0430\u0442\u0443/\u0447\u0430\u0441",remove:"\u041f\u0440\u044b\u0431\u0440\u0430\u0446\u044c",title_cite_element:"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u044b\u043d\u044f\u0442\u043a\u0456",title_abbr_element:"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0430\u0431\u0440\u044d\u0432\u0456\u044f\u0442\u0443\u0440\u044b",title_acronym_element:"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0430\u043a\u0440\u043e\u043d\u0456\u043c\u0430",title_del_element:"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u044b\u0434\u0430\u043b\u0435\u043d\u0430\u0433\u0430 \u0442\u044d\u043a\u0441\u0442\u0443",title_ins_element:"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u0430\u0434\u0430\u0434\u0437\u0435\u043d\u0430\u0433\u0430 \u0442\u044d\u043a\u0441\u0442\u0443",fieldset_events_tab:"\u041f\u0430\u0434\u0437\u0435\u0456 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",fieldset_attrib_tab:"\u0410\u0442\u0440\u044b\u0431\u0443\u0442\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",fieldset_general_tab:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f \u043d\u0430\u043b\u0430\u0434\u044b",events_tab:"\u041f\u0430\u0434\u0437\u0435\u0456",attrib_tab:"\u0410\u0442\u0440\u044b\u0431\u0443\u0442\u044b",general_tab:"\u0410\u0433\u0443\u043b\u044c\u043d\u044b\u044f",attribute_attrib_tab:"\u0410\u0442\u0440\u044b\u0431\u0443\u0442\u044b",attribute_events_tab:"\u041f\u0430\u0434\u0437\u0435\u0456",attribute_label_accesskey:"\u041a\u043b\u0430\u0432\u0456\u0448\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0443",attribute_label_tabindex:"\u0410\u0437\u043d\u0430\u0447\u043d\u0456\u043a \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u044b\u0456",attribute_label_langcode:"\u041c\u043e\u0432\u0430",attribute_option_rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u0430",attribute_option_ltr:"\u0417\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0430",attribute_label_langdir:"\u041a\u0456\u0440\u0443\u043d\u0430\u043a \u0442\u044d\u043a\u0441\u0442\u0443",attribute_label_datetime:"\u0414\u0430\u0442\u0430/\u0447\u0430\u0441",attribute_label_cite:"\u0412\u044b\u043d\u044f\u0442\u043a\u0430",attribute_label_style:"\u0421\u0442\u044b\u043b\u044c",attribute_label_class:"\u041a\u043b\u0430\u0441",attribute_label_id:"\u0406\u0434\u044d\u043d\u0442\u044b\u0444\u0456\u043a\u0430\u0442\u0430\u0440",attribute_label_title:"\u041d\u0430\u0437\u043e\u045e"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js new file mode 100755 index 000000000..16e8371a2 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/bg_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bg.xhtmlxtras_dlg',{attribs_title:"\u0412\u043c\u044a\u043a\u043d\u0438/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438",option_rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",option_ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",insert_date:"\u0412\u043c\u044a\u043a\u043d\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u0442\u0430 \u0434\u0430\u0442\u0430/\u0446\u0430\u0441",remove:"\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0438",title_cite_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0426\u0438\u0442\u0430\u0442",title_abbr_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0421\u044a\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435",title_acronym_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0410\u043a\u0440\u043e\u043d\u0438\u043c",title_del_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435",title_ins_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435",fieldset_events_tab:"\u0421\u044a\u0431\u0438\u0442\u0438\u044f \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430",fieldset_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u043d\u0430 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430",fieldset_general_tab:"\u041e\u0431\u0449\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",events_tab:"\u0421\u044a\u0431\u0438\u0442\u0438\u044f",attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438",general_tab:"\u041e\u0431\u0449\u0438",attribute_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438",attribute_events_tab:"\u0421\u044a\u0431\u0438\u0442\u0438\u044f",attribute_label_accesskey:"\u041a\u043b\u0430\u0432\u0438\u0448",attribute_label_tabindex:"\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u043d\u043e\u0441\u0442",attribute_label_langcode:"\u0415\u0437\u0438\u043a",attribute_option_rtl:"\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430 \u043b\u044f\u0432\u043e",attribute_option_ltr:"\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430 \u0434\u044f\u0441\u043d\u043e",attribute_label_langdir:"\u041f\u043e\u0441\u043e\u043a\u0430 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430",attribute_label_datetime:"\u0414\u0430\u0442\u0430/\u0412\u0440\u0435\u043c\u0435",attribute_label_cite:"\u0426\u0438\u0442\u0430\u0442",attribute_label_style:"\u0421\u0442\u0438\u043b",attribute_label_class:"\u041a\u043b\u0430\u0441",attribute_label_id:"ID",attribute_label_title:"\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/bn_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/bn_dlg.js new file mode 100755 index 000000000..085ed82e9 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/bn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bn.xhtmlxtras_dlg',{"attribs_title":"Insert/Edit Attributes","option_rtl":"Right to left","option_ltr":"Left to right","insert_date":"Insert current date/time",remove:"Remove","title_cite_element":"Citation Element","title_abbr_element":"Abbreviation Element","title_acronym_element":"Acronym Element","title_del_element":"Deletion Element","title_ins_element":"Insertion Element","fieldset_events_tab":"Element Events","fieldset_attrib_tab":"Element Attributes","fieldset_general_tab":"General Settings","events_tab":"Events","attrib_tab":"Attributes","general_tab":"General","attribute_attrib_tab":"Attributes","attribute_events_tab":"Events","attribute_label_accesskey":"AccessKey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Language","attribute_option_rtl":"Right to left","attribute_option_ltr":"Left to right","attribute_label_langdir":"Text Direction","attribute_label_datetime":"Date/Time","attribute_label_cite":"Cite","attribute_label_style":"Style","attribute_label_class":"Class","attribute_label_id":"ID","attribute_label_title":"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/br_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/br_dlg.js new file mode 100755 index 000000000..77a5f8381 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/br_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('br.xhtmlxtras_dlg',{attribs_title:"Inserir/editar atributos",option_rtl:"Da direita para a esquerda",option_ltr:"Da esquerda para a direita",insert_date:"Inserir data/hora",remove:"Remover",title_cite_element:"Cita\u00e7\u00e3o",title_abbr_element:"Abrevia\u00e7\u00e3o",title_acronym_element:"Acr\u00f4nimo",title_del_element:"Apagar",title_ins_element:"Inserir",fieldset_events_tab:"Eventos",fieldset_attrib_tab:"Atributos",fieldset_general_tab:"Configura\u00e7\u00f5es gerais",events_tab:"Eventos",attrib_tab:"Atributos",general_tab:"Geral",attribute_attrib_tab:"Atributos",attribute_events_tab:"Eventos",attribute_label_accesskey:"Tecla de Atalho",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Linguagem",attribute_option_rtl:"Da direita para a esquerda",attribute_option_ltr:"Da esquerda para a direita",attribute_label_langdir:"Dire\u00e7\u00e3o do texto",attribute_label_datetime:"Data/Hora",attribute_label_cite:"Citar",attribute_label_style:"Estilo",attribute_label_class:"Classe",attribute_label_id:"ID",attribute_label_title:"T\u00edtulo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/bs_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/bs_dlg.js new file mode 100755 index 000000000..20986dbee --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/bs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('bs.xhtmlxtras_dlg',{attribs_title:"Umetni/uredi atribute",option_rtl:"S desna na lijevo",option_ltr:"S lijeva na desno",insert_date:"Umetni trenuta\u010dni datum/vrijeme",remove:"Ukloni",title_cite_element:"Element citata",title_abbr_element:"Element kratice",title_acronym_element:"Element akronima",title_del_element:"Element za brisanje",title_ins_element:"Element za unos",fieldset_events_tab:"Doga\u0111aji elemenata",fieldset_attrib_tab:"Atributi elemenata",fieldset_general_tab:"Osnovne postavke",events_tab:"Doga\u0111aji",attrib_tab:"Atributi",general_tab:"Osnovno",attribute_attrib_tab:"Atributi",attribute_events_tab:"Doga\u0111aji",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Jezik",attribute_option_rtl:"S desna na lijevo",attribute_option_ltr:"S lijeva na desno",attribute_label_langdir:"Smjer teksta",attribute_label_datetime:"Datum/vrijeme",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Klasa",attribute_label_id:"ID",attribute_label_title:"Naslov"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ca_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ca_dlg.js new file mode 100755 index 000000000..5c548b5e7 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ca_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ca.xhtmlxtras_dlg',{"attribs_title":"Insereix/Edita atributs","option_rtl":"De dreta a esquerra","option_ltr":"D\'esquerra a dreta","insert_date":"Insereix la data/hora actuals",remove:"Elimina","title_cite_element":"Element de menci\u00f3","title_abbr_element":"Element d\'abreviatura","title_acronym_element":"Element d\'acr\u00f2nim","title_del_element":"Element d\'eliminaci\u00f3","title_ins_element":"Element d\'inserci\u00f3","fieldset_events_tab":"Esdeveniments d\'element","fieldset_attrib_tab":"Atributs d\'element","fieldset_general_tab":"Configuraci\u00f3 general","events_tab":"Esdeveniments","attrib_tab":"Atributs","general_tab":"General","attribute_attrib_tab":"Atributs","attribute_events_tab":"Esdeveniments","attribute_label_accesskey":"AccessKey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Idioma","attribute_option_rtl":"De dreta a esquerra","attribute_option_ltr":"D\'esquerra a dreta","attribute_label_langdir":"Direcci\u00f3 del text","attribute_label_datetime":"Data/Hora","attribute_label_cite":"Cita","attribute_label_style":"Estil","attribute_label_class":"Classe","attribute_label_id":"ID","attribute_label_title":"T\u00edtol"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ch_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ch_dlg.js new file mode 100755 index 000000000..eee5ea6c8 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ch_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ch.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027",option_rtl:"\u4ece\u53f3\u5230\u5de6",option_ltr:"\u4ece\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u76ee\u524d\u65e5\u671f/\u65f6\u95f4",remove:"\u79fb\u9664",title_cite_element:"\u5f15\u7528\u5143\u7d20",title_abbr_element:"\u7f29\u5199\u5143\u7d20",title_acronym_element:"\u9996\u5b57\u6bcd\u7f29\u5199\u5143\u7d20",title_del_element:"\u5220\u9664\u5143\u7d20",title_ins_element:"\u63d2\u5165\u5143\u7d20",fieldset_events_tab:"\u5143\u7d20\u4e8b\u4ef6",fieldset_attrib_tab:"\u5143\u7d20\u5c5e\u6027",fieldset_general_tab:"\u4e00\u822c\u8bbe\u5b9a",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c5e\u6027",general_tab:"\u4e00\u822c",attribute_attrib_tab:"\u5c5e\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u6377\u952e",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8bed\u8a00",attribute_option_rtl:"\u4ece\u53f3\u5230\u5de6",attribute_option_ltr:"\u4ece\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u4e66\u5199\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u65f6\u95f4",attribute_label_cite:"\u5f15\u7528",attribute_label_style:"\u6837\u5f0f",attribute_label_class:"\u7c7b\u522b",attribute_label_id:"ID",attribute_label_title:"\u6807\u9898"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/cn_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/cn_dlg.js new file mode 100755 index 000000000..04a1c2ca5 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cn.xhtmlxtras_dlg',{"attribs_title":"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027","option_rtl":"\u4ece\u53f3\u5230\u5de6","option_ltr":"\u4ece\u5de6\u5230\u53f3","insert_date":"\u63d2\u5165\u5f53\u524d\u65e5\u671f/\u65f6\u95f4",remove:"\u79fb\u9664","title_cite_element":"\u5f15\u7528\u5143\u7d20","title_abbr_element":"\u7f29\u5199\u5143\u7d20","title_acronym_element":"\u9996\u5b57\u6bcd\u7f29\u5199\u5143\u7d20","title_del_element":"\u5220\u9664\u5143\u7d20","title_ins_element":"\u63d2\u5165\u5143\u7d20","fieldset_events_tab":"\u5143\u7d20\u4e8b\u4ef6","fieldset_attrib_tab":"\u5143\u7d20\u5c5e\u6027","fieldset_general_tab":"\u5e38\u89c4\u8bbe\u7f6e","events_tab":"\u4e8b\u4ef6","attrib_tab":"\u5c5e\u6027","general_tab":"\u5e38\u89c4","attribute_attrib_tab":"\u5c5e\u6027","attribute_events_tab":"\u4e8b\u4ef6","attribute_label_accesskey":"\u5feb\u6377\u952e","attribute_label_tabindex":"Tab\u952e\u8bbf\u95ee\u987a\u5e8f","attribute_label_langcode":"\u8bed\u8a00","attribute_option_rtl":"\u4ece\u53f3\u5230\u5de6","attribute_option_ltr":"\u4ece\u5de6\u5230\u53f3","attribute_label_langdir":"\u6587\u672c\u65b9\u5411","attribute_label_datetime":"\u65e5\u671f/\u65f6\u95f4","attribute_label_cite":"\u5f15\u7528","attribute_label_style":"\u6837\u5f0f","attribute_label_class":"\u7c7b","attribute_label_id":"ID\u5c5e\u6027","attribute_label_title":"\u6807\u9898"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js new file mode 100755 index 000000000..d128425f0 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/cs_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cs.xhtmlxtras_dlg',{attribs_title:"Vlo\u017eit/upravit atributy",option_rtl:"Zprava doleva",option_ltr:"Zleva doprava",insert_date:"Vlo\u017eit aktu\u00e1ln\u00ed datum/\u010das",remove:"Odstranit",title_cite_element:"Citace",title_abbr_element:"Zkratka",title_acronym_element:"Akronym",title_del_element:"Odstran\u011bn\u00fd text",title_ins_element:"P\u0159idan\u00fd text",fieldset_events_tab:"Atributy ud\u00e1losti",fieldset_attrib_tab:"Atributy prvku",fieldset_general_tab:"Obecn\u00e9 parametry",events_tab:"Ud\u00e1losti",attrib_tab:"Atributy",general_tab:"Obecn\u00e9",attribute_attrib_tab:"Atributy",attribute_events_tab:"Ud\u00e1losti",attribute_label_accesskey:"Kl\u00e1vesov\u00e1 zkratka",attribute_label_tabindex:"Po\u0159ad\u00ed pro tabul\u00e1tor",attribute_label_langcode:"Jazyk",attribute_option_rtl:"Zprava doleva",attribute_option_ltr:"Zleva doprava",attribute_label_langdir:"Sm\u011br textu",attribute_label_datetime:"Datum/\u010cas",attribute_label_cite:"Citace",attribute_label_style:"Styl",attribute_label_class:"T\u0159\u00edda",attribute_label_id:"ID",attribute_label_title:"Titulek"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/cy_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/cy_dlg.js new file mode 100755 index 000000000..f63fdc627 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/cy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('cy.xhtmlxtras_dlg',{attribs_title:"Mewnosod/Golygu Priodoleddau",option_rtl:"De i\'r chwith",option_ltr:"Chwith i\'r dde",insert_date:"Mewnosod dyddiad/amser presennol",remove:"Tynnu",title_cite_element:"Elfen Dyfyniad",title_abbr_element:"Elfen Talfyriad",title_acronym_element:"Elfen Acronym",title_del_element:"Elfen Dilead",title_ins_element:"Elfen Mewnosodiad",fieldset_events_tab:"Digwyddiadau Elfen",fieldset_attrib_tab:"Priodoleddau Elfen",fieldset_general_tab:"Gosodiadau Cyfredinol",events_tab:"Digwyddiadau",attrib_tab:"Priodoleddau",general_tab:"Cyffredinol",attribute_attrib_tab:"Priodoleddau",attribute_events_tab:"Digwyddiadau",attribute_label_accesskey:"Bysell mynediad",attribute_label_tabindex:"Trefn tabio",attribute_label_langcode:"Iaith",attribute_option_rtl:"De i\'r chwith",attribute_option_ltr:"Chwith i\'r dde",attribute_label_langdir:"Cyfeiriad Testun",attribute_label_datetime:"Dyddiad/Amser",attribute_label_cite:"Dyfynnu",attribute_label_style:"Arddull",attribute_label_class:"Dosbarth",attribute_label_id:"ID",attribute_label_title:"Teitl"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js new file mode 100755 index 000000000..da508a311 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/da_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('da.xhtmlxtras_dlg',{attribs_title:"Inds\u00e6t/rediger attributter",option_rtl:"H\u00f8jre mod venstre",option_ltr:"Venstre mod h\u00f8jre",insert_date:"Inds\u00e6t nuv\u00e6rende dato/tid",remove:"Slet",title_cite_element:"Citationselement",title_abbr_element:"Forkortet element",title_acronym_element:"Akronym element",title_del_element:"Sletteklart element",title_ins_element:"Inds\u00e6tbart element",fieldset_events_tab:"Element-h\u00e6ndelser",fieldset_attrib_tab:"Element-attributter",fieldset_general_tab:"Genererelle indstillinger",events_tab:"H\u00e6ndelser",attrib_tab:"Attributter",general_tab:"Generelt",attribute_attrib_tab:"Attributter",attribute_events_tab:"H\u00e6ndelser",attribute_label_accesskey:"Adgangsn\u00f8gle",attribute_label_tabindex:"Tab-indeks",attribute_label_langcode:"Sprog",attribute_option_rtl:"H\u00f8jre mod venstre",attribute_option_ltr:"Venstre mod h\u00f8jre",attribute_label_langdir:"Tekstretning",attribute_label_datetime:"Dato/tid",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Klasse",attribute_label_id:"ID",attribute_label_title:"Titel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js new file mode 100755 index 000000000..a767761eb --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/de_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('de.xhtmlxtras_dlg',{attribs_title:"Attribute einf\u00fcgen/bearbeiten",option_rtl:"Rechts nach links",option_ltr:"Links nach rechts",insert_date:"Aktuelle Zeit/Datum einf\u00fcgen",remove:"Entfernen",title_cite_element:"Quellenangabe",title_abbr_element:"Abk\u00fcrzung",title_acronym_element:"Akronym",title_del_element:"Entfernter Text",title_ins_element:"Eingef\u00fcgter Text",fieldset_events_tab:"Ereignisse",fieldset_attrib_tab:"Attribute",fieldset_general_tab:"Allgemeine Einstellungen",events_tab:"Ereignisse",attrib_tab:"Attribute",general_tab:"Allgemein",attribute_attrib_tab:"Attribute",attribute_events_tab:"Ereignisse",attribute_label_accesskey:"Tastenk\u00fcrzel",attribute_label_tabindex:"Tabindex",attribute_label_langcode:"Sprache",attribute_option_rtl:"Rechts nach links",attribute_option_ltr:"Links nach rechts",attribute_label_langdir:"Schriftrichtung",attribute_label_datetime:"Zeit/Datum",attribute_label_cite:"Quellenangabe",attribute_label_style:"Format",attribute_label_class:"Klasse",attribute_label_id:"ID",attribute_label_title:"Titel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/dv_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/dv_dlg.js new file mode 100755 index 000000000..920a1ebba --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/dv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('dv.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js new file mode 100755 index 000000000..d1fb4380f --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/el_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('el.xhtmlxtras_dlg',{attribs_title:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae/\u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b9\u03b4\u03b9\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd",option_rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",option_ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",insert_date:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03c1\u03ad\u03c7\u03bf\u03c5\u03c3\u03b1\u03c2 \u03b7\u03bc\u03ad\u03c1\u03b1\u03c2/\u03ce\u03c1\u03b1\u03c2",remove:"\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7",title_cite_element:"Citation \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",title_abbr_element:"\u03a3\u03c5\u03bd\u03c4\u03bf\u03bc\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",title_acronym_element:"\u0391\u03ba\u03c1\u03bf\u03bd\u03cd\u03bc\u03b9\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",title_del_element:"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",title_ins_element:"\u0395\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",fieldset_events_tab:"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",fieldset_attrib_tab:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5",fieldset_general_tab:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2",events_tab:"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1",attrib_tab:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",general_tab:"\u0393\u03b5\u03bd\u03b9\u03ba\u03ac",attribute_attrib_tab:"\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2",attribute_events_tab:"\u0393\u03b5\u03b3\u03bf\u03bd\u03cc\u03c4\u03b1",attribute_label_accesskey:"\u03a0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"\u0393\u03bb\u03ce\u03c3\u03c3\u03b1",attribute_option_rtl:"\u0394\u03b5\u03be\u03b9\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac",attribute_option_ltr:"\u0391\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ac \u03c0\u03c1\u03bf\u03c2 \u03b4\u03b5\u03be\u03b9\u03ac",attribute_label_langdir:"\u039a\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5",attribute_label_datetime:"\u0397\u03bc\u03ad\u03c1\u03b1/\u038f\u03c1\u03b1",attribute_label_cite:"Cite",attribute_label_style:"\u03a3\u03c4\u03c5\u03bb",attribute_label_class:"\u039a\u03bb\u03ac\u03c3\u03b7",attribute_label_id:"ID",attribute_label_title:"\u03a4\u03af\u03c4\u03bb\u03bf\u03c2"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js new file mode 100755 index 000000000..f9606eba6 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.xhtmlxtras_dlg',{"attribs_title":"Insert/Edit Attributes","option_rtl":"Right to left","option_ltr":"Left to right","insert_date":"Insert current date/time",remove:"Remove","title_cite_element":"Citation Element","title_abbr_element":"Abbreviation Element","title_acronym_element":"Acronym Element","title_del_element":"Deletion Element","title_ins_element":"Insertion Element","fieldset_events_tab":"Element Events","fieldset_attrib_tab":"Element Attributes","fieldset_general_tab":"General Settings","events_tab":"Events","attrib_tab":"Attributes","general_tab":"General","attribute_attrib_tab":"Attributes","attribute_events_tab":"Events","attribute_label_accesskey":"AccessKey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Language","attribute_option_rtl":"Right to left","attribute_option_ltr":"Left to right","attribute_label_langdir":"Text Direction","attribute_label_datetime":"Date/Time","attribute_label_cite":"Cite","attribute_label_style":"Style","attribute_label_class":"Class","attribute_label_id":"ID","attribute_label_title":"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js new file mode 100755 index 000000000..676e20086 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.xhtmlxtras_dlg',{"attribs_title":"Insertar/Editar atributos","option_rtl":"Derecha a izquierda","option_ltr":"Izquierda a derecha","insert_date":"Insertar fecha/hora actuales",remove:"Suprimir","title_cite_element":"Cita","title_abbr_element":"Abreviatura","title_acronym_element":"Acr\u00f3nimo","title_del_element":"Borrar","title_ins_element":"Insertar","fieldset_events_tab":"Evento","fieldset_attrib_tab":"Atributos","fieldset_general_tab":"Configuraci\u00f3n general","events_tab":"Eventos","attrib_tab":"Atributos","general_tab":"General","attribute_attrib_tab":"Atributos","attribute_events_tab":"Eventos","attribute_label_accesskey":"Tecla de acceso","attribute_label_tabindex":"Orden de tabulaci\u00f3n","attribute_label_langcode":"Lenguaje","attribute_option_rtl":"Derecha a izquierda","attribute_option_ltr":"Izquierda a derecha","attribute_label_langdir":"Direcci\u00f3n de texto","attribute_label_datetime":"Fecha/Hora","attribute_label_cite":"Cita","attribute_label_style":"Estilo","attribute_label_class":"Clase","attribute_label_id":"ID","attribute_label_title":"T\u00edtulo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js new file mode 100755 index 000000000..c5d4ac685 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.xhtmlxtras_dlg',{attribs_title:"Sisesta/muuda atribuute",option_rtl:"Paremalt vasakule",option_ltr:"Vasakult paremale",insert_date:"Sisesta hetke kuup\u00e4ev/aeg",remove:"Eemalda",title_cite_element:"Elemendi tsitaat",title_abbr_element:"Elemendi l\u00fchend",title_acronym_element:"Elemendi akron\u00fc\u00fcm",title_del_element:"Elemendi kustutus",title_ins_element:"Elemendi sisestus",fieldset_events_tab:"Elementide s\u00fcndmused",fieldset_attrib_tab:"Elementide atribuudid",fieldset_general_tab:"\u00dcldised seaded",events_tab:"S\u00fcndmused",attrib_tab:"Atribuudid",general_tab:"\u00dcldine",attribute_attrib_tab:"Atribuudid",attribute_events_tab:"S\u00fcndmused",attribute_label_accesskey:"Ligip\u00e4\u00e4suklahv",attribute_label_tabindex:"Sisujuht",attribute_label_langcode:"Keel",attribute_option_rtl:"Paremalt vasakule",attribute_option_ltr:"Vasakult paremale",attribute_label_langdir:"Teksti suund",attribute_label_datetime:"Kuup\u00e4ev/aeg",attribute_label_cite:"Tsitaat",attribute_label_style:"Stiil",attribute_label_class:"Klass",attribute_label_id:"ID",attribute_label_title:"Pealkiri"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/eu_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/eu_dlg.js new file mode 100755 index 000000000..2394dd11a --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/eu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('eu.xhtmlxtras_dlg',{attribs_title:"Atributuak txertatu/editatu",option_rtl:"Eskuinetik ezkerrera",option_ltr:"Ezkerretik eskuinera",insert_date:"Data/ordua txertatu",remove:"Ezabatu",title_cite_element:"Elementuaren zita",title_abbr_element:"Elementuaren laburdura",title_acronym_element:"Elementuaren akronimoa",title_del_element:"Elementuaren ezabaketa",title_ins_element:"Elementuaren txertaketa",fieldset_events_tab:"Elementuen ebentuak",fieldset_attrib_tab:"Elementuen atributuak",fieldset_general_tab:"Aukera orokorrak",events_tab:"Ebentuak",attrib_tab:"Atributuak",general_tab:"Orokorra",attribute_attrib_tab:"Atributuak",attribute_events_tab:"Ebentuak",attribute_label_accesskey:"Laster-tekla",attribute_label_tabindex:"Tabulazio ordena",attribute_label_langcode:"Hizkuntza",attribute_option_rtl:"Eskuinetik ezkerrera",attribute_option_ltr:"Ezkerretik eskuinera",attribute_label_langdir:"Testuaren norabidea",attribute_label_datetime:"Data/Ordua",attribute_label_cite:"Zita",attribute_label_style:"Estiloa",attribute_label_class:"Klasea",attribute_label_id:"ID",attribute_label_title:"Izenburua"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/fa_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/fa_dlg.js new file mode 100755 index 000000000..09e33b7b9 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/fa_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fa.xhtmlxtras_dlg',{attribs_title:"\u062f\u0631\u062c/\u0648\u06cc\u0631\u0627\u06cc\u0634 \u0635\u0641\u0627\u062a",option_rtl:"\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e",option_ltr:"\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a",insert_date:"\u062f\u0631\u062c \u062a\u0627\u0631\u06cc\u062e/\u0632\u0645\u0627\u0646 \u0641\u0639\u0644\u06cc",remove:"\u062d\u0630\u0641",title_cite_element:"\u0639\u0646\u0635\u0631 \u0646\u0642\u0644 \u0642\u0648\u0644",title_abbr_element:"\u0639\u0646\u0635\u0631 \u0627\u062e\u062a\u0635\u0627\u0631",title_acronym_element:"\u0639\u0646\u0635\u0631 \u0645\u062e\u0641\u0641",title_del_element:"\u0639\u0646\u0635\u0631 \u062d\u0630\u0641",title_ins_element:"\u0639\u0646\u0635\u0631 \u062f\u0631\u062c",fieldset_events_tab:"\u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0639\u0646\u0635\u0631",fieldset_attrib_tab:"\u0635\u0641\u0627\u062a \u0639\u0646\u0635\u0631",fieldset_general_tab:"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0639\u0645\u0648\u0645\u06cc",events_tab:"\u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627",attrib_tab:"\u0635\u0641\u0627\u062a",general_tab:"\u0639\u0645\u0648\u0645\u06cc",attribute_attrib_tab:"\u0635\u0641\u0627\u062a",attribute_events_tab:"\u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"\u0632\u0628\u0627\u0646",attribute_option_rtl:"\u0631\u0627\u0633\u062a \u0628\u0647 \u0686\u067e",attribute_option_ltr:"\u0686\u067e \u0628\u0647 \u0631\u0627\u0633\u062a",attribute_label_langdir:"\u062c\u0647\u062a \u0645\u062a\u0646",attribute_label_datetime:"\u062a\u0627\u0631\u06cc\u062e/\u0632\u0645\u0627\u0646",attribute_label_cite:"\u0627\u0639\u0644\u0627\u0645\u06cc\u0647",attribute_label_style:"\u0627\u0633\u062a\u06cc\u0644",attribute_label_class:"\u06a9\u0644\u0627\u0633",attribute_label_id:"\u0634\u0646\u0627\u0633\u0647",attribute_label_title:"\u0639\u0646\u0648\u0627\u0646"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js new file mode 100755 index 000000000..ca5fc9888 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.xhtmlxtras_dlg',{attribs_title:"Lis\u00e4\u00e4/muokkaa attribuutteja",option_rtl:"Oikealta vasemmalle",option_ltr:"Vasemmalta oikealle",insert_date:"Lis\u00e4\u00e4 t\u00e4m\u00e4nhetkinen p\u00e4iv\u00e4/aika",remove:"Poista",title_cite_element:"Sitaatti elementit",title_abbr_element:"Lyhenne elementit",title_acronym_element:"Kirjainlyhenne elementit",title_del_element:"Poisto elementit",title_ins_element:"Lis\u00e4ys elementit",fieldset_events_tab:"Elementin tapahtumat",fieldset_attrib_tab:"Elementin attribuutit",fieldset_general_tab:"Yleiset asetukset",events_tab:"Tapahtumat",attrib_tab:"Attribuutit",general_tab:"Yleiset",attribute_attrib_tab:"Attribuutit",attribute_events_tab:"Tapahtumat",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Kieli",attribute_option_rtl:"Oikealta vasemmalle",attribute_option_ltr:"Vasemmalta oikealle",attribute_label_langdir:"Tekstin suunta",attribute_label_datetime:"P\u00e4iv\u00e4/Aika",attribute_label_cite:"Sitaatti",attribute_label_style:"Tyyli",attribute_label_class:"Luokka",attribute_label_id:"ID",attribute_label_title:"Otsikko"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js new file mode 100755 index 000000000..59a9ead84 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.xhtmlxtras_dlg',{attribs_title:"Ins\u00e9rer / \u00e9diter les attributs",option_rtl:"De droite \u00e0 gauche",option_ltr:"De gauche \u00e0 droite",insert_date:"Ins\u00e9rer la date et l\'heure actuelles",remove:"Enlever",title_cite_element:"Citation",title_abbr_element:"Abr\u00e9viation",title_acronym_element:"Acronyme",title_del_element:"Suppression",title_ins_element:"Insertion",fieldset_events_tab:"\u00c9v\u00e9nements",fieldset_attrib_tab:"Attributs",fieldset_general_tab:"Param\u00e8tres g\u00e9n\u00e9raux",events_tab:"\u00c9v\u00e9nements",attrib_tab:"Attributs",general_tab:"G\u00e9n\u00e9ral",attribute_attrib_tab:"Attributs",attribute_events_tab:"\u00c9v\u00e8nements",attribute_label_accesskey:"Accesskey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Langue",attribute_option_rtl:"De droite \u00e0 gauche",attribute_option_ltr:"De gauche \u00e0 droite",attribute_label_langdir:"Sens de lecture",attribute_label_datetime:"Date / heure",attribute_label_cite:"Citation",attribute_label_style:"Style",attribute_label_class:"Classe",attribute_label_id:"ID",attribute_label_title:"Titre"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/gl_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/gl_dlg.js new file mode 100755 index 000000000..1b53af591 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.xhtmlxtras_dlg',{attribs_title:"Insertar/Editar atributos",option_rtl:"Dereita a esquerda",option_ltr:"Esquerda a dereita",insert_date:"Insertar data/hora actuais",remove:"Suprimir",title_cite_element:"Cita",title_abbr_element:"Abreviatura",title_acronym_element:"Acr\u00f3nimo",title_del_element:"Borrar",title_ins_element:"Insertar",fieldset_events_tab:"Evento",fieldset_attrib_tab:"Atributos",fieldset_general_tab:"Configuraci\u00f3n xeral",events_tab:"Eventos",attrib_tab:"Atributos",general_tab:"Xeral",attribute_attrib_tab:"Atributos",attribute_events_tab:"Eventos",attribute_label_accesskey:"Tecla de acceso",attribute_label_tabindex:"Orde de tabulaci\u00f3n",attribute_label_langcode:"Lenguaxe",attribute_option_rtl:"Dereita a esquerda",attribute_option_ltr:"Esquerda a dereita",attribute_label_langdir:"Direcci\u00f3n de texto",attribute_label_datetime:"Data/Hora",attribute_label_cite:"Cita",attribute_label_style:"Estilo",attribute_label_class:"Clase",attribute_label_id:"ID",attribute_label_title:"T\u00edtulo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/gu_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/gu_dlg.js new file mode 100755 index 000000000..70427192b --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/gu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gu.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js new file mode 100755 index 000000000..dbb28fc49 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.xhtmlxtras_dlg',{attribs_title:"\u05d4\u05db\u05e0\u05e1\u05ea/\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05db\u05d5\u05e0\u05d5\u05ea",option_rtl:"\u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc",option_ltr:"\u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df",insert_date:"\u05d4\u05db\u05e0\u05e1\u05ea \u05d6\u05de\u05df/\u05ea\u05d0\u05e8\u05d9\u05da \u05e0\u05d5\u05db\u05d7\u05d9",remove:"\u05d4\u05e1\u05e8",title_cite_element:"\u05e6\u05d9\u05d8\u05d5\u05d8 \u05d0\u05dc\u05de\u05e0\u05d8",title_abbr_element:"\u05e7\u05d9\u05e6\u05d5\u05e8 \u05d0\u05dc\u05de\u05e0\u05d8",title_acronym_element:"\u05e8\u05d0\u05e9\u05d9 \u05ea\u05d9\u05d1\u05d5\u05ea \u05d4\u05d0\u05dc\u05de\u05e0\u05d8",title_del_element:"\u05de\u05d7\u05d9\u05e7\u05ea \u05d0\u05dc\u05de\u05e0\u05d8",title_ins_element:"\u05d4\u05db\u05e0\u05e1\u05ea \u05d0\u05dc\u05de\u05e0\u05d8",fieldset_events_tab:"\u05d0\u05d9\u05e8\u05d5\u05e2\u05d9 \u05d4\u05d0\u05dc\u05de\u05e0\u05d8",fieldset_attrib_tab:" \u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05d4\u05d0\u05dc\u05de\u05e0\u05d8",fieldset_general_tab:"\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05db\u05dc\u05dc\u05d9\u05d5\u05ea",events_tab:"\u05d0\u05d9\u05e8\u05d5\u05e2\u05d9\u05dd",attrib_tab:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea",general_tab:"\u05db\u05dc\u05dc\u05d9",attribute_attrib_tab:"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea",attribute_events_tab:"\u05d0\u05d9\u05e8\u05d5\u05e2\u05d9\u05dd",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"\u05e9\u05e4\u05d4",attribute_option_rtl:"\u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc",attribute_option_ltr:"\u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df",attribute_label_langdir:"\u05db\u05d9\u05d5\u05d5\u05df \u05d4\u05d8\u05e7\u05e1\u05d8",attribute_label_datetime:"\u05ea\u05d0\u05e8\u05d9\u05da/\u05d6\u05de\u05df",attribute_label_cite:"\u05e6\u05d9\u05d8\u05d5\u05d8",attribute_label_style:"\u05e2\u05d9\u05e6\u05d5\u05d1",attribute_label_class:"\u05de\u05d7\u05dc\u05e7\u05d4",attribute_label_id:"ID",attribute_label_title:"\u05db\u05d5\u05ea\u05e8\u05ea"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/hi_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/hi_dlg.js new file mode 100755 index 000000000..601241761 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/hi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hi.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/hr_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/hr_dlg.js new file mode 100755 index 000000000..d706382b9 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/hr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hr.xhtmlxtras_dlg',{attribs_title:"Umetni/uredi atribute",option_rtl:"S desna na lijevo",option_ltr:"S lijeva na desno",insert_date:"Umetni trenuta\u010dni datum/vrijeme",remove:"Ukloni",title_cite_element:"Element citata",title_abbr_element:"Element kratice",title_acronym_element:"Element akronima",title_del_element:"Element za brisanje",title_ins_element:"Element za unos",fieldset_events_tab:"Doga\u0111aji elemenata",fieldset_attrib_tab:"Atributi elemenata",fieldset_general_tab:"Osnovne postavke",events_tab:"Doga\u0111aji",attrib_tab:"Atributi",general_tab:"Osnovno",attribute_attrib_tab:"Atributi",attribute_events_tab:"Doga\u0111aji",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Jezik",attribute_option_rtl:"S desna na lijevo",attribute_option_ltr:"S lijeva na desno",attribute_label_langdir:"Smjer teksta",attribute_label_datetime:"Datum/vrijeme",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Klasa",attribute_label_id:"ID",attribute_label_title:"Naslov"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js new file mode 100755 index 000000000..8af166632 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.xhtmlxtras_dlg',{"attribs_title":"Tulajdons\u00e1gok besz\u00far\u00e1sa/szerkeszt\u00e9se","option_rtl":"Jobbr\u00f3l balra","option_ltr":"Balr\u00f3l jobra","insert_date":"Aktu\u00e1lis d\u00e1tum/id\u0151 besz\u00far\u00e1sa",remove:"Elt\u00e1vol\u00edt\u00e1s","title_cite_element":"Id\u00e9zet elem","title_abbr_element":"R\u00f6vid\u00edt\u00e9s elem","title_acronym_element":"Bet\u0171sz\u00f3 elem","title_del_element":"T\u00f6r\u00f6lt elem","title_ins_element":"Besz\u00fart elem","fieldset_events_tab":"Elem esem\u00e9nyek","fieldset_attrib_tab":"Elem tulajdons\u00e1gok","fieldset_general_tab":"\u00c1ltal\u00e1nos be\u00e1ll\u00edt\u00e1sok","events_tab":"Esem\u00e9nyek","attrib_tab":"Tulajdons\u00e1gok","general_tab":"\u00c1ltal\u00e1nos","attribute_attrib_tab":"Tulajdons\u00e1gok","attribute_events_tab":"Esem\u00e9nyek","attribute_label_accesskey":"Gyorsbilenty\u0171","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Nyelv","attribute_option_rtl":"Jobbr\u00f3l balra","attribute_option_ltr":"Balr\u00f3l jobbra","attribute_label_langdir":"Sz\u00f6veg ir\u00e1nya","attribute_label_datetime":"D\u00e1tum/Id\u0151","attribute_label_cite":"Id\u00e9zet","attribute_label_style":"Style","attribute_label_class":"Class","attribute_label_id":"ID","attribute_label_title":"C\u00edm"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js new file mode 100755 index 000000000..f8c56d4a9 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/hy_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hy.xhtmlxtras_dlg',{attribs_title:"\u054f\u0565\u0572\u0561\u0564\u0580\u0565\u056c / \u0583\u0578\u0583\u0578\u056d\u0565\u056c \u0561\u057f\u0580\u056b\u0562\u0578\u0582\u057f\u0576\u0565\u0580",option_rtl:"\u0531\u057b\u056b\u0581 \u0571\u0561\u056d",option_ltr:"\u0541\u0561\u056d\u056b\u0581 \u0561\u057b",insert_date:"\u054f\u0565\u0572\u0561\u0564\u0580\u0565\u056c \u0568\u0576\u0569\u0561\u0581\u056b\u056f \u0561\u0574\u057d\u0561\u0569\u056b\u057e\u0568 / \u056a\u0561\u0574\u0568",remove:"\u0540\u0565\u057c\u0561\u0581\u0576\u0565\u056c",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"\u0538\u0576\u0564\u0570\u0561\u0576\u0578\u0582\u0580 \u057a\u0561\u0580\u0561\u0574\u0565\u057f\u0580\u0565\u0580",events_tab:"\u0534\u0565\u057a\u0584\u0565\u0580",attrib_tab:"\u0531\u057f\u0580\u056b\u0562\u0578\u0582\u057f\u0576\u0565\u0580",general_tab:"\u0540\u056b\u0574\u0576\u0561\u056f\u0561\u0576",attribute_attrib_tab:"\u0531\u0568\u0580\u056b\u0562\u0578\u0582\u057f\u0576\u0565\u0580",attribute_events_tab:"\u0534\u0565\u057a\u0584\u0565\u0580",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"\u053c\u0565\u0566\u0578\u0582",attribute_option_rtl:"\u0531\u057b\u056b\u0581 \u0571\u0561\u056d",attribute_option_ltr:"\u0541\u0561\u056d\u056b\u0581 \u0561\u057b",attribute_label_langdir:"\u054f\u0565\u0584\u057d\u057f\u056b \u0578\u0582\u0572\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576",attribute_label_datetime:"\u0531\u0574\u057d\u0561\u0569\u056b\u057e / \u053a\u0561\u0574\u0561\u0576\u0561\u056f",attribute_label_cite:"\u0544\u0565\u056f\u0576\u0561\u0562\u0561\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",attribute_label_style:"\u0548\u0573",attribute_label_class:"\u0534\u0561\u057d",attribute_label_id:"ID",attribute_label_title:"\u054e\u0565\u0580\u0576\u0561\u0563\u056b\u0580"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ia_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ia_dlg.js new file mode 100755 index 000000000..20bd8f023 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ia_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ia.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7f16\u8f91 \u5c5e\u6027",option_rtl:"\u4ece\u53f3\u5230\u5de6",option_ltr:"\u4ece\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u5f53\u524d\u65e5\u671f/\u65f6\u95f4",remove:"\u79fb\u9664",title_cite_element:"\u5f15\u7528\u5bf9\u8c61",title_abbr_element:"\u7f29\u5199\u5bf9\u8c61",title_acronym_element:"\u9996\u5b57\u6bcd\u7f29\u5199\u5bf9\u8c61",title_del_element:"\u5220\u9664\u5bf9\u8c61",title_ins_element:"\u63d2\u5165\u5bf9\u8c61",fieldset_events_tab:"\u5bf9\u8c61\u4e8b\u4ef6",fieldset_attrib_tab:"\u5bf9\u8c61\u5c5e\u6027",fieldset_general_tab:"\u57fa\u672c",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c5e\u6027",general_tab:"\u57fa\u672c",attribute_attrib_tab:"\u5c5e\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u901f\u952e",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8bed\u8a00",attribute_option_rtl:"\u4ece\u53f3\u5230\u5de6",attribute_option_ltr:"\u4ece\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u4e66\u5199\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u65f6\u95f4",attribute_label_cite:"\u5f15\u7528",attribute_label_style:"\u6837\u5f0f",attribute_label_class:"\u6837\u5f0f\u7c7b",attribute_label_id:"ID",attribute_label_title:"\u67e5\u627e"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js new file mode 100755 index 000000000..495e80033 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.xhtmlxtras_dlg',{attribs_title:"Sisipkan/Ubah atribut",option_rtl:"Kanan ke kiri",option_ltr:"Kiri ke kanan",insert_date:"Sisipkan tanggal/waktu sekarang",remove:"Hapus",title_cite_element:"Elemen Kutipan",title_abbr_element:"Elemen Singkatan",title_acronym_element:"Elemen Akronim",title_del_element:"Elemen penghapusan",title_ins_element:"Elemen Penyisipak",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Atribut Element",fieldset_general_tab:"Pengaturan Umum",events_tab:"Events",attrib_tab:"Atribut",general_tab:"Umum",attribute_attrib_tab:"Atribut",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Bahasa",attribute_option_rtl:"Kanan ke kiri",attribute_option_ltr:"Kiri ke kanan",attribute_label_langdir:"Arah Text",attribute_label_datetime:"Tanggal/waktu",attribute_label_cite:"Kutip",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Judul"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/is_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/is_dlg.js new file mode 100755 index 000000000..89b3af5e1 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/is_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('is.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js new file mode 100755 index 000000000..2421e829e --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.xhtmlxtras_dlg',{attribs_title:"Inserisci/modifica attributi",option_rtl:"Destra verso sinistra",option_ltr:"Sinistra verso destra",insert_date:"Inserisci data/ora corrente",remove:"Rimuovi",title_cite_element:"Citazione elemento",title_abbr_element:"Abbreviazione elemento",title_acronym_element:"Acronimo elemento",title_del_element:"Cancellazione elemento",title_ins_element:"Inserimento elemento",fieldset_events_tab:"Eventi elemento",fieldset_attrib_tab:"Attributi elemento",fieldset_general_tab:"Impostazioni Generali",events_tab:"Eventi",attrib_tab:"Attributi",general_tab:"Generale",attribute_attrib_tab:"Attributi",attribute_events_tab:"Eventi",attribute_label_accesskey:"Tasto di accesso",attribute_label_tabindex:"Indice tabulazione",attribute_label_langcode:"Lingua",attribute_option_rtl:"Destra verso sinistra",attribute_option_ltr:"Sinistra verso destra",attribute_label_langdir:"Direzione del testo",attribute_label_datetime:"Date/Time",attribute_label_cite:"Citazione",attribute_label_style:"Style",attribute_label_class:"Classe",attribute_label_id:"ID",attribute_label_title:"Titolo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ja_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ja_dlg.js new file mode 100755 index 000000000..6a8bc19dd --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ja_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ja.xhtmlxtras_dlg',{"attribs_title":"\u5c5e\u6027\u306e\u633f\u5165/\u524a\u9664","option_rtl":"\u53f3\u304b\u3089\u5de6","option_ltr":"\u5de6\u304b\u3089\u53f3","insert_date":"\u73fe\u5728\u306e\u65e5\u4ed8/\u6642\u523b\u3092\u633f\u5165",remove:"Remove","title_cite_element":"\u5f15\u7528\u30a8\u30ec\u30e1\u30f3\u30c8","title_abbr_element":"\u7565\u8a9e\u30a8\u30ec\u30e1\u30f3\u30c8","title_acronym_element":"\u982d\u5b57\u8a9e\u30a8\u30ec\u30e1\u30f3\u30c8","title_del_element":"\u30a8\u30ec\u30e1\u30f3\u30c8\u3092\u524a\u9664","title_ins_element":"\u30a8\u30ec\u30e1\u30f3\u30c8\u3092\u633f\u5165","fieldset_events_tab":"\u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u30a4\u30d9\u30f3\u30c8","fieldset_attrib_tab":"\u30a8\u30ec\u30e1\u30f3\u30c8\u306e\u5c5e\u6027","fieldset_general_tab":"\u4e00\u822c","events_tab":"\u30a4\u30d9\u30f3\u30c8","attrib_tab":"\u5c5e\u6027","general_tab":"\u4e00\u822c","attribute_attrib_tab":"\u5c5e\u6027","attribute_events_tab":"\u30a4\u30d9\u30f3\u30c8","attribute_label_accesskey":"\u30a2\u30af\u30bb\u30b9\u30ad\u30fc","attribute_label_tabindex":"\u30bf\u30d6\u30a4\u30f3\u30c7\u30c3\u30af\u30b9","attribute_label_langcode":"\u8a00\u8a9e","attribute_option_rtl":"\u53f3\u304b\u3089\u5de6","attribute_option_ltr":"\u5de6\u304b\u3089\u53f3","attribute_label_langdir":"\u6587\u7ae0\u306e\u65b9\u5411","attribute_label_datetime":"\u65e5\u4ed8/\u6642\u523b","attribute_label_cite":"\u5f15\u7528","attribute_label_style":"\u30b9\u30bf\u30a4\u30eb","attribute_label_class":"\u30af\u30e9\u30b9","attribute_label_id":"ID","attribute_label_title":"\u30bf\u30a4\u30c8\u30eb"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ka_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ka_dlg.js new file mode 100755 index 000000000..a6f2e2ed9 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ka_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ka.xhtmlxtras_dlg',{attribs_title:"\u10d4\u10da\u10d4\u10db\u10d4\u10dc\u10e2\u10d8\u10e1 \u10d7\u10d5\u10d8\u10e1\u10d4\u10d1\u10d4\u10d1\u10d8",option_rtl:"\u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d5",option_ltr:"\u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d5",insert_date:"\u10d7\u10d0\u10e0\u10d8\u10e6\u10d8\u10e1 \u10e9\u10d0\u10e1\u10db\u10d0",remove:"\u10ec\u10d0\u10e8\u10da\u10d0",title_cite_element:"\u10ea\u10d8\u10e2\u10d8\u10e0\u10d4\u10d1\u10d0",title_abbr_element:"\u10e8\u10d4\u10db\u10dd\u10d9\u10da\u10d4\u10d1\u10d0",title_acronym_element:"\u10d0\u10d1\u10e0\u10d8\u10d5\u10d8\u10d0\u10ea\u10d8\u10d0",title_del_element:"\u10ec\u10d0\u10e8\u10da\u10d0",title_ins_element:"\u10e8\u10d4\u10ea\u10d5\u10da\u10d0",fieldset_events_tab:"\u10d4\u10da\u10d4\u10db\u10d4\u10dc\u10e2\u10d4\u10d1\u10d8\u10e1 \u10db\u10dd\u10d5\u10da\u10d4\u10dc\u10d4\u10d1\u10d8",fieldset_attrib_tab:"\u10d4\u10da\u10d4\u10db\u10d4\u10dc\u10e2\u10d8\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",fieldset_general_tab:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",events_tab:"\u10db\u10dd\u10d5\u10da\u10d4\u10dc\u10d0",attrib_tab:"\u10d0\u10e2\u10e0\u10d8\u10d1\u10e3\u10e2\u10d8",general_tab:"\u10e1\u10d0\u10d4\u10e0\u10d7\u10dd",attribute_attrib_tab:"\u10d0\u10e2\u10e0\u10d8\u10d1\u10e3\u10e2\u10d8",attribute_events_tab:"\u10db\u10dd\u10d5\u10da\u10d4\u10dc\u10d0",attribute_label_accesskey:"\u10ec\u10d5\u10d3\u10dd\u10db\u10d8\u10e1 \u10d2\u10d0\u10e1\u10d0\u10e6\u10d4\u10d1\u10d8",attribute_label_tabindex:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8",attribute_label_langcode:"\u10d4\u10dc\u10d0",attribute_option_rtl:"\u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d5",attribute_option_ltr:"\u10db\u10d0\u10e0\u10ea\u10ee\u10dc\u10d8\u10d3\u10d0\u10dc \u10db\u10d0\u10e0\u10ef\u10d5\u10dc\u10d8\u10d5",attribute_label_langdir:"\u10e2\u10d4\u10e5\u10e1\u10e2\u10d8\u10e1 \u10db\u10d8\u10db\u10e0\u10d7\u10e3\u10da\u10d4\u10d1\u10d0",attribute_label_datetime:"\u10d7\u10d0\u10e0\u10d8\u10e6\u10d8/\u10d3\u10e0\u10dd",attribute_label_cite:"\u10ea\u10d8\u10e2\u10d0\u10e2\u10d0",attribute_label_style:"\u10e1\u10e2\u10d8\u10da\u10d8",attribute_label_class:"\u10d9\u10da\u10d0\u10e1\u10d8",attribute_label_id:"\u10e1\u10d0\u10ee\u10d4\u10da\u10d8",attribute_label_title:"\u10e1\u10d0\u10d7\u10d0\u10e3\u10e0\u10d8"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/kl_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/kl_dlg.js new file mode 100755 index 000000000..ec8834b97 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/kl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('kl.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/km_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/km_dlg.js new file mode 100755 index 000000000..21def224d --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/km_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('km.xhtmlxtras_dlg',{attribs_title:"\u1794\u1789\u17d2\u1785\u17bc\u179b/\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u1782\u17bb\u178e\u179b\u1780\u17d2\u1781\u178e\u17c8",option_rtl:"\u1796\u17b8\u179f\u17d2\u178f\u17b6\u17c6\u1791\u17c5\u1786\u17d2\u179c\u17c1\u1784",option_ltr:"\u1796\u17b8\u1786\u17d2\u179c\u17c1\u1784\u1791\u17c5\u179f\u17d2\u178f\u17b6\u17c6",insert_date:"\u1794\u1789\u17d2\u1785\u17bc\u179b\u1780\u17b6\u179b\u1794\u179a\u17b7\u1785\u17d2\u1786\u17c1\u1791/\u1798\u17c9\u17c4\u1784",remove:"\u1799\u1780\u1785\u17c1\u1789",title_cite_element:"\u1792\u17b6\u178f\u17bb\u179f\u17c1\u1785\u1780\u17d2\u178f\u17b8\u178a\u1780\u179f\u17d2\u179a\u1784\u17cb",title_abbr_element:"\u1792\u17b6\u178f\u17bb\u17a2\u1780\u17d2\u179f\u179a\u179f\u1784\u17d2\u1781\u17c1\u1794",title_acronym_element:"\u1792\u17b6\u178f\u17bb\u1796\u17b6\u1780\u17d2\u1799\u1780\u17b6\u178f\u17cb\u1799\u1780\u17a2\u1780\u17d2\u179f\u179a\u178a\u17be\u1798",title_del_element:"\u1792\u17b6\u178f\u17bb\u179b\u17bb\u1794",title_ins_element:"\u1792\u17b6\u178f\u17bb\u1794\u1789\u17d2\u1785\u17bc\u179b",fieldset_events_tab:"\u1792\u17b6\u178f\u17bb\u1796\u17d2\u179a\u17b9\u178f\u17d2\u178f\u17b7\u1780\u17b6\u179a\u178e\u17cd",fieldset_attrib_tab:"\u1792\u17b6\u178f\u17bb\u1782\u17bb\u178e\u179b\u1780\u17d2\u1781\u178e\u17c8",fieldset_general_tab:"\u1780\u17b6\u179a\u1780\u17c6\u178e\u178f\u17cb\u1791\u17bc\u1791\u17c5",events_tab:"\u1796\u17d2\u179a\u17b9\u178f\u17d2\u178f\u17b7\u1780\u17b6\u179a\u178e\u17cd",attrib_tab:"\u1782\u17bb\u178e\u179b\u1780\u17d2\u1781\u178e\u17c8",general_tab:"\u1791\u17bc\u1791\u17c5",attribute_attrib_tab:"\u1782\u17bb\u178e\u179b\u1780\u17d2\u1781\u178e\u17c8",attribute_events_tab:"\u1796\u17d2\u179a\u17b9\u178f\u17d2\u178f\u17b7\u1780\u17b6\u179a\u178e\u17cd",attribute_label_accesskey:"\u1782\u17d2\u179a\u17b6\u1794\u17cb\u1785\u17bb\u1785\u1795\u17d2\u179b\u17bc\u179c\u1780\u17b6\u178f\u17cb",attribute_label_tabindex:"\u1795\u17d2\u1791\u17b6\u17c6\u1784\u179b\u17b7\u1794\u17b7\u1780\u17d2\u179a\u1798",attribute_label_langcode:"\u1797\u17b6\u179f\u17b6",attribute_option_rtl:"\u1796\u17b8\u179f\u17d2\u178f\u17b6\u17c6\u1791\u17c5\u1786\u17d2\u179c\u17c1\u1784",attribute_option_ltr:"\u1796\u17b8\u1786\u17d2\u179c\u17c1\u1784\u1791\u17c5\u179f\u17d2\u178f\u17b6\u17c6",attribute_label_langdir:"\u1791\u17b7\u179f\u178a\u17c5\u17a2\u178f\u17d2\u1790\u1794\u1791",attribute_label_datetime:"\u1780\u17b6\u179b\u1794\u179a\u17b7\u1785\u17d2\u1786\u17c1\u1791/\u1798\u17c9\u17c4\u1784",attribute_label_cite:"\u178a\u1780\u179f\u17d2\u179a\u1784\u17cb",attribute_label_style:"\u179a\u1785\u1793\u17b6\u1794\u17d0\u1791\u17d2\u1798",attribute_label_class:"\u1790\u17d2\u1793\u17b6\u1780\u17cb",attribute_label_id:"\u179b.\u179f.",attribute_label_title:"\u1785\u17c6\u178e\u1784\u1787\u17be\u1784"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ko_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ko_dlg.js new file mode 100755 index 000000000..4a7a6429e --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ko_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ko.xhtmlxtras_dlg',{attribs_title:"\uc18d\uc131\uc758 \uc0bd\uc785/\ud3b8\uc9d1",option_rtl:"\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd",option_ltr:"\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd",insert_date:"\ud604\uc7ac\uc758 \ub0a0\uc9dc/\uc2dc\uac04\uc744 \uc0bd\uc785",remove:"\uc0ad\uc81c",title_cite_element:"\uc778\uc6a9 \uc694\uc18c",title_abbr_element:"\uc57d\uae30 \uc694\uc18c",title_acronym_element:"\uba38\ub9ac \uae00\uc790\uc5b4 \uc694\uc18c",title_del_element:"\uc694\uc18c\uc758 \uc0ad\uc81c",title_ins_element:"\uc694\uc18c\uc758 \uc0bd\uc785",fieldset_events_tab:"\uc694\uc18c\uc758 \uc774\ubca4\ud2b8",fieldset_attrib_tab:"\uc694\uc18c\uc758 \uc18d\uc131",fieldset_general_tab:"\uc77c\ubc18 \uc124\uc815",events_tab:"\uc774\ubca4\ud2b8",attrib_tab:"\uc18d\uc131",general_tab:"\uc77c\ubc18",attribute_attrib_tab:"\uc18d\uc131",attribute_events_tab:"\uc774\ubca4\ud2b8",attribute_label_accesskey:"\uc561\uc138\uc2a4 \ud0a4",attribute_label_tabindex:"\ud0ed \uc778\ub371\uc2a4",attribute_label_langcode:"\uc5b8\uc5b4",attribute_option_rtl:"\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd",attribute_option_ltr:"\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd",attribute_label_langdir:"\ubb38\uc790 \ubc29\ud5a5",attribute_label_datetime:"\ub0a0\uc9dc/\uc2dc\uac04",attribute_label_cite:"\uc778\uc6a9",attribute_label_style:"\uc2a4\ud0c0\uc77c",attribute_label_class:"\ud074\ub798\uc2a4",attribute_label_id:"ID",attribute_label_title:"\uc81c\ubaa9"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js new file mode 100755 index 000000000..43ce9364e --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/lb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lb.xhtmlxtras_dlg',{attribs_title:"Attributer af\u00fcgen/beaarbechten",option_rtl:"Riets no l\u00e9nks",option_ltr:"L\u00e9nks no riets",insert_date:"Aktuell Z\u00e4it/Datum af\u00fcgen",remove:"Ewechhuelen",title_cite_element:"Quellenangab",title_abbr_element:"Ofkierzung",title_acronym_element:"Akronym",title_del_element:"Ewechgehollenen Text",title_ins_element:"Agef\u00fcgtenen Text",fieldset_events_tab:"Ereegnes",fieldset_attrib_tab:"Attributer",fieldset_general_tab:"Allgemeng Astellungen",events_tab:"Ereegnes",attrib_tab:"Attributer",general_tab:"Allgemeng",attribute_attrib_tab:"Attributer",attribute_events_tab:"Ereegnes",attribute_label_accesskey:"Tastekierzel",attribute_label_tabindex:"Tabindex",attribute_label_langcode:"Sproochen",attribute_option_rtl:"Riets no l\u00e9nks",attribute_option_ltr:"L\u00e9nks no riets",attribute_label_langdir:"Schr\u00ebftrichtung",attribute_label_datetime:"Z\u00e4it/Datum",attribute_label_cite:"Quellenangab",attribute_label_style:"Format",attribute_label_class:"Klasse",attribute_label_id:"ID",attribute_label_title:"Titel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/lt_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/lt_dlg.js new file mode 100755 index 000000000..4ec75ca7d --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.xhtmlxtras_dlg',{attribs_title:"\u012eterpti/Redaguoti atributus",option_rtl:"I\u0161 de\u0161in\u0117s \u012f kair\u0119",option_ltr:"I\u0161 kair\u0117s \u012f de\u0161in\u0119",insert_date:"\u012eterpti dabartin\u0119 dat\u0105/laik\u0105",remove:"Pa\u0161alinti",title_cite_element:"Citatos elementas",title_abbr_element:"Santrumpos elementas",title_acronym_element:"Akronimo elementas",title_del_element:"Pa\u0161alinimo elementas",title_ins_element:"\u012eterpimo elementas",fieldset_events_tab:"Elemento \u012fvykiai",fieldset_attrib_tab:"Elemento atributai",fieldset_general_tab:"Bendri nustatymai",events_tab:"\u012evykiai",attrib_tab:"Atributai",general_tab:"Bendra",attribute_attrib_tab:"Atributai",attribute_events_tab:"\u012evykiai",attribute_label_accesskey:"Prieigos klavi\u0161as",attribute_label_tabindex:"Tabuliavimo indeksas",attribute_label_langcode:"Kalba",attribute_option_rtl:"I\u0161 de\u0161in\u0117s \u012f kair\u0119",attribute_option_ltr:"I\u0161 kair\u0117s \u012f de\u0161in\u0119",attribute_label_langdir:"Kalbos teksto kryptis",attribute_label_datetime:"Data/Laikas",attribute_label_cite:"Citata",attribute_label_style:"Stilius",attribute_label_class:"Klas\u0117",attribute_label_id:"ID",attribute_label_title:"Pavadinimas"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/lv_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/lv_dlg.js new file mode 100755 index 000000000..146c2d241 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"\u012apa\u0161\u012bbas",attribute_events_tab:"Notikumi",attribute_label_accesskey:"Pieejas poga",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Valoda",attribute_option_rtl:"No labas puses uz kreiso",attribute_option_ltr:"No kreisas puses uz labo",attribute_label_langdir:"Teksta v\u012brziens",attribute_label_datetime:"Datums/Laiks",attribute_label_cite:"Cite",attribute_label_style:"Stils",attribute_label_class:"Klase",attribute_label_id:"ID",attribute_label_title:"Nosaukums"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/mk_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/mk_dlg.js new file mode 100755 index 000000000..535976291 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/mk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mk.xhtmlxtras_dlg',{attribs_title:"\u0412\u043c\u0435\u0442\u043d\u0438/uredi atribute",option_rtl:"S desna na levo",option_ltr:"S leva na desno",insert_date:"\u0412\u043c\u0435\u0442\u043d\u0438 trenuta\u010dni datum/vreme",remove:"Ukloni",title_cite_element:"Element citata",title_abbr_element:"Element kratice",title_acronym_element:"Element akronima",title_del_element:"Element za brisanje",title_ins_element:"Element za unos",fieldset_events_tab:"Doga\u0111aji elemenata",fieldset_attrib_tab:"Atributi elemenata",fieldset_general_tab:"Osnovne postavke",events_tab:"Doga\u0111aji",attrib_tab:"Atributi",general_tab:"Osnovno",attribute_attrib_tab:"Atributi",attribute_events_tab:"Doga\u0111aji",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Jezik",attribute_option_rtl:"S desna na levo",attribute_option_ltr:"S leva na desno",attribute_label_langdir:"Smjer teksta",attribute_label_datetime:"Datum/vreme",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Klasa",attribute_label_id:"ID",attribute_label_title:"\u041d\u0430\u0441\u043b\u043e\u0432"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ml_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ml_dlg.js new file mode 100755 index 000000000..0d7ff2f6b --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ml_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ml.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/mn_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/mn_dlg.js new file mode 100755 index 000000000..5c0730ccd --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/mn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('mn.xhtmlxtras_dlg',{attribs_title:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442 \u043e\u0440\u0443\u0443\u043b\u0430\u0445/\u0437\u0430\u0441\u0432\u0430\u0440\u043b\u0430\u0445",option_rtl:"\u0411\u0430\u0440\u0443\u0443\u043d\u0430\u0430\u0441 \u0437\u04af\u04af\u043d",option_ltr:"\u0417\u04af\u04af\u043d\u044d\u044d\u0441 \u0431\u0430\u0440\u0443\u0443\u043d",insert_date:"\u0418\u0434\u044d\u0432\u0445\u0442\u044d\u0439 \u0446\u0430\u0433/\u043e\u0433\u043d\u043e\u043e \u0431\u0443\u0443\u043b\u0433\u0430\u0445",remove:"\u0423\u0441\u0442\u0433\u0430\u0445",title_cite_element:"\u042d\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b",title_abbr_element:"\u0422\u043e\u0432\u0447\u043b\u043e\u043b",title_acronym_element:"\u0422\u043e\u0432\u0447\u0438\u043b\u0441\u043e\u043d \u04af\u0433",title_del_element:"\u0423\u0441\u0442\u0441\u0430\u043d \u0431\u0438\u0447\u0432\u044d\u0440",title_ins_element:"\u0411\u0443\u0443\u043b\u0433\u0430\u0441\u0430\u043d \u0431\u0438\u0447\u0432\u044d\u0440",fieldset_events_tab:"\u04ae\u0437\u044d\u0433\u0434\u044d\u043b",fieldset_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442",fieldset_general_tab:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439 \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e",events_tab:"\u04ae\u0437\u044d\u0433\u0434\u044d\u043b",attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442",general_tab:"\u0415\u0440\u04e9\u043d\u0445\u0438\u0439",attribute_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442",attribute_events_tab:"\u04ae\u0437\u044d\u0433\u0434\u044d\u043b",attribute_label_accesskey:"\u0422\u043e\u0432\u0447\u0438\u043b\u0431\u043e\u0440",attribute_label_tabindex:"\u0422\u0430\u0431\u0443\u043b\u0430\u0442\u043e\u0440 \u0438\u043d\u0434\u0435\u043a\u0441",attribute_label_langcode:"\u0425\u044d\u043b",attribute_option_rtl:"\u0411\u0430\u0440\u0443\u0443\u043d\u0430\u0430\u0441 \u0437\u04af\u04af\u043d",attribute_option_ltr:"\u0417\u04af\u04af\u043d\u044d\u044d\u0441 \u0431\u0430\u0440\u0443\u0443\u043d",attribute_label_langdir:"\u0425\u044d\u043b\u043d\u0438\u0439 \u0447\u0438\u0433\u043b\u044d\u043b",attribute_label_datetime:"\u0426\u0430\u0433/\u041e\u0433\u043d\u043e\u043e",attribute_label_cite:"\u042d\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b",attribute_label_style:"\u0425\u044d\u043b\u0431\u044d\u0440\u0436\u04af\u04af\u043b\u044d\u043b\u0442",attribute_label_class:"\u0410\u043d\u0433\u0438",attribute_label_id:"\u0422\u0422",attribute_label_title:"\u0413\u0430\u0440\u0447\u0438\u0433"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ms_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ms_dlg.js new file mode 100755 index 000000000..168476740 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ms_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ms.xhtmlxtras_dlg',{attribs_title:"Masukkan/Sunting Ciri-ciri",option_rtl:"Kanan ke kiri",option_ltr:"Kiri ke kanan",insert_date:"Masukkan tarikh/masa sekarang",remove:"Alih",title_cite_element:"Kutipan Unsur",title_abbr_element:"Singkatan Unsur",title_acronym_element:"Akronim Unsur",title_del_element:"Pemadaman Unsur",title_ins_element:"Kemasukkan Unsur",fieldset_events_tab:"Unsur Peristiwa",fieldset_attrib_tab:"Unsur Ciri-ciri",fieldset_general_tab:"Susunan Am",events_tab:"Peristiwa",attrib_tab:"Ciri-ciri",general_tab:"Am",attribute_attrib_tab:"Ciri-ciri",attribute_events_tab:"Peristiwa",attribute_label_accesskey:"Kunci akses",attribute_label_tabindex:"Tanda indeks",attribute_label_langcode:"Bahasa",attribute_option_rtl:"Kanan ke kiri",attribute_option_ltr:"Kiri ke kanan",attribute_label_langdir:"Arah Teks",attribute_label_datetime:"Tarikh/Masa",attribute_label_cite:"Cuplik",attribute_label_style:"Gaya",attribute_label_class:"Kelas",attribute_label_id:"ID",attribute_label_title:"Tajuk"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/my_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/my_dlg.js new file mode 100755 index 000000000..1ec4102d0 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/my_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('my.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/nb_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/nb_dlg.js new file mode 100755 index 000000000..e5207ebc6 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/nb_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nb.xhtmlxtras_dlg',{"attribs_title":"Sett inn / endre attributter","option_rtl":"H\u00f8yre mot venstre","option_ltr":"Venstre mot h\u00f8yre","insert_date":"Sett inn dato/tid",remove:"Fjern","title_cite_element":"Sitatelement","title_abbr_element":"Forkortelseselement","title_acronym_element":"Akronymelement","title_del_element":"Sletteelement","title_ins_element":"Innsettingselement","fieldset_events_tab":"Elementhendelser","fieldset_attrib_tab":"Elementattributter","fieldset_general_tab":"Generelle innstillinger","events_tab":"Hendelser","attrib_tab":"Attributter","general_tab":"Generelt","attribute_attrib_tab":"Attributter","attribute_events_tab":"Hendelser","attribute_label_accesskey":"Tilgangsn\u00f8kkel","attribute_label_tabindex":"Tabuleringsindeks","attribute_label_langcode":"Spr\u00e5k","attribute_option_rtl":"H\u00f8yre til venstre","attribute_option_ltr":"Venstre til h\u00f8yre","attribute_label_langdir":"Tekstretning","attribute_label_datetime":"Dato/tid","attribute_label_cite":"Sted","attribute_label_style":"Stil","attribute_label_class":"Klasse","attribute_label_id":"ID","attribute_label_title":"Tittel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/nl_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/nl_dlg.js new file mode 100755 index 000000000..5708ddfe4 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.xhtmlxtras_dlg',{"attribs_title":"Attributen Invoegen/bewerken","option_rtl":"Van rechts naar links","option_ltr":"Van links naar rechts","insert_date":"Huidige datum/tijd invoegen",remove:"Verwijderen","title_cite_element":"Citaat","title_abbr_element":"Afkorting","title_acronym_element":"Synoniem","title_del_element":"Verwijderingselement","title_ins_element":"Invoegingselement","fieldset_events_tab":"Element Gebeurtenissen","fieldset_attrib_tab":"Elementattributen","fieldset_general_tab":"Algemene instellingen","events_tab":"Gebeurtenissen","attrib_tab":"Attributen","general_tab":"Algemeen","attribute_attrib_tab":"Attributen","attribute_events_tab":"Gebeurtenissen","attribute_label_accesskey":"Toegangstoets","attribute_label_tabindex":"Tabvolgorde","attribute_label_langcode":"Taal","attribute_option_rtl":"Van rechts naar links","attribute_option_ltr":"Van links naar rechts","attribute_label_langdir":"Tekstrichting","attribute_label_datetime":"Datum/Tijd","attribute_label_cite":"Citaat","attribute_label_style":"Stijl","attribute_label_class":"Klasse","attribute_label_id":"ID","attribute_label_title":"Titel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/nn_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/nn_dlg.js new file mode 100755 index 000000000..63a36c19d --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/nn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nn.xhtmlxtras_dlg',{attribs_title:"Set inn / endre attributt",option_rtl:"H\u00f8gre mot venstre",option_ltr:"Venstre mot h\u00f8gre",insert_date:"Set inn dato/ti",remove:"Fjern",title_cite_element:"Sitatelement",title_abbr_element:"Forkortingselement",title_acronym_element:"Akronymelement",title_del_element:"Sletteelement",title_ins_element:"Innsetjingselement",fieldset_events_tab:"Elementhendingar",fieldset_attrib_tab:"Elementattributtar",fieldset_general_tab:"Generelle innstillingar",events_tab:"Hendingar",attrib_tab:"Attributtar",general_tab:"Generelt",attribute_attrib_tab:"Attributt",attribute_events_tab:"Hendingar",attribute_label_accesskey:"Tilgangsn\u00f8kkel",attribute_label_tabindex:"Tabuleringsindeks",attribute_label_langcode:"Spr\u00e5k",attribute_option_rtl:"H\u00f8gre mot venstre",attribute_option_ltr:"Venstre mot h\u00f8gre",attribute_label_langdir:"Tekstretning",attribute_label_datetime:"Dato/tid",attribute_label_cite:"Stad",attribute_label_style:"Stil",attribute_label_class:"Klasse",attribute_label_id:"ID",attribute_label_title:"Tittel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/no_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/no_dlg.js new file mode 100755 index 000000000..7949e642a --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.xhtmlxtras_dlg',{"attribs_title":"Sett inn/editer attributt","option_rtl":"H\u00f8yre mot venstre","option_ltr":"Venstre mot h\u00f8yre","insert_date":"Sett inn dato/tid",remove:"Fjerne","title_cite_element":"Sitat element","title_abbr_element":"Forkorting element","title_acronym_element":"Akronym element","title_del_element":"Slette element","title_ins_element":"Innsetting element","fieldset_events_tab":"Element hendelser","fieldset_attrib_tab":"Element attributter","fieldset_general_tab":"Generelle innstillinger","events_tab":"Hendelser","attrib_tab":"Attributter","general_tab":"Generelt","attribute_attrib_tab":"Attributter","attribute_events_tab":"Hendelser","attribute_label_accesskey":"Tilgangsn\u00f8kkel","attribute_label_tabindex":"Tab indeks","attribute_label_langcode":"Spr\u00e5k","attribute_option_rtl":"H\u00f8yre mot venstre","attribute_option_ltr":"Venstre mot h\u00f8yre","attribute_label_langdir":"Tekstretning","attribute_label_datetime":"Dato/tid","attribute_label_cite":"Sted","attribute_label_style":"Stil","attribute_label_class":"Klasse","attribute_label_id":"ID","attribute_label_title":"Tittel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js new file mode 100755 index 000000000..d43439480 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.xhtmlxtras_dlg',{"attribs_title":"Wklej/edytuj atrybuty","option_rtl":"Kierunek z prawej do lewej","option_ltr":"Kierunek z lewej do prawej","insert_date":"Wklej aktualn\u0105 dat\u0119/czas",remove:"Usu\u0144","title_cite_element":"Cytat","title_abbr_element":"Skr\u00f3t","title_acronym_element":"Akronim","title_del_element":"Usuni\u0119cie","title_ins_element":"Wstawienie","fieldset_events_tab":"Zdarzenia","fieldset_attrib_tab":"Atrybuty","fieldset_general_tab":"G\u0142\u00f3wne ustawienia","events_tab":"Wydarzenia","attrib_tab":"Atrybuty","general_tab":"G\u0142wny","attribute_attrib_tab":"Atrybuty","attribute_events_tab":"Wydarzenia","attribute_label_accesskey":"Klawisz skr\u00f3tu","attribute_label_tabindex":"Numer tabulacji","attribute_label_langcode":"J\u0119zyk","attribute_option_rtl":"Kierunek z prawej do lewej","attribute_option_ltr":"Kierunek z lewej do prawej","attribute_label_langdir":"Kierunek czytania tekstu","attribute_label_datetime":"Data/Czas","attribute_label_cite":"Cytat","attribute_label_style":"Styl","attribute_label_class":"Klasa","attribute_label_id":"ID","attribute_label_title":"Tytu\u0142"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js new file mode 100755 index 000000000..b8e9d7ddb --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ps_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ps.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/pt_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/pt_dlg.js new file mode 100755 index 000000000..d0be262b7 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.xhtmlxtras_dlg',{attribs_title:"Inserir/editar atributos",option_rtl:"Da direita para a esquerda",option_ltr:"Da esquerda para a direita",insert_date:"Inserir data/hora",remove:"Remover",title_cite_element:"Cita\u00e7\u00e3o",title_abbr_element:"Abrevia\u00e7\u00e3o",title_acronym_element:"Acr\u00f4nimo",title_del_element:"Apagar",title_ins_element:"Inserir",fieldset_events_tab:"Eventos",fieldset_attrib_tab:"Atributos",fieldset_general_tab:"Configura\u00e7\u00f5es gerais",events_tab:"Eventos",attrib_tab:"Atributos",general_tab:"Geral",attribute_attrib_tab:"Atributos",attribute_events_tab:"Eventos",attribute_label_accesskey:"Tecla de Atalho",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Idioma",attribute_option_rtl:"Da direita para a esquerda",attribute_option_ltr:"Da esquerda para a direita",attribute_label_langdir:"Dire\u00e7\u00e3o do texto",attribute_label_datetime:"Data/Hora",attribute_label_cite:"Citar",attribute_label_style:"Estilo",attribute_label_class:"Classe",attribute_label_id:"ID",attribute_label_title:"T\u00edtulo"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ro_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ro_dlg.js new file mode 100755 index 000000000..a7ab476af --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.xhtmlxtras_dlg',{attribs_title:"Inserare atribute",option_rtl:"De la dreapta la st\u00e2nga",option_ltr:"De la st\u00e2nga la dreapta",insert_date:"Inserare dat\u0103/or\u0103 curent\u0103",remove:"Scoate",title_cite_element:"Citare",title_abbr_element:"Abreviere",title_acronym_element:"Acronim",title_del_element:"\u015etergere element",title_ins_element:"Inserare element",fieldset_events_tab:"Evenimente element",fieldset_attrib_tab:"Atribute element",fieldset_general_tab:"Set\u0103ri generale",events_tab:"Evenimente",attrib_tab:"Atribute",general_tab:"General",attribute_attrib_tab:"Atribute",attribute_events_tab:"Evenimente",attribute_label_accesskey:"Tast\u0103 de acces",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Limb\u0103",attribute_option_rtl:"De la dreapta la st\u00e2nga",attribute_option_ltr:"De la st\u00e2nga la dreapta",attribute_label_langdir:"Direc\u0163ie text",attribute_label_datetime:"Dat\u0103/or\u0103",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Clas\u0103",attribute_label_id:"ID",attribute_label_title:"Titlu"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js new file mode 100755 index 000000000..bd25335d6 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.xhtmlxtras_dlg',{"attribs_title":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","option_rtl":"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","option_ltr":"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e","insert_date":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0430\u0442\u0443/\u0432\u0440\u0435\u043c\u044f",remove:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c","title_cite_element":"\u0426\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","title_abbr_element":"\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435","title_acronym_element":"\u0410\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0446\u0438\u044f","title_del_element":"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435","title_ins_element":"\u0417\u0430\u043c\u0435\u043d\u0430","fieldset_events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","fieldset_attrib_tab":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","fieldset_general_tab":"\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b","events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f","attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b","general_tab":"\u041e\u0431\u0449\u0435\u0435","attribute_attrib_tab":"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b","attribute_events_tab":"\u0421\u043e\u0431\u044b\u0442\u0438\u044f","attribute_label_accesskey":"\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430","attribute_label_tabindex":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","attribute_label_langcode":"\u042f\u0437\u044b\u043a","attribute_option_rtl":"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","attribute_option_ltr":"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e","attribute_label_langdir":"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430","attribute_label_datetime":"\u0414\u0430\u0442\u0430/\u0412\u0440\u0435\u043c\u044f","attribute_label_cite":"\u0426\u0438\u0442\u0430\u0442\u0430","attribute_label_style":"\u0421\u0442\u0438\u043b\u044c","attribute_label_class":"\u041a\u043b\u0430\u0441\u0441","attribute_label_id":"\u0418\u043c\u044f","attribute_label_title":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/sc_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/sc_dlg.js new file mode 100755 index 000000000..1f4bb8929 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/sc_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sc.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027",option_rtl:"\u7531\u53f3\u5230\u5de6",option_ltr:"\u7531\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u73b0\u5728\u65e5\u671f/\u65f6\u95f4",remove:"\u5220\u9664",title_cite_element:"\u5f15\u6587\u5143\u7d20",title_abbr_element:"\u7f29\u5199\u5143\u7d20",title_acronym_element:"\u9996\u5b57\u7f29\u5199\u5143\u7d20",title_del_element:"\u5220\u9664\u5143\u7d20",title_ins_element:"\u63d2\u5165\u5143\u7d20",fieldset_events_tab:"\u5143\u7d20\u4e8b\u4ef6",fieldset_attrib_tab:"\u5143\u7d20\u5c5e\u6027",fieldset_general_tab:"\u4e00\u822c",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c5e\u6027",general_tab:"\u4e00\u822c",attribute_attrib_tab:"\u5c5e\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u6377\u952e",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8bed\u8a00",attribute_option_rtl:"\u7531\u53f3\u5230\u5de6",attribute_option_ltr:"\u7531\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u4e66\u5199\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u65f6\u95f4",attribute_label_cite:"\u5f15\u6587",attribute_label_style:"\u6837\u5f0f",attribute_label_class:"\u7c7b\u578b",attribute_label_id:"ID",attribute_label_title:"\u67e5\u627e"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/se_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/se_dlg.js new file mode 100755 index 000000000..daa17d5e6 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/se_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('se.xhtmlxtras_dlg',{attribs_title:"Redigera attribut",option_rtl:"H\u00f6ger till v\u00e4nster",option_ltr:"V\u00e4nster till h\u00f6ger",insert_date:"Infoga nuvarande datum och tid",remove:"Radera",title_cite_element:"Citat",title_abbr_element:"F\u00f6rkortning",title_acronym_element:"Akronym",title_del_element:"Markera som struket",title_ins_element:"Markera som tillagt",fieldset_events_tab:"H\u00e4ndelser",fieldset_attrib_tab:"Attribut",fieldset_general_tab:"Generella inst\u00e4llningar",events_tab:"H\u00e4ndelser",attrib_tab:"Attribut",general_tab:"Generellt",attribute_attrib_tab:"Attribut",attribute_events_tab:"H\u00e4ndelser",attribute_label_accesskey:"Snabbtangent",attribute_label_tabindex:"Tabbindex",attribute_label_langcode:"Spr\u00e5k",attribute_option_rtl:"H\u00f6ger till v\u00e4nster",attribute_option_ltr:"V\u00e4nster till h\u00f6ger",attribute_label_langdir:"Skriftriktning",attribute_label_datetime:"Datum/Tid",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Klass",attribute_label_id:"ID",attribute_label_title:"Titel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/si_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/si_dlg.js new file mode 100755 index 000000000..8f0c5f7bd --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/si_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('si.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js new file mode 100755 index 000000000..8207fed57 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/sk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sk.xhtmlxtras_dlg',{attribs_title:"Vlo\u017ei\u0165/upravi\u0165 atrib\u00faty",option_rtl:"Sprava do\u013eava",option_ltr:"Z\u013eava doprava",insert_date:"Vlo\u017ei\u0165 aktu\u00e1lny d\u00e1tum/\u010das",remove:"Odstr\u00e1ni\u0165",title_cite_element:"Cit\u00e1cia",title_abbr_element:"Skratka",title_acronym_element:"Akronym",title_del_element:"Odstr\u00e1nen\u00fd text",title_ins_element:"Pridan\u00fd text",fieldset_events_tab:"Atrib\u00faty udalost\u00ed",fieldset_attrib_tab:"Atrib\u00faty prvku",fieldset_general_tab:"Obecn\u00e9 parametre",events_tab:"Udalosti",attrib_tab:"Atrib\u00faty",general_tab:"Obecn\u00e9",attribute_attrib_tab:"Atrib\u00faty",attribute_events_tab:"Udalosti",attribute_label_accesskey:"Kl\u00e1vesov\u00e1 skratka",attribute_label_tabindex:"Poradie pre tabul\u00e1tor",attribute_label_langcode:"Jazyk",attribute_option_rtl:"Sprava do\u013eava",attribute_option_ltr:"Z\u013eava doprava",attribute_label_langdir:"Smer textu",attribute_label_datetime:"D\u00e1tum/\u010das",attribute_label_cite:"Cit\u00e1cia",attribute_label_style:"\u0160t\u00fdl",attribute_label_class:"Trieda",attribute_label_id:"ID",attribute_label_title:"Titulok"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/sl_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/sl_dlg.js new file mode 100755 index 000000000..ae141c54f --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/sl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sl.xhtmlxtras_dlg',{attribs_title:"Vstavi/uredi atribute",option_rtl:"Od desne proti levi",option_ltr:"Od leve proti desni",insert_date:"Vstavi trenutni datum/\u010das",remove:"Odstrani",title_cite_element:"Citat",title_abbr_element:"Okraj\u0161ava",title_acronym_element:"Kratica",title_del_element:"Izbrisano",title_ins_element:"Vstavljeno",fieldset_events_tab:"Dogodki elementa",fieldset_attrib_tab:"Atributi elementa",fieldset_general_tab:"Splo\u0161ne nastavitve",events_tab:"Dogodki",attrib_tab:"Atributi",general_tab:"Splo\u0161no",attribute_attrib_tab:"Atributi",attribute_events_tab:"Dogodki",attribute_label_accesskey:"Tipka dostopa",attribute_label_tabindex:"Zap. \u0161t.",attribute_label_langcode:"Jezik",attribute_option_rtl:"Od desne proti levi",attribute_option_ltr:"Od leve proti desni",attribute_label_langdir:"Smer pisave",attribute_label_datetime:"Datum/ura",attribute_label_cite:"Citat",attribute_label_style:"Slog",attribute_label_class:"Razred",attribute_label_id:"Id",attribute_label_title:"Naslov"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/sq_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/sq_dlg.js new file mode 100755 index 000000000..f76013181 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/sq_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sq.xhtmlxtras_dlg',{attribs_title:"Fut/Edito Tipare",option_rtl:"Djathtas-Majtas",option_ltr:"Majtas-Djathtas",insert_date:"Fut dat\u00ebn/or\u00ebn aktuale",remove:"Fshi",title_cite_element:"Element Citat",title_abbr_element:"Element Shkurtimi",title_acronym_element:"Element Akronim",title_del_element:"Element Fshir\u00ebs",title_ins_element:"Element Fut\u00ebs",fieldset_events_tab:"Ngjarjet e elementit",fieldset_attrib_tab:"Tiparet e elementit",fieldset_general_tab:"Opsionet e P\u00ebrgjithshme",events_tab:"Ngjarjet",attrib_tab:"Tiparet",general_tab:"T\u00eb P\u00ebrgjithshme",attribute_attrib_tab:"Tiparet",attribute_events_tab:"Ngjarjet",attribute_label_accesskey:"Butoni i aksesit",attribute_label_tabindex:"Indeksi i Tab",attribute_label_langcode:"Gjuha",attribute_option_rtl:"Djathtas-Majtas",attribute_option_ltr:"Majtas-Djathtas",attribute_label_langdir:"Drejtimi i tekstit",attribute_label_datetime:"Data/Ora",attribute_label_cite:"Citati",attribute_label_style:"Stili",attribute_label_class:"Klasa",attribute_label_id:"ID",attribute_label_title:"Titulli"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/sr_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/sr_dlg.js new file mode 100755 index 000000000..976a30bd3 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/sr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sr.xhtmlxtras_dlg',{attribs_title:"Ubaci/izmeni atribute",option_rtl:"S desna na levo",option_ltr:"S leva na desno",insert_date:"Ubaci trenutni datum/vreme",remove:"Ukloni",title_cite_element:"Element citata",title_abbr_element:"Element skra\u0107enice",title_acronym_element:"Element akronima",title_del_element:"Element za brisanje",title_ins_element:"Element za unos",fieldset_events_tab:"Doga\u0111aji elemenata",fieldset_attrib_tab:"Atributi elemenata",fieldset_general_tab:"Osnovna pode\u0161avanja",events_tab:"Doga\u0111aji",attrib_tab:"Atributi",general_tab:"Generalno",attribute_attrib_tab:"Atributi",attribute_events_tab:"Doga\u0111aji",attribute_label_accesskey:"Taster za pristup",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Jezik",attribute_option_rtl:"S desna na levo",attribute_option_ltr:"S leva na desno",attribute_label_langdir:"Smer teksta",attribute_label_datetime:"Datum/vreme",attribute_label_cite:"Citat",attribute_label_style:"Stil",attribute_label_class:"Klasa",attribute_label_id:"ID",attribute_label_title:"Naslov"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/sv_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/sv_dlg.js new file mode 100755 index 000000000..71847974c --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/sv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('sv.xhtmlxtras_dlg',{"attribs_title":"Redigera attribut","option_rtl":"H\u00f6ger till v\u00e4nster","option_ltr":"V\u00e4nster till h\u00f6ger","insert_date":"Infoga nuvarande datum och tid",remove:"Radera","title_cite_element":"Citat","title_abbr_element":"F\u00f6rkortning","title_acronym_element":"Akronym","title_del_element":"Markera som struket","title_ins_element":"Markera som tillagt","fieldset_events_tab":"H\u00e4ndelser","fieldset_attrib_tab":"Attribut","fieldset_general_tab":"Generella inst\u00e4llningar","events_tab":"H\u00e4ndelser","attrib_tab":"Attribut","general_tab":"Generellt","attribute_attrib_tab":"Attribut","attribute_events_tab":"H\u00e4ndelser","attribute_label_accesskey":"Snabbtangent","attribute_label_tabindex":"Tabbindex","attribute_label_langcode":"Spr\u00e5k","attribute_option_rtl":"H\u00f6ger till v\u00e4nster","attribute_option_ltr":"V\u00e4nster till h\u00f6ger","attribute_label_langdir":"Skriftriktning","attribute_label_datetime":"Datum/Tid","attribute_label_cite":"Citat","attribute_label_style":"Stil","attribute_label_class":"Klass","attribute_label_id":"ID","attribute_label_title":"Titel"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ta_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ta_dlg.js new file mode 100755 index 000000000..36584fd12 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ta_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ta.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/te_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/te_dlg.js new file mode 100755 index 000000000..fb1a21985 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/te_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('te.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js new file mode 100755 index 000000000..ea03eb95c --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/th_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('th.xhtmlxtras_dlg',{attribs_title:"\u0e40\u0e1e\u0e34\u0e48\u0e21/\u0e41\u0e01\u0e49\u0e44\u0e02 Attributes",option_rtl:"\u0e02\u0e27\u0e32\u0e44\u0e1b\u0e0b\u0e49\u0e32\u0e22",option_ltr:"\u0e0b\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e02\u0e27\u0e32",insert_date:"\u0e40\u0e1e\u0e34\u0e48\u0e21 \u0e27\u0e31\u0e19/\u0e40\u0e27\u0e25\u0e32",remove:"\u0e25\u0e1a",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Event",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",events_tab:"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",attrib_tab:"Attributes",general_tab:"\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b",attribute_attrib_tab:"Attributes",attribute_events_tab:"Event",attribute_label_accesskey:"\u0e1b\u0e38\u0e48\u0e21\u0e25\u0e31\u0e14",attribute_label_tabindex:"\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e41\u0e17\u0e47\u0e1a",attribute_label_langcode:"\u0e20\u0e32\u0e29\u0e32",attribute_option_rtl:"\u0e02\u0e27\u0e32\u0e44\u0e1b\u0e0b\u0e49\u0e32\u0e22",attribute_option_ltr:"\u0e0b\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e02\u0e27\u0e32",attribute_label_langdir:"\u0e17\u0e34\u0e28\u0e17\u0e32\u0e07\u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23",attribute_label_datetime:"\u0e27\u0e31\u0e19/\u0e40\u0e27\u0e25\u0e32",attribute_label_cite:"Cite",attribute_label_style:"\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a",attribute_label_class:"\u0e04\u0e25\u0e32\u0e2a",attribute_label_id:"ID",attribute_label_title:"\u0e0a\u0e37\u0e48\u0e2d"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/tn_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/tn_dlg.js new file mode 100755 index 000000000..3234ee26c --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/tn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tn.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js new file mode 100755 index 000000000..122431ba5 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/tr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tr.xhtmlxtras_dlg',{attribs_title:"Nitelik ekle/d\u00fczenle",option_rtl:"Soldan sa\u011fa",option_ltr:"Sa\u011fdan sola",insert_date:"\u015euan ki tarih/saati ekle",remove:"Sil",title_cite_element:"Nesne Al\u0131nt\u0131s\u0131",title_abbr_element:"Nesne K\u0131saltmas\u0131",title_acronym_element:"Nense K\u0131sa ad\u0131",title_del_element:"Nesne Silme",title_ins_element:"Nesne Ekleme",fieldset_events_tab:"Nesne Olaylar\u0131",fieldset_attrib_tab:"Nesne Nitelikleri",fieldset_general_tab:"Genel Ayarlar",events_tab:"Olaylar",attrib_tab:"Nitelikler",general_tab:"Genel",attribute_attrib_tab:"Nitelikler",attribute_events_tab:"Olaylar",attribute_label_accesskey:"Eri\u015fim Tu\u015fu",attribute_label_tabindex:"Sekme indeksi",attribute_label_langcode:"Dil",attribute_option_rtl:"Soldan sa\u011fa",attribute_option_ltr:"Sa\u011fdan sola",attribute_label_langdir:"Metnin y\u00f6n\u00fc",attribute_label_datetime:"Tarih/Saat",attribute_label_cite:"Al\u0131nt\u0131 yapmak",attribute_label_style:"Stil",attribute_label_class:"S\u0131n\u0131f",attribute_label_id:"ID",attribute_label_title:"Ba\u015fl\u0131k"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/tt_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/tt_dlg.js new file mode 100755 index 000000000..9d9d3fe0e --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/tt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tt.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7de8\u8f2f \u5c6c\u6027",option_rtl:"\u5f9e\u53f3\u5230\u5de6",option_ltr:"\u5f9e\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u7576\u524d\u65e5\u671f/\u6642\u9593",remove:"\u79fb\u9664",title_cite_element:"\u5f15\u7528\u7269\u4ef6",title_abbr_element:"\u7e2e\u5beb\u7269\u4ef6",title_acronym_element:"\u9996\u5b57\u6bcd\u7e2e\u5beb\u7269\u4ef6",title_del_element:"\u522a\u9664\u7269\u4ef6",title_ins_element:"\u63d2\u5165\u7269\u4ef6",fieldset_events_tab:"\u7269\u4ef6\u4e8b\u4ef6",fieldset_attrib_tab:"\u7269\u4ef6\u5c6c\u6027",fieldset_general_tab:"\u57fa\u672c",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c6c\u6027",general_tab:"\u57fa\u672c",attribute_attrib_tab:"\u5c6c\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u901f\u9375",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8a9e\u8a00",attribute_option_rtl:"\u5f9e\u53f3\u5230\u5de6",attribute_option_ltr:"\u5f9e\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u66f8\u5beb\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u6642\u9593",attribute_label_cite:"\u5f15\u7528",attribute_label_style:"\u6a23\u5f0f",attribute_label_class:"\u6a23\u5f0f\u985e",attribute_label_id:"ID",attribute_label_title:"\u641c\u5c0b"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/tw_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/tw_dlg.js new file mode 100755 index 000000000..eb58bd04b --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/tw_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('tw.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7de8\u8f2f\u5c6c\u6027",option_rtl:"\u5f9e\u53f3\u5230\u5de6",option_ltr:"\u5f9e\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u76ee\u524d\u65e5\u671f/\u6642\u9593",remove:"\u79fb\u9664",title_cite_element:"\u5f15\u7528\u5143\u7d20",title_abbr_element:"\u7e2e\u5beb\u5143\u7d20",title_acronym_element:"\u9996\u5b57\u6bcd\u7e2e\u5beb\u5143\u7d20",title_del_element:"\u522a\u9664\u5143\u7d20",title_ins_element:"\u63d2\u5165\u5143\u7d20",fieldset_events_tab:"\u5143\u7d20\u4e8b\u4ef6",fieldset_attrib_tab:"\u5143\u7d20\u5c6c\u6027",fieldset_general_tab:"\u4e00\u822c\u8a2d\u5b9a",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c6c\u6027",general_tab:"\u4e00\u822c",attribute_attrib_tab:"\u5c6c\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u6377\u9375",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8a9e\u8a00",attribute_option_rtl:"\u5f9e\u53f3\u5230\u5de6",attribute_option_ltr:"\u5f9e\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u66f8\u5beb\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u6642\u9593",attribute_label_cite:"\u5f15\u7528",attribute_label_style:"\u6a23\u5f0f",attribute_label_class:"\u985e\u5225",attribute_label_id:"ID",attribute_label_title:"\u6a19\u984c"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js new file mode 100755 index 000000000..05d7a24d5 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/uk_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('uk.xhtmlxtras_dlg',{attribs_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043c\u0456\u043d\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438",option_rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043b\u0456\u0432\u043e\u0440\u0443\u0447",option_ltr:"\u0417\u043b\u0456\u0432\u0430 \u043f\u0440\u0430\u0432\u043e\u0440\u0443\u0447",insert_date:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0456 \u0434\u0430\u0442\u0443/\u0447\u0430\u0441",remove:"\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438",title_cite_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0446\u0438\u0442\u0443\u0432\u0430\u043d\u043d\u044f",title_abbr_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0430\u0431\u0440\u0435\u0432\u0456\u0430\u0442\u0443\u0440\u0438",title_acronym_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0430\u043a\u0440\u043e\u043d\u0456\u043c\u0443",title_del_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u043d\u044f",title_ins_element:"\u0415\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0441\u0442\u0430\u0432\u043a\u0438",fieldset_events_tab:"\u041f\u043e\u0434\u0456\u0457 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0443",fieldset_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0443",fieldset_general_tab:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0456 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f",events_tab:"\u041f\u043e\u0434\u0456\u0457",attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438",general_tab:"\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0435",attribute_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438",attribute_events_tab:"\u041f\u043e\u0434\u0456\u0457",attribute_label_accesskey:"\u041a\u043b\u0430\u0432\u0456\u0448\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0443",attribute_label_tabindex:"\u0422\u0430\u0431\u0456\u043d\u0434\u0435\u043a\u0441",attribute_label_langcode:"\u041c\u043e\u0432\u0430",attribute_option_rtl:"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0456\u0432\u043e",attribute_option_ltr:"\u0417\u043b\u0456\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e",attribute_label_langdir:"\u041d\u0430\u043f\u0440\u044f\u043c \u0442\u0435\u043a\u0441\u0442\u0443",attribute_label_datetime:"\u0414\u0430\u0442\u0430/\u0427\u0430\u0441",attribute_label_cite:"\u0426\u0438\u0442\u0430\u0442\u0430",attribute_label_style:"\u0421\u0442\u0438\u043b\u044c",attribute_label_class:"\u041a\u043b\u0430\u0441",attribute_label_id:"\u0406\u0434\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u043e\u0440",attribute_label_title:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/ur_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/ur_dlg.js new file mode 100755 index 000000000..81b652721 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/ur_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ur.xhtmlxtras_dlg',{attribs_title:"Insert/Edit Attributes",option_rtl:"Right to left",option_ltr:"Left to right",insert_date:"Insert current date/time",remove:"Remove",title_cite_element:"Citation Element",title_abbr_element:"Abbreviation Element",title_acronym_element:"Acronym Element",title_del_element:"Deletion Element",title_ins_element:"Insertion Element",fieldset_events_tab:"Element Events",fieldset_attrib_tab:"Element Attributes",fieldset_general_tab:"General Settings",events_tab:"Events",attrib_tab:"Attributes",general_tab:"General",attribute_attrib_tab:"Attributes",attribute_events_tab:"Events",attribute_label_accesskey:"AccessKey",attribute_label_tabindex:"TabIndex",attribute_label_langcode:"Language",attribute_option_rtl:"Right to left",attribute_option_ltr:"Left to right",attribute_label_langdir:"Text Direction",attribute_label_datetime:"Date/Time",attribute_label_cite:"Cite",attribute_label_style:"Style",attribute_label_class:"Class",attribute_label_id:"ID",attribute_label_title:"Title"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/vi_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/vi_dlg.js new file mode 100755 index 000000000..955bced63 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/vi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('vi.xhtmlxtras_dlg',{attribs_title:"Ch\u00e8n/S\u1eeda thu\u1ed9c t\u00ednh",option_rtl:"Ph\u1ea3i qua tr\u00e1i",option_ltr:"Tr\u00e1i qua ph\u1ea3i",insert_date:"Ch\u00e8n ng\u00e0y/gi\u1edd hi\u1ec7n th\u1eddi",remove:"Lo\u1ea1i b\u1ecf",title_cite_element:"Bi\u00ea\u0309u ch\u01b0\u01a1ng ph\u1ea7n t\u1eed",title_abbr_element:"T\u00ean vi\u1ebft t\u1eaft ph\u1ea7n t\u1eed",title_acronym_element:"Vi\u1ebft t\u1eaft ph\u1ea7n t\u1eed",title_del_element:"X\u00f3a ph\u1ea7n t\u1eed",title_ins_element:"Ch\u00e8n ph\u1ea7n t\u1eed",fieldset_events_tab:"S\u1ef1 ki\u1ec7n ph\u1ea7n t\u1eed",fieldset_attrib_tab:"Thu\u1ed9c t\u00ednh ph\u1ea7n t\u1eed",fieldset_general_tab:"Thi\u1ebft l\u1eadp chung",events_tab:"S\u1ef1 ki\u1ec7n",attrib_tab:"Thu\u1ed9c t\u00ednh",general_tab:"Chung",attribute_attrib_tab:"Thu\u1ed9c t\u00ednh",attribute_events_tab:"S\u1ef1 ki\u1ec7n",attribute_label_accesskey:"Ph\u00edm truy c\u1eadp",attribute_label_tabindex:"Ch\u1ec9 m\u1ee5c th\u1ebb",attribute_label_langcode:"Ng\u00f4n ng\u1eef",attribute_option_rtl:"Ph\u1ea3i qua tr\u00e1i",attribute_option_ltr:"Tr\u00e1i qua ph\u1ea3i",attribute_label_langdir:"H\u01b0\u1edbng v\u0103n b\u1ea3n",attribute_label_datetime:"Ng\u00e0y/gi\u1edd",attribute_label_cite:"Ch\u00fa th\u00edch",attribute_label_style:"Ki\u1ec3u d\u00e1ng",attribute_label_class:"L\u1edbp",attribute_label_id:"ID",attribute_label_title:"Ti\u00eau \u0111\u1ec1"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js new file mode 100755 index 000000000..eccbdf676 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/zh-cn_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh-cn.xhtmlxtras_dlg',{"attribs_title":"\u63d2\u5165/\u7f16\u8f91 \u5c5e\u6027","option_rtl":"\u4ece\u53f3\u5230\u5de6","option_ltr":"\u4ece\u5de6\u5230\u53f3","insert_date":"\u63d2\u5165\u5f53\u524d\u65e5\u671f/\u65f6\u95f4",remove:"\u79fb\u9664","title_cite_element":"\u5f15\u7528\u5143\u7d20","title_abbr_element":"\u7f29\u5199\u5143\u7d20","title_acronym_element":"\u9996\u5b57\u6bcd\u7f29\u5199\u5143\u7d20","title_del_element":"\u5220\u9664\u5143\u7d20","title_ins_element":"\u63d2\u5165\u5143\u7d20","fieldset_events_tab":"\u5143\u7d20\u4e8b\u4ef6","fieldset_attrib_tab":"\u5143\u7d20\u5c5e\u6027","fieldset_general_tab":"\u666e\u901a\u8bbe\u7f6e","events_tab":"\u4e8b\u4ef6","attrib_tab":"\u5c5e\u6027","general_tab":"\u666e\u901a","attribute_attrib_tab":"\u5c5e\u6027","attribute_events_tab":"\u4e8b\u4ef6","attribute_label_accesskey":"\u5feb\u6377\u952e","attribute_label_tabindex":"Tab\u7d22\u5f15","attribute_label_langcode":"\u8bed\u8a00","attribute_option_rtl":"\u4ece\u53f3\u5230\u5de6","attribute_option_ltr":"\u4ece\u5de6\u5230\u53f3","attribute_label_langdir":"\u6587\u5b57\u4e66\u5199\u65b9\u5411","attribute_label_datetime":"\u65e5\u671f/\u65f6\u95f4","attribute_label_cite":"\u5f15\u7528","attribute_label_style":"\u6837\u5f0f","attribute_label_class":"\u7c7b\u522b","attribute_label_id":"ID","attribute_label_title":"\u6807\u9898"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/zh_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/zh_dlg.js new file mode 100755 index 000000000..7ae53e9d2 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/zh_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zh.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027",option_rtl:"\u4ece\u53f3\u5230\u5de6",option_ltr:"\u4ece\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u76ee\u524d\u65e5\u671f/\u65f6\u95f4",remove:"\u79fb\u9664",title_cite_element:"\u5f15\u7528\u5143\u7d20",title_abbr_element:"\u7f29\u5199\u5143\u7d20",title_acronym_element:"\u9996\u5b57\u6bcd\u7f29\u5199\u5143\u7d20",title_del_element:"\u5220\u9664\u5143\u7d20",title_ins_element:"\u63d2\u5165\u5143\u7d20",fieldset_events_tab:"\u5143\u7d20\u4e8b\u4ef6",fieldset_attrib_tab:"\u5143\u7d20\u5c5e\u6027",fieldset_general_tab:"\u4e00\u822c\u8bbe\u5b9a",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c5e\u6027",general_tab:"\u4e00\u822c",attribute_attrib_tab:"\u5c5e\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u6377\u952e",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8bed\u8a00",attribute_option_rtl:"\u4ece\u53f3\u5230\u5de6",attribute_option_ltr:"\u4ece\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u4e66\u5199\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u65f6\u95f4",attribute_label_cite:"\u5f15\u7528",attribute_label_style:"\u6837\u5f0f",attribute_label_class:"\u7c7b\u522b",attribute_label_id:"ID",attribute_label_title:"\u6807\u9898"}); \ No newline at end of file diff --git a/js/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js b/js/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js new file mode 100755 index 000000000..5b903bab3 --- /dev/null +++ b/js/tiny_mce/plugins/xhtmlxtras/langs/zu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('zu.xhtmlxtras_dlg',{attribs_title:"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027",option_rtl:"\u7531\u53f3\u5230\u5de6",option_ltr:"\u7531\u5de6\u5230\u53f3",insert_date:"\u63d2\u5165\u73b0\u5728\u65e5\u671f/\u65f6\u95f4",remove:"\u5220\u9664",title_cite_element:"\u5f15\u6587\u5143\u7d20",title_abbr_element:"\u7f29\u5199\u5143\u7d20",title_acronym_element:"\u9996\u5b57\u7f29\u5199\u5143\u7d20",title_del_element:"\u5220\u9664\u5143\u7d20",title_ins_element:"\u63d2\u5165\u5143\u7d20",fieldset_events_tab:"\u5143\u7d20\u4e8b\u4ef6",fieldset_attrib_tab:"\u5143\u7d20\u5c5e\u6027",fieldset_general_tab:"\u4e00\u822c",events_tab:"\u4e8b\u4ef6",attrib_tab:"\u5c5e\u6027",general_tab:"\u4e00\u822c",attribute_attrib_tab:"\u5c5e\u6027",attribute_events_tab:"\u4e8b\u4ef6",attribute_label_accesskey:"\u5feb\u901f\u952e",attribute_label_tabindex:"Tab\u7d22\u5f15",attribute_label_langcode:"\u8bed\u8a00",attribute_option_rtl:"\u7531\u53f3\u5230\u5de6",attribute_option_ltr:"\u7531\u5de6\u5230\u53f3",attribute_label_langdir:"\u6587\u5b57\u4e66\u5199\u65b9\u5411",attribute_label_datetime:"\u65e5\u671f/\u65f6\u95f4",attribute_label_cite:"\u5f15\u6587",attribute_label_style:"\u6837\u5f0f",attribute_label_class:"\u7c7b\u578b",attribute_label_id:"ID",attribute_label_title:"\u67e5\u627e"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/about.htm b/js/tiny_mce/themes/advanced/about.htm new file mode 100644 index 000000000..7a97cb715 --- /dev/null +++ b/js/tiny_mce/themes/advanced/about.htm @@ -0,0 +1,52 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.about_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="js/about.js"></script> +</head> +<body id="about" style="display: none"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current" aria-controls="general_panel"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.about_general}</a></span></li> + <li id="help_tab" style="display:none" aria-hidden="true" aria-controls="help_panel"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{#advanced_dlg.about_help}</a></span></li> + <li id="plugins_tab" aria-controls="plugins_panel"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{#advanced_dlg.about_plugins}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <h3>{#advanced_dlg.about_title}</h3> + <p>Version: <span id="version"></span> (<span id="date"></span>)</p> + <p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a> + by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p> + <p>Copyright &copy; 2003-2008, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p> + <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p> + + <div id="buttoncontainer"> + <a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> + </div> + </div> + + <div id="plugins_panel" class="panel"> + <div id="pluginscontainer"> + <h3>{#advanced_dlg.about_loaded}</h3> + + <div id="plugintablecontainer"> + </div> + + <p>&nbsp;</p> + </div> + </div> + + <div id="help_panel" class="panel noscroll" style="overflow: visible;"> + <div id="iframecontainer"></div> + </div> + </div> + + <div class="mceActionPanel"> + <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" /> + </div> +</body> +</html> diff --git a/js/tiny_mce/themes/advanced/anchor.htm b/js/tiny_mce/themes/advanced/anchor.htm new file mode 100644 index 000000000..75c93b799 --- /dev/null +++ b/js/tiny_mce/themes/advanced/anchor.htm @@ -0,0 +1,26 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.anchor_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="js/anchor.js"></script> +</head> +<body style="display: none" role="application" aria-labelledby="app_title"> +<form onsubmit="AnchorDialog.update();return false;" action="#"> + <table border="0" cellpadding="4" cellspacing="0" role="presentation"> + <tr> + <td colspan="2" class="title" id="app_title">{#advanced_dlg.anchor_title}</td> + </tr> + <tr> + <td class="nowrap"><label for="anchorName">{#advanced_dlg.anchor_name}:</label></td> + <td><input name="anchorName" type="text" class="mceFocus" id="anchorName" value="" style="width: 200px" aria-required="true" /></td> + </tr> + </table> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#update}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/themes/advanced/charmap.htm b/js/tiny_mce/themes/advanced/charmap.htm new file mode 100644 index 000000000..2c3b3f27b --- /dev/null +++ b/js/tiny_mce/themes/advanced/charmap.htm @@ -0,0 +1,51 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.charmap_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="js/charmap.js"></script> +</head> +<body id="charmap" style="display:none"> +<table align="center" border="0" cellspacing="0" cellpadding="2" role="presentation"> + <tr> + <td colspan="2" class="title" ><label for="charmapView" id="charmap_label">{#advanced_dlg.charmap_title}</label></td> + </tr> + <tr> + <td id="charmapView" rowspan="2" align="left" valign="top"> + <!-- Chars will be rendered here --> + </td> + <td width="100" align="center" valign="top"> + <table border="0" cellpadding="0" cellspacing="0" width="100" style="height:100px" role="presentation"> + <tr> + <td id="codeV">&nbsp;</td> + </tr> + <tr> + <td id="codeN">&nbsp;</td> + </tr> + </table> + </td> + </tr> + <tr> + <td valign="bottom" style="padding-bottom: 3px;"> + <table width="100" align="center" border="0" cellpadding="2" cellspacing="0" role="presentation"> + <tr> + <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;"><label for="codeA">HTML-Code</label></td> + </tr> + <tr> + <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td> + </tr> + <tr> + <td style="font-size: 1px;">&nbsp;</td> + </tr> + <tr> + <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;"><label for="codeB">NUM-Code</label></td> + </tr> + <tr> + <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td> + </tr> + </table> + </td> + </tr> +</table> +</body> +</html> diff --git a/js/tiny_mce/themes/advanced/color_picker.htm b/js/tiny_mce/themes/advanced/color_picker.htm new file mode 100644 index 000000000..ad1bb0f6c --- /dev/null +++ b/js/tiny_mce/themes/advanced/color_picker.htm @@ -0,0 +1,74 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.colorpicker_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="js/color_picker.js"></script> +</head> +<body id="colorpicker" style="display: none" role="application" aria-labelledby="app_label"> + <span class="mceVoiceLabel" id="app_label" style="display:none;">{#advanced_dlg.colorpicker_title}</span> +<form onsubmit="insertAction();return false" action="#"> + <div class="tabs"> + <ul> + <li id="picker_tab" aria-controls="picker_panel" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_picker_tab}</a></span></li> + <li id="rgb_tab" aria-controls="rgb_panel"><span><a href="javascript:;" onclick="mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li> + <li id="named_tab" aria-controls="named_panel"><span><a href="javascript:;" onclick="javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_named_tab}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="picker_panel" class="panel current"> + <fieldset> + <legend>{#advanced_dlg.colorpicker_picker_title}</legend> + <div id="picker"> + <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" alt="" /> + + <div id="light"> + <!-- Will be filled with divs --> + </div> + + <br style="clear: both" /> + </div> + </fieldset> + </div> + + <div id="rgb_panel" class="panel"> + <fieldset> + <legend id="webcolors_title">{#advanced_dlg.colorpicker_palette_title}</legend> + <div id="webcolors"> + <!-- Gets filled with web safe colors--> + </div> + + <br style="clear: both" /> + </fieldset> + </div> + + <div id="named_panel" class="panel"> + <fieldset id="named_picker_label"> + <legend id="named_title">{#advanced_dlg.colorpicker_named_title}</legend> + <div id="namedcolors" role="listbox" tabindex="0" aria-labelledby="named_picker_label"> + <!-- Gets filled with named colors--> + </div> + + <br style="clear: both" /> + + <div id="colornamecontainer"> + {#advanced_dlg.colorpicker_name} <span id="colorname"></span> + </div> + </fieldset> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#apply}" /> + + <div id="preview"></div> + + <div id="previewblock"> + <label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" class="text mceFocus" aria-required="true" /> + </div> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/themes/advanced/editor_template.js b/js/tiny_mce/themes/advanced/editor_template.js new file mode 100644 index 000000000..4b5b754e3 --- /dev/null +++ b/js/tiny_mce/themes/advanced/editor_template.js @@ -0,0 +1 @@ +(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);j.forcedHighContrastMode=j.settings.detect_highcontrast&&l._isHighContrast();j.settings.skin=j.forcedHighContrastMode?"highcontrast":j.settings.skin;l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i<n.clientWidth){i=n.clientWidth;d.setStyle(o,"width",n.clientWidth)}}if(k&&l.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+j.id+"_size",{cw:i,ch:m})}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(n.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(x,k){var A=this,p,m,r=A.editor,B=A.settings,z,j=r.controlManager,u,l,q=[],y,w;w=j.createToolbarGroup("toolbargroup",{name:r.getLang("advanced.toolbar"),tab_focus_toolbar:r.getParam("theme_advanced_tab_focus_toolbar")});A.toolbarGroup=w;y=B.theme_advanced_toolbar_align.toLowerCase();y="mce"+A._ufirst(y);l=d.add(d.add(x,"tr",{role:"presentation"}),"td",{"class":"mceToolbar "+y,role:"presentation"});for(p=1;(z=B["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(B["theme_advanced_buttons"+p+"_add"]){z+=","+B["theme_advanced_buttons"+p+"_add"]}if(B["theme_advanced_buttons"+p+"_add_before"]){z=B["theme_advanced_buttons"+p+"_add_before"]+","+z}A._addControls(z,m);w.add(m);k.deltaHeight-=B.theme_advanced_row_height}q.push(w.renderHTML());q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{},"&#160;")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager;i.setDisabled("undo",!j.undoManager.hasUndo()&&!j.typing);i.setDisabled("redo",!j.undoManager.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}r.setActive("visualaid",m.hasVisual);y._updateUndoStatus(m);r.setDisabled("outdent",!m.queryCommandState("Outdent"));C=o("A");if(G=r.get("link")){if(!C||!C.name){G.setDisabled(!C&&q);G.setActive(!!C)}}if(G=r.get("unlink")){G.setDisabled(!C&&q);G.setActive(!!C&&!C.name)}if(G=r.get("anchor")){G.setActive(!q&&!!C&&C.name)}C=o("IMG");if(G=r.get("image")){G.setActive(!q&&!!C&&D.className.indexOf("mceItem")==-1)}if(G=r.get("styleselect")){y._importClasses();j=[];f(G.items,function(n){j.push(n.value)});i=m.formatter.matchAll(j);G.select(i[0])}if(G=r.get("formatselect")){C=o(d.isBlock);if(C){G.select(C.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!w&&p.className){w=p.className}}if(m.dom.is(p,z.theme_advanced_font_selector)){if(!k&&p.style.fontSize){k=p.style.fontSize}if(!u&&p.style.fontFamily){u=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!B&&p.style.color){B=p.style.color}if(!l&&p.style.backgroundColor){l=p.style.backgroundColor}}return false});if(G=r.get("fontselect")){G.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==u})}if(G=r.get("fontsizeselect")){if(z.theme_advanced_runtime_fontsize&&!k&&!w){k=m.dom.getStyle(D,"fontSize",true)}G.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===w){return true}})}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_show_current_color){function A(p,n){if(G=r.get(p)){if(!n){n=G.settings.default_color}if(n!==G.value){G.displayColor(n)}}}A("forecolor",B);A("backcolor",l)}if(z.theme_advanced_path&&z.theme_advanced_statusbar_location){C=d.get(m.id+"_path")||d.add(m.id+"_path_row","span",{id:m.id+"_path"});if(y.statusKeyboardNavigation){y.statusKeyboardNavigation.destroy();y.statusKeyboardNavigation=null}d.setHTML(C,"");o(function(H){var p=H.nodeName.toLowerCase(),s,v,t="";if(H.getAttribute("data-mce-bogus")){return}if(H.nodeType!=1||H.nodeName==="BR"||(d.hasClass(H,"mceItemHidden")||d.hasClass(H,"mceItemRemoved"))){return}if(e.isIE&&H.scopeName!=="HTML"){p=H.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(x=d.getAttrib(H,"src")){t+="src: "+x+" "}break;case"a":if(x=d.getAttrib(H,"name")){t+="name: "+x+" ";p+="#"+x}if(x=d.getAttrib(H,"href")){t+="href: "+x+" "}break;case"font":if(x=d.getAttrib(H,"face")){t+="font: "+x+" "}if(x=d.getAttrib(H,"size")){t+="size: "+x+" "}if(x=d.getAttrib(H,"color")){t+="color: "+x+" "}break;case"span":if(x=d.getAttrib(H,"style")){t+="style: "+x+" "}break}if(x=d.getAttrib(H,"id")){t+="id: "+x+" "}if(x=H.className){x=x.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(x){t+="class: "+x+" ";if(d.isBlock(H)||p=="img"||p=="span"){p+="."+x}}}p=p.replace(/(html:)/g,"");p={name:p,node:H,title:t};y.onResolveName.dispatch(y,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(F++)},p);if(C.hasChildNodes()){C.insertBefore(d.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),C.firstChild);C.insertBefore(v,C.firstChild)}else{C.appendChild(v)}},m.getBody());if(d.select("a",C).length>0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce)); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/editor_template_src.js b/js/tiny_mce/themes/advanced/editor_template_src.js new file mode 100644 index 000000000..3ecc139f4 --- /dev/null +++ b/js/tiny_mce/themes/advanced/editor_template_src.js @@ -0,0 +1,1360 @@ +/** + * editor_template_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode; + + // Tell it to load theme specific language pack(s) + tinymce.ThemeManager.requireLangPack('advanced'); + + tinymce.create('tinymce.themes.AdvancedTheme', { + sizes : [8, 10, 12, 14, 18, 24, 36], + + // Control name lookup, format: title, command + controls : { + bold : ['bold_desc', 'Bold'], + italic : ['italic_desc', 'Italic'], + underline : ['underline_desc', 'Underline'], + strikethrough : ['striketrough_desc', 'Strikethrough'], + justifyleft : ['justifyleft_desc', 'JustifyLeft'], + justifycenter : ['justifycenter_desc', 'JustifyCenter'], + justifyright : ['justifyright_desc', 'JustifyRight'], + justifyfull : ['justifyfull_desc', 'JustifyFull'], + bullist : ['bullist_desc', 'InsertUnorderedList'], + numlist : ['numlist_desc', 'InsertOrderedList'], + outdent : ['outdent_desc', 'Outdent'], + indent : ['indent_desc', 'Indent'], + cut : ['cut_desc', 'Cut'], + copy : ['copy_desc', 'Copy'], + paste : ['paste_desc', 'Paste'], + undo : ['undo_desc', 'Undo'], + redo : ['redo_desc', 'Redo'], + link : ['link_desc', 'mceLink'], + unlink : ['unlink_desc', 'unlink'], + image : ['image_desc', 'mceImage'], + cleanup : ['cleanup_desc', 'mceCleanup'], + help : ['help_desc', 'mceHelp'], + code : ['code_desc', 'mceCodeEditor'], + hr : ['hr_desc', 'InsertHorizontalRule'], + removeformat : ['removeformat_desc', 'RemoveFormat'], + sub : ['sub_desc', 'subscript'], + sup : ['sup_desc', 'superscript'], + forecolor : ['forecolor_desc', 'ForeColor'], + forecolorpicker : ['forecolor_desc', 'mceForeColor'], + backcolor : ['backcolor_desc', 'HiliteColor'], + backcolorpicker : ['backcolor_desc', 'mceBackColor'], + charmap : ['charmap_desc', 'mceCharMap'], + visualaid : ['visualaid_desc', 'mceToggleVisualAid'], + anchor : ['anchor_desc', 'mceInsertAnchor'], + newdocument : ['newdocument_desc', 'mceNewDocument'], + blockquote : ['blockquote_desc', 'mceBlockQuote'] + }, + + stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], + + init : function(ed, url) { + var t = this, s, v, o; + + t.editor = ed; + t.url = url; + t.onResolveName = new tinymce.util.Dispatcher(this); + + ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast(); + ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin; + + // Default settings + t.settings = s = extend({ + theme_advanced_path : true, + theme_advanced_toolbar_location : 'bottom', + theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", + theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", + theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap", + theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", + theme_advanced_toolbar_align : "center", + theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", + theme_advanced_more_colors : 1, + theme_advanced_row_height : 23, + theme_advanced_resize_horizontal : 1, + theme_advanced_resizing_use_cookie : 1, + theme_advanced_font_sizes : "1,2,3,4,5,6,7", + theme_advanced_font_selector : "span", + theme_advanced_show_current_color: 0, + readonly : ed.settings.readonly + }, ed.settings); + + // Setup default font_size_style_values + if (!s.font_size_style_values) + s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt"; + + if (tinymce.is(s.theme_advanced_font_sizes, 'string')) { + s.font_size_style_values = tinymce.explode(s.font_size_style_values); + s.font_size_classes = tinymce.explode(s.font_size_classes || ''); + + // Parse string value + o = {}; + ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes; + each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) { + var cl; + + if (k == v && v >= 1 && v <= 7) { + k = v + ' (' + t.sizes[v - 1] + 'pt)'; + cl = s.font_size_classes[v - 1]; + v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); + } + + if (/^\s*\./.test(v)) + cl = v.replace(/\./g, ''); + + o[k] = cl ? {'class' : cl} : {fontSize : v}; + }); + + s.theme_advanced_font_sizes = o; + } + + if ((v = s.theme_advanced_path_location) && v != 'none') + s.theme_advanced_statusbar_location = s.theme_advanced_path_location; + + if (s.theme_advanced_statusbar_location == 'none') + s.theme_advanced_statusbar_location = 0; + + if (ed.settings.content_css !== false) + ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); + + // Init editor + ed.onInit.add(function() { + if (!ed.settings.readonly) { + ed.onNodeChange.add(t._nodeChanged, t); + ed.onKeyUp.add(t._updateUndoStatus, t); + ed.onMouseUp.add(t._updateUndoStatus, t); + ed.dom.bind(ed.dom.getRoot(), 'dragend', function() { + t._updateUndoStatus(ed); + }); + } + }); + + ed.onSetProgressState.add(function(ed, b, ti) { + var co, id = ed.id, tb; + + if (b) { + t.progressTimer = setTimeout(function() { + co = ed.getContainer(); + co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); + tb = DOM.get(ed.id + '_tbl'); + + DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); + DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); + }, ti || 0); + } else { + DOM.remove(id + '_blocker'); + DOM.remove(id + '_progress'); + clearTimeout(t.progressTimer); + } + }); + + DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); + + if (s.skin_variant) + DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); + }, + + _isHighContrast : function() { + var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'}); + + actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, ''); + DOM.remove(div); + + return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56'; + }, + + createControl : function(n, cf) { + var cd, c; + + if (c = cf.createControl(n)) + return c; + + switch (n) { + case "styleselect": + return this._createStyleSelect(); + + case "formatselect": + return this._createBlockFormats(); + + case "fontselect": + return this._createFontSelect(); + + case "fontsizeselect": + return this._createFontSizeSelect(); + + case "forecolor": + return this._createForeColorMenu(); + + case "backcolor": + return this._createBackColorMenu(); + } + + if ((cd = this.controls[n])) + return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); + }, + + execCommand : function(cmd, ui, val) { + var f = this['_' + cmd]; + + if (f) { + f.call(this, ui, val); + return true; + } + + return false; + }, + + _importClasses : function(e) { + var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); + + if (ctrl.getLength() == 0) { + each(ed.dom.getClasses(), function(o, idx) { + var name = 'style_' + idx; + + ed.formatter.register(name, { + inline : 'span', + attributes : {'class' : o['class']}, + selector : '*' + }); + + ctrl.add(o['class'], name); + }); + } + }, + + _createStyleSelect : function(n) { + var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; + + // Setup style select box + ctrl = ctrlMan.createListBox('styleselect', { + title : 'advanced.style_select', + onselect : function(name) { + var matches, formatNames = []; + + each(ctrl.items, function(item) { + formatNames.push(item.value); + }); + + ed.focus(); + ed.undoManager.add(); + + // Toggle off the current format + matches = ed.formatter.matchAll(formatNames); + if (!name || matches[0] == name) { + if (matches[0]) + ed.formatter.remove(matches[0]); + } else + ed.formatter.apply(name); + + ed.undoManager.add(); + ed.nodeChanged(); + + return false; // No auto select + } + }); + + // Handle specified format + ed.onInit.add(function() { + var counter = 0, formats = ed.getParam('style_formats'); + + if (formats) { + each(formats, function(fmt) { + var name, keys = 0; + + each(fmt, function() {keys++;}); + + if (keys > 1) { + name = fmt.name = fmt.name || 'style_' + (counter++); + ed.formatter.register(name, fmt); + ctrl.add(fmt.title, name); + } else + ctrl.add(fmt.title); + }); + } else { + each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { + var name; + + if (val) { + name = 'style_' + (counter++); + + ed.formatter.register(name, { + inline : 'span', + classes : val, + selector : '*' + }); + + ctrl.add(t.editor.translate(key), name); + } + }); + } + }); + + // Auto import classes if the ctrl box is empty + if (ctrl.getLength() == 0) { + ctrl.onPostRender.add(function(ed, n) { + if (!ctrl.NativeListBox) { + Event.add(n.id + '_text', 'focus', t._importClasses, t); + Event.add(n.id + '_text', 'mousedown', t._importClasses, t); + Event.add(n.id + '_open', 'focus', t._importClasses, t); + Event.add(n.id + '_open', 'mousedown', t._importClasses, t); + } else + Event.add(n.id, 'focus', t._importClasses, t); + }); + } + + return ctrl; + }, + + _createFontSelect : function() { + var c, t = this, ed = t.editor; + + c = ed.controlManager.createListBox('fontselect', { + title : 'advanced.fontdefault', + onselect : function(v) { + var cur = c.items[c.selectedIndex]; + + if (!v && cur) { + ed.execCommand('FontName', false, cur.value); + return; + } + + ed.execCommand('FontName', false, v); + + // Fake selection, execCommand will fire a nodeChange and update the selection + c.select(function(sv) { + return v == sv; + }); + + if (cur && cur.value == v) { + c.select(null); + } + + return false; // No auto select + } + }); + + if (c) { + each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { + c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); + }); + } + + return c; + }, + + _createFontSizeSelect : function() { + var t = this, ed = t.editor, c, i = 0, cl = []; + + c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { + var cur = c.items[c.selectedIndex]; + + if (!v && cur) { + cur = cur.value; + + if (cur['class']) { + ed.formatter.toggle('fontsize_class', {value : cur['class']}); + ed.undoManager.add(); + ed.nodeChanged(); + } else { + ed.execCommand('FontSize', false, cur.fontSize); + } + + return; + } + + if (v['class']) { + ed.focus(); + ed.undoManager.add(); + ed.formatter.toggle('fontsize_class', {value : v['class']}); + ed.undoManager.add(); + ed.nodeChanged(); + } else + ed.execCommand('FontSize', false, v.fontSize); + + // Fake selection, execCommand will fire a nodeChange and update the selection + c.select(function(sv) { + return v == sv; + }); + + if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] == v['class'])) { + c.select(null); + } + + return false; // No auto select + }}); + + if (c) { + each(t.settings.theme_advanced_font_sizes, function(v, k) { + var fz = v.fontSize; + + if (fz >= 1 && fz <= 7) + fz = t.sizes[parseInt(fz) - 1] + 'pt'; + + c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); + }); + } + + return c; + }, + + _createBlockFormats : function() { + var c, fmts = { + p : 'advanced.paragraph', + address : 'advanced.address', + pre : 'advanced.pre', + h1 : 'advanced.h1', + h2 : 'advanced.h2', + h3 : 'advanced.h3', + h4 : 'advanced.h4', + h5 : 'advanced.h5', + h6 : 'advanced.h6', + div : 'advanced.div', + blockquote : 'advanced.blockquote', + code : 'advanced.code', + dt : 'advanced.dt', + dd : 'advanced.dd', + samp : 'advanced.samp' + }, t = this; + + c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) { + t.editor.execCommand('FormatBlock', false, v); + return false; + }}); + + if (c) { + each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { + c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v}); + }); + } + + return c; + }, + + _createForeColorMenu : function() { + var c, t = this, s = t.settings, o = {}, v; + + if (s.theme_advanced_more_colors) { + o.more_colors_func = function() { + t._mceColorPicker(0, { + color : c.value, + func : function(co) { + c.setColor(co); + } + }); + }; + } + + if (v = s.theme_advanced_text_colors) + o.colors = v; + + if (s.theme_advanced_default_foreground_color) + o.default_color = s.theme_advanced_default_foreground_color; + + o.title = 'advanced.forecolor_desc'; + o.cmd = 'ForeColor'; + o.scope = this; + + c = t.editor.controlManager.createColorSplitButton('forecolor', o); + + return c; + }, + + _createBackColorMenu : function() { + var c, t = this, s = t.settings, o = {}, v; + + if (s.theme_advanced_more_colors) { + o.more_colors_func = function() { + t._mceColorPicker(0, { + color : c.value, + func : function(co) { + c.setColor(co); + } + }); + }; + } + + if (v = s.theme_advanced_background_colors) + o.colors = v; + + if (s.theme_advanced_default_background_color) + o.default_color = s.theme_advanced_default_background_color; + + o.title = 'advanced.backcolor_desc'; + o.cmd = 'HiliteColor'; + o.scope = this; + + c = t.editor.controlManager.createColorSplitButton('backcolor', o); + + return c; + }, + + renderUI : function(o) { + var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; + + if (ed.settings) { + ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut'); + } + + // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for. + // Maybe actually inherit it from the original textara? + n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); + DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label); + + if (!DOM.boxModel) + n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); + + n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); + n = tb = DOM.add(n, 'tbody'); + + switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { + case "rowlayout": + ic = t._rowLayout(s, tb, o); + break; + + case "customlayout": + ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); + break; + + default: + ic = t._simpleLayout(s, tb, o, p); + } + + n = o.targetNode; + + // Add classes to first and last TRs + nl = sc.rows; + DOM.addClass(nl[0], 'mceFirst'); + DOM.addClass(nl[nl.length - 1], 'mceLast'); + + // Add classes to first and last TDs + each(DOM.select('tr', tb), function(n) { + DOM.addClass(n.firstChild, 'mceFirst'); + DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); + }); + + if (DOM.get(s.theme_advanced_toolbar_container)) + DOM.get(s.theme_advanced_toolbar_container).appendChild(p); + else + DOM.insertAfter(p, n); + + Event.add(ed.id + '_path_row', 'click', function(e) { + e = e.target; + + if (e.nodeName == 'A') { + t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); + + return Event.cancel(e); + } + }); +/* + if (DOM.get(ed.id + '_path_row')) { + Event.add(ed.id + '_tbl', 'mouseover', function(e) { + var re; + + e = e.target; + + if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { + re = DOM.get(ed.id + '_path_row'); + t.lastPath = re.innerHTML; + DOM.setHTML(re, e.parentNode.title); + } + }); + + Event.add(ed.id + '_tbl', 'mouseout', function(e) { + if (t.lastPath) { + DOM.setHTML(ed.id + '_path_row', t.lastPath); + t.lastPath = 0; + } + }); + } +*/ + + if (!ed.getParam('accessibility_focus')) + Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'), 'focus', function() {tinyMCE.get(ed.id).focus();}); + + if (s.theme_advanced_toolbar_location == 'external') + o.deltaHeight = 0; + + t.deltaHeight = o.deltaHeight; + o.targetNode = null; + + ed.onKeyDown.add(function(ed, evt) { + var DOM_VK_F10 = 121, DOM_VK_F11 = 122; + + if (evt.altKey) { + if (evt.keyCode === DOM_VK_F10) { + t.toolbarGroup.focus(); + return Event.cancel(evt); + } else if (evt.keyCode === DOM_VK_F11) { + DOM.get(ed.id + '_path_row').focus(); + return Event.cancel(evt); + } + } + }); + + // alt+0 is the UK recommended shortcut for accessing the list of access controls. + ed.addShortcut('alt+0', '', 'mceShortcuts', t); + + return { + iframeContainer : ic, + editorContainer : ed.id + '_parent', + sizeContainer : sc, + deltaHeight : o.deltaHeight + }; + }, + + getInfo : function() { + return { + longname : 'Advanced theme', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + version : tinymce.majorVersion + "." + tinymce.minorVersion + } + }, + + resizeBy : function(dw, dh) { + var e = DOM.get(this.editor.id + '_ifr'); + + this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); + }, + + resizeTo : function(w, h, store) { + var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); + + // Boundery fix box + w = Math.max(s.theme_advanced_resizing_min_width || 100, w); + h = Math.max(s.theme_advanced_resizing_min_height || 100, h); + w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); + h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); + + // Resize iframe and container + DOM.setStyle(e, 'height', ''); + DOM.setStyle(ifr, 'height', h); + + if (s.theme_advanced_resize_horizontal) { + DOM.setStyle(e, 'width', ''); + DOM.setStyle(ifr, 'width', w); + + // Make sure that the size is never smaller than the over all ui + if (w < e.clientWidth) { + w = e.clientWidth; + DOM.setStyle(ifr, 'width', e.clientWidth); + } + } + + // Store away the size + if (store && s.theme_advanced_resizing_use_cookie) { + Cookie.setHash("TinyMCE_" + ed.id + "_size", { + cw : w, + ch : h + }); + } + }, + + destroy : function() { + var id = this.editor.id; + + Event.clear(id + '_resize'); + Event.clear(id + '_path_row'); + Event.clear(id + '_external_close'); + }, + + // Internal functions + + _simpleLayout : function(s, tb, o, p) { + var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; + + if (s.readonly) { + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + return ic; + } + + // Create toolbar container at top + if (lo == 'top') + t._addToolbars(tb, o); + + // Create external toolbar + if (lo == 'external') { + n = c = DOM.create('div', {style : 'position:relative'}); + n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); + DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); + n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); + etb = DOM.add(n, 'tbody'); + + if (p.firstChild.className == 'mceOldBoxModel') + p.firstChild.appendChild(c); + else + p.insertBefore(c, p.firstChild); + + t._addToolbars(etb, o); + + ed.onMouseUp.add(function() { + var e = DOM.get(ed.id + '_external'); + DOM.show(e); + + DOM.hide(lastExtID); + + var f = Event.add(ed.id + '_external_close', 'click', function() { + DOM.hide(ed.id + '_external'); + Event.remove(ed.id + '_external_close', 'click', f); + }); + + DOM.show(e); + DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); + + // Fixes IE rendering bug + DOM.hide(e); + DOM.show(e); + e.style.filter = ''; + + lastExtID = ed.id + '_external'; + + e = null; + }); + } + + if (sl == 'top') + t._addStatusBar(tb, o); + + // Create iframe container + if (!s.theme_advanced_toolbar_container) { + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + } + + // Create toolbar container at bottom + if (lo == 'bottom') + t._addToolbars(tb, o); + + if (sl == 'bottom') + t._addStatusBar(tb, o); + + return ic; + }, + + _rowLayout : function(s, tb, o) { + var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; + + dc = s.theme_advanced_containers_default_class || ''; + da = s.theme_advanced_containers_default_align || 'center'; + + each(explode(s.theme_advanced_containers || ''), function(c, i) { + var v = s['theme_advanced_container_' + c] || ''; + + switch (v.toLowerCase()) { + case 'mceeditor': + n = DOM.add(tb, 'tr'); + n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); + break; + + case 'mceelementpath': + t._addStatusBar(tb, o); + break; + + default: + a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); + a = 'mce' + t._ufirst(a); + + n = DOM.add(DOM.add(tb, 'tr'), 'td', { + 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da + }); + + to = cf.createToolbar("toolbar" + i); + t._addControls(v, to); + DOM.setHTML(n, to.renderHTML()); + o.deltaHeight -= s.theme_advanced_row_height; + } + }); + + return ic; + }, + + _addControls : function(v, tb) { + var t = this, s = t.settings, di, cf = t.editor.controlManager; + + if (s.theme_advanced_disable && !t._disabled) { + di = {}; + + each(explode(s.theme_advanced_disable), function(v) { + di[v] = 1; + }); + + t._disabled = di; + } else + di = t._disabled; + + each(explode(v), function(n) { + var c; + + if (di && di[n]) + return; + + // Compatiblity with 2.x + if (n == 'tablecontrols') { + each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { + n = t.createControl(n, cf); + + if (n) + tb.add(n); + }); + + return; + } + + c = t.createControl(n, cf); + + if (c) + tb.add(c); + }); + }, + + _addToolbars : function(c, o) { + var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup; + + toolbarGroup = cf.createToolbarGroup('toolbargroup', { + 'name': ed.getLang('advanced.toolbar'), + 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar') + }); + + t.toolbarGroup = toolbarGroup; + + a = s.theme_advanced_toolbar_align.toLowerCase(); + a = 'mce' + t._ufirst(a); + + n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"}); + + // Create toolbar and add the controls + for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { + tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); + + if (s['theme_advanced_buttons' + i + '_add']) + v += ',' + s['theme_advanced_buttons' + i + '_add']; + + if (s['theme_advanced_buttons' + i + '_add_before']) + v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; + + t._addControls(v, tb); + toolbarGroup.add(tb); + + o.deltaHeight -= s.theme_advanced_row_height; + } + h.push(toolbarGroup.renderHTML()); + h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); + DOM.setHTML(n, h.join('')); + }, + + _addStatusBar : function(tb, o) { + var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; + + n = DOM.add(tb, 'tr'); + n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); + n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'}); + if (s.theme_advanced_path) { + DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path')); + DOM.add(n, 'span', {}, ': '); + } else { + DOM.add(n, 'span', {}, '&#160;'); + } + + + if (s.theme_advanced_resizing) { + DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); + + if (s.theme_advanced_resizing_use_cookie) { + ed.onPostRender.add(function() { + var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); + + if (!o) + return; + + t.resizeTo(o.cw, o.ch); + }); + } + + ed.onPostRender.add(function() { + Event.add(ed.id + '_resize', 'click', function(e) { + e.preventDefault(); + }); + + Event.add(ed.id + '_resize', 'mousedown', function(e) { + var mouseMoveHandler1, mouseMoveHandler2, + mouseUpHandler1, mouseUpHandler2, + startX, startY, startWidth, startHeight, width, height, ifrElm; + + function resizeOnMove(e) { + e.preventDefault(); + + width = startWidth + (e.screenX - startX); + height = startHeight + (e.screenY - startY); + + t.resizeTo(width, height); + }; + + function endResize(e) { + // Stop listening + Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); + Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); + Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); + Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); + + width = startWidth + (e.screenX - startX); + height = startHeight + (e.screenY - startY); + t.resizeTo(width, height, true); + }; + + e.preventDefault(); + + // Get the current rect size + startX = e.screenX; + startY = e.screenY; + ifrElm = DOM.get(t.editor.id + '_ifr'); + startWidth = width = ifrElm.clientWidth; + startHeight = height = ifrElm.clientHeight; + + // Register envent handlers + mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); + mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); + mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); + mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); + }); + }); + } + + o.deltaHeight -= 21; + n = tb = null; + }, + + _updateUndoStatus : function(ed) { + var cm = ed.controlManager; + + cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); + cm.setDisabled('redo', !ed.undoManager.hasRedo()); + }, + + _nodeChanged : function(ed, cm, n, co, ob) { + var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches; + + tinymce.each(t.stateControls, function(c) { + cm.setActive(c, ed.queryCommandState(t.controls[c][1])); + }); + + function getParent(name) { + var i, parents = ob.parents, func = name; + + if (typeof(name) == 'string') { + func = function(node) { + return node.nodeName == name; + }; + } + + for (i = 0; i < parents.length; i++) { + if (func(parents[i])) + return parents[i]; + } + }; + + cm.setActive('visualaid', ed.hasVisual); + t._updateUndoStatus(ed); + cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); + + p = getParent('A'); + if (c = cm.get('link')) { + if (!p || !p.name) { + c.setDisabled(!p && co); + c.setActive(!!p); + } + } + + if (c = cm.get('unlink')) { + c.setDisabled(!p && co); + c.setActive(!!p && !p.name); + } + + if (c = cm.get('anchor')) { + c.setActive(!co && !!p && p.name); + } + + p = getParent('IMG'); + if (c = cm.get('image')) + c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1); + + if (c = cm.get('styleselect')) { + t._importClasses(); + + formatNames = []; + each(c.items, function(item) { + formatNames.push(item.value); + }); + + matches = ed.formatter.matchAll(formatNames); + c.select(matches[0]); + } + + if (c = cm.get('formatselect')) { + p = getParent(DOM.isBlock); + + if (p) + c.select(p.nodeName.toLowerCase()); + } + + // Find out current fontSize, fontFamily and fontClass + getParent(function(n) { + if (n.nodeName === 'SPAN') { + if (!cl && n.className) + cl = n.className; + } + + if (ed.dom.is(n, s.theme_advanced_font_selector)) { + if (!fz && n.style.fontSize) + fz = n.style.fontSize; + + if (!fn && n.style.fontFamily) + fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); + + if (!fc && n.style.color) + fc = n.style.color; + + if (!bc && n.style.backgroundColor) + bc = n.style.backgroundColor; + } + + return false; + }); + + if (c = cm.get('fontselect')) { + c.select(function(v) { + return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; + }); + } + + // Select font size + if (c = cm.get('fontsizeselect')) { + // Use computed style + if (s.theme_advanced_runtime_fontsize && !fz && !cl) + fz = ed.dom.getStyle(n, 'fontSize', true); + + c.select(function(v) { + if (v.fontSize && v.fontSize === fz) + return true; + + if (v['class'] && v['class'] === cl) + return true; + }); + } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + } + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } + + if (s.theme_advanced_show_current_color) { + function updateColor(controlId, color) { + if (c = cm.get(controlId)) { + if (!color) + color = c.settings.default_color; + if (color !== c.value) { + c.displayColor(color); + } + } + }; + + updateColor('forecolor', fc); + updateColor('backcolor', bc); + } + + if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { + p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); + + if (t.statusKeyboardNavigation) { + t.statusKeyboardNavigation.destroy(); + t.statusKeyboardNavigation = null; + } + + DOM.setHTML(p, ''); + + getParent(function(n) { + var na = n.nodeName.toLowerCase(), u, pi, ti = ''; + + if (n.getAttribute('data-mce-bogus')) + return; + + // Ignore non element and hidden elements + if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))) + return; + + // Handle prefix + if (tinymce.isIE && n.scopeName !== 'HTML') + na = n.scopeName + ':' + na; + + // Remove internal prefix + na = na.replace(/mce\:/g, ''); + + // Handle node name + switch (na) { + case 'b': + na = 'strong'; + break; + + case 'i': + na = 'em'; + break; + + case 'img': + if (v = DOM.getAttrib(n, 'src')) + ti += 'src: ' + v + ' '; + + break; + + case 'a': + if (v = DOM.getAttrib(n, 'name')) { + ti += 'name: ' + v + ' '; + na += '#' + v; + } + + if (v = DOM.getAttrib(n, 'href')) + ti += 'href: ' + v + ' '; + + break; + + case 'font': + if (v = DOM.getAttrib(n, 'face')) + ti += 'font: ' + v + ' '; + + if (v = DOM.getAttrib(n, 'size')) + ti += 'size: ' + v + ' '; + + if (v = DOM.getAttrib(n, 'color')) + ti += 'color: ' + v + ' '; + + break; + + case 'span': + if (v = DOM.getAttrib(n, 'style')) + ti += 'style: ' + v + ' '; + + break; + } + + if (v = DOM.getAttrib(n, 'id')) + ti += 'id: ' + v + ' '; + + if (v = n.className) { + v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '') + + if (v) { + ti += 'class: ' + v + ' '; + + if (DOM.isBlock(n) || na == 'img' || na == 'span') + na += '.' + v; + } + } + + na = na.replace(/(html:)/g, ''); + na = {name : na, node : n, title : ti}; + t.onResolveName.dispatch(t, na); + ti = na.title; + na = na.name; + + //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; + pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); + + if (p.hasChildNodes()) { + p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild); + p.insertBefore(pi, p.firstChild); + } else + p.appendChild(pi); + }, ed.getBody()); + + if (DOM.select('a', p).length > 0) { + t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({ + root: ed.id + "_path_row", + items: DOM.select('a', p), + excludeFromTabOrder: true, + onCancel: function() { + ed.focus(); + } + }, DOM); + } + } + }, + + // Commands gets called by execCommand + + _sel : function(v) { + this.editor.execCommand('mceSelectNodeDepth', false, v); + }, + + _mceInsertAnchor : function(ui, v) { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/anchor.htm', + width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), + height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceCharMap : function() { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/charmap.htm', + width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), + height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceHelp : function() { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/about.htm', + width : 480, + height : 380, + inline : true + }, { + theme_url : this.url + }); + }, + + _mceShortcuts : function() { + var ed = this.editor; + ed.windowManager.open({ + url: this.url + '/shortcuts.htm', + width: 480, + height: 380, + inline: true + }, { + theme_url: this.url + }); + }, + + _mceColorPicker : function(u, v) { + var ed = this.editor; + + v = v || {}; + + ed.windowManager.open({ + url : this.url + '/color_picker.htm', + width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), + height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), + close_previous : false, + inline : true + }, { + input_color : v.color, + func : v.func, + theme_url : this.url + }); + }, + + _mceCodeEditor : function(ui, val) { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/source_editor.htm', + width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), + height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), + inline : true, + resizable : true, + maximizable : true + }, { + theme_url : this.url + }); + }, + + _mceImage : function(ui, val) { + var ed = this.editor; + + // Internal image object like a flash placeholder + if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) + return; + + ed.windowManager.open({ + url : this.url + '/image.htm', + width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), + height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceLink : function(ui, val) { + var ed = this.editor; + + ed.windowManager.open({ + url : this.url + '/link.htm', + width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), + height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), + inline : true + }, { + theme_url : this.url + }); + }, + + _mceNewDocument : function() { + var ed = this.editor; + + ed.windowManager.confirm('advanced.newdocument', function(s) { + if (s) + ed.execCommand('mceSetContent', false, ''); + }); + }, + + _mceForeColor : function() { + var t = this; + + this._mceColorPicker(0, { + color: t.fgColor, + func : function(co) { + t.fgColor = co; + t.editor.execCommand('ForeColor', false, co); + } + }); + }, + + _mceBackColor : function() { + var t = this; + + this._mceColorPicker(0, { + color: t.bgColor, + func : function(co) { + t.bgColor = co; + t.editor.execCommand('HiliteColor', false, co); + } + }); + }, + + _ufirst : function(s) { + return s.substring(0, 1).toUpperCase() + s.substring(1); + } + }); + + tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); +}(tinymce)); diff --git a/js/tiny_mce/themes/advanced/image.htm b/js/tiny_mce/themes/advanced/image.htm new file mode 100644 index 000000000..b8ba729f6 --- /dev/null +++ b/js/tiny_mce/themes/advanced/image.htm @@ -0,0 +1,80 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.image_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="js/image.js"></script> +</head> +<body id="image" style="display: none"> +<form onsubmit="ImageDialog.update();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.image_title}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <table border="0" cellpadding="4" cellspacing="0"> + <tr> + <td class="nowrap"><label for="src">{#advanced_dlg.image_src}</label></td> + <td><table border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="src" name="src" type="text" class="mceFocus" value="" style="width: 200px" onchange="ImageDialog.getImageData();" /></td> + <td id="srcbrowsercontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + <tr> + <td><label for="image_list">{#advanced_dlg.image_list}</label></td> + <td><select id="image_list" name="image_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;"></select></td> + </tr> + <tr> + <td class="nowrap"><label for="alt">{#advanced_dlg.image_alt}</label></td> + <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td> + </tr> + <tr> + <td class="nowrap"><label for="align">{#advanced_dlg.image_align}</label></td> + <td><select id="align" name="align" onchange="ImageDialog.updateStyle();"> + <option value="">{#not_set}</option> + <option value="baseline">{#advanced_dlg.image_align_baseline}</option> + <option value="top">{#advanced_dlg.image_align_top}</option> + <option value="middle">{#advanced_dlg.image_align_middle}</option> + <option value="bottom">{#advanced_dlg.image_align_bottom}</option> + <option value="text-top">{#advanced_dlg.image_align_texttop}</option> + <option value="text-bottom">{#advanced_dlg.image_align_textbottom}</option> + <option value="left">{#advanced_dlg.image_align_left}</option> + <option value="right">{#advanced_dlg.image_align_right}</option> + </select></td> + </tr> + <tr> + <td class="nowrap"><label for="width">{#advanced_dlg.image_dimensions}</label></td> + <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" /> + x + <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td> + </tr> + <tr> + <td class="nowrap"><label for="border">{#advanced_dlg.image_border}</label></td> + <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> + </tr> + <tr> + <td class="nowrap"><label for="vspace">{#advanced_dlg.image_vspace}</label></td> + <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> + </tr> + <tr> + <td class="nowrap"><label for="hspace">{#advanced_dlg.image_hspace}</label></td> + <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> + </tr> + </table> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/themes/advanced/img/colorpicker.jpg b/js/tiny_mce/themes/advanced/img/colorpicker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4c542d107b25f68a9d4f9d7a109d0565d1f1437 GIT binary patch literal 3189 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 literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/flash.gif b/js/tiny_mce/themes/advanced/img/flash.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb192e6ceda8d19ad8e7d08dd1cfde0aa72ead2a GIT binary patch literal 241 zcmV<N01p30Nk%w1VH5xq0K*9Y0w_vuilWKS*;Z<L?e6iex5E`&f8F2Yf{&g3{rv|x zTAiq{x5LtEeU6HouK)l5A^8LW000jFEC2ui02BZe000D@@X1N5y*NLz+8E73XoTQ2 zPEnkWFj@rD6vAN(MaR69(A0#W001z^1QkN-Ku9DA3WdRNF!3IR2Gf~vNCURRjDi4i ziw2sFfuQ^jTm~SjAlw@6+L>OzlLa+Za}7>m0&NpCfJ0FQc3~<M2Q3YA3WR}G4hIzs r9SQ&qC1C^&3>F7DE)S%o1)Qi1n@vxX46qnD4hRS-NE*Pw!4UvE=#^N( literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/icons.gif b/js/tiny_mce/themes/advanced/img/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..e46de5333082869b9bdab2576a554a2f9d01a966 GIT binary patch literal 11794 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 F{{gR&nqvR} literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/iframe.gif b/js/tiny_mce/themes/advanced/img/iframe.gif new file mode 100644 index 0000000000000000000000000000000000000000..410c7ad084db698e9f35e3230233aa4040682566 GIT binary patch literal 600 zcmZ?wbhEHb6krfwcoxm@|NsB$<##6SeDUYszh8g<{{H*-%a7k_-3KZc-T3+YPwBiX zzyAIE^Y`z!U%$Wp{QdX;|FQ*Fw;jIy{pasbUw?o3{yVB>Q_sR<KmYuB{`zY~^~S1Y zciw#Z@#p{luRnhO{QLLE-@o7g{7Got_4nVux1YbidjG9*@y-0{XY!|=4lZ6<Jm+Fq z+1kX`-QR!z2`*lB@A;>gx-G9iegFLZcfrha#d9w;%sU=Zx~6K$tw~$%z4`#O^Y@3Z zKV#~)MpSKh@#b63l#}6=>yq2|{`&JLqwny)|NnC)o%r$l&-Y)yKYjo8?#quSuRaGB zt_&<%`RV)bl#YEr{`~p)?RU|v^Y1_Z`u*?Ux8J`*N>>+5JlMAOZr+qr@y$D{mfVhO z+zt#7208-8pDc_F4ABfaAUi>E!oa?@A-bu#r8Qd6oKeb*Lx9UTz)0QBL@+vxY38ii zvqGa87c5+~h&?)zVa3W-D;=U$88}^qMBJ^ERU|z17!;#97+4%Rd1XcXJq#>t8KR;E z7<gD&#C7=C421)w8LXqZ7?@cv%J~Uh^ATncjn;g?{P2>zr5i6BgH5y=gAD)sAQlGB zh8au?j!n~E(Pks?@!j1fR&j<cH=I(Yx`udfix4PUaFR<$Un}Lu!X_>*RWY8GF(-=x H6d0@lT&58X literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/pagebreak.gif b/js/tiny_mce/themes/advanced/img/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..acdf4085f3068c4c0a1d6855f4b80dae8bac3068 GIT binary patch literal 325 zcmV-L0lNN2Nk%w1VPpUd0J9GO`>v<{=;ru;boX6P{`2zsmyZ3>&HK5t_;hIbi-G;z z+4`cI{KdfcXj}GCLjV8&A^8LW000jFEC2ui0Av6R000E?@X1N5y*TU5yZ>M)j$|1M z4Ouvb$pHu>IW8BZq|n;U0s@T!VM5~w1_+1X!EiVl!&PITYdjT!ffYfpt{jAfv%qvh zA63WUHSlr7LkeyaV4(pM0f50(II?RD4RtMg4-E+tFhdAy5{3c=0}3Bg9Y8`B2To20 zR%SO62L%9}0H+dzoKB$+2TOwzUrwi{XiBM^4V#>63q3!LsU3u93zH8CdwqY%62;1g z0g8ze$k93lWExp`CUe|K4qOWk17ZeJ0|5pDP6+}};{>bI@lOWj=kf}r2sHp7w9-Ie XK%9UG6W(*AX-vY05F<*&5CH%?Gwy&_ literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/quicktime.gif b/js/tiny_mce/themes/advanced/img/quicktime.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b0499145b16138249f653a1a3f2c80230fb292c GIT binary patch literal 303 zcmV+~0nq+ONk%w1VGsZi0K^{vH>m7Qv+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8$^=JX7b<p2NwA^8LW0018VEC2ui01yBW000H7;3tYl0b#{4u3u+7TeNM4p{`tp zAPhzE1BGA&nJgF$f-(Sr05YA=A+taLG^4^p09hzLl7$Bm6=@Mn&qSa&Zn6$^2jE#4 z26c|e5)VWpbq{z8dLI`71Q#L?9t;r<3?2?62RBoV2@(h%84xTV1|E$a2Lo0L5*8vZ z3Of!e8b1IJ4>b<~J01ZTA{q@86#&8&6~H`Ss{{?p%K!-p%L6P2TpFYz90?pD06UU# BbnE~C literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/realmedia.gif b/js/tiny_mce/themes/advanced/img/realmedia.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdfe0b9ac05869ae845fdd828eaad97cc0c69dbc GIT binary patch literal 439 zcmV;o0Z9HwNk%w1VI=?(0K^{vQcz8xz}f&njBB06v9GQ`Jv%NdDHCI&z`wqZw$(Lw zuFTBL!Pe#<92tv>h)9OE1Xh}vnVEHSaeb-GByg#tqM_B*)YRkdSdqTu<Kq($4eIgt z07{c)W@Z2Y0RR90A^8LW0018VEC2ui03`qt000I5;3tmX6%3D}JVU~ea4d`4L_vbU z?R!oQuNiDZ90d+Lh@ur}CQvxRV<Qx03Jr;9kQ`iu8)s06@OUDh#O^TuSUR0br;y1w z00jxcDls$+9Rwc|9vTZ9NC#ge4rUr200@t8W`Y171r7xs4H=gP8w@)SF#sAG4s`|| z1`!brkZu*Tn+6N39Ur0`7(=T7A`7Pl003~V4I0GBk&kGI90yb*k{%9LupJo$4h|NN zbOg?g8W|#L917Eeg?l0d$&Vfq8<!de2B!p<1q2IQYbH?1u;3qw4G1a_F!zptg$xJ| zEkIx)q7e!?4qyntfXKQ4DFjvllRyE792_7taG3BR07ec2){PXxV8R0m2M#27utPzc hnLsyCNWv1RQ6oJU9W}ZE0)zxhqYhA@G%AS@06S<cl~n)$ literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/shockwave.gif b/js/tiny_mce/themes/advanced/img/shockwave.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f235dfc7363bd4957b5fe352e16a7eee9a38574 GIT binary patch literal 387 zcmZ?wbhEHb6lD-#xXJ(m|AF9|(f@B(e|&xQ_v6XWFR%Td$?$)n^p7RFzqSScKhyN< z>ipLaF8n=^^LJP4|1^gG<ubn(XZ%`U^Z)3aPnY-pY_a}vWYNbnTmMHg{GXY2256v) z%70_yt9p8O%+2rR<lL>Rdo_Rl+a*grZQ1hw@Zo1ikN$oB{QbRq&z?QIckdq1a<D7N zBou$LFfuS`Gw6WygZ#w6w%~wh;|49Meh=kFMGvdVOm2@oW4YKwpJ#4uH4^E#y1?Ur zgw@h>E3;Fq_(WV>Kc7gjQtQh+9OrtFhn-)LUqD<|MOIl_!(Ed#pPRE;S)g;ew3>pd zn`Wa(lc2DGa)peFw3f88dp-|`@*)AXj;@(<N*-E#9KvFYwUjlLt5@ypo2MnDrKY8= g>8hwDr|7Sxsp;&YxjN*Y{PBB!TIU|!b7Zgv0OaG5)&Kwi literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/trans.gif b/js/tiny_mce/themes/advanced/img/trans.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/video.gif b/js/tiny_mce/themes/advanced/img/video.gif new file mode 100644 index 0000000000000000000000000000000000000000..3570104077a3b3585f11403c8d4c3fc9351f35d2 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc$UTx9v<%P?Ok48Ze?YanwpxCkzrwBk(ZYzB_&l;Q<IsQ8F##3 z&6+hjyS!_6-?m?OIypHx=Cr@-5&wj}H`bh97ZVd>w!gmM(Ep^QBwbzIoSdAh>*2n> zz9l6k0Xw#(?);y5^ls9w|LObxXI*si^YfcEYu3*P8J(S-PEJlaNB-yTd}C^Ax@_69 zzP`Ryt5)S5`=P3;TDk9SbaeFk_3NiTjGA~aFd-pf@}tlxQ>GLb7jM|Gp`oFHlaq7F zk|nvhxjsHV=g+oST3Rl6T(N1>rn0iK*Ed>3MMVn>3vF#}<Kp6$Jg%90KfnCM|DvP+ z<KyEe-;F<iW5)F9(>**q!otE>Sy|^jDoRUBoBANRc=wyaJ<nc0nc3Rf>ged$+}u3x zK}ld>puWET<a=QO0RcuvMvEU*R8>{||NozXdO-0f3nK$V8iNkVNKl+Guy1NeYie$3 zZB}=&Zex!RYq8YfVwgNdMpdFkN|rU!Fha}0m66q>CDxczOhH^pM9qvxw1p`;Rftzu zQJ&9}g>iErlc2ORw;aC_=l*6UJ=st%r*ISVV2jgDT<)w>rX<Tawy@hu>HGL<21Kdo z#<Z}gv#eUPE{L72Mbyr3`_A1O_6G!-4lo?pkaV1FiiAT30~@pViHb_0Wo%3wHXM={ aHZHoY!s6T`pfu63XCY5W0tXihgEasdRMD9L literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/img/windowsmedia.gif b/js/tiny_mce/themes/advanced/img/windowsmedia.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab50f2d887a0843b116ef598e5a005e5601d18d0 GIT binary patch literal 415 zcmV;Q0bu?|Nk%w1VGjTg0M$PL`E^qkEu+z?1&N?x_*pRg{rx~kg!#|I<>uyug^O^t z0hZGrt*x!>$1C!zn`W5@`ts6_uMW)2%<0NUEKIo?SIPPE=}U0}7Z(?JcX!y=*;bF< zCWz-=h7+2ao9)(dOHM;+X=xs9)%!~xc&ICMZdRYdUQ2$^@9y(6X3NCIz{cM7f^Z=Q z1_tQ95kgl8b%R%OiYTIo7LSdE^<g{S%f{2(!x(nqRGjHZr0IW^!yX<Ufq!q~!#RbG zsQ>@}A^8LW002J#EC2ui01p5U000KOz@O0K01zUifeIyT9%!RzMDgehG|mwLz+Eh; z7Z~<O+d66*jm@O!TxJNz2;i`UR0tHx^tgZ+0CP1KAR!ql1qdV^FA0GF8iXJ_Eg=Xd zF)utP961Ptlsgg#A3Xw_HykS#I~WWS1r`&g89Eg=I4CoS1qB}yE;0!k6cr*HE4>iE zrX?OfJ^>XeDJK)xJuWOB3_l1N0Ra>g4Gk^=ED0V6LI?>4;Q|6OB{LplLMRLg8U5-E J?0y6R06W6!pgRBn literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/js/about.js b/js/tiny_mce/themes/advanced/js/about.js new file mode 100644 index 000000000..daf4909ad --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/about.js @@ -0,0 +1,73 @@ +tinyMCEPopup.requireLangPack(); + +function init() { + var ed, tcont; + + tinyMCEPopup.resizeToInnerSize(); + ed = tinyMCEPopup.editor; + + // Give FF some time + window.setTimeout(insertHelpIFrame, 10); + + tcont = document.getElementById('plugintablecontainer'); + document.getElementById('plugins_tab').style.display = 'none'; + + var html = ""; + html += '<table id="plugintable">'; + html += '<thead>'; + html += '<tr>'; + html += '<td>' + ed.getLang('advanced_dlg.about_plugin') + '</td>'; + html += '<td>' + ed.getLang('advanced_dlg.about_author') + '</td>'; + html += '<td>' + ed.getLang('advanced_dlg.about_version') + '</td>'; + html += '</tr>'; + html += '</thead>'; + html += '<tbody>'; + + tinymce.each(ed.plugins, function(p, n) { + var info; + + if (!p.getInfo) + return; + + html += '<tr>'; + + info = p.getInfo(); + + if (info.infourl != null && info.infourl != '') + html += '<td width="50%" title="' + n + '"><a href="' + info.infourl + '" target="_blank">' + info.longname + '</a></td>'; + else + html += '<td width="50%" title="' + n + '">' + info.longname + '</td>'; + + if (info.authorurl != null && info.authorurl != '') + html += '<td width="35%"><a href="' + info.authorurl + '" target="_blank">' + info.author + '</a></td>'; + else + html += '<td width="35%">' + info.author + '</td>'; + + html += '<td width="15%">' + info.version + '</td>'; + html += '</tr>'; + + document.getElementById('plugins_tab').style.display = ''; + + }); + + html += '</tbody>'; + html += '</table>'; + + tcont.innerHTML = html; + + tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; + tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; +} + +function insertHelpIFrame() { + var html; + + if (tinyMCEPopup.getParam('docs_url')) { + html = '<iframe width="100%" height="300" src="' + tinyMCEPopup.editor.baseURI.toAbsolute(tinyMCEPopup.getParam('docs_url')) + '"></iframe>'; + document.getElementById('iframecontainer').innerHTML = html; + document.getElementById('help_tab').style.display = 'block'; + document.getElementById('help_tab').setAttribute("aria-hidden", "false"); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/themes/advanced/js/anchor.js b/js/tiny_mce/themes/advanced/js/anchor.js new file mode 100644 index 000000000..7b556351d --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/anchor.js @@ -0,0 +1,42 @@ +tinyMCEPopup.requireLangPack(); + +var AnchorDialog = { + init : function(ed) { + var action, elm, f = document.forms[0]; + + this.editor = ed; + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + v = ed.dom.getAttrib(elm, 'name'); + + if (v) { + this.action = 'update'; + f.anchorName.value = v; + } + + f.insert.value = ed.getLang(elm ? 'update' : 'insert'); + }, + + update : function() { + var ed = this.editor, elm, name = document.forms[0].anchorName.value; + + if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { + tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); + return; + } + + tinyMCEPopup.restoreSelection(); + + if (this.action != 'update') + ed.selection.collapse(1); + + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + if (elm) + elm.name = name; + else + ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, '')); + + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); diff --git a/js/tiny_mce/themes/advanced/js/charmap.js b/js/tiny_mce/themes/advanced/js/charmap.js new file mode 100644 index 000000000..78bc080e1 --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/charmap.js @@ -0,0 +1,355 @@ +/** + * charmap.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +tinyMCEPopup.requireLangPack(); + +var charmap = [ + ['&nbsp;', '&#160;', true, 'no-break space'], + ['&amp;', '&#38;', true, 'ampersand'], + ['&quot;', '&#34;', true, 'quotation mark'], +// finance + ['&cent;', '&#162;', true, 'cent sign'], + ['&euro;', '&#8364;', true, 'euro sign'], + ['&pound;', '&#163;', true, 'pound sign'], + ['&yen;', '&#165;', true, 'yen sign'], +// signs + ['&copy;', '&#169;', true, 'copyright sign'], + ['&reg;', '&#174;', true, 'registered sign'], + ['&trade;', '&#8482;', true, 'trade mark sign'], + ['&permil;', '&#8240;', true, 'per mille sign'], + ['&micro;', '&#181;', true, 'micro sign'], + ['&middot;', '&#183;', true, 'middle dot'], + ['&bull;', '&#8226;', true, 'bullet'], + ['&hellip;', '&#8230;', true, 'three dot leader'], + ['&prime;', '&#8242;', true, 'minutes / feet'], + ['&Prime;', '&#8243;', true, 'seconds / inches'], + ['&sect;', '&#167;', true, 'section sign'], + ['&para;', '&#182;', true, 'paragraph sign'], + ['&szlig;', '&#223;', true, 'sharp s / ess-zed'], +// quotations + ['&lsaquo;', '&#8249;', true, 'single left-pointing angle quotation mark'], + ['&rsaquo;', '&#8250;', true, 'single right-pointing angle quotation mark'], + ['&laquo;', '&#171;', true, 'left pointing guillemet'], + ['&raquo;', '&#187;', true, 'right pointing guillemet'], + ['&lsquo;', '&#8216;', true, 'left single quotation mark'], + ['&rsquo;', '&#8217;', true, 'right single quotation mark'], + ['&ldquo;', '&#8220;', true, 'left double quotation mark'], + ['&rdquo;', '&#8221;', true, 'right double quotation mark'], + ['&sbquo;', '&#8218;', true, 'single low-9 quotation mark'], + ['&bdquo;', '&#8222;', true, 'double low-9 quotation mark'], + ['&lt;', '&#60;', true, 'less-than sign'], + ['&gt;', '&#62;', true, 'greater-than sign'], + ['&le;', '&#8804;', true, 'less-than or equal to'], + ['&ge;', '&#8805;', true, 'greater-than or equal to'], + ['&ndash;', '&#8211;', true, 'en dash'], + ['&mdash;', '&#8212;', true, 'em dash'], + ['&macr;', '&#175;', true, 'macron'], + ['&oline;', '&#8254;', true, 'overline'], + ['&curren;', '&#164;', true, 'currency sign'], + ['&brvbar;', '&#166;', true, 'broken bar'], + ['&uml;', '&#168;', true, 'diaeresis'], + ['&iexcl;', '&#161;', true, 'inverted exclamation mark'], + ['&iquest;', '&#191;', true, 'turned question mark'], + ['&circ;', '&#710;', true, 'circumflex accent'], + ['&tilde;', '&#732;', true, 'small tilde'], + ['&deg;', '&#176;', true, 'degree sign'], + ['&minus;', '&#8722;', true, 'minus sign'], + ['&plusmn;', '&#177;', true, 'plus-minus sign'], + ['&divide;', '&#247;', true, 'division sign'], + ['&frasl;', '&#8260;', true, 'fraction slash'], + ['&times;', '&#215;', true, 'multiplication sign'], + ['&sup1;', '&#185;', true, 'superscript one'], + ['&sup2;', '&#178;', true, 'superscript two'], + ['&sup3;', '&#179;', true, 'superscript three'], + ['&frac14;', '&#188;', true, 'fraction one quarter'], + ['&frac12;', '&#189;', true, 'fraction one half'], + ['&frac34;', '&#190;', true, 'fraction three quarters'], +// math / logical + ['&fnof;', '&#402;', true, 'function / florin'], + ['&int;', '&#8747;', true, 'integral'], + ['&sum;', '&#8721;', true, 'n-ary sumation'], + ['&infin;', '&#8734;', true, 'infinity'], + ['&radic;', '&#8730;', true, 'square root'], + ['&sim;', '&#8764;', false,'similar to'], + ['&cong;', '&#8773;', false,'approximately equal to'], + ['&asymp;', '&#8776;', true, 'almost equal to'], + ['&ne;', '&#8800;', true, 'not equal to'], + ['&equiv;', '&#8801;', true, 'identical to'], + ['&isin;', '&#8712;', false,'element of'], + ['&notin;', '&#8713;', false,'not an element of'], + ['&ni;', '&#8715;', false,'contains as member'], + ['&prod;', '&#8719;', true, 'n-ary product'], + ['&and;', '&#8743;', false,'logical and'], + ['&or;', '&#8744;', false,'logical or'], + ['&not;', '&#172;', true, 'not sign'], + ['&cap;', '&#8745;', true, 'intersection'], + ['&cup;', '&#8746;', false,'union'], + ['&part;', '&#8706;', true, 'partial differential'], + ['&forall;', '&#8704;', false,'for all'], + ['&exist;', '&#8707;', false,'there exists'], + ['&empty;', '&#8709;', false,'diameter'], + ['&nabla;', '&#8711;', false,'backward difference'], + ['&lowast;', '&#8727;', false,'asterisk operator'], + ['&prop;', '&#8733;', false,'proportional to'], + ['&ang;', '&#8736;', false,'angle'], +// undefined + ['&acute;', '&#180;', true, 'acute accent'], + ['&cedil;', '&#184;', true, 'cedilla'], + ['&ordf;', '&#170;', true, 'feminine ordinal indicator'], + ['&ordm;', '&#186;', true, 'masculine ordinal indicator'], + ['&dagger;', '&#8224;', true, 'dagger'], + ['&Dagger;', '&#8225;', true, 'double dagger'], +// alphabetical special chars + ['&Agrave;', '&#192;', true, 'A - grave'], + ['&Aacute;', '&#193;', true, 'A - acute'], + ['&Acirc;', '&#194;', true, 'A - circumflex'], + ['&Atilde;', '&#195;', true, 'A - tilde'], + ['&Auml;', '&#196;', true, 'A - diaeresis'], + ['&Aring;', '&#197;', true, 'A - ring above'], + ['&AElig;', '&#198;', true, 'ligature AE'], + ['&Ccedil;', '&#199;', true, 'C - cedilla'], + ['&Egrave;', '&#200;', true, 'E - grave'], + ['&Eacute;', '&#201;', true, 'E - acute'], + ['&Ecirc;', '&#202;', true, 'E - circumflex'], + ['&Euml;', '&#203;', true, 'E - diaeresis'], + ['&Igrave;', '&#204;', true, 'I - grave'], + ['&Iacute;', '&#205;', true, 'I - acute'], + ['&Icirc;', '&#206;', true, 'I - circumflex'], + ['&Iuml;', '&#207;', true, 'I - diaeresis'], + ['&ETH;', '&#208;', true, 'ETH'], + ['&Ntilde;', '&#209;', true, 'N - tilde'], + ['&Ograve;', '&#210;', true, 'O - grave'], + ['&Oacute;', '&#211;', true, 'O - acute'], + ['&Ocirc;', '&#212;', true, 'O - circumflex'], + ['&Otilde;', '&#213;', true, 'O - tilde'], + ['&Ouml;', '&#214;', true, 'O - diaeresis'], + ['&Oslash;', '&#216;', true, 'O - slash'], + ['&OElig;', '&#338;', true, 'ligature OE'], + ['&Scaron;', '&#352;', true, 'S - caron'], + ['&Ugrave;', '&#217;', true, 'U - grave'], + ['&Uacute;', '&#218;', true, 'U - acute'], + ['&Ucirc;', '&#219;', true, 'U - circumflex'], + ['&Uuml;', '&#220;', true, 'U - diaeresis'], + ['&Yacute;', '&#221;', true, 'Y - acute'], + ['&Yuml;', '&#376;', true, 'Y - diaeresis'], + ['&THORN;', '&#222;', true, 'THORN'], + ['&agrave;', '&#224;', true, 'a - grave'], + ['&aacute;', '&#225;', true, 'a - acute'], + ['&acirc;', '&#226;', true, 'a - circumflex'], + ['&atilde;', '&#227;', true, 'a - tilde'], + ['&auml;', '&#228;', true, 'a - diaeresis'], + ['&aring;', '&#229;', true, 'a - ring above'], + ['&aelig;', '&#230;', true, 'ligature ae'], + ['&ccedil;', '&#231;', true, 'c - cedilla'], + ['&egrave;', '&#232;', true, 'e - grave'], + ['&eacute;', '&#233;', true, 'e - acute'], + ['&ecirc;', '&#234;', true, 'e - circumflex'], + ['&euml;', '&#235;', true, 'e - diaeresis'], + ['&igrave;', '&#236;', true, 'i - grave'], + ['&iacute;', '&#237;', true, 'i - acute'], + ['&icirc;', '&#238;', true, 'i - circumflex'], + ['&iuml;', '&#239;', true, 'i - diaeresis'], + ['&eth;', '&#240;', true, 'eth'], + ['&ntilde;', '&#241;', true, 'n - tilde'], + ['&ograve;', '&#242;', true, 'o - grave'], + ['&oacute;', '&#243;', true, 'o - acute'], + ['&ocirc;', '&#244;', true, 'o - circumflex'], + ['&otilde;', '&#245;', true, 'o - tilde'], + ['&ouml;', '&#246;', true, 'o - diaeresis'], + ['&oslash;', '&#248;', true, 'o slash'], + ['&oelig;', '&#339;', true, 'ligature oe'], + ['&scaron;', '&#353;', true, 's - caron'], + ['&ugrave;', '&#249;', true, 'u - grave'], + ['&uacute;', '&#250;', true, 'u - acute'], + ['&ucirc;', '&#251;', true, 'u - circumflex'], + ['&uuml;', '&#252;', true, 'u - diaeresis'], + ['&yacute;', '&#253;', true, 'y - acute'], + ['&thorn;', '&#254;', true, 'thorn'], + ['&yuml;', '&#255;', true, 'y - diaeresis'], + ['&Alpha;', '&#913;', true, 'Alpha'], + ['&Beta;', '&#914;', true, 'Beta'], + ['&Gamma;', '&#915;', true, 'Gamma'], + ['&Delta;', '&#916;', true, 'Delta'], + ['&Epsilon;', '&#917;', true, 'Epsilon'], + ['&Zeta;', '&#918;', true, 'Zeta'], + ['&Eta;', '&#919;', true, 'Eta'], + ['&Theta;', '&#920;', true, 'Theta'], + ['&Iota;', '&#921;', true, 'Iota'], + ['&Kappa;', '&#922;', true, 'Kappa'], + ['&Lambda;', '&#923;', true, 'Lambda'], + ['&Mu;', '&#924;', true, 'Mu'], + ['&Nu;', '&#925;', true, 'Nu'], + ['&Xi;', '&#926;', true, 'Xi'], + ['&Omicron;', '&#927;', true, 'Omicron'], + ['&Pi;', '&#928;', true, 'Pi'], + ['&Rho;', '&#929;', true, 'Rho'], + ['&Sigma;', '&#931;', true, 'Sigma'], + ['&Tau;', '&#932;', true, 'Tau'], + ['&Upsilon;', '&#933;', true, 'Upsilon'], + ['&Phi;', '&#934;', true, 'Phi'], + ['&Chi;', '&#935;', true, 'Chi'], + ['&Psi;', '&#936;', true, 'Psi'], + ['&Omega;', '&#937;', true, 'Omega'], + ['&alpha;', '&#945;', true, 'alpha'], + ['&beta;', '&#946;', true, 'beta'], + ['&gamma;', '&#947;', true, 'gamma'], + ['&delta;', '&#948;', true, 'delta'], + ['&epsilon;', '&#949;', true, 'epsilon'], + ['&zeta;', '&#950;', true, 'zeta'], + ['&eta;', '&#951;', true, 'eta'], + ['&theta;', '&#952;', true, 'theta'], + ['&iota;', '&#953;', true, 'iota'], + ['&kappa;', '&#954;', true, 'kappa'], + ['&lambda;', '&#955;', true, 'lambda'], + ['&mu;', '&#956;', true, 'mu'], + ['&nu;', '&#957;', true, 'nu'], + ['&xi;', '&#958;', true, 'xi'], + ['&omicron;', '&#959;', true, 'omicron'], + ['&pi;', '&#960;', true, 'pi'], + ['&rho;', '&#961;', true, 'rho'], + ['&sigmaf;', '&#962;', true, 'final sigma'], + ['&sigma;', '&#963;', true, 'sigma'], + ['&tau;', '&#964;', true, 'tau'], + ['&upsilon;', '&#965;', true, 'upsilon'], + ['&phi;', '&#966;', true, 'phi'], + ['&chi;', '&#967;', true, 'chi'], + ['&psi;', '&#968;', true, 'psi'], + ['&omega;', '&#969;', true, 'omega'], +// symbols + ['&alefsym;', '&#8501;', false,'alef symbol'], + ['&piv;', '&#982;', false,'pi symbol'], + ['&real;', '&#8476;', false,'real part symbol'], + ['&thetasym;','&#977;', false,'theta symbol'], + ['&upsih;', '&#978;', false,'upsilon - hook symbol'], + ['&weierp;', '&#8472;', false,'Weierstrass p'], + ['&image;', '&#8465;', false,'imaginary part'], +// arrows + ['&larr;', '&#8592;', true, 'leftwards arrow'], + ['&uarr;', '&#8593;', true, 'upwards arrow'], + ['&rarr;', '&#8594;', true, 'rightwards arrow'], + ['&darr;', '&#8595;', true, 'downwards arrow'], + ['&harr;', '&#8596;', true, 'left right arrow'], + ['&crarr;', '&#8629;', false,'carriage return'], + ['&lArr;', '&#8656;', false,'leftwards double arrow'], + ['&uArr;', '&#8657;', false,'upwards double arrow'], + ['&rArr;', '&#8658;', false,'rightwards double arrow'], + ['&dArr;', '&#8659;', false,'downwards double arrow'], + ['&hArr;', '&#8660;', false,'left right double arrow'], + ['&there4;', '&#8756;', false,'therefore'], + ['&sub;', '&#8834;', false,'subset of'], + ['&sup;', '&#8835;', false,'superset of'], + ['&nsub;', '&#8836;', false,'not a subset of'], + ['&sube;', '&#8838;', false,'subset of or equal to'], + ['&supe;', '&#8839;', false,'superset of or equal to'], + ['&oplus;', '&#8853;', false,'circled plus'], + ['&otimes;', '&#8855;', false,'circled times'], + ['&perp;', '&#8869;', false,'perpendicular'], + ['&sdot;', '&#8901;', false,'dot operator'], + ['&lceil;', '&#8968;', false,'left ceiling'], + ['&rceil;', '&#8969;', false,'right ceiling'], + ['&lfloor;', '&#8970;', false,'left floor'], + ['&rfloor;', '&#8971;', false,'right floor'], + ['&lang;', '&#9001;', false,'left-pointing angle bracket'], + ['&rang;', '&#9002;', false,'right-pointing angle bracket'], + ['&loz;', '&#9674;', true, 'lozenge'], + ['&spades;', '&#9824;', true, 'black spade suit'], + ['&clubs;', '&#9827;', true, 'black club suit'], + ['&hearts;', '&#9829;', true, 'black heart suit'], + ['&diams;', '&#9830;', true, 'black diamond suit'], + ['&ensp;', '&#8194;', false,'en space'], + ['&emsp;', '&#8195;', false,'em space'], + ['&thinsp;', '&#8201;', false,'thin space'], + ['&zwnj;', '&#8204;', false,'zero width non-joiner'], + ['&zwj;', '&#8205;', false,'zero width joiner'], + ['&lrm;', '&#8206;', false,'left-to-right mark'], + ['&rlm;', '&#8207;', false,'right-to-left mark'], + ['&shy;', '&#173;', false,'soft hyphen'] +]; + +tinyMCEPopup.onInit.add(function() { + tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); + addKeyboardNavigation(); +}); + +function addKeyboardNavigation(){ + var tableElm, cells, settings; + + cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup"); + + settings ={ + root: "charmapgroup", + items: cells + }; + + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); +} + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20, i; + var html = '<div id="charmapgroup" aria-labelledby="charmap_label" tabindex="0" role="listbox">'+ + '<table role="presentation" border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + + '"><tr height="' + tdHeight + '">'; + var cols=-1; + + for (i=0; i<charmap.length; i++) { + var previewCharFn; + + if (charmap[i][2]==true) { + cols++; + previewCharFn = 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');'; + html += '' + + '<td class="charmap">' + + '<a class="charmaplink" role="button" onmouseover="'+previewCharFn+'" onfocus="'+previewCharFn+'" href="javascript:void(0)" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">' + + charmap[i][1] + + '</a></td>'; + if ((cols+1) % charsPerRow == 0) + html += '</tr><tr height="' + tdHeight + '">'; + } + } + + if (cols % charsPerRow > 0) { + var padd = charsPerRow - (cols % charsPerRow); + for (var i=0; i<padd-1; i++) + html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>'; + } + + html += '</tr></table></div>'; + html = html.replace(/<tr height="20"><\/tr>/g, ''); + + return html; +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); + + tinyMCEPopup.editor.focus(); + tinyMCEPopup.close(); +} + +function previewChar(codeA, codeB, codeN) { + var elmA = document.getElementById('codeA'); + var elmB = document.getElementById('codeB'); + var elmV = document.getElementById('codeV'); + var elmN = document.getElementById('codeN'); + + if (codeA=='#160;') { + elmV.innerHTML = '__'; + } else { + elmV.innerHTML = '&' + codeA; + } + + elmB.innerHTML = '&amp;' + codeA; + elmA.innerHTML = '&amp;' + codeB; + elmN.innerHTML = codeN; +} diff --git a/js/tiny_mce/themes/advanced/js/color_picker.js b/js/tiny_mce/themes/advanced/js/color_picker.js new file mode 100644 index 000000000..cdf8c4c0c --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/color_picker.js @@ -0,0 +1,329 @@ +tinyMCEPopup.requireLangPack(); + +var detail = 50, strhex = "0123456789ABCDEF", i, isMouseDown = false, isMouseOver = false; + +var colors = [ + "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", + "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", + "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", + "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", + "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", + "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", + "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", + "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", + "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", + "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", + "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", + "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", + "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", + "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", + "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", + "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", + "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", + "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", + "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", + "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", + "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", + "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", + "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", + "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", + "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", + "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", + "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" +]; + +var named = { + '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', + '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', + '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', + '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', + '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', + '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', + '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', + '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', + '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', + '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', + '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', + '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', + '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', + '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', + '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', + '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', + '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', + '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', + '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', + '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', + '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', + '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', + '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' +}; + +var namedLookup = {}; + +function init() { + var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; + + tinyMCEPopup.resizeToInnerSize(); + + generatePicker(); + generateWebColors(); + generateNamedColors(); + + if (inputColor) { + changeFinalColor(inputColor); + + col = convertHexToRGB(inputColor); + + if (col) + updateLight(col.r, col.g, col.b); + } + + for (key in named) { + value = named[key]; + namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); + } +} + +function toHexColor(color) { + var matches, red, green, blue, toInt = parseInt; + + function hex(value) { + value = parseInt(value).toString(16); + + return value.length > 1 ? value : '0' + value; // Padd with leading zero + }; + + color = color.replace(/[\s#]+/g, '').toLowerCase(); + color = namedLookup[color] || color; + matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})|([a-f0-9])([a-f0-9])([a-f0-9])$/.exec(color); + + if (matches) { + if (matches[1]) { + red = toInt(matches[1]); + green = toInt(matches[2]); + blue = toInt(matches[3]); + } else if (matches[4]) { + red = toInt(matches[4], 16); + green = toInt(matches[5], 16); + blue = toInt(matches[6], 16); + } else if (matches[7]) { + red = toInt(matches[7] + matches[7], 16); + green = toInt(matches[8] + matches[8], 16); + blue = toInt(matches[9] + matches[9], 16); + } + + return '#' + hex(red) + hex(green) + hex(blue); + } + + return ''; +} + +function insertAction() { + var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); + + tinyMCEPopup.restoreSelection(); + + if (f) + f(toHexColor(color)); + + tinyMCEPopup.close(); +} + +function showColor(color, name) { + if (name) + document.getElementById("colorname").innerHTML = name; + + document.getElementById("preview").style.backgroundColor = color; + document.getElementById("color").value = color.toUpperCase(); +} + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + if (!col) + return col; + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return {r : r, g : g, b : b}; + } + + return null; +} + +function generatePicker() { + var el = document.getElementById('light'), h = '', i; + + for (i = 0; i < detail; i++){ + h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"' + + ' onclick="changeFinalColor(this.style.backgroundColor)"' + + ' onmousedown="isMouseDown = true; return false;"' + + ' onmouseup="isMouseDown = false;"' + + ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"' + + ' onmouseover="isMouseOver = true;"' + + ' onmouseout="isMouseOver = false;"' + + '></div>'; + } + + el.innerHTML = h; +} + +function generateWebColors() { + var el = document.getElementById('webcolors'), h = '', i; + + if (el.className == 'generated') + return; + + // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. + h += '<div role="listbox" aria-labelledby="webcolors_title" tabindex="0"><table role="presentation" border="0" cellspacing="1" cellpadding="0">' + + '<tr>'; + + for (i=0; i<colors.length; i++) { + h += '<td bgcolor="' + colors[i] + '" width="10" height="10">' + + '<a href="javascript:insertAction();" role="option" tabindex="-1" aria-labelledby="web_colors_' + i + '" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');" style="display:block;width:10px;height:10px;overflow:hidden;">'; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>'; + } + h += '<span class="mceVoiceLabel" style="display:none;" id="web_colors_' + i + '">' + colors[i].toUpperCase() + '</span>'; + h += '</a></td>'; + if ((i+1) % 18 == 0) + h += '</tr><tr>'; + } + + h += '</table></div>'; + + el.innerHTML = h; + el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el.firstChild); +} + +function paintCanvas(el) { + tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { + var context; + if (canvas.getContext && (context = canvas.getContext("2d"))) { + context.fillStyle = canvas.getAttribute('data-color'); + context.fillRect(0, 0, 10, 10); + } + }); +} +function generateNamedColors() { + var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; + + if (el.className == 'generated') + return; + + for (n in named) { + v = named[n]; + h += '<a href="javascript:insertAction();" role="option" tabindex="-1" aria-labelledby="named_colors_' + i + '" onfocus="showColor(\'' + n + '\',\'' + v + '\');" onmouseover="showColor(\'' + n + '\',\'' + v + '\');" style="background-color: ' + n + '">'; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>'; + } + h += '<span class="mceVoiceLabel" style="display:none;" id="named_colors_' + i + '">' + v + '</span>'; + h += '</a>'; + i++; + } + + el.innerHTML = h; + el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el); +} + +function enableKeyboardNavigation(el) { + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: el, + items: tinyMCEPopup.dom.select('a', el) + }, tinyMCEPopup.dom); +} + +function dechex(n) { + return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); +} + +function computeColor(e) { + var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB; + + x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0); + y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0); + + partWidth = document.getElementById('colors').width / 6; + partDetail = detail / 2; + imHeight = document.getElementById('colors').height; + + r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; + g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); + b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); + + coef = (imHeight - y) / imHeight; + r = 128 + (r - 128) * coef; + g = 128 + (g - 128) * coef; + b = 128 + (b - 128) * coef; + + changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); + updateLight(r, g, b); +} + +function updateLight(r, g, b) { + var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; + + for (i=0; i<detail; i++) { + if ((i>=0) && (i<partDetail)) { + finalCoef = i / partDetail; + finalR = dechex(255 - (255 - r) * finalCoef); + finalG = dechex(255 - (255 - g) * finalCoef); + finalB = dechex(255 - (255 - b) * finalCoef); + } else { + finalCoef = 2 - i / partDetail; + finalR = dechex(r * finalCoef); + finalG = dechex(g * finalCoef); + finalB = dechex(b * finalCoef); + } + + color = finalR + finalG + finalB; + + setCol('gs' + i, '#'+color); + } +} + +function changeFinalColor(color) { + if (color.indexOf('#') == -1) + color = convertRGBToHex(color); + + setCol('preview', color); + document.getElementById('color').value = color; +} + +function setCol(e, c) { + try { + document.getElementById(e).style.backgroundColor = c; + } catch (ex) { + // Ignore IE warning + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/js/tiny_mce/themes/advanced/js/image.js b/js/tiny_mce/themes/advanced/js/image.js new file mode 100644 index 000000000..719e7e2b4 --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/image.js @@ -0,0 +1,247 @@ +var ImageDialog = { + preInit : function() { + var url; + + tinyMCEPopup.requireLangPack(); + + if (url = tinyMCEPopup.getParam("external_image_list_url")) + document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '180px'; + + e = ed.selection.getNode(); + + this.fillFileList('image_list', 'tinyMCEImageList'); + + if (e.nodeName == 'IMG') { + f.src.value = ed.dom.getAttrib(e, 'src'); + f.alt.value = ed.dom.getAttrib(e, 'alt'); + f.border.value = this.getAttrib(e, 'border'); + f.vspace.value = this.getAttrib(e, 'vspace'); + f.hspace.value = this.getAttrib(e, 'hspace'); + f.width.value = ed.dom.getAttrib(e, 'width'); + f.height.value = ed.dom.getAttrib(e, 'height'); + f.insert.value = ed.getLang('update'); + this.styleVal = ed.dom.getAttrib(e, 'style'); + selectByValue(f, 'image_list', f.src.value); + selectByValue(f, 'align', this.getAttrib(e, 'align')); + this.updateStyle(); + } + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + update : function() { + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; + + tinyMCEPopup.restoreSelection(); + + if (f.src.value === '') { + if (ed.selection.getNode().nodeName == 'IMG') { + ed.dom.remove(ed.selection.getNode()); + ed.execCommand('mceRepaint'); + } + + tinyMCEPopup.close(); + return; + } + + if (!ed.settings.inline_styles) { + args = tinymce.extend(args, { + vspace : nl.vspace.value, + hspace : nl.hspace.value, + border : nl.border.value, + align : getSelectValue(f, 'align') + }); + } else + args.style = this.styleVal; + + tinymce.extend(args, { + src : f.src.value.replace(/ /g, '%20'), + alt : f.alt.value, + width : f.width.value, + height : f.height.value + }); + + el = ed.selection.getNode(); + + if (el && el.nodeName == 'IMG') { + ed.dom.setAttribs(el, args); + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); + } else { + ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1}); + ed.dom.setAttribs('__mce_tmp', args); + ed.dom.setAttrib('__mce_tmp', 'id', ''); + ed.undoManager.add(); + } + + tinyMCEPopup.close(); + }, + + updateStyle : function() { + var dom = tinyMCEPopup.dom, st, v, f = document.forms[0]; + + if (tinyMCEPopup.editor.settings.inline_styles) { + st = tinyMCEPopup.dom.parseStyle(this.styleVal); + + // Handle align + v = getSelectValue(f, 'align'); + if (v) { + if (v == 'left' || v == 'right') { + st['float'] = v; + delete st['vertical-align']; + } else { + st['vertical-align'] = v; + delete st['float']; + } + } else { + delete st['float']; + delete st['vertical-align']; + } + + // Handle border + v = f.border.value; + if (v || v == '0') { + if (v == '0') + st['border'] = '0'; + else + st['border'] = v + 'px solid black'; + } else + delete st['border']; + + // Handle hspace + v = f.hspace.value; + if (v) { + delete st['margin']; + st['margin-left'] = v + 'px'; + st['margin-right'] = v + 'px'; + } else { + delete st['margin-left']; + delete st['margin-right']; + } + + // Handle vspace + v = f.vspace.value; + if (v) { + delete st['margin']; + st['margin-top'] = v + 'px'; + st['margin-bottom'] = v + 'px'; + } else { + delete st['margin-top']; + delete st['margin-bottom']; + } + + // Merge + st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); + this.styleVal = dom.serializeStyle(st, 'img'); + } + }, + + getAttrib : function(e, at) { + var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; + + if (ed.settings.inline_styles) { + switch (at) { + case 'align': + if (v = dom.getStyle(e, 'float')) + return v; + + if (v = dom.getStyle(e, 'vertical-align')) + return v; + + break; + + case 'hspace': + v = dom.getStyle(e, 'margin-left') + v2 = dom.getStyle(e, 'margin-right'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'vspace': + v = dom.getStyle(e, 'margin-top') + v2 = dom.getStyle(e, 'margin-bottom'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'border': + v = 0; + + tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { + sv = dom.getStyle(e, 'border-' + sv + '-width'); + + // False or not the same as prev + if (!sv || (sv != v && v !== 0)) { + v = 0; + return false; + } + + if (sv) + v = sv; + }); + + if (v) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + } + } + + if (v = dom.getAttrib(e, at)) + return v; + + return ''; + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.width.value = f.height.value = ""; + }, + + updateImageData : function() { + var f = document.forms[0], t = ImageDialog; + + if (f.width.value == "") + f.width.value = t.preloadImg.width; + + if (f.height.value == "") + f.height.value = t.preloadImg.height; + }, + + getImageData : function() { + var f = document.forms[0]; + + this.preloadImg = new Image(); + this.preloadImg.onload = this.updateImageData; + this.preloadImg.onerror = this.resetImageData; + this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); + } +}; + +ImageDialog.preInit(); +tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/js/tiny_mce/themes/advanced/js/link.js b/js/tiny_mce/themes/advanced/js/link.js new file mode 100644 index 000000000..e67d868a2 --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/link.js @@ -0,0 +1,153 @@ +tinyMCEPopup.requireLangPack(); + +var LinkDialog = { + preInit : function() { + var url; + + if (url = tinyMCEPopup.getParam("external_link_list_url")) + document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '180px'; + + this.fillClassList('class_list'); + this.fillFileList('link_list', 'tinyMCELinkList'); + this.fillTargetList('target_list'); + + if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { + f.href.value = ed.dom.getAttrib(e, 'href'); + f.linktitle.value = ed.dom.getAttrib(e, 'title'); + f.insert.value = ed.getLang('update'); + selectByValue(f, 'link_list', f.href.value); + selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); + selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); + } + }, + + update : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); + + tinyMCEPopup.restoreSelection(); + e = ed.dom.getParent(ed.selection.getNode(), 'A'); + + // Remove element if there is no href + if (!f.href.value) { + if (e) { + b = ed.selection.getBookmark(); + ed.dom.remove(e, 1); + ed.selection.moveToBookmark(b); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + return; + } + } + + // Create new anchor elements + if (e == null) { + ed.getDoc().execCommand("unlink", false, null); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); + + tinymce.each(ed.dom.select("a"), function(n) { + if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { + e = n; + + ed.dom.setAttribs(e, { + href : href, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + }); + } else { + ed.dom.setAttribs(e, { + href : href, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + + // Don't move caret if selection was image + if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { + ed.focus(); + ed.selection.select(e); + ed.selection.collapse(0); + tinyMCEPopup.storeSelection(); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + }, + + checkPrefix : function(n) { + if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) + n.value = 'mailto:' + n.value; + + if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) + n.value = 'http://' + n.value; + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillClassList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { + cl = []; + + tinymce.each(v.split(';'), function(v) { + var p = v.split('='); + + cl.push({'title' : p[0], 'class' : p[1]}); + }); + } else + cl = tinyMCEPopup.editor.dom.getClasses(); + + if (cl.length > 0) { + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + + tinymce.each(cl, function(o) { + lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillTargetList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v; + + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); + + if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { + tinymce.each(v.split(','), function(v) { + v = v.split('='); + lst.options[lst.options.length] = new Option(v[0], v[1]); + }); + } + } +}; + +LinkDialog.preInit(); +tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); diff --git a/js/tiny_mce/themes/advanced/js/source_editor.js b/js/tiny_mce/themes/advanced/js/source_editor.js new file mode 100644 index 000000000..9cf6b1a29 --- /dev/null +++ b/js/tiny_mce/themes/advanced/js/source_editor.js @@ -0,0 +1,56 @@ +tinyMCEPopup.requireLangPack(); +tinyMCEPopup.onInit.add(onLoadInit); + +function saveContent() { + tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Remove Gecko spellchecking + if (tinymce.isGecko) + document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); + + document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); + + if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { + setWrap('soft'); + document.getElementById('wraped').checked = true; + } + + resizeInputs(); +} + +function setWrap(val) { + var v, n, s = document.getElementById('htmlSource'); + + s.wrap = val; + + if (!tinymce.isIE) { + v = s.value; + n = s.cloneNode(false); + n.setAttribute("wrap", val); + s.parentNode.replaceChild(n, s); + n.value = v; + } +} + +function toggleWordWrap(elm) { + if (elm.checked) + setWrap('soft'); + else + setWrap('off'); +} + +function resizeInputs() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('htmlSource'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 65) + 'px'; + } +} diff --git a/js/tiny_mce/themes/advanced/langs/en.js b/js/tiny_mce/themes/advanced/langs/en.js new file mode 100755 index 000000000..0668596df --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/en.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.advanced',{"underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)",dd:"Definition description",dt:"Definition term ",samp:"Code sample",code:"Code",blockquote:"Blockquote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"Div",paragraph:"Paragraph",block:"Format",fontdefault:"Font family","font_size":"Font size","style_select":"Styles","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","more_colors":"More colors","toolbar_focus":"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Are you sure you want clear all contents?",path:"Path","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","blockquote_desc":"Blockquote","help_desc":"Help","newdocument_desc":"New document","image_props_desc":"Image properties","paste_desc":"Paste","copy_desc":"Copy","cut_desc":"Cut","anchor_desc":"Insert/edit anchor","visualaid_desc":"Toggle guidelines/invisible elements","charmap_desc":"Insert custom character","backcolor_desc":"Select background color","forecolor_desc":"Select text color","custom1_desc":"Your custom description here","removeformat_desc":"Remove formatting","hr_desc":"Insert horizontal ruler","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"Edit HTML Source","cleanup_desc":"Cleanup messy code","image_desc":"Insert/edit image","unlink_desc":"Unlink","link_desc":"Insert/edit link","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","indent_desc":"Indent","outdent_desc":"Outdent","numlist_desc":"Ordered list","bullist_desc":"Unordered list","justifyfull_desc":"Align full","justifyright_desc":"Align right","justifycenter_desc":"Align center","justifyleft_desc":"Align left","striketrough_desc":"Strikethrough"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/en_dlg.js b/js/tiny_mce/themes/advanced/langs/en_dlg.js new file mode 100755 index 000000000..a9e999a96 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/en_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('en.advanced_dlg',{"link_list":"Link list","link_is_external":"The URL you entered seems to external link, do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open link in a new window","link_target_same":"Open link in the same window","link_target":"Target","link_url":"Link URL","link_title":"Insert/edit link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text bottom","image_align_texttop":"Text top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal space","image_vspace":"Vertical space","image_dimensions":"Dimensions","image_alt":"Image description","image_list":"Image list","image_border":"Border","image_src":"Image URL","image_title":"Insert/edit image","charmap_title":"Select custom character","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a color","code_wordwrap":"Word wrap","code_title":"HTML Source Editor","anchor_name":"Anchor name","anchor_title":"Insert/edit anchor","about_loaded":"Loaded plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/es.js b/js/tiny_mce/themes/advanced/langs/es.js new file mode 100755 index 000000000..b96da6028 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/es.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.advanced',{"underline_desc":"Subrayado (Ctrl+U)","italic_desc":"Cursiva (Ctrl+I)","bold_desc":"Negrita (Ctrl+B)",dd:"Descripci\u00f3n de definici\u00f3n",dt:"T\u00e9rmino de definici\u00f3n",samp:"Ejemplo de c\u00f3digo",code:"C\u00f3digo",blockquote:"Cita",h6:"Encabezado 6",h5:"Encabezado 5",h4:"Encabezado 4",h3:"Encabezado 3",h2:"Encabezado 2",h1:"Encabezado 1",pre:"Preformateado",address:"Direcci\u00f3n",div:"Div",paragraph:"P\u00e1rrafo",block:"Formato",fontdefault:"Fuente","font_size":"Tama\u00f1o","style_select":"Estilos","more_colors":"M\u00e1s colores","toolbar_focus":"Ir a los botones de herramientas - Alt+Q, Ir al editor - Alt-Z, Ir a la ruta del elemento - Alt-X",newdocument:" \u00bfSeguro que desea limpiar todo el contenido?",path:"Ruta","clipboard_msg":"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\\n \u00bfQuiere m\u00e1s informaci\u00f3n sobre este tema?","blockquote_desc":"Cita","help_desc":"Ayuda","newdocument_desc":"Nuevo documento","image_props_desc":"Propiedades de imagen","paste_desc":"Pegar","copy_desc":"Copiar","cut_desc":"Cortar","anchor_desc":"Insertar/editar ancla","visualaid_desc":"Mostrar/ocultar l\u00ednea de gu\u00eda/elementos invisibles","charmap_desc":"Insertar caracteres personalizados","backcolor_desc":"Elegir color de fondo","forecolor_desc":"Elegir color del texto","custom1_desc":"Su descripci\u00f3n personal aqu\u00ed","removeformat_desc":"Limpiar formato","hr_desc":"Insertar regla horizontal","sup_desc":"Super\u00edndice","sub_desc":"Sub\u00edndice","code_desc":"Editar c\u00f3digo HTML","cleanup_desc":"Limpiar c\u00f3digo basura","image_desc":"Insertar/editar imagen","unlink_desc":"Quitar hiperv\u00ednculo","link_desc":"Insertar/editar hiperv\u00ednculo","redo_desc":"Rehacer (Ctrl+Y)","undo_desc":"Deshacer (Ctrl+Z)","indent_desc":"Aumentar sangr\u00eda","outdent_desc":"Reducir sangr\u00eda","numlist_desc":"Lista ordenada","bullist_desc":"Lista desordenada","justifyfull_desc":"Justificar","justifyright_desc":"Alinear a la derecha","justifycenter_desc":"Alinear al centro","justifyleft_desc":"Alinear a la izquierda","striketrough_desc":"Tachado","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/es_dlg.js b/js/tiny_mce/themes/advanced/langs/es_dlg.js new file mode 100755 index 000000000..b7979317f --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/es_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('es.advanced_dlg',{"link_list":"Lista de hiperv\u00ednculos","link_is_external":"La URL que introdujo parece ser un v\u00ednculo externo, \u00bfdesea agregar el prefijo http:// necesario?","link_is_email":"La URL que introdujo parece ser una direcci\u00f3n de email, \u00bfdesea agregar el prefijo mailto: necesario?","link_titlefield":"T\u00edtulo","link_target_blank":"Abrir v\u00ednculo en una ventana nueva","link_target_same":"Abrir v\u00ednculo en la misma ventana","link_target":"Destino","link_url":"URL del hiperv\u00ednculo","link_title":"Insertar/editar hiperv\u00ednculo","image_align_right":"Derecha","image_align_left":"Izquierda","image_align_textbottom":"Texto debajo","image_align_texttop":"Texto arriba","image_align_bottom":"Debajo","image_align_middle":"Medio","image_align_top":"Arriba","image_align_baseline":"L\u00ednea base","image_align":"Alineaci\u00f3n","image_hspace":"Espacio horizontal","image_vspace":"Espacio vertical","image_dimensions":"Dimensi\u00f3n","image_alt":"Descripci\u00f3n de la Imagen","image_list":"Lista de la Imagen","image_border":"Borde","image_src":"URL de la Imagen","image_title":"Insertar/editar imagen","charmap_title":"Elegir caracter personalizado","colorpicker_name":"Nombre:","colorpicker_color":"Color:","colorpicker_named_title":"Colores nombrados","colorpicker_named_tab":"Nombrados","colorpicker_palette_title":"Paleta de colores","colorpicker_palette_tab":"Paleta","colorpicker_picker_title":"Paleta de color","colorpicker_picker_tab":"Selector","colorpicker_title":"Elegir color","code_wordwrap":"Ajustar al margen","code_title":"Editor del c\u00f3digo fuente HTML","anchor_name":"Nombre del ancla","anchor_title":"Insertar/editar ancla","about_loaded":"Complementos cargados","about_version":"Versi\u00f3n","about_author":"Autor","about_plugin":"Complemento","about_plugins":"Complementos","about_license":"Licencia","about_help":"Ayuda","about_general":"Acerca de ","about_title":"Acerca de TinyMCE","anchor_invalid":"Especifique un nombre v\u00e1lido para liga"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/et.js b/js/tiny_mce/themes/advanced/langs/et.js new file mode 100755 index 000000000..205df1575 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/et.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.advanced',{underline_desc:"Allajoonitud (Ctrl+U)",italic_desc:"Kursiiv (Ctrl+I)",bold_desc:"Rasvane (Ctrl+B)",dd:"Defineeringu kirjeldus",dt:"Defineeringu tingimus",samp:"Koodi n\u00e4ide",code:"Kood",blockquote:"Plokkviide",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Eelformeeritud",address:"Aadress",div:"Div",paragraph:"Paragraaf",block:"Formaat",fontdefault:"Font",font_size:"Fondi suurus",style_select:"Stiilid",more_colors:"Rohkem v\u00e4rve",toolbar_focus:"H\u00fcppa t\u00f6\u00f6riista nuppudele - Alt+Q, H\u00fcppa redigeerijale - Alt-Z, H\u00fcppa elemendi teele - Alt-X",newdocument:"Oled sa kindel, et tahad kustutada k\u00f5ik sisud?",path:"Tee",clipboard_msg:"Kopeeri/L\u00f5ika/Kleebi ei ole Mozillas ja Firefoxis saadaval. Kas soovid rohkem infot selle probleemi kohta?",blockquote_desc:"Plokkviide",help_desc:"Abi",newdocument_desc:"Uus dokument",image_props_desc:"Pildi kirjeldus",paste_desc:"Kleebi",copy_desc:"Kopeeri",cut_desc:"L\u00f5ika",anchor_desc:"Sisesta/redigeeri ankur",visualaid_desc:"L\u00fclita \u00fcmber juhtjooned/n\u00e4htamatud elemendid",charmap_desc:"Sisesta kohandatud kirjam\u00e4rk",backcolor_desc:"Vali tausta v\u00e4rv",forecolor_desc:"Vali teksti v\u00e4rv",custom1_desc:"Teie kohandatud kirjeldus siia",removeformat_desc:"Eemalda vormindus",hr_desc:"Sisesta horisontaalne joonlaud",sup_desc:"\u00dclaindeks",sub_desc:"Alaindeks",code_desc:"Redigeeri HTML l\u00e4htekoodi",cleanup_desc:"Puhasta segane kood",image_desc:"Sisesta/redigeeri pilt",unlink_desc:"Eemalda link",link_desc:"Sisesta/redigeeri link",redo_desc:"Tee uuesti (Ctrl+Y)",undo_desc:"V\u00f5ta tagasi (Ctrl+Z)",indent_desc:"Taanda sisse",outdent_desc:"Taanda v\u00e4lja",numlist_desc:"Korrap\u00e4rane loetelu",bullist_desc:"Ebakorrap\u00e4rane loetelu",justifyfull_desc:"T\u00e4isjoondus",justifyright_desc:"Parem joondus",justifycenter_desc:"Keskjoondus",justifyleft_desc:"Vasak joondus",striketrough_desc:"L\u00e4bijoonitud",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/et_dlg.js b/js/tiny_mce/themes/advanced/langs/et_dlg.js new file mode 100755 index 000000000..329f29b6b --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/et_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('et.advanced_dlg',{link_list:"Lingi loetelu",link_is_external:"URL, mille sisestasite, tundub olevat v\u00e4line link, kas soovite, et lisataks http:// eesliite?",link_is_email:"URL, mille te sisestasite, tundub olevat emaili aadress, kas soovite, et lisataks mailto: eesliite?",link_titlefield:"Tiitel",link_target_blank:"Ava link uues aknas",link_target_same:"Ava link samas aknas",link_target:"Sihtala",link_url:"Link URL",link_title:"Sisesta/redigeeri link",image_align_right:"Parem",image_align_left:"Vasak",image_align_textbottom:"Teksti p\u00f5hi",image_align_texttop:"Teksti tipp",image_align_bottom:"Alumine",image_align_middle:"Keskmine",image_align_top:"\u00dclemine",image_align_baseline:"Kirjajoondus",image_align:"Reastus",image_hspace:"Horisontaalne vahe",image_vspace:"Vertikaalne vahe",image_dimensions:"Dimensioonid",image_alt:"Pildi kirjeldus",image_list:"Pildi loend",image_border:"Raam",image_src:"Pildi URL",image_title:"Sisestal/redigeeri pilt",charmap_title:"Vali kohandatud t\u00e4hem\u00e4rk",colorpicker_name:"Nimi:",colorpicker_color:"V\u00e4rv:",colorpicker_named_title:"Nimetatud v\u00e4rvid",colorpicker_named_tab:"Nimetatud",colorpicker_palette_title:"Palett v\u00e4rvid",colorpicker_palette_tab:"Palett",colorpicker_picker_title:"V\u00e4rvi korjaja",colorpicker_picker_tab:"Korjaja",colorpicker_title:"Vali v\u00e4rv",code_wordwrap:"S\u00f5na pakkimine",code_title:"HTML koodi redaktor",anchor_name:"Ankru nimi",anchor_title:"Sisesta/redigeeri ankur",about_loaded:"Laetud lisad",about_version:"Versioon",about_author:"Autor",about_plugin:"Lisa",about_plugins:"Lisad",about_license:"Litsents",about_help:"Abi",about_general:"Teave",about_title:"Teave TinyMCE kohta"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/fi.js b/js/tiny_mce/themes/advanced/langs/fi.js new file mode 100755 index 000000000..6eb796710 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/fi.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.advanced',{underline_desc:"Alleviivattu (Ctrl+U)",italic_desc:"Kursivoitu (Ctrl+I)",bold_desc:"Lihavoitu (Ctrl+B)",dd:"M\u00e4\u00e4rittelyn kuvaus",dt:"M\u00e4\u00e4rittelyn ehto ",samp:"Koodiesimerkki",code:"Koodi",blockquote:"Pitk\u00e4 lainaus",h6:"Otsikko 6",h5:"Otsikko 5",h4:"Otsikko 4",h3:"Otsikko 3",h2:"Otsikko 2",h1:"Otsikko 1",pre:"Esimuotoiltu (pre)",address:"Osoite",div:"Div",paragraph:"Kappale",block:"Muotoilu",fontdefault:"Kirjasin",font_size:"Kirjasinkoko",style_select:"Tyylit",more_colors:"Enemm\u00e4n v\u00e4rej\u00e4",toolbar_focus:"Siirry ty\u00f6kaluihin - Alt+Q, Siirry tekstieditoriin - Alt-Z, Siirry elementin polkuun - Alt-X",newdocument:"Haluatko varmasti tyhjent\u00e4\u00e4 kaiken sis\u00e4ll\u00f6n?",path:"Polku",clipboard_msg:"Kopioi/Leikkaa/Liit\u00e4 -painikkeet eiv\u00e4t toimi Mozilla ja Firefox -selaimilla. Voit kuitenkin k\u00e4ytt\u00e4\u00e4 n\u00e4pp\u00e4inyhdistelmi\u00e4 kopioimiseen (Ctrl+C), leikkaamiseen (Ctrl+X) ja liitt\u00e4miseen (Ctrl+V). Haluatko lis\u00e4\u00e4 tietoa?",blockquote_desc:"Pitk\u00e4 lainaus",help_desc:"Ohje",newdocument_desc:"Uusi tiedosto",image_props_desc:"Kuvan ominaisuudet",paste_desc:"Liit\u00e4",copy_desc:"Kopioi",cut_desc:"Leikkaa",anchor_desc:"Lis\u00e4\u00e4/Muokkaa ankkuri",visualaid_desc:"Suuntaviivat/N\u00e4kym\u00e4tt\u00f6m\u00e4t elementit",charmap_desc:"Lis\u00e4\u00e4 erikoismerkki",backcolor_desc:"Valitse taustan v\u00e4ri",forecolor_desc:"Valitse tekstin v\u00e4ri",custom1_desc:"Oma kuvauksesi t\u00e4h\u00e4n",removeformat_desc:"Poista muotoilu",hr_desc:"Lis\u00e4\u00e4 vaakasuora viivain",sup_desc:"Yl\u00e4indeksi",sub_desc:"Alaindeksi",code_desc:"Muokkaa HTML-koodia",cleanup_desc:"Siisti sekainen koodi",image_desc:"Lis\u00e4\u00e4/muuta kuva",unlink_desc:"Poista linkki",link_desc:"Lis\u00e4\u00e4/muuta linkki",redo_desc:"Tee uudelleen (Ctrl+Y)",undo_desc:"Peru (Ctrl+Z)",indent_desc:"Sisenn\u00e4",outdent_desc:"Loitonna",numlist_desc:"J\u00e4rjestetty lista",bullist_desc:"J\u00e4rjest\u00e4m\u00e4t\u00f6n lista",justifyfull_desc:"Tasattu",justifyright_desc:"Tasaus oikealle",justifycenter_desc:"Keskitetty",justifyleft_desc:"Tasaus vasemmalle",striketrough_desc:"Yliviivattu",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/fi_dlg.js b/js/tiny_mce/themes/advanced/langs/fi_dlg.js new file mode 100755 index 000000000..3a065f4e9 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/fi_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fi.advanced_dlg',{link_list:"Linkkilista",link_is_external:"Antamasi osoite n\u00e4ytt\u00e4\u00e4 johtavan ulkopuoliselle sivustolle. Haluatko lis\u00e4t\u00e4 linkin eteen http://-etuliitteen? (suositus)",link_is_email:"Antamasi osoite n\u00e4ytt\u00e4\u00e4 olevan s\u00e4hk\u00f6postiosoite. Haluatko lis\u00e4t\u00e4 siihen mailto:-etuliitteen?",link_titlefield:"Otsikko",link_target_blank:"Avaa linkki uuteen ikkunaan",link_target_same:"Avaa linkki samassa ikkunassa",link_target:"Kohde",link_url:"Linkin osoite",link_title:"Lis\u00e4\u00e4/muuta linkki",image_align_right:"Oikealle",image_align_left:"Vasemmalle",image_align_textbottom:"Tekstin alaosaan",image_align_texttop:"Tekstin yl\u00e4osaan",image_align_bottom:"Alas",image_align_middle:"Keskelle",image_align_top:"Yl\u00f6s",image_align_baseline:"Tekstin tasossa",image_align:"Tasaus",image_hspace:"Vaakasuuntainen tila",image_vspace:"Pystysuuntainen tila",image_dimensions:"Mitat",image_alt:"Kuvan kuvaus",image_list:"Kuvalista",image_border:"Reunus",image_src:"Kuvan osoite",image_title:"Lis\u00e4\u00e4/muokkaa kuvaa",charmap_title:"Valitse erikoismerkki",colorpicker_name:"Nimi:",colorpicker_color:"V\u00e4ri:",colorpicker_named_title:"Nimetyt v\u00e4rit",colorpicker_named_tab:"Nimetty",colorpicker_palette_title:"V\u00e4ripaletti",colorpicker_palette_tab:"Paletti",colorpicker_picker_title:"V\u00e4rin valitsin",colorpicker_picker_tab:"Valitsin",colorpicker_title:"Valitse v\u00e4ri",code_wordwrap:"Automaattinen rivinvaihto",code_title:"HTML-koodin muokkaus",anchor_name:"Ankkurin nimi",anchor_title:"Liit\u00e4/muokkaa ankkuria",about_loaded:"Ladatut lis\u00e4osat",about_version:"Versio",about_author:"Kirjoittaja",about_plugin:"Lis\u00e4osa",about_plugins:"Lis\u00e4osat",about_license:"Lisenssi",about_help:"Ohje",about_general:"Tietoja",about_title:"Tietoja TinyMCE:st\u00e4",anchor_invalid:"Ole hyv\u00e4 ja anna hyv\u00e4ksytty ankkurin nimi."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/fr.js b/js/tiny_mce/themes/advanced/langs/fr.js new file mode 100755 index 000000000..23e6e4087 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/fr.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.advanced',{underline_desc:"Soulign\u00e9 (Ctrl+U)",italic_desc:"Italique (Ctrl+I)",bold_desc:"Gras (Ctrl+B)",dd:"D\u00e9finition du terme",dt:"Terme \u00e0 d\u00e9finir",samp:"Exemple de code",code:"Code",blockquote:"Bloc de citation",h6:"Titre 6",h5:"Titre 5",h4:"Titre 4",h3:"Titre 3",h2:"Titre 2",h1:"Titre 1",pre:"Pr\u00e9format\u00e9",address:"Adresse",div:"Div",paragraph:"Paragraphe",block:"Format",fontdefault:"Police",font_size:"Taille police",style_select:"Styles",more_colors:"Plus de couleurs",toolbar_focus:"Atteindre les boutons de l\'\u00e9diteur - Alt+Q, Aller \u00e0 l\'\u00e9diteur - Alt-Z, Aller au chemin de l\'\u00e9l\u00e9ment - Alt-X",newdocument:"\u00cates-vous s\u00fbr de vouloir effacer l\'int\u00e9gralit\u00e9 du document ?",path:"Chemin",clipboard_msg:"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\\nSouhaitez-vous avoir plus d\'informations sur ce sujet ?",blockquote_desc:"Citation",help_desc:"Aide",newdocument_desc:"Nouveau document",image_props_desc:"Propri\u00e9t\u00e9s de l\'image",paste_desc:"Coller",copy_desc:"Copier",cut_desc:"Couper",anchor_desc:"Ins\u00e9rer / \u00e9diter une ancre",visualaid_desc:"Activer / d\u00e9sactiver les guides et les \u00e9l\u00e9ments invisibles",charmap_desc:"Ins\u00e9rer des caract\u00e8res sp\u00e9ciaux",backcolor_desc:"Choisir la couleur de surlignage",forecolor_desc:"Choisir la couleur du texte",custom1_desc:"Votre description personnalis\u00e9e ici",removeformat_desc:"Supprimer le formatage",hr_desc:"Ins\u00e9rer un trait horizontal",sup_desc:"Exposant",sub_desc:"Indice",code_desc:"\u00c9diter le code source HTML",cleanup_desc:"Nettoyer le code",image_desc:"Ins\u00e9rer / \u00e9diter l\'image",unlink_desc:"Supprimer le lien",link_desc:"Ins\u00e9rer / \u00e9diter le lien",redo_desc:"R\u00e9tablir (Ctrl+Y)",undo_desc:"Annuler (Ctrl+Z)",indent_desc:"Indenter",outdent_desc:"Retirer l\'indentation",numlist_desc:"Liste num\u00e9rot\u00e9e",bullist_desc:"Liste \u00e0 puces",justifyfull_desc:"Justifi\u00e9",justifyright_desc:"Align\u00e9 \u00e0 droite",justifycenter_desc:"Centr\u00e9",justifyleft_desc:"Align\u00e9 \u00e0 gauche",striketrough_desc:"Barr\u00e9",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/fr_dlg.js b/js/tiny_mce/themes/advanced/langs/fr_dlg.js new file mode 100755 index 000000000..6116a5120 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/fr_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('fr.advanced_dlg',{link_list:"Liste de liens",link_is_external:"L\'URL que vous avez saisie semble \u00eatre une adresse web externe. Souhaitez-vous ajouter le pr\u00e9fixe \u00ab http:// \u00bb ?",link_is_email:"L\'URL que vous avez saisie semble \u00eatre une adresse e-mail, souhaitez-vous ajouter le pr\u00e9fixe \u00ab mailto: \u00bb ?",link_titlefield:"Titre",link_target_blank:"Ouvrir dans une nouvelle fen\u00eatre",link_target_same:"Ouvrir dans la m\u00eame fen\u00eatre",link_target:"Cible",link_url:"URL du lien",link_title:"Ins\u00e9rer / \u00e9diter un lien",image_align_right:"Droite (flottant)",image_align_left:"Gauche (flottant)",image_align_textbottom:"Texte en bas",image_align_texttop:"Texte en haut",image_align_bottom:"En bas",image_align_middle:"Au milieu",image_align_top:"En haut",image_align_baseline:"Normal",image_align:"Alignement",image_hspace:"Espacement horizontal",image_vspace:"Espacement vertical",image_dimensions:"Dimensions",image_alt:"Description de l\'image",image_list:"Liste d\'images",image_border:"Bordure",image_src:"URL de l\'image",image_title:"Ins\u00e9rer / \u00e9diter une image",charmap_title:"Choisir le caract\u00e8re \u00e0 ins\u00e9rer",colorpicker_name:"Nom :",colorpicker_color:"Couleur :",colorpicker_named_title:"Couleurs nomm\u00e9es",colorpicker_named_tab:"Noms",colorpicker_palette_title:"Couleurs de la palette",colorpicker_palette_tab:"Palette",colorpicker_picker_title:"Nuancier",colorpicker_picker_tab:"Nuancier",colorpicker_title:"Choisir une couleur",code_wordwrap:"Retour \u00e0 la ligne",code_title:"\u00c9diteur de source HTML",anchor_name:"Nom de l\'ancre",anchor_title:"Ins\u00e9rer / \u00e9diter une ancre",about_loaded:"Plugins charg\u00e9s",about_version:"Version",about_author:"Auteur",about_plugin:"Plugin",about_plugins:"Plugins",about_license:"Licence",about_help:"Aide",about_general:"\u00c0 propos",about_title:"\u00c0 propos de TinyMCE",anchor_invalid:"Veuillez sp\u00e9cifier un nom d\'ancre valide."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/gl.js b/js/tiny_mce/themes/advanced/langs/gl.js new file mode 100755 index 000000000..91d68b40d --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/gl.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.advanced',{underline_desc:"Subli\u00f1ado (Ctrl+U)",italic_desc:"Cursiva (Ctrl+I)",bold_desc:"Negrita (Ctrl+B)",dd:"Descripci\u00f3n de definici\u00f3n",dt:"Termo de definici\u00f3n",samp:"Mostra de c\u00f3digo",code:"C\u00f3digo",blockquote:"Bloque de cita",h6:"Encabezamento 6",h5:"Encabezamento 5",h4:"Encabezamento 4",h3:"Encabezamento 3",h2:"Encabezamento 2",h1:"Encabezamento 1",pre:"Pre-formateado",address:"Enderezo",div:"Div",paragraph:"P\u00e1rrafo",block:"Formato",fontdefault:"Fonte",font_size:"Tama\u00f1o",style_select:"Estilos",more_colors:"M\u00e1is cores",toolbar_focus:"Ir \u00f3s bot\u00f3ns de ferramentas - Alt+Q, Ir \u00f3 editor - Alt-Z, Ir \u00e1 ruta do elemento - Alt-X",newdocument:"\u00bfSeguro que desexa limpar todo o contido?",path:"Ruta",clipboard_msg:"Copiar/Cortar/Pegar non est\u00e1 disponible en Mozilla e Firefox.\n\u00bfDesexa obter mais informaci\u00f3n sobre de este asunto?",blockquote_desc:"Cita",help_desc:"Axuda",newdocument_desc:"Novo documento",image_props_desc:"Propiedades de imaxe",paste_desc:"Pegar",copy_desc:"Copiar",cut_desc:"Cortar",anchor_desc:"Insertar/editar \u00e1ncora",visualaid_desc:"Mostrar/ocultar li\u00f1a de gu\u00eda/elementos invisibres",charmap_desc:"Insertar caracteres persoalizados",backcolor_desc:"Seleccionar cor do fondo",forecolor_desc:"Seleccionar cor do texto",custom1_desc:"A s\u00faa descripci\u00f3n persoal aqu\u00ed",removeformat_desc:"quitar formato",hr_desc:"Insertar regra horizontal",sup_desc:"Super\u00edndice",sub_desc:"Sub\u00edndice",code_desc:"Editar c\u00f3digo HTML",cleanup_desc:"Limpiar lixo no c\u00f3digo",image_desc:"Insertar/editar imaxe",unlink_desc:"Quitar hiperv\u00ednculo",link_desc:"Insertar/editar hiperv\u00ednculo",redo_desc:"Re-facer (Ctrl+Y)",undo_desc:"Desfacer (Ctrl+Z)",indent_desc:"Aumentar sangr\u00eda",outdent_desc:"Reducir sangr\u00eda",numlist_desc:"Lista ordenada",bullist_desc:"Lista desordenada",justifyfull_desc:"Xustificar",justifyright_desc:"Ali\u00f1ar \u00e1 dereita",justifycenter_desc:"Ali\u00f1ar \u00f3 centro",justifyleft_desc:"Ali\u00f1ar \u00e1 esquerda",striketrough_desc:"Tachado",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/gl_dlg.js b/js/tiny_mce/themes/advanced/langs/gl_dlg.js new file mode 100755 index 000000000..4496cdc98 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/gl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('gl.advanced_dlg',{link_list:"Lista de hiperv\u00ednculos",link_is_external:"A URL introducida semella ser un v\u00ednculo externo, \u00bfDesexa engadi-lo prefixo necesario http://?",link_is_email:"A URL introducida semella ser un enderezo de e-mail, \u00bfDesexa engadi-lo prefixo necesario mailto:?",link_titlefield:"T\u00edtulo",link_target_blank:"Abrir v\u00ednculo nunha vent\u00e1 nova",link_target_same:"Abrir v\u00ednculo na mesma vent\u00e1",link_target:"Obxetivo",link_url:"URL do enlace",link_title:"Insertar/editar enlace",image_align_right:"Dereita",image_align_left:"Esquerda",image_align_textbottom:"Texto abaixo",image_align_texttop:"Texto arriba",image_align_bottom:"Abaixo",image_align_middle:"Medio",image_align_top:"Arriba",image_align_baseline:"Li\u00f1a base",image_align:"Ali\u00f1aci\u00f3n",image_hspace:"Espacio horizontal",image_vspace:"Espacio vertical",image_dimensions:"Dimensi\u00f3n",image_alt:"Descripci\u00f3n da imaxe",image_list:"Lista de Imaxes",image_border:"Borde",image_src:"URL da imaxe",image_title:"Insertar/editar imaxe",charmap_title:"Seleccionar caracter personalizado",colorpicker_name:"Nome:",colorpicker_color:"Cor:",colorpicker_named_title:"Cores nomeados",colorpicker_named_tab:"Nomeados",colorpicker_palette_title:"Paleta de cores",colorpicker_palette_tab:"Paleta",colorpicker_picker_title:"Selector de cores",colorpicker_picker_tab:"Selector",colorpicker_title:"Seleccionar cor",code_wordwrap:"Cortar li\u00f1as autom\u00e1ticamente",code_title:"Editor HTML",anchor_name:"Nome da \u00e1ncora",anchor_title:"Insertar/editar \u00e1ncora",about_loaded:"Comprementos cargados",about_version:"Versi\u00f3n",about_author:"Autor",about_plugin:"Compremento",about_plugins:"Comprementos",about_license:"Licencia",about_help:"Axuda",about_general:"Sobre",about_title:"Sobre TinyMCE"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/he.js b/js/tiny_mce/themes/advanced/langs/he.js new file mode 100755 index 000000000..a8ed68c02 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/he.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.advanced',{underline_desc:"\u05e7\u05d5 \u05ea\u05d7\u05ea\u05d5\u05df (Ctrl+U)",italic_desc:"\u05e0\u05d8\u05d5\u05d9 (Ctrl+I)",bold_desc:"\u05de\u05d5\u05d3\u05d2\u05e9 (Ctrl+B)",dd:"\u05d4\u05d2\u05d3\u05e8\u05ea \u05d4\u05de\u05d5\u05e9\u05d2",dt:"\u05de\u05d5\u05e9\u05d2",samp:"\u05d3\u05d5\u05d2\u05de\u05ea \u05e7\u05d5\u05d3",code:"\u05e7\u05d5\u05d3",blockquote:"\u05e6\u05d9\u05d8\u05d5\u05d8 \u05e7\u05d8\u05e2",h6:"\u05db\u05d5\u05ea\u05e8\u05ea 6",h5:"\u05db\u05d5\u05ea\u05e8\u05ea 5",h4:"\u05db\u05d5\u05ea\u05e8\u05ea 4",h3:"\u05db\u05d5\u05ea\u05e8\u05ea 3",h2:"\u05db\u05d5\u05ea\u05e8\u05ea 2",h1:"\u05db\u05d5\u05ea\u05e8\u05ea 1",pre:"Preformatted",address:"\u05db\u05ea\u05d5\u05d1\u05ea",div:"Div",paragraph:"\u05e4\u05e1\u05e7\u05d4",block:"\u05e2\u05d9\u05e6\u05d5\u05d1",fontdefault:"\u05d2\u05d5\u05e4\u05df",font_size:"\u05d2\u05d5\u05d3\u05dc \u05d2\u05d5\u05e4\u05df",style_select:"\u05e1\u05d2\u05e0\u05d5\u05e0\u05d5\u05ea",more_colors:"\u05e2\u05d5\u05d3 \u05e6\u05d1\u05e2\u05d9\u05dd",toolbar_focus:"\u05d4\u05e2\u05d1\u05e8\u05d4 \u05dc\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd - Alt+Q, \u05d4\u05e2\u05d1\u05e8\u05d4 \u05dc\u05de\u05e2\u05d1\u05d3 \u05ea\u05de\u05dc\u05d9\u05dc\u05d9\u05dd - Alt-Z, \u05d4\u05e2\u05d1\u05e8\u05d4 \u05dc\u05e0\u05ea\u05d9\u05d1 \u05d4\u05d0\u05dc\u05de\u05d8\u05d9\u05dd - Alt-X",newdocument:"\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05d0\u05ea \u05db\u05dc \u05d4\u05ea\u05d5\u05db\u05df?",path:"path",clipboard_msg:"\u05d4\u05e2\u05ea\u05e7/\u05d2\u05d6\u05d5\u05e8/\u05d4\u05d3\u05d1\u05e7 \u05dc\u05d0 \u05d6\u05de\u05d9\u05e0\u05d9\u05dd \u05d1 Mozilla \u05d5\u05d1-Firefox.\n \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e7\u05d1\u05dc \u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3 \u05e2\u05dc \u05d4\u05e0\u05d5\u05e9\u05d0?",blockquote_desc:"\u05e6\u05d9\u05d8\u05d5\u05d8",help_desc:"\u05e2\u05d6\u05e8\u05d4",newdocument_desc:"\u05de\u05e1\u05de\u05da \u05d7\u05d3\u05e9",image_props_desc:"\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4",paste_desc:"\u05d4\u05d3\u05d1\u05e7\u05d4",copy_desc:"\u05d4\u05e2\u05ea\u05e7\u05d4",cut_desc:"\u05d2\u05d6\u05d9\u05e8\u05d4",anchor_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05d9\u05de\u05e0\u05d9\u05d4",visualaid_desc:"\u05d4\u05e6\u05d2\u05d4 \u05d0\u05d5 \u05d4\u05e1\u05ea\u05e8\u05d4 \u05e9\u05dc \u05e1\u05d9\u05de\u05d5\u05e0\u05d9 \u05e2\u05d9\u05e6\u05d5\u05d1",charmap_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05e1\u05d9\u05de\u05df",backcolor_desc:"\u05d1\u05d7\u05d9\u05e8\u05ea \u05e6\u05d1\u05e2 \u05e8\u05e7\u05e2",forecolor_desc:"\u05d1\u05d7\u05d9\u05e8\u05ea \u05e6\u05d1\u05e2 \u05d2\u05d5\u05e4\u05df",custom1_desc:"\u05d4\u05ea\u05d0\u05d5\u05e8 \u05e9\u05dc\u05da \u05db\u05d0\u05d5",removeformat_desc:"\u05d4\u05e1\u05e8\u05ea \u05e2\u05d9\u05e6\u05d5\u05d1",hr_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05e7\u05d5 \u05de\u05e4\u05e8\u05d9\u05d3",sup_desc:"\u05db\u05ea\u05d1 \u05ea\u05d7\u05ea\u05d9",sub_desc:"\u05db\u05ea\u05d1 \u05e2\u05d9\u05dc\u05d9",code_desc:"\u05e2\u05e8\u05d9\u05db\u05ea \u05e7\u05d5\u05d3 HTML",cleanup_desc:"\u05e0\u05d9\u05e7\u05d5\u05d9 \u05e7\u05d5\u05d3",image_desc:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05d3\u05e3 \u05ea\u05de\u05d5\u05e0\u05d4",unlink_desc:"\u05d4\u05e1\u05e8\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8",link_desc:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8",redo_desc:"\u05d7\u05d6\u05e8\u05d4 \u05e2\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 (Ctrl+Y)",undo_desc:"\u05d1\u05d9\u05d8\u05d5\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 (Ctrl+Z)",indent_desc:"\u05d4\u05e7\u05d8\u05e0\u05ea \u05db\u05e0\u05d9\u05e1\u05d4",outdent_desc:"\u05d4\u05d2\u05d3\u05dc\u05ea \u05db\u05e0\u05d9\u05e1\u05d4",numlist_desc:"\u05de\u05e1\u05e4\u05d5\u05e8",bullist_desc:"\u05ea\u05d1\u05dc\u05d9\u05d8\u05d9\u05dd",justifyfull_desc:"\u05d9\u05d9\u05e9\u05d5\u05e8 \u05dc\u05e9\u05e0\u05d9 \u05d4\u05e6\u05d3\u05d3\u05d9\u05dd",justifyright_desc:"\u05d9\u05d9\u05e9\u05d5\u05e8 \u05d8\u05e7\u05e1\u05d8 \u05dc\u05d9\u05de\u05d9\u05df",justifycenter_desc:"\u05de\u05d9\u05e8\u05db\u05d5\u05d6 \u05d8\u05e7\u05e1\u05d8",justifyleft_desc:"\u05d9\u05d9\u05e9\u05d5\u05e8 \u05d8\u05e7\u05e1\u05d8 \u05dc\u05e9\u05de\u05d0\u05dc",striketrough_desc:"\u05e7\u05d5 \u05d7\u05d5\u05e6\u05d4",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/he_dlg.js b/js/tiny_mce/themes/advanced/langs/he_dlg.js new file mode 100755 index 000000000..13dbc3562 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/he_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('he.advanced_dlg',{link_list:"\u05e8\u05e9\u05d9\u05de\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd",link_is_external:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4-URL \u05e9\u05d4\u05d5\u05db\u05e0\u05e1\u05d4 \u05d4\u05d9\u05d0 \u05db\u05db\u05dc \u05d4\u05e0\u05e8\u05d0\u05d4 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05d0\u05ea \u05d4\u05e7\u05d9\u05d3\u05d5\u05de\u05ea http:// \u05d4\u05e0\u05d3\u05e8\u05e9\u05ea?",link_is_email:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4-URL \u05e9\u05d4\u05d5\u05db\u05e0\u05e1\u05d4 \u05d4\u05d9\u05d0 \u05db\u05db\u05dc \u05d4\u05e0\u05e8\u05d0\u05d4 \u05db\u05ea\u05d5\u05d1\u05ea \u05de\u05d9\u05d9\u05dc \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05d0\u05ea \u05d4\u05e7\u05d9\u05d3\u05d5\u05de\u05ea MAILTO \u05d4\u05e0\u05d3\u05e8\u05e9\u05ea?",link_titlefield:"\u05db\u05d5\u05ea\u05e8\u05ea",link_target_blank:"\u05e4\u05ea\u05d7 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d1\u05d7\u05dc\u05d5\u05df \u05d7\u05d3\u05e9",link_target_same:"\u05e4\u05ea\u05d7 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d1\u05d0\u05d5\u05ea\u05d5 \u05d7\u05dc\u05d5\u05df",link_target:"\u05d9\u05e2\u05d3",link_url:"\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05e7\u05d9\u05e9\u05d5\u05e8",link_title:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8",image_align_right:"\u05d9\u05de\u05d9\u05df",image_align_left:"\u05e9\u05de\u05d0\u05dc",image_align_textbottom:"\u05e7\u05e6\u05d4 \u05d4\u05ea\u05d7\u05ea\u05d5\u05df \u05e9\u05dc \u05d4\u05d8\u05e7\u05e1\u05d8",image_align_texttop:"\u05e7\u05e6\u05d4 \u05d4\u05e2\u05dc\u05d9\u05d5\u05df \u05e9\u05dc \u05d4\u05d8\u05e7\u05e1\u05d8",image_align_bottom:"\u05e7\u05e6\u05d4 \u05d4\u05ea\u05d7\u05ea\u05d5\u05df",image_align_middle:"\u05d0\u05de\u05e6\u05e2",image_align_top:"\u05e7\u05e6\u05d4 \u05d4\u05e2\u05dc\u05d9\u05d5\u05df",image_align_baseline:"\u05e7\u05d5 \u05d4\u05d4\u05ea\u05d7\u05dc\u05d4",image_align:"\u05d9\u05d9\u05e9\u05d5\u05e8",image_hspace:"\u05e8\u05d5\u05d5\u05d7 \u05d0\u05d5\u05e4\u05e7\u05d9",image_vspace:"\u05e8\u05d5\u05d5\u05d7 \u05d0\u05e0\u05db\u05d9",image_dimensions:"\u05d2\u05d5\u05d3\u05dc",image_alt:"\u05ea\u05d9\u05d0\u05d5\u05e8",image_list:"\u05e8\u05e9\u05d9\u05de\u05d4",image_border:"\u05d2\u05d1\u05d5\u05dc",image_src:"\u05db\u05ea\u05d5\u05d1\u05ea:",image_title:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05ea\u05de\u05d5\u05e0\u05d4",charmap_title:"\u05d1\u05d7\u05d9\u05e8\u05ea \u05e1\u05d9\u05de\u05df",colorpicker_name:"\u05e9\u05dd:",colorpicker_color:"\u05e6\u05d1\u05e2:",colorpicker_named_title:"\u05e6\u05d1\u05e2\u05d9\u05dd \u05d1\u05e2\u05dc\u05d9 \u05e9\u05de\u05d5\u05ea",colorpicker_named_tab:"\u05e6\u05d1\u05e2\u05d9\u05dd \u05d1\u05e2\u05dc\u05d9 \u05e9\u05de\u05d5\u05ea",colorpicker_palette_title:"\u05dc\u05d5\u05d7 \u05e6\u05d1\u05e2\u05d9\u05dd",colorpicker_palette_tab:"\u05dc\u05d5\u05d7 \u05e6\u05d1\u05e2\u05d9\u05dd",colorpicker_picker_title:"\u05d1\u05d5\u05e8\u05e8 \u05d4\u05e6\u05d1\u05e2\u05d9\u05dd",colorpicker_picker_tab:"\u05d1\u05d5\u05e8\u05e8",colorpicker_title:"\u05d1\u05d7\u05d9\u05e8\u05ea \u05e6\u05d1\u05e2",code_wordwrap:"\u05d2\u05dc\u05d9\u05e9\u05ea \u05d8\u05e7\u05e1\u05d8",code_title:"\u05e2\u05d5\u05e8\u05da \u05d4-HTML",anchor_name:"\u05e9\u05dd \u05d4\u05e1\u05d9\u05de\u05e0\u05d9\u05d4",anchor_title:"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05d9\u05de\u05e0\u05d9\u05d4",about_loaded:"\u05ea\u05d5\u05e1\u05e4\u05d5\u05ea \u05e4\u05e2\u05d9\u05dc\u05d5\u05ea",about_version:"\u05d2\u05d9\u05e8\u05e1\u05d4",about_author:"\u05d9\u05d5\u05e6\u05e8",about_plugin:"\u05ea\u05d5\u05e1\u05e4\u05ea",about_plugins:"\u05ea\u05d5\u05e1\u05e4\u05d5\u05ea",about_license:"\u05e8\u05e9\u05d9\u05d5\u05df",about_help:"\u05e2\u05d6\u05e8\u05d4",about_general:"\u05d0\u05d5\u05d3\u05d5\u05ea",about_title:"\u05d0\u05d5\u05d3\u05d5\u05ea TinyMCE",anchor_invalid:"\u05e0\u05d0 \u05dc\u05e6\u05d9\u05d9\u05df \u05e9\u05dd \u05d7\u05d5\u05e7\u05d9"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/hu.js b/js/tiny_mce/themes/advanced/langs/hu.js new file mode 100755 index 000000000..9d731b6ce --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/hu.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.advanced',{"underline_desc":"Al\u00e1h\u00fazott (Ctrl+U)","italic_desc":"D\u0151lt (Ctrl+I)","bold_desc":"F\u00e9lk\u00f6v\u00e9r (Ctrl+B)",dd:"Defin\u00edci\u00f3 a defin\u00edci\u00f3s list\u00e1ban",dt:"Defini\u00e1lt kifejez\u00e9s a defin\u00edci\u00f3s list\u00e1ban",samp:"K\u00f3d minta",code:"K\u00f3d",blockquote:"Id\u00e9zet",h6:"C\u00edmsor 6",h5:"C\u00edmsor 5",h4:"C\u00edmsor 4",h3:"C\u00edmsor 3",h2:"C\u00edmsor 2",h1:"C\u00edmsor 1",pre:"El\u0151form\u00e1zott",address:"C\u00edm",div:"Div",paragraph:"Bekezd\u00e9s",block:"Form\u00e1tum",fontdefault:"Bet\u0171t\u00edpus","font_size":"Bet\u0171m\u00e9ret","style_select":"St\u00edlusok","more_colors":"T\u00f6bb sz\u00edn","toolbar_focus":"Eszk\u00f6zgombokra ugr\u00e1s - Alt+Q, Szerkeszt\u0151h\u00f6z ugr\u00e1s - Alt-Z, Elem\u00fatvonalhoz ugr\u00e1s - Alt-X",newdocument:"Biztosan t\u00f6rli az eddigi tartalmat?",path:"\u00datvonal","clipboard_msg":"A M\u00e1sol\u00e1s/Kiv\u00e1g\u00e1s/Besz\u00far\u00e1s funkci\u00f3k nem \u00e9rhet\u0151ek el Mozilla \u00e9s Firefox alatt. K\u00edv\u00e1n t\u00f6bbet tudni err\u0151l a t\u00e9m\u00e1r\u00f3l?","blockquote_desc":"Id\u00e9zet","help_desc":"Seg\u00edts\u00e9g","newdocument_desc":"\u00daj dokumentum","image_props_desc":"K\u00e9p tulajdons\u00e1gai","paste_desc":"Besz\u00far\u00e1s","copy_desc":"M\u00e1sol\u00e1s","cut_desc":"Kiv\u00e1g\u00e1s","anchor_desc":"Horgony besz\u00far\u00e1sa/szerkeszt\u00e9se","visualaid_desc":"Vezet\u0151vonalak/nem l\u00e1that\u00f3 elemek ki-/bekapcsol\u00e1sa","charmap_desc":"Speci\u00e1lis karakter besz\u00far\u00e1sa","backcolor_desc":"H\u00e1tt\u00e9rsz\u00edn v\u00e1laszt\u00e1sa","forecolor_desc":"Sz\u00f6vegsz\u00edn v\u00e1laszt\u00e1sa","custom1_desc":"Az \u00f6n egyedi le\u00edr\u00e1sa","removeformat_desc":"Form\u00e1z\u00e1s elt\u00e1vol\u00edt\u00e1sa","hr_desc":"V\u00edzszintes elv\u00e1laszt\u00f3 besz\u00far\u00e1sa","sup_desc":"Fels\u0151 index","sub_desc":"Als\u00f3 index","code_desc":"HTML forr\u00e1s szerkeszt\u00e9se","cleanup_desc":"Rendetlen k\u00f3d takar\u00edt\u00e1sa","image_desc":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","unlink_desc":"Link megsz\u00fcntet\u00e9se","link_desc":"Link besz\u00far\u00e1sa/szerkeszt\u00e9se","redo_desc":"M\u00e9gis v\u00e9grehajt (Ctrl+Y)","undo_desc":"Visszavon\u00e1s (Ctrl+Z)","indent_desc":"Beh\u00faz\u00e1s n\u00f6vel\u00e9se","outdent_desc":"Beh\u00faz\u00e1s cs\u00f6kkent\u00e9se","numlist_desc":"Rendezett lista","bullist_desc":"Rendezetlen lista","justifyfull_desc":"Sorkiz\u00e1rt","justifyright_desc":"Jobbra z\u00e1rt","justifycenter_desc":"K\u00f6z\u00e9pre z\u00e1rt","justifyleft_desc":"Balra z\u00e1rt","striketrough_desc":"\u00c1th\u00fazott","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/hu_dlg.js b/js/tiny_mce/themes/advanced/langs/hu_dlg.js new file mode 100755 index 000000000..3da818a0d --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/hu_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('hu.advanced_dlg',{"link_list":"Link lista","link_is_external":"A be\u00edrt URL k\u00fcls\u0151 hivatkoz\u00e1snak t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges http://-vel kieg\u00e9sz\u00edteni?","link_is_email":"A be\u00edrt URL e-mail c\u00edmnek t\u0171nik, k\u00edv\u00e1nja a sz\u00fcks\u00e9ges mailto:-val kieg\u00e9sz\u00edteni?","link_titlefield":"C\u00edm","link_target_blank":"Link \u00faj ablakba nyit\u00e1sa","link_target_same":"Link azonos ablakba nyit\u00e1sa","link_target":"Target","link_url":"Link URL","link_title":"Link besz\u00far\u00e1sa/szerkeszt\u00e9se","image_align_right":"Jobbra","image_align_left":"Balra","image_align_textbottom":"Sz\u00f6veg alj\u00e1hoz","image_align_texttop":"Sz\u00f6veg tetej\u00e9hez","image_align_bottom":"Lentre","image_align_middle":"K\u00f6z\u00e9pre","image_align_top":"Fentre","image_align_baseline":"Alapvonalhoz","image_align":"Igaz\u00edt\u00e1s","image_hspace":"V\u00edzszintes t\u00e1v","image_vspace":"F\u00fcgg\u0151leges t\u00e1v","image_dimensions":"M\u00e9retek","image_alt":"K\u00e9p le\u00edr\u00e1s","image_list":"K\u00e9p lista","image_border":"Keret","image_src":"K\u00e9p URL","image_title":"K\u00e9p besz\u00far\u00e1sa/szerkeszt\u00e9se","charmap_title":"Egyedi karakter v\u00e1laszt\u00e1sa","colorpicker_name":"N\u00e9v:","colorpicker_color":"Sz\u00edn:","colorpicker_named_title":"Elnevezett sz\u00ednek","colorpicker_named_tab":"Elnevezettek","colorpicker_palette_title":"Paletta sz\u00ednek","colorpicker_palette_tab":"Paletta","colorpicker_picker_title":"Sz\u00ednv\u00e1laszt\u00f3","colorpicker_picker_tab":"V\u00e1laszt\u00f3","colorpicker_title":"Sz\u00ednv\u00e1laszt\u00e1s","code_wordwrap":"Sz\u00f6veg t\u00f6rdel\u00e9se","code_title":"HTML forr\u00e1s szerkeszt\u00e9se","anchor_name":"Horgonyn\u00e9v","anchor_title":"Horgony besz\u00far\u00e1sa/szerkeszt\u00e9se","about_loaded":"Bet\u00f6lt\u00f6tt pluginok","about_version":"Verzi\u00f3","about_author":"Szerz\u0151","about_plugin":"Plugin","about_plugins":"Pluginok","about_license":"Licenc","about_help":"Seg\u00edts\u00e9g","about_general":"R\u00f3lunk","about_title":"A TinyMCE-r\u0151l","anchor_invalid":"Adjon meg egy helyes horgony nevet."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/id.js b/js/tiny_mce/themes/advanced/langs/id.js new file mode 100755 index 000000000..f91c64106 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/id.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.advanced',{underline_desc:"Underline (Ctrl+U)",italic_desc:"Italic (Ctrl+I)",bold_desc:"Bold (Ctrl+B)",dd:"Definition description",dt:"Definition term ",samp:"Code sample",code:"Code",blockquote:"Blockquote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"Div",paragraph:"Paragraph",block:"Format",fontdefault:"Font family",font_size:"Font size",style_select:"Styles",more_colors:"More colors",toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Yakin untuk menghapus semua konten?",path:"Path",clipboard_msg:"Copy/Cut/Paste tidak tersedia pada Mozilla dan Firefox.\\nButuh info selengkapnya?",blockquote_desc:"Blockquote",help_desc:"Help",newdocument_desc:"New document",image_props_desc:"Image properties",paste_desc:"Paste",copy_desc:"Copy",cut_desc:"Cut",anchor_desc:"Insert/edit anchor",visualaid_desc:"Toggle guidelines/invisible elements",charmap_desc:"Insert custom character",backcolor_desc:"Pilih background color",forecolor_desc:"Pilih text color",custom1_desc:"Deskripsi disini",removeformat_desc:"Remove formatting",hr_desc:"Insert horizontal ruler",sup_desc:"Superscript",sub_desc:"Subscript",code_desc:"Edit HTML Source",cleanup_desc:"Cleanup messy code",image_desc:"Insert/edit image",unlink_desc:"Unlink",link_desc:"Insert/edit link",redo_desc:"Redo (Ctrl+Y)",undo_desc:"Undo (Ctrl+Z)",indent_desc:"Indent",outdent_desc:"Outdent",numlist_desc:"Ordered list",bullist_desc:"Unordered list",justifyfull_desc:"Align full",justifyright_desc:"Align right",justifycenter_desc:"Align center",justifyleft_desc:"Align left",striketrough_desc:"Strikethrough",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/id_dlg.js b/js/tiny_mce/themes/advanced/langs/id_dlg.js new file mode 100755 index 000000000..5cb66e397 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/id_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('id.advanced_dlg',{link_list:"Daftar Link",link_is_external:"URL yang Anda sisipkan tampaknya link eksternal, Anda ingin menambahkan awalan \'http://\'?",link_is_email:"URL yang Anda sisipkan tampaknya e-mail, Anda ingin menambahkan awalan \'mailto:\'?",link_titlefield:"Judul",link_target_blank:"Buka link pada window baru",link_target_same:"Buka link pada window yang sama",link_target:"Target",link_url:"Link URL",link_title:"Insert/edit link",image_align_right:"Right",image_align_left:"Left",image_align_textbottom:"Text bottom",image_align_texttop:"Text top",image_align_bottom:"Bottom",image_align_middle:"Middle",image_align_top:"Top",image_align_baseline:"Baseline",image_align:"Alignment",image_hspace:"Horizontal space",image_vspace:"Vertical space",image_dimensions:"Dimensions",image_alt:"Image description",image_list:"Image list",image_border:"Border",image_src:"Image URL",image_title:"Insert/edit image",charmap_title:"Pilih custom character",colorpicker_name:"Name:",colorpicker_color:"Color:",colorpicker_named_title:"Named colors",colorpicker_named_tab:"Named",colorpicker_palette_title:"Palette colors",colorpicker_palette_tab:"Palette",colorpicker_picker_title:"Color picker",colorpicker_picker_tab:"Picker",colorpicker_title:"Select a color",code_wordwrap:"Word wrap",code_title:"HTML Source Editor",anchor_name:"Anchor name",anchor_title:"Insert/edit anchor",about_loaded:"Loaded plugins",about_version:"Versi",about_author:"Penulis",about_plugin:"Plugin",about_plugins:"Plugins",about_license:"Lisensi",about_help:"Bantuan",about_general:"Tentang",about_title:"Tentang TinyMCE"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/it.js b/js/tiny_mce/themes/advanced/langs/it.js new file mode 100755 index 000000000..d77ffb117 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/it.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.advanced',{underline_desc:"Sottolineato (Ctrl+U)",italic_desc:"Corsivo (Ctrl+I)",bold_desc:"Grassetto (Ctrl+B)",dd:"Descrizione definizione",dt:"Termine definizione",samp:"Esempio codice",code:"Codice",blockquote:"Testo quotato",h6:"Intestazione 6",h5:"Intestazione 5",h4:"Intestazione 4",h3:"Intestazione 3",h2:"Intestazione 2",h1:"Intestazione 1",pre:"Preformattato",address:"Indirizzo",div:"Div",paragraph:"Paragrafo",block:"Formato",fontdefault:"Famiglia carattere",font_size:"Grandezza carattere",style_select:"Stili",more_colors:"Colori aggiuntivi",toolbar_focus:"Vai ai pulsanti strumento - Alt+Q, Vai all\'editor - Alt-Z, Vai al percorso dell\'elemento - Alt-X",newdocument:"Sei sicuro di voler cancellare tutti i contenuti?",path:"Percorso",clipboard_msg:"Copia/Taglia/Incolla non \u00e8 disponibile in Mozilla e Firefox..\nSi desidera avere maggiori informazioni su questo problema?",blockquote_desc:"Testo quotato",help_desc:"Aiuto",newdocument_desc:"Nuovo documento",image_props_desc:"Propriet\u00e0 immagine",paste_desc:"Incolla",copy_desc:"Copia",cut_desc:"Taglia",anchor_desc:"Inserisci/modifica ancora",visualaid_desc:"Mostra/nascondi linee guida/elementi invisibili",charmap_desc:"Inserisci carattere speciale",backcolor_desc:"Seleziona colore sfondo",forecolor_desc:"Seleziona colore testo",custom1_desc:"La tua descrizione personalizzata qui",removeformat_desc:"Rimuovi formattazione",hr_desc:"Inserisci riga orizzontale",sup_desc:"Apice",sub_desc:"Pedice",code_desc:"Modifica sorgente HTML",cleanup_desc:"Pulisci codice disordinato",image_desc:"Inserisci/modifica immagine",unlink_desc:"Togli collegamento",link_desc:"Inserisci/modifica collegamento",redo_desc:"Ripristina (Ctrl+Y)",undo_desc:"Annulla (Ctrl+Z)",indent_desc:"Sposta verso interno",outdent_desc:"Sposta verso esterno",numlist_desc:"Lista ordinata",bullist_desc:"Lista non ordinata",justifyfull_desc:"Giustifica",justifyright_desc:"Allinea a destra",justifycenter_desc:"Centra",justifyleft_desc:"Allinea a sinistra",striketrough_desc:"Barrato",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/it_dlg.js b/js/tiny_mce/themes/advanced/langs/it_dlg.js new file mode 100755 index 000000000..1d3f96710 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/it_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('it.advanced_dlg',{link_list:"Lista link",link_is_external:"L\'URL inserito sembra essere un link esterno. Aggiungere il necessario prefisso http:// ?",link_is_email:"L\'URL inserito sembra essere un indirizzo email. Aggiungere il necessario prefisso mailto: ?",link_titlefield:"Titolo",link_target_blank:"Apri link in una nuova finestra",link_target_same:"Apri link nella stessa finestra",link_target:"Target",link_url:"URL link",link_title:"Inserisci/modifica collegamento",image_align_right:"A destra",image_align_left:"A sinistra",image_align_textbottom:"In basso al testo",image_align_texttop:"In alto al testo",image_align_bottom:"In basso",image_align_middle:"In mezzo",image_align_top:"In alto",image_align_baseline:"Alla base",image_align:"Allineamentot",image_hspace:"Spaziatura orizz.",image_vspace:"Spaziatura vert.",image_dimensions:"Dimensioni",image_alt:"Descrizione",image_list:"Lista immagini",image_border:"Bordo",image_src:"URL immagine",image_title:"Inserisci/modifica immagine",charmap_title:"Seleziona carattere speciale",colorpicker_name:"Nome:",colorpicker_color:"Colore:",colorpicker_named_title:"Colori per nome",colorpicker_named_tab:"Per nome",colorpicker_palette_title:"Tavolozza dei colori",colorpicker_palette_tab:"Tavolozza",colorpicker_picker_title:"Selettore colori",colorpicker_picker_tab:"Selettore",colorpicker_title:"Seleziona un colore",code_wordwrap:"A capo automatico",code_title:"Editor sorgente HTML",anchor_name:"Nome ancora",anchor_title:"Inserisci/modifica ancora",about_loaded:"Plugin caricati",about_version:"Versione",about_author:"Autore",about_plugin:"Plugin",about_plugins:"Plugins",about_license:"Licenza",about_help:"Aiuto",about_general:"Informazioni",about_title:"Informazioni su TinyMCE"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/lt.js b/js/tiny_mce/themes/advanced/langs/lt.js new file mode 100755 index 000000000..dcaaefdec --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/lt.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.advanced',{underline_desc:"Pabrauktas (Ctrl+U)",italic_desc:"Kursyvas (Ctrl+I)",bold_desc:"Pusjuodis (Ctrl+B)",dd:"Apibr\u0117\u017eimo apra\u0161as",dt:"Apibr\u0117\u017eimo terminas",samp:"Kodo pavyzdys",code:"Kodas",blockquote:"Citatos blokas",h6:"Antra\u0161t\u0117 6",h5:"Antra\u0161t\u0117 5",h4:"Antra\u0161t\u0117 4",h3:"Antra\u0161t\u0117 3",h2:"Antra\u0161t\u0117 2",h1:"Antra\u0161t\u0117 1",pre:"I\u0161 anksto formatuotas",address:"Adresas",div:"Div \u017eym\u0117",paragraph:"Paragrafas",block:"Formatas",fontdefault:"\u0160rifto \u0161eima",font_size:"\u0160rifto dydis",style_select:"Stiliai",link_delta_width:"70",more_colors:"Daugiau spalv\u0173",toolbar_focus:"Per\u0161okimas prie \u012franki\u0173 juostos mygtuk\u0173 - Alt+Q, Per\u0161okimas prie redaktoriaus - Alt-Z, Per\u0161okimas prie element\u0173 kelio - Alt-X",newdocument:"Ar tikrai norite i\u0161valyti vis\u0105 turin\u012f?",path:"Kelias",clipboard_msg:"Kopijavimas/I\u0161kirpimas/\u012ed\u0117jimas negalimas Mozilla ir Firefox nar\u0161ykl\u0117se.\nAr norite daugiau informacijos apie \u0161i\u0105 problem\u0105?",blockquote_desc:"Citatos blokas",help_desc:"Pagalba",newdocument_desc:"Naujas dokumentas",image_props_desc:"Paveiksl\u0117lio nustatymai",paste_desc:"\u012ed\u0117ti",copy_desc:"Kopijuoti",cut_desc:"I\u0161kirpti",anchor_desc:"\u012eterpti/redaguoti prierai\u0161\u0105",visualaid_desc:"Kaitalioti gaires/nematom\u0173 element\u0173 rodym\u0105",charmap_desc:"\u012eterpti nestandartin\u012f simbol\u012f",backcolor_desc:"Parinkti fono spalv\u0105",forecolor_desc:"Parinkti teksto spalv\u0105",custom1_desc:"J\u016bs\u0173 apra\u0161as \u010dia",removeformat_desc:"Pa\u0161alinti formatavim\u0105",hr_desc:"\u012eterpti horizontali\u0105 linij\u0105",sup_desc:"Vir\u0161utinis indeksas",sub_desc:"Apatinis indeksas",code_desc:"Redaguoti HTML i\u0161eities kod\u0105",cleanup_desc:"I\u0161valyti netvarking\u0105 kod\u0105",image_desc:"\u012eterpti/redaguoti paveiksl\u0117l\u012f",unlink_desc:"Pa\u0161alinti nuorod\u0105",link_desc:"\u012eterpti/redaguoti nuorod\u0105",redo_desc:"Gr\u0105\u017einti (Ctrl+Y)",undo_desc:"At\u0161aukti (Ctrl+Z)",indent_desc:"\u012etrauka",outdent_desc:"Atvirk\u0161tin\u0117 \u012ftrauka",numlist_desc:"Sunumeruotas s\u0105ra\u0161as",bullist_desc:"Nesunumeruotas s\u0105ra\u0161as",justifyfull_desc:"Lygiuoti pagal abu kra\u0161tus",justifyright_desc:"Lygiuoti pagal de\u0161in\u0119",justifycenter_desc:"Centruoti",justifyleft_desc:"Lygiuoti pagal kair\u0119",striketrough_desc:"Perbrauktas",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/lt_dlg.js b/js/tiny_mce/themes/advanced/langs/lt_dlg.js new file mode 100755 index 000000000..6535e503c --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/lt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lt.advanced_dlg',{link_list:"Nuorod\u0173 s\u0105ra\u0161as",link_is_external:"URL adresas, kur\u012f \u012fved\u0117te yra i\u0161orin\u0117 nuoroda, ar norite prid\u0117ti reikaling\u0105 http:// prefiks\u0105?",link_is_email:"URL adresas, kur\u012f \u012fved\u0117te yra el. pa\u0161to adresas, ar norite prid\u0117ti reikaling\u0105 mailto: prefiks\u0105?",link_titlefield:"Pavadinimas",link_target_blank:"Atverti naujame lange",link_target_same:"Atverti tame pa\u010diame lange",link_target:"Paskirtis",link_url:"Nuorodos URL adresas",link_title:"\u012eterpti/redaguoti nuorod\u0105",image_align_right:"De\u0161in\u0117je",image_align_left:"Kair\u0117je",image_align_textbottom:"Teksto apa\u010dioje",image_align_texttop:"Teksto vir\u0161uje",image_align_bottom:"Apa\u010dioje",image_align_middle:"Viduryje",image_align_top:"Vir\u0161uje",image_align_baseline:"Pradiniame ta\u0161ke",image_align:"Lygiavimas",image_hspace:"Horizontalus tarpas",image_vspace:"Vertikalus tarpas",image_dimensions:"I\u0161matavimai",image_alt:"Paveiksl\u0117lio apra\u0161as",image_list:"Paveiksl\u0117li\u0173 s\u0105ra\u0161as",image_border:"R\u0117melis",image_src:"Paveiksl\u0117lio URL adresas",image_title:"\u012eterpti/redaguoti paveiksl\u0117l\u012f",charmap_title:"Pasirinkti nestandartin\u012f simbol\u012f",colorpicker_name:"Pavadinimas:",colorpicker_color:"Spalva:",colorpicker_named_title:"\u012evardintosios spalvos",colorpicker_named_tab:"\u012evardintosios",colorpicker_palette_title:"Palet\u0117s spalvos",colorpicker_palette_tab:"Palet\u0117",colorpicker_picker_title:"Spalvos parinkiklis",colorpicker_picker_tab:"Parinkiklis",colorpicker_title:"Pasirinkti spalv\u0105",code_wordwrap:"Skaidyti tekst\u0105",code_title:"HTML i\u0161eities kodo redaktorius",anchor_name:"Prierai\u0161o vardas",anchor_title:"\u012eterpti/redaguoti prierai\u0161\u0105",about_loaded:"\u012ekelti papildiniai",about_version:"Versija",about_author:"Autorius",about_plugin:"Papildinys",about_plugins:"Papildiniai",about_license:"Licencija",about_help:"Pagalba",about_general:"Apie",about_title:"Apie TinyMCE"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/lv.js b/js/tiny_mce/themes/advanced/langs/lv.js new file mode 100755 index 000000000..04557b628 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/lv.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.advanced',{underline_desc:"Pasv\u012btrojums (Ctrl+U)",italic_desc:"Sl\u012bpraksts (Ctrl+I)",bold_desc:"Treknraksts (Ctrl+B)",dd:"Defin\u012bcijas apraksts",dt:"Defin\u012bcijas termins ",samp:"Koda piem\u0113rs",code:"Kods",blockquote:"Cit\u0101ts",h6:"Virsraksts 6",h5:"Virsraksts 5",h4:"Virsraksts 4",h3:"Virsraksts 3",h2:"Virsraksts 2",h1:"Virsraksts 1",pre:"Priek\u0161format\u0113ts",address:"Adrese",div:"Div\u012bzija",paragraph:"Rindkopa",block:"Form\u0101ts",fontdefault:"Fonta veids",font_size:"Fonta lielums",style_select:"Stili",more_colors:"Vair\u0101k kr\u0101su",toolbar_focus:"Iet uz r\u012bkpog\u0101m - Alt+Q, Iet uz redaktoru - Alt-Z, Iet uz elementa atra\u0161an\u0101s vietu - Alt-X",newdocument:"Vai J\u016bs esat p\u0101rliecin\u0101ti, ka v\u0113laties izdz\u0113st visu saturu?",path:"Atra\u0161an\u0101s vieta",clipboard_msg:"Iesp\u0113ja Kop\u0113t/Izgriezt/Iekop\u0113t nav pieejama p\u0101rl\u016bkiem Mozilla and Firefox.\nVai J\u016bs v\u0113laties uzzin\u0101t vair\u0101k par \u0161o probl\u0113mu?",blockquote_desc:"Cit\u0101ts",help_desc:"Pal\u012bdz\u012bba",newdocument_desc:"Jauns dokuments",image_props_desc:"Bildes iestat\u012bjumi",paste_desc:"Iekop\u0113t",copy_desc:"Kop\u0113t",cut_desc:"Izgriezt",anchor_desc:"Ievietot/Redi\u0123\u0113t enkursaiti",visualaid_desc:"Uzlikt/Nov\u0101kt pal\u012bgsv\u012btras/neredzamos elementus",charmap_desc:"Ievietot simbolu",backcolor_desc:"Uzst\u0101d\u012bt fona kr\u0101su",forecolor_desc:"Uzst\u0101d\u012bt teksta kr\u0101su",custom1_desc:"Tevis izdom\u0101ts apraksts \u0161eit",removeformat_desc:"Izdz\u0113st format\u0113to",hr_desc:"Ievietot horizont\u0101lu sv\u012btru",sup_desc:"Aug\u0161raksts",sub_desc:"Apak\u0161raksts",code_desc:"Redi\u0123\u0113t HTML kodu",cleanup_desc:"Izt\u012br\u012bt nek\u0101rt\u012bgu kodu",image_desc:"Ievietot/Redi\u0123\u0113t att\u0113lu",unlink_desc:"Atsait\u0113t",link_desc:"Ievietot/Redi\u0123\u0113t saiti",redo_desc:"Atatsaukt (Ctrl+Y)",undo_desc:"Atsaukt (Ctrl+Z)",indent_desc:"Atk\u0101pe",outdent_desc:"Uzk\u0101pe",numlist_desc:"Numur\u0113ts saraksts",bullist_desc:"Nenumur\u0113ts saraksts",justifyfull_desc:"Nol\u012bdzin\u0101t malas",justifyright_desc:"Novietot pa labi",justifycenter_desc:"Centr\u0113t",justifyleft_desc:"Novietot pa kreisi",striketrough_desc:"P\u0101rsv\u012btrojums",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/lv_dlg.js b/js/tiny_mce/themes/advanced/langs/lv_dlg.js new file mode 100755 index 000000000..1ee3b86c8 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/lv_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('lv.advanced_dlg',{link_list:"Sai\u0161u saraksts",link_is_external:"Ievad\u012btais URL \u0161\u0137iet ir \u0101r\u0113j\u0101 saite, vai tu v\u0113lies pirms t\u0101s pievienot http:// pried\u0113kli?",link_is_email:"Ievad\u012btais URL \u0161\u0137iet ir e-pasta adrese, vai tu v\u0113lies pirms t\u0101s pievienot mailto: pried\u0113kli? ",link_titlefield:"Nosaukums",link_target_blank:"Atv\u0113rt saiti jaun\u0101 log\u0101",link_target_same:"Atv\u0113rt saiti \u0161ai pa\u0161\u0101 log\u0101",link_target:"M\u0113r\u0137is",link_url:"Saites URL",link_title:"Ievietot/Redi\u0123\u0113t saiti",image_align_right:"Pa labi",image_align_left:"Pa kreisi",image_align_textbottom:"Teksta apak\u0161a",image_align_texttop:"Teksta aug\u0161a",image_align_bottom:"Apak\u0161a",image_align_middle:"Vidus",image_align_top:"Aug\u0161a",image_align_baseline:"Pati apak\u0161a",image_align:"Novietojums",image_hspace:"Horizont\u0101l\u0101 atstarpe",image_vspace:"Vertik\u0101l\u0101 atstarpe",image_dimensions:"Izm\u0113ri",image_alt:"Att\u0113la apraksts",image_list:"Att\u0113lu saraksts",image_border:"Apmale",image_src:"Att\u0113la URL",image_title:"Ievietot/Redi\u0123\u0113t att\u0113lu",charmap_title:"Izv\u0113lies simbolu",colorpicker_name:"Nosaukums:",colorpicker_color:"Kr\u0101sa:",colorpicker_named_title:"Nosaukt\u0101s kr\u0101sas",colorpicker_named_tab:"Nosaukts",colorpicker_palette_title:"Kr\u0101su palete",colorpicker_palette_tab:"Palete",colorpicker_picker_title:"Kr\u0101su izv\u0113lnis",colorpicker_picker_tab:"Izv\u0113lnis",colorpicker_title:"Izv\u0113l\u0113ties kr\u0101su",code_wordwrap:"V\u0101rdu p\u0101rne\u0161ana jaun\u0101 rind\u0101",code_title:"HTML koda redaktors",anchor_name:"Enkursaites nosaukums",anchor_title:"Ievietot/Redi\u0123\u0113t enkursaiti",about_loaded:"Iestat\u012btie papildmodu\u013ci",about_version:"Versija",about_author:"Autors",about_plugin:"Papildmodulis",about_plugins:"Papildmodu\u013ci",about_license:"Licence",about_help:"Pal\u012bdz\u012bba",about_general:"Par",about_title:"Par TinyMCE"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/nl.js b/js/tiny_mce/themes/advanced/langs/nl.js new file mode 100755 index 000000000..fb1712af2 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/nl.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.advanced',{"underline_desc":"Onderstrepen (Ctrl+U)","italic_desc":"Cursief (Ctrl+I)","bold_desc":"Vet (Ctrl+B)",dd:"Definitiebeschrijving",dt:"Definitieterm",samp:"Codevoorbeeld",code:"Code",blockquote:"Citaat",h6:"Kop 6",h5:"Kop 5",h4:"Kop 4",h3:"Kop 3",h2:"Kop 2",h1:"Kop 1",pre:"Vaste opmaak",address:"Adres",div:"Div",paragraph:"Alinea",block:"Opmaak",fontdefault:"Lettertype","font_size":"Tekengrootte","style_select":"Stijlen","more_colors":"Meer kleuren","toolbar_focus":"Spring naar werkbalk - Alt+Q, Spring naar tekst - Alt-Z, Spring naar elementpad - Alt-X",newdocument:"Weet u zeker dat u alle inhoud wilt wissen?",path:"Pad","clipboard_msg":"Kopi\u00ebren/knippen/plakken is niet beschikbaar in Mozilla en Firefox.\\nWilt u meer informatie over deze beperking?","blockquote_desc":"Citaat","help_desc":"Help","newdocument_desc":"Nieuw document","image_props_desc":"Afbeeldingseigenschappen","paste_desc":"Plakken","copy_desc":"Kopi\u00ebren","cut_desc":"Knippen","anchor_desc":"Anker invoegen/bewerken","visualaid_desc":"Hulplijnen weergeven","charmap_desc":"Symbool invoegen","backcolor_desc":"Tekstmarkeringskleur","forecolor_desc":"Tekstkleur","custom1_desc":"Uw eigen beschrijving hier","removeformat_desc":"Opmaak verwijderen","hr_desc":"Scheidingslijn invoegen","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"HTML bron bewerken","cleanup_desc":"Code opruimen","image_desc":"Afbeelding invoegen/bewerken","unlink_desc":"Link verwijderen","link_desc":"Link invoegen/bewerken","redo_desc":"Herhalen (Ctrl+Y)","undo_desc":"Ongedaan maken (Ctrl+Z)","indent_desc":"Inspringing vergroten","outdent_desc":"Inspringing verkleinen","numlist_desc":"Nummering","bullist_desc":"Opsommingstekens","justifyfull_desc":"Uitvullen","justifyright_desc":"Rechts uitlijnen","justifycenter_desc":"Centreren","justifyleft_desc":"Links uitlijnen","striketrough_desc":"Doorhalen","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/nl_dlg.js b/js/tiny_mce/themes/advanced/langs/nl_dlg.js new file mode 100755 index 000000000..e63a26e4d --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/nl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('nl.advanced_dlg',{"link_list":"Link lijst","link_is_external":"De ingevoerde URL lijkt op een externe link. Wilt u de vereiste http:// tekst voorvoegen?","link_is_email":"De ingevoerde URL lijkt op een e-mailadres. Wilt u de vereiste mailto: tekst voorvoegen?","link_titlefield":"Titel","link_target_blank":"Link in een nieuw venster openen","link_target_same":"Link in hetzelfde venster openen","link_target":"Doel","link_url":"Link URL","link_title":"Link invoegen/bewerken","image_align_right":"Rechts","image_align_left":"Links","image_align_textbottom":"Onderkant tekst","image_align_texttop":"Bovenkant tekst","image_align_bottom":"Onder","image_align_middle":"Midden","image_align_top":"Boven","image_align_baseline":"Basislijn","image_align":"Uitlijning","image_hspace":"Horizontale ruimte","image_vspace":"Verticale ruimte","image_dimensions":"Afmetingen","image_alt":"Beschrijving","image_list":"Lijst","image_border":"Rand","image_src":"Bestand/URL","image_title":"Afbeelding invoegen/bewerken","charmap_title":"Symbolen","colorpicker_name":"Naam:","colorpicker_color":"Kleur:","colorpicker_named_title":"Benoemde kleuren","colorpicker_named_tab":"Benoemd","colorpicker_palette_title":"Paletkleuren","colorpicker_palette_tab":"Palet","colorpicker_picker_title":"Alle kleuren","colorpicker_picker_tab":"Alle kleuren","colorpicker_title":"Kleuren","code_wordwrap":"Automatische terugloop","code_title":"HTML Bron","anchor_name":"Ankernaam","anchor_title":"Anker invoegen/bewerken","about_loaded":"Geladen Invoegtoepassingen","about_version":"Versie","about_author":"Auteur","about_plugin":"Invoegtoepassing","about_plugins":"Invoegtoepassingen","about_license":"Licentie","about_help":"Help","about_general":"Info","about_title":"Over TinyMCE","anchor_invalid":"Geef een geldige ankernaam."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/no.js b/js/tiny_mce/themes/advanced/langs/no.js new file mode 100755 index 000000000..4f9119327 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/no.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.advanced',{"underline_desc":"Understrek (Ctrl+U)","italic_desc":"Kursiv (Ctrl+I)","bold_desc":"Fet (Ctrl+B)",dd:"Definisjonsbeskrivelse",dt:"Definisjonsuttrykk",samp:"Kodeeksempel",code:"Kode",blockquote:"Innrykk",h6:"Overskrift 6",h5:"Overskrift 5",h4:"Overskrift 4",h3:"Overskrift 3",h2:"Overskrift 2",h1:"Overskrift 1",pre:"Pre-formatert",address:"Adresse",div:"Div",paragraph:"Avsnitt",block:"Format",fontdefault:"Skriftfamilie","font_size":"Skriftst\u00f8rrelse","style_select":"Stiler","more_colors":"Flere farger","toolbar_focus":"Skift til verkt\u00f8yknapper - Alt+Q, Skift til editor - Alt-Z, Skift til elementsti - Alt-",newdocument:"Er du sikker p\u00e5 at du vil slette alt innhold?",path:"Sti","clipboard_msg":"Klipp ut/Kopier/Lim er ikke tilgjengelig i Mozilla og Firefox. \n Vil du vite mer om dette?","blockquote_desc":"Innrykk","help_desc":"Hjelp","newdocument_desc":"Nytt dokument","image_props_desc":"Egenskaper for bilde","paste_desc":"Lim inn","copy_desc":"Kopier","cut_desc":"Klipp ut","anchor_desc":"Sett inn/editer anker","visualaid_desc":"Sl\u00e5 av/p\u00e5 usynlige elementer","charmap_desc":"Sett inn spesialtegn","backcolor_desc":"Velg bakgrunnsfarge","forecolor_desc":"Velg skriftfarge","custom1_desc":"Din egen beskriveles her","removeformat_desc":"Fjern formatering","hr_desc":"Sett inn horisontal linje","sup_desc":"Hev skrift","sub_desc":"Senk skrift","code_desc":"Rediger HTML kildekode","cleanup_desc":"Rense grisete kode","image_desc":"Sett inn / endre bilde","unlink_desc":"Fjerne lenke","link_desc":"Sett inn/editer lenke","redo_desc":"Gj\u00f8r om (Ctrl+Y)","undo_desc":"Angre (Ctrl+Z)","indent_desc":"\u00d8k innrykk","outdent_desc":"Reduser innrykk","numlist_desc":"Nummerliste","bullist_desc":"Punktliste","justifyfull_desc":"Blokkjustert","justifyright_desc":"H\u00f8yrejustert","justifycenter_desc":"Midtstilt","justifyleft_desc":"Venstrejustert","striketrough_desc":"Gjennomstreke","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/no_dlg.js b/js/tiny_mce/themes/advanced/langs/no_dlg.js new file mode 100755 index 000000000..bc7ea8b53 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/no_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('no.advanced_dlg',{"link_list":"Liste over lenker","link_is_external":"Nettadressen du skrev inn ser ut til \u00e5 v\u00e6re en ekstern nettadresse. \u00d8nsker du \u00e5 legge til obligatorisk http://-prefiks?","link_is_email":"Nettadressen du skrev inn ser ut til \u00e5 v\u00e6re en Epost adresse. \u00d8nsker du \u00e5 legge til obligatorisk mailto:-prefiks?","link_titlefield":"Tittel","link_target_blank":"\u00c5pne i nytt vindu","link_target_same":"\u00c5pne i dette vindu","link_target":"M\u00e5lvindu","link_url":"Lenke URL","link_title":"Sett inn/editer lenke","image_align_right":"H\u00f8yre","image_align_left":"Venstre","image_align_textbottom":"Tekst bunn","image_align_texttop":"Tekst topp","image_align_bottom":"Bunn","image_align_middle":"Midtstilt","image_align_top":"Topp","image_align_baseline":"Bunnlinje","image_align":"Justering","image_hspace":"Horisontal avstand","image_vspace":"Vertikal avstand","image_dimensions":"Dimensjoner","image_alt":"Bildebeskrivelse","image_list":"Liste med bilder","image_border":"Ramme","image_src":"Bilde URL","image_title":"Sett inn/editer bilde","charmap_title":"Velg spesialtegn","colorpicker_name":"Navn:","colorpicker_color":"Farge:","colorpicker_named_title":"Fargenavn","colorpicker_named_tab":"Navnevalg","colorpicker_palette_title":"Palettfarger","colorpicker_palette_tab":"Palett","colorpicker_picker_title":"Fargevalg","colorpicker_picker_tab":"Fargevelger","colorpicker_title":"Velg farge","code_wordwrap":"Tekstbryting","code_title":"HTML kildeeditor","anchor_name":"Ankernavn","anchor_title":"Sett inn/editer anker","about_loaded":"Innlastede programtillegg","about_version":"Versjon","about_author":"Forfatter","about_plugin":"Programtillegg","about_plugins":"Programtillegg","about_license":"Lisens","about_help":"Hjelp","about_general":"Om","about_title":"Om TinyMCE","anchor_invalid":"Du m\u00e5 angi et gyldig ankernavn."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/pl.js b/js/tiny_mce/themes/advanced/langs/pl.js new file mode 100755 index 000000000..38f445997 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/pl.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.advanced',{"underline_desc":"Podkre\u015blenie (Ctrl+U)","italic_desc":"Kursywa (Ctrl+I)","bold_desc":"Pogrubienie (Ctrl+B)",dd:"Opis terminu",dt:"Definicja terminu ",samp:"Pr\u00f3bka kodu",code:"Kod",blockquote:"Wydzielony blok",h6:"Nag\u0142\u00f3wek 6",h5:"Nag\u0142\u00f3wek 5",h4:"Nag\u0142\u00f3wek 4",h3:"Nag\u0142\u00f3wek 3",h2:"Nag\u0142\u00f3wek 2",h1:"Nag\u0142\u00f3wek 1",pre:"Czcionka o sta\u0142ej szeroko\u015bci",address:"Adres",div:"Div",paragraph:"Akapit",block:"Format",fontdefault:"Rodzaj czcionki","font_size":"Rozmiar czcionki","style_select":"Styl","more_colors":"Wi\u0119cej kolor\u00f3w","toolbar_focus":"Przeskocz do przycisk\u00f3w narz\u0119dzi - Alt+Q, Przeskocz do edytora - Alt-Z, Przeskocz do elementu \u015bcie\u017cki - Alt-X",newdocument:"Czy jeste\u015b pewnien, ze chcesz wyczy\u015bci\u0107 ca\u0142\u0105 zawarto\u015b\u0107?",path:"\u015acie\u017cka","clipboard_msg":"Akcje Kopiuj/Wytnij/Wklej nie s\u0105 dost\u0119pne w Mozilli i Firefox.\\nCzy chcesz wi\u0119cej informacji o tym problemie?","blockquote_desc":"Blok cytatu","help_desc":"Pomoc","newdocument_desc":"Nowy dokument","image_props_desc":"W\u0142a\u015bciwo\u015bci obrazka","paste_desc":"Wklej","copy_desc":"Kopiuj","cut_desc":"Wytnij","anchor_desc":"Wstaw/edytuj kotwic\u0119","visualaid_desc":"Prze\u0142\u0105cz widoczno\u015b\u0107 wska\u017anik\u00f3w i niewidocznych element\u00f3w","charmap_desc":"Wstaw znak specjalny","backcolor_desc":"Wybierz kolor t\u0142a","forecolor_desc":"Wybierz kolor tekstu","custom1_desc":"Tw\u00f3j niestandardowy opis tutaj","removeformat_desc":"Usu\u0144 formatowanie","hr_desc":"Wstaw poziom\u0105 lini\u0119","sup_desc":"Indeks g\u00f3rny","sub_desc":"Indeks dolny","code_desc":"Edytuj \u017ar\u00f3d\u0142o HTML","cleanup_desc":"Wyczy\u015b\u0107 nieuporz\u0105dkowany kod","image_desc":"Wstaw/edytuj obraz","unlink_desc":"Usu\u0144 link","link_desc":"Wstaw/edytuj link","redo_desc":"Pon\u00f3w (Ctrl+Y)","undo_desc":"Cofnij (Ctrl+Z)","indent_desc":"Wci\u0119cie","outdent_desc":"Cofnij wci\u0119cie","numlist_desc":"Lista numerowana","bullist_desc":"Lista nienumerowana","justifyfull_desc":"R\u00f3wnanie do prawej i lewej","justifyright_desc":"Wyr\u00f3wnaj do prawej","justifycenter_desc":"Wycentruj","justifyleft_desc":"Wyr\u00f3wnaj do lewej","striketrough_desc":"Przekre\u015blenie","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/pl_dlg.js b/js/tiny_mce/themes/advanced/langs/pl_dlg.js new file mode 100755 index 000000000..6142361ad --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/pl_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pl.advanced_dlg',{"link_list":"Lista link\u00f3w","link_is_external":"URL kt\u00f3ry otworzy\u0142e\u015b wydaje si\u0119 by\u0107 zewn\u0119trznym linkiem, czy chcesz doda\u0107 wymagany prefiks http:// ?","link_is_email":"URL kt\u00f3ry otworzy\u0142e\u015b wydaje si\u0119 by\u0107 adresem mailowym, czy chcesz doda\u0107 odpowiedni prefiks mailto:?","link_titlefield":"Tytu\u0142","link_target_blank":"Otw\u00f3rz link w nowym oknie","link_target_same":"Otw\u00f3rz link w tym samym oknie","link_target":"Cel","link_url":"URL linka","link_title":"Wstaw/edytuj link","image_align_right":"Prawy","image_align_left":"Lewy","image_align_textbottom":"Dolny tekst","image_align_texttop":"G\u00f3rny tekst","image_align_bottom":"D\u00f3\u0142","image_align_middle":"\u015arodek","image_align_top":"G\u00f3ra","image_align_baseline":"Linia bazowa","image_align":"Wyr\u00f3wnanie","image_hspace":"Odst\u0119p poziomy","image_vspace":"Odst\u0119p pionowy","image_dimensions":"Rozmiary","image_alt":"Opis obrazka","image_list":"Lista obrazk\u00f3w","image_border":"Obramowanie","image_src":"URL obrazka","image_title":"Wstaw/edytuj obraz","charmap_title":"Wybierz niestandardowy znak","colorpicker_name":"Nazwa:","colorpicker_color":"Kolor:","colorpicker_named_title":"Nazwane kolory","colorpicker_named_tab":"Nazwane","colorpicker_palette_title":"Paleta kolor\u00f3w","colorpicker_palette_tab":"Paleta","colorpicker_picker_title":"Wybieranie kolor\u00f3w","colorpicker_picker_tab":"Wybieranie","colorpicker_title":"Wybierz kolor","code_wordwrap":"Zawijanie s\u0142\u00f3w","code_title":"Edytor \u017ar\u00f3d\u0142a HTML","anchor_name":"Nazwa zakotwiczenia","anchor_title":"Wstaw/Edytuj zakotwiczenie","about_loaded":"Za\u0142adowane wtyczki","about_version":"Wersja","about_author":"Autor","about_plugin":"Wtyczka","about_plugins":"Wtyczki","about_license":"Licencja","about_help":"Pomoc","about_general":"O TinyMCE","about_title":"O TinyMCE","anchor_invalid":"Prosz\u0119 poda\u0107 w\u0142a\u015bciw\u0105 nazw\u0119 zakotwiczenia."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/pt.js b/js/tiny_mce/themes/advanced/langs/pt.js new file mode 100755 index 000000000..9d86b4178 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/pt.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.advanced',{underline_desc:"Sublinhado (Ctrl+U)",italic_desc:"It\u00e1lico (Ctrl+I)",bold_desc:"Negrito (Ctrl+B)",dd:"Descri\u00e7\u00e3o da defini\u00e7\u00e3o",dt:"Termo da defini\u00e7\u00e3o",samp:"Amostra de c\u00f3digo",code:"C\u00f3digo",blockquote:"Cita\u00e7\u00e3o em bloco",h6:"T\u00edtulo 6",h5:"T\u00edtulo 5",h4:"T\u00edtulo 4",h3:"T\u00edtulo 3",h2:"T\u00edtulo 2",h1:"T\u00edtulo 1",pre:"Pr\u00e9-formatado",address:"Endere\u00e7o",div:"Div",paragraph:"Par\u00e1grafo",block:"Formata\u00e7\u00e3o",fontdefault:"Tipo de fonte",font_size:"Tamanho",style_select:"Estilos",more_colors:"Mais cores",toolbar_focus:"Ir para as ferramentas - Alt+Q, Ir para o editor - Alt-Z, Ir para o endere\u00e7o do elemento - Alt-X",newdocument:"Tem a certeza que deseja apagar tudo?",path:"Endere\u00e7o",clipboard_msg:"Copiar/recortar/colar n\u00e3o est\u00e1 dispon\u00edvel no Mozilla e Firefox. Deseja mais informa\u00e7\u00f5es sobre este problema?",blockquote_desc:"Cita\u00e7\u00e3o em bloco",help_desc:"Ajuda",newdocument_desc:"Novo documento",image_props_desc:"Propriedades da imagem",paste_desc:"Colar",copy_desc:"Copiar",cut_desc:"Recortar",anchor_desc:"Inserir/editar \u00e2ncora",visualaid_desc:"Alternar guias/elementos invis\u00edveis",charmap_desc:"Inserir caracteres especiais",backcolor_desc:"Selecionar a cor de fundo",forecolor_desc:"Selecionar a cor do texto",custom1_desc:"Insira aqui a sua descri\u00e7\u00e3o personalizada",removeformat_desc:"Remover formata\u00e7\u00e3o",hr_desc:"Inserir separador horizontal",sup_desc:"Superior \u00e0 linha",sub_desc:"Inferior \u00e0 linha",code_desc:"Editar c\u00f3digo fonte",cleanup_desc:"Limpar c\u00f3digo incorreto",image_desc:"Inserir/editar imagem",unlink_desc:"Remover hyperlink",link_desc:"Inserir/editar hyperlink",redo_desc:"Refazer (Ctrl+Y)",undo_desc:"Desfazer (Ctrl+Z)",indent_desc:"Aumentar recuo",outdent_desc:"Diminuir recuo",numlist_desc:"Numera\u00e7\u00e3o",bullist_desc:"Marcadores",justifyfull_desc:"Justificar",justifyright_desc:"Alinhar \u00e0 direita",justifycenter_desc:"Centralizar",justifyleft_desc:"Alinhar \u00e0 esquerda",striketrough_desc:"Riscado",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/pt_dlg.js b/js/tiny_mce/themes/advanced/langs/pt_dlg.js new file mode 100755 index 000000000..ad34611ae --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/pt_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('pt.advanced_dlg',{link_list:"Lista de Links",link_is_external:"A URL digitada parece conduzir a um link externo. Deseja acrescentar o prefixo necess\u00e1rio http://?",link_is_email:"A URL digitada parece ser um endere\u00e7o de e-mail. Deseja acrescentar o prefixo necess\u00e1rio mailto:?",link_titlefield:"T\u00edtulo",link_target_blank:"Abrir hyperlink em nova janela",link_target_same:"Abrir hyperlink na mesma janela",link_target:"Alvo",link_url:"URL do hyperink",link_title:"Inserir/editar hyperlink",image_align_right:"Direita",image_align_left:"Esquerda",image_align_textbottom:"Base do texto",image_align_texttop:"Topo do texto",image_align_bottom:"Abaixo",image_align_middle:"Meio",image_align_top:"Topo",image_align_baseline:"Sobre a linha de texto",image_align:"Alinhamento",image_hspace:"Espa\u00e7o Horizontal",image_vspace:"Espa\u00e7o Vertical",image_dimensions:"Dimens\u00f5es",image_alt:"Descri\u00e7\u00e3o da imagem",image_list:"Lista de imagens",image_border:"Limites",image_src:"Endere\u00e7o da imagem",image_title:"Inserir/editar imagem",charmap_title:"Selecionar caracteres personalizados",colorpicker_name:"Nome:",colorpicker_color:"Cor:",colorpicker_named_title:"Cores Personalizadas",colorpicker_named_tab:"Personalizadas",colorpicker_palette_title:"Paleta de Cores",colorpicker_palette_tab:"Paleta",colorpicker_picker_title:"Editor de Cores",colorpicker_picker_tab:"Editor",colorpicker_title:"Selecione uma cor",code_wordwrap:"Quebra autom\u00e1tica de linha",code_title:"Editor HTML",anchor_name:"Nome da \u00e2ncora",anchor_title:"Inserir/editar \u00e2ncora",about_loaded:"Plugins Instalados",about_version:"Vers\u00e3o",about_author:"Autor",about_plugin:"Plugin",about_plugins:"Plugins",about_license:"Licen\u00e7a",about_help:"Ajuda",about_general:"Sobre",about_title:"Sobre o TinyMCE",anchor_invalid:"Por favor, especifique um nome v\u00e1lido de \u00e2ncora."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/ro.js b/js/tiny_mce/themes/advanced/langs/ro.js new file mode 100755 index 000000000..ae6adcb52 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/ro.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.advanced',{underline_desc:"Subliniat (Ctrl+U)",italic_desc:"Italic (Ctrl+I)",bold_desc:"\u00cengro\u015fat (Ctrl+B)",dd:"Defini\u0163ie",dt:"Termen definit ",samp:"Mostr\u0103 de cod",code:"Cod",blockquote:"Citat",h6:"Titlu 6",h5:"Titlu 5",h4:"Titlu 4",h3:"Titlu 3",h2:"Titlu 2",h1:"Titlu 1",pre:"Preformatat",address:"Adres\u0103",div:"Div",paragraph:"Paragraf",block:"Format",fontdefault:"Font",font_size:"M\u0103rime font",style_select:"Stiluri",more_colors:"Mai multe culori",toolbar_focus:"S\u0103ri\u0163i la instrumente - Alt+Q, S\u0103ri\u0163i la editor - Alt-Z, S\u0103ri\u0163i la cale - Alt-X",newdocument:"Sigur dori\u0163i s\u0103 \u015fterge\u0163i tot?",path:"Cale",clipboard_msg:"Copierea/T\u0103ierea/Lipirea nu sunt disponibile \u00een Mozilla \u015fi Firefox.\\nDori\u0163i mai multe informa\u0163ii despre aceast\u0103 problem\u0103?",blockquote_desc:"Citat",help_desc:"Autor",newdocument_desc:"Document nou",image_props_desc:"Detalii imagine",paste_desc:"Lipe\u015fte",copy_desc:"Copiaz\u0103",cut_desc:"Taie",anchor_desc:"Inserare/editare ancor\u0103",visualaid_desc:"Comut\u0103 ghidajele/elementele invizibile",charmap_desc:"Inserare caracter special",backcolor_desc:"Culoare fundal",forecolor_desc:"Culoare text",custom1_desc:"Descriere ...",removeformat_desc:"Anuleaz\u0103 formatarea",hr_desc:"Insereaz\u0103 linie orizontal\u0103",sup_desc:"Superscript",sub_desc:"Subscript",code_desc:"Editare surs\u0103 HTML",cleanup_desc:"Cur\u0103\u0163are cod",image_desc:"Inserare/editare imagine",unlink_desc:"\u015eterge leg\u0103tura",link_desc:"Inserare/editare leg\u0103tur\u0103",redo_desc:"Ref\u0103 (Ctrl+Y)",undo_desc:"Undo (Ctrl+Z)",indent_desc:"Indenteaz\u0103",outdent_desc:"De-indenteaz\u0103",numlist_desc:"List\u0103 ordonat\u0103",bullist_desc:"List\u0103 neordonat\u0103",justifyfull_desc:"Aliniere pe toat\u0103 l\u0103\u0163imea",justifyright_desc:"Aliniere la dreapta",justifycenter_desc:"Centrare",justifyleft_desc:"Aliniere la st\u00e2nga",striketrough_desc:"T\u0103iat",anchor_delta_height:"",anchor_delta_width:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/ro_dlg.js b/js/tiny_mce/themes/advanced/langs/ro_dlg.js new file mode 100755 index 000000000..87ce7e90b --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/ro_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ro.advanced_dlg',{link_list:"Lista de leg\u0103turi",link_is_external:"URL-ul pe care l-a\u0163i introdus pare a fi o leg\u0103tur\u0103 extern\u0103. Dori\u0163i s\u0103 adaug \u015fi prefixul http:// necesar?",link_is_email:"URL-ul pe care l-a\u0163i introdus pare a fi o adres\u0103 de e-mail. Dori\u0163i s\u0103 adaug \u015fi prefixul mailto: necesar?",link_titlefield:"Titlu",link_target_blank:"Deschide leg\u0103tura \u00eentr-o fereastr\u0103 nou\u0103",link_target_same:"Deschide leg\u0103tura \u00een aceea\u015fi fereastr\u0103",link_target:"\u0162int\u0103",link_url:"URL leg\u0103tur\u0103",link_title:"Inserare/editare leg\u0103tur\u0103",image_align_right:"Dreapta",image_align_left:"St\u00e2nga",image_align_textbottom:"Textul la mijloc",image_align_texttop:"Textul sus",image_align_bottom:"Jos",image_align_middle:"La mijloc",image_align_top:"Sus",image_align_baseline:"Baseline",image_align:"Aliniere",image_hspace:"Spa\u0163iu orizontal",image_vspace:"Spa\u0163iu vertical",image_dimensions:"Dimensiuni",image_alt:"Descriere imagine",image_list:"List\u0103 de imagini",image_border:"Bordur\u0103",image_src:"URL imagine",image_title:"Insereaz\u0103/editeaz\u0103 o imagine",charmap_title:"Alege\u0163i un caracter special",colorpicker_name:"Nume:",colorpicker_color:"Culoare:",colorpicker_named_title:"Culori denumite",colorpicker_named_tab:"Denumite",colorpicker_palette_title:"Palet\u0103 de culori",colorpicker_palette_tab:"Palet\u0103",colorpicker_picker_title:"Pipet\u0103 de culori",colorpicker_picker_tab:"Pipet\u0103",colorpicker_title:"Alege\u0163i o culoare",code_wordwrap:"Word wrap",code_title:"Editor surs\u0103 HTML",anchor_name:"Nume ancor\u0103",anchor_title:"Inserare/editare ancor\u0103",about_loaded:"Module \u00eenc\u0103rcate",about_version:"Versiune",about_author:"Autor",about_plugin:"Modul",about_plugins:"Module",about_license:"Licen\u0163\u0103",about_help:"Ajutor",about_general:"Despre",about_title:"Despre TinyMCE"}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/ru.js b/js/tiny_mce/themes/advanced/langs/ru.js new file mode 100755 index 000000000..3ab4e6972 --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/ru.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advanced',{"underline_desc":"\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439 (Ctrl+U)","italic_desc":"\u041a\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)","bold_desc":"\u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 (Ctrl+B)",dd:"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430",dt:"\u0422\u0435\u0440\u043c\u0438\u043d \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430",samp:"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430",code:"\u041a\u043e\u0434",blockquote:"\u0426\u0438\u0442\u0430\u0442\u0430",h6:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6",h5:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5",h4:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4",h3:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3",h2:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2",h1:"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1",pre:"\u041f\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439",address:"\u0410\u0434\u0440\u0435\u0441",div:"Div",paragraph:"\u0410\u0431\u0437\u0430\u0446",block:"\u0424\u043e\u0440\u043c\u0430\u0442",fontdefault:"\u0428\u0440\u0438\u0444\u0442","font_size":"\u0420\u0430\u0437\u043c\u0435\u0440","style_select":"\u0421\u0442\u0438\u043b\u044c","more_colors":"\u0414\u0440\u0443\u0433\u0438\u0435 \u0446\u0432\u0435\u0442\u0430...","toolbar_focus":"\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u043a\u043d\u043e\u043f\u043e\u043a (Alt+Q). \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0443 (Alt+Z). \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u0443\u0442\u0438 (Alt+X).",newdocument:"\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0441\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c?",path:"\u0422\u0435\u0433\u0438","clipboard_msg":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0440\u0435\u0437\u043a\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 Firefox.\\r\\n\u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e?","blockquote_desc":"\u0426\u0438\u0442\u0430\u0442\u0430","help_desc":"\u041f\u043e\u043c\u043e\u0449\u044c","newdocument_desc":"\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442","image_props_desc":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","paste_desc":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c","copy_desc":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cut_desc":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c","anchor_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044f\u043a\u043e\u0440\u044c","visualaid_desc":"\u0412\u0441\u0435 \u0437\u043d\u0430\u043a\u0438","charmap_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b","backcolor_desc":"\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430","forecolor_desc":"\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430","custom1_desc":"\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","removeformat_desc":"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442","hr_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0442\u0443","sup_desc":"\u041d\u0430\u0434\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439","sub_desc":"\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439","code_desc":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTML \u043a\u043e\u0434","cleanup_desc":"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u043e\u0434","image_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","unlink_desc":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","link_desc":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","redo_desc":"\u0412\u0435\u0440\u043d\u0443\u0442\u044c (Ctrl+Y)","undo_desc":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (Ctrl+Z)","indent_desc":"\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f","outdent_desc":"\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f","numlist_desc":"\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","bullist_desc":"\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","justifyfull_desc":"\u041f\u043e \u0448\u0438\u0440\u0438\u043d\u0435","justifyright_desc":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","justifycenter_desc":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","justifyleft_desc":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","striketrough_desc":"\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":""}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/langs/ru_dlg.js b/js/tiny_mce/themes/advanced/langs/ru_dlg.js new file mode 100755 index 000000000..a1ad580bb --- /dev/null +++ b/js/tiny_mce/themes/advanced/langs/ru_dlg.js @@ -0,0 +1 @@ +tinyMCE.addI18n('ru.advanced_dlg',{"link_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a","link_is_external":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 http://?","link_is_email":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 mailto:?","link_titlefield":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","link_target_blank":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435","link_target_same":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u043d\u0435","link_target":"\u0426\u0435\u043b\u044c","link_url":"\u0410\u0434\u0440\u0435\u0441","link_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0441\u044b\u043b\u043a\u0438","image_align_right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_textbottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","image_align_texttop":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e \u0442\u0435\u043a\u0441\u0442\u0430","image_align_bottom":"\u041f\u043e \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_middle":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","image_align_top":"\u041f\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u043a\u0440\u0430\u044e","image_align_baseline":"\u041f\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438","image_align":"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","image_hspace":"\u0413\u043e\u0440\u0438\u0437. \u043e\u0442\u0441\u0442\u0443\u043f","image_vspace":"\u0412\u0435\u0440\u0442. \u043e\u0442\u0441\u0442\u0443\u043f","image_dimensions":"\u0420\u0430\u0437\u043c\u0435\u0440","image_alt":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","image_list":"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a","image_border":"\u0413\u0440\u0430\u043d\u0438\u0446\u0430","image_src":"\u0410\u0434\u0440\u0435\u0441","image_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","charmap_title":"\u0412\u044b\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u0430","colorpicker_name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:","colorpicker_color":"\u041a\u043e\u0434:","colorpicker_named_title":"\u0426\u0432\u0435\u0442\u0430","colorpicker_named_tab":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f","colorpicker_palette_title":"\u0426\u0432\u0435\u0442\u0430","colorpicker_palette_tab":"\u041f\u0430\u043b\u0438\u0442\u0440\u0430","colorpicker_picker_title":"\u0426\u0432\u0435\u0442\u0430","colorpicker_picker_tab":"\u0421\u043f\u0435\u043a\u0442\u0440","colorpicker_title":"\u0426\u0432\u0435\u0442\u0430","code_wordwrap":"\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u043a","code_title":"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 HTML \u043a\u043e\u0434\u0430","anchor_name":"\u0418\u043c\u044f \u044f\u043a\u043e\u0440\u044f","anchor_title":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u043a\u043e\u0440\u044f","about_loaded":"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b","about_version":"\u0412\u0435\u0440\u0441\u0438\u044f","about_author":"\u0410\u0432\u0442\u043e\u0440","about_plugin":"\u041f\u043b\u0430\u0433\u0438\u043d","about_plugins":"\u041f\u043b\u0430\u0433\u0438\u043d\u044b","about_license":"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f","about_help":"\u041f\u043e\u043c\u043e\u0449\u044c","about_general":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","about_title":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 TinyMCE","anchor_invalid":"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u044f\u043a\u043e\u0440\u044f."}); \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/link.htm b/js/tiny_mce/themes/advanced/link.htm new file mode 100644 index 000000000..5d9dea9b8 --- /dev/null +++ b/js/tiny_mce/themes/advanced/link.htm @@ -0,0 +1,57 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.link_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="../../utils/mctabs.js"></script> + <script type="text/javascript" src="../../utils/form_utils.js"></script> + <script type="text/javascript" src="../../utils/validate.js"></script> + <script type="text/javascript" src="js/link.js"></script> +</head> +<body id="link" style="display: none"> +<form onsubmit="LinkDialog.update();return false;" action="#"> + <div class="tabs"> + <ul> + <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.link_title}</a></span></li> + </ul> + </div> + + <div class="panel_wrapper"> + <div id="general_panel" class="panel current"> + <table border="0" cellpadding="4" cellspacing="0"> + <tr> + <td class="nowrap"><label for="href">{#advanced_dlg.link_url}</label></td> + <td><table border="0" cellspacing="0" cellpadding="0"> + <tr> + <td><input id="href" name="href" type="text" class="mceFocus" value="" style="width: 200px" onchange="LinkDialog.checkPrefix(this);" /></td> + <td id="hrefbrowsercontainer">&nbsp;</td> + </tr> + </table></td> + </tr> + <tr> + <td><label for="link_list">{#advanced_dlg.link_list}</label></td> + <td><select id="link_list" name="link_list" onchange="document.getElementById('href').value=this.options[this.selectedIndex].value;"></select></td> + </tr> + <tr> + <td><label id="targetlistlabel" for="targetlist">{#advanced_dlg.link_target}</label></td> + <td><select id="target_list" name="target_list"></select></td> + </tr> + <tr> + <td class="nowrap"><label for="linktitle">{#advanced_dlg.link_titlefield}</label></td> + <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px" /></td> + </tr> + <tr> + <td><label for="class_list">{#class_name}</label></td> + <td><select id="class_list" name="class_list"></select></td> + </tr> + </table> + </div> + </div> + + <div class="mceActionPanel"> + <input type="submit" id="insert" name="insert" value="{#insert}" /> + <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> + </div> +</form> +</body> +</html> diff --git a/js/tiny_mce/themes/advanced/shortcuts.htm b/js/tiny_mce/themes/advanced/shortcuts.htm new file mode 100644 index 000000000..20ec2f5a3 --- /dev/null +++ b/js/tiny_mce/themes/advanced/shortcuts.htm @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>{#advanced_dlg.accessibility_help}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript">tinyMCEPopup.requireLangPack();</script> + </head> + <body id="content"> + <h1>{#advanced_dlg.accessibility_usage_title}</h1> + <h2>Toolbars</h2> + <p>Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. + Press enter to activate a button and return focus to the editor. + Press escape to return focus to the editor without performing any actions.</p> + + <h2>Status Bar</h2> + <p>To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. + Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.</p> + + <h2>Context Menu</h2> + <p>Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. + To close submenus press the left arrow key. Press escape to close the context menu.</p> + + <h1>Keyboard Shortcuts</h1> + <table> + <thead> + <tr> + <th>Keystroke</th> + <th>Function</th> + </tr> + </thead> + <tbody> + <tr> + <td>Control-B</td><td>Bold</td> + </tr> + <tr> + <td>Control-I</td><td>Italic</td> + </tr> + <tr> + <td>Control-Z</td><td>Undo</td> + </tr> + <tr> + <td>Control-Y</td><td>Redo</td> + </tr> + </tbody> + </table> + </body> +</html> diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/content.css b/js/tiny_mce/themes/advanced/skins/cirkuit/content.css new file mode 100755 index 000000000..4f337422a --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/cirkuit/content.css @@ -0,0 +1,66 @@ +/*body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +body {background:#FFF;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important}*/ +body, td, pre {color:#000; font: 12px/1.5em "Lucida Grande", Helvetica, Arial, sans-serif; margin:8px;} +html,body {padding: 0 !important; margin: 0 !important; background:#fff !important;} +body {height: 94% !important; padding: 0 !important;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(img/items.gif) no-repeat bottom left;} +img.mceItemAnchor {width:12px; height:12px; background:url(img/items.gif) no-repeat;} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr, html\:abbr {border-bottom:1px dashed #CCC; cursor:help} + +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/dialog.css b/js/tiny_mce/themes/advanced/skins/cirkuit/dialog.css new file mode 100755 index 000000000..1a1f359a1 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/cirkuit/dialog.css @@ -0,0 +1,117 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +background:#f1f1f1; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#f1f1f1;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #dfdfdf; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #dfdfdf;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #dfdfdf;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, #apply, .mceActionPanel .button, input.mceButton, .updateButton { + border: 1px solid #bbb; + margin:0; + padding:0 0 1px; + font-weight:bold; + font-size: 11px; + width:94px; + height:24px; + background:url(img/fade-butt.png) 0 0; + color:#000; + cursor:pointer; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +#insert:hover, #cancel:hover, input.mceButton:hover, .updateButton:hover, +#insert:focus, #cancel:focus, input.mceButton:focus, .updateButton:focus { + border: 1px solid #555; +} + +/* Browse */ +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor, a.browse {text-decoration:none} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} +#charmap #charmapView {background-color:#fff;} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/butt2.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/butt2.png new file mode 100755 index 0000000000000000000000000000000000000000..3baae5e6d75ef9e1963e2f30481a296064fdd99c GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr<)6OepWc~=WaNtU=qlmzFem6RtIr7}3C<R_&n zc;+Uirv{}arc@T5Otk?j()4t345_%4^yl+)e&)ObpZ@><ANW#H_3!)p`!6O)PL=b` hUVKT#o0&y|A?5EhMS=ZO=KwV^c)I$ztaD0e0sv)(E%g8Z literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/button-bg.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/button-bg.png new file mode 100755 index 0000000000000000000000000000000000000000..0c2c5f8a048d139cff93f95ddb45d6490de9b64b GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz1!VDzu*(gT<Ddu7)&kzm{j@u9Y9{{-q0X`wF zw{PFRb?es6n>TOVxN-gZ^=sFzUA=ns%9SgZFJHcN>C(lE7cX46aQ^)HbLY;TJ$v@d znKM0!P9;FSoCO|{#S9GGLLkg|>2BR0prB}pYeb22QEFmIW`3SRNM>#-gQ32mk-mY2 z+A4?dKm{@&1;P1gCFO}lsSJ)O`AMk?Zka`?<@rU~#R|^B#xt(Df!yon>Eak7G1d3j zMTP?kA`TaqPdFqJ<e}KAxnzP9m!?l5m*$cUfA7BgX(j01RDJMl0rwrQ?`^jqlpSfX lerQ(^zk~Z-+i%Cej7uNR5=>h1)DUPQgQu&X%Q~loCIG9gcp?A* literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/buttons.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/buttons.png new file mode 100755 index 0000000000000000000000000000000000000000..7dd58418ba7cfe58ae7efdf174e0b223fe3aa6a0 GIT binary patch literal 3274 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 IM6N<$f-S7efB*mh literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/down_arrow.gif b/js/tiny_mce/themes/advanced/skins/cirkuit/img/down_arrow.gif new file mode 100755 index 0000000000000000000000000000000000000000..687b241eec371858a6b084712623ee9e1f89e2c7 GIT binary patch literal 60 zcmZ?wbhEHb<YEwEXkY+=|Ns9h{$ycfU|?j>0r5dH3{1j3{VPwu<>#LvvLH)1)$$jA Jn-3#{H2|P`4%+|# literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/fade-butt.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/fade-butt.png new file mode 100755 index 0000000000000000000000000000000000000000..42f08b79942d32f9d7e693b6952c2d935e352774 GIT binary patch literal 785 zcmb`F-%C?r7{}lJa2&>jxy)rl9Mwn%LP*puyzuCjPMwJ95JKF>j+PKsXg_GsnhtD8 zh=^TCB+KZ+w1O@i>_T)@BanhF!iyL+Vms&T{MtEZJ7;Iq>;Dih&-?H^?}zX6eBpgE zG}u$CKdlD<)Vh0}!!XywXhAgaPSf^0Oxh{bg97mO^W~b@aosrU8k@a3GdX+De+L6- za3+9R-8cPH*f8b~KDeF6Iv|7(4UD)7Bq<02RVXNmg6H!LO&2+?R4U1`OcDggapiKE zFY+wIunf!d#VW*b2<D}-Bnkq{G9|G@k|fXbG)<REB1zyJ$4ce0B+GoUNDzb|h<F|+ zah#$kx=@g1NvXnFIRXm7hg^=PXo$m85=DwC&@?4W5`hy0o+ojl$Z|!FRVo!(lHn4P zB-0ed(3B{OL>^}-T9V2H+?-(*rOF(SfEtt}NrEU;s|w4ql}aU_%l$QMw*#Qsc019L z`$qxet-2wzufeA~GdF29GQ(3k#HwpP=Tp5>sTUs~bbFp^79H8|jwMGn{Nu=E4WHV@ z<`Pj1OGKNZ!frxXz@l>r$fB|FiN4r)-$3m7_{6|c6Ou{+s8EME>s@=BuaUFM*eAr; zY2XyDLos!9uJm+8Ui3todx6%dF|QjeX0yfetkJS=SZ+O-Jgk9eC?1L*hC<0?DEZSH ziYJrFcpRuw8!vzFO<!+G+i!fax2E;#l^xj3d<^cTHm5g!9i}$p`$0``t6c?!=N<FA z4vluP+Z_gh%t&VS(x^9+U0w68c`tbXWV08K?KYf8QO`rP4L#v$JAvA4o;K75abuv) zWD5BG-@fVs*8X|dH4AhfdJn>2-wvIO)u`0SmbDZ3PihhCn+Q-Xj2f-scY3wf=tci0 Zqyhce4|i>ku8hL(3f!(i=T4U|@(=9Ekd*)c literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/icons.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/icons.png new file mode 100755 index 0000000000000000000000000000000000000000..7525d9d3fc9319c50cb99cfe827e348c33d08d3c GIT binary patch literal 30143 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 QPh<s=mXH^(5j70@KZNf)_5c6? literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/items.gif b/js/tiny_mce/themes/advanced/skins/cirkuit/img/items.gif new file mode 100755 index 0000000000000000000000000000000000000000..2eafd7954e6ebf24204b01db94b39299426d09da GIT binary patch literal 70 zcmZ?wbhEHb<YwSzn8*ME|3Tmk5G(#<VPs%nX3znNg5({T#9MmG)lT2O)m+%L<jU2W QWB(Hum`qCgDav3C08tAXbN~PV literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/menu-arrow.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/menu-arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..bdfe5098e850315a2714d2b967c6f53ee3f28f96 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8Vow*xkcwMxCg0^epup4e-l$RUp_twj$2*6g${e1u&tqXg zuvYCSh5U!7@3*G4O%>9)#`cfFM|1DygPF6J3kU{>&VJhaC-UGu>!@svr8}&ip1Gl- z+tM({IH_mF)=$PCHp%Jj-o*ZlttxTd#P6?jAH=pZFf&Lt#hi`W@N5&%dInEdKbLh* G2~7aE5>Ze9 literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/menu-check.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/menu-check.png new file mode 100755 index 0000000000000000000000000000000000000000..92a5edb8b253e66272c45b7a36a59830afb17a3f GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h83QrfukcwMxCL3}cP~dU>>@BAM;7RYErta%s9s2$$O;KXy zzLqCdz;V$1Q;&jXJ)2np<ARU}FFFl3g<HExb0`WpY+twDE}-|rzPEdq8@d&pyDt;= zU@7Z4%cyMEP}QX^nhBG=HCcn#-*LMAarw1pFN^+9x!Sm#ftle>SkJ-6_M0(4H!yg* L`njxgN@xNA-yl#p literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/progress.gif b/js/tiny_mce/themes/advanced/skins/cirkuit/img/progress.gif new file mode 100755 index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/tabs.gif b/js/tiny_mce/themes/advanced/skins/cirkuit/img/tabs.gif new file mode 100755 index 0000000000000000000000000000000000000000..ce4be63558b02e9837b995d2b9dd540ce6d61a6f GIT binary patch literal 1326 zcmV+}1=0FPNk%w1VJrb!0M!5h00030|Ns2_{xV8plA^M<#LbbXwB+gR<LT_}@$;dx zyQ#Uq<LT>>o1FUl`^eGF(ALoK@apvR@ALES^78HR@$B&M>-P5Y_4V=e^zifZ@AC5Q z@$v2U_Ve}i^85Sw`1tnr_VoSz{QUg;`uh3!`1kSe-|p?^>+0k0?&$36<?-<A@bBv7 z;@aor-RtP#=HuPz=HTe%-}CYA_Vn`p{{H;@{QCO(|Ns9000000000000000000000 z00000A^8LW001}uEC2ui04xDo000L6KoewPC>oE*q;kn@I-k&}bV{vSuh^^>3n?4| z;IMd1E}PHjw0g~MyWjA*d`_>=7l@jE&+q&HfPsR8goTEOh>41ejE#<ujs_wkHY1jo zn3<ZJoSmMZprN9pq@|{(sHv)}s0KGAu(7hUw6(UkxVgH!yuH4^z`?@9#Kpu0B_PVn z%+1cv(9zP<)YaD4*xB0K+}+;a-UcBd9p&cd=;`X~?CtLF@bU8V^!4`l`1$(y2IUw3 z00RmfNU)&6g9sBUT*$DY!-o(fN}NbhqJaw@FlgM!v7^V2AVZ2ANwTELlPFWFT*<Pf z%a<(;Xv{#frp=o;bL!m5v!~DhpFo2O9ZIyQ(W6L{9yLHygVU!_qe`7hwW`&tShH%~ z%C)Q4uVBN99UInw1PK$;s$I*rt=qS7<I0^&x31m0c=PJr%eSvzz6R1#7)-dZ;lqd% zD_+dFvE#>(BTJr4xw7TUm@OOFuz`c;&!9t#9!<Km>C>oFt6t5zwd>cgW6Pc$+rZ!o zxO3~?&AYen-@t<lA5Ofu@#DyoD__pM`EmoeEl8hEy}I@5*t2Wj&b_<$@8H9WA5Xr# z`SaxsSct&Bz5Dm@<IA5<zrOwZ`19-E&%eL_{{RLE;1&cHXyAbeCaB<o3`*eu1Or4U z;e-@cXyJtzW~kwY9Cqmc;fElGDB_4DmS|#$5E7u`iY&J1;)^iGDC3MY)@b96IOeG1 zjy(40<BvWX0OXKF7HQ;>NG7S|k~SJ3z>`o$Ddm(@N@>THSZ1l^mRxq}B^ypwDdw0~ zere{JXr`&=nrnnf=9^WrDd(JY)@f%NZo;W2ly~;&=bwOLndhE*25RV`h$b4qpoG4u z=%bKEiYB9tjw$J-m}V*mrIp61>8GHE8V0AGPATfCs76X^sZplt>Z^dR%IcG_)@rMq zvd((zuDp7gE33T*D{LLV&T8zj$R?}ovdlK?EUU#nEA6z@R%`9G*b0Edw%m5>?YH2D zEAF`DmTT_0=%%ax?z-%@>+ZYox~sqgCd6y+z4+#<@4o!@>u<RU6ac}$1Q%@Z!3ZaO za19JBpzy;GM=bHg1%E(;0TgGf@x~l?OaluTcP#SAB$s^e3@U_d^2#i??D7gPsO<90 zG}jz4%re`o^Ugfu%R&q}_bl|#M30*S&_yS$w9+TY5cJYeN8NJMPfKm})f=neLe*Gz z?RCN`z`*s_WS6~f*khZm_S)^D&_dd5$1V4`FT6eX-FWA%_ulIc0D%L12aY!ZehY4R z+$zF-_~J`HsW{`15AAs5lv_P{<(MmddFGr8y?N)L+x&Uxq_;eJ>8O)@dg`oiyn5@f zOZ<B5v?n}Ed+oRre0%P^@4I{Nz}x$K@Wi(}eDTO9ul(}NH}CxO&_^%*^wd{x{q@*q kul@Gickli8;D;~%_~e&w{`tx`sQ&uwx9|S@@CN|^JHwS1<NyEw literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/img/toolbarbg.png b/js/tiny_mce/themes/advanced/skins/cirkuit/img/toolbarbg.png new file mode 100755 index 0000000000000000000000000000000000000000..f2951064057f07462ba4848bd90989dc3ac04c31 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz1!2~217p$}aQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsRR+3_V>OLn>}1)%^cw%e=FpvysVQRb|NM6=_-7X+Qt{{hiU! oo3$*F>-XQ^-#tDXJ2Wsd1U~0@eEpggGf*>wr>mdKI;Vst0Kir<hyVZp literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/cirkuit/ui.css b/js/tiny_mce/themes/advanced/skins/cirkuit/ui.css new file mode 100755 index 000000000..f85c208c8 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/cirkuit/ui.css @@ -0,0 +1,988 @@ +/* Reset */ +.cirkuitSkin table, .cirkuitSkin tbody, .cirkuitSkin a, .cirkuitSkin img, .cirkuitSkin tr, .cirkuitSkin div, .cirkuitSkin td, .cirkuitSkin iframe, .cirkuitSkin span, .cirkuitSkin *, .cirkuitSkin .mceText { + border: 0; + margin: 0; + padding: 0; + background: transparent; + white-space: nowrap; + text-decoration: none; + font-weight: normal; + cursor: default; + color: #000; + vertical-align: baseline; + width: auto; + border-collapse: separate; + text-align: left +} + +.cirkuitSkin a:hover, .cirkuitSkin a:link, .cirkuitSkin a:visited, .cirkuitSkin a:active { + text-decoration: none; + font-weight: normal; + cursor: default; + color: #000 +} + +.cirkuitSkin table td { + vertical-align: middle +} + +/* Containers */ +.cirkuitSkin table { + direction:ltr; +} +.cirkuitSkin iframe { + display: block; + background: #FFF; +} + +.cirkuitSkin .mceToolbar { + height: 26px +} + +.cirkuitSkin .mceLeft { + text-align: left +} + +.cirkuitSkin .mceRight { + text-align: right +} + +/* External */ +.cirkuitSkin .mceExternalToolbar { + position: absolute; + border: 1px solid #CCC; + border-bottom: 0; + display: none; +} + +.cirkuitSkin .mceExternalToolbar td.mceToolbar { + padding-right: 13px; +} + +.cirkuitSkin .mceExternalClose { + position: absolute; + top: 3px; + right: 3px; + width: 7px; + height: 7px; + background: url('img/icons.png') -820px 0 +} + +/* Layout */ +.cirkuitSkin table.mceLayout { + border: 0; + border-left: 1px solid #CCC; + border-right: 1px solid #CCC +} + +.cirkuitSkin table.mceLayout tr.mceFirst td { + border-top: 1px solid #CCC +} + +.cirkuitSkin table.mceLayout tr.mceLast td { + border-bottom: 1px solid #CCC; + background: url('img/toolbarbg.png') center repeat-x; +} + +.cirkuitSkin table.mceToolbar, .cirkuitSkin tr.mceFirst .mceToolbar tr td, .cirkuitSkin tr.mceLast .mceToolbar tr td { + border: 0; + margin: 0; + padding: 0; +} + +.cirkuitSkin td.mceToolbar { + padding-top: 1px; + vertical-align: top; + background-color: #DFDFDF; +} + +.cirkuitSkin .mceIframeContainer { + border-top: 1px solid #CCC; + border-bottom: 1px solid #CCC; + /*height: 100%; 5/22/2010 - Joe Rozzi - taken out comparing to default theme ui.css */ +} + +.cirkuitSkin .mceStatusbar { + font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; + font-size: 9pt; + line-height: 16px; + overflow: visible; + color: #666; + display: block; + height: 20px +} + +.cirkuitSkin .mceStatusbar div { + float: left; + /*margin: 3px 0 0 4px;*/ + margin:2px; + color: #666; +} + +.cirkuitSkin .mceStatusbar a.mceResize { + display: block; + float: right; + background: url('img/icons.png') -801px -2px; + width: 20px; + height: 20px; + cursor: se-resize; + outline:0; +} + +.cirkuitSkin .mceStatusbar a:hover { + text-decoration: underline +} + +.cirkuitSkin table.mceToolbar { + margin-left: 3px +} + +.cirkuitSkin span.mceIcon, .cirkuitSkin img.mceIcon { + display: block; + width: 20px; + height: 20px +} + +.cirkuitSkin .mceIcon { + background: url('img/icons.png') no-repeat 20px 20px +} + +.cirkuitSkin td.mceCenter { + text-align: center; +} + +.cirkuitSkin td.mceCenter table { + margin: 0 auto; + text-align: left; +} + +.cirkuitSkin td.mceRight table { + margin: 0 0 0 auto; +} + +/* Button */ +.cirkuitSkin .mceButton { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; + background-image: url("img/butt2.png"); + background-position: left top; + background-repeat: repeat-x; + cursor: default; + display: block; + height: 20px; + margin: 1px; + padding: 1px 2px; + width: 20px; + background-color: #E9E8E8; + border-color: #B2B2B2; +} + +.cirkuitSkin a.mceButtonEnabled:hover { + background-position: 0 -10px; + border-color: #777; +} + +.cirkuitSkin a.mceButtonActive, .cirkuitSkin a.mceButtonSelected { + background-image: inherit; + border-color: #333; + background: #bcd0f5 !important; +} + +.cirkuitSkin .mceButtonDisabled .mceIcon { + opacity: 0.3; + -ms-filter: 'alpha(opacity=30)'; + filter: alpha(opacity = 30); +} + +.cirkuitSkin .mceButtonLabeled { + width: auto; +} + +.cirkuitSkin .mceButtonLabeled span.mceIcon { + float: left; +} + +.cirkuitSkin span.mceButtonLabel { + display: block; + font-size: 10px; + padding: 4px 6px 0 22px; + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.cirkuitSkin .mceButtonDisabled .mceButtonLabel { + color: #888; +} + +/* Separator */ +.cirkuitSkin .mceSeparator { + background: none repeat scroll 0 0 transparent; + display: block; + height: 24px; + margin: 0 2px; + overflow: hidden; + width: 1px; +} + +/* ListBox */ +.cirkuitSkin .mceListBox { + direction: ltr; + margin: 1px; +} + +.cirkuitSkin .mceListBox, .cirkuitSkin .mceListBox a { + display: block +} + +.cirkuitSkin .mceListBox .mceText { + padding: 1px 2px 1px 5px; + text-align: left; + text-decoration: none !important; + width: 70px; + background-image: url(img/butt2.png); + background-position: left top; + background-repeat: repeat-x; + font-family: Tahoma, Verdana, Arial, Helvetica; + font-size: 11px; + height: 20px; + line-height: 20px; + overflow: hidden; +} + +.cirkuitSkin .mceListBox .mceText, .cirkuitSkin .mceListBox .mceOpen { + background-color: #D5D5D5; + border-color: #B2B2B2; +} + +.cirkuitSkin table.mceListBoxEnabled:hover .mceOpen, .cirkuitSkin .mceListBoxHover .mceOpen, .cirkuitSkin .mceListBoxSelected .mceOpen, .cirkuitSkin .mceListBoxSelected .mceText { + border-color: #777 !important; + background-color: #d5d5d5 !important; +} + +.cirkuitSkin table.mceListBoxEnabled:hover .mceText, .cirkuitSkin .mceListBoxHover .mceText { + border-color: #777 !important; +} + +.cirkuitSkin table.mceListBoxEnabled:hover .mceText, .cirkuitSkin .mceListBoxHover .mceText, .cirkuitSkin .mceListBoxSelected .mceText, .cirkuitSkin table.mceListBoxEnabled:hover .mceOpen, .cirkuitSkin .mceListBoxHover .mceOpen, .cirkuitSkin .mceListBoxSelected .mceOpen { + background-image: none; +} + +.cirkuitSkin .mceListBoxDisabled a.mceText { + color: gray; + background-color: transparent; +} + +.cirkuitSkin .mceListBoxMenu { + overflow: auto; + overflow-x: hidden +} + +.cirkuitSkin .mceOldBoxModel .mceListBox .mceText { + height: 22px +} + +.cirkuitSkin .mceOldBoxModel .mceListBox .mceOpen { + width: 11px; + height: 22px; +} + +.cirkuitSkin select.mceNativeListBox { + font: 11px 'Lucida Grande', Helvetica, Arial, sans-serif; + background: #F0F0EE; + border: 1px solid gray; + margin-right: 2px; +} + +.cirkuitSkin .mceListBox .mceOpen { + width: 14px; + height: 20px; + border-collapse: separate; + background-image: url(img/butt2.png); + background-position: left top; + background-repeat: repeat-x; + padding: 1px; + border-left: 0 none !important; +} + +.cirkuitSkin .mceListBox .mceOpen span { + display: block; + width: 14px; + height: 20px; + background-image: url(img/down_arrow.gif); + background-position: 2px 1px; + background-repeat: no-repeat; +} + +/* SplitButton */ +.cirkuitSkin .mceSplitButton { + width: 32px; + height: 20px; + direction: ltr +} + +.cirkuitSkin .mceSplitButton a, .cirkuitSkin .mceSplitButton span { + height: 20px; +} + +.cirkuitSkin .mceSplitButton a { + display: block; +} + +.cirkuitSkin .mceSplitButton a.mceAction { + height: 20px; + width: 20px; + padding: 1px 2px; + display: block; +} + +.cirkuitSkin .mceSplitButton span.mceAction { + width: 20px; + background: url('img/icons.png') 20px 20px; + display: block; +} + +.cirkuitSkin .mceSplitButton a.mceOpen { + width: 10px; + height: 20px; + background-image: url(img/down_arrow.gif); + background-position: 1px 2px; + background-repeat: no-repeat; + padding: 1px; + border-left: 0 none !important; +} + +.cirkuitSkin .mceSplitButtonDisabled .mceAction, .cirkuitSkin .mceSplitButtonDisabled span.mceOpen { + opacity: 0.3; + filter: alpha(opacity = 30); +} + +.cirkuitSkin .mceSplitButtonActive a.mceAction { + border: 1px solid #0A246A; + background-color: #C2CBE0; +} + +.cirkuitSkin table.mceSplitButton td { + background-image: url(img/butt2.png); + background-position: left top; + background-repeat: repeat-x; +} + +.cirkuitSkin .mceSplitButton a.mceAction, .cirkuitSkin .mceSplitButton a.mceOpen { + border-color: #B2B2B2; +} + +.cirkuitSkin .mceListBox a.mceText, .cirkuitSkin .mceSplitButton a.mceAction { + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-left-radius: 3px; +} + +.cirkuitSkin .mceSplitButton a.mceOpen, .cirkuitSkin .mceListBox a.mceOpen { + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} + +.cirkuitSkin .mceSplitButton a.mceOpen:hover, .cirkuitSkin .mceSplitButtonSelected a.mceOpen, .cirkuitSkin table.mceSplitButtonEnabled:hover a.mceAction, .cirkuitSkin .mceSplitButton a.mceAction:hover { + background-color: #d5d5d5; + border-color: #777 !important; +} + +/* ColorSplitButton */ +.cirkuitSkin div.mceColorSplitMenu table { + background: #FFF; + border: 1px solid gray +} + +.cirkuitSkin .mceColorSplitMenu td { + padding: 2px +} + +.cirkuitSkin .mceColorSplitMenu a { + display: block; + width: 9px; + height: 9px; + overflow: hidden; + border: 1px solid #808080 +} + +.cirkuitSkin .mceColorSplitMenu td.mceMoreColors { + padding: 1px 3px 1px 1px +} + +.cirkuitSkin .mceColorSplitMenu a.mceMoreColors { + width: 100%; + height: auto; + text-align: center; + font-family: Tahoma, Verdana, Arial, Helvetica; + font-size: 11px; + line-height: 20px; + border: 1px solid #FFF +} + +.cirkuitSkin .mceColorSplitMenu a.mceMoreColors:hover { + border: 1px solid #0A246A; + background-color: #B6BDD2 +} + +.cirkuitSkin a.mceMoreColors:hover { + border: 1px solid #0A246A +} + +.cirkuitSkin .mceColorPreview { + margin-left: 2px; + width: 16px; + height: 3px; + overflow: hidden; + background: #9a9b9a +} + +.cirkuitSkin .mce_forecolor span.mceAction, .cirkuitSkin .mce_backcolor span.mceAction { + overflow: hidden; + height: 16px +} + +/* Menu */ +.cirkuitSkin .mceMenu { + position: absolute; + left: 0; + top: 0; + z-index: 1000; + border: 1px solid #D4D0C8 +} + +.cirkuitSkin .mceNoIcons span.mceIcon { + width: 0; +} + +.cirkuitSkin .mceNoIcons a .mceText { + padding-left: 10px +} + +.cirkuitSkin .mceMenu table { + background: #FFF +} + +.cirkuitSkin .mceMenu a, .cirkuitSkin .mceMenu span, .cirkuitSkin .mceMenu { + display: block +} + +.cirkuitSkin .mceMenu td { + height: 20px +} + +.cirkuitSkin .mceMenu a { + position: relative; + padding: 3px 0 4px 0 +} + +.cirkuitSkin .mceMenu .mceText { + position: relative; + display: block; + font-family: 'Lucida Grande', Helvetica, Arial, sans-serif; + color: #000; + cursor: default; + margin: 0; + padding: 0 25px 0 25px; + display: block +} + +.cirkuitSkin .mceMenu span.mceText, .cirkuitSkin .mceMenu .mcePreview { + font-size: 11px +} + +.cirkuitSkin .mceMenu pre.mceText { + font-family: Monospace +} + +.cirkuitSkin .mceMenu .mceIcon { + position: absolute; + top: 0; + left: 0; + width: 22px; +} + +.cirkuitSkin .mceMenu .mceMenuItemEnabled a:hover, .cirkuitSkin .mceMenu .mceMenuItemActive { + background-color: #dbecf3 +} + +.cirkuitSkin td.mceMenuItemSeparator { + background: #DDD; + height: 1px +} + +.cirkuitSkin .mceMenuItemTitle a { + border: 0; + background: #EEE; + border-bottom: 1px solid #DDD +} + +.cirkuitSkin .mceMenuItemTitle span.mceText { + color: #000; + font-weight: bold; + padding-left: 4px +} + +.cirkuitSkin .mceMenuItemDisabled .mceText { + color: #888 +} + +.cirkuitSkin .mceMenuItemSelected .mceIcon { + background: url('img/menu-check.png') +} + +.cirkuitSkin .mceNoIcons .mceMenuItemSelected a { + background: url('img/menu-arrow.png') no-repeat -6px center +} + +.cirkuitSkin .mceMenu span.mceMenuLine { + display: none +} + +.cirkuitSkin .mceMenuItemSub a { + background: url('img/menu-arrow.png') no-repeat top right; +} + +/* Progress,Resize */ +.cirkuitSkin .mceBlocker { + position: absolute; + left: 0; + top: 0; + z-index: 1000; + opacity: 0.5; + -ms-filter: 'alpha(opacity=50)'; + filter: alpha(opacity = 50); + background: #FFF +} + +.cirkuitSkin .mceProgress { + position: absolute; + left: 0; + top: 0; + z-index: 1001; + background: url('img/progress.gif') no-repeat; + width: 32px; + height: 32px; + margin: -16px 0 0 -16px +} + +.cirkuitSkin .mcePlaceHolder { + border: 1px dotted gray +} + +/* Formats */ +.cirkuitSkin .mce_formatPreview a { + font-size: 10px +} + +.cirkuitSkin .mce_p span.mceText { +} + +.cirkuitSkin .mce_address span.mceText { + font-style: italic +} + +.cirkuitSkin .mce_pre span.mceText { + font-family: monospace +} + +.cirkuitSkin .mce_h1 span.mceText { + font-weight: bolder; + font-size: 2em +} + +.cirkuitSkin .mce_h2 span.mceText { + font-weight: bolder; + font-size: 1.5em +} + +.cirkuitSkin .mce_h3 span.mceText { + font-weight: bolder; + font-size: 1.17em +} + +.cirkuitSkin .mce_h4 span.mceText { + font-weight: bolder; + font-size: 1em +} + +.cirkuitSkin .mce_h5 span.mceText { + font-weight: bolder; + font-size: .83em +} + +.cirkuitSkin .mce_h6 span.mceText { + font-weight: bolder; + font-size: .75em +} + +/* border */ +.cirkuitSkin .mceExternalToolbar, .cirkuitSkin .mceButton, .cirkuitSkin a.mceButtonEnabled:hover, .cirkuitSkin a.mceButtonActive, .cirkuitSkin a.mceButtonSelected, .cirkuitSkin .mceListBox .mceText, .cirkuitSkin .mceListBox .mceOpen, .cirkuitSkin table.mceListBoxEnabled:hover .mceText, .cirkuitSkin .mceListBoxHover .mceText, .cirkuitSkin .mceListBoxSelected .mceText, .cirkuitSkin table.mceListBoxEnabled:hover .mceOpen, .cirkuitSkin .mceListBoxHover .mceOpen, .cirkuitSkin .mceListBoxSelected .mceOpen, .cirkuitSkin select.mceListBox, .cirkuitSkin .mceSplitButton a.mceAction, .cirkuitSkin .mceSplitButton a.mceOpen, .cirkuitSkin .mceSplitButton a.mceOpen:hover, .cirkuitSkin .mceSplitButtonSelected a.mceOpen, .cirkuitSkin table.mceSplitButtonEnabled:hover a.mceAction, .cirkuitSkin .mceSplitButton a.mceAction:hover, .cirkuitSkin div.mceColorSplitMenu table, .cirkuitSkin .mceColorSplitMenu a, .cirkuitSkin .mceColorSplitMenu a.mceMoreColors, .cirkuitSkin .mceColorSplitMenu a.mceMoreColors:hover, .cirkuitSkin a.mceMoreColors:hover, .cirkuitSkin .mceMenu { + border-style: solid; + border-width: 1px; +} + +/* Theme */ +.cirkuitSkin span.mce_bold { + background-position: 0 0 !important; +} + +.cirkuitSkin span.mce_italic { + background-position: -60px 0 !important; +} + +.cirkuitSkin span.mce_underline { + background-position: -140px 0 !important; +} + +.cirkuitSkin span.mce_strikethrough { + background-position: -120px 0 !important; +} + +.cirkuitSkin span.mce_undo { + background-position: -160px 0 !important; +} + +.cirkuitSkin span.mce_redo { + background-position: -100px 0 !important; +} + +.cirkuitSkin span.mce_cleanup { + background-position: -40px 0 !important; +} + +.cirkuitSkin span.mce_bullist { + background-position: -20px 0 !important; +} + +.cirkuitSkin span.mce_numlist { + background-position: -80px 0 !important; +} + +.cirkuitSkin span.mce_justifyleft { + background-position: -460px 0 !important; +} + +.cirkuitSkin span.mce_justifyright { + background-position: -480px 0 !important; +} + +.cirkuitSkin span.mce_justifycenter { + background-position: -420px 0 !important; +} + +.cirkuitSkin span.mce_justifyfull { + background-position: -440px 0 !important; +} + +.cirkuitSkin span.mce_anchor { + background-position: -200px 0 !important; +} + +.cirkuitSkin span.mce_indent { + background-position: -400px 0 !important; +} + +.cirkuitSkin span.mce_outdent { + background-position: -540px 0 !important; +} + +.cirkuitSkin span.mce_link { + background-position: -500px 0 !important; +} + +.cirkuitSkin span.mce_unlink { + background-position: -640px 0 !important; +} + +.cirkuitSkin span.mce_sub { + background-position: -600px 0 !important; +} + +.cirkuitSkin span.mce_sup { + background-position: -620px 0 !important; +} + +.cirkuitSkin span.mce_removeformat { + background-position: -580px 0 !important; +} + +.cirkuitSkin span.mce_newdocument { + background-position: -520px 0 !important; +} + +.cirkuitSkin span.mce_image { + background-position: -380px 0 !important; +} + +.cirkuitSkin span.mce_help { + background-position: -340px 0 !important; +} + +.cirkuitSkin span.mce_code { + background-position: -260px 0 !important; +} + +.cirkuitSkin span.mce_hr { + background-position: -360px 0 !important; +} + +.cirkuitSkin span.mce_visualaid { + background-position: -660px 0 !important; +} + +.cirkuitSkin span.mce_charmap { + background-position: -240px 0 !important; +} + +.cirkuitSkin span.mce_paste { + background-position: -560px 0 !important; +} + +.cirkuitSkin span.mce_copy { + background-position: -700px 0 !important; +} + +.cirkuitSkin span.mce_cut { + background-position: -680px 0 !important; +} + +.cirkuitSkin span.mce_blockquote { + background-position: -220px 0 !important; +} + +.cirkuitSkin .mce_forecolor span.mceAction { + background-position: -720px 0 !important; +} + +.cirkuitSkin .mce_backcolor span.mceAction { + background-position: -760px 0 !important; +} + +.cirkuitSkin span.mce_forecolorpicker { + background-position: -720px 0 !important; +} + +.cirkuitSkin span.mce_backcolorpicker { + background-position: -760px 0 !important; +} + +/* Plugins */ +.cirkuitSkin span.mce_advhr { + background-position: -0px -20px !important; +} + +.cirkuitSkin span.mce_ltr { + background-position: -20px -20px !important; +} + +.cirkuitSkin span.mce_rtl { + background-position: -40px -20px !important; +} + +.cirkuitSkin span.mce_emotions { + background-position: -60px -20px !important; +} + +.cirkuitSkin span.mce_fullpage { + background-position: -80px -20px !important; +} + +.cirkuitSkin span.mce_fullscreen { + background-position: -100px -20px !important; +} + +.cirkuitSkin span.mce_iespell { + background-position: -120px -20px !important; +} + +.cirkuitSkin span.mce_insertdate { + background-position: -140px -20px !important; +} + +.cirkuitSkin span.mce_inserttime { + background-position: -160px -20px !important; +} + +.cirkuitSkin span.mce_absolute { + background-position: -180px -20px !important; +} + +.cirkuitSkin span.mce_backward { + background-position: -200px -20px !important; +} + +.cirkuitSkin span.mce_forward { + background-position: -220px -20px !important; +} + +.cirkuitSkin span.mce_insert_layer { + background-position: -240px -20px !important; +} + +.cirkuitSkin span.mce_insertlayer { + background-position: -260px -20px !important; +} + +.cirkuitSkin span.mce_movebackward { + background-position: -280px -20px !important; +} + +.cirkuitSkin span.mce_moveforward { + background-position: -300px -20px !important; +} + +.cirkuitSkin span.mce_media { + background-position: -320px -20px !important; +} + +.cirkuitSkin span.mce_nonbreaking { + background-position: -340px -20px !important; +} + +.cirkuitSkin span.mce_pastetext { + background-position: -360px -20px !important; +} + +.cirkuitSkin span.mce_pasteword { + background-position: -380px -20px !important; +} + +.cirkuitSkin span.mce_selectall { + background-position: -400px -20px !important; +} + +.cirkuitSkin span.mce_preview { + background-position: -420px -20px !important; +} + +.cirkuitSkin span.mce_print { + background-position: -440px -20px !important; +} + +.cirkuitSkin span.mce_cancel { + background-position: -460px -20px !important; +} + +.cirkuitSkin span.mce_save { + background-position: -480px -20px !important; +} + +.cirkuitSkin span.mce_replace { + background-position: -500px -20px !important; +} + +.cirkuitSkin span.mce_search { + background-position: -520px -20px !important; +} + +.cirkuitSkin span.mce_styleprops { + background-position: -560px -20px !important; +} + +.cirkuitSkin span.mce_table { + background-position: -580px -20px !important; +} + +.cirkuitSkin span.mce_cell_props { + background-position: -600px -20px !important; +} + +.cirkuitSkin span.mce_delete_table { + background-position: -620px -20px !important; +} + +.cirkuitSkin span.mce_delete_col { + background-position: -640px -20px !important; +} + +.cirkuitSkin span.mce_delete_row { + background-position: -660px -20px !important; +} + +.cirkuitSkin span.mce_col_after { + background-position: -680px -20px !important; +} + +.cirkuitSkin span.mce_col_before { + background-position: -700px -20px !important; +} + +.cirkuitSkin span.mce_row_after { + background-position: -720px -20px !important; +} + +.cirkuitSkin span.mce_row_before { + background-position: -740px -20px !important; +} + +.cirkuitSkin span.mce_merge_cells { + background-position: -760px -20px !important; +} + +.cirkuitSkin span.mce_table_props { + background-position: -980px -20px !important; +} + +.cirkuitSkin span.mce_row_props { + background-position: -780px -20px !important; +} + +.cirkuitSkin span.mce_split_cells { + background-position: -800px -20px !important; +} + +.cirkuitSkin span.mce_template { + background-position: -820px -20px !important; +} + +.cirkuitSkin span.mce_visualchars { + background-position: -840px -20px !important; +} + +.cirkuitSkin span.mce_abbr { + background-position: -860px -20px !important; +} + +.cirkuitSkin span.mce_acronym { + background-position: -880px -20px !important; +} + +.cirkuitSkin span.mce_attribs { + background-position: -900px -20px !important; +} + +.cirkuitSkin span.mce_cite { + background-position: -920px -20px !important; +} + +.cirkuitSkin span.mce_del { + background-position: -940px -20px !important; +} + +.cirkuitSkin span.mce_ins { + background-position: -960px -20px !important; +} + +.cirkuitSkin span.mce_pagebreak { + background-position: 0 -40px !important; +} + +.cirkuitSkin .mce_spellchecker span.mceAction { + background-position: -540px -20px !important; +} + +.cirkuitSkin span.mce_restoredraft { + background-position: -20px -40px !important; +} diff --git a/js/tiny_mce/themes/advanced/skins/default/content.css b/js/tiny_mce/themes/advanced/skins/default/content.css new file mode 100644 index 000000000..842d52d4e --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/default/content.css @@ -0,0 +1,47 @@ +body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +body {background:#FFF;} +body.mceForceColors {background:#FFF; color:#000;} +body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/js/tiny_mce/themes/advanced/skins/default/dialog.css b/js/tiny_mce/themes/advanced/skins/default/dialog.css new file mode 100644 index 000000000..1f5598c69 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/default/dialog.css @@ -0,0 +1,117 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(img/buttons.png) 0 -52px} +#cancel {background:url(img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/js/tiny_mce/themes/advanced/skins/default/img/buttons.png b/js/tiny_mce/themes/advanced/skins/default/img/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd58418ba7cfe58ae7efdf174e0b223fe3aa6a0 GIT binary patch literal 3274 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 IM6N<$f-S7efB*mh literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/default/img/items.gif b/js/tiny_mce/themes/advanced/skins/default/img/items.gif new file mode 100644 index 0000000000000000000000000000000000000000..2eafd7954e6ebf24204b01db94b39299426d09da GIT binary patch literal 70 zcmZ?wbhEHb<YwSzn8*ME|3Tmk5G(#<VPs%nX3znNg5({T#9MmG)lT2O)m+%L<jU2W QWB(Hum`qCgDav3C08tAXbN~PV literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif b/js/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..85e31dfb2d0454de352d87fe95f7003f22c87992 GIT binary patch literal 68 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41Cw-5|H{*E`4`XOxxoD9Y}F^Z SLTQbO*E^TJI;F+RU=09Vu@yA{ literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/js/tiny_mce/themes/advanced/skins/default/img/menu_check.gif new file mode 100644 index 0000000000000000000000000000000000000000..adfdddccd7cac62a17d68873fa53c248bff8351a GIT binary patch literal 70 zcmZ?wbhEHb6k!lyXkcUjg8%>jEB<5wG8q|kKzxu41Cwk||H{*E`4`XG(j;}D)%x|1 U%)82UlRJ8EoZ9xTT7<zG0H3rM{r~^~ literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/default/img/progress.gif b/js/tiny_mce/themes/advanced/skins/default/img/progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif b/js/tiny_mce/themes/advanced/skins/default/img/tabs.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce4be63558b02e9837b995d2b9dd540ce6d61a6f GIT binary patch literal 1326 zcmV+}1=0FPNk%w1VJrb!0M!5h00030|Ns2_{xV8plA^M<#LbbXwB+gR<LT_}@$;dx zyQ#Uq<LT>>o1FUl`^eGF(ALoK@apvR@ALES^78HR@$B&M>-P5Y_4V=e^zifZ@AC5Q z@$v2U_Ve}i^85Sw`1tnr_VoSz{QUg;`uh3!`1kSe-|p?^>+0k0?&$36<?-<A@bBv7 z;@aor-RtP#=HuPz=HTe%-}CYA_Vn`p{{H;@{QCO(|Ns9000000000000000000000 z00000A^8LW001}uEC2ui04xDo000L6KoewPC>oE*q;kn@I-k&}bV{vSuh^^>3n?4| z;IMd1E}PHjw0g~MyWjA*d`_>=7l@jE&+q&HfPsR8goTEOh>41ejE#<ujs_wkHY1jo zn3<ZJoSmMZprN9pq@|{(sHv)}s0KGAu(7hUw6(UkxVgH!yuH4^z`?@9#Kpu0B_PVn z%+1cv(9zP<)YaD4*xB0K+}+;a-UcBd9p&cd=;`X~?CtLF@bU8V^!4`l`1$(y2IUw3 z00RmfNU)&6g9sBUT*$DY!-o(fN}NbhqJaw@FlgM!v7^V2AVZ2ANwTELlPFWFT*<Pf z%a<(;Xv{#frp=o;bL!m5v!~DhpFo2O9ZIyQ(W6L{9yLHygVU!_qe`7hwW`&tShH%~ z%C)Q4uVBN99UInw1PK$;s$I*rt=qS7<I0^&x31m0c=PJr%eSvzz6R1#7)-dZ;lqd% zD_+dFvE#>(BTJr4xw7TUm@OOFuz`c;&!9t#9!<Km>C>oFt6t5zwd>cgW6Pc$+rZ!o zxO3~?&AYen-@t<lA5Ofu@#DyoD__pM`EmoeEl8hEy}I@5*t2Wj&b_<$@8H9WA5Xr# z`SaxsSct&Bz5Dm@<IA5<zrOwZ`19-E&%eL_{{RLE;1&cHXyAbeCaB<o3`*eu1Or4U z;e-@cXyJtzW~kwY9Cqmc;fElGDB_4DmS|#$5E7u`iY&J1;)^iGDC3MY)@b96IOeG1 zjy(40<BvWX0OXKF7HQ;>NG7S|k~SJ3z>`o$Ddm(@N@>THSZ1l^mRxq}B^ypwDdw0~ zere{JXr`&=nrnnf=9^WrDd(JY)@f%NZo;W2ly~;&=bwOLndhE*25RV`h$b4qpoG4u z=%bKEiYB9tjw$J-m}V*mrIp61>8GHE8V0AGPATfCs76X^sZplt>Z^dR%IcG_)@rMq zvd((zuDp7gE33T*D{LLV&T8zj$R?}ovdlK?EUU#nEA6z@R%`9G*b0Edw%m5>?YH2D zEAF`DmTT_0=%%ax?z-%@>+ZYox~sqgCd6y+z4+#<@4o!@>u<RU6ac}$1Q%@Z!3ZaO za19JBpzy;GM=bHg1%E(;0TgGf@x~l?OaluTcP#SAB$s^e3@U_d^2#i??D7gPsO<90 zG}jz4%re`o^Ugfu%R&q}_bl|#M30*S&_yS$w9+TY5cJYeN8NJMPfKm})f=neLe*Gz z?RCN`z`*s_WS6~f*khZm_S)^D&_dd5$1V4`FT6eX-FWA%_ulIc0D%L12aY!ZehY4R z+$zF-_~J`HsW{`15AAs5lv_P{<(MmddFGr8y?N)L+x&Uxq_;eJ>8O)@dg`oiyn5@f zOZ<B5v?n}Ed+oRre0%P^@4I{Nz}x$K@Wi(}eDTO9ul(}NH}CxO&_^%*^wd{x{q@*q kul@Gickli8;D;~%_~e&w{`tx`sQ&uwx9|S@@CN|^JHwS1<NyEw literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/default/ui.css b/js/tiny_mce/themes/advanced/skins/default/ui.css new file mode 100644 index 000000000..e14d36fa2 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/default/ui.css @@ -0,0 +1,213 @@ +/* Reset */ +.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} +.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} +.defaultSkin table td {vertical-align:middle} + +/* Containers */ +.defaultSkin table {direction:ltr;background:transparent} +.defaultSkin iframe {display:block;} +.defaultSkin .mceToolbar {height:26px} +.defaultSkin .mceLeft {text-align:left} +.defaultSkin .mceRight {text-align:right} + +/* External */ +.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} +.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} + +/* Layout */ +.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} +.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} +.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} +.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} +.defaultSkin td.mceToolbar {background:#F0F0EE; padding-top:1px; vertical-align:top} +.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} +.defaultSkin .mceStatusbar {background:#F0F0EE; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} +.defaultSkin .mceStatusbar div {float:left; margin:2px} +.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} +.defaultSkin .mceStatusbar a:hover {text-decoration:underline} +.defaultSkin table.mceToolbar {margin-left:3px} +.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} +.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} +.defaultSkin td.mceCenter {text-align:center;} +.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} +.defaultSkin td.mceRight table {margin:0 0 0 auto;} + +/* Button */ +.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} +.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} +.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.defaultSkin .mceButtonLabeled {width:auto} +.defaultSkin .mceButtonLabeled span.mceIcon {float:left} +.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} +.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} + +/* Separator */ +.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} + +/* ListBox */ +.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} +.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} +.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} +.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} +.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} +.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} +.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} +.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} +.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} + +/* SplitButton */ +.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} +.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} +.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} +.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} +.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} +.defaultSkin .mceSplitButton span.mceOpen {display:none} +.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} +.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} +.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} +.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} + +/* ColorSplitButton */ +.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} +.defaultSkin .mceColorSplitMenu td {padding:2px} +.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} +.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} +.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} +.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} +.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} + +/* Menu */ +.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} +.defaultSkin .mceNoIcons span.mceIcon {width:0;} +.defaultSkin .mceNoIcons a .mceText {padding-left:10px} +.defaultSkin .mceMenu table {background:#FFF} +.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} +.defaultSkin .mceMenu td {height:20px} +.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} +.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} +.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} +.defaultSkin .mceMenu pre.mceText {font-family:Monospace} +.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} +.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} +.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} +.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} +.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} +.defaultSkin .mceMenuItemDisabled .mceText {color:#888} +.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} +.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} +.defaultSkin .mceMenu span.mceMenuLine {display:none} +.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} + +/* Progress,Resize */ +.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} +.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Formats */ +.defaultSkin .mce_formatPreview a {font-size:10px} +.defaultSkin .mce_p span.mceText {} +.defaultSkin .mce_address span.mceText {font-style:italic} +.defaultSkin .mce_pre span.mceText {font-family:monospace} +.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} + +/* Theme */ +.defaultSkin span.mce_bold {background-position:0 0} +.defaultSkin span.mce_italic {background-position:-60px 0} +.defaultSkin span.mce_underline {background-position:-140px 0} +.defaultSkin span.mce_strikethrough {background-position:-120px 0} +.defaultSkin span.mce_undo {background-position:-160px 0} +.defaultSkin span.mce_redo {background-position:-100px 0} +.defaultSkin span.mce_cleanup {background-position:-40px 0} +.defaultSkin span.mce_bullist {background-position:-20px 0} +.defaultSkin span.mce_numlist {background-position:-80px 0} +.defaultSkin span.mce_justifyleft {background-position:-460px 0} +.defaultSkin span.mce_justifyright {background-position:-480px 0} +.defaultSkin span.mce_justifycenter {background-position:-420px 0} +.defaultSkin span.mce_justifyfull {background-position:-440px 0} +.defaultSkin span.mce_anchor {background-position:-200px 0} +.defaultSkin span.mce_indent {background-position:-400px 0} +.defaultSkin span.mce_outdent {background-position:-540px 0} +.defaultSkin span.mce_link {background-position:-500px 0} +.defaultSkin span.mce_unlink {background-position:-640px 0} +.defaultSkin span.mce_sub {background-position:-600px 0} +.defaultSkin span.mce_sup {background-position:-620px 0} +.defaultSkin span.mce_removeformat {background-position:-580px 0} +.defaultSkin span.mce_newdocument {background-position:-520px 0} +.defaultSkin span.mce_image {background-position:-380px 0} +.defaultSkin span.mce_help {background-position:-340px 0} +.defaultSkin span.mce_code {background-position:-260px 0} +.defaultSkin span.mce_hr {background-position:-360px 0} +.defaultSkin span.mce_visualaid {background-position:-660px 0} +.defaultSkin span.mce_charmap {background-position:-240px 0} +.defaultSkin span.mce_paste {background-position:-560px 0} +.defaultSkin span.mce_copy {background-position:-700px 0} +.defaultSkin span.mce_cut {background-position:-680px 0} +.defaultSkin span.mce_blockquote {background-position:-220px 0} +.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} +.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} +.defaultSkin span.mce_forecolorpicker {background-position:-720px 0} +.defaultSkin span.mce_backcolorpicker {background-position:-760px 0} + +/* Plugins */ +.defaultSkin span.mce_advhr {background-position:-0px -20px} +.defaultSkin span.mce_ltr {background-position:-20px -20px} +.defaultSkin span.mce_rtl {background-position:-40px -20px} +.defaultSkin span.mce_emotions {background-position:-60px -20px} +.defaultSkin span.mce_fullpage {background-position:-80px -20px} +.defaultSkin span.mce_fullscreen {background-position:-100px -20px} +.defaultSkin span.mce_iespell {background-position:-120px -20px} +.defaultSkin span.mce_insertdate {background-position:-140px -20px} +.defaultSkin span.mce_inserttime {background-position:-160px -20px} +.defaultSkin span.mce_absolute {background-position:-180px -20px} +.defaultSkin span.mce_backward {background-position:-200px -20px} +.defaultSkin span.mce_forward {background-position:-220px -20px} +.defaultSkin span.mce_insert_layer {background-position:-240px -20px} +.defaultSkin span.mce_insertlayer {background-position:-260px -20px} +.defaultSkin span.mce_movebackward {background-position:-280px -20px} +.defaultSkin span.mce_moveforward {background-position:-300px -20px} +.defaultSkin span.mce_media {background-position:-320px -20px} +.defaultSkin span.mce_nonbreaking {background-position:-340px -20px} +.defaultSkin span.mce_pastetext {background-position:-360px -20px} +.defaultSkin span.mce_pasteword {background-position:-380px -20px} +.defaultSkin span.mce_selectall {background-position:-400px -20px} +.defaultSkin span.mce_preview {background-position:-420px -20px} +.defaultSkin span.mce_print {background-position:-440px -20px} +.defaultSkin span.mce_cancel {background-position:-460px -20px} +.defaultSkin span.mce_save {background-position:-480px -20px} +.defaultSkin span.mce_replace {background-position:-500px -20px} +.defaultSkin span.mce_search {background-position:-520px -20px} +.defaultSkin span.mce_styleprops {background-position:-560px -20px} +.defaultSkin span.mce_table {background-position:-580px -20px} +.defaultSkin span.mce_cell_props {background-position:-600px -20px} +.defaultSkin span.mce_delete_table {background-position:-620px -20px} +.defaultSkin span.mce_delete_col {background-position:-640px -20px} +.defaultSkin span.mce_delete_row {background-position:-660px -20px} +.defaultSkin span.mce_col_after {background-position:-680px -20px} +.defaultSkin span.mce_col_before {background-position:-700px -20px} +.defaultSkin span.mce_row_after {background-position:-720px -20px} +.defaultSkin span.mce_row_before {background-position:-740px -20px} +.defaultSkin span.mce_merge_cells {background-position:-760px -20px} +.defaultSkin span.mce_table_props {background-position:-980px -20px} +.defaultSkin span.mce_row_props {background-position:-780px -20px} +.defaultSkin span.mce_split_cells {background-position:-800px -20px} +.defaultSkin span.mce_template {background-position:-820px -20px} +.defaultSkin span.mce_visualchars {background-position:-840px -20px} +.defaultSkin span.mce_abbr {background-position:-860px -20px} +.defaultSkin span.mce_acronym {background-position:-880px -20px} +.defaultSkin span.mce_attribs {background-position:-900px -20px} +.defaultSkin span.mce_cite {background-position:-920px -20px} +.defaultSkin span.mce_del {background-position:-940px -20px} +.defaultSkin span.mce_ins {background-position:-960px -20px} +.defaultSkin span.mce_pagebreak {background-position:0 -40px} +.defaultSkin span.mce_restoredraft {background-position:-20px -40px} +.defaultSkin span.mce_spellchecker {background-position:-540px -20px} diff --git a/js/tiny_mce/themes/advanced/skins/highcontrast/content.css b/js/tiny_mce/themes/advanced/skins/highcontrast/content.css new file mode 100644 index 000000000..75cfaf180 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/highcontrast/content.css @@ -0,0 +1,23 @@ +body, td, pre { margin:8px;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} diff --git a/js/tiny_mce/themes/advanced/skins/highcontrast/dialog.css b/js/tiny_mce/themes/advanced/skins/highcontrast/dialog.css new file mode 100644 index 000000000..dafcd2805 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/highcontrast/dialog.css @@ -0,0 +1,105 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +background:#F0F0EE; +color: black; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE; color:#000;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;background-color:transparent;} +a:hover {color:#2B6FB6;background-color:transparent;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;background-color:transparent;} +input.invalid {border:1px solid #EE0000;background-color:transparent;} +input {background:#FFF; border:1px solid #CCC;color:black;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +font-weight:bold; +width:94px; height:23px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#cancel {float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;} +.tabs li.current {font-weight: bold; margin-right:2px;} +.tabs span {float:left; display:block; padding:0px 10px 0 0;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} diff --git a/js/tiny_mce/themes/advanced/skins/highcontrast/ui.css b/js/tiny_mce/themes/advanced/skins/highcontrast/ui.css new file mode 100644 index 000000000..a550c8f62 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/highcontrast/ui.css @@ -0,0 +1,101 @@ +/* Reset */ +.highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;} +.highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;} +.highcontrastSkin table td {vertical-align:middle} + +.highcontrastSkin .mceIconOnly {display: block !important;} + +/* External */ +.highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;} +.highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;} + +/* Layout */ +.highcontrastSkin table.mceLayout {border: 1px solid;} +.highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid} +.highcontrastSkin .mceStatusbar a:hover {text-decoration:underline} +.highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;} +.highcontrastSkin .mceStatusbar div {float:left} +.highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0} + +.highcontrastSkin .mceToolbar td { display: inline-block; float: left;} +.highcontrastSkin .mceToolbar tr { display: block;} +.highcontrastSkin .mceToolbar table { display: block; } + +/* Button */ + +.highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;} +.highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em} +.highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} +.highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;} + +/* Separator */ +.highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;} + +/* ListBox */ +.highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceListBox .mceText {padding: 5px 6px; line-height: 2em; width: 15ex; overflow: hidden;} +.highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} +.highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} +.highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} +.highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;} +.highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;} + +.highcontrastSkin .mceListBoxMenu {overflow-y:auto} + +/* SplitButton */ +.highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} + +.highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;} +.highcontrastSkin .mceSplitButton tr { display: table-row; } +.highcontrastSkin table.mceSplitButton { display: table; } +.highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} +.highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} +.highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; } +.highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;} +.highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;} + +/* Menu */ +.highcontrastSkin .mceNoIcons span.mceIcon {width:0;} +.highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; } +.highcontrastSkin .mceMenu table {background:white; color: black} +.highcontrastSkin .mceNoIcons a .mceText {padding-left:10px} +.highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black} +.highcontrastSkin .mceMenu td {height:2em} +.highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;} +.highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;} +.highcontrastSkin .mceMenu pre.mceText {font-family:Monospace} +.highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;} +.highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px} +.highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid} +.highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px} +.highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";} +.highcontrastSkin .mceMenu span.mceMenuLine {display:none} +.highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"} + +/* ColorSplitButton */ +.highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000} +.highcontrastSkin .mceColorSplitMenu td {padding:2px} +.highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;} +.highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.highcontrastSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2} +.highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;} +.highcontrastSkin .mceColorPreview {display:none;} +.highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden} + +/* Progress,Resize */ +.highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} +.highcontrastSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Formats */ +.highcontrastSkin .mce_p span.mceText {} +.highcontrastSkin .mce_address span.mceText {font-style:italic} +.highcontrastSkin .mce_pre span.mceText {font-family:monospace} +.highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/content.css b/js/tiny_mce/themes/advanced/skins/o2k7/content.css new file mode 100644 index 000000000..8569401b7 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/o2k7/content.css @@ -0,0 +1,46 @@ +body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +body {background:#FFF;} +body.mceForceColors {background:#FFF; color:#000;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css new file mode 100644 index 000000000..c97d38e8f --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css @@ -0,0 +1,117 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(../default/img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(../default/img/buttons.png) 0 -52px} +#cancel {background:url(../default/img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker #previewblock {float:right; padding-left:10px; height:20px;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..12cfb419bbf2fb87f845731aa0fceb653d0dbf88 GIT binary patch literal 5859 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 R!Sp}^Mt9BhYjvGt{|88cricIl literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png new file mode 100644 index 0000000000000000000000000000000000000000..8996c7493e8a58c9c40845cbe8abdc3e6730716d GIT binary patch literal 3736 zcmV;J4rlR+P)<h;3K|Lk000e1NJLTq003A3002S=1^@s6)7TNo00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_ zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0 zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc= zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h z1DNytV>2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000BCNkl<Zc-rh+&ubGw6n-1_UXMz#2d@PwG*E?7BF3{` zy@*&!(1Q4<h)^|$fbFs5A{2^d#k7QKQL%_c4_0U~^rl$r56ouALyAo%lVoOhzD+i~ z2YZ<G&71eWet9#qA8}s2eJ==LmGv@J)}Q|$PtRPSJGbYZsBvF!ZENM5o)~u!apfAD zYr1=HLC7__K>)#*re`t|z!@uXQTe7P#;w#Wn=3>BNw{8@$8{@lQTY-PZN7P@?K?Gj zwyh>rjW7nIn1{^QG`8%on(qc8CV(xigUr`7w(PH(?}{LZ1z=n2AoDeiE&HqHGlS6# z<{k|0!N^@1vHK(QHH|I%tL8I<@eCF*F<4lQb18Ga?Qf;>3u`&*#FuMQ)tDj@gnL?+ zxAm_gB0;6{hE)7Um$l7e>&Ne1W6JjfLOsnUkHcDX{8g_)L`17zrR&;ZV(Y}$snNA{ zh3$QHu0!IiJXwRq?iF9_s_e%Eu&s5F`I^R-{Z;c5&)|OMsK;PGCI(wt2br&FY}sEm zpBW5iF!x~Y!Q6ut_Urebmhr)lp99~6uV1}l<S*Bxsu9NE-JOqJ$6?I#yb)Bs`A5r; z8r?|?VxP)NE6dX2A0o%hX0zW<Y;8mG&5f1KCyliZPmi8#2RQw80g`aBSac9^)1T(` z94A5mc5c?p|7D?Ns8p4Sh-m7XT@*H#aJ%K1%e{R*KMwh>r)GVVYyceilo$(Yz}V4n zP`(d_C!HvOqs3NgayGsi@d6C|wnfB2sVXyr<6toNU~muS7GbAF2yPMB7SWl(e&QJH zTzt^Zpl3HDGWZw==T!UMK<qE|V6akECc>)8pl`DTW@K<B9K`;j1n#0not*#<e7g^t z!AFlM%{9s@&DmLBszX#8S7A{tXw|7yl@qtgiPr0=czUDlGn<>7`0`L2pUzihK1EnL zMfjcHMI@KOgLH~u2BR754+FqR2IF2=GJ|d4;MbYKePZzLx8wl)_h4WFR;tSRy$mGR z93ZCWc_TZAw{Yw49Y)Ger7An9-zuB_R#?|izg0$=tF6+SS{PMV2RLmN{Qf|6v_=os zQEE*rtg5SHItn;a)eZ$PAJZ6MTW8fi0h}OKh#E7P8O%MHTLiZVZV|)E;3HKzgzDQ5 zOHtxXNA+a}TiN79wLs43?6K-Quq{H=6GY(F9&DoeGJ}Wq6p<tb^C^NEJXAfH8O$w$ z8H@)QsnpuGBq`uT<mNS1T2sq`64q70a{~hKzX1Snh1TAytgDv*0000<MNUMnLSTZ} Chyz3b literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/js/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5d2550c06d83c1141b78c5af7217e89559fc32 GIT binary patch literal 5358 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 M07*qoM6N<$f@g#ZbN~PV literal 0 HcmV?d00001 diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/ui.css b/js/tiny_mce/themes/advanced/skins/o2k7/ui.css new file mode 100644 index 000000000..91edecad9 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/o2k7/ui.css @@ -0,0 +1,216 @@ +/* Reset */ +.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} +.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} +.o2k7Skin table td {vertical-align:middle} + +/* Containers */ +.o2k7Skin table {background:transparent} +.o2k7Skin iframe {display:block;} +.o2k7Skin .mceToolbar {height:26px} + +/* External */ +.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none} +.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} + +/* Layout */ +.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD} +.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD} +.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} +.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} +.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} +.o2k7Skin td.mceToolbar{background:#E5EFFD} +.o2k7Skin .mceStatusbar {background:#E5EFFD; display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} +.o2k7Skin .mceStatusbar div {float:left; padding:2px} +.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} +.o2k7Skin .mceStatusbar a:hover {text-decoration:underline} +.o2k7Skin table.mceToolbar {margin-left:3px} +.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;} +.o2k7Skin .mceToolbar td.mceFirst span {margin:0} +.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} +.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none} +.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px} +.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} +.o2k7Skin td.mceCenter {text-align:center;} +.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;} +.o2k7Skin td.mceRight table {margin:0 0 0 auto;} + +/* Button */ +.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} +.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px} +.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px} +.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} +.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px} +.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.o2k7Skin .mceButtonLabeled {width:auto} +.o2k7Skin .mceButtonLabeled span.mceIcon {float:left} +.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} +.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888} + +/* Separator */ +.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} + +/* ListBox */ +.o2k7Skin .mceListBox {margin-left:3px} +.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} +.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} +.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} +.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} +.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} +.o2k7Skin .mceListBoxDisabled .mceText {color:gray} +.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} +.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} + +/* SplitButton */ +.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px; direction:ltr} +.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} +.o2k7Skin .mceSplitButton a.mceAction {width:22px} +.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} +.o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0} +.o2k7Skin .mceSplitButton span.mceOpen {display:none} +.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px} +.o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px} +.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.o2k7Skin .mceSplitButtonActive {background-position:0 -44px} + +/* ColorSplitButton */ +.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} +.o2k7Skin .mceColorSplitMenu td {padding:2px} +.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} +.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} +.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A} +.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden} +.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden} + +/* Menu */ +.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD} +.o2k7Skin .mceNoIcons span.mceIcon {width:0;} +.o2k7Skin .mceNoIcons a .mceText {padding-left:10px} +.o2k7Skin .mceMenu table {background:#FFF} +.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block} +.o2k7Skin .mceMenu td {height:20px} +.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0} +.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} +.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px} +.o2k7Skin .mceMenu pre.mceText {font-family:Monospace} +.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} +.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3} +.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px} +.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD} +.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} +.o2k7Skin .mceMenuItemDisabled .mceText {color:#888} +.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)} +.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} +.o2k7Skin .mceMenu span.mceMenuLine {display:none} +.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} + +/* Progress,Resize */ +.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} +.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Formats */ +.o2k7Skin .mce_formatPreview a {font-size:10px} +.o2k7Skin .mce_p span.mceText {} +.o2k7Skin .mce_address span.mceText {font-style:italic} +.o2k7Skin .mce_pre span.mceText {font-family:monospace} +.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} + +/* Theme */ +.o2k7Skin span.mce_bold {background-position:0 0} +.o2k7Skin span.mce_italic {background-position:-60px 0} +.o2k7Skin span.mce_underline {background-position:-140px 0} +.o2k7Skin span.mce_strikethrough {background-position:-120px 0} +.o2k7Skin span.mce_undo {background-position:-160px 0} +.o2k7Skin span.mce_redo {background-position:-100px 0} +.o2k7Skin span.mce_cleanup {background-position:-40px 0} +.o2k7Skin span.mce_bullist {background-position:-20px 0} +.o2k7Skin span.mce_numlist {background-position:-80px 0} +.o2k7Skin span.mce_justifyleft {background-position:-460px 0} +.o2k7Skin span.mce_justifyright {background-position:-480px 0} +.o2k7Skin span.mce_justifycenter {background-position:-420px 0} +.o2k7Skin span.mce_justifyfull {background-position:-440px 0} +.o2k7Skin span.mce_anchor {background-position:-200px 0} +.o2k7Skin span.mce_indent {background-position:-400px 0} +.o2k7Skin span.mce_outdent {background-position:-540px 0} +.o2k7Skin span.mce_link {background-position:-500px 0} +.o2k7Skin span.mce_unlink {background-position:-640px 0} +.o2k7Skin span.mce_sub {background-position:-600px 0} +.o2k7Skin span.mce_sup {background-position:-620px 0} +.o2k7Skin span.mce_removeformat {background-position:-580px 0} +.o2k7Skin span.mce_newdocument {background-position:-520px 0} +.o2k7Skin span.mce_image {background-position:-380px 0} +.o2k7Skin span.mce_help {background-position:-340px 0} +.o2k7Skin span.mce_code {background-position:-260px 0} +.o2k7Skin span.mce_hr {background-position:-360px 0} +.o2k7Skin span.mce_visualaid {background-position:-660px 0} +.o2k7Skin span.mce_charmap {background-position:-240px 0} +.o2k7Skin span.mce_paste {background-position:-560px 0} +.o2k7Skin span.mce_copy {background-position:-700px 0} +.o2k7Skin span.mce_cut {background-position:-680px 0} +.o2k7Skin span.mce_blockquote {background-position:-220px 0} +.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0} +.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0} +.o2k7Skin span.mce_forecolorpicker {background-position:-720px 0} +.o2k7Skin span.mce_backcolorpicker {background-position:-760px 0} + +/* Plugins */ +.o2k7Skin span.mce_advhr {background-position:-0px -20px} +.o2k7Skin span.mce_ltr {background-position:-20px -20px} +.o2k7Skin span.mce_rtl {background-position:-40px -20px} +.o2k7Skin span.mce_emotions {background-position:-60px -20px} +.o2k7Skin span.mce_fullpage {background-position:-80px -20px} +.o2k7Skin span.mce_fullscreen {background-position:-100px -20px} +.o2k7Skin span.mce_iespell {background-position:-120px -20px} +.o2k7Skin span.mce_insertdate {background-position:-140px -20px} +.o2k7Skin span.mce_inserttime {background-position:-160px -20px} +.o2k7Skin span.mce_absolute {background-position:-180px -20px} +.o2k7Skin span.mce_backward {background-position:-200px -20px} +.o2k7Skin span.mce_forward {background-position:-220px -20px} +.o2k7Skin span.mce_insert_layer {background-position:-240px -20px} +.o2k7Skin span.mce_insertlayer {background-position:-260px -20px} +.o2k7Skin span.mce_movebackward {background-position:-280px -20px} +.o2k7Skin span.mce_moveforward {background-position:-300px -20px} +.o2k7Skin span.mce_media {background-position:-320px -20px} +.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px} +.o2k7Skin span.mce_pastetext {background-position:-360px -20px} +.o2k7Skin span.mce_pasteword {background-position:-380px -20px} +.o2k7Skin span.mce_selectall {background-position:-400px -20px} +.o2k7Skin span.mce_preview {background-position:-420px -20px} +.o2k7Skin span.mce_print {background-position:-440px -20px} +.o2k7Skin span.mce_cancel {background-position:-460px -20px} +.o2k7Skin span.mce_save {background-position:-480px -20px} +.o2k7Skin span.mce_replace {background-position:-500px -20px} +.o2k7Skin span.mce_search {background-position:-520px -20px} +.o2k7Skin span.mce_styleprops {background-position:-560px -20px} +.o2k7Skin span.mce_table {background-position:-580px -20px} +.o2k7Skin span.mce_cell_props {background-position:-600px -20px} +.o2k7Skin span.mce_delete_table {background-position:-620px -20px} +.o2k7Skin span.mce_delete_col {background-position:-640px -20px} +.o2k7Skin span.mce_delete_row {background-position:-660px -20px} +.o2k7Skin span.mce_col_after {background-position:-680px -20px} +.o2k7Skin span.mce_col_before {background-position:-700px -20px} +.o2k7Skin span.mce_row_after {background-position:-720px -20px} +.o2k7Skin span.mce_row_before {background-position:-740px -20px} +.o2k7Skin span.mce_merge_cells {background-position:-760px -20px} +.o2k7Skin span.mce_table_props {background-position:-980px -20px} +.o2k7Skin span.mce_row_props {background-position:-780px -20px} +.o2k7Skin span.mce_split_cells {background-position:-800px -20px} +.o2k7Skin span.mce_template {background-position:-820px -20px} +.o2k7Skin span.mce_visualchars {background-position:-840px -20px} +.o2k7Skin span.mce_abbr {background-position:-860px -20px} +.o2k7Skin span.mce_acronym {background-position:-880px -20px} +.o2k7Skin span.mce_attribs {background-position:-900px -20px} +.o2k7Skin span.mce_cite {background-position:-920px -20px} +.o2k7Skin span.mce_del {background-position:-940px -20px} +.o2k7Skin span.mce_ins {background-position:-960px -20px} +.o2k7Skin span.mce_pagebreak {background-position:0 -40px} +.o2k7Skin span.mce_restoredraft {background-position:-20px -40px} +.o2k7Skin span.mce_spellchecker {background-position:-540px -20px} diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css new file mode 100644 index 000000000..85812cde3 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/o2k7/ui_black.css @@ -0,0 +1,8 @@ +/* Black */ +.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} +.o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} +.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} +.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} +.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} +.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)} +.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1} \ No newline at end of file diff --git a/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css new file mode 100644 index 000000000..d64c36169 --- /dev/null +++ b/js/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css @@ -0,0 +1,5 @@ +/* Silver */ +.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} +.o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} +.o2k7SkinSilver .mceListBox .mceText {background:#FFF} +.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} diff --git a/js/tiny_mce/themes/advanced/source_editor.htm b/js/tiny_mce/themes/advanced/source_editor.htm new file mode 100644 index 000000000..3c6d65808 --- /dev/null +++ b/js/tiny_mce/themes/advanced/source_editor.htm @@ -0,0 +1,25 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>{#advanced_dlg.code_title}</title> + <script type="text/javascript" src="../../tiny_mce_popup.js"></script> + <script type="text/javascript" src="js/source_editor.js"></script> +</head> +<body onresize="resizeInputs();" style="display:none; overflow:hidden;"> + <form name="source" onsubmit="saveContent();return false;" action="#"> + <div style="float: left" class="title"><label for="htmlSource">{#advanced_dlg.code_title}</label></div> + + <div id="wrapline" style="float: right"> + <input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{#advanced_dlg.code_wordwrap}</label> + </div> + + <br style="clear: both" /> + + <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea> + + <div class="mceActionPanel"> + <input type="submit" role="button" name="insert" value="{#update}" id="insert" /> + <input type="button" role="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> + </div> + </form> +</body> +</html> diff --git a/js/tiny_mce/tiny_mce.js b/js/tiny_mce/tiny_mce.js new file mode 100644 index 000000000..10bca2226 --- /dev/null +++ b/js/tiny_mce/tiny_mce.js @@ -0,0 +1,12834 @@ +(function(d) { + var a = /^\s*|\s*$/g, + e, c = "B".replace(/A(.)|B/, "$1") === "$1"; + var b = { + majorVersion: "3", + minorVersion: "4.1", + releaseDate: "2011-03-24", + _init: function() { + var s = this, + q = document, + o = navigator, + g = o.userAgent, + m, f, l, k, j, r; + s.isOpera = d.opera && opera.buildNumber; + s.isWebKit = /WebKit/.test(g); + s.isIE = !s.isWebKit && !s.isOpera && (/MSIE/gi).test(g) && (/Explorer/gi).test(o.appName); + s.isIE6 = s.isIE && /MSIE [56]/.test(g); + s.isGecko = !s.isWebKit && /Gecko/.test(g); + s.isMac = g.indexOf("Mac") != -1; + s.isAir = /adobeair/i.test(g); + s.isIDevice = /(iPad|iPhone)/.test(g); + if (d.tinyMCEPreInit) { + s.suffix = tinyMCEPreInit.suffix; + s.baseURL = tinyMCEPreInit.base; + s.query = tinyMCEPreInit.query; + return + } + s.suffix = ""; + f = q.getElementsByTagName("base"); + for (m = 0; m < f.length; m++) { + if (r = f[m].href) { + if (/^https?:\/\/[^\/]+$/.test(r)) { + r += "/" + } + k = r ? r.match(/.*\//)[0] : "" + } + } + function h(i) { + if (i.src && /tiny_mce(|_gzip|_jquery|_prototype|_full)(_dev|_src)?.js/.test(i.src)) { + if (/_(src|dev)\.js/g.test(i.src)) { + s.suffix = "_src" + } + if ((j = i.src.indexOf("?")) != -1) { + s.query = i.src.substring(j + 1) + } + s.baseURL = i.src.substring(0, i.src.lastIndexOf("/")); + if (k && s.baseURL.indexOf("://") == -1 && s.baseURL.indexOf("/") !== 0) { + s.baseURL = k + s.baseURL + } + return s.baseURL + } + return null + } + f = q.getElementsByTagName("script"); + for (m = 0; m < f.length; m++) { + if (h(f[m])) { + return + } + } + l = q.getElementsByTagName("head")[0]; + if (l) { + f = l.getElementsByTagName("script"); + for (m = 0; m < f.length; m++) { + if (h(f[m])) { + return + } + } + } + return + }, + is: function(g, f) { + if (!f) { + return g !== e + } + if (f == "array" && (g.hasOwnProperty && g instanceof Array)) { + return true + } + return typeof(g) == f + }, + makeMap: function(f, j, h) { + var g; + f = f || []; + j = j || ","; + if (typeof(f) == "string") { + f = f.split(j) + } + h = h || {}; + g = f.length; + while (g--) { + h[f[g]] = {} + } + return h + }, + each: function(i, f, h) { + var j, g; + if (!i) { + return 0 + } + h = h || i; + if (i.length !== e) { + for (j = 0, g = i.length; j < g; j++) { + if (f.call(h, i[j], j, i) === false) { + return 0 + } + } + } else { + for (j in i) { + if (i.hasOwnProperty(j)) { + if (f.call(h, i[j], j, i) === false) { + return 0 + } + } + } + } + return 1 + }, + map: function(g, h) { + var i = []; + b.each(g, function(f) { + i.push(h(f)) + }); + return i + }, + grep: function(g, h) { + var i = []; + b.each(g, function(f) { + if (!h || h(f)) { + i.push(f) + } + }); + return i + }, + inArray: function(g, h) { + var j, f; + if (g) { + for (j = 0, f = g.length; j < f; j++) { + if (g[j] === h) { + return j + } + } + } + return -1 + }, + extend: function(k, j) { + var h, g, f = arguments; + for (h = 1, g = f.length; h < g; h++) { + j = f[h]; + b.each(j, function(i, l) { + if (i !== e) { + k[l] = i + } + }) + } + return k + }, + trim: function(f) { + return (f ? "" + f : "").replace(a, "") + }, + create: function(o, f, j) { + var n = this, + g, i, k, l, h, m = 0; + o = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(o); + k = o[3].match(/(^|\.)(\w+)$/i)[2]; + i = n.createNS(o[3].replace(/\.\w+$/, ""), j); + if (i[k]) { + return + } + if (o[2] == "static") { + i[k] = f; + if (this.onCreate) { + this.onCreate(o[2], o[3], i[k]) + } + return + } + if (!f[k]) { + f[k] = function() {}; + m = 1 + } + i[k] = f[k]; + n.extend(i[k].prototype, f); + if (o[5]) { + g = n.resolve(o[5]).prototype; + l = o[5].match(/\.(\w+)$/i)[1]; + h = i[k]; + if (m) { + i[k] = function() { + return g[l].apply(this, arguments) + } + } else { + i[k] = function() { + this.parent = g[l]; + return h.apply(this, arguments) + } + } + i[k].prototype[k] = i[k]; + n.each(g, function(p, q) { + i[k].prototype[q] = g[q] + }); + n.each(f, function(p, q) { + if (g[q]) { + i[k].prototype[q] = function() { + this.parent = g[q]; + return p.apply(this, arguments) + } + } else { + if (q != k) { + i[k].prototype[q] = p + } + } + }) + } + n.each(f["static"], function(p, q) { + i[k][q] = p + }); + if (this.onCreate) { + this.onCreate(o[2], o[3], i[k].prototype) + } + }, + walk: function(i, h, j, g) { + g = g || this; + if (i) { + if (j) { + i = i[j] + } + b.each(i, function(k, f) { + if (h.call(g, k, f, j) === false) { + return false + } + b.walk(k, h, j, g) + }) + } + }, + createNS: function(j, h) { + var g, f; + h = h || d; + j = j.split("."); + for (g = 0; g < j.length; g++) { + f = j[g]; + if (!h[f]) { + h[f] = {} + } + h = h[f] + } + return h + }, + resolve: function(j, h) { + var g, f; + h = h || d; + j = j.split("."); + for (g = 0, f = j.length; g < f; g++) { + h = h[j[g]]; + if (!h) { + break + } + } + return h + }, + addUnload: function(j, i) { + var h = this; + j = { + func: j, + scope: i || this + }; + if (!h.unloads) { + function g() { + var f = h.unloads, + l, m; + if (f) { + for (m in f) { + l = f[m]; + if (l && l.func) { + l.func.call(l.scope, 1) + } + } + if (d.detachEvent) { + d.detachEvent("onbeforeunload", k); + d.detachEvent("onunload", g) + } else { + if (d.removeEventListener) { + d.removeEventListener("unload", g, false) + } + } + h.unloads = l = f = w = g = 0; + if (d.CollectGarbage) { + CollectGarbage() + } + } + } + function k() { + var l = document; + if (l.readyState == "interactive") { + function f() { + l.detachEvent("onstop", f); + if (g) { + g() + } + l = 0 + } + if (l) { + l.attachEvent("onstop", f) + } + d.setTimeout(function() { + if (l) { + l.detachEvent("onstop", f) + } + }, 0) + } + } + if (d.attachEvent) { + d.attachEvent("onunload", g); + d.attachEvent("onbeforeunload", k) + } else { + if (d.addEventListener) { + d.addEventListener("unload", g, false) + } + } + h.unloads = [j] + } else { + h.unloads.push(j) + } + return j + }, + removeUnload: function(i) { + var g = this.unloads, + h = null; + b.each(g, function(j, f) { + if (j && j.func == i) { + g.splice(f, 1); + h = i; + return false + } + }); + return h + }, + explode: function(f, g) { + return f ? b.map(f.split(g || ","), b.trim) : f + }, + _addVer: function(g) { + var f; + if (!this.query) { + return g + } + f = (g.indexOf("?") == -1 ? "?" : "&") + this.query; + if (g.indexOf("#") == -1) { + return g + f + } + return g.replace("#", f + "#") + }, + _replace: function(h, f, g) { + if (c) { + return g.replace(h, function() { + var l = f, + j = arguments, + k; + for (k = 0; k < j.length - 2; k++) { + if (j[k] === e) { + l = l.replace(new RegExp("\\$" + k, "g"), "") + } else { + l = l.replace(new RegExp("\\$" + k, "g"), j[k]) + } + } + return l + }) + } + return g.replace(h, f) + } + }; + b._init(); + d.tinymce = d.tinyMCE = b +})(window); +tinymce.create("tinymce.util.Dispatcher", { + scope: null, + listeners: null, + Dispatcher: function(a) { + this.scope = a || this; + this.listeners = [] + }, + add: function(a, b) { + this.listeners.push({ + cb: a, + scope: b || this.scope + }); + return a + }, + addToTop: function(a, b) { + this.listeners.unshift({ + cb: a, + scope: b || this.scope + }); + return a + }, + remove: function(a) { + var b = this.listeners, + c = null; + tinymce.each(b, function(e, d) { + if (a == e.cb) { + c = a; + b.splice(d, 1); + return false + } + }); + return c + }, + dispatch: function() { + var f, d = arguments, + e, b = this.listeners, + g; + for (e = 0; e < b.length; e++) { + g = b[e]; + f = g.cb.apply(g.scope, d); + if (f === false) { + break + } + } + return f + } +}); +(function() { + var a = tinymce.each; + tinymce.create("tinymce.util.URI", { + URI: function(e, g) { + var f = this, + h, d, c; + e = tinymce.trim(e); + g = f.settings = g || {}; + if (/^(mailto|tel|news|javascript|about|data):/i.test(e) || /^\s*#/.test(e)) { + f.source = e; + return + } + if (e.indexOf("/") === 0 && e.indexOf("//") !== 0) { + e = (g.base_uri ? g.base_uri.protocol || "http" : "http") + "://mce_host" + e + } + if (!/^\w*:?\/\//.test(e)) { + e = (g.base_uri.protocol || "http") + "://mce_host" + f.toAbsPath(g.base_uri.path, e) + } + e = e.replace(/@@/g, "(mce_at)"); + e = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e); + a(["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"], function(b, j) { + var k = e[j]; + if (k) { + k = k.replace(/\(mce_at\)/g, "@@") + } + f[b] = k + }); + if (c = g.base_uri) { + if (!f.protocol) { + f.protocol = c.protocol + } + if (!f.userInfo) { + f.userInfo = c.userInfo + } + if (!f.port && f.host == "mce_host") { + f.port = c.port + } + if (!f.host || f.host == "mce_host") { + f.host = c.host + } + f.source = "" + } + }, + setPath: function(c) { + var b = this; + c = /^(.*?)\/?(\w+)?$/.exec(c); + b.path = c[0]; + b.directory = c[1]; + b.file = c[2]; + b.source = ""; + b.getURI() + }, + toRelative: function(b) { + var c = this, + d; + if (b === "./") { + return b + } + b = new tinymce.util.URI(b, { + base_uri: c + }); + if ((b.host != "mce_host" && c.host != b.host && b.host) || c.port != b.port || c.protocol != b.protocol) { + return b.getURI() + } + d = c.toRelPath(c.path, b.path); + if (b.query) { + d += "?" + b.query + } + if (b.anchor) { + d += "#" + b.anchor + } + return d + }, + toAbsolute: function(b, c) { + var b = new tinymce.util.URI(b, { + base_uri: this + }); + return b.getURI(this.host == b.host && this.protocol == b.protocol ? c : 0) + }, + toRelPath: function(g, h) { + var c, f = 0, + d = "", + e, b; + g = g.substring(0, g.lastIndexOf("/")); + g = g.split("/"); + c = h.split("/"); + if (g.length >= c.length) { + for (e = 0, b = g.length; e < b; e++) { + if (e >= c.length || g[e] != c[e]) { + f = e + 1; + break + } + } + } + if (g.length < c.length) { + for (e = 0, b = c.length; e < b; e++) { + if (e >= g.length || g[e] != c[e]) { + f = e + 1; + break + } + } + } + if (f == 1) { + return h + } + for (e = 0, b = g.length - (f - 1); e < b; e++) { + d += "../" + } + for (e = f - 1, b = c.length; e < b; e++) { + if (e != f - 1) { + d += "/" + c[e] + } else { + d += c[e] + } + } + return d + }, + toAbsPath: function(e, f) { + var c, b = 0, + h = [], + d, g; + d = /\/$/.test(f) ? "/" : ""; + e = e.split("/"); + f = f.split("/"); + a(e, function(i) { + if (i) { + h.push(i) + } + }); + e = h; + for (c = f.length - 1, h = []; c >= 0; c--) { + if (f[c].length == 0 || f[c] == ".") { + continue + } + if (f[c] == "..") { + b++; + continue + } + if (b > 0) { + b--; + continue + } + h.push(f[c]) + } + c = e.length - b; + if (c <= 0) { + g = h.reverse().join("/") + } else { + g = e.slice(0, c).join("/") + "/" + h.reverse().join("/") + } + if (g.indexOf("/") !== 0) { + g = "/" + g + } + if (d && g.lastIndexOf("/") !== g.length - 1) { + g += d + } + return g + }, + getURI: function(d) { + var c, b = this; + if (!b.source || d) { + c = ""; + if (!d) { + if (b.protocol) { + c += b.protocol + "://" + } + if (b.userInfo) { + c += b.userInfo + "@" + } + if (b.host) { + c += b.host + } + if (b.port) { + c += ":" + b.port + } + } + if (b.path) { + c += b.path + } + if (b.query) { + c += "?" + b.query + } + if (b.anchor) { + c += "#" + b.anchor + } + b.source = c + } + return b.source + } + }) +})(); +(function() { + var a = tinymce.each; + tinymce.create("static tinymce.util.Cookie", { + getHash: function(d) { + var b = this.get(d), + c; + if (b) { + a(b.split("&"), function(e) { + e = e.split("="); + c = c || {}; + c[unescape(e[0])] = unescape(e[1]) + }) + } + return c + }, + setHash: function(j, b, g, f, i, c) { + var h = ""; + a(b, function(e, d) { + h += (!h ? "" : "&") + escape(d) + "=" + escape(e) + }); + this.set(j, h, g, f, i, c) + }, + get: function(i) { + var h = document.cookie, + g, f = i + "=", + d; + if (!h) { + return + } + d = h.indexOf("; " + f); + if (d == -1) { + d = h.indexOf(f); + if (d != 0) { + return null + } + } else { + d += 2 + } + g = h.indexOf(";", d); + if (g == -1) { + g = h.length + } + return unescape(h.substring(d + f.length, g)) + }, + set: function(i, b, g, f, h, c) { + document.cookie = i + "=" + escape(b) + ((g) ? "; expires=" + g.toGMTString() : "") + ((f) ? "; path=" + escape(f) : "") + ((h) ? "; domain=" + h : "") + ((c) ? "; secure" : "") + }, + remove: function(e, b) { + var c = new Date(); + c.setTime(c.getTime() - 1000); + this.set(e, "", c, b, c) + } + }) +})(); +(function() { + function serialize(o, quote) { + var i, v, t; + quote = quote || '"'; + if (o == null) { + return "null" + } + t = typeof o; + if (t == "string") { + v = "\bb\tt\nn\ff\rr\"\"''\\\\"; + return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) { + if (quote === '"' && a === "'") { + return a + } + i = v.indexOf(b); + if (i + 1) { + return "\\" + v.charAt(i + 1) + } + a = b.charCodeAt().toString(16); + return "\\u" + "0000".substring(a.length) + a + }) + quote + } + if (t == "object") { + if (o.hasOwnProperty && o instanceof Array) { + for (i = 0, v = "["; i < o.length; i++) { + v += (i > 0 ? "," : "") + serialize(o[i], quote) + } + return v + "]" + } + v = "{"; + for (i in o) { + v += typeof o[i] != "function" ? (v.length > 1 ? "," + quote : quote) + i + quote + ":" + serialize(o[i], quote) : "" + } + return v + "}" + } + return "" + o + } + tinymce.util.JSON = { + serialize: serialize, + parse: function(s) { + try { + return eval("(" + s + ")") + } catch (ex) {} + } + } +})(); +tinymce.create("static tinymce.util.XHR", { + send: function(g) { + var a, e, b = window, + h = 0; + g.scope = g.scope || this; + g.success_scope = g.success_scope || g.scope; + g.error_scope = g.error_scope || g.scope; + g.async = g.async === false ? false : true; + g.data = g.data || ""; + + function d(i) { + a = 0; + try { + a = new ActiveXObject(i) + } catch (c) {} + return a + } + a = b.XMLHttpRequest ? new XMLHttpRequest() : d("Microsoft.XMLHTTP") || d("Msxml2.XMLHTTP"); + if (a) { + if (a.overrideMimeType) { + a.overrideMimeType(g.content_type) + } + a.open(g.type || (g.data ? "POST" : "GET"), g.url, g.async); + if (g.content_type) { + a.setRequestHeader("Content-Type", g.content_type) + } + a.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + a.send(g.data); + + function f() { + if (!g.async || a.readyState == 4 || h++ > 10000) { + if (g.success && h < 10000 && a.status == 200) { + g.success.call(g.success_scope, "" + a.responseText, a, g) + } else { + if (g.error) { + g.error.call(g.error_scope, h > 10000 ? "TIMED_OUT" : "GENERAL", a, g) + } + } + a = null + } else { + b.setTimeout(f, 10) + } + } + if (!g.async) { + return f() + } + e = b.setTimeout(f, 10) + } + } +}); +(function() { + var c = tinymce.extend, + b = tinymce.util.JSON, + a = tinymce.util.XHR; + tinymce.create("tinymce.util.JSONRequest", { + JSONRequest: function(d) { + this.settings = c({}, d); + this.count = 0 + }, + send: function(f) { + var e = f.error, + d = f.success; + f = c(this.settings, f); + f.success = function(h, g) { + h = b.parse(h); + if (typeof(h) == "undefined") { + h = { + error: "JSON Parse error." + } + } + if (h.error) { + e.call(f.error_scope || f.scope, h.error, g) + } else { + d.call(f.success_scope || f.scope, h.result) + } + }; + f.error = function(h, g) { + if (e) { + e.call(f.error_scope || f.scope, h, g) + } + }; + f.data = b.serialize({ + id: f.id || "c" + (this.count++), + method: f.method, + params: f.params + }); + f.content_type = "application/json"; + a.send(f) + }, + "static": { + sendRPC: function(d) { + return new tinymce.util.JSONRequest().send(d) + } + } + }) +}()); +(function(j) { + var a, g, d, k = /[&\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + b = /[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + f = /[<>&\"\']/g, + c = /&(#)?([\w]+);/g, + i = { + 128: "\u20AC", + 130: "\u201A", + 131: "\u0192", + 132: "\u201E", + 133: "\u2026", + 134: "\u2020", + 135: "\u2021", + 136: "\u02C6", + 137: "\u2030", + 138: "\u0160", + 139: "\u2039", + 140: "\u0152", + 142: "\u017D", + 145: "\u2018", + 146: "\u2019", + 147: "\u201C", + 148: "\u201D", + 149: "\u2022", + 150: "\u2013", + 151: "\u2014", + 152: "\u02DC", + 153: "\u2122", + 154: "\u0161", + 155: "\u203A", + 156: "\u0153", + 158: "\u017E", + 159: "\u0178" + }; + g = { + '"': "&quot;", + "'": "&#39;", + "<": "&lt;", + ">": "&gt;", + "&": "&amp;" + }; + d = { + "&lt;": "<", + "&gt;": ">", + "&amp;": "&", + "&quot;": '"', + "&apos;": "'" + }; + + function h(l) { + var m; + m = document.createElement("div"); + m.innerHTML = l; + return m.textContent || m.innerText || l + } + function e(m, p) { + var n, o, l, q = {}; + if (m) { + m = m.split(","); + p = p || 10; + for (n = 0; n < m.length; n += 2) { + o = String.fromCharCode(parseInt(m[n], p)); + if (!g[o]) { + l = "&" + m[n + 1] + ";"; + q[o] = l; + q[l] = o + } + } + return q + } + } + a = e("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro", 32); + j.html = j.html || {}; + j.html.Entities = { + encodeRaw: function(m, l) { + return m.replace(l ? k : b, function(n) { + return g[n] || n + }) + }, + encodeAllRaw: function(l) { + return ("" + l).replace(f, function(m) { + return g[m] || m + }) + }, + encodeNumeric: function(m, l) { + return m.replace(l ? k : b, function(n) { + if (n.length > 1) { + return "&#" + (((n.charCodeAt(0) - 55296) * 1024) + (n.charCodeAt(1) - 56320) + 65536) + ";" + } + return g[n] || "&#" + n.charCodeAt(0) + ";" + }) + }, + encodeNamed: function(n, l, m) { + m = m || a; + return n.replace(l ? k : b, function(o) { + return g[o] || m[o] || o + }) + }, + getEncodeFunc: function(l, o) { + var p = j.html.Entities; + o = e(o) || a; + + function m(r, q) { + return r.replace(q ? k : b, function(s) { + return g[s] || o[s] || "&#" + s.charCodeAt(0) + ";" || s + }) + } + function n(r, q) { + return p.encodeNamed(r, q, o) + } + l = j.makeMap(l.replace(/\+/g, ",")); + if (l.named && l.numeric) { + return m + } + if (l.named) { + if (o) { + return n + } + return p.encodeNamed + } + if (l.numeric) { + return p.encodeNumeric + } + return p.encodeRaw + }, + decode: function(l) { + return l.replace(c, function(n, m, o) { + if (m) { + o = parseInt(o); + if (o > 65535) { + o -= 65536; + return String.fromCharCode(55296 + (o >> 10), 56320 + (o & 1023)) + } else { + return i[o] || String.fromCharCode(o) + } + } + return d[n] || a[n] || h(n) + }) + } + } +})(tinymce); +tinymce.html.Styles = function(d, f) { + var k = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi, + h = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi, + b = /\s*([^:]+):\s*([^;]+);?/g, + l = /\s+$/, + m = /rgb/, + e, g, a = {}, + j; + d = d || {}; + j = "\\\" \\' \\; \\: ; : _".split(" "); + for (g = 0; g < j.length; g++) { + a[j[g]] = "_" + g; + a["_" + g] = j[g] + } + function c(n, q, p, i) { + function o(r) { + r = parseInt(r).toString(16); + return r.length > 1 ? r : "0" + r + } + return "#" + o(q) + o(p) + o(i) + } + return { + toHex: function(i) { + return i.replace(k, c) + }, + parse: function(r) { + var y = {}, + p, n, v, q, u = d.url_converter, + x = d.url_converter_scope || this; + + function o(C, F) { + var E, B, A, D; + E = y[C + "-top" + F]; + if (!E) { + return + } + B = y[C + "-right" + F]; + if (E != B) { + return + } + A = y[C + "-bottom" + F]; + if (B != A) { + return + } + D = y[C + "-left" + F]; + if (A != D) { + return + } + y[C + F] = D; + delete y[C + "-top" + F]; + delete y[C + "-right" + F]; + delete y[C + "-bottom" + F]; + delete y[C + "-left" + F] + } + function t(B) { + var C = y[B], + A; + if (!C || C.indexOf(" ") < 0) { + return + } + C = C.split(" "); + A = C.length; + while (A--) { + if (C[A] !== C[0]) { + return false + } + } + y[B] = C[0]; + return true + } + function z(C, B, A, D) { + if (!t(B)) { + return + } + if (!t(A)) { + return + } + if (!t(D)) { + return + } + y[C] = y[B] + " " + y[A] + " " + y[D]; + delete y[B]; + delete y[A]; + delete y[D] + } + function s(A) { + q = true; + return a[A] + } + function i(B, A) { + if (q) { + B = B.replace(/_[0-9]/g, function(C) { + return a[C] + }) + } + if (!A) { + B = B.replace(/\\([\'\";:])/g, "$1") + } + return B + } + if (r) { + r = r.replace(/\\[\"\';:_]/g, s).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(A) { + return A.replace(/[;:]/g, s) + }); + while (p = b.exec(r)) { + n = p[1].replace(l, "").toLowerCase(); + v = p[2].replace(l, ""); + if (n && v.length > 0) { + if (n === "font-weight" && v === "700") { + v = "bold" + } else { + if (n === "color" || n === "background-color") { + v = v.toLowerCase() + } + } + v = v.replace(k, c); + v = v.replace(h, function(B, A, E, D, F, C) { + F = F || C; + if (F) { + F = i(F); + return "'" + F.replace(/\'/g, "\\'") + "'" + } + A = i(A || E || D); + if (u) { + A = u.call(x, A, "style") + } + return "url('" + A.replace(/\'/g, "\\'") + "')" + }); + y[n] = q ? i(v, true) : v + } + b.lastIndex = p.index + p[0].length + } + o("border", ""); + o("border", "-width"); + o("border", "-color"); + o("border", "-style"); + o("padding", ""); + o("margin", ""); + z("border", "border-width", "border-style", "border-color"); + if (y.border === "medium none") { + delete y.border + } + } + return y + }, + serialize: function(p, r) { + var o = "", + n, q; + + function i(t) { + var x, u, s, t, v; + x = f.styles[t]; + if (x) { + for (u = 0, s = x.length; u < s; u++) { + t = x[u]; + v = p[t]; + if (v !== e) { + o += (o.length > 0 ? " " : "") + t + ": " + v + ";" + } + } + } + } + if (r && f && f.styles) { + i("*"); + i(n) + } else { + for (n in p) { + q = p[n]; + if (q !== e) { + o += (o.length > 0 ? " " : "") + n + ": " + q + ";" + } + } + } + return o + } + } +}; +(function(l) { + var g = {}, + i, k, f, d, b, e, c = l.makeMap, + j = l.each; + + function h(n, m) { + return n.split(m || ",") + } + function a(q, p) { + var n, o = {}; + + function m(r) { + return r.replace(/[A-Z]+/g, function(s) { + return m(q[s]) + }) + } + for (n in q) { + if (q.hasOwnProperty(n)) { + q[n] = m(q[n]) + } + } + m(p).replace(/#/g, "#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g, function(u, s, r, t) { + r = h(r, "|"); + o[s] = { + attributes: c(r), + attributesOrder: r, + children: c(t, "|", { + "#comment": {} + }) + } + }); + return o + } + k = "h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,noscript,menu,isindex,samp,header,footer,article,section,hgroup"; + k = c(k, ",", c(k.toUpperCase())); + g = a({ + Z: "H|K|N|O|P", + Y: "X|form|R|Q", + ZG: "E|span|width|align|char|charoff|valign", + X: "p|T|div|U|W|isindex|fieldset|table", + ZF: "E|align|char|charoff|valign", + W: "pre|hr|blockquote|address|center|noframes", + ZE: "abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height", + ZD: "[E][S]", + U: "ul|ol|dl|menu|dir", + ZC: "p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q", + T: "h1|h2|h3|h4|h5|h6", + ZB: "X|S|Q", + S: "R|P", + ZA: "a|G|J|M|O|P", + R: "a|H|K|N|O", + Q: "noscript|P", + P: "ins|del|script", + O: "input|select|textarea|label|button", + N: "M|L", + M: "em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym", + L: "sub|sup", + K: "J|I", + J: "tt|i|b|u|s|strike", + I: "big|small|font|basefont", + H: "G|F", + G: "br|span|bdo", + F: "object|applet|img|map|iframe", + E: "A|B|C", + D: "accesskey|tabindex|onfocus|onblur", + C: "onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup", + B: "lang|xml:lang|dir", + A: "id|class|style|title" + }, "script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]"); + i = c("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,preload,autoplay,loop,controls"); + f = c("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source"); + d = l.extend(c("td,th,iframe,video,object"), f); + b = c("pre,script,style"); + e = c("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); + l.html.Schema = function(p) { + var x = this, + m = {}, + n = {}, + u = [], + o; + p = p || {}; + if (p.verify_html === false) { + p.valid_elements = "*[*]" + } + if (p.valid_styles) { + o = {}; + j(p.valid_styles, function(z, y) { + o[y] = l.explode(z) + }) + } + function v(y) { + return new RegExp("^" + y.replace(/([?+*])/g, ".$1") + "$") + } + function r(F) { + var E, A, T, P, U, z, C, O, R, K, S, W, I, D, Q, y, M, B, V, X, J, N, H = /^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/, + L = /^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/, + G = /[*?+]/; + if (F) { + F = h(F); + if (m["@"]) { + M = m["@"].attributes; + B = m["@"].attributesOrder + } + for (E = 0, A = F.length; E < A; E++) { + z = H.exec(F[E]); + if (z) { + Q = z[1]; + K = z[2]; + y = z[3]; + R = z[4]; + I = {}; + D = []; + C = { + attributes: I, + attributesOrder: D + }; + if (Q === "#") { + C.paddEmpty = true + } + if (Q === "-") { + C.removeEmpty = true + } + if (M) { + for (X in M) { + I[X] = M[X] + } + D.push.apply(D, B) + } + if (R) { + R = h(R, "|"); + for (T = 0, P = R.length; T < P; T++) { + z = L.exec(R[T]); + if (z) { + O = {}; + W = z[1]; + S = z[2].replace(/::/g, ":"); + Q = z[3]; + N = z[4]; + if (W === "!") { + C.attributesRequired = C.attributesRequired || []; + C.attributesRequired.push(S); + O.required = true + } + if (W === "-") { + delete I[S]; + D.splice(l.inArray(D, S), 1); + continue + } + if (Q) { + if (Q === "=") { + C.attributesDefault = C.attributesDefault || []; + C.attributesDefault.push({ + name: S, + value: N + }); + O.defaultValue = N + } + if (Q === ":") { + C.attributesForced = C.attributesForced || []; + C.attributesForced.push({ + name: S, + value: N + }); + O.forcedValue = N + } + if (Q === "<") { + O.validValues = c(N, "?") + } + } + if (G.test(S)) { + C.attributePatterns = C.attributePatterns || []; + O.pattern = v(S); + C.attributePatterns.push(O) + } else { + if (!I[S]) { + D.push(S) + } + I[S] = O + } + } + } + } + if (!M && K == "@") { + M = I; + B = D + } + if (y) { + C.outputName = K; + m[y] = C + } + if (G.test(K)) { + C.pattern = v(K); + u.push(C) + } else { + m[K] = C + } + } + } + } + } + function t(y) { + m = {}; + u = []; + r(y); + j(g, function(A, z) { + n[z] = A.children + }) + } + function q(z) { + var y = /^(~)?(.+)$/; + if (z) { + j(h(z), function(C) { + var B = y.exec(C), + D = B[1] === "~" ? "span" : "div", + A = B[2]; + n[A] = n[D]; + j(n, function(E, F) { + if (E[D]) { + E[A] = E[D] + } + }) + }) + } + } + function s(z) { + var y = /^([+\-]?)(\w+)\[([^\]]+)\]$/; + if (z) { + j(h(z), function(D) { + var C = y.exec(D), + A, B; + if (C) { + B = C[1]; + if (B) { + A = n[C[2]] + } else { + A = n[C[2]] = { + "#comment": {} + } + } + A = n[C[2]]; + j(h(C[3], "|"), function(E) { + if (B === "-") { + delete A[E] + } else { + A[E] = {} + } + }) + } + }) + } + } + if (!p.valid_elements) { + j(g, function(z, y) { + m[y] = { + attributes: z.attributes, + attributesOrder: z.attributesOrder + }; + n[y] = z.children + }); + j(h("strong/b,em/i"), function(y) { + y = h(y, "/"); + m[y[1]].outputName = y[0] + }); + m.img.attributesDefault = [{ + name: "alt", + value: "" + }]; + j(h("ol,ul,li,sub,sup,blockquote,tr,div,span,font,a,table,tbody"), function(y) { + m[y].removeEmpty = true + }); + j(h("p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption"), function(y) { + m[y].paddEmpty = true + }) + } else { + t(p.valid_elements) + } + q(p.custom_elements); + s(p.valid_children); + r(p.extended_valid_elements); + s("+ol[ul|ol],+ul[ul|ol]"); + if (p.invalid_elements) { + l.each(l.explode(p.invalid_elements), function(y) { + if (m[y]) { + delete m[y] + } + }) + } + x.children = n; + x.styles = o; + x.getBoolAttrs = function() { + return i + }; + x.getBlockElements = function() { + return k + }; + x.getShortEndedElements = function() { + return f + }; + x.getSelfClosingElements = function() { + return e + }; + x.getNonEmptyElements = function() { + return d + }; + x.getWhiteSpaceElements = function() { + return b + }; + x.isValidChild = function(y, A) { + var z = n[y]; + return !!(z && z[A]) + }; + x.getElementRule = function(y) { + var A = m[y], + z; + if (A) { + return A + } + z = u.length; + while (z--) { + A = u[z]; + if (A.pattern.test(y)) { + return A + } + } + }; + x.addValidElements = r; + x.setValidElements = t; + x.addCustomElements = q; + x.addValidChildren = s + }; + l.html.Schema.boolAttrMap = i; + l.html.Schema.blockElementsMap = k +})(tinymce); +(function(a) { + a.html.SaxParser = function(c, e) { + var b = this, + d = function() {}; + c = c || {}; + b.schema = e = e || new a.html.Schema(); + if (c.fix_self_closing !== false) { + c.fix_self_closing = true + } + a.each("comment cdata text start end pi doctype".split(" "), function(f) { + if (f) { + b[f] = c[f] || d + } + }); + b.parse = function(q) { + var A = this, + f, m = 0, + G, j, l = [], + B, K, t, N, F, k, p, x, I, r, E, o, J, n, H, M, L, z, D, h, g, u, s = 0, + v = a.html.Entities.decode, + y; + + function C(O) { + var Q, P; + Q = l.length; + while (Q--) { + if (l[Q].name === O) { + break + } + } + if (Q >= 0) { + for (P = l.length - 1; P >= Q; P--) { + O = l[P]; + if (O.valid) { + A.end(O.name) + } + } + l.length = Q + } + } + D = new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([^\\s\\/<>]+)\\s*((?:[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*)>))", "g"); + h = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g; + g = { + script: /<\/script[^>]*>/gi, + style: /<\/style[^>]*>/gi, + noscript: /<\/noscript[^>]*>/gi + }; + F = e.getShortEndedElements(); + z = e.getSelfClosingElements(); + k = e.getBoolAttrs(); + x = c.validate; + y = c.fix_self_closing; + while (f = D.exec(q)) { + if (m < f.index) { + A.text(v(q.substr(m, f.index - m))) + } + if (G = f[6]) { + C(G.toLowerCase()) + } else { + if (G = f[7]) { + G = G.toLowerCase(); + p = G in F; + if (y && z[G] && l.length > 0 && l[l.length - 1].name === G) { + C(G) + } + if (!x || (I = e.getElementRule(G))) { + r = true; + if (x) { + J = I.attributes; + n = I.attributePatterns + } + if (o = f[8]) { + B = []; + B.map = {}; + o.replace(h, function(P, O, T, S, R) { + var U, Q; + O = O.toLowerCase(); + T = O in k ? O : v(T || S || R || ""); + if (x && O.indexOf("data-") !== 0) { + U = J[O]; + if (!U && n) { + Q = n.length; + while (Q--) { + U = n[Q]; + if (U.pattern.test(O)) { + break + } + } + if (Q === -1) { + U = null + } + } + if (!U) { + return + } + if (U.validValues && !(T in U.validValues)) { + return + } + } + B.map[O] = T; + B.push({ + name: O, + value: T + }) + }) + } else { + B = []; + B.map = {} + } + if (x) { + H = I.attributesRequired; + M = I.attributesDefault; + L = I.attributesForced; + if (L) { + K = L.length; + while (K--) { + E = L[K]; + N = E.name; + u = E.value; + if (u === "{$uid}") { + u = "mce_" + s++ + } + B.map[N] = u; + B.push({ + name: N, + value: u + }) + } + } + if (M) { + K = M.length; + while (K--) { + E = M[K]; + N = E.name; + if (!(N in B.map)) { + u = E.value; + if (u === "{$uid}") { + u = "mce_" + s++ + } + B.map[N] = u; + B.push({ + name: N, + value: u + }) + } + } + } + if (H) { + K = H.length; + while (K--) { + if (H[K] in B.map) { + break + } + } + if (K === -1) { + r = false + } + } + if (B.map["data-mce-bogus"]) { + r = false + } + } + if (r) { + A.start(G, B, p) + } + } else { + r = false + } + if (j = g[G]) { + j.lastIndex = m = f.index + f[0].length; + if (f = j.exec(q)) { + if (r) { + t = q.substr(m, f.index - m) + } + m = f.index + f[0].length + } else { + t = q.substr(m); + m = q.length + } + if (r && t.length > 0) { + A.text(t, true) + } + if (r) { + A.end(G) + } + D.lastIndex = m; + continue + } + if (!p) { + if (!o || o.indexOf("/") != o.length - 1) { + l.push({ + name: G, + valid: r + }) + } else { + if (r) { + A.end(G) + } + } + } + } else { + if (G = f[1]) { + A.comment(G) + } else { + if (G = f[2]) { + A.cdata(G) + } else { + if (G = f[3]) { + A.doctype(G) + } else { + if (G = f[4]) { + A.pi(G, f[5]) + } + } + } + } + } + } + m = f.index + f[0].length + } + if (m < q.length) { + A.text(v(q.substr(m))) + } + for (K = l.length - 1; K >= 0; K--) { + G = l[K]; + if (G.valid) { + A.end(G.name) + } + } + } + } +})(tinymce); +(function(d) { + var c = /^[ \t\r\n]*$/, + e = { + "#text": 3, + "#comment": 8, + "#cdata": 4, + "#pi": 7, + "#doctype": 10, + "#document-fragment": 11 + }; + + function a(k, l, j) { + var i, h, f = j ? "lastChild" : "firstChild", + g = j ? "prev" : "next"; + if (k[f]) { + return k[f] + } + if (k !== l) { + i = k[g]; + if (i) { + return i + } + for (h = k.parent; h && h !== l; h = h.parent) { + i = h[g]; + if (i) { + return i + } + } + } + } + function b(f, g) { + this.name = f; + this.type = g; + if (g === 1) { + this.attributes = []; + this.attributes.map = {} + } + } + d.extend(b.prototype, { + replace: function(g) { + var f = this; + if (g.parent) { + g.remove() + } + f.insert(g, f); + f.remove(); + return f + }, + attr: function(h, l) { + var f = this, + g, j, k; + if (typeof h !== "string") { + for (j in h) { + f.attr(j, h[j]) + } + return f + } + if (g = f.attributes) { + if (l !== k) { + if (l === null) { + if (h in g.map) { + delete g.map[h]; + j = g.length; + while (j--) { + if (g[j].name === h) { + g = g.splice(j, 1); + return f + } + } + } + return f + } + if (h in g.map) { + j = g.length; + while (j--) { + if (g[j].name === h) { + g[j].value = l; + break + } + } + } else { + g.push({ + name: h, + value: l + }) + } + g.map[h] = l; + return f + } else { + return g.map[h] + } + } + }, + clone: function() { + var g = this, + n = new b(g.name, g.type), + h, f, m, j, k; + if (m = g.attributes) { + k = []; + k.map = {}; + for (h = 0, f = m.length; h < f; h++) { + j = m[h]; + if (j.name !== "id") { + k[k.length] = { + name: j.name, + value: j.value + }; + k.map[j.name] = j.value + } + } + n.attributes = k + } + n.value = g.value; + n.shortEnded = g.shortEnded; + return n + }, + wrap: function(g) { + var f = this; + f.parent.insert(g, f); + g.append(f); + return f + }, + unwrap: function() { + var f = this, + h, g; + for (h = f.firstChild; h;) { + g = h.next; + f.insert(h, f, true); + h = g + } + f.remove() + }, + remove: function() { + var f = this, + h = f.parent, + g = f.next, + i = f.prev; + if (h) { + if (h.firstChild === f) { + h.firstChild = g; + if (g) { + g.prev = null + } + } else { + i.next = g + } + if (h.lastChild === f) { + h.lastChild = i; + if (i) { + i.next = null + } + } else { + g.prev = i + } + f.parent = f.next = f.prev = null + } + return f + }, + append: function(h) { + var f = this, + g; + if (h.parent) { + h.remove() + } + g = f.lastChild; + if (g) { + g.next = h; + h.prev = g; + f.lastChild = h + } else { + f.lastChild = f.firstChild = h + } + h.parent = f; + return h + }, + insert: function(h, f, i) { + var g; + if (h.parent) { + h.remove() + } + g = f.parent || this; + if (i) { + if (f === g.firstChild) { + g.firstChild = h + } else { + f.prev.next = h + } + h.prev = f.prev; + h.next = f; + f.prev = h + } else { + if (f === g.lastChild) { + g.lastChild = h + } else { + f.next.prev = h + } + h.next = f.next; + h.prev = f; + f.next = h + } + h.parent = g; + return h + }, + getAll: function(g) { + var f = this, + h, i = []; + for (h = f.firstChild; h; h = a(h, f)) { + if (h.name === g) { + i.push(h) + } + } + return i + }, + empty: function() { + var g = this, + f, h, j; + if (g.firstChild) { + f = []; + for (j = g.firstChild; j; j = a(j, g)) { + f.push(j) + } + h = f.length; + while (h--) { + j = f[h]; + j.parent = j.firstChild = j.lastChild = j.next = j.prev = null + } + } + g.firstChild = g.lastChild = null; + return g + }, + isEmpty: function(j) { + var f = this, + h = f.firstChild, + g; + if (h) { + do { + if (h.type === 1) { + if (h.attributes.map["data-mce-bogus"]) { + continue + } + if (j[h.name]) { + return false + } + g = h.attributes.length; + while (g--) { + if (h.attributes[g].name.indexOf("data-") === 0) { + return false + } + } + } + if ((h.type === 3 && !c.test(h.value))) { + return false + } + } while (h = a(h, f)) + } + return true + } + }); + d.extend(b, { + create: function(g, f) { + var i, h; + i = new b(g, e[g] || 1); + if (f) { + for (h in f) { + i.attr(h, f[h]) + } + } + return i + } + }); + d.html.Node = b +})(tinymce); +(function(b) { + var a = b.html.Node; + b.html.DomParser = function(g, h) { + var f = this, + e = {}, + d = [], + i = {}, + c = {}; + g = g || {}; + g.root_name = g.root_name || "body"; + f.schema = h = h || new b.html.Schema(); + + function j(m) { + var o, p, x, v, z, n, q, l, t, u, k, s, y, r; + s = b.makeMap("tr,td,th,tbody,thead,tfoot,table"); + k = h.getNonEmptyElements(); + for (o = 0; o < m.length; o++) { + p = m[o]; + if (!p.parent) { + continue + } + v = [p]; + for (x = p.parent; x && !h.isValidChild(x.name, p.name) && !s[x.name]; x = x.parent) { + v.push(x) + } + if (x && v.length > 1) { + v.reverse(); + z = n = f.filterNode(v[0].clone()); + for (t = 0; t < v.length - 1; t++) { + if (h.isValidChild(n.name, v[t].name)) { + q = f.filterNode(v[t].clone()); + n.append(q) + } else { + q = n + } + for (l = v[t].firstChild; l && l != v[t + 1];) { + r = l.next; + q.append(l); + l = r + } + n = q + } + if (!z.isEmpty(k)) { + x.insert(z, v[0], true); + x.insert(p, z) + } else { + x.insert(p, v[0], true) + } + x = v[0]; + if (x.isEmpty(k) || x.firstChild === x.lastChild && x.firstChild.name === "br") { + x.empty().remove() + } + } else { + if (p.parent) { + if (p.name === "li") { + y = p.prev; + if (y && (y.name === "ul" || y.name === "ul")) { + y.append(p); + continue + } + y = p.next; + if (y && (y.name === "ul" || y.name === "ul")) { + y.insert(p, y.firstChild, true); + continue + } + p.wrap(f.filterNode(new a("ul", 1))); + continue + } + if (h.isValidChild(p.parent.name, "div") && h.isValidChild("div", p.name)) { + p.wrap(f.filterNode(new a("div", 1))) + } else { + if (p.name === "style" || p.name === "script") { + p.empty().remove() + } else { + p.unwrap() + } + } + } + } + } + } + f.filterNode = function(m) { + var l, k, n; + if (k in e) { + n = i[k]; + if (n) { + n.push(m) + } else { + i[k] = [m] + } + } + l = d.length; + while (l--) { + k = d[l].name; + if (k in m.attributes.map) { + n = c[k]; + if (n) { + n.push(m) + } else { + c[k] = [m] + } + } + } + return m + }; + f.addNodeFilter = function(k, l) { + b.each(b.explode(k), function(m) { + var n = e[m]; + if (!n) { + e[m] = n = [] + } + n.push(l) + }) + }; + f.addAttributeFilter = function(k, l) { + b.each(b.explode(k), function(m) { + var n; + for (n = 0; n < d.length; n++) { + if (d[n].name === m) { + d[n].callbacks.push(l); + return + } + } + d.push({ + name: m, + callbacks: [l] + }) + }) + }; + f.parse = function(u, m) { + var n, D, y, x, A, z, v, q, C, G, o, B, F = [], + s, k, r, p, t; + m = m || {}; + i = {}; + c = {}; + o = b.extend(b.makeMap("script,style,head,title,meta,param"), h.getBlockElements()); + t = h.getNonEmptyElements(); + p = h.children; + r = h.getWhiteSpaceElements(); + B = /^[ \t\r\n]+/; + s = /[ \t\r\n]+$/; + k = /[ \t\r\n]+/g; + + function E(l, H) { + var I = new a(l, H), + J; + if (l in e) { + J = i[l]; + if (J) { + J.push(I) + } else { + i[l] = [I] + } + } + return I + } + n = new b.html.SaxParser({ + validate: g.validate, + fix_self_closing: false, + cdata: function(l) { + y.append(E("#cdata", 4)).value = l + }, + text: function(I, l) { + var H; + if (!r[y.name]) { + I = I.replace(k, " "); + if (y.lastChild && o[y.lastChild.name]) { + I = I.replace(B, "") + } + } + if (I.length !== 0) { + H = E("#text", 3); + H.raw = !! l; + y.append(H).value = I + } + }, + comment: function(l) { + y.append(E("#comment", 8)).value = l + }, + pi: function(l, H) { + y.append(E(l, 7)).value = H + }, + doctype: function(l) { + y.append(E("#doctype", 10)).value = l + }, + start: function(l, P, I) { + var N, K, J, H, L, Q, O, M; + J = h.getElementRule(l); + if (J) { + N = E(J.outputName || l, 1); + N.attributes = P; + N.shortEnded = I; + y.append(N); + M = p[y.name]; + if (M && p[N.name] && !M[N.name]) { + F.push(N) + } + K = d.length; + while (K--) { + L = d[K].name; + if (L in P.map) { + C = c[L]; + if (C) { + C.push(N) + } else { + c[L] = [N] + } + } + } + if (o[l]) { + for (H = N.prev; H && H.type === 3;) { + Q = H.value.replace(s, ""); + if (Q.length > 0) { + H.value = Q; + H = H.prev + } else { + O = H.prev; + H.remove(); + H = O + } + } + } + if (!I) { + y = N + } + } + }, + end: function(l) { + var L, I, K, H, J; + I = h.getElementRule(l); + if (I) { + if (o[l]) { + if (!r[y.name]) { + for (L = y.firstChild; L && L.type === 3;) { + K = L.value.replace(B, ""); + if (K.length > 0) { + L.value = K; + L = L.next + } else { + H = L.next; + L.remove(); + L = H + } + } + for (L = y.lastChild; L && L.type === 3;) { + K = L.value.replace(s, ""); + if (K.length > 0) { + L.value = K; + L = L.prev + } else { + H = L.prev; + L.remove(); + L = H + } + } + } + L = y.prev; + if (L && L.type === 3) { + K = L.value.replace(B, ""); + if (K.length > 0) { + L.value = K + } else { + L.remove() + } + } + } + if (I.removeEmpty || I.paddEmpty) { + if (y.isEmpty(t)) { + if (I.paddEmpty) { + y.empty().append(new a("#text", "3")).value = "\u00a0" + } else { + if (!y.attributes.map.name) { + J = y.parent; + y.empty().remove(); + y = J; + return + } + } + } + } + y = y.parent + } + } + }, h); + D = y = new a(g.root_name, 11); + n.parse(u); + j(F); + for (G in i) { + C = e[G]; + x = i[G]; + v = x.length; + while (v--) { + if (!x[v].parent) { + x.splice(v, 1) + } + } + for (A = 0, z = C.length; A < z; A++) { + C[A](x, G, m) + } + } + for (A = 0, z = d.length; A < z; A++) { + C = d[A]; + if (C.name in c) { + x = c[C.name]; + v = x.length; + while (v--) { + if (!x[v].parent) { + x.splice(v, 1) + } + } + for (v = 0, q = C.callbacks.length; v < q; v++) { + C.callbacks[v](x, C.name, m) + } + } + } + return D + }; + if (g.remove_trailing_brs) { + f.addNodeFilter("br", function(n, m) { + var r, q = n.length, + o, u = h.getBlockElements(), + k = h.getNonEmptyElements(), + s, p, t; + for (r = 0; r < q; r++) { + o = n[r]; + s = o.parent; + if (u[o.parent.name] && o === s.lastChild) { + p = o.prev; + while (p) { + t = p.name; + if (t !== "span" || p.attr("data-mce-type") !== "bookmark") { + if (t !== "br") { + break + } + if (t === "br") { + o = null; + break + } + } + p = p.prev + } + if (o) { + o.remove(); + if (s.isEmpty(k)) { + elementRule = h.getElementRule(s.name); + if (elementRule.removeEmpty) { + s.remove() + } else { + if (elementRule.paddEmpty) { + s.empty().append(new b.html.Node("#text", 3)).value = "\u00a0" + } + } + } + } + } + } + }) + } + } +})(tinymce); +tinymce.html.Writer = function(e) { + var c = [], + a, b, d, f, g; + e = e || {}; + a = e.indent; + b = tinymce.makeMap(e.indent_before || ""); + d = tinymce.makeMap(e.indent_after || ""); + f = tinymce.html.Entities.getEncodeFunc(e.entity_encoding || "raw", e.entities); + g = e.element_format == "html"; + return { + start: function(m, k, p) { + var n, j, h, o; + if (a && b[m] && c.length > 0) { + o = c[c.length - 1]; + if (o.length > 0 && o !== "\n") { + c.push("\n") + } + } + c.push("<", m); + if (k) { + for (n = 0, j = k.length; n < j; n++) { + h = k[n]; + c.push(" ", h.name, '="', f(h.value, true), '"') + } + } + if (!p || g) { + c[c.length] = ">" + } else { + c[c.length] = " />" + } + }, + end: function(h) { + var i; + c.push("</", h, ">"); + if (a && d[h] && c.length > 0) { + i = c[c.length - 1]; + if (i.length > 0 && i !== "\n") { + c.push("\n") + } + } + }, + text: function(i, h) { + if (i.length > 0) { + c[c.length] = h ? i : f(i) + } + }, + cdata: function(h) { + c.push("<![CDATA[", h, "]]>") + }, + comment: function(h) { + c.push("<!--", h, "-->") + }, + pi: function(h, i) { + if (i) { + c.push("<?", h, " ", i, "?>") + } else { + c.push("<?", h, "?>") + } + }, + doctype: function(h) { + c.push("<!DOCTYPE", h, ">") + }, + reset: function() { + c.length = 0 + }, + getContent: function() { + return c.join("").replace(/\n$/, "") + } + } +}; +(function(a) { + a.html.Serializer = function(c, d) { + var b = this, + e = new a.html.Writer(c); + c = c || {}; + c.validate = "validate" in c ? c.validate : true; + b.schema = d = d || new a.html.Schema(); + b.writer = e; + b.serialize = function(h) { + var g, i; + i = c.validate; + g = { + 3: function(k, j) { + e.text(k.value, k.raw) + }, + 8: function(j) { + e.comment(j.value) + }, + 7: function(j) { + e.pi(j.name, j.value) + }, + 10: function(j) { + e.doctype(j.value) + }, + 4: function(j) { + e.cdata(j.value) + }, + 11: function(j) { + if ((j = j.firstChild)) { + do { + f(j) + } while (j = j.next) + } + } + }; + e.reset(); + + function f(k) { + var t = g[k.type], + j, o, s, r, p, u, n, m, q; + if (!t) { + j = k.name; + o = k.shortEnded; + s = k.attributes; + if (i && s && s.length > 1) { + u = []; + u.map = {}; + q = d.getElementRule(k.name); + for (n = 0, m = q.attributesOrder.length; n < m; n++) { + r = q.attributesOrder[n]; + if (r in s.map) { + p = s.map[r]; + u.map[r] = p; + u.push({ + name: r, + value: p + }) + } + } + for (n = 0, m = s.length; n < m; n++) { + r = s[n].name; + if (!(r in u.map)) { + p = s.map[r]; + u.map[r] = p; + u.push({ + name: r, + value: p + }) + } + } + s = u + } + e.start(k.name, s, o); + if (!o) { + if ((k = k.firstChild)) { + do { + f(k) + } while (k = k.next) + } + e.end(j) + } + } else { + t(k) + } + } + if (h.type == 1 && !c.inner) { + f(h) + } else { + g[11](h) + } + return e.getContent() + } + } +})(tinymce); +(function(d) { + var f = d.each, + c = d.is, + e = d.isWebKit, + a = d.isIE, + h = d.html.Entities, + b = /^([a-z0-9],?)+$/i, + g = d.html.Schema.blockElementsMap; + d.create("tinymce.dom.DOMUtils", { + doc: null, + root: null, + files: null, + pixelStyles: /^(top|left|bottom|right|width|height|borderWidth)$/, + props: { + "for": "htmlFor", + "class": "className", + className: "className", + checked: "checked", + disabled: "disabled", + maxlength: "maxLength", + readonly: "readOnly", + selected: "selected", + value: "value", + id: "id", + name: "name", + type: "type" + }, + DOMUtils: function(m, k) { + var j = this, + i; + j.doc = m; + j.win = window; + j.files = {}; + j.cssFlicker = false; + j.counter = 0; + j.stdMode = !d.isIE || m.documentMode >= 8; + j.boxModel = !d.isIE || m.compatMode == "CSS1Compat" || j.stdMode; + j.hasOuterHTML = "outerHTML" in m.createElement("a"); + j.settings = k = d.extend({ + keep_values: false, + hex_colors: 1 + }, k); + j.styles = new d.html.Styles({ + url_converter: k.url_converter, + url_converter_scope: k.url_converter_scope + }, k.schema); + if (d.isIE6) { + try { + m.execCommand("BackgroundImageCache", false, true) + } catch (l) { + j.cssFlicker = true + } + } + if (a) { + ("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g, function(n) { + m.createElement(n) + }) + } + d.addUnload(j.destroy, j) + }, + getRoot: function() { + var i = this, + j = i.settings; + return (j && i.get(j.root_element)) || i.doc.body + }, + getViewPort: function(j) { + var k, i; + j = !j ? this.win : j; + k = j.document; + i = this.boxModel ? k.documentElement : k.body; + return { + x: j.pageXOffset || i.scrollLeft, + y: j.pageYOffset || i.scrollTop, + w: j.innerWidth || i.clientWidth, + h: j.innerHeight || i.clientHeight + } + }, + getRect: function(l) { + var k, i = this, + j; + l = i.get(l); + k = i.getPos(l); + j = i.getSize(l); + return { + x: k.x, + y: k.y, + w: j.w, + h: j.h + } + }, + getSize: function(l) { + var j = this, + i, k; + l = j.get(l); + i = j.getStyle(l, "width"); + k = j.getStyle(l, "height"); + if (i.indexOf("px") === -1) { + i = 0 + } + if (k.indexOf("px") === -1) { + k = 0 + } + return { + w: parseInt(i) || l.offsetWidth || l.clientWidth, + h: parseInt(k) || l.offsetHeight || l.clientHeight + } + }, + getParent: function(k, j, i) { + return this.getParents(k, j, i, false) + }, + getParents: function(s, m, k, q) { + var j = this, + i, l = j.settings, + p = []; + s = j.get(s); + q = q === undefined; + if (l.strict_root) { + k = k || j.getRoot() + } + if (c(m, "string")) { + i = m; + if (m === "*") { + m = function(o) { + return o.nodeType == 1 + } + } else { + m = function(o) { + return j.is(o, i) + } + } + } + while (s) { + if (s == k || !s.nodeType || s.nodeType === 9) { + break + } + if (!m || m(s)) { + if (q) { + p.push(s) + } else { + return s + } + } + s = s.parentNode + } + return q ? p : null + }, + get: function(i) { + var j; + if (i && this.doc && typeof(i) == "string") { + j = i; + i = this.doc.getElementById(i); + if (i && i.id !== j) { + return this.doc.getElementsByName(j)[1] + } + } + return i + }, + getNext: function(j, i) { + return this._findSib(j, i, "nextSibling") + }, + getPrev: function(j, i) { + return this._findSib(j, i, "previousSibling") + }, + select: function(k, j) { + var i = this; + return d.dom.Sizzle(k, i.get(j) || i.get(i.settings.root_element) || i.doc, []) + }, + is: function(l, j) { + var k; + if (l.length === undefined) { + if (j === "*") { + return l.nodeType == 1 + } + if (b.test(j)) { + j = j.toLowerCase().split(/,/); + l = l.nodeName.toLowerCase(); + for (k = j.length - 1; k >= 0; k--) { + if (j[k] == l) { + return true + } + } + return false + } + } + return d.dom.Sizzle.matches(j, l.nodeType ? [l] : l).length > 0 + }, + add: function(l, o, i, k, m) { + var j = this; + return this.run(l, function(r) { + var q, n; + q = c(o, "string") ? j.doc.createElement(o) : o; + j.setAttribs(q, i); + if (k) { + if (k.nodeType) { + q.appendChild(k) + } else { + j.setHTML(q, k) + } + } + return !m ? r.appendChild(q) : q + }) + }, + create: function(k, i, j) { + return this.add(this.doc.createElement(k), k, i, j, 1) + }, + createHTML: function(q, i, m) { + var p = "", + l = this, + j; + p += "<" + q; + for (j in i) { + if (i.hasOwnProperty(j)) { + p += " " + j + '="' + l.encode(i[j]) + '"' + } + } + if (typeof(m) != "undefined") { + return p + ">" + m + "</" + q + ">" + } + return p + " />" + }, + remove: function(i, j) { + return this.run(i, function(l) { + var k, m; + k = l.parentNode; + if (!k) { + return null + } + if (j) { + while (m = l.firstChild) { + if (!d.isIE || m.nodeType !== 3 || m.nodeValue) { + k.insertBefore(m, l) + } else { + l.removeChild(m) + } + } + } + return k.removeChild(l) + }) + }, + setStyle: function(l, i, j) { + var k = this; + return k.run(l, function(o) { + var n, m; + n = o.style; + i = i.replace(/-(\D)/g, function(q, p) { + return p.toUpperCase() + }); + if (k.pixelStyles.test(i) && (d.is(j, "number") || /^[\-0-9\.]+$/.test(j))) { + j += "px" + } + switch (i) { + case "opacity": + if (a) { + n.filter = j === "" ? "" : "alpha(opacity=" + (j * 100) + ")"; + if (!l.currentStyle || !l.currentStyle.hasLayout) { + n.display = "inline-block" + } + } + n[i] = n["-moz-opacity"] = n["-khtml-opacity"] = j || ""; + break; + case "float": + a ? n.styleFloat = j : n.cssFloat = j; + break; + default: + n[i] = j || "" + } + if (k.settings.update_styles) { + k.setAttrib(o, "data-mce-style") + } + }) + }, + getStyle: function(l, i, k) { + l = this.get(l); + if (!l) { + return false + } + if (this.doc.defaultView && k) { + i = i.replace(/[A-Z]/g, function(m) { + return "-" + m + }); + try { + return this.doc.defaultView.getComputedStyle(l, null).getPropertyValue(i) + } catch (j) { + return null + } + } + i = i.replace(/-(\D)/g, function(n, m) { + return m.toUpperCase() + }); + if (i == "float") { + i = a ? "styleFloat" : "cssFloat" + } + if (l.currentStyle && k) { + return l.currentStyle[i] + } + return l.style[i] + }, + setStyles: function(l, m) { + var j = this, + k = j.settings, + i; + i = k.update_styles; + k.update_styles = 0; + f(m, function(o, p) { + j.setStyle(l, p, o) + }); + k.update_styles = i; + if (k.update_styles) { + j.setAttrib(l, k.cssText) + } + }, + removeAllAttribs: function(i) { + return this.run(i, function(l) { + var j = l.attributes; + for (var k = j.length - 1; k >= 0; k--) { + l.removeAttributeNode(j.item(k)) + } + }) + }, + setAttrib: function(k, l, i) { + var j = this; + if (!k || !l) { + return + } + if (j.settings.strict) { + l = l.toLowerCase() + } + return this.run(k, function(n) { + var m = j.settings; + switch (l) { + case "style": + if (!c(i, "string")) { + f(i, function(o, p) { + j.setStyle(n, p, o) + }); + return + } + if (m.keep_values) { + if (i && !j._isRes(i)) { + n.setAttribute("data-mce-style", i, 2) + } else { + n.removeAttribute("data-mce-style", 2) + } + } + n.style.cssText = i; + break; + case "class": + n.className = i || ""; + break; + case "src": + case "href": + if (m.keep_values) { + if (m.url_converter) { + i = m.url_converter.call(m.url_converter_scope || j, i, l, n) + } + j.setAttrib(n, "data-mce-" + l, i, 2) + } + break; + case "shape": + n.setAttribute("data-mce-style", i); + break + } + if (c(i) && i !== null && i.length !== 0) { + n.setAttribute(l, "" + i, 2) + } else { + n.removeAttribute(l, 2) + } + }) + }, + setAttribs: function(j, k) { + var i = this; + return this.run(j, function(l) { + f(k, function(m, o) { + i.setAttrib(l, o, m) + }) + }) + }, + getAttrib: function(l, m, k) { + var i, j = this; + l = j.get(l); + if (!l || l.nodeType !== 1) { + return false + } + if (!c(k)) { + k = "" + } + if (/^(src|href|style|coords|shape)$/.test(m)) { + i = l.getAttribute("data-mce-" + m); + if (i) { + return i + } + } + if (a && j.props[m]) { + i = l[j.props[m]]; + i = i && i.nodeValue ? i.nodeValue : i + } + if (!i) { + i = l.getAttribute(m, 2) + } + if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(m)) { + if (l[j.props[m]] === true && i === "") { + return m + } + return i ? m : "" + } + if (l.nodeName === "FORM" && l.getAttributeNode(m)) { + return l.getAttributeNode(m).nodeValue + } + if (m === "style") { + i = i || l.style.cssText; + if (i) { + i = j.serializeStyle(j.parseStyle(i), l.nodeName); + if (j.settings.keep_values && !j._isRes(i)) { + l.setAttribute("data-mce-style", i) + } + } + } + if (e && m === "class" && i) { + i = i.replace(/(apple|webkit)\-[a-z\-]+/gi, "") + } + if (a) { + switch (m) { + case "rowspan": + case "colspan": + if (i === 1) { + i = "" + } + break; + case "size": + if (i === "+0" || i === 20 || i === 0) { + i = "" + } + break; + case "width": + case "height": + case "vspace": + case "checked": + case "disabled": + case "readonly": + if (i === 0) { + i = "" + } + break; + case "hspace": + if (i === -1) { + i = "" + } + break; + case "maxlength": + case "tabindex": + if (i === 32768 || i === 2147483647 || i === "32768") { + i = "" + } + break; + case "multiple": + case "compact": + case "noshade": + case "nowrap": + if (i === 65535) { + return m + } + return k; + case "shape": + i = i.toLowerCase(); + break; + default: + if (m.indexOf("on") === 0 && i) { + i = d._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, "$1", "" + i) + } + } + } + return (i !== undefined && i !== null && i !== "") ? "" + i : k + }, + getPos: function(q, l) { + var j = this, + i = 0, + p = 0, + m, o = j.doc, + k; + q = j.get(q); + l = l || o.body; + if (q) { + if (a && !j.stdMode) { + q = q.getBoundingClientRect(); + m = j.boxModel ? o.documentElement : o.body; + i = j.getStyle(j.select("html")[0], "borderWidth"); + i = (i == "medium" || j.boxModel && !j.isIE6) && 2 || i; + return { + x: q.left + m.scrollLeft - i, + y: q.top + m.scrollTop - i + } + } + k = q; + while (k && k != l && k.nodeType) { + i += k.offsetLeft || 0; + p += k.offsetTop || 0; + k = k.offsetParent + } + k = q.parentNode; + while (k && k != l && k.nodeType) { + i -= k.scrollLeft || 0; + p -= k.scrollTop || 0; + k = k.parentNode + } + } + return { + x: i, + y: p + } + }, + parseStyle: function(i) { + return this.styles.parse(i) + }, + serializeStyle: function(j, i) { + return this.styles.serialize(j, i) + }, + loadCSS: function(i) { + var k = this, + l = k.doc, + j; + if (!i) { + i = "" + } + j = k.select("head")[0]; + f(i.split(","), function(m) { + var n; + if (k.files[m]) { + return + } + k.files[m] = true; + n = k.create("link", { + rel: "stylesheet", + href: d._addVer(m) + }); + if (a && l.documentMode && l.recalc) { + n.onload = function() { + if (l.recalc) { + l.recalc() + } + n.onload = null + } + } + j.appendChild(n) + }) + }, + addClass: function(i, j) { + return this.run(i, function(k) { + var l; + if (!j) { + return 0 + } + if (this.hasClass(k, j)) { + return k.className + } + l = this.removeClass(k, j); + return k.className = (l != "" ? (l + " ") : "") + j + }) + }, + removeClass: function(k, l) { + var i = this, + j; + return i.run(k, function(n) { + var m; + if (i.hasClass(n, l)) { + if (!j) { + j = new RegExp("(^|\\s+)" + l + "(\\s+|$)", "g") + } + m = n.className.replace(j, " "); + m = d.trim(m != " " ? m : ""); + n.className = m; + if (!m) { + n.removeAttribute("class"); + n.removeAttribute("className") + } + return m + } + return n.className + }) + }, + hasClass: function(j, i) { + j = this.get(j); + if (!j || !i) { + return false + } + return (" " + j.className + " ").indexOf(" " + i + " ") !== -1 + }, + show: function(i) { + return this.setStyle(i, "display", "block") + }, + hide: function(i) { + return this.setStyle(i, "display", "none") + }, + isHidden: function(i) { + i = this.get(i); + return !i || i.style.display == "none" || this.getStyle(i, "display") == "none" + }, + uniqueId: function(i) { + return (!i ? "mce_" : i) + (this.counter++) + }, + setHTML: function(k, j) { + var i = this; + return i.run(k, function(m) { + if (a) { + while (m.firstChild) { + m.removeChild(m.firstChild) + } + try { + m.innerHTML = "<br />" + j; + m.removeChild(m.firstChild) + } catch (l) { + m = i.create("div"); + m.innerHTML = "<br />" + j; + f(m.childNodes, function(o, n) { + if (n) { + m.appendChild(o) + } + }) + } + } else { + m.innerHTML = j + } + return j + }) + }, + getOuterHTML: function(k) { + var j, i = this; + k = i.get(k); + if (!k) { + return null + } + if (k.nodeType === 1 && i.hasOuterHTML) { + return k.outerHTML + } + j = (k.ownerDocument || i.doc).createElement("body"); + j.appendChild(k.cloneNode(true)); + return j.innerHTML + }, + setOuterHTML: function(l, j, m) { + var i = this; + + function k(p, o, r) { + var s, q; + q = r.createElement("body"); + q.innerHTML = o; + s = q.lastChild; + while (s) { + i.insertAfter(s.cloneNode(true), p); + s = s.previousSibling + } + i.remove(p) + } + return this.run(l, function(o) { + o = i.get(o); + if (o.nodeType == 1) { + m = m || o.ownerDocument || i.doc; + if (a) { + try { + if (a && o.nodeType == 1) { + o.outerHTML = j + } else { + k(o, j, m) + } + } catch (n) { + k(o, j, m) + } + } else { + k(o, j, m) + } + } + }) + }, + decode: h.decode, + encode: h.encodeAllRaw, + insertAfter: function(i, j) { + j = this.get(j); + return this.run(i, function(l) { + var k, m; + k = j.parentNode; + m = j.nextSibling; + if (m) { + k.insertBefore(l, m) + } else { + k.appendChild(l) + } + return l + }) + }, + isBlock: function(j) { + var i = j.nodeType; + if (i) { + return !!(i === 1 && g[j.nodeName]) + } + return !!g[j] + }, + replace: function(m, l, i) { + var j = this; + if (c(l, "array")) { + m = m.cloneNode(true) + } + return j.run(l, function(k) { + if (i) { + f(d.grep(k.childNodes), function(n) { + m.appendChild(n) + }) + } + return k.parentNode.replaceChild(m, k) + }) + }, + rename: function(l, i) { + var k = this, + j; + if (l.nodeName != i.toUpperCase()) { + j = k.create(i); + f(k.getAttribs(l), function(m) { + k.setAttrib(j, m.nodeName, k.getAttrib(l, m.nodeName)) + }); + k.replace(j, l, 1) + } + return j || l + }, + findCommonAncestor: function(k, i) { + var l = k, + j; + while (l) { + j = i; + while (j && l != j) { + j = j.parentNode + } + if (l == j) { + break + } + l = l.parentNode + } + if (!l && k.ownerDocument) { + return k.ownerDocument.documentElement + } + return l + }, + toHex: function(i) { + var k = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(i); + + function j(l) { + l = parseInt(l).toString(16); + return l.length > 1 ? l : "0" + l + } + if (k) { + i = "#" + j(k[1]) + j(k[2]) + j(k[3]); + return i + } + return i + }, + getClasses: function() { + var n = this, + j = [], + m, o = {}, + p = n.settings.class_filter, + l; + if (n.classes) { + return n.classes + } + function q(i) { + f(i.imports, function(s) { + q(s) + }); + f(i.cssRules || i.rules, function(s) { + switch (s.type || 1) { + case 1: + if (s.selectorText) { + f(s.selectorText.split(","), function(r) { + r = r.replace(/^\s*|\s*$|^\s\./g, ""); + if (/\.mce/.test(r) || !/\.[\w\-]+$/.test(r)) { + return + } + l = r; + r = d._replace(/.*\.([a-z0-9_\-]+).*/i, "$1", r); + if (p && !(r = p(r, l))) { + return + } + if (!o[r]) { + j.push({ + "class": r + }); + o[r] = 1 + } + }) + } + break; + case 3: + q(s.styleSheet); + break + } + }) + } + try { + f(n.doc.styleSheets, q) + } catch (k) {} + if (j.length > 0) { + n.classes = j + } + return j + }, + run: function(l, k, j) { + var i = this, + m; + if (i.doc && typeof(l) === "string") { + l = i.get(l) + } + if (!l) { + return false + } + j = j || this; + if (!l.nodeType && (l.length || l.length === 0)) { + m = []; + f(l, function(o, n) { + if (o) { + if (typeof(o) == "string") { + o = i.doc.getElementById(o) + } + m.push(k.call(j, o, n)) + } + }); + return m + } + return k.call(j, l) + }, + getAttribs: function(j) { + var i; + j = this.get(j); + if (!j) { + return [] + } + if (a) { + i = []; + if (j.nodeName == "OBJECT") { + return j.attributes + } + if (j.nodeName === "OPTION" && this.getAttrib(j, "selected")) { + i.push({ + specified: 1, + nodeName: "selected" + }) + } + j.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, "").replace(/[\w:\-]+/gi, function(k) { + i.push({ + specified: 1, + nodeName: k + }) + }); + return i + } + return j.attributes + }, + destroy: function(j) { + var i = this; + if (i.events) { + i.events.destroy() + } + i.win = i.doc = i.root = i.events = null; + if (!j) { + d.removeUnload(i.destroy) + } + }, + createRng: function() { + var i = this.doc; + return i.createRange ? i.createRange() : new d.dom.Range(this) + }, + nodeIndex: function(n, o) { + var i = 0, + l, m, k, j; + if (n) { + for (l = n.nodeType, n = n.previousSibling, m = n; n; n = n.previousSibling) { + k = n.nodeType; + if (o && k == 3) { + j = false; + try { + j = n.nodeValue.length + } catch (p) {} + if (k == l || !j) { + continue + } + } + i++; + l = k + } + } + return i + }, + split: function(m, l, p) { + var q = this, + i = q.createRng(), + n, k, o; + + function j(t) { + var s, r = t.childNodes; + if (t.nodeType == 1 && t.getAttribute("data-mce-type") == "bookmark") { + return + } + for (s = r.length - 1; s >= 0; s--) { + j(r[s]) + } + if (t.nodeType != 9) { + if (t.nodeType == 3 && t.nodeValue.length > 0) { + if (!q.isBlock(t.parentNode) || d.trim(t.nodeValue).length > 0) { + return + } + } + if (t.nodeType == 1) { + r = t.childNodes; + if (r.length == 1 && r[0] && r[0].nodeType == 1 && r[0].getAttribute("data-mce-type") == "bookmark") { + t.parentNode.insertBefore(r[0], t) + } + if (r.length || /^(br|hr|input|img)$/i.test(t.nodeName)) { + return + } + } + q.remove(t) + } + return t + } + if (m && l) { + i.setStart(m.parentNode, q.nodeIndex(m)); + i.setEnd(l.parentNode, q.nodeIndex(l)); + n = i.extractContents(); + i = q.createRng(); + i.setStart(l.parentNode, q.nodeIndex(l) + 1); + i.setEnd(m.parentNode, q.nodeIndex(m) + 1); + k = i.extractContents(); + o = m.parentNode; + o.insertBefore(j(n), m); + if (p) { + o.replaceChild(p, l) + } else { + o.insertBefore(l, m) + } + o.insertBefore(j(k), m); + q.remove(m); + return p || l + } + }, + bind: function(m, i, l, k) { + var j = this; + if (!j.events) { + j.events = new d.dom.EventUtils() + } + return j.events.add(m, i, l, k || this) + }, + unbind: function(l, i, k) { + var j = this; + if (!j.events) { + j.events = new d.dom.EventUtils() + } + return j.events.remove(l, i, k) + }, + _findSib: function(l, i, j) { + var k = this, + m = i; + if (l) { + if (c(m, "string")) { + m = function(n) { + return k.is(n, i) + } + } + for (l = l[j]; l; l = l[j]) { + if (m(l)) { + return l + } + } + } + return null + }, + _isRes: function(i) { + return /^(top|left|bottom|right|width|height)/i.test(i) || /;\s*(top|left|bottom|right|width|height)/i.test(i) + } + }); + d.DOM = new d.dom.DOMUtils(document, { + process_html: 0 + }) +})(tinymce); +(function(a) { + function b(c) { + var N = this, + e = c.doc, + S = 0, + E = 1, + j = 2, + D = true, + R = false, + U = "startOffset", + h = "startContainer", + P = "endContainer", + z = "endOffset", + k = tinymce.extend, + n = c.nodeIndex; + k(N, { + startContainer: e, + startOffset: 0, + endContainer: e, + endOffset: 0, + collapsed: D, + commonAncestorContainer: e, + START_TO_START: 0, + START_TO_END: 1, + END_TO_END: 2, + END_TO_START: 3, + setStart: q, + setEnd: s, + setStartBefore: g, + setStartAfter: I, + setEndBefore: J, + setEndAfter: u, + collapse: A, + selectNode: x, + selectNodeContents: F, + compareBoundaryPoints: v, + deleteContents: p, + extractContents: H, + cloneContents: d, + insertNode: C, + surroundContents: M, + cloneRange: K + }); + + function q(V, t) { + B(D, V, t) + } + function s(V, t) { + B(R, V, t) + } + function g(t) { + q(t.parentNode, n(t)) + } + function I(t) { + q(t.parentNode, n(t) + 1) + } + function J(t) { + s(t.parentNode, n(t)) + } + function u(t) { + s(t.parentNode, n(t) + 1) + } + function A(t) { + if (t) { + N[P] = N[h]; + N[z] = N[U] + } else { + N[h] = N[P]; + N[U] = N[z] + } + N.collapsed = D + } + function x(t) { + g(t); + u(t) + } + function F(t) { + q(t, 0); + s(t, t.nodeType === 1 ? t.childNodes.length : t.nodeValue.length) + } + function v(Y, t) { + var ab = N[h], + W = N[U], + aa = N[P], + V = N[z], + Z = t.startContainer, + ad = t.startOffset, + X = t.endContainer, + ac = t.endOffset; + if (Y === 0) { + return G(ab, W, Z, ad) + } + if (Y === 1) { + return G(aa, V, Z, ad) + } + if (Y === 2) { + return G(aa, V, X, ac) + } + if (Y === 3) { + return G(ab, W, X, ac) + } + } + function p() { + m(j) + } + function H() { + return m(S) + } + function d() { + return m(E) + } + function C(Y) { + var V = this[h], + t = this[U], + X, W; + if ((V.nodeType === 3 || V.nodeType === 4) && V.nodeValue) { + if (!t) { + V.parentNode.insertBefore(Y, V) + } else { + if (t >= V.nodeValue.length) { + c.insertAfter(Y, V) + } else { + X = V.splitText(t); + V.parentNode.insertBefore(Y, X) + } + } + } else { + if (V.childNodes.length > 0) { + W = V.childNodes[t] + } + if (W) { + V.insertBefore(Y, W) + } else { + V.appendChild(Y) + } + } + } + function M(V) { + var t = N.extractContents(); + N.insertNode(V); + V.appendChild(t); + N.selectNode(V) + } + function K() { + return k(new b(c), { + startContainer: N[h], + startOffset: N[U], + endContainer: N[P], + endOffset: N[z], + collapsed: N.collapsed, + commonAncestorContainer: N.commonAncestorContainer + }) + } + function O(t, V) { + var W; + if (t.nodeType == 3) { + return t + } + if (V < 0) { + return t + } + W = t.firstChild; + while (W && V > 0) { + --V; + W = W.nextSibling + } + if (W) { + return W + } + return t + } + function l() { + return (N[h] == N[P] && N[U] == N[z]) + } + function G(X, Z, V, Y) { + var aa, W, t, ab, ad, ac; + if (X == V) { + if (Z == Y) { + return 0 + } + if (Z < Y) { + return -1 + } + return 1 + } + aa = V; + while (aa && aa.parentNode != X) { + aa = aa.parentNode + } + if (aa) { + W = 0; + t = X.firstChild; + while (t != aa && W < Z) { + W++; + t = t.nextSibling + } + if (Z <= W) { + return -1 + } + return 1 + } + aa = X; + while (aa && aa.parentNode != V) { + aa = aa.parentNode + } + if (aa) { + W = 0; + t = V.firstChild; + while (t != aa && W < Y) { + W++; + t = t.nextSibling + } + if (W < Y) { + return -1 + } + return 1 + } + ab = c.findCommonAncestor(X, V); + ad = X; + while (ad && ad.parentNode != ab) { + ad = ad.parentNode + } + if (!ad) { + ad = ab + } + ac = V; + while (ac && ac.parentNode != ab) { + ac = ac.parentNode + } + if (!ac) { + ac = ab + } + if (ad == ac) { + return 0 + } + t = ab.firstChild; + while (t) { + if (t == ad) { + return -1 + } + if (t == ac) { + return 1 + } + t = t.nextSibling + } + } + function B(V, Y, X) { + var t, W; + if (V) { + N[h] = Y; + N[U] = X + } else { + N[P] = Y; + N[z] = X + } + t = N[P]; + while (t.parentNode) { + t = t.parentNode + } + W = N[h]; + while (W.parentNode) { + W = W.parentNode + } + if (W == t) { + if (G(N[h], N[U], N[P], N[z]) > 0) { + N.collapse(V) + } + } else { + N.collapse(V) + } + N.collapsed = l(); + N.commonAncestorContainer = c.findCommonAncestor(N[h], N[P]) + } + function m(ab) { + var aa, X = 0, + ad = 0, + V, Z, W, Y, t, ac; + if (N[h] == N[P]) { + return f(ab) + } + for (aa = N[P], V = aa.parentNode; V; aa = V, V = V.parentNode) { + if (V == N[h]) { + return r(aa, ab) + }++X + } + for (aa = N[h], V = aa.parentNode; V; aa = V, V = V.parentNode) { + if (V == N[P]) { + return T(aa, ab) + }++ad + } + Z = ad - X; + W = N[h]; + while (Z > 0) { + W = W.parentNode; + Z-- + } + Y = N[P]; + while (Z < 0) { + Y = Y.parentNode; + Z++ + } + for (t = W.parentNode, ac = Y.parentNode; t != ac; t = t.parentNode, ac = ac.parentNode) { + W = t; + Y = ac + } + return o(W, Y, ab) + } + function f(Z) { + var ab, Y, X, aa, t, W, V; + if (Z != j) { + ab = e.createDocumentFragment() + } + if (N[U] == N[z]) { + return ab + } + if (N[h].nodeType == 3) { + Y = N[h].nodeValue; + X = Y.substring(N[U], N[z]); + if (Z != E) { + N[h].deleteData(N[U], N[z] - N[U]); + N.collapse(D) + } + if (Z == j) { + return + } + ab.appendChild(e.createTextNode(X)); + return ab + } + aa = O(N[h], N[U]); + t = N[z] - N[U]; + while (t > 0) { + W = aa.nextSibling; + V = y(aa, Z); + if (ab) { + ab.appendChild(V) + }--t; + aa = W + } + if (Z != E) { + N.collapse(D) + } + return ab + } + function r(ab, Y) { + var aa, Z, V, t, X, W; + if (Y != j) { + aa = e.createDocumentFragment() + } + Z = i(ab, Y); + if (aa) { + aa.appendChild(Z) + } + V = n(ab); + t = V - N[U]; + if (t <= 0) { + if (Y != E) { + N.setEndBefore(ab); + N.collapse(R) + } + return aa + } + Z = ab.previousSibling; + while (t > 0) { + X = Z.previousSibling; + W = y(Z, Y); + if (aa) { + aa.insertBefore(W, aa.firstChild) + }--t; + Z = X + } + if (Y != E) { + N.setEndBefore(ab); + N.collapse(R) + } + return aa + } + function T(Z, Y) { + var ab, V, aa, t, X, W; + if (Y != j) { + ab = e.createDocumentFragment() + } + aa = Q(Z, Y); + if (ab) { + ab.appendChild(aa) + } + V = n(Z); + ++V; + t = N[z] - V; + aa = Z.nextSibling; + while (t > 0) { + X = aa.nextSibling; + W = y(aa, Y); + if (ab) { + ab.appendChild(W) + }--t; + aa = X + } + if (Y != E) { + N.setStartAfter(Z); + N.collapse(D) + } + return ab + } + function o(Z, t, ac) { + var W, ae, Y, aa, ab, V, ad, X; + if (ac != j) { + ae = e.createDocumentFragment() + } + W = Q(Z, ac); + if (ae) { + ae.appendChild(W) + } + Y = Z.parentNode; + aa = n(Z); + ab = n(t); + ++aa; + V = ab - aa; + ad = Z.nextSibling; + while (V > 0) { + X = ad.nextSibling; + W = y(ad, ac); + if (ae) { + ae.appendChild(W) + } + ad = X; + --V + } + W = i(t, ac); + if (ae) { + ae.appendChild(W) + } + if (ac != E) { + N.setStartAfter(Z); + N.collapse(D) + } + return ae + } + function i(aa, ab) { + var W = O(N[P], N[z] - 1), + ac, Z, Y, t, V, X = W != N[P]; + if (W == aa) { + return L(W, X, R, ab) + } + ac = W.parentNode; + Z = L(ac, R, R, ab); + while (ac) { + while (W) { + Y = W.previousSibling; + t = L(W, X, R, ab); + if (ab != j) { + Z.insertBefore(t, Z.firstChild) + } + X = D; + W = Y + } + if (ac == aa) { + return Z + } + W = ac.previousSibling; + ac = ac.parentNode; + V = L(ac, R, R, ab); + if (ab != j) { + V.appendChild(Z) + } + Z = V + } + } + function Q(aa, ab) { + var X = O(N[h], N[U]), + Y = X != N[h], + ac, Z, W, t, V; + if (X == aa) { + return L(X, Y, D, ab) + } + ac = X.parentNode; + Z = L(ac, R, D, ab); + while (ac) { + while (X) { + W = X.nextSibling; + t = L(X, Y, D, ab); + if (ab != j) { + Z.appendChild(t) + } + Y = D; + X = W + } + if (ac == aa) { + return Z + } + X = ac.nextSibling; + ac = ac.parentNode; + V = L(ac, R, D, ab); + if (ab != j) { + V.appendChild(Z) + } + Z = V + } + } + function L(t, Y, ab, ac) { + var X, W, Z, V, aa; + if (Y) { + return y(t, ac) + } + if (t.nodeType == 3) { + X = t.nodeValue; + if (ab) { + V = N[U]; + W = X.substring(V); + Z = X.substring(0, V) + } else { + V = N[z]; + W = X.substring(0, V); + Z = X.substring(V) + } + if (ac != E) { + t.nodeValue = Z + } + if (ac == j) { + return + } + aa = t.cloneNode(R); + aa.nodeValue = W; + return aa + } + if (ac == j) { + return + } + return t.cloneNode(R) + } + function y(V, t) { + if (t != j) { + return t == E ? V.cloneNode(D) : V + } + V.parentNode.removeChild(V) + } + } + a.Range = b +})(tinymce.dom); +(function() { + function a(g) { + var i = this, + j = "\uFEFF", + e, h, d = g.dom, + c = true, + f = false; + + function b() { + var n = g.getRng(), + k = d.createRng(), + m, o; + m = n.item ? n.item(0) : n.parentElement(); + if (m.ownerDocument != d.doc) { + return k + } + o = g.isCollapsed(); + if (n.item || !m.hasChildNodes()) { + if (o) { + k.setStart(m, 0); + k.setEnd(m, 0) + } else { + k.setStart(m.parentNode, d.nodeIndex(m)); + k.setEnd(k.startContainer, k.startOffset + 1) + } + return k + } + function l(s) { + var u, q, t, p, A = 0, + x, y, z, r, v; + r = n.duplicate(); + r.collapse(s); + u = d.create("a"); + z = r.parentElement(); + if (!z.hasChildNodes()) { + k[s ? "setStart" : "setEnd"](z, 0); + return + } + z.appendChild(u); + r.moveToElementText(u); + v = n.compareEndPoints(s ? "StartToStart" : "EndToEnd", r); + if (v > 0) { + k[s ? "setStartAfter" : "setEndAfter"](z); + d.remove(u); + return + } + p = tinymce.grep(z.childNodes); + x = p.length - 1; + while (A <= x) { + y = Math.floor((A + x) / 2); + z.insertBefore(u, p[y]); + r.moveToElementText(u); + v = n.compareEndPoints(s ? "StartToStart" : "EndToEnd", r); + if (v > 0) { + A = y + 1 + } else { + if (v < 0) { + x = y - 1 + } else { + found = true; + break + } + } + } + q = v > 0 || y == 0 ? u.nextSibling : u.previousSibling; + if (q.nodeType == 1) { + d.remove(u); + t = d.nodeIndex(q); + q = q.parentNode; + if (!s || y > 0) { + t++ + } + } else { + if (v > 0 || y == 0) { + r.setEndPoint(s ? "StartToStart" : "EndToEnd", n); + t = r.text.length + } else { + r.setEndPoint(s ? "StartToStart" : "EndToEnd", n); + t = q.nodeValue.length - r.text.length + } + d.remove(u) + } + k[s ? "setStart" : "setEnd"](q, t) + } + l(true); + if (!o) { + l() + } + return k + } + this.addRange = function(k) { + var p, n, m, r, u, s, t = g.dom.doc, + o = t.body; + + function l(B) { + var x, A, v, z, y; + v = d.create("a"); + x = B ? m : u; + A = B ? r : s; + z = p.duplicate(); + if (x == t || x == t.documentElement) { + x = o; + A = 0 + } + if (x.nodeType == 3) { + x.parentNode.insertBefore(v, x); + z.moveToElementText(v); + z.moveStart("character", A); + d.remove(v); + p.setEndPoint(B ? "StartToStart" : "EndToEnd", z) + } else { + y = x.childNodes; + if (y.length) { + if (A >= y.length) { + d.insertAfter(v, y[y.length - 1]) + } else { + x.insertBefore(v, y[A]) + } + z.moveToElementText(v) + } else { + v = t.createTextNode(j); + x.appendChild(v); + z.moveToElementText(v.parentNode); + z.collapse(c) + } + p.setEndPoint(B ? "StartToStart" : "EndToEnd", z); + d.remove(v) + } + } + this.destroy(); + m = k.startContainer; + r = k.startOffset; + u = k.endContainer; + s = k.endOffset; + p = o.createTextRange(); + if (m == u && m.nodeType == 1 && r == s - 1) { + if (r == s - 1) { + try { + n = o.createControlRange(); + n.addElement(m.childNodes[r]); + n.select(); + return + } catch (q) {} + } + } + l(true); + l(); + p.select() + }; + this.getRangeAt = function() { + if (!e || !tinymce.dom.RangeUtils.compareRanges(h, g.getRng())) { + e = b(); + h = g.getRng() + } + try { + e.startContainer.nextSibling + } catch (k) { + e = b(); + h = null + } + return e + }; + this.destroy = function() { + h = e = null + } + } + tinymce.dom.TridentSelection = a +})(); +(function() { + var p = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + j = 0, + d = Object.prototype.toString, + o = false, + i = true; + [0, 0].sort(function() { + i = false; + return 0 + }); + var b = function(v, e, z, A) { + z = z || []; + e = e || document; + var C = e; + if (e.nodeType !== 1 && e.nodeType !== 9) { + return [] + } + if (!v || typeof v !== "string") { + return z + } + var x = [], + s, E, H, r, u = true, + t = b.isXML(e), + B = v, + D, G, F, y; + do { + p.exec(""); + s = p.exec(B); + if (s) { + B = s[3]; + x.push(s[1]); + if (s[2]) { + r = s[3]; + break + } + } + } while (s); + if (x.length > 1 && k.exec(v)) { + if (x.length === 2 && f.relative[x[0]]) { + E = h(x[0] + x[1], e) + } else { + E = f.relative[x[0]] ? [e] : b(x.shift(), e); + while (x.length) { + v = x.shift(); + if (f.relative[v]) { + v += x.shift() + } + E = h(v, E) + } + } + } else { + if (!A && x.length > 1 && e.nodeType === 9 && !t && f.match.ID.test(x[0]) && !f.match.ID.test(x[x.length - 1])) { + D = b.find(x.shift(), e, t); + e = D.expr ? b.filter(D.expr, D.set)[0] : D.set[0] + } + if (e) { + D = A ? { + expr: x.pop(), + set: a(A) + } : b.find(x.pop(), x.length === 1 && (x[0] === "~" || x[0] === "+") && e.parentNode ? e.parentNode : e, t); + E = D.expr ? b.filter(D.expr, D.set) : D.set; + if (x.length > 0) { + H = a(E) + } else { + u = false + } + while (x.length) { + G = x.pop(); + F = G; + if (!f.relative[G]) { + G = "" + } else { + F = x.pop() + } + if (F == null) { + F = e + } + f.relative[G](H, F, t) + } + } else { + H = x = [] + } + } + if (!H) { + H = E + } + if (!H) { + b.error(G || v) + } + if (d.call(H) === "[object Array]") { + if (!u) { + z.push.apply(z, H) + } else { + if (e && e.nodeType === 1) { + for (y = 0; H[y] != null; y++) { + if (H[y] && (H[y] === true || H[y].nodeType === 1 && b.contains(e, H[y]))) { + z.push(E[y]) + } + } + } else { + for (y = 0; H[y] != null; y++) { + if (H[y] && H[y].nodeType === 1) { + z.push(E[y]) + } + } + } + } + } else { + a(H, z) + } + if (r) { + b(r, C, z, A); + b.uniqueSort(z) + } + return z + }; + b.uniqueSort = function(r) { + if (c) { + o = i; + r.sort(c); + if (o) { + for (var e = 1; e < r.length; e++) { + if (r[e] === r[e - 1]) { + r.splice(e--, 1) + } + } + } + } + return r + }; + b.matches = function(e, r) { + return b(e, null, null, r) + }; + b.find = function(y, e, z) { + var x; + if (!y) { + return [] + } + for (var t = 0, s = f.order.length; t < s; t++) { + var v = f.order[t], + u; + if ((u = f.leftMatch[v].exec(y))) { + var r = u[1]; + u.splice(1, 1); + if (r.substr(r.length - 1) !== "\\") { + u[1] = (u[1] || "").replace(/\\/g, ""); + x = f.find[v](u, e, z); + if (x != null) { + y = y.replace(f.match[v], ""); + break + } + } + } + } + if (!x) { + x = e.getElementsByTagName("*") + } + return { + set: x, + expr: y + } + }; + b.filter = function(C, B, F, u) { + var s = C, + H = [], + z = B, + x, e, y = B && B[0] && b.isXML(B[0]); + while (C && B.length) { + for (var A in f.filter) { + if ((x = f.leftMatch[A].exec(C)) != null && x[2]) { + var r = f.filter[A], + G, E, t = x[1]; + e = false; + x.splice(1, 1); + if (t.substr(t.length - 1) === "\\") { + continue + } + if (z === H) { + H = [] + } + if (f.preFilter[A]) { + x = f.preFilter[A](x, z, F, H, u, y); + if (!x) { + e = G = true + } else { + if (x === true) { + continue + } + } + } + if (x) { + for (var v = 0; + (E = z[v]) != null; v++) { + if (E) { + G = r(E, x, v, z); + var D = u ^ !! G; + if (F && G != null) { + if (D) { + e = true + } else { + z[v] = false + } + } else { + if (D) { + H.push(E); + e = true + } + } + } + } + } + if (G !== undefined) { + if (!F) { + z = H + } + C = C.replace(f.match[A], ""); + if (!e) { + return [] + } + break + } + } + } + if (C === s) { + if (e == null) { + b.error(C) + } else { + break + } + } + s = C + } + return z + }; + b.error = function(e) { + throw "Syntax error, unrecognized expression: " + e + }; + var f = b.selectors = { + order: ["ID", "NAME", "TAG"], + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(e) { + return e.getAttribute("href") + } + }, + relative: { + "+": function(x, r) { + var t = typeof r === "string", + v = t && !/\W/.test(r), + y = t && !v; + if (v) { + r = r.toLowerCase() + } + for (var s = 0, e = x.length, u; s < e; s++) { + if ((u = x[s])) { + while ((u = u.previousSibling) && u.nodeType !== 1) {} + x[s] = y || u && u.nodeName.toLowerCase() === r ? u || false : u === r + } + } + if (y) { + b.filter(r, x, true) + } + }, + ">": function(x, r) { + var u = typeof r === "string", + v, s = 0, + e = x.length; + if (u && !/\W/.test(r)) { + r = r.toLowerCase(); + for (; s < e; s++) { + v = x[s]; + if (v) { + var t = v.parentNode; + x[s] = t.nodeName.toLowerCase() === r ? t : false + } + } + } else { + for (; s < e; s++) { + v = x[s]; + if (v) { + x[s] = u ? v.parentNode : v.parentNode === r + } + } + if (u) { + b.filter(r, x, true) + } + } + }, + "": function(t, r, v) { + var s = j++, + e = q, + u; + if (typeof r === "string" && !/\W/.test(r)) { + r = r.toLowerCase(); + u = r; + e = n + } + e("parentNode", r, s, t, u, v) + }, + "~": function(t, r, v) { + var s = j++, + e = q, + u; + if (typeof r === "string" && !/\W/.test(r)) { + r = r.toLowerCase(); + u = r; + e = n + } + e("previousSibling", r, s, t, u, v) + } + }, + find: { + ID: function(r, s, t) { + if (typeof s.getElementById !== "undefined" && !t) { + var e = s.getElementById(r[1]); + return e ? [e] : [] + } + }, + NAME: function(s, v) { + if (typeof v.getElementsByName !== "undefined") { + var r = [], + u = v.getElementsByName(s[1]); + for (var t = 0, e = u.length; t < e; t++) { + if (u[t].getAttribute("name") === s[1]) { + r.push(u[t]) + } + } + return r.length === 0 ? null : r + } + }, + TAG: function(e, r) { + return r.getElementsByTagName(e[1]) + } + }, + preFilter: { + CLASS: function(t, r, s, e, x, y) { + t = " " + t[1].replace(/\\/g, "") + " "; + if (y) { + return t + } + for (var u = 0, v; + (v = r[u]) != null; u++) { + if (v) { + if (x ^ (v.className && (" " + v.className + " ").replace(/[\t\n]/g, " ").indexOf(t) >= 0)) { + if (!s) { + e.push(v) + } + } else { + if (s) { + r[u] = false + } + } + } + } + return false + }, + ID: function(e) { + return e[1].replace(/\\/g, "") + }, + TAG: function(r, e) { + return r[1].toLowerCase() + }, + CHILD: function(e) { + if (e[1] === "nth") { + var r = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2] === "even" && "2n" || e[2] === "odd" && "2n+1" || !/\D/.test(e[2]) && "0n+" + e[2] || e[2]); + e[2] = (r[1] + (r[2] || 1)) - 0; + e[3] = r[3] - 0 + } + e[0] = j++; + return e + }, + ATTR: function(u, r, s, e, v, x) { + var t = u[1].replace(/\\/g, ""); + if (!x && f.attrMap[t]) { + u[1] = f.attrMap[t] + } + if (u[2] === "~=") { + u[4] = " " + u[4] + " " + } + return u + }, + PSEUDO: function(u, r, s, e, v) { + if (u[1] === "not") { + if ((p.exec(u[3]) || "").length > 1 || /^\w/.test(u[3])) { + u[3] = b(u[3], null, null, r) + } else { + var t = b.filter(u[3], r, s, true ^ v); + if (!s) { + e.push.apply(e, t) + } + return false + } + } else { + if (f.match.POS.test(u[0]) || f.match.CHILD.test(u[0])) { + return true + } + } + return u + }, + POS: function(e) { + e.unshift(true); + return e + } + }, + filters: { + enabled: function(e) { + return e.disabled === false && e.type !== "hidden" + }, + disabled: function(e) { + return e.disabled === true + }, + checked: function(e) { + return e.checked === true + }, + selected: function(e) { + e.parentNode.selectedIndex; + return e.selected === true + }, + parent: function(e) { + return !!e.firstChild + }, + empty: function(e) { + return !e.firstChild + }, + has: function(s, r, e) { + return !!b(e[3], s).length + }, + header: function(e) { + return (/h\d/i).test(e.nodeName) + }, + text: function(e) { + return "text" === e.type + }, + radio: function(e) { + return "radio" === e.type + }, + checkbox: function(e) { + return "checkbox" === e.type + }, + file: function(e) { + return "file" === e.type + }, + password: function(e) { + return "password" === e.type + }, + submit: function(e) { + return "submit" === e.type + }, + image: function(e) { + return "image" === e.type + }, + reset: function(e) { + return "reset" === e.type + }, + button: function(e) { + return "button" === e.type || e.nodeName.toLowerCase() === "button" + }, + input: function(e) { + return (/input|select|textarea|button/i).test(e.nodeName) + } + }, + setFilters: { + first: function(r, e) { + return e === 0 + }, + last: function(s, r, e, t) { + return r === t.length - 1 + }, + even: function(r, e) { + return e % 2 === 0 + }, + odd: function(r, e) { + return e % 2 === 1 + }, + lt: function(s, r, e) { + return r < e[3] - 0 + }, + gt: function(s, r, e) { + return r > e[3] - 0 + }, + nth: function(s, r, e) { + return e[3] - 0 === r + }, + eq: function(s, r, e) { + return e[3] - 0 === r + } + }, + filter: { + PSEUDO: function(s, y, x, z) { + var e = y[1], + r = f.filters[e]; + if (r) { + return r(s, x, y, z) + } else { + if (e === "contains") { + return (s.textContent || s.innerText || b.getText([s]) || "").indexOf(y[3]) >= 0 + } else { + if (e === "not") { + var t = y[3]; + for (var v = 0, u = t.length; v < u; v++) { + if (t[v] === s) { + return false + } + } + return true + } else { + b.error("Syntax error, unrecognized expression: " + e) + } + } + } + }, + CHILD: function(e, t) { + var x = t[1], + r = e; + switch (x) { + case "only": + case "first": + while ((r = r.previousSibling)) { + if (r.nodeType === 1) { + return false + } + } + if (x === "first") { + return true + } + r = e; + case "last": + while ((r = r.nextSibling)) { + if (r.nodeType === 1) { + return false + } + } + return true; + case "nth": + var s = t[2], + A = t[3]; + if (s === 1 && A === 0) { + return true + } + var v = t[0], + z = e.parentNode; + if (z && (z.sizcache !== v || !e.nodeIndex)) { + var u = 0; + for (r = z.firstChild; r; r = r.nextSibling) { + if (r.nodeType === 1) { + r.nodeIndex = ++u + } + } + z.sizcache = v + } + var y = e.nodeIndex - A; + if (s === 0) { + return y === 0 + } else { + return (y % s === 0 && y / s >= 0) + } + } + }, + ID: function(r, e) { + return r.nodeType === 1 && r.getAttribute("id") === e + }, + TAG: function(r, e) { + return (e === "*" && r.nodeType === 1) || r.nodeName.toLowerCase() === e + }, + CLASS: function(r, e) { + return (" " + (r.className || r.getAttribute("class")) + " ").indexOf(e) > -1 + }, + ATTR: function(v, t) { + var s = t[1], + e = f.attrHandle[s] ? f.attrHandle[s](v) : v[s] != null ? v[s] : v.getAttribute(s), + x = e + "", + u = t[2], + r = t[4]; + return e == null ? u === "!=" : u === "=" ? x === r : u === "*=" ? x.indexOf(r) >= 0 : u === "~=" ? (" " + x + " ").indexOf(r) >= 0 : !r ? x && e !== false : u === "!=" ? x !== r : u === "^=" ? x.indexOf(r) === 0 : u === "$=" ? x.substr(x.length - r.length) === r : u === "|=" ? x === r || x.substr(0, r.length + 1) === r + "-" : false + }, + POS: function(u, r, s, v) { + var e = r[2], + t = f.setFilters[e]; + if (t) { + return t(u, s, r, v) + } + } + } + }; + var k = f.match.POS, + g = function(r, e) { + return "\\" + (e - 0 + 1) + }; + for (var m in f.match) { + f.match[m] = new RegExp(f.match[m].source + (/(?![^\[]*\])(?![^\(]*\))/.source)); + f.leftMatch[m] = new RegExp(/(^(?:.|\r|\n)*?)/.source + f.match[m].source.replace(/\\(\d+)/g, g)) + } + var a = function(r, e) { + r = Array.prototype.slice.call(r, 0); + if (e) { + e.push.apply(e, r); + return e + } + return r + }; + try { + Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType + } catch (l) { + a = function(u, t) { + var r = t || [], + s = 0; + if (d.call(u) === "[object Array]") { + Array.prototype.push.apply(r, u) + } else { + if (typeof u.length === "number") { + for (var e = u.length; s < e; s++) { + r.push(u[s]) + } + } else { + for (; u[s]; s++) { + r.push(u[s]) + } + } + } + return r + } + } + var c; + if (document.documentElement.compareDocumentPosition) { + c = function(r, e) { + if (!r.compareDocumentPosition || !e.compareDocumentPosition) { + if (r == e) { + o = true + } + return r.compareDocumentPosition ? -1 : 1 + } + var s = r.compareDocumentPosition(e) & 4 ? -1 : r === e ? 0 : 1; + if (s === 0) { + o = true + } + return s + } + } else { + if ("sourceIndex" in document.documentElement) { + c = function(r, e) { + if (!r.sourceIndex || !e.sourceIndex) { + if (r == e) { + o = true + } + return r.sourceIndex ? -1 : 1 + } + var s = r.sourceIndex - e.sourceIndex; + if (s === 0) { + o = true + } + return s + } + } else { + if (document.createRange) { + c = function(t, r) { + if (!t.ownerDocument || !r.ownerDocument) { + if (t == r) { + o = true + } + return t.ownerDocument ? -1 : 1 + } + var s = t.ownerDocument.createRange(), + e = r.ownerDocument.createRange(); + s.setStart(t, 0); + s.setEnd(t, 0); + e.setStart(r, 0); + e.setEnd(r, 0); + var u = s.compareBoundaryPoints(Range.START_TO_END, e); + if (u === 0) { + o = true + } + return u + } + } + } + } + b.getText = function(e) { + var r = "", + t; + for (var s = 0; e[s]; s++) { + t = e[s]; + if (t.nodeType === 3 || t.nodeType === 4) { + r += t.nodeValue + } else { + if (t.nodeType !== 8) { + r += b.getText(t.childNodes) + } + } + } + return r + }; + (function() { + var r = document.createElement("div"), + s = "script" + (new Date()).getTime(); + r.innerHTML = "<a name='" + s + "'/>"; + var e = document.documentElement; + e.insertBefore(r, e.firstChild); + if (document.getElementById(s)) { + f.find.ID = function(u, v, x) { + if (typeof v.getElementById !== "undefined" && !x) { + var t = v.getElementById(u[1]); + return t ? t.id === u[1] || typeof t.getAttributeNode !== "undefined" && t.getAttributeNode("id").nodeValue === u[1] ? [t] : undefined : [] + } + }; + f.filter.ID = function(v, t) { + var u = typeof v.getAttributeNode !== "undefined" && v.getAttributeNode("id"); + return v.nodeType === 1 && u && u.nodeValue === t + } + } + e.removeChild(r); + e = r = null + })(); + (function() { + var e = document.createElement("div"); + e.appendChild(document.createComment("")); + if (e.getElementsByTagName("*").length > 0) { + f.find.TAG = function(r, v) { + var u = v.getElementsByTagName(r[1]); + if (r[1] === "*") { + var t = []; + for (var s = 0; u[s]; s++) { + if (u[s].nodeType === 1) { + t.push(u[s]) + } + } + u = t + } + return u + } + } + e.innerHTML = "<a href='#'></a>"; + if (e.firstChild && typeof e.firstChild.getAttribute !== "undefined" && e.firstChild.getAttribute("href") !== "#") { + f.attrHandle.href = function(r) { + return r.getAttribute("href", 2) + } + } + e = null + })(); + if (document.querySelectorAll) { + (function() { + var e = b, + s = document.createElement("div"); + s.innerHTML = "<p class='TEST'></p>"; + if (s.querySelectorAll && s.querySelectorAll(".TEST").length === 0) { + return + } + b = function(x, v, t, u) { + v = v || document; + if (!u && v.nodeType === 9 && !b.isXML(v)) { + try { + return a(v.querySelectorAll(x), t) + } catch (y) {} + } + return e(x, v, t, u) + }; + for (var r in e) { + b[r] = e[r] + } + s = null + })() + }(function() { + var e = document.createElement("div"); + e.innerHTML = "<div class='test e'></div><div class='test'></div>"; + if (!e.getElementsByClassName || e.getElementsByClassName("e").length === 0) { + return + } + e.lastChild.className = "e"; + if (e.getElementsByClassName("e").length === 1) { + return + } + f.order.splice(1, 0, "CLASS"); + f.find.CLASS = function(r, s, t) { + if (typeof s.getElementsByClassName !== "undefined" && !t) { + return s.getElementsByClassName(r[1]) + } + }; + e = null + })(); + + function n(r, x, v, A, y, z) { + for (var t = 0, s = A.length; t < s; t++) { + var e = A[t]; + if (e) { + e = e[r]; + var u = false; + while (e) { + if (e.sizcache === v) { + u = A[e.sizset]; + break + } + if (e.nodeType === 1 && !z) { + e.sizcache = v; + e.sizset = t + } + if (e.nodeName.toLowerCase() === x) { + u = e; + break + } + e = e[r] + } + A[t] = u + } + } + } + function q(r, x, v, A, y, z) { + for (var t = 0, s = A.length; t < s; t++) { + var e = A[t]; + if (e) { + e = e[r]; + var u = false; + while (e) { + if (e.sizcache === v) { + u = A[e.sizset]; + break + } + if (e.nodeType === 1) { + if (!z) { + e.sizcache = v; + e.sizset = t + } + if (typeof x !== "string") { + if (e === x) { + u = true; + break + } + } else { + if (b.filter(x, [e]).length > 0) { + u = e; + break + } + } + } + e = e[r] + } + A[t] = u + } + } + } + b.contains = document.compareDocumentPosition ? + function(r, e) { + return !!(r.compareDocumentPosition(e) & 16) + } : function(r, e) { + return r !== e && (r.contains ? r.contains(e) : true) + }; + b.isXML = function(e) { + var r = (e ? e.ownerDocument || e : 0).documentElement; + return r ? r.nodeName !== "HTML" : false + }; + var h = function(e, y) { + var t = [], + u = "", + v, s = y.nodeType ? [y] : y; + while ((v = f.match.PSEUDO.exec(e))) { + u += v[0]; + e = e.replace(f.match.PSEUDO, "") + } + e = f.relative[e] ? e + "*" : e; + for (var x = 0, r = s.length; x < r; x++) { + b(e, s[x], t) + } + return b.filter(u, t) + }; + window.tinymce.dom.Sizzle = b +})(); +(function(d) { + var f = d.each, + c = d.DOM, + b = d.isIE, + e = d.isWebKit, + a; + d.create("tinymce.dom.EventUtils", { + EventUtils: function() { + this.inits = []; + this.events = [] + }, + add: function(m, p, l, j) { + var g, h = this, + i = h.events, + k; + if (p instanceof Array) { + k = []; + f(p, function(o) { + k.push(h.add(m, o, l, j)) + }); + return k + } + if (m && m.hasOwnProperty && m instanceof Array) { + k = []; + f(m, function(n) { + n = c.get(n); + k.push(h.add(n, p, l, j)) + }); + return k + } + m = c.get(m); + if (!m) { + return + } + g = function(n) { + if (h.disabled) { + return + } + n = n || window.event; + if (n && b) { + if (!n.target) { + n.target = n.srcElement + } + d.extend(n, h._stoppers) + } + if (!j) { + return l(n) + } + return l.call(j, n) + }; + if (p == "unload") { + d.unloads.unshift({ + func: g + }); + return g + } + if (p == "init") { + if (h.domLoaded) { + g() + } else { + h.inits.push(g) + } + return g + } + i.push({ + obj: m, + name: p, + func: l, + cfunc: g, + scope: j + }); + h._add(m, p, g); + return l + }, + remove: function(l, m, k) { + var h = this, + g = h.events, + i = false, + j; + if (l && l.hasOwnProperty && l instanceof Array) { + j = []; + f(l, function(n) { + n = c.get(n); + j.push(h.remove(n, m, k)) + }); + return j + } + l = c.get(l); + f(g, function(o, n) { + if (o.obj == l && o.name == m && (!k || (o.func == k || o.cfunc == k))) { + g.splice(n, 1); + h._remove(l, m, o.cfunc); + i = true; + return false + } + }); + return i + }, + clear: function(l) { + var j = this, + g = j.events, + h, k; + if (l) { + l = c.get(l); + for (h = g.length - 1; h >= 0; h--) { + k = g[h]; + if (k.obj === l) { + j._remove(k.obj, k.name, k.cfunc); + k.obj = k.cfunc = null; + g.splice(h, 1) + } + } + } + }, + cancel: function(g) { + if (!g) { + return false + } + this.stop(g); + return this.prevent(g) + }, + stop: function(g) { + if (g.stopPropagation) { + g.stopPropagation() + } else { + g.cancelBubble = true + } + return false + }, + prevent: function(g) { + if (g.preventDefault) { + g.preventDefault() + } else { + g.returnValue = false + } + return false + }, + destroy: function() { + var g = this; + f(g.events, function(j, h) { + g._remove(j.obj, j.name, j.cfunc); + j.obj = j.cfunc = null + }); + g.events = []; + g = null + }, + _add: function(h, i, g) { + if (h.attachEvent) { + h.attachEvent("on" + i, g) + } else { + if (h.addEventListener) { + h.addEventListener(i, g, false) + } else { + h["on" + i] = g + } + } + }, + _remove: function(i, j, h) { + if (i) { + try { + if (i.detachEvent) { + i.detachEvent("on" + j, h) + } else { + if (i.removeEventListener) { + i.removeEventListener(j, h, false) + } else { + i["on" + j] = null + } + } + } catch (g) {} + } + }, + _pageInit: function(h) { + var g = this; + if (g.domLoaded) { + return + } + g.domLoaded = true; + f(g.inits, function(i) { + i() + }); + g.inits = [] + }, + _wait: function(i) { + var g = this, + h = i.document; + if (i.tinyMCE_GZ && tinyMCE_GZ.loaded) { + g.domLoaded = 1; + return + } + if (h.attachEvent) { + h.attachEvent("onreadystatechange", function() { + if (h.readyState === "complete") { + h.detachEvent("onreadystatechange", arguments.callee); + g._pageInit(i) + } + }); + if (h.documentElement.doScroll && i == i.top) { + (function() { + if (g.domLoaded) { + return + } + try { + h.documentElement.doScroll("left") + } catch (j) { + setTimeout(arguments.callee, 0); + return + } + g._pageInit(i) + })() + } + } else { + if (h.addEventListener) { + g._add(i, "DOMContentLoaded", function() { + g._pageInit(i) + }) + } + } + g._add(i, "load", function() { + g._pageInit(i) + }) + }, + _stoppers: { + preventDefault: function() { + this.returnValue = false + }, + stopPropagation: function() { + this.cancelBubble = true + } + } + }); + a = d.dom.Event = new d.dom.EventUtils(); + a._wait(window); + d.addUnload(function() { + a.destroy() + }) +})(tinymce); +(function(a) { + a.dom.Element = function(f, d) { + var b = this, + e, c; + b.settings = d = d || {}; + b.id = f; + b.dom = e = d.dom || a.DOM; + if (!a.isIE) { + c = e.get(b.id) + } + a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/), function(g) { + b[g] = function() { + var h = [f], + j; + for (j = 0; j < arguments.length; j++) { + h.push(arguments[j]) + } + h = e[g].apply(e, h); + b.update(g); + return h + } + }); + a.extend(b, { + on: function(i, h, g) { + return a.dom.Event.add(b.id, i, h, g) + }, + getXY: function() { + return { + x: parseInt(b.getStyle("left")), + y: parseInt(b.getStyle("top")) + } + }, + getSize: function() { + var g = e.get(b.id); + return { + w: parseInt(b.getStyle("width") || g.clientWidth), + h: parseInt(b.getStyle("height") || g.clientHeight) + } + }, + moveTo: function(g, h) { + b.setStyles({ + left: g, + top: h + }) + }, + moveBy: function(g, i) { + var h = b.getXY(); + b.moveTo(h.x + g, h.y + i) + }, + resizeTo: function(g, i) { + b.setStyles({ + width: g, + height: i + }) + }, + resizeBy: function(g, j) { + var i = b.getSize(); + b.resizeTo(i.w + g, i.h + j) + }, + update: function(h) { + var g; + if (a.isIE6 && d.blocker) { + h = h || ""; + if (h.indexOf("get") === 0 || h.indexOf("has") === 0 || h.indexOf("is") === 0) { + return + } + if (h == "remove") { + e.remove(b.blocker); + return + } + if (!b.blocker) { + b.blocker = e.uniqueId(); + g = e.add(d.container || e.getRoot(), "iframe", { + id: b.blocker, + style: "position:absolute;", + frameBorder: 0, + src: 'javascript:""' + }); + e.setStyle(g, "opacity", 0) + } else { + g = e.get(b.blocker) + } + e.setStyles(g, { + left: b.getStyle("left", 1), + top: b.getStyle("top", 1), + width: b.getStyle("width", 1), + height: b.getStyle("height", 1), + display: b.getStyle("display", 1), + zIndex: parseInt(b.getStyle("zIndex", 1) || 0) - 1 + }) + } + } + }) + } +})(tinymce); +(function(c) { + function e(f) { + return f.replace(/[\n\r]+/g, "") + } + var b = c.is, + a = c.isIE, + d = c.each; + c.create("tinymce.dom.Selection", { + Selection: function(i, h, g) { + var f = this; + f.dom = i; + f.win = h; + f.serializer = g; + d(["onBeforeSetContent", "onBeforeGetContent", "onSetContent", "onGetContent"], function(j) { + f[j] = new c.util.Dispatcher(f) + }); + if (!f.win.getSelection) { + f.tridentSel = new c.dom.TridentSelection(f) + } + if (c.isIE && i.boxModel) { + this._fixIESelection() + } + c.addUnload(f.destroy, f) + }, + getContent: function(g) { + var f = this, + h = f.getRng(), + l = f.dom.create("body"), + j = f.getSel(), + i, k, m; + g = g || {}; + i = k = ""; + g.get = true; + g.format = g.format || "html"; + f.onBeforeGetContent.dispatch(f, g); + if (g.format == "text") { + return f.isCollapsed() ? "" : (h.text || (j.toString ? j.toString() : "")) + } + if (h.cloneContents) { + m = h.cloneContents(); + if (m) { + l.appendChild(m) + } + } else { + if (b(h.item) || b(h.htmlText)) { + l.innerHTML = h.item ? h.item(0).outerHTML : h.htmlText + } else { + l.innerHTML = h.toString() + } + } + if (/^\s/.test(l.innerHTML)) { + i = " " + } + if (/\s+$/.test(l.innerHTML)) { + k = " " + } + g.getInner = true; + g.content = f.isCollapsed() ? "" : i + f.serializer.serialize(l, g) + k; + f.onGetContent.dispatch(f, g); + return g.content + }, + setContent: function(k, j) { + var h = this, + f = h.getRng(), + i, l = h.win.document, + m, g; + j = j || { + format: "html" + }; + j.set = true; + k = j.content = k; + if (!j.no_events) { + h.onBeforeSetContent.dispatch(h, j) + } + k = j.content; + if (f.insertNode) { + k += '<span id="__caret">_</span>'; + if (f.startContainer == l && f.endContainer == l) { + l.body.innerHTML = k + } else { + f.deleteContents(); + if (l.body.childNodes.length == 0) { + l.body.innerHTML = k + } else { + if (f.createContextualFragment) { + f.insertNode(f.createContextualFragment(k)) + } else { + m = l.createDocumentFragment(); + g = l.createElement("div"); + m.appendChild(g); + g.outerHTML = k; + f.insertNode(m) + } + } + } + i = h.dom.get("__caret"); + f = l.createRange(); + f.setStartBefore(i); + f.setEndBefore(i); + h.setRng(f); + h.dom.remove("__caret"); + h.setRng(f) + } else { + if (f.item) { + l.execCommand("Delete", false, null); + f = h.getRng() + } + f.pasteHTML(k) + } + if (!j.no_events) { + h.onSetContent.dispatch(h, j) + } + }, + getStart: function() { + var g = this.getRng(), + h, f, j, i; + if (g.duplicate || g.item) { + if (g.item) { + return g.item(0) + } + j = g.duplicate(); + j.collapse(1); + h = j.parentElement(); + f = i = g.parentElement(); + while (i = i.parentNode) { + if (i == h) { + h = f; + break + } + } + return h + } else { + h = g.startContainer; + if (h.nodeType == 1 && h.hasChildNodes()) { + h = h.childNodes[Math.min(h.childNodes.length - 1, g.startOffset)] + } + if (h && h.nodeType == 3) { + return h.parentNode + } + return h + } + }, + getEnd: function() { + var g = this, + h = g.getRng(), + i, f; + if (h.duplicate || h.item) { + if (h.item) { + return h.item(0) + } + h = h.duplicate(); + h.collapse(0); + i = h.parentElement(); + if (i && i.nodeName == "BODY") { + return i.lastChild || i + } + return i + } else { + i = h.endContainer; + f = h.endOffset; + if (i.nodeType == 1 && i.hasChildNodes()) { + i = i.childNodes[f > 0 ? f - 1 : f] + } + if (i && i.nodeType == 3) { + return i.parentNode + } + return i + } + }, + getBookmark: function(r, s) { + var v = this, + m = v.dom, + g, j, i, n, h, o, p, l = "\uFEFF", + u; + + function f(x, y) { + var t = 0; + d(m.select(x), function(A, z) { + if (A == y) { + t = z + } + }); + return t + } + if (r == 2) { + function k() { + var x = v.getRng(true), + t = m.getRoot(), + y = {}; + + function z(C, H) { + var B = C[H ? "startContainer" : "endContainer"], + G = C[H ? "startOffset" : "endOffset"], + A = [], + D, F, E = 0; + if (B.nodeType == 3) { + if (s) { + for (D = B.previousSibling; D && D.nodeType == 3; D = D.previousSibling) { + G += D.nodeValue.length + } + } + A.push(G) + } else { + F = B.childNodes; + if (G >= F.length && F.length) { + E = 1; + G = Math.max(0, F.length - 1) + } + A.push(v.dom.nodeIndex(F[G], s) + E) + } + for (; B && B != t; B = B.parentNode) { + A.push(v.dom.nodeIndex(B, s)) + } + return A + } + y.start = z(x, true); + if (!v.isCollapsed()) { + y.end = z(x) + } + return y + } + return k() + } + if (r) { + return { + rng: v.getRng() + } + } + g = v.getRng(); + i = m.uniqueId(); + n = tinyMCE.activeEditor.selection.isCollapsed(); + u = "overflow:hidden;line-height:0px"; + if (g.duplicate || g.item) { + if (!g.item) { + j = g.duplicate(); + try { + g.collapse(); + g.pasteHTML('<span data-mce-type="bookmark" id="' + i + '_start" style="' + u + '">' + l + "</span>"); + if (!n) { + j.collapse(false); + g.moveToElementText(j.parentElement()); + if (g.compareEndPoints("StartToEnd", j) == 0) { + j.move("character", -1) + } + j.pasteHTML('<span data-mce-type="bookmark" id="' + i + '_end" style="' + u + '">' + l + "</span>") + } + } catch (q) { + return null + } + } else { + o = g.item(0); + h = o.nodeName; + return { + name: h, + index: f(h, o) + } + } + } else { + o = v.getNode(); + h = o.nodeName; + if (h == "IMG") { + return { + name: h, + index: f(h, o) + } + } + j = g.cloneRange(); + if (!n) { + j.collapse(false); + j.insertNode(m.create("span", { + "data-mce-type": "bookmark", + id: i + "_end", + style: u + }, l)) + } + g.collapse(true); + g.insertNode(m.create("span", { + "data-mce-type": "bookmark", + id: i + "_start", + style: u + }, l)) + } + v.moveToBookmark({ + id: i, + keep: 1 + }); + return { + id: i + } + }, + moveToBookmark: function(n) { + var r = this, + l = r.dom, + i, h, f, q, j, s, o, p; + if (r.tridentSel) { + r.tridentSel.destroy() + } + if (n) { + if (n.start) { + f = l.createRng(); + q = l.getRoot(); + + function g(z) { + var t = n[z ? "start" : "end"], + v, x, y, u; + if (t) { + y = t[0]; + for (x = q, v = t.length - 1; v >= 1; v--) { + u = x.childNodes; + if (t[v] > u.length - 1) { + return + } + x = u[t[v]] + } + if (x.nodeType === 3) { + y = Math.min(t[0], x.nodeValue.length) + } + if (x.nodeType === 1) { + y = Math.min(t[0], x.childNodes.length) + } + if (z) { + f.setStart(x, y) + } else { + f.setEnd(x, y) + } + } + return true + } + if (g(true) && g()) { + r.setRng(f) + } + } else { + if (n.id) { + function k(A) { + var u = l.get(n.id + "_" + A), + z, t, x, y, v = n.keep; + if (u) { + z = u.parentNode; + if (A == "start") { + if (!v) { + t = l.nodeIndex(u) + } else { + z = u.firstChild; + t = 1 + } + j = s = z; + o = p = t + } else { + if (!v) { + t = l.nodeIndex(u) + } else { + z = u.firstChild; + t = 1 + } + s = z; + p = t + } + if (!v) { + y = u.previousSibling; + x = u.nextSibling; + d(c.grep(u.childNodes), function(B) { + if (B.nodeType == 3) { + B.nodeValue = B.nodeValue.replace(/\uFEFF/g, "") + } + }); + while (u = l.get(n.id + "_" + A)) { + l.remove(u, 1) + } + if (y && x && y.nodeType == x.nodeType && y.nodeType == 3 && !c.isOpera) { + t = y.nodeValue.length; + y.appendData(x.nodeValue); + l.remove(x); + if (A == "start") { + j = s = y; + o = p = t + } else { + s = y; + p = t + } + } + } + } + } + function m(t) { + if (l.isBlock(t) && !t.innerHTML) { + t.innerHTML = !a ? '<br data-mce-bogus="1" />' : " " + } + return t + } + k("start"); + k("end"); + if (j) { + f = l.createRng(); + f.setStart(m(j), o); + f.setEnd(m(s), p); + r.setRng(f) + } + } else { + if (n.name) { + r.select(l.select(n.name)[n.index]) + } else { + if (n.rng) { + r.setRng(n.rng) + } + } + } + } + } + }, + select: function(k, j) { + var i = this, + l = i.dom, + g = l.createRng(), + f; + if (k) { + f = l.nodeIndex(k); + g.setStart(k.parentNode, f); + g.setEnd(k.parentNode, f + 1); + if (j) { + function h(m, o) { + var n = new c.dom.TreeWalker(m, m); + do { + if (m.nodeType == 3 && c.trim(m.nodeValue).length != 0) { + if (o) { + g.setStart(m, 0) + } else { + g.setEnd(m, m.nodeValue.length) + } + return + } + if (m.nodeName == "BR") { + if (o) { + g.setStartBefore(m) + } else { + g.setEndBefore(m) + } + return + } + } while (m = (o ? n.next() : n.prev())) + } + h(k, 1); + h(k) + } + i.setRng(g) + } + return k + }, + isCollapsed: function() { + var f = this, + h = f.getRng(), + g = f.getSel(); + if (!h || h.item) { + return false + } + if (h.compareEndPoints) { + return h.compareEndPoints("StartToEnd", h) === 0 + } + return !g || h.collapsed + }, + collapse: function(f) { + var h = this, + g = h.getRng(), + i; + if (g.item) { + i = g.item(0); + g = h.win.document.body.createTextRange(); + g.moveToElementText(i) + } + g.collapse( !! f); + h.setRng(g) + }, + getSel: function() { + var g = this, + f = this.win; + return f.getSelection ? f.getSelection() : f.document.selection + }, + getRng: function(l) { + var g = this, + h, i, k, j = g.win.document; + if (l && g.tridentSel) { + return g.tridentSel.getRangeAt(0) + } + try { + if (h = g.getSel()) { + i = h.rangeCount > 0 ? h.getRangeAt(0) : (h.createRange ? h.createRange() : j.createRange()) + } + } catch (f) {} + if (c.isIE && i && i.setStart && j.selection.createRange().item) { + k = j.selection.createRange().item(0); + i = j.createRange(); + i.setStartBefore(k); + i.setEndAfter(k) + } + if (!i) { + i = j.createRange ? j.createRange() : j.body.createTextRange() + } + if (g.selectedRange && g.explicitRange) { + if (i.compareBoundaryPoints(i.START_TO_START, g.selectedRange) === 0 && i.compareBoundaryPoints(i.END_TO_END, g.selectedRange) === 0) { + i = g.explicitRange + } else { + g.selectedRange = null; + g.explicitRange = null + } + } + return i + }, + setRng: function(i) { + var h, g = this; + if (!g.tridentSel) { + h = g.getSel(); + if (h) { + g.explicitRange = i; + h.removeAllRanges(); + h.addRange(i); + g.selectedRange = h.getRangeAt(0) + } + } else { + if (i.cloneRange) { + g.tridentSel.addRange(i); + return + } + try { + i.select() + } catch (f) {} + } + }, + setNode: function(g) { + var f = this; + f.setContent(f.dom.getOuterHTML(g)); + return g + }, + getNode: function() { + var h = this, + g = h.getRng(), + i = h.getSel(), + l, k = g.startContainer, + f = g.endContainer; + if (!g) { + return h.dom.getRoot() + } + if (g.setStart) { + l = g.commonAncestorContainer; + if (!g.collapsed) { + if (g.startContainer == g.endContainer) { + if (g.endOffset - g.startOffset < 2) { + if (g.startContainer.hasChildNodes()) { + l = g.startContainer.childNodes[g.startOffset] + } + } + } + if (k.nodeType === 3 && f.nodeType === 3) { + function j(p, m) { + var o = p; + while (p && p.nodeType === 3 && p.length === 0) { + p = m ? p.nextSibling : p.previousSibling + } + return p || o + } + if (k.length === g.startOffset) { + k = j(k.nextSibling, true) + } else { + k = k.parentNode + } + if (g.endOffset === 0) { + f = j(f.previousSibling, false) + } else { + f = f.parentNode + } + if (k && k === f) { + return k + } + } + } + if (l && l.nodeType == 3) { + return l.parentNode + } + return l + } + return g.item ? g.item(0) : g.parentElement() + }, + getSelectedBlocks: function(g, f) { + var i = this, + j = i.dom, + m, h, l, k = []; + m = j.getParent(g || i.getStart(), j.isBlock); + h = j.getParent(f || i.getEnd(), j.isBlock); + if (m) { + k.push(m) + } + if (m && h && m != h) { + l = m; + while ((l = l.nextSibling) && l != h) { + if (j.isBlock(l)) { + k.push(l) + } + } + } + if (h && m != h) { + k.push(h) + } + return k + }, + destroy: function(g) { + var f = this; + f.win = null; + if (f.tridentSel) { + f.tridentSel.destroy() + } + if (!g) { + c.removeUnload(f.destroy) + } + }, + _fixIESelection: function() { + var g = this.dom, + m = g.doc, + h = m.body, + j, n, f; + m.documentElement.unselectable = true; + + function i(o, r) { + var p = h.createTextRange(); + try { + p.moveToPoint(o, r) + } catch (q) { + p = null + } + return p + } + function l(p) { + var o; + if (p.button) { + o = i(p.x, p.y); + if (o) { + if (o.compareEndPoints("StartToStart", n) > 0) { + o.setEndPoint("StartToStart", n) + } else { + o.setEndPoint("EndToEnd", n) + } + o.select() + } + } else { + k() + } + } + function k() { + var o = m.selection.createRange(); + if (n && !o.item && o.compareEndPoints("StartToEnd", o) === 0) { + n.select() + } + g.unbind(m, "mouseup", k); + g.unbind(m, "mousemove", l); + n = j = 0 + } + g.bind(m, ["mousedown", "contextmenu"], function(o) { + if (o.target.nodeName === "HTML") { + if (j) { + k() + } + f = m.documentElement; + if (f.scrollHeight > f.clientHeight) { + return + } + j = 1; + n = i(o.x, o.y); + if (n) { + g.bind(m, "mouseup", k); + g.bind(m, "mousemove", l); + g.win.focus(); + n.select() + } + } + }) + } + }) +})(tinymce); +(function(a) { + a.dom.Serializer = function(e, i, f) { + var h, b, d = a.isIE, + g = a.each, + c; + if (!e.apply_source_formatting) { + e.indent = false + } + e.remove_trailing_brs = true; + i = i || a.DOM; + f = f || new a.html.Schema(e); + e.entity_encoding = e.entity_encoding || "named"; + h = new a.util.Dispatcher(self); + b = new a.util.Dispatcher(self); + c = new a.html.DomParser(e, f); + c.addAttributeFilter("src,href,style", function(k, j) { + var o = k.length, + l, q, n = "data-mce-" + j, + p = e.url_converter, + r = e.url_converter_scope, + m; + while (o--) { + l = k[o]; + q = l.attributes.map[n]; + if (q !== m) { + l.attr(j, q.length > 0 ? q : null); + l.attr(n, null) + } else { + q = l.attributes.map[j]; + if (j === "style") { + q = i.serializeStyle(i.parseStyle(q), l.name) + } else { + if (p) { + q = p.call(r, q, j, l.name) + } + } + l.attr(j, q.length > 0 ? q : null) + } + } + }); + c.addAttributeFilter("class", function(j, k) { + var l = j.length, + m, n; + while (l--) { + m = j[l]; + n = m.attr("class").replace(/\s*mce(Item\w+|Selected)\s*/g, ""); + m.attr("class", n.length > 0 ? n : null) + } + }); + c.addAttributeFilter("data-mce-type", function(j, l, k) { + var m = j.length, + n; + while (m--) { + n = j[m]; + if (n.attributes.map["data-mce-type"] === "bookmark" && !k.cleanup) { + n.remove() + } + } + }); + c.addNodeFilter("script,style", function(k, l) { + var m = k.length, + n, o; + + function j(p) { + return p.replace(/(<!--\[CDATA\[|\]\]-->)/g, "\n").replace(/^[\r\n]*|[\r\n]*$/g, "").replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g, "").replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g, "") + } + while (m--) { + n = k[m]; + o = n.firstChild ? n.firstChild.value : ""; + if (l === "script") { + n.attr("type", (n.attr("type") || "text/javascript").replace(/^mce\-/, "")); + if (o.length > 0) { + n.firstChild.value = "// <![CDATA[\n" + j(o) + "\n// ]]>" + } + } else { + if (o.length > 0) { + n.firstChild.value = "<!--\n" + j(o) + "\n-->" + } + } + } + }); + c.addNodeFilter("#comment", function(j, k) { + var l = j.length, + m; + while (l--) { + m = j[l]; + if (m.value.indexOf("[CDATA[") === 0) { + m.name = "#cdata"; + m.type = 4; + m.value = m.value.replace(/^\[CDATA\[|\]\]$/g, "") + } else { + if (m.value.indexOf("mce:protected ") === 0) { + m.name = "#text"; + m.type = 3; + m.raw = true; + m.value = unescape(m.value).substr(14) + } + } + } + }); + c.addNodeFilter("xml:namespace,input", function(j, k) { + var l = j.length, + m; + while (l--) { + m = j[l]; + if (m.type === 7) { + m.remove() + } else { + if (m.type === 1) { + if (k === "input" && !("type" in m.attributes.map)) { + m.attr("type", "text") + } + } + } + } + }); + if (e.fix_list_elements) { + c.addNodeFilter("ul,ol", function(k, l) { + var m = k.length, + n, j; + while (m--) { + n = k[m]; + j = n.parent; + if (j.name === "ul" || j.name === "ol") { + if (n.prev && n.prev.name === "li") { + n.prev.append(n) + } + } + } + }) + } + c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style", function(j, k) { + var l = j.length; + while (l--) { + j[l].attr(k, null) + } + }); + return { + schema: f, + addNodeFilter: c.addNodeFilter, + addAttributeFilter: c.addAttributeFilter, + onPreProcess: h, + onPostProcess: b, + serialize: function(o, m) { + var l, p, k, j, n; + if (d && i.select("script,style,select").length > 0) { + n = o.innerHTML; + o = o.cloneNode(false); + i.setHTML(o, n) + } else { + o = o.cloneNode(true) + } + l = o.ownerDocument.implementation; + if (l.createHTMLDocument) { + p = l.createHTMLDocument(""); + g(o.nodeName == "BODY" ? o.childNodes : [o], function(q) { + p.body.appendChild(p.importNode(q, true)) + }); + if (o.nodeName != "BODY") { + o = p.body.firstChild + } else { + o = p.body + } + k = i.doc; + i.doc = p + } + m = m || {}; + m.format = m.format || "html"; + if (!m.no_events) { + m.node = o; + h.dispatch(self, m) + } + j = new a.html.Serializer(e, f); + m.content = j.serialize(c.parse(m.getInner ? o.innerHTML : a.trim(i.getOuterHTML(o), m), m)); + if (!m.no_events) { + b.dispatch(self, m) + } + if (k) { + i.doc = k + } + m.node = null; + return m.content + }, + addRules: function(j) { + f.addValidElements(j) + }, + setRules: function(j) { + f.setValidElements(j) + } + } + } +})(tinymce); +(function(a) { + a.dom.ScriptLoader = function(h) { + var c = 0, + k = 1, + i = 2, + l = {}, + j = [], + f = {}, + d = [], + g = 0, + e; + + function b(m, v) { + var x = this, + q = a.DOM, + s, o, r, n; + + function p() { + q.remove(n); + if (s) { + s.onreadystatechange = s.onload = s = null + } + v() + } + function u() { + if (typeof(console) !== "undefined" && console.log) { + console.log("Failed to load: " + m) + } + } + n = q.uniqueId(); + if (a.isIE6) { + o = new a.util.URI(m); + r = location; + if (o.host == r.hostname && o.port == r.port && (o.protocol + ":") == r.protocol && o.protocol.toLowerCase() != "file") { + a.util.XHR.send({ + url: a._addVer(o.getURI()), + success: function(y) { + var t = q.create("script", { + type: "text/javascript" + }); + t.text = y; + document.getElementsByTagName("head")[0].appendChild(t); + q.remove(t); + p() + }, + error: u + }); + return + } + } + s = q.create("script", { + id: n, + type: "text/javascript", + src: a._addVer(m) + }); + if (!a.isIE) { + s.onload = p + } + s.onerror = u; + if (!a.isOpera) { + s.onreadystatechange = function() { + var t = s.readyState; + if (t == "complete" || t == "loaded") { + p() + } + } + }(document.getElementsByTagName("head")[0] || document.body).appendChild(s) + } + this.isDone = function(m) { + return l[m] == i + }; + this.markDone = function(m) { + l[m] = i + }; + this.add = this.load = function(m, q, n) { + var o, p = l[m]; + if (p == e) { + j.push(m); + l[m] = c + } + if (q) { + if (!f[m]) { + f[m] = [] + } + f[m].push({ + func: q, + scope: n || this + }) + } + }; + this.loadQueue = function(n, m) { + this.loadScripts(j, n, m) + }; + this.loadScripts = function(m, q, p) { + var o; + + function n(r) { + a.each(f[r], function(s) { + s.func.call(s.scope) + }); + f[r] = e + } + d.push({ + func: q, + scope: p || this + }); + o = function() { + var r = a.grep(m); + m.length = 0; + a.each(r, function(s) { + if (l[s] == i) { + n(s); + return + } + if (l[s] != k) { + l[s] = k; + g++; + b(s, function() { + l[s] = i; + g--; + n(s); + o() + }) + } + }); + if (!g) { + a.each(d, function(s) { + s.func.call(s.scope) + }); + d.length = 0 + } + }; + o() + } + }; + a.ScriptLoader = new a.dom.ScriptLoader() +})(tinymce); +tinymce.dom.TreeWalker = function(a, c) { + var b = a; + + function d(i, f, e, j) { + var h, g; + if (i) { + if (!j && i[f]) { + return i[f] + } + if (i != c) { + h = i[e]; + if (h) { + return h + } + for (g = i.parentNode; g && g != c; g = g.parentNode) { + h = g[e]; + if (h) { + return h + } + } + } + } + } + this.current = function() { + return b + }; + this.next = function(e) { + return (b = d(b, "firstChild", "nextSibling", e)) + }; + this.prev = function(e) { + return (b = d(b, "lastChild", "previousSibling", e)) + } +}; +(function(a) { + a.dom.RangeUtils = function(c) { + var b = "\uFEFF"; + this.walk = function(d, r) { + var h = d.startContainer, + k = d.startOffset, + s = d.endContainer, + l = d.endOffset, + i, f, n, g, q, p, e; + e = c.select("td.mceSelected,th.mceSelected"); + if (e.length > 0) { + a.each(e, function(t) { + r([t]) + }); + return + } + function o(v, u, t) { + var x = []; + for (; v && v != t; v = v[u]) { + x.push(v) + } + return x + } + function m(u, t) { + do { + if (u.parentNode == t) { + return u + } + u = u.parentNode + } while (u) + } + function j(v, u, x) { + var t = x ? "nextSibling" : "previousSibling"; + for (g = v, q = g.parentNode; g && g != u; g = q) { + q = g.parentNode; + p = o(g == v ? g : g[t], t); + if (p.length) { + if (!x) { + p.reverse() + } + r(p) + } + } + } + if (h.nodeType == 1 && h.hasChildNodes()) { + h = h.childNodes[k] + } + if (s.nodeType == 1 && s.hasChildNodes()) { + s = s.childNodes[Math.min(l - 1, s.childNodes.length - 1)] + } + i = c.findCommonAncestor(h, s); + if (h == s) { + return r([h]) + } + for (g = h; g; g = g.parentNode) { + if (g == s) { + return j(h, i, true) + } + if (g == i) { + break + } + } + for (g = s; g; g = g.parentNode) { + if (g == h) { + return j(s, i) + } + if (g == i) { + break + } + } + f = m(h, i) || h; + n = m(s, i) || s; + j(h, f, true); + p = o(f == h ? f : f.nextSibling, "nextSibling", n == s ? n.nextSibling : n); + if (p.length) { + r(p) + } + j(s, n) + } + }; + a.dom.RangeUtils.compareRanges = function(c, b) { + if (c && b) { + if (c.item || c.duplicate) { + if (c.item && b.item && c.item(0) === b.item(0)) { + return true + } + if (c.isEqual && b.isEqual && b.isEqual(c)) { + return true + } + } else { + return c.startContainer == b.startContainer && c.startOffset == b.startOffset + } + } + return false + } +})(tinymce); +(function(b) { + var a = b.dom.Event, + c = b.each; + b.create("tinymce.ui.KeyboardNavigation", { + KeyboardNavigation: function(e, f) { + var p = this, + m = e.root, + l = e.items, + n = e.enableUpDown, + i = e.enableLeftRight || !e.enableUpDown, + k = e.excludeFromTabOrder, + j, h, o, d, g; + f = f || b.DOM; + j = function(q) { + g = q.target.id + }; + h = function(q) { + f.setAttrib(q.target.id, "tabindex", "-1") + }; + d = function(q) { + var r = f.get(g); + f.setAttrib(r, "tabindex", "0"); + r.focus() + }; + p.focus = function() { + f.get(g).focus() + }; + p.destroy = function() { + c(l, function(q) { + f.unbind(f.get(q.id), "focus", j); + f.unbind(f.get(q.id), "blur", h) + }); + f.unbind(f.get(m), "focus", d); + f.unbind(f.get(m), "keydown", o); + l = f = m = p.focus = j = h = o = d = null; + p.destroy = function() {} + }; + p.moveFocus = function(u, r) { + var q = -1, + t = p.controls, + s; + if (!g) { + return + } + c(l, function(x, v) { + if (x.id === g) { + q = v; + return false + } + }); + q += u; + if (q < 0) { + q = l.length - 1 + } else { + if (q >= l.length) { + q = 0 + } + } + s = l[q]; + f.setAttrib(g, "tabindex", "-1"); + f.setAttrib(s.id, "tabindex", "0"); + f.get(s.id).focus(); + if (e.actOnFocus) { + e.onAction(s.id) + } + if (r) { + a.cancel(r) + } + }; + o = function(y) { + var u = 37, + t = 39, + x = 38, + z = 40, + q = 27, + s = 14, + r = 13, + v = 32; + switch (y.keyCode) { + case u: + if (i) { + p.moveFocus(-1) + } + break; + case t: + if (i) { + p.moveFocus(1) + } + break; + case x: + if (n) { + p.moveFocus(-1) + } + break; + case z: + if (n) { + p.moveFocus(1) + } + break; + case q: + if (e.onCancel) { + e.onCancel(); + a.cancel(y) + } + break; + case s: + case r: + case v: + if (e.onAction) { + e.onAction(g); + a.cancel(y) + } + break + } + }; + c(l, function(s, q) { + var r; + if (!s.id) { + s.id = f.uniqueId("_mce_item_") + } + if (k) { + f.bind(s.id, "blur", h); + r = "-1" + } else { + r = (q === 0 ? "0" : "-1") + } + f.setAttrib(s.id, "tabindex", r); + f.bind(f.get(s.id), "focus", j) + }); + if (l[0]) { + g = l[0].id + } + f.setAttrib(m, "tabindex", "-1"); + f.bind(f.get(m), "focus", d); + f.bind(f.get(m), "keydown", o) + } + }) +})(tinymce); +(function(c) { + var b = c.DOM, + a = c.is; + c.create("tinymce.ui.Control", { + Control: function(f, e, d) { + this.id = f; + this.settings = e = e || {}; + this.rendered = false; + this.onRender = new c.util.Dispatcher(this); + this.classPrefix = ""; + this.scope = e.scope || this; + this.disabled = 0; + this.active = 0; + this.editor = d + }, + setAriaProperty: function(f, e) { + var d = b.get(this.id + "_aria") || b.get(this.id); + if (d) { + b.setAttrib(d, "aria-" + f, !! e) + } + }, + focus: function() { + b.get(this.id).focus() + }, + setDisabled: function(d) { + if (d != this.disabled) { + this.setAriaProperty("disabled", d); + this.setState("Disabled", d); + this.setState("Enabled", !d); + this.disabled = d + } + }, + isDisabled: function() { + return this.disabled + }, + setActive: function(d) { + if (d != this.active) { + this.setState("Active", d); + this.active = d; + this.setAriaProperty("pressed", d) + } + }, + isActive: function() { + return this.active + }, + setState: function(f, d) { + var e = b.get(this.id); + f = this.classPrefix + f; + if (d) { + b.addClass(e, f) + } else { + b.removeClass(e, f) + } + }, + isRendered: function() { + return this.rendered + }, + renderHTML: function() {}, + renderTo: function(d) { + b.setHTML(d, this.renderHTML()) + }, + postRender: function() { + var e = this, + d; + if (a(e.disabled)) { + d = e.disabled; + e.disabled = -1; + e.setDisabled(d) + } + if (a(e.active)) { + d = e.active; + e.active = -1; + e.setActive(d) + } + }, + remove: function() { + b.remove(this.id); + this.destroy() + }, + destroy: function() { + c.dom.Event.clear(this.id) + } + }) +})(tinymce); +tinymce.create("tinymce.ui.Container:tinymce.ui.Control", { + Container: function(c, b, a) { + this.parent(c, b, a); + this.controls = []; + this.lookup = {} + }, + add: function(a) { + this.lookup[a.id] = a; + this.controls.push(a); + return a + }, + get: function(a) { + return this.lookup[a] + } +}); +tinymce.create("tinymce.ui.Separator:tinymce.ui.Control", { + Separator: function(b, a) { + this.parent(b, a); + this.classPrefix = "mceSeparator"; + this.setDisabled(true) + }, + renderHTML: function() { + return tinymce.DOM.createHTML("span", { + "class": this.classPrefix, + role: "separator", + "aria-orientation": "vertical", + tabindex: "-1" + }) + } +}); +(function(d) { + var c = d.is, + b = d.DOM, + e = d.each, + a = d.walk; + d.create("tinymce.ui.MenuItem:tinymce.ui.Control", { + MenuItem: function(g, f) { + this.parent(g, f); + this.classPrefix = "mceMenuItem" + }, + setSelected: function(f) { + this.setState("Selected", f); + this.setAriaProperty("checked", !! f); + this.selected = f + }, + isSelected: function() { + return this.selected + }, + postRender: function() { + var f = this; + f.parent(); + if (c(f.selected)) { + f.setSelected(f.selected) + } + } + }) +})(tinymce); +(function(d) { + var c = d.is, + b = d.DOM, + e = d.each, + a = d.walk; + d.create("tinymce.ui.Menu:tinymce.ui.MenuItem", { + Menu: function(h, g) { + var f = this; + f.parent(h, g); + f.items = {}; + f.collapsed = false; + f.menuCount = 0; + f.onAddItem = new d.util.Dispatcher(this) + }, + expand: function(g) { + var f = this; + if (g) { + a(f, function(h) { + if (h.expand) { + h.expand() + } + }, "items", f) + } + f.collapsed = false + }, + collapse: function(g) { + var f = this; + if (g) { + a(f, function(h) { + if (h.collapse) { + h.collapse() + } + }, "items", f) + } + f.collapsed = true + }, + isCollapsed: function() { + return this.collapsed + }, + add: function(f) { + if (!f.settings) { + f = new d.ui.MenuItem(f.id || b.uniqueId(), f) + } + this.onAddItem.dispatch(this, f); + return this.items[f.id] = f + }, + addSeparator: function() { + return this.add({ + separator: true + }) + }, + addMenu: function(f) { + if (!f.collapse) { + f = this.createMenu(f) + } + this.menuCount++; + return this.add(f) + }, + hasMenus: function() { + return this.menuCount !== 0 + }, + remove: function(f) { + delete this.items[f.id] + }, + removeAll: function() { + var f = this; + a(f, function(g) { + if (g.removeAll) { + g.removeAll() + } else { + g.remove() + } + g.destroy() + }, "items", f); + f.items = {} + }, + createMenu: function(g) { + var f = new d.ui.Menu(g.id || b.uniqueId(), g); + f.onAddItem.add(this.onAddItem.dispatch, this.onAddItem); + return f + } + }) +})(tinymce); +(function(e) { + var d = e.is, + c = e.DOM, + f = e.each, + a = e.dom.Event, + b = e.dom.Element; + e.create("tinymce.ui.DropMenu:tinymce.ui.Menu", { + DropMenu: function(h, g) { + g = g || {}; + g.container = g.container || c.doc.body; + g.offset_x = g.offset_x || 0; + g.offset_y = g.offset_y || 0; + g.vp_offset_x = g.vp_offset_x || 0; + g.vp_offset_y = g.vp_offset_y || 0; + if (d(g.icons) && !g.icons) { + g["class"] += " mceNoIcons" + } + this.parent(h, g); + this.onShowMenu = new e.util.Dispatcher(this); + this.onHideMenu = new e.util.Dispatcher(this); + this.classPrefix = "mceMenu" + }, + createMenu: function(j) { + var h = this, + i = h.settings, + g; + j.container = j.container || i.container; + j.parent = h; + j.constrain = j.constrain || i.constrain; + j["class"] = j["class"] || i["class"]; + j.vp_offset_x = j.vp_offset_x || i.vp_offset_x; + j.vp_offset_y = j.vp_offset_y || i.vp_offset_y; + j.keyboard_focus = i.keyboard_focus; + g = new e.ui.DropMenu(j.id || c.uniqueId(), j); + g.onAddItem.add(h.onAddItem.dispatch, h.onAddItem); + return g + }, + focus: function() { + var g = this; + if (g.keyboardNav) { + g.keyboardNav.focus() + } + }, + update: function() { + var i = this, + j = i.settings, + g = c.get("menu_" + i.id + "_tbl"), + l = c.get("menu_" + i.id + "_co"), + h, k; + h = j.max_width ? Math.min(g.clientWidth, j.max_width) : g.clientWidth; + k = j.max_height ? Math.min(g.clientHeight, j.max_height) : g.clientHeight; + if (!c.boxModel) { + i.element.setStyles({ + width: h + 2, + height: k + 2 + }) + } else { + i.element.setStyles({ + width: h, + height: k + }) + } + if (j.max_width) { + c.setStyle(l, "width", h) + } + if (j.max_height) { + c.setStyle(l, "height", k); + if (g.clientHeight < j.max_height) { + c.setStyle(l, "overflow", "hidden") + } + } + }, + showMenu: function(p, n, r) { + var z = this, + A = z.settings, + o, g = c.getViewPort(), + u, l, v, q, i = 2, + k, j, m = z.classPrefix; + z.collapse(1); + if (z.isMenuVisible) { + return + } + if (!z.rendered) { + o = c.add(z.settings.container, z.renderNode()); + f(z.items, function(h) { + h.postRender() + }); + z.element = new b("menu_" + z.id, { + blocker: 1, + container: A.container + }) + } else { + o = c.get("menu_" + z.id) + } + if (!e.isOpera) { + c.setStyles(o, { + left: -65535, + top: -65535 + }) + } + c.show(o); + z.update(); + p += A.offset_x || 0; + n += A.offset_y || 0; + g.w -= 4; + g.h -= 4; + if (A.constrain) { + u = o.clientWidth - i; + l = o.clientHeight - i; + v = g.x + g.w; + q = g.y + g.h; + if ((p + A.vp_offset_x + u) > v) { + p = r ? r - u : Math.max(0, (v - A.vp_offset_x) - u) + } + if ((n + A.vp_offset_y + l) > q) { + n = Math.max(0, (q - A.vp_offset_y) - l) + } + } + c.setStyles(o, { + left: p, + top: n + }); + z.element.update(); + z.isMenuVisible = 1; + z.mouseClickFunc = a.add(o, "click", function(s) { + var h; + s = s.target; + if (s && (s = c.getParent(s, "tr")) && !c.hasClass(s, m + "ItemSub")) { + h = z.items[s.id]; + if (h.isDisabled()) { + return + } + k = z; + while (k) { + if (k.hideMenu) { + k.hideMenu() + } + k = k.settings.parent + } + if (h.settings.onclick) { + h.settings.onclick(s) + } + return a.cancel(s) + } + }); + if (z.hasMenus()) { + z.mouseOverFunc = a.add(o, "mouseover", function(x) { + var h, t, s; + x = x.target; + if (x && (x = c.getParent(x, "tr"))) { + h = z.items[x.id]; + if (z.lastMenu) { + z.lastMenu.collapse(1) + } + if (h.isDisabled()) { + return + } + if (x && c.hasClass(x, m + "ItemSub")) { + t = c.getRect(x); + h.showMenu((t.x + t.w - i), t.y - i, t.x); + z.lastMenu = h; + c.addClass(c.get(h.id).firstChild, m + "ItemActive") + } + } + }) + } + a.add(o, "keydown", z._keyHandler, z); + z.onShowMenu.dispatch(z); + if (A.keyboard_focus) { + z._setupKeyboardNav() + } + }, + hideMenu: function(j) { + var g = this, + i = c.get("menu_" + g.id), + h; + if (!g.isMenuVisible) { + return + } + if (g.keyboardNav) { + g.keyboardNav.destroy() + } + a.remove(i, "mouseover", g.mouseOverFunc); + a.remove(i, "click", g.mouseClickFunc); + a.remove(i, "keydown", g._keyHandler); + c.hide(i); + g.isMenuVisible = 0; + if (!j) { + g.collapse(1) + } + if (g.element) { + g.element.hide() + } + if (h = c.get(g.id)) { + c.removeClass(h.firstChild, g.classPrefix + "ItemActive") + } + g.onHideMenu.dispatch(g) + }, + add: function(i) { + var g = this, + h; + i = g.parent(i); + if (g.isRendered && (h = c.get("menu_" + g.id))) { + g._add(c.select("tbody", h)[0], i) + } + return i + }, + collapse: function(g) { + this.parent(g); + this.hideMenu(1) + }, + remove: function(g) { + c.remove(g.id); + this.destroy(); + return this.parent(g) + }, + destroy: function() { + var g = this, + h = c.get("menu_" + g.id); + if (g.keyboardNav) { + g.keyboardNav.destroy() + } + a.remove(h, "mouseover", g.mouseOverFunc); + a.remove(c.select("a", h), "focus", g.mouseOverFunc); + a.remove(h, "click", g.mouseClickFunc); + a.remove(h, "keydown", g._keyHandler); + if (g.element) { + g.element.remove() + } + c.remove(h) + }, + renderNode: function() { + var i = this, + j = i.settings, + l, h, k, g; + g = c.create("div", { + role: "listbox", + id: "menu_" + i.id, + "class": j["class"], + style: "position:absolute;left:0;top:0;z-index:200000;outline:0" + }); + if (i.settings.parent) { + c.setAttrib(g, "aria-parent", "menu_" + i.settings.parent.id) + } + k = c.add(g, "div", { + role: "presentation", + id: "menu_" + i.id + "_co", + "class": i.classPrefix + (j["class"] ? " " + j["class"] : "") + }); + i.element = new b("menu_" + i.id, { + blocker: 1, + container: j.container + }); + if (j.menu_line) { + c.add(k, "span", { + "class": i.classPrefix + "Line" + }) + } + l = c.add(k, "table", { + role: "presentation", + id: "menu_" + i.id + "_tbl", + border: 0, + cellPadding: 0, + cellSpacing: 0 + }); + h = c.add(l, "tbody"); + f(i.items, function(m) { + i._add(h, m) + }); + i.rendered = true; + return g + }, + _setupKeyboardNav: function() { + var i, h, g = this; + i = c.select("#menu_" + g.id)[0]; + h = c.select("a[role=option]", "menu_" + g.id); + h.splice(0, 0, i); + g.keyboardNav = new e.ui.KeyboardNavigation({ + root: "menu_" + g.id, + items: h, + onCancel: function() { + g.hideMenu() + }, + enableUpDown: true + }); + i.focus() + }, + _keyHandler: function(g) { + var h = this, + i; + switch (g.keyCode) { + case 37: + if (h.settings.parent) { + h.hideMenu(); + h.settings.parent.focus(); + a.cancel(g) + } + break; + case 39: + if (h.mouseOverFunc) { + h.mouseOverFunc(g) + } + break + } + }, + _add: function(j, h) { + var i, q = h.settings, + p, l, k, m = this.classPrefix, + g; + if (q.separator) { + l = c.add(j, "tr", { + id: h.id, + "class": m + "ItemSeparator" + }); + c.add(l, "td", { + "class": m + "ItemSeparator" + }); + if (i = l.previousSibling) { + c.addClass(i, "mceLast") + } + return + } + i = l = c.add(j, "tr", { + id: h.id, + "class": m + "Item " + m + "ItemEnabled" + }); + i = k = c.add(i, q.titleItem ? "th" : "td"); + i = p = c.add(i, "a", { + id: h.id + "_aria", + role: q.titleItem ? "presentation" : "option", + href: "javascript:;", + onclick: "return false;", + onmousedown: "return false;" + }); + if (q.parent) { + c.setAttrib(p, "aria-haspopup", "true"); + c.setAttrib(p, "aria-owns", "menu_" + h.id) + } + c.addClass(k, q["class"]); + g = c.add(i, "span", { + "class": "mceIcon" + (q.icon ? " mce_" + q.icon : "") + }); + if (q.icon_src) { + c.add(g, "img", { + src: q.icon_src + }) + } + i = c.add(i, q.element || "span", { + "class": "mceText", + title: h.settings.title + }, h.settings.title); + if (h.settings.style) { + c.setAttrib(i, "style", h.settings.style) + } + if (j.childNodes.length == 1) { + c.addClass(l, "mceFirst") + } + if ((i = l.previousSibling) && c.hasClass(i, m + "ItemSeparator")) { + c.addClass(l, "mceFirst") + } + if (h.collapse) { + c.addClass(l, m + "ItemSub") + } + if (i = l.previousSibling) { + c.removeClass(i, "mceLast") + } + c.addClass(l, "mceLast") + } + }) +})(tinymce); +(function(b) { + var a = b.DOM; + b.create("tinymce.ui.Button:tinymce.ui.Control", { + Button: function(e, d, c) { + this.parent(e, d, c); + this.classPrefix = "mceButton" + }, + renderHTML: function() { + var f = this.classPrefix, + e = this.settings, + d, c; + c = a.encode(e.label || ""); + d = '<a role="button" id="' + this.id + '" href="javascript:;" class="' + f + " " + f + "Enabled " + e["class"] + (c ? " " + f + "Labeled" : "") + '" onmousedown="return false;" onclick="return false;" aria-labelledby="' + this.id + '_voice" title="' + a.encode(e.title) + '">'; + if (e.image) { + d += '<img class="mceIcon" src="' + e.image + '" alt="' + a.encode(e.title) + '" />' + c + } else { + d += '<span class="mceIcon ' + e["class"] + '"></span>' + (c ? '<span class="' + f + 'Label">' + c + "</span>" : "") + } + d += '<span class="mceVoiceLabel mceIconOnly" style="display: none;" id="' + this.id + '_voice">' + e.title + "</span>"; + d += "</a>"; + return d + }, + postRender: function() { + var c = this, + d = c.settings; + b.dom.Event.add(c.id, "click", function(f) { + if (!c.isDisabled()) { + return d.onclick.call(d.scope, f) + } + }) + } + }) +})(tinymce); +(function(d) { + var c = d.DOM, + b = d.dom.Event, + e = d.each, + a = d.util.Dispatcher; + d.create("tinymce.ui.ListBox:tinymce.ui.Control", { + ListBox: function(i, h, f) { + var g = this; + g.parent(i, h, f); + g.items = []; + g.onChange = new a(g); + g.onPostRender = new a(g); + g.onAdd = new a(g); + g.onRenderMenu = new d.util.Dispatcher(this); + g.classPrefix = "mceListBox" + }, + select: function(h) { + var g = this, + j, i; + if (h == undefined) { + return g.selectByIndex(-1) + } + if (h && h.call) { + i = h + } else { + i = function(f) { + return f == h + } + } + if (h != g.selectedValue) { + e(g.items, function(k, f) { + if (i(k.value)) { + j = 1; + g.selectByIndex(f); + return false + } + }); + if (!j) { + g.selectByIndex(-1) + } + } + }, + selectByIndex: function(f) { + var g = this, + h, i; + if (f != g.selectedIndex) { + h = c.get(g.id + "_text"); + i = g.items[f]; + if (i) { + g.selectedValue = i.value; + g.selectedIndex = f; + c.setHTML(h, c.encode(i.title)); + c.removeClass(h, "mceTitle"); + c.setAttrib(g.id, "aria-valuenow", i.title) + } else { + c.setHTML(h, c.encode(g.settings.title)); + c.addClass(h, "mceTitle"); + g.selectedValue = g.selectedIndex = null; + c.setAttrib(g.id, "aria-valuenow", g.settings.title) + } + h = 0 + } + }, + add: function(i, f, h) { + var g = this; + h = h || {}; + h = d.extend(h, { + title: i, + value: f + }); + g.items.push(h); + g.onAdd.dispatch(g, h) + }, + getLength: function() { + return this.items.length + }, + renderHTML: function() { + var i = "", + f = this, + g = f.settings, + j = f.classPrefix; + i = '<span role="button" aria-haspopup="true" aria-labelledby="' + f.id + '_text" aria-describedby="' + f.id + '_voiceDesc"><table role="presentation" tabindex="0" id="' + f.id + '" cellpadding="0" cellspacing="0" class="' + j + " " + j + "Enabled" + (g["class"] ? (" " + g["class"]) : "") + '"><tbody><tr>'; + i += "<td>" + c.createHTML("span", { + id: f.id + "_voiceDesc", + "class": "voiceLabel", + style: "display:none;" + }, f.settings.title); + i += c.createHTML("a", { + id: f.id + "_text", + tabindex: -1, + href: "javascript:;", + "class": "mceText", + onclick: "return false;", + onmousedown: "return false;" + }, c.encode(f.settings.title)) + "</td>"; + i += "<td>" + c.createHTML("a", { + id: f.id + "_open", + tabindex: -1, + href: "javascript:;", + "class": "mceOpen", + onclick: "return false;", + onmousedown: "return false;" + }, '<span><span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>') + "</td>"; + i += "</tr></tbody></table></span>"; + return i + }, + showMenu: function() { + var g = this, + j, i, h = c.get(this.id), + f; + if (g.isDisabled() || g.items.length == 0) { + return + } + if (g.menu && g.menu.isMenuVisible) { + return g.hideMenu() + } + if (!g.isMenuRendered) { + g.renderMenu(); + g.isMenuRendered = true + } + j = c.getPos(this.settings.menu_container); + i = c.getPos(h); + f = g.menu; + f.settings.offset_x = i.x; + f.settings.offset_y = i.y; + f.settings.keyboard_focus = !d.isOpera; + if (g.oldID) { + f.items[g.oldID].setSelected(0) + } + e(g.items, function(k) { + if (k.value === g.selectedValue) { + f.items[k.id].setSelected(1); + g.oldID = k.id + } + }); + f.showMenu(0, h.clientHeight); + b.add(c.doc, "mousedown", g.hideMenu, g); + c.addClass(g.id, g.classPrefix + "Selected") + }, + hideMenu: function(g) { + var f = this; + if (f.menu && f.menu.isMenuVisible) { + c.removeClass(f.id, f.classPrefix + "Selected"); + if (g && g.type == "mousedown" && (g.target.id == f.id + "_text" || g.target.id == f.id + "_open")) { + return + } + if (!g || !c.getParent(g.target, ".mceMenu")) { + c.removeClass(f.id, f.classPrefix + "Selected"); + b.remove(c.doc, "mousedown", f.hideMenu, f); + f.menu.hideMenu() + } + } + }, + renderMenu: function() { + var g = this, + f; + f = g.settings.control_manager.createDropMenu(g.id + "_menu", { + menu_line: 1, + "class": g.classPrefix + "Menu mceNoIcons", + max_width: 150, + max_height: 150 + }); + f.onHideMenu.add(function() { + g.hideMenu(); + g.focus() + }); + f.add({ + title: g.settings.title, + "class": "mceMenuItemTitle", + onclick: function() { + if (g.settings.onselect("") !== false) { + g.select("") + } + } + }); + e(g.items, function(h) { + if (h.value === undefined) { + f.add({ + title: h.title, + "class": "mceMenuItemTitle", + onclick: function() { + if (g.settings.onselect("") !== false) { + g.select("") + } + } + }) + } else { + h.id = c.uniqueId(); + h.onclick = function() { + if (g.settings.onselect(h.value) !== false) { + g.select(h.value) + } + }; + f.add(h) + } + }); + g.onRenderMenu.dispatch(g, f); + g.menu = f + }, + postRender: function() { + var f = this, + g = f.classPrefix; + b.add(f.id, "click", f.showMenu, f); + b.add(f.id, "keydown", function(h) { + if (h.keyCode == 32) { + f.showMenu(h); + b.cancel(h) + } + }); + b.add(f.id, "focus", function() { + if (!f._focused) { + f.keyDownHandler = b.add(f.id, "keydown", function(h) { + if (h.keyCode == 40) { + f.showMenu(); + b.cancel(h) + } + }); + f.keyPressHandler = b.add(f.id, "keypress", function(i) { + var h; + if (i.keyCode == 13) { + h = f.selectedValue; + f.selectedValue = null; + b.cancel(i); + f.settings.onselect(h) + } + }) + } + f._focused = 1 + }); + b.add(f.id, "blur", function() { + b.remove(f.id, "keydown", f.keyDownHandler); + b.remove(f.id, "keypress", f.keyPressHandler); + f._focused = 0 + }); + if (d.isIE6 || !c.boxModel) { + b.add(f.id, "mouseover", function() { + if (!c.hasClass(f.id, g + "Disabled")) { + c.addClass(f.id, g + "Hover") + } + }); + b.add(f.id, "mouseout", function() { + if (!c.hasClass(f.id, g + "Disabled")) { + c.removeClass(f.id, g + "Hover") + } + }) + } + f.onPostRender.dispatch(f, c.get(f.id)) + }, + destroy: function() { + this.parent(); + b.clear(this.id + "_text"); + b.clear(this.id + "_open") + } + }) +})(tinymce); +(function(d) { + var c = d.DOM, + b = d.dom.Event, + e = d.each, + a = d.util.Dispatcher; + d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox", { + NativeListBox: function(g, f) { + this.parent(g, f); + this.classPrefix = "mceNativeListBox" + }, + setDisabled: function(f) { + c.get(this.id).disabled = f; + this.setAriaProperty("disabled", f) + }, + isDisabled: function() { + return c.get(this.id).disabled + }, + select: function(h) { + var g = this, + j, i; + if (h == undefined) { + return g.selectByIndex(-1) + } + if (h && h.call) { + i = h + } else { + i = function(f) { + return f == h + } + } + if (h != g.selectedValue) { + e(g.items, function(k, f) { + if (i(k.value)) { + j = 1; + g.selectByIndex(f); + return false + } + }); + if (!j) { + g.selectByIndex(-1) + } + } + }, + selectByIndex: function(f) { + c.get(this.id).selectedIndex = f + 1; + this.selectedValue = this.items[f] ? this.items[f].value : null + }, + add: function(j, g, f) { + var i, h = this; + f = f || {}; + f.value = g; + if (h.isRendered()) { + c.add(c.get(this.id), "option", f, j) + } + i = { + title: j, + value: g, + attribs: f + }; + h.items.push(i); + h.onAdd.dispatch(h, i) + }, + getLength: function() { + return this.items.length + }, + renderHTML: function() { + var g, f = this; + g = c.createHTML("option", { + value: "" + }, "-- " + f.settings.title + " --"); + e(f.items, function(h) { + g += c.createHTML("option", { + value: h.value + }, h.title) + }); + g = c.createHTML("select", { + id: f.id, + "class": "mceNativeListBox", + "aria-labelledby": f.id + "_aria" + }, g); + g += c.createHTML("span", { + id: f.id + "_aria", + style: "display: none" + }, f.settings.title); + return g + }, + postRender: function() { + var g = this, + h, i = true; + g.rendered = true; + + function f(k) { + var j = g.items[k.target.selectedIndex - 1]; + if (j && (j = j.value)) { + g.onChange.dispatch(g, j); + if (g.settings.onselect) { + g.settings.onselect(j) + } + } + } + b.add(g.id, "change", f); + b.add(g.id, "keydown", function(k) { + var j; + b.remove(g.id, "change", h); + i = false; + j = b.add(g.id, "blur", function() { + if (i) { + return + } + i = true; + b.add(g.id, "change", f); + b.remove(g.id, "blur", j) + }); + if (k.keyCode == 13 || k.keyCode == 32) { + f(k); + return b.cancel(k) + } + }); + g.onPostRender.dispatch(g, c.get(g.id)) + } + }) +})(tinymce); +(function(c) { + var b = c.DOM, + a = c.dom.Event, + d = c.each; + c.create("tinymce.ui.MenuButton:tinymce.ui.Button", { + MenuButton: function(g, f, e) { + this.parent(g, f, e); + this.onRenderMenu = new c.util.Dispatcher(this); + f.menu_container = f.menu_container || b.doc.body + }, + showMenu: function() { + var g = this, + j, i, h = b.get(g.id), + f; + if (g.isDisabled()) { + return + } + if (!g.isMenuRendered) { + g.renderMenu(); + g.isMenuRendered = true + } + if (g.isMenuVisible) { + return g.hideMenu() + } + j = b.getPos(g.settings.menu_container); + i = b.getPos(h); + f = g.menu; + f.settings.offset_x = i.x; + f.settings.offset_y = i.y; + f.settings.vp_offset_x = i.x; + f.settings.vp_offset_y = i.y; + f.settings.keyboard_focus = g._focused; + f.showMenu(0, h.clientHeight); + a.add(b.doc, "mousedown", g.hideMenu, g); + g.setState("Selected", 1); + g.isMenuVisible = 1 + }, + renderMenu: function() { + var f = this, + e; + e = f.settings.control_manager.createDropMenu(f.id + "_menu", { + menu_line: 1, + "class": this.classPrefix + "Menu", + icons: f.settings.icons + }); + e.onHideMenu.add(function() { + f.hideMenu(); + f.focus() + }); + f.onRenderMenu.dispatch(f, e); + f.menu = e + }, + hideMenu: function(g) { + var f = this; + if (g && g.type == "mousedown" && b.getParent(g.target, function(h) { + return h.id === f.id || h.id === f.id + "_open" + })) { + return + } + if (!g || !b.getParent(g.target, ".mceMenu")) { + f.setState("Selected", 0); + a.remove(b.doc, "mousedown", f.hideMenu, f); + if (f.menu) { + f.menu.hideMenu() + } + } + f.isMenuVisible = 0 + }, + postRender: function() { + var e = this, + f = e.settings; + a.add(e.id, "click", function() { + if (!e.isDisabled()) { + if (f.onclick) { + f.onclick(e.value) + } + e.showMenu() + } + }) + } + }) +})(tinymce); +(function(c) { + var b = c.DOM, + a = c.dom.Event, + d = c.each; + c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton", { + SplitButton: function(g, f, e) { + this.parent(g, f, e); + this.classPrefix = "mceSplitButton" + }, + renderHTML: function() { + var i, f = this, + g = f.settings, + e; + i = "<tbody><tr>"; + if (g.image) { + e = b.createHTML("img ", { + src: g.image, + role: "presentation", + "class": "mceAction " + g["class"] + }) + } else { + e = b.createHTML("span", { + "class": "mceAction " + g["class"] + }, "") + } + e += b.createHTML("span", { + "class": "mceVoiceLabel mceIconOnly", + id: f.id + "_voice", + style: "display:none;" + }, g.title); + i += "<td >" + b.createHTML("a", { + role: "button", + id: f.id + "_action", + tabindex: "-1", + href: "javascript:;", + "class": "mceAction " + g["class"], + onclick: "return false;", + onmousedown: "return false;", + title: g.title + }, e) + "</td>"; + e = b.createHTML("span", { + "class": "mceOpen " + g["class"] + }, '<span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span>'); + i += "<td >" + b.createHTML("a", { + role: "button", + id: f.id + "_open", + tabindex: "-1", + href: "javascript:;", + "class": "mceOpen " + g["class"], + onclick: "return false;", + onmousedown: "return false;", + title: g.title + }, e) + "</td>"; + i += "</tr></tbody>"; + i = b.createHTML("table", { + id: f.id, + role: "presentation", + tabindex: "0", + "class": "mceSplitButton mceSplitButtonEnabled " + g["class"], + cellpadding: "0", + cellspacing: "0", + title: g.title + }, i); + return b.createHTML("span", { + role: "button", + "aria-labelledby": f.id + "_voice", + "aria-haspopup": "true" + }, i) + }, + postRender: function() { + var e = this, + g = e.settings, + f; + if (g.onclick) { + f = function(h) { + if (!e.isDisabled()) { + g.onclick(e.value); + a.cancel(h) + } + }; + a.add(e.id + "_action", "click", f); + a.add(e.id, ["click", "keydown"], function(h) { + var k = 32, + m = 14, + i = 13, + j = 38, + l = 40; + if ((h.keyCode === 32 || h.keyCode === 13 || h.keyCode === 14) && !h.altKey && !h.ctrlKey && !h.metaKey) { + f(); + a.cancel(h) + } else { + if (h.type === "click" || h.keyCode === l) { + e.showMenu(); + a.cancel(h) + } + } + }) + } + a.add(e.id + "_open", "click", function(h) { + e.showMenu(); + a.cancel(h) + }); + a.add([e.id, e.id + "_open"], "focus", function() { + e._focused = 1 + }); + a.add([e.id, e.id + "_open"], "blur", function() { + e._focused = 0 + }); + if (c.isIE6 || !b.boxModel) { + a.add(e.id, "mouseover", function() { + if (!b.hasClass(e.id, "mceSplitButtonDisabled")) { + b.addClass(e.id, "mceSplitButtonHover") + } + }); + a.add(e.id, "mouseout", function() { + if (!b.hasClass(e.id, "mceSplitButtonDisabled")) { + b.removeClass(e.id, "mceSplitButtonHover") + } + }) + } + }, + destroy: function() { + this.parent(); + a.clear(this.id + "_action"); + a.clear(this.id + "_open"); + a.clear(this.id) + } + }) +})(tinymce); +(function(d) { + var c = d.DOM, + a = d.dom.Event, + b = d.is, + e = d.each; + d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton", { + ColorSplitButton: function(i, h, f) { + var g = this; + g.parent(i, h, f); + g.settings = h = d.extend({ + colors: "000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF", + grid_width: 8, + default_color: "#888888" + }, g.settings); + g.onShowMenu = new d.util.Dispatcher(g); + g.onHideMenu = new d.util.Dispatcher(g); + g.value = h.default_color + }, + showMenu: function() { + var f = this, + g, j, i, h; + if (f.isDisabled()) { + return + } + if (!f.isMenuRendered) { + f.renderMenu(); + f.isMenuRendered = true + } + if (f.isMenuVisible) { + return f.hideMenu() + } + i = c.get(f.id); + c.show(f.id + "_menu"); + c.addClass(i, "mceSplitButtonSelected"); + h = c.getPos(i); + c.setStyles(f.id + "_menu", { + left: h.x, + top: h.y + i.clientHeight, + zIndex: 200000 + }); + i = 0; + a.add(c.doc, "mousedown", f.hideMenu, f); + f.onShowMenu.dispatch(f); + if (f._focused) { + f._keyHandler = a.add(f.id + "_menu", "keydown", function(k) { + if (k.keyCode == 27) { + f.hideMenu() + } + }); + c.select("a", f.id + "_menu")[0].focus() + } + f.isMenuVisible = 1 + }, + hideMenu: function(g) { + var f = this; + if (g && g.type == "mousedown" && c.getParent(g.target, function(h) { + return h.id === f.id + "_open" + })) { + return + } + if (!g || !c.getParent(g.target, ".mceSplitButtonMenu")) { + c.removeClass(f.id, "mceSplitButtonSelected"); + a.remove(c.doc, "mousedown", f.hideMenu, f); + a.remove(f.id + "_menu", "keydown", f._keyHandler); + c.hide(f.id + "_menu") + } + f.onHideMenu.dispatch(f); + f.isMenuVisible = 0; + f.editor.focus() + }, + renderMenu: function() { + var p = this, + h, k = 0, + q = p.settings, + g, j, l, o, f; + o = c.add(q.menu_container, "div", { + role: "listbox", + id: p.id + "_menu", + "class": q.menu_class + " " + q["class"], + style: "position:absolute;left:0;top:-1000px;" + }); + h = c.add(o, "div", { + "class": q["class"] + " mceSplitButtonMenu" + }); + c.add(h, "span", { + "class": "mceMenuLine" + }); + g = c.add(h, "table", { + role: "presentation", + "class": "mceColorSplitMenu" + }); + j = c.add(g, "tbody"); + k = 0; + e(b(q.colors, "array") ? q.colors : q.colors.split(","), function(i) { + i = i.replace(/^#/, ""); + if (!k--) { + l = c.add(j, "tr"); + k = q.grid_width - 1 + } + g = c.add(l, "td"); + g = c.add(g, "a", { + role: "option", + href: "javascript:;", + style: { + backgroundColor: "#" + i + }, + title: p.editor.getLang("colors." + i, i), + "data-mce-color": "#" + i + }); + if (p.editor.forcedHighContrastMode) { + g = c.add(g, "canvas", { + width: 16, + height: 16, + "aria-hidden": "true" + }); + if (g.getContext && (f = g.getContext("2d"))) { + f.fillStyle = "#" + i; + f.fillRect(0, 0, 16, 16) + } else { + c.remove(g) + } + } + }); + if (q.more_colors_func) { + g = c.add(j, "tr"); + g = c.add(g, "td", { + colspan: q.grid_width, + "class": "mceMoreColors" + }); + g = c.add(g, "a", { + role: "option", + id: p.id + "_more", + href: "javascript:;", + onclick: "return false;", + "class": "mceMoreColors" + }, q.more_colors_title); + a.add(g, "click", function(i) { + q.more_colors_func.call(q.more_colors_scope || this); + return a.cancel(i) + }) + } + c.addClass(h, "mceColorSplitMenu"); + new d.ui.KeyboardNavigation({ + root: p.id + "_menu", + items: c.select("a", p.id + "_menu"), + onCancel: function() { + p.hideMenu(); + p.focus() + } + }); + a.add(p.id + "_menu", "mousedown", function(i) { + return a.cancel(i) + }); + a.add(p.id + "_menu", "click", function(i) { + var m; + i = c.getParent(i.target, "a", j); + if (i && i.nodeName.toLowerCase() == "a" && (m = i.getAttribute("data-mce-color"))) { + p.setColor(m) + } + return a.cancel(i) + }); + return o + }, + setColor: function(f) { + this.displayColor(f); + this.hideMenu(); + this.settings.onselect(f) + }, + displayColor: function(g) { + var f = this; + c.setStyle(f.id + "_preview", "backgroundColor", g); + f.value = g + }, + postRender: function() { + var f = this, + g = f.id; + f.parent(); + c.add(g + "_action", "div", { + id: g + "_preview", + "class": "mceColorPreview" + }); + c.setStyle(f.id + "_preview", "backgroundColor", f.value) + }, + destroy: function() { + this.parent(); + a.clear(this.id + "_menu"); + a.clear(this.id + "_more"); + c.remove(this.id + "_menu") + } + }) +})(tinymce); +(function(b) { + var d = b.DOM, + c = b.each, + a = b.dom.Event; + b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container", { + renderHTML: function() { + var f = this, + i = [], + e = f.controls, + j = b.each, + g = f.settings; + i.push('<div id="' + f.id + '" role="group" aria-labelledby="' + f.id + '_voice">'); + i.push("<span role='application'>"); + i.push('<span id="' + f.id + '_voice" class="mceVoiceLabel" style="display:none;">' + d.encode(g.name) + "</span>"); + j(e, function(h) { + i.push(h.renderHTML()) + }); + i.push("</span>"); + i.push("</div>"); + return i.join("") + }, + focus: function() { + this.keyNav.focus() + }, + postRender: function() { + var f = this, + e = []; + c(f.controls, function(g) { + c(g.controls, function(h) { + if (h.id) { + e.push(h) + } + }) + }); + f.keyNav = new b.ui.KeyboardNavigation({ + root: f.id, + items: e, + onCancel: function() { + f.editor.focus() + }, + excludeFromTabOrder: !f.settings.tab_focus_toolbar + }) + }, + destroy: function() { + var e = this; + e.parent(); + e.keyNav.destroy(); + a.clear(e.id) + } + }) +})(tinymce); +(function(a) { + var c = a.DOM, + b = a.each; + a.create("tinymce.ui.Toolbar:tinymce.ui.Container", { + renderHTML: function() { + var m = this, + f = "", + j, k, n = m.settings, + e, d, g, l; + l = m.controls; + for (e = 0; e < l.length; e++) { + k = l[e]; + d = l[e - 1]; + g = l[e + 1]; + if (e === 0) { + j = "mceToolbarStart"; + if (k.Button) { + j += " mceToolbarStartButton" + } else { + if (k.SplitButton) { + j += " mceToolbarStartSplitButton" + } else { + if (k.ListBox) { + j += " mceToolbarStartListBox" + } + } + } + f += c.createHTML("td", { + "class": j + }, c.createHTML("span", null, "<!-- IE -->")) + } + if (d && k.ListBox) { + if (d.Button || d.SplitButton) { + f += c.createHTML("td", { + "class": "mceToolbarEnd" + }, c.createHTML("span", null, "<!-- IE -->")) + } + } + if (c.stdMode) { + f += '<td style="position: relative">' + k.renderHTML() + "</td>" + } else { + f += "<td>" + k.renderHTML() + "</td>" + } + if (g && k.ListBox) { + if (g.Button || g.SplitButton) { + f += c.createHTML("td", { + "class": "mceToolbarStart" + }, c.createHTML("span", null, "<!-- IE -->")) + } + } + } + j = "mceToolbarEnd"; + if (k.Button) { + j += " mceToolbarEndButton" + } else { + if (k.SplitButton) { + j += " mceToolbarEndSplitButton" + } else { + if (k.ListBox) { + j += " mceToolbarEndListBox" + } + } + } + f += c.createHTML("td", { + "class": j + }, c.createHTML("span", null, "<!-- IE -->")); + return c.createHTML("table", { + id: m.id, + "class": "mceToolbar" + (n["class"] ? " " + n["class"] : ""), + cellpadding: "0", + cellspacing: "0", + align: m.settings.align || "", + role: "presentation", + tabindex: "-1" + }, "<tbody><tr>" + f + "</tr></tbody>") + } + }) +})(tinymce); +(function(b) { + var a = b.util.Dispatcher, + c = b.each; + b.create("tinymce.AddOnManager", { + AddOnManager: function() { + var d = this; + d.items = []; + d.urls = {}; + d.lookup = {}; + d.onAdd = new a(d) + }, + get: function(d) { + return this.lookup[d] + }, + requireLangPack: function(e) { + var d = b.settings; + if (d && d.language && d.language_load !== false) { + b.ScriptLoader.add(this.urls[e] + "/langs/" + d.language + ".js") + } + }, + add: function(e, d) { + this.items.push(d); + this.lookup[e] = d; + this.onAdd.dispatch(this, e, d); + return d + }, + load: function(h, e, d, g) { + var f = this; + if (f.urls[h]) { + return + } + if (e.indexOf("/") != 0 && e.indexOf("://") == -1) { + e = b.baseURL + "/" + e + } + f.urls[h] = e.substring(0, e.lastIndexOf("/")); + if (!f.lookup[h]) { + b.ScriptLoader.add(e, d, g) + } + } + }); + b.PluginManager = new b.AddOnManager(); + b.ThemeManager = new b.AddOnManager() +}(tinymce)); +(function(j) { + var g = j.each, + d = j.extend, + k = j.DOM, + i = j.dom.Event, + f = j.ThemeManager, + b = j.PluginManager, + e = j.explode, + h = j.util.Dispatcher, + a, c = 0; + j.documentBaseURL = window.location.href.replace(/[\?#].*$/, "").replace(/[\/\\][^\/]+$/, ""); + if (!/[\/\\]$/.test(j.documentBaseURL)) { + j.documentBaseURL += "/" + } + j.baseURL = new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL); + j.baseURI = new j.util.URI(j.baseURL); + j.onBeforeUnload = new h(j); + i.add(window, "beforeunload", function(l) { + j.onBeforeUnload.dispatch(j, l) + }); + j.onAddEditor = new h(j); + j.onRemoveEditor = new h(j); + j.EditorManager = d(j, { + editors: [], + i18n: {}, + activeEditor: null, + init: function(q) { + var n = this, + p, l = j.ScriptLoader, + u, o = [], + m; + + function r(x, y, t) { + var v = x[y]; + if (!v) { + return + } + if (j.is(v, "string")) { + t = v.replace(/\.\w+$/, ""); + t = t ? j.resolve(t) : 0; + v = j.resolve(v) + } + return v.apply(t || this, Array.prototype.slice.call(arguments, 2)) + } + q = d({ + theme: "simple", + language: "en" + }, q); + n.settings = q; + i.add(document, "init", function() { + var s, v; + r(q, "onpageload"); + switch (q.mode) { + case "exact": + s = q.elements || ""; + if (s.length > 0) { + g(e(s), function(x) { + if (k.get(x)) { + m = new j.Editor(x, q); + o.push(m); + m.render(1) + } else { + g(document.forms, function(y) { + g(y.elements, function(z) { + if (z.name === x) { + x = "mce_editor_" + c++; + k.setAttrib(z, "id", x); + m = new j.Editor(x, q); + o.push(m); + m.render(1) + } + }) + }) + } + }) + } + break; + case "textareas": + case "specific_textareas": + + + function t(y, x) { + return x.constructor === RegExp ? x.test(y.className) : k.hasClass(y, x) + } + g(k.select("textarea"), function(x) { + if (q.editor_deselector && t(x, q.editor_deselector)) { + return + } + if (!q.editor_selector || t(x, q.editor_selector)) { + u = k.get(x.name); + if (!x.id && !u) { + x.id = x.name + } + if (!x.id || n.get(x.id)) { + x.id = k.uniqueId() + } + m = new j.Editor(x.id, q); + o.push(m); + m.render(1) + } + }); + break + } + if (q.oninit) { + s = v = 0; + g(o, function(x) { + v++; + if (!x.initialized) { + x.onInit.add(function() { + s++; + if (s == v) { + r(q, "oninit") + } + }) + } else { + s++ + } + if (s == v) { + r(q, "oninit") + } + }) + } + }) + }, + get: function(l) { + if (l === a) { + return this.editors + } + return this.editors[l] + }, + getInstanceById: function(l) { + return this.get(l) + }, + add: function(m) { + var l = this, + n = l.editors; + n[m.id] = m; + n.push(m); + l._setActive(m); + l.onAddEditor.dispatch(l, m); + return m + }, + remove: function(n) { + var m = this, + l, o = m.editors; + if (!o[n.id]) { + return null + } + delete o[n.id]; + for (l = 0; l < o.length; l++) { + if (o[l] == n) { + o.splice(l, 1); + break + } + } + if (m.activeEditor == n) { + m._setActive(o[0]) + } + n.destroy(); + m.onRemoveEditor.dispatch(m, n); + return n + }, + execCommand: function(r, p, o) { + var q = this, + n = q.get(o), + l; + switch (r) { + case "mceFocus": + n.focus(); + return true; + case "mceAddEditor": + case "mceAddControl": + if (!q.get(o)) { + new j.Editor(o, q.settings).render() + } + return true; + case "mceAddFrameControl": + l = o.window; + l.tinyMCE = tinyMCE; + l.tinymce = j; + j.DOM.doc = l.document; + j.DOM.win = l; + n = new j.Editor(o.element_id, o); + n.render(); + if (j.isIE) { + function m() { + n.destroy(); + l.detachEvent("onunload", m); + l = l.tinyMCE = l.tinymce = null + } + l.attachEvent("onunload", m) + } + o.page_window = null; + return true; + case "mceRemoveEditor": + case "mceRemoveControl": + if (n) { + n.remove() + } + return true; + case "mceToggleEditor": + if (!n) { + q.execCommand("mceAddControl", 0, o); + return true + } + if (n.isHidden()) { + n.show() + } else { + n.hide() + } + return true + } + if (q.activeEditor) { + return q.activeEditor.execCommand(r, p, o) + } + return false + }, + execInstanceCommand: function(p, o, n, m) { + var l = this.get(p); + if (l) { + return l.execCommand(o, n, m) + } + return false + }, + triggerSave: function() { + g(this.editors, function(l) { + l.save() + }) + }, + addI18n: function(n, q) { + var l, m = this.i18n; + if (!j.is(n, "string")) { + g(n, function(r, p) { + g(r, function(t, s) { + g(t, function(v, u) { + if (s === "common") { + m[p + "." + u] = v + } else { + m[p + "." + s + "." + u] = v + } + }) + }) + }) + } else { + g(q, function(r, p) { + m[n + "." + p] = r + }) + } + }, + _setActive: function(l) { + this.selectedInstance = this.activeEditor = l + } + }) +})(tinymce); +(function(m) { + var n = m.DOM, + j = m.dom.Event, + f = m.extend, + k = m.util.Dispatcher, + i = m.each, + a = m.isGecko, + b = m.isIE, + e = m.isWebKit, + d = m.is, + h = m.ThemeManager, + c = m.PluginManager, + o = m.inArray, + l = m.grep, + g = m.explode; + m.create("tinymce.Editor", { + Editor: function(r, q) { + var p = this; + p.id = p.editorId = r; + p.execCommands = {}; + p.queryStateCommands = {}; + p.queryValueCommands = {}; + p.isNotDirty = false; + p.plugins = {}; + i(["onPreInit", "onBeforeRenderUI", "onPostRender", "onInit", "onRemove", "onActivate", "onDeactivate", "onClick", "onEvent", "onMouseUp", "onMouseDown", "onDblClick", "onKeyDown", "onKeyUp", "onKeyPress", "onContextMenu", "onSubmit", "onReset", "onPaste", "onPreProcess", "onPostProcess", "onBeforeSetContent", "onBeforeGetContent", "onSetContent", "onGetContent", "onLoadContent", "onSaveContent", "onNodeChange", "onChange", "onBeforeExecCommand", "onExecCommand", "onUndo", "onRedo", "onVisualAid", "onSetProgressState"], function(s) { + p[s] = new k(p) + }); + p.settings = q = f({ + id: r, + language: "en", + docs_language: "en", + theme: "simple", + skin: "default", + delta_width: 0, + delta_height: 0, + popup_css: "", + plugins: "", + document_base_url: m.documentBaseURL, + add_form_submit_trigger: 1, + submit_patch: 1, + add_unload_trigger: 1, + convert_urls: 1, + relative_urls: 1, + remove_script_host: 1, + table_inline_editing: 0, + object_resizing: 1, + cleanup: 1, + accessibility_focus: 1, + custom_shortcuts: 1, + custom_undo_redo_keyboard_shortcuts: 1, + custom_undo_redo_restore_selection: 1, + custom_undo_redo: 1, + doctype: m.isIE6 ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' : "<!DOCTYPE>", + visual_table_class: "mceItemTable", + visual: 1, + font_size_style_values: "xx-small,x-small,small,medium,large,x-large,xx-large", + apply_source_formatting: 1, + directionality: "ltr", + forced_root_block: "p", + hidden_input: 1, + padd_empty_editor: 1, + render_ui: 1, + init_theme: 1, + force_p_newlines: 1, + indentation: "30px", + keep_styles: 1, + fix_table_elements: 1, + inline_styles: 1, + convert_fonts_to_spans: true, + indent: "simple", + indent_before: "p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr", + indent_after: "p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr", + validate: true, + entity_encoding: "named", + url_converter: p.convertURL, + url_converter_scope: p, + ie7_compat: true + }, q); + p.documentBaseURI = new m.util.URI(q.document_base_url || m.documentBaseURL, { + base_uri: tinyMCE.baseURI + }); + p.baseURI = m.baseURI; + p.contentCSS = []; + p.execCallback("setup", p) + }, + render: function(r) { + var u = this, + v = u.settings, + x = u.id, + p = m.ScriptLoader; + if (!j.domLoaded) { + j.add(document, "init", function() { + u.render() + }); + return + } + tinyMCE.settings = v; + if (!u.getElement()) { + return + } + if (m.isIDevice) { + return + } + if (!/TEXTAREA|INPUT/i.test(u.getElement().nodeName) && v.hidden_input && n.getParent(x, "form")) { + n.insertAfter(n.create("input", { + type: "hidden", + name: x + }), x) + } + if (m.WindowManager) { + u.windowManager = new m.WindowManager(u) + } + if (v.encoding == "xml") { + u.onGetContent.add(function(s, t) { + if (t.save) { + t.content = n.encode(t.content) + } + }) + } + if (v.add_form_submit_trigger) { + u.onSubmit.addToTop(function() { + if (u.initialized) { + u.save(); + u.isNotDirty = 1 + } + }) + } + if (v.add_unload_trigger) { + u._beforeUnload = tinyMCE.onBeforeUnload.add(function() { + if (u.initialized && !u.destroyed && !u.isHidden()) { + u.save({ + format: "raw", + no_events: true + }) + } + }) + } + m.addUnload(u.destroy, u); + if (v.submit_patch) { + u.onBeforeRenderUI.add(function() { + var s = u.getElement().form; + if (!s) { + return + } + if (s._mceOldSubmit) { + return + } + if (!s.submit.nodeType && !s.submit.length) { + u.formElement = s; + s._mceOldSubmit = s.submit; + s.submit = function() { + m.triggerSave(); + u.isNotDirty = 1; + return u.formElement._mceOldSubmit(u.formElement) + } + } + s = null + }) + } + function q() { + if (v.language && v.language_load !== false) { + p.add(m.baseURL + "/langs/" + v.language + ".js") + } + if (v.theme && v.theme.charAt(0) != "-" && !h.urls[v.theme]) { + h.load(v.theme, "themes/" + v.theme + "/editor_template" + m.suffix + ".js") + } + i(g(v.plugins), function(s) { + if (s && s.charAt(0) != "-" && !c.urls[s]) { + if (s == "safari") { + return + } + c.load(s, "plugins/" + s + "/editor_plugin" + m.suffix + ".js") + } + }); + p.loadQueue(function() { + if (!u.removed) { + u.init() + } + }) + } + q() + }, + init: function() { + var r, F = this, + G = F.settings, + C, z, B = F.getElement(), + q, p, D, x, A, E, y; + m.add(F); + G.aria_label = G.aria_label || n.getAttrib(B, "aria-label", F.getLang("aria.rich_text_area")); + if (G.theme) { + G.theme = G.theme.replace(/-/, ""); + q = h.get(G.theme); + F.theme = new q(); + if (F.theme.init && G.init_theme) { + F.theme.init(F, h.urls[G.theme] || m.documentBaseURL.replace(/\/$/, "")) + } + } + i(g(G.plugins.replace(/\-/g, "")), function(H) { + var I = c.get(H), + t = c.urls[H] || m.documentBaseURL.replace(/\/$/, ""), + s; + if (I) { + s = new I(F, t); + F.plugins[H] = s; + if (s.init) { + s.init(F, t) + } + } + }); + if (G.popup_css !== false) { + if (G.popup_css) { + G.popup_css = F.documentBaseURI.toAbsolute(G.popup_css) + } else { + G.popup_css = F.baseURI.toAbsolute("themes/" + G.theme + "/skins/" + G.skin + "/dialog.css") + } + } + if (G.popup_css_add) { + G.popup_css += "," + F.documentBaseURI.toAbsolute(G.popup_css_add) + } + F.controlManager = new m.ControlManager(F); + if (G.custom_undo_redo) { + F.onBeforeExecCommand.add(function(t, H, u, I, s) { + if (H != "Undo" && H != "Redo" && H != "mceRepaint" && (!s || !s.skip_undo)) { + F.undoManager.beforeChange() + } + }); + F.onExecCommand.add(function(t, H, u, I, s) { + if (H != "Undo" && H != "Redo" && H != "mceRepaint" && (!s || !s.skip_undo)) { + F.undoManager.add() + } + }) + } + F.onExecCommand.add(function(s, t) { + if (!/^(FontName|FontSize)$/.test(t)) { + F.nodeChanged() + } + }); + if (a) { + function v(s, t) { + if (!t || !t.initial) { + F.execCommand("mceRepaint") + } + } + F.onUndo.add(v); + F.onRedo.add(v); + F.onSetContent.add(v) + } + F.onBeforeRenderUI.dispatch(F, F.controlManager); + if (G.render_ui) { + C = G.width || B.style.width || B.offsetWidth; + z = G.height || B.style.height || B.offsetHeight; + F.orgDisplay = B.style.display; + E = /^[0-9\.]+(|px)$/i; + if (E.test("" + C)) { + C = Math.max(parseInt(C) + (q.deltaWidth || 0), 100) + } + if (E.test("" + z)) { + z = Math.max(parseInt(z) + (q.deltaHeight || 0), 100) + } + q = F.theme.renderUI({ + targetNode: B, + width: C, + height: z, + deltaWidth: G.delta_width, + deltaHeight: G.delta_height + }); + F.editorContainer = q.editorContainer + } + if (document.domain && location.hostname != document.domain) { + m.relaxedDomain = document.domain + } + n.setStyles(q.sizeContainer || q.editorContainer, { + width: C, + height: z + }); + if (G.content_css) { + m.each(g(G.content_css), function(s) { + F.contentCSS.push(F.documentBaseURI.toAbsolute(s)) + }) + } + z = (q.iframeHeight || z) + (typeof(z) == "number" ? (q.deltaHeight || 0) : ""); + if (z < 100) { + z = 100 + } + F.iframeHTML = G.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml">'; + if (G.document_base_url != m.documentBaseURL) { + F.iframeHTML += '<base href="' + F.documentBaseURI.getURI() + '" />' + } + if (G.ie7_compat) { + F.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=7" />' + } else { + F.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=edge" />' + } + F.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; + if (!a || !/Firefox\/2/.test(navigator.userAgent)) { + for (y = 0; y < F.contentCSS.length; y++) { + F.iframeHTML += '<link type="text/css" rel="stylesheet" href="' + F.contentCSS[y] + '" />' + } + F.contentCSS = [] + } + x = G.body_id || "tinymce"; + if (x.indexOf("=") != -1) { + x = F.getParam("body_id", "", "hash"); + x = x[F.id] || x + } + A = G.body_class || ""; + if (A.indexOf("=") != -1) { + A = F.getParam("body_class", "", "hash"); + A = A[F.id] || "" + } + F.iframeHTML += '</head><body id="' + x + '" class="mceContentBody ' + A + '"></body></html>'; + if (m.relaxedDomain && (b || (m.isOpera && parseFloat(opera.version()) < 11))) { + D = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + F.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()' + } + r = n.add(q.iframeContainer, "iframe", { + id: F.id + "_ifr", + src: D || 'javascript:""', + frameBorder: "0", + title: G.aria_label, + style: { + width: "100%", + height: z + } + }); + F.contentAreaContainer = q.iframeContainer; + n.get(q.editorContainer).style.display = F.orgDisplay; + n.get(F.id).style.display = "none"; + n.setAttrib(F.id, "aria-hidden", true); + if (!m.relaxedDomain || !D) { + F.setupIframe() + } + B = r = q = null + }, + setupIframe: function() { + var r = this, + x = r.settings, + y = n.get(r.id), + z = r.getDoc(), + v, p; + if (!b || !m.relaxedDomain) { + z.open(); + z.write(r.iframeHTML); + z.close(); + if (m.relaxedDomain) { + z.domain = m.relaxedDomain + } + } + if (!b) { + try { + if (!x.readonly) { + z.designMode = "On" + } + } catch (q) {} + } + if (b) { + p = r.getBody(); + n.hide(p); + if (!x.readonly) { + p.contentEditable = true + } + n.show(p) + } + r.schema = new m.html.Schema(x); + r.dom = new m.dom.DOMUtils(r.getDoc(), { + keep_values: true, + url_converter: r.convertURL, + url_converter_scope: r, + hex_colors: x.force_hex_style_colors, + class_filter: x.class_filter, + update_styles: 1, + fix_ie_paragraphs: 1, + schema: r.schema + }); + r.parser = new m.html.DomParser(x, r.schema); + r.parser.addAttributeFilter("name", function(s, t) { + var B = s.length, + D, A, C, E; + while (B--) { + E = s[B]; + if (E.name === "a" && E.firstChild) { + C = E.parent; + D = E.lastChild; + do { + A = D.prev; + C.insert(D, E); + D = A + } while (D) + } + } + }); + r.parser.addAttributeFilter("src,href,style", function(s, t) { + var A = s.length, + B, D = r.dom, + C; + while (A--) { + B = s[A]; + C = B.attr(t); + if (t === "style") { + B.attr("data-mce-style", D.serializeStyle(D.parseStyle(C), B.name)) + } else { + B.attr("data-mce-" + t, r.convertURL(C, t, B.name)) + } + } + }); + r.parser.addNodeFilter("script", function(s, t) { + var A = s.length; + while (A--) { + s[A].attr("type", "mce-text/javascript") + } + }); + r.parser.addNodeFilter("#cdata", function(s, t) { + var A = s.length, + B; + while (A--) { + B = s[A]; + B.type = 8; + B.name = "#comment"; + B.value = "[CDATA[" + B.value + "]]" + } + }); + r.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div", function(t, A) { + var B = t.length, + C, s = r.schema.getNonEmptyElements(); + while (B--) { + C = t[B]; + if (C.isEmpty(s)) { + C.empty().append(new m.html.Node("br", 1)).shortEnded = true + } + } + }); + r.serializer = new m.dom.Serializer(x, r.dom, r.schema); + r.selection = new m.dom.Selection(r.dom, r.getWin(), r.serializer); + r.formatter = new m.Formatter(this); + r.formatter.register({ + alignleft: [{ + selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", + styles: { + textAlign: "left" + } + }, + { + selector: "img,table", + collapsed: false, + styles: { + "float": "left" + } + }], + aligncenter: [{ + selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", + styles: { + textAlign: "center" + } + }, + { + selector: "img", + collapsed: false, + styles: { + display: "block", + marginLeft: "auto", + marginRight: "auto" + } + }, + { + selector: "table", + collapsed: false, + styles: { + marginLeft: "auto", + marginRight: "auto" + } + }], + alignright: [{ + selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", + styles: { + textAlign: "right" + } + }, + { + selector: "img,table", + collapsed: false, + styles: { + "float": "right" + } + }], + alignfull: [{ + selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", + styles: { + textAlign: "justify" + } + }], + bold: [{ + inline: "strong", + remove: "all" + }, + { + inline: "span", + styles: { + fontWeight: "bold" + } + }, + { + inline: "b", + remove: "all" + }], + italic: [{ + inline: "em", + remove: "all" + }, + { + inline: "span", + styles: { + fontStyle: "italic" + } + }, + { + inline: "i", + remove: "all" + }], + underline: [{ + inline: "span", + styles: { + textDecoration: "underline" + }, + exact: true + }, + { + inline: "u", + remove: "all" + }], + strikethrough: [{ + inline: "span", + styles: { + textDecoration: "line-through" + }, + exact: true + }, + { + inline: "strike", + remove: "all" + }], + forecolor: { + inline: "span", + styles: { + color: "%value" + }, + wrap_links: false + }, + hilitecolor: { + inline: "span", + styles: { + backgroundColor: "%value" + }, + wrap_links: false + }, + fontname: { + inline: "span", + styles: { + fontFamily: "%value" + } + }, + fontsize: { + inline: "span", + styles: { + fontSize: "%value" + } + }, + fontsize_class: { + inline: "span", + attributes: { + "class": "%value" + } + }, + blockquote: { + block: "blockquote", + wrapper: 1, + remove: "all" + }, + subscript: { + inline: "sub" + }, + superscript: { + inline: "sup" + }, + removeformat: [{ + selector: "b,strong,em,i,font,u,strike", + remove: "all", + split: true, + expand: false, + block_expand: true, + deep: true + }, + { + selector: "span", + attributes: ["style", "class"], + remove: "empty", + split: true, + expand: false, + deep: true + }, + { + selector: "*", + attributes: ["style", "class"], + split: false, + expand: false, + deep: true + }] + }); + i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/), function(s) { + r.formatter.register(s, { + block: s, + remove: "all" + }) + }); + r.formatter.register(r.settings.formats); + r.undoManager = new m.UndoManager(r); + r.undoManager.onAdd.add(function(t, s) { + if (t.hasUndo()) { + return r.onChange.dispatch(r, s, t) + } + }); + r.undoManager.onUndo.add(function(t, s) { + return r.onUndo.dispatch(r, s, t) + }); + r.undoManager.onRedo.add(function(t, s) { + return r.onRedo.dispatch(r, s, t) + }); + r.forceBlocks = new m.ForceBlocks(r, { + forced_root_block: x.forced_root_block + }); + r.editorCommands = new m.EditorCommands(r); + r.serializer.onPreProcess.add(function(s, t) { + return r.onPreProcess.dispatch(r, t, s) + }); + r.serializer.onPostProcess.add(function(s, t) { + return r.onPostProcess.dispatch(r, t, s) + }); + r.onPreInit.dispatch(r); + if (!x.gecko_spellcheck) { + r.getBody().spellcheck = 0 + } + if (!x.readonly) { + r._addEvents() + } + r.controlManager.onPostRender.dispatch(r, r.controlManager); + r.onPostRender.dispatch(r); + if (x.directionality) { + r.getBody().dir = x.directionality + } + if (x.nowrap) { + r.getBody().style.whiteSpace = "nowrap" + } + if (x.handle_node_change_callback) { + r.onNodeChange.add(function(t, s, A) { + r.execCallback("handle_node_change_callback", r.id, A, -1, -1, true, r.selection.isCollapsed()) + }) + } + if (x.save_callback) { + r.onSaveContent.add(function(s, A) { + var t = r.execCallback("save_callback", r.id, A.content, r.getBody()); + if (t) { + A.content = t + } + }) + } + if (x.onchange_callback) { + r.onChange.add(function(t, s) { + r.execCallback("onchange_callback", r, s) + }) + } + if (x.protect) { + r.onBeforeSetContent.add(function(s, t) { + if (x.protect) { + i(x.protect, function(A) { + t.content = t.content.replace(A, function(B) { + return "<!--mce:protected " + escape(B) + "-->" + }) + }) + } + }) + } + if (x.convert_newlines_to_brs) { + r.onBeforeSetContent.add(function(s, t) { + if (t.initial) { + t.content = t.content.replace(/\r?\n/g, "<br />") + } + }) + } + if (x.preformatted) { + r.onPostProcess.add(function(s, t) { + t.content = t.content.replace(/^\s*<pre.*?>/, ""); + t.content = t.content.replace(/<\/pre>\s*$/, ""); + if (t.set) { + t.content = '<pre class="mceItemHidden">' + t.content + "</pre>" + } + }) + } + if (x.verify_css_classes) { + r.serializer.attribValueFilter = function(C, A) { + var B, t; + if (C == "class") { + if (!r.classesRE) { + t = r.dom.getClasses(); + if (t.length > 0) { + B = ""; + i(t, function(s) { + B += (B ? "|" : "") + s["class"] + }); + r.classesRE = new RegExp("(" + B + ")", "gi") + } + } + return !r.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(A) || r.classesRE.test(A) ? A : "" + } + return A + } + } + if (x.cleanup_callback) { + r.onBeforeSetContent.add(function(s, t) { + t.content = r.execCallback("cleanup_callback", "insert_to_editor", t.content, t) + }); + r.onPreProcess.add(function(s, t) { + if (t.set) { + r.execCallback("cleanup_callback", "insert_to_editor_dom", t.node, t) + } + if (t.get) { + r.execCallback("cleanup_callback", "get_from_editor_dom", t.node, t) + } + }); + r.onPostProcess.add(function(s, t) { + if (t.set) { + t.content = r.execCallback("cleanup_callback", "insert_to_editor", t.content, t) + } + if (t.get) { + t.content = r.execCallback("cleanup_callback", "get_from_editor", t.content, t) + } + }) + } + if (x.save_callback) { + r.onGetContent.add(function(s, t) { + if (t.save) { + t.content = r.execCallback("save_callback", r.id, t.content, r.getBody()) + } + }) + } + if (x.handle_event_callback) { + r.onEvent.add(function(s, t, A) { + if (r.execCallback("handle_event_callback", t, s, A) === false) { + j.cancel(t) + } + }) + } + r.onSetContent.add(function() { + r.addVisual(r.getBody()) + }); + if (x.padd_empty_editor) { + r.onPostProcess.add(function(s, t) { + t.content = t.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, "") + }) + } + if (a) { + function u(s, t) { + i(s.dom.select("a"), function(B) { + var A = B.parentNode; + if (s.dom.isBlock(A) && A.lastChild === B) { + s.dom.add(A, "br", { + "data-mce-bogus": 1 + }) + } + }) + } + r.onExecCommand.add(function(s, t) { + if (t === "CreateLink") { + u(s) + } + }); + r.onSetContent.add(r.selection.onSetContent.add(u)); + if (!x.readonly) { + try { + z.designMode = "Off"; + z.designMode = "On" + } catch (q) {} + } + } + setTimeout(function() { + if (r.removed) { + return + } + r.load({ + initial: true, + format: "html" + }); + r.startContent = r.getContent({ + format: "raw" + }); + r.undoManager.add(); + r.initialized = true; + r.onInit.dispatch(r); + r.execCallback("setupcontent_callback", r.id, r.getBody(), r.getDoc()); + r.execCallback("init_instance_callback", r); + r.focus(true); + r.nodeChanged({ + initial: 1 + }); + i(r.contentCSS, function(s) { + r.dom.loadCSS(s) + }); + if (x.auto_focus) { + setTimeout(function() { + var s = m.get(x.auto_focus); + s.selection.select(s.getBody(), 1); + s.selection.collapse(1); + s.getWin().focus() + }, 100) + } + }, 1); + y = null + }, + focus: function(s) { + var x, q = this, + v = q.settings.content_editable, + r, p, u = q.getDoc(); + if (!s) { + r = q.selection.getRng(); + if (r.item) { + p = r.item(0) + } + if (!v) { + q.getWin().focus() + } + if (p && p.ownerDocument == u) { + r = u.body.createControlRange(); + r.addElement(p); + r.select() + } + } + if (m.activeEditor != q) { + if ((x = m.activeEditor) != null) { + x.onDeactivate.dispatch(x, q) + } + q.onActivate.dispatch(q, x) + } + m._setActive(q) + }, + execCallback: function(u) { + var p = this, + r = p.settings[u], q; + if (!r) { + return + } + if (p.callbackLookup && (q = p.callbackLookup[u])) { + r = q.func; + console.log(r); + q = q.scope + } + if (d(r, "string")) { + q = r.replace(/\.\w+$/, ""); + q = q ? m.resolve(q) : 0; + r = m.resolve(r); + p.callbackLookup = p.callbackLookup || {}; + p.callbackLookup[u] = { + func: r, + scope: q + } + } + return r.apply(q || p, Array.prototype.slice.call(arguments, 1)) + }, + translate: function(p) { + var r = this.settings.language || "en", + q = m.i18n; + if (!p) { + return "" + } + return q[r + "." + p] || p.replace(/{\#([^}]+)\}/g, function(t, s) { + return q[r + "." + s] || "{#" + s + "}" + }) + }, + getLang: function(q, p) { + return m.i18n[(this.settings.language || "en") + "." + q] || (d(p) ? p : "{#" + q + "}") + }, + getParam: function(u, r, p) { + var s = m.trim, + q = d(this.settings[u]) ? this.settings[u] : r, + t; + if (p === "hash") { + t = {}; + if (d(q, "string")) { + i(q.indexOf("=") > 0 ? q.split(/[;,](?![^=;,]*(?:[;,]|$))/) : q.split(","), function(x) { + x = x.split("="); + if (x.length > 1) { + t[s(x[0])] = s(x[1]) + } else { + t[s(x[0])] = s(x) + } + }) + } else { + t = q + } + return t + } + return q + }, + nodeChanged: function(r) { + var p = this, + q = p.selection, + u = q.getStart() || p.getBody(); + if (p.initialized) { + r = r || {}; + u = b && u.ownerDocument != p.getDoc() ? p.getBody() : u; + r.parents = []; + p.dom.getParent(u, function(s) { + if (s.nodeName == "BODY") { + return true + } + r.parents.push(s) + }); + p.onNodeChange.dispatch(p, r ? r.controlManager || p.controlManager : p.controlManager, u, q.isCollapsed(), r) + } + }, + addButton: function(r, q) { + var p = this; + p.buttons = p.buttons || {}; + p.buttons[r] = q + }, + addCommand: function(p, r, q) { + this.execCommands[p] = { + func: r, + scope: q || this + } + }, + addQueryStateHandler: function(p, r, q) { + this.queryStateCommands[p] = { + func: r, + scope: q || this + } + }, + addQueryValueHandler: function(p, r, q) { + this.queryValueCommands[p] = { + func: r, + scope: q || this + } + }, + addShortcut: function(r, u, p, s) { + var q = this, + v; + if (!q.settings.custom_shortcuts) { + return false + } + q.shortcuts = q.shortcuts || {}; + if (d(p, "string")) { + v = p; + p = function() { + q.execCommand(v, false, null) + } + } + if (d(p, "object")) { + v = p; + p = function() { + q.execCommand(v[0], v[1], v[2]) + } + } + i(g(r), function(t) { + var x = { + func: p, + scope: s || this, + desc: u, + alt: false, + ctrl: false, + shift: false + }; + i(g(t, "+"), function(y) { + switch (y) { + case "alt": + case "ctrl": + case "shift": + x[y] = true; + break; + default: + x.charCode = y.charCodeAt(0); + x.keyCode = y.toUpperCase().charCodeAt(0) + } + }); + q.shortcuts[(x.ctrl ? "ctrl" : "") + "," + (x.alt ? "alt" : "") + "," + (x.shift ? "shift" : "") + "," + x.keyCode] = x + }); + return true + }, + execCommand: function(x, v, z, p) { + var r = this, + u = 0, + y, q; + if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x) && (!p || !p.skip_focus)) { + r.focus() + } + y = {}; + r.onBeforeExecCommand.dispatch(r, x, v, z, y); + if (y.terminate) { + return false + } + if (r.execCallback("execcommand_callback", r.id, r.selection.getNode(), x, v, z)) { + r.onExecCommand.dispatch(r, x, v, z, p); + return true + } + if (y = r.execCommands[x]) { + q = y.func.call(y.scope, v, z); + if (q !== true) { + r.onExecCommand.dispatch(r, x, v, z, p); + return q + } + } + i(r.plugins, function(s) { + if (s.execCommand && s.execCommand(x, v, z)) { + r.onExecCommand.dispatch(r, x, v, z, p); + u = 1; + return false + } + }); + if (u) { + return true + } + if (r.theme && r.theme.execCommand && r.theme.execCommand(x, v, z)) { + r.onExecCommand.dispatch(r, x, v, z, p); + return true + } + if (r.editorCommands.execCommand(x, v, z)) { + r.onExecCommand.dispatch(r, x, v, z, p); + return true + } + r.getDoc().execCommand(x, v, z); + r.onExecCommand.dispatch(r, x, v, z, p) + }, + queryCommandState: function(u) { + var q = this, + v, r; + if (q._isHidden()) { + return + } + if (v = q.queryStateCommands[u]) { + r = v.func.call(v.scope); + if (r !== true) { + return r + } + } + v = q.editorCommands.queryCommandState(u); + if (v !== -1) { + return v + } + try { + return this.getDoc().queryCommandState(u) + } catch (p) {} + }, + queryCommandValue: function(v) { + var q = this, + u, r; + if (q._isHidden()) { + return + } + if (u = q.queryValueCommands[v]) { + r = u.func.call(u.scope); + if (r !== true) { + return r + } + } + u = q.editorCommands.queryCommandValue(v); + if (d(u)) { + return u + } + try { + return this.getDoc().queryCommandValue(v) + } catch (p) {} + }, + show: function() { + var p = this; + n.show(p.getContainer()); + n.hide(p.id); + p.load() + }, + hide: function() { + var p = this, + q = p.getDoc(); + if (b && q) { + q.execCommand("SelectAll") + } + p.save(); + n.hide(p.getContainer()); + n.setStyle(p.id, "display", p.orgDisplay) + }, + isHidden: function() { + return !n.isHidden(this.id) + }, + setProgressState: function(p, q, r) { + this.onSetProgressState.dispatch(this, p, q, r); + return p + }, + load: function(s) { + var p = this, + r = p.getElement(), + q; + if (r) { + s = s || {}; + s.load = true; + q = p.setContent(d(r.value) ? r.value : r.innerHTML, s); + s.element = r; + if (!s.no_events) { + p.onLoadContent.dispatch(p, s) + } + s.element = r = null; + return q + } + }, + save: function(u) { + var p = this, + s = p.getElement(), + q, r; + if (!s || !p.initialized) { + return + } + u = u || {}; + u.save = true; + if (!u.no_events) { + p.undoManager.typing = false; + p.undoManager.add() + } + u.element = s; + q = u.content = p.getContent(u); + if (!u.no_events) { + p.onSaveContent.dispatch(p, u) + } + q = u.content; + if (!/TEXTAREA|INPUT/i.test(s.nodeName)) { + s.innerHTML = q; + if (r = n.getParent(p.id, "form")) { + i(r.elements, function(t) { + if (t.name == p.id) { + t.value = q; + return false + } + }) + } + } else { + s.value = q + } + u.element = s = null; + return q + }, + setContent: function(t, s) { + var r = this, + q, p = r.getBody(); + s = s || {}; + s.format = s.format || "html"; + s.set = true; + s.content = t; + if (!s.no_events) { + r.onBeforeSetContent.dispatch(r, s) + } + t = s.content; + if (!m.isIE && (t.length === 0 || /^\s+$/.test(t))) { + p.innerHTML = '<br data-mce-bogus="1" />'; + return + } + if (s.format !== "raw") { + t = new m.html.Serializer({}, r.schema).serialize(r.parser.parse(t)) + } + s.content = m.trim(t); + r.dom.setHTML(p, s.content); + if (!s.no_events) { + r.onSetContent.dispatch(r, s) + } + return s.content + }, + getContent: function(q) { + var p = this, + r; + q = q || {}; + q.format = q.format || "html"; + q.get = true; + if (!q.no_events) { + p.onBeforeGetContent.dispatch(p, q) + } + if (q.format == "raw") { + r = p.getBody().innerHTML + } else { + r = p.serializer.serialize(p.getBody(), q) + } + q.content = m.trim(r); + if (!q.no_events) { + p.onGetContent.dispatch(p, q) + } + return q.content + }, + isDirty: function() { + var p = this; + return m.trim(p.startContent) != m.trim(p.getContent({ + format: "raw", + no_events: 1 + })) && !p.isNotDirty + }, + getContainer: function() { + var p = this; + if (!p.container) { + p.container = n.get(p.editorContainer || p.id + "_parent") + } + return p.container + }, + getContentAreaContainer: function() { + return this.contentAreaContainer + }, + getElement: function() { + return n.get(this.settings.content_element || this.id) + }, + getWin: function() { + var p = this, + q; + if (!p.contentWindow) { + q = n.get(p.id + "_ifr"); + if (q) { + p.contentWindow = q.contentWindow + } + } + return p.contentWindow + }, + getDoc: function() { + var q = this, + p; + if (!q.contentDocument) { + p = q.getWin(); + if (p) { + q.contentDocument = p.document + } + } + return q.contentDocument + }, + getBody: function() { + return this.bodyElement || this.getDoc().body + }, + convertURL: function(p, x, v) { + var q = this, + r = q.settings; + if (r.urlconverter_callback) { + return q.execCallback("urlconverter_callback", p, v, true, x) + } + if (!r.convert_urls || (v && v.nodeName == "LINK") || p.indexOf("file:") === 0) { + return p + } + if (r.relative_urls) { + return q.documentBaseURI.toRelative(p) + } + p = q.documentBaseURI.toAbsolute(p, r.remove_script_host); + return p + }, + addVisual: function(r) { + var p = this, + q = p.settings; + r = r || p.getBody(); + if (!d(p.hasVisual)) { + p.hasVisual = q.visual + } + i(p.dom.select("table,a", r), function(t) { + var s; + switch (t.nodeName) { + case "TABLE": + s = p.dom.getAttrib(t, "border"); + if (!s || s == "0") { + if (p.hasVisual) { + p.dom.addClass(t, q.visual_table_class) + } else { + p.dom.removeClass(t, q.visual_table_class) + } + } + return; + case "A": + s = p.dom.getAttrib(t, "name"); + if (s) { + if (p.hasVisual) { + p.dom.addClass(t, "mceItemAnchor") + } else { + p.dom.removeClass(t, "mceItemAnchor") + } + } + return + } + }); + p.onVisualAid.dispatch(p, r, p.hasVisual) + }, + remove: function() { + var p = this, + q = p.getContainer(); + p.removed = 1; + p.hide(); + p.execCallback("remove_instance_callback", p); + p.onRemove.dispatch(p); + p.onExecCommand.listeners = []; + m.remove(p); + n.remove(q) + }, + destroy: function(q) { + var p = this; + if (p.destroyed) { + return + } + if (!q) { + m.removeUnload(p.destroy); + tinyMCE.onBeforeUnload.remove(p._beforeUnload); + if (p.theme && p.theme.destroy) { + p.theme.destroy() + } + p.controlManager.destroy(); + p.selection.destroy(); + p.dom.destroy(); + if (!p.settings.content_editable) { + j.clear(p.getWin()); + j.clear(p.getDoc()) + } + j.clear(p.getBody()); + j.clear(p.formElement) + } + if (p.formElement) { + p.formElement.submit = p.formElement._mceOldSubmit; + p.formElement._mceOldSubmit = null + } + p.contentAreaContainer = p.formElement = p.container = p.settings.content_element = p.bodyElement = p.contentDocument = p.contentWindow = null; + if (p.selection) { + p.selection = p.selection.win = p.selection.dom = p.selection.dom.doc = null + } + p.destroyed = 1 + }, + _addEvents: function() { + var B = this, + r, C = B.settings, + q = B.dom, + x = { + mouseup: "onMouseUp", + mousedown: "onMouseDown", + click: "onClick", + keyup: "onKeyUp", + keydown: "onKeyDown", + keypress: "onKeyPress", + submit: "onSubmit", + reset: "onReset", + contextmenu: "onContextMenu", + dblclick: "onDblClick", + paste: "onPaste" + }; + + function p(t, D) { + var s = t.type; + if (B.removed) { + return + } + if (B.onEvent.dispatch(B, t, D) !== false) { + B[x[t.fakeType || t.type]].dispatch(B, t, D) + } + } + i(x, function(t, s) { + switch (s) { + case "contextmenu": + q.bind(B.getDoc(), s, p); + break; + case "paste": + q.bind(B.getBody(), s, function(D) { + p(D) + }); + break; + case "submit": + case "reset": + q.bind(B.getElement().form || n.getParent(B.id, "form"), s, p); + break; + default: + q.bind(C.content_editable ? B.getBody() : B.getDoc(), s, p) + } + }); + q.bind(C.content_editable ? B.getBody() : (a ? B.getDoc() : B.getWin()), "focus", function(s) { + B.focus(true) + }); + if (m.isGecko) { + q.bind(B.getDoc(), "DOMNodeInserted", function(t) { + var s; + t = t.target; + if (t.nodeType === 1 && t.nodeName === "IMG" && (s = t.getAttribute("data-mce-src"))) { + t.src = B.documentBaseURI.toAbsolute(s) + } + }) + } + if (a) { + function u() { + var E = this, + G = E.getDoc(), + F = E.settings; + if (a && !F.readonly) { + if (E._isHidden()) { + try { + if (!F.content_editable) { + G.designMode = "On" + } + } catch (D) {} + } + try { + G.execCommand("styleWithCSS", 0, false) + } catch (D) { + if (!E._isHidden()) { + try { + G.execCommand("useCSS", 0, true) + } catch (D) {} + } + } + if (!F.table_inline_editing) { + try { + G.execCommand("enableInlineTableEditing", false, false) + } catch (D) {} + } + if (!F.object_resizing) { + try { + G.execCommand("enableObjectResizing", false, false) + } catch (D) {} + } + } + } + B.onBeforeExecCommand.add(u); + B.onMouseDown.add(u) + } + if (m.isWebKit) { + B.onClick.add(function(s, t) { + t = t.target; + if (t.nodeName == "IMG" || (t.nodeName == "A" && q.hasClass(t, "mceItemAnchor"))) { + B.selection.getSel().setBaseAndExtent(t, 0, t, 1); + B.nodeChanged() + } + }) + } + B.onMouseUp.add(B.nodeChanged); + B.onKeyUp.add(function(s, t) { + var D = t.keyCode; + if ((D >= 33 && D <= 36) || (D >= 37 && D <= 40) || D == 13 || D == 45 || D == 46 || D == 8 || (m.isMac && (D == 91 || D == 93)) || t.ctrlKey) { + B.nodeChanged() + } + }); + B.onReset.add(function() { + B.setContent(B.startContent, { + format: "raw" + }) + }); + if (C.custom_shortcuts) { + if (C.custom_undo_redo_keyboard_shortcuts) { + B.addShortcut("ctrl+z", B.getLang("undo_desc"), "Undo"); + B.addShortcut("ctrl+y", B.getLang("redo_desc"), "Redo") + } + B.addShortcut("ctrl+b", B.getLang("bold_desc"), "Bold"); + B.addShortcut("ctrl+i", B.getLang("italic_desc"), "Italic"); + B.addShortcut("ctrl+u", B.getLang("underline_desc"), "Underline"); + for (r = 1; r <= 6; r++) { + B.addShortcut("ctrl+" + r, "", ["FormatBlock", false, "h" + r]) + } + B.addShortcut("ctrl+7", "", ["FormatBlock", false, "<p>"]); + B.addShortcut("ctrl+8", "", ["FormatBlock", false, "<div>"]); + B.addShortcut("ctrl+9", "", ["FormatBlock", false, "<address>"]); + + function v(t) { + var s = null; + if (!t.altKey && !t.ctrlKey && !t.metaKey) { + return s + } + i(B.shortcuts, function(D) { + if (m.isMac && D.ctrl != t.metaKey) { + return + } else { + if (!m.isMac && D.ctrl != t.ctrlKey) { + return + } + } + if (D.alt != t.altKey) { + return + } + if (D.shift != t.shiftKey) { + return + } + if (t.keyCode == D.keyCode || (t.charCode && t.charCode == D.charCode)) { + s = D; + return false + } + }); + return s + } + B.onKeyUp.add(function(s, t) { + var D = v(t); + if (D) { + return j.cancel(t) + } + }); + B.onKeyPress.add(function(s, t) { + var D = v(t); + if (D) { + return j.cancel(t) + } + }); + B.onKeyDown.add(function(s, t) { + var D = v(t); + if (D) { + D.func.call(D.scope); + return j.cancel(t) + } + }) + } + if (m.isIE) { + q.bind(B.getDoc(), "controlselect", function(D) { + var t = B.resizeInfo, + s; + D = D.target; + if (D.nodeName !== "IMG") { + return + } + if (t) { + q.unbind(t.node, t.ev, t.cb) + } + if (!q.hasClass(D, "mceItemNoResize")) { + ev = "resizeend"; + s = q.bind(D, ev, function(F) { + var E; + F = F.target; + if (E = q.getStyle(F, "width")) { + q.setAttrib(F, "width", E.replace(/[^0-9%]+/g, "")); + q.setStyle(F, "width", "") + } + if (E = q.getStyle(F, "height")) { + q.setAttrib(F, "height", E.replace(/[^0-9%]+/g, "")); + q.setStyle(F, "height", "") + } + }) + } else { + ev = "resizestart"; + s = q.bind(D, "resizestart", j.cancel, j) + } + t = B.resizeInfo = { + node: D, + ev: ev, + cb: s + } + }); + B.onKeyDown.add(function(s, D) { + var t; + switch (D.keyCode) { + case 8: + t = B.getDoc().selection; + if (t.createRange && t.createRange().item) { + s.dom.remove(t.createRange().item(0)); + return j.cancel(D) + } + } + }) + } + if (m.isOpera) { + B.onClick.add(function(s, t) { + j.prevent(t) + }) + } + if (C.custom_undo_redo) { + function y() { + B.undoManager.typing = false; + B.undoManager.add() + } + q.bind(B.getDoc(), "focusout", function(s) { + if (!B.removed && B.undoManager.typing) { + y() + } + }); + B.dom.bind(B.dom.getRoot(), "dragend", function(s) { + y() + }); + B.onKeyUp.add(function(t, F) { + var s, E, D; + if (b && F.keyCode == 8) { + s = B.selection.getRng(); + if (s.parentElement) { + E = s.parentElement(); + D = B.selection.getBookmark(); + E.innerHTML = E.innerHTML; + B.selection.moveToBookmark(D) + } + } + if ((F.keyCode >= 33 && F.keyCode <= 36) || (F.keyCode >= 37 && F.keyCode <= 40) || F.keyCode == 13 || F.keyCode == 45 || F.ctrlKey) { + y() + } + }); + B.onKeyDown.add(function(t, H) { + var s, F, E, G = H.keyCode; + if (b && G == 46) { + s = B.selection.getRng(); + if (s.parentElement) { + F = s.parentElement(); + if (!B.undoManager.typing) { + B.undoManager.beforeChange(); + B.undoManager.typing = true; + B.undoManager.add() + } + if (H.ctrlKey) { + s.moveEnd("word", 1); + s.select() + } + B.selection.getSel().clear(); + if (s.parentElement() == F) { + E = B.selection.getBookmark(); + try { + F.innerHTML = F.innerHTML + } catch (D) {} + B.selection.moveToBookmark(E) + } + H.preventDefault(); + return + } + } + if ((G >= 33 && G <= 36) || (G >= 37 && G <= 40) || G == 13 || G == 45) { + if (m.isIE && G == 13) { + B.undoManager.beforeChange() + } + if (B.undoManager.typing) { + y() + } + return + } + if ((G < 16 || G > 20) && G != 224 && G != 91 && !B.undoManager.typing) { + B.undoManager.beforeChange(); + B.undoManager.add(); + B.undoManager.typing = true + } + }); + B.onMouseDown.add(function() { + if (B.undoManager.typing) { + y() + } + }) + } + if (m.isGecko) { + function A() { + var s = B.dom.getAttribs(B.selection.getStart().cloneNode(false)); + return function() { + var t = B.selection.getStart(); + B.dom.removeAllAttribs(t); + i(s, function(D) { + t.setAttributeNode(D.cloneNode(true)) + }) + } + } + function z() { + var t = B.selection; + return !t.isCollapsed() && t.getStart() != t.getEnd() + } + B.onKeyPress.add(function(s, D) { + var t; + if ((D.keyCode == 8 || D.keyCode == 46) && z()) { + t = A(); + B.getDoc().execCommand("delete", false, null); + t(); + return j.cancel(D) + } + }); + B.dom.bind(B.getDoc(), "cut", function(t) { + var s; + if (z()) { + s = A(); + B.onKeyUp.addToTop(j.cancel, j); + setTimeout(function() { + s(); + B.onKeyUp.remove(j.cancel, j) + }, 0) + } + }) + } + }, + _isHidden: function() { + var p; + if (!a) { + return 0 + } + p = this.selection.getSel(); + return (!p || !p.rangeCount || p.rangeCount == 0) + } + }) +})(tinymce); +(function(c) { + var d = c.each, + e, a = true, + b = false; + c.EditorCommands = function(n) { + var l = n.dom, + p = n.selection, + j = { + state: {}, + exec: {}, + value: {} + }, + k = n.settings, + o; + + function q(y, x, v) { + var u; + y = y.toLowerCase(); + if (u = j.exec[y]) { + u(y, x, v); + return a + } + return b + } + function m(v) { + var u; + v = v.toLowerCase(); + if (u = j.state[v]) { + return u(v) + } + return -1 + } + function h(v) { + var u; + v = v.toLowerCase(); + if (u = j.value[v]) { + return u(v) + } + return b + } + function t(u, v) { + v = v || "exec"; + d(u, function(y, x) { + d(x.toLowerCase().split(","), function(z) { + j[v][z] = y + }) + }) + } + c.extend(this, { + execCommand: q, + queryCommandState: m, + queryCommandValue: h, + addCommands: t + }); + + function f(x, v, u) { + if (v === e) { + v = b + } + if (u === e) { + u = null + } + return n.getDoc().execCommand(x, v, u) + } + function s(u) { + return n.formatter.match(u) + } + function r(u, v) { + n.formatter.toggle(u, v ? { + value: v + } : e) + } + function i(u) { + o = p.getBookmark(u) + } + function g() { + p.moveToBookmark(o) + } + t({ + "mceResetDesignMode,mceBeginUndoLevel": function() {}, + "mceEndUndoLevel,mceAddUndoLevel": function() { + n.undoManager.add() + }, + "Cut,Copy,Paste": function(y) { + var x = n.getDoc(), + u; + try { + f(y) + } catch (v) { + u = a + } + if (u || !x.queryCommandSupported(y)) { + if (c.isGecko) { + n.windowManager.confirm(n.getLang("clipboard_msg"), function(z) { + if (z) { + open("http://www.mozilla.org/editor/midasdemo/securityprefs.html", "_blank") + } + }) + } else { + n.windowManager.alert(n.getLang("clipboard_no_support")) + } + } + }, + unlink: function(u) { + if (p.isCollapsed()) { + p.select(p.getNode()) + } + f(u); + p.collapse(b) + }, + "JustifyLeft,JustifyCenter,JustifyRight,JustifyFull": function(u) { + var v = u.substring(7); + d("left,center,right,full".split(","), function(x) { + if (v != x) { + n.formatter.remove("align" + x) + } + }); + r("align" + v); + q("mceRepaint") + }, + "InsertUnorderedList,InsertOrderedList": function(x) { + var u, v; + f(x); + u = l.getParent(p.getNode(), "ol,ul"); + if (u) { + v = u.parentNode; + if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(v.nodeName)) { + i(); + l.split(v, u); + g() + } + } + }, + "Bold,Italic,Underline,Strikethrough,Superscript,Subscript": function(u) { + r(u) + }, + "ForeColor,HiliteColor,FontName": function(x, v, u) { + r(x, u) + }, + FontSize: function(y, x, v) { + var u, z; + if (v >= 1 && v <= 7) { + z = c.explode(k.font_size_style_values); + u = c.explode(k.font_size_classes); + if (u) { + v = u[v - 1] || v + } else { + v = z[v - 1] || v + } + } + r(y, v) + }, + RemoveFormat: function(u) { + n.formatter.remove(u) + }, + mceBlockQuote: function(u) { + r("blockquote") + }, + FormatBlock: function(x, v, u) { + return r(u || "p") + }, + mceCleanup: function() { + var u = p.getBookmark(); + n.setContent(n.getContent({ + cleanup: a + }), { + cleanup: a + }); + p.moveToBookmark(u) + }, + mceRemoveNode: function(y, x, v) { + var u = v || p.getNode(); + if (u != n.getBody()) { + i(); + n.dom.remove(u, a); + g() + } + }, + mceSelectNodeDepth: function(y, x, v) { + var u = 0; + l.getParent(p.getNode(), function(z) { + if (z.nodeType == 1 && u++ == v) { + p.select(z); + return b + } + }, n.getBody()) + }, + mceSelectNode: function(x, v, u) { + p.select(u) + }, + mceInsertContent: function(z, D, E) { + var C, u, x, F, y, u, A, G, B; + + function v(H, J) { + var I, K = new c.dom.TreeWalker(H, J); + while ((I = K.current())) { + if ((I.nodeType == 3 && c.trim(I.nodeValue).length) || I.nodeName == "BR" || I.nodeName == "IMG") { + return I + } + K.prev() + } + } + B = { + content: E, + format: "html" + }; + p.onBeforeSetContent.dispatch(p, B); + E = B.content; + if (E.indexOf("{$caret}") == -1) { + E += "{$caret}" + } + p.setContent('<span id="__mce">\uFEFF</span>', { + no_events: false + }); + l.setOuterHTML("__mce", E.replace(/\{\$caret\}/, '<span data-mce-type="bookmark" id="__mce">\uFEFF</span>')); + C = l.select("#__mce")[0]; + x = l.getRoot(); + if (C.previousSibling && l.isBlock(C.previousSibling) || C.parentNode == x) { + y = v(C.previousSibling, x); + if (y) { + if (y.nodeName == "BR") { + y.parentNode.insertBefore(C, y) + } else { + l.insertAfter(C, y) + } + } + } + while (C) { + if (C === x) { + l.setOuterHTML(F, new c.html.Serializer({}, n.schema).serialize(new c.html.DomParser({ + remove_trailing_brs: true + }, n.schema).parse(l.getOuterHTML(F)))); + break + } + F = C; + C = C.parentNode + } + C = l.select("#__mce")[0]; + if (C) { + y = v(C.previousSibling, x); + l.remove(C); + if (y) { + u = l.createRng(); + if (y.nodeType == 3) { + u.setStart(y, y.length); + u.setEnd(y, y.length) + } else { + if (y.nodeName == "BR") { + u.setStartBefore(y); + u.setEndBefore(y) + } else { + u.setStartAfter(y); + u.setEndAfter(y) + } + } + p.setRng(u); + if (!c.isIE) { + y = l.create("span", null, "\u00a0"); + u.insertNode(y); + A = l.getRect(y); + G = l.getViewPort(n.getWin()); + if ((A.y > G.y + G.h || A.y < G.y) || (A.x > G.x + G.w || A.x < G.x)) { + n.getBody().scrollLeft = A.x; + n.getBody().scrollTop = A.y + } + l.remove(y) + } + p.collapse(true) + } + } + p.onSetContent.dispatch(p, B); + n.addVisual() + }, + mceInsertRawHTML: function(x, v, u) { + p.setContent("tiny_mce_marker"); + n.setContent(n.getContent().replace(/tiny_mce_marker/g, function() { + return u + })) + }, + mceSetContent: function(x, v, u) { + n.setContent(u) + }, + "Indent,Outdent": function(y) { + var v, u, x; + v = k.indentation; + u = /[a-z%]+$/i.exec(v); + v = parseInt(v); + if (!m("InsertUnorderedList") && !m("InsertOrderedList")) { + d(p.getSelectedBlocks(), function(z) { + if (y == "outdent") { + x = Math.max(0, parseInt(z.style.paddingLeft || 0) - v); + l.setStyle(z, "paddingLeft", x ? x + u : "") + } else { + l.setStyle(z, "paddingLeft", (parseInt(z.style.paddingLeft || 0) + v) + u) + } + }) + } else { + f(y) + } + }, + mceRepaint: function() { + var v; + if (c.isGecko) { + try { + i(a); + if (p.getSel()) { + p.getSel().selectAllChildren(n.getBody()) + } + p.collapse(a); + g() + } catch (u) {} + } + }, + mceToggleFormat: function(x, v, u) { + n.formatter.toggle(u) + }, + InsertHorizontalRule: function() { + n.execCommand("mceInsertContent", false, "<hr />") + }, + mceToggleVisualAid: function() { + n.hasVisual = !n.hasVisual; + n.addVisual() + }, + mceReplaceContent: function(x, v, u) { + n.execCommand("mceInsertContent", false, p.setContent(u.replace(/\{\$selection\}/g, p.getContent({ + format: "text" + })))) + }, + mceInsertLink: function(A, z, y) { + var x = l.getParent(p.getNode(), "a"), + v, u; + if (c.is(y, "string")) { + y = { + href: y + } + } + y.href = y.href.replace(" ", "%20"); + if (!x) { + if (c.isWebKit) { + v = l.getParent(p.getNode(), "img"); + if (v) { + u = v.style.cssFloat; + v.style.cssFloat = null + } + } + f("CreateLink", b, "javascript:mctmp(0);"); + if (u) { + v.style.cssFloat = u + } + d(l.select("a[href='javascript:mctmp(0);']"), function(B) { + l.setAttribs(B, y) + }) + } else { + if (y.href) { + l.setAttribs(x, y) + } else { + n.dom.remove(x, a) + } + } + }, + selectAll: function() { + var v = l.getRoot(), + u = l.createRng(); + u.setStart(v, 0); + u.setEnd(v, v.childNodes.length); + n.selection.setRng(u) + } + }); + t({ + "JustifyLeft,JustifyCenter,JustifyRight,JustifyFull": function(u) { + return s("align" + u.substring(7)) + }, + "Bold,Italic,Underline,Strikethrough,Superscript,Subscript": function(u) { + return s(u) + }, + mceBlockQuote: function() { + return s("blockquote") + }, + Outdent: function() { + var u; + if (k.inline_styles) { + if ((u = l.getParent(p.getStart(), l.isBlock)) && parseInt(u.style.paddingLeft) > 0) { + return a + } + if ((u = l.getParent(p.getEnd(), l.isBlock)) && parseInt(u.style.paddingLeft) > 0) { + return a + } + } + return m("InsertUnorderedList") || m("InsertOrderedList") || (!k.inline_styles && !! l.getParent(p.getNode(), "BLOCKQUOTE")) + }, + "InsertUnorderedList,InsertOrderedList": function(u) { + return l.getParent(p.getNode(), u == "insertunorderedlist" ? "UL" : "OL") + } + }, "state"); + t({ + "FontSize,FontName": function(x) { + var v = 0, + u; + if (u = l.getParent(p.getNode(), "span")) { + if (x == "fontsize") { + v = u.style.fontSize + } else { + v = u.style.fontFamily.replace(/, /g, ",").replace(/[\'\"]/g, "").toLowerCase() + } + } + return v + } + }, "value"); + if (k.custom_undo_redo) { + t({ + Undo: function() { + n.undoManager.undo() + }, + Redo: function() { + n.undoManager.redo() + } + }) + } + } +})(tinymce); +(function(b) { + var a = b.util.Dispatcher; + b.UndoManager = function(e) { + var c, d = 0, + g = []; + + function f() { + return b.trim(e.getContent({ + format: "raw", + no_events: 1 + })) + } + return c = { + typing: false, + onAdd: new a(c), + onUndo: new a(c), + onRedo: new a(c), + beforeChange: function() { + if (g[d]) { + g[d].beforeBookmark = e.selection.getBookmark(2, true) + } + }, + add: function(l) { + var h, j = e.settings, + k; + l = l || {}; + l.content = f(); + k = g[d]; + if (k && k.content == l.content) { + return null + } + if (j.custom_undo_redo_levels) { + if (g.length > j.custom_undo_redo_levels) { + for (h = 0; h < g.length - 1; h++) { + g[h] = g[h + 1] + } + g.length--; + d = g.length + } + } + l.bookmark = e.selection.getBookmark(2, true); + if (d < g.length - 1) { + g.length = d + 1 + } + g.push(l); + d = g.length - 1; + c.onAdd.dispatch(c, l); + e.isNotDirty = 0; + return l + }, + undo: function() { + var j, h; + if (c.typing) { + c.add(); + c.typing = false + } + if (d > 0) { + j = g[--d]; + e.setContent(j.content, { + format: "raw" + }); + e.selection.moveToBookmark(j.beforeBookmark); + c.onUndo.dispatch(c, j) + } + return j + }, + redo: function() { + var h; + if (d < g.length - 1) { + h = g[++d]; + e.setContent(h.content, { + format: "raw" + }); + e.selection.moveToBookmark(h.bookmark); + c.onRedo.dispatch(c, h) + } + return h + }, + clear: function() { + g = []; + d = 0; + c.typing = false + }, + hasUndo: function() { + return d > 0 || this.typing + }, + hasRedo: function() { + return d < g.length - 1 && !this.typing + } + } + } +})(tinymce); +(function(m) { + var k = m.dom.Event, + c = m.isIE, + a = m.isGecko, + b = m.isOpera, + j = m.each, + i = m.extend, + d = true, + h = false; + + function l(p) { + var q, o, n; + do { + if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(p.nodeName)) { + if (q) { + o = p.cloneNode(false); + o.appendChild(q); + q = o + } else { + q = n = p.cloneNode(false) + } + q.removeAttribute("id") + } + } while (p = p.parentNode); + if (q) { + return { + wrapper: q, + inner: n + } + } + } + function g(o, p) { + var n = p.ownerDocument.createRange(); + n.setStart(o.endContainer, o.endOffset); + n.setEndAfter(p); + return n.cloneContents().textContent.length == 0 + } + function f(o) { + o = o.innerHTML; + o = o.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, "-"); + o = o.replace(/<[^>]+>/g, ""); + return o.replace(/[ \u00a0\t\r\n]+/g, "") == "" + } + function e(p, r, n) { + var o, q; + if (f(n)) { + o = r.getParent(n, "ul,ol"); + if (!r.getParent(o.parentNode, "ul,ol")) { + r.split(o, n); + q = r.create("p", 0, '<br data-mce-bogus="1" />'); + r.replace(q, n); + p.select(q, 1) + } + return h + } + return d + } + m.create("tinymce.ForceBlocks", { + ForceBlocks: function(n) { + var o = this, + p = n.settings, + q; + o.editor = n; + o.dom = n.dom; + q = (p.forced_root_block || "p").toLowerCase(); + p.element = q.toUpperCase(); + n.onPreInit.add(o.setup, o); + if (p.forced_root_block) { + n.onInit.add(o.forceRoots, o); + n.onSetContent.add(o.forceRoots, o); + n.onBeforeGetContent.add(o.forceRoots, o); + n.onExecCommand.add(function(r, s) { + if (s == "mceInsertContent") { + o.forceRoots(); + r.nodeChanged() + } + }) + } + }, + setup: function() { + var o = this, + n = o.editor, + q = n.settings, + u = n.dom, + p = n.selection; + if (q.forced_root_block) { + n.onBeforeExecCommand.add(o.forceRoots, o); + n.onKeyUp.add(o.forceRoots, o); + n.onPreProcess.add(o.forceRoots, o) + } + if (q.force_br_newlines) { + if (c) { + n.onKeyPress.add(function(s, t) { + var v; + if (t.keyCode == 13 && p.getNode().nodeName != "LI") { + p.setContent('<br id="__" /> ', { + format: "raw" + }); + v = u.get("__"); + v.removeAttribute("id"); + p.select(v); + p.collapse(); + return k.cancel(t) + } + }) + } + } + if (q.force_p_newlines) { + if (!c) { + n.onKeyPress.add(function(s, t) { + if (t.keyCode == 13 && !t.shiftKey && !o.insertPara(t)) { + k.cancel(t) + } + }) + } else { + m.addUnload(function() { + o._previousFormats = 0 + }); + n.onKeyPress.add(function(s, t) { + o._previousFormats = 0; + if (t.keyCode == 13 && !t.shiftKey && s.selection.isCollapsed() && q.keep_styles) { + o._previousFormats = l(s.selection.getStart()) + } + }); + n.onKeyUp.add(function(t, x) { + if (x.keyCode == 13 && !x.shiftKey) { + var v = t.selection.getStart(), + s = o._previousFormats; + if (!v.hasChildNodes() && s) { + v = u.getParent(v, u.isBlock); + if (v && v.nodeName != "LI") { + v.innerHTML = ""; + if (o._previousFormats) { + v.appendChild(s.wrapper); + s.inner.innerHTML = "\uFEFF" + } else { + v.innerHTML = "\uFEFF" + } + p.select(v, 1); + p.collapse(true); + t.getDoc().execCommand("Delete", false, null); + o._previousFormats = 0 + } + } + } + }) + } + if (a) { + n.onKeyDown.add(function(s, t) { + if ((t.keyCode == 8 || t.keyCode == 46) && !t.shiftKey) { + o.backspaceDelete(t, t.keyCode == 8) + } + }) + } + } + if (m.isWebKit) { + function r(t) { + var s = p.getRng(), + v, z = u.create("div", null, " "), + y, x = u.getViewPort(t.getWin()).h; + s.insertNode(v = u.create("br")); + s.setStartAfter(v); + s.setEndAfter(v); + p.setRng(s); + if (p.getSel().focusNode == v.previousSibling) { + p.select(u.insertAfter(u.doc.createTextNode("\u00a0"), v)); + p.collapse(d) + } + u.insertAfter(z, v); + y = u.getPos(z).y; + u.remove(z); + if (y > x) { + t.getWin().scrollTo(0, y) + } + } + n.onKeyPress.add(function(s, t) { + if (t.keyCode == 13 && (t.shiftKey || (q.force_br_newlines && !u.getParent(p.getNode(), "h1,h2,h3,h4,h5,h6,ol,ul")))) { + r(s); + k.cancel(t) + } + }) + } + if (c) { + if (q.element != "P") { + n.onKeyPress.add(function(s, t) { + o.lastElm = p.getNode().nodeName + }); + n.onKeyUp.add(function(t, v) { + var y, x = p.getNode(), + s = t.getBody(); + if (s.childNodes.length === 1 && x.nodeName == "P") { + x = u.rename(x, q.element); + p.select(x); + p.collapse(); + t.nodeChanged() + } else { + if (v.keyCode == 13 && !v.shiftKey && o.lastElm != "P") { + y = u.getParent(x, "p"); + if (y) { + u.rename(y, q.element); + t.nodeChanged() + } + } + } + }) + } + } + }, + find: function(v, q, r) { + var p = this.editor, + o = p.getDoc().createTreeWalker(v, 4, null, h), + u = -1; + while (v = o.nextNode()) { + u++; + if (q == 0 && v == r) { + return u + } + if (q == 1 && u == r) { + return v + } + } + return -1 + }, + forceRoots: function(x, I) { + var z = this, + x = z.editor, + M = x.getBody(), + J = x.getDoc(), + P = x.selection, + A = P.getSel(), + B = P.getRng(), + N = -2, + v, G, o, p, K = -16777215; + var L, q, O, F, C, u = M.childNodes, + E, D, y; + for (E = u.length - 1; E >= 0; E--) { + L = u[E]; + if (L.nodeType === 1 && L.getAttribute("data-mce-type")) { + q = null; + continue + } + if (L.nodeType === 3 || (!z.dom.isBlock(L) && L.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(L.nodeName))) { + if (!q) { + if (L.nodeType != 3 || /[^\s]/g.test(L.nodeValue)) { + if (N == -2 && B) { + if (!c || B.setStart) { + if (B.startContainer.nodeType == 1 && (D = B.startContainer.childNodes[B.startOffset]) && D.nodeType == 1) { + y = D.getAttribute("id"); + D.setAttribute("id", "__mce") + } else { + if (x.dom.getParent(B.startContainer, function(n) { + return n === M + })) { + G = B.startOffset; + o = B.endOffset; + N = z.find(M, 0, B.startContainer); + v = z.find(M, 0, B.endContainer) + } + } + } else { + if (B.item) { + p = J.body.createTextRange(); + p.moveToElementText(B.item(0)); + B = p + } + p = J.body.createTextRange(); + p.moveToElementText(M); + p.collapse(1); + O = p.move("character", K) * -1; + p = B.duplicate(); + p.collapse(1); + F = p.move("character", K) * -1; + p = B.duplicate(); + p.collapse(0); + C = (p.move("character", K) * -1) - F; + N = F - O; + v = C + } + } + q = x.dom.create(x.settings.forced_root_block); + L.parentNode.replaceChild(q, L); + q.appendChild(L) + } + } else { + if (q.hasChildNodes()) { + q.insertBefore(L, q.firstChild) + } else { + q.appendChild(L) + } + } + } else { + q = null + } + } + if (N != -2) { + if (!c || B.setStart) { + q = M.getElementsByTagName(x.settings.element)[0]; + B = J.createRange(); + if (N != -1) { + B.setStart(z.find(M, 1, N), G) + } else { + B.setStart(q, 0) + } + if (v != -1) { + B.setEnd(z.find(M, 1, v), o) + } else { + B.setEnd(q, 0) + } + if (A) { + A.removeAllRanges(); + A.addRange(B) + } + } else { + try { + B = A.createRange(); + B.moveToElementText(M); + B.collapse(1); + B.moveStart("character", N); + B.moveEnd("character", v); + B.select() + } catch (H) {} + } + } else { + if ((!c || B.setStart) && (D = x.dom.get("__mce"))) { + if (y) { + D.setAttribute("id", y) + } else { + D.removeAttribute("id") + } + B = J.createRange(); + B.setStartBefore(D); + B.setEndBefore(D); + P.setRng(B) + } + } + }, + getParentBlock: function(p) { + var o = this.dom; + return o.getParent(p, o.isBlock) + }, + insertPara: function(S) { + var G = this, + x = G.editor, + O = x.dom, + T = x.getDoc(), + X = x.settings, + H = x.selection.getSel(), + I = H.getRangeAt(0), + W = T.body; + var L, M, J, Q, P, u, p, v, A, o, E, V, q, z, K, N = O.getViewPort(x.getWin()), + D, F, C; + x.undoManager.beforeChange(); + L = T.createRange(); + L.setStart(H.anchorNode, H.anchorOffset); + L.collapse(d); + M = T.createRange(); + M.setStart(H.focusNode, H.focusOffset); + M.collapse(d); + J = L.compareBoundaryPoints(L.START_TO_END, M) < 0; + Q = J ? H.anchorNode : H.focusNode; + P = J ? H.anchorOffset : H.focusOffset; + u = J ? H.focusNode : H.anchorNode; + p = J ? H.focusOffset : H.anchorOffset; + if (Q === u && /^(TD|TH)$/.test(Q.nodeName)) { + if (Q.firstChild.nodeName == "BR") { + O.remove(Q.firstChild) + } + if (Q.childNodes.length == 0) { + x.dom.add(Q, X.element, null, "<br />"); + V = x.dom.add(Q, X.element, null, "<br />") + } else { + K = Q.innerHTML; + Q.innerHTML = ""; + x.dom.add(Q, X.element, null, K); + V = x.dom.add(Q, X.element, null, "<br />") + } + I = T.createRange(); + I.selectNodeContents(V); + I.collapse(1); + x.selection.setRng(I); + return h + } + if (Q == W && u == W && W.firstChild && x.dom.isBlock(W.firstChild)) { + Q = u = Q.firstChild; + P = p = 0; + L = T.createRange(); + L.setStart(Q, 0); + M = T.createRange(); + M.setStart(u, 0) + } + Q = Q.nodeName == "HTML" ? T.body : Q; + Q = Q.nodeName == "BODY" ? Q.firstChild : Q; + u = u.nodeName == "HTML" ? T.body : u; + u = u.nodeName == "BODY" ? u.firstChild : u; + v = G.getParentBlock(Q); + A = G.getParentBlock(u); + o = v ? v.nodeName : X.element; + if (K = G.dom.getParent(v, "li,pre")) { + if (K.nodeName == "LI") { + return e(x.selection, G.dom, K) + } + return d + } + if (v && (v.nodeName == "CAPTION" || /absolute|relative|fixed/gi.test(O.getStyle(v, "position", 1)))) { + o = X.element; + v = null + } + if (A && (A.nodeName == "CAPTION" || /absolute|relative|fixed/gi.test(O.getStyle(v, "position", 1)))) { + o = X.element; + A = null + } + if (/(TD|TABLE|TH|CAPTION)/.test(o) || (v && o == "DIV" && /left|right/gi.test(O.getStyle(v, "float", 1)))) { + o = X.element; + v = A = null + } + E = (v && v.nodeName == o) ? v.cloneNode(0) : x.dom.create(o); + V = (A && A.nodeName == o) ? A.cloneNode(0) : x.dom.create(o); + V.removeAttribute("id"); + if (/^(H[1-6])$/.test(o) && g(I, v)) { + V = x.dom.create(X.element) + } + K = q = Q; + do { + if (K == W || K.nodeType == 9 || G.dom.isBlock(K) || /(TD|TABLE|TH|CAPTION)/.test(K.nodeName)) { + break + } + q = K + } while ((K = K.previousSibling ? K.previousSibling : K.parentNode)); + K = z = u; + do { + if (K == W || K.nodeType == 9 || G.dom.isBlock(K) || /(TD|TABLE|TH|CAPTION)/.test(K.nodeName)) { + break + } + z = K + } while ((K = K.nextSibling ? K.nextSibling : K.parentNode)); + if (q.nodeName == o) { + L.setStart(q, 0) + } else { + L.setStartBefore(q) + } + L.setEnd(Q, P); + E.appendChild(L.cloneContents() || T.createTextNode("")); + try { + M.setEndAfter(z) + } catch (R) {} + M.setStart(u, p); + V.appendChild(M.cloneContents() || T.createTextNode("")); + I = T.createRange(); + if (!q.previousSibling && q.parentNode.nodeName == o) { + I.setStartBefore(q.parentNode) + } else { + if (L.startContainer.nodeName == o && L.startOffset == 0) { + I.setStartBefore(L.startContainer) + } else { + I.setStart(L.startContainer, L.startOffset) + } + } + if (!z.nextSibling && z.parentNode.nodeName == o) { + I.setEndAfter(z.parentNode) + } else { + I.setEnd(M.endContainer, M.endOffset) + } + I.deleteContents(); + if (b) { + x.getWin().scrollTo(0, N.y) + } + if (E.firstChild && E.firstChild.nodeName == o) { + E.innerHTML = E.firstChild.innerHTML + } + if (V.firstChild && V.firstChild.nodeName == o) { + V.innerHTML = V.firstChild.innerHTML + } + if (f(E)) { + E.innerHTML = "<br />" + } + function U(y, s) { + var r = [], + Z, Y, t; + y.innerHTML = ""; + if (X.keep_styles) { + Y = s; + do { + if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(Y.nodeName)) { + Z = Y.cloneNode(h); + O.setAttrib(Z, "id", ""); + r.push(Z) + } + } while (Y = Y.parentNode) + } + if (r.length > 0) { + for (t = r.length - 1, Z = y; t >= 0; t--) { + Z = Z.appendChild(r[t]) + } + r[0].innerHTML = b ? "\u00a0" : "<br />"; + return r[0] + } else { + y.innerHTML = b ? "\u00a0" : "<br />" + } + } + if (f(V)) { + C = U(V, u) + } + if (b && parseFloat(opera.version()) < 9.5) { + I.insertNode(E); + I.insertNode(V) + } else { + I.insertNode(V); + I.insertNode(E) + } + V.normalize(); + E.normalize(); + + function B(r) { + return T.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, h).nextNode() || r + } + I = T.createRange(); + I.selectNodeContents(a ? B(C || V) : C || V); + I.collapse(1); + H.removeAllRanges(); + H.addRange(I); + D = x.dom.getPos(V).y; + if (D < N.y || D + 25 > N.y + N.h) { + x.getWin().scrollTo(0, D < N.y ? D : D - N.h + 25) + } + x.undoManager.add(); + return h + }, + backspaceDelete: function(v, C) { + var D = this, + u = D.editor, + z = u.getBody(), + s = u.dom, + q, x = u.selection, + p = x.getRng(), + y = p.startContainer, + q, A, B, o; + if (!C && p.collapsed && y.nodeType == 1 && p.startOffset == y.childNodes.length) { + o = new m.dom.TreeWalker(y.lastChild, y); + for (q = y.lastChild; q; q = o.prev()) { + if (q.nodeType == 3) { + p.setStart(q, q.nodeValue.length); + p.collapse(true); + x.setRng(p); + return + } + } + } + if (y && u.dom.isBlock(y) && !/^(TD|TH)$/.test(y.nodeName) && C) { + if (y.childNodes.length == 0 || (y.childNodes.length == 1 && y.firstChild.nodeName == "BR")) { + q = y; + while ((q = q.previousSibling) && !u.dom.isBlock(q)) {} + if (q) { + if (y != z.firstChild) { + A = u.dom.doc.createTreeWalker(q, NodeFilter.SHOW_TEXT, null, h); + while (B = A.nextNode()) { + q = B + } + p = u.getDoc().createRange(); + p.setStart(q, q.nodeValue ? q.nodeValue.length : 0); + p.setEnd(q, q.nodeValue ? q.nodeValue.length : 0); + x.setRng(p); + u.dom.remove(y) + } + return k.cancel(v) + } + } + } + } + }) +})(tinymce); +(function(c) { + var b = c.DOM, + a = c.dom.Event, + d = c.each, + e = c.extend; + c.create("tinymce.ControlManager", { + ControlManager: function(f, j) { + var h = this, + g; + j = j || {}; + h.editor = f; + h.controls = {}; + h.onAdd = new c.util.Dispatcher(h); + h.onPostRender = new c.util.Dispatcher(h); + h.prefix = j.prefix || f.id + "_"; + h._cls = {}; + h.onPostRender.add(function() { + d(h.controls, function(i) { + i.postRender() + }) + }) + }, + get: function(f) { + return this.controls[this.prefix + f] || this.controls[f] + }, + setActive: function(h, f) { + var g = null; + if (g = this.get(h)) { + g.setActive(f) + } + return g + }, + setDisabled: function(h, f) { + var g = null; + if (g = this.get(h)) { + g.setDisabled(f) + } + return g + }, + add: function(g) { + var f = this; + if (g) { + f.controls[g.id] = g; + f.onAdd.dispatch(g, f) + } + return g + }, + createControl: function(i) { + var h, g = this, + f = g.editor; + d(f.plugins, function(j) { + if (j.createControl) { + h = j.createControl(i, g); + if (h) { + return false + } + } + }); + switch (i) { + case "|": + case "separator": + return g.createSeparator() + } + if (!h && f.buttons && (h = f.buttons[i])) { + return g.createButton(i, h) + } + return g.add(h) + }, + createDropMenu: function(f, n, h) { + var m = this, + i = m.editor, + j, g, k, l; + n = e({ + "class": "mceDropDown", + constrain: i.settings.constrain_menus + }, n); + n["class"] = n["class"] + " " + i.getParam("skin") + "Skin"; + if (k = i.getParam("skin_variant")) { + n["class"] += " " + i.getParam("skin") + "Skin" + k.substring(0, 1).toUpperCase() + k.substring(1) + } + f = m.prefix + f; + l = h || m._cls.dropmenu || c.ui.DropMenu; + j = m.controls[f] = new l(f, n); + j.onAddItem.add(function(r, q) { + var p = q.settings; + p.title = i.getLang(p.title, p.title); + if (!p.onclick) { + p.onclick = function(o) { + if (p.cmd) { + i.execCommand(p.cmd, p.ui || false, p.value) + } + } + } + }); + i.onRemove.add(function() { + j.destroy() + }); + if (c.isIE) { + j.onShowMenu.add(function() { + i.focus(); + g = i.selection.getBookmark(1) + }); + j.onHideMenu.add(function() { + if (g) { + i.selection.moveToBookmark(g); + g = 0 + } + }) + } + return m.add(j) + }, + createListBox: function(m, i, l) { + var h = this, + g = h.editor, + j, k, f; + if (h.get(m)) { + return null + } + i.title = g.translate(i.title); + i.scope = i.scope || g; + if (!i.onselect) { + i.onselect = function(n) { + g.execCommand(i.cmd, i.ui || false, n || i.value) + } + } + i = e({ + title: i.title, + "class": "mce_" + m, + scope: i.scope, + control_manager: h + }, i); + m = h.prefix + m; + if (g.settings.use_native_selects) { + k = new c.ui.NativeListBox(m, i) + } else { + f = l || h._cls.listbox || c.ui.ListBox; + k = new f(m, i, g) + } + h.controls[m] = k; + if (c.isWebKit) { + k.onPostRender.add(function(p, o) { + a.add(o, "mousedown", function() { + g.bookmark = g.selection.getBookmark(1) + }); + a.add(o, "focus", function() { + g.selection.moveToBookmark(g.bookmark); + g.bookmark = null + }) + }) + } + if (k.hideMenu) { + g.onMouseDown.add(k.hideMenu, k) + } + return h.add(k) + }, + createButton: function(m, i, l) { + var h = this, + g = h.editor, + j, k, f; + if (h.get(m)) { + return null + } + i.title = g.translate(i.title); + i.label = g.translate(i.label); + i.scope = i.scope || g; + if (!i.onclick && !i.menu_button) { + i.onclick = function() { + g.execCommand(i.cmd, i.ui || false, i.value) + } + } + i = e({ + title: i.title, + "class": "mce_" + m, + unavailable_prefix: g.getLang("unavailable", ""), + scope: i.scope, + control_manager: h + }, i); + m = h.prefix + m; + if (i.menu_button) { + f = l || h._cls.menubutton || c.ui.MenuButton; + k = new f(m, i, g); + g.onMouseDown.add(k.hideMenu, k) + } else { + f = h._cls.button || c.ui.Button; + k = new f(m, i) + } + return h.add(k) + }, + createMenuButton: function(h, f, g) { + f = f || {}; + f.menu_button = 1; + return this.createButton(h, f, g) + }, + createSplitButton: function(m, i, l) { + var h = this, + g = h.editor, + j, k, f; + if (h.get(m)) { + return null + } + i.title = g.translate(i.title); + i.scope = i.scope || g; + if (!i.onclick) { + i.onclick = function(n) { + g.execCommand(i.cmd, i.ui || false, n || i.value) + } + } + if (!i.onselect) { + i.onselect = function(n) { + g.execCommand(i.cmd, i.ui || false, n || i.value) + } + } + i = e({ + title: i.title, + "class": "mce_" + m, + scope: i.scope, + control_manager: h + }, i); + m = h.prefix + m; + f = l || h._cls.splitbutton || c.ui.SplitButton; + k = h.add(new f(m, i, g)); + g.onMouseDown.add(k.hideMenu, k); + return k + }, + createColorSplitButton: function(f, n, h) { + var l = this, + j = l.editor, + i, k, m, g; + if (l.get(f)) { + return null + } + n.title = j.translate(n.title); + n.scope = n.scope || j; + if (!n.onclick) { + n.onclick = function(o) { + if (c.isIE) { + g = j.selection.getBookmark(1) + } + j.execCommand(n.cmd, n.ui || false, o || n.value) + } + } + if (!n.onselect) { + n.onselect = function(o) { + j.execCommand(n.cmd, n.ui || false, o || n.value) + } + } + n = e({ + title: n.title, + "class": "mce_" + f, + menu_class: j.getParam("skin") + "Skin", + scope: n.scope, + more_colors_title: j.getLang("more_colors") + }, n); + f = l.prefix + f; + m = h || l._cls.colorsplitbutton || c.ui.ColorSplitButton; + k = new m(f, n, j); + j.onMouseDown.add(k.hideMenu, k); + j.onRemove.add(function() { + k.destroy() + }); + if (c.isIE) { + k.onShowMenu.add(function() { + j.focus(); + g = j.selection.getBookmark(1) + }); + k.onHideMenu.add(function() { + if (g) { + j.selection.moveToBookmark(g); + g = 0 + } + }) + } + return l.add(k) + }, + createToolbar: function(k, h, j) { + var i, g = this, + f; + k = g.prefix + k; + f = j || g._cls.toolbar || c.ui.Toolbar; + i = new f(k, h, g.editor); + if (g.get(k)) { + return null + } + return g.add(i) + }, + createToolbarGroup: function(k, h, j) { + var i, g = this, + f; + k = g.prefix + k; + f = j || this._cls.toolbarGroup || c.ui.ToolbarGroup; + i = new f(k, h, g.editor); + if (g.get(k)) { + return null + } + return g.add(i) + }, + createSeparator: function(g) { + var f = g || this._cls.separator || c.ui.Separator; + return new f() + }, + setControlType: function(g, f) { + return this._cls[g.toLowerCase()] = f + }, + destroy: function() { + d(this.controls, function(f) { + f.destroy() + }); + this.controls = null + } + }) +})(tinymce); +(function(d) { + var a = d.util.Dispatcher, + e = d.each, + c = d.isIE, + b = d.isOpera; + d.create("tinymce.WindowManager", { + WindowManager: function(f) { + var g = this; + g.editor = f; + g.onOpen = new a(g); + g.onClose = new a(g); + g.params = {}; + g.features = {} + }, + open: function(z, h) { + var v = this, + k = "", + n, m, i = v.editor.settings.dialog_type == "modal", + q, o, j, g = d.DOM.getViewPort(), + r; + z = z || {}; + h = h || {}; + o = b ? g.w : screen.width; + j = b ? g.h : screen.height; + z.name = z.name || "mc_" + new Date().getTime(); + z.width = parseInt(z.width || 320); + z.height = parseInt(z.height || 240); + z.resizable = true; + z.left = z.left || parseInt(o / 2) - (z.width / 2); + z.top = z.top || parseInt(j / 2) - (z.height / 2); + h.inline = false; + h.mce_width = z.width; + h.mce_height = z.height; + h.mce_auto_focus = z.auto_focus; + if (i) { + if (c) { + z.center = true; + z.help = false; + z.dialogWidth = z.width + "px"; + z.dialogHeight = z.height + "px"; + z.scroll = z.scrollbars || false + } + } + e(z, function(p, f) { + if (d.is(p, "boolean")) { + p = p ? "yes" : "no" + } + if (!/^(name|url)$/.test(f)) { + if (c && i) { + k += (k ? ";" : "") + f + ":" + p + } else { + k += (k ? "," : "") + f + "=" + p + } + } + }); + v.features = z; + v.params = h; + v.onOpen.dispatch(v, z, h); + r = z.url || z.file; + r = d._addVer(r); + try { + if (c && i) { + q = 1; + window.showModalDialog(r, window, k) + } else { + q = window.open(r, z.name, k) + } + } catch (l) {} + if (!q) { + alert(v.editor.getLang("popup_blocked")) + } + }, + close: function(f) { + f.close(); + this.onClose.dispatch(this) + }, + createInstance: function(i, h, g, m, l, k) { + var j = d.resolve(i); + return new j(h, g, m, l, k) + }, + confirm: function(h, f, i, g) { + g = g || window; + f.call(i || this, g.confirm(this._decode(this.editor.getLang(h, h)))) + }, + alert: function(h, f, j, g) { + var i = this; + g = g || window; + g.alert(i._decode(i.editor.getLang(h, h))); + if (f) { + f.call(j || i) + } + }, + resizeBy: function(f, g, h) { + h.resizeBy(f, g) + }, + _decode: function(f) { + return d.DOM.decode(f).replace(/\\n/g, "\n") + } + }) +}(tinymce)); +(function(a) { + a.Formatter = function(V) { + var M = {}, + O = a.each, + c = V.dom, + q = V.selection, + t = a.dom.TreeWalker, + K = new a.dom.RangeUtils(c), + d = V.schema.isValidChild, + F = c.isBlock, + l = V.settings.forced_root_block, + s = c.nodeIndex, + E = "\uFEFF", + e = /^(src|href|style)$/, + S = false, + B = true, + p, P = { + apply: [], + remove: [] + }; + + function z(W) { + return W instanceof Array + } + function m(X, W) { + return c.getParents(X, W, c.getRoot()) + } + function b(W) { + return W.nodeType === 1 && (W.face === "mceinline" || W.style.fontFamily === "mceinline") + } + function R(W) { + return W ? M[W] : M + } + function k(W, X) { + if (W) { + if (typeof(W) !== "string") { + O(W, function(Z, Y) { + k(Y, Z) + }) + } else { + X = X.length ? X : [X]; + O(X, function(Y) { + if (Y.deep === p) { + Y.deep = !Y.selector + } + if (Y.split === p) { + Y.split = !Y.selector || Y.inline + } + if (Y.remove === p && Y.selector && !Y.inline) { + Y.remove = "none" + } + if (Y.selector && Y.inline) { + Y.mixed = true; + Y.block_expand = true + } + if (typeof(Y.classes) === "string") { + Y.classes = Y.classes.split(/\s+/) + } + }); + M[W] = X + } + } + } + var i = function(X) { + var W; + V.dom.getParent(X, function(Y) { + W = V.dom.getStyle(Y, "text-decoration"); + return W && W !== "none" + }); + return W + }; + var I = function(W) { + var X; + if (W.nodeType === 1 && W.parentNode && W.parentNode.nodeType === 1) { + X = i(W.parentNode); + if (V.dom.getStyle(W, "color") && X) { + V.dom.setStyle(W, "text-decoration", X) + } else { + if (V.dom.getStyle(W, "textdecoration") === X) { + V.dom.setStyle(W, "text-decoration", null) + } + } + } + }; + + function T(Y, af, aa) { + var ab = R(Y), + ag = ab[0], + ae, X, ad, ac = q.isCollapsed(); + + function Z(ak) { + var aj = ak.startContainer, + an = ak.startOffset, + am, al; + if (aj.nodeType == 1 || aj.nodeValue === "") { + aj = aj.nodeType == 1 ? aj.childNodes[an] : aj; + if (aj) { + am = new t(aj, aj.parentNode); + for (al = am.current(); al; al = am.next()) { + if (al.nodeType == 3 && !f(al)) { + ak.setStart(al, 0); + break + } + } + } + } + return ak + } + function W(ak, aj) { + aj = aj || ag; + if (ak) { + O(aj.styles, function(am, al) { + c.setStyle(ak, al, r(am, af)) + }); + O(aj.attributes, function(am, al) { + c.setAttrib(ak, al, r(am, af)) + }); + O(aj.classes, function(al) { + al = r(al, af); + if (!c.hasClass(ak, al)) { + c.addClass(ak, al) + } + }) + } + } + function ah(ak) { + var aj = [], + am, al; + am = ag.inline || ag.block; + al = c.create(am); + W(al); + K.walk(ak, function(an) { + var ao; + + function ap(aq) { + var au = aq.nodeName.toLowerCase(), + at = aq.parentNode.nodeName.toLowerCase(), + ar; + if (g(au, "br")) { + ao = 0; + if (ag.block) { + c.remove(aq) + } + return + } + if (ag.wrapper && x(aq, Y, af)) { + ao = 0; + return + } + if (ag.block && !ag.wrapper && G(au)) { + aq = c.rename(aq, am); + W(aq); + aj.push(aq); + ao = 0; + return + } + if (ag.selector) { + O(ab, function(av) { + if ("collapsed" in av && av.collapsed !== ac) { + return + } + if (c.is(aq, av.selector) && !b(aq)) { + W(aq, av); + ar = true + } + }); + if (!ag.inline || ar) { + ao = 0; + return + } + } + if (d(am, au) && d(at, am) && !(aq.nodeType === 3 && aq.nodeValue.length === 1 && aq.nodeValue.charCodeAt(0) === 65279)) { + if (!ao) { + ao = al.cloneNode(S); + aq.parentNode.insertBefore(ao, aq); + aj.push(ao) + } + ao.appendChild(aq) + } else { + ao = 0; + O(a.grep(aq.childNodes), ap); + ao = 0 + } + } + O(an, ap) + }); + if (ag.wrap_links === false) { + O(aj, function(an) { + function ao(at) { + var ar, aq, ap; + if (at.nodeName === "A") { + aq = al.cloneNode(S); + aj.push(aq); + ap = a.grep(at.childNodes); + for (ar = 0; ar < ap.length; ar++) { + aq.appendChild(ap[ar]) + } + at.appendChild(aq) + } + O(a.grep(at.childNodes), ao) + } + ao(an) + }) + } + O(aj, function(ap) { + var an; + + function aq(at) { + var ar = 0; + O(at.childNodes, function(au) { + if (!f(au) && !H(au)) { + ar++ + } + }); + return ar + } + function ao(ar) { + var au, at; + O(ar.childNodes, function(av) { + if (av.nodeType == 1 && !H(av) && !b(av)) { + au = av; + return S + } + }); + if (au && h(au, ag)) { + at = au.cloneNode(S); + W(at); + c.replace(at, ar, B); + c.remove(au, 1) + } + return at || ar + } + an = aq(ap); + if ((aj.length > 1 || !F(ap)) && an === 0) { + c.remove(ap, 1); + return + } + if (ag.inline || ag.wrapper) { + if (!ag.exact && an === 1) { + ap = ao(ap) + } + O(ab, function(ar) { + O(c.select(ar.inline, ap), function(au) { + var at; + if (ar.wrap_links === false) { + at = au.parentNode; + do { + if (at.nodeName === "A") { + return + } + } while (at = at.parentNode) + } + U(ar, af, au, ar.exact ? au : null) + }) + }); + if (x(ap.parentNode, Y, af)) { + c.remove(ap, 1); + ap = 0; + return B + } + if (ag.merge_with_parents) { + c.getParent(ap.parentNode, function(ar) { + if (x(ar, Y, af)) { + c.remove(ap, 1); + ap = 0; + return B + } + }) + } + if (ap) { + ap = u(C(ap), ap); + ap = u(ap, C(ap, B)) + } + } + }) + } + if (ag) { + if (aa) { + X = c.createRng(); + X.setStartBefore(aa); + X.setEndAfter(aa); + ah(o(X, ab)) + } else { + if (!ac || !ag.inline || c.select("td.mceSelected,th.mceSelected").length) { + var ai = V.selection.getNode(); + ae = q.getBookmark(); + ah(o(q.getRng(B), ab)); + if (ag.styles && (ag.styles.color || ag.styles.textDecoration)) { + a.walk(ai, I, "childNodes"); + I(ai) + } + q.moveToBookmark(ae); + q.setRng(Z(q.getRng(B))); + V.nodeChanged() + } else { + Q("apply", Y, af) + } + } + } + } + function A(Y, ah, ab) { + var ac = R(Y), + aj = ac[0], + ag, af, X; + + function aa(am) { + var al = am.startContainer, + ar = am.startOffset, + aq, ap, an, ao; + if (al.nodeType == 3 && ar >= al.nodeValue.length - 1) { + al = al.parentNode; + ar = s(al) + 1 + } + if (al.nodeType == 1) { + an = al.childNodes; + al = an[Math.min(ar, an.length - 1)]; + aq = new t(al); + if (ar > an.length - 1) { + aq.next() + } + for (ap = aq.current(); ap; ap = aq.next()) { + if (ap.nodeType == 3 && !f(ap)) { + ao = c.create("a", null, E); + ap.parentNode.insertBefore(ao, ap); + am.setStart(ap, 0); + q.setRng(am); + c.remove(ao); + return + } + } + } + } + function Z(ao) { + var an, am, al; + an = a.grep(ao.childNodes); + for (am = 0, al = ac.length; am < al; am++) { + if (U(ac[am], ah, ao, ao)) { + break + } + } + if (aj.deep) { + for (am = 0, al = an.length; am < al; am++) { + Z(an[am]) + } + } + } + function ad(al) { + var am; + O(m(al.parentNode).reverse(), function(an) { + var ao; + if (!am && an.id != "_start" && an.id != "_end") { + ao = x(an, Y, ah); + if (ao && ao.split !== false) { + am = an + } + } + }); + return am + } + function W(ao, al, aq, au) { + var av, at, ar, an, ap, am; + if (ao) { + am = ao.parentNode; + for (av = al.parentNode; av && av != am; av = av.parentNode) { + at = av.cloneNode(S); + for (ap = 0; ap < ac.length; ap++) { + if (U(ac[ap], ah, at, at)) { + at = 0; + break + } + } + if (at) { + if (ar) { + at.appendChild(ar) + } + if (!an) { + an = at + } + ar = at + } + } + if (au && (!aj.mixed || !F(ao))) { + al = c.split(ao, al) + } + if (ar) { + aq.parentNode.insertBefore(ar, aq); + an.appendChild(aq) + } + } + return al + } + function ai(al) { + return W(ad(al), al, al, true) + } + function ae(an) { + var am = c.get(an ? "_start" : "_end"), + al = am[an ? "firstChild" : "lastChild"]; + if (H(al)) { + al = al[an ? "firstChild" : "lastChild"] + } + c.remove(am, true); + return al + } + function ak(al) { + var am, an; + al = o(al, ac, B); + if (aj.split) { + am = J(al, B); + an = J(al); + if (am != an) { + am = N(am, "span", { + id: "_start", + "data-mce-type": "bookmark" + }); + an = N(an, "span", { + id: "_end", + "data-mce-type": "bookmark" + }); + ai(am); + ai(an); + am = ae(B); + an = ae() + } else { + am = an = ai(am) + } + al.startContainer = am.parentNode; + al.startOffset = s(am); + al.endContainer = an.parentNode; + al.endOffset = s(an) + 1 + } + K.walk(al, function(ao) { + O(ao, function(ap) { + Z(ap); + if (ap.nodeType === 1 && V.dom.getStyle(ap, "text-decoration") === "underline" && ap.parentNode && i(ap.parentNode) === "underline") { + U({ + deep: false, + exact: true, + inline: "span", + styles: { + textDecoration: "underline" + } + }, null, ap) + } + }) + }) + } + if (ab) { + X = c.createRng(); + X.setStartBefore(ab); + X.setEndAfter(ab); + ak(X); + return + } + if (!q.isCollapsed() || !aj.inline || c.select("td.mceSelected,th.mceSelected").length) { + ag = q.getBookmark(); + ak(q.getRng(B)); + q.moveToBookmark(ag); + if (j(Y, ah, q.getStart())) { + aa(q.getRng(true)) + } + V.nodeChanged() + } else { + Q("remove", Y, ah) + } + } + function D(X, Z, Y) { + var W = R(X); + if (j(X, Z, Y) && (!("toggle" in W[0]) || W[0]["toggle"])) { + A(X, Z, Y) + } else { + T(X, Z, Y) + } + } + function x(X, W, ac, aa) { + var Y = R(W), + ad, ab, Z; + + function ae(ai, ak, al) { + var ah, aj, af = ak[al], + ag; + if (af) { + if (af.length === p) { + for (ah in af) { + if (af.hasOwnProperty(ah)) { + if (al === "attributes") { + aj = c.getAttrib(ai, ah) + } else { + aj = L(ai, ah) + } + if (aa && !aj && !ak.exact) { + return + } + if ((!aa || ak.exact) && !g(aj, r(af[ah], ac))) { + return + } + } + } + } else { + for (ag = 0; ag < af.length; ag++) { + if (al === "attributes" ? c.getAttrib(ai, af[ag]) : L(ai, af[ag])) { + return ak + } + } + } + } + return ak + } + if (Y && X) { + for (ab = 0; ab < Y.length; ab++) { + ad = Y[ab]; + if (h(X, ad) && ae(X, ad, "attributes") && ae(X, ad, "styles")) { + if (Z = ad.classes) { + for (ab = 0; ab < Z.length; ab++) { + if (!c.hasClass(X, Z[ab])) { + return + } + } + } + return ad + } + } + } + } + function j(Y, ab, aa) { + var X, Z; + + function W(ac) { + ac = c.getParent(ac, function(ad) { + return !!x(ad, Y, ab, true) + }); + return x(ac, Y, ab) + } + if (aa) { + return W(aa) + } + if (q.isCollapsed()) { + for (Z = P.apply.length - 1; Z >= 0; Z--) { + if (P.apply[Z].name == Y) { + return true + } + } + for (Z = P.remove.length - 1; Z >= 0; Z--) { + if (P.remove[Z].name == Y) { + return false + } + } + return W(q.getNode()) + } + aa = q.getNode(); + if (W(aa)) { + return B + } + X = q.getStart(); + if (X != aa) { + if (W(X)) { + return B + } + } + return S + } + function v(ad, ac) { + var aa, ab = [], + Z = {}, + Y, X, W; + if (q.isCollapsed()) { + for (X = 0; X < ad.length; X++) { + for (Y = P.remove.length - 1; Y >= 0; Y--) { + W = ad[X]; + if (P.remove[Y].name == W) { + Z[W] = true; + break + } + } + } + for (Y = P.apply.length - 1; Y >= 0; Y--) { + for (X = 0; X < ad.length; X++) { + W = ad[X]; + if (!Z[W] && P.apply[Y].name == W) { + Z[W] = true; + ab.push(W) + } + } + } + } + aa = q.getStart(); + c.getParent(aa, function(ag) { + var af, ae; + for (af = 0; af < ad.length; af++) { + ae = ad[af]; + if (!Z[ae] && x(ag, ae, ac)) { + Z[ae] = true; + ab.push(ae) + } + } + }); + return ab + } + function y(aa) { + var ac = R(aa), + Z, Y, ab, X, W; + if (ac) { + Z = q.getStart(); + Y = m(Z); + for (X = ac.length - 1; X >= 0; X--) { + W = ac[X].selector; + if (!W) { + return B + } + for (ab = Y.length - 1; ab >= 0; ab--) { + if (c.is(Y[ab], W)) { + return B + } + } + } + } + return S + } + a.extend(this, { + get: R, + register: k, + apply: T, + remove: A, + toggle: D, + match: j, + matchAll: v, + matchNode: x, + canApply: y + }); + + function h(W, X) { + if (g(W, X.inline)) { + return B + } + if (g(W, X.block)) { + return B + } + if (X.selector) { + return c.is(W, X.selector) + } + } + function g(X, W) { + X = X || ""; + W = W || ""; + X = "" + (X.nodeName || X); + W = "" + (W.nodeName || W); + return X.toLowerCase() == W.toLowerCase() + } + function L(X, W) { + var Y = c.getStyle(X, W); + if (W == "color" || W == "backgroundColor") { + Y = c.toHex(Y) + } + if (W == "fontWeight" && Y == 700) { + Y = "bold" + } + return "" + Y + } + function r(W, X) { + if (typeof(W) != "string") { + W = W(X) + } else { + if (X) { + W = W.replace(/%(\w+)/g, function(Z, Y) { + return X[Y] || Z + }) + } + } + return W + } + function f(W) { + return W && W.nodeType === 3 && /^([\s\r\n]+|)$/.test(W.nodeValue) + } + function N(Y, X, W) { + var Z = c.create(X, W); + Y.parentNode.insertBefore(Z, Y); + Z.appendChild(Y); + return Z + } + function o(W, ag, Z) { + var Y = W.startContainer, + ad = W.startOffset, + aj = W.endContainer, + ae = W.endOffset, + ai, af, ac; + + function ah(am, an, ak, al) { + var ao, ap; + al = al || c.getRoot(); + for (;;) { + ao = am.parentNode; + if (ao == al || (!ag[0].block_expand && F(ao))) { + return am + } + for (ai = ao[an]; ai && ai != am; ai = ai[ak]) { + if (ai.nodeType == 1 && !H(ai)) { + return am + } + if (ai.nodeType == 3 && !f(ai)) { + return am + } + } + am = am.parentNode + } + return am + } + function ab(ak, al) { + if (al === p) { + al = ak.nodeType === 3 ? ak.length : ak.childNodes.length + } + while (ak && ak.hasChildNodes()) { + ak = ak.childNodes[al]; + if (ak) { + al = ak.nodeType === 3 ? ak.length : ak.childNodes.length + } + } + return { + node: ak, + offset: al + } + } + if (Y.nodeType == 1 && Y.hasChildNodes()) { + af = Y.childNodes.length - 1; + Y = Y.childNodes[ad > af ? af : ad]; + if (Y.nodeType == 3) { + ad = 0 + } + } + if (aj.nodeType == 1 && aj.hasChildNodes()) { + af = aj.childNodes.length - 1; + aj = aj.childNodes[ae > af ? af : ae - 1]; + if (aj.nodeType == 3) { + ae = aj.nodeValue.length + } + } + if (H(Y.parentNode)) { + Y = Y.parentNode + } + if (H(Y)) { + Y = Y.nextSibling || Y + } + if (H(aj.parentNode)) { + ae = c.nodeIndex(aj); + aj = aj.parentNode + } + if (H(aj) && aj.previousSibling) { + aj = aj.previousSibling; + ae = aj.length + } + if (ag[0].inline) { + ac = ab(aj, ae); + if (ac.node) { + while (ac.node && ac.offset === 0 && ac.node.previousSibling) { + ac = ab(ac.node.previousSibling) + } + if (ac.node && ac.offset > 0 && ac.node.nodeType === 3 && ac.node.nodeValue.charAt(ac.offset - 1) === " ") { + if (ac.offset > 1) { + aj = ac.node; + aj.splitText(ac.offset - 1) + } else { + if (ac.node.previousSibling) { + aj = ac.node.previousSibling + } + } + } + } + } + if (ag[0].inline || ag[0].block_expand) { + Y = ah(Y, "firstChild", "nextSibling"); + aj = ah(aj, "lastChild", "previousSibling") + } + if (ag[0].selector && ag[0].expand !== S && !ag[0].inline) { + function aa(al, ak) { + var am, an, ap, ao; + if (al.nodeType == 3 && al.nodeValue.length == 0 && al[ak]) { + al = al[ak] + } + am = m(al); + for (an = 0; an < am.length; an++) { + for (ap = 0; ap < ag.length; ap++) { + ao = ag[ap]; + if ("collapsed" in ao && ao.collapsed !== W.collapsed) { + continue + } + if (c.is(am[an], ao.selector)) { + return am[an] + } + } + } + return al + } + Y = aa(Y, "previousSibling"); + aj = aa(aj, "nextSibling") + } + if (ag[0].block || ag[0].selector) { + function X(al, ak, an) { + var am; + if (!ag[0].wrapper) { + am = c.getParent(al, ag[0].block) + } + if (!am) { + am = c.getParent(al.nodeType == 3 ? al.parentNode : al, F) + } + if (am && ag[0].wrapper) { + am = m(am, "ul,ol").reverse()[0] || am + } + if (!am) { + am = al; + while (am[ak] && !F(am[ak])) { + am = am[ak]; + if (g(am, "br")) { + break + } + } + } + return am || al + } + Y = X(Y, "previousSibling"); + aj = X(aj, "nextSibling"); + if (ag[0].block) { + if (!F(Y)) { + Y = ah(Y, "firstChild", "nextSibling") + } + if (!F(aj)) { + aj = ah(aj, "lastChild", "previousSibling") + } + } + } + if (Y.nodeType == 1) { + ad = s(Y); + Y = Y.parentNode + } + if (aj.nodeType == 1) { + ae = s(aj) + 1; + aj = aj.parentNode + } + return { + startContainer: Y, + startOffset: ad, + endContainer: aj, + endOffset: ae + } + } + function U(ac, ab, Z, W) { + var Y, X, aa; + if (!h(Z, ac)) { + return S + } + if (ac.remove != "all") { + O(ac.styles, function(ae, ad) { + ae = r(ae, ab); + if (typeof(ad) === "number") { + ad = ae; + W = 0 + } + if (!W || g(L(W, ad), ae)) { + c.setStyle(Z, ad, "") + } + aa = 1 + }); + if (aa && c.getAttrib(Z, "style") == "") { + Z.removeAttribute("style"); + Z.removeAttribute("data-mce-style") + } + O(ac.attributes, function(af, ad) { + var ae; + af = r(af, ab); + if (typeof(ad) === "number") { + ad = af; + W = 0 + } + if (!W || g(c.getAttrib(W, ad), af)) { + if (ad == "class") { + af = c.getAttrib(Z, ad); + if (af) { + ae = ""; + O(af.split(/\s+/), function(ag) { + if (/mce\w+/.test(ag)) { + ae += (ae ? " " : "") + ag + } + }); + if (ae) { + c.setAttrib(Z, ad, ae); + return + } + } + } + if (ad == "class") { + Z.removeAttribute("className") + } + if (e.test(ad)) { + Z.removeAttribute("data-mce-" + ad) + } + Z.removeAttribute(ad) + } + }); + O(ac.classes, function(ad) { + ad = r(ad, ab); + if (!W || c.hasClass(W, ad)) { + c.removeClass(Z, ad) + } + }); + X = c.getAttribs(Z); + for (Y = 0; Y < X.length; Y++) { + if (X[Y].nodeName.indexOf("_") !== 0) { + return S + } + } + } + if (ac.remove != "none") { + n(Z, ac); + return B + } + } + function n(Y, Z) { + var W = Y.parentNode, + X; + if (Z.block) { + if (!l) { + function aa(ac, ab, ad) { + ac = C(ac, ab, ad); + return !ac || (ac.nodeName == "BR" || F(ac)) + } + if (F(Y) && !F(W)) { + if (!aa(Y, S) && !aa(Y.firstChild, B, 1)) { + Y.insertBefore(c.create("br"), Y.firstChild) + } + if (!aa(Y, B) && !aa(Y.lastChild, S, 1)) { + Y.appendChild(c.create("br")) + } + } + } else { + if (W == c.getRoot()) { + if (!Z.list_block || !g(Y, Z.list_block)) { + O(a.grep(Y.childNodes), function(ab) { + if (d(l, ab.nodeName.toLowerCase())) { + if (!X) { + X = N(ab, l) + } else { + X.appendChild(ab) + } + } else { + X = 0 + } + }) + } + } + } + } + if (Z.selector && Z.inline && !g(Z.inline, Y)) { + return + } + c.remove(Y, 1) + } + function C(X, W, Y) { + if (X) { + W = W ? "nextSibling" : "previousSibling"; + for (X = Y ? X : X[W]; X; X = X[W]) { + if (X.nodeType == 1 || !f(X)) { + return X + } + } + } + } + function H(W) { + return W && W.nodeType == 1 && W.getAttribute("data-mce-type") == "bookmark" + } + function u(aa, Z) { + var W, Y, X; + + function ac(af, ae) { + if (af.nodeName != ae.nodeName) { + return S + } + function ad(ah) { + var ai = {}; + O(c.getAttribs(ah), function(aj) { + var ak = aj.nodeName.toLowerCase(); + if (ak.indexOf("_") !== 0 && ak !== "style") { + ai[ak] = c.getAttrib(ah, ak) + } + }); + return ai + } + function ag(ak, aj) { + var ai, ah; + for (ah in ak) { + if (ak.hasOwnProperty(ah)) { + ai = aj[ah]; + if (ai === p) { + return S + } + if (ak[ah] != ai) { + return S + } + delete aj[ah] + } + } + for (ah in aj) { + if (aj.hasOwnProperty(ah)) { + return S + } + } + return B + } + if (!ag(ad(af), ad(ae))) { + return S + } + if (!ag(c.parseStyle(c.getAttrib(af, "style")), c.parseStyle(c.getAttrib(ae, "style")))) { + return S + } + return B + } + if (aa && Z) { + function ab(ae, ad) { + for (Y = ae; Y; Y = Y[ad]) { + if (Y.nodeType == 3 && Y.nodeValue.length !== 0) { + return ae + } + if (Y.nodeType == 1 && !H(Y)) { + return Y + } + } + return ae + } + aa = ab(aa, "previousSibling"); + Z = ab(Z, "nextSibling"); + if (ac(aa, Z)) { + for (Y = aa.nextSibling; Y && Y != Z;) { + X = Y; + Y = Y.nextSibling; + aa.appendChild(X) + } + c.remove(Z); + O(a.grep(Z.childNodes), function(ad) { + aa.appendChild(ad) + }); + return aa + } + } + return Z + } + function G(W) { + return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(W) + } + function J(X, aa) { + var W, Z, Y; + W = X[aa ? "startContainer" : "endContainer"]; + Z = X[aa ? "startOffset" : "endOffset"]; + if (W.nodeType == 1) { + Y = W.childNodes.length - 1; + if (!aa && Z) { + Z-- + } + W = W.childNodes[Z > Y ? Y : Z] + } + return W + } + function Q(ab, X, aa) { + var Y, W = P[ab], + ac = P[ab == "apply" ? "remove" : "apply"]; + + function ad() { + return P.apply.length || P.remove.length + } + function Z() { + P.apply = []; + P.remove = [] + } + function ae(af) { + O(P.apply.reverse(), function(ag) { + T(ag.name, ag.vars, af); + if (ag.name === "forecolor" && ag.vars.value) { + I(af.parentNode) + } + }); + O(P.remove.reverse(), function(ag) { + A(ag.name, ag.vars, af) + }); + c.remove(af, 1); + Z() + } + for (Y = W.length - 1; Y >= 0; Y--) { + if (W[Y].name == X) { + return + } + } + W.push({ + name: X, + vars: aa + }); + for (Y = ac.length - 1; Y >= 0; Y--) { + if (ac[Y].name == X) { + ac.splice(Y, 1) + } + } + if (ad()) { + V.getDoc().execCommand("FontName", false, "mceinline"); + P.lastRng = q.getRng(); + O(c.select("font,span"), function(ag) { + var af; + if (b(ag)) { + af = q.getBookmark(); + ae(ag); + q.moveToBookmark(af); + V.nodeChanged() + } + }); + if (!P.isListening && ad()) { + P.isListening = true; + O("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","), function(af) { + V[af].addToTop(function(ag, ah) { + if (ad() && !a.dom.RangeUtils.compareRanges(P.lastRng, q.getRng())) { + O(c.select("font,span"), function(aj) { + var ak, ai; + if (b(aj)) { + ak = aj.firstChild; + if (ak) { + ae(aj); + ai = c.createRng(); + ai.setStart(ak, ak.nodeValue.length); + ai.setEnd(ak, ak.nodeValue.length); + q.setRng(ai); + ag.nodeChanged() + } else { + c.remove(aj) + } + } + }); + if (ah.type == "keyup" || ah.type == "mouseup") { + Z() + } + } + }) + }) + } + } + } + } +})(tinymce); +tinymce.onAddEditor.add(function(e, a) { + var d, h, g, c = a.settings; + if (c.inline_styles) { + h = e.explode(c.font_size_style_values); + + function b(j, i) { + e.each(i, function(l, k) { + if (l) { + g.setStyle(j, k, l) + } + }); + g.rename(j, "span") + } + d = { + font: function(j, i) { + b(i, { + backgroundColor: i.style.backgroundColor, + color: i.color, + fontFamily: i.face, + fontSize: h[parseInt(i.size) - 1] + }) + }, + u: function(j, i) { + b(i, { + textDecoration: "underline" + }) + }, + strike: function(j, i) { + b(i, { + textDecoration: "line-through" + }) + } + }; + + function f(i, j) { + g = i.dom; + if (c.convert_fonts_to_spans) { + e.each(g.select("font,u,strike", j.node), function(k) { + d[k.nodeName.toLowerCase()](a.dom, k) + }) + } + } + a.onPreProcess.add(f); + a.onSetContent.add(f); + a.onInit.add(function() { + a.selection.onSetContent.add(f) + }) + } +}); diff --git a/js/tiny_mce/tiny_mce_popup.js b/js/tiny_mce/tiny_mce_popup.js new file mode 100644 index 000000000..f859d24e6 --- /dev/null +++ b/js/tiny_mce/tiny_mce_popup.js @@ -0,0 +1,5 @@ + +// Uncomment and change this document.domain value if you are loading the script cross subdomains +// document.domain = 'moxiecode.com'; + +var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.domLoaded){return}b.domLoaded=1;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}if(!b.editor.getParam("browser_preferred_colors",false)||!b.isWindow){b.dom.addClass(document.body,"forceColors")}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){tinymce.dom.Event._add(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){a=a.target||a.srcElement;if(a.onchange){a.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_wait:function(){if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);tinyMCEPopup._onDOMLoaded()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(tinyMCEPopup.domLoaded){return}try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}tinyMCEPopup._onDOMLoaded()})()}document.attachEvent("onload",tinyMCEPopup._onDOMLoaded)}else{if(document.addEventListener){window.addEventListener("DOMContentLoaded",tinyMCEPopup._onDOMLoaded,false);window.addEventListener("load",tinyMCEPopup._onDOMLoaded,false)}}}};tinyMCEPopup.init();tinyMCEPopup._wait(); \ No newline at end of file diff --git a/js/tiny_mce/tiny_mce_src.js b/js/tiny_mce/tiny_mce_src.js new file mode 100644 index 000000000..529a2b4ed --- /dev/null +++ b/js/tiny_mce/tiny_mce_src.js @@ -0,0 +1,15752 @@ +(function(win) { + var whiteSpaceRe = /^\s*|\s*$/g, + undefined, isRegExpBroken = 'B'.replace(/A(.)|B/, '$1') === '$1'; + + var tinymce = { + majorVersion : '3', + + minorVersion : '4.1', + + releaseDate : '2011-03-24', + + _init : function() { + var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v; + + t.isOpera = win.opera && opera.buildNumber; + + t.isWebKit = /WebKit/.test(ua); + + t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName); + + t.isIE6 = t.isIE && /MSIE [56]/.test(ua); + + t.isGecko = !t.isWebKit && /Gecko/.test(ua); + + t.isMac = ua.indexOf('Mac') != -1; + + t.isAir = /adobeair/i.test(ua); + + t.isIDevice = /(iPad|iPhone)/.test(ua); + + // TinyMCE .NET webcontrol might be setting the values for TinyMCE + if (win.tinyMCEPreInit) { + t.suffix = tinyMCEPreInit.suffix; + t.baseURL = tinyMCEPreInit.base; + t.query = tinyMCEPreInit.query; + return; + } + + // Get suffix and base + t.suffix = ''; + + // If base element found, add that infront of baseURL + nl = d.getElementsByTagName('base'); + for (i=0; i<nl.length; i++) { + if (v = nl[i].href) { + // Host only value like http://site.com or http://site.com:8008 + if (/^https?:\/\/[^\/]+$/.test(v)) + v += '/'; + + base = v ? v.match(/.*\//)[0] : ''; // Get only directory + } + } + + function getBase(n) { + if (n.src && /tiny_mce(|_gzip|_jquery|_prototype|_full)(_dev|_src)?.js/.test(n.src)) { + if (/_(src|dev)\.js/g.test(n.src)) + t.suffix = '_src'; + + if ((p = n.src.indexOf('?')) != -1) + t.query = n.src.substring(p + 1); + + t.baseURL = n.src.substring(0, n.src.lastIndexOf('/')); + + // If path to script is relative and a base href was found add that one infront + // the src property will always be an absolute one on non IE browsers and IE 8 + // so this logic will basically only be executed on older IE versions + if (base && t.baseURL.indexOf('://') == -1 && t.baseURL.indexOf('/') !== 0) + t.baseURL = base + t.baseURL; + + return t.baseURL; + } + + return null; + }; + + // Check document + nl = d.getElementsByTagName('script'); + for (i=0; i<nl.length; i++) { + if (getBase(nl[i])) + return; + } + + // Check head + n = d.getElementsByTagName('head')[0]; + if (n) { + nl = n.getElementsByTagName('script'); + for (i=0; i<nl.length; i++) { + if (getBase(nl[i])) + return; + } + } + + return; + }, + + is : function(o, t) { + if (!t) + return o !== undefined; + + if (t == 'array' && (o.hasOwnProperty && o instanceof Array)) + return true; + + return typeof(o) == t; + }, + + makeMap : function(items, delim, map) { + var i; + + items = items || []; + delim = delim || ','; + + if (typeof(items) == "string") + items = items.split(delim); + + map = map || {}; + + i = items.length; + while (i--) + map[items[i]] = {}; + + return map; + }, + + each : function(o, cb, s) { + var n, l; + + if (!o) + return 0; + + s = s || o; + + if (o.length !== undefined) { + // Indexed arrays, needed for Safari + for (n=0, l = o.length; n < l; n++) { + if (cb.call(s, o[n], n, o) === false) + return 0; + } + } else { + // Hashtables + for (n in o) { + if (o.hasOwnProperty(n)) { + if (cb.call(s, o[n], n, o) === false) + return 0; + } + } + } + + return 1; + }, + + + map : function(a, f) { + var o = []; + + tinymce.each(a, function(v) { + o.push(f(v)); + }); + + return o; + }, + + grep : function(a, f) { + var o = []; + + tinymce.each(a, function(v) { + if (!f || f(v)) + o.push(v); + }); + + return o; + }, + + inArray : function(a, v) { + var i, l; + + if (a) { + for (i = 0, l = a.length; i < l; i++) { + if (a[i] === v) + return i; + } + } + + return -1; + }, + + extend : function(o, e) { + var i, l, a = arguments; + + for (i = 1, l = a.length; i < l; i++) { + e = a[i]; + + tinymce.each(e, function(v, n) { + if (v !== undefined) + o[n] = v; + }); + } + + return o; + }, + + + trim : function(s) { + return (s ? '' + s : '').replace(whiteSpaceRe, ''); + }, + + create : function(s, p, root) { + var t = this, sp, ns, cn, scn, c, de = 0; + + // Parse : <prefix> <class>:<super class> + s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s); + cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name + + // Create namespace for new class + ns = t.createNS(s[3].replace(/\.\w+$/, ''), root); + + // Class already exists + if (ns[cn]) + return; + + // Make pure static class + if (s[2] == 'static') { + ns[cn] = p; + + if (this.onCreate) + this.onCreate(s[2], s[3], ns[cn]); + + return; + } + + // Create default constructor + if (!p[cn]) { + p[cn] = function() {}; + de = 1; + } + + // Add constructor and methods + ns[cn] = p[cn]; + t.extend(ns[cn].prototype, p); + + // Extend + if (s[5]) { + sp = t.resolve(s[5]).prototype; + scn = s[5].match(/\.(\w+)$/i)[1]; // Class name + + // Extend constructor + c = ns[cn]; + if (de) { + // Add passthrough constructor + ns[cn] = function() { + return sp[scn].apply(this, arguments); + }; + } else { + // Add inherit constructor + ns[cn] = function() { + this.parent = sp[scn]; + return c.apply(this, arguments); + }; + } + ns[cn].prototype[cn] = ns[cn]; + + // Add super methods + t.each(sp, function(f, n) { + ns[cn].prototype[n] = sp[n]; + }); + + // Add overridden methods + t.each(p, function(f, n) { + // Extend methods if needed + if (sp[n]) { + ns[cn].prototype[n] = function() { + this.parent = sp[n]; + return f.apply(this, arguments); + }; + } else { + if (n != cn) + ns[cn].prototype[n] = f; + } + }); + } + + // Add static methods + t.each(p['static'], function(f, n) { + ns[cn][n] = f; + }); + + if (this.onCreate) + this.onCreate(s[2], s[3], ns[cn].prototype); + }, + + walk : function(o, f, n, s) { + s = s || this; + + if (o) { + if (n) + o = o[n]; + + tinymce.each(o, function(o, i) { + if (f.call(s, o, i, n) === false) + return false; + + tinymce.walk(o, f, n, s); + }); + } + }, + + createNS : function(n, o) { + var i, v; + + o = o || win; + + n = n.split('.'); + for (i=0; i<n.length; i++) { + v = n[i]; + + if (!o[v]) + o[v] = {}; + + o = o[v]; + } + + return o; + }, + + resolve : function(n, o) { + var i, l; + + o = o || win; + + n = n.split('.'); + for (i = 0, l = n.length; i < l; i++) { + o = o[n[i]]; + + if (!o) + break; + } + + return o; + }, + + addUnload : function(f, s) { + var t = this; + + f = {func : f, scope : s || this}; + + if (!t.unloads) { + function unload() { + var li = t.unloads, o, n; + + if (li) { + // Call unload handlers + for (n in li) { + o = li[n]; + + if (o && o.func) + o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy + } + + // Detach unload function + if (win.detachEvent) { + win.detachEvent('onbeforeunload', fakeUnload); + win.detachEvent('onunload', unload); + } else if (win.removeEventListener) + win.removeEventListener('unload', unload, false); + + // Destroy references + t.unloads = o = li = w = unload = 0; + + // Run garbarge collector on IE + if (win.CollectGarbage) + CollectGarbage(); + } + }; + + function fakeUnload() { + var d = document; + + // Is there things still loading, then do some magic + if (d.readyState == 'interactive') { + function stop() { + // Prevent memory leak + d.detachEvent('onstop', stop); + + // Call unload handler + if (unload) + unload(); + + d = 0; + }; + + // Fire unload when the currently loading page is stopped + if (d) + d.attachEvent('onstop', stop); + + // Remove onstop listener after a while to prevent the unload function + // to execute if the user presses cancel in an onbeforeunload + // confirm dialog and then presses the browser stop button + win.setTimeout(function() { + if (d) + d.detachEvent('onstop', stop); + }, 0); + } + }; + + // Attach unload handler + if (win.attachEvent) { + win.attachEvent('onunload', unload); + win.attachEvent('onbeforeunload', fakeUnload); + } else if (win.addEventListener) + win.addEventListener('unload', unload, false); + + // Setup initial unload handler array + t.unloads = [f]; + } else + t.unloads.push(f); + + return f; + }, + + removeUnload : function(f) { + var u = this.unloads, r = null; + + tinymce.each(u, function(o, i) { + if (o && o.func == f) { + u.splice(i, 1); + r = f; + return false; + } + }); + + return r; + }, + + explode : function(s, d) { + return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s; + }, + + _addVer : function(u) { + var v; + + if (!this.query) + return u; + + v = (u.indexOf('?') == -1 ? '?' : '&') + this.query; + + if (u.indexOf('#') == -1) + return u + v; + + return u.replace('#', v + '#'); + }, + + // Fix function for IE 9 where regexps isn't working correctly + // Todo: remove me once MS fixes the bug + _replace : function(find, replace, str) { + // On IE9 we have to fake $x replacement + if (isRegExpBroken) { + return str.replace(find, function() { + var val = replace, args = arguments, i; + + for (i = 0; i < args.length - 2; i++) { + if (args[i] === undefined) { + val = val.replace(new RegExp('\\$' + i, 'g'), ''); + } else { + val = val.replace(new RegExp('\\$' + i, 'g'), args[i]); + } + } + + return val; + }); + } + + return str.replace(find, replace); + } + + }; + + // Initialize the API + tinymce._init(); + + // Expose tinymce namespace to the global namespace (window) + win.tinymce = win.tinyMCE = tinymce; + + // Describe the different namespaces + + })(window); + + +tinymce.create('tinymce.util.Dispatcher', { + scope : null, + listeners : null, + + Dispatcher : function(s) { + this.scope = s || this; + this.listeners = []; + }, + + add : function(cb, s) { + this.listeners.push({cb : cb, scope : s || this.scope}); + + return cb; + }, + + addToTop : function(cb, s) { + this.listeners.unshift({cb : cb, scope : s || this.scope}); + + return cb; + }, + + remove : function(cb) { + var l = this.listeners, o = null; + + tinymce.each(l, function(c, i) { + if (cb == c.cb) { + o = cb; + l.splice(i, 1); + return false; + } + }); + + return o; + }, + + dispatch : function() { + var s, a = arguments, i, li = this.listeners, c; + + // Needs to be a real loop since the listener count might change while looping + // And this is also more efficient + for (i = 0; i<li.length; i++) { + c = li[i]; + s = c.cb.apply(c.scope, a); + + if (s === false) + break; + } + + return s; + } + + }); + +(function() { + var each = tinymce.each; + + tinymce.create('tinymce.util.URI', { + URI : function(u, s) { + var t = this, o, a, b; + + // Trim whitespace + u = tinymce.trim(u); + + // Default settings + s = t.settings = s || {}; + + // Strange app protocol or local anchor + if (/^(mailto|tel|news|javascript|about|data):/i.test(u) || /^\s*#/.test(u)) { + t.source = u; + return; + } + + // Absolute path with no host, fake host and protocol + if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) + u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; + + // Relative path http:// or protocol relative //path + if (!/^\w*:?\/\//.test(u)) + u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); + + // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) + u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something + u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); + each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) { + var s = u[i]; + + // Zope 3 workaround, they use @@something + if (s) + s = s.replace(/\(mce_at\)/g, '@@'); + + t[v] = s; + }); + + if (b = s.base_uri) { + if (!t.protocol) + t.protocol = b.protocol; + + if (!t.userInfo) + t.userInfo = b.userInfo; + + if (!t.port && t.host == 'mce_host') + t.port = b.port; + + if (!t.host || t.host == 'mce_host') + t.host = b.host; + + t.source = ''; + } + + //t.path = t.path || '/'; + }, + + setPath : function(p) { + var t = this; + + p = /^(.*?)\/?(\w+)?$/.exec(p); + + // Update path parts + t.path = p[0]; + t.directory = p[1]; + t.file = p[2]; + + // Rebuild source + t.source = ''; + t.getURI(); + }, + + toRelative : function(u) { + var t = this, o; + + if (u === "./") + return u; + + u = new tinymce.util.URI(u, {base_uri : t}); + + // Not on same domain/port or protocol + if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) + return u.getURI(); + + o = t.toRelPath(t.path, u.path); + + // Add query + if (u.query) + o += '?' + u.query; + + // Add anchor + if (u.anchor) + o += '#' + u.anchor; + + return o; + }, + + toAbsolute : function(u, nh) { + var u = new tinymce.util.URI(u, {base_uri : this}); + + return u.getURI(this.host == u.host && this.protocol == u.protocol ? nh : 0); + }, + + toRelPath : function(base, path) { + var items, bp = 0, out = '', i, l; + + // Split the paths + base = base.substring(0, base.lastIndexOf('/')); + base = base.split('/'); + items = path.split('/'); + + if (base.length >= items.length) { + for (i = 0, l = base.length; i < l; i++) { + if (i >= items.length || base[i] != items[i]) { + bp = i + 1; + break; + } + } + } + + if (base.length < items.length) { + for (i = 0, l = items.length; i < l; i++) { + if (i >= base.length || base[i] != items[i]) { + bp = i + 1; + break; + } + } + } + + if (bp == 1) + return path; + + for (i = 0, l = base.length - (bp - 1); i < l; i++) + out += "../"; + + for (i = bp - 1, l = items.length; i < l; i++) { + if (i != bp - 1) + out += "/" + items[i]; + else + out += items[i]; + } + + return out; + }, + + toAbsPath : function(base, path) { + var i, nb = 0, o = [], tr, outPath; + + // Split paths + tr = /\/$/.test(path) ? '/' : ''; + base = base.split('/'); + path = path.split('/'); + + // Remove empty chunks + each(base, function(k) { + if (k) + o.push(k); + }); + + base = o; + + // Merge relURLParts chunks + for (i = path.length - 1, o = []; i >= 0; i--) { + // Ignore empty or . + if (path[i].length == 0 || path[i] == ".") + continue; + + // Is parent + if (path[i] == '..') { + nb++; + continue; + } + + // Move up + if (nb > 0) { + nb--; + continue; + } + + o.push(path[i]); + } + + i = base.length - nb; + + // If /a/b/c or / + if (i <= 0) + outPath = o.reverse().join('/'); + else + outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/'); + + // Add front / if it's needed + if (outPath.indexOf('/') !== 0) + outPath = '/' + outPath; + + // Add traling / if it's needed + if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) + outPath += tr; + + return outPath; + }, + + getURI : function(nh) { + var s, t = this; + + // Rebuild source + if (!t.source || nh) { + s = ''; + + if (!nh) { + if (t.protocol) + s += t.protocol + '://'; + + if (t.userInfo) + s += t.userInfo + '@'; + + if (t.host) + s += t.host; + + if (t.port) + s += ':' + t.port; + } + + if (t.path) + s += t.path; + + if (t.query) + s += '?' + t.query; + + if (t.anchor) + s += '#' + t.anchor; + + t.source = s; + } + + return t.source; + } + }); +})(); + +(function() { + var each = tinymce.each; + + tinymce.create('static tinymce.util.Cookie', { + getHash : function(n) { + var v = this.get(n), h; + + if (v) { + each(v.split('&'), function(v) { + v = v.split('='); + h = h || {}; + h[unescape(v[0])] = unescape(v[1]); + }); + } + + return h; + }, + + setHash : function(n, v, e, p, d, s) { + var o = ''; + + each(v, function(v, k) { + o += (!o ? '' : '&') + escape(k) + '=' + escape(v); + }); + + this.set(n, o, e, p, d, s); + }, + + get : function(n) { + var c = document.cookie, e, p = n + "=", b; + + // Strict mode + if (!c) + return; + + b = c.indexOf("; " + p); + + if (b == -1) { + b = c.indexOf(p); + + if (b != 0) + return null; + } else + b += 2; + + e = c.indexOf(";", b); + + if (e == -1) + e = c.length; + + return unescape(c.substring(b + p.length, e)); + }, + + set : function(n, v, e, p, d, s) { + document.cookie = n + "=" + escape(v) + + ((e) ? "; expires=" + e.toGMTString() : "") + + ((p) ? "; path=" + escape(p) : "") + + ((d) ? "; domain=" + d : "") + + ((s) ? "; secure" : ""); + }, + + remove : function(n, p) { + var d = new Date(); + + d.setTime(d.getTime() - 1000); + + this.set(n, '', d, p, d); + } + }); +})(); + +(function() { + function serialize(o, quote) { + var i, v, t; + + quote = quote || '"'; + + if (o == null) + return 'null'; + + t = typeof o; + + if (t == 'string') { + v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; + + return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) { + // Make sure single quotes never get encoded inside double quotes for JSON compatibility + if (quote === '"' && a === "'") + return a; + + i = v.indexOf(b); + + if (i + 1) + return '\\' + v.charAt(i + 1); + + a = b.charCodeAt().toString(16); + + return '\\u' + '0000'.substring(a.length) + a; + }) + quote; + } + + if (t == 'object') { + if (o.hasOwnProperty && o instanceof Array) { + for (i=0, v = '['; i<o.length; i++) + v += (i > 0 ? ',' : '') + serialize(o[i], quote); + + return v + ']'; + } + + v = '{'; + + for (i in o) + v += typeof o[i] != 'function' ? (v.length > 1 ? ',' + quote : quote) + i + quote +':' + serialize(o[i], quote) : ''; + + return v + '}'; + } + + return '' + o; + }; + + tinymce.util.JSON = { + serialize: serialize, + + parse: function(s) { + try { + return eval('(' + s + ')'); + } catch (ex) { + // Ignore + } + } + + }; +})(); +tinymce.create('static tinymce.util.XHR', { + send : function(o) { + var x, t, w = window, c = 0; + + // Default settings + o.scope = o.scope || this; + o.success_scope = o.success_scope || o.scope; + o.error_scope = o.error_scope || o.scope; + o.async = o.async === false ? false : true; + o.data = o.data || ''; + + function get(s) { + x = 0; + + try { + x = new ActiveXObject(s); + } catch (ex) { + } + + return x; + }; + + x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP'); + + if (x) { + if (x.overrideMimeType) + x.overrideMimeType(o.content_type); + + x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async); + + if (o.content_type) + x.setRequestHeader('Content-Type', o.content_type); + + x.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + + x.send(o.data); + + function ready() { + if (!o.async || x.readyState == 4 || c++ > 10000) { + if (o.success && c < 10000 && x.status == 200) + o.success.call(o.success_scope, '' + x.responseText, x, o); + else if (o.error) + o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o); + + x = null; + } else + w.setTimeout(ready, 10); + }; + + // Syncronous request + if (!o.async) + return ready(); + + // Wait for response, onReadyStateChange can not be used since it leaks memory in IE + t = w.setTimeout(ready, 10); + } + } +}); + +(function() { + var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR; + + tinymce.create('tinymce.util.JSONRequest', { + JSONRequest : function(s) { + this.settings = extend({ + }, s); + this.count = 0; + }, + + send : function(o) { + var ecb = o.error, scb = o.success; + + o = extend(this.settings, o); + + o.success = function(c, x) { + c = JSON.parse(c); + + if (typeof(c) == 'undefined') { + c = { + error : 'JSON Parse error.' + }; + } + + if (c.error) + ecb.call(o.error_scope || o.scope, c.error, x); + else + scb.call(o.success_scope || o.scope, c.result); + }; + + o.error = function(ty, x) { + if (ecb) + ecb.call(o.error_scope || o.scope, ty, x); + }; + + o.data = JSON.serialize({ + id : o.id || 'c' + (this.count++), + method : o.method, + params : o.params + }); + + // JSON content type for Ruby on rails. Bug: #1883287 + o.content_type = 'application/json'; + + XHR.send(o); + }, + + 'static' : { + sendRPC : function(o) { + return new tinymce.util.JSONRequest().send(o); + } + } + }); +}()); +(function(tinymce) { + var namedEntities, baseEntities, reverseEntities, + attrsCharsRegExp = /[&\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + textCharsRegExp = /[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + rawCharsRegExp = /[<>&\"\']/g, + entityRegExp = /&(#)?([\w]+);/g, + asciiMap = { + 128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 : "\u201E", 133 : "\u2026", 134 : "\u2020", + 135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 : "\u0160", 139 : "\u2039", 140 : "\u0152", + 142 : "\u017D", 145 : "\u2018", 146 : "\u2019", 147 : "\u201C", 148 : "\u201D", 149 : "\u2022", + 150 : "\u2013", 151 : "\u2014", 152 : "\u02DC", 153 : "\u2122", 154 : "\u0161", 155 : "\u203A", + 156 : "\u0153", 158 : "\u017E", 159 : "\u0178" + }; + + // Raw entities + baseEntities = { + '"' : '&quot;', + "'" : '&#39;', + '<' : '&lt;', + '>' : '&gt;', + '&' : '&amp;' + }; + + // Reverse lookup table for raw entities + reverseEntities = { + '&lt;' : '<', + '&gt;' : '>', + '&amp;' : '&', + '&quot;' : '"', + '&apos;' : "'" + }; + + // Decodes text by using the browser + function nativeDecode(text) { + var elm; + + elm = document.createElement("div"); + elm.innerHTML = text; + + return elm.textContent || elm.innerText || text; + }; + + // Build a two way lookup table for the entities + function buildEntitiesLookup(items, radix) { + var i, chr, entity, lookup = {}; + + if (items) { + items = items.split(','); + radix = radix || 10; + + // Build entities lookup table + for (i = 0; i < items.length; i += 2) { + chr = String.fromCharCode(parseInt(items[i], radix)); + + // Only add non base entities + if (!baseEntities[chr]) { + entity = '&' + items[i + 1] + ';'; + lookup[chr] = entity; + lookup[entity] = chr; + } + } + + return lookup; + } + }; + + // Unpack entities lookup where the numbers are in radix 32 to reduce the size + namedEntities = buildEntitiesLookup( + '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro' + , 32); + + tinymce.html = tinymce.html || {}; + + tinymce.html.Entities = { + encodeRaw : function(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || chr; + }); + }, + + encodeAllRaw : function(text) { + return ('' + text).replace(rawCharsRegExp, function(chr) { + return baseEntities[chr] || chr; + }); + }, + + encodeNumeric : function(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + // Multi byte sequence convert it to a single entity + if (chr.length > 1) + return '&#' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';'; + + return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';'; + }); + }, + + encodeNamed : function(text, attr, entities) { + entities = entities || namedEntities; + + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || entities[chr] || chr; + }); + }, + + getEncodeFunc : function(name, entities) { + var Entities = tinymce.html.Entities; + + entities = buildEntitiesLookup(entities) || namedEntities; + + function encodeNamedAndNumeric(text, attr) { + return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { + return baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr; + }); + }; + + function encodeCustomNamed(text, attr) { + return Entities.encodeNamed(text, attr, entities); + }; + + // Replace + with , to be compatible with previous TinyMCE versions + name = tinymce.makeMap(name.replace(/\+/g, ',')); + + // Named and numeric encoder + if (name.named && name.numeric) + return encodeNamedAndNumeric; + + // Named encoder + if (name.named) { + // Custom names + if (entities) + return encodeCustomNamed; + + return Entities.encodeNamed; + } + + // Numeric + if (name.numeric) + return Entities.encodeNumeric; + + // Raw encoder + return Entities.encodeRaw; + }, + + decode : function(text) { + return text.replace(entityRegExp, function(all, numeric, value) { + if (numeric) { + value = parseInt(value); + + // Support upper UTF + if (value > 0xFFFF) { + value -= 0x10000; + + return String.fromCharCode(0xD800 + (value >> 10), 0xDC00 + (value & 0x3FF)); + } else + return asciiMap[value] || String.fromCharCode(value); + } + + return reverseEntities[all] || namedEntities[all] || nativeDecode(all); + }); + } + }; +})(tinymce); + +tinymce.html.Styles = function(settings, schema) { + var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi, + urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi, + styleRegExp = /\s*([^:]+):\s*([^;]+);?/g, + trimRightRegExp = /\s+$/, + urlColorRegExp = /rgb/, + undef, i, encodingLookup = {}, encodingItems; + + settings = settings || {}; + + encodingItems = '\\" \\\' \\; \\: ; : _'.split(' '); + for (i = 0; i < encodingItems.length; i++) { + encodingLookup[encodingItems[i]] = '_' + i; + encodingLookup['_' + i] = encodingItems[i]; + } + + function toHex(match, r, g, b) { + function hex(val) { + val = parseInt(val).toString(16); + + return val.length > 1 ? val : '0' + val; // 0 -> 00 + }; + + return '#' + hex(r) + hex(g) + hex(b); + }; + + return { + toHex : function(color) { + return color.replace(rgbRegExp, toHex); + }, + + parse : function(css) { + var styles = {}, matches, name, value, isEncoded, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope || this; + + function compress(prefix, suffix) { + var top, right, bottom, left; + + // Get values and check it it needs compressing + top = styles[prefix + '-top' + suffix]; + if (!top) + return; + + right = styles[prefix + '-right' + suffix]; + if (top != right) + return; + + bottom = styles[prefix + '-bottom' + suffix]; + if (right != bottom) + return; + + left = styles[prefix + '-left' + suffix]; + if (bottom != left) + return; + + // Compress + styles[prefix + suffix] = left; + delete styles[prefix + '-top' + suffix]; + delete styles[prefix + '-right' + suffix]; + delete styles[prefix + '-bottom' + suffix]; + delete styles[prefix + '-left' + suffix]; + }; + + function canCompress(key) { + var value = styles[key], i; + + if (!value || value.indexOf(' ') < 0) + return; + + value = value.split(' '); + i = value.length; + while (i--) { + if (value[i] !== value[0]) + return false; + } + + styles[key] = value[0]; + + return true; + }; + + function compress2(target, a, b, c) { + if (!canCompress(a)) + return; + + if (!canCompress(b)) + return; + + if (!canCompress(c)) + return; + + // Compress + styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c]; + delete styles[a]; + delete styles[b]; + delete styles[c]; + }; + + // Encodes the specified string by replacing all \" \' ; : with _<num> + function encode(str) { + isEncoded = true; + + return encodingLookup[str]; + }; + + // Decodes the specified string by replacing all _<num> with it's original value \" \' etc + // It will also decode the \" \' if keep_slashes is set to fale or omitted + function decode(str, keep_slashes) { + if (isEncoded) { + str = str.replace(/_[0-9]/g, function(str) { + return encodingLookup[str]; + }); + } + + if (!keep_slashes) + str = str.replace(/\\([\'\";:])/g, "$1"); + + return str; + } + + if (css) { + // Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing + css = css.replace(/\\[\"\';:_]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) { + return str.replace(/[;:]/g, encode); + }); + + // Parse styles + while (matches = styleRegExp.exec(css)) { + name = matches[1].replace(trimRightRegExp, '').toLowerCase(); + value = matches[2].replace(trimRightRegExp, ''); + + if (name && value.length > 0) { + // Opera will produce 700 instead of bold in their style values + if (name === 'font-weight' && value === '700') + value = 'bold'; + else if (name === 'color' || name === 'background-color') // Lowercase colors like RED + value = value.toLowerCase(); + + // Convert RGB colors to HEX + value = value.replace(rgbRegExp, toHex); + + // Convert URLs and force them into url('value') format + value = value.replace(urlOrStrRegExp, function(match, url, url2, url3, str, str2) { + str = str || str2; + + if (str) { + str = decode(str); + + // Force strings into single quote format + return "'" + str.replace(/\'/g, "\\'") + "'"; + } + + url = decode(url || url2 || url3); + + // Convert the URL to relative/absolute depending on config + if (urlConverter) + url = urlConverter.call(urlConverterScope, url, 'style'); + + // Output new URL format + return "url('" + url.replace(/\'/g, "\\'") + "')"; + }); + + styles[name] = isEncoded ? decode(value, true) : value; + } + + styleRegExp.lastIndex = matches.index + matches[0].length; + } + + // Compress the styles to reduce it's size for example IE will expand styles + compress("border", ""); + compress("border", "-width"); + compress("border", "-color"); + compress("border", "-style"); + compress("padding", ""); + compress("margin", ""); + compress2('border', 'border-width', 'border-style', 'border-color'); + + // Remove pointless border, IE produces these + if (styles.border === 'medium none') + delete styles.border; + } + + return styles; + }, + + serialize : function(styles, element_name) { + var css = '', name, value; + + function serializeStyles(name) { + var styleList, i, l, name, value; + + styleList = schema.styles[name]; + if (styleList) { + for (i = 0, l = styleList.length; i < l; i++) { + name = styleList[i]; + value = styles[name]; + + if (value !== undef) + css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; + } + } + }; + + // Serialize styles according to schema + if (element_name && schema && schema.styles) { + // Serialize global styles and element specific styles + serializeStyles('*'); + serializeStyles(name); + } else { + // Output the styles in the order they are inside the object + for (name in styles) { + value = styles[name]; + + if (value !== undef) + css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; + } + } + + return css; + } + }; +}; + +(function(tinymce) { + var transitional = {}, boolAttrMap, blockElementsMap, shortEndedElementsMap, nonEmptyElementsMap, + whiteSpaceElementsMap, selfClosingElementsMap, makeMap = tinymce.makeMap, each = tinymce.each; + + function split(str, delim) { + return str.split(delim || ','); + }; + + function unpack(lookup, data) { + var key, elements = {}; + + function replace(value) { + return value.replace(/[A-Z]+/g, function(key) { + return replace(lookup[key]); + }); + }; + + // Unpack lookup + for (key in lookup) { + if (lookup.hasOwnProperty(key)) + lookup[key] = replace(lookup[key]); + } + + // Unpack and parse data into object map + replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g, function(str, name, attributes, children) { + attributes = split(attributes, '|'); + + elements[name] = { + attributes : makeMap(attributes), + attributesOrder : attributes, + children : makeMap(children, '|', {'#comment' : {}}) + } + }); + + return elements; + }; + + // Build a lookup table for block elements both lowercase and uppercase + blockElementsMap = 'h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,' + + 'th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,' + + 'noscript,menu,isindex,samp,header,footer,article,section,hgroup'; + blockElementsMap = makeMap(blockElementsMap, ',', makeMap(blockElementsMap.toUpperCase())); + + // This is the XHTML 1.0 transitional elements with it's attributes and children packed to reduce it's size + transitional = unpack({ + Z : 'H|K|N|O|P', + Y : 'X|form|R|Q', + ZG : 'E|span|width|align|char|charoff|valign', + X : 'p|T|div|U|W|isindex|fieldset|table', + ZF : 'E|align|char|charoff|valign', + W : 'pre|hr|blockquote|address|center|noframes', + ZE : 'abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height', + ZD : '[E][S]', + U : 'ul|ol|dl|menu|dir', + ZC : 'p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', + T : 'h1|h2|h3|h4|h5|h6', + ZB : 'X|S|Q', + S : 'R|P', + ZA : 'a|G|J|M|O|P', + R : 'a|H|K|N|O', + Q : 'noscript|P', + P : 'ins|del|script', + O : 'input|select|textarea|label|button', + N : 'M|L', + M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', + L : 'sub|sup', + K : 'J|I', + J : 'tt|i|b|u|s|strike', + I : 'big|small|font|basefont', + H : 'G|F', + G : 'br|span|bdo', + F : 'object|applet|img|map|iframe', + E : 'A|B|C', + D : 'accesskey|tabindex|onfocus|onblur', + C : 'onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup', + B : 'lang|xml:lang|dir', + A : 'id|class|style|title' + }, 'script[id|charset|type|language|src|defer|xml:space][]' + + 'style[B|id|type|media|title|xml:space][]' + + 'object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]' + + 'param[id|name|value|valuetype|type][]' + + 'p[E|align][#|S]' + + 'a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]' + + 'br[A|clear][]' + + 'span[E][#|S]' + + 'bdo[A|C|B][#|S]' + + 'applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]' + + 'h1[E|align][#|S]' + + 'img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]' + + 'map[B|C|A|name][X|form|Q|area]' + + 'h2[E|align][#|S]' + + 'iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]' + + 'h3[E|align][#|S]' + + 'tt[E][#|S]' + + 'i[E][#|S]' + + 'b[E][#|S]' + + 'u[E][#|S]' + + 's[E][#|S]' + + 'strike[E][#|S]' + + 'big[E][#|S]' + + 'small[E][#|S]' + + 'font[A|B|size|color|face][#|S]' + + 'basefont[id|size|color|face][]' + + 'em[E][#|S]' + + 'strong[E][#|S]' + + 'dfn[E][#|S]' + + 'code[E][#|S]' + + 'q[E|cite][#|S]' + + 'samp[E][#|S]' + + 'kbd[E][#|S]' + + 'var[E][#|S]' + + 'cite[E][#|S]' + + 'abbr[E][#|S]' + + 'acronym[E][#|S]' + + 'sub[E][#|S]' + + 'sup[E][#|S]' + + 'input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]' + + 'select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]' + + 'optgroup[E|disabled|label][option]' + + 'option[E|selected|disabled|label|value][]' + + 'textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]' + + 'label[E|for|accesskey|onfocus|onblur][#|S]' + + 'button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + + 'h4[E|align][#|S]' + + 'ins[E|cite|datetime][#|Y]' + + 'h5[E|align][#|S]' + + 'del[E|cite|datetime][#|Y]' + + 'h6[E|align][#|S]' + + 'div[E|align][#|Y]' + + 'ul[E|type|compact][li]' + + 'li[E|type|value][#|Y]' + + 'ol[E|type|compact|start][li]' + + 'dl[E|compact][dt|dd]' + + 'dt[E][#|S]' + + 'dd[E][#|Y]' + + 'menu[E|compact][li]' + + 'dir[E|compact][li]' + + 'pre[E|width|xml:space][#|ZA]' + + 'hr[E|align|noshade|size|width][]' + + 'blockquote[E|cite][#|Y]' + + 'address[E][#|S|p]' + + 'center[E][#|Y]' + + 'noframes[E][#|Y]' + + 'isindex[A|B|prompt][]' + + 'fieldset[E][#|legend|Y]' + + 'legend[E|accesskey|align][#|S]' + + 'table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]' + + 'caption[E|align][#|S]' + + 'col[ZG][]' + + 'colgroup[ZG][col]' + + 'thead[ZF][tr]' + + 'tr[ZF|bgcolor][th|td]' + + 'th[E|ZE][#|Y]' + + 'form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]' + + 'noscript[E][#|Y]' + + 'td[E|ZE][#|Y]' + + 'tfoot[ZF][tr]' + + 'tbody[ZF][tr]' + + 'area[E|D|shape|coords|href|nohref|alt|target][]' + + 'base[id|href|target][]' + + 'body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]' + ); + + boolAttrMap = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,preload,autoplay,loop,controls'); + shortEndedElementsMap = makeMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source'); + nonEmptyElementsMap = tinymce.extend(makeMap('td,th,iframe,video,object'), shortEndedElementsMap); + whiteSpaceElementsMap = makeMap('pre,script,style'); + selfClosingElementsMap = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + + tinymce.html.Schema = function(settings) { + var self = this, elements = {}, children = {}, patternElements = [], validStyles; + + settings = settings || {}; + + // Allow all elements and attributes if verify_html is set to false + if (settings.verify_html === false) + settings.valid_elements = '*[*]'; + + // Build styles list + if (settings.valid_styles) { + validStyles = {}; + + // Convert styles into a rule list + each(settings.valid_styles, function(value, key) { + validStyles[key] = tinymce.explode(value); + }); + } + + // Converts a wildcard expression string to a regexp for example *a will become /.*a/. + function patternToRegExp(str) { + return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$'); + }; + + // Parses the specified valid_elements string and adds to the current rules + // This function is a bit hard to read since it's heavily optimized for speed + function addValidElements(valid_elements) { + var ei, el, ai, al, yl, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, + prefix, outputName, globalAttributes, globalAttributesOrder, transElement, key, childKey, value, + elementRuleRegExp = /^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/, + attrRuleRegExp = /^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/, + hasPatternsRegExp = /[*?+]/; + + if (valid_elements) { + // Split valid elements into an array with rules + valid_elements = split(valid_elements); + + if (elements['@']) { + globalAttributes = elements['@'].attributes; + globalAttributesOrder = elements['@'].attributesOrder; + } + + // Loop all rules + for (ei = 0, el = valid_elements.length; ei < el; ei++) { + // Parse element rule + matches = elementRuleRegExp.exec(valid_elements[ei]); + if (matches) { + // Setup local names for matches + prefix = matches[1]; + elementName = matches[2]; + outputName = matches[3]; + attrData = matches[4]; + + // Create new attributes and attributesOrder + attributes = {}; + attributesOrder = []; + + // Create the new element + element = { + attributes : attributes, + attributesOrder : attributesOrder + }; + + // Padd empty elements prefix + if (prefix === '#') + element.paddEmpty = true; + + // Remove empty elements prefix + if (prefix === '-') + element.removeEmpty = true; + + // Copy attributes from global rule into current rule + if (globalAttributes) { + for (key in globalAttributes) + attributes[key] = globalAttributes[key]; + + attributesOrder.push.apply(attributesOrder, globalAttributesOrder); + } + + // Attributes defined + if (attrData) { + attrData = split(attrData, '|'); + for (ai = 0, al = attrData.length; ai < al; ai++) { + matches = attrRuleRegExp.exec(attrData[ai]); + if (matches) { + attr = {}; + attrType = matches[1]; + attrName = matches[2].replace(/::/g, ':'); + prefix = matches[3]; + value = matches[4]; + + // Required + if (attrType === '!') { + element.attributesRequired = element.attributesRequired || []; + element.attributesRequired.push(attrName); + attr.required = true; + } + + // Denied from global + if (attrType === '-') { + delete attributes[attrName]; + attributesOrder.splice(tinymce.inArray(attributesOrder, attrName), 1); + continue; + } + + // Default value + if (prefix) { + // Default value + if (prefix === '=') { + element.attributesDefault = element.attributesDefault || []; + element.attributesDefault.push({name: attrName, value: value}); + attr.defaultValue = value; + } + + // Forced value + if (prefix === ':') { + element.attributesForced = element.attributesForced || []; + element.attributesForced.push({name: attrName, value: value}); + attr.forcedValue = value; + } + + // Required values + if (prefix === '<') + attr.validValues = makeMap(value, '?'); + } + + // Check for attribute patterns + if (hasPatternsRegExp.test(attrName)) { + element.attributePatterns = element.attributePatterns || []; + attr.pattern = patternToRegExp(attrName); + element.attributePatterns.push(attr); + } else { + // Add attribute to order list if it doesn't already exist + if (!attributes[attrName]) + attributesOrder.push(attrName); + + attributes[attrName] = attr; + } + } + } + } + + // Global rule, store away these for later usage + if (!globalAttributes && elementName == '@') { + globalAttributes = attributes; + globalAttributesOrder = attributesOrder; + } + + // Handle substitute elements such as b/strong + if (outputName) { + element.outputName = elementName; + elements[outputName] = element; + } + + // Add pattern or exact element + if (hasPatternsRegExp.test(elementName)) { + element.pattern = patternToRegExp(elementName); + patternElements.push(element); + } else + elements[elementName] = element; + } + } + } + }; + + function setValidElements(valid_elements) { + elements = {}; + patternElements = []; + + addValidElements(valid_elements); + + each(transitional, function(element, name) { + children[name] = element.children; + }); + }; + + // Adds custom non HTML elements to the schema + function addCustomElements(custom_elements) { + var customElementRegExp = /^(~)?(.+)$/; + + if (custom_elements) { + each(split(custom_elements), function(rule) { + var matches = customElementRegExp.exec(rule), + cloneName = matches[1] === '~' ? 'span' : 'div', + name = matches[2]; + + children[name] = children[cloneName]; + + // Add custom elements at span/div positions + each(children, function(element, child) { + if (element[cloneName]) + element[name] = element[cloneName]; + }); + }); + } + }; + + // Adds valid children to the schema object + function addValidChildren(valid_children) { + var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/; + + if (valid_children) { + each(split(valid_children), function(rule) { + var matches = childRuleRegExp.exec(rule), parent, prefix; + + if (matches) { + prefix = matches[1]; + + // Add/remove items from default + if (prefix) + parent = children[matches[2]]; + else + parent = children[matches[2]] = {'#comment' : {}}; + + parent = children[matches[2]]; + + each(split(matches[3], '|'), function(child) { + if (prefix === '-') + delete parent[child]; + else + parent[child] = {}; + }); + } + }); + } + } + + if (!settings.valid_elements) { + // No valid elements defined then clone the elements from the transitional spec + each(transitional, function(element, name) { + elements[name] = { + attributes : element.attributes, + attributesOrder : element.attributesOrder + }; + + children[name] = element.children; + }); + + // Switch these + each(split('strong/b,em/i'), function(item) { + item = split(item, '/'); + elements[item[1]].outputName = item[0]; + }); + + // Add default alt attribute for images + elements.img.attributesDefault = [{name: 'alt', value: ''}]; + + // Remove these if they are empty by default + each(split('ol,ul,li,sub,sup,blockquote,tr,div,span,font,a,table,tbody'), function(name) { + elements[name].removeEmpty = true; + }); + + // Padd these by default + each(split('p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption'), function(name) { + elements[name].paddEmpty = true; + }); + } else + setValidElements(settings.valid_elements); + + addCustomElements(settings.custom_elements); + addValidChildren(settings.valid_children); + addValidElements(settings.extended_valid_elements); + + // Todo: Remove this when we fix list handling to be valid + addValidChildren('+ol[ul|ol],+ul[ul|ol]'); + + // Delete invalid elements + if (settings.invalid_elements) { + tinymce.each(tinymce.explode(settings.invalid_elements), function(item) { + if (elements[item]) + delete elements[item]; + }); + } + + self.children = children; + + self.styles = validStyles; + + self.getBoolAttrs = function() { + return boolAttrMap; + }; + + self.getBlockElements = function() { + return blockElementsMap; + }; + + self.getShortEndedElements = function() { + return shortEndedElementsMap; + }; + + self.getSelfClosingElements = function() { + return selfClosingElementsMap; + }; + + self.getNonEmptyElements = function() { + return nonEmptyElementsMap; + }; + + self.getWhiteSpaceElements = function() { + return whiteSpaceElementsMap; + }; + + self.isValidChild = function(name, child) { + var parent = children[name]; + + return !!(parent && parent[child]); + }; + + self.getElementRule = function(name) { + var element = elements[name], i; + + // Exact match found + if (element) + return element; + + // No exact match then try the patterns + i = patternElements.length; + while (i--) { + element = patternElements[i]; + + if (element.pattern.test(name)) + return element; + } + }; + + self.addValidElements = addValidElements; + + self.setValidElements = setValidElements; + + self.addCustomElements = addCustomElements; + + self.addValidChildren = addValidChildren; + }; + + // Expose boolMap and blockElementMap as static properties for usage in DOMUtils + tinymce.html.Schema.boolAttrMap = boolAttrMap; + tinymce.html.Schema.blockElementsMap = blockElementsMap; +})(tinymce); + +(function(tinymce) { + tinymce.html.SaxParser = function(settings, schema) { + var self = this, noop = function() {}; + + settings = settings || {}; + self.schema = schema = schema || new tinymce.html.Schema(); + + if (settings.fix_self_closing !== false) + settings.fix_self_closing = true; + + // Add handler functions from settings and setup default handlers + tinymce.each('comment cdata text start end pi doctype'.split(' '), function(name) { + if (name) + self[name] = settings[name] || noop; + }); + + self.parse = function(html) { + var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name, + shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue, + validAttributesMap, validAttributePatterns, attributesRequired, attributesDefault, attributesForced, selfClosing, + tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing; + + function processEndTag(name) { + var pos, i; + + // Find position of parent of the same type + pos = stack.length; + while (pos--) { + if (stack[pos].name === name) + break; + } + + // Found parent + if (pos >= 0) { + // Close all the open elements + for (i = stack.length - 1; i >= pos; i--) { + name = stack[i]; + + if (name.valid) + self.end(name.name); + } + + // Remove the open elements from the stack + stack.length = pos; + } + }; + + // Precompile RegExps and map objects + tokenRegExp = new RegExp('<(?:' + + '(?:!--([\\w\\W]*?)-->)|' + // Comment + '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + // CDATA + '(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE + '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI + '(?:\\/([^>]+)>)|' + // End element + '(?:([^\\s\\/<>]+)\\s*((?:[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*)>)' + // Start element + ')', 'g'); + + attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g; + specialElements = { + 'script' : /<\/script[^>]*>/gi, + 'style' : /<\/style[^>]*>/gi, + 'noscript' : /<\/noscript[^>]*>/gi + }; + + // Setup lookup tables for empty elements and boolean attributes + shortEndedElements = schema.getShortEndedElements(); + selfClosing = schema.getSelfClosingElements(); + fillAttrsMap = schema.getBoolAttrs(); + validate = settings.validate; + fixSelfClosing = settings.fix_self_closing; + + while (matches = tokenRegExp.exec(html)) { + // Text + if (index < matches.index) + self.text(decode(html.substr(index, matches.index - index))); + + if (value = matches[6]) { // End element + processEndTag(value.toLowerCase()); + } else if (value = matches[7]) { // Start element + value = value.toLowerCase(); + isShortEnded = value in shortEndedElements; + + // Is self closing tag for example an <li> after an open <li> + if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value) + processEndTag(value); + + // Validate element + if (!validate || (elementRule = schema.getElementRule(value))) { + isValidElement = true; + + // Grab attributes map and patters when validation is enabled + if (validate) { + validAttributesMap = elementRule.attributes; + validAttributePatterns = elementRule.attributePatterns; + } + + // Parse attributes + if (attribsValue = matches[8]) { + attrList = []; + attrList.map = {}; + + attribsValue.replace(attrRegExp, function(match, name, value, val2, val3) { + var attrRule, i; + + name = name.toLowerCase(); + value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute + + // Validate name and value + if (validate && name.indexOf('data-') !== 0) { + attrRule = validAttributesMap[name]; + + // Find rule by pattern matching + if (!attrRule && validAttributePatterns) { + i = validAttributePatterns.length; + while (i--) { + attrRule = validAttributePatterns[i]; + if (attrRule.pattern.test(name)) + break; + } + + // No rule matched + if (i === -1) + attrRule = null; + } + + // No attribute rule found + if (!attrRule) + return; + + // Validate value + if (attrRule.validValues && !(value in attrRule.validValues)) + return; + } + + // Add attribute to list and map + attrList.map[name] = value; + attrList.push({ + name: name, + value: value + }); + }); + } else { + attrList = []; + attrList.map = {}; + } + + // Process attributes if validation is enabled + if (validate) { + attributesRequired = elementRule.attributesRequired; + attributesDefault = elementRule.attributesDefault; + attributesForced = elementRule.attributesForced; + + // Handle forced attributes + if (attributesForced) { + i = attributesForced.length; + while (i--) { + attr = attributesForced[i]; + name = attr.name; + attrValue = attr.value; + + if (attrValue === '{$uid}') + attrValue = 'mce_' + idCount++; + + attrList.map[name] = attrValue; + attrList.push({name: name, value: attrValue}); + } + } + + // Handle default attributes + if (attributesDefault) { + i = attributesDefault.length; + while (i--) { + attr = attributesDefault[i]; + name = attr.name; + + if (!(name in attrList.map)) { + attrValue = attr.value; + + if (attrValue === '{$uid}') + attrValue = 'mce_' + idCount++; + + attrList.map[name] = attrValue; + attrList.push({name: name, value: attrValue}); + } + } + } + + // Handle required attributes + if (attributesRequired) { + i = attributesRequired.length; + while (i--) { + if (attributesRequired[i] in attrList.map) + break; + } + + // None of the required attributes where found + if (i === -1) + isValidElement = false; + } + + // Invalidate element if it's marked as bogus + if (attrList.map['data-mce-bogus']) + isValidElement = false; + } + + if (isValidElement) + self.start(value, attrList, isShortEnded); + } else + isValidElement = false; + + // Treat script, noscript and style a bit different since they may include code that looks like elements + if (endRegExp = specialElements[value]) { + endRegExp.lastIndex = index = matches.index + matches[0].length; + + if (matches = endRegExp.exec(html)) { + if (isValidElement) + text = html.substr(index, matches.index - index); + + index = matches.index + matches[0].length; + } else { + text = html.substr(index); + index = html.length; + } + + if (isValidElement && text.length > 0) + self.text(text, true); + + if (isValidElement) + self.end(value); + + tokenRegExp.lastIndex = index; + continue; + } + + // Push value on to stack + if (!isShortEnded) { + if (!attribsValue || attribsValue.indexOf('/') != attribsValue.length - 1) + stack.push({name: value, valid: isValidElement}); + else if (isValidElement) + self.end(value); + } + } else if (value = matches[1]) { // Comment + self.comment(value); + } else if (value = matches[2]) { // CDATA + self.cdata(value); + } else if (value = matches[3]) { // DOCTYPE + self.doctype(value); + } else if (value = matches[4]) { // PI + self.pi(value, matches[5]); + } + + index = matches.index + matches[0].length; + } + + // Text + if (index < html.length) + self.text(decode(html.substr(index))); + + // Close any open elements + for (i = stack.length - 1; i >= 0; i--) { + value = stack[i]; + + if (value.valid) + self.end(value.name); + } + }; + } +})(tinymce); + +(function(tinymce) { + var whiteSpaceRegExp = /^[ \t\r\n]*$/, typeLookup = { + '#text' : 3, + '#comment' : 8, + '#cdata' : 4, + '#pi' : 7, + '#doctype' : 10, + '#document-fragment' : 11 + }; + + // Walks the tree left/right + function walk(node, root_node, prev) { + var sibling, parent, startName = prev ? 'lastChild' : 'firstChild', siblingName = prev ? 'prev' : 'next'; + + // Walk into nodes if it has a start + if (node[startName]) + return node[startName]; + + // Return the sibling if it has one + if (node !== root_node) { + sibling = node[siblingName]; + + if (sibling) + return sibling; + + // Walk up the parents to look for siblings + for (parent = node.parent; parent && parent !== root_node; parent = parent.parent) { + sibling = parent[siblingName]; + + if (sibling) + return sibling; + } + } + }; + + function Node(name, type) { + this.name = name; + this.type = type; + + if (type === 1) { + this.attributes = []; + this.attributes.map = {}; + } + } + + tinymce.extend(Node.prototype, { + replace : function(node) { + var self = this; + + if (node.parent) + node.remove(); + + self.insert(node, self); + self.remove(); + + return self; + }, + + attr : function(name, value) { + var self = this, attrs, i, undef; + + if (typeof name !== "string") { + for (i in name) + self.attr(i, name[i]); + + return self; + } + + if (attrs = self.attributes) { + if (value !== undef) { + // Remove attribute + if (value === null) { + if (name in attrs.map) { + delete attrs.map[name]; + + i = attrs.length; + while (i--) { + if (attrs[i].name === name) { + attrs = attrs.splice(i, 1); + return self; + } + } + } + + return self; + } + + // Set attribute + if (name in attrs.map) { + // Set attribute + i = attrs.length; + while (i--) { + if (attrs[i].name === name) { + attrs[i].value = value; + break; + } + } + } else + attrs.push({name: name, value: value}); + + attrs.map[name] = value; + + return self; + } else { + return attrs.map[name]; + } + } + }, + + clone : function() { + var self = this, clone = new Node(self.name, self.type), i, l, selfAttrs, selfAttr, cloneAttrs; + + // Clone element attributes + if (selfAttrs = self.attributes) { + cloneAttrs = []; + cloneAttrs.map = {}; + + for (i = 0, l = selfAttrs.length; i < l; i++) { + selfAttr = selfAttrs[i]; + + // Clone everything except id + if (selfAttr.name !== 'id') { + cloneAttrs[cloneAttrs.length] = {name: selfAttr.name, value: selfAttr.value}; + cloneAttrs.map[selfAttr.name] = selfAttr.value; + } + } + + clone.attributes = cloneAttrs; + } + + clone.value = self.value; + clone.shortEnded = self.shortEnded; + + return clone; + }, + + wrap : function(wrapper) { + var self = this; + + self.parent.insert(wrapper, self); + wrapper.append(self); + + return self; + }, + + unwrap : function() { + var self = this, node, next; + + for (node = self.firstChild; node; ) { + next = node.next; + self.insert(node, self, true); + node = next; + } + + self.remove(); + }, + + remove : function() { + var self = this, parent = self.parent, next = self.next, prev = self.prev; + + if (parent) { + if (parent.firstChild === self) { + parent.firstChild = next; + + if (next) + next.prev = null; + } else { + prev.next = next; + } + + if (parent.lastChild === self) { + parent.lastChild = prev; + + if (prev) + prev.next = null; + } else { + next.prev = prev; + } + + self.parent = self.next = self.prev = null; + } + + return self; + }, + + append : function(node) { + var self = this, last; + + if (node.parent) + node.remove(); + + last = self.lastChild; + if (last) { + last.next = node; + node.prev = last; + self.lastChild = node; + } else + self.lastChild = self.firstChild = node; + + node.parent = self; + + return node; + }, + + insert : function(node, ref_node, before) { + var parent; + + if (node.parent) + node.remove(); + + parent = ref_node.parent || this; + + if (before) { + if (ref_node === parent.firstChild) + parent.firstChild = node; + else + ref_node.prev.next = node; + + node.prev = ref_node.prev; + node.next = ref_node; + ref_node.prev = node; + } else { + if (ref_node === parent.lastChild) + parent.lastChild = node; + else + ref_node.next.prev = node; + + node.next = ref_node.next; + node.prev = ref_node; + ref_node.next = node; + } + + node.parent = parent; + + return node; + }, + + getAll : function(name) { + var self = this, node, collection = []; + + for (node = self.firstChild; node; node = walk(node, self)) { + if (node.name === name) + collection.push(node); + } + + return collection; + }, + + empty : function() { + var self = this, nodes, i, node; + + // Remove all children + if (self.firstChild) { + nodes = []; + + // Collect the children + for (node = self.firstChild; node; node = walk(node, self)) + nodes.push(node); + + // Remove the children + i = nodes.length; + while (i--) { + node = nodes[i]; + node.parent = node.firstChild = node.lastChild = node.next = node.prev = null; + } + } + + self.firstChild = self.lastChild = null; + + return self; + }, + + isEmpty : function(elements) { + var self = this, node = self.firstChild, i; + + if (node) { + do { + if (node.type === 1) { + if (node.attributes.map['data-mce-bogus']) + continue; + + // Keep empty elements like <img /> + if (elements[node.name]) + return false; + + // Keep elements with data attributes + i = node.attributes.length; + while (i--) { + if (node.attributes[i].name.indexOf('data-') === 0) + return false; + } + } + + // Keep non whitespace text nodes + if ((node.type === 3 && !whiteSpaceRegExp.test(node.value))) + return false; + } while (node = walk(node, self)); + } + + return true; + } + }); + + tinymce.extend(Node, { + create : function(name, attrs) { + var node, attrName; + + // Create node + node = new Node(name, typeLookup[name] || 1); + + // Add attributes if needed + if (attrs) { + for (attrName in attrs) + node.attr(attrName, attrs[attrName]); + } + + return node; + } + }); + + tinymce.html.Node = Node; +})(tinymce); + +(function(tinymce) { + var Node = tinymce.html.Node; + + tinymce.html.DomParser = function(settings, schema) { + var self = this, nodeFilters = {}, attributeFilters = [], matchedNodes = {}, matchedAttributes = {}; + + settings = settings || {}; + settings.root_name = settings.root_name || 'body'; + self.schema = schema = schema || new tinymce.html.Schema(); + + function fixInvalidChildren(nodes) { + var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i, + childClone, nonEmptyElements, nonSplitableElements, sibling, nextNode; + + nonSplitableElements = tinymce.makeMap('tr,td,th,tbody,thead,tfoot,table'); + nonEmptyElements = schema.getNonEmptyElements(); + + for (ni = 0; ni < nodes.length; ni++) { + node = nodes[ni]; + + // Already removed + if (!node.parent) + continue; + + // Get list of all parent nodes until we find a valid parent to stick the child into + parents = [node]; + for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent) + parents.push(parent); + + // Found a suitable parent + if (parent && parents.length > 1) { + // Reverse the array since it makes looping easier + parents.reverse(); + + // Clone the related parent and insert that after the moved node + newParent = currentNode = self.filterNode(parents[0].clone()); + + // Start cloning and moving children on the left side of the target node + for (i = 0; i < parents.length - 1; i++) { + if (schema.isValidChild(currentNode.name, parents[i].name)) { + tempNode = self.filterNode(parents[i].clone()); + currentNode.append(tempNode); + } else + tempNode = currentNode; + + for (childNode = parents[i].firstChild; childNode && childNode != parents[i + 1]; ) { + nextNode = childNode.next; + tempNode.append(childNode); + childNode = nextNode; + } + + currentNode = tempNode; + } + + if (!newParent.isEmpty(nonEmptyElements)) { + parent.insert(newParent, parents[0], true); + parent.insert(node, newParent); + } else { + parent.insert(node, parents[0], true); + } + + // Check if the element is empty by looking through it's contents and special treatment for <p><br /></p> + parent = parents[0]; + if (parent.isEmpty(nonEmptyElements) || parent.firstChild === parent.lastChild && parent.firstChild.name === 'br') { + parent.empty().remove(); + } + } else if (node.parent) { + // If it's an LI try to find a UL/OL for it or wrap it + if (node.name === 'li') { + sibling = node.prev; + if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { + sibling.append(node); + continue; + } + + sibling = node.next; + if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { + sibling.insert(node, sibling.firstChild, true); + continue; + } + + node.wrap(self.filterNode(new Node('ul', 1))); + continue; + } + + // Try wrapping the element in a DIV + if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) { + node.wrap(self.filterNode(new Node('div', 1))); + } else { + // We failed wrapping it, then remove or unwrap it + if (node.name === 'style' || node.name === 'script') + node.empty().remove(); + else + node.unwrap(); + } + } + } + }; + + self.filterNode = function(node) { + var i, name, list; + + // Run element filters + if (name in nodeFilters) { + list = matchedNodes[name]; + + if (list) + list.push(node); + else + matchedNodes[name] = [node]; + } + + // Run attribute filters + i = attributeFilters.length; + while (i--) { + name = attributeFilters[i].name; + + if (name in node.attributes.map) { + list = matchedAttributes[name]; + + if (list) + list.push(node); + else + matchedAttributes[name] = [node]; + } + } + + return node; + }; + + self.addNodeFilter = function(name, callback) { + tinymce.each(tinymce.explode(name), function(name) { + var list = nodeFilters[name]; + + if (!list) + nodeFilters[name] = list = []; + + list.push(callback); + }); + }; + + self.addAttributeFilter = function(name, callback) { + tinymce.each(tinymce.explode(name), function(name) { + var i; + + for (i = 0; i < attributeFilters.length; i++) { + if (attributeFilters[i].name === name) { + attributeFilters[i].callbacks.push(callback); + return; + } + } + + attributeFilters.push({name: name, callbacks: [callback]}); + }); + }; + + self.parse = function(html, args) { + var parser, rootNode, node, nodes, i, l, fi, fl, list, name, + blockElements, startWhiteSpaceRegExp, invalidChildren = [], + endWhiteSpaceRegExp, allWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements; + + args = args || {}; + matchedNodes = {}; + matchedAttributes = {}; + blockElements = tinymce.extend(tinymce.makeMap('script,style,head,title,meta,param'), schema.getBlockElements()); + nonEmptyElements = schema.getNonEmptyElements(); + children = schema.children; + + whiteSpaceElements = schema.getWhiteSpaceElements(); + startWhiteSpaceRegExp = /^[ \t\r\n]+/; + endWhiteSpaceRegExp = /[ \t\r\n]+$/; + allWhiteSpaceRegExp = /[ \t\r\n]+/g; + + function createNode(name, type) { + var node = new Node(name, type), list; + + if (name in nodeFilters) { + list = matchedNodes[name]; + + if (list) + list.push(node); + else + matchedNodes[name] = [node]; + } + + return node; + }; + + parser = new tinymce.html.SaxParser({ + validate : settings.validate, + fix_self_closing : false, // Let the DOM parser handle <li> in <li> or <p> in <p> for better results + + cdata: function(text) { + node.append(createNode('#cdata', 4)).value = text; + }, + + text: function(text, raw) { + var textNode; + + // Trim all redundant whitespace on non white space elements + if (!whiteSpaceElements[node.name]) { + text = text.replace(allWhiteSpaceRegExp, ' '); + + if (node.lastChild && blockElements[node.lastChild.name]) + text = text.replace(startWhiteSpaceRegExp, ''); + } + + // Do we need to create the node + if (text.length !== 0) { + textNode = createNode('#text', 3); + textNode.raw = !!raw; + node.append(textNode).value = text; + } + }, + + comment: function(text) { + node.append(createNode('#comment', 8)).value = text; + }, + + pi: function(name, text) { + node.append(createNode(name, 7)).value = text; + }, + + doctype: function(text) { + node.append(createNode('#doctype', 10)).value = text; + }, + + start: function(name, attrs, empty) { + var newNode, attrFiltersLen, elementRule, textNode, attrName, text, sibling, parent; + + elementRule = schema.getElementRule(name); + if (elementRule) { + newNode = createNode(elementRule.outputName || name, 1); + newNode.attributes = attrs; + newNode.shortEnded = empty; + + node.append(newNode); + + // Check if node is valid child of the parent node is the child is + // unknown we don't collect it since it's probably a custom element + parent = children[node.name]; + if (parent && children[newNode.name] && !parent[newNode.name]) + invalidChildren.push(newNode); + + attrFiltersLen = attributeFilters.length; + while (attrFiltersLen--) { + attrName = attributeFilters[attrFiltersLen].name; + + if (attrName in attrs.map) { + list = matchedAttributes[attrName]; + + if (list) + list.push(newNode); + else + matchedAttributes[attrName] = [newNode]; + } + } + + // Trim whitespace before block + if (blockElements[name]) { + for (textNode = newNode.prev; textNode && textNode.type === 3; ) { + text = textNode.value.replace(endWhiteSpaceRegExp, ''); + + if (text.length > 0) { + textNode.value = text; + textNode = textNode.prev; + } else { + sibling = textNode.prev; + textNode.remove(); + textNode = sibling; + } + } + } + + // Change current node if the element wasn't empty i.e not <br /> or <img /> + if (!empty) + node = newNode; + } + }, + + end: function(name) { + var textNode, elementRule, text, sibling, tempNode; + + elementRule = schema.getElementRule(name); + if (elementRule) { + if (blockElements[name]) { + if (!whiteSpaceElements[node.name]) { + // Trim whitespace at beginning of block + for (textNode = node.firstChild; textNode && textNode.type === 3; ) { + text = textNode.value.replace(startWhiteSpaceRegExp, ''); + + if (text.length > 0) { + textNode.value = text; + textNode = textNode.next; + } else { + sibling = textNode.next; + textNode.remove(); + textNode = sibling; + } + } + + // Trim whitespace at end of block + for (textNode = node.lastChild; textNode && textNode.type === 3; ) { + text = textNode.value.replace(endWhiteSpaceRegExp, ''); + + if (text.length > 0) { + textNode.value = text; + textNode = textNode.prev; + } else { + sibling = textNode.prev; + textNode.remove(); + textNode = sibling; + } + } + } + + // Trim start white space + textNode = node.prev; + if (textNode && textNode.type === 3) { + text = textNode.value.replace(startWhiteSpaceRegExp, ''); + + if (text.length > 0) + textNode.value = text; + else + textNode.remove(); + } + } + + // Handle empty nodes + if (elementRule.removeEmpty || elementRule.paddEmpty) { + if (node.isEmpty(nonEmptyElements)) { + if (elementRule.paddEmpty) + node.empty().append(new Node('#text', '3')).value = '\u00a0'; + else { + // Leave nodes that have a name like <a name="name"> + if (!node.attributes.map.name) { + tempNode = node.parent; + node.empty().remove(); + node = tempNode; + return; + } + } + } + } + + node = node.parent; + } + } + }, schema); + + rootNode = node = new Node(settings.root_name, 11); + + parser.parse(html); + + fixInvalidChildren(invalidChildren); + + // Run node filters + for (name in matchedNodes) { + list = nodeFilters[name]; + nodes = matchedNodes[name]; + + // Remove already removed children + fi = nodes.length; + while (fi--) { + if (!nodes[fi].parent) + nodes.splice(fi, 1); + } + + for (i = 0, l = list.length; i < l; i++) + list[i](nodes, name, args); + } + + // Run attribute filters + for (i = 0, l = attributeFilters.length; i < l; i++) { + list = attributeFilters[i]; + + if (list.name in matchedAttributes) { + nodes = matchedAttributes[list.name]; + + // Remove already removed children + fi = nodes.length; + while (fi--) { + if (!nodes[fi].parent) + nodes.splice(fi, 1); + } + + for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) + list.callbacks[fi](nodes, list.name, args); + } + } + + return rootNode; + }; + + // Remove <br> at end of block elements Gecko and WebKit injects BR elements to + // make it possible to place the caret inside empty blocks. This logic tries to remove + // these elements and keep br elements that where intended to be there intact + if (settings.remove_trailing_brs) { + self.addNodeFilter('br', function(nodes, name) { + var i, l = nodes.length, node, blockElements = schema.getBlockElements(), + nonEmptyElements = schema.getNonEmptyElements(), parent, prev, prevName; + + // Must loop forwards since it will otherwise remove all brs in <p>a<br><br><br></p> + for (i = 0; i < l; i++) { + node = nodes[i]; + parent = node.parent; + + if (blockElements[node.parent.name] && node === parent.lastChild) { + // Loop all nodes to the right of the current node and check for other BR elements + // excluding bookmarks since they are invisible + prev = node.prev; + while (prev) { + prevName = prev.name; + + // Ignore bookmarks + if (prevName !== "span" || prev.attr('data-mce-type') !== 'bookmark') { + // Found a non BR element + if (prevName !== "br") + break; + + // Found another br it's a <br><br> structure then don't remove anything + if (prevName === 'br') { + node = null; + break; + } + } + + prev = prev.prev; + } + + if (node) { + node.remove(); + + // Is the parent to be considered empty after we removed the BR + if (parent.isEmpty(nonEmptyElements)) { + elementRule = schema.getElementRule(parent.name); + + // Remove or padd the element depending on schema rule + if (elementRule.removeEmpty) + parent.remove(); + else if (elementRule.paddEmpty) + parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0'; + } + } + } + } + }); + } + } +})(tinymce); + +tinymce.html.Writer = function(settings) { + var html = [], indent, indentBefore, indentAfter, encode, htmlOutput; + + settings = settings || {}; + indent = settings.indent; + indentBefore = tinymce.makeMap(settings.indent_before || ''); + indentAfter = tinymce.makeMap(settings.indent_after || ''); + encode = tinymce.html.Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities); + htmlOutput = settings.element_format == "html"; + + return { + start: function(name, attrs, empty) { + var i, l, attr, value; + + if (indent && indentBefore[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + } + + html.push('<', name); + + if (attrs) { + for (i = 0, l = attrs.length; i < l; i++) { + attr = attrs[i]; + html.push(' ', attr.name, '="', encode(attr.value, true), '"'); + } + } + + if (!empty || htmlOutput) + html[html.length] = '>'; + else + html[html.length] = ' />'; + + /*if (indent && indentAfter[name]) + html.push('\n');*/ + }, + + end: function(name) { + var value; + + /*if (indent && indentBefore[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + }*/ + + html.push('</', name, '>'); + + if (indent && indentAfter[name] && html.length > 0) { + value = html[html.length - 1]; + + if (value.length > 0 && value !== '\n') + html.push('\n'); + } + }, + + text: function(text, raw) { + if (text.length > 0) + html[html.length] = raw ? text : encode(text); + }, + + cdata: function(text) { + html.push('<![CDATA[', text, ']]>'); + }, + + comment: function(text) { + html.push('<!--', text, '-->'); + }, + + pi: function(name, text) { + if (text) + html.push('<?', name, ' ', text, '?>'); + else + html.push('<?', name, '?>'); + }, + + doctype: function(text) { + html.push('<!DOCTYPE', text, '>'); + }, + + reset: function() { + html.length = 0; + }, + + getContent: function() { + return html.join('').replace(/\n$/, ''); + } + }; +}; + +(function(tinymce) { + tinymce.html.Serializer = function(settings, schema) { + var self = this, writer = new tinymce.html.Writer(settings); + + settings = settings || {}; + settings.validate = "validate" in settings ? settings.validate : true; + + self.schema = schema = schema || new tinymce.html.Schema(); + self.writer = writer; + + self.serialize = function(node) { + var handlers, validate; + + validate = settings.validate; + + handlers = { + // #text + 3: function(node, raw) { + writer.text(node.value, node.raw); + }, + + // #comment + 8: function(node) { + writer.comment(node.value); + }, + + // Processing instruction + 7: function(node) { + writer.pi(node.name, node.value); + }, + + // Doctype + 10: function(node) { + writer.doctype(node.value); + }, + + // CDATA + 4: function(node) { + writer.cdata(node.value); + }, + + // Document fragment + 11: function(node) { + if ((node = node.firstChild)) { + do { + walk(node); + } while (node = node.next); + } + } + }; + + writer.reset(); + + function walk(node) { + var handler = handlers[node.type], name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule; + + if (!handler) { + name = node.name; + isEmpty = node.shortEnded; + attrs = node.attributes; + + // Sort attributes + if (validate && attrs && attrs.length > 1) { + sortedAttrs = []; + sortedAttrs.map = {}; + + elementRule = schema.getElementRule(node.name); + for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) { + attrName = elementRule.attributesOrder[i]; + + if (attrName in attrs.map) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({name: attrName, value: attrValue}); + } + } + + for (i = 0, l = attrs.length; i < l; i++) { + attrName = attrs[i].name; + + if (!(attrName in sortedAttrs.map)) { + attrValue = attrs.map[attrName]; + sortedAttrs.map[attrName] = attrValue; + sortedAttrs.push({name: attrName, value: attrValue}); + } + } + + attrs = sortedAttrs; + } + + writer.start(node.name, attrs, isEmpty); + + if (!isEmpty) { + if ((node = node.firstChild)) { + do { + walk(node); + } while (node = node.next); + } + + writer.end(name); + } + } else + handler(node); + } + + // Serialize element and treat all non elements as fragments + if (node.type == 1 && !settings.inner) + walk(node); + else + handlers[11](node); + + return writer.getContent(); + }; + } +})(tinymce); + +(function(tinymce) { + // Shorten names + var each = tinymce.each, + is = tinymce.is, + isWebKit = tinymce.isWebKit, + isIE = tinymce.isIE, + Entities = tinymce.html.Entities, + simpleSelectorRe = /^([a-z0-9],?)+$/i, + blockElementsMap = tinymce.html.Schema.blockElementsMap; + + tinymce.create('tinymce.dom.DOMUtils', { + doc : null, + root : null, + files : null, + pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, + props : { + "for" : "htmlFor", + "class" : "className", + className : "className", + checked : "checked", + disabled : "disabled", + maxlength : "maxLength", + readonly : "readOnly", + selected : "selected", + value : "value", + id : "id", + name : "name", + type : "type" + }, + + DOMUtils : function(d, s) { + var t = this, globalStyle; + + t.doc = d; + t.win = window; + t.files = {}; + t.cssFlicker = false; + t.counter = 0; + t.stdMode = !tinymce.isIE || d.documentMode >= 8; + t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" || t.stdMode; + t.hasOuterHTML = "outerHTML" in d.createElement("a"); + + t.settings = s = tinymce.extend({ + keep_values : false, + hex_colors : 1 + }, s); + + t.styles = new tinymce.html.Styles({ + url_converter : s.url_converter, + url_converter_scope : s.url_converter_scope + }, s.schema); + + // Fix IE6SP2 flicker and check it failed for pre SP2 + if (tinymce.isIE6) { + try { + d.execCommand('BackgroundImageCache', false, true); + } catch (e) { + t.cssFlicker = true; + } + } + + if (isIE) { + // Add missing HTML 4/5 elements to IE + ('abbr article aside audio canvas ' + + 'details figcaption figure footer ' + + 'header hgroup mark menu meter nav ' + + 'output progress section summary ' + + 'time video').replace(/\w+/g, function(name) { + d.createElement(name); + }); + } + + tinymce.addUnload(t.destroy, t); + }, + + getRoot : function() { + var t = this, s = t.settings; + + return (s && t.get(s.root_element)) || t.doc.body; + }, + + getViewPort : function(w) { + var d, b; + + w = !w ? this.win : w; + d = w.document; + b = this.boxModel ? d.documentElement : d.body; + + // Returns viewport size excluding scrollbars + return { + x : w.pageXOffset || b.scrollLeft, + y : w.pageYOffset || b.scrollTop, + w : w.innerWidth || b.clientWidth, + h : w.innerHeight || b.clientHeight + }; + }, + + getRect : function(e) { + var p, t = this, sr; + + e = t.get(e); + p = t.getPos(e); + sr = t.getSize(e); + + return { + x : p.x, + y : p.y, + w : sr.w, + h : sr.h + }; + }, + + getSize : function(e) { + var t = this, w, h; + + e = t.get(e); + w = t.getStyle(e, 'width'); + h = t.getStyle(e, 'height'); + + // Non pixel value, then force offset/clientWidth + if (w.indexOf('px') === -1) + w = 0; + + // Non pixel value, then force offset/clientWidth + if (h.indexOf('px') === -1) + h = 0; + + return { + w : parseInt(w) || e.offsetWidth || e.clientWidth, + h : parseInt(h) || e.offsetHeight || e.clientHeight + }; + }, + + getParent : function(n, f, r) { + return this.getParents(n, f, r, false); + }, + + getParents : function(n, f, r, c) { + var t = this, na, se = t.settings, o = []; + + n = t.get(n); + c = c === undefined; + + if (se.strict_root) + r = r || t.getRoot(); + + // Wrap node name as func + if (is(f, 'string')) { + na = f; + + if (f === '*') { + f = function(n) {return n.nodeType == 1;}; + } else { + f = function(n) { + return t.is(n, na); + }; + } + } + + while (n) { + if (n == r || !n.nodeType || n.nodeType === 9) + break; + + if (!f || f(n)) { + if (c) + o.push(n); + else + return n; + } + + n = n.parentNode; + } + + return c ? o : null; + }, + + get : function(e) { + var n; + + if (e && this.doc && typeof(e) == 'string') { + n = e; + e = this.doc.getElementById(e); + + // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick + if (e && e.id !== n) + return this.doc.getElementsByName(n)[1]; + } + + return e; + }, + + getNext : function(node, selector) { + return this._findSib(node, selector, 'nextSibling'); + }, + + getPrev : function(node, selector) { + return this._findSib(node, selector, 'previousSibling'); + }, + + + select : function(pa, s) { + var t = this; + + return tinymce.dom.Sizzle(pa, t.get(s) || t.get(t.settings.root_element) || t.doc, []); + }, + + is : function(n, selector) { + var i; + + // If it isn't an array then try to do some simple selectors instead of Sizzle for to boost performance + if (n.length === undefined) { + // Simple all selector + if (selector === '*') + return n.nodeType == 1; + + // Simple selector just elements + if (simpleSelectorRe.test(selector)) { + selector = selector.toLowerCase().split(/,/); + n = n.nodeName.toLowerCase(); + + for (i = selector.length - 1; i >= 0; i--) { + if (selector[i] == n) + return true; + } + + return false; + } + } + + return tinymce.dom.Sizzle.matches(selector, n.nodeType ? [n] : n).length > 0; + }, + + + add : function(p, n, a, h, c) { + var t = this; + + return this.run(p, function(p) { + var e, k; + + e = is(n, 'string') ? t.doc.createElement(n) : n; + t.setAttribs(e, a); + + if (h) { + if (h.nodeType) + e.appendChild(h); + else + t.setHTML(e, h); + } + + return !c ? p.appendChild(e) : e; + }); + }, + + create : function(n, a, h) { + return this.add(this.doc.createElement(n), n, a, h, 1); + }, + + createHTML : function(n, a, h) { + var o = '', t = this, k; + + o += '<' + n; + + for (k in a) { + if (a.hasOwnProperty(k)) + o += ' ' + k + '="' + t.encode(a[k]) + '"'; + } + + // A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime + if (typeof(h) != "undefined") + return o + '>' + h + '</' + n + '>'; + + return o + ' />'; + }, + + remove : function(node, keep_children) { + return this.run(node, function(node) { + var parent, child; + + parent = node.parentNode; + + if (!parent) + return null; + + if (keep_children) { + while (child = node.firstChild) { + // IE 8 will crash if you don't remove completely empty text nodes + if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue) + parent.insertBefore(child, node); + else + node.removeChild(child); + } + } + + return parent.removeChild(node); + }); + }, + + setStyle : function(n, na, v) { + var t = this; + + return t.run(n, function(e) { + var s, i; + + s = e.style; + + // Camelcase it, if needed + na = na.replace(/-(\D)/g, function(a, b){ + return b.toUpperCase(); + }); + + // Default px suffix on these + if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) + v += 'px'; + + switch (na) { + case 'opacity': + // IE specific opacity + if (isIE) { + s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; + + if (!n.currentStyle || !n.currentStyle.hasLayout) + s.display = 'inline-block'; + } + + // Fix for older browsers + s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || ''; + break; + + case 'float': + isIE ? s.styleFloat = v : s.cssFloat = v; + break; + + default: + s[na] = v || ''; + } + + // Force update of the style data + if (t.settings.update_styles) + t.setAttrib(e, 'data-mce-style'); + }); + }, + + getStyle : function(n, na, c) { + n = this.get(n); + + if (!n) + return false; + + // Gecko + if (this.doc.defaultView && c) { + // Remove camelcase + na = na.replace(/[A-Z]/g, function(a){ + return '-' + a; + }); + + try { + return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); + } catch (ex) { + // Old safari might fail + return null; + } + } + + // Camelcase it, if needed + na = na.replace(/-(\D)/g, function(a, b){ + return b.toUpperCase(); + }); + + if (na == 'float') + na = isIE ? 'styleFloat' : 'cssFloat'; + + // IE & Opera + if (n.currentStyle && c) + return n.currentStyle[na]; + + return n.style[na]; + }, + + setStyles : function(e, o) { + var t = this, s = t.settings, ol; + + ol = s.update_styles; + s.update_styles = 0; + + each(o, function(v, n) { + t.setStyle(e, n, v); + }); + + // Update style info + s.update_styles = ol; + if (s.update_styles) + t.setAttrib(e, s.cssText); + }, + + removeAllAttribs: function(e) { + return this.run(e, function(e) { + var attrs = e.attributes; + for (var i = attrs.length - 1; i >= 0; i--) { + e.removeAttributeNode(attrs.item(i)); + } + }); + }, + + setAttrib : function(e, n, v) { + var t = this; + + // Whats the point + if (!e || !n) + return; + + // Strict XML mode + if (t.settings.strict) + n = n.toLowerCase(); + + return this.run(e, function(e) { + var s = t.settings; + + switch (n) { + case "style": + if (!is(v, 'string')) { + each(v, function(v, n) { + t.setStyle(e, n, v); + }); + + return; + } + + // No mce_style for elements with these since they might get resized by the user + if (s.keep_values) { + if (v && !t._isRes(v)) + e.setAttribute('data-mce-style', v, 2); + else + e.removeAttribute('data-mce-style', 2); + } + + e.style.cssText = v; + break; + + case "class": + e.className = v || ''; // Fix IE null bug + break; + + case "src": + case "href": + if (s.keep_values) { + if (s.url_converter) + v = s.url_converter.call(s.url_converter_scope || t, v, n, e); + + t.setAttrib(e, 'data-mce-' + n, v, 2); + } + + break; + + case "shape": + e.setAttribute('data-mce-style', v); + break; + } + + if (is(v) && v !== null && v.length !== 0) + e.setAttribute(n, '' + v, 2); + else + e.removeAttribute(n, 2); + }); + }, + + setAttribs : function(e, o) { + var t = this; + + return this.run(e, function(e) { + each(o, function(v, n) { + t.setAttrib(e, n, v); + }); + }); + }, + + getAttrib : function(e, n, dv) { + var v, t = this; + + e = t.get(e); + + if (!e || e.nodeType !== 1) + return false; + + if (!is(dv)) + dv = ''; + + // Try the mce variant for these + if (/^(src|href|style|coords|shape)$/.test(n)) { + v = e.getAttribute("data-mce-" + n); + + if (v) + return v; + } + + if (isIE && t.props[n]) { + v = e[t.props[n]]; + v = v && v.nodeValue ? v.nodeValue : v; + } + + if (!v) + v = e.getAttribute(n, 2); + + // Check boolean attribs + if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) { + if (e[t.props[n]] === true && v === '') + return n; + + return v ? n : ''; + } + + // Inner input elements will override attributes on form elements + if (e.nodeName === "FORM" && e.getAttributeNode(n)) + return e.getAttributeNode(n).nodeValue; + + if (n === 'style') { + v = v || e.style.cssText; + + if (v) { + v = t.serializeStyle(t.parseStyle(v), e.nodeName); + + if (t.settings.keep_values && !t._isRes(v)) + e.setAttribute('data-mce-style', v); + } + } + + // Remove Apple and WebKit stuff + if (isWebKit && n === "class" && v) + v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); + + // Handle IE issues + if (isIE) { + switch (n) { + case 'rowspan': + case 'colspan': + // IE returns 1 as default value + if (v === 1) + v = ''; + + break; + + case 'size': + // IE returns +0 as default value for size + if (v === '+0' || v === 20 || v === 0) + v = ''; + + break; + + case 'width': + case 'height': + case 'vspace': + case 'checked': + case 'disabled': + case 'readonly': + if (v === 0) + v = ''; + + break; + + case 'hspace': + // IE returns -1 as default value + if (v === -1) + v = ''; + + break; + + case 'maxlength': + case 'tabindex': + // IE returns default value + if (v === 32768 || v === 2147483647 || v === '32768') + v = ''; + + break; + + case 'multiple': + case 'compact': + case 'noshade': + case 'nowrap': + if (v === 65535) + return n; + + return dv; + + case 'shape': + v = v.toLowerCase(); + break; + + default: + // IE has odd anonymous function for event attributes + if (n.indexOf('on') === 0 && v) + v = tinymce._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1', '' + v); + } + } + + return (v !== undefined && v !== null && v !== '') ? '' + v : dv; + }, + + getPos : function(n, ro) { + var t = this, x = 0, y = 0, e, d = t.doc, r; + + n = t.get(n); + ro = ro || d.body; + + if (n) { + // Use getBoundingClientRect on IE, Opera has it but it's not perfect + if (isIE && !t.stdMode) { + n = n.getBoundingClientRect(); + e = t.boxModel ? d.documentElement : d.body; + x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border + x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x; + + return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x}; + } + + r = n; + while (r && r != ro && r.nodeType) { + x += r.offsetLeft || 0; + y += r.offsetTop || 0; + r = r.offsetParent; + } + + r = n.parentNode; + while (r && r != ro && r.nodeType) { + x -= r.scrollLeft || 0; + y -= r.scrollTop || 0; + r = r.parentNode; + } + } + + return {x : x, y : y}; + }, + + parseStyle : function(st) { + return this.styles.parse(st); + }, + + serializeStyle : function(o, name) { + return this.styles.serialize(o, name); + }, + + loadCSS : function(u) { + var t = this, d = t.doc, head; + + if (!u) + u = ''; + + head = t.select('head')[0]; + + each(u.split(','), function(u) { + var link; + + if (t.files[u]) + return; + + t.files[u] = true; + link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)}); + + // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug + // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading + // It's ugly but it seems to work fine. + if (isIE && d.documentMode && d.recalc) { + link.onload = function() { + if (d.recalc) + d.recalc(); + + link.onload = null; + }; + } + + head.appendChild(link); + }); + }, + + addClass : function(e, c) { + return this.run(e, function(e) { + var o; + + if (!c) + return 0; + + if (this.hasClass(e, c)) + return e.className; + + o = this.removeClass(e, c); + + return e.className = (o != '' ? (o + ' ') : '') + c; + }); + }, + + removeClass : function(e, c) { + var t = this, re; + + return t.run(e, function(e) { + var v; + + if (t.hasClass(e, c)) { + if (!re) + re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); + + v = e.className.replace(re, ' '); + v = tinymce.trim(v != ' ' ? v : ''); + + e.className = v; + + // Empty class attr + if (!v) { + e.removeAttribute('class'); + e.removeAttribute('className'); + } + + return v; + } + + return e.className; + }); + }, + + hasClass : function(n, c) { + n = this.get(n); + + if (!n || !c) + return false; + + return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; + }, + + show : function(e) { + return this.setStyle(e, 'display', 'block'); + }, + + hide : function(e) { + return this.setStyle(e, 'display', 'none'); + }, + + isHidden : function(e) { + e = this.get(e); + + return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; + }, + + uniqueId : function(p) { + return (!p ? 'mce_' : p) + (this.counter++); + }, + + setHTML : function(element, html) { + var self = this; + + return self.run(element, function(element) { + if (isIE) { + // Remove all child nodes, IE keeps empty text nodes in DOM + while (element.firstChild) + element.removeChild(element.firstChild); + + try { + // IE will remove comments from the beginning + // unless you padd the contents with something + element.innerHTML = '<br />' + html; + element.removeChild(element.firstChild); + } catch (ex) { + // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p + // This seems to fix this problem + + // Create new div with HTML contents and a BR infront to keep comments + element = self.create('div'); + element.innerHTML = '<br />' + html; + + // Add all children from div to target + each (element.childNodes, function(node, i) { + // Skip br element + if (i) + element.appendChild(node); + }); + } + } else + element.innerHTML = html; + + return html; + }); + }, + + getOuterHTML : function(elm) { + var doc, self = this; + + elm = self.get(elm); + + if (!elm) + return null; + + if (elm.nodeType === 1 && self.hasOuterHTML) + return elm.outerHTML; + + doc = (elm.ownerDocument || self.doc).createElement("body"); + doc.appendChild(elm.cloneNode(true)); + + return doc.innerHTML; + }, + + setOuterHTML : function(e, h, d) { + var t = this; + + function setHTML(e, h, d) { + var n, tp; + + tp = d.createElement("body"); + tp.innerHTML = h; + + n = tp.lastChild; + while (n) { + t.insertAfter(n.cloneNode(true), e); + n = n.previousSibling; + } + + t.remove(e); + }; + + return this.run(e, function(e) { + e = t.get(e); + + // Only set HTML on elements + if (e.nodeType == 1) { + d = d || e.ownerDocument || t.doc; + + if (isIE) { + try { + // Try outerHTML for IE it sometimes produces an unknown runtime error + if (isIE && e.nodeType == 1) + e.outerHTML = h; + else + setHTML(e, h, d); + } catch (ex) { + // Fix for unknown runtime error + setHTML(e, h, d); + } + } else + setHTML(e, h, d); + } + }); + }, + + decode : Entities.decode, + + encode : Entities.encodeAllRaw, + + insertAfter : function(node, reference_node) { + reference_node = this.get(reference_node); + + return this.run(node, function(node) { + var parent, nextSibling; + + parent = reference_node.parentNode; + nextSibling = reference_node.nextSibling; + + if (nextSibling) + parent.insertBefore(node, nextSibling); + else + parent.appendChild(node); + + return node; + }); + }, + + isBlock : function(node) { + var type = node.nodeType; + + // If it's a node then check the type and use the nodeName + if (type) + return !!(type === 1 && blockElementsMap[node.nodeName]); + + return !!blockElementsMap[node]; + }, + + replace : function(n, o, k) { + var t = this; + + if (is(o, 'array')) + n = n.cloneNode(true); + + return t.run(o, function(o) { + if (k) { + each(tinymce.grep(o.childNodes), function(c) { + n.appendChild(c); + }); + } + + return o.parentNode.replaceChild(n, o); + }); + }, + + rename : function(elm, name) { + var t = this, newElm; + + if (elm.nodeName != name.toUpperCase()) { + // Rename block element + newElm = t.create(name); + + // Copy attribs to new block + each(t.getAttribs(elm), function(attr_node) { + t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName)); + }); + + // Replace block + t.replace(newElm, elm, 1); + } + + return newElm || elm; + }, + + findCommonAncestor : function(a, b) { + var ps = a, pe; + + while (ps) { + pe = b; + + while (pe && ps != pe) + pe = pe.parentNode; + + if (ps == pe) + break; + + ps = ps.parentNode; + } + + if (!ps && a.ownerDocument) + return a.ownerDocument.documentElement; + + return ps; + }, + + toHex : function(s) { + var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); + + function hex(s) { + s = parseInt(s).toString(16); + + return s.length > 1 ? s : '0' + s; // 0 -> 00 + }; + + if (c) { + s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); + + return s; + } + + return s; + }, + + getClasses : function() { + var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov; + + if (t.classes) + return t.classes; + + function addClasses(s) { + // IE style imports + each(s.imports, function(r) { + addClasses(r); + }); + + each(s.cssRules || s.rules, function(r) { + // Real type or fake it on IE + switch (r.type || 1) { + // Rule + case 1: + if (r.selectorText) { + each(r.selectorText.split(','), function(v) { + v = v.replace(/^\s*|\s*$|^\s\./g, ""); + + // Is internal or it doesn't contain a class + if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v)) + return; + + // Remove everything but class name + ov = v; + v = tinymce._replace(/.*\.([a-z0-9_\-]+).*/i, '$1', v); + + // Filter classes + if (f && !(v = f(v, ov))) + return; + + if (!lo[v]) { + cl.push({'class' : v}); + lo[v] = 1; + } + }); + } + break; + + // Import + case 3: + addClasses(r.styleSheet); + break; + } + }); + }; + + try { + each(t.doc.styleSheets, addClasses); + } catch (ex) { + // Ignore + } + + if (cl.length > 0) + t.classes = cl; + + return cl; + }, + + run : function(e, f, s) { + var t = this, o; + + if (t.doc && typeof(e) === 'string') + e = t.get(e); + + if (!e) + return false; + + s = s || this; + if (!e.nodeType && (e.length || e.length === 0)) { + o = []; + + each(e, function(e, i) { + if (e) { + if (typeof(e) == 'string') + e = t.doc.getElementById(e); + + o.push(f.call(s, e, i)); + } + }); + + return o; + } + + return f.call(s, e); + }, + + getAttribs : function(n) { + var o; + + n = this.get(n); + + if (!n) + return []; + + if (isIE) { + o = []; + + // Object will throw exception in IE + if (n.nodeName == 'OBJECT') + return n.attributes; + + // IE doesn't keep the selected attribute if you clone option elements + if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected')) + o.push({specified : 1, nodeName : 'selected'}); + + // It's crazy that this is faster in IE but it's because it returns all attributes all the time + n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) { + o.push({specified : 1, nodeName : a}); + }); + + return o; + } + + return n.attributes; + }, + + destroy : function(s) { + var t = this; + + if (t.events) + t.events.destroy(); + + t.win = t.doc = t.root = t.events = null; + + // Manual destroy then remove unload handler + if (!s) + tinymce.removeUnload(t.destroy); + }, + + createRng : function() { + var d = this.doc; + + return d.createRange ? d.createRange() : new tinymce.dom.Range(this); + }, + + nodeIndex : function(node, normalized) { + var idx = 0, lastNodeType, lastNode, nodeType, nodeValueExists; + + if (node) { + for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) { + nodeType = node.nodeType; + + // Normalize text nodes + if (normalized && nodeType == 3) { + // ensure that text nodes that have been removed are handled correctly in Internet Explorer. + // (the nodeValue attribute will not exist, and will error here). + nodeValueExists = false; + try {nodeValueExists = node.nodeValue.length} catch (c) {} + if (nodeType == lastNodeType || !nodeValueExists) + continue; + } + idx++; + lastNodeType = nodeType; + } + } + + return idx; + }, + + split : function(pe, e, re) { + var t = this, r = t.createRng(), bef, aft, pa; + + // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense + // but we don't want that in our code since it serves no purpose for the end user + // For example if this is chopped: + // <p>text 1<span><b>CHOP</b></span>text 2</p> + // would produce: + // <p>text 1<span></span></p><b>CHOP</b><p><span></span>text 2</p> + // this function will then trim of empty edges and produce: + // <p>text 1</p><b>CHOP</b><p>text 2</p> + function trim(node) { + var i, children = node.childNodes; + + if (node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark') + return; + + for (i = children.length - 1; i >= 0; i--) + trim(children[i]); + + if (node.nodeType != 9) { + // Keep non whitespace text nodes + if (node.nodeType == 3 && node.nodeValue.length > 0) { + // If parent element isn't a block or there isn't any useful contents for example "<p> </p>" + if (!t.isBlock(node.parentNode) || tinymce.trim(node.nodeValue).length > 0) + return; + } + + if (node.nodeType == 1) { + // If the only child is a bookmark then move it up + children = node.childNodes; + if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') == 'bookmark') + node.parentNode.insertBefore(children[0], node); + + // Keep non empty elements or img, hr etc + if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName)) + return; + } + + t.remove(node); + } + + return node; + }; + + if (pe && e) { + // Get before chunk + r.setStart(pe.parentNode, t.nodeIndex(pe)); + r.setEnd(e.parentNode, t.nodeIndex(e)); + bef = r.extractContents(); + + // Get after chunk + r = t.createRng(); + r.setStart(e.parentNode, t.nodeIndex(e) + 1); + r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1); + aft = r.extractContents(); + + // Insert before chunk + pa = pe.parentNode; + pa.insertBefore(trim(bef), pe); + + // Insert middle chunk + if (re) + pa.replaceChild(re, e); + else + pa.insertBefore(e, pe); + + // Insert after chunk + pa.insertBefore(trim(aft), pe); + t.remove(pe); + + return re || e; + } + }, + + bind : function(target, name, func, scope) { + var t = this; + + if (!t.events) + t.events = new tinymce.dom.EventUtils(); + + return t.events.add(target, name, func, scope || this); + }, + + unbind : function(target, name, func) { + var t = this; + + if (!t.events) + t.events = new tinymce.dom.EventUtils(); + + return t.events.remove(target, name, func); + }, + + + _findSib : function(node, selector, name) { + var t = this, f = selector; + + if (node) { + // If expression make a function of it using is + if (is(f, 'string')) { + f = function(node) { + return t.is(node, selector); + }; + } + + // Loop all siblings + for (node = node[name]; node; node = node[name]) { + if (f(node)) + return node; + } + } + + return null; + }, + + _isRes : function(c) { + // Is live resizble element + return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c); + } + + /* + walk : function(n, f, s) { + var d = this.doc, w; + + if (d.createTreeWalker) { + w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); + + while ((n = w.nextNode()) != null) + f.call(s || this, n); + } else + tinymce.walk(n, f, 'childNodes', s); + } + */ + + /* + toRGB : function(s) { + var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); + + if (c) { + // #FFF -> #FFFFFF + if (!is(c[3])) + c[3] = c[2] = c[1]; + + return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; + } + + return s; + } + */ + }); + + tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); +})(tinymce); + +(function(ns) { + // Range constructor + function Range(dom) { + var t = this, + doc = dom.doc, + EXTRACT = 0, + CLONE = 1, + DELETE = 2, + TRUE = true, + FALSE = false, + START_OFFSET = 'startOffset', + START_CONTAINER = 'startContainer', + END_CONTAINER = 'endContainer', + END_OFFSET = 'endOffset', + extend = tinymce.extend, + nodeIndex = dom.nodeIndex; + + extend(t, { + // Inital states + startContainer : doc, + startOffset : 0, + endContainer : doc, + endOffset : 0, + collapsed : TRUE, + commonAncestorContainer : doc, + + // Range constants + START_TO_START : 0, + START_TO_END : 1, + END_TO_END : 2, + END_TO_START : 3, + + // Public methods + setStart : setStart, + setEnd : setEnd, + setStartBefore : setStartBefore, + setStartAfter : setStartAfter, + setEndBefore : setEndBefore, + setEndAfter : setEndAfter, + collapse : collapse, + selectNode : selectNode, + selectNodeContents : selectNodeContents, + compareBoundaryPoints : compareBoundaryPoints, + deleteContents : deleteContents, + extractContents : extractContents, + cloneContents : cloneContents, + insertNode : insertNode, + surroundContents : surroundContents, + cloneRange : cloneRange + }); + + function setStart(n, o) { + _setEndPoint(TRUE, n, o); + }; + + function setEnd(n, o) { + _setEndPoint(FALSE, n, o); + }; + + function setStartBefore(n) { + setStart(n.parentNode, nodeIndex(n)); + }; + + function setStartAfter(n) { + setStart(n.parentNode, nodeIndex(n) + 1); + }; + + function setEndBefore(n) { + setEnd(n.parentNode, nodeIndex(n)); + }; + + function setEndAfter(n) { + setEnd(n.parentNode, nodeIndex(n) + 1); + }; + + function collapse(ts) { + if (ts) { + t[END_CONTAINER] = t[START_CONTAINER]; + t[END_OFFSET] = t[START_OFFSET]; + } else { + t[START_CONTAINER] = t[END_CONTAINER]; + t[START_OFFSET] = t[END_OFFSET]; + } + + t.collapsed = TRUE; + }; + + function selectNode(n) { + setStartBefore(n); + setEndAfter(n); + }; + + function selectNodeContents(n) { + setStart(n, 0); + setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length); + }; + + function compareBoundaryPoints(h, r) { + var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET], + rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset; + + // Check START_TO_START + if (h === 0) + return _compareBoundaryPoints(sc, so, rsc, rso); + + // Check START_TO_END + if (h === 1) + return _compareBoundaryPoints(ec, eo, rsc, rso); + + // Check END_TO_END + if (h === 2) + return _compareBoundaryPoints(ec, eo, rec, reo); + + // Check END_TO_START + if (h === 3) + return _compareBoundaryPoints(sc, so, rec, reo); + }; + + function deleteContents() { + _traverse(DELETE); + }; + + function extractContents() { + return _traverse(EXTRACT); + }; + + function cloneContents() { + return _traverse(CLONE); + }; + + function insertNode(n) { + var startContainer = this[START_CONTAINER], + startOffset = this[START_OFFSET], nn, o; + + // Node is TEXT_NODE or CDATA + if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) { + if (!startOffset) { + // At the start of text + startContainer.parentNode.insertBefore(n, startContainer); + } else if (startOffset >= startContainer.nodeValue.length) { + // At the end of text + dom.insertAfter(n, startContainer); + } else { + // Middle, need to split + nn = startContainer.splitText(startOffset); + startContainer.parentNode.insertBefore(n, nn); + } + } else { + // Insert element node + if (startContainer.childNodes.length > 0) + o = startContainer.childNodes[startOffset]; + + if (o) + startContainer.insertBefore(n, o); + else + startContainer.appendChild(n); + } + }; + + function surroundContents(n) { + var f = t.extractContents(); + + t.insertNode(n); + n.appendChild(f); + t.selectNode(n); + }; + + function cloneRange() { + return extend(new Range(dom), { + startContainer : t[START_CONTAINER], + startOffset : t[START_OFFSET], + endContainer : t[END_CONTAINER], + endOffset : t[END_OFFSET], + collapsed : t.collapsed, + commonAncestorContainer : t.commonAncestorContainer + }); + }; + + // Private methods + + function _getSelectedNode(container, offset) { + var child; + + if (container.nodeType == 3 /* TEXT_NODE */) + return container; + + if (offset < 0) + return container; + + child = container.firstChild; + while (child && offset > 0) { + --offset; + child = child.nextSibling; + } + + if (child) + return child; + + return container; + }; + + function _isCollapsed() { + return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]); + }; + + function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { + var c, offsetC, n, cmnRoot, childA, childB; + + // In the first case the boundary-points have the same container. A is before B + // if its offset is less than the offset of B, A is equal to B if its offset is + // equal to the offset of B, and A is after B if its offset is greater than the + // offset of B. + if (containerA == containerB) { + if (offsetA == offsetB) + return 0; // equal + + if (offsetA < offsetB) + return -1; // before + + return 1; // after + } + + // In the second case a child node C of the container of A is an ancestor + // container of B. In this case, A is before B if the offset of A is less than or + // equal to the index of the child node C and A is after B otherwise. + c = containerB; + while (c && c.parentNode != containerA) + c = c.parentNode; + + if (c) { + offsetC = 0; + n = containerA.firstChild; + + while (n != c && offsetC < offsetA) { + offsetC++; + n = n.nextSibling; + } + + if (offsetA <= offsetC) + return -1; // before + + return 1; // after + } + + // In the third case a child node C of the container of B is an ancestor container + // of A. In this case, A is before B if the index of the child node C is less than + // the offset of B and A is after B otherwise. + c = containerA; + while (c && c.parentNode != containerB) { + c = c.parentNode; + } + + if (c) { + offsetC = 0; + n = containerB.firstChild; + + while (n != c && offsetC < offsetB) { + offsetC++; + n = n.nextSibling; + } + + if (offsetC < offsetB) + return -1; // before + + return 1; // after + } + + // In the fourth case, none of three other cases hold: the containers of A and B + // are siblings or descendants of sibling nodes. In this case, A is before B if + // the container of A is before the container of B in a pre-order traversal of the + // Ranges' context tree and A is after B otherwise. + cmnRoot = dom.findCommonAncestor(containerA, containerB); + childA = containerA; + + while (childA && childA.parentNode != cmnRoot) + childA = childA.parentNode; + + if (!childA) + childA = cmnRoot; + + childB = containerB; + while (childB && childB.parentNode != cmnRoot) + childB = childB.parentNode; + + if (!childB) + childB = cmnRoot; + + if (childA == childB) + return 0; // equal + + n = cmnRoot.firstChild; + while (n) { + if (n == childA) + return -1; // before + + if (n == childB) + return 1; // after + + n = n.nextSibling; + } + }; + + function _setEndPoint(st, n, o) { + var ec, sc; + + if (st) { + t[START_CONTAINER] = n; + t[START_OFFSET] = o; + } else { + t[END_CONTAINER] = n; + t[END_OFFSET] = o; + } + + // If one boundary-point of a Range is set to have a root container + // other than the current one for the Range, the Range is collapsed to + // the new position. This enforces the restriction that both boundary- + // points of a Range must have the same root container. + ec = t[END_CONTAINER]; + while (ec.parentNode) + ec = ec.parentNode; + + sc = t[START_CONTAINER]; + while (sc.parentNode) + sc = sc.parentNode; + + if (sc == ec) { + // The start position of a Range is guaranteed to never be after the + // end position. To enforce this restriction, if the start is set to + // be at a position after the end, the Range is collapsed to that + // position. + if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) + t.collapse(st); + } else + t.collapse(st); + + t.collapsed = _isCollapsed(); + t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]); + }; + + function _traverse(how) { + var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep; + + if (t[START_CONTAINER] == t[END_CONTAINER]) + return _traverseSameContainer(how); + + for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { + if (p == t[START_CONTAINER]) + return _traverseCommonStartContainer(c, how); + + ++endContainerDepth; + } + + for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { + if (p == t[END_CONTAINER]) + return _traverseCommonEndContainer(c, how); + + ++startContainerDepth; + } + + depthDiff = startContainerDepth - endContainerDepth; + + startNode = t[START_CONTAINER]; + while (depthDiff > 0) { + startNode = startNode.parentNode; + depthDiff--; + } + + endNode = t[END_CONTAINER]; + while (depthDiff < 0) { + endNode = endNode.parentNode; + depthDiff++; + } + + // ascend the ancestor hierarchy until we have a common parent. + for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) { + startNode = sp; + endNode = ep; + } + + return _traverseCommonAncestors(startNode, endNode, how); + }; + + function _traverseSameContainer(how) { + var frag, s, sub, n, cnt, sibling, xferNode; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + // If selection is empty, just return the fragment + if (t[START_OFFSET] == t[END_OFFSET]) + return frag; + + // Text node needs special case handling + if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) { + // get the substring + s = t[START_CONTAINER].nodeValue; + sub = s.substring(t[START_OFFSET], t[END_OFFSET]); + + // set the original text node to its new value + if (how != CLONE) { + t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]); + + // Nothing is partially selected, so collapse to start point + t.collapse(TRUE); + } + + if (how == DELETE) + return; + + frag.appendChild(doc.createTextNode(sub)); + return frag; + } + + // Copy nodes between the start/end offsets. + n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]); + cnt = t[END_OFFSET] - t[START_OFFSET]; + + while (cnt > 0) { + sibling = n.nextSibling; + xferNode = _traverseFullySelected(n, how); + + if (frag) + frag.appendChild( xferNode ); + + --cnt; + n = sibling; + } + + // Nothing is partially selected, so collapse to start point + if (how != CLONE) + t.collapse(TRUE); + + return frag; + }; + + function _traverseCommonStartContainer(endAncestor, how) { + var frag, n, endIdx, cnt, sibling, xferNode; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + n = _traverseRightBoundary(endAncestor, how); + + if (frag) + frag.appendChild(n); + + endIdx = nodeIndex(endAncestor); + cnt = endIdx - t[START_OFFSET]; + + if (cnt <= 0) { + // Collapse to just before the endAncestor, which + // is partially selected. + if (how != CLONE) { + t.setEndBefore(endAncestor); + t.collapse(FALSE); + } + + return frag; + } + + n = endAncestor.previousSibling; + while (cnt > 0) { + sibling = n.previousSibling; + xferNode = _traverseFullySelected(n, how); + + if (frag) + frag.insertBefore(xferNode, frag.firstChild); + + --cnt; + n = sibling; + } + + // Collapse to just before the endAncestor, which + // is partially selected. + if (how != CLONE) { + t.setEndBefore(endAncestor); + t.collapse(FALSE); + } + + return frag; + }; + + function _traverseCommonEndContainer(startAncestor, how) { + var frag, startIdx, n, cnt, sibling, xferNode; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + n = _traverseLeftBoundary(startAncestor, how); + if (frag) + frag.appendChild(n); + + startIdx = nodeIndex(startAncestor); + ++startIdx; // Because we already traversed it + + cnt = t[END_OFFSET] - startIdx; + n = startAncestor.nextSibling; + while (cnt > 0) { + sibling = n.nextSibling; + xferNode = _traverseFullySelected(n, how); + + if (frag) + frag.appendChild(xferNode); + + --cnt; + n = sibling; + } + + if (how != CLONE) { + t.setStartAfter(startAncestor); + t.collapse(TRUE); + } + + return frag; + }; + + function _traverseCommonAncestors(startAncestor, endAncestor, how) { + var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling; + + if (how != DELETE) + frag = doc.createDocumentFragment(); + + n = _traverseLeftBoundary(startAncestor, how); + if (frag) + frag.appendChild(n); + + commonParent = startAncestor.parentNode; + startOffset = nodeIndex(startAncestor); + endOffset = nodeIndex(endAncestor); + ++startOffset; + + cnt = endOffset - startOffset; + sibling = startAncestor.nextSibling; + + while (cnt > 0) { + nextSibling = sibling.nextSibling; + n = _traverseFullySelected(sibling, how); + + if (frag) + frag.appendChild(n); + + sibling = nextSibling; + --cnt; + } + + n = _traverseRightBoundary(endAncestor, how); + + if (frag) + frag.appendChild(n); + + if (how != CLONE) { + t.setStartAfter(startAncestor); + t.collapse(TRUE); + } + + return frag; + }; + + function _traverseRightBoundary(root, how) { + var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER]; + + if (next == root) + return _traverseNode(next, isFullySelected, FALSE, how); + + parent = next.parentNode; + clonedParent = _traverseNode(parent, FALSE, FALSE, how); + + while (parent) { + while (next) { + prevSibling = next.previousSibling; + clonedChild = _traverseNode(next, isFullySelected, FALSE, how); + + if (how != DELETE) + clonedParent.insertBefore(clonedChild, clonedParent.firstChild); + + isFullySelected = TRUE; + next = prevSibling; + } + + if (parent == root) + return clonedParent; + + next = parent.previousSibling; + parent = parent.parentNode; + + clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how); + + if (how != DELETE) + clonedGrandParent.appendChild(clonedParent); + + clonedParent = clonedGrandParent; + } + }; + + function _traverseLeftBoundary(root, how) { + var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent; + + if (next == root) + return _traverseNode(next, isFullySelected, TRUE, how); + + parent = next.parentNode; + clonedParent = _traverseNode(parent, FALSE, TRUE, how); + + while (parent) { + while (next) { + nextSibling = next.nextSibling; + clonedChild = _traverseNode(next, isFullySelected, TRUE, how); + + if (how != DELETE) + clonedParent.appendChild(clonedChild); + + isFullySelected = TRUE; + next = nextSibling; + } + + if (parent == root) + return clonedParent; + + next = parent.nextSibling; + parent = parent.parentNode; + + clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how); + + if (how != DELETE) + clonedGrandParent.appendChild(clonedParent); + + clonedParent = clonedGrandParent; + } + }; + + function _traverseNode(n, isFullySelected, isLeft, how) { + var txtValue, newNodeValue, oldNodeValue, offset, newNode; + + if (isFullySelected) + return _traverseFullySelected(n, how); + + if (n.nodeType == 3 /* TEXT_NODE */) { + txtValue = n.nodeValue; + + if (isLeft) { + offset = t[START_OFFSET]; + newNodeValue = txtValue.substring(offset); + oldNodeValue = txtValue.substring(0, offset); + } else { + offset = t[END_OFFSET]; + newNodeValue = txtValue.substring(0, offset); + oldNodeValue = txtValue.substring(offset); + } + + if (how != CLONE) + n.nodeValue = oldNodeValue; + + if (how == DELETE) + return; + + newNode = n.cloneNode(FALSE); + newNode.nodeValue = newNodeValue; + + return newNode; + } + + if (how == DELETE) + return; + + return n.cloneNode(FALSE); + }; + + function _traverseFullySelected(n, how) { + if (how != DELETE) + return how == CLONE ? n.cloneNode(TRUE) : n; + + n.parentNode.removeChild(n); + }; + }; + + ns.Range = Range; +})(tinymce.dom); + +(function() { + function Selection(selection) { + var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false; + + // Returns a W3C DOM compatible range object by using the IE Range API + function getRange() { + var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed; + + // If selection is outside the current document just return an empty range + element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); + if (element.ownerDocument != dom.doc) + return domRange; + + collapsed = selection.isCollapsed(); + + // Handle control selection or text selection of a image + if (ieRange.item || !element.hasChildNodes()) { + if (collapsed) { + domRange.setStart(element, 0); + domRange.setEnd(element, 0); + } else { + domRange.setStart(element.parentNode, dom.nodeIndex(element)); + domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); + } + + return domRange; + } + + function findEndPoint(start) { + var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position; + + // Setup temp range and collapse it + checkRng = ieRange.duplicate(); + checkRng.collapse(start); + + // Create marker and insert it at the end of the endpoints parent + marker = dom.create('a'); + parent = checkRng.parentElement(); + + // If parent doesn't have any children then set the container to that parent and the index to 0 + if (!parent.hasChildNodes()) { + domRange[start ? 'setStart' : 'setEnd'](parent, 0); + return; + } + + parent.appendChild(marker); + checkRng.moveToElementText(marker); + position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); + if (position > 0) { + // The position is after the end of the parent element. + // This is the case where IE puts the caret to the left edge of a table. + domRange[start ? 'setStartAfter' : 'setEndAfter'](parent); + dom.remove(marker); + return; + } + + // Setup node list and endIndex + nodes = tinymce.grep(parent.childNodes); + endIndex = nodes.length - 1; + // Perform a binary search for the position + while (startIndex <= endIndex) { + index = Math.floor((startIndex + endIndex) / 2); + + // Insert marker and check it's position relative to the selection + parent.insertBefore(marker, nodes[index]); + checkRng.moveToElementText(marker); + position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); + if (position > 0) { + // Marker is to the right + startIndex = index + 1; + } else if (position < 0) { + // Marker is to the left + endIndex = index - 1; + } else { + // Maker is where we are + found = true; + break; + } + } + + // Setup container + container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling; + + // Handle element selection + if (container.nodeType == 1) { + dom.remove(marker); + + // Find offset and container + offset = dom.nodeIndex(container); + container = container.parentNode; + + // Move the offset if we are setting the end or the position is after an element + if (!start || index > 0) + offset++; + } else { + // Calculate offset within text node + if (position > 0 || index == 0) { + checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); + offset = checkRng.text.length; + } else { + checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); + offset = container.nodeValue.length - checkRng.text.length; + } + + dom.remove(marker); + } + + domRange[start ? 'setStart' : 'setEnd'](container, offset); + }; + + // Find start point + findEndPoint(true); + + // Find end point if needed + if (!collapsed) + findEndPoint(); + + return domRange; + }; + + this.addRange = function(rng) { + var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; + + function setEndPoint(start) { + var container, offset, marker, tmpRng, nodes; + + marker = dom.create('a'); + container = start ? startContainer : endContainer; + offset = start ? startOffset : endOffset; + tmpRng = ieRng.duplicate(); + + if (container == doc || container == doc.documentElement) { + container = body; + offset = 0; + } + + if (container.nodeType == 3) { + container.parentNode.insertBefore(marker, container); + tmpRng.moveToElementText(marker); + tmpRng.moveStart('character', offset); + dom.remove(marker); + ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); + } else { + nodes = container.childNodes; + + if (nodes.length) { + if (offset >= nodes.length) { + dom.insertAfter(marker, nodes[nodes.length - 1]); + } else { + container.insertBefore(marker, nodes[offset]); + } + + tmpRng.moveToElementText(marker); + } else { + // Empty node selection for example <div>|</div> + marker = doc.createTextNode(invisibleChar); + container.appendChild(marker); + tmpRng.moveToElementText(marker.parentNode); + tmpRng.collapse(TRUE); + } + + ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); + dom.remove(marker); + } + } + + // Destroy cached range + this.destroy(); + + // Setup some shorter versions + startContainer = rng.startContainer; + startOffset = rng.startOffset; + endContainer = rng.endContainer; + endOffset = rng.endOffset; + ieRng = body.createTextRange(); + + // If single element selection then try making a control selection out of it + if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) { + if (startOffset == endOffset - 1) { + try { + ctrlRng = body.createControlRange(); + ctrlRng.addElement(startContainer.childNodes[startOffset]); + ctrlRng.select(); + return; + } catch (ex) { + // Ignore + } + } + } + + // Set start/end point of selection + setEndPoint(true); + setEndPoint(); + + // Select the new range and scroll it into view + ieRng.select(); + }; + + this.getRangeAt = function() { + // Setup new range if the cache is empty + if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) { + range = getRange(); + + // Store away text range for next call + lastIERng = selection.getRng(); + } + + // IE will say that the range is equal then produce an invalid argument exception + // if you perform specific operations in a keyup event. For example Ctrl+Del. + // This hack will invalidate the range cache if the exception occurs + try { + range.startContainer.nextSibling; + } catch (ex) { + range = getRange(); + lastIERng = null; + } + + // Return cached range + return range; + }; + + this.destroy = function() { + // Destroy cached range and last IE range to avoid memory leaks + lastIERng = range = null; + }; + }; + + // Expose the selection object + tinymce.dom.TridentSelection = Selection; +})(); + + +/* + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context), + soFar = selector, ret, cur, pop, i; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec(""); + m = chunker.exec(soFar); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && Sizzle.isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var filter = Expr.filter[ type ], found, item, left = match[1]; + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part){ + var isPartStr = typeof part === "string", + elem, i = 0, l = checkSet.length; + + if ( isPartStr && !/\W/.test(part) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck, nodeCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck, nodeCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + return match[1].toLowerCase(); + }, + CHILD: function(match){ + if ( match[1] === "nth" ) { + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + // Accessing this property makes selected-by-default + // options in Safari work properly + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return (/h\d/i).test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + input: function(elem){ + return (/input|select|textarea|button/i).test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 === i; + }, + eq: function(elem, i, match){ + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + } else { + Sizzle.error( "Syntax error, unrecognized expression: " + name ); + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + if ( type === "first" ) { + return true; + } + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first === 0 ) { + return diff === 0; + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch(e){ + makeArray = function(array, results) { + var ret = results || [], i = 0; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.compareDocumentPosition ? -1 : 1; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.sourceIndex ? -1 : 1; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.ownerDocument ? -1 : 1; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(); + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && context.nodeType === 9 && !Sizzle.isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE + })(); +} + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +Sizzle.contains = document.compareDocumentPosition ? function(a, b){ + return !!(a.compareDocumentPosition(b) & 16); +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +Sizzle.isXML = function(elem){ + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE + +window.tinymce.dom.Sizzle = Sizzle; + +})(); + + +(function(tinymce) { + // Shorten names + var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; + + tinymce.create('tinymce.dom.EventUtils', { + EventUtils : function() { + this.inits = []; + this.events = []; + }, + + add : function(o, n, f, s) { + var cb, t = this, el = t.events, r; + + if (n instanceof Array) { + r = []; + + each(n, function(n) { + r.push(t.add(o, n, f, s)); + }); + + return r; + } + + // Handle array + if (o && o.hasOwnProperty && o instanceof Array) { + r = []; + + each(o, function(o) { + o = DOM.get(o); + r.push(t.add(o, n, f, s)); + }); + + return r; + } + + o = DOM.get(o); + + if (!o) + return; + + // Setup event callback + cb = function(e) { + // Is all events disabled + if (t.disabled) + return; + + e = e || window.event; + + // Patch in target, preventDefault and stopPropagation in IE it's W3C valid + if (e && isIE) { + if (!e.target) + e.target = e.srcElement; + + // Patch in preventDefault, stopPropagation methods for W3C compatibility + tinymce.extend(e, t._stoppers); + } + + if (!s) + return f(e); + + return f.call(s, e); + }; + + if (n == 'unload') { + tinymce.unloads.unshift({func : cb}); + return cb; + } + + if (n == 'init') { + if (t.domLoaded) + cb(); + else + t.inits.push(cb); + + return cb; + } + + // Store away listener reference + el.push({ + obj : o, + name : n, + func : f, + cfunc : cb, + scope : s + }); + + t._add(o, n, cb); + + return f; + }, + + remove : function(o, n, f) { + var t = this, a = t.events, s = false, r; + + // Handle array + if (o && o.hasOwnProperty && o instanceof Array) { + r = []; + + each(o, function(o) { + o = DOM.get(o); + r.push(t.remove(o, n, f)); + }); + + return r; + } + + o = DOM.get(o); + + each(a, function(e, i) { + if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { + a.splice(i, 1); + t._remove(o, n, e.cfunc); + s = true; + return false; + } + }); + + return s; + }, + + clear : function(o) { + var t = this, a = t.events, i, e; + + if (o) { + o = DOM.get(o); + + for (i = a.length - 1; i >= 0; i--) { + e = a[i]; + + if (e.obj === o) { + t._remove(e.obj, e.name, e.cfunc); + e.obj = e.cfunc = null; + a.splice(i, 1); + } + } + } + }, + + cancel : function(e) { + if (!e) + return false; + + this.stop(e); + + return this.prevent(e); + }, + + stop : function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; + + return false; + }, + + prevent : function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; + + return false; + }, + + destroy : function() { + var t = this; + + each(t.events, function(e, i) { + t._remove(e.obj, e.name, e.cfunc); + e.obj = e.cfunc = null; + }); + + t.events = []; + t = null; + }, + + _add : function(o, n, f) { + if (o.attachEvent) + o.attachEvent('on' + n, f); + else if (o.addEventListener) + o.addEventListener(n, f, false); + else + o['on' + n] = f; + }, + + _remove : function(o, n, f) { + if (o) { + try { + if (o.detachEvent) + o.detachEvent('on' + n, f); + else if (o.removeEventListener) + o.removeEventListener(n, f, false); + else + o['on' + n] = null; + } catch (ex) { + // Might fail with permission denined on IE so we just ignore that + } + } + }, + + _pageInit : function(win) { + var t = this; + + // Keep it from running more than once + if (t.domLoaded) + return; + + t.domLoaded = true; + + each(t.inits, function(c) { + c(); + }); + + t.inits = []; + }, + + _wait : function(win) { + var t = this, doc = win.document; + + // No need since the document is already loaded + if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) { + t.domLoaded = 1; + return; + } + + // Use IE method + if (doc.attachEvent) { + doc.attachEvent("onreadystatechange", function() { + if (doc.readyState === "complete") { + doc.detachEvent("onreadystatechange", arguments.callee); + t._pageInit(win); + } + }); + + if (doc.documentElement.doScroll && win == win.top) { + (function() { + if (t.domLoaded) + return; + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + doc.documentElement.doScroll("left"); + } catch (ex) { + setTimeout(arguments.callee, 0); + return; + } + + t._pageInit(win); + })(); + } + } else if (doc.addEventListener) { + t._add(win, 'DOMContentLoaded', function() { + t._pageInit(win); + }); + } + + t._add(win, 'load', function() { + t._pageInit(win); + }); + }, + + _stoppers : { + preventDefault : function() { + this.returnValue = false; + }, + + stopPropagation : function() { + this.cancelBubble = true; + } + } + }); + + Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); + + // Dispatch DOM content loaded event for IE and Safari + Event._wait(window); + + tinymce.addUnload(function() { + Event.destroy(); + }); +})(tinymce); + +(function(tinymce) { + tinymce.dom.Element = function(id, settings) { + var t = this, dom, el; + + t.settings = settings = settings || {}; + t.id = id; + t.dom = dom = settings.dom || tinymce.DOM; + + // Only IE leaks DOM references, this is a lot faster + if (!tinymce.isIE) + el = dom.get(t.id); + + tinymce.each( + ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + + 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + + 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + + 'isHidden,setHTML,get').split(/,/) + , function(k) { + t[k] = function() { + var a = [id], i; + + for (i = 0; i < arguments.length; i++) + a.push(arguments[i]); + + a = dom[k].apply(dom, a); + t.update(k); + + return a; + }; + }); + + tinymce.extend(t, { + on : function(n, f, s) { + return tinymce.dom.Event.add(t.id, n, f, s); + }, + + getXY : function() { + return { + x : parseInt(t.getStyle('left')), + y : parseInt(t.getStyle('top')) + }; + }, + + getSize : function() { + var n = dom.get(t.id); + + return { + w : parseInt(t.getStyle('width') || n.clientWidth), + h : parseInt(t.getStyle('height') || n.clientHeight) + }; + }, + + moveTo : function(x, y) { + t.setStyles({left : x, top : y}); + }, + + moveBy : function(x, y) { + var p = t.getXY(); + + t.moveTo(p.x + x, p.y + y); + }, + + resizeTo : function(w, h) { + t.setStyles({width : w, height : h}); + }, + + resizeBy : function(w, h) { + var s = t.getSize(); + + t.resizeTo(s.w + w, s.h + h); + }, + + update : function(k) { + var b; + + if (tinymce.isIE6 && settings.blocker) { + k = k || ''; + + // Ignore getters + if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) + return; + + // Remove blocker on remove + if (k == 'remove') { + dom.remove(t.blocker); + return; + } + + if (!t.blocker) { + t.blocker = dom.uniqueId(); + b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); + dom.setStyle(b, 'opacity', 0); + } else + b = dom.get(t.blocker); + + dom.setStyles(b, { + left : t.getStyle('left', 1), + top : t.getStyle('top', 1), + width : t.getStyle('width', 1), + height : t.getStyle('height', 1), + display : t.getStyle('display', 1), + zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 + }); + } + } + }); + }; +})(tinymce); + +(function(tinymce) { + function trimNl(s) { + return s.replace(/[\n\r]+/g, ''); + }; + + // Shorten names + var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; + + tinymce.create('tinymce.dom.Selection', { + Selection : function(dom, win, serializer) { + var t = this; + + t.dom = dom; + t.win = win; + t.serializer = serializer; + + // Add events + each([ + 'onBeforeSetContent', + + 'onBeforeGetContent', + + 'onSetContent', + + 'onGetContent' + ], function(e) { + t[e] = new tinymce.util.Dispatcher(t); + }); + + // No W3C Range support + if (!t.win.getSelection) + t.tridentSel = new tinymce.dom.TridentSelection(t); + + if (tinymce.isIE && dom.boxModel) + this._fixIESelection(); + + // Prevent leaks + tinymce.addUnload(t.destroy, t); + }, + + getContent : function(s) { + var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; + + s = s || {}; + wb = wa = ''; + s.get = true; + s.format = s.format || 'html'; + t.onBeforeGetContent.dispatch(t, s); + + if (s.format == 'text') + return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); + + if (r.cloneContents) { + n = r.cloneContents(); + + if (n) + e.appendChild(n); + } else if (is(r.item) || is(r.htmlText)) + e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; + else + e.innerHTML = r.toString(); + + // Keep whitespace before and after + if (/^\s/.test(e.innerHTML)) + wb = ' '; + + if (/\s+$/.test(e.innerHTML)) + wa = ' '; + + s.getInner = true; + + s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; + t.onGetContent.dispatch(t, s); + + return s.content; + }, + + setContent : function(content, args) { + var self = this, rng = self.getRng(), caretNode, doc = self.win.document, frag, temp; + + args = args || {format : 'html'}; + args.set = true; + content = args.content = content; + + // Dispatch before set content event + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); + + content = args.content; + + if (rng.insertNode) { + // Make caret marker since insertNode places the caret in the beginning of text after insert + content += '<span id="__caret">_</span>'; + + // Delete and insert new node + if (rng.startContainer == doc && rng.endContainer == doc) { + // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents + doc.body.innerHTML = content; + } else { + rng.deleteContents(); + + if (doc.body.childNodes.length == 0) { + doc.body.innerHTML = content; + } else { + // createContextualFragment doesn't exists in IE 9 DOMRanges + if (rng.createContextualFragment) { + rng.insertNode(rng.createContextualFragment(content)); + } else { + // Fake createContextualFragment call in IE 9 + frag = doc.createDocumentFragment(); + temp = doc.createElement('div'); + + frag.appendChild(temp); + temp.outerHTML = content; + + rng.insertNode(frag); + } + } + } + + // Move to caret marker + caretNode = self.dom.get('__caret'); + + // Make sure we wrap it compleatly, Opera fails with a simple select call + rng = doc.createRange(); + rng.setStartBefore(caretNode); + rng.setEndBefore(caretNode); + self.setRng(rng); + + // Remove the caret position + self.dom.remove('__caret'); + self.setRng(rng); + } else { + if (rng.item) { + // Delete content and get caret text selection + doc.execCommand('Delete', false, null); + rng = self.getRng(); + } + + rng.pasteHTML(content); + } + + // Dispatch set content event + if (!args.no_events) + self.onSetContent.dispatch(self, args); + }, + + getStart : function() { + var rng = this.getRng(), startElement, parentElement, checkRng, node; + + if (rng.duplicate || rng.item) { + // Control selection, return first item + if (rng.item) + return rng.item(0); + + // Get start element + checkRng = rng.duplicate(); + checkRng.collapse(1); + startElement = checkRng.parentElement(); + + // Check if range parent is inside the start element, then return the inner parent element + // This will fix issues when a single element is selected, IE would otherwise return the wrong start element + parentElement = node = rng.parentElement(); + while (node = node.parentNode) { + if (node == startElement) { + startElement = parentElement; + break; + } + } + + return startElement; + } else { + startElement = rng.startContainer; + + if (startElement.nodeType == 1 && startElement.hasChildNodes()) + startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; + + if (startElement && startElement.nodeType == 3) + return startElement.parentNode; + + return startElement; + } + }, + + getEnd : function() { + var t = this, r = t.getRng(), e, eo; + + if (r.duplicate || r.item) { + if (r.item) + return r.item(0); + + r = r.duplicate(); + r.collapse(0); + e = r.parentElement(); + + if (e && e.nodeName == 'BODY') + return e.lastChild || e; + + return e; + } else { + e = r.endContainer; + eo = r.endOffset; + + if (e.nodeType == 1 && e.hasChildNodes()) + e = e.childNodes[eo > 0 ? eo - 1 : eo]; + + if (e && e.nodeType == 3) + return e.parentNode; + + return e; + } + }, + + getBookmark : function(type, normalized) { + var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; + + function findIndex(name, element) { + var index = 0; + + each(dom.select(name), function(node, i) { + if (node == element) + index = i; + }); + + return index; + }; + + if (type == 2) { + function getLocation() { + var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; + + function getPoint(rng, start) { + var container = rng[start ? 'startContainer' : 'endContainer'], + offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; + + if (container.nodeType == 3) { + if (normalized) { + for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) + offset += node.nodeValue.length; + } + + point.push(offset); + } else { + childNodes = container.childNodes; + + if (offset >= childNodes.length && childNodes.length) { + after = 1; + offset = Math.max(0, childNodes.length - 1); + } + + point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); + } + + for (; container && container != root; container = container.parentNode) + point.push(t.dom.nodeIndex(container, normalized)); + + return point; + }; + + bookmark.start = getPoint(rng, true); + + if (!t.isCollapsed()) + bookmark.end = getPoint(rng); + + return bookmark; + }; + + return getLocation(); + } + + // Handle simple range + if (type) + return {rng : t.getRng()}; + + rng = t.getRng(); + id = dom.uniqueId(); + collapsed = tinyMCE.activeEditor.selection.isCollapsed(); + styles = 'overflow:hidden;line-height:0px'; + + // Explorer method + if (rng.duplicate || rng.item) { + // Text selection + if (!rng.item) { + rng2 = rng.duplicate(); + + try { + // Insert start marker + rng.collapse(); + rng.pasteHTML('<span data-mce-type="bookmark" id="' + id + '_start" style="' + styles + '">' + chr + '</span>'); + + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + + // Detect the empty space after block elements in IE and move the end back one character <p></p>] becomes <p>]</p> + rng.moveToElementText(rng2.parentElement()); + if (rng.compareEndPoints('StartToEnd', rng2) == 0) + rng2.move('character', -1); + + rng2.pasteHTML('<span data-mce-type="bookmark" id="' + id + '_end" style="' + styles + '">' + chr + '</span>'); + } + } catch (ex) { + // IE might throw unspecified error so lets ignore it + return null; + } + } else { + // Control selection + element = rng.item(0); + name = element.nodeName; + + return {name : name, index : findIndex(name, element)}; + } + } else { + element = t.getNode(); + name = element.nodeName; + if (name == 'IMG') + return {name : name, index : findIndex(name, element)}; + + // W3C method + rng2 = rng.cloneRange(); + + // Insert end marker + if (!collapsed) { + rng2.collapse(false); + rng2.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_end', style : styles}, chr)); + } + + rng.collapse(true); + rng.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_start', style : styles}, chr)); + } + + t.moveToBookmark({id : id, keep : 1}); + + return {id : id}; + }, + + moveToBookmark : function(bookmark) { + var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; + + // Clear selection cache + if (t.tridentSel) + t.tridentSel.destroy(); + + if (bookmark) { + if (bookmark.start) { + rng = dom.createRng(); + root = dom.getRoot(); + + function setEndPoint(start) { + var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; + + if (point) { + offset = point[0]; + + // Find container node + for (node = root, i = point.length - 1; i >= 1; i--) { + children = node.childNodes; + + if (point[i] > children.length - 1) + return; + + node = children[point[i]]; + } + + // Move text offset to best suitable location + if (node.nodeType === 3) + offset = Math.min(point[0], node.nodeValue.length); + + // Move element offset to best suitable location + if (node.nodeType === 1) + offset = Math.min(point[0], node.childNodes.length); + + // Set offset within container node + if (start) + rng.setStart(node, offset); + else + rng.setEnd(node, offset); + } + + return true; + }; + + if (setEndPoint(true) && setEndPoint()) { + t.setRng(rng); + } + } else if (bookmark.id) { + function restoreEndPoint(suffix) { + var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; + + if (marker) { + node = marker.parentNode; + + if (suffix == 'start') { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } + + startContainer = endContainer = node; + startOffset = endOffset = idx; + } else { + if (!keep) { + idx = dom.nodeIndex(marker); + } else { + node = marker.firstChild; + idx = 1; + } + + endContainer = node; + endOffset = idx; + } + + if (!keep) { + prev = marker.previousSibling; + next = marker.nextSibling; + + // Remove all marker text nodes + each(tinymce.grep(marker.childNodes), function(node) { + if (node.nodeType == 3) + node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); + }); + + // Remove marker but keep children if for example contents where inserted into the marker + // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature + while (marker = dom.get(bookmark.id + '_' + suffix)) + dom.remove(marker, 1); + + // If siblings are text nodes then merge them unless it's Opera since it some how removes the node + // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact + if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { + idx = prev.nodeValue.length; + prev.appendData(next.nodeValue); + dom.remove(next); + + if (suffix == 'start') { + startContainer = endContainer = prev; + startOffset = endOffset = idx; + } else { + endContainer = prev; + endOffset = idx; + } + } + } + } + }; + + function addBogus(node) { + // Adds a bogus BR element for empty block elements or just a space on IE since it renders BR elements incorrectly + if (dom.isBlock(node) && !node.innerHTML) + node.innerHTML = !isIE ? '<br data-mce-bogus="1" />' : ' '; + + return node; + }; + + // Restore start/end points + restoreEndPoint('start'); + restoreEndPoint('end'); + + if (startContainer) { + rng = dom.createRng(); + rng.setStart(addBogus(startContainer), startOffset); + rng.setEnd(addBogus(endContainer), endOffset); + t.setRng(rng); + } + } else if (bookmark.name) { + t.select(dom.select(bookmark.name)[bookmark.index]); + } else if (bookmark.rng) + t.setRng(bookmark.rng); + } + }, + + select : function(node, content) { + var t = this, dom = t.dom, rng = dom.createRng(), idx; + + if (node) { + idx = dom.nodeIndex(node); + rng.setStart(node.parentNode, idx); + rng.setEnd(node.parentNode, idx + 1); + + // Find first/last text node or BR element + if (content) { + function setPoint(node, start) { + var walker = new tinymce.dom.TreeWalker(node, node); + + do { + // Text node + if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { + if (start) + rng.setStart(node, 0); + else + rng.setEnd(node, node.nodeValue.length); + + return; + } + + // BR element + if (node.nodeName == 'BR') { + if (start) + rng.setStartBefore(node); + else + rng.setEndBefore(node); + + return; + } + } while (node = (start ? walker.next() : walker.prev())); + }; + + setPoint(node, 1); + setPoint(node); + } + + t.setRng(rng); + } + + return node; + }, + + isCollapsed : function() { + var t = this, r = t.getRng(), s = t.getSel(); + + if (!r || r.item) + return false; + + if (r.compareEndPoints) + return r.compareEndPoints('StartToEnd', r) === 0; + + return !s || r.collapsed; + }, + + collapse : function(to_start) { + var self = this, rng = self.getRng(), node; + + // Control range on IE + if (rng.item) { + node = rng.item(0); + rng = self.win.document.body.createTextRange(); + rng.moveToElementText(node); + } + + rng.collapse(!!to_start); + self.setRng(rng); + }, + + getSel : function() { + var t = this, w = this.win; + + return w.getSelection ? w.getSelection() : w.document.selection; + }, + + getRng : function(w3c) { + var t = this, s, r, elm, doc = t.win.document; + + // Found tridentSel object then we need to use that one + if (w3c && t.tridentSel) + return t.tridentSel.getRangeAt(0); + + try { + if (s = t.getSel()) + r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : doc.createRange()); + } catch (ex) { + // IE throws unspecified error here if TinyMCE is placed in a frame/iframe + } + + // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet + if (tinymce.isIE && r && r.setStart && doc.selection.createRange().item) { + elm = doc.selection.createRange().item(0); + r = doc.createRange(); + r.setStartBefore(elm); + r.setEndAfter(elm); + } + + // No range found then create an empty one + // This can occur when the editor is placed in a hidden container element on Gecko + // Or on IE when there was an exception + if (!r) + r = doc.createRange ? doc.createRange() : doc.body.createTextRange(); + + if (t.selectedRange && t.explicitRange) { + if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { + // Safari, Opera and Chrome only ever select text which causes the range to change. + // This lets us use the originally set range if the selection hasn't been changed by the user. + r = t.explicitRange; + } else { + t.selectedRange = null; + t.explicitRange = null; + } + } + + return r; + }, + + setRng : function(r) { + var s, t = this; + + if (!t.tridentSel) { + s = t.getSel(); + + if (s) { + t.explicitRange = r; + s.removeAllRanges(); + s.addRange(r); + t.selectedRange = s.getRangeAt(0); + } + } else { + // Is W3C Range + if (r.cloneRange) { + t.tridentSel.addRange(r); + return; + } + + // Is IE specific range + try { + r.select(); + } catch (ex) { + // Needed for some odd IE bug #1843306 + } + } + }, + + setNode : function(n) { + var t = this; + + t.setContent(t.dom.getOuterHTML(n)); + + return n; + }, + + getNode : function() { + var t = this, rng = t.getRng(), sel = t.getSel(), elm, start = rng.startContainer, end = rng.endContainer; + + // Range maybe lost after the editor is made visible again + if (!rng) + return t.dom.getRoot(); + + if (rng.setStart) { + elm = rng.commonAncestorContainer; + + // Handle selection a image or other control like element such as anchors + if (!rng.collapsed) { + if (rng.startContainer == rng.endContainer) { + if (rng.endOffset - rng.startOffset < 2) { + if (rng.startContainer.hasChildNodes()) + elm = rng.startContainer.childNodes[rng.startOffset]; + } + } + + // If the anchor node is a element instead of a text node then return this element + //if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) + // return sel.anchorNode.childNodes[sel.anchorOffset]; + + // Handle cases where the selection is immediately wrapped around a node and return that node instead of it's parent. + // This happens when you double click an underlined word in FireFox. + if (start.nodeType === 3 && end.nodeType === 3) { + function skipEmptyTextNodes(n, forwards) { + var orig = n; + while (n && n.nodeType === 3 && n.length === 0) { + n = forwards ? n.nextSibling : n.previousSibling; + } + return n || orig; + } + if (start.length === rng.startOffset) { + start = skipEmptyTextNodes(start.nextSibling, true); + } else { + start = start.parentNode; + } + if (rng.endOffset === 0) { + end = skipEmptyTextNodes(end.previousSibling, false); + } else { + end = end.parentNode; + } + + if (start && start === end) + return start; + } + } + + if (elm && elm.nodeType == 3) + return elm.parentNode; + + return elm; + } + + return rng.item ? rng.item(0) : rng.parentElement(); + }, + + getSelectedBlocks : function(st, en) { + var t = this, dom = t.dom, sb, eb, n, bl = []; + + sb = dom.getParent(st || t.getStart(), dom.isBlock); + eb = dom.getParent(en || t.getEnd(), dom.isBlock); + + if (sb) + bl.push(sb); + + if (sb && eb && sb != eb) { + n = sb; + + while ((n = n.nextSibling) && n != eb) { + if (dom.isBlock(n)) + bl.push(n); + } + } + + if (eb && sb != eb) + bl.push(eb); + + return bl; + }, + + destroy : function(s) { + var t = this; + + t.win = null; + + if (t.tridentSel) + t.tridentSel.destroy(); + + // Manual destroy then remove unload handler + if (!s) + tinymce.removeUnload(t.destroy); + }, + + // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode + _fixIESelection : function() { + var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng, htmlElm; + + // Make HTML element unselectable since we are going to handle selection by hand + doc.documentElement.unselectable = true; + + // Return range from point or null if it failed + function rngFromPoint(x, y) { + var rng = body.createTextRange(); + + try { + rng.moveToPoint(x, y); + } catch (ex) { + // IE sometimes throws and exception, so lets just ignore it + rng = null; + } + + return rng; + }; + + // Fires while the selection is changing + function selectionChange(e) { + var pointRng; + + // Check if the button is down or not + if (e.button) { + // Create range from mouse position + pointRng = rngFromPoint(e.x, e.y); + + if (pointRng) { + // Check if pointRange is before/after selection then change the endPoint + if (pointRng.compareEndPoints('StartToStart', startRng) > 0) + pointRng.setEndPoint('StartToStart', startRng); + else + pointRng.setEndPoint('EndToEnd', startRng); + + pointRng.select(); + } + } else + endSelection(); + } + + // Removes listeners + function endSelection() { + var rng = doc.selection.createRange(); + + // If the range is collapsed then use the last start range + if (startRng && !rng.item && rng.compareEndPoints('StartToEnd', rng) === 0) + startRng.select(); + + dom.unbind(doc, 'mouseup', endSelection); + dom.unbind(doc, 'mousemove', selectionChange); + startRng = started = 0; + }; + + // Detect when user selects outside BODY + dom.bind(doc, ['mousedown', 'contextmenu'], function(e) { + if (e.target.nodeName === 'HTML') { + if (started) + endSelection(); + + // Detect vertical scrollbar, since IE will fire a mousedown on the scrollbar and have target set as HTML + htmlElm = doc.documentElement; + if (htmlElm.scrollHeight > htmlElm.clientHeight) + return; + + started = 1; + // Setup start position + startRng = rngFromPoint(e.x, e.y); + if (startRng) { + // Listen for selection change events + dom.bind(doc, 'mouseup', endSelection); + dom.bind(doc, 'mousemove', selectionChange); + + dom.win.focus(); + startRng.select(); + } + } + }); + } + }); +})(tinymce); + +(function(tinymce) { + tinymce.dom.Serializer = function(settings, dom, schema) { + var onPreProcess, onPostProcess, isIE = tinymce.isIE, each = tinymce.each, htmlParser; + + // Support the old apply_source_formatting option + if (!settings.apply_source_formatting) + settings.indent = false; + + settings.remove_trailing_brs = true; + + // Default DOM and Schema if they are undefined + dom = dom || tinymce.DOM; + schema = schema || new tinymce.html.Schema(settings); + settings.entity_encoding = settings.entity_encoding || 'named'; + + onPreProcess = new tinymce.util.Dispatcher(self); + + onPostProcess = new tinymce.util.Dispatcher(self); + + htmlParser = new tinymce.html.DomParser(settings, schema); + + // Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed + htmlParser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, value, internalName = 'data-mce-' + name, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope, undef; + + while (i--) { + node = nodes[i]; + + value = node.attributes.map[internalName]; + if (value !== undef) { + // Set external name to internal value and remove internal + node.attr(name, value.length > 0 ? value : null); + node.attr(internalName, null); + } else { + // No internal attribute found then convert the value we have in the DOM + value = node.attributes.map[name]; + + if (name === "style") + value = dom.serializeStyle(dom.parseStyle(value), node.name); + else if (urlConverter) + value = urlConverter.call(urlConverterScope, value, name, node.name); + + node.attr(name, value.length > 0 ? value : null); + } + } + }); + + // Remove internal classes mceItem<..> + htmlParser.addAttributeFilter('class', function(nodes, name) { + var i = nodes.length, node, value; + + while (i--) { + node = nodes[i]; + value = node.attr('class').replace(/\s*mce(Item\w+|Selected)\s*/g, ''); + node.attr('class', value.length > 0 ? value : null); + } + }); + + // Remove bookmark elements + htmlParser.addAttributeFilter('data-mce-type', function(nodes, name, args) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + + if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup) + node.remove(); + } + }); + + // Force script into CDATA sections and remove the mce- prefix also add comments around styles + htmlParser.addNodeFilter('script,style', function(nodes, name) { + var i = nodes.length, node, value; + + function trim(value) { + return value.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n') + .replace(/^[\r\n]*|[\r\n]*$/g, '') + .replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g, '') + .replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g, ''); + }; + + while (i--) { + node = nodes[i]; + value = node.firstChild ? node.firstChild.value : ''; + + if (name === "script") { + // Remove mce- prefix from script elements + node.attr('type', (node.attr('type') || 'text/javascript').replace(/^mce\-/, '')); + + if (value.length > 0) + node.firstChild.value = '// <![CDATA[\n' + trim(value) + '\n// ]]>'; + } else { + if (value.length > 0) + node.firstChild.value = '<!--\n' + trim(value) + '\n-->'; + } + } + }); + + // Convert comments to cdata and handle protected comments + htmlParser.addNodeFilter('#comment', function(nodes, name) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + + if (node.value.indexOf('[CDATA[') === 0) { + node.name = '#cdata'; + node.type = 4; + node.value = node.value.replace(/^\[CDATA\[|\]\]$/g, ''); + } else if (node.value.indexOf('mce:protected ') === 0) { + node.name = "#text"; + node.type = 3; + node.raw = true; + node.value = unescape(node.value).substr(14); + } + } + }); + + htmlParser.addNodeFilter('xml:namespace,input', function(nodes, name) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + if (node.type === 7) + node.remove(); + else if (node.type === 1) { + if (name === "input" && !("type" in node.attributes.map)) + node.attr('type', 'text'); + } + } + }); + + // Fix list elements, TODO: Replace this later + if (settings.fix_list_elements) { + htmlParser.addNodeFilter('ul,ol', function(nodes, name) { + var i = nodes.length, node, parentNode; + + while (i--) { + node = nodes[i]; + parentNode = node.parent; + + if (parentNode.name === 'ul' || parentNode.name === 'ol') { + if (node.prev && node.prev.name === 'li') { + node.prev.append(node); + } + } + } + }); + } + + // Remove internal data attributes + htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style', function(nodes, name) { + var i = nodes.length; + + while (i--) { + nodes[i].attr(name, null); + } + }); + + // Return public methods + return { + schema : schema, + + addNodeFilter : htmlParser.addNodeFilter, + + addAttributeFilter : htmlParser.addAttributeFilter, + + onPreProcess : onPreProcess, + + onPostProcess : onPostProcess, + + serialize : function(node, args) { + var impl, doc, oldDoc, htmlSerializer, content; + + // Explorer won't clone contents of script and style and the + // selected index of select elements are cleared on a clone operation. + if (isIE && dom.select('script,style,select').length > 0) { + content = node.innerHTML; + node = node.cloneNode(false); + dom.setHTML(node, content); + } else + node = node.cloneNode(true); + + // Nodes needs to be attached to something in WebKit/Opera + // Older builds of Opera crashes if you attach the node to an document created dynamically + // and since we can't feature detect a crash we need to sniff the acutal build number + // This fix will make DOM ranges and make Sizzle happy! + impl = node.ownerDocument.implementation; + if (impl.createHTMLDocument) { + // Create an empty HTML document + doc = impl.createHTMLDocument(""); + + // Add the element or it's children if it's a body element to the new document + each(node.nodeName == 'BODY' ? node.childNodes : [node], function(node) { + doc.body.appendChild(doc.importNode(node, true)); + }); + + // Grab first child or body element for serialization + if (node.nodeName != 'BODY') + node = doc.body.firstChild; + else + node = doc.body; + + // set the new document in DOMUtils so createElement etc works + oldDoc = dom.doc; + dom.doc = doc; + } + + args = args || {}; + args.format = args.format || 'html'; + + // Pre process + if (!args.no_events) { + args.node = node; + onPreProcess.dispatch(self, args); + } + + // Setup serializer + htmlSerializer = new tinymce.html.Serializer(settings, schema); + + // Parse and serialize HTML + args.content = htmlSerializer.serialize( + htmlParser.parse(args.getInner ? node.innerHTML : tinymce.trim(dom.getOuterHTML(node), args), args) + ); + + // Post process + if (!args.no_events) + onPostProcess.dispatch(self, args); + + // Restore the old document if it was changed + if (oldDoc) + dom.doc = oldDoc; + + args.node = null; + + return args.content; + }, + + addRules : function(rules) { + schema.addValidElements(rules); + }, + + setRules : function(rules) { + schema.setValidElements(rules); + } + }; + }; +})(tinymce); +(function(tinymce) { + tinymce.dom.ScriptLoader = function(settings) { + var QUEUED = 0, + LOADING = 1, + LOADED = 2, + states = {}, + queue = [], + scriptLoadedCallbacks = {}, + queueLoadedCallbacks = [], + loading = 0, + undefined; + + function loadScript(url, callback) { + var t = this, dom = tinymce.DOM, elm, uri, loc, id; + + // Execute callback when script is loaded + function done() { + dom.remove(id); + + if (elm) + elm.onreadystatechange = elm.onload = elm = null; + + callback(); + }; + + function error() { + // Report the error so it's easier for people to spot loading errors + if (typeof(console) !== "undefined" && console.log) + console.log("Failed to load: " + url); + + // We can't mark it as done if there is a load error since + // A) We don't want to produce 404 errors on the server and + // B) the onerror event won't fire on all browsers. + // done(); + }; + + id = dom.uniqueId(); + + if (tinymce.isIE6) { + uri = new tinymce.util.URI(url); + loc = location; + + // If script is from same domain and we + // use IE 6 then use XHR since it's more reliable + if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol && uri.protocol.toLowerCase() != 'file') { + tinymce.util.XHR.send({ + url : tinymce._addVer(uri.getURI()), + success : function(content) { + // Create new temp script element + var script = dom.create('script', { + type : 'text/javascript' + }); + + // Evaluate script in global scope + script.text = content; + document.getElementsByTagName('head')[0].appendChild(script); + dom.remove(script); + + done(); + }, + + error : error + }); + + return; + } + } + + // Create new script element + elm = dom.create('script', { + id : id, + type : 'text/javascript', + src : tinymce._addVer(url) + }); + + // Add onload listener for non IE browsers since IE9 + // fires onload event before the script is parsed and executed + if (!tinymce.isIE) + elm.onload = done; + + // Add onerror event will get fired on some browsers but not all of them + elm.onerror = error; + + // Opera 9.60 doesn't seem to fire the onreadystate event at correctly + if (!tinymce.isOpera) { + elm.onreadystatechange = function() { + var state = elm.readyState; + + // Loaded state is passed on IE 6 however there + // are known issues with this method but we can't use + // XHR in a cross domain loading + if (state == 'complete' || state == 'loaded') + done(); + }; + } + + // Most browsers support this feature so we report errors + // for those at least to help users track their missing plugins etc + // todo: Removed since it produced error if the document is unloaded by navigating away, re-add it as an option + /*elm.onerror = function() { + alert('Failed to load: ' + url); + };*/ + + // Add script to document + (document.getElementsByTagName('head')[0] || document.body).appendChild(elm); + }; + + this.isDone = function(url) { + return states[url] == LOADED; + }; + + this.markDone = function(url) { + states[url] = LOADED; + }; + + this.add = this.load = function(url, callback, scope) { + var item, state = states[url]; + + // Add url to load queue + if (state == undefined) { + queue.push(url); + states[url] = QUEUED; + } + + if (callback) { + // Store away callback for later execution + if (!scriptLoadedCallbacks[url]) + scriptLoadedCallbacks[url] = []; + + scriptLoadedCallbacks[url].push({ + func : callback, + scope : scope || this + }); + } + }; + + this.loadQueue = function(callback, scope) { + this.loadScripts(queue, callback, scope); + }; + + this.loadScripts = function(scripts, callback, scope) { + var loadScripts; + + function execScriptLoadedCallbacks(url) { + // Execute URL callback functions + tinymce.each(scriptLoadedCallbacks[url], function(callback) { + callback.func.call(callback.scope); + }); + + scriptLoadedCallbacks[url] = undefined; + }; + + queueLoadedCallbacks.push({ + func : callback, + scope : scope || this + }); + + loadScripts = function() { + var loadingScripts = tinymce.grep(scripts); + + // Current scripts has been handled + scripts.length = 0; + + // Load scripts that needs to be loaded + tinymce.each(loadingScripts, function(url) { + // Script is already loaded then execute script callbacks directly + if (states[url] == LOADED) { + execScriptLoadedCallbacks(url); + return; + } + + // Is script not loading then start loading it + if (states[url] != LOADING) { + states[url] = LOADING; + loading++; + + loadScript(url, function() { + states[url] = LOADED; + loading--; + + execScriptLoadedCallbacks(url); + + // Load more scripts if they where added by the recently loaded script + loadScripts(); + }); + } + }); + + // No scripts are currently loading then execute all pending queue loaded callbacks + if (!loading) { + tinymce.each(queueLoadedCallbacks, function(callback) { + callback.func.call(callback.scope); + }); + + queueLoadedCallbacks.length = 0; + } + }; + + loadScripts(); + }; + }; + + // Global script loader + tinymce.ScriptLoader = new tinymce.dom.ScriptLoader(); +})(tinymce); + +tinymce.dom.TreeWalker = function(start_node, root_node) { + var node = start_node; + + function findSibling(node, start_name, sibling_name, shallow) { + var sibling, parent; + + if (node) { + // Walk into nodes if it has a start + if (!shallow && node[start_name]) + return node[start_name]; + + // Return the sibling if it has one + if (node != root_node) { + sibling = node[sibling_name]; + if (sibling) + return sibling; + + // Walk up the parents to look for siblings + for (parent = node.parentNode; parent && parent != root_node; parent = parent.parentNode) { + sibling = parent[sibling_name]; + if (sibling) + return sibling; + } + } + } + }; + + this.current = function() { + return node; + }; + + this.next = function(shallow) { + return (node = findSibling(node, 'firstChild', 'nextSibling', shallow)); + }; + + this.prev = function(shallow) { + return (node = findSibling(node, 'lastChild', 'previousSibling', shallow)); + }; +}; + +(function(tinymce) { + tinymce.dom.RangeUtils = function(dom) { + var INVISIBLE_CHAR = '\uFEFF'; + + this.walk = function(rng, callback) { + var startContainer = rng.startContainer, + startOffset = rng.startOffset, + endContainer = rng.endContainer, + endOffset = rng.endOffset, + ancestor, startPoint, + endPoint, node, parent, siblings, nodes; + + // Handle table cell selection the table plugin enables + // you to fake select table cells and perform formatting actions on them + nodes = dom.select('td.mceSelected,th.mceSelected'); + if (nodes.length > 0) { + tinymce.each(nodes, function(node) { + callback([node]); + }); + + return; + } + + function collectSiblings(node, name, end_node) { + var siblings = []; + + for (; node && node != end_node; node = node[name]) + siblings.push(node); + + return siblings; + }; + + function findEndPoint(node, root) { + do { + if (node.parentNode == root) + return node; + + node = node.parentNode; + } while(node); + }; + + function walkBoundary(start_node, end_node, next) { + var siblingName = next ? 'nextSibling' : 'previousSibling'; + + for (node = start_node, parent = node.parentNode; node && node != end_node; node = parent) { + parent = node.parentNode; + siblings = collectSiblings(node == start_node ? node : node[siblingName], siblingName); + + if (siblings.length) { + if (!next) + siblings.reverse(); + + callback(siblings); + } + } + }; + + // If index based start position then resolve it + if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) + startContainer = startContainer.childNodes[startOffset]; + + // If index based end position then resolve it + if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) + endContainer = endContainer.childNodes[Math.min(endOffset - 1, endContainer.childNodes.length - 1)]; + + // Find common ancestor and end points + ancestor = dom.findCommonAncestor(startContainer, endContainer); + + // Same container + if (startContainer == endContainer) + return callback([startContainer]); + + // Process left side + for (node = startContainer; node; node = node.parentNode) { + if (node == endContainer) + return walkBoundary(startContainer, ancestor, true); + + if (node == ancestor) + break; + } + + // Process right side + for (node = endContainer; node; node = node.parentNode) { + if (node == startContainer) + return walkBoundary(endContainer, ancestor); + + if (node == ancestor) + break; + } + + // Find start/end point + startPoint = findEndPoint(startContainer, ancestor) || startContainer; + endPoint = findEndPoint(endContainer, ancestor) || endContainer; + + // Walk left leaf + walkBoundary(startContainer, startPoint, true); + + // Walk the middle from start to end point + siblings = collectSiblings( + startPoint == startContainer ? startPoint : startPoint.nextSibling, + 'nextSibling', + endPoint == endContainer ? endPoint.nextSibling : endPoint + ); + + if (siblings.length) + callback(siblings); + + // Walk right leaf + walkBoundary(endContainer, endPoint); + }; + + /* this.split = function(rng) { + var startContainer = rng.startContainer, + startOffset = rng.startOffset, + endContainer = rng.endContainer, + endOffset = rng.endOffset; + + function splitText(node, offset) { + if (offset == node.nodeValue.length) + node.appendData(INVISIBLE_CHAR); + + node = node.splitText(offset); + + if (node.nodeValue === INVISIBLE_CHAR) + node.nodeValue = ''; + + return node; + }; + + // Handle single text node + if (startContainer == endContainer) { + if (startContainer.nodeType == 3) { + if (startOffset != 0) + startContainer = endContainer = splitText(startContainer, startOffset); + + if (endOffset - startOffset != startContainer.nodeValue.length) + splitText(startContainer, endOffset - startOffset); + } + } else { + // Split startContainer text node if needed + if (startContainer.nodeType == 3 && startOffset != 0) { + startContainer = splitText(startContainer, startOffset); + startOffset = 0; + } + + // Split endContainer text node if needed + if (endContainer.nodeType == 3 && endOffset != endContainer.nodeValue.length) { + endContainer = splitText(endContainer, endOffset).previousSibling; + endOffset = endContainer.nodeValue.length; + } + } + + return { + startContainer : startContainer, + startOffset : startOffset, + endContainer : endContainer, + endOffset : endOffset + }; + }; +*/ + }; + + tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) { + if (rng1 && rng2) { + // Compare native IE ranges + if (rng1.item || rng1.duplicate) { + // Both are control ranges and the selected element matches + if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0)) + return true; + + // Both are text ranges and the range matches + if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1)) + return true; + } else { + // Compare w3c ranges + return rng1.startContainer == rng2.startContainer && rng1.startOffset == rng2.startOffset; + } + } + + return false; + }; +})(tinymce); + +(function(tinymce) { + var Event = tinymce.dom.Event, each = tinymce.each; + + tinymce.create('tinymce.ui.KeyboardNavigation', { + KeyboardNavigation: function(settings, dom) { + var t = this, root = settings.root, items = settings.items, + enableUpDown = settings.enableUpDown, enableLeftRight = settings.enableLeftRight || !settings.enableUpDown, + excludeFromTabOrder = settings.excludeFromTabOrder, + itemFocussed, itemBlurred, rootKeydown, rootFocussed, focussedId; + + dom = dom || tinymce.DOM; + + itemFocussed = function(evt) { + focussedId = evt.target.id; + }; + + itemBlurred = function(evt) { + dom.setAttrib(evt.target.id, 'tabindex', '-1'); + }; + + rootFocussed = function(evt) { + var item = dom.get(focussedId); + dom.setAttrib(item, 'tabindex', '0'); + item.focus(); + }; + + t.focus = function() { + dom.get(focussedId).focus(); + }; + + t.destroy = function() { + each(items, function(item) { + dom.unbind(dom.get(item.id), 'focus', itemFocussed); + dom.unbind(dom.get(item.id), 'blur', itemBlurred); + }); + + dom.unbind(dom.get(root), 'focus', rootFocussed); + dom.unbind(dom.get(root), 'keydown', rootKeydown); + + items = dom = root = t.focus = itemFocussed = itemBlurred = rootKeydown = rootFocussed = null; + t.destroy = function() {}; + }; + + t.moveFocus = function(dir, evt) { + var idx = -1, controls = t.controls, newFocus; + + if (!focussedId) + return; + + each(items, function(item, index) { + if (item.id === focussedId) { + idx = index; + return false; + } + }); + + idx += dir; + if (idx < 0) { + idx = items.length - 1; + } else if (idx >= items.length) { + idx = 0; + } + + newFocus = items[idx]; + dom.setAttrib(focussedId, 'tabindex', '-1'); + dom.setAttrib(newFocus.id, 'tabindex', '0'); + dom.get(newFocus.id).focus(); + + if (settings.actOnFocus) { + settings.onAction(newFocus.id); + } + + if (evt) + Event.cancel(evt); + }; + + rootKeydown = function(evt) { + var DOM_VK_LEFT = 37, DOM_VK_RIGHT = 39, DOM_VK_UP = 38, DOM_VK_DOWN = 40, DOM_VK_ESCAPE = 27, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_SPACE = 32; + + switch (evt.keyCode) { + case DOM_VK_LEFT: + if (enableLeftRight) t.moveFocus(-1); + break; + + case DOM_VK_RIGHT: + if (enableLeftRight) t.moveFocus(1); + break; + + case DOM_VK_UP: + if (enableUpDown) t.moveFocus(-1); + break; + + case DOM_VK_DOWN: + if (enableUpDown) t.moveFocus(1); + break; + + case DOM_VK_ESCAPE: + if (settings.onCancel) { + settings.onCancel(); + Event.cancel(evt); + } + break; + + case DOM_VK_ENTER: + case DOM_VK_RETURN: + case DOM_VK_SPACE: + if (settings.onAction) { + settings.onAction(focussedId); + Event.cancel(evt); + } + break; + } + }; + + // Set up state and listeners for each item. + each(items, function(item, idx) { + var tabindex; + + if (!item.id) { + item.id = dom.uniqueId('_mce_item_'); + } + + if (excludeFromTabOrder) { + dom.bind(item.id, 'blur', itemBlurred); + tabindex = '-1'; + } else { + tabindex = (idx === 0 ? '0' : '-1'); + } + + dom.setAttrib(item.id, 'tabindex', tabindex); + dom.bind(dom.get(item.id), 'focus', itemFocussed); + }); + + // Setup initial state for root element. + if (items[0]){ + focussedId = items[0].id; + } + + dom.setAttrib(root, 'tabindex', '-1'); + + // Setup listeners for root element. + dom.bind(dom.get(root), 'focus', rootFocussed); + dom.bind(dom.get(root), 'keydown', rootKeydown); + } + }); +})(tinymce); +(function(tinymce) { + // Shorten class names + var DOM = tinymce.DOM, is = tinymce.is; + + tinymce.create('tinymce.ui.Control', { + Control : function(id, s, editor) { + this.id = id; + this.settings = s = s || {}; + this.rendered = false; + this.onRender = new tinymce.util.Dispatcher(this); + this.classPrefix = ''; + this.scope = s.scope || this; + this.disabled = 0; + this.active = 0; + this.editor = editor; + }, + + setAriaProperty : function(property, value) { + var element = DOM.get(this.id + '_aria') || DOM.get(this.id); + if (element) { + DOM.setAttrib(element, 'aria-' + property, !!value); + } + }, + + focus : function() { + DOM.get(this.id).focus(); + }, + + setDisabled : function(s) { + if (s != this.disabled) { + this.setAriaProperty('disabled', s); + + this.setState('Disabled', s); + this.setState('Enabled', !s); + this.disabled = s; + } + }, + + isDisabled : function() { + return this.disabled; + }, + + setActive : function(s) { + if (s != this.active) { + this.setState('Active', s); + this.active = s; + this.setAriaProperty('pressed', s); + } + }, + + isActive : function() { + return this.active; + }, + + setState : function(c, s) { + var n = DOM.get(this.id); + + c = this.classPrefix + c; + + if (s) + DOM.addClass(n, c); + else + DOM.removeClass(n, c); + }, + + isRendered : function() { + return this.rendered; + }, + + renderHTML : function() { + }, + + renderTo : function(n) { + DOM.setHTML(n, this.renderHTML()); + }, + + postRender : function() { + var t = this, b; + + // Set pending states + if (is(t.disabled)) { + b = t.disabled; + t.disabled = -1; + t.setDisabled(b); + } + + if (is(t.active)) { + b = t.active; + t.active = -1; + t.setActive(b); + } + }, + + remove : function() { + DOM.remove(this.id); + this.destroy(); + }, + + destroy : function() { + tinymce.dom.Event.clear(this.id); + } + }); +})(tinymce); +tinymce.create('tinymce.ui.Container:tinymce.ui.Control', { + Container : function(id, s, editor) { + this.parent(id, s, editor); + + this.controls = []; + + this.lookup = {}; + }, + + add : function(c) { + this.lookup[c.id] = c; + this.controls.push(c); + + return c; + }, + + get : function(n) { + return this.lookup[n]; + } +}); + + +tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { + Separator : function(id, s) { + this.parent(id, s); + this.classPrefix = 'mceSeparator'; + this.setDisabled(true); + }, + + renderHTML : function() { + return tinymce.DOM.createHTML('span', {'class' : this.classPrefix, role : 'separator', 'aria-orientation' : 'vertical', tabindex : '-1'}); + } +}); + +(function(tinymce) { + var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; + + tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', { + MenuItem : function(id, s) { + this.parent(id, s); + this.classPrefix = 'mceMenuItem'; + }, + + setSelected : function(s) { + this.setState('Selected', s); + this.setAriaProperty('checked', !!s); + this.selected = s; + }, + + isSelected : function() { + return this.selected; + }, + + postRender : function() { + var t = this; + + t.parent(); + + // Set pending state + if (is(t.selected)) + t.setSelected(t.selected); + } + }); +})(tinymce); + +(function(tinymce) { + var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; + + tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', { + Menu : function(id, s) { + var t = this; + + t.parent(id, s); + t.items = {}; + t.collapsed = false; + t.menuCount = 0; + t.onAddItem = new tinymce.util.Dispatcher(this); + }, + + expand : function(d) { + var t = this; + + if (d) { + walk(t, function(o) { + if (o.expand) + o.expand(); + }, 'items', t); + } + + t.collapsed = false; + }, + + collapse : function(d) { + var t = this; + + if (d) { + walk(t, function(o) { + if (o.collapse) + o.collapse(); + }, 'items', t); + } + + t.collapsed = true; + }, + + isCollapsed : function() { + return this.collapsed; + }, + + add : function(o) { + if (!o.settings) + o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o); + + this.onAddItem.dispatch(this, o); + + return this.items[o.id] = o; + }, + + addSeparator : function() { + return this.add({separator : true}); + }, + + addMenu : function(o) { + if (!o.collapse) + o = this.createMenu(o); + + this.menuCount++; + + return this.add(o); + }, + + hasMenus : function() { + return this.menuCount !== 0; + }, + + remove : function(o) { + delete this.items[o.id]; + }, + + removeAll : function() { + var t = this; + + walk(t, function(o) { + if (o.removeAll) + o.removeAll(); + else + o.remove(); + + o.destroy(); + }, 'items', t); + + t.items = {}; + }, + + createMenu : function(o) { + var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o); + + m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem); + + return m; + } + }); +})(tinymce); +(function(tinymce) { + var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element; + + tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', { + DropMenu : function(id, s) { + s = s || {}; + s.container = s.container || DOM.doc.body; + s.offset_x = s.offset_x || 0; + s.offset_y = s.offset_y || 0; + s.vp_offset_x = s.vp_offset_x || 0; + s.vp_offset_y = s.vp_offset_y || 0; + + if (is(s.icons) && !s.icons) + s['class'] += ' mceNoIcons'; + + this.parent(id, s); + this.onShowMenu = new tinymce.util.Dispatcher(this); + this.onHideMenu = new tinymce.util.Dispatcher(this); + this.classPrefix = 'mceMenu'; + }, + + createMenu : function(s) { + var t = this, cs = t.settings, m; + + s.container = s.container || cs.container; + s.parent = t; + s.constrain = s.constrain || cs.constrain; + s['class'] = s['class'] || cs['class']; + s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x; + s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y; + s.keyboard_focus = cs.keyboard_focus; + m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s); + + m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem); + + return m; + }, + + focus : function() { + var t = this; + if (t.keyboardNav) { + t.keyboardNav.focus(); + } + }, + + update : function() { + var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th; + + tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth; + th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight; + + if (!DOM.boxModel) + t.element.setStyles({width : tw + 2, height : th + 2}); + else + t.element.setStyles({width : tw, height : th}); + + if (s.max_width) + DOM.setStyle(co, 'width', tw); + + if (s.max_height) { + DOM.setStyle(co, 'height', th); + + if (tb.clientHeight < s.max_height) + DOM.setStyle(co, 'overflow', 'hidden'); + } + }, + + showMenu : function(x, y, px) { + var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix; + + t.collapse(1); + + if (t.isMenuVisible) + return; + + if (!t.rendered) { + co = DOM.add(t.settings.container, t.renderNode()); + + each(t.items, function(o) { + o.postRender(); + }); + + t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); + } else + co = DOM.get('menu_' + t.id); + + // Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug + if (!tinymce.isOpera) + DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF}); + + DOM.show(co); + t.update(); + + x += s.offset_x || 0; + y += s.offset_y || 0; + vp.w -= 4; + vp.h -= 4; + + // Move inside viewport if not submenu + if (s.constrain) { + w = co.clientWidth - ot; + h = co.clientHeight - ot; + mx = vp.x + vp.w; + my = vp.y + vp.h; + + if ((x + s.vp_offset_x + w) > mx) + x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w); + + if ((y + s.vp_offset_y + h) > my) + y = Math.max(0, (my - s.vp_offset_y) - h); + } + + DOM.setStyles(co, {left : x , top : y}); + t.element.update(); + + t.isMenuVisible = 1; + t.mouseClickFunc = Event.add(co, 'click', function(e) { + var m; + + e = e.target; + + if (e && (e = DOM.getParent(e, 'tr')) && !DOM.hasClass(e, cp + 'ItemSub')) { + m = t.items[e.id]; + + if (m.isDisabled()) + return; + + dm = t; + + while (dm) { + if (dm.hideMenu) + dm.hideMenu(); + + dm = dm.settings.parent; + } + + if (m.settings.onclick) + m.settings.onclick(e); + + return Event.cancel(e); // Cancel to fix onbeforeunload problem + } + }); + + if (t.hasMenus()) { + t.mouseOverFunc = Event.add(co, 'mouseover', function(e) { + var m, r, mi; + + e = e.target; + if (e && (e = DOM.getParent(e, 'tr'))) { + m = t.items[e.id]; + + if (t.lastMenu) + t.lastMenu.collapse(1); + + if (m.isDisabled()) + return; + + if (e && DOM.hasClass(e, cp + 'ItemSub')) { + //p = DOM.getPos(s.container); + r = DOM.getRect(e); + m.showMenu((r.x + r.w - ot), r.y - ot, r.x); + t.lastMenu = m; + DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive'); + } + } + }); + } + + Event.add(co, 'keydown', t._keyHandler, t); + + t.onShowMenu.dispatch(t); + + if (s.keyboard_focus) { + t._setupKeyboardNav(); + } + }, + + hideMenu : function(c) { + var t = this, co = DOM.get('menu_' + t.id), e; + + if (!t.isMenuVisible) + return; + + if (t.keyboardNav) t.keyboardNav.destroy(); + Event.remove(co, 'mouseover', t.mouseOverFunc); + Event.remove(co, 'click', t.mouseClickFunc); + Event.remove(co, 'keydown', t._keyHandler); + DOM.hide(co); + t.isMenuVisible = 0; + + if (!c) + t.collapse(1); + + if (t.element) + t.element.hide(); + + if (e = DOM.get(t.id)) + DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive'); + + t.onHideMenu.dispatch(t); + }, + + add : function(o) { + var t = this, co; + + o = t.parent(o); + + if (t.isRendered && (co = DOM.get('menu_' + t.id))) + t._add(DOM.select('tbody', co)[0], o); + + return o; + }, + + collapse : function(d) { + this.parent(d); + this.hideMenu(1); + }, + + remove : function(o) { + DOM.remove(o.id); + this.destroy(); + + return this.parent(o); + }, + + destroy : function() { + var t = this, co = DOM.get('menu_' + t.id); + + if (t.keyboardNav) t.keyboardNav.destroy(); + Event.remove(co, 'mouseover', t.mouseOverFunc); + Event.remove(DOM.select('a', co), 'focus', t.mouseOverFunc); + Event.remove(co, 'click', t.mouseClickFunc); + Event.remove(co, 'keydown', t._keyHandler); + + if (t.element) + t.element.remove(); + + DOM.remove(co); + }, + + renderNode : function() { + var t = this, s = t.settings, n, tb, co, w; + + w = DOM.create('div', {role: 'listbox', id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000;outline:0'}); + if (t.settings.parent) { + DOM.setAttrib(w, 'aria-parent', 'menu_' + t.settings.parent.id); + } + co = DOM.add(w, 'div', {role: 'presentation', id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')}); + t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); + + if (s.menu_line) + DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'}); + +// n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'}); + n = DOM.add(co, 'table', {role: 'presentation', id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); + tb = DOM.add(n, 'tbody'); + + each(t.items, function(o) { + t._add(tb, o); + }); + + t.rendered = true; + + return w; + }, + + // Internal functions + _setupKeyboardNav : function(){ + var contextMenu, menuItems, t=this; + contextMenu = DOM.select('#menu_' + t.id)[0]; + menuItems = DOM.select('a[role=option]', 'menu_' + t.id); + menuItems.splice(0,0,contextMenu); + t.keyboardNav = new tinymce.ui.KeyboardNavigation({ + root: 'menu_' + t.id, + items: menuItems, + onCancel: function() { + t.hideMenu(); + }, + enableUpDown: true + }); + contextMenu.focus(); + }, + + _keyHandler : function(evt) { + var t = this, e; + switch (evt.keyCode) { + case 37: // Left + if (t.settings.parent) { + t.hideMenu(); + t.settings.parent.focus(); + Event.cancel(evt); + } + break; + case 39: // Right + if (t.mouseOverFunc) + t.mouseOverFunc(evt); + break; + } + }, + + _add : function(tb, o) { + var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic; + + if (s.separator) { + ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'}); + DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'}); + + if (n = ro.previousSibling) + DOM.addClass(n, 'mceLast'); + + return; + } + + n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'}); + n = it = DOM.add(n, s.titleItem ? 'th' : 'td'); + n = a = DOM.add(n, 'a', {id: o.id + '_aria', role: s.titleItem ? 'presentation' : 'option', href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); + + if (s.parent) { + DOM.setAttrib(a, 'aria-haspopup', 'true'); + DOM.setAttrib(a, 'aria-owns', 'menu_' + o.id); + } + + DOM.addClass(it, s['class']); +// n = DOM.add(n, 'span', {'class' : 'item'}); + + ic = DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')}); + + if (s.icon_src) + DOM.add(ic, 'img', {src : s.icon_src}); + + n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title); + + if (o.settings.style) + DOM.setAttrib(n, 'style', o.settings.style); + + if (tb.childNodes.length == 1) + DOM.addClass(ro, 'mceFirst'); + + if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator')) + DOM.addClass(ro, 'mceFirst'); + + if (o.collapse) + DOM.addClass(ro, cp + 'ItemSub'); + + if (n = ro.previousSibling) + DOM.removeClass(n, 'mceLast'); + + DOM.addClass(ro, 'mceLast'); + } + }); +})(tinymce); +(function(tinymce) { + var DOM = tinymce.DOM; + + tinymce.create('tinymce.ui.Button:tinymce.ui.Control', { + Button : function(id, s, ed) { + this.parent(id, s, ed); + this.classPrefix = 'mceButton'; + }, + + renderHTML : function() { + var cp = this.classPrefix, s = this.settings, h, l; + + l = DOM.encode(s.label || ''); + h = '<a role="button" id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" aria-labelledby="' + this.id + '_voice" title="' + DOM.encode(s.title) + '">'; + + if (s.image) + h += '<img class="mceIcon" src="' + s.image + '" alt="' + DOM.encode(s.title) + '" />' + l; + else + h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : ''); + + h += '<span class="mceVoiceLabel mceIconOnly" style="display: none;" id="' + this.id + '_voice">' + s.title + '</span>'; + h += '</a>'; + return h; + }, + + postRender : function() { + var t = this, s = t.settings; + + tinymce.dom.Event.add(t.id, 'click', function(e) { + if (!t.isDisabled()) + return s.onclick.call(s.scope, e); + }); + } + }); +})(tinymce); + +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; + + tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', { + ListBox : function(id, s, ed) { + var t = this; + + t.parent(id, s, ed); + + t.items = []; + + t.onChange = new Dispatcher(t); + + t.onPostRender = new Dispatcher(t); + + t.onAdd = new Dispatcher(t); + + t.onRenderMenu = new tinymce.util.Dispatcher(this); + + t.classPrefix = 'mceListBox'; + }, + + select : function(va) { + var t = this, fv, f; + + if (va == undefined) + return t.selectByIndex(-1); + + // Is string or number make function selector + if (va && va.call) + f = va; + else { + f = function(v) { + return v == va; + }; + } + + // Do we need to do something? + if (va != t.selectedValue) { + // Find item + each(t.items, function(o, i) { + if (f(o.value)) { + fv = 1; + t.selectByIndex(i); + return false; + } + }); + + if (!fv) + t.selectByIndex(-1); + } + }, + + selectByIndex : function(idx) { + var t = this, e, o; + + if (idx != t.selectedIndex) { + e = DOM.get(t.id + '_text'); + o = t.items[idx]; + + if (o) { + t.selectedValue = o.value; + t.selectedIndex = idx; + DOM.setHTML(e, DOM.encode(o.title)); + DOM.removeClass(e, 'mceTitle'); + DOM.setAttrib(t.id, 'aria-valuenow', o.title); + } else { + DOM.setHTML(e, DOM.encode(t.settings.title)); + DOM.addClass(e, 'mceTitle'); + t.selectedValue = t.selectedIndex = null; + DOM.setAttrib(t.id, 'aria-valuenow', t.settings.title); + } + e = 0; + } + }, + + add : function(n, v, o) { + var t = this; + + o = o || {}; + o = tinymce.extend(o, { + title : n, + value : v + }); + + t.items.push(o); + t.onAdd.dispatch(t, o); + }, + + getLength : function() { + return this.items.length; + }, + + renderHTML : function() { + var h = '', t = this, s = t.settings, cp = t.classPrefix; + + h = '<span role="button" aria-haspopup="true" aria-labelledby="' + t.id +'_text" aria-describedby="' + t.id + '_voiceDesc"><table role="presentation" tabindex="0" id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>'; + h += '<td>' + DOM.createHTML('span', {id: t.id + '_voiceDesc', 'class': 'voiceLabel', style:'display:none;'}, t.settings.title); + h += DOM.createHTML('a', {id : t.id + '_text', tabindex : -1, href : 'javascript:;', 'class' : 'mceText', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '</td>'; + h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', tabindex : -1, href : 'javascript:;', 'class' : 'mceOpen', onclick : "return false;", onmousedown : 'return false;'}, '<span><span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span></span>') + '</td>'; + h += '</tr></tbody></table></span>'; + + return h; + }, + + showMenu : function() { + var t = this, p1, p2, e = DOM.get(this.id), m; + + if (t.isDisabled() || t.items.length == 0) + return; + + if (t.menu && t.menu.isMenuVisible) + return t.hideMenu(); + + if (!t.isMenuRendered) { + t.renderMenu(); + t.isMenuRendered = true; + } + + p1 = DOM.getPos(this.settings.menu_container); + p2 = DOM.getPos(e); + + m = t.menu; + m.settings.offset_x = p2.x; + m.settings.offset_y = p2.y; + m.settings.keyboard_focus = !tinymce.isOpera; // Opera is buggy when it comes to auto focus + + // Select in menu + if (t.oldID) + m.items[t.oldID].setSelected(0); + + each(t.items, function(o) { + if (o.value === t.selectedValue) { + m.items[o.id].setSelected(1); + t.oldID = o.id; + } + }); + + m.showMenu(0, e.clientHeight); + + Event.add(DOM.doc, 'mousedown', t.hideMenu, t); + DOM.addClass(t.id, t.classPrefix + 'Selected'); + + //DOM.get(t.id + '_text').focus(); + }, + + hideMenu : function(e) { + var t = this; + + if (t.menu && t.menu.isMenuVisible) { + DOM.removeClass(t.id, t.classPrefix + 'Selected'); + + // Prevent double toogles by canceling the mouse click event to the button + if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open')) + return; + + if (!e || !DOM.getParent(e.target, '.mceMenu')) { + DOM.removeClass(t.id, t.classPrefix + 'Selected'); + Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); + t.menu.hideMenu(); + } + } + }, + + renderMenu : function() { + var t = this, m; + + m = t.settings.control_manager.createDropMenu(t.id + '_menu', { + menu_line : 1, + 'class' : t.classPrefix + 'Menu mceNoIcons', + max_width : 150, + max_height : 150 + }); + + m.onHideMenu.add(function() { + t.hideMenu(); + t.focus(); + }); + + m.add({ + title : t.settings.title, + 'class' : 'mceMenuItemTitle', + onclick : function() { + if (t.settings.onselect('') !== false) + t.select(''); // Must be runned after + } + }); + + each(t.items, function(o) { + // No value then treat it as a title + if (o.value === undefined) { + m.add({ + title : o.title, + 'class' : 'mceMenuItemTitle', + onclick : function() { + if (t.settings.onselect('') !== false) + t.select(''); // Must be runned after + } + }); + } else { + o.id = DOM.uniqueId(); + o.onclick = function() { + if (t.settings.onselect(o.value) !== false) + t.select(o.value); // Must be runned after + }; + + m.add(o); + } + }); + + t.onRenderMenu.dispatch(t, m); + t.menu = m; + }, + + postRender : function() { + var t = this, cp = t.classPrefix; + + Event.add(t.id, 'click', t.showMenu, t); + Event.add(t.id, 'keydown', function(evt) { + if (evt.keyCode == 32) { // Space + t.showMenu(evt); + Event.cancel(evt); + } + }); + Event.add(t.id, 'focus', function() { + if (!t._focused) { + t.keyDownHandler = Event.add(t.id, 'keydown', function(e) { + if (e.keyCode == 40) { + t.showMenu(); + Event.cancel(e); + } + }); + t.keyPressHandler = Event.add(t.id, 'keypress', function(e) { + var v; + if (e.keyCode == 13) { + // Fake select on enter + v = t.selectedValue; + t.selectedValue = null; // Needs to be null to fake change + Event.cancel(e); + t.settings.onselect(v); + } + }); + } + + t._focused = 1; + }); + Event.add(t.id, 'blur', function() { + Event.remove(t.id, 'keydown', t.keyDownHandler); + Event.remove(t.id, 'keypress', t.keyPressHandler); + t._focused = 0; + }); + + // Old IE doesn't have hover on all elements + if (tinymce.isIE6 || !DOM.boxModel) { + Event.add(t.id, 'mouseover', function() { + if (!DOM.hasClass(t.id, cp + 'Disabled')) + DOM.addClass(t.id, cp + 'Hover'); + }); + + Event.add(t.id, 'mouseout', function() { + if (!DOM.hasClass(t.id, cp + 'Disabled')) + DOM.removeClass(t.id, cp + 'Hover'); + }); + } + + t.onPostRender.dispatch(t, DOM.get(t.id)); + }, + + destroy : function() { + this.parent(); + + Event.clear(this.id + '_text'); + Event.clear(this.id + '_open'); + } + }); +})(tinymce); +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; + + tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', { + NativeListBox : function(id, s) { + this.parent(id, s); + this.classPrefix = 'mceNativeListBox'; + }, + + setDisabled : function(s) { + DOM.get(this.id).disabled = s; + this.setAriaProperty('disabled', s); + }, + + isDisabled : function() { + return DOM.get(this.id).disabled; + }, + + select : function(va) { + var t = this, fv, f; + + if (va == undefined) + return t.selectByIndex(-1); + + // Is string or number make function selector + if (va && va.call) + f = va; + else { + f = function(v) { + return v == va; + }; + } + + // Do we need to do something? + if (va != t.selectedValue) { + // Find item + each(t.items, function(o, i) { + if (f(o.value)) { + fv = 1; + t.selectByIndex(i); + return false; + } + }); + + if (!fv) + t.selectByIndex(-1); + } + }, + + selectByIndex : function(idx) { + DOM.get(this.id).selectedIndex = idx + 1; + this.selectedValue = this.items[idx] ? this.items[idx].value : null; + }, + + add : function(n, v, a) { + var o, t = this; + + a = a || {}; + a.value = v; + + if (t.isRendered()) + DOM.add(DOM.get(this.id), 'option', a, n); + + o = { + title : n, + value : v, + attribs : a + }; + + t.items.push(o); + t.onAdd.dispatch(t, o); + }, + + getLength : function() { + return this.items.length; + }, + + renderHTML : function() { + var h, t = this; + + h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --'); + + each(t.items, function(it) { + h += DOM.createHTML('option', {value : it.value}, it.title); + }); + + h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox', 'aria-labelledby': t.id + '_aria'}, h); + h += DOM.createHTML('span', {id : t.id + '_aria', 'style': 'display: none'}, t.settings.title); + return h; + }, + + postRender : function() { + var t = this, ch, changeListenerAdded = true; + + t.rendered = true; + + function onChange(e) { + var v = t.items[e.target.selectedIndex - 1]; + + if (v && (v = v.value)) { + t.onChange.dispatch(t, v); + + if (t.settings.onselect) + t.settings.onselect(v); + } + }; + + Event.add(t.id, 'change', onChange); + + // Accessibility keyhandler + Event.add(t.id, 'keydown', function(e) { + var bf; + + Event.remove(t.id, 'change', ch); + changeListenerAdded = false; + + bf = Event.add(t.id, 'blur', function() { + if (changeListenerAdded) return; + changeListenerAdded = true; + Event.add(t.id, 'change', onChange); + Event.remove(t.id, 'blur', bf); + }); + + if (e.keyCode == 13 || e.keyCode == 32) { + onChange(e); + return Event.cancel(e); + } + }); + + t.onPostRender.dispatch(t, DOM.get(t.id)); + } + }); +})(tinymce); +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; + + tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', { + MenuButton : function(id, s, ed) { + this.parent(id, s, ed); + + this.onRenderMenu = new tinymce.util.Dispatcher(this); + + s.menu_container = s.menu_container || DOM.doc.body; + }, + + showMenu : function() { + var t = this, p1, p2, e = DOM.get(t.id), m; + + if (t.isDisabled()) + return; + + if (!t.isMenuRendered) { + t.renderMenu(); + t.isMenuRendered = true; + } + + if (t.isMenuVisible) + return t.hideMenu(); + + p1 = DOM.getPos(t.settings.menu_container); + p2 = DOM.getPos(e); + + m = t.menu; + m.settings.offset_x = p2.x; + m.settings.offset_y = p2.y; + m.settings.vp_offset_x = p2.x; + m.settings.vp_offset_y = p2.y; + m.settings.keyboard_focus = t._focused; + m.showMenu(0, e.clientHeight); + + Event.add(DOM.doc, 'mousedown', t.hideMenu, t); + t.setState('Selected', 1); + + t.isMenuVisible = 1; + }, + + renderMenu : function() { + var t = this, m; + + m = t.settings.control_manager.createDropMenu(t.id + '_menu', { + menu_line : 1, + 'class' : this.classPrefix + 'Menu', + icons : t.settings.icons + }); + + m.onHideMenu.add(function() { + t.hideMenu(); + t.focus(); + }); + + t.onRenderMenu.dispatch(t, m); + t.menu = m; + }, + + hideMenu : function(e) { + var t = this; + + // Prevent double toogles by canceling the mouse click event to the button + if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';})) + return; + + if (!e || !DOM.getParent(e.target, '.mceMenu')) { + t.setState('Selected', 0); + Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); + if (t.menu) + t.menu.hideMenu(); + } + + t.isMenuVisible = 0; + }, + + postRender : function() { + var t = this, s = t.settings; + + Event.add(t.id, 'click', function() { + if (!t.isDisabled()) { + if (s.onclick) + s.onclick(t.value); + + t.showMenu(); + } + }); + } + }); +})(tinymce); + +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; + + tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', { + SplitButton : function(id, s, ed) { + this.parent(id, s, ed); + this.classPrefix = 'mceSplitButton'; + }, + + renderHTML : function() { + var h, t = this, s = t.settings, h1; + + h = '<tbody><tr>'; + + if (s.image) + h1 = DOM.createHTML('img ', {src : s.image, role: 'presentation', 'class' : 'mceAction ' + s['class']}); + else + h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, ''); + + h1 += DOM.createHTML('span', {'class': 'mceVoiceLabel mceIconOnly', id: t.id + '_voice', style: 'display:none;'}, s.title); + h += '<td >' + DOM.createHTML('a', {role: 'button', id : t.id + '_action', tabindex: '-1', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; + + h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}, '<span style="display:none;" class="mceIconOnly" aria-hidden="true">\u25BC</span>'); + h += '<td >' + DOM.createHTML('a', {role: 'button', id : t.id + '_open', tabindex: '-1', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; + + h += '</tr></tbody>'; + h = DOM.createHTML('table', {id : t.id, role: 'presentation', tabindex: '0', 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', title : s.title}, h); + return DOM.createHTML('span', {role: 'button', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h); + }, + + postRender : function() { + var t = this, s = t.settings, activate; + + if (s.onclick) { + activate = function(evt) { + if (!t.isDisabled()) { + s.onclick(t.value); + Event.cancel(evt); + } + }; + Event.add(t.id + '_action', 'click', activate); + Event.add(t.id, ['click', 'keydown'], function(evt) { + var DOM_VK_SPACE = 32, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_UP = 38, DOM_VK_DOWN = 40; + if ((evt.keyCode === 32 || evt.keyCode === 13 || evt.keyCode === 14) && !evt.altKey && !evt.ctrlKey && !evt.metaKey) { + activate(); + Event.cancel(evt); + } else if (evt.type === 'click' || evt.keyCode === DOM_VK_DOWN) { + t.showMenu(); + Event.cancel(evt); + } + }); + } + + Event.add(t.id + '_open', 'click', function (evt) { + t.showMenu(); + Event.cancel(evt); + }); + Event.add([t.id, t.id + '_open'], 'focus', function() {t._focused = 1;}); + Event.add([t.id, t.id + '_open'], 'blur', function() {t._focused = 0;}); + + // Old IE doesn't have hover on all elements + if (tinymce.isIE6 || !DOM.boxModel) { + Event.add(t.id, 'mouseover', function() { + if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) + DOM.addClass(t.id, 'mceSplitButtonHover'); + }); + + Event.add(t.id, 'mouseout', function() { + if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) + DOM.removeClass(t.id, 'mceSplitButtonHover'); + }); + } + }, + + destroy : function() { + this.parent(); + + Event.clear(this.id + '_action'); + Event.clear(this.id + '_open'); + Event.clear(this.id); + } + }); +})(tinymce); + +(function(tinymce) { + var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each; + + tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', { + ColorSplitButton : function(id, s, ed) { + var t = this; + + t.parent(id, s, ed); + + t.settings = s = tinymce.extend({ + colors : '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF', + grid_width : 8, + default_color : '#888888' + }, t.settings); + + t.onShowMenu = new tinymce.util.Dispatcher(t); + + t.onHideMenu = new tinymce.util.Dispatcher(t); + + t.value = s.default_color; + }, + + showMenu : function() { + var t = this, r, p, e, p2; + + if (t.isDisabled()) + return; + + if (!t.isMenuRendered) { + t.renderMenu(); + t.isMenuRendered = true; + } + + if (t.isMenuVisible) + return t.hideMenu(); + + e = DOM.get(t.id); + DOM.show(t.id + '_menu'); + DOM.addClass(e, 'mceSplitButtonSelected'); + p2 = DOM.getPos(e); + DOM.setStyles(t.id + '_menu', { + left : p2.x, + top : p2.y + e.clientHeight, + zIndex : 200000 + }); + e = 0; + + Event.add(DOM.doc, 'mousedown', t.hideMenu, t); + t.onShowMenu.dispatch(t); + + if (t._focused) { + t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) { + if (e.keyCode == 27) + t.hideMenu(); + }); + + DOM.select('a', t.id + '_menu')[0].focus(); // Select first link + } + + t.isMenuVisible = 1; + }, + + hideMenu : function(e) { + var t = this; + + // Prevent double toogles by canceling the mouse click event to the button + if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';})) + return; + + if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu')) { + DOM.removeClass(t.id, 'mceSplitButtonSelected'); + Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); + Event.remove(t.id + '_menu', 'keydown', t._keyHandler); + DOM.hide(t.id + '_menu'); + } + + t.onHideMenu.dispatch(t); + + t.isMenuVisible = 0; + t.editor.focus(); + }, + + renderMenu : function() { + var t = this, m, i = 0, s = t.settings, n, tb, tr, w, context; + + w = DOM.add(s.menu_container, 'div', {role: 'listbox', id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); + m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'}); + DOM.add(m, 'span', {'class' : 'mceMenuLine'}); + + n = DOM.add(m, 'table', {role: 'presentation', 'class' : 'mceColorSplitMenu'}); + tb = DOM.add(n, 'tbody'); + + // Generate color grid + i = 0; + each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) { + c = c.replace(/^#/, ''); + + if (!i--) { + tr = DOM.add(tb, 'tr'); + i = s.grid_width - 1; + } + + n = DOM.add(tr, 'td'); + n = DOM.add(n, 'a', { + role : 'option', + href : 'javascript:;', + style : { + backgroundColor : '#' + c + }, + 'title': t.editor.getLang('colors.' + c, c), + 'data-mce-color' : '#' + c + }); + + if (t.editor.forcedHighContrastMode) { + n = DOM.add(n, 'canvas', { width: 16, height: 16, 'aria-hidden': 'true' }); + if (n.getContext && (context = n.getContext("2d"))) { + context.fillStyle = '#' + c; + context.fillRect(0, 0, 16, 16); + } else { + // No point leaving a canvas element around if it's not supported for drawing on anyway. + DOM.remove(n); + } + } + }); + + if (s.more_colors_func) { + n = DOM.add(tb, 'tr'); + n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'}); + n = DOM.add(n, 'a', {role: 'option', id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title); + + Event.add(n, 'click', function(e) { + s.more_colors_func.call(s.more_colors_scope || this); + return Event.cancel(e); // Cancel to fix onbeforeunload problem + }); + } + + DOM.addClass(m, 'mceColorSplitMenu'); + + new tinymce.ui.KeyboardNavigation({ + root: t.id + '_menu', + items: DOM.select('a', t.id + '_menu'), + onCancel: function() { + t.hideMenu(); + t.focus(); + } + }); + + // Prevent IE from scrolling and hindering click to occur #4019 + Event.add(t.id + '_menu', 'mousedown', function(e) {return Event.cancel(e);}); + + Event.add(t.id + '_menu', 'click', function(e) { + var c; + + e = DOM.getParent(e.target, 'a', tb); + + if (e && e.nodeName.toLowerCase() == 'a' && (c = e.getAttribute('data-mce-color'))) + t.setColor(c); + + return Event.cancel(e); // Prevent IE auto save warning + }); + + return w; + }, + + setColor : function(c) { + this.displayColor(c); + this.hideMenu(); + this.settings.onselect(c); + }, + + displayColor : function(c) { + var t = this; + + DOM.setStyle(t.id + '_preview', 'backgroundColor', c); + + t.value = c; + }, + + postRender : function() { + var t = this, id = t.id; + + t.parent(); + DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' : 'mceColorPreview'}); + DOM.setStyle(t.id + '_preview', 'backgroundColor', t.value); + }, + + destroy : function() { + this.parent(); + + Event.clear(this.id + '_menu'); + Event.clear(this.id + '_more'); + DOM.remove(this.id + '_menu'); + } + }); +})(tinymce); + +(function(tinymce) { +// Shorten class names +var dom = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event; +tinymce.create('tinymce.ui.ToolbarGroup:tinymce.ui.Container', { + renderHTML : function() { + var t = this, h = [], controls = t.controls, each = tinymce.each, settings = t.settings; + + h.push('<div id="' + t.id + '" role="group" aria-labelledby="' + t.id + '_voice">'); + //TODO: ACC test this out - adding a role = application for getting the landmarks working well. + h.push("<span role='application'>"); + h.push('<span id="' + t.id + '_voice" class="mceVoiceLabel" style="display:none;">' + dom.encode(settings.name) + '</span>'); + each(controls, function(toolbar) { + h.push(toolbar.renderHTML()); + }); + h.push("</span>"); + h.push('</div>'); + + return h.join(''); + }, + + focus : function() { + this.keyNav.focus(); + }, + + postRender : function() { + var t = this, items = []; + + each(t.controls, function(toolbar) { + each (toolbar.controls, function(control) { + if (control.id) { + items.push(control); + } + }); + }); + + t.keyNav = new tinymce.ui.KeyboardNavigation({ + root: t.id, + items: items, + onCancel: function() { + t.editor.focus(); + }, + excludeFromTabOrder: !t.settings.tab_focus_toolbar + }); + }, + + destroy : function() { + var self = this; + + self.parent(); + self.keyNav.destroy(); + Event.clear(self.id); + } +}); +})(tinymce); + +(function(tinymce) { +// Shorten class names +var dom = tinymce.DOM, each = tinymce.each +tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { + renderHTML : function() { + var t = this, h = '', c, co, s = t.settings, i, pr, nx, cl; + + cl = t.controls; + for (i=0; i<cl.length; i++) { + // Get current control, prev control, next control and if the control is a list box or not + co = cl[i]; + pr = cl[i - 1]; + nx = cl[i + 1]; + + // Add toolbar start + if (i === 0) { + c = 'mceToolbarStart'; + + if (co.Button) + c += ' mceToolbarStartButton'; + else if (co.SplitButton) + c += ' mceToolbarStartSplitButton'; + else if (co.ListBox) + c += ' mceToolbarStartListBox'; + + h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); + } + + // Add toolbar end before list box and after the previous button + // This is to fix the o2k7 editor skins + if (pr && co.ListBox) { + if (pr.Button || pr.SplitButton) + h += dom.createHTML('td', {'class' : 'mceToolbarEnd'}, dom.createHTML('span', null, '<!-- IE -->')); + } + + // Render control HTML + + // IE 8 quick fix, needed to propertly generate a hit area for anchors + if (dom.stdMode) + h += '<td style="position: relative">' + co.renderHTML() + '</td>'; + else + h += '<td>' + co.renderHTML() + '</td>'; + + // Add toolbar start after list box and before the next button + // This is to fix the o2k7 editor skins + if (nx && co.ListBox) { + if (nx.Button || nx.SplitButton) + h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->')); + } + } + + c = 'mceToolbarEnd'; + + if (co.Button) + c += ' mceToolbarEndButton'; + else if (co.SplitButton) + c += ' mceToolbarEndSplitButton'; + else if (co.ListBox) + c += ' mceToolbarEndListBox'; + + h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); + + return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || '', role: 'presentation', tabindex: '-1'}, '<tbody><tr>' + h + '</tr></tbody>'); + } +}); +})(tinymce); + +(function(tinymce) { + var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; + + tinymce.create('tinymce.AddOnManager', { + AddOnManager : function() { + var self = this; + + self.items = []; + self.urls = {}; + self.lookup = {}; + self.onAdd = new Dispatcher(self); + }, + + get : function(n) { + return this.lookup[n]; + }, + + requireLangPack : function(n) { + var s = tinymce.settings; + + if (s && s.language && s.language_load !== false) + tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js'); + }, + + add : function(id, o) { + this.items.push(o); + this.lookup[id] = o; + this.onAdd.dispatch(this, id, o); + + return o; + }, + + load : function(n, u, cb, s) { + var t = this; + + if (t.urls[n]) + return; + + if (u.indexOf('/') != 0 && u.indexOf('://') == -1) + u = tinymce.baseURL + '/' + u; + + t.urls[n] = u.substring(0, u.lastIndexOf('/')); + + if (!t.lookup[n]) + tinymce.ScriptLoader.add(u, cb, s); + } + }); + + // Create plugin and theme managers + tinymce.PluginManager = new tinymce.AddOnManager(); + tinymce.ThemeManager = new tinymce.AddOnManager(); +}(tinymce)); + +(function(tinymce) { + // Shorten names + var each = tinymce.each, extend = tinymce.extend, + DOM = tinymce.DOM, Event = tinymce.dom.Event, + ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, + explode = tinymce.explode, + Dispatcher = tinymce.util.Dispatcher, undefined, instanceCounter = 0; + + // Setup some URLs where the editor API is located and where the document is + tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, ''); + if (!/[\/\\]$/.test(tinymce.documentBaseURL)) + tinymce.documentBaseURL += '/'; + + tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL); + + tinymce.baseURI = new tinymce.util.URI(tinymce.baseURL); + + // Add before unload listener + // This was required since IE was leaking memory if you added and removed beforeunload listeners + // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event + tinymce.onBeforeUnload = new Dispatcher(tinymce); + + // Must be on window or IE will leak if the editor is placed in frame or iframe + Event.add(window, 'beforeunload', function(e) { + tinymce.onBeforeUnload.dispatch(tinymce, e); + }); + + tinymce.onAddEditor = new Dispatcher(tinymce); + + tinymce.onRemoveEditor = new Dispatcher(tinymce); + + tinymce.EditorManager = extend(tinymce, { + editors : [], + + i18n : {}, + + activeEditor : null, + + init : function(s) { + var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed; + + function execCallback(se, n, s) { + var f = se[n]; + + if (!f) + return; + + if (tinymce.is(f, 'string')) { + s = f.replace(/\.\w+$/, ''); + s = s ? tinymce.resolve(s) : 0; + f = tinymce.resolve(f); + } + + return f.apply(s || this, Array.prototype.slice.call(arguments, 2)); + }; + + s = extend({ + theme : "simple", + language : "en" + }, s); + + t.settings = s; + + // Legacy call + Event.add(document, 'init', function() { + var l, co; + + execCallback(s, 'onpageload'); + + switch (s.mode) { + case "exact": + l = s.elements || ''; + + if(l.length > 0) { + each(explode(l), function(v) { + if (DOM.get(v)) { + ed = new tinymce.Editor(v, s); + el.push(ed); + ed.render(1); + } else { + each(document.forms, function(f) { + each(f.elements, function(e) { + if (e.name === v) { + v = 'mce_editor_' + instanceCounter++; + DOM.setAttrib(e, 'id', v); + + ed = new tinymce.Editor(v, s); + el.push(ed); + ed.render(1); + } + }); + }); + } + }); + } + break; + + case "textareas": + case "specific_textareas": + function hasClass(n, c) { + return c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c); + }; + + each(DOM.select('textarea'), function(v) { + if (s.editor_deselector && hasClass(v, s.editor_deselector)) + return; + + if (!s.editor_selector || hasClass(v, s.editor_selector)) { + // Can we use the name + e = DOM.get(v.name); + if (!v.id && !e) + v.id = v.name; + + // Generate unique name if missing or already exists + if (!v.id || t.get(v.id)) + v.id = DOM.uniqueId(); + + ed = new tinymce.Editor(v.id, s); + el.push(ed); + ed.render(1); + } + }); + break; + } + + // Call onInit when all editors are initialized + if (s.oninit) { + l = co = 0; + + each(el, function(ed) { + co++; + + if (!ed.initialized) { + // Wait for it + ed.onInit.add(function() { + l++; + + // All done + if (l == co) + execCallback(s, 'oninit'); + }); + } else + l++; + + // All done + if (l == co) + execCallback(s, 'oninit'); + }); + } + }); + }, + + get : function(id) { + if (id === undefined) + return this.editors; + + return this.editors[id]; + }, + + getInstanceById : function(id) { + return this.get(id); + }, + + add : function(editor) { + var self = this, editors = self.editors; + + // Add named and index editor instance + editors[editor.id] = editor; + editors.push(editor); + + self._setActive(editor); + self.onAddEditor.dispatch(self, editor); + + + return editor; + }, + + remove : function(editor) { + var t = this, i, editors = t.editors; + + // Not in the collection + if (!editors[editor.id]) + return null; + + delete editors[editor.id]; + + for (i = 0; i < editors.length; i++) { + if (editors[i] == editor) { + editors.splice(i, 1); + break; + } + } + + // Select another editor since the active one was removed + if (t.activeEditor == editor) + t._setActive(editors[0]); + + editor.destroy(); + t.onRemoveEditor.dispatch(t, editor); + + return editor; + }, + + execCommand : function(c, u, v) { + var t = this, ed = t.get(v), w; + + // Manager commands + switch (c) { + case "mceFocus": + ed.focus(); + return true; + + case "mceAddEditor": + case "mceAddControl": + if (!t.get(v)) + new tinymce.Editor(v, t.settings).render(); + + return true; + + case "mceAddFrameControl": + w = v.window; + + // Add tinyMCE global instance and tinymce namespace to specified window + w.tinyMCE = tinyMCE; + w.tinymce = tinymce; + + tinymce.DOM.doc = w.document; + tinymce.DOM.win = w; + + ed = new tinymce.Editor(v.element_id, v); + ed.render(); + + // Fix IE memory leaks + if (tinymce.isIE) { + function clr() { + ed.destroy(); + w.detachEvent('onunload', clr); + w = w.tinyMCE = w.tinymce = null; // IE leak + }; + + w.attachEvent('onunload', clr); + } + + v.page_window = null; + + return true; + + case "mceRemoveEditor": + case "mceRemoveControl": + if (ed) + ed.remove(); + + return true; + + case 'mceToggleEditor': + if (!ed) { + t.execCommand('mceAddControl', 0, v); + return true; + } + + if (ed.isHidden()) + ed.show(); + else + ed.hide(); + + return true; + } + + // Run command on active editor + if (t.activeEditor) + return t.activeEditor.execCommand(c, u, v); + + return false; + }, + + execInstanceCommand : function(id, c, u, v) { + var ed = this.get(id); + + if (ed) + return ed.execCommand(c, u, v); + + return false; + }, + + triggerSave : function() { + each(this.editors, function(e) { + e.save(); + }); + }, + + addI18n : function(p, o) { + var lo, i18n = this.i18n; + + if (!tinymce.is(p, 'string')) { + each(p, function(o, lc) { + each(o, function(o, g) { + each(o, function(o, k) { + if (g === 'common') + i18n[lc + '.' + k] = o; + else + i18n[lc + '.' + g + '.' + k] = o; + }); + }); + }); + } else { + each(o, function(o, k) { + i18n[p + '.' + k] = o; + }); + } + }, + + // Private methods + + _setActive : function(editor) { + this.selectedInstance = this.activeEditor = editor; + } + }); +})(tinymce); + +(function(tinymce) { + // Shorten these names + var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, + Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isGecko = tinymce.isGecko, + isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is, + ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, + inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode; + + tinymce.create('tinymce.Editor', { + Editor : function(id, s) { + var t = this; + + t.id = t.editorId = id; + + t.execCommands = {}; + t.queryStateCommands = {}; + t.queryValueCommands = {}; + + t.isNotDirty = false; + + t.plugins = {}; + + // Add events to the editor + each([ + 'onPreInit', + + 'onBeforeRenderUI', + + 'onPostRender', + + 'onInit', + + 'onRemove', + + 'onActivate', + + 'onDeactivate', + + 'onClick', + + 'onEvent', + + 'onMouseUp', + + 'onMouseDown', + + 'onDblClick', + + 'onKeyDown', + + 'onKeyUp', + + 'onKeyPress', + + 'onContextMenu', + + 'onSubmit', + + 'onReset', + + 'onPaste', + + 'onPreProcess', + + 'onPostProcess', + + 'onBeforeSetContent', + + 'onBeforeGetContent', + + 'onSetContent', + + 'onGetContent', + + 'onLoadContent', + + 'onSaveContent', + + 'onNodeChange', + + 'onChange', + + 'onBeforeExecCommand', + + 'onExecCommand', + + 'onUndo', + + 'onRedo', + + 'onVisualAid', + + 'onSetProgressState' + ], function(e) { + t[e] = new Dispatcher(t); + }); + + t.settings = s = extend({ + id : id, + language : 'en', + docs_language : 'en', + theme : 'simple', + skin : 'default', + delta_width : 0, + delta_height : 0, + popup_css : '', + plugins : '', + document_base_url : tinymce.documentBaseURL, + add_form_submit_trigger : 1, + submit_patch : 1, + add_unload_trigger : 1, + convert_urls : 1, + relative_urls : 1, + remove_script_host : 1, + table_inline_editing : 0, + object_resizing : 1, + cleanup : 1, + accessibility_focus : 1, + custom_shortcuts : 1, + custom_undo_redo_keyboard_shortcuts : 1, + custom_undo_redo_restore_selection : 1, + custom_undo_redo : 1, + doctype : tinymce.isIE6 ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' : '<!DOCTYPE>', // Use old doctype on IE 6 to avoid horizontal scroll + visual_table_class : 'mceItemTable', + visual : 1, + font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large', + apply_source_formatting : 1, + directionality : 'ltr', + forced_root_block : 'p', + hidden_input : 1, + padd_empty_editor : 1, + render_ui : 1, + init_theme : 1, + force_p_newlines : 1, + indentation : '30px', + keep_styles : 1, + fix_table_elements : 1, + inline_styles : 1, + convert_fonts_to_spans : true, + indent : 'simple', + indent_before : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr', + indent_after : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr', + validate : true, + entity_encoding : 'named', + url_converter : t.convertURL, + url_converter_scope : t, + ie7_compat : true + }, s); + + t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, { + base_uri : tinyMCE.baseURI + }); + + t.baseURI = tinymce.baseURI; + + t.contentCSS = []; + + // Call setup + t.execCallback('setup', t); + }, + + render : function(nst) { + var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader; + + // Page is not loaded yet, wait for it + if (!Event.domLoaded) { + Event.add(document, 'init', function() { + t.render(); + }); + return; + } + + tinyMCE.settings = s; + + // Element not found, then skip initialization + if (!t.getElement()) + return; + + // Is a iPad/iPhone, then skip initialization. We need to sniff here since the + // browser says it has contentEditable support but there is no visible caret + // We will remove this check ones Apple implements full contentEditable support + if (tinymce.isIDevice) + return; + + // Add hidden input for non input elements inside form elements + if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form')) + DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id); + + if (tinymce.WindowManager) + t.windowManager = new tinymce.WindowManager(t); + + if (s.encoding == 'xml') { + t.onGetContent.add(function(ed, o) { + if (o.save) + o.content = DOM.encode(o.content); + }); + } + + if (s.add_form_submit_trigger) { + t.onSubmit.addToTop(function() { + if (t.initialized) { + t.save(); + t.isNotDirty = 1; + } + }); + } + + if (s.add_unload_trigger) { + t._beforeUnload = tinyMCE.onBeforeUnload.add(function() { + if (t.initialized && !t.destroyed && !t.isHidden()) + t.save({format : 'raw', no_events : true}); + }); + } + + tinymce.addUnload(t.destroy, t); + + if (s.submit_patch) { + t.onBeforeRenderUI.add(function() { + var n = t.getElement().form; + + if (!n) + return; + + // Already patched + if (n._mceOldSubmit) + return; + + // Check page uses id="submit" or name="submit" for it's submit button + if (!n.submit.nodeType && !n.submit.length) { + t.formElement = n; + n._mceOldSubmit = n.submit; + n.submit = function() { + // Save all instances + tinymce.triggerSave(); + t.isNotDirty = 1; + + return t.formElement._mceOldSubmit(t.formElement); + }; + } + + n = null; + }); + } + + // Load scripts + function loadScripts() { + if (s.language && s.language_load !== false) + sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); + + if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme]) + ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); + + each(explode(s.plugins), function(p) { + if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) { + // Skip safari plugin, since it is removed as of 3.3b1 + if (p == 'safari') + return; + + PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js'); + } + }); + + // Init when que is loaded + sl.loadQueue(function() { + if (!t.removed) + t.init(); + }); + }; + + loadScripts(); + }, + + init : function() { + var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re, i; + + tinymce.add(t); + + s.aria_label = s.aria_label || DOM.getAttrib(e, 'aria-label', t.getLang('aria.rich_text_area')); + + if (s.theme) { + s.theme = s.theme.replace(/-/, ''); + o = ThemeManager.get(s.theme); + t.theme = new o(); + + if (t.theme.init && s.init_theme) + t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, '')); + } + + // Create all plugins + each(explode(s.plugins.replace(/\-/g, '')), function(p) { + var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po; + + if (c) { + po = new c(t, u); + + t.plugins[p] = po; + + if (po.init) + po.init(t, u); + } + }); + + // Setup popup CSS path(s) + if (s.popup_css !== false) { + if (s.popup_css) + s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css); + else + s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css"); + } + + if (s.popup_css_add) + s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add); + + t.controlManager = new tinymce.ControlManager(t); + + if (s.custom_undo_redo) { + t.onBeforeExecCommand.add(function(ed, cmd, ui, val, a) { + if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) + t.undoManager.beforeChange(); + }); + + t.onExecCommand.add(function(ed, cmd, ui, val, a) { + if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) + t.undoManager.add(); + }); + } + + t.onExecCommand.add(function(ed, c) { + // Don't refresh the select lists until caret move + if (!/^(FontName|FontSize)$/.test(c)) + t.nodeChanged(); + }); + + // Remove ghost selections on images and tables in Gecko + if (isGecko) { + function repaint(a, o) { + if (!o || !o.initial) + t.execCommand('mceRepaint'); + }; + + t.onUndo.add(repaint); + t.onRedo.add(repaint); + t.onSetContent.add(repaint); + } + + // Enables users to override the control factory + t.onBeforeRenderUI.dispatch(t, t.controlManager); + + // Measure box + if (s.render_ui) { + w = s.width || e.style.width || e.offsetWidth; + h = s.height || e.style.height || e.offsetHeight; + t.orgDisplay = e.style.display; + re = /^[0-9\.]+(|px)$/i; + + if (re.test('' + w)) + w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100); + + if (re.test('' + h)) + h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100); + + // Render UI + o = t.theme.renderUI({ + targetNode : e, + width : w, + height : h, + deltaWidth : s.delta_width, + deltaHeight : s.delta_height + }); + + t.editorContainer = o.editorContainer; + } + + + // User specified a document.domain value + if (document.domain && location.hostname != document.domain) + tinymce.relaxedDomain = document.domain; + + // Resize editor + DOM.setStyles(o.sizeContainer || o.editorContainer, { + width : w, + height : h + }); + + // Load specified content CSS last + if (s.content_css) { + tinymce.each(explode(s.content_css), function(u) { + t.contentCSS.push(t.documentBaseURI.toAbsolute(u)); + }); + } + + h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (o.deltaHeight || 0) : ''); + if (h < 100) + h = 100; + + t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml">'; + + // We only need to override paths if we have to + // IE has a bug where it remove site absolute urls to relative ones if this is specified + if (s.document_base_url != tinymce.documentBaseURL) + t.iframeHTML += '<base href="' + t.documentBaseURI.getURI() + '" />'; + + // IE8 doesn't support carets behind images setting ie7_compat would force IE8+ to run in IE7 compat mode. + if (s.ie7_compat) + t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=7" />'; + else + t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=edge" />'; + + t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; + + // Firefox 2 doesn't load stylesheets correctly this way + if (!isGecko || !/Firefox\/2/.test(navigator.userAgent)) { + for (i = 0; i < t.contentCSS.length; i++) + t.iframeHTML += '<link type="text/css" rel="stylesheet" href="' + t.contentCSS[i] + '" />'; + + t.contentCSS = []; + } + + bi = s.body_id || 'tinymce'; + if (bi.indexOf('=') != -1) { + bi = t.getParam('body_id', '', 'hash'); + bi = bi[t.id] || bi; + } + + bc = s.body_class || ''; + if (bc.indexOf('=') != -1) { + bc = t.getParam('body_class', '', 'hash'); + bc = bc[t.id] || ''; + } + + t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>'; + + // Domain relaxing enabled, then set document domain + if (tinymce.relaxedDomain && (isIE || (tinymce.isOpera && parseFloat(opera.version()) < 11))) { + // We need to write the contents here in IE since multiple writes messes up refresh button and back button + u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; + } + + // Create iframe + // TODO: ACC add the appropriate description on this. + n = DOM.add(o.iframeContainer, 'iframe', { + id : t.id + "_ifr", + src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 + frameBorder : '0', + title : s.aria_label, + style : { + width : '100%', + height : h + } + }); + + t.contentAreaContainer = o.iframeContainer; + DOM.get(o.editorContainer).style.display = t.orgDisplay; + DOM.get(t.id).style.display = 'none'; + DOM.setAttrib(t.id, 'aria-hidden', true); + + if (!tinymce.relaxedDomain || !u) + t.setupIframe(); + + e = n = o = null; // Cleanup + }, + + setupIframe : function() { + var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; + + // Setup iframe body + if (!isIE || !tinymce.relaxedDomain) { + d.open(); + d.write(t.iframeHTML); + d.close(); + + if (tinymce.relaxedDomain) + d.domain = tinymce.relaxedDomain; + } + + // Design mode needs to be added here Ctrl+A will fail otherwise + if (!isIE) { + try { + if (!s.readonly) + d.designMode = 'On'; + } catch (ex) { + // Will fail on Gecko if the editor is placed in an hidden container element + // The design mode will be set ones the editor is focused + } + } + + // IE needs to use contentEditable or it will display non secure items for HTTPS + if (isIE) { + // It will not steal focus if we hide it while setting contentEditable + b = t.getBody(); + DOM.hide(b); + + if (!s.readonly) + b.contentEditable = true; + + DOM.show(b); + } + + t.schema = new tinymce.html.Schema(s); + + t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { + keep_values : true, + url_converter : t.convertURL, + url_converter_scope : t, + hex_colors : s.force_hex_style_colors, + class_filter : s.class_filter, + update_styles : 1, + fix_ie_paragraphs : 1, + schema : t.schema + }); + + t.parser = new tinymce.html.DomParser(s, t.schema); + + // Force anchor names closed + t.parser.addAttributeFilter('name', function(nodes, name) { + var i = nodes.length, sibling, prevSibling, parent, node; + + while (i--) { + node = nodes[i]; + if (node.name === 'a' && node.firstChild) { + parent = node.parent; + + // Move children after current node + sibling = node.lastChild; + do { + prevSibling = sibling.prev; + parent.insert(sibling, node); + sibling = prevSibling; + } while (sibling); + } + } + }); + + // Convert src and href into data-mce-src, data-mce-href and data-mce-style + t.parser.addAttributeFilter('src,href,style', function(nodes, name) { + var i = nodes.length, node, dom = t.dom, value; + + while (i--) { + node = nodes[i]; + value = node.attr(name); + + if (name === "style") + node.attr('data-mce-style', dom.serializeStyle(dom.parseStyle(value), node.name)); + else + node.attr('data-mce-' + name, t.convertURL(value, name, node.name)); + } + }); + + // Keep scripts from executing + t.parser.addNodeFilter('script', function(nodes, name) { + var i = nodes.length; + + while (i--) + nodes[i].attr('type', 'mce-text/javascript'); + }); + + t.parser.addNodeFilter('#cdata', function(nodes, name) { + var i = nodes.length, node; + + while (i--) { + node = nodes[i]; + node.type = 8; + node.name = '#comment'; + node.value = '[CDATA[' + node.value + ']]'; + } + }); + + t.parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function(nodes, name) { + var i = nodes.length, node, nonEmptyElements = t.schema.getNonEmptyElements(); + + while (i--) { + node = nodes[i]; + + if (node.isEmpty(nonEmptyElements)) + node.empty().append(new tinymce.html.Node('br', 1)).shortEnded = true; + } + }); + + t.serializer = new tinymce.dom.Serializer(s, t.dom, t.schema); + + t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); + + t.formatter = new tinymce.Formatter(this); + + // Register default formats + t.formatter.register({ + alignleft : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, + {selector : 'img,table', collapsed : false, styles : {'float' : 'left'}} + ], + + aligncenter : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, + {selector : 'img', collapsed : false, styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, + {selector : 'table', collapsed : false, styles : {marginLeft : 'auto', marginRight : 'auto'}} + ], + + alignright : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, + {selector : 'img,table', collapsed : false, styles : {'float' : 'right'}} + ], + + alignfull : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}} + ], + + bold : [ + {inline : 'strong', remove : 'all'}, + {inline : 'span', styles : {fontWeight : 'bold'}}, + {inline : 'b', remove : 'all'} + ], + + italic : [ + {inline : 'em', remove : 'all'}, + {inline : 'span', styles : {fontStyle : 'italic'}}, + {inline : 'i', remove : 'all'} + ], + + underline : [ + {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, + {inline : 'u', remove : 'all'} + ], + + strikethrough : [ + {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, + {inline : 'strike', remove : 'all'} + ], + + forecolor : {inline : 'span', styles : {color : '%value'}, wrap_links : false}, + hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}, wrap_links : false}, + fontname : {inline : 'span', styles : {fontFamily : '%value'}}, + fontsize : {inline : 'span', styles : {fontSize : '%value'}}, + fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, + blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, + subscript : {inline : 'sub'}, + superscript : {inline : 'sup'}, + + removeformat : [ + {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, + {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, + {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} + ] + }); + + // Register default block formats + each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { + t.formatter.register(name, {block : name, remove : 'all'}); + }); + + // Register user defined formats + t.formatter.register(t.settings.formats); + + t.undoManager = new tinymce.UndoManager(t); + + // Pass through + t.undoManager.onAdd.add(function(um, l) { + if (um.hasUndo()) + return t.onChange.dispatch(t, l, um); + }); + + t.undoManager.onUndo.add(function(um, l) { + return t.onUndo.dispatch(t, l, um); + }); + + t.undoManager.onRedo.add(function(um, l) { + return t.onRedo.dispatch(t, l, um); + }); + + t.forceBlocks = new tinymce.ForceBlocks(t, { + forced_root_block : s.forced_root_block + }); + + t.editorCommands = new tinymce.EditorCommands(t); + + // Pass through + t.serializer.onPreProcess.add(function(se, o) { + return t.onPreProcess.dispatch(t, o, se); + }); + + t.serializer.onPostProcess.add(function(se, o) { + return t.onPostProcess.dispatch(t, o, se); + }); + + t.onPreInit.dispatch(t); + + if (!s.gecko_spellcheck) + t.getBody().spellcheck = 0; + + if (!s.readonly) + t._addEvents(); + + t.controlManager.onPostRender.dispatch(t, t.controlManager); + t.onPostRender.dispatch(t); + + if (s.directionality) + t.getBody().dir = s.directionality; + + if (s.nowrap) + t.getBody().style.whiteSpace = "nowrap"; + + if (s.handle_node_change_callback) { + t.onNodeChange.add(function(ed, cm, n) { + t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); + }); + } + + if (s.save_callback) { + t.onSaveContent.add(function(ed, o) { + var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); + + if (h) + o.content = h; + }); + } + + if (s.onchange_callback) { + t.onChange.add(function(ed, l) { + t.execCallback('onchange_callback', t, l); + }); + } + + if (s.protect) { + t.onBeforeSetContent.add(function(ed, o) { + if (s.protect) { + each(s.protect, function(pattern) { + o.content = o.content.replace(pattern, function(str) { + return '<!--mce:protected ' + escape(str) + '-->'; + }); + }); + } + }); + } + + if (s.convert_newlines_to_brs) { + t.onBeforeSetContent.add(function(ed, o) { + if (o.initial) + o.content = o.content.replace(/\r?\n/g, '<br />'); + }); + } + + if (s.preformatted) { + t.onPostProcess.add(function(ed, o) { + o.content = o.content.replace(/^\s*<pre.*?>/, ''); + o.content = o.content.replace(/<\/pre>\s*$/, ''); + + if (o.set) + o.content = '<pre class="mceItemHidden">' + o.content + '</pre>'; + }); + } + + if (s.verify_css_classes) { + t.serializer.attribValueFilter = function(n, v) { + var s, cl; + + if (n == 'class') { + // Build regexp for classes + if (!t.classesRE) { + cl = t.dom.getClasses(); + + if (cl.length > 0) { + s = ''; + + each (cl, function(o) { + s += (s ? '|' : '') + o['class']; + }); + + t.classesRE = new RegExp('(' + s + ')', 'gi'); + } + } + + return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; + } + + return v; + }; + } + + if (s.cleanup_callback) { + t.onBeforeSetContent.add(function(ed, o) { + o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); + }); + + t.onPreProcess.add(function(ed, o) { + if (o.set) + t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); + + if (o.get) + t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); + }); + + t.onPostProcess.add(function(ed, o) { + if (o.set) + o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); + + if (o.get) + o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); + }); + } + + if (s.save_callback) { + t.onGetContent.add(function(ed, o) { + if (o.save) + o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); + }); + } + + if (s.handle_event_callback) { + t.onEvent.add(function(ed, e, o) { + if (t.execCallback('handle_event_callback', e, ed, o) === false) + Event.cancel(e); + }); + } + + // Add visual aids when new contents is added + t.onSetContent.add(function() { + t.addVisual(t.getBody()); + }); + + // Remove empty contents + if (s.padd_empty_editor) { + t.onPostProcess.add(function(ed, o) { + o.content = o.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, ''); + }); + } + + if (isGecko) { + // Fix gecko link bug, when a link is placed at the end of block elements there is + // no way to move the caret behind the link. This fix adds a bogus br element after the link + function fixLinks(ed, o) { + each(ed.dom.select('a'), function(n) { + var pn = n.parentNode; + + if (ed.dom.isBlock(pn) && pn.lastChild === n) + ed.dom.add(pn, 'br', {'data-mce-bogus' : 1}); + }); + }; + + t.onExecCommand.add(function(ed, cmd) { + if (cmd === 'CreateLink') + fixLinks(ed); + }); + + t.onSetContent.add(t.selection.onSetContent.add(fixLinks)); + + if (!s.readonly) { + try { + // Design mode must be set here once again to fix a bug where + // Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again + d.designMode = 'Off'; + d.designMode = 'On'; + } catch (ex) { + // Will fail on Gecko if the editor is placed in an hidden container element + // The design mode will be set ones the editor is focused + } + } + } + + // A small timeout was needed since firefox will remove. Bug: #1838304 + setTimeout(function () { + if (t.removed) + return; + + t.load({initial : true, format : 'html'}); + t.startContent = t.getContent({format : 'raw'}); + t.undoManager.add(); + t.initialized = true; + + t.onInit.dispatch(t); + t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); + t.execCallback('init_instance_callback', t); + t.focus(true); + t.nodeChanged({initial : 1}); + + // Load specified content CSS last + each(t.contentCSS, function(u) { + t.dom.loadCSS(u); + }); + + // Handle auto focus + if (s.auto_focus) { + setTimeout(function () { + var ed = tinymce.get(s.auto_focus); + + ed.selection.select(ed.getBody(), 1); + ed.selection.collapse(1); + ed.getWin().focus(); + }, 100); + } + }, 1); + + e = null; + }, + + + focus : function(sf) { + var oed, t = this, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc(); + + if (!sf) { + // Get selected control element + ieRng = t.selection.getRng(); + if (ieRng.item) { + controlElm = ieRng.item(0); + } + + // Is not content editable + if (!ce) + t.getWin().focus(); + + // Restore selected control element + // This is needed when for example an image is selected within a + // layer a call to focus will then remove the control selection + if (controlElm && controlElm.ownerDocument == doc) { + ieRng = doc.body.createControlRange(); + ieRng.addElement(controlElm); + ieRng.select(); + } + + } + + if (tinymce.activeEditor != t) { + if ((oed = tinymce.activeEditor) != null) + oed.onDeactivate.dispatch(oed, t); + + t.onActivate.dispatch(t, oed); + } + + tinymce._setActive(t); + }, + + execCallback : function(n) { + var t = this, f = t.settings[n], s; + + if (!f) + return; + + // Look through lookup + if (t.callbackLookup && (s = t.callbackLookup[n])) { + f = s.func; + s = s.scope; + } + + if (is(f, 'string')) { + s = f.replace(/\.\w+$/, ''); + s = s ? tinymce.resolve(s) : 0; + f = tinymce.resolve(f); + t.callbackLookup = t.callbackLookup || {}; + t.callbackLookup[n] = {func : f, scope : s}; + } + + return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); + }, + + translate : function(s) { + var c = this.settings.language || 'en', i18n = tinymce.i18n; + + if (!s) + return ''; + + return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { + return i18n[c + '.' + b] || '{#' + b + '}'; + }); + }, + + getLang : function(n, dv) { + return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); + }, + + getParam : function(n, dv, ty) { + var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; + + if (ty === 'hash') { + o = {}; + + if (is(v, 'string')) { + each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { + v = v.split('='); + + if (v.length > 1) + o[tr(v[0])] = tr(v[1]); + else + o[tr(v[0])] = tr(v); + }); + } else + o = v; + + return o; + } + + return v; + }, + + nodeChanged : function(o) { + var t = this, s = t.selection, n = s.getStart() || t.getBody(); + + // Fix for bug #1896577 it seems that this can not be fired while the editor is loading + if (t.initialized) { + o = o || {}; + n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state + + // Get parents and add them to object + o.parents = []; + t.dom.getParent(n, function(node) { + if (node.nodeName == 'BODY') + return true; + + o.parents.push(node); + }); + + t.onNodeChange.dispatch( + t, + o ? o.controlManager || t.controlManager : t.controlManager, + n, + s.isCollapsed(), + o + ); + } + }, + + addButton : function(n, s) { + var t = this; + + t.buttons = t.buttons || {}; + t.buttons[n] = s; + }, + + addCommand : function(name, callback, scope) { + this.execCommands[name] = {func : callback, scope : scope || this}; + }, + + addQueryStateHandler : function(name, callback, scope) { + this.queryStateCommands[name] = {func : callback, scope : scope || this}; + }, + + addQueryValueHandler : function(name, callback, scope) { + this.queryValueCommands[name] = {func : callback, scope : scope || this}; + }, + + addShortcut : function(pa, desc, cmd_func, sc) { + var t = this, c; + + if (!t.settings.custom_shortcuts) + return false; + + t.shortcuts = t.shortcuts || {}; + + if (is(cmd_func, 'string')) { + c = cmd_func; + + cmd_func = function() { + t.execCommand(c, false, null); + }; + } + + if (is(cmd_func, 'object')) { + c = cmd_func; + + cmd_func = function() { + t.execCommand(c[0], c[1], c[2]); + }; + } + + each(explode(pa), function(pa) { + var o = { + func : cmd_func, + scope : sc || this, + desc : desc, + alt : false, + ctrl : false, + shift : false + }; + + each(explode(pa, '+'), function(v) { + switch (v) { + case 'alt': + case 'ctrl': + case 'shift': + o[v] = true; + break; + + default: + o.charCode = v.charCodeAt(0); + o.keyCode = v.toUpperCase().charCodeAt(0); + } + }); + + t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; + }); + + return true; + }, + + execCommand : function(cmd, ui, val, a) { + var t = this, s = 0, o, st; + + if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) + t.focus(); + + o = {}; + t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); + if (o.terminate) + return false; + + // Command callback + if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Registred commands + if (o = t.execCommands[cmd]) { + st = o.func.call(o.scope, ui, val); + + // Fall through on true + if (st !== true) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return st; + } + } + + // Plugin commands + each(t.plugins, function(p) { + if (p.execCommand && p.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + s = 1; + return false; + } + }); + + if (s) + return true; + + // Theme commands + if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Editor commands + if (t.editorCommands.execCommand(cmd, ui, val)) { + t.onExecCommand.dispatch(t, cmd, ui, val, a); + return true; + } + + // Browser commands + t.getDoc().execCommand(cmd, ui, val); + t.onExecCommand.dispatch(t, cmd, ui, val, a); + }, + + queryCommandState : function(cmd) { + var t = this, o, s; + + // Is hidden then return undefined + if (t._isHidden()) + return; + + // Registred commands + if (o = t.queryStateCommands[cmd]) { + s = o.func.call(o.scope); + + // Fall though on true + if (s !== true) + return s; + } + + // Registred commands + o = t.editorCommands.queryCommandState(cmd); + if (o !== -1) + return o; + + // Browser commands + try { + return this.getDoc().queryCommandState(cmd); + } catch (ex) { + // Fails sometimes see bug: 1896577 + } + }, + + queryCommandValue : function(c) { + var t = this, o, s; + + // Is hidden then return undefined + if (t._isHidden()) + return; + + // Registred commands + if (o = t.queryValueCommands[c]) { + s = o.func.call(o.scope); + + // Fall though on true + if (s !== true) + return s; + } + + // Registred commands + o = t.editorCommands.queryCommandValue(c); + if (is(o)) + return o; + + // Browser commands + try { + return this.getDoc().queryCommandValue(c); + } catch (ex) { + // Fails sometimes see bug: 1896577 + } + }, + + show : function() { + var t = this; + + DOM.show(t.getContainer()); + DOM.hide(t.id); + t.load(); + }, + + hide : function() { + var t = this, d = t.getDoc(); + + // Fixed bug where IE has a blinking cursor left from the editor + if (isIE && d) + d.execCommand('SelectAll'); + + // We must save before we hide so Safari doesn't crash + t.save(); + DOM.hide(t.getContainer()); + DOM.setStyle(t.id, 'display', t.orgDisplay); + }, + + isHidden : function() { + return !DOM.isHidden(this.id); + }, + + setProgressState : function(b, ti, o) { + this.onSetProgressState.dispatch(this, b, ti, o); + + return b; + }, + + load : function(o) { + var t = this, e = t.getElement(), h; + + if (e) { + o = o || {}; + o.load = true; + + // Double encode existing entities in the value + h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); + o.element = e; + + if (!o.no_events) + t.onLoadContent.dispatch(t, o); + + o.element = e = null; + + return h; + } + }, + + save : function(o) { + var t = this, e = t.getElement(), h, f; + + if (!e || !t.initialized) + return; + + o = o || {}; + o.save = true; + + // Add undo level will trigger onchange event + if (!o.no_events) { + t.undoManager.typing = false; + t.undoManager.add(); + } + + o.element = e; + h = o.content = t.getContent(o); + + if (!o.no_events) + t.onSaveContent.dispatch(t, o); + + h = o.content; + + if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { + e.innerHTML = h; + + // Update hidden form element + if (f = DOM.getParent(t.id, 'form')) { + each(f.elements, function(e) { + if (e.name == t.id) { + e.value = h; + return false; + } + }); + } + } else + e.value = h; + + o.element = e = null; + + return h; + }, + + setContent : function(content, args) { + var self = this, rootNode, body = self.getBody(); + + // Setup args object + args = args || {}; + args.format = args.format || 'html'; + args.set = true; + args.content = content; + + // Do preprocessing + if (!args.no_events) + self.onBeforeSetContent.dispatch(self, args); + + content = args.content; + + // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content + // It will also be impossible to place the caret in the editor unless there is a BR element present + if (!tinymce.isIE && (content.length === 0 || /^\s+$/.test(content))) { + body.innerHTML = '<br data-mce-bogus="1" />'; + return; + } + + // Parse and serialize the html + if (args.format !== 'raw') { + content = new tinymce.html.Serializer({}, self.schema).serialize( + self.parser.parse(content) + ); + } + + // Set the new cleaned contents to the editor + args.content = tinymce.trim(content); + self.dom.setHTML(body, args.content); + + // Do post processing + if (!args.no_events) + self.onSetContent.dispatch(self, args); + + return args.content; + }, + + getContent : function(args) { + var self = this, content; + + // Setup args object + args = args || {}; + args.format = args.format || 'html'; + args.get = true; + + // Do preprocessing + if (!args.no_events) + self.onBeforeGetContent.dispatch(self, args); + + // Get raw contents or by default the cleaned contents + if (args.format == 'raw') + content = self.getBody().innerHTML; + else + content = self.serializer.serialize(self.getBody(), args); + + args.content = tinymce.trim(content); + + // Do post processing + if (!args.no_events) + self.onGetContent.dispatch(self, args); + + return args.content; + }, + + isDirty : function() { + var self = this; + + return tinymce.trim(self.startContent) != tinymce.trim(self.getContent({format : 'raw', no_events : 1})) && !self.isNotDirty; + }, + + getContainer : function() { + var t = this; + + if (!t.container) + t.container = DOM.get(t.editorContainer || t.id + '_parent'); + + return t.container; + }, + + getContentAreaContainer : function() { + return this.contentAreaContainer; + }, + + getElement : function() { + return DOM.get(this.settings.content_element || this.id); + }, + + getWin : function() { + var t = this, e; + + if (!t.contentWindow) { + e = DOM.get(t.id + "_ifr"); + + if (e) + t.contentWindow = e.contentWindow; + } + + return t.contentWindow; + }, + + getDoc : function() { + var t = this, w; + + if (!t.contentDocument) { + w = t.getWin(); + + if (w) + t.contentDocument = w.document; + } + + return t.contentDocument; + }, + + getBody : function() { + return this.bodyElement || this.getDoc().body; + }, + + convertURL : function(u, n, e) { + var t = this, s = t.settings; + + // Use callback instead + if (s.urlconverter_callback) + return t.execCallback('urlconverter_callback', u, e, true, n); + + // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs + if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0) + return u; + + // Convert to relative + if (s.relative_urls) + return t.documentBaseURI.toRelative(u); + + // Convert to absolute + u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); + + return u; + }, + + addVisual : function(e) { + var t = this, s = t.settings; + + e = e || t.getBody(); + + if (!is(t.hasVisual)) + t.hasVisual = s.visual; + + each(t.dom.select('table,a', e), function(e) { + var v; + + switch (e.nodeName) { + case 'TABLE': + v = t.dom.getAttrib(e, 'border'); + + if (!v || v == '0') { + if (t.hasVisual) + t.dom.addClass(e, s.visual_table_class); + else + t.dom.removeClass(e, s.visual_table_class); + } + + return; + + case 'A': + v = t.dom.getAttrib(e, 'name'); + + if (v) { + if (t.hasVisual) + t.dom.addClass(e, 'mceItemAnchor'); + else + t.dom.removeClass(e, 'mceItemAnchor'); + } + + return; + } + }); + + t.onVisualAid.dispatch(t, e, t.hasVisual); + }, + + remove : function() { + var t = this, e = t.getContainer(); + + t.removed = 1; // Cancels post remove event execution + t.hide(); + + t.execCallback('remove_instance_callback', t); + t.onRemove.dispatch(t); + + // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command + t.onExecCommand.listeners = []; + + tinymce.remove(t); + DOM.remove(e); + }, + + destroy : function(s) { + var t = this; + + // One time is enough + if (t.destroyed) + return; + + if (!s) { + tinymce.removeUnload(t.destroy); + tinyMCE.onBeforeUnload.remove(t._beforeUnload); + + // Manual destroy + if (t.theme && t.theme.destroy) + t.theme.destroy(); + + // Destroy controls, selection and dom + t.controlManager.destroy(); + t.selection.destroy(); + t.dom.destroy(); + + // Remove all events + + // Don't clear the window or document if content editable + // is enabled since other instances might still be present + if (!t.settings.content_editable) { + Event.clear(t.getWin()); + Event.clear(t.getDoc()); + } + + Event.clear(t.getBody()); + Event.clear(t.formElement); + } + + if (t.formElement) { + t.formElement.submit = t.formElement._mceOldSubmit; + t.formElement._mceOldSubmit = null; + } + + t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; + + if (t.selection) + t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; + + t.destroyed = 1; + }, + + // Internal functions + + _addEvents : function() { + // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset + var t = this, i, s = t.settings, dom = t.dom, lo = { + mouseup : 'onMouseUp', + mousedown : 'onMouseDown', + click : 'onClick', + keyup : 'onKeyUp', + keydown : 'onKeyDown', + keypress : 'onKeyPress', + submit : 'onSubmit', + reset : 'onReset', + contextmenu : 'onContextMenu', + dblclick : 'onDblClick', + paste : 'onPaste' // Doesn't work in all browsers yet + }; + + function eventHandler(e, o) { + var ty = e.type; + + // Don't fire events when it's removed + if (t.removed) + return; + + // Generic event handler + if (t.onEvent.dispatch(t, e, o) !== false) { + // Specific event handler + t[lo[e.fakeType || e.type]].dispatch(t, e, o); + } + }; + + // Add DOM events + each(lo, function(v, k) { + switch (k) { + case 'contextmenu': + dom.bind(t.getDoc(), k, eventHandler); + break; + + case 'paste': + dom.bind(t.getBody(), k, function(e) { + eventHandler(e); + }); + break; + + case 'submit': + case 'reset': + dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); + break; + + default: + dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); + } + }); + + dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { + t.focus(true); + }); + + + // Fixes bug where a specified document_base_uri could result in broken images + // This will also fix drag drop of images in Gecko + if (tinymce.isGecko) { + dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { + var v; + + e = e.target; + + if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('data-mce-src'))) + e.src = t.documentBaseURI.toAbsolute(v); + }); + } + + // Set various midas options in Gecko + if (isGecko) { + function setOpts() { + var t = this, d = t.getDoc(), s = t.settings; + + if (isGecko && !s.readonly) { + if (t._isHidden()) { + try { + if (!s.content_editable) + d.designMode = 'On'; + } catch (ex) { + // Fails if it's hidden + } + } + + try { + // Try new Gecko method + d.execCommand("styleWithCSS", 0, false); + } catch (ex) { + // Use old method + if (!t._isHidden()) + try {d.execCommand("useCSS", 0, true);} catch (ex) {} + } + + if (!s.table_inline_editing) + try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} + + if (!s.object_resizing) + try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} + } + }; + + t.onBeforeExecCommand.add(setOpts); + t.onMouseDown.add(setOpts); + } + + // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 + // WebKit can't even do simple things like selecting an image + // This also fixes so it's possible to select mceItemAnchors + if (tinymce.isWebKit) { + t.onClick.add(function(ed, e) { + e = e.target; + + // Needs tobe the setBaseAndExtend or it will fail to select floated images + if (e.nodeName == 'IMG' || (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor'))) { + t.selection.getSel().setBaseAndExtent(e, 0, e, 1); + t.nodeChanged(); + } + }); + } + + // Add node change handlers + t.onMouseUp.add(t.nodeChanged); + //t.onClick.add(t.nodeChanged); + t.onKeyUp.add(function(ed, e) { + var c = e.keyCode; + + if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey) + t.nodeChanged(); + }); + + // Add reset handler + t.onReset.add(function() { + t.setContent(t.startContent, {format : 'raw'}); + }); + + // Add shortcuts + if (s.custom_shortcuts) { + if (s.custom_undo_redo_keyboard_shortcuts) { + t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); + t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); + } + + // Add default shortcuts for gecko + t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); + t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); + t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); + + // BlockFormat shortcuts keys + for (i=1; i<=6; i++) + t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); + + t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']); + t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']); + t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']); + + function find(e) { + var v = null; + + if (!e.altKey && !e.ctrlKey && !e.metaKey) + return v; + + each(t.shortcuts, function(o) { + if (tinymce.isMac && o.ctrl != e.metaKey) + return; + else if (!tinymce.isMac && o.ctrl != e.ctrlKey) + return; + + if (o.alt != e.altKey) + return; + + if (o.shift != e.shiftKey) + return; + + if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { + v = o; + return false; + } + }); + + return v; + }; + + t.onKeyUp.add(function(ed, e) { + var o = find(e); + + if (o) + return Event.cancel(e); + }); + + t.onKeyPress.add(function(ed, e) { + var o = find(e); + + if (o) + return Event.cancel(e); + }); + + t.onKeyDown.add(function(ed, e) { + var o = find(e); + + if (o) { + o.func.call(o.scope); + return Event.cancel(e); + } + }); + } + + if (tinymce.isIE) { + // Fix so resize will only update the width and height attributes not the styles of an image + // It will also block mceItemNoResize items + dom.bind(t.getDoc(), 'controlselect', function(e) { + var re = t.resizeInfo, cb; + + e = e.target; + + // Don't do this action for non image elements + if (e.nodeName !== 'IMG') + return; + + if (re) + dom.unbind(re.node, re.ev, re.cb); + + if (!dom.hasClass(e, 'mceItemNoResize')) { + ev = 'resizeend'; + cb = dom.bind(e, ev, function(e) { + var v; + + e = e.target; + + if (v = dom.getStyle(e, 'width')) { + dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); + dom.setStyle(e, 'width', ''); + } + + if (v = dom.getStyle(e, 'height')) { + dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); + dom.setStyle(e, 'height', ''); + } + }); + } else { + ev = 'resizestart'; + cb = dom.bind(e, 'resizestart', Event.cancel, Event); + } + + re = t.resizeInfo = { + node : e, + ev : ev, + cb : cb + }; + }); + + t.onKeyDown.add(function(ed, e) { + var sel; + + switch (e.keyCode) { + case 8: + sel = t.getDoc().selection; + + // Fix IE control + backspace browser bug + if (sel.createRange && sel.createRange().item) { + ed.dom.remove(sel.createRange().item(0)); + return Event.cancel(e); + } + } + }); + } + + if (tinymce.isOpera) { + t.onClick.add(function(ed, e) { + Event.prevent(e); + }); + } + + // Add custom undo/redo handlers + if (s.custom_undo_redo) { + function addUndo() { + t.undoManager.typing = false; + t.undoManager.add(); + }; + + dom.bind(t.getDoc(), 'focusout', function(e) { + if (!t.removed && t.undoManager.typing) + addUndo(); + }); + + // Add undo level when contents is drag/dropped within the editor + t.dom.bind(t.dom.getRoot(), 'dragend', function(e) { + addUndo(); + }); + + t.onKeyUp.add(function(ed, e) { + var rng, parent, bookmark; + + // Fix for bug #3168, to remove odd ".." nodes from the DOM we need to get/set the HTML of the parent node. + if (isIE && e.keyCode == 8) { + rng = t.selection.getRng(); + if (rng.parentElement) { + parent = rng.parentElement(); + bookmark = t.selection.getBookmark(); + parent.innerHTML = parent.innerHTML; + t.selection.moveToBookmark(bookmark); + } + } + + if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) + addUndo(); + }); + + t.onKeyDown.add(function(ed, e) { + var rng, parent, bookmark, keyCode = e.keyCode; + + // IE has a really odd bug where the DOM might include an node that doesn't have + // a proper structure. If you try to access nodeValue it would throw an illegal value exception. + // This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element + // after you delete contents from it. See: #3008923 + if (isIE && keyCode == 46) { + rng = t.selection.getRng(); + + if (rng.parentElement) { + parent = rng.parentElement(); + + if (!t.undoManager.typing) { + t.undoManager.beforeChange(); + t.undoManager.typing = true; + t.undoManager.add(); + } + + // Select next word when ctrl key is used in combo with delete + if (e.ctrlKey) { + rng.moveEnd('word', 1); + rng.select(); + } + + // Delete contents + t.selection.getSel().clear(); + + // Check if we are within the same parent + if (rng.parentElement() == parent) { + bookmark = t.selection.getBookmark(); + + try { + // Update the HTML and hopefully it will remove the artifacts + parent.innerHTML = parent.innerHTML; + } catch (ex) { + // And since it's IE it can sometimes produce an unknown runtime error + } + + // Restore the caret position + t.selection.moveToBookmark(bookmark); + } + + // Block the default delete behavior since it might be broken + e.preventDefault(); + return; + } + } + + // Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter + if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45) { + // Add position before enter key is pressed, used by IE since it still uses the default browser behavior + // Todo: Remove this once we normalize enter behavior on IE + if (tinymce.isIE && keyCode == 13) + t.undoManager.beforeChange(); + + if (t.undoManager.typing) + addUndo(); + + return; + } + + // If key isn't shift,ctrl,alt,capslock,metakey + if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !t.undoManager.typing) { + t.undoManager.beforeChange(); + t.undoManager.add(); + t.undoManager.typing = true; + } + }); + + t.onMouseDown.add(function() { + if (t.undoManager.typing) + addUndo(); + }); + } + + // Bug fix for FireFox keeping styles from end of selection instead of start. + if (tinymce.isGecko) { + function getAttributeApplyFunction() { + var template = t.dom.getAttribs(t.selection.getStart().cloneNode(false)); + + return function() { + var target = t.selection.getStart(); + t.dom.removeAllAttribs(target); + each(template, function(attr) { + target.setAttributeNode(attr.cloneNode(true)); + }); + }; + } + + function isSelectionAcrossElements() { + var s = t.selection; + + return !s.isCollapsed() && s.getStart() != s.getEnd(); + } + + t.onKeyPress.add(function(ed, e) { + var applyAttributes; + + if ((e.keyCode == 8 || e.keyCode == 46) && isSelectionAcrossElements()) { + applyAttributes = getAttributeApplyFunction(); + t.getDoc().execCommand('delete', false, null); + applyAttributes(); + + return Event.cancel(e); + } + }); + + t.dom.bind(t.getDoc(), 'cut', function(e) { + var applyAttributes; + + if (isSelectionAcrossElements()) { + applyAttributes = getAttributeApplyFunction(); + t.onKeyUp.addToTop(Event.cancel, Event); + + setTimeout(function() { + applyAttributes(); + t.onKeyUp.remove(Event.cancel, Event); + }, 0); + } + }); + } + }, + + _isHidden : function() { + var s; + + if (!isGecko) + return 0; + + // Weird, wheres that cursor selection? + s = this.selection.getSel(); + return (!s || !s.rangeCount || s.rangeCount == 0); + } + }); +})(tinymce); + +(function(tinymce) { + // Added for compression purposes + var each = tinymce.each, undefined, TRUE = true, FALSE = false; + + tinymce.EditorCommands = function(editor) { + var dom = editor.dom, + selection = editor.selection, + commands = {state: {}, exec : {}, value : {}}, + settings = editor.settings, + bookmark; + + function execCommand(command, ui, value) { + var func; + + command = command.toLowerCase(); + if (func = commands.exec[command]) { + func(command, ui, value); + return TRUE; + } + + return FALSE; + }; + + function queryCommandState(command) { + var func; + + command = command.toLowerCase(); + if (func = commands.state[command]) + return func(command); + + return -1; + }; + + function queryCommandValue(command) { + var func; + + command = command.toLowerCase(); + if (func = commands.value[command]) + return func(command); + + return FALSE; + }; + + function addCommands(command_list, type) { + type = type || 'exec'; + + each(command_list, function(callback, command) { + each(command.toLowerCase().split(','), function(command) { + commands[type][command] = callback; + }); + }); + }; + + // Expose public methods + tinymce.extend(this, { + execCommand : execCommand, + queryCommandState : queryCommandState, + queryCommandValue : queryCommandValue, + addCommands : addCommands + }); + + // Private methods + + function execNativeCommand(command, ui, value) { + if (ui === undefined) + ui = FALSE; + + if (value === undefined) + value = null; + + return editor.getDoc().execCommand(command, ui, value); + }; + + function isFormatMatch(name) { + return editor.formatter.match(name); + }; + + function toggleFormat(name, value) { + editor.formatter.toggle(name, value ? {value : value} : undefined); + }; + + function storeSelection(type) { + bookmark = selection.getBookmark(type); + }; + + function restoreSelection() { + selection.moveToBookmark(bookmark); + }; + + // Add execCommand overrides + addCommands({ + // Ignore these, added for compatibility + 'mceResetDesignMode,mceBeginUndoLevel' : function() {}, + + // Add undo manager logic + 'mceEndUndoLevel,mceAddUndoLevel' : function() { + editor.undoManager.add(); + }, + + 'Cut,Copy,Paste' : function(command) { + var doc = editor.getDoc(), failed; + + // Try executing the native command + try { + execNativeCommand(command); + } catch (ex) { + // Command failed + failed = TRUE; + } + + // Present alert message about clipboard access not being available + if (failed || !doc.queryCommandSupported(command)) { + if (tinymce.isGecko) { + editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) { + if (state) + open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank'); + }); + } else + editor.windowManager.alert(editor.getLang('clipboard_no_support')); + } + }, + + // Override unlink command + unlink : function(command) { + if (selection.isCollapsed()) + selection.select(selection.getNode()); + + execNativeCommand(command); + selection.collapse(FALSE); + }, + + // Override justify commands to use the text formatter engine + 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { + var align = command.substring(7); + + // Remove all other alignments first + each('left,center,right,full'.split(','), function(name) { + if (align != name) + editor.formatter.remove('align' + name); + }); + + toggleFormat('align' + align); + execCommand('mceRepaint'); + }, + + // Override list commands to fix WebKit bug + 'InsertUnorderedList,InsertOrderedList' : function(command) { + var listElm, listParent; + + execNativeCommand(command); + + // WebKit produces lists within block elements so we need to split them + // we will replace the native list creation logic to custom logic later on + // TODO: Remove this when the list creation logic is removed + listElm = dom.getParent(selection.getNode(), 'ol,ul'); + if (listElm) { + listParent = listElm.parentNode; + + // If list is within a text block then split that block + if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) { + storeSelection(); + dom.split(listParent, listElm); + restoreSelection(); + } + } + }, + + // Override commands to use the text formatter engine + 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { + toggleFormat(command); + }, + + // Override commands to use the text formatter engine + 'ForeColor,HiliteColor,FontName' : function(command, ui, value) { + toggleFormat(command, value); + }, + + FontSize : function(command, ui, value) { + var fontClasses, fontSizes; + + // Convert font size 1-7 to styles + if (value >= 1 && value <= 7) { + fontSizes = tinymce.explode(settings.font_size_style_values); + fontClasses = tinymce.explode(settings.font_size_classes); + + if (fontClasses) + value = fontClasses[value - 1] || value; + else + value = fontSizes[value - 1] || value; + } + + toggleFormat(command, value); + }, + + RemoveFormat : function(command) { + editor.formatter.remove(command); + }, + + mceBlockQuote : function(command) { + toggleFormat('blockquote'); + }, + + FormatBlock : function(command, ui, value) { + return toggleFormat(value || 'p'); + }, + + mceCleanup : function() { + var bookmark = selection.getBookmark(); + + editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE}); + + selection.moveToBookmark(bookmark); + }, + + mceRemoveNode : function(command, ui, value) { + var node = value || selection.getNode(); + + // Make sure that the body node isn't removed + if (node != editor.getBody()) { + storeSelection(); + editor.dom.remove(node, TRUE); + restoreSelection(); + } + }, + + mceSelectNodeDepth : function(command, ui, value) { + var counter = 0; + + dom.getParent(selection.getNode(), function(node) { + if (node.nodeType == 1 && counter++ == value) { + selection.select(node); + return FALSE; + } + }, editor.getBody()); + }, + + mceSelectNode : function(command, ui, value) { + selection.select(value); + }, + + mceInsertContent : function(command, ui, value) { + var caretNode, rng, rootNode, parent, node, rng, nodeRect, viewPortRect, args; + + function findSuitableCaretNode(start_node, root_node) { + var node, walker = new tinymce.dom.TreeWalker(start_node, root_node); + + while ((node = walker.current())) { + if ((node.nodeType == 3 && tinymce.trim(node.nodeValue).length) || node.nodeName == 'BR' || node.nodeName == 'IMG') + return node; + + walker.prev(); + } + }; + + args = {content: value, format: 'html'}; + selection.onBeforeSetContent.dispatch(selection, args); + value = args.content; + + // Add caret at end of contents if it's missing + if (value.indexOf('{$caret}') == -1) + value += '{$caret}'; + + // Set the content at selection to a span and replace it's contents with the value + selection.setContent('<span id="__mce">\uFEFF</span>', {no_events : false}); + dom.setOuterHTML('__mce', value.replace(/\{\$caret\}/, '<span data-mce-type="bookmark" id="__mce">\uFEFF</span>')); + + caretNode = dom.select('#__mce')[0]; + rootNode = dom.getRoot(); + + // Move the caret into the last suitable location within the previous sibling if it's a block since the block might be split + if (caretNode.previousSibling && dom.isBlock(caretNode.previousSibling) || caretNode.parentNode == rootNode) { + node = findSuitableCaretNode(caretNode.previousSibling, rootNode); + if (node) { + if (node.nodeName == 'BR') + node.parentNode.insertBefore(caretNode, node); + else + dom.insertAfter(caretNode, node); + } + } + + // Find caret root parent and clean it up using the serializer to avoid nesting + while (caretNode) { + if (caretNode === rootNode) { + // Clean up the parent element by parsing and serializing it + // This will remove invalid elements/attributes and fix nesting issues + dom.setOuterHTML(parent, + new tinymce.html.Serializer({}, editor.schema).serialize( + new tinymce.html.DomParser({ + remove_trailing_brs : true + }, editor.schema).parse(dom.getOuterHTML(parent)) + ) + ); + + break; + } + + parent = caretNode; + caretNode = caretNode.parentNode; + } + + // Find caret after cleanup and move selection to that location + caretNode = dom.select('#__mce')[0]; + if (caretNode) { + node = findSuitableCaretNode(caretNode.previousSibling, rootNode); + dom.remove(caretNode); + + if (node) { + rng = dom.createRng(); + + if (node.nodeType == 3) { + rng.setStart(node, node.length); + rng.setEnd(node, node.length); + } else { + if (node.nodeName == 'BR') { + rng.setStartBefore(node); + rng.setEndBefore(node); + } else { + rng.setStartAfter(node); + rng.setEndAfter(node); + } + } + + selection.setRng(rng); + + // Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well + if (!tinymce.isIE) { + node = dom.create('span', null, '\u00a0'); + rng.insertNode(node); + nodeRect = dom.getRect(node); + viewPortRect = dom.getViewPort(editor.getWin()); + + // Check if node is out side the viewport if it is then scroll to it + if ((nodeRect.y > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) || + (nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) { + editor.getBody().scrollLeft = nodeRect.x; + editor.getBody().scrollTop = nodeRect.y; + } + + dom.remove(node); + } + + // Make sure that the selection is collapsed after we removed the node fixes a WebKit bug + // where WebKit would place the endContainer/endOffset at a different location than the startContainer/startOffset + selection.collapse(true); + } + } + + selection.onSetContent.dispatch(selection, args); + editor.addVisual(); + }, + + mceInsertRawHTML : function(command, ui, value) { + selection.setContent('tiny_mce_marker'); + editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, function() { return value })); + }, + + mceSetContent : function(command, ui, value) { + editor.setContent(value); + }, + + 'Indent,Outdent' : function(command) { + var intentValue, indentUnit, value; + + // Setup indent level + intentValue = settings.indentation; + indentUnit = /[a-z%]+$/i.exec(intentValue); + intentValue = parseInt(intentValue); + + if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) { + each(selection.getSelectedBlocks(), function(element) { + if (command == 'outdent') { + value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue); + dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : ''); + } else + dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit); + }); + } else + execNativeCommand(command); + }, + + mceRepaint : function() { + var bookmark; + + if (tinymce.isGecko) { + try { + storeSelection(TRUE); + + if (selection.getSel()) + selection.getSel().selectAllChildren(editor.getBody()); + + selection.collapse(TRUE); + restoreSelection(); + } catch (ex) { + // Ignore + } + } + }, + + mceToggleFormat : function(command, ui, value) { + editor.formatter.toggle(value); + }, + + InsertHorizontalRule : function() { + editor.execCommand('mceInsertContent', false, '<hr />'); + }, + + mceToggleVisualAid : function() { + editor.hasVisual = !editor.hasVisual; + editor.addVisual(); + }, + + mceReplaceContent : function(command, ui, value) { + editor.execCommand('mceInsertContent', false, selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'})))); + }, + + mceInsertLink : function(command, ui, value) { + var link = dom.getParent(selection.getNode(), 'a'), img, floatVal; + + if (tinymce.is(value, 'string')) + value = {href : value}; + + // Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here. + value.href = value.href.replace(' ', '%20'); + + if (!link) { + // WebKit can't create links on float images for some odd reason so just remove it and restore it later + if (tinymce.isWebKit) { + img = dom.getParent(selection.getNode(), 'img'); + + if (img) { + floatVal = img.style.cssFloat; + img.style.cssFloat = null; + } + } + + execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);'); + + // Restore float value + if (floatVal) + img.style.cssFloat = floatVal; + + each(dom.select("a[href='javascript:mctmp(0);']"), function(link) { + dom.setAttribs(link, value); + }); + } else { + if (value.href) + dom.setAttribs(link, value); + else + editor.dom.remove(link, TRUE); + } + }, + + selectAll : function() { + var root = dom.getRoot(), rng = dom.createRng(); + + rng.setStart(root, 0); + rng.setEnd(root, root.childNodes.length); + + editor.selection.setRng(rng); + } + }); + + // Add queryCommandState overrides + addCommands({ + // Override justify commands + 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { + return isFormatMatch('align' + command.substring(7)); + }, + + 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { + return isFormatMatch(command); + }, + + mceBlockQuote : function() { + return isFormatMatch('blockquote'); + }, + + Outdent : function() { + var node; + + if (settings.inline_styles) { + if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) + return TRUE; + + if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) + return TRUE; + } + + return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE')); + }, + + 'InsertUnorderedList,InsertOrderedList' : function(command) { + return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL'); + } + }, 'state'); + + // Add queryCommandValue overrides + addCommands({ + 'FontSize,FontName' : function(command) { + var value = 0, parent; + + if (parent = dom.getParent(selection.getNode(), 'span')) { + if (command == 'fontsize') + value = parent.style.fontSize; + else + value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase(); + } + + return value; + } + }, 'value'); + + // Add undo manager logic + if (settings.custom_undo_redo) { + addCommands({ + Undo : function() { + editor.undoManager.undo(); + }, + + Redo : function() { + editor.undoManager.redo(); + } + }); + } + }; +})(tinymce); + +(function(tinymce) { + var Dispatcher = tinymce.util.Dispatcher; + + tinymce.UndoManager = function(editor) { + var self, index = 0, data = []; + + function getContent() { + return tinymce.trim(editor.getContent({format : 'raw', no_events : 1})); + }; + + return self = { + typing : false, + + onAdd : new Dispatcher(self), + + onUndo : new Dispatcher(self), + + onRedo : new Dispatcher(self), + + beforeChange : function() { + // Set before bookmark on previous level + if (data[index]) + data[index].beforeBookmark = editor.selection.getBookmark(2, true); + }, + + add : function(level) { + var i, settings = editor.settings, lastLevel; + + level = level || {}; + level.content = getContent(); + + // Add undo level if needed + lastLevel = data[index]; + if (lastLevel && lastLevel.content == level.content) + return null; + + // Time to compress + if (settings.custom_undo_redo_levels) { + if (data.length > settings.custom_undo_redo_levels) { + for (i = 0; i < data.length - 1; i++) + data[i] = data[i + 1]; + + data.length--; + index = data.length; + } + } + + // Get a non intrusive normalized bookmark + level.bookmark = editor.selection.getBookmark(2, true); + + // Crop array if needed + if (index < data.length - 1) + data.length = index + 1; + + data.push(level); + index = data.length - 1; + + self.onAdd.dispatch(self, level); + editor.isNotDirty = 0; + + return level; + }, + + undo : function() { + var level, i; + + if (self.typing) { + self.add(); + self.typing = false; + } + + if (index > 0) { + level = data[--index]; + + editor.setContent(level.content, {format : 'raw'}); + editor.selection.moveToBookmark(level.beforeBookmark); + + self.onUndo.dispatch(self, level); + } + + return level; + }, + + redo : function() { + var level; + + if (index < data.length - 1) { + level = data[++index]; + + editor.setContent(level.content, {format : 'raw'}); + editor.selection.moveToBookmark(level.bookmark); + + self.onRedo.dispatch(self, level); + } + + return level; + }, + + clear : function() { + data = []; + index = 0; + self.typing = false; + }, + + hasUndo : function() { + return index > 0 || this.typing; + }, + + hasRedo : function() { + return index < data.length - 1 && !this.typing; + } + }; + }; +})(tinymce); + +(function(tinymce) { + // Shorten names + var Event = tinymce.dom.Event, + isIE = tinymce.isIE, + isGecko = tinymce.isGecko, + isOpera = tinymce.isOpera, + each = tinymce.each, + extend = tinymce.extend, + TRUE = true, + FALSE = false; + + function cloneFormats(node) { + var clone, temp, inner; + + do { + if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) { + if (clone) { + temp = node.cloneNode(false); + temp.appendChild(clone); + clone = temp; + } else { + clone = inner = node.cloneNode(false); + } + + clone.removeAttribute('id'); + } + } while (node = node.parentNode); + + if (clone) + return {wrapper : clone, inner : inner}; + }; + + // Checks if the selection/caret is at the end of the specified block element + function isAtEnd(rng, par) { + var rng2 = par.ownerDocument.createRange(); + + rng2.setStart(rng.endContainer, rng.endOffset); + rng2.setEndAfter(par); + + // Get number of characters to the right of the cursor if it's zero then we are at the end and need to merge the next block element + return rng2.cloneContents().textContent.length == 0; + }; + + function isEmpty(n) { + n = n.innerHTML; + + n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars + n = n.replace(/<[^>]+>/g, ''); // Remove all tags + + return n.replace(/[ \u00a0\t\r\n]+/g, '') == ''; + }; + + function splitList(selection, dom, li) { + var listBlock, block; + + if (isEmpty(li)) { + listBlock = dom.getParent(li, 'ul,ol'); + + if (!dom.getParent(listBlock.parentNode, 'ul,ol')) { + dom.split(listBlock, li); + block = dom.create('p', 0, '<br data-mce-bogus="1" />'); + dom.replace(block, li); + selection.select(block, 1); + } + + return FALSE; + } + + return TRUE; + }; + + tinymce.create('tinymce.ForceBlocks', { + ForceBlocks : function(ed) { + var t = this, s = ed.settings, elm; + + t.editor = ed; + t.dom = ed.dom; + elm = (s.forced_root_block || 'p').toLowerCase(); + s.element = elm.toUpperCase(); + + ed.onPreInit.add(t.setup, t); + + if (s.forced_root_block) { + ed.onInit.add(t.forceRoots, t); + ed.onSetContent.add(t.forceRoots, t); + ed.onBeforeGetContent.add(t.forceRoots, t); + ed.onExecCommand.add(function(ed, cmd) { + if (cmd == 'mceInsertContent') { + t.forceRoots(); + ed.nodeChanged(); + } + }); + } + }, + + setup : function() { + var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection; + + // Force root blocks when typing and when getting output + if (s.forced_root_block) { + ed.onBeforeExecCommand.add(t.forceRoots, t); + ed.onKeyUp.add(t.forceRoots, t); + ed.onPreProcess.add(t.forceRoots, t); + } + + if (s.force_br_newlines) { + // Force IE to produce BRs on enter + if (isIE) { + ed.onKeyPress.add(function(ed, e) { + var n; + + if (e.keyCode == 13 && selection.getNode().nodeName != 'LI') { + selection.setContent('<br id="__" /> ', {format : 'raw'}); + n = dom.get('__'); + n.removeAttribute('id'); + selection.select(n); + selection.collapse(); + return Event.cancel(e); + } + }); + } + } + + if (s.force_p_newlines) { + if (!isIE) { + ed.onKeyPress.add(function(ed, e) { + if (e.keyCode == 13 && !e.shiftKey && !t.insertPara(e)) + Event.cancel(e); + }); + } else { + // Ungly hack to for IE to preserve the formatting when you press + // enter at the end of a block element with formatted contents + // This logic overrides the browsers default logic with + // custom logic that enables us to control the output + tinymce.addUnload(function() { + t._previousFormats = 0; // Fix IE leak + }); + + ed.onKeyPress.add(function(ed, e) { + t._previousFormats = 0; + + // Clone the current formats, this will later be applied to the new block contents + if (e.keyCode == 13 && !e.shiftKey && ed.selection.isCollapsed() && s.keep_styles) + t._previousFormats = cloneFormats(ed.selection.getStart()); + }); + + ed.onKeyUp.add(function(ed, e) { + // Let IE break the element and the wrap the new caret location in the previous formats + if (e.keyCode == 13 && !e.shiftKey) { + var parent = ed.selection.getStart(), fmt = t._previousFormats; + + // Parent is an empty block + if (!parent.hasChildNodes() && fmt) { + parent = dom.getParent(parent, dom.isBlock); + + if (parent && parent.nodeName != 'LI') { + parent.innerHTML = ''; + + if (t._previousFormats) { + parent.appendChild(fmt.wrapper); + fmt.inner.innerHTML = '\uFEFF'; + } else + parent.innerHTML = '\uFEFF'; + + selection.select(parent, 1); + selection.collapse(true); + ed.getDoc().execCommand('Delete', false, null); + t._previousFormats = 0; + } + } + } + }); + } + + if (isGecko) { + ed.onKeyDown.add(function(ed, e) { + if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) + t.backspaceDelete(e, e.keyCode == 8); + }); + } + } + + // Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973 + if (tinymce.isWebKit) { + function insertBr(ed) { + var rng = selection.getRng(), br, div = dom.create('div', null, ' '), divYPos, vpHeight = dom.getViewPort(ed.getWin()).h; + + // Insert BR element + rng.insertNode(br = dom.create('br')); + + // Place caret after BR + rng.setStartAfter(br); + rng.setEndAfter(br); + selection.setRng(rng); + + // Could not place caret after BR then insert an nbsp entity and move the caret + if (selection.getSel().focusNode == br.previousSibling) { + selection.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br)); + selection.collapse(TRUE); + } + + // Create a temporary DIV after the BR and get the position as it + // seems like getPos() returns 0 for text nodes and BR elements. + dom.insertAfter(div, br); + divYPos = dom.getPos(div).y; + dom.remove(div); + + // Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117 + if (divYPos > vpHeight) // It is not necessary to scroll if the DIV is inside the view port. + ed.getWin().scrollTo(0, divYPos); + }; + + ed.onKeyPress.add(function(ed, e) { + if (e.keyCode == 13 && (e.shiftKey || (s.force_br_newlines && !dom.getParent(selection.getNode(), 'h1,h2,h3,h4,h5,h6,ol,ul')))) { + insertBr(ed); + Event.cancel(e); + } + }); + } + + // IE specific fixes + if (isIE) { + // Replaces IE:s auto generated paragraphs with the specified element name + if (s.element != 'P') { + ed.onKeyPress.add(function(ed, e) { + t.lastElm = selection.getNode().nodeName; + }); + + ed.onKeyUp.add(function(ed, e) { + var bl, n = selection.getNode(), b = ed.getBody(); + + if (b.childNodes.length === 1 && n.nodeName == 'P') { + n = dom.rename(n, s.element); + selection.select(n); + selection.collapse(); + ed.nodeChanged(); + } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') { + bl = dom.getParent(n, 'p'); + + if (bl) { + dom.rename(bl, s.element); + ed.nodeChanged(); + } + } + }); + } + } + }, + + find : function(n, t, s) { + var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, FALSE), c = -1; + + while (n = w.nextNode()) { + c++; + + // Index by node + if (t == 0 && n == s) + return c; + + // Node by index + if (t == 1 && c == s) + return n; + } + + return -1; + }, + + forceRoots : function(ed, e) { + var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF; + var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid; + + // Fix for bug #1863847 + //if (e && e.keyCode == 13) + // return TRUE; + + // Wrap non blocks into blocks + for (i = nl.length - 1; i >= 0; i--) { + nx = nl[i]; + + // Ignore internal elements + if (nx.nodeType === 1 && nx.getAttribute('data-mce-type')) { + bl = null; + continue; + } + + // Is text or non block element + if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) { + if (!bl) { + // Create new block but ignore whitespace + if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) { + // Store selection + if (si == -2 && r) { + if (!isIE || r.setStart) { + // If selection is element then mark it + if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) { + // Save the id of the selected element + eid = n.getAttribute("id"); + n.setAttribute("id", "__mce"); + } else { + // If element is inside body, might not be the case in contentEdiable mode + if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) { + so = r.startOffset; + eo = r.endOffset; + si = t.find(b, 0, r.startContainer); + ei = t.find(b, 0, r.endContainer); + } + } + } else { + // Force control range into text range + if (r.item) { + tr = d.body.createTextRange(); + tr.moveToElementText(r.item(0)); + r = tr; + } + + tr = d.body.createTextRange(); + tr.moveToElementText(b); + tr.collapse(1); + bp = tr.move('character', c) * -1; + + tr = r.duplicate(); + tr.collapse(1); + sp = tr.move('character', c) * -1; + + tr = r.duplicate(); + tr.collapse(0); + le = (tr.move('character', c) * -1) - sp; + + si = sp - bp; + ei = le; + } + } + + // Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE + // See: http://support.microsoft.com/kb/829907 + bl = ed.dom.create(ed.settings.forced_root_block); + nx.parentNode.replaceChild(bl, nx); + bl.appendChild(nx); + } + } else { + if (bl.hasChildNodes()) + bl.insertBefore(nx, bl.firstChild); + else + bl.appendChild(nx); + } + } else + bl = null; // Time to create new block + } + + // Restore selection + if (si != -2) { + if (!isIE || r.setStart) { + bl = b.getElementsByTagName(ed.settings.element)[0]; + r = d.createRange(); + + // Select last location or generated block + if (si != -1) + r.setStart(t.find(b, 1, si), so); + else + r.setStart(bl, 0); + + // Select last location or generated block + if (ei != -1) + r.setEnd(t.find(b, 1, ei), eo); + else + r.setEnd(bl, 0); + + if (s) { + s.removeAllRanges(); + s.addRange(r); + } + } else { + try { + r = s.createRange(); + r.moveToElementText(b); + r.collapse(1); + r.moveStart('character', si); + r.moveEnd('character', ei); + r.select(); + } catch (ex) { + // Ignore + } + } + } else if ((!isIE || r.setStart) && (n = ed.dom.get('__mce'))) { + // Restore the id of the selected element + if (eid) + n.setAttribute('id', eid); + else + n.removeAttribute('id'); + + // Move caret before selected element + r = d.createRange(); + r.setStartBefore(n); + r.setEndBefore(n); + se.setRng(r); + } + }, + + getParentBlock : function(n) { + var d = this.dom; + + return d.getParent(n, d.isBlock); + }, + + insertPara : function(e) { + var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body; + var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car; + + ed.undoManager.beforeChange(); + + // If root blocks are forced then use Operas default behavior since it's really good +// Removed due to bug: #1853816 +// if (se.forced_root_block && isOpera) +// return TRUE; + + // Setup before range + rb = d.createRange(); + + // If is before the first block element and in body, then move it into first block element + rb.setStart(s.anchorNode, s.anchorOffset); + rb.collapse(TRUE); + + // Setup after range + ra = d.createRange(); + + // If is before the first block element and in body, then move it into first block element + ra.setStart(s.focusNode, s.focusOffset); + ra.collapse(TRUE); + + // Setup start/end points + dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0; + sn = dir ? s.anchorNode : s.focusNode; + so = dir ? s.anchorOffset : s.focusOffset; + en = dir ? s.focusNode : s.anchorNode; + eo = dir ? s.focusOffset : s.anchorOffset; + + // If selection is in empty table cell + if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) { + if (sn.firstChild.nodeName == 'BR') + dom.remove(sn.firstChild); // Remove BR + + // Create two new block elements + if (sn.childNodes.length == 0) { + ed.dom.add(sn, se.element, null, '<br />'); + aft = ed.dom.add(sn, se.element, null, '<br />'); + } else { + n = sn.innerHTML; + sn.innerHTML = ''; + ed.dom.add(sn, se.element, null, n); + aft = ed.dom.add(sn, se.element, null, '<br />'); + } + + // Move caret into the last one + r = d.createRange(); + r.selectNodeContents(aft); + r.collapse(1); + ed.selection.setRng(r); + + return FALSE; + } + + // If the caret is in an invalid location in FF we need to move it into the first block + if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) { + sn = en = sn.firstChild; + so = eo = 0; + rb = d.createRange(); + rb.setStart(sn, 0); + ra = d.createRange(); + ra.setStart(en, 0); + } + + // Never use body as start or end node + sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes + sn = sn.nodeName == "BODY" ? sn.firstChild : sn; + en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes + en = en.nodeName == "BODY" ? en.firstChild : en; + + // Get start and end blocks + sb = t.getParentBlock(sn); + eb = t.getParentBlock(en); + bn = sb ? sb.nodeName : se.element; // Get block name to create + + // Return inside list use default browser behavior + if (n = t.dom.getParent(sb, 'li,pre')) { + if (n.nodeName == 'LI') + return splitList(ed.selection, t.dom, n); + + return TRUE; + } + + // If caption or absolute layers then always generate new blocks within + if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { + bn = se.element; + sb = null; + } + + // If caption or absolute layers then always generate new blocks within + if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { + bn = se.element; + eb = null; + } + + // Use P instead + if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) { + bn = se.element; + sb = eb = null; + } + + // Setup new before and after blocks + bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn); + aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn); + + // Remove id from after clone + aft.removeAttribute('id'); + + // Is header and cursor is at the end, then force paragraph under + if (/^(H[1-6])$/.test(bn) && isAtEnd(r, sb)) + aft = ed.dom.create(se.element); + + // Find start chop node + n = sc = sn; + do { + if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) + break; + + sc = n; + } while ((n = n.previousSibling ? n.previousSibling : n.parentNode)); + + // Find end chop node + n = ec = en; + do { + if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) + break; + + ec = n; + } while ((n = n.nextSibling ? n.nextSibling : n.parentNode)); + + // Place first chop part into before block element + if (sc.nodeName == bn) + rb.setStart(sc, 0); + else + rb.setStartBefore(sc); + + rb.setEnd(sn, so); + bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari + + // Place secnd chop part within new block element + try { + ra.setEndAfter(ec); + } catch(ex) { + //console.debug(s.focusNode, s.focusOffset); + } + + ra.setStart(en, eo); + aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari + + // Create range around everything + r = d.createRange(); + if (!sc.previousSibling && sc.parentNode.nodeName == bn) { + r.setStartBefore(sc.parentNode); + } else { + if (rb.startContainer.nodeName == bn && rb.startOffset == 0) + r.setStartBefore(rb.startContainer); + else + r.setStart(rb.startContainer, rb.startOffset); + } + + if (!ec.nextSibling && ec.parentNode.nodeName == bn) + r.setEndAfter(ec.parentNode); + else + r.setEnd(ra.endContainer, ra.endOffset); + + // Delete and replace it with new block elements + r.deleteContents(); + + if (isOpera) + ed.getWin().scrollTo(0, vp.y); + + // Never wrap blocks in blocks + if (bef.firstChild && bef.firstChild.nodeName == bn) + bef.innerHTML = bef.firstChild.innerHTML; + + if (aft.firstChild && aft.firstChild.nodeName == bn) + aft.innerHTML = aft.firstChild.innerHTML; + + // Padd empty blocks + if (isEmpty(bef)) + bef.innerHTML = '<br />'; + + function appendStyles(e, en) { + var nl = [], nn, n, i; + + e.innerHTML = ''; + + // Make clones of style elements + if (se.keep_styles) { + n = en; + do { + // We only want style specific elements + if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) { + nn = n.cloneNode(FALSE); + dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique + nl.push(nn); + } + } while (n = n.parentNode); + } + + // Append style elements to aft + if (nl.length > 0) { + for (i = nl.length - 1, nn = e; i >= 0; i--) + nn = nn.appendChild(nl[i]); + + // Padd most inner style element + nl[0].innerHTML = isOpera ? '\u00a0' : '<br />'; // Extra space for Opera so that the caret can move there + return nl[0]; // Move caret to most inner element + } else + e.innerHTML = isOpera ? '\u00a0' : '<br />'; // Extra space for Opera so that the caret can move there + }; + + // Fill empty afterblook with current style + if (isEmpty(aft)) + car = appendStyles(aft, en); + + // Opera needs this one backwards for older versions + if (isOpera && parseFloat(opera.version()) < 9.5) { + r.insertNode(bef); + r.insertNode(aft); + } else { + r.insertNode(aft); + r.insertNode(bef); + } + + // Normalize + aft.normalize(); + bef.normalize(); + + function first(n) { + return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE).nextNode() || n; + }; + + // Move cursor and scroll into view + r = d.createRange(); + r.selectNodeContents(isGecko ? first(car || aft) : car || aft); + r.collapse(1); + s.removeAllRanges(); + s.addRange(r); + + // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs + y = ed.dom.getPos(aft).y; + //ch = aft.clientHeight; + + // Is element within viewport + if (y < vp.y || y + 25 > vp.y + vp.h) { + ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks + + /*console.debug( + 'Element: y=' + y + ', h=' + ch + ', ' + + 'Viewport: y=' + vp.y + ", h=" + vp.h + ', bottom=' + (vp.y + vp.h) + );*/ + } + + ed.undoManager.add(); + + return FALSE; + }, + + backspaceDelete : function(e, bs) { + var t = this, ed = t.editor, b = ed.getBody(), dom = ed.dom, n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn, walker; + + // Delete when caret is behind a element doesn't work correctly on Gecko see #3011651 + if (!bs && r.collapsed && sc.nodeType == 1 && r.startOffset == sc.childNodes.length) { + walker = new tinymce.dom.TreeWalker(sc.lastChild, sc); + + // Walk the dom backwards until we find a text node + for (n = sc.lastChild; n; n = walker.prev()) { + if (n.nodeType == 3) { + r.setStart(n, n.nodeValue.length); + r.collapse(true); + se.setRng(r); + return; + } + } + } + + // The caret sometimes gets stuck in Gecko if you delete empty paragraphs + // This workaround removes the element by hand and moves the caret to the previous element + if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) { + if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) { + // Find previous block element + n = sc; + while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ; + + if (n) { + if (sc != b.firstChild) { + // Find last text node + w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE); + while (tn = w.nextNode()) + n = tn; + + // Place caret at the end of last text node + r = ed.getDoc().createRange(); + r.setStart(n, n.nodeValue ? n.nodeValue.length : 0); + r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0); + se.setRng(r); + + // Remove the target container + ed.dom.remove(sc); + } + + return Event.cancel(e); + } + } + } + } + }); +})(tinymce); + +(function(tinymce) { + // Shorten names + var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend; + + tinymce.create('tinymce.ControlManager', { + ControlManager : function(ed, s) { + var t = this, i; + + s = s || {}; + t.editor = ed; + t.controls = {}; + t.onAdd = new tinymce.util.Dispatcher(t); + t.onPostRender = new tinymce.util.Dispatcher(t); + t.prefix = s.prefix || ed.id + '_'; + t._cls = {}; + + t.onPostRender.add(function() { + each(t.controls, function(c) { + c.postRender(); + }); + }); + }, + + get : function(id) { + return this.controls[this.prefix + id] || this.controls[id]; + }, + + setActive : function(id, s) { + var c = null; + + if (c = this.get(id)) + c.setActive(s); + + return c; + }, + + setDisabled : function(id, s) { + var c = null; + + if (c = this.get(id)) + c.setDisabled(s); + + return c; + }, + + add : function(c) { + var t = this; + + if (c) { + t.controls[c.id] = c; + t.onAdd.dispatch(c, t); + } + + return c; + }, + + createControl : function(n) { + var c, t = this, ed = t.editor; + + each(ed.plugins, function(p) { + if (p.createControl) { + c = p.createControl(n, t); + + if (c) + return false; + } + }); + + switch (n) { + case "|": + case "separator": + return t.createSeparator(); + } + + if (!c && ed.buttons && (c = ed.buttons[n])) + return t.createButton(n, c); + + return t.add(c); + }, + + createDropMenu : function(id, s, cc) { + var t = this, ed = t.editor, c, bm, v, cls; + + s = extend({ + 'class' : 'mceDropDown', + constrain : ed.settings.constrain_menus + }, s); + + s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin'; + if (v = ed.getParam('skin_variant')) + s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1); + + id = t.prefix + id; + cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu; + c = t.controls[id] = new cls(id, s); + c.onAddItem.add(function(c, o) { + var s = o.settings; + + s.title = ed.getLang(s.title, s.title); + + if (!s.onclick) { + s.onclick = function(v) { + if (s.cmd) + ed.execCommand(s.cmd, s.ui || false, s.value); + }; + } + }); + + ed.onRemove.add(function() { + c.destroy(); + }); + + // Fix for bug #1897785, #1898007 + if (tinymce.isIE) { + c.onShowMenu.add(function() { + // IE 8 needs focus in order to store away a range with the current collapsed caret location + ed.focus(); + + bm = ed.selection.getBookmark(1); + }); + + c.onHideMenu.add(function() { + if (bm) { + ed.selection.moveToBookmark(bm); + bm = 0; + } + }); + } + + return t.add(c); + }, + + createListBox : function(id, s, cc) { + var t = this, ed = t.editor, cmd, c, cls; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.scope = s.scope || ed; + + if (!s.onselect) { + s.onselect = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + scope : s.scope, + control_manager : t + }, s); + + id = t.prefix + id; + + if (ed.settings.use_native_selects) + c = new tinymce.ui.NativeListBox(id, s); + else { + cls = cc || t._cls.listbox || tinymce.ui.ListBox; + c = new cls(id, s, ed); + } + + t.controls[id] = c; + + // Fix focus problem in Safari + if (tinymce.isWebKit) { + c.onPostRender.add(function(c, n) { + // Store bookmark on mousedown + Event.add(n, 'mousedown', function() { + ed.bookmark = ed.selection.getBookmark(1); + }); + + // Restore on focus, since it might be lost + Event.add(n, 'focus', function() { + ed.selection.moveToBookmark(ed.bookmark); + ed.bookmark = null; + }); + }); + } + + if (c.hideMenu) + ed.onMouseDown.add(c.hideMenu, c); + + return t.add(c); + }, + + createButton : function(id, s, cc) { + var t = this, ed = t.editor, o, c, cls; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.label = ed.translate(s.label); + s.scope = s.scope || ed; + + if (!s.onclick && !s.menu_button) { + s.onclick = function() { + ed.execCommand(s.cmd, s.ui || false, s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + unavailable_prefix : ed.getLang('unavailable', ''), + scope : s.scope, + control_manager : t + }, s); + + id = t.prefix + id; + + if (s.menu_button) { + cls = cc || t._cls.menubutton || tinymce.ui.MenuButton; + c = new cls(id, s, ed); + ed.onMouseDown.add(c.hideMenu, c); + } else { + cls = t._cls.button || tinymce.ui.Button; + c = new cls(id, s); + } + + return t.add(c); + }, + + createMenuButton : function(id, s, cc) { + s = s || {}; + s.menu_button = 1; + + return this.createButton(id, s, cc); + }, + + createSplitButton : function(id, s, cc) { + var t = this, ed = t.editor, cmd, c, cls; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.scope = s.scope || ed; + + if (!s.onclick) { + s.onclick = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + if (!s.onselect) { + s.onselect = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + scope : s.scope, + control_manager : t + }, s); + + id = t.prefix + id; + cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton; + c = t.add(new cls(id, s, ed)); + ed.onMouseDown.add(c.hideMenu, c); + + return c; + }, + + createColorSplitButton : function(id, s, cc) { + var t = this, ed = t.editor, cmd, c, cls, bm; + + if (t.get(id)) + return null; + + s.title = ed.translate(s.title); + s.scope = s.scope || ed; + + if (!s.onclick) { + s.onclick = function(v) { + if (tinymce.isIE) + bm = ed.selection.getBookmark(1); + + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + if (!s.onselect) { + s.onselect = function(v) { + ed.execCommand(s.cmd, s.ui || false, v || s.value); + }; + } + + s = extend({ + title : s.title, + 'class' : 'mce_' + id, + 'menu_class' : ed.getParam('skin') + 'Skin', + scope : s.scope, + more_colors_title : ed.getLang('more_colors') + }, s); + + id = t.prefix + id; + cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton; + c = new cls(id, s, ed); + ed.onMouseDown.add(c.hideMenu, c); + + // Remove the menu element when the editor is removed + ed.onRemove.add(function() { + c.destroy(); + }); + + // Fix for bug #1897785, #1898007 + if (tinymce.isIE) { + c.onShowMenu.add(function() { + // IE 8 needs focus in order to store away a range with the current collapsed caret location + ed.focus(); + bm = ed.selection.getBookmark(1); + }); + + c.onHideMenu.add(function() { + if (bm) { + ed.selection.moveToBookmark(bm); + bm = 0; + } + }); + } + + return t.add(c); + }, + + createToolbar : function(id, s, cc) { + var c, t = this, cls; + + id = t.prefix + id; + cls = cc || t._cls.toolbar || tinymce.ui.Toolbar; + c = new cls(id, s, t.editor); + + if (t.get(id)) + return null; + + return t.add(c); + }, + + createToolbarGroup : function(id, s, cc) { + var c, t = this, cls; + id = t.prefix + id; + cls = cc || this._cls.toolbarGroup || tinymce.ui.ToolbarGroup; + c = new cls(id, s, t.editor); + + if (t.get(id)) + return null; + + return t.add(c); + }, + + createSeparator : function(cc) { + var cls = cc || this._cls.separator || tinymce.ui.Separator; + + return new cls(); + }, + + setControlType : function(n, c) { + return this._cls[n.toLowerCase()] = c; + }, + + destroy : function() { + each(this.controls, function(c) { + c.destroy(); + }); + + this.controls = null; + } + }); +})(tinymce); + +(function(tinymce) { + var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera; + + tinymce.create('tinymce.WindowManager', { + WindowManager : function(ed) { + var t = this; + + t.editor = ed; + t.onOpen = new Dispatcher(t); + t.onClose = new Dispatcher(t); + t.params = {}; + t.features = {}; + }, + + open : function(s, p) { + var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u; + + // Default some options + s = s || {}; + p = p || {}; + sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window + sh = isOpera ? vp.h : screen.height; + s.name = s.name || 'mc_' + new Date().getTime(); + s.width = parseInt(s.width || 320); + s.height = parseInt(s.height || 240); + s.resizable = true; + s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0); + s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0); + p.inline = false; + p.mce_width = s.width; + p.mce_height = s.height; + p.mce_auto_focus = s.auto_focus; + + if (mo) { + if (isIE) { + s.center = true; + s.help = false; + s.dialogWidth = s.width + 'px'; + s.dialogHeight = s.height + 'px'; + s.scroll = s.scrollbars || false; + } + } + + // Build features string + each(s, function(v, k) { + if (tinymce.is(v, 'boolean')) + v = v ? 'yes' : 'no'; + + if (!/^(name|url)$/.test(k)) { + if (isIE && mo) + f += (f ? ';' : '') + k + ':' + v; + else + f += (f ? ',' : '') + k + '=' + v; + } + }); + + t.features = s; + t.params = p; + t.onOpen.dispatch(t, s, p); + + u = s.url || s.file; + u = tinymce._addVer(u); + + try { + if (isIE && mo) { + w = 1; + window.showModalDialog(u, window, f); + } else + w = window.open(u, s.name, f); + } catch (ex) { + // Ignore + } + + if (!w) + alert(t.editor.getLang('popup_blocked')); + }, + + close : function(w) { + w.close(); + this.onClose.dispatch(this); + }, + + createInstance : function(cl, a, b, c, d, e) { + var f = tinymce.resolve(cl); + + return new f(a, b, c, d, e); + }, + + confirm : function(t, cb, s, w) { + w = w || window; + + cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t)))); + }, + + alert : function(tx, cb, s, w) { + var t = this; + + w = w || window; + w.alert(t._decode(t.editor.getLang(tx, tx))); + + if (cb) + cb.call(s || t); + }, + + resizeBy : function(dw, dh, win) { + win.resizeBy(dw, dh); + }, + + // Internal functions + + _decode : function(s) { + return tinymce.DOM.decode(s).replace(/\\n/g, '\n'); + } + }); +}(tinymce)); +(function(tinymce) { + tinymce.Formatter = function(ed) { + var formats = {}, + each = tinymce.each, + dom = ed.dom, + selection = ed.selection, + TreeWalker = tinymce.dom.TreeWalker, + rangeUtils = new tinymce.dom.RangeUtils(dom), + isValid = ed.schema.isValidChild, + isBlock = dom.isBlock, + forcedRootBlock = ed.settings.forced_root_block, + nodeIndex = dom.nodeIndex, + INVISIBLE_CHAR = '\uFEFF', + MCE_ATTR_RE = /^(src|href|style)$/, + FALSE = false, + TRUE = true, + undefined, + pendingFormats = {apply : [], remove : []}; + + function isArray(obj) { + return obj instanceof Array; + }; + + function getParents(node, selector) { + return dom.getParents(node, selector, dom.getRoot()); + }; + + function isCaretNode(node) { + return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline'); + }; + + // Public functions + + function get(name) { + return name ? formats[name] : formats; + }; + + function register(name, format) { + if (name) { + if (typeof(name) !== 'string') { + each(name, function(format, name) { + register(name, format); + }); + } else { + // Force format into array and add it to internal collection + format = format.length ? format : [format]; + + each(format, function(format) { + // Set deep to false by default on selector formats this to avoid removing + // alignment on images inside paragraphs when alignment is changed on paragraphs + if (format.deep === undefined) + format.deep = !format.selector; + + // Default to true + if (format.split === undefined) + format.split = !format.selector || format.inline; + + // Default to true + if (format.remove === undefined && format.selector && !format.inline) + format.remove = 'none'; + + // Mark format as a mixed format inline + block level + if (format.selector && format.inline) { + format.mixed = true; + format.block_expand = true; + } + + // Split classes if needed + if (typeof(format.classes) === 'string') + format.classes = format.classes.split(/\s+/); + }); + + formats[name] = format; + } + } + }; + + var getTextDecoration = function(node) { + var decoration; + + ed.dom.getParent(node, function(n) { + decoration = ed.dom.getStyle(n, 'text-decoration'); + return decoration && decoration !== 'none'; + }); + + return decoration; + }; + + var processUnderlineAndColor = function(node) { + var textDecoration; + if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) { + textDecoration = getTextDecoration(node.parentNode); + if (ed.dom.getStyle(node, 'color') && textDecoration) { + ed.dom.setStyle(node, 'text-decoration', textDecoration); + } else if (ed.dom.getStyle(node, 'textdecoration') === textDecoration) { + ed.dom.setStyle(node, 'text-decoration', null); + } + } + }; + + function apply(name, vars, node) { + var formatList = get(name), format = formatList[0], bookmark, rng, i, isCollapsed = selection.isCollapsed(); + + function moveStart(rng) { + var container = rng.startContainer, + offset = rng.startOffset, + walker, node; + + // Move startContainer/startOffset in to a suitable node + if (container.nodeType == 1 || container.nodeValue === "") { + container = container.nodeType == 1 ? container.childNodes[offset] : container; + + // Might fail if the offset is behind the last element in it's container + if (container) { + walker = new TreeWalker(container, container.parentNode); + for (node = walker.current(); node; node = walker.next()) { + if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { + rng.setStart(node, 0); + break; + } + } + } + } + + return rng; + }; + + function setElementFormat(elm, fmt) { + fmt = fmt || format; + + if (elm) { + each(fmt.styles, function(value, name) { + dom.setStyle(elm, name, replaceVars(value, vars)); + }); + + each(fmt.attributes, function(value, name) { + dom.setAttrib(elm, name, replaceVars(value, vars)); + }); + + each(fmt.classes, function(value) { + value = replaceVars(value, vars); + + if (!dom.hasClass(elm, value)) + dom.addClass(elm, value); + }); + } + }; + + function applyRngStyle(rng) { + var newWrappers = [], wrapName, wrapElm; + + // Setup wrapper element + wrapName = format.inline || format.block; + wrapElm = dom.create(wrapName); + setElementFormat(wrapElm); + + rangeUtils.walk(rng, function(nodes) { + var currentWrapElm; + + function process(node) { + var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found; + + // Stop wrapping on br elements + if (isEq(nodeName, 'br')) { + currentWrapElm = 0; + + // Remove any br elements when we wrap things + if (format.block) + dom.remove(node); + + return; + } + + // If node is wrapper type + if (format.wrapper && matchNode(node, name, vars)) { + currentWrapElm = 0; + return; + } + + // Can we rename the block + if (format.block && !format.wrapper && isTextBlock(nodeName)) { + node = dom.rename(node, wrapName); + setElementFormat(node); + newWrappers.push(node); + currentWrapElm = 0; + return; + } + + // Handle selector patterns + if (format.selector) { + // Look for matching formats + each(formatList, function(format) { + // Check collapsed state if it exists + if ('collapsed' in format && format.collapsed !== isCollapsed) { + return; + } + + if (dom.is(node, format.selector) && !isCaretNode(node)) { + setElementFormat(node, format); + found = true; + } + }); + + // Continue processing if a selector match wasn't found and a inline element is defined + if (!format.inline || found) { + currentWrapElm = 0; + return; + } + } + + // Is it valid to wrap this item + if (isValid(wrapName, nodeName) && isValid(parentName, wrapName) && + !(node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279)) { + // Start wrapping + if (!currentWrapElm) { + // Wrap the node + currentWrapElm = wrapElm.cloneNode(FALSE); + node.parentNode.insertBefore(currentWrapElm, node); + newWrappers.push(currentWrapElm); + } + + currentWrapElm.appendChild(node); + } else { + // Start a new wrapper for possible children + currentWrapElm = 0; + + each(tinymce.grep(node.childNodes), process); + + // End the last wrapper + currentWrapElm = 0; + } + }; + + // Process siblings from range + each(nodes, process); + }); + + // Wrap links inside as well, for example color inside a link when the wrapper is around the link + if (format.wrap_links === false) { + each(newWrappers, function(node) { + function process(node) { + var i, currentWrapElm, children; + + if (node.nodeName === 'A') { + currentWrapElm = wrapElm.cloneNode(FALSE); + newWrappers.push(currentWrapElm); + + children = tinymce.grep(node.childNodes); + for (i = 0; i < children.length; i++) + currentWrapElm.appendChild(children[i]); + + node.appendChild(currentWrapElm); + } + + each(tinymce.grep(node.childNodes), process); + }; + + process(node); + }); + } + + // Cleanup + each(newWrappers, function(node) { + var childCount; + + function getChildCount(node) { + var count = 0; + + each(node.childNodes, function(node) { + if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) + count++; + }); + + return count; + }; + + function mergeStyles(node) { + var child, clone; + + each(node.childNodes, function(node) { + if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { + child = node; + return FALSE; // break loop + } + }); + + // If child was found and of the same type as the current node + if (child && matchName(child, format)) { + clone = child.cloneNode(FALSE); + setElementFormat(clone); + + dom.replace(clone, node, TRUE); + dom.remove(child, 1); + } + + return clone || node; + }; + + childCount = getChildCount(node); + + // Remove empty nodes but only if there is multiple wrappers and they are not block + // elements so never remove single <h1></h1> since that would remove the currrent empty block element where the caret is at + if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) { + dom.remove(node, 1); + return; + } + + if (format.inline || format.wrapper) { + // Merges the current node with it's children of similar type to reduce the number of elements + if (!format.exact && childCount === 1) + node = mergeStyles(node); + + // Remove/merge children + each(formatList, function(format) { + // Merge all children of similar type will move styles from child to parent + // this: <span style="color:red"><b><span style="color:red; font-size:10px">text</span></b></span> + // will become: <span style="color:red"><b><span style="font-size:10px">text</span></b></span> + each(dom.select(format.inline, node), function(child) { + var parent; + + // When wrap_links is set to false we don't want + // to remove the format on children within links + if (format.wrap_links === false) { + parent = child.parentNode; + + do { + if (parent.nodeName === 'A') + return; + } while (parent = parent.parentNode); + } + + removeFormat(format, vars, child, format.exact ? child : null); + }); + }); + + // Remove child if direct parent is of same type + if (matchNode(node.parentNode, name, vars)) { + dom.remove(node, 1); + node = 0; + return TRUE; + } + + // Look for parent with similar style format + if (format.merge_with_parents) { + dom.getParent(node.parentNode, function(parent) { + if (matchNode(parent, name, vars)) { + dom.remove(node, 1); + node = 0; + return TRUE; + } + }); + } + + // Merge next and previous siblings if they are similar <b>text</b><b>text</b> becomes <b>texttext</b> + if (node) { + node = mergeSiblings(getNonWhiteSpaceSibling(node), node); + node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); + } + } + }); + }; + + if (format) { + if (node) { + rng = dom.createRng(); + + rng.setStartBefore(node); + rng.setEndAfter(node); + + applyRngStyle(expandRng(rng, formatList)); + } else { + if (!isCollapsed || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { + // Obtain selection node before selection is unselected by applyRngStyle() + var curSelNode = ed.selection.getNode(); + + // Apply formatting to selection + bookmark = selection.getBookmark(); + applyRngStyle(expandRng(selection.getRng(TRUE), formatList)); + + // Colored nodes should be underlined so that the color of the underline matches the text color. + if (format.styles && (format.styles.color || format.styles.textDecoration)) { + tinymce.walk(curSelNode, processUnderlineAndColor, 'childNodes'); + processUnderlineAndColor(curSelNode); + } + + selection.moveToBookmark(bookmark); + selection.setRng(moveStart(selection.getRng(TRUE))); + ed.nodeChanged(); + } else + performCaretAction('apply', name, vars); + } + } + }; + + function remove(name, vars, node) { + var formatList = get(name), format = formatList[0], bookmark, i, rng; + + function moveStart(rng) { + var container = rng.startContainer, + offset = rng.startOffset, + walker, node, nodes, tmpNode; + + // Convert text node into index if possible + if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) { + container = container.parentNode; + offset = nodeIndex(container) + 1; + } + + // Move startContainer/startOffset in to a suitable node + if (container.nodeType == 1) { + nodes = container.childNodes; + container = nodes[Math.min(offset, nodes.length - 1)]; + walker = new TreeWalker(container); + + // If offset is at end of the parent node walk to the next one + if (offset > nodes.length - 1) + walker.next(); + + for (node = walker.current(); node; node = walker.next()) { + if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { + // IE has a "neat" feature where it moves the start node into the closest element + // we can avoid this by inserting an element before it and then remove it after we set the selection + tmpNode = dom.create('a', null, INVISIBLE_CHAR); + node.parentNode.insertBefore(tmpNode, node); + + // Set selection and remove tmpNode + rng.setStart(node, 0); + selection.setRng(rng); + dom.remove(tmpNode); + + return; + } + } + } + }; + + // Merges the styles for each node + function process(node) { + var children, i, l; + + // Grab the children first since the nodelist might be changed + children = tinymce.grep(node.childNodes); + + // Process current node + for (i = 0, l = formatList.length; i < l; i++) { + if (removeFormat(formatList[i], vars, node, node)) + break; + } + + // Process the children + if (format.deep) { + for (i = 0, l = children.length; i < l; i++) + process(children[i]); + } + }; + + function findFormatRoot(container) { + var formatRoot; + + // Find format root + each(getParents(container.parentNode).reverse(), function(parent) { + var format; + + // Find format root element + if (!formatRoot && parent.id != '_start' && parent.id != '_end') { + // Is the node matching the format we are looking for + format = matchNode(parent, name, vars); + if (format && format.split !== false) + formatRoot = parent; + } + }); + + return formatRoot; + }; + + function wrapAndSplit(format_root, container, target, split) { + var parent, clone, lastClone, firstClone, i, formatRootParent; + + // Format root found then clone formats and split it + if (format_root) { + formatRootParent = format_root.parentNode; + + for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { + clone = parent.cloneNode(FALSE); + + for (i = 0; i < formatList.length; i++) { + if (removeFormat(formatList[i], vars, clone, clone)) { + clone = 0; + break; + } + } + + // Build wrapper node + if (clone) { + if (lastClone) + clone.appendChild(lastClone); + + if (!firstClone) + firstClone = clone; + + lastClone = clone; + } + } + + // Never split block elements if the format is mixed + if (split && (!format.mixed || !isBlock(format_root))) + container = dom.split(format_root, container); + + // Wrap container in cloned formats + if (lastClone) { + target.parentNode.insertBefore(lastClone, target); + firstClone.appendChild(target); + } + } + + return container; + }; + + function splitToFormatRoot(container) { + return wrapAndSplit(findFormatRoot(container), container, container, true); + }; + + function unwrap(start) { + var node = dom.get(start ? '_start' : '_end'), + out = node[start ? 'firstChild' : 'lastChild']; + + // If the end is placed within the start the result will be removed + // So this checks if the out node is a bookmark node if it is it + // checks for another more suitable node + if (isBookmarkNode(out)) + out = out[start ? 'firstChild' : 'lastChild']; + + dom.remove(node, true); + + return out; + }; + + function removeRngStyle(rng) { + var startContainer, endContainer; + + rng = expandRng(rng, formatList, TRUE); + + if (format.split) { + startContainer = getContainer(rng, TRUE); + endContainer = getContainer(rng); + + if (startContainer != endContainer) { + // Wrap start/end nodes in span element since these might be cloned/moved + startContainer = wrap(startContainer, 'span', {id : '_start', 'data-mce-type' : 'bookmark'}); + endContainer = wrap(endContainer, 'span', {id : '_end', 'data-mce-type' : 'bookmark'}); + + // Split start/end + splitToFormatRoot(startContainer); + splitToFormatRoot(endContainer); + + // Unwrap start/end to get real elements again + startContainer = unwrap(TRUE); + endContainer = unwrap(); + } else + startContainer = endContainer = splitToFormatRoot(startContainer); + + // Update range positions since they might have changed after the split operations + rng.startContainer = startContainer.parentNode; + rng.startOffset = nodeIndex(startContainer); + rng.endContainer = endContainer.parentNode; + rng.endOffset = nodeIndex(endContainer) + 1; + } + + // Remove items between start/end + rangeUtils.walk(rng, function(nodes) { + each(nodes, function(node) { + process(node); + + // Remove parent span if it only contains text-decoration: underline, yet a parent node is also underlined. + if (node.nodeType === 1 && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && getTextDecoration(node.parentNode) === 'underline') { + removeFormat({'deep': false, 'exact': true, 'inline': 'span', 'styles': {'textDecoration' : 'underline'}}, null, node); + } + }); + }); + }; + + // Handle node + if (node) { + rng = dom.createRng(); + rng.setStartBefore(node); + rng.setEndAfter(node); + removeRngStyle(rng); + return; + } + + if (!selection.isCollapsed() || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { + bookmark = selection.getBookmark(); + removeRngStyle(selection.getRng(TRUE)); + selection.moveToBookmark(bookmark); + + // Check if start element still has formatting then we are at: "<b>text|</b>text" and need to move the start into the next text node + if (match(name, vars, selection.getStart())) { + moveStart(selection.getRng(true)); + } + + ed.nodeChanged(); + } else + performCaretAction('remove', name, vars); + }; + + function toggle(name, vars, node) { + var fmt = get(name); + + if (match(name, vars, node) && (!('toggle' in fmt[0]) || fmt[0]['toggle'])) + remove(name, vars, node); + else + apply(name, vars, node); + }; + + function matchNode(node, name, vars, similar) { + var formatList = get(name), format, i, classes; + + function matchItems(node, format, item_name) { + var key, value, items = format[item_name], i; + + // Check all items + if (items) { + // Non indexed object + if (items.length === undefined) { + for (key in items) { + if (items.hasOwnProperty(key)) { + if (item_name === 'attributes') + value = dom.getAttrib(node, key); + else + value = getStyle(node, key); + + if (similar && !value && !format.exact) + return; + + if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) + return; + } + } + } else { + // Only one match needed for indexed arrays + for (i = 0; i < items.length; i++) { + if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) + return format; + } + } + } + + return format; + }; + + if (formatList && node) { + // Check each format in list + for (i = 0; i < formatList.length; i++) { + format = formatList[i]; + + // Name name, attributes, styles and classes + if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { + // Match classes + if (classes = format.classes) { + for (i = 0; i < classes.length; i++) { + if (!dom.hasClass(node, classes[i])) + return; + } + } + + return format; + } + } + } + }; + + function match(name, vars, node) { + var startNode, i; + + function matchParents(node) { + // Find first node with similar format settings + node = dom.getParent(node, function(node) { + return !!matchNode(node, name, vars, true); + }); + + // Do an exact check on the similar format element + return matchNode(node, name, vars); + }; + + // Check specified node + if (node) + return matchParents(node); + + // Check pending formats + if (selection.isCollapsed()) { + for (i = pendingFormats.apply.length - 1; i >= 0; i--) { + if (pendingFormats.apply[i].name == name) + return true; + } + + for (i = pendingFormats.remove.length - 1; i >= 0; i--) { + if (pendingFormats.remove[i].name == name) + return false; + } + + return matchParents(selection.getNode()); + } + + // Check selected node + node = selection.getNode(); + if (matchParents(node)) + return TRUE; + + // Check start node if it's different + startNode = selection.getStart(); + if (startNode != node) { + if (matchParents(startNode)) + return TRUE; + } + + return FALSE; + }; + + function matchAll(names, vars) { + var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; + + // If the selection is collapsed then check pending formats + if (selection.isCollapsed()) { + for (ni = 0; ni < names.length; ni++) { + // If the name is to be removed, then stop it from being added + for (i = pendingFormats.remove.length - 1; i >= 0; i--) { + name = names[ni]; + + if (pendingFormats.remove[i].name == name) { + checkedMap[name] = true; + break; + } + } + } + + // If the format is to be applied + for (i = pendingFormats.apply.length - 1; i >= 0; i--) { + for (ni = 0; ni < names.length; ni++) { + name = names[ni]; + + if (!checkedMap[name] && pendingFormats.apply[i].name == name) { + checkedMap[name] = true; + matchedFormatNames.push(name); + } + } + } + } + + // Check start of selection for formats + startElement = selection.getStart(); + dom.getParent(startElement, function(node) { + var i, name; + + for (i = 0; i < names.length; i++) { + name = names[i]; + + if (!checkedMap[name] && matchNode(node, name, vars)) { + checkedMap[name] = true; + matchedFormatNames.push(name); + } + } + }); + + return matchedFormatNames; + }; + + function canApply(name) { + var formatList = get(name), startNode, parents, i, x, selector; + + if (formatList) { + startNode = selection.getStart(); + parents = getParents(startNode); + + for (x = formatList.length - 1; x >= 0; x--) { + selector = formatList[x].selector; + + // Format is not selector based, then always return TRUE + if (!selector) + return TRUE; + + for (i = parents.length - 1; i >= 0; i--) { + if (dom.is(parents[i], selector)) + return TRUE; + } + } + } + + return FALSE; + }; + + // Expose to public + tinymce.extend(this, { + get : get, + register : register, + apply : apply, + remove : remove, + toggle : toggle, + match : match, + matchAll : matchAll, + matchNode : matchNode, + canApply : canApply + }); + + // Private functions + + function matchName(node, format) { + // Check for inline match + if (isEq(node, format.inline)) + return TRUE; + + // Check for block match + if (isEq(node, format.block)) + return TRUE; + + // Check for selector match + if (format.selector) + return dom.is(node, format.selector); + }; + + function isEq(str1, str2) { + str1 = str1 || ''; + str2 = str2 || ''; + + str1 = '' + (str1.nodeName || str1); + str2 = '' + (str2.nodeName || str2); + + return str1.toLowerCase() == str2.toLowerCase(); + }; + + function getStyle(node, name) { + var styleVal = dom.getStyle(node, name); + + // Force the format to hex + if (name == 'color' || name == 'backgroundColor') + styleVal = dom.toHex(styleVal); + + // Opera will return bold as 700 + if (name == 'fontWeight' && styleVal == 700) + styleVal = 'bold'; + + return '' + styleVal; + }; + + function replaceVars(value, vars) { + if (typeof(value) != "string") + value = value(vars); + else if (vars) { + value = value.replace(/%(\w+)/g, function(str, name) { + return vars[name] || str; + }); + } + + return value; + }; + + function isWhiteSpaceNode(node) { + return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue); + }; + + function wrap(node, name, attrs) { + var wrapper = dom.create(name, attrs); + + node.parentNode.insertBefore(wrapper, node); + wrapper.appendChild(node); + + return wrapper; + }; + + function expandRng(rng, format, remove) { + var startContainer = rng.startContainer, + startOffset = rng.startOffset, + endContainer = rng.endContainer, + endOffset = rng.endOffset, sibling, lastIdx, leaf; + + // This function walks up the tree if there is no siblings before/after the node + function findParentContainer(container, child_name, sibling_name, root) { + var parent, child; + + root = root || dom.getRoot(); + + for (;;) { + // Check if we can move up are we at root level or body level + parent = container.parentNode; + + // Stop expanding on block elements or root depending on format + if (parent == root || (!format[0].block_expand && isBlock(parent))) + return container; + + for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) { + if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) + return container; + + if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) + return container; + } + + container = container.parentNode; + } + + return container; + }; + + // This function walks down the tree to find the leaf at the selection. + // The offset is also returned as if node initially a leaf, the offset may be in the middle of the text node. + function findLeaf(node, offset) { + if (offset === undefined) + offset = node.nodeType === 3 ? node.length : node.childNodes.length; + while (node && node.hasChildNodes()) { + node = node.childNodes[offset]; + if (node) + offset = node.nodeType === 3 ? node.length : node.childNodes.length; + } + return { node: node, offset: offset }; + } + + // If index based start position then resolve it + if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { + lastIdx = startContainer.childNodes.length - 1; + startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; + + if (startContainer.nodeType == 3) + startOffset = 0; + } + + // If index based end position then resolve it + if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { + lastIdx = endContainer.childNodes.length - 1; + endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; + + if (endContainer.nodeType == 3) + endOffset = endContainer.nodeValue.length; + } + + // Exclude bookmark nodes if possible + if (isBookmarkNode(startContainer.parentNode)) + startContainer = startContainer.parentNode; + + if (isBookmarkNode(startContainer)) + startContainer = startContainer.nextSibling || startContainer; + + if (isBookmarkNode(endContainer.parentNode)) { + endOffset = dom.nodeIndex(endContainer); + endContainer = endContainer.parentNode; + } + + if (isBookmarkNode(endContainer) && endContainer.previousSibling) { + endContainer = endContainer.previousSibling; + endOffset = endContainer.length; + } + + if (format[0].inline) { + // Avoid applying formatting to a trailing space. + leaf = findLeaf(endContainer, endOffset); + if (leaf.node) { + while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling) + leaf = findLeaf(leaf.node.previousSibling); + + if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 && + leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') { + + if (leaf.offset > 1) { + endContainer = leaf.node; + endContainer.splitText(leaf.offset - 1); + } else if (leaf.node.previousSibling) { + endContainer = leaf.node.previousSibling; + } + } + } + } + + // Move start/end point up the tree if the leaves are sharp and if we are in different containers + // Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>! + // This will reduce the number of wrapper elements that needs to be created + // Move start point up the tree + if (format[0].inline || format[0].block_expand) { + startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); + endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); + } + + // Expand start/end container to matching selector + if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { + function findSelectorEndPoint(container, sibling_name) { + var parents, i, y, curFormat; + + if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) + container = container[sibling_name]; + + parents = getParents(container); + for (i = 0; i < parents.length; i++) { + for (y = 0; y < format.length; y++) { + curFormat = format[y]; + + // If collapsed state is set then skip formats that doesn't match that + if ("collapsed" in curFormat && curFormat.collapsed !== rng.collapsed) + continue; + + if (dom.is(parents[i], curFormat.selector)) + return parents[i]; + } + } + + return container; + }; + + // Find new startContainer/endContainer if there is better one + startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); + endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); + } + + // Expand start/end container to matching block element or text node + if (format[0].block || format[0].selector) { + function findBlockEndPoint(container, sibling_name, sibling_name2) { + var node; + + // Expand to block of similar type + if (!format[0].wrapper) + node = dom.getParent(container, format[0].block); + + // Expand to first wrappable block element or any block element + if (!node) + node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); + + // Exclude inner lists from wrapping + if (node && format[0].wrapper) + node = getParents(node, 'ul,ol').reverse()[0] || node; + + // Didn't find a block element look for first/last wrappable element + if (!node) { + node = container; + + while (node[sibling_name] && !isBlock(node[sibling_name])) { + node = node[sibling_name]; + + // Break on BR but include it will be removed later on + // we can't remove it now since we need to check if it can be wrapped + if (isEq(node, 'br')) + break; + } + } + + return node || container; + }; + + // Find new startContainer/endContainer if there is better one + startContainer = findBlockEndPoint(startContainer, 'previousSibling'); + endContainer = findBlockEndPoint(endContainer, 'nextSibling'); + + // Non block element then try to expand up the leaf + if (format[0].block) { + if (!isBlock(startContainer)) + startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); + + if (!isBlock(endContainer)) + endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); + } + } + + // Setup index for startContainer + if (startContainer.nodeType == 1) { + startOffset = nodeIndex(startContainer); + startContainer = startContainer.parentNode; + } + + // Setup index for endContainer + if (endContainer.nodeType == 1) { + endOffset = nodeIndex(endContainer) + 1; + endContainer = endContainer.parentNode; + } + + // Return new range like object + return { + startContainer : startContainer, + startOffset : startOffset, + endContainer : endContainer, + endOffset : endOffset + }; + } + + function removeFormat(format, vars, node, compare_node) { + var i, attrs, stylesModified; + + // Check if node matches format + if (!matchName(node, format)) + return FALSE; + + // Should we compare with format attribs and styles + if (format.remove != 'all') { + // Remove styles + each(format.styles, function(value, name) { + value = replaceVars(value, vars); + + // Indexed array + if (typeof(name) === 'number') { + name = value; + compare_node = 0; + } + + if (!compare_node || isEq(getStyle(compare_node, name), value)) + dom.setStyle(node, name, ''); + + stylesModified = 1; + }); + + // Remove style attribute if it's empty + if (stylesModified && dom.getAttrib(node, 'style') == '') { + node.removeAttribute('style'); + node.removeAttribute('data-mce-style'); + } + + // Remove attributes + each(format.attributes, function(value, name) { + var valueOut; + + value = replaceVars(value, vars); + + // Indexed array + if (typeof(name) === 'number') { + name = value; + compare_node = 0; + } + + if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { + // Keep internal classes + if (name == 'class') { + value = dom.getAttrib(node, name); + if (value) { + // Build new class value where everything is removed except the internal prefixed classes + valueOut = ''; + each(value.split(/\s+/), function(cls) { + if (/mce\w+/.test(cls)) + valueOut += (valueOut ? ' ' : '') + cls; + }); + + // We got some internal classes left + if (valueOut) { + dom.setAttrib(node, name, valueOut); + return; + } + } + } + + // IE6 has a bug where the attribute doesn't get removed correctly + if (name == "class") + node.removeAttribute('className'); + + // Remove mce prefixed attributes + if (MCE_ATTR_RE.test(name)) + node.removeAttribute('data-mce-' + name); + + node.removeAttribute(name); + } + }); + + // Remove classes + each(format.classes, function(value) { + value = replaceVars(value, vars); + + if (!compare_node || dom.hasClass(compare_node, value)) + dom.removeClass(node, value); + }); + + // Check for non internal attributes + attrs = dom.getAttribs(node); + for (i = 0; i < attrs.length; i++) { + if (attrs[i].nodeName.indexOf('_') !== 0) + return FALSE; + } + } + + // Remove the inline child if it's empty for example <b> or <span> + if (format.remove != 'none') { + removeNode(node, format); + return TRUE; + } + }; + + function removeNode(node, format) { + var parentNode = node.parentNode, rootBlockElm; + + if (format.block) { + if (!forcedRootBlock) { + function find(node, next, inc) { + node = getNonWhiteSpaceSibling(node, next, inc); + + return !node || (node.nodeName == 'BR' || isBlock(node)); + }; + + // Append BR elements if needed before we remove the block + if (isBlock(node) && !isBlock(parentNode)) { + if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) + node.insertBefore(dom.create('br'), node.firstChild); + + if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) + node.appendChild(dom.create('br')); + } + } else { + // Wrap the block in a forcedRootBlock if we are at the root of document + if (parentNode == dom.getRoot()) { + if (!format.list_block || !isEq(node, format.list_block)) { + each(tinymce.grep(node.childNodes), function(node) { + if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { + if (!rootBlockElm) + rootBlockElm = wrap(node, forcedRootBlock); + else + rootBlockElm.appendChild(node); + } else + rootBlockElm = 0; + }); + } + } + } + } + + // Never remove nodes that isn't the specified inline element if a selector is specified too + if (format.selector && format.inline && !isEq(format.inline, node)) + return; + + dom.remove(node, 1); + }; + + function getNonWhiteSpaceSibling(node, next, inc) { + if (node) { + next = next ? 'nextSibling' : 'previousSibling'; + + for (node = inc ? node : node[next]; node; node = node[next]) { + if (node.nodeType == 1 || !isWhiteSpaceNode(node)) + return node; + } + } + }; + + function isBookmarkNode(node) { + return node && node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark'; + }; + + function mergeSiblings(prev, next) { + var marker, sibling, tmpSibling; + + function compareElements(node1, node2) { + // Not the same name + if (node1.nodeName != node2.nodeName) + return FALSE; + + function getAttribs(node) { + var attribs = {}; + + each(dom.getAttribs(node), function(attr) { + var name = attr.nodeName.toLowerCase(); + + // Don't compare internal attributes or style + if (name.indexOf('_') !== 0 && name !== 'style') + attribs[name] = dom.getAttrib(node, name); + }); + + return attribs; + }; + + function compareObjects(obj1, obj2) { + var value, name; + + for (name in obj1) { + // Obj1 has item obj2 doesn't have + if (obj1.hasOwnProperty(name)) { + value = obj2[name]; + + // Obj2 doesn't have obj1 item + if (value === undefined) + return FALSE; + + // Obj2 item has a different value + if (obj1[name] != value) + return FALSE; + + // Delete similar value + delete obj2[name]; + } + } + + // Check if obj 2 has something obj 1 doesn't have + for (name in obj2) { + // Obj2 has item obj1 doesn't have + if (obj2.hasOwnProperty(name)) + return FALSE; + } + + return TRUE; + }; + + // Attribs are not the same + if (!compareObjects(getAttribs(node1), getAttribs(node2))) + return FALSE; + + // Styles are not the same + if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) + return FALSE; + + return TRUE; + }; + + // Check if next/prev exists and that they are elements + if (prev && next) { + function findElementSibling(node, sibling_name) { + for (sibling = node; sibling; sibling = sibling[sibling_name]) { + if (sibling.nodeType == 3 && sibling.nodeValue.length !== 0) + return node; + + if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) + return sibling; + } + + return node; + }; + + // If previous sibling is empty then jump over it + prev = findElementSibling(prev, 'previousSibling'); + next = findElementSibling(next, 'nextSibling'); + + // Compare next and previous nodes + if (compareElements(prev, next)) { + // Append nodes between + for (sibling = prev.nextSibling; sibling && sibling != next;) { + tmpSibling = sibling; + sibling = sibling.nextSibling; + prev.appendChild(tmpSibling); + } + + // Remove next node + dom.remove(next); + + // Move children into prev node + each(tinymce.grep(next.childNodes), function(node) { + prev.appendChild(node); + }); + + return prev; + } + } + + return next; + }; + + function isTextBlock(name) { + return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); + }; + + function getContainer(rng, start) { + var container, offset, lastIdx; + + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + + if (container.nodeType == 1) { + lastIdx = container.childNodes.length - 1; + + if (!start && offset) + offset--; + + container = container.childNodes[offset > lastIdx ? lastIdx : offset]; + } + + return container; + }; + + function performCaretAction(type, name, vars) { + var i, currentPendingFormats = pendingFormats[type], + otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply']; + + function hasPending() { + return pendingFormats.apply.length || pendingFormats.remove.length; + }; + + function resetPending() { + pendingFormats.apply = []; + pendingFormats.remove = []; + }; + + function perform(caret_node) { + // Apply pending formats + each(pendingFormats.apply.reverse(), function(item) { + apply(item.name, item.vars, caret_node); + + // Colored nodes should be underlined so that the color of the underline matches the text color. + if (item.name === 'forecolor' && item.vars.value) + processUnderlineAndColor(caret_node.parentNode); + }); + + // Remove pending formats + each(pendingFormats.remove.reverse(), function(item) { + remove(item.name, item.vars, caret_node); + }); + + dom.remove(caret_node, 1); + resetPending(); + }; + + // Check if it already exists then ignore it + for (i = currentPendingFormats.length - 1; i >= 0; i--) { + if (currentPendingFormats[i].name == name) + return; + } + + currentPendingFormats.push({name : name, vars : vars}); + + // Check if it's in the other type, then remove it + for (i = otherPendingFormats.length - 1; i >= 0; i--) { + if (otherPendingFormats[i].name == name) + otherPendingFormats.splice(i, 1); + } + + // Pending apply or remove formats + if (hasPending()) { + ed.getDoc().execCommand('FontName', false, 'mceinline'); + pendingFormats.lastRng = selection.getRng(); + + // IE will convert the current word + each(dom.select('font,span'), function(node) { + var bookmark; + + if (isCaretNode(node)) { + bookmark = selection.getBookmark(); + perform(node); + selection.moveToBookmark(bookmark); + ed.nodeChanged(); + } + }); + + // Only register listeners once if we need to + if (!pendingFormats.isListening && hasPending()) { + pendingFormats.isListening = true; + + each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) { + ed[event].addToTop(function(ed, e) { + // Do we have pending formats and is the selection moved has moved + if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) { + each(dom.select('font,span'), function(node) { + var textNode, rng; + + // Look for marker + if (isCaretNode(node)) { + textNode = node.firstChild; + + if (textNode) { + perform(node); + + rng = dom.createRng(); + rng.setStart(textNode, textNode.nodeValue.length); + rng.setEnd(textNode, textNode.nodeValue.length); + selection.setRng(rng); + ed.nodeChanged(); + } else + dom.remove(node); + } + }); + + // Always unbind and clear pending styles on keyup + if (e.type == 'keyup' || e.type == 'mouseup') + resetPending(); + } + }); + }); + } + } + }; + }; +})(tinymce); + +tinymce.onAddEditor.add(function(tinymce, ed) { + var filters, fontSizes, dom, settings = ed.settings; + + if (settings.inline_styles) { + fontSizes = tinymce.explode(settings.font_size_style_values); + + function replaceWithSpan(node, styles) { + tinymce.each(styles, function(value, name) { + if (value) + dom.setStyle(node, name, value); + }); + + dom.rename(node, 'span'); + }; + + filters = { + font : function(dom, node) { + replaceWithSpan(node, { + backgroundColor : node.style.backgroundColor, + color : node.color, + fontFamily : node.face, + fontSize : fontSizes[parseInt(node.size) - 1] + }); + }, + + u : function(dom, node) { + replaceWithSpan(node, { + textDecoration : 'underline' + }); + }, + + strike : function(dom, node) { + replaceWithSpan(node, { + textDecoration : 'line-through' + }); + } + }; + + function convert(editor, params) { + dom = editor.dom; + + if (settings.convert_fonts_to_spans) { + tinymce.each(dom.select('font,u,strike', params.node), function(node) { + filters[node.nodeName.toLowerCase()](ed.dom, node); + }); + } + }; + + ed.onPreProcess.add(convert); + ed.onSetContent.add(convert); + + ed.onInit.add(function() { + ed.selection.onSetContent.add(convert); + }); + } +}); + diff --git a/js/tiny_mce/utils/editable_selects.js b/js/tiny_mce/utils/editable_selects.js new file mode 100644 index 000000000..6cf1b1660 --- /dev/null +++ b/js/tiny_mce/utils/editable_selects.js @@ -0,0 +1,70 @@ +/** + * editable_selects.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +var TinyMCE_EditableSelects = { + editSelectElm : null, + + init : function() { + var nl = document.getElementsByTagName("select"), i, d = document, o; + + for (i=0; i<nl.length; i++) { + if (nl[i].className.indexOf('mceEditableSelect') != -1) { + o = new Option('(value)', '__mce_add_custom__'); + + o.className = 'mceAddSelectValue'; + + nl[i].options[nl[i].options.length] = o; + nl[i].onchange = TinyMCE_EditableSelects.onChangeEditableSelect; + } + } + }, + + onChangeEditableSelect : function(e) { + var d = document, ne, se = window.event ? window.event.srcElement : e.target; + + if (se.options[se.selectedIndex].value == '__mce_add_custom__') { + ne = d.createElement("input"); + ne.id = se.id + "_custom"; + ne.name = se.name + "_custom"; + ne.type = "text"; + + ne.style.width = se.offsetWidth + 'px'; + se.parentNode.insertBefore(ne, se); + se.style.display = 'none'; + ne.focus(); + ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput; + ne.onkeydown = TinyMCE_EditableSelects.onKeyDown; + TinyMCE_EditableSelects.editSelectElm = se; + } + }, + + onBlurEditableSelectInput : function() { + var se = TinyMCE_EditableSelects.editSelectElm; + + if (se) { + if (se.previousSibling.value != '') { + addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value); + selectByValue(document.forms[0], se.id, se.previousSibling.value); + } else + selectByValue(document.forms[0], se.id, ''); + + se.style.display = 'inline'; + se.parentNode.removeChild(se.previousSibling); + TinyMCE_EditableSelects.editSelectElm = null; + } + }, + + onKeyDown : function(e) { + e = e || window.event; + + if (e.keyCode == 13) + TinyMCE_EditableSelects.onBlurEditableSelectInput(); + } +}; diff --git a/js/tiny_mce/utils/form_utils.js b/js/tiny_mce/utils/form_utils.js new file mode 100644 index 000000000..6f62fe606 --- /dev/null +++ b/js/tiny_mce/utils/form_utils.js @@ -0,0 +1,210 @@ +/** + * form_utils.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme")); + +function getColorPickerHTML(id, target_form_element) { + var h = "", dom = tinyMCEPopup.dom; + + if (label = dom.select('label[for=' + target_form_element + ']')[0]) { + label.id = label.id || dom.uniqueId(); + } + + h += '<a role="button" aria-labelledby="' + id + '_label" id="' + id + '_link" href="javascript:;" onclick="tinyMCEPopup.pickColor(event,\'' + target_form_element +'\');" onmousedown="return false;" class="pickcolor">'; + h += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '">&nbsp;<span id="' + id + '_label" class="mceVoiceLabel mceIconOnly" style="display:none;">' + tinyMCEPopup.getLang('browse') + '</span></span></a>'; + + return h; +} + +function updateColor(img_id, form_element_id) { + document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; +} + +function setBrowserDisabled(id, state) { + var img = document.getElementById(id); + var lnk = document.getElementById(id + "_link"); + + if (lnk) { + if (state) { + lnk.setAttribute("realhref", lnk.getAttribute("href")); + lnk.removeAttribute("href"); + tinyMCEPopup.dom.addClass(img, 'disabled'); + } else { + if (lnk.getAttribute("realhref")) + lnk.setAttribute("href", lnk.getAttribute("realhref")); + + tinyMCEPopup.dom.removeClass(img, 'disabled'); + } + } +} + +function getBrowserHTML(id, target_form_element, type, prefix) { + var option = prefix + "_" + type + "_browser_callback", cb, html; + + cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); + + if (!cb) + return ""; + + html = ""; + html += '<a id="' + id + '_link" href="javascript:openBrowser(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;" class="browse">'; + html += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '">&nbsp;</span></a>'; + + return html; +} + +function openBrowser(img_id, target_form_element, type, option) { + var img = document.getElementById(img_id); + + if (img.className != "mceButtonDisabled") + tinyMCEPopup.openBrowser(target_form_element, type, option); +} + +function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { + if (!form_obj || !form_obj.elements[field_name]) + return; + + if (!value) + value = ""; + + var sel = form_obj.elements[field_name]; + + var found = false; + for (var i=0; i<sel.options.length; i++) { + var option = sel.options[i]; + + if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { + option.selected = true; + found = true; + } else + option.selected = false; + } + + if (!found && add_custom && value != '') { + var option = new Option(value, value); + option.selected = true; + sel.options[sel.options.length] = option; + sel.selectedIndex = sel.options.length - 1; + } + + return found; +} + +function getSelectValue(form_obj, field_name) { + var elm = form_obj.elements[field_name]; + + if (elm == null || elm.options == null || elm.selectedIndex === -1) + return ""; + + return elm.options[elm.selectedIndex].value; +} + +function addSelectValue(form_obj, field_name, name, value) { + var s = form_obj.elements[field_name]; + var o = new Option(name, value); + s.options[s.options.length] = o; +} + +function addClassesToList(list_id, specific_option) { + // Setup class droplist + var styleSelectElm = document.getElementById(list_id); + var styles = tinyMCEPopup.getParam('theme_advanced_styles', false); + styles = tinyMCEPopup.getParam(specific_option, styles); + + if (styles) { + var stylesAr = styles.split(';'); + + for (var i=0; i<stylesAr.length; i++) { + if (stylesAr != "") { + var key, value; + + key = stylesAr[i].split('=')[0]; + value = stylesAr[i].split('=')[1]; + + styleSelectElm.options[styleSelectElm.length] = new Option(key, value); + } + } + } else { + tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) { + styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']); + }); + } +} + +function isVisible(element_id) { + var elm = document.getElementById(element_id); + + return elm && elm.style.display != "none"; +} + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return "rgb(" + r + "," + g + "," + b + ")"; + } + + return col; +} + +function trimSize(size) { + return size.replace(/([0-9\.]+)(px|%|in|cm|mm|em|ex|pt|pc)/i, '$1$2'); +} + +function getCSSSize(size) { + size = trimSize(size); + + if (size == "") + return ""; + + // Add px + if (/^[0-9]+$/.test(size)) + size += 'px'; + // Sanity check, IE doesn't like broken values + else if (!(/^[0-9\.]+(px|%|in|cm|mm|em|ex|pt|pc)$/i.test(size))) + return ""; + + return size; +} + +function getStyle(elm, attrib, style) { + var val = tinyMCEPopup.dom.getAttrib(elm, attrib); + + if (val != '') + return '' + val; + + if (typeof(style) == 'undefined') + style = attrib; + + return tinyMCEPopup.dom.getStyle(elm, style); +} diff --git a/js/tiny_mce/utils/mctabs.js b/js/tiny_mce/utils/mctabs.js new file mode 100644 index 000000000..027ef40e7 --- /dev/null +++ b/js/tiny_mce/utils/mctabs.js @@ -0,0 +1,162 @@ +/** + * mctabs.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +function MCTabs() { + this.settings = []; + this.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher'); +}; + +MCTabs.prototype.init = function(settings) { + this.settings = settings; +}; + +MCTabs.prototype.getParam = function(name, default_value) { + var value = null; + + value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; + + // Fix bool values + if (value == "true" || value == "false") + return (value == "true"); + + return value; +}; + +MCTabs.prototype.showTab =function(tab){ + tab.className = 'current'; + tab.setAttribute("aria-selected", true); + tab.setAttribute("aria-expanded", true); + tab.tabIndex = 0; +}; + +MCTabs.prototype.hideTab =function(tab){ + var t=this; + + tab.className = ''; + tab.setAttribute("aria-selected", false); + tab.setAttribute("aria-expanded", false); + tab.tabIndex = -1; +}; + +MCTabs.prototype.showPanel = function(panel) { + panel.className = 'current'; + panel.setAttribute("aria-hidden", false); +}; + +MCTabs.prototype.hidePanel = function(panel) { + panel.className = 'panel'; + panel.setAttribute("aria-hidden", true); +}; + +MCTabs.prototype.getPanelForTab = function(tabElm) { + return tinyMCEPopup.dom.getAttrib(tabElm, "aria-controls"); +}; + +MCTabs.prototype.displayTab = function(tab_id, panel_id, avoid_focus) { + var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this; + + tabElm = document.getElementById(tab_id); + + if (panel_id === undefined) { + panel_id = t.getPanelForTab(tabElm); + } + + panelElm= document.getElementById(panel_id); + panelContainerElm = panelElm ? panelElm.parentNode : null; + tabContainerElm = tabElm ? tabElm.parentNode : null; + selectionClass = t.getParam('selection_class', 'current'); + + if (tabElm && tabContainerElm) { + nodes = tabContainerElm.childNodes; + + // Hide all other tabs + for (i = 0; i < nodes.length; i++) { + if (nodes[i].nodeName == "LI") { + t.hideTab(nodes[i]); + } + } + + // Show selected tab + t.showTab(tabElm); + } + + if (panelElm && panelContainerElm) { + nodes = panelContainerElm.childNodes; + + // Hide all other panels + for (i = 0; i < nodes.length; i++) { + if (nodes[i].nodeName == "DIV") + t.hidePanel(nodes[i]); + } + + if (!avoid_focus) { + tabElm.focus(); + } + + // Show selected panel + t.showPanel(panelElm); + } +}; + +MCTabs.prototype.getAnchor = function() { + var pos, url = document.location.href; + + if ((pos = url.lastIndexOf('#')) != -1) + return url.substring(pos + 1); + + return ""; +}; + + +//Global instance +var mcTabs = new MCTabs(); + +tinyMCEPopup.onInit.add(function() { + var tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each; + + each(dom.select('div.tabs'), function(tabContainerElm) { + var keyNav; + + dom.setAttrib(tabContainerElm, "role", "tablist"); + + var items = tinyMCEPopup.dom.select('li', tabContainerElm); + var action = function(id) { + mcTabs.displayTab(id, mcTabs.getPanelForTab(id)); + mcTabs.onChange.dispatch(id); + }; + + each(items, function(item) { + dom.setAttrib(item, 'role', 'tab'); + dom.bind(item, 'click', function(evt) { + action(item.id); + }); + }); + + dom.bind(dom.getRoot(), 'keydown', function(evt) { + if (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab + keyNav.moveFocus(evt.shiftKey ? -1 : 1); + tinymce.dom.Event.cancel(evt); + } + }); + + each(dom.select('a', tabContainerElm), function(a) { + dom.setAttrib(a, 'tabindex', '-1'); + }); + + keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: tabContainerElm, + items: items, + onAction: action, + actOnFocus: true, + enableLeftRight: true, + enableUpDown: true + }, tinyMCEPopup.dom); + }); +}); \ No newline at end of file diff --git a/js/tiny_mce/utils/validate.js b/js/tiny_mce/utils/validate.js new file mode 100644 index 000000000..3dcf0dd18 --- /dev/null +++ b/js/tiny_mce/utils/validate.js @@ -0,0 +1,252 @@ +/** + * validate.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +/** + // String validation: + + if (!Validator.isEmail('myemail')) + alert('Invalid email.'); + + // Form validation: + + var f = document.forms['myform']; + + if (!Validator.isEmail(f.myemail)) + alert('Invalid email.'); +*/ + +var Validator = { + isEmail : function(s) { + return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$'); + }, + + isAbsUrl : function(s) { + return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$'); + }, + + isSize : function(s) { + return this.test(s, '^[0-9]+(%|in|cm|mm|em|ex|pt|pc|px)?$'); + }, + + isId : function(s) { + return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$'); + }, + + isEmpty : function(s) { + var nl, i; + + if (s.nodeName == 'SELECT' && s.selectedIndex < 1) + return true; + + if (s.type == 'checkbox' && !s.checked) + return true; + + if (s.type == 'radio') { + for (i=0, nl = s.form.elements; i<nl.length; i++) { + if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked) + return false; + } + + return true; + } + + return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s); + }, + + isNumber : function(s, d) { + return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$')); + }, + + test : function(s, p) { + s = s.nodeType == 1 ? s.value : s; + + return s == '' || new RegExp(p).test(s); + } +}; + +var AutoValidator = { + settings : { + id_cls : 'id', + int_cls : 'int', + url_cls : 'url', + number_cls : 'number', + email_cls : 'email', + size_cls : 'size', + required_cls : 'required', + invalid_cls : 'invalid', + min_cls : 'min', + max_cls : 'max' + }, + + init : function(s) { + var n; + + for (n in s) + this.settings[n] = s[n]; + }, + + validate : function(f) { + var i, nl, s = this.settings, c = 0; + + nl = this.tags(f, 'label'); + for (i=0; i<nl.length; i++) { + this.removeClass(nl[i], s.invalid_cls); + nl[i].setAttribute('aria-invalid', false); + } + + c += this.validateElms(f, 'input'); + c += this.validateElms(f, 'select'); + c += this.validateElms(f, 'textarea'); + + return c == 3; + }, + + invalidate : function(n) { + this.mark(n.form, n); + }, + + getErrorMessages : function(f) { + var nl, i, s = this.settings, field, msg, values, messages = [], ed = tinyMCEPopup.editor; + nl = this.tags(f, "label"); + for (i=0; i<nl.length; i++) { + if (this.hasClass(nl[i], s.invalid_cls)) { + field = document.getElementById(nl[i].getAttribute("for")); + values = { field: nl[i].textContent }; + if (this.hasClass(field, s.min_cls, true)) { + message = ed.getLang('invalid_data_min'); + values.min = this.getNum(field, s.min_cls); + } else if (this.hasClass(field, s.number_cls)) { + message = ed.getLang('invalid_data_number'); + } else if (this.hasClass(field, s.size_cls)) { + message = ed.getLang('invalid_data_size'); + } else { + message = ed.getLang('invalid_data'); + } + + message = message.replace(/{\#([^}]+)\}/g, function(a, b) { + return values[b] || '{#' + b + '}'; + }); + messages.push(message); + } + } + return messages; + }, + + reset : function(e) { + var t = ['label', 'input', 'select', 'textarea']; + var i, j, nl, s = this.settings; + + if (e == null) + return; + + for (i=0; i<t.length; i++) { + nl = this.tags(e.form ? e.form : e, t[i]); + for (j=0; j<nl.length; j++) { + this.removeClass(nl[j], s.invalid_cls); + nl[j].setAttribute('aria-invalid', false); + } + } + }, + + validateElms : function(f, e) { + var nl, i, n, s = this.settings, st = true, va = Validator, v; + + nl = this.tags(f, e); + for (i=0; i<nl.length; i++) { + n = nl[i]; + + this.removeClass(n, s.invalid_cls); + + if (this.hasClass(n, s.required_cls) && va.isEmpty(n)) + st = this.mark(f, n); + + if (this.hasClass(n, s.number_cls) && !va.isNumber(n)) + st = this.mark(f, n); + + if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true)) + st = this.mark(f, n); + + if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n)) + st = this.mark(f, n); + + if (this.hasClass(n, s.email_cls) && !va.isEmail(n)) + st = this.mark(f, n); + + if (this.hasClass(n, s.size_cls) && !va.isSize(n)) + st = this.mark(f, n); + + if (this.hasClass(n, s.id_cls) && !va.isId(n)) + st = this.mark(f, n); + + if (this.hasClass(n, s.min_cls, true)) { + v = this.getNum(n, s.min_cls); + + if (isNaN(v) || parseInt(n.value) < parseInt(v)) + st = this.mark(f, n); + } + + if (this.hasClass(n, s.max_cls, true)) { + v = this.getNum(n, s.max_cls); + + if (isNaN(v) || parseInt(n.value) > parseInt(v)) + st = this.mark(f, n); + } + } + + return st; + }, + + hasClass : function(n, c, d) { + return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); + }, + + getNum : function(n, c) { + c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; + c = c.replace(/[^0-9]/g, ''); + + return c; + }, + + addClass : function(n, c, b) { + var o = this.removeClass(n, c); + n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; + }, + + removeClass : function(n, c) { + c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); + return n.className = c != ' ' ? c : ''; + }, + + tags : function(f, s) { + return f.getElementsByTagName(s); + }, + + mark : function(f, n) { + var s = this.settings; + + this.addClass(n, s.invalid_cls); + n.setAttribute('aria-invalid', 'true'); + this.markLabels(f, n, s.invalid_cls); + + return false; + }, + + markLabels : function(f, n, ic) { + var nl, i; + + nl = this.tags(f, "label"); + for (i=0; i<nl.length; i++) { + if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id) + this.addClass(nl[i], ic); + } + + return null; + } +}; diff --git a/js/tinymce.inc.js b/js/tinymce.inc.js new file mode 100644 index 000000000..1a43ddcd5 --- /dev/null +++ b/js/tinymce.inc.js @@ -0,0 +1,54 @@ + tinyMCE.init({ + mode : "specific_textareas", + theme : "advanced", + skin:"cirkuit", + editor_selector : "rte", + editor_deselector : "noEditor", + plugins : "safari,pagebreak,style,table,advimage,advlink,inlinepopups,media,contextmenu,paste,fullscreen,xhtmlxtras,preview", + // Theme options + theme_advanced_buttons1 : "newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", + theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,,|,forecolor,backcolor", + theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,media,|,ltr,rtl,|,fullscreen", + theme_advanced_buttons4 : "styleprops,|,cite,abbr,acronym,del,ins,attribs,pagebreak", + theme_advanced_toolbar_location : "top", + theme_advanced_toolbar_align : "left", + theme_advanced_statusbar_location : "bottom", + theme_advanced_resizing : false, + content_css : pathCSS+"global.css", + document_base_url : ad, + width: "600", + height: "auto", + font_size_style_values : "8pt, 10pt, 12pt, 14pt, 18pt, 24pt, 36pt", + elements : "nourlconvert,ajaxfilemanager", + file_browser_callback : "ajaxfilemanager", + entity_encoding: "raw", + convert_urls : false, + language : iso + + }); + + function ajaxfilemanager(field_name, url, type, win) { + var ajaxfilemanagerurl = ad+"/ajaxfilemanager/ajaxfilemanager.php"; + switch (type) { + case "image": + break; + case "media": + break; + case "flash": + break; + case "file": + break; + default: + return false; + } + tinyMCE.activeEditor.windowManager.open({ + url: ajaxfilemanagerurl, + width: 782, + height: 440, + inline : "yes", + close_previous : "no" + },{ + window : win, + input : field_name + }); +} diff --git a/js/toggle.js b/js/toggle.js new file mode 100644 index 000000000..3e1cccddc --- /dev/null +++ b/js/toggle.js @@ -0,0 +1,48 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function toggleLayer(whichLayer, flag) +{ + if (!flag) + $(whichLayer).hide(); + else + $(whichLayer).show(); +} + +function openCloseLayer(whichLayer, action) +{ + if (!action) + { + if ($(whichLayer).css('display') == 'none') + $(whichLayer).show(); + else + $(whichLayer).hide(); + } + else if (action == 'open') + $(whichLayer).show(); + else if (action == 'close') + $(whichLayer).hide(); +} \ No newline at end of file diff --git a/js/tools.js b/js/tools.js new file mode 100644 index 000000000..bca03092a --- /dev/null +++ b/js/tools.js @@ -0,0 +1,234 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7448 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function ps_round(value, precision) +{ + if (typeof(roundMode) == 'undefined') + roundMode = 2; + if (typeof(precision) == 'undefined') + precision = 2; + + method = roundMode; + if (method == 0) + return ceilf(value, precision); + else if (method == 1) + return floorf(value, precision); + precisionFactor = precision == 0 ? 1 : Math.pow(10, precision); + return Math.round(value * precisionFactor) / precisionFactor; +} + +function autoUrl(name, dest) +{ + var loc; + var id_list; + + id_list = document.getElementById(name); + loc = id_list.options[id_list.selectedIndex].value; + if (loc != 0) + location.href = dest+loc; + return ; +} + +function autoUrlNoList(name, dest) +{ + var loc; + + loc = document.getElementById(name).checked; + location.href = dest + (loc == true ? 1 : 0); + return ; +} + +/* +** show or hide element e depending on condition show +*/ +function toggle(e, show) +{ + e.style.display = show ? '' : 'none'; +} + +function toggleMultiple(tab) +{ + var len = tab.length; + + for (var i = 0; i < len; i++) + if (tab[i].style) + toggle(tab[i], tab[i].style.display == 'none'); +} + +/** +* Show dynamicaly an element by changing the sytle "display" property +* depending on the option selected in a select. +* +* @param string $select_id id of the select who controls the display +* @param string $elem_id prefix id of the elements controlled by the select +* the real id must be : 'elem_id'+nb with nb the corresponding number in the +* select (starting with 0). +*/ +function showElemFromSelect(select_id, elem_id) +{ + var select = document.getElementById(select_id); + for (var i = 0; i < select.length; ++i) + { + var elem = document.getElementById(elem_id + select.options[i].value); + if (elem != null) + toggle(elem, i == select.selectedIndex); + } +} + +/** +* Get all div with specified name and for each one (by id), toggle their visibility +*/ +function openCloseAllDiv(name, option) +{ + var tab = $('*[name='+name+']'); + for (var i = 0; i < tab.length; ++i) + toggle(tab[i], option); +} + +/** +* Toggle the value of the element id_button between text1 and text2 +*/ +function toggleElemValue(id_button, text1, text2) +{ + var obj = document.getElementById(id_button); + if (obj) + obj.value = ((!obj.value || obj.value == text2) ? text1 : text2); +} + +function addBookmark(url, title) +{ + if (window.sidebar) + return window.sidebar.addPanel(title, url, ""); + else if ( window.external ) + return window.external.AddFavorite( url, title); + else if (window.opera && window.print) + return true; + return true; +} + +function writeBookmarkLink(url, title, text, img) +{ + var insert = ''; + if (img) + insert = writeBookmarkLinkObject(url, title, '<img src="' + img + '" alt="' + escape(text) + '" title="' + escape(text) + '" />') + '&nbsp'; + insert += writeBookmarkLinkObject(url, title, text); + document.write(insert); +} + +function writeBookmarkLinkObject(url, title, insert) +{ + if (window.navigator.userAgent.indexOf('Chrome') != -1) + return (''); + else if (window.sidebar || window.external) + return ('<a href="javascript:addBookmark(\'' + escape(url) + '\', \'' + escape(title) + '\')">' + insert + '</a>'); + else if (window.opera && window.print) + return ('<a rel="sidebar" href="' + escape(url) + '" title="' + escape(title) + '">' + insert + '</a>'); + return (''); +} + +function checkCustomizations() +{ + var pattern = new RegExp(' ?filled ?'); + + if (typeof customizationFields != 'undefined') + for (var i = 0; i < customizationFields.length; i++) + /* If the field is required and empty then we abort */ + if (parseInt(customizationFields[i][1]) == 1 && ($('#' + customizationFields[i][0]).html() == '' || $('#' + customizationFields[i][0]).html() != $('#' + customizationFields[i][0]).val()) && !pattern.test($('#' + customizationFields[i][0]).attr('class'))) + return false; + return true; +} + +function emptyCustomizations() +{ + if(typeof(customizationFields) == 'undefined') return; + + for (var i = 0; i < customizationFields.length; i++) + { + $('#' + customizationFields[i][0]).html(''); + $('#' + customizationFields[i][0]).val(''); + } +} + +function ceilf(value, precision) +{ + if (typeof(precision) == 'undefined') + precision = 0; + var precisionFactor = precision == 0 ? 1 : Math.pow(10, precision); + var tmp = value * precisionFactor; + var tmp2 = tmp.toString(); + // If the current value has already the desired precision + if (tmp2.indexOf('.') === false) + return (value); + if (tmp2.charAt(tmp2.length - 1) == 0) + return value; + return Math.ceil(tmp) / precisionFactor; +} + +function floorf(value, precision) +{ + if (typeof(precision) == 'undefined') + precision = 0; + var precisionFactor = precision == 0 ? 1 : Math.pow(10, precision); + var tmp = value * precisionFactor; + var tmp2 = tmp.toString(); + // If the current value has already the desired precision + if (tmp2.indexOf('.') === false) + return (value); + if (tmp2.charAt(tmp2.length - 1) == 0) + return value; + return Math.floor(tmp) / precisionFactor; +} + +function setCurrency(id_currency) +{ + $.ajax({ + type: 'POST', + url: baseDir + 'index.php', + data: 'controller=change-currency&id_currency='+ parseInt(id_currency), + success: function(msg) + { + location.reload(true); + } + }); +} + +function isArrowKey(k_ev) +{ + var unicode=k_ev.keyCode? k_ev.keyCode : k_ev.charCode; + if (unicode >= 37 && unicode <= 40) + return true; + +} + +//On dom ready +$().ready(function() +{ + // Hide all elements with .hideOnSubmit class when parent form is submit + $('form').submit(function() + { + $(this).find('.hideOnSubmit').hide(); + }); +}); diff --git a/localization/ar.xml b/localization/ar.xml new file mode 100644 index 000000000..ac44566b4 --- /dev/null +++ b/localization/ar.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Argentina" version="1.0"> + <currencies> + <currency name="Argentina Peso" iso_code="ARS" iso_code_num="032" sign="ARS" blank="1" conversion_rate="5.39" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ag" /> + </languages> + <taxes> + <tax id="1" name="IVA AR 21%" rate="21" /> + + <taxRulesGroup name="AR Standard rate (21%)"> + <taxRule iso_code_country="ar" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="libra" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="pie" /> + <unit type="base_distance" value="cuadra" /> + <unit type="long_distance" value="braza" /> + </units> +</localizationPack> diff --git a/localization/at.xml b/localization/at.xml new file mode 100644 index 000000000..0030534b8 --- /dev/null +++ b/localization/at.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Austria" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="de" /> + </languages> + <taxes> + <tax id="1" name="USt. AT 20%" rate="20" /> + <tax id="2" name="USt. AT 10%" rate="10" /> + + <taxRulesGroup name="AT Standard rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="AT Reduced Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="AT Foodstuff Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="faden" /> + <unit type="base_distance" value="faden" /> + <unit type="long_distance" value="meile" /> + </units> +</localizationPack> diff --git a/localization/au.xml b/localization/au.xml new file mode 100644 index 000000000..e232c0d9e --- /dev/null +++ b/localization/au.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Australia" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="AUD" iso_code_num="036" sign="$" blank="0" conversion_rate="1.40554" format="1" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="GST AU 10%" rate="10" /> + <taxRulesGroup name="AU Standard rate (10%)"> + <taxRule iso_code_country="au" id_tax="1" /> + </taxRulesGroup> + </taxes> + <states> + <state name="Australian Capital Territory" iso_code="ACT" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="Victoria" iso_code="VIC" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="Tasmania" iso_code="TAS" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="New South Wales" iso_code="NSW" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="Northern Territory" iso_code="NT" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="Queensland" iso_code="QLD" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="South Australia" iso_code="SA" country="AU" zone="Oceania" tax_behavior="0" /> + <state name="Western Australia" iso_code="WA" country="AU" zone="Oceania" tax_behavior="0" /> + </states> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> + diff --git a/localization/az.xml b/localization/az.xml new file mode 100644 index 000000000..d67ff63ae --- /dev/null +++ b/localization/az.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Azerbaijan" version="1.0"> + <currencies> + <currency name="Manat" iso_code="AZN" iso_code_num="944" sign="ман" blank="1" conversion_rate="1.09237" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="az" /> + </languages> + <taxes> + <tax id="1" name="ƏDV AZ 18%" rate="18" /> + <tax id="2" name="ƏDV AZ 10.5%" rate="10.5" /> + + <taxRulesGroup name="AZ Standard Rate (18%)"> + <taxRule iso_code_country="az" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="AZ Reduced Rate (10.5%)"> + <taxRule iso_code_country="az" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/be.xml b/localization/be.xml new file mode 100644 index 000000000..bbdd774de --- /dev/null +++ b/localization/be.xml @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Belgium" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="fr" /> + <language iso_code="de" /> + <language iso_code="nl" /> + </languages> + <taxes> + <tax id="1" name="TVA BE 21%" rate="21" /> + <tax id="2" name="TVA BE 12%" rate="12" /> + <tax id="3" name="TVA BE 6%" rate="6" /> + + <taxRulesGroup name="BE Standard Rate (21%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="BE Reduced Rate (12%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="BE Super Reduced Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="BE Foodstuff Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="BE Books Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/bg.xml b/localization/bg.xml new file mode 100644 index 000000000..553491ce7 --- /dev/null +++ b/localization/bg.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Bulgaria" version="1.0"> + <currencies> + <currency name="Lev" iso_code="BGN" iso_code_num="975" sign="лв" blank="1" conversion_rate="1.95580" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="bg" /> + </languages> + <taxes> + <tax id="1" name="ДДС BG 20%" rate="20" /> + <tax id="2" name="ДДС BG 7%" rate="7" /> + + <taxRulesGroup name="BG Standard Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="BG Reduced Rate (7%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="BG Foodstuff Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="BG Books Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/bo.xml b/localization/bo.xml new file mode 100644 index 000000000..7e4812f5c --- /dev/null +++ b/localization/bo.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Bolivia" version="1.0"> + <currencies> + <currency name="Boliviano" iso_code="BOB" iso_code_num="068" sign="$b" blank="1" conversion_rate="9.57620" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA BO 13%" rate="19" /> + + <taxRulesGroup name="BO Standard rate (19%)"> + <taxRule iso_code_country="bo" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/br.xml b/localization/br.xml new file mode 100644 index 000000000..4e4324b1c --- /dev/null +++ b/localization/br.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Brazil" version="1.0"> + <currencies> + <currency name="Real" iso_code="BRL" iso_code_num="986" sign="R$" blank="1" conversion_rate="2.31583" format="3" decimals="1" /> + </currencies> + <languages> + <language iso_code="br" /> + </languages> + <taxes> + <tax id="1" name="IPI BR 12%" rate="12" /> + <tax id="2" name="ICMS BR 25%" rate="25" /> + <tax id="3" name="ISS BR 5%" rate="5" /> + + <taxRulesGroup name="BR ICMS (25%)"> + <taxRule iso_code_country="br" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="BR IPI (12%)"> + <taxRule iso_code_country="br" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="BR ISS (5%)"> + <taxRule iso_code_country="br" id_tax="3" /> + </taxRulesGroup> + </taxes> + <states> + <state name="Acre" iso_code="AC" country="BR" zone="South America" /> + <state name="Alagoas" iso_code="AL" country="BR" zone="South America" /> + <state name="Amapá" iso_code="AP" country="BR" zone="South America" /> + <state name="Amazonas" iso_code="AM" country="BR" zone="South America" /> + <state name="Bahia" iso_code="BA" country="BR" zone="South America" /> + <state name="Ceará" iso_code="CE" country="BR" zone="South America" /> + <state name="Distrito Federal" iso_code="DF" country="BR" zone="South America" /> + <state name="Espírito Santo" iso_code="ES" country="BR" zone="South America" /> + <state name="Goiás" iso_code="GO" country="BR" zone="South America" /> + <state name="Maranhão" iso_code="MA" country="BR" zone="South America" /> + <state name="Mato Grosso" iso_code="MT" country="BR" zone="South America" /> + <state name="Mato Grosso do Sul" iso_code="MS" country="BR" zone="South America" /> + <state name="Minas Gerais" iso_code="MG" country="BR" zone="South America" /> + <state name="Pará" iso_code="PA" country="BR" zone="South America" /> + <state name="Paraíba" iso_code="PB" country="BR" zone="South America" /> + <state name="Paraná" iso_code="PR" country="BR" zone="South America" /> + <state name="Pernambuco" iso_code="PE" country="BR" zone="South America" /> + <state name="Piauí" iso_code="PI" country="BR" zone="South America" /> + <state name="Rio de Janeiro" iso_code="RJ" country="BR" zone="South America" /> + <state name="Rio Grande do Norte" iso_code="RN" country="BR" zone="South America" /> + <state name="Rio Grande do Sul" iso_code="RS" country="BR" zone="South America" /> + <state name="Rondônia" iso_code="RO" country="BR" zone="South America" /> + <state name="Roraima" iso_code="RR" country="BR" zone="South America" /> + <state name="Santa Catarina" iso_code="SC" country="BR" zone="South America" /> + <state name="São Paulo" iso_code="SP" country="BR" zone="South America" /> + <state name="Sergipe" iso_code="SE" country="BR" zone="South America" /> + <state name="Tocantins" iso_code="TO" country="BR" zone="South America" /> + </states> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/ca.xml b/localization/ca.xml new file mode 100644 index 000000000..0c189d80b --- /dev/null +++ b/localization/ca.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Canada" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="CAD" iso_code_num="124" sign="$" blank="0" conversion_rate="1.40054" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="fr" /> + <language iso_code="en" /> + </languages> + <taxes> + <tax id="1" name="GST CA 5%" rate="5" /> + <tax id="2" name="HST CA 10%" rate="10" /> + + <taxRulesGroup name="CA Standard Rate (10%)"> + <taxRule iso_code_country="ca" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="CA Reduced Rate (5%)"> + <taxRule iso_code_country="ca" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> + diff --git a/localization/ch.xml b/localization/ch.xml new file mode 100644 index 000000000..72f9c3c28 --- /dev/null +++ b/localization/ch.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Switzerland" version="1.0"> + <currencies> + <currency name="Franc" iso_code="CHF" iso_code_num="756" sign="CHF" blank="1" conversion_rate="1.34183" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="de" /> + <language iso_code="fr" /> + <language iso_code="it" /> + </languages> + <taxes> + <tax id="1" name="TVA CH 8.0%" rate="8.0" /> + <tax id="2" name="TVA CH 3.8%" rate="3.8" /> + <tax id="3" name="TVA CH 2.5%" rate="2.5" /> + + <taxRulesGroup name="CH Standard Rate (8.0%)"> + <taxRule iso_code_country="ch" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="CH Reduced Rate (3.8%)"> + <taxRule iso_code_country="ch" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="CH Super Reduced Rate (2.5%)"> + <taxRule iso_code_country="ch" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> \ No newline at end of file diff --git a/localization/cl.xml b/localization/cl.xml new file mode 100644 index 000000000..36c79c76a --- /dev/null +++ b/localization/cl.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Chile" version="1.0"> + <currencies> + <currency name="Peso" iso_code="CLP" iso_code_num="152" sign="$" blank="1" conversion_rate="658.996" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA CL 19%" rate="19" /> + + <taxRulesGroup name="CL Standard Rate (19%)"> + <taxRule iso_code_country="cl" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/cn.xml b/localization/cn.xml new file mode 100644 index 000000000..b582b2dad --- /dev/null +++ b/localization/cn.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="China" version="1.0"> + <currencies> + <currency name="Yuan" iso_code="CNY" iso_code_num="156" sign="¥" blank="1" conversion_rate="9.13916" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="tw" /> + <language iso_code="zh" /> + </languages> + <taxes> + <tax id="1" name="增值税 CN 17%" rate="17" /> + <tax id="2" name="增值税 CN 6%" rate="6" /> + <tax id="3" name="增值税 CN 3%" rate="3" /> + + <taxRulesGroup name="CN Standard Rate (17%)"> + <taxRule iso_code_country="cn" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="CN Reduced Rate (6%)"> + <taxRule iso_code_country="cn" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="CN Super Reduced Rate (3%)"> + <taxRule iso_code_country="cn" id_tax="3" /> + </taxRulesGroup> + </taxes> + <states> + <state name="Beijing" iso_code="11" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Chongqing" iso_code="50" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Shanghaï" iso_code="31" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Tianjin" iso_code="12" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Anhui" iso_code="34" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Fujian" iso_code="35" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Gansu" iso_code="62" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Guangdong" iso_code="44" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Guizhou" iso_code="52" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Hainan" iso_code="46" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Hebei" iso_code="13" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Heilongjiang" iso_code="23" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Henan" iso_code="41" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Hubei" iso_code="42" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Hunan" iso_code="43" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Jiangsu" iso_code="32" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Jiangxi" iso_code="36" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Jilin" iso_code="22" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Liaoning" iso_code="21" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Qinghai" iso_code="63" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Shaanxi" iso_code="61" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Shandong" iso_code="37" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Shanxi" iso_code="14" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Sichuan" iso_code="51" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Taïwan" iso_code="71" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Yunnan" iso_code="53" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Guangxi" iso_code="45" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Neimenggu" iso_code="15" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Ningxia" iso_code="64" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Xinjiang" iso_code="65" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Xizang" iso_code="54" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Xianggang" iso_code="91" country="CN" zone="Asia" tax_behavior="0" /> + <state name="Aomen" iso_code="92" country="CN" zone="Asia" tax_behavior="0" /> + </states> + <units> + <unit type="weight" value="市制" /> + <unit type="volume" value="市升" /> + <unit type="short_distance" value="市厘" /> + <unit type="base_distance" value="里" /> + <unit type="long_distance" value="市里" /> + </units> +</localizationPack> diff --git a/localization/co.xml b/localization/co.xml new file mode 100644 index 000000000..e25641c3a --- /dev/null +++ b/localization/co.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Colombia" version="1.0"> + <currencies> + <currency name="Peso" iso_code="COP" iso_code_num="170" sign="$" blank="1" conversion_rate="2457.29" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA CO 16%" rate="16" /> + + <taxRulesGroup name="CO Standard Rate (16%)"> + <taxRule iso_code_country="co" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/cy.xml b/localization/cy.xml new file mode 100644 index 000000000..ffa1874a3 --- /dev/null +++ b/localization/cy.xml @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Cyprus" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="el" /> + <language iso_code="tr" /> + </languages> + <taxes> + <tax id="1" name="ΦΠΑ CY 15%" rate="15" /> + <tax id="2" name="ΦΠΑ CY 8%" rate="8" /> + <tax id="3" name="ΦΠΑ CY 5%" rate="5" /> + + <taxRulesGroup name="CY Standard Rate (15%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="CY Reduced Rate (8%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="CY Super Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="CY Books Rate (5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/cz.xml b/localization/cz.xml new file mode 100644 index 000000000..ced586411 --- /dev/null +++ b/localization/cz.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Czech republic" version="1.0"> + <currencies> + <currency name="Czech koruna" iso_code="CZK" iso_code_num="203" sign="Kč" blank="1" conversion_rate="24.5891" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="cs" /> + </languages> + <taxes> + <tax id="1" name="DPH CZ 20%" rate="20" /> + <tax id="2" name="DPH CZ 10%" rate="10" /> + + <taxRulesGroup name="CZ Standard Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="CZ Reduced Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="CZ Foodstuff Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="CZ Books Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/de.xml b/localization/de.xml new file mode 100644 index 000000000..5f68cebb2 --- /dev/null +++ b/localization/de.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Deutschland" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="de" /> + </languages> + <taxes> + <tax id="1" name="MwSt. DE 19%" rate="19" /> + <tax id="2" name="MwSt. DE 7%" rate="7" /> + + <taxRulesGroup name="DE Standard Rate (19%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="DE Reduced Rate (7%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="DE Foodstuff Rate (7%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="DE Books Rate (7%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/dk.xml b/localization/dk.xml new file mode 100644 index 000000000..a548f9923 --- /dev/null +++ b/localization/dk.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Denmark" version="1.0"> + <currencies> + <currency name="Danish krone" iso_code="DKK" iso_code_num="208" sign="kr" blank="1" conversion_rate="7.45201" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="da" /> + </languages> + <taxes> + <tax id="1" name="moms DK 25%" rate="25" /> + + <taxRulesGroup name="DK Standard Rate (25%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="DK Foodstuff Rate (25%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="DK Books Rate (25%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/do.xml b/localization/do.xml new file mode 100644 index 000000000..b23cc8d0e --- /dev/null +++ b/localization/do.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Dominican Republic" version="1.0"> + <currencies> + <currency name="Peso" iso_code="DOP" iso_code_num="214" sign="RD$" blank="1" conversion_rate="50.0426" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="ITBIS DO 16%" rate="16" /> + <tax id="2" name="ITBIS DO 12%" rate="12" /> + + <taxRulesGroup name="DO Standard Rate (16%)"> + <taxRule iso_code_country="do" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="DO Reduced Rate (12%)"> + <taxRule iso_code_country="do" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/ec.xml b/localization/ec.xml new file mode 100644 index 000000000..576eb47f2 --- /dev/null +++ b/localization/ec.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Ecuador" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="USD" iso_code_num="840" sign="$" blank="0" conversion_rate="1.36550" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA EC 12%" rate="12" /> + + <taxRulesGroup name="EC Standard Rate (12%)"> + <taxRule iso_code_country="ec" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/ee.xml b/localization/ee.xml new file mode 100644 index 000000000..46a3798d7 --- /dev/null +++ b/localization/ee.xml @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Estonia" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + <currency name="Estonian kroon" iso_code="EEK" iso_code_num="233" sign="kr" blank="1" conversion_rate="15.6466" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="et" /> + </languages> + <taxes> + <tax id="1" name="km EE 20%" rate="20" /> + <tax id="2" name="km EE 9%" rate="9" /> + + <taxRulesGroup name="EE Standard Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="EE Reduced Rate (9%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="EE Foodstuff Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="EE Books Rate (9%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/eg.xml b/localization/eg.xml new file mode 100644 index 000000000..db3882aa6 --- /dev/null +++ b/localization/eg.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Egypt" version="1.0"> + <currencies> + <currency name="Pound" iso_code="EGP" iso_code_num="818" sign="£" blank="1" conversion_rate="7.77518" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="ar" /> + </languages> + <taxes> + <tax id="1" name="VAT EG 10%" rate="10" /> + + <taxRulesGroup name="EG Standard Rate (10%)"> + <taxRule iso_code_country="eg" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/es.xml b/localization/es.xml new file mode 100644 index 000000000..d9f1b1c3d --- /dev/null +++ b/localization/es.xml @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Spain" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ca" /> + <language iso_code="es" /> + <language iso_code="gl" /> + </languages> + <taxes> + <tax id="1" name="IVA ES 18%" rate="18" /> + <tax id="2" name="IVA ES 8%" rate="8" /> + <tax id="3" name="IVA ES 4%" rate="4" /> + + <taxRulesGroup name="ES Standard rate (18%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="ES Reduced Rate (8%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="ES Super Reduced Rate (4%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="ES Foodstuff Rate (4%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="ES Books Rate (4%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/fi.xml b/localization/fi.xml new file mode 100644 index 000000000..3daae4508 --- /dev/null +++ b/localization/fi.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Finland" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="fi" /> + </languages> + <taxes> + <tax id="1" name="ALV FI 23%" rate="23" /> + <tax id="2" name="ALV FI 13%" rate="13" /> + <tax id="3" name="ALV FI 9%" rate="9" /> + + <taxRulesGroup name="FI Standard Rate (23%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="FI Reduced Rate (13%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="FI Super Reduced Rate (9%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="FI Foodstuff Rate (13%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="FI Books Rate (9%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/fj.xml b/localization/fj.xml new file mode 100644 index 000000000..9b8ce1897 --- /dev/null +++ b/localization/fj.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Fiji" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="FJD" iso_code_num="242" sign="$" blank="0" conversion_rate="2.57483" format="1" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="VAT FJ 12.5%" rate="12.5" /> + + <taxRulesGroup name="FJ Standard Rate (12.5%)"> + <taxRule iso_code_country="fj" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/fr.xml b/localization/fr.xml new file mode 100644 index 000000000..cbe6cf161 --- /dev/null +++ b/localization/fr.xml @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="France" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="fr" /> + </languages> + <taxes> + <tax id="1" name="TVA FR 19.6%" rate="19.6" /> + <tax id="2" name="TVA FR 5.5%" rate="5.5" /> + <tax id="3" name="TVA FR 2.1%" rate="2.1" /> + + <taxRulesGroup name="FR Taux standard (19.6%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="FR Taux réduit (5.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="FR Taux super réduit (2.1%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="FR Alimentaire (5.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="FR Livres (5.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> + diff --git a/localization/gb.xml b/localization/gb.xml new file mode 100644 index 000000000..b4e33c0e2 --- /dev/null +++ b/localization/gb.xml @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<localizationPack name="United Kingdom" version="1.0"> + <currencies> + <currency name="Pound" iso_code="GBP" iso_code_num="826" sign="£" blank="1" conversion_rate="0.8633100" format="2" decimals="1"/> + </currencies> + <taxes> + <tax id="1" name="VAT UK 20%" rate="20.0"/> + <tax id="2" name="VAT UK 5%" rate="5"/> + + <taxRulesGroup name="UK Standard Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1"/> + <taxRule iso_code_country="bg" id_tax="1"/> + <taxRule iso_code_country="cz" id_tax="1"/> + <taxRule iso_code_country="dk" id_tax="1"/> + <taxRule iso_code_country="de" id_tax="1"/> + <taxRule iso_code_country="ee" id_tax="1"/> + <taxRule iso_code_country="gr" id_tax="1"/> + <taxRule iso_code_country="es" id_tax="1"/> + <taxRule iso_code_country="fr" id_tax="1"/> + <taxRule iso_code_country="ie" id_tax="1"/> + <taxRule iso_code_country="it" id_tax="1"/> + <taxRule iso_code_country="cy" id_tax="1"/> + <taxRule iso_code_country="lv" id_tax="1"/> + <taxRule iso_code_country="lt" id_tax="1"/> + <taxRule iso_code_country="lu" id_tax="1"/> + <taxRule iso_code_country="hu" id_tax="1"/> + <taxRule iso_code_country="mt" id_tax="1"/> + <taxRule iso_code_country="nl" id_tax="1"/> + <taxRule iso_code_country="at" id_tax="1"/> + <taxRule iso_code_country="pl" id_tax="1"/> + <taxRule iso_code_country="pt" id_tax="1"/> + <taxRule iso_code_country="ro" id_tax="1"/> + <taxRule iso_code_country="si" id_tax="1"/> + <taxRule iso_code_country="sk" id_tax="1"/> + <taxRule iso_code_country="fi" id_tax="1"/> + <taxRule iso_code_country="se" id_tax="1"/> + <taxRule iso_code_country="uk" id_tax="1"/> + </taxRulesGroup> + + <taxRulesGroup name="UK Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="2"/> + <taxRule iso_code_country="bg" id_tax="2"/> + <taxRule iso_code_country="cz" id_tax="2"/> + <taxRule iso_code_country="dk" id_tax="2"/> + <taxRule iso_code_country="de" id_tax="2"/> + <taxRule iso_code_country="ee" id_tax="2"/> + <taxRule iso_code_country="gr" id_tax="2"/> + <taxRule iso_code_country="es" id_tax="2"/> + <taxRule iso_code_country="fr" id_tax="2"/> + <taxRule iso_code_country="ie" id_tax="2"/> + <taxRule iso_code_country="it" id_tax="2"/> + <taxRule iso_code_country="cy" id_tax="2"/> + <taxRule iso_code_country="lv" id_tax="2"/> + <taxRule iso_code_country="lt" id_tax="2"/> + <taxRule iso_code_country="lu" id_tax="2"/> + <taxRule iso_code_country="hu" id_tax="2"/> + <taxRule iso_code_country="mt" id_tax="2"/> + <taxRule iso_code_country="nl" id_tax="2"/> + <taxRule iso_code_country="at" id_tax="2"/> + <taxRule iso_code_country="pl" id_tax="2"/> + <taxRule iso_code_country="pt" id_tax="2"/> + <taxRule iso_code_country="ro" id_tax="2"/> + <taxRule iso_code_country="si" id_tax="2"/> + <taxRule iso_code_country="sk" id_tax="2"/> + <taxRule iso_code_country="fi" id_tax="2"/> + <taxRule iso_code_country="se" id_tax="2"/> + <taxRule iso_code_country="uk" id_tax="2"/> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="lb"/> + <unit type="volume" value="gal"/> + <unit type="short_distance" value="in"/> + <unit type="base_distance" value="ft"/> + <unit type="long_distance" value="mi"/> + </units> +</localizationPack> \ No newline at end of file diff --git a/localization/ge.xml b/localization/ge.xml new file mode 100644 index 000000000..c97f76156 --- /dev/null +++ b/localization/ge.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Georgia" version="1.0"> + <currencies> + <currency name="Lari" iso_code="GEL" iso_code_num="981" sign="ლ" blank="1" conversion_rate="2.46684" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ka" /> + </languages> + <taxes> + <tax id="1" name="დღგ GE 18%" rate="18" /> + + <taxRulesGroup name="GE Standard Rate (18%)"> + <taxRule iso_code_country="ge" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/gr.xml b/localization/gr.xml new file mode 100644 index 000000000..3126c71c1 --- /dev/null +++ b/localization/gr.xml @@ -0,0 +1,264 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Greece" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="el" /> + </languages> + <taxes> + <tax id="1" name="ΦΠΑ GR 23%" rate="23" /> + <tax id="2" name="ΦΠΑ GR 11%" rate="11" /> + <tax id="3" name="ΦΠΑ GR 5.5%" rate="5.5" /> + <tax id="4" name="ΦΠΑ GR 16%" rate="16" /> + <tax id="5" name="ΦΠΑ GR 8%" rate="8" /> + <tax id="6" name="ΦΠΑ GR 4%" rate="4" /> + + <taxRulesGroup name="GR Standard Rate (23%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="GR Reduced Rate (11%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="GR Super Reduced Rate (5.5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="GR islands Standard Rate (16%)"> + <taxRule iso_code_country="be" id_tax="4" /> + <taxRule iso_code_country="bg" id_tax="4" /> + <taxRule iso_code_country="cz" id_tax="4" /> + <taxRule iso_code_country="dk" id_tax="4" /> + <taxRule iso_code_country="de" id_tax="4" /> + <taxRule iso_code_country="ee" id_tax="4" /> + <taxRule iso_code_country="gr" id_tax="4" /> + <taxRule iso_code_country="es" id_tax="4" /> + <taxRule iso_code_country="fr" id_tax="4" /> + <taxRule iso_code_country="ie" id_tax="4" /> + <taxRule iso_code_country="it" id_tax="4" /> + <taxRule iso_code_country="cy" id_tax="4" /> + <taxRule iso_code_country="lv" id_tax="4" /> + <taxRule iso_code_country="lt" id_tax="4" /> + <taxRule iso_code_country="lu" id_tax="4" /> + <taxRule iso_code_country="hu" id_tax="4" /> + <taxRule iso_code_country="mt" id_tax="4" /> + <taxRule iso_code_country="nl" id_tax="4" /> + <taxRule iso_code_country="at" id_tax="4" /> + <taxRule iso_code_country="pl" id_tax="4" /> + <taxRule iso_code_country="pt" id_tax="4" /> + <taxRule iso_code_country="ro" id_tax="4" /> + <taxRule iso_code_country="si" id_tax="4" /> + <taxRule iso_code_country="sk" id_tax="4" /> + <taxRule iso_code_country="fi" id_tax="4" /> + <taxRule iso_code_country="se" id_tax="4" /> + <taxRule iso_code_country="uk" id_tax="4" /> + </taxRulesGroup> + + <taxRulesGroup name="GR islands Reduced Rate (8%)"> + <taxRule iso_code_country="be" id_tax="5" /> + <taxRule iso_code_country="bg" id_tax="5" /> + <taxRule iso_code_country="cz" id_tax="5" /> + <taxRule iso_code_country="dk" id_tax="5" /> + <taxRule iso_code_country="de" id_tax="5" /> + <taxRule iso_code_country="ee" id_tax="5" /> + <taxRule iso_code_country="gr" id_tax="5" /> + <taxRule iso_code_country="es" id_tax="5" /> + <taxRule iso_code_country="fr" id_tax="5" /> + <taxRule iso_code_country="ie" id_tax="5" /> + <taxRule iso_code_country="it" id_tax="5" /> + <taxRule iso_code_country="cy" id_tax="5" /> + <taxRule iso_code_country="lv" id_tax="5" /> + <taxRule iso_code_country="lt" id_tax="5" /> + <taxRule iso_code_country="lu" id_tax="5" /> + <taxRule iso_code_country="hu" id_tax="5" /> + <taxRule iso_code_country="mt" id_tax="5" /> + <taxRule iso_code_country="nl" id_tax="5" /> + <taxRule iso_code_country="at" id_tax="5" /> + <taxRule iso_code_country="pl" id_tax="5" /> + <taxRule iso_code_country="pt" id_tax="5" /> + <taxRule iso_code_country="ro" id_tax="5" /> + <taxRule iso_code_country="si" id_tax="5" /> + <taxRule iso_code_country="sk" id_tax="5" /> + <taxRule iso_code_country="fi" id_tax="5" /> + <taxRule iso_code_country="se" id_tax="5" /> + <taxRule iso_code_country="uk" id_tax="5" /> + </taxRulesGroup> + + <taxRulesGroup name="GR islands Super Reduced Rate (4%)"> + <taxRule iso_code_country="be" id_tax="6" /> + <taxRule iso_code_country="bg" id_tax="6" /> + <taxRule iso_code_country="cz" id_tax="6" /> + <taxRule iso_code_country="dk" id_tax="6" /> + <taxRule iso_code_country="de" id_tax="6" /> + <taxRule iso_code_country="ee" id_tax="6" /> + <taxRule iso_code_country="gr" id_tax="6" /> + <taxRule iso_code_country="es" id_tax="6" /> + <taxRule iso_code_country="fr" id_tax="6" /> + <taxRule iso_code_country="ie" id_tax="6" /> + <taxRule iso_code_country="it" id_tax="6" /> + <taxRule iso_code_country="cy" id_tax="6" /> + <taxRule iso_code_country="lv" id_tax="6" /> + <taxRule iso_code_country="lt" id_tax="6" /> + <taxRule iso_code_country="lu" id_tax="6" /> + <taxRule iso_code_country="hu" id_tax="6" /> + <taxRule iso_code_country="mt" id_tax="6" /> + <taxRule iso_code_country="nl" id_tax="6" /> + <taxRule iso_code_country="at" id_tax="6" /> + <taxRule iso_code_country="pl" id_tax="6" /> + <taxRule iso_code_country="pt" id_tax="6" /> + <taxRule iso_code_country="ro" id_tax="6" /> + <taxRule iso_code_country="si" id_tax="6" /> + <taxRule iso_code_country="sk" id_tax="6" /> + <taxRule iso_code_country="fi" id_tax="6" /> + <taxRule iso_code_country="se" id_tax="6" /> + <taxRule iso_code_country="uk" id_tax="6" /> + </taxRulesGroup> + + <taxRulesGroup name="GR Foodstuff Rate (11%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="GR Books Rate (5.5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/gt.xml b/localization/gt.xml new file mode 100644 index 000000000..7ed863ff0 --- /dev/null +++ b/localization/gt.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Guatemala" version="1.0"> + <currencies> + <currency name="Quetzal" iso_code="GTQ" iso_code_num="320" sign="Q" blank="1" conversion_rate="11.0988" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA GT 12%" rate="12" /> + + <taxRulesGroup name="GT Standard Rate (12%)"> + <taxRule iso_code_country="gt" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/gy.xml b/localization/gy.xml new file mode 100644 index 000000000..d00b9c547 --- /dev/null +++ b/localization/gy.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Guyana" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="GYD" iso_code_num="328" sign="$" blank="0" conversion_rate="276.712" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + <language iso_code="pt" /> + </languages> + <taxes> + <tax id="1" name="VAT GY 16%" rate="16" /> + + <taxRulesGroup name="GY Standard Rate (16%)"> + <taxRule iso_code_country="gy" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/hk.xml b/localization/hk.xml new file mode 100644 index 000000000..a03d91b94 --- /dev/null +++ b/localization/hk.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Hong Kong" version="1.0"> + <currencies> + <currency name="Hong Kong Dollar" iso_code="HKD" iso_code_num="344" sign="$" blank="1" conversion_rate="11.0512" format="2" decimals="2" /> + </currencies> + <languages> + <language iso_code="zh" /> + </languages> + <units> + <unit type="weight" value="市制" /> + <unit type="volume" value="市升" /> + <unit type="short_distance" value="分" /> + <unit type="base_distance" value="寸" /> + <unit type="long_distance" value="尺" /> + </units> +</localizationPack> diff --git a/localization/hu.xml b/localization/hu.xml new file mode 100644 index 000000000..8e0f9fc96 --- /dev/null +++ b/localization/hu.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Hungary" version="1.0"> + <currencies> + <currency name="Forint" iso_code="HUF" iso_code_num="348" sign="Ft‎" blank="1" conversion_rate="276.334" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="hu" /> + </languages> + <taxes> + <tax id="1" name="ÁFA HU 25%" rate="25" /> + <tax id="2" name="ÁFA HU 18%" rate="18" /> + <tax id="3" name="ÁFA HU 5%" rate="5" /> + + <taxRulesGroup name="HU Standard Rate (25%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="HU Reduced Rate (18%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="HU Super Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="HU Foodstuff Rate (25%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="HU Books Rate (5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/id.xml b/localization/id.xml new file mode 100644 index 000000000..79afd8809 --- /dev/null +++ b/localization/id.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Indonesia" version="1.0"> + <currencies> + <currency name="Rupiah" iso_code="IDR" iso_code_num="360" sign="Rp‎" blank="1" conversion_rate="12177.63" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="id" /> + </languages> + <taxes> + <tax id="1" name="PPN ID 10%" rate="10" /> + <tax id="2" name="PPN ID 5%" rate="5" /> + + <taxRulesGroup name="ID Standard Rate (10%)"> + <taxRule iso_code_country="id" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="ID Reduced Rate (5%)"> + <taxRule iso_code_country="id" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/ie.xml b/localization/ie.xml new file mode 100644 index 000000000..108a2a40b --- /dev/null +++ b/localization/ie.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Ireland" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="VAT IE 21%" rate="21" /> + <tax id="2" name="VAT IE 13.5%" rate="13.5" /> + <tax id="3" name="VAT IE 4.8%" rate="4.8" /> + + <taxRulesGroup name="IE Standard Rate (21%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="IE Reduced Rate (13.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="IE Super Reduced Rate (4.8%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/il.xml b/localization/il.xml new file mode 100644 index 000000000..37965a4f6 --- /dev/null +++ b/localization/il.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Israel" version="1.0"> + <currencies> + <currency name="Shekel" iso_code="ILS" iso_code_num="376" sign="₪‎" blank="1" conversion_rate="4.97713" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ar" /> + <language iso_code="he" /> + </languages> + <taxes> + <tax id="1" name="Ma'am IL 16%" rate="16" /> + + <taxRulesGroup name="IL Standard Rate (16%)"> + <taxRule iso_code_country="il" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/in.xml b/localization/in.xml new file mode 100644 index 000000000..95e0c0c6e --- /dev/null +++ b/localization/in.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="India" version="1.0"> + <currencies> + <currency name="Indian Rupee" iso_code="INR" iso_code_num="356" sign="Rupees" blank="1" conversion_rate="60.748205" format="2" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="VAT IN 12.5%" rate="12.5" /> + <tax id="2" name="VAT IN 4%" rate="4" /> + <tax id="3" name="VAT IN 1%" rate="1" /> + + <taxRulesGroup name="IN Standard Rate (12.5%)"> + <taxRule iso_code_country="in" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="IN Reduced Rate (4%)"> + <taxRule iso_code_country="in" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="IN Super Reduced Rate (1%)"> + <taxRule iso_code_country="in" id_tax="3" /> + </taxRulesGroup> + </taxes> + <states> + <state name="Andhra Pradesh" iso_code="AP" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Arunāchal Pradesh" iso_code="AR" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Assam" iso_code="AS" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Bihār" iso_code="BR" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Chhattīsgarh" iso_code="CT" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Goa" iso_code="GA" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Gujarāt" iso_code="GJ" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Haryāna" iso_code="HR" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Himāchal Pradesh" iso_code="HP" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Jammu and Kashmīr" iso_code="JK" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Jharkhand" iso_code="JH" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Karnātaka" iso_code="KA" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Kerala" iso_code="KL" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Madhya Pradesh" iso_code="MP" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Mahārāshtra" iso_code="MH" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Manipur" iso_code="MN" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Meghālaya" iso_code="ML" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Mizoram" iso_code="MZ" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Nāgāland" iso_code="NL" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Orissa" iso_code="OR" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Punjab" iso_code="PB" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Rājasthān" iso_code="RJ" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Sikkim" iso_code="SK" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Tamil Nādu" iso_code="TN" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Tripura" iso_code="TR" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Uttaranchal" iso_code="UL" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Uttar Pradesh" iso_code="UP" country="IN" zone="Asia" tax_behavior="0" /> + <state name="West Bengal" iso_code="WB" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Andaman and Nicobar Islands" iso_code="AN" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Chandīgarh" iso_code="CH" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Dādra and Nagar Haveli" iso_code="DN" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Damān and Diu" iso_code="DD" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Delhi" iso_code="DL" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Lakshadweep" iso_code="LD" country="IN" zone="Asia" tax_behavior="0" /> + <state name="Pondicherry" iso_code="PY" country="IN" zone="Asia" tax_behavior="0" /> + </states> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/ir.xml b/localization/ir.xml new file mode 100644 index 000000000..a6e49d3c8 --- /dev/null +++ b/localization/ir.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Iran" version="1.0"> + <currencies> + <currency name="Rial" iso_code="IRR" iso_code_num="364" sign="﷼" blank="1" conversion_rate="13,921.14" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="fa" /> + </languages> + <taxes> + <tax id="1" name="VAT IR 3%" rate="3" /> + + <taxRulesGroup name="IR Standard Rate (3%)"> + <taxRule iso_code_country="ir" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/it.xml b/localization/it.xml new file mode 100644 index 000000000..bc9efde6a --- /dev/null +++ b/localization/it.xml @@ -0,0 +1,283 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Italia" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="it" /> + </languages> + <taxes> + <tax id="1" name="IVA IT 20%" rate="20" /> + <tax id="2" name="IVA IT 10%" rate="10" /> + <tax id="3" name="IVA IT 4%" rate="4" /> + + <taxRulesGroup name="IT Standard Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="IT Reduced Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="IT Super Reduced Rate (4%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="IT Foodstuff Rate (4%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="FR Books Rate (4%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <states> + <state name="Agrigento" iso_code="AG" country="IT" zone="Europe" /> + <state name="Alessandria" iso_code="AL" country="IT" zone="Europe" /> + <state name="Ancona" iso_code="AN" country="IT" zone="Europe" /> + <state name="Aosta" iso_code="AO" country="IT" zone="Europe" /> + <state name="Arezzo" iso_code="AR" country="IT" zone="Europe" /> + <state name="Ascoli Piceno" iso_code="AP" country="IT" zone="Europe" /> + <state name="Asti" iso_code="AT" country="IT" zone="Europe" /> + <state name="Avellino" iso_code="AV" country="IT" zone="Europe" /> + <state name="Bari" iso_code="BA" country="IT" zone="Europe" /> + <state name="Barletta-Andria-Trani" iso_code="BT" country="IT" zone="Europe" /> + <state name="Belluno" iso_code="BL" country="IT" zone="Europe" /> + <state name="Benevento" iso_code="BN" country="IT" zone="Europe" /> + <state name="Bergamo" iso_code="BG" country="IT" zone="Europe" /> + <state name="Biella" iso_code="BI" country="IT" zone="Europe" /> + <state name="Bologna" iso_code="BO" country="IT" zone="Europe" /> + <state name="Bolzano" iso_code="BZ" country="IT" zone="Europe" /> + <state name="Brescia" iso_code="BS" country="IT" zone="Europe" /> + <state name="Brindisi" iso_code="BR" country="IT" zone="Europe" /> + <state name="Cagliari" iso_code="CA" country="IT" zone="Europe" /> + <state name="Caltanissetta" iso_code="CL" country="IT" zone="Europe" /> + <state name="Campobasso" iso_code="CB" country="IT" zone="Europe" /> + <state name="Carbonia-Iglesias" iso_code="CI" country="IT" zone="Europe" /> + <state name="Caserta" iso_code="CE" country="IT" zone="Europe" /> + <state name="Catania" iso_code="CT" country="IT" zone="Europe" /> + <state name="Catanzaro" iso_code="CZ" country="IT" zone="Europe" /> + <state name="Chieti" iso_code="CH" country="IT" zone="Europe" /> + <state name="Como" iso_code="CO" country="IT" zone="Europe" /> + <state name="Cosenza" iso_code="CS" country="IT" zone="Europe" /> + <state name="Cremona" iso_code="CR" country="IT" zone="Europe" /> + <state name="Crotone" iso_code="KR" country="IT" zone="Europe" /> + <state name="Cuneo" iso_code="CN" country="IT" zone="Europe" /> + <state name="Enna" iso_code="EN" country="IT" zone="Europe" /> + <state name="Fermo" iso_code="FM" country="IT" zone="Europe" /> + <state name="Ferrara" iso_code="FE" country="IT" zone="Europe" /> + <state name="Firenze" iso_code="FI" country="IT" zone="Europe" /> + <state name="Foggia" iso_code="FG" country="IT" zone="Europe" /> + <state name="Forlì-Cesena" iso_code="FC" country="IT" zone="Europe" /> + <state name="Frosinone" iso_code="FR" country="IT" zone="Europe" /> + <state name="Genova" iso_code="GE" country="IT" zone="Europe" /> + <state name="Gorizia" iso_code="GO" country="IT" zone="Europe" /> + <state name="Grosseto" iso_code="GR" country="IT" zone="Europe" /> + <state name="Imperia" iso_code="IM" country="IT" zone="Europe" /> + <state name="Isernia" iso_code="IS" country="IT" zone="Europe" /> + <state name="L'Aquila" iso_code="AQ" country="IT" zone="Europe" /> + <state name="La Spezia" iso_code="SP" country="IT" zone="Europe" /> + <state name="Latina" iso_code="LT" country="IT" zone="Europe" /> + <state name="Lecce" iso_code="LE" country="IT" zone="Europe" /> + <state name="Lecco" iso_code="LC" country="IT" zone="Europe" /> + <state name="Livorno" iso_code="LI" country="IT" zone="Europe" /> + <state name="Lodi" iso_code="LO" country="IT" zone="Europe" /> + <state name="Lucca" iso_code="LU" country="IT" zone="Europe" /> + <state name="Macerata" iso_code="MC" country="IT" zone="Europe" /> + <state name="Mantova" iso_code="MN" country="IT" zone="Europe" /> + <state name="Massa" iso_code="MS" country="IT" zone="Europe" /> + <state name="Matera" iso_code="MT" country="IT" zone="Europe" /> + <state name="Medio Campidano" iso_code="VS" country="IT" zone="Europe" /> + <state name="Messina" iso_code="ME" country="IT" zone="Europe" /> + <state name="Milano" iso_code="MI" country="IT" zone="Europe" /> + <state name="Modena" iso_code="MO" country="IT" zone="Europe" /> + <state name="Monza e della Brianza" iso_code="MB" country="IT" zone="Europe" /> + <state name="Napoli" iso_code="NA" country="IT" zone="Europe" /> + <state name="Novara" iso_code="NO" country="IT" zone="Europe" /> + <state name="Nuoro" iso_code="NU" country="IT" zone="Europe" /> + <state name="Ogliastra" iso_code="OG" country="IT" zone="Europe" /> + <state name="Olbia-Tempio" iso_code="OT" country="IT" zone="Europe" /> + <state name="Oristano" iso_code="OR" country="IT" zone="Europe" /> + <state name="Padova" iso_code="PD" country="IT" zone="Europe" /> + <state name="Palermo" iso_code="PA" country="IT" zone="Europe" /> + <state name="Parma" iso_code="PR" country="IT" zone="Europe" /> + <state name="Pavia" iso_code="PV" country="IT" zone="Europe" /> + <state name="Perugia" iso_code="PG" country="IT" zone="Europe" /> + <state name="Pesaro-Urbino" iso_code="PU" country="IT" zone="Europe" /> + <state name="Pescara" iso_code="PE" country="IT" zone="Europe" /> + <state name="Piacenza" iso_code="PC" country="IT" zone="Europe" /> + <state name="Pisa" iso_code="PI" country="IT" zone="Europe" /> + <state name="Pistoia" iso_code="PT" country="IT" zone="Europe" /> + <state name="Pordenone" iso_code="PN" country="IT" zone="Europe" /> + <state name="Potenza" iso_code="PZ" country="IT" zone="Europe" /> + <state name="Prato" iso_code="PO" country="IT" zone="Europe" /> + <state name="Ragusa" iso_code="RG" country="IT" zone="Europe" /> + <state name="Ravenna" iso_code="RA" country="IT" zone="Europe" /> + <state name="Reggio Calabria" iso_code="RC" country="IT" zone="Europe" /> + <state name="Reggio Emilia" iso_code="RE" country="IT" zone="Europe" /> + <state name="Rieti" iso_code="RI" country="IT" zone="Europe" /> + <state name="Rimini" iso_code="RN" country="IT" zone="Europe" /> + <state name="Roma" iso_code="RM" country="IT" zone="Europe" /> + <state name="Rovigo" iso_code="RO" country="IT" zone="Europe" /> + <state name="Salerno" iso_code="SA" country="IT" zone="Europe" /> + <state name="Sassari" iso_code="SS" country="IT" zone="Europe" /> + <state name="Savona" iso_code="SV" country="IT" zone="Europe" /> + <state name="Siena" iso_code="SI" country="IT" zone="Europe" /> + <state name="Siracusa" iso_code="SR" country="IT" zone="Europe" /> + <state name="Sondrio" iso_code="SO" country="IT" zone="Europe" /> + <state name="Taranto" iso_code="TA" country="IT" zone="Europe" /> + <state name="Teramo" iso_code="TE" country="IT" zone="Europe" /> + <state name="Terni" iso_code="TR" country="IT" zone="Europe" /> + <state name="Torino" iso_code="TO" country="IT" zone="Europe" /> + <state name="Trapani" iso_code="TP" country="IT" zone="Europe" /> + <state name="Trento" iso_code="TN" country="IT" zone="Europe" /> + <state name="Treviso" iso_code="TV" country="IT" zone="Europe" /> + <state name="Trieste" iso_code="TS" country="IT" zone="Europe" /> + <state name="Udine" iso_code="UD" country="IT" zone="Europe" /> + <state name="Varese" iso_code="VA" country="IT" zone="Europe" /> + <state name="Venezia" iso_code="VE" country="IT" zone="Europe" /> + <state name="Verbano-Cusio-Ossola" iso_code="VB" country="IT" zone="Europe" /> + <state name="Vercelli" iso_code="VC" country="IT" zone="Europe" /> + <state name="Verona" iso_code="VR" country="IT" zone="Europe" /> + <state name="Vibo Valentia" iso_code="VV" country="IT" zone="Europe" /> + <state name="Vicenza" iso_code="VI" country="IT" zone="Europe" /> + <state name="Viterbo" iso_code="VT" country="IT" zone="Europe" /> + </states> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/je.xml b/localization/je.xml new file mode 100644 index 000000000..0041047c9 --- /dev/null +++ b/localization/je.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Jersey" version="1.0"> + <currencies> + <currency name="Pound" iso_code="GBP" iso_code_num="826" sign="£" blank="1" conversion_rate="0.865759" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="fr" /> + </languages> + <taxes> + <tax id="1" name="GST JE 3%" rate="3" /> + + <taxRulesGroup name="JE Standard Rate (3%)"> + <taxRule iso_code_country="je" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/jp.xml b/localization/jp.xml new file mode 100644 index 000000000..10e27e465 --- /dev/null +++ b/localization/jp.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Japan" version="1.0"> + <currencies> + <currency name="Yen" iso_code="JPY" iso_code_num="392" sign="¥" blank="1" conversion_rate="113.786" format="1" decimals="0" /> + </currencies> + <languages> + <language iso_code="ja" /> + </languages> + <taxes> + <tax id="1" name="消費税 JP 5%" rate="5" /> + + <taxRulesGroup name="JP Standard Rate (5%)"> + <taxRule iso_code_country="jp" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="匁" /> + <unit type="volume" value="升" /> + <unit type="short_distance" value="曲尺" /> + <unit type="base_distance" value="丈" /> + </units> +</localizationPack> diff --git a/localization/li.xml b/localization/li.xml new file mode 100644 index 000000000..598025e56 --- /dev/null +++ b/localization/li.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Liechtenstein" version="1.0"> + <currencies> + <currency name="Franc" iso_code="CHF" iso_code_num="756" sign="CHF" blank="1" conversion_rate="1.34183" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="de" /> + </languages> + <taxes> + <tax id="1" name="TVA CH 7.6%" rate="7.6" /> + <tax id="2" name="TVA CH 3.6%" rate="3.6" /> + <tax id="3" name="TVA CH 2.4%" rate="2.4" /> + + <taxRulesGroup name="CH Standard Rate (7.6%)"> + <taxRule iso_code_country="li" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="CH Reduced Rate (3.6%)"> + <taxRule iso_code_country="li" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="CH Super Reduced Rate (2.4%)"> + <taxRule iso_code_country="li" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/lt.xml b/localization/lt.xml new file mode 100644 index 000000000..34fccf86b --- /dev/null +++ b/localization/lt.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Lithuania" version="1.0"> + <currencies> + <currency name="Litas" iso_code="LTL" iso_code_num="440" sign="Lt" blank="1" conversion_rate="3.45280" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="lt" /> + </languages> + <taxes> + <tax id="1" name="PVM LT 21%" rate="21" /> + <tax id="2" name="PVM LT 9%" rate="9" /> + <tax id="3" name="PVM LT 5%" rate="5" /> + + <taxRulesGroup name="LT Standard Rate (21%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="LT Reduced Rate (9%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="LT Super Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="LT Foodstuff Rate (21%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="LT Books Rate (9%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/lu.xml b/localization/lu.xml new file mode 100644 index 000000000..03f175236 --- /dev/null +++ b/localization/lu.xml @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Luxembourg" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="de" /> + <language iso_code="fr" /> + </languages> + <taxes> + <tax id="1" name="TVA LU 15%" rate="15" /> + <tax id="2" name="TVA LU 12%" rate="12" /> + <tax id="3" name="TVA LU 9%" rate="9" /> + <tax id="4" name="TVA LU 6%" rate="6" /> + <tax id="5" name="TVA LU 3%" rate="3" /> + + <taxRulesGroup name="LU Standard Rate (15%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="LU Reduced Rate (12%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="LU Reduced Rate (6%)"> + <taxRule iso_code_country="be" id_tax="4" /> + <taxRule iso_code_country="bg" id_tax="4" /> + <taxRule iso_code_country="cz" id_tax="4" /> + <taxRule iso_code_country="dk" id_tax="4" /> + <taxRule iso_code_country="de" id_tax="4" /> + <taxRule iso_code_country="ee" id_tax="4" /> + <taxRule iso_code_country="gr" id_tax="4" /> + <taxRule iso_code_country="es" id_tax="4" /> + <taxRule iso_code_country="fr" id_tax="4" /> + <taxRule iso_code_country="ie" id_tax="4" /> + <taxRule iso_code_country="it" id_tax="4" /> + <taxRule iso_code_country="cy" id_tax="4" /> + <taxRule iso_code_country="lv" id_tax="4" /> + <taxRule iso_code_country="lt" id_tax="4" /> + <taxRule iso_code_country="lu" id_tax="4" /> + <taxRule iso_code_country="hu" id_tax="4" /> + <taxRule iso_code_country="mt" id_tax="4" /> + <taxRule iso_code_country="nl" id_tax="4" /> + <taxRule iso_code_country="at" id_tax="4" /> + <taxRule iso_code_country="pl" id_tax="4" /> + <taxRule iso_code_country="pt" id_tax="4" /> + <taxRule iso_code_country="ro" id_tax="4" /> + <taxRule iso_code_country="si" id_tax="4" /> + <taxRule iso_code_country="sk" id_tax="4" /> + <taxRule iso_code_country="fi" id_tax="4" /> + <taxRule iso_code_country="se" id_tax="4" /> + <taxRule iso_code_country="uk" id_tax="4" /> + </taxRulesGroup> + + <taxRulesGroup name="LU Super Reduced Rate (3%)"> + <taxRule iso_code_country="be" id_tax="5" /> + <taxRule iso_code_country="bg" id_tax="5" /> + <taxRule iso_code_country="cz" id_tax="5" /> + <taxRule iso_code_country="dk" id_tax="5" /> + <taxRule iso_code_country="de" id_tax="5" /> + <taxRule iso_code_country="ee" id_tax="5" /> + <taxRule iso_code_country="gr" id_tax="5" /> + <taxRule iso_code_country="es" id_tax="5" /> + <taxRule iso_code_country="fr" id_tax="5" /> + <taxRule iso_code_country="ie" id_tax="5" /> + <taxRule iso_code_country="it" id_tax="5" /> + <taxRule iso_code_country="cy" id_tax="5" /> + <taxRule iso_code_country="lv" id_tax="5" /> + <taxRule iso_code_country="lt" id_tax="5" /> + <taxRule iso_code_country="lu" id_tax="5" /> + <taxRule iso_code_country="hu" id_tax="5" /> + <taxRule iso_code_country="mt" id_tax="5" /> + <taxRule iso_code_country="nl" id_tax="5" /> + <taxRule iso_code_country="at" id_tax="5" /> + <taxRule iso_code_country="pl" id_tax="5" /> + <taxRule iso_code_country="pt" id_tax="5" /> + <taxRule iso_code_country="ro" id_tax="5" /> + <taxRule iso_code_country="si" id_tax="5" /> + <taxRule iso_code_country="sk" id_tax="5" /> + <taxRule iso_code_country="fi" id_tax="5" /> + <taxRule iso_code_country="se" id_tax="5" /> + <taxRule iso_code_country="uk" id_tax="5" /> + </taxRulesGroup> + + <taxRulesGroup name="LU Foodstuff Rate (3%)"> + <taxRule iso_code_country="be" id_tax="5" /> + <taxRule iso_code_country="bg" id_tax="5" /> + <taxRule iso_code_country="cz" id_tax="5" /> + <taxRule iso_code_country="dk" id_tax="5" /> + <taxRule iso_code_country="de" id_tax="5" /> + <taxRule iso_code_country="ee" id_tax="5" /> + <taxRule iso_code_country="gr" id_tax="5" /> + <taxRule iso_code_country="es" id_tax="5" /> + <taxRule iso_code_country="fr" id_tax="5" /> + <taxRule iso_code_country="ie" id_tax="5" /> + <taxRule iso_code_country="it" id_tax="5" /> + <taxRule iso_code_country="cy" id_tax="5" /> + <taxRule iso_code_country="lv" id_tax="5" /> + <taxRule iso_code_country="lt" id_tax="5" /> + <taxRule iso_code_country="lu" id_tax="5" /> + <taxRule iso_code_country="hu" id_tax="5" /> + <taxRule iso_code_country="mt" id_tax="5" /> + <taxRule iso_code_country="nl" id_tax="5" /> + <taxRule iso_code_country="at" id_tax="5" /> + <taxRule iso_code_country="pl" id_tax="5" /> + <taxRule iso_code_country="pt" id_tax="5" /> + <taxRule iso_code_country="ro" id_tax="5" /> + <taxRule iso_code_country="si" id_tax="5" /> + <taxRule iso_code_country="sk" id_tax="5" /> + <taxRule iso_code_country="fi" id_tax="5" /> + <taxRule iso_code_country="se" id_tax="5" /> + <taxRule iso_code_country="uk" id_tax="5" /> + </taxRulesGroup> + + <taxRulesGroup name="LU Books Rate (3%)"> + <taxRule iso_code_country="be" id_tax="5" /> + <taxRule iso_code_country="bg" id_tax="5" /> + <taxRule iso_code_country="cz" id_tax="5" /> + <taxRule iso_code_country="dk" id_tax="5" /> + <taxRule iso_code_country="de" id_tax="5" /> + <taxRule iso_code_country="ee" id_tax="5" /> + <taxRule iso_code_country="gr" id_tax="5" /> + <taxRule iso_code_country="es" id_tax="5" /> + <taxRule iso_code_country="fr" id_tax="5" /> + <taxRule iso_code_country="ie" id_tax="5" /> + <taxRule iso_code_country="it" id_tax="5" /> + <taxRule iso_code_country="cy" id_tax="5" /> + <taxRule iso_code_country="lv" id_tax="5" /> + <taxRule iso_code_country="lt" id_tax="5" /> + <taxRule iso_code_country="lu" id_tax="5" /> + <taxRule iso_code_country="hu" id_tax="5" /> + <taxRule iso_code_country="mt" id_tax="5" /> + <taxRule iso_code_country="nl" id_tax="5" /> + <taxRule iso_code_country="at" id_tax="5" /> + <taxRule iso_code_country="pl" id_tax="5" /> + <taxRule iso_code_country="pt" id_tax="5" /> + <taxRule iso_code_country="ro" id_tax="5" /> + <taxRule iso_code_country="si" id_tax="5" /> + <taxRule iso_code_country="sk" id_tax="5" /> + <taxRule iso_code_country="fi" id_tax="5" /> + <taxRule iso_code_country="se" id_tax="5" /> + <taxRule iso_code_country="uk" id_tax="5" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/lv.xml b/localization/lv.xml new file mode 100644 index 000000000..0c36865a2 --- /dev/null +++ b/localization/lv.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Latvia" version="1.0"> + <currencies> + <currency name="Lats" iso_code="LVL" iso_code_num="428" sign="Ls" blank="1" conversion_rate="0.709095" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="lv" /> + </languages> + <taxes> + <tax id="1" name="PVN LV 21%" rate="21" /> + <tax id="2" name="PVN LV 10%" rate="10" /> + + <taxRulesGroup name="LV Standard Rate (21%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="LV Reduced Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="LV Foodstuff Rate (21%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="LV Books Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/md.xml b/localization/md.xml new file mode 100644 index 000000000..cba1cc5aa --- /dev/null +++ b/localization/md.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Moldova" version="1.0"> + <currencies> + <currency name="Lei" iso_code="MDL" iso_code_num="498" sign="MDL" blank="1" conversion_rate="16.1774" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ro" /> + <language iso_code="ru" /> + <language iso_code="uk" /> + </languages> + <taxes> + <tax id="1" name="TVA MD 20%" rate="20" /> + <tax id="2" name="TVA MD 8%" rate="8" /> + <tax id="3" name="TVA MD 5%" rate="5" /> + + <taxRulesGroup name="MD Standard Rate (20%)"> + <taxRule iso_code_country="md" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="MD Reduced Rate (8%)"> + <taxRule iso_code_country="md" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="MD Super Reduced Rate (5%)"> + <taxRule iso_code_country="md" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/mt.xml b/localization/mt.xml new file mode 100644 index 000000000..c9a963025 --- /dev/null +++ b/localization/mt.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Malta" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="VAT MT 18%" rate="18" /> + <tax id="2" name="VAT MT 5%" rate="5" /> + + <taxRulesGroup name="MT Standard Rate (18%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="MT Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="MT Books Rate (5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/mx.xml b/localization/mx.xml new file mode 100644 index 000000000..4ea20ac25 --- /dev/null +++ b/localization/mx.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Mexico" version="1.0"> + <currencies> + <currency name="Peso" iso_code="MXN" iso_code_num="484" sign="$" blank="1" conversion_rate="17.1304" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="mx" /> + </languages> + <taxes> + <tax id="1" name="IVA MX 16%" rate="16" /> + <tax id="2" name="IVA MX 11%" rate="11" /> + + <taxRulesGroup name="MX Standard Rate (16%)"> + <taxRule iso_code_country="mx" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="MX Reduced Rate (11%)"> + <taxRule iso_code_country="mx" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/nl.xml b/localization/nl.xml new file mode 100644 index 000000000..44582940d --- /dev/null +++ b/localization/nl.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Netherlands" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="nl" /> + </languages> + <taxes> + <tax id="1" name="BTW NL 19%" rate="19" /> + <tax id="2" name="BTW NL 6%" rate="6" /> + + <taxRulesGroup name="NL Standard Rate (19%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="NL Reduced Rate (6%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="NL Foodstuff Rate (6%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="NL Books Rate (6%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/no.xml b/localization/no.xml new file mode 100644 index 000000000..91eafcdd9 --- /dev/null +++ b/localization/no.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Norway" version="1.0"> + <currencies> + <currency name="Krone" iso_code="NOK" iso_code_num="578" sign="kr" blank="1" conversion_rate="7.97791" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="no" /> + </languages> + <taxes> + <tax id="1" name="MVA NO 25%" rate="25" /> + <tax id="2" name="MVA NO 14%" rate="14" /> + <tax id="3" name="MVA NO 8%" rate="8" /> + + <taxRulesGroup name="NO Standard Rate (25%)"> + <taxRule iso_code_country="no" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="NO Reduced Rate (14%)"> + <taxRule iso_code_country="no" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="NO Super Reduced Rate (8%)"> + <taxRule iso_code_country="no" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/nz.xml b/localization/nz.xml new file mode 100644 index 000000000..888fbab51 --- /dev/null +++ b/localization/nz.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="New Zealand" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="NZD" iso_code_num="554" sign="$" blank="1" conversion_rate="1.85560" format="2" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="GST NZ 15%" rate="15" /> + + <taxRulesGroup name="NZ Standard Rate (15%)"> + <taxRule iso_code_country="nz" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/pk.xml b/localization/pk.xml new file mode 100644 index 000000000..3da6fdd15 --- /dev/null +++ b/localization/pk.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Pakistan" version="1.0"> + <currencies> + <currency name="Rupee" iso_code="PKR" iso_code_num="586" sign="₨" blank="1" conversion_rate="117.289" format="2" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="GST PK 16%" rate="16" /> + <tax id="2" name="GST PK 1%" rate="1" /> + + <taxRulesGroup name="PK Standard Rate (16%)"> + <taxRule iso_code_country="pk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="PK Reduced Rate (1%)"> + <taxRule iso_code_country="pk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/pl.xml b/localization/pl.xml new file mode 100644 index 000000000..76e86a965 --- /dev/null +++ b/localization/pl.xml @@ -0,0 +1,223 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Poland" version="1.0"> + <currencies> + <currency name="Zloty" iso_code="PLN" iso_code_num="985" sign="zł" blank="1" conversion_rate="3.84510" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="pl" /> + </languages> + <taxes> + <tax id="1" name="PTU PL 23%" rate="23" /> + + <tax id="2" name="PTU PL 8%" rate="8" /> + <tax id="3" name="PTU PL 7%" rate="7" /> + <tax id="4" name="PTU PL 5%" rate="5" /> + <tax id="5" name="PTU PL 4%" rate="4" /> + <tax id="6" name="PTU PL 0" rate="0" /> + + <taxRulesGroup name="PL Standard Rate (23%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="PL Reduced Rate (8%)"> + + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + + </taxRulesGroup> + + <taxRulesGroup name="PL Reduced Rate (7%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="PL Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="4" /> + <taxRule iso_code_country="bg" id_tax="4" /> + <taxRule iso_code_country="cz" id_tax="4" /> + + <taxRule iso_code_country="dk" id_tax="4" /> + <taxRule iso_code_country="de" id_tax="4" /> + <taxRule iso_code_country="ee" id_tax="4" /> + <taxRule iso_code_country="gr" id_tax="4" /> + <taxRule iso_code_country="es" id_tax="4" /> + <taxRule iso_code_country="fr" id_tax="4" /> + <taxRule iso_code_country="it" id_tax="4" /> + <taxRule iso_code_country="cy" id_tax="4" /> + <taxRule iso_code_country="lv" id_tax="4" /> + + <taxRule iso_code_country="lt" id_tax="4" /> + <taxRule iso_code_country="lu" id_tax="4" /> + <taxRule iso_code_country="hu" id_tax="4" /> + <taxRule iso_code_country="mt" id_tax="4" /> + <taxRule iso_code_country="nl" id_tax="4" /> + <taxRule iso_code_country="at" id_tax="4" /> + <taxRule iso_code_country="pl" id_tax="4" /> + <taxRule iso_code_country="pt" id_tax="4" /> + <taxRule iso_code_country="ro" id_tax="4" /> + + <taxRule iso_code_country="si" id_tax="4" /> + <taxRule iso_code_country="sk" id_tax="4" /> + <taxRule iso_code_country="fi" id_tax="4" /> + <taxRule iso_code_country="se" id_tax="4" /> + <taxRule iso_code_country="uk" id_tax="4" /> + </taxRulesGroup> + + <taxRulesGroup name="PL Reduced Rate (4%)"> + <taxRule iso_code_country="be" id_tax="5" /> + <taxRule iso_code_country="bg" id_tax="5" /> + + <taxRule iso_code_country="cz" id_tax="5" /> + <taxRule iso_code_country="dk" id_tax="5" /> + <taxRule iso_code_country="de" id_tax="5" /> + <taxRule iso_code_country="ee" id_tax="5" /> + <taxRule iso_code_country="gr" id_tax="5" /> + <taxRule iso_code_country="es" id_tax="5" /> + <taxRule iso_code_country="fr" id_tax="5" /> + <taxRule iso_code_country="it" id_tax="5" /> + <taxRule iso_code_country="cy" id_tax="5" /> + + <taxRule iso_code_country="lv" id_tax="5" /> + <taxRule iso_code_country="lt" id_tax="5" /> + <taxRule iso_code_country="lu" id_tax="5" /> + <taxRule iso_code_country="hu" id_tax="5" /> + <taxRule iso_code_country="mt" id_tax="5" /> + <taxRule iso_code_country="nl" id_tax="5" /> + <taxRule iso_code_country="at" id_tax="5" /> + <taxRule iso_code_country="pl" id_tax="5" /> + <taxRule iso_code_country="pt" id_tax="5" /> + + <taxRule iso_code_country="ro" id_tax="5" /> + <taxRule iso_code_country="si" id_tax="5" /> + <taxRule iso_code_country="sk" id_tax="5" /> + <taxRule iso_code_country="fi" id_tax="5" /> + <taxRule iso_code_country="se" id_tax="5" /> + <taxRule iso_code_country="uk" id_tax="5" /> + </taxRulesGroup> + + <taxRulesGroup name="PL Exempted Rate (0%)"> + <taxRule iso_code_country="be" id_tax="6" /> + + <taxRule iso_code_country="bg" id_tax="6" /> + <taxRule iso_code_country="cz" id_tax="6" /> + <taxRule iso_code_country="dk" id_tax="6" /> + <taxRule iso_code_country="de" id_tax="6" /> + <taxRule iso_code_country="ee" id_tax="6" /> + <taxRule iso_code_country="gr" id_tax="6" /> + <taxRule iso_code_country="es" id_tax="6" /> + <taxRule iso_code_country="fr" id_tax="6" /> + <taxRule iso_code_country="it" id_tax="6" /> + + <taxRule iso_code_country="cy" id_tax="6" /> + <taxRule iso_code_country="lv" id_tax="6" /> + <taxRule iso_code_country="lt" id_tax="6" /> + <taxRule iso_code_country="lu" id_tax="6" /> + <taxRule iso_code_country="hu" id_tax="6" /> + <taxRule iso_code_country="mt" id_tax="6" /> + <taxRule iso_code_country="nl" id_tax="6" /> + <taxRule iso_code_country="at" id_tax="6" /> + <taxRule iso_code_country="pl" id_tax="6" /> + + <taxRule iso_code_country="pt" id_tax="6" /> + <taxRule iso_code_country="ro" id_tax="6" /> + <taxRule iso_code_country="si" id_tax="6" /> + <taxRule iso_code_country="sk" id_tax="6" /> + <taxRule iso_code_country="fi" id_tax="6" /> + <taxRule iso_code_country="se" id_tax="6" /> + <taxRule iso_code_country="uk" id_tax="6" /> + </taxRulesGroup> + + </taxes> + + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> \ No newline at end of file diff --git a/localization/pt.xml b/localization/pt.xml new file mode 100644 index 000000000..a7e9ada85 --- /dev/null +++ b/localization/pt.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Portugal" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="pt" /> + </languages> + <taxes> + <tax id="1" name="IVA PT 23%" rate="23" /> + <tax id="2" name="IVA PT 13%" rate="13" /> + <tax id="3" name="IVA PT 6%" rate="6" /> + + <taxRulesGroup name="PT Standard Rate (23%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="PT Reduced Rate (13%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="PT Super Reduced Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="PT Foodstuff Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="PT Books Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/py.xml b/localization/py.xml new file mode 100644 index 000000000..fc5573ae9 --- /dev/null +++ b/localization/py.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Paraguay" version="1.0"> + <currencies> + <currency name="Guaraní" iso_code="PYG" iso_code_num="600" sign="Gs" blank="1" conversion_rate="6547.98" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA PY 10%" rate="10" /> + <tax id="2" name="IVA PY 5%" rate="5" /> + + <taxRulesGroup name="PY Standard Rate (10%)"> + <taxRule iso_code_country="py" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="PY Reduced Rate (5%)"> + <taxRule iso_code_country="py" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/ro.xml b/localization/ro.xml new file mode 100644 index 000000000..f786be3af --- /dev/null +++ b/localization/ro.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Romania" version="1.0"> + <currencies> + <currency name="Lei" iso_code="RON" iso_code_num="946" sign="lei" blank="1" conversion_rate="4.27111" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ro" /> + </languages> + <taxes> + <tax id="1" name="TVA RO 24%" rate="24" /> + <tax id="2" name="TVA RO 9%" rate="9" /> + <tax id="3" name="TVA RO 5%" rate="5" /> + + <taxRulesGroup name="RO Standard Rate (24%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="RO Reduced Rate (9%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="RO Super Reduced Rate (5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="RO Foodstuff Rate (24%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="RO Books Rate (9%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/ru.xml b/localization/ru.xml new file mode 100644 index 000000000..6ae39065c --- /dev/null +++ b/localization/ru.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Russia" version="1.0"> + <currencies> + <currency name="Ruble" iso_code="RUB" iso_code_num="643" sign="руб" blank="1" conversion_rate="41.7632" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ru" /> + </languages> + <taxes> + <tax id="1" name="НДС RU 18%" rate="18" /> + <tax id="2" name="НДС RU 10%" rate="10" /> + + <taxRulesGroup name="RU Standard Rate (18%)"> + <taxRule iso_code_country="ru" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="RU Reduced Rate (10%)"> + <taxRule iso_code_country="ru" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/sa.xml b/localization/sa.xml new file mode 100644 index 000000000..41e791d84 --- /dev/null +++ b/localization/sa.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Saoudi Arabie" version="1.0"> + <currencies> + <currency name="Riyal" iso_code="SAR" iso_code_num="682" sign="﷼" blank="1" conversion_rate="5.10682" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="ar" /> + </languages> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/se.xml b/localization/se.xml new file mode 100644 index 000000000..afe1a3761 --- /dev/null +++ b/localization/se.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Sweden" version="1.0"> + <currencies> + <currency name="Krona" iso_code="SEK" iso_code_num="752" sign="kr" blank="1" conversion_rate="9.14651" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="se" /> + </languages> + <taxes> + <tax id="1" name="Moms SE 25%" rate="25" /> + <tax id="2" name="Moms SE 12%" rate="12" /> + <tax id="3" name="Moms SE 6%" rate="6" /> + + <taxRulesGroup name="SE Standard Rate (25%)"> + <taxRule iso_code_country="se" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="SE Reduced Rate (12%)"> + <taxRule iso_code_country="se" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="SE Super Reduced Rate (6%)"> + <taxRule iso_code_country="se" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/sg.xml b/localization/sg.xml new file mode 100644 index 000000000..31ad41023 --- /dev/null +++ b/localization/sg.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Singapore" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="SGD" iso_code_num="702" sign="$" blank="1" conversion_rate="1.79109" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="tw" /> + <language iso_code="zh" /> + </languages> + <taxes> + <tax id="1" name="GST SG 7%" rate="7" /> + + <taxRulesGroup name="SG Standard Rate (7%)"> + <taxRule iso_code_country="sg" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="市制" /> + <unit type="volume" value="市升" /> + <unit type="short_distance" value="市厘" /> + <unit type="base_distance" value="里" /> + <unit type="long_distance" value="市里" /> + </units> +</localizationPack> diff --git a/localization/si.xml b/localization/si.xml new file mode 100644 index 000000000..247b7d56d --- /dev/null +++ b/localization/si.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Slovenia" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="sl" /> + </languages> + <taxes> + <tax id="1" name="DDV SI 20%" rate="20" /> + <tax id="2" name="DDV SI 8.5%" rate="8.5" /> + + <taxRulesGroup name="SI Standard Rate (20%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="SI Reduced Rate (8.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="SI Foodstuff Rate (8.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="SI Books Rate (8.5%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/sk.xml b/localization/sk.xml new file mode 100644 index 000000000..013272139 --- /dev/null +++ b/localization/sk.xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Slovakia" version="1.0"> + <currencies> + <currency name="Euro" iso_code="EUR" iso_code_num="978" sign="€" blank="1" conversion_rate="1.00" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="sk" /> + </languages> + <taxes> + <tax id="1" name="DPH SK 19%" rate="19" /> + <tax id="2" name="DPH SK 10%" rate="10" /> + <tax id="3" name="DPH SK 6%" rate="6" /> + + <taxRulesGroup name="SK Standard Rate (19%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="SK Reduced Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="SK Super Reduced Rate (6%)"> + <taxRule iso_code_country="be" id_tax="3" /> + <taxRule iso_code_country="bg" id_tax="3" /> + <taxRule iso_code_country="cz" id_tax="3" /> + <taxRule iso_code_country="dk" id_tax="3" /> + <taxRule iso_code_country="de" id_tax="3" /> + <taxRule iso_code_country="ee" id_tax="3" /> + <taxRule iso_code_country="gr" id_tax="3" /> + <taxRule iso_code_country="es" id_tax="3" /> + <taxRule iso_code_country="fr" id_tax="3" /> + <taxRule iso_code_country="ie" id_tax="3" /> + <taxRule iso_code_country="it" id_tax="3" /> + <taxRule iso_code_country="cy" id_tax="3" /> + <taxRule iso_code_country="lv" id_tax="3" /> + <taxRule iso_code_country="lt" id_tax="3" /> + <taxRule iso_code_country="lu" id_tax="3" /> + <taxRule iso_code_country="hu" id_tax="3" /> + <taxRule iso_code_country="mt" id_tax="3" /> + <taxRule iso_code_country="nl" id_tax="3" /> + <taxRule iso_code_country="at" id_tax="3" /> + <taxRule iso_code_country="pl" id_tax="3" /> + <taxRule iso_code_country="pt" id_tax="3" /> + <taxRule iso_code_country="ro" id_tax="3" /> + <taxRule iso_code_country="si" id_tax="3" /> + <taxRule iso_code_country="sk" id_tax="3" /> + <taxRule iso_code_country="fi" id_tax="3" /> + <taxRule iso_code_country="se" id_tax="3" /> + <taxRule iso_code_country="uk" id_tax="3" /> + </taxRulesGroup> + + <taxRulesGroup name="SK Foodstuff Rate (19%)"> + <taxRule iso_code_country="be" id_tax="1" /> + <taxRule iso_code_country="bg" id_tax="1" /> + <taxRule iso_code_country="cz" id_tax="1" /> + <taxRule iso_code_country="dk" id_tax="1" /> + <taxRule iso_code_country="de" id_tax="1" /> + <taxRule iso_code_country="ee" id_tax="1" /> + <taxRule iso_code_country="gr" id_tax="1" /> + <taxRule iso_code_country="es" id_tax="1" /> + <taxRule iso_code_country="fr" id_tax="1" /> + <taxRule iso_code_country="ie" id_tax="1" /> + <taxRule iso_code_country="it" id_tax="1" /> + <taxRule iso_code_country="cy" id_tax="1" /> + <taxRule iso_code_country="lv" id_tax="1" /> + <taxRule iso_code_country="lt" id_tax="1" /> + <taxRule iso_code_country="lu" id_tax="1" /> + <taxRule iso_code_country="hu" id_tax="1" /> + <taxRule iso_code_country="mt" id_tax="1" /> + <taxRule iso_code_country="nl" id_tax="1" /> + <taxRule iso_code_country="at" id_tax="1" /> + <taxRule iso_code_country="pl" id_tax="1" /> + <taxRule iso_code_country="pt" id_tax="1" /> + <taxRule iso_code_country="ro" id_tax="1" /> + <taxRule iso_code_country="si" id_tax="1" /> + <taxRule iso_code_country="sk" id_tax="1" /> + <taxRule iso_code_country="fi" id_tax="1" /> + <taxRule iso_code_country="se" id_tax="1" /> + <taxRule iso_code_country="uk" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="SK Books Rate (10%)"> + <taxRule iso_code_country="be" id_tax="2" /> + <taxRule iso_code_country="bg" id_tax="2" /> + <taxRule iso_code_country="cz" id_tax="2" /> + <taxRule iso_code_country="dk" id_tax="2" /> + <taxRule iso_code_country="de" id_tax="2" /> + <taxRule iso_code_country="ee" id_tax="2" /> + <taxRule iso_code_country="gr" id_tax="2" /> + <taxRule iso_code_country="es" id_tax="2" /> + <taxRule iso_code_country="fr" id_tax="2" /> + <taxRule iso_code_country="ie" id_tax="2" /> + <taxRule iso_code_country="it" id_tax="2" /> + <taxRule iso_code_country="cy" id_tax="2" /> + <taxRule iso_code_country="lv" id_tax="2" /> + <taxRule iso_code_country="lt" id_tax="2" /> + <taxRule iso_code_country="lu" id_tax="2" /> + <taxRule iso_code_country="hu" id_tax="2" /> + <taxRule iso_code_country="mt" id_tax="2" /> + <taxRule iso_code_country="nl" id_tax="2" /> + <taxRule iso_code_country="at" id_tax="2" /> + <taxRule iso_code_country="pl" id_tax="2" /> + <taxRule iso_code_country="pt" id_tax="2" /> + <taxRule iso_code_country="ro" id_tax="2" /> + <taxRule iso_code_country="si" id_tax="2" /> + <taxRule iso_code_country="sk" id_tax="2" /> + <taxRule iso_code_country="fi" id_tax="2" /> + <taxRule iso_code_country="se" id_tax="2" /> + <taxRule iso_code_country="uk" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/sv.xml b/localization/sv.xml new file mode 100644 index 000000000..fb448fd65 --- /dev/null +++ b/localization/sv.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="El Salvador" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="USD" iso_code_num="840" sign="$" blank="0" conversion_rate="1.36550" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA SV 13%" rate="13" /> + + <taxRulesGroup name="SV Standard Rate (13%)"> + <taxRule iso_code_country="sv" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/th.xml b/localization/th.xml new file mode 100644 index 000000000..e3cc32314 --- /dev/null +++ b/localization/th.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Thailand" version="1.0"> + <currencies> + <currency name="Baht" iso_code="THB" iso_code_num="978" sign="฿" blank="1" conversion_rate="41.4441" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="th" /> + </languages> + <taxes> + <tax id="1" name="VAT TH 7%" rate="7" /> + + <taxRulesGroup name="TH Standard Rate (7%)"> + <taxRule iso_code_country="th" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="base_distance" value="wah" /> + </units> +</localizationPack> diff --git a/localization/tr.xml b/localization/tr.xml new file mode 100644 index 000000000..bf9acd994 --- /dev/null +++ b/localization/tr.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Turkey" version="1.0"> + <currencies> + <currency name="Lira" iso_code="TRY" iso_code_num="949" sign="TL" blank="1" conversion_rate="1.97638" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="tr" /> + </languages> + <taxes> + <tax id="1" name="KDV TR 18%" rate="18" /> + <tax id="2" name="KDV TR 8%" rate="8" /> + <tax id="3" name="KDV TR 1%" rate="1" /> + + <taxRulesGroup name="TR Standard Rate (18%)"> + <taxRule iso_code_country="tr" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="TR Reduced Rate (8%)"> + <taxRule iso_code_country="tr" id_tax="2" /> + </taxRulesGroup> + + <taxRulesGroup name="TR Super Reduced Rate (1%)"> + <taxRule iso_code_country="tr" id_tax="3" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/tw.xml b/localization/tw.xml new file mode 100644 index 000000000..b69d0e669 --- /dev/null +++ b/localization/tw.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Taiwan" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="TWD" iso_code_num="901" sign="NT$" blank="1" conversion_rate="42.6479" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="tw" /> + <language iso_code="zh" /> + </languages> + <taxes> + <tax id="1" name="VAT TW 5%" rate="5" /> + + <taxRulesGroup name="TW Standard Rate (5%)"> + <taxRule iso_code_country="tw" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="市制" /> + <unit type="volume" value="市升" /> + <unit type="short_distance" value="市厘" /> + <unit type="base_distance" value="里" /> + <unit type="long_distance" value="市里" /> + </units> +</localizationPack> diff --git a/localization/ua.xml b/localization/ua.xml new file mode 100644 index 000000000..570dbee03 --- /dev/null +++ b/localization/ua.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Ukraine" version="1.0"> + <currencies> + <currency name="Hryvnia" iso_code="UAH" iso_code_num="980" sign="₴" blank="1" conversion_rate="10.8304" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="uk" /> + </languages> + <taxes> + <tax id="1" name="ПДВ UA 20%" rate="20" /> + + <taxRulesGroup name="UA Standard Rate (20%)"> + <taxRule iso_code_country="ua" id_tax="1" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="cm" /> + <unit type="base_distance" value="m" /> + <unit type="long_distance" value="km" /> + </units> +</localizationPack> diff --git a/localization/us.xml b/localization/us.xml new file mode 100644 index 000000000..ff3b8a8ee --- /dev/null +++ b/localization/us.xml @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="USA" version="1.0"> + <currencies> + <currency name="Dollar" iso_code="USD" iso_code_num="840" sign="$" blank="0" conversion_rate="1.31153" format="1" decimals="1" /> + </currencies> + <taxes> + <tax id="1" name="Sales-taxes US-AL 4%" rate="4" /> + <tax id="2" name="Sales-taxes US-AK 0%" rate="0" /> + <tax id="3" name="Sales-taxes US-AZ 6.6%" rate="6.6" /> + <tax id="4" name="Sales-taxes US-AR 6%" rate="6" /> + <tax id="5" name="Sales-taxes US-CA 8.25%" rate="8.25" /> + <tax id="6" name="Sales-taxes US-CO 2.9%" rate="2.9" /> + <tax id="7" name="Sales-taxes US-CT 0%" rate="0.0" /> + <tax id="8" name="Sales-taxes US-DE 0%" rate="0.0" /> + <tax id="9" name="Sales-taxes US-FL 6%" rate="6" /> + <tax id="10" name="Sales-taxes US-GA 4%" rate="4" /> + <tax id="11" name="Sales-taxes US-HI 4%" rate="4" /> + <tax id="12" name="Sales-taxes US-ID 6%" rate="6" /> + <tax id="13" name="Sales-taxes US-IL 6.25%" rate="6.25" /> + <tax id="14" name="Sales-taxes US-IN 7%" rate="7" /> + <tax id="15" name="Sales-taxes US-IA 6%" rate="6" /> + <tax id="16" name="Sales-taxes US-KS 5.3%" rate="5.3" /> + <tax id="17" name="Sales-taxes US-KY 6%" rate="6" /> + <tax id="18" name="Sales-taxes US-LA 4%" rate="4" /> + <tax id="19" name="Sales-taxes US-ME 5%" rate="5" /> + <tax id="20" name="Sales-taxes US-MD 6%" rate="6" /> + <tax id="21" name="Sales-taxes US-MA 6.25%" rate="6.25" /> + <tax id="22" name="Sales-taxes US-MI 6%" rate="6" /> + <tax id="23" name="Sales-taxes US-MN 6.875%" rate="6.875" /> + <tax id="24" name="Sales-taxes US-MS 7%" rate="7" /> + <tax id="25" name="Sales-taxes US-MO 4.225%" rate="4.225" /> + <tax id="26" name="Sales-taxes US-MT 0.0%" rate="0.0" /> + <tax id="27" name="Sales-taxes US-NE 5.5%" rate="5.5" /> + <tax id="28" name="Sales-taxes US-NV 6.85%" rate="6.85" /> + <tax id="29" name="Sales-taxes US-NH 0%" rate="0.0" /> + <tax id="30" name="Sales-taxes US-NJ 7%" rate="7" /> + <tax id="31" name="Sales-taxes US-NM 5.125%" rate="5.125" /> + <tax id="32" name="Sales-taxes US-NY 4%" rate="4" /> + <tax id="33" name="Sales-taxes US-NC 5.5%" rate="5.5" /> + <tax id="34" name="Sales-taxes US-ND 5%" rate="5" /> + <tax id="35" name="Sales-taxes US-OH 5.5%" rate="5.5" /> + <tax id="36" name="Sales-taxes US-OK 4.5%" rate="4.5" /> + <tax id="37" name="Sales-taxes US-OR 0%" rate="0.0" /> + <tax id="38" name="Sales-taxes US-PA 6%" rate="6" /> + <tax id="39" name="Sales-taxes US-RI 7%" rate="7" /> + <tax id="40" name="Sales-taxes US-SC 6%" rate="6" /> + <tax id="41" name="Sales-taxes US-SD 4%" rate="4" /> + <tax id="42" name="Sales-taxes US-TN 7%" rate="7" /> + <tax id="43" name="Sales-taxes US-TX 6.25%" rate="6.25" /> + <tax id="44" name="Sales-taxes US-UT 4.75%" rate="4.75" /> + <tax id="45" name="Sales-taxes US-VT 6%" rate="6" /> + <tax id="46" name="Sales-taxes US-VA 4%" rate="4" /> + <tax id="47" name="Sales-taxes US-WA 6.5%" rate="6.5" /> + <tax id="48" name="Sales-taxes US-WV 6%" rate="6" /> + <tax id="49" name="Sales-taxes US-WI 5%" rate="5" /> + <tax id="50" name="Sales-taxes US-WY 4%" rate="4" /> + <tax id="51" name="Sales-taxes US-PR 5.5%" rate="5.5" /> + <tax id="52" name="Sales-taxes US-DC 6%" rate="6" /> + + + <taxRulesGroup name="US-AL Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="al" state_behavior="1" id_tax="1" /> + </taxRulesGroup> + <taxRulesGroup name="US-AK Rate (0%)"> + <taxRule iso_code_country="us" iso_code_state="ak" state_behavior="1" id_tax="2" /> + </taxRulesGroup> + <taxRulesGroup name="US-AZ Rate (6.6%)"> + <taxRule iso_code_country="us" iso_code_state="az" state_behavior="1" id_tax="3" /> + </taxRulesGroup> + <taxRulesGroup name="US-AR Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="ar" state_behavior="1" id_tax="4" /> + </taxRulesGroup> + <taxRulesGroup name="US-CA Rate (8.25%)"> + <taxRule iso_code_country="us" iso_code_state="ca" state_behavior="1" id_tax="5" /> + </taxRulesGroup> + <taxRulesGroup name="US-CO Rate (2.9%)"> + <taxRule iso_code_country="us" iso_code_state="co" state_behavior="1" id_tax="6" /> + </taxRulesGroup> + <taxRulesGroup name="US-CT Rate (0%)"> + <taxRule iso_code_country="us" iso_code_state="ct" state_behavior="1" id_tax="7" /> + </taxRulesGroup> + <taxRulesGroup name="US-DE Rate (0%)"> + <taxRule iso_code_country="us" iso_code_state="de" state_behavior="1" id_tax="8" /> + </taxRulesGroup> + <taxRulesGroup name="US-FL Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="fl" state_behavior="1" id_tax="9" /> + </taxRulesGroup> + <taxRulesGroup name="US-GA Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="ga" state_behavior="1" id_tax="10" /> + </taxRulesGroup> + <taxRulesGroup name="US-HI Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="hi" state_behavior="1" id_tax="11" /> + </taxRulesGroup> + <taxRulesGroup name="US-ID Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="id" state_behavior="1" id_tax="12" /> + </taxRulesGroup> + <taxRulesGroup name="US-IL Rate (6.25%)"> + <taxRule iso_code_country="us" iso_code_state="il" state_behavior="1" id_tax="13" /> + </taxRulesGroup> + <taxRulesGroup name="US-IN Rate (7%)"> + <taxRule iso_code_country="us" iso_code_state="in" state_behavior="1" id_tax="14" /> + </taxRulesGroup> + <taxRulesGroup name="US-IA Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="ia" state_behavior="1" id_tax="15" /> + </taxRulesGroup> + <taxRulesGroup name="US-KS Rate (5.3%)"> + <taxRule iso_code_country="us" iso_code_state="ks" state_behavior="1" id_tax="16" /> + </taxRulesGroup> + <taxRulesGroup name="US-KY Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="ky" state_behavior="1" id_tax="17" /> + </taxRulesGroup> + <taxRulesGroup name="US-LA Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="la" state_behavior="1" id_tax="18" /> + </taxRulesGroup> + <taxRulesGroup name="US-ME Rate (5%)"> + <taxRule iso_code_country="us" iso_code_state="me" state_behavior="1" id_tax="19" /> + </taxRulesGroup> + <taxRulesGroup name="US-MD Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="md" state_behavior="1" id_tax="20" /> + </taxRulesGroup> + <taxRulesGroup name="US-MA Rate (6.25%)"> + <taxRule iso_code_country="us" iso_code_state="ma" state_behavior="1" id_tax="21" /> + </taxRulesGroup> + <taxRulesGroup name="US-MI Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="mi" state_behavior="1" id_tax="22" /> + </taxRulesGroup> + <taxRulesGroup name="US-MN Rate (6.875%)"> + <taxRule iso_code_country="us" iso_code_state="mn" state_behavior="1" id_tax="23" /> + </taxRulesGroup> + <taxRulesGroup name="US-MS Rate (7%)"> + <taxRule iso_code_country="us" iso_code_state="ms" state_behavior="1" id_tax="24" /> + </taxRulesGroup> + <taxRulesGroup name="US-MO Rate (4.225%)"> + <taxRule iso_code_country="us" iso_code_state="mo" state_behavior="1" id_tax="25" /> + </taxRulesGroup> + <taxRulesGroup name="US-MT Rate (0%)"> + <taxRule iso_code_country="us" iso_code_state="mt" state_behavior="1" id_tax="26" /> + </taxRulesGroup> + <taxRulesGroup name="US-NE Rate (5.5%)"> + <taxRule iso_code_country="us" iso_code_state="ne" state_behavior="1" id_tax="27" /> + </taxRulesGroup> + <taxRulesGroup name="US-NV Rate (6.85%)"> + <taxRule iso_code_country="us" iso_code_state="nv" state_behavior="1" id_tax="28" /> + </taxRulesGroup> + <taxRulesGroup name="US-NH Rate (0%)"> + <taxRule iso_code_country="us" iso_code_state="nh" state_behavior="1" id_tax="29" /> + </taxRulesGroup> + <taxRulesGroup name="US-NJ Rate (7%)"> + <taxRule iso_code_country="us" iso_code_state="nj" state_behavior="1" id_tax="30" /> + </taxRulesGroup> + <taxRulesGroup name="US-NM Rate (5.125%)"> + <taxRule iso_code_country="us" iso_code_state="nm" state_behavior="1" id_tax="31" /> + </taxRulesGroup> + <taxRulesGroup name="US-NY Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="ny" state_behavior="1" id_tax="32" /> + </taxRulesGroup> + <taxRulesGroup name="US-NC Rate (5.5%)"> + <taxRule iso_code_country="us" iso_code_state="nc" state_behavior="1" id_tax="33" /> + </taxRulesGroup> + <taxRulesGroup name="US-ND Rate (5%)"> + <taxRule iso_code_country="us" iso_code_state="nd" state_behavior="1" id_tax="34" /> + </taxRulesGroup> + <taxRulesGroup name="US-OH Rate (5.5%)"> + <taxRule iso_code_country="us" iso_code_state="oh" state_behavior="1" id_tax="35" /> + </taxRulesGroup> + <taxRulesGroup name="US-OK Rate (4.5%)"> + <taxRule iso_code_country="us" iso_code_state="ok" state_behavior="1" id_tax="36" /> + </taxRulesGroup> + <taxRulesGroup name="US-OR Rate (0%)"> + <taxRule iso_code_country="us" iso_code_state="or" state_behavior="1" id_tax="37" /> + </taxRulesGroup> + <taxRulesGroup name="US-PA Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="pa" state_behavior="1" id_tax="38" /> + </taxRulesGroup> + <taxRulesGroup name="US-RI Rate (7%)"> + <taxRule iso_code_country="us" iso_code_state="ri" state_behavior="1" id_tax="39" /> + </taxRulesGroup> + <taxRulesGroup name="US-SC Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="sc" state_behavior="1" id_tax="40" /> + </taxRulesGroup> + <taxRulesGroup name="US-SD Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="sd" state_behavior="1" id_tax="41" /> + </taxRulesGroup> + <taxRulesGroup name="US-TN Rate (7%)"> + <taxRule iso_code_country="us" iso_code_state="tn" state_behavior="1" id_tax="42" /> + </taxRulesGroup> + <taxRulesGroup name="US-TX Rate (6.25%)"> + <taxRule iso_code_country="us" iso_code_state="tx" state_behavior="1" id_tax="43" /> + </taxRulesGroup> + <taxRulesGroup name="US-UT Rate (4.75%)"> + <taxRule iso_code_country="us" iso_code_state="ut" state_behavior="1" id_tax="44" /> + </taxRulesGroup> + <taxRulesGroup name="US-VT Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="vt" state_behavior="1" id_tax="45" /> + </taxRulesGroup> + <taxRulesGroup name="US-VA Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="va" state_behavior="1" id_tax="46" /> + </taxRulesGroup> + <taxRulesGroup name="US-WA Rate (6.5%)"> + <taxRule iso_code_country="us" iso_code_state="wa" state_behavior="1" id_tax="47" /> + </taxRulesGroup> + <taxRulesGroup name="US-WV Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="wv" state_behavior="1" id_tax="48" /> + </taxRulesGroup> + <taxRulesGroup name="US-WI Rate (5%)"> + <taxRule iso_code_country="us" iso_code_state="wi" state_behavior="1" id_tax="49" /> + </taxRulesGroup> + <taxRulesGroup name="US-WY Rate (4%)"> + <taxRule iso_code_country="us" iso_code_state="wy" state_behavior="1" id_tax="50" /> + </taxRulesGroup> + <taxRulesGroup name="US-PR Rate (5.5%)"> + <taxRule iso_code_country="us" iso_code_state="pr" state_behavior="1" id_tax="51" /> + </taxRulesGroup> + <taxRulesGroup name="US-DC Rate (6%)"> + <taxRule iso_code_country="us" iso_code_state="dc" state_behavior="1" id_tax="52" /> + </taxRulesGroup> + </taxes> + <states> + <state name="Alabama" iso_code="AL" country="US" zone="North America" /> + <state name="Alaska" iso_code="AK" country="US" zone="North America" /> + <state name="Arizona" iso_code="AZ" country="US" zone="North America" /> + <state name="Arkansas" iso_code="AR" country="US" zone="North America" /> + <state name="California" iso_code="CA" country="US" zone="North America" /> + <state name="Colorado" iso_code="CO" country="US" zone="North America" /> + <state name="Connecticut" iso_code="CT" country="US" zone="North America" /> + <state name="Delaware" iso_code="DE" country="US" zone="North America" /> + <state name="Florida" iso_code="FL" country="US" zone="North America" /> + <state name="Georgia" iso_code="GA" country="US" zone="North America" /> + <state name="Hawaii" iso_code="HI" country="US" zone="North America" /> + <state name="Idaho" iso_code="ID" country="US" zone="North America" /> + <state name="Illinois" iso_code="IL" country="US" zone="North America" /> + <state name="Indiana" iso_code="IN" country="US" zone="North America" /> + <state name="Iowa" iso_code="IA" country="US" zone="North America" /> + <state name="Kansas" iso_code="KS" country="US" zone="North America" /> + <state name="Kentucky" iso_code="KY" country="US" zone="North America" /> + <state name="Louisiana" iso_code="LA" country="US" zone="North America" /> + <state name="Maine" iso_code="ME" country="US" zone="North America" /> + <state name="Maryland" iso_code="MD" country="US" zone="North America" /> + <state name="Massachusetts" iso_code="MA" country="US" zone="North America" /> + <state name="Michigan" iso_code="MI" country="US" zone="North America" /> + <state name="Minnesota" iso_code="MN" country="US" zone="North America" /> + <state name="Mississippi" iso_code="MS" country="US" zone="North America" /> + <state name="Missouri" iso_code="MO" country="US" zone="North America" /> + <state name="Montana" iso_code="MT" country="US" zone="North America" /> + <state name="Nebraska" iso_code="NE" country="US" zone="North America" /> + <state name="Nevada" iso_code="NV" country="US" zone="North America" /> + <state name="New Hampshire" iso_code="NH" country="US" zone="North America" /> + <state name="New Jersey" iso_code="NJ" country="US" zone="North America" /> + <state name="New Mexico" iso_code="NM" country="US" zone="North America" /> + <state name="North California" iso_code="NC" country="US" zone="North America" /> + <state name="North Dakota" iso_code="ND" country="US" zone="North America" /> + <state name="Ohio" iso_code="OH" country="US" zone="North America" /> + <state name="Oklahoma" iso_code="OK" country="US" zone="North America" /> + <state name="Oregon" iso_code="OR" country="US" zone="North America" /> + <state name="Pennsylvania" iso_code="PA" country="US" zone="North America" /> + <state name="Rhode Island" iso_code="RI" country="US" zone="North America" /> + <state name="South California" iso_code="SC" country="US" zone="North America" /> + <state name="South Dakota" iso_code="SD" country="US" zone="North America" /> + <state name="Tennessee" iso_code="TN" country="US" zone="North America" /> + <state name="Texas" iso_code="TX" country="US" zone="North America" /> + <state name="Utah" iso_code="UT" country="US" zone="North America" /> + <state name="Vermont" iso_code="VT" country="US" zone="North America" /> + <state name="Virginia" iso_code="VA" country="US" zone="North America" /> + <state name="Washington" iso_code="WA" country="US" zone="North America" /> + <state name="West Virginia" iso_code="WV" country="US" zone="North America" /> + <state name="Wisconsin" iso_code="WI" country="US" zone="North America" /> + <state name="Wyoming" iso_code="WY" country="US" zone="North America" /> + <state name="Puerto Rico" iso_code="PR" country="US" zone="North America" /> + <state name="US Virgin Islands" iso_code="VI" country="US" zone="North America" /> + <state name="District of Columbia" iso_code="DC" country="US" zone="North America" /> + </states> + <units> + <unit type="weight" value="lb" /> + <unit type="volume" value="gal" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> + <modules> + <module name="carriercompare" install="1" /> + </modules> + <configurations> + <configuration name="PS_TAX_DISPLAY" value="1" /> + </configurations> + <group_default price_display_method="1" /> +</localizationPack> + diff --git a/localization/uy.xml b/localization/uy.xml new file mode 100644 index 000000000..f96338929 --- /dev/null +++ b/localization/uy.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Uruguay" version="1.0"> + <currencies> + <currency name="Peso" iso_code="UYU" iso_code_num="858" sign="$U" blank="1" conversion_rate="27.5471" format="1" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA UY 22%" rate="22" /> + <tax id="2" name="IVA UY 10%" rate="10" /> + + <taxRulesGroup name="UY Standard Rate (22%)"> + <taxRule iso_code_country="uy" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="UY Reduced Rate (10%)"> + <taxRule iso_code_country="uy" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/ve.xml b/localization/ve.xml new file mode 100644 index 000000000..23480f630 --- /dev/null +++ b/localization/ve.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Venezuela" version="1.0"> + <currencies> + <currency name="Bolívar fuerte" iso_code="VEF" iso_code_num="937" sign="Bs" blank="1" conversion_rate="5.84819" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="es" /> + </languages> + <taxes> + <tax id="1" name="IVA VE 12%" rate="12" /> + <tax id="2" name="IVA VE 11%" rate="11" /> + + <taxRulesGroup name="VE Standard Rate (12%)"> + <taxRule iso_code_country="ve" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="VE Reduced Rate (11%)"> + <taxRule iso_code_country="ve" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="ft" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/localization/vn.xml b/localization/vn.xml new file mode 100644 index 000000000..511150333 --- /dev/null +++ b/localization/vn.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<localizationPack name="Vietnam" version="1.0"> + <currencies> + <currency name="đồng" iso_code="VND" iso_code_num="704" sign="₫" blank="1" conversion_rate="26505.85" format="2" decimals="1" /> + </currencies> + <languages> + <language iso_code="vi" /> + </languages> + <taxes> + <tax id="1" name="GTGT VN 10%" rate="10" /> + <tax id="2" name="GTGT VN 5%" rate="5" /> + + <taxRulesGroup name="VN Standard Rate (10%)"> + <taxRule iso_code_country="vn" id_tax="1" /> + </taxRulesGroup> + + <taxRulesGroup name="VN Reduced Rate (5%)"> + <taxRule iso_code_country="vn" id_tax="2" /> + </taxRulesGroup> + </taxes> + <units> + <unit type="weight" value="kg" /> + <unit type="volume" value="L" /> + <unit type="short_distance" value="in" /> + <unit type="base_distance" value="dong" /> + <unit type="long_distance" value="mi" /> + </units> +</localizationPack> diff --git a/log/.htaccess b/log/.htaccess new file mode 100755 index 000000000..93169e4eb --- /dev/null +++ b/log/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/log/index.php b/log/index.php new file mode 100755 index 000000000..ab85ebaf4 --- /dev/null +++ b/log/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/mails/de/account.html b/mails/de/account.html new file mode 100644 index 000000000..491d70390 --- /dev/null +++ b/mails/de/account.html @@ -0,0 +1,52 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Konto-Login-Details</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">E-Mail-Adresse: <strong><span style="color: #db3484;">{email}</span></strong> <br />Kennwort: <strong>{passwd}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Sicherheitstipps:</strong> <br /><br />Sch&uuml;tzen Sie Ihre Kontodetails. <br />Geben Sie Ihre Login-Details nicht an Dritte weiter. <br />&Auml;ndern Sie Ihr Kennwort regelm&auml;&szlig;ig. <br />Falls Sie vermuten, dass jemand Ihr Konto unerlaubt benutzt, benachrichtigen Sie uns bitte sofort.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen nun Bestellungen auf unserer Webseite vornehmen: <a href="{shop_url}">{shop_name}</a>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/account.txt b/mails/de/account.txt new file mode 100644 index 000000000..cbf70afd5 --- /dev/null +++ b/mails/de/account.txt @@ -0,0 +1,18 @@ +Hallo {firstname} {lastname}, + +Ihre Konto-Login-Details + +E-Mail-Adresse: {email} +Kennwort: {passwd} + +Sicherheitstipps: + +* Schützen Sie Ihre Kontodetails. +* Geben Sie Ihre Login-Details nicht an Dritte weiter. +* Ändern Sie Ihr Kennwort regelmäßig. +* Falls Sie vermuten, dass jemand Ihr Konto unerlaubt benutzt, benachrichtigen Sie uns bitte sofort. + +Sie können nun Bestellungen auf unserer Webseite vornehmen: {shop_name}. + +{shop_name} powered with PrestaShop™ + diff --git a/mails/de/bankwire.html b/mails/de/bankwire.html new file mode 100644 index 000000000..de47c131f --- /dev/null +++ b/mails/de/bankwire.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Bestellung Nr.{id_order} <br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Ihre Bestellung wurde erfolgreich aufgenommen und wird, sobald die Zahlung eingegangen ist, versendet.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Bitte beachten Sie, dass Sie die Bank&uuml;berweisung f&uuml;r Ihre Zahlung gew&auml;hlt haben. Bitte senden Sie Ihre Bank&uuml;berweisung an: <br /><br /><strong>{bankwire_owner}</strong> <br /><br />{bankwire_details} <br /><br />{bankwire_address} <br /><br />Der Gesamtbetrag der Bestellung ist {total_paid}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/bankwire.txt b/mails/de/bankwire.txt new file mode 100644 index 000000000..e8e73a491 --- /dev/null +++ b/mails/de/bankwire.txt @@ -0,0 +1,20 @@ +Hallo {firstname} {lastname}, + +Ihre Bestellung Nr.{id_order} Verlauf + +Ihre Bestellung wurde erfolgreich aufgenommen und wird, sobald die Zahlung eingegangen ist, versendet. + +Bitte beachten Sie, dass Sie die Banküberweisung für Ihre Zahlung gewählt haben. Bitte senden Sie Ihre Banküberweisung an: + +{bankwire_owner} + +{bankwire_details} + +{bankwire_address} + +Der Gesamtbetrag der Bestellung ist {total_paid} + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/cheque.html b/mails/de/cheque.html new file mode 100644 index 000000000..32443f6a4 --- /dev/null +++ b/mails/de/cheque.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihr Bestellverlauf {order_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Ihre Bestellung wurde erfolgreich aufgenommen und wird, sobald die Zahlung eingegangen ist, versendet.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Bitte beachten Sie, dass Sie die Zahlung per Scheck gew&auml;hlt haben. Bitte senden Sie Ihren Scheck an: <br /><br />- ein Betrag &uuml;ber <strong>{total_paid}</strong> <br /><br />- zahlbar an <strong>{cheque_name}</strong> <br /><br />- Adresse <strong>{cheque_address_html}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/cheque.txt b/mails/de/cheque.txt new file mode 100644 index 000000000..07627441b --- /dev/null +++ b/mails/de/cheque.txt @@ -0,0 +1,18 @@ +Hallo {firstname} {lastname}, + +Ihr Bestellverlauf {order_name} + +Ihre Bestellung wurde erfolgreich aufgenommen und wird, sobald die Zahlung eingegangen ist, versendet. + +Bitte beachten Sie, dass Sie die Zahlung per Scheck gewählt haben. Bitte senden Sie Ihren Scheck an: + +- ein Betrag über {total_paid} + +- zahlbar an {cheque_name} + +- Adresse {cheque_address_html} + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/contact.html b/mails/de/contact.html new file mode 100644 index 000000000..45e7e2c1a --- /dev/null +++ b/mails/de/contact.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nachricht von Ihrem Shop {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">E-Mail-Adresse: <a href="mailto:{email}"><strong>{email}</strong></a> <br /><br />Nachricht: {message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/contact.txt b/mails/de/contact.txt new file mode 100644 index 000000000..588cf1429 --- /dev/null +++ b/mails/de/contact.txt @@ -0,0 +1,7 @@ +Nachricht von Ihrem Shop {shop_name} + +E-Mail-Adresse: {email} + +Nachricht: {message} + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/contact_form.html b/mails/de/contact_form.html new file mode 100644 index 000000000..fb6288278 --- /dev/null +++ b/mails/de/contact_form.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Nachricht wurde korrekt an unseren Kundendienst weitergeleitet.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Ihre Nachricht: {message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Wir werden so schnell wie m&ouml;glich antworten.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/contact_form.txt b/mails/de/contact_form.txt new file mode 100644 index 000000000..34b119529 --- /dev/null +++ b/mails/de/contact_form.txt @@ -0,0 +1,7 @@ +Ihre Nachricht wurde korrekt an unseren Kundendienst weitergeleitet. + +Ihre Nachricht: {message} + +Wir werden so schnell wie möglich antworten. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/credit_slip.html b/mails/de/credit_slip.html new file mode 100644 index 000000000..14ed83103 --- /dev/null +++ b/mails/de/credit_slip.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Bestellung Nr.{id_order} <br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Damit werden Sie &uuml;ber die Erstellung eines Gutscheins auf Ihren Namen nach Ihrer Bestellung Nr. {id_order} informiert.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}order-follow.php">"Bestellverfolgung"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/credit_slip.txt b/mails/de/credit_slip.txt new file mode 100644 index 000000000..ea19637c1 --- /dev/null +++ b/mails/de/credit_slip.txt @@ -0,0 +1,9 @@ +Hallo {firstname} {lastname}, + +Ihre Bestellung Nr.{id_order} + +Damit werden Sie über die Erstellung eines Gutscheins auf Ihren Namen nach Ihrer Bestellung Nr. {id_order} informiert. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverfolgung" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/download-product.tpl b/mails/de/download-product.tpl new file mode 100644 index 000000000..e3ceccc3a --- /dev/null +++ b/mails/de/download-product.tpl @@ -0,0 +1,13 @@ +<ul> +{foreach from=$virtualProducts item=product} + <li> + <a href="{$product.link}">{$product.name}</a> + {if isset($product.deadline)} + expires on {$product.deadline} + {/if} + {if isset($product.downloadable)} + downloadable {$product.downloadable} times + {/if} + </li> +{/foreach} +</ul> \ No newline at end of file diff --git a/mails/de/download_product.html b/mails/de/download_product.html new file mode 100644 index 000000000..660925161 --- /dev/null +++ b/mails/de/download_product.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>, danke f&uuml;r Ihren Einkauf bei <strong>{shop_name}</strong>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Produkt (e) zum Download</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Es liegen f&uuml;r Sie {nbProducts} Produkt (e) zum Download bereit.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hier sind direkte Links zu diesen Produkten: {virtualProducts}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/download_product.txt b/mails/de/download_product.txt new file mode 100644 index 000000000..b812a0159 --- /dev/null +++ b/mails/de/download_product.txt @@ -0,0 +1,12 @@ +Hallo {firstname} {lastname}, danke für Ihren Einkauf bei {shop_name}. + +Produkt (e) zum Download + +Es liegen für Sie {nbProducts} Produkt (e) zum Download bereit. + +Hier sind direkte Links zu diesen Produkten: {virtualProducts} + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/employee_password.html b/mails/de/employee_password.html new file mode 100644 index 000000000..3071fdf69 --- /dev/null +++ b/mails/de/employee_password.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre pers&ouml;nlichen Login-Daten</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Vorname</strong>: {firstname}<br /><strong>Nachname</strong>: {lastname}<br /><strong>Kennwort</strong>: {passwd}<br /><strong>E-Mail-Adresse</strong>: {email}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/employee_password.txt b/mails/de/employee_password.txt new file mode 100644 index 000000000..2b71efd2d --- /dev/null +++ b/mails/de/employee_password.txt @@ -0,0 +1,10 @@ +Hallo {firstname} {lastname}, + +Ihre persönlichen Login-Daten + +Vorname: {firstname} +Nachname: {lastname} +Kennwort: {passwd} +E-Mail-Adresse: {email} + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/forward_msg.html b/mails/de/forward_msg.html new file mode 100644 index 000000000..f20282b12 --- /dev/null +++ b/mails/de/forward_msg.html @@ -0,0 +1,16 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td style="border: 1px solid #CCCCCC; background-color: #ffffff; padding: 10px; color: #383838; font-size: 12px;">{employee} wollte Ihnen diesen Chat weiterleiten. <br /><br />{messages} <br /><br />{employee} f&uuml;gte"{comment}" hinzu.</td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/forward_msg.txt b/mails/de/forward_msg.txt new file mode 100644 index 000000000..dd1b9ed73 --- /dev/null +++ b/mails/de/forward_msg.txt @@ -0,0 +1,4 @@ +{employee} wollte Ihnen diesen Chat weiterleiten. +Kommentar: {comment} + +{messages} diff --git a/mails/de/guest_to_customer.html b/mails/de/guest_to_customer.html new file mode 100644 index 000000000..d24fc405a --- /dev/null +++ b/mails/de/guest_to_customer.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihr Gast-Konto wurde in ein Kunden-Konto umgewandelt</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>E-Mail-Adresse:</strong> {email}<br /><strong>Kennword:</strong> {passwd}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Bitte seien Sie vorsichtig bei der gemeinsamen Nutzung dieser Login-Daten mit anderen. <br /><br />Sie k&ouml;nnen auf Ihr Konto auf unserer Webseite zugreifen: {shop_url}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/guest_to_customer.txt b/mails/de/guest_to_customer.txt new file mode 100644 index 000000000..ccbed22c5 --- /dev/null +++ b/mails/de/guest_to_customer.txt @@ -0,0 +1,12 @@ +Hallo {firstname} {lastname}, + +Ihr Gast-Konto wurde in ein Kunden-Konto umgewandelt + +E-Mail-Adresse: {email} +Kennword: {passwd} + +Bitte seien Sie vorsichtig bei der gemeinsamen Nutzung dieser Login-Daten mit anderen. + +Sie können auf Ihr Konto auf unserer Webseite zugreifen: {shop_url} + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/in_transit.html b/mails/de/in_transit.html new file mode 100644 index 000000000..86b318e64 --- /dev/null +++ b/mails/de/in_transit.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Bestellung Nr.{id_order} <br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihre Bestellung ist derzeit auf dem Weg.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen Ihr Paket verfolgen, indem Sie auf den folgenden Link klicken: <a href="{followup}">{followup}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/in_transit.txt b/mails/de/in_transit.txt new file mode 100644 index 000000000..bdb73e217 --- /dev/null +++ b/mails/de/in_transit.txt @@ -0,0 +1,12 @@ +Hallo {firstname} {lastname}, + +Ihre Bestellung Nr.{id_order} + +Ihre Bestellung ist derzeit auf dem Weg. + +Sie können Ihr Paket verfolgen, indem Sie auf den folgenden Link klicken: {followup} + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/index.php b/mails/de/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/mails/de/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/mails/de/lang.php b/mails/de/lang.php new file mode 100644 index 000000000..130b3379f --- /dev/null +++ b/mails/de/lang.php @@ -0,0 +1,39 @@ +<?php + +global $_LANGMAIL; +$_LANGMAIL = array(); +$_LANGMAIL['Welcome!'] = 'Willkommen!'; +$_LANGMAIL['Message from contact form'] = 'Mitteilung via Kontaktformular'; +$_LANGMAIL['Your message has been correctly sent'] = 'Ihre Nachricht ist korrekt gesendet worden'; +$_LANGMAIL['New credit slip regarding your order'] = 'Neuer Gutschein zu Ihrer Bestellung'; +$_LANGMAIL['Virtual product to download'] = 'Produkt zum Download'; +$_LANGMAIL['Fwd: Customer message'] = 'Fwd: Kundennachricht'; +$_LANGMAIL['Your guest account has been transformed to customer account'] = 'Ihr Gast-Konto wurde in ein Kunden-Konto umgewandelt'; +$_LANGMAIL['Package in transit'] = 'Warensendung abgeschickt'; +$_LANGMAIL['[Log'] = '[Log'; +$_LANGMAIL['Order confirmation'] = 'Bestellbestätigung'; +$_LANGMAIL['Message from a customer'] = 'Mitteilung vom Kunden'; +$_LANGMAIL['New message regarding your order'] = 'Neue Nachricht zu Ihrer Bestellung'; +$_LANGMAIL['Your order return state has changed'] = 'Ihr Bestellrücksendungsstatus hat sich geändert'; +$_LANGMAIL['Your password'] = 'Ihr Passwort'; +$_LANGMAIL['Password query confirmation'] = 'Passwortbestätigung'; +$_LANGMAIL['An answer to your message is available'] = 'Es steht eine Antwort auf Ihre Nachricht zur Verfügung'; +$_LANGMAIL['New voucher regarding your order'] = 'Neuer Gutschein zu Ihrer Bestellung'; +$_LANGMAIL['Happy birthday!'] = 'Alles Gute zum Geburtstag!'; +$_LANGMAIL['Newsletter confirmation'] = 'Newsletter-Bestätigung'; +$_LANGMAIL['Newsletter voucher'] = 'Newsletter-Gutschein'; +$_LANGMAIL['Your wishlist\\\'s link'] = 'Ihr Wunschlisten-Link'; +$_LANGMAIL['Message from '] = 'Nachricht von'; +$_LANGMAIL[' $subject'] = '$subject'; +$_LANGMAIL['Your cart and your discount'] = 'Ihr Warenkorb und Ihr Rabatt'; +$_LANGMAIL['Thanks for your order'] = 'Vielen Dank für Ihre Bestellung'; +$_LANGMAIL['You are one of our best customers'] = 'Für einen unserer besten Kunden'; +$_LANGMAIL['We miss you'] = 'Wir vermissen Sie'; +$_LANGMAIL['Product available'] = 'Produkt erhältlich'; +$_LANGMAIL['Product out of stock'] = 'Produkt nicht auf Lager'; +$_LANGMAIL['Error reporting from your PayPal module'] = 'Fehlerbericht aus Ihrem PayPal Modul'; +$_LANGMAIL['Congratulations!'] = 'Gratulation'; +$_LANGMAIL['Referral Program'] = 'Partnerprogramm'; +$_LANGMAIL['A friend sent you a link to'] = 'Ein Freund hat Ihnen einen Link gesandt zu'; + +?> \ No newline at end of file diff --git a/mails/de/log_alert.html b/mails/de/log_alert.html new file mode 100755 index 000000000..67449271e --- /dev/null +++ b/mails/de/log_alert.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Neue Log-Warnung</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Leider wurde eine neue Log-Warnung gespeichert.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen sie einsehen in Ihrem Back Office &gt; Tools &gt; Anmeldung auf Ihrer Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/log_alert.txt b/mails/de/log_alert.txt new file mode 100755 index 000000000..fdba87e8d --- /dev/null +++ b/mails/de/log_alert.txt @@ -0,0 +1,10 @@ +Hallo, + +Neue Log-Warnung + +Leider wurde eine neue Log-Warnung gespeichert. + +Sie können sie einsehen in Ihrem Back Office > Tools > Anmeldung auf Ihrer Website. +{shop_name} - {shop_url} + +{shop_url} powered by PrestaShop™ diff --git a/mails/de/newsletter.html b/mails/de/newsletter.html new file mode 100644 index 000000000..03aabd6a5 --- /dev/null +++ b/mails/de/newsletter.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nachricht von {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">{message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/newsletter.txt b/mails/de/newsletter.txt new file mode 100644 index 000000000..3cbebf2f5 --- /dev/null +++ b/mails/de/newsletter.txt @@ -0,0 +1,9 @@ +Nachricht von {shop_name} + +Nachricht + +{message} + + + +{shop_url} powered by PrestaShop™ diff --git a/mails/de/order_canceled.html b/mails/de/order_canceled.html new file mode 100644 index 000000000..a57a756fe --- /dev/null +++ b/mails/de/order_canceled.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihre Bestellung wurde abgebrochen.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/order_canceled.txt b/mails/de/order_canceled.txt new file mode 100644 index 000000000..75bc2eefc --- /dev/null +++ b/mails/de/order_canceled.txt @@ -0,0 +1,10 @@ +Hallo {firstname} {lastname}, + +Ihre Bestellung Nr.{id_order} + +Ihre Bestellung wurde abgebrochen. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/order_conf.html b/mails/de/order_conf.html new file mode 100644 index 000000000..1aacf8493 --- /dev/null +++ b/mails/de/order_conf.html @@ -0,0 +1,120 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>Message from {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>, danke f&uuml;r Ihren Einkauf bei <strong>{shop_name}</strong>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Details zu Ihrer Bestellung</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Bestellung: <strong><span style="color: #db3484;">{order_name}</span> vom {date}</strong> <br /> Zahlung: <strong>{payment}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">{products} {discounts} +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<!-- Title --> +<tbody> +<tr style="background-color: #b9babe; text-align: center;"> +<th style="width: 15%; padding: 0.6em 0;">Artikelnr.</th> <th style="width: 35%; padding: 0.6em 0;">Produkt</th> <th style="width: 15%; padding: 0.6em 0;">St&uuml;ckpreis</th> <th style="width: 15%; padding: 0.6em 0;">Menge</th> <th style="width: 20%; padding: 0.6em 0;">Gesamtpreis</th> +</tr> +<!-- Products --><!-- Footer: prices --> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;" colspan="3">Produkte</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;">{total_products}</td> +</tr> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="3">Rabatte</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_discounts}</td> +</tr> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="3">Geschenkverpackung</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_wrapping}</td> +</tr> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;" colspan="3">Versand</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;">{total_shipping}</td> +</tr> +<tr style="text-align: right; font-weight: bold;"> +<td>&nbsp;</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;" colspan="3">Gesamt</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;">{total_paid}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Versand</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Spediteur: <strong>{carrier}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td> +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-transform: uppercase;"> +<th style="text-align: left; padding: 0.3em 1em;">Lieferanschrift</th> <th style="text-align: left; padding: 0.3em 1em;">Rechnungsanschrift</th> +</tr> +<tr> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{delivery_company} <br /><span style="color: #db3484; font-weight: bold;">{delivery_firstname} {delivery_lastname}</span> <br />{delivery_address1} <br />{delivery_address2} <br />{delivery_city} {delivery_postal_code} <br />{delivery_country} {delivery_state} <br />{delivery_phone} <br />{delivery_other}</td> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{invoice_company} <br /><span style="color: #db3484; font-weight: bold;">{invoice_firstname} {invoice_lastname}</span> <br />{invoice_address1} <br />{invoice_address2} <br />{invoice_city} {invoice_postal_code} <br />{invoice_country} {invoice_state} <br />{invoice_phone} <br />{invoice_other}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/order_conf.txt b/mails/de/order_conf.txt new file mode 100644 index 000000000..b7ec88e1a --- /dev/null +++ b/mails/de/order_conf.txt @@ -0,0 +1,43 @@ +Hallo {firstname} {lastname}, vielen Dank für Ihre Bestellung auf {shop_name}! + +Details zur Bestellung + + Bestellung: {order_name} vorgenommen am {date} + Zahlung: {payment} + + Produkte: {total_products} + Rabatte: {total_discounts} + Versand: {total_shipping} + Geschenkverpackung: {total_wrapping} + Insgesamt bezahlt: {total_paid} + + +Versand + + Spediteur: {carrier} + + Lieferanschrift: + + {delivery_company} + {delivery_firstname} {delivery_lastname} + {delivery_address1} + {delivery_address2} + {delivery_postal_code} {delivery_city} + {delivery_country} {delivery_state} + {delivery_other} + + Rechnungsanschrift: + + {invoice_company} + {invoice_vat_number} + {invoice_firstname} {invoice_lastname} + {invoice_address1} + {invoice_address2} + {invoice_postal_code} {invoice_city} + {invoice_country} {invoice_state} + {invoice_other} + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung auf dieser Webseite verfolgen: {shop_url}gast-bestellverfolgung.php + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/order_customer_comment.html b/mails/de/order_customer_comment.html new file mode 100644 index 000000000..faf1e5255 --- /dev/null +++ b/mails/de/order_customer_comment.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von einem Kunden von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nachricht von {firstname} {lastname} ({email})</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Sie haben eine neue Nachricht zur Bestellung Nr. {id_order} erhalten:</strong> <br /><br />{message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/order_customer_comment.txt b/mails/de/order_customer_comment.txt new file mode 100644 index 000000000..a3f54c981 --- /dev/null +++ b/mails/de/order_customer_comment.txt @@ -0,0 +1,8 @@ +Hallo {firstname} {lastname}, + +Sie haben eine neue Nachricht zur Bestellung Nr. {id_order} erhalten: + +{message} + + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/order_merchant_comment.html b/mails/de/order_merchant_comment.html new file mode 100644 index 000000000..4d6e932f5 --- /dev/null +++ b/mails/de/order_merchant_comment.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nachricht von {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Sie haben eine neue Nachricht zur Bestellung Nr. {id_order} erhalten:</strong> <br /><br />{message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/order_merchant_comment.txt b/mails/de/order_merchant_comment.txt new file mode 100644 index 000000000..9063bdc6a --- /dev/null +++ b/mails/de/order_merchant_comment.txt @@ -0,0 +1,10 @@ +Nachricht von {shop_name} + +Hallo {firstname} {lastname}, + +Sie haben eine neue Nachricht zur Bestellung Nr. {id_order} erhalten: +{message} + + + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/order_return_state.html b/mails/de/order_return_state.html new file mode 100644 index 000000000..f4b9a361e --- /dev/null +++ b/mails/de/order_return_state.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Der Verlauf Ihrer Bestellr&uuml;cksendung Nr. {id_order_return}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihre Bestellr&uuml;cksendung wurde&nbsp;in "{state_order_return}" ge&auml;ndert.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellr&uuml;cksendung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos ansehen, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/order_return_state.txt b/mails/de/order_return_state.txt new file mode 100644 index 000000000..8b11d9b31 --- /dev/null +++ b/mails/de/order_return_state.txt @@ -0,0 +1,9 @@ +Hallo {firstname} {lastname}, + +Der Verlauf Ihrer Bestellrücksendung Nr. {id_order_return} + +Ihre Bestellrücksendung wurde in "{state_order_return}" geändert. + +Sie können diese Bestellrücksendung im Abschnitt "Bestellverlauf" Ihres Kontos ansehen, indem Sie auf unserer Webseite auf "Mein Konto" klicken. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/outofstock.html b/mails/de/outofstock.html new file mode 100644 index 000000000..8697107ec --- /dev/null +++ b/mails/de/outofstock.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Der Verlauf Ihrer Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Leider sind ein oder mehrere Artikel aus Ihrer Bestellung Nr. {id_order} derzeit nicht auf Lager. Dies kann zu einer leichten Verz&ouml;gerung bei Auslieferung f&uuml;hren. Wir entschuldigen uns und versichern Ihnen, dass wir alles daf&uuml;r tun werden, um dies zu &auml;ndern.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/outofstock.txt b/mails/de/outofstock.txt new file mode 100644 index 000000000..d678b7f65 --- /dev/null +++ b/mails/de/outofstock.txt @@ -0,0 +1,10 @@ +Hallo {firstname} {lastname}, + +Der Verlauf Ihrer Bestellung Nr.{id_order} + +Leider sind ein oder mehrere Artikel aus Ihrer Bestellung Nr. {id_order} derzeit nicht auf Lager. Dies kann zu einer leichten Verzögerung bei Auslieferung führen. Wir entschuldigen uns und versichern Ihnen, dass wir alles dafür tun werden, um dies zu ändern. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/password.html b/mails/de/password.html new file mode 100644 index 000000000..9b110977a --- /dev/null +++ b/mails/de/password.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre neuen Login-Details</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong><strong>E-Mail-Adresse:</strong> {email}<br /><strong>Kennword:</strong> {passwd} </strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Bitte seien Sie vorsichtig bei der gemeinsamen Nutzung dieser Login-Daten mit anderen. <br /><br />Sie k&ouml;nnen nun Bestellungen auf unserer Webseite vornehmen: {shop_url}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/password.txt b/mails/de/password.txt new file mode 100644 index 000000000..2d9c61e46 --- /dev/null +++ b/mails/de/password.txt @@ -0,0 +1,12 @@ +Hallo {firstname} {lastname}, + +Ihre neuen Login-Details + +E-Mail-Adresse: {email} +Kennword: {passwd} + +Bitte seien Sie vorsichtig bei der gemeinsamen Nutzung dieser Login-Daten mit anderen. + +Sie können nun Bestellungen auf unserer Webseite vornehmen: {shop_url} + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/password_query.html b/mails/de/password_query.html new file mode 100644 index 000000000..c16a905a7 --- /dev/null +++ b/mails/de/password_query.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie haben um Ihre Zugangscodes f&uuml;r {shop_name} gebeten. <br />Beachten Sie, dass dieser Vorgang Ihr aktuelles Kennwort &auml;ndert.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Wenn Sie dies wirklich wollen, klicken Sie auf den folgenden Link:<br /><a href="{url}">{url}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/password_query.txt b/mails/de/password_query.txt new file mode 100644 index 000000000..4b1c7fab4 --- /dev/null +++ b/mails/de/password_query.txt @@ -0,0 +1,9 @@ +Hallo {firstname} {lastname}, + +Sie haben um Ihre Zugangscodes für {shop_name} gebeten. +Beachten Sie, dass dieser Vorgang Ihr aktuelles Kennwort ändert. + +Wenn Sie dies wirklich wollen, klicken Sie auf den folgenden Link: +{url} + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/payment.html b/mails/de/payment.html new file mode 100644 index 000000000..d839bd7df --- /dev/null +++ b/mails/de/payment.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihre Bestellung Nr.{id_order} Verlauf</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Wir haben Ihre Zahlung dankend erhalten.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/payment.txt b/mails/de/payment.txt new file mode 100644 index 000000000..d45fd3eba --- /dev/null +++ b/mails/de/payment.txt @@ -0,0 +1,9 @@ +Hallo {firstname} {lastname}, + +Ihre Bestellung Nr.{id_order} Verlauf + +Wir haben Ihre Zahlung dankend erhalten. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/payment_error.html b/mails/de/payment_error.html new file mode 100644 index 000000000..44b06bca5 --- /dev/null +++ b/mails/de/payment_error.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Der Verlauf Ihrer Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Es ist ein Problem bei Ihrer Zahlung der Bestellung Nr. {id_order} aufgetreten. Bitte kontaktieren Sie uns so bald wie m&ouml;glich.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihre Bestellung wird nicht versandt, bis wir dieses Problem gel&ouml;st haben.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a>Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/payment_error.txt b/mails/de/payment_error.txt new file mode 100644 index 000000000..c711be4d2 --- /dev/null +++ b/mails/de/payment_error.txt @@ -0,0 +1,12 @@ +Hallo {firstname} {lastname}, + +Der Verlauf Ihrer Bestellung Nr.{id_order} + +Es ist ein Problem bei Ihrer Zahlung der Bestellung Nr. {id_order} aufgetreten. Bitte kontaktieren Sie uns so bald wie möglich. + +Ihre Bestellung wird nicht versandt, bis wir dieses Problem gelöst haben. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf"Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/preparation.html b/mails/de/preparation.html new file mode 100644 index 000000000..4e71ee3fb --- /dev/null +++ b/mails/de/preparation.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Der Verlauf Ihrer Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihre Bestellung befindet sich aktuell in der Bearbeitung.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/preparation.txt b/mails/de/preparation.txt new file mode 100644 index 000000000..2ddba792d --- /dev/null +++ b/mails/de/preparation.txt @@ -0,0 +1,11 @@ +Hallo {firstname} {lastname}, + +Der Verlauf Ihrer Bestellung Nr.{id_order} + +Ihre Bestellung befindet sich aktuell in der Bearbeitung. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ + diff --git a/mails/de/refund.html b/mails/de/refund.html new file mode 100644 index 000000000..3c64537c3 --- /dev/null +++ b/mails/de/refund.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Der Verlauf Ihrer Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihr Bestellbetrag wurde r&uuml;ckerstattet.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/refund.txt b/mails/de/refund.txt new file mode 100644 index 000000000..3057bd4d9 --- /dev/null +++ b/mails/de/refund.txt @@ -0,0 +1,10 @@ +Hallo {firstname} {lastname}, + +Der Verlauf Ihrer Bestellung Nr.{id_order} + +Ihr Bestellbetrag wurde rückerstattet. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/reply_msg.html b/mails/de/reply_msg.html new file mode 100644 index 000000000..ed53d95ae --- /dev/null +++ b/mails/de/reply_msg.html @@ -0,0 +1,16 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td style="border: 1px solid #CCCCCC; background-color: #ffffff; padding: 10px; color: #383838; font-size: 12px;">{reply}<br /><br /><span style="color: red; font-weight: bold;">Bitte antworten Sie nicht auf diese Nachricht mit Ihrem E-Mail-Client</span>, wir w&uuml;rden diese Nachricht nicht erhalten.<br />Um zu antworten, verwenden Sie bitte ausschlie&szlig;lich folgenden Link: <a href="{link}">{link}</a>.</td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/reply_msg.txt b/mails/de/reply_msg.txt new file mode 100644 index 000000000..7419bc2b1 --- /dev/null +++ b/mails/de/reply_msg.txt @@ -0,0 +1,4 @@ +{reply} + +Bitte antworten Sie nicht auf diese Nachricht mit Ihrem E-Mail-Client, wir würden diese Nachricht nicht erhalten. +Um zu antworten, verwenden Sie bitte ausschließlich folgenden Link: {link}. diff --git a/mails/de/shipped.html b/mails/de/shipped.html new file mode 100644 index 000000000..f9aade7ed --- /dev/null +++ b/mails/de/shipped.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Der Verlauf Ihrer Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Ihre Bestellung wurde versendet.</strong><br />Sie erhalten in K&uuml;rze eine URL, auf die Sie klicken k&ouml;nnen, um den Lieferfortschritt Ihrer Sendung zu verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie k&ouml;nnen diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Bestellverlauf"</a> Ihres Kontos downloaden, indem Sie auf unserer Webseite auf <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mein Konto"</a> klicken.</td> +</tr> +<tr> +<td align="left">Wenn Sie ein Gast-Konto haben, k&ouml;nnen Sie Ihre Bestellung im Abschnitt <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Bestellverfolgung Gast"</a> auf unserer Webseite verfolgen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/shipped.txt b/mails/de/shipped.txt new file mode 100644 index 000000000..e23e64f7a --- /dev/null +++ b/mails/de/shipped.txt @@ -0,0 +1,11 @@ +Hallo {firstname} {lastname}, + +Der Verlauf Ihrer Bestellung Nr.{id_order} + +Ihre Bestellung wurde versendet. +Sie erhalten in Kürze eine URL, auf die Sie klicken können, um den Lieferfortschritt Ihrer Sendung zu verfolgen. + +Sie können diese Bestellung ansehen und Ihre Rechnung aus dem Abschnitt "Bestellverlauf" Ihres Kontos downloaden, indem Sie auf unserer Webseite auf "Mein Konto" klicken. +Wenn Sie ein Gast-Konto haben, können Sie Ihre Bestellung im Abschnitt "Bestellverfolgung Gast" auf unserer Webseite verfolgen. + +{shop_name} powered with PrestaShop™ diff --git a/mails/de/test.html b/mails/de/test.html new file mode 100644 index 000000000..313bd7b5c --- /dev/null +++ b/mails/de/test.html @@ -0,0 +1,22 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Testmail</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td>Hallo,<br /><br />dies ist eine <strong>Testmail</strong> von Ihrem Shop.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D"></a>powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/test.txt b/mails/de/test.txt new file mode 100644 index 000000000..c87360948 --- /dev/null +++ b/mails/de/test.txt @@ -0,0 +1,5 @@ +Hallo, + +dies ist eine Testmail von Ihrem Shop. + +powered with PrestaShop™ diff --git a/mails/de/voucher.html b/mails/de/voucher.html new file mode 100644 index 000000000..89cd22671 --- /dev/null +++ b/mails/de/voucher.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Verlauf Ihrer Bestellung Nr.{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Damit werden Sie &uuml;ber die Erstellung eines Gutscheins auf Ihrem Namen nach Ihrer Bestellung Nr. informiert.{id_order}.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hier ist der Code Ihres Gutscheins: <strong>{voucher_num}</strong>, &uuml;ber einen Betrag von <strong>{voucher_amount}</strong>.<br />F&uuml;r Ihre n&auml;chste Bestellung m&uuml;ssen Sie diesen Code einfach nur w&auml;hrend des Bezahlvorgangs kopieren.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/de/voucher.txt b/mails/de/voucher.txt new file mode 100644 index 000000000..bf8d40047 --- /dev/null +++ b/mails/de/voucher.txt @@ -0,0 +1,11 @@ +Hallo {firstname} {lastname}, + +Verlauf Ihrer Bestellung Nr.{id_order} + +Damit werden Sie über die Erstellung eines Gutscheins auf Ihrem Namen nach Ihrer Bestellung Nr. informiert.{id_order}. + +Hier ist der Code Ihres Gutscheins: {voucher_num}, über einen Betrag von {voucher_amount}. +Für Ihre nächste Bestellung müssen Sie diesen Code einfach nur während des Bezahlvorgangs kopieren. + +{shop_name} powered with PrestaShop™ + diff --git a/mails/en/account.html b/mails/en/account.html new file mode 100644 index 000000000..f907c392c --- /dev/null +++ b/mails/en/account.html @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your account login details</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + E-mail address: <strong><span style="color:#DB3484;">{email}</span></strong> + <br >Password: <strong>{passwd}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <strong>Safety tips:</strong> + <br><br>Keep your account details safe. + <br>Do not disclose your login details to anyone. + <br>Change your password regularly. + <br>Should you suspect someone is using your account illegally, please notify us immediately. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can now place orders on our Website: <a href="{shop_url}">{shop_name}</a>. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/account.txt b/mails/en/account.txt new file mode 100644 index 000000000..7707dc78e --- /dev/null +++ b/mails/en/account.txt @@ -0,0 +1,20 @@ +Hi {firstname} {lastname}, + +Thank you for creating your account at {shop_name}. + +Your account login details : + +E-mail address: {email} +Password: {passwd} + +You can now place orders on our Website: {shop_url} + +Safety Tips: + +* Keep your account details safe. +* Do not disclose your login details to anyone. +* Change your password regularly. +* Should you suspect someone is using your account illegally, please notify us immediately. + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/bankwire.html b/mails/en/bankwire.html new file mode 100644 index 000000000..f4b997d25 --- /dev/null +++ b/mails/en/bankwire.html @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Your order has been placed successfully, and will be shipped as soon as payment is received. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Please note that you have selected to pay by bank wire. Please send your wire to : + <br /><br /> + <strong>{bankwire_owner}</strong> + <br /><br /> + {bankwire_details} + <br /><br /> + {bankwire_address} + <br /><br /> + Order total amount is {total_paid} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/bankwire.txt b/mails/en/bankwire.txt new file mode 100644 index 000000000..b4695a61d --- /dev/null +++ b/mails/en/bankwire.txt @@ -0,0 +1,23 @@ +Hi {firstname} {lastname}, + +Your order #{id_order} has been placed successfully. Your order will be shipped as soon as payment is received. + +Please note that you have selected to pay by bank wire. Please send your wire to: + +{bankwire_owner} + +{bankwire_details} + +{bankwire_address} + +Order total amount is {total_paid} + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Thank you for shopping at {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/cheque.html b/mails/en/cheque.html new file mode 100644 index 000000000..fddcfebe7 --- /dev/null +++ b/mails/en/cheque.html @@ -0,0 +1,59 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order {order_name} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Your order has been placed successfully, and will be shipped as soon as payment is received. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Please note that you have selected to pay by cheque. Please send your cheque: + <br /><br /> + - an amount of <b>{total_paid}</b> + <br /><br /> + - payable to the order of <b>{cheque_name}</b> + <br /><br /> + - mail to <b>{cheque_address_html}</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/cheque.txt b/mails/en/cheque.txt new file mode 100644 index 000000000..88f4d58b6 --- /dev/null +++ b/mails/en/cheque.txt @@ -0,0 +1,21 @@ +Hi {firstname} {lastname}, + +Your order {order_name} has been placed successfully. Your order will be shipped as soon as payment is received. + +Please note that you have selected to pay by cheque. Please include on your cheque: + +- an amount of {total_paid} + +- payable to the order of {cheque_name} + +- mail to {cheque_address} + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Thank you for shopping at {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/contact.html b/mails/en/contact.html new file mode 100644 index 000000000..ff2e16bcd --- /dev/null +++ b/mails/en/contact.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message from your shop {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + E-mail address: <a href="mailto:{email}"><b>{email}</b></a> + <br><br> + Message: {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/contact.txt b/mails/en/contact.txt new file mode 100644 index 000000000..9f1a1756f --- /dev/null +++ b/mails/en/contact.txt @@ -0,0 +1,11 @@ +You have received a message from a customer via your shop: {shop_name} + +Details of message: + +E-mail address: {email} + +Message: + +{message} + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/contact_form.html b/mails/en/contact_form.html new file mode 100644 index 000000000..46fca08b6 --- /dev/null +++ b/mails/en/contact_form.html @@ -0,0 +1,36 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your message has been correctly sent to our Customer Service.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Your message: {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">We will answer as soon as possible.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/contact_form.txt b/mails/en/contact_form.txt new file mode 100644 index 000000000..d7b599591 --- /dev/null +++ b/mails/en/contact_form.txt @@ -0,0 +1,12 @@ +Your message has been correctly sent to our Customer Service. + +Your message: + +{message} + + +We will answer as soon as possible. + +Regards, + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/credit_slip.html b/mails/en/credit_slip.html new file mode 100644 index 000000000..6588a7ef6 --- /dev/null +++ b/mails/en/credit_slip.html @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + This is to inform you about the creation of a credit slip in your name based on your order #{id_order}. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this credit slip and download your invoice from the <a href="{shop_url}order-follow.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order follow"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> \ No newline at end of file diff --git a/mails/en/credit_slip.txt b/mails/en/credit_slip.txt new file mode 100644 index 000000000..9bade0337 --- /dev/null +++ b/mails/en/credit_slip.txt @@ -0,0 +1,12 @@ +Hi {firstname} {lastname}, + +This is to inform you about the generation of a credit slip in your name from your order #{id_order}. + +You can review this credit slip and download the invoice from the "Order follow" section of your account by clicking "My account" on our Website. + +Thank you for shopping at {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/download-product.tpl b/mails/en/download-product.tpl new file mode 100644 index 000000000..a73e26644 --- /dev/null +++ b/mails/en/download-product.tpl @@ -0,0 +1,13 @@ +<ul> +{foreach from=$virtualProducts item=product} + <li> + <a href="{$product.link}">{$product.name}</a> + {if isset($product.deadline)} + expires on {$product.deadline} + {/if} + {if isset($product.downloadable)} + downloadable {$product.downloadable} times + {/if} + </li> +{/foreach} +</ul> \ No newline at end of file diff --git a/mails/en/download_product.html b/mails/en/download_product.html new file mode 100644 index 000000000..9420f0d2a --- /dev/null +++ b/mails/en/download_product.html @@ -0,0 +1,54 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hello <strong style="color:#DB3484;">{firstname} {lastname}</strong>, thank you for shopping with <strong>{shop_name}</strong>.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Product(s) to download</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You have {nbProducts} product(s) to download. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Below are direct links to these products: + {virtualProducts} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have a guest account, you can follow your order at <a href="{shop_url}guest-tracking.php?id_order={id_order}" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/download_product.txt b/mails/en/download_product.txt new file mode 100644 index 000000000..333eb4adf --- /dev/null +++ b/mails/en/download_product.txt @@ -0,0 +1,11 @@ +{firstname} {lastname}, thank you for your order on {shop_name}! + +You have {nbProducts} product(s) to download. + +Below are direct links to these products: +{virtualProducts} + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have a guest account, you can follow your order at this page: {shop_url}guest-tracking.php?id_order={id_order} + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/employee_password.html b/mails/en/employee_password.html new file mode 100644 index 000000000..1e172d455 --- /dev/null +++ b/mails/en/employee_password.html @@ -0,0 +1,39 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your personal login information</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>First name</b>: {firstname}<br> + <b>Last name</b>: {lastname}<br> + <b>Password</b>: {passwd}<br> + <b>E-mail address</b>: {email} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/employee_password.txt b/mails/en/employee_password.txt new file mode 100644 index 000000000..428cb0ae7 --- /dev/null +++ b/mails/en/employee_password.txt @@ -0,0 +1,14 @@ +Hi {firstname} {lastname}, + +Your personal login information for your shop {shop_name}: + +* First name: {firstname} +* Last name: {lastname} +* Password: {passwd} +* E-mail address: {email} + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/forward_msg.html b/mails/en/forward_msg.html new file mode 100644 index 000000000..954fda1d9 --- /dev/null +++ b/mails/en/forward_msg.html @@ -0,0 +1,20 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td style="border:1px solid #CCCCCC;background-color:#FFFFFF;padding:10px;color:#383838;font-size:12px"> + {employee} wanted to forward this chat to you. + <br /><br /> + {messages} + <br /><br /> + {employee} added "{comment}". + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/forward_msg.txt b/mails/en/forward_msg.txt new file mode 100644 index 000000000..cd93f3270 --- /dev/null +++ b/mails/en/forward_msg.txt @@ -0,0 +1,4 @@ +{employee} wanted to forward this chat to you. +Comment: {comment} + +{messages} diff --git a/mails/en/guest_to_customer.html b/mails/en/guest_to_customer.html new file mode 100644 index 000000000..0f4c496ab --- /dev/null +++ b/mails/en/guest_to_customer.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your guest account has been transformed into a customer account</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>E-mail address:</b> {email}<br> + <b>Password:</b> {passwd} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Please be careful when sharing these login details with others. + <br><br> + You can access your account on our website: {shop_url} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> + diff --git a/mails/en/guest_to_customer.txt b/mails/en/guest_to_customer.txt new file mode 100644 index 000000000..49f011c69 --- /dev/null +++ b/mails/en/guest_to_customer.txt @@ -0,0 +1,16 @@ + Hi {firstname} {lastname}, + + Your guest account has been transformed into a customer account: + + E-mail address: {email} + Password: {passwd} + + + You can access your account on our website: {shop_url} + + Please be careful when sharing these login details with others. + + + + {shop_url} powered by PrestaShop™ + diff --git a/mails/en/in_transit.html b/mails/en/in_transit.html new file mode 100755 index 000000000..a4407d81c --- /dev/null +++ b/mails/en/in_transit.html @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Your order is currently in transit.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can track your package by clicking on the following link: <a href="{followup}">{followup}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have a guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/in_transit.txt b/mails/en/in_transit.txt new file mode 100755 index 000000000..44b4fd17f --- /dev/null +++ b/mails/en/in_transit.txt @@ -0,0 +1,16 @@ +Hi {firstname} {lastname}, + +Your order is currently in transit. + +You can track your package by clicking on the following link: {followup} + +You can also review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have a guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Thank you for shopping with {shop_name}! + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/index.php b/mails/en/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/mails/en/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/mails/en/lang.php b/mails/en/lang.php new file mode 100644 index 000000000..ffc58aca9 --- /dev/null +++ b/mails/en/lang.php @@ -0,0 +1,31 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +global $_LANGMAIL; +$_LANGMAIL = array(); + +?> \ No newline at end of file diff --git a/mails/en/log_alert.html b/mails/en/log_alert.html new file mode 100755 index 000000000..f0528e277 --- /dev/null +++ b/mails/en/log_alert.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">New log alert</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Unfortunately, new log alert message has been saved.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can check this on your Back office &gt; Tools &gt; Log on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/log_alert.txt b/mails/en/log_alert.txt new file mode 100755 index 000000000..ac109b176 --- /dev/null +++ b/mails/en/log_alert.txt @@ -0,0 +1,11 @@ +Hi, + +New log alert + +Unfortunately, new log alert message has been saved. + +You can check this on your Back office > Tools > Log on our Website. + +{shop_name} - {shop_url} + +{shop_url} powered by PrestaShop™ diff --git a/mails/en/newsletter.html b/mails/en/newsletter.html new file mode 100644 index 000000000..37b7c7c93 --- /dev/null +++ b/mails/en/newsletter.html @@ -0,0 +1,30 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Newsletter from {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">{message}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/newsletter.txt b/mails/en/newsletter.txt new file mode 100644 index 000000000..3092a1f34 --- /dev/null +++ b/mails/en/newsletter.txt @@ -0,0 +1,9 @@ +Newsletter from {shop_name} + +Message + +{message} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/order_canceled.html b/mails/en/order_canceled.html new file mode 100644 index 000000000..86f93f31b --- /dev/null +++ b/mails/en/order_canceled.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Concerning your order #{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Your order has been cancelled.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/order_canceled.txt b/mails/en/order_canceled.txt new file mode 100644 index 000000000..fb0c99394 --- /dev/null +++ b/mails/en/order_canceled.txt @@ -0,0 +1,14 @@ +Hi {firstname} {lastname}, + +Concerning your order #{id_order}: + +Your order has been cancelled. + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/order_conf.html b/mails/en/order_conf.html new file mode 100644 index 000000000..ac8b61b9e --- /dev/null +++ b/mails/en/order_conf.html @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hello <strong style="color:#DB3484;">{firstname} {lastname}</strong>, thank you for shopping with <strong>{shop_name}</strong>.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Order details</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Order: <strong><span style="color:#DB3484;">{order_name}</span> placed on {date}</strong> + <br >Payment: <strong>{payment}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <!-- Title --> + <tr style="background-color:#B9BABE; text-align:center;"> + <th style="width:15%; padding: 0.6em 0;">Reference</th> + <th style="width:35%; padding: 0.6em 0;">Product</th> + <th style="width:15%; padding: 0.6em 0;">Unit price</th> + <th style="width:15%; padding: 0.6em 0;">Quantity</th> + <th style="width:20%; padding: 0.6em 0;">Total price</th> + </tr> + <!-- Products --> + {products} + {discounts} + <!-- Footer: prices --> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#B9BABE; padding:0.6em 0.4em;">Products</td> + <td style="background-color:#B9BABE; padding:0.6em 0.4em;">{total_products}</td> + </tr> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#EBECEE; padding:0.6em 0.4em;">Discounts</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_discounts}</td> + </tr> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#EBECEE; padding:0.6em 0.4em;">Gift-wrapping</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_wrapping}</td> + </tr> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#DDE2E6; padding:0.6em 0.4em;">Shipping</td> + <td style="background-color:#DDE2E6; padding:0.6em 0.4em;">{total_shipping}</td> + </tr> + <tr style="text-align:right; font-weight:bold;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#F1AECF; padding:0.6em 0.4em;">Total paid</td> + <td style="background-color:#F1AECF; padding:0.6em 0.4em;">{total_paid}</td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Shipping</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Carrier: <strong>{carrier}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <tr style="background-color:#B9BABE; text-transform:uppercase;"> + <th style="text-align:left; padding: 0.3em 1em;">Delivery address</th> + <th style="text-align:left; padding: 0.3em 1em;">Billing address</th> + </tr> + <tr> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {delivery_block_html} + </td> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {invoice_block_html} + </td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have a guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/order_conf.txt b/mails/en/order_conf.txt new file mode 100644 index 000000000..08e497ce8 --- /dev/null +++ b/mails/en/order_conf.txt @@ -0,0 +1,30 @@ +Hello {firstname} {lastname}, thank you for your order on {shop_name}! + +Order details + + Order: {order_name} placed on {date} + Payment: {payment} + + Products: {total_products} + Discounts: {total_discounts} + Shipping: {total_shipping} + Gift-wrapping: {total_wrapping} + Total paid: {total_paid} + + +Shipping + + Carrier: {carrier} + + Delivery address: + + {delivery_block_txt} + + Billing address: + + {invoice_block_txt} + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have a guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_url} powered by PrestaShop™ diff --git a/mails/en/order_customer_comment.html b/mails/en/order_customer_comment.html new file mode 100644 index 000000000..85713080e --- /dev/null +++ b/mails/en/order_customer_comment.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from a client from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message from {firstname} {lastname} ({email})</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>You have received a new message regarding order #{id_order}:</b> + <br /><br /> + {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/order_customer_comment.txt b/mails/en/order_customer_comment.txt new file mode 100644 index 000000000..5a29e3893 --- /dev/null +++ b/mails/en/order_customer_comment.txt @@ -0,0 +1,8 @@ +Hi {firstname} {lastname}, + +You have received a new message regarding order #{id_order}: + +{message} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/order_merchant_comment.html b/mails/en/order_merchant_comment.html new file mode 100644 index 000000000..4deac2732 --- /dev/null +++ b/mails/en/order_merchant_comment.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message from {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>You have received a new message regarding order #{id_order}:</b> + <br><br> + {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/order_merchant_comment.txt b/mails/en/order_merchant_comment.txt new file mode 100644 index 000000000..a3825c7ee --- /dev/null +++ b/mails/en/order_merchant_comment.txt @@ -0,0 +1,10 @@ +Message from {shop_name} + +Hi {firstname} {lastname}, + +You have received a new message regarding order #{id_order}: +{message} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/order_return_state.html b/mails/en/order_return_state.html new file mode 100644 index 000000000..fe2c178c2 --- /dev/null +++ b/mails/en/order_return_state.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order return #{id_order_return} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Your return order has changed in "{state_order_return}".</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order return from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/order_return_state.txt b/mails/en/order_return_state.txt new file mode 100644 index 000000000..c32d7d9ed --- /dev/null +++ b/mails/en/order_return_state.txt @@ -0,0 +1,11 @@ +Hi {firstname} {lastname}, + +Your return order #{id_order_return} history has changed in "{state_order_return}". + +You can review this order return in the "Order history" section of your account by clicking "My account" on our Website. + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/outofstock.html b/mails/en/outofstock.html new file mode 100644 index 000000000..495a35604 --- /dev/null +++ b/mails/en/outofstock.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Unfortunately, one or more items on your order #{id_order} are currently out of stock. This may cause a slight delay in delivery. Please accept our apologies and rest assured that we are working hard to rectify this.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/outofstock.txt b/mails/en/outofstock.txt new file mode 100644 index 000000000..4fd2f6cc4 --- /dev/null +++ b/mails/en/outofstock.txt @@ -0,0 +1,14 @@ + Hi {firstname} {lastname}, + + Your order #{id_order} history + +Unfortunately, one or more items on your order #{id_order} is currently out of stock. This may cause a slight delay in delivery. Please accept our apologies and rest assured that we are working hard to rectify this. + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/password.html b/mails/en/password.html new file mode 100644 index 000000000..d4054e04e --- /dev/null +++ b/mails/en/password.html @@ -0,0 +1,45 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your new login details</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>E-mail address:</b> {email}<br> + <b>Password:</b> {passwd} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Please be careful when sharing these login details with others. + <br><br> + You can now order on our Website: {shop_url} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/password.txt b/mails/en/password.txt new file mode 100644 index 000000000..2a83760a4 --- /dev/null +++ b/mails/en/password.txt @@ -0,0 +1,12 @@ +Hello {firstname} {lastname}, + +Your new login details: + +E-mail address: {email} +Password: {passwd} + +You can now place an order on our Website: {shop_url} + +Please be careful when sharing these login details with others. + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/password_query.html b/mails/en/password_query.html new file mode 100644 index 000000000..2eaaf5d1c --- /dev/null +++ b/mails/en/password_query.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hello <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">You asked to get back your {shop_name} access codes,<br /> + Note that this action will change your current password.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + If you really want to do it, click the following link :<br /> + <a href="{url}">{url}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> realised by <a href="http://www.prestashop.com" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/password_query.txt b/mails/en/password_query.txt new file mode 100644 index 000000000..912f5947a --- /dev/null +++ b/mails/en/password_query.txt @@ -0,0 +1,9 @@ +Hello {firstname} {lastname}, + +You asked to get back your {shop_name} access codes. +Note that this action will change your current password. + +If you really want to do it, click the following link : +{url} + +{shop_url} powered by PrestaShop™ diff --git a/mails/en/payment.html b/mails/en/payment.html new file mode 100644 index 000000000..74acb6c3f --- /dev/null +++ b/mails/en/payment.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Payment for your order was successfully processed.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/payment.txt b/mails/en/payment.txt new file mode 100644 index 000000000..35ab2a992 --- /dev/null +++ b/mails/en/payment.txt @@ -0,0 +1,13 @@ + Hi {firstname} {lastname}, + + Your order #{id_order} history + + Payment for your order was successfully processed. + + You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. + + {shop_name} - {shop_url} + + Thank you for shopping with {shop_name}. + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/payment_error.html b/mails/en/payment_error.html new file mode 100644 index 000000000..664b5bd02 --- /dev/null +++ b/mails/en/payment_error.html @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>There is a problem with your payment for order #{id_order}. Please contact us at your earliest convenience.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Your order will not be shipped until we have resolved this problem.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/payment_error.txt b/mails/en/payment_error.txt new file mode 100644 index 000000000..4fc77b968 --- /dev/null +++ b/mails/en/payment_error.txt @@ -0,0 +1,14 @@ +Hi {firstname} {lastname}, + +There is a problem with your payment for order #{id_order}. Please contact us at your earliest convenience. + +Your order will not be shipped until we have resolved this problem. + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/preparation.html b/mails/en/preparation.html new file mode 100644 index 000000000..40ce557c8 --- /dev/null +++ b/mails/en/preparation.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>We are processing your order.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/preparation.txt b/mails/en/preparation.txt new file mode 100644 index 000000000..a1e0d8bfa --- /dev/null +++ b/mails/en/preparation.txt @@ -0,0 +1,14 @@ + Hi {firstname} {lastname}, + + Your order #{id_order} history + + We are processing your order. + + You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. + If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/refund.html b/mails/en/refund.html new file mode 100644 index 000000000..125001b6c --- /dev/null +++ b/mails/en/refund.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Your order payment has been refunded.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/refund.txt b/mails/en/refund.txt new file mode 100644 index 000000000..7a4a12bae --- /dev/null +++ b/mails/en/refund.txt @@ -0,0 +1,12 @@ + Hi {firstname} {lastname}, + + Your order payment has been refunded. + + You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. + If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/reply_msg.html b/mails/en/reply_msg.html new file mode 100644 index 000000000..f3754d7cf --- /dev/null +++ b/mails/en/reply_msg.html @@ -0,0 +1,18 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td style="border:1px solid #CCCCCC;background-color:#FFFFFF;padding:10px;color:#383838;font-size:12px"> + {reply}<br /><br /> + <span style="color:red;font-weight:bold">Please do not reply to this message with your e-mail client</span>, we would not receive your message.<br /> + In order to reply, please use exclusively the following link: <a href="{link}">{link}</a>. + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/reply_msg.txt b/mails/en/reply_msg.txt new file mode 100644 index 000000000..0200bedb9 --- /dev/null +++ b/mails/en/reply_msg.txt @@ -0,0 +1,4 @@ +{reply} + +Please do not reply to this message using your e-mail client, we would not receive your message. +In order to reply, please use exclusively the following link: {link} diff --git a/mails/en/shipped.html b/mails/en/shipped.html new file mode 100644 index 000000000..fb4559b4a --- /dev/null +++ b/mails/en/shipped.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Your order has been shipped.</b><br />You will soon receive a URL to click on in order to track the delivery progress of your package. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You can review this order and download your invoice from the <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Order history"</a> section of your account by clicking <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"My account"</a> on our Website. + </td> + </tr> + <tr> + <td align="left"> + If you have guest account, you can follow your order at <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Guest Tracking"</a> section on our Website. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/shipped.txt b/mails/en/shipped.txt new file mode 100644 index 000000000..e68a90257 --- /dev/null +++ b/mails/en/shipped.txt @@ -0,0 +1,16 @@ +Hi {firstname} {lastname}, + +Your order has just been shipped. + +You will soon receive a URL to click on in order to track the delivery progress of your package. + +You can review this order and download your invoice from the "Order history" section of your account by clicking "My account" on our Website. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Thank you for shopping with {shop_name}! + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/en/test.html b/mails/en/test.html new file mode 100644 index 000000000..2ce6fdb57 --- /dev/null +++ b/mails/en/test.html @@ -0,0 +1,23 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Test mail</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td> + Hello,<br><br> + This is a <b>test mail</b> from your shop. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/en/test.txt b/mails/en/test.txt new file mode 100644 index 000000000..cf71f8359 --- /dev/null +++ b/mails/en/test.txt @@ -0,0 +1,3 @@ + Hello, + + This is a test mail from your PrestaShop™ online shop. \ No newline at end of file diff --git a/mails/en/voucher.html b/mails/en/voucher.html new file mode 100644 index 000000000..c686de699 --- /dev/null +++ b/mails/en/voucher.html @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your order #{id_order} history</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + This is to inform you about the creation of a voucher in your name as a result of your order #{id_order}. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Here is the code of your voucher : <b>{voucher_num}</b>, with an amount of <b>{voucher_amount}</b>.<br /> + Simply copy/paste this code during the payment process for your next order. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/en/voucher.txt b/mails/en/voucher.txt new file mode 100644 index 000000000..c4ca2428d --- /dev/null +++ b/mails/en/voucher.txt @@ -0,0 +1,14 @@ +Hi {firstname} {lastname}, + +This is to inform you about the creation of a voucher in your name as a result of your order #{id_order}. + +Here is the code of your voucher : {voucher_num}, to the amount of {voucher_amount}. + +Simply copy/paste this code during the payment process for your next order. + +Thank you for shopping at {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/es/account.html b/mails/es/account.html new file mode 100644 index 000000000..2a695aa1f --- /dev/null +++ b/mails/es/account.html @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Detalles de tu cuenta</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Email: <strong><span style="color: #db3484;">{email}</span></strong> <br />Contrase&ntilde;a: <strong>{passwd}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Consejos de Seguridad:</strong> <br /><br />Mant&eacute;n los datos de tu cuenta en lugar seguro. <br />No des los detalles de tu cuenta a nadie. <br />Cambia tu contrase&ntilde;a regularmente. <br />Si sospechas que alguien esta usando ilegalmente tu cuenta, av&iacute;sanos inmediatamente.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Ahora podr&aacute;s guardar y consultar tus pedidos en nuestra web: <a href="{shop_url}">{shop_name}</a>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/account.txt b/mails/es/account.txt new file mode 100644 index 000000000..6d8960e43 --- /dev/null +++ b/mails/es/account.txt @@ -0,0 +1,20 @@ +Hola {firstname} {lastname}, + +Gracias por crear tu cuenta en {shop_name}. + +Detalles de tu cuenta: + +Email: {email} +Contraseña: {passwd} + +Ahora podrás guardar y consultar tus pedidos en nuestra web: {shop_url} + +Consejos de Seguridad: + +* Mantén los datos de tu cuenta en lugar seguro. +* No des los detalles de tu cuenta a nadie. +* Cambia tu contraseña regularmente. +* Si sospechas que alguien esta usando ilegalmente tu cuenta, avísanos inmediatamente. + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/bankwire.html b/mails/es/bankwire.html new file mode 100644 index 000000000..a00c151e0 --- /dev/null +++ b/mails/es/bankwire.html @@ -0,0 +1,56 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Tu pedido es el n&uacute;mero #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Tu pedido #{id_order} ha sido recibido correctamente, y ser&aacute; enviado en cuanto recibamos el pago.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Por favor, recuerda que has seleccionado transferencia bancaria. Env&iacute;ela a: <br /><br /><strong>{bankwire_owner}</strong> <br /><br />{bankwire_details} <br /><br />Total Pedido: {total_paid}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/bankwire.txt b/mails/es/bankwire.txt new file mode 100644 index 000000000..e926f16c8 --- /dev/null +++ b/mails/es/bankwire.txt @@ -0,0 +1,20 @@ +Hola {firstname} {lastname}, + +Tu pedido #{id_order} ha sido recibido correctamente, y será enviado en cuanto recibamos el pago. +Por favor, recuerda que has seleccionado transferencia bancaria. Envíala a: + +{bankwire_owner} + +{bankwire_details} + +Total Pedido: {total_paid} + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (sección "Historial de Pedidos"). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Muchas gracias por comprar en {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop® diff --git a/mails/es/cheque.html b/mails/es/cheque.html new file mode 100644 index 000000000..b26e0e0b9 --- /dev/null +++ b/mails/es/cheque.html @@ -0,0 +1,56 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Tu pedido es el n&uacute;mero #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Tu pedido #{id_order} ha sido recibido correctamente, y ser&aacute; enviado en cuanto recibamos el pago.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Por favor, recuerda que ha seleccionado pagar con cheque. Rell&eacute;nalo con: <br /><br />- total <strong>{total_paid}</strong> <br /><br />- por el pedido de <strong>{cheque_name}</strong> <br /><br />- a <strong>{cheque_address_html}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/cheque.txt b/mails/es/cheque.txt new file mode 100644 index 000000000..ac75ddb28 --- /dev/null +++ b/mails/es/cheque.txt @@ -0,0 +1,19 @@ +Hola {firstname} {lastname}, + +Tu pedido #{id_order} ha sido recibido correctamente, y será enviado en cuanto recibamos el pago. +Por favor, recuerda que ha seleccionado pagar con cheque. Rellénalo con: + +- Total {total_paid} + +- por el pedido de {cheque_name} + +- a {cheque_address} + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Muchas gracias por comprar en {shop_name}. + +{shop_name} - {shop_url} + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/contact.html b/mails/es/contact.html new file mode 100644 index 000000000..20c0e4c44 --- /dev/null +++ b/mails/es/contact.html @@ -0,0 +1,35 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Mensaje desde tu tienda {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Email: <a href="mailto:{email}"><strong>{email}</strong></a> <br /><br />Mensaje: {message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/contact.txt b/mails/es/contact.txt new file mode 100644 index 000000000..2630d7d49 --- /dev/null +++ b/mails/es/contact.txt @@ -0,0 +1,11 @@ +Has recibido un mensaje de un cliente desde tu tienda: {shop_name} + +Detalles del mensaje: + +Email: {email} + +Mensaje: + +{message} + +{shop_url} desarrollado por PrestaShop™ \ No newline at end of file diff --git a/mails/es/contact_form.html b/mails/es/contact_form.html new file mode 100644 index 000000000..810badae8 --- /dev/null +++ b/mails/es/contact_form.html @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Your message has been correctly sent to our Customer Service.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Your message: {message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">We will answer as soon as possible.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/contact_form.txt b/mails/es/contact_form.txt new file mode 100644 index 000000000..194d83491 --- /dev/null +++ b/mails/es/contact_form.txt @@ -0,0 +1,12 @@ +Tu mensaje ha sido enviado correctamenta a nuestro Servicio Cliente. + +Tu mensaje: + +{message} + + +Te responderemos cuanto antes. + +Saludos, + +{shop_url} desarrollado por PrestaShop™ \ No newline at end of file diff --git a/mails/es/credit_slip.html b/mails/es/credit_slip.html new file mode 100644 index 000000000..4902c9430 --- /dev/null +++ b/mails/es/credit_slip.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Hist&oacute;rico del Pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Te informamos que se ha generado un vale de compra a tu favor desde el pedido #{id_order}.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar este pedido y descargar la factura desde la secci&oacute;n <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}order-follow.php">"Seguimiento de Pedido"</a> de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mi Cuenta"</a> en nuestra web.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/credit_slip.txt b/mails/es/credit_slip.txt new file mode 100644 index 000000000..7fd83a23e --- /dev/null +++ b/mails/es/credit_slip.txt @@ -0,0 +1,12 @@ +Hola {firstname} {lastname}, + +Te informamos que se ha generado un vale de compra a tu favor desde el pedido #{id_order}. + +Puedes revisar este recibo y descargar la factura desde la sección "Seguimiento de Pedido" de tu cuenta pulsando en "Mi cuenta" en nuestra web. + +Gracias por comprar en {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/mails/es/download-product.tpl b/mails/es/download-product.tpl new file mode 100644 index 000000000..a73e26644 --- /dev/null +++ b/mails/es/download-product.tpl @@ -0,0 +1,13 @@ +<ul> +{foreach from=$virtualProducts item=product} + <li> + <a href="{$product.link}">{$product.name}</a> + {if isset($product.deadline)} + expires on {$product.deadline} + {/if} + {if isset($product.downloadable)} + downloadable {$product.downloadable} times + {/if} + </li> +{/foreach} +</ul> \ No newline at end of file diff --git a/mails/es/download_product.html b/mails/es/download_product.html new file mode 100644 index 000000000..147dddd8e --- /dev/null +++ b/mails/es/download_product.html @@ -0,0 +1,56 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>, gracias por comprar en <strong>{shop_name}</strong>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Producto(s) para descargar</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Tienes {nbProducts} producto(s) para descargar.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Este es el acceso directo: {virtualProducts}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar este pedido y descargar su factura desde la secci&oacute;n <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}order-follow.php">"Seguimiento de Pedido"</a> de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mi Cuenta"</a> en nuestra web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php?id_order={id_order}">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/download_product.txt b/mails/es/download_product.txt new file mode 100644 index 000000000..3c33c4c02 --- /dev/null +++ b/mails/es/download_product.txt @@ -0,0 +1,13 @@ +{firstname} {lastname}, gracias por comprar en {shop_name}! + +Tienes {nbProducts} producto(s) para descargar. + +Este es el acceso directo: +{virtualProducts} + + +Puedes revisar este pedido y descargar la factura desde la sección "Seguimiento de Pedido" de tu cuenta pulsando en "Mi cuenta" en nuestra web. +Si tienes una cuenta invitado, puedes seguir tu pedido en esta página: {shop_url}guest-tracking.php?id_order={id_order} + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/employee_password.html b/mails/es/employee_password.html new file mode 100644 index 000000000..a433a4deb --- /dev/null +++ b/mails/es/employee_password.html @@ -0,0 +1,11 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + + +</body> +</html> \ No newline at end of file diff --git a/mails/es/employee_password.txt b/mails/es/employee_password.txt new file mode 100644 index 000000000..33d064c8e --- /dev/null +++ b/mails/es/employee_password.txt @@ -0,0 +1,13 @@ +Hola {firstname} {lastname}, + +Tu información personal en {shop_name} es: + +* Nombre: {firstname} +* Apellidos: {lastname} +* Contraseña: {passwd} +* Email: {email} + +{shop_name} - {shop_url} + + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/mails/es/forward_msg.html b/mails/es/forward_msg.html new file mode 100644 index 000000000..6a9a9c22a --- /dev/null +++ b/mails/es/forward_msg.html @@ -0,0 +1,17 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td style="border: 1px solid #CCCCCC; background-color: #ffffff; padding: 10px; color: #383838; font-size: 12px;">{employee} wanted to forward this chat to you. <br /><br />{messages} <br /><br />{employee} added "{comment}".</td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/forward_msg.txt b/mails/es/forward_msg.txt new file mode 100644 index 000000000..0b39e11a0 --- /dev/null +++ b/mails/es/forward_msg.txt @@ -0,0 +1,4 @@ +{employee} en espera para seguir esta conversación contigo:. +Comentario: {comment} + +{messages} diff --git a/mails/es/guest_to_customer.html b/mails/es/guest_to_customer.html new file mode 100644 index 000000000..0647d1bf6 --- /dev/null +++ b/mails/es/guest_to_customer.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hi <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Your guest account has been transformed as customer account</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>E-mail address:</strong> {email}<br /><strong>Password:</strong> {passwd}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Please be careful when sharing these login details with others. <br /><br />You can access at your account on our Website: {shop_url}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/guest_to_customer.txt b/mails/es/guest_to_customer.txt new file mode 100644 index 000000000..08f79f20b --- /dev/null +++ b/mails/es/guest_to_customer.txt @@ -0,0 +1,15 @@ + Hi {firstname} {lastname}, + + Your guest account has been transformed as customer account: + + E-mail address: {email} + Password: {passwd} + + + You can access at your account on our Website: {shop_url} + + Please be careful when sharing these login details with others. + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/es/in_transit.html b/mails/es/in_transit.html new file mode 100644 index 000000000..6115c8405 --- /dev/null +++ b/mails/es/in_transit.html @@ -0,0 +1,56 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde{shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Historial del Pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Tu pedido est&aacute; en camino.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes seguir su ubicaci&oacute;n actual haciendo clic en este enlace: <a href="{followup}">{followup}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Tambi&eacute;n puedes revisar tus pedidos y descargar tus facturas desde tu <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">tu cuenta</a><a> en nuestra web. </a></td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/in_transit.txt b/mails/es/in_transit.txt new file mode 100644 index 000000000..27d9c1bad --- /dev/null +++ b/mails/es/in_transit.txt @@ -0,0 +1,14 @@ +Hola {firstname} {lastname}, + +Tu pedido está en camino. +Puedes seguir su ubicación actual haciendo clic en este enlace: {followup} + +También puedes revisar tus pedidos y descargar tus facturas desde tu "Historial de Pedidos" dentro de tu cuenta. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Gracias por comprar en {shop_name}! + +{shop_name} - {shop_url} + + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/mails/es/index.php b/mails/es/index.php new file mode 100644 index 000000000..5ff8ef28c --- /dev/null +++ b/mails/es/index.php @@ -0,0 +1,37 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; +?> \ No newline at end of file diff --git a/mails/es/lang.php b/mails/es/lang.php new file mode 100644 index 000000000..e73e36ebf --- /dev/null +++ b/mails/es/lang.php @@ -0,0 +1,39 @@ +<?php + +global $_LANGMAIL; +$_LANGMAIL = array(); +$_LANGMAIL['Welcome!'] = 'Bienvenido !'; +$_LANGMAIL['Message from contact form'] = 'Mensaje desde el formulario de contacto'; +$_LANGMAIL['Your message has been correctly sent'] = ''; +$_LANGMAIL['New credit slip regarding your order'] = ''; +$_LANGMAIL['Virtual product to download'] = ''; +$_LANGMAIL['Fwd: Customer message'] = ''; +$_LANGMAIL['Your guest account has been transformed to customer account'] = ''; +$_LANGMAIL['Package in transit'] = ''; +$_LANGMAIL['[Log'] = ''; +$_LANGMAIL['Order confirmation'] = 'Confirmacion de pedido'; +$_LANGMAIL['Message from a customer'] = 'Mensaje de un cliente'; +$_LANGMAIL['New message regarding your order'] = ''; +$_LANGMAIL['Your order return state has changed'] = ''; +$_LANGMAIL['Your password'] = 'Tu contrase�a'; +$_LANGMAIL['Password query confirmation'] = ''; +$_LANGMAIL['An answer to your message is available'] = ''; +$_LANGMAIL['New voucher regarding your order'] = ''; +$_LANGMAIL['Happy birthday!'] = ''; +$_LANGMAIL['Newsletter confirmation'] = ''; +$_LANGMAIL['Newsletter voucher'] = ''; +$_LANGMAIL['Your wishlist\\\'s link'] = ''; +$_LANGMAIL['Message from '] = ''; +$_LANGMAIL[' $subject'] = ''; +$_LANGMAIL['Your cart and your discount'] = ''; +$_LANGMAIL['Thanks for your order'] = ''; +$_LANGMAIL['You are one of our best customers'] = ''; +$_LANGMAIL['We miss you'] = ''; +$_LANGMAIL['Product available'] = ''; +$_LANGMAIL['Product out of stock'] = ''; +$_LANGMAIL['Error reporting from your PayPal module'] = ''; +$_LANGMAIL['Congratulations!'] = ''; +$_LANGMAIL['Referral Program'] = ''; +$_LANGMAIL['A friend sent you a link to'] = ''; + +?> \ No newline at end of file diff --git a/mails/es/log_alert.html b/mails/es/log_alert.html new file mode 100755 index 000000000..93e209e81 --- /dev/null +++ b/mails/es/log_alert.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hi,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">New log alert</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Unfortunately, new log alert message has been saved.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">You can check this on your Back office &gt; Tools &gt; Log on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/log_alert.txt b/mails/es/log_alert.txt new file mode 100755 index 000000000..ac109b176 --- /dev/null +++ b/mails/es/log_alert.txt @@ -0,0 +1,11 @@ +Hi, + +New log alert + +Unfortunately, new log alert message has been saved. + +You can check this on your Back office > Tools > Log on our Website. + +{shop_name} - {shop_url} + +{shop_url} powered by PrestaShop™ diff --git a/mails/es/newsletter.html b/mails/es/newsletter.html new file mode 100644 index 000000000..72c10d6b0 --- /dev/null +++ b/mails/es/newsletter.html @@ -0,0 +1,35 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Newsletter de {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">{message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/newsletter.txt b/mails/es/newsletter.txt new file mode 100644 index 000000000..9d31d2b2a --- /dev/null +++ b/mails/es/newsletter.txt @@ -0,0 +1,9 @@ +Newsletter de {shop_name} + +Mensaje + +{message} + + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/order_canceled.html b/mails/es/order_canceled.html new file mode 100644 index 000000000..4b31f67dd --- /dev/null +++ b/mails/es/order_canceled.html @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Respecto al pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Tu pedido ha sido cancelado.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar este pedido y descargar tu factura desde la secci&oacute;n <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}order-follow.php">"Seguimiento de Pedido"</a> de su cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mi Cuenta"</a> en nuestra web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/order_canceled.txt b/mails/es/order_canceled.txt new file mode 100644 index 000000000..de941a876 --- /dev/null +++ b/mails/es/order_canceled.txt @@ -0,0 +1,14 @@ +Hola {firstname} {lastname}, + +Respecto al pedido #{id_order}: + +Tu pedido ha sido cancelado. + +Puedes revisar este pedido y descargar tu factura desde la seccion de "Historial de Pedidos" dentro de tu cuenta en nuestra web. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/order_conf.html b/mails/es/order_conf.html new file mode 100644 index 000000000..69a480866 --- /dev/null +++ b/mails/es/order_conf.html @@ -0,0 +1,120 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>, gracias por comprar en <strong>{shop_name}</strong>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Detalles del Pedido</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Pedido: <strong><span style="color: #db3484;">{order_name}</span> realizado el {date}</strong> <br />Forma de Pago: <strong>{payment}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"> +<table style="width: 100%; font-size: 11px; color: #374953;"> +<!-- Title --> +<tbody> +<tr style="background-color: #b9babe; text-align: center;"> +<th style="width: 15%; padding: 1em 0;">Referencia</th><th>Producto</th><th style="width: 15%;">Precio Unidad</th><th style="width: 15%;">Cantidad</th><th style="width: 20%;">Precio Total</th> +</tr> +<!-- Products -->{products} {discounts} <!-- Footer: prices --> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;" colspan="3">Productos</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;">{total_products}</td> +</tr> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="3">Descuentos</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_discounts}</td> +</tr> +<tr style="text-align: right;"> +<td>&nbsp;</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;" colspan="3">Env&iacute;os</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;">{total_shipping}</td> +</tr> +<tr style="text-align: right; font-weight: bold;"> +<td>&nbsp;</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;" colspan="3">TOTAL</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;">{total_paid}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Shipping</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Transporte: <strong>{carrier}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td> +<table style="width: 100%; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-transform: uppercase;"> +<th style="text-align: left; padding: 0.3em 1em;">Direcci&oacute;n de Entrega</th><th style="text-align: left; padding: 0.3em 1em;">Direcci&oacute;n de Facturaci&oacute;n</th> +</tr> +<tr> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;"> +{delivery_block_html} +</td> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;"> +{invoice_block_html} +</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/order_conf.txt b/mails/es/order_conf.txt new file mode 100644 index 000000000..ba38cae8c --- /dev/null +++ b/mails/es/order_conf.txt @@ -0,0 +1,29 @@ + {firstname} {lastname}, gracias por realizar su pedido en {shop_name}! + + Detalles del Pedido + + Pedido: {order_name} realizado el {date} + Forma de Pago: {payment} + + Total Productos: {total_products} + Descuentos: {total_discounts} + Gastos Envío: {total_shipping} + Total: {total_paid} + + + Envios + + Transporte: {carrier} + + Dirección de Entrega: + {delivery_block_txt} + + Direccion de Facturación: + {invoice_block_txt} + + Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). + If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + + Gracias por comprar en {shop_name}. + + {shop_url} desarrollado por PrestaShop® diff --git a/mails/es/order_customer_comment.html b/mails/es/order_customer_comment.html new file mode 100644 index 000000000..0298f8c2f --- /dev/null +++ b/mails/es/order_customer_comment.html @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de un cliente de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Mensaje desde {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Has recibido un nuevo mensaje sobre el pedido #{id_order}:</strong> <br /><br />{message}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/order_customer_comment.txt b/mails/es/order_customer_comment.txt new file mode 100644 index 000000000..6448771db --- /dev/null +++ b/mails/es/order_customer_comment.txt @@ -0,0 +1,8 @@ +Hola {firstname} {lastname}, + +Has recibido un nuevo mensaje sobre el pedido #{id_order}: + +{message} + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/order_merchant_comment.html b/mails/es/order_merchant_comment.html new file mode 100644 index 000000000..836a8c4c4 --- /dev/null +++ b/mails/es/order_merchant_comment.html @@ -0,0 +1,11 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + + +</body> +</html> \ No newline at end of file diff --git a/mails/es/order_merchant_comment.txt b/mails/es/order_merchant_comment.txt new file mode 100644 index 000000000..e69de29bb diff --git a/mails/es/order_return_state.html b/mails/es/order_return_state.html new file mode 100644 index 000000000..f20e7a639 --- /dev/null +++ b/mails/es/order_return_state.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Buenos d&iacute;as <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Historico de su devoluci&oacute;n N&deg;{id_order_return}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>El estado de su devoluci&oacute;n ha cambiado a "{state_order_return}".</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puede acceder al seguimiento de su devoluci&oacute;n y descargar su factura en <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Hist&oacute;rico de pedidos"</a> en la secci&oacute;n <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Mi cuenta"</a> de nuestra Web.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/order_return_state.txt b/mails/es/order_return_state.txt new file mode 100644 index 000000000..f46dd0c6a --- /dev/null +++ b/mails/es/order_return_state.txt @@ -0,0 +1,9 @@ +Buenos días: {firstname} {lastname}, + +El estado de tu devolución {id_order_return} a cambiado a "{state_order_return}". + +Puedes revisar esta orden de devolución en "Historial y detalles de tus pedidos" de tu cuenta pulsando sobre "Mi cuenta" en nuestro sitio web. + +{shop_name} - {shop_url} + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/mails/es/outofstock.html b/mails/es/outofstock.html new file mode 100644 index 000000000..e96b8d4ab --- /dev/null +++ b/mails/es/outofstock.html @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Incidencia en tu pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Desgraciadamente, uno o mas productos de tu pedido #{id_order} se encuentran actualmente fuera de stock. Esto puede originar un retraso en el env&iacute;o. Por favor, acepta nuestras disculpas y puedes estar seguro que trabajeremos lo m&aacute;s r&aacute;pidamente posible para solucionarlo.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/outofstock.txt b/mails/es/outofstock.txt new file mode 100644 index 000000000..7388d1b27 --- /dev/null +++ b/mails/es/outofstock.txt @@ -0,0 +1,17 @@ +Hola {firstname} {lastname}, + +Incidencia en tu pedido #{id_order} + +Desgraciadamente, uno o mas productos de tu pedido #{id_order} se encuentran actualmente fuera de stock. +Esto puede originar un retraso en el envío. Por favor, acepta nuestras disculpas y puedes estar seguro que trabajaremos lo más rápidamente posible para solucionarlo. + + + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/password.html b/mails/es/password.html new file mode 100644 index 000000000..d9ec75e7c --- /dev/null +++ b/mails/es/password.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Detalles de tu nuevo Login</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong><strong>Email:</strong> {email}<br /><strong>Contrase&ntilde;a:</strong> {passwd} </strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Por favor, ten cuidado en no compartir con nadie estos detalles. <br /><br />Ahora puedes realizar pedidos en nuestra web de: {shop_url}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> pdesarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/password.txt b/mails/es/password.txt new file mode 100644 index 000000000..c7e0d2316 --- /dev/null +++ b/mails/es/password.txt @@ -0,0 +1,15 @@ +Hola {firstname} {lastname}, + +Detalles de tu nuevo login: + +Email: {email} +Contraseña: {passwd} + + +Ahora puedes realizar pedidos en nuestra web de: {shop_url} + + +Por favor, ten cuidado en no compartir con nadie estos detalles. + + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/mails/es/password_query.html b/mails/es/password_query.html new file mode 100644 index 000000000..0de0dccaf --- /dev/null +++ b/mails/es/password_query.html @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">You asked to get back your {shop_name}&#039;identifiers,<br />Note that this action will change your actual password.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">If you really want to do it, click the next link :<br /><a href="{url}">{url}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/password_query.txt b/mails/es/password_query.txt new file mode 100644 index 000000000..177931d11 --- /dev/null +++ b/mails/es/password_query.txt @@ -0,0 +1,9 @@ +Hola {firstname} {lastname}, + +You asked to get back your {shop_name} access codes. +Note that this action will change your current password. + +If you really want to do it, click the following link : +{url} + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/payment.html b/mails/es/payment.html new file mode 100644 index 000000000..478de8be9 --- /dev/null +++ b/mails/es/payment.html @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">En referencia a tu pedido #{id_order}:</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>El pago de tu pedido fue recibido CORRECTAMENTE .</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/payment.txt b/mails/es/payment.txt new file mode 100644 index 000000000..7b879b284 --- /dev/null +++ b/mails/es/payment.txt @@ -0,0 +1,14 @@ +Hola {firstname} {lastname}, + +En referencia a tu pedido #{id_order}: + +El pago de tu pedido fue recibido CORRECTAMENTE . + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + +Gracias por comprar en {shop_name}. + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/payment_error.html b/mails/es/payment_error.html new file mode 100644 index 000000000..ae886fe21 --- /dev/null +++ b/mails/es/payment_error.html @@ -0,0 +1,56 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Incidencia en su pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Hay un problema con tu pago para el pedido: #{id_order}. Por favor, ponte en contacto con nosotros en cuanto puedas.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Tu pedido no ser&aacute; enviado hasta que resolvamos este problema.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/payment_error.txt b/mails/es/payment_error.txt new file mode 100644 index 000000000..ec8ca56e6 --- /dev/null +++ b/mails/es/payment_error.txt @@ -0,0 +1,16 @@ +Hola {firstname} {lastname}, + + +Hay un problema con tu pago para el pedido: #{id_order}. Por favor, ponte en contacto con nosotros en cuanto puedas. + +Tu pedido no será enviado hasta que resolvamos este problema. + + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/preparation.html b/mails/es/preparation.html new file mode 100644 index 000000000..78aa7e7fd --- /dev/null +++ b/mails/es/preparation.html @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Sobre tu pedido: #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Estamos preparando tu pedido.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/preparation.txt b/mails/es/preparation.txt new file mode 100644 index 000000000..3ffae336a --- /dev/null +++ b/mails/es/preparation.txt @@ -0,0 +1,13 @@ +Hola {firstname} {lastname}, + +Sobre tu pedido #{id_order}: + +Estamos preparando tu pedido. + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/refund.html b/mails/es/refund.html new file mode 100644 index 000000000..d2509d447 --- /dev/null +++ b/mails/es/refund.html @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Sobre su pedido: #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Se ha reembolsado el pago de tu pedido.</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/refund.txt b/mails/es/refund.txt new file mode 100644 index 000000000..5411919de --- /dev/null +++ b/mails/es/refund.txt @@ -0,0 +1,12 @@ +Hola {firstname} {lastname}, + +Se ha reembolsado el pago de tu pedido. + +Puedes revisar tu pedido y descargar la factura desde tu cuenta de nuestra web en (historial de pedidos). +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} desarrollado por PrestaShop® diff --git a/mails/es/reply_msg.html b/mails/es/reply_msg.html new file mode 100644 index 000000000..f2f26a881 --- /dev/null +++ b/mails/es/reply_msg.html @@ -0,0 +1,17 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td style="border: 1px solid #CCCCCC; background-color: #ffffff; padding: 10px; color: #383838; font-size: 12px;">{reply}<br /><br /><span style="color: red; font-weight: bold;">Please do not reply to this message with your e-mail client</span>, we would not receive your message.<br />In order to reply, please use exclusively the following link: <a href="{link}">{link}</a>.</td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/reply_msg.txt b/mails/es/reply_msg.txt new file mode 100644 index 000000000..0200bedb9 --- /dev/null +++ b/mails/es/reply_msg.txt @@ -0,0 +1,4 @@ +{reply} + +Please do not reply to this message using your e-mail client, we would not receive your message. +In order to reply, please use exclusively the following link: {link} diff --git a/mails/es/shipped.html b/mails/es/shipped.html new file mode 100644 index 000000000..55762df63 --- /dev/null +++ b/mails/es/shipped.html @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Historial de tu Pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>Tu pedido ha sido enviado.</strong><br />Recibir&aacute;s pronto una URL para realizar el seguimiento del env&iacute;o de tu pedido.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Puedes revisar tu pedido y descargar la factura aqu&iacute;: <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Historial de Pedidos"</a> dentro de tu cuenta <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Entrar en Mi Cuenta"</a> de nuestro sitio web.</td> +</tr> +<tr> +<td align="left">If you have guest account, you can follow your order at <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Guest Tracking"</a> section on our Website.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/shipped.txt b/mails/es/shipped.txt new file mode 100644 index 000000000..4b24067c1 --- /dev/null +++ b/mails/es/shipped.txt @@ -0,0 +1,15 @@ +Hola {firstname} {lastname}, + +Tu pedido acaba de ser enviado. +Pronto recibirás una URL para realizar el seguimiento de tu pedido. + +Puedes revisar este pedido y descargar tu factura en la sección "Historial" dentro de tu cuenta en nuestra web. +If you have guest account, you can follow your order at this page: {shop_url}guest-tracking.php + +Gracias por comprar en {shop_name}! + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop® \ No newline at end of file diff --git a/mails/es/test.html b/mails/es/test.html new file mode 100644 index 000000000..eef59c580 --- /dev/null +++ b/mails/es/test.html @@ -0,0 +1,23 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Prueba de Corrreo</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td>Hola,<br /><br />Esto es una <strong>prueba de correo</strong> desde tu tienda.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center">powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/test.txt b/mails/es/test.txt new file mode 100644 index 000000000..507df58ce --- /dev/null +++ b/mails/es/test.txt @@ -0,0 +1,3 @@ +Hola, + +Esto es una prueba de correo desde tu tienda Prestashop. \ No newline at end of file diff --git a/mails/es/voucher.html b/mails/es/voucher.html new file mode 100644 index 000000000..ea2d0b056 --- /dev/null +++ b/mails/es/voucher.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Historial de tu Pedido #{id_order}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Te informamos de la creaci&oacute;n de un cup&oacute;n de descuento para t&iacute; como resultado de tu pedido #{id_order}.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Aqu&iacute; tienes tu c&oacute;digo del cup&oacute;n: <strong>{voucher_num}</strong>, por la cantidad de <strong>{voucher_amount}</strong>.<br />Simplemente copia y pega &eacute;ste c&oacute;digo durante el proceso de pago de tu pr&oacute;ximo pedido.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/mails/es/voucher.txt b/mails/es/voucher.txt new file mode 100644 index 000000000..fb8be0606 --- /dev/null +++ b/mails/es/voucher.txt @@ -0,0 +1,14 @@ +Hola {firstname} {lastname}, + +Te informamos de la creación de un vale de descuento para ti como resultado de tu pedido #{id_order}. + +Aquí tienes tu código del vale:{voucher_num}, por la cantidad de:{voucher_amount}. + +Simplemente copia y pega este código durante el proceso de pago de tu próximo pedido. + +Gracias por comprar en {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/mails/fr/account.html b/mails/fr/account.html new file mode 100644 index 000000000..393802229 --- /dev/null +++ b/mails/fr/account.html @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Merci d'avoir cr&eacute;&eacute; un compte sur {shop_name}. Voici un rappel de vos codes d'acc&egrave;s</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Adresse e-mail : <strong><span style="color:#DB3484;">{email}</span></strong> + <br >Mot de passe : <strong>{passwd}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez d&egrave;s &agrave; pr&eacute;sent passer commande sur notre site internet <a href="{shop_url}">{shop_name}</a>. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/account.txt b/mails/fr/account.txt new file mode 100644 index 000000000..bc639cc80 --- /dev/null +++ b/mails/fr/account.txt @@ -0,0 +1,13 @@ +Merci d'avoir créé votre compte client sur {shop_name}, vous trouverez dans ce message un rappel de vos codes d'accès. + +Vos codes d'accès : + +Adresse électronique : {email} +Mot de passe : {passwd} + +Vous pouvez dès à présent passer commande sur notre site Internet : +{shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/bankwire.html b/mails/fr/bankwire.html new file mode 100644 index 000000000..f08857769 --- /dev/null +++ b/mails/fr/bankwire.html @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Nous avons bien enregistr&eacute; votre commande {id_order}. Celle-ci vous sera envoy&eacute;e d&egrave;s r&eacute;ception de votre paiement. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Pour rappel, vous avez s&eacute;lectionn&eacute; le mode de paiement par virement bancaire et celui-ci est &agrave; envoyer &agrave; : + <br /><br /> + <strong>{bankwire_owner}</strong> + <br /><br /> + {bankwire_details} + <br /><br /> + {bankwire_address} + <br /><br /> + Le montant total est de {total_paid} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/bankwire.txt b/mails/fr/bankwire.txt new file mode 100644 index 000000000..d119505a8 --- /dev/null +++ b/mails/fr/bankwire.txt @@ -0,0 +1,22 @@ +Bonjour {firstname} {lastname}, + +Nous avons bien enregistré votre commande {id_order}. Celle-ci vous sera envoyée dès réception de votre paiement. +Pour rappel, vous avez sélectionné le mode de paiement par virement bancaire et celui-ci est à envoyer à : + +{bankwire_owner} + +{bankwire_details} + +{bankwire_address} + +Le montant total est de {total_paid} + +Vous pouvez accéder à tout moment au suivi de votre commande et télécharger votre facture dans "Historique des commandes" de la rubrique "Mon compte" sur notre site {shop_url} +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +Merci et à bientôt sur {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/cheque.html b/mails/fr/cheque.html new file mode 100644 index 000000000..89483a9f3 --- /dev/null +++ b/mails/fr/cheque.html @@ -0,0 +1,59 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Nous avons bien enregistr&eacute; votre commande {order_name}. Celle-ci vous sera envoy&eacute;e d&egrave;s r&eacute;ception de votre paiement. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Pour rappel, vous avez choisi de régler votre commande par chèque, merci de nous transmettre votre règlement : + <br /><br /> + - d'un montant de <b>{total_paid}</b> + <br /><br /> + - à l'ordre de <b>{cheque_name}</b> + <br /><br /> + - à <b>{cheque_address_html}</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/cheque.txt b/mails/fr/cheque.txt new file mode 100644 index 000000000..6504f8d02 --- /dev/null +++ b/mails/fr/cheque.txt @@ -0,0 +1,21 @@ +Bonjour {firstname} {lastname}, + +Nous avons bien enregistré votre commande {order_name}. +Celle-ci vous sera envoyée dès réception de votre paiement. + +Pour rappel, vous avez choisi de régler votre commande par chèque, merci de nous transmettre votre règlement : + +- d'un montant de {total_paid} + +- à l'ordre de {cheque_name} + +- à {cheque_address} + +Vous pouvez accéder &agrave; tout moment au suivi de votre commande et télécharger votre facture dans "Historique des commandes" de la rubrique "Mon compte" sur notre site {shop_url} +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/contact.html b/mails/fr/contact.html new file mode 100644 index 000000000..cf27422f5 --- /dev/null +++ b/mails/fr/contact.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Vous avez re&ccedil;u un message de la part d'un client depuis votre boutique {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Adresse &eacute;lectronique : <a href="mailto:{email}"><b>{email}</b></a> + <br><br> + Message: {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/contact.txt b/mails/fr/contact.txt new file mode 100644 index 000000000..058a8d3b7 --- /dev/null +++ b/mails/fr/contact.txt @@ -0,0 +1,11 @@ +Vous avez reçu un message de la part d'un client depuis votre boutique {shop_name} + +Informations + +Adresse électronique : {email} + +Message + +{message} + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/contact_form.html b/mails/fr/contact_form.html new file mode 100644 index 000000000..352f6be1b --- /dev/null +++ b/mails/fr/contact_form.html @@ -0,0 +1,36 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Votre message a bien &eacute;t&eacute; envoy&eacute; &agrave; notre service client.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Votre message: {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Nous vous r&eacute;pondrons d&egrave;s que possible.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/contact_form.txt b/mails/fr/contact_form.txt new file mode 100644 index 000000000..30743998c --- /dev/null +++ b/mails/fr/contact_form.txt @@ -0,0 +1,12 @@ +Votre message a bien été envoyé à notre service client. + +Votre message: + +{message} + + +Nous vous répondrons dés que possible. + +Cordialement, + +{shop_url} réalisé avec PrestaShop™ \ No newline at end of file diff --git a/mails/fr/credit_slip.html b/mails/fr/credit_slip.html new file mode 100644 index 000000000..5d2c777e5 --- /dev/null +++ b/mails/fr/credit_slip.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Nous vous informons de la g&eacute;n&eacute;ration d'un avoir &agrave; votre nom relatif &agrave; votre commande n&#176;{id_order}. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der &agrave; cet avoir et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}order-follow.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/credit_slip.txt b/mails/fr/credit_slip.txt new file mode 100644 index 000000000..fe8331164 --- /dev/null +++ b/mails/fr/credit_slip.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Nous vous informons de la génération d'un avoir à votre nom relatif à votre commande n°{id_order}. + +Vous pouvez accéder à cet avoir et télécharger votre facture dans "Historique des commandes" de la rubrique "Mon compte" sur notre site {shop_url} + +Merci et à bientôt sur {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/download-product.tpl b/mails/fr/download-product.tpl new file mode 100644 index 000000000..d5eb29e03 --- /dev/null +++ b/mails/fr/download-product.tpl @@ -0,0 +1,13 @@ +<ul> +{foreach from=$virtualProducts item=product} + <li> + <a href="{$product.link}">{$product.name}</a> + {if isset($product.deadline)} + expire le {$product.deadline} + {/if} + {if isset($product.downloadable)} + téléchargeable {$product.downloadable} fois + {/if} + </li> +{/foreach} +</ul> \ No newline at end of file diff --git a/mails/fr/download_product.html b/mails/fr/download_product.html new file mode 100644 index 000000000..c88aadefd --- /dev/null +++ b/mails/fr/download_product.html @@ -0,0 +1,54 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Produits à télécharger</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous avez {nbProducts} produit(s) à télécharger. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Voici les liens directs vers ceux-ci : + {virtualProducts} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php?id_order={id_order}" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/download_product.txt b/mails/fr/download_product.txt new file mode 100644 index 000000000..207cc52dc --- /dev/null +++ b/mails/fr/download_product.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, merci d'avoir passé commande chez {shop_name} ! + +Vous avez {nbProducts} produit(s) à télécharger. + +Voici les liens directs vers ceux-ci : +{virtualProducts} + + +Vous pouvez accéder au suivi de votre commande et télécharger votre facture dans "Historique des commandes" de la rubrique "Mon compte" sur notre site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php?id_order={id_order} + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/employee_password.html b/mails/fr/employee_password.html new file mode 100644 index 000000000..47361b12c --- /dev/null +++ b/mails/fr/employee_password.html @@ -0,0 +1,39 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Voici vos informations personnelles</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Pr&eacute;nom</b> : {firstname}<br> + <b>Nom</b> : {lastname}<br> + <b>Mot de passe</b> : {passwd}<br> + <b>Adresse &eacute;lectronique</b> : {email} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/employee_password.txt b/mails/fr/employee_password.txt new file mode 100644 index 000000000..587b0d324 --- /dev/null +++ b/mails/fr/employee_password.txt @@ -0,0 +1,15 @@ +Bonjour {firstname} {lastname}, + +Voici les informations personnelles concernant votre nouvelle boutique {shop_name} : + +Prénom : {firstname} +Nom : {lastname} +Mot de passe : {passwd} +Adresse électronique : {email} + + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/forward_msg.html b/mails/fr/forward_msg.html new file mode 100644 index 000000000..93b2590f2 --- /dev/null +++ b/mails/fr/forward_msg.html @@ -0,0 +1,20 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td style="border:1px solid #CCCCCC;background-color:#FFFFFF;padding:10px;color:#383838;font-size:12px"> + {employee} souhaite vous transférer cette discussion. + <br /><br /> + {messages} + <br /><br /> + {employee} a ajouté "{comment}". + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/forward_msg.txt b/mails/fr/forward_msg.txt new file mode 100644 index 000000000..32bc3ee2e --- /dev/null +++ b/mails/fr/forward_msg.txt @@ -0,0 +1,5 @@ +{employee} souhaite vous transférer cette discussion. +Commentaire: {comment} + +{messages} + diff --git a/mails/fr/guest_to_customer.html b/mails/fr/guest_to_customer.html new file mode 100644 index 000000000..15e2fb61c --- /dev/null +++ b/mails/fr/guest_to_customer.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Votre compte invit&eacute; a &eacute;t&eacute; transform&eacute; en compte client</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Adresse e-mail :</b> {email}<br> + <b>Mot de passe :</b> {passwd} + </td> + </tr> + <tr> + <td align="left"> + Vous pouvez accéder à votre compte sur notre site Internet : {shop_url} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/guest_to_customer.txt b/mails/fr/guest_to_customer.txt new file mode 100644 index 000000000..6ae012d93 --- /dev/null +++ b/mails/fr/guest_to_customer.txt @@ -0,0 +1,13 @@ +Bonjour {firstname} {lastname}, + +Votre compte invité a été transformé en compte client + +Adresse électronique : {email} +Mot de passe : {passwd} + +Vous pouvez accéder à votre compte sur notre site Internet : +{shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/in_transit.html b/mails/fr/in_transit.html new file mode 100755 index 000000000..d8e5e62a1 --- /dev/null +++ b/mails/fr/in_transit.html @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>La livraison de votre commande est en cours.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez suivre l'avancement de la livraison &agrave; l'adresse suivante : <a href="{followup}">{followup}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/in_transit.txt b/mails/fr/in_transit.txt new file mode 100755 index 000000000..fe2c5e623 --- /dev/null +++ b/mails/fr/in_transit.txt @@ -0,0 +1,14 @@ +Bonjour {firstname} {lastname}, + +La livraison de votre commande est en cours. + +Vous pouvez suivre l'avancement de la livraison à l'adresse suivante : {followup} + +Vous pouvez accéder à tout moment au suivi de votre commande dans "Historique de mes commandes" de la rubrique "Mon compte" sur notre site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/index.php b/mails/fr/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/mails/fr/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/mails/fr/lang.php b/mails/fr/lang.php new file mode 100644 index 000000000..bc39e4edc --- /dev/null +++ b/mails/fr/lang.php @@ -0,0 +1,39 @@ +<?php + +global $_LANGMAIL; +$_LANGMAIL = array(); +$_LANGMAIL['Welcome!'] = 'Bienvenue !'; +$_LANGMAIL['Message from contact form'] = 'Message depuis le formulaire de contact'; +$_LANGMAIL['Your message has been correctly sent'] = 'Votre message a bien été envoyé'; +$_LANGMAIL['New credit slip regarding your order'] = 'Nouvel avoir concernant votre commande'; +$_LANGMAIL['Virtual product to download'] = 'Produit virtuel à télécharger'; +$_LANGMAIL['Fwd: Customer message'] = 'TR: Message d\'un client'; +$_LANGMAIL['Your guest account has been transformed to customer account'] = 'Votre compte invité a été transformé en compte client'; +$_LANGMAIL['Package in transit'] = 'Livraison en cours'; +$_LANGMAIL['[Log'] = ''; +$_LANGMAIL['Order confirmation'] = 'Confirmation de commande'; +$_LANGMAIL['Message from a customer'] = 'Message d\'un client'; +$_LANGMAIL['New message regarding your order'] = 'Nouveau message concernant votre commande'; +$_LANGMAIL['Your order return state has changed'] = 'Nouveau statut de commande'; +$_LANGMAIL['Your password'] = 'Votre nouveau mot de passe'; +$_LANGMAIL['Password query confirmation'] = 'Confirmation de demande de mot de passe'; +$_LANGMAIL['An answer to your message is available'] = ''; +$_LANGMAIL['New voucher regarding your order'] = 'Nouveau bon de réduction concernant votre commande'; +$_LANGMAIL['Happy birthday!'] = 'Bon anniversaire !'; +$_LANGMAIL['Newsletter confirmation'] = 'Confirmation newsletter'; +$_LANGMAIL['Newsletter voucher'] = 'Bon de réduction newsletter'; +$_LANGMAIL['Your wishlist\\\'s link'] = ''; +$_LANGMAIL['Message from '] = 'Message de '; +$_LANGMAIL['$subject'] = ''; +$_LANGMAIL['Your cart and your discount'] = 'Votre panier et votre bon de réduction'; +$_LANGMAIL['Thanks for your order'] = 'Merci pour votre commande'; +$_LANGMAIL['You are one of our best customers'] = 'Vous êtes l\'un de nos meilleurs clients'; +$_LANGMAIL['We miss you'] = 'Vous nous manquez'; +$_LANGMAIL['Product available'] = 'Produit disponible'; +$_LANGMAIL['Product out of stock'] = 'Rupture de stock'; +$_LANGMAIL['Error reporting from your PayPal module'] = ''; +$_LANGMAIL['Congratulations!'] = 'Bravo !'; +$_LANGMAIL['Referral Program'] = 'Programme de parrainage'; +$_LANGMAIL['A friend sent you a link to'] = 'Un ami vous a envoyé un lien vers'; + +?> \ No newline at end of file diff --git a/mails/fr/log_alert.html b/mails/fr/log_alert.html new file mode 100755 index 000000000..674d70911 --- /dev/null +++ b/mails/fr/log_alert.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Nouveau message d'alerte enregistré</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Malheuresement, un message d'alerte a été enregistré</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez voir ce message dans votre Panneau d'administration &gt; Outils &gt; Log + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> propulsé par <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/log_alert.txt b/mails/fr/log_alert.txt new file mode 100755 index 000000000..b798eb6cb --- /dev/null +++ b/mails/fr/log_alert.txt @@ -0,0 +1,11 @@ +Bonjour, + +Nouveau message d'alerte enregistré + +Malheuresement, un message d'alerte a été enregistré + +Vous pouvez voir ce message dans votre Panneau d'administration > Outils > Log + +{shop_name} - {shop_url} + +{shop_url} propulsé par PrestaShop™ diff --git a/mails/fr/newsletter.html b/mails/fr/newsletter.html new file mode 100644 index 000000000..f02a857ba --- /dev/null +++ b/mails/fr/newsletter.html @@ -0,0 +1,30 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Newsletter de {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">{message}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/newsletter.txt b/mails/fr/newsletter.txt new file mode 100644 index 000000000..c9da252db --- /dev/null +++ b/mails/fr/newsletter.txt @@ -0,0 +1,9 @@ +Newsletter de {shop_name} + +Message + +{message} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/order_canceled.html b/mails/fr/order_canceled.html new file mode 100644 index 000000000..4c5e42724 --- /dev/null +++ b/mails/fr/order_canceled.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Votre commande a &eacute;t&eacute; annul&eacute;e.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/order_canceled.txt b/mails/fr/order_canceled.txt new file mode 100644 index 000000000..14f7e1dff --- /dev/null +++ b/mails/fr/order_canceled.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Votre commande {id_order} a été annulée. + +Vous pouvez accéder à tout moment au suivi de votre commande dans "Historique des commandes" de la rubrique "Mon compte" sur notre site <a href="{shop_url}">{shop_name}</a>. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/order_conf.html b/mails/fr/order_conf.html new file mode 100644 index 000000000..e044acb6a --- /dev/null +++ b/mails/fr/order_conf.html @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;"></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>, merci d'avoir pass&eacute; commande chez <strong>{shop_name}</strong> !</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">D&eacute;tails de la commande</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Commande : <strong><span style="color:#DB3484;">{order_name}</span> pass&eacute;e le {date}</strong> + <br>Mode de paiement: <strong>{payment}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <!-- Title --> + <tr style="background-color:#B9BABE; text-align:center;"> + <th style="width:15%; padding: 0.6em 0;">R&eacute;f&eacute;rence</th> + <th style="width:30%; padding: 0.6em 0;">Produit</th> + <th style="width:20%; padding: 0.6em 0;">Prix unitaire</th> + <th style="width:15%; padding: 0.6em 0;">Quantit&eacute;</th> + <th style="width:20%; padding: 0.6em 0;">Prix total</th> + </tr> + <!-- Products --> + {products} + {discounts} + <!-- Footer: prices --> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#B9BABE; padding:0.6em 0.4em;">Total produits</td> + <td style="background-color:#B9BABE; padding:0.6em 0.4em;">{total_products}</td> + </tr> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#EBECEE; padding:0.6em 0.4em;">Bons d'achat et r&eacute;ductions</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_discounts}</td> + </tr> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#EBECEE; padding:0.6em 0.4em;">Emballage Cadeau</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_wrapping}</td> + </tr> + <tr style="text-align:right;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#DDE2E6; padding:0.6em 0.4em;">Frais d'exp&eacute;dition</td> + <td style="background-color:#DDE2E6; padding:0.6em 0.4em;">{total_shipping}</td> + </tr> + <tr style="text-align:right; font-weight:bold;"> + <td>&nbsp;</td> + <td colspan="3" style="background-color:#F1AECF; padding:0.6em 0.4em;">Total pay&eacute;</td> + <td style="background-color:#F1AECF; padding:0.6em 0.4em;">{total_paid}</td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Livraison</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Transporteur: <strong>{carrier}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <tr style="background-color:#B9BABE; text-transform:uppercase;"> + <th style="text-align:left; padding: 0.3em 1em;">Adresse de livraison</th> + <th style="text-align:left; padding: 0.3em 1em;">Adresse de facturation</th> + </tr> + <tr> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {delivery_block_html} + </td> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {invoice_block_html} + </td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/order_conf.txt b/mails/fr/order_conf.txt new file mode 100644 index 000000000..a0f97b313 --- /dev/null +++ b/mails/fr/order_conf.txt @@ -0,0 +1,28 @@ +Bonjour {firstname} {lastname}, merci d'avoir passé commande chez {shop_name} ! + +Détails de la commande + + Commande : {order_name} passée le {date} + Mode de paiement : {payment} + + Produits : {total_products} + Bons d'achat et réductions : {total_discounts} + Emballage Cadeau : {total_wrapping} + Frais d'expédition : {total_shipping} + Total payé : {total_paid} + + +Livraison + + Transporteur : {carrier} + + Adresse de livraison : + {delivery_block_txt} + + Adresse de facturation : + {invoice_block_txt} + +Vous pouvez accéder au suivi de votre commande et télécharger votre facture dans "Historique des commandes" de la rubrique "Mon compte" sur notre site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_url} réalisé par PrestaShop™ diff --git a/mails/fr/order_customer_comment.html b/mails/fr/order_customer_comment.html new file mode 100644 index 000000000..00da272c1 --- /dev/null +++ b/mails/fr/order_customer_comment.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message d'un client de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message de {firstname} {lastname} ({email})</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Vous avez re&ccedil;u un nouveau message concernant la commande n&#176;{id_order} :</b> + <br /><br /> + {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/order_customer_comment.txt b/mails/fr/order_customer_comment.txt new file mode 100644 index 000000000..79fb6368b --- /dev/null +++ b/mails/fr/order_customer_comment.txt @@ -0,0 +1,8 @@ +Bonjour, + +Vous avez reçu un nouveau message concernant la commande n°{id_order} : +{message} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/order_merchant_comment.html b/mails/fr/order_merchant_comment.html new file mode 100644 index 000000000..01a75bd37 --- /dev/null +++ b/mails/fr/order_merchant_comment.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message de {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Vous avez re&ccedil;u un nouveau message concernant la commande n&#176;{id_order} :</b> + <br><br> + {message} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/order_merchant_comment.txt b/mails/fr/order_merchant_comment.txt new file mode 100644 index 000000000..354e7a3f7 --- /dev/null +++ b/mails/fr/order_merchant_comment.txt @@ -0,0 +1,10 @@ +Bonjour {firstname} {lastname}, + +Vous avez reçu un nouveau message concernant la commande n°{id_order} : +{message} + +Vous pouvez à tout moment consulter vos anciens messages dans votre suivi de commande. + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/order_return_state.html b/mails/fr/order_return_state.html new file mode 100644 index 000000000..bc3374883 --- /dev/null +++ b/mails/fr/order_return_state.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#8C9CC0;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#8C9CC0; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre bon de retour n&#176;{id_order_return}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Votre bon de retour a chang&eacute; de statut en "{state_order_return}".</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre bon de retour et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#8C9CC0; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#8C9CC0; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/order_return_state.txt b/mails/fr/order_return_state.txt new file mode 100644 index 000000000..1f2f68ac2 --- /dev/null +++ b/mails/fr/order_return_state.txt @@ -0,0 +1,7 @@ +Bonjour {firstname} {lastname}, + +Votre bon de retour {id_order_return} a changé de statut en "{state_order_return}". + +Vous pouvez accéder à tout moment au suivi de votre bon de retour dans "Historique de mes commandes" de la rubrique "Mon compte" sur notre site. + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/outofstock.html b/mails/fr/outofstock.html new file mode 100644 index 000000000..db293cd71 --- /dev/null +++ b/mails/fr/outofstock.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Votre commande est bien enregistr&eacute;e mais n&eacute;cessite un r&eacute;approvisionnement.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/outofstock.txt b/mails/fr/outofstock.txt new file mode 100644 index 000000000..424359658 --- /dev/null +++ b/mails/fr/outofstock.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Votre commande {id_order} est bien enregistrée mais nécessite un réapprovisionnement. + +Vous pouvez accéder à tout moment au suivi de votre commande dans la rubrique "Mon compte". +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/password.html b/mails/fr/password.html new file mode 100644 index 000000000..f00296d71 --- /dev/null +++ b/mails/fr/password.html @@ -0,0 +1,37 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Voici vos codes d'acc&egrave;s</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Adresse e-mail :</b> {email}<br> + <b>Mot de passe :</b> {passwd} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/password.txt b/mails/fr/password.txt new file mode 100644 index 000000000..702b3acc8 --- /dev/null +++ b/mails/fr/password.txt @@ -0,0 +1,11 @@ +Comme demandé, nous avons modifié votre mot de passe, voici un rappel de vos codes d'accès. + +Adresse électronique : {email} +Mot de passe : {passwd} + +Vous pouvez dès à présent passer commande sur notre site Internet : +{shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/password_query.html b/mails/fr/password_query.html new file mode 100644 index 000000000..fb47f8e1e --- /dev/null +++ b/mails/fr/password_query.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Vous avez demandé à récupérer vos codes d'accès.<br /> + Cette opération vous attribuera un nouveau mot de passe.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Si vous souhaitez confirmer cette demande, cliquez sur le lien suivant :<br /> + <a href="{url}">{url}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/password_query.txt b/mails/fr/password_query.txt new file mode 100644 index 000000000..0c91c0c69 --- /dev/null +++ b/mails/fr/password_query.txt @@ -0,0 +1,9 @@ +Bonjour {firstname} {lastname} + +Vous avez demandé à récupérer vos codes d'accès. +Cette opération vous attribuera un nouveau mot de passe. + +Si vous souhaitez confirmer cette demande, cliquez sur le lien suivant : +{url} + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/payment.html b/mails/fr/payment.html new file mode 100644 index 000000000..8a5729095 --- /dev/null +++ b/mails/fr/payment.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Le paiement pour votre commande a &eacute;t&eacute; accept&eacute;.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/payment.txt b/mails/fr/payment.txt new file mode 100644 index 000000000..fa2fe87fb --- /dev/null +++ b/mails/fr/payment.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Le paiement pour votre commande {id_order} a été acceptée. + +Vous pouvez accéder à tout moment au suivi de votre commande dans "Historique des commandes" de la rubrique "Mon compte" sur notre site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/payment_error.html b/mails/fr/payment_error.html new file mode 100644 index 000000000..3d636c0c3 --- /dev/null +++ b/mails/fr/payment_error.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Statut de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Une erreur est survenue lors du paiement de votre commande.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/payment_error.txt b/mails/fr/payment_error.txt new file mode 100644 index 000000000..a5c1299bd --- /dev/null +++ b/mails/fr/payment_error.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Un problème a été constaté pour le paiement de votre commande {id_order}. + +Vous pouvez à tout moment accéder au suivi de votre commande dans la rubrique "Mon compte" du site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/preparation.html b/mails/fr/preparation.html new file mode 100644 index 000000000..8a152527e --- /dev/null +++ b/mails/fr/preparation.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Votre commande a &eacute;t&eacute; valid&eacute;e et est en cours de pr&eacute;paration.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/preparation.txt b/mails/fr/preparation.txt new file mode 100644 index 000000000..83f81573a --- /dev/null +++ b/mails/fr/preparation.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Votre commande {id_order} est en cours de préparation. + +Vous pouvez accéder à tout moment au suivi de votre commande dans "Historique de mes commandes" de la rubrique "Mon compte" sur notre site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/refund.html b/mails/fr/refund.html new file mode 100644 index 000000000..a55f93b6f --- /dev/null +++ b/mails/fr/refund.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Votre commande vous a bien &eacute;t&eacute; rembours&eacute;e.</b> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/refund.txt b/mails/fr/refund.txt new file mode 100644 index 000000000..e699436a0 --- /dev/null +++ b/mails/fr/refund.txt @@ -0,0 +1,12 @@ +Bonjour {firstname} {lastname}, + +Votre commande {id_order} vous a bien été remboursée. + +Vous pouvez accéder à tout moment au suivi de votre commande dans la rubrique "Mon compte" du site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/reply_msg.html b/mails/fr/reply_msg.html new file mode 100644 index 000000000..3c00bde68 --- /dev/null +++ b/mails/fr/reply_msg.html @@ -0,0 +1,18 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td style="border:1px solid #CCCCCC;background-color:#FFFFFF;padding:10px;color:#383838;font-size:12px"> + {reply}<br /><br /> + <span style="color:red;font-weight:bold">Attention, vous ne devez pas répondre à ce message en utilisant votre logiciel de messagerie</span>, nous ne recevrons pas votre message. + Pour répondre, merci d'utiliser exclusivement le lien suivant : <a href="{link}">{link}</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/reply_msg.txt b/mails/fr/reply_msg.txt new file mode 100644 index 000000000..e69de29bb diff --git a/mails/fr/shipped.html b/mails/fr/shipped.html new file mode 100644 index 000000000..f6305f948 --- /dev/null +++ b/mails/fr/shipped.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>Votre commande vient d'&ecirc;tre exp&eacute;di&eacute;e.</b><br />Vous recevrez prochainement un lien vous permettant le suivi de votre colis. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous pouvez acc&eacute;der au suivi de votre commande et t&eacute;l&eacute;charger votre facture dans <a href="{shop_url}history.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Historique des commandes"</a> de la rubrique <a href="{shop_url}my-account.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Mon compte"</a> sur notre site. + </td> + </tr> + <tr> + <td align="left"> + Si vous avez un compte invité, vous pouvez suivre votre commande dans la section <a href="{shop_url}guest-tracking.php" style="color:#DB3484; font-weight:bold; text-decoration:none;">"Suivi invité"</a> de notre site. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/shipped.txt b/mails/fr/shipped.txt new file mode 100644 index 000000000..5e2fa57b5 --- /dev/null +++ b/mails/fr/shipped.txt @@ -0,0 +1,14 @@ +Bonjour {firstname} {lastname}, + +Votre commande {id_order} vient d'être expédiée. + +Vous recevrez prochainement un lien vous permettant le suivi de votre colis. + +Vous pouvez accéder à tout moment au suivi de votre commande dans "Historique de mes commandes" de la rubrique "Mon compte" sur notre site. +Si vous avez un compte invité, vous pouvez suivre votre commande à cette adresse: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/fr/test.html b/mails/fr/test.html new file mode 100644 index 000000000..93be9e997 --- /dev/null +++ b/mails/fr/test.html @@ -0,0 +1,23 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mail de test</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td> + Bonjour,<br><br> + Voici un <b>mail de test</b> de votre boutique. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + G&eacute;n&eacute;r&eacute; par <a href="http://www.prestashop.com" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/mails/fr/test.txt b/mails/fr/test.txt new file mode 100644 index 000000000..2f3d09334 --- /dev/null +++ b/mails/fr/test.txt @@ -0,0 +1,3 @@ + Bonjour, + + Voici un mail de test de votre boutique PrestaShop™. \ No newline at end of file diff --git a/mails/fr/voucher.html b/mails/fr/voucher.html new file mode 100644 index 000000000..2b7eaf92a --- /dev/null +++ b/mails/fr/voucher.html @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Historique de votre commande n&#176;{id_order}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Nous vous informons de la g&eacute;n&eacute;ration d'un bon de r&eacute;duction &agrave; votre nom relatif &agrave; votre commande n&#176;{id_order}. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Voici le num&eacute;ro de votre bon de r&eacute;duction : <b>{voucher_num}</b>, d'un montant total de <b>{voucher_amount}</b>.<br /> + Copiez-collez ce num&eacute;ro dans le panier de votre prochain achat avant de r&eacute;gler la commande. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/mails/fr/voucher.txt b/mails/fr/voucher.txt new file mode 100644 index 000000000..af77f7cc3 --- /dev/null +++ b/mails/fr/voucher.txt @@ -0,0 +1,13 @@ +Bonjour {firstname} {lastname}, + +Nous vous informons de la génération d'un bon de réduction à votre nom relatif à votre commande n°{id_order}. + +Voici le numéro de votre bon de réduction : {voucher_num}, d'un montant total de {voucher_amount}. +Copiez-collez ce numéro dans le panier de votre prochain achat avant de régler la commande. + +Merci et à bientôt sur {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/mails/index.php b/mails/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/mails/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/mails/it/account.html b/mails/it/account.html new file mode 100644 index 000000000..c10f6f881 --- /dev/null +++ b/mails/it/account.html @@ -0,0 +1,52 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">I tuoi dati di login dell&#039;account</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Indirizzo e-mail: <strong><span style="color: #db3484;">{email}</span></strong> <br />Password: <strong>{passwd}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Consigli di sicurezza:</strong> <br /><br />Tieni al sicuro i dati del tuo account. <br />Non far sapere a nessuno i tuoi dati di login. <br />Cambia regolarmente la tua password. <br />Se sospetti che qualcuno stia utilizzando illegalmente il tuoaccount, avvertici immediatamente.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Adesso puoi effettuare ordini nel nostro sito web: <a href="{shop_url}">{shop_name}</a>.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/account.txt b/mails/it/account.txt new file mode 100644 index 000000000..cadcb54f6 --- /dev/null +++ b/mails/it/account.txt @@ -0,0 +1,20 @@ +Salve {firstname} {lastname}, + +Grazie di aver creato un account con {shop_name}. + +I tuoi dati di login dell'account: + +Indirizzo e-mail: {email} +Password: {passwd} + +Adesso puoi effettuare ordini nel nostro sito web: {shop_url} + +Consigli di sicurezza: + +* Tieni al sicuro i dati del tuo account. +* Non far sapere a nessuno i tuoi dati di login. +* Cambia regolarmente la tua password. +* Se sospetti che qualcuno stia utilizzando illegalmente il tuo account, avvertici immediatamente. + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/bankwire.html b/mails/it/bankwire.html new file mode 100644 index 000000000..50762cfd6 --- /dev/null +++ b/mails/it/bankwire.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Il tuo ordine &egrave; stato eseguito con successo, e sar&agrave; inviato appena ricevuto il pagamento.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ricorda che hai scelto di pagare con bonifico bancario. Invia il pagamento a: <br /><br /> <strong>{bankwire_owner}</strong> <br /><br /> {bankwire_details} <br /><br /> {bankwire_address} <br /><br /> Order total amount is {total_paid}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere l&#039;ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account clicando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordine ospite"</a>nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/bankwire.txt b/mails/it/bankwire.txt new file mode 100644 index 000000000..a10230b91 --- /dev/null +++ b/mails/it/bankwire.txt @@ -0,0 +1,23 @@ +Salve {firstname} {lastname}, + +Il tuo ordine n.{id_order} è stato eseguito con successo, e sarà inviato appena ricevuto il pagamento. + +Ricorda che hai scelto di pagare con bonifico bancario. Invia il pagamento a: + +{bankwire_owner} + +{bankwire_details} + +{bankwire_address} + +Importo totale dell'ordine {total_paid} + +Puoi rivedere l'ordine e scaricare la fattura dalla sezione "Cronologia ordini" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + +Grazie di aver acquistato con {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/cheque.html b/mails/it/cheque.html new file mode 100644 index 000000000..6aaac0edf --- /dev/null +++ b/mails/it/cheque.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine {order_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Il tuo ordine &egrave; stato eseguito con successo, e sar&agrave; inviato appena ricevuto il pagamento.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ricorda che hai scelto di pagare con assegno. Invia il pagamento: <br /><br /> - dell&#039;importo di&nbsp;<strong>{total_paid}</strong> <br /><br /> - pagabile all&#039;ordine di&nbsp;<strong>{cheque_name}</strong> <br /><br /> - inviato a&nbsp;<strong>{cheque_address_html}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere l&#039;ordine e scaricare la fattura dalla sezione<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordine ospite"</a> del nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/cheque.txt b/mails/it/cheque.txt new file mode 100644 index 000000000..9d13ab286 --- /dev/null +++ b/mails/it/cheque.txt @@ -0,0 +1,22 @@ +Salve {firstname} {lastname}, + +Il tuo ordine {order_name} è stato eseguito con successo, e sarà inviato appena ricevuto il pagamento. + +Ricorda che hai scelto di pagare con assegno. Invia il pagamento: + +- dell'importo di {total_paid} + +- pagabile all'ordine di {cheque_name} + +- inviato a {cheque_address} + +Puoi rivedere l'ordine e scaricare la fattura dalla sezione "Cronologia ordini" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + +Grazie di aver acquistato con {shop_name}. + + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/contact.html b/mails/it/contact.html new file mode 100644 index 000000000..f11847d9a --- /dev/null +++ b/mails/it/contact.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Messaggio dal tuo negozio {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Indirizzo e-mail: <a href="mailto:{email}"><strong>{email}</strong></a> <br /><br /> Messaggio: {message}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/contact.txt b/mails/it/contact.txt new file mode 100644 index 000000000..e25c90dd4 --- /dev/null +++ b/mails/it/contact.txt @@ -0,0 +1,11 @@ +Hai ricevuto un messaggio da un cliente tramite il tuo negozio: {shop_name} + +Dettagli del messaggio: + +Indirizzo e-mail: {email} + +Messaggio: + +{message} + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/contact_form.html b/mails/it/contact_form.html new file mode 100644 index 000000000..8edefaa02 --- /dev/null +++ b/mails/it/contact_form.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Il tuo messaggio &egrave; stato correttamente inviato al nostro Servizio Clienti.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Il tuo messaggio: {message}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Risponderemo quanto prima.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/contact_form.txt b/mails/it/contact_form.txt new file mode 100644 index 000000000..f88be8d4b --- /dev/null +++ b/mails/it/contact_form.txt @@ -0,0 +1,12 @@ +Il tuo messaggio è stato correttamente inviato al nostro Servizio Clienti. + +Il tuo messaggio: + +{message} + + +Risponderemo quanto prima. + +Cordialmente, + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/credit_slip.html b/mails/it/credit_slip.html new file mode 100644 index 000000000..88fce83c3 --- /dev/null +++ b/mails/it/credit_slip.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Vogliamo informarti della creazione di una nota di credito a tuo nome dell&#039;ordine n.{id_order}.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questa nota di credito e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}order-follow.php">"Controllo ordini"</a>del tuo&nbsp;account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/credit_slip.txt b/mails/it/credit_slip.txt new file mode 100644 index 000000000..29dc1719f --- /dev/null +++ b/mails/it/credit_slip.txt @@ -0,0 +1,12 @@ +Salve {firstname} {lastname}, + +Vogliamo informarti della creazione di una nota di credito a tuo nome dell'ordine n.{id_order}. + +Puoi rivedere questa nota di credito e scaricare la fattura dalla sezione "Controllo ordini" del tuo account cliccando su "Il mio account" nel nostro sito web. + +Grazie di aver acquistato con {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/download-product.tpl b/mails/it/download-product.tpl new file mode 100644 index 000000000..e3ceccc3a --- /dev/null +++ b/mails/it/download-product.tpl @@ -0,0 +1,13 @@ +<ul> +{foreach from=$virtualProducts item=product} + <li> + <a href="{$product.link}">{$product.name}</a> + {if isset($product.deadline)} + expires on {$product.deadline} + {/if} + {if isset($product.downloadable)} + downloadable {$product.downloadable} times + {/if} + </li> +{/foreach} +</ul> \ No newline at end of file diff --git a/mails/it/download_product.html b/mails/it/download_product.html new file mode 100644 index 000000000..5f37a0c00 --- /dev/null +++ b/mails/it/download_product.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>, grazie di aver acquistato con&nbsp;<strong>{shop_name}</strong>.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Prodotto/i da scaricare</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Hai {nbProducts} prodotto/i da scaricare.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Qui di seguito trovarai i link per questi prodotti: {virtualProducts}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a>del nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/download_product.txt b/mails/it/download_product.txt new file mode 100644 index 000000000..ef81507ef --- /dev/null +++ b/mails/it/download_product.txt @@ -0,0 +1,11 @@ +{firstname} {lastname}, grazie del tuo ordine su {shop_name}! + +Hai {nbProducts} prodotto/i da scaricare. + +Qui di seguito troverai i link per questi prodotti: +{virtualProducts} + +Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordini" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/employee_password.html b/mails/it/employee_password.html new file mode 100644 index 000000000..2cc7d7e0e --- /dev/null +++ b/mails/it/employee_password.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">I tuoi dati personali di login</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Nome</strong>: {firstname}<br /> <strong>Cognome</strong>: {lastname}<br /> <strong>Password</strong>: {passwd}<br /> <strong>Indirizzo e-mail</strong>: {email}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/employee_password.txt b/mails/it/employee_password.txt new file mode 100644 index 000000000..7627048fb --- /dev/null +++ b/mails/it/employee_password.txt @@ -0,0 +1,14 @@ +Salve {firstname} {lastname}, + +I dati personali di login del tuo negozio {shop_name}: + +* Nome: {firstname} +* Cognome: {lastname} +* Password: {passwd} +* Indirizzo e-mail: {email} + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/forward_msg.html b/mails/it/forward_msg.html new file mode 100644 index 000000000..00bde893e --- /dev/null +++ b/mails/it/forward_msg.html @@ -0,0 +1,16 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td style="border: 1px solid #CCCCCC; background-color: #ffffff; padding: 10px; color: #383838; font-size: 12px;">{employee} desidera inviarti questa chat. <br /><br /> {messages} <br /><br /> {employee} ha aggiunto "{comment}".</td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/forward_msg.txt b/mails/it/forward_msg.txt new file mode 100644 index 000000000..041546841 --- /dev/null +++ b/mails/it/forward_msg.txt @@ -0,0 +1,4 @@ +{employee} desidera inviarti questa chat. +Commento: {comment} + +{messages} diff --git a/mails/it/guest_to_customer.html b/mails/it/guest_to_customer.html new file mode 100644 index 000000000..57e41377b --- /dev/null +++ b/mails/it/guest_to_customer.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Il tuo account ospite &egrave; stato trasformato in account cliente</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Indirizzo e-mail:</strong> {email}<br /> <strong>Password:</strong> {passwd}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Fai attenzione a non condividere con altri i tuoi dati di login. <br /><br />Puoi accedere al tuo account nel nostro sito web: {shop_url}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/guest_to_customer.txt b/mails/it/guest_to_customer.txt new file mode 100644 index 000000000..1def939df --- /dev/null +++ b/mails/it/guest_to_customer.txt @@ -0,0 +1,15 @@ + Salve {firstname} {lastname}, + + Il tuo account ospite è stato trasformato in account cliente: + + Indirizzo e-mail: {email} + Password: {passwd} + + + Puoi accedere al tuo account nel nostro sito web: {shop_url} + + Fai attenzione a non condividere con altri i tuoi dati di login. + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/in_transit.html b/mails/it/in_transit.html new file mode 100644 index 000000000..f7d7eedd0 --- /dev/null +++ b/mails/it/in_transit.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il tuo ordine &egrave; attualmente in viaggio.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi controllare la posizione del tuo pacco cliccando nel link seguente: <a href="{followup}">{followup}</a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite</a>" del nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/in_transit.txt b/mails/it/in_transit.txt new file mode 100644 index 000000000..f2fe423c1 --- /dev/null +++ b/mails/it/in_transit.txt @@ -0,0 +1,16 @@ +Salve {firstname} {lastname}, + +Il tuo ordine è attualmente in viaggio. + +Puoi controllare la posizione del tuo pacco cliccando nel link seguente: {followup} + +Puoi anche rivedere questo ordine e scaricare la tua fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire l'ordine in questa pagina: {shop_url}guest-tracking.php + +Grazie per aver acquistato con {shop_name}! + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/index.php b/mails/it/index.php new file mode 100644 index 000000000..ab85ebaf4 --- /dev/null +++ b/mails/it/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/mails/it/lang.php b/mails/it/lang.php new file mode 100644 index 000000000..16411c328 --- /dev/null +++ b/mails/it/lang.php @@ -0,0 +1,39 @@ +<?php + +global $_LANGMAIL; +$_LANGMAIL = array(); +$_LANGMAIL['Welcome!'] = 'Benvenuti!'; +$_LANGMAIL['Message from contact form'] = 'Messaggio da modulo di contatto'; +$_LANGMAIL['Your message has been correctly sent'] = 'Il tuo messaggio è stato inviato correttamente'; +$_LANGMAIL['New credit slip regarding your order'] = 'Nuova nota di credito riguardo al tuo ordine'; +$_LANGMAIL['Virtual product to download'] = 'Prodotto virtuale da scaricare'; +$_LANGMAIL['Fwd: Customer message'] = 'Messaggio cliente'; +$_LANGMAIL['Your guest account has been transformed to customer account'] = 'Il tuo account ospite è stato trasformato in account cliente'; +$_LANGMAIL['Package in transit'] = 'Pacco in viaggio'; +$_LANGMAIL['[Log'] = '[Log'; +$_LANGMAIL['Order confirmation'] = 'Conferma ordine'; +$_LANGMAIL['Message from a customer'] = 'Messaggio da un cliente'; +$_LANGMAIL['New message regarding your order'] = 'Nuovo messaggio riguardo al tuo ordine'; +$_LANGMAIL['Your order return state has changed'] = 'Nuovo status dell\'ordine'; +$_LANGMAIL['Your password'] = 'La tua password'; +$_LANGMAIL['Password query confirmation'] = 'Conferma richiesta password'; +$_LANGMAIL['An answer to your message is available'] = 'E\' disponibile una risposta al tuo messaggio'; +$_LANGMAIL['New voucher regarding your order'] = 'Nuovo buono sconto riguardo al tuo ordine'; +$_LANGMAIL['Happy birthday!'] = 'Buon compleanno!'; +$_LANGMAIL['Newsletter confirmation'] = 'Conferma newsletter'; +$_LANGMAIL['Newsletter voucher'] = 'Buono sconto newsletter'; +$_LANGMAIL['Your wishlist\\\'s link'] = 'Il tuo collegamento alla lista dei desideri'; +$_LANGMAIL['Message from '] = 'Messaggio da'; +$_LANGMAIL['Your cart and your discount'] = 'Il tuo carrello e il tuo sconto'; +$_LANGMAIL['Thanks for your order'] = 'Grazie dell\'ordine'; +$_LANGMAIL['You are one of our best customers'] = 'Sei uno dei nostri clienti migliori'; +$_LANGMAIL['We miss you'] = 'Ci manchi'; +$_LANGMAIL['Product available'] = 'Prodotto disponibile'; +$_LANGMAIL['Product out of stock'] = 'Prodotto esaurito'; +$_LANGMAIL['Error reporting from your PayPal module'] = 'Errore dal tuo modulo PayPal'; +$_LANGMAIL['Congratulations!'] = 'Congratulazioni!'; +$_LANGMAIL['Referral Program'] = 'Programma di presentazione'; +$_LANGMAIL['A friend sent you a link to'] = 'Un amico ti ha inviato un link per'; +$_LANGMAIL[' $subject'] = 'Oggetto'; + +?> \ No newline at end of file diff --git a/mails/it/log_alert.html b/mails/it/log_alert.html new file mode 100755 index 000000000..fc597551a --- /dev/null +++ b/mails/it/log_alert.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nuovo messaggio di avviso</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Purtroppo &egrave; stato registrato un nuovo messaggio di avviso.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi controllarlo nel tuo Back office &gt; Strumenti&gt; Log del nostro sito.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/log_alert.txt b/mails/it/log_alert.txt new file mode 100755 index 000000000..2a64e2cb6 --- /dev/null +++ b/mails/it/log_alert.txt @@ -0,0 +1,11 @@ +Salve, + +Nuovo messaggio di avviso + +Purtroppo è stato registrato un nuovo messaggio di avviso. + +Puoi controllarlo nel tuo Back office > Strumenti > Log del nostro sito. + +{shop_name} - {shop_url} + +{shop_url} powered by PrestaShop™ diff --git a/mails/it/newsletter.html b/mails/it/newsletter.html new file mode 100644 index 000000000..dd3a7af46 --- /dev/null +++ b/mails/it/newsletter.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Newsletter da {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">{message}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/newsletter.txt b/mails/it/newsletter.txt new file mode 100644 index 000000000..a43a26877 --- /dev/null +++ b/mails/it/newsletter.txt @@ -0,0 +1,9 @@ +Newsletter da {shop_name} + +Messaggio + +{message} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/order_canceled.html b/mails/it/order_canceled.html new file mode 100644 index 000000000..7fd79bfda --- /dev/null +++ b/mails/it/order_canceled.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Riguardo al tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il tuo ordine &egrave; stato cancellato.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a> nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/order_canceled.txt b/mails/it/order_canceled.txt new file mode 100644 index 000000000..ab1d12387 --- /dev/null +++ b/mails/it/order_canceled.txt @@ -0,0 +1,14 @@ +Salve {firstname} {lastname}, + +Riguardo al tuo ordine n.{id_order}: + +Il tuo ordine è stato cancellato. + +Puoi rivedere questo ordine e scaricare la tua fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire l'ordine in questa pagina: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/order_conf.html b/mails/it/order_conf.html new file mode 100644 index 000000000..d565e4751 --- /dev/null +++ b/mails/it/order_conf.html @@ -0,0 +1,120 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>, grazie di aver acquistato con&nbsp;<strong>{shop_name}</strong>.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Dati dell&#039;ordine</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ordine: <strong><span style="color: #db3484;">{order_name}</span> effettuato il {date}</strong> <br />Pagamento: <strong>{payment}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">{products} {discounts} +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<!-- Title --> +<tbody> +<tr style="background-color: #b9babe; text-align: center;"> +<th style="width: 15%; padding: 0.6em 0;">Riferimento</th> <th style="width: 35%; padding: 0.6em 0;">Prodotto</th> <th style="width: 15%; padding: 0.6em 0;">Prezzo unitario</th> <th style="width: 15%; padding: 0.6em 0;">Quantit&agrave;</th> <th style="width: 20%; padding: 0.6em 0;">Prezzo totale</th> +</tr> +<!-- Products --><!-- Footer: prices --> +<tr style="text-align: right;"> +<td></td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;" colspan="3">Prodotti</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;">{total_products}</td> +</tr> +<tr style="text-align: right;"> +<td></td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="3">Sconti</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_discounts}</td> +</tr> +<tr style="text-align: right;"> +<td></td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="3">Carta regalo</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_wrapping}</td> +</tr> +<tr style="text-align: right;"> +<td></td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;" colspan="3">Spedizione</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;">{total_shipping}</td> +</tr> +<tr style="text-align: right; font-weight: bold;"> +<td></td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;" colspan="3">Totale pagato</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;">{total_paid}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Spedizione</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Mezzo di spedizione:&nbsp;<strong>{carrier}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td> +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-transform: uppercase;"> +<th style="text-align: left; padding: 0.3em 1em;">INDIRIZZO DI CONSEGNA</th> <th style="text-align: left; padding: 0.3em 1em;">INDIRIZZO DI FATTURAZIONE</th> +</tr> +<tr> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{delivery_company} <br /><span style="color: #db3484; font-weight: bold;">{delivery_firstname} {delivery_lastname}</span> <br />{delivery_address1} <br />{delivery_address2} <br />{delivery_city} {delivery_postal_code} <br />{delivery_country} {delivery_state} <br />{delivery_phone} <br />{delivery_other}</td> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{invoice_company} <br />{invoice_vat_number} <br /><span style="color: #db3484; font-weight: bold;">{invoice_firstname} {invoice_lastname}</span> <br />{invoice_address1} <br />{invoice_address2} <br />{invoice_city} {invoice_postal_code} <br />{invoice_country} {invoice_state} <br />{invoice_phone} <br />{invoice_other}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere l&#039;ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a> del nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/order_conf.txt b/mails/it/order_conf.txt new file mode 100644 index 000000000..d7f60dded --- /dev/null +++ b/mails/it/order_conf.txt @@ -0,0 +1,43 @@ +Salve {firstname} {lastname}, grazie del tuo ordine su {shop_name}! + +Dettagli dell'ordine + + Ordine: {order_name} eseguito il {date} + Pagamento: {payment} + + Prodotti: {total_products} + Sconti: {total_discounts} + Spedizione: {total_shipping} + Carta regalo: {total_wrapping} + Totale: {total_paid} + + +Spedizione + + Mezzo di spedizione: {carrier} + + Indirizzo di consegna: + + {delivery_company} + {delivery_firstname} {delivery_lastname} + {delivery_address1} + {delivery_address2} + {delivery_postal_code} {delivery_city} + {delivery_country} {delivery_state} + {delivery_other} + + Indirizzo di fatturazione: + + {invoice_company} + {invoice_vat_number} + {invoice_firstname} {invoice_lastname} + {invoice_address1} + {invoice_address2} + {invoice_postal_code} {invoice_city} + {invoice_country} {invoice_state} + {invoice_other} + +Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + +{shop_url} powered by PrestaShop™ diff --git a/mails/it/order_customer_comment.html b/mails/it/order_customer_comment.html new file mode 100644 index 000000000..4d49163e4 --- /dev/null +++ b/mails/it/order_customer_comment.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da un cliente da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Hi,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Messaggio da {firstname} {lastname} ({email})</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Hai ricevuto un nuovo messaggio riguardo all&#039;ordine n.{id_order}:</strong> <br /><br /> {message}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/order_customer_comment.txt b/mails/it/order_customer_comment.txt new file mode 100644 index 000000000..088096d7b --- /dev/null +++ b/mails/it/order_customer_comment.txt @@ -0,0 +1,8 @@ +Salve {firstname} {lastname}, + +Hai ricevuto un nuovo messaggio riguardo all'ordine n.{id_order}: + +{message} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/order_merchant_comment.html b/mails/it/order_merchant_comment.html new file mode 100644 index 000000000..900690f28 --- /dev/null +++ b/mails/it/order_merchant_comment.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Messaggio da {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Hai ricevuto un nuovo messaggio riguardante l&#039;ordine n.{id_order}:</strong> <br /><br /> {message}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/order_merchant_comment.txt b/mails/it/order_merchant_comment.txt new file mode 100644 index 000000000..85a017b59 --- /dev/null +++ b/mails/it/order_merchant_comment.txt @@ -0,0 +1,10 @@ +Messaggio da {shop_name} + +Salve {firstname} {lastname}, + +Hai ricevuto un nuovo messaggio riguardo all'ordine n.{id_order}: +{message} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/order_return_state.html b/mails/it/order_return_state.html new file mode 100644 index 000000000..2a2ce5cba --- /dev/null +++ b/mails/it/order_return_state.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Cronologia della restituzione dell&#039;ordine n.{id_order_return}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il tuo buono di restituzione &egrave; cambiato in "{state_order_return}".</strong></td> +</tr> +<tr> +<td><br /></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/order_return_state.txt b/mails/it/order_return_state.txt new file mode 100644 index 000000000..acda21587 --- /dev/null +++ b/mails/it/order_return_state.txt @@ -0,0 +1,11 @@ +Salve {firstname} {lastname}, + +La cronologia del tuo buono di restituzione n.{id_order_return} è cambiata in "{state_order_return}". + +Puoi rivedere questa restituzione dell'ordine nella sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/outofstock.html b/mails/it/outofstock.html new file mode 100644 index 000000000..cb48a1b44 --- /dev/null +++ b/mails/it/outofstock.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine n. id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Purtroppo, uno o pi&ugrave; articoli del tuo ordine n.{id_order} sono al momento esauriti. Questo pu&ograve; provocare un leggero ritardo nella consegna. Ti preghiamo di scusarci e ti assicuriamo che stiamo facendo di tutto per risolvere il problema.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura nella sezione <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a> nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/outofstock.txt b/mails/it/outofstock.txt new file mode 100644 index 000000000..95cb3ccde --- /dev/null +++ b/mails/it/outofstock.txt @@ -0,0 +1,14 @@ + Salve {firstname} {lastname}, + + La cronologia del tuo ordine n.{id_order} + +Purtroppo, uno o più articoli del tuo ordine n.{id_order} sono al momento esauriti. Questo può provocare un leggero ritardo nella consegna. Ti preghiamo di scusarci e ti assicuriamo che stiamo facendo di tutto per risolvere il problema. + +Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/password.html b/mails/it/password.html new file mode 100644 index 000000000..7ec4ece86 --- /dev/null +++ b/mails/it/password.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messagio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">I tuoi nuovi dati di login</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong><strong>Indirizzo e-mail:</strong> {email}<br /> <strong>Password:</strong> {passwd} </strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Fai attenzione a non condividere con nessuno i tuoi dati di login. <br /><br />Adesso puoi effettuare un ordine nel nostro sito web: {shop_url}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/password.txt b/mails/it/password.txt new file mode 100644 index 000000000..36652f721 --- /dev/null +++ b/mails/it/password.txt @@ -0,0 +1,12 @@ +Salve {firstname} {lastname}, + +I tuoi nuovi dati di login: + +Indirizzo e-mail address: {email} +Password: {passwd} + +Adesso puoi effettuare un ordine nel nostro sito web: {shop_url} + +Fai attenzione a non condividere con nessuno questi dati di login. + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/password_query.html b/mails/it/password_query.html new file mode 100644 index 000000000..10bda20c1 --- /dev/null +++ b/mails/it/password_query.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Hai chiesto di restituire i tuoi codici di accesso di {shop_name},<br /> Nota che questo far&agrave; cambiare la tua password attuale.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Se davvero vuoi farlo, clicca nel link seguente:<br /> <a href="{url}">{url}</a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> realised by <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/password_query.txt b/mails/it/password_query.txt new file mode 100644 index 000000000..3f468f21f --- /dev/null +++ b/mails/it/password_query.txt @@ -0,0 +1,9 @@ +Salve {firstname} {lastname}, + +Hai chiesto di restituire i tuoi codici di accesso di {shop_name}. +Nota che questo farà cambiare la tua password attuale. + +Se vuoi davvero farlo, clicca nel link seguente : +{url} + +{shop_url} powered by PrestaShop™ diff --git a/mails/it/payment.html b/mails/it/payment.html new file mode 100644 index 000000000..a31204739 --- /dev/null +++ b/mails/it/payment.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il pagamento per il tuo ordine &egrave; stato elaborato.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/payment.txt b/mails/it/payment.txt new file mode 100644 index 000000000..8b8cd4762 --- /dev/null +++ b/mails/it/payment.txt @@ -0,0 +1,13 @@ + Salve {firstname} {lastname}, + + La tua cronologia dell'ordine n.{id_order} + + Il pagamento per il tuo ordine è stato elaborato. + + Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. + + {shop_name} - {shop_url} + + Grazie di aver acquistato con {shop_name}. + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/payment_error.html b/mails/it/payment_error.html new file mode 100644 index 000000000..ba4646c98 --- /dev/null +++ b/mails/it/payment_error.html @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">La cronologia del tuo ordine n. id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Si &egrave; verificato un problema con il tuo pagamento dell&#039;ordine n.{id_order}. Contattaci appena puoi.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il tuo ordine non sar&agrave; inviato fino a che non avremo risolto il problema.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a> del nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/payment_error.txt b/mails/it/payment_error.txt new file mode 100644 index 000000000..24bbb70cb --- /dev/null +++ b/mails/it/payment_error.txt @@ -0,0 +1,14 @@ +Salve {firstname} {lastname}, + +Si è verificato un problema con il tuo pagamento dell'ordine n.{id_order}. Contattaci appena puoi. + +Il tuo ordine non sarà inviato fino a che non avremo risolto il problema. + +Puoi rivedere questo ordine e scaricare la tua fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. +Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/preparation.html b/mails/it/preparation.html new file mode 100644 index 000000000..b1511cc9d --- /dev/null +++ b/mails/it/preparation.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Stiamo elaborando il tuo ordine.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione <a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite</a>del nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/preparation.txt b/mails/it/preparation.txt new file mode 100644 index 000000000..f29a1b0e6 --- /dev/null +++ b/mails/it/preparation.txt @@ -0,0 +1,14 @@ + Salve {firstname} {lastname}, + + La cronologia del tuo ordine n.{id_order} + + Stiamo elaborando il tuo ordine. + + Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. + Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/refund.html b/mails/it/refund.html new file mode 100644 index 000000000..3d01545c0 --- /dev/null +++ b/mails/it/refund.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il pagamento del tuo ordine &egrave; stato rimborsato.</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a> nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/refund.txt b/mails/it/refund.txt new file mode 100644 index 000000000..8a5a5aeec --- /dev/null +++ b/mails/it/refund.txt @@ -0,0 +1,12 @@ + Salve {firstname} {lastname}, + + Il pagamento del tuo ordine è stato rimborsato. + + Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. + Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + + {shop_name} - {shop_url} + + + + {shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/reply_msg.html b/mails/it/reply_msg.html new file mode 100644 index 000000000..2a5a8bfd1 --- /dev/null +++ b/mails/it/reply_msg.html @@ -0,0 +1,16 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td style="border: 1px solid #CCCCCC; background-color: #ffffff; padding: 10px; color: #383838; font-size: 12px;">{reply}<br /><br /> <span style="color: red; font-weight: bold;">Non rispondere a questo messaggio usando la tua mail cliente</span>, il tuo messaggio non ci arriverebbe.<br />Per rispondere, usa esclusivamente il link seguente: <a href="{link}">{link}</a>.</td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/reply_msg.txt b/mails/it/reply_msg.txt new file mode 100644 index 000000000..66066d5c1 --- /dev/null +++ b/mails/it/reply_msg.txt @@ -0,0 +1,4 @@ +{reply} + +Non rispondere a questo messaggio usando la tua e-mail cliente, il tuo messaggio non ci arriverebbe. +Per rispondere, usa esclusivamente il link seguente: {link} diff --git a/mails/it/shipped.html b/mails/it/shipped.html new file mode 100644 index 000000000..8a749a03b --- /dev/null +++ b/mails/it/shipped.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>Il tuo ordine &egrave; stato spedito.</strong><br />Riceverai presto un URL su cui cliccare per rintracciare i progressi di consegna del tuo pacco.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Puoi rivedere questo ordine e scaricare la fattura dalla sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}history.php">"Cronologia ordine"</a> del tuo account cliccando su&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}my-account.php">"Il mio account"</a> nel nostro sito web.</td> +</tr> +<tr> +<td align="left">Se hai un account ospite, puoi seguire il tuo ordine nella sezione&nbsp;<a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}guest-tracking.php">"Controllo ordini ospite"</a>nel nostro sito web.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/shipped.txt b/mails/it/shipped.txt new file mode 100644 index 000000000..b44cdce82 --- /dev/null +++ b/mails/it/shipped.txt @@ -0,0 +1,16 @@ +Salve {firstname} {lastname}, + +Il tuo ordine è stato appena spedito. + +Riceverai presto un URL su cui cliccare per rintracciare i progressi di consegna del tuo pacco. + +Puoi rivedere questo ordine e scaricare la fattura dalla sezione "Cronologia ordine" del tuo account cliccando su "Il mio account" nel nostro sito web. + Se hai un account ospite, puoi seguire il tuo ordine in questa pagina: {shop_url}guest-tracking.php + +Grazie di aver acquistato con {shop_name}! + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/mails/it/test.html b/mails/it/test.html new file mode 100644 index 000000000..df1cf803e --- /dev/null +++ b/mails/it/test.html @@ -0,0 +1,22 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mail di prova</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td>Salve,<br /><br />Questa &egrave; una&nbsp;<strong>mail di prova</strong> da parte del tuo negozio.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center">powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/test.txt b/mails/it/test.txt new file mode 100644 index 000000000..ad38277f0 --- /dev/null +++ b/mails/it/test.txt @@ -0,0 +1,3 @@ + Salve, + + Questa è una mail di prova da parte del tuo negozio online PrestaShop™. \ No newline at end of file diff --git a/mails/it/voucher.html b/mails/it/voucher.html new file mode 100644 index 000000000..b45aa920f --- /dev/null +++ b/mails/it/voucher.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Cronologia del tuo ordine n.{id_order}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Vorremmo informarti della creazione di un buono sconto a tuo nome in seguito al tuo ordine n.{id_order}.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ecco il codice del tuo buono:<strong>{voucher_num}</strong>, per l&#039;importo di <strong>{voucher_amount}</strong>.<br />Basta che durante il processo di pagamento del prossimo ordine tu copi/incolli questo codice.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/mails/it/voucher.txt b/mails/it/voucher.txt new file mode 100644 index 000000000..f9e6abad9 --- /dev/null +++ b/mails/it/voucher.txt @@ -0,0 +1,14 @@ +Salve {firstname} {lastname}, + +Vorremmo informarti della creazione di un buono sconto a tuo nome in seguito al tuo ordine n.{id_order}. + +Ecco il codice del tuo buono: {voucher_num}, per l'importo di {voucher_amount}. + +Basta che durante il processo di pagamento del prossimo ordine tu copi/incolli questo codice. + +Grazie di aver acquistato a {shop_name}. + +{shop_name} - {shop_url} + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/manufacturer.php b/manufacturer.php new file mode 100644 index 000000000..590e2af21 --- /dev/null +++ b/manufacturer.php @@ -0,0 +1,35 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Open Software License (OSL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/osl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require(dirname(__FILE__).'/config/config.inc.php'); +Tools::displayFileAsDeprecated(); + +// init front controller in order to use Tools::redirect +$controller = new FrontController(); +$controller->init(); + +Tools::redirect('index.php?controller=manufacturer'.(($_SERVER['QUERY_STRING']) ? '&'.$_SERVER['QUERY_STRING'] : '')); \ No newline at end of file diff --git a/modules/.htaccess b/modules/.htaccess new file mode 100644 index 000000000..7c78adc17 --- /dev/null +++ b/modules/.htaccess @@ -0,0 +1,3 @@ +<FilesMatch "(?i)^.*\.tpl$"> +Deny from all +</FilesMatch> diff --git a/modules/authorizeaim/authorizeaim.php b/modules/authorizeaim/authorizeaim.php new file mode 100755 index 000000000..a2f8cf483 --- /dev/null +++ b/modules/authorizeaim/authorizeaim.php @@ -0,0 +1,178 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class authorizeAIM extends PaymentModule +{ + public function __construct() + { + $this->name = 'authorizeaim'; + $this->tab = 'payments_gateways'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->limited_countries = array('us'); + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = 'Authorize.net AIM (Advanced Integration Method)'; + $this->description = $this->l('Receive payment with Authorize.net'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('orderConfirmation') AND $this->registerHook('payment') AND Configuration::updateValue('AUTHORIZE_AIM_DEMO', 1)); + } + + public function uninstall() + { + Configuration::deleteByName('AUTHORIZE_AIM_LOGIN_ID'); + Configuration::deleteByName('AUTHORIZE_AIM_KEY'); + Configuration::deleteByName('AUTHORIZE_AIM_DEMO'); + Configuration::deleteByName('AUTHORIZE_AIM_CARD_VISA'); + Configuration::deleteByName('AUTHORIZE_AIM_CARD_MASTERCARD'); + Configuration::deleteByName('AUTHORIZE_AIM_CARD_DISCOVER'); + Configuration::deleteByName('AUTHORIZE_AIM_CARD_AX'); + + return parent::uninstall(); + } + + public function hookOrderConfirmation($params) + { + global $smarty; + + if ($params['objOrder']->module != $this->name) + return; + + if ($params['objOrder']->getCurrentState() != _PS_OS_ERROR_) + $smarty->assign(array('status' => 'ok', 'id_order' => intval($params['objOrder']->id))); + else + $smarty->assign('status', 'failed'); + + return $this->display(__FILE__, 'hookorderconfirmation.tpl'); + } + + public function getContent() + { + if (Tools::isSubmit('submitModule')) + { + Configuration::updateValue('AUTHORIZE_AIM_LOGIN_ID', Tools::getvalue('authorizeaim_login_id')); + Configuration::updateValue('AUTHORIZE_AIM_KEY', Tools::getvalue('authorizeaim_key')); + Configuration::updateValue('AUTHORIZE_AIM_DEMO', Tools::getvalue('authorizeaim_demo_mode')); + Configuration::updateValue('AUTHORIZE_AIM_CARD_VISA', Tools::getvalue('authorizeaim_card_visa')); + Configuration::updateValue('AUTHORIZE_AIM_CARD_MASTERCARD', Tools::getvalue('authorizeaim_card_mastercard')); + Configuration::updateValue('AUTHORIZE_AIM_CARD_DISCOVER', Tools::getvalue('authorizeaim_card_discover')); + Configuration::updateValue('AUTHORIZE_AIM_CARD_AX', Tools::getvalue('authorizeaim_card_ax')); + + echo $this->displayConfirmation($this->l('Configuration updated')); + } + + return ' + <h2>'.$this->displayName.'</h2> + <fieldset><legend><img src="../modules/'.$this->name.'/logo.gif" alt="" /> '.$this->l('Help').'</legend> + <a href="http://www.authorize.net/signupnow/" style="float: right;"><img src="../modules/'.$this->name.'/logo_authorize.png" alt="" /></a> + <h3>'.$this->l('In your PrestaShop admin panel').'</h3> + - '.$this->l('Fill the Login ID field with the one provided by Authorize.net').'<br /> + - '.$this->l('Fill the key field with the transaction key provided by Authorize.net').'<br /> + <span style="color: red;" >- '.$this->l('Warning: Your website must possess a SSL certificate to use the Authorize.net AIM payment system. You are responsible for the safety of your customers\' bank information. PrestaShop cannot be blamed for any security issue on your website.').'</span><br /> + <br /> + </fieldset><br /> + <form action="'.Tools::htmlentitiesutf8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset class="width2"> + <legend><img src="../img/admin/contact.gif" alt="" />'.$this->l('Settings').'</legend> + <label for="authorizeaim_login_id">'.$this->l('Login ID').'</label> + <div class="margin-form"><input type="text" size="20" id="authorizeaim_login_id" name="authorizeaim_login_id" value="'.Configuration::get('AUTHORIZE_AIM_LOGIN_ID').'" /></div> + <label for="authorizeaim_key">'.$this->l('Key').'</label> + <div class="margin-form"><input type="text" size="20" id="authorizeaim_login_id" name="authorizeaim_key" value="'.Configuration::get('AUTHORIZE_AIM_KEY').'" /></div> + <label for="authorizeaim_demo_mode">'.$this->l('Mode:').'</label> + <div class="margin-form" id="authorizeaim_demo"> + <input type="radio" name="authorizeaim_demo_mode" value="0" style="vertical-align: middle;" '.(!Tools::getValue('authorizeaim_demo_mode', Configuration::get('AUTHORIZE_AIM_DEMO')) ? 'checked="checked"' : '').' /> + <span style="color: #080;">'.$this->l('Production').'</span> + <input type="radio" name="authorizeaim_demo_mode" value="1" style="vertical-align: middle;" '.(Tools::getValue('authorizeaim_demo_mode', Configuration::get('AUTHORIZE_AIM_DEMO')) ? 'checked="checked"' : '').' /> + <span style="color: #900;">'.$this->l('Test').'</span> + </div> + <label for="authorizeaim_cards">'.$this->l('Cards:').'</label> + <div class="margin-form" id="authorizeaim_cards"> + <input type="checkbox" name="authorizeaim_card_visa" '.(Configuration::get('AUTHORIZE_AIM_CARD_VISA') ? 'checked="checked"' : '').' /> + <img src="../modules/'.$this->name.'/cards/visa.gif" alt="visa" /> + <input type="checkbox" name="authorizeaim_card_mastercard" '.(Configuration::get('AUTHORIZE_AIM_CARD_MASTERCARD') ? 'checked="checked"' : '').' /> + <img src="../modules/'.$this->name.'/cards/mastercard.gif" alt="visa" /> + <input type="checkbox" name="authorizeaim_card_discover" '.(Configuration::get('AUTHORIZE_AIM_CARD_DISCOVER') ? 'checked="checked"' : '').' /> + <img src="../modules/'.$this->name.'/cards/discover.gif" alt="visa" /> + <input type="checkbox" name="authorizeaim_card_ax" '.(Configuration::get('AUTHORIZE_AIM_CARD_AX') ? 'checked="checked"' : '').' /> + <img src="../modules/'.$this->name.'/cards/ax.gif" alt="visa" /> + </div> + <br /><center><input type="submit" name="submitModule" value="'.$this->l('Update settings').'" class="button" /></center> + </fieldset> + </form>'; + } + + public function hookPayment($params) + { + global $cookie, $smarty; + + if (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off' AND Configuration::get('PS_SSL_ENABLED')) + { + $invoiceAddress = new Address((int)$params['cart']->id_address_invoice); + $customer = new Customer((int)$cookie->id_customer); + + $authorizeAIMParams = array(); + $authorizeAIMParams['x_login'] = Configuration::get('AUTHORIZE_AIM_LOGIN_ID'); + $authorizeAIMParams['x_tran_key'] = Configuration::get('AUTHORIZE_AIM_KEY'); + $authorizeAIMParams['x_version'] = '3.1'; + $authorizeAIMParams['x_delim_data'] = 'TRUE'; + $authorizeAIMParams['x_delim_char'] = '|'; + $authorizeAIMParams['x_relay_response'] = 'FALSE'; + $authorizeAIMParams['x_type'] = 'AUTH_CAPTURE'; + $authorizeAIMParams['x_method'] = 'CC'; + $authorizeAIMParams['x_test_request'] = Configuration::get('AUTHORIZE_AIM_DEMO'); + $authorizeAIMParams['x_invoice_num'] = (int)$params['cart']->id; + $authorizeAIMParams['x_amount'] = number_format($params['cart']->getOrderTotal(true, 3), 2, '.', ''); + $authorizeAIMParams['x_address'] = $invoiceAddress->address1.' '.$invoiceAddress->address2; + $authorizeAIMParams['x_zip'] = $invoiceAddress->postcode; + $authorizeAIMParams['x_first_name'] = $customer->firstname; + $authorizeAIMParams['x_last_name'] = $customer->lastname; + + $isFailed = Tools::getValue('aimerror'); + + $cards = array(); + $cards['visa'] = Configuration::get('AUTHORIZE_AIM_CARD_VISA') == 'on' ? 1 : 0; + $cards['mastercard'] = Configuration::get('AUTHORIZE_AIM_CARD_MASTERCARD') == 'on' ? 1 : 0; + $cards['discover'] = Configuration::get('AUTHORIZE_AIM_CARD_DISCOVER') == 'on' ? 1 : 0; + $cards['ax'] = Configuration::get('AUTHORIZE_AIM_CARD_AX') == 'on' ? 1 : 0; + + $smarty->assign('p', $authorizeAIMParams); + $smarty->assign('cards', $cards); + $smarty->assign('isFailed', $isFailed); + + return $this->display(__FILE__, 'authorizeaim.tpl'); + } + } +} +?> diff --git a/modules/authorizeaim/authorizeaim.tpl b/modules/authorizeaim/authorizeaim.tpl new file mode 100755 index 000000000..41009157c --- /dev/null +++ b/modules/authorizeaim/authorizeaim.tpl @@ -0,0 +1,114 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} +<link rel="shortcut icon" type="image/x-icon" href="{$module_dir}secure.png" /> +<p class="payment_module" > + + {if $isFailed == 1} + <p style="color: red;">{l s='Error, please verify the card information' mod='authorizeaim'}</p> + {/if} + + <form id="aut" name="authorizeaim_form" action="{$module_dir}validation.php" method="post"> + <span style="border: 1px solid #595A5E;display: block;padding: 0.6em;text-decoration: none;margin-left: 0.7em;"> + <a id="click_authorizeaim" href="#" title="{l s='Pay with authorizeaim' mod='authorizeaim'}" style="display: block;text-decoration: none;"> + {if $cards.visa == 1} + <img src="{$module_dir}cards/visa.gif" alt="{l s='visa logo' mod='authorizeaim'}" /> + {/if} + {if $cards.mastercard == 1} + <img src="{$module_dir}cards/mastercard.gif" alt="{l s='mastercard logo' mod='authorizeaim'}" /> + {/if} + {if $cards.discover == 1} + <img src="{$module_dir}cards/discover.gif" alt="{l s='discover logo' mod='authorizeaim'}" /> + {/if} + {if $cards.ax == 1} + <img src="{$module_dir}cards/ax.gif" alt="{l s='american express logo' mod='authorizeaim'}" /> + {/if} + {l s='Secured credit card payment with Authorize.net' mod='authorizeaim'} + </a> + + {if $isFailed == 0} + <div id="aut2"style="display:none"> + {else} + <div id="aut2"> + {/if} + <br /> + + <img src="{$module_dir}logoa.gif" alt="secure payment" style="float: left;margin-top:40px;"/> + {foreach from=$p key=k item=v} + <input type="hidden" name="{$k}" value="{$v}" /> + {/foreach} + + <label style="margin-left: 50px;display: block;width: 85px;float: left;">{l s='Full name' mod='authorizeaim'}</label> <input type="text" name="name" size="20" maxlength="25S" /><img src="{$module_dir}secure.png" alt="" style="margin-left: 5px;" /><br /><br /> + <label style="margin-left: 50px;display: block;width: 85px;float: left;">{l s='Card number' mod='authorizeaim'}</label> <input type="text" id="ccn" name="x_card_num" size="16" maxlength="16" autocomplete="Off"/><img src="{$module_dir}secure.png" alt="" style="margin-left: 5px;" /><br /><br /> + <label style="margin-left: 50px;display: block;width: 85px;float: left;">{l s='Expiration date' mod='authorizeaim'}</label> + <select name="x_exp_date_m" style="width: 40px;">{section name=date_m start=01 loop=13} + <option value="{$smarty.section.date_m.index}">{$smarty.section.date_m.index}</option>{/section} + </select> + / + <select name="x_exp_date_y">{section name=date_y start=11 loop=20} + <option value="{$smarty.section.date_y.index}">20{$smarty.section.date_y.index}</option>{/section} + </select> + <img src="{$module_dir}secure.png" alt="" style="margin-left: 5px;" /><br /><br /> + <label style="margin-left: 186px;display: block;width: 85px;float: left;">{l s='CVV' mod='authorizeaim'}</label> <input type="text" name="x_card_code" size="4" maxlength="4" /><img src="{$module_dir}secure.png" alt="" style="margin-left: 5px;"/> <img src="{$module_dir}help.png" id="cvv_help" title="{l s='the 3 last digits on the back of your credit card' mod='authorizeaim'}" alt="" /><br /><br /> + <img src="{$module_dir}cvv.png" id="cvv_help_img" alt=""style="display: none;margin-left: 211px;" /> + <input type="button" id="asubmit" value="{l s='Validate order' mod='authorizeaim'}" style="margin-left: 236px;" class="button"/> + </div> + </span> + </form> +</p> +<script type="text/javascript"> + var mess_error = "{l s='Your card number is false' mod='authorizeaim' js=1}"; + {literal} + $(document).ready(function(){ + $('#click_authorizeaim').click(function(e){ + e.preventDefault(); + $('#click_authorizeaim').fadeOut("fast",function(){ + $("#aut2").show(); + $('#click_authorizeaim').fadeIn('fast'); + }); + $('#click_authorizeaim').unbind(); + $('#click_authorizeaim').click(function(e){ + e.preventDefault(); + }); + }); + + $('#cvv_help').click(function(){ + $("#cvv_help_img").show(); + $('#cvv_help').unbind(); + }); + + $('#asubmit').click(function(){ + if ($('#ccn').val() < 13) + { + alert(mess_error); + } + else + { + $('#aut').submit(); + } + }); + }); + {/literal} +</script> diff --git a/modules/authorizeaim/cards/ax.gif b/modules/authorizeaim/cards/ax.gif new file mode 100755 index 0000000000000000000000000000000000000000..b39ff9cd77f687d4f5006eff79de61ba882f5b92 GIT binary patch literal 560 zcmV-00?++NNk%w1VJ`q40OJh+3S4;?WPeLua&~rnXp*U#n3|QYy}H88(b3Y|+}`Eo z=IiV1`1bYx|NsC0|NsC0A^8LW3IGoPEC2ui051R@000F3urVg5tv2h;cU?#bh6#y) z3X&$PiIi+oo?)ua$ug?rimHlS&~{UWUOC`v7X&SEwp5UzU?dm|g)Vr_VslrR=oqBc zW={lz0BF14@Hl_~Lm!2+B8?E}`~QG}0Rk@~c~2-zFbaHvj)8<@H6T|<CpIySkDG%B zX<&DWI9Vr}oQ?tqF=S6kHDxbBrl*i6qc~JDp;EK7f2k})u{w7O#%Kh|$pOmE&dmU+ zBszJnmMmEb1P8_k2L=bp1_TBMjNuCg3kT6Wu%R->TU;-E;e6xD%mfVq<$P>_VavkB znx#A73<OA*Am6rR2?BTv5X3;V0|&2BF~+f@f^gpDLVgpOP@%|n9y<~{D1*hCKOxD5 zoLTbUjXZZY(hD_f8#9T04)hrZ4#0r|8G~urQH)^E1atODC4d0mARsuW1#2~p5zJ)X z3{*AHP#igONQo$w!Qh%P5-<I@2{2cVn@B)}Svy8TmM>IAWTbhKE7Y`Jf3Lo>wDibe zEhiKv1_W%!U>aIxz*>O#FJ2~;tT?tYuHj_Lo_rkYp*g{~h64o1o=v;9?az*3IKdP} yMS<VIg9{)2yO5DHYVt%$!F9=rCuMXMVs4zb;}OzF^q`^Hc=sXGYvg_r0RTJ2=Jizo literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/cards/discover.gif b/modules/authorizeaim/cards/discover.gif new file mode 100755 index 0000000000000000000000000000000000000000..b42b05cc9bb0ac7561884545fd55b3aa044e9ea9 GIT binary patch literal 504 zcmZ?wbhEHb)Mt=mXc1#zXJ?l)h?{K9=N(tHCPQ*YW@cGg&HprpKh@&1X3UzpZtw3U zroR^V?>cnm-_fdz7cc$0y#4l_drzM}d;R*&zc)93eEa$zFHro+!pOxS&!EEq1Ry&Z zSpPkk(vy-oFJqNi@6&w+I_FDrx0J4X|L*Mn1Jm_AuJCqy+%!D7MJH1<LiN`orFQ;? zvII{Csi+2Roi>GY9bOIDk}R8Uc~me2SQOr5*}I5ghkQ&eCoiK22R9E7hd^91r)X(^ zJX^d_xn86mGjr_}X3+!-v35QIfi4k-z$76C<q2XlZ7Y)e7<+lA#0l!R3y6sDb<bvt zS<A*Yq0niI9wS?=e(Acs97~sTh}4#ft-Zv!b@L2{2T5^tC3jz};_g_HymjsDdsEKn zE#T$X6V_E0)>r-#$-%~WtfN{-s-fuOflEu(eCJ*8NN_yJY|SjC;t+Q5z+wls3XeI4 zN)F6%ie(F5o>qOH*vrMi)p06O{UCFfh^SlRHCB<MQUYQ!6F4V!EM)fR6nlD*Vddq8 z#?#L&xbP+O(u$yXiw#+!nPK7rJG#DVeVuY+W5mRe1cfheA~(67*)g|Tl=JGglIMrk gIx1$|+wYgEB<*v<fswI8SUc{_4#Q+-MFs|I0GgBDmjD0& literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/cards/mastercard.gif b/modules/authorizeaim/cards/mastercard.gif new file mode 100755 index 0000000000000000000000000000000000000000..2a869a1fc0252e212eb60c2e2dacc024874a8014 GIT binary patch literal 595 zcmV-Z0<8T<Nk%w1VKM+70E8R>2L}hB4I&;eUi%LWlRFMeUUIBx8JKBlc6NOBR#pFI z0BDk_{CgLgn415Y0Qa2}m9D+}q&51ZkGjIl{>6IH(bE3Yx7*y_<>lt<>+JsQ+4%PL z|NsC0|NsC0|NsC0A^8LW3IHDfEC2ui05Sj`000I4ASaHbxLH!FZDl)ZR;;;nxk*E= z?}^o(4~K9#r1)y3#BRx)i6X?P)QQ9~uR0$^${j|It_^mq>za!+GFibso53TidhO;u zs2t^-$?hxaT_k%~erybYQWPQ<gL{XFLk}X2OND-rM3Vy&8cG^4V+jfjq@|?}6f+h< zW)T}k90LRyc>#-K8+uogBdlEw92BVo2qFmw#xDsY$ayRrI2<z=8w~^o6TKrxv=3hc z5F8Z^856ky0mZZg0R$WY67K~Z$QAQY4hGl7z#PRI0z^3YmJLF-3K}+PpjCkbBV+-x zNoWY{000iYA}r(pY(p^$?l=r&Bm$U)4HMBSWDqbx1AuuI!Uec+0Re&o$OhQLcfnt_ zViv+hFd#6(I}X)yaaeExhC>t^E;Kv<EQJJMI$3PkKuZzFV8vcMP-II(0}HkagcFfX z#DQ=U0+z%&V8MvBY&k@b%ff;NvH^7F2#l_9VV!|>5+EQrhl9lo^ck3J;L)|oLPW@+ zGyu~XUSc@su=K|>su8+G?=UT-XB^e6qgd!?LiHunUP~lY-5Ga{T%0Am@|?Q{B{28^ h!9jw8OoDj2x3nsb#0H84&m}Am^H-P=JT5{206RZ2^TPlD literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/cards/visa.gif b/modules/authorizeaim/cards/visa.gif new file mode 100755 index 0000000000000000000000000000000000000000..6f367c56aea932d02e529bac75cfc7a122a3790f GIT binary patch literal 451 zcmZ?wbhEHb)Mt=mXc1wMGl-M4YVeLLT9YAJR#uZSY2~aLv;NOy_&!&7>bkwZmzeH4 zbmrgDs*4vd{ky#V_MLlApFVs2`pv&LH-CKl`kx4(_>+Z^i$R`2hXDvcb~3R3dvLiY zC39ZJsvwr9`wDc<m;Bx0z3zR@`~Q2|U%PQi^q*K#bkawxZSArWtJ<KBD{HQ09L?K* zHc!N-%&Gfni9=28j{6^W+~J*hTYlo^Hyai9Dk%#n>j|*3unHI`^LLuKn7He^@lIs* zU|`al#>m9P-KRUjO;0d8gONL?W<|LBJmCeV6Zsc!S;6F1Y2axZzR-9FV+OCz91%_r z{S$K+o9#C`D7@8;Q$%?7vJCEnd;1T#?U+A%gY(2GocwprnX<S$EkCY5d!^Ui^M-HF zW-tk4^KP5-$5di_pPOBh$O~PEX)Qtwsc!eqez>-J(a};NqpUk8HZDHiFLP4R(P7h) zlan<ZgIC#{d~oK}bc4igUtATJot>?c-go3=@Kc7lx_n<`vVs^c%;K7)6?<yS%FD~W b`{U+#m2xmJMQqNxdur?I>+1!a7#OSp-elgR literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/config.xml b/modules/authorizeaim/config.xml new file mode 100755 index 000000000..1f41ced64 --- /dev/null +++ b/modules/authorizeaim/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>authorizeaim</name> + <displayName><![CDATA[Authorize.net AIM (Advanced Integration Method)]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Receive payment with Authorize.net]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries>us</limited_countries> +</module> \ No newline at end of file diff --git a/modules/authorizeaim/cvv.png b/modules/authorizeaim/cvv.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4282c220689e36fb950ef145cb03c3843beaff GIT binary patch literal 8485 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 O7o@4Cr&_6u2>TzG6gYAK literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/de.php b/modules/authorizeaim/de.php new file mode 100755 index 000000000..99343a97d --- /dev/null +++ b/modules/authorizeaim/de.php @@ -0,0 +1,40 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f745351b1387473d3d2de5bfe18d3562'] = 'Fehler, bitte Kreditkarteninformationen überprüfen'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1814fc250eea61e13aa95e81b61bf72a'] = 'Bezahlen Sie mit authorizeaim'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_442155d68aea78b4ef707796d76ca48c'] = 'Visa-Logo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f65943f43529e119969e533dc6f691f9'] = 'MasterCard-Logo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_2937b5dab08029b1055b37c98a98d740'] = 'Discover-Logo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_3b8a6fa58a71e7448c264c9dc61e6904'] = 'American Express Logo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1edaf23879c3b52a8df80069d2af3cef'] = 'Sichere Kreditkartenzahlung mit Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f11b368cddfe37c47af9b9d91c6ba4f0'] = 'Vollständiger Name'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_a44217022190f5734b2f72ba1e4f8a79'] = 'Kartennummer'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_8c1279db4db86553e4b9682f78cf500e'] = 'Verfallsdatum'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_60a104dc50579d60cbc90158fada1dcf'] = 'CVV'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6149e52c36edb9ee4494d5412e42eef2'] = 'die letzten drei Ziffern auf der Rückseite Ihrer Kreditkarte'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_40566b26dcc126bce704f2c1d622a6a3'] = 'Bestellung bestätigen'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_9286982d71addb45ad3a9472282f2c69'] = 'Ihre Kartennummer ist falsch'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_cb313e911b15b21b57f4fc7b53058e4f'] = 'Zahlung mit Authorize.net erhalten '; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Hilfe'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_11a4b229c0e206b831f729572618553f'] = 'In Ihrem PrestaShop Admin-Panel'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_bc6781f2b59d4e973bd0075baab62a40'] = 'Füllen Sie das Login-ID-Feld mit der von Authorize.net vorgesehenen Kennung aus'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_95eb440b753d6505aad5c3f72b50eec9'] = 'Füllen Sie das Schlüsselfeld mit dem Transaktionsschlüssel von Authorize.net aus'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f3ef34226d51e9ca88eaa2f20d7ffb91'] = 'Login-ID'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_897356954c2cd3d41b221e3f24f99bba'] = 'Schlüssel'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1ee1c44c2dc81681f961235604247b81'] = 'Modus:'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_756d97bb256b8580d4d71ee0c547804e'] = 'Produktion'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_291cdb0a8abb42484f5d44dc20540ce6'] = 'Karten:'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aktualisierungseinstellungen'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = ' ist abgeschlossen.'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Ihre Bestellung wird so schnell wie möglich zugeschickt.'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Wir haben ein Problem bei Ihrer Bestellung festgestellt. Wenn Sie denken, dies sei ein Fehler, können Sie an unseren'; + +?> \ No newline at end of file diff --git a/modules/authorizeaim/en.php b/modules/authorizeaim/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/authorizeaim/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/authorizeaim/es.php b/modules/authorizeaim/es.php new file mode 100644 index 000000000..4e85a2c40 --- /dev/null +++ b/modules/authorizeaim/es.php @@ -0,0 +1,39 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{authorizeaim}prestashop>authorizeaim_cb313e911b15b21b57f4fc7b53058e4f'] = 'Recibir pagos con Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración actualizada'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Ayuda'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_11a4b229c0e206b831f729572618553f'] = 'En su panel de PrestaShop admin'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_bc6781f2b59d4e973bd0075baab62a40'] = 'Rellene el ID de campo con el proporcionado por Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_95eb440b753d6505aad5c3f72b50eec9'] = 'Rellene el campo clave con la clave de operación facilitada por Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_a7180ba675bb293f415aab47e52a1732'] = 'Atención: Su sitio web debe poseer un certificado SSL para utilizar el módulo Authorize.net AIM. Usted es responsable de la seguridad de los datos bancarios de sus clientes. PrestaShop no podrá ser responsable en caso de problemas de seguridad en su sitio web.'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f3ef34226d51e9ca88eaa2f20d7ffb91'] = 'Nombre de usuario'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_897356954c2cd3d41b221e3f24f99bba'] = 'Clave'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1ee1c44c2dc81681f961235604247b81'] = 'Modo:'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_756d97bb256b8580d4d71ee0c547804e'] = 'Producción'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_0cbc6611f5540bd0809a388dc95a615b'] = 'Prueba'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_291cdb0a8abb42484f5d44dc20540ce6'] = 'Tarjetas:'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar la configuración'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f745351b1387473d3d2de5bfe18d3562'] = 'Error, por favor compruebe sus datos bancarios'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1814fc250eea61e13aa95e81b61bf72a'] = 'Pagar con authorizeaim'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_442155d68aea78b4ef707796d76ca48c'] = 'visa logo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f65943f43529e119969e533dc6f691f9'] = 'logotipo de MasterCard'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_2937b5dab08029b1055b37c98a98d740'] = 'descubrir logotipo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_3b8a6fa58a71e7448c264c9dc61e6904'] = 'Logo American Express '; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1edaf23879c3b52a8df80069d2af3cef'] = 'Pago seguro con Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f11b368cddfe37c47af9b9d91c6ba4f0'] = 'Nombre y apellidos'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_a44217022190f5734b2f72ba1e4f8a79'] = 'Número de tarjeta'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_8c1279db4db86553e4b9682f78cf500e'] = 'Fecha de caducidad'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_60a104dc50579d60cbc90158fada1dcf'] = 'CVV'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6149e52c36edb9ee4494d5412e42eef2'] = 'los 3 últimos dígitos de la parte posterior de su tarjeta de crédito'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_40566b26dcc126bce704f2c1d622a6a3'] = 'Validar el pedido'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_9286982d71addb45ad3a9472282f2c69'] = 'Su número de tarjeta es erróneo'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido de'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'se ha completado.'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Su pedido será enviado tan pronto como sea posible.'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier duda o para más información, póngase en contacto con nuestro servicio de'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'atención al cliente'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Hemos constatado un problema con su pedido. Si usted piensa que esto es un error, puede contactar con nuestro'; diff --git a/modules/authorizeaim/fr.php b/modules/authorizeaim/fr.php new file mode 100644 index 000000000..a01eb18ea --- /dev/null +++ b/modules/authorizeaim/fr.php @@ -0,0 +1,39 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{authorizeaim}prestashop>authorizeaim_cb313e911b15b21b57f4fc7b53058e4f'] = 'Recevoir des paiments avec Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration mise a jour'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aide'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_11a4b229c0e206b831f729572618553f'] = 'Dans votre panneau d\'aministration PrestaShop'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_bc6781f2b59d4e973bd0075baab62a40'] = 'Indiquez le login avec celui fourni par Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_95eb440b753d6505aad5c3f72b50eec9'] = 'Indiquez la clé avec la clé de transaction indiquée par Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_a7180ba675bb293f415aab47e52a1732'] = 'Attention: votre site doit posséder un certificat SSL pour utiliser le module Authorize.net AIM. Vous êtes responsable de la sécurité des informations bancaires de vos clients. PrestaShop ne peut être tenu responsable en cas de problème de sécurité sur votre site.'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f4f70727dc34561dfde1a3c529b6205c'] = 'Parametres'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f3ef34226d51e9ca88eaa2f20d7ffb91'] = 'Login'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_897356954c2cd3d41b221e3f24f99bba'] = 'Clé'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1ee1c44c2dc81681f961235604247b81'] = 'Mode'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_756d97bb256b8580d4d71ee0c547804e'] = 'Production'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_291cdb0a8abb42484f5d44dc20540ce6'] = 'Cartes'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre a jour la configuration'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f745351b1387473d3d2de5bfe18d3562'] = 'Erreur, veuillez verifier vos informations bancaires'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1814fc250eea61e13aa95e81b61bf72a'] = 'Payer avec AuthorizeAIM'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_442155d68aea78b4ef707796d76ca48c'] = 'logo visa'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f65943f43529e119969e533dc6f691f9'] = 'logo mastercard'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_2937b5dab08029b1055b37c98a98d740'] = 'logo discover'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_3b8a6fa58a71e7448c264c9dc61e6904'] = 'logo american express'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1edaf23879c3b52a8df80069d2af3cef'] = 'Paiement sécurisé avec Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f11b368cddfe37c47af9b9d91c6ba4f0'] = 'Nom'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_a44217022190f5734b2f72ba1e4f8a79'] = 'Numero de CB'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_8c1279db4db86553e4b9682f78cf500e'] = 'Date d\'expiration'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_60a104dc50579d60cbc90158fada1dcf'] = 'Code CVV'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6149e52c36edb9ee4494d5412e42eef2'] = 'les 3 derniers chifres au dos de votre carte'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_40566b26dcc126bce704f2c1d622a6a3'] = 'Confirmer la commande'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_9286982d71addb45ad3a9472282f2c69'] = 'Votre numero de CB est erroné'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'Est reussie'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Votre commende vous sera expedié le plus rapidement possible'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question, contactez nous'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Service client'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Nous avons remarqué une erreur avec votre commande. Si vous pensez que c\'est une erreur, vous pouvez contacter notre'; diff --git a/modules/authorizeaim/help.png b/modules/authorizeaim/help.png new file mode 100644 index 0000000000000000000000000000000000000000..87f94c8f855a88fca459e9dcdfff50fa3f0232eb GIT binary patch literal 911 zcmV;A191F_P)<h;3K|Lk000e1NJLTq000jF000mO1^@s6$yOx<00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipP{ z3j-$hRzuYQ000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0008&Nkl<Z zD9=^XPiz!*0LAg|?>B#TciQb1*S27xMf70U7PTQH9*l`WK|@STAWEWMkZ>XKfEVSU z9@U#BCWfda#+Zn)@xWRw!8B=<KopjwQfw{4E-2ld?e6T(?)+wF=I5aS^_}16_MXsM zYyOjF7;?3xXmldnRzfdjvn}0Ya(IB8WdP!CSKPr7aH-tjoGV%MTHIQ@P0h^VL?$wh zX@mhsC$@25B8{mNgplhviW5#P)Hu7Qn5{Ia`QW!B(sn`+cfihZzmBO|4W8OGz&HD* z&{|`Lz|0>_=5Kivn}WFB<kWKy^T@^w85PpC4c?qv<>aqR*x4bbuY`O&?s8-@k6dks zoLTL1#s&A<5~p8zjAzCjPXD&Z>u1kX@iiy*jIwWHoKzRcnjHOXnwl3PzgzYx)w`_x z9n$Y)sdr-DFS#84(dUzuG4_0Z0aLd)wEZ4hx(z{{D0cYr;sR!=p756!g3-l|E%tvp zN8o74j6$oz@y8zkVNq29Da%F~1CXv#DlK3xuGXn`Vj>v=7A<EG-ESi5Ykcv-E)I?x ztaMC{6n{d?JfJ~nmY1&~>ye_D0FfpY3nYDrKyhs9L0%k7n7!Ji@L`d`>}D_|Xa(H{ zjsa4M2(3a$rHBQ@X$u{$v47_XLS}er_B=t~2%hQyAt(=8E}Mr2k$Xq;bS#^cvWaAX zP&Hr+$LBBdbg_(|WD!`1o&sTEC=ae&;`v=WkcSF6C@-L-hb6LLq%lRCw|76vx6f{2 zV-lb>#L@u2O?-V3$G^$m-A^F54-Ig5aueKM!tetKd&DZDQVUt}LrlvAWgv7vedQ9& ze8tSk4-o6yPPB?OPab=hpFJCW?<jKkAu_U!FHL06L{$GIzWxhb_?{E*yuqt4A3$sU z?=b*An*M>;-g*x<jA7<Bppp>LbV<s;lg~R`E`H5@Bg5-Zi2q{%Khn(2pW{a5CO6zF lTZi*Z6$<R!QMill<R6#daY}yxdIkUh002ovPDHLkV1h!wmSq3{ literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/hookorderconfirmation.tpl b/modules/authorizeaim/hookorderconfirmation.tpl new file mode 100755 index 000000000..92e8b7f75 --- /dev/null +++ b/modules/authorizeaim/hookorderconfirmation.tpl @@ -0,0 +1,11 @@ +{if $status == 'ok'} + <p>{l s='Your order on' mod='authorizeaim'} <span class="bold">{$shop_name}</span> {l s='is complete.' mod='authorizeaim'} + <br /><br /><span class="bold">{l s='Your order will be sent as soon as possible.' mod='authorizeaim'}</span> + <br /><br />{l s='For any questions or for further information, please contact our' mod='authorizeaim'} <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='authorizeaim'}</a>. + </p> +{else} + <p class="warning"> + {l s='We noticed a problem with your order. If you think this is an error, you can contact our' mod='authorizeaim'} + <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='authorizeaim'}</a>. + </p> +{/if} \ No newline at end of file diff --git a/modules/authorizeaim/it.php b/modules/authorizeaim/it.php new file mode 100755 index 000000000..2fbcdf8c6 --- /dev/null +++ b/modules/authorizeaim/it.php @@ -0,0 +1,38 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1814fc250eea61e13aa95e81b61bf72a'] = 'Paga con authorizeaim'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_442155d68aea78b4ef707796d76ca48c'] = 'logo visa'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f65943f43529e119969e533dc6f691f9'] = 'logo mastercard'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_2937b5dab08029b1055b37c98a98d740'] = 'logo discover'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_3b8a6fa58a71e7448c264c9dc61e6904'] = 'logo american express'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1edaf23879c3b52a8df80069d2af3cef'] = 'Pagamento sicuro con carta di credito con Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f11b368cddfe37c47af9b9d91c6ba4f0'] = 'Nome completo'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_a44217022190f5734b2f72ba1e4f8a79'] = 'Numero di carta'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_8c1279db4db86553e4b9682f78cf500e'] = 'Data di scadenza'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_60a104dc50579d60cbc90158fada1dcf'] = 'CVV'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_40566b26dcc126bce704f2c1d622a6a3'] = 'Convalida ordine'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_9286982d71addb45ad3a9472282f2c69'] = 'Il tuo numero di carta è falso'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_cb313e911b15b21b57f4fc7b53058e4f'] = 'Ricevi il pagamento con Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aiuto'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_11a4b229c0e206b831f729572618553f'] = 'Nel tuo pannello admin PrestaShop'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_bc6781f2b59d4e973bd0075baab62a40'] = 'Riempi il campo ID Login con quello fornito da Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_95eb440b753d6505aad5c3f72b50eec9'] = 'Riempire il campo chiave con la chiave di transazione fornita da Authorize.net'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_f3ef34226d51e9ca88eaa2f20d7ffb91'] = 'ID Login '; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_897356954c2cd3d41b221e3f24f99bba'] = 'Chiave'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_1ee1c44c2dc81681f961235604247b81'] = 'Modalità:'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_756d97bb256b8580d4d71ee0c547804e'] = 'Produzione'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_291cdb0a8abb42484f5d44dc20540ce6'] = 'Carte di credito:'; +$_MODULE['<{authorizeaim}prestashop>authorizeaim_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{authorizeaim}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Abbiamo notato un problema con il tuo ordine. Se pensi che questo sia un errore, contatta la nostra'; + +?> \ No newline at end of file diff --git a/modules/authorizeaim/logo.gif b/modules/authorizeaim/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..fcf31ce4a93f61d0ca053dedbca2a798766869ef GIT binary patch literal 79 zcmZ?wbhEHb6krfwXkcX6yjJG_|Nn|VSs1w(7#VaJfB+=Jz@*mGzq0$mf3XQy4sf5} ha_Z&$iaR%Q8Z)yrB9fArjnmI8$#f5&#x2TV4FK@g8{Pl_ literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/logo_authorize.png b/modules/authorizeaim/logo_authorize.png new file mode 100755 index 0000000000000000000000000000000000000000..d6f2b65f16b7e2c201a23f21c65d87c965c52f6d GIT binary patch literal 6565 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 Xab5CoDj-c$00000NkvXXu0mjf0rz!j literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/logoa.gif b/modules/authorizeaim/logoa.gif new file mode 100644 index 0000000000000000000000000000000000000000..b5fc452908a928b04b7711a8120bd251e151a6ca GIT binary patch literal 2047 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 XY8RBcKz5wr2Qi;Is;(Vi0O0dKf>9*2 literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/secure.png b/modules/authorizeaim/secure.png new file mode 100755 index 0000000000000000000000000000000000000000..206a133be2c80fbbfd4b7be3f7f61d1ab1aa3416 GIT binary patch literal 611 zcmV-p0-XJcP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipP{ z3j-giQ_I}|00HAkL_t(I%XN~yZc{-Jg}>RguN~VsE)2q*5kX1>Q~~7$cmt$Vh=wjb z6^*;R01a<I3k9M=5JjYkQkclfpGAWaD2jxl*uFn|cPM;q9BgkhTItNUXU?oJ@2su8 z!uuC^Uq%E(6p<Z{jyC_7%1ra>>JG*{Vq@bq_4-ppia1xG+Z7HEb9B4Q)AHO5z}j^V z4j!<zb<F-gB#Eb9w=|ndzi(+Y9<sapZ81PKq}BRJrxUTaR{>yU<tvrSU23(PwA*ii z`(wG8<G>I_MFxY;6!Z(dp2b>F%`Y55Tdd#ykml{+cX_E4-gxtjCvgm|)2rt9ToQ!g zCDkA*_2z|m_L7rog?lmpFOXU=MQ{NmIT%<N7El|&>3jU<yV2tl2gY!#{+u&Db4M<) zSfBzFff`ByxCH%${48T<M-Whln#Y_IvP6#(7v%VZaE{;r1qxuMmVZ4&m)%nYgW^yG zaMyo~>S92E$52MdBNP#m%%^76qMk*7JTc(8LJ21hlr#f4z$11ZKmiIw7$SxlAVnvN z@hB0<ybNSSF_iHr0eu2OED3_i>}Pd4gMV94a3?f!ZI&5kTd||m5ugNG9c?Q1a{y_? x_K#0&<G^`{M^$47P9aVpQHWCr2ON+4{sLQkz>A=Z(kB1_002ovPDHLkV1lL~`3V33 literal 0 HcmV?d00001 diff --git a/modules/authorizeaim/validation.php b/modules/authorizeaim/validation.php new file mode 100755 index 000000000..5470d565a --- /dev/null +++ b/modules/authorizeaim/validation.php @@ -0,0 +1,86 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__). '/../../config/config.inc.php'); +include(dirname(__FILE__). '/../../init.php'); +include(dirname(__FILE__). '/authorizeaim.php'); + +/* Transform the POST from the template to a GET for the CURL */ +if (isset($_POST['x_exp_date']) && isset($_POST['x_exp_date_m']) && isset($_POST['x_exp_date_y']) && isset($_POST['x_exp_date_y']) && isset($_POST['name'])) +{ + $_POST['x_exp_date'] = $_POST['x_exp_date_m'].$_POST['x_exp_date_y']; + unset($_POST['x_exp_date_m']); + unset($_POST['x_exp_date_y']); + unset($_POST['name']); +} +$postString = ''; +foreach ($_POST AS $key => $value) + if ($key != "x_exp_date_m" OR $key != "x_exp_date_m") + $postString .= $key.'='.urlencode($value).'&'; +$postString .= 'x_exp_date='.str_pad($_POST["x_exp_date_m"], 2, "0",STR_PAD_LEFT).$_POST["x_exp_date_y"]; + +/* Do the CURL request ro Authorize.net */ +$request = curl_init( +Tools::getValue('x_test_request') ? 'https://test.authorize.net/gateway/transact.dll' : 'https://secure.authorize.net/gateway/transact.dll'); +curl_setopt($request, CURLOPT_HEADER, 0); +curl_setopt($request, CURLOPT_RETURNTRANSFER, 1); +curl_setopt($request, CURLOPT_POSTFIELDS, $postString); +curl_setopt($request, CURLOPT_SSL_VERIFYPEER, FALSE); +$postResponse = curl_exec($request); +curl_close($request); + +$response = explode('|', $postResponse); +if (!isset($response[7]) OR !isset($response[3]) OR !isset($response[9])) +{ + Logger::addLog('Authorize.net returned a malformed response for cart '.$response[7], 4); + die('Authorize.net returned a malformed response, aborted.'); +} + +if ($response[0] == 3) + Tools::redirect('index.php?controller=order&step=3&aimerror=1'); +else +{ + /* Does the cart exist and is valid? */ + $cart = new Cart((int)$response[7]); + if (!Validate::isLoadedObject($cart)) + { + Logger::addLog('Cart loading failed for cart '.$response[7], 4); + exit; + } + + $customer = new Customer((int)$cart->id_customer); + + /* Loading the object */ + $authorizeaim = new authorizeaim(); + $message = $response[3]; + if ($response[0] == 1) + $authorizeaim->validateOrder((int)$cart->id, _PS_OS_PAYMENT_, (float)$response[9], $authorizeaim->displayName, $message, NULL, NULL, false, $customer->secure_key); + else + $authorizeaim->validateOrder((int)$cart->id, _PS_OS_ERROR_, (float)$response[9], $authorizeaim->displayName, $message, NULL, NULL, false, $customer->secure_key); + + Tools::redirect('index.php?controller=order-confirmation&id_module='.(int)$authorizeaim->id.'&id_cart='.(int)$cart->id.'&key='.$customer->secure_key); +} + diff --git a/modules/bankwire/bankwire.jpg b/modules/bankwire/bankwire.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d11f391a411dcbd4ef3a7603c6ceeb361f6cf54 GIT binary patch literal 9087 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 J?Ly%{`6qvOV{-ri literal 0 HcmV?d00001 diff --git a/modules/bankwire/bankwire.php b/modules/bankwire/bankwire.php new file mode 100644 index 000000000..fd974e7a4 --- /dev/null +++ b/modules/bankwire/bankwire.php @@ -0,0 +1,235 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7095 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BankWire extends PaymentModule +{ + private $_html = ''; + private $_postErrors = array(); + + public $details; + public $owner; + public $address; + + public function __construct() + { + $this->name = 'bankwire'; + $this->tab = 'payments_gateways'; + $this->version = '0.5'; + $this->author = 'PrestaShop'; + + $this->currencies = true; + $this->currencies_mode = 'checkbox'; + + $config = Configuration::getMultiple(array('BANK_WIRE_DETAILS', 'BANK_WIRE_OWNER', 'BANK_WIRE_ADDRESS')); + if (isset($config['BANK_WIRE_OWNER'])) + $this->owner = $config['BANK_WIRE_OWNER']; + if (isset($config['BANK_WIRE_DETAILS'])) + $this->details = $config['BANK_WIRE_DETAILS']; + if (isset($config['BANK_WIRE_ADDRESS'])) + $this->address = $config['BANK_WIRE_ADDRESS']; + + parent::__construct(); + + $this->displayName = $this->l('Bank Wire'); + $this->description = $this->l('Accept payments by bank wire.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details?'); + if (!isset($this->owner) OR !isset($this->details) OR !isset($this->address)) + $this->warning = $this->l('Account owner and details must be configured in order to use this module correctly.'); + if (!sizeof(Currency::checkPaymentCurrencies($this->id))) + $this->warning = $this->l('No currency set for this module'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('payment') OR !$this->registerHook('paymentReturn')) + return false; + return true; + } + + public function uninstall() + { + if (!Configuration::deleteByName('BANK_WIRE_DETAILS') + OR !Configuration::deleteByName('BANK_WIRE_OWNER') + OR !Configuration::deleteByName('BANK_WIRE_ADDRESS') + OR !parent::uninstall()) + return false; + return true; + } + + private function _postValidation() + { + if (Tools::isSubmit('btnSubmit')) + { + if (!Tools::getValue('details')) + $this->_postErrors[] = $this->l('Account details are required.'); + elseif (!Tools::getValue('owner')) + $this->_postErrors[] = $this->l('Account owner is required.'); + } + } + + private function _postProcess() + { + if (Tools::isSubmit('btnSubmit')) + { + Configuration::updateValue('BANK_WIRE_DETAILS', Tools::getValue('details')); + Configuration::updateValue('BANK_WIRE_OWNER', Tools::getValue('owner')); + Configuration::updateValue('BANK_WIRE_ADDRESS', Tools::getValue('address')); + } + $this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('ok').'" /> '.$this->l('Settings updated').'</div>'; + } + + private function _displayBankWire() + { + $this->_html .= '<img src="../modules/bankwire/bankwire.jpg" style="float:left; margin-right:15px;"><b>'.$this->l('This module allows you to accept payments by bank wire.').'</b><br /><br /> + '.$this->l('If the client chooses this payment mode, the order will change its status into a \'Waiting for payment\' status.').'<br /> + '.$this->l('Therefore, you must manually confirm the order as soon as you receive the wire.').'<br /><br /><br />'; + } + + private function _displayForm() + { + $this->_html .= + '<form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset> + <legend><img src="../img/admin/contact.gif" />'.$this->l('Contact details').'</legend> + <table border="0" width="500" cellpadding="0" cellspacing="0" id="form"> + <tr><td colspan="2">'.$this->l('Please specify the bank wire account details for customers').'.<br /><br /></td></tr> + <tr><td width="130" style="height: 35px;">'.$this->l('Account owner').'</td><td><input type="text" name="owner" value="'.htmlentities(Tools::getValue('owner', $this->owner), ENT_COMPAT, 'UTF-8').'" style="width: 300px;" /></td></tr> + <tr> + <td width="130" style="vertical-align: top;">'.$this->l('Details').'</td> + <td style="padding-bottom:15px;"> + <textarea name="details" rows="4" cols="53">'.htmlentities(Tools::getValue('details', $this->details), ENT_COMPAT, 'UTF-8').'</textarea> + <p>'.$this->l('Such as bank branch, IBAN number, BIC, etc.').'</p> + </td> + </tr> + <tr> + <td width="130" style="vertical-align: top;">'.$this->l('Bank address').'</td> + <td style="padding-bottom:15px;"> + <textarea name="address" rows="4" cols="53">'.htmlentities(Tools::getValue('address', $this->address), ENT_COMPAT, 'UTF-8').'</textarea> + </td> + </tr> + <tr><td colspan="2" align="center"><input class="button" name="btnSubmit" value="'.$this->l('Update settings').'" type="submit" /></td></tr> + </table> + </fieldset> + </form>'; + } + + public function getContent() + { + $this->_html = '<h2>'.$this->displayName.'</h2>'; + + if (Tools::isSubmit('btnSubmit')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= '<div class="alert error">'. $err .'</div>'; + } + else + $this->_html .= '<br />'; + + $this->_displayBankWire(); + $this->_displayForm(); + + return $this->_html; + } + + public function execPayment($cart) + { + if (!$this->active) + return ; + if (!$this->_checkCurrency($cart)) + Tools::redirect('index.php?controller=order'); + + global $cookie, $smarty; + + $smarty->assign(array( + 'nbProducts' => $cart->nbProducts(), + 'cust_currency' => $cart->id_currency, + 'currencies' => $this->getCurrency((int)$cart->id_currency), + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'this_path' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + + return $this->display(__FILE__, 'payment_execution.tpl'); + } + + public function hookPayment($params) + { + if (!$this->active) + return ; + if (!$this->_checkCurrency($params['cart'])) + return ; + + global $smarty; + + $smarty->assign(array( + 'this_path' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + return $this->display(__FILE__, 'payment.tpl'); + } + + public function hookPaymentReturn($params) + { + if (!$this->active) + return ; + + global $smarty; + $state = $params['objOrder']->getCurrentState(); + if ($state == _PS_OS_BANKWIRE_ OR $state == _PS_OS_OUTOFSTOCK_) + $smarty->assign(array( + 'total_to_pay' => Tools::displayPrice($params['total_to_pay'], $params['currencyObj'], false), + 'bankwireDetails' => nl2br2($this->details), + 'bankwireAddress' => nl2br2($this->address), + 'bankwireOwner' => $this->owner, + 'status' => 'ok', + 'id_order' => $params['objOrder']->id + )); + else + $smarty->assign('status', 'failed'); + return $this->display(__FILE__, 'payment_return.tpl'); + } + + private function _checkCurrency($cart) + { + $currency_order = new Currency((int)($cart->id_currency)); + $currencies_module = $this->getCurrency((int)$cart->id_currency); + $currency_default = Configuration::get('PS_CURRENCY_DEFAULT'); + + if (is_array($currencies_module)) + foreach ($currencies_module AS $currency_module) + if ($currency_order->id == $currency_module['id_currency']) + return true; + return false; + } +} diff --git a/modules/bankwire/config.xml b/modules/bankwire/config.xml new file mode 100755 index 000000000..f391a9ebb --- /dev/null +++ b/modules/bankwire/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>bankwire</name> + <displayName><![CDATA[Bank Wire]]></displayName> + <version><![CDATA[0.5]]></version> + <description><![CDATA[Accept payments by bank wire.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <confirmUninstall>Are you sure you want to delete your details?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/bankwire/de.php b/modules/bankwire/de.php new file mode 100644 index 000000000..ceeb94c8a --- /dev/null +++ b/modules/bankwire/de.php @@ -0,0 +1,56 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{bankwire}prestashop>payment_5e1695822fc5af98f6b749ea3cbc9b4c'] = 'Zahlung per Banküberweisung'; +$_MODULE['<{bankwire}prestashop>payment_eb1d50032721fa4c9d3518c417f91b9d'] = 'Zahlung per Banküberweisung (längerer Bestellvorgang)'; +$_MODULE['<{bankwire}prestashop>payment_execution_c5e8668ba5e211603955f0b5e913d83d'] = 'Zahlung per Banküberweisung'; +$_MODULE['<{bankwire}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Bestellübersicht'; +$_MODULE['<{bankwire}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Ihr Warenkorb ist leer.'; +$_MODULE['<{bankwire}prestashop>payment_execution_e40a43534d7f4ece69347847d75401e0'] = 'Banküberweisung'; +$_MODULE['<{bankwire}prestashop>payment_execution_afda466128ee0594745d9f8152699b74'] = 'Sie möchten per Banküberweisung zahlen.'; +$_MODULE['<{bankwire}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Hier ist eine kurze Übersicht über Ihre Bestellung.'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung beträgt'; +$_MODULE['<{bankwire}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = '(inkl. MsWst.)'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2c147f82d998eeeb147ae172a31a88e'] = 'Wir nehmen bestimmte Währungen per Banküberweisung an.'; +$_MODULE['<{bankwire}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Bitte wählen Sie eine aus:'; +$_MODULE['<{bankwire}prestashop>payment_execution_2c1ce705702e11fd5e2188c2353c0c86'] = 'Wir nehmen folgende Währung per Banküberweisung an:'; +$_MODULE['<{bankwire}prestashop>payment_execution_3dd021316505c0204989f984246c6ff1'] = 'Die Kontoinformationen zur Banküberweisung stehen auf der folgenden Seite.'; +$_MODULE['<{bankwire}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Bitte bestätigen Sie Ihre Bestellung, indem Sie auf \"BESTELLEN\" klicken'; +$_MODULE['<{bankwire}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Andere Zahlungsmethoden'; +$_MODULE['<{bankwire}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'BESTELLEN'; +$_MODULE['<{bankwire}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{bankwire}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist vollständig.'; +$_MODULE['<{bankwire}prestashop>payment_return_1552c5916ccfe019f35d91fd8955755e'] = 'Bitte senden Sie uns folgenden Betrag per Banküberweisung:'; +$_MODULE['<{bankwire}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'Betrag'; +$_MODULE['<{bankwire}prestashop>payment_return_c51326a2ac458845d579a82a92f111f0'] = 'an den Kontoinhaber von'; +$_MODULE['<{bankwire}prestashop>payment_return_de6d813f05e3916a86b89bd8b1a8a489'] = 'mit dieser Bankverbindung'; +$_MODULE['<{bankwire}prestashop>payment_return_619b26a60df1af3649d2e8920a7949cd'] = 'an diese Bank'; +$_MODULE['<{bankwire}prestashop>payment_return_4fac1f51a5f4b3dd634800fe3d408a45'] = 'Bitte denken Sie daran, Ihre Bestellnummer einzugeben '; +$_MODULE['<{bankwire}prestashop>payment_return_4460fcb45ad7a6a61c95293eb611da12'] = 'in den Betreff Ihrer Banküberweisung'; +$_MODULE['<{bankwire}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Sie haben eine E-Mail mit diesen Informationen erhalten.'; +$_MODULE['<{bankwire}prestashop>payment_return_c4457a9f2f20e39386008bbb2cd3a78f'] = 'Ihre Bestellung wird abgesendet, sobald wir Ihre Überweisung erhalten haben.'; +$_MODULE['<{bankwire}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oderfür weitere Informationen kontaktieren Sie bitte unseren'; +$_MODULE['<{bankwire}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kundendienst'; +$_MODULE['<{bankwire}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Bei Ihrer Bestellung ist ein Problem aufgetreten. Wenn Sie denken, dass dies ein Fehler ist, können Sie unseren kontaktieren'; +$_MODULE['<{bankwire}prestashop>bankwire_85ee0d0492a4e37e6c183520f5d59c40'] = 'Banküberweisung'; +$_MODULE['<{bankwire}prestashop>bankwire_f652b92eefd4ecfe61ef5fb118157a05'] = 'Zahlungen per Banküberweisung annehmen'; +$_MODULE['<{bankwire}prestashop>bankwire_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Sind Sie sicher, dass Sie Ihre Details löschen möchten?'; +$_MODULE['<{bankwire}prestashop>bankwire_f05d09f37c9a02f0737c1e71142028a9'] = 'Kontoinhaber und Details müssen konfiguriert werden, um dieses Modul korrekt zu nutzen'; +$_MODULE['<{bankwire}prestashop>bankwire_4402acab1c8f90dcf4a31dc96833bd86'] = 'Keine Währung für dieses Modul eingestellt'; +$_MODULE['<{bankwire}prestashop>bankwire_bfa43217dfe8261ee7cb040339085677'] = 'Konto-Details erforderlich.'; +$_MODULE['<{bankwire}prestashop>bankwire_ccab155f173ac76f79eb192703f86b18'] = 'Kontoinhaber erforderlich.'; +$_MODULE['<{bankwire}prestashop>bankwire_444bcb3a3fcf8389296c49467f27e1d6'] = 'ok'; +$_MODULE['<{bankwire}prestashop>bankwire_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{bankwire}prestashop>bankwire_fcec4d73cccd149a2d18695fd8785f88'] = 'Dieses Modul ermöglicht Ihnen Zahlungen per Banküberweisung.'; +$_MODULE['<{bankwire}prestashop>bankwire_b6af2d31afe71aedcceca73cc27fec29'] = 'Wenn der Kunde diese Zahlungsmethode wählt, wird der Bestellstatus auf \"Wartet auf Zahlung\" umgestellt. '; +$_MODULE['<{bankwire}prestashop>bankwire_0daeb8f6c1874ec9442e821b524d37c1'] = 'Aus diesem Grund müssen Sie die Bestellung manuell bestätigen, sobald Sie die Überweisung erhalten.'; +$_MODULE['<{bankwire}prestashop>bankwire_5dd532f0a63d89c5af0243b74732f63c'] = 'Kontaktdetails'; +$_MODULE['<{bankwire}prestashop>bankwire_17e6954ea60d238857324fea1f10b8f3'] = 'Bitte spezifizieren Sie die Bankverbindungsdetails für Kunden.'; +$_MODULE['<{bankwire}prestashop>bankwire_857216dd1b374de9bf54068fcd78a8f3'] = 'Kontoinhaber'; +$_MODULE['<{bankwire}prestashop>bankwire_3ec365dd533ddb7ef3d1c111186ce872'] = 'Details'; +$_MODULE['<{bankwire}prestashop>bankwire_6b154cafbab54ba3a1e76a78c290c02a'] = 'wie Zweigstelle, IBAN-Nummer, BIC, etc.'; +$_MODULE['<{bankwire}prestashop>bankwire_f9a1a1bb716cbae0503d351ea2af4b34'] = 'Bankadresse'; +$_MODULE['<{bankwire}prestashop>bankwire_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aktualisierungseinstellungen'; + +?> \ No newline at end of file diff --git a/modules/bankwire/en.php b/modules/bankwire/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/bankwire/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/bankwire/es.php b/modules/bankwire/es.php new file mode 100644 index 000000000..9cb03dc14 --- /dev/null +++ b/modules/bankwire/es.php @@ -0,0 +1,54 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{bankwire}prestashop>bankwire_85ee0d0492a4e37e6c183520f5d59c40'] = 'Trasferencia bancaria'; +$_MODULE['<{bankwire}prestashop>bankwire_f652b92eefd4ecfe61ef5fb118157a05'] = 'Se aceptan pagos por trasferencia bancaria'; +$_MODULE['<{bankwire}prestashop>bankwire_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = '¿Está seguro de querer borrar los detalles?'; +$_MODULE['<{bankwire}prestashop>bankwire_f05d09f37c9a02f0737c1e71142028a9'] = 'El propietario y detalles de la cuenta deben configurarse para usar el módulo correctamente'; +$_MODULE['<{bankwire}prestashop>bankwire_4402acab1c8f90dcf4a31dc96833bd86'] = 'No hay moneda asignada a este módulo'; +$_MODULE['<{bankwire}prestashop>bankwire_bfa43217dfe8261ee7cb040339085677'] = 'se necesitan los detalles de la cuenta.'; +$_MODULE['<{bankwire}prestashop>bankwire_ccab155f173ac76f79eb192703f86b18'] = 'Se necesita el propietario de la cuenta.'; +$_MODULE['<{bankwire}prestashop>bankwire_444bcb3a3fcf8389296c49467f27e1d6'] = 'ok'; +$_MODULE['<{bankwire}prestashop>bankwire_c888438d14855d7d96a2724ee9c306bd'] = 'configuración actualizada'; +$_MODULE['<{bankwire}prestashop>bankwire_fcec4d73cccd149a2d18695fd8785f88'] = 'Este módulo permite aceptar pagos por trasferencia bancaria.'; +$_MODULE['<{bankwire}prestashop>bankwire_b6af2d31afe71aedcceca73cc27fec29'] = 'si el cliente elije este modo de pago, el pedido cambiará su estado a \"pendiente de pago\".'; +$_MODULE['<{bankwire}prestashop>bankwire_0daeb8f6c1874ec9442e821b524d37c1'] = 'Por lo tanto, deberá confirmar el pedido en cuanto reciba la trasferencia.'; +$_MODULE['<{bankwire}prestashop>bankwire_5dd532f0a63d89c5af0243b74732f63c'] = 'Detalles contacto'; +$_MODULE['<{bankwire}prestashop>bankwire_17e6954ea60d238857324fea1f10b8f3'] = 'Por favor, especifique los detalles de la cuenta para sus clientes'; +$_MODULE['<{bankwire}prestashop>bankwire_857216dd1b374de9bf54068fcd78a8f3'] = 'Propietario de la cuenta'; +$_MODULE['<{bankwire}prestashop>bankwire_3ec365dd533ddb7ef3d1c111186ce872'] = 'Detalles'; +$_MODULE['<{bankwire}prestashop>bankwire_6b154cafbab54ba3a1e76a78c290c02a'] = 'tales como: sucursal bancaria, código IBAN, BIC, etc.'; +$_MODULE['<{bankwire}prestashop>bankwire_f9a1a1bb716cbae0503d351ea2af4b34'] = 'Dirección agencia bancaria'; +$_MODULE['<{bankwire}prestashop>bankwire_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar configuración'; +$_MODULE['<{bankwire}prestashop>payment_5e1695822fc5af98f6b749ea3cbc9b4c'] = 'Pago por transferencia bancaria'; +$_MODULE['<{bankwire}prestashop>payment_eb1d50032721fa4c9d3518c417f91b9d'] = 'Pago por transferencia bancaria (el proceso llevará más tiempo)'; +$_MODULE['<{bankwire}prestashop>payment_execution_c5e8668ba5e211603955f0b5e913d83d'] = 'Pago por transferencia bancaria'; +$_MODULE['<{bankwire}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Resumen del pedido'; +$_MODULE['<{bankwire}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Su carrito está vacío.'; +$_MODULE['<{bankwire}prestashop>payment_execution_e40a43534d7f4ece69347847d75401e0'] = 'Transferencia bancaria'; +$_MODULE['<{bankwire}prestashop>payment_execution_afda466128ee0594745d9f8152699b74'] = 'Ha elegido pagar por transferencia bancaria'; +$_MODULE['<{bankwire}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Aquí tiene un resumen de su pedido:'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'El importe total de su pedido es'; +$_MODULE['<{bankwire}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = 'IVA incluído'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2c147f82d998eeeb147ae172a31a88e'] = 'Aceptamos diferentes monedas para la transferencia bancaria.'; +$_MODULE['<{bankwire}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'elija una de las siguientes:'; +$_MODULE['<{bankwire}prestashop>payment_execution_2c1ce705702e11fd5e2188c2353c0c86'] = 'Aceptamos las siguientes monedas para las transferencias bancarias:'; +$_MODULE['<{bankwire}prestashop>payment_execution_3dd021316505c0204989f984246c6ff1'] = 'La información para realizar la trasferencia bancaria aparecerá en la página siguiente.'; +$_MODULE['<{bankwire}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Por favor, acepte su pedido haciendo clic en \'confirmo mi pedido\''; +$_MODULE['<{bankwire}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Otros modos de pago'; +$_MODULE['<{bankwire}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Confirmo mi pedido'; +$_MODULE['<{bankwire}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido'; +$_MODULE['<{bankwire}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'está completo.'; +$_MODULE['<{bankwire}prestashop>payment_return_1552c5916ccfe019f35d91fd8955755e'] = 'por favor, háganos una transferencia por:'; +$_MODULE['<{bankwire}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'un importe de'; +$_MODULE['<{bankwire}prestashop>payment_return_c51326a2ac458845d579a82a92f111f0'] = 'al propietario de la cuenta'; +$_MODULE['<{bankwire}prestashop>payment_return_de6d813f05e3916a86b89bd8b1a8a489'] = 'con los siguientes datos'; +$_MODULE['<{bankwire}prestashop>payment_return_619b26a60df1af3649d2e8920a7949cd'] = 'a este banco'; +$_MODULE['<{bankwire}prestashop>payment_return_4fac1f51a5f4b3dd634800fe3d408a45'] = 'No se olvide añadir su pedido #'; +$_MODULE['<{bankwire}prestashop>payment_return_4460fcb45ad7a6a61c95293eb611da12'] = 'en el objeto de su transferencia'; +$_MODULE['<{bankwire}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Le hemos enviado un email con esta información.'; +$_MODULE['<{bankwire}prestashop>payment_return_c4457a9f2f20e39386008bbb2cd3a78f'] = 'Su pedido será enviado próximamente, en cuanto recibamos su pago.'; +$_MODULE['<{bankwire}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier duda, por favor contacte con nosotros'; +$_MODULE['<{bankwire}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'atención al cliente'; +$_MODULE['<{bankwire}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Hemos detectado un problema con su pedido. Si considera que hay un error, por favor, contacte con nosotros'; diff --git a/modules/bankwire/fr.php b/modules/bankwire/fr.php new file mode 100644 index 000000000..c44bb2bb1 --- /dev/null +++ b/modules/bankwire/fr.php @@ -0,0 +1,54 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{bankwire}prestashop>bankwire_85ee0d0492a4e37e6c183520f5d59c40'] = 'Virement Bancaire'; +$_MODULE['<{bankwire}prestashop>bankwire_f652b92eefd4ecfe61ef5fb118157a05'] = 'Accepter les paiements par virement'; +$_MODULE['<{bankwire}prestashop>bankwire_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Êtes-vous certain de vouloir effacer vos données ?'; +$_MODULE['<{bankwire}prestashop>bankwire_f05d09f37c9a02f0737c1e71142028a9'] = 'Le titulaire du compte et les informations bancaires doivent être configurés'; +$_MODULE['<{bankwire}prestashop>bankwire_4402acab1c8f90dcf4a31dc96833bd86'] = 'Aucune devise disponible pour ce module'; +$_MODULE['<{bankwire}prestashop>bankwire_bfa43217dfe8261ee7cb040339085677'] = 'Les détails du compte sont requis'; +$_MODULE['<{bankwire}prestashop>bankwire_ccab155f173ac76f79eb192703f86b18'] = 'Le titulaire du compte est requis.'; +$_MODULE['<{bankwire}prestashop>bankwire_444bcb3a3fcf8389296c49467f27e1d6'] = 'ok'; +$_MODULE['<{bankwire}prestashop>bankwire_c888438d14855d7d96a2724ee9c306bd'] = 'Mise à jour réussie'; +$_MODULE['<{bankwire}prestashop>bankwire_fcec4d73cccd149a2d18695fd8785f88'] = 'Ce module vous permet d\'accepter les paiements par virement bancaire.'; +$_MODULE['<{bankwire}prestashop>bankwire_b6af2d31afe71aedcceca73cc27fec29'] = 'Si le client choisit ce mode de paiement, la commande sera en statut \"Paiement en attente\"'; +$_MODULE['<{bankwire}prestashop>bankwire_0daeb8f6c1874ec9442e821b524d37c1'] = 'Par conséquent, vous devez confirmer manuellement la commande dès que vous recevrez le virement.'; +$_MODULE['<{bankwire}prestashop>bankwire_5dd532f0a63d89c5af0243b74732f63c'] = 'Coordonnées'; +$_MODULE['<{bankwire}prestashop>bankwire_17e6954ea60d238857324fea1f10b8f3'] = 'Merci de spécifier les détails du compte en banque pour les clients'; +$_MODULE['<{bankwire}prestashop>bankwire_857216dd1b374de9bf54068fcd78a8f3'] = 'Titulaire'; +$_MODULE['<{bankwire}prestashop>bankwire_3ec365dd533ddb7ef3d1c111186ce872'] = 'Détails'; +$_MODULE['<{bankwire}prestashop>bankwire_6b154cafbab54ba3a1e76a78c290c02a'] = 'Comme le code banque, l\'IBAN ou encore le BIC'; +$_MODULE['<{bankwire}prestashop>bankwire_f9a1a1bb716cbae0503d351ea2af4b34'] = 'Adresse de la banque'; +$_MODULE['<{bankwire}prestashop>bankwire_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour'; +$_MODULE['<{bankwire}prestashop>payment_5e1695822fc5af98f6b749ea3cbc9b4c'] = 'Payer par virement bancaire'; +$_MODULE['<{bankwire}prestashop>payment_eb1d50032721fa4c9d3518c417f91b9d'] = 'Payer par virement bancaire (traitement plus long)'; +$_MODULE['<{bankwire}prestashop>payment_execution_c5e8668ba5e211603955f0b5e913d83d'] = 'Paiement par virement bancaire'; +$_MODULE['<{bankwire}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Récapitulatif de commande'; +$_MODULE['<{bankwire}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Votre panier est vide.'; +$_MODULE['<{bankwire}prestashop>payment_execution_e40a43534d7f4ece69347847d75401e0'] = 'virement bancaire'; +$_MODULE['<{bankwire}prestashop>payment_execution_afda466128ee0594745d9f8152699b74'] = 'Vous avez choisi de régler par virement bancaire.'; +$_MODULE['<{bankwire}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un bref récapitulatif de votre commande :'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande s\'élève à'; +$_MODULE['<{bankwire}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = 'TTC'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2c147f82d998eeeb147ae172a31a88e'] = 'Nous acceptons plusieurs devises pour votre virement.'; +$_MODULE['<{bankwire}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Merci de choisir parmi les suivantes :'; +$_MODULE['<{bankwire}prestashop>payment_execution_2c1ce705702e11fd5e2188c2353c0c86'] = 'Nous acceptons la devise suivante pour votre paiement :'; +$_MODULE['<{bankwire}prestashop>payment_execution_3dd021316505c0204989f984246c6ff1'] = 'Nos coordonnées bancaires seront affichées sur la page suivante.'; +$_MODULE['<{bankwire}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Merci de confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{bankwire}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Autres moyens de paiement'; +$_MODULE['<{bankwire}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{bankwire}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{bankwire}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'a bien été enregistrée.'; +$_MODULE['<{bankwire}prestashop>payment_return_1552c5916ccfe019f35d91fd8955755e'] = 'Merci de nous envoyer un virement bancaire avec :'; +$_MODULE['<{bankwire}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'un montant de'; +$_MODULE['<{bankwire}prestashop>payment_return_c51326a2ac458845d579a82a92f111f0'] = 'à l\'ordre de'; +$_MODULE['<{bankwire}prestashop>payment_return_de6d813f05e3916a86b89bd8b1a8a489'] = 'suivant ces détails'; +$_MODULE['<{bankwire}prestashop>payment_return_619b26a60df1af3649d2e8920a7949cd'] = 'à cette banque'; +$_MODULE['<{bankwire}prestashop>payment_return_4fac1f51a5f4b3dd634800fe3d408a45'] = 'N\'oubliez pas d\'indiquer votre numéro de commande'; +$_MODULE['<{bankwire}prestashop>payment_return_4460fcb45ad7a6a61c95293eb611da12'] = 'dans le sujet de votre virement'; +$_MODULE['<{bankwire}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Un email contenant ces informations vous a été envoyé.'; +$_MODULE['<{bankwire}prestashop>payment_return_c4457a9f2f20e39386008bbb2cd3a78f'] = 'Votre commande sera expédiée dès réception de votre virement.'; +$_MODULE['<{bankwire}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{bankwire}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{bankwire}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Nous avons rencontré un problème avec votre commande. Merci de prendre contact avec notre support client'; diff --git a/modules/bankwire/it.php b/modules/bankwire/it.php new file mode 100644 index 000000000..2f13e064d --- /dev/null +++ b/modules/bankwire/it.php @@ -0,0 +1,56 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{bankwire}prestashop>payment_5e1695822fc5af98f6b749ea3cbc9b4c'] = 'Paga con bonifico bancario'; +$_MODULE['<{bankwire}prestashop>payment_eb1d50032721fa4c9d3518c417f91b9d'] = 'Paga con bonifico bancario (l\'elaborazione dell\'ordine sarà più lunga)'; +$_MODULE['<{bankwire}prestashop>payment_execution_c5e8668ba5e211603955f0b5e913d83d'] = 'Pagamento bonifico bancario'; +$_MODULE['<{bankwire}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Sintesi dell\'ordine'; +$_MODULE['<{bankwire}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Il carrello è vuoto.'; +$_MODULE['<{bankwire}prestashop>payment_execution_e40a43534d7f4ece69347847d75401e0'] = 'bonifico bancario'; +$_MODULE['<{bankwire}prestashop>payment_execution_afda466128ee0594745d9f8152699b74'] = 'Hai scelto di pagare con bonifico bancario.'; +$_MODULE['<{bankwire}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Ecco un breve riepilogo del tuo ordine:'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'L\'importo totale del tuo ordine è'; +$_MODULE['<{bankwire}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = '(tasse incl.)'; +$_MODULE['<{bankwire}prestashop>payment_execution_e2c147f82d998eeeb147ae172a31a88e'] = 'Si accettano le valute diverse da inviare tramite bonifico bancario.'; +$_MODULE['<{bankwire}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Scegli una delle seguenti:'; +$_MODULE['<{bankwire}prestashop>payment_execution_2c1ce705702e11fd5e2188c2353c0c86'] = 'Accettiamo le seguente valute da inviare tramite bonifico bancario:'; +$_MODULE['<{bankwire}prestashop>payment_execution_3dd021316505c0204989f984246c6ff1'] = 'Le informazioni sul conto corrente saranno visualizzate nella pagina successiva.'; +$_MODULE['<{bankwire}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Conferma l\'ordine cliccando su \'confermo il mio ordine\''; +$_MODULE['<{bankwire}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Altri metodi di pagamento'; +$_MODULE['<{bankwire}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Confermo il mio ordine'; +$_MODULE['<{bankwire}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine sul'; +$_MODULE['<{bankwire}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completa.'; +$_MODULE['<{bankwire}prestashop>payment_return_1552c5916ccfe019f35d91fd8955755e'] = 'Inviaci un bonifico bancario con:'; +$_MODULE['<{bankwire}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'un importo di'; +$_MODULE['<{bankwire}prestashop>payment_return_c51326a2ac458845d579a82a92f111f0'] = 'al proprietario del conto'; +$_MODULE['<{bankwire}prestashop>payment_return_de6d813f05e3916a86b89bd8b1a8a489'] = 'con questi dati'; +$_MODULE['<{bankwire}prestashop>payment_return_619b26a60df1af3649d2e8920a7949cd'] = 'a questa banca'; +$_MODULE['<{bankwire}prestashop>payment_return_4fac1f51a5f4b3dd634800fe3d408a45'] = 'Ricorda di inserire il tuo n. di ordine '; +$_MODULE['<{bankwire}prestashop>payment_return_4460fcb45ad7a6a61c95293eb611da12'] = 'nella causale del tuo bonifico bancario'; +$_MODULE['<{bankwire}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Ti è stata inviata una e-mail con queste informazioni.'; +$_MODULE['<{bankwire}prestashop>payment_return_c4457a9f2f20e39386008bbb2cd3a78f'] = 'Il tuo ordine verrà inviato non appena avremo ricevuto la tua transazione.'; +$_MODULE['<{bankwire}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{bankwire}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{bankwire}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Abbiamo notato un problema con il tuo ordine. Se pensi che sia un errore, puoi contattare il nostro'; +$_MODULE['<{bankwire}prestashop>bankwire_85ee0d0492a4e37e6c183520f5d59c40'] = 'Bonifico Bancario'; +$_MODULE['<{bankwire}prestashop>bankwire_f652b92eefd4ecfe61ef5fb118157a05'] = 'Accetto pagamenti tramite bonifico bancario'; +$_MODULE['<{bankwire}prestashop>bankwire_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{bankwire}prestashop>bankwire_f05d09f37c9a02f0737c1e71142028a9'] = 'Il proprietario dell\'account e i dati devono essere configurati per usare questo modulo correttamente'; +$_MODULE['<{bankwire}prestashop>bankwire_4402acab1c8f90dcf4a31dc96833bd86'] = 'Nessuna valuta impostata per questo modulo'; +$_MODULE['<{bankwire}prestashop>bankwire_bfa43217dfe8261ee7cb040339085677'] = ' i dati dell\'account sono obbligatori.'; +$_MODULE['<{bankwire}prestashop>bankwire_ccab155f173ac76f79eb192703f86b18'] = 'Il proprietario dell\'account è obbligatorio.'; +$_MODULE['<{bankwire}prestashop>bankwire_444bcb3a3fcf8389296c49467f27e1d6'] = 'ok'; +$_MODULE['<{bankwire}prestashop>bankwire_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{bankwire}prestashop>bankwire_fcec4d73cccd149a2d18695fd8785f88'] = 'Questo modulo ti permette di accettare pagamenti tramite bonifico bancario.'; +$_MODULE['<{bankwire}prestashop>bankwire_b6af2d31afe71aedcceca73cc27fec29'] = 'Se il cliente sceglie questa modalità di pagamento, l\'ordine cambierà il proprio status in \'attesa di pagamento\'.'; +$_MODULE['<{bankwire}prestashop>bankwire_0daeb8f6c1874ec9442e821b524d37c1'] = 'Pertanto, dovrai confermare l\'ordine non appena ricevi il bonifico'; +$_MODULE['<{bankwire}prestashop>bankwire_5dd532f0a63d89c5af0243b74732f63c'] = 'Dati di contatto'; +$_MODULE['<{bankwire}prestashop>bankwire_17e6954ea60d238857324fea1f10b8f3'] = 'Specifica i dati del bonifico bancario per i clienti'; +$_MODULE['<{bankwire}prestashop>bankwire_857216dd1b374de9bf54068fcd78a8f3'] = 'Intestatario del conto'; +$_MODULE['<{bankwire}prestashop>bankwire_3ec365dd533ddb7ef3d1c111186ce872'] = 'Dati'; +$_MODULE['<{bankwire}prestashop>bankwire_6b154cafbab54ba3a1e76a78c290c02a'] = 'Come filiale della banca, codice IBAN, BIC, ecc'; +$_MODULE['<{bankwire}prestashop>bankwire_f9a1a1bb716cbae0503d351ea2af4b34'] = 'Indirizzo della banca'; +$_MODULE['<{bankwire}prestashop>bankwire_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiornare le impostazioni'; + +?> \ No newline at end of file diff --git a/modules/bankwire/logo.gif b/modules/bankwire/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cd6cec1bf9f99dd080b124f68c6f2c8fdfc3835 GIT binary patch literal 1030 zcmd^;*H2S%0EO=jBS<t>XlbDp!O3u-Q3AM%A_e0B6BN{l6;Me?jK~AVg~lC6z(~+2 zVuc{6AYl|ig9Ss2EtXP5sFZ@0G79az<<5@#6aEfQPQHAv=i!JF<D;U*EQkf&fgo2n zI#jawXA!%vm@`nu9eV9EB=Ip+_~<Lb4OJ_3lI@179V2gj|5UU8eqfK)vMsf~Gd2F> z^_+=%&ZN}OEalF$a;IB)NUbkg&qf>lY;^&cl#jIWOz$>YKL$-VtsQHQwtU)&G_F9U z;b_x(v}Kj8b=_=Rg#NuyUlTjp5IfRv@NZMP^{YSH;csgXK)>;4JNcM`k1P0Cmw-?P z5-I^E4?^0*aOHAR9c+_D&VJjBx6d(#=-i6Qw_(a?vTFya38ge!=)OpkOf=oGcSf0x z$wjzQh%4jBt~k6qj#4F1>V23z8C9p^s-r~raY8Ga)gB=<$LQW<y7w5ZJz-I0jmfT| z8Zpr)wrO)P-8o7tru#GL{<HM297>l#{XT6U%*J)O<X|2-d>+?br3drq;ap0WPYqpk z=r7v!mmG#m6N&<}qF`Em!>oFW=^xpLZ`lp^Y`;s0k$c3*efys~cH?c@c-LWk>@+>H zj}|(N&w%N<(^Lw^UpXh9ImRW<afxG6;+&K)b2V4GW-9HIRgS4@W~v&P-!Ya(V39J` zW~cQFWBmfGpTV3UH7=wDpsg;njj^@4kah;?0B8rmIsqmJn2N#G0Q&(j4Is3D><8p8 zhSUMd0R68Crrq7<x38VY{3jqUBLsU1&SuINElu$Z6C}7VsZM^uUXb<{i4WUX<P|+7 zJb&`x{z9ItFyr+bq5qX)EF!kzMk2Jq@1<;0=J%Vo_T=<@g^l}J>=lY_NfRPgcuINT z7|YE=QR3-+=6ww3eo>|O&I6b4<_g6R4wbE66|*u{>AOtq9g+ukJ>;%AEkJ_muJ86- zxFim0KAD{q7@5V(%$AHk2~B=V<d^k?c5_x=Ul<Y!2dAt~yuI0DAh(iL8kO#om+f|{ uyF9+2yrJjGP4%(}QEEA_09p{R<?yZnIO&WB%(=ksO$!pjTnL7tt^WY*3dV5& literal 0 HcmV?d00001 diff --git a/modules/bankwire/payment.php b/modules/bankwire/payment.php new file mode 100644 index 000000000..04be063be --- /dev/null +++ b/modules/bankwire/payment.php @@ -0,0 +1,41 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include(dirname(__FILE__).'/bankwire.php'); + +if (!$cookie->isLogged(true)) + Tools::redirect('index.php?controller=authentication&back=order.php'); +$bankwire = new BankWire(); +echo $bankwire->execPayment($cart); + +include_once(dirname(__FILE__).'/../../footer.php'); + diff --git a/modules/bankwire/payment.tpl b/modules/bankwire/payment.tpl new file mode 100644 index 000000000..1f1be2df8 --- /dev/null +++ b/modules/bankwire/payment.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="payment_module"> + <a href="{$this_path_ssl}payment.php" title="{l s='Pay by bank wire' mod='bankwire'}"> + <img src="{$this_path}bankwire.jpg" alt="{l s='Pay by bank wire' mod='bankwire'}" width="86" height="49"/> + {l s='Pay by bank wire (order process will be longer)' mod='bankwire'} + </a> +</p> \ No newline at end of file diff --git a/modules/bankwire/payment_execution.tpl b/modules/bankwire/payment_execution.tpl new file mode 100644 index 000000000..3f3a438b4 --- /dev/null +++ b/modules/bankwire/payment_execution.tpl @@ -0,0 +1,80 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Bank wire payment' mod='bankwire'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +<h2>{l s='Order summary' mod='bankwire'}</h2> + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +{if $nbProducts <= 0} + <p class="warning">{l s='Your shopping cart is empty.'}</p> +{else} + +<h3>{l s='Bank wire payment' mod='bankwire'}</h3> +<form action="{$this_path_ssl}validation.php" method="post"> +<p> + <img src="{$this_path}bankwire.jpg" alt="{l s='bank wire' mod='bankwire'}" width="86" height="49" style="float:left; margin: 0px 10px 5px 0px;" /> + {l s='You have chosen to pay by bank wire.' mod='bankwire'} + <br/><br /> + {l s='Here is a short summary of your order:' mod='bankwire'} +</p> +<p style="margin-top:20px;"> + - {l s='The total amount of your order is' mod='bankwire'} + <span id="amount" class="price">{displayPrice price=$total}</span> + {if $use_taxes == 1} + {l s='(tax incl.)' mod='bankwire'} + {/if} +</p> +<p> + - + {if $currencies|@count > 1} + {l s='We accept several currencies to be sent by bank wire.' mod='bankwire'} + <br /><br /> + {l s='Choose one of the following:' mod='bankwire'} + <select id="currency_payement" name="currency_payement" onchange="setCurrency($('#currency_payement').val());"> + {foreach from=$currencies item=currency} + <option value="{$currency.id_currency}" {if $currency.id_currency == $cust_currency}selected="selected"{/if}>{$currency.name}</option> + {/foreach} + </select> + {else} + {l s='We accept the following currency to be sent by bank wire:' mod='bankwire'}&nbsp;<b>{$currencies.0.name}</b> + <input type="hidden" name="currency_payement" value="{$currencies.0.id_currency}" /> + {/if} +</p> +<p> + {l s='Bank wire account information will be displayed on the next page.' mod='bankwire'} + <br /><br /> + <b>{l s='Please confirm your order by clicking \'I confirm my order\'' mod='bankwire'}.</b> +</p> +<p class="cart_navigation"> + <a href="{$link->getPageLink('order', true, NULL, "step=3")}" class="button_large">{l s='Other payment methods' mod='bankwire'}</a> + <input type="submit" name="submit" value="{l s='I confirm my order' mod='bankwire'}" class="exclusive_large" /> +</p> +</form> +{/if} diff --git a/modules/bankwire/payment_return.tpl b/modules/bankwire/payment_return.tpl new file mode 100644 index 000000000..1fc35abb6 --- /dev/null +++ b/modules/bankwire/payment_return.tpl @@ -0,0 +1,45 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $status == 'ok'} + <p>{l s='Your order on' mod='bankwire'} <span class="bold">{$shop_name}</span> {l s='is complete.' mod='bankwire'} + <br /><br /> + {l s='Please send us a bank wire with:' mod='bankwire'} + <br /><br />- {l s='an amount of' mod='bankwire'} <span class="price">{$total_to_pay}</span> + <br /><br />- {l s='to the account owner of' mod='bankwire'} <span class="bold">{if $bankwireOwner}{$bankwireOwner}{else}___________{/if}</span> + <br /><br />- {l s='with these details' mod='bankwire'} <span class="bold">{if $bankwireDetails}{$bankwireDetails}{else}___________{/if}</span> + <br /><br />- {l s='to this bank' mod='bankwire'} <span class="bold">{if $bankwireAddress}{$bankwireAddress}{else}___________{/if}</span> + <br /><br />- {l s='Do not forget to insert your order #' mod='bankwire'} <span class="bold">{$id_order}</span> {l s='in the subject of your bank wire' mod='bankwire'} + <br /><br />{l s='An e-mail has been sent to you with this information.' mod='bankwire'} + <br /><br /><span class="bold">{l s='Your order will be sent as soon as we receive your settlement.' mod='bankwire'}</span> + <br /><br />{l s='For any questions or for further information, please contact our' mod='bankwire'} <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='bankwire'}</a>. + </p> +{else} + <p class="warning"> + {l s='We noticed a problem with your order. If you think this is an error, you can contact our' mod='bankwire'} + <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='bankwire'}</a>. + </p> +{/if} diff --git a/modules/bankwire/validation.php b/modules/bankwire/validation.php new file mode 100644 index 000000000..9ff50d20c --- /dev/null +++ b/modules/bankwire/validation.php @@ -0,0 +1,52 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7483 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include(dirname(__FILE__).'/bankwire.php'); + +$bankwire = new BankWire(); + +if ($cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$bankwire->active) + Tools::redirect('index.php?controller=order&step=1'); + +$customer = new Customer((int)$cart->id_customer); + +if (!Validate::isLoadedObject($customer)) + Tools::redirect('index.php?controller=order&step=1'); + +$currency = new Currency(Tools::getValue('currency_payement', false) ? Tools::getValue('currency_payement') : $cookie->id_currency); +$total = (float)($cart->getOrderTotal(true, Cart::BOTH)); +$mailVars = array( + '{bankwire_owner}' => Configuration::get('BANK_WIRE_OWNER'), + '{bankwire_details}' => nl2br(Configuration::get('BANK_WIRE_DETAILS')), + '{bankwire_address}' => nl2br(Configuration::get('BANK_WIRE_ADDRESS')) +); + +$bankwire->validateOrder($cart->id, _PS_OS_BANKWIRE_, $total, $bankwire->displayName, NULL, $mailVars, (int)$currency->id, false, $customer->secure_key); +$order = new Order($bankwire->currentOrder); +Tools::redirect('index.php?controller=order-confirmation&id_cart='.$cart->id.'&id_module='.$bankwire->id.'&id_order='.$bankwire->currentOrder.'&key='.$customer->secure_key); diff --git a/modules/birthdaypresent/birthdaypresent.php b/modules/birthdaypresent/birthdaypresent.php new file mode 100644 index 000000000..91ed0c148 --- /dev/null +++ b/modules/birthdaypresent/birthdaypresent.php @@ -0,0 +1,148 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BirthdayPresent extends Module +{ + private $_html = ''; + + function __construct() + { + $this->name = 'birthdaypresent'; + $this->tab = 'pricing_promotion'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Birthday Present'); + $this->description = $this->l('Offer your clients birthday presents automatically'); + + } + + public function getContent() + { + global $cookie, $currentIndex; + + if (Tools::isSubmit('submitBirthday')) + { + Configuration::updateValue('BIRTHDAY_ACTIVE', (int)(Tools::getValue('bp_active'))); + Configuration::updateValue('BIRTHDAY_DISCOUNT_TYPE', (int)(Tools::getValue('id_discount_type'))); + Configuration::updateValue('BIRTHDAY_DISCOUNT_VALUE', (float)(Tools::getValue('discount_value'))); + Configuration::updateValue('BIRTHDAY_MINIMAL_ORDER', (float)(Tools::getValue('minimal_order'))); + Tools::redirectAdmin($currentIndex.'&configure=birthdaypresent&token='.Tools::getValue('token').'&conf=4'); + } + + $this->_html = ' + <fieldset class="width3"><legend><img src="../modules/'.$this->name.'/logo.gif" /> '.$this->displayName.'</legend> + <p>'.$this->l('Create a voucher for customers celebrating their birthday and having at least one valid order').'</p> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post" style="margin-top: 15px;"> + <label>'.$this->l('Active').'</label> + <div class="margin-form"> + <img src="../img/admin/enabled.gif" /> <input type="radio" name="bp_active" value="1"'.(Configuration::get('BIRTHDAY_ACTIVE') ? ' checked="checked"' : '').' /> + <img src="../img/admin/disabled.gif" /> <input type="radio" name="bp_active" value="0"'.(!Configuration::get('BIRTHDAY_ACTIVE') ? ' checked="checked"' : '').' /> + <p style="clear: both;">'.$this->l('Additionally, you have to set a CRON rule which calls the file').'<br />'.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/birthdaypresent/cron.php '.$this->l('every day').'</p> + </div> + <label>'.$this->l('Type').'</label> + <div class="margin-form"> + <select name="id_discount_type">'; + $discountTypes = Discount::getDiscountTypes((int)($cookie->id_lang)); + foreach ($discountTypes AS $discountType) + $this->_html .= '<option value="'.(int)($discountType['id_discount_type']).'"'.((Configuration::get('BIRTHDAY_DISCOUNT_TYPE') == $discountType['id_discount_type']) ? ' selected="selected"' : '').'>'.$discountType['name'].'</option>'; + $this->_html .= ' + </select> + </div> + <label>'.$this->l('Value').'</label> + <div class="margin-form"> + <input type="text" size="15" name="discount_value" value="'.Configuration::get('BIRTHDAY_DISCOUNT_VALUE').'" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\'); " /> + <p style="clear: both;">'.$this->l('Either the monetary amount or the %, depending on Type selected above').'</p> + </div> + <label>'.$this->l('Minimum order').'</label> + <div class="margin-form"> + <input type="text" size="15" name="minimal_order" value="'.Configuration::get('BIRTHDAY_MINIMAL_ORDER').'" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\'); " /> + <p style="clear: both;">'.$this->l('The minimum order amount needed to use the voucher').'</p> + </div> + <div class="clear center"> + <input type="submit" value="'.$this->l(' Save ').'" name="submitBirthday" class="button" /> + </div> + <div class="small"><sup>*</sup> '.$this->l('Required field').'</div> + </form> + </fieldset><br /> + <fieldset class="width3"><legend><img src="../modules/'.$this->name.'/comment.gif" /> '.$this->l('Guide').'</legend> + <h2>'.$this->l('Develop clients\' loyalty').'</h2> + <p>'.$this->l('Offering a present to a client is a means of securing their loyalty.').'</p> + <h3>'.$this->l('What should you do?').'</h3> + <p> + '.$this->l('Keeping a client is more profitable than capturing a new one. Thus, it is necessary to develop their loyalty, in other words to make them want to come back to your webshop.').' <br /> + '.$this->l('Word of mouth is also a means to get new satisfied clients; a dissatisfied one won\'t attract new clients.').'<br /> + '.$this->l('In order to achieve this goal you can organize: ').' + <ul> + <li>'.$this->l('Punctual operations: commercial rewards (personalized special offers, product or service offered), non commercial rewards (priority handling of an order or a product), pecuniary rewards (bonds, discount coupons, payback...).').'</li> + <li>'.$this->l('Sustainable operations: loyalty or points cards, which not only justify communication between merchant and client, but also offer advantages to clients (private offers, discounts).').'</li> + </ul> + '.$this->l('These operations encourage clients to buy and also to come back to your webshop regularly.').' <br /> + </p> + </fieldset>'; + return $this->_html; + } + + public function createTodaysVouchers() + { + $users = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT c.id_customer, firstname, lastname, email + FROM '._DB_PREFIX_.'customer c + LEFT JOIN '._DB_PREFIX_.'orders o ON (c.id_customer = o.id_customer) + WHERE o.valid = 1 + AND c.birthday LIKE \'%'.date('-m-d').'\''); + + foreach ($users as $user) + { + $voucher = new Discount(); + $voucher->id_customer = (int)($user['id_customer']); + $voucher->id_discount_type = (int)(Configuration::get('BIRTHDAY_DISCOUNT_TYPE')); + $voucher->name = 'BIRTHDAY-'.(int)($voucher->id_customer).'-'.date('Y'); + $voucher->description[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('Your birthday present !'); + $voucher->value = Configuration::get('BIRTHDAY_DISCOUNT_VALUE'); + $voucher->quantity = 1; + $voucher->quantity_per_user = 1; + $voucher->cumulable = 1; + $voucher->cumulable_reduction = 1; + $voucher->date_from = date('Y-m-d'); + $voucher->date_to = strftime('%Y-%m-%d', strtotime('+1 month')); + $voucher->minimal = Configuration::get('BIRTHDAY_MINIMAL_ORDER'); + $voucher->active = true; + if ($voucher->add()) + Mail::Send((int)(Configuration::get('PS_LANG_DEFAULT')), 'birthday', Mail::l('Happy birthday!'), array('{firstname}' => $user['firstname'], '{lastname}' => $user['lastname']), $user['email'], NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + else + echo Db::getInstance()->getMsgError(); + } + } +} + diff --git a/modules/birthdaypresent/comment.gif b/modules/birthdaypresent/comment.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bc9233ea63c89d52a99494dd0f0735a29a3ec3b GIT binary patch literal 413 zcmV;O0b>4%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzFG)l}R5;6H z`2YVu10|S&Y6e8K?+^mwr9k`>i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r><FgO{{yzq4e(?6+|GQAl*I)eofAtx}fX-ECK?ZnZHQ*^w^P_iA z&9DFczx5KL`3g|;#V5E8fO`St{QE##@4Wu||0YoLwda5TUj}Nv@C0PQAFu(ni%x(H zu*4dOAVZJ=$Tb%p{{<V27Kog<qVW$b%I5C43ODHe=O17`Q2a91XvBtr3hz9B_Z6n` zI}q0rof3hHduMLD0@C;ehzm(d%0LZDKzt8~Q|Ol$2Fw5e_lplAzT#>N00000NkvXX Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/modules/birthdaypresent/config.xml b/modules/birthdaypresent/config.xml new file mode 100755 index 000000000..030a3e053 --- /dev/null +++ b/modules/birthdaypresent/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>birthdaypresent</name> + <displayName><![CDATA[Birthday Present]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Offer your clients birthday presents automatically]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[pricing_promotion]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/birthdaypresent/cron.php b/modules/birthdaypresent/cron.php new file mode 100644 index 000000000..06525c582 --- /dev/null +++ b/modules/birthdaypresent/cron.php @@ -0,0 +1,40 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/birthdaypresent.php'); + +if (!Configuration::get('BIRTHDAY_ACTIVE')) + die ('Birthday present not active'); +if (Configuration::get('BIRTHDAY_DATE_UPD') == date('Y-m-d')) + die ('Birthday already wished'); +Configuration::updateValue('BIRTHDAY_DATE_UPD', date('Y-m-d')); +$module = new BirthdayPresent(); +$module->createTodaysVouchers(); +die ('OK'); + diff --git a/modules/birthdaypresent/de.php b/modules/birthdaypresent/de.php new file mode 100644 index 000000000..ae1227973 --- /dev/null +++ b/modules/birthdaypresent/de.php @@ -0,0 +1,30 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_c2796655c25e1b0b8582716036aece08'] = 'Geburtstagsgeschenk'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d1f5899bf2af57ed816390d9d740daf6'] = 'Bieten Sie Ihren Kunden automatisch Geburtstagsgeschenke an'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_ccfcf858237a83953c1ac03b5abde35e'] = 'Erstellen Sie einen Gutschein für Kunden, die Geburtstag haben und mind. eine Bestellung bereits getätigt haben.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Aktiv'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_52292d2f9c39936bc72fbd47a3060df3'] = 'Sie müssen zusätzlich eine cron-Regel einstellen, die die Datei aufruft'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f7e78e04cba74c610354e91e622cc105'] = 'jeden Tag'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Typ'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_689202409e48743b914713f96d93947c'] = 'Wert'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_998d08a9606f9656e8d1fcab8b762155'] = 'Entweder den Geldbetrag oder den Prozentsatz, je nach oben ausgewähltem Typ'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_1f0084a1581c05622120bd827305f173'] = 'Mindestbestellung'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_783d0f2960c7c628177f740ce38ec3e7'] = 'Mindestbestellwert, um den Gutschein nutzen zu können'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_38fb7d24e0d60a048f540ecb18e13376'] = 'Speichern'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_19f823c6453c2b1ffd09cb715214813d'] = 'Pflichtfeld'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_cb21e843b037359d0fb5b793fccf964f'] = 'Kundenbindung ausbauen'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d725bab433ae44aee759eb82a24b09de'] = 'Kundengeschenke sind ein Mittel zur Kundenbindung.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_0dc42f38b35e45090e1a1c94755c2d43'] = 'Was müssen Sie tun?'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a3729d34db57cdeabe59a1fe78644458'] = 'Wiederkehrender Kunden zu pflegen ist profitabler, als immer neue zu gewinnen. Daher ist es empfehlenswert, deren Vertrauen aufzubauen und ihnen das Wiederkommen so angenehm wie möglich zu gestalten.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_7b6ac3f2cdb42a4462ff7ca3c4358f71'] = 'Ein guter Ruf ist ebenso ein Mittel, zufriedene Kunden zu bekommen; ein unzufriedener Kunde zieht keine Neukunden an.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_410008089d5bb723438103a84d48a59c'] = 'Um dieses Ziel zu erreichen, können Sie Folgendes organisieren:'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_3e788301a1b0ce341aa5ce15bc520545'] = 'Punktuelle Aktionen: kommerzielle Vergünstigungen (persönliche Sonderangebote, Gratis-Produkte oder -Services), nicht-kommerzielle Vergütungen (bevorzugte Behandlung einer Bestellung oder eines Produkts), geldliche Vergünstigungen (Gutscheine, Ermäßigungsgutscheine, PayBack...)'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f299b58558601a85c98a2d1d7867d523'] = 'Nachhaltige Aktionen: Treue- oder Kundenkarte, die nicht nur der Kommunikation zwischen Händler und Kunden dient, sondern Kunden auch Vorteile bietet (Persönliche Angebote, Ermäßigungen).'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d434c183a411611f50fa7e121b0f6565'] = 'Diese Operation bewegt die Kunden dazu, in IHrem Shop regelmäßig einzukaufen.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d46bd07675d08116e85f8a4c7866de53'] = 'Ihr Geburtstagsgeschenk!'; + +?> \ No newline at end of file diff --git a/modules/birthdaypresent/en.php b/modules/birthdaypresent/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/birthdaypresent/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/birthdaypresent/es.php b/modules/birthdaypresent/es.php new file mode 100644 index 000000000..b193021ef --- /dev/null +++ b/modules/birthdaypresent/es.php @@ -0,0 +1,28 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_c2796655c25e1b0b8582716036aece08'] = 'Regalo de cumpleaños'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d1f5899bf2af57ed816390d9d740daf6'] = 'Haga a sus clientes regalos de cumpleaños automáticamente'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_ccfcf858237a83953c1ac03b5abde35e'] = 'Crear un bono para los clientes que celebran su cumpleaños y que tiene por lo menos un pedido válido'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Activo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_52292d2f9c39936bc72fbd47a3060df3'] = 'Adicionalemente, debe establecer una regla CRON que pida el archivo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f7e78e04cba74c610354e91e622cc105'] = 'todos los días'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Tipo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_689202409e48743b914713f96d93947c'] = 'Valor'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_998d08a9606f9656e8d1fcab8b762155'] = 'cantidad monetaria o porcentaje dependiendo del tipo seleccionado anteriormente'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_1f0084a1581c05622120bd827305f173'] = 'Pedido mínimo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_783d0f2960c7c628177f740ce38ec3e7'] = 'Cantidad de pedido mínimo para utilizar el vale'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_38fb7d24e0d60a048f540ecb18e13376'] = 'Guardar'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_19f823c6453c2b1ffd09cb715214813d'] = 'Archivo necesario'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_cb21e843b037359d0fb5b793fccf964f'] = 'Desarrolle la fidelización de sus clientes'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d725bab433ae44aee759eb82a24b09de'] = 'Haciendo regalos a sus clientes está seguro de fidelizarlos.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_0dc42f38b35e45090e1a1c94755c2d43'] = '¿Cómo hacer?'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a3729d34db57cdeabe59a1fe78644458'] = 'Conservar un cliente es más ventajoso que captar uno nuevo. Así, es necesario desarrollar su lealtad, es decir hacer todo lo posible para que vuelva a su tienda.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_7b6ac3f2cdb42a4462ff7ca3c4358f71'] = 'El boca a boca es uno de los mejores métodos para conseguir nuevos clientes satisfechos; un cliente contento atraerá otros nuevos clientes.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_410008089d5bb723438103a84d48a59c'] = 'Para alcanzar este objetivo usted puede organizar:'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_3e788301a1b0ce341aa5ce15bc520545'] = 'Operaciones puntuales: recompensas comerciales (ofertas especiales personalizadas, producto o servicios ofrecidos), recompensas no comerciales (prioridad en el envío de un pedido o de un producto), recompensas pecuniarias (enlaces, cupones del descuento, prioridad en el reembolso...).'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f299b58558601a85c98a2d1d7867d523'] = 'Operaciones sostenibles: las tarjetas de fidelidad o de puntos, que no sólo justifican la comunicación entre el comerciante y el cliente, pero también ofrecen ventajas a los clientes (ofertas, descuentos privados).'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d434c183a411611f50fa7e121b0f6565'] = 'Estas operaciones animan a los clientes a comprar y también a volver a su tienda en línea frecuentemente.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d46bd07675d08116e85f8a4c7866de53'] = '¡Su regalo de cumpleaños!'; diff --git a/modules/birthdaypresent/fr.php b/modules/birthdaypresent/fr.php new file mode 100644 index 000000000..8f83d2582 --- /dev/null +++ b/modules/birthdaypresent/fr.php @@ -0,0 +1,28 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_c2796655c25e1b0b8582716036aece08'] = 'Cadeau d\'anniversaire'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d1f5899bf2af57ed816390d9d740daf6'] = 'Offrez automatiquement à vos clients des cadeaux d\'anniversaire'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_ccfcf858237a83953c1ac03b5abde35e'] = 'Créer un bon de réduction pour les clients fêtant leur anniversaire et ayant au moins une commande valide'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Actif'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_52292d2f9c39936bc72fbd47a3060df3'] = 'De plus, vous devez installer une règle CRON qui appellera le fichier'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f7e78e04cba74c610354e91e622cc105'] = 'chaque jour'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Type'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_689202409e48743b914713f96d93947c'] = 'Valeur'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_998d08a9606f9656e8d1fcab8b762155'] = 'Soit le montant soit le pourcentage selon votre choix précédent'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_1f0084a1581c05622120bd827305f173'] = 'Commande minimum'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_783d0f2960c7c628177f740ce38ec3e7'] = 'Montant minimum de la commande pour que le bon soit utilisable'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_38fb7d24e0d60a048f540ecb18e13376'] = 'Sauvegarder'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_19f823c6453c2b1ffd09cb715214813d'] = 'Champ requis'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_cb21e843b037359d0fb5b793fccf964f'] = 'Fidéliser le client'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d725bab433ae44aee759eb82a24b09de'] = 'Offrir un cadeau d\'anniversaire à un client est une manière comme une autre d\'agir sur sa fidélité.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_0dc42f38b35e45090e1a1c94755c2d43'] = 'Que faire ?'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a3729d34db57cdeabe59a1fe78644458'] = 'Garder un client est plus rentable que d’en conquérir un nouveau. Il est donc impératif de le fidéliser, c\'est-à-dire de le faire revenir sur votre boutique. '; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_7b6ac3f2cdb42a4462ff7ca3c4358f71'] = 'Le bouche à oreille est également un moyen d\'avoir de nouveaux clients satisfaits ; car un client non satisfait n\'en attirera pas de nouveaux. '; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_410008089d5bb723438103a84d48a59c'] = 'Pour y parvenir, plusieurs moyens existent :'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_3e788301a1b0ce341aa5ce15bc520545'] = 'Les opérations ponctuelles : les récompenses marchandes (offres promotionnelles ciblées et personnalisées, cadeaux -produit ou service offert-), les récompenses non marchandes (traitement prioritaire d\'une commande ou d\'un produit), les récompenses pécuniaires (bons d\'achat, de réduction, de remboursement). '; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f299b58558601a85c98a2d1d7867d523'] = 'Les opérations pérennes : (carte de fidélité, points de fidélité) qui non seulement justifient la communication marchand-clients, et aussi offre des avantages aux clients (offres privatives, réductions).'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d434c183a411611f50fa7e121b0f6565'] = 'Ces opérations encouragent les clients à acheter et aussi à revenir sur votre boutique en ligne régulièrement.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d46bd07675d08116e85f8a4c7866de53'] = 'Votre cadeau d\'anniversaire !'; diff --git a/modules/birthdaypresent/it.php b/modules/birthdaypresent/it.php new file mode 100644 index 000000000..a15f735f7 --- /dev/null +++ b/modules/birthdaypresent/it.php @@ -0,0 +1,30 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_c2796655c25e1b0b8582716036aece08'] = 'Regalo di compleanno'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d1f5899bf2af57ed816390d9d740daf6'] = 'Offri automaticamente ai tuoi clienti dei regali di compleanno '; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_ccfcf858237a83953c1ac03b5abde35e'] = 'Creare un voucher per i clienti che festeggiano il loro compleanno e che abbia almeno un ordine valido'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Attivo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_52292d2f9c39936bc72fbd47a3060df3'] = 'Inoltre, devi impostare una regola CRON che chiama il file'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f7e78e04cba74c610354e91e622cc105'] = 'tutti i giorni'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Tipo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_689202409e48743b914713f96d93947c'] = 'Valore'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_998d08a9606f9656e8d1fcab8b762155'] = 'L\'importo o la %, a seconda del tipo selezionato sopra'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_1f0084a1581c05622120bd827305f173'] = 'Ordine minimo'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_783d0f2960c7c628177f740ce38ec3e7'] = 'Importo minimo di ordine necessario per utilizzare il voucher'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_38fb7d24e0d60a048f540ecb18e13376'] = 'Salva'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_19f823c6453c2b1ffd09cb715214813d'] = 'Campi obbligatori'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_cb21e843b037359d0fb5b793fccf964f'] = 'Sviluppa la fedeltà dei clienti '; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d725bab433ae44aee759eb82a24b09de'] = 'Offrire un regalo a un cliente è un mezzo per ottenere la sua fedeltà.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_0dc42f38b35e45090e1a1c94755c2d43'] = 'Cosa devo fare?'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_a3729d34db57cdeabe59a1fe78644458'] = 'Mantenere un cliente è più redditizio di conquistarne uno nuovo. Pertanto, è importante svilupparne la fedeltà, in altre parole, cercare di farlo tornare al tuo negozio online.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_7b6ac3f2cdb42a4462ff7ca3c4358f71'] = 'Il passaparola è anche un mezzo per ottenere nuovi clienti soddisfatti; un cliente insoddisfatto non attira nuovi clienti.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_410008089d5bb723438103a84d48a59c'] = 'Per raggiungere questo obiettivo è possibile organizzare:'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_3e788301a1b0ce341aa5ce15bc520545'] = 'Operazioni regolari: premi commerciali (offerte speciali personalizzate, prodotto o servizio offerto), premi non commerciale (gestione prioritaria di un ordine o di un prodotto), premi pecuniari (obbligazioni, buoni sconto, reinvestimenti ...).'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_f299b58558601a85c98a2d1d7867d523'] = 'Operazioni sostenibili: carte fedeltà o punti, che non solo giustificano la comunicazione tra commerciante e cliente, ma offre anche vantaggi ai clienti (offerte private, sconti).'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d434c183a411611f50fa7e121b0f6565'] = 'Queste operazioni incoraggiano i clienti a comprare e a tornare al tuo negozio online regolarmente.'; +$_MODULE['<{birthdaypresent}prestashop>birthdaypresent_d46bd07675d08116e85f8a4c7866de53'] = 'Il tuo regalo di compleanno!'; + +?> \ No newline at end of file diff --git a/modules/birthdaypresent/logo.gif b/modules/birthdaypresent/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ef151aeef90cba37e483fff6db393e3f3c215a0 GIT binary patch literal 676 zcmV;V0$crwP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Hc3Q5R5;6p zQ{QV+Q5^TFo_gy~@FnP>zhG}s4?zzVdkG3gj2<%zA*q!$2x>uX%NDCytJWaYrPXj4 zU1!!qgC^xq+`MO3-MxA@QLjVPPv?85H*G=(KHPIYzrN>QxF!Im4#IxZ@krPd?&kid z_ZSiplU6Pr0XN$E74*}446)Vy(5l0Tt?p~}o7mB#KX>&#1@D#~Be*<>IiI~I2tp#x z12i!dI9uRn_jAuUmOh`s_#3O#Q@}+t$Jn&L2-mkQOn%5i(=-?p`Lj?c!2VW(<D-m= z6G??KM!{FX<7ABC$)bY!po$5v0$R@ZyAx+Tqx$*UO9>AbHes1cgEB@zPzW^m!s{<8 zH^}g>l=Q%z`79itWZZZq>1T&4kE_!Ru7HeXVR6SO2noJcy<W$^>-wyON8U|XUoeAf zHk*)T8OiUqhEc#)EX_nb3VMysq8mBfIar@DEC@xNQ&ko5*l*<1J}BWse+#xk2O71^ zZKRS>{bS{FIWTbz8yidq6)TE@^|cgAnWrExWsHLC$l+FDW*C*!T_{XINt{JZ95tYc z_p#09P!;b%OW8qQ$`}Pj@4<%r;2b2&DJYXe*!EsR<%dl-6KGEyY2+a<Wx8Ksr<S>e zQs4@dsSC*31|bfe!20Q<I%rQEY2+a<Wx5NT<zFYcaI@#?eZf8CrA&8$nPZHjR*oD) zC4L@S`Z70<=%77uq>-oXHShTsI61&!<8X5%II3+V+8k*E-I+hzUk`L)aOtuD0000< KMNUMnLSTY|9xOrt literal 0 HcmV?d00001 diff --git a/modules/birthdaypresent/mails/de/birthday.html b/modules/birthdaypresent/mails/de/birthday.html new file mode 100644 index 000000000..3df4c64a5 --- /dev/null +++ b/modules/birthdaypresent/mails/de/birthday.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Alles Gute zum Geburtstag von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{shop_name} w&uuml;nscht Ihnen alles Gute zum Geburtstag und m&ouml;chte Ihnen ein Geschenk machen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"> +<p>Es wartet eine &Uuml;berraschung auf Sie... melden Sie sich jetzt bei Ihrem Konto an, um Ihren Erm&auml;&szlig;igungsgutschein zu sehen!<br />Und viel Spa&szlig; beim Einl&ouml;sen!</p> +<br /><br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/birthdaypresent/mails/de/birthday.txt b/modules/birthdaypresent/mails/de/birthday.txt new file mode 100644 index 000000000..548994cff --- /dev/null +++ b/modules/birthdaypresent/mails/de/birthday.txt @@ -0,0 +1,5 @@ +Hallo {firstname} {lastname}, + +{shop_name} wünscht Ihnen alles Gute zum Geburtstag und möchte Ihnen ein Geschenk machen. Es wartet eine Überraschung auf Sie... melden Sie sich jetzt bei Ihrem Konto an, um Ihren Ermäßigungsgutschein zu sehen! + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/birthdaypresent/mails/en/birthday.html b/modules/birthdaypresent/mails/en/birthday.html new file mode 100644 index 000000000..ea53ece7e --- /dev/null +++ b/modules/birthdaypresent/mails/en/birthday.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Happy Birthday! from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{shop_name} wants to wish you a Happy Birthday and offers you a present.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <p>A surprise is waiting for you... log now on your account to see your discount voucher!<br /> + And put it to good use!</p> + <br /><br /> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered by <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/birthdaypresent/mails/en/birthday.txt b/modules/birthdaypresent/mails/en/birthday.txt new file mode 100644 index 000000000..fd1c40c03 --- /dev/null +++ b/modules/birthdaypresent/mails/en/birthday.txt @@ -0,0 +1,7 @@ +Hi {firstname} {lastname}, + +{shop_name} wants to wish you a Happy Birthday and offers you a present. +A surprise is waiting for you... log now on your account to see your discount voucher. And put it to good use! + + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/birthdaypresent/mails/es/birthday.html b/modules/birthdaypresent/mails/es/birthday.html new file mode 100644 index 000000000..806b368c0 --- /dev/null +++ b/modules/birthdaypresent/mails/es/birthday.html @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>¡Feliz cumpleaños! desde {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{shop_name} les desea un feliz cumplea&ntilde;os y le ofrece un regalo.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"> +<p>Una sorpresa le espera ... Registrarse ahora en su cuenta para ver su bono de descuento!<br />Y ponerlo a buen uso!</p> +<br /><br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered by <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/birthdaypresent/mails/es/birthday.txt b/modules/birthdaypresent/mails/es/birthday.txt new file mode 100644 index 000000000..3ff12e4cf --- /dev/null +++ b/modules/birthdaypresent/mails/es/birthday.txt @@ -0,0 +1,6 @@ +Hola {firstname} {lastname}, + +{shop_name} les desea un feliz cumpleaños y le ofrece un regalo. +Una sorpresa le espera ... Registrarse ahora en su cuenta para ver su bono de descuento. Y ponerlo a buen uso! + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/birthdaypresent/mails/fr/birthday.html b/modules/birthdaypresent/mails/fr/birthday.html new file mode 100644 index 000000000..79a008dc7 --- /dev/null +++ b/modules/birthdaypresent/mails/fr/birthday.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>{shop_name} vous souhaite un bon anniversaire !</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{shop_name} vous souhaite un tr&egrave;s bon anniversaire et vous offre un cadeau.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <p>Une surprise vous attend... Connectez-vous d&egrave;s maintenant sur votre compte pour acc&eacute;der &agrave; votre bon de r&eacute;duction.<br /> + Faites-en bon usage!</p> + <br /><br /> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> réalisé par <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/birthdaypresent/mails/fr/birthday.txt b/modules/birthdaypresent/mails/fr/birthday.txt new file mode 100644 index 000000000..c878e232f --- /dev/null +++ b/modules/birthdaypresent/mails/fr/birthday.txt @@ -0,0 +1,7 @@ +Bonjour {firstname} {lastname}, + +{shop_name} vous souhaite un très bon anniversaire et vous offre un cadeau. +Une surprise vous attend... Connectez-vous dès maintenant sur votre compte pour accéder à votre bon de réduction. Faites-en bon usage! + + +{shop_url} Réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/birthdaypresent/mails/it/birthday.html b/modules/birthdaypresent/mails/it/birthday.html new file mode 100644 index 000000000..b54ce21a8 --- /dev/null +++ b/modules/birthdaypresent/mails/it/birthday.html @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Buon Compleanno! da {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{shop_name} ti augura Buon Compleanno e vuole farti un regalo.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"> +<p>Ti aspetta una sorpresa... collegati subito al tuo account per vedere il tuo buono sconto!<br />E approfittane subito!</p> +<br /><br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered by <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/birthdaypresent/mails/it/birthday.txt b/modules/birthdaypresent/mails/it/birthday.txt new file mode 100644 index 000000000..6769f7093 --- /dev/null +++ b/modules/birthdaypresent/mails/it/birthday.txt @@ -0,0 +1,7 @@ +Salve {firstname} {lastname}, + +{shop_name} ti augura Buon Compleanno e vuole farti un regalo. +Ti aspetta una sorpresa... collegati subito al tuo account per vedere il tuo buono sconto! + + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blockadvertising/advertising.jpg b/modules/blockadvertising/advertising.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56ce3427a657ad49b37a081da1d3e481f3811e00 GIT binary patch literal 8363 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 literal 0 HcmV?d00001 diff --git a/modules/blockadvertising/blockadvertising.php b/modules/blockadvertising/blockadvertising.php new file mode 100644 index 000000000..6a1dd5d35 --- /dev/null +++ b/modules/blockadvertising/blockadvertising.php @@ -0,0 +1,230 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockAdvertising extends Module +{ + public $adv_link; + + /** + * adv_title contains string for title and alt attributes + * + * @var mixed + */ + public $adv_title; + /** + * adv_img contains url to the image to display. + * + * @var mixed + */ + public $adv_img; + + /** + * adv_imgname is the filename of the image to display + * @TODO make it configurable for SEO, but need a function to clean filename + * @var string + */ + public $adv_imgname = 'advertising_custom'; + + public function __construct() + { + $this->name = 'blockadvertising'; + $this->tab = 'advertising_marketing'; + $this->version = 0.3; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Block advertising'); + $this->description = $this->l('Adds a block to display an advertisement.'); + + if (!file_exists(_PS_MODULE_DIR_.$this->name.'/'.$this->adv_imgname.'.'.Configuration::get('BLOCKADVERT_IMG_EXT'))) + { + $this->adv_imgname = 'advertising'; + if (!file_exists(_PS_MODULE_DIR_.$this->name.'/advertising.jpg')) + $this->adv_imgname = ''; + else + Configuration::updateValue('BLOCKADVERT_IMG_EXT','jpg'); + } + + if (!empty($this->adv_imgname)) + $this->adv_img = Tools::getMediaServer($this->name)._MODULE_DIR_.$this->name.'/'.$this->adv_imgname.'.'.Configuration::get('BLOCKADVERT_IMG_EXT'); + + $this->adv_link = htmlentities(Configuration::get('BLOCKADVERT_LINK'), ENT_QUOTES, 'UTF-8'); + $this->adv_title = htmlentities(Configuration::get('BLOCKADVERT_TITLE'), ENT_QUOTES, 'UTF-8'); + } + + + public function install() + { + Configuration::updateValue('BLOCKADVERT_LINK', 'http://www.prestashop.com'); + if (!parent::install()) + return false; + if (!$this->registerHook('leftColumn') OR !$this->registerHook('rightColumn')) + return false; + return true; + } + + /** + * _deleteCurrentImg delete current image, (so this will use default image) + * + * @return void + */ + private function _deleteCurrentImg() + { + + if (file_exists(_PS_MODULE_DIR_.$this->name.'/'.$this->adv_imgname.'.'.Configuration::get('BLOCKADVERT_IMG_EXT'))) + unlink(_PS_MODULE_DIR_.$this->name.'/'.$this->adv_imgname.'.'.Configuration::get('BLOCKADVERT_IMG_EXT')); + $this->adv_imgname = $this->adv_imgname == 'advertising_custom'?'advertising':''; + } + /** + * postProcess update configuration + * @TODO adding alt and title attributes for <img> and <a> + * @var string + * @return void + */ + public function postProcess() + { + global $currentIndex; + + $errors = ''; + if (Tools::isSubmit('submitDeleteImgConf')) + $this->_deleteCurrentImg(); + + if (Tools::isSubmit('submitAdvConf')) + { + $file = false; + if (isset($_FILES['adv_img']) AND isset($_FILES['adv_img']['tmp_name']) AND !empty($_FILES['adv_img']['tmp_name'])) + { + if ($error = checkImage($_FILES['adv_img'], Tools::convertBytes(ini_get('upload_max_filesize')))) + $errors .= $error; + elseif ($dot_pos = strrpos($_FILES['adv_img']['name'],'.')) + { + // as checkImage tell us it's a good image, we'll just copy the extension + + $this->_deleteCurrentImg(); + $this->adv_imgname = 'advertising'; + $ext = substr($_FILES['adv_img']['name'], $dot_pos+1); + $newname = 'advertising_custom'; + + if (!move_uploaded_file($_FILES['adv_img']['tmp_name'],_PS_MODULE_DIR_.$this->name.'/'.$newname.'.'.$ext)) + $errors .= $this->l('Error move uploaded file'); + else + $this->adv_imgname = $newname; + + Configuration::updateValue('BLOCKADVERT_IMG_EXT',$ext); + $this->adv_img = Tools::getMediaServer($this->name)._MODULE_DIR_.$this->name.'/'.$this->adv_imgname.'.'.Configuration::get('BLOCKADVERT_IMG_EXT'); + } + } + + if ($link = Tools::getValue('adv_link')) + { + Configuration::updateValue('BLOCKADVERT_LINK', $link); + $this->adv_link = htmlentities($link, ENT_QUOTES, 'UTF-8'); + } + + if ($title = Tools::getValue('adv_title')) + { + Configuration::updateValue('BLOCKADVERT_TITLE', $title); + $this->adv_title = htmlentities($title, ENT_QUOTES, 'UTF-8'); + } + } + if ($errors) + echo $this->displayError($errors); + } + + /** + * getContent used to display admin module form + * + * @return void + */ + public function getContent() + { + global $protocol_content; + + $this->postProcess(); + $output = ''; + $output .= ' +<form action="'.$_SERVER['REQUEST_URI'].'" method="post" enctype="multipart/form-data"> +<fieldset><legend>'.$this->l('Advertising block configuration').'</legend> +<a href="'.$this->adv_link.'" target="_blank" title="'.$this->adv_title.'">'; + if ($this->adv_img) + { + $output .= '<img src="'.$protocol_content.$this->adv_img.'" alt="'.$this->adv_title.'" title="'.$this->adv_title.'" style="height:163px;margin-left: 100px;width:163px"/>'; + $output .= '<input class="button" type="submit" name="submitDeleteImgConf" value="'.$this->l('Delete image').'" style=""/>'; + } + else + $output .= '<div style="margin-left: 100px;width:163px;"/>'.$this->l('no image').'</div>'; + $output .= '</a>'; + $output .= '<br/> +<br/> +<label for="adv_img">'.$this->l('Change image').'&nbsp;&nbsp;</label><input id="adv_img" type="file" name="adv_img" /> +( '.$this->l('Image will be displayed as 155x163').' ) +<br/> +<br class="clear"/> +<label for="adv_link">'.$this->l('Image link').'&nbsp;&nbsp;</label><input id="adv_link" type="text" name="adv_link" value="'.$this->adv_link.'" /> +<br class="clear"/> +<br/> +<label for="adv_title">'.$this->l('Title').'&nbsp;&nbsp;</label><input id="adv_title" type="text" name="adv_title" value="'.$this->adv_title.'" /> +<br class="clear"/> +<br/> +<input class="button" type="submit" name="submitAdvConf" value="'.$this->l('validate').'" style="margin-left: 200px;"/> +</fieldset> +</form> +'; + return $output; + } + + /** + * Returns module content + * + * @param array $params Parameters + * @return string Content + */ + function hookRightColumn($params) + { + global $smarty, $protocol_content; + + Tools::addCSS($this->_path.'blockadvertising.css', 'all'); + $smarty->assign('image', $protocol_content.$this->adv_img); + $smarty->assign('adv_link', $this->adv_link); + $smarty->assign('adv_title', $this->adv_title); + + return $this->display(__FILE__, 'blockadvertising.tpl'); + } + + function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + +} + + diff --git a/modules/blockadvertising/blockadvertising.tpl b/modules/blockadvertising/blockadvertising.tpl new file mode 100644 index 000000000..212f41c32 --- /dev/null +++ b/modules/blockadvertising/blockadvertising.tpl @@ -0,0 +1,31 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Block advertising --> +<div class="advertising_block"> + <a href="{$adv_link}" title="{$adv_title}"><img src="{$image}" alt="{$adv_title}" title="{$adv_title}" width="155" height="163" /></a> +</div> +<!-- /MODULE Block advertising --> diff --git a/modules/blockadvertising/config.xml b/modules/blockadvertising/config.xml new file mode 100755 index 000000000..5349e0998 --- /dev/null +++ b/modules/blockadvertising/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockadvertising</name> + <displayName><![CDATA[Block advertising]]></displayName> + <version><![CDATA[0.3]]></version> + <description><![CDATA[Adds a block to display an advertisement.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[advertising_marketing]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockadvertising/de.php b/modules/blockadvertising/de.php new file mode 100644 index 000000000..06f284e50 --- /dev/null +++ b/modules/blockadvertising/de.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockadvertising}prestashop>blockadvertising_2ce5fc289845ce826261032b9c6749ea'] = 'Werbung'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_fd4c71c948857cce596a69fbaea7426b'] = 'Werbeblock'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_a7339a98fd0ebea5ed982f92eed11c70'] = 'Fügt einen block für Werbeanzeigen hinzu'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_226ed577d0eff50725be6447bcd5a2f0'] = 'Fehler bewegt hochgeladene Datei'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_6e7be6d836003f069c00cd217660913b'] = 'Werbeblock-Konfiguration'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_93d5113a3d56b880522391fd049128f6'] = 'Werbebild'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_706bebc78ad992a07e4c1ce0f39def81'] = 'kein Bild'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_83b5a65e518c21ed0a5f2b383dd9b617'] = 'Bild löschen'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_8c38cf08a0d0a01bd44c682479432350'] = 'Bild ändern'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_56d9dfa26d7848a3fbcd2ae3091d38d9'] = 'Bild wird mit 155x163 gezeigt'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_9ce38727cff004a058021a6c7351a74a'] = 'Bild-Link'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_f9ab05454998236921a6b0e281fae632'] = 'bestätigen'; + +?> \ No newline at end of file diff --git a/modules/blockadvertising/en.php b/modules/blockadvertising/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockadvertising/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockadvertising/es.php b/modules/blockadvertising/es.php new file mode 100644 index 000000000..c131fc099 --- /dev/null +++ b/modules/blockadvertising/es.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockadvertising}prestashop>blockadvertising_fd4c71c948857cce596a69fbaea7426b'] = 'Bloque de publicidad'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_a7339a98fd0ebea5ed982f92eed11c70'] = 'Añadir un bloque para mostrar la publicidad'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_226ed577d0eff50725be6447bcd5a2f0'] = 'error al desplazar el fichero uploado'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_6e7be6d836003f069c00cd217660913b'] = 'Configuración del bloque de publicidad'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_83b5a65e518c21ed0a5f2b383dd9b617'] = 'Eliminar la imagen'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_706bebc78ad992a07e4c1ce0f39def81'] = 'Ninguna imagen'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_8c38cf08a0d0a01bd44c682479432350'] = 'Cambiar la imagen'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_56d9dfa26d7848a3fbcd2ae3091d38d9'] = 'La imagen se mostrará como 155x163'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_9ce38727cff004a058021a6c7351a74a'] = 'Enlace de la imagen'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_b78a3223503896721cca1303f776159b'] = 'Título'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_f9ab05454998236921a6b0e281fae632'] = 'Validar'; diff --git a/modules/blockadvertising/fr.php b/modules/blockadvertising/fr.php new file mode 100644 index 000000000..47edb7508 --- /dev/null +++ b/modules/blockadvertising/fr.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockadvertising}prestashop>blockadvertising_fd4c71c948857cce596a69fbaea7426b'] = 'Bloc publicité'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_a7339a98fd0ebea5ed982f92eed11c70'] = 'Ajoute un bloc affichant une publicité'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_226ed577d0eff50725be6447bcd5a2f0'] = 'Erreur de deplacement du fichier uploadé'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_6e7be6d836003f069c00cd217660913b'] = 'Configuration du bloc de publicité'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_83b5a65e518c21ed0a5f2b383dd9b617'] = 'supprimer l\'image'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_706bebc78ad992a07e4c1ce0f39def81'] = 'Pas d\'image'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_8c38cf08a0d0a01bd44c682479432350'] = 'Changer l\'image'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_56d9dfa26d7848a3fbcd2ae3091d38d9'] = 'l\'image sera affiché en 155x163'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_9ce38727cff004a058021a6c7351a74a'] = 'Lien de l\'image'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_b78a3223503896721cca1303f776159b'] = 'Titre'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_f9ab05454998236921a6b0e281fae632'] = 'valider'; diff --git a/modules/blockadvertising/it.php b/modules/blockadvertising/it.php new file mode 100644 index 000000000..c416f3392 --- /dev/null +++ b/modules/blockadvertising/it.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockadvertising}prestashop>blockadvertising_2ce5fc289845ce826261032b9c6749ea'] = 'Pubblicità'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_fd4c71c948857cce596a69fbaea7426b'] = 'Blocco pubblicità'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_a7339a98fd0ebea5ed982f92eed11c70'] = 'Aggiunge un blocco per visualizzare un messaggio pubblicitario'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_226ed577d0eff50725be6447bcd5a2f0'] = 'Errore sposta il file caricato'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_6e7be6d836003f069c00cd217660913b'] = 'Pubblicità blocco di configurazione'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_93d5113a3d56b880522391fd049128f6'] = 'Pubblicità immagine'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_706bebc78ad992a07e4c1ce0f39def81'] = 'nessuna immagine'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_83b5a65e518c21ed0a5f2b383dd9b617'] = 'elimina l\'immagine'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_8c38cf08a0d0a01bd44c682479432350'] = 'Cambia immagine'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_56d9dfa26d7848a3fbcd2ae3091d38d9'] = 'immagine verrà visualizzata come 155x163'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_9ce38727cff004a058021a6c7351a74a'] = 'Immagine Link'; +$_MODULE['<{blockadvertising}prestashop>blockadvertising_f9ab05454998236921a6b0e281fae632'] = 'convalidare'; + +?> \ No newline at end of file diff --git a/modules/blockadvertising/logo.gif b/modules/blockadvertising/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a49608392d047a687aaf7932ac2350011464360c GIT binary patch literal 1052 zcmZ?wbhEHb6krfwc)pauJX_K#N75!o(iVtvCGGQM5{kv5%f-`6MSZFbvn$0STO1l1 zM1y-Yk~*Bj`*qX${7a^WT%OE-dAh)r=>lsPm|dMIaCMeo<Lbog^8{}#6uh%Y=*|-1 z`%8t|cP6y&N_enBxO-Pp@2-^lD^(t?66x8K+P^!ie^2_8wIW-$#6Ddw@@$jX^Ub0! zHjBRBpzw0L*z4`$AGRug+@|+&yY`#i5^r~lf83?|X}9i&{SxmFNPgaL@a&-br$bU7 z4@-VJEcM}#*2g2#pAMRRIV$z_klE*B(w~o*d_H3J<%IOt6VhK!%6vO!{pGmL*Hbdz zPDyXNG<D<U315!8e>*Mn<#^z?Gcw=L$ZokZ_4`S??<ZY0UYoS-%ABvK9loEF`+C~t z?dkaM=jDE!m-~9w<;NM1uV<pZosIc%-sj`R#BUd)e_jgwc`5qS<(!|F<Gx)<{CO?q z=e3NV*K>Z{O8#;y|JTjT?>9?+-YofXJMG7<iXV3>f8Hzlb+`KW-O4X_`+nVP{e8ds z!n0l99(4V>-}&oN`>%%+e?IQ`{dne|XMKO3&HMjs*6-(w{s7U7nZI8y`tx$pua_(T zy<GJB)vAB5R{ejy`tRH2|KDx@^M3EY_j~`p-}Cpwu74j6|NXfC|Hs|`KOX+~Y5)H( z$Nzsh^Z(1me_zl4|91KR_iO*ZU;p?0*8d;(|BnLH5K#Ol=v<VVSdyBeP@Y+mq2TW6 z8^ECWlZBCs;Xi{80}y~R3IoRzhX0&0KT=PNsJXLg$-H<fpy4-D<Y&Z+0<RTb6L?$? zITj`edG|{_eHgrWv4c{>7LkpHY;7m&ZN-jSCcFA{w}#A85Il7FoRF;HofQERssfsU zb0z*JIJ<dD3vu=Ld|KjpNln5nZ^wj7j*1ifr)wyB9dYuVp{S|k5TRhuzSt`Jzy(La z6gO6$&|fnu3L1_rajbu~hq3WlSF?JA*HjC|2drwAX*&dNF}S)l=`1y}X58T9ztFbg zQjbRQa)%E7r8aXoKCJJScPuE2SfJ48$SmmRVq);2zqyS^Tumdyf#CoH%YP;&25SJ| Cbh|YG literal 0 HcmV?d00001 diff --git a/modules/blockbestsellers/blockbestsellers.php b/modules/blockbestsellers/blockbestsellers.php new file mode 100644 index 000000000..3eac716f4 --- /dev/null +++ b/modules/blockbestsellers/blockbestsellers.php @@ -0,0 +1,133 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockBestSellers extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + public function __construct() + { + $this->name = 'blockbestsellers'; + $this->tab = 'front_office_features'; + $this->version = '1.1'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Top seller block'); + $this->description = $this->l('Add a block displaying the shop\'s top sellers.'); + } + + /** + * @see ModuleCore::install() + */ + public function install() + { + if (!parent::install() OR + !$this->registerHook('rightColumn') OR + !$this->registerHook('header') OR + !$this->registerHook('updateOrderStatus') OR + !ProductSale::fillProductSales()) + return false; + return true; + } + + /** + * Called in administration -> module -> configure + */ + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBestSellers')) + { + Configuration::updateValue('PS_BLOCK_BESTSELLERS_DISPLAY', (int)(Tools::getValue('always_display'))); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + return ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Always display block').'</label> + <div class="margin-form"> + <input type="radio" name="always_display" id="display_on" value="1" '.(Tools::getValue('always_display', Configuration::get('PS_BLOCK_BESTSELLERS_DISPLAY')) ? 'checked="checked" ' : '').'/> + <label class="t" for="display_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="always_display" id="display_off" value="0" '.(!Tools::getValue('always_display', Configuration::get('PS_BLOCK_BESTSELLERS_DISPLAY')) ? 'checked="checked" ' : '').'/> + <label class="t" for="display_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Show the block even if no product is available.').'</p> + </div> + <center><input type="submit" name="submitBestSellers" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + } + + public function hookRightColumn($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + + global $smarty; + $currency = new Currency((int)($params['cookie']->id_currency)); + $bestsellers = ProductSale::getBestSalesLight((int)($params['cookie']->id_lang), 0, 5); + if (!$bestsellers AND !Configuration::get('PS_BLOCK_BESTSELLERS_DISPLAY')) + return; + $best_sellers = array(); + foreach ($bestsellers AS $bestseller) + { + $bestseller['price'] = Tools::displayPrice(Product::getPriceStatic((int)($bestseller['id_product'])), $currency); + $best_sellers[] = $bestseller; + } + $smarty->assign(array( + 'best_sellers' => $best_sellers, + 'mediumSize' => Image::getSize('medium'))); + return $this->display(__FILE__, 'blockbestsellers.tpl'); + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + + public function hookHeader($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + Tools::addCSS(($this->_path).'blockbestsellers.css', 'all'); + } +} + + diff --git a/modules/blockbestsellers/blockbestsellers.tpl b/modules/blockbestsellers/blockbestsellers.tpl new file mode 100644 index 000000000..eb89140b5 --- /dev/null +++ b/modules/blockbestsellers/blockbestsellers.tpl @@ -0,0 +1,47 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Block best sellers --> +<div id="best-sellers_block_right" class="block products_block"> + <h4><a href="{$link->getPageLink('best-sales')}">{l s='Top sellers' mod='blockbestsellers'}</a></h4> + <div class="block_content"> + {if $best_sellers|@count > 0} + <ul class="product_images"> + <li><a href="{$best_sellers.0.link}" title="{$best_sellers.0.legend|escape:'htmlall':'UTF-8'}"><img src="{$link->getImageLink($best_sellers.0.link_rewrite, $best_sellers.0.id_image, 'medium')}" height="{$mediumSize.height}" width="{$mediumSize.width}" alt="{$best_sellers.0.legend|escape:'htmlall':'UTF-8'}" /></a></li> + {if $best_sellers|@count > 1}<li><a href="{$best_sellers.1.link}" title="{$best_sellers.1.legend|escape:'htmlall':'UTF-8'}"><img src="{$link->getImageLink($best_sellers.1.link_rewrite, $best_sellers.1.id_image, 'medium')}" height="{$mediumSize.height}" width="{$mediumSize.width}" alt="{$best_sellers.1.legend|escape:'htmlall':'UTF-8'}" /></a></li>{/if} + </ul> + <dl> + {foreach from=$best_sellers item=product name=myLoop} + <dt class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"><a href="{$product.link}" title="{$product.name|escape:'htmlall':'UTF-8'}">{$product.name|strip_tags:'UTF-8'|escape:'htmlall':'UTF-8'}</a></dt> + {/foreach} + </dl> + <p><a href="{$link->getPageLink('best-sales')}" title="{l s='All best sellers' mod='blockbestsellers'}" class="button_large">{l s='All best sellers' mod='blockbestsellers'}</a></p> + {else} + <p>{l s='No best sellers at this time' mod='blockbestsellers'}</p> + {/if} + </div> +</div> +<!-- /MODULE Block best sellers --> diff --git a/modules/blockbestsellers/config.xml b/modules/blockbestsellers/config.xml new file mode 100755 index 000000000..642bf5f96 --- /dev/null +++ b/modules/blockbestsellers/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockbestsellers</name> + <displayName><![CDATA[Top seller block]]></displayName> + <version><![CDATA[1.1]]></version> + <description><![CDATA[Add a block displaying the shop&#039;s top sellers.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockbestsellers/de.php b/modules/blockbestsellers/de.php new file mode 100644 index 000000000..d183a32e8 --- /dev/null +++ b/modules/blockbestsellers/de.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_3cb29f0ccc5fd220a97df89dafe46290'] = 'Verkaufshits'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_eae99cd6a931f3553123420b16383812'] = 'Alle Verkaufshits'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f7be84d6809317a6eb0ff3823a936800'] = 'Momentan keine Verkaufshits'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_6232eaff79c9ccb6c1a66e5a75a212d5'] = 'Block Verkaufshits'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_95d17a0a1b5ea2de13a3565ed400ebbb'] = 'Block mit Verkaufshits des Shops hinzufügen'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c888438d14855d7d96a2724ee9c306bd'] = 'Aktualisierte Einstellungen'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_530c88f8210e022b39128e3f0409bbcf'] = 'Block immer anzeigen'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_a8a670d89a6d2f3fa59942fc591011ef'] = 'Block anzeigen, auch wenn kein Produkt verfügbar ist.'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockbestsellers/en.php b/modules/blockbestsellers/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockbestsellers/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockbestsellers/es.php b/modules/blockbestsellers/es.php new file mode 100644 index 000000000..b4427c102 --- /dev/null +++ b/modules/blockbestsellers/es.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_6232eaff79c9ccb6c1a66e5a75a212d5'] = 'Bloque de mejores ventas'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_95d17a0a1b5ea2de13a3565ed400ebbb'] = 'Añadir un bloque para mostrar las mejores ventas de la tienda'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c888438d14855d7d96a2724ee9c306bd'] = 'Actualización parámetros'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_530c88f8210e022b39128e3f0409bbcf'] = 'Mostrar siempre este bloque'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_a8a670d89a6d2f3fa59942fc591011ef'] = 'Mostrar este bloque aunque no haya ningún producto disponible'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_3cb29f0ccc5fd220a97df89dafe46290'] = '¡Lo más vendido!'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_eae99cd6a931f3553123420b16383812'] = 'Los productos más vendidos'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f7be84d6809317a6eb0ff3823a936800'] = 'No hay productos más vendidos en este momento'; diff --git a/modules/blockbestsellers/fr.php b/modules/blockbestsellers/fr.php new file mode 100644 index 000000000..5388db49a --- /dev/null +++ b/modules/blockbestsellers/fr.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_6232eaff79c9ccb6c1a66e5a75a212d5'] = 'Bloc meilleures ventes'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_95d17a0a1b5ea2de13a3565ed400ebbb'] = 'Ajoute un bloc qui affiche les meilleures ventes de la boutique'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_530c88f8210e022b39128e3f0409bbcf'] = 'Toujours afficher ce bloc'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_a8a670d89a6d2f3fa59942fc591011ef'] = 'Afficher ce bloc même si aucun produit disponible'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_3cb29f0ccc5fd220a97df89dafe46290'] = 'Meilleures ventes'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_eae99cd6a931f3553123420b16383812'] = 'Toutes les meilleures ventes'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f7be84d6809317a6eb0ff3823a936800'] = 'Pas encore de meilleure vente'; diff --git a/modules/blockbestsellers/img/logo.gif b/modules/blockbestsellers/img/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..86b4e900d2a0ee12df97df0d9e21f863e5af5ff2 GIT binary patch literal 601 zcmZ?wbhEHb6krfwc*el+#>nW$DTgP^g}=lle7!N}>8gZ_&C(C%`2Bi&=<1Awi+wh~ zmMr~b?Qnmk&G+jypKffw-6`~CHP45`zAtyQd}(U>kf8VZa_Zag@Q-C>pKtCun5*@1 zt@@{95$_t*zTRp7Xlng%p7QG*CjUNNdb-K!dso+oqd`BOulfGs(g(kw4{5<)u9y5+ z+Wy8>_4Rt`FSF&ZS2O?pbo+Nk+Sfz6-ybjdb<E)NOs_kgDxc=Y-<v7^xm)H_ef_r+ z_CM~;e!4{a=kwj)Cr^8|#rXS`?623Gey>{n=h?<Dj;_Cwlitqf{klWs`&z|6Umw4> zvif$f=iisBUycX-jE#M})BNES#m_euy?1hYxxw=LwXM(hx4%1{{CJl9pPZ~Ob#>p9 zv;Y79&p<Dr_>+Z^ogs!n2V@~AP8is?HN-SUs_^i5cX*4qHuc6Bs&sZRi173^xlQyI zwPawhlAj*qFT%{AXQU%8!LZ0VI!e>SQC333eo+iJv#Fz+`}Re?N=n+&HpW8cN0hvp zOc*aR^4a+C2?Yc=Fa^c92s(18*~sxd^O3V<?=_J2GnSLna&%PH7ha^Q^+`)iOF**d zqsGDWO|2R`cN7R5a%r^_weWkAmDtqP%cQWbXM@rycMcs^7F&Z04viX2fpQi>lN_8E IJ1|%S0DEHZo&W#< literal 0 HcmV?d00001 diff --git a/modules/blockbestsellers/it.php b/modules/blockbestsellers/it.php new file mode 100644 index 000000000..1007b5301 --- /dev/null +++ b/modules/blockbestsellers/it.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_3cb29f0ccc5fd220a97df89dafe46290'] = 'Migliori vendite'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_eae99cd6a931f3553123420b16383812'] = 'Tutte le migliori vendite'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f7be84d6809317a6eb0ff3823a936800'] = 'Non ci sono migliori vendite in questo momento'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_6232eaff79c9ccb6c1a66e5a75a212d5'] = 'Blocco migliori vendite'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_95d17a0a1b5ea2de13a3565ed400ebbb'] = 'Aggiungi un blocco che mostra le migliori vendite del negozio'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_530c88f8210e022b39128e3f0409bbcf'] = 'Visualizza sempre blocco'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_a8a670d89a6d2f3fa59942fc591011ef'] = 'Mostra il blocco anche se nessun prodotto è disponibile.'; +$_MODULE['<{blockbestsellers}prestashop>blockbestsellers_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockbestsellers/logo.gif b/modules/blockbestsellers/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..86b4e900d2a0ee12df97df0d9e21f863e5af5ff2 GIT binary patch literal 601 zcmZ?wbhEHb6krfwc*el+#>nW$DTgP^g}=lle7!N}>8gZ_&C(C%`2Bi&=<1Awi+wh~ zmMr~b?Qnmk&G+jypKffw-6`~CHP45`zAtyQd}(U>kf8VZa_Zag@Q-C>pKtCun5*@1 zt@@{95$_t*zTRp7Xlng%p7QG*CjUNNdb-K!dso+oqd`BOulfGs(g(kw4{5<)u9y5+ z+Wy8>_4Rt`FSF&ZS2O?pbo+Nk+Sfz6-ybjdb<E)NOs_kgDxc=Y-<v7^xm)H_ef_r+ z_CM~;e!4{a=kwj)Cr^8|#rXS`?623Gey>{n=h?<Dj;_Cwlitqf{klWs`&z|6Umw4> zvif$f=iisBUycX-jE#M})BNES#m_euy?1hYxxw=LwXM(hx4%1{{CJl9pPZ~Ob#>p9 zv;Y79&p<Dr_>+Z^ogs!n2V@~AP8is?HN-SUs_^i5cX*4qHuc6Bs&sZRi173^xlQyI zwPawhlAj*qFT%{AXQU%8!LZ0VI!e>SQC333eo+iJv#Fz+`}Re?N=n+&HpW8cN0hvp zOc*aR^4a+C2?Yc=Fa^c92s(18*~sxd^O3V<?=_J2GnSLna&%PH7ha^Q^+`)iOF**d zqsGDWO|2R`cN7R5a%r^_weWkAmDtqP%cQWbXM@rycMcs^7F&Z04viX2fpQi>lN_8E IJ1|%S0DEHZo&W#< literal 0 HcmV?d00001 diff --git a/modules/blockcart/ajax-cart.js b/modules/blockcart/ajax-cart.js new file mode 100644 index 000000000..09fc09a00 --- /dev/null +++ b/modules/blockcart/ajax-cart.js @@ -0,0 +1,630 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7100 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +//JS Object : update the cart by ajax actions +var ajaxCart = { + + //override every button in the page in relation to the cart + overrideButtonsInThePage : function(){ + //for every 'add' buttons... + $('.ajax_add_to_cart_button').unbind('click').click(function(){ + var idProduct = $(this).attr('rel').replace('ajax_id_product_', ''); + if ($(this).attr('disabled') != 'disabled') + ajaxCart.add(idProduct, null, false, this); + return false; + }); + //for product page 'add' button... + $('body#product p#add_to_cart input').unbind('click').click(function(){ + ajaxCart.add( $('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null); + return false; + }); + + //for 'delete' buttons in the cart block... + $('#cart_block_list .ajax_cart_block_remove_link').unbind('click').click(function(){ + // Customized product management + var customizationId = 0; + var productId = 0; + var productAttributeId = 0; + if ($($(this).parent().parent()).attr('name') == 'customization') + // Reverse two levels: a >> div >> li + var customizableProductDiv = $($(this).parent().parent()).find("div[id^=deleteCustomizableProduct_]"); + else + var customizableProductDiv = $($(this).parent()).find("div[id^=deleteCustomizableProduct_]"); + if (customizableProductDiv && $(customizableProductDiv).length) + { + $(customizableProductDiv).each(function(){ + var ids = $(this).attr('id').split('_'); + if (typeof(ids[1]) != 'undefined') + { + customizationId = parseInt(ids[1]); + productId = parseInt(ids[2]); + if (typeof(ids[3]) != 'undefined') + productAttributeId = parseInt(ids[3]); + return false; + } + }); + } + + // Common product management + if (!customizationId) + { + //retrieve idProduct and idCombination from the displayed product in the block cart + var firstCut = $(this).parent().parent().attr('id').replace('cart_block_product_', ''); + firstCut = firstCut.replace('deleteCustomizableProduct_', ''); + ids = firstCut.split('_'); + productId = parseInt(ids[0]); + if (typeof(ids[1]) != 'undefined') + productAttributeId = parseInt(ids[1]); + } + + // Removing product from the cart + ajaxCart.remove(productId, productAttributeId, customizationId); + return false; + }); + }, + + // try to expand the cart + expand : function(){ + if ($('#cart_block #cart_block_list').hasClass('collapsed')) + { + $('#cart_block #cart_block_summary').slideUp(200, function(){ + $(this).addClass('collapsed').removeClass('expanded'); + $('#cart_block #cart_block_list').slideDown({ + duration: 600, + complete: function(){$(this).addClass('expanded').removeClass('collapsed');} + }); + }); + // toogle the button expand/collapse button + $('#cart_block h4 span#block_cart_expand').fadeOut('slow', function(){ + $('#cart_block h4 span#block_cart_collapse').fadeIn('fast'); + }); + + // save the expand statut in the user cookie + $.ajax({ + type: 'GET', + url: baseDir + 'modules/blockcart/blockcart-set-collapse.php', + async: true, + data: 'ajax_blockcart_display=expand' + '&rand=' + new Date().getTime() + }); + + + } + }, + // cart to fix display when using back and previous browsers buttons + refresh : function(){ + //send the ajax request to the server + $.ajax({ + type: 'GET', + url: baseDir + 'index.php', + async: true, + cache: false, + dataType : "json", + data: 'controller=cart&ajax=true&token=' + static_token, + success: function(jsonData) + { + ajaxCart.updateCart(jsonData); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) { + //alert("TECHNICAL ERROR: unable to refresh the cart.\n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); + } + }); + }, + + // try to collapse the cart + collapse : function(){ + + if ($('#cart_block #cart_block_list').hasClass('expanded')) + { + $('#cart_block #cart_block_list').slideUp('slow', function(){ + $(this).addClass('collapsed').removeClass('expanded'); + $('#cart_block #cart_block_summary').slideDown(700, function(){ + $(this).addClass('expanded').removeClass('collapsed'); + }); + }); + $('#cart_block h4 span#block_cart_collapse').fadeOut('slow', function(){ + $('#cart_block h4 span#block_cart_expand').fadeIn('fast'); + }); + + // save the expand statut in the user cookie + $.ajax({ + type: 'GET', + url: baseDir + 'modules/blockcart/blockcart-set-collapse.php', + async: true, + data: 'ajax_blockcart_display=collapse' + '&rand=' + new Date().getTime() + }); + } + }, + + // Update the cart information + updateCartInformation : function (jsonData, addedFromProductPage) + { + ajaxCart.updateCart(jsonData); + + //reactive the button when adding has finished + if (addedFromProductPage) + $('body#product p#add_to_cart input').removeAttr('disabled').addClass('exclusive').removeClass('exclusive_disabled'); + else + $('.ajax_add_to_cart_button').removeAttr('disabled'); + }, + + // add a product in the cart via ajax + add : function(idProduct, idCombination, addedFromProductPage, callerElement, quantity, whishlist){ + if (addedFromProductPage && !checkCustomizations()) + { + alert(fieldRequired); + return ; + } + emptyCustomizations(); + //disabled the button when adding to do not double add if user double click + if (addedFromProductPage) + { + $('body#product p#add_to_cart input').attr('disabled', 'disabled').removeClass('exclusive').addClass('exclusive_disabled'); + $('.filled').removeClass('filled'); + } + else + $(callerElement).attr('disabled', 'disabled'); + + if ($('#cart_block #cart_block_list').hasClass('collapsed')) + this.expand(); + //send the ajax request to the server + $.ajax({ + type: 'POST', + url: baseDir + 'index.php', + async: true, + cache: false, + dataType : "json", + data: 'controller=cart&add=1&ajax=true&qty=' + ((quantity && quantity != null) ? quantity : '1') + '&id_product=' + idProduct + '&token=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa=' + parseInt(idCombination): ''), + success: function(jsonData,textStatus,jqXHR) + { + // add appliance to whishlist module + if (whishlist && !jsonData.errors) + WishlistAddProductCart(whishlist[0], idProduct, idCombination, whishlist[1]); + + // add the picture to the cart + var $element = $(callerElement).parent().parent().find('a.product_image img,a.product_img_link img'); + if (!$element.length) + $element = $('#bigpic'); + var $picture = $element.clone(); + var pictureOffsetOriginal = $element.offset(); + + if ($picture.size()) + $picture.css({'position': 'absolute', 'top': pictureOffsetOriginal.top, 'left': pictureOffsetOriginal.left}); + + var pictureOffset = $picture.offset(); + var cartBlockOffset = $('#cart_block').offset(); + + // Check if the block cart is activated for the animation + if (cartBlockOffset != undefined && $picture.size()) + { + $picture.appendTo('body'); + $picture.css({ 'position': 'absolute', 'top': $picture.css('top'), 'left': $picture.css('left') }) + .animate({ 'width': $element.attr('width')*0.66, 'height': $element.attr('height')*0.66, 'opacity': 0.2, 'top': cartBlockOffset.top + 30, 'left': cartBlockOffset.left + 15 }, 1000) + .fadeOut(100, function() { + ajaxCart.updateCartInformation(jsonData, addedFromProductPage); + }); + } + else + ajaxCart.updateCartInformation(jsonData, addedFromProductPage); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + alert("TECHNICAL ERROR: unable to add the product.\n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); + //reactive the button when adding has finished + if (addedFromProductPage) + $('body#product p#add_to_cart input').removeAttr('disabled').addClass('exclusive').removeClass('exclusive_disabled'); + else + $(callerElement).removeAttr('disabled'); + } + }); + }, + + //remove a product from the cart via ajax + remove : function(idProduct, idCombination, customizationId){ + //send the ajax request to the server + $.ajax({ + type: 'POST', + url: baseDir + 'index.php', + async: true, + cache: false, + dataType : "json", + data: 'controller=cart&delete=1&id_product=' + idProduct + '&ipa=' + ((idCombination != null && parseInt(idCombination)) ? idCombination : '') + ((customizationId && customizationId != null) ? '&id_customization=' + customizationId : '') + '&token=' + static_token + '&ajax=true', + success: function(jsonData) { + ajaxCart.updateCart(jsonData); + if ($('body').attr('id') == 'order' || $('body').attr('id') == 'order-opc') + deletProductFromSummary(idProduct+'_'+idCombination); + }, + error: function() {alert('ERROR: unable to delete the product');} + }); + }, + + //hide the products displayed in the page but no more in the json data + hideOldProducts : function(jsonData) { + //delete an eventually removed product of the displayed cart (only if cart is not empty!) + if($('#cart_block #cart_block_list dl.products').length > 0) + { + var removedProductId = null; + var removedProductData = null; + var removedProductDomId = null; + //look for a product to delete... + $('#cart_block_list dl.products dt').each(function(){ + //retrieve idProduct and idCombination from the displayed product in the block cart + var domIdProduct = $(this).attr('id'); + var firstCut = domIdProduct.replace('cart_block_product_', ''); + var ids = firstCut.split('_'); + + //try to know if the current product is still in the new list + var stayInTheCart = false; + for (aProduct in jsonData.products) + { + //we've called the variable aProduct because IE6 bug if this variable is called product + //if product has attributes + if (jsonData.products[aProduct]['id'] == ids[0] && (!ids[1] || jsonData.products[aProduct]['idCombination'] == ids[1])) + { + stayInTheCart = true; + // update the product customization display (when the product is still in the cart) + ajaxCart.hideOldProductCustomizations(jsonData.products[aProduct], domIdProduct); + } + } + //remove product if it's no more in the cart + if(!stayInTheCart) + { + removedProductId = $(this).attr('id'); + //return false; // Regarding that the customer can only remove products one by one, we break the loop + } + }); + + //if there is a removed product, delete it from the displayed block cart + if (removedProductId != null) + { + var firstCut = removedProductId.replace('cart_block_product_', ''); + var ids = firstCut.split('_'); + + $('#'+removedProductId).addClass('strike').fadeTo('slow', 0, function(){ + $(this).slideUp('slow', function(){ + $(this).remove(); + //if the cart is now empty, show the 'no product in the cart' message + if($('#cart_block dl.products dt').length == 0) + { + $('p#cart_block_no_products:hidden').slideDown('fast'); + $('div#cart_block dl.products').remove(); + } + }); + }); + $('dd#cart_block_combination_of_' + ids[0] + (ids[1] ? '_'+ids[1] : '') ).fadeTo('fast', 0, function(){ + $(this).slideUp('fast', function(){ + $(this).remove(); + }); + }); + } + + } + }, + + hideOldProductCustomizations : function (product, domIdProduct) + { + var customizationList = $('#cart_block #cart_block_list ul#customization_' + product['id'] + '_' + product['idCombination']); + if(customizationList.length > 0) + { + $(customizationList).find("li").each(function(){ + $(this).find("div").each(function() { + var customizationDiv = $(this).attr('id'); + var tmp = customizationDiv.replace('deleteCustomizableProduct_', ''); + var ids = tmp.split('_'); + if ((parseInt(product.idCombination) == parseInt(ids[2])) && !ajaxCart.doesCustomizationStillExist(product, ids[0])) + $('#' + customizationDiv).parent().addClass('strike').fadeTo('slow', 0, function(){ + $(this).slideUp('slow'); + $(this).remove(); + }); + }); + }); + } + var removeLinks = $('#cart_block_product_' + domIdProduct).find('a.ajax_cart_block_remove_link'); + if (!product.hasCustomizedDatas && !removeLinks.length) + $('#' + domIdProduct + ' span.remove_link').html('<a class="ajax_cart_block_remove_link" rel="nofollow" href="' + baseDir + 'index.php?controller=cart&amp;delete&amp;id_product=' + product['id'] + '&amp;ipa=' + product['idCombination'] + '&amp;token=' + static_token + '" title="' + removingLinkText + '"> </a>'); + }, + + doesCustomizationStillExist : function (product, customizationId) + { + var exists = false; + + $(product.customizedDatas).each(function() { + if (this.customizationId == customizationId) + { + exists = true; + // This return does not mean that we found nothing but simply break the loop + return false; + } + }); + return (exists); + }, + + //refresh display of vouchers (needed for vouchers in % of the total) + refreshVouchers : function (jsonData) { + if (jsonData.discounts.length == 0) + $('#vouchers').remove(); + else + { + $('.bloc_cart_voucher').each(function(){ + var idElmt = $(this).attr('id').replace('bloc_cart_voucher_',''); + var toDelete = true; + for (i=0;i<jsonData.discounts.length;i++) + { + if (jsonData.discounts[i].id == idElmt) + { + $('#bloc_cart_voucher_' + idElmt + ' td.price').text(jsonData.discounts[i].price); + toDelete = false; + } + } + if (toDelete) + { + $('#bloc_cart_voucher_' + idElmt).fadeTo('fast', 0, function(){ + $(this).remove(); + }); + } + }); + } + + + }, + + // Update product quantity + updateProductQuantity : function (product, quantity) { + $('dt#cart_block_product_' + product.id + (product.idCombination ? '_' + product.idCombination : '') + ' .quantity').fadeTo('fast', 0, function() { + $(this).text(quantity); + $(this).fadeTo('fast', 1, function(){ + $(this).fadeTo('fast', 0, function(){ + $(this).fadeTo('fast', 1, function(){ + $(this).fadeTo('fast', 0, function(){ + $(this).fadeTo('fast', 1); + }); + }); + }); + }); + }); + }, + + + //display the products witch are in json data but not already displayed + displayNewProducts : function(jsonData) { + + //add every new products or update displaying of every updated products + $(jsonData.products).each(function(){ + //fix ie6 bug (one more item 'undefined' in IE6) + if (this.id != undefined) + { + //create a container for listing the products and hide the 'no product in the cart' message (only if the cart was empty) + if ($('div#cart_block dl.products').length == 0) + $('p#cart_block_no_products:visible').fadeTo('fast', 0, function(){ + $(this).slideUp('fast').fadeTo(0, 1); + }).before('<dl class="products"></dl>'); + + //if product is not in the displayed cart, add a new product's line + var domIdProduct = this.id + (this.idCombination ? '_' + this.idCombination : ''); + var domIdProductAttribute = this.id + '_' + (this.idCombination ? this.idCombination : '0'); + if($('#cart_block dt#cart_block_product_'+ domIdProduct ).length == 0) + { + var productId = parseInt(this.id); + var productAttributeId = (this.hasAttributes ? parseInt(this.attributes) : 0); + var content = '<dt class="hidden" id="cart_block_product_' + domIdProduct + '">'; + content += '<span class="quantity-formated"><span class="quantity">' + this.quantity + '</span>x</span>'; + var name = (this.name.length > 12 ? this.name.substring(0, 10) + '...' : this.name); + content += '<a href="' + this.link + '" title="' + this.name + '">' + name + '</a>'; + content += '<span class="remove_link"><a rel="nofollow" class="ajax_cart_block_remove_link" href="' + baseDir + 'index.php?controller=cart&amp;delete&amp;id_product=' + productId + '&amp;token=' + static_token + (this.hasAttributes ? '&amp;ipa=' + parseInt(this.idCombination) : '') + '"> </a></span>'; + content += '<span class="price">' + this.priceByLine + '</span>'; + content += '</dt>'; + if (this.hasAttributes) + content += '<dd id="cart_block_combination_of_' + domIdProduct + '" class="hidden"><a href="' + this.link + '" title="' + this.name + '">' + this.attributes + '</a>'; + if (this.hasCustomizedDatas) + content += ajaxCart.displayNewCustomizedDatas(this); + if (this.hasAttributes) content += '</dd>'; + + $('#cart_block dl.products').append(content); + } + //else update the product's line + else{ + var jsonProduct = this; + if($('dt#cart_block_product_' + domIdProduct + ' .quantity').text() != jsonProduct.quantity || $('dt#cart_block_product_' + domIdProduct + ' .price').text() != jsonProduct.priceByLine) + { + // Usual product + $('dt#cart_block_product_' + domIdProduct + ' .price').text(jsonProduct.priceByLine); + ajaxCart.updateProductQuantity(jsonProduct, jsonProduct.quantity); + + // Customized product + if (jsonProduct.hasCustomizedDatas) + { + customizationFormatedDatas = ajaxCart.displayNewCustomizedDatas(jsonProduct); + if (!$('#cart_block ul#customization_' + domIdProductAttribute).length) + { + if (jsonProduct.hasAttributes) + $('#cart_block dd#cart_block_combination_of_' + domIdProduct).append(customizationFormatedDatas); + else + $('#cart_block dl.products').append(customizationFormatedDatas); + } + else + $('#cart_block ul#customization_' + domIdProductAttribute).append(customizationFormatedDatas); + } + } + } + $('#cart_block dl.products .hidden').slideDown('slow').removeClass('hidden'); + + var removeLinks = $('#cart_block_product_' + domIdProduct).find('a.ajax_cart_block_remove_link'); + if (this.hasCustomizedDatas && removeLinks.length) + $(removeLinks).each(function() { + $(this).remove(); + }); + } + }); + }, + + displayNewCustomizedDatas : function(product) + { + var content = ''; + var productId = parseInt(product.id); + var productAttributeId = typeof(product.idCombination) == 'undefined' ? 0 : parseInt(product.idCombination); + var hasAlreadyCustomizations = $('#cart_block ul#customization_' + productId + '_' + productAttributeId).length; + + if (!hasAlreadyCustomizations) + { + if (!product.hasAttributes) content += '<dd id="cart_block_combination_of_' + productId + '" class="hidden">'; + content += '<ul class="cart_block_customizations" id="customization_' + productId + '_' + productAttributeId + '">'; + } + + $(product.customizedDatas).each(function(){ + var done = 0; + customizationId = parseInt(this.customizationId); + productAttributeId = typeof(product.idCombination) == 'undefined' ? 0 : parseInt(product.idCombination); + // If the customization is already displayed on the cart, no update's needed + if($('#cart_block').find("div[id^=deleteCustomizableProduct_" + customizationId + "_]").length) + return (''); + content += '<li name="customization"><div class="deleteCustomizableProduct" id="deleteCustomizableProduct_' + customizationId + '_' + productId + '_' + (productAttributeId ? productAttributeId : '0') + '"><a rel="nofollow" class="ajax_cart_block_remove_link" href="' + baseDir + 'index.php?controller=cart&amp;delete&amp;id_product=' + productId + '&amp;ipa=' + productAttributeId + '&amp;id_customization=' + customizationId + '&amp;token=' + static_token + '"> </a></div><span class="quantity-formated"><span class="quantity">' + parseInt(this.quantity) + '</span>x</span>'; + + // Give to the customized product the first textfield value as name + $(this.datas).each(function(){ + if (this['type'] == CUSTOMIZE_TEXTFIELD) + { + $(this.datas).each(function(){ + if (this['index'] == 0) + { + content += this.truncatedValue.replace(/<br \/>/g, ' '); + done = 1; + return false; + } + }) + } + }); + + // If the customized product did not have any textfield, it will have the customizationId as name + if (!done) + content += customizationIdMessage + customizationId; + if (!hasAlreadyCustomizations) content += '</li>'; + // Field cleaning + if (customizationId) + { + $('#uploadable_files li div.customizationUploadBrowse img').remove(); + $('#text_fields li input').attr('value', ''); + } + }); + + if (!hasAlreadyCustomizations) + { + content += '</ul>'; + if (!product.hasAttributes) content += '</dd>'; + } + return (content); + }, + + + //genarally update the display of the cart + updateCart : function(jsonData) { + //user errors display + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + } + else + { + ajaxCart.updateCartEverywhere(jsonData); + ajaxCart.hideOldProducts(jsonData); + ajaxCart.displayNewProducts(jsonData); + ajaxCart.refreshVouchers(jsonData); + + //update 'first' and 'last' item classes + $('#cart_block dl.products dt').removeClass('first_item').removeClass('last_item').removeClass('item'); + $('#cart_block dl.products dt:first').addClass('first_item'); + $('#cart_block dl.products dt:not(:first,:last)').addClass('item'); + $('#cart_block dl.products dt:last').addClass('last_item'); + + //reset the onlick events in relation to the cart block (it allow to bind the onclick event to the new 'delete' buttons added) + ajaxCart.overrideButtonsInThePage(); + } + }, + + //update general cart informations everywhere in the page + updateCartEverywhere : function(jsonData) { + $('.ajax_cart_total').text(jsonData.productTotal); + $('.ajax_cart_shipping_cost').text(jsonData.shippingCost); + $('.ajax_cart_tax_cost').text(jsonData.taxCost); + $('.cart_block_wrapping_cost').text(jsonData.wrappingCost); + $('.ajax_block_cart_total').text(jsonData.total); + if(parseInt(jsonData.nbTotalProducts) > 0) + { + $('.ajax_cart_no_product').hide(); + $('.ajax_cart_quantity').text(jsonData.nbTotalProducts); + $('.ajax_cart_quantity').fadeIn('slow'); + $('.ajax_cart_total').fadeIn('slow'); + + if(parseInt(jsonData.nbTotalProducts) > 1) + { + $('.ajax_cart_product_txt').each( function () { + $(this).hide (); + }); + + $('.ajax_cart_product_txt_s').each( function () { + $(this).show(); + }); + + } + else + { + $('.ajax_cart_product_txt').each( function () { + $(this).show(); + }); + + $('.ajax_cart_product_txt_s').each( function () { + $(this).hide(); + }); + } + } + else + { + $('.ajax_cart_quantity, .ajax_cart_product_txt_s, .ajax_cart_product_txt, .ajax_cart_total').each( function () { + $(this).hide(); + }); + $('.ajax_cart_no_product').show('slow'); + } + } +}; + +//when document is loaded... +$(document).ready(function(){ + + // expand/collapse management + $('#block_cart_collapse').click(function(){ + ajaxCart.collapse(); + }); + $('#block_cart_expand').click(function(){ + ajaxCart.expand(); + }); + ajaxCart.overrideButtonsInThePage(); + ajaxCart.refresh(); +}); + diff --git a/modules/blockcart/blockcart-ajax.php b/modules/blockcart/blockcart-ajax.php new file mode 100644 index 000000000..90106acd6 --- /dev/null +++ b/modules/blockcart/blockcart-ajax.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +global $cookie; + +include(dirname(__FILE__).'/blockcart.php'); + +$cart = new Cart((int)($cookie->id_cart)); +$cart->id_lang = (int)($cookie->id_lang); + +$blockCart = new BlockCart(); +echo $blockCart->hookAjaxCall(array('cookie' => $cookie, 'cart' => $cart)); \ No newline at end of file diff --git a/modules/blockcart/blockcart-json.tpl b/modules/blockcart/blockcart-json.tpl new file mode 100644 index 000000000..67166004a --- /dev/null +++ b/modules/blockcart/blockcart-json.tpl @@ -0,0 +1,117 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{ldelim} +"products": [ +{if $products} +{foreach from=$products item=product name='products'} +{assign var='productId' value=$product.id_product} +{assign var='productAttributeId' value=$product.id_product_attribute} + {ldelim} + "id": {$product.id_product}, + "link": "{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category)|addslashes|replace:'\\\'':'\''}", + "quantity": {$product.cart_quantity}, + "priceByLine": "{if $priceDisplay == $smarty.const.PS_TAX_EXC}{displayWtPrice|html_entity_decode:2:'UTF-8' p=$product.total}{else}{displayWtPrice|html_entity_decode:2:'UTF-8' p=$product.total_wt}{/if}", + "name": "{$product.name|html_entity_decode:2:'UTF-8'|escape|truncate:15:'...':true}", + "price": "{if $priceDisplay == $smarty.const.PS_TAX_EXC}{displayWtPrice|html_entity_decode:2:'UTF-8' p=$product.total}{else}{displayWtPrice|html_entity_decode:2:'UTF-8' p=$product.total_wt}{/if}", + "idCombination": {if isset($product.attributes_small)}{$productAttributeId}{else}0{/if}, +{if isset($product.attributes_small)} + "hasAttributes": true, + "attributes": "{$product.attributes_small|addslashes|replace:'\\\'':'\''}", +{else} + "hasAttributes": false, +{/if} + "hasCustomizedDatas": {if isset($customizedDatas.$productId.$productAttributeId)}true{else}false{/if}, + + "customizedDatas":[ + {if isset($customizedDatas.$productId.$productAttributeId)} + {foreach from=$customizedDatas.$productId.$productAttributeId key='id_customization' item='customization' name='customizedDatas'}{ldelim} +{* This empty line was made in purpose (product addition debug), please leave it here *} + + "customizationId": {$id_customization}, + "quantity": "{$customization.quantity}", + "datas": [ + {foreach from=$customization.datas key='type' item='datas' name='customization'} + {ldelim} + "type": "{$type}", + "datas": + [ + {foreach from=$datas key='index' item='data' name='datas'} + {ldelim} + "index": {$index}, + "value": "{$data.value|addslashes|replace: '\\\'':'\''}", + "truncatedValue": "{$data.value|truncate:28:'...'|addslashes|replace: '\\\'':'\''}" + {rdelim}{if !$smarty.foreach.datas.last},{/if} + {/foreach}] + {rdelim}{if !$smarty.foreach.customization.last},{/if} + {/foreach} + ] + {rdelim}{if !$smarty.foreach.customizedDatas.last},{/if} + {/foreach} + {/if} + ] + + + {rdelim}{if !$smarty.foreach.products.last},{/if} +{/foreach}{/if} +], + +"discounts": [ +{if $discounts}{foreach from=$discounts item=discount name='discounts'} + {ldelim} + "id": "{$discount.id_discount}", + "name": "{$discount.name|cat:' : '|cat:$discount.description|truncate:18:'...'|addslashes|replace:'\\\'':'\''}", + "description": "{$discount.description|addslashes|replace:'\\\'':'\''}", + "nameDescription": "{$discount.name|cat:' : '|cat:$discount.description|truncate:18:'...'|addslashes|replace:'\\\'':'\''}", + "link": "{$link->getPageLink('order', true, NULL, "deleteDiscount={$discount.id_discount}")}", + "price": "-{if $discount.value_real != '!'}{if $priceDisplay == 1}{convertPrice|html_entity_decode:2:'UTF-8' price=$discount.value_tax_exc}{else}{convertPrice|html_entity_decode:2:'UTF-8' price=$discount.value_real}{/if}{/if}" + {rdelim} + {if !$smarty.foreach.discounts.last},{/if} +{/foreach}{/if} +], + +"shippingCost": "{$shipping_cost|html_entity_decode:2:'UTF-8'}", +{if isset($tax_cost)} +"taxCost": "{$tax_cost|html_entity_decode:2:'UTF-8'}", +{/if} +"wrappingCost": "{$wrapping_cost|html_entity_decode:2:'UTF-8'}", +"nbTotalProducts": "{$nb_total_products}", +"total": "{$total|html_entity_decode:2:'UTF-8'}", +"productTotal": "{$product_total|html_entity_decode:2:'UTF-8'}", + +{if isset($errors) && $errors} +"hasError" : true, +"errors" : [ +{foreach from=$errors key=k item=error name='errors'} + "{$error|addslashes|html_entity_decode:2:'UTF-8'}" + {if !$smarty.foreach.errors.last},{/if} +{/foreach} +] +{else} +"hasError" : false +{/if} + +{rdelim} diff --git a/modules/blockcart/blockcart-set-collapse.php b/modules/blockcart/blockcart-set-collapse.php new file mode 100644 index 000000000..fd60ae96e --- /dev/null +++ b/modules/blockcart/blockcart-set-collapse.php @@ -0,0 +1,44 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +if ( isset($_POST['ajax_blockcart_display']) || isset($_GET['ajax_blockcart_display'])) +{ + if (Tools::getValue('ajax_blockcart_display') == 'collapse') + { + $cookie->ajax_blockcart_display = 'collapsed'; + die ('collapse status of the blockcart module updated in the cookie'); + } + if (Tools::getValue('ajax_blockcart_display') == 'expand') + { + $cookie->ajax_blockcart_display = 'expanded'; + die ('expand status of the blockcart module updated in the cookie'); + } + die ('ERROR : bad status setted. Only collapse or expand status of the blockcart module are available.'); +} +else die('ERROR : No status setted.'); + diff --git a/modules/blockcart/blockcart.php b/modules/blockcart/blockcart.php new file mode 100644 index 000000000..e6b80d036 --- /dev/null +++ b/modules/blockcart/blockcart.php @@ -0,0 +1,194 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockCart extends Module +{ + public function __construct() + { + $this->name = 'blockcart'; + $this->tab = 'front_office_features'; + $this->version = '1.2'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Cart block'); + $this->description = $this->l('Adds a block containing the customer\'s shopping cart.'); + } + + public function smartyAssigns(&$smarty, &$params) + { + global $errors, $cookie; + + // Set currency + if (!(int)($params['cart']->id_currency)) + $currency = new Currency((int)$params['cookie']->id_currency); + else + $currency = new Currency((int)$params['cart']->id_currency); + if (!Validate::isLoadedObject($currency)) + $currency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + + if ($params['cart']->id_customer) + { + $customer = new Customer((int)$params['cart']->id_customer); + $taxCalculationMethod = Group::getPriceDisplayMethod((int)$customer->id_default_group); + } + else + $taxCalculationMethod = Group::getDefaultPriceDisplayMethod(); + + $useTax = !($taxCalculationMethod == PS_TAX_EXC); + + $products = $params['cart']->getProducts(true); + $nbTotalProducts = 0; + foreach ($products AS $product) + $nbTotalProducts += (int)$product['cart_quantity']; + + $wrappingCost = (float)($params['cart']->getOrderTotal($useTax, Cart::ONLY_WRAPPING)); + $totalToPay = $params['cart']->getOrderTotal($useTax); + + if ($useTax AND Configuration::get('PS_TAX_DISPLAY') == 1) + { + $totalToPayWithoutTaxes = $params['cart']->getOrderTotal(false); + $smarty->assign('tax_cost', Tools::displayPrice($totalToPay - $totalToPayWithoutTaxes, $currency)); + } + + $smarty->assign(array( + 'products' => $products, + 'customizedDatas' => Product::getAllCustomizedDatas((int)($params['cart']->id)), + 'CUSTOMIZE_FILE' => _CUSTOMIZE_FILE_, + 'CUSTOMIZE_TEXTFIELD' => _CUSTOMIZE_TEXTFIELD_, + 'discounts' => $params['cart']->getDiscounts(false, Tools::isSubmit('id_product')), + 'nb_total_products' => (int)($nbTotalProducts), + 'shipping_cost' => Tools::displayPrice($params['cart']->getOrderTotal($useTax, Cart::ONLY_SHIPPING), $currency), + 'show_wrapping' => $wrappingCost > 0 ? true : false, + 'show_tax' => (int)(Configuration::get('PS_TAX_DISPLAY') == 1 && (int)Configuration::get('PS_TAX')), + 'wrapping_cost' => Tools::displayPrice($wrappingCost, $currency), + 'product_total' => Tools::displayPrice($params['cart']->getOrderTotal($useTax, Cart::BOTH_WITHOUT_SHIPPING), $currency), + 'total' => Tools::displayPrice($totalToPay, $currency), + 'id_carrier' => (int)($params['cart']->id_carrier), + 'order_process' => Configuration::get('PS_ORDER_PROCESS_TYPE') ? 'order-opc' : 'order', + 'ajax_allowed' => (int)(Configuration::get('PS_BLOCK_CART_AJAX')) == 1 ? true : false + )); + if (sizeof($errors)) + $smarty->assign('errors', $errors); + if(isset($cookie->ajax_blockcart_display)) + $smarty->assign('colapseExpandStatus', $cookie->ajax_blockcart_display); + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockCart')) + { + $ajax = Tools::getValue('ajax'); + if ($ajax != 0 AND $ajax != 1) + $output .= '<div class="alert error">'.$this->l('Ajax : Invalid choice.').'</div>'; + else + { + Configuration::updateValue('PS_BLOCK_CART_AJAX', (int)($ajax)); + } + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + return ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + + <label>'.$this->l('Ajax cart').'</label> + <div class="margin-form"> + <input type="radio" name="ajax" id="ajax_on" value="1" '.(Tools::getValue('ajax', Configuration::get('PS_BLOCK_CART_AJAX')) ? 'checked="checked" ' : '').'/> + <label class="t" for="ajax_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="ajax" id="ajax_off" value="0" '.(!Tools::getValue('ajax', Configuration::get('PS_BLOCK_CART_AJAX')) ? 'checked="checked" ' : '').'/> + <label class="t" for="ajax_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Activate AJAX mode for cart (compatible with the default theme)').'</p> + </div> + + <center><input type="submit" name="submitBlockCart" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + } + + public function install() + { + if + ( + parent::install() == false + OR $this->registerHook('rightColumn') == false + OR $this->registerHook('header') == false + OR Configuration::updateValue('PS_BLOCK_CART_AJAX', 1) == false + ) + return false; + return true; + } + + public function hookRightColumn($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return; + + global $smarty; + $smarty->assign('order_page', strpos($_SERVER['PHP_SELF'], 'order') !== false); + $this->smartyAssigns($smarty, $params); + return $this->display(__FILE__, 'blockcart.tpl'); + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookAjaxCall($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return; + + global $smarty; + $this->smartyAssigns($smarty, $params); + $res = $this->display(__FILE__, 'blockcart-json.tpl'); + return $res; + } + + public function hookHeader() + { + if (Configuration::get('PS_CATALOG_MODE')) + return; + + Tools::addCSS(($this->_path).'blockcart.css', 'all'); + if ((int)(Configuration::get('PS_BLOCK_CART_AJAX'))) + Tools::addJS(($this->_path).'ajax-cart.js'); + } +} + diff --git a/modules/blockcart/blockcart.tpl b/modules/blockcart/blockcart.tpl new file mode 100644 index 000000000..4a146f625 --- /dev/null +++ b/modules/blockcart/blockcart.tpl @@ -0,0 +1,154 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{*************************************************************************************************************************************} +{* IMPORTANT : If you change some data here, you have to report these changes in the ./blockcart-json.js (to let ajaxCart available) *} +{*************************************************************************************************************************************} +{if $ajax_allowed} +<script type="text/javascript"> +var CUSTOMIZE_TEXTFIELD = {$CUSTOMIZE_TEXTFIELD}; +var customizationIdMessage = '{l s='Customization #' mod='blockcart' js=1}'; +var removingLinkText = '{l s='remove this product from my cart' mod='blockcart' js=1}'; +</script> +{/if} + +<!-- MODULE Block cart --> +<div id="cart_block" class="block exclusive"> + <h4> + <a href="{$link->getPageLink("$order_process", true)}">{l s='Cart' mod='blockcart'}</a> + {if $ajax_allowed} + <span id="block_cart_expand" {if isset($colapseExpandStatus) && $colapseExpandStatus eq 'expanded' || !isset($colapseExpandStatus)}class="hidden"{/if}>&nbsp;</span> + <span id="block_cart_collapse" {if isset($colapseExpandStatus) && $colapseExpandStatus eq 'collapsed'}class="hidden"{/if}>&nbsp;</span> + {/if} + </h4> + <div class="block_content"> + <!-- block summary --> + <div id="cart_block_summary" class="{if isset($colapseExpandStatus) && $colapseExpandStatus eq 'expanded' || !$ajax_allowed || !isset($colapseExpandStatus)}collapsed{else}expanded{/if}"> + <span class="ajax_cart_quantity" {if $cart_qties <= 0}style="display:none;"{/if}>{$cart_qties}</span> + <span class="ajax_cart_product_txt_s" {if $cart_qties <= 1}style="display:none"{/if}>{l s='products' mod='blockcart'}</span> + <span class="ajax_cart_product_txt" {if $cart_qties > 1}style="display:none"{/if}>{l s='product' mod='blockcart'}</span> + <span class="ajax_cart_total" {if $cart_qties <= 0}style="display:none"{/if}>{if $priceDisplay == 1}{convertPrice price=$cart->getOrderTotal(false)}{else}{convertPrice price=$cart->getOrderTotal(true)}{/if}</span> + <span class="ajax_cart_no_product" {if $cart_qties != 0}style="display:none"{/if}>{l s='(empty)' mod='blockcart'}</span> + </div> + <!-- block list of products --> + <div id="cart_block_list" class="{if isset($colapseExpandStatus) && $colapseExpandStatus eq 'expanded' || !$ajax_allowed || !isset($colapseExpandStatus)}expanded{else}collapsed{/if}"> + {if $products} + <dl class="products"> + {foreach from=$products item='product' name='myLoop'} + {assign var='productId' value=$product.id_product} + {assign var='productAttributeId' value=$product.id_product_attribute} + <dt id="cart_block_product_{$product.id_product}{if $product.id_product_attribute}_{$product.id_product_attribute}{/if}" class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"> + <span class="quantity-formated"><span class="quantity">{$product.cart_quantity}</span>x</span> + <a class="cart_block_product_name" href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category)}" title="{$product.name|escape:html:'UTF-8'}"> + {$product.name|truncate:13:'...'|escape:html:'UTF-8'}</a> + <span class="remove_link">{if !isset($customizedDatas.$productId.$productAttributeId)}<a rel="nofollow" class="ajax_cart_block_remove_link" href="{$link->getPageLink('cart', true, NULL, "delete&amp;id_product={$product.id_product}&amp;ipa={$product.id_product_attribute}&amp;token={$static_token}")}" title="{l s='remove this product from my cart' mod='blockcart'}">&nbsp;</a>{/if}</span> + <span class="price">{if $priceDisplay == $smarty.const.PS_TAX_EXC}{displayWtPrice p="`$product.total`"}{else}{displayWtPrice p="`$product.total_wt`"}{/if}</span> + </dt> + {if isset($product.attributes_small)} + <dd id="cart_block_combination_of_{$product.id_product}{if $product.id_product_attribute}_{$product.id_product_attribute}{/if}" class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"> + <a href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category)}" title="{l s='Product detail'}">{$product.attributes_small}</a> + {/if} + + <!-- Customizable datas --> + {if isset($customizedDatas.$productId.$productAttributeId)} + {if !isset($product.attributes_small)}<dd id="cart_block_combination_of_{$product.id_product}{if $product.id_product_attribute}_{$product.id_product_attribute}{/if}" class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}">{/if} + <ul class="cart_block_customizations" id="customization_{$productId}_{$productAttributeId}"> + {foreach from=$customizedDatas.$productId.$productAttributeId key='id_customization' item='customization' name='customizations'} + <li name="customization"> + <div class="deleteCustomizableProduct" id="deleteCustomizableProduct_{$id_customization|intval}_{$product.id_product|intval}_{$product.id_product_attribute|intval}"><a class="ajax_cart_block_remove_link" href="{$link->getPageLink('cart', true, NULL, "delete&amp;id_product={$product.id_product|intval}&amp;ipa={$product.id_product_attribute|intval}&amp;id_customization={$id_customization}&amp;token={$static_token}")}"> </a></div> + <span class="quantity-formated"><span class="quantity">{$customization.quantity}</span>x</span>{if isset($customization.datas.$CUSTOMIZE_TEXTFIELD.0)} + {$customization.datas.$CUSTOMIZE_TEXTFIELD.0.value|escape:html:'UTF-8'|replace:"<br />":" "|truncate:28} + {else} + {l s='Customization #' mod='blockcart'}{$id_customization|intval}{l s=':' mod='blockcart'} + {/if} + </li> + {/foreach} + </ul> + {if !isset($product.attributes_small)}</dd>{/if} + {/if} + + {if isset($product.attributes_small)}</dd>{/if} + + {/foreach} + </dl> + {/if} + <p {if $products}class="hidden"{/if} id="cart_block_no_products">{l s='No products' mod='blockcart'}</p> + + {if $discounts|@count > 0}<table id="vouchers"> + <tbody> + {foreach from=$discounts item=discount} + <tr class="bloc_cart_voucher" id="bloc_cart_voucher_{$discount.id_discount}"> + <td class="name" title="{$discount.description}">{$discount.name|cat:' : '|cat:$discount.description|truncate:18:'...'|escape:'htmlall':'UTF-8'}</td> + <td class="price">-{if $discount.value_real != '!'}{if $priceDisplay == 1}{convertPrice price=$discount.value_tax_exc}{else}{convertPrice price=$discount.value_real}{/if}{/if}</td> + <td class="delete"><a href="{$link->getPageLink("$order_process", true, NULL, "deleteDiscount={$discount.id_discount}")}" title="{l s='Delete'}"><img src="{$img_dir}icon/delete.gif" alt="{l s='Delete'}" width="11" height="13" class="icon" /></a></td> + </tr> + {/foreach} + </tbody> + </table> + {/if} + + <p id="cart-prices"> + <span>{l s='Shipping' mod='blockcart'}</span> + <span id="cart_block_shipping_cost" class="price ajax_cart_shipping_cost">{$shipping_cost}</span> + <br/> + {if $show_wrapping} + {assign var='blockcart_cart_flag' value='Cart::ONLY_WRAPPING'|constant} + <span>{l s='Wrapping' mod='blockcart'}</span> + <span id="cart_block_wrapping_cost" class="price cart_block_wrapping_cost">{if $priceDisplay == 1}{convertPrice price=$cart->getOrderTotal(false, $blockcart_cart_flag)}{else}{convertPrice price=$cart->getOrderTotal(true, $blockcart_cart_flag)}{/if}</span> + <br/> + {/if} + {if $show_tax && isset($tax_cost)} + <span>{l s='Tax' mod='blockcart'}</span> + <span id="cart_block_tax_cost" class="price ajax_cart_tax_cost">{$tax_cost}</span> + <br/> + {/if} + <span>{l s='Total' mod='blockcart'}</span> + <span id="cart_block_total" class="price ajax_block_cart_total">{$total}</span> + </p> + {if $use_taxes && $display_tax_label == 1 && $show_tax} + {if $priceDisplay == 0} + <p id="cart-price-precisions"> + {l s='Prices are tax included' mod='blockcart'} + </p> + {/if} + {if $priceDisplay == 1} + <p id="cart-price-precisions"> + {l s='Prices are tax excluded' mod='blockcart'} + </p> + {/if} + {/if} + <p id="cart-buttons"> + {capture name=step_order_process} + {if $order_process == 'order'}step=1{/if} + {/capture} + {if $order_process == 'order'}<a href="{$link->getPageLink("$order_process", true)}" class="button_small" title="{l s='Cart' mod='blockcart'}">{l s='Cart' mod='blockcart'}</a>{/if} + <a href="{$link->getPageLink("$order_process", true, NULL, "{$smarty.capture.step_order_process}")}" id="button_order_cart" class="exclusive{if $order_process == 'order-opc'}_large{/if}" title="{l s='Check out' mod='blockcart'}">{l s='Check out' mod='blockcart'}</a> + </p> + </div> + </div> +</div> +<!-- /MODULE Block cart --> + diff --git a/modules/blockcart/config.xml b/modules/blockcart/config.xml new file mode 100755 index 000000000..d94896c1f --- /dev/null +++ b/modules/blockcart/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockcart</name> + <displayName><![CDATA[Cart block]]></displayName> + <version><![CDATA[1.2]]></version> + <description><![CDATA[Adds a block containing the customer&#039;s shopping cart.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockcart/de.php b/modules/blockcart/de.php new file mode 100644 index 000000000..83313e1fe --- /dev/null +++ b/modules/blockcart/de.php @@ -0,0 +1,34 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcart}prestashop>blockcart_20351b3328c35ab617549920f5cb4939'] = 'Benutzereinstellung Nr.'; +$_MODULE['<{blockcart}prestashop>blockcart_ed6e9a09a111035684bb23682561e12d'] = 'dieses Produkt aus meinem Warenkorb entfernen'; +$_MODULE['<{blockcart}prestashop>blockcart_a85eba4c6c699122b2bb1387ea4813ad'] = 'Warenkorb'; +$_MODULE['<{blockcart}prestashop>blockcart_86024cad1e83101d97359d7351051156'] = 'Produkte'; +$_MODULE['<{blockcart}prestashop>blockcart_f5bf48aa40cad7891eb709fcf1fde128'] = 'Produkt'; +$_MODULE['<{blockcart}prestashop>blockcart_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(leer)'; +$_MODULE['<{blockcart}prestashop>blockcart_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Produktdetail'; +$_MODULE['<{blockcart}prestashop>blockcart_853ae90f0351324bd73ea615e6487517'] = ':'; +$_MODULE['<{blockcart}prestashop>blockcart_09dc02ecbb078868a3a86dded030076d'] = 'Keine Produkte'; +$_MODULE['<{blockcart}prestashop>blockcart_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{blockcart}prestashop>blockcart_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Versand'; +$_MODULE['<{blockcart}prestashop>blockcart_ba794350deb07c0c96fe73bd12239059'] = 'Verpackung'; +$_MODULE['<{blockcart}prestashop>blockcart_4b78ac8eb158840e9638a3aeb26c4a9d'] = 'Steuer'; +$_MODULE['<{blockcart}prestashop>blockcart_96b0141273eabab320119c467cdcaf17'] = 'Gesamt'; +$_MODULE['<{blockcart}prestashop>blockcart_0d11c2b75cf03522c8d97938490466b2'] = 'Preise inkl. MsWst.'; +$_MODULE['<{blockcart}prestashop>blockcart_41202aa6b8cf7ae885644717dab1e8b4'] = 'Preise zzgl. MsWst.'; +$_MODULE['<{blockcart}prestashop>blockcart_377e99e7404b414341a9621f7fb3f906'] = 'Bestellen'; +$_MODULE['<{blockcart}prestashop>blockcart_c2e1362a9710a3dd86f937c2ea1f336d'] = 'Block Warenkorb'; +$_MODULE['<{blockcart}prestashop>blockcart_e03093a5753b436ee1de63b6e3e1bd02'] = 'Fügt einen Block mit dem Warenkorb des Kunden hinzu'; +$_MODULE['<{blockcart}prestashop>blockcart_eb4ae207521bbe6403f7fe9564d38cda'] = 'Ajax: ungültige Wahl.'; +$_MODULE['<{blockcart}prestashop>blockcart_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blockcart}prestashop>blockcart_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blockcart}prestashop>blockcart_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockcart}prestashop>blockcart_614a8820aa4ac08ce2ee398a41b10778'] = 'Ajax-Warenkorb'; +$_MODULE['<{blockcart}prestashop>blockcart_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blockcart}prestashop>blockcart_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blockcart}prestashop>blockcart_dba281afb9a38e654ea9dab4cd6cb0ca'] = 'Ajax-Modus für Warenkorb aktivieren (kompatibel mit Standardthema)'; +$_MODULE['<{blockcart}prestashop>blockcart_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockcart/en.php b/modules/blockcart/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockcart/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockcart/es.php b/modules/blockcart/es.php new file mode 100644 index 000000000..35fb85dca --- /dev/null +++ b/modules/blockcart/es.php @@ -0,0 +1,32 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcart}prestashop>blockcart_c2e1362a9710a3dd86f937c2ea1f336d'] = 'Carrito'; +$_MODULE['<{blockcart}prestashop>blockcart_e03093a5753b436ee1de63b6e3e1bd02'] = 'Añadir un bloque que contenga el carrito de compra del cliente'; +$_MODULE['<{blockcart}prestashop>blockcart_eb4ae207521bbe6403f7fe9564d38cda'] = 'Ajax: opción incorrecta.'; +$_MODULE['<{blockcart}prestashop>blockcart_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blockcart}prestashop>blockcart_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blockcart}prestashop>blockcart_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blockcart}prestashop>blockcart_614a8820aa4ac08ce2ee398a41b10778'] = 'Carrito Ajax'; +$_MODULE['<{blockcart}prestashop>blockcart_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blockcart}prestashop>blockcart_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blockcart}prestashop>blockcart_dba281afb9a38e654ea9dab4cd6cb0ca'] = 'Modo AJAX para el carrito (compatible con el tema por defecto)'; +$_MODULE['<{blockcart}prestashop>blockcart_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockcart}prestashop>blockcart_20351b3328c35ab617549920f5cb4939'] = 'Personalización n°'; +$_MODULE['<{blockcart}prestashop>blockcart_ed6e9a09a111035684bb23682561e12d'] = 'eliminar este producto de mi carrito'; +$_MODULE['<{blockcart}prestashop>blockcart_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrito'; +$_MODULE['<{blockcart}prestashop>blockcart_86024cad1e83101d97359d7351051156'] = 'productos'; +$_MODULE['<{blockcart}prestashop>blockcart_f5bf48aa40cad7891eb709fcf1fde128'] = 'producto'; +$_MODULE['<{blockcart}prestashop>blockcart_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(vacío)'; +$_MODULE['<{blockcart}prestashop>blockcart_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Detalle del producto'; +$_MODULE['<{blockcart}prestashop>blockcart_853ae90f0351324bd73ea615e6487517'] = ':'; +$_MODULE['<{blockcart}prestashop>blockcart_09dc02ecbb078868a3a86dded030076d'] = 'Sin producto'; +$_MODULE['<{blockcart}prestashop>blockcart_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{blockcart}prestashop>blockcart_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Transporte'; +$_MODULE['<{blockcart}prestashop>blockcart_ba794350deb07c0c96fe73bd12239059'] = 'Embalaje'; +$_MODULE['<{blockcart}prestashop>blockcart_4b78ac8eb158840e9638a3aeb26c4a9d'] = 'Impuestos'; +$_MODULE['<{blockcart}prestashop>blockcart_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{blockcart}prestashop>blockcart_0d11c2b75cf03522c8d97938490466b2'] = 'Estos precios se entienden IVA incluído'; +$_MODULE['<{blockcart}prestashop>blockcart_41202aa6b8cf7ae885644717dab1e8b4'] = 'Estos precios se entienden sin IVA'; +$_MODULE['<{blockcart}prestashop>blockcart_377e99e7404b414341a9621f7fb3f906'] = 'Confirmar'; diff --git a/modules/blockcart/fr.php b/modules/blockcart/fr.php new file mode 100644 index 000000000..d9e8a7051 --- /dev/null +++ b/modules/blockcart/fr.php @@ -0,0 +1,32 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcart}prestashop>blockcart_c2e1362a9710a3dd86f937c2ea1f336d'] = 'Bloc panier'; +$_MODULE['<{blockcart}prestashop>blockcart_e03093a5753b436ee1de63b6e3e1bd02'] = 'Ajoute un bloc avec le contenu du panier du client'; +$_MODULE['<{blockcart}prestashop>blockcart_eb4ae207521bbe6403f7fe9564d38cda'] = 'Ajax : choix invalide.'; +$_MODULE['<{blockcart}prestashop>blockcart_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blockcart}prestashop>blockcart_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blockcart}prestashop>blockcart_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blockcart}prestashop>blockcart_614a8820aa4ac08ce2ee398a41b10778'] = 'Panier AJAX'; +$_MODULE['<{blockcart}prestashop>blockcart_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blockcart}prestashop>blockcart_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{blockcart}prestashop>blockcart_dba281afb9a38e654ea9dab4cd6cb0ca'] = 'Activer le mode AJAX du panier (compatible avec le thème par défaut)'; +$_MODULE['<{blockcart}prestashop>blockcart_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockcart}prestashop>blockcart_20351b3328c35ab617549920f5cb4939'] = 'Personnalisation '; +$_MODULE['<{blockcart}prestashop>blockcart_ed6e9a09a111035684bb23682561e12d'] = 'supprimer cet article du panier'; +$_MODULE['<{blockcart}prestashop>blockcart_a85eba4c6c699122b2bb1387ea4813ad'] = 'Panier'; +$_MODULE['<{blockcart}prestashop>blockcart_86024cad1e83101d97359d7351051156'] = 'articles'; +$_MODULE['<{blockcart}prestashop>blockcart_f5bf48aa40cad7891eb709fcf1fde128'] = 'article'; +$_MODULE['<{blockcart}prestashop>blockcart_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(vide)'; +$_MODULE['<{blockcart}prestashop>blockcart_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Détails de l\'article'; +$_MODULE['<{blockcart}prestashop>blockcart_853ae90f0351324bd73ea615e6487517'] = ' :'; +$_MODULE['<{blockcart}prestashop>blockcart_09dc02ecbb078868a3a86dded030076d'] = 'Aucun produit'; +$_MODULE['<{blockcart}prestashop>blockcart_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{blockcart}prestashop>blockcart_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Expédition'; +$_MODULE['<{blockcart}prestashop>blockcart_ba794350deb07c0c96fe73bd12239059'] = 'Emballage'; +$_MODULE['<{blockcart}prestashop>blockcart_4b78ac8eb158840e9638a3aeb26c4a9d'] = 'Taxes'; +$_MODULE['<{blockcart}prestashop>blockcart_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{blockcart}prestashop>blockcart_0d11c2b75cf03522c8d97938490466b2'] = 'Les prix sont TTC'; +$_MODULE['<{blockcart}prestashop>blockcart_41202aa6b8cf7ae885644717dab1e8b4'] = 'Les prix sont HT'; +$_MODULE['<{blockcart}prestashop>blockcart_377e99e7404b414341a9621f7fb3f906'] = 'Commander'; diff --git a/modules/blockcart/img/icon/basket.png b/modules/blockcart/img/icon/basket.png new file mode 100644 index 0000000000000000000000000000000000000000..b0686d78717529bb742ef070d1bda47a7c6f979f GIT binary patch literal 669 zcmV;O0%HA%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!FG)l}R5;6} zlTU~eQ5?tL8>X2Z$8|*3m`ciVNwH*EI!K4;uvAKH6fHzx?V&@^We*)X?7dsir9(vp z8s0qC66hg_FvDdP+YZ*QQ<N3kPEqPQI%?myl+>Xq*asiJ^PAt__udR03<hK?iz8cH zwgpP1l29xbCA%2<w=K-wUz(Ns%^Oi4&n-7xWc_=4?)td{_x@`FB+rOqKiM1EHoDT1 zWsB!zUKrdxf9>JSKMNpvg7nRd;*rSO>RS?^_43zGp9!-$Vr8Z;-<q&3aLV7FS9z1@ zFLmORt;N&Ru}Q^RFED$Iw#byffANnqs8lL9Ez3F#NVnS+Kp+x{(9FVPb28`?bzLW_ zs*<Or>c)wwgHkS+YjrxEH>PP4=o*Ja%j@-qQ7nuXR|G+z`F#G__zp#^)oN!YNg~y1 z^~|0zhm_4`@5r+3Xt&!}L!nR@MFO-?D2!7|UpJf0T_|9HeV`8KcGd}Kc-Emip&y|t z_#%p8-7t&=E*g!lG#ZU>nBYAEj>EBt4o4jhM;RJ-I-N_<7<3u_xS}Xbk7%04w(w;0 zJ9vZz;{qIPf*|w*bT@RBO#o`l2JF2T=VSmKyFa;k3+QnBw+YIugUjVAvW{-In@tq= zcswQ8$Dl7zB!&WY@O=0src$Xc9HR*Gv(tqJp|8MRP(`o?-T@Vz_k&BxWbzRI>pqdd zgAD|epI0;lNkiCm<IqX3*Lz_5FW9X_A|WtMr_-GueKwFfwd4_G00000NkvXXu0mjf Db89OD literal 0 HcmV?d00001 diff --git a/modules/blockcart/img/icon/basket_go.png b/modules/blockcart/img/icon/basket_go.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8b9a57698d8bcfd8f1f3d40f992caff3554e32 GIT binary patch literal 777 zcmV+k1NQuhP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!n@L1LR5;6} zlU+#DQ5eSm5y<SuAfzy;MhHf+ObQ|EO0ps%nus*bQb|);t8k#X(rvh!Yn#I{=f-mX z{@d6GYjc~aYw4!6>E=fyuAA=Ktrvw>RP5<&7h*Ts$HjZ`yyrZ>m-jgw3IO##wdLW` z(o#+$k;wfg0RQ=7U59z*^NUbyP3m1)yUQ#z{4s!-E889O5ZY&<@V!HK;5{<BRuQP& z7C_7#zBvZzs}<aoIpOw?zZIBfvbs*;#ie_C&X$1J(@}e`C5%SRC`20De5Utk$UB?S z_n+FJ)abOo0hX7S^(3q$2`d?mMn6O%k@V{7Dux*Mx4F4FI2;a;9%LHh7jhSBwR&AH zmnS6>Nm3*dMKVciQ>hdP0O4?$8;ivd2n1rGPzZLrz1rvV!DuvA@tHE*8a@HNK?ku| zT$2F{g~E>%nQ}NDk7H_Ts$gPbg5~%7OWbbvKAX+PF`LbK27{q^U|?W(<8aAWv7d)( zeG%@6>)8YXfj}^t-D7fc@)H4oOydTFL0GNU>jLXp@R`zdGkp^ErsHXmrwY!52JNmZ zIH%s5Hql13w6t_&0b^rh<0B&@1x}}vWwBT|CX*?@jVXn9Q3v;eHfyve`q3Y12OaCf zZEFQiJ!XN|%B{=-JRT310KhN|*X43Sr_)_)B>QH}s-OV!@iz3nY(kH}9+J^!=%=Nq zHJ?FYH}!MlIcS>xLBe8bwb~+;O0}oPcm$4kKdiG#(9u3Td-H@qS}`~+L6h|Y3cGT? z@9(6FHvl9okg%XsDj}1}aCMN4i<<o?SLdTlk%zkB)6hkF(7;rn@IfvvH=GY|`<XV^ zQR$BL8+17ic2TKA!d=IBJYLRU0oV_z^#ffyk>5$NH}`)5qM)n=Nef1O00000NkvXX Hu0mjfkRfIr literal 0 HcmV?d00001 diff --git a/modules/blockcart/img/icon/checkout.png b/modules/blockcart/img/icon/checkout.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8b9a57698d8bcfd8f1f3d40f992caff3554e32 GIT binary patch literal 777 zcmV+k1NQuhP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!n@L1LR5;6} zlU+#DQ5eSm5y<SuAfzy;MhHf+ObQ|EO0ps%nus*bQb|);t8k#X(rvh!Yn#I{=f-mX z{@d6GYjc~aYw4!6>E=fyuAA=Ktrvw>RP5<&7h*Ts$HjZ`yyrZ>m-jgw3IO##wdLW` z(o#+$k;wfg0RQ=7U59z*^NUbyP3m1)yUQ#z{4s!-E889O5ZY&<@V!HK;5{<BRuQP& z7C_7#zBvZzs}<aoIpOw?zZIBfvbs*;#ie_C&X$1J(@}e`C5%SRC`20De5Utk$UB?S z_n+FJ)abOo0hX7S^(3q$2`d?mMn6O%k@V{7Dux*Mx4F4FI2;a;9%LHh7jhSBwR&AH zmnS6>Nm3*dMKVciQ>hdP0O4?$8;ivd2n1rGPzZLrz1rvV!DuvA@tHE*8a@HNK?ku| zT$2F{g~E>%nQ}NDk7H_Ts$gPbg5~%7OWbbvKAX+PF`LbK27{q^U|?W(<8aAWv7d)( zeG%@6>)8YXfj}^t-D7fc@)H4oOydTFL0GNU>jLXp@R`zdGkp^ErsHXmrwY!52JNmZ zIH%s5Hql13w6t_&0b^rh<0B&@1x}}vWwBT|CX*?@jVXn9Q3v;eHfyve`q3Y12OaCf zZEFQiJ!XN|%B{=-JRT310KhN|*X43Sr_)_)B>QH}s-OV!@iz3nY(kH}9+J^!=%=Nq zHJ?FYH}!MlIcS>xLBe8bwb~+;O0}oPcm$4kKdiG#(9u3Td-H@qS}`~+L6h|Y3cGT? z@9(6FHvl9okg%XsDj}1}aCMN4i<<o?SLdTlk%zkB)6hkF(7;rn@IfvvH=GY|`<XV^ zQR$BL8+17ic2TKA!d=IBJYLRU0oV_z^#ffyk>5$NH}`)5qM)n=Nef1O00000NkvXX Hu0mjfkRfIr literal 0 HcmV?d00001 diff --git a/modules/blockcart/img/icon/delete.gif b/modules/blockcart/img/icon/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..348537e130264de1f39a9163b46e829a564b4499 GIT binary patch literal 103 zcmZ?wbhEHb<YwSySj52a|Ns9}r%uh9H7hkW)zs9K0R|L*vM{m(IXWN#kXi<29S*K5 xr*%(>WeG&|oaAH<-KIHDfQQMjPHk1yo0;pD{+Z-peR!*PvpCP%$DRxf)&S}mA1eR= literal 0 HcmV?d00001 diff --git a/modules/blockcart/it.php b/modules/blockcart/it.php new file mode 100644 index 000000000..dab311f5f --- /dev/null +++ b/modules/blockcart/it.php @@ -0,0 +1,34 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcart}prestashop>blockcart_20351b3328c35ab617549920f5cb4939'] = 'Personalizzazione n.'; +$_MODULE['<{blockcart}prestashop>blockcart_ed6e9a09a111035684bb23682561e12d'] = 'rimuovi questo prodotto dal mio carrello'; +$_MODULE['<{blockcart}prestashop>blockcart_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrello'; +$_MODULE['<{blockcart}prestashop>blockcart_86024cad1e83101d97359d7351051156'] = 'prodotti'; +$_MODULE['<{blockcart}prestashop>blockcart_f5bf48aa40cad7891eb709fcf1fde128'] = 'prodotto'; +$_MODULE['<{blockcart}prestashop>blockcart_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(vuoto)'; +$_MODULE['<{blockcart}prestashop>blockcart_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Dettaglio prodotto'; +$_MODULE['<{blockcart}prestashop>blockcart_853ae90f0351324bd73ea615e6487517'] = ':'; +$_MODULE['<{blockcart}prestashop>blockcart_09dc02ecbb078868a3a86dded030076d'] = 'Nessun prodotto'; +$_MODULE['<{blockcart}prestashop>blockcart_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{blockcart}prestashop>blockcart_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Spedizione'; +$_MODULE['<{blockcart}prestashop>blockcart_ba794350deb07c0c96fe73bd12239059'] = 'Imballaggio'; +$_MODULE['<{blockcart}prestashop>blockcart_4b78ac8eb158840e9638a3aeb26c4a9d'] = 'Tasse'; +$_MODULE['<{blockcart}prestashop>blockcart_96b0141273eabab320119c467cdcaf17'] = 'Totale'; +$_MODULE['<{blockcart}prestashop>blockcart_0d11c2b75cf03522c8d97938490466b2'] = 'I prezzi sono IVA inclusa'; +$_MODULE['<{blockcart}prestashop>blockcart_41202aa6b8cf7ae885644717dab1e8b4'] = 'I prezzi sono IVA esclusa'; +$_MODULE['<{blockcart}prestashop>blockcart_377e99e7404b414341a9621f7fb3f906'] = 'Check out'; +$_MODULE['<{blockcart}prestashop>blockcart_c2e1362a9710a3dd86f937c2ea1f336d'] = 'Blocco carrello'; +$_MODULE['<{blockcart}prestashop>blockcart_e03093a5753b436ee1de63b6e3e1bd02'] = 'Aggiunge un blocco contenente il carrello del cliente'; +$_MODULE['<{blockcart}prestashop>blockcart_eb4ae207521bbe6403f7fe9564d38cda'] = 'Ajax: scelta non valida.'; +$_MODULE['<{blockcart}prestashop>blockcart_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blockcart}prestashop>blockcart_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockcart}prestashop>blockcart_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockcart}prestashop>blockcart_614a8820aa4ac08ce2ee398a41b10778'] = 'Carrello Ajax '; +$_MODULE['<{blockcart}prestashop>blockcart_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blockcart}prestashop>blockcart_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blockcart}prestashop>blockcart_dba281afb9a38e654ea9dab4cd6cb0ca'] = 'Attivare la modalità di AJAX per il carrello (compatibile con il tema di default)'; +$_MODULE['<{blockcart}prestashop>blockcart_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockcart/logo.gif b/modules/blockcart/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..913d24725ae43abafdb3d0676aae4ead192c01a4 GIT binary patch literal 995 zcmZ?wbhEHb6krfwXlGzZOiWBlN=i*l&C1Hk&d$!y&o3z{DK9Uts;Y|X-jL9?DtY48 zqMl{>a}Vb(I9|HqM9IoC^-GV{Z@K<Y;bTKXLt|rOb8~Y`OG{f@TTf3<Z*OmZe}C81 z`4c8gm^^v%v}x03&YU@G)~q=|ux$Ob<vSKFTC{la;-yQME?c&2<;s<-SFhf%VZ+9a z8#is*v~%aqUAuPe-o1Ozo;~~b?{8glpn3Pz?oF3Ewp^dJ{@|wlr}pkYwCCW_g9i^D zI&|ph(WA$X9Xo#f_{ozePn|k-`t<2DXU?2Ecka@qOP4QSzH;TtwQJX|U%!6k`mGx` zZrr|o`_7#^_wL=hfB*ieThCA2d2{ma+Y1lh-+%V@(W6I?A3uKb<jK>gPoF(|_Wb$t z7cXACdiCn{>(_7Iym|Zf?fdudpT7V8@#Du&pFVy0^5yH-uiw6X`~Lm=j~_pN{`~pt z*RMZ+{`~#>_y7O@45MHOhJfNv7G?$pVFn$L+d+APf#U#!I){wMh6M+kIas|q8xFfo zX%SxLP!ZtF#G=7**kZv#2X|&E&J{8tM#+qwX69lBCkzF=Cn>v>)krd`9OdJ4v+4Mu z@aUANVr<=)j=-g@lZ6eOL_7-<ohF#%99h7)_?Y)B{q!9@D;biQ_$8y_Y$7kR92F99 zHRI8InA9X-l5=3r%ciu`Gj&t8bto33IEjgch8S2jx@5L1ir2_UWF+;*=%lThveM|- fDSmEd=ZXsrjZ93;tZW<%0t(DWF0Wu_Vz34P$i+8} literal 0 HcmV?d00001 diff --git a/modules/blockcategories/blockcategories.php b/modules/blockcategories/blockcategories.php new file mode 100644 index 000000000..3d97b19a8 --- /dev/null +++ b/modules/blockcategories/blockcategories.php @@ -0,0 +1,355 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7414 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockCategories extends Module +{ + public function __construct() + { + $this->name = 'blockcategories'; + $this->tab = 'front_office_features'; + $this->version = '2.0'; + $this->author = 'PrestaShop'; + + parent::__construct(); + + $this->displayName = $this->l('Categories block'); + $this->description = $this->l('Adds a block featuring product categories.'); + } + + public function install() + { + if (!parent::install() OR + !$this->registerHook('leftColumn') OR + !$this->registerHook('header') OR + // Temporary hooks. Do NOT hook any module on it. Some CRUD hook will replace them as soon as possible. + !$this->registerHook('categoryAddition') OR + !$this->registerHook('categoryUpdate') OR + !$this->registerHook('categoryDeletion') OR + !$this->registerHook('afterSaveAdminMeta') OR + !Configuration::updateValue('BLOCK_CATEG_MAX_DEPTH', 3) OR + !Configuration::updateValue('BLOCK_CATEG_DHTML', 1)) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall() OR + !Configuration::deleteByName('BLOCK_CATEG_MAX_DEPTH') OR + !Configuration::deleteByName('BLOCK_CATEG_DHTML')) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockCategories')) + { + $maxDepth = (int)(Tools::getValue('maxDepth')); + $dhtml = Tools::getValue('dhtml'); + $nbrColumns = Tools::getValue('nbrColumns',4); + if ($maxDepth < 0) + $output .= '<div class="alert error">'.$this->l('Maximum depth: Invalid number.').'</div>'; + elseif ($dhtml != 0 AND $dhtml != 1) + $output .= '<div class="alert error">'.$this->l('Dynamic HTML: Invalid choice.').'</div>'; + else + { + Configuration::updateValue('BLOCK_CATEG_MAX_DEPTH', (int)($maxDepth)); + Configuration::updateValue('BLOCK_CATEG_DHTML', (int)($dhtml)); + Configuration::updateValue('BLOCK_CATEG_NBR_COLUMN_FOOTER', $nbrColumns); + $this->_clearBlockcategoriesCache(); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + return ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Maximum depth').'</label> + <div class="margin-form"> + <input type="text" name="maxDepth" value="'.Configuration::get('BLOCK_CATEG_MAX_DEPTH').'" /> + <p class="clear">'.$this->l('Set the maximum depth of sublevels displayed in this block (0 = infinite)').'</p> + </div> + <label>'.$this->l('Dynamic').'</label> + + <div class="margin-form"> + <input type="radio" name="dhtml" id="dhtml_on" value="1" '.(Tools::getValue('dhtml', Configuration::get('BLOCK_CATEG_DHTML')) ? 'checked="checked" ' : '').'/> + <label class="t" for="dhtml_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="dhtml" id="dhtml_off" value="0" '.(!Tools::getValue('dhtml', Configuration::get('BLOCK_CATEG_DHTML')) ? 'checked="checked" ' : '').'/> + <label class="t" for="dhtml_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Activate dynamic (animated) mode for sublevels').'</p> + </div> + <label>'.$this->l('Footer columns number').'</label> + <div class="margin-form"> + <input type="text" name="nbrColumns" value="'.Configuration::get('BLOCK_CATEG_NBR_COLUMN_FOOTER').'" /> + <p class="clear">'.$this->l('Set the number of footer columns').'</p> + </div> + <center><input type="submit" name="submitBlockCategories" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + } + + public function getTree($resultParents, $resultIds, $maxDepth, $id_category = 1, $currentDepth = 0) + { + global $link; + + $children = array(); + if (isset($resultParents[$id_category]) AND sizeof($resultParents[$id_category]) AND ($maxDepth == 0 OR $currentDepth < $maxDepth)) + foreach ($resultParents[$id_category] as $subcat) + $children[] = $this->getTree($resultParents, $resultIds, $maxDepth, $subcat['id_category'], $currentDepth + 1); + if (!isset($resultIds[$id_category])) + return false; + $return = array('id' => $id_category, 'link' => $link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']), + 'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'], + 'children' => $children); + return $return; + } + + public function hookLeftColumn($params) + { + global $smarty, $cookie; + + $id_current_shop = $this->shopID; + + $id_customer = (int)($params['cookie']->id_customer); + // Get all groups for this customer and concatenate them as a string: "1,2,3..." + // It is necessary to keep the group query separate from the main select query because it is used for the cache + $groups = $id_customer ? implode(', ', Customer::getGroupsStatic($id_customer)) : _PS_DEFAULT_CUSTOMER_GROUP_; + $id_product = (int)(Tools::getValue('id_product', 0)); + $id_category = (int)(Tools::getValue('id_category', 0)); + $id_lang = (int)($params['cookie']->id_lang); + $smartyCacheId = 'blockcategories|'.$id_current_shop.'_'.$groups.'_'.$id_lang.'_'.$id_product.'_'.$id_category; + + Tools::enableCache(); + if (!$this->isCached('blockcategories.tpl', $smartyCacheId)) + { + $maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH'); + if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.$id_lang.' AND cl.`id_shop`='.(int)$id_current_shop.') + LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`) + WHERE (c.`active` = 1 OR c.`id_category` = 1) + '.((int)($maxdepth) != 0 ? ' AND `level_depth` <= '.(int)($maxdepth) : '').' + AND cg.`id_group` IN ('.pSQL($groups).') + GROUP BY id_category + ORDER BY `level_depth` ASC, c.`position` ASC') + ) + + return; + + $resultParents = array(); + $resultIds = array(); + + foreach ($result as &$row) + { + $resultParents[$row['id_parent']][] = &$row; + $resultIds[$row['id_category']] = &$row; + } + + $blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH')); + unset($resultParents); + unset($resultIds); + //TODO clean that + $res = $blockCategTree; + $shopcurrentroot = Shop::getCurrentRootCategory(); + if($blockCategTree['id'] != Shop::getCurrentRootCategory()) + $blockCategTree = $this->cleanTree($blockCategTree['children']); + $isDhtml = (Configuration::get('BLOCK_CATEG_DHTML') == 1 ? true : false); + + if (Tools::isSubmit('id_category')) + { + $cookie->last_visited_category = $id_category; + $smarty->assign('currentCategoryId', $cookie->last_visited_category); + } + if (Tools::isSubmit('id_product')) + { + if (!isset($cookie->last_visited_category) OR !Product::idIsOnCategoryId($id_product, array('0' => array('id_category' => $cookie->last_visited_category)))) + { + $product = new Product($id_product); + if (isset($product) AND Validate::isLoadedObject($product)) + $cookie->last_visited_category = (int)($product->id_category_default); + } + $smarty->assign('currentCategoryId', (int)($cookie->last_visited_category)); + } + $smarty->assign('blockCategTree', $blockCategTree); + + if (file_exists(_PS_THEME_DIR_.'modules/blockcategories/blockcategories.tpl')) + $smarty->assign('branche_tpl_path', _PS_THEME_DIR_.'modules/blockcategories/category-tree-branch.tpl'); + else + $smarty->assign('branche_tpl_path', _PS_MODULE_DIR_.'blockcategories/category-tree-branch.tpl'); + $smarty->assign('isDhtml', $isDhtml); + } + $smarty->cache_lifetime = 31536000; // 1 Year + $display = $this->display(__FILE__, 'blockcategories.tpl', $smartyCacheId); + Tools::restoreCacheSettings(); + return $display; + } + + public function hookFooter($params) + { + global $smarty, $cookie; + + $id_current_shop = $this->shopID; + + $id_customer = (int)($params['cookie']->id_customer); + // Get all groups for this customer and concatenate them as a string: "1,2,3..." + $groups = $id_customer ? implode(', ', Customer::getGroupsStatic($id_customer)) : _PS_DEFAULT_CUSTOMER_GROUP_; + $id_product = (int)(Tools::getValue('id_product', 0)); + $id_category = (int)(Tools::getValue('id_category', 0)); + $id_lang = (int)($params['cookie']->id_lang); + $smartyCacheId = 'blockcategories|'.$groups.'_'.$id_lang.'_'.$id_product.'_'.$id_category; + Tools::enableCache(); + if (!$this->isCached('blockcategories_footer.tpl', $smartyCacheId)) + { + $maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH'); + + if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = '.$id_lang.' AND cl.`id_shop`='.(int)$id_current_shop.') + LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`) + WHERE (c.`active` = 1 OR c.`id_category` = 1) + '.((int)($maxdepth) != 0 ? ' AND `level_depth` <= '.(int)($maxdepth) : '').' + AND cg.`id_group` IN ('.pSQL($groups).') + ORDER BY `level_depth` ASC, c.`position` ASC') + ) + return; + $resultParents = array(); + $resultIds = array(); + + foreach ($result as &$row) + { + $resultParents[$row['id_parent']][] = &$row; + $resultIds[$row['id_category']] = &$row; + } + //$nbrColumns = Configuration::get('BLOCK_CATEG_NBR_COLUMNS_FOOTER'); + $nbrColumns = Configuration::get('BLOCK_CATEG_NBR_COLUMN_FOOTER'); + if(!$nbrColumns) + $nbrColumns=3; + $numberColumn = abs(sizeof($result)/$nbrColumns); + $widthColumn= floor(100/$nbrColumns); + $smarty->assign('numberColumn', $numberColumn); + $smarty->assign('widthColumn', $widthColumn); + + $blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH')); + unset($resultParents); + unset($resultIds); + //TODO clean that + $res = $blockCategTree; + if($blockCategTree['id'] != Shop::getCurrentRootCategory()) + $blockCategTree = $this->cleanTree($blockCategTree['children']); + $isDhtml = (Configuration::get('BLOCK_CATEG_DHTML') == 1 ? true : false); + $isDhtml = (Configuration::get('BLOCK_CATEG_DHTML') == 1 ? true : false); + + if (Tools::isSubmit('id_category')) + { + $cookie->last_visited_category = $id_category; + $smarty->assign('currentCategoryId', $cookie->last_visited_category); + } + if (Tools::isSubmit('id_product')) + { + if (!isset($cookie->last_visited_category) OR !Product::idIsOnCategoryId($id_product, array('0' => array('id_category' => $cookie->last_visited_category)))) + { + $product = new Product($id_product); + if (isset($product) AND Validate::isLoadedObject($product)) + $cookie->last_visited_category = (int)($product->id_category_default); + } + $smarty->assign('currentCategoryId', (int)($cookie->last_visited_category)); + } + $smarty->assign('blockCategTree', $blockCategTree); + + if (file_exists(_PS_THEME_DIR_.'modules/blockcategories/blockcategories_footer.tpl')) + $smarty->assign('branche_tpl_path', _PS_THEME_DIR_.'modules/blockcategories/category-tree-branch.tpl'); + else + $smarty->assign('branche_tpl_path', _PS_MODULE_DIR_.'blockcategories/category-tree-branch.tpl'); + $smarty->assign('isDhtml', $isDhtml); + } + $smarty->cache_lifetime = 31536000; // 1 Year + $display = $this->display(__FILE__, 'blockcategories_footer.tpl', $smartyCacheId); + Tools::restoreCacheSettings(); + return $display; + } + + public function cleanTree($categories) + { + $id_category_root = (int)Shop::getCurrentRootCategory(); + foreach ($categories AS $row) + { + if ($row['id'] == $id_category_root) + return $row; + elseif (sizeof($row['children'])) + $this->cleanTree($row['children']); + } + } + + public function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + public function hookHeader() + { + Tools::addJS(_THEME_JS_DIR_.'tools/treeManagement.js'); + Tools::addCSS(($this->_path).'blockcategories.css', 'all'); + } + + private function _clearBlockcategoriesCache() + { + $this->_clearCache('blockcategories.tpl'); + Tools::restoreCacheSettings(); + } + + public function hookCategoryAddition($params) + { + $this->_clearBlockcategoriesCache(); + } + + public function hookCategoryUpdate($params) + { + $this->_clearBlockcategoriesCache(); + } + + public function hookCategoryDeletion($params) + { + $this->_clearBlockcategoriesCache(); + } + + public function hookAfterSaveAdminMeta($params) + { + $this->_clearBlockcategoriesCache(); + } +} diff --git a/modules/blockcategories/blockcategories.tpl b/modules/blockcategories/blockcategories.tpl new file mode 100644 index 000000000..2326879ef --- /dev/null +++ b/modules/blockcategories/blockcategories.tpl @@ -0,0 +1,49 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block categories module --> +<div id="categories_block_left" class="block"> + <h4>{l s='Categories' mod='blockcategories'}</h4> + <div class="block_content"> + <ul class="tree {if $isDhtml}dhtml{/if}"> + {foreach from=$blockCategTree.children item=child name=blockCategTree} + {if $smarty.foreach.blockCategTree.last} + {include file="$branche_tpl_path" node=$child last='true'} + {else} + {include file="$branche_tpl_path" node=$child} + {/if} + {/foreach} + </ul> + {* Javascript moved here to fix bug #PSCFI-151 *} + <script type="text/javascript"> + // <![CDATA[ + // we hide the tree only if JavaScript is activated + $('div#categories_block_left ul.dhtml').hide(); + // ]]> + </script> + </div> +</div> +<!-- /Block categories module --> diff --git a/modules/blockcategories/blockcategories_footer.tpl b/modules/blockcategories/blockcategories_footer.tpl new file mode 100644 index 000000000..d4eca0700 --- /dev/null +++ b/modules/blockcategories/blockcategories_footer.tpl @@ -0,0 +1,56 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block categories module --> +<div class="blockcategories_footer"> + <h4>{l s='Categories' mod='blockcategories'}</h4> +<div class="category_footer" style="float:left;clear:none;width:{$widthColumn}%"> + <div style="float:left" class="list"> + <ul class="tree {if $isDhtml}dhtml{/if}"> + + {foreach from=$blockCategTree.children item=child name=blockCategTree} + {if $smarty.foreach.blockCategTree.last} + {include file="$branche_tpl_path" node=$child last='true'} + {else} + {include file="$branche_tpl_path" node=$child} + {/if} + + {if ($smarty.foreach.blockCategTree.iteration mod $numberColumn) == 0 AND !$smarty.foreach.blockCategTree.last} + </ul> + </div> +</div> + +<div class="category_footer" style="float:left;clear:none;width:{$widthColumn}%"> + <div style="float:left" class="list"> + <ul class="tree {if $isDhtml}dhtml{/if}"> + {/if} + {/foreach} + </ul> + </div> +</div> +<br class="clear"/> +</div> +<!-- /Block categories module --> diff --git a/modules/blockcategories/category-tree-branch.tpl b/modules/blockcategories/category-tree-branch.tpl new file mode 100644 index 000000000..7c5a16e17 --- /dev/null +++ b/modules/blockcategories/category-tree-branch.tpl @@ -0,0 +1,40 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<li {if isset($last) && $last == 'true'}class="last"{/if}> + <a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'}</a> + {if $node.children|@count > 0} + <ul> + {foreach from=$node.children item=child name=categoryTreeBranch} + {if isset($smarty.foreach.categoryTreeBranch) && $smarty.foreach.categoryTreeBranch.last} + {include file="$branche_tpl_path" node=$child last='true'} + {else} + {include file="$branche_tpl_path" node=$child last='false'} + {/if} + {/foreach} + </ul> + {/if} +</li> diff --git a/modules/blockcategories/config.xml b/modules/blockcategories/config.xml new file mode 100755 index 000000000..48e0de987 --- /dev/null +++ b/modules/blockcategories/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockcategories</name> + <displayName><![CDATA[Categories block]]></displayName> + <version><![CDATA[2.0]]></version> + <description><![CDATA[Adds a block featuring product categories.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockcategories/de.php b/modules/blockcategories/de.php new file mode 100644 index 000000000..015ba55e7 --- /dev/null +++ b/modules/blockcategories/de.php @@ -0,0 +1,24 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcategories}prestashop>blockcategories_af1b98adf7f686b84cd0b443e022b7a0'] = 'Kategorien'; +$_MODULE['<{blockcategories}prestashop>blockcategories_8f0ed7c57fca428f7e3f8e64d2f00918'] = 'Blockkategorien'; +$_MODULE['<{blockcategories}prestashop>blockcategories_15a6f5841d9e4d7e62bec3319b4b7036'] = 'Fügt einen Block mit Produktkategorien hinzu'; +$_MODULE['<{blockcategories}prestashop>blockcategories_23e0d4ecc25de9b2777fdaca3e2f3193'] = 'Maximale Tiefe: Ungültige Zahl.'; +$_MODULE['<{blockcategories}prestashop>blockcategories_0cf328636f0d607ac24a5c435866b94b'] = 'Dynamisches HTML: Ungültige Wahl'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockcategories}prestashop>blockcategories_19561e33450d1d3dfe6af08df5710dd0'] = 'Maximale Tiefe'; +$_MODULE['<{blockcategories}prestashop>blockcategories_ef35cd8f1058f29151991e9ca94b36fb'] = 'Einstellung der maximalen Tiefe der Unterkategorien, die in diesem Block angezeigt werden (0 = unendlich)'; +$_MODULE['<{blockcategories}prestashop>blockcategories_971fd8cc345d8bd9f92e9f7d88fdf20c'] = 'Dynamisch'; +$_MODULE['<{blockcategories}prestashop>blockcategories_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blockcategories}prestashop>blockcategories_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blockcategories}prestashop>blockcategories_2c1199ee18b344152f35ec237acb5796'] = 'Dynamischen Modus für Unterkategorien aktivieren'; +$_MODULE['<{blockcategories}prestashop>blockcategories_4f32360218e145e3ba681a2343015eb3'] = 'Anzahl der Footerspalten'; +$_MODULE['<{blockcategories}prestashop>blockcategories_3d81ca758785a8528208613752ad2c81'] = 'Anzahl der Footerspalten'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{blockcategories}prestashop>blockcategories_footer_af1b98adf7f686b84cd0b443e022b7a0'] = 'Kategorien'; + +?> \ No newline at end of file diff --git a/modules/blockcategories/en.php b/modules/blockcategories/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockcategories/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockcategories/es.php b/modules/blockcategories/es.php new file mode 100644 index 000000000..abfe2348f --- /dev/null +++ b/modules/blockcategories/es.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcategories}prestashop>blockcategories_8f0ed7c57fca428f7e3f8e64d2f00918'] = 'Bloque de categorías '; +$_MODULE['<{blockcategories}prestashop>blockcategories_15a6f5841d9e4d7e62bec3319b4b7036'] = 'Añdir un bloque que ofrezca categorías de productos'; +$_MODULE['<{blockcategories}prestashop>blockcategories_23e0d4ecc25de9b2777fdaca3e2f3193'] = 'Nivel máximo: Número incorrecto'; +$_MODULE['<{blockcategories}prestashop>blockcategories_0cf328636f0d607ac24a5c435866b94b'] = 'HTML dinámico: opción no válida'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blockcategories}prestashop>blockcategories_19561e33450d1d3dfe6af08df5710dd0'] = 'Nivel máximo'; +$_MODULE['<{blockcategories}prestashop>blockcategories_ef35cd8f1058f29151991e9ca94b36fb'] = 'Seleccione el nivel máximo de subniveles a mostrar en este bloque (0=infinito)'; +$_MODULE['<{blockcategories}prestashop>blockcategories_971fd8cc345d8bd9f92e9f7d88fdf20c'] = 'Dinámico'; +$_MODULE['<{blockcategories}prestashop>blockcategories_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blockcategories}prestashop>blockcategories_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blockcategories}prestashop>blockcategories_2c1199ee18b344152f35ec237acb5796'] = 'Modo dinámico activado (animado) para los subniveles'; +$_MODULE['<{blockcategories}prestashop>blockcategories_4f32360218e145e3ba681a2343015eb3'] = 'Número de columnas para el footer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_3d81ca758785a8528208613752ad2c81'] = 'Determina el número de columnas para el footer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockcategories}prestashop>blockcategories_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorías'; +$_MODULE['<{blockcategories}prestashop>blockcategories_footer_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorías'; diff --git a/modules/blockcategories/fr.php b/modules/blockcategories/fr.php new file mode 100644 index 000000000..19d413b9b --- /dev/null +++ b/modules/blockcategories/fr.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcategories}prestashop>blockcategories_8f0ed7c57fca428f7e3f8e64d2f00918'] = 'Bloc catégories'; +$_MODULE['<{blockcategories}prestashop>blockcategories_15a6f5841d9e4d7e62bec3319b4b7036'] = 'Ajoute un bloc proposant une navigation au sein de vos catégories de produits'; +$_MODULE['<{blockcategories}prestashop>blockcategories_23e0d4ecc25de9b2777fdaca3e2f3193'] = 'Profondeur maximum : nombre invalide'; +$_MODULE['<{blockcategories}prestashop>blockcategories_0cf328636f0d607ac24a5c435866b94b'] = 'Dynamic HTML : choix invalide'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blockcategories}prestashop>blockcategories_19561e33450d1d3dfe6af08df5710dd0'] = 'profondeur maximum'; +$_MODULE['<{blockcategories}prestashop>blockcategories_ef35cd8f1058f29151991e9ca94b36fb'] = 'Détermine la profondeur maximale affichée (0 = infinie)'; +$_MODULE['<{blockcategories}prestashop>blockcategories_971fd8cc345d8bd9f92e9f7d88fdf20c'] = 'Dynamique'; +$_MODULE['<{blockcategories}prestashop>blockcategories_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blockcategories}prestashop>blockcategories_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivé'; +$_MODULE['<{blockcategories}prestashop>blockcategories_2c1199ee18b344152f35ec237acb5796'] = 'Activer l\'arbre dynamique (animé)'; +$_MODULE['<{blockcategories}prestashop>blockcategories_4f32360218e145e3ba681a2343015eb3'] = 'Nombre de colonnes pour le footer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_3d81ca758785a8528208613752ad2c81'] = 'Détermine le nombre de colonne pour le footer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_af1b98adf7f686b84cd0b443e022b7a0'] = 'Catégories'; +$_MODULE['<{blockcategories}prestashop>blockcategories_footer_af1b98adf7f686b84cd0b443e022b7a0'] = 'Catégories'; diff --git a/modules/blockcategories/it.php b/modules/blockcategories/it.php new file mode 100644 index 000000000..bc74bf5dd --- /dev/null +++ b/modules/blockcategories/it.php @@ -0,0 +1,24 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcategories}prestashop>blockcategories_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorie'; +$_MODULE['<{blockcategories}prestashop>blockcategories_8f0ed7c57fca428f7e3f8e64d2f00918'] = 'Blocco categorie'; +$_MODULE['<{blockcategories}prestashop>blockcategories_15a6f5841d9e4d7e62bec3319b4b7036'] = 'Aggiunge un blocco con le categorie di prodotto'; +$_MODULE['<{blockcategories}prestashop>blockcategories_23e0d4ecc25de9b2777fdaca3e2f3193'] = 'Profondità massima: numero non valido.'; +$_MODULE['<{blockcategories}prestashop>blockcategories_0cf328636f0d607ac24a5c435866b94b'] = 'HTML dinamico: scelta non valida.'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockcategories}prestashop>blockcategories_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockcategories}prestashop>blockcategories_19561e33450d1d3dfe6af08df5710dd0'] = 'Profondità massima'; +$_MODULE['<{blockcategories}prestashop>blockcategories_ef35cd8f1058f29151991e9ca94b36fb'] = 'Imposta la profondità massima di sottolivelli visualizzati in questo blocco (0 = infinito)'; +$_MODULE['<{blockcategories}prestashop>blockcategories_971fd8cc345d8bd9f92e9f7d88fdf20c'] = 'Dinamico'; +$_MODULE['<{blockcategories}prestashop>blockcategories_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blockcategories}prestashop>blockcategories_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blockcategories}prestashop>blockcategories_2c1199ee18b344152f35ec237acb5796'] = 'Attiva modalità dinamica (animato) per sottolivelli'; +$_MODULE['<{blockcategories}prestashop>blockcategories_4f32360218e145e3ba681a2343015eb3'] = 'Numero di colonne del footer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_3d81ca758785a8528208613752ad2c81'] = 'Imposta il numero di colonne del footer'; +$_MODULE['<{blockcategories}prestashop>blockcategories_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{blockcategories}prestashop>blockcategories_footer_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorie'; + +?> \ No newline at end of file diff --git a/modules/blockcategories/logo.gif b/modules/blockcategories/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..779ad58efc5776825ef81064a042eceba274a928 GIT binary patch literal 649 zcmV;40(Sk0P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!8%ab#R5;6x zQ_pJ?Q4pT}LFwAmL%O^1kn|{pqTs3IR1gt83PSKuY!B_J|A7ca=*g>sm$HQ(N)Ek< zrc#vXMLdW}TWpphCZsGREkUZr{Mg;M&b;luZ0IGA9rnH1`DVU1->eh_0hG(-dw<@) z-1S-xc+D!@wd^?<ZJkP`Qt77e`=6QHolwAsvsWu{XXE=wXjN6`)O<c~XS3PW@uPy3 zm_ly=;JWTmAY%-OY5c5dT9_o4%grEz7tCA$1w8ousd%Z9EXy1eElH9@Lcw6{pkPg! z=wx94t!Fz;ARL8q0OJp=J=6!+5DW}tAbD{9;iE`E;Mt6Jks!4FTAP1E%rFCW|E+aZ z4|pY!0QZNrf4pkI@Eh~d7xn<J#qTswp^qvc1LyfN+|M8JMDcsm+4DT%M{6gO$@u|; zZ*QzgBjgzcJ=t#H+ef+q_`!t|sL)!@BnA_hSBdrDF<0T&UQu*<{n0fJB16pun{KxY z)oK+KMUiD<;5g1|v#<$&zit5*6cR;pMGcF<l}ZItsTBEHjKLzv$e^`bjH$qck+0L~ zfNk55$z(v+^<fp{FR!hHiB0n_ParX%$^=fQ(_k3JV5s6M5QEy&C3vv+gM$f3o$vK} z&}cMxRns)%6B+&s7<A)S<=xLKNsSK+HHd&@5eph;N>Z=a`M%%phe@J_EnT0QpH7V3 jcG~XA#&PRl)Zh6(yXt(^KFGF}00000NkvXXu0mjfDwr>g literal 0 HcmV?d00001 diff --git a/modules/blockcms/ajax_blockcms.php b/modules/blockcms/ajax_blockcms.php new file mode 100755 index 000000000..fca22c15a --- /dev/null +++ b/modules/blockcms/ajax_blockcms.php @@ -0,0 +1,117 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once('../../config/config.inc.php'); +include_once('../../init.php'); +include_once('blockcms.php'); + +$blockcms = new BlockCms(); +if (!Tools::isSubmit('secure_key') OR Tools::getValue('secure_key') != $blockcms->secure_key OR !Tools::isSubmit('action')) + die(1); + +if (Tools::getValue('action') == 'getCms') +{ + if (!Validate::isInt(Tools::getValue('id_cms_category')) OR !Tools::getValue('id_cms_category')) + die(1); + + $cms_categories = Db::getInstance()->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'cms_category` c + JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category`) + WHERE c.`id_parent` = '.(int)Tools::getValue('id_cms_category').' + AND cl.`id_lang` = '.(int)$cookie->id_lang.' + ORDER BY c.`id_cms_category`'); + + $cms_pages = Db::getInstance()->ExecuteS(' + SELECT cl.`meta_title`, c.`id_cms` FROM `'._DB_PREFIX_.'cms` c + JOIN `'._DB_PREFIX_.'cms_lang` cl ON (c.`id_cms` = cl.`id_cms`) + WHERE c.`id_cms_category` = '.(int)Tools::getValue('id_cms_category').' + AND c.`active` = 1 + AND cl.`id_lang` = '.(int)$cookie->id_lang.' + ORDER BY c.`id_cms`'); + + if (Tools::getValue('id_cms_block')) + $cms_selected = Db::getInstance()->ExecuteS(' + SELECT `is_category`, `id_cms` FROM `'._DB_PREFIX_.'cms_block_page` + WHERE `id_cms_block` = '.(int)Tools::getValue('id_cms_block')); + + $html = ''; + if (sizeof($cms_categories) OR sizeof($cms_pages)) + { + $html .= ' + <table width="100%" class="table" cellspacing="0" cellpadding="0"> + <thead> + <tr> + <th width="5%" class="center"><input type="checkbox" class="noborder" name="checkme" onclick="checkallCMSBoxes($(this).attr(\'checked\'))"></th> + <th width="10%"><b>'.$blockcms->getL('ID').'</b></th> + <th width="85%"><b>'.$blockcms->getL('Name').'</b></th> + </tr> + </thead> + <tbody> + '; + foreach ($cms_categories as $cms_category) + { + $html .= ' + <tr> + <td width="5%" class="center"><input type="checkbox" class="noborder cmsBox" name="cmsBox[]" value="1_'.$cms_category['id_cms_category'].'" '.(in_array(array('id_cms' => $cms_category['id_cms_category'], 'is_category' => 1), $cms_selected) ? 'checked="checked"' : '').'></td> + <td width="10%"><b>'.$cms_category['id_cms_category'].'</b></td> + <td width="85%"><b>'.$cms_category['name'].'</b></td> + </tr>'; + } + + foreach ($cms_pages as $cms_page) + { + $html .= ' + <tr> + <td width="5%" class="center"><input type="checkbox" class="noborder cmsBox" name="cmsBox[]" value="0_'.$cms_page['id_cms'].'" '.(in_array(array('id_cms' => $cms_page['id_cms'], 'is_category' => 0), $cms_selected) ? 'checked="checked"' : '').'></td> + <td width="10%">'.$cms_page['id_cms'].'</td> + <td width="85%">'.$cms_page['meta_title'].'</td> + </tr>'; + } + } + else + $html .= $blockcms->getL('There is nothing to display in this CMS category'); + + echo $html; +} +elseif (Tools::getValue('action') == 'dnd') +{ + if ($table = Tools::getValue('table_right') OR $table = Tools::getValue('table_left')); + { + $pos = 0; + foreach ($table as $key =>$row) + { + $ids = explode('_', $row); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = '.(int)$pos.' + WHERE `id_cms_block` = '.(int)$ids[2]); + $pos++; + } + } +} + + diff --git a/modules/blockcms/blockcms.js b/modules/blockcms/blockcms.js new file mode 100755 index 000000000..3be68c297 --- /dev/null +++ b/modules/blockcms/blockcms.js @@ -0,0 +1,144 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function CMSCategory_js(value, secure_key) +{ + $.ajax({ + type: "POST", + url: '../modules/blockcms/ajax_blockcms.php', + data: 'id_cms_category='+value+'&id_cms_block='+$('#id_cms_block').val()+'&action=getCms&secure_key='+secure_key, + async : false, + success: function(msg) + { + $('#cms_subcategories').html(msg); + } + }); +} + +function checkallCMSBoxes(checked) +{ + if (checked) + $('.cmsBox').attr('checked', "checked"); + else + $('.cmsBox').attr('checked', ""); +} + +function CMSBlocksDnD(secure_key) +{ + $(document).ready(function() + { + $("#table_right").tableDnD({ + onDragStart: function(table, row) { + originalOrder = $.tableDnD.serialize(); + reOrder = ':even'; + if (table.tBodies[0].rows[1] && $('#' + table.tBodies[0].rows[1].id).hasClass('alt_row')) + reOrder = ':odd'; + }, + dragHandle: 'dragHandle', + onDragClass: 'myDragClass', + onDrop: function(table, row) { + if (originalOrder != $.tableDnD.serialize()) + { + var tableDrag = $('#' + table.id); + $.ajax({ + type: 'POST', + async: false, + url: '../modules/blockcms/ajax_blockcms.php?' + $.tableDnD.serialize(), + data: 'action=dnd&secure_key='+secure_key, + success: function(data) { + tableDrag.find('tbody tr').removeClass('alt_row'); + tableDrag.find('tbody tr' + reOrder).addClass('alt_row'); + tableDrag.find('tbody td.positions').each(function(i) { + $(this).html(i+1); + }); + tableDrag.find('tbody td.dragHandle a:hidden').show(); + tableDrag.find('tbody td.dragHandle:last a:even').hide(); + tableDrag.find('tbody td.dragHandle:first a:odd').hide(); + var reg = /_[0-9]$/g; + tableDrag.find('tbody tr').each(function(i) { + $(this).attr('id', $(this).attr('id').replace(reg, '_' + i)); + + // Update link position + var up_reg = new RegExp('position=[-]?[0-9]+&'); + + // Up links + $(this).find('td.dragHandle a:odd').attr('href', $(this).find('td.dragHandle a:odd').attr('href').replace(up_reg, 'position='+ (i - 1) +'&')); + + // Down links + $(this).find('td.dragHandle a:even').attr('href', $(this).find('td.dragHandle a:even').attr('href').replace(up_reg, 'position='+ (i + 1) +'&')); + }); + } + }); + } + } + }); + $("#table_left").tableDnD({ + onDragStart: function(table, row) { + originalOrder = $.tableDnD.serialize(); + reOrder = ':even'; + if (table.tBodies[0].rows[1] && $('#' + table.tBodies[0].rows[1].id).hasClass('alt_row')) + reOrder = ':odd'; + }, + dragHandle: 'dragHandle', + onDragClass: 'myDragClass', + onDrop: function(table, row) { + if (originalOrder != $.tableDnD.serialize()) + { + var tableDrag = $('#' + table.id); + $.ajax({ + type: 'POST', + async: false, + url: '../modules/blockcms/ajax_blockcms.php?' + $.tableDnD.serialize(), + data: 'action=dnd&secure_key='+secure_key, + success: function(data) { + tableDrag.find('tbody tr').removeClass('alt_row'); + tableDrag.find('tbody tr' + reOrder).addClass('alt_row'); + tableDrag.find('tbody td.positions').each(function(i) { + $(this).html(i+1); + }); + tableDrag.find('tbody td.dragHandle a:hidden').show(); + tableDrag.find('tbody td.dragHandle:last a:even').hide(); + tableDrag.find('tbody td.dragHandle:first a:odd').hide(); + var reg = /_[0-9]$/g; + tableDrag.find('tbody tr').each(function(i) { + $(this).attr('id', $(this).attr('id').replace(reg, '_' + i)); + + // Update link position + var up_reg = new RegExp('position=[-]?[0-9]+&'); + + // Up links + $(this).find('td.dragHandle a:odd').attr('href', $(this).find('td.dragHandle a:odd').attr('href').replace(up_reg, 'position='+ (i - 1) +'&')); + + // Down links + $(this).find('td.dragHandle a:even').attr('href', $(this).find('td.dragHandle a:even').attr('href').replace(up_reg, 'position='+ (i + 1) +'&')); + }); + } + }); + } + } + }); + }); +} diff --git a/modules/blockcms/blockcms.php b/modules/blockcms/blockcms.php new file mode 100755 index 000000000..cd12c5776 --- /dev/null +++ b/modules/blockcms/blockcms.php @@ -0,0 +1,763 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7060 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockCms extends Module +{ + private $_html; + + const LEFT_COLUMN = 0; + const RIGHT_COLUMN = 1; + + public function __construct() + { + $this->name = 'blockcms'; + $this->tab = 'front_office_features'; + $this->version = 1.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('CMS Block'); + $this->description = $this->l('Adds a block with several CMS links.'); + $this->secure_key = Tools::encrypt($this->name); + } + + public function install() + { + $languages = Language::getLanguages(false); + $queryLang = 'INSERT INTO `'._DB_PREFIX_.'cms_block_lang` (`id_cms_block`, `id_lang`) VALUES'; + foreach ($languages AS $language) + $queryLang .= '(1, '.(int)($language['id_lang']).'),'; + + if (!parent::install() OR !$this->registerHook('leftColumn') OR !$this->registerHook('rightColumn') OR !$this->registerHook('footer') OR !$this->registerHook('header') OR + !Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'cms_block`( + `id_cms_block` int(10) unsigned NOT NULL auto_increment, + `id_cms_category` int(10) unsigned NOT NULL, + `location` tinyint(1) unsigned NOT NULL, + `position` int(10) unsigned NOT NULL default \'0\', + `display_store` tinyint(1) unsigned NOT NULL default \'1\', + PRIMARY KEY (`id_cms_block`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8') OR + !Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cms_block` (`id_cms_category`, `location`, `position`) VALUES(1, 0, 0)') OR + !Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'cms_block_lang`( + `id_cms_block` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `name` varchar(40) NOT NULL default \'\', + PRIMARY KEY (`id_cms_block`, `id_lang`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8') OR + !Db::getInstance()->Execute(rtrim($queryLang, ',')) OR + !Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'cms_block_page`( + `id_cms_block_page` int(10) unsigned NOT NULL auto_increment, + `id_cms_block` int(10) unsigned NOT NULL, + `id_cms` int(10) unsigned NOT NULL, + `is_category` tinyint(1) unsigned NOT NULL, + PRIMARY KEY (`id_cms_block_page`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8') OR + !Configuration::updateValue('FOOTER_CMS', '') OR + !Configuration::updateValue('FOOTER_BLOCK_ACTIVATION', 1)) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall() OR + !Configuration::deleteByName('FOOTER_CMS') OR + !Configuration::deleteByName('FOOTER_BLOCK_ACTIVATION') OR + !Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'cms_block` , `'._DB_PREFIX_.'cms_block_page`, `'._DB_PREFIX_.'cms_block_lang`')) + return false; + return true; + } + + public function getBlockCMS($id_cms_block) + { + $cmsBlocks = Db::getInstance()->ExecuteS(' + SELECT cb.`id_cms_category`, cb.`location`, cb.`display_store`, cbl.id_lang, cbl.name + FROM `'._DB_PREFIX_.'cms_block` cb + LEFT JOIN `'._DB_PREFIX_.'cms_block_lang` cbl ON (cbl.`id_cms_block` = cb.`id_cms_block`) + WHERE cb.`id_cms_block` = '.(int)$id_cms_block); + + foreach ($cmsBlocks AS $cmsBlock) + $cmsBlocks['name'][(int)$cmsBlock['id_lang']] = $cmsBlock['name']; + return $cmsBlocks; + } + + private function getBlocksCMS($location) + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT bc.`id_cms_block`, bcl.`name` block_name, ccl.`name` category_name, bc.`position`, bc.`id_cms_category`, bc.`display_store` + FROM `'._DB_PREFIX_.'cms_block` bc + INNER JOIN `'._DB_PREFIX_.'cms_category_lang` ccl ON (bc.`id_cms_category` = ccl.`id_cms_category`) + INNER JOIN `'._DB_PREFIX_.'cms_block_lang` bcl ON (bc.`id_cms_block` = bcl.`id_cms_block`) + WHERE ccl.`id_lang` = '.(int)$cookie->id_lang.' AND bc.`location` = '.(int)$location.' AND bcl.`id_lang` = '.(int)$cookie->id_lang.' + ORDER BY bc.`position`'); + } + + public function getAllBlocksCMS() + { + return array_merge($this->getBlocksCMS(self::LEFT_COLUMN), $this->getBlocksCMS(self::RIGHT_COLUMN)); + } + + static public function getCMStitlesFooter() + { + global $cookie; + + $footerCms = Configuration::get('FOOTER_CMS'); + if (empty($footerCms)) + return array(); + $cmsCategories = explode('|', $footerCms); + $content = array(); + $link = new Link(); + foreach ($cmsCategories AS $cmsCategory) + { + $ids = explode('_', $cmsCategory); + if ($ids[0] == 1) + { + $query = Db::getInstance()->getRow(' + SELECT cl.`name`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_category_lang` cl + INNER JOIN `'._DB_PREFIX_.'cms_category` c ON (cl.`id_cms_category` = c.`id_cms_category`) + WHERE cl.`id_cms_category` = '.(int)$ids[1].' AND (c.`active` = 1 OR c.`id_cms_category` = 1) + AND cl.`id_lang` = '.(int)$cookie->id_lang); + + $content[$cmsCategory]['link'] = $link->getCMSCategoryLink((int)$ids[1], $query['link_rewrite']); + $content[$cmsCategory]['meta_title'] = $query['name']; + } + elseif (!$ids[0]) + { + $query = Db::getInstance()->getRow(' + SELECT cl.`meta_title`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_lang` cl + INNER JOIN `'._DB_PREFIX_.'cms` c ON (cl.`id_cms` = c.`id_cms`) + WHERE cl.`id_cms` = '.(int)$ids[1].' AND c.`active` = 1 + AND cl.`id_lang` = '.(int)$cookie->id_lang); + + $content[$cmsCategory]['link'] = $link->getCMSLink((int)$ids[1], $query['link_rewrite']); + $content[$cmsCategory]['meta_title'] = $query['meta_title']; + } + } + + return $content; + } + + static public function getCMStitles($location) + { + global $cookie; + + $id_current_shop = Shop::getCurrentShop(); + $cmsCategories = Db::getInstance()->ExecuteS(' + SELECT bc.`id_cms_block`, bc.`id_cms_category`, bc.`display_store`, ccl.`link_rewrite`, ccl.`name` category_name, bcl.`name` block_name + FROM `'._DB_PREFIX_.'cms_block` bc + INNER JOIN `'._DB_PREFIX_.'cms_category_lang` ccl ON (bc.`id_cms_category` = ccl.`id_cms_category`) + INNER JOIN `'._DB_PREFIX_.'cms_block_lang` bcl ON (bc.`id_cms_block` = bcl.`id_cms_block`) + WHERE bc.`location` = '.(int)($location).' AND ccl.`id_lang` = '.(int)($cookie->id_lang).' AND bcl.`id_lang` = '.(int)($cookie->id_lang).' AND bc.id_shop='.(int)$id_current_shop.' + ORDER BY `position`'); + + $content = array(); + $link = new Link(); + if (is_array($cmsCategories) AND sizeof($cmsCategories)) + foreach ($cmsCategories AS $cmsCategory) + { + $key = (int)$cmsCategory['id_cms_block']; + $content[$key]['display_store'] = $cmsCategory['display_store']; + + $content[$key]['cms'] = Db::getInstance()->ExecuteS(' + SELECT cl.`id_cms`, cl.`meta_title`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_block_page` bcp + INNER JOIN `'._DB_PREFIX_.'cms_lang` cl ON (bcp.`id_cms` = cl.`id_cms`) + INNER JOIN `'._DB_PREFIX_.'cms` c ON (bcp.`id_cms` = c.`id_cms`) + WHERE bcp.`id_cms_block` = '.(int)$cmsCategory['id_cms_block'].' AND cl.`id_lang` = '.(int)$cookie->id_lang.' AND bcp.`is_category` = 0 AND c.`active` = 1 + ORDER BY `position`'); + + $links = array(); + if (sizeof($content[$key]['cms'])) + foreach ($content[$key]['cms'] AS $row) + { + $row['link'] = $link->getCMSLink((int)($row['id_cms']), $row['link_rewrite']); + $links[] = $row; + } + + $content[$key]['cms'] = $links; + + $content[$key]['categories'] = Db::getInstance()->ExecuteS(' + SELECT bcp.`id_cms`, cl.`name`, cl.`link_rewrite` + FROM `'._DB_PREFIX_.'cms_block_page` bcp + INNER JOIN `'._DB_PREFIX_.'cms_category_lang` cl ON (bcp.`id_cms` = cl.`id_cms_category`) + WHERE bcp.`id_cms_block` = '.(int)$cmsCategory['id_cms_block'].' + AND cl.`id_lang` = '.(int)$cookie->id_lang.' + AND bcp.`is_category` = 1'); + + $links = array(); + if (sizeof($content[$key]['categories'])) + foreach ($content[$key]['categories'] as $row) + { + $row['link'] = $link->getCMSCategoryLink((int)$row['id_cms'], $row['link_rewrite']); + $links[] = $row; + } + + $content[$key]['categories'] = $links; + $content[$key]['name'] = $cmsCategory['block_name']; + $content[$key]['category_link'] = $link->getCMSCategoryLink((int)$cmsCategory['id_cms_category'], $cmsCategory['link_rewrite']); + $content[$key]['category_name'] = $cmsCategory['category_name']; + } + + return $content; + } + + public function getAllCMSTitles() + { + $titles = array(); + foreach(self::getCMStitles(self::LEFT_COLUMN) AS $key => $title) + { + unset($title['categories'], $title['name'], $title['category_link'], $title['category_name']); + $titles[$key] = $title; + } + foreach(self::getCMStitles(self::RIGHT_COLUMN) AS $key => $title) + { + unset($title['categories'], $title['name'], $title['category_link'], $title['category_name']); + $titles[$key] = $title; + } + return $titles; + } + + private function displayRecurseCheckboxes($categories, $selected, $has_suite = array()) + { + static $irow = 0; + + $img = $categories['level_depth'] == 0 ? 'lv1.gif' : 'lv'.($categories['level_depth'] + 1).'_'.((sizeof($categories['cms']) OR isset($categories['children'])) ? 'b' : 'f').'.gif'; + + $this->_html .= ' + <tr '.($irow++ % 2 ? 'class="alt_row"' : '').'> + <td width="3%"><input type="checkbox" name="footerBox[]" class="cmsBox" id="1_'.$categories['id_cms_category'].'" value="1_'.$categories['id_cms_category'].'" '. + (in_array('1_'.$categories['id_cms_category'], $selected) ? ' checked="checked"' : '').' /></td> + <td width="3%">'.$categories['id_cms_category'].'</td> + <td width="94%">'; + for ($i = 1; $i < $categories['level_depth']; $i++) + $this->_html .= '<img style="vertical-align:middle;" src="../img/admin/lvl_'.$has_suite[$i - 1].'.gif" alt="" />'; + $this->_html .= '<img style="vertical-align:middle;" src="../img/admin/'.($categories['level_depth'] == 0 ? 'lv1' : 'lv2_'.(($has_suite[$categories['level_depth'] - 1]) ? 'b' : 'f')).'.gif" alt="" /> &nbsp; + <label for="1_'.$categories['id_cms_category'].'" class="t"><b>'.$categories['name'].'</b></label></td> + </tr>'; + if (isset($categories['children'])) + foreach ($categories['children'] as $key => $category) + { + $has_suite[$categories['level_depth']] = 1; + if (sizeof($categories['children']) == $key + 1 AND !sizeof($categories['cms'])) + $has_suite[$categories['level_depth']] = 0; + $this->displayRecurseCheckboxes($category, $selected, $has_suite, 0); + } + + $cpt = 0; + foreach ($categories['cms'] as $cms) + { + $this->_html .= ' + <tr '.($irow++ % 2 ? 'class="alt_row"' : '').'> + <td width="3%"><input type="checkbox" name="footerBox[]" class="cmsBox" id="0_'.$cms['id_cms'].'" value="0_'.$cms['id_cms'].'" '. + (in_array('0_'.$cms['id_cms'], $selected) ? ' checked="checked"' : '').' /></td> + <td width="3%">'.$cms['id_cms'].'</td> + <td width="94%">'; + for ($i = 0; $i < $categories['level_depth']; $i++) + $this->_html .= '<img style="vertical-align:middle;" src="../img/admin/lvl_'.$has_suite[$i].'.gif" alt="" />'; + $this->_html .= '<img style="vertical-align:middle;" src="../img/admin/lv2_'.(++$cpt == sizeof($categories['cms']) ? 'f' : 'b').'.gif" alt="" /> &nbsp; + <label for="0_'.$cms['id_cms'].'" class="t" style="margin-top:6px;">'.$cms['meta_title'].'</label></td> + </tr>'; + } + } + + private function _displayForm() + { + global $currentIndex, $cookie; + + $cms_blocks_left = $this->getBlocksCMS(0); + $cms_blocks_right = $this->getBlocksCMS(1); + + $this->_html .= ' + <script type="text/javascript" src="../js/jquery/jquery.tablednd_0_5.js"></script> + <script type="text/javascript" src="../modules/blockcms/blockcms.js"></script> + <script type="text/javascript">CMSBlocksDnD(\''.$this->secure_key.'\');</script> + <fieldset> + <legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/logo.gif" alt="" /> '.$this->l('CMS block configuration').'</legend> + + <p><a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&addBlockCMS"><img src="'._PS_ADMIN_IMG_.'add.gif" alt="" /> '.$this->l('Add a new CMS block').'</a></p>'; + + $this->_html .= '<div style="width:440px; float:left; margin-right:10px;" ><h3>'.$this->l('List of Left CMS blocks').'</h3>'; + if (sizeof($cms_blocks_left)) + { + $this->_html .= '<table width="100%" class="table" cellspacing="0" cellpadding="0" id="table_left" class="tableDnD"> + <thead> + <tr class="nodrag nodrop"> + <th width="10%"><b>'.$this->l('ID').'</b></th> + <th width="30%" class="center"><b>'.$this->l('Name of block').'</b></th> + <th width="30%" class="center"><b>'.$this->l('Category Name').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Position').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Actions').'</b></th> + </tr> + </thead> + <tbody> + '; + $irow = 0; + foreach ($cms_blocks_left as $cms_block) + { + $this->_html .= ' + <tr id="tr_0_'.$cms_block['id_cms_block'].'_'.$cms_block['position'].'" '.($irow++ % 2 ? 'class="alt_row"' : '').'> + <td width="10%">'.$cms_block['id_cms_block'].'</td> + <td width="30%" class="center">'.(empty($cms_block['block_name']) ? $cms_block['category_name'] : $cms_block['block_name']).'</td> + <td width="30%" class="center">'.$cms_block['category_name'].'</td> + <td class="center pointer dragHandle"> + <a'.(($cms_block['position'] == (sizeof($cms_blocks_left) - 1) OR sizeof($cms_blocks_left) == 1) ? ' style="display: none;"' : '').' href="'.$currentIndex.'&configure=blockcms&id_cms_block='.$cms_block['id_cms_block'].'&way=1&position='.(int)($cms_block['position'] + 1).'&location=0&token='.Tools::getAdminTokenLite('AdminModules').'"> + <img src="../img/admin/down.gif" alt="'.$this->l('Down').'" title="'.$this->l('Down').'" /></a> + <a'.($cms_block['position'] == 0 ? ' style="display: none;"' : '').' href="'.$currentIndex.'&configure=blockcms&id_cms_block='.$cms_block['id_cms_block'].'&way=0&position='.(int)($cms_block['position'] - 1).'&location=0&token='.Tools::getAdminTokenLite('AdminModules').'"> + <img src="../img/admin/up.gif" alt="'.$this->l('Up').'" title="'.$this->l('Up').'" /></a> + </td> + <td width="10%" class="center"> + <a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&editBlockCMS&id_cms_block='.(int)($cms_block['id_cms_block']).'" title="'.$this->l('Edit').'"><img src="'._PS_ADMIN_IMG_.'edit.gif" alt="" /></a> + <a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&deleteBlockCMS&id_cms_block='.(int)($cms_block['id_cms_block']).'" title="'.$this->l('Delete').'"><img src="'._PS_ADMIN_IMG_.'delete.gif" alt="" /></a> + </td> + </tr>'; + } + $this->_html .= ' + </tbody> + </table>'; + } + else + $this->_html .= '<p style="margin-left:40px;">'.$this->l('There is no CMS block set').'</p>'; + $this->_html .= '</div>'; + + $this->_html .= '<div style="width:440px; float:left;" ><h3>'.$this->l('List of Right CMS blocks').'</h3>'; + if (sizeof($cms_blocks_right)) + { + $this->_html .= '<table width="100%" class="table" cellspacing="0" cellpadding="0" id="table_right" class="tableDnD"> + <thead> + <tr class="nodrag nodrop"> + <th width="10%"><b>'.$this->l('ID').'</b></th> + <th width="30%" class="center"><b>'.$this->l('Name of block').'</b></th> + <th width="30%" class="center"><b>'.$this->l('Category Name').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Position').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Actions').'</b></th> + </tr> + </thead> + <tbody> + '; + $irow = 0; + foreach ($cms_blocks_right as $cms_block) + { + $this->_html .= ' + <tr id="tr_1_'.$cms_block['id_cms_block'].'_'.$cms_block['position'].'" '.($irow++ % 2 ? 'class="alt_row"' : '').'> + <td width="10%">'.$cms_block['id_cms_block'].'</td> + <td width="30%" class="center">'.(empty($cms_block['block_name']) ? $cms_block['category_name'] : $cms_block['block_name']).'</td> + <td width="30%" class="center">'.$cms_block['category_name'].'</td> + <td class="center pointer dragHandle"> + <a'.(($cms_block['position'] == (sizeof($cms_blocks_right) - 1) OR sizeof($cms_blocks_right) == 1) ? ' style="display: none;"' : '').' href="'.$currentIndex.'&configure=blockcms&id_cms_block='.$cms_block['id_cms_block'].'&way=1&position='.(int)($cms_block['position'] + 1).'&location=1&token='.Tools::getAdminTokenLite('AdminModules').'"> + <img src="../img/admin/down.gif" alt="'.$this->l('Down').'" title="'.$this->l('Down').'" /></a> + <a'.($cms_block['position'] == 0 ? ' style="display: none;"' : '').' href="'.$currentIndex.'&configure=blockcms&id_cms_block='.$cms_block['id_cms_block'].'&way=0&position='.(int)($cms_block['position'] - 1).'&location=1&token='.Tools::getAdminTokenLite('AdminModules').'"> + <img src="../img/admin/up.gif" alt="'.$this->l('Up').'" title="'.$this->l('Up').'" /></a> + </td> + <td width="10%" class="center"> + <a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&editBlockCMS&id_cms_block='.(int)($cms_block['id_cms_block']).'" title="'.$this->l('Edit').'"><img src="'._PS_ADMIN_IMG_.'edit.gif" alt="" /></a> + <a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&deleteBlockCMS&id_cms_block='.(int)($cms_block['id_cms_block']).'" title="'.$this->l('Delete').'"><img src="'._PS_ADMIN_IMG_.'delete.gif" alt="" /></a> + </td> + </tr>'; + } + $this->_html .= ' + </tbody> + </table>'; + } + else + $this->_html .= '<p style="margin-left:40px;">'.$this->l('There is no CMS block set').'</p>'; + $this->_html .= '</div> + <div class="clear"></div> + </fieldset><br /> + <form method="POST" action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'"> + <fieldset> + <legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/logo.gif" alt="" /> '.$this->l('Footer\'s various links Configuration').'</legend> + <input type="checkbox" name="footer_active" id="footer_active" '.(Configuration::get('FOOTER_BLOCK_ACTIVATION') ? 'checked="checked"' : '').'> <label for="footer_active" style="float:none;">'.$this->l('Display the Footer\'s various links').'</label><br /><br /> + <table cellspacing="0" cellpadding="0" class="table" width="100%"> + <tr> + <th width="3%"><input type="checkbox" name="checkme" class="noborder" onclick="checkallCMSBoxes($(this).attr(\'checked\'))" /></th> + <th width="3%">'.$this->l('ID').'</th> + <th width="94%">'.$this->l('Name').'</th> + </tr>'; + $this->displayRecurseCheckboxes(CMSCategory::getRecurseCategory($cookie->id_lang), explode('|', Configuration::get('FOOTER_CMS'))); + $this->_html .= ' + </table> + <p class="center"><input type="submit" class="button" name="submitFooterCMS" value="'.$this->l('Save').'" /></p> + </fieldset> + </form>'; + } + + private function _displayAddForm() + { + global $currentIndex, $cookie; + + $defaultLanguage = (int)Configuration::get('PS_LANG_DEFAULT'); + $languages = Language::getLanguages(false); + $divLangName = 'name'; + + $cmsBlock = NULL; + if (Tools::isSubmit('editBlockCMS') AND Tools::getValue('id_cms_block')) + $cmsBlock = $this->getBlockCMS((int)Tools::getValue('id_cms_block')); + + $this->_html .= ' + <script type="text/javascript" src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/'.$this->name.'.js"></script> + <script type="text/javascript">id_language = Number('.$defaultLanguage.');</script> + <form method="POST" action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'"> + '; + if (Tools::getValue('id_cms_block')) + $this->_html .= '<input type="hidden" name="id_cms_block" value="'.(int)Tools::getValue('id_cms_block').'" id="id_cms_block" />'; + $this->_html .= ' + <fieldset>'; + + if (Tools::isSubmit('addBlockCMS')) + $this->_html .= '<legend><img src="'._PS_ADMIN_IMG_.'add.gif" alt="" /> '.$this->l('New CMS block').'</legend>'; + elseif (Tools::isSubmit('editBlockCMS')) + $this->_html .= '<legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/logo.gif" alt="" /> '.$this->l('Edit CMS block').'</legend>'; + + $this->_html .= ' + <label>'.$this->l('Name of block:').'</label> + <div class="margin-form">'; + + foreach ($languages as $language) + $this->_html .= ' + <div id="name_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').';float: left;"> + <input type="text" name="block_name_'.$language['id_lang'].'" id="block_name_'.$language['id_lang'].'" size="30" value="'.(Tools::getValue('block_name_'.$language['id_lang']) ? Tools::getValue('block_name_'.$language['id_lang']) : (isset($cmsBlock['name'][$language['id_lang']]) ? $cmsBlock['name'][$language['id_lang']] : '')).'" /> + </div>'; + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'name', true); + $this->_html .= '<p class="clear">'.$this->l('If you leave this field empty, the block name will use the category name').'</p> + </div><br /> + <label for="id_category">'.$this->l('Choose a CMS category:').'</label> + <div class="margin-form"> + <select name="id_category" id="id_category" onchange="CMSCategory_js($(this).val(), \''.$this->secure_key.'\')">'; + $categories = CMSCategory::getCategories((int)($cookie->id_lang), false); + $this->_html .= CMSCategory::recurseCMSCategory($categories, $categories[0][1], 1, ($cmsBlock != NULL ? $cmsBlock[0]['id_cms_category'] : 1), 1); + $this->_html .= ' + </select> + </div><br /> + + <label>'.$this->l('Location:').'</label> + <div class="margin-form"> + <select name="block_location" id="block_location"> + <option value="'.self::LEFT_COLUMN.'" '.(($cmsBlock AND $cmsBlock[0]['location'] == self::LEFT_COLUMN) ? 'selected="selected"' : '').'>'.$this->l('Left').'</option> + <option value="'.self::RIGHT_COLUMN.'" '.(($cmsBlock AND $cmsBlock[0]['location'] == self::RIGHT_COLUMN) ? 'selected="selected"' : '').'>'.$this->l('Right').'</option> + </select> + </div>'; + $this->_html .= ' + <label for="PS_STORES_DISPLAY_CMS_on">'.$this->l('Display Stores:').'</label> + <div class="margin-form"> + <img src="../img/admin/enabled.gif" alt="Yes" title="Yes" /> + <input type="radio" name="PS_STORES_DISPLAY_CMS" id="PS_STORES_DISPLAY_CMS_on" '.(($cmsBlock AND ( isset($cmsBlock[0]['display_store']) && $cmsBlock[0]['display_store'] == 0)) ? '' : 'checked="checked" ').'value="1" /> + <label class="t" for="PS_STORES_DISPLAY_CMS_on">'.$this->l('Yes').'</label> + <img src="../img/admin/disabled.gif" alt="No" title="No" style="margin-left: 10px;" /> + <input type="radio" name="PS_STORES_DISPLAY_CMS" id="PS_STORES_DISPLAY_CMS_off" '.(($cmsBlock AND ( isset($cmsBlock[0]['display_store']) && $cmsBlock[0]['display_store'] == 0)) ? 'checked="checked" ' : '').'value="0" /> + <label class="t" for="PS_STORES_DISPLAY_CMS_off">'.$this->l('No').'</label><br />' + .$this->l('Display "our stores" at the end of the block') + .'</div>'; + $this->_html .= '<div id="cms_subcategories"></div> + <p class="center"> + <input type="submit" class="button" name="submitBlockCMS" value="'.$this->l('Save').'" /> + <a class="button" style="position:relative; padding:3px 3px 4px 3px; top:1px" href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'">'.$this->l('Cancel').'</a> + </p>'; + + $this->_html .= ' + </fieldset> + </form> + <script type="text/javascript">CMSCategory_js($(\'#id_category\').val(), \''.$this->secure_key.'\')</script>'; + } + + private function _postValidation() + { + $errors = array(); + if (Tools::isSubmit('submitBlockCMS')) + { + $languages = Language::getLanguages(false); + $cmsBoxes = Tools::getValue('cmsBox'); + if (!Validate::isInt(Tools::getValue('PS_STORES_DISPLAY_CMS')) OR (Tools::getValue('PS_STORES_DISPLAY_CMS') != 0 AND Tools::getValue('PS_STORES_DISPLAY_CMS') != 1)) + $errors[] = $this->l('Invalid store display'); + if (!Validate::isInt(Tools::getValue('block_location')) OR (Tools::getValue('block_location') != self::LEFT_COLUMN AND Tools::getValue('block_location') != self::RIGHT_COLUMN)) + $errors[] = $this->l('Invalid block location'); + if (!is_array($cmsBoxes)) + $errors[] = $this->l('You must choose at least one page or subcategory to create a CMS block.'); + else + foreach ($cmsBoxes as $cmsBox) + if (!preg_match("#^[01]_[0-9]+$#", $cmsBox)) + $errors[] = $this->l('Invalid CMS page or category'); + foreach ($languages as $language) + if (strlen(Tools::getValue('block_name_'.$language['id_lang'])) > 40) + $errors[] = $this->l('Block name is too long'); + } + elseif (Tools::isSubmit('deleteBlockCMS') AND !Validate::isInt(Tools::getValue('id_cms_block'))) + $errors[] = $this->l('Invalid id_cms_block'); + elseif (Tools::isSubmit('submitFooterCMS')) + { + if (Tools::getValue('footerBox')) + foreach (Tools::getValue('footerBox') as $cmsBox) + if (!preg_match("#^[01]_[0-9]+$#", $cmsBox)) + $errors[] = $this->l('Invalid CMS page or category'); + if (Tools::getValue('footer_active') != 0 AND Tools::getValue('footer_active') != 1) + $errors[] = $this->l('Invalid activation footer'); + } + if (sizeof($errors)) + { + $this->_html .= $this->displayError(implode('<br />', $errors)); + return false; + } + return true; + } + + private function changePosition() + { + if (!Validate::isInt(Tools::getValue('position')) OR + (Tools::getValue('location') != self::LEFT_COLUMN AND Tools::getValue('location') != self::RIGHT_COLUMN) OR + (Tools::getValue('way') != 0 AND Tools::getValue('way') != 1)) + Tools::displayError(); + + $this->_html .= 'pos change!'; + if (Tools::getValue('way') == 0) + { + if (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = '.((int)Tools::getValue('position') + 1).' + WHERE `position` = '.((int)Tools::getValue('position')).' + AND `location` = '.(int)Tools::getValue('location'))) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = '.((int)Tools::getValue('position')).' + WHERE `id_cms_block` = '.(int)Tools::getValue('id_cms_block')); + } + elseif (Tools::getValue('way') == 1) + { + if(Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = '.((int)Tools::getValue('position') - 1).' + WHERE `position` = '.((int)Tools::getValue('position')).' + AND `location` = '.(int)Tools::getValue('location'))) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = '.((int)Tools::getValue('position')).' + WHERE `id_cms_block` = '.(int)Tools::getValue('id_cms_block')); + } + Tools::redirectAdmin($currentIndex.'index.php?tab=AdminModules&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules')); + } + + private function _postProcess() + { + global $currentIndex; + + if (Tools::isSubmit('submitBlockCMS')) + { + $position = Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'cms_block` + WHERE `location` = '.(int)Tools::getValue('block_location')); + $languages = Language::getLanguages(false); + if (Tools::isSubmit('addBlockCMS')) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cms_block` (`id_cms_category`, `location`, `position`, `display_store`) + VALUES('.(int)Tools::getValue('id_category').', '.(int)Tools::getValue('block_location').', + '.(int)$position.', '.(int)Tools::getValue('PS_STORES_DISPLAY_CMS').')'); + $id_cms_block = Db::getInstance()->Insert_ID(); + foreach ($languages as $language) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cms_block_lang` (`id_cms_block`, `id_lang`, `name`) + VALUES('.(int)$id_cms_block.', '.(int)$language['id_lang'].', + "'.pSQL(Tools::getValue('block_name_'.$language['id_lang'])).'")'); + } + elseif (Tools::isSubmit('editBlockCMS')) + { + $id_cms_block = Tools::getvalue('id_cms_block'); + + $old_block = Db::getInstance()->ExecuteS(' + SELECT `location`, `position` + FROM `'._DB_PREFIX_.'cms_block` + WHERE `id_cms_block` = '.(int)$id_cms_block); + + $location_change = ($old_block[0]['location'] != (int)Tools::getvalue('block_location')); + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'cms_block_page` + WHERE `id_cms_block` = '.(int)$id_cms_block); + + if ($location_change == true) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = (`position` - 1) WHERE `position` > '.(int)$old_block[0]['position'].' + AND `location` = '.(int)$old_block[0]['location']); + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `location` = '.(int)(Tools::getvalue('block_location')).', + `id_cms_category` = '.(int)(Tools::getvalue('id_category')).' + '.($location_change == true ? ', + `position` = '.(int)($position) : '').', + `display_store` = '.(int)(Tools::getValue('PS_STORES_DISPLAY_CMS')).' + WHERE `id_cms_block` = '.(int)($id_cms_block)); + + foreach ($languages as $language) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block_lang` + SET `name` = "'.pSQL(Tools::getValue('block_name_'.$language['id_lang'])).'" + WHERE `id_cms_block` = '.(int)$id_cms_block.' + AND `id_lang`= '.(int)$language['id_lang']); + } + $cmsBoxes = Tools::getValue('cmsBox'); + if (sizeof($cmsBoxes)) + foreach ($cmsBoxes as $cmsBox) + { + $cms_properties = explode('_', $cmsBox); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'cms_block_page` (`id_cms_block`, `id_cms`, `is_category`) + VALUES('.(int)$id_cms_block.', '.(int)$cms_properties[1].', '.(int)$cms_properties[0].')'); + } + if (Tools::isSubmit('addBlockCMS')) + Tools::redirectAdmin($currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&addBlockCMSConfirmation'); + elseif (Tools::isSubmit('editBlockCMS')) + Tools::redirectAdmin($currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&editBlockCMSConfirmation'); + } + elseif (Tools::isSubmit('deleteBlockCMS') AND Tools::getValue('id_cms_block')) + { + $old_block = Db::getInstance()->ExecuteS('SELECT `location`, `position` FROM `'._DB_PREFIX_.'cms_block` WHERE `id_cms_block` = '.Tools::getvalue('id_cms_block')); + if (sizeof($old_block)) + { + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'cms_block` + SET `position` = (`position` - 1) + WHERE `position` > '.(int)$old_block[0]['position'].' + AND `location` = '.(int)$old_block[0]['location']); + + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'cms_block` + WHERE `id_cms_block` = '.(int)(Tools::getValue('id_cms_block'))); + + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'cms_block_page` + WHERE `id_cms_block` = '.(int)(Tools::getValue('id_cms_block'))); + + Tools::redirectAdmin($currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&deleteBlockCMSConfirmation'); + } + else + $this->_html .= $this->displayError($this->l('Error: you are trying to delete a non-existent block cms')); + } + elseif (Tools::isSubmit('submitFooterCMS')) + { + $footer = ''; + if (Tools::getValue('footerBox')) + foreach (Tools::getValue('footerBox') as $box) + $footer .= $box.'|'; + Configuration::updateValue('FOOTER_CMS', rtrim($footer, '|')); + Configuration::updateValue('FOOTER_BLOCK_ACTIVATION', Tools::getValue('footer_active')); + + $this->_html = $this->displayConfirmation($this->l('Footer\'s CMS updated')); + } + elseif (Tools::isSubmit('addBlockCMSConfirmation')) + $this->_html = $this->displayConfirmation($this->l('Block CMS added')); + elseif (Tools::isSubmit('editBlockCMSConfirmation')) + $this->_html = $this->displayConfirmation($this->l('Block CMS edited')); + elseif (Tools::isSubmit('deleteBlockCMSConfirmation')) + $this->_html .= $this->displayConfirmation($this->l('Deletion successful')); + elseif (Tools::isSubmit('id_cms_block') AND Tools::isSubmit('way') AND Tools::isSubmit('position') AND Tools::isSubmit('location')) + $this->changePosition(); + } + + public function getContent() + { + $this->_html = ''; + if ($this->_postValidation()) + $this->_postProcess(); + $this->_html .= '<h2>'.$this->l('CMS Block configuration').'</h2>'; + if (Tools::isSubmit('addBlockCMS') OR Tools::isSubmit('editBlockCMS')) + $this->_displayAddForm(); + else + $this->_displayForm(); + return $this->_html; + } + + public function hookLeftColumn() + { + global $smarty; + + $cms_titles = self::getCMStitles(self::LEFT_COLUMN); + $smarty->assign(array( + 'block' => 1, + 'cms_titles' => $cms_titles, + 'theme_dir' => _PS_THEME_DIR_ + )); + return $this->display(__FILE__, 'blockcms.tpl'); + } + + public function hookRightColumn() + { + global $smarty; + + $cms_titles = self::getCMStitles(self::RIGHT_COLUMN); + $smarty->assign(array( + 'block' => 1, + 'cms_titles' => $cms_titles, + 'theme_dir' => _PS_THEME_DIR_ + )); + return $this->display(__FILE__, 'blockcms.tpl'); + } + + public function hookFooter() + { + global $smarty; + + if (Configuration::get('FOOTER_BLOCK_ACTIVATION')) + { + $cms_titles = self::getCMStitlesFooter(); + $smarty->assign(array( + 'block' => 0, + 'cmslinks' => $cms_titles, + 'theme_dir' => _PS_THEME_DIR_, + 'display_stores_footer' => Configuration::get('PS_STORES_DISPLAY_FOOTER') + )); + return $this->display(__FILE__, 'blockcms.tpl'); + } + return ''; + } + + public function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockcms.css', 'all'); + } + + public function getL($key) + { + $trad = array( + 'ID' => $this->l('ID'), + 'Name' => $this->l('Name'), + 'There is nothing to display in this CMS category' => $this->l('There is nothing to display in this CMS category') + ); + return $trad[$key]; + } +} diff --git a/modules/blockcms/blockcms.tpl b/modules/blockcms/blockcms.tpl new file mode 100755 index 000000000..c23058df0 --- /dev/null +++ b/modules/blockcms/blockcms.tpl @@ -0,0 +1,62 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $block == 1} + <!-- Block CMS module --> + {foreach from=$cms_titles key=cms_key item=cms_title} + <div id="informations_block_left_{$cms_key}" class="block informations_block_left"> + <h4><a href="{$cms_title.category_link}">{if !empty($cms_title.name)}{$cms_title.name}{else}{$cms_title.category_name}{/if}</a></h4> + <ul class="block_content"> + {foreach from=$cms_title.categories item=cms_page} + {if isset($cms_page.link)}<li class="bullet"><b style="margin-left:2em;"> + <a href="{$cms_page.link}" title="{$cms_page.name|escape:html:'UTF-8'}">{$cms_page.name|escape:html:'UTF-8'}</a> + </b></li>{/if} + {/foreach} + {foreach from=$cms_title.cms item=cms_page} + {if isset($cms_page.link)}<li><a href="{$cms_page.link}" title="{$cms_page.meta_title|escape:html:'UTF-8'}">{$cms_page.meta_title|escape:html:'UTF-8'}</a></li>{/if} + {/foreach} + {if $cms_title.display_store}<li><a href="{$link->getPageLink('stores')}" title="{l s='Our stores' mod='blockcms'}">{l s='Our stores' mod='blockcms'}</a></li>{/if} + </ul> + </div> + {/foreach} + <!-- /Block CMS module --> +{else} + <!-- MODULE Block footer --> + <ul class="block_various_links" id="block_various_links_footer"> + {if !$PS_CATALOG_MODE}<li class="first_item"><a href="{$link->getPageLink('prices-drop')}" title="{l s='Specials' mod='blockcms'}">{l s='Specials' mod='blockcms'}</a></li>{/if} + <li class="{if $PS_CATALOG_MODE}first_{/if}item"><a href="{$link->getPageLink('new-products')}" title="{l s='New products' mod='blockcms'}">{l s='New products' mod='blockcms'}</a></li> + {if !$PS_CATALOG_MODE}<li class="item"><a href="{$link->getPageLink('best-sales')}" title="{l s='Top sellers' mod='blockcms'}">{l s='Top sellers' mod='blockcms'}</a></li>{/if} + {if $display_stores_footer}<li class="item"><a href="{$link->getPageLink('stores')}" title="{l s='Our stores' mod='blockcms'}">{l s='Our stores' mod='blockcms'}</a></li>{/if} + <li class="item"><a href="{$link->getPageLink('contact', true)}" title="{l s='Contact us' mod='blockcms'}">{l s='Contact us' mod='blockcms'}</a></li> + {foreach from=$cmslinks item=cmslink} + {if $cmslink.meta_title != ''} + <li class="item"><a href="{$cmslink.link|addslashes}" title="{$cmslink.meta_title|escape:'htmlall':'UTF-8'}">{$cmslink.meta_title|escape:'htmlall':'UTF-8'}</a></li> + {/if} + {/foreach} + <li class="last_item">{l s='Powered by' mod='blockcms'} <a href="http://www.prestashop.com">PrestaShop</a>&trade;</li> + </ul> + <!-- /MODULE Block footer --> +{/if} diff --git a/modules/blockcms/config.xml b/modules/blockcms/config.xml new file mode 100755 index 000000000..efc8ef74c --- /dev/null +++ b/modules/blockcms/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockcms</name> + <displayName><![CDATA[CMS Block]]></displayName> + <version><![CDATA[1.1]]></version> + <description><![CDATA[Adds a block with several CMS links.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockcms/de.php b/modules/blockcms/de.php new file mode 100644 index 000000000..925b6293d --- /dev/null +++ b/modules/blockcms/de.php @@ -0,0 +1,59 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcms}prestashop>blockcms_34c869c542dee932ef8cd96d2f91cae6'] = 'Unsere Shops'; +$_MODULE['<{blockcms}prestashop>blockcms_d1aa22a3126f04664e0fe3f598994014'] = 'Specials'; +$_MODULE['<{blockcms}prestashop>blockcms_9ff0635f5737513b1a6f559ac2bff745'] = 'Neue Produkte'; +$_MODULE['<{blockcms}prestashop>blockcms_3cb29f0ccc5fd220a97df89dafe46290'] = 'Verkaufshits'; +$_MODULE['<{blockcms}prestashop>blockcms_02d4482d332e1aef3437cd61c9bcc624'] = 'Kontaktieren Sie uns'; +$_MODULE['<{blockcms}prestashop>blockcms_7a52e36bf4a1caa031c75a742fb9927a'] = 'Powered by'; +$_MODULE['<{blockcms}prestashop>blockcms_cd275312651aebf8cbbb8d3bb1c086ae'] = 'CMS-Block'; +$_MODULE['<{blockcms}prestashop>blockcms_cdca12007979fc49008fd125cdb775fc'] = 'Fügt einen Block mit mehreren CMS-Links hinzu'; +$_MODULE['<{blockcms}prestashop>blockcms_97390dd0b5ba7867120aee2ff22bfa38'] = 'CMS-Block-Konfiguration'; +$_MODULE['<{blockcms}prestashop>blockcms_1cd127158cfd245511751206f4b3c6f0'] = 'Einen neuen CMS-Block hinzufügen'; +$_MODULE['<{blockcms}prestashop>blockcms_6e1ea63625a85f6d2d9ecbfb79586351'] = 'Liste der übrigen CMS-Blocks'; +$_MODULE['<{blockcms}prestashop>blockcms_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blockcms}prestashop>blockcms_aae551ce0c29dfe39b0ff20139abdef3'] = 'Blockname'; +$_MODULE['<{blockcms}prestashop>blockcms_99121ab27aaa7472cfada9071c5ba434'] = 'Kategorienname'; +$_MODULE['<{blockcms}prestashop>blockcms_52f5e0bc3859bc5f5e25130b6c7e8881'] = 'Position'; +$_MODULE['<{blockcms}prestashop>blockcms_06df33001c1d7187fdd81ea1f5b277aa'] = 'Handlungen'; +$_MODULE['<{blockcms}prestashop>blockcms_08a38277b0309070706f6652eeae9a53'] = 'Ab'; +$_MODULE['<{blockcms}prestashop>blockcms_258f49887ef8d14ac268c92b02503aaa'] = 'Auf'; +$_MODULE['<{blockcms}prestashop>blockcms_7dce122004969d56ae2e0245cb754d35'] = 'Bearbeiten'; +$_MODULE['<{blockcms}prestashop>blockcms_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{blockcms}prestashop>blockcms_8f08c1af47e3e9611289c1882befc3a8'] = 'Es wurde keine CMS-Block-Einstellung vorgenommen'; +$_MODULE['<{blockcms}prestashop>blockcms_0a40c06f34e5c794a7f0d3085d17d63a'] = 'CMS-Blocks in der rechten Spalte'; +$_MODULE['<{blockcms}prestashop>blockcms_965be994da393e5aa15bd3a2444c6ccf'] = 'Konfiguration verschiedener Links in der Fußzeile'; +$_MODULE['<{blockcms}prestashop>blockcms_fab8ca8250236ed20b96f9750e1eacc7'] = 'Anzeige der verschiedenen Links in der Fußzeile'; +$_MODULE['<{blockcms}prestashop>blockcms_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{blockcms}prestashop>blockcms_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{blockcms}prestashop>blockcms_5aa1602194579edb6f91d7dd53eadb32'] = 'CMS-Block hinzufügen'; +$_MODULE['<{blockcms}prestashop>blockcms_e83c1afa1d3dbe19fa9becebb5ca8480'] = 'CMS-Block bearbeiten'; +$_MODULE['<{blockcms}prestashop>blockcms_7d9a9a0187e212cb7fd126afb8704bd1'] = 'Blockname'; +$_MODULE['<{blockcms}prestashop>blockcms_bdbaef442c586e1bbecb44eba1ba7e2d'] = 'Wenn Sie dieses Feld leer lassen, übernimmt der Blockname den Kategorienamen'; +$_MODULE['<{blockcms}prestashop>blockcms_7310626b183e1bcfcc61b844e8ea3c5c'] = 'Wählen Sie eine CMS-Kategorie:'; +$_MODULE['<{blockcms}prestashop>blockcms_be9469719aa6efa2fc3bd5768bc406d7'] = 'Position:'; +$_MODULE['<{blockcms}prestashop>blockcms_945d5e233cf7d6240f6b783b36a374ff'] = 'Links'; +$_MODULE['<{blockcms}prestashop>blockcms_92b09c7c48c520c3c55e497875da437c'] = 'Rechts'; +$_MODULE['<{blockcms}prestashop>blockcms_1acef6bfa7dc3360eed6bf44851fa6a4'] = 'Shops anzeigen'; +$_MODULE['<{blockcms}prestashop>blockcms_93cba07454f06a4a960172bbd6e2a435'] = 'Ja '; +$_MODULE['<{blockcms}prestashop>blockcms_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{blockcms}prestashop>blockcms_08f3899ad165f85f8596199966b8c673'] = '\"Unsere Shops\" anzeigen am Ende des Blocks'; +$_MODULE['<{blockcms}prestashop>blockcms_ea4788705e6873b424c65e91c2846b19'] = 'Abbrechen'; +$_MODULE['<{blockcms}prestashop>blockcms_f7df0009efd65cec8e54cf4ef30abf5e'] = 'Ungültige Shop-Anzeige'; +$_MODULE['<{blockcms}prestashop>blockcms_903d12e7aa8c380c290b78c1898e01b7'] = 'Ungültige Block-Position'; +$_MODULE['<{blockcms}prestashop>blockcms_92fc29650a0f9dd3fca4e5de1845f78b'] = 'Sie müssen mindestens eine Seite oder Unterkategorie wählen, um einen CMS-Block zu erstellen'; +$_MODULE['<{blockcms}prestashop>blockcms_5e75cbfbfd02a7b2fab0ed21505e811b'] = 'Ungültige CMS-Seite oder Kategorie'; +$_MODULE['<{blockcms}prestashop>blockcms_420d575844f77db5299065080d9c237f'] = 'Blockname ist zu lang'; +$_MODULE['<{blockcms}prestashop>blockcms_ede67d50014846cb8bb1b00d5fde77be'] = 'id_cms_block ist ungültig'; +$_MODULE['<{blockcms}prestashop>blockcms_05b51791a83d3cef29ad68b70d48d131'] = 'Ungültige Aktivierung Fußzeile'; +$_MODULE['<{blockcms}prestashop>blockcms_5dab5acc3c6a2a7e87e8d8926a2c763e'] = 'Versucht einen nicht vorhandenen CMS-Block zu löschen'; +$_MODULE['<{blockcms}prestashop>blockcms_138218281781fd0d938a140892d7386c'] = 'Fußzeilen-CMS erfolgreich aktualisiert'; +$_MODULE['<{blockcms}prestashop>blockcms_ddd7d8a072783afaf23e5e6843398fc9'] = 'CMS-Block erfolgreich hinzugefügt'; +$_MODULE['<{blockcms}prestashop>blockcms_31a22821c66edf7e3aa33ef1c8109f4c'] = 'CMS-Block erfolgreich bearbeitet'; +$_MODULE['<{blockcms}prestashop>blockcms_10432af9a9d55d5aa8b0f380194af673'] = 'Löschung erfolgreich'; +$_MODULE['<{blockcms}prestashop>blockcms_be58fccb15fb119b8c3d485e3a8561c4'] = 'CMS-Block-Konfiguration'; +$_MODULE['<{blockcms}prestashop>blockcms_78edb384f1a71576034e00ed6844bcc2'] = 'In dieser CMS-Kategorie gibt es nichts anzuzeigen'; + +?> \ No newline at end of file diff --git a/modules/blockcms/es.php b/modules/blockcms/es.php new file mode 100755 index 000000000..640817cf2 --- /dev/null +++ b/modules/blockcms/es.php @@ -0,0 +1,57 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcms}prestashop>blockcms_cd275312651aebf8cbbb8d3bb1c086ae'] = 'Bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_cdca12007979fc49008fd125cdb775fc'] = 'Añadir un bloque con varios links hacia sus CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_97390dd0b5ba7867120aee2ff22bfa38'] = 'Configuración de los bloques CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_1cd127158cfd245511751206f4b3c6f0'] = 'Añadir un nuevo bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_6e1ea63625a85f6d2d9ecbfb79586351'] = 'Lista de los bloques CMS de izquierda'; +$_MODULE['<{blockcms}prestashop>blockcms_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blockcms}prestashop>blockcms_aae551ce0c29dfe39b0ff20139abdef3'] = 'Nombre del bloque'; +$_MODULE['<{blockcms}prestashop>blockcms_99121ab27aaa7472cfada9071c5ba434'] = 'Nombre de la categoría CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_52f5e0bc3859bc5f5e25130b6c7e8881'] = 'Posición'; +$_MODULE['<{blockcms}prestashop>blockcms_06df33001c1d7187fdd81ea1f5b277aa'] = 'Acciones '; +$_MODULE['<{blockcms}prestashop>blockcms_08a38277b0309070706f6652eeae9a53'] = 'Bajar'; +$_MODULE['<{blockcms}prestashop>blockcms_258f49887ef8d14ac268c92b02503aaa'] = 'Subir'; +$_MODULE['<{blockcms}prestashop>blockcms_7dce122004969d56ae2e0245cb754d35'] = 'Editar'; +$_MODULE['<{blockcms}prestashop>blockcms_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{blockcms}prestashop>blockcms_8f08c1af47e3e9611289c1882befc3a8'] = 'No existe ningún bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_0a40c06f34e5c794a7f0d3085d17d63a'] = 'Lista de los bloques CMS de la derecha'; +$_MODULE['<{blockcms}prestashop>blockcms_965be994da393e5aa15bd3a2444c6ccf'] = 'Configuración de los links CMS a pie de página'; +$_MODULE['<{blockcms}prestashop>blockcms_fab8ca8250236ed20b96f9750e1eacc7'] = 'Mostrar links a pie de página'; +$_MODULE['<{blockcms}prestashop>blockcms_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{blockcms}prestashop>blockcms_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockcms}prestashop>blockcms_5aa1602194579edb6f91d7dd53eadb32'] = 'Nuevo bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_e83c1afa1d3dbe19fa9becebb5ca8480'] = 'Editar el bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_7d9a9a0187e212cb7fd126afb8704bd1'] = 'Nombre del bloque:'; +$_MODULE['<{blockcms}prestashop>blockcms_bdbaef442c586e1bbecb44eba1ba7e2d'] = 'Si deja el campo vacío, el nombre será el mismo que el de la categoría'; +$_MODULE['<{blockcms}prestashop>blockcms_7310626b183e1bcfcc61b844e8ea3c5c'] = 'Elija una categoría CMS:'; +$_MODULE['<{blockcms}prestashop>blockcms_be9469719aa6efa2fc3bd5768bc406d7'] = 'Ubicación'; +$_MODULE['<{blockcms}prestashop>blockcms_945d5e233cf7d6240f6b783b36a374ff'] = 'Izquierda'; +$_MODULE['<{blockcms}prestashop>blockcms_92b09c7c48c520c3c55e497875da437c'] = 'Derecha'; +$_MODULE['<{blockcms}prestashop>blockcms_1acef6bfa7dc3360eed6bf44851fa6a4'] = 'Mostrar tiendas:'; +$_MODULE['<{blockcms}prestashop>blockcms_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{blockcms}prestashop>blockcms_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{blockcms}prestashop>blockcms_08f3899ad165f85f8596199966b8c673'] = 'Mostrar \"nuestras tiendas\" al final del bloque'; +$_MODULE['<{blockcms}prestashop>blockcms_ea4788705e6873b424c65e91c2846b19'] = 'Volver'; +$_MODULE['<{blockcms}prestashop>blockcms_f7df0009efd65cec8e54cf4ef30abf5e'] = 'Campo \"Mostrar la tienda\" no válido'; +$_MODULE['<{blockcms}prestashop>blockcms_903d12e7aa8c380c290b78c1898e01b7'] = 'Ubicación no válida'; +$_MODULE['<{blockcms}prestashop>blockcms_92fc29650a0f9dd3fca4e5de1845f78b'] = 'Debe elegir al menos una página o subcategoría para crear un bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_5e75cbfbfd02a7b2fab0ed21505e811b'] = 'Página CMS o subcategoría no válidos'; +$_MODULE['<{blockcms}prestashop>blockcms_420d575844f77db5299065080d9c237f'] = 'Nombre del bloque demasiado largo'; +$_MODULE['<{blockcms}prestashop>blockcms_ede67d50014846cb8bb1b00d5fde77be'] = ' id_cms_block no válido'; +$_MODULE['<{blockcms}prestashop>blockcms_05b51791a83d3cef29ad68b70d48d131'] = 'Activación footer no válida'; +$_MODULE['<{blockcms}prestashop>blockcms_5dab5acc3c6a2a7e87e8d8926a2c763e'] = 'Está tratando de suprimir un bloque cms que no existe'; +$_MODULE['<{blockcms}prestashop>blockcms_138218281781fd0d938a140892d7386c'] = 'Edición de links CMS a pie de página con éxito'; +$_MODULE['<{blockcms}prestashop>blockcms_ddd7d8a072783afaf23e5e6843398fc9'] = 'El bloque CMS se ha editado con éxito'; +$_MODULE['<{blockcms}prestashop>blockcms_31a22821c66edf7e3aa33ef1c8109f4c'] = 'Se ha editado con éxito'; +$_MODULE['<{blockcms}prestashop>blockcms_87a2663d841b78f01c27c0edb4f50b76'] = 'Se ha suprimido con éxito'; +$_MODULE['<{blockcms}prestashop>blockcms_be58fccb15fb119b8c3d485e3a8561c4'] = 'Configuración del bloque CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_78edb384f1a71576034e00ed6844bcc2'] = 'No hay ningún CMS en esta categoría CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_34c869c542dee932ef8cd96d2f91cae6'] = 'Nuestras tiendas'; +$_MODULE['<{blockcms}prestashop>blockcms_d1aa22a3126f04664e0fe3f598994014'] = 'Descuentos'; +$_MODULE['<{blockcms}prestashop>blockcms_9ff0635f5737513b1a6f559ac2bff745'] = 'Nuevos productos'; +$_MODULE['<{blockcms}prestashop>blockcms_3cb29f0ccc5fd220a97df89dafe46290'] = 'Mejores ventas'; +$_MODULE['<{blockcms}prestashop>blockcms_02d4482d332e1aef3437cd61c9bcc624'] = 'Contacte con nosotros'; +$_MODULE['<{blockcms}prestashop>blockcms_7a52e36bf4a1caa031c75a742fb9927a'] = 'Creado por'; diff --git a/modules/blockcms/fr.php b/modules/blockcms/fr.php new file mode 100755 index 000000000..97ea4985c --- /dev/null +++ b/modules/blockcms/fr.php @@ -0,0 +1,57 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcms}prestashop>blockcms_cd275312651aebf8cbbb8d3bb1c086ae'] = 'Bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_cdca12007979fc49008fd125cdb775fc'] = 'Ajoute un bloc contenant plusieurs lien vers vos CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_97390dd0b5ba7867120aee2ff22bfa38'] = 'Configuration des blocs CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_1cd127158cfd245511751206f4b3c6f0'] = 'Ajouter un nouveau bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_6e1ea63625a85f6d2d9ecbfb79586351'] = 'Liste des blocs CMS de gauche'; +$_MODULE['<{blockcms}prestashop>blockcms_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blockcms}prestashop>blockcms_aae551ce0c29dfe39b0ff20139abdef3'] = 'Nom du bloc'; +$_MODULE['<{blockcms}prestashop>blockcms_99121ab27aaa7472cfada9071c5ba434'] = 'Nom de la catégorie CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_52f5e0bc3859bc5f5e25130b6c7e8881'] = 'Position'; +$_MODULE['<{blockcms}prestashop>blockcms_06df33001c1d7187fdd81ea1f5b277aa'] = 'Actions'; +$_MODULE['<{blockcms}prestashop>blockcms_08a38277b0309070706f6652eeae9a53'] = 'Bas'; +$_MODULE['<{blockcms}prestashop>blockcms_258f49887ef8d14ac268c92b02503aaa'] = 'Haut'; +$_MODULE['<{blockcms}prestashop>blockcms_7dce122004969d56ae2e0245cb754d35'] = 'Éditer'; +$_MODULE['<{blockcms}prestashop>blockcms_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{blockcms}prestashop>blockcms_8f08c1af47e3e9611289c1882befc3a8'] = 'Il n\'existe aucun bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_0a40c06f34e5c794a7f0d3085d17d63a'] = 'Liste des blocs CMS de droite'; +$_MODULE['<{blockcms}prestashop>blockcms_965be994da393e5aa15bd3a2444c6ccf'] = 'Configuration des liens CMS en pied de page'; +$_MODULE['<{blockcms}prestashop>blockcms_fab8ca8250236ed20b96f9750e1eacc7'] = 'Afficher les liens de bas de page'; +$_MODULE['<{blockcms}prestashop>blockcms_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{blockcms}prestashop>blockcms_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockcms}prestashop>blockcms_5aa1602194579edb6f91d7dd53eadb32'] = 'Nouveau bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_e83c1afa1d3dbe19fa9becebb5ca8480'] = 'Édition du bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_7d9a9a0187e212cb7fd126afb8704bd1'] = 'Nom du bloc :'; +$_MODULE['<{blockcms}prestashop>blockcms_bdbaef442c586e1bbecb44eba1ba7e2d'] = 'Si vous laissez ce champ vide, le nom du block sera le nom de la catégorie'; +$_MODULE['<{blockcms}prestashop>blockcms_7310626b183e1bcfcc61b844e8ea3c5c'] = 'Choisissez une catégorie CMS :'; +$_MODULE['<{blockcms}prestashop>blockcms_be9469719aa6efa2fc3bd5768bc406d7'] = 'Emplacement'; +$_MODULE['<{blockcms}prestashop>blockcms_945d5e233cf7d6240f6b783b36a374ff'] = 'Gauche'; +$_MODULE['<{blockcms}prestashop>blockcms_92b09c7c48c520c3c55e497875da437c'] = 'Droite'; +$_MODULE['<{blockcms}prestashop>blockcms_1acef6bfa7dc3360eed6bf44851fa6a4'] = 'Afficher les boutiques :'; +$_MODULE['<{blockcms}prestashop>blockcms_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{blockcms}prestashop>blockcms_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{blockcms}prestashop>blockcms_08f3899ad165f85f8596199966b8c673'] = 'Afficher \"Nos Boutiques\" en bas du block'; +$_MODULE['<{blockcms}prestashop>blockcms_ea4788705e6873b424c65e91c2846b19'] = 'Retour'; +$_MODULE['<{blockcms}prestashop>blockcms_f7df0009efd65cec8e54cf4ef30abf5e'] = 'Champ \"afficher la boutique\" invalide'; +$_MODULE['<{blockcms}prestashop>blockcms_903d12e7aa8c380c290b78c1898e01b7'] = 'Emplacement invalide'; +$_MODULE['<{blockcms}prestashop>blockcms_92fc29650a0f9dd3fca4e5de1845f78b'] = 'Vous devez choisir au moins une page ou sous-catégorie pour créer un bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_5e75cbfbfd02a7b2fab0ed21505e811b'] = 'Page CMS ou sous-catégorie invalide'; +$_MODULE['<{blockcms}prestashop>blockcms_420d575844f77db5299065080d9c237f'] = 'Nom du bloc trop long'; +$_MODULE['<{blockcms}prestashop>blockcms_ede67d50014846cb8bb1b00d5fde77be'] = 'id_cms_block invalide'; +$_MODULE['<{blockcms}prestashop>blockcms_05b51791a83d3cef29ad68b70d48d131'] = 'Footer activation invalide'; +$_MODULE['<{blockcms}prestashop>blockcms_5dab5acc3c6a2a7e87e8d8926a2c763e'] = 'Vous essayez de supprimer un block cms inexistant'; +$_MODULE['<{blockcms}prestashop>blockcms_138218281781fd0d938a140892d7386c'] = 'Édition des liens CMS en pied de page réussie'; +$_MODULE['<{blockcms}prestashop>blockcms_ddd7d8a072783afaf23e5e6843398fc9'] = 'Ajout du bloc CMS réussi'; +$_MODULE['<{blockcms}prestashop>blockcms_31a22821c66edf7e3aa33ef1c8109f4c'] = 'Édition du bloc CMS réussie'; +$_MODULE['<{blockcms}prestashop>blockcms_87a2663d841b78f01c27c0edb4f50b76'] = 'Suppression réussie'; +$_MODULE['<{blockcms}prestashop>blockcms_be58fccb15fb119b8c3d485e3a8561c4'] = 'Configuration du bloc CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_78edb384f1a71576034e00ed6844bcc2'] = 'Il n\'y a aucun CMS dans cette catégorie CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_34c869c542dee932ef8cd96d2f91cae6'] = 'Nos magasins'; +$_MODULE['<{blockcms}prestashop>blockcms_d1aa22a3126f04664e0fe3f598994014'] = 'Promotions'; +$_MODULE['<{blockcms}prestashop>blockcms_9ff0635f5737513b1a6f559ac2bff745'] = 'Nouveaux produits'; +$_MODULE['<{blockcms}prestashop>blockcms_3cb29f0ccc5fd220a97df89dafe46290'] = 'Meilleures ventes'; +$_MODULE['<{blockcms}prestashop>blockcms_02d4482d332e1aef3437cd61c9bcc624'] = 'Contactez-nous'; +$_MODULE['<{blockcms}prestashop>blockcms_7a52e36bf4a1caa031c75a742fb9927a'] = 'Propulsé par'; diff --git a/modules/blockcms/it.php b/modules/blockcms/it.php new file mode 100644 index 000000000..2fdb6135a --- /dev/null +++ b/modules/blockcms/it.php @@ -0,0 +1,59 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcms}prestashop>blockcms_34c869c542dee932ef8cd96d2f91cae6'] = 'I nostri negozi'; +$_MODULE['<{blockcms}prestashop>blockcms_d1aa22a3126f04664e0fe3f598994014'] = 'Speciali'; +$_MODULE['<{blockcms}prestashop>blockcms_9ff0635f5737513b1a6f559ac2bff745'] = 'Nuovi prodotti'; +$_MODULE['<{blockcms}prestashop>blockcms_3cb29f0ccc5fd220a97df89dafe46290'] = 'Vendite migliori'; +$_MODULE['<{blockcms}prestashop>blockcms_02d4482d332e1aef3437cd61c9bcc624'] = 'Contattaci'; +$_MODULE['<{blockcms}prestashop>blockcms_7a52e36bf4a1caa031c75a742fb9927a'] = 'Powered by'; +$_MODULE['<{blockcms}prestashop>blockcms_cd275312651aebf8cbbb8d3bb1c086ae'] = 'Blocco CMS '; +$_MODULE['<{blockcms}prestashop>blockcms_cdca12007979fc49008fd125cdb775fc'] = 'Aggiungi un blocco con diversi link CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_97390dd0b5ba7867120aee2ff22bfa38'] = 'Blocchi di configurazione CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_1cd127158cfd245511751206f4b3c6f0'] = 'Aggiungi un nuovo blocco cms'; +$_MODULE['<{blockcms}prestashop>blockcms_6e1ea63625a85f6d2d9ecbfb79586351'] = 'Elenco di blocchi CMS di sinistra'; +$_MODULE['<{blockcms}prestashop>blockcms_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blockcms}prestashop>blockcms_aae551ce0c29dfe39b0ff20139abdef3'] = 'Nome Blocco'; +$_MODULE['<{blockcms}prestashop>blockcms_99121ab27aaa7472cfada9071c5ba434'] = 'Nome categoria'; +$_MODULE['<{blockcms}prestashop>blockcms_52f5e0bc3859bc5f5e25130b6c7e8881'] = 'Posizione'; +$_MODULE['<{blockcms}prestashop>blockcms_06df33001c1d7187fdd81ea1f5b277aa'] = 'Azioni'; +$_MODULE['<{blockcms}prestashop>blockcms_08a38277b0309070706f6652eeae9a53'] = 'Giù'; +$_MODULE['<{blockcms}prestashop>blockcms_258f49887ef8d14ac268c92b02503aaa'] = 'Su'; +$_MODULE['<{blockcms}prestashop>blockcms_7dce122004969d56ae2e0245cb754d35'] = 'Modifica'; +$_MODULE['<{blockcms}prestashop>blockcms_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{blockcms}prestashop>blockcms_8f08c1af47e3e9611289c1882befc3a8'] = 'Non vi è alcuna blocco CMS impostato'; +$_MODULE['<{blockcms}prestashop>blockcms_0a40c06f34e5c794a7f0d3085d17d63a'] = 'Elenco di blocchi CMS di destra'; +$_MODULE['<{blockcms}prestashop>blockcms_965be994da393e5aa15bd3a2444c6ccf'] = 'Configurazione dei link a piè di pagina'; +$_MODULE['<{blockcms}prestashop>blockcms_fab8ca8250236ed20b96f9750e1eacc7'] = 'Visualizzare i vari link a piè di pagina '; +$_MODULE['<{blockcms}prestashop>blockcms_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{blockcms}prestashop>blockcms_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{blockcms}prestashop>blockcms_5aa1602194579edb6f91d7dd53eadb32'] = 'Nuovo blocco CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_e83c1afa1d3dbe19fa9becebb5ca8480'] = 'Modifica blocco CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_7d9a9a0187e212cb7fd126afb8704bd1'] = 'Nome del blocco:'; +$_MODULE['<{blockcms}prestashop>blockcms_bdbaef442c586e1bbecb44eba1ba7e2d'] = 'Se lasci questo campo vuoto, il nome del blocco sarà il nome della categoria'; +$_MODULE['<{blockcms}prestashop>blockcms_7310626b183e1bcfcc61b844e8ea3c5c'] = 'Scegli una categoria CMS:'; +$_MODULE['<{blockcms}prestashop>blockcms_be9469719aa6efa2fc3bd5768bc406d7'] = 'Posizione:'; +$_MODULE['<{blockcms}prestashop>blockcms_945d5e233cf7d6240f6b783b36a374ff'] = 'Sinistra'; +$_MODULE['<{blockcms}prestashop>blockcms_92b09c7c48c520c3c55e497875da437c'] = 'Destra'; +$_MODULE['<{blockcms}prestashop>blockcms_1acef6bfa7dc3360eed6bf44851fa6a4'] = 'Mostra Negozi:'; +$_MODULE['<{blockcms}prestashop>blockcms_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{blockcms}prestashop>blockcms_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{blockcms}prestashop>blockcms_08f3899ad165f85f8596199966b8c673'] = 'Mostra \"i nostri negozi\" alla fine del blocco'; +$_MODULE['<{blockcms}prestashop>blockcms_ea4788705e6873b424c65e91c2846b19'] = 'Annulla'; +$_MODULE['<{blockcms}prestashop>blockcms_f7df0009efd65cec8e54cf4ef30abf5e'] = 'Visualizzazione negozio non valida'; +$_MODULE['<{blockcms}prestashop>blockcms_903d12e7aa8c380c290b78c1898e01b7'] = 'Posizione blocco non valida'; +$_MODULE['<{blockcms}prestashop>blockcms_92fc29650a0f9dd3fca4e5de1845f78b'] = 'Devi scegliere almeno una pagina o una sottocategoria per creare un blocco CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_5e75cbfbfd02a7b2fab0ed21505e811b'] = 'Pagina o categoria CMS non valida'; +$_MODULE['<{blockcms}prestashop>blockcms_420d575844f77db5299065080d9c237f'] = 'Nome del blocco troppo lungo'; +$_MODULE['<{blockcms}prestashop>blockcms_ede67d50014846cb8bb1b00d5fde77be'] = 'Invalido id_cms_block'; +$_MODULE['<{blockcms}prestashop>blockcms_05b51791a83d3cef29ad68b70d48d131'] = 'Attivazione piè di pagina non valido'; +$_MODULE['<{blockcms}prestashop>blockcms_5dab5acc3c6a2a7e87e8d8926a2c763e'] = 'Stai cercando di eliminare un blocco cms inesistente'; +$_MODULE['<{blockcms}prestashop>blockcms_138218281781fd0d938a140892d7386c'] = 'Piè di pagine CMS aggiornato con successo'; +$_MODULE['<{blockcms}prestashop>blockcms_ddd7d8a072783afaf23e5e6843398fc9'] = 'Aggiunta del blocco CMS riuscito '; +$_MODULE['<{blockcms}prestashop>blockcms_31a22821c66edf7e3aa33ef1c8109f4c'] = 'Modifica del blocco CMS riuscito'; +$_MODULE['<{blockcms}prestashop>blockcms_10432af9a9d55d5aa8b0f380194af673'] = 'Soppressione riuscita'; +$_MODULE['<{blockcms}prestashop>blockcms_be58fccb15fb119b8c3d485e3a8561c4'] = 'Configurazione del blocco CMS'; +$_MODULE['<{blockcms}prestashop>blockcms_78edb384f1a71576034e00ed6844bcc2'] = 'Non c\'è nulla da visualizzare in questa categoria CMS'; + +?> \ No newline at end of file diff --git a/modules/blockcms/logo.gif b/modules/blockcms/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..12cd1aef900803abba99b26920337ec01ad5c267 GIT binary patch literal 778 zcmV+l1NHogP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!oJmAMR5;6} zlgn$=R~*GZcTB8gOeQf3nTa-!(WoeBp@~u~2*phyQae;ZqApx?m2DMV`5y=hK32Z4 zrF5FEg<6`FhR&iJnZ_{H#59l57&FNv{mtC(z4z-vNPM&#J<Bg&J{&mb7**wcRP*K` zb9FQ=!5vo@PFAh7I1MPF2;ru8;m+XMPaeMdZ(eoq#g&nawQ{i|p~;@MMjF<x0bn6= z3>BVme|mWaqy4$_pJm?y9KM{-*hp?1+Ey3e-CEDooTa!B;e(Q>TSF?bj>5At13y1p zriN3w3x~5SfZj{@J4M{kp{?=M_Lh2bV<nsu_OvyDDu0g6V`7F~$@Tm*U*@N~g=sW= zn!9%NQ4BzW>+5LH)Q)5W!-ePA$RgE1@5f1cyHki0Y}JyVEYZF(LD$xXlt$7A5CgE@ zpV-&l%vf;=5kZ2-2gi@Y6J&=cuwt>!vJ^#(&n|LcZyUzi6Duj$$hJ1s*HD-#;k-w@ zpdrwAuoDG_N2bvb07G$Zk*?Hc)JLtW4yqOnic_$zO7NZ#l>Fm){;fE?b$IbOaX2fe z0la4g0Dfw2xk7Wi7NapVD8YMPCZu?A1QCK*67dgsvRKBLFtrM>?$%&_lD1882mzdO zWPdw5KWw6IT`m1b_8=lS5jt8D3=RDa=&jWzR-)S@56WMslZ~mKu1)-wpXB>rNBQ>N zU#K`#1B&v|_AQK;7I~B}OdGiUT9LX>f0xm6<;Le<?v8hEtmnbwS!SP?2`;dqv5sw9 zni(%Gaqov;mNB)bas%IF->P!=vFjPsUQF*wCJ*dO)4YBypgdiuF!=i@6Zyi7F|q#K zz?tlSZULa@t1D?$e;f@b36&N!V2mjOHw|*<kAZXlKc;ul3#dPWds((2xc~qF07*qo IM6N<$f<v}uGXMYp literal 0 HcmV?d00001 diff --git a/modules/blockcurrencies/blockcurrencies.php b/modules/blockcurrencies/blockcurrencies.php new file mode 100644 index 000000000..666d797b0 --- /dev/null +++ b/modules/blockcurrencies/blockcurrencies.php @@ -0,0 +1,81 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockCurrencies extends Module +{ + public function __construct() + { + $this->name = 'blockcurrencies'; + $this->tab = 'front_office_features'; + $this->version = 0.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Currency block'); + $this->description = $this->l('Adds a block for selecting a currency.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('top') AND $this->registerHook('header')); + } + + /** + * Returns module content for header + * + * @param array $params Parameters + * @return string Content + */ + public function hookTop($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + + global $smarty; + + $id_current_shop = $this->shopID; + $currencies = Currency::getCurrencies(false, 1, $id_current_shop); + if (!sizeof($currencies)) + return ''; + $smarty->assign('currencies', $currencies); + return $this->display(__FILE__, 'blockcurrencies.tpl'); + } + + public function hookHeader($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + Tools::addCSS(($this->_path).'blockcurrencies.css', 'all'); + } +} + + diff --git a/modules/blockcurrencies/blockcurrencies.tpl b/modules/blockcurrencies/blockcurrencies.tpl new file mode 100644 index 000000000..5e52ee819 --- /dev/null +++ b/modules/blockcurrencies/blockcurrencies.tpl @@ -0,0 +1,44 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block currencies module --> +<div id="currencies_block_top"> + <form id="setCurrency" action="{$request_uri}" method="post"> + <ul> + {foreach from=$currencies key=k item=f_currency} + <li {if $cookie->id_currency == $f_currency.id_currency}class="selected"{/if}> + <a href="javascript:setCurrency({$f_currency.id_currency});" title="{$f_currency.name}">{$f_currency.sign}</a> + </li> + {/foreach} + </ul> + <p> + <input type="hidden" name="id_currency" id="id_currency" value=""/> + <input type="hidden" name="SubmitCurrency" value="" /> + {l s='Currency' mod='blockcurrencies'} + </p> + </form> +</div> +<!-- /Block currencies module --> \ No newline at end of file diff --git a/modules/blockcurrencies/config.xml b/modules/blockcurrencies/config.xml new file mode 100755 index 000000000..8664e3898 --- /dev/null +++ b/modules/blockcurrencies/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockcurrencies</name> + <displayName><![CDATA[Currency block]]></displayName> + <version><![CDATA[0.1]]></version> + <description><![CDATA[Adds a block for selecting a currency.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockcurrencies/de.php b/modules/blockcurrencies/de.php new file mode 100644 index 000000000..0a9ed08ca --- /dev/null +++ b/modules/blockcurrencies/de.php @@ -0,0 +1,9 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_386c339d37e737a436499d423a77df0c'] = 'Währung'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_f7a31ae8f776597d4282bd3b1013f08b'] = 'Währungsblock'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_d06c31fa4b0b56c2a61aa4dd7b632767'] = 'Fügt einen Block zur Auswahl der Währung hinzu'; + +?> \ No newline at end of file diff --git a/modules/blockcurrencies/en.php b/modules/blockcurrencies/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockcurrencies/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockcurrencies/es.php b/modules/blockcurrencies/es.php new file mode 100644 index 000000000..a5795db69 --- /dev/null +++ b/modules/blockcurrencies/es.php @@ -0,0 +1,7 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_f7a31ae8f776597d4282bd3b1013f08b'] = 'Bloque de moneda'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_d06c31fa4b0b56c2a61aa4dd7b632767'] = 'Añadir bloque para selección de moneda'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_386c339d37e737a436499d423a77df0c'] = 'Moneda'; diff --git a/modules/blockcurrencies/fr.php b/modules/blockcurrencies/fr.php new file mode 100644 index 000000000..f8716a31c --- /dev/null +++ b/modules/blockcurrencies/fr.php @@ -0,0 +1,7 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_f7a31ae8f776597d4282bd3b1013f08b'] = 'Bloc devises'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_d06c31fa4b0b56c2a61aa4dd7b632767'] = 'Ajoute un bloc permettant au client de choisir sa devise'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_386c339d37e737a436499d423a77df0c'] = 'Devises'; diff --git a/modules/blockcurrencies/it.php b/modules/blockcurrencies/it.php new file mode 100644 index 000000000..76b856e36 --- /dev/null +++ b/modules/blockcurrencies/it.php @@ -0,0 +1,9 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_386c339d37e737a436499d423a77df0c'] = 'Valuta'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_f7a31ae8f776597d4282bd3b1013f08b'] = 'Blocco valuta'; +$_MODULE['<{blockcurrencies}prestashop>blockcurrencies_d06c31fa4b0b56c2a61aa4dd7b632767'] = 'Aggiunge un blocco per la selezione di una valuta'; + +?> \ No newline at end of file diff --git a/modules/blockcurrencies/logo.gif b/modules/blockcurrencies/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..b91777ebbf9f6c7f60aa7e348ca0af737d1beb04 GIT binary patch literal 383 zcmZ?wbhEHb6krfwxXQo~INfjAg~j!|st!LnP`oLx|47%f56{+|U7ffn_SVZ=+a7J2 zer8hLmg>#}&7XgMT7P%dxkqQ0-C7VaH#Bp3+U#@FrX8G8xwWKiU(=TR>lWRZbL#2w zIajCN{d_ZTZPxqm?>1gt*Sx>BX?uOpOuw|XNk9I4?>^Kv@o4wTJBwx>nzrlSwzADd z(euOazq@<l`QiCzXFvP?Y{l(G*{jpGUR#^GEaCgF@6(S=z4+up(T3dC?M)%G0vIrW z;!hSvb_Nv&9gqyjPYi5x93~Z5=m_*5XJTz}nI_iN+ImgIPE@_;rCX^}qNM0Dlb3wb z7u=FJciOOUJW6eRIDtuFdxGhgh8MglqB`RF+BGUtOllH>3XD36`9iv4j4Iu|ISLB- z%DT*&N__GPA`&dplKf&~x<)KQ?3{c|Ox*md#gye)c{JFZ<@H$9)>w)Oo9Vc-F=-l# ZF<7vNs+bzfDsdjXro$s}&B>9$8UUw<pq&5! literal 0 HcmV?d00001 diff --git a/modules/blocklanguages/blocklanguages.php b/modules/blocklanguages/blocklanguages.php new file mode 100644 index 000000000..56304af0c --- /dev/null +++ b/modules/blocklanguages/blocklanguages.php @@ -0,0 +1,75 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockLanguages extends Module +{ + function __construct() + { + $this->name = 'blocklanguages'; + $this->tab = 'front_office_features'; + $this->version = 0.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Language block'); + $this->description = $this->l('Adds a block for selecting a language.'); + } + + function install() + { + return (parent::install() AND $this->registerHook('top') AND $this->registerHook('header')); + } + + /** + * Returns module content for header + * + * @param array $params Parameters + * @return string Content + */ + function hookTop($params) + { + global $smarty; + + $languages = Language::getLanguages(true, $this->shopID); + if (!sizeof($languages)) + return ''; + $smarty->assign('languages', $languages); + return $this->display(__FILE__, 'blocklanguages.tpl'); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blocklanguages.css', 'all'); + } +} + + diff --git a/modules/blocklanguages/blocklanguages.tpl b/modules/blocklanguages/blocklanguages.tpl new file mode 100644 index 000000000..5ee5a0ab5 --- /dev/null +++ b/modules/blocklanguages/blocklanguages.tpl @@ -0,0 +1,58 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block languages module --> +<div id="languages_block_top"> + <ul id="first-languages"> + {foreach from=$languages key=k item=language name="languages"} + <li {if $language.iso_code == $lang_iso}class="selected_language"{/if}> + {if $language.iso_code != $lang_iso} + {assign var=indice_lang value=$language.id_lang} + {if isset($lang_rewrite_urls.$indice_lang)} + <a href="{$lang_rewrite_urls.$indice_lang}" title="{$language.name}"> + {else} + <a href="{$link->getLanguageLink($language.id_lang, $language.name)}" title="{$language.name}"> + {/if} + + {/if} + <img src="{$img_lang_dir}{$language.id_lang}.jpg" alt="{$language.iso_code}" width="16" height="11" /> + {if $language.iso_code != $lang_iso} + </a> + {/if} + </li> + {/foreach} + </ul> +</div> +<script type="text/javascript"> + $('ul#first-languages li:not(.selected_language)').css('opacity', 0.3); + $('ul#first-languages li:not(.selected_language)').hover(function(){ldelim} + $(this).css('opacity', 1); + {rdelim}, function(){ldelim} + $(this).css('opacity', 0.3); + {rdelim}); +</script> +<!-- /Block languages module --> + diff --git a/modules/blocklanguages/config.xml b/modules/blocklanguages/config.xml new file mode 100755 index 000000000..c74a6415a --- /dev/null +++ b/modules/blocklanguages/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocklanguages</name> + <displayName><![CDATA[Language block]]></displayName> + <version><![CDATA[0.1]]></version> + <description><![CDATA[Adds a block for selecting a language.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocklanguages/de.php b/modules/blocklanguages/de.php new file mode 100644 index 000000000..61c416116 --- /dev/null +++ b/modules/blocklanguages/de.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklanguages}prestashop>blocklanguages_d5988791c07fedc0e2fc77683b4e61f6'] = 'Sprachblock'; +$_MODULE['<{blocklanguages}prestashop>blocklanguages_2575f2a453fd18a4e74e430a80eb3540'] = 'Fügt einen Block zur Auswahl der Sprache hinzu'; + +?> \ No newline at end of file diff --git a/modules/blocklanguages/en.php b/modules/blocklanguages/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocklanguages/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocklanguages/es.php b/modules/blocklanguages/es.php new file mode 100644 index 000000000..5cd356a46 --- /dev/null +++ b/modules/blocklanguages/es.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklanguages}prestashop>blocklanguages_d5988791c07fedc0e2fc77683b4e61f6'] = 'Bloque de idiomas'; +$_MODULE['<{blocklanguages}prestashop>blocklanguages_2575f2a453fd18a4e74e430a80eb3540'] = 'Añadir un bloque para seleccionar idioma'; diff --git a/modules/blocklanguages/fr.php b/modules/blocklanguages/fr.php new file mode 100644 index 000000000..311e76c9a --- /dev/null +++ b/modules/blocklanguages/fr.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklanguages}prestashop>blocklanguages_d5988791c07fedc0e2fc77683b4e61f6'] = 'Bloc langues'; +$_MODULE['<{blocklanguages}prestashop>blocklanguages_2575f2a453fd18a4e74e430a80eb3540'] = 'Ajoute un bloc permettant au client de choisir sa langue'; diff --git a/modules/blocklanguages/it.php b/modules/blocklanguages/it.php new file mode 100644 index 000000000..ad4a81d20 --- /dev/null +++ b/modules/blocklanguages/it.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklanguages}prestashop>blocklanguages_d5988791c07fedc0e2fc77683b4e61f6'] = 'Blocco lingua '; +$_MODULE['<{blocklanguages}prestashop>blocklanguages_2575f2a453fd18a4e74e430a80eb3540'] = 'Aggiunge un blocco selezionare una lingua'; + +?> \ No newline at end of file diff --git a/modules/blocklanguages/logo.gif b/modules/blocklanguages/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f11ef59338a549cd8b507f90d9211b189da5d29 GIT binary patch literal 616 zcmZ?wbhEHb6krfwI99^IWH5!ncsi5WVrJ{riKe^-79zP;T>TClDgm2RgEyN5&h7DH zGY(s(8@|0NKx3LW$0T1ty{KKf(K{yx3HOFbc804vCvEjDJd{;jn^?3iqpU5WWm9oO z&*Jjf)#aWMZQCN+ca%17USA)b)qX3a=hfXNjRoD!Ia3e#&H7(H`R;+9s8#(<L395- z?bgm&cszX3zv>0YBbWZGU3B8c6u+?5|L;umE?jjycJ;sPRWD;U{O??K_T+-H@=eDQ zw*J4pApPW$>cnmT<97VNv7|U@=l?rPauRp_Pu}(a#`4lrt0rGs(>in8mDEH3TXz0C zyKdU~4SjQWTrE2Ff91hjTTb4ebK(Ev<EvI&|M%(q%J0`U{<yy7|E*0I9{;`Y<nP5N ze=a`xyW`FO%g_E^dG`0(^S{?${Jr_|@2!`AZ@>C`=hff4um9b9^Y8wfe-GdNd-U$# z^LJmLy#M#~!@rlG{=NVF<HNUqzyJLG`|sa>B7ovQLFb~>#FEq$h4Rdj3<Y;j-v9>1 zpDc`A4D}2;3_t*iC<pcp4fRdU3axEz&B7sJp4NUcUJA{VTZ;2DlM~~kV@izb6+;8O z9Zd{<B&V!WC@##;&B{nkD=}#1=N6HWSMV<>De#}v#HelO<f6u~s@_yq+}X{+)ly8! z_)JS+(f+$7L5G{wOY*YQQ<4&5ORSn%1*8It_h(1t-#^SQrzOh9!l!V9Be?X5mza*d tS&H<8L)`q*ddqqQ7OY|wlCjO(lhD}YGFj-1gvtbgg^WzBXP6intO02*OXUCn literal 0 HcmV?d00001 diff --git a/modules/blocklayered/blocklayered-ajax.php b/modules/blocklayered/blocklayered-ajax.php new file mode 100644 index 000000000..63e60df63 --- /dev/null +++ b/modules/blocklayered/blocklayered-ajax.php @@ -0,0 +1,35 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registred Trademark & Property of PrestaShop SA +*/ + +global $cookie; + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/blocklayered.php'); + +$blockLayered = new BlockLayered(); +echo $blockLayered->ajaxCall(); \ No newline at end of file diff --git a/modules/blocklayered/blocklayered.css b/modules/blocklayered/blocklayered.css new file mode 100644 index 000000000..1eea1e2a8 --- /dev/null +++ b/modules/blocklayered/blocklayered.css @@ -0,0 +1,75 @@ +#layered_block_left div.block_content { + padding: 6px; +} + +#layered_block_left ul { + padding-left: 0; +} + +#layered_block_left ul li { + margin-left: 15px; + padding-left: 2px; + list-style-type: none; +} + +#layered_block_left #enabled_filters , #layered_url_filter_block{ + font-size: 10px; + padding-bottom: 10px; + margin-bottom: 5px; + border-bottom: 1px dotted #CCC; +} + +#layered_block_left #enabled_filters ul li { + margin-left: 0; + padding-left: 0; +} + +#layered_block_left #enabled_filters ul li:hover { + background: inherit; + color: inherit; +} + +#layered_block_left #enabled_filters a { + text-decoration: none; + color: red; +} + +#layered_block_left ul li:hover { + background: #71BF47; + color: #FFF; +} + +#layered_block_left ul li label { + cursor: pointer; +} + +#layered_block_left ul li.nomargin { + margin-left: 0; +} + +#layered_block_left span.layered_subtitle { + float: left; + font-weight: bold; + font-size: 12px; + display: block; + margin-bottom: 4px; +} + +#layered_block_left span.layered_close a { text-decoration: none; } + +#layered_block_left span.layered_close { + float: right; + font-weight: bold; + font-size: 12px; + display: block; + margin-bottom: 4px; +} + +#layered_block_left ul li input.checkbox { + vertical-align: middle; + margin-left: 2px; +} + +#layered_block_left ul li .disabled { + color: #666; +} diff --git a/modules/blocklayered/blocklayered.js b/modules/blocklayered/blocklayered.js new file mode 100644 index 000000000..65a20e227 --- /dev/null +++ b/modules/blocklayered/blocklayered.js @@ -0,0 +1,192 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7096 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registred Trademark & Property of PrestaShop SA +*/ + +var ajaxQueries = new Array(); +var ajaxLoaderOn = 0; + +$(document).ready(function() +{ + cancelFilter(); + openCloseFilter(); + + $('#layered_form input[type=button], #layered_form label.layered_color').live('click', function() + { + if (!$('\'input[name='+$(this).attr('name')+']:hidden\'').length) + $('<input />').attr('type', 'hidden').attr('name', $(this).attr('name')).val($(this).attr('rel')).appendTo('#layered_form'); + else + $('\'input[name='+$(this).attr('name')+']:hidden\'').remove(); + reloadContent(); + }); + + $('#layered_form input[type=checkbox]').live('click', function() + { + reloadContent(); + }); + + paginationButton(); +}); + +function paginationButton() { + $('#pagination li').not('.current, .disabled').each( function () { + var nbPage = 0; + if ($(this).attr('id') == 'pagination_next') + nbPage = parseInt($('#pagination li.current').children().html())+ 1; + else if ($(this).attr('id') == 'pagination_previous') + nbPage = parseInt($('#pagination li.current').children().html())- 1; + + $(this).children().click(function () { + if (nbPage == 0) + p = parseInt($(this).html()) + parseInt(nbPage); + else + p = nbPage; + p = '&p='+ p; + reloadContent(p); + nbPage = 0; + return false; + }); + }); +} + +function cancelFilter() +{ + $('#enabled_filters a').live('click', function(e) + { + $('#'+$(this).attr('rel')).attr('checked', false); + $('#layered_form input[name='+$(this).attr('rel')+']:hidden').remove(); + reloadContent(); + e.preventDefault(); + }); +} + +function openCloseFilter() +{ + $('#layered_form span.layered_close a').live('click', function(e) + { + if ($(this).html() == '&lt;') + { + $('#'+$(this).attr('rel')).show(); + $(this).html('v'); + } + else + { + $('#'+$(this).attr('rel')).hide(); + $(this).html('&lt;'); + } + + e.preventDefault(); + }); +} + +function reloadContent(params_plus) +{ + for(i = 0; i < ajaxQueries.length; i++) + ajaxQueries[i].abort(); + ajaxQueries = new Array(); + + if (!ajaxLoaderOn) + { + $('#product_list').prepend($('#layered_ajax_loader').html()); + $('#product_list').css('opacity', '0.7'); + ajaxLoaderOn = 1; + } + + data = $('#layered_form').serialize(); + $('.layered_slider').each( function () { + data += '&'+$(this).attr('id')+'='+$(this).slider('values', 0)+'_'+$(this).slider('values', 1); + }); + + if ($('#selectPrductSort').length) + { + var splitData = $('#selectPrductSort').val().split(':'); + data += '&orderby='+splitData[0]+'&orderway='+splitData[1]; + } + + if(params_plus == undefined) + params_plus = ''; + + // Get nb items per page + var n = ''; + $('#pagination #nb_item').children().each(function(it, option) { + if(option.selected) { + n = '&n='+option.value; + } + }); + + ajaxQuery = $.ajax( + { + type: 'GET', + url: baseDir + 'modules/blocklayered/blocklayered-ajax.php', + data: data+params_plus+n, + dataType: 'json', + success: function(result) + { + $('#layered_block_left').after('<div id="tmp_layered_block_left"></div>').remove(); + $('#tmp_layered_block_left').html(result.filtersBlock).attr('id', 'layered_block_left'); + + $('#product_list').html(result.productList).html(); + $('#product_list').css('opacity', '1'); + $('div#pagination').html(result.pagination); + paginationButton(); + ajaxLoaderOn = 0; + + // On submiting nb items form, relaod with the good nb of items + $("#pagination form").submit(function() { + val = $('#pagination #nb_item').val(); + $('#pagination #nb_item').children().each(function(it, option) { + if(option.value == val) { + $(option).attr('selected', 'selected'); + } else { + $(option).removeAttr('selected'); + } + }); + // Reload products and pagination + reloadContent(); + return false; + }); + } + }); + + ajaxQueries.push(ajaxQuery); +} + +/* +function initSlider(type, min, max, values, unit) +{ + $('#layered_'+type+'_slider').slider({ + range: true, + min: min, + max: max, + values: [ values[0], values[1]], + slide: function( event, ui ) { + $('#layered_'+type+'_range').html(ui.values[ 0 ] + unit + ' - ' + ui.values[ 1 ] + unit); + }, + stop: function () { + reloadContent(); + } + }); + $('#layered_'+type+'_range').html($('#layered_'+type+'_slider').slider('values', 0 ) +unit+'-'+$('#layered_'+type+'_slider').slider('values', 1)+unit ); +} +*/ diff --git a/modules/blocklayered/blocklayered.php b/modules/blocklayered/blocklayered.php new file mode 100644 index 000000000..d4ef4b916 --- /dev/null +++ b/modules/blocklayered/blocklayered.php @@ -0,0 +1,1010 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registred Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockLayered extends Module +{ + private $products; + private $nbr_products; + + public function __construct() + { + $this->name = 'blocklayered'; + $this->tab = 'front_office_features'; + $this->version = 1.3; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Layered navigation block'); + $this->description = $this->l('Displays a block with layered navigation filters.'); + } + + public function install() + { + if ($result = parent::install() AND $this->registerHook('leftColumn') AND $this->registerHook('header') + AND $this->registerHook('categoryAddition') AND $this->registerHook('categoryUpdate') AND $this->registerHook('categoryDeletion')) + { + Configuration::updateValue('PS_LAYERED_NAVIGATION_CHECKBOXES', 1); + $this->rebuildLayeredStructure(); + } + + return $result; + } + + public function uninstall() + { + /* Delete all configurations */ + Configuration::deleteByName('PS_LAYERED_NAVIGATION_CHECKBOXES'); + return parent::uninstall(); + } + + public function hookLeftColumn($params) + { + return $this->generateFiltersBlock($this->getSelectedFilters()); + } + + public function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + public function hookHeader($params) + { + $id_parent = (int)Tools::getValue('id_category', Tools::getValue('id_category_layered', 1)); + if ($id_parent == 1) + return; + Tools::addJS(($this->_path).'blocklayered.js'); + Tools::addJS(_PS_JS_DIR_.'jquery/jquery-ui-1.8.10.custom.min.js'); + Tools::addCSS(($this->_path).'blocklayered.css', 'all'); + Tools::addCSS(_PS_CSS_DIR_.'jquery-ui-1.8.10.custom.css', 'all'); + + } + + public function hookCategoryAddition($params) + { + $this->rebuildLayeredCache(array(), array((int)$params['category']->id)); + } + + public function hookCategoryUpdate($params) + { + /* The category status might (active, inactive) have changed, we have to update the layered cache table structure */ + /* + if (!$params['category']->active) + $this->hookCategoryDeletion($params); + else + { + $oneRow = Db::getInstance()->getRow('SELECT c'.(int)$params['category']->id.' FROM `'._DB_PREFIX_.'layered_cache`'); + if (!isset($oneRow['c'.(int)$params['category']->id])) + { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'layered_cache` ADD `c'.(int)$params['category']->id.'` TINYINT UNSIGNED NOT NULL DEFAULT \'0\''); + Configuration::updateValue('PS_LAYERED_COLUMNS', Configuration::get('PS_LAYERED_COLUMNS').',c'.(int)$params['category']->id); + } + if (!Db::getInstance()->getRow('SELECT id_layered_category FROM `'._DB_PREFIX_.'layered_category` WHERE id_category = '.(int)$params['category']->id)) + $this->rebuildLayeredCache(array(), array((int)$params['category']->id)); + } + */ + } + + public function hookCategoryDeletion($params) + { + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'layered_category WHERE id_category = '.(int)$params['category']->id); + } + + public function getContent() + { + $errors = array(); + $html = ''; + + if (Tools::isSubmit('submitLayeredCache')) + { + $this->rebuildLayeredStructure(); + $this->rebuildLayeredCache(); + + $html .= ' + <div class="conf confirm"> + <img src="../img/admin/ok.gif" alt="" title="" /> + '.$this->l('Layered navigation database was initialized successfully').' + </div>'; + } + elseif (Tools::isSubmit('submitLayeredSettings')) + { + if (Tools::getValue('share_url')) + { + if (Tools::getValue('bitly_username') == '') + $errors[] = $this->l('Bit.ly username is empty'); + if (Tools::getValue('bitly_api_key') == '') + $errors[] = $this->l('Bit.ly api_key is empty'); + } + + if (!sizeof($errors)) + { + Configuration::updateValue('PS_LAYERED_BITLY_USERNAME', Tools::getValue('bitly_username')); + Configuration::updateValue('PS_LAYERED_BITLY_API_KEY', Tools::getValue('bitly_api_key')); + Configuration::updateValue('PS_LAYERED_SHARE', Tools::getValue('share_url')); + $html .= ' + <div class="conf confirm"> + <img src="../img/admin/ok.gif" alt="" title="" /> + '.$this->l('Settings saved successfully').' + </div>'; + } + else + { + $html .= ' + <div class="error"> + <img src="../img/admin/error.png" alt="" title="" />'.$this->l('Settings not saved :').'<ul>'; + foreach($errors as $error) + $html .= '<li>'.$error.'</li>'; + $html .= '</ul></div>'; + } + + } + + $html .= '<script> + $(document).ready(function() + { + $(\'.share_url\').change(function(){ + toggleBitly(); + }); + toggleBitly(); + + function toggleBitly(){ + if ($(\'#share_url_on\').attr(\'checked\')) + $(\'#bitly\').slideDown(); + else + $(\'#bitly\').slideUp(); + } + }); + </script> + <h2>'.$this->l('Layered navigation').'</h2> + <p class="warning" style="font-weight: bold;"><img src="../img/admin/information.png" alt="" /> '.$this->l('This module is in beta version and will be improved').'</p><br /> + <fieldset class="width2"> + <legend><img src="../img/admin/asterisk.gif" alt="" />'.$this->l('10 upcoming improvements').'</legend> + <ol> + <li>'.$this->l('Real-time refresh of the cache table').' <img src="../img/admin/enabled.gif" alt="" /></li> + <li>'.$this->l('Additional filters (prices, weight)').'</li> + <li>'.$this->l('Ability to manage filters by category in the module configuration').'</li> + <li>'.$this->l('Ability to hide filter groups with no values and filter values with 0 products').'</li> + <li>'.$this->l('Statistics and analysis').'</li> + <li>'.$this->l('Manage products sort & pagination').' <img src="../img/admin/enabled.gif" alt="" /></li> + <li>'.$this->l('Add a check on the category_group table').'</li> + <li>'.$this->l('SEO links & real time URL building (ability to give the URL to someone)').' <img src="../img/admin/enabled.gif" alt="" /> </li> + <li>'.$this->l('Add more options in the module configuration').'</li> + <li>'.$this->l('Performances improvements').'</li> + </ol> + </fieldset><br /> + + <fieldset class="width2"> + <legend><img src="../img/admin/database_gear.gif" alt="" />'.$this->l('Cache initialization').'</legend> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <div class="warning"> + <p style="color: red; font-weight: bold;">'.$this->l('Before using this module for the first time you have to initialize the cache').'</p> + <p><b>'.$this->l('Warning: This could take several minutes.').'</b><br /><br /> + '.$this->l('If you do not, this cache table might become larger and larger (less efficient), and all the new choices (attributes, features) will not be offered to your visitors.').'</p> + </div> + <p style="text-align: center;"><input type="submit" class="button" name="submitLayeredCache" value="'.$this->l('Initialize the layered navigation database').'" /></p> + </form> + </fieldset><br /> + <fieldset class="width2"> + <legend><img src="../img/admin/cog.gif" alt="" />'.$this->l('Configuration').'</legend> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <label>'.$this->l('Enable share URL').' : </label> + <div class="margin-form"> + <label class="t" for="share_url_on"><img src="../img/admin/enabled.gif" alt="Yes" title="Yes"></label> + <input type="radio" id="share_url_on" name="share_url" class="share_url" value="1" '.(Configuration::get('PS_LAYERED_SHARE') ? 'checked="checked"' : '').'> + <label class="t" for="share_url_off"><img src="../img/admin/disabled.gif" alt="No" title="No" style="margin-left: 10px;"></label> + <input type="radio" id="share_url_off" name="share_url" class="share_url" value="0" '.(!Configuration::get('PS_LAYERED_SHARE') ? 'checked="checked"' : '').'> + <p>'.$this->l('By enabling this option, your visitors can share the URL of their research').'</p> + </div> + <div class="clear"></div> + <div id="bitly"> + <p>'.$this->l('To offer your customers short links, create an account on bit.ly, then copy and paste login and API key.').' + <a style="text-decoration:underline" href="http://bit.ly/a/sign_up">'.$this->l('Sign Up').'</a></p> + <label>'.$this->l('Login bit.ly').'</label> + <div class="margin-form"> + <input type="text" name="bitly_username" value="'. Tools::getValue('bitly_username', Configuration::get('PS_LAYERED_BITLY_USERNAME')).'"> + </div> + <label>'.$this->l('API Key bit.ly').'</label> + <div class="margin-form"> + <input type="text" name="bitly_api_key" value="'.Tools::getValue('bitly_api_key', Configuration::get('PS_LAYERED_BITLY_API_KEY')).'"> + </div> + </div> + <p style="text-align: center;"><input type="submit" class="button" name="submitLayeredSettings" value="'.$this->l('Save configuration').'" /></p> + </form> + </fieldset>'; + return $html; + } + + private function getSelectedFilters() + { + $id_parent = (int)Tools::getValue('id_category', Tools::getValue('id_category_layered', 1)); + if ($id_parent == 1) + return; + + /* Analyze all the filters selected by the user and store them into a tab */ + $selectedFilters = array('category' => array(), 'manufacturer' => array(), 'quantity' => array(), 'condition' => array()); + foreach ($_GET AS $key => $value) + { + if (substr($key, 0, 8) == 'layered_') + { + preg_match('/^(.*)_[0-9|new|used|refurbished|slider]+$/', substr($key, 8, strlen($key) - 8), $res); + if (isset($res[1])) + { + $tmpTab = explode('_', $value); + $value = $tmpTab[0]; + $id_key = false; + if (isset($tmpTab[1])) + $id_key = $tmpTab[1]; + if ($res[1] == 'condition' AND in_array($value, array('new', 'used', 'refurbished'))) + $selectedFilters['condition'][] = $value; + elseif ($res[1] == 'quantity' AND (!$value OR $value == 1)) + $selectedFilters['quantity'][] = $value; + elseif (in_array($res[1], array('id_attribute_group', 'category', 'id_feature', 'manufacturer'))) + { + if (!isset($selectedFilters[$res[1].($id_key ? '_'.$id_key : '')])) + $selectedFilters[$res[1].($id_key ? '_'.$id_key : '')] = array(); + $selectedFilters[$res[1].($id_key ? '_'.$id_key : '')][] = (int)$value; + } + elseif (in_array($res[1], array('weight'))) + $selectedFilters[$res[1]] = $tmpTab; + } + } + } + return $selectedFilters; + } + + public function getProductByFilters($selectedFilters = array()) + { + global $cookie; + + if (!empty($this->products)) + return $this->products; + + /* If the current category isn't defined of if it's homepage, we have nothing to display */ + $id_parent = (int)Tools::getValue('id_category', Tools::getValue('id_category_layered', 1)); + if ($id_parent == 1) + return; + + if (!sizeof($selectedFilters['category'])) + $selectedFilters['category'][] = $id_parent; + + $queryFilters = ''; + + foreach ($selectedFilters AS $key => $filterValues) + { + if (!sizeof($filterValues)) + continue; + + preg_match('/^(.*[^_0-9])/', $key, $res); + $key = $res[1]; + + switch ($key) + { + case 'id_feature': + $queryFilters .= ' AND p.id_product IN ( SELECT id_product FROM '._DB_PREFIX_.'feature_product fp WHERE '; + foreach ($filterValues AS $filterValue) + $queryFilters .= 'fp.`id_feature_value` = '.(int)$filterValue.' OR '; + $queryFilters = rtrim($queryFilters, 'OR ').')'; + break; + + case 'id_attribute_group': + $queryFilters .= ' AND p.id_product IN ( SELECT pa.`id_product` + FROM `'._DB_PREFIX_.'product_attribute_combination` pac + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa + ON (pa.`id_product_attribute` = pac.`id_product_attribute`) WHERE '; + + foreach ($filterValues AS $filterValue) + $queryFilters .= 'pac.`id_attribute` = '.(int)$filterValue.' OR '; + $queryFilters = rtrim($queryFilters, 'OR ').')'; + break; + + case 'category': + $parent = new Category($id_parent); + if (!sizeof($selectedFilters['category'])) + $queryFilters .= ' AND p.id_product IN ( SELECT id_product FROM '._DB_PREFIX_.'category_product cp + LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category) + WHERE 1 AND c.nleft >= parent->nleft AND c.nright <= parent->nright'; + else + { + $queryFilters .= ' AND p.id_product IN ( SELECT id_product FROM '._DB_PREFIX_.'category_product cp WHERE 1 AND cp.`id_category` = '.(int)$id_parent; + if (sizeof($selectedFilters['category'])) + $queryFilters .= ' OR '; + foreach ($selectedFilters['category'] AS $id_category) + $queryFilters .= 'cp.`id_category` = '.(int)$id_category.' OR '; + $queryFilters = rtrim($queryFilters, 'OR ').')'; + } + break; + + case 'quantity': + if (sizeof($selectedFilters['quantity']) == 2) + break; + $queryFilters .= ' AND p.quantity '.(!$selectedFilters['quantity'][0] ? '=' : '>').' 0'; + break; + + case 'manufacturer': + $queryFilters .= ' AND p.id_manufacturer IN ('.implode($selectedFilters['manufacturer'], ',').')'; + break; + + case 'condition': + if (sizeof($selectedFilters['condition']) == 3) + break; + $queryFilters .= ' AND p.condition IN ('; + foreach ($selectedFilters['condition'] AS $cond) + $queryFilters .= '\''.$cond.'\','; + $queryFilters = rtrim($queryFilters, ',').')'; + break; + + case 'weight': + $queryFilters .= ' AND p.`weight` BETWEEN '.(float)($selectedFilters['weight'][0] - 0.001).' AND '.(float)($selectedFilters['weight'][1] + 0.001); + break; + } + } + + //id_category_layered = current displayed category + if (!sizeof($selectedFilters['category'])) + $queryFilters .= ' AND p.id_product IN ( + SELECT id_product FROM '._DB_PREFIX_.'category_product cp + WHERE cp.`id_category` = '.(int)$id_parent.')'; + + /* Return only the number of products */ + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(p.`id_product`) AS total + FROM `'._DB_PREFIX_.'product` p + WHERE 1 '.$queryFilters); + + $this->nbr_products = isset($result) ? $result['total'] : 0; + + $n = (int)Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); + + $sql = ' + SELECT p.id_product, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, + p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, + DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'image i ON (i.id_product = p.id_product AND i.cover = 1) + LEFT JOIN '._DB_PREFIX_.'image_lang il ON (i.id_image = il.id_image AND il.id_lang = '.(int)($cookie->id_lang).') + LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) + WHERE p.`active` = 1 AND pl.id_lang = '.(int)$cookie->id_lang.$queryFilters + .' ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby')).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')). + ' LIMIT '.(((int)(Tools::getValue('p', 1)) - 1) * $n.','.$n); + $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + return $this->products; + } + + public function generateFiltersBlock($selectedFilters = array()) + { + global $smarty, $link, $cookie; + $id_lang = (int)$cookie->id_lang; + + /* If the current category isn't defined of if it's homepage, we have nothing to display */ + $id_parent = (int)Tools::getValue('id_category', Tools::getValue('id_category_layered', 1)); + if ($id_parent == 1) + return; + + /* First we need to get all subcategories of current category */ + $category = new Category((int)$id_parent); + + $subCategories = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.id_category, c.id_parent, cl.name + FROM '._DB_PREFIX_.'category c + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category) + WHERE c.nleft > '.(int)$category->nleft.' and c.nright <= '.(int)$category->nright.' AND c.active = 1 AND c.id_parent = '.(int)$category->id.' AND cl.id_lang = '.(int)$cookie->id_lang.' + ORDER BY c.position ASC'); + + $whereC = ' cp.`id_category` = '.(int)$id_parent.' OR '; + foreach ($subCategories AS $subcategory) + $whereC .= ' cp.`id_category` = '.(int)$subcategory['id_category'].' OR '; + + $whereC = rtrim($whereC, 'OR ').')'; + $productsSQL = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT p.`id_product`, p.`condition`, p.`id_manufacturer`, p.`weight`, s.quantity + (SELECT GROUP_CONCAT(`id_category`) FROM `'._DB_PREFIX_.'category_product` cp WHERE cp.`id_product` = p.`id_product`) as ids_cat, + (SELECT GROUP_CONCAT(`id_feature_value`) FROM `'._DB_PREFIX_.'feature_product` fp WHERE fp.`id_product` = p.`id_product`) as ids_feat, + (SELECT GROUP_CONCAT(DISTINCT(pac.`id_attribute`)) + FROM `'._DB_PREFIX_.'product_attribute_combination` pac + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.`id_product_attribute` = pac.`id_product_attribute`) + WHERE pa.`id_product` = p.`id_product` ) as ids_attr + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = p.id_product AND s.id_product_attribute = 0 '.Shop::sqlSharedStock('s').' + WHERE p.`active` = 1 AND p.`id_product` IN ( SELECT id_product FROM `'._DB_PREFIX_.'category_product` cp WHERE'.$whereC, false); + + $products = array(); + $db = Db::getInstance(); + $weight = array(); + while ($product = $db->nextRow($productsSQL)) + { + $row = array(); + foreach ($product AS $key => $value) + { + if($key == 'ids_feat') + $row['f'] = explode(',', $value); + if($key == 'ids_attr') + $row['a'] = explode(',', $value); + if($key == 'ids_cat') + $row['c'] = explode(',', $value); + if($key == 'weight') + $weight[] = $value; + } + + $row['id_manufacturer'] = (int)$product['id_manufacturer']; + $row['quantity'] = (bool)$product['quantity']; + $row['condition'] = $product['condition']; + $row['weight'] = $product['weight']; + $products[(int)$product['id_product']] = $row; + } + + /* Get the filters for the current category */ + $filters = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM '._DB_PREFIX_.'layered_category WHERE id_category = '.(int)$id_parent); + $filterBlocks = $f = $a = array(); + + foreach ($filters AS $filter) + { + $filterBlocks[(int)$filter['position']]['type_lite'] = $filter['type']; + $filterBlocks[(int)$filter['position']]['type'] = $filter['type'].($filter['id_value'] ? '_'.(int)$filter['id_value'] : ''); + $filterBlocks[(int)$filter['position']]['id_key'] = (int)$filter['id_value']; + switch ($filter['type']) + { + case 'id_feature': + $f[] = (int)$filter['id_value']; + + $filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance()->ExecuteS(' + SELECT fvl.id_feature_value, fvl.value + FROM '._DB_PREFIX_.'feature_value fv + LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fv.id_feature_value) + WHERE (fv.custom IS NULL OR fv.custom = 0) AND fv.id_feature = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND fvl.id_lang = '.(int)$id_lang); + + break; + + case 'id_attribute_group': + $a[] = (int)$filter['id_value']; + + $filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance()->ExecuteS(' + SELECT al.id_attribute, al.name, a.color + FROM '._DB_PREFIX_.'attribute a + LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute) + WHERE a.id_attribute_group = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND al.id_lang = '.(int)$id_lang); + break; + } + } + + /* Get the feature block names & values */ + if (sizeof($f)) + { + $fNames = Db::getInstance()->ExecuteS(' + SELECT id_feature, name + FROM '._DB_PREFIX_.'feature_lang + WHERE id_lang = '.(int)$cookie->id_lang.' AND id_feature IN ('.implode(',', $f).')'); + $fNameByID = array(); + foreach ($fNames AS $fName) + $fNameByID[(int)$fName['id_feature']] = $fName['name']; + } + + /* Get the attribute block names & values */ + if (sizeof($a)) + { + $aNames = Db::getInstance()->ExecuteS(' + SELECT ag.id_attribute_group, agl.public_name, ag.is_color_group + FROM '._DB_PREFIX_.'attribute_group ag + LEFT JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (agl.id_attribute_group = ag.id_attribute_group) + WHERE agl.id_lang = '.(int)$cookie->id_lang.' AND ag.id_attribute_group IN ('.implode(',', $a).')'); + + $aNameByID = $colorGroups = array(); + foreach ($aNames AS $aName) + { + $aNameByID[(int)$aName['id_attribute_group']] = $aName['public_name']; + if ($aName['is_color_group']) + $colorGroups[(int)$aName['id_attribute_group']] = true; + } + } + + $weight_unit = Configuration::get('PS_WEIGHT_UNIT'); + foreach ($filterBlocks AS &$filterBlock) + { + if ($filterBlock['type_lite'] == 'category') + { + $filterBlock['name'] = $this->l('Categories'); + + $c = array(); + foreach ($subCategories AS $subCat) + { + $c[] = (int)$subCat['id_category']; + $filterBlock['values'][(int)$subCat['id_category']]['name'] = $subCat['name']; + + //init the number of product in this category + if (!isset($filterBlock['values'][(int)$subCat['id_category']]['nbr'])) + $filterBlock['values'][(int)$subCat['id_category']]['nbr'] = 0; + + //check if the category is selected and set to true + if (isset($selectedFilters['category']) AND in_array($subCat['id_category'], $selectedFilters['category'])) + $filterBlock['values'][(int)$subCat['id_category']]['checked'] = true; + } + + $productCat = $this->filterProducts($products, $selectedFilters, 'category'); + + //count nbr product in category + foreach ($c AS $idSubCategory) + foreach ($productCat AS $product) + if (in_array($idSubCategory, $product['c'])) + $filterBlock['values'][(int)$idSubCategory]['nbr']++; + } + elseif ($filterBlock['type_lite'] == 'id_feature') + { + $filterBlock['name'] = $fNameByID[(int)$filterBlock['id_key']]; + $filterBlock['values'] = array(); + + $productFeat = $this->filterProducts($products, $selectedFilters, 'id_feature_'.(int)$filterBlock['id_key']); + + foreach ($filterBlock['SQLvalues'] AS $value) + { + foreach ($productFeat AS $product) + { + if (in_array($value['id_feature_value'], $product['f'])) + { + $filterBlock['values'][(int)$value['id_feature_value']]['name'] = $value['value']; + if (!isset($filterBlock['values'][(int)$value['id_feature_value']]['nbr'])) + $filterBlock['values'][(int)$value['id_feature_value']]['nbr'] = 0; + $filterBlock['values'][(int)$value['id_feature_value']]['nbr']++; + } + if (in_array($value['id_feature_value'], $product['f']) AND !isset($filterBlock['values'][(int)$value['id_feature_value']])) + { + $filterBlock['values'][(int)$value['id_feature_value']]['name'] = $value['value']; + $filterBlock['values'][(int)$value['id_feature_value']]['nbr'] = 0; + } + } + if (isset($selectedFilters['id_feature_'.(int)$filterBlock['id_key']]) AND in_array((int)$value['id_feature_value'].'_'.(int)$filterBlock['id_key'], $selectedFilters['id_feature_'.(int)$filterBlock['id_key']])) + $filterBlock['values'][(int)$value['id_feature_value']]['checked'] = true; + } + + unset($filterBlock['SQLvalues']); + } + elseif ($filterBlock['type_lite'] == 'id_attribute_group') + { + $filterBlock['name'] = $aNameByID[(int)$filterBlock['id_key']]; + $filterBlock['is_color_group'] = isset($colorGroups[(int)$filterBlock['id_key']]); + $filterBlock['values'] = array(); + + $productsAttr = $this->filterProducts($products, $selectedFilters, 'id_attribute_group_'.(int)$filterBlock['id_key']); + + foreach ($filterBlock['SQLvalues'] AS $value) + { + foreach ($productsAttr AS $product) + { + if(in_array($value['id_attribute'], $product['a'])) + { + $filterBlock['values'][(int)$value['id_attribute']]['name'] = $value['name']; + $filterBlock['values'][(int)$value['id_attribute']]['color'] = $value['color']; + if (!isset($filterBlock['values'][(int)$value['id_attribute']]['nbr'])) + $filterBlock['values'][(int)$value['id_attribute']]['nbr'] = 0; + $filterBlock['values'][(int)$value['id_attribute']]['nbr']++; + } + if (isset($product['a'.$value['id_attribute']]) AND !isset($filterBlock['values'][(int)$value['id_attribute']])) + { + $filterBlock['values'][(int)$value['id_attribute']]['name'] = $value['name']; + $filterBlock['values'][(int)$value['id_attribute']]['nbr'] = 0; + } + } + if (isset($selectedFilters['id_attribute_group_'.(int)$filterBlock['id_key']]) AND in_array((int)$value['id_attribute'].'_'.(int)$filterBlock['id_key'], $selectedFilters['id_attribute_group_'.(int)$filterBlock['id_key']])) + $filterBlock['values'][(int)$value['id_attribute']]['checked'] = true; + } + unset($filterBlock['SQLvalues']); + } + elseif ($filterBlock['type_lite'] == 'condition') + { + $filterBlock['name'] = $this->l('Condition'); + $filterBlock['values'] = array( + 'new' => array('name' => $this->l('New'), 'nbr' => 0), + 'used' => array('name' => $this->l('Used'), 'nbr' => 0), + 'refurbished' => array('name' => $this->l('Refurbished'), 'nbr' => 0)); + + $productCond = $this->filterProducts($products, $selectedFilters, 'condition'); + + foreach ($filterBlock['values'] AS $conditionKey => &$condition) + { + foreach ($productCond AS $product) + if ($product['condition'] == $conditionKey) + $condition['nbr']++; + if (isset($selectedFilters['condition']) AND in_array($conditionKey, $selectedFilters['condition'])) + $condition['checked'] = true; + } + } + elseif ($filterBlock['type_lite'] == 'quantity') + { + $filterBlock['name'] = $this->l('Availability'); + $filterBlock['values'] = array( + '1' => array('name' => $this->l('In stock'), 'nbr' => 0), + '0' => array('name' => $this->l('Not available'), 'nbr' => 0)); + + $productQuant = $this->filterProducts($products, $selectedFilters, 'quantity'); + + foreach ($filterBlock['values'] AS $quantKey => &$quantity) + { + foreach ($productQuant AS $product) + if ($product['quantity'] == $quantKey) + $quantity['nbr']++; + if (isset($selectedFilters['quantity']) AND in_array($quantKey, $selectedFilters['quantity'])) + $quantity['checked'] = true; + } + } + elseif ($filterBlock['type_lite'] == 'manufacturer') + { + $filterBlock['name'] = $this->l('Manufacturer'); + + $man = array(); + $productKeys = array_keys($products); + if(!empty($productKeys)) + $man = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT(p.id_manufacturer), m.name + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) + WHERE p.id_product IN ('.implode(',', $productKeys).') AND p.id_manufacturer != 0'); + + $productsManuf = $this->filterProducts($products, $selectedFilters, 'manufacturer'); + + $productsManuf = $this->filterProducts($products, $selectedFilters, 'manufacturer'); + + foreach ($man AS $manufacturer) + { + $filterBlock['values'][(int)$manufacturer['id_manufacturer']]['name'] = $manufacturer['name']; + if (!isset($filterBlock['values'][(int)$manufacturer['id_manufacturer']]['nbr'])) + $filterBlock['values'][(int)$manufacturer['id_manufacturer']]['nbr'] = 0; + foreach ($productsManuf AS $product) + if ($product['id_manufacturer'] == $manufacturer['id_manufacturer']) + $filterBlock['values'][(int)$manufacturer['id_manufacturer']]['nbr']++; + if (isset($selectedFilters['manufacturer']) AND in_array($manufacturer['id_manufacturer'], $selectedFilters['manufacturer'])) + $filterBlock['values'][(int)$manufacturer['id_manufacturer']]['checked'] = true; + } + } + elseif ($filterBlock['type_lite'] == 'weight') + { + if (!empty($weight) && max($weight) != min($weight)) + { + $filterBlock['name'] = $this->l('Weight'); + $filterBlock['slider'] = true; + $filterBlock['max'] = max($weight); + $filterBlock['min'] = min($weight); + if (isset($selectedFilters['weight'])) + $filterBlock['values'] = array($selectedFilters['weight'][0], $selectedFilters['weight'][1]); + else + $filterBlock['values'] = array(min($weight), max($weight)); + $filterBlock['unit'] = $weight_unit; + } + else + unset($selectedFilters['weight']); + } + } + + $nFilters = 0; + foreach ($selectedFilters AS $filters) + $nFilters += sizeof($filters); + + + $params = '?'; + foreach($_GET as $key => $val) + $params .= $key.'='.$val.'&'; + + $share_url = $link->getCategoryLink((int)$category->id, $category->link_rewrite[(int)$cookie->id_lang], (int)$cookie->id_lang).rtrim($params, '&'); + + $smarty->assign(array( + 'display_share' => (int)Configuration::get('PS_LAYERED_SHARE'), + 'share_url' => $this->getShortLink($share_url), + 'layered_use_checkboxes' => (int)Configuration::get('PS_LAYERED_NAVIGATION_CHECKBOXES'), + 'id_category_layered' => (int)$id_parent, + 'selected_filters' => $selectedFilters, + 'n_filters' => (int)$nFilters, + 'nbr_filterBlocks' => sizeof($filterBlocks), + 'filters' => $filterBlocks)); + + return $this->display(__FILE__, 'blocklayered.tpl'); + } + + public function ajaxCall() + { + global $smarty, $cookie; + + $selectedFilters = $this->getSelectedFilters(); + $products = $this->getProductByFilters($selectedFilters); + $products = Product::getProductsProperties((int)$cookie->id_lang, $products); + $nbProducts = $this->nbr_products; + $range = 2; /* how many pages around page selected */ + + $n = (int)Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); + $p = Tools::getValue('p', 1); + + if ($p < 0) + $p = 0; + + if ($p > ($nbProducts / $n)) + $p = ceil($nbProducts / $n); + $pages_nb = ceil($nbProducts / (int)($n)); + + $start = (int)($p - $range); + if ($start < 1) + $start = 1; + + $stop = (int)($p + $range); + if ($stop > $pages_nb) + $stop = (int)($pages_nb); + + $smarty->assign('nb_products', $nbProducts); + $pagination_infos = array( + 'pages_nb' => (int)($pages_nb), + 'p' => (int)($p), + 'n' => (int)($n), + 'range' => (int)($range), + 'start' => (int)($start), + 'stop' => (int)($stop), + 'nArray' => $nArray = (int)(Configuration::get('PS_PRODUCTS_PER_PAGE')) != 10 ? array((int)(Configuration::get('PS_PRODUCTS_PER_PAGE')), 10, 20, 50) : array(10, 20, 50) + ); + $smarty->assign($pagination_infos); + + $smarty->assign('products', $products); + + /* We are sending an array in jSon to the .js controller, it will update both the filters and the products zones */ + return Tools::jsonEncode(array( + 'filtersBlock' => $this->generateFiltersBlock($selectedFilters), + 'productList' => $smarty->fetch(_PS_THEME_DIR_.'product-list.tpl'), + 'pagination' => $smarty->fetch(_PS_THEME_DIR_.'pagination.tpl') + )); + // return '<div id="layered_ajax_column">'.$this->generateFiltersBlock($selectedFilters).'</div><div id="layered_ajax_products">'.$smarty->fetch(_PS_THEME_DIR_.'product-list.tpl').'</div>'; + } + + public function rebuildLayeredStructure() + { + @set_time_limit(0); + // setting the memory limit to 128M only if current is lower + $memory_limit = ini_get('memory_limit'); + if ( substr($memory_limit,-1) != 'G' + AND ((substr($memory_limit,-1) == 'M' AND substr($memory_limit,0,-1) < 128) + OR is_numeric($memory_limit) AND (intval($memory_limit) < 131072)) + ) + { + @ini_set('memory_limit','128M'); + } + + /* Delete and re-create the layered categories table */ + Db::getInstance()->Execute('DROP TABLE IF EXISTS '._DB_PREFIX_.'layered_category'); + Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'layered_category` ( + `id_layered_category` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `id_category` INT(10) UNSIGNED NOT NULL, + `id_value` INT(10) UNSIGNED NOT NULL DEFAULT \'0\', + `type` ENUM(\'category\',\'id_feature\',\'id_attribute_group\',\'quantity\',\'condition\',\'manufacturer\',\'weight\') NOT NULL, + `position` INT(10) UNSIGNED NOT NULL, + PRIMARY KEY (`id_layered_category`), + KEY `id_category` (`id_category`,`type`) + ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;'); + } + + public function rebuildLayeredCache($productsIds = array(), $categoriesIds = array()) + { + @set_time_limit(0); + // setting the memory limit to 128M only if current is lower + $memory_limit = ini_get('memory_limit'); + if (substr($memory_limit,-1) != 'G' + AND ((substr($memory_limit,-1) == 'M' AND substr($memory_limit,0,-1) < 128) + OR is_numeric($memory_limit) AND (intval($memory_limit) < 131072)) + ) + { + @ini_set('memory_limit','129M'); + } + + $db = Db::getInstance(); + $nCategories = array(); + $doneCategories = array(); + + $attributeGroups = Db::getInstance()->ExecuteS(' + SELECT a.id_attribute, a.id_attribute_group + FROM '._DB_PREFIX_.'attribute a + LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_attribute = a.id_attribute) + LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (pa.id_product_attribute = pac.id_product_attribute) + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = pa.id_product) + LEFT JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category) + WHERE c.active = 1'.(sizeof($categoriesIds) ? ' AND cp.id_category IN ('.implode(',', $categoriesIds).')' : '').' AND p.active = 1'.(sizeof($productsIds) ? ' AND p.id_product IN ('.implode(',', $productsIds).')' : ''), false); + + $attributeGroupsById = array(); + while ($row = $db->nextRow($attributeGroups)) + $attributeGroupsById[(int)$row['id_attribute']] = (int)$row['id_attribute_group']; + + $features = Db::getInstance()->ExecuteS(' + SELECT fv.id_feature_value, fv.id_feature + FROM '._DB_PREFIX_.'feature_value fv + LEFT JOIN '._DB_PREFIX_.'feature_product fp ON (fp.id_feature_value = fv.id_feature_value) + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = fp.id_product) + LEFT JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category) + WHERE (fv.custom IS NULL OR fv.custom = 0) AND c.active = 1'.(sizeof($categoriesIds) ? ' AND cp.id_category IN ('.implode(',', $categoriesIds).')' : '').' AND p.active = 1'.(sizeof($productsIds) ? ' AND p.id_product IN ('.implode(',', $productsIds).')' : ''), false); + + $featuresById = array(); + while ($row = $db->nextRow($features)) + $featuresById[(int)$row['id_feature_value']] = (int)$row['id_feature']; + + $result = $db->ExecuteS(' + SELECT p.id_product, GROUP_CONCAT(DISTINCT fv.id_feature_value) features, GROUP_CONCAT(DISTINCT cp.id_category) categories, GROUP_CONCAT(DISTINCT pac.id_attribute) attributes + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category) + LEFT JOIN '._DB_PREFIX_.'feature_product fp ON (fp.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'feature_value fv ON (fv.id_feature_value = fp.id_feature_value) + LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (pa.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_product_attribute = pa.id_product_attribute) + WHERE c.active = 1'.(sizeof($categoriesIds) ? ' AND cp.id_category IN ('.implode(',', $categoriesIds).')' : '').' AND p.active = 1'.(sizeof($productsIds) ? ' AND p.id_product IN ('.implode(',', $productsIds).')' : '').' AND (fv.custom IS NULL OR fv.custom = 0) + GROUP BY p.id_product', false); + + while ($product = $db->nextRow($result)) + { + $a = $c = $f = array(); + if (!empty($product['attributes'])) + $a = array_flip(explode(',', $product['attributes'])); + if (!empty($product['categories'])) + $c = array_flip(explode(',', $product['categories'])); + if (!empty($product['features'])) + $f = array_flip(explode(',', $product['features'])); + + $queryCategory = 'INSERT INTO '._DB_PREFIX_.'layered_category (id_category, id_value, type, position) VALUES '; + $toInsert = false; + foreach ($c AS $id_category => $category) + { + if (!isset($nCategories[(int)$id_category])) + $nCategories[(int)$id_category] = 1; + if (!isset($doneCategories[(int)$id_category]['cat'])) + { + $doneCategories[(int)$id_category]['cat'] = true; + $queryCategory .= '('.(int)$id_category.',NULL,\'category\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + foreach ($a AS $kAttribute => $attribute) + if (!isset($doneCategories[(int)$id_category]['a'.(int)$attributeGroupsById[(int)$kAttribute]])) + { + $doneCategories[(int)$id_category]['a'.(int)$attributeGroupsById[(int)$kAttribute]] = true; + $queryCategory .= '('.(int)$id_category.','.(int)$attributeGroupsById[(int)$kAttribute].',\'id_attribute_group\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + foreach ($f AS $kFeature => $feature) + if (!isset($doneCategories[(int)$id_category]['f'.(int)$featuresById[(int)$kFeature]])) + { + $doneCategories[(int)$id_category]['f'.(int)$featuresById[(int)$kFeature]] = true; + $queryCategory .= '('.(int)$id_category.','.(int)$featuresById[(int)$kFeature].',\'id_feature\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + if (!isset($doneCategories[(int)$id_category]['q'])) + { + $doneCategories[(int)$id_category]['q'] = true; + $queryCategory .= '('.(int)$id_category.',NULL,\'quantity\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + if (!isset($doneCategories[(int)$id_category]['m'])) + { + $doneCategories[(int)$id_category]['m'] = true; + $queryCategory .= '('.(int)$id_category.',NULL,\'manufacturer\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + if (!isset($doneCategories[(int)$id_category]['c'])) + { + $doneCategories[(int)$id_category]['c'] = true; + $queryCategory .= '('.(int)$id_category.',NULL,\'condition\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + if (!isset($doneCategories[(int)$id_category]['w'])) + { + $doneCategories[(int)$id_category]['w'] = true; + $queryCategory .= '('.(int)$id_category.',NULL,\'weight\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } + /* +if (!isset($doneCategories[(int)$id_category]['p'])) + { + $doneCategories[(int)$id_category]['p'] = true; + $queryCategory .= '('.(int)$id_category.',NULL,\'price\','.(int)$nCategories[(int)$id_category]++.'),'; + $toInsert = true; + } +*/ + } + if ($toInsert) + Db::getInstance()->Execute(rtrim($queryCategory, ',')); + } + } + + function filterProducts($products, $selectedFilters, $excludeType = false) + { + $productsToKeep = array(); + $filterByLetter = array('id_attribute_group' => 'a', 'id_feature' => 'f', 'category' => 'c', 'manufacturer' => 'id_manufacturer', + 'quantity' => 'quantity', 'condition' => 'condition', 'weight' => 'weight', 'price' => 'price'); + + foreach ($selectedFilters AS $type => $filters) + { + if ($type == $excludeType OR !sizeof($filters)) + continue; + else + { + $type = preg_match('/^(.*[^_0-9])/', $type, $res); + $type = $res[1]; + + switch ($type) + { + case 'category': + foreach ($products AS $k => $product) + if ($filter = Tools::getValue('id_category_layered')) + $productsToKeep[] = (int)$k; + //don't break me + case 'id_attribute_group': + case 'id_feature': + foreach ($products AS $k => $product) + foreach ($filters AS $filter) + if (in_array($filter, $product[$filterByLetter[$type]])) + $productsToKeep[] = (int)$k; + break; + + case 'manufacturer': + case 'condition': + case 'quantity': + foreach ($products AS $k => $product) + foreach ($filters AS $filter) + if ($product[$filterByLetter[$type]] == $filter) + $productsToKeep[] = (int)$k; + break; + + case 'weight': + case 'price': + $min = $filters[0]; + $max = $filters[1]; + foreach ($products AS $k => $product) + if((float)$min <= (float)$product[$filterByLetter[$type]] AND (float)$product[$filterByLetter[$type]] <= (float)$max) + $productsToKeep[] = (int)$k; + break; + } + + foreach ($products AS $k => $product) + if (!in_array($k, $productsToKeep)) + unset($products[(int)$k]); + $productsToKeep = array(); + } + } + return $products; + } + + private function getShortLink($share_url) { + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "http://api.bitly.com/v3/shorten"); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_HTTPGET, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, 'login='.Configuration::get('PS_LAYERED_BITLY_USERNAME').'&apiKey='.Configuration::get('PS_LAYERED_BITLY_API_KEY').'&longUrl='.urlencode($share_url).'&format=txt'); + $return = curl_exec($ch); + + if ($return != 'INVALID_LOGIN' AND $return != 'INVALID_APIKEY') + return $return; + else + return $share_url; + } +} \ No newline at end of file diff --git a/modules/blocklayered/blocklayered.tpl b/modules/blocklayered/blocklayered.tpl new file mode 100644 index 000000000..6dadd2c77 --- /dev/null +++ b/modules/blocklayered/blocklayered.tpl @@ -0,0 +1,155 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registred Trademark & Property of PrestaShop SA +*} + +<!-- Block layered navigation module --> +{if $nbr_filterBlocks != 0} +<div id="layered_block_left" class="block"> + <h4>{l s='Catalog' mod='blocklayered'}</h4> + <div class="block_content"> + {if $display_share} + <div id="layered_url_filter_block"> + <span class="layered_subtitle" style="float: none;">{l s='Share your search:' mod='blocklayered'}</span> + <input value="{$share_url|escape:html:'UTF-8'}"> + </div> + {/if} + <form action="#" id="layered_form"> + <div> + {if isset($selected_filters) && $n_filters > 0} + <div id="enabled_filters"> + <span class="layered_subtitle" style="float: none;">{l s='Enabled filters:' mod='blocklayered'}</span> + <ul> + {foreach from=$selected_filters key=filter_type item=filter_values} + {foreach from=$filter_values item=filter_value name=f_values} + {foreach from=$filters item=filter} + {if $filter.type == $filter_type && isset($filter.values)} + {if isset($filter.slider) && $smarty.foreach.f_values.first} + <li> + - {$filter.name|escape:html:'UTF-8'}{l s=':'} + {$filter.values[0]|escape:html:'UTF-8'}{$filter.unit|escape:html:'UTF-8'} - + {$filter.values[1]|escape:html:'UTF-8'}{$filter.unit|escape:html:'UTF-8'} + </li> + {else} + {foreach from=$filter.values key=id_value item=value} + {if $id_value == $filter_value} + <li> + <a href="#" rel="layered_{$filter.type_lite}_{$id_value}" title="{l s='Cancel' mod='blocklayered'}">x</a> + {$filter.name|escape:html:'UTF-8'}{l s=':'} {$value.name|escape:html:'UTF-8'} + </li> + {/if} + {/foreach} + {/if} + {/if} + {/foreach} + {/foreach} + {/foreach} + </ul> + </div> + {/if} + {foreach from=$filters item=filter} + {if isset($filter.values)} + <div> + <span class="layered_subtitle">{$filter.name|escape:html:'UTF-8'}</span> + <span class="layered_close"><a href="#" rel="layered_{$filter.type}_{$filter.id_key}">v</a></span> + <div class="clear"></div> + <ul id="layered_{$filter.type}_{$filter.id_key}"> + {if !isset($filter.slider)} + {foreach from=$filter.values key=id_value item=value} + <li{if $layered_use_checkboxes} class="nomargin"{/if}> + {if isset($filter.is_color_group) && $filter.is_color_group} + <input type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_attribute_{$id_value}" {if !$value.nbr} value="X" disabled="disabled"{/if} style="background: {if isset($value.color)}{$value.color}{else}#CCC{/if}; margin-left: 0; width: 16px; height: 16px; padding:0; border: 1px solid {if isset($value.checked) && $value.checked}red{else}#666{/if};" /> + {if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if} + {else} + {if $layered_use_checkboxes} + <input type="checkbox" class="checkbox" name="layered_{$filter.type_lite}_{$id_value}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} /> + {/if} + {/if} + <label for="layered_{$filter.type_lite}_{$id_value}"{if !$value.nbr} class="disabled"{else}{if isset($filter.is_color_group) && $filter.is_color_group} name="layered_{$filter.type_lite}_{$id_value}" class="layered_color" rel="{$id_value}_{$filter.id_key}"{/if}{/if}>{$value.name|escape:html:'UTF-8'}<span> ({$value.nbr})</span></label> + </li> + {/foreach} + {else} + <label for="{$filter.type}">{l s='Range'} : </label><span id="layered_{$filter.type}_range"></span> + <div style="margin-top:5px;" class="layered_slider" id="layered_{$filter.type}_slider"></div> + <script type="text/javascript"> + unit = '{$filter.unit}'; + {literal} + $(document).ready(function() + { + $('#layered_{/literal}{$filter.type}{literal}_slider').slider({ + range: true, + min: {/literal}{$filter.min}{literal}, + max: {/literal}{$filter.max}{literal}, + values: [ {/literal}{$filter.values[0]}{literal}, {/literal}{$filter.values[1]}{literal}], + slide: function( event, ui ) { + $('#layered_{/literal}{$filter.type}{literal}_range').html(ui.values[ 0 ] + unit + ' - ' + ui.values[ 1 ] + unit); + }, + stop: function () { + reloadContent(); + } + }); + $('#layered_{/literal}{$filter.type}{literal}_range').html($('#layered_{/literal}{$filter.type}{literal}_slider').slider('values', 0 ) +unit+ + ' - ' + $('#layered_{/literal}{$filter.type}{literal}_slider').slider('values', 1 )+unit ); + }); + {/literal} + </script> + <!-- + <script type="text/javascript"> + unit = '{$filter.unit}'; + type = '{$filter.type}'; + max = '{$filter.max}'; + min = '{$filter.min}'; + values = [{$filter.values[0]}, {$filter.values[1]}]; + {literal} + $(document).ready(function() + { + initSlider(type, min, max, values, unit); + }); + {/literal} + </script> + --> + {/if} + </ul> + </div> + {/if} + {/foreach} + </div> + <input type="hidden" name="id_category_layered" value="{$id_category_layered}" /> + {foreach from=$filters item=filter} + {if $filter.type_lite == 'id_attribute_group' && isset($filter.is_color_group) && $filter.is_color_group} + {foreach from=$filter.values key=id_value item=value} + {if isset($value.checked)} + <input type="hidden" name="layered_id_attribute_group_{$id_value}" value="{$id_value}_{$filter.id_key}" /> + {/if} + {/foreach} + {/if} + {/foreach} + </form> + </div> + <div id="layered_ajax_loader" style="display: none;"> + <p style="margin: 20px 0; text-align: center;"><img src="{$img_ps_dir}loader.gif" alt="" /><br />{l s='Loading...' mod='blocklayered'}</p> + </div> +</div> +{/if} +<!-- /Block layered navigation module --> \ No newline at end of file diff --git a/modules/blocklayered/config.xml b/modules/blocklayered/config.xml new file mode 100644 index 000000000..63beaab35 --- /dev/null +++ b/modules/blocklayered/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocklayered</name> + <displayName><![CDATA[Layered navigation block]]></displayName> + <version><![CDATA[1.3]]></version> + <description><![CDATA[Displays a block with layered navigation filters.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocklayered/de.php b/modules/blocklayered/de.php new file mode 100644 index 000000000..0a6e31a3d --- /dev/null +++ b/modules/blocklayered/de.php @@ -0,0 +1,46 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklayered}prestashop>blocklayered_c32516babc5b6c47eb8ce1bfc223253c'] = 'Katalog'; +$_MODULE['<{blocklayered}prestashop>blocklayered_1262d1b9fbffb3a8e85ac9e4b449e989'] = 'Aktivierte Filter:'; +$_MODULE['<{blocklayered}prestashop>blocklayered_853ae90f0351324bd73ea615e6487517'] = ':'; +$_MODULE['<{blocklayered}prestashop>blocklayered_ea4788705e6873b424c65e91c2846b19'] = 'Abbrechen'; +$_MODULE['<{blocklayered}prestashop>blocklayered_87ba2ecc8b6915e8bd6f5089918229fd'] = 'Bereich'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8524de963f07201e5c086830d370797f'] = 'Lädt...'; +$_MODULE['<{blocklayered}prestashop>blocklayered_84241e458cdd5162745500a59a3680f3'] = 'Layered Navigation-Block'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d08fa8e157fe3f1875402cbd98aee1b'] = 'Zeigt einen Block mit Layered Navigation-Filter an'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7ad3f384bcf30d783b5a6f6c810b4762'] = 'Layered Navigation Datanbank wurde erfolgreich initialisiert'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fe016d3b990c2a9dd72ab6b45892f2ae'] = 'Einstellungen erfolgreich gespeichert'; +$_MODULE['<{blocklayered}prestashop>blocklayered_09da2b6f1217055bb22caa6ea08d9b80'] = 'Layered Navigation'; +$_MODULE['<{blocklayered}prestashop>blocklayered_382a0cf3c7ea26e9c7d0642d6d0ec07d'] = 'Das Modul ist noch in der Beta Version und wird weiter entwickelt'; +$_MODULE['<{blocklayered}prestashop>blocklayered_016d6031144c99f759b36c5e00c79e91'] = '10 weitere Neuerungen'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b77ae7b3f227f97fdbfbaee819c048d6'] = 'Echtzeit-Aktualisierung der Cache-Tabelle'; +$_MODULE['<{blocklayered}prestashop>blocklayered_3cd881c5805a5564b080022968081652'] = 'Zusätzliche Filter (Preise, Gewicht)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f67587ba40eff59a15796352c9037ddf'] = 'Fähigkeit, Filter nach Kategorie in der Modulkonfiguration zu verwalten '; +$_MODULE['<{blocklayered}prestashop>blocklayered_559175435fec02f846564385b20b98e2'] = 'Fähigkeit, Filtergruppen zu verbergen, die keine Werte und Filter-Werte mit 0 Produkten haben'; +$_MODULE['<{blocklayered}prestashop>blocklayered_abb461f7d4d8271a12ceead064d13cd0'] = 'Statistik und Analyse'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6af4dd46928a781eda42b940d3394ca6'] = 'Produktsortierung & Paginierung verwalten '; +$_MODULE['<{blocklayered}prestashop>blocklayered_b4ecb2bd1ea5153550669329db53277d'] = 'Kontrolle zur Kategorie-Gruppentabelle hinzufügen'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d99bf479cc40101e28f1f0ba1bfb6150'] = 'SEO Links & Echtzeit URL einrichten (Fähigkeit, die URL jemandem zu geben)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_27c7b93d882068a1137a9350c7f1a132'] = 'Weitere Optionen zur Modul-Konfiguration hinzufügen'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fb8082696a8d7a40fa62ea0e89b18c32'] = 'Leistungsverbesserungen'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7263de0a10ad25dfdadc44791c44fb1f'] = 'Cache-Initialisierung'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d15ce73cbadfe1e806ee7abd08a7fe4d'] = 'Vor dem ersten Gebrauch bitte Cache initialisieren'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2875534393f5ef32e42d92c30e9dfda5'] = 'Achtung: Dies kann mehrere Minuten dauern.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_15aa842a19af51c2cf1ec631cdf8337a'] = 'Wenn Sie dies nicht tun, könnte dies Cache-Tabelle immer größer werden (d.h. weniger effizient), und all die neuen Möglichkeiten (Attribute, Funktionen) können Ihren Besuchern nicht angeboten werden.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c64a069750ff8924b029b2206cabf3b2'] = 'Initialisieren Sie die Layered Navigation Datenbank'; +$_MODULE['<{blocklayered}prestashop>blocklayered_af1b98adf7f686b84cd0b443e022b7a0'] = 'Kategorien'; +$_MODULE['<{blocklayered}prestashop>blocklayered_9e2941b3c81256fac10392aaca4ccfde'] = 'Zustand'; +$_MODULE['<{blocklayered}prestashop>blocklayered_03c2e7e41ffc181a4e84080b4710e81e'] = 'Neu'; +$_MODULE['<{blocklayered}prestashop>blocklayered_019d1ca7d50cc54b995f60d456435e87'] = 'Gebraucht'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6da03a74721a0554b7143254225cc08a'] = 'Überholt'; +$_MODULE['<{blocklayered}prestashop>blocklayered_faeaec9eda6bc4c8cb6e1a9156a858be'] = 'Verfügbarkeit'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fcebe56087b9373f15514831184fa572'] = 'Auf Lager'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d25c72c1b18e562f6654fff8e11711e'] = 'Nicht verfügbar'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Hersteller'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8c489d0946f66d17d73f26366a4bf620'] = 'Gewicht'; + +?> \ No newline at end of file diff --git a/modules/blocklayered/es.php b/modules/blocklayered/es.php new file mode 100644 index 000000000..a5dc11e7f --- /dev/null +++ b/modules/blocklayered/es.php @@ -0,0 +1,54 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklayered}prestashop>blocklayered_84241e458cdd5162745500a59a3680f3'] = 'Bloque navegación por facetas'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d08fa8e157fe3f1875402cbd98aee1b'] = 'Muestra un bloque con los filtros de la navegación por facetas'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7ad3f384bcf30d783b5a6f6c810b4762'] = 'La base de datos por niveles de navegación se ha iniciado con éxito'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6e7db02664c13dd5b517a12eafab88b1'] = 'El nombre de usuario Bit.ly está vacío'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f5da5c32121b39bb2100b9b63ccf4c4c'] = 'Api_key Bit.ly está vacía'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fe016d3b990c2a9dd72ab6b45892f2ae'] = 'Configuración guardada con éxito'; +$_MODULE['<{blocklayered}prestashop>blocklayered_bb291cb01196158549fba8f6fe636d4a'] = 'Los ajustes no se guardan'; +$_MODULE['<{blocklayered}prestashop>blocklayered_09da2b6f1217055bb22caa6ea08d9b80'] = 'Capas de navegación'; +$_MODULE['<{blocklayered}prestashop>blocklayered_382a0cf3c7ea26e9c7d0642d6d0ec07d'] = 'Este módulo se encuentra en versión beta y se mejorará'; +$_MODULE['<{blocklayered}prestashop>blocklayered_016d6031144c99f759b36c5e00c79e91'] = '10 mejoras futuras'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b77ae7b3f227f97fdbfbaee819c048d6'] = 'Actualizar en tiempo real de la tabla de caché'; +$_MODULE['<{blocklayered}prestashop>blocklayered_3cd881c5805a5564b080022968081652'] = 'Filtros adicionales (precios, peso)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f67587ba40eff59a15796352c9037ddf'] = 'Capacidad de gestión de filtros por categoría en la configuración del módulo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_559175435fec02f846564385b20b98e2'] = 'Capacidad de ocultar los grupos de filtro sin valores y los valores con 0 productos'; +$_MODULE['<{blocklayered}prestashop>blocklayered_abb461f7d4d8271a12ceead064d13cd0'] = 'Estadísticas y análisis'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6af4dd46928a781eda42b940d3394ca6'] = 'Administrar tipo de productos y paginación'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b4ecb2bd1ea5153550669329db53277d'] = 'Añadir un cheque a la tabla categoría_grupo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d99bf479cc40101e28f1f0ba1bfb6150'] = 'Los links SEO y la construcción de URL en tiempo real (capacidad de dar la dirección a alguien)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_27c7b93d882068a1137a9350c7f1a132'] = 'Añadir más opciones en la configuración del módulo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fb8082696a8d7a40fa62ea0e89b18c32'] = 'Ejecución mejoras'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7263de0a10ad25dfdadc44791c44fb1f'] = 'Inicialización de caché'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d15ce73cbadfe1e806ee7abd08a7fe4d'] = 'Antes de usar este módulo por primera vez tiene que inicializar el caché'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2875534393f5ef32e42d92c30e9dfda5'] = 'Advertencia: Esto puede tardar varios minutos.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_15aa842a19af51c2cf1ec631cdf8337a'] = 'Si no lo hace, esta tabla caché podría ser cada vez más grande ( y ser menos eficaz), y sus visitantes no tendrán acceso a todas las nuevas opciones (atributos, características).'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c64a069750ff8924b029b2206cabf3b2'] = 'Inicializar la base de datos de navegación por capas'; +$_MODULE['<{blocklayered}prestashop>blocklayered_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{blocklayered}prestashop>blocklayered_32cd1899a36fd598df5a4e417bc6339a'] = 'Posible compartir URL'; +$_MODULE['<{blocklayered}prestashop>blocklayered_05ce875b6f1cb8477077f33bad5e9325'] = 'Al activar esta opción, sus visitantes comparten la dirección URL de su búsqueda'; +$_MODULE['<{blocklayered}prestashop>blocklayered_abc07e5243a77d8bebcadd90fca23d74'] = 'Para ofrecer a sus clientes enlaces cortos, crear una cuenta en bit.ly, luego copiar y pegar usuario y API key'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d67850bd126f070221dcfd5fa6317043'] = 'Regístrate'; +$_MODULE['<{blocklayered}prestashop>blocklayered_68fd0151074a3dba747f94b2fd8cf5f4'] = 'Ingresar bit.ly'; +$_MODULE['<{blocklayered}prestashop>blocklayered_a59cf1175d7abcbf35b520083b5aa9c2'] = 'API Key bit.ly'; +$_MODULE['<{blocklayered}prestashop>blocklayered_cf565402d32b79d33f626252949a6941'] = 'Guardar la configuración'; +$_MODULE['<{blocklayered}prestashop>blocklayered_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorías'; +$_MODULE['<{blocklayered}prestashop>blocklayered_9e2941b3c81256fac10392aaca4ccfde'] = 'Estado'; +$_MODULE['<{blocklayered}prestashop>blocklayered_03c2e7e41ffc181a4e84080b4710e81e'] = 'Nuevo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_019d1ca7d50cc54b995f60d456435e87'] = 'Usado'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6da03a74721a0554b7143254225cc08a'] = 'Restaurado'; +$_MODULE['<{blocklayered}prestashop>blocklayered_faeaec9eda6bc4c8cb6e1a9156a858be'] = 'Disponibilidad'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fcebe56087b9373f15514831184fa572'] = 'En stock'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d25c72c1b18e562f6654fff8e11711e'] = 'No disponible'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Fabricante'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8c489d0946f66d17d73f26366a4bf620'] = 'Peso'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c32516babc5b6c47eb8ce1bfc223253c'] = 'Catálogo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_aa3c0ac7e57fcf0e2e25d270ff502b6e'] = 'Compartir su búsqueda'; +$_MODULE['<{blocklayered}prestashop>blocklayered_1262d1b9fbffb3a8e85ac9e4b449e989'] = 'filtros habilitados:'; +$_MODULE['<{blocklayered}prestashop>blocklayered_853ae90f0351324bd73ea615e6487517'] = ':'; +$_MODULE['<{blocklayered}prestashop>blocklayered_ea4788705e6873b424c65e91c2846b19'] = 'Cancelar'; +$_MODULE['<{blocklayered}prestashop>blocklayered_87ba2ecc8b6915e8bd6f5089918229fd'] = 'Franja'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8524de963f07201e5c086830d370797f'] = 'Cargando ...'; diff --git a/modules/blocklayered/fr.php b/modules/blocklayered/fr.php new file mode 100644 index 000000000..e87c98d1c --- /dev/null +++ b/modules/blocklayered/fr.php @@ -0,0 +1,54 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklayered}prestashop>blocklayered_84241e458cdd5162745500a59a3680f3'] = 'Bloc navigation à facettes'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d08fa8e157fe3f1875402cbd98aee1b'] = 'Affiche un bloc avec les filtres de la navigation à facettes'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7ad3f384bcf30d783b5a6f6c810b4762'] = 'La base de données de la navigation à facettes à été initialisée avec succès'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6e7db02664c13dd5b517a12eafab88b1'] = 'Bit.ly nom d\'utilisateur est vide'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f5da5c32121b39bb2100b9b63ccf4c4c'] = 'Bit.ly api_key est vide'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fe016d3b990c2a9dd72ab6b45892f2ae'] = 'Paramètres enregistrés avec succès'; +$_MODULE['<{blocklayered}prestashop>blocklayered_bb291cb01196158549fba8f6fe636d4a'] = 'Paramètres non enregistré:'; +$_MODULE['<{blocklayered}prestashop>blocklayered_09da2b6f1217055bb22caa6ea08d9b80'] = 'Navigation à facettes'; +$_MODULE['<{blocklayered}prestashop>blocklayered_382a0cf3c7ea26e9c7d0642d6d0ec07d'] = 'Ce module est en version bêta et sera amélioré'; +$_MODULE['<{blocklayered}prestashop>blocklayered_016d6031144c99f759b36c5e00c79e91'] = '10 améliorations à venir'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b77ae7b3f227f97fdbfbaee819c048d6'] = 'Rafraîchissement en temps réel de la table de cache'; +$_MODULE['<{blocklayered}prestashop>blocklayered_3cd881c5805a5564b080022968081652'] = 'Filtres supplémentaires (par prix, par poids)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f67587ba40eff59a15796352c9037ddf'] = 'Possibilité de gérer les filtres catégorie par catégorie dans la configuration du module'; +$_MODULE['<{blocklayered}prestashop>blocklayered_559175435fec02f846564385b20b98e2'] = 'Possibilité de masquer les groupes sans valeurs, ou les valeurs correspondant à 0 produits'; +$_MODULE['<{blocklayered}prestashop>blocklayered_abb461f7d4d8271a12ceead064d13cd0'] = 'Statistiques et analyses'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6af4dd46928a781eda42b940d3394ca6'] = 'Gestion du tri des produits et de la pagination'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b4ecb2bd1ea5153550669329db53277d'] = 'Ajout d\'une vérification sur la table category_group table'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d99bf479cc40101e28f1f0ba1bfb6150'] = 'Lien ré-écrits et construction de l\'URL en temps réel (possibilité de la transmettre à quelqu\'un)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_27c7b93d882068a1137a9350c7f1a132'] = 'Ajout d\'options de configuration'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fb8082696a8d7a40fa62ea0e89b18c32'] = 'Amélioration des performance'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7263de0a10ad25dfdadc44791c44fb1f'] = 'Initialisation du cache'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d15ce73cbadfe1e806ee7abd08a7fe4d'] = 'Avant d\'utiliser ce module pour la première fois, vous devez initialiser le cache'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2875534393f5ef32e42d92c30e9dfda5'] = 'Attention : cela peut prendre plusieurs minutes.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_15aa842a19af51c2cf1ec631cdf8337a'] = 'Si vous ne le faites pas, cette table de cache risque de grossir rapidement (et d\'être moins performante), et les nouveaux choix (attributs, caractéristiques) ne seront pas présentés à vos visiteurs.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c64a069750ff8924b029b2206cabf3b2'] = 'Initialiser la base de données de la navigation à facettes'; +$_MODULE['<{blocklayered}prestashop>blocklayered_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{blocklayered}prestashop>blocklayered_32cd1899a36fd598df5a4e417bc6339a'] = 'Activer le partage d\'url'; +$_MODULE['<{blocklayered}prestashop>blocklayered_05ce875b6f1cb8477077f33bad5e9325'] = 'En activant cette option, vos visiteurs peuvent partager l\'URL de leur recherche'; +$_MODULE['<{blocklayered}prestashop>blocklayered_abc07e5243a77d8bebcadd90fca23d74'] = 'Pour offrir à vos clients des url courtes, créer un compte sur bit.ly, puis copiez et collez login et clé API.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d67850bd126f070221dcfd5fa6317043'] = 'Inscrivez-vous'; +$_MODULE['<{blocklayered}prestashop>blocklayered_68fd0151074a3dba747f94b2fd8cf5f4'] = 'Connectez-vous bit.ly'; +$_MODULE['<{blocklayered}prestashop>blocklayered_a59cf1175d7abcbf35b520083b5aa9c2'] = 'API Key bit.ly'; +$_MODULE['<{blocklayered}prestashop>blocklayered_cf565402d32b79d33f626252949a6941'] = 'Configuration enregistré'; +$_MODULE['<{blocklayered}prestashop>blocklayered_af1b98adf7f686b84cd0b443e022b7a0'] = 'Catégories'; +$_MODULE['<{blocklayered}prestashop>blocklayered_9e2941b3c81256fac10392aaca4ccfde'] = 'Etat'; +$_MODULE['<{blocklayered}prestashop>blocklayered_03c2e7e41ffc181a4e84080b4710e81e'] = 'Neuf'; +$_MODULE['<{blocklayered}prestashop>blocklayered_019d1ca7d50cc54b995f60d456435e87'] = 'Occasion'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6da03a74721a0554b7143254225cc08a'] = 'Reconditionné'; +$_MODULE['<{blocklayered}prestashop>blocklayered_faeaec9eda6bc4c8cb6e1a9156a858be'] = 'Disponibilité'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fcebe56087b9373f15514831184fa572'] = 'En stock'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d25c72c1b18e562f6654fff8e11711e'] = 'Non disponible'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Fabricant'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8c489d0946f66d17d73f26366a4bf620'] = 'Poids'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c32516babc5b6c47eb8ce1bfc223253c'] = 'Catalogue'; +$_MODULE['<{blocklayered}prestashop>blocklayered_aa3c0ac7e57fcf0e2e25d270ff502b6e'] = 'Partagez votre recherche:'; +$_MODULE['<{blocklayered}prestashop>blocklayered_1262d1b9fbffb3a8e85ac9e4b449e989'] = 'Filtres actifs :'; +$_MODULE['<{blocklayered}prestashop>blocklayered_853ae90f0351324bd73ea615e6487517'] = ' :'; +$_MODULE['<{blocklayered}prestashop>blocklayered_ea4788705e6873b424c65e91c2846b19'] = 'Annuler'; +$_MODULE['<{blocklayered}prestashop>blocklayered_87ba2ecc8b6915e8bd6f5089918229fd'] = 'Tranche'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8524de963f07201e5c086830d370797f'] = 'Chargement...'; diff --git a/modules/blocklayered/it.php b/modules/blocklayered/it.php new file mode 100644 index 000000000..ed0b13a99 --- /dev/null +++ b/modules/blocklayered/it.php @@ -0,0 +1,46 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklayered}prestashop>blocklayered_c32516babc5b6c47eb8ce1bfc223253c'] = 'Catalogo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_1262d1b9fbffb3a8e85ac9e4b449e989'] = 'Filtri abilitati:'; +$_MODULE['<{blocklayered}prestashop>blocklayered_853ae90f0351324bd73ea615e6487517'] = ':'; +$_MODULE['<{blocklayered}prestashop>blocklayered_ea4788705e6873b424c65e91c2846b19'] = 'Annulla'; +$_MODULE['<{blocklayered}prestashop>blocklayered_87ba2ecc8b6915e8bd6f5089918229fd'] = 'Intervallo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8524de963f07201e5c086830d370797f'] = 'Caricamento in corso ...'; +$_MODULE['<{blocklayered}prestashop>blocklayered_84241e458cdd5162745500a59a3680f3'] = 'Blocco di navigazione a strati'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d08fa8e157fe3f1875402cbd98aee1b'] = 'Visualizza un blocco con i filtri di navigazione a strati'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7ad3f384bcf30d783b5a6f6c810b4762'] = 'Il database di navigazione a strati è stato inizializzato con successo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fe016d3b990c2a9dd72ab6b45892f2ae'] = 'Configurazione salvata con successo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_09da2b6f1217055bb22caa6ea08d9b80'] = 'Navigazione a strati'; +$_MODULE['<{blocklayered}prestashop>blocklayered_382a0cf3c7ea26e9c7d0642d6d0ec07d'] = 'Questo modulo è in versione beta e sarà migliorato'; +$_MODULE['<{blocklayered}prestashop>blocklayered_016d6031144c99f759b36c5e00c79e91'] = '10 miglioramenti imminenti'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b77ae7b3f227f97fdbfbaee819c048d6'] = 'Aggiornamento in tempo reale della tabella cache'; +$_MODULE['<{blocklayered}prestashop>blocklayered_3cd881c5805a5564b080022968081652'] = 'Filtri aggiuntivi (prezzi, peso)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f67587ba40eff59a15796352c9037ddf'] = 'Possibilità di gestire i filtri in base alla categoria nella configurazione del modulo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_559175435fec02f846564385b20b98e2'] = 'Possibilità di nascondere gruppi filtro senza valori e valori di filtro con 0 prodotti'; +$_MODULE['<{blocklayered}prestashop>blocklayered_abb461f7d4d8271a12ceead064d13cd0'] = 'Statistiche e analisi'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6af4dd46928a781eda42b940d3394ca6'] = 'Gestione della selezione prodotti e impaginazione'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b4ecb2bd1ea5153550669329db53277d'] = 'Aggiungere un controllo sulla tabella category_group'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d99bf479cc40101e28f1f0ba1bfb6150'] = 'Link SEO e costruzione URL in tempo reale (possibilità di inviare l\'URL a qualcuno)'; +$_MODULE['<{blocklayered}prestashop>blocklayered_27c7b93d882068a1137a9350c7f1a132'] = 'Aggiunta di ulteriori opzioni nella configurazione del modulo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fb8082696a8d7a40fa62ea0e89b18c32'] = 'Miglioramenti prestazioni'; +$_MODULE['<{blocklayered}prestashop>blocklayered_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blocklayered}prestashop>blocklayered_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{blocklayered}prestashop>blocklayered_7263de0a10ad25dfdadc44791c44fb1f'] = 'Inizializzazione cache'; +$_MODULE['<{blocklayered}prestashop>blocklayered_d15ce73cbadfe1e806ee7abd08a7fe4d'] = 'Prima di usare questo modulo per la prima volta si deve inizializzare la cache'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2875534393f5ef32e42d92c30e9dfda5'] = 'Attenzione: Questo potrebbe richiedere alcuni minuti.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_15aa842a19af51c2cf1ec631cdf8337a'] = 'Se non lo fai, questa tabella cache potrebbe diventare sempre più granda (meno efficiente), e tutte le nuove scelte (attributi, caratteristiche) non saranno offerte ai visitatori.'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c64a069750ff8924b029b2206cabf3b2'] = 'Inizializzare il database di navigazione a strati'; +$_MODULE['<{blocklayered}prestashop>blocklayered_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorie'; +$_MODULE['<{blocklayered}prestashop>blocklayered_9e2941b3c81256fac10392aaca4ccfde'] = 'Condizione'; +$_MODULE['<{blocklayered}prestashop>blocklayered_03c2e7e41ffc181a4e84080b4710e81e'] = 'Nuovo'; +$_MODULE['<{blocklayered}prestashop>blocklayered_019d1ca7d50cc54b995f60d456435e87'] = 'Usato'; +$_MODULE['<{blocklayered}prestashop>blocklayered_6da03a74721a0554b7143254225cc08a'] = 'Rinnovato'; +$_MODULE['<{blocklayered}prestashop>blocklayered_faeaec9eda6bc4c8cb6e1a9156a858be'] = 'Disponibilità'; +$_MODULE['<{blocklayered}prestashop>blocklayered_fcebe56087b9373f15514831184fa572'] = 'In magazzino'; +$_MODULE['<{blocklayered}prestashop>blocklayered_2d25c72c1b18e562f6654fff8e11711e'] = 'Non disponibile'; +$_MODULE['<{blocklayered}prestashop>blocklayered_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Produttore'; +$_MODULE['<{blocklayered}prestashop>blocklayered_8c489d0946f66d17d73f26366a4bf620'] = 'Peso'; + +?> \ No newline at end of file diff --git a/modules/blocklayered/logo.gif b/modules/blocklayered/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..659aace81c639dac0e3905c1a6d792c94051c20a GIT binary patch literal 280 zcmZ?wbhEHb6krfwIKsf-=jV6k%$dD=_by$!w56rx-o1Op#l_E_J=?Nn%gmWGv$M00 z9zFX0{rhXzuBD}=O`be?_3G8%zkjc(sp;zKVju!2{$ycfXAor20jUMq$-p`_L8Z^< zvP|+Sw&RT*Jyk4@TSSg_^PH{_={e+-(Bu%&5%;9P*wWXeGa)470!wF0!bS%l<!h~? z-H&yd`rVTXH?Xm>USu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/modules/blocklink/add.png b/modules/blocklink/add.png new file mode 100644 index 0000000000000000000000000000000000000000..00be352c5783c0f009db7286bb4ac86f306634db GIT binary patch literal 570 zcmV-A0>%A_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz%t=H+R5;7s zQoTz;aTFDThWZDJcB$b(x<rd2g@Yf7Ht0}Mp*>O?!~#Vdl*A~_RMaJeHZc^62(la$ zXNk(f!J;Kx`k;bWQJvnEklKv4E*yUMoqNvtUEX^F0D`|j@Q(r{5=p1oY+msBe7DJD z5^lHq%4)R^@aW?E8gVou4QYP_h{fV|l}fb|4u?^%*HNq0P$(4O@pvv=E?2Qytv(Z1 zDwRMQ(vqhcAQFj2>~{NorBb;y7z}$#rSi>WG9eO)!0B{?dg5r7N~NwyOP=o=ta!a% zE*g!p8jYqyDwRIw^LdoZWfY4=WHK2LM>EopmORY>hGAw|mc5I|<MTS5ZeJ#oy~^cs zXtmk~s3(qQq#-SNngM-$snzQ9U@&->PN#3O*(?%?1Z*}N91cgL4{iEji;aEEtZ88I z%HD_Pm~b;dC=|BwEA}fCic6!>_++tII36#0y?%nn(Cp&Gi)U*JyQeW6UFQ%wFhd_= zFktBpwDhgV{lnb$$vU>rBA^N!nh-i<DS&G!K;;r)?{ov-Yv(vd0j>RQgVr8yH8%}^ zZn9za?@#`2175f^8t6qZXKdU|Cq1|P4!%N`c|6eCU*|IMpHVxOJgs;lasU7T07*qo IM6N<$g1<TUy8r+H literal 0 HcmV?d00001 diff --git a/modules/blocklink/blocklink.js b/modules/blocklink/blocklink.js new file mode 100644 index 000000000..a577e7541 --- /dev/null +++ b/modules/blocklink/blocklink.js @@ -0,0 +1,44 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function linkEdition(linkId) +{ + getE('id').value = linkId; + getE('url').value = links[linkId][0]; + getE('newWindow').checked = links[linkId][1]; + var beg = parseInt(getE('languageFirst').value); + for (var i = 0; i <= parseInt(getE('languageNb').value - 1); i++) + getE('textInput_'+ (beg + i)).value = links[linkId][i + 2]; + getE('submitLinkUpdate').disabled = ''; + getE('submitLinkUpdate').setAttribute('class', 'button'); + /* ##### IE */ + getE('submitLinkUpdate').setAttribute('className', 'button'); +} + +function linkDeletion(linkId) +{ + document.location.replace(currentUrl+'&id='+linkId+'&token='+token); +} \ No newline at end of file diff --git a/modules/blocklink/blocklink.php b/modules/blocklink/blocklink.php new file mode 100644 index 000000000..ba8b993db --- /dev/null +++ b/modules/blocklink/blocklink.php @@ -0,0 +1,386 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockLink extends Module +{ + /* @var boolean error */ + protected $error = false; + + public function __construct() + { + $this->name = 'blocklink'; + $this->tab = 'front_office_features'; + $this->version = '1.4'; + $this->author = 'PrestaShop'; + + parent::__construct(); + + $this->displayName = $this->l('Link block'); + $this->description = $this->l('Adds a block with additional links.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete all your links ?'); + } + + public function install() + { + if (!parent::install() OR + !$this->registerHook('leftColumn') OR + !Db::getInstance()->Execute(' + CREATE TABLE '._DB_PREFIX_.'blocklink ( + `id_link` int(2) NOT NULL AUTO_INCREMENT, + `url` varchar(255) NOT NULL, + `new_window` TINYINT(1) NOT NULL, + PRIMARY KEY(`id_link`)) + ENGINE='._MYSQL_ENGINE_.' default CHARSET=utf8') OR + !Db::getInstance()->Execute(' + CREATE TABLE '._DB_PREFIX_.'blocklink_lang ( + `id_link` int(2) NOT NULL, + `id_lang` int(2) NOT NULL, + `text` varchar(64) NOT NULL, + PRIMARY KEY(`id_link`, `id_lang`)) + ENGINE='._MYSQL_ENGINE_.' default CHARSET=utf8') OR + !Configuration::updateValue('PS_BLOCKLINK_TITLE', array('1' => 'Block link', '2' => 'Bloc lien'))) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall() OR + !Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'blocklink') OR + !Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'blocklink_lang') OR + !Configuration::deleteByName('PS_BLOCKLINK_TITLE') OR + !Configuration::deleteByName('PS_BLOCKLINK_URL')) + return false; + return true; + } + + public function hookLeftColumn($params) + { + global $cookie, $smarty; + $links = $this->getLinks(); + + $smarty->assign(array( + 'blocklink_links' => $links, + 'title' => Configuration::get('PS_BLOCKLINK_TITLE', $cookie->id_lang), + 'url' => Configuration::get('PS_BLOCKLINK_URL'), + 'lang' => 'text_'.$cookie->id_lang + )); + if (!$links) + return false; + return $this->display(__FILE__, 'blocklink.tpl'); + } + + public function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + public function getLinks() + { + $result = array(); + /* Get id and url */ + if (!$links = Db::getInstance()->ExecuteS('SELECT `id_link`, `url`, `new_window` FROM '._DB_PREFIX_.'blocklink'.((int)(Configuration::get('PS_BLOCKLINK_ORDERWAY')) == 1 ? ' ORDER BY `id_link` DESC' : ''))) + return false; + $i = 0; + foreach ($links AS $link) + { + $result[$i]['id'] = $link['id_link']; + $result[$i]['url'] = $link['url']; + $result[$i]['newWindow'] = $link['new_window']; + /* Get multilingual text */ + if (!$texts = Db::getInstance()->ExecuteS('SELECT `id_lang`, `text` FROM '._DB_PREFIX_.'blocklink_lang WHERE `id_link`='.(int)($link['id_link']))) + return false; + foreach ($texts AS $text) + $result[$i]['text_'.$text['id_lang']] = $text['text']; + $i++; + } + return $result; + } + + public function addLink() + { + /* Url registration */ + if (!Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blocklink VALUES (NULL, \''.pSQL($_POST['url']).'\', '.((isset($_POST['newWindow']) AND $_POST['newWindow']) == 'on' ? 1 : 0).')') OR !$lastId = mysql_insert_id()) + return false; + /* Multilingual text */ + $languages = Language::getLanguages(); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + if (!$languages) + return false; + foreach ($languages AS $language) + if (!empty($_POST['text_'.$language['id_lang']])) + { + if (!Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blocklink_lang VALUES ('.(int)($lastId).', '.(int)($language['id_lang']).', \''.pSQL($_POST['text_'.$language['id_lang']]).'\')')) + return false; + } + else + if (!Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blocklink_lang VALUES ('.(int)($lastId).', '.(int)($language['id_lang']).', \''.pSQL($_POST['text_'.$defaultLanguage]).'\')')) + return false; + return true; + } + + public function updateLink() + { + /* Url registration */ + if (!Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'blocklink SET `url`=\''.pSQL($_POST['url']).'\', `new_window`='.(isset($_POST['newWindow']) ? 1 : 0).' WHERE `id_link`='.(int)($_POST['id']))) + return false; + /* Multilingual text */ + $languages = Language::getLanguages(); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + if (!$languages) + return false; + if (!Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blocklink_lang WHERE `id_link` = '.(int)($_POST['id']))) + return false ; + foreach ($languages AS $language) + if (!empty($_POST['text_'.$language['id_lang']])) + { + if (!Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blocklink_lang VALUES ('.(int)($_POST['id']).', '.(int)($language['id_lang']).', \''.pSQL($_POST['text_'.$language['id_lang']]).'\')')) + return false; + } + else + if (!Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'blocklink_lang VALUES ('.(int)($_POST['id']).', '.$language['id_lang'].', \''.pSQL($_POST['text_'.$defaultLanguage]).'\')')) + return false; + return true; + } + + public function deleteLink() + { + return Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'blocklink WHERE `id_link`='.(int)($_GET['id'])); + } + + public function updateTitle() + { + $languages = Language::getLanguages(); + $result = array(); + foreach ($languages AS $language) + $result[$language['id_lang']] = $_POST['title_'.$language['id_lang']]; + if (!Configuration::updateValue('PS_BLOCKLINK_TITLE', $result)) + return false; + return Configuration::updateValue('PS_BLOCKLINK_URL', $_POST['title_url']); + } + + public function getContent() + { + $this->_html = '<h2>'.$this->displayName.'</h2> + <script type="text/javascript" src="'.$this->_path.'blocklink.js"></script>'; + + /* Add a link */ + if (isset($_POST['submitLinkAdd'])) + { + if (empty($_POST['text_'.Configuration::get('PS_LANG_DEFAULT')]) OR empty($_POST['url'])) + $this->_html .= $this->displayError($this->l('You must fill in all fields')); + elseif (!Validate::isUrl(str_replace('http://', '', $_POST['url']))) + $this->_html .= $this->displayError($this->l('Bad URL')); + else + if ($this->addLink()) + $this->_html .= $this->displayConfirmation($this->l('The link has been added.')); + else + $this->_html .= $this->displayError($this->l('An error occurred during link creation.')); + } + /* Update a link */ + elseif (isset($_POST['submitLinkUpdate'])) + { + if (empty($_POST['text_'.Configuration::get('PS_LANG_DEFAULT')]) OR empty($_POST['url'])) + $this->_html .= $this->displayError($this->l('You must fill in all fields')); + elseif (!Validate::isUrl(str_replace('http://', '', $_POST['url']))) + $this->_html .= $this->displayError($this->l('Bad URL')); + else + if (empty($_POST['id']) OR !is_numeric($_POST['id']) OR !$this->updateLink()) + $this->_html .= $this->displayError($this->l('An error occurred during link updating.')); + else + $this->_html .= $this->displayConfirmation($this->l('The link has been updated.')); + } + /* Update the block title */ + elseif (isset($_POST['submitTitle'])) + { + if (empty($_POST['title_'.Configuration::get('PS_LANG_DEFAULT')])) + $this->_html .= $this->displayError($this->l('"title" field cannot be empty.')); + elseif (!empty($_POST['title_url']) AND !Validate::isUrl(str_replace('http://', '', $_POST['title_url']))) + $this->_html .= $this->displayError($this->l('The \'title\' field is invalid')); + elseif (!Validate::isGenericName($_POST['title_'.Configuration::get('PS_LANG_DEFAULT')])) + $this->_html .= $this->displayError($this->l('The \'title\' field is invalid')); + elseif (!$this->updateTitle()) + $this->_html .= $this->displayError($this->l('An error occurred during title updating.')); + else + $this->_html .= $this->displayConfirmation($this->l('The block title has been updated.')); + } + /* Delete a link*/ + elseif (isset($_GET['id'])) + { + if (!is_numeric($_GET['id']) OR !$this->deleteLink()) + $this->_html .= $this->displayError($this->l('An error occurred during link deletion.')); + else + $this->_html .= $this->displayConfirmation($this->l('The link has been deleted.')); + } + if (isset($_POST['submitOrderWay'])) + { + if (Configuration::updateValue('PS_BLOCKLINK_ORDERWAY', (int)(Tools::getValue('orderWay')))) + $this->_html .= $this->displayConfirmation($this->l('Sort order updated')); + else + $this->_html .= $this->displayError($this->l('An error occurred during sort order set-up.')); + } + + $this->_displayForm(); + $this->_list(); + + return $this->_html; + } + + private function _displayForm() + { + global $cookie; + /* Language */ + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(false); + $divLangName = 'text¤title'; + /* Title */ + $title_url = Configuration::get('PS_BLOCKLINK_URL'); + + $this->_html .= ' + <script type="text/javascript"> + id_language = Number('.$defaultLanguage.'); + </script> + <fieldset> + <legend><img src="'.$this->_path.'add.png" alt="" title="" /> '.$this->l('Add a new link').'</legend> + <form method="post" action="'.$_SERVER['REQUEST_URI'].'"> + <label>'.$this->l('Text:').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $this->_html .= ' + <div id="text_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input type="text" name="text_'.$language['id_lang'].'" id="textInput_'.$language['id_lang'].'" value="'.(($this->error AND isset($_POST['text_'.$language['id_lang']])) ? $_POST['text_'.$language['id_lang']] : '').'" /><sup> *</sup> + </div>'; + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'text', true); + $this->_html .= ' + <div class="clear"></div> + </div> + <label>'.$this->l('URL:').'</label> + <div class="margin-form"><input type="text" name="url" id="url" value="'.(($this->error AND isset($_POST['url'])) ? $_POST['url'] : '').'" /></div> + <label>'.$this->l('Open in a new window:').'</label> + <div class="margin-form"><input type="checkbox" name="newWindow" id="newWindow" '.(($this->error AND isset($_POST['newWindow'])) ? 'checked="checked"' : '').' /></div> + <div class="margin-form"> + <input type="hidden" name="id" id="id" value="'.($this->error AND isset($_POST['id']) ? $_POST['id'] : '').'" /> + <input type="submit" class="button" name="submitLinkAdd" value="'.$this->l('Add this link').'" /> + <input type="submit" class="button disable" name="submitLinkUpdate" value="'.$this->l('Edit this link').'" disabled="disbaled" id="submitLinkUpdate" /> + </div> + </form> + </fieldset> + <fieldset class="space"> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" /> '.$this->l('Block title').'</legend> + <form method="post" action="'.$_SERVER['REQUEST_URI'].'"> + <label>'.$this->l('Block title:').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $this->_html .= ' + <div id="title_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input type="text" name="title_'.$language['id_lang'].'" value="'.(($this->error AND isset($_POST['title'])) ? $_POST['title'] : Configuration::get('PS_BLOCKLINK_TITLE', $language['id_lang'])).'" /><sup> *</sup> + </div>'; + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'title', true); + $this->_html .= ' + <div class="clear"></div> + </div> + <label>'.$this->l('Block URL:').'</label> + <div class="margin-form"><input type="text" name="title_url" value="'.(($this->error AND isset($_POST['title_url'])) ? $_POST['title_url'] : $title_url).'" /></div> + <div class="margin-form"><input type="submit" class="button" name="submitTitle" value="'.$this->l('Update').'" /></div> + </form> + </fieldset> + <fieldset class="space"> + <legend><img src="'.$this->_path.'prefs.gif" alt="" title="" /> '.$this->l('Settings').'</legend> + <form method="post" action="'.$_SERVER['REQUEST_URI'].'"> + <label>'.$this->l('Order list:').'</label> + <div class="margin-form"> + <select name="orderWay"> + <option value="0"'.(!Configuration::get('PS_BLOCKLINK_ORDERWAY') ? 'selected="selected"' : '').'>'.$this->l('by most recent links').'</option> + <option value="1"'.(Configuration::get('PS_BLOCKLINK_ORDERWAY') ? 'selected="selected"' : '').'>'.$this->l('by oldest links').'</option> + </select> + </div> + <div class="margin-form"><input type="submit" class="button" name="submitOrderWay" value="'.$this->l('Update').'" /></div> + </form> + </fieldset>'; + } + + private function _list() + { + $links = $this->getLinks(); + + global $currentIndex, $cookie, $adminObj; + $languages = Language::getLanguages(); + if ($links) + { + $this->_html .= ' + <script type="text/javascript"> + var currentUrl = \''.$currentIndex.'&configure='.$this->name.'\'; + var token=\''.$adminObj->token.'\'; + var links = new Array();'; + foreach ($links AS $link) + { + $this->_html .= 'links['.$link['id'].'] = new Array(\''.addslashes($link['url']).'\', '.$link['newWindow']; + foreach ($languages AS $language) + if (isset($link['text_'.$language['id_lang']])) + $this->_html .= ', \''.addslashes($link['text_'.$language['id_lang']]).'\''; + else + $this->_html .= ', \'\''; + $this->_html .= ');'; + } + $this->_html .= '</script>'; + } + $this->_html .= ' + <h3 class="blue space">'.$this->l('Link list').'</h3> + <table class="table"> + <tr> + <th>'.$this->l('ID').'</th> + <th>'.$this->l('Text').'</th> + <th>'.$this->l('URL').'</th> + <th>'.$this->l('Actions').'</th> + </tr>'; + + if (!$links) + $this->_html .= ' + <tr> + <td colspan="3">'.$this->l('There are no links.').'</td> + </tr>'; + else + foreach ($links AS $link) + $this->_html .= ' + <tr> + <td>'.$link['id'].'</td> + <td>'.$link['text_'.$cookie->id_lang].'</td> + <td>'.$link['url'].'</td> + <td> + <img src="../img/admin/edit.gif" alt="" title="" onclick="linkEdition('.$link['id'].')" style="cursor: pointer" /> + <img src="../img/admin/delete.gif" alt="" title="" onclick="linkDeletion('.$link['id'].')" style="cursor: pointer" /> + </td> + </tr>'; + $this->_html .= ' + </table> + <input type="hidden" id="languageFirst" value="'.$languages[0]['id_lang'].'" /> + <input type="hidden" id="languageNb" value="'.sizeof($languages).'" />'; + } +} diff --git a/modules/blocklink/blocklink.tpl b/modules/blocklink/blocklink.tpl new file mode 100644 index 000000000..f4605eef7 --- /dev/null +++ b/modules/blocklink/blocklink.tpl @@ -0,0 +1,42 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block links module --> +<div id="links_block_left" class="block"> + <h4> + {if $url} + <a href="{$url}">{$title}</a> + {else} + {$title} + {/if} + </h4> + <ul class="block_content bullet"> + {foreach from=$blocklink_links item=blocklink_link} + <li><a href="{$blocklink_link.url|htmlentities}"{if $blocklink_link.newWindow} onclick="window.open(this.href);return false;"{/if}>{$blocklink_link.$lang}</a></li> + {/foreach} + </ul> +</div> +<!-- /Block links module --> diff --git a/modules/blocklink/config.xml b/modules/blocklink/config.xml new file mode 100755 index 000000000..a3132617b --- /dev/null +++ b/modules/blocklink/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocklink</name> + <displayName><![CDATA[Link block]]></displayName> + <version><![CDATA[1.4]]></version> + <description><![CDATA[Adds a block with additional links.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <confirmUninstall>Are you sure you want to delete all your links ?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocklink/de.php b/modules/blocklink/de.php new file mode 100644 index 000000000..02b78d398 --- /dev/null +++ b/modules/blocklink/de.php @@ -0,0 +1,43 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklink}prestashop>blocklink_fc738410141e4ec0c0319a81255a1431'] = 'Linkblock'; +$_MODULE['<{blocklink}prestashop>blocklink_baa2ae9622a47c3217d725d1537e5187'] = 'Fügt einen Block mit weiteren Links hinzu'; +$_MODULE['<{blocklink}prestashop>blocklink_d98d5daaf408b77b05a2eeb6ae88d6df'] = 'Sind Sie sicher, dass Sie alle Ihre Links löschen wollen?'; +$_MODULE['<{blocklink}prestashop>blocklink_fe3f38c46c80813d94b6775299e59f13'] = 'Sie müssen alle Felder ausfüllen'; +$_MODULE['<{blocklink}prestashop>blocklink_9394bb34611399534ffac4f0ece96b7f'] = 'Falsche URL'; +$_MODULE['<{blocklink}prestashop>blocklink_3da9d5745155a430aac6d7de3b6de0c8'] = 'Der Link ist erfolgreich hinzugefügt worden'; +$_MODULE['<{blocklink}prestashop>blocklink_898536ebd630aa3a9844e9cd9d1ebb9b'] = 'Ein Fehler ist bei der Link-Erstellung aufgetreten'; +$_MODULE['<{blocklink}prestashop>blocklink_ce9beec1b47458523d46274adfd2acee'] = 'Ein Fehler ist bei der Link-Aktualisierung aufgetreten'; +$_MODULE['<{blocklink}prestashop>blocklink_7a7e3a8d8aefcb1d31b4fdfa1bdf9ee4'] = 'Der Link ist erfolgreich aktualisiert worden'; +$_MODULE['<{blocklink}prestashop>blocklink_b18032737875f7947443c98824103a1f'] = 'Das Feld \"Titel\" darf nicht leer bleiben'; +$_MODULE['<{blocklink}prestashop>blocklink_43b38b9a2fe65059bed320bd284047e3'] = 'Das Feld \"Titel\" ist ungültig'; +$_MODULE['<{blocklink}prestashop>blocklink_eb74914f2759760be5c0a48f699f8541'] = 'Ein Fehler ist bei der Titel-Aktualisierung aufgetreten'; +$_MODULE['<{blocklink}prestashop>blocklink_5c0f7e2db8843204f422a369f2030b37'] = 'Der Blocktitel ist erfolgreich aktualisiert worden'; +$_MODULE['<{blocklink}prestashop>blocklink_5d73d4c0bcb035a1405e066eb0cdf832'] = 'Ein Fehler ist beim Löschen des Links aufgetreten'; +$_MODULE['<{blocklink}prestashop>blocklink_9bbcafcc85be214aaff76dffb8b72ce9'] = 'Der Link ist erfolgreich gelöscht worden'; +$_MODULE['<{blocklink}prestashop>blocklink_7e5748d8c44f33c9cde08ac2805e5621'] = 'Bestellungssortierung erfolgreich aktualisiert'; +$_MODULE['<{blocklink}prestashop>blocklink_46cff2568b00bc09d66844849d0b1309'] = 'Ein Fehler ist bei der Einstellung der Bestellungssortierung aufgetreten'; +$_MODULE['<{blocklink}prestashop>blocklink_58e9b25bb2e2699986a3abe2c92fc82e'] = 'Neuen Link hinzufügen'; +$_MODULE['<{blocklink}prestashop>blocklink_ed2fc2838f7edb7607dd1cd19f3a82e0'] = 'Text:'; +$_MODULE['<{blocklink}prestashop>blocklink_3b3d06023f6353f8fd05f859b298573e'] = 'URL:'; +$_MODULE['<{blocklink}prestashop>blocklink_1f3674ab0d54a38327e8e4a0d97788d4'] = 'In neuem Fenster öffnen:'; +$_MODULE['<{blocklink}prestashop>blocklink_7f3ee1818e42cfd668e361d89b8595fb'] = 'Diesen Link hinzufügen'; +$_MODULE['<{blocklink}prestashop>blocklink_27a5ff9957ea16466ef085b53381e26a'] = 'Diesen Link bearbeiten'; +$_MODULE['<{blocklink}prestashop>blocklink_b22c8f9ad7db023c548c3b8e846cb169'] = 'Blocktitel'; +$_MODULE['<{blocklink}prestashop>blocklink_2c906769e7f8b03cc1fedce4e24a20c2'] = 'Blocktitel:'; +$_MODULE['<{blocklink}prestashop>blocklink_67c94c1cba852f2d13eed115c938baf6'] = 'Block-URL:'; +$_MODULE['<{blocklink}prestashop>blocklink_06933067aafd48425d67bcb01bba5cb6'] = 'Aktualisierung'; +$_MODULE['<{blocklink}prestashop>blocklink_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blocklink}prestashop>blocklink_53db43446b84dd2e9ddac626fc02ead3'] = 'Bestellliste:'; +$_MODULE['<{blocklink}prestashop>blocklink_d36e9f57ea37903f81d28f7a189b9649'] = 'nach neuesten Links'; +$_MODULE['<{blocklink}prestashop>blocklink_6ccdff04699ffe6956a6b1465907414a'] = 'nach ältesten Links'; +$_MODULE['<{blocklink}prestashop>blocklink_387a8014f530f080bf2f3be723f8c164'] = 'Link-Liste'; +$_MODULE['<{blocklink}prestashop>blocklink_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blocklink}prestashop>blocklink_9dffbf69ffba8bc38bc4e01abf4b1675'] = 'Text'; +$_MODULE['<{blocklink}prestashop>blocklink_e6b391a8d2c4d45902a23a8b6585703d'] = 'URL'; +$_MODULE['<{blocklink}prestashop>blocklink_06df33001c1d7187fdd81ea1f5b277aa'] = 'Handlungen'; +$_MODULE['<{blocklink}prestashop>blocklink_cad0a4e92b29bcb1ff1fc4f8524cfdc2'] = 'Es sind noch keine Links vorhanden'; + +?> \ No newline at end of file diff --git a/modules/blocklink/en.php b/modules/blocklink/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocklink/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocklink/es.php b/modules/blocklink/es.php new file mode 100644 index 000000000..c91e73cfb --- /dev/null +++ b/modules/blocklink/es.php @@ -0,0 +1,41 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklink}prestashop>blocklink_fc738410141e4ec0c0319a81255a1431'] = 'Bloque de enlaces'; +$_MODULE['<{blocklink}prestashop>blocklink_baa2ae9622a47c3217d725d1537e5187'] = 'Añadir un bloque con enlaces adicionales'; +$_MODULE['<{blocklink}prestashop>blocklink_d98d5daaf408b77b05a2eeb6ae88d6df'] = '¿Está seguro de querer borrar todos sus enlaces?'; +$_MODULE['<{blocklink}prestashop>blocklink_fe3f38c46c80813d94b6775299e59f13'] = 'Debe rellenar todos los campos'; +$_MODULE['<{blocklink}prestashop>blocklink_9394bb34611399534ffac4f0ece96b7f'] = 'URL incorrecta'; +$_MODULE['<{blocklink}prestashop>blocklink_3da9d5745155a430aac6d7de3b6de0c8'] = 'En enlace se ha añadido con éxito'; +$_MODULE['<{blocklink}prestashop>blocklink_898536ebd630aa3a9844e9cd9d1ebb9b'] = 'Se ha producido un error durante el proceso de creación del enlace'; +$_MODULE['<{blocklink}prestashop>blocklink_ce9beec1b47458523d46274adfd2acee'] = 'Se ha producido un error durante el proceso de actualización del enlace'; +$_MODULE['<{blocklink}prestashop>blocklink_7a7e3a8d8aefcb1d31b4fdfa1bdf9ee4'] = 'El enlace se ha actualizado con éxito'; +$_MODULE['<{blocklink}prestashop>blocklink_b18032737875f7947443c98824103a1f'] = 'El campo \"título\" no puede estar vacío'; +$_MODULE['<{blocklink}prestashop>blocklink_43b38b9a2fe65059bed320bd284047e3'] = 'El campo \"título\" es incorrecto'; +$_MODULE['<{blocklink}prestashop>blocklink_eb74914f2759760be5c0a48f699f8541'] = 'Se ha producido un error durante la actualización del título'; +$_MODULE['<{blocklink}prestashop>blocklink_5c0f7e2db8843204f422a369f2030b37'] = 'El título del bloque se ha actualizado con éxito'; +$_MODULE['<{blocklink}prestashop>blocklink_5d73d4c0bcb035a1405e066eb0cdf832'] = 'Se ha producido un error mientras se borraba el enlace'; +$_MODULE['<{blocklink}prestashop>blocklink_9bbcafcc85be214aaff76dffb8b72ce9'] = 'El enlace se ha eliminado correctamente'; +$_MODULE['<{blocklink}prestashop>blocklink_7e5748d8c44f33c9cde08ac2805e5621'] = 'Actualización correcta de la reordenación'; +$_MODULE['<{blocklink}prestashop>blocklink_46cff2568b00bc09d66844849d0b1309'] = 'Se ha producido un error durante el proceso de configuración de la reordenación'; +$_MODULE['<{blocklink}prestashop>blocklink_58e9b25bb2e2699986a3abe2c92fc82e'] = 'Añadir un nuevo enlace'; +$_MODULE['<{blocklink}prestashop>blocklink_ed2fc2838f7edb7607dd1cd19f3a82e0'] = 'Texto:'; +$_MODULE['<{blocklink}prestashop>blocklink_3b3d06023f6353f8fd05f859b298573e'] = 'URL:'; +$_MODULE['<{blocklink}prestashop>blocklink_1f3674ab0d54a38327e8e4a0d97788d4'] = 'Abrir en una nueva ventana:'; +$_MODULE['<{blocklink}prestashop>blocklink_7f3ee1818e42cfd668e361d89b8595fb'] = 'A~ãdir este enlace'; +$_MODULE['<{blocklink}prestashop>blocklink_27a5ff9957ea16466ef085b53381e26a'] = 'Editar este enlace'; +$_MODULE['<{blocklink}prestashop>blocklink_b22c8f9ad7db023c548c3b8e846cb169'] = 'Título del bloque'; +$_MODULE['<{blocklink}prestashop>blocklink_2c906769e7f8b03cc1fedce4e24a20c2'] = 'Título del bloque:'; +$_MODULE['<{blocklink}prestashop>blocklink_67c94c1cba852f2d13eed115c938baf6'] = 'URL del bloque:'; +$_MODULE['<{blocklink}prestashop>blocklink_06933067aafd48425d67bcb01bba5cb6'] = 'Actualizar'; +$_MODULE['<{blocklink}prestashop>blocklink_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blocklink}prestashop>blocklink_53db43446b84dd2e9ddac626fc02ead3'] = 'Orden:'; +$_MODULE['<{blocklink}prestashop>blocklink_d36e9f57ea37903f81d28f7a189b9649'] = 'por enlaces más recientes'; +$_MODULE['<{blocklink}prestashop>blocklink_6ccdff04699ffe6956a6b1465907414a'] = 'por enlaces más antiguos'; +$_MODULE['<{blocklink}prestashop>blocklink_387a8014f530f080bf2f3be723f8c164'] = 'Lista de enlaces'; +$_MODULE['<{blocklink}prestashop>blocklink_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blocklink}prestashop>blocklink_9dffbf69ffba8bc38bc4e01abf4b1675'] = 'Texto'; +$_MODULE['<{blocklink}prestashop>blocklink_e6b391a8d2c4d45902a23a8b6585703d'] = 'URL'; +$_MODULE['<{blocklink}prestashop>blocklink_06df33001c1d7187fdd81ea1f5b277aa'] = 'Acciones'; +$_MODULE['<{blocklink}prestashop>blocklink_cad0a4e92b29bcb1ff1fc4f8524cfdc2'] = 'Aún no hay enlaces'; diff --git a/modules/blocklink/fr.php b/modules/blocklink/fr.php new file mode 100644 index 000000000..4fbd37b7a --- /dev/null +++ b/modules/blocklink/fr.php @@ -0,0 +1,41 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklink}prestashop>blocklink_fc738410141e4ec0c0319a81255a1431'] = 'Bloc liens'; +$_MODULE['<{blocklink}prestashop>blocklink_baa2ae9622a47c3217d725d1537e5187'] = 'Ajoute un bloc avec des liens additionels'; +$_MODULE['<{blocklink}prestashop>blocklink_d98d5daaf408b77b05a2eeb6ae88d6df'] = 'Etes-vous sûr de vouloir supprimer tous vos liens ?'; +$_MODULE['<{blocklink}prestashop>blocklink_fe3f38c46c80813d94b6775299e59f13'] = 'Vous devez remplir l\'ensemble des champs'; +$_MODULE['<{blocklink}prestashop>blocklink_9394bb34611399534ffac4f0ece96b7f'] = 'Mauvaise URL'; +$_MODULE['<{blocklink}prestashop>blocklink_3da9d5745155a430aac6d7de3b6de0c8'] = 'Le lien a été ajouté avec succès'; +$_MODULE['<{blocklink}prestashop>blocklink_898536ebd630aa3a9844e9cd9d1ebb9b'] = 'Une erreur est survenue lors de la création du lien'; +$_MODULE['<{blocklink}prestashop>blocklink_ce9beec1b47458523d46274adfd2acee'] = 'Une erreur est survenue lors de la mise à jour du lien'; +$_MODULE['<{blocklink}prestashop>blocklink_7a7e3a8d8aefcb1d31b4fdfa1bdf9ee4'] = 'Le lien a été mis à jour avec succès'; +$_MODULE['<{blocklink}prestashop>blocklink_b18032737875f7947443c98824103a1f'] = 'Le champ \"titre\" ne peut être laissé vide.'; +$_MODULE['<{blocklink}prestashop>blocklink_43b38b9a2fe65059bed320bd284047e3'] = 'Le titre est invalide'; +$_MODULE['<{blocklink}prestashop>blocklink_eb74914f2759760be5c0a48f699f8541'] = 'Une erreur est survenue lors de la mise à jour du titre'; +$_MODULE['<{blocklink}prestashop>blocklink_5c0f7e2db8843204f422a369f2030b37'] = 'Le titre du bloc a été mis à jour avec succès'; +$_MODULE['<{blocklink}prestashop>blocklink_5d73d4c0bcb035a1405e066eb0cdf832'] = 'Une erreur est survenue lors de la suppression du lien'; +$_MODULE['<{blocklink}prestashop>blocklink_9bbcafcc85be214aaff76dffb8b72ce9'] = 'Le lien a été supprimé avec succès'; +$_MODULE['<{blocklink}prestashop>blocklink_7e5748d8c44f33c9cde08ac2805e5621'] = 'Ordre de tri mis à jour avec succès'; +$_MODULE['<{blocklink}prestashop>blocklink_46cff2568b00bc09d66844849d0b1309'] = 'Une erreur est survenue lors du changement de l\'ordre de tri'; +$_MODULE['<{blocklink}prestashop>blocklink_58e9b25bb2e2699986a3abe2c92fc82e'] = 'Ajouter un nouveau lien'; +$_MODULE['<{blocklink}prestashop>blocklink_ed2fc2838f7edb7607dd1cd19f3a82e0'] = 'Texte :'; +$_MODULE['<{blocklink}prestashop>blocklink_3b3d06023f6353f8fd05f859b298573e'] = 'URL :'; +$_MODULE['<{blocklink}prestashop>blocklink_1f3674ab0d54a38327e8e4a0d97788d4'] = 'Ouvrir nouvelle fenêtre :'; +$_MODULE['<{blocklink}prestashop>blocklink_7f3ee1818e42cfd668e361d89b8595fb'] = 'Ajouter ce lien'; +$_MODULE['<{blocklink}prestashop>blocklink_27a5ff9957ea16466ef085b53381e26a'] = 'Editer ce lien'; +$_MODULE['<{blocklink}prestashop>blocklink_b22c8f9ad7db023c548c3b8e846cb169'] = 'Titre du bloc'; +$_MODULE['<{blocklink}prestashop>blocklink_2c906769e7f8b03cc1fedce4e24a20c2'] = 'Titre du bloc :'; +$_MODULE['<{blocklink}prestashop>blocklink_67c94c1cba852f2d13eed115c938baf6'] = 'URL du bloc :'; +$_MODULE['<{blocklink}prestashop>blocklink_06933067aafd48425d67bcb01bba5cb6'] = 'Mettre à jour'; +$_MODULE['<{blocklink}prestashop>blocklink_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{blocklink}prestashop>blocklink_53db43446b84dd2e9ddac626fc02ead3'] = 'Trier la liste :'; +$_MODULE['<{blocklink}prestashop>blocklink_d36e9f57ea37903f81d28f7a189b9649'] = 'par liens les plus récents'; +$_MODULE['<{blocklink}prestashop>blocklink_6ccdff04699ffe6956a6b1465907414a'] = 'les premiers liens entrés'; +$_MODULE['<{blocklink}prestashop>blocklink_387a8014f530f080bf2f3be723f8c164'] = 'Liste de liens'; +$_MODULE['<{blocklink}prestashop>blocklink_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blocklink}prestashop>blocklink_9dffbf69ffba8bc38bc4e01abf4b1675'] = 'Texte'; +$_MODULE['<{blocklink}prestashop>blocklink_e6b391a8d2c4d45902a23a8b6585703d'] = 'URL'; +$_MODULE['<{blocklink}prestashop>blocklink_06df33001c1d7187fdd81ea1f5b277aa'] = 'Actions'; +$_MODULE['<{blocklink}prestashop>blocklink_cad0a4e92b29bcb1ff1fc4f8524cfdc2'] = 'Il n\'y a pas encore de liens'; diff --git a/modules/blocklink/it.php b/modules/blocklink/it.php new file mode 100644 index 000000000..b5d6c5587 --- /dev/null +++ b/modules/blocklink/it.php @@ -0,0 +1,43 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocklink}prestashop>blocklink_fc738410141e4ec0c0319a81255a1431'] = 'Blocco link '; +$_MODULE['<{blocklink}prestashop>blocklink_baa2ae9622a47c3217d725d1537e5187'] = 'Aggiunge un blocco con ulteriori link'; +$_MODULE['<{blocklink}prestashop>blocklink_d98d5daaf408b77b05a2eeb6ae88d6df'] = 'Sei sicuro di voler eliminare tutti i link?'; +$_MODULE['<{blocklink}prestashop>blocklink_fe3f38c46c80813d94b6775299e59f13'] = 'Devi compilare tutti i campi'; +$_MODULE['<{blocklink}prestashop>blocklink_9394bb34611399534ffac4f0ece96b7f'] = 'Cattivo URL '; +$_MODULE['<{blocklink}prestashop>blocklink_3da9d5745155a430aac6d7de3b6de0c8'] = 'Il link è stato aggiunto con successo'; +$_MODULE['<{blocklink}prestashop>blocklink_898536ebd630aa3a9844e9cd9d1ebb9b'] = 'Si è verificato un errore durante la creazione del link'; +$_MODULE['<{blocklink}prestashop>blocklink_ce9beec1b47458523d46274adfd2acee'] = 'È verificato un errore durante l\'aggiornamento del link'; +$_MODULE['<{blocklink}prestashop>blocklink_7a7e3a8d8aefcb1d31b4fdfa1bdf9ee4'] = 'Il link è stato aggiornato con successo'; +$_MODULE['<{blocklink}prestashop>blocklink_b18032737875f7947443c98824103a1f'] = 'Il campo \"titolo\" non può essere vuoto'; +$_MODULE['<{blocklink}prestashop>blocklink_43b38b9a2fe65059bed320bd284047e3'] = 'Il campo \'titolo\' non è valido'; +$_MODULE['<{blocklink}prestashop>blocklink_eb74914f2759760be5c0a48f699f8541'] = 'Si è verificato un errore durante l\'aggiornamento del titolo'; +$_MODULE['<{blocklink}prestashop>blocklink_5c0f7e2db8843204f422a369f2030b37'] = 'Il titolo del blocco è stato aggiornato con successo'; +$_MODULE['<{blocklink}prestashop>blocklink_5d73d4c0bcb035a1405e066eb0cdf832'] = 'Si è verificato un errore durante la cancellazione link'; +$_MODULE['<{blocklink}prestashop>blocklink_9bbcafcc85be214aaff76dffb8b72ce9'] = 'Il link è stato cancellato con successo'; +$_MODULE['<{blocklink}prestashop>blocklink_7e5748d8c44f33c9cde08ac2805e5621'] = 'Ordine di selezione aggiornato con successo'; +$_MODULE['<{blocklink}prestashop>blocklink_46cff2568b00bc09d66844849d0b1309'] = 'Si è verificato un errore durante l\'impostazione dell\'ordine di selezione'; +$_MODULE['<{blocklink}prestashop>blocklink_58e9b25bb2e2699986a3abe2c92fc82e'] = 'Aggiungi un nuovo link'; +$_MODULE['<{blocklink}prestashop>blocklink_ed2fc2838f7edb7607dd1cd19f3a82e0'] = 'Testo:'; +$_MODULE['<{blocklink}prestashop>blocklink_3b3d06023f6353f8fd05f859b298573e'] = 'URL:'; +$_MODULE['<{blocklink}prestashop>blocklink_1f3674ab0d54a38327e8e4a0d97788d4'] = 'Apri in una nuova finestra:'; +$_MODULE['<{blocklink}prestashop>blocklink_7f3ee1818e42cfd668e361d89b8595fb'] = 'Aggiungi questo link'; +$_MODULE['<{blocklink}prestashop>blocklink_27a5ff9957ea16466ef085b53381e26a'] = 'Modifica questo link'; +$_MODULE['<{blocklink}prestashop>blocklink_b22c8f9ad7db023c548c3b8e846cb169'] = 'Titolo del blocco'; +$_MODULE['<{blocklink}prestashop>blocklink_2c906769e7f8b03cc1fedce4e24a20c2'] = 'Titolo del blocco:'; +$_MODULE['<{blocklink}prestashop>blocklink_67c94c1cba852f2d13eed115c938baf6'] = 'URL del blocco:'; +$_MODULE['<{blocklink}prestashop>blocklink_06933067aafd48425d67bcb01bba5cb6'] = 'Aggiornamento'; +$_MODULE['<{blocklink}prestashop>blocklink_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blocklink}prestashop>blocklink_53db43446b84dd2e9ddac626fc02ead3'] = 'Ordinare l\'elenco:'; +$_MODULE['<{blocklink}prestashop>blocklink_d36e9f57ea37903f81d28f7a189b9649'] = 'per link più recenti'; +$_MODULE['<{blocklink}prestashop>blocklink_6ccdff04699ffe6956a6b1465907414a'] = 'per link più vecchi'; +$_MODULE['<{blocklink}prestashop>blocklink_387a8014f530f080bf2f3be723f8c164'] = 'Elenco link'; +$_MODULE['<{blocklink}prestashop>blocklink_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{blocklink}prestashop>blocklink_9dffbf69ffba8bc38bc4e01abf4b1675'] = 'Testo'; +$_MODULE['<{blocklink}prestashop>blocklink_e6b391a8d2c4d45902a23a8b6585703d'] = 'URL'; +$_MODULE['<{blocklink}prestashop>blocklink_06df33001c1d7187fdd81ea1f5b277aa'] = 'Azioni'; +$_MODULE['<{blocklink}prestashop>blocklink_cad0a4e92b29bcb1ff1fc4f8524cfdc2'] = 'Non ci sono ancora link'; + +?> \ No newline at end of file diff --git a/modules/blocklink/logo.gif b/modules/blocklink/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ea90ffbe20507136279458ce62a4c69b59bf33a GIT binary patch literal 1067 zcmd7R`CFO=0KoCrXa2zQ*)y9xWv!W8&x)SWp2xO4rk0A5N9L^DVe`NPOvMXwX-xse z3mITc#gijE&;|&2j8_Ea3%+t+;x#;`PaDm&_4GU)Kh(4TqVHeu`Q`gb3MMiN8wdmf ztpE`6-LZEX5mAj1NQys_eBuJ-B#IJrxh)`~?RYdjFq#_iaZ3!E`6`APoWg!Hp))qK z=iK#P<X8Rg<qluD#f!lXh7}Hn6%U8u`5zVuqRWI4C8IF};gw2JESeUVL`z6+Ps->@ z%NR(`<D;*FH}j-f*q*$y;gSL&1}91`5n=Gc?6QSC(nQAhlB`m3QTaq+&3FY#Tva_^ zaa&bM0>5rh5z{@z>1((gXE}bOmauWV8Y-%RiivtWNss?_kx;ipxC2)=z{Kj!`a5<a z9s~)~>MywZYXZ|P5tKV>$QfJCl{#@U6HZ|!$PEOgxqMz%0qQH}tmSrAmA;wirB<)> z<*$x3=)iir<Qv%dPx>B3o=uixsY*O;8b_NhZJ#Z>`=GLAriwgQM^iVlKoVI~$I#TW z4fPC|#$0agv{0K?DcxFfkB-WQTYGg)Lr~iw)X#D?-LrT0IG9`qYry%#fRod=#c4Jw z$+j{2`fSJM!k|t*pq(FlsAl*E`}P-xwn4tWgKy~gaj8wT#27QO#+O-QBl{;ahv#V( ztab`*Y>B5!YU!4HxJqyDq-R9po}V@=6kZ;<%9lB$QqMf-oD=N!j~>b<kCdt%k>XHE zH9ownh3QKkhSg0suCdG;_nhkkt7|-mhHtZsZkfckMah;`;Bt*@xF@`uigifoT^aus zo;lE}x1pKGu9*XuZbM{va^L*3#PV2X*_*OHm70E0ntTtOKBeQC{L!I$^GLn41ugFy z3_cs|vs<6qZ2M;WzQuW9aUZ(Z4_qtH4c_OP-QP7&{xAdogU<fte+&R}0MrZ1izfiY zzkmwyYzk#%y%kH{j0%_T42AHikNP0^R6zI%)hy-m!A<#fMZT=&e5*b#mMMrQj-a|x zUy71*vI|E7E`>M}DO0qxEHU!x-$y&=1wlipnvdM6IG-!%?Hl(4+d0S<7Ip}+pMZgm zzjh|FVo%Dy(9A5TtbL^vN?aaBoxaE-@07)#EJzXuXFL31&ik)}i8t(NeyqG&fRXB; z9BX;$;v32m9*jPn!kzpxQ-JLfV(7Ne&ncQ_*(qJADY8KOGB*sXCUeo)xSmU;NRj;< zg)Kmn78g@8^S9|AsIJ9VX+pLBkw`=l=QrMGq47=OXM(Yz!njZ0jYA*;kIn+*7C%2A F`aiBp`-A`h literal 0 HcmV?d00001 diff --git a/modules/blocklink/prefs.gif b/modules/blocklink/prefs.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a1f43562f26ba1c172ff8f19febdf520f899ea1 GIT binary patch literal 351 zcmZ?wbhEHb6krfwxXQrL*4FmFMq&T{{r~s$EMLC-|LXkf*RQ{u8TWfZ;{WLZ|IaR) zJbCi-=g<F7@i=<)=>M(N{|`;yvSrK6nKSR+y?f@&neSVh-@SYHe@;+$clYYmt3NHv z`@cNv|NhDUkIeetpz(ih#Q$?^|1V4ZzqRTA`m+E3|1(e<DE?$&WM@!e&;c0?@)HAF zjl-k@3zHNTp+!L%6AW~^ml_>Ta9MO|;p9n*iTiFIJ>sa4!o%<~C9#0xUXw~-V5Egc z-yVhsGrC=**aR6`%8L29xLDaG#Dcgwn3-icIQl2@^UKP!dUGjrF)J$x$V&%_FI+4j fzC4ImwqAf!F;YcQQDF1dZ7Q5{jMMfyGFSruy83zV literal 0 HcmV?d00001 diff --git a/modules/blockmanufacturer/blockmanufacturer.php b/modules/blockmanufacturer/blockmanufacturer.php new file mode 100644 index 000000000..b85d682c5 --- /dev/null +++ b/modules/blockmanufacturer/blockmanufacturer.php @@ -0,0 +1,133 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockManufacturer extends Module +{ + function __construct() + { + $this->name = 'blockmanufacturer'; + $this->tab = 'front_office_features'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Manufacturers block'); + $this->description = $this->l('Displays a block of manufacturers/brands'); + } + + function install() + { + Configuration::updateValue('MANUFACTURER_DISPLAY_TEXT', true); + Configuration::updateValue('MANUFACTURER_DISPLAY_TEXT_NB', 5); + Configuration::updateValue('MANUFACTURER_DISPLAY_FORM', true); + return (parent::install() AND $this->registerHook('leftColumn') AND $this->registerHook('header')); + } + + function hookLeftColumn($params) + { + global $smarty, $link; + //$getNbProducts = false, $id_lang = 0, $active = true, $p = false, $n = false, $all_group = false, $id_shop = false + $smarty->assign(array( + 'manufacturers' => Manufacturer::getManufacturers(false, 0, true, false, false, false, $this->shopGroupID), + 'link' => $link, + 'text_list' => Configuration::get('MANUFACTURER_DISPLAY_TEXT'), + 'text_list_nb' => Configuration::get('MANUFACTURER_DISPLAY_TEXT_NB'), + 'form_list' => Configuration::get('MANUFACTURER_DISPLAY_FORM'), + 'display_link_manufacturer' => Configuration::get('PS_DISPLAY_SUPPLIERS'), + )); + return $this->display(__FILE__, 'blockmanufacturer.tpl'); + } + + function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockManufacturers')) + { + $text_list = (int)(Tools::getValue('text_list')); + $text_nb = (int)(Tools::getValue('text_nb')); + $form_list = (int)(Tools::getValue('form_list')); + if ($text_list AND !Validate::isUnsignedInt($text_nb)) + $errors[] = $this->l('Invalid number of elements'); + elseif (!$text_list AND !$form_list) + $errors[] = $this->l('Please activate at least one system list'); + else + { + Configuration::updateValue('MANUFACTURER_DISPLAY_TEXT', $text_list); + Configuration::updateValue('MANUFACTURER_DISPLAY_TEXT_NB', $text_nb); + Configuration::updateValue('MANUFACTURER_DISPLAY_FORM', $form_list); + } + if (isset($errors) AND sizeof($errors)) + $output .= $this->displayError(implode('<br />', $errors)); + else + $output .= $this->displayConfirmation($this->l('Settings updated')); + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Use a plain-text list').'</label> + <div class="margin-form"> + <input type="radio" name="text_list" id="text_list_on" value="1" '.(Tools::getValue('text_list', Configuration::get('MANUFACTURER_DISPLAY_TEXT')) ? 'checked="checked" ' : '').'/> + <label class="t" for="text_list_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="text_list" id="text_list_off" value="0" '.(!Tools::getValue('text_list', Configuration::get('MANUFACTURER_DISPLAY_TEXT')) ? 'checked="checked" ' : '').'/> + <label class="t" for="text_list_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + &nbsp;&nbsp;&nbsp;'.$this->l('Display').' <input type="text" size="2" name="text_nb" value="'.(int)(Tools::getValue('text_nb', Configuration::get('MANUFACTURER_DISPLAY_TEXT_NB'))).'" /> '.$this->l('elements').' + <p class="clear">'.$this->l('To display manufacturers in a plain-text list').'</p> + </div> + <label>'.$this->l('Use a drop-down list').'</label> + <div class="margin-form"> + <input type="radio" name="form_list" id="form_list_on" value="1" '.(Tools::getValue('form_list', Configuration::get('MANUFACTURER_DISPLAY_FORM')) ? 'checked="checked" ' : '').'/> + <label class="t" for="form_list_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="form_list" id="form_list_off" value="0" '.(!Tools::getValue('form_list', Configuration::get('MANUFACTURER_DISPLAY_FORM')) ? 'checked="checked" ' : '').'/> + <label class="t" for="form_list_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('To display manufacturers in a drop-down list').'</p> + </div> + <center><input type="submit" name="submitBlockManufacturers" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockmanufacturer.css', 'all'); + } +} diff --git a/modules/blockmanufacturer/blockmanufacturer.tpl b/modules/blockmanufacturer/blockmanufacturer.tpl new file mode 100644 index 000000000..7e705bb57 --- /dev/null +++ b/modules/blockmanufacturer/blockmanufacturer.tpl @@ -0,0 +1,58 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block manufacturers module --> +<div id="manufacturers_block_left" class="block blockmanufacturer"> + <h4>{if $display_link_manufacturer}<a href="{$link->getPageLink('manufacturer')}" title="{l s='Manufacturers' mod='blockmanufacturer'}">{/if}{l s='Manufacturers' mod='blockmanufacturer'}{if $display_link_manufacturer}</a>{/if}</h4> + <div class="block_content"> +{if $manufacturers} + {if $text_list} + <ul class="bullet"> + {foreach from=$manufacturers item=manufacturer name=manufacturer_list} + {if $smarty.foreach.manufacturer_list.iteration <= $text_list_nb} + <li class="{if $smarty.foreach.manufacturer_list.last}last_item{elseif $smarty.foreach.manufacturer_list.first}first_item{else}item{/if}"><a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)}" title="{l s='More about' mod='blockmanufacturer'} {$manufacturer.name}">{$manufacturer.name|escape:'htmlall':'UTF-8'}</a></li> + {/if} + {/foreach} + </ul> + {/if} + {if $form_list} + <form action="{$smarty.server.SCRIPT_NAME}" method="get"> + <p> + <select id="manufacturer_list" onchange="autoUrl('manufacturer_list', '');"> + <option value="0">{l s='All manufacturers' mod='blockmanufacturer'}</option> + {foreach from=$manufacturers item=manufacturer} + <option value="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)}">{$manufacturer.name|escape:'htmlall':'UTF-8'}</option> + {/foreach} + </select> + </p> + </form> + {/if} +{else} + <p>{l s='No manufacturer' mod='blockmanufacturer'}</p> +{/if} + </div> +</div> +<!-- /Block manufacturers module --> diff --git a/modules/blockmanufacturer/config.xml b/modules/blockmanufacturer/config.xml new file mode 100755 index 000000000..cbe538c15 --- /dev/null +++ b/modules/blockmanufacturer/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockmanufacturer</name> + <displayName><![CDATA[Manufacturers block]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Displays a block of manufacturers/brands]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockmanufacturer/de.php b/modules/blockmanufacturer/de.php new file mode 100644 index 000000000..7dcd6a5a2 --- /dev/null +++ b/modules/blockmanufacturer/de.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2377be3c2ad9b435ba277a73f0f1ca76'] = 'Hersteller'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_49fa2426b7903b3d4c89e2c1874d9346'] = 'Mehr darüber'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bf24faeb13210b5a703f3ccef792b000'] = 'Alle Hersteller'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_1c407c118b89fa6feaae6b0af5fc0970'] = 'Kein Hersteller'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bc3e73cfa718a3237fb1d7e1da491395'] = 'Herstellerblock'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_9859921e6d3733788e09599adb681dcd'] = 'Zeigt einen Hersteller-/ Markenblock an'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'Ungültige Elementezahl'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bb30aac3161f999a357af767ce2fd7ec'] = 'Bitte aktivieren Sie mindestens eine Systemliste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c888438d14855d7d96a2724ee9c306bd'] = 'Aktualisierte Einstellungen'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bfdff752293014f11f17122c92909ad5'] = 'Benutzen Sie eine Nur-Text-Liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Anzeige'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_6a7f245843454cf4f28ad7c5e2572aa2'] = 'Elemente'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2e5acd674f7f821a81e99ed01d5305d1'] = 'So zeigen Hersteller in einer Nur-Text-Liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b0fa976774d2acf72f9c62e9ab73de38'] = 'Verwenden Sie eine Dropdown-Liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f68d82d608d94a571e0984a0288595e0'] = 'So zeigen Sie Hersteller in einem Dropdown-Liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockmanufacturer/en.php b/modules/blockmanufacturer/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockmanufacturer/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockmanufacturer/es.php b/modules/blockmanufacturer/es.php new file mode 100644 index 000000000..9d718dc92 --- /dev/null +++ b/modules/blockmanufacturer/es.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bc3e73cfa718a3237fb1d7e1da491395'] = 'Bloque de marcas'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_9859921e6d3733788e09599adb681dcd'] = 'Mostrar bloque de marcas'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'Número de elementos incorrecto'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bb30aac3161f999a357af767ce2fd7ec'] = 'Por favor, active al menos uno de la lista'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bfdff752293014f11f17122c92909ad5'] = 'Use una lista de texto plano'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Mostrar'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_6a7f245843454cf4f28ad7c5e2572aa2'] = 'elementos'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2e5acd674f7f821a81e99ed01d5305d1'] = 'Para mostrar marcas en une lista de texto plano'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b0fa976774d2acf72f9c62e9ab73de38'] = 'use un cuadro combinado'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f68d82d608d94a571e0984a0288595e0'] = 'Para mostrar las marcas dentro de un cuadro combinado'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2377be3c2ad9b435ba277a73f0f1ca76'] = 'Marcas'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_49fa2426b7903b3d4c89e2c1874d9346'] = 'más sobre'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bf24faeb13210b5a703f3ccef792b000'] = 'Todas las marcas'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_1c407c118b89fa6feaae6b0af5fc0970'] = 'Sin marcas'; diff --git a/modules/blockmanufacturer/fr.php b/modules/blockmanufacturer/fr.php new file mode 100644 index 000000000..b95e243cd --- /dev/null +++ b/modules/blockmanufacturer/fr.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bc3e73cfa718a3237fb1d7e1da491395'] = 'Bloc fabricant'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_9859921e6d3733788e09599adb681dcd'] = 'Ajoute un bloc avec les fabricants'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'Nombre d\'éléments invalide'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bb30aac3161f999a357af767ce2fd7ec'] = 'Merci d\'activer au moins un affichage de liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bfdff752293014f11f17122c92909ad5'] = 'Utiliser une liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Afficher'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_6a7f245843454cf4f28ad7c5e2572aa2'] = 'éléments'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2e5acd674f7f821a81e99ed01d5305d1'] = 'Affiche les fabricants sous forme de liste'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b0fa976774d2acf72f9c62e9ab73de38'] = 'Utiliser un menu déroulant'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f68d82d608d94a571e0984a0288595e0'] = 'Affiche les fabricants dans un menu déroulant'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2377be3c2ad9b435ba277a73f0f1ca76'] = 'Fabricants'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_49fa2426b7903b3d4c89e2c1874d9346'] = 'En savoir plus à propos de'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bf24faeb13210b5a703f3ccef792b000'] = 'Tous les fabricants'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_1c407c118b89fa6feaae6b0af5fc0970'] = 'Aucun fabricant'; diff --git a/modules/blockmanufacturer/it.php b/modules/blockmanufacturer/it.php new file mode 100644 index 000000000..1f6e61c7a --- /dev/null +++ b/modules/blockmanufacturer/it.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2377be3c2ad9b435ba277a73f0f1ca76'] = 'Produttori'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_49fa2426b7903b3d4c89e2c1874d9346'] = 'Maggiori informazioni su'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bf24faeb13210b5a703f3ccef792b000'] = 'Tutti i produttori'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_1c407c118b89fa6feaae6b0af5fc0970'] = 'Nessun produttore'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bc3e73cfa718a3237fb1d7e1da491395'] = 'Blocco produttori '; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_9859921e6d3733788e09599adb681dcd'] = 'Visualizza un blocco di produttori / marche'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'Numero di elementi non valido'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bb30aac3161f999a357af767ce2fd7ec'] = 'Attiva almeno un elenco di sistema'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_bfdff752293014f11f17122c92909ad5'] = 'Utilizzare un elenco'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Visualizza'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_6a7f245843454cf4f28ad7c5e2572aa2'] = 'elementi'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_2e5acd674f7f821a81e99ed01d5305d1'] = 'Per visualizzare i produttori in un elenco '; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_b0fa976774d2acf72f9c62e9ab73de38'] = 'Utilizza un elenco a cascata'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_f68d82d608d94a571e0984a0288595e0'] = 'Per visualizzare i produttori in un elenco a cascata'; +$_MODULE['<{blockmanufacturer}prestashop>blockmanufacturer_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockmanufacturer/logo.gif b/modules/blockmanufacturer/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..659aace81c639dac0e3905c1a6d792c94051c20a GIT binary patch literal 280 zcmZ?wbhEHb6krfwIKsf-=jV6k%$dD=_by$!w56rx-o1Op#l_E_J=?Nn%gmWGv$M00 z9zFX0{rhXzuBD}=O`be?_3G8%zkjc(sp;zKVju!2{$ycfXAor20jUMq$-p`_L8Z^< zvP|+Sw&RT*Jyk4@TSSg_^PH{_={e+-(Bu%&5%;9P*wWXeGa)470!wF0!bS%l<!h~? z-H&yd`rVTXH?Xm>USu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/modules/blockmyaccount/blockmyaccount.php b/modules/blockmyaccount/blockmyaccount.php new file mode 100644 index 000000000..05484f3ae --- /dev/null +++ b/modules/blockmyaccount/blockmyaccount.php @@ -0,0 +1,93 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockMyAccount extends Module +{ + public function __construct() + { + $this->name = 'blockmyaccount'; + $this->tab = 'front_office_features'; + $this->version = '1.2'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('My Account block'); + $this->description = $this->l('Displays a block with links relative to user account.'); + } + + public function install() + { + if (!$this->addMyAccountBlockHook() OR !parent::install() OR !$this->registerHook('leftColumn') OR !$this->registerHook('header')) + return false; + return true; + } + + public function uninstall() + { + return (parent::uninstall() AND $this->removeMyAccountBlockHook()); + } + + public function hookLeftColumn($params) + { + global $smarty; + + if (!$params['cookie']->isLogged()) + return false; + $smarty->assign(array( + 'voucherAllowed' => (int)(Configuration::get('PS_VOUCHERS')), + 'returnAllowed' => (int)(Configuration::get('PS_ORDER_RETURN')), + 'HOOK_BLOCK_MY_ACCOUNT' => Module::hookExec('myAccountBlock') + )); + return $this->display(__FILE__, $this->name.'.tpl'); + } + + public function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + private function addMyAccountBlockHook() + { + return Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'hook` (`name`, `title`, `description`, `position`) VALUES (\'myAccountBlock\', \'My account block\', \'Display extra informations inside the "my account" block\', 1)'); + } + + private function removeMyAccountBlockHook() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'hook` WHERE `name` = \'myAccountBlock\''); + } + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockmyaccount.css', 'all'); + } +} + + diff --git a/modules/blockmyaccount/blockmyaccount.tpl b/modules/blockmyaccount/blockmyaccount.tpl new file mode 100644 index 000000000..82db21c5e --- /dev/null +++ b/modules/blockmyaccount/blockmyaccount.tpl @@ -0,0 +1,43 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block myaccount module --> +<div class="block myaccount"> + <h4><a href="{$link->getPageLink('my-account', true)}">{l s='My account' mod='blockmyaccount'}</a></h4> + <div class="block_content"> + <ul class="bullet"> + <li><a href="{$link->getPageLink('history', true)}" title="">{l s='My orders' mod='blockmyaccount'}</a></li> + {if $returnAllowed}<li><a href="{$link->getPageLink('order-follow', true)}" title="">{l s='My merchandise returns' mod='blockmyaccount'}</a></li>{/if} + <li><a href="{$link->getPageLink('order-slip', true)}" title="">{l s='My credit slips' mod='blockmyaccount'}</a></li> + <li><a href="{$link->getPageLink('addresses', true)}" title="">{l s='My addresses' mod='blockmyaccount'}</a></li> + <li><a href="{$link->getPageLink('identity', true)}" title="">{l s='My personal info' mod='blockmyaccount'}</a></li> + {if $voucherAllowed}<li><a href="{$link->getPageLink('discount', true)}" title="">{l s='My vouchers' mod='blockmyaccount'}</a></li>{/if} + {$HOOK_BLOCK_MY_ACCOUNT} + </ul> + <p class="logout"><a href="{$link->getPageLink('index', true, NULL, "mylogout")}" title="{l s='Sign out' mod='blockmyaccount'}">{l s='Sign out' mod='blockmyaccount'}</a></p> + </div> +</div> +<!-- /Block myaccount module --> diff --git a/modules/blockmyaccount/config.xml b/modules/blockmyaccount/config.xml new file mode 100755 index 000000000..86a6b898e --- /dev/null +++ b/modules/blockmyaccount/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockmyaccount</name> + <displayName><![CDATA[My Account block]]></displayName> + <version><![CDATA[1.2]]></version> + <description><![CDATA[Displays a block with links relative to user account.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockmyaccount/de.php b/modules/blockmyaccount/de.php new file mode 100644 index 000000000..4dd3b7407 --- /dev/null +++ b/modules/blockmyaccount/de.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mein Konto'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_74ecd9234b2a42ca13e775193f391833'] = 'Meine Bestellungen'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_89080f0eedbd5491a93157930f1e45fc'] = 'Meine Warenrücksendungen'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_9132bc7bac91dd4e1c453d4e96edf219'] = 'Meine Gutscheine'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_e45be0a0d4a0b62b15694c1a631e6e62'] = 'Meine Adressen'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_63b1ba91576576e6cf2da6fab7617e58'] = 'Meine persönlichen Daten'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_95d2137c196c7f84df5753ed78f18332'] = 'Meine Gutscheine'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_c87aacf5673fada1108c9f809d354311'] = 'Abmelden'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_ecf3e4f8f34a293099620cc25d5b4d93'] = 'Mein Kontoblock'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_0b9bc7f3bb601ef8959509352aea493b'] = 'Zeigt ein Block mit Links bezüglich des Benutzerkontos an'; + +?> \ No newline at end of file diff --git a/modules/blockmyaccount/en.php b/modules/blockmyaccount/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockmyaccount/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockmyaccount/es.php b/modules/blockmyaccount/es.php new file mode 100644 index 000000000..2293a61b2 --- /dev/null +++ b/modules/blockmyaccount/es.php @@ -0,0 +1,14 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_ecf3e4f8f34a293099620cc25d5b4d93'] = 'Bloque Mi cuenta'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_0b9bc7f3bb601ef8959509352aea493b'] = 'Mostrar un bloque con enlaces a la cuenta del usuario'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mi cuenta'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_74ecd9234b2a42ca13e775193f391833'] = 'Mis pedidos'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_89080f0eedbd5491a93157930f1e45fc'] = 'Mi mercancía devuelta'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_9132bc7bac91dd4e1c453d4e96edf219'] = 'Mis vales descuento'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_e45be0a0d4a0b62b15694c1a631e6e62'] = 'Mis direcciones'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_63b1ba91576576e6cf2da6fab7617e58'] = 'Mis datos personales'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_95d2137c196c7f84df5753ed78f18332'] = 'Mis vales'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_c87aacf5673fada1108c9f809d354311'] = 'Cerrar sesión'; diff --git a/modules/blockmyaccount/fr.php b/modules/blockmyaccount/fr.php new file mode 100644 index 000000000..335b7ef05 --- /dev/null +++ b/modules/blockmyaccount/fr.php @@ -0,0 +1,14 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_ecf3e4f8f34a293099620cc25d5b4d93'] = 'Bloc Mon compte'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_0b9bc7f3bb601ef8959509352aea493b'] = 'Ajoute un bloc proposant des liens vers le compte du client'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mon compte'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_74ecd9234b2a42ca13e775193f391833'] = 'Mes commandes'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_89080f0eedbd5491a93157930f1e45fc'] = 'Mes retours produits'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_9132bc7bac91dd4e1c453d4e96edf219'] = 'Mes avoirs'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_e45be0a0d4a0b62b15694c1a631e6e62'] = 'Mes adresses'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_63b1ba91576576e6cf2da6fab7617e58'] = 'Mes données personnelles'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_95d2137c196c7f84df5753ed78f18332'] = 'Mes bons de réductions'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_c87aacf5673fada1108c9f809d354311'] = 'Déconnexion'; diff --git a/modules/blockmyaccount/it.php b/modules/blockmyaccount/it.php new file mode 100644 index 000000000..c8dc058f2 --- /dev/null +++ b/modules/blockmyaccount/it.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Il mio account'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_74ecd9234b2a42ca13e775193f391833'] = 'I miei ordini'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_89080f0eedbd5491a93157930f1e45fc'] = 'I miei resi di merce '; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_9132bc7bac91dd4e1c453d4e96edf219'] = 'Le mie note di credito'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_e45be0a0d4a0b62b15694c1a631e6e62'] = 'I miei indirizzi'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_63b1ba91576576e6cf2da6fab7617e58'] = 'Le mie informazioni personali'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_95d2137c196c7f84df5753ed78f18332'] = 'I miei buoni'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_c87aacf5673fada1108c9f809d354311'] = 'Esci'; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_ecf3e4f8f34a293099620cc25d5b4d93'] = 'Blocco del mio account '; +$_MODULE['<{blockmyaccount}prestashop>blockmyaccount_0b9bc7f3bb601ef8959509352aea493b'] = 'Visualizza un blocco con i link relativi all\'account utente'; + +?> \ No newline at end of file diff --git a/modules/blockmyaccount/logo.gif b/modules/blockmyaccount/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd22d009b6c4309f82da2fc82750b94bfcf65ec8 GIT binary patch literal 600 zcmV-e0;l~)Nk%w1VGsZi0Oo%Hb3P6IT~X^(Pl-tn|9f$EJq-VUb?VHk{rmT|cT4xw zum6gG|C^H1Z%Y5Pt^JIH{{8#@c5LX+wC%Wl|Cy2Gw~G4t_<=<Zw6U*!O(=9Y5&r)E z*i%^AOj7=Tb^ms2&7pMu$;AJrpTm=9>{n8+d{}u>H{MTD&U+~Td2ZC5qF*@`)RvvD zfmrU!rtjCi?#-v&p{BKyc;-+~Q85)@JsYT{qvBCf`SbPex`N(LQU8Q``1ADtlZyUu zWMMWBsBA5{XgBoA$=$Gl|Hs1i(5C3cpZLt2@?ls0Vph{nSM%ZF(S9nhOJVlVsQ+nQ z%6KdPZez)KFVB7}|8i#io|d0xE$h>_TQw0`IUMxc+ufC!`t|nevv}&$y8qhNzHm3~ z$)kNf4Zd%8{rmg=h<^O|_{?u~dOs8Wa%S0$lCWEFX*m-9l#Gu_59g++tfivoQBZI{ z5ucZm|BQm~yo23MQRGih{#{W2hI>^q5YK`%{*sB>O;G=ff&c&iA^8LW004ggEC2ui z01yBW000NIfPaF6goTE1XkrCybB2Q$83O|s05vv_e<p4P00447G?*GP6(d+HS$Y<Z zRxe>jAVXI`5RN4-2SrW?FfEQ|XF*2_3PoUJT!lPp0$L3T2@OIsTR4LoZ*gBlA`E<G zRUtPlWP&kC4h{@GbUOr8Z4XE)f>T`v3k!J$DO67ZQ6@+c#3TnE3LXf2@DU-+0}^$h m2=am=fB-)jGv4X5N5UWkOV)5Wp~FrGB~7#-z{K)TAOJfxaU}cz literal 0 HcmV?d00001 diff --git a/modules/blocknewproducts/blocknewproducts.php b/modules/blocknewproducts/blocknewproducts.php new file mode 100644 index 000000000..082d5a865 --- /dev/null +++ b/modules/blocknewproducts/blocknewproducts.php @@ -0,0 +1,121 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockNewProducts extends Module +{ + public function __construct() + { + $this->name = 'blocknewproducts'; + $this->tab = 'front_office_features'; + $this->version = 0.9; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('New products block'); + $this->description = $this->l('Displays a block featuring newly added products.'); + } + + public function install() + { + if (parent::install() == false OR $this->registerHook('rightColumn') == false OR $this->registerHook('header') == false OR Configuration::updateValue('NEW_PRODUCTS_NBR', 5) == false) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockNewProducts')) + { + if (!$productNbr = Tools::getValue('productNbr') OR empty($productNbr)) + $output .= '<div class="alert error">'.$this->l('Please fill in the "products displayed" field.').'</div>'; + elseif ((int)($productNbr) == 0) + $output .= '<div class="alert error">'.$this->l('Invalid number.').'</div>'; + else + { + Configuration::updateValue('PS_BLOCK_NEWPRODUCTS_DISPLAY', (int)(Tools::getValue('always_display'))); + Configuration::updateValue('NEW_PRODUCTS_NBR', (int)($productNbr)); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Products displayed').'</label> + <div class="margin-form"> + <input type="text" name="productNbr" value="'.(int)(Configuration::get('NEW_PRODUCTS_NBR')).'" /> + <p class="clear">'.$this->l('Set the number of products to be displayed in this block').'</p> + </div> + <label>'.$this->l('Always display block').'</label> + <div class="margin-form"> + <input type="radio" name="always_display" id="display_on" value="1" '.(Tools::getValue('always_display', Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY')) ? 'checked="checked" ' : '').'/> + <label class="t" for="display_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="always_display" id="display_off" value="0" '.(!Tools::getValue('always_display', Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY')) ? 'checked="checked" ' : '').'/> + <label class="t" for="display_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Show the block even if no products are available.').'</p> + </div> + <center><input type="submit" name="submitBlockNewProducts" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + public function hookRightColumn($params) + { + global $smarty; + + $newProducts = Product::getNewProducts((int)($params['cookie']->id_lang), 0, (int)(Configuration::get('NEW_PRODUCTS_NBR'))); + if (!$newProducts AND !Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY')) + return; + $smarty->assign(array('new_products' => $newProducts, 'mediumSize' => Image::getSize('medium'))); + + return $this->display(__FILE__, 'blocknewproducts.tpl'); + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookHeader($params) + { + Tools::addCSS(($this->_path).'blocknewproducts.css', 'all'); + } + +} + + diff --git a/modules/blocknewproducts/blocknewproducts.tpl b/modules/blocknewproducts/blocknewproducts.tpl new file mode 100644 index 000000000..411fba6a4 --- /dev/null +++ b/modules/blocknewproducts/blocknewproducts.tpl @@ -0,0 +1,51 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Block new products --> +<div id="new-products_block_right" class="block products_block"> + <h4><a href="{$link->getPageLink('new-products')}" title="{l s='New products' mod='blocknewproducts'}">{l s='New products' mod='blocknewproducts'}</a></h4> + <div class="block_content"> + {if $new_products !== false} + <ul class="product_images clearfix"> + {foreach from=$new_products item='product' name='newProducts'} + {if $smarty.foreach.newProducts.index < 2} + <li{if $smarty.foreach.newProducts.first} class="first"{/if}><a href="{$product.link}" title="{$product.legend|escape:html:'UTF-8'}"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'medium')}" height="{$mediumSize.height}" width="{$mediumSize.width}" alt="{$product.legend|escape:html:'UTF-8'}" /></a></li> + {/if} + {/foreach} + </ul> + <dl class="products"> + {foreach from=$new_products item=newproduct name=myLoop} + <dt class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"><a href="{$newproduct.link}" title="{$newproduct.name|escape:html:'UTF-8'}">{$newproduct.name|strip_tags|escape:html:'UTF-8'}</a></dt> + {if $newproduct.description_short}<dd class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{else}item{/if}"><a href="{$newproduct.link}">{$newproduct.description_short|strip_tags:'UTF-8'|truncate:50:'...'}</a>&nbsp;<a href="{$newproduct.link}"><img src="{$img_dir}bullet.gif" alt="&gt;&gt;" width="10" height="7" /></a></dd>{/if} + {/foreach} + </dl> + <p><a href="{$link->getPageLink('new-products')}" title="{l s='All new products' mod='blocknewproducts'}" class="button_large">{l s='All new products' mod='blocknewproducts'}</a></p> + {else} + <p>{l s='No new products at this time' mod='blocknewproducts'}</p> + {/if} + </div> +</div> +<!-- /MODULE Block new products --> diff --git a/modules/blocknewproducts/config.xml b/modules/blocknewproducts/config.xml new file mode 100755 index 000000000..bd037ebd3 --- /dev/null +++ b/modules/blocknewproducts/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocknewproducts</name> + <displayName><![CDATA[New products block]]></displayName> + <version><![CDATA[0.9]]></version> + <description><![CDATA[Displays a block featuring newly added products.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocknewproducts/de.php b/modules/blocknewproducts/de.php new file mode 100644 index 000000000..63dec8e7e --- /dev/null +++ b/modules/blocknewproducts/de.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_9ff0635f5737513b1a6f559ac2bff745'] = 'Neue Produkte'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_60efcc704ef1456678f77eb9ee20847b'] = 'Alle neuen Produkte'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_2bc4c1efe10bba9f03fac3c59b4d2ae9'] = 'Keine neuen Produkte zu diesem Zeitpunkt'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f7c34fc4a48bc683445c1e7bbc245508'] = 'Neue Produktblöcke'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc68052332d758d991b64087c6e4352e'] = 'Zeigt einen Block mit neu hinzugefügten Produkten an'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_57af4b7e82ba04c42eb3ac111310a505'] = 'Sie müssen das Feld \"Angezeigte Produkte\" ausfüllen'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_73293a024e644165e9bf48f270af63a0'] = 'Ungültige Anzahl.'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_e451e6943bb539d1bd804d2ede6474b5'] = 'angezeigte Produkte'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc4bbebd6a8d2fb633a1dd8ceda3fc8d'] = 'Anzahl der Produkte einstellen, die in diesem Block angezeigt werden sollen'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_530c88f8210e022b39128e3f0409bbcf'] = 'Block immer anzeigen'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_53d61d1ac0507b1bd8cd99db8d64fb19'] = 'Block anzeigen, auch wenn kein Produkt verfügbar ist.'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blocknewproducts/en.php b/modules/blocknewproducts/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocknewproducts/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocknewproducts/es.php b/modules/blocknewproducts/es.php new file mode 100644 index 000000000..8c9a5db78 --- /dev/null +++ b/modules/blocknewproducts/es.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f7c34fc4a48bc683445c1e7bbc245508'] = 'Bloque de novedades'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc68052332d758d991b64087c6e4352e'] = 'Mostrar el bloque con los nuevos productos añadidos'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_57af4b7e82ba04c42eb3ac111310a505'] = 'Debe rellenar el campo \"productos mostrados\"'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_73293a024e644165e9bf48f270af63a0'] = 'Número incorrecto'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_e451e6943bb539d1bd804d2ede6474b5'] = 'Productos mostrados'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc4bbebd6a8d2fb633a1dd8ceda3fc8d'] = 'Seleccione el número de productos a mostrar en este bloque'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_530c88f8210e022b39128e3f0409bbcf'] = 'Mostrar siempre este bloque'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_53d61d1ac0507b1bd8cd99db8d64fb19'] = 'Mostrar este bloque aunque no haya productos disponibles'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_9ff0635f5737513b1a6f559ac2bff745'] = 'Novedades'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_60efcc704ef1456678f77eb9ee20847b'] = 'Todas las novedades'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_2bc4c1efe10bba9f03fac3c59b4d2ae9'] = 'no hay nuevos productos en este momento'; diff --git a/modules/blocknewproducts/fr.php b/modules/blocknewproducts/fr.php new file mode 100644 index 000000000..91978fc06 --- /dev/null +++ b/modules/blocknewproducts/fr.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f7c34fc4a48bc683445c1e7bbc245508'] = 'Bloc nouveaux produits'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc68052332d758d991b64087c6e4352e'] = 'Ajoute un bloc proposant les derniers produits ajoutés'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_57af4b7e82ba04c42eb3ac111310a505'] = 'Vous devez remplir le champ \"produit affiché\"'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_73293a024e644165e9bf48f270af63a0'] = 'Nombre invalide.'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c888438d14855d7d96a2724ee9c306bd'] = 'Mise à jour effectuée'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_e451e6943bb539d1bd804d2ede6474b5'] = 'Nombre de produits affichés'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc4bbebd6a8d2fb633a1dd8ceda3fc8d'] = 'Détermine le nombre de produits à afficher dans ce bloc'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_530c88f8210e022b39128e3f0409bbcf'] = 'Toujours afficher ce bloc'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_53d61d1ac0507b1bd8cd99db8d64fb19'] = 'Afficher le bloc même si aucun produit n\'est disponible'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_9ff0635f5737513b1a6f559ac2bff745'] = 'Nouveaux produits'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_60efcc704ef1456678f77eb9ee20847b'] = 'Tous les nouveaux produits'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_2bc4c1efe10bba9f03fac3c59b4d2ae9'] = 'Aucun nouveau produit à l\'heure actuelle'; diff --git a/modules/blocknewproducts/it.php b/modules/blocknewproducts/it.php new file mode 100644 index 000000000..9385eaa70 --- /dev/null +++ b/modules/blocknewproducts/it.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_9ff0635f5737513b1a6f559ac2bff745'] = 'Nuovi prodotti'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_60efcc704ef1456678f77eb9ee20847b'] = 'Tutti i nuovi prodotti'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_2bc4c1efe10bba9f03fac3c59b4d2ae9'] = 'Nessun nuovo prodotto in questo momento'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f7c34fc4a48bc683445c1e7bbc245508'] = 'Blocco nuovi prodotti'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc68052332d758d991b64087c6e4352e'] = 'Visualizza un blocco con i prodotti appena aggiunti'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_57af4b7e82ba04c42eb3ac111310a505'] = 'Devi compilare il campo \"prodotti esposti\"'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_73293a024e644165e9bf48f270af63a0'] = 'Numero non valido.'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_e451e6943bb539d1bd804d2ede6474b5'] = 'Prodotti esposti'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_cc4bbebd6a8d2fb633a1dd8ceda3fc8d'] = 'Imposta il numero di prodotti da esporre in questo blocco'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_530c88f8210e022b39128e3f0409bbcf'] = 'Visualizza sempre blocco'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_53d61d1ac0507b1bd8cd99db8d64fb19'] = 'Mostra il blocco anche se nessun prodotto è disponibile.'; +$_MODULE['<{blocknewproducts}prestashop>blocknewproducts_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blocknewproducts/logo.gif b/modules/blocknewproducts/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..f310c6b405221701e084f04c33ada05221ad46f7 GIT binary patch literal 333 zcmZ?wbhEHb6krfwxXQrrzmwtrh3WrSy8i$4`2T~w|L17@-;?)$qTv6x*Z<#G_5b&` z|2tCuFShu<ujv2N<NyEs{C}|O{~X2t-{1Z3<@~=P<o|`4|L?8+4+INM{!bDAf2866 zmlyw6IRAff_W%1k|1Zz`zcu^+y=@FM1ByRc7}*)b8FWB4fc(V3mUW=Jz(Yr>|HKj_ zPD=-qna7qiEELe1>Y!LKp}<JG@6csWAF*yGCF4MkTN8MrnG^*yn71i01Uksc@yRpG zG0Q44<q8Xx6!9?dD{}I)iggKy*Ei-evWYW@2k~+<a0l}QWi0hxvv%G34UP=f0KjE& AbN~PV literal 0 HcmV?d00001 diff --git a/modules/blocknewsletter/blocknewsletter.php b/modules/blocknewsletter/blocknewsletter.php new file mode 100644 index 000000000..597e2c0cb --- /dev/null +++ b/modules/blocknewsletter/blocknewsletter.php @@ -0,0 +1,285 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Blocknewsletter extends Module +{ + public function __construct() + { + $this->name = 'blocknewsletter'; + $this->tab = 'front_office_features'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Newsletter block'); + $this->description = $this->l('Adds a block for newsletter subscription.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete all your contacts ?'); + + $this->version = '1.4'; + $this->author = 'PrestaShop'; + $this->error = false; + $this->valid = false; + $this->_files = array( + 'name' => array('newsletter_conf', 'newsletter_voucher'), + 'ext' => array( + 0 => 'html', + 1 => 'txt' + ) + ); + } + + public function install() + { + if (parent::install() == false OR $this->registerHook('leftColumn') == false OR $this->registerHook('header') == false) + return false; + return Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.'newsletter ( + `id` int(6) NOT NULL AUTO_INCREMENT, + `id_shop` INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + `id_group_shop` INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + `email` varchar(255) NOT NULL, + `newsletter_date_add` DATETIME NULL, + `ip_registration_newsletter` varchar(15) NOT NULL, + `http_referer` VARCHAR(255) NULL, + PRIMARY KEY(`id`) + ) ENGINE='._MYSQL_ENGINE_.' default CHARSET=utf8'); + } + + public function uninstall() + { + if (!parent::uninstall()) + return false; + return Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'newsletter'); + } + + public function getContent() + { + $this->_html = '<h2>'.$this->displayName.'</h2>'; + + if (Tools::isSubmit('submitUpdate')) + { + if (isset($_POST['new_page']) AND Validate::isBool((int)($_POST['new_page']))) + Configuration::updateValue('NW_CONFIRMATION_NEW_PAGE', $_POST['new_page']); + if (isset($_POST['conf_email']) AND VAlidate::isBool((int)($_POST['conf_email']))) + Configuration::updateValue('NW_CONFIRMATION_EMAIL', pSQL($_POST['conf_email'])); + if (!empty($_POST['voucher']) AND !Validate::isDiscountName($_POST['voucher'])) + $this->_html .= '<div class="alert">'.$this->l('Voucher code is invalid').'</div>'; + else + { + Configuration::updateValue('NW_VOUCHER_CODE', pSQL($_POST['voucher'])); + $this->_html .= '<div class="conf ok">'.$this->l('Updated').'</div>'; + } + } + return $this->_displayForm(); + } + + private function _displayForm() + { + $this->_html .= ' + <form method="post" action="'.$_SERVER['REQUEST_URI'].'"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Display configuration in a new page?').'</label> + <div class="margin-form"> + <input type="radio" name="new_page" value="1" '.(Configuration::get('NW_CONFIRMATION_NEW_PAGE') ? 'checked="checked" ' : '').'/>'.$this->l('yes').' + <input type="radio" name="new_page" value="0" '.(!Configuration::get('NW_CONFIRMATION_NEW_PAGE') ? 'checked="checked" ' : '').'/>'.$this->l('no').' + </div> + <div class="clear"></div> + <label>'.$this->l('Send confirmation e-mail after subscription?').'</label> + <div class="margin-form"> + <input type="radio" name="conf_email" value="1" '.(Configuration::get('NW_CONFIRMATION_EMAIL') ? 'checked="checked" ' : '').'/>'.$this->l('yes').' + <input type="radio" name="conf_email" value="0" '.(!Configuration::get('NW_CONFIRMATION_EMAIL') ? 'checked="checked" ' : '').'/>'.$this->l('no').' + </div> + <div class="clear"></div> + <label>'.$this->l('Welcome voucher code').'</label> + <div class="margin-form"> + <input type="text" name="voucher" value="'.Configuration::get('NW_VOUCHER_CODE').'" /> + <p>'.$this->l('Leave blank for disabling').'</p> + </div> + <div class="margin-form clear pspace"><input type="submit" name="submitUpdate" value="'.$this->l('Update').'" class="button" /></div> + </fieldset> + </form>'; + + return $this->_html; + } + + /** + * Check if this mail is registered for newsletters + * + * @param unknown_type $customerEmail + * @return int -1 customer exists, but don't want newsletter ; 0 = not registered ; 1 = registered in block ; 2 = registered in customer + */ + private function isNewsletterRegistered($customerEmail) + { + $sql = 'SELECT `email` FROM '._DB_PREFIX_.'newsletter + WHERE `email` = \''.pSQL($customerEmail).'\' + AND id_shop = '.$this->shopID; + if (Db::getInstance()->getRow($sql)) + return 1; + + $sql = 'SELECT `newsletter` FROM '._DB_PREFIX_.'customer + WHERE `email` = \''.pSQL($customerEmail).'\' + AND id_shop = '.$this->shopID; + if (!$registered = Db::getInstance()->getRow($sql)) + return -1; + + if ($registered['newsletter'] == '1') + return 2; + return 0; + } + + /** + * Register in block newsletter + */ + private function newsletterRegistration() + { + if (empty($_POST['email']) OR !Validate::isEmail($_POST['email'])) + return $this->error = $this->l('Invalid e-mail address'); + + /* Unsubscription */ + elseif ($_POST['action'] == '1') + { + $registerStatus = $this->isNewsletterRegistered($_POST['email']); + if ($registerStatus < 1) + return $this->error = $this->l('E-mail address not registered'); + /* If the user ins't a customer */ + elseif ($registerStatus == 1) + { + if (!Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'newsletter WHERE `email` = \''.pSQL($_POST['email']).'\' AND id_shop = '.$this->shopID)) + return $this->error = $this->l('Error during unsubscription'); + return $this->valid = $this->l('Unsubscription successful'); + } + /* If the user is a customer */ + elseif ($registerStatus == 2) + { + if (!Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'customer SET `newsletter` = 0 WHERE `email` = \''.pSQL($_POST['email']).'\' AND id_shop = '.$this->shopID)) + return $this->error = $this->l('Error during unsubscription'); + return $this->valid = $this->l('Unsubscription successful'); + } + } + /* Subscription */ + elseif ($_POST['action'] == '0') + { + $registerStatus = $this->isNewsletterRegistered($_POST['email']); + if ($registerStatus > 0) + return $this->error = $this->l('E-mail address already registered'); + + /* If the user ins't a customer */ + elseif ($registerStatus == -1) + { + global $cookie; + + $sql = 'INSERT INTO '._DB_PREFIX_.'newsletter (id_shop, id_group_shop, email, newsletter_date_add, ip_registration_newsletter, http_referer) + VALUES ('.$this->shopID.', '.$this->shopGroupID.', \''.pSQL($_POST['email']).'\', NOW(), \''.pSQL(Tools::getRemoteAddr()).'\', + (SELECT c.http_referer FROM '._DB_PREFIX_.'connections c WHERE c.id_guest = '.(int)($cookie->id_guest).' ORDER BY c.date_add DESC LIMIT 1) + )'; + if (!Db::getInstance()->Execute($sql)) + return $this->error = $this->l('Error during subscription'); + $this->sendVoucher(pSQL($_POST['email'])); + + return $this->valid = $this->l('Subscription successful'); + } + /* If the user is a customer */ + elseif ($registerStatus == 0) + { + $sql = 'UPDATE '._DB_PREFIX_.'customer + SET `newsletter` = 1, newsletter_date_add = NOW(), `ip_registration_newsletter` = \''.pSQL(Tools::getRemoteAddr()).'\' + WHERE `email` = \''.pSQL($_POST['email']).'\' + AND id_shop = '.$this->shopID; + if (!Db::getInstance()->Execute($sql)) + return $this->error = $this->l('Error during subscription'); + $this->sendVoucher(pSQL($_POST['email'])); + + return $this->valid = $this->l('Subscription successful'); + } + } + } + + private function sendVoucher($email) + { + global $cookie; + + if ($discount = Configuration::get('NW_VOUCHER_CODE')) + return Mail::Send((int)($cookie->id_lang), 'newsletter_voucher', Mail::l('Newsletter voucher'), array('{discount}' => $discount), $email, NULL, NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); + return false; + } + + function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + function hookLeftColumn($params) + { + global $smarty; + + if (Tools::isSubmit('submitNewsletter')) + { + $this->newsletterRegistration(); + if ($this->error) + { + $smarty->assign(array('color' => 'red', + 'msg' => $this->error, + 'nw_value' => isset($_POST['email']) ? pSQL($_POST['email']) : false, + 'nw_error' => true, + 'action' => $_POST['action'])); + } + elseif ($this->valid) + { + if (Configuration::get('NW_CONFIRMATION_EMAIL') AND isset($_POST['action']) AND (int)($_POST['action']) == 0) + Mail::Send((int)($params['cookie']->id_lang), 'newsletter_conf', Mail::l('Newsletter confirmation'), array(), pSQL($_POST['email']), NULL, NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); + $smarty->assign(array('color' => 'green', + 'msg' => $this->valid, + 'nw_error' => false)); + } + } + $smarty->assign('this_path', $this->_path); + return $this->display(__FILE__, 'blocknewsletter.tpl'); + } + + public function confirmation() + { + global $smarty; + + return $this->display(__FILE__, 'newsletter.tpl'); + } + + public function externalNewsletter(/*$params*/) + { + return $this->hookLeftColumn($params); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blocknewsletter.css', 'all'); + } +} + + diff --git a/modules/blocknewsletter/blocknewsletter.tpl b/modules/blocknewsletter/blocknewsletter.tpl new file mode 100644 index 000000000..f50922dc6 --- /dev/null +++ b/modules/blocknewsletter/blocknewsletter.tpl @@ -0,0 +1,48 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block Newsletter module--> + +<div id="newsletter_block_left" class="block"> + <h4>{l s='Newsletter' mod='blocknewsletter'}</h4> + <div class="block_content"> + {if isset($msg) && $msg} + <p class="{if $nw_error}warning_inline{else}success_inline{/if}">{$msg}</p> + {/if} + <form action="{$link->getPageLink('index')}" method="post"> + <p><input type="text" name="email" size="18" value="{if isset($value) && $value}{$value}{else}{l s='your e-mail' mod='blocknewsletter'}{/if}" onfocus="javascript:if(this.value=='{l s='your e-mail' mod='blocknewsletter'}')this.value='';" onblur="javascript:if(this.value=='')this.value='{l s='your e-mail' mod='blocknewsletter'}';" /></p> + <p> + <select name="action"> + <option value="0"{if isset($action) && $action == 0} selected="selected"{/if}>{l s='Subscribe' mod='blocknewsletter'}</option> + <option value="1"{if isset($action) && $action == 1} selected="selected"{/if}>{l s='Unsubscribe' mod='blocknewsletter'}</option> + </select> + <input type="submit" value="ok" class="button_mini" name="submitNewsletter" /> + </p> + </form> + </div> +</div> + +<!-- /Block Newsletter module--> diff --git a/modules/blocknewsletter/config.xml b/modules/blocknewsletter/config.xml new file mode 100755 index 000000000..4dfbb0439 --- /dev/null +++ b/modules/blocknewsletter/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocknewsletter</name> + <displayName><![CDATA[Newsletter block]]></displayName> + <version><![CDATA[1.4]]></version> + <description><![CDATA[Adds a block for newsletter subscription.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <confirmUninstall>Are you sure you want to delete all your contacts ?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocknewsletter/de.php b/modules/blocknewsletter/de.php new file mode 100644 index 000000000..cb0d4b0ea --- /dev/null +++ b/modules/blocknewsletter/de.php @@ -0,0 +1,58 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_416f61a2ce16586f8289d41117a2554e'] = 'Ihre E-Mail'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b26917587d98330d93f87808fc9d7267'] = 'Abonnieren'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_4182c8f19d40c7ca236a5f4f83faeb6b'] = 'Abmelden'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e31b08a00c1ed653bcaa517dee84714'] = 'Newsletter Block'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ba457fab18d697d978befb95e827eb91'] = 'Fügt einen Block für Newsletter-Abos hinzu'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_179bbcbd2e1104cdf9dcecd91264a961'] = 'Sie sind sicher, dass Sie alle Ihre Kontakte löschen wollen?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f0e9c1e3969d351170373b5cec2131c2'] = 'Gutschein-Code ist ungültig'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ff0a3b7f3daef040faf89a88fdac01b7'] = 'Aktualisierung erfolgreich'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a3399c10bd24eba0b78fbd595c51f81a'] = 'Konfiguration auf einer neuen Seite anzeigen?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a6105c0a611b41b08f1209506350279e'] = 'ja'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_7fa3b767c460b54a2be4d49030b349c7'] = 'nein'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b68ae6efae2fca059754c27ff94494cd'] = 'Bestätigungsmail nach Abonnement senden?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_506e58042922bff5bd753dc612e84f5b'] = 'Willkommensgutschein-Code'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_de3bd7faad12c79178b1b22bf6119e35'] = 'Zur Deaktivierung leer lassen '; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_06933067aafd48425d67bcb01bba5cb6'] = 'Aktualisierung'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_6e659c47c94d1e1dc7121859f43fb2b0'] = 'Ungültige E-Mail-Adresse'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e6df6e72be5be5b8ff962ee3406907e'] = 'E-Mail-Adresse nicht registriert'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_29003419c075963848f1907174bdc224'] = 'Fehler bei der Abo-Abmeldung'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f7dc297e2a139ab4f5a771825b46df43'] = 'Abo-Abmeldung erfolgreich'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_8dc3b88902df97bb96930282e56ed381'] = 'E-Mail-Adresse bereits registriert'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b7d9eb38dd2e375648ab08e224e22e43'] = 'Fehler bei der Abonnierung'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ed3cd7b3cc134222fa70602921ec27e1'] = 'Abonnement erfolgreich'; +$_MODULE['<{newsletter}prestashop>newsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_804a924e464fd21ed92f820224c4091d'] = 'Erzeugt eine .CSV-Datei für Massenmailings'; +$_MODULE['<{newsletter}prestashop>newsletter_c3987e4cac14a8456515f0d200da04ee'] = 'Alle Länder'; +$_MODULE['<{newsletter}prestashop>newsletter_fa01fd956e87307bce4c90a0de9b0437'] = 'Kundenländer'; +$_MODULE['<{newsletter}prestashop>newsletter_c0859b0a5241dff468da2a9a93c3284f'] = 'Betreiben Sie einen Filter für das Kundenland.'; +$_MODULE['<{newsletter}prestashop>newsletter_2198f293f5e1e95dddeff819fbca0975'] = 'Newsletter-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_99006a61d48499231e1be92241cf772a'] = 'Newsletter-Abonnenten Filtern.'; +$_MODULE['<{newsletter}prestashop>newsletter_7e3a51a56ddd2846e21c33f05e0aea6f'] = 'Alle Kunden'; +$_MODULE['<{newsletter}prestashop>newsletter_39f7a3e2b56e9bfd753ba6325533a127'] = 'Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_011d8c5d94f729f013963d856cd78745'] = 'Nicht-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_793ee192a9124cd6f529460eef17d3e5'] = 'Opt-in-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_7b15c043d66fecc45c8752592aa38e38'] = 'Opt-in Abonnenten filtern.'; +$_MODULE['<{newsletter}prestashop>newsletter_82e5e0bc0f9c776c98253d569c111c0f'] = 'Keine Kunden mit diesen Filtern gefunden!'; +$_MODULE['<{newsletter}prestashop>newsletter_d526d090aa22242fa5f6acfccc6bd007'] = 'Die .CSV-Datei wurde erfolgreich exportiert'; +$_MODULE['<{newsletter}prestashop>newsletter_55caa4828d4e935c2ba9f1558f1c4edd'] = 'Kunden gefunden'; +$_MODULE['<{newsletter}prestashop>newsletter_48e3d5f66961b621c78f709afcd7d437'] = 'Laden Sie die Datei herunter'; +$_MODULE['<{newsletter}prestashop>newsletter_faa1115fbab933e7178ee43ce1590977'] = 'ACHTUNG: Wenn Sie diese CSV-Datei mit Excel zu öffnen versuchen, vergessen Sie nicht, den UTF-8 Code zu wählen, sonst können seltsame Zeichen erscheinen'; +$_MODULE['<{newsletter}prestashop>newsletter_81573e0ea79138f02fd2cee94786d7e9'] = 'Fehler: kann nicht schreiben'; +$_MODULE['<{newsletter}prestashop>newsletter_8d550e9bf69bfc7a09be6eeb1622ae23'] = 'Es gibt zwei Arten für dieses Modul:'; +$_MODULE['<{newsletter}prestashop>newsletter_23e8f8a55548b88bfbdcd1f6ba26a010'] = 'Personen, die den Newsletter über den BlockNewsletter Block im Front-Office abonniert haben.'; +$_MODULE['<{newsletter}prestashop>newsletter_27d1ec406fd2baf49d03f81a4bb41122'] = 'Dies wird eine Liste mit E-Mails von Personen, die Ihren Shop besuchen und nicht Kunden werden, sondern Ihren Newsletter erhalten wollen. Mit der Benutzung der untenstehenden Liste \"Export Newsletter Abonnenten\"wird eine . CSV-Datei generiert, die auf den BlockNewsletter Abonnenten-Daten basiert .'; +$_MODULE['<{newsletter}prestashop>newsletter_74ca54506cdbc82e3aa763ba91b8fa39'] = 'Kunden, die \"ja\" angeklickt haben, um einen Newsletter in ihrem Kundenprofil zu erhalten.'; +$_MODULE['<{newsletter}prestashop>newsletter_1aa14f5a6423dbde1ef2cfe4734980b4'] = 'Der Abschnitt \"Export Kunden\" unten filtert die Kunden, denen Sie einen Newsletter schicken möchten.'; +$_MODULE['<{newsletter}prestashop>newsletter_b192ab83a19105bbf1e2d1fab548249a'] = 'Export Newsletter-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_a60401e616125189d78605b2ddd7ff45'] = 'Erzeugen Sie eine. CSV-Datei aus BlockNewsletter Abonnenten-Daten.'; +$_MODULE['<{newsletter}prestashop>newsletter_dbb392a2dc9b38722e69f6032faea73e'] = '.CSV-Datei exportieren'; +$_MODULE['<{newsletter}prestashop>newsletter_4713ef5f2d6fc1e8f088c850e696a04b'] = 'Kunden exportieren '; +$_MODULE['<{newsletter}prestashop>newsletter_2f5a2bf1a10d25a408a8bab945e4dd3c'] = '.CSV-Datei aus Kunden-Konto-Daten generieren '; + +?> \ No newline at end of file diff --git a/modules/blocknewsletter/en.php b/modules/blocknewsletter/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocknewsletter/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocknewsletter/es.php b/modules/blocknewsletter/es.php new file mode 100644 index 000000000..ea5884736 --- /dev/null +++ b/modules/blocknewsletter/es.php @@ -0,0 +1,28 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e31b08a00c1ed653bcaa517dee84714'] = 'Bloque newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ba457fab18d697d978befb95e827eb91'] = 'Añadir un bloque para suscribirse a la newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_179bbcbd2e1104cdf9dcecd91264a961'] = '¿Está seguro de querer eliminar todos sus contactos?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f0e9c1e3969d351170373b5cec2131c2'] = 'Êl código de descuento no es válido'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ff0a3b7f3daef040faf89a88fdac01b7'] = 'Actualización correcta'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a3399c10bd24eba0b78fbd595c51f81a'] = '¿Mostrar la configuración en una nueva página?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a6105c0a611b41b08f1209506350279e'] = 'sí'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_7fa3b767c460b54a2be4d49030b349c7'] = 'no'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b68ae6efae2fca059754c27ff94494cd'] = '¿Enviar confirmación por email después de la suscripción?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_506e58042922bff5bd753dc612e84f5b'] = 'El código de descuento es válido'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_de3bd7faad12c79178b1b22bf6119e35'] = 'Dejar en blanco para inhabilitar'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_06933067aafd48425d67bcb01bba5cb6'] = 'Actualizar'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_6e659c47c94d1e1dc7121859f43fb2b0'] = 'email incorrecto'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e6df6e72be5be5b8ff962ee3406907e'] = 'Email no registrado'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_29003419c075963848f1907174bdc224'] = 'Error al borrarse '; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f7dc297e2a139ab4f5a771825b46df43'] = 'Se ha borrado con éxito'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_8dc3b88902df97bb96930282e56ed381'] = 'Email ya registrado'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b7d9eb38dd2e375648ab08e224e22e43'] = 'Error durante la suscripción'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ed3cd7b3cc134222fa70602921ec27e1'] = 'Suscripción correcta'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_416f61a2ce16586f8289d41117a2554e'] = 'su email'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b26917587d98330d93f87808fc9d7267'] = 'suscribirse'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_4182c8f19d40c7ca236a5f4f83faeb6b'] = 'Borrarse'; diff --git a/modules/blocknewsletter/fr.php b/modules/blocknewsletter/fr.php new file mode 100644 index 000000000..531236aae --- /dev/null +++ b/modules/blocknewsletter/fr.php @@ -0,0 +1,28 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e31b08a00c1ed653bcaa517dee84714'] = 'Bloc newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ba457fab18d697d978befb95e827eb91'] = 'Ajoute un bloc newsletter pour vos clients'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_179bbcbd2e1104cdf9dcecd91264a961'] = 'Etes-vous sûr de vouloir supprimer tous vos contacts ?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f0e9c1e3969d351170373b5cec2131c2'] = 'Code de réduction invalide'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ff0a3b7f3daef040faf89a88fdac01b7'] = 'Mise à jour terminée.'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a3399c10bd24eba0b78fbd595c51f81a'] = 'Afficher la configuration dans une nouvelle page ?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a6105c0a611b41b08f1209506350279e'] = 'Oui'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_7fa3b767c460b54a2be4d49030b349c7'] = 'Non'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b68ae6efae2fca059754c27ff94494cd'] = 'Envoyer un mail de confirmation après inscription ?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_506e58042922bff5bd753dc612e84f5b'] = 'Code de réduction offert'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_de3bd7faad12c79178b1b22bf6119e35'] = 'Laissez vide pour désactiver'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_06933067aafd48425d67bcb01bba5cb6'] = 'Mise à jour'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_6e659c47c94d1e1dc7121859f43fb2b0'] = 'Adresse e-mail invalide'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e6df6e72be5be5b8ff962ee3406907e'] = 'Adresse e-mail introuvable'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_29003419c075963848f1907174bdc224'] = 'Erreur lors de la désinscription'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f7dc297e2a139ab4f5a771825b46df43'] = 'Votre désinscription est effective'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_8dc3b88902df97bb96930282e56ed381'] = 'Adresse e-mail déjà inscrite'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b7d9eb38dd2e375648ab08e224e22e43'] = 'Une erreur est survenue lors de votre inscription'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ed3cd7b3cc134222fa70602921ec27e1'] = 'Votre inscription est effective'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_416f61a2ce16586f8289d41117a2554e'] = 'votre e-mail'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b26917587d98330d93f87808fc9d7267'] = 'Inscription'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_4182c8f19d40c7ca236a5f4f83faeb6b'] = 'Désinscription'; diff --git a/modules/blocknewsletter/it.php b/modules/blocknewsletter/it.php new file mode 100644 index 000000000..e63ec87e0 --- /dev/null +++ b/modules/blocknewsletter/it.php @@ -0,0 +1,58 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_416f61a2ce16586f8289d41117a2554e'] = 'la tua e-mail'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b26917587d98330d93f87808fc9d7267'] = 'Iscriviti'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_4182c8f19d40c7ca236a5f4f83faeb6b'] = 'Cancellati'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e31b08a00c1ed653bcaa517dee84714'] = 'Blocco newsletter '; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ba457fab18d697d978befb95e827eb91'] = 'Aggiunge un blocco per l\'iscrizione alla newsletter'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_179bbcbd2e1104cdf9dcecd91264a961'] = 'Sei sicuro di voler eliminare tutti i tuoi contatti?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f0e9c1e3969d351170373b5cec2131c2'] = 'Codice del buono non valido'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ff0a3b7f3daef040faf89a88fdac01b7'] = 'Aggiornato con successo'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a3399c10bd24eba0b78fbd595c51f81a'] = 'Visualizzazione di configurazione in una nuova pagina?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_a6105c0a611b41b08f1209506350279e'] = 'sì'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_7fa3b767c460b54a2be4d49030b349c7'] = 'no'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b68ae6efae2fca059754c27ff94494cd'] = 'Invio di e-mail di conferma dopo l\'iscrizione?'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_506e58042922bff5bd753dc612e84f5b'] = 'Codice buono di benvenuto '; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_de3bd7faad12c79178b1b22bf6119e35'] = 'Lascia vuoto per disattivare'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_06933067aafd48425d67bcb01bba5cb6'] = 'Aggiorna'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_6e659c47c94d1e1dc7121859f43fb2b0'] = 'Indirizzo e-mail non valido'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_9e6df6e72be5be5b8ff962ee3406907e'] = 'Indirizzo e-mail non registrato'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_29003419c075963848f1907174bdc224'] = 'Errore durante la cancellazione dell\'iscrizione'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_f7dc297e2a139ab4f5a771825b46df43'] = 'Cancellazione dell\'iscrizione riuscita'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_8dc3b88902df97bb96930282e56ed381'] = 'Indirizzo e-mail già registrato'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_b7d9eb38dd2e375648ab08e224e22e43'] = 'Errore durante l\'iscrizione'; +$_MODULE['<{blocknewsletter}prestashop>blocknewsletter_ed3cd7b3cc134222fa70602921ec27e1'] = 'Iscrizione riuscita'; +$_MODULE['<{newsletter}prestashop>newsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_804a924e464fd21ed92f820224c4091d'] = 'Genera un file. CSV per invii di massa'; +$_MODULE['<{newsletter}prestashop>newsletter_c3987e4cac14a8456515f0d200da04ee'] = 'Tutti i paesi'; +$_MODULE['<{newsletter}prestashop>newsletter_fa01fd956e87307bce4c90a0de9b0437'] = 'Paese dei clienti'; +$_MODULE['<{newsletter}prestashop>newsletter_c0859b0a5241dff468da2a9a93c3284f'] = 'Opera un filtro sul paese dei clienti.'; +$_MODULE['<{newsletter}prestashop>newsletter_2198f293f5e1e95dddeff819fbca0975'] = 'Iscritti alla newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_99006a61d48499231e1be92241cf772a'] = 'Filtro iscritti newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_7e3a51a56ddd2846e21c33f05e0aea6f'] = 'Tutti i clienti'; +$_MODULE['<{newsletter}prestashop>newsletter_39f7a3e2b56e9bfd753ba6325533a127'] = 'Iscritti'; +$_MODULE['<{newsletter}prestashop>newsletter_011d8c5d94f729f013963d856cd78745'] = 'Non iscritti'; +$_MODULE['<{newsletter}prestashop>newsletter_793ee192a9124cd6f529460eef17d3e5'] = 'Iscritti opt-in'; +$_MODULE['<{newsletter}prestashop>newsletter_7b15c043d66fecc45c8752592aa38e38'] = 'Sottoscrittori opt-in filtri'; +$_MODULE['<{newsletter}prestashop>newsletter_82e5e0bc0f9c776c98253d569c111c0f'] = 'Nessun cliente trovato con questi filtri!'; +$_MODULE['<{newsletter}prestashop>newsletter_d526d090aa22242fa5f6acfccc6bd007'] = 'Il file. CSV è stato esportato con successo'; +$_MODULE['<{newsletter}prestashop>newsletter_55caa4828d4e935c2ba9f1558f1c4edd'] = 'cliente trovato'; +$_MODULE['<{newsletter}prestashop>newsletter_48e3d5f66961b621c78f709afcd7d437'] = 'Scarica il file'; +$_MODULE['<{newsletter}prestashop>newsletter_faa1115fbab933e7178ee43ce1590977'] = '. ATTENZIONE: Se si tenta di aprire questo file .csv con Excel, non dimenticare di scegliere la codifica UTF-8 o puoi vedere caratteri strani'; +$_MODULE['<{newsletter}prestashop>newsletter_81573e0ea79138f02fd2cee94786d7e9'] = 'Errore: impossibile scrivere a'; +$_MODULE['<{newsletter}prestashop>newsletter_8d550e9bf69bfc7a09be6eeb1622ae23'] = 'Modulo diviso in due tipologie:'; +$_MODULE['<{newsletter}prestashop>newsletter_23e8f8a55548b88bfbdcd1f6ba26a010'] = 'Le persone che si sono iscritte usando il blocco BlockNewsletter nel front office.'; +$_MODULE['<{newsletter}prestashop>newsletter_27d1ec406fd2baf49d03f81a4bb41122'] = 'Questo sarà un elenco di indirizzi email delle persone che si recano nel tuo negozio non per diventare un cliente, ma per ottenere la tua newsletter. Utilizzando il seguente \"Esporta iscritti alla newsletter\" genererà un file. CSV sulla base dei dati abbonati BlockNewsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_74ca54506cdbc82e3aa763ba91b8fa39'] = 'I clienti che hanno risposto \"sì\" per ricevere una newsletter nel loro profilo del cliente.'; +$_MODULE['<{newsletter}prestashop>newsletter_1aa14f5a6423dbde1ef2cfe4734980b4'] = 'La sezione seguente \"Esporta clienti\" filtra a quali clienti si desidera inviare una newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_b192ab83a19105bbf1e2d1fab548249a'] = 'Export Newsletter Iscritti'; +$_MODULE['<{newsletter}prestashop>newsletter_a60401e616125189d78605b2ddd7ff45'] = 'Genera un file. CSV sulla base dei dati abbonati BlockNewsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_dbb392a2dc9b38722e69f6032faea73e'] = 'Esporta file. CSV'; +$_MODULE['<{newsletter}prestashop>newsletter_4713ef5f2d6fc1e8f088c850e696a04b'] = 'Esporta clienti'; +$_MODULE['<{newsletter}prestashop>newsletter_2f5a2bf1a10d25a408a8bab945e4dd3c'] = 'Genera un file. CSV dai dati account clienti'; + +?> \ No newline at end of file diff --git a/modules/blocknewsletter/logo.gif b/modules/blocknewsletter/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dd879dab4c880aaa0593a92b497456037c82c1 GIT binary patch literal 983 zcmZ?wbhEHb6krfwXlG!s&DmmIwA-#?pLgN9_?lI&r3amA4*J&|32WXO(7r#aeQR|4 zuGr3Pp3R4Y+l~fw9gk`~8PRnjw&zr8@0t9m7Yb)wte$iEx9^j-<#$@v-s@U%ea_}< z^S9mUS^s$ImdCUAy`8`B<&@nYmK}Ms>gd}|r(f+j|7OG4kGn6t*>?TUo~vK>-~My% z*6YK!e;mF4=j?+Y*Pi^m_WbY7Cm-)V|9<z?zx!|gJ$v`_$@_nAK7N1o`QMu_KR$l{ z_x0!hpMU-{jDpb+phgHN{$ychU=U}}0T~9$6AT<%81y-0JT@#i*vw*{vBDs+sij>| z$)e!GfrCs;G8Hc#9Nf6rUDjM8;=)76wmwOX^cx#CI=i(=@N0Z92n=HHooZ2b<%NLK z@n%k&gbPzPGPCo^S=%r8z^SOwBPfwou%_{0Gnc3xKTD~jlZ&UMoJ&W-#Y5?ga{697 z8YVKabch)2*tFxL!ht?v{frA9Gbd&DvNIQ5x!_pQ{_wDM-kJah1_uU4HXf51cN7|* RvT$%H+&Qz;_;~|^H2?}N&ustz literal 0 HcmV?d00001 diff --git a/modules/blocknewsletter/mails/de/newsletter_conf.html b/modules/blocknewsletter/mails/de/newsletter_conf.html new file mode 100644 index 000000000..642fc4b2a --- /dev/null +++ b/modules/blocknewsletter/mails/de/newsletter_conf.html @@ -0,0 +1,14 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> + <div style="width: 500px;"><a href="{shop_url}"><img title="{shop_name}" src="{shop_logo}" border="0" alt="{shop_name}" /></a><br /><br />Hallo +<h1 style="font-size: 13px; height: 25px; line-height: 25px; background: #CCC; padding-left: 8px;">DANKE F&Uuml;R IHRE ANMELDUNG ZU UNSEREM NEWSLETTER</h1> +<!-- TEXT --> +<div style="margin-top: 10px; padding-top: 5px; border-top: 1px solid #666; text-align: center; font-size: 11px;"><a href="{shop_url}">{shop_name}</a> powered by <a href="http://www.prestashop.com">PrestaShop</a>&trade;</div> +</div> +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/de/newsletter_conf.txt b/modules/blocknewsletter/mails/de/newsletter_conf.txt new file mode 100644 index 000000000..39d48aeb3 --- /dev/null +++ b/modules/blocknewsletter/mails/de/newsletter_conf.txt @@ -0,0 +1,7 @@ +Hallo + +Danke für Ihre Anmeldung zu unserem Newsletter. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/de/newsletter_voucher.html b/modules/blocknewsletter/mails/de/newsletter_voucher.html new file mode 100644 index 000000000..f5da279bb --- /dev/null +++ b/modules/blocknewsletter/mails/de/newsletter_voucher.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Newsletter-Anmeldung</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie haben unseren Newsletter abonniert, wir freuen uns, Ihnen den folgenden Gutschein zu schenken: {discount}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered by <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/de/newsletter_voucher.txt b/modules/blocknewsletter/mails/de/newsletter_voucher.txt new file mode 100644 index 000000000..c2668d375 --- /dev/null +++ b/modules/blocknewsletter/mails/de/newsletter_voucher.txt @@ -0,0 +1,8 @@ +Hallo + +Sie haben unseren Newsletter abonniert, wir freuen uns, Ihnen den folgenden Gutschein zu schenken: {discount} + +{shop_name} - {shop_url} + + +{shop_name} powered with PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/en/newsletter_conf.html b/modules/blocknewsletter/mails/en/newsletter_conf.html new file mode 100644 index 000000000..2f2b82740 --- /dev/null +++ b/modules/blocknewsletter/mails/en/newsletter_conf.html @@ -0,0 +1,21 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Message from {shop_name}</title> +</head> + +<body style="font-family: Arial, Helvetica, sans-serif;font-size: 12px;color: #222;"> + <div style="width: 500px;"> + <a href="{shop_url}"><img src="{shop_logo}" alt="{shop_name}" title="{shop_name}" border="0" /></a><br /><br /> + + Hi + + <h1 style="font-size: 13px;height: 25px;line-height: 25px;background: #CCC;padding-left: 8px;">Thank you for subscribing to our newsletter</h1> + + <!-- TEXT --> + + <div style="margin-top: 10px;padding-top: 5px;border-top: 1px solid #666;text-align: center;font-size: 11px;"><a href="{shop_url}">{shop_name}</a> powered by <a href="http://www.prestashop.com">PrestaShop</a>™</div> + </div> +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/en/newsletter_conf.txt b/modules/blocknewsletter/mails/en/newsletter_conf.txt new file mode 100644 index 000000000..a39bb9c56 --- /dev/null +++ b/modules/blocknewsletter/mails/en/newsletter_conf.txt @@ -0,0 +1,7 @@ +Hi + +Thank you for subscribing to our newsletter. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/en/newsletter_voucher.html b/modules/blocknewsletter/mails/en/newsletter_voucher.html new file mode 100644 index 000000000..6a600d50f --- /dev/null +++ b/modules/blocknewsletter/mails/en/newsletter_voucher.html @@ -0,0 +1,36 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Newsletter subscription</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Regarding your newsletter subscription, we have the pleasure to offer you the following voucher: {discount} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered by <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/blocknewsletter/mails/en/newsletter_voucher.txt b/modules/blocknewsletter/mails/en/newsletter_voucher.txt new file mode 100644 index 000000000..a9dc09a60 --- /dev/null +++ b/modules/blocknewsletter/mails/en/newsletter_voucher.txt @@ -0,0 +1,9 @@ +Hi + +Regarding your newsletter subscription, we have the pleasure to offer you the following voucher: {discount} + +{shop_name} - {shop_url} + + + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/es/newsletter_conf.html b/modules/blocknewsletter/mails/es/newsletter_conf.html new file mode 100755 index 000000000..a6dc1e9c3 --- /dev/null +++ b/modules/blocknewsletter/mails/es/newsletter_conf.html @@ -0,0 +1,15 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <div style="width: 650px;"><a href="{shop_url}"><img title="{shop_name}" src="{shop_logo}" border="0" alt="{shop_name}" /></a><br /><br />Hola, +<h1 style="font-size: 13px; height: 25px; line-height: 25px; background: #CCC; padding-left: 8px;">Gracias por tu suscripci&oacute;n a nuestro bolet&iacute;n.</h1> +<!-- TEXTE --> +<div style="margin-top: 10px; padding-top: 5px; border-top: 1px solid #666; text-align: center; font-size: 11px;"><a href="{shop_url}">{shop_name}</a> dirigida por <a href="http://www.prestashop.com">PrestaShop</a>&trade;</div> +</div> + +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/es/newsletter_conf.txt b/modules/blocknewsletter/mails/es/newsletter_conf.txt new file mode 100755 index 000000000..2e3dba8dd --- /dev/null +++ b/modules/blocknewsletter/mails/es/newsletter_conf.txt @@ -0,0 +1,7 @@ +Hola, + +Gracias por tu suscripción a nuestro boletín. + + + +{shop_url} dirigida por PrestaShop™ diff --git a/modules/blocknewsletter/mails/es/newsletter_voucher.html b/modules/blocknewsletter/mails/es/newsletter_voucher.html new file mode 100755 index 000000000..367d7aec0 --- /dev/null +++ b/modules/blocknewsletter/mails/es/newsletter_voucher.html @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Inscription &agrave; la newsletter</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Despu&eacute;s de su suscripci&oacute;n a nuestro bolet&iacute;n, nos complace ofrecerle el siguiente cup&oacute;n: {discount}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> dirigida por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/es/newsletter_voucher.txt b/modules/blocknewsletter/mails/es/newsletter_voucher.txt new file mode 100755 index 000000000..255b54c4c --- /dev/null +++ b/modules/blocknewsletter/mails/es/newsletter_voucher.txt @@ -0,0 +1,9 @@ +Hola + +Después de su suscripción a nuestro boletín, nos complace ofrecerle el siguiente cupón: {discount} + +{shop_name} - {shop_url} + + + +{shop_url} dirigida por PrestaShop™ diff --git a/modules/blocknewsletter/mails/fr/newsletter_conf.html b/modules/blocknewsletter/mails/fr/newsletter_conf.html new file mode 100644 index 000000000..383146c5b --- /dev/null +++ b/modules/blocknewsletter/mails/fr/newsletter_conf.html @@ -0,0 +1,21 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>Message de {shop_name}</title> +</head> + +<body style="font-family: Arial, Helvetica, sans-serif;font-size: 12px;color: #222;"> + <div style="width: 650px;"> + <a href="{shop_url}"><img src="{shop_logo}" alt="{shop_name}" title="{shop_name}" border="0" /></a><br /><br /> + + Bonjour, + + <h1 style="font-size: 13px;height: 25px;line-height: 25px;background: #CCC;padding-left: 8px;">Merci de votre inscription &agrave; notre newsletter</h1> + + <!-- TEXTE --> + + <div style="margin-top: 10px;padding-top: 5px;border-top: 1px solid #666;text-align: center;font-size: 11px;"><a href="{shop_url}">{shop_name}</a> r&eacute;alis&eacute; par <a href="http://www.prestashop.com">PrestaShop</a>™</div> + </div> +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/fr/newsletter_conf.txt b/modules/blocknewsletter/mails/fr/newsletter_conf.txt new file mode 100644 index 000000000..c39d07030 --- /dev/null +++ b/modules/blocknewsletter/mails/fr/newsletter_conf.txt @@ -0,0 +1,7 @@ +Bonjour, + +Merci de votre inscription à notre newsletter + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/fr/newsletter_voucher.html b/modules/blocknewsletter/mails/fr/newsletter_voucher.html new file mode 100644 index 000000000..f84c75105 --- /dev/null +++ b/modules/blocknewsletter/mails/fr/newsletter_voucher.html @@ -0,0 +1,36 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Inscription &agrave; la newsletter</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Suite &agrave; votre inscription &agrave; notre newsletter, nous avons le plaisir de vous offrir le bon de r&eacute;duction suivant : {discount} + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/blocknewsletter/mails/fr/newsletter_voucher.txt b/modules/blocknewsletter/mails/fr/newsletter_voucher.txt new file mode 100644 index 000000000..4b70f5679 --- /dev/null +++ b/modules/blocknewsletter/mails/fr/newsletter_voucher.txt @@ -0,0 +1,9 @@ +Bonjour + +Suite à votre inscription à notre newsletter, nous avons le plaisir de vous offrir le bon de réduction suivant : {discount} + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/it/newsletter_conf.html b/modules/blocknewsletter/mails/it/newsletter_conf.html new file mode 100755 index 000000000..f2ed06db9 --- /dev/null +++ b/modules/blocknewsletter/mails/it/newsletter_conf.html @@ -0,0 +1,15 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Messaggio da {shop_name}</title> +</head> + +<body style="font-family: Arial, Helvetica, sans-serif;font-size: 12px;color: #222;"> +<div style="width: 500px;"><a href="{shop_url}"><img title="{shop_name}" src="{shop_logo}" border="0" alt="{shop_name}" /></a><br /><br /> Salve +<h1 style="font-size: 13px; height: 25px; line-height: 25px; background: #CCC; padding-left: 8px;">Grazie per esserti iscritto alla nostra newsletter</h1> +<!-- TEXT --> +<div style="margin-top: 10px; padding-top: 5px; border-top: 1px solid #666; text-align: center; font-size: 11px;"><a href="{shop_url}">{shop_name}</a> powered by <a href="http://www.prestashop.com">PrestaShop</a>&trade;</div> +</div> +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/it/newsletter_conf.txt b/modules/blocknewsletter/mails/it/newsletter_conf.txt new file mode 100755 index 000000000..94c7baa7a --- /dev/null +++ b/modules/blocknewsletter/mails/it/newsletter_conf.txt @@ -0,0 +1,6 @@ +Salve + +Grazie per esserti iscritto alla nostra newsletter + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blocknewsletter/mails/it/newsletter_voucher.html b/modules/blocknewsletter/mails/it/newsletter_voucher.html new file mode 100755 index 000000000..d65350f9a --- /dev/null +++ b/modules/blocknewsletter/mails/it/newsletter_voucher.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>Messaggio da {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Salve,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Iscrizione Newsletter</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Per quanto riguarda l'iscrizione alla newsletter, abbiamo il piacere di offrirvi il seguente buono: {discount}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered by <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/blocknewsletter/mails/it/newsletter_voucher.txt b/modules/blocknewsletter/mails/it/newsletter_voucher.txt new file mode 100755 index 000000000..5e494a6fd --- /dev/null +++ b/modules/blocknewsletter/mails/it/newsletter_voucher.txt @@ -0,0 +1,8 @@ +Salve + +Per quanto riguarda l'iscrizione alla newsletter, abbiamo il piacere di offrirvi il seguente buono: {discount} + +{shop_name} - {shop_url} + + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blockpaymentlogo/blockpaymentlogo.php b/modules/blockpaymentlogo/blockpaymentlogo.php new file mode 100644 index 000000000..c2940b128 --- /dev/null +++ b/modules/blockpaymentlogo/blockpaymentlogo.php @@ -0,0 +1,145 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockPaymentLogo extends Module +{ + public function __construct() + { + $this->name = 'blockpaymentlogo'; + $this->tab = 'front_office_features'; + $this->version = 0.2; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Block payment logo'); + $this->description = $this->l('Adds a block to display all payment logos.'); + } + + public function install() + { + Configuration::updateValue('PS_PAYMENT_LOGO_CMS_ID', 0); + if (!parent::install()) + return false; + if (!$this->registerHook('leftColumn')) + return false; + if (!$this->registerHook('header')) + return false; + return true; + } + + public function uninstall() + { + Configuration::deleteByName('PS_PAYMENT_LOGO_CMS_ID'); + return parent::uninstall(); + } + + public function getContent() + { + global $cookie; + + $html = ' + <h2>'.$this->l('Payment logo').'</h2> + '; + + if (Tools::isSubmit('submitConfiguration')) + if (Validate::isUnsignedInt(Tools::getValue('id_cms'))) + { + Configuration::updateValue('PS_PAYMENT_LOGO_CMS_ID', (int)(Tools::getValue('id_cms'))); + $html .= $this->displayConfirmation($this->l('Settings are updated')); + } + + $cmss = CMS::listCms((int)($cookie->id_lang)); + + if (!sizeof($cmss)) + $html .= $this->displayError($this->l('No CMS page is available')); + else + { + $html .= ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'/logo.gif" alt="" /> '.$this->l('Configure').'</legend> + <label>'.$this->l('Page CMS for link').':</label> + <div class="margin-form"> + <select name="id_cms"><option value="0">('.$this->l('Select a page').')</option>'; + foreach ($cmss as $cms) + $html .= '<option value="'.$cms['id_cms'].'"'.(Configuration::get('PS_PAYMENT_LOGO_CMS_ID') == $cms['id_cms'] ? ' selected="selected"' : '').'>'.$cms['meta_title'].'</option>'; + $html .= '</select> + </div> + <p class="center"><input class="button" type="submit" name="submitConfiguration" value="'.$this->l('Save settings').'" /></p> + </fieldset> + </form> + '; + } + return $html; + } + + /** + * Returns module content + * + * @param array $params Parameters + * @return string Content + */ + public function hookLeftColumn($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + + global $smarty, $cookie; + + if (!Configuration::get('PS_PAYMENT_LOGO_CMS_ID')) + return; + $cms = new CMS((int)(Configuration::get('PS_PAYMENT_LOGO_CMS_ID')), (int)($cookie->id_lang)); + if (!Validate::isLoadedObject($cms)) + return; + $smarty->assign('cms_payement_logo', $cms); + return $this->display(__FILE__, 'blockpaymentlogo.tpl'); + } + + public function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + public function hookFooter($params) + { + return $this->hookLeftColumn($params); + } + public function hookHeader($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + Tools::addCSS(($this->_path).'blockpaymentlogo.css', 'all'); + } + +} + + diff --git a/modules/blockpaymentlogo/blockpaymentlogo.tpl b/modules/blockpaymentlogo/blockpaymentlogo.tpl new file mode 100644 index 000000000..f5b766278 --- /dev/null +++ b/modules/blockpaymentlogo/blockpaymentlogo.tpl @@ -0,0 +1,35 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block payment logo module --> +<div id="paiement_logo_block_left" class="paiement_logo_block"> + <a href="{$link->getCMSLink($cms_payement_logo)}"> + <img src="{$img_dir}logo_paiement_visa.jpg" alt="visa" width="33" height="21" /> + <img src="{$img_dir}logo_paiement_mastercard.jpg" alt="mastercard" width="32" height="21" /> + <img src="{$img_dir}logo_paiement_paypal.jpg" alt="paypal" width="61" height="21" /> + </a> +</div> +<!-- /Block payment logo module --> \ No newline at end of file diff --git a/modules/blockpaymentlogo/config.xml b/modules/blockpaymentlogo/config.xml new file mode 100755 index 000000000..3a5f2c90b --- /dev/null +++ b/modules/blockpaymentlogo/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockpaymentlogo</name> + <displayName><![CDATA[Block payment logo]]></displayName> + <version><![CDATA[0.2]]></version> + <description><![CDATA[Adds a block to display all payment logos.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockpaymentlogo/de.php b/modules/blockpaymentlogo/de.php new file mode 100644 index 000000000..93499ac10 --- /dev/null +++ b/modules/blockpaymentlogo/de.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_1bd130f5640104712b3c7dec66b7b0a1'] = 'Block Zahlungslogo '; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8e27bf58ec687eea4b244d563dcbd8ac'] = 'Fügt einen Block mit allen Zahlungslogos hinzu'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8fc87743f34723d06ebff41629d2fdb5'] = 'Zahlungslogo'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_7ccf58c950043c9fbfed668df13ce608'] = 'Einstellungen werden aktualisiert'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d16dbbe71a327e22461456cfc5e7dfb2'] = 'Kein CMS Seite verfügbar'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_f1206f9fadc5ce41694f69129aecac26'] = 'Konfigurieren'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_4b3c34d991275b9fdb0facfcea561be9'] = ' CMS-Seite für Link'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_01bb71b3e70e9e5057c9678a903d47ac'] = 'wählen Sie eine Seite'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d4dccb8ca2dac4e53c01bd9954755332'] = 'Speichern Sie die Einstellungen'; + +?> \ No newline at end of file diff --git a/modules/blockpaymentlogo/en.php b/modules/blockpaymentlogo/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockpaymentlogo/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockpaymentlogo/es.php b/modules/blockpaymentlogo/es.php new file mode 100644 index 000000000..b896e7c6b --- /dev/null +++ b/modules/blockpaymentlogo/es.php @@ -0,0 +1,13 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_1bd130f5640104712b3c7dec66b7b0a1'] = 'Bloque de logos de pago'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8e27bf58ec687eea4b244d563dcbd8ac'] = 'Añadir un bloque para mostrar todos los logos de modos de pago'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8fc87743f34723d06ebff41629d2fdb5'] = 'Logos de pago'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_7ccf58c950043c9fbfed668df13ce608'] = 'Actualización correcta'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d16dbbe71a327e22461456cfc5e7dfb2'] = 'Página CMS no disponible'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_f1206f9fadc5ce41694f69129aecac26'] = 'Configure'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_4b3c34d991275b9fdb0facfcea561be9'] = 'Página CMS para enlaces'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_01bb71b3e70e9e5057c9678a903d47ac'] = 'Seleccionar una página'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d4dccb8ca2dac4e53c01bd9954755332'] = 'Guardar los parámetros'; diff --git a/modules/blockpaymentlogo/fr.php b/modules/blockpaymentlogo/fr.php new file mode 100644 index 000000000..edec44f3f --- /dev/null +++ b/modules/blockpaymentlogo/fr.php @@ -0,0 +1,13 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_1bd130f5640104712b3c7dec66b7b0a1'] = 'Bloc logo de paiement'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8e27bf58ec687eea4b244d563dcbd8ac'] = 'Ajoute un bloc affichant tous les logos des modes de paiement'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8fc87743f34723d06ebff41629d2fdb5'] = 'Logo de paiement'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d16dbbe71a327e22461456cfc5e7dfb2'] = 'Aucune page CMS est disponible'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_f1206f9fadc5ce41694f69129aecac26'] = 'Configurer'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_4b3c34d991275b9fdb0facfcea561be9'] = 'Page CMS pour le lien'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_01bb71b3e70e9e5057c9678a903d47ac'] = 'Choisir une page'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d4dccb8ca2dac4e53c01bd9954755332'] = 'Enregistrer'; diff --git a/modules/blockpaymentlogo/it.php b/modules/blockpaymentlogo/it.php new file mode 100644 index 000000000..f61270dce --- /dev/null +++ b/modules/blockpaymentlogo/it.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_1bd130f5640104712b3c7dec66b7b0a1'] = 'Blocco logo di pagamento '; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8e27bf58ec687eea4b244d563dcbd8ac'] = 'Aggiunge un blocco per visualizzare tutti i loghi pagamento'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_8fc87743f34723d06ebff41629d2fdb5'] = 'Logo di pagamento '; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_7ccf58c950043c9fbfed668df13ce608'] = 'Le impostazioni sono aggiornate'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d16dbbe71a327e22461456cfc5e7dfb2'] = 'Nessuna pagina CMS è disponibile'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_f1206f9fadc5ce41694f69129aecac26'] = 'Configura'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_4b3c34d991275b9fdb0facfcea561be9'] = 'Pagina CMS per link'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_01bb71b3e70e9e5057c9678a903d47ac'] = 'seleziona una pagina'; +$_MODULE['<{blockpaymentlogo}prestashop>blockpaymentlogo_d4dccb8ca2dac4e53c01bd9954755332'] = 'Salva impostazioni'; + +?> \ No newline at end of file diff --git a/modules/blockpaymentlogo/logo.gif b/modules/blockpaymentlogo/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..22c8df5a823c2415de710816cd31e407a1fc9a18 GIT binary patch literal 1063 zcmeH`=}(dY9DrZV8OzEe*I27fw`v{w!L^kwTa=;Frc)HPJn>k#Rx3h0GL;k$(%IB? zsTtxzi#*ayQ<Tsg2`Ke)ikZB!(vCG1_`z$V?2qVM&z`^F*`9DpSnzSW7vhC{sYN2L zcR^GXL`OqR3{a_|#X}Gq3vqEkqd|N;BqTs$BAh=D7cM|j5+o->N(!W=LV7yT>5R&O zE7b!jwMu5ac!kYoHIC-qm9X!>VLy~!YeKI#PplRf=QWS#w@l<enk?9`b@E%)rIJ>3 zjms@<Q<t`BIPE$<pI`PwUnbNG1cLHTLwV;c_nDC^nw#jLRXm@o==xaMJzv!`U)B4m z>cv8JpNZFR;=ROp118?U;@9?@idV%Jp-?eYYU}JA9v)VXaNEZg#bWX3=;-uVHFS4N zBoe7q+BNyvIwG2yni^Ct%jI%~LZMVDXJ%$Vl?Ez0s4~}7EO?&@@3W-p@9-fTPzH*k zfaZXD!%J4VT&-4v<}zrQpuGxOrdF#3-8GA@RHxH{K3A{TgP}-a{0XzSz<3jkCC=GA zqtR&5Xq<Bepqp~e7izIp!1y*yh+{1{_82#};a{HG&1TbAo8!k1%j$QF#e%P`S*_M} z+mhA(3%A=H4hN3o>+9>k|MPDO_&dErnb~w!c9vgW4vXOzPKk_0{2gvCTae#K0J6c~ zQ4qpU#3SGD^qI2+uiZx(va2qVvC6%L_67c?%5A%XQhP|JO{OvL5Vm<RCe*!V=OOC- zj)mSxL14kWtf;JmA_&V2>B`A!A8*=E`jjX`Ww)opI5lQY{boi(Ao*n55GDIv!@<P9 zb94+#^9f<!AyWH0L<VyClITFj#py<JZd4J08D7^Me8WBPfxnx~m$YN=*?bjgThoyo zXT(Y{nc_y+PW*KsvtldpR4mc6T7+<10_d+9%MA{bZ;*%2Zeld%aqlqA-sn8G&)ePA l)is#Y@RrvU+E+)+h>K7e$TeH{tk~-!8bvB$fF}Vt@dpTw`Tqa_ literal 0 HcmV?d00001 diff --git a/modules/blockpermanentlinks/blockpermanentlinks-header.tpl b/modules/blockpermanentlinks/blockpermanentlinks-header.tpl new file mode 100644 index 000000000..73bb61e9c --- /dev/null +++ b/modules/blockpermanentlinks/blockpermanentlinks-header.tpl @@ -0,0 +1,36 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block permanent links module HEADER --> +<ul id="header_links"> + <li id="header_link_contact"><a href="{$link->getPageLink('contact', true)}" title="{l s='contact' mod='blockpermanentlinks'}">{l s='contact' mod='blockpermanentlinks'}</a></li> + <li id="header_link_sitemap"><a href="{$link->getPageLink('sitemap')}" title="{l s='sitemap' mod='blockpermanentlinks'}">{l s='sitemap' mod='blockpermanentlinks'}</a></li> + <li id="header_link_bookmark"> + + <script type="text/javascript">writeBookmarkLink('{$come_from}', '{$meta_title|addslashes|addslashes}', '{l s='bookmark' mod='blockpermanentlinks'}');</script> + </li> +</ul> +<!-- /Block permanent links module HEADER --> diff --git a/modules/blockpermanentlinks/blockpermanentlinks.php b/modules/blockpermanentlinks/blockpermanentlinks.php new file mode 100644 index 000000000..cdcf64fbb --- /dev/null +++ b/modules/blockpermanentlinks/blockpermanentlinks.php @@ -0,0 +1,85 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockPermanentLinks extends Module +{ + function __construct() + { + $this->name = 'blockpermanentlinks'; + $this->tab = 'front_office_features'; + $this->version = 0.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Permanent links block'); + $this->description = $this->l('Adds a block that displays permanent links such as sitemap, contact, etc.'); + } + + function install() + { + return (parent::install() AND $this->registerHook('top') AND $this->registerHook('header')); + } + + /** + * Returns module content for header + * + * @param array $params Parameters + * @return string Content + */ + function hookTop($params) + { + return $this->display(__FILE__, 'blockpermanentlinks-header.tpl'); + } + + /** + * Returns module content for left column + * + * @param array $params Parameters + * @return string Content + */ + function hookLeftColumn($params) + { + return $this->display(__FILE__, 'blockpermanentlinks.tpl'); + } + + function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockpermanentlinks.css', 'all'); + } +} + + diff --git a/modules/blockpermanentlinks/blockpermanentlinks.tpl b/modules/blockpermanentlinks/blockpermanentlinks.tpl new file mode 100644 index 000000000..1db6b6fa8 --- /dev/null +++ b/modules/blockpermanentlinks/blockpermanentlinks.tpl @@ -0,0 +1,45 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block permanent links module --> +<div id="permanent_links"> + <!-- Sitemap --> + <div class="sitemap"> + <a href="{$link->getPageLink('sitemap')}"><img src="{$img_dir}icon/sitemap.gif" alt="{l s='sitemap' mod='blockpermanentlinks'}" title="{l s='sitemap' mod='blockpermanentlinks'}" /></a>&nbsp; + <a href="{$link->getPageLink('sitemap')}">{l s='sitemap' mod='blockpermanentlinks'}</a> + </div> + <!-- Contact --> + <div class="contact"> + <a href="{$link->getPageLink('contact', true)}"><img src="{$img_dir}icon/contact.gif" alt="{l s='contact' mod='blockpermanentlinks'}" title="{l s='contact' mod='blockpermanentlinks'}" /></a>&nbsp; + <a href="{$link->getPageLink('contact', true)}">{l s='contact' mod='blockpermanentlinks'}</a> + </div> + <!-- Bookmark --> + <div class="add_bookmark"> + <script type="text/javascript"> + writeBookmarkLink('{$come_from}', '{$shop_name|addslashes|addslashes}', '{l s='bookmark this page' mod='blockpermanentlinks'}', '{$img_dir}icon/star.gif');</script>&nbsp; + </div> +</div> +<!-- /Block permanent links module --> diff --git a/modules/blockpermanentlinks/config.xml b/modules/blockpermanentlinks/config.xml new file mode 100755 index 000000000..09a9ef3ab --- /dev/null +++ b/modules/blockpermanentlinks/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockpermanentlinks</name> + <displayName><![CDATA[Permanent links block]]></displayName> + <version><![CDATA[0.1]]></version> + <description><![CDATA[Adds a block that displays permanent links such as sitemap, contact, etc.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockpermanentlinks/de.php b/modules/blockpermanentlinks/de.php new file mode 100644 index 000000000..cb63020a7 --- /dev/null +++ b/modules/blockpermanentlinks/de.php @@ -0,0 +1,14 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'Kontakt'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_e1da49db34b0bdfdddaba2ad6552f848'] = 'Sitemap'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_fad9383ed4698856ed467fd49ecf4820'] = 'Bookmark'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_e1da49db34b0bdfdddaba2ad6552f848'] = 'Sitemap'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'Kontakt'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_05eb51862bc90ef24d04f3f1d8be5274'] = 'Bookmark auf diese Seite'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_39355c36cfd8f1d048a1f84803963534'] = 'Permanent Link-Block'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_3a3bf29ed9ddeb6210a731d2b1454df2'] = 'Fügt einen Block hinzu, der permanente Links anzeigt wie Sitemap, Kontakt, etc.'; + +?> \ No newline at end of file diff --git a/modules/blockpermanentlinks/en.php b/modules/blockpermanentlinks/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockpermanentlinks/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockpermanentlinks/es.php b/modules/blockpermanentlinks/es.php new file mode 100644 index 000000000..7ac6d558b --- /dev/null +++ b/modules/blockpermanentlinks/es.php @@ -0,0 +1,12 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'Contacto'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_e1da49db34b0bdfdddaba2ad6552f848'] = 'Mapa del sitio'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_fad9383ed4698856ed467fd49ecf4820'] = 'Favoritos'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_39355c36cfd8f1d048a1f84803963534'] = 'Bloque de enlaces permanentes'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_3a3bf29ed9ddeb6210a731d2b1454df2'] = 'Añadir un bloque que muestre los enlaces permanentes como mapa del sitio, contacto, etc.'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_e1da49db34b0bdfdddaba2ad6552f848'] = 'mapa del sitio'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'contacto'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_05eb51862bc90ef24d04f3f1d8be5274'] = 'añada esta página a favoritos'; diff --git a/modules/blockpermanentlinks/fr.php b/modules/blockpermanentlinks/fr.php new file mode 100644 index 000000000..bd23c2317 --- /dev/null +++ b/modules/blockpermanentlinks/fr.php @@ -0,0 +1,12 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'contact'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_e1da49db34b0bdfdddaba2ad6552f848'] = 'plan du site'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_fad9383ed4698856ed467fd49ecf4820'] = 'favoris'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_39355c36cfd8f1d048a1f84803963534'] = 'Bloc liens permanents'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_3a3bf29ed9ddeb6210a731d2b1454df2'] = 'Ajoute un bloc qui affiche des liens permanents (contact, plan du site...)'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_e1da49db34b0bdfdddaba2ad6552f848'] = 'plan du site'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'contact'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_05eb51862bc90ef24d04f3f1d8be5274'] = 'ajouter aux favoris'; diff --git a/modules/blockpermanentlinks/it.php b/modules/blockpermanentlinks/it.php new file mode 100644 index 000000000..6a24ff742 --- /dev/null +++ b/modules/blockpermanentlinks/it.php @@ -0,0 +1,14 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'contatto'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_e1da49db34b0bdfdddaba2ad6552f848'] = 'Mappa del sito'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks-header_fad9383ed4698856ed467fd49ecf4820'] = 'segnalibro'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_e1da49db34b0bdfdddaba2ad6552f848'] = 'Mappa del sito'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_2f8a6bf31f3bd67bd2d9720c58b19c9a'] = 'contatto'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_05eb51862bc90ef24d04f3f1d8be5274'] = 'Segna questa pagina'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_39355c36cfd8f1d048a1f84803963534'] = 'Blocco link permanenti'; +$_MODULE['<{blockpermanentlinks}prestashop>blockpermanentlinks_3a3bf29ed9ddeb6210a731d2b1454df2'] = 'Aggiunge un blocco che visualizza i link permanenti come mappa del sito, contatti, ecc'; + +?> \ No newline at end of file diff --git a/modules/blockpermanentlinks/logo.gif b/modules/blockpermanentlinks/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1e8373fcaa4d97591ebb3c15203b26f813d3cfc GIT binary patch literal 938 zcmV;b16BM-Nk%w1VGsZi0OwNx000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@<y}iD^zQ4b}z`(%4!NJ19!o$PE#KgqK#l^<P#>dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1<F+1c9K z+S}XP+}zyV-QC{a-rwKf;Nall;o;)q;^X7v<mBY#<>lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^s6Va%Ew3Wn>_CX>@2HM@dak03rDV0SW;B04x9i000mG5C8xOasdAc z97wRB!Gj1BDqJYAkS9I@`FJX1kVzzT-GT+$ldT)ENK6RMsfJ}q8A*A{EWv_m&OjN0 z1pesdOjxTQ0tLw!c;=s!AV#7@F%m?|zn%k|G*ad2QXD*&T&Zf*q@WTqYt{(NN=6C8 MuVBN9{TdJeJJ%z<2LJ#7 literal 0 HcmV?d00001 diff --git a/modules/blockrss/blockrss.php b/modules/blockrss/blockrss.php new file mode 100644 index 000000000..3614b38fa --- /dev/null +++ b/modules/blockrss/blockrss.php @@ -0,0 +1,167 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +include_once(_PS_CLASS_DIR_.'../tools/pear/PEAR.php'); +include_once(_PS_PEAR_XML_PARSER_PATH_.'Parser.php'); + +class Blockrss extends Module +{ + function __construct() + { + $this->name = 'blockrss'; + $this->tab = 'front_office_features'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('RSS feed block'); + $this->description = $this->l('Adds a block displaying an RSS feed.'); + + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->error = false; + $this->valid = false; + } + + function install() + { + Configuration::updateValue('RSS_FEED_TITLE', $this->l('RSS feed')); + Configuration::updateValue('RSS_FEED_NBR', 5); + if (parent::install() == false OR $this->registerHook('leftColumn') == false OR $this->registerHook('header') == false) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + + if (Tools::isSubmit('submitBlockRss')) + { + $urlfeed = strval(Tools::getValue('urlfeed')); + $title = strval(Tools::getValue('title')); + $nbr = (int)(Tools::getValue('nbr')); + if ($urlfeed AND !Validate::isUrl($urlfeed)) + $errors[] = $this->l('Invalid feed URL'); + elseif (!$title OR empty($title) OR !Validate::isGenericName($title)) + $errors[] = $this->l('Invalid title'); + elseif (!$nbr OR $nbr <= 0 OR !Validate::isInt($nbr)) + $errors[] = $this->l('Invalid number of feeds'); + else + { + if (stristr($urlfeed, $_SERVER['HTTP_HOST'].__PS_BASE_URI__)) + $errors[] = $this->l('Error: You have selected a feed URL on your own website. Please choose another URL (eg. http://news.google.com/?output=rss).'); + + Configuration::updateValue('RSS_FEED_URL', $urlfeed); + Configuration::updateValue('RSS_FEED_TITLE', $title); + Configuration::updateValue('RSS_FEED_NBR', $nbr); + } + if (isset($errors) AND sizeof($errors)) + $output .= $this->displayError(implode('<br />', $errors)); + else + $output .= $this->displayConfirmation($this->l('Settings updated')); + } + else + { + $errors = array(); + if (stristr(Configuration::get('RSS_FEED_URL'), $_SERVER['HTTP_HOST'].__PS_BASE_URI__)) + $errors[] = $this->l('Error: You have selected a feed URL on your own website. Please choose another URL (eg. http://news.google.com/?output=rss).'); + + if (sizeof($errors)) + $output .= $this->displayError(implode('<br />', $errors)); + } + + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Block title').'</label> + <div class="margin-form"> + <input type="text" name="title" value="'.htmlentities(Tools::getValue('title', Configuration::get('RSS_FEED_TITLE'))).'" /> + <p class="clear">'.$this->l('Create a title for the block (default: \'RSS feed\')').'</p> + + </div> + <label>'.$this->l('Add a feed URL').'</label> + <div class="margin-form"> + <input type="text" size="85" name="urlfeed" value="'.htmlentities(Tools::getValue('urlfeed', Configuration::get('RSS_FEED_URL'))).'" /> + <p class="clear">'.$this->l('Add the URL of the feed you want to use').'</p> + + </div> + <label>'.$this->l('Number of threads displayed').'</label> + <div class="margin-form"> + <input type="text" size="5" name="nbr" value="'.(int)Tools::getValue('nbr', Configuration::get('RSS_FEED_NBR')).'" /> + <p class="clear">'.$this->l('Number of threads displayed by the block (default value: 5)').'</p> + + </div> + <center><input type="submit" name="submitBlockRss" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + function hookLeftColumn($params) + { + global $smarty; + + // Conf + $title = strval(Configuration::get('RSS_FEED_TITLE')); + $url = strval(Configuration::get('RSS_FEED_URL')); + $nb = (int)(Configuration::get('RSS_FEED_NBR')); + + // Getting data + $rss_links = array(); + if ($url && ($contents = @file_get_contents($url))) + if (@$src = new XML_Feed_Parser($contents)) + for ($i = 0; $i < ($nb ? $nb : 5); $i++) + if (@$item = $src->getEntryByOffset($i)) + $rss_links[] = array('title' => $item->title, 'url' => $item->link); + + // Display smarty + $smarty->assign(array('title' => ($title ? $title : $this->l('RSS feed')), 'rss_links' => $rss_links)); + + return $this->display(__FILE__, 'blockrss.tpl'); + } + + function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockrss.css', 'all'); + } +} + + diff --git a/modules/blockrss/blockrss.tpl b/modules/blockrss/blockrss.tpl new file mode 100644 index 000000000..3a5b0456b --- /dev/null +++ b/modules/blockrss/blockrss.tpl @@ -0,0 +1,42 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block RSS module--> +<div id="rss_block_left" class="block"> + <h4>{$title}</h4> + <div class="block_content"> + {if $rss_links} + <ul> + {foreach from=$rss_links item='rss_link'} + <li><a href="{$rss_link.url}">{$rss_link.title}</a></li> + {/foreach} + </ul> + {else} + {l s='No RSS feed added' mod='blockrss'} + {/if} + </div> +</div> +<!-- /Block RSS module--> diff --git a/modules/blockrss/config.xml b/modules/blockrss/config.xml new file mode 100755 index 000000000..899e7be8d --- /dev/null +++ b/modules/blockrss/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockrss</name> + <displayName><![CDATA[RSS feed block]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Adds a block displaying an RSS feed.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockrss/de.php b/modules/blockrss/de.php new file mode 100644 index 000000000..156efab28 --- /dev/null +++ b/modules/blockrss/de.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockrss}prestashop>blockrss_10fd25dcd3353c0ba3731d4a23657f2e'] = 'Kein RSS Feed hinzugefügt'; +$_MODULE['<{blockrss}prestashop>blockrss_2516c13a12d3dbaf4efa88d9fce2e7da'] = 'RSS-Feed-Block'; +$_MODULE['<{blockrss}prestashop>blockrss_04396664ce529aa4204b0f7ad753fad1'] = 'Fügt einen Block hinzu, der ein RSS-Feed anzeigt'; +$_MODULE['<{blockrss}prestashop>blockrss_9680162225162baf2a085dfdc2814deb'] = 'RSS-Feed'; +$_MODULE['<{blockrss}prestashop>blockrss_6706b6d8ba45cc4f0eda0506ba1dc3c8'] = 'Ungültige Feed-URL'; +$_MODULE['<{blockrss}prestashop>blockrss_36ed65ce17306e812fd68d9f634c0c57'] = 'Ungültiger Titel'; +$_MODULE['<{blockrss}prestashop>blockrss_1b3d34e25aef32a3c8daddfff856577f'] = 'Ungültige Anzahl von RSS-Feeds'; +$_MODULE['<{blockrss}prestashop>blockrss_606a95aefd4296583b685aa039f01681'] = 'Sie haben eine Feed-URL auf Ihrer eigenen Website ausgewählt, dies ist wahrscheinlich ein Fehler! Wählen Sie eine andere URL (zB http://news.google.com/?output=rss), bis Sie wissen, was Sie wünschen'; +$_MODULE['<{blockrss}prestashop>blockrss_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blockrss}prestashop>blockrss_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockrss}prestashop>blockrss_b22c8f9ad7db023c548c3b8e846cb169'] = 'Block Titel'; +$_MODULE['<{blockrss}prestashop>blockrss_2343a40bdffd8c7a6317b6d98c2b1042'] = 'Erstellen Sie einen Titel für den Block (Standard: \'RSS-Feed\')'; +$_MODULE['<{blockrss}prestashop>blockrss_402d00ca8e4f0fff26fc24ee9ab8e82b'] = 'Fügen Sie einen Feed-URL hinzu'; +$_MODULE['<{blockrss}prestashop>blockrss_eb26a56cc4c9ae20bc55c887773bddfd'] = 'Fügen Sie die URL des Feeds hinzu, die Sie verwenden möchten'; +$_MODULE['<{blockrss}prestashop>blockrss_ff9aa540e20285875ac8b190a3cb7ccf'] = 'Anzahl der angezeigten Threads'; +$_MODULE['<{blockrss}prestashop>blockrss_f33725e23a017705ad35897e849a4db4'] = 'Anzahl der im Block angezeigten Threads (Standardwert: 5)'; +$_MODULE['<{blockrss}prestashop>blockrss_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockrss/en.php b/modules/blockrss/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockrss/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockrss/es.php b/modules/blockrss/es.php new file mode 100644 index 000000000..82b1829a3 --- /dev/null +++ b/modules/blockrss/es.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockrss}prestashop>blockrss_2516c13a12d3dbaf4efa88d9fce2e7da'] = 'Bloque fuentes RSS'; +$_MODULE['<{blockrss}prestashop>blockrss_04396664ce529aa4204b0f7ad753fad1'] = 'Añadir o bloquear con un campo de búsqueda rápida'; +$_MODULE['<{blockrss}prestashop>blockrss_9680162225162baf2a085dfdc2814deb'] = 'fuentes RSS'; +$_MODULE['<{blockrss}prestashop>blockrss_6706b6d8ba45cc4f0eda0506ba1dc3c8'] = 'URL de fuente incorrecta'; +$_MODULE['<{blockrss}prestashop>blockrss_36ed65ce17306e812fd68d9f634c0c57'] = 'Título incorrecto'; +$_MODULE['<{blockrss}prestashop>blockrss_1b3d34e25aef32a3c8daddfff856577f'] = 'Número de fuentes incorrecto'; +$_MODULE['<{blockrss}prestashop>blockrss_606a95aefd4296583b685aa039f01681'] = 'Ha seleccionado un flujo RSS de su propio sitio Web, sin duda se trata de un error. Elija otro URL (ej: http://news.google.com/?output=rss) excepto si está seguro de su acción.'; +$_MODULE['<{blockrss}prestashop>blockrss_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blockrss}prestashop>blockrss_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blockrss}prestashop>blockrss_b22c8f9ad7db023c548c3b8e846cb169'] = 'Título del bloque'; +$_MODULE['<{blockrss}prestashop>blockrss_2343a40bdffd8c7a6317b6d98c2b1042'] = 'Cree un título para el bloque (por defecto\'RSS feed\')'; +$_MODULE['<{blockrss}prestashop>blockrss_402d00ca8e4f0fff26fc24ee9ab8e82b'] = 'Añadir URL de la fuente '; +$_MODULE['<{blockrss}prestashop>blockrss_eb26a56cc4c9ae20bc55c887773bddfd'] = 'Añadir URL de la fuente que no desea usar'; +$_MODULE['<{blockrss}prestashop>blockrss_ff9aa540e20285875ac8b190a3cb7ccf'] = 'Número de hilos mostrados'; +$_MODULE['<{blockrss}prestashop>blockrss_f33725e23a017705ad35897e849a4db4'] = 'Número de hilos mostrados en cada bloque (por defecto 5)'; +$_MODULE['<{blockrss}prestashop>blockrss_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockrss}prestashop>blockrss_10fd25dcd3353c0ba3731d4a23657f2e'] = 'No se han añadido fuentes RSS'; diff --git a/modules/blockrss/fr.php b/modules/blockrss/fr.php new file mode 100644 index 000000000..a4d2712eb --- /dev/null +++ b/modules/blockrss/fr.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockrss}prestashop>blockrss_2516c13a12d3dbaf4efa88d9fce2e7da'] = 'Bloc flux RSS'; +$_MODULE['<{blockrss}prestashop>blockrss_04396664ce529aa4204b0f7ad753fad1'] = 'Ajoute un bloc avec les messages d\'un flux RSS'; +$_MODULE['<{blockrss}prestashop>blockrss_9680162225162baf2a085dfdc2814deb'] = 'Flux RSS'; +$_MODULE['<{blockrss}prestashop>blockrss_6706b6d8ba45cc4f0eda0506ba1dc3c8'] = 'URL du flux invalide'; +$_MODULE['<{blockrss}prestashop>blockrss_36ed65ce17306e812fd68d9f634c0c57'] = 'Titre invalide'; +$_MODULE['<{blockrss}prestashop>blockrss_1b3d34e25aef32a3c8daddfff856577f'] = 'Nombre de flux invalide'; +$_MODULE['<{blockrss}prestashop>blockrss_606a95aefd4296583b685aa039f01681'] = 'Vous avez sélectionné une flux RSS de votre propre site, il s\'agit très probablement d\'une erreur ! Choisissez une autre URL (ex : http://news.google.com/?output=rss) sauf si vous êtes sûr de votre action'; +$_MODULE['<{blockrss}prestashop>blockrss_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blockrss}prestashop>blockrss_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blockrss}prestashop>blockrss_b22c8f9ad7db023c548c3b8e846cb169'] = 'Titre du bloc'; +$_MODULE['<{blockrss}prestashop>blockrss_2343a40bdffd8c7a6317b6d98c2b1042'] = 'Créez un titre pour le block (par défaut : \'Flux RSS\')'; +$_MODULE['<{blockrss}prestashop>blockrss_402d00ca8e4f0fff26fc24ee9ab8e82b'] = 'Ajouter une URL'; +$_MODULE['<{blockrss}prestashop>blockrss_eb26a56cc4c9ae20bc55c887773bddfd'] = 'Ajouter l\'url du flux que vous souhaitez utiliser'; +$_MODULE['<{blockrss}prestashop>blockrss_ff9aa540e20285875ac8b190a3cb7ccf'] = 'Nombre de messages affichés'; +$_MODULE['<{blockrss}prestashop>blockrss_f33725e23a017705ad35897e849a4db4'] = 'Nombre de messages affichés par le bloc (défaut : 5)'; +$_MODULE['<{blockrss}prestashop>blockrss_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{blockrss}prestashop>blockrss_10fd25dcd3353c0ba3731d4a23657f2e'] = 'Aucun flux RSS ajouté'; diff --git a/modules/blockrss/it.php b/modules/blockrss/it.php new file mode 100644 index 000000000..ae2e213e8 --- /dev/null +++ b/modules/blockrss/it.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockrss}prestashop>blockrss_10fd25dcd3353c0ba3731d4a23657f2e'] = 'Nessun RSS feed aggiunto'; +$_MODULE['<{blockrss}prestashop>blockrss_2516c13a12d3dbaf4efa88d9fce2e7da'] = 'Blocco RSS feed '; +$_MODULE['<{blockrss}prestashop>blockrss_04396664ce529aa4204b0f7ad753fad1'] = 'Aggiunge un blocco che visualizza un RSS feed '; +$_MODULE['<{blockrss}prestashop>blockrss_9680162225162baf2a085dfdc2814deb'] = 'RSS feed'; +$_MODULE['<{blockrss}prestashop>blockrss_6706b6d8ba45cc4f0eda0506ba1dc3c8'] = 'URL del feed non valido'; +$_MODULE['<{blockrss}prestashop>blockrss_36ed65ce17306e812fd68d9f634c0c57'] = 'Titolo non valido '; +$_MODULE['<{blockrss}prestashop>blockrss_1b3d34e25aef32a3c8daddfff856577f'] = 'Numero non valido di feed'; +$_MODULE['<{blockrss}prestashop>blockrss_606a95aefd4296583b685aa039f01681'] = 'Hai scelto un URL del feed sul tuo sito web, questo è probabilmente un errore! Scegli un altro URL (es. http://news.google.com/?output=rss) finché non sai cosa fare'; +$_MODULE['<{blockrss}prestashop>blockrss_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockrss}prestashop>blockrss_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockrss}prestashop>blockrss_b22c8f9ad7db023c548c3b8e846cb169'] = 'Titolo blocco'; +$_MODULE['<{blockrss}prestashop>blockrss_2343a40bdffd8c7a6317b6d98c2b1042'] = 'Crea un titolo per il blocco (default: \'RSS\')'; +$_MODULE['<{blockrss}prestashop>blockrss_402d00ca8e4f0fff26fc24ee9ab8e82b'] = 'Aggiungi un URL del feed'; +$_MODULE['<{blockrss}prestashop>blockrss_eb26a56cc4c9ae20bc55c887773bddfd'] = 'Aggiungi l\'URL del feed che vuoi utilizzare'; +$_MODULE['<{blockrss}prestashop>blockrss_ff9aa540e20285875ac8b190a3cb7ccf'] = 'Numero di thread visualizzati'; +$_MODULE['<{blockrss}prestashop>blockrss_f33725e23a017705ad35897e849a4db4'] = 'Il numero di thread visualizzati dal blocco (valore di default: 5)'; +$_MODULE['<{blockrss}prestashop>blockrss_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockrss/logo.gif b/modules/blockrss/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a5e0099f7522ee53c55350a42a41c1018feaeea GIT binary patch literal 1009 zcmeH`=}Xgb0Ed6(%oUR6Jn|rqkW9o(E7YVs$}6*pcp|3rKyn_7G%=#-h8N2Y6R%vR z=8<JH#FNUYp^2Eik@8KXBLflC)b_i+pYo6BT_2wJ4?OS*4G;10O*5m+s0xZgs5!z# zh!i181hEJ)7KpV#q6LyIA+bcJ6{J?kv&Ic;+&aRB>L9m4g$=4~anBYHZ1Knrb@pg< z(AW6V_x+%Dp&$Cwwdd)_7tnSbo$lyzN3REZJ?XkYraqWy2xgitF;7C7mM}&gf%;f9 z#Gx?(O$lgDggO~dQ`pu>wk?WzCT2UtTvrU*u5mrF+>1D_H=cWy#J^7F-=v^D70=Vr znU3yEwl5#O+33sR2U7V#2^q?OCKvsAWF(7>Ws|qp$-5l9m$LmbcHkxkWEhmOL&X>_ z#7Gf0T7t1+Xmg>>!$dwN3&=zf#&2Wd4yNw%<7ND$5+CIJbOk?Mg_$zUC@`zUTsfIl zVZM^g*Ksq=Sg686HUFubEcTGaKJraVmZykrj{N*g*1nL96|%X4O&zv$*jXjpYuH)C z?mB+2L%#w27U*AKw!!Rx)r0#B4W0uC^?(1qfD<h+q$pF$eNVOb2}(FmISB2;G_6{N zP;|&bt4XUgJ$gD>6Oa}p5IQeqOKX3qY`oG&3;MlWsuijvjc2q(Ia6bQCZoesrYsen zP23g+d3Rn_+ZE~kot!QjRC>qn&poU&o~!pM%o?`YG%T&~x?<8p2d|o`-70r|zNb!( z8=bsta-igx@pOx?>ms$ZAqg<@h!9kr5_E|jPbev)j|<Lnfm?X>#)3={q7u3INyl6F rQ3BVna-qR;yRpjJBjKeu`fH%V=%Bfyk6133Q<P*nF08pIfI9aFStfGK literal 0 HcmV?d00001 diff --git a/modules/blocksearch/blocksearch-top.tpl b/modules/blocksearch/blocksearch-top.tpl new file mode 100644 index 000000000..f97391cb3 --- /dev/null +++ b/modules/blocksearch/blocksearch-top.tpl @@ -0,0 +1,135 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7331 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block search module TOP --> +<div id="search_block_top"> + + <form method="get" action="{$link->getPageLink('search')}" id="searchbox"> + <p> + <label for="search_query_top"><!-- image on background --></label> + <input type="hidden" name="orderby" value="position" /> + <input type="hidden" name="controller" value="search" /> + <input type="hidden" name="orderway" value="desc" /> + <input class="search_query" type="text" id="search_query_top" name="search_query" value="{if isset($smarty.get.search_query)}{$smarty.get.search_query|htmlentities:$ENT_QUOTES:'utf-8'|stripslashes}{/if}" /> + <input type="submit" name="submit_search" value="{l s='Search' mod='blocksearch'}" class="button" /> + </p> + </form> +</div> +{if $instantsearch} + <script type="text/javascript"> + // <![CDATA[ + {literal} + function tryToCloseInstantSearch() { + if ($('#old_center_column').length > 0) + { + $('#center_column').remove(); + $('#old_center_column').attr('id', 'center_column'); + $('#center_column').show(); + return false; + } + } + + instantSearchQueries = new Array(); + function stopInstantSearchQueries(){ + for(i=0;i<instantSearchQueries.length;i++) { + instantSearchQueries[i].abort(); + } + instantSearchQueries = new Array(); + } + + $("#search_query_top").keyup(function(){ + if($(this).val().length > 0){ + stopInstantSearchQueries(); + instantSearchQuery = $.ajax({ + url: '{/literal}{if $search_ssl == 1}{$link->getPageLink('search', true)}{else}{$link->getPageLink('search')}{/if}{literal}', + data: 'instantSearch=1&id_lang={/literal}{$cookie->id_lang}{literal}&q='+$(this).val(), + dataType: 'html', + success: function(data){ + if($("#search_query_top").val().length > 0) + { + tryToCloseInstantSearch(); + $('#center_column').attr('id', 'old_center_column'); + $('#old_center_column').after('<div id="center_column">'+data+'</div>'); + $('#old_center_column').hide(); + $("#instant_search_results a.close").click(function() { + $("#search_query_top").val(''); + return tryToCloseInstantSearch(); + }); + return false; + } + else + tryToCloseInstantSearch(); + } + }); + instantSearchQueries.push(instantSearchQuery); + } + else + tryToCloseInstantSearch(); + }); + // ]]> + {/literal} + </script> +{/if} + +{if $ajaxsearch} + <script type="text/javascript"> + // <![CDATA[ + {literal} + $('document').ready( function() { + $("#search_query_top") + .autocomplete( + '{/literal}{if $search_ssl == 1}{$link->getPageLink('search', true)}{else}{$link->getPageLink('search')}{/if}{literal}', { + minChars: 3, + max: 10, + width: 500, + selectFirst: false, + scroll: false, + dataType: "json", + formatItem: function(data, i, max, value, term) { + return value; + }, + parse: function(data) { + var mytab = new Array(); + for (var i = 0; i < data.length; i++) + mytab[mytab.length] = { data: data[i], value: data[i].cname + ' > ' + data[i].pname }; + return mytab; + }, + extraParams: { + ajaxSearch: 1, + id_lang: {/literal}{$cookie->id_lang}{literal} + } + } + ) + .result(function(event, data, formatted) { + $('#search_query_top').val(data.pname); + document.location.href = data.product_link; + }) + }); + {/literal} + // ]]> + </script> +{/if} +<!-- /Block search module TOP --> diff --git a/modules/blocksearch/blocksearch.php b/modules/blocksearch/blocksearch.php new file mode 100644 index 000000000..1f5e24795 --- /dev/null +++ b/modules/blocksearch/blocksearch.php @@ -0,0 +1,101 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockSearch extends Module +{ + public function __construct() + { + $this->name = 'blocksearch'; + $this->tab = 'search_filter'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Quick Search block'); + $this->description = $this->l('Adds a block with a quick search field.'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('top') + OR !$this->registerHook('leftColumn') + OR !$this->registerHook('rightColumn') + ) + return false; + return true; + } + + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookRightColumn($params) + { + $this->_hookCommon($params); + return $this->display(__FILE__, 'blocksearch.tpl'); + } + + public function hookTop($params) + { + $this->_hookCommon($params); + return $this->display(__FILE__, 'blocksearch-top.tpl'); + } + + /** + * _hookAll has to be called in each hookXXX methods. This is made to avoid code duplication. + * + * @param mixed $params + * @return void + */ + private function _hookCommon($params) + { + global $smarty; + $smarty->assign('ENT_QUOTES', ENT_QUOTES); + $smarty->assign('search_ssl', (int)(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')); + + $ajaxSearch=(int)(Configuration::get('PS_SEARCH_AJAX')); + $smarty->assign('ajaxsearch', $ajaxSearch); + + $instantSearch = (int)(Configuration::get('PS_INSTANT_SEARCH')); + $smarty->assign('instantsearch', $instantSearch); + if ($ajaxSearch) + { + Tools::addCSS(_PS_CSS_DIR_.'jquery.autocomplete.css'); + Tools::addJS(_PS_JS_DIR_.'jquery/jquery.autocomplete.js'); + } + Tools::addCSS(_THEME_CSS_DIR_.'product_list.css'); + Tools::addCSS(($this->_path).'blocksearch.css', 'all'); + return true; + } +} diff --git a/modules/blocksearch/blocksearch.tpl b/modules/blocksearch/blocksearch.tpl new file mode 100644 index 000000000..4b31f0101 --- /dev/null +++ b/modules/blocksearch/blocksearch.tpl @@ -0,0 +1,135 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7331 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block search module --> +<div id="search_block_left" class="block exclusive"> + <h4>{l s='Search' mod='blocksearch'}</h4> + <form method="get" action="{$link->getPageLink('search', true)}" id="searchbox"> + <p class="block_content"> + <label for="search_query_block">{l s='Enter a product name' mod='blocksearch'}</label> + <input type="hidden" name="orderby" value="position" /> + <input type="hidden" name="controller" value="search" /> + <input type="hidden" name="orderway" value="desc" /> + <input class="search_query" type="text" id="search_query_block" name="search_query" value="{if isset($smarty.get.search_query)}{$smarty.get.search_query|htmlentities:$ENT_QUOTES:'utf-8'|stripslashes}{/if}" /> + <input type="submit" id="search_button" class="button_mini" value="{l s='go' mod='blocksearch'}" /> + </p> + </form> +</div> +{if $instantsearch} + <script type="text/javascript"> + // <![CDATA[ + {literal} + function tryToCloseInstantSearch() { + if ($('#old_center_column').length > 0) + { + $('#center_column').remove(); + $('#old_center_column').attr('id', 'center_column'); + $('#center_column').show(); + return false; + } + } + + instantSearchQueries = new Array(); + function stopInstantSearchQueries(){ + for(i=0;i<instantSearchQueries.length;i++) { + instantSearchQueries[i].abort(); + } + instantSearchQueries = new Array(); + } + + $("#search_query_block").keyup(function(){ + if($(this).val().length > 0){ + stopInstantSearchQueries(); + instantSearchQuery = $.ajax({ + url: '{/literal}{if $search_ssl == 1}{$link->getPageLink('search', true)}{else}{$link->getPageLink('search')}{/if}{literal}', + data: 'instantSearch=1&id_lang={/literal}{$cookie->id_lang}{literal}&q='+$(this).val(), + dataType: 'html', + success: function(data){ + if($("#search_query_block").val().length > 0) + { + tryToCloseInstantSearch(); + $('#center_column').attr('id', 'old_center_column'); + $('#old_center_column').after('<div id="center_column">'+data+'</div>'); + $('#old_center_column').hide(); + $("#instant_search_results a.close").click(function() { + $("#search_query_block").val(''); + return tryToCloseInstantSearch(); + }); + return false; + } + else + tryToCloseInstantSearch(); + } + }); + instantSearchQueries.push(instantSearchQuery); + } + else + tryToCloseInstantSearch(); + }); + // ]]> + {/literal} + </script> +{/if} + +{if $ajaxsearch} + <script type="text/javascript"> + // <![CDATA[ + {literal} + $('document').ready( function() { + $("#search_query_block") + .autocomplete( + '{/literal}{if $search_ssl == 1}{$link->getPageLink('search', true)}{else}{$link->getPageLink('search')}{/if}{literal}', { + minChars: 3, + max: 10, + width: 500, + selectFirst: false, + scroll: false, + dataType: "json", + formatItem: function(data, i, max, value, term) { + return value; + }, + parse: function(data) { + var mytab = new Array(); + for (var i = 0; i < data.length; i++) + mytab[mytab.length] = { data: data[i], value: data[i].cname + ' > ' + data[i].pname }; + return mytab; + }, + extraParams: { + ajaxSearch: 1, + id_lang: {/literal}{$cookie->id_lang}{literal} + } + } + ) + .result(function(event, data, formatted) { + $('#search_query_block').val(data.pname); + document.location.href = data.product_link; + }) + }); + {/literal} + // ]]> + </script> +{/if} +<!-- /Block search module --> diff --git a/modules/blocksearch/config.xml b/modules/blocksearch/config.xml new file mode 100755 index 000000000..f0b42ddea --- /dev/null +++ b/modules/blocksearch/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocksearch</name> + <displayName><![CDATA[Quick Search block]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Adds a block with a quick search field.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[search_filter]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocksearch/de.php b/modules/blocksearch/de.php new file mode 100644 index 000000000..90ab57279 --- /dev/null +++ b/modules/blocksearch/de.php @@ -0,0 +1,12 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksearch}prestashop>blocksearch-top_13348442cc6a27032d2b4aa28b75a5d3'] = 'Suche'; +$_MODULE['<{blocksearch}prestashop>blocksearch_13348442cc6a27032d2b4aa28b75a5d3'] = 'Suche'; +$_MODULE['<{blocksearch}prestashop>blocksearch_52d578d063d6101bbdae388ece037e60'] = 'Geben Sie einen Produktnamen ein'; +$_MODULE['<{blocksearch}prestashop>blocksearch_34d1f91fb2e514b8576fab1a75a89a6b'] = 'los'; +$_MODULE['<{blocksearch}prestashop>blocksearch_31a0c03d7fbd1dc61d3b8e02760e703b'] = 'Quick Search Block'; +$_MODULE['<{blocksearch}prestashop>blocksearch_99e20473c0bf3c22d7420eff03ce66c3'] = 'Fügt einen Block mit einem Quick Search Feld hinzu'; + +?> \ No newline at end of file diff --git a/modules/blocksearch/en.php b/modules/blocksearch/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocksearch/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocksearch/es.php b/modules/blocksearch/es.php new file mode 100644 index 000000000..2703c07c4 --- /dev/null +++ b/modules/blocksearch/es.php @@ -0,0 +1,10 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksearch}prestashop>blocksearch-top_13348442cc6a27032d2b4aa28b75a5d3'] = 'Buscar'; +$_MODULE['<{blocksearch}prestashop>blocksearch_31a0c03d7fbd1dc61d3b8e02760e703b'] = 'Bloque de búsqueda rápida'; +$_MODULE['<{blocksearch}prestashop>blocksearch_99e20473c0bf3c22d7420eff03ce66c3'] = 'Añada u bloque con un campo de búsqueda rápida'; +$_MODULE['<{blocksearch}prestashop>blocksearch_13348442cc6a27032d2b4aa28b75a5d3'] = 'Buscar'; +$_MODULE['<{blocksearch}prestashop>blocksearch_52d578d063d6101bbdae388ece037e60'] = 'Introduzca el nombre del producto'; +$_MODULE['<{blocksearch}prestashop>blocksearch_34d1f91fb2e514b8576fab1a75a89a6b'] = 'buscar'; diff --git a/modules/blocksearch/fr.php b/modules/blocksearch/fr.php new file mode 100644 index 000000000..39c775ffd --- /dev/null +++ b/modules/blocksearch/fr.php @@ -0,0 +1,10 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksearch}prestashop>blocksearch-top_13348442cc6a27032d2b4aa28b75a5d3'] = 'Rechercher'; +$_MODULE['<{blocksearch}prestashop>blocksearch_31a0c03d7fbd1dc61d3b8e02760e703b'] = 'Bloc recherche rapide'; +$_MODULE['<{blocksearch}prestashop>blocksearch_99e20473c0bf3c22d7420eff03ce66c3'] = 'Ajoute un bloc avec un champ de recherche rapide'; +$_MODULE['<{blocksearch}prestashop>blocksearch_13348442cc6a27032d2b4aa28b75a5d3'] = 'Rechercher'; +$_MODULE['<{blocksearch}prestashop>blocksearch_52d578d063d6101bbdae388ece037e60'] = 'Entrez un nom de produit'; +$_MODULE['<{blocksearch}prestashop>blocksearch_34d1f91fb2e514b8576fab1a75a89a6b'] = 'ok'; diff --git a/modules/blocksearch/it.php b/modules/blocksearch/it.php new file mode 100644 index 000000000..d60ebc0b2 --- /dev/null +++ b/modules/blocksearch/it.php @@ -0,0 +1,12 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksearch}prestashop>blocksearch-top_13348442cc6a27032d2b4aa28b75a5d3'] = 'Cerca'; +$_MODULE['<{blocksearch}prestashop>blocksearch_13348442cc6a27032d2b4aa28b75a5d3'] = 'Cerca'; +$_MODULE['<{blocksearch}prestashop>blocksearch_52d578d063d6101bbdae388ece037e60'] = 'Inserisci il nome di un prodotto'; +$_MODULE['<{blocksearch}prestashop>blocksearch_34d1f91fb2e514b8576fab1a75a89a6b'] = 'Vai'; +$_MODULE['<{blocksearch}prestashop>blocksearch_31a0c03d7fbd1dc61d3b8e02760e703b'] = 'Blocco ricerca rapida '; +$_MODULE['<{blocksearch}prestashop>blocksearch_99e20473c0bf3c22d7420eff03ce66c3'] = 'Aggiunge un blocco con un campo di ricerca rapida'; + +?> \ No newline at end of file diff --git a/modules/blocksearch/logo.gif b/modules/blocksearch/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf3d97f75e9cde9c143980d89272fe61fc2d64ee GIT binary patch literal 615 zcmV-t0+{`YP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz`AI}UR5;6} zlD}({VGzf^?~f!#tf`u$5Q9JHQ1uTGDng(|aLClHAP#~!RCnFF2#yY>gNuvOO$0ks zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+ z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8 z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@! zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0 B3<CfF literal 0 HcmV?d00001 diff --git a/modules/blockspecials/blockspecials.php b/modules/blockspecials/blockspecials.php new file mode 100644 index 000000000..a13b9aa46 --- /dev/null +++ b/modules/blockspecials/blockspecials.php @@ -0,0 +1,113 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockSpecials extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + function __construct() + { + $this->name = 'blockspecials'; + $this->tab = 'pricing_promotion'; + $this->version = 0.8; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Specials block'); + $this->description = $this->l('Adds a block with current product specials.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('rightColumn') AND $this->registerHook('header')); + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitSpecials')) + { + Configuration::updateValue('PS_BLOCK_SPECIALS_DISPLAY', (int)(Tools::getValue('always_display'))); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + return ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Always display block').'</label> + <div class="margin-form"> + <input type="radio" name="always_display" id="display_on" value="1" '.(Tools::getValue('always_display', Configuration::get('PS_BLOCK_SPECIALS_DISPLAY')) ? 'checked="checked" ' : '').'/> + <label class="t" for="display_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="always_display" id="display_off" value="0" '.(!Tools::getValue('always_display', Configuration::get('PS_BLOCK_SPECIALS_DISPLAY')) ? 'checked="checked" ' : '').'/> + <label class="t" for="display_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Show the block even if no product is available.').'</p> + </div> + <center><input type="submit" name="submitSpecials" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + } + + public function hookRightColumn($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + + global $smarty; + if (!$special = Product::getRandomSpecial((int)($params['cookie']->id_lang), false, false, $this->shopID) AND !Configuration::get('PS_BLOCK_SPECIALS_DISPLAY')) + return; + $smarty->assign(array( + 'special' => $special, + 'priceWithoutReduction_tax_excl' => Tools::ps_round($special['price_without_reduction'], 2), + 'mediumSize' => Image::getSize('medium') + )); + + return $this->display(__FILE__, 'blockspecials.tpl'); + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookHeader($params) + { + if (Configuration::get('PS_CATALOG_MODE')) + return ; + Tools::addCSS(($this->_path).'blockspecials.css', 'all'); + } +} + diff --git a/modules/blockspecials/blockspecials.tpl b/modules/blockspecials/blockspecials.tpl new file mode 100644 index 000000000..ebf13debe --- /dev/null +++ b/modules/blockspecials/blockspecials.tpl @@ -0,0 +1,59 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Block specials --> +<div id="special_block_right" class="block products_block exclusive blockspecials"> + <h4><a href="{$link->getPageLink('prices-drop')}" title="{l s='Specials' mod='blockspecials'}">{l s='Specials' mod='blockspecials'}</a></h4> + <div class="block_content"> + +{if $special} + <ul class="products"> + <li class="product_image"> + <a href="{$special.link}"><img src="{$link->getImageLink($special.link_rewrite, $special.id_image, 'medium')}" alt="{$special.legend|escape:html:'UTF-8'}" height="{$mediumSize.height}" width="{$mediumSize.width}" title="{$special.name|escape:html:'UTF-8'}" /></a> + </li> + <li> + + <h5><a href="{$special.link}" title="{$special.name|escape:html:'UTF-8'}">{$special.name|escape:html:'UTF-8'}</a></h5> + <span class="price-discount">{if !$priceDisplay}{displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$priceWithoutReduction_tax_excl}{/if}</span> + {if $special.specific_prices} + {assign var='specific_prices' value=$special.specific_prices} + {if $specific_prices.reduction_type == 'percentage' && ($specific_prices.from == $specific_prices.to OR ($smarty.now|date_format:'%Y-%m-%d %H:%M:%S' <= $specific_prices.to && $smarty.now|date_format:'%Y-%m-%d %H:%M:%S' >= $specific_prices.from))} + <span class="reduction">(-{$specific_prices.reduction*100|floatval}%)</span> + {/if} + {/if} + <span class="price">{if !$priceDisplay}{displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc}{/if}</span> + </li> + </ul> + <p> + <a href="{$link->getPageLink('prices-drop')}" title="{l s='All specials' mod='blockspecials'}" class="button_large">{l s='All specials' mod='blockspecials'}</a> + </p> +{else} + <p>{l s='No specials at this time' mod='blockspecials'}</p> +{/if} + </div> +</div> +<!-- /MODULE Block specials --> + diff --git a/modules/blockspecials/config.xml b/modules/blockspecials/config.xml new file mode 100755 index 000000000..1b49fc6f9 --- /dev/null +++ b/modules/blockspecials/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockspecials</name> + <displayName><![CDATA[Specials block]]></displayName> + <version><![CDATA[0.8]]></version> + <description><![CDATA[Adds a block with current product specials.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[pricing_promotion]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockspecials/de.php b/modules/blockspecials/de.php new file mode 100644 index 000000000..8938d9bc6 --- /dev/null +++ b/modules/blockspecials/de.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockspecials}prestashop>blockspecials_d1aa22a3126f04664e0fe3f598994014'] = 'Specials'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b4f95c1ea534936cc60c6368c225f480'] = 'Alle Specials'; +$_MODULE['<{blockspecials}prestashop>blockspecials_fd21fcc9fc4c1d5202d6fc11597b3fca'] = 'Keine Specials zu diesem Zeitpunkt'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c19ed4ea98cbf319735f6d09bde6c757'] = 'Specials Block'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c2fb79a6eca86e519f938a1ef15c3e69'] = 'Fügt einen Block mit aktuellen Produkt-Specials hinzu'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockspecials}prestashop>blockspecials_530c88f8210e022b39128e3f0409bbcf'] = 'Block immer anzeigen'; +$_MODULE['<{blockspecials}prestashop>blockspecials_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blockspecials}prestashop>blockspecials_a8a670d89a6d2f3fa59942fc591011ef'] = 'Block anzeigen, auch wenn kein Produkt verfügbar ist.'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockspecials/en.php b/modules/blockspecials/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockspecials/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockspecials/es.php b/modules/blockspecials/es.php new file mode 100644 index 000000000..ee1da745b --- /dev/null +++ b/modules/blockspecials/es.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockspecials}prestashop>blockspecials_c19ed4ea98cbf319735f6d09bde6c757'] = 'Bloque promociones especiales'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c2fb79a6eca86e519f938a1ef15c3e69'] = 'Añadir un bloque con promociones especiales'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c888438d14855d7d96a2724ee9c306bd'] = 'Parámetros actualizados'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros '; +$_MODULE['<{blockspecials}prestashop>blockspecials_530c88f8210e022b39128e3f0409bbcf'] = 'Mostrar este bloque siempre'; +$_MODULE['<{blockspecials}prestashop>blockspecials_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blockspecials}prestashop>blockspecials_a8a670d89a6d2f3fa59942fc591011ef'] = 'Mostrar este bloque aunque no haya productos disponibles'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockspecials}prestashop>blockspecials_d1aa22a3126f04664e0fe3f598994014'] = 'Promociones especiales'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b4f95c1ea534936cc60c6368c225f480'] = 'Todas los promociones especiales'; +$_MODULE['<{blockspecials}prestashop>blockspecials_fd21fcc9fc4c1d5202d6fc11597b3fca'] = 'No hay promociones especiales en este momento'; diff --git a/modules/blockspecials/fr.php b/modules/blockspecials/fr.php new file mode 100644 index 000000000..b6489dc3e --- /dev/null +++ b/modules/blockspecials/fr.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockspecials}prestashop>blockspecials_c19ed4ea98cbf319735f6d09bde6c757'] = 'Bloc promotions'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c2fb79a6eca86e519f938a1ef15c3e69'] = 'Ajoute un bloc proposant les produits en promotion actuellement'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blockspecials}prestashop>blockspecials_530c88f8210e022b39128e3f0409bbcf'] = 'Toujours afficher ce bloc'; +$_MODULE['<{blockspecials}prestashop>blockspecials_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{blockspecials}prestashop>blockspecials_a8a670d89a6d2f3fa59942fc591011ef'] = 'Afficher le bloc même si aucun produit n\'est disponible'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockspecials}prestashop>blockspecials_d1aa22a3126f04664e0fe3f598994014'] = 'Réductions'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b4f95c1ea534936cc60c6368c225f480'] = 'Toutes les promos'; +$_MODULE['<{blockspecials}prestashop>blockspecials_fd21fcc9fc4c1d5202d6fc11597b3fca'] = 'Pas de promotion actuellement'; diff --git a/modules/blockspecials/it.php b/modules/blockspecials/it.php new file mode 100644 index 000000000..edd1ef6a4 --- /dev/null +++ b/modules/blockspecials/it.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockspecials}prestashop>blockspecials_d1aa22a3126f04664e0fe3f598994014'] = 'Speciali'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b4f95c1ea534936cc60c6368c225f480'] = 'Tutte le offerte speciali'; +$_MODULE['<{blockspecials}prestashop>blockspecials_fd21fcc9fc4c1d5202d6fc11597b3fca'] = 'Non ci sono offerte speciali in questo momento'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c19ed4ea98cbf319735f6d09bde6c757'] = 'Blocco offerte speciali '; +$_MODULE['<{blockspecials}prestashop>blockspecials_c2fb79a6eca86e519f938a1ef15c3e69'] = 'Aggiunge un blocco con le offerte speciali del momento'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockspecials}prestashop>blockspecials_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockspecials}prestashop>blockspecials_530c88f8210e022b39128e3f0409bbcf'] = 'Visualizza sempre il blocco'; +$_MODULE['<{blockspecials}prestashop>blockspecials_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blockspecials}prestashop>blockspecials_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blockspecials}prestashop>blockspecials_a8a670d89a6d2f3fa59942fc591011ef'] = 'Mostra il blocco anche se nessun prodotto è disponibile.'; +$_MODULE['<{blockspecials}prestashop>blockspecials_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockspecials/logo.gif b/modules/blockspecials/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..f375119e0759c2a09b5517af87b5c91fb5bf0dec GIT binary patch literal 251 zcmZ?wbhEHb6krfwIKsfNe*OBVPoI9hRdw&)y)$Rd{Qdp?`^&ArzCGK!ckhq)7r))_ zyMF!p_wV1|zkh$^$dUIq+O}@p`svQZuXkJi|NsB};nW`=uKfA&k^whR{K>+|&LGU7 z15yIAlYzD3fs&9)pif4Z-YbzAZ(j*9|C*<3_>%ju4>P;oQt1g2?93NFDlg*V>2_Hl zqcCgtu_Xl)G(?1+KI+O6V4B?G;JC0wo!evcLx=D^Z_8`q=HIy~#Lrr-$;(m3BqYew jqSaQ$)m&sK%qx&lFnP*U0p{M>QyFG0NR7}`WUvMRWm9ZG literal 0 HcmV?d00001 diff --git a/modules/blockstore/blockstore.css b/modules/blockstore/blockstore.css new file mode 100644 index 000000000..a915ae355 --- /dev/null +++ b/modules/blockstore/blockstore.css @@ -0,0 +1,3 @@ +/* Block store */ +.blockstore img { margin: 10px 0 0 0 } +.blockstore p { text-align: center } \ No newline at end of file diff --git a/modules/blockstore/blockstore.php b/modules/blockstore/blockstore.php new file mode 100644 index 000000000..4ce7b6a61 --- /dev/null +++ b/modules/blockstore/blockstore.php @@ -0,0 +1,125 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockStore extends Module +{ + function __construct() + { + $this->name = 'blockstore'; + $this->tab = 'front_office_features'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Stores block'); + $this->description = $this->l('Displays a block with a link to the store locator.'); + } + + function install() + { + Configuration::updateValue('BLOCKSTORE_IMG', 'store.jpg'); + return (parent::install() AND $this->registerHook('rightColumn') AND $this->registerHook('header')); + } + + public function uninstall() + { + Configuration::deleteByName('BLOCKSTORE_IMG'); + return parent::uninstall(); + } + + function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + function hookRightColumn($params) + { + global $smarty; + + $smarty->assign('store_img', Configuration::get('BLOCKSTORE_IMG')); + return $this->display(__FILE__, 'blockstore.tpl'); + } + + function hookHeader($params) + { + Tools::addCSS($this->_path.'/blockstore.css', 'all'); + } + + public function postProcess() + { + if (Tools::isSubmit('submitStoreConf')) + { + if (isset($_FILES['store_img']) AND isset($_FILES['store_img']['tmp_name']) AND !empty($_FILES['store_img']['tmp_name'])) + { + if ($error = checkImage($_FILES['store_img'], 4000000)) + return $this->displayError($this->l('invalid image')); + else + { + if (!move_uploaded_file($_FILES['store_img']['tmp_name'], dirname(__FILE__).'/'.$_FILES['store_img']['name'])) + return $this->displayError($this->l('an error occurred on uploading file')); + else + { + if (Configuration::get('BLOCKSTORE_IMG') != $_FILES['store_img']['name']) + @unlink(dirname(__FILE__).'/'.Configuration::get('BLOCKSTORE_IMG')); + Configuration::updateValue('BLOCKSTORE_IMG', $_FILES['store_img']['name']); + return $this->displayConfirmation($this->l('Settings are updated')); + } + } + } + } + return ''; + } + + public function getContent() + { + $output = $this->postProcess().' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post" enctype="multipart/form-data"> + <fieldset> + <legend>'.$this->l('Store block configuration').'</legend>'; + if (Configuration::get('BLOCKSTORE_IMG')) + $output .= '<div class="margin-form"><img src="'.Tools::getProtocol().Tools::getMediaServer($this->name)._MODULE_DIR_.$this->name.'/'.Configuration::get('BLOCKSTORE_IMG').'" alt="'.$this->l('Store image').'" style="height:115px;margin-left: 100px;width:174px"/></div>'; + $output .= ' + <label for="store_img">'.$this->l('Change image').'</label> + <div class="margin-form"> + <input id="store_img" type="file" name="store_img" /> ( '.$this->l('image will be displayed as 174x115').' ) + </div> + + <p class="center"> + <input class="button" type="submit" name="submitStoreConf" value="'.$this->l('Save').'"/> + </p> + </fieldset> + </form> + '; + return $output; + } +} + diff --git a/modules/blockstore/blockstore.tpl b/modules/blockstore/blockstore.tpl new file mode 100644 index 000000000..19949890f --- /dev/null +++ b/modules/blockstore/blockstore.tpl @@ -0,0 +1,37 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block stores module --> +<div id="stores_block_left" class="block"> + <h4><a href="{$link->getPageLink('stores')}" title="{l s='Our stores' mod='blockstore'}">{l s='Our stores' mod='blockstore'}</a></h4> + <div class="block_content blockstore"> + <p> + <a href="{$link->getPageLink('stores')}" title="{l s='Our stores' mod='blockstore'}"><img src="{$module_dir}{$store_img}" alt="{l s='Our stores' mod='blockstore'}" width="174" height="115" /></a><br /> + <a href="{$link->getPageLink('stores')}" title="{l s='Our stores' mod='blockstore'}">{l s='Discover our stores' mod='blockstore'}</a> + </p> + </div> +</div> +<!-- /Block stores module --> diff --git a/modules/blockstore/config.xml b/modules/blockstore/config.xml new file mode 100755 index 000000000..292211119 --- /dev/null +++ b/modules/blockstore/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockstore</name> + <displayName><![CDATA[Stores block]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Displays a block with a link to the store locator.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockstore/de.php b/modules/blockstore/de.php new file mode 100644 index 000000000..488314a4d --- /dev/null +++ b/modules/blockstore/de.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockstore}prestashop>blockstore_34c869c542dee932ef8cd96d2f91cae6'] = 'Unsere Shops'; +$_MODULE['<{blockstore}prestashop>blockstore_61d5070a61ce6eb6ad2a212fdf967d92'] = 'Entdecken Sie unsere Shops'; +$_MODULE['<{blockstore}prestashop>blockstore_50d335623ef166aeea8da2a3c2c63a3e'] = 'Shop-Block'; +$_MODULE['<{blockstore}prestashop>blockstore_7118171dfc2981fd3d7f3aab97fb572d'] = 'Zeigt ein Block mit einem Link zu der Händlersuche'; +$_MODULE['<{blockstore}prestashop>blockstore_f32a6c9e15dd20152ee8b14c7f94b040'] = 'Bild ungültig'; +$_MODULE['<{blockstore}prestashop>blockstore_10857d5f8e303905ada328b4a31d316b'] = 'Fehler beim Hochladen der Datei'; +$_MODULE['<{blockstore}prestashop>blockstore_7ccf58c950043c9fbfed668df13ce608'] = 'Die Einstellungen werden aktualisiert'; +$_MODULE['<{blockstore}prestashop>blockstore_dbd41b964013caae2d73220618b5ae90'] = 'Shop-Block-Konfiguration'; +$_MODULE['<{blockstore}prestashop>blockstore_2dd1d28275cdb8b78ebd17f6e25aac0d'] = 'Shop-Bild'; +$_MODULE['<{blockstore}prestashop>blockstore_8c38cf08a0d0a01bd44c682479432350'] = 'Bild ändern'; +$_MODULE['<{blockstore}prestashop>blockstore_f6f1e75fd6d515138c3c802459aa384d'] = 'Bild wird als 174x115 angezeigt '; +$_MODULE['<{blockstore}prestashop>blockstore_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockstore/es.php b/modules/blockstore/es.php new file mode 100644 index 000000000..ecd194321 --- /dev/null +++ b/modules/blockstore/es.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockstore}prestashop>blockstore_50d335623ef166aeea8da2a3c2c63a3e'] = 'Bloque tiendas'; +$_MODULE['<{blockstore}prestashop>blockstore_7118171dfc2981fd3d7f3aab97fb572d'] = 'Mostrar un bloque con un link hacia la lista de tiendas'; +$_MODULE['<{blockstore}prestashop>blockstore_f32a6c9e15dd20152ee8b14c7f94b040'] = 'imagen no válida'; +$_MODULE['<{blockstore}prestashop>blockstore_10857d5f8e303905ada328b4a31d316b'] = 'se ha producido un error durante el envío'; +$_MODULE['<{blockstore}prestashop>blockstore_7ccf58c950043c9fbfed668df13ce608'] = 'Parámetros actualizados'; +$_MODULE['<{blockstore}prestashop>blockstore_dbd41b964013caae2d73220618b5ae90'] = 'Configuració del bloque tiendas'; +$_MODULE['<{blockstore}prestashop>blockstore_2dd1d28275cdb8b78ebd17f6e25aac0d'] = 'Imagen del bloque'; +$_MODULE['<{blockstore}prestashop>blockstore_8c38cf08a0d0a01bd44c682479432350'] = 'Cambiar de imagen:'; +$_MODULE['<{blockstore}prestashop>blockstore_f6f1e75fd6d515138c3c802459aa384d'] = 'la imagen se mostrará en formato 174x115'; +$_MODULE['<{blockstore}prestashop>blockstore_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockstore}prestashop>blockstore_34c869c542dee932ef8cd96d2f91cae6'] = 'Nuestras tiendas'; +$_MODULE['<{blockstore}prestashop>blockstore_61d5070a61ce6eb6ad2a212fdf967d92'] = 'Descubra nuestras tiendas'; diff --git a/modules/blockstore/fr.php b/modules/blockstore/fr.php new file mode 100644 index 000000000..e95a6d5d7 --- /dev/null +++ b/modules/blockstore/fr.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockstore}prestashop>blockstore_50d335623ef166aeea8da2a3c2c63a3e'] = 'Bloc magasins'; +$_MODULE['<{blockstore}prestashop>blockstore_7118171dfc2981fd3d7f3aab97fb572d'] = 'Affiche un bloc avec un lien vers la liste des magasins'; +$_MODULE['<{blockstore}prestashop>blockstore_f32a6c9e15dd20152ee8b14c7f94b040'] = 'image invalide'; +$_MODULE['<{blockstore}prestashop>blockstore_10857d5f8e303905ada328b4a31d316b'] = 'une erreur s\'est produite lors de l\'envoi'; +$_MODULE['<{blockstore}prestashop>blockstore_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour'; +$_MODULE['<{blockstore}prestashop>blockstore_dbd41b964013caae2d73220618b5ae90'] = 'Configuration du block magasins'; +$_MODULE['<{blockstore}prestashop>blockstore_2dd1d28275cdb8b78ebd17f6e25aac0d'] = 'Image du block'; +$_MODULE['<{blockstore}prestashop>blockstore_8c38cf08a0d0a01bd44c682479432350'] = 'Changer l\'image:'; +$_MODULE['<{blockstore}prestashop>blockstore_f6f1e75fd6d515138c3c802459aa384d'] = 'l\'image sera affiché au format 174x115'; +$_MODULE['<{blockstore}prestashop>blockstore_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockstore}prestashop>blockstore_34c869c542dee932ef8cd96d2f91cae6'] = 'Nos magasins'; +$_MODULE['<{blockstore}prestashop>blockstore_61d5070a61ce6eb6ad2a212fdf967d92'] = 'Découvrez nos magasins'; diff --git a/modules/blockstore/it.php b/modules/blockstore/it.php new file mode 100644 index 000000000..e0628e0ca --- /dev/null +++ b/modules/blockstore/it.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockstore}prestashop>blockstore_34c869c542dee932ef8cd96d2f91cae6'] = 'I nostri negozi'; +$_MODULE['<{blockstore}prestashop>blockstore_61d5070a61ce6eb6ad2a212fdf967d92'] = 'Scopri i nostri negozi'; +$_MODULE['<{blockstore}prestashop>blockstore_50d335623ef166aeea8da2a3c2c63a3e'] = 'Blocco negozi '; +$_MODULE['<{blockstore}prestashop>blockstore_7118171dfc2981fd3d7f3aab97fb572d'] = 'Visualizza un blocco con un link per il localizzatore del negozio'; +$_MODULE['<{blockstore}prestashop>blockstore_f32a6c9e15dd20152ee8b14c7f94b040'] = 'immagine non valida'; +$_MODULE['<{blockstore}prestashop>blockstore_7ccf58c950043c9fbfed668df13ce608'] = 'Le impostazioni sono aggiornate'; +$_MODULE['<{blockstore}prestashop>blockstore_dbd41b964013caae2d73220618b5ae90'] = 'Configurazione blocco negozio'; +$_MODULE['<{blockstore}prestashop>blockstore_2dd1d28275cdb8b78ebd17f6e25aac0d'] = 'Immagine blocco'; +$_MODULE['<{blockstore}prestashop>blockstore_8c38cf08a0d0a01bd44c682479432350'] = 'Cambia immagine'; +$_MODULE['<{blockstore}prestashop>blockstore_f6f1e75fd6d515138c3c802459aa384d'] = 'immagine verrà visualizzata come 174x115'; +$_MODULE['<{blockstore}prestashop>blockstore_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockstore/logo.gif b/modules/blockstore/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..659aace81c639dac0e3905c1a6d792c94051c20a GIT binary patch literal 280 zcmZ?wbhEHb6krfwIKsf-=jV6k%$dD=_by$!w56rx-o1Op#l_E_J=?Nn%gmWGv$M00 z9zFX0{rhXzuBD}=O`be?_3G8%zkjc(sp;zKVju!2{$ycfXAor20jUMq$-p`_L8Z^< zvP|+Sw&RT*Jyk4@TSSg_^PH{_={e+-(Bu%&5%;9P*wWXeGa)470!wF0!bS%l<!h~? z-H&yd`rVTXH?Xm>USu@dqsemBSV>Nkhb4}ekAst$vC6)liHVDgO^G)qMxcvBKz{=B yM3eS*CPuCqycNtWEHQnvganj1*w}c4+c)qr@Ea)!H}EOdXen{C1npO3um%7GB3L{C literal 0 HcmV?d00001 diff --git a/modules/blockstore/store.jpg b/modules/blockstore/store.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91f73f257c66a60e3398479d24de36f3bc20d059 GIT binary patch literal 10572 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 literal 0 HcmV?d00001 diff --git a/modules/blocksupplier/blocksupplier.php b/modules/blocksupplier/blocksupplier.php new file mode 100644 index 000000000..d10a03ec4 --- /dev/null +++ b/modules/blocksupplier/blocksupplier.php @@ -0,0 +1,140 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockSupplier extends Module +{ + function __construct() + { + $this->name = 'blocksupplier'; + $this->tab = 'front_office_features'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Suppliers block'); + $this->description = $this->l('Adds a block displaying suppliers.'); + } + + function install() + { + if (!parent::install()) + return false; + if (!$this->registerHook('leftColumn')) + return false; + if (!$this->registerHook('header')) + return false; + Configuration::updateValue('SUPPLIER_DISPLAY_TEXT', true); + Configuration::updateValue('SUPPLIER_DISPLAY_TEXT_NB', 5); + Configuration::updateValue('SUPPLIER_DISPLAY_FORM', true); + return true; + } + + function hookLeftColumn($params) + { + global $smarty, $link; + $smarty->assign(array( + 'suppliers' => Supplier::getSuppliers(false), + 'link' => $link, + 'text_list' => Configuration::get('SUPPLIER_DISPLAY_TEXT'), + 'text_list_nb' => Configuration::get('SUPPLIER_DISPLAY_TEXT_NB'), + 'form_list' => Configuration::get('SUPPLIER_DISPLAY_FORM'), + 'display_link_supplier' => Configuration::get('PS_DISPLAY_SUPPLIERS') + )); + return $this->display(__FILE__, 'blocksupplier.tpl'); + } + + function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockSuppliers')) + { + $text_list = (int)(Tools::getValue('text_list')); + $text_nb = (int)(Tools::getValue('text_nb')); + $form_list = (int)(Tools::getValue('form_list')); + if ($text_list AND !Validate::isUnsignedInt($text_nb)) + $errors[] = $this->l('Invalid number of elements'); + elseif (!$text_list AND !$form_list) + $errors[] = $this->l('Please activate at least one system list.'); + else + { + Configuration::updateValue('SUPPLIER_DISPLAY_TEXT', $text_list); + Configuration::updateValue('SUPPLIER_DISPLAY_TEXT_NB', $text_nb); + Configuration::updateValue('SUPPLIER_DISPLAY_FORM', $form_list); + } + if (isset($errors) AND sizeof($errors)) + $output .= $this->displayError(implode('<br />', $errors)); + else + $output .= $this->displayConfirmation($this->l('Settings updated')); + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Use a plain-text list').'</label> + <div class="margin-form"> + <input type="radio" name="text_list" id="text_list_on" value="1" '.(Tools::getValue('text_list', Configuration::get('SUPPLIER_DISPLAY_TEXT')) ? 'checked="checked" ' : '').'/> + <label class="t" for="text_list_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="text_list" id="text_list_off" value="0" '.(!Tools::getValue('text_list', Configuration::get('SUPPLIER_DISPLAY_TEXT')) ? 'checked="checked" ' : '').'/> + <label class="t" for="text_list_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + &nbsp;&nbsp;&nbsp;'.$this->l('Display').' <input type="text" size="2" name="text_nb" value="'.Tools::getValue('text_nb', Configuration::get('SUPPLIER_DISPLAY_TEXT_NB')).'" /> '.$this->l('elements').' + <p class="clear">'.$this->l('To display suppliers as a plain-text list').'</p> + </div> + <label>'.$this->l('Use a drop-down list').'</label> + <div class="margin-form"> + <input type="radio" name="form_list" id="form_list_on" value="1" '.(Tools::getValue('form_list', Configuration::get('SUPPLIER_DISPLAY_FORM')) ? 'checked="checked" ' : '').'/> + <label class="t" for="form_list_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="form_list" id="form_list_off" value="0" '.(!Tools::getValue('form_list', Configuration::get('SUPPLIER_DISPLAY_FORM')) ? 'checked="checked" ' : '').'/> + <label class="t" for="form_list_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('To display suppliers as a drop-down list').'</p> + </div> + <center><input type="submit" name="submitBlockSuppliers" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blocksupplier.css', 'all'); + } +} + + diff --git a/modules/blocksupplier/blocksupplier.tpl b/modules/blocksupplier/blocksupplier.tpl new file mode 100644 index 000000000..e404b0b46 --- /dev/null +++ b/modules/blocksupplier/blocksupplier.tpl @@ -0,0 +1,60 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block suppliers module --> +<div id="suppliers_block_left" class="block blocksupplier"> + <h4>{if $display_link_supplier}<a href="{$link->getPageLink('supplier')}" title="{l s='Suppliers' mod='blocksupplier'}">{/if}{l s='Suppliers' mod='blocksupplier'}{if $display_link_supplier}</a>{/if}</h4> + <div class="block_content"> +{if $suppliers} + {if $text_list} + <ul class="bullet"> + {foreach from=$suppliers item=supplier name=supplier_list} + {if $smarty.foreach.supplier_list.iteration <= $text_list_nb} + <li class="{if $smarty.foreach.supplier_list.last}last_item{elseif $smarty.foreach.supplier_list.first}first_item{else}item{/if}"> + <a href="{$link->getsupplierLink($supplier.id_supplier, $supplier.link_rewrite)}" title="{l s='More about' mod='blocksupplier'} {$supplier.name}">{$supplier.name|escape:'htmlall':'UTF-8'}</a> + </li> + {/if} + {/foreach} + </ul> + {/if} + {if $form_list} + <form action="{$smarty.server.SCRIPT_NAME}" method="get"> + <p> + <select id="supplier_list" onchange="autoUrl('supplier_list', '');"> + <option value="0">{l s='All suppliers' mod='blocksupplier'}</option> + {foreach from=$suppliers item=supplier} + <option value="{$link->getsupplierLink($supplier.id_supplier, $supplier.link_rewrite)}">{$supplier.name|escape:'htmlall':'UTF-8'}</option> + {/foreach} + </select> + </p> + </form> + {/if} +{else} + <p>{l s='No supplier' mod='blocksupplier'}</p> +{/if} + </div> +</div> +<!-- /Block suppliers module --> diff --git a/modules/blocksupplier/config.xml b/modules/blocksupplier/config.xml new file mode 100755 index 000000000..c8c3c9841 --- /dev/null +++ b/modules/blocksupplier/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocksupplier</name> + <displayName><![CDATA[Suppliers block]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Adds a block displaying suppliers.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocksupplier/de.php b/modules/blocksupplier/de.php new file mode 100644 index 000000000..e83aaaeb3 --- /dev/null +++ b/modules/blocksupplier/de.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksupplier}prestashop>blocksupplier_1814d65a76028fdfbadab64a5a8076df'] = 'Zulieferer'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_49fa2426b7903b3d4c89e2c1874d9346'] = 'Mehr darüber'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_ecf253735ac0cba84a9d2eeff1f1b87c'] = 'Alle Zulieferer'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_496689fbd342f80d30f1f266d060415a'] = 'Kein Zulieferer'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9ae42413e3cb9596efe3857f75bad3df'] = 'Zulieferer-Block'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_efc027d2b1bb88bea7bd7eff273ca4c0'] = 'Fügt einen Block hinzu, der die Zulieferer anzeigt'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'Ungültige Anzahl von Elementen'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_5b2e13ff6fa0da895d14bd56f2cb2d2d'] = 'Bitte aktivieren Sie mindestens eine Systemliste'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_bfdff752293014f11f17122c92909ad5'] = 'Verwenden Sie eine Nur-Text-Liste'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Anzeige'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_6a7f245843454cf4f28ad7c5e2572aa2'] = 'Elemente'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_e7968f07cac2995b0dd917475a04b8be'] = 'Zulieferer als Nur-Text-Liste anzeigen'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b0fa976774d2acf72f9c62e9ab73de38'] = 'Verwenden Sie eine Dropdown-Liste'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9df3ff87bf49ec39ccd11ae9aaaa593e'] = 'Zulieferer in einer Dropdownliste anzeigen'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blocksupplier/en.php b/modules/blocksupplier/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocksupplier/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocksupplier/es.php b/modules/blocksupplier/es.php new file mode 100644 index 000000000..98aaa1ce1 --- /dev/null +++ b/modules/blocksupplier/es.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9ae42413e3cb9596efe3857f75bad3df'] = 'Bloque proveedor'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_efc027d2b1bb88bea7bd7eff273ca4c0'] = 'Añadir un bloque para mostrar los proveedores'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'número de elementos no válido'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_5b2e13ff6fa0da895d14bd56f2cb2d2d'] = 'Por favor, elija al menos uno de la lista'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_bfdff752293014f11f17122c92909ad5'] = 'Usar una lista de texto plano'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Mostrar'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_6a7f245843454cf4f28ad7c5e2572aa2'] = 'elementos'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_e7968f07cac2995b0dd917475a04b8be'] = 'Para mostrar los proveedores en lista de texto plano'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b0fa976774d2acf72f9c62e9ab73de38'] = 'Usar un cuadro combinado'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9df3ff87bf49ec39ccd11ae9aaaa593e'] = 'Para mostrar los proveedores dentro de un cuadro combinado'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_1814d65a76028fdfbadab64a5a8076df'] = 'Proveedores'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_49fa2426b7903b3d4c89e2c1874d9346'] = 'Más sobre'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_ecf253735ac0cba84a9d2eeff1f1b87c'] = 'Todos los proveedores'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_496689fbd342f80d30f1f266d060415a'] = 'No hay proveedores'; diff --git a/modules/blocksupplier/fr.php b/modules/blocksupplier/fr.php new file mode 100644 index 000000000..6006b52be --- /dev/null +++ b/modules/blocksupplier/fr.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9ae42413e3cb9596efe3857f75bad3df'] = 'Bloc fournisseurs'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_efc027d2b1bb88bea7bd7eff273ca4c0'] = 'Ajoute un bloc proposant les fournisseurs'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'Nombre d\'éléments invalide'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_5b2e13ff6fa0da895d14bd56f2cb2d2d'] = 'Merci d\'activer au moins un affichage de liste'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_bfdff752293014f11f17122c92909ad5'] = 'Utiliser une liste'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Afficher'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_6a7f245843454cf4f28ad7c5e2572aa2'] = 'éléments'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_e7968f07cac2995b0dd917475a04b8be'] = 'Afficher les fournisseurs sous forme de liste'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b0fa976774d2acf72f9c62e9ab73de38'] = 'Utiliser un menu déroulant'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9df3ff87bf49ec39ccd11ae9aaaa593e'] = 'Afficher les fournisseurs avec un menu déroulant'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_1814d65a76028fdfbadab64a5a8076df'] = 'Fournisseurs'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_49fa2426b7903b3d4c89e2c1874d9346'] = 'En savoir plus à propos de'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_ecf253735ac0cba84a9d2eeff1f1b87c'] = 'Tous les fournisseurs'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_496689fbd342f80d30f1f266d060415a'] = 'Aucun fournisseur'; diff --git a/modules/blocksupplier/it.php b/modules/blocksupplier/it.php new file mode 100644 index 000000000..0a080ba38 --- /dev/null +++ b/modules/blocksupplier/it.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocksupplier}prestashop>blocksupplier_1814d65a76028fdfbadab64a5a8076df'] = 'Fornitori'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_49fa2426b7903b3d4c89e2c1874d9346'] = 'Maggiori informazioni su'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_ecf253735ac0cba84a9d2eeff1f1b87c'] = 'Tutti i fornitori'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_496689fbd342f80d30f1f266d060415a'] = 'Nessun fornitore'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9ae42413e3cb9596efe3857f75bad3df'] = 'Blocco fornitori'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_efc027d2b1bb88bea7bd7eff273ca4c0'] = 'Aggiungi un blocco che mostra i fornitori'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_cf64d2d0bc5de5ce3d309d0e899d36fb'] = 'numero di elementi non valido'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_5b2e13ff6fa0da895d14bd56f2cb2d2d'] = 'Attiva almeno un elenco di sistema'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_bfdff752293014f11f17122c92909ad5'] = 'Utilizzare un elenco '; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b9987a246a537f4fe86f1f2e3d10dbdb'] = 'Visualizza'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_6a7f245843454cf4f28ad7c5e2572aa2'] = 'elementi'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_e7968f07cac2995b0dd917475a04b8be'] = 'Per visualizzare i fornitori come un elenco di testo'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_b0fa976774d2acf72f9c62e9ab73de38'] = 'Utilizza un elenco a cascata'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_9df3ff87bf49ec39ccd11ae9aaaa593e'] = 'Per visualizzare i fornitori come un elenco a cascata'; +$_MODULE['<{blocksupplier}prestashop>blocksupplier_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blocksupplier/logo.gif b/modules/blocksupplier/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5cb1f263cafa5c94545520fd8d7dc129be0eef3 GIT binary patch literal 266 zcmZ?wbhEHb6krfwIKsg29|+Ez`G02S|CvCPb_U1;@<Dj!nVCS8c4nsW%rpOILiuSk zXQs_eGfta%21upNG)@Bn<1}Mqpd#ZmAOZ=2_-PD4F$M+(#h)yU>_A!vh=Dc=Ffg#T zD=74(WX@Ar$m6wI$7{(HuZ9~;N-7>9Lc10?Oq`t3BXodgsild8)KZrw$Fx<Gm={c7 zbP?d%z<n);VbQ~f7nYuok!a6I;Sg&#7e1ZByrDuzT)bXRT#TQOO+ZAJK~7XuUQ|ww qL4==!fnQjrck;X`GBcDodNgFF&77^lAUlntYpI5;%;p|N25SI~uVm8z literal 0 HcmV?d00001 diff --git a/modules/blocktags/blocktags.php b/modules/blocktags/blocktags.php new file mode 100644 index 000000000..650601a84 --- /dev/null +++ b/modules/blocktags/blocktags.php @@ -0,0 +1,125 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +define('BLOCKTAGS_MAX_LEVEL', 3); + +class BlockTags extends Module +{ + function __construct() + { + $this->name = 'blocktags'; + $this->tab = 'front_office_features'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Tags block'); + $this->description = $this->l('Adds a block containing a tag cloud.'); + } + + function install() + { + if (parent::install() == false + OR $this->registerHook('leftColumn') == false + OR $this->registerHook('header') == false + OR Configuration::updateValue('BLOCKTAGS_NBR', 10) == false) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockTags')) + { + if (!$tagsNbr = Tools::getValue('tagsNbr') OR empty($tagsNbr)) + $output .= '<div class="alert error">'.$this->l('Please fill in the "tags displayed" field.').'</div>'; + elseif ((int)($tagsNbr) == 0) + $output .= '<div class="alert error">'.$this->l('Invalid number.').'</div>'; + else + { + Configuration::updateValue('BLOCKTAGS_NBR', (int)($tagsNbr)); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Tags displayed').'</label> + <div class="margin-form"> + <input type="text" name="tagsNbr" value="'.(int)(Configuration::get('BLOCKTAGS_NBR')).'" /> + <p class="clear">'.$this->l('Set the number of tags to be displayed in this block').'</p> + </div> + <center><input type="submit" name="submitBlockTags" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + /** + * Returns module content for left column + * + * @param array $params Parameters + * @return string Content + * + * @todo Links on tags (dedicated page or search ?) + */ + function hookLeftColumn($params) + { + global $smarty; + + $tags = Tag::getMainTags((int)($params['cookie']->id_lang), (int)(Configuration::get('BLOCKTAGS_NBR'))); + if (!sizeof($tags)) + return false; + foreach ($tags AS &$tag) + $tag['class'] = 'tag_level'.($tag['times'] > BLOCKTAGS_MAX_LEVEL ? BLOCKTAGS_MAX_LEVEL : $tag['times']); + $smarty->assign('tags', $tags); + + return $this->display(__FILE__, 'blocktags.tpl'); + } + + function hookRightColumn($params) + { + return $this->hookLeftColumn($params); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blocktags.css', 'all'); + } + +} diff --git a/modules/blocktags/blocktags.tpl b/modules/blocktags/blocktags.tpl new file mode 100644 index 000000000..0e4fdf85f --- /dev/null +++ b/modules/blocktags/blocktags.tpl @@ -0,0 +1,40 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block tags module --> +<div id="tags_block_left" class="block tags_block"> + <h4>{l s='Tags' mod='blocktags'}</h4> + <p class="block_content"> +{if $tags} + {foreach from=$tags item=tag name=myLoop} + <a href="{$link->getPageLink('search', true, NULL, "tag={$tag.name|urlencode}")}" title="{l s='More about' mod='blocktags'} {$tag.name|escape:html:'UTF-8'}" class="{$tag.class} {if $smarty.foreach.myLoop.last}last_item{elseif $smarty.foreach.myLoop.first}first_item{else}item{/if}">{$tag.name|escape:html:'UTF-8'}</a> + {/foreach} +{else} + {l s='No tags specified yet' mod='blocktags'} +{/if} + </p> +</div> +<!-- /Block tags module --> diff --git a/modules/blocktags/config.xml b/modules/blocktags/config.xml new file mode 100755 index 000000000..0fe98d259 --- /dev/null +++ b/modules/blocktags/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blocktags</name> + <displayName><![CDATA[Tags block]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Adds a block containing a tag cloud.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blocktags/de.php b/modules/blocktags/de.php new file mode 100644 index 000000000..f8af26d0d --- /dev/null +++ b/modules/blocktags/de.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocktags}prestashop>blocktags_189f63f277cd73395561651753563065'] = 'Tags'; +$_MODULE['<{blocktags}prestashop>blocktags_49fa2426b7903b3d4c89e2c1874d9346'] = 'Mehr darüber'; +$_MODULE['<{blocktags}prestashop>blocktags_70d5e9f2bb7bcb17339709134ba3a2c6'] = 'noch keine Tags angegeben '; +$_MODULE['<{blocktags}prestashop>blocktags_f2568a62d4ac8d1d5b532556379772ba'] = 'Tags Block'; +$_MODULE['<{blocktags}prestashop>blocktags_a332910d45d955dad6c84817fe478e95'] = 'Fügt einen Block mit einer Tag-Cloud hinzu'; +$_MODULE['<{blocktags}prestashop>blocktags_4c1ef2cab0e711084a14f3d367a13c54'] = 'Sie müssen das Feld \"angezeigte Tags\" ausfüllen'; +$_MODULE['<{blocktags}prestashop>blocktags_73293a024e644165e9bf48f270af63a0'] = 'Ungültige Anzahl.'; +$_MODULE['<{blocktags}prestashop>blocktags_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blocktags}prestashop>blocktags_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blocktags}prestashop>blocktags_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blocktags}prestashop>blocktags_a2701a006c71c9097d80ea1ddaea8fa9'] = 'Angezeigte Tags'; +$_MODULE['<{blocktags}prestashop>blocktags_ba1ebc23c8fd03e9b97da2f856f70765'] = 'Stellen Sie die Anzahl der Tags ein, die in diesem Block angezeigt werden sollen'; +$_MODULE['<{blocktags}prestashop>blocktags_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blocktags/en.php b/modules/blocktags/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blocktags/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blocktags/es.php b/modules/blocktags/es.php new file mode 100644 index 000000000..8b6646572 --- /dev/null +++ b/modules/blocktags/es.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocktags}prestashop>blocktags_f2568a62d4ac8d1d5b532556379772ba'] = 'Bloque etiquetas'; +$_MODULE['<{blocktags}prestashop>blocktags_a332910d45d955dad6c84817fe478e95'] = 'Añadir un bloque que contenga una nube de etiquetas'; +$_MODULE['<{blocktags}prestashop>blocktags_4c1ef2cab0e711084a14f3d367a13c54'] = 'Debe completar el campo \"tags mostrados\"'; +$_MODULE['<{blocktags}prestashop>blocktags_73293a024e644165e9bf48f270af63a0'] = 'Número no válido'; +$_MODULE['<{blocktags}prestashop>blocktags_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmar'; +$_MODULE['<{blocktags}prestashop>blocktags_c888438d14855d7d96a2724ee9c306bd'] = 'Parámetros actualizados'; +$_MODULE['<{blocktags}prestashop>blocktags_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{blocktags}prestashop>blocktags_a2701a006c71c9097d80ea1ddaea8fa9'] = 'Etiquetas mostradas'; +$_MODULE['<{blocktags}prestashop>blocktags_ba1ebc23c8fd03e9b97da2f856f70765'] = 'Número de etiquetas mostradas en el bloque'; +$_MODULE['<{blocktags}prestashop>blocktags_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blocktags}prestashop>blocktags_189f63f277cd73395561651753563065'] = 'Etiquetas'; +$_MODULE['<{blocktags}prestashop>blocktags_49fa2426b7903b3d4c89e2c1874d9346'] = 'Más sobre'; +$_MODULE['<{blocktags}prestashop>blocktags_70d5e9f2bb7bcb17339709134ba3a2c6'] = 'Aún no hay etiquetas'; diff --git a/modules/blocktags/fr.php b/modules/blocktags/fr.php new file mode 100644 index 000000000..8f2de1583 --- /dev/null +++ b/modules/blocktags/fr.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocktags}prestashop>blocktags_f2568a62d4ac8d1d5b532556379772ba'] = 'Bloc tags'; +$_MODULE['<{blocktags}prestashop>blocktags_a332910d45d955dad6c84817fe478e95'] = 'Ajoute un bloc contenant les tags et un lien vers la recherche correspondante'; +$_MODULE['<{blocktags}prestashop>blocktags_4c1ef2cab0e711084a14f3d367a13c54'] = 'Vous devez remplir le champs \"tags affichés\"'; +$_MODULE['<{blocktags}prestashop>blocktags_73293a024e644165e9bf48f270af63a0'] = 'Nombre invalide.'; +$_MODULE['<{blocktags}prestashop>blocktags_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmer'; +$_MODULE['<{blocktags}prestashop>blocktags_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{blocktags}prestashop>blocktags_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{blocktags}prestashop>blocktags_a2701a006c71c9097d80ea1ddaea8fa9'] = 'Tags affichés'; +$_MODULE['<{blocktags}prestashop>blocktags_ba1ebc23c8fd03e9b97da2f856f70765'] = 'Nombre de tags affichés dans le bloc'; +$_MODULE['<{blocktags}prestashop>blocktags_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blocktags}prestashop>blocktags_189f63f277cd73395561651753563065'] = 'Tags'; +$_MODULE['<{blocktags}prestashop>blocktags_49fa2426b7903b3d4c89e2c1874d9346'] = 'En savoir plus à propos de'; +$_MODULE['<{blocktags}prestashop>blocktags_70d5e9f2bb7bcb17339709134ba3a2c6'] = 'Aucun tag spécifié pour le moment'; diff --git a/modules/blocktags/it.php b/modules/blocktags/it.php new file mode 100644 index 000000000..10f47cb2f --- /dev/null +++ b/modules/blocktags/it.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blocktags}prestashop>blocktags_189f63f277cd73395561651753563065'] = 'Tag'; +$_MODULE['<{blocktags}prestashop>blocktags_49fa2426b7903b3d4c89e2c1874d9346'] = 'Maggiori informazioni su'; +$_MODULE['<{blocktags}prestashop>blocktags_70d5e9f2bb7bcb17339709134ba3a2c6'] = 'Nessun tag ancora specificato '; +$_MODULE['<{blocktags}prestashop>blocktags_f2568a62d4ac8d1d5b532556379772ba'] = 'Blocco tags'; +$_MODULE['<{blocktags}prestashop>blocktags_a332910d45d955dad6c84817fe478e95'] = 'Aggiunge un blocco contenente una nuvola di tag '; +$_MODULE['<{blocktags}prestashop>blocktags_4c1ef2cab0e711084a14f3d367a13c54'] = 'È necessario compilare il campo \"tag visualizzati\"'; +$_MODULE['<{blocktags}prestashop>blocktags_73293a024e644165e9bf48f270af63a0'] = 'Numero non valido.'; +$_MODULE['<{blocktags}prestashop>blocktags_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blocktags}prestashop>blocktags_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blocktags}prestashop>blocktags_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blocktags}prestashop>blocktags_a2701a006c71c9097d80ea1ddaea8fa9'] = 'Tag visualizzati'; +$_MODULE['<{blocktags}prestashop>blocktags_ba1ebc23c8fd03e9b97da2f856f70765'] = 'Imposta il numero di tag da visualizzare in questo blocco'; +$_MODULE['<{blocktags}prestashop>blocktags_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blocktags/logo.gif b/modules/blocktags/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..291bfc764709a7e595050c1ed43b675f7af29c56 GIT binary patch literal 731 zcmV<10wn#3P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!ZAnByR5;6} zlg&$%Q5431?>IABYLga|n=&i1C^Ll$f?5eeicnA#1rn`Vw5g!~Ai_;Six%mol@YXv zpr{DSk_4&HqEGXqMs21Urx~61zW2TFJuNiKk5=8qxp3h5o#%3&<A@0VbHV^Ja!*YD z2O=6VJ`(td(TMSozyn_q7=;)Yd`0Zg4QD<eFhsT=T|^fF2j&VOFm>zLVh3I}!7>rV zy0cveL@eMS{2@4@V#Ifsc!DulJ&DQpf%Op4v$xe?6=D@)U81WGV*SDrfWQL`Vikx# zC;D5g5L>`a_LDBIB75he%=~zQqY~|505hGQwLEXKi?wPF;-YiIct4j@Rd<3|O#|8C zTHZhC><9zcK%qYMV7$)|Xb?l7a+FlZ5nDj##-OBu%J?oaL+^+>n(`G@l&xA93j+jh z8k0*<w(~e(v3ivJtD8trz@PaB#XE@AG~-Ql6J72w`uaV-(rM*R?+pPsBKXMxrXHOq zD13sz$BK`a|B8gS65H5<8o!PcnIckFPDx?tyPunA+I8mk$I$QpF5lgbpG}c{dKoJ| zne;f?ZXvd*4VAb?DB`1Y>q$O-j?Nca8_zy`4G;prD4e1YrH!W$vy!p<UD%a-h;M5_ zPj*ri6}((Esb~E}QhjVb*Vn%w2a2itR}iBZOJ*o*Y{N*LiNUK>#G|OpS~5?22&Z3S zwVIa$XW=s4>S&U~r@Q#jeV*}=UW(V%W0I-yifB=D-Gvu#7REiau<_yZq|tBhQd7T= z($ZQI{e#oW)d!XmFX`aO{z|uT!<z8!tu;u*>vfZ<ldYEqzWi&Qe*wVTa_}14^jH7@ N002ovPDHLkV1m}kQ7-@h literal 0 HcmV?d00001 diff --git a/modules/blockuserinfo/blockuserinfo.php b/modules/blockuserinfo/blockuserinfo.php new file mode 100644 index 000000000..068906c71 --- /dev/null +++ b/modules/blockuserinfo/blockuserinfo.php @@ -0,0 +1,81 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockUserInfo extends Module +{ + public function __construct() + { + $this->name = 'blockuserinfo'; + $this->tab = 'front_office_features'; + $this->version = 0.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('User info block'); + $this->description = $this->l('Adds a block that displays information about the customer.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('top') AND $this->registerHook('header')); + } + + /** + * Returns module content for header + * + * @param array $params Parameters + * @return string Content + */ + public function hookTop($params) + { + if (!$this->active) + return; + global $smarty, $cookie, $cart; + $smarty->assign(array( + 'cart' => $cart, + 'cart_qties' => $cart->nbProducts(), + 'logged' => $cookie->isLogged(), + 'customerName' => ($cookie->logged ? $cookie->customer_firstname.' '.$cookie->customer_lastname : false), + 'firstName' => ($cookie->logged ? $cookie->customer_firstname : false), + 'lastName' => ($cookie->logged ? $cookie->customer_lastname : false), + 'order_process' => Configuration::get('PS_ORDER_PROCESS_TYPE') ? 'order-opc' : 'order' + )); + return $this->display(__FILE__, 'blockuserinfo.tpl'); + } + + public function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockuserinfo.css', 'all'); + } +} + + diff --git a/modules/blockuserinfo/blockuserinfo.tpl b/modules/blockuserinfo/blockuserinfo.tpl new file mode 100644 index 000000000..afda01393 --- /dev/null +++ b/modules/blockuserinfo/blockuserinfo.tpl @@ -0,0 +1,62 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block user information module HEADER --> +<div id="header_user"> + <p id="header_user_info"> + {l s='Welcome' mod='blockuserinfo'}, + {if $cookie->isLogged()} + <span>{$cookie->customer_firstname} {$cookie->customer_lastname}</span> + (<a href="{$link->getPageLink('index', true, NULL, "mylogout")}" title="{l s='Log me out' mod='blockuserinfo'}">{l s='Log out' mod='blockuserinfo'}</a>) + {else} + <a href="{$link->getPageLink('my-account', true)}">{l s='Log in' mod='blockuserinfo'}</a> + {/if} + </p> + <ul id="header_nav"> + {if !$PS_CATALOG_MODE} + <li id="shopping_cart"> + <a href="{$link->getPageLink("$order_process", true)}" title="{l s='Your Shopping Cart' mod='blockuserinfo'}">{l s='Cart:' mod='blockuserinfo'}</a> + <span class="ajax_cart_quantity{if $cart_qties == 0} hidden{/if}">{$cart_qties}</span> + <span class="ajax_cart_product_txt{if $cart_qties != 1} hidden{/if}">{l s='product' mod='blockuserinfo'}</span> + <span class="ajax_cart_product_txt_s{if $cart_qties < 2} hidden{/if}">{l s='products' mod='blockuserinfo'}</span> + {if $cart_qties >= 0} + <span class="ajax_cart_total{if $cart_qties == 0} hidden{/if}"> + {if $priceDisplay == 1} + {assign var='blockuser_cart_flag' value='Cart::BOTH_WITHOUT_SHIPPING'|constant} + {convertPrice price=$cart->getOrderTotal(false, $blockuser_cart_flag)} + {else} + {assign var='blockuser_cart_flag' value='Cart::BOTH_WITHOUT_SHIPPING'|constant} + {convertPrice price=$cart->getOrderTotal(true, $blockuser_cart_flag)} + {/if} + </span> + {/if} + <span class="ajax_cart_no_product{if $cart_qties > 0} hidden{/if}">{l s='(empty)' mod='blockuserinfo'}</span> + </li> + {/if} + <li id="your_account"><a href="{$link->getPageLink('my-account', true)}" title="{l s='Your Account' mod='blockuserinfo'}">{l s='Your Account' mod='blockuserinfo'}</a></li> + </ul> +</div> +<!-- /Block user information module HEADER --> diff --git a/modules/blockuserinfo/config.xml b/modules/blockuserinfo/config.xml new file mode 100755 index 000000000..16d5474ba --- /dev/null +++ b/modules/blockuserinfo/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockuserinfo</name> + <displayName><![CDATA[User info block]]></displayName> + <version><![CDATA[0.1]]></version> + <description><![CDATA[Adds a block that displays information about the customer.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockuserinfo/de.php b/modules/blockuserinfo/de.php new file mode 100644 index 000000000..ea13a6c2e --- /dev/null +++ b/modules/blockuserinfo/de.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_83218ac34c1834c26781fe4bde918ee4'] = 'Willkommen'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4b877ba8588b19f1b278510bf2b57ebb'] = 'Abmelden'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4394c8d8e63c470de62ced3ae85de5ae'] = 'Abmelden'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_bffe9a3c9a7e00ba00a11749e022d911'] = 'bitte melden Sie sich an!'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_12641546686fe11aaeb3b3c43a18c1b3'] = 'Ihr Warenkorb'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_7fc68677a16caa0f02826182468617e6'] = 'Warenkorb:'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_f5bf48aa40cad7891eb709fcf1fde128'] = 'Produkt'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_86024cad1e83101d97359d7351051156'] = 'Produkte'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(Leer)'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a0623b78a5f2cfe415d9dbbd4428ea40'] = 'Ihr Konto'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a2e9cd952cda8ba167e62b25a496c6c1'] = 'Benutzerinfo-Block'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_970a31aa19d205f92ccfd1913ca04dc0'] = 'Fügt einen Block hinzu, der Informationen über den Kunden anzeigt'; + +?> \ No newline at end of file diff --git a/modules/blockuserinfo/en.php b/modules/blockuserinfo/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockuserinfo/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockuserinfo/es.php b/modules/blockuserinfo/es.php new file mode 100644 index 000000000..ed4ab20e6 --- /dev/null +++ b/modules/blockuserinfo/es.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a2e9cd952cda8ba167e62b25a496c6c1'] = 'Bloque de información personal'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_970a31aa19d205f92ccfd1913ca04dc0'] = 'Añadir un bloque para mostrar información acerca del cliente'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_83218ac34c1834c26781fe4bde918ee4'] = 'Bienvenido'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4b877ba8588b19f1b278510bf2b57ebb'] = 'Cerrer sesión'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4394c8d8e63c470de62ced3ae85de5ae'] = 'Salir'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_bffe9a3c9a7e00ba00a11749e022d911'] = 'Entrar'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_12641546686fe11aaeb3b3c43a18c1b3'] = 'Su carrito de la compra'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_7fc68677a16caa0f02826182468617e6'] = 'Carrito:'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_f5bf48aa40cad7891eb709fcf1fde128'] = 'producto'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_86024cad1e83101d97359d7351051156'] = 'productos'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_9e65b51e82f2a9b9f72ebe3e083582bb'] = 'vacío'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a0623b78a5f2cfe415d9dbbd4428ea40'] = 'Su cuenta'; diff --git a/modules/blockuserinfo/fr.php b/modules/blockuserinfo/fr.php new file mode 100644 index 000000000..b5cf3171d --- /dev/null +++ b/modules/blockuserinfo/fr.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a2e9cd952cda8ba167e62b25a496c6c1'] = 'Bloc informations clients'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_970a31aa19d205f92ccfd1913ca04dc0'] = 'Ajoute un bloc avec des liens utiles pour le client (login, déconnexion...)'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_83218ac34c1834c26781fe4bde918ee4'] = 'Bienvenue'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4b877ba8588b19f1b278510bf2b57ebb'] = 'Me déconnecter'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4394c8d8e63c470de62ced3ae85de5ae'] = 'déconnexion'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_bffe9a3c9a7e00ba00a11749e022d911'] = 'identifiez-vous'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_12641546686fe11aaeb3b3c43a18c1b3'] = 'Votre panier d\'achat'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_7fc68677a16caa0f02826182468617e6'] = 'Panier :'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_f5bf48aa40cad7891eb709fcf1fde128'] = 'produit'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_86024cad1e83101d97359d7351051156'] = 'produits'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(vide)'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a0623b78a5f2cfe415d9dbbd4428ea40'] = 'Votre compte'; diff --git a/modules/blockuserinfo/it.php b/modules/blockuserinfo/it.php new file mode 100644 index 000000000..1fa890bbb --- /dev/null +++ b/modules/blockuserinfo/it.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_83218ac34c1834c26781fe4bde918ee4'] = 'Benvenuti'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4b877ba8588b19f1b278510bf2b57ebb'] = 'Fammi uscire'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_4394c8d8e63c470de62ced3ae85de5ae'] = 'Esci'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_bffe9a3c9a7e00ba00a11749e022d911'] = 'Entra'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_12641546686fe11aaeb3b3c43a18c1b3'] = 'Il tuo carrello'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_7fc68677a16caa0f02826182468617e6'] = 'Carrello:'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_f5bf48aa40cad7891eb709fcf1fde128'] = 'prodotto'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_86024cad1e83101d97359d7351051156'] = 'prodotti'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_9e65b51e82f2a9b9f72ebe3e083582bb'] = '(vuoto)'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a0623b78a5f2cfe415d9dbbd4428ea40'] = 'Il tuo account'; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_a2e9cd952cda8ba167e62b25a496c6c1'] = 'Blocco info utente '; +$_MODULE['<{blockuserinfo}prestashop>blockuserinfo_970a31aa19d205f92ccfd1913ca04dc0'] = 'Aggiungi un blocco che visualizza le informazioni sul cliente'; + +?> \ No newline at end of file diff --git a/modules/blockuserinfo/logo.gif b/modules/blockuserinfo/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d38b9c5b90f9e8e3b42cefd36cb809994405ba1c GIT binary patch literal 600 zcmV-e0;l~)Nk%w1VGsZi0LFU&OD+>!GY?xc6(u}sEk0-;J)a*ypk_M}Awj1iM5`i2 zs&PIJB1WtnM!s%96&y&sBuTM#K@uNH#fLr&Yegb*L>YZT5g$y%AW*X;PqIQ#h>A!L zhe{8PND_)l4~I(+hf5KKOcg{_ijYeXmrD<pP7#w+5j9}HN?xRySQ4995}#NSl3OZa zVTPMtA6RCeZDe|yVlAg=Bd2XNu5>iVbSbENO{sfM%6BTwc_l-Q|IU0U(S0e-elAXz z{(_IZQ=I-&p8Zgt|5Tv;SEBw^qyJf@{<xQXl%BI$sQy~0{#&g7U9A4doN->U{$aBI zfT{j?uK3fUZC|$kW48ZbxBp?e{$jcQWV!y)segL6|6{=aXutl1yY+y<|82+qY03ZU zvv}XNiR8D6?YMsByN>R<f^yXV@4SPn$o!bm|MA6_?#ia>%&YFrr})gA!`Acm&!zUz zr}ogO#@F_w<p1~7uhio7?%&PU<o5UI+5i9l|NsC0|NsC0|NsC0A^s6Va%Ew3Wn>_C zX>@2HM@dak03rDV0SW+r04x9i000mG5CA|2pn!jZgM@{J4|g{<HaBn$hJq7EV@(bf z6bFSoW-nb!N<=_KLQyDaIEE!EDJC2X0FZwyY;AILZEi7!B57)0Tv$#?Lt0Q8h8PA4 z3<(GY8L@&LBO4Y1(IhJ#A0QzS0kJN6Yh_ttcrvjAGjDcwaWn*w7kPDOU|UmObP|L+ mVMwY_dBVg<5Fa{zkf|{!M~f3yu1K_E1p<s7QliBQ1OPj{wiJs1 literal 0 HcmV?d00001 diff --git a/modules/blockviewed/blockviewed.php b/modules/blockviewed/blockviewed.php new file mode 100644 index 000000000..8de9247bc --- /dev/null +++ b/modules/blockviewed/blockviewed.php @@ -0,0 +1,191 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockViewed extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + function __construct() + { + $this->name = 'blockviewed'; + $this->tab = 'front_office_features'; + $this->version = 0.9; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Viewed products block'); + $this->description = $this->l('Adds a block displaying last-viewed products.'); + } + + function install() + { + if (!parent::install() + OR !$this->registerHook('leftColumn') + OR !$this->registerHook('header') + OR !Configuration::updateValue('PRODUCTS_VIEWED_NBR', 2)) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitBlockViewed')) + { + if (!$productNbr = Tools::getValue('productNbr') OR empty($productNbr)) + $output .= '<div class="alert error">'.$this->l('You must fill in the \'Products displayed\' field.').'</div>'; + elseif ((int)($productNbr) == 0) + $output .= '<div class="alert error">'.$this->l('Invalid number.').'</div>'; + else + { + Configuration::updateValue('PRODUCTS_VIEWED_NBR', (int)($productNbr)); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Products displayed').'</label> + <div class="margin-form"> + <input type="text" name="productNbr" value="'.Configuration::get('PRODUCTS_VIEWED_NBR').'" /> + <p class="clear">'.$this->l('Define the number of products displayed in this block').'</p> + </div> + <center><input type="submit" name="submitBlockViewed" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + function hookRightColumn($params) + { + global $link, $smarty, $cookie; + + $id_product = (int)(Tools::getValue('id_product')); + $productsViewed = (isset($params['cookie']->viewed) AND !empty($params['cookie']->viewed)) ? array_slice(explode(',', $params['cookie']->viewed), 0, Configuration::get('PRODUCTS_VIEWED_NBR')) : array(); + + if (sizeof($productsViewed)) + { + $defaultCover = Language::getIsoById($params['cookie']->id_lang).'-default'; + + $productIds = implode(',', $productsViewed); + $productsImages = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT i.id_image, p.id_product, il.legend, p.active, pl.name, pl.description_short, pl.link_rewrite, cl.link_rewrite AS category_rewrite + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product) + LEFT JOIN '._DB_PREFIX_.'image i ON (i.id_product = p.id_product AND i.cover = 1) + LEFT JOIN '._DB_PREFIX_.'image_lang il ON (il.id_image = i.id_image) + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = p.id_category_default) + WHERE p.id_product IN ('.$productIds.') + AND pl.id_lang = '.(int)($params['cookie']->id_lang).' + AND cl.id_lang = '.(int)($params['cookie']->id_lang) + ); + + $productsImagesArray = array(); + foreach ($productsImages AS $pi) + $productsImagesArray[$pi['id_product']] = $pi; + + $productsViewedObj = array(); + foreach ($productsViewed AS $productViewed) + { + $obj = (object)'Product'; + if (!isset($productsImagesArray[$productViewed]) || (!$obj->active = $productsImagesArray[$productViewed]['active'])) + continue; + else + { + $obj->id = (int)($productsImagesArray[$productViewed]['id_product']); + $obj->cover = (int)($productsImagesArray[$productViewed]['id_product']).'-'.(int)($productsImagesArray[$productViewed]['id_image']); + $obj->legend = $productsImagesArray[$productViewed]['legend']; + $obj->name = $productsImagesArray[$productViewed]['name']; + $obj->description_short = $productsImagesArray[$productViewed]['description_short']; + $obj->link_rewrite = $productsImagesArray[$productViewed]['link_rewrite']; + $obj->category_rewrite = $productsImagesArray[$productViewed]['category_rewrite']; + + if (!isset($obj->cover) || !$productsImagesArray[$productViewed]['id_image']) + { + $obj->cover = $defaultCover; + $obj->legend = ''; + } + $productsViewedObj[] = $obj; + } + } + + if ($id_product AND !in_array($id_product, $productsViewed)) + { + // Check if the user to the right of access to this product + $result = Db::getInstance()->getRow(' + SELECT COUNT(cug.`id_customer`) AS total + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = p.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`) + LEFT JOIN `'._DB_PREFIX_.'customer_group` cug ON (cug.`id_group` = cg.`id_group`) + WHERE p.`id_product` = '.(int)($id_product).' + '.($cookie->id_customer ? 'AND cug.`id_customer` = '.(int)($cookie->id_customer) : + 'AND cg.`id_group` = 1') + ); + if ($result['total']) + array_unshift($productsViewed, $id_product); + } + $viewed = ''; + foreach ($productsViewed AS $id_product_viewed) + $viewed .= (int)($id_product_viewed).','; + $params['cookie']->viewed = rtrim($viewed, ','); + + if (!sizeof($productsViewedObj)) + return ; + + $smarty->assign(array( + 'productsViewedObj' => $productsViewedObj, + 'mediumSize' => Image::getSize('medium'))); + + return $this->display(__FILE__, 'blockviewed.tpl'); + } + elseif ($id_product) + $params['cookie']->viewed = (int)($id_product); + return ; + } + + function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockviewed.css', 'all'); + } +} diff --git a/modules/blockviewed/blockviewed.tpl b/modules/blockviewed/blockviewed.tpl new file mode 100644 index 000000000..f73d2a13e --- /dev/null +++ b/modules/blockviewed/blockviewed.tpl @@ -0,0 +1,41 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Block Viewed products --> +<div id="viewed-products_block_left" class="block products_block"> + <h4>{l s='Viewed products' mod='blockviewed'}</h4> + <div class="block_content"> + <ul class="products clearfix"> + {foreach from=$productsViewedObj item=viewedProduct name=myLoop} + <li class="clearfix{if $smarty.foreach.myLoop.last} last_item{elseif $smarty.foreach.myLoop.first} first_item{else} item{/if}"> + <a href="{$link->getProductLink($viewedProduct->id, $viewedProduct->link_rewrite, $viewedProduct->category_rewrite)}" title="{l s='More about' mod='blockviewed'} {$viewedProduct->name|escape:html:'UTF-8'}"><img src="{$link->getImageLink($viewedProduct->link_rewrite, $viewedProduct->cover, 'medium')}" height="{$mediumSize.height}" width="{$mediumSize.width}" alt="{$viewedProduct->legend|escape:html:'UTF-8'}" /></a> + <h5><a href="{$link->getProductLink($viewedProduct->id, $viewedProduct->link_rewrite, $viewedProduct->category_rewrite)}" title="{l s='More about' mod='blockviewed'} {$viewedProduct->name|escape:html:'UTF-8'}">{$viewedProduct->name|truncate:14:'...'|escape:html:'UTF-8'}</a></h5> + <p>{$viewedProduct->description_short|strip_tags:'UTF-8'|truncate:44}<a href="{$link->getProductLink($viewedProduct->id, $viewedProduct->link_rewrite, $viewedProduct->category_rewrite)}" title="{l s='More about' mod='blockviewed'} {$viewedProduct->name|escape:html:'UTF-8'}"><img src="{$img_dir}bullet.gif" alt="&gt;&gt;" width="10" height="7" /></a></p> + </li> + {/foreach} + </ul> + </div> +</div> diff --git a/modules/blockviewed/config.xml b/modules/blockviewed/config.xml new file mode 100755 index 000000000..162d7d04a --- /dev/null +++ b/modules/blockviewed/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockviewed</name> + <displayName><![CDATA[Viewed products block]]></displayName> + <version><![CDATA[0.9]]></version> + <description><![CDATA[Adds a block displaying last-viewed products.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockviewed/de.php b/modules/blockviewed/de.php new file mode 100644 index 000000000..ba97d9ce5 --- /dev/null +++ b/modules/blockviewed/de.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockviewed}prestashop>blockviewed_43560641f91e63dc83682bc598892fa1'] = 'Angesehene Produkte'; +$_MODULE['<{blockviewed}prestashop>blockviewed_49fa2426b7903b3d4c89e2c1874d9346'] = 'Mehr darüber'; +$_MODULE['<{blockviewed}prestashop>blockviewed_859e85774d372c6084d62d02324a1cc3'] = 'Angesehene Produkte-Block'; +$_MODULE['<{blockviewed}prestashop>blockviewed_fad87bb9a90d9e42854af13633aac252'] = 'Fügt einen Block hinzu, der die zuletzt angesehenen Produkte anzeigt'; +$_MODULE['<{blockviewed}prestashop>blockviewed_2e57399079951d84b435700493b8a8c1'] = 'Sie müssen das Feld \"Angezeigte Produkte\" ausfüllen'; +$_MODULE['<{blockviewed}prestashop>blockviewed_73293a024e644165e9bf48f270af63a0'] = 'Ungültige Anzahl.'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{blockviewed}prestashop>blockviewed_e451e6943bb539d1bd804d2ede6474b5'] = 'Angezeigte Produkte'; +$_MODULE['<{blockviewed}prestashop>blockviewed_8ce2b5b3ffa27a8a66220a49357a1582'] = 'Definieren Sie die Anzahl der Produkte, die in diesem Block angezeigt werden'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/blockviewed/en.php b/modules/blockviewed/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockviewed/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockviewed/es.php b/modules/blockviewed/es.php new file mode 100644 index 000000000..fd60725ee --- /dev/null +++ b/modules/blockviewed/es.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockviewed}prestashop>blockviewed_859e85774d372c6084d62d02324a1cc3'] = 'Bloque de productos vistos'; +$_MODULE['<{blockviewed}prestashop>blockviewed_fad87bb9a90d9e42854af13633aac252'] = 'Añadir un bloque para mostrar los últimos productos vistos'; +$_MODULE['<{blockviewed}prestashop>blockviewed_2e57399079951d84b435700493b8a8c1'] = 'Debe rellenar el campo\'Productos mostrados'; +$_MODULE['<{blockviewed}prestashop>blockviewed_73293a024e644165e9bf48f270af63a0'] = 'Número no válido.'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{blockviewed}prestashop>blockviewed_e451e6943bb539d1bd804d2ede6474b5'] = 'Productos mostrados'; +$_MODULE['<{blockviewed}prestashop>blockviewed_8ce2b5b3ffa27a8a66220a49357a1582'] = 'Definir el número de productos mostrados en cada bloque'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockviewed}prestashop>blockviewed_43560641f91e63dc83682bc598892fa1'] = 'Productos más vistos'; +$_MODULE['<{blockviewed}prestashop>blockviewed_49fa2426b7903b3d4c89e2c1874d9346'] = 'Más sobre'; diff --git a/modules/blockviewed/fr.php b/modules/blockviewed/fr.php new file mode 100644 index 000000000..73feb519a --- /dev/null +++ b/modules/blockviewed/fr.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockviewed}prestashop>blockviewed_859e85774d372c6084d62d02324a1cc3'] = 'Bloc produits déjà vus'; +$_MODULE['<{blockviewed}prestashop>blockviewed_fad87bb9a90d9e42854af13633aac252'] = 'Ajoute un bloc proposant les derniers produits vus par le client'; +$_MODULE['<{blockviewed}prestashop>blockviewed_2e57399079951d84b435700493b8a8c1'] = 'Champ \"Produits vus\" obligatoire'; +$_MODULE['<{blockviewed}prestashop>blockviewed_73293a024e644165e9bf48f270af63a0'] = 'Nombre invalide.'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{blockviewed}prestashop>blockviewed_e451e6943bb539d1bd804d2ede6474b5'] = 'Nombre de produits affichés'; +$_MODULE['<{blockviewed}prestashop>blockviewed_8ce2b5b3ffa27a8a66220a49357a1582'] = 'Détermine le nombre de produits affichés dans ce bloc'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{blockviewed}prestashop>blockviewed_43560641f91e63dc83682bc598892fa1'] = 'Déjà vus'; +$_MODULE['<{blockviewed}prestashop>blockviewed_49fa2426b7903b3d4c89e2c1874d9346'] = 'En savoir plus à propos de'; diff --git a/modules/blockviewed/it.php b/modules/blockviewed/it.php new file mode 100644 index 000000000..9e04c6799 --- /dev/null +++ b/modules/blockviewed/it.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockviewed}prestashop>blockviewed_43560641f91e63dc83682bc598892fa1'] = 'Prodotti visti'; +$_MODULE['<{blockviewed}prestashop>blockviewed_49fa2426b7903b3d4c89e2c1874d9346'] = 'Maggiori informazioni su'; +$_MODULE['<{blockviewed}prestashop>blockviewed_859e85774d372c6084d62d02324a1cc3'] = 'Blocco prodotti visti'; +$_MODULE['<{blockviewed}prestashop>blockviewed_fad87bb9a90d9e42854af13633aac252'] = 'Aggiunge un blocco che visualizza i prodotti visti recentemente'; +$_MODULE['<{blockviewed}prestashop>blockviewed_2e57399079951d84b435700493b8a8c1'] = 'È necessario compilare il campo \"prodotti esposti\"'; +$_MODULE['<{blockviewed}prestashop>blockviewed_73293a024e644165e9bf48f270af63a0'] = 'Numero non valido.'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockviewed}prestashop>blockviewed_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{blockviewed}prestashop>blockviewed_e451e6943bb539d1bd804d2ede6474b5'] = 'Prodotti esposti'; +$_MODULE['<{blockviewed}prestashop>blockviewed_8ce2b5b3ffa27a8a66220a49357a1582'] = 'Definisci il numero di prodotti esposti in questo blocco'; +$_MODULE['<{blockviewed}prestashop>blockviewed_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/blockviewed/logo.gif b/modules/blockviewed/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1258171ccfb0488625783c74c7556d8e38cf330 GIT binary patch literal 954 zcmZ?wbhEHb6krfwXlG#fr|@w{yZ_Ek|2=&X$EPKonVUUr(bj#dCePe@bMBr8tB>AV zeBjCQgAbM+e!A-Dv#n<z?>YZy>$&gSFTCD!<MW}l(=TtIeQ(Fa2WPe(IdbI8nKSqA z-#>8q`RUv5j^6uv^6sZo55Apy{NviwueYCnz5nLNvuDrVzkmPk^N;V}zyJULpJ5b? zhQL6FfZ|UUW{?|nKm;gHFmOy~U}QMqupz;bmq|FyqH)neXAyM+g%FO9Ek}h^Jr*b^ zPF!@fUqZV~CgS7cP9c6{jx!%NC>`t32$_^qX}H8^ny$Hq$At$6J7?=EdI%UEYG&bZ zkhkLaxX`&>fM=4GkHMjrECSq1%yI;hn!*J*wk*2wfU)H!2b;#4oXn<XW_C`V5QTz7 ag~QYM^hGuZFf_0=H*m^HC@3f}SOWmnhnXq> literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/WishList.php b/modules/blockwishlist/WishList.php new file mode 100644 index 000000000..9b4acf81c --- /dev/null +++ b/modules/blockwishlist/WishList.php @@ -0,0 +1,517 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class WishList extends ObjectModel +{ + /** @var integer Wishlist ID */ + public $id; + + /** @var integer Customer ID */ + public $id_customer; + + /** @var integer Token */ + public $token; + + /** @var integer Name */ + public $name; + + /** @var string Object creation date */ + public $date_add; + + /** @var string Object last modification date */ + public $date_upd; + + protected $fieldsSize = array('name' => 64, 'token' => 64); + protected $fieldsRequired = array('id_customer', 'name', 'token'); + protected $fieldsValidate = array('id_customer' => 'isUnsignedId', 'name' => 'isMessage', + 'token' => 'isMessage'); + protected $table = 'wishlist'; + protected $identifier = 'id_wishlist'; + + public function getFields() + { + parent::validateFields(); + $fields['id_customer'] = (int)($this->id_customer); + $fields['token'] = pSQL($this->token); + $fields['name'] = pSQL($this->name); + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return ($fields); + } + + public function delete() + { + global $cookie; + + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'wishlist_email` WHERE `id_wishlist` = '.(int)($this->id)); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'wishlist_product` WHERE `id_wishlist` = '.(int)($this->id)); + if (isset($cookie->id_wishlist)) + unset($cookie->id_wishlist); + + return (parent::delete()); + } + + /** + * Increment counter + * + * @return boolean succeed + */ + static public function incCounter($id_wishlist) + { + if (!Validate::isUnsignedId($id_wishlist)) + die (Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT `counter` + FROM `'._DB_PREFIX_.'wishlist` + WHERE `id_wishlist` = '.(int)($id_wishlist)); + if ($result == false OR !sizeof($result) OR empty($result) === true) + return (false); + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist` SET + `counter` = '.(int)($result['counter'] + 1).' + WHERE `id_wishlist` = '.(int)($id_wishlist))); + } + + + static public function isExistsByNameForUser($name) + { + global $cookie; + + return Db::getInstance()->getValue(' + SELECT COUNT(*) AS total + FROM `'._DB_PREFIX_.'wishlist` + WHERE `name` = \''.pSQL($name).'\' + AND `id_customer` = '.(int)($cookie->id_customer) + ); + } + + /** + * Return true if wishlist exists else false + * + * @return boolean exists + */ + static public function exists($id_wishlist, $id_customer, $return = false) + { + if (!Validate::isUnsignedId($id_wishlist) OR + !Validate::isUnsignedId($id_customer)) + die (Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT `id_wishlist`, `name`, `token` + FROM `'._DB_PREFIX_.'wishlist` + WHERE `id_wishlist` = '.(int)($id_wishlist).' + AND `id_customer` = '.(int)($id_customer)); + if (empty($result) === false AND $result != false AND sizeof($result)) + { + if ($return === false) + return (true); + else + return ($result); + } + return (false); + } + + /** + * Get ID wishlist by Token + * + * @return array Results + */ + static public function getByToken($token) + { + if (!Validate::isMessage($token)) + die (Tools::displayError()); + return (Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT w.`id_wishlist`, w.`name`, w.`id_customer`, c.`firstname`, c.`lastname` + FROM `'._DB_PREFIX_.'wishlist` w + INNER JOIN `'._DB_PREFIX_.'customer` c ON c.`id_customer` = w.`id_customer` + WHERE `token` = \''.pSQL($token).'\'')); + } + + /** + * Get Wishlists by Customer ID + * + * @return array Results + */ + static public function getByIdCustomer($id_customer) + { + if (!Validate::isUnsignedId($id_customer)) + die (Tools::displayError()); + return (Db::getInstance()->ExecuteS(' + SELECT w.`id_wishlist`, w.`name`, w.`token`, w.`date_add`, w.`date_upd`, w.`counter` + FROM `'._DB_PREFIX_.'wishlist` w + WHERE `id_customer` = '.(int)($id_customer).' + ORDER BY w.`name` ASC')); + } + + static public function refreshWishList($id_wishlist) + { + $old_carts = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT wp.id_product, wp.id_product_attribute, wpc.id_cart, UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(wpc.date_add) AS timecart + FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc + JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.id_wishlist_product = wpc.id_wishlist_product) + JOIN `'._DB_PREFIX_.'cart` c ON (c.id_cart = wpc.id_cart) + JOIN `'._DB_PREFIX_.'cart_product` cp ON (wpc.id_cart = cp.id_cart) + LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.id_cart = c.id_cart) + WHERE (wp.id_wishlist='.(int)($id_wishlist).' AND o.id_cart IS NULL) + HAVING timecart >= 3600*6'); + + if(isset($old_carts) AND $old_carts != false) + foreach ($old_carts AS $old_cart) + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'cart_product` + WHERE id_cart='.(int)($old_cart['id_cart']).' AND id_product='.(int)($old_cart['id_product']).' AND id_product_attribute='.(int)($old_cart['id_product_attribute']) + ); + + $freshwish = Db::getInstance()->ExecuteS(' + SELECT wpc.id_cart, wpc.id_wishlist_product + FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc + JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wpc.id_wishlist_product = wp.id_wishlist_product) + JOIN `'._DB_PREFIX_.'cart` c ON (c.id_cart = wpc.id_cart) + LEFT JOIN `'._DB_PREFIX_.'cart_product` cp ON (cp.id_cart = wpc.id_cart AND cp.id_product = wp.id_product AND cp.id_product_attribute = wp.id_product_attribute) + WHERE (wp.id_wishlist = '.(int)($id_wishlist).' AND ((cp.id_product IS NULL AND cp.id_product_attribute IS NULL))) + '); + $res = Db::getInstance()->ExecuteS(' + SELECT wp.id_wishlist_product, cp.quantity AS cart_quantity, wpc.quantity AS wish_quantity, wpc.id_cart + FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc + JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.id_wishlist_product = wpc.id_wishlist_product) + JOIN `'._DB_PREFIX_.'cart` c ON (c.id_cart = wpc.id_cart) + JOIN `'._DB_PREFIX_.'cart_product` cp ON (cp.id_cart = wpc.id_cart AND cp.id_product = wp.id_product AND cp.id_product_attribute = wp.id_product_attribute) + WHERE wp.id_wishlist='.(int)($id_wishlist) + ); + + if(isset($res) AND $res != false) + foreach ($res AS $refresh) + if($refresh['wish_quantity'] > $refresh['cart_quantity']) + { + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product` + SET `quantity`= `quantity` + '.((int)($refresh['wish_quantity']) - (int)($refresh['cart_quantity'])).' + WHERE id_wishlist_product='.(int)($refresh['id_wishlist_product']) + ); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product_cart` + SET `quantity`='.(int)($refresh['cart_quantity']).' + WHERE id_wishlist_product='.(int)($refresh['id_wishlist_product']).' AND id_cart='.(int)($refresh['id_cart']) + ); + } + if(isset($freshwish) AND $freshwish != false) + foreach ($freshwish AS $prodcustomer) + { + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product` SET `quantity`=`quantity` + + ( + SELECT `quantity` FROM `'._DB_PREFIX_.'wishlist_product_cart` + WHERE `id_wishlist_product`='.(int)($prodcustomer['id_wishlist_product']).' AND `id_cart`='.(int)($prodcustomer['id_cart']).' + ) + WHERE `id_wishlist_product`='.(int)($prodcustomer['id_wishlist_product']).' AND `id_wishlist`='.(int)($id_wishlist) + ); + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'wishlist_product_cart` + WHERE `id_wishlist_product`='.(int)($prodcustomer['id_wishlist_product']).' AND `id_cart`='.(int)($prodcustomer['id_cart']) + ); + } + } + + /** + * Get Wishlist products by Customer ID + * + * @return array Results + */ + static public function getProductByIdCustomer($id_wishlist, $id_customer, $id_lang, $id_product = null, $quantity = false) + { + if (!Validate::isUnsignedId($id_customer) OR + !Validate::isUnsignedId($id_lang) OR + !Validate::isUnsignedId($id_wishlist)) + die (Tools::displayError()); + $products = Db::getInstance()->ExecuteS(' + SELECT wp.`id_product`, wp.`quantity`, p.`quantity` AS product_quantity, pl.`name`, wp.`id_product_attribute`, wp.`priority`, pl.link_rewrite, cl.link_rewrite AS category_rewrite + FROM `'._DB_PREFIX_.'wishlist_product` wp + JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = wp.`id_product` + JOIN `'._DB_PREFIX_.'product_lang` pl ON pl.`id_product` = wp.`id_product` + JOIN `'._DB_PREFIX_.'wishlist` w ON w.`id_wishlist` = wp.`id_wishlist` + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON cl.`id_category` = p.`id_category_default` AND cl.id_lang='.(int)$id_lang.' + WHERE w.`id_customer` = '.(int)($id_customer).' + AND pl.`id_lang` = '.(int)($id_lang).' + AND wp.`id_wishlist` = '.(int)($id_wishlist). + (empty($id_product) === false ? ' AND wp.`id_product` = '.(int)($id_product) : ''). + ($quantity == true ? ' AND wp.`quantity` != 0': '')); + if (empty($products) === true OR !sizeof($products)) + return array(); + for ($i = 0; $i < sizeof($products); ++$i) + { + if (isset($products[$i]['id_product_attribute']) AND + Validate::isUnsignedInt($products[$i]['id_product_attribute'])) + { + $result = Db::getInstance()->ExecuteS(' + SELECT al.`name` AS attribute_name, pa.`quantity` AS "attribute_quantity" + FROM `'._DB_PREFIX_.'product_attribute_combination` pac + LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`) + LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`) + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pac.`id_product_attribute` = pa.`id_product_attribute`) + WHERE pac.`id_product_attribute` = '.(int)($products[$i]['id_product_attribute'])); + $products[$i]['attributes_small'] = ''; + if ($result) + foreach ($result AS $k => $row) + $products[$i]['attributes_small'] .= $row['attribute_name'].', '; + $products[$i]['attributes_small'] = rtrim($products[$i]['attributes_small'], ', '); + if (isset($result[0])) + $products[$i]['attribute_quantity'] = $result[0]['attribute_quantity']; + } + else + $products[$i]['attribute_quantity'] = $products[$i]['product_quantity']; + } + return ($products); + } + + /** + * Get Wishlists number products by Customer ID + * + * @return array Results + */ + static public function getInfosByIdCustomer($id_customer) + { + if (!Validate::isUnsignedId($id_customer)) + die (Tools::displayError()); + return (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT SUM(wp.`quantity`) AS nbProducts, wp.`id_wishlist` + FROM `'._DB_PREFIX_.'wishlist_product` wp + INNER JOIN `'._DB_PREFIX_.'wishlist` w ON (w.`id_wishlist` = wp.`id_wishlist`) + WHERE w.`id_customer` = '.(int)($id_customer).' + GROUP BY w.`id_wishlist` + ORDER BY w.`name` ASC')); + } + + /** + * Add product to ID wishlist + * + * @return boolean succeed + */ + static public function addProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute, $quantity) + { + if (!Validate::isUnsignedId($id_wishlist) OR + !Validate::isUnsignedId($id_customer) OR + !Validate::isUnsignedId($id_product) OR + !Validate::isUnsignedId($quantity)) + die (Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT wp.`quantity` + FROM `'._DB_PREFIX_.'wishlist_product` wp + JOIN `'._DB_PREFIX_.'wishlist` w ON (w.`id_wishlist` = wp.`id_wishlist`) + WHERE wp.`id_wishlist` = '.(int)($id_wishlist).' + AND w.`id_customer` = '.(int)($id_customer).' + AND wp.`id_product` = '.(int)($id_product).' + AND wp.`id_product_attribute` = '.(int)($id_product_attribute)); + if (empty($result) === false AND sizeof($result)) + { + if (($result['quantity'] + $quantity) <= 0) + return (WishList::removeProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute)); + else + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product` SET + `quantity` = '.(int)($quantity + $result['quantity']).' + WHERE `id_wishlist` = '.(int)($id_wishlist).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute))); + } + else + return (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'wishlist_product` (`id_wishlist`, `id_product`, `id_product_attribute`, `quantity`, `priority`) VALUES( + '.(int)($id_wishlist).', + '.(int)($id_product).', + '.(int)($id_product_attribute).', + '.(int)($quantity).', 1)')); + + } + + /** + * Update product to wishlist + * + * @return boolean succeed + */ + static public function updateProduct($id_wishlist, $id_product, $id_product_attribute, $priority, $quantity) + { + if (!Validate::isUnsignedId($id_wishlist) OR + !Validate::isUnsignedId($id_product) OR + !Validate::isUnsignedId($quantity) OR + $priority < 0 OR $priority > 2) + die (Tools::displayError()); + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product` SET + `priority` = '.(int)($priority).', + `quantity` = '.(int)($quantity).' + WHERE `id_wishlist` = '.(int)($id_wishlist).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute))); + } + + /** + * Remove product from wishlist + * + * @return boolean succeed + */ + static public function removeProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute) + { + if (!Validate::isUnsignedId($id_wishlist) OR + !Validate::isUnsignedId($id_customer) OR + !Validate::isUnsignedId($id_product)) + die (Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT w.`id_wishlist`, wp.`id_wishlist_product` + FROM `'._DB_PREFIX_.'wishlist` w + LEFT JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.`id_wishlist` = w.`id_wishlist`) + WHERE `id_customer` = '.(int)($id_customer).' + AND w.`id_wishlist` = '.(int)($id_wishlist)); + if (empty($result) === true OR + $result === false OR + !sizeof($result) OR + $result['id_wishlist'] != $id_wishlist) + return (false); + // Delete product in wishlist_product_cart + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'wishlist_product_cart` + WHERE `id_wishlist_product` = '.(int)($result['id_wishlist_product']) + ); + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'wishlist_product` + WHERE `id_wishlist` = '.(int)($id_wishlist).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute) + ); + } + + /** + * Return bought product by ID wishlist + * + * @return Array results + */ + static public function getBoughtProduct($id_wishlist) + { + + if (!Validate::isUnsignedId($id_wishlist)) + die (Tools::displayError()); + return (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT wp.`id_product`, wp.`id_product_attribute`, wpc.`quantity`, wpc.`date_add`, cu.`lastname`, cu.`firstname` + FROM `'._DB_PREFIX_.'wishlist_product_cart` wpc + JOIN `'._DB_PREFIX_.'wishlist_product` wp ON (wp.id_wishlist_product = wpc.id_wishlist_product) + JOIN `'._DB_PREFIX_.'cart` ca ON (ca.id_cart = wpc.id_cart) + JOIN `'._DB_PREFIX_.'customer` cu ON (cu.`id_customer` = ca.`id_customer`) + WHERE wp.`id_wishlist` = '.(int)($id_wishlist))); + } + + /** + * Add bought product + * + * @return boolean succeed + */ + static public function addBoughtProduct($id_wishlist, $id_product, $id_product_attribute, $id_cart, $quantity) + { + if (!Validate::isUnsignedId($id_wishlist) OR + !Validate::isUnsignedId($id_product) OR + !Validate::isUnsignedId($quantity)) + die (Tools::displayError()); + $result = Db::getInstance()->getRow(' + SELECT `quantity`, `id_wishlist_product` + FROM `'._DB_PREFIX_.'wishlist_product` wp + WHERE `id_wishlist` = '.(int)($id_wishlist).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute)); + + if (!sizeof($result) OR + ($result['quantity'] - $quantity) < 0 OR + $quantity > $result['quantity']) + return (false); + + Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'wishlist_product_cart` + WHERE `id_wishlist_product`='.(int)($result['id_wishlist_product']).' AND `id_cart`='.(int)($id_cart) + ); + + if (Db::getInstance()->NumRows() > 0) + $result2= Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product_cart` + SET `quantity`=`quantity` + '.(int)($quantity).' + WHERE `id_wishlist_product`='.(int)($result['id_wishlist_product']).' AND `id_cart`='.(int)($id_cart) + ); + + else + $result2 = Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'wishlist_product_cart` + (`id_wishlist_product`, `id_cart`, `quantity`, `date_add`) VALUES( + '.(int)($result['id_wishlist_product']).', + '.(int)($id_cart).', + '.(int)($quantity).', + \''.pSQL(date('Y-m-d H:i:s')).'\')'); + + if ($result2 === false) + return (false); + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'wishlist_product` SET + `quantity` = '.(int)($result['quantity'] - $quantity).' + WHERE `id_wishlist` = '.(int)($id_wishlist).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute))); + } + + /** + * Add email to wishlist + * + * @return boolean succeed + */ + static public function addEmail($id_wishlist, $email) + { + if (!Validate::isUnsignedId($id_wishlist) OR empty($email) OR !Validate::isEmail($email)) + return false; + return (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'wishlist_email` (`id_wishlist`, `email`, `date_add`) VALUES( + '.(int)($id_wishlist).', + \''.pSQL($email).'\', + \''.pSQL(date('Y-m-d H:i:s')).'\')')); + } + + /** + * Get email from wishlist + * + * @return Array results + */ + static public function getEmail($id_wishlist, $id_customer) + { + if (!Validate::isUnsignedId($id_wishlist) OR + !Validate::isUnsignedId($id_customer)) + die (Tools::displayError()); + return (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT we.`email`, we.`date_add` + FROM `'._DB_PREFIX_.'wishlist_email` we + INNER JOIN `'._DB_PREFIX_.'wishlist` w ON w.`id_wishlist` = we.`id_wishlist` + WHERE we.`id_wishlist` = '.(int)($id_wishlist).' + AND w.`id_customer` = '.(int)($id_customer))); + } +}; diff --git a/modules/blockwishlist/blockwishlist-ajax.tpl b/modules/blockwishlist/blockwishlist-ajax.tpl new file mode 100644 index 000000000..e372f5a71 --- /dev/null +++ b/modules/blockwishlist/blockwishlist-ajax.tpl @@ -0,0 +1,50 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $products} + <dl class="products" style="{if $products}border-bottom:1px solid #fff;{/if}"> + {foreach from=$products item=product name=i} + <dt class="{if $smarty.foreach.i.first}first_item{elseif $smarty.foreach.i.last}last_item{else}item{/if}"> + <span class="quantity-formated"><span class="quantity">{$product.quantity|intval}</span>x</span> + <a class="cart_block_product_name" href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{$product.name|escape:'htmlall':'UTF-8'}" style="font-weight:bold;">{$product.name|truncate:13:'...'|escape:'htmlall':'UTF-8'}</a> + <a class="ajax_cart_block_remove_link" href="javascript:;" onclick="javascript:WishlistCart('wishlist_block_list', 'delete', '{$product.id_product}', {$product.id_product_attribute}, '0');" title="{l s='remove this product from my wishlist' mod='blockwishlist'}"><img src="{$img_dir}icon/delete.gif" width="11" height="13" alt="{l s='Delete'}" class="icon" /></a> + </dt> + {if isset($product.attributes_small)} + <dd class="{if $smarty.foreach.i.first}first_item{elseif $smarty.foreach.i.last}last_item{else}item{/if}" style="font-style:italic;margin:0 0 0 10px;"> + <a href="{$link->getProductLink($product.id_product, $product.link_rewrite)}" title="{l s='Product detail'}">{$product.attributes_small|escape:'htmlall':'UTF-8'}</a> + </dd> + {/if} + {/foreach} + </dl> +{else} + <dl class="products" style="font-size:10px;border-bottom:1px solid #fff;"> + {if isset($error) && $error} + <dt>{l s='You must create a wishlist before adding products' mod='blockwishlist'}</dt> + {else} + <dt>{l s='No products' mod='blockwishlist'}</dt> + {/if} + </dl> +{/if} diff --git a/modules/blockwishlist/blockwishlist-extra.tpl b/modules/blockwishlist/blockwishlist-extra.tpl new file mode 100644 index 000000000..30fbcb783 --- /dev/null +++ b/modules/blockwishlist/blockwishlist-extra.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="buttons_bottom_block"><a href="#" id="wishlist_button" class="button" onclick="WishlistCart('wishlist_block_list', 'add', '{$id_product|intval}', $('#idCombination').val(), document.getElementById('quantity_wanted').value); return false;">{l s='Add to my wishlist' mod='blockwishlist'}</a></p> \ No newline at end of file diff --git a/modules/blockwishlist/blockwishlist-header.tpl b/modules/blockwishlist/blockwishlist-header.tpl new file mode 100644 index 000000000..f31a71dc3 --- /dev/null +++ b/modules/blockwishlist/blockwishlist-header.tpl @@ -0,0 +1,29 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- BlockWishlist --> +<script type="text/javascript" src="{$modules_dir}blockwishlist/js/ajax-wishlist.js"></script> +<!-- END BlockWishlist --> \ No newline at end of file diff --git a/modules/blockwishlist/blockwishlist.php b/modules/blockwishlist/blockwishlist.php new file mode 100644 index 000000000..352d9f740 --- /dev/null +++ b/modules/blockwishlist/blockwishlist.php @@ -0,0 +1,340 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class BlockWishList extends Module +{ + const INSTALL_SQL_FILE = 'install.sql'; + + private $_html = ''; + private $_postErrors = array(); + + public function __construct() + { + $this->name = 'blockwishlist'; + $this->tab = 'front_office_features'; + $this->version = 0.2; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Wishlist block'); + $this->description = $this->l('Adds a block containing the customer\'s wishlists.'); + $this->default_wishlist_name = $this->l('My wishlist'); + } + + public function install() + { + if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return (false); + else if (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return (false); + $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); + $sql = preg_split("/;\s*[\r\n]+/", $sql); + foreach ($sql AS $query) + if($query) + if(!Db::getInstance()->Execute(trim($query))) + return false; + if (!parent::install() OR + !$this->registerHook('rightColumn') OR + !$this->registerHook('productActions') OR + !$this->registerHook('cart') OR + !$this->registerHook('customerAccount') OR + !$this->registerHook('header') OR + !$this->registerHook('adminCustomers') + ) + return false; + /* This hook is optional */ + $this->registerHook('myAccountBlock'); + return true; + } + + public function uninstall() + { + return ( + Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'wishlist') AND + Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'wishlist_email') AND + Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'wishlist_product') AND + Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'wishlist_product_cart') AND + parent::uninstall() + ); + } + + public function getContent() + { + $this->_html = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitSettings')) + { + $activated = Tools::getValue('activated'); + if ($activated != 0 AND $activated != 1) + $this->_html .= '<div class="alert error">'.$this->l('Activate module : Invalid choice.').'</div>'; + $this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + $this->_displayForm(); + return ($this->_html); + } + + private function _displayForm() + { + $this->_displayFormView(); + } + + private function _displayFormView() + { + global $cookie; + + $customers = Customer::getCustomers(); + if (!sizeof($customers)) + return; + $id_customer = (int)(Tools::getValue('id_customer')); + if (!$id_customer) + $id_customer = $customers[0]['id_customer']; + $this->_html .= '<br /> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post" id="listing"> + <fieldset> + <legend><img src="'.$this->_path.'img/icon/package_go.png" alt="" title="" />'.$this->l('Listing').'</legend> + + <label>'.$this->l('Customers').'</label> + <div class="margin-form"> + <select name="id_customer" onchange="$(\'#listing\').submit();">'; + foreach ($customers as $customer) + { + $this->_html .= '<option value="'.(int)($customer['id_customer']).'"'; + if ($customer['id_customer'] == $id_customer) + $this->_html .= ' selected="selected"'; + $this->_html .= '>'.htmlentities($customer['firstname'], ENT_COMPAT, 'UTF-8').' '.htmlentities($customer['lastname'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= ' + </select> + </div>'; + require_once(dirname(__FILE__).'/WishList.php'); + $wishlists = WishList::getByIdCustomer($id_customer); + if (!sizeof($wishlists)) + return ($this->_html .= '</fieldset></form>'); + $id_wishlist = false; + foreach ($wishlists AS $row) + if ($row['id_wishlist'] == Tools::getValue('id_wishlist')) + { + $id_wishlist = (int)(Tools::getValue('id_wishlist')); + break; + } + if (!$id_wishlist) + $id_wishlist = $wishlists[0]['id_wishlist']; + $this->_html .= ' + <label>'.$this->l('Wishlists').'</label> + <div class="margin-form"> + <select name="id_wishlist" onchange="$(\'#listing\').submit();">'; + foreach ($wishlists as $wishlist) + { + $this->_html .= '<option value="'.(int)($wishlist['id_wishlist']).'"'; + if ($wishlist['id_wishlist'] == $id_wishlist) + { + $this->_html .= ' selected="selected"'; + $counter = $wishlist['counter']; + } + $this->_html .= '>'.htmlentities($wishlist['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= ' + </select> + </div>'; + $this->_displayProducts((int)($id_wishlist)); + $this->_html .= '</fieldset> + </form>'; + } + + public function hookHeader($params) + { + Tools::addCSS(($this->_path).'blockwishlist.css', 'all'); + return $this->display(__FILE__, 'blockwishlist-header.tpl'); + } + + public function hookRightColumn($params) + { + global $smarty, $errors; + + require_once(dirname(__FILE__).'/WishList.php'); + if ($params['cookie']->isLogged()) + { + $wishlists = Wishlist::getByIdCustomer($params['cookie']->id_customer); + if (empty($params['cookie']->id_wishlist) === true || + WishList::exists($params['cookie']->id_wishlist, $params['cookie']->id_customer) === false) + { + if (!sizeof($wishlists)) + $id_wishlist = false; + else + { + $id_wishlist = (int)($wishlists[0]['id_wishlist']); + $params['cookie']->id_wishlist = (int)($id_wishlist); + } + } + else + $id_wishlist = $params['cookie']->id_wishlist; + $smarty->assign(array( + 'id_wishlist' => $id_wishlist, + 'isLogged' => true, + 'wishlist_products' => ($id_wishlist == false ? false : WishList::getProductByIdCustomer($id_wishlist, $params['cookie']->id_customer, $params['cookie']->id_lang, null, true)), + 'wishlists' => $wishlists, + 'ptoken' => Tools::getToken(false))); + } + else + $smarty->assign(array('wishlist_products' => false, 'wishlists' => false)); + return ($this->display(__FILE__, 'blockwishlist.tpl')); + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookProductActions($params) + { + global $smarty; + + $smarty->assign('id_product', (int)(Tools::getValue('id_product'))); + return ($this->display(__FILE__, 'blockwishlist-extra.tpl')); + } + + public function hookCustomerAccount($params) + { + global $smarty; + return $this->display(__FILE__, 'my-account.tpl'); + } + + public function hookMyAccountBlock($params) + { + return $this->hookCustomerAccount($params); + } + + private function _displayProducts($id_wishlist) + { + global $cookie, $link; + include_once(dirname(__FILE__).'/WishList.php'); + + $wishlist = new WishList((int)($id_wishlist)); + $products = WishList::getProductByIdCustomer((int)($id_wishlist), (int)($wishlist->id_customer), (int)($cookie->id_lang)); + for ($i = 0; $i < sizeof($products); ++$i) + { + $obj = new Product((int)($products[$i]['id_product']), false, (int)($cookie->id_lang)); + if (!Validate::isLoadedObject($obj)) + continue; + else + { + $images = $obj->getImages((int)($cookie->id_lang)); + foreach ($images AS $k => $image) + { + if ($image['cover']) + { + $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; + break; + } + } + if (!isset($products[$i]['cover'])) + $products[$i]['cover'] = Language::getIsoById((int)($cookie->id_lang)).'-default'; + } + } + $this->_html .= ' + <table class="table"> + <thead> + <tr> + <th class="first_item" style="width:600px;">'.$this->l('Product').'</th> + <th class="item" style="text-align:center;width:150px;">'.$this->l('Quantity').'</th> + <th class="item" style="text-align:center;width:150px;">'.$this->l('Priority').'</th> + </tr> + </thead> + <tbody>'; + $priority = array($this->l('High'), $this->l('Medium'), $this->l('Low')); + foreach ($products as $product) + { + $this->_html .= ' + <tr> + <td class="first_item"> + <img src="'.$link->getImageLink($product['link_rewrite'], $product['cover'], 'small').'" alt="'.htmlentities($product['name'], ENT_COMPAT, 'UTF-8').'" style="float:left;" /> + '.$product['name']; + if (isset($product['attributes_small'])) + $this->_html .= '<br /><i>'.htmlentities($product['attributes_small'], ENT_COMPAT, 'UTF-8').'</i>'; + $this->_html .= ' + </td> + <td class="item" style="text-align:center;">'.(int)($product['quantity']).'</td> + <td class="item" style="text-align:center;">'.$priority[(int)($product['priority']) % 3].'</td> + </tr>'; + } + $this->_html .= '</tbody></table>'; + } + + public function hookAdminCustomers($params) + { + require_once(dirname(__FILE__).'/WishList.php'); + + $customer = new Customer((int)($params['id_customer'])); + if (!Validate::isLoadedObject($customer)) + die (Tools::displayError()); + + $this->_html = '<h2>'.$this->l('Wishlists').'</h2>'; + + $wishlists = WishList::getByIdCustomer((int)($customer->id)); + if (!sizeof($wishlists)) + $this->_html .= $customer->lastname.' '.$customer->firstname.' '.$this->l('No wishlist.'); + else + { + $this->_html .= '<form action="'.$_SERVER['REQUEST_URI'].'" method="post" id="listing">'; + + $id_wishlist = (int)(Tools::getValue('id_wishlist')); + if (!$id_wishlist) + $id_wishlist = $wishlists[0]['id_wishlist']; + + $this->_html .= '<span>'.$this->l('Wishlist').': </span> <select name="id_wishlist" onchange="$(\'#listing\').submit();">'; + foreach ($wishlists as $wishlist) + { + $this->_html .= '<option value="'.(int)($wishlist['id_wishlist']).'"'; + if ($wishlist['id_wishlist'] == $id_wishlist) + { + $this->_html .= ' selected="selected"'; + $counter = $wishlist['counter']; + } + $this->_html .= '>'.htmlentities($wishlist['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select>'; + + $this->_displayProducts((int)($id_wishlist)); + + $this->_html .= '</form><br />'; + + return $this->_html; + } + } + /* + * Display Error from controler + */ + public function errorLogged() + { + return $this->l('You must be logged in to manage your wishlists.'); + } +} + diff --git a/modules/blockwishlist/blockwishlist.tpl b/modules/blockwishlist/blockwishlist.tpl new file mode 100644 index 000000000..c6eab6efd --- /dev/null +++ b/modules/blockwishlist/blockwishlist.tpl @@ -0,0 +1,66 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<div id="wishlist_block" class="block account"> + <h4> + <a href="{$base_dir_ssl}/modules/blockwishlist/mywishlist.php">{l s='Wishlist' mod='blockwishlist'}</a> + </h4> + <div class="block_content"> + <div id="wishlist_block_list" class="expanded"> + {if $wishlist_products} + <dl class="products"> + {foreach from=$wishlist_products item=product name=i} + <dt class="{if $smarty.foreach.i.first}first_item{elseif $smarty.foreach.i.last}last_item{else}item{/if}"> + <span class="quantity-formated"><span class="quantity">{$product.quantity|intval}</span>x</span> + <a class="cart_block_product_name" + href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{$product.name|escape:'htmlall':'UTF-8'}">{$product.name|truncate:30:'...'|escape:'htmlall':'UTF-8'}</a> + <a class="ajax_cart_block_remove_link" href="javascript:;" onclick="javascript:WishlistCart('wishlist_block_list', 'delete', '{$product.id_product}', {$product.id_product_attribute}, '0', '{$token}');" title="{l s='remove this product from my wishlist' mod='blockwishlist'}"><img src="{$img_dir}icon/delete.gif" width="11" height="13" alt="{l s='Delete'}" class="icon" /></a> + </dt> + {if isset($product.attributes_small)} + <dd class="{if $smarty.foreach.i.first}first_item{elseif $smarty.foreach.i.last}last_item{else}item{/if}"> + <a href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{l s='Product detail'}">{$product.attributes_small|escape:'htmlall':'UTF-8'}</a> + </dd> + {/if} + {/foreach} + </dl> + {else} + <dl class="products"> + <dt>{l s='No products' mod='blockwishlist'}</dt> + </dl> + {/if} + </div> + <p class="align_center"> + {if $wishlists} + <select name="wishlists" id="wishlists" onchange="WishlistChangeDefault('wishlist_block_list', $('#wishlists').val());"> + {foreach from=$wishlists item=wishlist name=i} + <option value="{$wishlist.id_wishlist}"{if $id_wishlist eq $wishlist.id_wishlist or ($id_wishlist == false and $smarty.foreach.i.first)} selected="selected"{/if}>{$wishlist.name|truncate:22:'...'|escape:'htmlall':'UTF-8'}</option> + {/foreach} + </select> + {/if} + <a href="{$base_dir_ssl}modules/blockwishlist/mywishlist.php" class="exclusive" title="{l s='My wishlists' mod='blockwishlist'}">{l s='My wishlists' mod='blockwishlist'}</a> + </p> + </div> +</div> diff --git a/modules/blockwishlist/buywishlistproduct.php b/modules/blockwishlist/buywishlistproduct.php new file mode 100644 index 000000000..c367d9003 --- /dev/null +++ b/modules/blockwishlist/buywishlistproduct.php @@ -0,0 +1,54 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); +require_once(dirname(__FILE__).'/WishList.php'); + + $error = ''; + +$token = Tools::getValue('token'); +$id_product = (int)(Tools::getValue('id_product')); +$id_product_attribute = (int)(Tools::getValue('id_product_attribute')); +if (Configuration::get('PS_TOKEN_ENABLE') == 1 && +strcmp(Tools::getToken(false), Tools::getValue('static_token'))) + $error = Tools::displayError('Invalid token'); + +if (!strlen($error) && + empty($token) === false && + empty($id_product) === false) +{ + $wishlist = WishList::getByToken($token); + if ($wishlist !== false) + WishList::addBoughtProduct($wishlist['id_wishlist'], $id_product, $id_product_attribute, $cart->id, 1); +} +else + $error = Tools::displayError('You must log in'); + +if (empty($error) === false) + echo $error; + diff --git a/modules/blockwishlist/cart.php b/modules/blockwishlist/cart.php new file mode 100644 index 000000000..6c34b6ec3 --- /dev/null +++ b/modules/blockwishlist/cart.php @@ -0,0 +1,87 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); +require_once(dirname(__FILE__).'/WishList.php'); +require_once(dirname(__FILE__).'/blockwishlist.php'); + +$errors = array(); + +$action = Tools::getValue('action'); +$add = (!strcmp($action, 'add') ? 1 : 0); +$delete = (!strcmp($action, 'delete') ? 1 : 0); +$id_wishlist = (int)(Tools::getValue('id_wishlist')); +$id_product = (int)(Tools::getValue('id_product')); +$quantity = (int)(Tools::getValue('quantity')); +$id_product_attribute = (int)(Tools::getValue('id_product_attribute')); +if (Configuration::get('PS_TOKEN_ENABLE') == 1 AND + strcmp(Tools::getToken(false), Tools::getValue('token')) AND + $cookie->isLogged() === true) + $errors[] = Tools::displayError('Invalid token'); +if ($cookie->isLogged()) +{ + if ($id_wishlist AND WishList::exists($id_wishlist, $cookie->id_customer) === true) + $cookie->id_wishlist = (int)($id_wishlist); + if (empty($cookie->id_wishlist) === true OR $cookie->id_wishlist == false) + $smarty->assign('error', true); + if (($add OR $delete) AND empty($id_product) === false) + { + if(!isset($cookie->id_wishlist) OR $cookie->id_wishlist == '') + { + $wishlist = new WishList(); + $modWishlist = new BlockWishList(); + $wishlist->name = $modWishlist->default_wishlist_name; + $wishlist->id_customer = (int)($cookie->id_customer); + list($us, $s) = explode(' ', microtime()); + srand($s * $us); + $wishlist->token = strtoupper(substr(sha1(uniqid(rand(), true)._COOKIE_KEY_.$cookie->id_customer), 0, 16)); + $wishlist->add(); + $cookie->id_wishlist = (int)($wishlist->id); + } + if ($add AND $quantity) + WishList::addProduct($cookie->id_wishlist, $cookie->id_customer, $id_product, $id_product_attribute, $quantity); + else if ($delete) + WishList::removeProduct($cookie->id_wishlist, $cookie->id_customer, $id_product, $id_product_attribute); + } + $smarty->assign('products', WishList::getProductByIdCustomer($cookie->id_wishlist, $cookie->id_customer, $cookie->id_lang, null, true)); + + if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/blockwishlist-ajax.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/blockwishlist-ajax.tpl'); + elseif (Tools::file_exists_cache(dirname(__FILE__).'/blockwishlist-ajax.tpl')) + $smarty->display(dirname(__FILE__).'/blockwishlist-ajax.tpl'); + else + echo Tools::displayError('No template found'); +} +else + $errors[] = Tools::displayError('You must be logged in to manage your wishlist.'); + +if (sizeof($errors)) +{ + $smarty->assign('errors', $errors); + $smarty->display(_PS_THEME_DIR_.'errors.tpl'); +} diff --git a/modules/blockwishlist/config.xml b/modules/blockwishlist/config.xml new file mode 100755 index 000000000..bd75c4425 --- /dev/null +++ b/modules/blockwishlist/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>blockwishlist</name> + <displayName><![CDATA[Wishlist block]]></displayName> + <version><![CDATA[0.2]]></version> + <description><![CDATA[Adds a block containing the customer&#039;s wishlists.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/blockwishlist/de.php b/modules/blockwishlist/de.php new file mode 100644 index 000000000..6d1b4b004 --- /dev/null +++ b/modules/blockwishlist/de.php @@ -0,0 +1,84 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4a84e5921e203aede886d04fc41a414b'] = 'Dieses Produkt von meiner Wunschliste nehmen'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Produkt-Detail'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_d037160cfb1fa5520563302d3a32630a'] = 'Sie müssen eine Wunschliste erstellen, bevor Sie Produkte hinzufügen'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_09dc02ecbb078868a3a86dded030076d'] = 'Keine Produkte'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-extra_15b94c64c4d5a4f7172e5347a36b94fd'] = 'Zu meiner Wunschliste hinzufügen'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_641254d77e7a473aa5910574f3f9453c'] = 'Wunschliste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4a84e5921e203aede886d04fc41a414b'] = 'Dieses Produkt von meiner Wunschliste nehmen'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Produkt-Detail'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_09dc02ecbb078868a3a86dded030076d'] = 'Keine Produkte'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Meine Wunschlisten'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_2715a65604e1af3d6933b61704865daf'] = 'Wunschlistenblock'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7244141a5de030c4c882556f4fd70a8b'] = 'Fügt einen Block hinzu mit der Kundenwunschliste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_9ae79c1fccd231ac7fbbf3235dbf6326'] = 'Meine Wunschliste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_5ef2d617096ae7b47a83f3d4de9c84bd'] = 'Modul Aktivieren: Ungültige Auswahl.'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_56ee3495a32081ccb6d2376eab391bfa'] = 'Listing'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Kunden'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e0fd9b310aba555f96e76738ff192ac3'] = 'Wunschlisten'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_deb10517653c255364175796ace3553f'] = 'Produkt'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Menge'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Priorität'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_655d20c1ca69519ca647684edbb2db35'] = 'Hoch'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Mittel'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Niedrig'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_862af8838fba380d3b30e63546a394e5'] = 'hatte keine Wunschliste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_88b589bbf6282a2e02f50ebe90aae6f1'] = 'Sie müssen eingeloggt sein, um Ihre Wunschlisten zu verwalten'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0ac1aeb2429db494dd42ad2dc219ca7e'] = 'Produkte verstecken '; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0de9d09a36e820f9da7e87ab3678dd12'] = 'Produkte anzeigen'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0bb3e067c0514f5ff2d5a8e45fc0f4be'] = 'Informationen über gekaufte Produkte verstecken'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_6fe88f5681da397d46fefe19b3020a6a'] = 'Informationen über gekaufte Produkte anzeigen'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_30820a1bf6a285e45cda2beda3d7738d'] = 'Diese Wunschliste absenden'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_65a26fd603de62416ed333c7a8928713'] = 'Schliessen Diese Wunschliste absenden'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Produkt-Detail'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Menge'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Priorität'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_655d20c1ca69519ca647684edbb2db35'] = 'Hoch'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Mittel'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Niedrig'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-Mail'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_94966d90747b97d1f0f206c98a8b1ac3'] = 'Senden'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_19f823c6453c2b1ffd09cb715214813d'] = 'Pflichtfeld'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_deb10517653c255364175796ace3553f'] = 'Produkt'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_3384622e86410fd01fa318fedc6a98ce'] = 'Angeboten von'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_44749712dbec183e983dcd78a7736c41'] = 'Datum'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_09dc02ecbb078868a3a86dded030076d'] = 'Keine Produkte'; +$_MODULE['<{blockwishlist}prestashop>my-account_7ec9cceb94985909c6994e95c31c1aa8'] = 'Meine Wunschliste'; +$_MODULE['<{blockwishlist}prestashop>my-account_723edf7c24638ed18d2fa831e647a5cc'] = 'Wunschliste'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mein Konto'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Meine Wunschlisten'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_06c335f27f292a096a9bf39e3a58e97b'] = 'Neue Wunschlisten'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_03ab340b3f99e03cff9e84314ead38c0'] = 'Anz'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_5e729042e30967c9d6f65c6eab73e2fe'] = 'Gesehen'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Erstellt'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_45284ef16392f85ff424b2ef36ab5948'] = 'Direkter Link'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_4351cfebe4b61d8aa5efa1d020710005'] = 'Anzeigen'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d025259319054206be54336a00defe89'] = 'Wollen Sie diese Wunschliste wirklich löschen?'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0b3db27bc15f682e92ff250ebb167d4b'] = 'Zurück zu Ihrem Konto'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_8cf04a9734132302f96da8e113e80ce5'] = 'Startseite'; +$_MODULE['<{blockwishlist}prestashop>view_641254d77e7a473aa5910574f3f9453c'] = 'Wunschliste'; +$_MODULE['<{blockwishlist}prestashop>view_9862d189193590487b2686b1c9043714'] = 'Andere Wunschlisten von'; +$_MODULE['<{blockwishlist}prestashop>view_3d01e7d8174b6a9b088b44870714cf07'] = 'Willkommen zur Wunschliste von'; +$_MODULE['<{blockwishlist}prestashop>view_4351cfebe4b61d8aa5efa1d020710005'] = 'Anzeigen'; +$_MODULE['<{blockwishlist}prestashop>view_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Produkt-Detail'; +$_MODULE['<{blockwishlist}prestashop>view_3d0d1f906e27800531e054a3b6787b7c'] = 'Menge:'; +$_MODULE['<{blockwishlist}prestashop>view_05f32f85cccc8308d09a81e7bad3f80e'] = 'Priorität:'; +$_MODULE['<{blockwishlist}prestashop>view_655d20c1ca69519ca647684edbb2db35'] = 'Hoch'; +$_MODULE['<{blockwishlist}prestashop>view_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Mittel'; +$_MODULE['<{blockwishlist}prestashop>view_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Niedrig'; +$_MODULE['<{blockwishlist}prestashop>view_2d0f6b8300be19cf35e89e66f0677f95'] = 'In den Einkaufswagen'; +$_MODULE['<{blockwishlist}prestashop>view_09dc02ecbb078868a3a86dded030076d'] = 'Keine Produkte'; + +?> \ No newline at end of file diff --git a/modules/blockwishlist/en.php b/modules/blockwishlist/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/blockwishlist/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/blockwishlist/es.php b/modules/blockwishlist/es.php new file mode 100644 index 000000000..a140882c7 --- /dev/null +++ b/modules/blockwishlist/es.php @@ -0,0 +1,82 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4a84e5921e203aede886d04fc41a414b'] = 'Borrar este producto de mi lista'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Detalle del producto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_d037160cfb1fa5520563302d3a32630a'] = 'Debe crear su wishlist antes de añadir productos'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_09dc02ecbb078868a3a86dded030076d'] = 'Ningún producto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-extra_15b94c64c4d5a4f7172e5347a36b94fd'] = 'Añadir a mi wishlist'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_2715a65604e1af3d6933b61704865daf'] = 'Bloque de wishlist'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7244141a5de030c4c882556f4fd70a8b'] = 'Añadir un bloque que contenga la wishlist de los clientes'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_9ae79c1fccd231ac7fbbf3235dbf6326'] = 'Mi wishlist'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_5ef2d617096ae7b47a83f3d4de9c84bd'] = 'Módulo activado: opción no válida'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_56ee3495a32081ccb6d2376eab391bfa'] = 'Listado'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clientes'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e0fd9b310aba555f96e76738ff192ac3'] = 'Wishlist'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_deb10517653c255364175796ace3553f'] = 'Producto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Cantidad'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Prioridad'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_655d20c1ca69519ca647684edbb2db35'] = 'Alta'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Media'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Baja'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_862af8838fba380d3b30e63546a394e5'] = 'no hay lista de regalos'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_641254d77e7a473aa5910574f3f9453c'] = 'lista de regalos'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_88b589bbf6282a2e02f50ebe90aae6f1'] = 'Necesita acceder a su cuenta para administrar su lista de deseos.'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4a84e5921e203aede886d04fc41a414b'] = 'retirar este producto de mi lista'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Detalles producto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_09dc02ecbb078868a3a86dded030076d'] = 'Ningún producto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Mis listas de regalo'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0ac1aeb2429db494dd42ad2dc219ca7e'] = 'Ocultar productos'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0de9d09a36e820f9da7e87ab3678dd12'] = 'Mostrar productos'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0bb3e067c0514f5ff2d5a8e45fc0f4be'] = 'Ocultar la información sobre los productos comprados'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_6fe88f5681da397d46fefe19b3020a6a'] = 'Mostrar la información sobre los productos comprados'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_30820a1bf6a285e45cda2beda3d7738d'] = 'Enviar esta lista'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_65a26fd603de62416ed333c7a8928713'] = 'Cerrar en envío de la lista'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Detalle producto'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Cantidad'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Prioridad'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_655d20c1ca69519ca647684edbb2db35'] = 'Alta'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Media'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Baja'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_c9cc8cce247e49bae79f15173ce97354'] = 'guardar'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_94966d90747b97d1f0f206c98a8b1ac3'] = 'Enviar'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_19f823c6453c2b1ffd09cb715214813d'] = 'Campo requerido'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_deb10517653c255364175796ace3553f'] = 'Productos'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_3384622e86410fd01fa318fedc6a98ce'] = 'regalo de '; +$_MODULE['<{blockwishlist}prestashop>managewishlist_44749712dbec183e983dcd78a7736c41'] = 'Fecha'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_09dc02ecbb078868a3a86dded030076d'] = 'ningún producto'; +$_MODULE['<{blockwishlist}prestashop>my-account_7ec9cceb94985909c6994e95c31c1aa8'] = 'Mi lista de regalos'; +$_MODULE['<{blockwishlist}prestashop>my-account_723edf7c24638ed18d2fa831e647a5cc'] = 'lista de regalos'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mi cuenta'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Mi lista de regalo'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_06c335f27f292a096a9bf39e3a58e97b'] = 'Nueva lista de regalo'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_49ee3087348e8d44e1feda1917443987'] = 'Nombre '; +$_MODULE['<{blockwishlist}prestashop>mywishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_03ab340b3f99e03cff9e84314ead38c0'] = 'Cantidad'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_5e729042e30967c9d6f65c6eab73e2fe'] = 'Vistos'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Creado'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_45284ef16392f85ff424b2ef36ab5948'] = 'Enlace directo'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Eliminar'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_4351cfebe4b61d8aa5efa1d020710005'] = 'Ver'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d025259319054206be54336a00defe89'] = '¿Desea realamente eliminar esta lista?'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0b3db27bc15f682e92ff250ebb167d4b'] = 'Volver a su cuenta'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_8cf04a9734132302f96da8e113e80ce5'] = 'Inicio'; +$_MODULE['<{blockwishlist}prestashop>view_641254d77e7a473aa5910574f3f9453c'] = 'Lista de regalo'; +$_MODULE['<{blockwishlist}prestashop>view_9862d189193590487b2686b1c9043714'] = 'Otras listas de regalo'; +$_MODULE['<{blockwishlist}prestashop>view_3d01e7d8174b6a9b088b44870714cf07'] = 'Bienvenido a la lista de regalos'; +$_MODULE['<{blockwishlist}prestashop>view_4351cfebe4b61d8aa5efa1d020710005'] = 'Vista'; +$_MODULE['<{blockwishlist}prestashop>view_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Detalle producto'; +$_MODULE['<{blockwishlist}prestashop>view_3d0d1f906e27800531e054a3b6787b7c'] = 'Cantidad'; +$_MODULE['<{blockwishlist}prestashop>view_05f32f85cccc8308d09a81e7bad3f80e'] = 'Prioridad'; +$_MODULE['<{blockwishlist}prestashop>view_655d20c1ca69519ca647684edbb2db35'] = 'Alta'; +$_MODULE['<{blockwishlist}prestashop>view_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Media'; +$_MODULE['<{blockwishlist}prestashop>view_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Baja'; +$_MODULE['<{blockwishlist}prestashop>view_2d0f6b8300be19cf35e89e66f0677f95'] = 'Añadir al carrito'; +$_MODULE['<{blockwishlist}prestashop>view_09dc02ecbb078868a3a86dded030076d'] = 'No hay productos'; diff --git a/modules/blockwishlist/fr.php b/modules/blockwishlist/fr.php new file mode 100644 index 000000000..3396ac3e0 --- /dev/null +++ b/modules/blockwishlist/fr.php @@ -0,0 +1,82 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4a84e5921e203aede886d04fc41a414b'] = 'Supprimer ce produit de ma liste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Détail du produit'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_d037160cfb1fa5520563302d3a32630a'] = 'Vous devez créer une liste avant d\'ajouter un produit'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_09dc02ecbb078868a3a86dded030076d'] = 'Aucun produit'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-extra_15b94c64c4d5a4f7172e5347a36b94fd'] = 'Ajouter à ma liste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_2715a65604e1af3d6933b61704865daf'] = 'Bloc liste de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7244141a5de030c4c882556f4fd70a8b'] = 'Ajoute un bloc gérant les listes de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_9ae79c1fccd231ac7fbbf3235dbf6326'] = 'Ma liste de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_5ef2d617096ae7b47a83f3d4de9c84bd'] = 'Choix invalide pour l\'activation du module'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres enregistrés'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_56ee3495a32081ccb6d2376eab391bfa'] = 'Liste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clients'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e0fd9b310aba555f96e76738ff192ac3'] = 'Listes de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_deb10517653c255364175796ace3553f'] = 'Produit'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantité'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Priorité'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_655d20c1ca69519ca647684edbb2db35'] = 'Haute'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Moyenne'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Basse'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_862af8838fba380d3b30e63546a394e5'] = 'n\'a pas de liste cadeaux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_641254d77e7a473aa5910574f3f9453c'] = 'Liste de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_88b589bbf6282a2e02f50ebe90aae6f1'] = 'Vous devez être identifié pour gérer vos liste voeux'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4a84e5921e203aede886d04fc41a414b'] = 'Enlever ce produit de ma liste'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Détails produit'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_09dc02ecbb078868a3a86dded030076d'] = 'Aucun produit'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Mes listes'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0ac1aeb2429db494dd42ad2dc219ca7e'] = 'Cacher les produits'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0de9d09a36e820f9da7e87ab3678dd12'] = 'Afficher les produits'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0bb3e067c0514f5ff2d5a8e45fc0f4be'] = 'Cacher les informations des produits achetés'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_6fe88f5681da397d46fefe19b3020a6a'] = 'Afficher les informations des produits achetés'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_30820a1bf6a285e45cda2beda3d7738d'] = 'Envoyer cette liste'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_65a26fd603de62416ed333c7a8928713'] = 'Fermer'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Détails produit'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantité'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Priorité'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_655d20c1ca69519ca647684edbb2db35'] = 'Haute'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Moyenne'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Basse'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_94966d90747b97d1f0f206c98a8b1ac3'] = 'Envoyer'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_19f823c6453c2b1ffd09cb715214813d'] = 'Champ requis'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_deb10517653c255364175796ace3553f'] = 'Produit'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_3384622e86410fd01fa318fedc6a98ce'] = 'Offert par'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_09dc02ecbb078868a3a86dded030076d'] = 'Aucun produits'; +$_MODULE['<{blockwishlist}prestashop>my-account_7ec9cceb94985909c6994e95c31c1aa8'] = 'Mes listes de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>my-account_723edf7c24638ed18d2fa831e647a5cc'] = 'listecadeaux'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mon compte'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Mes listes'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_06c335f27f292a096a9bf39e3a58e97b'] = 'Nouvelle liste'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_03ab340b3f99e03cff9e84314ead38c0'] = 'Qté'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_5e729042e30967c9d6f65c6eab73e2fe'] = 'Vues'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Créée'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_45284ef16392f85ff424b2ef36ab5948'] = 'Lien direct'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d025259319054206be54336a00defe89'] = 'Souhaitez-vous réellement supprimer cette liste ?'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0b3db27bc15f682e92ff250ebb167d4b'] = 'Retour à votre compte'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_8cf04a9734132302f96da8e113e80ce5'] = 'Accueil'; +$_MODULE['<{blockwishlist}prestashop>view_641254d77e7a473aa5910574f3f9453c'] = 'Liste de cadeaux'; +$_MODULE['<{blockwishlist}prestashop>view_9862d189193590487b2686b1c9043714'] = 'Autres listes de'; +$_MODULE['<{blockwishlist}prestashop>view_3d01e7d8174b6a9b088b44870714cf07'] = 'Bienvenue sur la liste de '; +$_MODULE['<{blockwishlist}prestashop>view_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{blockwishlist}prestashop>view_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Détail produit'; +$_MODULE['<{blockwishlist}prestashop>view_3d0d1f906e27800531e054a3b6787b7c'] = 'Quantité :'; +$_MODULE['<{blockwishlist}prestashop>view_05f32f85cccc8308d09a81e7bad3f80e'] = 'Priorité :'; +$_MODULE['<{blockwishlist}prestashop>view_655d20c1ca69519ca647684edbb2db35'] = 'Haute'; +$_MODULE['<{blockwishlist}prestashop>view_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Moyenne'; +$_MODULE['<{blockwishlist}prestashop>view_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Basse'; +$_MODULE['<{blockwishlist}prestashop>view_2d0f6b8300be19cf35e89e66f0677f95'] = 'Ajouter au panier'; +$_MODULE['<{blockwishlist}prestashop>view_09dc02ecbb078868a3a86dded030076d'] = 'Aucun produit'; diff --git a/modules/blockwishlist/img/delete.gif b/modules/blockwishlist/img/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..43c6ca8763d79bde87bcf437e497af00c8be562d GIT binary patch literal 752 zcmZ?wbhEHb6kt$bc*el6GthYN-n}zt&b)vB{*)<GZZDnssVwQ*wQJ8pz3-M6ef|3N zTw?I^BRjWl-THaiqIb<TR|-<zzkh%9=+U)n*M2*H{@2X5mq}6Aa+CK)+kfaTd)M9Y zW&YeVXU=?m_V93u_p1$S-kmu7EY$ycOu&bh{H05m9`-kWR9EwH&eRVR>i+-#|NQy$ zABXln&Q1FL`t{#CH*SY|{oJwc*Qz;h;)0))7aYq9ewP~fc2e)_P3vAY)$9wl{IzJp zy{ydlr;a^HiGHwZ{*SH8FZkJhE{gei`OM?;ir*_{?@ji478&@mD*tSH_`A&5@6Vqe z@G<&xeCOwiq-WvY-<q?(PpbX8Zpp{q%CC#&{pc>eS5f?;vgCP8#IHGBw=+^cY}xvy zx8c*8mDl2ff1W;kCeZrNm9vlQYJg5<pbb#`$->Caki?(^G9DBs4DA0KlA4-ZT3fl8 z8F_gb*}2-1v>0WWwY1oIg_&Emc-aM+Wn|bpRc1GF^$N-etzA1qr9X*XNNWw_j-BjG zGEKc(x)1gUF{(82E@ad^eMXp9hUxg0Q)f<}lVRDncBb&%dq*yAR+(|<o-jL$(28?2 zo;??45^QExc`no~#IC}^-ui`UvIUER!h-n=LseJ=rYP`FI@~V6z4by;((yhm^C*W! z21kx@DaO@p*l}R7K&xy_%z+DytsIk;xgB`2439K+b7?GbXmoN_5mIg1@_?b4)vHb2 zW4=iz(~<TC27yT_6CAg$YSazO;JC%ee5xbs^c)q-iOvDjBs>l-D@bZwvw%g)cL7VG z)An_f*+XqOetkIP*eg{wS7K(+qJ{-x0ue3?v&y~1d1To>MqD_2keNGNE=Pc|!BJ7b fV_(F^#N=Z_Jo9)pKRPly^YODPxtB<AFjxZs(@{iI literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/img/icon/delete.png b/modules/blockwishlist/img/icon/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..08f249365afd29594b51210c6e21ba253897505d GIT binary patch literal 715 zcmV;+0yO=JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!T}ebiR5;6} zllx0kVHn5#Tecsf1c`2hgi%nK^D=kV+T5njvrLa$EMjSnone|mjm2E}L#U;8)yiKo zO>C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;<E2 z80_Y*w_}NMA$su)e0B@`wrYegSP*HT5w@N{_}&f79VIb*XrKGBY>yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(<Pal@1N`)16#~~<@x7jghg9OTS^;mJ8T{oIOsMnG zla<QHU?S-#Kb7w%o*dlEj!JgnOSKW+hV$`!syc>8Ia`-u_IEhxG7U<13kSsMW+$<e xd62)I>lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/img/icon/package.png b/modules/blockwishlist/img/icon/package.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!=Sf6CR5;6h zlS^n^bsUAiduQ&<oixKtrjnE?i9(+-KGJSn)Z#|65V0w>5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@<cu>$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwes<Ks@rBR)qR%6DGzB_%zx;t^=2Sm<3wSUZV z3(w;>YV1_!F=3OaRVHl(>=`%&{x*s30c<x*y}ZCyX%=sL<;SENIdkyU%U0B=(JW6Q zVV$&B#jBU8uWfL2>}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo<Chjw*P$R9RihuxC3MY2}C!NKw%plDQP690NZ?Khc z^BRr%BjQXRQfV}bQ4x}AgvTBXXaLDwxV=Y+QyE<U0kZiUJ5ht!?Z%|Dh!;YvNEoBW zV5>2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOE<ovy}b(QA|$%NgrE^1Xe1avB=$lQsR43_ zP9r8mX=Vx)nNGYn+W%9qv$9rOyfzrN8-;A&VeCvVNCRSzM&&jVx^(xyj^z|szdgs+ zy~&l>uYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I<a!RpPXihQdgmyUn7 zw9)ZQe_TE?q(;uG$XokfdB<v3mbpLwCvkiIXB8cP`9f*#f8Y3TrY;VRsK}>?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/img/icon/package_go.png b/modules/blockwishlist/img/icon/package_go.png new file mode 100644 index 0000000000000000000000000000000000000000..aace63ad6f91537268eb6e9bf328743da7c631c6 GIT binary patch literal 898 zcmV-|1AY97P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#6iGxuR5;6R zlS^n^bsUAiJDF$dG?^q#(j-kw`kbcKq??Mh=%NOp)TUG+f)YjQ!lK>yqPWur#3F*- zi1<JR7YZ&!6DWb$Cy7a<AjV9l=}cp1nn~K2dEUAA{(nCgrCn&w`tWVOb1YS5t<3)X zOgADQsAyD0-ijX^{(Y^U^<O|@_-M0=zM&!~8@C>-H<e}Xrbde@`k5N}c+bFSW=+7{ zNPj?8Us92`qwRg$TH?>*6GJgONgz~1E;+_Oe@~@V<gAK((KC3d@&J$+>F-1Iy-=*@ zV9T!Kgk#%59lVt}Zj7B_)9wTKYBy6YEwPxKqOdeGuEw0%cVhe}Yj*hPSBMNYZ5yz{ z4STT*%d9TVV4NauDND$z(%QKb>=kMr>ckh0lFuesOioc=Nq^^8BQNYYbk1@M%M`O? zh?6H&UZR}Ol3%#RzJX5(MAktmg_e?7`2>w^4^!6w)4$9==U0)EV$}u1A)*bPRF?jv zHdar4EJB1b*f+rh!M+8R1<JR_DW<Lv-f|o@Qu3<^2w(*X)NLmaiel#`kz$TO4Or#t z;8Wh2_<@ybmG`%_Krn>59x8%Qjd0I{0j+|69pUC)f(>!P(OTs8c~;XuVtXzfO>s`m zrjW9YI38*Yel_NvP&FVfNEx)sn-kxIx;WzEcpe*LJBYXLr(l<Od48O4n;u7v;8&4| zFAxAC;N1bKg4lTC@KpC8Mg=1VLCLHxu(#s?MW@1%i$i=Q?P0$fxiEj>lS6I0o+c9O z0L_4N7u$0%Dx~ks;fjYRF0OIOR}1uPI!MtibK=J3pihiBTv)jD>R%(Llj(_XFa#mG z6Wg=#j7Q7*PFmM*W@B9!ftm;#qU}sCT;|&KtBZ%Fe#3()Pk+9@Sw&8%k=NQD>92qN zkFT*E2S*%i&!MYvH;;DpF?sU}zb4Mlls)au3~BX$XZr12Z?_sbts>8Fec~0Xl1q`9 zxyH%T#p<5UCqrY2(J4oGEHk9ens2<Ht7p6WRODSmf-3Uii+1u$BQ;GGF@fBWdiQ(( Y0z8$>2BN3dYXATM07*qoM6N<$g3xBAZ~y=R literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/img/star.gif b/modules/blockwishlist/img/star.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0948a70843bf01952d1f81dcfcdadc92976a04a GIT binary patch literal 815 zcmZ?wbhEHb6ksr5c*el6(A@m!(W5UnOP^`reSRqFN=wUy;^KSv?mbz*{y;*);~mc5 z-|RUW6m;#{wMW}bp6pHg_U+rN({8s`u6+0I-Q5+MAMeb%w`<p%^ObAe+`hkj`DTyO z+d~E~k2$_RJM(N#&bNn2U+&-kax?1Vx!~u|pC6Bkx;a<%e0BBpNt3?6-n!q(>5!M# z{q=^=j}*N*e*EQepZ7;K-(U6l^W*)qy-uI5Mx04YJ9FmD@2@w0e|`3BzvYV!svmDJ zy1UBt<DL4wUS5~`l~&o?KiTc|?y&dMwH9wLt^WW2|BarW%QZD$t~tCq+4%9S{-+DB zU+=}f+^q2P-MdfMLf>A9dUx3IVz=bW<9TmSpMHPB|LHc1x92?H@6~*NPV?1P?R#4d zPbMV1-s|#ytJ9}D;U7+0e!n;8#jahi&$Zv4GUd&Fk1akv*Jf&ey1!wEi_7<GUO*ce zC<BT=Ss2+FvKVwg#(?64f&G6&R#S79fN)Dk2QP1DuW+|=Z&!EEq$XuvcJ`T_!n3+( zPg$TWFniYgMJuxwEHYhZ+HLC6v}WVFjRGxe*Yle0Y?-ll&zz2hYr8v-tu*bNVmfR6 znT~Z6o0Ux&=T2&$rVu=>gU#eYv#yB=$CE4*Ha3+f942mV(XO4k$!yUkYI4!<crrvB zCM=xaSm|bCkl=8r*<OezWJO^_0~=?DVCaekf*U&*6uTK@`5X*vJ?{A5Yn6wikt>^v z(7()>%8M?Gl%7kx>Gn`^RAQF96>H<Z$Y)U-PmqX3BO7nCe5XmDq6#B(gG-`HBtv>~ zqm`q-QcY~aQ7_g~!8sNO9r=2u3Mlqi#CWtc9T(=ypIRf>c$iT@(<;xV@nLFbqN;ve z&H|wp@2R5NS2`L#KJ=KR(rKEJaLDyUmqb%cL}by=)-=YHmH-A@k7GPXma%d?aC*qL zh)X7I#x;cnUQ^jS^;|kOFmg@Nv0U}W!=<5%L(6DYL1B*CL?*3JjSUV#i&`dVbSiW! SUO9NY!6jXVS5kz7!5RQ<r+B^q literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/install.sql b/modules/blockwishlist/install.sql new file mode 100644 index 000000000..ba9407d91 --- /dev/null +++ b/modules/blockwishlist/install.sql @@ -0,0 +1,33 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_wishlist` ( + `id_wishlist` int(10) unsigned NOT NULL auto_increment, + `id_customer` int(10) unsigned NOT NULL, + `token` varchar(64) character set utf8 NOT NULL, + `name` varchar(64) character set utf8 NOT NULL, + `counter` int(10) unsigned NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_wishlist`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_wishlist_email` ( + `id_wishlist` int(10) unsigned NOT NULL, + `email` varchar(128) character set utf8 NOT NULL, + `date_add` datetime NOT NULL +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_wishlist_product` ( + `id_wishlist_product` int(10) NOT NULL auto_increment, + `id_wishlist` int(10) unsigned NOT NULL, + `id_product` int(10) unsigned NOT NULL, + `id_product_attribute` int(10) unsigned NOT NULL, + `quantity` int(10) unsigned NOT NULL, + `priority` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_wishlist_product`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_wishlist_product_cart` ( + `id_wishlist_product` int(10) unsigned NOT NULL, + `id_cart` int(10) unsigned NOT NULL, + `quantity` int(10) unsigned NOT NULL, + `date_add` datetime NOT NULL +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; diff --git a/modules/blockwishlist/it.php b/modules/blockwishlist/it.php new file mode 100644 index 000000000..584c6eda1 --- /dev/null +++ b/modules/blockwishlist/it.php @@ -0,0 +1,84 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4a84e5921e203aede886d04fc41a414b'] = 'rimuovi questo prodotto dalla mia lista dei desideri'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Descrizione del prodotto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_d037160cfb1fa5520563302d3a32630a'] = 'È necessario creare una wishlist prima di aggiungere i prodotti'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-ajax_09dc02ecbb078868a3a86dded030076d'] = 'Nessun prodotto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist-extra_15b94c64c4d5a4f7172e5347a36b94fd'] = 'Aggiungi alla mia lista dei desideri'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_641254d77e7a473aa5910574f3f9453c'] = 'Lista dei Desideri'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4a84e5921e203aede886d04fc41a414b'] = 'Rimuovi questo prodotto dalla mia lista dei desideri'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Descrizione del prodotto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_09dc02ecbb078868a3a86dded030076d'] = 'Nessun prodotto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Le mie liste dei desideri '; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_2715a65604e1af3d6933b61704865daf'] = 'Blocco lista dei desideri '; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_7244141a5de030c4c882556f4fd70a8b'] = 'Aggiunge un blocco contenente lista dei desideri del cliente'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_9ae79c1fccd231ac7fbbf3235dbf6326'] = 'La mia lista dei desideri'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_5ef2d617096ae7b47a83f3d4de9c84bd'] = 'Attiva il modulo: scelta non valida.'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_56ee3495a32081ccb6d2376eab391bfa'] = 'Elenco'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clienti'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_e0fd9b310aba555f96e76738ff192ac3'] = 'Liste dei desideri '; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_deb10517653c255364175796ace3553f'] = 'Prodotto'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantità'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Priorità'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_655d20c1ca69519ca647684edbb2db35'] = 'Alta'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Media'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Bassa'; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_862af8838fba380d3b30e63546a394e5'] = 'non ha avuto lista dei desideri '; +$_MODULE['<{blockwishlist}prestashop>blockwishlist_88b589bbf6282a2e02f50ebe90aae6f1'] = 'Devi essere registrato per gestire la tua lista dei desideri '; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0ac1aeb2429db494dd42ad2dc219ca7e'] = 'Nascondi i prodotti'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0de9d09a36e820f9da7e87ab3678dd12'] = 'Mostra prodotti'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_0bb3e067c0514f5ff2d5a8e45fc0f4be'] = 'Nascondi info prodotto acquistato'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_6fe88f5681da397d46fefe19b3020a6a'] = 'Mostra info prodotto acquistato'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_30820a1bf6a285e45cda2beda3d7738d'] = 'Invia questa lista dei desideri '; +$_MODULE['<{blockwishlist}prestashop>managewishlist_65a26fd603de62416ed333c7a8928713'] = 'Chiudi \"invia questa lista dei desideri\"'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Descrizione del prodotto'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantità'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_502996d9790340c5fd7b86a5b93b1c9f'] = 'Priorità'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_655d20c1ca69519ca647684edbb2db35'] = 'Alta'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Media'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Bassa'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_94966d90747b97d1f0f206c98a8b1ac3'] = 'Invia'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_19f823c6453c2b1ffd09cb715214813d'] = 'Campi obbligatori'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_deb10517653c255364175796ace3553f'] = 'Prodotto'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_3384622e86410fd01fa318fedc6a98ce'] = 'Offerto da'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_44749712dbec183e983dcd78a7736c41'] = 'Data'; +$_MODULE['<{blockwishlist}prestashop>managewishlist_09dc02ecbb078868a3a86dded030076d'] = 'Nessun prodotto'; +$_MODULE['<{blockwishlist}prestashop>my-account_7ec9cceb94985909c6994e95c31c1aa8'] = 'Le mie liste di desideri'; +$_MODULE['<{blockwishlist}prestashop>my-account_723edf7c24638ed18d2fa831e647a5cc'] = 'lista dei desideri '; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Il mio account'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_7ec9cceb94985909c6994e95c31c1aa8'] = 'Le mie liste dei desideri'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_06c335f27f292a096a9bf39e3a58e97b'] = 'Nuova lista dei desideri '; +$_MODULE['<{blockwishlist}prestashop>mywishlist_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_03ab340b3f99e03cff9e84314ead38c0'] = 'Qtà'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_5e729042e30967c9d6f65c6eab73e2fe'] = 'Visto'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Creato'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_45284ef16392f85ff424b2ef36ab5948'] = 'Link diretto'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_4351cfebe4b61d8aa5efa1d020710005'] = 'Visualizza'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_d025259319054206be54336a00defe89'] = 'Sei sicuro di voler cancellare questa lista dei desideri?'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_0b3db27bc15f682e92ff250ebb167d4b'] = 'Torna al tuo account'; +$_MODULE['<{blockwishlist}prestashop>mywishlist_8cf04a9734132302f96da8e113e80ce5'] = 'Home'; +$_MODULE['<{blockwishlist}prestashop>view_641254d77e7a473aa5910574f3f9453c'] = 'Lista dei desideri'; +$_MODULE['<{blockwishlist}prestashop>view_9862d189193590487b2686b1c9043714'] = 'Altre liste dei desideri di'; +$_MODULE['<{blockwishlist}prestashop>view_3d01e7d8174b6a9b088b44870714cf07'] = 'Benvenuti nella lista dei desideri di'; +$_MODULE['<{blockwishlist}prestashop>view_4351cfebe4b61d8aa5efa1d020710005'] = 'Visualizza'; +$_MODULE['<{blockwishlist}prestashop>view_4b7d496eedb665d0b5f589f2f874e7cb'] = 'Descrizione del prodotto'; +$_MODULE['<{blockwishlist}prestashop>view_3d0d1f906e27800531e054a3b6787b7c'] = 'Quantità:'; +$_MODULE['<{blockwishlist}prestashop>view_05f32f85cccc8308d09a81e7bad3f80e'] = 'Priorità:'; +$_MODULE['<{blockwishlist}prestashop>view_655d20c1ca69519ca647684edbb2db35'] = 'Alta'; +$_MODULE['<{blockwishlist}prestashop>view_87f8a6ab85c9ced3702b4ea641ad4bb5'] = 'Media'; +$_MODULE['<{blockwishlist}prestashop>view_28d0edd045e05cf5af64e35ae0c4c6ef'] = 'Bassa'; +$_MODULE['<{blockwishlist}prestashop>view_2d0f6b8300be19cf35e89e66f0677f95'] = 'Aggiungi al carrello'; +$_MODULE['<{blockwishlist}prestashop>view_09dc02ecbb078868a3a86dded030076d'] = 'Nessun prodotto'; + +?> \ No newline at end of file diff --git a/modules/blockwishlist/js/ajax-wishlist.js b/modules/blockwishlist/js/ajax-wishlist.js new file mode 100644 index 000000000..7fcb0a401 --- /dev/null +++ b/modules/blockwishlist/js/ajax-wishlist.js @@ -0,0 +1,254 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * Update WishList Cart by adding, deleting, updating objects + * + * @return void + */ +function WishlistCart(id, action, id_product, id_product_attribute, quantity) +{ + $.ajax({ + type: 'GET', + url: baseDir + 'modules/blockwishlist/cart.php', + async: true, + cache: false, + data: 'action=' + action + '&id_product=' + id_product + '&quantity=' + quantity + '&token=' + static_token + '&id_product_attribute=' + id_product_attribute, + success: function(data) + { + if (action == 'add') + { + var $element = $('#bigpic'); + if (!$element.length) + var $element = $('#wishlist_button'); + var $picture = $element.clone(); + var pictureOffsetOriginal = $element.offset(); + $picture.css({'position': 'absolute', 'top': pictureOffsetOriginal.top, 'left': pictureOffsetOriginal.left}); + var pictureOffset = $picture.offset(); + var wishlistBlockOffset = $('#wishlist_block').offset(); + + $picture.appendTo('body'); + $picture.css({ 'position': 'absolute', 'top': $picture.css('top'), 'left': $picture.css('left') }) + .animate({ 'width': $element.attr('width')*0.66, 'height': $element.attr('height')*0.66, 'opacity': 0.2, 'top': wishlistBlockOffset.top + 30, 'left': wishlistBlockOffset.left + 15 }, 1000) + .fadeOut(800); + } + + if($('#' + id).length != 0) + { + $('#' + id).slideUp('normal'); + document.getElementById(id).innerHTML = data; + $('#' + id).slideDown('normal'); + } + } + }); +} + +/** + * Change customer default wishlist + * + * @return void + */ +function WishlistChangeDefault(id, id_wishlist) +{ + $.ajax({ + type: 'GET', + url: baseDir + 'modules/blockwishlist/cart.php', + async: true, + data: 'id_wishlist=' + id_wishlist + '&token=' + static_token, + cache: false, + success: function(data) + { + $('#' + id).slideUp('normal'); + document.getElementById(id).innerHTML = data; + $('#' + id).slideDown('normal'); + } + }); +} + +/** + * Buy Product + * + * @return void + */ +function WishlistBuyProduct(token, id_product, id_product_attribute, id_quantity, button, ajax) +{ + if(ajax) + ajaxCart.add(id_product, id_product_attribute, false, button, 1, [token, id_quantity]); + else + { + $('#' + id_quantity).val(0); + WishlistAddProductCart(token, id_product, id_product_attribute, id_quantity) + document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].method='POST'; + document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].action=baseDir + 'cart.php'; + document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].elements['token'].value = static_token; + document.forms['addtocart' + '_' + id_product + '_' + id_product_attribute].submit(); + } + return (true); +} + +function WishlistAddProductCart(token, id_product, id_product_attribute, id_quantity) +{ + if ($('#' + id_quantity).val() <= 0) + return (false); + $.ajax({ + type: 'GET', + url: baseDir + 'modules/blockwishlist/buywishlistproduct.php', + data: 'token=' + token + '&static_token=' + static_token + '&id_product=' + id_product + '&id_product_attribute=' + id_product_attribute, + async: true, + cache: false, + success: function(data) + { + if (data) + alert(data); + else + { + $('#' + id_quantity).val($('#' + id_quantity).val() - 1); + } + } + }); + return (true); +} + +/** + * Show wishlist managment page + * + * @return void + */ +function WishlistManage(id, id_wishlist) +{ + $.ajax({ + type: 'GET', + async: true, + url: baseDir + 'modules/blockwishlist/managewishlist.php', + data: 'id_wishlist=' + id_wishlist + '&refresh=' + false, + cache: false, + success: function(data) + { + $('#' + id).hide(); + document.getElementById(id).innerHTML = data; + $('#' + id).fadeIn('slow'); + } + }); +} + +/** + * Show wishlist product managment page + * + * @return void + */ +function WishlistProductManage(id, action, id_wishlist, id_product, id_product_attribute, quantity, priority) +{ + $.ajax({ + type: 'GET', + async: true, + url: baseDir + 'modules/blockwishlist/managewishlist.php', + data: 'action=' + action + '&id_wishlist=' + id_wishlist + '&id_product=' + id_product + '&id_product_attribute=' + id_product_attribute + '&quantity=' + quantity + '&priority=' + priority + '&refresh=' + true, + cache: false, + success: function(data) + { + if (action == 'delete') + $('#wlp_' + id_product + '_' + id_product_attribute).fadeOut('fast'); + else if (action == 'update') + { + $('#wlp_' + id_product + '_' + id_product_attribute).fadeOut('fast'); + $('#wlp_' + id_product + '_' + id_product_attribute).fadeIn('fast'); + } + } + }); +} + +/** + * Delete wishlist + * + * @return boolean succeed + */ +function WishlistDelete(id, id_wishlist, msg) +{ + var res = confirm(msg); + if (res == false) + return (false); + $.ajax({ + type: 'GET', + async: true, + url: baseDir + 'modules/blockwishlist/mywishlist.php', + cache: false, + data: 'deleted&id_wishlist=' + id_wishlist, + success: function(data) + { + $('#' + id).fadeOut('slow'); + } + }); +} + +/** + * Hide/Show bought product + * + * @return void + */ +function WishlistVisibility(bought_class, id_button) +{ + if ($('#hide' + id_button).css('display') == 'none') + { + $('.' + bought_class).slideDown('fast'); + $('#show' + id_button).hide(); + $('#hide' + id_button).fadeIn('fast'); + } + else + { + $('.' + bought_class).slideUp('fast'); + $('#hide' + id_button).hide(); + $('#show' + id_button).fadeIn('fast'); + } +} + +/** + * Send wishlist by email + * + * @return void + */ +function WishlistSend(id, id_wishlist, id_email) +{ + $.post(baseDir + 'modules/blockwishlist/sendwishlist.php', + { token: static_token, + id_wishlist: id_wishlist, + email1: $('#' + id_email + '1').val(), + email2: $('#' + id_email + '2').val(), + email3: $('#' + id_email + '3').val(), + email4: $('#' + id_email + '4').val(), + email5: $('#' + id_email + '5').val(), + email6: $('#' + id_email + '6').val(), + email7: $('#' + id_email + '7').val(), + email8: $('#' + id_email + '8').val(), + email9: $('#' + id_email + '9').val(), + email10: $('#' + id_email + '10').val() }, + function(data) + { + if (data) + alert(data); + else + WishlistVisibility(id, 'hideSendWishlist'); + }); +} diff --git a/modules/blockwishlist/logo.gif b/modules/blockwishlist/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!=Sf6CR5;6h zlS^n^bsUAiduQ&<oixKtrjnE?i9(+-KGJSn)Z#|65V0w>5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@<cu>$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwes<Ks@rBR)qR%6DGzB_%zx;t^=2Sm<3wSUZV z3(w;>YV1_!F=3OaRVHl(>=`%&{x*s30c<x*y}ZCyX%=sL<;SENIdkyU%U0B=(JW6Q zVV$&B#jBU8uWfL2>}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo<Chjw*P$R9RihuxC3MY2}C!NKw%plDQP690NZ?Khc z^BRr%BjQXRQfV}bQ4x}AgvTBXXaLDwxV=Y+QyE<U0kZiUJ5ht!?Z%|Dh!;YvNEoBW zV5>2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOE<ovy}b(QA|$%NgrE^1Xe1avB=$lQsR43_ zP9r8mX=Vx)nNGYn+W%9qv$9rOyfzrN8-;A&VeCvVNCRSzM&&jVx^(xyj^z|szdgs+ zy~&l>uYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I<a!RpPXihQdgmyUn7 zw9)ZQe_TE?q(;uG$XokfdB<v3mbpLwCvkiIXB8cP`9f*#f8Y3TrY;VRsK}>?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/modules/blockwishlist/mails/de/wishlink.html b/modules/blockwishlist/mails/de/wishlink.html new file mode 100644 index 000000000..0c83c7b19 --- /dev/null +++ b/modules/blockwishlist/mails/de/wishlink.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nachricht von {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>{shop_name} bietet Ihnen an, diesen Link an Ihre Freunde zu senden, damit diese Ihre Wunschliste sehen k&ouml;nnen {wishlist} :</strong> <br /><br /><a title="WishList" href="{message}">{message}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/blockwishlist/mails/de/wishlink.txt b/modules/blockwishlist/mails/de/wishlink.txt new file mode 100644 index 000000000..6d4e5dff1 --- /dev/null +++ b/modules/blockwishlist/mails/de/wishlink.txt @@ -0,0 +1,7 @@ +Hallo, + +{shop_name} bietet Ihnen an, diesen Link an Ihre Freunde zu senden, damit diese Ihre Wunschliste sehen können {wishlist} : + +{message} + +{shop_url} realisiert mit PrestaShop™ diff --git a/modules/blockwishlist/mails/de/wishlist.html b/modules/blockwishlist/mails/de/wishlist.html new file mode 100644 index 000000000..57d24ab1d --- /dev/null +++ b/modules/blockwishlist/mails/de/wishlist.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von einem Kunden bei {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Nachricht von {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>{firstname} {lastname} hat angegeben, dass Sie seine/ ihr Wunschliste sehen m&ouml;chten {wishlist} :</strong> <br /><br /><a title="WishList" href="{message}">{wishlist}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/blockwishlist/mails/de/wishlist.txt b/modules/blockwishlist/mails/de/wishlist.txt new file mode 100644 index 000000000..d8b49febd --- /dev/null +++ b/modules/blockwishlist/mails/de/wishlist.txt @@ -0,0 +1,8 @@ +Hallo, + +{firstname} {lastname} hat angegeben, dass Sie seine/ ihr Wunschliste sehen möchten {wishlist} : +{message} + + + +{shop_name} powered with PrestaShop™ \ No newline at end of file diff --git a/modules/blockwishlist/mails/en/wishlink.html b/modules/blockwishlist/mails/en/wishlink.html new file mode 100644 index 000000000..15642da01 --- /dev/null +++ b/modules/blockwishlist/mails/en/wishlink.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message from {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>{shop_name} invites you to send this link to your friends, so they can see your wishlist {wishlist} :</b> + <br /><br /> + <a href="{message}" title="WishList">{message}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> realised with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/blockwishlist/mails/en/wishlink.txt b/modules/blockwishlist/mails/en/wishlink.txt new file mode 100644 index 000000000..584a563c8 --- /dev/null +++ b/modules/blockwishlist/mails/en/wishlink.txt @@ -0,0 +1,7 @@ +Hi, + +{shop_name} invites you to send this link to your friends, so they can see your wishlist {wishlist} : + +{message} + +{shop_url} realised by PrestaShop™ diff --git a/modules/blockwishlist/mails/en/wishlist.html b/modules/blockwishlist/mails/en/wishlist.html new file mode 100644 index 000000000..c81c385d3 --- /dev/null +++ b/modules/blockwishlist/mails/en/wishlist.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from a customer of {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message from {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>{firstname} {lastname} indicated you may want to see his/her wishlist {wishlist} :</b> + <br /><br /> + <a href="{message}" title="WishList">{wishlist}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> Powered by <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/blockwishlist/mails/en/wishlist.txt b/modules/blockwishlist/mails/en/wishlist.txt new file mode 100644 index 000000000..bcfb62042 --- /dev/null +++ b/modules/blockwishlist/mails/en/wishlist.txt @@ -0,0 +1,8 @@ +Hi, + +{firstname} {lastname} indicated you may want to see his/her wishlist {wishlist} : +{message} + + + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blockwishlist/mails/es/wishlink.html b/modules/blockwishlist/mails/es/wishlink.html new file mode 100755 index 000000000..7074ec78d --- /dev/null +++ b/modules/blockwishlist/mails/es/wishlink.html @@ -0,0 +1,11 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title></title> +</head> +<body> + + +</body> +</html> \ No newline at end of file diff --git a/modules/blockwishlist/mails/es/wishlink.txt b/modules/blockwishlist/mails/es/wishlink.txt new file mode 100755 index 000000000..c9c7b63c2 --- /dev/null +++ b/modules/blockwishlist/mails/es/wishlink.txt @@ -0,0 +1 @@ +La página solicitada ya no existe \ No newline at end of file diff --git a/modules/blockwishlist/mails/es/wishlist.html b/modules/blockwishlist/mails/es/wishlist.html new file mode 100644 index 000000000..55255cdfe --- /dev/null +++ b/modules/blockwishlist/mails/es/wishlist.html @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de un cliente de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Mensaje de {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>{firstname} {lastname} le sugiere a ver su lista de deseos {wishlist}:</strong> <br /><br /><a title="WishList" href="{message}">{wishlist}</a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/blockwishlist/mails/es/wishlist.txt b/modules/blockwishlist/mails/es/wishlist.txt new file mode 100644 index 000000000..7a972af99 --- /dev/null +++ b/modules/blockwishlist/mails/es/wishlist.txt @@ -0,0 +1,8 @@ +Hola, + +{firstname} {lastname} le sugiere a ver su lista de deseos {wishlist}: +{message} + + + +{shop_url} desarrollado por PrestaShop® \ No newline at end of file diff --git a/modules/blockwishlist/mails/fr/wishlink.html b/modules/blockwishlist/mails/fr/wishlink.html new file mode 100644 index 000000000..c95950400 --- /dev/null +++ b/modules/blockwishlist/mails/fr/wishlink.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message de {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>{shop_name} vous invite &agrave; envoyer ce lien à vos amis qui pourront alors consulter votre liste de cadeaux {wishlist} :</b> + <br /><br /> + <a href="{message}" title="WishList">{message}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/blockwishlist/mails/fr/wishlink.txt b/modules/blockwishlist/mails/fr/wishlink.txt new file mode 100644 index 000000000..11fbf1fd4 --- /dev/null +++ b/modules/blockwishlist/mails/fr/wishlink.txt @@ -0,0 +1,7 @@ +Bonjour, + +{shop_name} vous invite &agrave; envoyer ce lien à vos amis qui pourront alors consulter votre liste de cadeaux {wishlist} : + +{message} + +{shop_url} réalisé par PrestaShop™ diff --git a/modules/blockwishlist/mails/fr/wishlist.html b/modules/blockwishlist/mails/fr/wishlist.html new file mode 100644 index 000000000..c80c12ba9 --- /dev/null +++ b/modules/blockwishlist/mails/fr/wishlist.html @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message d'un client de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message de {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <b>{firstname} {lastname} vous invite &agrave; visiter sa liste de cadeaux {wishlist} :</b> + <br /><br /> + <a href="{message}" title="WishList">{wishlist}</a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/blockwishlist/mails/fr/wishlist.txt b/modules/blockwishlist/mails/fr/wishlist.txt new file mode 100644 index 000000000..12173f29e --- /dev/null +++ b/modules/blockwishlist/mails/fr/wishlist.txt @@ -0,0 +1,8 @@ +Bonjour, + +{firstname} {lastname} vous invite à visiter sa liste de cadeaux {wishlist} : +{message} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/blockwishlist/mails/it/wishlink.html b/modules/blockwishlist/mails/it/wishlink.html new file mode 100644 index 000000000..543c2528f --- /dev/null +++ b/modules/blockwishlist/mails/it/wishlink.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Messaggio da {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>{shop_name} ti invita ad inviare questo link ai tuoi amici, cos&igrave; che possano vedere la tua lista dei desideri {wishlist}:</strong> <br /><br /> <a title="WishList" href="{message}">{message}</a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> realised with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/blockwishlist/mails/it/wishlink.txt b/modules/blockwishlist/mails/it/wishlink.txt new file mode 100644 index 000000000..f9bd8ee40 --- /dev/null +++ b/modules/blockwishlist/mails/it/wishlink.txt @@ -0,0 +1,7 @@ +Salve, + +{shop_name} ti invita a inviare questo link ai tuoi amici, così che possano vedere la tua lista dei desideri {wishlist} : + +{message} + +{shop_url} realised by PrestaShop™ diff --git a/modules/blockwishlist/mails/it/wishlist.html b/modules/blockwishlist/mails/it/wishlist.html new file mode 100644 index 000000000..be14c4fe2 --- /dev/null +++ b/modules/blockwishlist/mails/it/wishlist.html @@ -0,0 +1,40 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da un cliente di {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Messaggio da {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>{firstname} {lastname} ha detto che potresto voler vedere la sua lista dei desideri {wishlist}:</strong> <br /><br /> <a title="WishList" href="{message}">{wishlist}</a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> Powered by <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/blockwishlist/mails/it/wishlist.txt b/modules/blockwishlist/mails/it/wishlist.txt new file mode 100644 index 000000000..a46f3ffa3 --- /dev/null +++ b/modules/blockwishlist/mails/it/wishlist.txt @@ -0,0 +1,8 @@ +Salve, + +{firstname} {lastname} ha detto che potresti voler vedere la sua lista dei desideri {wishlist} : +{message} + + + +{shop_url} Powered by PrestaShop™ \ No newline at end of file diff --git a/modules/blockwishlist/managewishlist.php b/modules/blockwishlist/managewishlist.php new file mode 100644 index 000000000..17683f511 --- /dev/null +++ b/modules/blockwishlist/managewishlist.php @@ -0,0 +1,115 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); +require_once(dirname(__FILE__).'/WishList.php'); + +if ($cookie->isLogged()) +{ + $action = Tools::getValue('action'); + $id_wishlist = (int)Tools::getValue('id_wishlist'); + $id_product = (int)Tools::getValue('id_product'); + $id_product_attribute = (int)Tools::getValue('id_product_attribute'); + $quantity = (int)Tools::getValue('quantity'); + $priority = Tools::getValue('priority'); + $wishlist = new WishList((int)($id_wishlist)); + $refresh = (($_GET['refresh'] == 'true') ? 1 : 0); + if (empty($id_wishlist) === false) + { + if (!strcmp($action, 'update')) + { + WishList::updateProduct($id_wishlist, $id_product, $id_product_attribute, $priority, $quantity); + } + else + { + if (!strcmp($action, 'delete')) + WishList::removeProduct($id_wishlist, (int)($cookie->id_customer), $id_product, $id_product_attribute); + + $products = WishList::getProductByIdCustomer($id_wishlist, $cookie->id_customer, $cookie->id_lang); + $bought = WishList::getBoughtProduct($id_wishlist); + + for ($i = 0; $i < sizeof($products); ++$i) + { + $obj = new Product((int)($products[$i]['id_product']), false, (int)($cookie->id_lang)); + if (!Validate::isLoadedObject($obj)) + continue; + else + { + if ($products[$i]['id_product_attribute'] != 0) + { + $combination_imgs = $obj->getCombinationImages((int)($cookie->id_lang)); + $products[$i]['cover'] = $obj->id.'-'.$combination_imgs[$products[$i]['id_product_attribute']][0]['id_image']; + } + else + { + $images = $obj->getImages((int)($cookie->id_lang)); + foreach ($images AS $k => $image) + if ($image['cover']) + { + $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; + break; + } + } + if (!isset($products[$i]['cover'])) + $products[$i]['cover'] = Language::getIsoById($cookie->id_lang).'-default'; + } + $products[$i]['bought'] = false; + for ($j = 0, $k = 0; $j < sizeof($bought); ++$j) + { + if ($bought[$j]['id_product'] == $products[$i]['id_product'] AND + $bought[$j]['id_product_attribute'] == $products[$i]['id_product_attribute']) + $products[$i]['bought'][$k++] = $bought[$j]; + } + } + + $productBoughts = array(); + + foreach ($products as $product) + if (sizeof($product['bought'])) + $productBoughts[] = $product; + $smarty->assign(array( + 'products' => $products, + 'productsBoughts' => $productBoughts, + 'id_wishlist' => $id_wishlist, + 'refresh' => $refresh, + 'token_wish' => $wishlist->token + )); + + if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/managewishlist.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/managewishlist.tpl'); + elseif (Tools::file_exists_cache(dirname(__FILE__).'/managewishlist.tpl')) + $smarty->display(dirname(__FILE__).'/managewishlist.tpl'); + else + echo Tools::displayError('No template found'); + } + } +} + diff --git a/modules/blockwishlist/managewishlist.tpl b/modules/blockwishlist/managewishlist.tpl new file mode 100644 index 000000000..bb7d8c433 --- /dev/null +++ b/modules/blockwishlist/managewishlist.tpl @@ -0,0 +1,127 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $products} +{if !$refresh} + <br /> + <a href="#" id="hideBoughtProducts" class="button_account" onclick="WishlistVisibility('wlp_bought', 'BoughtProducts'); return false;">{l s='Hide products' mod='blockwishlist'}</a> + <a href="#" id="showBoughtProducts" class="button_account" onclick="WishlistVisibility('wlp_bought', 'BoughtProducts'); return false;">{l s='Show products' mod='blockwishlist'}</a> + {if count($productsBoughts)} + <a href="#" id="hideBoughtProductsInfos" class="button_account" onclick="WishlistVisibility('wlp_bought_infos', 'BoughtProductsInfos'); return false;">{l s='Hide bought product\'s info' mod='blockwishlist'}</a> + <a href="#" id="showBoughtProductsInfos" class="button_account" onclick="WishlistVisibility('wlp_bought_infos', 'BoughtProductsInfos'); return false;">{l s='Show bought product\'s info' mod='blockwishlist'}</a> + {/if} + <a href="#" id="showSendWishlist" class="button_account" onclick="WishlistVisibility('wl_send', 'SendWishlist'); return false;">{l s='Send this wishlist' mod='blockwishlist'}</a> + <a href="#" id="hideSendWishlist" class="button_account" onclick="WishlistVisibility('wl_send', 'SendWishlist'); return false;">{l s='Close send this wishlist' mod='blockwishlist'}</a> + <span class="clear"></span> + <br /> + Permalink :<br/><input type="text" value="{$base_dir_ssl}modules/blockwishlist/view.php?token={$token_wish|escape:'htmlall':'UTF-8'}" style="width:540px;" readonly/> +{/if} + <div class="wlp_bought"> + {foreach from=$products item=product name=i} + <ul class="address {if $smarty.foreach.i.index % 2}alternate_{/if}item" style="margin:5px 0 0 5px;border-bottom:1px solid #ccc;" id="wlp_{$product.id_product}_{$product.id_product_attribute}"> + <li class="address_title">{$product.name|truncate:30:'...'|escape:'htmlall':'UTF-8'}</li> + <li class="address_name"> + <a href="{$link->getProductlink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{l s='Product detail' mod='blockwishlist'}"> + <img src="{$link->getImageLink($product.link_rewrite, $product.cover, 'medium')}" alt="{$product.name|escape:'htmlall':'UTF-8'}" /> + </a> + <span class="wishlist_product_detail"> + {if isset($product.attributes_small)} + <a href="{$link->getProductlink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{l s='Product detail' mod='blockwishlist'}">{$product.attributes_small|escape:'htmlall':'UTF-8'}</a> + {/if} + <br />{l s='Quantity' mod='blockwishlist'}:<input type="text" id="quantity_{$product.id_product}_{$product.id_product_attribute}" value="{$product.quantity|intval}" size="3" /> + <br /><br />{l s='Priority' mod='blockwishlist'}: <select id="priority_{$product.id_product}_{$product.id_product_attribute}"> + <option value="0"{if $product.priority eq 0} selected="selected"{/if}>{l s='High' mod='blockwishlist'}</option> + <option value="1"{if $product.priority eq 1} selected="selected"{/if}>{l s='Medium' mod='blockwishlist'}</option> + <option value="2"{if $product.priority eq 2} selected="selected"{/if}>{l s='Low' mod='blockwishlist'}</option> + </select> + </span> + <a href="javascript:;" class="clear button" onclick="WishlistProductManage('wlp_bought', 'delete', '{$id_wishlist}', '{$product.id_product}', '{$product.id_product_attribute}', $('#quantity_{$product.id_product}_{$product.id_product_attribute}').val(), $('#priority_{$product.id_product}_{$product.id_product_attribute}').val());" title="{l s='Delete' mod='blockwishlist'}">{l s='Delete' mod='blockwishlist'}</a> + <a href="javascript:;" class="exclusive" onclick="WishlistProductManage('wlp_bought_{$product.id_product_attribute}', 'update', '{$id_wishlist}', '{$product.id_product}', '{$product.id_product_attribute}', $('#quantity_{$product.id_product}_{$product.id_product_attribute}').val(), $('#priority_{$product.id_product}_{$product.id_product_attribute}').val());" title="{l s='Save' mod='blockwishlist'}">{l s='Save' mod='blockwishlist'}</a> + </li> + </ul> + {/foreach} + </div> + <div class="clear"></div> + <br /> + {if !$refresh} + <form method="post" class="wl_send std hidden" onsubmit="return (false);"> + <fieldset> + <p class="required"> + <label for="email1">{l s='Email' mod='blockwishlist'}1</label> + <input type="text" name="email1" id="email1" /> + <sup>*</sup> + </p> + {section name=i loop=11 start=2} + <p> + <label for="email{$smarty.section.i.index}">{l s='Email' mod='blockwishlist'}{$smarty.section.i.index}</label> + <input type="text" name="email{$smarty.section.i.index}" id="email{$smarty.section.i.index}" /> + </p> + {/section} + <p class="submit"> + <input class="button" type="submit" value="{l s='Send' mod='blockwishlist'}" name="submitWishlist" onclick="WishlistSend('wl_send', '{$id_wishlist}', 'email');" /> + </p> + <p class="required"> + <sup>*</sup> + {l s='Required field'} + </p> + </fieldset> + </form> + {if count($productsBoughts)} + <table class="wlp_bought_infos hidden std"> + <thead> + <tr> + <th class="first_item">{l s='Product' mod='blockwishlist'}</td> + <th class="item">{l s='Quantity' mod='blockwishlist'}</td> + <th class="item">{l s='Offered by' mod='blockwishlist'}</td> + <th class="last_item">{l s='Date' mod='blockwishlist'}</td> + </tr> + </thead> + <tbody> + {foreach from=$productsBoughts item=product name=i} + {foreach from=$product.bought item=bought name=j} + {if $bought.quantity > 0} + <tr> + <td class="first_item"> + <span style="float:left;"><img src="{$link->getImageLink($product.link_rewrite, $product.cover, 'small')}" alt="{$product.name|escape:'htmlall':'UTF-8'}" /></span> + <span style="float:left;">{$product.name|truncate:40:'...'|escape:'htmlall':'UTF-8'} + {if isset($product.attributes_small)} + <br /><i>{$product.attributes_small|escape:'htmlall':'UTF-8'}</i> + {/if}</span> + </td> + <td class="item align_center">{$bought.quantity|intval}</td> + <td class="item align_center">{$bought.firstname} {$bought.lastname}</td> + <td class="last_item align_center">{$bought.date_add|date_format:"%Y-%m-%d"}</td> + </tr> + {/if} + {/foreach} + {/foreach} + </tbody> + </table> + {/if} + {/if} +{else} + {l s='No products' mod='blockwishlist'} +{/if} diff --git a/modules/blockwishlist/my-account.tpl b/modules/blockwishlist/my-account.tpl new file mode 100644 index 000000000..65fa2f8f3 --- /dev/null +++ b/modules/blockwishlist/my-account.tpl @@ -0,0 +1,31 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE WishList --> +<li> +<a href="{$base_dir_ssl}modules/blockwishlist/mywishlist.php" title="{l s='My wishlists' mod='blockwishlist'}"><img src="{$module_template_dir}logo.gif" alt="{l s='wishlist' mod='blockwishlist'}" class="icon" /></a><a href="{$base_dir_ssl}modules/blockwishlist/mywishlist.php" title="{l s='My wishlists' mod='blockwishlist'}">{l s='My wishlists' mod='blockwishlist'}</a> +</li> +<!-- END : MODULE WishList --> \ No newline at end of file diff --git a/modules/blockwishlist/mywishlist.php b/modules/blockwishlist/mywishlist.php new file mode 100644 index 000000000..24c98f497 --- /dev/null +++ b/modules/blockwishlist/mywishlist.php @@ -0,0 +1,106 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include_once(dirname(__FILE__).'/WishList.php'); + +$errors = array(); + +if ($cookie->isLogged()) +{ + $add = Tools::getIsset('add'); + $add = (empty($add) === false ? 1 : 0); + $delete = Tools::getIsset('deleted'); + $delete = (empty($delete) === false ? 1 : 0); + $id_wishlist = Tools::getValue('id_wishlist'); + if (Tools::isSubmit('submitWishlist')) + { + if (Configuration::get('PS_TOKEN_ACTIVATED') == 1 AND + strcmp(Tools::getToken(), Tools::getValue('token'))) + $errors[] = Tools::displayError('Invalid token'); + if (!sizeof($errors)) + { + $name = Tools::getValue('name'); + if (empty($name)) + $errors[] = Tools::displayError('You must specify a name.'); + if (WishList::isExistsByNameForUser($name)) + $errors[] = Tools::displayError('This name is already used by another list.'); + + if(!sizeof($errors)) + { + $wishlist = new WishList(); + $wishlist->name = $name; + $wishlist->id_customer = (int)$cookie->id_customer; + list($us, $s) = explode(' ', microtime()); + srand($s * $us); + $wishlist->token = strtoupper(substr(sha1(uniqid(rand(), true)._COOKIE_KEY_.$cookie->id_customer), 0, 16)); + $wishlist->add(); + Mail::Send((int)($cookie->id_lang), 'wishlink', Mail::l('Your wishlist\'s link'), + array( + '{wishlist}' => $wishlist->name, + '{message}' => Tools::getProtocol().htmlentities($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/blockwishlist/view.php?token='.$wishlist->token), + $cookie->email, $cookie->firstname.' '.$cookie->lastname, NULL, strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + } + } + } + else if ($add) + WishList::addCardToWishlist((int)($cookie->id_customer), (int)(Tools::getValue('id_wishlist')), (int)($cookie->id_lang)); + else if ($delete AND empty($id_wishlist) === false) + { + $wishlist = new WishList((int)($id_wishlist)); + if (Validate::isLoadedObject($wishlist)) + $wishlist->delete(); + else + $errors[] = Tools::displayError('Cannot delete this wishlist'); + } + $smarty->assign('wishlists', WishList::getByIdCustomer((int)($cookie->id_customer))); + $smarty->assign('nbProducts', WishList::getInfosByIdCustomer((int)($cookie->id_customer))); +} +else +{ + Tools::redirect('index.php?controller=authentication&back=modules/blockwishlist/mywishlist.php'); +} + +$smarty->assign(array( + 'id_customer' => (int)($cookie->id_customer), + 'errors' => $errors +)); + +if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/mywishlist.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/mywishlist.tpl'); +elseif (Tools::file_exists_cache(dirname(__FILE__).'/mywishlist.tpl')) + $smarty->display(dirname(__FILE__).'/mywishlist.tpl'); +else + echo Tools::displayError('No template found'); + +include(dirname(__FILE__).'/../../footer.php'); + + diff --git a/modules/blockwishlist/mywishlist.tpl b/modules/blockwishlist/mywishlist.tpl new file mode 100644 index 000000000..e3723f109 --- /dev/null +++ b/modules/blockwishlist/mywishlist.tpl @@ -0,0 +1,100 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<script type="text/javascript"> +//<![CDATA[ + var baseDir = '{$base_dir_ssl}'; +//]]> +</script> + +<div id="mywishlist"> + {capture name=path}<a href="{$link->getPageLink('my-account', true)}">{l s='My account' mod='blockwishlist'}</a><span class="navigation-pipe">{$navigationPipe}</span>{l s='My wishlists' mod='blockwishlist'}{/capture} + {include file="$tpl_dir./breadcrumb.tpl"} + + <h2>{l s='My wishlists' mod='blockwishlist'}</h2> + + {include file="$tpl_dir./errors.tpl"} + + {if $id_customer|intval neq 0} + <form action="{$base_dir_ssl}modules/blockwishlist/mywishlist.php" method="post" class="std"> + <fieldset> + <h3>{l s='New wishlist' mod='blockwishlist'}</h3> + <input type="hidden" name="token" value="{$token|escape:'htmlall':'UTF-8'}" /> + <label class="align_right" for="name">{l s='Name' mod='blockwishlist'}</label> + <input type="text" id="name" name="name" value="{if isset($smarty.post.name) and $errors|@count > 0}{$smarty.post.name|escape:'htmlall':'UTF-8'}{/if}" /> + <input type="submit" name="submitWishlist" id="submitWishlist" value="{l s='Save' mod='blockwishlist'}" class="exclusive" /> + </fieldset> + </form> + {if $wishlists} + <div id="block-history" class="block-center"> + <table class="std"> + <thead> + <tr> + <th class="first_item">{l s='Name' mod='blockwishlist'}</th> + <th class="item mywishlist_first">{l s='Qty' mod='blockwishlist'}</th> + <th class="item mywishlist_first">{l s='Viewed' mod='blockwishlist'}</th> + <th class="item mywishlist_second">{l s='Created' mod='blockwishlist'}</th> + <th class="item mywishlist_second">{l s='Direct Link' mod='blockwishlist'}</th> + <th class="last_item mywishlist_first">{l s='Delete' mod='blockwishlist'}</th> + </tr> + </thead> + <tbody> + {section name=i loop=$wishlists} + <tr id="wishlist_{$wishlists[i].id_wishlist|intval}"> + <td class="bold" style="width:200px;"><a href="javascript:;" onclick="javascript:WishlistManage('block-order-detail', '{$wishlists[i].id_wishlist|intval}');">{$wishlists[i].name|truncate:30:'...'|escape:'htmlall':'UTF-8'}</a></td> + <td class="bold align_center"> + {assign var=n value=0} + {foreach from=$nbProducts item=nb name=i} + {if $nb.id_wishlist eq $wishlists[i].id_wishlist} + {assign var=n value=$nb.nbProducts|intval} + {/if} + {/foreach} + {if $n} + {$n|intval} + {else} + 0 + {/if} + </td> + <td class="align_center">{$wishlists[i].counter|intval}</td> + <td class="align_center">{$wishlists[i].date_add|date_format:"%Y-%m-%d"}</td> + <td class="align_center"><a href="javascript:;" onclick="javascript:WishlistManage('block-order-detail', '{$wishlists[i].id_wishlist|intval}');">{l s='View' mod='blockwishlist'}</a></td> + <td class="align_center"> + <a href="javascript:;"onclick="return (WishlistDelete('wishlist_{$wishlists[i].id_wishlist|intval}', '{$wishlists[i].id_wishlist|intval}', '{l s='Do you really want to delete this wishlist ?' mod='blockwishlist'}'));"><img src="{$content_dir}modules/blockwishlist/img/icon/delete.png" alt="{l s='Delete' mod='blockwishlist'}" /></a> + </td> + </tr> + {/section} + </tbody> + </table> + </div> + <div id="block-order-detail">&nbsp;</div> + {/if} + {/if} + + <ul class="footer_links"> + <li><a href="{$link->getPageLink('my-account', true)}"><img src="{$img_dir}icon/my-account.gif" alt="" class="icon" /></a><a href="{$link->getPageLink('my-account', true)}">{l s='Back to Your Account' mod='blockwishlist'}</a></li> + <li><a href="{$base_dir}"><img src="{$img_dir}icon/home.gif" alt="" class="icon" /></a><a href="{$base_dir}">{l s='Home' mod='blockwishlist'}</a></li> + </ul> +</div> diff --git a/modules/blockwishlist/sendwishlist.php b/modules/blockwishlist/sendwishlist.php new file mode 100644 index 000000000..c1f4d320f --- /dev/null +++ b/modules/blockwishlist/sendwishlist.php @@ -0,0 +1,61 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); +require_once(dirname(__FILE__).'/WishList.php'); + +if (Configuration::get('PS_TOKEN_ENABLE') == 1 AND + strcmp(Tools::getToken(false), Tools::getValue('token')) AND + $cookie->isLogged() === true) + exit(Tools::displayError('invalid token',false)); + +if ($cookie->isLogged()) +{ + $id_wishlist = (int)(Tools::getValue('id_wishlist')); + if (empty($id_wishlist) === true) + exit(Tools::displayError('Invalid wishlist',false)); + for ($i = 1; empty($_POST['email'.strval($i)]) === false; ++$i) + { + $to = Tools::getValue('email'.$i); + $wishlist = WishList::exists($id_wishlist, $cookie->id_customer, true); + if ($wishlist === false) + exit(Tools::displayError('Invalid wishlist',false)); + if (WishList::addEmail($id_wishlist, $to) === false) + exit(Tools::displayError('Wishlist send error',false)); + $toName = strval(Configuration::get('PS_SHOP_NAME')); + $customer = new Customer((int)($cookie->id_customer)); + if (Validate::isLoadedObject($customer)) + Mail::Send((int)($cookie->id_lang), 'wishlist', Mail::l('Message from ').$customer->lastname.' '.$customer->firstname, + array( + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{wishlist}' => $wishlist['name'], + '{message}' => Tools::getProtocol().htmlentities($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/blockwishlist/view.php?token='.$wishlist['token']), + $to, $toName, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, dirname(__FILE__).'/mails/'); + } +} diff --git a/modules/blockwishlist/view.php b/modules/blockwishlist/view.php new file mode 100644 index 000000000..7b1d9ed93 --- /dev/null +++ b/modules/blockwishlist/view.php @@ -0,0 +1,88 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../header.php'); +require_once(dirname(__FILE__).'/WishList.php'); + +$token = Tools::getValue('token'); +if (empty($token) === false) +{ + $wishlist = WishList::getByToken($token); + if (empty($result) === true || $result === false) + $errors[] = Tools::displayError('Invalid wishlist token'); + WishList::refreshWishList($wishlist['id_wishlist']); + $products = WishList::getProductByIdCustomer((int)($wishlist['id_wishlist']), (int)($wishlist['id_customer']), (int)($cookie->id_lang), null, true); + for ($i = 0; $i < sizeof($products); ++$i) + { + $obj = new Product((int)($products[$i]['id_product']), false, (int)($cookie->id_lang)); + if (!Validate::isLoadedObject($obj)) + continue; + else + { + if ($products[$i]['id_product_attribute'] != 0) + { + $combination_imgs = $obj->getCombinationImages((int)($cookie->id_lang)); + $products[$i]['cover'] = $obj->id.'-'.$combination_imgs[$products[$i]['id_product_attribute']][0]['id_image']; + } + else + { + $images = $obj->getImages((int)($cookie->id_lang)); + foreach ($images AS $k => $image) + { + if ($image['cover']) + { + $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; + break; + } + } + if (!isset($products[$i]['cover'])) + $products[$i]['cover'] = Language::getIsoById((int)($cookie->id_lang)).'-default'; + } + } + } + WishList::incCounter((int)($wishlist['id_wishlist'])); + $ajax = Configuration::get('PS_BLOCK_CART_AJAX'); + $smarty->assign(array ( + 'current_wishlist' => $wishlist, + 'token' => $token, + 'ajax' => ((isset($ajax) AND (int)($ajax) == 1) ? '1' : '0'), + 'wishlists' => WishList::getByIdCustomer((int)($wishlist['id_customer'])), + 'products' => $products)); +} + +if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/blockwishlist/view.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/blockwishlist/view.tpl'); +elseif (Tools::file_exists_cache(dirname(__FILE__).'/view.tpl')) + $smarty->display(dirname(__FILE__).'/view.tpl'); +else + echo Tools::displayError('No template found'); + +require(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/blockwishlist/view.tpl b/modules/blockwishlist/view.tpl new file mode 100644 index 000000000..81cbecc7c --- /dev/null +++ b/modules/blockwishlist/view.tpl @@ -0,0 +1,96 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<div id="view_wishlist"> +<h2>{l s='Wishlist' mod='blockwishlist'}</h2> +{if $wishlists} +<p> + {l s='Other wishlists of' mod='blockwishlist'} {$current_wishlist.firstname} {$current_wishlist.lastname}: + {foreach from=$wishlists item=wishlist name=i} + {if $wishlist.id_wishlist != $current_wishlist.id_wishlist} + <a href="{$base_dir_ssl}modules/blockwishlist/view.php?token={$wishlist.token}">{$wishlist.name}</a> + {if !$smarty.foreach.i.last} + / + {/if} + {/if} + {/foreach} +</p> +{/if} +{if $products} +<div class="addresses" id="featured-products_block_center"> + <h3>{l s='Welcome to the wishlist of' mod='blockwishlist'} {$current_wishlist.firstname} {$current_wishlist.lastname}: {$current_wishlist.name}</h3> + <p /> + {foreach from=$products item=product name=i} + <ul class="address {if $smarty.foreach.i.last}last_item{elseif $smarty.foreach.i.first}first_item{/if} {if $smarty.foreach.i.index % 2}alternate_item{else}item{/if}" id="block_{$product.id_product}_{$product.id_product_attribute}"> + <div class="ajax_block_product"> + <li class="address_title"><a href="{$link->getProductLink($product.id_product, + $product.link_rewrite, $product.category_rewrite)}" title="{l s='View' mod='blockwishlist'}">{$product.name|truncate:30:'...'|escape:'htmlall':'UTF-8'}</a></li> + <li class="address_name"> + <a href="{$link->getProductlink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{l s='Product detail' mod='blockwishlist'}" class="product_image"> + <img src="{$link->getImageLink($product.link_rewrite, $product.cover, 'medium')}" alt="{$product.name|escape:'htmlall':'UTF-8'}" /> + </a> + <span class="wishlist_product_detail"> + {if isset($product.attributes_small)} + <br /><a href="{$link->getProductlink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{l s='Product detail' mod='blockwishlist'}">{$product.attributes_small|escape:'htmlall':'UTF-8'}</a> + {/if} + <br />{l s='Quantity:' mod='blockwishlist'}<input type="text" id="{$product.id_product}_{$product.id_product_attribute}" size="3" value="{$product.quantity|intval}" readonly/> + <br />{l s='Priority:' mod='blockwishlist'} + {if $product.priority eq 0} + <span style="color:darkred; float:right;">{l s='High' mod='blockwishlist'}</span> + {elseif $product.priority eq 1} + <span style="color:darkorange; float:right;">{l s='Medium' mod='blockwishlist'}</span> + {else} + <span style="color:green; float:right;">{l s='Low' mod='blockwishlist'}</span> + {/if} + </span> + </li> + <li class="address_address1 clear"> + <a class="button_small clear" href="{$link->getProductLink($product.id_product, $product.link_rewrite, $product.category_rewrite)}" title="{l s='View' mod='blockwishlist'}">{l s='View' mod='blockwishlist'}</a> + {if isset($product.attribute_quantity) AND $product.attribute_quantity >= 1 OR !isset($product.attribute_quantity) AND $product.product_quantity >= 1} + {if !$ajax} + <form id="addtocart_{$product.id_product|intval}_{$product.id_product_attribute|intval}" action="{$link->getPageLink('cart')}" method="post"> + <p class="hidden"> + <input type="hidden" name="id_product" value="{$product.id_product|intval}" id="product_page_product_id" /> + <input type="hidden" name="add" value="1" /> + <input type="hidden" name="token" value="{$token}" /> + <input type="hidden" name="id_product_attribute" id="idCombination" value="{$product.id_product_attribute|intval}" /> + </p> + </form> + {/if} + <a href="javascript:;" class="exclusive" onclick="WishlistBuyProduct('{$token|escape:'htmlall':'UTF-8'}', '{$product.id_product}', '{$product.id_product_attribute}', '{$product.id_product}_{$product.id_product_attribute}', this, {$ajax});" title="{l s='Add to cart' mod='homefeatured'}">{l s='Add to cart' mod='blockwishlist'}</a> + {else} + <span class="exclusive">{l s='Add to cart' mod='blockwishlist'}</span> + {/if} + </li> + </div> + </ul> + {/foreach} + <p class="clear" /> +</div> +{else} + {l s='No products' mod='blockwishlist'} +{/if} +</div> diff --git a/modules/carriercompare/ajax.php b/modules/carriercompare/ajax.php new file mode 100644 index 000000000..9119c2dbf --- /dev/null +++ b/modules/carriercompare/ajax.php @@ -0,0 +1,51 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'../../../config/config.inc.php'); +require_once(dirname(__FILE__).'../../../init.php'); +require_once(dirname(__FILE__).'/carriercompare.php'); + +$carrierCompare = new CarrierCompare(); + +switch (Tools::getValue('method')) +{ + case 'getStates': + if (!(int)Tools::getValue('id_country')) + exit; + die(Tools::jsonEncode($carrierCompare->getStatesByIdCountry((int)Tools::getValue('id_country')))); + break; + case 'getCarriers': + die(Tools::jsonEncode($carrierCompare->getCarriersListByIdZone((int)Tools::getValue('id_country'), (int)Tools::getValue('id_state', 0)))); + break; + case 'saveSelection': + $errors = $carrierCompare->saveSelection((int)Tools::getValue('id_country'), (int)Tools::getValue('id_state', 0), Tools::getValue('zipcode', 0), (int)Tools::getValue('id_carrier', 0)); + die(Tools::jsonEncode($errors)); + break; + default: + exit; +} +exit; diff --git a/modules/carriercompare/carriercompare.js b/modules/carriercompare/carriercompare.js new file mode 100644 index 000000000..f04611d92 --- /dev/null +++ b/modules/carriercompare/carriercompare.js @@ -0,0 +1,138 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function updateStateByIdCountry() +{ + $.ajax({ + type: 'POST', + url: baseDir + 'modules/carriercompare/ajax.php', + data: 'method=getStates&id_country=' + $('#id_country').val(), + dataType: 'json', + success: function(json) { + $('#id_state').children().remove(); + $('#states').slideUp('slow'); + if (json.length) + { + for (state in json) + { + $('#id_state').append('<option value=\''+json[state].id_state+'\' '+(id_state == json[state].id_state ? 'selected="selected"' : '')+'>'+json[state].name+'</option>'); + } + $('#states').slideDown('slow'); + } + } + }); +} + +function updateCarriersList() +{ + $.ajax({ + type: 'POST', + url: baseDir + 'modules/carriercompare/ajax.php', + data: 'method=getCarriers&id_country=' + $('#id_country').val()+'&id_state=' + $('#id_state').val(), + dataType: 'json', + success: function(json) { + $('#carriers_list').children().remove(); + $('#availableCarriers').slideUp('slow'); + $('#noCarrier').slideUp('slow'); + if (json.length) + { + for (carrier in json) + { + var html = '<tr class="'+(carrier % 2 ? 'alternate_' : '')+'item">'+ + '<td class="carrier_action radio">'+ + '<input type="radio" name="id_carrier" value="'+json[carrier].id_carrier+'" id="id_carrier'+json[carrier].id_carrier+'" '+(id_carrier == json[carrier].id_carrier ? 'checked="checked"' : '')+'/>'+ + '</td>'+ + '<td class="carrier_name">'+ + '<label for="id_carrier'+json[carrier].id_carrier+'">'+ + (json[carrier].img ? '<img src="'+json[carrier].img+'" alt="'+json[carrier].name+'" />' : json[carrier].name)+ + '</label>'+ + '</td>'+ + '<td class="carrier_infos">'+json[carrier].delay+'</td>'+ + '<td class="carrier_price">'; + + if (json[carrier].price) + { + html += '<span class="price">'+(displayPrice == 1 ? formatCurrency(json[carrier].price_tax_exc, currencyFormat, currencySign, currencyBlank) : formatCurrency(json[carrier].price, currencyFormat, currencySign, currencyBlank))+'</span>'; + } + else + { + html += txtFree; + } + html += '</td>'+ + '</tr>'; + $('#carriers_list').append(html); + } + $('#availableCarriers').slideDown('slow'); + } + else + $('#noCarrier').slideDown('slow'); + } + }); +} + +function saveSelection() +{ + $.ajax({ + type: 'POST', + url: baseDir + 'modules/carriercompare/ajax.php', + data: 'method=saveSelection&' + $('#compare_shipping_form').serialize(), + dataType: 'json', + success: function(json) { + $('#carriercompare_errors_list').children().remove(); + $('#carriercompare_errors').slideUp('slow'); + if (json.length) + { + for (error in json) + { + $('#carriercompare_errors_list').append('<li>'+json[error]+'</li>'); + } + $('#carriercompare_errors').slideDown('slow'); + } + else + { + $('#carriercompare_submit').fadeOut('slow'); + document.location.href = document.location.href; + } + } + }); + return false; +} + +$(document).ready(function() { + $('#id_country').change(function(){ + updateStateByIdCountry(); + updateCarriersList(); + }); + $('#id_state').change(function(){ + updateCarriersList(); + }); + $('#carriercompare_submit').click(function(){ + saveSelection(); + return false; + }); + updateStateByIdCountry(); + updateCarriersList(); +}); \ No newline at end of file diff --git a/modules/carriercompare/carriercompare.php b/modules/carriercompare/carriercompare.php new file mode 100755 index 000000000..a4974cf4c --- /dev/null +++ b/modules/carriercompare/carriercompare.php @@ -0,0 +1,180 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class CarrierCompare extends Module +{ + public function __construct() + { + $this->name = 'carriercompare'; + $this->tab = 'shipping_logistics'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Shipping Estimation'); + $this->description = $this->l('Module to compare carrier possibilities before using the checkout process'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('shoppingCart') OR !$this->registerHook('header')) + return false; + return true; + } + + public function hookHeader($params) + { + $fileName = explode(DIRECTORY_SEPARATOR, $_SERVER['PHP_SELF']); + if ($fileName[(sizeof($fileName)-1)] != 'order.php') + return; + Tools::addCSS(($this->_path).'style.css', 'all'); + Tools::addJS(($this->_path).'carriercompare.js'); + } + + /* + ** Hook Shopping Cart Process + */ + public function hookShoppingCart($params) + { + global $cookie, $smarty, $currency; + + if ($cookie->id_customer) + return; + + $smarty->assign(array( + 'countries' => Country::getCountries((int)$cookie->id_lang), + 'id_carrier' => ($params['cart']->id_carrier ? $params['cart']->id_carrier : Configuration::get('PS_CARRIER_DEFAULT')), + 'id_country' => (isset($cookie->id_country) ? $cookie->id_country : Configuration::get('PS_COUNTRY_DEFAULT')), + 'id_state' => (isset($cookie->id_state) ? $cookie->id_state : 0), + 'zipcode' => (isset($cookie->postcode) ? $cookie->postcode : ''), + 'currencySign' => $currency->sign, + 'currencyRate' => $currency->conversion_rate, + 'currencyFormat' => $currency->format, + 'currencyBlank' => $currency->blank + )); + + return $this->display(__FILE__, 'carriercompare.tpl'); + } + + /* + ** Get states by Country id, called by the ajax process + ** id_state allow to preselect the selection option + */ + public function getStatesByIdCountry($id_country, $id_state = '') + { + $states = State::getStatesByIdCountry($id_country); + + return (sizeof($states) ? $states : array()); + } + + /* + ** Get carriers by country id, called by the ajax process + */ + public function getCarriersListByIdZone($id_country, $id_state = 0) + { + global $cart, $smarty; + + $id_zone = 0; + if ($id_state != 0) + $id_zone = State::getIdZone($id_state); + if (!$id_zone) + $id_zone = Country::getIdZone($id_country); + + $carriers = Carrier::getCarriersForOrder((int)$id_zone); + + return (sizeof($carriers) ? $carriers : array()); + } + + public function saveSelection($id_country, $id_state, $zipcode, $id_carrier) + { + global $cart, $cookie; + + $errors = array(); + + if (!Validate::isInt($id_state)) + $errors[] = $this->l('Invalid state ID'); + if ($id_state != 0 && !Validate::isLoadedObject(new State($id_state))) + $errors[] = $this->l('Invalid state ID'); + if (!Validate::isInt($id_country) || !Validate::isLoadedObject(new Country($id_country))) + $errors[] = $this->l('Invalid country ID'); + if (!$this->checkZipcode($zipcode, $id_country)) + $errors[] = $this->l('Please use a valid zip/postal code depending on your country selection'); + if (!Validate::isInt($id_carrier) || !Validate::isLoadedObject(new Carrier($id_carrier))) + $errors[] = $this->l('Invalid carrier ID'); + + if (sizeof($errors)) + return $errors; + + $ids_carrier = array(); + foreach (self::getCarriersListByIdZone($id_country, $id_state) as $carrier) + $ids_carrier[] = $carrier['id_carrier']; + if (!in_array($id_carrier, $ids_carrier)) + $errors[] = $this->l('This carrier ID isn\'t available for your selection'); + + if (sizeof($errors)) + return $errors; + + $cookie->id_country = $id_country; + $cookie->id_state = $id_state; + $cookie->postcode = $zipcode; + $cart->id_carrier = $id_carrier; + if (!$cart->update()) + return array($this->l('Can\'t update the cart')); + return array(); + } + + /* + ** Check the validity of the zipcode format depending of the country + */ + private function checkZipcode($zipcode, $id_country) + { + $zipcodeFormat = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `zip_code_format` + FROM `'._DB_PREFIX_.'country` + WHERE `id_country` = '.(int)$id_country); + + if (!$zipcodeFormat) + return false; + + $regxMask = str_replace( + array('N', 'C', 'L'), + array( + '[0-9]', + Country::getIsoById((int)$id_country), + '[a-zA-Z]'), + $zipcodeFormat); + if (preg_match('/'.$regxMask.'/', $zipcode)) + return true; + return false; + } +} + diff --git a/modules/carriercompare/carriercompare.tpl b/modules/carriercompare/carriercompare.tpl new file mode 100644 index 000000000..696153790 --- /dev/null +++ b/modules/carriercompare/carriercompare.tpl @@ -0,0 +1,95 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +**} + +{if !$opc} +<script type="text/javascript"> + // <![CDATA[ + var taxEnabled = "{$use_taxes}"; + var displayPrice = "{$priceDisplay}"; + var currencySign = '{$currencySign|html_entity_decode:2:"UTF-8"}'; + var currencyRate = '{$currencyRate|floatval}'; + var currencyFormat = '{$currencyFormat|intval}'; + var currencyBlank = '{$currencyBlank|intval}'; + var id_carrier = '{$id_carrier|intval}'; + var id_state = '{$id_state|intval}'; + + var txtFree = "{l s='Free!' mod='carriercompare'}"; + //]]> +</script> +<form class="std" id="compare_shipping_form" method="POST" action="#" > + <fieldset id="compare_shipping"> + <h3>{l s='Estimate your shipping & taxes' mod='carriercompare'}</h3> + + <p id="carriercompare_errors" style="display: none;"> + <ul id="carriercompare_errors_list"> + + </ul> + </p> + + <p> + <label for="id_country">{l s='Country' mod='carriercompare'}</label> + <select name="id_country" id="id_country"> + {foreach from=$countries item=country} + <option value="{$country.id_country}" {if $id_country == $country.id_country}selected="selected"{/if}>{$country.name|escape:'htmlall':'UTF-8'}</option> + {/foreach} + </select> + </p> + + <p id="states" style="display: none;"> + <label for="id_state">{l s='State' mod='carriercompare'}</label> + <select name="id_state" id="id_state"> + + </select> + </p> + + <p> + <label for="zipcode">{l s='Zipcode' mod='carriercompare'}</label> + <input type="text" name="zipcode" id="zipcode" value="{$zipcode|escape:'htmlall':'UTF-8'}"/> + </p> + + <div id="availableCarriers" style="display: none;"> + <table cellspacing="0" cellpadding="0" id="availableCarriers_table" class="std"> + <thead> + <tr> + <th class="carrier_action first_item"></th> + <th class="carrier_name item">{l s='Carrier' mod='carriercompare'}</th> + <th class="carrier_infos item">{l s='Information' mod='carriercompare'}</th> + <th class="carrier_price last_item">{l s='Price' mod='carriercompare'}</th> + </tr> + </thead> + <tbody id="carriers_list"> + + </tbody> + </table> + </div> + <p class="warning center" id="noCarrier" style="display: none;">{l s='No carrier is available for this selection' mod='carriercompare'}</p> + + <p class="center"> + <input class="exclusive_large" id="carriercompare_submit" type="submit" name="carriercompare_submit" value="{l s='Update my shipping option' mod='carriercompare'}"/> + </p> + </fieldset> +</form> +{/if} \ No newline at end of file diff --git a/modules/carriercompare/config.xml b/modules/carriercompare/config.xml new file mode 100644 index 000000000..af70c427d --- /dev/null +++ b/modules/carriercompare/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>carriercompare</name> + <displayName><![CDATA[Shipping Estimation]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Module to compare carrier possibilities before using the checkout process]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[shipping_logistics]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/carriercompare/de.php b/modules/carriercompare/de.php new file mode 100644 index 000000000..5e5294283 --- /dev/null +++ b/modules/carriercompare/de.php @@ -0,0 +1,24 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{carriercompare}prestashop>carriercompare_e7a6ca4e744870d455a57b644f696457'] = 'Gratis!'; +$_MODULE['<{carriercompare}prestashop>carriercompare_fbc1bef527a3a092053a244fd8d87abf'] = 'Versand und Steuern kalkulieren'; +$_MODULE['<{carriercompare}prestashop>carriercompare_59716c97497eb9694541f7c3d37b1a4d'] = 'Land'; +$_MODULE['<{carriercompare}prestashop>carriercompare_46a2a41cc6e552044816a2d04634545d'] = 'Bundesland'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e0ed8e71dbd22a1e91cb570b52443fd5'] = 'PLZ'; +$_MODULE['<{carriercompare}prestashop>carriercompare_914419aa32f04011357d3b604a86d7eb'] = 'Versender'; +$_MODULE['<{carriercompare}prestashop>carriercompare_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{carriercompare}prestashop>carriercompare_3601146c4e948c32b6424d2c0a7f0118'] = 'Preis'; +$_MODULE['<{carriercompare}prestashop>carriercompare_f620c0ed0c89129c9dd8953406300061'] = 'Kein Versender für diese Region ausgewählt'; +$_MODULE['<{carriercompare}prestashop>carriercompare_c6b61ece4cb72c71e84d91a4d22aa449'] = 'Versandoptionen aktualisieren'; +$_MODULE['<{carriercompare}prestashop>carriercompare_115484428c82f859100c07ae1170d9e0'] = 'Versandkalkulation'; +$_MODULE['<{carriercompare}prestashop>carriercompare_1b28c1bcdfb00fe76bf8612d5cd81b01'] = 'Modul, um Liefermöglichkeiten zu vergleichen, befor es zum Bestellprozess kommt'; +$_MODULE['<{carriercompare}prestashop>carriercompare_ed70a57a190d596171cf324c16a2277d'] = 'Ungültige Bundesland-ID'; +$_MODULE['<{carriercompare}prestashop>carriercompare_66e799a222e07b1cf25498465028061d'] = 'Ungültige Land-ID'; +$_MODULE['<{carriercompare}prestashop>carriercompare_8250266f9d2fb72b4f8921a0b998546e'] = 'Verwenden Sie bitte eine gültige Postleitzahl, die Ihrer Landauswahl entspricht'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e3f585e306c3cda18369730a6a628f7b'] = 'Ungültige Lieferantne-ID'; +$_MODULE['<{carriercompare}prestashop>carriercompare_efaf5c3827ef576b05de32ad458f196c'] = 'Dieser Lieferant steht für diesen Bereich nicht zur Verfüung'; +$_MODULE['<{carriercompare}prestashop>carriercompare_edc5cf1b3bab64b1d45ef51c63b53887'] = 'Warenkorb kann nicht aktualisiert werden'; + +?> \ No newline at end of file diff --git a/modules/carriercompare/es.php b/modules/carriercompare/es.php new file mode 100644 index 000000000..740c8b53a --- /dev/null +++ b/modules/carriercompare/es.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{carriercompare}prestashop>carriercompare_115484428c82f859100c07ae1170d9e0'] = 'Estimación de la entrega'; +$_MODULE['<{carriercompare}prestashop>carriercompare_68e114c207a6820a8f14d0eceacf17d7'] = 'Módulo que permite hacer una estimación de los gastos de envío antes de comenzar el proceso de compra.'; +$_MODULE['<{carriercompare}prestashop>carriercompare_ed70a57a190d596171cf324c16a2277d'] = 'El identificante State no es válido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_66e799a222e07b1cf25498465028061d'] = 'El identificante Country no es válido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_b72dd62d03697b37417288c63e78c8c6'] = 'Por favor, utilice un código postal válido en función del país elegido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e3f585e306c3cda18369730a6a628f7b'] = 'El identificante del transportista no es válido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_efaf5c3827ef576b05de32ad458f196c'] = 'Este identificante de transportista no se encuentra disponible para esta selección'; +$_MODULE['<{carriercompare}prestashop>carriercompare_edc5cf1b3bab64b1d45ef51c63b53887'] = 'Imposible actualizar el carrito'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e7a6ca4e744870d455a57b644f696457'] = '¡Gratis!'; +$_MODULE['<{carriercompare}prestashop>carriercompare_fbc1bef527a3a092053a244fd8d87abf'] = 'Haga una estimación de sus gastos de envío e impuestos'; +$_MODULE['<{carriercompare}prestashop>carriercompare_59716c97497eb9694541f7c3d37b1a4d'] = 'País'; +$_MODULE['<{carriercompare}prestashop>carriercompare_46a2a41cc6e552044816a2d04634545d'] = 'Estado'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e0ed8e71dbd22a1e91cb570b52443fd5'] = 'Código postal'; +$_MODULE['<{carriercompare}prestashop>carriercompare_914419aa32f04011357d3b604a86d7eb'] = 'Transportista'; +$_MODULE['<{carriercompare}prestashop>carriercompare_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Información'; +$_MODULE['<{carriercompare}prestashop>carriercompare_3601146c4e948c32b6424d2c0a7f0118'] = 'Precio'; +$_MODULE['<{carriercompare}prestashop>carriercompare_f620c0ed0c89129c9dd8953406300061'] = 'Ninguna compañía está disponible para esta selección'; +$_MODULE['<{carriercompare}prestashop>carriercompare_c6b61ece4cb72c71e84d91a4d22aa449'] = 'Actualizar mi opción de envío'; diff --git a/modules/carriercompare/fr.php b/modules/carriercompare/fr.php new file mode 100644 index 000000000..47e116839 --- /dev/null +++ b/modules/carriercompare/fr.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{carriercompare}prestashop>carriercompare_115484428c82f859100c07ae1170d9e0'] = 'Estimation des livraisons'; +$_MODULE['<{carriercompare}prestashop>carriercompare_68e114c207a6820a8f14d0eceacf17d7'] = 'Module permettant de faire une estimation des coûts de livraison avant de rentrer dans le processus de commande'; +$_MODULE['<{carriercompare}prestashop>carriercompare_ed70a57a190d596171cf324c16a2277d'] = 'L\'identifiant State est invalide'; +$_MODULE['<{carriercompare}prestashop>carriercompare_66e799a222e07b1cf25498465028061d'] = 'L\'identifiant Country est invalide'; +$_MODULE['<{carriercompare}prestashop>carriercompare_b72dd62d03697b37417288c63e78c8c6'] = 'Veuillez utiliser un code postal valide en fonction du pays choisi'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e3f585e306c3cda18369730a6a628f7b'] = 'L\'identifiant du transporteur est invalide'; +$_MODULE['<{carriercompare}prestashop>carriercompare_efaf5c3827ef576b05de32ad458f196c'] = 'Cet identifiant de transporteur n\'est pas disponible pour cette sélection'; +$_MODULE['<{carriercompare}prestashop>carriercompare_edc5cf1b3bab64b1d45ef51c63b53887'] = 'Impossibilité de mettre a jour le panier'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e7a6ca4e744870d455a57b644f696457'] = 'Offert !'; +$_MODULE['<{carriercompare}prestashop>carriercompare_fbc1bef527a3a092053a244fd8d87abf'] = 'Estimez vos frais de livraison & taxes'; +$_MODULE['<{carriercompare}prestashop>carriercompare_59716c97497eb9694541f7c3d37b1a4d'] = 'Pays'; +$_MODULE['<{carriercompare}prestashop>carriercompare_46a2a41cc6e552044816a2d04634545d'] = 'Etat'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e0ed8e71dbd22a1e91cb570b52443fd5'] = 'Code postal'; +$_MODULE['<{carriercompare}prestashop>carriercompare_914419aa32f04011357d3b604a86d7eb'] = 'Transporteur'; +$_MODULE['<{carriercompare}prestashop>carriercompare_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{carriercompare}prestashop>carriercompare_3601146c4e948c32b6424d2c0a7f0118'] = 'Prix'; +$_MODULE['<{carriercompare}prestashop>carriercompare_f620c0ed0c89129c9dd8953406300061'] = 'Aucun transporteur n\'est disponible pour cette sélection'; +$_MODULE['<{carriercompare}prestashop>carriercompare_c6b61ece4cb72c71e84d91a4d22aa449'] = 'Lancer l\'estimation'; diff --git a/modules/carriercompare/it.php b/modules/carriercompare/it.php new file mode 100644 index 000000000..6e5386746 --- /dev/null +++ b/modules/carriercompare/it.php @@ -0,0 +1,24 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{carriercompare}prestashop>carriercompare_e7a6ca4e744870d455a57b644f696457'] = 'Gratis!'; +$_MODULE['<{carriercompare}prestashop>carriercompare_fbc1bef527a3a092053a244fd8d87abf'] = 'Stimare la spedizione e tasse'; +$_MODULE['<{carriercompare}prestashop>carriercompare_59716c97497eb9694541f7c3d37b1a4d'] = 'Nazione'; +$_MODULE['<{carriercompare}prestashop>carriercompare_46a2a41cc6e552044816a2d04634545d'] = 'Provincia'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e0ed8e71dbd22a1e91cb570b52443fd5'] = 'CAP'; +$_MODULE['<{carriercompare}prestashop>carriercompare_914419aa32f04011357d3b604a86d7eb'] = 'Corriere'; +$_MODULE['<{carriercompare}prestashop>carriercompare_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Informazioni'; +$_MODULE['<{carriercompare}prestashop>carriercompare_3601146c4e948c32b6424d2c0a7f0118'] = 'Prezzo'; +$_MODULE['<{carriercompare}prestashop>carriercompare_f620c0ed0c89129c9dd8953406300061'] = 'Nessun vettore è disponibile per questa selezione'; +$_MODULE['<{carriercompare}prestashop>carriercompare_c6b61ece4cb72c71e84d91a4d22aa449'] = 'Aggiorna la mia opzione di spedizione'; +$_MODULE['<{carriercompare}prestashop>carriercompare_115484428c82f859100c07ae1170d9e0'] = 'Stima di spedizione'; +$_MODULE['<{carriercompare}prestashop>carriercompare_1b28c1bcdfb00fe76bf8612d5cd81b01'] = 'Modulo per il confronto della presenza di corrieri prima di andare alla cassa'; +$_MODULE['<{carriercompare}prestashop>carriercompare_ed70a57a190d596171cf324c16a2277d'] = 'ID provincia non valido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_66e799a222e07b1cf25498465028061d'] = 'ID nazione non valido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_8250266f9d2fb72b4f8921a0b998546e'] = 'Utilizza un CAP che dipenda dalla tua Provincia'; +$_MODULE['<{carriercompare}prestashop>carriercompare_e3f585e306c3cda18369730a6a628f7b'] = 'ID corriere non valido'; +$_MODULE['<{carriercompare}prestashop>carriercompare_efaf5c3827ef576b05de32ad458f196c'] = 'Questo ID del corriere non è disponibile per la tua selezione'; +$_MODULE['<{carriercompare}prestashop>carriercompare_edc5cf1b3bab64b1d45ef51c63b53887'] = 'Impossibile aggiornare il carrello'; + +?> \ No newline at end of file diff --git a/modules/carriercompare/logo.gif b/modules/carriercompare/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..482ceea3cddf5a48431d1f910553c60ea5683cb5 GIT binary patch literal 583 zcmZ?wbhEHb6krfwc*elsZK-&DWA(N=7oCJ9)tm3CN6ml!>A$L}@A3J?n>TMxPEI~@ z<E?AMkuzt`WM^mZyZTN!boQwk;nC62k54XGTWaQ9w#C@k`0CoS4aXne+S&c^=$wGb z=k~V;{Qv*|#np{hX6LxLxZJyUZ`SUIRz;fwY}N1WpK^M3OsKQ|<rO7Q&MdVn*?(ba zR$AX_pWf5Eo4wS`{0?`AURhgZn6~of);8zbJr|~@@4Wcx+`^Pociy`-9eDrk|ARx5 zZ?C93(H|XTrFdp?;=O%+udZ(ma?sYa3cR<q#i{C$L*<UM^OH<-);+(t=IFim!80!` z+W*M2{RG3H1d2ad7}*(Q8FWCd1H}mg`;rFPrskH`w)Peqd3jTNTLT$ACXQBlM@KnN zPfcMdDUnuFIVo!g2V-M#2TMygHwjt$4p|d!ejia;TNZC=U0)toEgd(0HY+1p17TxE zadB;Pb4Fzg3oB+>8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=Wd<YxOkxhgEauxXSE^# literal 0 HcmV?d00001 diff --git a/modules/carriercompare/style.css b/modules/carriercompare/style.css new file mode 100644 index 000000000..1b9f951f7 --- /dev/null +++ b/modules/carriercompare/style.css @@ -0,0 +1,14 @@ +#compare_shipping .center {text-align: center;} + +#compare_shipping #availableCarriers_table { + width: 95%; + margin: auto; +} + +#compare_shipping ul#carriercompare_errors_list { + color: red; +} + +#compare_shipping ul#carriercompare_errors_list li { + margin-left: 30px; +} \ No newline at end of file diff --git a/modules/cashondelivery/cashondelivery.gif b/modules/cashondelivery/cashondelivery.gif new file mode 100644 index 0000000000000000000000000000000000000000..926ce1d7c56ef4e7bc8cb160f0c74a6cbf737e74 GIT binary patch literal 2391 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 JI7vVN06Q{W1k(Tj literal 0 HcmV?d00001 diff --git a/modules/cashondelivery/cashondelivery.jpg b/modules/cashondelivery/cashondelivery.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb9c6a52354c4f1c603e87b404766c68d50b8b0b GIT binary patch literal 3009 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 literal 0 HcmV?d00001 diff --git a/modules/cashondelivery/cashondelivery.php b/modules/cashondelivery/cashondelivery.php new file mode 100644 index 000000000..c73aef759 --- /dev/null +++ b/modules/cashondelivery/cashondelivery.php @@ -0,0 +1,85 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class CashOnDelivery extends PaymentModule +{ + public function __construct() + { + $this->name = 'cashondelivery'; + $this->tab = 'payments_gateways'; + $this->version = '0.3'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->currencies = false; + + parent::__construct(); + + $this->displayName = $this->l('Cash on delivery (COD)'); + $this->description = $this->l('Accept cash on delivery payments'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('payment') OR !$this->registerHook('paymentReturn')) + return false; + return true; + } + + public function hookPayment($params) + { + if (!$this->active) + return ; + + global $smarty; + + // Check if cart has product download + foreach ($params['cart']->getProducts() AS $product) + { + $pd = ProductDownload::getIdFromIdProduct((int)($product['id_product'])); + if ($pd AND Validate::isUnsignedInt($pd)) + return false; + } + + $smarty->assign(array( + 'this_path' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + return $this->display(__FILE__, 'payment.tpl'); + } + + public function hookPaymentReturn($params) + { + if (!$this->active) + return ; + + return $this->display(__FILE__, 'confirmation.tpl'); + } +} diff --git a/modules/cashondelivery/config.xml b/modules/cashondelivery/config.xml new file mode 100755 index 000000000..6ee431f63 --- /dev/null +++ b/modules/cashondelivery/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>cashondelivery</name> + <displayName><![CDATA[Cash on delivery (COD)]]></displayName> + <version><![CDATA[0.3]]></version> + <description><![CDATA[Accept cash on delivery payments]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/cashondelivery/confirmation.tpl b/modules/cashondelivery/confirmation.tpl new file mode 100644 index 000000000..6633c8ce0 --- /dev/null +++ b/modules/cashondelivery/confirmation.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p>{l s='Your order on' mod='cashondelivery'} <span class="bold">{$shop_name}</span> {l s='is complete.' mod='cashondelivery'} + <br /><br /> + {l s='You have chosen the cash on delivery method.' mod='cashondelivery'} + <br /><br /><span class="bold">{l s='Your order will be sent very soon.' mod='cashondelivery'}</span> + <br /><br />{l s='For any questions or for further information, please contact our' mod='cashondelivery'} <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='cashondelivery'}</a>. +</p> diff --git a/modules/cashondelivery/de.php b/modules/cashondelivery/de.php new file mode 100644 index 000000000..7112fd490 --- /dev/null +++ b/modules/cashondelivery/de.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashondelivery}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung von'; +$_MODULE['<{cashondelivery}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Sie haben die Nachnahme-Methode gewählt.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Ihre Bestellung wird sehr bald geschickt werden.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{cashondelivery}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{cashondelivery}prestashop>payment_b7ada96a0da7ee7fb5371cca0b036d5c'] = 'Zahlung per Nachnahme (COD)'; +$_MODULE['<{cashondelivery}prestashop>payment_536dc7424180872c8c2488ae0286fb53'] = 'Sie bezahlen die Ware bei der Lieferung'; +$_MODULE['<{cashondelivery}prestashop>validation_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Versand'; +$_MODULE['<{cashondelivery}prestashop>validation_0c25b529b4d690c39b0831840d0ed01c'] = 'Bestellsumme'; +$_MODULE['<{cashondelivery}prestashop>validation_d538c5b86e9a71455ba27412f4e9ab51'] = 'Nachnahme-Zahlung (COD)'; +$_MODULE['<{cashondelivery}prestashop>validation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Sie haben die Nachnahme-Methode gewählt.'; +$_MODULE['<{cashondelivery}prestashop>validation_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung beträgt'; +$_MODULE['<{cashondelivery}prestashop>validation_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. St.)'; +$_MODULE['<{cashondelivery}prestashop>validation_0881a11f7af33bc1b43e437391129d66'] = 'Bitte bestätigen Sie Ihre Bestellung durch Klicken auf \"BESTELLEN\"'; +$_MODULE['<{cashondelivery}prestashop>validation_569fd05bdafa1712c4f6be5b153b8418'] = 'Andere Zahlungsmethoden'; +$_MODULE['<{cashondelivery}prestashop>validation_46b9e3665f187c739c55983f757ccda0'] = 'BESTELLEN'; +$_MODULE['<{cashondelivery}prestashop>cashondelivery_1f9497d3e8bac9b50151416f04119cec'] = 'Nachnahme (COD)'; +$_MODULE['<{cashondelivery}prestashop>cashondelivery_7a3ef27eb0b1895ebf263ad7dd949fb6'] = 'Zahlungen per Nachnahme akzeptieren '; + +?> \ No newline at end of file diff --git a/modules/cashondelivery/en.php b/modules/cashondelivery/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/cashondelivery/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/cashondelivery/es.php b/modules/cashondelivery/es.php new file mode 100644 index 000000000..6aaa9be5b --- /dev/null +++ b/modules/cashondelivery/es.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashondelivery}prestashop>cashondelivery_1f9497d3e8bac9b50151416f04119cec'] = 'Pago contra reembolso'; +$_MODULE['<{cashondelivery}prestashop>cashondelivery_7a3ef27eb0b1895ebf263ad7dd949fb6'] = 'Aceptar pagos contra reembolso'; +$_MODULE['<{cashondelivery}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido en'; +$_MODULE['<{cashondelivery}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ha sido registrado.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Ha elegido pagar en el momento de la entrega.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Le enviaremos su pedido en breve plazo.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier pregunta, póngase en contacto con nuestro'; +$_MODULE['<{cashondelivery}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'servicio clientela'; +$_MODULE['<{cashondelivery}prestashop>payment_b7ada96a0da7ee7fb5371cca0b036d5c'] = 'Pagra contra reembolso'; +$_MODULE['<{cashondelivery}prestashop>payment_536dc7424180872c8c2488ae0286fb53'] = 'Usted paga la mercancía a la entrega'; +$_MODULE['<{cashondelivery}prestashop>validation_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'transporte'; +$_MODULE['<{cashondelivery}prestashop>validation_0c25b529b4d690c39b0831840d0ed01c'] = 'Suma del pedido'; +$_MODULE['<{cashondelivery}prestashop>validation_d538c5b86e9a71455ba27412f4e9ab51'] = 'Pago contra reembolso'; +$_MODULE['<{cashondelivery}prestashop>validation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Ha elegido el pago contra reembolso'; +$_MODULE['<{cashondelivery}prestashop>validation_e2867a925cba382f1436d1834bb52a1c'] = 'El importe total de su pedido es'; +$_MODULE['<{cashondelivery}prestashop>validation_1f87346a16cf80c372065de3c54c86d9'] = '(tasas incluídas)'; +$_MODULE['<{cashondelivery}prestashop>validation_0881a11f7af33bc1b43e437391129d66'] = 'Por favor acepte su pedido pulsando en \'confirmo mi pedido\''; +$_MODULE['<{cashondelivery}prestashop>validation_569fd05bdafa1712c4f6be5b153b8418'] = 'Otros modos de pago'; +$_MODULE['<{cashondelivery}prestashop>validation_46b9e3665f187c739c55983f757ccda0'] = 'Confirmo mi pedido'; diff --git a/modules/cashondelivery/fr.php b/modules/cashondelivery/fr.php new file mode 100644 index 000000000..dd8ec91a9 --- /dev/null +++ b/modules/cashondelivery/fr.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashondelivery}prestashop>cashondelivery_1f9497d3e8bac9b50151416f04119cec'] = 'Comptant à la livraison'; +$_MODULE['<{cashondelivery}prestashop>cashondelivery_7a3ef27eb0b1895ebf263ad7dd949fb6'] = 'Accepte le paiement lors de la livraison'; +$_MODULE['<{cashondelivery}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{cashondelivery}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est bien enregistrée.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Vous avez choisi le paiement lors de la livraison.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande vous sera envoyée très prochainement.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{cashondelivery}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{cashondelivery}prestashop>payment_b7ada96a0da7ee7fb5371cca0b036d5c'] = 'Payer comptant à la livraison'; +$_MODULE['<{cashondelivery}prestashop>payment_536dc7424180872c8c2488ae0286fb53'] = 'Vous payez lors de la livraison de votre commande'; +$_MODULE['<{cashondelivery}prestashop>validation_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Frais d\'expédition'; +$_MODULE['<{cashondelivery}prestashop>validation_0c25b529b4d690c39b0831840d0ed01c'] = 'Récapitulatif de commande'; +$_MODULE['<{cashondelivery}prestashop>validation_d538c5b86e9a71455ba27412f4e9ab51'] = 'Paiement comptant à la livraison'; +$_MODULE['<{cashondelivery}prestashop>validation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Vous avez choisi de régler comptant lors de la livraison de la commande.'; +$_MODULE['<{cashondelivery}prestashop>validation_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande s\'élève à'; +$_MODULE['<{cashondelivery}prestashop>validation_1f87346a16cf80c372065de3c54c86d9'] = 'TTC'; +$_MODULE['<{cashondelivery}prestashop>validation_0881a11f7af33bc1b43e437391129d66'] = 'Merci de confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{cashondelivery}prestashop>validation_569fd05bdafa1712c4f6be5b153b8418'] = 'Autres moyens de paiement'; +$_MODULE['<{cashondelivery}prestashop>validation_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; diff --git a/modules/cashondelivery/it.php b/modules/cashondelivery/it.php new file mode 100644 index 000000000..dc857f980 --- /dev/null +++ b/modules/cashondelivery/it.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashondelivery}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine sul'; +$_MODULE['<{cashondelivery}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completa.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Hai scelto la modalità di pagamento alla consegna.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{cashondelivery}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{cashondelivery}prestashop>payment_b7ada96a0da7ee7fb5371cca0b036d5c'] = 'Paga in contanti alla consegna (COD)'; +$_MODULE['<{cashondelivery}prestashop>payment_536dc7424180872c8c2488ae0286fb53'] = 'Si paga per la merce al momento della consegna'; +$_MODULE['<{cashondelivery}prestashop>validation_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Spedizione'; +$_MODULE['<{cashondelivery}prestashop>validation_0c25b529b4d690c39b0831840d0ed01c'] = 'Riepilogo ordine'; +$_MODULE['<{cashondelivery}prestashop>validation_d538c5b86e9a71455ba27412f4e9ab51'] = 'Pagamento in contanti alla consegna (COD)'; +$_MODULE['<{cashondelivery}prestashop>validation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'Hai scelto la modalità pagamento alla consegna.'; +$_MODULE['<{cashondelivery}prestashop>validation_e2867a925cba382f1436d1834bb52a1c'] = 'L\'importo totale del tuo ordine è'; +$_MODULE['<{cashondelivery}prestashop>validation_1f87346a16cf80c372065de3c54c86d9'] = '(Tasse incl.)'; +$_MODULE['<{cashondelivery}prestashop>validation_0881a11f7af33bc1b43e437391129d66'] = 'Si prega di confermare l\'ordine cliccando su \'confermo il mio ordine\''; +$_MODULE['<{cashondelivery}prestashop>validation_569fd05bdafa1712c4f6be5b153b8418'] = 'Altri metodi di pagamento'; +$_MODULE['<{cashondelivery}prestashop>validation_46b9e3665f187c739c55983f757ccda0'] = 'Confermo il mio ordine'; +$_MODULE['<{cashondelivery}prestashop>cashondelivery_1f9497d3e8bac9b50151416f04119cec'] = 'Pagamento alla consegna (COD)'; +$_MODULE['<{cashondelivery}prestashop>cashondelivery_7a3ef27eb0b1895ebf263ad7dd949fb6'] = 'Accetta pagamenti COD (alla consegna)'; + +?> \ No newline at end of file diff --git a/modules/cashondelivery/logo.gif b/modules/cashondelivery/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a082499446067f528398020a42a7f6491bd6fa6f GIT binary patch literal 425 zcmV;a0apG;Nk%w1VGsZi0M!5hD1QQ{%a7NuO^CN@@ZiF3qc`i=qQr+O-MDD=(0A+1 zgHe|u|Mb^;u2j;ZSKYaJ`s~j7<ge+pJYt<L_t%P+!GS}M75@9@*tAps@4)NCg7V$2 z$c;bsyg%N)WbeUiWu!;v(UJe@wK#<e_wU^Q)pqf~Ro=;z_}iR>wPjnMJLtYg`}Xcj zl{28liT>Y|%9AnLtWS@-b91Ur&YM2oymI8QOYqQ(``m-z#eMAAvH$kn|Nr)^&6EG- zr1s^$A^8LW2LL<(EC2ui01yBW000KYK%Q_&QshX(<d9{+7!-mKODX($LYK=XQp4zy zkX#NTgv2P38v;S#g#-o&;dH7YC<#<V;do$n5FrX(91sj5FC{)WFn<hb2?;h4h$S5o zH;p?x3>g$3HWU;E6Dup3j-44VCMF#P4GT63Fan&NA_ck=4FNM28nqWY86vqo$N@4g zAR`AgH9y2Y6Fo8mDcKb&06aP|V-OPo0WK~n6(AN<JS-<P8Vd^+7Aom2R3r}vAqX5J TD)3PeLcoCo0wcN&2?78+*%G=# literal 0 HcmV?d00001 diff --git a/modules/cashondelivery/payment.tpl b/modules/cashondelivery/payment.tpl new file mode 100644 index 000000000..bf105318d --- /dev/null +++ b/modules/cashondelivery/payment.tpl @@ -0,0 +1,34 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="payment_module"> + <a href="{$this_path_ssl}validation.php" title="{l s='Pay with cash on delivery (COD)' mod='cashondelivery'}"> + <img src="{$this_path}cashondelivery.gif" alt="{l s='Pay with cash on delivery (COD)' mod='cashondelivery'}" style="float:left;" /> + <br />{l s='Pay with cash on delivery (COD)' mod='cashondelivery'} + <br />{l s='You pay for the merchandise upon delivery' mod='cashondelivery'} + <br style="clear:both;" /> + </a> +</p> \ No newline at end of file diff --git a/modules/cashondelivery/validation.php b/modules/cashondelivery/validation.php new file mode 100644 index 000000000..b8d462b56 --- /dev/null +++ b/modules/cashondelivery/validation.php @@ -0,0 +1,63 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include(dirname(__FILE__).'/cashondelivery.php'); + +$cashOnDelivery = new CashOnDelivery(); +if ($cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$cashOnDelivery->active) + Tools::redirect('index.php?controller=order&step=1'); + +$customer = new Customer((int)$cart->id_customer); + +if (!Validate::isLoadedObject($customer)) + Tools::redirect('index.php?controller=order&step=1'); + +/* Validate order */ +if (Tools::getValue('confirm')) +{ + $customer = new Customer((int)$cart->id_customer); + $total = $cart->getOrderTotal(true, Cart::BOTH); + $cashOnDelivery->validateOrder((int)$cart->id, _PS_OS_PREPARATION_, $total, $cashOnDelivery->displayName, NULL, array(), NULL, false, $customer->secure_key); + $order = new Order((int)$cashOnDelivery->currentOrder); + Tools::redirect('index.php?controller=order-confirmation&key='.$customer->secure_key.'&id_cart='.(int)($cart->id).'&id_module='.(int)$cashOnDelivery->id.'&id_order='.(int)$cashOnDelivery->currentOrder); +} +else +{ + /* or ask for confirmation */ + $smarty->assign(array( + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/cashondelivery/' + )); + + $smarty->assign('this_path', __PS_BASE_URI__.'modules/cashondelivery/'); + $template = 'validation.tpl'; + echo Module::display('cashondelivery', $template); +} + +include(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/cashondelivery/validation.tpl b/modules/cashondelivery/validation.tpl new file mode 100644 index 000000000..9013b5c8a --- /dev/null +++ b/modules/cashondelivery/validation.tpl @@ -0,0 +1,58 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Shipping' mod='cashondelivery'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +<h2>{l s='Order summation' mod='cashondelivery'}</h2> + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +<h3>{l s='Cash on delivery (COD) payment' mod='cashondelivery'}</h3> + +<form action="{$this_path_ssl}validation.php" method="post"> + <input type="hidden" name="confirm" value="1" /> + <p> + <img src="{$this_path}cashondelivery.jpg" alt="{l s='Cash on delivery (COD) payment' mod='cashondelivery'}" style="float:left; margin: 0px 10px 5px 0px;" /> + {l s='You have chosen the cash on delivery method.' mod='cashondelivery'} + <br/><br /> + {l s='The total amount of your order is' mod='cashondelivery'} + <span id="amount_{$currencies.0.id_currency}" class="price">{convertPrice price=$total}</span> + {if $use_taxes == 1} + {l s='(tax incl.)' mod='cashondelivery'} + {/if} + </p> + <p> + <br /><br /> + <br /><br /> + <b>{l s='Please confirm your order by clicking \'I confirm my order\'' mod='cashondelivery'}.</b> + </p> + <p class="cart_navigation"> + <a href="{$link->getPageLink('order', true, NULL, "step=3")}" class="button_large">{l s='Other payment methods' mod='cashondelivery'}</a> + <input type="submit" name="submit" value="{l s='I confirm my order' mod='cashondelivery'}" class="exclusive_large" /> + </p> +</form> diff --git a/modules/cashticket/Disposition.php b/modules/cashticket/Disposition.php new file mode 100644 index 000000000..792084e59 --- /dev/null +++ b/modules/cashticket/Disposition.php @@ -0,0 +1,82 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class Disposition +{ + const TABLE_NAME = 'disposition'; + + public static function create($id_cart, $mtid, $amount, $currency) + { + return Db::getInstance()->Execute( + 'INSERT INTO `'._DB_PREFIX_.self::TABLE_NAME.'` (`id_cart`, `mtid`, `amount`, `currency`) + VALUES ('.(int)($id_cart).',\''.pSQL($mtid).'\','.(float)($amount).',\''.pSQL($currency).'\')'); + } + + public static function delete($id) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_disposition` = '.(int)($id)); + } + + public static function deleteByCartId($id_cart) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_cart` = '.(int)($id_cart)); + } + + public static function getByCartId($id_cart) + { + return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_cart` = '.(int)($id_cart)); + } + + public static function createTable() + { + return Db::getInstance()->Execute( + 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'` ( + `id_disposition` int(11) NOT NULL AUTO_INCREMENT, + `id_cart` int(11) NOT NULL, + `mtid` varchar(20) NOT NULL, + `amount` float NOT NULL, + `currency` varchar(3) NOT NULL, + PRIMARY KEY (`id_disposition`), + UNIQUE KEY `id_cart` (`id_cart`) + ) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); + } + + public static function dropTable() + { + return Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'`'); + } + + public static function updateAmount($id_disposition, $amount) + { + return Db::getInstance()->Execute( + 'UPDATE `'._DB_PREFIX_.self::TABLE_NAME.'` SET `amount` = `amount` - '.(float)($amount).' WHERE `id_disposition` = '.(int)($id_disposition)); + } + + +} + + diff --git a/modules/cashticket/PrepaidServices.php b/modules/cashticket/PrepaidServices.php new file mode 100644 index 000000000..2faf5de16 --- /dev/null +++ b/modules/cashticket/PrepaidServices.php @@ -0,0 +1,665 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +$module_name = 'cashticket'; + +include(_PS_MODULE_DIR_.$module_name.'/Disposition.php'); +include(_PS_MODULE_DIR_.$module_name.'/PrepaidServicesAPI.php'); + +abstract class PrepaidServices extends PaymentModule +{ + protected $max_amount = 1000; + protected $max_amount_currency = 'EUR'; + protected $default_language = 'en'; + + protected $prefix = ''; + + protected $environments = array('P' => 'Production', + 'T' => 'Test'); + + protected $business_types = array('I' => 'Intangible', + 'T' => 'Tangible'); + + // abstract + protected $supported_languages; + protected $allowed_currencies; + protected $supported_currencies; + protected $payment_url; + protected $prepaid_api_configuration; + protected $register_url; + + public function __construct() + { + parent::__construct(); + + if ($this->active AND !extension_loaded('curl')) + $this->warning = $this->getL('curl_required'); + } + + public function install() + { + $ps_ct_immediat_payment = Configuration::get($this->prefix.'IMMEDIAT_PAYMENT') ? Configuration::get($this->prefix.'IMMEDIAT_PAYMENT') : '1'; + $ps_ct_salt = Configuration::get($this->prefix.'SALT') ? Configuration::get($this->prefix.'SALT') : strtoupper(Tools::passwdGen(8)); + $ps_ct_business_type = Configuration::get($this->prefix.'BUSINESS_TYPE') ? Configuration::get($this->prefix.'BUSINESS_TYPE') : 'I'; + $ps_ct_environment = Configuration::get($this->prefix.'ENVIRONMENT') ? Configuration::get($this->prefix.'ENVIRONMENT') : 'T'; + + return parent::install() AND Disposition::createTable() AND $this->_createOrderState() AND + $this->registerHook('payment') AND $this->registerHook('paymentReturn') AND $this->registerHook('adminOrder') + AND Configuration::updateValue($this->prefix.'IMMEDIAT_PAYMENT', $ps_ct_immediat_payment) + AND Configuration::updateValue($this->prefix.'SALT', $ps_ct_salt) + AND Configuration::updateValue($this->prefix.'BUSINESS_TYPE', $ps_ct_business_type) + AND Configuration::updateValue($this->prefix.'ENVIRONMENT', $ps_ct_environment); + } + + private function _createOrderState() + { + + if (Configuration::get($this->prefix.'ORDER_STATE_ID') && Configuration::get($this->prefix.'ORDER_STATE_PART_ID')) return true; + + // Awaiting payment + $os = new OrderState(); + $os->name = array('1' => 'Awaiting '.$this->displayName.' payment', + '2' => 'En attente du paiement par '.$this->displayName, + '3' => 'En espera de pago por '.$this->displayName); + + $os->invoice = false; + $os->color = 'lightblue'; + $os->logable = true; + + if ($os->save()) + { + Configuration::updateValue($this->prefix.'ORDER_STATE_ID', $os->id); + + copy(_PS_MODULE_DIR_.$this->name.'/logo.gif',_PS_IMG_DIR_.'os/'.$os->id.'.gif'); + } else + return false; + + // Partially paid + $os1 = new OrderState(); + $os1->name = array('1' => 'Partially paid by '.$this->displayName, + '2' => 'Payé partiellement via '.$this->displayName, + '3' => 'Pagado parcialmente con '.$this->displayName); + + $os1->invoice = false; + $os1->color = 'lightblue'; + $os1->logable = true; + + if ($os1->save()) + { + Configuration::updateValue($this->prefix.'ORDER_STATE_PART_ID', $os1->id); + copy(_PS_MODULE_DIR_.$this->name.'/logo.gif',_PS_IMG_DIR_.'os/'.$os1->id.'.gif'); + return true; + } + + return false; + } + + private function _deleteOrderState() + { + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_ID'))); + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state_lang` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_ID'))); + + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_PART_ID'))); + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state_lang` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_PART_ID'))); + + return true; + } + + public function getPaymentUrlBase() + { + return $this->payment_url[Configuration::get($this->prefix.'ENVIRONMENT')]; + } + + private function _getSupportedLanguageIsoById($id_lang) + { + $lang = Language::getIsoById((int)($id_lang)); + + return in_array($lang, $this->supported_languages) ? $lang : $this->default_language; + } + + private function _getRegisterLink($id_lang) + { + $lang = Language::getIsoById((int)($id_lang)); + return array_key_exists($lang, $this->register_url) ? $this->register_url[$lang] : $this->register_url[$this->default_language]; + } + + private function _getAllowedCurrencies() + { + if (empty($this->allowed_currencies)) + $this->allowed_currencies = DB::getInstance()->ExecuteS( + 'SELECT c.id_currency, c.iso_code, c.name, c.sign + FROM '._DB_PREFIX_.'currency c + WHERE c.deleted = 0 + AND iso_code IN (\''.implode('\',\'', $this->supported_currencies).'\')'); + + return $this->allowed_currencies; + } + + public function isCurrencyActive($currency_iso_code) + { + $mid = Configuration::get($this->prefix.'MERCHANT_ID_'.$currency_iso_code); + return ($mid && file_exists($this->certificat_dir.$mid.'.pem') && Configuration::get($this->prefix.'KEYRING_PW_'.$currency_iso_code)); + } + + public function createDisposition($cart) + { + global $cookie; + + $currency = new Currency((int)($cart->id_currency)); + $language = $this->_getSupportedLanguageIsoById((int)($cookie->id_lang)); + $mid = Configuration::get($this->prefix.'MERCHANT_ID_'.$currency->iso_code); + $mtid = $cart->id.'-'.time(); + $amount = number_format((float)($cart->getOrderTotal(true, Cart::BOTH)), 2, '.',''); + $currency_iso = $currency->iso_code; + $business_type = Configuration::get($this->prefix.'BUSINESS_TYPE'); + $reporting_criteria = ''; + + $hash = md5(Configuration::get($this->prefix.'SALT') + $amount + $currency_iso); + + $ok_url = Tools::getShopDomainSsl(true, true)._MODULE_DIR_.$this->name.'/payment.php?hash='.$hash; + $nok_url = Tools::getShopDomainSsl(true, true).'index.php?controller=order&step=3'; + + list($return_code, $error_code, $message) = PrepaidServicesAPI::createDisposition($this->getAPIConfiguration($currency_iso), $mid, $mtid, $amount, $currency_iso, $ok_url, $nok_url, $business_type, $reporting_criteria); + + if ($return_code == 0) + { + Disposition::deleteByCartId((int)($cart->id)); // Avoid duplicate disposition (canceled orders in CT for example) + Disposition::create((int)($cart->id), $mtid, $amount, $currency_iso); + $message = $this->getPaymentUrlBase().'?currency='.$currency->iso_code.'&mid='.$mid.'&mtid='.$mtid.'&amount='.$amount.'&language='.$language; + } + + return array('return_code' => $return_code, 'message' => $message); + } + + public function getDispositionState($id_cart) + { + $disposition = Disposition::getByCartId((int)($id_cart)); + + if (!array_key_exists('id_disposition', $disposition)) + die(Tools::displayError()); + + return PrepaidServicesAPI::getSerialNumbers($this->getAPIConfiguration($disposition['currency']), Configuration::get($this->prefix.'MERCHANT_ID_'.$disposition['currency']), $disposition['mtid'], $disposition['currency']); + } + + public function executeDebit($id_cart, $amount = NULL, $close_flag = 1) + { + $disposition = Disposition::getByCartId((int)($id_cart)); + if (!array_key_exists('id_disposition', $disposition)) + die(Tools::displayError()); + + if (!isset($amount) || $amount === '') + $amount = $disposition['amount']; + + $result = PrepaidServicesAPI::executeDebit($this->getAPIConfiguration($disposition['currency']), Configuration::get($this->prefix.'MERCHANT_ID_'.$disposition['currency']), $disposition['mtid'], number_format($amount, 2, '.', ''), $disposition['currency'], $close_flag); + + if ($result[0] == 0) + { + if ($amount == $disposition['amount'] || $close_flag) + Disposition::delete((int)($disposition['id_disposition'])); + else + Disposition::updateAmount((int)($disposition['id_disposition']), (float)($amount)); + } + + return $result; + } + + + public function getContent() + { + $out = '<h2>'.$this->displayName.'</h2>'; + $err_req = false; + + // check requirements + if (!extension_loaded('curl')) + { + $out .= $this->displayError($this->getL('curl_required')); + $err_req = true; + } + + + if (!is_writable($this->certificat_dir)) + { + $out .= $this->displayError($this->certificat_dir.' '.$this->getL('not_writable')); + $err_req = true; + } + + $id_currency = Currency::getIdByIsoCode($this->max_amount_currency); + if (empty($id_currency)) + { + $out .= $this->displayError($this->getL('currency_required').'['.$this->max_amount_currency.']'); + $err_req = true; + } + + if (!$err_req && Tools::isSubmit('submitCtConfiguration')) + { + $errors = $this->_validateForm(); + + if (empty($errors)) + $out .= $this->_postProcess(); + else + $out .= $errors; + } + + $out .= $this->_displayStyleAndJS(); + $out .= $this->_displayInfos(); + $out .= $this->_displayForm(); + + return $out; + } + + private function _displayStyleAndJS() + { + return '<script type="text/javascript" src="'._MODULE_DIR_.$this->name.'/prepaidservices.js" ></script> + <style> + .currencies_configuration { border: 2px solid #DFD5C3; border-collapse: collapse; } + .currencies_configuration td { width: 200px; padding: 20px; border: 2px solid #DFD5C3 } + .currency_label { font-weight: bold; } + .currencies_label { font-weight: bold; padding: 0px; } + #infos_cashticket { width: 420px; float: left} + </style>'; + } + + private function _displayForm() + { + $business_type_options = ''; + foreach ($this->business_types AS $key => $value) + $business_type_options .= '<option value="'.$key.'" '.(Configuration::get($this->prefix.'BUSINESS_TYPE') == $key ? 'selected' : '').'>'.$value.'</option>'; + + $currencies_configuration = '<p class="currencies_label">'.$this->getL('configure_currency').'</p> + <p>'.$this->getL('payment_not_displayed').'</p> + <table class="currencies_configuration">'; + + $environment_radio = ''; + foreach ($this->environments AS $key => $value) + $environment_radio .= '<input type="radio" id="ct_environment" name="ct_environment" value="'.Tools::htmlentitiesUTF8($key).'" '.(Configuration::get($this->prefix.'ENVIRONMENT') == $key ? 'checked' : '').'>'. $value. '<br />'; + + foreach ($this->_getAllowedCurrencies() AS $currency) + { + $currencies_configuration .= ' + <tr> + <td class="currency_label">'.$this->getL('configuration_in').' '.$currency['name'].' '.$currency['sign'].'</td> + <td> + <label>'.$this->getL('merchant_id').'</label> + <div class="margin-form"> + <input type="text" name="ct_merchant_id_'.$currency['iso_code'].'" value="'.Tools::htmlentitiesUTF8(Configuration::get($this->prefix.'MERCHANT_ID_'.$currency['iso_code'])).'"/> + </div> + <br /> + <label>'.$this->getL('keyring_certificate').'</label> + <div class="margin-form"> + <input type="file" name="ct_keyring_certificate_'.$currency['iso_code'].'" /> + </div> + <label>'.$this->getL('keyring_pw').'</label> + <div class="margin-form"> + <input type="text" name="ct_keyring_pw_'.$currency['iso_code'].'" value="'.Tools::htmlentitiesUTF8(Configuration::get($this->prefix.'KEYRING_PW_'.$currency['iso_code'])).'"/> + </div> + </td> + </tr>'; + } + $currencies_configuration .= '</table>'; + + return '<form enctype="multipart/form-data" action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset> + <legend><img src="../img/admin/cog.gif" alt="" />'.$this->getL('configuration').'</legend> + <label>'.$this->getL('environment').'</label> + <div class="margin-form"> + '.$environment_radio.' + </div> + <hr class="clear" /> + <label>'.$this->getL('business_type').'</label> + <div class="margin-form"> + <select id="ct_business_type" name="ct_business_type" onchange="toggleImediatPayment()"> + '.$business_type_options.' + </select> + </div> + <div id="imediat_payment"> + <label>'.$this->getL('immediat_payment').'</label> + <div class="margin-form"> + <input type="checkbox" name="ct_immediat_payment" value="1" '.(Configuration::get($this->prefix.'IMMEDIAT_PAYMENT') ? 'checked' : '').' /> + </div> + </div> + <hr class="clear" /> + '.$currencies_configuration.' + <br /> + <div> + <input type="submit" value="'.$this->getL('update_configuration').'" name="submitCtConfiguration" class="button" /> + </div> + </label> + </fieldset> + </form>'; + } + + private function _displayInfos() + { + global $cookie; + + return '<fieldset id="infos_cashticket"> + <legend><img src="'._MODULE_DIR_.$this->name.'/img/payment-small.png" alt="" />'.$this->displayName.'</legend> + <center><img src="'._MODULE_DIR_.$this->name.'/img/payment.png" alt="" class="logo" /></center> + '.$this->getL('introduction').' + <br /><br /> + <a style="color: blue; text-decoration: underline" href="'.$this->_getRegisterLink((int)$cookie->id_lang).'">'.$this->getL('register').'</a> + </fieldset> + <div class="clear" /><br />'; + } + + private function _validateForm() + { + $errors = ''; + + foreach ($this->_getAllowedCurrencies() AS $currency) + { + $mid = trim(Tools::getValue('ct_merchant_id_'.$currency['iso_code'])); + + if (preg_match('/^[0-9]{10}$/', $mid)) + { + $mid_certificat = $_FILES['ct_keyring_certificate_'.$currency['iso_code']]; + + if (!$mid_certificat || $mid_certificat['error'] == 4 || $mid_certificat['error'] == 3) + { + if (!file_exists($this->certificat_dir.$mid.'.pem')) + $errors .= $this->displayError($this->getL('certificate_required').' ['.$currency['iso_code'].']'); + } + else + { + if ($mid_certificat['error']) + { + switch ($mid_certificat['error']) + { + case 3: // UPLOAD_ERR_PARTIAL + $errors .= $this->displayError($this->getL('file_partialy_uploaded')); + break; + + case 4: // UPLOAD_ERR_NO_FILE + $errors .= $this->displayError($this->getL('file_empty')); + break; + } + } + + if (substr($mid_certificat['name'], -4) != '.pem') + $errors .= $this->displayError($this->getL('invalid_file').' ['.$currency['iso_code'].']'); + } + } + elseif (!empty($mid)) + { + $errors .= $this->displayError($this->getL('invalid_merchant_id').' ['.$currency['iso_code'].']'); + } + } + + if (!array_key_exists(Tools::getValue('ct_business_type'), $this->business_types)) + $errors .= $this->getL('invalid_business_type'); + + if (!array_key_exists(Tools::getValue('ct_environment'), $this->environments)) + $errors .= $this->getL('invalid_environment'); + + return $errors; + } + + private function _acceptPayment($order, $disposition, $currency_sign, $amount = NULL) + { + $isCorrect = true; + if (!$disposition) + die(Tools::displayError()); + + if (!isset($amount) || $amount === '') + $amount = $disposition['amount']; + + $amount = number_format($amount, 2, '.', ''); + $close_flag = (int)($amount == $disposition['amount']); + + list($resultcode, $errorcode, $errormessage) = $this->executeDebit($disposition['id_cart'], $amount, $close_flag); + + $param = ''; + if ($resultcode != 0) + { + $message = $this->getL('payment_error').' '.$errormessage; + $isCorrect = false; + } + else + $message = $this->getL('payment_accepted') .'('.$amount.' '.$currency_sign.') '.($close_flag ? $this->getL('disposition_consumed') : '') ; + + $msg = new Message(); + $msg->message = $message; + $msg->id_order = (int)($order->id); + $msg->private = 1; + $msg->add(); + + if ($isCorrect) + { + if ($order->total_paid == $order->total_paid_real) + $order->total_paid_real = $amount; + else + $order->total_paid_real += $amount; + + $os = _PS_OS_PAYMENT_; + if ($order->total_paid != $order->total_paid_real) + $os = Configuration::get($this->prefix.'ORDER_STATE_PART_ID'); + + $history = new OrderHistory(); + $history->id_order = (int)($order->id); + $history->changeIdOrderState($os, (int)($order->id)); + $history->save(); + + $order->save(); + } + + return $isCorrect; + } + + public function _releasePayment($order, $disposition) + { + if (!$disposition) + die(Tools::displayError()); + + list($resultcode, $errorcode, $errormessage) = $this->executeDebit($disposition['id_cart'], 0, 1); + + $param = ''; + if ($resultcode != 0) + { + $message = $this->getL('release_error').' '.$errormessage; + $isCorrect = false; + } + else + $message = $this->getL('payment_released'); + + $msg = new Message(); + $msg->message = $message; + $msg->id_order = (int)($order->id); + $msg->private = 1; + $msg->add(); + + return $errorcode; + } + + private function _postProcess() + { + Configuration::updateValue($this->prefix.'BUSINESS_TYPE', Tools::getValue('ct_business_type')); + Configuration::updateValue($this->prefix.'ENVIRONMENT', Tools::getValue('ct_environment')); + + $immediat_payment = Tools::getValue('ct_immediat_payment'); + if (Configuration::get($this->prefix.'BUSINESS_TYPE') == 'I') + $immediat_payment = 1; + + Configuration::updateValue($this->prefix.'IMMEDIAT_PAYMENT', $immediat_payment); + + $params = ''; + $dataSync = ''; + $delim = '?'; + $key = 1; + foreach ($this->_getAllowedCurrencies() AS $currency) + { + $mid = trim(Tools::getValue('ct_merchant_id_'.$currency['iso_code'])); + + Configuration::updateValue($this->prefix.'MERCHANT_ID_'.$currency['iso_code'], $mid); + Configuration::updateValue($this->prefix.'KEYRING_PW_'.$currency['iso_code'], Tools::getValue('ct_keyring_pw_'.$currency['iso_code'])); + + if (isset($_FILES['ct_keyring_certificate_'.$currency['iso_code']])) + move_uploaded_file($_FILES['ct_keyring_certificate_'.$currency['iso_code']]['tmp_name'], $this->certificat_dir.$mid.'.pem'); + + if ($mid) + { + $params .= $delim.'mid'.$key.'='.urlencode($mid).'&currency'.$key.'='.urlencode($currency['iso_code']); + $delim = '&'; + $key++; + } + } + + if (!empty($params)) + $dataSync = '<img src="http://www.prestashop.com/modules/'.$this->name.'.png'.$params.'" style="float:right" />'; + + return $this->displayConfirmation($this->getL('settings_updated').$dataSync); + } + + public function hookPayment($params) + { + global $smarty; + + // check currency + $currency = new Currency((int)($params['cart']->id_currency)); + + if (!$this->isCurrencyActive($currency->iso_code)) + return false; + + // check max amount + $amount = (float)($params['cart']->getOrderTotal(true, Cart::BOTH)); + $id_currency_max = Currency::getIdByIsoCode($this->max_amount_currency); + + if ($currency->id != $id_currency_max) + { + $amount = $amount / $currency->conversion_rate; + $amount = Tools::convertPrice($amount, new Currency((int)($id_currency_max))); + } + + if ($amount > $this->max_amount) + return false; + + $smarty->assign(array('pic_url' => _MODULE_DIR_.'/'.$this->name.'/img/payment-logo.png', + 'payment_name' => $this->displayName, + 'module_name' => $this->name)); + + return $this->display(__FILE__, 'payment.tpl'); + } + + + public function hookPaymentReturn($params) + { + global $smarty, $cookie; + + if ($params['objOrder']->module != $this->name) + return; + + $smarty->assign('payment_name', $this->displayName); + return $this->display(__FILE__, $this->name.'-confirmation.tpl'); + } + + + public function hookAdminOrder($params) + { + global $smarty, $cookie; + $error = 0; + $order = new Order((int)($params['id_order'])); + + if (!Validate::isLoadedObject($order)) + die(Tools::displayError()); + + if ($order->module != $this->name) + return false; + + $disposition = Disposition::getByCartId((int)($order->id_cart)); + if (!$disposition) // No disposition = Order paid + return false; + + // check disposition state + $res = PrepaidServicesAPI::getSerialNumbers($this->getAPIConfiguration($disposition['currency']), Configuration::get($this->prefix.'MERCHANT_ID_'.$disposition['currency']), $disposition['mtid'], $disposition['currency']); + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + + // if the disposition is not "active" + if ($res[5] != PrepaidServicesAPI::DISPOSITION_DISPOSED && $res[5] != PrepaidServicesAPI::DISPOSITION_DEBITED) + { + $smarty->assign(array('disposition_state' => $res[5], 'payment_name' => $order->payment)); + return $this->display($this->module_dir.'/'.$this->name, 'disposition-error.tpl'); + } + + if (Tools::isSubmit('acceptPayment')) + { + $amount = Tools::getValue('ps_amount'); + if (isset($amount) && !empty($amount) && $amount <= $res[3] && $amount > 0) + { + if (!$this->_acceptPayment($order, $disposition, $currency->getSign('right'), $amount)) + $error = 1; + } + else + $error = 2; + + $query_string = $error ? self::changeQueryStringParameter($_SERVER['QUERY_STRING'], 'pp_error', (int)($error)) : self::removeQueryStringParameter($_SERVER['QUERY_STRING'], 'pp_error'); + Tools::redirectAdmin(Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$query_string); + } + elseif (Tools::isSubmit('releasePayment')) + { + if (!$this->_releasePayment($order, $disposition)) + $error = 1; + + $query_string = $error ? self::changeQueryStringParameter($_SERVER['QUERY_STRING'], 'pp_error', (int)($error)) : $_SERVER['QUERY_STRING']; + Tools::redirectAdmin(Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$query_string); + } + + $error_msg = ''; + if (Tools::getIsset('pp_error')) + $error_msg = $this->_getErrorMsgFromErrorCode(Tools::getValue('pp_error')); + + $smarty->assign(array('action' => Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$_SERVER['QUERY_STRING'], + 'payment_name' => $order->payment, + 'error' => $error_msg, + 'currency' => $currency->getSign('right'), + 'amount' => $res[3] + )); + + return $this->display($this->module_dir.'/'.$this->name, $this->name.'-accept-payment.tpl'); + } + + public function getAPIConfiguration($iso_currency) + { + return array('keyring_file' => $this->certificat_dir.Configuration::get($this->prefix.'MERCHANT_ID_'.strtoupper($iso_currency)).'.pem', + 'keyring_pw' => Configuration::get($this->prefix.'KEYRING_PW_'.strtoupper($iso_currency)), + 'keyring_prepaid' => $this->certificat_dir.'paysafecard-CA.pem', + 'env' => Configuration::get($this->prefix.'ENVIRONMENT')); + } + + public static function changeQueryStringParameter($query_string, $param, $value) + { + parse_str($query_string, $output); + $output[$param] = $value; + return http_build_query($output); + } + + public static function removeQueryStringParameter($query_string, $param) + { + parse_str($query_string, $output); + unset($output[$param]); + return http_build_query($output); + } + +} + diff --git a/modules/cashticket/PrepaidServicesAPI.php b/modules/cashticket/PrepaidServicesAPI.php new file mode 100644 index 000000000..8c697732b --- /dev/null +++ b/modules/cashticket/PrepaidServicesAPI.php @@ -0,0 +1,202 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PrepaidServicesAPI +{ + const DISPOSITION_CREATED = 'R'; + const DISPOSITION_DISPOSED = 'S'; + const DISPOSITION_DEBITED = 'E'; + const DISPOSITION_CONSUMED = 'O'; + const DISPOSITION_CANCELLED = 'L'; + const DISPOSITION_INVALID = 'I'; + const DISPOSITION_EXPIRED = 'X'; + + // Test & Production environment (shared between CT & PSC) + private static $base_url = array('T' => array('create_disposition_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/CreateDispositionServlet', + 'get_disposition_state_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/GetDispositionStateServlet', + 'execute_debit_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/DebitServlet', + 'get_serial_number_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/GetSerialNumbersServlet' + ), + 'P' => array('create_disposition_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/CreateDispositionServlet', + 'get_disposition_state_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/GetDispositionStateServlet', + 'execute_debit_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/DebitServlet', + 'get_serial_number_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/GetSerialNumbersServlet' + )); + + public static function getBaseUrl($key, $env) + { + $base_url = self::$base_url[$env]; + + if (array_key_exists($key, $base_url)) + return $base_url[$key]; + + return ''; + } + + public static function createDisposition($configuration, $mid, $mtid, $amount, $currency, $okurl, $nokurl, $businesstype, $reportingcriteria) + { + $language = 'en'; + $params = 'currency='.$currency.'&mid='.$mid.'&mtid='.$mtid.'&amount='.$amount.'&businesstype='.$businesstype. + '&reportingcriteria='.$reportingcriteria.'&okurl='.$okurl.'&nokurl='.$nokurl.'&language='.$language; + + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('create_disposition_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + + if ($rc == 0) + { + $data_array = explode("\n", $data,7); + $resultcode = trim($data_array[0]); + $errorcode = trim($data_array[1]); + $errormessage = trim($data_array[2]); + + return array($resultcode, $errorcode, $errormessage); + } + else + { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array($resultcode,$errorcode,$errormessage); + } + } + + public static function getDispositionState($configuration, $mid, $mtid, $currency_iso_code) + { + $language = 'en'; + $params = 'mid='.$mid.'&mtid='.$mtid.'&language='.$language; + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('get_disposition_state_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + + if ($rc == 0) + { + $dataarray = explode("\n", $data,7); + $resultcode = trim($dataarray[0]); + $errorcode = trim($dataarray[1]); + $errormessage = trim($dataarray[2]); + $amount = trim($dataarray[3]); + $currency = trim($dataarray[4]); + $state = trim($dataarray[5]); + + return array($resultcode, $errorcode, $errormessage, $amount, $currency, $state); + } + else + { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array($resultcode, $errorcode, $errormessage); + } + } + + public static function getSerialNumbers($configuration, $mid, $mtid, $currency_iso_code) + { + $language = 'en'; + $params = 'mid='.$mid.'&mtid='.$mtid.'&language='.$language; + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('get_serial_number_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + if ($rc == 0) + { + /* read and return data from paysafecard server */ + $dataarray = explode("\n", $data,7); + $resultcode = trim($dataarray[0]); + $errorcode = trim($dataarray[1]); + $errormessage = trim($dataarray[2]); + $amount = trim($dataarray[3]); + $currency = trim($dataarray[4]); + $state = trim($dataarray[5]); + $snamount = trim($dataarray[6]); + return array ($resultcode, $errorcode, $errormessage, $amount, $currency, $state, $snamount); + } + else + { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array ($resultcode, $errorcode, $errormessage); + } + } + + public static function executeDebit($configuration, $mid, $mtid, $amount, $currency, $close_flag = 1) + { + $language = 'en'; + $params = 'currency='.$currency.'&mid='.$mid.'&mtid='.$mtid.'&amount='.$amount.'&close='.$close_flag.'&language='.$language; + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('execute_debit_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + + if ($rc == 0) + { + $dataarray=explode("\n", $data,7); + $resultcode=trim($dataarray[0]); + $errorcode=trim($dataarray[1]); + $errormessage=trim($dataarray[2]); + + return array ($resultcode, $errorcode, $errormessage); + } + else + { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array ($resultcode, $errorcode, $errormessage); + } + } + + private static function _doHttpRequest($url, $urlparam, $keyringfile, $keyringpw, $cakeyringfile) + { + /* some prerquisites for the connection */ + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + curl_setopt($ch, CURLOPT_SSLCERT, $keyringfile); // filename of PEM formatted certificate + curl_setopt($ch, CURLOPT_SSLCERTTYPE, "PEM"); // format of certificate, "PEM" or "DER" + curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $keyringpw); // password required to use the CURLOPT_SSLCERT certificate + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // verify the peer's certificate + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // verify the Common name from the peer certificate + curl_setopt($ch, CURLOPT_CAINFO, $cakeyringfile); // file holding one or more certificates to verify the peer with + + $data = curl_exec($ch); + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + /* bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative + * value in case of successful termination) */ + if ($errno < 0) $errno = 0; + + curl_close($ch); + + return array ($errno,$errmsg,$data); + } +} + + diff --git a/modules/cashticket/cashticket-accept-payment.tpl b/modules/cashticket/cashticket-accept-payment.tpl new file mode 100644 index 000000000..3be84d258 --- /dev/null +++ b/modules/cashticket/cashticket-accept-payment.tpl @@ -0,0 +1,43 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<br /> +<fieldset style="width: 400px"> + <legend><img src="../img/admin/tab-customers.gif" />{$payment_name}</legend> + {if $error} + <span style="color: red; font-weight: bold;">{$error}</span> + {/if} + + <p style="font-weight: bold;">{l s='Payment has not been accepted yet:' mod='cashticket'}</p> + <p> + <form action="{$action}" method="POST"> + <input type="text" name="ps_amount" size="8" value="{$amount}" />{$currency} + <input type="submit" class="button" name="acceptPayment" value="{l s='Accept Payment' mod='cashticket'}" /> + <input type="submit" class="button" name="releasePayment" value="{l s='Release amount' mod='cashticket'}" /> + </form> + </p> +</fieldset> + diff --git a/modules/cashticket/cashticket-confirmation.tpl b/modules/cashticket/cashticket-confirmation.tpl new file mode 100644 index 000000000..bd8968ff1 --- /dev/null +++ b/modules/cashticket/cashticket-confirmation.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p>{l s='Your order on' mod='cashticket'} <span class="bold">{$shop_name}</span> {l s='is complete.' mod='cashticket'} + <br /><br /> + {l s='You have chosen the' mod='cashticket'} {$payment_name} {l s='method.' mod='cashticket'} + <br /><br /><span class="bold">{l s='Your order will be sent very soon.' mod='cashticket'}</span> + <br /><br />{l s='For any questions or for further information, please contact our' mod='cashticket'} <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='cashticket'}</a>. +</p> diff --git a/modules/cashticket/cashticket.php b/modules/cashticket/cashticket.php new file mode 100644 index 000000000..5fc6e9cc2 --- /dev/null +++ b/modules/cashticket/cashticket.php @@ -0,0 +1,119 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +if (!in_array('PrepaidServices', get_declared_classes())) include_once(_PS_MODULE_DIR_.'cashticket/PrepaidServices.php'); + +class CashTicket extends PrepaidServices +{ + public $prefix = 'PS_CT_'; + protected $supported_languages = array('de', 'en', 'gr', 'el', 'es', 'it', 'fr', 'nl', 'pl', 'pt', 'si', 'sk', 'tr'); + protected $allowed_currencies = array(); + + protected $environments = array('P' => 'Production', + 'T' => 'Test'); + + protected $business_types = array('I' => 'Intangible', + 'T' => 'Tangible'); + + protected $payment_url = array('T' => 'https://customer.test.at.cash-ticket.com/ctcustomer/GetCustomerPanelServlet', + 'P' => 'https://customer.cc.at.cash-ticket.com/ctcustomer/GetCustomerPanelServlet'); + + protected $supported_currencies = array('CHF', 'DKK', 'SEK', 'PLN', 'GBP', 'EUR', 'USD', 'CZK'); + + protected $certificat_dir; + + protected $register_url = array('en' => 'http://www.prestashop.com/partner/url.php?to=http://www.cash-ticket.com/uk', + 'fr' => 'http://www.prestashop.com/partner/url.php?to=http://www.cash-ticket.com/fr', + 'es' => 'http://www.prestashop.com/partner/url.php?to=http://www.cash-ticket.com/es'); + + public function __construct() + { + $this->name = 'cashticket'; + $this->tab = 'payments_gateways'; + $this->version = 1.2; + $this->module_dir = dirname(__FILE__); + $this->certificat_dir = dirname(__FILE__).'/keyring/'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('CashTicket'); + $this->description = $this->l('Accepts payments by CashTicket'); + } + + + public function getL($key) + { + $translations = array( + 'disposition_created' => $this->l('Disposition created. Waiting for debit.'), + 'disposition_invalid' => $this->l('Invalid disposition state:'), + 'payment_error' => $this->l('An error has occurred during payment:'), + 'payment_accepted' => $this->l('Payment accepted.'), + 'curl_required' => $this->l('This module requires the curl PHP extension to function properly.'), + 'not_writable' => $this->l('is not writable!'), + 'currency_required' => $this->l('This module requires the currency: '), + 'configure_currency' => $this->l('Configure each currency individually:'), + 'payment_not_displayed' => $this->l('(The payment module won\'t be displayed for customers using non configured currency.)'), + 'configuration_in' => $this->l('Configuration in '), + 'merchant_id' => $this->l('Merchant ID'), + 'keyring_certificate' => $this->l('Keyring Certificate'), + 'keyring_pw' => $this->l('Keyring PW'), + 'configuration' => $this->l('Configuration'), + 'environment' => $this->l('Environment'), + 'business_type' => $this->l('Business Type'), + 'immediat_payment' => $this->l('Immediate Payment'), + 'update_configuration' => $this->l('Update configuration'), + 'certificate_required' => $this->l('You must provide a certificate for MERCHANT ID'), + 'invalid_file' => $this->l('Invalid file'), + 'invalid_merchant_id' => $this->l('Invalid Merchant ID'), + 'invalid_business_type' => $this->displayError('Invalid business type'), + 'invalid_environment' => $this->displayError('Invalid environment'), + 'settings_updated' => $this->l('Settings updated'), + 'file_partialy_uploaded' => $this->l('The file was partially uploaded'), + 'file_empty' => $this->l('The file is empty'), + 'cant_create_dispo' => $this->l('Transaction could not be initiated due to connection problems. If the problem persists, please contact our support.'), + 'disposition_consumed' => $this->l('Disposition consumed'), + 'payment_released' => $this->l('Disposition released'), + 'release_error' => $this->l('An error has occurred during the release.'), + 'introduction' => $this->l('Accept prepaid payments in your webshop. All that is required is the Cash-Ticket’s 16 digit pin code. This way, consumers can make online payments without a credit card or a bank account.'), + 'register' => $this->l('Learn more') + ); + + return $translations[$key]; + } + + protected function _getErrorMsgFromErrorCode($error_code) + { + $error_msg = array(1 => $this->l('An error has occurred, check Messages for more info.'), + 2 => $this->l('Invalid amount')); + + return $error_msg[$error_code]; + } +} + diff --git a/modules/cashticket/config.xml b/modules/cashticket/config.xml new file mode 100755 index 000000000..6c3c20538 --- /dev/null +++ b/modules/cashticket/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>cashticket</name> + <displayName><![CDATA[CashTicket]]></displayName> + <version><![CDATA[1.2]]></version> + <description><![CDATA[Accepts payments by CashTicket]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/cashticket/de.php b/modules/cashticket/de.php new file mode 100644 index 000000000..f20fa8cad --- /dev/null +++ b/modules/cashticket/de.php @@ -0,0 +1,53 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'Die Zahlung wurde noch nicht akzeptiert:'; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Zahlung akzeptieren '; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Zu zahlender Betrag'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Sie haben die '; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = 'Methode gewählt.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Ihre Bestellung wird sehr bald geschickt werden.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unser'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{cashticket}prestashop>disposition-error_393988def796f78c4b673b90548f3afa'] = 'Der Dispositionsstauts ist ungültig'; +$_MODULE['<{cashticket}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = '. Sie sind nicht berechtigt, die Zahlung durchzuführen.'; +$_MODULE['<{cashticket}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Bezahlen Sie mit'; +$_MODULE['<{cashticket}prestashop>cashticket_4512bbd48918c03027387a6c8e911342'] = 'CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_21d3d890383dc93343ce57c221ce5b3d'] = 'Akzeptiert Zahlungen per CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposition erstellt. Wartet auf Abbuchung.'; +$_MODULE['<{cashticket}prestashop>cashticket_894f0316a71ef67255369c82bf8a0e5b'] = 'Ungültiger Dispositionsstatus:'; +$_MODULE['<{cashticket}prestashop>cashticket_c1c25198721552ea8ddd963c7278d4ab'] = 'Ein Fehler ist bei der Zahlung aufgetreten:'; +$_MODULE['<{cashticket}prestashop>cashticket_36ec50c0e914dd2fb48a1b27540512ce'] = 'Zahlung akzeptiert.'; +$_MODULE['<{cashticket}prestashop>cashticket_d6ca44369efe062cec0c09f392465f55'] = 'Dieses Modul erfordert die Locke PHP-Erweiterung, um ordnungsgemäß zu funktionieren.'; +$_MODULE['<{cashticket}prestashop>cashticket_fe9da2c5e2e153d2415b4cd5d91166a4'] = 'ist nicht beschreibbar!'; +$_MODULE['<{cashticket}prestashop>cashticket_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Dieses Modul erfordert die Währung:'; +$_MODULE['<{cashticket}prestashop>cashticket_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Konfigurieren Sie jede Währung einzeln:'; +$_MODULE['<{cashticket}prestashop>cashticket_69a530f77bb82f704b9ff5e18bbdea6f'] = '(Dias Zahlungsmodul wird Kunden, die eine nicht konfigurierte Währung nutzen, nicht angezeigt.)'; +$_MODULE['<{cashticket}prestashop>cashticket_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Konfiguration im'; +$_MODULE['<{cashticket}prestashop>cashticket_229a7ec501323b94db7ff3157a7623c9'] = 'Händler-ID'; +$_MODULE['<{cashticket}prestashop>cashticket_845314022daaa8b665e718c4b51738aa'] = 'Keyring-Zertifikat'; +$_MODULE['<{cashticket}prestashop>cashticket_a01813de717585e9ac9458bbfc54485a'] = 'ing-PW'; +$_MODULE['<{cashticket}prestashop>cashticket_254f642527b45bc260048e30704edb39'] = 'Konfiguration'; +$_MODULE['<{cashticket}prestashop>cashticket_0ba29c6a1afacf586b03a26162c72274'] = 'Umgebung'; +$_MODULE['<{cashticket}prestashop>cashticket_1d5ad3d37f236c9eebda547690373bba'] = 'Geschäftsart'; +$_MODULE['<{cashticket}prestashop>cashticket_b024248d9fecf8c34f629e89a9fb93b4'] = 'Sofortige Zahlung'; +$_MODULE['<{cashticket}prestashop>cashticket_c80a51a60c5ee43553c3881459b8f431'] = 'Konfiguration aktualisieren'; +$_MODULE['<{cashticket}prestashop>cashticket_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Sie müssen ein Zertifikat für die HÄNDLER-ID vorweisen'; +$_MODULE['<{cashticket}prestashop>cashticket_bbced877c13c763f0141ff906c8ed0e5'] = 'Ungültige Datei'; +$_MODULE['<{cashticket}prestashop>cashticket_97e5793f511c7930ab295997cb28553a'] = 'Ungültige Verkäufer-ID'; +$_MODULE['<{cashticket}prestashop>cashticket_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{cashticket}prestashop>cashticket_a98658e7f6aa80803873db3a3e982f4d'] = 'Die Datei wurde teilweise hochgeladen'; +$_MODULE['<{cashticket}prestashop>cashticket_d2bbf245e9591814fe994df3cae95964'] = 'Die Datei ist leer'; +$_MODULE['<{cashticket}prestashop>cashticket_ebbe99d835c79ead89db1b2b9e4fe70f'] = 'Transaktion konnte nicht initiiert werden aufgrund von Problemen mit der Verbindung. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an unseren Support.'; +$_MODULE['<{cashticket}prestashop>cashticket_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposition verbraucht'; +$_MODULE['<{cashticket}prestashop>cashticket_c3e260f43a99b6fd907538953fe700d0'] = 'Disposition freigegeben'; +$_MODULE['<{cashticket}prestashop>cashticket_12879ec2c367483dd59ef7442178d124'] = 'Ein Fehler ist aufgetreten während der Freigabe'; +$_MODULE['<{cashticket}prestashop>cashticket_d929c5e5e5643c622400e837914206da'] = 'Akzeptieren Sie Prepaid-Zahlungen in Ihrem Webshop. Alles, was man benötigt, um in einem Web-Shop zu bezahlen, ist der 16-stellige PIN-Code von Cash-Ticket . Auf diese Weise können die Verbraucher Online-Zahlungen ohne Kreditkarte oder Bankkonto vornehmen.'; +$_MODULE['<{cashticket}prestashop>cashticket_d59048f21fd887ad520398ce677be586'] = 'Erfahren Sie mehr'; +$_MODULE['<{cashticket}prestashop>cashticket_930320ced1b8c376237844049b570a7f'] = 'Ein Fehler ist aufgetreten, überprüfen Sie die Nachrichten für mehr Infos'; +$_MODULE['<{cashticket}prestashop>cashticket_a9ced76f2dd6907220fa95b3a136b04a'] = 'Ungültiger Betrag'; + +?> \ No newline at end of file diff --git a/modules/cashticket/disposition-error.tpl b/modules/cashticket/disposition-error.tpl new file mode 100644 index 000000000..30cee1dce --- /dev/null +++ b/modules/cashticket/disposition-error.tpl @@ -0,0 +1,37 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<br /> +<fieldset style="width: 400px"> + <legend><img src="../img/admin/tab-customers.gif" />{$payment_name}</legend> + + <p style="color: red; font-weight: bold;"> + {l s='The disposition state is invalid' mod='cahsticket'} ({$disposition_state}) + {l s='. You are not allowed to perform the payment.' mod='cashticket'} + + </p> +</fieldset> + diff --git a/modules/cashticket/es.php b/modules/cashticket/es.php new file mode 100755 index 000000000..e3f653868 --- /dev/null +++ b/modules/cashticket/es.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'El pago aún no ha sido aceptado'; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Aceptar el pago'; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Rechazar el pago'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido en'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ha sido registrado.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Ha elegido pagar con'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = 'modo'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Le enviaremos su pedido rápidamente'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier pregunta, póngase en contacto con '; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'el servicio clientela'; +$_MODULE['<{cashticket}prestashop>cashticket_4512bbd48918c03027387a6c8e911342'] = 'CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_21d3d890383dc93343ce57c221ce5b3d'] = 'Aceptar los pagos a través de CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposición creada. En espera del débito'; +$_MODULE['<{cashticket}prestashop>cashticket_894f0316a71ef67255369c82bf8a0e5b'] = 'El estado de la disposición no es válido:'; +$_MODULE['<{cashticket}prestashop>cashticket_c1c25198721552ea8ddd963c7278d4ab'] = 'Se ha producido un error durante el pago:'; +$_MODULE['<{cashticket}prestashop>cashticket_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pago aceptado.'; +$_MODULE['<{cashticket}prestashop>cashticket_d6ca44369efe062cec0c09f392465f55'] = 'Este módulo requiere la librería PHP cURL para funcionar correctamente.'; +$_MODULE['<{cashticket}prestashop>cashticket_fe9da2c5e2e153d2415b4cd5d91166a4'] = 'No tiene derechos de escritura.'; +$_MODULE['<{cashticket}prestashop>cashticket_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Para funcionar correctamente, este módulo necesita la divisa:'; +$_MODULE['<{cashticket}prestashop>cashticket_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Configurar cada divisa independientemente:'; +$_MODULE['<{cashticket}prestashop>cashticket_69a530f77bb82f704b9ff5e18bbdea6f'] = '(El módulo de pago no se mostrará a los clientes que utilicen una divisa no configurada'; +$_MODULE['<{cashticket}prestashop>cashticket_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Configuración en'; +$_MODULE['<{cashticket}prestashop>cashticket_229a7ec501323b94db7ff3157a7623c9'] = 'ID vendedor'; +$_MODULE['<{cashticket}prestashop>cashticket_845314022daaa8b665e718c4b51738aa'] = 'Certificado Keyring'; +$_MODULE['<{cashticket}prestashop>cashticket_a01813de717585e9ac9458bbfc54485a'] = 'Keyring PW'; +$_MODULE['<{cashticket}prestashop>cashticket_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{cashticket}prestashop>cashticket_0ba29c6a1afacf586b03a26162c72274'] = 'Entorno'; +$_MODULE['<{cashticket}prestashop>cashticket_1d5ad3d37f236c9eebda547690373bba'] = 'Tipo de negocio'; +$_MODULE['<{cashticket}prestashop>cashticket_b024248d9fecf8c34f629e89a9fb93b4'] = 'Pago inmediato'; +$_MODULE['<{cashticket}prestashop>cashticket_c80a51a60c5ee43553c3881459b8f431'] = 'Actualizar la configuración'; +$_MODULE['<{cashticket}prestashop>cashticket_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Debe disponer de un certificado para el ID vendedor'; +$_MODULE['<{cashticket}prestashop>cashticket_bbced877c13c763f0141ff906c8ed0e5'] = 'Archivo no válido'; +$_MODULE['<{cashticket}prestashop>cashticket_97e5793f511c7930ab295997cb28553a'] = 'ID vendedor no válida'; +$_MODULE['<{cashticket}prestashop>cashticket_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{cashticket}prestashop>cashticket_a98658e7f6aa80803873db3a3e982f4d'] = 'El archivo no se ha descargado correctamente'; +$_MODULE['<{cashticket}prestashop>cashticket_d2bbf245e9591814fe994df3cae95964'] = 'El archivo está vacío'; +$_MODULE['<{cashticket}prestashop>cashticket_ebbe99d835c79ead89db1b2b9e4fe70f'] = 'La transacción no ha podido inicializarse debido a problemas de conexión. Si el problema persiste, contáctenos.'; +$_MODULE['<{cashticket}prestashop>cashticket_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposición consumida'; +$_MODULE['<{cashticket}prestashop>cashticket_c3e260f43a99b6fd907538953fe700d0'] = 'Disposición abandonada'; +$_MODULE['<{cashticket}prestashop>cashticket_12879ec2c367483dd59ef7442178d124'] = 'Se ha producido un error en el momento de abandonar.'; +$_MODULE['<{cashticket}prestashop>cashticket_d929c5e5e5643c622400e837914206da'] = 'Acepte los pagos con prepago en su tienda en línea. Cash-Ticket es un método de pago seguro y sencillo para Internet. Cash-Ticket permite pagos sin tarjeta de crédito ni datos bancarios personales. Lo único que se necesita para pagar en una tienda en línea es un código PIN de 16 cifras. Así, los consumidores pueden realizar pagos en línea sin tarjeta de crédito ni cuenta bancaria. '; +$_MODULE['<{cashticket}prestashop>cashticket_d59048f21fd887ad520398ce677be586'] = 'Más información'; +$_MODULE['<{cashticket}prestashop>cashticket_930320ced1b8c376237844049b570a7f'] = 'Se ha producido un error. Consulte el apartado \"Mensajes\" para más información'; +$_MODULE['<{cashticket}prestashop>cashticket_a9ced76f2dd6907220fa95b3a136b04a'] = 'Importe incorrecto'; +$_MODULE['<{cashticket}prestashop>disposition-error_393988def796f78c4b673b90548f3afa'] = 'La disposición se encuentra en un estado no válido'; +$_MODULE['<{cashticket}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = 'No tiene autorización para recuperar el pago.'; +$_MODULE['<{cashticket}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Pagar con'; diff --git a/modules/cashticket/fr.php b/modules/cashticket/fr.php new file mode 100755 index 000000000..c3641498c --- /dev/null +++ b/modules/cashticket/fr.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'Le paiement n\'a pas encore été accepté : '; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Accepter le paiement'; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Relacher le paiement'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur '; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'a bien été enregistrée.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Vous avez choisi de payer avec '; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = ' '; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande va être expediée rapidement.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toutes questions ou informations complémentaires, contactez notre'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'service client'; +$_MODULE['<{cashticket}prestashop>cashticket_4512bbd48918c03027387a6c8e911342'] = 'CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_21d3d890383dc93343ce57c221ce5b3d'] = 'Accepter les paiements via CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposition crée. En attente du débit.'; +$_MODULE['<{cashticket}prestashop>cashticket_894f0316a71ef67255369c82bf8a0e5b'] = 'L\'état de la disposition est invalide :'; +$_MODULE['<{cashticket}prestashop>cashticket_c1c25198721552ea8ddd963c7278d4ab'] = 'Une erreur est survenue pendant le paiement :'; +$_MODULE['<{cashticket}prestashop>cashticket_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{cashticket}prestashop>cashticket_d6ca44369efe062cec0c09f392465f55'] = 'Ce module requiert la librairie PHP cURL pour fonctionner correctement.'; +$_MODULE['<{cashticket}prestashop>cashticket_fe9da2c5e2e153d2415b4cd5d91166a4'] = 'n\'a pas les droits en écriture.'; +$_MODULE['<{cashticket}prestashop>cashticket_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Ce module pour fonctionner correctement requiert la devise :'; +$_MODULE['<{cashticket}prestashop>cashticket_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Configurer chaque devise indépendament :'; +$_MODULE['<{cashticket}prestashop>cashticket_69a530f77bb82f704b9ff5e18bbdea6f'] = '(Le module de paiement ne sera pas affiché pour les clients qui utilisent une devise non configurée)'; +$_MODULE['<{cashticket}prestashop>cashticket_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Configuration en'; +$_MODULE['<{cashticket}prestashop>cashticket_229a7ec501323b94db7ff3157a7623c9'] = 'ID Marchand'; +$_MODULE['<{cashticket}prestashop>cashticket_845314022daaa8b665e718c4b51738aa'] = 'Keyring Certificat'; +$_MODULE['<{cashticket}prestashop>cashticket_a01813de717585e9ac9458bbfc54485a'] = 'Keyring PW'; +$_MODULE['<{cashticket}prestashop>cashticket_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{cashticket}prestashop>cashticket_0ba29c6a1afacf586b03a26162c72274'] = 'Environement'; +$_MODULE['<{cashticket}prestashop>cashticket_1d5ad3d37f236c9eebda547690373bba'] = 'Business Type'; +$_MODULE['<{cashticket}prestashop>cashticket_b024248d9fecf8c34f629e89a9fb93b4'] = 'Paiement immédiat'; +$_MODULE['<{cashticket}prestashop>cashticket_c80a51a60c5ee43553c3881459b8f431'] = 'Mettre à jour la configuration'; +$_MODULE['<{cashticket}prestashop>cashticket_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Vous devez fournir un certificat pour l\'ID marchand'; +$_MODULE['<{cashticket}prestashop>cashticket_bbced877c13c763f0141ff906c8ed0e5'] = 'Fichier invalide'; +$_MODULE['<{cashticket}prestashop>cashticket_97e5793f511c7930ab295997cb28553a'] = 'ID marchand invalide'; +$_MODULE['<{cashticket}prestashop>cashticket_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{cashticket}prestashop>cashticket_a98658e7f6aa80803873db3a3e982f4d'] = 'Le fichier n\'a pas été téléchargé correctement'; +$_MODULE['<{cashticket}prestashop>cashticket_d2bbf245e9591814fe994df3cae95964'] = 'Le fichier est vide'; +$_MODULE['<{cashticket}prestashop>cashticket_ebbe99d835c79ead89db1b2b9e4fe70f'] = 'La transaction n\'a pu être initialisée du à des problèmes de connexions. Si le problème persiste, merci de nous contacter.'; +$_MODULE['<{cashticket}prestashop>cashticket_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposition consommée'; +$_MODULE['<{cashticket}prestashop>cashticket_c3e260f43a99b6fd907538953fe700d0'] = 'Disposition relachée'; +$_MODULE['<{cashticket}prestashop>cashticket_12879ec2c367483dd59ef7442178d124'] = 'Une erreur est survenue au moment de la relache.'; +$_MODULE['<{cashticket}prestashop>cashticket_d929c5e5e5643c622400e837914206da'] = 'Acceptez les paiements prépayés dans votre boutique en ligne. Cash-Ticket est une méthode de paiement simple et sécurisée pour l’internet. Cash-Ticket permet des paiements sans carte bancaires ni coordonnées bancaires personnelles. Tout ce qui est nécessaire pour payer dans une boutique en ligne est un code PIN de 16 chiffres. De cette façon les consommateurs peuvent réaliser des paiements en ligne sans carte de crédit ni même compte bancaire.'; +$_MODULE['<{cashticket}prestashop>cashticket_d59048f21fd887ad520398ce677be586'] = 'En savoir plus'; +$_MODULE['<{cashticket}prestashop>cashticket_930320ced1b8c376237844049b570a7f'] = 'Une erreur est survenue. Consulter la partie \"Messages\" ci-dessous pour plus d\'informations'; +$_MODULE['<{cashticket}prestashop>cashticket_a9ced76f2dd6907220fa95b3a136b04a'] = 'Montant incorrect'; +$_MODULE['<{cashticket}prestashop>disposition-error_393988def796f78c4b673b90548f3afa'] = 'La disposition est dans un état invalide'; +$_MODULE['<{cashticket}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = '. Vous n\'êtes pas authorisé à récupérer le paiement.'; +$_MODULE['<{cashticket}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Payer avec'; diff --git a/modules/cashticket/img/payment-logo.png b/modules/cashticket/img/payment-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c542c375bb9c3fcbff7f14e679da3cd685321d GIT binary patch literal 14045 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 P00000NkvXXu0mjfF7GvR literal 0 HcmV?d00001 diff --git a/modules/cashticket/img/payment-small.png b/modules/cashticket/img/payment-small.png new file mode 100644 index 0000000000000000000000000000000000000000..33ea4e92876cd0b4c2d890a513658d851b4f3c6c GIT binary patch literal 633 zcmV-<0*3vGP)<h;3K|Lk000e1NJLTq000sI000sQ0ssI2*{m4=00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0uD(;K~y+TV|?@a zIRhEs^~<OKNd!PGj4z)*7L$-UaC6<cr)&Q+FfambW@PveWP#aG5r}gb8Hya20_j&T zp0ND;_YcT=`T5?vpJx${1!?=wzz8w~WCnx*13)cI|Ni|2a$kSF{qO%*1Y-F5kKr4X z3upZQ3egDE!t@_(+qXZjxmeVJh?`XdPO>nGU=1vw7M5SXegWm847*YN!SMFW^F#L+ zJ^#8LQzuXh)6btjff6!8N;1Mq(n4S)sL0D9`0(A8&%YjHwGF6+2^jd$U;=p@gkF4j zbo}1t3on;^`F#Z_#mS<=$|QlTAE<>1mH+SA`}@c4Z#@2F@{hj{85o$wIGvo8O4yi$ z(5z+p5AqWvoc}#|bMxrE4d-4?{Qd7GP(*<*#9k>$Row9J|8FR!GyI1-^7r3gcV1mN zbZ5o+mwo^L|7K$3RuPD?SB}z_w)pzv)6aiT&>abh$osFaZM)Wg^Zh&^o0(BaOE}I( zDO_FBh>eB)#ixh=|NlYO2GqjD2u=YzZcKjpeGiZU^u4A?goA3NvY0MJ>EjPqAq=1s zAPk@us3Tu|+Xduvv8ZZ^ggL23O9?76Gcf~2{{8>^;KOl<YCbkiSSb7l+6H1XGxBjT z%j<}RdT1p}2*|;m^zG-D_dicTxUziaFxwayu3bJ$V!rtg)WUe}@)>0B63GSt9|B#) TF}53P00000NkvXXu0mjf=jtT; literal 0 HcmV?d00001 diff --git a/modules/cashticket/img/payment.png b/modules/cashticket/img/payment.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c542c375bb9c3fcbff7f14e679da3cd685321d GIT binary patch literal 14045 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 P00000NkvXXu0mjfF7GvR literal 0 HcmV?d00001 diff --git a/modules/cashticket/it.php b/modules/cashticket/it.php new file mode 100644 index 000000000..72724f406 --- /dev/null +++ b/modules/cashticket/it.php @@ -0,0 +1,53 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'Il pagamento non è stato ancora accettato:'; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Accetta il pagamento'; +$_MODULE['<{cashticket}prestashop>cashticket-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Emetti il pagamento'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine sul'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Hai scelto il'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = 'metodo.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{cashticket}prestashop>cashticket-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{cashticket}prestashop>disposition-error_393988def796f78c4b673b90548f3afa'] = 'Stato della disposizione non valido'; +$_MODULE['<{cashticket}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = '. Non sei autorizzato ad effettuare il pagamento.'; +$_MODULE['<{cashticket}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Paga con'; +$_MODULE['<{cashticket}prestashop>cashticket_4512bbd48918c03027387a6c8e911342'] = 'CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_21d3d890383dc93343ce57c221ce5b3d'] = 'Si accettano pagamenti tramite CashTicket'; +$_MODULE['<{cashticket}prestashop>cashticket_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposizione creata. In attesa di addebito.'; +$_MODULE['<{cashticket}prestashop>cashticket_894f0316a71ef67255369c82bf8a0e5b'] = 'Stato della disposizione non valido:'; +$_MODULE['<{cashticket}prestashop>cashticket_c1c25198721552ea8ddd963c7278d4ab'] = 'Si è verificato un errore durante il pagamento:'; +$_MODULE['<{cashticket}prestashop>cashticket_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento accettato.'; +$_MODULE['<{cashticket}prestashop>cashticket_d6ca44369efe062cec0c09f392465f55'] = 'Questo modulo richiede che l\'estensione curl di PHP funzioni correttamente.'; +$_MODULE['<{cashticket}prestashop>cashticket_fe9da2c5e2e153d2415b4cd5d91166a4'] = 'non è scrivibile!'; +$_MODULE['<{cashticket}prestashop>cashticket_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Questo modulo richiede la valuta:'; +$_MODULE['<{cashticket}prestashop>cashticket_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Configura ogni valuta singolarmente:'; +$_MODULE['<{cashticket}prestashop>cashticket_69a530f77bb82f704b9ff5e18bbdea6f'] = '(Il modulo di pagamento non sarà visualizzato per i clienti che utilizzano una valuta non configurata.)'; +$_MODULE['<{cashticket}prestashop>cashticket_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Configurazione in'; +$_MODULE['<{cashticket}prestashop>cashticket_229a7ec501323b94db7ff3157a7623c9'] = 'ID commerciante'; +$_MODULE['<{cashticket}prestashop>cashticket_845314022daaa8b665e718c4b51738aa'] = 'Certificato keyring'; +$_MODULE['<{cashticket}prestashop>cashticket_a01813de717585e9ac9458bbfc54485a'] = 'Keyring PW'; +$_MODULE['<{cashticket}prestashop>cashticket_254f642527b45bc260048e30704edb39'] = 'Configurazione'; +$_MODULE['<{cashticket}prestashop>cashticket_0ba29c6a1afacf586b03a26162c72274'] = 'Ambiente'; +$_MODULE['<{cashticket}prestashop>cashticket_1d5ad3d37f236c9eebda547690373bba'] = 'Tipo di business'; +$_MODULE['<{cashticket}prestashop>cashticket_b024248d9fecf8c34f629e89a9fb93b4'] = 'Pagamento immediato'; +$_MODULE['<{cashticket}prestashop>cashticket_c80a51a60c5ee43553c3881459b8f431'] = 'Aggiorna la configurazione'; +$_MODULE['<{cashticket}prestashop>cashticket_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Devi fornire un certificato per ID COMMERCIANTE'; +$_MODULE['<{cashticket}prestashop>cashticket_bbced877c13c763f0141ff906c8ed0e5'] = 'File non valido'; +$_MODULE['<{cashticket}prestashop>cashticket_97e5793f511c7930ab295997cb28553a'] = 'ID commerciante non valido'; +$_MODULE['<{cashticket}prestashop>cashticket_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{cashticket}prestashop>cashticket_a98658e7f6aa80803873db3a3e982f4d'] = 'Il file è stato parzialmente caricato'; +$_MODULE['<{cashticket}prestashop>cashticket_d2bbf245e9591814fe994df3cae95964'] = 'Il file è vuoto'; +$_MODULE['<{cashticket}prestashop>cashticket_ebbe99d835c79ead89db1b2b9e4fe70f'] = 'Operazione non avviata a causa di problemi di connessione. Se il problema persiste, si prega di contattare il nostro supporto.'; +$_MODULE['<{cashticket}prestashop>cashticket_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposizione consumata'; +$_MODULE['<{cashticket}prestashop>cashticket_c3e260f43a99b6fd907538953fe700d0'] = 'Disposizione emessa'; +$_MODULE['<{cashticket}prestashop>cashticket_12879ec2c367483dd59ef7442178d124'] = 'Si è verificato un errore durante l\'emissione'; +$_MODULE['<{cashticket}prestashop>cashticket_d929c5e5e5643c622400e837914206da'] = 'Accetta pagamenti prepagati nel tuo shop online. Tutto ciò che è richiesto per pagare in un negozio web è codice PIN a 16 cifre di Cash-Ticket. In questo modo, i consumatori possono effettuare pagamenti online senza carta di credito o un conto bancario.'; +$_MODULE['<{cashticket}prestashop>cashticket_d59048f21fd887ad520398ce677be586'] = 'Per saperne di più'; +$_MODULE['<{cashticket}prestashop>cashticket_930320ced1b8c376237844049b570a7f'] = 'Si verificato un errore, controlla i messaggi per maggiori informazioni'; +$_MODULE['<{cashticket}prestashop>cashticket_a9ced76f2dd6907220fa95b3a136b04a'] = 'Importo non valido'; + +?> \ No newline at end of file diff --git a/modules/cashticket/keyring/.htaccess b/modules/cashticket/keyring/.htaccess new file mode 100755 index 000000000..3a4288278 --- /dev/null +++ b/modules/cashticket/keyring/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/modules/cashticket/keyring/paysafecard-CA.pem b/modules/cashticket/keyring/paysafecard-CA.pem new file mode 100644 index 000000000..2df56c61d --- /dev/null +++ b/modules/cashticket/keyring/paysafecard-CA.pem @@ -0,0 +1,227 @@ +-----BEGIN CERTIFICATE----- +MIIFszCCBJugAwIBAgIBADANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3DQEJ +ARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMGVmll +bm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJvb3Qg +Q0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUGA1UE +AxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBQMB4XDTAyMDExMDE2NDU0 +M1oXDTM4MDExMDE2NDU0M1owge8xITAfBgkqhkiG9w0BCQEWEmNhQHBheXNhZmVj +YXJkLmNvbTELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMG +Vmllbm5hMRwwGgYDVQQLExNwYXlzYWZlY2FyZCBSb290IENBMSwwKgYDVQQLEyNw +YXlzYWZlY2FyZCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEmMCQGA1UEChMdcGF5 +c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxJzAlBgNVBAMTHnBheXNhZmVjYXJk +IFJvb3QgQ0EgLSBTeXN0ZW0gUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALRAMIFNZR16P4ggPR6hlyXGSONVOklx7U3Xg9zihKA4vmzVMwXUJPP+lHCU +OKiYUSU+cQ+BMfTJCJPvJlqOHH36+ugyGQLI2M9Lq7ILxkGJ3+iQJx4ON1Yf3lJh +uyPLMjvRVCOoN29fUOROfdBxlAGNG33kKYNEh+VJ+ibxX5DmZApsMu6lJJ7LUZvs +2Rho6r9wKQVZaPNeWzJb+7dgLlW7XLIQIv6Fp/bMhZDPhCrX4rN0iiR7I9o5DZiJ +OXwRmWhroRUEo9pPf44XMfdEyaWDK6tbnIsEa7gTOPY3Zt5SMFeSYw1E0OjkUyFo +WL0NoAT7beVqJar+zzwvOjVaeMUCAwEAAaOCAVYwggFSMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFCgXaDOdI1dXvmnxpQ1ZM3M/BK07MIIBHgYDVR0jBIIBFTCC +ARGAFCgXaDOdI1dXvmnxpQ1ZM3M/BK07oYH1pIHyMIHvMSEwHwYJKoZIhvcNAQkB +FhJjYUBwYXlzYWZlY2FyZC5jb20xCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVu +bmExDzANBgNVBAcTBlZpZW5uYTEcMBoGA1UECxMTcGF5c2FmZWNhcmQgUm9vdCBD +QTEsMCoGA1UECxMjcGF5c2FmZWNhcmQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +JjAkBgNVBAoTHXBheXNhZmVjYXJkLmNvbSBXZXJ0a2FydGVuIEFHMScwJQYDVQQD +Ex5wYXlzYWZlY2FyZCBSb290IENBIC0gU3lzdGVtIFCCAQAwDQYJKoZIhvcNAQEE +BQADggEBAEkGu19kW0cROxNmEIhlF2LMFA8Jj9Y5aPPDwM1tMIoZtFWCH1g1g0Zl +PDrp9+ihDFimiXfhIosGvnrclbQ5yIJnxoNmDptkCKTAB+4rPoHSIz8rjCHHTOU2 +rJMVdFvS8hcVkallN1g9o8g7ryA2vRltum5NZUBwAFq986Cur4l2koRzz1UyOkrT +0G0i8cQIR9trGuCaUbhIFTBe/QvSNkIEqDWRDPLfBQnYnBFSwObH5uXiToUXlTnM +/aOuY+p2D8Oh6MneD6nh8turvFTMkLqLS7DzjQAYmF7HWGkRFPsHi2EtLFVIwM9q +FioR7mWBcKh2lZr18AtzGIkKQSQWQkI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCBKKgAwIBAgIEIAAABjANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3 +DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMG +Vmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJv +b3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUG +A1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBQMB4XDTAyMDExNjEy +MTUxN1oXDTM0MDExNjEyMTUxN1owgfMxCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZW +aWVubmExDzANBgNVBAcTBlZpZW5uYTEmMCQGA1UEChMdcGF5c2FmZWNhcmQuY29t +IFdlcnRrYXJ0ZW4gQUcxHjAcBgNVBAsTFXBheXNhZmVjYXJkIFNlcnZlciBDQTEs +MCoGA1UECxMjcGF5c2FmZWNhcmQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxKTAn +BgNVBAMTIHBheXNhZmVjYXJkIFNlcnZlciBDQSAtIFN5c3RlbSBQMSEwHwYJKoZI +hvcNAQkBFhJjYUBwYXlzYWZlY2FyZC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDGbD6yVmszQYpuUX0zVyam8DdqPXfY5c8OSQK7u8I7mPoEw0SG +lxSbHy7Aywlx5rhSr6j1k0HgmnOsO6j6bup5CXGvGBWkiahN1TrUN8qAZvIdorUz ++YrZyg/EkddrOqkgZpaqyEEJ2wGdM3Lhbg8oBWufVh/TX0sA9K0NCSrl3UzKLw0n +mEVbUnBxRUGbctnOkmLiIWqX7o8jmupvE7lIvRPLHUyFKGp0Wn2oKosr3fhCQxEU +4dQdH9Uwf53kPt0Ct0MML1p1u8OAN4e6bYL1T86YA/bnaaPFI5D4cVP66X1gcamM ++ro//XJOee2d1FM7lWoyA03ypt54SRB1N6aVAgMBAAGjggFWMIIBUjAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBSB6bcBOjQU0y5+rr8pbTyHYFxKbjCCAR4GA1Ud +IwSCARUwggERgBQoF2gznSNXV75p8aUNWTNzPwStO6GB9aSB8jCB7zEhMB8GCSqG +SIb3DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UE +CBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJk +IFJvb3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEn +MCUGA1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBQggEAMA0GCSqG +SIb3DQEBBAUAA4IBAQAwuR+OYbQh8+2A8Ya48pGbEbggbYfJYZAcfZlTxVeilkXb +jhinDfG4mBuvsW8RG7CW1fnHYlytyN9AVJFHchB57SkfDDxhPYI6WBsJTnDaxROa +QzW0r6Pi3e5XAtqC221vKYYC5OoMBq+S+LWUc9kSYX7PAm3ObCEPNBirJMDDwSLm +iovY3UHByFeJ8dYM5u7wKM+WRBzIEi4dMk5VWWx7KO7fieGTxqVCPa1Bd1GQV3yq +Z5P0lzduqD2M1oUr1BCwiivxpHO4aMYo9lVz7ZMFhbyDLiiQqcR3unVKpSpN4oAq +TW3iZ32LXHkLFSCEFinOO43/uWk8+RzNR0N+XZ1F +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFszCCBJugAwIBAgIBADANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3DQEJ +ARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMGVmll +bm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJvb3Qg +Q0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUGA1UE +AxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBNMB4XDTAyMDExMDE1MDUx +M1oXDTM4MDExMDE1MDUxM1owge8xITAfBgkqhkiG9w0BCQEWEmNhQHBheXNhZmVj +YXJkLmNvbTELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMG +Vmllbm5hMRwwGgYDVQQLExNwYXlzYWZlY2FyZCBSb290IENBMSwwKgYDVQQLEyNw +YXlzYWZlY2FyZCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEmMCQGA1UEChMdcGF5 +c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxJzAlBgNVBAMTHnBheXNhZmVjYXJk +IFJvb3QgQ0EgLSBTeXN0ZW0gTTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALtYbwxejm8ZTdZmvLG1TtVHMGyIVnTFeyIbt7SUP4GjycrFs0GiWCJzYHAX +gEtwzIX3ibt3bIR62/itJ4ra/pkIUBDd1ARNM1F9R/MyE3Ci1SGmp1IyaFK2tQRX +dxHqIBZtH6hUSK750mxE9Ln+YjHjbkEnvXB49qIyJsvgQSPrvzldj+bBDpNyCppf +H16U55azIpq7gWvyqsFe/NeAp8iW8quhgZQWqXhPFMA/dypcwBwSTJSW/jVqfqhd +iRhEfZEeV6pBPtaZeeUUvWBgBccr39sQd3FUADH7d7AepxsiIxTDm971wn9bNiOM +YwCdfQlEYLlAhEc3XMRv5Mifnp8CAwEAAaOCAVYwggFSMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFEdDEuV3HVe81QNu5wgYE/h2K14EMIIBHgYDVR0jBIIBFTCC +ARGAFEdDEuV3HVe81QNu5wgYE/h2K14EoYH1pIHyMIHvMSEwHwYJKoZIhvcNAQkB +FhJjYUBwYXlzYWZlY2FyZC5jb20xCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVu +bmExDzANBgNVBAcTBlZpZW5uYTEcMBoGA1UECxMTcGF5c2FmZWNhcmQgUm9vdCBD +QTEsMCoGA1UECxMjcGF5c2FmZWNhcmQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +JjAkBgNVBAoTHXBheXNhZmVjYXJkLmNvbSBXZXJ0a2FydGVuIEFHMScwJQYDVQQD +Ex5wYXlzYWZlY2FyZCBSb290IENBIC0gU3lzdGVtIE2CAQAwDQYJKoZIhvcNAQEE +BQADggEBACJ9nG6+DmSxJKoqyCDaBUTCeVWk1jpBAvxR1Nwq68L25VYqWp8M0x74 +/Wd/rcut532BaStABiba+P5V4/VpV4cYlExPb2CCr1E3BWd9nMaJEqjFOdNfy2Aq +OZhTeKqKZ0oALhk61AdX7OmimW2DGe7jwEbZxtjcUBUMo+olSAqDD/oVmOLooQOE +oCHQ7U/+PFHtzO9Im7Jlq0fJESJSRheSbjItZSJxl18neu3xN58Ku9Pnu4pInyM+ +ObX4TJxmBbyRXlBkWfDWljih9MANqE/XkwOE3BlAt2haymRs/GSYiIWqNwTd2Rbx +NwdV0sBoOmFmSMNt7/NhXIT6GO3hFK4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCBKKgAwIBAgIEEAAAAzANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3 +DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMG +Vmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJv +b3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUG +A1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBNMB4XDTAyMDExMDE1 +MjE1OVoXDTM0MDExMDE1MjE1OVowgfMxITAfBgkqhkiG9w0BCQEWEmNhQHBheXNh +ZmVjYXJkLmNvbTELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UE +BxMGVmllbm5hMR4wHAYDVQQLExVwYXlzYWZlY2FyZCBTZXJ2ZXIgQ0ExLDAqBgNV +BAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSYwJAYDVQQK +Ex1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEpMCcGA1UEAxMgcGF5c2Fm +ZWNhcmQgU2VydmVyIENBIC0gU3lzdGVtIE0wggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCySPf9dV1J73WgihZzq6PuFZw8G+5YgCG7KVvmm/unkabEHzQ7 +PKfHT0awGRfZgfsRzbLxnohaXDHE8e2whWjV5ZROXKpeYb7MhFcmPdPAuxx6lPD9 +jocbEA530vTonL3WrAPY9P4v48Upd8xTKy+HmdruBn80tOwnvJeSH+2Itm2Qo6cU +JslOxJYqmIu76aNbh/Is37rZV37zegkNr7RVpE82tUZR8CRnY46f+FrYEJYpZRVc +hg9NOM6fmswG7BAP4oLXOjOERR79Rom/ACZZNcz1PSBJRIarm2eXLUptlTfTR1lb +92wX+KGtYvcLFnr/2RkHDT2Wdcb8s3pI7bhxAgMBAAGjggFWMIIBUjAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBTNjfh4N1yNw7Bo/E0sMOrdcZbJ8TCCAR4GA1Ud +IwSCARUwggERgBRHQxLldx1XvNUDbucIGBP4diteBKGB9aSB8jCB7zEhMB8GCSqG +SIb3DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UE +CBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJk +IFJvb3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEn +MCUGA1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBNggEAMA0GCSqG +SIb3DQEBBAUAA4IBAQAZ7naLoETGD8TW6lAbuZ7ntd9zNqutizAtPzC5bJRq2sL3 +AyIsSDO6jQnJgvHsW3XiBfYP0R8MGbMg5cLvgcyKHjnpkzcGEXFuvOeeh50oWSTl +aJ9VNTvvGK6nY4rQ710I6qCollj+pqlSq4sak/zYJ87lKc8TXEzvzyncYAfrRp3G +XIA5zG3TniBIYC/cuiXjBupmWelFCKRK8/Uhm0vbg71wAWrouJKcBkSMYgZCdEC6 +3g0EBmD94j9FBEiW7q4sUgqYxGTjeOv1Wb4EsHJhq2eBzOKLp+NHYbPzI++50nQU +AjKavlzdAr9PVC8BBS74M567rtIooeIgEDqqi/7J +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfjCCAuegAwIBAgIQAdAC7XDZlmGZ84pH2aljUjANBgkqhkiG9w0BAQUFADCB +zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh +d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTA2MTAyNTAwMDAwMFoXDTA4MTAyNDIzNTk1OVow +gYIxCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVubmExDzANBgNVBAcTBlZpZW5u +YTEmMCQGA1UEChMdcGF5c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxKTAnBgNV +BAMTIGN1c3RvbWVyLnRlc3QuYXQucGF5c2FmZWNhcmQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDgay0tcil7faWjhcRYg4HvOt9DA6llt87cxZtkGalY +Fvxr+tKLg2U031cbmQjRpCEXIWeZjIqOreZLK3PNYfQJi7C3m7bU2D8owt6xijt4 +reOsNH5nTy4NNt9J+tUVaRO0YCWG7O2v1T1L4QMwdHjHcsvpoO9NnFM/Sqmo8tSz +EwIDAQABo4GmMIGjMAwGA1UdEwEB/wQCMAAwQAYDVR0fBDkwNzA1oDOgMYYvaHR0 +cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVNlcnZlclByZW1pdW1DQS5jcmwwHQYD +VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDIGCCsGAQUFBwEBBCYwJDAiBggr +BgEFBQcwAYYWaHR0cDovL29jc3AudGhhd3RlLmNvbTANBgkqhkiG9w0BAQUFAAOB +gQBzovJPMRON4GSrPeAZ93nDYHHfZMV2yUY0+8Kfi+5smLfV3VaurPjL8WSYA2mY +F1vI2tkNhAbELQwm/6RqrU7AG1wKnoyljzZ9V0Uk7Mfcw3Wg/uCTEtes9NNz6KbW +RM9X8CWd8gJGwTODZy4JU0qMWiETqPvbvzXTX0oihp2nEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAuWgAwIBAgIQWAYuIHYD1tplIr6DdfOxoDANBgkqhkiG9w0BAQUFADCB +zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh +d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTA2MTAyNTAwMDAwMFoXDTA4MTAyNDIzNTk1OVow +gYAxCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVubmExDzANBgNVBAcTBlZpZW5u +YTEmMCQGA1UEChMdcGF5c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxJzAlBgNV +BAMTHmN1c3RvbWVyLmNjLmF0LnBheXNhZmVjYXJkLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAs1G3ieyBRUxgDLUAlqipvBtnlsb7W0TqcXYY9MF/XOyp +1KoS6xKcH6dV1PYGUi8roITcEPB2VBnR2lCpqjUwhmeJcXf2sJLIInf0J0ld05qE +G8I6tHh8DOylkN+G9NdbdWsHyQLxiqQ1TkLIAX28ioJziLVSJ0AU/Vw5MSj3x+UC +AwEAAaOBpjCBozAMBgNVHRMBAf8EAjAAMEAGA1UdHwQ5MDcwNaAzoDGGL2h0dHA6 +Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVTZXJ2ZXJQcmVtaXVtQ0EuY3JsMB0GA1Ud +JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAyBggrBgEFBQcBAQQmMCQwIgYIKwYB +BQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0ZS5jb20wDQYJKoZIhvcNAQEFBQADgYEA +dLrNu1On6Vp5JWdeFmA0wZjrvbVSXmH3fGuuY5pw+RDDq5AVZ0ug5AoNO90DkAn5 +7s1zOelLs1imjS1MpPKOs7jgC+kbzW/PRFfY1oYSHZdSQGfmTjdz3PtT3XVWMmne +z4cv4RYpEiZrkrxL/fdd36E/Lo0GctmhlXBT7SiNM0g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDhjCCAu+gAwIBAgIQeO5I3hhbIHHJycO1HXvdwTANBgkqhkiG9w0BAQUFADBfMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi +bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNOTcwNDE3MDAwMDAwWhcN +MTExMDI0MjM1OTU5WjCBujEfMB0GA1UEChMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazEXMBUG +A1UECxMOVmVyaVNpZ24sIEluYy4xMzAxBgNVBAsTKlZlcmlTaWduIEludGVybmF0aW9uYWwg +U2VydmVyIENBIC0gQ2xhc3MgMzFJMEcGA1UECxNAd3d3LnZlcmlzaWduLmNvbS9DUFMgSW5j +b3JwLmJ5IFJlZi4gTElBQklMSVRZIExURC4oYyk5NyBWZXJpU2lnbjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA2IKA6NYZAn0fhRg5JaJlK+G/1AXTvOY2O6rwTGxbtueqPHNFVbLx +veqXQu2aNAoV1Klc9UAl3dkHwTKydWzEyruj/lYncUOqY/UwPpMo5frxCTvzt01OOfdcSVq4 +wR3Tsor+cDCVQsv+K1GLWjw6+SJPkLICp1OcTzTnqwSye28CAwEAAaOB5jCB4zAPBgNVHRME +CDAGAQH/AgEAMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEwKjAoBggrBgEFBQcCARYcaHR0 +cHM6Ly93d3cudmVyaXNpZ24uY29tL0NQUzA0BgNVHR8ELTArMCmgJ6AlhiNodHRwOi8vY3Js +LnZlcmlzaWduLmNvbS9wY2EzLWcyLmNybDA0BgNVHSUELTArBggrBgEFBQcDAQYIKwYBBQUH +AwIGCWCGSAGG+EIEAQYKYIZIAYb4RQEIATALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4GBACNd7qYkBf1202oa1rpGBqpqDwOQZrKwpsKeyR6jVVOv +PkX93Iwn3VM4Cbt8Syu6lUr+cE4badY8908HxfIXWkyij6wLigbbudRrxR1Y2hdS4yHx0tda +1eWrWXsheoZq1P4XETpTDZxgoErZXuQdDCmqEwdlhh+/tMmCU5wsAo8j +-----END CERTIFICATE----- + diff --git a/modules/cashticket/logo.gif b/modules/cashticket/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..6153db471185c95784244aaa7e0541240e2f0c5a GIT binary patch literal 952 zcmXYwL5L7U7=>SCwnBpLwZN1@ViJO9pm?xDnads`aG*MA3qKWxgb>zgvP0OVgIK)W zpo11Wbx;zIfd=B?*F!K6cn<Q?AzBtAc+FOG8D@T%|NY;4^YYS>0|!s+#3DBE-y#rz zfCP*J6ru!*P!h$cKqYFR3N=xU1~j4tn$Qx>=s+iWpbI_GjR6c|1copY!}D#JaKM5S zo(B*lf)J6j#sU_y1dCXb#jIc@Yp{wnS<MDEvIU#ilFjU3Cws7qJ=x6x4sryCIFiFO zXwpH8PI~H?V>1u|1#-%Yf+&m<Q4}SkI4YttYD87kjOu8J#%K{u(K4E&BRZo;bVbkT zj)54A5it}aV>pa3!x2_E!xO<IP9X#dIf<x1g({&Ul~l1RRH+)OQcYE>L5*smCbd+v zI@GBi>QYa2Ye0h<p&^abund`U$dXf@^rzWOL_&$2W@JGYW{E7yl3AP;S(!DmDr;tS zHe_SA$fj(W&DoKi*(1BMXLjd64(5m)%8@yoMw;nJE1hX?24T7}kxX5)IHOSDLYHun zOS;$<u5=Aoxu&b#;6}G_lUusk9qx1wce$s#J>Wr)@Q_D(Y&M%gn{H3!bMAke|DXH0 z?S8Q3A>eO3yLq+wC$Mk<8{3{ZdgbdIA1|E$;O4a}yMOv*%i*hU^Xi_LK0Uqg;X5m9 z+xLF<<l#5=oLRebYx(qZ?_D}`Zu^b5{yKj1*!5TMK7H`r9lw9Kv3B{DFCJZAUtKwO z_s;6p3+t=DExms6^R4&yJ+G6yZlB%%%=>@5cxu<RZ(n%i=RY4T>9yqp+ur>0m;2{` i{Ah7`@#M-6-ygaD)V*W-Zh!OZ-mlujk3Y76L;nEK4a5Ba literal 0 HcmV?d00001 diff --git a/modules/cashticket/payment.php b/modules/cashticket/payment.php new file mode 100644 index 000000000..2d66fa547 --- /dev/null +++ b/modules/cashticket/payment.php @@ -0,0 +1,107 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/cashticket.php'); + +$module = new CashTicket(); + +if (!$cart->id OR $cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$module->active) + Tools::redirect('index.php?controller=order&step=3'); + +$currency = new Currency($cart->id_currency); +if (!$module->isCurrencyActive($currency->iso_code)) + Tools::redirect('index.php?controller=order&step=3'); + +$amount = number_format((float)($cart->getOrderTotal(true, Cart::BOTH)), 2, '.',''); +if (Tools::getValue('hash') != md5(Configuration::get($module->prefix.'SALT') + $amount + $currency->iso_code)) + die(Tools::displayError()); + +$result = $module->getDispositionState((int)($cart->id)); +$state = _PS_OS_ERROR_; + +$disposition = Disposition::getByCartId((int)($cart->id)); + +$message = 'Transaction ID #'.$disposition['mtid'].': '.$disposition['amount'].$disposition['currency'].'<br />'. date('Y-m-d').' '; +if ($result[0] == 0) +{ + list ($rc, $errorcode, $error_message, $amount, $used_currency, $state) = $result; + + if ($state == PrepaidServicesAPI::DISPOSITION_DISPOSED || $state == PrepaidServicesAPI::DISPOSITION_DEBITED) + { + $state = _PS_OS_PAYMENT_; + $message .= $module->getL('disposition_created'); + } + else + { + $message .= $module->getL('disposition_invalid').' '.$state; + } +} +else +{ + $message .= 'payment_error'.' '.$result[2]; +} + +if ($state != _PS_OS_ERROR_) +{ + $state = (int)(Configuration::get($module->prefix.'ORDER_STATE_ID')); + + if (Configuration::get($module->prefix.'IMMEDIAT_PAYMENT')) + { + $message .= '<br />'.date('Y-m-d').' '; + $result = $module->executeDebit((int)($cart->id)); + + if ($result[0] != 0) + { + $message .= $module->getL('payment_error').' '.$result[2]; + $state = _PS_OS_ERROR_; + } + else + { + $message .= $module->getL('payment_accepted'); + $state = _PS_OS_PAYMENT_; + } + } +} + + +$module->validateOrder((int)($cart->id), $state, (float)($cart->getOrderTotal(true, Cart::BOTH)), $module->displayName, $message, NULL, (int)($currency->id), false, $cart->secure_key); + +if ($state == _PS_OS_ERROR_) +{ + include(dirname(__FILE__).'/../../header.php'); + echo $message; + include(dirname(__FILE__).'/../../footer.php'); +} +else +{ + $order = new Order($module->currentOrder); + Tools::redirect('index.php?controller=order-confirmation&id_cart='.(int)($cart->id).'&id_module='.(int)($module->id).'&id_order='.(int)($module->currentOrder).'&key='.$order->secure_key); +} + + + diff --git a/modules/cashticket/payment.tpl b/modules/cashticket/payment.tpl new file mode 100644 index 000000000..745986bb7 --- /dev/null +++ b/modules/cashticket/payment.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="payment_module"> + <a href="modules/{$module_name}/redirect.php" title=""> + <img src="{$pic_url}" alt="" width="86" height="49"/> + {l s='Pay with' mod='cashticket'} {$payment_name} + </a> +</p> diff --git a/modules/cashticket/prepaidservices.js b/modules/cashticket/prepaidservices.js new file mode 100644 index 000000000..3d7b7537f --- /dev/null +++ b/modules/cashticket/prepaidservices.js @@ -0,0 +1,38 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function toggleImediatPayment() +{ + if ($('#ct_business_type').val() == 'I') + $('#imediat_payment').hide(); + else + $('#imediat_payment').show(); +} + +$(document).ready(function() { + toggleImediatPayment(); +}); + diff --git a/modules/cashticket/redirect.php b/modules/cashticket/redirect.php new file mode 100644 index 000000000..c94203fb8 --- /dev/null +++ b/modules/cashticket/redirect.php @@ -0,0 +1,51 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/cashticket.php'); + +$module = new CashTicket(); + +if (!$cart->id OR $cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$module->active) + + Tools::redirect('index.php?controller=order&step=3'); + +$currency = new Currency($cart->id_currency); +if (!$module->isCurrencyActive($currency->iso_code)) + Tools::redirect('index.php?controller=order&step=3'); + +$result = $module->createDisposition($cart); + +if ($result['return_code'] != 0) +{ + include(dirname(__FILE__).'/../../header.php'); + echo $module->getL('cant_create_dispo'); + include(dirname(__FILE__).'/../../footer.php'); +} +else + Tools::redirectLink($result['message']); + diff --git a/modules/cheque/cheque.jpg b/modules/cheque/cheque.jpg new file mode 100644 index 0000000000000000000000000000000000000000..555f1f31ce42e6230e1630099abd9693ea8fb680 GIT binary patch literal 1837 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 literal 0 HcmV?d00001 diff --git a/modules/cheque/cheque.php b/modules/cheque/cheque.php new file mode 100644 index 000000000..778469213 --- /dev/null +++ b/modules/cheque/cheque.php @@ -0,0 +1,223 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7095 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Cheque extends PaymentModule +{ + private $_html = ''; + private $_postErrors = array(); + + public $chequeName; + public $address; + + public function __construct() + { + $this->name = 'cheque'; + $this->tab = 'payments_gateways'; + $this->version = '2.3'; + $this->author = 'PrestaShop'; + + $this->currencies = true; + $this->currencies_mode = 'checkbox'; + + $config = Configuration::getMultiple(array('CHEQUE_NAME', 'CHEQUE_ADDRESS')); + if (isset($config['CHEQUE_NAME'])) + $this->chequeName = $config['CHEQUE_NAME']; + if (isset($config['CHEQUE_ADDRESS'])) + $this->address = $config['CHEQUE_ADDRESS']; + + parent::__construct(); + + $this->displayName = $this->l('Check'); + $this->description = $this->l('Module for accepting payments by check.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details ?'); + + if (!isset($this->chequeName) OR !isset($this->address)) + $this->warning = $this->l('\'To the order of\' and address must be configured in order to use this module correctly.'); + if (!sizeof(Currency::checkPaymentCurrencies($this->id))) + $this->warning = $this->l('No currency set for this module'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('payment') OR !$this->registerHook('paymentReturn')) + return false; + return true; + } + + public function uninstall() + { + if (!Configuration::deleteByName('CHEQUE_NAME') OR !Configuration::deleteByName('CHEQUE_ADDRESS') OR !parent::uninstall()) + return false; + return true; + } + + private function _postValidation() + { + if (Tools::isSubmit('btnSubmit')) + { + if (!Tools::getValue('name')) + $this->_postErrors[] = $this->l('\'To the order of\' field is required.'); + elseif (!Tools::getValue('address')) + $this->_postErrors[] = $this->l('Address is required.'); + } + } + + private function _postProcess() + { + if (Tools::isSubmit('btnSubmit')) + { + Configuration::updateValue('CHEQUE_NAME', Tools::getValue('name')); + Configuration::updateValue('CHEQUE_ADDRESS', Tools::getValue('address')); + } + $this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('OK').'" /> '.$this->l('Settings updated').'</div>'; + } + + private function _displayCheque() + { + $this->_html .= '<img src="../modules/cheque/cheque.jpg" style="float:left; margin-right:15px;"><b>'.$this->l('This module allows you to accept payments by check.').'</b><br /><br /> + '.$this->l('If the client chooses this payment mode, the order status will change to \'Waiting for payment\'.').'<br /> + '.$this->l('Therefore, you will need to manually confirm the order as soon as you receive a check.').'<br /><br /><br />'; + } + + private function _displayForm() + { + $this->_html .= + '<form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset> + <legend><img src="../img/admin/contact.gif" />'.$this->l('Contact details').'</legend> + <table border="0" width="500" cellpadding="0" cellspacing="0" id="form"> + <tr><td colspan="2">'.$this->l('Please specify the name and address to which customers must send their check.').'.<br /><br /></td></tr> + <tr><td width="130" style="height: 35px;">'.$this->l('To the order of').'</td><td><input type="text" name="name" value="'.Tools::htmlentitiesUTF8(Tools::getValue('name', $this->chequeName)).'" style="width: 300px;" /></td></tr> + <tr> + <td width="130" style="vertical-align: top;">'.$this->l('Address').'</td> + <td><textarea name="address" rows="3" cols="53">'.Tools::htmlentitiesUTF8(Tools::getValue('address', $this->address)).'</textarea></td> + </tr> + <tr><td colspan="2" align="center"><br /><input class="button" name="btnSubmit" value="'.$this->l('Update settings').'" type="submit" /></td></tr> + </table> + </fieldset> + </form>'; + } + + public function getContent() + { + $this->_html = '<h2>'.$this->displayName.'</h2>'; + + if (Tools::isSubmit('btnSubmit')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= '<div class="alert error">'. $err .'</div>'; + } + else + $this->_html .= '<br />'; + + $this->_displayCheque(); + $this->_displayForm(); + + return $this->_html; + } + + public function execPayment($cart) + { + if (!$this->active) + return ; + + if (!$this->_checkCurrency($cart)) + Tools::redirect('index.php?controller=order'); + + global $cookie, $smarty; + + $smarty->assign(array( + 'nbProducts' => $cart->nbProducts(), + 'cust_currency' => $cart->id_currency, + 'currencies' => $this->getCurrency((int)$cart->id_currency), + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'isoCode' => Language::getIsoById((int)($cookie->id_lang)), + 'chequeName' => $this->chequeName, + 'chequeAddress' => nl2br2($this->address), + 'this_path' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + + return $this->display(__FILE__, 'payment_execution.tpl'); + } + + public function hookPayment($params) + { + if (!$this->active) + return ; + if (!$this->_checkCurrency($params['cart'])) + return ; + + global $smarty; + + $smarty->assign(array( + 'this_path' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + return $this->display(__FILE__, 'payment.tpl'); + } + + public function hookPaymentReturn($params) + { + if (!$this->active) + return ; + + global $smarty; + $state = $params['objOrder']->getCurrentState(); + if ($state == _PS_OS_CHEQUE_ OR $state == _PS_OS_OUTOFSTOCK_) + $smarty->assign(array( + 'total_to_pay' => Tools::displayPrice($params['total_to_pay'], $params['currencyObj'], false), + 'chequeName' => $this->chequeName, + 'chequeAddress' => nl2br2($this->address), + 'status' => 'ok', + 'id_order' => $params['objOrder']->id + )); + else + $smarty->assign('status', 'failed'); + return $this->display(__FILE__, 'payment_return.tpl'); + } + + private function _checkCurrency($cart) + { + $currency_order = new Currency((int)($cart->id_currency)); + $currencies_module = $this->getCurrency((int)$cart->id_currency); + $currency_default = Configuration::get('PS_CURRENCY_DEFAULT'); + + if (is_array($currencies_module)) + foreach ($currencies_module AS $currency_module) + if ($currency_order->id == $currency_module['id_currency']) + return true; + return false; + } +} diff --git a/modules/cheque/config.xml b/modules/cheque/config.xml new file mode 100755 index 000000000..19317cf80 --- /dev/null +++ b/modules/cheque/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>cheque</name> + <displayName><![CDATA[Check]]></displayName> + <version><![CDATA[2.3]]></version> + <description><![CDATA[Module for accepting payments by check.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <confirmUninstall>Are you sure you want to delete your details ?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/cheque/de.php b/modules/cheque/de.php new file mode 100644 index 000000000..3173f40d3 --- /dev/null +++ b/modules/cheque/de.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cheque}prestashop>payment_a5967aadef7d23b5027d46e107faf6d0'] = 'Zahlung per Scheck'; +$_MODULE['<{cheque}prestashop>payment_30bee0e9549e97b2f65f8fd8fc5948be'] = 'Zahlung per Scheck (Bestellungvorgang dauert länger)'; +$_MODULE['<{cheque}prestashop>payment_execution_83aa0e5744c86bf2d9d006319db14839'] = 'Scheckzahlung'; +$_MODULE['<{cheque}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Bestellsumme'; +$_MODULE['<{cheque}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Ihr Warenkorb ist leer.'; +$_MODULE['<{cheque}prestashop>payment_execution_c42b053ef8c36f950ff37a0897d3a963'] = 'Scheck'; +$_MODULE['<{cheque}prestashop>payment_execution_6b3ef039e038a131d05bcd208a1b9799'] = 'Sie haben sich entschieden, per Scheck zu bezahlen.'; +$_MODULE['<{cheque}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Hier ist eine kurze Zusammenfassung Ihrer Bestellung:'; +$_MODULE['<{cheque}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung beträgt'; +$_MODULE['<{cheque}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. Mwst.)'; +$_MODULE['<{cheque}prestashop>payment_execution_2f1585fcd1150d6a7d6edbe3468a63f8'] = 'Wir akzeptieren mehrere Währungen bei Scheckzahlungen.'; +$_MODULE['<{cheque}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Wählen Sie eine der folgenden Möglichkeiten:'; +$_MODULE['<{cheque}prestashop>payment_execution_c4309902a6192747d56f3539941acc49'] = 'Wir akzeptieren die folgende Währung per Scheck:'; +$_MODULE['<{cheque}prestashop>payment_execution_504be670f962fa7630863857a0085632'] = 'Scheckinhaber und Adressinformationen werden auf der nächsten Seite angezeigt.'; +$_MODULE['<{cheque}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Bitte bestätigen Sie Ihre Bestellung durch Klicken auf \"BESTELLEN\"'; +$_MODULE['<{cheque}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Andere Zahlungsmethoden'; +$_MODULE['<{cheque}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'BESTELLEN'; +$_MODULE['<{cheque}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{cheque}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{cheque}prestashop>payment_return_e4ee6e0eac588fe2611cc6fd195828af'] = 'Bitte senden Sie uns einen Scheck über:'; +$_MODULE['<{cheque}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'folgenden Betrag'; +$_MODULE['<{cheque}prestashop>payment_return_84cca8efe379645790938f55b701a1a4'] = 'zahlbar an '; +$_MODULE['<{cheque}prestashop>payment_return_c5a6826dd3b059e32a3fa1ae029179de'] = 'E-Mail an'; +$_MODULE['<{cheque}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Eine E-Mail wurde Ihnen mit diesen Informationen gesendet.'; +$_MODULE['<{cheque}prestashop>payment_return_ffd2478830ca2f519f7fe7ee259d4b96'] = 'Ihre Bestellung wird gesendet werden, sobald wir Ihre Zahlung erhalten.'; +$_MODULE['<{cheque}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{cheque}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{cheque}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Wir haben bei Ihrer Bestellung ein Problem festgestellt. Wenn Sie denken, dies sei ein Fehler, können Sie an unseren'; +$_MODULE['<{cheque}prestashop>cheque_060bf2d587991d8f090a1309b285291c'] = 'Scheck'; +$_MODULE['<{cheque}prestashop>cheque_44cd16893a0a7731735c02999cc81adc'] = 'Modul für die Annahme von Zahlungen per Scheck'; +$_MODULE['<{cheque}prestashop>cheque_fa214007826415a21a8456e3e09f999d'] = 'Sie sind sicher, dass Sie Ihre Details löschen wollen?'; +$_MODULE['<{cheque}prestashop>cheque_1fddeba3cee2a70b37a20889e124948a'] = '\'Zahlbar an\' und Adresse müssen konfiguriert werden, um dieses Modul richtig zu benutzen'; +$_MODULE['<{cheque}prestashop>cheque_4402acab1c8f90dcf4a31dc96833bd86'] = 'Keine Währung für dieses Modul eingestellte'; +$_MODULE['<{cheque}prestashop>cheque_a0048063a9be52816b7fa7f17aa3a2b7'] = '\'Zahlbar an\'-Feld ist ein Pflichtfeld.'; +$_MODULE['<{cheque}prestashop>cheque_4b5e20a521d31cc44b9690bd35eaacfc'] = 'Adresse ist ein Pflichtfeld.'; +$_MODULE['<{cheque}prestashop>cheque_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{cheque}prestashop>cheque_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{cheque}prestashop>cheque_14e41f4cfd99b10766cc15676d8cda66'] = 'Dieses Modul ermöglicht es Ihnen, Zahlungen per Scheck zu akzeptieren.'; +$_MODULE['<{cheque}prestashop>cheque_3b39b241f115e5823eeca07df2949a35'] = 'Wählt der Kunde diesen Zahlungsmodus, geht der Auftragsstatus in \"Warten auf Zahlung\" über.'; +$_MODULE['<{cheque}prestashop>cheque_4d96735a584217fd2d8a4edec43935d6'] = 'Daher müssen Sie die Bestellung manuell bestätigen, sobald Sie einen Scheck erhalten.'; +$_MODULE['<{cheque}prestashop>cheque_5dd532f0a63d89c5af0243b74732f63c'] = 'Kontaktangaben'; +$_MODULE['<{cheque}prestashop>cheque_d75e7b0f61c58d5d1cef7b56322c8b21'] = 'Bitte geben Sie den Namen und die Anschrift an, an die Kunden ihren Scheck schicken müssen '; +$_MODULE['<{cheque}prestashop>cheque_75475839e69bef6ed57a8200a5a71d37'] = 'Zahlbar an'; +$_MODULE['<{cheque}prestashop>cheque_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{cheque}prestashop>cheque_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aktualisierungseinstellungen'; + +?> \ No newline at end of file diff --git a/modules/cheque/en.php b/modules/cheque/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/cheque/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/cheque/es.php b/modules/cheque/es.php new file mode 100644 index 000000000..daf44d021 --- /dev/null +++ b/modules/cheque/es.php @@ -0,0 +1,49 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cheque}prestashop>cheque_060bf2d587991d8f090a1309b285291c'] = 'Cheque'; +$_MODULE['<{cheque}prestashop>cheque_44cd16893a0a7731735c02999cc81adc'] = 'Módulo para aceptar pagos con cheque'; +$_MODULE['<{cheque}prestashop>cheque_fa214007826415a21a8456e3e09f999d'] = '¿Está seguro de que desea eliminar sus datos?'; +$_MODULE['<{cheque}prestashop>cheque_1fddeba3cee2a70b37a20889e124948a'] = 'Debe indicar la orden y la dirección en el cheque'; +$_MODULE['<{cheque}prestashop>cheque_4402acab1c8f90dcf4a31dc96833bd86'] = 'Ninguna divisa disponible para este módulo'; +$_MODULE['<{cheque}prestashop>cheque_a0048063a9be52816b7fa7f17aa3a2b7'] = 'Se necesita la orden del cheque.'; +$_MODULE['<{cheque}prestashop>cheque_4b5e20a521d31cc44b9690bd35eaacfc'] = 'Se necesita la dirección del cheque.'; +$_MODULE['<{cheque}prestashop>cheque_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{cheque}prestashop>cheque_c888438d14855d7d96a2724ee9c306bd'] = 'Actualización realizada con éxito'; +$_MODULE['<{cheque}prestashop>cheque_14e41f4cfd99b10766cc15676d8cda66'] = 'Este módulo le permite aceptar pagos por cheque'; +$_MODULE['<{cheque}prestashop>cheque_3b39b241f115e5823eeca07df2949a35'] = 'Si el cliente elije este módulo de pago, el pedido pasará a estado \"Pago en espera\"'; +$_MODULE['<{cheque}prestashop>cheque_4d96735a584217fd2d8a4edec43935d6'] = 'Por lo tanto, debe validar manualmente el pedido a la recepción del cheque'; +$_MODULE['<{cheque}prestashop>cheque_5dd532f0a63d89c5af0243b74732f63c'] = 'Detalles del contacto'; +$_MODULE['<{cheque}prestashop>cheque_d75e7b0f61c58d5d1cef7b56322c8b21'] = 'Por favor, especifique la orden del cheque y la dirección para sus clientes'; +$_MODULE['<{cheque}prestashop>cheque_75475839e69bef6ed57a8200a5a71d37'] = 'a la orden de'; +$_MODULE['<{cheque}prestashop>cheque_dd7bf230fde8d4836917806aff6a6b27'] = 'Dirección'; +$_MODULE['<{cheque}prestashop>cheque_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar'; +$_MODULE['<{cheque}prestashop>payment_a5967aadef7d23b5027d46e107faf6d0'] = 'Pagar por cheque '; +$_MODULE['<{cheque}prestashop>payment_30bee0e9549e97b2f65f8fd8fc5948be'] = 'Pagar por cheque (proceso más largo)'; +$_MODULE['<{cheque}prestashop>payment_execution_83aa0e5744c86bf2d9d006319db14839'] = 'Pago por cheque'; +$_MODULE['<{cheque}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Recapitulativo del pedido'; +$_MODULE['<{cheque}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Su carrito está vacío'; +$_MODULE['<{cheque}prestashop>payment_execution_c42b053ef8c36f950ff37a0897d3a963'] = 'cheque'; +$_MODULE['<{cheque}prestashop>payment_execution_6b3ef039e038a131d05bcd208a1b9799'] = 'Ha elegido el pago por cheque.'; +$_MODULE['<{cheque}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Recapitulativo de su pedido:'; +$_MODULE['<{cheque}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'El importe total de su pedido asciende a'; +$_MODULE['<{cheque}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = 'IVA incluido'; +$_MODULE['<{cheque}prestashop>payment_execution_2f1585fcd1150d6a7d6edbe3468a63f8'] = 'Aceptamos diferentes divisas para los cheques.'; +$_MODULE['<{cheque}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Elija entre las siguientes:'; +$_MODULE['<{cheque}prestashop>payment_execution_c4309902a6192747d56f3539941acc49'] = 'Aceptamos la siguiente divisa para su pago:'; +$_MODULE['<{cheque}prestashop>payment_execution_504be670f962fa7630863857a0085632'] = 'La orden y la dirección del cheque aparecerán en la siguiente página.'; +$_MODULE['<{cheque}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Por favor, confirme su pedido pulsando en \"Confirmo mi pedido\"'; +$_MODULE['<{cheque}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Otros modos de pago'; +$_MODULE['<{cheque}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Confirmo mi pedido'; +$_MODULE['<{cheque}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido de'; +$_MODULE['<{cheque}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'se ha completado.'; +$_MODULE['<{cheque}prestashop>payment_return_e4ee6e0eac588fe2611cc6fd195828af'] = 'Por favor, envíenos un cheque :'; +$_MODULE['<{cheque}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'por un valor de'; +$_MODULE['<{cheque}prestashop>payment_return_84cca8efe379645790938f55b701a1a4'] = 'a la orden de'; +$_MODULE['<{cheque}prestashop>payment_return_c5a6826dd3b059e32a3fa1ae029179de'] = 'enviar a'; +$_MODULE['<{cheque}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Le hemos enviado un email con los datos anteriores.'; +$_MODULE['<{cheque}prestashop>payment_return_ffd2478830ca2f519f7fe7ee259d4b96'] = 'Le enviaremos su pedido en cuanto recibamos el pago'; +$_MODULE['<{cheque}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier duda o para más información, póngase en contacto con nuestro servicio '; +$_MODULE['<{cheque}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'de atención al cliente'; +$_MODULE['<{cheque}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Hay un problema con su pedido, póngase en contacto con el servicio de atención al cliente.'; diff --git a/modules/cheque/fr.php b/modules/cheque/fr.php new file mode 100644 index 000000000..d06550d60 --- /dev/null +++ b/modules/cheque/fr.php @@ -0,0 +1,49 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cheque}prestashop>cheque_060bf2d587991d8f090a1309b285291c'] = 'Chèque'; +$_MODULE['<{cheque}prestashop>cheque_44cd16893a0a7731735c02999cc81adc'] = 'Accepter les paiements par chèque'; +$_MODULE['<{cheque}prestashop>cheque_fa214007826415a21a8456e3e09f999d'] = 'Etes-vous sûr de vouloir supprimer vos paramètres ?'; +$_MODULE['<{cheque}prestashop>cheque_1fddeba3cee2a70b37a20889e124948a'] = 'L\'ordre du chèque et l\'adresse doivent être renseignés'; +$_MODULE['<{cheque}prestashop>cheque_4402acab1c8f90dcf4a31dc96833bd86'] = 'Aucune devise disponible pour ce module'; +$_MODULE['<{cheque}prestashop>cheque_a0048063a9be52816b7fa7f17aa3a2b7'] = 'L\'ordre du chèque est requis.'; +$_MODULE['<{cheque}prestashop>cheque_4b5e20a521d31cc44b9690bd35eaacfc'] = 'L\'adresse est requise.'; +$_MODULE['<{cheque}prestashop>cheque_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{cheque}prestashop>cheque_c888438d14855d7d96a2724ee9c306bd'] = 'Mise à jour réussie'; +$_MODULE['<{cheque}prestashop>cheque_14e41f4cfd99b10766cc15676d8cda66'] = 'Ce module vous permet d\'accepter des paiements par chèque'; +$_MODULE['<{cheque}prestashop>cheque_3b39b241f115e5823eeca07df2949a35'] = 'Si le client choisit ce mode de paiement, la commande prendra le statut \"Paiement en attente\".'; +$_MODULE['<{cheque}prestashop>cheque_4d96735a584217fd2d8a4edec43935d6'] = 'Par conséquent, vous devez valider manuellement la commande dès réception du chèque.'; +$_MODULE['<{cheque}prestashop>cheque_5dd532f0a63d89c5af0243b74732f63c'] = 'Coordonnées'; +$_MODULE['<{cheque}prestashop>cheque_d75e7b0f61c58d5d1cef7b56322c8b21'] = 'Merci de spécifier l\'ordre du chèque et l\'adresse pour vos clients'; +$_MODULE['<{cheque}prestashop>cheque_75475839e69bef6ed57a8200a5a71d37'] = 'A l\'ordre de'; +$_MODULE['<{cheque}prestashop>cheque_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{cheque}prestashop>cheque_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour'; +$_MODULE['<{cheque}prestashop>payment_a5967aadef7d23b5027d46e107faf6d0'] = 'Payer par chèque'; +$_MODULE['<{cheque}prestashop>payment_30bee0e9549e97b2f65f8fd8fc5948be'] = 'Payer par chèque (traitement plus long)'; +$_MODULE['<{cheque}prestashop>payment_execution_83aa0e5744c86bf2d9d006319db14839'] = 'Paiement par chèque'; +$_MODULE['<{cheque}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Récapitulatif de commande'; +$_MODULE['<{cheque}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Votre panier est vide.'; +$_MODULE['<{cheque}prestashop>payment_execution_c42b053ef8c36f950ff37a0897d3a963'] = 'chèque'; +$_MODULE['<{cheque}prestashop>payment_execution_6b3ef039e038a131d05bcd208a1b9799'] = 'Vous avez choisi de régler par chèque.'; +$_MODULE['<{cheque}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un bref récapitulatif de votre commande :'; +$_MODULE['<{cheque}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande s\'élève à'; +$_MODULE['<{cheque}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = 'TTC'; +$_MODULE['<{cheque}prestashop>payment_execution_2f1585fcd1150d6a7d6edbe3468a63f8'] = 'Nous acceptons plusieurs devises pour les chèques.'; +$_MODULE['<{cheque}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Merci de choisir parmi les suivantes :'; +$_MODULE['<{cheque}prestashop>payment_execution_c4309902a6192747d56f3539941acc49'] = 'Nous acceptons la devise suivante pour votre paiement :'; +$_MODULE['<{cheque}prestashop>payment_execution_504be670f962fa7630863857a0085632'] = 'L\'ordre et l\'adresse du chèque seront affichés sur la page suivante.'; +$_MODULE['<{cheque}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Merci de confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{cheque}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Autres moyens de paiement'; +$_MODULE['<{cheque}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{cheque}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{cheque}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'est bien enregistrée.'; +$_MODULE['<{cheque}prestashop>payment_return_e4ee6e0eac588fe2611cc6fd195828af'] = 'Merci de nous envoyer un chèque :'; +$_MODULE['<{cheque}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'd\'un total de'; +$_MODULE['<{cheque}prestashop>payment_return_84cca8efe379645790938f55b701a1a4'] = 'à l\'ordre de'; +$_MODULE['<{cheque}prestashop>payment_return_c5a6826dd3b059e32a3fa1ae029179de'] = 'à envoyer à'; +$_MODULE['<{cheque}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Un email contenant ces informations vous a été envoyé.'; +$_MODULE['<{cheque}prestashop>payment_return_ffd2478830ca2f519f7fe7ee259d4b96'] = 'Votre commande vous sera envoyée dès réception du paiement.'; +$_MODULE['<{cheque}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{cheque}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{cheque}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Nous avons rencontré un problème avec votre commande, merci de contacter notre support client'; diff --git a/modules/cheque/it.php b/modules/cheque/it.php new file mode 100644 index 000000000..8bf49cf13 --- /dev/null +++ b/modules/cheque/it.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{cheque}prestashop>payment_a5967aadef7d23b5027d46e107faf6d0'] = 'Paga con assegno'; +$_MODULE['<{cheque}prestashop>payment_30bee0e9549e97b2f65f8fd8fc5948be'] = 'Paga con assegno (l\'elaborazione dell\'ordine sarà più lungo)'; +$_MODULE['<{cheque}prestashop>payment_execution_83aa0e5744c86bf2d9d006319db14839'] = 'Pagamento con assegno'; +$_MODULE['<{cheque}prestashop>payment_execution_f1d3b424cd68795ecaa552883759aceb'] = 'Riepilogo dell\'ordine'; +$_MODULE['<{cheque}prestashop>payment_execution_879f6b8877752685a966564d072f498f'] = 'Il carrello è vuoto.'; +$_MODULE['<{cheque}prestashop>payment_execution_c42b053ef8c36f950ff37a0897d3a963'] = 'assegno'; +$_MODULE['<{cheque}prestashop>payment_execution_6b3ef039e038a131d05bcd208a1b9799'] = 'Hai scelto di pagare con assegno.'; +$_MODULE['<{cheque}prestashop>payment_execution_c884ed19483d45970c5bf23a681e2dd2'] = 'Ecco un breve riepilogo del tuo ordine:'; +$_MODULE['<{cheque}prestashop>payment_execution_e2867a925cba382f1436d1834bb52a1c'] = 'L\'importo totale del tuo ordine è'; +$_MODULE['<{cheque}prestashop>payment_execution_1f87346a16cf80c372065de3c54c86d9'] = '(tasse incl.)'; +$_MODULE['<{cheque}prestashop>payment_execution_2f1585fcd1150d6a7d6edbe3468a63f8'] = 'Si accettano più valute per gli assegni.'; +$_MODULE['<{cheque}prestashop>payment_execution_a7a08622ee5c8019b57354b99b7693b2'] = 'Scegli una delle seguenti:'; +$_MODULE['<{cheque}prestashop>payment_execution_c4309902a6192747d56f3539941acc49'] = 'Accettiamo le seguente valuta da inviare tramite assegno:'; +$_MODULE['<{cheque}prestashop>payment_execution_504be670f962fa7630863857a0085632'] = 'Le informazioni sul titolare dell\'assegno e l\'indirizzo verranno visualizzate nella pagina successiva.'; +$_MODULE['<{cheque}prestashop>payment_execution_0881a11f7af33bc1b43e437391129d66'] = 'Conferma l\'ordine cliccando su \'confermo il mio ordine\''; +$_MODULE['<{cheque}prestashop>payment_execution_569fd05bdafa1712c4f6be5b153b8418'] = 'Altri metodi di pagamento'; +$_MODULE['<{cheque}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Confermo il mio ordine'; +$_MODULE['<{cheque}prestashop>payment_return_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine sul'; +$_MODULE['<{cheque}prestashop>payment_return_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{cheque}prestashop>payment_return_e4ee6e0eac588fe2611cc6fd195828af'] = 'Vi preghiamo di inviarci un assegno con:'; +$_MODULE['<{cheque}prestashop>payment_return_a35abd2d31d9e1da82599bc67e166506'] = 'un importo di'; +$_MODULE['<{cheque}prestashop>payment_return_84cca8efe379645790938f55b701a1a4'] = 'pagabile all\'ordine di '; +$_MODULE['<{cheque}prestashop>payment_return_c5a6826dd3b059e32a3fa1ae029179de'] = 'mail a'; +$_MODULE['<{cheque}prestashop>payment_return_13f4ac6dc75b5829499cb9cf8b733071'] = 'Ti è stata inviata una e-mail con queste informazioni.'; +$_MODULE['<{cheque}prestashop>payment_return_ffd2478830ca2f519f7fe7ee259d4b96'] = 'Il tuo ordine verrà inviato non appena avremo ricevuto il pagamento.'; +$_MODULE['<{cheque}prestashop>payment_return_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{cheque}prestashop>payment_return_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{cheque}prestashop>payment_return_8de637e24570c1edb0357826a2ad5aea'] = 'Abbiamo notato un problema con il tuo ordine. Se pensi che questo sia un errore, contatta la nostra'; +$_MODULE['<{cheque}prestashop>cheque_060bf2d587991d8f090a1309b285291c'] = 'Assegno'; +$_MODULE['<{cheque}prestashop>cheque_44cd16893a0a7731735c02999cc81adc'] = 'Modulo per accettare pagamenti con assegno'; +$_MODULE['<{cheque}prestashop>cheque_fa214007826415a21a8456e3e09f999d'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{cheque}prestashop>cheque_1fddeba3cee2a70b37a20889e124948a'] = '\'All\'ordine di\' e l\'indirizzo devono essere configurati per poter utilizzare questo modulo correttamente'; +$_MODULE['<{cheque}prestashop>cheque_4402acab1c8f90dcf4a31dc96833bd86'] = 'Nessuna valuta impostata per questo modulo'; +$_MODULE['<{cheque}prestashop>cheque_a0048063a9be52816b7fa7f17aa3a2b7'] = 'Il campo \"all\'ordine di\" è obbligatorio.'; +$_MODULE['<{cheque}prestashop>cheque_4b5e20a521d31cc44b9690bd35eaacfc'] = 'Indirizzo obbligatorio.'; +$_MODULE['<{cheque}prestashop>cheque_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{cheque}prestashop>cheque_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{cheque}prestashop>cheque_14e41f4cfd99b10766cc15676d8cda66'] = 'Questo modulo permette di accettare pagamenti tramite assegno.'; +$_MODULE['<{cheque}prestashop>cheque_3b39b241f115e5823eeca07df2949a35'] = 'Se il cliente sceglie questa modalità di pagamento, l\'ordine cambierà il proprio status in \"attesa di pagamento\".'; +$_MODULE['<{cheque}prestashop>cheque_4d96735a584217fd2d8a4edec43935d6'] = 'Pertanto, sarà necessario confermare l\'ordine non appena si riceve un assegno.'; +$_MODULE['<{cheque}prestashop>cheque_5dd532f0a63d89c5af0243b74732f63c'] = 'Dettagli di contatto'; +$_MODULE['<{cheque}prestashop>cheque_d75e7b0f61c58d5d1cef7b56322c8b21'] = 'Si prega di specificare il nome e l\'indirizzo a cui i clienti dovranno inviare il loro assegno'; +$_MODULE['<{cheque}prestashop>cheque_75475839e69bef6ed57a8200a5a71d37'] = 'All\'ordine di'; +$_MODULE['<{cheque}prestashop>cheque_dd7bf230fde8d4836917806aff6a6b27'] = 'Indirizzo'; +$_MODULE['<{cheque}prestashop>cheque_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; + +?> \ No newline at end of file diff --git a/modules/cheque/logo.gif b/modules/cheque/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2491fb8baeb1eec96f0356aa2979b8e4506164b5 GIT binary patch literal 958 zcmZ?wbhEHb6krfwXlG!Ebdu;u)Y@Aqxgt&RulC249Zq{Yy|*kaIojiPvc=)ZbdNJr zBQDHwy*<tS#?0XJvlGv($iKcQ>B_>at6M7{%=dl1x9rKukgxZn-k!>Ne!A@4m6~sN zv**s8yJ%X+jwNkNmo8nqcI~E3oA&SDdtiOn>Ah1fZtK6jq2>AhuB)f_|2#hV>CF|- zukU|%W5c)0Yrj6-@a5^ABS(&$IdkU5jqCUCUweJ;%+sfL{yaGR_uIk0-;Y0i`t<GF zXW!pH{rK_C|4$G8e}2j^3PwYKvJg=G$->OQz`~#dG6s|<7&vA#aB|3aY*=uxnS*~{ zM?w>0cMD5QNW#O#N12!`oeFN8_}IWEt{!z`f&+s~kCaB>stX0l%xxU}Wdc78nA?0M zR7@W1C~#zM<zvb`w!u>A@VR-sVFesk%5FV^!g(LATwrMJTWXwr<b%P&mezTE0Vj5N yH8gX`T5)|TP;g*mlCpW!^<amgLzf6ATgigm6BQa5*c48*c<k7a*uu!jU=0A?c*JG^ literal 0 HcmV?d00001 diff --git a/modules/cheque/payment.php b/modules/cheque/payment.php new file mode 100644 index 000000000..260cb1766 --- /dev/null +++ b/modules/cheque/payment.php @@ -0,0 +1,43 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include(dirname(__FILE__).'/cheque.php'); + +if (!$cookie->isLogged(true)) + Tools::redirect('index.php?controller=authentication&back=order.php'); + +$cheque = new Cheque(); +echo $cheque->execPayment($cart); + +include_once(dirname(__FILE__).'/../../footer.php'); + + diff --git a/modules/cheque/payment.tpl b/modules/cheque/payment.tpl new file mode 100644 index 000000000..ce487ff65 --- /dev/null +++ b/modules/cheque/payment.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7134 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="payment_module"> + <a href="{$this_path_ssl}payment.php" title="{l s='Pay by cheque' mod='cheque'}"> + <img src="{$this_path}cheque.jpg" alt="{l s='Pay by cheque' mod='cheque'}" width="86" height="49" /> + {l s='Pay by cheque (order process will be longer)' mod='cheque'} + </a> +</p> diff --git a/modules/cheque/payment_execution.tpl b/modules/cheque/payment_execution.tpl new file mode 100644 index 000000000..bf8425c37 --- /dev/null +++ b/modules/cheque/payment_execution.tpl @@ -0,0 +1,80 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Cheque payment' mod='cheque'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +<h2>{l s='Order summary' mod='cheque'}</h2> + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +{if isset($nbProducts) && $nbProducts <= 0} + <p class="warning">{l s='Your shopping cart is empty.'}</p> +{else} + +<h3>{l s='Cheque payment' mod='cheque'}</h3> +<form action="{$this_path_ssl}validation.php" method="post"> + <p> + <img src="{$this_path}cheque.jpg" alt="{l s='cheque' mod='cheque'}" width="86" height="49" style="float:left; margin: 0px 10px 5px 0px;" /> + {l s='You have chosen to pay by cheque.' mod='cheque'} + <br/><br /> + {l s='Here is a short summary of your order:' mod='cheque'} + </p> + <p style="margin-top:20px;"> + - {l s='The total amount of your order is' mod='cheque'} + <span id="amount" class="price">{displayPrice price=$total}</span> + {if $use_taxes == 1} + {l s='(tax incl.)' mod='cheque'} + {/if} + </p> + <p> + - + {if isset($currencies) && $currencies|@count > 1} + {l s='We accept several currencies for cheques.' mod='cheque'} + <br /><br /> + {l s='Choose one of the following:' mod='cheque'} + <select id="currency_payement" name="currency_payement" onchange="setCurrency($('#currency_payement').val());"> + {foreach from=$currencies item=currency} + <option value="{$currency.id_currency}" {if isset($currencies) && $currency.id_currency == $cust_currency}selected="selected"{/if}>{$currency.name}</option> + {/foreach} + </select> + {else} + {l s='We accept the following currency to be sent by cheque:' mod='cheque'}&nbsp;<b>{$currencies.0.name}</b> + <input type="hidden" name="currency_payement" value="{$currencies.0.id_currency}" /> + {/if} + </p> + <p> + {l s='Cheque owner and address information will be displayed on the next page.' mod='cheque'} + <br /><br /> + <b>{l s='Please confirm your order by clicking \'I confirm my order\'' mod='cheque'}.</b> + </p> + <p class="cart_navigation"> + <a href="{$link->getPageLink('order', true, NULL, "step=3")}" class="button_large">{l s='Other payment methods' mod='cheque'}</a> + <input type="submit" name="submit" value="{l s='I confirm my order' mod='cheque'}" class="exclusive_large" /> + </p> +</form> +{/if} diff --git a/modules/cheque/payment_return.tpl b/modules/cheque/payment_return.tpl new file mode 100644 index 000000000..bceda1cc8 --- /dev/null +++ b/modules/cheque/payment_return.tpl @@ -0,0 +1,43 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $status == 'ok'} + <p>{l s='Your order on' mod='cheque'} <span class="bold">{$shop_name}</span> {l s='is complete.' mod='cheque'} + <br /><br /> + {l s='Please send us a cheque with:' mod='cheque'} + <br /><br />- {l s='an amount of' mod='cheque'} <span class="price">{$total_to_pay}</span> + <br /><br />- {l s='payable to the order of' mod='cheque'} <span class="bold">{if $chequeName}{$chequeName}{else}___________{/if}</span> + <br /><br />- {l s='mail to' mod='cheque'} <span class="bold">{if $chequeAddress}{$chequeAddress}{else}___________{/if}</span> + <br /><br />{l s='An e-mail has been sent to you with this information.' mod='cheque'} + <br /><br /><span class="bold">{l s='Your order will be sent as soon as we receive your payment.' mod='cheque'}</span> + <br /><br />{l s='For any questions or for further information, please contact our' mod='cheque'} <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='cheque'}</a>. + </p> +{else} + <p class="warning"> + {l s='We noticed a problem with your order. If you think this is an error, you can contact our' mod='cheque'} + <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='cheque'}</a>. + </p> +{/if} diff --git a/modules/cheque/validation.php b/modules/cheque/validation.php new file mode 100644 index 000000000..5b5fb09a8 --- /dev/null +++ b/modules/cheque/validation.php @@ -0,0 +1,54 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7148 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include(dirname(__FILE__).'/cheque.php'); + +$cheque = new Cheque(); + +if ($cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$cheque->active) + Tools::redirect('index.php?controller=order&step=1'); + +$customer = new Customer((int)$cart->id_customer); + +if (!Validate::isLoadedObject($customer)) + Tools::redirect('index.php?controller=order&step=1'); + +$currency = new Currency((int)(Tools::isSubmit('currency_payement') ? Tools::getValue('currency_payement') : $cookie->id_currency)); +$total = (float)$cart->getOrderTotal(true, Cart::BOTH); + +$mailVars = array( + '{cheque_name}' => Configuration::get('CHEQUE_NAME'), + '{cheque_address}' => Configuration::get('CHEQUE_ADDRESS'), + '{cheque_address_html}' => str_replace("\n", '<br />', Configuration::get('CHEQUE_ADDRESS'))); + +$cheque->validateOrder((int)$cart->id, _PS_OS_CHEQUE_, $total, $cheque->displayName, NULL, $mailVars, (int)$currency->id, false, $customer->secure_key); + +Tools::redirect('index.php?controller=order-confirmation&id_cart='.(int)($cart->id).'&id_module='.(int)($cheque->id).'&id_order='.$cheque->currentOrder.'&key='.$customer->secure_key); + + diff --git a/modules/criteo/config.xml b/modules/criteo/config.xml new file mode 100755 index 000000000..5da514f19 --- /dev/null +++ b/modules/criteo/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>criteo</name> + <displayName><![CDATA[Criteo]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Criteo product export and tag display.]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[advertising_marketing]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/criteo/criteo.php b/modules/criteo/criteo.php new file mode 100755 index 000000000..5c929ca07 --- /dev/null +++ b/modules/criteo/criteo.php @@ -0,0 +1,367 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Criteo extends Module +{ + public function __construct() + { + $this->name = 'criteo'; + $this->tab = 'advertising_marketing'; + $this->version = '1.0'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Criteo'); + $this->description = $this->l('Criteo product export and tag display.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('header') + AND $this->registerHook('productfooter') + AND $this->registerHook('home') + AND $this->registerHook('shoppingCartExtra') + AND $this->registerHook('orderConfirmation')); + } + + public function uninstall() + { + return parent::uninstall(); + } + + private function _postProcess() + { + $isUpdated = false; + if (Tools::getValue('id_criteo_conversion')) + { + Configuration::updateValue('CRITEO_ID_CONVERSION', pSQL(Tools::getValue('id_criteo_conversion'))); + $isUpdated = true; + } + if (Tools::getValue('id_criteo_normal')) + { + Configuration::updateValue('CRITEO_ID_NORMAL', pSQL(Tools::getValue('id_criteo_normal'))); + $isUpdated = true; + } + if (Tools::getValue('url_widget_criteo')) + { + Configuration::updateValue('CRITEO_URL_WIDGET', pSQL(Tools::getValue('url_widget_criteo'))); + $isUpdated = true; + } + if ($isUpdated) + return true; + return false; + } + + public function getContent() + { + return ' + <fieldset> + '.($this->_postProcess() ? $this->displayConfirmation($this->l('Settings are updated').'<img src="http://www.prestashop.com/modules/criteo.png?normal_id='.urlencode(Tools::getValue('id_criteo_normal')).'&conversion_id='.Tools::getValue('id_criteo_conversion').'" style="float:right" />') : '').' + <legend><img src="'.$this->_path.'logo.gif" alt="" title=""/> '.$this->l('Criteo Export').'</legend> + <form method="post" action="" name="criteoForm"> + <label for="id_normal_criteo">'.$this->l('Criteo normal identifier').' :</label> + <input type="text" value="'.Configuration::get('CRITEO_ID_NORMAL').'" name="id_criteo_normal" /><br /><br /> + <label for="id_convertion_criteo">'.$this->l('Criteo conversion identifier').' :</label> + <input type="text" value="'.Configuration::get('CRITEO_ID_CONVERSION').'" name="id_criteo_conversion" /><br /><br /> + <label for="url_widget_criteo">'.$this->l('URL Widget').' :</label> + <input type="text" value="'.Configuration::get('CRITEO_URL_WIDGET').'" name="url_widget_criteo" /><br /><br /> + <center><input type="submit" class="button" name="submitCriteo" value="'.$this->l('Submit').'" /></center> + </form> + '.$this->l('URL to communicate to Criteo:').' + <a href="'.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/export_csv.php?token='.sha1(_COOKIE_KEY_.'exportCriteo').'">'.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/export_csv.php?token='.sha1(_COOKIE_KEY_.'exportCriteo').'</a><br /> + '.$this->l('URL to communicate to Criteo:').' + <a href="'.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/export_xml.php?token='.sha1(_COOKIE_KEY_.'exportCriteo').'">'.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/export_xml.php?token='.sha1(_COOKIE_KEY_.'exportCriteo').'</a> + </fieldset>'; + } + + private static function getAllSubCats(&$all_cats, $id_cat, $id_lang) + { + $category = new Category(intval($id_cat)); + + $sub_cats = $category->getSubcategories($id_lang); + if(count($sub_cats) > 0) + foreach ($sub_cats AS $sub_cat) + { + $all_cats[] = $sub_cat['id_category']; + self::getAllSubCats($all_cats, $sub_cat['id_category'], $id_lang); + } + } + + public static function buildCSV() + { + global $cookie, $country_infos; + $cookie = new Cookie('ps'); + $country_infos = array('id_group' => 0, 'id_tax' => 1); + $html = ''; + /* First line, columns */ + $columns = array('id', 'name', 'smallimage', 'bigimage', 'producturl', 'description', 'price', 'retailprice', 'discount', 'recommendable', 'instock'); + + foreach ($columns AS $column) + $html .= $column.'|'; + $html = rtrim($html, '|')."\n"; + + /* Setting parameters */ + $conf = Configuration::getMultiple(array( + 'PS_REWRITING_SETTINGS', + 'PS_LANG_DEFAULT', + 'PS_SHIPPING_FREE_PRICE', + 'PS_SHIPPING_HANDLING', + 'PS_SHIPPING_METHOD', + 'PS_SHIPPING_FREE_WEIGHT', + 'PS_COUNTRY_DEFAULT', + 'PS_SHOP_NAME', + 'PS_CURRENCY_DEFAULT', + 'PS_CARRIER_DEFAULT')); + /* Language */ + $language = new Language(intval($conf['PS_LANG_DEFAULT'])); + + /* Link instance for products links */ + $link = new Link(); + $result = Db::getInstance()->ExecuteS(' + SELECT DISTINCT p.`id_product`, i.`id_image` + FROM `'._DB_PREFIX_.'product` p + JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.id_product = p.id_product) + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.id_product = p.id_product) + WHERE p.`active` = 1 AND i.id_image IS NOT NULL + GROUP BY p.id_product'); + foreach ($result AS $k => $row) + { + if (Pack::isPack(intval($row['id_product']))) + continue; + $product = new Product(intval($row['id_product']), true); + + if (Validate::isLoadedObject($product)) + { + $imageObj = new Image($row['id_image']); + $line = array(); + $line[] = $product->id; + $line[] = $product->manufacturer_name.' - '.$product->name[intval($conf['PS_LANG_DEFAULT'])]; + $line[] = Tools::getProtocol().$_SERVER['HTTP_HOST']._THEME_PROD_DIR_.$imageObj->getExistingImgPath().'-small.jpg'; + $line[] = Tools::getProtocol().$_SERVER['HTTP_HOST']._THEME_PROD_DIR_.$imageObj->getExistingImgPath().'-thickbox.jpg'; + $line[] = $link->getProductLink(intval($product->id), $product->link_rewrite[intval($conf['PS_LANG_DEFAULT'])], $product->ean13).'&utm_source=criteo&aff=criteo'; + $line[] = str_replace(array("\n", "\r", "\t", '|'), '', strip_tags(html_entity_decode($product->description_short[intval($conf['PS_LANG_DEFAULT'])], ENT_COMPAT, 'UTF-8'))); + + $price = $product->getPrice(true, intval(Product::getDefaultAttribute($product->id))); + + $line[] = number_format($price, 2, '.', ''); + $line[] = number_format($product->getPrice(true, intval(Product::getDefaultAttribute(intval($product->id))), 6, NULL, false, false), 2, '.', ''); + $line[] = $product->getPrice(true, NULL, 2, NULL, true); + $line[] = '1'; + $line[] = '1'; + + foreach ($line AS $column) + $html .= trim($column).'|'; + $html = rtrim($html, '|')."\n"; + } + } + echo $html; + } + + public static function buildXML() + { + global $cookie, $country_infos; + + $cookie = new Cookie('ps'); + $country_infos = array('id_group' => 0, 'id_tax' => 1); + $html = '<products>'."\n"; + /* First line, columns */ + $columns = array('id', 'name', 'smallimage', 'bigimage', 'producturl', 'description', 'price', 'retailprice', 'discount', 'recommendable', 'instock'); + + /* Setting parameters */ + $conf = Configuration::getMultiple(array( + 'PS_REWRITING_SETTINGS', + 'PS_LANG_DEFAULT', + 'PS_SHIPPING_FREE_PRICE', + 'PS_SHIPPING_HANDLING', + 'PS_SHIPPING_METHOD', + 'PS_SHIPPING_FREE_WEIGHT', + 'PS_COUNTRY_DEFAULT', + 'PS_SHOP_NAME', + 'PS_CURRENCY_DEFAULT', + 'PS_CARRIER_DEFAULT')); + /* Language */ + $language = new Language(intval($conf['PS_LANG_DEFAULT'])); + + /* Link instance for products links */ + $link = new Link(); + + /* Searching for products */ + $result = Db::getInstance()->ExecuteS(' + SELECT DISTINCT p.`id_product`, i.`id_image` + FROM `'._DB_PREFIX_.'product` p + JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.id_product = p.id_product) + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.id_product = p.id_product) + WHERE p.`active` = 1 AND i.id_image IS NOT NULL + GROUP BY p.id_product'); + + foreach ($result AS $k => $row) + { + if (Pack::isPack(intval($row['id_product']))) + continue; + $product = new Product(intval($row['id_product']), true); + + if (Validate::isLoadedObject($product)) + { + $imageObj = new Image($row['id_image']); + $imageObj->id_product = intval($product->id); + $line = array(); + $line[] = $product->manufacturer_name.' - '.$product->name[intval($conf['PS_LANG_DEFAULT'])]; + + $line[] = Tools::getProtocol().$_SERVER['HTTP_HOST']._THEME_PROD_DIR_.$imageObj->getExistingImgPath().'-small.jpg'; + $line[] = Tools::getProtocol().$_SERVER['HTTP_HOST']._THEME_PROD_DIR_.$imageObj->getExistingImgPath().'-thickbox.jpg'; + $line[] = $link->getProductLink(intval($product->id), $product->link_rewrite[intval($conf['PS_LANG_DEFAULT'])], $product->ean13).'&utm_source=criteo&aff=criteo'; + $line[] = str_replace(array("\n", "\r", "\t", '|'), '', strip_tags(html_entity_decode($product->description_short[intval($conf['PS_LANG_DEFAULT'])], ENT_COMPAT, 'UTF-8'))); + + $price = $product->getPrice(true, intval(Product::getDefaultAttribute($product->id))); + + $line[] = number_format($price, 2, '.', ''); + $line[] = number_format($product->getPrice(true, intval(Product::getDefaultAttribute(intval($product->id))), 6, NULL, false, false), 2, '.', ''); + $line[] = $product->getPrice(true, NULL, 2, NULL, true); + $line[] = '1'; + $line[] = '1'; + + $cptXML = 1; + $html .= "\t".'<product id="'.$product->id.'">'."\n"; + foreach ($line AS $column) + { + $html .= "\t\t".'<'.$columns[$cptXML].'>'.$column.'</'.$columns[$cptXML].'>'."\n"; + $cptXML++; + } + $html .= "\t".'</product>'."\n"; + } + } + $html .= '</products>'."\n"; + echo $html; + } + + public function hookProductFooter($params) + { + return '<script type="text/javascript"> + //<![CDATA[ + document.write(\'<div id="cto_se_'.Configuration::get('CRITEO_ID_NORMAL').'_ac" style="display:none">\\ + <div class="ctoWidgetServer">'.Configuration::get('CRITEO_URL_WIDGET').'</div>\\ + <div class="ctoDataType">sendEvent</div>\\ + <div class="ctoParams">wi='.Configuration::get('CRITEO_ID_NORMAL').'&pt1=2&i='.$params['product']->id.'</div>\\ + </div>\'); + //]]> + </script>'; + } + + public function hookProductList($params) + { + $i = 0; + $strproducts = ''; + + if (!isset($params['products']) OR !$params['products']) + return ''; + + foreach ($params['products'] AS $product) + { + if ($i > 2) + break; + + $strproducts .= 'i'.++$i.'='.$product['id_product'].'&'; + } + return '<script type="text/javascript"> + //<![CDATA[ + document.write(\'<div id="cto_tr_'.Configuration::get('CRITEO_ID_NORMAL').'_ac" style="display:none">\\ + <div class="ctoWidgetServer">'.Configuration::get('CRITEO_URL_WIDGET').'</div>\\ + <div class="ctoDataType">sendEvent</div>\\ + <div class="ctoParams">pt1=3&wi='.Configuration::get('CRITEO_ID_NORMAL').'&'.rtrim($strproducts, '&').'</div>\\ + </div>\'); + //]]> + </script>'; + + } + + public function hookShoppingCartExtra($params) + { + foreach ($params['products'] AS $product) + $strproducts .= 'i'.++$i.'='.$product['id_product'].'&p'.$i.'='.$product['price'].'&q'.$i.'='.$product['quantity'].'&'; + + $strproducts = substr($strproducts, 0, -1); + + return '<script type="text/javascript"> + //<![CDATA[ + document.write(\'<div id="cto_tr_'.Configuration::get('CRITEO_ID_CONVERSION').'_ac" style="display:none">\\ + <div class="ctoWidgetServer">'.Configuration::get('CRITEO_URL_WIDGET').'</div>\\ + <div class="ctoDataType">transaction</div>\\ + <div class="ctoParams">wi='.Configuration::get('CRITEO_ID_CONVERSION').'&s=0&'.rtrim($strproducts, '&').'</div>\\ + </div>\'); + //]]> + </script>'; + } + + public function hookOrderConfirmation($params) + { + global $cookie, $country_infos; + $cookie = new Cookie('ps'); + $country_infos = array('id_group' => 0, + 'id_tax' => 1); + $cart = new Cart(intval($params['objOrder']->id_cart)); + $products = $cart->getProducts(); + $strproducts = ''; + $i = 0; + foreach ($products AS $product) + $strproducts .= 'i'.++$i.'='.$product['id_product'].'&p'.$i.'='.$product['price'].'&q'.$i.'='.$product['quantity'].'&'; + + $strproducts = substr($strproducts, 0, -1); + + return '<script type="text/javascript"> + //<![CDATA[ + document.write(\'<div id="cto_tr_'.Configuration::get('CRITEO_ID_CONVERSION').'_ac" style="display:none">\\ + <div class="ctoWidgetServer">'.Configuration::get('CRITEO_URL_WIDGET').'</div>\\ + <div class="ctoDataType">transaction</div>\\ + <div class="ctoParams">wi='.Configuration::get('CRITEO_ID_CONVERSION').'&t='.intval($params['objOrder']->id).'&s=1&'.rtrim($strproducts, '&').'</div>\\ + </div>\'); + //]]> + </script>'; + } + + public function hookHeader($params) + { + return '<script type="text/javascript" src="http://ld2.criteo.com/criteo_ld.js"></script>'; + } + + public function hookHome($params) + { + return '<script type="text/javascript"> + //<![CDATA[ + document.write(\'<div id="cto_se_'.Configuration::get('CRITEO_ID_NORMAL').'_ac" style="display:none">\\ + <div class="ctoWidgetServer">'.Configuration::get('CRITEO_URL_WIDGET').'</div>\\ + <div class="ctoDataType">sendEvent</div>\\ + <div class="ctoParams">wi='.Configuration::get('CRITEO_ID_NORMAL').'&pt1=0&pt2=1</div>\\ + </div>\'); + //]]> + </script>'; + } +} + diff --git a/modules/criteo/de.php b/modules/criteo/de.php new file mode 100644 index 000000000..9c04a9817 --- /dev/null +++ b/modules/criteo/de.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{criteo}prestashop>criteo_0c90fc1c188056486dbb210f25023b8a'] = 'Criteo'; +$_MODULE['<{criteo}prestashop>criteo_dfa5d522cd54e1ef0f94ec2ed4a61419'] = 'Criteo Produkt Export-und Tag-Anzeige'; +$_MODULE['<{criteo}prestashop>criteo_7ccf58c950043c9fbfed668df13ce608'] = 'Die Einstellungen werden aktualisiert'; +$_MODULE['<{criteo}prestashop>criteo_2667504f82250eacbd377f121b5c57e0'] = 'Criteo Export'; +$_MODULE['<{criteo}prestashop>criteo_96814c8ba0e8753f60d3ded7799ac5f8'] = 'Criteo normale Kennung'; +$_MODULE['<{criteo}prestashop>criteo_e60d35bcd2d65206757417532f509366'] = 'Criteo Konversionskennung'; +$_MODULE['<{criteo}prestashop>criteo_2a0b3f9396d21be5b3eb7e3bed1ed495'] = 'URL Widget'; +$_MODULE['<{criteo}prestashop>criteo_a4d3b161ce1309df1c4e25df28694b7b'] = 'Senden'; +$_MODULE['<{criteo}prestashop>criteo_c452f9f8ae244baf28588108f83e0a8a'] = 'Ihre URL, für die Kommunikation mit Criteo:'; + +?> \ No newline at end of file diff --git a/modules/criteo/en.php b/modules/criteo/en.php new file mode 100755 index 000000000..601358d4f --- /dev/null +++ b/modules/criteo/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/criteo/es.php b/modules/criteo/es.php new file mode 100644 index 000000000..9405d12f3 --- /dev/null +++ b/modules/criteo/es.php @@ -0,0 +1,13 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{criteo}prestashop>criteo_0c90fc1c188056486dbb210f25023b8a'] = 'Criteo'; +$_MODULE['<{criteo}prestashop>criteo_dfa5d522cd54e1ef0f94ec2ed4a61419'] = 'Exportación de productos para Criteo e indicación de tags en Front-Office'; +$_MODULE['<{criteo}prestashop>criteo_7ccf58c950043c9fbfed668df13ce608'] = 'Parámetros actualizados'; +$_MODULE['<{criteo}prestashop>criteo_2667504f82250eacbd377f121b5c57e0'] = 'Exportación Criteo'; +$_MODULE['<{criteo}prestashop>criteo_96814c8ba0e8753f60d3ded7799ac5f8'] = 'Login Criteo normal'; +$_MODULE['<{criteo}prestashop>criteo_e60d35bcd2d65206757417532f509366'] = 'Login Criteo conversión'; +$_MODULE['<{criteo}prestashop>criteo_2a0b3f9396d21be5b3eb7e3bed1ed495'] = 'URL de widget'; +$_MODULE['<{criteo}prestashop>criteo_a4d3b161ce1309df1c4e25df28694b7b'] = 'Enviar'; +$_MODULE['<{criteo}prestashop>criteo_c452f9f8ae244baf28588108f83e0a8a'] = 'URL para comunicar a Criteo:'; diff --git a/modules/criteo/export_csv.php b/modules/criteo/export_csv.php new file mode 100755 index 000000000..ea4a8d570 --- /dev/null +++ b/modules/criteo/export_csv.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/../../init.php'); +include_once(dirname(__FILE__).'/criteo.php'); + +if (Tools::getValue('token') != sha1(_COOKIE_KEY_.'exportCriteo')) + die(Tools::displayError('The token is invalid, please check the export url in your module configuration.')); +Criteo::buildCSV(); + +?> diff --git a/modules/criteo/export_xml.php b/modules/criteo/export_xml.php new file mode 100755 index 000000000..aef654ed0 --- /dev/null +++ b/modules/criteo/export_xml.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/../../init.php'); +include_once(dirname(__FILE__).'/criteo.php'); + +if (Tools::getValue('token') != sha1(_COOKIE_KEY_.'exportCriteo')) + die(Tools::displayError('The token is invalid, please check the export url in your module configuration.')); +Criteo::buildXML(); + +?> diff --git a/modules/criteo/fr.php b/modules/criteo/fr.php new file mode 100755 index 000000000..aad78784f --- /dev/null +++ b/modules/criteo/fr.php @@ -0,0 +1,13 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{criteo}prestashop>criteo_0c90fc1c188056486dbb210f25023b8a'] = 'Criteo'; +$_MODULE['<{criteo}prestashop>criteo_dfa5d522cd54e1ef0f94ec2ed4a61419'] = 'Export de produit pour Criteo et l\'affichage des tags en Front Office'; +$_MODULE['<{criteo}prestashop>criteo_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour'; +$_MODULE['<{criteo}prestashop>criteo_2667504f82250eacbd377f121b5c57e0'] = 'Export Criteo'; +$_MODULE['<{criteo}prestashop>criteo_96814c8ba0e8753f60d3ded7799ac5f8'] = 'Identifiant Criteo normal'; +$_MODULE['<{criteo}prestashop>criteo_e60d35bcd2d65206757417532f509366'] = 'Identifiant Criteo conversion'; +$_MODULE['<{criteo}prestashop>criteo_2a0b3f9396d21be5b3eb7e3bed1ed495'] = 'URL du widget'; +$_MODULE['<{criteo}prestashop>criteo_a4d3b161ce1309df1c4e25df28694b7b'] = 'Envoyer'; +$_MODULE['<{criteo}prestashop>criteo_c452f9f8ae244baf28588108f83e0a8a'] = 'URL à communiquer à Criteo:'; diff --git a/modules/criteo/it.php b/modules/criteo/it.php new file mode 100755 index 000000000..b775dfd1a --- /dev/null +++ b/modules/criteo/it.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{criteo}prestashop>criteo_0c90fc1c188056486dbb210f25023b8a'] = 'Criteo'; +$_MODULE['<{criteo}prestashop>criteo_dfa5d522cd54e1ef0f94ec2ed4a61419'] = 'Esportazione di prodotti Criteo e visualizzazione tag'; +$_MODULE['<{criteo}prestashop>criteo_7ccf58c950043c9fbfed668df13ce608'] = 'Impostazioni aggiornate'; +$_MODULE['<{criteo}prestashop>criteo_2667504f82250eacbd377f121b5c57e0'] = 'Export Criteo '; +$_MODULE['<{criteo}prestashop>criteo_96814c8ba0e8753f60d3ded7799ac5f8'] = 'Identificante Criteo normale'; +$_MODULE['<{criteo}prestashop>criteo_e60d35bcd2d65206757417532f509366'] = 'Identificante Criteo conversione '; +$_MODULE['<{criteo}prestashop>criteo_2a0b3f9396d21be5b3eb7e3bed1ed495'] = 'URL Widget'; +$_MODULE['<{criteo}prestashop>criteo_a4d3b161ce1309df1c4e25df28694b7b'] = 'Invia'; +$_MODULE['<{criteo}prestashop>criteo_c452f9f8ae244baf28588108f83e0a8a'] = 'URL da comunicare a Criteo:'; + +?> \ No newline at end of file diff --git a/modules/criteo/logo.gif b/modules/criteo/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..e0a82e824024f6ddb04616d74b5d16c4cbc782cb GIT binary patch literal 176 zcmZ?wbhEHb6krfwc+AW2e<s8K1%m&VEB#+<{C|tf|J|Yg52gJ-S^ocg$Ny_H|KDBp z|Mi*wKi>U^0mXk}&PAz-C8;S2Y57G80Y$0BC5gou`2`G$KUo;L82A}<7=Qp|Is=RI zhLfJF_wHC}<e<QjR&g|u<G_KC#T)%RCIoN=#Jmq-@OI;5mS<HE@M~~8xh{RpU7ekt Y+EU3uZjF~1m+s23VhH#o#K>R`02U`r;{X5v literal 0 HcmV?d00001 diff --git a/modules/crossselling/config.xml b/modules/crossselling/config.xml new file mode 100755 index 000000000..e3363525c --- /dev/null +++ b/modules/crossselling/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>crossselling</name> + <displayName><![CDATA[Cross Selling]]></displayName> + <version><![CDATA[0.1]]></version> + <description><![CDATA[Customers who bought this product also bought:]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/crossselling/crossselling.php b/modules/crossselling/crossselling.php new file mode 100755 index 000000000..07edf5912 --- /dev/null +++ b/modules/crossselling/crossselling.php @@ -0,0 +1,150 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class CrossSelling extends Module +{ + private $_html; + + public function __construct() + { + $this->name = 'crossselling'; + $this->tab = 'front_office_features'; + $this->version = 0.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Cross Selling'); + $this->description = $this->l('Customers who bought this product also bought:'); + + if (!$this->isRegisteredInHook('header')) + $this->registerHook('header'); + } + + public function install() + { + if (!parent::install() OR + !$this->registerHook('productFooter') OR + !$this->registerHook('header') OR + !Configuration::updateValue('CROSSSELLING_DISPLAY_PRICE', 0)) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall() OR + !Configuration::deleteByName('CROSSSELLING_DISPLAY_PRICE')) + return false; + return true; + } + + public function getContent() + { + $this->_html = ''; + if (Tools::isSubmit('submitCross') AND Tools::getValue('displayPrice') != 0 AND Tools::getValue('displayPrice') != 1) + $this->_html .= $this->displayError('Invalid displayPrice'); + elseif (Tools::isSubmit('submitCross')) + { + Configuration::updateValue('CROSSSELLING_DISPLAY_PRICE', (int)Tools::getValue('displayPrice')); + $this->_html .= $this->displayConfirmation($this->l('Settings updated successfully')); + } + $this->_html .= ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Display price on products').'</label> + <div class="margin-form"> + <input type="radio" name="displayPrice" id="display_on" value="1" '.(Configuration::get('CROSSSELLING_DISPLAY_PRICE') ? 'checked="checked" ' : '').'/> + <label class="t" for="display_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="displayPrice" id="display_off" value="0" '.(!Configuration::get('CROSSSELLING_DISPLAY_PRICE') ? 'checked="checked" ' : '').'/> + <label class="t" for="display_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Show the price on the products in the block.').'</p> + </div> + <center><input type="submit" name="submitCross" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $this->_html; + } + + public function hookHeader() + { + Tools::addCSS(($this->_path).'crossselling.css', 'all'); + } + + /** + * Returns module content for left column + */ + public function hookProductFooter($params) + { + global $smarty, $cookie, $link; + + $orders = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT o.id_order + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'order_detail od ON (od.id_order = o.id_order) + WHERE o.valid = 1 AND od.product_id = '.(int)$params['product']->id); + + if (sizeof($orders)) + { + $list = ''; + foreach ($orders AS $order) + $list .= (int)$order['id_order'].','; + $list = rtrim($list, ','); + + $orderProducts = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT od.product_id, pl.name, pl.link_rewrite, p.reference, i.id_image, p.show_price, cl.link_rewrite category, p.ean13 + FROM '._DB_PREFIX_.'order_detail od + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = od.product_id) + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = od.product_id) + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = p.id_category_default) + LEFT JOIN '._DB_PREFIX_.'image i ON (i.id_product = od.product_id) + WHERE od.id_order IN ('.$list.') AND pl.id_lang = '.(int)($cookie->id_lang).' AND cl.id_lang = '.(int)($cookie->id_lang).' + AND od.product_id != '.(int)$params['product']->id.' AND i.cover = 1 AND p.active = 1 + ORDER BY RAND() + LIMIT 10'); + + $taxCalc = Product::getTaxCalculationMethod(); + foreach ($orderProducts AS &$orderProduct) + { + $orderProduct['image'] = $link->getImageLink($orderProduct['link_rewrite'], (int)$orderProduct['product_id'].'-'.(int)$orderProduct['id_image'], 'medium'); + $orderProduct['link'] = $link->getProductLink((int)$orderProduct['product_id'], $orderProduct['link_rewrite'], $orderProduct['category'], $orderProduct['ean13']); + if (Configuration::get('CROSSSELLING_DISPLAY_PRICE') AND ($taxCalc == 0 OR $taxCalc == 2)) + $orderProduct['displayed_price'] = Product::getPriceStatic((int)$orderProduct['product_id'], true, NULL); + elseif (Configuration::get('CROSSSELLING_DISPLAY_PRICE') AND $taxCalc == 1) + $orderProduct['displayed_price'] = Product::getPriceStatic((int)$orderProduct['product_id'], false, NULL); + } + + $smarty->assign(array('orderProducts' => $orderProducts, 'middlePosition_crossselling' => round(sizeof($orderProducts) / 2, 0), + 'crossDisplayPrice' => Configuration::get('CROSSSELLING_DISPLAY_PRICE'))); + } + return $this->display(__FILE__, 'crossselling.tpl'); + } +} \ No newline at end of file diff --git a/modules/crossselling/crossselling.tpl b/modules/crossselling/crossselling.tpl new file mode 100755 index 000000000..10c913460 --- /dev/null +++ b/modules/crossselling/crossselling.tpl @@ -0,0 +1,59 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if isset($orderProducts) && count($orderProducts)} +<div id="crossselling"> + <script type="text/javascript">var middle = {$middlePosition_crossselling};</script> + <script type="text/javascript" src="{$content_dir}modules/crossselling/js/crossselling.js"></script> + <h2 class="productscategory_h2">{l s='Customers who bought this product also bought:' mod='crossselling'}</h2> + <div id="{if count($orderProducts) > 5}crossselling{else}crossselling_noscroll{/if}"> + {if count($orderProducts) > 5}<a id="crossselling_scroll_left" title="{l s='Previous' mod='crossselling'}" href="javascript:{ldelim}{rdelim}">{l s='Previous' mod='crossselling'}</a>{/if} + <div id="crossselling_list"> + <ul {if count($orderProducts) > 5}style="width: {math equation="width * nbImages" width=107 nbImages=$orderProducts|@count}px"{/if}> + {foreach from=$orderProducts item='orderProduct' name=orderProduct} + <li {if count($orderProducts) < 6}style="width: {math equation="width / nbImages" width=94 nbImages=$orderProducts|@count}%"{/if}> + <a href="{$orderProduct.link}" title="{$orderProduct.name|htmlspecialchars}"> + <img src="{$orderProduct.image}" alt="{$orderProduct.name|htmlspecialchars}" /> + </a><br/> + <a href="{$orderProduct.link}" title="{$orderProduct.name|htmlspecialchars}"> + {$orderProduct.name|truncate:15:'...'|escape:'htmlall':'UTF-8'} + </a><br /> + {if $crossDisplayPrice AND $orderProduct.show_price == 1 AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE} + <span class="price_display"> + <span class="price">{convertPrice price=$orderProduct.displayed_price}</span> + </span><br /> + {else} + <br /> + {/if} + <a title="{l s='View' mod='crossselling'}" href="{$orderProduct.link}" class="button_small">{l s='View' mod='crossselling'}</a><br /> + </li> + {/foreach} + </ul> + </div> + {if count($orderProducts) > 5}<a id="crossselling_scroll_right" title="{l s='Next' mod='crossselling'}" href="javascript:{ldelim}{rdelim}">{l s='Next' mod='crossselling'}</a>{/if} + </div> +</div> +{/if} diff --git a/modules/crossselling/de.php b/modules/crossselling/de.php new file mode 100644 index 000000000..793a76e2e --- /dev/null +++ b/modules/crossselling/de.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{crossselling}prestashop>crossselling_ef2b66b0b65479e08ff0cce29e19d006'] = 'Kunden, die dieses Produkt gekauft haben, kauften auch ...'; +$_MODULE['<{crossselling}prestashop>crossselling_dd1f775e443ff3b9a89270713580a51b'] = 'Kunden, die dieses Produkt gekauft haben, kauften auch:'; +$_MODULE['<{crossselling}prestashop>crossselling_4351cfebe4b61d8aa5efa1d020710005'] = 'Zurück'; +$_MODULE['<{crossselling}prestashop>crossselling_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Weiter'; +$_MODULE['<{crossselling}prestashop>crossselling_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Cross-Selling'; +$_MODULE['<{crossselling}prestashop>crossselling_462390017ab0938911d2d4e964c0cab7'] = 'Einstellungen erfolgreich aktualisiert'; +$_MODULE['<{crossselling}prestashop>crossselling_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{crossselling}prestashop>crossselling_b6bf131edd323320bac67303a3f4de8a'] = 'Preis auf Produkten anzeigen '; +$_MODULE['<{crossselling}prestashop>crossselling_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{crossselling}prestashop>crossselling_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{crossselling}prestashop>crossselling_70f9a895dc3273d34a7f6d14642708ec'] = 'Preise auf den Produkten im Block anzeigen.'; +$_MODULE['<{crossselling}prestashop>crossselling_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/crossselling/en.php b/modules/crossselling/en.php new file mode 100755 index 000000000..41097ebdc --- /dev/null +++ b/modules/crossselling/en.php @@ -0,0 +1,5 @@ +<?php + +global $_MODULE; +$_MODULE = array(); + diff --git a/modules/crossselling/es.php b/modules/crossselling/es.php new file mode 100644 index 000000000..985f55cc6 --- /dev/null +++ b/modules/crossselling/es.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{crossselling}prestashop>crossselling_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Ventas cruzadas'; +$_MODULE['<{crossselling}prestashop>crossselling_ef2b66b0b65479e08ff0cce29e19d006'] = 'Los clientes que compraron este producto también han comprado...'; +$_MODULE['<{crossselling}prestashop>crossselling_462390017ab0938911d2d4e964c0cab7'] = 'Actualización de los parámetros'; +$_MODULE['<{crossselling}prestashop>crossselling_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{crossselling}prestashop>crossselling_b6bf131edd323320bac67303a3f4de8a'] = 'Mostrar el precio del producto'; +$_MODULE['<{crossselling}prestashop>crossselling_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{crossselling}prestashop>crossselling_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{crossselling}prestashop>crossselling_70f9a895dc3273d34a7f6d14642708ec'] = 'Mostrar el precio del producto en el bloque'; +$_MODULE['<{crossselling}prestashop>crossselling_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{crossselling}prestashop>crossselling_dd1f775e443ff3b9a89270713580a51b'] = 'Los clientes que compraron este producto también han comprado:'; +$_MODULE['<{crossselling}prestashop>crossselling_4351cfebe4b61d8aa5efa1d020710005'] = 'Anterior'; +$_MODULE['<{crossselling}prestashop>crossselling_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Siguiente'; diff --git a/modules/crossselling/fr.php b/modules/crossselling/fr.php new file mode 100755 index 000000000..02c4d5ea0 --- /dev/null +++ b/modules/crossselling/fr.php @@ -0,0 +1,16 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{crossselling}prestashop>crossselling_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Ventes croisées'; +$_MODULE['<{crossselling}prestashop>crossselling_ef2b66b0b65479e08ff0cce29e19d006'] = 'Les clients qui ont acheté ce produit ont également acheté...'; +$_MODULE['<{crossselling}prestashop>crossselling_462390017ab0938911d2d4e964c0cab7'] = 'Paramètres mis à jour'; +$_MODULE['<{crossselling}prestashop>crossselling_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{crossselling}prestashop>crossselling_b6bf131edd323320bac67303a3f4de8a'] = 'Afficher le prix du produit'; +$_MODULE['<{crossselling}prestashop>crossselling_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{crossselling}prestashop>crossselling_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{crossselling}prestashop>crossselling_70f9a895dc3273d34a7f6d14642708ec'] = 'Afficher le prix du produit dans le block'; +$_MODULE['<{crossselling}prestashop>crossselling_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{crossselling}prestashop>crossselling_dd1f775e443ff3b9a89270713580a51b'] = 'Précédent'; +$_MODULE['<{crossselling}prestashop>crossselling_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{crossselling}prestashop>crossselling_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Suivant'; diff --git a/modules/crossselling/it.php b/modules/crossselling/it.php new file mode 100644 index 000000000..1bedfdede --- /dev/null +++ b/modules/crossselling/it.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{crossselling}prestashop>crossselling_ef2b66b0b65479e08ff0cce29e19d006'] = 'I clienti che hanno acquistato questo prodotto hanno anche comprato ...'; +$_MODULE['<{crossselling}prestashop>crossselling_dd1f775e443ff3b9a89270713580a51b'] = 'I clienti che hanno acquistato questo prodotto hanno acquistato anche:'; +$_MODULE['<{crossselling}prestashop>crossselling_4351cfebe4b61d8aa5efa1d020710005'] = 'Precedente'; +$_MODULE['<{crossselling}prestashop>crossselling_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Successivo'; +$_MODULE['<{crossselling}prestashop>crossselling_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Vendita incrociata'; +$_MODULE['<{crossselling}prestashop>crossselling_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{crossselling}prestashop>crossselling_b6bf131edd323320bac67303a3f4de8a'] = 'Mostra prezzo sui prodotti'; +$_MODULE['<{crossselling}prestashop>crossselling_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{crossselling}prestashop>crossselling_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{crossselling}prestashop>crossselling_70f9a895dc3273d34a7f6d14642708ec'] = 'Mostra il prezzo sui prodotti nel blocco.'; +$_MODULE['<{crossselling}prestashop>crossselling_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/crossselling/js/crossselling.js b/modules/crossselling/js/crossselling.js new file mode 100755 index 000000000..757be17b0 --- /dev/null +++ b/modules/crossselling/js/crossselling.js @@ -0,0 +1,65 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +var cs_serialScrollNbImagesDisplayed; +var cs_serialScrollNbImages; +var cs_serialScrollActualImagesIndex; + +function cs_serialScrollFixLock(event, targeted, scrolled, items, position) +{ + serialScrollNbImages = $('#crossselling_list li:visible').length; + serialScrollNbImagesDisplayed = 5; + + var leftArrow = position == 0 ? true : false; + var rightArrow = position + serialScrollNbImagesDisplayed >= serialScrollNbImages ? true : false; + + $('a#crossselling_scroll_left').css('cursor', leftArrow ? 'default' : 'pointer').css('display', leftArrow ? 'none' : 'block').fadeTo(0, leftArrow ? 0 : 1); + $('a#crossselling_scroll_right').css('cursor', rightArrow ? 'default' : 'pointer').fadeTo(0, rightArrow ? 0 : 1).css('display', rightArrow ? 'none' : 'block'); + return true; +} + +$(document).ready(function(){ + //init the serialScroll for thumbs + cs_serialScrollNbImages = $('#crossselling_list li').length; + cs_serialScrollNbImagesDisplayed = 5; + cs_serialScrollActualImagesIndex = 0; + $('#crossselling_list').serialScroll({ + items:'li', + prev:'a#crossselling_scroll_left', + next:'a#crossselling_scroll_right', + axis:'x', + offset:0, + stop:true, + onBefore:cs_serialScrollFixLock, + duration:300, + step: 1, + lazy:true, + lock: false, + force:false, + cycle:false + }); + $('#crossselling_list').trigger( 'goto', [middle-3] ); +}); diff --git a/modules/crossselling/logo.gif b/modules/crossselling/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..291bfc764709a7e595050c1ed43b675f7af29c56 GIT binary patch literal 731 zcmV<10wn#3P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!ZAnByR5;6} zlg&$%Q5431?>IABYLga|n=&i1C^Ll$f?5eeicnA#1rn`Vw5g!~Ai_;Six%mol@YXv zpr{DSk_4&HqEGXqMs21Urx~61zW2TFJuNiKk5=8qxp3h5o#%3&<A@0VbHV^Ja!*YD z2O=6VJ`(td(TMSozyn_q7=;)Yd`0Zg4QD<eFhsT=T|^fF2j&VOFm>zLVh3I}!7>rV zy0cveL@eMS{2@4@V#Ifsc!DulJ&DQpf%Op4v$xe?6=D@)U81WGV*SDrfWQL`Vikx# zC;D5g5L>`a_LDBIB75he%=~zQqY~|505hGQwLEXKi?wPF;-YiIct4j@Rd<3|O#|8C zTHZhC><9zcK%qYMV7$)|Xb?l7a+FlZ5nDj##-OBu%J?oaL+^+>n(`G@l&xA93j+jh z8k0*<w(~e(v3ivJtD8trz@PaB#XE@AG~-Ql6J72w`uaV-(rM*R?+pPsBKXMxrXHOq zD13sz$BK`a|B8gS65H5<8o!PcnIckFPDx?tyPunA+I8mk$I$QpF5lgbpG}c{dKoJ| zne;f?ZXvd*4VAb?DB`1Y>q$O-j?Nca8_zy`4G;prD4e1YrH!W$vy!p<UD%a-h;M5_ zPj*ri6}((Esb~E}QhjVb*Vn%w2a2itR}iBZOJ*o*Y{N*LiNUK>#G|OpS~5?22&Z3S zwVIa$XW=s4>S&U~r@Q#jeV*}=UW(V%W0I-yifB=D-Gvu#7REiau<_yZq|tBhQd7T= z($ZQI{e#oW)d!XmFX`aO{z|uT!<z8!tu;u*>vfZ<ldYEqzWi&Qe*wVTa_}14^jH7@ N002ovPDHLkV1m}kQ7-@h literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/beforeCarrier.tpl b/modules/dateofdelivery/beforeCarrier.tpl new file mode 100644 index 000000000..d04c21565 --- /dev/null +++ b/modules/dateofdelivery/beforeCarrier.tpl @@ -0,0 +1,67 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $datesDelivery|count} + <script type="text/javascript"> + {literal} + var datesDelivery = new Array(); + {/literal} + {foreach from=$datesDelivery item=date key=k} + {if $date} + datesDelivery[{$k}] = new Array(); + datesDelivery[{$k}]['minimal'] = "{$date.0}"; + datesDelivery[{$k}]['maximal'] = "{$date.1}"; + {/if} + {/foreach} + {literal} + + $(function(){ + if (datesDelivery[{/literal}{$id_carrier}{literal}] != undefined) + { + $('span#minimal').html('<b>'+datesDelivery[{/literal}{$id_carrier}{literal}]['minimal']+'</b>'); + $('span#maximal').html('<b>'+datesDelivery[{/literal}{$id_carrier}{literal}]['maximal']+'</b>'); + } + else + $('p#dateofdelivery').hide(); + + $('input[name=id_carrier]').click(function(){ + if (datesDelivery[$(this).val()] != undefined) + { + $('p#dateofdelivery').show(); + $('span#minimal').html('<b>'+datesDelivery[$(this).val()]['minimal']+'</b>'); + $('span#maximal').html('<b>'+datesDelivery[$(this).val()]['maximal']+'</b>'); + } + else + $('p#dateofdelivery').hide(); + }); + }); + {/literal} + </script> + + <br /> + <p id="dateofdelivery">{l s='Approximate date of delivery with this carrier is between' mod='dateofdelivery'} <span id="minimal"></span> {l s='and' mod='dateofdelivery'} <span id="maximal"></span> <sup>*</sup></p> + <p style="font-size:10px;margin:0padding:0;"><sup>*</sup> {l s='with direct payment methods (e.g: credit card)' mod='dateofdelivery'}</p> +{/if} \ No newline at end of file diff --git a/modules/dateofdelivery/config.xml b/modules/dateofdelivery/config.xml new file mode 100755 index 000000000..3a7570dc9 --- /dev/null +++ b/modules/dateofdelivery/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>dateofdelivery</name> + <displayName><![CDATA[Date of delivery]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Displays an approximate date of delivery]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[shipping_logistics]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/dateofdelivery/dateofdelivery.php b/modules/dateofdelivery/dateofdelivery.php new file mode 100644 index 000000000..038a18be6 --- /dev/null +++ b/modules/dateofdelivery/dateofdelivery.php @@ -0,0 +1,527 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class DateOfDelivery extends Module +{ + private $_html = ''; + + public function __construct() + { + $this->name = 'dateofdelivery'; + $this->tab = 'shipping_logistics'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Date of delivery'); + $this->description = $this->l('Displays an approximate date of delivery'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('beforeCarrier') OR !$this->registerHook('orderDetailDisplayed')) + return false; + + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'dateofdelivery_carrier_rule` ( + `id_carrier_rule` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + `id_carrier` INT NOT NULL, + `minimal_time` INT NOT NULL, + `maximal_time` INT NOT NULL, + `delivery_saturday` TINYINT(1) NOT NULL, + `delivery_sunday` TINYINT(1) NOT NULL + ) ENGINE ='._MYSQL_ENGINE_.'; + ')) + return false; + + Configuration::updateValue('DOD_EXTRA_TIME_PRODUCT_OOS', 0); + Configuration::updateValue('DOD_EXTRA_TIME_PREPARATION', 1); + Configuration::updateValue('DOD_PREPARATION_SATURDAY', 1); + Configuration::updateValue('DOD_PREPARATION_SUNDAY', 1); + Configuration::updateValue('DOD_DATE_FORMAT', 'l j F Y'); + + return true; + } + + public function uninstall() + { + Configuration::deleteByName('DOD_EXTRA_TIME_PRODUCT_OOS'); + Configuration::deleteByName('DOD_EXTRA_TIME_PREPARATION'); + Configuration::deleteByName('DOD_PREPARATION_SATURDAY'); + Configuration::deleteByName('DOD_PREPARATION_SUNDAY'); + Configuration::deleteByName('DOD_DATE_FORMAT'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'dateofdelivery_carrier_rule`'); + + return parent::uninstall(); + } + + public function getContent() + { + $this->_html .= '<h2>'.$this->l('Date of delivery configuration').'</h2>'; + + $this->_postProcess(); + if (Tools::isSubmit('addCarrierRule') OR (Tools::isSubmit('editCarrierRule') AND Tools::isSubmit('id_carrier_rule'))) + $this->_setCarrierRuleForm(); + else + $this->_setConfigurationForm(); + + return $this->_html; + } + + public function hookBeforeCarrier($params) + { + global $smarty; + + if (!sizeof($params['carriers'])) + return false; + + $oos = false; // For out of stock management + foreach ($params['cart']->getProducts() as $product) + if ($product['quantity'] <= 0 OR ($product['quantity_attribute'] <= 0 AND $product['id_product_attribute'])) + $oos = true; + + $datesDelivery = array(); + foreach ($params['carriers'] as $carrier) + $datesDelivery[(int)($carrier['id_carrier'])] = $this->_getDatesOfDelivery((int)($carrier['id_carrier']), $oos); + + $smarty->assign(array( + 'datesDelivery' => $datesDelivery, + 'id_carrier' => ($params['cart']->id_carrier ? (int)($params['cart']->id_carrier) : (int)(Configuration::get('PS_CARRIER_DEFAULT'))) + )); + + return $this->display(__FILE__, 'beforeCarrier.tpl'); + } + + public function hookOrderDetailDisplayed($params) + { + global $smarty; + + $oos = false; // For out of stock management + foreach ($params['order']->getProducts() as $product) + if ($product['product_quantity_in_stock'] < 1) + $oos = true; + + $datesDelivery = array(); + $datesDelivery = $this->_getDatesOfDelivery((int)($params['order']->id_carrier), $oos, $params['order']->date_add); + + if (!is_array($datesDelivery) OR !sizeof($datesDelivery)) + return ; + + $smarty->assign('datesDelivery', $datesDelivery); + + return $this->display(__FILE__, 'orderDetail.tpl'); + } + + private function _postProcess() + { + global $currentIndex; + + $errors = array(); + if (Tools::isSubmit('submitMoreOptions')) + { + if (Tools::getValue('date_format') == '' OR !Validate::isCleanHtml(Tools::getValue('date_format'))) + $errors[] = $this->l('Date format is invalid'); + + if (!sizeof($errors)) + { + Configuration::updateValue('DOD_EXTRA_TIME_PRODUCT_OOS', (int)(Tools::getValue('extra_time_product_oos'))); + Configuration::updateValue('DOD_EXTRA_TIME_PREPARATION', (int)(Tools::getValue('extra_time_preparation'))); + Configuration::updateValue('DOD_PREPARATION_SATURDAY', (int)(Tools::isSubmit('preparation_saturday'))); + Configuration::updateValue('DOD_PREPARATION_SUNDAY', (int)(Tools::isSubmit('preparation_sunday'))); + Configuration::updateValue('DOD_DATE_FORMAT', Tools::getValue('date_format')); + $this->_html .= $this->displayConfirmation($this->l('Settings are updated')); + } + else + $this->_html .= $this->displayError(implode('<br />', $errors)); + } + + if (Tools::isSubmit('submitCarrierRule')) + { + if (!Validate::isUnsignedInt(Tools::getValue('minimal_time'))) + $errors[] = $this->l('Minimum time is invalid'); + if (!Validate::isUnsignedInt(Tools::getValue('maximal_time'))) + $errors[] = $this->l('Maximum time is invalid'); + if (($carrier = new Carrier((int)(Tools::getValue('id_carrier')))) AND !Validate::isLoadedObject($carrier)) + $errors[] = $this->l('Carrier is invalid'); + if ($this->_isAlreadyDefinedForCarrier((int)($carrier->id), (int)(Tools::getValue('id_carrier_rule', 0)))) + $errors[] = $this->l('You cannot use this carrier, a rule has already been saved.'); + + if (!sizeof($errors)) + { + if (Tools::isSubmit('addCarrierRule')) + { + if (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'dateofdelivery_carrier_rule`(`id_carrier`, `minimal_time`, `maximal_time`, `delivery_saturday`, `delivery_sunday`) + VALUES ('.(int)($carrier->id).', '.(int)(Tools::getValue('minimal_time')).', '.(int)(Tools::getValue('maximal_time')).', '.(int)(Tools::isSubmit('delivery_saturday')).', '.(int)(Tools::isSubmit('delivery_sunday')).') + ')) + Tools::redirectAdmin($currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&confirmAddCarrierRule'); + else + $this->_html .= $this->displayError($this->l('An error occurred on adding of carrier rule.')); + } + else + { + if (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'dateofdelivery_carrier_rule` + SET `id_carrier` = '.(int)($carrier->id).', `minimal_time` = '.(int)(Tools::getValue('minimal_time')).', `maximal_time` = '.(int)(Tools::getValue('maximal_time')).', `delivery_saturday` = '.(int)(Tools::isSubmit('delivery_saturday')).', `delivery_sunday` = '.(int)(Tools::isSubmit('delivery_sunday')).' + WHERE `id_carrier_rule` = '.(int)(Tools::getValue('id_carrier_rule')) + )) + Tools::redirectAdmin($currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&confirmEditCarrierRule'); + else + $this->_html .= $this->displayError($this->l('An error occurred on updating of carrier rule.')); + } + + } + else + $this->_html .= $this->displayError(implode('<br />', $errors)); + } + + if (Tools::isSubmit('deleteCarrierRule') AND Tools::isSubmit('id_carrier_rule') AND (int)(Tools::getValue('id_carrier_rule')) AND $this->_isCarrierRuleExists((int)(Tools::getValue('id_carrier_rule')))) + { + $this->_deleteByIdCarrierRule((int)(Tools::getValue('id_carrier_rule'))); + $this->_html .= $this->displayConfirmation($this->l('Carrier rule deleted successfully')); + } + + if (Tools::isSubmit('confirmAddCarrierRule')) + $this->_html = $this->displayConfirmation($this->l('Carrier rule added successfully')); + + if (Tools::isSubmit('confirmEditCarrierRule')) + $this->_html = $this->displayConfirmation($this->l('Carrier rule updated successfully')); + } + + private function _setConfigurationForm() + { + global $currentIndex; + + $this->_html .= ' + <fieldset> + <legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/time.png" alt="" /> '.$this->l('Carrier configuration').'</legend> + + <p><a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&addCarrierRule"><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/time_add.png" alt="" /> '.$this->l('Add a new carrier rule').'</a></p> + + <h3>'.$this->l('List of carrier rules').'</h3>'; + + $carrier_rules = $this->_getCarrierRulesWithCarrierName(); + if (sizeof($carrier_rules)) + { + $this->_html .= '<table width="100%" class="table" cellspacing="0" cellpadding="0"> + <thead> + <tr> + <th width="30%"><b>'.$this->l('Name of carrier').'</b></th> + <th width="40%" class="center"><b>'.$this->l('Delivery between').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Saturday delivery').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Sunday delivery').'</b></th> + <th width="10%" class="center"><b>'.$this->l('Actions').'</b></th> + </tr> + </thead> + <tbody> + '; + + foreach ($carrier_rules as $rule) + { + $this->_html .= ' + <tr> + <td width="30%">'.(!preg_match('/^0$/Ui', $rule['name']) ? htmlentities($rule['name'], ENT_QUOTES, 'UTF-8') : Configuration::get('PS_SHOP_NAME')).'</td> + <td width="40%" class="center"><b>'.(int)($rule['minimal_time']).'</b> '.$this->l('day(s) and').' <b>'.(int)($rule['maximal_time']).'</b> '.$this->l('day(s)').'</td> + <td width="10%" class="center">'; + + if ($rule['delivery_saturday']) + $this->_html .= '<img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/tick.png" alt="'.$this->l('Yes').'" title="'.$this->l('Yes').'" />'; + else + $this->_html .= '<img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/cross.png" alt="'.$this->l('No').'" title="'.$this->l('No').'" />'; + $this->_html .=' + </td> + <td width="10%" class="center">'; + + if ($rule['delivery_sunday']) + $this->_html .= '<img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/tick.png" alt="'.$this->l('Yes').'" title="'.$this->l('Yes').'" />'; + else + $this->_html .= '<img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/cross.png" alt="'.$this->l('No').'" title="'.$this->l('No').'" />'; + $this->_html .= ' + </td> + <td width="10%" class="center"> + <a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&editCarrierRule&id_carrier_rule='.(int)($rule['id_carrier_rule']).'" title="'.$this->l('Edit').'"><img src="'._PS_ADMIN_IMG_.'edit.gif" alt="" /></a> + <a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&deleteCarrierRule&id_carrier_rule='.(int)($rule['id_carrier_rule']).'" title="'.$this->l('Delete').'"><img src="'._PS_ADMIN_IMG_.'delete.gif" alt="" /></a> + </td> + </tr>'; + } + + $this->_html .= ' + </tbody> + </table>'; + } + else + $this->_html .= '<p class="center">'.$this->l('No carrier rule').'</p>'; + + $this->_html .= ' + </fieldset> + <br /> + <form method="POST" action="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'"> + <fieldset style="width:500px;"> + <legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/time.png" alt="" /> '.$this->l('More options').'</legend> + + <label for="extra_time_product_oos">'.$this->l('Extra time when a product is out of stock').'</label> + <div class="margin-form"> + <input type="text" name="extra_time_product_oos" id="extra_time_product_oos" value="'.(int)(Tools::getValue('extra_time_product_oos', Configuration::get('DOD_EXTRA_TIME_PRODUCT_OOS'))).'" size="2" /> '.$this->l('day(s)').' + </div> + <div class="clear"></div> + <label for="extra_time_preparation">'.$this->l('Extra time for preparation of the order').'</label> + <div class="margin-form"> + <input type="text" name="extra_time_preparation" id="extra_time_preparation" value="'.(int)(Tools::getValue('extra_time_preparation', Configuration::get('DOD_EXTRA_TIME_PREPARATION'))).'" size="2" /> '.$this->l('day(s)').' + </div> + <div class="clear"></div> + <label>'.$this->l('Preparation option').'</label> + <div class="margin-form"> + <ul style="list-style-type:none;margin:0;padding:0;"> + <li><input type="checkbox" name="preparation_saturday" id="preparation_saturday" '.(Configuration::get('DOD_PREPARATION_SATURDAY') ? 'checked="checked"' : '').' /> <label class="t" for="preparation_saturday">'.$this->l('Saturday preparation').'</label></li> + <li><input type="checkbox" name="preparation_sunday" id="preparation_sunday" '.(Configuration::get('DOD_PREPARATION_SUNDAY') ? 'checked="checked"' : '').' /> <label class="t" for="preparation_sunday">'.$this->l('Sunday preparation').'</label></li> + </ul> + </div> + <label for="date_format">'.$this->l('Date format:').'</label> + <div class="margin-form"> + <input type="text" name="date_format" id="date_format" value="'.htmlentities(Tools::getValue('date_format', Configuration::get('DOD_DATE_FORMAT')), ENT_QUOTES, 'UTF-8').'" size="10" /> + <p>'.$this->l('You can see all parameters available at:').' <a href="http://www.php.net/manual/en/function.date.php" target="_blank">http://www.php.net/manual/en/function.date.php</a></p> + </div> + <p class="center"><input type="submit" class="button" name="submitMoreOptions" value="'.$this->l('Save').'" /></p> + </fieldset> + </form> + '; + } + + private function _setCarrierRuleForm() + { + global $currentIndex, $cookie; + + $carriers = Carrier::getCarriers((int)($cookie->id_lang), true , false,false, NULL, ALL_CARRIERS); + if (Tools::isSubmit('editCarrierRule') AND $this->_isCarrierRuleExists((int)(Tools::getValue('id_carrier_rule')))) + $carrier_rule = $this->_getCarrierRule((int)(Tools::getValue('id_carrier_rule'))); + + $this->_html .= ' + <form method="POST" action="'.$_SERVER['REQUEST_URI'].'"> + '; + + if (isset($carrier_rule) AND $carrier_rule['id_carrier_rule']) + $this->_html .= '<input type="hidden" name="id_carrier_rule" value="'.(int)($carrier_rule['id_carrier_rule']).'" />'; + $this->_html .= ' + <fieldset> + '; + + if (Tools::isSubmit('addCarrierRule')) + $this->_html .= '<legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/time_add.png" alt="" /> '.$this->l('New carrier rule').'</legend>'; + elseif (Tools::isSubmit('editCarrierRule')) + $this->_html .= '<legend><img src="'._PS_BASE_URL_.__PS_BASE_URI__.'modules/'.$this->name.'/img/time_add.png" alt="" /> '.$this->l('Edit carrier rule').'</legend>'; + + $this->_html .= ' + <label for="id_carrier">'.$this->l('Carrier:').'</label> + <div class="margin-form"> + <select name="id_carrier" id="id_carrier"> + <option>'.$this->l('Choose').'</option>'; + foreach ($carriers as $carrier) + $this->_html .= '<option value="'.$carrier['id_carrier'].'" '.((Tools::isSubmit('id_carrier') AND Tools::getValue('id_carrier') == $carrier['id_carrier']) ? 'selected="selected"' : ((isset($carrier_rule) AND $carrier_rule['id_carrier'] == $carrier['id_carrier']) ? 'selected="selected"' : '')).'>'.htmlentities($carrier['name'].' | '.$carrier['delay'], ENT_QUOTES, 'UTF-8').'</option>'; + + $this->_html .= ' + </select> + </div> + + <label>'.$this->l('Delivery between').'</label> + <div class="margin-form"> + <input type="text" name="minimal_time" value="'.htmlentities(Tools::getValue('minimal_time', ((isset($carrier_rule) AND $carrier_rule['minimal_time']) ? $carrier_rule['minimal_time'] : 0)), ENT_QUOTES, 'UTF-8').'" size="2" /> '.$this->l('day(s) and').' + <input type="text" name="maximal_time" value="'.htmlentities(Tools::getValue('maximal_time', ((isset($carrier_rule) AND $carrier_rule['maximal_time']) ? $carrier_rule['maximal_time'] : 0)), ENT_QUOTES, 'UTF-8').'" size="2" /> '.$this->l('day(s)').' + </div> + + <label>'.$this->l('Delivery options:').'</label> + <div class="margin-form"> + <ul style="list-style-type:none;margin:0;padding:0;"> + <li><input type="checkbox" name="delivery_saturday" id="delivery_saturday" '.(Tools::isSubmit('delivery_saturday') ? 'checked="checked"' : ((isset($carrier_rule) AND $carrier_rule['delivery_saturday']) ? 'checked="checked"' : '')).' /> <label class="t" for="delivery_saturday">'.$this->l('Saturday delivery').'</label></li> + <li><input type="checkbox" name="delivery_sunday" id="delivery_sunday" '.(Tools::isSubmit('delivery_sunday') ? 'checked="checked"' : ((isset($carrier_rule) AND $carrier_rule['delivery_sunday']) ? 'checked="checked"' : '')).' /> <label class="t" for="delivery_sunday">'.$this->l('Sunday delivery').'</label></li> + </ul> + </div> + + <p class="center"><input type="submit" class="button" name="submitCarrierRule" value="'.$this->l('Save').'" /></p> + <p class="center"><a href="'.$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'">'.$this->l('Cancel').'</a></p> + '; + + $this->_html .= ' + </fieldset> + </form> + '; + } + + private function _getCarrierRulesWithCarrierName() + { + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` dcr + LEFT JOIN `'._DB_PREFIX_.'carrier` c ON (c.`id_carrier` = dcr.`id_carrier`) + '); + } + + private function _getCarrierRule($id_carrier_rule) + { + if (!(int)($id_carrier_rule)) + return false; + return Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` + WHERE `id_carrier_rule` = '.(int)($id_carrier_rule) + ); + } + + private function _getCarrierRuleWithIdCarrier($id_carrier) + { + if (!(int)($id_carrier)) + return false; + return Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` + WHERE `id_carrier` = '.(int)($id_carrier) + ); + } + + private function _isCarrierRuleExists($id_carrier_rule) + { + if (!(int)($id_carrier_rule)) + return false; + return (bool)Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` + WHERE `id_carrier_rule` = '.(int)($id_carrier_rule) + ); + } + + private function _deleteByIdCarrierRule($id_carrier_rule) + { + if (!(int)($id_carrier_rule)) + return false; + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` + WHERE `id_carrier_rule` = '.(int)($id_carrier_rule) + ); + } + + private function _isAlreadyDefinedForCarrier($id_carrier, $id_carrier_rule = 0) + { + if (!(int)($id_carrier)) + return false; + return (bool)Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'dateofdelivery_carrier_rule` + WHERE `id_carrier` = '.(int)($id_carrier).' + '.((int)$id_carrier_rule != 0 ? 'AND `id_carrier_rule` != '.(int)($id_carrier_rule) : '')); + } + + private function _getDatesOfDelivery($id_carrier, $product_oos = false, $date = null) + { + if (!(int)($id_carrier)) + return false; + $carrier_rule = $this->_getCarrierRuleWithIdCarrier((int)($id_carrier)); + if (empty($carrier_rule)) + return false; + + if ($date != null AND Validate::isDate($date)) + $date_now = strtotime($date); + else + $date_now = time(); // Date on timestamp format + if ($product_oos) + $date_now += Configuration::get('DOD_EXTRA_TIME_PRODUCT_OOS') * 24 * 3600; + if (!Configuration::get('DOD_PREPARATION_SATURDAY') AND date('l', $date_now) == 'Saturday') + $date_now += 24 * 3600; + if (!Configuration::get('DOD_PREPARATION_SUNDAY') AND date('l', $date_now) == 'Sunday') + $date_now += 24 * 3600; + + $date_minimal_time = $date_now + ($carrier_rule['minimal_time'] * 24 * 3600) + (Configuration::get('DOD_EXTRA_TIME_PREPARATION') * 24 * 3600); + $date_maximal_time = $date_now + ($carrier_rule['maximal_time'] * 24 * 3600) + (Configuration::get('DOD_EXTRA_TIME_PREPARATION') * 24 * 3600); + + if (!$carrier_rule['delivery_saturday'] AND date('l', $date_minimal_time) == 'Saturday') + { + $date_minimal_time += 24 * 3600; + $date_maximal_time += 24 * 3600; + } + if (!$carrier_rule['delivery_saturday'] AND date('l', $date_maximal_time) == 'Saturday') + $date_maximal_time += 24 * 3600; + + if (!$carrier_rule['delivery_sunday'] AND date('l', $date_minimal_time) == 'Sunday') + { + $date_minimal_time += 24 * 3600; + $date_maximal_time += 24 * 3600; + } + if (!$carrier_rule['delivery_sunday'] AND date('l', $date_maximal_time) == 'Sunday') + $date_maximal_time += 24 * 3600; + + /* + $this->l('Sunday'); + $this->l('Monday'); + $this->l('Tuesday'); + $this->l('Wednesday'); + $this->l('Thursday'); + $this->l('Friday'); + $this->l('Saturday'); + + $this->l('January'); + $this->l('February'); + $this->l('March'); + $this->l('April'); + $this->l('May'); + $this->l('June'); + $this->l('July'); + $this->l('August'); + $this->l('September'); + $this->l('October'); + $this->l('November'); + $this->l('December'); + */ + + $date_minimal_string = ''; + $date_maximal_string = ''; + $date_format = preg_split('/([a-z])/Ui', Configuration::get('DOD_DATE_FORMAT'), NULL, PREG_SPLIT_DELIM_CAPTURE); + foreach ($date_format as $elmt) + { + if ($elmt == 'l' OR $elmt == 'F') + { + $date_minimal_string .= $this->l(date($elmt, $date_minimal_time)); + $date_maximal_string .= $this->l(date($elmt, $date_maximal_time)); + } + elseif (preg_match('/[a-z]/Ui', $elmt)) + { + $date_minimal_string .= date($elmt, $date_minimal_time); + $date_maximal_string .= date($elmt, $date_maximal_time); + } + else + { + $date_minimal_string .= $elmt; + $date_maximal_string .= $elmt; + } + } + return array( + $date_minimal_string, + $date_maximal_string + ); + } +} \ No newline at end of file diff --git a/modules/dateofdelivery/de.php b/modules/dateofdelivery/de.php new file mode 100644 index 000000000..5e068b9b2 --- /dev/null +++ b/modules/dateofdelivery/de.php @@ -0,0 +1,75 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_75261aaef97717dda0ca98743b24f8f3'] = 'Ungefähres Zustelldamit mit diesem Versender ist zwischen'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_be5d5d37542d75f93a87094459f76678'] = 'und'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_b7ab10d227790bd29e51c1845153f126'] = 'mit direkten Zahlungsmethoden (z.B. Kreditkarte)'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_8e8fe67c419e34287373a91cc6cab1de'] = 'Ungefähres Zustelldamit ist zwischen'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_be5d5d37542d75f93a87094459f76678'] = 'und'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_b7ab10d227790bd29e51c1845153f126'] = 'mit direkten Zahlungsmethoden (z.B. Kreditkarte)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b0f76e26cffaf27784d901a64f39593e'] = 'Liefertermin'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_98110868b266d63c3bacdac4430169cf'] = 'Zeigt den voraussichtlichen Liefertermin an'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_a39df5444246aeb081729db7e17f51bc'] = 'Konfiguration des Liefertermins'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0ea55758c7a68c0309b915e4b718d6b8'] = 'ungültiges Datenformat'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7ccf58c950043c9fbfed668df13ce608'] = 'Die Einstellungen werden aktualisiert'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ecfe3ba0ff66a97029088e8e90a3f051'] = 'Minimale Dauer ist ungültig'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0245cd1cce5ecea8eb23b043be00d80a'] = 'Maximale Dauer ist ungültig'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6843321c8b0edea8cf333519316ed7b'] = 'Lieferant ist ungültig'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_17673c1595a3722522f581c854b8edc5'] = 'Sie können diesen Lieferanten nicht nutzen, eine Regel wurde bereits gespeichert'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_50e1f1030812a9a8fd66dfff17099fcd'] = 'ein Fehler ist beim Hinzufügen einer Lieferanten-Regel aufgetreten'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_240276f48ff2e0e5fe620ff311e677b5'] = 'ein Fehler ist beim Aktualisieren einer Lieferanten-Regel aufgetreten'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b9e3eda70ccb175c96a56bd79b89bd8b'] = 'Lieferanten-Regel erfolgreich gelöscht'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_25e775663057cfc945da15827d972699'] = 'Lieferanten-Regel erfolgreich hinzugefügt'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c20585756aa4f1b448a11ce77a054e32'] = 'Lieferanten-Regel erfolgreich aktualisiert'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_2b5bf8ae8e565a30e2f05c856f5f5f8b'] = 'Lieferanten-Konfiguration'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6ff622b31d0cd1c32c775d1e1f20831'] = 'Neue Lieferanten-Regel hinzufügen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b2995b648d396416ae8648d719e1a20'] = 'Liste der Lieferanten-Regeln'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_aeae9747bcdc4f7c25aa95c2a6765952'] = 'Name des Lieferanten'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b9f5204ddf0881dc9f3a7bf65d4ac15'] = 'Lieferung zwischen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_52f253c711cff509bd5e4df2b18b697a'] = 'Samstagslieferung'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fcddbca356dee064438a399fc0c4c84e'] = 'Sonntagslieferung'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_06df33001c1d7187fdd81ea1f5b277aa'] = 'Handlungen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7b367091d009d1a4be71a6a72494894f'] = 'Tag (e) UND'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_225e75c29d32392d311f5dc94c792384'] = 'Tag (e)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7dce122004969d56ae2e0245cb754d35'] = 'Bearbeiten'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_58f748703db13e81b6ca6c366d1ab50c'] = 'Keine Versenderregel'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_4dab36ac83853282fc0d7bae20c19e90'] = 'Weitere Optionen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0008e84621e5c9f21f8a55387a28692f'] = 'Zusätzliche Zeit, wenn ein Produkt nicht vorrätig ist'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_521d02cf307201053a46e0b9c5b5170c'] = 'Zusätzliche Zeit zur Vorbereitung einer Bestellung'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cec31ec82e3bdee482baaa9f5b11eeed'] = 'Vorbereitungsoption'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_15b4020fafe2bcadf41fbdb2e7fa137a'] = 'Vorbereitung am Samstag '; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9685cbc6ac9090137fb087d4f48d0561'] = 'Vorbereitung am Sonntag '; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_104f1a7d59077b514d4105fcee0e42ff'] = 'Format des Datums'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f19cb36e3ae263c8c3617a453a0ff521'] = 'Hier sehen Sie alle verfügbaren Paramter:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_168ee9f4820976c4f4055cd817965df4'] = 'Neue Lieferanten-Regel'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8c5961161cc9ce6db81bf3be77091136'] = 'Lieferanten-Regel bearbeiten'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f8617a92ba0a0a4eabee724eab7c9f48'] = 'Lieferant:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_961f2247a2070bedff9f9cd8d64e2650'] = 'Wählen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_d3e0fc43c22a6bb8e2d271a29b2f06fd'] = 'Liefermöglichkeiten:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ea4788705e6873b424c65e91c2846b19'] = 'Abbrechen'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Sonntag'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_6f8522e0610541f1ef215a22ffa66ff6'] = 'Montag'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_5792315f09a5d54fb7e3d066672b507f'] = 'Dienstag'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_796c163589f295373e171842f37265d5'] = 'Mittwoch'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_78ae6f0cd191d25147e252dc54768238'] = 'Donnerstag'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c33b138a163847cdb6caeeb7c9a126b4'] = 'Freitag'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samstag'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_86f5978d9b80124f509bdb71786e929e'] = 'Januar'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_659e59f062c75f81259d22786d6c44aa'] = 'Februar'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'März'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_3fcf026bbfffb63fb24b8de9d0446949'] = 'April'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_195fbb57ffe7449796d23466085ce6d8'] = 'Mai'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Juni'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b539f6f34e8503c97f6d3421346b63c'] = 'Juli'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_41ba70891fb6f39327d8ccb9b1dafb84'] = 'August'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cc5d90569e1c8313c2b1c2aab1401174'] = 'September'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Oktober'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7e823b37564da492ca1629b4732289a8'] = 'November'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_82331503174acbae012b2004f6431fa5'] = 'Dezember'; + +?> \ No newline at end of file diff --git a/modules/dateofdelivery/es.php b/modules/dateofdelivery/es.php new file mode 100644 index 000000000..7891784f4 --- /dev/null +++ b/modules/dateofdelivery/es.php @@ -0,0 +1,73 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_75261aaef97717dda0ca98743b24f8f3'] = 'Fecha aproximada de entraga con este transportista entre'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_be5d5d37542d75f93a87094459f76678'] = 'y'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_b7ab10d227790bd29e51c1845153f126'] = 'con los modos de pago directos (ejemplo: tarjeta de crédito)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b0f76e26cffaf27784d901a64f39593e'] = 'Fecha de entraga'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_98110868b266d63c3bacdac4430169cf'] = 'Mostrar una fecha aproximada de entraga'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_a39df5444246aeb081729db7e17f51bc'] = 'Configuración de la fecha de entraga'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0ea55758c7a68c0309b915e4b718d6b8'] = 'El formato de la fecha no es válido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7ccf58c950043c9fbfed668df13ce608'] = 'Parámetros actualizados'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ecfe3ba0ff66a97029088e8e90a3f051'] = 'Plazo mínimo incorrecto'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0245cd1cce5ecea8eb23b043be00d80a'] = 'Plazo máximo incorrecto'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6843321c8b0edea8cf333519316ed7b'] = 'Transportista no válido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_17673c1595a3722522f581c854b8edc5'] = 'No puede utilizar ningún transportista, ya se ha registrado una regla.'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_50e1f1030812a9a8fd66dfff17099fcd'] = 'Se ha producido un error al añadir la regla'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_240276f48ff2e0e5fe620ff311e677b5'] = 'Se ha producido un error al configurar la regla'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b9e3eda70ccb175c96a56bd79b89bd8b'] = 'La regla de transportista se ha suprimido con éxito'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_25e775663057cfc945da15827d972699'] = 'La regla de transportista se ha añadido con éxito'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c20585756aa4f1b448a11ce77a054e32'] = 'La regla de transportista ha sido actualizada correctamente'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_2b5bf8ae8e565a30e2f05c856f5f5f8b'] = 'Configuración del transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6ff622b31d0cd1c32c775d1e1f20831'] = 'Añadir una nueva regla de transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b2995b648d396416ae8648d719e1a20'] = 'Lista de las reglas de transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_aeae9747bcdc4f7c25aa95c2a6765952'] = 'Nombre del transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b9f5204ddf0881dc9f3a7bf65d4ac15'] = 'Entrega prevista entre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_52f253c711cff509bd5e4df2b18b697a'] = 'Entrega los sábados'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fcddbca356dee064438a399fc0c4c84e'] = 'Entrega los domingos'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_06df33001c1d7187fdd81ea1f5b277aa'] = 'Acciones'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7b367091d009d1a4be71a6a72494894f'] = 'día(s) y'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_225e75c29d32392d311f5dc94c792384'] = 'día(s)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7dce122004969d56ae2e0245cb754d35'] = 'Modificar'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_58f748703db13e81b6ca6c366d1ab50c'] = 'Ninguna regla para este transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_4dab36ac83853282fc0d7bae20c19e90'] = 'Más opciones'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0008e84621e5c9f21f8a55387a28692f'] = 'Tiempo suplementario cuando un producto no está disponible'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_521d02cf307201053a46e0b9c5b5170c'] = 'Tiempo suplementario para la preparación del pedido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cec31ec82e3bdee482baaa9f5b11eeed'] = 'Opción para la preparación'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_15b4020fafe2bcadf41fbdb2e7fa137a'] = 'Preparación el sábado'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9685cbc6ac9090137fb087d4f48d0561'] = 'Preparación el domingo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_104f1a7d59077b514d4105fcee0e42ff'] = 'Formato de la fecha:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f19cb36e3ae263c8c3617a453a0ff521'] = 'Puede ver todos los parámetros disponibles en:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_168ee9f4820976c4f4055cd817965df4'] = 'Nueva regla de transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8c5961161cc9ce6db81bf3be77091136'] = 'Modificar una regla de transportista'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f8617a92ba0a0a4eabee724eab7c9f48'] = 'Transportista:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_961f2247a2070bedff9f9cd8d64e2650'] = 'Elegir'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_d3e0fc43c22a6bb8e2d271a29b2f06fd'] = 'Opciones de entraga:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ea4788705e6873b424c65e91c2846b19'] = 'Anular'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Domingo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lunes'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_5792315f09a5d54fb7e3d066672b507f'] = 'Martes'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_796c163589f295373e171842f37265d5'] = 'Miércoles'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_78ae6f0cd191d25147e252dc54768238'] = 'Jueves'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c33b138a163847cdb6caeeb7c9a126b4'] = 'Viernes'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Sábado'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_86f5978d9b80124f509bdb71786e929e'] = 'Enero'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_659e59f062c75f81259d22786d6c44aa'] = 'Febrero'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'Marzo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_3fcf026bbfffb63fb24b8de9d0446949'] = 'Abril'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_195fbb57ffe7449796d23466085ce6d8'] = 'Mayo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Junio'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b539f6f34e8503c97f6d3421346b63c'] = 'Julio'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_41ba70891fb6f39327d8ccb9b1dafb84'] = 'Agosto'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cc5d90569e1c8313c2b1c2aab1401174'] = 'Septiembre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Octubre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7e823b37564da492ca1629b4732289a8'] = 'Noviembre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_82331503174acbae012b2004f6431fa5'] = 'Diciembre'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_8e8fe67c419e34287373a91cc6cab1de'] = 'Fecha aproximada de entrega entre'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_be5d5d37542d75f93a87094459f76678'] = 'y'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_b7ab10d227790bd29e51c1845153f126'] = 'con los modos de pago directo (ejemplo: tarjeta de crédito)'; diff --git a/modules/dateofdelivery/fr.php b/modules/dateofdelivery/fr.php new file mode 100644 index 000000000..58764b1e3 --- /dev/null +++ b/modules/dateofdelivery/fr.php @@ -0,0 +1,73 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_75261aaef97717dda0ca98743b24f8f3'] = 'Date approximative de livraison avec ce transporteur est entre le'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_be5d5d37542d75f93a87094459f76678'] = 'et'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_b7ab10d227790bd29e51c1845153f126'] = 'avec un moyen de paiement direct (ex.: carte bancaire)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b0f76e26cffaf27784d901a64f39593e'] = 'Date de livraison'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_98110868b266d63c3bacdac4430169cf'] = 'Afficher une date approximative de livraison'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_a39df5444246aeb081729db7e17f51bc'] = 'Configuration: Date de livraison'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0ea55758c7a68c0309b915e4b718d6b8'] = 'Le format de la date est invalide'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ecfe3ba0ff66a97029088e8e90a3f051'] = 'Délais minimum incorrect'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0245cd1cce5ecea8eb23b043be00d80a'] = 'Délais maximum incorrect'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6843321c8b0edea8cf333519316ed7b'] = 'Transporteur invalide'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_17673c1595a3722522f581c854b8edc5'] = 'vous ne pouvez pas utiliser de transporteur, une régle a déjà été enregistrée'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_50e1f1030812a9a8fd66dfff17099fcd'] = 'une erreur s\'est produite lors de l\'ajout de la régle'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_240276f48ff2e0e5fe620ff311e677b5'] = 'une erreur s\'est produite lors de la mise à jour de la régle'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b9e3eda70ccb175c96a56bd79b89bd8b'] = 'Régle de transporteur a été supprimée avec succés'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_25e775663057cfc945da15827d972699'] = 'Régle de transporteur a été ajoutée avec succés'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c20585756aa4f1b448a11ce77a054e32'] = 'Régle de transporteur a été mise à jour avec succés'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_2b5bf8ae8e565a30e2f05c856f5f5f8b'] = 'Configuration de transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6ff622b31d0cd1c32c775d1e1f20831'] = 'Ajouter une nouvelle règle de transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b2995b648d396416ae8648d719e1a20'] = 'Liste des règles de transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_aeae9747bcdc4f7c25aa95c2a6765952'] = 'Nom du transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b9f5204ddf0881dc9f3a7bf65d4ac15'] = 'Livraison entre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_52f253c711cff509bd5e4df2b18b697a'] = 'livraison le Samedi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fcddbca356dee064438a399fc0c4c84e'] = 'livraison le Dimanche'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_06df33001c1d7187fdd81ea1f5b277aa'] = 'Actions'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7b367091d009d1a4be71a6a72494894f'] = 'jour(s) et'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_225e75c29d32392d311f5dc94c792384'] = 'jour(s)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7dce122004969d56ae2e0245cb754d35'] = 'Modifier'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_58f748703db13e81b6ca6c366d1ab50c'] = 'Aucune règle de transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_4dab36ac83853282fc0d7bae20c19e90'] = 'Plus d\'options'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0008e84621e5c9f21f8a55387a28692f'] = 'Temps supplémentaire lorsqu\'un produit est hors stock'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_521d02cf307201053a46e0b9c5b5170c'] = 'Temps supplémentaire pour la préparation des commandes'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cec31ec82e3bdee482baaa9f5b11eeed'] = 'Option pour la préparation'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_15b4020fafe2bcadf41fbdb2e7fa137a'] = 'préparation le Samedi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9685cbc6ac9090137fb087d4f48d0561'] = 'préparation le Dimanche'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_104f1a7d59077b514d4105fcee0e42ff'] = 'Format de la date :'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f19cb36e3ae263c8c3617a453a0ff521'] = 'Vous pouvez voir tous les paramètres disponibles à l\'adresse suivante:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_168ee9f4820976c4f4055cd817965df4'] = 'Nouvelle règle de transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8c5961161cc9ce6db81bf3be77091136'] = 'Modification d\'une règle de transporteur'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f8617a92ba0a0a4eabee724eab7c9f48'] = 'Transporteur :'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_961f2247a2070bedff9f9cd8d64e2650'] = 'Choisissez'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_d3e0fc43c22a6bb8e2d271a29b2f06fd'] = 'Option de livraison :'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ea4788705e6873b424c65e91c2846b19'] = 'Annuler'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Dimanche'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lundi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_5792315f09a5d54fb7e3d066672b507f'] = 'Mardi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_796c163589f295373e171842f37265d5'] = 'Mercredi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_78ae6f0cd191d25147e252dc54768238'] = 'Jeudi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c33b138a163847cdb6caeeb7c9a126b4'] = 'Vendredi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samedi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_86f5978d9b80124f509bdb71786e929e'] = 'Janvier'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_659e59f062c75f81259d22786d6c44aa'] = 'Février'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'Mars'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_3fcf026bbfffb63fb24b8de9d0446949'] = 'Avril'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_195fbb57ffe7449796d23466085ce6d8'] = 'Mai'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Juin'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b539f6f34e8503c97f6d3421346b63c'] = 'Juillet'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_41ba70891fb6f39327d8ccb9b1dafb84'] = 'Août'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cc5d90569e1c8313c2b1c2aab1401174'] = 'Septembre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Octobre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7e823b37564da492ca1629b4732289a8'] = 'Novembre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_82331503174acbae012b2004f6431fa5'] = 'Décembre'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_8e8fe67c419e34287373a91cc6cab1de'] = 'Date approximative de livraison est entre le'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_be5d5d37542d75f93a87094459f76678'] = 'et'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_b7ab10d227790bd29e51c1845153f126'] = 'avec un moyen de paiement direct (ex.: carte bancaire)'; diff --git a/modules/dateofdelivery/img/cross.png b/modules/dateofdelivery/img/cross.png new file mode 100755 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!AxT6*R5;6( zlj}|sQ51!ViOGr2pjL^7$dQ1=8$w$KD6I_$CeZtZUZjAurR}6mp*HFdO?(oc3q-}< zu+o`!I@9H@m`W`r;m1zSWX}5bthM(H02sJT)z?DT&OUcv5HmU|-dF4oa@p;T*KAHh zFQ6^X?4p&<LW?JRAa!4W*8^cRHn#BV<;v&k;?li;fWKno-=RgNB}6ngw>uEoyT++I zn$b9r%cFfhHe2K68Pk<hKq}2z2~lh9z5zadf|kv-0cZq5T=w`mb%(MY1L(c%58!zI zxmp(Hu69|_VhN_cj;WfM0p5Rrno6S{41>Bu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5Y<Msg#Hz1}_nVr{4MuGi*zXu>W zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsG<NRDe z&F<oo(+wrG4$v4ShYJ*zTAVUyCyUEKWCOJq%P2g2jKiT}-UXn|;?x~V@D+7UK%!5l zu+-wDffb%iu%q!uYSm;0f+3t(tT-AO#lfvX-T}~N2{oGoN+1Mj)d31iEk4tC0{b>H z#=Z{USAQA>NY(}X7=3{K8#<xO0&SL1U06cNFs)HoJ!v1_9b#Vw@2F?RJt3C#MxpR@ plJ)zU4s^HK{`H%}g=4&I{RVQoq{rLsz7zle002ovPDHLkV1j2<C=vhw literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/img/tick.png b/modules/dateofdelivery/img/tick.png new file mode 100755 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzt4TybR5;7M zli4mqVHAaX=Q!_TZq*o5LaK&TC+g@aMJbINs;8}1t3yf*$E6r*j>Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv<H&*Dj)Tr<j*}f%KtVns|p$^k=7pCG)bZ)nz(p!uYhmcBtGG4MZ zhBKz;vsk_?<x?$B#+(Sm9B-A&-Qq;?SOJwD!Fa)z^`0_M+_eepu5##IOknYS`&tC< z#^ArRgWXi2%vG2uvgcE2i2di<+TKw6qc6;1IyMf?mMlSF4apWIQ-(bTzNj7ETMiu? z3Y3nE5@K5(^<j-YCz?$CVH?a>1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p<rCAIZx2 bmuq|lzM`o-QVIh|00000NkvXXu0mjfO@{7Q literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/img/time.png b/modules/dateofdelivery/img/time.png new file mode 100755 index 0000000000000000000000000000000000000000..911da3f1d31fca4494a4beb22014e5c5c724c236 GIT binary patch literal 793 zcmV+!1LpjRP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!t4TybR5;6} z)7wwd0RYAE{-k=S*49%mJy|YmnOknPwpy154TB_0EX=N=iJE4VPzv61H4zIhMC1h} z)Jzolg_M^-`~d>`EB*FHYdKr%;k=xO&(k^EfNlSiKZ>5l+xr|%SFOV@6-ysFmD2F5 ze93OiS+LaQym;|2f6tbH%~V`D+ND?vc>4J^KSLxEMifJQ`8>*~y^+pGr&o-n=L<Fk zdK=YcUS}2IpdXJvOmnwDWy?p(P2=dzUPh)C5Ihb#YR{lkpUV3Uu;@$nI$z49(4v6N zHAicYfHx2!6p0axtl*iApzre1*5_l=WyWwlGhSPKc1H?$^Hkn3?K1P}^AaYj4}h>J zGWB(yB#;DR8&Lhqi{0(#wc#SwSB~jZKzIFx`8od>2Fo-Pfe7*M8^q#qw2yTxiXzd~ zRaz|F*rr78G`JZXG*YX~5K@5k>G@<h^o85c+$<&}!mI170hbF^7+TwrUsKWL7+_44 z$kh%oD-7^hc{q^*I%`fRL*Hgl>0HdlBo-6v1jHye?%qRwO@+-hO7J^4LlPG>@A1#{ zQFl4x7tnG)+cz_2Mq_f*H!U)kgg{iHqxT)Yr3ec@K!`)z_%h1c0Y2Eu(dMPkrhq5v zY+bKWfx|sTiOEB71HuwS*CDzA%ReBv4*7Zy7RM0n6`5#chfOJ<?&i7e^+iV$lg@gc znTNS$n#3h66H7?M;u3CQ8Fj-as+-?3VlAQ~CoNf~Jh}6?A=Ri(D4v%bVWPj1o<S$Y zx_&N|zvH6DPGOB5i~TLb)&i>K`ze)Y6>d6Z?UmyNHH!3DdsP-ARyDo}1HO+>7_um7 zx_gj{+_aU_OUH_~Jd?KI#ICZujD`of2mDpCv_zFGE%6}tfL|j!WGu_i-u>4%{%d{$ X7`zMSfT21V00000NkvXXu0mjfkBx0` literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/img/time_add.png b/modules/dateofdelivery/img/time_add.png new file mode 100755 index 0000000000000000000000000000000000000000..dcc45cb22d734911a75bd4950e2571a16605a9cf GIT binary patch literal 827 zcmV-B1H}A^P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!%}GQ-R5;6} zlG#sFK@`UMH+=Eg7ZZ8Wm>3?6FD7nDHK>VL42oe(*rZTUs{)lBOewOJrAS)@sgRZy z%F>hyq)^%d($a+jvbEIPma<%g&wCql)nJT?C;2jG&YAhmnKKgsAmV>?EHES~x~T7X zs+sKJY)$uZ$;sXvQYTGaS2d(|cfZX!|5t!kR#0tLbM}|5W7u4C!0-2gAiP*vG{dZu zpszlDTUwr!_ea36B)`&b5W?qi!|L|o{h$lgowKNt&7f6j$CPayE~_4jy2lXZ$7TKo zP_^<e7<w{D?}iIn<0`s_T(B?u;q?dM@o&Sr<VUO8jt?VF%o~*uzq}o)D@cfB00Yfg ziUlh1d2tIejT5x_2m-b*YuKfHTEQcrrq>Rg$&G$-I%;z7v@(FfmgKcnw*_L=0_Lcb zLkC9)hC&cDim*X}0(*PtR1HFFBT(FKf@MOAIxfq_05r`>yFTv<irP%r*dgKDJH$Sf z$bQa)xJ!<#XFRC&<FF7U(gfpJa*d;rdvk{Y^wq}idN&>5iHukZk`&|+%R~ULN=n0< zwMH{M2Y|s#BDvxd+>Q}6WV3z(I?H054vP{MG80A?2&__<UJj5@43EOO<;VIrK&tOT zs*sIGW!G`P@Dft8q6h}ilpiA+mU5ss*}#`s;h`GlBZ0snCCcv@m4Md~i{2RlrdQP{ z?@vH<`DvU>JW&z`G!!PDX?YR7GjC`?n{pDbW%Dq)z9LBVBN!qPTXY$6O9kX}RpA#Z z8F+~Dfp{9Q%Y39-UM%Mw{}$%PsxdTSK!IosPpU?dUZKMkZX^^l_4w63ngulA_kS(O zy_Z+Zxe=5L?_x@m59gd1&e<kJrJO{u`T+{n?C|D775jJv3?wi1Y-J{^{Y~06w=m=C z4lQ;{q@PuC3Z?3}@X7Q@&zT<li>SqXN&&j;A0wZRe+P0j{YEgzubTh>002ovPDHLk FV1g6?b$0*& literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/img/time_delete.png b/modules/dateofdelivery/img/time_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5bf8313c6fe2d345c2e2e27e163fb9a91f902f40 GIT binary patch literal 853 zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!=Sf6CR5;6} zlUqpBaTLc5^}Xn&mmcgP>LI8ef}kKQAC1Vu3=||mNqz7>Z<*DWS(X}8({x^D&e^=6 z>88%hn5MS5Hq)H$;+)OP=KODSbN<zR`^|@y7!h>f%kRfIoX_w44(Ip*@cSPfat!hc zgGXB)iRGP)^{>KgTHcjKOPiBcMAb>{?eDTK{}mwNv&vMxjBTTO3~S3;*lbo%lm$x* zDyXD92;awUHor;8{UczA$1Ksv%3(Ddpf*_XaX^nU!8A(w-_X#b!Q|Wu^y*P`SH*$D zj7d8H5H%EBk#(lhmQ_6@3KLof_0Sk?u-F_h+cu$Iw4tF_gSKHEW)(f)KE3CxVm-Xz z1N7HrbkCE(_l0%v#X5M+N>P~mv5YNp_sZb`D!Md~Dh=r4rl2AxqQM6ks83ur8K%G$ z&0~hV?A-Cd;dFvs!@(*6+1+jkL<5k_QFz&;#MDGHs<OlMK7hC`VasY+LSds4t1cQ= z_a3%MAoFoPxUC(?$je9X=s2b*8p-T&Eb7NmlYPhK0|+Z)w=8Q~<Z~2QbkGE{2P0+2 zvsXp?$r6PM<{dz0p^;ep83yezsx!lW0R*q3blRyN6!VoBo~K|UpElZQbPtU{w{FAA zE}&{*V<7Sj`hx?}A9fr~k!L9%pq3fM8ER%=R5^zNz8YrIFe?q%_lU@SzO4+Z^sCtV zR0PkA5Kdk)zQmvN^j;50+y_)Yk3V1kB-}MCt4Cvx9548@Q0O<{ApLMSY4k^&f{P@h zG!)1<2C#x)F1!ZO4S$_)kSg<|86OJnVrHxigA+2aIAcgJ9YIR5biZtmycNIOM&1eH z5AYlqWp++vZYATEqoe#jCdEwXX1LHz*P`$CQEXN}07#NM-49kGL!3WEA^uB;mWiDk zeW@fZtm$p?O+$HVsLLxs%tdM}=CsF@5rnnOKxku*KpYydD-7|^`scNkhM#1R7xmt< f$!YW^d;LEF_89y4<^*1I00000NkvXXu0mjfxX6wJ literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/it.php b/modules/dateofdelivery/it.php new file mode 100644 index 000000000..86badbd96 --- /dev/null +++ b/modules/dateofdelivery/it.php @@ -0,0 +1,75 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_75261aaef97717dda0ca98743b24f8f3'] = 'Data approssimativa di consegna con questo corriere è tra'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_be5d5d37542d75f93a87094459f76678'] = 'e'; +$_MODULE['<{dateofdelivery}prestashop>beforecarrier_b7ab10d227790bd29e51c1845153f126'] = 'con i metodi di pagamento diretto (es.: carta di credito)'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_8e8fe67c419e34287373a91cc6cab1de'] = 'Data approssimativa di consegna compresa tra'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_be5d5d37542d75f93a87094459f76678'] = 'e'; +$_MODULE['<{dateofdelivery}prestashop>orderdetail_b7ab10d227790bd29e51c1845153f126'] = 'con i metodi di pagamento diretto (es.: carta di credito)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b0f76e26cffaf27784d901a64f39593e'] = 'Data di consegna'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_98110868b266d63c3bacdac4430169cf'] = 'Visualizza una data approssimativa di consegna'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_a39df5444246aeb081729db7e17f51bc'] = 'Configurazione data di consegna'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0ea55758c7a68c0309b915e4b718d6b8'] = 'Il formato della data non è valido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7ccf58c950043c9fbfed668df13ce608'] = 'Impostazioni aggiornate'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ecfe3ba0ff66a97029088e8e90a3f051'] = 'Tempo minimo non valido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0245cd1cce5ecea8eb23b043be00d80a'] = 'Tempo massimo non valido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6843321c8b0edea8cf333519316ed7b'] = 'Corriere non valido'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_17673c1595a3722522f581c854b8edc5'] = 'Non puoi utilizzare questo corriere, una regola è stata già salvata'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_50e1f1030812a9a8fd66dfff17099fcd'] = 'si è verificato un errore durante l\'aggiunta della regola corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_240276f48ff2e0e5fe620ff311e677b5'] = 'si è verificato un errore durante l\'aggiornamento della regola corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_b9e3eda70ccb175c96a56bd79b89bd8b'] = 'Regola corriere eliminata con successo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_25e775663057cfc945da15827d972699'] = 'Regola corriere aggiunta con successo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c20585756aa4f1b448a11ce77a054e32'] = 'Regola corriere aggiornata con successo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_2b5bf8ae8e565a30e2f05c856f5f5f8b'] = 'Configurazione corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_e6ff622b31d0cd1c32c775d1e1f20831'] = 'Aggiungi una nuova regola corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b2995b648d396416ae8648d719e1a20'] = 'Elenco di regole corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_aeae9747bcdc4f7c25aa95c2a6765952'] = 'Nome del corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b9f5204ddf0881dc9f3a7bf65d4ac15'] = 'Consegna tra'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_52f253c711cff509bd5e4df2b18b697a'] = 'Consegna sabato'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fcddbca356dee064438a399fc0c4c84e'] = 'Consegna domenica'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_06df33001c1d7187fdd81ea1f5b277aa'] = 'Azioni'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7b367091d009d1a4be71a6a72494894f'] = 'giorno(i) E'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_225e75c29d32392d311f5dc94c792384'] = 'giorno(i)'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7dce122004969d56ae2e0245cb754d35'] = 'Modifica'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_58f748703db13e81b6ca6c366d1ab50c'] = 'Nessuna regola per il corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_4dab36ac83853282fc0d7bae20c19e90'] = 'Altre opzioni'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_0008e84621e5c9f21f8a55387a28692f'] = 'Tempo supplementare quando un prodotto è esaurito'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_521d02cf307201053a46e0b9c5b5170c'] = 'Tempo supplementare per la preparazione dell\'ordine'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cec31ec82e3bdee482baaa9f5b11eeed'] = 'Opzione di preparazione '; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_15b4020fafe2bcadf41fbdb2e7fa137a'] = 'Preparazione sabato'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9685cbc6ac9090137fb087d4f48d0561'] = 'Preparazione domenica'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_104f1a7d59077b514d4105fcee0e42ff'] = 'Formato della data:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f19cb36e3ae263c8c3617a453a0ff521'] = 'Puoi visualizzare tutti i parametri disponibili su:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_168ee9f4820976c4f4055cd817965df4'] = 'Nuova regola corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8c5961161cc9ce6db81bf3be77091136'] = 'Modifica regola corriere'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_f8617a92ba0a0a4eabee724eab7c9f48'] = 'Corriere:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_961f2247a2070bedff9f9cd8d64e2650'] = 'Scegli'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_d3e0fc43c22a6bb8e2d271a29b2f06fd'] = 'Opzioni consegna:'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_ea4788705e6873b424c65e91c2846b19'] = 'Annulla'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Domenica'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lunedi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_5792315f09a5d54fb7e3d066672b507f'] = 'Martedì'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_796c163589f295373e171842f37265d5'] = 'Mercoledì'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_78ae6f0cd191d25147e252dc54768238'] = 'Giovedi'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_c33b138a163847cdb6caeeb7c9a126b4'] = 'Venerdì'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Sabato'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_86f5978d9b80124f509bdb71786e929e'] = 'Gennaio'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_659e59f062c75f81259d22786d6c44aa'] = 'Febbraio'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'Marzo'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_3fcf026bbfffb63fb24b8de9d0446949'] = 'Aprile'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_195fbb57ffe7449796d23466085ce6d8'] = 'Maggio'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Giugno'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_1b539f6f34e8503c97f6d3421346b63c'] = 'Luglio'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_41ba70891fb6f39327d8ccb9b1dafb84'] = 'Agosto'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_cc5d90569e1c8313c2b1c2aab1401174'] = 'Settembre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Ottobre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_7e823b37564da492ca1629b4732289a8'] = 'Novembre'; +$_MODULE['<{dateofdelivery}prestashop>dateofdelivery_82331503174acbae012b2004f6431fa5'] = 'Dicembre'; + +?> \ No newline at end of file diff --git a/modules/dateofdelivery/logo.gif b/modules/dateofdelivery/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..321c583ad78d7c86f0725af246988f8e342f98ac GIT binary patch literal 618 zcmZ?wbhEHb6krfwc*ejmz0B?2)%iL7#}BWnTC-#CnK!>SOp9E1<^ADJvu>Z?R#w;0 zzw+X~Q)iw(x^wI4^O-Ye&TmS3@#p{f!&~;Qp0arDhWj^<Hq1N!=Hurj+s<Bp@OJIK z``1oPUD_V9eNNG_U2D$Wdhzb%<4cE^KmPRV;`YY7m$y~TI=O90U;E0N-~a#LIVbz* z*0pE1l+CILdiL;gb9c|d^Ut>KKl1tO*UCjVr>?nr@B8<6FCMJw_PcO!;(^;A?!EnZ zc2CWsZFk;%_;7CboOeI|F7M7Lop|Kg_y1Q;Y}>cEV8`J@UCS;WzWDI*%@fl%-}(Rl z|Ge7p>8lUjIWz6y-2?Cc{D1fQ;fu%ju08&EZcELLGYemS_|Q7<#QFR0&+TccsBf57 z611c>=F^WKyXNQKIKOSj(bMnVJh^gU{=I99i~0{={_tz>xodYGe|&WR<mr9uUw-@5 zv-Vocvg`N1{=dAt3TPJtSwQh83nM#2E`tt8Hz-aR*pD~lHZ`}jwwfj=D+dMHnzrR~ z=C}vg*yt+8IJI*6_)AI|8(YhZYR+y_&^FbVN);Cmw3dpEQfRW}T;OTLr?KC|%~`mK zS=TyH!;n8Dn#ICZ(Z0z!-ZjHcBSM5LF4-Z?t4Y&TOew=sk1IuxmC5%}uB-~Tg`<*z zrC>I@s<}Xu0FObDQq$yS_S6c)1f{9dG$s5ZZf-i-HA^*olY^v6<6$<o(1s3`Ma&KD iPU%x5b_l8U@JZ|VNi`)gF>#9t_?R>t*&Lw2U=08;3pDfq literal 0 HcmV?d00001 diff --git a/modules/dateofdelivery/orderDetail.tpl b/modules/dateofdelivery/orderDetail.tpl new file mode 100644 index 000000000..5057cbd7e --- /dev/null +++ b/modules/dateofdelivery/orderDetail.tpl @@ -0,0 +1,30 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $datesDelivery|count} + <p id="dateofdelivery">{l s='Approximate date of delivery is between' mod='dateofdelivery'} <b>{$datesDelivery.0}</b> {l s='and' mod='dateofdelivery'} <b>{$datesDelivery.1}</b> <sup>*</sup></p> + <p style="font-size:10px;margin:0padding:0;"><sup>*</sup> {l s='with direct payment methods (e.g: credit card)' mod='dateofdelivery'}</p> +{/if} \ No newline at end of file diff --git a/modules/dejala/MyLogUtils.php b/modules/dejala/MyLogUtils.php new file mode 100644 index 000000000..51e8b6c20 --- /dev/null +++ b/modules/dejala/MyLogUtils.php @@ -0,0 +1,49 @@ +<?php +/** Provides utilitary functions to log to a file */ +class MyLogUtils +{ + // Log $msg into a file located at $filepath + public static function mylog($filepath, $msg) + { + $fh = fopen($filepath, 'a'); + if (FALSE !== $fh) + { + fwrite($fh, date("d/m/y-H:i:s\t", time())); + fwrite($fh, $msg . "\r\n"); + fclose($fh); + } + } + + // get a string of a value for Log purposes + public static function logValue($mvalue, $lvl=0) { + + if (is_array($mvalue)) + { + $indent=""; + for ($i=0; $i < $lvl; $i++) + $indent = $indent."\t"; + $buffer = ""; + $buffer=$buffer. "[]={\r\n"; + foreach ($mvalue as $akey=>$avalue) { + $buffer=$buffer . $indent . "\t" . $akey ."=>". MyLogUtils::logValue($avalue,$lvl+1) . "\r\n"; + } + $buffer=$buffer.$indent."}"; + return ($buffer); + } + else if (is_object($mvalue)) + { + $indent=""; + for ($i=0; $i < $lvl; $i++) + $indent = $indent."\t"; + $buffer = "?" . "=" . get_class($mvalue) . "{\r\n"; + foreach ($mvalue as $akey=>$avalue) { + $buffer=$buffer . $indent . "\t" . $akey ."=". MyLogUtils::logValue($avalue,$lvl+1) . "\r\n"; + } + $buffer=$buffer.$indent."}"; + return($buffer); + } + else + return ($mvalue); + } +} + diff --git a/modules/dejala/calendarutils.php b/modules/dejala/calendarutils.php new file mode 100644 index 000000000..70c8f8d91 --- /dev/null +++ b/modules/dejala/calendarutils.php @@ -0,0 +1,141 @@ +<?php + +/** +* Utilitary functions for calendar + **/ +class CalendarUtils +{ + /** + * Ajuste l'heure de dateUtc en fonction de l'ouverture + * La dateUtc est considérée dispo + **/ + public function adjustHour($dateUtc, $calendar) + { + $wd = date('w', $dateUtc); + $startHour = (int)($calendar[$wd]['start_hour']); + $stopHour = (int)($calendar[$wd]['stop_hour']); + $currentHour = (int)(date('H', $dateUtc)); + $currentMin = (int)(date('i', $dateUtc)); + + // arrondi à l'heure juste d'après + if ($currentMin > 0) + { + $currentHour = $currentHour + 1; + $dateUtc = mktime($currentHour, 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + } + // si on est avant l'heure de départ, on se met à l'heure de départ + if ($currentHour < $startHour) + { + $dateUtc = mktime($startHour, 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + } + return ($dateUtc); + } + + /** + * Ajout un délai à la date dateUtc : 0.5 jour ou 1*nb de jours + * Prend en compte le calendrier & les exceptions + **/ + public function addDelay($dateUtc, $delay, $calendar, $exceptions) + { + // on se base sur la prochaine date dispo + $dateUtc = $this->getNextDateAvailable($dateUtc, $calendar, $exceptions); + if (!$dateUtc) + return (null); + + if ($delay == '0.5') + { + $hour = (int)(date('H', $dateUtc)); + if ($hour < 12) + { + $dateUtc = mktime('14', 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + } else + { + $dateUtc = $this->skipOneDay($dateUtc) ; + $dateUtc = $this->getNextDateAvailable($dateUtc, $calendar, $exceptions); + } + return ($dateUtc); + } + + $deliveryDelay = (int)($delay); + while ($deliveryDelay--) + { + $dateUtc = strtotime(date("Y-m-d", $dateUtc) . " +1 day"); + $dateUtc = mktime(0, 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + $dateUtc = $this->getNextDateAvailable($dateUtc, $calendar, $exceptions); + } + return ($dateUtc); + } + + public function skipOneDay($dateUtc) + { + $dateUtc = strtotime(date("Y-m-d", $dateUtc) . " +1 day"); + // on remet sur 00h00 pr livrer au début du jour + $dateUtc = mktime(0, 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + + return $dateUtc ; + } + public function skipCurDay($dateUtc) + { + $currentDayZero = mktime(0, 0, 0, date('m', time()), date('d', time()), date('Y', time())); + $dateUtcZero = mktime(0, 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + if ($currentDayZero == $dateUtcZero) + { + $dateUtc = $this->skipOneDay($dateUtc) ; + } + return $dateUtc ; + } + /** + * Renvoie la prochaine journée disponible (soit $dateUtc, soit la prochaine à 00h00) + * Si aucune ds les 15j, renvoie NULL + **/ + public function getNextDateAvailable($dateUtc, $calendar, $exceptions) + { + // si dateUtc est dispo, retourne $dateUtc + if ($this->isDateAvailable($dateUtc, $calendar, $exceptions)) + return ($dateUtc); + + $loopcount = 0; + // on positionne au début de journée + $dateUtc = mktime(0, 0, 0, date('m', $dateUtc), date('d', $dateUtc), date('Y', $dateUtc)); + // on boucle pour trouver une journée dispo (si ds les 15j, y a pas : on laisse tomber + do + { + $dateUtc = strtotime(date("Y-m-d", $dateUtc) . " +1 day"); + $isDateFree = $this->isDateAvailable($dateUtc, $calendar, $exceptions); + $loopcount++; + } + while (!$isDateFree && ($loopcount < 15) ); + if ($isDateFree) + return ($dateUtc); + return (NULL); + } + + /** + * Returns if $dateUtc is available (orderable date) + **/ + public function isDateAvailable($dateUtc, $calendar, $exceptions) + { + // jour ferié ? + $mCalDate = date("d/m/Y", $dateUtc); + if (in_array($mCalDate, $exceptions)) + return (false); + // jour fermé ? + $wd = date('w', $dateUtc); + if (!isset($calendar[$wd])) + return (false); + + // on arrondit à l'heure suivante & on regarde si on est avant la fermeture + $stopHour = (int)($calendar[$wd]['stop_hour']); + $currentHour = (int)(date('H', $dateUtc)); + $currentMin = (int)(date('i', $dateUtc)); + if ($currentMin > 0) + $currentHour = $currentHour + 1; + // avant l'heure de fermeture ? + if ($currentHour <= $stopHour) + return (true); + else + return (false); + } + +} + diff --git a/modules/dejala/config.xml b/modules/dejala/config.xml new file mode 100755 index 000000000..901ddf68c --- /dev/null +++ b/modules/dejala/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>dejala</name> + <displayName><![CDATA[Dejala.com : Courier delivery]]></displayName> + <version><![CDATA[1.4]]></version> + <description><![CDATA[Lets Dejala.com handle your deliveries by courier]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[shipping_logistics]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries>fr</limited_countries> +</module> \ No newline at end of file diff --git a/modules/dejala/de.php b/modules/dejala/de.php new file mode 100644 index 000000000..7366ce5b8 --- /dev/null +++ b/modules/dejala/de.php @@ -0,0 +1,189 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dejala}prestashop>dejala_carrier_21034ae6d01a83e702839a72ba8a77b0'] = '(zzgl. MwSt.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. Mwst.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_e7a6ca4e744870d455a57b644f696457'] = 'Kostenlos!'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_21034ae6d01a83e702839a72ba8a77b0'] = '(zzgl. MwSt.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. Mwst.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_e7a6ca4e744870d455a57b644f696457'] = 'Kostenlos!'; +$_MODULE['<{dejala}prestashop>dejala_contacts_a766dcf63862aaaa1625a45169aeb37a'] = 'Shop-Besitzer'; +$_MODULE['<{dejala}prestashop>dejala_contacts_4e140ba723a03baa6948340bf90e2ef6'] = 'Name:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_d2cacc542d8dd31bd89f8defed1b55ad'] = 'Vorname:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_673ae02fffb72f0fe68a66f096a01347'] = 'Telefon:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7a31464d87d555a1d5a7d2afdeb64d4e'] = 'mobil:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_01401fe9a93df81d28637e5218597b76'] = 'E-Mail:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7e2121a0b71ccc33c5eeaf11999fdbcd'] = 'Kontakt Lagerkontrolle'; +$_MODULE['<{dejala}prestashop>dejala_contacts_23e44d356bfc0d17f904cb743b4d247c'] = 'Kontakt Verwaltung'; +$_MODULE['<{dejala}prestashop>dejala_contacts_527a0a71d5684695421ec3375ec6dba8'] = 'Konakt Webseitenwartung'; +$_MODULE['<{dejala}prestashop>dejala_contacts_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_9c8a7900448628ee2978be9a3945d148'] = 'Ihr Guthaben'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b0ee4c529eda15bdecda8bf189a3c813'] = 'Ihr virtuelles Guthaben (zu Testzwecken)'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_defcb35db6f9bdac29b888bfc07e6386'] = 'Euro'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Stocken Sie Ihr Konto auf'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_642c4a47922246182590d4f3c8304f35'] = 'Liste der letzten Lieferungen'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01abfc750a0c942167651c40d088531d'] = 'Nr.'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_67d5168b4f2b5424a3d118ea9ef99372'] = 'Erstellung'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d79cf3f429596f77db95c65074663a54'] = 'Bestell-ID'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2a033d36697bb24bfc7ece05545d268e'] = 'Tracking_Nummer'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b021df6aac4654c454f46c77646e745f'] = 'Label'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_3601146c4e948c32b6424d2c0a7f0118'] = 'Preis'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Versand'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Beschreibung'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2ca8d70baf21b18878843c02a086e46c'] = 'In'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d98a07f84921b24ee30f86fd8cd85c3c'] = 'von'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01b6e20344b68835c5ed1ddedf20d531'] = 'an'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_427c7fb2385f610d26ea90fff86f9a84'] = 'CSV-Export'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_5da618e8e4b89c66fe86e32cdafde142'] = 'Von'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_e12167aa0a7698e6ebc92b4ce3909b53'] = 'An'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_a60852f204ed8028c1c58808b746d115'] = 'OK'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8424d087ffe39bb2ee8db173c7e07ba5'] = 'Erstell_datum'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_d79cf3f429596f77db95c65074663a54'] = 'Bestell-ID'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_2a033d36697bb24bfc7ece05545d268e'] = 'Tracking_Nummer'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ac27812104f966f43d3a60f37a869338'] = 'short_label'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_78a5eb43deef9a7b5b9ce157b9d52ac4'] = 'Preis'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_9acb44549b41563697bb490144ec6258'] = 'Status'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_1e6e6626b6e59276b14112ebc34c5d49'] = 'Versand_datum'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_c20456384feb648b4692b700ec570d42'] = 'Zeitlimit'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_5c5c8fc67b523e638e0a904d61651f2d'] = 'Versand_start'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8e659923776b8706dbf4636c408e987c'] = 'Versand-ende'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ba402b48292a61e4d82f85eeaa0904dc'] = 'Versand_datum'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_7c7f9f48d29519e8cb47ac606a431a65'] = 'Versand_Zeit'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_617283f39e91b6ead659cef3c722cabc'] = 'Lieferpräferenzen'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_11d783488db0c358bd9077a2e1a250e7'] = 'Versand vorschlagen '; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_ffe181130430aff6386df37df36347f8'] = 'sofort'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_a3cb1f2ebeda6fa36b27598f1d096f60'] = 'einen halben Tag'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_849490640e65410418220e5c179a1477'] = 'einen Tag'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44fdec47036f482b68b748f9d786801b'] = 'Tage'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_6749e3e07aeb12081dc32e581ffcf463'] = 'nach Bestellung'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_48b4a9d141bcbb3911caa5caf4b750b2'] = 'Anzeige'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_7877adcb96eb8221c075f0008093bbf7'] = 'Termine'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_b4f86cbc11cb9565374c08c61372f3ad'] = 'Tage in der Benutzerroberfläche für die Zeitspanne'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44a33a70398318da91b789b33152dafa'] = 'Dejala aktiv halten, wenn Warenkorb nicht auf Lager'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_767cd99c2f2b9fb9e5aa531c37b45f87'] = 'Ermöglicht Kunden Dejala zu wählen, auch wenn ein Produkt nicht auf Lager ist (Der Kunde wählt den Liefertermin, wenn die Bestellung zur Verfügung steht)'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{dejala}prestashop>dejala_header_c45abd6f2b5f3b3a954c97f008ccb52c'] = 'Versenden Sie Ihre Bestellungen per Kurier mit'; +$_MODULE['<{dejala}prestashop>dejala_header_20e846b603a0b7f1c00b1fc457308fb7'] = 'DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_21e71170be5450c6380d7a9fc0ba51c3'] = 'Neu auf Dejala.fr?'; +$_MODULE['<{dejala}prestashop>dejala_home_07965cce4ec6247bd57783dff0af1657'] = 'Ihr Shop-Name:'; +$_MODULE['<{dejala}prestashop>dejala_home_558f162b01a3d6d31865a1ca91a03d57'] = 'Wählen Sie Ihr Land:'; +$_MODULE['<{dejala}prestashop>dejala_home_0309a6c666a7a803fdb9db95de71cf01'] = 'Frankreich'; +$_MODULE['<{dejala}prestashop>dejala_home_907eba32d950bfab68227fd7ea22999b'] = 'Spanien'; +$_MODULE['<{dejala}prestashop>dejala_home_a999205c014634072764fe3fadc4f4ca'] = 'Wählen Sie Ihr Login:'; +$_MODULE['<{dejala}prestashop>dejala_home_a7e4228de9b12575b0cd88c4cf0f54f9'] = 'Wählen Sie Ihr Kennwort:'; +$_MODULE['<{dejala}prestashop>dejala_home_0ba7583639a274c434bbe6ef797115a4'] = 'Registrieren'; +$_MODULE['<{dejala}prestashop>dejala_home_72429bbc9acf8e6fcf6132ac1fa20d57'] = 'Ich habe bereits ein Konto für meinen Shop:'; +$_MODULE['<{dejala}prestashop>dejala_home_051672911a3f1f05efba78a553ef6fe2'] = 'Anmeldung:'; +$_MODULE['<{dejala}prestashop>dejala_home_b341a59d5636ed3d6a819137495b08a0'] = 'Kennwort:'; +$_MODULE['<{dejala}prestashop>dejala_home_e5b47edd743751a81819b7f421639303'] = 'Log-in'; +$_MODULE['<{dejala}prestashop>dejala_home_853fe2c3719fab6d1dde555eb536f649'] = 'Dejala.fr'; +$_MODULE['<{dejala}prestashop>dejala_home_02d222897fd57cbc8154be7b2c41e2ff'] = 'Zur Erinnerung:'; +$_MODULE['<{dejala}prestashop>dejala_home_3a40880c274dd353056ce584940d1ca8'] = 'Der Name Ihres Shops ist'; +$_MODULE['<{dejala}prestashop>dejala_home_55724d105b50b04063a21fba83236de6'] = 'Ihr Login ist'; +$_MODULE['<{dejala}prestashop>dejala_home_bbb658f348426b60b3395d5357225112'] = 'Sie sind auf der'; +$_MODULE['<{dejala}prestashop>dejala_home_c8ab370eeab3cf4011e25fa953031e77'] = 'Testplattform'; +$_MODULE['<{dejala}prestashop>dejala_home_68279960d4eaab19115d276486e1e1d7'] = 'Betriebsplattform'; +$_MODULE['<{dejala}prestashop>dejala_home_64baa4dba37ddc4207a777ac53565f06'] = 'Zum Test-Modus wechseln '; +$_MODULE['<{dejala}prestashop>dejala_home_a0802ed7a4e243cc01699e44e0b0b33b'] = 'Zum Betriebsmodus wechseln '; +$_MODULE['<{dejala}prestashop>dejala_home_104cdbe9fcaa62064ecc718b647c2929'] = 'Ihre Bitte um Echtzeitbetrieb wird bearbeitet: Dejala.fr wird Sie kontaktieren, um Ihre Registrierung abzuschließen.'; +$_MODULE['<{dejala}prestashop>dejala_home_1ccd621bb658777957a0c0ae95b97fc6'] = 'Echtzeitbetrieb: bitten Sie Dejala um Erstellung Ihres Betriebskontos'; +$_MODULE['<{dejala}prestashop>dejala_home_9c8a7900448628ee2978be9a3945d148'] = 'Ihr Guthaben'; +$_MODULE['<{dejala}prestashop>dejala_home_b0ee4c529eda15bdecda8bf189a3c813'] = 'Ihr virtuelles Guthaben (zu Testzwecken)'; +$_MODULE['<{dejala}prestashop>dejala_home_defcb35db6f9bdac29b888bfc07e6386'] = 'Euro'; +$_MODULE['<{dejala}prestashop>dejala_home_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Stocken Sie Ihr Konto auf'; +$_MODULE['<{dejala}prestashop>dejala_home_d33b3ef83df48e14035b6927a27a6824'] = 'Dejala IST FÜR KEINEN Nutzer sichtbar'; +$_MODULE['<{dejala}prestashop>dejala_home_8ce5717d0efdee714d5c44eb72559943'] = 'Dejala IST FÜR ALLE Nutzer sichtbar'; +$_MODULE['<{dejala}prestashop>dejala_home_97f9bae265c399ce4781878d46a5a733'] = 'Dejala IST NUR für folgende Nutzer sichtbar'; +$_MODULE['<{dejala}prestashop>dejala_home_66495952bdab30f6bdc92e318d4f36a6'] = '(Z.B.: a@foo.com, b@bar.com)'; +$_MODULE['<{dejala}prestashop>dejala_home_e49df857f0f92d5dd2f73b9fa54d7308'] = 'Aktualisieren Sie die Sichtbarkeit von Dejala '; +$_MODULE['<{dejala}prestashop>dejala_location_ce9142ea2df85cf8ea4dfda7164e7dcf'] = 'Bitte geben Sie die Adresse Ihres Lagers an'; +$_MODULE['<{dejala}prestashop>dejala_location_c58b3ccfae7d8991a1bdf33f275d6007'] = '(Readonly)'; +$_MODULE['<{dejala}prestashop>dejala_location_20dfc4f904ba3c650a578c41f87e7053'] = 'Suchen'; +$_MODULE['<{dejala}prestashop>dejala_location_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Firma'; +$_MODULE['<{dejala}prestashop>dejala_location_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{dejala}prestashop>dejala_location_783cb853aae6984e51583b3bb80c09d2'] = 'Adresse (2)'; +$_MODULE['<{dejala}prestashop>dejala_location_9b514b51d03075005814a33edc74c958'] = 'Postleitzahl'; +$_MODULE['<{dejala}prestashop>dejala_location_57d056ed0984166336b7879c2af3657f'] = 'Stadt'; +$_MODULE['<{dejala}prestashop>dejala_location_bcc254b55c4a1babdf1dcb82c207506b'] = 'Telefon'; +$_MODULE['<{dejala}prestashop>dejala_location_4e186c431f7c016c761c722debb9768e'] = 'mobil'; +$_MODULE['<{dejala}prestashop>dejala_location_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Kommentare'; +$_MODULE['<{dejala}prestashop>dejala_location_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren '; +$_MODULE['<{dejala}prestashop>dejala_menu_8cf04a9734132302f96da8e113e80ce5'] = 'Startseite'; +$_MODULE['<{dejala}prestashop>dejala_menu_ce5bf551379459c1c61d2a204061c455'] = 'Ort'; +$_MODULE['<{dejala}prestashop>dejala_menu_9aa698f602b1e5694855cee73a683488'] = 'Kontakte'; +$_MODULE['<{dejala}prestashop>dejala_menu_77ea79b4b2638f146bf02ea6dc076006'] = 'Prozesse'; +$_MODULE['<{dejala}prestashop>dejala_menu_3eb0f1d14d6ec438d91fcfdab94fc1ca'] = 'Lieferoptionen'; +$_MODULE['<{dejala}prestashop>dejala_menu_e16dd6e118732c5d1586d6aba0b62f3a'] = 'Preise'; +$_MODULE['<{dejala}prestashop>dejala_menu_9bbd45bad55cfc620803907f2d8a0217'] = 'Abrechnung'; +$_MODULE['<{dejala}prestashop>dejala_menu_36d5423bb12a6d74d1d0f0ba09ef47cb'] = 'Technische Optionen'; +$_MODULE['<{dejala}prestashop>dejala_menu_35cf95ca41b6d074cfaeac16b0e0906c'] = 'DEJALA PRO'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_845398bc903ec28114a5f9874d83936b'] = 'Lager ist geöffnet'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_2084c04f7a380a68b653e5fc82d352f0'] = 'Von'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_7fc56270e7a70fa81a5935b72eacbe29'] = 'Bis'; +$_MODULE['<{dejala}prestashop>dejala_processes_237527ad3e0c9d87f072f2ac3a873dc8'] = 'Bitte geben Sie die Prozesse für eine ordnungsgemäße Handhabung der Lieferung an'; +$_MODULE['<{dejala}prestashop>dejala_processes_0f516eb68a85aae932001976c51dee2f'] = 'Sie können die Standardprozesse frei an Ihre Geschäftsprozesse anpassen'; +$_MODULE['<{dejala}prestashop>dejala_processes_dbfdb39c2251ff72f42f7078ab347611'] = 'Falsche Adresse'; +$_MODULE['<{dejala}prestashop>dejala_processes_b1da17cfc7c9a051fe4ce45bf1dd1ace'] = 'Empfänger abwesend'; +$_MODULE['<{dejala}prestashop>dejala_processes_3ab0370c6e7c3d0ea1cd540e7afacc9a'] = 'Lieferung abgelehnt'; +$_MODULE['<{dejala}prestashop>dejala_processes_138a10902b1fec08bcf2d9f5a6f4b02b'] = 'Liefer-Verpackung'; +$_MODULE['<{dejala}prestashop>dejala_processes_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren '; +$_MODULE['<{dejala}prestashop>dejala_products_aa83582f6ce84345c97815de714e6ebd'] = 'Bitte stellen Sie Ihre Liefermarge ein '; +$_MODULE['<{dejala}prestashop>dejala_products_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{dejala}prestashop>dejala_products_26160d42b371fb091c142cb8cfa09c34'] = 'Kaufpreis'; +$_MODULE['<{dejala}prestashop>dejala_products_f8ca05a1d72f37501747657deecdd15c'] = 'Marge inkl. MwSt.'; +$_MODULE['<{dejala}prestashop>dejala_products_e6f254c2f6e55725e99e1e6dfd6d9caa'] = 'Kundenpreis'; +$_MODULE['<{dejala}prestashop>dejala_products_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Beschreibung'; +$_MODULE['<{dejala}prestashop>dejala_products_1cdad1a5f8e5d09be270415e44c0f039'] = 'Kaufen zzgl. MwSt. '; +$_MODULE['<{dejala}prestashop>dejala_products_ecef91ba37ffc5f5294ea50efee7c6a2'] = 'Kaufen inkl. MwSt.'; +$_MODULE['<{dejala}prestashop>dejala_products_765a24c102d9a0b03eb03c77e90a9144'] = 'Verkaufen zzgl. MwSt. '; +$_MODULE['<{dejala}prestashop>dejala_products_8588719c33b27bd80ae45cc533117c00'] = 'Verkaufen inkl. MwSt.'; +$_MODULE['<{dejala}prestashop>dejala_products_efeb369cccbd560588a756610865664c'] = 'In'; +$_MODULE['<{dejala}prestashop>dejala_products_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_products_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b44c4d973c20b84bad66d243b215ef37'] = 'Triggerstatusliste'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_a296002220093a4833752a3cf94f07d0'] = 'Liste der Status, die dejala.fr triggern'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren '; +$_MODULE['<{dejala}prestashop>dejala_timetable_193993f964d2d4df4b1484227c1626b6'] = 'Wählen Sie Ihren Liefertag'; +$_MODULE['<{dejala}prestashop>dejala_timetable_26903e0f192163f4a0957c0b185edf71'] = 'Wählen Sie Ihre Lieferzeitspanne'; +$_MODULE['<{dejala}prestashop>dejala_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Sonntag'; +$_MODULE['<{dejala}prestashop>dejala_6f8522e0610541f1ef215a22ffa66ff6'] = 'Montag'; +$_MODULE['<{dejala}prestashop>dejala_5792315f09a5d54fb7e3d066672b507f'] = 'Dienstag'; +$_MODULE['<{dejala}prestashop>dejala_796c163589f295373e171842f37265d5'] = 'Mittwoch'; +$_MODULE['<{dejala}prestashop>dejala_78ae6f0cd191d25147e252dc54768238'] = 'Donnerstag'; +$_MODULE['<{dejala}prestashop>dejala_c33b138a163847cdb6caeeb7c9a126b4'] = 'Freitag'; +$_MODULE['<{dejala}prestashop>dejala_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samstag'; +$_MODULE['<{dejala}prestashop>dejala_9902522831a16af239ba868918f984c6'] = 'Dejala.com: Lieferung per Kurier'; +$_MODULE['<{dejala}prestashop>dejala_69a226fe54256a93edb693bc97a7bcb5'] = 'Lassen Sie Dejala.com Ihre Lieferungen per Kurier übernehmen'; +$_MODULE['<{dejala}prestashop>dejala_f66e08578735b3cde28a2d8215b68a52'] = 'Das Dejala-Modul benötigt die PHP-Erweiterung cURL, um ordnungsgemäß zu funktionieren. Bitte installieren Sie diePHP-Erweiterung \"cURL\"'; +$_MODULE['<{dejala}prestashop>dejala_0e334c81db8c621e16d82618aaf746ab'] = 'Login ist erforderlich.'; +$_MODULE['<{dejala}prestashop>dejala_2a04cf556c49e32d4b4c46fd9b8bade5'] = 'Kennwort ist erforderlich.'; +$_MODULE['<{dejala}prestashop>dejala_483cf1f6e275faa3c29ff20ba6e4407f'] = 'Land ist erforderlich.'; +$_MODULE['<{dejala}prestashop>dejala_2485b5c3212614c367f862a8e46f4d11'] = 'Das Login muss eine gültige E-Mail-Adresse sein.'; +$_MODULE['<{dejala}prestashop>dejala_dd189cdaa73e88a19f495a0d6c49a61b'] = 'Shop Name ist erforderlich.'; +$_MODULE['<{dejala}prestashop>dejala_4876f72a0b3d7f46de2b201ab02cd0a7'] = 'ist keine gültige Marge.'; +$_MODULE['<{dejala}prestashop>dejala_ad5ee5e5c2989c1e72c586a9f8121716'] = 'Ein Fehler trat während der Authentifizierung Ihres Kontos auf Dejala.com auf. Ihre Zugangsdaten wurden nicht erkannt'; +$_MODULE['<{dejala}prestashop>dejala_23e0f5b7cc6e26112230c098b893944a'] = 'Unmöglich, die Handlung durchzuführen'; +$_MODULE['<{dejala}prestashop>dejala_6bd82dd0c6115429b03dd84828d6ccb2'] = 'Bitte wählen Sie ein anderes Login'; +$_MODULE['<{dejala}prestashop>dejala_0aec12d0e7c8784012ee74606648d625'] = 'Dejala Server ist von Ihrem Prestashop Server nicht erreichbar. Dies ist sicherlich auf eine Begrenzung von Ihrem Hosting-Provider zurückzuführen. Bitte kontaktieren Sie seinen technischen Support und fragen Sie, ob Ihr Server autorisiert ist, ausgehende HTTP-Verbindungen zu initiieren'; +$_MODULE['<{dejala}prestashop>dejala_f46fe05842135a72df96c3409cf00683'] = 'Fehler beim Aktualisieren des Standorts'; +$_MODULE['<{dejala}prestashop>dejala_2f63af6e20f182573774b785515ccb95'] = 'Fehler beim Aktualisieren der Kontakte'; +$_MODULE['<{dejala}prestashop>dejala_3a29c6eb6abefd3d629290756168d892'] = 'Fehler beim Aktualisieren der Prozesse'; +$_MODULE['<{dejala}prestashop>dejala_5f010efe1c8e6cb195205cbf864044aa'] = 'Fehler beim Aktualisieren der Produkte'; +$_MODULE['<{dejala}prestashop>dejala_004ac360e91b3dcf50a19a0fd09e3826'] = 'Sie müssen mindestens eine E-Mail-Adresse angeben, um Dejalas Sichtbarkeit zu begrenzen'; +$_MODULE['<{dejala}prestashop>dejala_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{dejala}prestashop>dejala_dfa53d8241c9f6908e669371b50e95f3'] = 'Dieses Modul benötigt die PHP-Erweiterung cURL, um ordnungsgemäß zu funktionieren. Bitte installieren Sie zuerst die PHP-Erweiterung \"cURL\"'; +$_MODULE['<{dejala}prestashop>dejala_4c7d16a1e83bcbfd9b33e95f8e90a625'] = 'Ein Fehler trat während der Authentifizierung Ihres Kontos auf Dejala.com auf. Dies kann an einem vorübergehenden Netzwerk- oder Plattform-Problem liegen. Bitte versuchen Sie es später noch einmal oder kontaktieren Sie Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_94939d114a8c65173b70b6e01aad11c0'] = 'Ein Fehler ist beim Laden aufgetreten, bitte versuchen Sie es später noch einmal oder kontaktieren Sie Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_41d211dd68bf0f87cf3181b0c8dac6e7'] = 'Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_3d8764621d6076807b0d60cfcadb7213'] = 'Wenn Sie es wünschen... Kradmelder'; +$_MODULE['<{dejala}prestashop>dejala_627db4c965627fb7f03682dbbc43a4a1'] = 'Ich wähle mein Lieferdatum, wenn mein Produkt verfügbar ist'; +$_MODULE['<{dejala}prestashop>dejala_07e9ea0147aee652244a280da00efb5a'] = 'Lieferdatum ausgewählt'; +$_MODULE['<{dejala}prestashop>dejala_47a4dfe5ab79feb7884fa57786ea587c'] = 'ab'; +$_MODULE['<{dejala}prestashop>dejala_ba93cc89ba75ee6e74699a49a69c0600'] = 'Lieferdatum noch nicht vom Kunden gewählt'; +$_MODULE['<{dejala}prestashop>dejala_a240fa27925a635b08dc28c9e4f9216d'] = 'Bestellen'; +$_MODULE['<{dejala}prestashop>dejala_296a91ebe13e861efa9bd0f74a927353'] = 'Bestellung an Dejala gesandt'; + +?> \ No newline at end of file diff --git a/modules/dejala/dejala.php b/modules/dejala/dejala.php new file mode 100644 index 000000000..8d557163a --- /dev/null +++ b/modules/dejala/dejala.php @@ -0,0 +1,1359 @@ +<?php + +if (!defined('_CAN_LOAD_FILES_')) + exit; + + require_once(_PS_MODULE_DIR_ . "dejala/dejalaconfig.php"); + require_once(_PS_MODULE_DIR_ . "dejala/dejalautils.php"); + require_once(_PS_MODULE_DIR_ . "dejala/dejalacarrierutils.php"); + require_once(_PS_MODULE_DIR_ . "dejala/dejalacart.php"); + require_once(_PS_MODULE_DIR_ . "dejala/calendarutils.php"); + + +/** + * This module enables the interractions with dejala.com carrier services +**/ +class Dejala extends CarrierModule +{ + const INSTALL_SQL_FILE = 'install.sql'; + public $DEJALA_DEBUG = FALSE; + public $dejalaConfig; + public $id_lang ; + private $wday_labels ; + private static $INSTANCE = NULL ; + + static public function getInstance() + { + if (!self::$INSTANCE) + { + self::$INSTANCE = new Dejala(); + } + return self::$INSTANCE; + } + + public function __construct() + { + global $cookie ; + + //TODO Iso code of countries where the module can be used, if none module available for all countries + $this->limited_countries = array('fr'); + $this->name = 'dejala'; + $this->tab = 'shipping_logistics'; + $this->version = 1.4; + $this->internal_version = '1.3'; + $this->id_lang = (!isset($cookie) OR !is_object($cookie)) ? (int)(Configuration::get('PS_LANG_DEFAULT')) : (int)($cookie->id_lang); + $this->wday_labels = array($this->l('Sunday'), $this->l('Monday'), $this->l('Tuesday'), $this->l('Wednesday'), $this->l('Thursday'), $this->l('Friday'), $this->l('Saturday')); + + parent::__construct(); + + // The parent construct is required for translations + $this->page = basename(__FILE__, '.php'); + $this->displayName = $this->l('Dejala.com : Courier delivery'); + $this->description = $this->l('Lets Dejala.com handle your deliveries by courier'); + + // load configuration only if installed + if ($this->id) + { + if (true !== extension_loaded('curl')) + { + $this->warning = $this->l('The Dejala module requires php extension cURL to function properly. Please install the php extension "cURL"'); + } + + $this->dejalaConfig = new DejalaConfig(); + $this->dejalaConfig->loadConfig(); + + // Update table schema + if (!isset($this->dejalaConfig->internal_version) || $this->dejalaConfig->internal_version < $this->internal_version) + { + $this->unregisterHook('cart') ; + $res = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'dejala_cart` LIMIT 1') ; + if ($res) + { + if (!array_key_exists('cart_date_upd', (int)$res[0])) + { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'dejala_cart` ADD COLUMN cart_date_upd DATETIME DEFAULT 0;'); + } + if (!array_key_exists('delivery_price', (int)$res[0])) + { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'dejala_cart` ADD COLUMN delivery_price FLOAT DEFAULT NULL;'); + } + } + $this->dejalaConfig->internal_version = $this->internal_version ; + $this->dejalaConfig->saveConfig() ; + } + } + } + + + /** + * install dejala module + */ + public function install() + { + if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return (false); + elseif (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return (false); + + $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); + $sql = preg_split("/;\s*[\r\n]+/",$sql); + + foreach ($sql as $query) + if (!empty($query)) + { + if (!Db::getInstance()->Execute(trim($query))) + return (false); + } + + if (parent::install() == false + OR $this->registerHook('updateOrderStatus') == false + OR $this->registerHook('extraCarrier') == false + OR $this->registerHook('processCarrier') == false) + return (false); + + + $this->dejalaConfig = new DejalaConfig(); + if (!$this->dejalaConfig->saveConfig()) + return (false); + + DejalaCarrierUtils::createDejalaCarrier($this->dejalaConfig) ; + return (true); + } + + public function uninstall() + { + + // If Dejala is default carrier, try to set another one as default + $djlCarrier = DejalaCarrierUtils::getCarrierByName($this->name) ; + if (Configuration::get('PS_CARRIER_DEFAULT') == (int)($djlCarrier->id)) + { + $carriers = Carrier::getCarriers($cookie->id_lang, true, false, false, NULL, PS_CARRIERS_AND_CARRIER_MODULES_NEED_RANGE); + foreach($carriers as $carrier) + { + if ($carrier['active'] AND !$carrier['deleted'] AND ($carrier['external_module_name'] != $this->name)) + { + Configuration::updateValue('PS_CARRIER_DEFAULT', (int)$carrier['id_carrier']); + break ; + } + } + } + $djlCarrier->deleted = 1; + if (!$djlCarrier->update()) return false; + + $this->dejalaConfig->uninstall(); + if (!parent::uninstall() OR + !$this->unregisterHook('updateOrderStatus') OR + !$this->unregisterHook('extraCarrier') OR + !$this->unregisterHook('processCarrier')) + return false; + + return true; + } + + + /** + * Data validation for module configuration + **/ + public function _postValidation() + { + $errors = array(); + + $method = Tools::getValue('method'); + if ($method == 'signin') + { + if (empty($_POST['login'])) + $errors[] = $this->l('login is required.'); + if (empty($_POST['password'])) + $errors[] = $this->l('password is required.'); + if (empty($_POST['country'])) + $errors[] = $this->l('country is required.'); + } + else if ($method == 'register') + { + if (empty($_POST['login'])) + $errors[] = $this->l('login is required.'); + if (empty($_POST['login']) OR !Validate::isEmail($_POST['login'])) + $errors[] = $this->l('login must be a valid e-mail address.'); + if (empty($_POST['password'])) + $errors[] = $this->l('password is required.'); + if (empty($_POST['store_name'])) + $errors[] = $this->l('Shop name is required.'); + if (empty($_POST['country'])) + $errors[] = $this->l('country is required.'); + } + else if ($method == 'products') + { + $products = array(); + $djlUtil = new DejalaUtils(); + $responseArray = $djlUtil->getStoreProducts($this->dejalaConfig, $products); + if ('200' != $responseArray['status']) + $products = array(); + foreach ($_POST as $key=>$value) + { + if (0 === strpos($key, 'margin_')) + { + $this->mylog( "key=" . substr($key, 7) ); + $productID = (int)(substr($key, 7)); + if ( is_null($_POST[$key]) || (0 == strlen($_POST[$key])) ) + $_POST[$key] = 0; + $_POST[$key] = str_replace(',', '.', $_POST[$key]); + $_POST[$key] = str_replace(' ', '', $_POST[$key]); + + if (!Validate::isFloat($_POST[$key])) + { + $errors[] = $value . ' ' . $this->l('is not a valid margin.'); + } + $margin = (float)($_POST[$key]); + foreach ($products as $l_product) + { + if ((int)$l_product['id'] == (int)$productID) + { + $product = (int)$l_product; + break; + } + } + if ($product) + { + $vat_factor = (1+ ($product['vat'] / 100)); + $public_price = round($product['price']*$vat_factor, 2); + $public_price = round($public_price + $margin, 2); + if ($public_price < 0) + $errors[] = $value . ' ' . $this->l('is not a valid margin.'); + } + } + } + } + return ($errors); + } + + /** + * Module configuration request processing + **/ + public function _postProcess() + { + global $smarty; + + $errors = array(); + $method = Tools::getValue('method'); + if ($method == 'signin') + { + $djlUtil = new DejalaUtils(); + $this->dejalaConfig->mode = 'TEST'; + $this->dejalaConfig->login = Tools::getValue('login'); + $this->dejalaConfig->password = Tools::getValue('password'); + $this->dejalaConfig->country = Tools::getValue('country'); + $this->dejalaConfig->serviceURL = str_replace('.fr', '.'.$this->dejalaConfig->country, $this->dejalaConfig->serviceURL); + $this->dejalaConfig->sandboxServiceURL = str_replace('.fr', '.'.$this->dejalaConfig->country, $this->dejalaConfig->sandboxServiceURL); + $storeAttr = array(); + $response = $djlUtil->ping($this->dejalaConfig, 'TEST'); + if ($response['status'] == 200) + { + $this->dejalaConfig->saveConfig(); + } + else + { + if ($response['status'] == 401) + $errors[] = $this->l('An error occurred while authenticating your account on Dejala.com. Your credentials were not recognized.'); + else + $errors[] = $this->l('Unable to process the action.') . '(' . $response['status'] . ')'; + + $this->dejalaConfig->login = null; + $this->dejalaConfig->password = null; + } + } + else if ($method == 'register') + { + $djlUtil = new DejalaUtils(); + $this->dejalaConfig->mode = 'TEST'; + $this->dejalaConfig->login = Tools::getValue('login'); + $this->dejalaConfig->password = Tools::getValue('password'); + $this->dejalaConfig->country = Tools::getValue('country'); + $this->dejalaConfig->serviceURL = str_replace('.fr', '.'.$this->dejalaConfig->country, $this->dejalaConfig->serviceURL); + $this->dejalaConfig->sandboxServiceURL = str_replace('.fr', '.'.$this->dejalaConfig->country, $this->dejalaConfig->sandboxServiceURL); + $this->dejalaConfig->storeUrl = Dejala::getHttpHost(true, true) ; + $response = $djlUtil->createInstantStore($this->dejalaConfig, Tools::getValue('store_name')); + if ($response['status'] == 201) + $this->dejalaConfig->saveConfig(); + elseif ($response['status'] == 409) + $errors[] = $this->l('Please choose another login'); + elseif ($response['status'] == 403) + $errors[] = $this->l('Dejala Server cannot be reached by your Prestashop server. This is most likely due to a limit set by your hosting provider. Please contact their technical support and ask if your server is authorized to initiate outbound HTTP connections.'); + else + $errors[] = $this->l('Unable to process the action.') . '(' . $response['status'] . ')'; + $this->dejalaConfig->loadConfig(); + } + else if ($method == 'location') + { + $djlUtil = new DejalaUtils(); + $response = $djlUtil->setStoreLocation($this->dejalaConfig, $_POST); + if ($response['status'] != 200) + $errors[] = $this->l('An error occurred while updating location'); + } + else if ($method == 'contact') + { + $djlUtil = new DejalaUtils(); + $response = $djlUtil->setStoreContacts($this->dejalaConfig, $_POST); + if ($response['status'] != 200) + $errors[] = $this->l('An error occurred while updating contacts'); + } + else if ($method == 'processes') + { + $djlUtil = new DejalaUtils(); + $response = $djlUtil->setStoreProcesses($this->dejalaConfig, $_POST); + if ($response['status'] != 200) + $errors[] = $this->l('An error occurred while updating processes'); + } + else if ($method == 'products') { + $djlUtil = new DejalaUtils(); + $response = $djlUtil->setStoreProducts($this->dejalaConfig, $_POST); + if ($response['status'] != 200) + $errors[] = $this->l('An error occurred while updating products'); + } + else if ($method == 'technical_options') + { + $maxSatuses = (int)$_POST['status_max']; + if ($maxSatuses > 30) + $maxSatuses = 30; + $selectedTriggers=array(); + for ($i = 0; $i < $maxSatuses; $i++) + { + $l_val = Tools::getValue('status_'.$i); + if ($l_val) + $selectedTriggers[] = $l_val; + } + $trigerringStatuses = implode(',', $selectedTriggers); + $this->dejalaConfig->trigerringStatuses = htmlentities($trigerringStatuses, ENT_COMPAT, 'UTF-8'); + $this->dejalaConfig->saveConfig(); + $this->dejalaConfig->loadConfig(); + } + else if ($method == 'delivery_options') + { + $djlUtil = new DejalaUtils(); + $response = $djlUtil->setStoreCalendar($this->dejalaConfig, $_POST); + if ($response['status'] != 200) + $errors[] = $this->l('An error occurred while updating products'); + + $m_attributes['nb_days_displayed'] = htmlentities(Tools::getValue('nb_days'), ENT_COMPAT, 'UTF-8'); + $m_attributes['delivery_delay'] = htmlentities(Tools::getValue('delivery_delay'), ENT_COMPAT, 'UTF-8'); + $m_attributes['delivery_partial'] = htmlentities(Tools::getValue('delivery_partial'), ENT_COMPAT, 'UTF-8'); + + $response = $djlUtil->setStoreAttributes($this->dejalaConfig, $m_attributes); + if ($response['status'] != 200) + $errors[] = $this->l('An error occurred while updating products'); + + } + else if ($method == 'golive') + { + $djlUtil = new DejalaUtils(); + $response = $djlUtil->goLive($this->dejalaConfig, $_POST); + } + else if ($method == 'switchMode') + { + $l_mode = Tools::getValue('mode'); + if ( ('PROD' == $l_mode) || ('TEST' == $l_mode) ) + { + $this->dejalaConfig->mode = $l_mode; + $this->dejalaConfig->saveConfig(); + } + } + else if ($method == 'switchActive') + { + + $l_active = Tools::getValue('visibility_status'); + + if (($l_active == "visible") || ($l_active == "invisible")) + { + $this->dejalaConfig->visibility_status = $l_active; + $this->dejalaConfig->saveConfig(); + } + if ($l_active == "visible_limited") + { + $l_active_list = Tools::getValue('visible_users_list'); + if ($l_active_list == "") + { + $this->dejalaConfig->visible_users_list = ""; + $this->dejalaConfig->saveConfig(); + + $errors[] = $this->l('You must provide at least one email address to restrict Dejala\'s visibility.'); + } + else + { + $this->dejalaConfig->visibility_status = $l_active; + $this->dejalaConfig->visible_users_list = $l_active_list; + $this->dejalaConfig->saveConfig(); + } + } + } + else + $errors[] = $this->l('Unable to process the action.'); + + return ($errors); + } + + public function getContent() + { + global $smarty; + + $smarty->assign('country', $this->dejalaConfig->country); + $output = $this->display(__FILE__, 'dejala_header.tpl'); + if (!empty($_POST)) + { + $errors = $this->_postValidation(); + if (!count($errors)) + $errors = $this->_postProcess(); + if (count($errors)) + foreach ($errors AS $err) + $output .= '<div class="alert error">'. $err .'</div>'; + else + { + $method = Tools::getValue('method'); + $output .= '<div class="conf confirm"> + <img src="../img/admin/ok.gif" alt="" title="" /> + '.$this->l('Settings updated').(($method == 'signin' OR $method == 'register' OR $method == 'golive') ? '<img src="http://www.prestashop.com/modules/dejala.png?pspid='.urlencode($this->dejalaConfig->login).'&mode='.($this->dejalaConfig->mode == 'TEST' ? 0 : 1).'" style="float:right" />' : '').' + </div>'; + } + } + $output = $output . $this->displayForm(); + return ($output); + } + + + public function displayForm() + { + global $smarty, $cookie; + + $errors = array(); + $outputMain = ''; + $smarty->assign("djl_mode", $this->dejalaConfig->mode); + $smarty->assign("disabled", ''); + if ($this->dejalaConfig->mode == 'PROD') + $smarty->assign("disabled", 'disabled="disabled"'); + if (true !== extension_loaded('curl')) + { + $errors[] = $this->l('This module requires php extension cURL to function properly. Please install the php extension "cURL" first.'); + $smarty->assign("disabled", 'disabled="disabled"'); + } + + $registered = TRUE; + if ((0 == strlen($this->dejalaConfig->login)) || (0 == strlen($this->dejalaConfig->password))) + $registered= FALSE; + + if ($registered) + { + $djlUtil = new DejalaUtils(); + $responsePing = $djlUtil->ping($this->dejalaConfig, $this->dejalaConfig->mode); + if (200 != $responsePing['status']) + { + if (401 == $responsePing['status']) + $errors[] = $this->l('An error occurred while authenticating your account on Dejala.com. Your credentials were not recognized.'); + else + $errors[] = $this->l('An error occurred while authenticating your account on Dejala.com. This may be due to a temporary network or platform problem. Please try again later or contact Dejala.com'); + unset($_GET['cat']); + $registered= FALSE; + } + } + + $smarty->assign("registered", $registered?"1":"0"); + + + if (!isset($_GET['cat']) || ($_GET['cat']==='home') || ($_GET['cat']==='')) + $currentTab="home"; + else + $currentTab=$_GET['cat']; + + $smarty->assign("currentTab", $currentTab); + $smarty->assign("moduleConfigURL", 'index.php?tab=AdminModules&configure=dejala&token='.$_GET['token']); + $smarty->assign("formAction", $_SERVER['REQUEST_URI']); + $outputMenu = $this->display(__FILE__, 'dejala_menu.tpl'); + + if ($currentTab==='home') + { + $smarty->assign("login", html_entity_decode(Configuration::get('PS_SHOP_EMAIL'), ENT_COMPAT, 'UTF-8')); + if ($registered) + { + $smarty->assign("visibility_status", $this->dejalaConfig->visibility_status); + $smarty->assign("visible_users_list", $this->dejalaConfig->visible_users_list); + $smarty->assign("store_login", html_entity_decode($this->dejalaConfig->login, ENT_COMPAT, 'UTF-8')); + $smartifyErrors = $this->smartyfyStoreAttributes(); + if (isset($smartifyErrors) && count($smartifyErrors)) + $errors = $smartifyErrors; + } + else + { + $shopName = Configuration::get('PS_SHOP_NAME'); + if (strlen($shopName) >= 15) + $shopName = substr($shopName, 0, 15); + $smarty->assign("store_name", html_entity_decode($shopName, ENT_COMPAT, 'UTF-8')); + } + $outputMain = $this->display(__FILE__, 'dejala_home.tpl'); + } + else if ($currentTab==='contacts') + { + $contacts = array(); + $djlUtil = new DejalaUtils(); + $responseArray = $djlUtil->getStoreContacts($this->dejalaConfig, $contacts); + if ('200' == $responseArray['status']) + { + foreach ($contacts as $contactName=>$contactData) { + foreach ($contactData as $key=>$value) { + $smarty->assign($contactName.'_'.$key, $value); + } + } + } + $outputMain = $this->display(__FILE__, 'dejala_contacts.tpl'); + } + else if ($currentTab === 'location') + { + $location = array(); + $djlUtil = new DejalaUtils(); + $responseArray = $djlUtil->getStoreLocation($this->dejalaConfig, $location); + if ('200' == $responseArray['status']) + { + foreach ($location as $key=>$value) + $smarty->assign($key, $value); + + $outputMain = $this->display(__FILE__, 'dejala_location.tpl'); + } + } + else if ($currentTab==='processes') + { + $processes = array(); + $djlUtil = new DejalaUtils(); + $responseArray = $djlUtil->getStoreProcesses($this->dejalaConfig, $processes); + if ('200' == $responseArray['status']) + { + foreach ($processes as $key=>$value) + $smarty->assign($key, $value); + + $outputMain = $this->display(__FILE__, 'dejala_processes.tpl'); + } + } + else if ($currentTab==='prices') + { + $products = array(); + $djlUtil = new DejalaUtils(); + $responseArray = $djlUtil->getStoreProducts($this->dejalaConfig, $products); + if ('200' == $responseArray['status']) + { + //price = price_HT*(inv_vat) + foreach ($products as &$product) + { + $vat_factor = (1+ ($product['vat'] / 100)); + $product['price_notax'] = number_format($product['price'], 2, '.', ''); + $product['price'] = number_format(round($product['price']*$vat_factor, 2), 2, '.', ''); + $product['public_price'] = number_format(round($product['price'] + $product['margin'], 2), 2, '.', ''); + $product['public_price_notax'] = number_format(round($product['public_price']/$vat_factor, 2), 2, '.', ''); + } + $smarty->assign('products', $products); + $outputMain = $this->display(__FILE__, 'dejala_products.tpl'); + } + } + else if ($currentTab === 'accounting') + { + $smartifyErrors = $this->smartyfyStoreAttributes(); + if (isset($smartifyErrors) && count($smartifyErrors)) + $errors = $smartifyErrors; + + $djlUtil = new DejalaUtils(); + $deliveries = array(); + $responseArray = $djlUtil->getStoreDeliveries($this->dejalaConfig, $deliveries); + if ('200'==$responseArray['status']) + { + foreach ($deliveries as &$delivery) + { + $delivery['creation_date'] = date('d/m/Y', $delivery['creation_utc']); + $delivery['creation_time'] = date('H\hi', $delivery['creation_utc']); + if (isset($delivery['shipping_start_utc'])) + { + $delivery['shipping_date'] = date('d/m/Y', $delivery['shipping_start_utc']); + $delivery['shipping_start'] = date('H\hi', $delivery['shipping_start_utc']); + $delivery['shipping_stop'] = date('H\hi', (int)($delivery['shipping_start_utc']) + 3600*(int)($delivery['timelimit']) ); + } + else + { + $delivery['shipping_date'] = ''; + $delivery['shipping_start'] = ''; + $delivery['shipping_stop'] = ''; + } + + if (isset($delivery['delivery_utc'])) + { + $delivery['delivery_date'] = date('d/m/Y', $delivery['delivery_utc']); + $delivery['delivery_time'] = date('H\hi', $delivery['delivery_utc']); + } + } + $smarty->assign('formAction', __PS_BASE_URI__ . 'modules/' . $this->name . '/deliveries_csv.php'); + $smarty->assign('defaultDateFrom', date('01/m/Y')); + $smarty->assign('defaultDateTo', date('d/m/Y')); + $smarty->assign('deliveries', $deliveries); + $outputMain = $this->display(__FILE__, 'dejala_deliveries.tpl'); + } + } + else if ($currentTab==='delivery_options') + { + $outputMain = $this->displayDeliveryOptions(); + } + else if ($_GET['cat']==='technical_options') + { + $states = $this->getOrderStates(); + $triggers = explode(',', $this->dejalaConfig->trigerringStatuses); + $orderStatuses = array(); + foreach ($states as $status) + { + $m_status['id'] = (int)$status['id_order_state']; + $m_status['label'] = $status['name']; + if (in_array($status['id_order_state'], $triggers)) + $m_status['checked'] = '1'; + else + $m_status['checked'] = '0'; + $orderStatuses[] = $m_status; + } + $smarty->assign('statuses', $orderStatuses); + + $smarty->assign('trigerringStatuses', $this->dejalaConfig->trigerringStatuses); + $outputMain = $this->display(__FILE__, 'dejala_technical_options.tpl'); + } + + $outputErr = ''; + if (count($errors)) + foreach ($errors AS $err) + $outputErr .= '<div class="alert error">'. $err .'</div>'; + + $output = $outputErr; + $output = $output . $outputMenu; + $output = $output . $outputMain; + $output = $output . $this->display(__FILE__, 'dejala_footer.tpl'); + return $output; + } + + + // put in smarty context store attributes + function smartyfyStoreAttributes() + { + global $smarty; + + $errors = array(); + $djlUtil = new DejalaUtils(); + $storeAttrs = array(); + $response = $djlUtil->getStoreAttributes($this->dejalaConfig, $storeAttrs); + if (200 != $response['status']) + $errors[] = $this->l('An error occurred while getting store, please try again later or contact Dejala.com'); + else + { + $smarty->assign("account_balance", $storeAttrs['account_balance']); + $smarty->assign("store_name", $storeAttrs['name']); + + // Check if account exists in production + $responsePing = $djlUtil->ping($this->dejalaConfig, 'PROD'); + if ('200' == $responsePing['status']) + $smarty->assign('isLiveReady', '1'); + else + { + $smarty->assign('isLiveReady', '0'); + if (isset($storeAttrs['attributes']) && isset($storeAttrs['attributes']['request_live']) && ($storeAttrs['attributes']['request_live']=='true')) + $smarty->assign('isLiveRequested', '1'); + else + $smarty->assign('isLiveRequested', '0'); + } + } + return ($errors); + } + + + function getOrderStates(){ + global $cookie; + + $states = OrderState::getOrderStates($this->id_lang); + return ($states); + } + + function displayDeliveryOptions(){ + global $smarty; + + /* + Au moment du choix du créneau + Pour déterminer le créneau de départ proposé : + - Aller sur le prochain créneau libre + - Ajouter le délai de traitement de la commande + - Aller sur le prochain créneau libre + + - Le marchand configure l ouverture de sa boutique en weedkay (hStart-hStop) + exception (date fermeture) tous produits confondus + On fait le min au moment de l afichage des creneaux dispo + => trouver une slideBar avec deux curseurs + */ + $output = ''; + $djlUtil = new DejalaUtils(); + $response = $djlUtil->getStoreAttributes($this->dejalaConfig, $store); + if ($response['status'] == 200) + { + $smarty->assign('nb_days', $store['attributes']['nb_days_displayed']); + $smarty->assign('delivery_delay', $store['attributes']['delivery_delay']); + if (isset($store['attributes']['delivery_partial'])) + $smarty->assign('delivery_partial', $store['attributes']['delivery_partial']); + } + + $wday_selected = array(1, 1, 1, 1, 1, 1, 1); + + $smarty->assign('timetable_css', _MODULE_DIR_.$this->name.'/timetable.css'); + $smarty->assign("timetable_js", _MODULE_DIR_.$this->name.'/timetable.js'); + $smarty->assign("weekdayLabels", $this->wday_labels); + $smarty->assign("weekdaySelected", $wday_selected); + + + $calendar = array(); + $response = $djlUtil->getStoreCalendar($this->dejalaConfig, $calendar); + if ($response['status'] == 200) + { + $smarty->assign("calendar", $calendar); + $smarty->assign("timetableTpl", dirname(__FILE__)."/dejala_picking_timetable.tpl"); + } + $output = $output . $this->display(__FILE__, 'dejala_delivery_options.tpl'); + + return ($output); + } + + /** + * Retourne FALSE si un des produits du cart n'est pas en stock, retourne FALSE sinon + **/ + function isCartOutOfStock($cart) + { + $products = $cart->getProducts(); + foreach ($products as $product) + { + $this->mylog('product:'); + $this->mylog($this->logValue($product, 1)); + + $orderedQuantity = (_PS_VERSION_ < "1.3.0.1" ? (int)($product['quantity']) : (int)($product['cart_quantity'])); + $productQuantity = (int)($product['stock_quantity']); + if ( ($productQuantity < $orderedQuantity) || ($productQuantity <= 0) ) + return (TRUE); + } + return (FALSE); + } + + + /** + ** Affiche le transporteur Dejala.com dans la liste des transporteurs sur le Front Office + */ + public function hookExtraCarrier($params) + { + global $smarty, $defaultCountry; + + $cart = $params['cart']; + $cookie = $params['cookie']; + + $this->hooklog("ExtraCarrier", $params); + + // Check if Dejala should be visible + if ($this->dejalaConfig->visibility_status == "invisible") + return ; + + if (($this->dejalaConfig->visibility_status == "visible_limited") && ((int)($cookie->id_customer) > 0)) + { + $customer = new Customer((int)($cookie->id_customer)); + if (!in_array($customer->email, preg_split("/[\s,]+/", $this->dejalaConfig->visible_users_list))) + return ; + } + + $djlUtil = new DejalaUtils(); + $responseGetStore = $djlUtil->getStoreAttributes($this->dejalaConfig, $store); + if ($responseGetStore['status']!='200') + return ; + + $isCartOutOfStock = '0'; + if ($this->isCartOutOfStock($cart)) + $isCartOutOfStock = '1'; + $this->mylog('isCartOutOfStock=' . $isCartOutOfStock . ''); + + $acceptPartial = true; + if (!isset($store['attributes']) || !isset($store['attributes']['delivery_partial']) || ($store['attributes']['delivery_partial'] != '1')) + $acceptPartial = false; + if ( ($isCartOutOfStock == '1') && !$acceptPartial) + return ; + + $electedProduct = $this->getDejalaProduct($cart) ; + // Get id zone + if (isset($cart->id_address_delivery) AND $cart->id_address_delivery) + $id_zone = (int)Address::getZoneById((int)($cart->id_address_delivery)); + else + $id_zone = (int)$defaultCountry->id_zone; + + $djlCarrier = DejalaCarrierUtils::getCarrierByName($this->name) ; + + $this->mylog("electedCarrier=" . $this->logValue($djlCarrier,1)); + + if ($djlCarrier == null) + return null ; + + // Calcul des dates dispo + $productCalendar = $electedProduct['calendar']['entries']; + // MFR090831 - add picking time : the store is open to (stop_hour - picking time), it is more natural to merchants to set opening hours instead of dejala delivery time + if ($electedProduct['pickingtime']) + $pickingtime = (int)($electedProduct['pickingtime']); + else + $pickingtime = $electedProduct['timelimit']; + $djlUtil = new DejalaUtils(); + $storeCalendar = array(); + $calendar = array(); + $response = $djlUtil->getStoreCalendar($this->dejalaConfig, $storeCalendar); + $this->mylog("productCalendar=" . $this->logValue($productCalendar,1)); + $this->mylog("storeCalendar=" . $this->logValue($storeCalendar,1)); + $this->mylog("response['status']=" . $response['status']); + if ($response['status'] == 200) + { + foreach ($storeCalendar['entries'] as $weekday=>$calEntry) + { + if (isset($productCalendar[$weekday])) + { + $calendar[$weekday]["weekday"] = $weekday; + $calendar[$weekday]["start_hour"] = max((int)($productCalendar[$weekday]["start_hour"]), (int)($calEntry["start_hour"])); + // MFR090831 - manage picking time : the store is open to (stop_hour - picking time) + $calendar[$weekday]["stop_hour"] = min((int)($productCalendar[$weekday]["stop_hour"]-1), (int)($calEntry["stop_hour"] - $pickingtime)); + if ($calendar[$weekday]["stop_hour"] < $calendar[$weekday]["start_hour"]) + unset($calendar[$weekday]); + + } + } + } + + // Calcul de la date de démarrage pour les créneaux : + // Avancement jusque jour dispo & ouvert + // Ajout du temps de préparation : 0.5 jour ou 1 nb de jours + // Ajustement de l'heure sur l'ouverture ou l'heure suivante xxh00 + $deliveryDelay = $store['attributes']['delivery_delay']; + $skipCurDay = false ; + $calUtils = new CalendarUtils(); + $all_exceptions = array_merge($storeCalendar['exceptions'], $electedProduct['calendar']['exceptions']); + $dateUtc = $calUtils->getNextDateAvailable(time(), $calendar, $all_exceptions); + + if ($dateUtc == NULL) + return ; + if ($deliveryDelay > 0) + { + if ($skipCurDay) + $dateUtc = $calUtils->skipCurDay($dateUtc); + + $dateUtc = $calUtils->addDelay($dateUtc, $deliveryDelay, $calendar, $all_exceptions); + } + + if ($dateUtc == NULL) + return ; + $dateUtc = $calUtils->adjustHour($dateUtc, $calendar); + $this->mylog("calendar=" . $this->logValue($calendar,1)); + $this->mylog("starting date=" . $this->logValue(date("d/m/Y - H:i:s", $dateUtc),1)); + + $today = getDate(); + $ctime = time(); + $nbDeliveryDates = $deliveryDelay = $store['attributes']['nb_days_displayed']; + $iDate = 0; + $dates = array(); + $balladUtc = $dateUtc; + + do + { + $wd = date("w", $balladUtc); + if ((int)($calendar[$wd]['stop_hour']) < (int)($calendar[$wd]['start_hour'])) continue ; + + $dates[$iDate]['value'] = date("Y/m/d", $balladUtc); + $dates[$iDate]['ts'] = $balladUtc ; + $dates[$iDate]['label'] = $this->wday_labels[$wd] . " " . date("j", $balladUtc); + $dates[$iDate]['start_hour'] = (int)($calendar[$wd]['start_hour']); + $dates[$iDate]['stop_hour'] = (int)($calendar[$wd]['stop_hour']); + $balladUtc = strtotime(date("Y-m-d", $balladUtc) . " +1 day"); + $balladUtc = mktime(0, 0, 0, date('m', $balladUtc), date('d', $balladUtc), date('Y', $balladUtc)); + $balladUtc = $calUtils->getNextDateAvailable($balladUtc, $calendar, $all_exceptions); + $iDate++; + } while (($iDate < $nbDeliveryDates) && ($balladUtc)); + // impossibilité de trouver un jour dispo + if (!isset($dates[0])) + return ; + + $now = (int)(date("H", $ctime)) ; + if ((int)($dates[0]['stop_hour']) > $now && (int)($dates[0]['start_hour']) < $now) + $dates[0]['start_hour'] = $now ; + elseif ((int)($dates[0]['ts']) == $now && (int)($dates[0]['stop_hour']) < $now) + array_shift($dates) ; + + + $this->mylog("date$=" . $this->logValue($dates,1)); + $smarty->assign('nb_days', $nbDeliveryDates); + $smarty->assign('dates', $dates); + for ($i=0; $i < 24; $i++) + { + $endHour = (($i+$electedProduct['timelimit'])%24); + if ($endHour == 0) + $endHour = 24; + $hourLabels[] = $i . 'h-' . $endHour . 'h'; + } + $smarty->assign('hourLabels', $hourLabels); + + $smarty->assign('timetable_css', _MODULE_DIR_.$this->name.'/timetable.css'); + $smarty->assign("timetable_js", _MODULE_DIR_.$this->name.'/timetable.js'); + + $this->mylog("electedCarrier->id=" . $this->logValue($djlCarrier->id)); + $mCarrier = $djlCarrier; + $row['id_carrier'] = (int)($djlCarrier->id); + $row['name'] = $this->l('Dejala.com'); + $row['delay'] = $this->l('When you want... Dispatch rider') . ', ' . $electedProduct['timelimit'].'H' ; + $row['price'] = $cart->getOrderShippingCost($djlCarrier->id); + $row['price_tax_exc'] = $cart->getOrderShippingCost($djlCarrier->id, false); + $row['img'] = _MODULE_DIR_.$this->name.'/dejala_carrier.gif'; + + $resultsArray[] = $row; + + $smarty->assign('carriers', $resultsArray); + $smarty->assign('my_carrier_selected', (isset($cart->id_carrier) && $cart->id_carrier == $djlCarrier->id)) ; + $smarty->assign('product', $electedProduct); + + + $djlCart = new DejalaCart($cart->id); + $setDefaultDate = TRUE; + if ($djlCart && isset($djlCart->shipping_date) && !empty($djlCart->shipping_date)) + { + $mShippingDate = $djlCart->shipping_date; + $this->mylog("shipping_date=" . $this->logValue($mShippingDate)); + $m_day = date("d", $mShippingDate); + $m_hour = date("H", $mShippingDate); + $deliveryDateSelected = date("Y/m/d", $mShippingDate); + $this->mylog("shipping_date=" . $this->logValue($deliveryDateSelected)); + foreach ($dates as $l_key=>$l_date) + { + if ($l_date['value'] == $deliveryDateSelected) + { + $smarty->assign("deliveryDateIndexSelected", $l_key); + $smarty->assign("deliveryDateSelected", $deliveryDateSelected); + $smarty->assign("deliveryHourSelected", $m_hour); + $setDefaultDate = FALSE; + } + } + } + if ($setDefaultDate) + { + $smarty->assign("deliveryDateIndexSelected", 0); + $smarty->assign("deliveryDateSelected", date("Y/m/d", $dateUtc)); + $smarty->assign("deliveryHourSelected", (int)(date("H", $dateUtc))); + } + + $smarty->assign("isCartOutOfStock", $isCartOutOfStock); + if (!$isCartOutOfStock) + { + $buffer = $this->display(__FILE__, 'dejala_carrier.tpl'); + $buffer = $buffer . $this->display(__FILE__, 'dejala_timetable.tpl'); + } + else + { + $smarty->assign('nostock_info', $this->l('I will select my shipping date when my product is available.')); + $buffer = $this->display(__FILE__, 'dejala_carrier_nostock.tpl'); + } + return $buffer; + + } + + public function displayInfoByCart($id_cart) + { + $this->hooklog("displayInfoByCart", $id_cart); + $this->myLog("POST=" . $this->logValue($_POST)); + + $this->myLog('dejala_action=' . Tools::getValue('dejala_action') ); + if (Tools::getValue('dejala_action')=='order') + { + $this->myLog('inside - id_cart=' . $id_cart); + $mOrderId = (int)Order::getOrderByCartId($id_cart); + $mOrder = new Order($mOrderId); + $this->placeOrder($mOrder); + } + $djlCart = new DejalaCart($id_cart); + if ($djlCart && isset($djlCart->id_dejala_product) && isset($djlCart->shipping_date)) + { + $mDejalaProductID = $djlCart->id_dejala_product; + $mShippingDate = $djlCart->shipping_date; + echo '<h4 style="color:red;">'; + if ($djlCart->mode !== 'PROD') + echo 'MODE : TEST<br/>'; + + if (!empty($mShippingDate) && ($mShippingDate != 0)) + echo $this->l('Shipping date selected') . ' : ' .date('d/m/Y',$mShippingDate). ', ' . $this->l('starting at') . ' : ' .date('H\hi', $mShippingDate) .'<br/>'; + else + echo $this->l('Shipping date not yet selected by the customer') .'<br/>'; + + if ( ($djlCart->id_delivery) && Validate::isUnsignedId($djlCart->id_delivery) ) + { + $l_delivery = array(); + $l_delivery['id'] = $djlCart->id_delivery; + $djlUtil = new DejalaUtils(); + $response = $djlUtil->getDelivery($this->dejalaConfig, $l_delivery, $djlCart->mode); + if ($response['status'] == 200) + { + if ($l_delivery && $l_delivery['status'] && $l_delivery['status']['labels'] && $l_delivery['status']['labels'][Language::getIsoById((int)$this->id_lang)]) + echo $this->l('Order') . ' ' . $l_delivery['status']['labels'][Language::getIsoById((int)$this->id_lang)].'<br/>'; + else + echo $this->l('Order sent to Dejala') . '<br/>'; + } + } + else + { + $_html = ''; + $_html .= '<form action="'.$_SERVER['REQUEST_URI'].'" method="post">'; + $_html .= '<input type="hidden" name="dejala_action" value="order">'; + $_html .= '<input type="submit" value="Commander la course">'; + $_html .= '</form><br />'; + echo $_html . ''; + } + + echo '</h4>'; + + } + } + + static public function wtf($var, $arrayOfObjectsToHide=null, $fontSize=11) + { + $text = print_r($var, true); + + if (is_array($arrayOfObjectsToHide)) + { + foreach ($arrayOfObjectsToHide as $objectName) + { + $searchPattern = '#('.$objectName.' Object\n(\s+)\().*?\n\2\)\n#s'; + $replace = "$1<span style=\"color: #FF9900;\">--&gt; HIDDEN - courtesy of wtf() &lt;--</span>)"; + $text = preg_replace($searchPattern, $replace, $text); + } + } + + // color code objects + $text = preg_replace('#(\w+)(\s+Object\s+\()#s', '<span style="color: #079700;">$1</span>$2', $text); + // color code object properties + $text = preg_replace('#\[(\w+)\:(public|private|protected)\]#', '[<span style="color: #000099;">$1</span>:<span style="color: #009999;">$2</span>]', $text); + + echo '<pre style="font-size: '.$fontSize.'px; line-height: '.$fontSize.'px;text-align:left;">'.$text.'</pre>'; + } + + public function hookProcessCarrier($params) + { + // FO: Temporary. Necessary to go around the product's cart re-instanciation bug. + global $cart ; + + $cartParams = $params['cart']; + $this->hooklog("processCarrier", $params) ; + // Process the cart for storage in dejala_cart. + $errors = array(); + $dejalaCarrierID = (int)Tools::getValue('dejala_id_carrier'); + $carrierID = (int)Tools::getValue('id_carrier'); + $dejalaProductID = (int)Tools::getValue('dejala_id_product'); + + if ( !empty($dejalaCarrierID) && !empty($carrierID) && ((int)($dejalaCarrierID) == (int)($carrierID)) ) + { + $id_cart = (int)($cartParams->id); + + $product = $this->getDejalaProduct($cartParams, $dejalaProductID) ; + + $timelimit = 10; + if (isset($product['timelimit'])) + $timelimit = (int)($product['timelimit']); + + /* manage shipping preferences */ + $date_shipping = 'NULL'; + if (isset($_POST['shipping_day']) AND !empty($_POST['shipping_day']) AND (10 <= strlen($_POST['shipping_day'])) ) + { + $shippingHour = (int)($_POST['shipping_hour']); + $shipping_day = $_POST['shipping_day']; + $ship_year = (int)(substr($shipping_day, 0, 4)); + $ship_month = (int)(substr($shipping_day, 5, 2)); + $ship_day = (int)(substr($shipping_day, 8, 2)); + $shippingTime = mktime($shippingHour, 0, 0, $ship_month, $ship_day, $ship_year); + // check that delivery date is in the future (5 min delay) + if ($shippingTime > time() - 5 * 60) + $date_shipping = $shippingTime; + } + + $djlCart = $this->getDejalaCart($cartParams->id) ; + $djlCart->shipping_date = $date_shipping; + $djlCart->id_dejala_product = $dejalaProductID; + $djlCart->id_delivery = NULL; + $djlCart->mode = $this->dejalaConfig->mode; + + // Dirty cheat as the cart updates itself right after this. + // This saves one full round trip to the server. + $djlCart->cart_date_upd = date('Y-m-d H:i:s') ; + $djlCart->save() ; + } + + // FO: VERY DIRTY HACK.... Re-assign the global cart to what it was before. + $cart = $cartParams ; + } + + /** + * Keep as a precaution if a hook is still registered + */ + public function hookCart($param) { + return ; + } + + + /** + * Appelé après la modification d'une commande + **/ + public function hookUpdateOrderStatus($params) + { + $this->hooklog("hookUpdateOrderStatus", $params); + // class OrderState + $newOrderStatus = $params["newOrderStatus"]; + $currentOrderStatusID = $newOrderStatus->id; + $this->mylog("newOrderStatus=" . $this->logValue($newOrderStatus)); + $this->mylog("found currentOrderStatusID=" . $currentOrderStatusID); + + $triggeringStatusList = html_entity_decode(Configuration::get('DJL_TRIGERRING_STATUSES'), ENT_COMPAT, 'UTF-8'); + $this->mylog("triggeringStatusList=" . $triggeringStatusList); + $triggeringStatuses = explode(",", $triggeringStatusList); + $orderID = $params["id_order"]; + + if ((NULL !== $orderID) && (TRUE === in_array($currentOrderStatusID, $triggeringStatuses))) + { + $mOrder = new Order($orderID); + $this->placeOrder($mOrder); + } + } + + + public function placeOrder($mOrder) { + $orderID = (int)$mOrder->id; + $this->myLog("placeOrder()"); + $this->myLog("mOrder->id_carrier=".$mOrder->id_carrier); + $mCarrier = new Carrier($mOrder->id_carrier); + $this->myLog("mCarrier->name=".$mCarrier->name); + if ($mCarrier->name != $this->name) + return ; + $this->myLog("placeOrder()"); + + $cartId = $mOrder->id_cart; + $djlCart = $this->getDejalaCart($cartId); + $this->myLog("djlCart->id_delivery=" . $djlCart->id_delivery); + + if (!$djlCart->id_delivery) + { + $this->myLog("id_delivery is not filled"); + $delivery = array(); + $this->getInfoFromOrder($orderID, $delivery); + $this->mylog("Sending delivery=" . $this->logValue($delivery)); + $djlUtil = new DejalaUtils(); + $response = $djlUtil->orderDelivery($this->dejalaConfig, $delivery, $djlCart->mode); + $statusCode = $response['status']; + + $this->mylog("send orderID=" . $orderID); + $this->mylog("sendOrder status_code=" . $statusCode); + $this->mylog("sendOrder response=" . $response['response']); + $this->mylog("sendOrder delivery=" . $this->logValue($delivery, 1)); + // update status after sending... + if ("201" === $statusCode) + { + $this->mylog("updating dejala cart cart_id=" . $cartId); + if (Validate::isUnsignedId($delivery['id'])) + { + $this->mylog("updating dejala cart id_delivery=" . $delivery['id']); + $djlCart->id_delivery = $delivery['id']; + $djlCart->update(); + } + + if (is_null($mOrder->shipping_number) || (0 === strlen($mOrder->shipping_number))) + { + $this->myLog('setting Order->shipping_number to ' . $delivery['tracking_number']); + $mOrder->shipping_number = $delivery['tracking_number']; + $mOrder->save(); + } + + $this->myLog("OK - Order sent to dejala.com"); + } + else + { + // Do nothing : Keep previous status + $this->myLog("NOK - Problem sending Order to dejala.com"); + } + } + } + + public function getInfoFromOrder($orderID, &$delivery) + { + $mOrder = new Order((int)$orderID); + if (NULL !== $mOrder) + { + $mDeliveryAddress = new Address($mOrder->id_address_delivery); + if (NULL !== $mDeliveryAddress) + { + // receiver address information + $delivery["receiver_firstname"]=$mDeliveryAddress->firstname; + $delivery["receiver_name"]=$mDeliveryAddress->lastname; + if ($mDeliveryAddress->company) + $delivery["receiver_company"]=$mDeliveryAddress->company; + $delivery["receiver_address"]=$mDeliveryAddress->address1; + if ($mDeliveryAddress->address2) + $delivery["receiver_address2"]=$mDeliveryAddress->address2; + $delivery["receiver_zipcode"]=$mDeliveryAddress->postcode; + $delivery["receiver_city"]=$mDeliveryAddress->city; + if ($mDeliveryAddress->phone_mobile) + $delivery["receiver_cellphone"]=$mDeliveryAddress->phone_mobile; + if ($mDeliveryAddress->phone) + $delivery["receiver_phone"]=$mDeliveryAddress->phone; + if ($mDeliveryAddress->other) + $delivery["receiver_comments"]=$mDeliveryAddress->other; + } + $delivery["packet_reference"]=$mOrder->id; + + + $id_cart = (int)$mOrder->id_cart; + /* set weight */ + $cart = new Cart($id_cart); + $delivery['weight'] = (float)($cart->getTotalWeight()); + + /* set dejalaProductID and sender_availability = shipping date */ + $djlCart = new DejalaCart($id_cart); + if (!is_null($djlCart) && !is_null($djlCart->id)) + { + $mDejalaProductID = (int)$djlCart->id_dejala_product; + $delivery["product_id"] = (int)($mDejalaProductID); + $mShippingDate = $djlCart->shipping_date; + if ( is_null($mShippingDate) || empty($mShippingDate) ) + $mShippingDate = 0; + + $delivery["shipping_start_utc"]=$mShippingDate; + } + } + return ($delivery); + } + + + public function getOrderShippingCostExternal($cart) + { + return $this->getOrderShippingCost($cart, 0); + } + + public function getOrderShippingCost($cart, $shipping_cost) + { + return $this->getDejalaProductPrice($cart) ; + } + + + private function getDejalaCart($cartId) { + return DejalaCart::getInstance($cartId) ; + } + + private function getDejalaProductPrice($cart) + { + $djlCart = $this->getDejalaCart($cart->id) ; + if (isset($djlCart->delivery_price) && $cart->date_upd <= $djlCart->cart_date_upd) + return $djlCart->delivery_price ; + + $product = $this->getDejalaProduct($cart) ; + return $product["price"] ; + } + + private function getDejalaProduct($cart, $productId = -1) + { + // echo "Date : " . $cart->date_upd . "<br>" ; + $djlCart = $this->getDejalaCart($cart->id) ; + + if (isset($djlCart->delivery_price) && $cart->date_upd <= $djlCart->cart_date_upd && isset($djlCart->product)) + if ($productId >= 0 && $djlCart->product["id"] == $productId) + return $djlCart->product ; + + + $djlUtil = new DejalaUtils(); + $responseGetStore = $djlUtil->getStoreAttributes($this->dejalaConfig, $store); + if ($responseGetStore['status']!='200') return ; + + $isCartOutOfStock = '0'; + if ($this->isCartOutOfStock($cart)) + $isCartOutOfStock = '1'; + $this->mylog('isCartOutOfStock=' . $isCartOutOfStock . ''); + + $acceptPartial = true; + if (!isset($store['attributes']) || !isset($store['attributes']['delivery_partial']) || ($store['attributes']['delivery_partial'] != '1')) + $acceptPartial = false; + if ( ($isCartOutOfStock == '1') && !$acceptPartial) + return ; + + $address = new Address($cart->id_address_delivery) ; + + // ask dejala.com for a quotation + $quotation["receiver_name"] = $address->lastname; + $quotation["receiver_firstname"] = $address->firstname; + $quotation["receiver_company"] = $address->company; + $quotation["receiver_address"] = $address->address1; + $quotation["receiver_address2"] = $address->address2; + $quotation["receiver_zipcode"] = $address->postcode; + $quotation["receiver_city"] = $address->city; + $quotation["receiver_phone"] = $address->phone; + $quotation["receiver_phone_mobile"] = $address->phone_mobile; + $quotation["receiver_comments"] = $address->other; + $quotation["timelimit"] = 10; + $quotation["weight"] = (float)($cart->getTotalWeight()); + $quotation["price"] = $cart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING) ; + $quotation["module_version"] = $this->internal_version ; + $quotation["platform"] = "PS " . _PS_VERSION_ ; + + $this->mylog("asking for quotation=" . $this->logValue($quotation,1)); + + $products = array(); + $responseArray = $djlUtil->getStoreQuotation($this->dejalaConfig, $quotation, $products); + if ($responseArray['status']!='200') + return $shipping_cost; + $this->mylog("found quotation=" . $this->logValue($responseArray['response'],1)); + + $electedProduct = NULL; + foreach ($products as $key=>$product) + if ( is_null($electedProduct) || ((int)($electedProduct['priority']) > (int)($key)) ) + $electedProduct = $product; + + if (is_null($electedProduct)) + return $shipping_cost; + + $djlCart->id_dejala_product = (int)$electedProduct["id"]; + $djlCart->id_delivery = NULL; + $djlCart->mode = $this->dejalaConfig->mode; + + $vat_factor = (1+ ($electedProduct['vat'] / 100)); + $priceTTC = round(($electedProduct['price']*$vat_factor) + $electedProduct['margin'], 2); + $priceHT = round($priceTTC/$vat_factor, 2); + + $djlCart->delivery_price = $priceHT ; + $djlCart->cart_date_upd = $cart->date_upd ; + $djlCart->product = $electedProduct ; + + $djlCart->save() ; + + return $electedProduct ; + + } + + public function mylog($msg) { + if ($this->DEJALA_DEBUG) { + require_once(dirname(__FILE__) . "/MyLogUtils.php"); + $myFile = dirname(__FILE__) . "/logFile.txt"; + MyLogUtils::myLog($myFile, $msg); + } + } + + // get a string of a value for Log purposes + public function logValue($mvalue, $lvl=0) { + if (!$this->DEJALA_DEBUG) + return (""); + require_once(dirname(__FILE__) . "/MyLogUtils.php"); + return (MyLogUtils::logValue($mvalue, $lvl)); + } + + + public function hooklog($hookname, $params) { + $this->mylog($hookname); + $this->mylog("\r\nparams" . $this->logValue($params), 1); + } + + // Stolen from PS 1.3 for backwards compatibility in PS 1.2.5 + static public function getHttpHost($http = false, $entities = false) + { + $host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']); + if ($entities) + $host = htmlspecialchars($host, ENT_COMPAT, 'UTF-8'); + if ($http) + $host = (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$host; + return $host; + } +} + diff --git a/modules/dejala/dejala_carrier.gif b/modules/dejala/dejala_carrier.gif new file mode 100644 index 0000000000000000000000000000000000000000..bde9893f6293a40747cf6ba304150294215eb6c9 GIT binary patch literal 2004 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 literal 0 HcmV?d00001 diff --git a/modules/dejala/dejala_carrier.tpl b/modules/dejala/dejala_carrier.tpl new file mode 100644 index 000000000..cf9eca624 --- /dev/null +++ b/modules/dejala/dejala_carrier.tpl @@ -0,0 +1,65 @@ + <script> + var djl_calendar = new Array({foreach from=$dates item=dateItem name=datesLoop}{if !$smarty.foreach.datesLoop.first}, {/if}new Array("{$dateItem.label}", "{$dateItem.value}", {$dateItem.start_hour}, {$dateItem.stop_hour}){/foreach} ); + var deliveryDateSelected = {$deliveryDateIndexSelected}; + var deliveryHourSelected = {$deliveryHourSelected|intval}; + </script> + + <script type="text/javascript" src="{$timetable_js}"></script> + <link href="{$timetable_css}" rel="stylesheet" type="text/css" media="all" /> + {literal} + <script> + $(document).ready(function() { + $('input[name="id_carrier"]').each(function(idx, elt) { + if ($(this).parent().hasClass("dejala")) { + if ($(this).get(0).checked) { + toggle_visibility('shipping_pref','1'); + } + $(this).click(function() { + toggle_visibility('shipping_pref', 1); + }); + } + else { + $(this).click(function() { + toggle_visibility('shipping_pref', 0); + }); + } + }) ; + + var mHour = deliveryHourSelected; + selectDay(deliveryDateSelected); + selectHour(mHour); + }); + </script> + {/literal} + + {* + switchDay(deliveryDateSelected); + switchHours(deliveryHourSelected); + toggleShipping(); + *} + + {foreach from=$carriers item=carrier name=myLoop} + <tr class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{/if} {if $smarty.foreach.myLoop.index % 2}alternate_item{else}item{/if}"> + <td class="carrier_action radio dejala"> + <input type="hidden" name="dejala_id_carrier" value="{$carrier.id_carrier|intval}"/> + <input type="hidden" name="dejala_id_product" value="{$product.id|intval}"/> + <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $my_carrier_selected}checked="checked"{/if}"/> + </td> + <td class="carrier_name"> + <label for="id_carrier{$carrier.id_carrier|intval}"> + {if $carrier.img}<img src="{$carrier.img|escape:'htmlall':'UTF-8'}" alt="{$carrier.name|escape:'htmlall':'UTF-8'}" />{else}{$carrier.name|escape:'htmlall':'UTF-8'}{/if} + </label> + </td> + <td class="carrier_infos">{$carrier.delay|escape:'htmlall':'UTF-8'}</td> + <td class="carrier_price"> + {if $carrier.price} + <span class="price"> + {if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if} + </span> + {if $priceDisplay == 1} {l s='(tax excl.)' mod='dejala'}{else} {l s='(tax incl.)' mod='dejala'}{/if} + {else} + {l s='Free!' mod='dejala'} + {/if} + </td> + </tr> + {/foreach} \ No newline at end of file diff --git a/modules/dejala/dejala_carrier_nostock.tpl b/modules/dejala/dejala_carrier_nostock.tpl new file mode 100644 index 000000000..831bc51d0 --- /dev/null +++ b/modules/dejala/dejala_carrier_nostock.tpl @@ -0,0 +1,23 @@ + {foreach from=$carriers item=carrier name=myLoop} + <tr class="{if $smarty.foreach.myLoop.first}first_item{elseif $smarty.foreach.myLoop.last}last_item{/if} {if $smarty.foreach.myLoop.index % 2}alternate_item{else}item{/if}"> + <td class="carrier_action radio dejala"> + <input type="hidden" name="dejala_id_carrier" value="{$carrier.id_carrier|intval}"/> + <input type="hidden" name="dejala_id_product" value="{$product.id|intval}"/> + <input type="radio" name="id_carrier" value="{$carrier.id_carrier|intval}" id="id_carrier{$carrier.id_carrier|intval}" {if $carrier.id_carrier == $checked}checked="checked"{/if} /> + </td> + <td class="carrier_name"> + <label for="id_carrier{$carrier.id_carrier|intval}"> + {if $carrier.img}<img src="{$carrier.img|escape:'htmlall':'UTF-8'}" alt="{$carrier.name|escape:'htmlall':'UTF-8'}" />{else}{$carrier.name|escape:'htmlall':'UTF-8'}{/if} + </label> + </td> + <td class="carrier_infos">{$nostock_info}</td> + <td class="carrier_price">{if $carrier.price} + <span class="price"> + {if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if} + </span> + {if $priceDisplay == 1} {l s='(tax excl.)' mod='dejala'}{else} {l s='(tax incl.)' mod='dejala'}{/if} + {else}{l s='Free!'} + {/if} + </td> + </tr> + {/foreach} \ No newline at end of file diff --git a/modules/dejala/dejala_contacts.tpl b/modules/dejala/dejala_contacts.tpl new file mode 100644 index 000000000..4aafefb58 --- /dev/null +++ b/modules/dejala/dejala_contacts.tpl @@ -0,0 +1,46 @@ +<form action="{$formAction}" method="post"> + <div style="float:left"> + <input type="hidden" name="method" value="contact"> + <fieldset style="width:250px;"> + <legend><img src="../img/t/AdminCustomers.gif" />{l s='Shop owner' mod='dejala'}</legend> + <p>{l s='Name:' mod='dejala'} <input type="text" name="contact_owner_name" id="contact_owner_name" value="{$contact_owner_name|default:''}"></p> + <p>{l s='Firstname:' mod='dejala'} <input type="text" name="contact_owner_firstname" id="contact_owner_firstname" value="{$contact_owner_firstname|default:''}"></p> + <p>{l s='Phone:' mod='dejala'} <input type="text" name="contact_owner_phone" id="contact_owner_phone" value="{$contact_owner_phone|default:''}"></p> + <p>{l s='Cellphone:' mod='dejala'} <input type="text" name="contact_owner_cellphone" id="contact_owner_cellphone" value="{$contact_owner_cellphone|default:''}"></p> + <p>{l s='E-Mail:' mod='dejala'} <input type="text" name="contact_owner_email" id="contact_owner_email" value="{$contact_owner_email|default:''}"></p> + </fieldset> + + <fieldset class="clear space" style="width:250px;"> + <legend><img src="../img/t/AdminCustomers.gif" />{l s='Stock Control Contact' mod='dejala'}</legend> + <p>{l s='Name:' mod='dejala'} <input type="text" name="contact_stock_name" id="contact_stock_name" value="{$contact_stock_name|default:''}"></p> + <p>{l s='Firstname:' mod='dejala'} <input type="text" name="contact_stock_firstname" id="contact_stock_firstname" value="{$contact_stock_firstname|default:''}"></p> + <p>{l s='Phone:' mod='dejala'} <input type="text" name="contact_stock_phone" id="contact_stock_phone" value="{$contact_stock_phone|default:''}"></p> + <p>{l s='Cellphone:' mod='dejala'} <input type="text" name="contact_stock_cellphone" id="contact_stock_cellphone" value="{$contact_stock_cellphone|default:''}"></p> + <p>{l s='E-Mail:' mod='dejala'} <input type="text" name="contact_stock_email" id="contact_stock_email" value="{$contact_stock_email|default:''}"></p> + </fieldset> +</div> +<div style="float:left; margin-left:5px;"> + <fieldset style="width:250px;"> + <legend><img src="../img/t/AdminCustomers.gif" />{l s='Administration Contact' mod='dejala'}</legend> + <p>{l s='Name:' mod='dejala'} <input type="text" name="contact_administrative_name" id="contact_administrative_name" value="{$contact_administrative_name|default:''}"></p> + <p>{l s='Firstname:' mod='dejala'} <input type="text" name="contact_administrative_firstname" id="contact_administrative_firstname" value="{$contact_administrative_firstname|default:''}"></p> + <p>{l s='Phone:' mod='dejala'} <input type="text" name="contact_administrative_phone" id="contact_administrative_phone" value="{$contact_administrative_phone|default:''}"></p> + <p>{l s='Cellphone:' mod='dejala'} <input type="text" name="contact_administrative_cellphone" id="contact_administrative_cellphone" value="{$contact_administrative_cellphone|default:''}"></p> + <p>{l s='E-Mail:' mod='dejala'} <input type="text" name="contact_administrative_email" id="contact_administrative_email" value="{$contact_administrative_email|default:''}"></p> + </fieldset> + + <fieldset class="clear space" style="width:250px"> + <legend><img src="../img/t/AdminCustomers.gif" />{l s='Website Maintenance Contact' mod='dejala'}</legend> + <p>{l s='Name:' mod='dejala'} <input type="text" name="contact_web_name" id="contact_web_name" value="{$contact_web_name|default:''}"></p> + <p>{l s='Firstname:' mod='dejala'} <input type="text" name="contact_web_firstname" id="contact_web_firstname" value="{$contact_web_firstname|default:''}"></p> + <p>{l s='Phone:' mod='dejala'} <input type="text" name="contact_web_phone" id="contact_web_phone" value="{$contact_web_phone|default:''}"></p> + <p>{l s='Cellphone:' mod='dejala'} <input type="text" name="contact_web_cellphone" id="contact_web_cellphone" value="{$contact_web_cellphone|default:''}"></p> + <p>{l s='E-Mail:' mod='dejala'} <input type="text" name="contact_web_email" id="contact_web_email" value="{$contact_web_email|default:''}"></p> + </fieldset> +</div> +<div class="clear"></div> +<br/> +<input type="submit" value="{l s='Save' mod='dejala'}" class="button" /> + +</form> + diff --git a/modules/dejala/dejala_deliveries.tpl b/modules/dejala/dejala_deliveries.tpl new file mode 100644 index 000000000..288ac7977 --- /dev/null +++ b/modules/dejala/dejala_deliveries.tpl @@ -0,0 +1,74 @@ + <fieldset> + {if ($djl_mode == 'PROD')}{l s='Your credit' mod='dejala'}{else if ($djl_mode == 'TEST')}{l s='Your virtual credit (in order to test)' mod='dejala'}{/if} : {$account_balance} {l s='euros' mod='dejala'}<br/> + {if ($djl_mode == 'PROD')}<a href="http://pro.dejala.{$country}" target="_blank" style="color:blue;font-weight:bold;text-decoration:underline;">{l s='Credit your account' mod='dejala'}</a><br/>{/if} + + <h4 class="clear">{l s='List of last deliveries' mod='dejala'}:</h4> + + <table class="table" width="100%" > + + <tr class='bold'> + <th>{l s='#' mod='dejala'}</th> + <th>{l s='Creation' mod='dejala'}</th> + <th>{l s='Order ID' mod='dejala'}</th> + <th>{l s='Tracking_number' mod='dejala'}</th> + <th>{l s='Label' mod='dejala'}</th> + <th>{l s='Price' mod='dejala'}</th> + <th>{l s='Status' mod='dejala'}</th> + <th>{l s='Shipping' mod='dejala'}</th> + <th>{l s='Description' mod='dejala'}</th> + </tr> + + {foreach from=$deliveries item=delivery name=deliveryLoop} + <tr {if ($smarty.foreach.deliveryLoop.index % 2 == 0)}class='alt_row'{/if}> + {if $delivery.status.picto_id} + <td><img src="{if $delivery.status.picto_id < 10}{$module_dir}{else}http://module.pro.dejala.{$country}/picto/{/if}picto_{$delivery.status.picto_id}.gif" /></td> + {else} + <td><img src="{$module_dir}picto_0.gif"/></td> + {/if} + <td>{$delivery.creation_date}</td> + <td>{$delivery.packet_reference}</td> + <td>{if $delivery.tracking_number}<a href="http://tracking.dejala.{$country}/tracker/{$delivery.tracking_number}" target="_blank">{$delivery.tracking_number}</a>{/if}</td> + <td>{$delivery.short_label}</td> + <td>{$delivery.price}</td> + <td>{$delivery.status.labels.fr}</td> + <td>{$delivery.shipping_date}</td> + <td>{l s='In ' mod='dejala'}{$delivery.timelimit}{l s='h' mod='dejala'} - {l s='from' mod='dejala'} {$delivery.shipping_start} {l s='to' mod='dejala'} {$delivery.shipping_stop}</td> + </tr> + {/foreach} + </table> + <br/> + </fieldset> + <br/> + <fieldset> + <legend class="clear">{l s='Csv Export' mod='dejala'}:</legend> + + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="accounting"/> + <div id="calendar"> + <script type="text/javascript" src="{$module_dir}../../js/jquery/jquery-ui-1.8.10.custom.min.js"></script> + <script type="text/javascript" src="{$module_dir}../../js/jquery/datepicker/ui/i18n/ui.datepicker-fr.js"></script> + {literal} + <script type="text/javascript"> + $(function() { + $("#datepickerFrom").datepicker({ + prevText:"", + nextText:"", + dateFormat:"dd/mm/yy"}); + }); + $(function() { + $("#datepickerTo").datepicker({ + prevText:"", + nextText:"", + dateFormat:"dd/mm/yy"}); + }); + </script> + {/literal} + +{l s='From' mod='dejala'}: <input type="text" name="datepickerFrom" id="datepickerFrom" value="{$defaultDateFrom}"> +{l s='To' mod='dejala'}: <input type="text" name="datepickerTo" id="datepickerTo" value="{$defaultDateTo}"> + + <input type="submit" name="submitDatePicker" value="{l s='Ok' mod='dejala'}" class="button" /> + </div> + </form> + </fieldset> + \ No newline at end of file diff --git a/modules/dejala/dejala_deliveries_csv.tpl b/modules/dejala/dejala_deliveries_csv.tpl new file mode 100644 index 000000000..68b139130 --- /dev/null +++ b/modules/dejala/dejala_deliveries_csv.tpl @@ -0,0 +1,4 @@ +{l s='creation_date' mod='dejala'};{l s='Order ID' mod='dejala'};{l s='Tracking_number' mod='dejala'};{l s='short_label' mod='dejala'};{l s='price' mod='dejala'};{l s='status' mod='dejala'};{l s='shipping_date' mod='dejala'};{l s='timelimit' mod='dejala'};{l s='shipping_start' mod='dejala'};{l s='shipping_stop' mod='dejala'};{l s='delivery_date' mod='dejala'};{l s='delivery_time' mod='dejala'} +{foreach from=$deliveries item=delivery name=deliveryLoop} +"{$delivery.creation_date}";"{$delivery.packet_reference}";"{$delivery.tracking_number}";"{$delivery.short_label}";"{$delivery.price}";"{$delivery.status.labels.fr}";"{$delivery.shipping_date}";"{$delivery.timelimit}";"{$delivery.shipping_start}";"{$delivery.shipping_stop}";"{$delivery.delivery_date}";"{$delivery.delivery_time}" +{/foreach} \ No newline at end of file diff --git a/modules/dejala/dejala_delivery_options.tpl b/modules/dejala/dejala_delivery_options.tpl new file mode 100644 index 000000000..f02de3c65 --- /dev/null +++ b/modules/dejala/dejala_delivery_options.tpl @@ -0,0 +1,43 @@ + <fieldset> + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="delivery_options"/> + + <h3>{l s='Shipping preferences' mod='dejala'}</h3> + + {include file="$timetableTpl"} + + <h3>{l s='Propose shipping ' mod='dejala'}:</h3> + <div class="margin-form"> + <select name="delivery_delay"> + <option value="0" {if $delivery_delay == "0"}selected="selected"{/if}>{l s='immediately' mod='dejala'}</option> + <option value="0.5" {if $delivery_delay == "0.5"}selected="selected"{/if}>{l s='half a day' mod='dejala'}</option> + <option value="1" {if $delivery_delay == "1"}selected="selected"{/if}>{l s='a day' mod='dejala'}</option> + <option value="2" {if $delivery_delay == "2"}selected="selected"{/if}>2 {l s='days' mod='dejala'}</option> + <option value="3" {if $delivery_delay == "3"}selected="selected"{/if}>3 {l s='days' mod='dejala'}</option> + <option value="4" {if $delivery_delay == "4"}selected="selected"{/if}>4 {l s='days' mod='dejala'}</option> + <option value="5" {if $delivery_delay == "5"}selected="selected"{/if}>5 {l s='days' mod='dejala'}</option> + + </select> + {l s=' after ordering' mod='dejala'} + </div> + + <h3>{l s='Display ' mod='dejala'}:</h3> + <div class="margin-form"> + <select name="nb_days"> + {section name=day start=1 loop=15 step=1} + <option value="{$smarty.section.day.index}" {if $nb_days == $smarty.section.day.index}selected="selected"{/if}>{$smarty.section.day.index} {l s='dates' mod='dejala'}</option> + {/section} + </select> + {l s=' days in the timerange selection interface' mod='dejala'} + </div> + + <label class="clear">{l s='Keep Dejala active when cart is out of stock' mod='dejala'}:</label> + <div class="margin-form"> + <input type="checkbox" name="delivery_partial" value="1" {if ($delivery_partial)}checked="checked"{/if}> + {l s='Enable customers to choose Dejala even if a product is out of stock (The customer will choose the date of the delivery when their order will be ready)' mod='dejala'} + </div> + + <br/> + <input type="submit" value="{l s='Save' mod='dejala'}" class="button" /> + </form> + </fieldset> diff --git a/modules/dejala/dejala_footer.tpl b/modules/dejala/dejala_footer.tpl new file mode 100644 index 000000000..07b9b4fe3 --- /dev/null +++ b/modules/dejala/dejala_footer.tpl @@ -0,0 +1,26 @@ +{if (isset($registered) AND $registered != 0)} + {if ($currentTab != 'home')} + {assign var='page_include' value=$currentTab} + {else} + {if ($djl_mode=='TEST')} + {if ($isLiveRequested=='1')} + {assign var='page_include' value='home_ready'} + {else} + {assign var='page_include' value='home_testing'} + {/if} + {else} + {assign var='page_include' value='home_active'} + {/if} + + {/if} +{else} + {assign var='page_include' value='home_new'} +{/if} + + + <div id="adminNews"> + <iframe frameborder="no" style="margin:15px; padding: 0px; width: 900px; height: 500px;" src="http://module.pro.dejala.{$country}/tabs/{$page_include}.php"></iframe> + </div> + +</div> + diff --git a/modules/dejala/dejala_header.tpl b/modules/dejala/dejala_header.tpl new file mode 100644 index 000000000..5af8910f0 --- /dev/null +++ b/modules/dejala/dejala_header.tpl @@ -0,0 +1,9 @@ +<div id="dejala_prez"> + <div style="float:left; width:100%; align:center; margin-left:25%;"> + <div style="float:left;margin-bottom:10px;"><img src="{$module_dir}dejala_logo.gif"/></div> + <div style="float:left;margin-left:10px; width:75%; "> + <h2 style="margin:0;padding:0;color:rgb(50,75,150);">{l s='Ship your orders by courier with ' mod='dejala'}{l s='DEJALA ' mod='dejala'}</h2> + </div> + </div> +</div> +<br class="clear"/> diff --git a/modules/dejala/dejala_home.tpl b/modules/dejala/dejala_home.tpl new file mode 100644 index 000000000..4ce425d83 --- /dev/null +++ b/modules/dejala/dejala_home.tpl @@ -0,0 +1,166 @@ +{literal} +<script type="text/javascript"> +//<![CDATA[ +function toggleVisibleUserListState(state) { + var elt = document.getElementById('visible_users_list'); + + if (state == 0) { + elt.style.setProperty('background-color', '#ECE9D8', '') ; + elt.style.setProperty('color', '#ACA899', '') ; + elt.setAttribute('disabled', 'disabled') ; + } + else { + elt.style.removeProperty('background-color') ; + elt.style.removeProperty('color') ; + elt.removeAttribute('disabled'); + } +} + +function updateDJLVisibilityChoices() { + for (var i=0 ; i < document.visibility_form.visibility_status.length ; i++) { + var elt = document.visibility_form.visibility_status[i] ; + if (elt.checked) { + elt.parentNode.style.setProperty('color', '#993300', '') ; + elt.parentNode.style.setProperty('font-weight', 'bold', '') ; + } + else { + elt.parentNode.style.removeProperty('color') ; + elt.parentNode.style.removeProperty('font-weight') ; + } + if (elt.value == "visible_limited") { + toggleVisibleUserListState(elt.checked) ; + } + } +} + +addLoadEvent(function() { + for (var i=0 ; i < document.visibility_form.visibility_status.length ; i++) { + document.visibility_form.visibility_status[i].onclick = function() { updateDJLVisibilityChoices() ;} ; + } + updateDJLVisibilityChoices() ; +}) ; + +//]]> +</script> +{/literal} + + {if (isset($registered) AND $registered == 0)} + + <div style="width:100%;margin:0px 10px 0px 10px"> + <div class="clear"></div> + <div style="float:left;width:48%;"> + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="register"> + <fieldset > + <legend>{l s='New to Dejala.fr ?' mod='dejala'}</legend> + <div> + {l s='Your shop name:' mod='dejala'} <input size="30" type="text" name="store_name" value="{$store_name}"/> + </div> + <div> + {l s='Select your country:' mod='dejala'} + <select name="country"> + <option value="fr">{l s='France' mod='dejala'}</option> + <option value="es">{l s='Spain' mod='dejala'}</option> + </select> + </div> + <div> + {l s='Choose your login:' mod='dejala'} <input size="30" type="text" name="login" value="{$login}"/> + </div> + <div> + {l s='Choose your password:' mod='dejala'} <input size="15" type="password" name="password" value=""/> + </div> + <br/> + <input type="submit" name="btnSubmit" value="{l s='Register' mod='dejala'}" class="button" {$disabled} /> + </fieldset> + </form> + </div> + + <div style="float:left; margin-left:5px;width:47%;"> + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="signin" /> + <fieldset> + <legend>{l s='I already have an account for my shop:' mod='dejala'}</legend> + <div>{l s='Login:' mod='dejala'} <input size="30" type="text" name="login" value="{$login}"/></div> + <div> + {l s='Select your country:' mod='dejala'} + <select name="country"> + <option value="fr">{l s='France' mod='dejala'}</option> + <option value="es">{l s='Spain' mod='dejala'}</option> + </select> + </div> + <div>{l s='Password:' mod='dejala'} <input size="15" type="password" name="password" value=""/></div> + <br/> + <input type="submit" name="btnSubmit" value="{l s='Sign-in' mod='dejala'}" class="button" {$disabled} /> + </fieldset> + </form> + </div> + </div> + <div class="clear"></div> + + {else} + <fieldset> + <div id="dejalaAutopub" style="float:right;margin:0px;margin-top:10px;"> + <iframe frameborder="no" scrolling="no" style="margin:0px; margin-top:-10px; padding: 0px; width: 310px; height: 270px;" src="http://module.pro.dejala.{$country}/tabs/home_pub.php"></iframe> + </div> + <div style="width:65%;"> + <legend>{l s='Dejala.fr' mod='dejala'}</legend> + {l s='As a reminder' mod='dejala'} :<br/> + {l s='Your store name is' mod='dejala'} : {$store_name}<br/> + {l s='Your login is' mod='dejala'} : {if isset($store_login)}{$store_login}{/if}<br/><br/> + {l s='Your are running on the' mod='dejala'} : {if ($djl_mode=='TEST')}{l s='test platform' mod='dejala'}{else}{l s='production platform' mod='dejala'}{/if}<br/> + + {* Switch mode button : switch between test/prod modes *} + {if ($djl_mode=='PROD')} + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="switchMode"> + <input type="hidden" name="mode" value="TEST"> + <input type="submit" name="btnSubmit" value="{l s='Switch to test mode' mod='dejala'}" class="button" /> + </form> + {else} + {if (isset($isLiveReady) AND $isLiveReady=='1')} + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="switchMode"> + <input type="hidden" name="mode" value="PROD"> + <input type="submit" name="btnSubmit" value="{l s='Switch to production mode' mod='dejala'}" class="button" /> + </form> + {else} + {if (isset($isLiveReady) AND $isLiveRequested=='1')} + {l s='Your request to go live is under process : Dejala.fr will contact you to finalize your registration.' mod='dejala'} + {else} + {* Demande de passage en prod *} + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="golive"> + <input type="submit" name="btnSubmit" value="{l s='Go live : request Dejala.fr to create my account in production.' mod='dejala'}" class="button" /> + </form> + {/if} + {/if} + {/if} + + <br/><br/> + {if ($djl_mode == 'PROD')}{l s='Your credit' mod='dejala'} :{else if ($djl_mode == 'TEST')}{l s='Your virtual credit (in order to test)' mod='dejala'} :{/if} {$account_balance} {l s='euros' mod='dejala'}<br/> + {if ($djl_mode == 'PROD')}<a href="http://pro.dejala.{$country}" target="_blank" style="color:blue;font-weight:bold;text-decoration:underline;">{l s='Credit your account' mod='dejala'}</a><br/>{/if} + + <br/><br/> + <form action="{$formAction}" method="post" name="visibility_form"> + <div> + <input type="radio" name="visibility_status" value="invisible" {if ($visibility_status == "invisible")}{"checked=\"checked\""}{/if} /> {l s='Dejala IS NOT visible for any users' mod='dejala'} + </div> + <div> + <input type="radio" name="visibility_status" value="visible" {if ($visibility_status == "visible")}{"checked=\"checked\""}{/if} /> {l s='Dejala IS visible for all users' mod='dejala'} + </div> + <div> + <input type="radio" name="visibility_status" value="visible_limited" {if ($visibility_status == "visible_limited")}{"checked=\"checked\""}{/if} /> {l s='Dejala IS visible ONLY for the following users' mod='dejala'} : + </div> + <div> + <input size="40" type="text" id="visible_users_list" name="visible_users_list" value="{if isset($visible_users_list)}{$visible_users_list}{/if}"/> {l s='(e.g. : a@foo.com, b@bar.com)' mod='dejala'} + </div> + <input type="hidden" name="method" value="switchActive"> + <br /> + <input type="submit" name="btnSubmit" value="{l s='Update Dejala visibility' mod='dejala'}" class="button" /> + </form> + </div> + + + </fieldset> + {/if} + diff --git a/modules/dejala/dejala_location.tpl b/modules/dejala/dejala_location.tpl new file mode 100644 index 000000000..122517fac --- /dev/null +++ b/modules/dejala/dejala_location.tpl @@ -0,0 +1,26 @@ + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="location"/> + <fieldset> + <h4 class="clear">{l s='Please specify the address of your stock' mod='dejala'} {if ($djl_mode=='PROD')}{l s='(readonly)' mod='dejala'}{/if}: + {if (isset($address) && isset($zipcode) && isset($city))}<a href="http://maps.google.com/maps?f=q&hl=fr&geocode=&q={$address},%20{$zipcode}%20{$city}" target="_blank"><img src='{$module_dir}google.gif'/>{l s='Locate' mod='dejala'}</a>{/if} + </h4> + <label class="clear">{l s='Company' mod='dejala'}:</label> + <div class="margin-form"><input size="25" type="text" name="company" value="{$company|default:''}" {$disabled}/></div> + <label class="clear">{l s='Address' mod='dejala'}:</label> + <div class="margin-form"><input type="text" name="address" value="{$address|default:''}" style="width: 300px;" {$disabled}/></div> + <label class="clear">{l s='Address (2)' mod='dejala'}:</label> + <div class="margin-form"><input type="text" name="address2" value="{$address2|default:''}" style="width: 300px;" {$disabled}/></div> + <label class="clear">{l s='Postal code / Zip code' mod='dejala'}:</label> + <div class="margin-form"><input size="5" type="text" name="zipcode" value="{$zipcode|default:''}" {$disabled}/></div> + <label class="clear">{l s='City' mod='dejala'}:</label> + <div class="margin-form"><input size="22" type="text" name="city" value="{$city|default:''}" {$disabled}/></div> + <label class="clear">{l s='Phone' mod='dejala'}:</label> + <div class="margin-form"><input size="14" type="text" name="phone" value="{$phone|default:''}" {$disabled}/></div> + <label class="clear">{l s='Cellphone' mod='dejala'}:</label> + <div class="margin-form"><input size="14" type="text" name="cellphone" value="{$cellphone|default:''}" {$disabled}/></div> + <label class="clear">{l s='Comments' mod='dejala'}:</label> + <div class="margin-form"><textarea rows="4" cols="45" name="comments" {$disabled}>{$comments|default:''}</textarea></div> + <div class="margin-form"><input type="submit" name="btnSubmit" value="{l s='Update settings' mod='dejala'}" class="button" {$disabled}/></div> + </fieldset> + </form> + \ No newline at end of file diff --git a/modules/dejala/dejala_logo.gif b/modules/dejala/dejala_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8444607ab94c54d4598257826bd8ffa92f6f1388 GIT binary patch literal 2932 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 Y>*sqsGQOh*rKr1Vc4dy+*+Dk_ADh-v5C8xG literal 0 HcmV?d00001 diff --git a/modules/dejala/dejala_menu.tpl b/modules/dejala/dejala_menu.tpl new file mode 100644 index 000000000..70cbe3d85 --- /dev/null +++ b/modules/dejala/dejala_menu.tpl @@ -0,0 +1,37 @@ +{if (isset($registered) AND $registered != 0)} +<div> + <ul id="menu"> + <li {if ($currentTab == 'home')}class="active"{/if}> + <a href="{$moduleConfigURL}">{l s='Home' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'location')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=location">{l s='Location' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'contacts')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=contacts">{l s='Contacts' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'processes')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=processes">{l s='Processes' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'delivery_options')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=delivery_options">{l s='Delivery Options' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'prices')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=prices">{l s='Prices' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'accounting')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=accounting">{l s='Accounting' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'technical_options')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=technical_options">{l s='Technical options' mod='dejala'}</a> + </li> + <li {if ($currentTab == 'dejala')}class="active"{/if}> + <a href="{$moduleConfigURL}&cat=dejala">{l s='DEJALA PRO' mod='dejala'}</a> + </li> + </ul> +</div> +<br class='clear'/> +{/if} +<div style="margin-top:-2px; border: 1px solid #999;"> +<br/> + diff --git a/modules/dejala/dejala_picking_timetable.tpl b/modules/dejala/dejala_picking_timetable.tpl new file mode 100644 index 000000000..d382a3b0d --- /dev/null +++ b/modules/dejala/dejala_picking_timetable.tpl @@ -0,0 +1,31 @@ +<h3>{l s='Stock is open' mod='dejala'}</h3> +{foreach from=$weekdayLabels item=weekday name=weekdayLoop} + {assign var='curWeekdayIdx' value=$smarty.foreach.weekdayLoop.index} + <div class="margin-form"> + <input type="checkbox" name="weekday_{$curWeekdayIdx}" value="1" {if (isset($calendar.entries.$curWeekdayIdx) && $calendar.entries.$curWeekdayIdx)}checked="checked"{/if}> + {$weekday}: {l s='De' mod='dejala'} + <select name="start_hour_{$curWeekdayIdx}"> + {if (isset($calendar.entries.$curWeekdayIdx))} + {assign var='start_hour' value=$calendar.entries.$curWeekdayIdx.start_hour} + {else} + {assign var='start_hour' value=9} + {/if} + {section name=starthour start=0 loop=24 step=1} + <option value="{$smarty.section.starthour.index}" {if $start_hour == $smarty.section.starthour.index}selected="selected"{/if}>{$smarty.section.starthour.index} H</option> + {/section} + </select> + {l s='A' mod='dejala'} + <select name="stop_hour_{$curWeekdayIdx}"> + {if (isset($calendar.entries.$curWeekdayIdx))} + {assign var='stop_hour' value=$calendar.entries.$curWeekdayIdx.stop_hour} + {else} + {assign var='stop_hour' value=18} + {/if} + {section name=stophour start=0 loop=25 step=1} + <option value="{$smarty.section.stophour.index}" {if $stop_hour == $smarty.section.stophour.index}selected="selected"{/if}>{$smarty.section.stophour.index} H</option> + {/section} + </select> + +</div> + +{/foreach} \ No newline at end of file diff --git a/modules/dejala/dejala_processes.tpl b/modules/dejala/dejala_processes.tpl new file mode 100644 index 000000000..f2f451de3 --- /dev/null +++ b/modules/dejala/dejala_processes.tpl @@ -0,0 +1,23 @@ + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="processes"/> + <fieldset> + <h4 class="clear">{l s='Please specify the processes to properly handle deliveries' mod='dejala'}:</h4> + {l s='Feel free to adapt the default processes to your own business processes' mod='dejala'}<br/> + <br/> + + <label class="clear">{l s='Bad address' mod='dejala'}:</label> + <div class="margin-form"><textarea rows="4" cols="45" name="process_bad_address">{$process_bad_address}</textarea></div> + + <label class="clear">{l s='Absent recipient' mod='dejala'}:</label> + <div class="margin-form"><textarea rows="4" cols="45" name="process_absent_recipient">{$process_absent_recipient}</textarea></div> + + <label class="clear">{l s='Delivery rejected' mod='dejala'}:</label> + <div class="margin-form"><textarea rows="4" cols="45" name="process_delivery_rejected">{$process_delivery_rejected}</textarea></div> + + <label class="clear">{l s='Delivery packaging' mod='dejala'}:</label> + <div class="margin-form"><textarea rows="4" cols="45" name="process_packaging">{$process_packaging}</textarea></div> + + <div class="margin-form"><input type="submit" name="btnSubmit" value="{l s='Update settings' mod='dejala'}" class="button" /></div> + </fieldset> + </form> + \ No newline at end of file diff --git a/modules/dejala/dejala_products.tpl b/modules/dejala/dejala_products.tpl new file mode 100644 index 000000000..4f4b9e85a --- /dev/null +++ b/modules/dejala/dejala_products.tpl @@ -0,0 +1,40 @@ + <form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="products"/> + <fieldset> + <h4 class="clear">{l s='Please set you margin for deliveries' mod='dejala'}:</h4> + + <table class="table" width="100%" > + <tr class='center'> + <th rowspan="2" class='center bold'>{l s='Name' mod='dejala'}</th> + <th colspan="2" class='center bold'>{l s='Buy price' mod='dejala'}</th> + <th rowspan="2" class='center bold'>{l s='Margin TTC' mod='dejala'}</th> + <th colspan="2" class='center bold'>{l s='Customer price' mod='dejala'}</th> + <th rowspan="2" class='center bold'>{l s='Description' mod='dejala'}</th> + </tr> + <tr class='bold'> + + <th>{l s='Buy HT' mod='dejala'}</th> + <th>{l s='Buy TTC' mod='dejala'}</th> + + <th>{l s='Sell HT' mod='dejala'}</th> + <th>{l s='Sell TTC' mod='dejala'}</th> + + </tr> + + {foreach from=$products item=product name=productLoop} + <tr {if ($smarty.foreach.dateLabelLoop.index % 2 == 0)}class='alt_row'{/if}> + <td>{$product.code}</td> + <td>{$product.price_notax}</td> + <td>{$product.price}</td> + <td><input type="text" name="margin_{$product.id}" value="{if ($product.margin>0)}+{/if}{$product.margin}"/></td> + <td>{$product.public_price_notax}</td> + <td>{$product.public_price}</td> + <td>{$product.description}<br/>{l s='In' mod='dejala'} {$product.timelimit}{l s='h' mod='dejala'}</td> + </tr> + {/foreach} + </table> + <br/> + <div><input type="submit" name="btnSubmit" value="{l s='Update settings' mod='dejala'}" class="button" /></div> + </fieldset> + <br/> + </form> \ No newline at end of file diff --git a/modules/dejala/dejala_technical_options.tpl b/modules/dejala/dejala_technical_options.tpl new file mode 100644 index 000000000..320215992 --- /dev/null +++ b/modules/dejala/dejala_technical_options.tpl @@ -0,0 +1,20 @@ +<form action="{$formAction}" method="post"> + <input type="hidden" name="method" value="technical_options"/> + <fieldset> + + <h4 class="clear">{l s='List of triggering status' mod='dejala'}:</h4> + <div class="margin-form"> + {*<input size="30" type="text" name="triger_status" value="{$trigerringStatuses}" />*} + <input type='hidden' name='status_max' value='{$statuses|@count}'/> + {foreach from=$statuses item=status name=statusLoop} + {assign var='curIdxStatus' value=$smarty.foreach.statusLoop.index} + <div style="float:left;height:30px;width:50%;"> + <input type='checkbox' name='status_{$curIdxStatus}' value='{$status.id}' {if ('1' == $status.checked)}checked='checked'{/if}/> {$status.label} + </div> + {/foreach} + + <p class="clear">{l s='List of statuses that trigger dejala.fr' mod='dejala'}</p> + </div> + <div class="margin-form"><input type="submit" name="btnSubmit" value="{l s='Update settings' mod='dejala'}" class="button" /></div> + </fieldset> +</form> diff --git a/modules/dejala/dejala_timetable.tpl b/modules/dejala/dejala_timetable.tpl new file mode 100644 index 000000000..cc7eec3d1 --- /dev/null +++ b/modules/dejala/dejala_timetable.tpl @@ -0,0 +1,27 @@ +{* MFR081028 - information de shipping *} +<tr style="border-top: 0px solid #bdc2c9;"> + <td colspan="4" style="border-top: 0px solid #bdc2c9;width:100%;padding:0px 2px 0px 2px;"> + + <div id="shipping_pref" {if !$my_carrier_selected}style="display:none;"{/if}> + <div id="shipping_div"> + <div id="shipping_dates"> + <label class="title">{l s='Choose your delivery day' mod='dejala'}:</label><br class="clear"/> + {foreach from=$dates item=dateItem name=dateLabelLoop} + {assign var='curIdxDate' value=$smarty.foreach.dateLabelLoop.index} + <div><label><input type="radio" name="shipping_day" id="shipd{$curIdxDate}" value="{$dateItem.value}" onClick="selectDay({$curIdxDate});" {if ($deliveryDateSelected==$dateItem.value)}checked="checked" {/if}/> {$dateItem.label}</label></div> + {/foreach} + </div> + <div id="shipping_hours"> + <label class="title">{l s='Choose you delivery timeslot' mod='dejala'}:</label><br class="clear"/> + {section name=hour start=0 loop=24 step=1} + {assign var='curIdxhour' value=$smarty.section.hour.index} + <div id="divhr{$curIdxhour}"><label><input type="radio" name="shipping_hour" id="shiphr{$curIdxhour}" value="{$curIdxhour}" OnClick="selectHour({$curIdxhour});" {if ($deliveryHourSelected==$curIdxhour)}checked="checked"{/if}/> {$hourLabels.$curIdxhour}</label></div> + {/section} + </div> + </div> + <br class="clear"/> + </div> + + </td> +</tr> +{* MFR081028 - information de shipping *} diff --git a/modules/dejala/dejalacarrierutils.php b/modules/dejala/dejalacarrierutils.php new file mode 100644 index 000000000..18c5d8437 --- /dev/null +++ b/modules/dejala/dejalacarrierutils.php @@ -0,0 +1,100 @@ +<?php + +/** + * Utility class to manipulate dejala Carrier data + **/ +class DejalaCarrierUtils +{ + /** + * creates of a dejala carrier corresponding to $dejalaProduct + */ + public static function createDejalaCarrier($dejalaConfig) + { + // MFR091130 - get id zone from the country used in the module (if the store zones were customized) - default is 1 (Europe) + $id_zone = 1; + $moduleCountryIsoCode = strtoupper($dejalaConfig->country); + $countryID = Country::getByIso($moduleCountryIsoCode); + if ((int)($countryID)) + $id_zone = Country::getIdZone($countryID); + + //TODO Will have to review this and apply proper code. + $trg_id = 1 ; + /*$vatRate = "19.6"; + // MFR091130 - get or create the tax & attach it to our zone if needed + $id_tax = Tax::getTaxIdByRate((float)$vatRate); + $trg_id = 0; + if (!$id_tax) + { + $tax = new Tax(); + $tax->rate = $vatRate; + $defaultLanguage = Configuration::get('PS_LANG_DEFAULT'); + $tax->name[$defaultLanguage] = $tax->rate . '%'; + $tax->add(); + $id_tax = $tax->id; + + $trg = new TaxRulesGroup(); + $trg->name = 'Dejala '.$tax->name[$defaultLanguage]; + $trg->active = 1; + if ($trg->save()) + { + $trg_id = $trg->id; + + $tr = new TaxRule(); + $tr->id_tax_rules_group = $trg_id; + $tr->id_country = (int) $countryID; + $tr->id_state = 0; + $tr->id_tax = (int)$tax->id; + $tr->state_behavior = 0; + $tr->save(); + } + }*/ + + $carrier = new Carrier(); + $carrier->name = 'dejala'; + $carrier->id_tax_rules_group = (int)$trg_id; + $carrier->url = 'http://tracking.dejala.' . $dejalaConfig->country . '/tracker/@'; + $carrier->active = true; + $carrier->deleted = 0; + $carrier->shipping_handling = false; + $carrier->range_behavior = 0; + $carrier->is_module = 1; + $carrier->external_module_name = 'dejala' ; + $carrier->shipping_external = 1 ; + $carrier->need_range = 0 ; + + $languages = Language::getLanguages(true); + foreach ($languages as $language) + $carrier->delay[$language['id_lang']] = 'Dejala' ; + + $carrier->add(); + + $carrier->addZone((int)$id_zone) ; + /*$sql = 'INSERT INTO `'._DB_PREFIX_.'carrier_zone` (`id_carrier` , `id_zone`) VALUES ('.(int)($carrier->id).', ' . (int)($id_zone) . ')'; + Db::getInstance()->Execute($sql); + + $rangeW = new RangeWeight(); + $rangeW->id_carrier = $carrier->id; + $rangeW->delimiter1 = 0; + $rangeW->delimiter2 = $dejalaProduct['max_weight']; + $rangeW->add(); + $vat_factor = (1+ ($dejalaProduct['vat'] / 100)); + $priceTTC = round(($dejalaProduct['price']*$vat_factor) + $dejalaProduct['margin'], 2); + $priceHT = round($priceTTC/$vat_factor, 2); + $priceList = '(NULL'.','.$rangeW->id.','.$carrier->id.','.$id_zone.','.$priceHT.')'; + $carrier->addDeliveryPrice($priceList);*/ + + return true; + } + + public static function getCarrierByName($name) { + global $cookie ; + + $carriers = Carrier::getCarriers((int)$cookie->id_lang, true, false, false, NULL, ALL_CARRIERS); + foreach($carriers as $carrier) + if (!$carrier['deleted'] AND $carrier['external_module_name'] == $name) + return new Carrier((int)$carrier['id_carrier']) ; + + } + +} + diff --git a/modules/dejala/dejalacart.php b/modules/dejala/dejalacart.php new file mode 100644 index 000000000..5ed66678e --- /dev/null +++ b/modules/dejala/dejalacart.php @@ -0,0 +1,74 @@ +<?php + + +/** + * DejalaCart class, dejalacart.php + * Manage cart information related to dejala.fr carrier + **/ +if (!defined('_CAN_LOAD_FILES_')) + exit; +class DejalaCart extends ObjectModel +{ + public $id; + public $id_dejala_product; + public $shipping_date; + public $id_delivery; + // 'TEST' or 'PROD' + public $mode; + public $cart_date_upd ; + public $delivery_price ; + private $wanted_cart_id ; + + // This field is voluntarily kept out of the database. + public $product ; + + protected $table = 'dejala_cart'; + protected $identifier = 'id_cart'; + private static $INSTANCES = array() ; + private $djlCart ; + + static public function getInstance($id) + { + if (!isset(self::$INSTANCES[$id])) + self::$INSTANCES[$id] = new DejalaCart($id); + + return self::$INSTANCES[$id]; + } + + public function __construct($id = NULL, $id_lang = NULL) + { + if (isset($id) && !is_null($id)) + $this->wanted_cart_id = (int)$id ; + + parent::__construct($id, $id_lang) ; + if (isset($this->id) && $this->id == $this->wanted_cart_id) + unset($this->wanted_cart_id) ; + } + + public function getFields() + { + parent::validateFields(); + $fields['id_dejala_product'] = (int)($this->id_dejala_product); + $fields['shipping_date'] = pSQL($this->shipping_date); + $fields['id_delivery'] = (int)($this->id_delivery); + $fields['mode'] = pSQL($this->mode); + $fields['cart_date_upd'] = pSQL($this->cart_date_upd); + $fields['delivery_price'] = pSQL($this->delivery_price); + if (!isset($id_cart) && isset($original_cart_id)) $id_cart = $original_cart_id ; + return $fields; + } + + public function save($nullValues = false, $autodate = true) + { + parent::save($nullValues, $autodate) ; + if (isset($this->wanted_cart_id)) + { + Db::getInstance()->Execute('UPDATE ' . _DB_PREFIX_ . $this->table . ' SET ' . $this->identifier . ' = ' . (int)$this->wanted_cart_id . ' WHERE ' . $this->identifier . ' = ' . (int)$this->id); + $this->id = (int)$this->wanted_cart_id ; + unset($this->wanted_cart_id) ; + } + } + +} + + diff --git a/modules/dejala/dejalaconfig.php b/modules/dejala/dejalaconfig.php new file mode 100644 index 000000000..08617999d --- /dev/null +++ b/modules/dejala/dejalaconfig.php @@ -0,0 +1,119 @@ +<?php + + +class DejalaConfig +{ + public $country = "fr"; + public $login = ""; + public $password = ""; + public $installed = 1; + public $useSSL = 0; + public $serviceURL = 'http://v1.services.dejala.fr/services'; + public $sandboxServiceURL = 'http://t1.services.dejala.fr/services'; + public $mode = 'TEST'; + public $trigerringStatuses = '2'; + // Faire apparaitre/disparaitre le module sur le front + //public $active = 0; + public $visibility_status = "invisible" ; + public $visible_users_list = ""; + public $internal_version ; + + // Not stored in the local config. Only sent on shop creation + public $storeUrl ; + + public function saveConfig() + { + if ( Configuration::updateValue('DJL_SERVICE_URL', $this->serviceURL) == false + OR Configuration::updateValue('DJL_SANDBOX_SERVICE_URL', $this->sandboxServiceURL) == false + OR Configuration::updateValue('DJL_USE_SSL', $this->useSSL) == false + OR Configuration::updateValue('DJL_MODE', $this->mode) == false + OR Configuration::updateValue('DJL_LOGIN', $this->login) == false + OR Configuration::updateValue('DJL_PASSWORD', $this->password) == false + OR Configuration::updateValue('DJL_INSTALLED', $this->installed) == false + OR Configuration::updateValue('DJL_TRIGERRING_STATUSES', $this->trigerringStatuses) == false + OR Configuration::updateValue('DJL_COUNTRY', $this->country) == false + OR Configuration::updateValue('DJL_VISIBILITY_STATUS', $this->visibility_status) == false + OR Configuration::updateValue('DJL_VISIBLE_USERS_LIST', $this->visible_users_list) == false + OR Configuration::updateValue('DJL_VERSION', $this->internal_version) == false + ) { + return (false); + } + + // Backward compatibility. Garbage collect + Configuration::deleteByName('DJL_ACTIVE'); + return (true); + } + + public function uninstall() { + Configuration::deleteByName('DJL_SERVICE_URL'); + Configuration::deleteByName('DJL_SANDBOX_SERVICE_URL'); + Configuration::deleteByName('DJL_USE_SSL'); + Configuration::deleteByName('DJL_MODE'); + Configuration::deleteByName('DJL_LOGIN'); + Configuration::deleteByName('DJL_PASSWORD'); + Configuration::deleteByName('DJL_INSTALLED'); + Configuration::deleteByName('DJL_TRIGERRING_STATUSES'); + Configuration::deleteByName('DJL_COUNTRY'); + Configuration::deleteByName('DJL_ACTIVE'); + Configuration::deleteByName('DJL_VISIBILITY_STATUS'); + Configuration::deleteByName('DJL_VISIBLE_USERS_LIST'); + // DO NOT DELETE DJL_VERSION AS WE LEAVE THE TABLE IN THE DB. + } + + // load configuration + public function loadConfig() + { + $this->installed = html_entity_decode(Configuration::get('DJL_INSTALLED'), ENT_COMPAT, 'UTF-8'); + $this->useSSL = (int)(html_entity_decode(Configuration::get('DJL_USE_SSL'), ENT_COMPAT, 'UTF-8')); + $this->serviceURL = html_entity_decode(Configuration::get('DJL_SERVICE_URL'), ENT_COMPAT, 'UTF-8'); + $this->sandboxServiceURL = html_entity_decode(Configuration::get('DJL_SANDBOX_SERVICE_URL'), ENT_COMPAT, 'UTF-8'); + $this->mode = html_entity_decode(Configuration::get('DJL_MODE'), ENT_COMPAT, 'UTF-8'); + $this->login = html_entity_decode(Configuration::get('DJL_LOGIN'), ENT_COMPAT, 'UTF-8'); + $this->password = html_entity_decode(Configuration::get('DJL_PASSWORD'), ENT_COMPAT, 'UTF-8'); + $this->trigerringStatuses = html_entity_decode(Configuration::get('DJL_TRIGERRING_STATUSES'), ENT_COMPAT, 'UTF-8'); + + $this->shippingPrefix = html_entity_decode(Configuration::get('DJL_SHIPPING_PREFIX'), ENT_COMPAT, 'UTF-8'); + $this->country = html_entity_decode(Configuration::get('DJL_COUNTRY'), ENT_COMPAT, 'UTF-8'); + if (strlen($this->country) == 0) + $this->country = 'fr'; + $this->visibility_status = html_entity_decode(Configuration::get('DJL_VISIBILITY_STATUS'), ENT_COMPAT, 'UTF-8'); + $this->visible_users_list = html_entity_decode(Configuration::get('DJL_VISIBLE_USERS_LIST'), ENT_COMPAT, 'UTF-8'); + $this->internal_version = Configuration::get('DJL_VERSION') ; + + // Backward compatibility + $activeVal = html_entity_decode(Configuration::get('DJL_ACTIVE'), ENT_COMPAT, 'UTF-8') ; + if ($activeVal != "") + { + $this->active = (int)($activeVal); + $this->visibility_status = ($this->active == 0 ? "invisible" : "visible") ; + } + + if ($this->visibility_status == "") + $this->visibility_status = "invisible" ; + } + + /** + * Renvoie l'URI de base à utiliser + * $forceMode TEST/PROD pour forcer l'utilisation d'une des 2 plateformes + **/ + public function getRootServiceURI($forceMode = NULL) + { + $l_serviceURL = NULL; + $useMode = $this->mode; + // mode forcé ? + if ($forceMode && ($forceMode == 'PROD')) + $useMode = 'PROD'; + else if ($forceMode) + $useMode = 'TEST'; + + if ($useMode === 'PROD') + $l_serviceURL = $this->serviceURL; + else + $l_serviceURL = $this->sandboxServiceURL; + if ($this->useSSL !== 0) + if (0 === strpos($l_serviceURL, 'http:')) + $l_serviceURL = 'https'.substr($l_serviceURL, 4); + + return ($l_serviceURL); + } +} diff --git a/modules/dejala/dejalatest.php b/modules/dejala/dejalatest.php new file mode 100644 index 000000000..34cfc3792 --- /dev/null +++ b/modules/dejala/dejalatest.php @@ -0,0 +1,19 @@ +<?php +//Indispensable ?? +class DejalaTest +{ + public $dejalaConfig; + // 'TEST' or 'PROD' + public $mode = "TEST"; + + + + +} + +$djlTest = new DejalaTest(); + + + + +?> \ No newline at end of file diff --git a/modules/dejala/dejalautils.php b/modules/dejala/dejalautils.php new file mode 100644 index 000000000..a7fe4402d --- /dev/null +++ b/modules/dejala/dejalautils.php @@ -0,0 +1,498 @@ +<?php + +/** + * Utilitary functions to interract with dejala.fr + **/ +class DejalaUtils +{ + /** + * Order the delivery to dejala.fr + * @returns the HTTP status code of the request + **/ + public function orderDelivery($dejalaConfig, &$delivery, $mode) + { + if ($mode !== 'PROD') + $serviceURL = $dejalaConfig->getRootServiceURI('TEST') . '/mystore/delivery'; + else + $serviceURL = $dejalaConfig->getRootServiceURI('PROD') . '/mystore/delivery'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $delivery, 'POST', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $nodeList = $doc->getElementsByTagName('delivery'); + if ($nodeList->length > 0) + $this->getNodeValue($nodeList->item(0), $delivery); + } + return ($responseArray); + } + + /** + * Quick creates a store account at dejala.fr + * only works on Dejala test platform + * @returns the HTTP status code of the request + **/ + public function createInstantStore($dejalaConfig, $storeName) + { + $serviceURL = $dejalaConfig->getRootServiceURI('TEST') . '/instantstore'; + $postargs['login']=$dejalaConfig->login; + $postargs['password']=$dejalaConfig->password; + $postargs['store_url']=$dejalaConfig->storeUrl; + $postargs['store_name'] = $storeName; + $postargs['platform'] = 'prestashop'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'POST', FALSE); + return ($responseArray); + } + + static public function wtf($var, $arrayOfObjectsToHide=null, $fontSize=11) + { + $text = print_r($var, true); + + if (is_array($arrayOfObjectsToHide)) + foreach ($arrayOfObjectsToHide as $objectName) + { + + $searchPattern = '#('.$objectName.' Object\n(\s+)\().*?\n\2\)\n#s'; + $replace = "$1<span style=\"color: #FF9900;\">--&gt; HIDDEN - courtesy of wtf() &lt;--</span>)"; + $text = preg_replace($searchPattern, $replace, $text); + } + + // color code objects + $text = preg_replace('#(\w+)(\s+Object\s+\()#s', '<span style="color: #079700;">$1</span>$2', $text); + // color code object properties + $text = preg_replace('#\[(\w+)\:(public|private|protected)\]#', '[<span style="color: #000099;">$1</span>:<span style="color: #009999;">$2</span>]', $text); + + echo '<pre style="font-size: '.$fontSize.'px; line-height: '.$fontSize.'px;text-align:left;">'.$text.'</pre>'; + } + + public function getStoreLocation($dejalaConfig, &$location) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore'; + $postargs = array(); + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $locationNodes=$doc->getElementsByTagName('location'); + if ($locationNodes->length > 0) + { + $locationNode = $locationNodes->item(0); + $nodeList = $locationNode->childNodes; + foreach ($nodeList as $element) + $location[$element->nodeName] = $element->textContent; + } + } + return ($responseArray); + } + + public function getStoreCalendar($dejalaConfig, &$calendar) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/calendar/'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, array(), 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $nodeList = $doc->getElementsByTagName('entry'); + if ($nodeList->length > 0) + { + foreach ($nodeList as $element) + { + $calendarNode = $this->getNodeValue($element); + $calendar['entries'][(int)($calendarNode['weekday'])] = $calendarNode; + } + } + $nodeList = $doc->getElementsByTagName('exception'); + $calendar['exceptions'] = array(); + if ($nodeList->length > 0) + foreach ($nodeList as $element) + $calendar['exceptions'][] = $this->getNodeValue($element); + + } + return ($responseArray); + } + + public function getStoreContacts($dejalaConfig, &$contacts) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore'; + $postargs = array(); + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $contactsNodeList = $doc->getElementsByTagName('contacts'); + if ($contactsNodeList->length > 0) + { + $contactNodes = $contactsNodeList->item(0)->childNodes; + if ($contactNodes) + foreach ($contactNodes as $contactNode) + { + $name = $contactNode->nodeName; + $nodeList = $contactNode->childNodes; + $currentContactNode = array(); + if ($nodeList) + foreach ($nodeList as $element) + $currentContactNode[$element->nodeName] = $element->textContent; + + $contacts[$name] = $currentContactNode; + } + } + } + return ($responseArray); + } + + public function getStoreProducts($dejalaConfig, &$products) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/products'; + $postargs = array(); + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $productsNodeList = $doc->getElementsByTagName('product'); + foreach ($productsNodeList as $productNode) + { + $currentProduct = array(); + $nodeList = $productNode->childNodes; + foreach ($nodeList as $element) + $currentProduct[$element->nodeName] = $element->textContent; + if (count($currentProduct)) + $products[] = $currentProduct; + } + } + + usort($products, array("DejalaUtils", "cmpProducts")); + return ($responseArray); + } + + private static function cmpProducts($a, $b) + { + if ($a['priority'] == $b['priority']) + { + if (($a['price'] == $b['price'])) + return ($a['id'] < $b['id']) ? -1 : 1 ; + + return ($a['price'] < $b['price']) ? -1 : 1 ; + } + return ($a['priority'] < $b['priority']) ? -1 : 1; + } + + public function getStoreQuotation($dejalaConfig, $quotationElements, &$products) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/quotation'; + $postargs = $quotationElements; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $productsNodeList = $doc->getElementsByTagName('product'); + foreach ($productsNodeList as $productNode) + { + $currentProduct = $this->getNodeValue($productNode); + unset($currentProduct['calendar']['entries']['entry']); + $calendarNodeList = $doc->getElementsByTagName('entry'); + foreach ($calendarNodeList as $calendarNode) + { + $calendarEntry = $this->getNodeValue($calendarNode); + $currentProduct['calendar']['entries'][$calendarEntry['weekday']] = $calendarEntry; + } + $exceptionNodeList = $doc->getElementsByTagName('exception'); + $currentProduct['calendar']['exceptions'] = array(); + foreach ($exceptionNodeList as $exceptionNode) + $currentProduct['calendar']['exceptions'][] = $this->getNodeValue($exceptionNode); + + /*$currentProduct = array(); + $nodeList = $productNode->childNodes; + foreach ($nodeList as $element) { + $currentProduct[$element->nodeName] = $element->textContent; + } + */ + if (count($currentProduct)) + $products[] = $currentProduct; + } + } + usort($products, array("DejalaUtils", "cmpProducts")); + return ($responseArray); + } + + public function getStoreAttributes($dejalaConfig, &$store) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore'; + $postargs = array(); + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $fatherNodeList = $doc->getElementsByTagName('store'); + if ($fatherNodeList->length > 0) + { + $childNodes = $fatherNodeList->item(0)->childNodes; + foreach ($childNodes as $childNode) + $store[$childNode->nodeName] = $childNode->textContent; + + } + $nodeList = $doc->getElementsByTagName('attributes'); + $store['attributes'] = array(); + if ($nodeList->length > 0) + $store['attributes'] = $this->getNodeValue($nodeList->item(0)); + + } + return ($responseArray); + } + + public function getStoreProcesses($dejalaConfig, &$processes) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore'; + $postargs = array(); + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $fatherNodeList = $doc->getElementsByTagName('processes'); + if ($fatherNodeList->length > 0) + { + $childNodes = $fatherNodeList->item(0)->childNodes; + foreach ($childNodes as $childNode) + $processes[$childNode->nodeName] = $childNode->textContent; + } + } + return ($responseArray); + } + + public function getStoreProductByID($dejalaConfig, $productID, &$product) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/products/' . $productID; + $postargs = array(); + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $postargs, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $productsNodeList = $doc->getElementsByTagName('product'); + if ($productsNodeList->length > 0) + { + $nodeList = $productsNodeList->item(0)->childNodes; + foreach ($nodeList as $element) + $product[$element->nodeName] = $element->textContent; + } + } + return ($responseArray); + } + + public function getDelivery($dejalaConfig, &$delivery, $mode) + { + if ($mode !== 'PROD') + $serviceURL = $dejalaConfig->getRootServiceURI('TEST') . '/mystore/delivery/' . $delivery['id']; + else + $serviceURL = $dejalaConfig->getRootServiceURI('PROD') . '/mystore/delivery/' . $delivery['id']; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, array(), 'GET', TRUE); + + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $nodeList = $doc->getElementsByTagName('delivery'); + if ($nodeList->length > 0) + $this->getNodeValue($nodeList->item(0), $delivery); + } + return ($responseArray); + } + + /** + * Transforms and returns node into tree structure, use $value array if not null + **/ + function getNodeValue($node, &$value=NULL) + { + if ($node instanceof DOMElement) + { + $childNodes = $node->childNodes; + $onlyText = TRUE; + $text = ''; + foreach ($childNodes as $childNode) + { + if ($childNode instanceof DOMElement) + { + $onlyText = FALSE; + $value[$childNode->nodeName] = $this->getNodeValue($childNode); + } + } + + if ($onlyText) + return ($value=$node->textContent); + } + return ($value); + } + + public function getStoreDeliveries($dejalaConfig, &$deliveries, $args = array()) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/deliveries'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $args, 'GET', TRUE); + if (!($xml = strstr($responseArray['response'], '<?xml'))) + $xml = null; + else + { + $doc = new DOMDocument(); + $doc->loadXML($xml); + $childNodes = $doc->getElementsByTagName('delivery'); + foreach ($childNodes as $childNode) + $deliveries[] = $this->getNodeValue($childNode); + + } + return ($responseArray); + } + + public function setStoreContacts($dejalaConfig, &$contacts) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/contacts'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $contacts, 'PUT', TRUE); + return ($responseArray); + } + public function setStoreLocation($dejalaConfig, &$location) + { + $serviceURL = $dejalaConfig->getRootServiceURI('TEST') . '/mystore/location'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $location, 'PUT', TRUE); + return ($responseArray); + } + public function setStoreProcesses($dejalaConfig, &$processes) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/processes'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $processes, 'PUT', TRUE); + return ($responseArray); + } + public function setStoreProducts($dejalaConfig, &$products) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/products'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $products, 'PUT', TRUE); + return ($responseArray); + } + public function setStoreCalendar($dejalaConfig, &$calendar) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/calendar'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $calendar, 'POST', TRUE); + return ($responseArray); + } + + public function setStoreAttributes($dejalaConfig, &$attributes) + { + $serviceURL = $dejalaConfig->getRootServiceURI() . '/mystore/attributes'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, $attributes, 'PUT', TRUE); + return ($responseArray); + } + + /** + * Ask Dejala.fr to create an account for the store on the production platform + **/ + public function goLive($dejalaConfig) + { + $serviceURL = $dejalaConfig->getRootServiceURI('TEST') . '/mystore/golive'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, array(), 'PUT', TRUE); + return ($responseArray); + } + /** + * teste la connexion sur le service Dejala dans le mode (TEST/PROD) + * */ + public function ping($dejalaConfig, $mode) + { + if ($mode !== 'PROD') + $serviceURL = $dejalaConfig->getRootServiceURI('TEST') . '/ping'; + else + $serviceURL = $dejalaConfig->getRootServiceURI('PROD') . '/ping'; + $responseArray = $this->makeRequest($dejalaConfig, $serviceURL, array(), 'GET', TRUE); + return ($responseArray); + } + + public function makeRequest($dejalaConfig, $serviceURL, $args, $method='POST', $needAuth=TRUE) + { + $session = curl_init($serviceURL); + $requestArgs = ""; + foreach ($args as $key => $value) + $requestArgs = $requestArgs . '&' . $key . '=' . urlencode($value); + + if ($method == 'GET') + { + if (strlen($requestArgs) > 0) + $requestArgs = '?' . $requestArgs; + $session = curl_init($serviceURL . $requestArgs); + } + else if ($method == 'POST') + { + $session = curl_init($serviceURL); + curl_setopt($session, CURLOPT_POST, true); + curl_setopt($session, CURLOPT_POSTFIELDS, $requestArgs); + } + else if ($method == 'PUT') + { + curl_setopt($session, CURLOPT_CUSTOMREQUEST, 'PUT'); + curl_setopt($session, CURLOPT_POSTFIELDS, $requestArgs); + } + // manage authenth + if ($needAuth) + { + curl_setopt($session, CURLOPT_USERPWD, $dejalaConfig->login.':'.$dejalaConfig->password); + curl_setopt($session, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + } + // SSL option + if ($dejalaConfig->useSSL === 1) { + curl_setopt($session, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($session, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($session, CURLOPT_PORT, 443); + } + curl_setopt($session, CURLOPT_HEADER, true); + curl_setopt($session, CURLOPT_RETURNTRANSFER, true); + // Do the POST and then close the session + $response = curl_exec($session); + curl_close($session); + // Get HTTP Status code from the response + $status_code = array(); + preg_match('/\d\d\d/', $response, $status_code); + $responseArray['status']=$status_code[0]; + $responseArray['response']=$response; + return ($responseArray); + } + + + public function mylog($msg) + { + + require_once(dirname(__FILE__) . "/MyLogUtils.php"); + $myFile = dirname(__FILE__) . "/logFile.txt"; + MyLogUtils::myLog($myFile, $msg); + + } + + // get a string of a value for Log purposes + public function logValue($mvalue, $lvl=0) + { + require_once(dirname(__FILE__) . "/MyLogUtils.php"); + return (MyLogUtils::logValue($mvalue, $lvl)); + } + + +} + diff --git a/modules/dejala/deliveries_csv.php b/modules/dejala/deliveries_csv.php new file mode 100644 index 000000000..c806f0319 --- /dev/null +++ b/modules/dejala/deliveries_csv.php @@ -0,0 +1,72 @@ +<?php + include_once(dirname(__FILE__).'/../../config/config.inc.php'); + require_once(_PS_MODULE_DIR_ . "dejala/dejalaconfig.php"); + require_once(_PS_MODULE_DIR_. "dejala/dejalautils.php"); + + function doubleQuoteArray($array) + { + $l_array = array(); + foreach ($array as $key=>$val) + if (is_array($val)) + $l_array[$key] = doubleQuoteArray($val); + else + $l_array[$key] = ereg_replace('"', '""', $val); + + return ($l_array); + } + + global $smarty; + $dejalaConfig = new DejalaConfig(); + $dejalaConfig->loadConfig(); + + $from = Tools::getValue('datepickerFrom'); + $to = Tools::getValue('datepickerTo'); + if (!is_null($from) && !is_null($to) && (strlen($from) == 10) && (strlen($to) == 10) ) + { + $dateFrom = mktime(0, 0, 1, (int)(substr($from, 3, 2)), (int)(substr($from, 0, 2)), (int)(substr($from, 6, 4))); + $dateTo = mktime(23, 59, 59, (int)(substr($to, 3, 2)), (int)(substr($to, 0, 2)), (int)(substr($to, 6, 4))); + if ($dateFrom > $dateTo) + { + $tmp = $dateTo; + $dateTo = $dateFrom; + $dateFrom = $tmp; + } + + $djlUtil = new DejalaUtils(); + $deliveries = array(); + $responseArray = $djlUtil->getStoreDeliveries($dejalaConfig, $deliveries, array('from_utc'=>$dateFrom, 'to_utc'=>$dateTo)); + if ($responseArray['status']='200') + { + $l_deliveries = array(); + header("Content-type: text/csv"); + header("Content-disposition: attachment; filename=\"deliveries.csv\""); + + foreach ($deliveries as $key=>$delivery) + { + $l_delivery = doubleQuoteArray($delivery); + $l_delivery['price']=ereg_replace('\.', ',', $l_delivery['price']); + $l_delivery['creation_date'] = date('d/m/Y', $delivery['creation_utc']); + $l_delivery['creation_time'] = date('H\hi', $delivery['creation_utc']); + if (isset($delivery['shipping_start_utc'])) + { + $l_delivery['shipping_date'] = date('d/m/Y', $delivery['shipping_start_utc']); + $l_delivery['shipping_start'] = date('H\hi', $delivery['shipping_start_utc']); + $l_delivery['shipping_stop'] = date('H\hi', (int)($delivery['shipping_start_utc']) + 3600*(int)($delivery['timelimit']) ); + } + else + { + $delivery['shipping_date'] = ''; + $delivery['shipping_start'] = ''; + $delivery['shipping_stop'] = ''; + } + if (isset($l_delivery['delivery_utc'])) + { + $l_delivery['delivery_date'] = date('d/m/Y', $delivery['delivery_utc']); + $l_delivery['delivery_time'] = date('H\hi', $delivery['delivery_utc']); + } + $l_deliveries[$key] = $l_delivery; + } + $smarty->assign('deliveries', $l_deliveries); + $smarty->display(dirname(__FILE__).'/dejala_deliveries_csv.tpl'); + } + } diff --git a/modules/dejala/es.php b/modules/dejala/es.php new file mode 100644 index 000000000..1e3a92b58 --- /dev/null +++ b/modules/dejala/es.php @@ -0,0 +1,187 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dejala}prestashop>dejala_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Domingo'; +$_MODULE['<{dejala}prestashop>dejala_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lunes'; +$_MODULE['<{dejala}prestashop>dejala_5792315f09a5d54fb7e3d066672b507f'] = 'Martes'; +$_MODULE['<{dejala}prestashop>dejala_796c163589f295373e171842f37265d5'] = 'Miércoles'; +$_MODULE['<{dejala}prestashop>dejala_78ae6f0cd191d25147e252dc54768238'] = 'Jueves'; +$_MODULE['<{dejala}prestashop>dejala_c33b138a163847cdb6caeeb7c9a126b4'] = 'Viernes'; +$_MODULE['<{dejala}prestashop>dejala_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Sábado'; +$_MODULE['<{dejala}prestashop>dejala_9902522831a16af239ba868918f984c6'] = 'Dejala.com: transporte por mensajero'; +$_MODULE['<{dejala}prestashop>dejala_69a226fe54256a93edb693bc97a7bcb5'] = 'Envia los pedidos de entrega a dejala.fr'; +$_MODULE['<{dejala}prestashop>dejala_f66e08578735b3cde28a2d8215b68a52'] = 'El módulo necesita la extensión php Dejala cURL para funcionar'; +$_MODULE['<{dejala}prestashop>dejala_0e334c81db8c621e16d82618aaf746ab'] = 'login requerido.'; +$_MODULE['<{dejala}prestashop>dejala_2a04cf556c49e32d4b4c46fd9b8bade5'] = 'contraseña requerida.'; +$_MODULE['<{dejala}prestashop>dejala_483cf1f6e275faa3c29ff20ba6e4407f'] = 'país requerido.'; +$_MODULE['<{dejala}prestashop>dejala_2485b5c3212614c367f862a8e46f4d11'] = 'el login debe ser una dirección de correo electrónico válida.'; +$_MODULE['<{dejala}prestashop>dejala_dd189cdaa73e88a19f495a0d6c49a61b'] = 'Nombre de tienda requerido.'; +$_MODULE['<{dejala}prestashop>dejala_4876f72a0b3d7f46de2b201ab02cd0a7'] = 'no es un margen valido.'; +$_MODULE['<{dejala}prestashop>dejala_ad5ee5e5c2989c1e72c586a9f8121716'] = 'Se ha producido un error durante la autentificación de su cuenta en Dejala.com. Sus datos de autentificacón no se han reconocido.'; +$_MODULE['<{dejala}prestashop>dejala_23e0f5b7cc6e26112230c098b893944a'] = 'Imposible procesar la acción'; +$_MODULE['<{dejala}prestashop>dejala_6bd82dd0c6115429b03dd84828d6ccb2'] = 'Por favor escoja otro login'; +$_MODULE['<{dejala}prestashop>dejala_0aec12d0e7c8784012ee74606648d625'] = 'El servidor Dejala es inaccesible desde su servidor prestashop. Esto se debe posiblemente a un límite impuesto por su hosting. Contacte con el soporte técnico para preguntarle si su servidor se encuentra en medida de efectuar conexxiones HTTP de salida.'; +$_MODULE['<{dejala}prestashop>dejala_f46fe05842135a72df96c3409cf00683'] = 'Se ha producido un error al actualizar la localización'; +$_MODULE['<{dejala}prestashop>dejala_2f63af6e20f182573774b785515ccb95'] = 'Se ha producido un error al actualizar los contactos'; +$_MODULE['<{dejala}prestashop>dejala_3a29c6eb6abefd3d629290756168d892'] = 'Se ha producido un error al actualizar los procesos'; +$_MODULE['<{dejala}prestashop>dejala_5f010efe1c8e6cb195205cbf864044aa'] = 'Se ha producido un error al actualizar los productos'; +$_MODULE['<{dejala}prestashop>dejala_004ac360e91b3dcf50a19a0fd09e3826'] = 'Debe dar al menos una dirección email válida para restringir la visivilidad del módulo Dejala en su tienda'; +$_MODULE['<{dejala}prestashop>dejala_c888438d14855d7d96a2724ee9c306bd'] = 'Parámetros actualizados'; +$_MODULE['<{dejala}prestashop>dejala_dfa53d8241c9f6908e669371b50e95f3'] = 'Este módulo requiere la extensión php cURL para funcionar corectamente. Por favor instale antes la extensión php \"cURL\".'; +$_MODULE['<{dejala}prestashop>dejala_4c7d16a1e83bcbfd9b33e95f8e90a625'] = 'Se ha producido un error durante la autentificación de su cuenta en Dejala.com. Esto puede ser debido a un error de red o a un problema de plataforma. Inténtelo más tarde o contacte con Dejala.com.'; +$_MODULE['<{dejala}prestashop>dejala_94939d114a8c65173b70b6e01aad11c0'] = 'Se ha producido un error al recuperar los datos. Inténtelo más tarde o contacte con Dejala.com.'; +$_MODULE['<{dejala}prestashop>dejala_41d211dd68bf0f87cf3181b0c8dac6e7'] = 'Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_3d8764621d6076807b0d60cfcadb7213'] = 'Cuando quiera... Por mensajero'; +$_MODULE['<{dejala}prestashop>dejala_627db4c965627fb7f03682dbbc43a4a1'] = 'Elegiré la hora de entrega cuando mi pedido esté listo.'; +$_MODULE['<{dejala}prestashop>dejala_07e9ea0147aee652244a280da00efb5a'] = 'Entrega preferible el'; +$_MODULE['<{dejala}prestashop>dejala_47a4dfe5ab79feb7884fa57786ea587c'] = 'a partir de '; +$_MODULE['<{dejala}prestashop>dejala_ba93cc89ba75ee6e74699a49a69c0600'] = 'Entrega cuya fecha debe establecerse con el cliente.'; +$_MODULE['<{dejala}prestashop>dejala_a240fa27925a635b08dc28c9e4f9216d'] = 'Pedido'; +$_MODULE['<{dejala}prestashop>dejala_296a91ebe13e861efa9bd0f74a927353'] = 'Pedido enviado a Dejala'; +$_MODULE['<{dejala}prestashop>dejala_carrier_21034ae6d01a83e702839a72ba8a77b0'] = '(sin IVA)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_1f87346a16cf80c372065de3c54c86d9'] = '(IVA inc.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_e7a6ca4e744870d455a57b644f696457'] = '¡ Gratis !'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_21034ae6d01a83e702839a72ba8a77b0'] = '(sin IVA)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_1f87346a16cf80c372065de3c54c86d9'] = '(IVA inc.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_e7a6ca4e744870d455a57b644f696457'] = '¡ Gratis !'; +$_MODULE['<{dejala}prestashop>dejala_contacts_a766dcf63862aaaa1625a45169aeb37a'] = 'Dueño de la tienda'; +$_MODULE['<{dejala}prestashop>dejala_contacts_4e140ba723a03baa6948340bf90e2ef6'] = 'Apellido:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_d2cacc542d8dd31bd89f8defed1b55ad'] = 'Nombre:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_673ae02fffb72f0fe68a66f096a01347'] = 'Teléfono:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7a31464d87d555a1d5a7d2afdeb64d4e'] = 'Teléfono móvil:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_01401fe9a93df81d28637e5218597b76'] = 'E-Mail:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7e2121a0b71ccc33c5eeaf11999fdbcd'] = 'Contacto de control de stock'; +$_MODULE['<{dejala}prestashop>dejala_contacts_23e44d356bfc0d17f904cb743b4d247c'] = 'Contacto con la Administración'; +$_MODULE['<{dejala}prestashop>dejala_contacts_527a0a71d5684695421ec3375ec6dba8'] = 'Contacto con Mantenimiento del Sitio web '; +$_MODULE['<{dejala}prestashop>dejala_contacts_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_9c8a7900448628ee2978be9a3945d148'] = 'Su crédito'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b0ee4c529eda15bdecda8bf189a3c813'] = 'Su crédito virtual (para simulación)'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_defcb35db6f9bdac29b888bfc07e6386'] = 'euros'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Acreditar su cuenta'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_642c4a47922246182590d4f3c8304f35'] = 'Lista de las ultimas entregas '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01abfc750a0c942167651c40d088531d'] = '#'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_67d5168b4f2b5424a3d118ea9ef99372'] = 'Creación'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d79cf3f429596f77db95c65074663a54'] = 'ID de Pedido'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2a033d36697bb24bfc7ece05545d268e'] = 'N° de Tracking'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b021df6aac4654c454f46c77646e745f'] = 'Etiqueta'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_3601146c4e948c32b6424d2c0a7f0118'] = 'Precio pagado (sin IVA)'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ec53a8c4f07baed5d8825072c89799be'] = 'Estado'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Fecha de toma en cargo'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descripción'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2ca8d70baf21b18878843c02a086e46c'] = 'En '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d98a07f84921b24ee30f86fd8cd85c3c'] = 'de'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01b6e20344b68835c5ed1ddedf20d531'] = 'a'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_427c7fb2385f610d26ea90fff86f9a84'] = 'Exportación Csv '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_5da618e8e4b89c66fe86e32cdafde142'] = 'De'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_e12167aa0a7698e6ebc92b4ce3909b53'] = 'a'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_a60852f204ed8028c1c58808b746d115'] = 'Ok'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8424d087ffe39bb2ee8db173c7e07ba5'] = 'Fecha de creación'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_d79cf3f429596f77db95c65074663a54'] = 'N° de Pedido'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_2a033d36697bb24bfc7ece05545d268e'] = 'N° de Tracking'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ac27812104f966f43d3a60f37a869338'] = 'Descripción rapida'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_78a5eb43deef9a7b5b9ce157b9d52ac4'] = 'Pecio pagado'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_9acb44549b41563697bb490144ec6258'] = 'Estado'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_1e6e6626b6e59276b14112ebc34c5d49'] = 'Fecha de Salida'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_c20456384feb648b4692b700ec570d42'] = 'Plazo'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_5c5c8fc67b523e638e0a904d61651f2d'] = 'Hora de Inicio'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8e659923776b8706dbf4636c408e987c'] = 'Hora máxima de Entrega'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ba402b48292a61e4d82f85eeaa0904dc'] = 'Fecha de Entrega'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_7c7f9f48d29519e8cb47ac606a431a65'] = 'Hora de Entrega'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_617283f39e91b6ead659cef3c722cabc'] = 'Preferencias de envío'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_11d783488db0c358bd9077a2e1a250e7'] = 'Su plazo de preparación de pedidos '; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_ffe181130430aff6386df37df36347f8'] = 'inmediato ( < 20 mn )'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_a3cb1f2ebeda6fa36b27598f1d096f60'] = 'medio dia'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_849490640e65410418220e5c179a1477'] = 'un dia'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44fdec47036f482b68b748f9d786801b'] = 'dias'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_6749e3e07aeb12081dc32e581ffcf463'] = 'DEJALA propondrá la entrega al cabo del plazo de preparación'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_48b4a9d141bcbb3911caa5caf4b750b2'] = 'Proponer a sus clientes franjas horarias sobre '; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_7877adcb96eb8221c075f0008093bbf7'] = 'dias'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_b4f86cbc11cb9565374c08c61372f3ad'] = 'Franja en dias dentro de la cual su cliente podrá elejir ser entregado. De forma general, DEJALA vendrá recojer el pedido el dia de la entrega.'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44a33a70398318da91b789b33152dafa'] = 'Activar si fuera de stock'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_767cd99c2f2b9fb9e5aa531c37b45f87'] = 'Permite a los clientes elegir Dejala, incluso si un producto está agotadok (El cliente elegirá la fecha de la entrega cuando su pedido esté listo)'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{dejala}prestashop>dejala_header_c45abd6f2b5f3b3a954c97f008ccb52c'] = 'Entregue sus pedidos por mensajero con '; +$_MODULE['<{dejala}prestashop>dejala_header_20e846b603a0b7f1c00b1fc457308fb7'] = 'DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_21e71170be5450c6380d7a9fc0ba51c3'] = '¿ Nuevo ?'; +$_MODULE['<{dejala}prestashop>dejala_home_07965cce4ec6247bd57783dff0af1657'] = 'Su nombre de tienda :'; +$_MODULE['<{dejala}prestashop>dejala_home_558f162b01a3d6d31865a1ca91a03d57'] = 'Escoja su País :'; +$_MODULE['<{dejala}prestashop>dejala_home_0309a6c666a7a803fdb9db95de71cf01'] = 'Francia'; +$_MODULE['<{dejala}prestashop>dejala_home_907eba32d950bfab68227fd7ea22999b'] = 'España'; +$_MODULE['<{dejala}prestashop>dejala_home_a999205c014634072764fe3fadc4f4ca'] = 'Elija su login :'; +$_MODULE['<{dejala}prestashop>dejala_home_a7e4228de9b12575b0cd88c4cf0f54f9'] = 'Elija su contraseña :'; +$_MODULE['<{dejala}prestashop>dejala_home_0ba7583639a274c434bbe6ef797115a4'] = 'Registrarse'; +$_MODULE['<{dejala}prestashop>dejala_home_72429bbc9acf8e6fcf6132ac1fa20d57'] = 'Ya dispongo de una cuenta para mi tienda :'; +$_MODULE['<{dejala}prestashop>dejala_home_051672911a3f1f05efba78a553ef6fe2'] = 'Login :'; +$_MODULE['<{dejala}prestashop>dejala_home_b341a59d5636ed3d6a819137495b08a0'] = 'Contraseña :'; +$_MODULE['<{dejala}prestashop>dejala_home_e5b47edd743751a81819b7f421639303'] = 'Apúntarse'; +$_MODULE['<{dejala}prestashop>dejala_home_853fe2c3719fab6d1dde555eb536f649'] = 'DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_02d222897fd57cbc8154be7b2c41e2ff'] = 'Para recordar'; +$_MODULE['<{dejala}prestashop>dejala_home_3a40880c274dd353056ce584940d1ca8'] = 'El nombre de su tienda en'; +$_MODULE['<{dejala}prestashop>dejala_home_55724d105b50b04063a21fba83236de6'] = 'Su login es'; +$_MODULE['<{dejala}prestashop>dejala_home_bbb658f348426b60b3395d5357225112'] = 'Está en modo'; +$_MODULE['<{dejala}prestashop>dejala_home_c8ab370eeab3cf4011e25fa953031e77'] = 'SIMULACIÓN en la plataforma de Test'; +$_MODULE['<{dejala}prestashop>dejala_home_68279960d4eaab19115d276486e1e1d7'] = 'PRODUCCIÓN en la plataforma real'; +$_MODULE['<{dejala}prestashop>dejala_home_64baa4dba37ddc4207a777ac53565f06'] = 'Bascular al modo SIMULACIÓN'; +$_MODULE['<{dejala}prestashop>dejala_home_a0802ed7a4e243cc01699e44e0b0b33b'] = 'Bascular al modo PRODUCCIÓN'; +$_MODULE['<{dejala}prestashop>dejala_home_104cdbe9fcaa62064ecc718b647c2929'] = 'Su péticion para bascular al modo real se está procesando: DEJALA entrará en contacto con usted para finalizar el trámite.'; +$_MODULE['<{dejala}prestashop>dejala_home_1ccd621bb658777957a0c0ae95b97fc6'] = 'Solicitar DEJALA para crear mi cuenta en producción'; +$_MODULE['<{dejala}prestashop>dejala_home_9c8a7900448628ee2978be9a3945d148'] = 'Su crédito'; +$_MODULE['<{dejala}prestashop>dejala_home_b0ee4c529eda15bdecda8bf189a3c813'] = 'Su crédito virtual (para pruebas en modo simulación)'; +$_MODULE['<{dejala}prestashop>dejala_home_defcb35db6f9bdac29b888bfc07e6386'] = 'euros'; +$_MODULE['<{dejala}prestashop>dejala_home_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Acreditar su cuenta'; +$_MODULE['<{dejala}prestashop>dejala_home_d33b3ef83df48e14035b6927a27a6824'] = 'Dejala NO es visible por los usuarios'; +$_MODULE['<{dejala}prestashop>dejala_home_8ce5717d0efdee714d5c44eb72559943'] = 'Dejala NO es visible por todos los usuarios'; +$_MODULE['<{dejala}prestashop>dejala_home_97f9bae265c399ce4781878d46a5a733'] = 'Dejala es visible únicamente por los sigueintes usuarios:'; +$_MODULE['<{dejala}prestashop>dejala_home_66495952bdab30f6bdc92e318d4f36a6'] = 'Por ej: a@foof.com, b@bar.com'; +$_MODULE['<{dejala}prestashop>dejala_home_e49df857f0f92d5dd2f73b9fa54d7308'] = 'Actualizar la visibilidad'; +$_MODULE['<{dejala}prestashop>dejala_location_ce9142ea2df85cf8ea4dfda7164e7dcf'] = 'Indique la dirección del PUNTO DE SALIDA de las mercancias'; +$_MODULE['<{dejala}prestashop>dejala_location_c58b3ccfae7d8991a1bdf33f275d6007'] = '(sólo lectura en producción)'; +$_MODULE['<{dejala}prestashop>dejala_location_20dfc4f904ba3c650a578c41f87e7053'] = 'Localizar'; +$_MODULE['<{dejala}prestashop>dejala_location_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Empresa'; +$_MODULE['<{dejala}prestashop>dejala_location_dd7bf230fde8d4836917806aff6a6b27'] = 'Dirección (1)'; +$_MODULE['<{dejala}prestashop>dejala_location_783cb853aae6984e51583b3bb80c09d2'] = 'Dirección (2)'; +$_MODULE['<{dejala}prestashop>dejala_location_9b514b51d03075005814a33edc74c958'] = 'Código postal'; +$_MODULE['<{dejala}prestashop>dejala_location_57d056ed0984166336b7879c2af3657f'] = 'Ciudad'; +$_MODULE['<{dejala}prestashop>dejala_location_bcc254b55c4a1babdf1dcb82c207506b'] = 'Teléfono'; +$_MODULE['<{dejala}prestashop>dejala_location_4e186c431f7c016c761c722debb9768e'] = 'Teléfono móvil'; +$_MODULE['<{dejala}prestashop>dejala_location_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Comentarios'; +$_MODULE['<{dejala}prestashop>dejala_location_b17f3f4dcf653a5776792498a9b44d6a'] = 'Guardar'; +$_MODULE['<{dejala}prestashop>dejala_menu_8cf04a9734132302f96da8e113e80ce5'] = 'Inicio'; +$_MODULE['<{dejala}prestashop>dejala_menu_ce5bf551379459c1c61d2a204061c455'] = 'Stock'; +$_MODULE['<{dejala}prestashop>dejala_menu_9aa698f602b1e5694855cee73a683488'] = 'Contactos'; +$_MODULE['<{dejala}prestashop>dejala_menu_77ea79b4b2638f146bf02ea6dc076006'] = 'Casos de entrega'; +$_MODULE['<{dejala}prestashop>dejala_menu_3eb0f1d14d6ec438d91fcfdab94fc1ca'] = 'Opciones de entrega'; +$_MODULE['<{dejala}prestashop>dejala_menu_e16dd6e118732c5d1586d6aba0b62f3a'] = 'Precios'; +$_MODULE['<{dejala}prestashop>dejala_menu_9bbd45bad55cfc620803907f2d8a0217'] = 'Historial de entregas'; +$_MODULE['<{dejala}prestashop>dejala_menu_36d5423bb12a6d74d1d0f0ba09ef47cb'] = 'Parámetros técnicos'; +$_MODULE['<{dejala}prestashop>dejala_menu_35cf95ca41b6d074cfaeac16b0e0906c'] = 'DEJALA PRO'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_845398bc903ec28114a5f9874d83936b'] = 'El stock está abierto :'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_2084c04f7a380a68b653e5fc82d352f0'] = 'De'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_7fc56270e7a70fa81a5935b72eacbe29'] = 'A'; +$_MODULE['<{dejala}prestashop>dejala_processes_237527ad3e0c9d87f072f2ac3a873dc8'] = 'Cómo actuar y con quien contactar en los casos siguientes '; +$_MODULE['<{dejala}prestashop>dejala_processes_0f516eb68a85aae932001976c51dee2f'] = 'No dude en modificar los procedimientos siguientes según sus imperativos comerciales y/o logísticos !'; +$_MODULE['<{dejala}prestashop>dejala_processes_dbfdb39c2251ff72f42f7078ab347611'] = 'Dirección del cliente erronea o no encontrada'; +$_MODULE['<{dejala}prestashop>dejala_processes_b1da17cfc7c9a051fe4ce45bf1dd1ace'] = 'Cliente ausente al momento de la entrega'; +$_MODULE['<{dejala}prestashop>dejala_processes_3ab0370c6e7c3d0ea1cd540e7afacc9a'] = 'Entrega denegada por el cliente'; +$_MODULE['<{dejala}prestashop>dejala_processes_138a10902b1fec08bcf2d9f5a6f4b02b'] = 'Precauciones especiales con sus paquetes (fragilidad, embalaje, etc)'; +$_MODULE['<{dejala}prestashop>dejala_processes_b17f3f4dcf653a5776792498a9b44d6a'] = 'Guardar'; +$_MODULE['<{dejala}prestashop>dejala_products_aa83582f6ce84345c97815de714e6ebd'] = 'Puede ajustar sur margen (ganar sobre el envio o tomar en cargo todo o parte del costo de envio) '; +$_MODULE['<{dejala}prestashop>dejala_products_49ee3087348e8d44e1feda1917443987'] = 'Destino del envio'; +$_MODULE['<{dejala}prestashop>dejala_products_26160d42b371fb091c142cb8cfa09c34'] = 'Precio que DEJALA le factura por el envio'; +$_MODULE['<{dejala}prestashop>dejala_products_f8ca05a1d72f37501747657deecdd15c'] = 'Su margen sobre el envio (IVA_incluido)'; +$_MODULE['<{dejala}prestashop>dejala_products_e6f254c2f6e55725e99e1e6dfd6d9caa'] = 'Costo final del envio (añadido a la carrito)'; +$_MODULE['<{dejala}prestashop>dejala_products_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descripción de la prestación'; +$_MODULE['<{dejala}prestashop>dejala_products_1cdad1a5f8e5d09be270415e44c0f039'] = 'Compra sin IVA'; +$_MODULE['<{dejala}prestashop>dejala_products_ecef91ba37ffc5f5294ea50efee7c6a2'] = 'Compra IVA inc.'; +$_MODULE['<{dejala}prestashop>dejala_products_765a24c102d9a0b03eb03c77e90a9144'] = 'Venta sin IVA'; +$_MODULE['<{dejala}prestashop>dejala_products_8588719c33b27bd80ae45cc533117c00'] = 'Venta IVA inc.'; +$_MODULE['<{dejala}prestashop>dejala_products_efeb369cccbd560588a756610865664c'] = 'En'; +$_MODULE['<{dejala}prestashop>dejala_products_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_products_b17f3f4dcf653a5776792498a9b44d6a'] = 'Guardar'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b44c4d973c20b84bad66d243b215ef37'] = 'Estados que generan automaticamente un pedido de entrega por DEJALA '; +$_MODULE['<{dejala}prestashop>dejala_technical_options_a296002220093a4833752a3cf94f07d0'] = 'Cuando un pedido de entrega se valida, se le carga el coste a su cuenta DEJALA.'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b17f3f4dcf653a5776792498a9b44d6a'] = 'Guardar'; +$_MODULE['<{dejala}prestashop>dejala_timetable_193993f964d2d4df4b1484227c1626b6'] = 'Elegir el día de entrega'; +$_MODULE['<{dejala}prestashop>dejala_timetable_26903e0f192163f4a0957c0b185edf71'] = 'Elegir la hora de entrega'; diff --git a/modules/dejala/fr.php b/modules/dejala/fr.php new file mode 100644 index 000000000..d1b7ef545 --- /dev/null +++ b/modules/dejala/fr.php @@ -0,0 +1,187 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dejala}prestashop>dejala_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Dimanche'; +$_MODULE['<{dejala}prestashop>dejala_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lundi'; +$_MODULE['<{dejala}prestashop>dejala_5792315f09a5d54fb7e3d066672b507f'] = 'Mardi'; +$_MODULE['<{dejala}prestashop>dejala_796c163589f295373e171842f37265d5'] = 'Mercredi'; +$_MODULE['<{dejala}prestashop>dejala_78ae6f0cd191d25147e252dc54768238'] = 'Jeudi'; +$_MODULE['<{dejala}prestashop>dejala_c33b138a163847cdb6caeeb7c9a126b4'] = 'Vendredi'; +$_MODULE['<{dejala}prestashop>dejala_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samedi'; +$_MODULE['<{dejala}prestashop>dejala_9902522831a16af239ba868918f984c6'] = 'dejala.com : le transport par coursier'; +$_MODULE['<{dejala}prestashop>dejala_69a226fe54256a93edb693bc97a7bcb5'] = 'Envoie les demandes de livraisons vers dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_f66e08578735b3cde28a2d8215b68a52'] = 'Le module nécessite l\'extension php Dejala cURL pour fonctionner correctement. Merci d\'installer l\'extension php \"curl \"'; +$_MODULE['<{dejala}prestashop>dejala_0e334c81db8c621e16d82618aaf746ab'] = 'Entrez votre nom d\'utilisateur'; +$_MODULE['<{dejala}prestashop>dejala_2a04cf556c49e32d4b4c46fd9b8bade5'] = 'Entrez votre mot de passe'; +$_MODULE['<{dejala}prestashop>dejala_483cf1f6e275faa3c29ff20ba6e4407f'] = 'Merci de bien vouloir sélectionner un pays'; +$_MODULE['<{dejala}prestashop>dejala_2485b5c3212614c367f862a8e46f4d11'] = 'Le nom d\'utilisateur doit être une adresse email valide'; +$_MODULE['<{dejala}prestashop>dejala_dd189cdaa73e88a19f495a0d6c49a61b'] = 'Entrez le nom de votre boutique'; +$_MODULE['<{dejala}prestashop>dejala_4876f72a0b3d7f46de2b201ab02cd0a7'] = 'n\'est pas une marge acceptée'; +$_MODULE['<{dejala}prestashop>dejala_ad5ee5e5c2989c1e72c586a9f8121716'] = 'Une erreur est survenue lors de l\'authentification de votre compte sur Dejala.com. Vos informations d\'authentification n\'ont pas été reconnues.'; +$_MODULE['<{dejala}prestashop>dejala_23e0f5b7cc6e26112230c098b893944a'] = 'Impossible de réaliser cette action'; +$_MODULE['<{dejala}prestashop>dejala_6bd82dd0c6115429b03dd84828d6ccb2'] = 'Ce login n\'est pas disponible. Merci de choisir un autre login.'; +$_MODULE['<{dejala}prestashop>dejala_0aec12d0e7c8784012ee74606648d625'] = 'Serveur Dejala inaccessible depuis votre serveur Prestashop. Ceci est certainement dû à une limite imposée par votre hébergeur. Contactez le support technique de ce dernier pour lui demander si votre serveur est autorisé à effectuer des connexions HTTP sortantes.'; +$_MODULE['<{dejala}prestashop>dejala_f46fe05842135a72df96c3409cf00683'] = 'Une erreur est survenue lors de la mise à jour de l\'adresse'; +$_MODULE['<{dejala}prestashop>dejala_2f63af6e20f182573774b785515ccb95'] = 'Une erreur est survenue lors de la mise à jour des contacts'; +$_MODULE['<{dejala}prestashop>dejala_3a29c6eb6abefd3d629290756168d892'] = 'Une erreur est survenue lors de la mise à jour des imprévus'; +$_MODULE['<{dejala}prestashop>dejala_5f010efe1c8e6cb195205cbf864044aa'] = 'Une erreur est survenue lors de la mise à jour des produits'; +$_MODULE['<{dejala}prestashop>dejala_004ac360e91b3dcf50a19a0fd09e3826'] = 'Vous devez fournir au moins une adresse email pour restreindre la visibilité du module Dejala sur votre boutique'; +$_MODULE['<{dejala}prestashop>dejala_c888438d14855d7d96a2724ee9c306bd'] = 'Modifications prises en compte'; +$_MODULE['<{dejala}prestashop>dejala_dfa53d8241c9f6908e669371b50e95f3'] = 'Ce module a besoin de l\'extension php \"cURL\" pour fonctionner correctement. Merci de bien vouloir installer l\'extension php \"cURL\"'; +$_MODULE['<{dejala}prestashop>dejala_4c7d16a1e83bcbfd9b33e95f8e90a625'] = 'Une erreur est survenue lors de l\'authentification de votre compte sur Dejala.com. Ceci peut être du à une erreur réseau ou à un problème de plate-forme. Réessayez plus tard ou contactez Dejala.com.'; +$_MODULE['<{dejala}prestashop>dejala_94939d114a8c65173b70b6e01aad11c0'] = 'Une erreur est survenue lors de la récupération des informations. Réessayez plus tard ou contactez Dejala.com.'; +$_MODULE['<{dejala}prestashop>dejala_41d211dd68bf0f87cf3181b0c8dac6e7'] = 'Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_3d8764621d6076807b0d60cfcadb7213'] = 'Quand vous voulez... Par coursier'; +$_MODULE['<{dejala}prestashop>dejala_627db4c965627fb7f03682dbbc43a4a1'] = 'Je choisirai mon heure de livraison quand mon colis sera prêt.'; +$_MODULE['<{dejala}prestashop>dejala_07e9ea0147aee652244a280da00efb5a'] = 'Livraison souhaitée le'; +$_MODULE['<{dejala}prestashop>dejala_47a4dfe5ab79feb7884fa57786ea587c'] = 'à partir de'; +$_MODULE['<{dejala}prestashop>dejala_ba93cc89ba75ee6e74699a49a69c0600'] = 'Livraison dont la date doit être fixée avec le client.'; +$_MODULE['<{dejala}prestashop>dejala_a240fa27925a635b08dc28c9e4f9216d'] = 'Commande'; +$_MODULE['<{dejala}prestashop>dejala_296a91ebe13e861efa9bd0f74a927353'] = 'Commande envoyée à Dejala'; +$_MODULE['<{dejala}prestashop>dejala_carrier_21034ae6d01a83e702839a72ba8a77b0'] = 'HT'; +$_MODULE['<{dejala}prestashop>dejala_carrier_1f87346a16cf80c372065de3c54c86d9'] = 'TTC'; +$_MODULE['<{dejala}prestashop>dejala_carrier_e7a6ca4e744870d455a57b644f696457'] = 'Gratuit !'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_21034ae6d01a83e702839a72ba8a77b0'] = 'HT'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_1f87346a16cf80c372065de3c54c86d9'] = 'TTC'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_e7a6ca4e744870d455a57b644f696457'] = 'Gratuit !'; +$_MODULE['<{dejala}prestashop>dejala_contacts_a766dcf63862aaaa1625a45169aeb37a'] = 'Gérant de la Boutique (signataire)'; +$_MODULE['<{dejala}prestashop>dejala_contacts_4e140ba723a03baa6948340bf90e2ef6'] = 'Nom'; +$_MODULE['<{dejala}prestashop>dejala_contacts_d2cacc542d8dd31bd89f8defed1b55ad'] = 'Prénom'; +$_MODULE['<{dejala}prestashop>dejala_contacts_673ae02fffb72f0fe68a66f096a01347'] = 'Tél'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7a31464d87d555a1d5a7d2afdeb64d4e'] = 'Mobile'; +$_MODULE['<{dejala}prestashop>dejala_contacts_01401fe9a93df81d28637e5218597b76'] = 'E-Mail'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7e2121a0b71ccc33c5eeaf11999fdbcd'] = 'Contact du Stock (point de départ)'; +$_MODULE['<{dejala}prestashop>dejala_contacts_23e44d356bfc0d17f904cb743b4d247c'] = 'Contact Administratif et Financier'; +$_MODULE['<{dejala}prestashop>dejala_contacts_527a0a71d5684695421ec3375ec6dba8'] = 'Contact Expédition (suivi des livraisons)'; +$_MODULE['<{dejala}prestashop>dejala_contacts_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_9c8a7900448628ee2978be9a3945d148'] = 'Votre solde'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b0ee4c529eda15bdecda8bf189a3c813'] = 'Votre solde fictif (pour la simulation)'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_defcb35db6f9bdac29b888bfc07e6386'] = 'Euros (€)'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Rechargez votre compte'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_642c4a47922246182590d4f3c8304f35'] = 'Liste des dernières commandes'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01abfc750a0c942167651c40d088531d'] = '#'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_67d5168b4f2b5424a3d118ea9ef99372'] = 'Date de la commande'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d79cf3f429596f77db95c65074663a54'] = 'ID de la commande'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2a033d36697bb24bfc7ece05545d268e'] = 'N° de suivi Dejala'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b021df6aac4654c454f46c77646e745f'] = 'Libellé'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_3601146c4e948c32b6424d2c0a7f0118'] = 'Prix payé HT'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ec53a8c4f07baed5d8825072c89799be'] = 'Etat '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Date prise en charge'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Description'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2ca8d70baf21b18878843c02a086e46c'] = 'En '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d98a07f84921b24ee30f86fd8cd85c3c'] = 'de'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01b6e20344b68835c5ed1ddedf20d531'] = 'à'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_427c7fb2385f610d26ea90fff86f9a84'] = 'Exportation en CSV'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_5da618e8e4b89c66fe86e32cdafde142'] = 'De'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_e12167aa0a7698e6ebc92b4ce3909b53'] = 'A '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_a60852f204ed8028c1c58808b746d115'] = 'OK'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8424d087ffe39bb2ee8db173c7e07ba5'] = 'Date de création'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_d79cf3f429596f77db95c65074663a54'] = 'ID commande'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_2a033d36697bb24bfc7ece05545d268e'] = 'N° de suivi Dejala'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ac27812104f966f43d3a60f37a869338'] = 'description courte'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_78a5eb43deef9a7b5b9ce157b9d52ac4'] = 'Prix payé'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_9acb44549b41563697bb490144ec6258'] = 'Etat'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_1e6e6626b6e59276b14112ebc34c5d49'] = 'Date de départ'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_c20456384feb648b4692b700ec570d42'] = 'Délai'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_5c5c8fc67b523e638e0a904d61651f2d'] = 'Heure Début'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8e659923776b8706dbf4636c408e987c'] = 'heure max de Livraison'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ba402b48292a61e4d82f85eeaa0904dc'] = 'Date de Livraison'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_7c7f9f48d29519e8cb47ac606a431a65'] = 'Heure de Livraison'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_617283f39e91b6ead659cef3c722cabc'] = 'Préférences de livraison'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_11d783488db0c358bd9077a2e1a250e7'] = 'Votre temps de préparation de commande'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_ffe181130430aff6386df37df36347f8'] = 'immédiat (< 20 mn)'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_a3cb1f2ebeda6fa36b27598f1d096f60'] = 'une demi-journée'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_849490640e65410418220e5c179a1477'] = 'une journée'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44fdec47036f482b68b748f9d786801b'] = 'journées'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_6749e3e07aeb12081dc32e581ffcf463'] = 'Dejala proposera une livraison à l\'issue du temps de préparation'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_48b4a9d141bcbb3911caa5caf4b750b2'] = 'Proposer à votre client des créneaux sur '; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_7877adcb96eb8221c075f0008093bbf7'] = 'jours'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_b4f86cbc11cb9565374c08c61372f3ad'] = 'C\'est le nombre de jours parmi lesquels votre client pourra choisir d\'être livré. D\'une manière générale, Dejala viendra chercher la commande le jour de la livraison.'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44a33a70398318da91b789b33152dafa'] = 'Actif en hors stock'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_767cd99c2f2b9fb9e5aa531c37b45f87'] = 'Ceci permettra à vos clients de commander un coursier quand un produit est hors stock. Votre client choisira son créneau de livraison quand sa commande sera prête.'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{dejala}prestashop>dejala_header_c45abd6f2b5f3b3a954c97f008ccb52c'] = 'Livrez vos clients par coursier avec '; +$_MODULE['<{dejala}prestashop>dejala_header_20e846b603a0b7f1c00b1fc457308fb7'] = 'DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_21e71170be5450c6380d7a9fc0ba51c3'] = 'Nouveau ? '; +$_MODULE['<{dejala}prestashop>dejala_home_07965cce4ec6247bd57783dff0af1657'] = 'Nom de votre site'; +$_MODULE['<{dejala}prestashop>dejala_home_558f162b01a3d6d31865a1ca91a03d57'] = 'Dans quel pays est votre entrepôt'; +$_MODULE['<{dejala}prestashop>dejala_home_0309a6c666a7a803fdb9db95de71cf01'] = 'France'; +$_MODULE['<{dejala}prestashop>dejala_home_907eba32d950bfab68227fd7ea22999b'] = 'Espagne'; +$_MODULE['<{dejala}prestashop>dejala_home_a999205c014634072764fe3fadc4f4ca'] = 'votre login (votre E-Mail)'; +$_MODULE['<{dejala}prestashop>dejala_home_a7e4228de9b12575b0cd88c4cf0f54f9'] = 'Choisissez un mot de passe sur Dejala'; +$_MODULE['<{dejala}prestashop>dejala_home_0ba7583639a274c434bbe6ef797115a4'] = 's\'inscrire'; +$_MODULE['<{dejala}prestashop>dejala_home_72429bbc9acf8e6fcf6132ac1fa20d57'] = 'je suis déjà inscrit sur DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_051672911a3f1f05efba78a553ef6fe2'] = 'login'; +$_MODULE['<{dejala}prestashop>dejala_home_b341a59d5636ed3d6a819137495b08a0'] = 'mot de passe Dejala'; +$_MODULE['<{dejala}prestashop>dejala_home_e5b47edd743751a81819b7f421639303'] = 's\'identifier'; +$_MODULE['<{dejala}prestashop>dejala_home_853fe2c3719fab6d1dde555eb536f649'] = 'DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_02d222897fd57cbc8154be7b2c41e2ff'] = 'Pour mémoire'; +$_MODULE['<{dejala}prestashop>dejala_home_3a40880c274dd353056ce584940d1ca8'] = 'Le nom de votre magasin est'; +$_MODULE['<{dejala}prestashop>dejala_home_55724d105b50b04063a21fba83236de6'] = 'Votre login (E-Mail) est'; +$_MODULE['<{dejala}prestashop>dejala_home_bbb658f348426b60b3395d5357225112'] = 'Vous êtes en mode'; +$_MODULE['<{dejala}prestashop>dejala_home_c8ab370eeab3cf4011e25fa953031e77'] = 'SIMULATION sur la plateforme de TEST'; +$_MODULE['<{dejala}prestashop>dejala_home_68279960d4eaab19115d276486e1e1d7'] = 'PRODUCTION'; +$_MODULE['<{dejala}prestashop>dejala_home_64baa4dba37ddc4207a777ac53565f06'] = 'passer en mode SIMULATION'; +$_MODULE['<{dejala}prestashop>dejala_home_a0802ed7a4e243cc01699e44e0b0b33b'] = 'passer en mode PRODUCTION'; +$_MODULE['<{dejala}prestashop>dejala_home_104cdbe9fcaa62064ecc718b647c2929'] = 'Votre demande de passage en production est en cours de traitement. DEJALA va vous contacter prochainement pour valider votre activation.'; +$_MODULE['<{dejala}prestashop>dejala_home_1ccd621bb658777957a0c0ae95b97fc6'] = 'je souhaite passer en PRODUCTION'; +$_MODULE['<{dejala}prestashop>dejala_home_9c8a7900448628ee2978be9a3945d148'] = 'Votre solde'; +$_MODULE['<{dejala}prestashop>dejala_home_b0ee4c529eda15bdecda8bf189a3c813'] = 'Votre solde fictif (pour la simulation)'; +$_MODULE['<{dejala}prestashop>dejala_home_defcb35db6f9bdac29b888bfc07e6386'] = 'Euros (€)'; +$_MODULE['<{dejala}prestashop>dejala_home_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Rechargez votre compte'; +$_MODULE['<{dejala}prestashop>dejala_home_d33b3ef83df48e14035b6927a27a6824'] = 'Dejala n\'est PAS visible par vos utilisateurs'; +$_MODULE['<{dejala}prestashop>dejala_home_8ce5717d0efdee714d5c44eb72559943'] = 'Dejala EST visible par tous vos utilisateurs'; +$_MODULE['<{dejala}prestashop>dejala_home_97f9bae265c399ce4781878d46a5a733'] = 'Dejala EST visible UNIQUEMENT par les utilisateurs suivants :'; +$_MODULE['<{dejala}prestashop>dejala_home_66495952bdab30f6bdc92e318d4f36a6'] = '(Par ex: a@foo.com, b@bar.com)'; +$_MODULE['<{dejala}prestashop>dejala_home_e49df857f0f92d5dd2f73b9fa54d7308'] = 'Mettre à jour la visibilité'; +$_MODULE['<{dejala}prestashop>dejala_location_ce9142ea2df85cf8ea4dfda7164e7dcf'] = 'Informations relatives au POINT DE DÉPART des marchandises'; +$_MODULE['<{dejala}prestashop>dejala_location_c58b3ccfae7d8991a1bdf33f275d6007'] = '(lecture seule)'; +$_MODULE['<{dejala}prestashop>dejala_location_20dfc4f904ba3c650a578c41f87e7053'] = 'Localiser'; +$_MODULE['<{dejala}prestashop>dejala_location_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Enseigne'; +$_MODULE['<{dejala}prestashop>dejala_location_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{dejala}prestashop>dejala_location_783cb853aae6984e51583b3bb80c09d2'] = 'Adresse (suite)'; +$_MODULE['<{dejala}prestashop>dejala_location_9b514b51d03075005814a33edc74c958'] = 'Code Postal'; +$_MODULE['<{dejala}prestashop>dejala_location_57d056ed0984166336b7879c2af3657f'] = 'Ville'; +$_MODULE['<{dejala}prestashop>dejala_location_bcc254b55c4a1babdf1dcb82c207506b'] = 'Tél'; +$_MODULE['<{dejala}prestashop>dejala_location_4e186c431f7c016c761c722debb9768e'] = 'Mobile'; +$_MODULE['<{dejala}prestashop>dejala_location_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Commentaire '; +$_MODULE['<{dejala}prestashop>dejala_location_b17f3f4dcf653a5776792498a9b44d6a'] = 'Enregistrer les modifications'; +$_MODULE['<{dejala}prestashop>dejala_menu_8cf04a9734132302f96da8e113e80ce5'] = 'Accueil'; +$_MODULE['<{dejala}prestashop>dejala_menu_ce5bf551379459c1c61d2a204061c455'] = 'Stock'; +$_MODULE['<{dejala}prestashop>dejala_menu_9aa698f602b1e5694855cee73a683488'] = 'Contacts'; +$_MODULE['<{dejala}prestashop>dejala_menu_77ea79b4b2638f146bf02ea6dc076006'] = 'Gestion des imprévus'; +$_MODULE['<{dejala}prestashop>dejala_menu_3eb0f1d14d6ec438d91fcfdab94fc1ca'] = 'Options de livraison'; +$_MODULE['<{dejala}prestashop>dejala_menu_e16dd6e118732c5d1586d6aba0b62f3a'] = 'Tarifs'; +$_MODULE['<{dejala}prestashop>dejala_menu_9bbd45bad55cfc620803907f2d8a0217'] = 'Historique de livraison'; +$_MODULE['<{dejala}prestashop>dejala_menu_36d5423bb12a6d74d1d0f0ba09ef47cb'] = 'Paramètres techniques'; +$_MODULE['<{dejala}prestashop>dejala_menu_35cf95ca41b6d074cfaeac16b0e0906c'] = 'DEJALA PRO'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_845398bc903ec28114a5f9874d83936b'] = 'Le stock est ouvert :'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_2084c04f7a380a68b653e5fc82d352f0'] = 'De'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_7fc56270e7a70fa81a5935b72eacbe29'] = 'A'; +$_MODULE['<{dejala}prestashop>dejala_processes_237527ad3e0c9d87f072f2ac3a873dc8'] = 'Conduite à tenir et personnes à prévenir dans les cas suivants '; +$_MODULE['<{dejala}prestashop>dejala_processes_0f516eb68a85aae932001976c51dee2f'] = 'N\'hésitez pas à modifier les procédures ci-dessous en fonction de vos impératifs commerciaux ou logistiques.'; +$_MODULE['<{dejala}prestashop>dejala_processes_dbfdb39c2251ff72f42f7078ab347611'] = 'L\'adresse de votre client est erronnée ou introuvable'; +$_MODULE['<{dejala}prestashop>dejala_processes_b1da17cfc7c9a051fe4ce45bf1dd1ace'] = 'Votre client est absent au moment de la livraison'; +$_MODULE['<{dejala}prestashop>dejala_processes_3ab0370c6e7c3d0ea1cd540e7afacc9a'] = 'Votre client refuse la livraison'; +$_MODULE['<{dejala}prestashop>dejala_processes_138a10902b1fec08bcf2d9f5a6f4b02b'] = 'Précautions particulières à prendre avec vos colis (fragilité, packaging, etc)'; +$_MODULE['<{dejala}prestashop>dejala_processes_b17f3f4dcf653a5776792498a9b44d6a'] = 'Enregistrer ces modifications'; +$_MODULE['<{dejala}prestashop>dejala_products_aa83582f6ce84345c97815de714e6ebd'] = 'Vous pouvez ajuster votre marge (gagner sur la livraison ou prendre en charge tout ou partie du coût de livraison) '; +$_MODULE['<{dejala}prestashop>dejala_products_49ee3087348e8d44e1feda1917443987'] = 'Destination de la livraison'; +$_MODULE['<{dejala}prestashop>dejala_products_26160d42b371fb091c142cb8cfa09c34'] = 'Prix d\'achat de la livraison à DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_products_f8ca05a1d72f37501747657deecdd15c'] = 'Votre marge TTC sur la livraison'; +$_MODULE['<{dejala}prestashop>dejala_products_e6f254c2f6e55725e99e1e6dfd6d9caa'] = 'Frais d\'expédition (ajoutés au panier)'; +$_MODULE['<{dejala}prestashop>dejala_products_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Description de la prestation'; +$_MODULE['<{dejala}prestashop>dejala_products_1cdad1a5f8e5d09be270415e44c0f039'] = 'achat HT'; +$_MODULE['<{dejala}prestashop>dejala_products_ecef91ba37ffc5f5294ea50efee7c6a2'] = 'achat TTC'; +$_MODULE['<{dejala}prestashop>dejala_products_765a24c102d9a0b03eb03c77e90a9144'] = 'vente HT'; +$_MODULE['<{dejala}prestashop>dejala_products_8588719c33b27bd80ae45cc533117c00'] = 'vente TTC'; +$_MODULE['<{dejala}prestashop>dejala_products_efeb369cccbd560588a756610865664c'] = 'Créneau de '; +$_MODULE['<{dejala}prestashop>dejala_products_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_products_b17f3f4dcf653a5776792498a9b44d6a'] = 'Enregistrer les modifications'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b44c4d973c20b84bad66d243b215ef37'] = 'Liste des statuts qui valident automatiquement la commande de la course à DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_a296002220093a4833752a3cf94f07d0'] = 'Lorsqu\'une commande de course est validée, votre compte DEJALA est débité du montant de la course.'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mise à jour des statuts'; +$_MODULE['<{dejala}prestashop>dejala_timetable_193993f964d2d4df4b1484227c1626b6'] = 'Choisissez le jour de la livraison'; +$_MODULE['<{dejala}prestashop>dejala_timetable_26903e0f192163f4a0957c0b185edf71'] = 'Choisissez l\'heure de la livraison'; diff --git a/modules/dejala/google.gif b/modules/dejala/google.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24a14a90921f6b698df98d4c7135dfc7d97dd70 GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGsZi0M!5h025YktnbGo08gz|s<y&cbG#f{vF-o%042RGw?Na` z`3n}L!p{B&W9WR3$9kmJzuxe~+v6xEi_R1oBs#H7v^)R*|F6>e6)LJGTgxdhbmjK_ zMs&&qHnH6p5{Zx56(4|an&}rilgut6O|?=0B9{06|II1@97(Xv-1EWp{}VCAATGs1 zZrlI$|6+ux-Ru7rKfl}>0A+>P(kKrxV7L=3pw=KSftlYiH?h#=|Jx-R4l2v(|NlI- zM9~ljA^8LV2LS&7EC2ui01yBW000J;zy_%@s0@w1iZbEzH7wAmR62TEdN5ppvg*_V z5a{W7P;pkU-jyNJK!4VmNG(l8ptL7Wq%cjTV-_J4E`L&R7BvQjQXWqkD2!1zPc0>W zP$mZvIyxy90#6SJ4hK;TIT#cl7CTQHEDH>nP&yz4786!55(^(276%6x0JwP;CMFvN Y5;iL_JSZ=~u98zbP1)MpJ~BZ7JC9qMJpcdz literal 0 HcmV?d00001 diff --git a/modules/dejala/install.sql b/modules/dejala/install.sql new file mode 100644 index 000000000..a8241a497 --- /dev/null +++ b/modules/dejala/install.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_dejala_cart` ( + `id_cart` int(10) unsigned NOT NULL, + `id_dejala_product` int(10) unsigned NOT NULL, + `shipping_date` int(11) NULL DEFAULT NULL, + `id_delivery` int(11) NULL DEFAULT NULL, + `mode` varchar(5) NULL DEFAULT 'TEST', + `cart_date_upd` datetime DEFAULT '0000-00-00 00:00:00', + `delivery_price` float DEFAULT NULL, + PRIMARY KEY (`id_cart`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; diff --git a/modules/dejala/it.php b/modules/dejala/it.php new file mode 100644 index 000000000..ebdb301eb --- /dev/null +++ b/modules/dejala/it.php @@ -0,0 +1,189 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dejala}prestashop>dejala_carrier_21034ae6d01a83e702839a72ba8a77b0'] = '(tasse escl.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_1f87346a16cf80c372065de3c54c86d9'] = '(tasse incl.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_e7a6ca4e744870d455a57b644f696457'] = 'Gratis!'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_21034ae6d01a83e702839a72ba8a77b0'] = '(tasse escl.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_1f87346a16cf80c372065de3c54c86d9'] = '(tasse incl.)'; +$_MODULE['<{dejala}prestashop>dejala_carrier_nostock_e7a6ca4e744870d455a57b644f696457'] = 'Gratis!'; +$_MODULE['<{dejala}prestashop>dejala_contacts_a766dcf63862aaaa1625a45169aeb37a'] = 'Proprietario negozio'; +$_MODULE['<{dejala}prestashop>dejala_contacts_4e140ba723a03baa6948340bf90e2ef6'] = 'Nome:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_d2cacc542d8dd31bd89f8defed1b55ad'] = 'Nome:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_673ae02fffb72f0fe68a66f096a01347'] = 'Telefono:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7a31464d87d555a1d5a7d2afdeb64d4e'] = 'Cellulare:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_01401fe9a93df81d28637e5218597b76'] = 'E-Mail:'; +$_MODULE['<{dejala}prestashop>dejala_contacts_7e2121a0b71ccc33c5eeaf11999fdbcd'] = 'Contatto controllo magazzino'; +$_MODULE['<{dejala}prestashop>dejala_contacts_23e44d356bfc0d17f904cb743b4d247c'] = 'Contatto Amministrazione '; +$_MODULE['<{dejala}prestashop>dejala_contacts_527a0a71d5684695421ec3375ec6dba8'] = 'Contatto Manutenzione del sito web '; +$_MODULE['<{dejala}prestashop>dejala_contacts_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_9c8a7900448628ee2978be9a3945d148'] = 'Il tuo credito'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b0ee4c529eda15bdecda8bf189a3c813'] = 'Il tuo credito virtuale (come test)'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_defcb35db6f9bdac29b888bfc07e6386'] = 'euro'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Accredita il tuo account'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_642c4a47922246182590d4f3c8304f35'] = 'Elenco delle ultime consegne'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01abfc750a0c942167651c40d088531d'] = 'n.'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_67d5168b4f2b5424a3d118ea9ef99372'] = 'Creazione'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d79cf3f429596f77db95c65074663a54'] = 'ID ordine'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2a033d36697bb24bfc7ece05545d268e'] = 'n. controllo ordine'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b021df6aac4654c454f46c77646e745f'] = 'Etichetta'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_3601146c4e948c32b6424d2c0a7f0118'] = 'Prezzo'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Spedizione'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descrizione'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2ca8d70baf21b18878843c02a086e46c'] = 'In'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_d98a07f84921b24ee30f86fd8cd85c3c'] = 'da'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_01b6e20344b68835c5ed1ddedf20d531'] = 'a'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_427c7fb2385f610d26ea90fff86f9a84'] = 'Esportazione in Csv '; +$_MODULE['<{dejala}prestashop>dejala_deliveries_5da618e8e4b89c66fe86e32cdafde142'] = 'Da'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_e12167aa0a7698e6ebc92b4ce3909b53'] = 'Per'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_a60852f204ed8028c1c58808b746d115'] = 'Ok'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8424d087ffe39bb2ee8db173c7e07ba5'] = 'data creazione'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_d79cf3f429596f77db95c65074663a54'] = 'ID ordine'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_2a033d36697bb24bfc7ece05545d268e'] = 'n. controllo ordine'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ac27812104f966f43d3a60f37a869338'] = 'descrizione breve'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_78a5eb43deef9a7b5b9ce157b9d52ac4'] = 'prezzo'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_9acb44549b41563697bb490144ec6258'] = 'stato'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_1e6e6626b6e59276b14112ebc34c5d49'] = 'data consegna'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_c20456384feb648b4692b700ec570d42'] = 'limite tempo'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_5c5c8fc67b523e638e0a904d61651f2d'] = 'inizio spedizione'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_8e659923776b8706dbf4636c408e987c'] = 'fine spedizione'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_ba402b48292a61e4d82f85eeaa0904dc'] = 'data consegna'; +$_MODULE['<{dejala}prestashop>dejala_deliveries_csv_7c7f9f48d29519e8cb47ac606a431a65'] = 'ora consegna'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_617283f39e91b6ead659cef3c722cabc'] = 'Preferenze spedizione'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_11d783488db0c358bd9077a2e1a250e7'] = 'Proponi spedizione'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_ffe181130430aff6386df37df36347f8'] = 'immediatamente'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_a3cb1f2ebeda6fa36b27598f1d096f60'] = 'mezza giornata'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_849490640e65410418220e5c179a1477'] = 'un giorno'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44fdec47036f482b68b748f9d786801b'] = 'giorni'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_6749e3e07aeb12081dc32e581ffcf463'] = 'dopo l\'ordinazione'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_48b4a9d141bcbb3911caa5caf4b750b2'] = 'Visualizza'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_7877adcb96eb8221c075f0008093bbf7'] = 'date'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_b4f86cbc11cb9565374c08c61372f3ad'] = 'giorni nell\'interfaccia di selezione della fascia oraria'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_44a33a70398318da91b789b33152dafa'] = 'Mantenere Dejala attivo quando il carrello è non disponibile'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_767cd99c2f2b9fb9e5aa531c37b45f87'] = 'Abilitare i clienti a scegliere Dejala anche se un prodotto è esaurito (il cliente sceglierà la data della consegna quando l\'ordine sarà pronto)'; +$_MODULE['<{dejala}prestashop>dejala_delivery_options_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{dejala}prestashop>dejala_header_c45abd6f2b5f3b3a954c97f008ccb52c'] = 'Spedisci i tuoi ordini tramite corriere con'; +$_MODULE['<{dejala}prestashop>dejala_header_20e846b603a0b7f1c00b1fc457308fb7'] = 'DEJALA'; +$_MODULE['<{dejala}prestashop>dejala_home_21e71170be5450c6380d7a9fc0ba51c3'] = 'Sei nuovo su Dejala.fr?'; +$_MODULE['<{dejala}prestashop>dejala_home_07965cce4ec6247bd57783dff0af1657'] = 'Il nome del tuo negozio:'; +$_MODULE['<{dejala}prestashop>dejala_home_558f162b01a3d6d31865a1ca91a03d57'] = 'Seleziona il tuo paese:'; +$_MODULE['<{dejala}prestashop>dejala_home_0309a6c666a7a803fdb9db95de71cf01'] = 'Francia'; +$_MODULE['<{dejala}prestashop>dejala_home_907eba32d950bfab68227fd7ea22999b'] = 'Spagna'; +$_MODULE['<{dejala}prestashop>dejala_home_a999205c014634072764fe3fadc4f4ca'] = 'Scegli il tuo login:'; +$_MODULE['<{dejala}prestashop>dejala_home_a7e4228de9b12575b0cd88c4cf0f54f9'] = 'Scegli la tua password:'; +$_MODULE['<{dejala}prestashop>dejala_home_0ba7583639a274c434bbe6ef797115a4'] = 'Registrati'; +$_MODULE['<{dejala}prestashop>dejala_home_72429bbc9acf8e6fcf6132ac1fa20d57'] = 'Ho già un account per il mio negozio:'; +$_MODULE['<{dejala}prestashop>dejala_home_051672911a3f1f05efba78a553ef6fe2'] = 'Login:'; +$_MODULE['<{dejala}prestashop>dejala_home_b341a59d5636ed3d6a819137495b08a0'] = 'Password:'; +$_MODULE['<{dejala}prestashop>dejala_home_e5b47edd743751a81819b7f421639303'] = 'Identificati'; +$_MODULE['<{dejala}prestashop>dejala_home_853fe2c3719fab6d1dde555eb536f649'] = 'Dejala.fr'; +$_MODULE['<{dejala}prestashop>dejala_home_02d222897fd57cbc8154be7b2c41e2ff'] = 'Come promemoria'; +$_MODULE['<{dejala}prestashop>dejala_home_3a40880c274dd353056ce584940d1ca8'] = 'Il tuo nome negozio è'; +$_MODULE['<{dejala}prestashop>dejala_home_55724d105b50b04063a21fba83236de6'] = 'Il tuo login è'; +$_MODULE['<{dejala}prestashop>dejala_home_bbb658f348426b60b3395d5357225112'] = 'Sei nella modalità'; +$_MODULE['<{dejala}prestashop>dejala_home_c8ab370eeab3cf4011e25fa953031e77'] = 'piattaforma di test'; +$_MODULE['<{dejala}prestashop>dejala_home_68279960d4eaab19115d276486e1e1d7'] = 'piattaforma di produzione'; +$_MODULE['<{dejala}prestashop>dejala_home_64baa4dba37ddc4207a777ac53565f06'] = 'Passa alla modalità di test'; +$_MODULE['<{dejala}prestashop>dejala_home_a0802ed7a4e243cc01699e44e0b0b33b'] = 'Passa alla modalità di produzione'; +$_MODULE['<{dejala}prestashop>dejala_home_104cdbe9fcaa62064ecc718b647c2929'] = 'La tua richiesta di modalità live è in fase di elaborazione: Dejala.fr ti contatterà per completare la registrazione.'; +$_MODULE['<{dejala}prestashop>dejala_home_1ccd621bb658777957a0c0ae95b97fc6'] = 'Andare live: chiedi a Dejala.fr di creare account in produzione.'; +$_MODULE['<{dejala}prestashop>dejala_home_9c8a7900448628ee2978be9a3945d148'] = 'Il tuo credito'; +$_MODULE['<{dejala}prestashop>dejala_home_b0ee4c529eda15bdecda8bf189a3c813'] = 'Il tuo credito virtuale (come test)'; +$_MODULE['<{dejala}prestashop>dejala_home_defcb35db6f9bdac29b888bfc07e6386'] = 'euro'; +$_MODULE['<{dejala}prestashop>dejala_home_c2b55c1a6a9880bf1d7cba1914a6da56'] = 'Accredita il tuo account'; +$_MODULE['<{dejala}prestashop>dejala_home_d33b3ef83df48e14035b6927a27a6824'] = 'Dejala NON è visibile a nessun utente'; +$_MODULE['<{dejala}prestashop>dejala_home_8ce5717d0efdee714d5c44eb72559943'] = 'Dejala E\' visibile a tutti gli utenti'; +$_MODULE['<{dejala}prestashop>dejala_home_97f9bae265c399ce4781878d46a5a733'] = 'Dejala E\' visibile SOLO per i seguenti utenti '; +$_MODULE['<{dejala}prestashop>dejala_home_66495952bdab30f6bdc92e318d4f36a6'] = '(Es: a@foo.com, b@bar.com)'; +$_MODULE['<{dejala}prestashop>dejala_home_e49df857f0f92d5dd2f73b9fa54d7308'] = 'Aggiorna la visibilità di Dejala '; +$_MODULE['<{dejala}prestashop>dejala_location_ce9142ea2df85cf8ea4dfda7164e7dcf'] = 'Si prega di specificare l\'indirizzo del tuo magazzino'; +$_MODULE['<{dejala}prestashop>dejala_location_c58b3ccfae7d8991a1bdf33f275d6007'] = '(solo lettura)'; +$_MODULE['<{dejala}prestashop>dejala_location_20dfc4f904ba3c650a578c41f87e7053'] = 'Individua'; +$_MODULE['<{dejala}prestashop>dejala_location_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Società'; +$_MODULE['<{dejala}prestashop>dejala_location_dd7bf230fde8d4836917806aff6a6b27'] = 'Indirizzo'; +$_MODULE['<{dejala}prestashop>dejala_location_783cb853aae6984e51583b3bb80c09d2'] = 'Indirizzo (2)'; +$_MODULE['<{dejala}prestashop>dejala_location_9b514b51d03075005814a33edc74c958'] = 'CAP '; +$_MODULE['<{dejala}prestashop>dejala_location_57d056ed0984166336b7879c2af3657f'] = 'Città'; +$_MODULE['<{dejala}prestashop>dejala_location_bcc254b55c4a1babdf1dcb82c207506b'] = 'Telefono'; +$_MODULE['<{dejala}prestashop>dejala_location_4e186c431f7c016c761c722debb9768e'] = 'Cellulare'; +$_MODULE['<{dejala}prestashop>dejala_location_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Commenti'; +$_MODULE['<{dejala}prestashop>dejala_location_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiornare le impostazioni'; +$_MODULE['<{dejala}prestashop>dejala_menu_8cf04a9734132302f96da8e113e80ce5'] = 'Home'; +$_MODULE['<{dejala}prestashop>dejala_menu_ce5bf551379459c1c61d2a204061c455'] = 'Posizione'; +$_MODULE['<{dejala}prestashop>dejala_menu_9aa698f602b1e5694855cee73a683488'] = 'Contatti'; +$_MODULE['<{dejala}prestashop>dejala_menu_77ea79b4b2638f146bf02ea6dc076006'] = 'Processi'; +$_MODULE['<{dejala}prestashop>dejala_menu_3eb0f1d14d6ec438d91fcfdab94fc1ca'] = 'Opzioni di consegna'; +$_MODULE['<{dejala}prestashop>dejala_menu_e16dd6e118732c5d1586d6aba0b62f3a'] = 'Prezzi'; +$_MODULE['<{dejala}prestashop>dejala_menu_9bbd45bad55cfc620803907f2d8a0217'] = 'Contabilità'; +$_MODULE['<{dejala}prestashop>dejala_menu_36d5423bb12a6d74d1d0f0ba09ef47cb'] = 'Opzioni tecniche'; +$_MODULE['<{dejala}prestashop>dejala_menu_35cf95ca41b6d074cfaeac16b0e0906c'] = 'DEJALA PRO'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_845398bc903ec28114a5f9874d83936b'] = 'Magazzino aperto'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_2084c04f7a380a68b653e5fc82d352f0'] = 'De'; +$_MODULE['<{dejala}prestashop>dejala_picking_timetable_7fc56270e7a70fa81a5935b72eacbe29'] = 'A'; +$_MODULE['<{dejala}prestashop>dejala_processes_237527ad3e0c9d87f072f2ac3a873dc8'] = 'Specifica le procedure per gestire correttamente le consegne'; +$_MODULE['<{dejala}prestashop>dejala_processes_0f516eb68a85aae932001976c51dee2f'] = 'Sentiti libero di adattare le procedure di default per le procedure dei tuoi affari'; +$_MODULE['<{dejala}prestashop>dejala_processes_dbfdb39c2251ff72f42f7078ab347611'] = 'Indirizzo errato'; +$_MODULE['<{dejala}prestashop>dejala_processes_b1da17cfc7c9a051fe4ce45bf1dd1ace'] = 'Destinatario assente'; +$_MODULE['<{dejala}prestashop>dejala_processes_3ab0370c6e7c3d0ea1cd540e7afacc9a'] = 'Consegna respinta'; +$_MODULE['<{dejala}prestashop>dejala_processes_138a10902b1fec08bcf2d9f5a6f4b02b'] = 'Precauzioni per la consegna '; +$_MODULE['<{dejala}prestashop>dejala_processes_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{dejala}prestashop>dejala_products_aa83582f6ce84345c97815de714e6ebd'] = 'Imposta i margini per le consegne'; +$_MODULE['<{dejala}prestashop>dejala_products_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{dejala}prestashop>dejala_products_26160d42b371fb091c142cb8cfa09c34'] = 'Prezzo di acquisto'; +$_MODULE['<{dejala}prestashop>dejala_products_f8ca05a1d72f37501747657deecdd15c'] = 'Margine tasse incluse'; +$_MODULE['<{dejala}prestashop>dejala_products_e6f254c2f6e55725e99e1e6dfd6d9caa'] = 'Prezzo cliente'; +$_MODULE['<{dejala}prestashop>dejala_products_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descrizione'; +$_MODULE['<{dejala}prestashop>dejala_products_1cdad1a5f8e5d09be270415e44c0f039'] = 'Acquista tasse escl.'; +$_MODULE['<{dejala}prestashop>dejala_products_ecef91ba37ffc5f5294ea50efee7c6a2'] = 'Acquista tasse incl.'; +$_MODULE['<{dejala}prestashop>dejala_products_765a24c102d9a0b03eb03c77e90a9144'] = 'Vendi tasse escl.'; +$_MODULE['<{dejala}prestashop>dejala_products_8588719c33b27bd80ae45cc533117c00'] = 'Vendi tasse incl.'; +$_MODULE['<{dejala}prestashop>dejala_products_efeb369cccbd560588a756610865664c'] = 'tra'; +$_MODULE['<{dejala}prestashop>dejala_products_2510c39011c5be704182423e3a695e91'] = 'h'; +$_MODULE['<{dejala}prestashop>dejala_products_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b44c4d973c20b84bad66d243b215ef37'] = 'Elenco di status che convalidano l\'ordine'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_a296002220093a4833752a3cf94f07d0'] = 'Elenco di status che attivano dejala.fr'; +$_MODULE['<{dejala}prestashop>dejala_technical_options_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{dejala}prestashop>dejala_timetable_193993f964d2d4df4b1484227c1626b6'] = 'Scegli il tuo giorno di consegna'; +$_MODULE['<{dejala}prestashop>dejala_timetable_26903e0f192163f4a0957c0b185edf71'] = 'Scegli lai fascia oraria di consegna'; +$_MODULE['<{dejala}prestashop>dejala_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Domenica'; +$_MODULE['<{dejala}prestashop>dejala_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lunedi'; +$_MODULE['<{dejala}prestashop>dejala_5792315f09a5d54fb7e3d066672b507f'] = 'Martedì'; +$_MODULE['<{dejala}prestashop>dejala_796c163589f295373e171842f37265d5'] = 'Mercoledì'; +$_MODULE['<{dejala}prestashop>dejala_78ae6f0cd191d25147e252dc54768238'] = 'Giovedi'; +$_MODULE['<{dejala}prestashop>dejala_c33b138a163847cdb6caeeb7c9a126b4'] = 'Venerdì'; +$_MODULE['<{dejala}prestashop>dejala_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Sabato'; +$_MODULE['<{dejala}prestashop>dejala_9902522831a16af239ba868918f984c6'] = 'Dejala.com: consegna del corriere'; +$_MODULE['<{dejala}prestashop>dejala_69a226fe54256a93edb693bc97a7bcb5'] = 'Consente di gestire le consegne Dejala.com tramite corriere'; +$_MODULE['<{dejala}prestashop>dejala_f66e08578735b3cde28a2d8215b68a52'] = 'Il modulo Dejala richiede l\'estensione php cURL per funzionare correttamente. Si prega di installare l\'estensione php \"cURL\"'; +$_MODULE['<{dejala}prestashop>dejala_0e334c81db8c621e16d82618aaf746ab'] = 'login richiesto.'; +$_MODULE['<{dejala}prestashop>dejala_2a04cf556c49e32d4b4c46fd9b8bade5'] = 'è richiesta la password.'; +$_MODULE['<{dejala}prestashop>dejala_483cf1f6e275faa3c29ff20ba6e4407f'] = 'nazione richiesta.'; +$_MODULE['<{dejala}prestashop>dejala_2485b5c3212614c367f862a8e46f4d11'] = 'login deve essere un indirizzo e-mail valido.'; +$_MODULE['<{dejala}prestashop>dejala_dd189cdaa73e88a19f495a0d6c49a61b'] = 'Nome del negozio è obbligatorio.'; +$_MODULE['<{dejala}prestashop>dejala_4876f72a0b3d7f46de2b201ab02cd0a7'] = 'non è un margine valido.'; +$_MODULE['<{dejala}prestashop>dejala_ad5ee5e5c2989c1e72c586a9f8121716'] = 'Errore durante l\'autenticazione del tuo account su Dejala.com. Le tue credenziali non sono state riconosciute'; +$_MODULE['<{dejala}prestashop>dejala_23e0f5b7cc6e26112230c098b893944a'] = 'Impossibile elaborare l\'azione'; +$_MODULE['<{dejala}prestashop>dejala_6bd82dd0c6115429b03dd84828d6ccb2'] = 'Scegli un altro login'; +$_MODULE['<{dejala}prestashop>dejala_0aec12d0e7c8784012ee74606648d625'] = 'Dejala Server non raggiungibile dal tuo server Prestashop. Questo è certamente dovuto ad un limite impostato dal tuo hosting. Contatta il loro supporto tecnico e chiedi se il tuo server è autorizzato ad avviare le connessioni HTTP in uscita'; +$_MODULE['<{dejala}prestashop>dejala_f46fe05842135a72df96c3409cf00683'] = 'Errore durante l\'aggiornamento posizione'; +$_MODULE['<{dejala}prestashop>dejala_2f63af6e20f182573774b785515ccb95'] = 'Errore durante l\'aggiornamento dei contatti'; +$_MODULE['<{dejala}prestashop>dejala_3a29c6eb6abefd3d629290756168d892'] = 'Errore durante l\'aggiornamento dei processi'; +$_MODULE['<{dejala}prestashop>dejala_5f010efe1c8e6cb195205cbf864044aa'] = 'Errore durante l\'aggiornamento dei prodotti'; +$_MODULE['<{dejala}prestashop>dejala_004ac360e91b3dcf50a19a0fd09e3826'] = 'Devi fornire almeno un indirizzo email per limitare la visibilità di Dejala'; +$_MODULE['<{dejala}prestashop>dejala_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{dejala}prestashop>dejala_dfa53d8241c9f6908e669371b50e95f3'] = 'Questo modulo richiede l\'estensione PHP cURL per funzionare correttamente. Si prega di installare l\'estensione PHP \"cURL\" prima'; +$_MODULE['<{dejala}prestashop>dejala_4c7d16a1e83bcbfd9b33e95f8e90a625'] = 'Errore durante l\'autenticazione del tuo account su Dejala.com. Questo può essere dovuto a un problema temporaneo della rete o di piattaforma. Riprova più tardi o contatta Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_94939d114a8c65173b70b6e01aad11c0'] = 'Errore durante il recupero negozio, riprova più tardi o contatta Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_41d211dd68bf0f87cf3181b0c8dac6e7'] = 'Dejala.com'; +$_MODULE['<{dejala}prestashop>dejala_3d8764621d6076807b0d60cfcadb7213'] = 'Quando vuoi.... corriere'; +$_MODULE['<{dejala}prestashop>dejala_627db4c965627fb7f03682dbbc43a4a1'] = 'Seleziono la mia data di spedizione quando il mio prodotto è disponibile'; +$_MODULE['<{dejala}prestashop>dejala_07e9ea0147aee652244a280da00efb5a'] = 'Data di spedizione selezionata'; +$_MODULE['<{dejala}prestashop>dejala_47a4dfe5ab79feb7884fa57786ea587c'] = 'a partire da'; +$_MODULE['<{dejala}prestashop>dejala_ba93cc89ba75ee6e74699a49a69c0600'] = 'Data di spedizione non ancora selezionata dal cliente'; +$_MODULE['<{dejala}prestashop>dejala_a240fa27925a635b08dc28c9e4f9216d'] = 'Ordine'; +$_MODULE['<{dejala}prestashop>dejala_296a91ebe13e861efa9bd0f74a927353'] = 'Ordine inviato a Dejala'; + +?> \ No newline at end of file diff --git a/modules/dejala/logo.gif b/modules/dejala/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..72db5e1a5e6aa0163d333e57c049bf803d8ffa38 GIT binary patch literal 1072 zcmeH`?@JSL0LHI*mASLdoMd!FKZcAvq(n^Yu(_^PwoGjpl$C|3gbCT`MM=4N4U=Pq z9U=B*)iFfmkcy)h>kwPlD7jYFm%SKYMy|^uj!-!YWK{M?^seU*_&huxcn%zLSM5Ga zVg=Yw48yl^wjlzDEJ{)MWjvCS;d`imGl?3353BqnV9!h5@fNy?Lun{Sq4~pXxu$eQ zeHG`ViZDaD1gakBX(&u+N*v<lJRT(Ul*WvE=_U!KG%2e2;=K9Yu(<(0s(E_k?5}Ls zprXA;HW%+3Qqi0)$58f%X>X3`b2?rv*g_OaLYOvKk+s*!_IjWtpl940i7VW+z>TPQ z*)otI0)&*5VG`<#1}~~Y0(iP*c@mjRW?N9{jd9F5iK+v721TAiHK7wB8~emVH%Cwk zNl|1j8em-W_Q<}FVsinaTCg_(I&3#G41NVSz8gdh08y3gmgr^yrI9?TwFMMr)I+(K z_aZO>l{msH1tLhW6JC^pQWW-1^TMd6q?dt0?_E`i!R%62pEK}kK!xlmV|YXlmjGN? z!^?oQtU8H!QDfRA?`7Fs%J#;1x>+(8O<zd0H$|}j`S%9szZHMKfaU(ij=+LWvGsYi zJNWf1+3}#(Po8k@^tZhU=I_do6{cmtU*cS>nrUoZw~5MmCO@>S$`f5@EL#=|#s1BO zr@ATs*40)^{*JKfC=3Mf+za(%k1u|17@-GxI%i#duG{On6-Q&N|LuxR4Aa^$|6*Xx z+5_b9<0&@JTC%@BGPdC4ZaS>6a`u?Y4d$L)6&c<xChpr$cL^VB#n8shmMaxiFvi|n zd0d-%*B4hoX<cm0|Ka76qT<S_+pjNeyOmd5=k9xSwWNQ&m2THoI9-EBYs<A{!JVlu z1EoE$v>EJ1!Wtmk<{Jb16Gg@6OKcY#IzBr0HI`FFC&+{3mYl=NUg=ZcKEbh}hPhr$ HVtf7opSfY| literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_0.gif b/modules/dejala/picto_0.gif new file mode 100644 index 0000000000000000000000000000000000000000..47feaa28fd2c265d505335a1617beaa805f7fb83 GIT binary patch literal 64 zcmZ?wbhEHb6k!lynE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNY?w2!jKY;FSKAr{D4~ Sp0njv_vU+hey<m0um%8bjTM*x literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_1.gif b/modules/dejala/picto_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..41827736c4c48fdb715537d506561669c701a679 GIT binary patch literal 1000 zcmc&z%S+U85Fc}i)jH&6K_HTm?J8YzB62(Qi|DZy^sp>30*i*A2Lv91E*%6}4;|W; z7(!4eH8Kbfv0Wm1*rAEYI`le3(V-4?3BoSZXMX=g-`g-VpV$0;yGlDZcMmpGGyNg* zc;>F|;?C|Am6@Bmi5t67G}T<yRb1JXVphyWUBrc5C|22=)mfa`nSkVEPU<91?1Tc? zfCd(pF-^e}PtC-P%_wM5shWx@n^LGiQ`AIE*n~n9W?7BJn2iY<v1+77V#G#Zg=&C7 zG*m(sdLRZipn-*D3PVxji7Km7_ya8}5fxUUunQGvvM94M!97G_R!Njt3HFc&WMUg} zz&}L5AyfklqM;I_&;ep#0~%Nq$weDA9*a-}34fqP#Vkz76?UNlO(7OSjz}5-Ko`al zG~6Oe<N=x3MjX%t!*B@I0E1|3LKbv@7}$WOI8jWajT(<|F$4*Jphd+LA4lYx-aDG< z2_xq8DlwY|9jT|;#cCQy93gcWNU7+!Nvb1&Q)qk+xDvvHr<4ll|KYVQWa^0C(fZ(y ze}b~ls4m;G``-9AYVVmjT3a;wWMu!3x9{tBtS%2P?N5dZ2i8olpuWPfi3=y6Um2en zUi+Y_ajcT#jyKC^+xHe4CN3YGoNar0qke10*M`q|E4F9mSM_ZC^17&<D^Gp+eR}dv zY0t8c#Y4AxZ&O!O<!|}S5gJOW)y8j?q%ct4aJZEJIdwC;eXe@x{`pVE%!|3PCCRJf zC-z-yU3d24ul)6qh1|K8?ykYw!_I-e#kohVFR$u+bM5iy_hh<vYSZ0ZlF*ia-sYV7 literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_2.gif b/modules/dejala/picto_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..b018d159d510e8b5d41b3bac2e7ce0432bde6bf0 GIT binary patch literal 1006 zcmc&z%}bPV5T4zZSfxXLbSubeX-m5_m!gYn_9eommaZX07DFHuNzzRstjL3hN@$8e zLCb2PSPC*PK~hm86a^`C=-S6EDWb#l%==IDyA3n*e9imrJFs`h&SUjdPrr#gp1G^L zxU)M&W#*=C;>K<iO*L0_6<2npm=$wT7ja=1id8mebrxrKCLlSPlRAkLJD~tJpn-*D zOjGd0Q!_DRGYVQ%s-|MfrW7jB6g3eOHlYxOSyp2)W@CaztQx727_kvpp&DQi4V93E z9*BVrXkcNP!cf$BqROfi{y>XLM1@r->_P>aEXu4*a1T+KRT3puf<5E`nb<}g@DCAi z2-N_CXsE;}bbuJxfCd&ta?wVO$08I#!XIc+F$)uNg<YsXQ;3C-Ba%h{(1mdX4Y!CA zc|az%5eGEEFdRZPz#tl%kOdte1~#B6P88E<qsAj#3_-#lXi+i6#}T<E_l{<A!iYJ! zO3WrfN9sv-v6{pYM@Sq7QX)ETlIRHF1R9?Mu7vR5DWL-Te|QalGAW`(Y6|Z7Cn)=t zQrWfpA59b}*H$h)O^?2~eDK@Hr4@VDUm01|+k7_Pv0-Knb?5sg&m4a>Hc=kgG+R@B z`&un;`A}EMwdboQ&v)LbG|b;xePOusW!>}QjiI*8^zO$eTc?J$7pkhK?{!USW$U&= zxv^uscz5MOYx|GQ509qarG~njt``r@)ehXhI`+BPR?|{yICtvE+~D`jMfy_idq&I4 zxnC!~_Ro+09Uh!rJpKOlc;m)PE!HCoZ<^DKKbHo(Zl-%mz3XP4419WUIGxSXu73r* BqF?|3 literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_3.gif b/modules/dejala/picto_3.gif new file mode 100644 index 0000000000000000000000000000000000000000..2df2d0fd0addd1f8fd8344b9c4279ccd950b70e3 GIT binary patch literal 992 zcmc&z%}bPV5T4!KFuU}zZ3OnAv0#`%%%!M6x7^hZ9hRVQJ8ZT)&@H+Y(V-87L?LNO zm|F(}gQzVkNDx{vLYX2fqJN-6*Agl((=+cs(eF0Q%=0zxTN*ANI($A$S^7=n@yuP_ z#hu+LDl<2A6E}9FXsWrYtGKc&#jKc%x`+$AP^_{!tFt(>GXcrToYYC2*a-!&0SzoH zW14~|o|=gnn^DlBQZ*G*Hl<L3rl^USunC1I%(5DbF&h&!V%12E#E6Z+3e^CEXsCoN z^gs-3Km!ZQ6o#V46IE8F@CRB{A}XvxVHYaUWKm{if_sR<tdc0P66_%l$iz0{fPaX9 zL#PHAL_;M;p##Lg1~jlJl8ZKKJQkq{68=DoidmSDE9^oAnnEmu9Fa5vfG&(9Xt+g` z$OAI5jX0nQhT#yZ0S3|7ge>R)F|YwmaiW+;8#Nx`Vh9rcK#PhgK90yWxpy>^6GqI* zRbn;?I#N%vi`68KI6~qukP^{xlSD@VC(!sDa3zEXPYD&!|HJG0+m<5wM*D+1{t0TI zr&N3AQ1e0Sc6wb~|J6&GiClT)MfKUoJ=q+k`xm<(UU)aYzEZuoIWsYQw|s7PacC;D zyU}^9IDYSPzD3v97AMahd~<wzU&rXmzD9i^ci`lv$xo%_4?RVmyR&?&=gXFDmFKHJ z8r_Al{Hx;pj_KOQu?<ga@Bd8A*yB|5#OtMWz4WrL^rSxUdGGXW{^+UN%GbeCW8l}d o(~o{OmwLOdtlh5^X3BGCstc<f)wkbo_7=A8+Bq`Vx<N<&0ma^%bN~PV literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_4.gif b/modules/dejala/picto_4.gif new file mode 100644 index 0000000000000000000000000000000000000000..3853644d23b880d1baa730df3d259de9788b2c23 GIT binary patch literal 1009 zcmc&z-)oL>6hH6wnrH7WZ1ujH=7PKzvR&XL#Ko&=!<DJ+eG{2Y$CS-dC`#LGB}6OY z+^qHD0yic~$%SE2r}c6nH<CMC?G87N&w2g{-@DT}=kx14Pxs!gZQGCLDNnzMJf69$ zySTGEMP=ruZsNvn6iqc(brn~3rI;0SQ5SJx7m8IjXLS~5b|xS>nUgw+6FZ>*HlTrp zWlU4>#8WddV>1d`RH~+8%BB=5&=fTh6E>j`g;`c(F=k_eMywjCkr=TNSfLtV5Dk@( zg&v534QOCtnZi)ic%sUx6#hVqN<@WKDC|N7nk>q!OmGiTm{k%bR)Rg`0h!oF9Pkej za0t}^gJ`J4D0F}r*nkEWMRL(bjmIJsLBbzsQ85b>a)n)}KvRf?kRy^t0MLbT1P!-{ z5_v!-wh;$3!7v;`HNYSmn~((^AO<#|DNYpAXrsm>Tns_NA81iA#m5o3ruU9!dcue~ zy-LicK}YIocCnhq5l2WJ22v_IZj$N<;1n941FnSd;3=g7`hR$9|70^npQ$6b<DZ~p zkuu5Z*8bU7my&X2d|-5HrjWE9oU2<?+BKD5(a`^)x~!?aEVbE9oel4<C%J|@J$Dzb z-RP@)T1pNS-_!D;-D9=7!HMZ4fBIe~Gx2u1dFXLvUw*zm+i`K_aL?$2-t7LCV&%%S z_NH6KJvY}^s@cZz=FDW_>e;DWee0Kjr%xs(bA=P-@4c;;M-G+xmVORDI#>NVKmIUT ze6e-p+v^LB>$*-ppF8%lcVk(9zu7#tFx%Pvx8wY&<F(s`4Yspo%a4!ukF?DkUUjBK GJN^L>^P9o| literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_5.gif b/modules/dejala/picto_5.gif new file mode 100644 index 0000000000000000000000000000000000000000..6eb0ee74b5e7a615c8ae7f5224c5dd7fec87c94e GIT binary patch literal 1032 zcmc&z%}bPV5T1o4m!!>Li%dP_64X*qOoHX5D71p0PtYJx4?`f4WRV>_NFbIMcWI^R z6f9VmB1%bu!aksk$wLJd9@4A``k-5Nnx1+8iGH_XW}dHk-?qK2&D*+il%wB79?#s> zUEJB7qB3(+H*sS(il&;Yx{52iQp}3EsEfF;3&kp%vpS12I}?zc%t@WZiJedY8_>YQ zGNvhb;;EUKu^9y|DpgZ4Wm5_jXo{MM37b%e!Yr$?7_%`!BUX*nNQ~GBtWXUwh=xkY zLJ!2i1~jm+OkpT$JW*v;3V)zQC8EMA6n3EkO%`QVCb)+v%qoczE5RP}fJ|&74)})% zID~3|K{Qli6gof*Y(N8xBDrXz#$yqRAmI<RsF;Nbxxy|~pee*c$Pq~+0O-Ovf`(f} zi98?^+lT|2U>FXe8ekBOO~`@{5Ca>~6eo&lv{B;`E`}iC545P5;^T;1lY2)qIbp<{ zTqS0cpd<ApyI4))h$AEp11S+5H%W8^Z~~3b0arqJ@RU#i{Xe|5f72<VceF9M<Da0+ zXG+zt?x$3BZDz%6`;|&pwl-bexMTj>#|tCN3nwNzQ_rU_<~DV|nJVUMMprg;T6?K7 zbGgt~nmF)iT~)Scx16b&PwlVHW{*tGr1s1fv$TF-dSUPo?Hat%(RZ-&`Z|@m%ln23 zGfS&(Un=h$|9*9BRn73x!s76nyG<ugXGSJ(7VjMIt9j7T^<%KU=hv-NcRI81u&4Z` zf3CcFG{5cXtAQ71dlw!bOMPl?T-@;f-q^CbEv4MEV!n0zT+_Gqt)umoh9^rJrzXGV dhx!)BU*7Ni`C<C}xyibgKd17C-=@>l@(<G;t%Cpn literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_6.gif b/modules/dejala/picto_6.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3fdc0a08b2b6cbc6090bb2a438f1773b4d293db GIT binary patch literal 973 zcmc&zy=#+k5PqtrRza{OO+_ccN;FY~Lr?@MK@?F6b&!A=s=^_tVB5u^gL4W}!43z4 zf}~<l5&VFxV!_s11SxiKQ0(F;6m>eEd;bZ4+i`c#*S+tVv!{<8zg$Kczk$f-5f-5l z5`nDT!!2CHB^=o_53?{0lQ870dZ>kJsDvU{#X~GaLnH)53V6T*8jt`BViTHJT;?>A zC!e{iySO81S(&-1o46rWu&L&%uHuRm#aS^IbrBa(BUc^fP=`3kO4S6TXsV<v_DD=@ zLKBP2NJClkshOA|{gIZHs;QVF?NSAsq9$Sjx~C}48q^>L+G8G+$!*3#{}e%oR8267 zrb>=d2Z@PIXksCg%QkC1QAGwxf23t4q5|ehyHvrZLKMuANizWI;y8n*TSmz|D3jZa zgPLfV4yl@86wOV_q7D)ho6yJ;<uu!@`M`@YNctl!D?xr7nQL+HY!)ZXn2W3AY!P&( zUSyZ6MI3pA!eJs6qVpz&jsz~C`8n`P43C})Dx&{~xA*UsKHv-L$({cM2D;e%?DnQd zlc)@wE4M!E#I{<k`Fg%F_;I+hV^9Cf>Cx>=?GZU#pX&TLRj*E5DX+czK3uC`SZpmH z!BVw0z4GAc;9R+WsM%Uup4s>5@xhV)UG4Jd!zayaZ*R2M4}4zeTO4|`valb|$9um9 z-*263bSAp(_1#CW-l<+M-Md*E8oPh8Rr<E^v+|<VoBgx8ap~f%ubtV(YH9w})Oh9Y NOt*QyH#vqA{{R&<kJ11D literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_7.gif b/modules/dejala/picto_7.gif new file mode 100644 index 0000000000000000000000000000000000000000..9326285486c1aec030872be20af20798a38e2d13 GIT binary patch literal 1041 zcmc&z%}bPF5T8|v)nGx`4G$&?iJ21Cgjf<Jg}M@{hteb~jRt~FeL!FbH!@lY^bpl_ z5Cu!ALl#otO_CxROG3m$2Q3kV@X*Dg!_#lxf1>9$%*^j=-nS{;Sa-N5NlDr!3jQnv z4M9TS5XdXDU>Zz<aWL|xT2KutK{+V-tXL2YB0)F^`6^pr4J?5<Faar$1=2tghy$Sj zHlTrpWlWRv_){}6V>5DERH~+8%BJKh&=fTh6E-0ig;`c(F=k_eMywjCkr=TNSfLtV z5Dk@(g&v534QOCtncR@qc%sUx<o-a5N<@WK$n8P}nk>q!OmGiTm{k%bR)Rg`0h!oF z9Pkeja0t}^gJ`J4D0F}r*nkEWd2-%HjmIM7LBbzsQ85b>a)n)}KvRf?kRy^t0MLbT z1P!-{5_v!-wh;$3!7v;`HNYSmn~((^AO<#|$xr0dXrsm>Tns_NA81iA`N!e8M)&q+ zbV83gx{A+6L3`>^cD@?L;YWxZI#MLsZxZQn;0PL@1FnSd;3=X4`hR$3fAV5PD^%^= z{!dVRi<;ua%~PWdcj(Nq?3;<Qhbc-V&dpAZjoj<&JaH&a^Cd@HTZT*9zh_I@I$DxH ze{bgZKdy-l-}-fBXg<@{_2I_q#r5W=?X{0qj#q5NMyi@8+ZuWklc}8RGv6vNjTcnx zS-(A#lNu~Z9f;LUzF5khZS5Of9?Pwjfr51U$<1rop{}=$Rh{?i-|b)8dm&x4(6IdJ z^mO-jQKD}(^Wf#F>F2v&_kJmU*3(gUer>LDXQsOQ;6OSjlbh;#b+x##ed6TTeH%-6 q2W#dlj-)St9_PQMw5w=yaW-DwKUY|u+**78ac$wpV*ZXis{aR439sV- literal 0 HcmV?d00001 diff --git a/modules/dejala/picto_8.gif b/modules/dejala/picto_8.gif new file mode 100644 index 0000000000000000000000000000000000000000..f75ea966eef3a1d00d01d7b406672e63d84a7037 GIT binary patch literal 1042 zcmc&z%}bPF5T8{SSBlj{!@$JMZObI8>5!%&8TmmVg0b2m6qdPECoe@8-Gs$1LU@^w z6fE!}MG)mBj3uHPgD#R(kWnZ?bcxDCJpJbVCwgwf%>2IQeY<+joopGYqAL1L6#Q8T z8iIttA&^&Q!8Diz<6z`XwV)bQf^tyuS+O7*M1pV-@>RCL8dw5zU;<Jg3#5T05C=j5 zY(N7G%a|tT@uy~D#%AQSs8mhGlugN1pebr1CTv133bU-nV$8+_jaW5OBQatlutGJ! zAQ~zm3q2468_>YQGPxnI@kEtX$^C&Am52(fklTd{G+C5cncyCxFsmd=tOR?=12VCV zIN%>5;1H?-2GLN7QRo0MumKG$^5ndY8jnTDgM>fOqGA>%<O;h`fu;}(Ax9*Q0H6!w z2pVn?CGvnwY$Fb6f?+s>YJfpBHX#c-Kn!d^lb^_^(MF9&xEO+jKhUCL@{hxFjqdHu z=!70~bQPbCg7(y-?0hwf!;cU-bfieM-z3uEz!5Y)2V4o^!Ba#9^#AboZI{G|-cz%4 z`#(X69~4W}c0ZhZo;y5ucCAqH`qs^oOmlW2zh1YyBG$1sztK}x+1T6mu6V1rY`i>v zX8Y&Y`pNX{ubJ~pkG^%3COdKyd*aK5${U*%ZDXVHvg)R8i#`4_vXV<?#|G9XCT99F zGh6+!3tRo^;r8#>2lL5HuDYov6<d9kI-OlfE)I`e{qUrG{z~fDiF_tK@S^oo@zc-a zrN<Xqms(dh?zVL8YPhtXJ+$LabF6W1chPupb>_jJ+G{DMXGK$QC%2E@Up_dyS=0Xa qcJlIcd}#1q=gWp^I?{RIV<F#Hn5y4@aj0%#X>{YwVq#~4PW=PMR;=Ry literal 0 HcmV?d00001 diff --git a/modules/dejala/submenu-bg.gif b/modules/dejala/submenu-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3de2cfc5edbc2c7ad388aef0d1975736a946972 GIT binary patch literal 52 zcmZ?wbhEHbWMtrBn8?8J=GDCy&#paveDU#vvx+}i7}y#9Gw3h?0Z5*KiM2&u(I}X~ F8UPB~5U>CM literal 0 HcmV?d00001 diff --git a/modules/dejala/timetable.css b/modules/dejala/timetable.css new file mode 100644 index 000000000..e34f693f2 --- /dev/null +++ b/modules/dejala/timetable.css @@ -0,0 +1,49 @@ +/* MFR081108 - Shipping Preferences */ +#shipping_now { + width:99%; + height:25px; + border:1px solid lightgrey; + margin-top:5; + padding-top:10px; +} + +#shipping_div { + width:100%; +} + +#shipping_dates { + width:100%; + float:left; + border:1px solid lightgrey; +} + +#shipping_dates div { + height:25px; + width:24.9%; + margin-top:5px; + float:left; + padding-top:10px; +} + +#shipping_hours { + float:left; + width:100%; + border:1px solid lightgrey; + margin-top:5px; +} + +#shipping_hours div { + height:31px; + width:19.9%; + float:left; + padding-top:10px; +} + +.title { + margin:5px; + font-size:1.1em; + font-weight:bold; + color:#993300; +} + +#shipping_pref input {border:none;} diff --git a/modules/dejala/timetable.js b/modules/dejala/timetable.js new file mode 100644 index 000000000..587f6a1a0 --- /dev/null +++ b/modules/dejala/timetable.js @@ -0,0 +1,104 @@ +/* Cache les heures non dispo pour le jour dayIndex */ +function hideUnusedHours(dayIndex){ + var i = 0; + var t_obj = document.getElementById('divhr0'); + + while (t_obj) + { + var cal = djl_calendar[dayIndex]; + var calStart = 0; + var calStop = 0; + if (cal) { + if (cal[2]) + calStart = djl_calendar[dayIndex][2]; + if (cal[3]) + calStop = djl_calendar[dayIndex][3]; + } + + if ( (i >= calStart) && (i <= calStop) ) { + t_obj.style.display = ''; + } else { + t_obj.style.display = 'none'; + } + i++; + t_obj = document.getElementById('divhr' + i); + } +} + +/* Sélectionne un des jours par son index */ +function selectDay(dayIndex) +{ + var i = 0; + var t_obj = document.getElementById('shipd0'); + var currentShipd = document.getElementById('shipd'+deliveryDateSelected); + if (currentShipd) { + currentShipd.parentNode.style.fontWeight=''; + currentShipd.parentNode.style.color = ''; + } + while (t_obj) + { + t_obj.checked = false; + if (i == dayIndex) + t_obj.checked = true; + i++; + t_obj = document.getElementById('shipd' + i); + } + deliveryDateSelected = dayIndex; + currentShipd = document.getElementById('shipd'+deliveryDateSelected); + if (currentShipd) { + currentShipd.parentNode.style.fontWeight='bold'; + currentShipd.parentNode.style.color = '#993300'; + } + hideUnusedHours(dayIndex); + + var currentShipHr = document.getElementById('shiphr' + deliveryHourSelected); + if (!currentShipHr || currentShipHr.parentNode.parentNode.style.display == 'none') { + var cal = djl_calendar[dayIndex]; + var calStart = 9; + if (cal) { + if (cal[2]) + calStart = djl_calendar[dayIndex][2]; + selectHour(calStart); + } + } +} + + +function selectHour(hourIndex) +{ + var i = 0; + var t_obj = document.getElementById('shiphr0'); + var currentShipHr = document.getElementById('shiphr' + deliveryHourSelected); + if (currentShipHr) { + currentShipHr.parentNode.style.fontWeight=''; + currentShipHr.parentNode.style.color = ''; + } + while (t_obj) + { + t_obj.checked = false; + if (i == hourIndex) + t_obj.checked = true; + i++; + t_obj = document.getElementById('shiphr' + i); + } + deliveryHourSelected = hourIndex; + currentShipHr = document.getElementById('shiphr' + deliveryHourSelected); + if (currentShipHr) { + currentShipHr.parentNode.style.fontWeight='bold'; + currentShipHr.parentNode.style.color = '#993300'; + } +} + +/** + toggle element visibility : make it visible if to_which is 1 and element is not visible, otherwise make it invisible +**/ +function toggle_visibility(eltId, to_which) +{ + var elt = $('div#' + eltId) ; + if (to_which == 1 && elt.get(0).style.display == 'none') { + elt.slideDown(); + } + else if (to_which == 0 && elt.get(0).style.display != 'none') { + elt.slideUp(); + } +} diff --git a/modules/dibs/config.xml b/modules/dibs/config.xml new file mode 100644 index 000000000..6bc1a08a0 --- /dev/null +++ b/modules/dibs/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>dibs</name> + <displayName><![CDATA[DIBS]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[DIBS payment API]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/dibs/de.php b/modules/dibs/de.php new file mode 100644 index 000000000..41d97b887 --- /dev/null +++ b/modules/dibs/de.php @@ -0,0 +1,45 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dibs}prestashop>dibs_b64af11b4f643164b0b418c716a6f7a0'] = 'Mit dibs zahlen'; +$_MODULE['<{dibs}prestashop>dibs_fda89beb6740540db1053016d96624c3'] = 'dibs Logo'; +$_MODULE['<{dibs}prestashop>dibs_eeaf35c1eb180cc38a77b892a96d7ed3'] = 'Bezahlen Sie sicher und schnell mit dibs.'; +$_MODULE['<{dibs}prestashop>dibs_b508edd89d96e13df300b298143998d3'] = 'DIBS'; +$_MODULE['<{dibs}prestashop>dibs_ef3a95ad5c00ef1b4d1d73d2b50bf54c'] = 'DIBS Zahlung API'; +$_MODULE['<{dibs}prestashop>dibs_f146cc67c82721f372d15664a9e4a0d6'] = 'Aus Sicherheitsgründen müssen Sie die Schlüssel Nr. 1 und 2, die von der MD5-Kontrolle von DIBS API verwendet werden, einstellen.'; +$_MODULE['<{dibs}prestashop>dibs_94c824556baeddc9d8a31710c38fb045'] = 'Sie müssen Ihre Händler-ID einstellen, um DIBS API nutzen zu können.'; +$_MODULE['<{dibs}prestashop>dibs_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{dibs}prestashop>dibs_323d72a644340f9f2152febe46a52259'] = 'Ein DIBS-Konto erhalten'; +$_MODULE['<{dibs}prestashop>dibs_a24f296af38bde709dffc364b28bdebb'] = 'Klicken Sie bitte auf den Link, um den DIBS Anmeldeformular zu sehen:'; +$_MODULE['<{dibs}prestashop>dibs_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Link'; +$_MODULE['<{dibs}prestashop>dibs_9a6126fa59acab742993a80fa0ca9340'] = 'Je nach Ihren Sprache und Länder-Regeln, kanndie Formular-Anmeldung unterschiedlich sein.'; +$_MODULE['<{dibs}prestashop>dibs_d076f6d79396f176263a61ad3a1fe945'] = 'Bitte klicken Sie auf die entsprechende Flagge:'; +$_MODULE['<{dibs}prestashop>dibs_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{dibs}prestashop>dibs_794b8837b6ee6ddc4301f557915f9486'] = 'Logo-Farbe'; +$_MODULE['<{dibs}prestashop>dibs_44e1ec6255a91754e4911b16b9fc4d22'] = 'Die Grundfarbe des Logos, das auf der Zahlungsseite angezeigt wird.'; +$_MODULE['<{dibs}prestashop>dibs_229a7ec501323b94db7ff3157a7623c9'] = 'Händler-ID'; +$_MODULE['<{dibs}prestashop>dibs_b305acae66879c527cda4c4ded662585'] = 'Die von DIBS geschickte E-Mail sehen'; +$_MODULE['<{dibs}prestashop>dibs_310fc01b7a8c167aa514ccccc9e46e99'] = 'Sicherheitsschlüssel Nr. 1'; +$_MODULE['<{dibs}prestashop>dibs_247cc6885be1cb649d05acf81242cc35'] = 'Sicherheitsschlüssel Nr. 2'; +$_MODULE['<{dibs}prestashop>dibs_c7138fc31d63f966e368147a0cd4e55d'] = 'Diese Schlüssel werden für eine Verbesserung der Sicherheit eingesetzt.'; +$_MODULE['<{dibs}prestashop>dibs_b89642757f7199e37e74dd6a9a333733'] = 'Um diese Schlüssel zu erhalten, gehen auf die DIBS-Administrationsoberfläche zu Integration > MD5 Schlüsselmenü . Bitte stellen Sie sicher, dass die MD5-Kontrolle aktiviert ist, sonst funktioniert das Modul nicht .'; +$_MODULE['<{dibs}prestashop>dibs_f9986472f2190b1ec04c52dd1eca1af4'] = 'Verwenden Sie das DIBS-Testmodul'; +$_MODULE['<{dibs}prestashop>dibs_313ada9ae4162978238c99d505bb6870'] = 'Sobald dieses Feld mitgeteilt ist, wird die Transaktion nicht zum Karteninhaber weitergeleitet, sondern wird anstattdessen vom DIBS-Testmodul bearbeitet.'; +$_MODULE['<{dibs}prestashop>dibs_41f538d798be040c3710e4e128105ad2'] = 'Siehe auch Schritt 5 der 10 Schritt-Anleitung für weitere Informationen.'; +$_MODULE['<{dibs}prestashop>dibs_9d0ac8297882a62456cd41249c36d9af'] = 'Während Ihrer ersten Integration mit DIBS ist es nicht nötig, diese Einstellung einzugeben, da sämtliche Standardtransaktionen zunächst auf das DIBS-Testsystem treffen, bis DIBS die Integration genehmigt hat. Falls das Testsystem zu einem späteren Zeitpunkt verwendet wird, wird dies bei DIBS aktiviert (kontaktieren Sie den DIBS-Support, um das Testmodul Ihres Shops zu reaktivieren).'; +$_MODULE['<{dibs}prestashop>dibs_58768109d694bef3c059544892118901'] = 'Flexwin-Farbe'; +$_MODULE['<{dibs}prestashop>dibs_37b0d284e5d29973b385ca537272ec38'] = 'Die Grundfarbe von FlexWin.'; +$_MODULE['<{dibs}prestashop>dibs_2e2b79996d4fb73bff9b97725ddfbab8'] = 'Akzeptierte URL'; +$_MODULE['<{dibs}prestashop>dibs_0e260f9297ec338abbf671829d53c4ae'] = 'Die URL der Seite, die angezeigt werden soll, wenn der Kauf genehmigt ist.'; +$_MODULE['<{dibs}prestashop>dibs_fcb9c3f1b9731de08442d81583782db7'] = 'Gelöschte URL'; +$_MODULE['<{dibs}prestashop>dibs_491f74497aaca60ae31a327d12d52925'] = 'Die URL der Seite, die angezeigt werden soll, wenn der Kunde den Zahlungsvorgang abbricht.'; +$_MODULE['<{dibs}prestashop>dibs_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Ihre Bestellung wird so schnell wie möglich zugeschickt.'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Wir haben bei Ihrer Bestellung ein Problem festgestellt. Wenn Sie denken, dies sei ein Fehler, können Sie an unseren'; + +?> \ No newline at end of file diff --git a/modules/dibs/dibs.jpg b/modules/dibs/dibs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31d9db63fe00683d69ec752a17dba04a93f36f8e GIT binary patch literal 1931 zcmb7Bdpy+X8h?NDn;XiQ8#Rnulo69Gj*a*j<uWcYD+=AL+qjh`%B^K~aEf-sC@oH| z5$j$wRPNVx+7vR<PDIp3H#V8A*`M~DvwxrO`+48zd7tm|d_SM(dE^uFr$B}6;Oqb( z2m(&X0rF{(y!Q+@7yvgnU<d%f12jYf7{r5+YXhnO&v$?f0Q@D60wA3W(ErJCN9;Nf zwJ$Y)SvU&-91=mBnC>(w`mev!#H0xNOGPe6SOoINz#d>=G#U+KkOzaoU~wDpI0OVG zC4~({0*OQ<5Q$_}4K*@_MkNwA>1?9W=~`M^WHntqT}?d=O)brJ5eO;8VR6cMys{>R zNYVViA@2Z0JTL{`Fr*7mL<lBA@*bdpGzDRhdHoF>1f#Kd3<_b*Q~>gUU>F5s*V{!# zfP&EggC*ifIy>=XPhC5T{Y9#(DT@<*EZ}5HaYH9kr49iUyuO3K0i)0uEQCWy1`&}& zVPJTD316_DjV59cK|8YNvFL^oEJe5YjeHVpfDwua6M-#w)ylaon>u%~R87}>$sp-w zYYxpnLQNovr&RXM4G|<y3~ou*I^KCSe!r#?HXL=PBbFSU%bch~w`*Ltt@?)?<X$te zw)^++Kt}q7B+;(niCja@&CJtTCo%;BNn`b%v8(tfPJBD-w4X(9$j|7kHlrHj-T!Q9 z&C`BW&93nHDLl7N8X;WG$XvKD`Sni!6Bn+uZ*Yte-*~;@y{Ay0XJecGgdCWm9Q6B} zS+AizXOeWvEbc5b`n^tN73I>CON;M>Ug*>qc}X@GMRI$#+4auU_C#^~lbjN7t#Z0b zi<9(XzX@XOq6axkopdh+AB~P&aStR}2gB~aHE?|i6~kTgg>UIX{o8#;zhsZNyxb_# zAJf@uGvnBG^X`+jLQY=xDZiDChJut26rF%6<9g;s)e4qSAJ^bglM1hm#^k*@q7`_- zQX@ro>ZKf*D$UVsUwA*11M1?>bFNqmH(B#@7ov~*O*3Ea_Gm`5jYkD3TTr+7z)M*c z9`lP@R7l%l-h?F3asEIAJ}%ZP)qRKQXlirGIhR1qoT4HphKHs!YR)gh^7d*RfzNt) zRx#0xP^E``oAjNyIb&!}>e{c^vvei0V!QvX=02)U-{Ca-VtCqVTgdDJun4p668q$w zSu($r=+a&1yYv&&)rqG;sF#HvWT&-^N)(;x=l99>D~IF-x3r<HZW!h04I4d*^Q^5u z7*QiWF}0g%R;GPQdto5rcLlspNA>1$vJ$yFCvbo{d^1}TB~-HCfVRF)q%^HKInJRt zs-ntl)&PS#$@%ong_+V<nUMvz4g?>ycwgSU6zi4myiZ9Ww9uG%(~?i9BqUsYJN0YO z(Dd<o|Kd$P;el6_qVo)Qi<&#7Bcrs_N8vy0pErFRoBz6r*%FjTZJjRo)?(t`WSQR; z-z!G0YvY$&_r0q$Zlu;|g_m8;un}6uOD@-*b^cM}8PnvT5RB4KMO&`ga`<+TGy7~I zoxlHCK%2u86t!9X#Nyj6J(&;U{esf6Csk}v9DouR1Sj7gqn-9MflaVacXiEtCUo)i z!`rt;_R3D&x;NLIm>T$OYS#-H=>_j@AG0U_IA7*$)b+tX`kGf$qx;l>m+H{=h4Ji- zt{MuxP{G%pAJrA>(+}pq_B(c0;Ns=AtWAxnjyGiB?EBr^f2>NW>Q^zby*`vsb$DSd zBwQ+;t&YwM`wD+7E$g9MnLeJy;$&F^Tnbyv4r2*E`JOy`tT(Us+S|;|<^dtoGechz zS#x-(HU46af%4NG12P}8BTI?hqQj<X&x0SueYDZ6<SpKhG&BhIKdnl7R#RT2IH25U z_c?Wk%!fB`S@^wqe_{VSzXaZ5o#o?<pfJW{R{f1aK7I+iGD{)^gzI(-4;s1Z<nOK0 z(<{GmL&+GF2$Dr*)q?<7{o#=;_CrtGunT$|q=y<M++1Td$Ff1@)&xV&`SAz7#{AS6 z&8J!a>fk4wzZ4LE{F%k;rdm_u_gfwE=3Cnm9_*Xu%U&&4I1X;xvk)Pq?i8dv-5=u= zWag@uA{MWBUp-{iZ5Nw-z|T!>*IMf=x8S?b^dACJEM&QJiYHyiv*B}G+P<K;->e>a zE`b_H{wMRTua&p@3~&xbi_eh`wpcWc&g@^o+-|qBk~+PXie+A%FSn(ao-C~0a&cZ) z8rPC~cJo}>^%hc{aowSg3Ea2wtLDW=Rh5rCd(4Z?el@sr^O^@~Pg=4ZFh3N3rdPjM z4c4ceA#>ln$fwK}d>FY$o4mKYxHeC78qEKyw_mAbF?Q9vEkRXw%DZIG56O>RZ)Ayd zwsZjR{SL8-ZA=e*ekA?K$;u(;nq~=4JOsq*r7~@ytd>^74?VX-`{SLlzT5Q6?d;Xi o$|CB=y4Ip=qH+TkM^vo9<_Pp{mdo*Mj!1{W_7IdaSZZ>~pRcVC_5c6? literal 0 HcmV?d00001 diff --git a/modules/dibs/dibs.php b/modules/dibs/dibs.php new file mode 100644 index 000000000..17cc99aeb --- /dev/null +++ b/modules/dibs/dibs.php @@ -0,0 +1,399 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7096 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class dibs extends PaymentModule +{ + /** + * @var string set the merchant id sent by DIBS e-mail after subscription + * @staticvar + */ + public static $ID_MERCHANT; + + /** + * The URL of the page to be displayed if the purchase is approved. + * @var string + * @staticvar + */ + private static $ACCEPTED_URL = ''; + + /** + * The URL of the page to be displayed if the customer cancels the payment. + * @var string + * @staticvar + */ + private static $CANCELLED_URL = ''; + + /** + * Set the testing mode. + * @var string + */ + private static $TESTING; + + /** + * define more settings values, set for new version which probably. + * @var array + */ + public static $MORE_SETTINGS; + + /** + * @var string + * @staticvar + */ + private static $site_url; + /** + * Set the smarty object + * @var Smarty + */ + private $smarty; + + /** + * Only this langs array are allowed in DIBS API + * @var array + */ + private static $accepted_lang = array('da','en','es','fi','fo','fr','it','nl','no','pl','sv'); + + /** + * Formular link to DIBS subscription + * @var array + */ + public static $dibs_subscription_link = array( + 'en' => 'http://www.dibspayment.com/order/uk_request_2eng', + 'da' => 'http://www.dibs.dk/bestil/internet/', + 'sv' => 'http://www.dibs.se/bestall/internet/', + 'no' => 'http://www.dibs.no/bestill/internett/', + ); + + public function __construct() + { + global $smarty; + $this->smarty = $smarty; + $this->name = 'dibs'; + $this->tab = 'payments_gateways'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + + parent::__construct(); + + $this->displayName = $this->l('DIBS'); + $this->description = $this->l('DIBS payment API'); + + if (self::$site_url === NULL) + self::$site_url = Tools::htmlentitiesutf8(Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__); + + self::$ID_MERCHANT = Configuration::get('DIBS_ID_MERCHANT'); + self::$ACCEPTED_URL = Configuration::get('DIBS_ACCEPTED_URL'); + self::$CANCELLED_URL = Configuration::get('DIBS_CANCELLED_URL'); + self::$TESTING = (int)Configuration::get('DIBS_TESTING'); + self::$MORE_SETTINGS = Configuration::get('DIBS_MORE_SETTINGS') != '' ? unserialize(Tools::htmlentitiesDecodeUTF8(Configuration::get('DIBS_MORE_SETTINGS'))) : array(); + + if (!isset(self::$MORE_SETTINGS['k1']) + OR (isset(self::$MORE_SETTINGS['k1']) AND (self::$MORE_SETTINGS['k1'] === '' OR self::$MORE_SETTINGS['k2'] === '') )) + $this->warning = $this->l('For security reasons, you must set key #1 and key #2 used by MD5 control of DIBS API.'); + if (!self::$ID_MERCHANT OR self::$ID_MERCHANT === '') + $this->warning = $this->l('You have to set your merchant ID to use DIBS API.'); + } + + public function install() + { + return (parent::install() + AND $this->registerHook('orderConfirmation') + AND $this->registerHook('payment') + AND Configuration::updateValue('DIBS_ACCEPTED_URL', self::$site_url.(substr(trim(self::$site_url), -1, 1) === '/' ? '' : '/').'order-confirmation.php') + AND Configuration::updateValue('DIBS_CANCELLED_URL', self::$site_url) + AND Configuration::updateValue('DIBS_TESTING', 1) + AND Configuration::updateValue('DIBS_MORE_SETTINGS', Tools::htmlentitiesUTF8(serialize(array('flexwin_color' => 'blue', 'logo_color' => 'black', 'k1' => '', 'k2' => ''))), true)); + } + + public function uninstall() + { + return (parent::uninstall() + AND Configuration::deleteByName('DIBS_ACCEPTED_URL') + AND Configuration::deleteByName('DIBS_ID_MERCHANT') + AND Configuration::deleteByName('DIBS_CANCELLED_URL') + AND Configuration::deleteByName('DIBS_TESTING') + AND Configuration::deleteByName('DIBS_MORE_SETTINGS')); + } + + public function hookOrderConfirmation($params) + { + if (!$this->active) + return; + if ($params['objOrder']->module != $this->name) + return; + + if ($params['objOrder']->valid) + $this->smarty->assign(array('status' => 'ok', 'id_order' => $params['objOrder']->id)); + else + $this->smarty->assign('status', 'failed'); + return $this->display(__FILE__, 'hookorderconfirmation.tpl'); + } + + private function preProcess() + { + if (Tools::isSubmit('submitModule')) + { + self::$ID_MERCHANT = (Tools::getValue('idMerchant') !== '' ? Tools::getValue('idMerchant') : self::$ID_MERCHANT); + self::$ACCEPTED_URL = ((Validate::isUrl(Tools::getValue('acceptedUrl'))) ? Tools::getValue('acceptedUrl') : self::$ACCEPTED_URL); + self::$CANCELLED_URL = ((Validate::isUrl(Tools::getValue('cancelledUrl'))) ? Tools::getValue('cancelledUrl') : self::$CANCELLED_URL); + self::$TESTING = (int)isset($_POST['testing']); + self::$MORE_SETTINGS['flexwin_color'] = Tools::getValue('flexwin_color'); + self::$MORE_SETTINGS['logo_color'] = Tools::getValue('logo_color'); + self::$MORE_SETTINGS['k1'] = Tools::getValue('k1'); + self::$MORE_SETTINGS['k2'] = Tools::getValue('k2'); + + Configuration::updateValue('DIBS_ID_MERCHANT', self::$ID_MERCHANT); + Configuration::updateValue('DIBS_ACCEPTED_URL', self::$ACCEPTED_URL); + Configuration::updateValue('DIBS_CANCELLED_URL', self::$CANCELLED_URL); + Configuration::updateValue('DIBS_TESTING', self::$TESTING); + Configuration::updateValue('DIBS_MORE_SETTINGS', Tools::htmlentitiesUTF8(serialize(self::$MORE_SETTINGS))); + + $data_sync = ''; + if(self::$ID_MERCHANT !== '' AND self::$TESTING !== 1 AND self::$MORE_SETTINGS['k1'] !== '' AND self::$MORE_SETTINGS['k2'] !== '') + $data_sync = '<img src="http://www.prestashop.com/modules/dibs.png?site_id='.urlencode(self::$ID_MERCHANT).'" style="float:right" />'; + + echo '<div class="conf confirm"><img src="../img/admin/ok.gif"/>'.$this->l('Configuration updated').$data_sync.'</div>'; + } + } + + private function _displayPresentation() + { + $href = ''; + if (isset(dibs::$dibs_subscription_link[Configuration::get('PS_LANG_DEFAULT')])) + $href = dibs::$dibs_subscription_link[Configuration::get('PS_LANG_DEFAULT')]; + else + $href = dibs::$dibs_subscription_link['en']; + $out = ' + <fieldset class="width2"> + <legend><img src="../img/admin/contact.gif" />'.$this->l('Get a DIBS account').'</legend> + <p> + '.$this->l('Please click on the following link to access the DIBS subscription form:') + .' <a href="'.$href.'" class="link" target="_blank" >&raquo; '.$this->l('Link').' &laquo;</a> + </p> + <p>' + .$this->l('Depending on language and country rules, subscription parameters may be different.').'<br />' + .$this->l('Please click on the appropriate flags:').'&nbsp;'; + foreach (dibs::$dibs_subscription_link as $lang=>$url) + { + $out .= '<a href="'.$url.'" title="'.$lang.'" class="link" target="_blank" ><img src="'.dibs::$site_url.'modules/dibs/img/'.$lang.'.jpg" /></a>'; + } + $out .= ' + </p> + </fieldset>'; + return $out; + } + + public function getContent() + { + $this->preProcess(); + + $flexwin_colors = array('sand', 'grey', 'blue'); + $logo_colors = array('yellow', 'grey', 'blue', 'black', 'purple', 'green'); + $str = '<h2>'.$this->displayName.'</h2>' + .$this->_displayPresentation() + .'<br /> + <form action="'.Tools::htmlentitiesutf8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset class="width2"> + <legend><img src="../img/admin/contact.gif" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Logo color').'<br /><br /> + <img src="'.self::$site_url.'modules/dibs/logos/dibs_'.self::$MORE_SETTINGS['logo_color'].'.jpg" /> + </label> + <div class="margin-form">'; + foreach ($logo_colors as $logo_color) + $str .= '<input type="radio" name="logo_color" '.(self::$MORE_SETTINGS['logo_color'] === $logo_color ? 'checked ' : '').'value="'.$logo_color.'" /> '.$logo_color.'<br />'; + $str .= ' <p>'.$this->l('The basic color of the logo which appears on the payment page.').'</p> + </div> + <label>'.$this->l('Merchant ID').' <sup>*</sup></label> + <div class="margin-form"> + <input type="text" size="20" name="idMerchant" value="'.self::$ID_MERCHANT.'" /> + <p>'.$this->l('See the e-mail sent by DIBS.').'</p> + </div> + <label>'.$this->l('Secure Key #1').' <sup>*</sup></label> + <div class="margin-form"> + <input type="text" size="20" name="k1" value="'.Tools::htmlentitiesUTF8(self::$MORE_SETTINGS['k1']).'" /> + </div> + <label>'.$this->l('Secure Key #2').' <sup>*</sup></label> + <div class="margin-form"> + <input type="text" size="20" name="k2" value="'.Tools::htmlentitiesUTF8(self::$MORE_SETTINGS['k2']).'" /> + <p>'.$this->l('These keys are used for security improvement.').'<br />'.$this->l('To obtain these keys, go to the DIBS administration interface and under \'Integration\', select the MD5 Keys menu. Please ensure the MD5 control is activated, otherwise the module will not work.').'</p> + </div> + <label>'.$this->l('Use DIBS test module').'</label> + <div class="margin-form"> + <input type="checkbox" name="testing" '.(self::$TESTING === 1 ? 'checked ' : '').'value="testing" /> + <p>'.$this->l('When this field is declared, the transaction is not dispatched to the card issuer, but is instead handled by the DIBS test module.') + .$this->l('See also Step 5 of the 10 Step Guide for more information.') + .' <a href="http://tech.dibs.dk/10_step_guide/your_own_test/" title="'.$this->l('See also Step 5 of the 10 Step Guide for more information.').'" target="_blank">> '.$this->l('Link').'</a><br />' + .$this->l('During the initial integration with DIBS, there is no need to insert this parameter, since all default transactions will reach the DIBS test system until DIBS has approved integration. Should the test system be used at a later date, this will be activated at DIBS (contact DIBS support for reactivating the test mode of your shop).').'</p> + </div> + <label>'.$this->l('Flexwin color').'</label> + <div class="margin-form">'; + foreach ($flexwin_colors as $flexwin_color) + $str .= '<input type="radio" name="flexwin_color" '.(self::$MORE_SETTINGS['flexwin_color'] === $flexwin_color ? 'checked ' : '').'value="'.$flexwin_color.'" /> '.$flexwin_color.'<br />'; + $str .= ' <p>'.$this->l('The basic color theme of FlexWin.').'</p> + </div> + <label>'.$this->l('Accepted url').' <sup>*</sup></label> + <div class="margin-form"> + <input type="text" size="20" name="acceptedUrl" value="'.self::$ACCEPTED_URL.'" /> + <p>'.$this->l('URL of the page to be displayed if the purchase is approved.').'</p> + </div> + <label>'.$this->l('Cancelled url').' <sup>*</sup></label> + <div class="margin-form"> + <input type="text" size="20" name="cancelledUrl" value="'.self::$CANCELLED_URL.'" /> + <p>'.$this->l('URL of the page to be displayed if the customer cancels the payment.').'</p> + </div> + <br /><center><input type="submit" name="submitModule" value="'.$this->l('Update settings').'" class="button" /></center> + </fieldset> + </form>'; + return $str; + } + + public function hookPayment($params) + { + if ((self::$ID_MERCHANT === false || self::$ID_MERCHANT === '' || self::$ID_MERCHANT === NULL) + || (self::$ACCEPTED_URL === false || self::$ACCEPTED_URL === '' || self::$ACCEPTED_URL === NULL)) + return ''; + + $currency = new Currency(intval($params['cart']->id_currency)); + $lang = new Language(intval($params['cart']->id_lang)); + $customer = new Customer(intval($params['cart']->id_customer)); + $address = new Address(intval($params['cart']->id_address_invoice)); + $country = new Country(intval($address->id_country), intval($params['cart']->id_lang)); + $products = $params['cart']->getProducts(); + + $dibsParams = array(); + + // Required + $dibsParams['merchant'] = self::$ID_MERCHANT; // id merchant send from DIBS e-mail + + // don't cast to int !! It has strange behaviour (really strange) + // for example : When calculate a total amount of 557.05, the result is 55704 after casting !! + $dibsParams['amount'] = $params['cart']->getOrderTotal(true, Cart::BOTH) * 100; // The smallest unit of an amount, cent for EUR + $dibsParams['accepturl'] = self::$ACCEPTED_URL.'?id_cart='.(int)($params['cart']->id).'&id_module='.(int)($this->id).'&key='.$customer->secure_key; // The URL of the page to be displayed if the purchase is approved. + $dibsParams['orderid'] = $params['cart']->id.'_'.date('YmdHis'); // The shop's order number for this particular puchase. It can be seen later when payment is captured, and will in some instances appear on the customer's bank statement (max. 50 characters, both numerals and letters may be used). + $currency_num = 0; + + // for 1.3 compatibility + if(!isset($currency->iso_code_num) OR $currency->iso_code_num == '') + { + $array_currency_iso_num = array( + 'DKK' => 208, + 'EUR' => 978, + 'USD' => 840, + 'GBP' => 826, + 'SEK' => 752, + 'AUD' => 036, + 'CAD' => 124, + 'ISK' => 352, + 'JPY' => 392, + 'NZD' => 554, + 'NOK' => 578, + 'CHF' => 756, + 'TRY' => 949, + ); + $currency_num = $array_currency_iso_num[$currency->iso_code]; + } + else + $currency_num = $currency->iso_code_num; + $dibsParams['currency'] = (int)$currency_num; // Currency specification as indicated in ISO4217 where the EUR is no. 978 + + // optional + if(self::$TESTING === 1) + $dibsParams['test'] = 'yes'; // optional - This field is used when tests are being conducted on the shop (e.g. test=yes). When this field is declared, the transaction is not dispatched to the card issuer, but is instead handled by the DIBS test module. See also Step 5 of the 10 Step Guide for more information. During your initial integration with DIBS, there is no need to insert this parameter, since all default transactions will hit the DIBS test system until DIBS has approved integration. Should the test system be used at a later date, this will be activated at DIBS (contact DIBS support for reactivating the test mode of your shop). + $dibsParams['lang'] = in_array(strtolower($lang->iso_code), self::$accepted_lang) ? $lang->iso_code : ''; // optional - This parameter determines the language in which the page will be opened. The following values are accepted: da=Danish en=English es=Spanish fi=Finnish fo=Faroese fr=French it=Italian nl=Dutch no=Norwegian pl=Polish (simplified) sv=Swedish Default language is Danish. + $dibsParams['color'] = self::$MORE_SETTINGS['flexwin_color']; // optional - The basic color theme of FlexWin. There is currently a choice of "sand", "grey" and "blue". The default value is "blue". + $dibsParams['cancelurl'] = self::$CANCELLED_URL; // optional - The URL of the page to be displayed if the customer cancels the payment. + $dibsParams['uniqueoid'] = (int)($params['cart']->id).'_'.date('YmdHis').'_'.$params['cart']->secure_key; // optional - If this field exists, the orderid-field must be unique, i.e. there is no existing transaction with DIBS with the same order number. If such a transaction already exists, payment will be rejected with reason=7. Unless you are unable to generate unique order numbers, we strongly urge you to utilize this field.Note: Order numbers can be composed of a maximum of 50 characters (DIBS automatically removes surplus characters) and that uniqueoid is therefore unable to work as intended if order numbers consisting of more than 50 characters are used. + $dibsParams['callbackurl'] = self::$site_url.'modules/'.$this->name.'/validation.php'; // optional - An optional �server-to-server� call which tells the shop�s server that payment was a success. Can be used for many purposes, the most important of these being the ability to register the order in your own system without depending on the customer�s browser hitting a specific page of the shop. See also HTTP_COOKIE. + $md5_params = 'merchant='.self::$ID_MERCHANT.'&orderid='.$dibsParams['orderid'].'&currency='.$dibsParams['currency'].'&amount='.$dibsParams['amount']; + $dibsParams['md5key'] = md5(self::$MORE_SETTINGS['k2'].md5(self::$MORE_SETTINGS['k1'].$md5_params)); // optional - This variable enables a MD5 key control of the values received by DIBS. This control confirms that the values sent to DIBS has not been tampered with during the transfer. The MD5 key is calculated as: MD5(key2 + MD5(key1 + "merchant=&orderid=&transact=")) Where key1 and key2 are shop specific keys available through the DIBS administration interface, and + is the concatenation operator. NB! MD5 key check must also be enabled through the DIBS administration interface in order to work. Further details on MD5-key control. + + // @todo need more infos. + $dibsParams['account'] = ''; // optional - If multiple departments utilize the company's acquirer agreement with PBS, it may prove practical to keep the transactions separate at DIBS. An "account number" may be inserted in this field, so as to separate transactions at DIBS. + $dibsParams['calcfee'] = ''; // optional - If this parameter is set (e.g. calcfee=foo), the charge due to the transaction will automatically be calculated and affixed, i.e., the charge payable to the acquirer (e.g. PBS) + $dibsParams['capturenow'] = ''; // optional - If this field exists, an "instant capture" is carried out, i.e. the amount is immediately transferred from the customer's account to the shop's account. This function can only be utilized in the event that there is no actual physical delivery of any items. Contact DIBS when using this function. (Note that instant capture requires unique order numbers - also see the description of uniqueoid above). + $dibsParams['ip'] = ''; // optional - DIBS retains the IP-number from which a card transaction is carried out. The IP-number is used for �fraud control�, etc. Some implementations may send the IP number of the shop to DIBS rather than that of the customer's machine. In order to provide the same services to shops which utilize such a program for their DIBS hookup, we offer the option of sending the "ip" parameter. + $dibsParams['paytype'] = ''; // optional - Regarding the start-up of the DIBS FlexWin, the user can be limited to the use of just one particular payment form. This is accomplished by using the parameter "paytype". This function can be used if you wish for example to use integration method 3 for payment cards and method 1 for eDankort. Furthermore, this function can be used if you wish to control the user's selections of method of payment from your own website. You can also specify a list of payment methods that will be shown in the Flexwin. This list should be a comma separated with no spaces in between. Example: See our list of possible paytypes. + $dibsParams['maketicket'] = ''; // optional - This parameter is intended for FlexWin, and actually performs two transactions. First it performs a regular authorisation. If, and only if, it is accepted, it is followed by a ticket registration. Both a transaction and a ticket value are returned to "accepturl" if it is specified. If "callbackurl" is specified, DIBS will perform two separate calls, corresponding to performing two transactions - one call to the regular authorisation, and another to the ticket registration. Both cases return a "transact" parameter value (e.g. transact="78901234"). In calls to "callbackurl" containing "preauth", the ticket value is composed of the "transact" parameter value. "maketicket" implicitly sets the "preauth" parameter - however, you should avoid to explicitly specify any "preauth" parameter. You cannot use "uniqueoid", "capturenow" or "md5key" along with "maketicket". Currently "maketicket" does not work with 3Dsecure. + $dibsParams['postype'] = ''; // optional - "postype" (one 't') is used when one wishes to register the transaction origin. For normal internet transaction it is not required to include "postype", as it is automatically set to SSL. Possible values are: ssl = internet transactions, magnetic = magnetic stripe read, and signature is available, magnosig = magnetic stripe read, and no signature is available, mail = mail order, manual = manually entered, phone = phone order, signature = card and signature available, manually entered. + $dibsParams['ticketrule'] = ''; // optional - Set the value of this parameter to the same as defined by you in DIBS Admin. + $dibsParams['preauth'] = ''; // optional - When preauth=true is sent as part of the request to auth.cgi the DIBS server identifies the authorisation as a ticket authorisation rather than a normal transaction. Please note that the pre-authorised transaction is NOT available among the transactions in the DIBS administration interface. When using MD5 the Authkey must be calculated from the string transact=12345678&preauth=true&currency=123 + + // @todo Since Prestashop manage vouchers, ask if necessary to use this params + $dibsParams['voucher'] = ''; // optional - If set to "yes", then the list of payment types on the first page of FlexWin will contain vouchers, too. If FlexWin is called with a paytype, which would lead directly to the payment form, the customer is given the choice of entering a voucher code first. + $dibsParams['split'] = ''; // optional - "split" is used for splitting up a transaction into two or more sub-transactions. This enables part of an order to be paid for when shipped in part. It requires that the amount and currency of the part payments are known at the time of the order, and are posted to the DIBS server as: split=2&amount1=&amount2= + + // to erase optional params which are not filled + $dibsParams = array_filter($dibsParams); + + /* Order Information as "complex model" : + * -------------------------------------- */ + + // delivery params + $dibsParams['delivery1.Name'] = $address->firstname.' '.$address->lastname; + $dibsParams['delivery2.Address'] = $address->address1; + $dibsParams['delivery3.Address2'] = $address->address2; + $dibsParams['delivery4.Postcode'] = $address->postcode; + $dibsParams['delivery5.City'] = $address->city; + $dibsParams['delivery6.Comment'] = $address->other; + $dibsParams['delivery7.Phone'] = $address->phone; + $dibsParams['delivery8.Company'] = $address->company; + + // order line (product list) + $dibsParams['ordline0-1'] = 'Product ref / Product Id'; + $dibsParams['ordline0-2'] = 'Name'; + $dibsParams['ordline0-3'] = 'Description'; + $dibsParams['ordline0-4'] = 'Unit price with tax'; + $dibsParams['ordline0-5'] = 'Total price with tax'; + $dibsParams['ordline0-6'] = 'Quantity'; + $dibsParams['ordline0-7'] = 'Weight'; + $dibsParams['ordline0-8'] = 'ecotax'; + + $count_products = 1; + foreach ($products as $key => $product) + { + $dibsParams['ordline'.$count_products.'-1'] = 'ref.'.($product['reference'] != '' ? $product['reference'] : 'NC' ).'/id.'.$product['id_product']; + $dibsParams['ordline'.$count_products.'-2'] = $product['name']; + $dibsParams['ordline'.$count_products.'-3'] = strip_tags($product['description_short']); + $dibsParams['ordline'.$count_products.'-4'] = $product['price_wt']; + $dibsParams['ordline'.$count_products.'-5'] = $product['total_wt']; + $dibsParams['ordline'.$count_products.'-6'] = $product['cart_quantity']; + $dibsParams['ordline'.$count_products.'-7'] = $product['weight']; + $dibsParams['ordline'.$count_products.'-8'] = $product['ecotax']; + $count_products++; + } + + // Price info + $dibsParams['priceinfo1.Deliverycosts'] = $params['cart']->getOrderTotal(true, Cart::ONLY_SHIPPING); + $dibsParams['priceinfo2.ProductsAmount'] = $params['cart']->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING); + $dibsParams['priceinfo3.AmountWithoutTax'] = $params['cart']->getOrderTotal(false, Cart::BOTH); + $dibsParams['priceinfo4.AmountTotalTax'] = (float)($params['cart']->getOrderTotal(true, Cart::BOTH) - $params['cart']->getOrderTotal(false, Cart::BOTH)); + $this->smarty->assign('p', $dibsParams); + $this->smarty->assign('logo_color', self::$MORE_SETTINGS['logo_color']); + return $this->display(__FILE__, 'dibs.tpl'); + } +} diff --git a/modules/dibs/dibs.tpl b/modules/dibs/dibs.tpl new file mode 100644 index 000000000..6aad04d1a --- /dev/null +++ b/modules/dibs/dibs.tpl @@ -0,0 +1,13 @@ +<p class="payment_module"> + <a href="javascript:document.dibs_form.submit();" title="{l s='Pay with dibs' mod='dibs'}" style="height:48px"> + <span style="height:40px;width:86px;float:left"><img src="{$module_dir}logos/dibs_{$logo_color}.jpg" alt="{l s='dibs logo' mod='dibs'}" /></span> + <span style="width:350px;float:left;margin-left:10px"><strong>{l s='Pay with dibs' mod='dibs'}</strong><br />{l s='Pay safely and quickly with dibs.' mod='dibs'}</span> + <div style="clear:both;height:0;line-height:0">&nbsp;</div> + </a> + <div style="clear:both;height:0;line-height:0">&nbsp;</div> +</p> +<form name="dibs_form" action="https://payment.architrade.com/paymentweb/start.action" method="post"> +{foreach from=$p key=k item=v} + <input type="hidden" name="{$k}" value="{$v}" /> +{/foreach} +</form> \ No newline at end of file diff --git a/modules/dibs/es.php b/modules/dibs/es.php new file mode 100644 index 000000000..5528440e7 --- /dev/null +++ b/modules/dibs/es.php @@ -0,0 +1,43 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dibs}prestashop>dibs_b508edd89d96e13df300b298143998d3'] = 'DIBS'; +$_MODULE['<{dibs}prestashop>dibs_ef3a95ad5c00ef1b4d1d73d2b50bf54c'] = 'DIBS API de pago'; +$_MODULE['<{dibs}prestashop>dibs_f146cc67c82721f372d15664a9e4a0d6'] = 'Por razones de seguridad, debe grabar las claves 1 y 2 utilizadas por el control MD de el API de DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_94c824556baeddc9d8a31710c38fb045'] = 'Debe registrar su ID vendedor para utilizar el API de DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración modificada'; +$_MODULE['<{dibs}prestashop>dibs_323d72a644340f9f2152febe46a52259'] = 'Obtenir una cuenta DIBS'; +$_MODULE['<{dibs}prestashop>dibs_a24f296af38bde709dffc364b28bdebb'] = 'Pulse en el siguiente link para acceder al formulario de inscripción DIBS:'; +$_MODULE['<{dibs}prestashop>dibs_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Link'; +$_MODULE['<{dibs}prestashop>dibs_d826f3c7dc81b9d9b855f34bb855d9f6'] = 'Según su idioma y la legislación de su país, el formulario de inscripción puede ser diferente.'; +$_MODULE['<{dibs}prestashop>dibs_d076f6d79396f176263a61ad3a1fe945'] = 'Pulse en la bandera correspondiente:'; +$_MODULE['<{dibs}prestashop>dibs_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuraciones'; +$_MODULE['<{dibs}prestashop>dibs_794b8837b6ee6ddc4301f557915f9486'] = 'Color del logo'; +$_MODULE['<{dibs}prestashop>dibs_44e1ec6255a91754e4911b16b9fc4d22'] = 'El color básico del logo que aparece en la página de pago'; +$_MODULE['<{dibs}prestashop>dibs_229a7ec501323b94db7ff3157a7623c9'] = 'id del vendedor'; +$_MODULE['<{dibs}prestashop>dibs_b305acae66879c527cda4c4ded662585'] = 'Mirar el email enviado por DIBS'; +$_MODULE['<{dibs}prestashop>dibs_310fc01b7a8c167aa514ccccc9e46e99'] = 'Clave de seguridad n°1'; +$_MODULE['<{dibs}prestashop>dibs_247cc6885be1cb649d05acf81242cc35'] = 'Clave de seguridad n°2'; +$_MODULE['<{dibs}prestashop>dibs_c7138fc31d63f966e368147a0cd4e55d'] = 'Estas claves se utilizan para mejorar la seguridad.Estas claves se utilizan para mejorar la seguridad.'; +$_MODULE['<{dibs}prestashop>dibs_b89642757f7199e37e74dd6a9a333733'] = 'Para obtener estas claves ir a la interfaz de administración DIBS y a Integración > Menú de claves MD5. Por favor, asegúrese de que el control MD5 esté activo, de lo contrario el módulo no funcionará.'; +$_MODULE['<{dibs}prestashop>dibs_f9986472f2190b1ec04c52dd1eca1af4'] = 'Utilizar el módulo de test de DIBS'; +$_MODULE['<{dibs}prestashop>dibs_313ada9ae4162978238c99d505bb6870'] = 'Cuando este campo está declarado, la transacción no se envía al remitente de la carta sino al módulo de test de Twenga.'; +$_MODULE['<{dibs}prestashop>dibs_41f538d798be040c3710e4e128105ad2'] = 'Mirar también la etapa 5 de la guía en 10 etapas para más información.'; +$_MODULE['<{dibs}prestashop>dibs_9d0ac8297882a62456cd41249c36d9af'] = 'Durante su primera integración con DIBS, no necesita utilizar dicho parámetro, ya que todas las transacciones por defecto van a utilizar el sistema de test hasta que la integración del sitio no haya sido aprobada por DIBS. Si el sistema de test debe utilizarse posteriormente, puede activarse en DIBS (contacte con el soporte DIBS para reactivar el modo de test en su tienda)'; +$_MODULE['<{dibs}prestashop>dibs_58768109d694bef3c059544892118901'] = 'Color de Flexwin'; +$_MODULE['<{dibs}prestashop>dibs_37b0d284e5d29973b385ca537272ec38'] = 'El color del tema de Flexwi'; +$_MODULE['<{dibs}prestashop>dibs_2e2b79996d4fb73bff9b97725ddfbab8'] = 'Url de aceptación'; +$_MODULE['<{dibs}prestashop>dibs_0e260f9297ec338abbf671829d53c4ae'] = 'La URL de la página que aparece si el pago es aceptado.'; +$_MODULE['<{dibs}prestashop>dibs_fcb9c3f1b9731de08442d81583782db7'] = 'Anular la URL'; +$_MODULE['<{dibs}prestashop>dibs_491f74497aaca60ae31a327d12d52925'] = 'La URL de la página que aparecerá si el usuario anula el pago'; +$_MODULE['<{dibs}prestashop>dibs_b17f3f4dcf653a5776792498a9b44d6a'] = 'Modificar las configuraciones'; +$_MODULE['<{dibs}prestashop>dibs_b64af11b4f643164b0b418c716a6f7a0'] = 'Pagar con DIBS'; +$_MODULE['<{dibs}prestashop>dibs_fda89beb6740540db1053016d96624c3'] = 'Logo de DIBS'; +$_MODULE['<{dibs}prestashop>dibs_eeaf35c1eb180cc38a77b892a96d7ed3'] = 'Pagar rápidamente de manera segura con DIBS'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido en'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'está terminado.'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Le enviaremos su pedido cuanto antes.'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier pregunta o para más información, póngase en contacto con nuestro'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'servicio clientela'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Hemos observado un problema con su pedido. Si piensa que se trata de un error, puede ponerse en contacto con nuestro'; diff --git a/modules/dibs/fr.php b/modules/dibs/fr.php new file mode 100644 index 000000000..e0320d43c --- /dev/null +++ b/modules/dibs/fr.php @@ -0,0 +1,43 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dibs}prestashop>dibs_b508edd89d96e13df300b298143998d3'] = 'DIBS'; +$_MODULE['<{dibs}prestashop>dibs_ef3a95ad5c00ef1b4d1d73d2b50bf54c'] = 'DIBS API de paiement'; +$_MODULE['<{dibs}prestashop>dibs_f146cc67c82721f372d15664a9e4a0d6'] = 'Pour des raisons de sécurité, vous devez enregistrer les clefs numéro 1 et 2 utilisées par le controle MD de l\'API DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_94c824556baeddc9d8a31710c38fb045'] = 'Vous devez enregistrer votre ID marchand pour utiliser l\'API de DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration modifié'; +$_MODULE['<{dibs}prestashop>dibs_323d72a644340f9f2152febe46a52259'] = 'Obtenir un compte DIBS'; +$_MODULE['<{dibs}prestashop>dibs_a24f296af38bde709dffc364b28bdebb'] = 'Veuillez cliquer sur le lien suivant pour accéder au formulaire de souscription DIBS :'; +$_MODULE['<{dibs}prestashop>dibs_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Lien'; +$_MODULE['<{dibs}prestashop>dibs_d826f3c7dc81b9d9b855f34bb855d9f6'] = 'Selon votre langage et les lois de votre pays, le formulaire de souscription pourrait être différent.'; +$_MODULE['<{dibs}prestashop>dibs_d076f6d79396f176263a61ad3a1fe945'] = 'Veuillez cliquer sur le drapeau approprié :'; +$_MODULE['<{dibs}prestashop>dibs_f4f70727dc34561dfde1a3c529b6205c'] = 'Configurations'; +$_MODULE['<{dibs}prestashop>dibs_794b8837b6ee6ddc4301f557915f9486'] = 'Couleur du logo'; +$_MODULE['<{dibs}prestashop>dibs_44e1ec6255a91754e4911b16b9fc4d22'] = 'La couleur basique du logo qui apparait sur la page de paiement'; +$_MODULE['<{dibs}prestashop>dibs_229a7ec501323b94db7ff3157a7623c9'] = 'id du Marchand'; +$_MODULE['<{dibs}prestashop>dibs_b305acae66879c527cda4c4ded662585'] = 'Regarder l\'e-mail envoyé par DIBS'; +$_MODULE['<{dibs}prestashop>dibs_310fc01b7a8c167aa514ccccc9e46e99'] = 'Clé de sécurité n°1'; +$_MODULE['<{dibs}prestashop>dibs_247cc6885be1cb649d05acf81242cc35'] = 'Clé de sécurité n°2'; +$_MODULE['<{dibs}prestashop>dibs_c7138fc31d63f966e368147a0cd4e55d'] = 'Ces clefs sont utilisées pour améliorer la sécurité.'; +$_MODULE['<{dibs}prestashop>dibs_b89642757f7199e37e74dd6a9a333733'] = 'Afin de récupérer ces clefs, rendez-vous sur l\'interface d\'administration de DIBS, dans le menu \"Integration\" > \"MD5 keys\". N\'oubliez pas de vérifier si le contrôle MD5 est activé, auquel cas le module ne sera pas opérationnel.'; +$_MODULE['<{dibs}prestashop>dibs_f9986472f2190b1ec04c52dd1eca1af4'] = 'Utiliser le module de test de DIBS'; +$_MODULE['<{dibs}prestashop>dibs_313ada9ae4162978238c99d505bb6870'] = 'Quand ce champ est déclaré, la transaction n\'est pas envoyée à l\'émetteur de la carte, mais est envoyé au module de test de DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_41f538d798be040c3710e4e128105ad2'] = 'Regarder aussi l\'étape 5 du guide en 10 étapes pour plus d\'informations.'; +$_MODULE['<{dibs}prestashop>dibs_9d0ac8297882a62456cd41249c36d9af'] = 'Lors de votre première intégration avec DIBS, vous n\'avez pas besoin d\'utiliser ce paramètre, puisque toute les transactions par défaut vont utiliser le système de test tant que l\'intégration du site n\'a pas été approuvée par DIBS. Si le système de test doit être utilisé plus tard, il peut être activé chez DIBS (contactez le support DIBS pour réactiver le mode de test sur votre boutique)'; +$_MODULE['<{dibs}prestashop>dibs_58768109d694bef3c059544892118901'] = 'Couleur de Flexwin'; +$_MODULE['<{dibs}prestashop>dibs_37b0d284e5d29973b385ca537272ec38'] = 'La couleur du thême de Flexwin'; +$_MODULE['<{dibs}prestashop>dibs_2e2b79996d4fb73bff9b97725ddfbab8'] = 'Url d\'acceptation'; +$_MODULE['<{dibs}prestashop>dibs_0e260f9297ec338abbf671829d53c4ae'] = 'L\'url de la page qui sera appelé une fois le paiement accepté.'; +$_MODULE['<{dibs}prestashop>dibs_fcb9c3f1b9731de08442d81583782db7'] = 'Url d\'annulation'; +$_MODULE['<{dibs}prestashop>dibs_491f74497aaca60ae31a327d12d52925'] = 'L\'url de la page qui sera appelé si l\'utilisateur annule le paiement'; +$_MODULE['<{dibs}prestashop>dibs_b17f3f4dcf653a5776792498a9b44d6a'] = 'Modifier les configurations'; +$_MODULE['<{dibs}prestashop>dibs_b64af11b4f643164b0b418c716a6f7a0'] = 'Payer avec DIBS'; +$_MODULE['<{dibs}prestashop>dibs_fda89beb6740540db1053016d96624c3'] = 'Logo de DIBS'; +$_MODULE['<{dibs}prestashop>dibs_eeaf35c1eb180cc38a77b892a96d7ed3'] = 'Payer rapidement et de manière sécurisé avec DIBS'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est terminée. '; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Votre commande vous sera envoyée dès que possible. '; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou pour de plus amples renseignements, merci de communiquer avec notre '; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'service client'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Nous avons remarqué un problème avec votre commande. Si vous pensez que c\'est une erreur, vous pouvez contacter notre'; diff --git a/modules/dibs/hookorderconfirmation.tpl b/modules/dibs/hookorderconfirmation.tpl new file mode 100644 index 000000000..1c67f31df --- /dev/null +++ b/modules/dibs/hookorderconfirmation.tpl @@ -0,0 +1,11 @@ +{if $status == 'ok'} + <p>{l s='Your order on' mod='dibs'} <span class="bold">{$shop_name}</span> {l s='is complete.' mod='dibs'} + <br /><br /><span class="bold">{l s='Your order will be sent as soon as possible.' mod='dibs'}</span> + <br /><br />{l s='For any questions or for further information, please contact our' mod='dibs'} <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='dibs'}</a>. + </p> +{else} + <p class="warning"> + {l s='We noticed a problem with your order. If you think this is an error, you can contact our' mod='dibs'} + <a href="{$link->getPageLink('contact', true)}">{l s='customer support' mod='dibs'}</a>. + </p> +{/if} \ No newline at end of file diff --git a/modules/dibs/img/da.jpg b/modules/dibs/img/da.jpg new file mode 100644 index 0000000000000000000000000000000000000000..add78c626da3165e811b75c5f7cb4a47dc38e8b5 GIT binary patch literal 1364 zcmbVMU1-}@6u$D0oH}l5#c2sm%2Xv=VVf;o`B!SZph$KbhP%{B>F826TT&b0=%<oA zJ6T^s3mY2@*7w4imp*js+saBG7Dm}aU&dBCwiOD2?kW3u*yzI=(5{@==^&J`1A=qU zJ>U7xIXdThKYHt6xYX9p0WdxNGUx+4;{6H;sVO&>00u(HJOO~W9@H0H*Wzi~a8fnJ ztg9*6)aiE3qG5`m!Ng?Ss>u!2CF|;W%_vfT-1&+kHKj<M&Q_R;C8`VB@nu_`T|O}< zFE?aPp(bA=C)#{lw{+F5k!^j^aQJqS>ICPJ?we_f?6|m%A|?2&<eQZlQZ#Lq%%+&6 z%;Xp{2U9Se$>;O0k}Lxmnqg_kCSjgWvpmC)+d?5WTRF#9rSdixIu)tyqFSw1s+CTe z_IVm|9OuVi*(CBvI!lIIYbOn7tQ$d69og0_S2GRLk65dlO}9v)Ot(tVtxBaAc-L;} zx?fkv+i|PvP8z#<J9A5xN>^3KY}&Gl+{e0L)Vt>s`Hm<X{ta70Kc%)PnQ~KC4R=~9 zQs^e7XbKOr*=&iO%E27Wmly~IK`IoaTtO6bFw5q+Zj9ZqY$hjV3oOHyN*M@Cj397% zf#aAoCuFBG0^7w-8;)BuWVOqyA>J)4EI${^i?&*GO?%EX7rPTMvtYWWvtU}JIGZI; zYldRB9RKHR)hemB_O7awZBr*Z-Q~4i*f~K=b7?8fW?0Uzx&S4yP|lUgWhtEzMU?p# zR{1|2qfs)nKN`=BO4o$u&sTecj}E=nQ4O>&Hd+ktcQDWycc84H1;o6E;4;8Np-?!4 zhr{?D9DV(LINsMEi$?pS(O5jzk$7xiUwq#{ERh%*N+d={Mn*<o=m{2yME1t^4#(re z2lo^E5B4tptKzKzq7U?gcn~8%fWU$T=G_J8mB4o14qpr77zhOaWekR}Kp2k$EEos} zB0YDE2n+_p08$}5aX>h^a*Z7uA^->lB72^JV}an|K|-L|scHgVSo!3;_4;aP-1`~C z5J`Xt5?~UXx&KY_?DdOp{dVid4gJYS^U=FA#dl6UzJK=ZL$6%^;L{6-HopCS<H+h~ zr(Sw+b+dlhm_PHwz2@knlZ_WYAIGnLeI@e#gAWHUUfTG3V0Lrk@yFL5N>7hnDO;OQ yxiWL&%jwsvOGj>w-x^N**?{jInE#>`Kl<0Po5!8GCu{dsR&W1u^wA~nr+)x%FM)Fa literal 0 HcmV?d00001 diff --git a/modules/dibs/img/en.jpg b/modules/dibs/img/en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72b962fa68b3be1b7052090dbbcfcd50f468cea9 GIT binary patch literal 665 zcmex=<NpH&0WUXCHwH#V1_nkTWcYuZ!I^=Bjg6g+m4ls~os*M;i${c)hnt&6Qb?Fz zL{>^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<<Uft5x!pKI?*u)5A2qPyaCl5D|1TU|I zk)n*E5y{~HAqGJX25trcW=16jCP7AKLB{__7(~HNWk3Qf%phS#kPnan6U+Zw3_Q$? z3`_#d0zl8z9!pLKDwGglU`A8Q$i!?6RLcPrW@Ke5%u1hp>&6$5T1i2m0J53D0AgYh z6b35>nqtqGl9MxOKUS4Mt;{SCl}sR&)6T770xDDy0J@)r8_7^c1|dbINleUw%7%{4 ziA4`TK%K&7&m<nnYq#f%)ap&*2e*rSOX21cVg(u@C&0kO$O7~j954zpC>lBjCLa7y z2=j-%qSx$ap?r1HZl-A|apt<rzx)<|+i;+2K2QNTP#Bnj+69z>=7|deLj-OXn87GG z5$;EU>hRV4KxJZr=s^s$7OV>7KLJKVbD$z=0iYsAWb+sW6&VZ@3m?KACZImo{g!xo jU}>G-T89lMMP^T__vaFDunGJ=O=;pXm%gd@|K9`vunB<J literal 0 HcmV?d00001 diff --git a/modules/dibs/img/no.jpg b/modules/dibs/img/no.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82311e5aea09cc86d45d8145f8cc8f9d7a851f19 GIT binary patch literal 11692 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 literal 0 HcmV?d00001 diff --git a/modules/dibs/img/sv.jpg b/modules/dibs/img/sv.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28f0b03ef3ee0f3d41055c035e487bb96df8a68d GIT binary patch literal 1402 zcmbVMe`p(Z6#riCa!u2;O_~NuJMg%=O=QXa$nxuKR+766OG($H!HNELxx2MzdUx^e zx}@ob2!el!6#p6ua~8+I4Hbn68*@q#bfB>Q<D7_P_>YXr7!&r_`MtDB6v`AI9DKj; zect=L_rC9)^P{s3#tKdK6aX_b&jKIliE|%>gcYf_3J`!n^%MZkHmWVzcAcXr-HM5_ zQB`7+p;1k-PBAf>0#nn?x+v8Yo2V*_s-7kPxb`JUsB)G(nJCi5I<G9L&$movp*2^L zS~V#nlhenDsV3Ld>Y8GUL{nSVEv}g*+rc?_cGVO~v>|paOXgfw;>F@T!5gMRBw}<_ zqLVa{WMWMGXeyODLa;PLQ#4C4Y?MiHah9WLVoylOX3D3yvT%Hl3*NHiUQvxkBi4w= z40DlUGMS7UgJq)-5w%uzTWm&kYqAqTP%Oz*>$Ym>gd0(;8Y^~|gqiM^pw)}TZs2{p zrD<+mZM0>Vm0lYAqOHnmU7^Z~WvrNz0^yS#XV|+Z6S+W`4R^v+;iHJlf+4MFif+#c zSrS@evMO^-B9SPt`6QEMQU#h}aycQL7LsY6PcjKMnd!vX&o|EVahexWOo~Y}Oo7f9 z_@lWzpWyR(Auq5($9G1zY*Ck#4zCJ%_k1Di6MQ+|R7Be_D~7S$nSl8v!#1oXqfYP( z3F4%x%SOX;A7{5#K{3_SihSHOG@{*IPThx{N&j2byT0=O=@<o*q1@5<+o*I@aQ@t5 zcktn*yE=*v_r-*Z;p~8+_P7K2CR{+oxeML^IEG<f4EK8RejI)SJ{<QA1pNL1zdsNR zv?UlA8V(K*1;XLc(Qx>{#Kgpbr@Dgl_4N$~2FHTIvGGVKGTt@(*MoBtgnVEC1W_ae zJRt-PA<iaf0R-v&JKU2OM*!meht3N;D24~24MowO2?=>dP;Ar-@IEpeDZTnSTMhw$ zp;&(p0}u}y8o`*{y0;{Lwf%r(C-M9T@rv#I1Og}m6G1~@8qB_(#P4ogxLjF1qqTnj zw7m8G7vS5GgR%80;d$m!7X9Jj)$_CQ^7WrTzEDVA`flpO%R9l+)=2T}=6mxW-T&2d z>%r;UbIJEh=Qs18yj49X_`pj~9|DtCkjIG=w_h9ldcAb$;4gE;&f#mH-HO~h6Pfkj zxw!ex@FfSt9&cU0dhy*yiO-MR2tT*@%@uMXx^{2z?8CKJj{UaLzwzf{X|48hbNpQO Kg|#=GJAVPiS&%9K literal 0 HcmV?d00001 diff --git a/modules/dibs/it.php b/modules/dibs/it.php new file mode 100644 index 000000000..6c4049832 --- /dev/null +++ b/modules/dibs/it.php @@ -0,0 +1,44 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{dibs}prestashop>dibs_b64af11b4f643164b0b418c716a6f7a0'] = 'Paga con dibs'; +$_MODULE['<{dibs}prestashop>dibs_fda89beb6740540db1053016d96624c3'] = 'logo dibs'; +$_MODULE['<{dibs}prestashop>dibs_eeaf35c1eb180cc38a77b892a96d7ed3'] = 'Paga in modo sicuro e veloce con dibs.'; +$_MODULE['<{dibs}prestashop>dibs_b508edd89d96e13df300b298143998d3'] = 'DIBS'; +$_MODULE['<{dibs}prestashop>dibs_ef3a95ad5c00ef1b4d1d73d2b50bf54c'] = 'DIBS pagamento API'; +$_MODULE['<{dibs}prestashop>dibs_f146cc67c82721f372d15664a9e4a0d6'] = 'Per ragioni di sicurezza devi impostare la chiave n. 1 e n. 2 utilizzate dal controllo MD5 di DIBS API.'; +$_MODULE['<{dibs}prestashop>dibs_94c824556baeddc9d8a31710c38fb045'] = 'Devi impostare il tuo ID commerciante per utilizzare DIBS API.'; +$_MODULE['<{dibs}prestashop>dibs_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{dibs}prestashop>dibs_323d72a644340f9f2152febe46a52259'] = 'Ottieni un account DIBS'; +$_MODULE['<{dibs}prestashop>dibs_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Link'; +$_MODULE['<{dibs}prestashop>dibs_9a6126fa59acab742993a80fa0ca9340'] = 'A seconda della lingua e delle regole del tuo paese, il modulo di sottoscrizione potrebbe essere diverso.'; +$_MODULE['<{dibs}prestashop>dibs_d076f6d79396f176263a61ad3a1fe945'] = 'Clicca sulle bandiere corrette:'; +$_MODULE['<{dibs}prestashop>dibs_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{dibs}prestashop>dibs_794b8837b6ee6ddc4301f557915f9486'] = 'Colore logo'; +$_MODULE['<{dibs}prestashop>dibs_44e1ec6255a91754e4911b16b9fc4d22'] = 'Il colore di base del logo che appare sulla pagina di pagamento.'; +$_MODULE['<{dibs}prestashop>dibs_229a7ec501323b94db7ff3157a7623c9'] = 'ID commerciante'; +$_MODULE['<{dibs}prestashop>dibs_b305acae66879c527cda4c4ded662585'] = 'Vedi l\'e-mail inviata da DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_310fc01b7a8c167aa514ccccc9e46e99'] = 'Chiave di sicurezza n. 1'; +$_MODULE['<{dibs}prestashop>dibs_247cc6885be1cb649d05acf81242cc35'] = 'Chiave di sicurezza n. 2'; +$_MODULE['<{dibs}prestashop>dibs_c7138fc31d63f966e368147a0cd4e55d'] = 'Queste chiavi sono usate per migliorare la sicurezza.'; +$_MODULE['<{dibs}prestashop>dibs_b89642757f7199e37e74dd6a9a333733'] = 'Per ottenere queste chiavi vai all\'interfaccia di amministrazione DIBS e nel menu Integrazione > chiavi MD5 . Assicurati che il controllo MD5 sia attivato, altrimenti il modulo non funzionerà.'; +$_MODULE['<{dibs}prestashop>dibs_f9986472f2190b1ec04c52dd1eca1af4'] = 'Usa il modulo di test DIBS'; +$_MODULE['<{dibs}prestashop>dibs_313ada9ae4162978238c99d505bb6870'] = 'Quando questo campo è dichiarato, la transazione non viene inviata all\'emittente della carta, ma è invece gestita dal modulo di prova DIBS.'; +$_MODULE['<{dibs}prestashop>dibs_41f538d798be040c3710e4e128105ad2'] = 'Per ulteriori informazioni vedi anche la Fase 5 della Guida in 10 Fasi.'; +$_MODULE['<{dibs}prestashop>dibs_9d0ac8297882a62456cd41249c36d9af'] = 'Durante la tua prima integrazione con DIBS, non vi è alcuna necessità di inserire questo parametro, dal momento che tutte le operazioni di default riguarderanno il sistema di test DIBS fino a che DIBS ha approvato l\'integrazione. Qualora il sistema di test fosse utilizzato in un secondo momento, questo sarà attivato a DIBS (contatta il supporto DIBS per riattivare la modalità di prova del tuo negozio) .'; +$_MODULE['<{dibs}prestashop>dibs_58768109d694bef3c059544892118901'] = 'Colore Flexwin '; +$_MODULE['<{dibs}prestashop>dibs_37b0d284e5d29973b385ca537272ec38'] = 'Il tema colore base di FlexWin.'; +$_MODULE['<{dibs}prestashop>dibs_2e2b79996d4fb73bff9b97725ddfbab8'] = 'Url accettato'; +$_MODULE['<{dibs}prestashop>dibs_0e260f9297ec338abbf671829d53c4ae'] = 'L\'URL della pagina da visualizzare se l\'acquisto è approvato.'; +$_MODULE['<{dibs}prestashop>dibs_fcb9c3f1b9731de08442d81583782db7'] = 'Url annullato '; +$_MODULE['<{dibs}prestashop>dibs_491f74497aaca60ae31a327d12d52925'] = 'L\'URL della pagina da visualizzare se il cliente annulla il pagamento.'; +$_MODULE['<{dibs}prestashop>dibs_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine '; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{dibs}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Abbiamo notato un problema con il tuo ordine. Se pensi che sia un errore, contatta la nostra'; + +?> \ No newline at end of file diff --git a/modules/dibs/logo.gif b/modules/dibs/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..f658014e34659b6fed650f64fef8570a4bf771e6 GIT binary patch literal 1654 zcmaJ>dt6gh93O~)Z#3VTU8a@~w%u*O*kqzIUg{J9Q_Iw`UD<-|Ubl<e=pj*Nr9!4= zY7Z@o((;vB<O2}KHW1jHX_CNT<DpYA6k*%Fcil^XeLh9^k8{sCzu))!`~H6CcTPf5 zd=y_2LJOg_(r7q=V+27C7=hyihEsEL@DZeevS1Y!CysmF1nwoUva8M>FK)ipO4>b` z+e>&n1d+bC*ihNn<@MSc?i;O+J*Tb4+NScV=F;l=tiuL3-h~rx*Te3UCAS{9G1=bY zvdVe_!@9k=*GEVXT`|`^D6Y0|JyGjy>uBldbhbZkYV9;w96OKIkV01MC^B0eH|_W8 z?{t(@Hx`_=*;-s1_Fb|%?z%msLQjRI*;wl+t+JafjvEaw>HdpmOS6aYU9N5_tFq%b zUUJKY;qG%L=M#?`_YoM;gAraYju~zCa*H$fm`QisR9@RsQQK~?v|e|(aNO6~)r}FJ z@~Ycp6)slTZ?rwUZSU|AMEj%e3&zGuYm>Rgex=$@a-BCcl-0Bttt}XicRlI3YHQnl z-d1P7cgE1Pr^t%on47@r>Rn_}$+G%<KH9&&P~V6(;$%Q1K_%orI!1>`q?r&3q(d1B zm5|<Xp_mRRWJ3Dt2r(!|Vj;OAF-Hxh<}6Q>=449wGJ4DcAX+ETDG?=vN&uZQOQjL$ zgmj4vPKN~KoZ4p5fnFChQ%GM#82~C~EUbor2qwsof{`E)$!4;-;XEEM4B&ulkOgvB zYz~9X6L2{K5Cr-@IvGtZ+ayR4#rMS`S3<fRMG*murPXSgS}qe-XRz3OKA+;?a2TWq zL!(!r5*<UOnbFT6f;3XK0znn93ZNJz>2NkGq?1bjPC<zb(5f`d-gKB!Sjo~!5Eh#W zQYrO2ipBr$s#FemYtR(vsowu2)}-kXh?N3q;B2)NBHd?Dp%6i=8j_%}It_-i`m2~M zhf!D~hY=t)H3C?zP|0Aerq^3679^=Os6-`&l0-r}iDxPlGC^z{KPoORip!1?foygh z$d3nkQJ_e)m>0o~2<L$PSP?AERzfPYA1ix`4IdOsHG&c$Ba0xlVhbdTSHnu6H(`Nd za4qaX`TDT3!L@J(#j;2-Eb3VQam@W&WbaVZfu<!F18onf$X-{IP3=eCJ<RKI_jEt$ zdi<#K&xaik?%#9Wz0=;-+TwIHH`yB->Tmy1ckB0?H-5WryJof2)>L1usx+I76^8P% zE2SmHmoHts@N3a8Kc7E$_NOzaPn|sR;}6G=eg9qIx8EH7`l};{zx?9!&kh|t@ag_f z_U+yC@$Qcb@^|gr@!<#WZ+~ywyYJ+^oxAm|H{W<YN3YXv$woEm%?PYgW@WynkY{Xy zWYToW#trLVUH8h%YuBuPX;oTk%F5&w%f-u<E=fvEh>sJ+E?%@SW`QtzzJMRai;M{8 za>xtCWQ5I|J7@NbFU*=bgB}VzKmECB&rY2(dD6rQ<DVHfHe}4`Q6onT9~K-GI5c30 zzaNbj>JI3AEyAdgdaY?eMY;OC0DsZqG4iyL!MePBJuPtBsG&pR7X<Dq&<6!9nxmyf zhUhjN(rbrjB>0cqG+TGD;K=6b8~LfDhmR`^4qV5BrqBbl(n6ZwR4|dfewd$M;n1M0 zCGhgKD`P@!!6PQ9<G9hQCYyp5GUqN8&t%Lm)cUK^XU&^59uXF<7_ucZ@>Fta!uE;! z(aRDKJSxrGH<jhgzC(lj^T$d|Ab(rN(s2UCLX#ZH3p56dJrP#IIV#Te%O}&B{}%=V B@p1qF literal 0 HcmV?d00001 diff --git a/modules/dibs/logos/dibs_black.jpg b/modules/dibs/logos/dibs_black.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b3159dab42f6cd8df709ebbda177103e87f587d GIT binary patch literal 1814 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 E7fE^zQ2+n{ literal 0 HcmV?d00001 diff --git a/modules/dibs/logos/dibs_blue.jpg b/modules/dibs/logos/dibs_blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb55d111d57ed28c9bc713ff9ad27742e5a7458e GIT binary patch literal 1953 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 literal 0 HcmV?d00001 diff --git a/modules/dibs/logos/dibs_green.jpg b/modules/dibs/logos/dibs_green.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14a812d820e39681924ef98a0b12756490f2dc08 GIT binary patch literal 1652 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 GgMR{>FrZ=p literal 0 HcmV?d00001 diff --git a/modules/dibs/logos/dibs_grey.jpg b/modules/dibs/logos/dibs_grey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8263d9b33875444682353d699c260f921e6f8ba GIT binary patch literal 1216 zcmex=<NpH&0WUXCHwH#VMg|WcWcdG(LCm!xGmU}4*Ox(yfq{Voh=Jh$Z3brsR%R9! z7G_o;!OF_Y#?HgR4g~z%+?+gu{6a#4{DOkQVlv{wB2uD)f)a`nQnIr0^76vsN-9cn zDl&5Nav(z(fm+$w*!eg(_~b+cMdU~Z{|_(-axfS%L@+ZdF)#@-G7B>PKf)l*z{tSF z4D<y8FtRbTurhG~B@F}^m>5|YnSc&whsZNBF*C5R3MvX2vI#o|iYOTsiY7KrR5o@B zp0x1;P=^>WK#<J>>SAO9StAG(2HJzLg@I8}h{@1V@&7Fb9-ugrAhRHYJ;QIkDNC7P zh^^(L?m7RH(^nkZSjx&C^KMyA>8e9-Rvc`a#2@)++2gZq{}~>MiA{~N>z}^E`ff$` zO|?Fc$6Kas>za2*>eRM1lJm}~C2!L*%M4DJcFmT_{i@ZF8P##xYej;}N4dDO>lU9` zqTms{<o3e1>ra1Pv(vg?AW^yR+iOMMxBF*^xqNaG;9qeyJwNJd*3v@#_wN>eOtU&> zS(<C&b8fEkB<Ae7`4_^CqW>)Ud8c(v<qn;s#s){7%yWM`MQ$2w4_Y}>r!QWb=}x~u zWc<qm25U06{oT24dgrF_4fi8%+`4l#^&{iV=Tn%(<K}$)&%l+lYmLdO)jhiwX8egv zS7zL>FQ(q`+q!pr)w_FQjP5%>jS;B29zUP`t7z(}i0;<RPjZgaTwMECd)&HtH|u!* zrR{y2&#e`f75Mwb{QTbB7|ZP^e!i9I=@s|8SiX4II=4^vo){U;-u+^d=9Y;rCQGt^ zt%};1yR~f6E%p4B6NG;Ut(NqzK9i>XF}r5%V<VA#)!T(HJ7lfCJ)3Gic~jwe-+1mP z=|__1U8}M4ax>ceR>A5b^ZmDxpUcB%{?7P#?Z)gI%%_$<oo6>SK<lp8u0IFohra3E zbNtwhl|hnH5)TW`iA;^3x_j1>7+0P+rIX(EExY&ixyuFi2{}BTm-R8=_)_nTxx6oe zKAHu5D!3JU%S7Tn&;97ThO$B?u1=rNTYp=(zvJ;v$G#t{+4gU7xq4_xZJu=O!FQJb z8A30%Yc6Sgnlj}M!$BqaQ*q{-_f_}j9h;PTGr(}0=8kCrl8rWPRu|qLnl+<)YT<td zh7?5`{mDA+@`n@8{|s$Dxb1q_4vxe<VV;ahg1c8uKCrT1=Yp|oS<fYfR}+rS;{McT zx99uXH?>Em8=h2N;Gm+lK=y;_>+g3}W_s5dp1Cd@w@1+T$tn$%FHN4Naq~VT>wOZ4 znYkcSdi4sI$aI$S`^&eM-^zIVsc6gD3+p9bs$X07?$_0|si8ByjRY9(tA}QazS$Rc zTeDGOx5|!b&jO`Z{dD2uP@kWt8MfLX?2>5WA^|3QuaL{Olc!mwF4c@qS*q#y_+<BQ z&-<%i%Km*FuhIFV^m2)QK;r?c=do&2*8EsISxSs2&{MW==Sr85fEBA&Su>budhJ_q bYVB7I`@#TahcZFO-$7I4R(gfX|Gx<Ulc?u1 literal 0 HcmV?d00001 diff --git a/modules/dibs/logos/dibs_purple.jpg b/modules/dibs/logos/dibs_purple.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e312b8b1f153a053bce726170d2a1dd48e6d55f GIT binary patch literal 1952 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 literal 0 HcmV?d00001 diff --git a/modules/dibs/logos/dibs_yellow.jpg b/modules/dibs/logos/dibs_yellow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93de6e2059dd1bda88d3393b6b799ff6d681ae2a GIT binary patch literal 1670 zcmb7<eN>Wp7Jz>*FE3EJ;tPr<1Zr5KP7IobO^r(97iDR|=;-RCHkLc%2Wn!Om1nes zOcIqTowl*WnanVf#<ZQ2mQ8*%ez2txrmn6~ewA4|p&LuPf9&p```mNyIrrRqpL4GH ziFp**@Pk5w00coG#1g>#H$Vx@NlpSFEDX2<00@?}VAg}}0D-YsER0wRf*?4&6#;L7 zxN6l3E0jngp+poVQ)u>NTSq$-b#QiYT(gG3V36%ym@afCjn1HdkU*AGJPvP7AXw9F zQCs@|jky(|1mFdtV8{hvPzXjLb332`2tbJCi~oRwFfbOu6D(7<4ZuKH2>t-_uMNu# zU=h?AN8*qJM7CZLb}sRhwfVfga`l|$z!3r%_<w8wi-8dc_d$jN2!jJK4*9nVSXvao zSdudb35dXvUA*E;y+!%`uWYN;ZFkL2ffa1Ap)d;kz|w|tr48@DGI+}vv!(k8S?r*t zk5(5^M=Ez0H-<2?&Qw%{Vtq%a460^wK&h!b-w<^Adf{v9#m~1bmp$-|(Cv%~B$inJ zGUdwi_aN^bWB$ze`;(J}ziY;g)F@-JXS|rH4!Du`A~LGIPj{a@)hvMd{c?ih?6vEK z1A~;}M?dY}wd3*XtM<2LpU~WIoLh?45l{HZ42=`1N6H}E$i?$+?3rJ}<-yOfPK<Q_ zdS<p{<&Spjc<n#u{>AfIl&8Y9z4k=mqWE;nf$4s>GTqCUdaI>-wM?24-AmR;p8AQP zB4f;gU00Rscef^K6*Y&ajvn3AgIRI8c$%><<Z2!Fjf7cypJbo((X*z^aI4|l6E=aQ zfi<o7=KtE{Oy&#hS>?YajK-)RDSZFH-HQpT+IP%X)gYWm`=KLoZb2OW<R9Tlxe|Zp zLo>Y$le_w<d+s_`NVr=Q-F`F0idQtU$I;b<wD>#SHg0X|G=qb3ZS`z(O;C=ht1B3e zw-UV{|NRPa_fXu>m{XNA@p49hb<5zlZDz1GsOr+#rMk4NudcXW+*CSS;o;kVur6hD zc9jZ0vV>t}G-Q^UGB>J!Rf{J#4fMQ?E{$GLzBw&QzqV>q(eW)*<9v*GL&}Zg;d3E# zn%Jtq;gZFOoZ+vR6?+nM&z|J|sNHU({dmyy{_9VQ1TH&USEfcpP`}}@&n56y%A>A> z;~ekCY=w3;b#^~?d9s4st&bZ^AF0<TvCm)T-1*_<EzLuG>K&T4?xz`{A2GZls={?A zp<gtJ?`v1S(v`IdE)f>a>?-XXiWkX}MFm|QhNQd)sfRA%jbn|*m+Th#z}DDW$M-{9 z>$E#WjD$LArB)RTzGnqG)~!%H95|IKv+?Qh&h3*?7Q|@%1&vWPM`n^VoYqM#;u^Vd zr))HmWN?U|JX+sOLuQuuglwafU|L0;BaHh;kO<kI6#ZMMeODf5=aD7C>8U#`>|x#) zCD!orxO__Luz8(6GiSbDLy1&`rJa7U^UO`XmnlQz%6q-J#|-TBlR2|z6F+UB={z>d zB136;vy7&WPlNs5#&W$(JH+SZNzKq*9#@hx-1Bbf)OcIX`C5Th3P07Z9Jg;*QRX!w z&Dqe1-g`lk$b6)Cvrga(hSoT7#NE>g4&Da&MQeEa&pEmt7xwx$`n3ep4$nW9_-XE4 zd?)y>dM3@&ltD-n%Kf7X(%fraxvLFvxPuLe2TJi-wHx~ap48{{yq`HPeV&-QzeO4v zi-DX4;AMVwCyg!+dsXRpSQtAg*Z@xQG1Sk7^aI|-_l0|F-Gw!YNauRpxNUFdwk7>N zZhoSF`vQ)6v9fq5t~kuVAAa5o^Cy-HTn9!`<FOHGsb((bD?{>#I?iW?dH8W`?%Bp% z-_rG;C-DGy9a8JDU-H78oD$7%`hLGR_nWM=NOXnA^_waJqmr}wx1^6Uo^9b!(4p=_ zZW6mZ3Vd=;=z6_W@M|YucekG4;)7+RvO<K}VYIN&3txO(0e~jj;lKr5@0T^P9+JxR z2o_h|bF5!cuFQ4lDrE7UijNieO+Q!^=UwhK8g9;`4@|N81$KH<x^?qlveILnxa~`$ zTQXfl4dQm=+?1!jRRym7><lJID&2}W+A4k7<BW!PQsKn%Tj`Cfd0oVgI>I<U!3RH9 Tu6j7%dLi(Ul66kyXV(1_!h5ip literal 0 HcmV?d00001 diff --git a/modules/dibs/validation.php b/modules/dibs/validation.php new file mode 100644 index 000000000..b493bb323 --- /dev/null +++ b/modules/dibs/validation.php @@ -0,0 +1,47 @@ +<?php + +include(dirname(__FILE__). '/../../config/config.inc.php'); +include(dirname(__FILE__).'/dibs.php'); + +$posted_values = array(); +$errors = array(); +$obj_dibs = new dibs(); +$required_fields = array('orderid', 'paytype', 'transact', 'merchant', 'uniqueoid', 'amount', 'currency', 'authkey'); +$valid_order = true; +if (count($_POST)) +{ + $posted_values = $_POST; + + foreach ($required_fields AS $field) + if (!isset($posted_values[$field])) + $errors[] = 'Missing field '.$field; + + $secure_cart = explode('_', $posted_values['uniqueoid']); + $arr_order_id = explode('_',$posted_values['orderid']); + $posted_values['orderid'] = $arr_order_id[0]; + + if ((string)$posted_values['merchant'] !== (string)dibs::$ID_MERCHANT) + $errors[] = Tools::displayError('You did not use the correct merchant ID.'); + + $md5_key = md5(dibs::$MORE_SETTINGS['k2'].md5(dibs::$MORE_SETTINGS['k1'].'transact='.$posted_values['transact'].'&amount='.$posted_values['amount'].'&currency='.$posted_values['currency'])); + if((string)$posted_values['authkey'] !== $md5_key) + $errors[] = Tools::displayError('Your are not allowed to validate the command for security reasons.'); + + $message = ''; + foreach ($posted_values AS $key => $value) + if (is_string($value) AND in_array($key, $required_fields) AND $key !== 'HTTP_COOKIE') + $message .= $key.': '.$value."\n"; + if (sizeof($errors)) + { + $message .= sizeof($errors).' error(s):'."\n"; + $valid_order = false; + } + + foreach ($errors AS $error) + $message .= $error."\n"; + $message = nl2br(strip_tags($message)); + if ($valid_order === true) + $obj_dibs->validateOrder((int)$posted_values['orderid'], _PS_OS_PAYMENT_, (float)((int)$posted_values['amount'] / 100), $obj_dibs->displayName, $message, array(), NULL, false, $secure_cart[2]); + if ($valid_order === false) + $obj_dibs->validateOrder((int)$posted_values['orderid'], _PS_OS_ERROR_, 0, $obj_dibs->displayName, $message, array(), NULL, false, $secure_cart[2]); +} \ No newline at end of file diff --git a/modules/ebay/ajax/changeCategoryMatch.php b/modules/ebay/ajax/changeCategoryMatch.php new file mode 100755 index 000000000..2c0e089f7 --- /dev/null +++ b/modules/ebay/ajax/changeCategoryMatch.php @@ -0,0 +1,35 @@ +<?php + +$configPath = '../../../config/config.inc.php'; +if (file_exists($configPath)) +{ + include('../../../config/config.inc.php'); + if (!Tools::getValue('token') || Tools::getValue('token') != Configuration::get('EBAY_SECURITY_TOKEN')) + die('ERROR :X'); + + $levelExists = array(); + for ($i = 0; $i <= 5; $i++) + if ($_GET['level'] >= $i) + { + if ($i == 0) + $eBayCategoryListLevel = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category` WHERE `level` = 1 AND `id_category_ref` = `id_category_ref_parent`'); + else + $eBayCategoryListLevel = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category` WHERE `level` = '.(int)($i + 1).' AND `id_category_ref_parent` IN (SELECT `id_category_ref` FROM `'._DB_PREFIX_.'ebay_category` WHERE `id_ebay_category` = '.(int)($_GET['level'.$i]).')'); + if ($eBayCategoryListLevel) + { + $levelExists[$i + 1] = true; + echo '<select name="category'.(int)$_GET['id_category'].'" id="categoryLevel'.(int)($i + 1).'-'.(int)$_GET['id_category'].'" rel="'.(int)$_GET['id_category'].'" style="font-size: 12px; width: 160px;" OnChange="changeCategoryMatch('.(int)($i + 1).', '.(int)$_GET['id_category'].');"> + <option value="0">'.('No category selected').'</option>'; + foreach ($eBayCategoryListLevel as $ec) + echo '<option value="'.(int)$ec['id_ebay_category'].'" '.((isset($_GET['level'.($i + 1)]) && $_GET['level'.($i + 1)] == $ec['id_ebay_category']) ? 'selected="selected"' : '').'>'.$ec['name'].($ec['is_multi_sku'] == 1 ? ' *' : '').'</option>'; + echo '</select> '; + } + } + + if (!isset($levelExists[$_GET['level'] + 1])) + echo '<input type="hidden" name="category'.(int)$_GET['id_category'].'" value="'.(int)$_GET['level'.$_GET['level']].'" />'; + +} +else + echo 'ERROR'; + diff --git a/modules/ebay/ajax/checkToken.php b/modules/ebay/ajax/checkToken.php new file mode 100755 index 000000000..6eca754d7 --- /dev/null +++ b/modules/ebay/ajax/checkToken.php @@ -0,0 +1,31 @@ +<?php + +$configPath = '../../../config/config.inc.php'; +if (file_exists($configPath)) +{ + include('../../../config/config.inc.php'); + if (!Tools::getValue('token') || Tools::getValue('token') != Configuration::get('EBAY_SECURITY_TOKEN')) + die('ERROR :X'); + + if (file_exists(dirname(__FILE__).'/../eBayRequest.php')) + { + include(dirname(__FILE__).'/../eBayRequest.php'); + + $ebay = new eBayRequest(); + $ebay->session = Configuration::get('EBAY_API_SESSION'); + $ebay->username = Configuration::get('EBAY_API_USERNAME'); + $ebay->fetchToken(); + if (!empty($ebay->token)) + { + Configuration::updateValue('EBAY_API_TOKEN', $ebay->token); + echo 'OK'; + } + else + echo 'KO'; + } + else + echo 'ERROR02'; +} +else + echo 'ERROR01'; + diff --git a/modules/ebay/ajax/getNbProductsSync.php b/modules/ebay/ajax/getNbProductsSync.php new file mode 100755 index 000000000..6d79ba3d9 --- /dev/null +++ b/modules/ebay/ajax/getNbProductsSync.php @@ -0,0 +1,21 @@ +<?php + +$configPath = '../../../config/config.inc.php'; +if (file_exists($configPath)) +{ + include('../../../config/config.inc.php'); + if (!Tools::getValue('token') || Tools::getValue('token') != Configuration::get('EBAY_SECURITY_TOKEN')) + die('ERROR :X'); + + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category_configuration', array('sync' => (int)($_GET['action'])), 'UPDATE', '`id_category` = '.(int)$_GET['id_category']); + + $nbProducts = Db::getInstance()->getValue(' + SELECT COUNT(`id_product`) as nb + FROM `'._DB_PREFIX_.'product` + WHERE `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_ebay_category` > 0 AND `sync` = 1)'); + + echo $nbProducts; +} +else + echo 'ERROR'; + diff --git a/modules/ebay/ajax/loadCategoryMatch.php b/modules/ebay/ajax/loadCategoryMatch.php new file mode 100755 index 000000000..17478633c --- /dev/null +++ b/modules/ebay/ajax/loadCategoryMatch.php @@ -0,0 +1,54 @@ +<?php + +$configPath = '../../../config/config.inc.php'; +if (file_exists($configPath)) +{ + include('../../../config/config.inc.php'); + if (!Tools::getValue('token') || Tools::getValue('token') != Configuration::get('EBAY_SECURITY_TOKEN')) + die('ERROR :X'); + + $currentPath = Db::getInstance()->getRow(' + SELECT ecc.`id_ebay_category`, ec.`id_category_ref`, ec.`id_category_ref_parent`, ec.`level` + FROM `'._DB_PREFIX_.'ebay_category_configuration` ecc + LEFT JOIN `'._DB_PREFIX_.'ebay_category` ec ON (ec.`id_ebay_category` = ecc.`id_ebay_category`) + WHERE ecc.`id_category` = '.(int)$_GET['id_category']); + + $_GET['level'] = $currentPath['level']; + $_GET['level'.($currentPath['level'])] = $currentPath['id_ebay_category']; + for ($levelStart = $currentPath['level']; $levelStart > 1; $levelStart--) + { + $currentPath = Db::getInstance()->getRow(' + SELECT ec.`id_ebay_category`, ec.`id_category_ref`, ec.`id_category_ref_parent`, ec.`level` + FROM `'._DB_PREFIX_.'ebay_category` ec + LEFT JOIN `'._DB_PREFIX_.'ebay_category_configuration` ecc ON (ecc.`id_ebay_category` = ec.`id_ebay_category`) + WHERE ec.`id_category_ref` = '.(int)$currentPath['id_category_ref_parent']); + $_GET['level'.($levelStart - 1)] = $currentPath['id_ebay_category']; + } + + + $levelExists = array(); + for ($i = 0; $i <= 5; $i++) + if ($_GET['level'] >= $i) + { + if ($i == 0) + $eBayCategoryListLevel = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category` WHERE `level` = 1 AND `id_category_ref` = `id_category_ref_parent`'); + else + $eBayCategoryListLevel = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category` WHERE `level` = '.(int)($i + 1).' AND `id_category_ref_parent` IN (SELECT `id_category_ref` FROM `'._DB_PREFIX_.'ebay_category` WHERE `id_ebay_category` = '.(int)($_GET['level'.$i]).')'); + if ($eBayCategoryListLevel) + { + $levelExists[$i + 1] = true; + echo '<select name="category'.(int)$_GET['id_category'].'" id="categoryLevel'.(int)($i + 1).'-'.(int)$_GET['id_category'].'" rel="'.(int)$_GET['id_category'].'" style="font-size: 12px; width: 160px;" OnChange="changeCategoryMatch('.(int)($i + 1).', '.(int)$_GET['id_category'].');"> + <option value="0">'.('No category selected').'</option>'; + foreach ($eBayCategoryListLevel as $ec) + echo '<option value="'.(int)$ec['id_ebay_category'].'" '.((isset($_GET['level'.($i + 1)]) && $_GET['level'.($i + 1)] == $ec['id_ebay_category']) ? 'selected="selected"' : '').'>'.$ec['name'].($ec['is_multi_sku'] == 1 ? ' *' : '').'</option>'; + echo '</select> '; + } + } + + if (!isset($levelExists[$_GET['level'] + 1])) + echo '<input type="hidden" name="category'.(int)$_GET['id_category'].'" value="'.(int)$_GET['level'.$_GET['level']].'" />'; + +} +else + echo 'ERROR'; + diff --git a/modules/ebay/config.xml b/modules/ebay/config.xml new file mode 100755 index 000000000..0b1ac42ef --- /dev/null +++ b/modules/ebay/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>ebay</name> + <displayName><![CDATA[eBay]]></displayName> + <version><![CDATA[1.1]]></version> + <description><![CDATA[Open your shop on the eBay market place !]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[market_place]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/ebay/de.php b/modules/ebay/de.php new file mode 100644 index 000000000..6ba454605 --- /dev/null +++ b/modules/ebay/de.php @@ -0,0 +1,46 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ebay}prestashop>ebay_282539987a2276dd5259f8e745d668a1'] = 'eBay'; +$_MODULE['<{ebay}prestashop>ebay_1179327c010f54ade46baea3c3b0ceec'] = 'Eröffnen Sie Ihren Shop auf eBay'; +$_MODULE['<{ebay}prestashop>ebay_7ba7cc1dfb00eca77b600084f4ba1304'] = 'eBay Benutzer ID'; +$_MODULE['<{ebay}prestashop>ebay_3225a10b07f1580f10dee4abc3779e6c'] = 'Parameter'; +$_MODULE['<{ebay}prestashop>ebay_dc2f736ed903b4f6f72a36b763cd7717'] = 'Kategorien Einstellungen'; +$_MODULE['<{ebay}prestashop>ebay_0f5f872ba4c6575319e6beee6ebcc481'] = 'Templateverwaltung'; +$_MODULE['<{ebay}prestashop>ebay_47ba6504eb5b1e3a95ea3dbd960904db'] = 'eBay Sync'; +$_MODULE['<{ebay}prestashop>ebay_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Hilfe'; +$_MODULE['<{ebay}prestashop>ebay_ad44bf098615279532ded210754420d4'] = 'Ihre Produkte auf eBay'; +$_MODULE['<{ebay}prestashop>ebay_4b9f5155cc88fe352fbf202a3ba57f04'] = 'eBay Shop'; +$_MODULE['<{ebay}prestashop>ebay_3e0fb5fcfe85cdf0f83fefe3530d13f4'] = 'Ihr Shop auf eBay'; +$_MODULE['<{ebay}prestashop>ebay_97b4fc969316e8d08c1b0bb1f0b05fbd'] = 'Ihr eBay Shop Name'; +$_MODULE['<{ebay}prestashop>ebay_552a0d8c17d95d5dbdc0c28217024f5a'] = 'Versandkosten'; +$_MODULE['<{ebay}prestashop>ebay_ce178f4fe9684e5786aff36ab3cf81f6'] = 'PLZ des Shops'; +$_MODULE['<{ebay}prestashop>ebay_8f6fa0b72376c388d15c877e9efb558a'] = 'Die Postleitzahl Ihres Shops'; +$_MODULE['<{ebay}prestashop>ebay_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{ebay}prestashop>ebay_153e4104f5a42e006735dd85847760b1'] = 'Laden der Kategorien'; +$_MODULE['<{ebay}prestashop>ebay_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{ebay}prestashop>ebay_b9284bff13acffdd879ef4ac7fca5234'] = 'Einstellungen fehlerhaft'; +$_MODULE['<{ebay}prestashop>ebay_36be9eda23888bf12f74d6cd9d46ba1d'] = 'Kategorien vorschlagen'; +$_MODULE['<{ebay}prestashop>ebay_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{ebay}prestashop>ebay_649829dea8fe9632cc51a9aa3c8826c3'] = 'eBay Kategorie'; +$_MODULE['<{ebay}prestashop>ebay_233c543a23378c4ffd0e1efb17408510'] = 'Auswirkung auf den Preis'; +$_MODULE['<{ebay}prestashop>ebay_a5612305bb46e3d0ea547f4a963a01d3'] = 'Keine Kategorien gefunden'; +$_MODULE['<{ebay}prestashop>ebay_55ac32003f11f511412875f283f4f303'] = 'Keine Kategorien ausgewählt'; +$_MODULE['<{ebay}prestashop>ebay_549454516da11bb8fa2d28b04b5aaca6'] = 'Sie können die Vorlage für Ihre Produkte anpassen'; +$_MODULE['<{ebay}prestashop>ebay_1cbd8f2b57c85344f755caff03336306'] = 'Mit eBay synchronisieren'; +$_MODULE['<{ebay}prestashop>ebay_86024cad1e83101d97359d7351051156'] = 'Produkte'; +$_MODULE['<{ebay}prestashop>ebay_3205b263a1a779c2b03cdbac836346f9'] = 'Erinnerung,'; +$_MODULE['<{ebay}prestashop>ebay_0eaf4172db11a5d6e914aabe920f0455'] = 'Sie zahlen keine Versandkosten, wenn Sie über eBay verkaufen'; +$_MODULE['<{ebay}prestashop>ebay_25740d6b53eafdd8a64299e1fe92f247'] = 'Sync Modus'; +$_MODULE['<{ebay}prestashop>ebay_97855df0367fedf5648d745bfb57412b'] = 'Option A'; +$_MODULE['<{ebay}prestashop>ebay_2c53ffc482419e404cd47559e5004b2e'] = 'Alle Produkte mit eBay synchronisieren'; +$_MODULE['<{ebay}prestashop>ebay_8890755ccd5ac4f777efdd0a6c16c4ab'] = 'Option B'; +$_MODULE['<{ebay}prestashop>ebay_4ac5ebfcb9b9d8c87e9ff03ee6bf24e5'] = 'Nur Produkte aus ausgewählten Kategorien synchronisieren'; +$_MODULE['<{ebay}prestashop>ebay_e0626222614bdee31951d84c64e5e9ff'] = 'Auswählen'; +$_MODULE['<{ebay}prestashop>ebay_caab0e2c2f3ae0d242b0b36f22d9acc5'] = 'Sie ziehen'; +$_MODULE['<{ebay}prestashop>ebay_70b240eb3db5174e1c9520cabe2ae781'] = 'Produkte auf eBay'; +$_MODULE['<{ebay}prestashop>ebay_054b4f3ea543c990f6b125f41af6ebf7'] = 'Option'; +$_MODULE['<{ebay}prestashop>ebay_547c708291fe196592dd1e4db7b206a5'] = 'Produkkt(e) mit eBay synchronisiert'; + +?> \ No newline at end of file diff --git a/modules/ebay/eBayRequest.php b/modules/ebay/eBayRequest.php new file mode 100755 index 000000000..b4d7cf76e --- /dev/null +++ b/modules/ebay/eBayRequest.php @@ -0,0 +1,1047 @@ +<?php + +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +class eBayRequest +{ + public $response; + public $token; + public $expiration; + + public $runame; + public $username; + public $session; + + public $itemID; + public $fees; + public $error; + public $errorCode; + + private $devID; + private $appID; + private $certID; + + private $siteID; + private $apiUrl; + private $apiCall; + + private $loginUrl; + + private $findingUrl; + private $findingVersion; + + private $compatibilityLevel; + + + + /******************************************************************/ + /** Constructor And Request Methods *******************************/ + /******************************************************************/ + + + public function __construct($apiCall = '') + { + /*** SAND BOX PARAMS ***/ + /* + $this->devID = '1db92af1-2824-4c45-8343-dfe68faa0280'; + $this->appID = 'Prestash-2629-4880-ba43-368352aecc86'; + $this->certID = '6bd3f4bd-3e21-41e8-8164-7ac733218122'; + $this->siteID = 71; + + $this->apiUrl = 'https://api.sandbox.ebay.com/ws/api.dll'; + $this->apiCall = $apiCall; + $this->compatibilityLevel = 719; + + $this->runame = 'Prestashop-Prestash-2629-4-hpehxegu'; + + $this->loginURL = 'https://signin.sandbox.ebay.com/ws/eBayISAPI.dll'; + */ + + $this->devID = '1db92af1-2824-4c45-8343-dfe68faa0280'; + $this->appID = 'Prestash-70a5-419b-ae96-f03295c4581d'; + $this->certID = '71d26dc9-b36b-4568-9bdb-7cb8af16ac9b'; + $this->siteID = 71; + + $this->apiUrl = 'https://api.ebay.com/ws/api.dll'; + $this->apiCall = $apiCall; + $this->compatibilityLevel = 719; + + $this->runame = 'Prestashop-Prestash-70a5-4-pepwa'; + + $this->loginURL = 'https://signin.ebay.com/ws/eBayISAPI.dll'; + } + + + public function makeRequest($request) + { + // Init + $connection = curl_init(); + curl_setopt($connection, CURLOPT_URL, $this->apiUrl); + + // Stop CURL from verifying the peer's certificate + curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0); + + // Set the headers + curl_setopt($connection, CURLOPT_HTTPHEADER, $this->buildHeaders()); + + // Set method as POST + curl_setopt($connection, CURLOPT_POST, 1); + + // Set the XML body of the request + curl_setopt($connection, CURLOPT_POSTFIELDS, $request); + + // Set it to return the transfer as a string from curl_exec + curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1); + + // Send the Request + $response = curl_exec($connection); + + // Close the connection + curl_close($connection); + + // Return the response + return $response; + } + + + private function buildHeaders() + { + $headers = array ( + // Regulates versioning of the XML interface for the API + 'X-EBAY-API-COMPATIBILITY-LEVEL: '.$this->compatibilityLevel, + + // Set the keys + 'X-EBAY-API-DEV-NAME: '.$this->devID, + 'X-EBAY-API-APP-NAME: '.$this->appID, + 'X-EBAY-API-CERT-NAME: '.$this->certID, + + // The name of the call we are requesting + 'X-EBAY-API-CALL-NAME: '.$this->apiCall, + + //SiteID must also be set in the Request's XML + //SiteID = 0 (US) - UK = 3, Canada = 2, Australia = 15, .... + //SiteID Indicates the eBay site to associate the call with + 'X-EBAY-API-SITEID: '.$this->siteID, + ); + + return $headers; + } + + + /******************************************************************/ + /** Authentication Methods ****************************************/ + /******************************************************************/ + + + function fetchToken() + { + // Set Api Call + $this->apiCall = 'FetchToken'; + + $requestXml = '<?xml version="1.0" encoding="utf-8" ?>'; + $requestXml .= '<FetchTokenRequest xmlns="urn:ebay:apis:eBLBaseComponents">'; + $requestXml .= '<RequesterCredentials><Username>'.$this->username.'</Username></RequesterCredentials>'; + $requestXml .= '<SessionID>'.$this->session.'</SessionID>'; + $requestXml .= '</FetchTokenRequest>'; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Saving Datas // Need to cast token var to string (not SimpleXML element) to persist in SESSION + $this->response = simplexml_load_string($responseXml); + $this->token = (string)$this->response->eBayAuthToken; + $this->expiration = $this->response->HardExpirationTime; + } + + function getLoginUrl() + { + return $this->loginURL; + } + + function login() + { + // Set Api Call + $this->apiCall = 'GetSessionID'; + + ///Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8" ?>'; + $requestXml .= '<GetSessionIDRequest xmlns="urn:ebay:apis:eBLBaseComponents">'; + $requestXml .= '<Version>'.$this->compatibilityLevel.'</Version>'; + $requestXml .= '<RuName>'.$this->runame.'</RuName>'; + $requestXml .= '</GetSessionIDRequest>'; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + $this->response = simplexml_load_string($responseXml); + $this->session = (string)$this->response->SessionID; + } + + + /******************************************************************/ + /** Retrieve Categories Methods ***********************************/ + /******************************************************************/ + + + function saveCategories() + { + // Set Api Call + $this->apiCall = 'GetCategories'; + + ///Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'; + $requestXml .= '<GetCategories xmlns="urn:ebay:apis:eBLBaseComponents">'; + $requestXml .= '<Version>'.$this->compatibilityLevel.'</Version>'; + $requestXml .= '<RequesterCredentials>'; + $requestXml .= '<eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'; + $requestXml .= '</RequesterCredentials>'; + $requestXml .= '<CategorySiteID>'.$this->siteID.'</CategorySiteID>'; + $requestXml .= '<DetailLevel>ReturnAll</DetailLevel>'; + $requestXml .= '<LevelLimit>5</LevelLimit>'; + $requestXml .= '<ViewAllNodes>true</ViewAllNodes>'; + $requestXml .= '</GetCategories>'; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Load xml in array + $this->response = simplexml_load_string($responseXml); + + // Load categories multi sku compliant + $categoriesMultiSkuCompliant = $this->GetCategoryFeatures('VariationsEnabled'); + + // Save categories + foreach ($this->response->CategoryArray->Category as $cat) + { + $category = array(); + foreach ($cat as $key => $value) + $category[(string)$key] = (string)$value; + $category['IsMultiSku'] = 0; + if (isset($categoriesMultiSkuCompliant[$category['CategoryID']])) + $category['IsMultiSku'] = 1; + + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category', array('id_category_ref' => pSQL($category['CategoryID']), 'id_category_ref_parent' => pSQL($category['CategoryParentID']), 'id_country' => '8', 'level' => pSQL($category['CategoryLevel']), 'is_multi_sku' => pSQL($category['IsMultiSku']), 'name' => pSQL($category['CategoryName'])), 'INSERT'); + } + + // Return + return true; + } + + function GetCategoryFeatures($featureID) + { + // Set Api Call + $this->apiCall = 'GetCategoryFeatures'; + + ///Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<GetCategoryFeatures xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= ' <DetailLevel>ReturnAll</DetailLevel>'."\n"; + $requestXml .= ' <FeatureID>'.$featureID.'</FeatureID>'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <Version>'.$this->compatibilityLevel.'</Version>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <ViewAllNodes>true</ViewAllNodes>'."\n"; + $requestXml .= '</GetCategoryFeatures>'."\n"; + + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + + // Load xml in array + $categoriesFeatures = array(); + $response = simplexml_load_string($responseXml); + + if ($featureID == 'VariationsEnabled') + { + foreach ($response->Category as $cat) + if ($cat->VariationsEnabled == true) + $categoriesFeatures[(string)$cat->CategoryID] = true; + } + else + return array(); + + return $categoriesFeatures; + } + + function getSuggestedCategories($query) + { + // Set Api Call + $this->apiCall = 'GetSuggestedCategories'; + + ///Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<GetSuggestedCategoriesRequest xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <Version>'.$this->compatibilityLevel.'</Version>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <Query>'.substr(strtolower($query), 0, 350).'</Query>'."\n"; + $requestXml .= '</GetSuggestedCategoriesRequest>'."\n"; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Load xml in array + $response = simplexml_load_string($responseXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + if (isset($response->SuggestedCategoryArray->SuggestedCategory[0]->Category->CategoryID)) + return (int)$response->SuggestedCategoryArray->SuggestedCategory[0]->Category->CategoryID; + return 0; + } + + + + + /******************************************************************/ + /** Add Product Methods *******************************************/ + /******************************************************************/ + + + function addFixedPriceItem($datas = array()) + { + // Check data + if (!$datas) + return false; + + // Set Api Call + $this->apiCall = 'AddFixedPriceItem'; + + // Without variations + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<AddFixedPriceItem xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <Item>'."\n"; + $requestXml .= ' <SKU>prestashop-'.$datas['id_product'].'</SKU>'; + $requestXml .= ' <Title>'.substr($datas['name'], 0, 55).'</Title>'."\n"; + if (isset($datas['pictures'])) + { + $requestXml .= ' <PictureDetails>'."\n"; + $requestXml .= ' <GalleryType>Gallery</GalleryType>'."\n"; + foreach ($datas['pictures'] as $picture) + $requestXml .= ' <PictureURL>'.$picture.'</PictureURL>'."\n"; + $requestXml .= ' </PictureDetails>'."\n"; + } + $requestXml .= ' <Description><![CDATA['.$datas['description'].']]></Description>'."\n"; + $requestXml .= ' <PrimaryCategory>'."\n"; + $requestXml .= ' <CategoryID>'.$datas['categoryId'].'</CategoryID>'."\n"; + $requestXml .= ' </PrimaryCategory>'."\n"; + $requestXml .= ' <ConditionID>1000</ConditionID>'."\n"; + $requestXml .= ' <StartPrice>'.$datas['price'].'</StartPrice>'."\n"; + $requestXml .= ' <CategoryMappingAllowed>true</CategoryMappingAllowed>'."\n"; + $requestXml .= ' <Country>FR</Country>'."\n"; + $requestXml .= ' <Currency>EUR</Currency>'."\n"; + $requestXml .= ' <DispatchTimeMax>3</DispatchTimeMax>'."\n"; + $requestXml .= ' <ListingDuration>GTC</ListingDuration>'."\n"; + $requestXml .= ' <ListingType>FixedPriceItem</ListingType>'."\n"; + $requestXml .= ' <PaymentMethods>PayPal</PaymentMethods>'."\n"; + $requestXml .= ' <PayPalEmailAddress>'.Configuration::get('EBAY_PAYPAL_EMAIL').'</PayPalEmailAddress>'."\n"; + $requestXml .= ' <PostalCode>'.Configuration::get('EBAY_SHOP_POSTALCODE').'</PostalCode>'."\n"; + $requestXml .= ' <Quantity>'.$datas['quantity'].'</Quantity>'."\n"; + $requestXml .= ' <ItemSpecifics>'."\n"; + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>Etat</Name>'."\n"; + $requestXml .= ' <Value>Neuf</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>Marque</Name>'."\n"; + $requestXml .= ' <Value>'.$datas['brand'].'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + if (isset($datas['attributes'])) + foreach ($datas['attributes'] as $name => $value) + { + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>'.$name.'</Name>'."\n"; + $requestXml .= ' <Value>'.$value.'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + } + $requestXml .= ' </ItemSpecifics>'."\n"; + $requestXml .= ' <ShippingDetails>'."\n"; + $requestXml .= ' <ShippingServiceOptions>'."\n"; + $requestXml .= ' <ShippingServicePriority>1</ShippingServicePriority>'."\n"; + $requestXml .= ' <ShippingService>'.$datas['shippingService'].'</ShippingService>'."\n"; + $requestXml .= ' <FreeShipping>false</FreeShipping>'."\n"; + $requestXml .= ' <ShippingServiceCost currencyID="EUR">'.$datas['shippingCost'].'</ShippingServiceCost>'."\n"; + $requestXml .= ' </ShippingServiceOptions>'."\n"; + $requestXml .= ' </ShippingDetails>'."\n"; + $requestXml .= ' <Site>France</Site>'."\n"; + $requestXml .= ' </Item>'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= '</AddFixedPriceItem>'."\n"; + + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Loading XML tree in array + $this->response = simplexml_load_string($responseXml); + + + // Checking Errors + $this->error = ''; + $this->errorCode = ''; + if (isset($this->response->Errors) && isset($this->response->Ack) && (string)$this->response->Ack != 'Success' && (string)$this->response->Ack != 'Warning') + foreach ($this->response->Errors as $e) + { + // if product no longer on eBay, we log the error code + if ((int)$e->ErrorCode == 291) + $this->errorCode = (int)$e->ErrorCode; + + // We log error message + if ($e->SeverityCode == 'Error') + { + if ($this->error != '') + $this->error .= '<br />'; + $this->error .= (string)$e->LongMessage; + if (isset($e->ErrorParameters->Value)) + $this->error .= '<br />'.(string)$e->ErrorParameters->Value; + } + } + + // Checking Success + $this->itemID = 0; + if (isset($this->response->Ack) && ((string)$this->response->Ack == 'Success' || (string)$this->response->Ack == 'Warning')) + { + $this->fees = 0; + $this->itemID = (string)$this->response->ItemID; + if (isset($this->response->Fees->Fee)) + foreach ($this->response->Fees->Fee as $f) + $this->fees += (float)$f->Fee; + } + else if ($this->error == '') + $this->error = 'Sorry, technical problem, try again later.'; + + if (!empty($this->error)) + return false; + return true; + } + + + function reviseFixedPriceItem($datas = array()) + { + // Check data + if (!$datas) + return false; + + // Set Api Call + $this->apiCall = 'ReviseFixedPriceItem'; + + + // Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<ReviseFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <Item>'."\n"; + $requestXml .= ' <ItemID>'.$datas['itemID'].'</ItemID>'."\n"; + $requestXml .= ' <SKU>prestashop-'.$datas['id_product'].'</SKU>'; + $requestXml .= ' <Quantity>'.$datas['quantity'].'</Quantity>'."\n"; + $requestXml .= ' <StartPrice>'.$datas['price'].'</StartPrice>'."\n"; + if (Configuration::get('EBAY_SYNC_OPTION_RESYNC') != 1) + { + $requestXml .= ' <Title>'.substr($datas['name'], 0, 55).'</Title>'."\n"; + $requestXml .= ' <Description><![CDATA['.$datas['description'].']]></Description>'."\n"; + $requestXml .= ' <ShippingDetails>'."\n"; + $requestXml .= ' <ShippingServiceOptions>'."\n"; + $requestXml .= ' <ShippingServicePriority>1</ShippingServicePriority>'."\n"; + $requestXml .= ' <ShippingService>'.$datas['shippingService'].'</ShippingService>'."\n"; + $requestXml .= ' <FreeShipping>false</FreeShipping>'."\n"; + $requestXml .= ' <ShippingServiceCost currencyID="EUR">'.$datas['shippingCost'].'</ShippingServiceCost>'."\n"; + $requestXml .= ' </ShippingServiceOptions>'."\n"; + $requestXml .= ' </ShippingDetails>'."\n"; + } + $requestXml .= ' </Item>'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= '</ReviseFixedPriceItemRequest>'."\n"; + + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Loading XML tree in array + $this->response = simplexml_load_string($responseXml); + + // Checking Errors + $this->error = ''; + $this->errorCode = ''; + if (isset($this->response->Errors) && isset($this->response->Ack) && (string)$this->response->Ack != 'Success' && (string)$this->response->Ack != 'Warning') + foreach ($this->response->Errors as $e) + { + // if product no longer on eBay, we log the error code + if ((int)$e->ErrorCode == 291) + $this->errorCode = (int)$e->ErrorCode; + + // We log error message + if ($e->SeverityCode == 'Error') + { + if ($this->error != '') + $this->error .= '<br />'; + $this->error .= (string)$e->LongMessage; + if (isset($e->ErrorParameters->Value)) + $this->error .= '<br />'.(string)$e->ErrorParameters->Value; + } + } + + // Checking Success + $this->itemID = 0; + if (isset($this->response->Ack) && ((string)$this->response->Ack == 'Success' || (string)$this->response->Ack == 'Warning')) + { + $this->fees = 0; + $this->itemID = (string)$this->response->ItemID; + if (isset($this->response->Fees->Fee)) + foreach ($this->response->Fees->Fee as $f) + $this->fees += (float)$f->Fee; + } + else if ($this->error == '') + $this->error = 'Sorry, technical problem, try again later.'; + + if (!empty($this->error)) + return false; + return true; + } + + + + + + + + + + + function addFixedPriceItemMultiSku($datas = array()) + { + // Check data + if (!$datas) + return false; + + // Set Api Call + $this->apiCall = 'AddFixedPriceItem'; + + // Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<AddFixedPriceItem xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <Item>'."\n"; + $requestXml .= ' <Country>FR</Country>'."\n"; + $requestXml .= ' <Currency>EUR</Currency>'."\n"; + $requestXml .= ' <Description>'."\n"; + $requestXml .= ' <![CDATA['.$datas['description'].']]>'."\n"; + $requestXml .= ' </Description>'."\n"; + $requestXml .= ' <ConditionID>1000</ConditionID>'."\n"; + $requestXml .= ' <DispatchTimeMax>3</DispatchTimeMax>'."\n"; + $requestXml .= ' <ListingDuration>GTC</ListingDuration>'."\n"; + $requestXml .= ' <ListingType>FixedPriceItem</ListingType>'."\n"; + $requestXml .= ' <PaymentMethods>PayPal</PaymentMethods>'."\n"; + $requestXml .= ' <PayPalEmailAddress>'.Configuration::get('EBAY_PAYPAL_EMAIL').'</PayPalEmailAddress>'."\n"; + $requestXml .= ' <PostalCode>'.Configuration::get('EBAY_SHOP_POSTALCODE').'</PostalCode>'."\n"; + $requestXml .= ' <PrimaryCategory>'."\n"; + $requestXml .= ' <CategoryID>'.$datas['categoryId'].'</CategoryID>'."\n"; + $requestXml .= ' </PrimaryCategory>'."\n"; + $requestXml .= ' <Title>'.substr($datas['name'], 0, 55).'</Title>'."\n"; + if (isset($datas['pictures'])) + { + $requestXml .= '<PictureDetails>'; + foreach ($datas['pictures'] as $picture) + $requestXml .= '<PictureURL>'.$picture.'</PictureURL>'."\n"; + $requestXml .= '</PictureDetails>'; + } + $requestXml .= ' <ItemSpecifics>'."\n"; + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>Etat</Name>'."\n"; + $requestXml .= ' <Value>Neuf</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>Marque</Name>'."\n"; + $requestXml .= ' <Value>'.$datas['brand'].'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + $requestXml .= ' </ItemSpecifics>'."\n"; + $requestXml .= ' <Variations>'."\n"; + if (isset($datas['variations'])) + { + // Generate Variations Set + $requestXml .= ' <VariationSpecificsSet>'."\n"; + foreach ($datas['variationsList'] as $group => $v) + { + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>'.$group.'</Name>'."\n"; + foreach ($v as $attr => $val) + $requestXml .= ' <Value>'.$attr.'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + } + $requestXml .= ' </VariationSpecificsSet>'."\n"; + + // Generate Variations + foreach ($datas['variations'] as $key => $variation) + { + $requestXml .= ' <Variation>'."\n"; + $requestXml .= ' <SKU>prestashop-'.$key.'</SKU>'."\n"; + $requestXml .= ' <StartPrice>'.$variation['price'].'</StartPrice>'."\n"; + $requestXml .= ' <Quantity>'.$variation['quantity'].'</Quantity>'."\n"; + $requestXml .= ' <VariationSpecifics>'."\n"; + foreach ($variation['variations'] as $v) + { + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>'.$v['name'].'</Name>'."\n"; + $requestXml .= ' <Value>'.$v['value'].'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + } + $requestXml .= ' </VariationSpecifics>'."\n"; + $requestXml .= ' </Variation>'."\n"; + } + + // Generate Pictures Variations + $lastSpecificName = ''; + $attributeUsed = array(); + $requestXml .= ' <Pictures>'."\n"; + foreach ($datas['variations'] as $key => $variation) + foreach ($variation['variations'] as $kv => $v) + if (!isset($attributeUsed[md5($v['name'].$v['value'])]) && isset($variation['pictures'][$kv])) + { + if ($lastSpecificName != $v['name']) + $requestXml .= ' <VariationSpecificName>'.$v['name'].'</VariationSpecificName>'."\n"; + $requestXml .= ' <VariationSpecificPictureSet>'."\n"; + $requestXml .= ' <VariationSpecificValue>'.$v['value'].'</VariationSpecificValue>'."\n"; + $requestXml .= ' <PictureURL>'.$variation['pictures'][$kv].'</PictureURL>'."\n"; + $requestXml .= ' </VariationSpecificPictureSet>'."\n"; + $attributeUsed[md5($v['name'].$v['value'])] = true; + $lastSpecificName = $v['name']; + } + $requestXml .= ' </Pictures>'."\n"; + } + $requestXml .= ' </Variations>'."\n"; + $requestXml .= ' <ShippingDetails>'."\n"; + $requestXml .= ' <ShippingServiceOptions>'."\n"; + $requestXml .= ' <ShippingServicePriority>1</ShippingServicePriority>'."\n"; + $requestXml .= ' <ShippingService>'.$datas['shippingService'].'</ShippingService>'."\n"; + $requestXml .= ' <FreeShipping>false</FreeShipping>'."\n"; + $requestXml .= ' <ShippingServiceCost currencyID="EUR">'.$datas['shippingCost'].'</ShippingServiceCost>'."\n"; + $requestXml .= ' </ShippingServiceOptions>'."\n"; + $requestXml .= ' </ShippingDetails>'."\n"; + $requestXml .= ' <Site>France</Site>'."\n"; + $requestXml .= ' </Item>'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= '</AddFixedPriceItem>'."\n"; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Loading XML tree in array + $this->response = simplexml_load_string($responseXml); + + // Checking Errors + $this->error = ''; + $this->errorCode = ''; + if (isset($this->response->Errors) && isset($this->response->Ack) && (string)$this->response->Ack != 'Success' && (string)$this->response->Ack != 'Warning') + foreach ($this->response->Errors as $e) + { + // if product no longer on eBay, we log the error code + if ((int)$e->ErrorCode == 291) + $this->errorCode = (int)$e->ErrorCode; + + // We log error message + if ($e->SeverityCode == 'Error') + { + if ($this->error != '') + $this->error .= '<br />'; + $this->error .= (string)$e->LongMessage; + if (isset($e->ErrorParameters->Value)) + $this->error .= '<br />'.(string)$e->ErrorParameters->Value; + } + } + + // Checking Success + $this->itemID = 0; + if (isset($this->response->Ack) && ((string)$this->response->Ack == 'Success' || (string)$this->response->Ack == 'Warning')) + { + $this->fees = 0; + $this->itemID = (string)$this->response->ItemID; + if (isset($this->response->Fees->Fee)) + foreach ($this->response->Fees->Fee as $f) + $this->fees += (float)$f->Fee; + } + else if ($this->error == '') + $this->error = 'Sorry, technical problem, try again later.'; + + if (!empty($this->error)) + return false; + return true; + } + + + function reviseFixedPriceItemMultiSku($datas = array()) + { + // Check data + if (!$datas) + return false; + + // Set Api Call + $this->apiCall = 'ReviseFixedPriceItem'; + + // Build the request Xml string + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<ReviseFixedPriceItem xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <Item>'."\n"; + $requestXml .= ' <ItemID>'.$datas['itemID'].'</ItemID>'."\n"; + $requestXml .= ' <Country>FR</Country>'."\n"; + $requestXml .= ' <Currency>EUR</Currency>'."\n"; + $requestXml .= ' <ConditionID>1000</ConditionID>'."\n"; + $requestXml .= ' <DispatchTimeMax>3</DispatchTimeMax>'."\n"; + $requestXml .= ' <ListingDuration>GTC</ListingDuration>'."\n"; + $requestXml .= ' <ListingType>FixedPriceItem</ListingType>'."\n"; + $requestXml .= ' <PaymentMethods>PayPal</PaymentMethods>'."\n"; + $requestXml .= ' <PayPalEmailAddress>'.Configuration::get('EBAY_PAYPAL_EMAIL').'</PayPalEmailAddress>'."\n"; + $requestXml .= ' <PostalCode>'.Configuration::get('EBAY_SHOP_POSTALCODE').'</PostalCode>'."\n"; + $requestXml .= ' <PrimaryCategory>'."\n"; + $requestXml .= ' <CategoryID>'.$datas['categoryId'].'</CategoryID>'."\n"; + $requestXml .= ' </PrimaryCategory>'."\n"; + if (isset($datas['pictures'])) + { + $requestXml .= '<PictureDetails>'; + foreach ($datas['pictures'] as $picture) + $requestXml .= '<PictureURL>'.$picture.'</PictureURL>'."\n"; + $requestXml .= '</PictureDetails>'; + } + $requestXml .= ' <ItemSpecifics>'."\n"; + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>Etat</Name>'."\n"; + $requestXml .= ' <Value>Neuf</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>Marque</Name>'."\n"; + $requestXml .= ' <Value>'.$datas['brand'].'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + $requestXml .= ' </ItemSpecifics>'."\n"; + $requestXml .= ' <Variations>'."\n"; + if (isset($datas['variations'])) + { + // Generate Variations Set + $requestXml .= ' <VariationSpecificsSet>'."\n"; + foreach ($datas['variationsList'] as $group => $v) + { + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>'.$group.'</Name>'."\n"; + foreach ($v as $attr => $val) + $requestXml .= ' <Value>'.$attr.'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + } + $requestXml .= ' </VariationSpecificsSet>'."\n"; + + // Generate Variations + foreach ($datas['variations'] as $key => $variation) + { + $requestXml .= ' <Variation>'."\n"; + $requestXml .= ' <SKU>prestashop-'.$key.'</SKU>'."\n"; + $requestXml .= ' <StartPrice>'.$variation['price'].'</StartPrice>'."\n"; + $requestXml .= ' <Quantity>'.$variation['quantity'].'</Quantity>'."\n"; + $requestXml .= ' <VariationSpecifics>'."\n"; + foreach ($variation['variations'] as $v) + { + $requestXml .= ' <NameValueList>'."\n"; + $requestXml .= ' <Name>'.$v['name'].'</Name>'."\n"; + $requestXml .= ' <Value>'.$v['value'].'</Value>'."\n"; + $requestXml .= ' </NameValueList>'."\n"; + } + $requestXml .= ' </VariationSpecifics>'."\n"; + $requestXml .= ' </Variation>'."\n"; + } + + // Generate Pictures Variations + $lastSpecificName = ''; + $attributeUsed = array(); + $requestXml .= ' <Pictures>'."\n"; + foreach ($datas['variations'] as $key => $variation) + foreach ($variation['variations'] as $kv => $v) + if (!isset($attributeUsed[md5($v['name'].$v['value'])]) && isset($variation['pictures'][$kv])) + { + if ($lastSpecificName != $v['name']) + $requestXml .= ' <VariationSpecificName>'.$v['name'].'</VariationSpecificName>'."\n"; + $requestXml .= ' <VariationSpecificPictureSet>'."\n"; + $requestXml .= ' <VariationSpecificValue>'.$v['value'].'</VariationSpecificValue>'."\n"; + $requestXml .= ' <PictureURL>'.$variation['pictures'][$kv].'</PictureURL>'."\n"; + $requestXml .= ' </VariationSpecificPictureSet>'."\n"; + $attributeUsed[md5($v['name'].$v['value'])] = true; + $lastSpecificName = $v['name']; + } + $requestXml .= ' </Pictures>'."\n"; + } + + $requestXml .= ' </Variations>'."\n"; + if (Configuration::get('EBAY_SYNC_OPTION_RESYNC') != 1) + { + $requestXml .= ' <Title>'.substr($datas['name'], 0, 55).'</Title>'."\n"; + $requestXml .= ' <Description>'."\n"; + $requestXml .= ' <![CDATA['.$datas['description'].']]>'."\n"; + $requestXml .= ' </Description>'."\n"; + $requestXml .= ' <ShippingDetails>'."\n"; + $requestXml .= ' <ShippingServiceOptions>'."\n"; + $requestXml .= ' <ShippingServicePriority>1</ShippingServicePriority>'."\n"; + $requestXml .= ' <ShippingService>'.$datas['shippingService'].'</ShippingService>'."\n"; + $requestXml .= ' <FreeShipping>false</FreeShipping>'."\n"; + $requestXml .= ' <ShippingServiceCost currencyID="EUR">'.$datas['shippingCost'].'</ShippingServiceCost>'."\n"; + $requestXml .= ' </ShippingServiceOptions>'."\n"; + $requestXml .= ' </ShippingDetails>'."\n"; + } + $requestXml .= ' <Site>France</Site>'."\n"; + $requestXml .= ' </Item>'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= '</ReviseFixedPriceItem>'."\n"; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Loading XML tree in array + $this->response = simplexml_load_string($responseXml); + + // Checking Errors + $this->error = ''; + $this->errorCode = ''; + if (isset($this->response->Errors) && isset($this->response->Ack) && (string)$this->response->Ack != 'Success' && (string)$this->response->Ack != 'Warning') + foreach ($this->response->Errors as $e) + { + // if product no longer on eBay, we log the error code + if ((int)$e->ErrorCode == 291) + $this->errorCode = (int)$e->ErrorCode; + + // We log error message + if ($e->SeverityCode == 'Error') + { + if ($this->error != '') + $this->error .= '<br />'; + $this->error .= (string)$e->LongMessage; + if (isset($e->ErrorParameters->Value)) + $this->error .= '<br />'.(string)$e->ErrorParameters->Value; + } + } + + // Checking Success + $this->itemID = 0; + if (isset($this->response->Ack) && ((string)$this->response->Ack == 'Success' || (string)$this->response->Ack == 'Warning')) + { + $this->fees = 0; + $this->itemID = (string)$this->response->ItemID; + if (isset($this->response->Fees->Fee)) + foreach ($this->response->Fees->Fee as $f) + $this->fees += (float)$f->Fee; + } + else if ($this->error == '') + $this->error = 'Sorry, technical problem, try again later.'; + + if (!empty($this->error)) + return false; + return true; + } + + + /******************************************************************/ + /** Order Methods *************************************************/ + /******************************************************************/ + + + + function getOrders($CreateTimeFrom, $CreateTimeTo) + { + // Check data + if (!$CreateTimeFrom || !$CreateTimeTo) + return false; + + // Set Api Call + $this->apiCall = 'GetOrders'; + + // Without variations + $requestXml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + $requestXml .= '<GetOrdersRequest xmlns="urn:ebay:apis:eBLBaseComponents">'."\n"; + $requestXml .= ' <DetailLevel>ReturnAll</DetailLevel>'."\n"; + $requestXml .= ' <ErrorLanguage>fr_FR</ErrorLanguage>'."\n"; + $requestXml .= ' <WarningLevel>High</WarningLevel>'."\n"; + $requestXml .= ' <CreateTimeFrom>'.$CreateTimeFrom.'</CreateTimeFrom>'."\n"; + $requestXml .= ' <CreateTimeTo>'.$CreateTimeTo.'</CreateTimeTo>'."\n"; + $requestXml .= ' <OrderRole>Seller</OrderRole>'."\n"; + $requestXml .= ' <RequesterCredentials>'."\n"; + $requestXml .= ' <eBayAuthToken>'.Configuration::get('EBAY_API_TOKEN').'</eBayAuthToken>'."\n"; + $requestXml .= ' </RequesterCredentials>'."\n"; + $requestXml .= '</GetOrdersRequest>'."\n"; + + // Send the request and get response + $responseXml = $this->makeRequest($requestXml); + if (stristr($responseXml, 'HTTP 404') || $responseXml == '') + { + $this->error = 'Error sending '.$this->apiCall.' request'; + return false; + } + + // Loading XML tree in array + $this->response = simplexml_load_string($responseXml); + + + // Checking Errors + $this->error = ''; + if (isset($this->response->Errors) && isset($this->response->Ack) && (string)$this->response->Ack != 'Success' && (string)$this->response->Ack != 'Warning') + foreach ($this->response->Errors as $e) + { + if ($this->error != '') + $this->error .= '<br />'; + $this->error .= (string)$e->LongMessage; + } + + // Checking Success + $orderList = array(); + if (isset($this->response->OrderArray)) + foreach ($this->response->OrderArray->Order as $order) + { + $name = explode(' ', (string)$order->ShippingAddress->Name); + $itemList = array(); + foreach ($order->TransactionArray->Transaction as $transaction) + { + $id_product = 0; + $id_attribute = 0; + $quantity = (string)$transaction->QuantityPurchased; + if (isset($transaction->item->SKU)) + { + $tmp = explode('-', (string)$transaction->item->SKU); + $id_product = $tmp[1]; + } + if (isset($transaction->Variation->SKU)) + { + $tmp = explode('-', (string)$transaction->Variation->SKU); + $id_product = $tmp[1]; + $id_product_attribute = $tmp[2]; + } + if ($id_product > 0) + $itemList[] = array('id_product' => $id_product, 'id_product_attribute' => $id_product_attribute, 'quantity' => $quantity, 'price' => (string)$transaction->TransactionPrice); + } + + $orderList[] = array( + 'id_order_ref' => (string)$order->OrderID, + 'amount' => (string)$order->AmountPaid, + 'status' => (string)$order->CheckoutStatus->Status, + 'date' => substr((string)$order->CreatedTime, 0, 10).' '.substr((string)$order->CreatedTime, 11, 8), + 'name' => (string)$order->ShippingAddress->Name, + 'firstname' => $name[0], + 'familyname' => $name[1], + 'address1' => (string)$order->ShippingAddress->Street1, + 'address2' => (string)$order->ShippingAddress->Street2, + 'city' => (string)$order->ShippingAddress->CityName, + 'state' => (string)$order->ShippingAddress->StateOrProvince, + 'country_iso_code' => (string)$order->ShippingAddress->Country, + 'country_name' => (string)$order->ShippingAddress->CountryName, + 'phone' => (string)$order->ShippingAddress->Phone, + 'postalcode' => (string)$order->ShippingAddress->PostalCode, + 'shippingService' => (string)$order->ShippingServiceSelected->ShippingService, + 'shippingServiceCost' => (string)$order->ShippingServiceSelected->ShippingServiceCost, + 'email' => (string)$order->TransactionArray->Transaction[0]->Buyer->Email, + 'product_list' => $itemList, + 'object' => $order + ); + } + + return $orderList; + } + + +} + + + +class eBayPayment extends PaymentModule +{ + +} + + diff --git a/modules/ebay/ebay.gif b/modules/ebay/ebay.gif new file mode 100755 index 0000000000000000000000000000000000000000..569d63e3ed8f6c621afcf2fb8de371e2e60af7bb GIT binary patch literal 2871 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 literal 0 HcmV?d00001 diff --git a/modules/ebay/ebay.php b/modules/ebay/ebay.php new file mode 100755 index 000000000..db761f5b1 --- /dev/null +++ b/modules/ebay/ebay.php @@ -0,0 +1,1710 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 1.4 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +// Loading eBay Class Request +if (file_exists(dirname(__FILE__).'/eBayRequest.php')) + require_once(dirname(__FILE__).'/eBayRequest.php'); + + +// Checking compatibility with older PrestaShop and fixing it +if (!defined('_MYSQL_ENGINE_')) + define('_MYSQL_ENGINE_', 'MyISAM'); + + +class Ebay extends Module +{ + private $_html = ''; + private $_postErrors = array(); + private $_shippingMethod = array(); + private $_webserviceTestResult = ''; + private $_webserviceError = ''; + private $_fieldsList = array(); + private $_moduleName = 'ebay'; + private $id_lang; + + + /******************************************************************/ + /** Construct Method **********************************************/ + /******************************************************************/ + + public function __construct() + { + global $cookie; + + $this->name = 'ebay'; + $this->tab = 'market_place'; + $this->version = '1.1'; + parent::__construct (); + $this->displayName = $this->l('eBay'); + $this->description = $this->l('Open your shop on the eBay market place !'); + $this->id_lang = Language::getIdByIso('fr'); + + // Check the country and ask the bypass if not 'fr' + if (strtolower(Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT'))) != 'fr' && !isset($cookie->ebay_country_default_fr)) + { + $this->warning = $this->l('eBay module currently works only for eBay.fr'); + return false; + } + + // Checking Extension + if (!extension_loaded('curl') || !ini_get('allow_url_fopen')) + { + if (!extension_loaded('curl') && !ini_get('allow_url_fopen')) + $this->warning = $this->l('You must enable cURL extension and allow_url_fopen option on your server if you want to use this module.'); + else if (!extension_loaded('curl')) + $this->warning = $this->l('You must enable cURL extension on your server if you want to use this module.'); + else if (!ini_get('allow_url_fopen')) + $this->warning = $this->l('You must enable allow_url_fopen option on your server if you want to use this module.'); + return false; + } + + // Checking compatibility with older PrestaShop and fixing it + if (!Configuration::get('PS_SHOP_DOMAIN')) + Configuration::updateValue('PS_SHOP_DOMAIN', $_SERVER['HTTP_HOST']); + + // Generate eBay Security Token if not exists + if (!Configuration::get('EBAY_SECURITY_TOKEN')) + Configuration::updateValue('EBAY_SECURITY_TOKEN', Tools::passwdGen(30)); + + // Check if installed + if (self::isInstalled($this->name)) + { + // Generate warnings + if (!Configuration::get('EBAY_API_TOKEN')) + $this->warning = $this->l('You must register your module on eBay.'); + + // Shipping methods + $this->_shippingMethod = array( + 7104 => array('description' => 'Colissimo', 'shippingService' => 'FR_ColiposteColissimo', 'shippingServiceID' => '7104'), + 7112 => array('description' => 'Ecopli', 'shippingService' => 'FR_Ecopli', 'shippingServiceID' => '7112'), + 57104 => array('description' => 'La Poste - Courrier International Prioritaire', 'shippingService' => 'FR_LaPosteInternationalPriorityCourier', 'shippingServiceID' => '57104'), + 7101 => array('description' => 'Lettre', 'shippingService' => 'FR_PostOfficeLetter', 'shippingServiceID' => '7101'), + 57105 => array('description' => 'La Poste - Courrier International Economique', 'shippingService' => 'FR_LaPosteInternationalEconomyCourier', 'shippingServiceID' => '57105'), + 57106 => array('description' => 'La Poste - Colissimo International', 'shippingService' => 'FR_LaPosteColissimoInternational', 'shippingServiceID' => '57106'), + 7102 => array('description' => 'Lettre avec suivi', 'shippingService' => 'FR_PostOfficeLetterFollowed', 'shippingServiceID' => '7102'), + 57107 => array('description' => 'La Poste - Colis Economique International', 'shippingService' => 'FR_LaPosteColisEconomiqueInternational', 'shippingServiceID' => '57107'), + 7103 => array('description' => 'Lettre recommand&eacute;e', 'shippingService' => 'FR_PostOfficeLetterRecommended', 'shippingServiceID' => '7103'), + 7121 => array('description' => 'Lettre Max', 'shippingService' => 'FR_LaPosteLetterMax', 'shippingServiceID' => '7121'), + 7113 => array('description' => 'Coli&eacute;co', 'shippingService' => 'FR_Colieco', 'shippingServiceID' => '7113'), + 57108 => array('description' => 'La Poste - Colissimo Emballage International', 'shippingService' => 'FR_LaPosteColissimoEmballageInternational', 'shippingServiceID' => '57108'), + 57114 => array('description' => 'Chronopost Express International', 'shippingService' => 'FR_ChronopostExpressInternational', 'shippingServiceID' => '57114'), + 7106 => array('description' => 'Colissimo Recommand&eacute;', 'shippingService' => 'FR_ColiposteColissimoRecommended', 'shippingServiceID' => '7106'), + 57109 => array('description' => 'Chronopost Classic International', 'shippingService' => 'FR_ChronopostClassicInternational', 'shippingServiceID' => '57109'), + 57110 => array('description' => 'Chronopost Premium International', 'shippingService' => 'FR_ChronopostPremiumInternational', 'shippingServiceID' => '57110'), + 7117 => array('description' => 'Chronopost - Chrono Relais', 'shippingService' => 'FR_ChronopostChronoRelais', 'shippingServiceID' => '7117'), + 57111 => array('description' => 'UPS Standard', 'shippingService' => 'FR_UPSStandardInternational', 'shippingServiceID' => '57111'), + 7111 => array('description' => 'Autre mode d\'envoi de courrier', 'shippingService' => 'FR_Autre', 'shippingServiceID' => '7111'), + 57112 => array('description' => 'UPS Express', 'shippingService' => 'FR_UPSExpressInternational', 'shippingServiceID' => '57112'), + 7114 => array('description' => 'Autre mode d\'envoi de colis', 'shippingService' => 'FR_AuteModeDenvoiDeColis', 'shippingServiceID' => '7114'), + 57113 => array('description' => 'DHL', 'shippingService' => 'FR_DHLInternational', 'shippingServiceID' => '57113'), + 57101 => array('description' => 'Frais de livraison internationale fixes', 'shippingService' => 'FR_StandardInternational', 'shippingServiceID' => '57101'), + 7116 => array('description' => 'Chronopost', 'shippingService' => 'FR_Chronopost', 'shippingServiceID' => '7116'), + 57102 => array('description' => 'Frais fixes pour livraison internationale express', 'shippingService' => 'FR_ExpeditedInternational', 'shippingServiceID' => '57102'), + 57103 => array('description' => 'Autres livraisons internationales (voir description)', 'shippingService' => 'FR_OtherInternational', 'shippingServiceID' => '57103'), + 7118 => array('description' => 'Chrono 10', 'shippingService' => 'FR_Chrono10', 'shippingServiceID' => '7118'), + 7119 => array('description' => 'Chrono 13', 'shippingService' => 'FR_Chrono13', 'shippingServiceID' => '7119'), + 7120 => array('description' => 'Chrono 18', 'shippingService' => 'FR_Chrono18', 'shippingServiceID' => '7120'), + 7105 => array('description' => 'Coliposte - Colissimo Direct', 'shippingService' => 'FR_ColiposteColissimoDirect', 'shippingServiceID' => '7105'), + 7107 => array('description' => 'Chronoposte - Chrono Classic International', 'shippingService' => 'FR_ChronoposteInternationalClassic', 'shippingServiceID' => '7107'), + 7108 => array('description' => 'DHL - Express Europack', 'shippingService' => 'FR_DHLExpressEuropack', 'shippingServiceID' => '7108'), + 7109 => array('description' => 'UPS - Standard', 'shippingService' => 'FR_UPSStandard', 'shippingServiceID' => '7109'), + ); + } + } + + + /******************************************************************/ + /** Install / Uninstall Methods ***********************************/ + /******************************************************************/ + + public function install() + { + global $cookie; + + // Install SQL + include(dirname(__FILE__).'/sql-install.php'); + foreach ($sql as $s) + if (!Db::getInstance()->Execute($s)) + return false; + + // Install Module + if (!parent::install() || + !$this->registerHook('addproduct') || + !$this->registerHook('updateproduct') || + !$this->registerHook('updateProductAttribute') || + !$this->registerHook('deleteproduct') || + !$this->registerHook('newOrder') || + !$this->registerHook('backOfficeTop') || + !$this->registerHook('backOfficeFooter') || + !$this->registerHook('header') || + !$this->registerHook('updateOrderStatus')) + return false; + + // Generate Product Template + $content = file_get_contents(dirname(__FILE__).'/template/ebay.tpl'); + $content = str_replace('{SHOP_NAME}', Configuration::get('PS_SHOP_NAME'), $content); + $content = str_replace('{SHOP_URL}', 'http://'.Configuration::get('PS_SHOP_DOMAIN').'/'.__PS_BASE_URI__.'/', $content); + $content = str_replace('{MODULE_URL}', 'http://'.Configuration::get('PS_SHOP_DOMAIN').'/'.__PS_BASE_URI__.'/modules/ebay/', $content); + Configuration::updateValue('EBAY_PRODUCT_TEMPLATE', ''); + Configuration::updateValue('EBAY_PRODUCT_TEMPLATE', $content, true); + + // Init + Configuration::updateValue('EBAY_VERSION', $this->version); + + return true; + } + + public function uninstall() + { + global $cookie; + + // Uninstall Config + foreach ($this->_fieldsList as $keyConfiguration => $name) + if (!Configuration::deleteByName($keyConfiguration)) + return false; + + // Uninstall SQL + include(dirname(__FILE__).'/sql-uninstall.php'); + foreach ($sql as $s) + if (!Db::getInstance()->Execute($s)) + return false; + Configuration::deleteByName('EBAY_API_SESSION'); + Configuration::deleteByName('EBAY_API_USERNAME'); + Configuration::deleteByName('EBAY_API_TOKEN'); + Configuration::deleteByName('EBAY_IDENTIFIER'); + Configuration::deleteByName('EBAY_SHOP'); + Configuration::deleteByName('EBAY_PAYPAL_EMAIL'); + Configuration::deleteByName('EBAY_SHIPPING_CARRIER_ID'); + Configuration::deleteByName('EBAY_SHIPPING_COST'); + Configuration::deleteByName('EBAY_SHIPPING_COST_CURRENCY'); + Configuration::deleteByName('EBAY_SHOP_POSTALCODE'); + Configuration::deleteByName('EBAY_CATEGORY_LOADED'); + Configuration::deleteByName('EBAY_CATEGORY_LOADED_DATE'); + Configuration::deleteByName('EBAY_PRODUCT_TEMPLATE'); + Configuration::deleteByName('EBAY_SYNC_MODE'); + Configuration::deleteByName('EBAY_ORDER_LAST_UPDATE'); + Configuration::deleteByName('EBAY_VERSION'); + Configuration::deleteByName('EBAY_SECURITY_TOKEN'); + + // Uninstall Module + if (!parent::uninstall() || + !$this->unregisterHook('addproduct') || + !$this->unregisterHook('updateproduct') || + !$this->unregisterHook('updateProductAttribute') || + !$this->unregisterHook('deleteproduct') || + !$this->unregisterHook('newOrder') || + !$this->unregisterHook('backOfficeTop') || + !$this->unregisterHook('backOfficeFooter') || + !$this->unregisterHook('header') || + !$this->unregisterHook('updateOrderStatus')) + return false; + + // Clean Cookie + $cookie->eBaySession = ''; + $cookie->eBayUsername = ''; + + return true; + } + + + /******************************************************************/ + /** Hook Methods **************************************************/ + /******************************************************************/ + + public function hookNewOrder($params) + { + if ((int)$params['cart']->id < 1) + return false; + + $sql = '`id_product` IN (SELECT `id_product` FROM `'._DB_PREFIX_.'cart_product` WHERE `id_cart` = '.(int)$params['cart']->id.')'; + if (Configuration::get('EBAY_SYNC_MODE') == 'A') + { + // Retrieve product list for eBay (which have matched categories) AND Send each product on eBay + $productsList = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE '.$sql.' AND `active` = 1 AND `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` > 0 AND `id_ebay_category` > 0)'); + if ($productsList) + $this->_syncProducts($productsList); + } + else if (Configuration::get('EBAY_SYNC_MODE') == 'B') + { + // Select the sync Categories and Retrieve product list for eBay (which have matched and sync categories) AND Send each product on eBay + $productsList = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE '.$sql.' AND `active` = 1 AND `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` > 0 AND `id_ebay_category` > 0 AND `sync` = 1)'); + if ($productsList) + $this->_syncProducts($productsList); + } + + } + + public function hookaddproduct($params) + { + if (!isset($params['product']->id)) + return false; + $id_product = $params['product']->id; + if ((int)$id_product < 1) + return false; + + if (Configuration::get('EBAY_SYNC_MODE') == 'A') + { + // Retrieve product list for eBay (which have matched categories) AND Send each product on eBay + $productsList = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `id_product` = '.(int)$id_product.' AND `active` = 1 AND `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` > 0 AND `id_ebay_category` > 0)'); + if ($productsList) + $this->_syncProducts($productsList); + } + else if (Configuration::get('EBAY_SYNC_MODE') == 'B') + { + // Select the sync Categories and Retrieve product list for eBay (which have matched and sync categories) AND Send each product on eBay + $productsList = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `id_product` = '.(int)$id_product.' AND `active` = 1 AND `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` > 0 AND `id_ebay_category` > 0 AND `sync` = 1)'); + if ($productsList) + $this->_syncProducts($productsList); + } + } + + public function hookbackOfficeTop($params) + { + // Check if the module is configured + if (!Configuration::get('EBAY_PAYPAL_EMAIL')) + return false; + + // If no update yet + if (!Configuration::get('EBAY_ORDER_LAST_UPDATE')) + Configuration::updateValue('EBAY_ORDER_LAST_UPDATE', date('Y-m-d').'T'.date('H:i:s').'.000Z'); + + // init Var + $dateNew = date('Y-m-d').'T'.date('H:i:s').'.000Z'; + if (Configuration::get('EBAY_ORDER_LAST_UPDATE') < date('Y-m-d', strtotime('-45 minutes')).'T'.date('H:i:s', strtotime('-45 minutes')).'.000Z') + { + $ebay = new eBayRequest(); + $orderList = $ebay->getOrders(Configuration::get('EBAY_ORDER_LAST_UPDATE'), $dateNew); + if ($orderList) + foreach ($orderList as $order) + if ($order['status'] == 'Complete') + { + $result = Db::getInstance()->getRow('SELECT `id_customer` FROM `'._DB_PREFIX_.'customer` WHERE `active` = 1 AND `email` = \''.pSQL($order['email']).'\' AND `deleted` = 0'.(substr(_PS_VERSION_, 0, 3) == '1.3' ? '' : ' AND `is_guest` = 0')); + $id_customer = (isset($result['id_customer']) ? $result['id_customer'] : 0); + + // Add customer if he doesn't exist + if ($id_customer < 1) + { + $customer = new Customer(); + $customer->id_gender = 9; + $customer->id_default_group = 1; + $customer->secure_key = md5(uniqid(rand(), true)); + $customer->email = $order['email']; + $customer->passwd = md5(pSQL(_COOKIE_KEY_.rand())); + $customer->last_passwd_gen = pSQL(date('Y-m-d H:i:s')); + $customer->newsletter = 0; + $customer->lastname = pSQL($order['familyname']); + $customer->firstname = pSQL($order['firstname']); + $customer->active = 1; + $customer->add(); + $id_customer = $customer->id; + } + + $address = new Address(); + $address->id_customer = (int)$id_customer; + $address->id_country = (int)Country::getByIso($order['country_iso_code']); + $address->alias = 'eBay '.date('Y-m-d H:i:s'); + $address->lastname = pSQL($order['familyname']); + $address->firstname = pSQL($order['firstname']); + $address->address1 = pSQL($order['address1']); + $address->address2 = pSQL($order['address2']); + $address->postcode = pSQL($order['postalcode']); + $address->city = pSQL($order['city']); + $address->phone = pSQL($order['phone']); + $address->active = 1; + $address->add(); + $id_address = $address->id; + + $flag = 1; + foreach ($order['product_list'] as $product) + { + if ((int)$product['id_product'] < 1 || !Db::getInstance()->getValue('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `id_product` = '.(int)$product['id_product'])) + $flag = 0; + if (isset($product['id_product_attribute']) && !Db::getInstance()->getValue('SELECT `id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)$product['id_product'].' AND `id_product_attribute` = '.(int)$product['id_product_attribute'])) + $flag = 0; + } + + if ($flag == 1) + { + $cartAdd = new Cart(); + $cartAdd->id_customer = $id_customer; + $cartAdd->id_address_invoice = $id_address; + $cartAdd->id_address_delivery = $id_address; + $cartAdd->id_carrier = 1; + $cartAdd->id_lang = $this->id_lang; + $cartAdd->id_currency = Currency::getIdByIsoCode('EUR'); + $cartAdd->add(); + foreach ($order['product_list'] as $product) + $cartAdd->updateQty((int)($product['quantity']), (int)($product['id_product']), (isset($product['id_product_attribute']) ? $product['id_product_attribute'] : NULL)); + $cartAdd->update(); + + // Fix on sending e-mail + Db::getInstance()->autoExecute(_DB_PREFIX_.'customer', array('email' => 'NOSEND-EBAY'), 'UPDATE', '`id_customer` = '.(int)$id_customer); + $customerClear = new Customer(); + if (method_exists($customerClear, 'clearCache')) + $customerClear->clearCache(true); + + // Validate order + $paiement = new eBayPayment(); + $paiement->validateOrder(intval($cartAdd->id), _PS_OS_PAYMENT_, floatval($cartAdd->getOrderTotal(true, 3)), 'Paypal eBay', NULL, array(), intval($cartAdd->id_currency)); + $id_order = $paiement->currentOrder; + + // Fix on sending e-mail + Db::getInstance()->autoExecute(_DB_PREFIX_.'customer', array('email' => pSQL($order['email'])), 'UPDATE', '`id_customer` = '.(int)$id_customer); + + // Update price (because of possibility of price impact) + $updateOrder = array( + 'total_paid' => floatval($order['amount']), + 'total_paid_real' => floatval($order['amount']), + 'total_products' => floatval($order['amount']), + 'total_products_wt' => floatval($order['amount']), + 'total_shipping' => floatval($order['shippingServiceCost']), + ); + Db::getInstance()->autoExecute(_DB_PREFIX_.'orders', $updateOrder, 'UPDATE', '`id_order` = '.(int)$id_order); + foreach ($order['product_list'] as $product) + Db::getInstance()->autoExecute(_DB_PREFIX_.'order_detail', array('product_price' => floatval($product['price']), 'tax_rate' => 0, 'reduction_percent' => 0), 'UPDATE', '`id_order` = '.(int)$id_order.' AND `product_id` = '.(int)$product['id_product'].' AND `product_attribute_id` = '.(int)$product['id_product_attribute']); + } + } + + Configuration::updateValue('EBAY_ORDER_LAST_UPDATE', $dateNew); + } + } + + + public function hookupdateOrderStatus($params) + { + } + + + // Alias + public function hookupdateproduct($params) { $this->hookaddproduct($params); } + public function hookupdateProductAttribute($params) { $this->hookaddproduct($params); } + public function hookdeleteproduct($params) { $this->hookaddproduct($params); } + public function hookheader($params) { $this->hookbackOfficeTop($params); } + public function hookbackOfficeFooter($params) { $this->hookbackOfficeTop($params); } + + + /******************************************************************/ + /** Main Form Methods *********************************************/ + /******************************************************************/ + + public function getContent() + { + global $cookie; + $this->_html .= '<h2>' . $this->l('eBay').'</h2>'; + + + // Checking Country + if (Tools::getValue('ebay_country_default_fr') == 'ok') + $cookie->ebay_country_default_fr = true; + if (strtolower(Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT'))) != 'fr' && !isset($cookie->ebay_country_default_fr)) + return $this->_html.$this->displayError($this->l('eBay module currently works only for eBay.fr').'. <a href="'.$_SERVER['REQUEST_URI'].'&ebay_country_default_fr=ok">'.$this->l('Continue anyway ?').'</a>'); + + + // Checking Extension + if (!extension_loaded('curl') || !ini_get('allow_url_fopen')) + { + if (!extension_loaded('curl') && !ini_get('allow_url_fopen')) + return $this->_html.$this->displayError($this->l('You must enable cURL extension and allow_url_fopen option on your server if you want to use this module.')); + else if (!extension_loaded('curl')) + return $this->_html.$this->displayError($this->l('You must enable cURL extension on your server if you want to use this module.')); + else if (!ini_get('allow_url_fopen')) + return $this->_html.$this->displayError($this->l('You must enable allow_url_fopen option on your server if you want to use this module.')); + } + + + // If isset Post Var, post process else display form + if (!empty($_POST) AND Tools::isSubmit('submitSave')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= '<div class="alert error"><img src="../modules/ebay/forbbiden.gif" alt="nok" />&nbsp;'.$err.'</div>'; + } + $this->_displayForm(); + return $this->_html; + } + + private function _displayForm() + { + // Test alert + $alert = array(); + if (!Configuration::get('EBAY_API_TOKEN')) + $alert['registration'] = 1; + if (!ini_get('allow_url_fopen')) + $alert['allowurlfopen'] = 1; + if (!extension_loaded('curl')) + $alert['curl'] = 1; + + + // Displaying Information from Prestashop + $context = stream_context_create(array('http' => array('method'=>"GET", 'timeout' => 5))); + $prestashopContent = @file_get_contents('http://www.prestashop.com/partner/modules/ebay.php?version='.$this->version.'&shop='.urlencode(Configuration::get('PS_SHOP_NAME')).'&registered='.($alert['registration'] == 1 ? 'no' : 'yes').'&url='.urlencode($_SERVER['HTTP_HOST']).'&iso_country='.$isoCountry.'&iso_lang='.Tools::strtolower($isoUser).'&id_lang='.(int)$cookie->id_lang.'&email='.urlencode(Configuration::get('PS_SHOP_EMAIL')).'&security='.md5(Configuration::get('PS_SHOP_EMAIL')._COOKIE_IV_), false, $context); + + + // Displaying page + $this->_html .= '<fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" /> '.$this->l('eBay Module Status').'</legend>'; + $this->_html .= '<div style="float: left; width: 45%">'; + if (!count($alert)) + $this->_html .= '<img src="../modules/ebay/valid.png" /><strong>'.$this->l('eBay Module is configured and online!').'</strong>'; + else + { + $this->_html .= '<img src="../modules/ebay/warn.png" /><strong>'.$this->l('eBay Module is not configured yet, you must:').'</strong>'; + $this->_html .= '<br />'.(isset($alert['registration']) ? '<img src="../modules/ebay/warn.png" />' : '<img src="../modules/ebay/valid.png" />').' 1) '.$this->l('Register the module on eBay'); + $this->_html .= '<br />'.(isset($alert['allowurlfopen']) ? '<img src="../modules/ebay/warn.png" />' : '<img src="../modules/ebay/valid.png" />').' 2) '.$this->l('Allow url fopen'); + $this->_html .= '<br />'.(isset($alert['curl']) ? '<img src="../modules/ebay/warn.png" />' : '<img src="../modules/ebay/valid.png" />').' 3) '.$this->l('Enable cURL'); + } + $this->_html .= '</div><div style="float: right; width: 45%">'.$prestashopContent.'</div>'; + + + $this->_html .= '</fieldset><div class="clear">&nbsp;</div>'; + + if (!Configuration::get('EBAY_API_TOKEN')) + $this->_html .= $this->_displayFormRegister(); + else + $this->_html .= $this->_displayFormConfig(); + } + + private function _postValidation() + { + if (!Configuration::get('EBAY_API_TOKEN')) + $this->_postValidationRegister(); + else if (Tools::getValue('section') == 'parameters') + $this->_postValidationParameters(); + else if (Tools::getValue('section') == 'category') + $this->_postValidationCategory(); + else if (Tools::getValue('section') == 'template') + $this->_postValidationTemplateManager(); + else if (Tools::getValue('section') == 'sync') + $this->_postValidationEbaySync(); + } + + private function _postProcess() + { + if (!Configuration::get('EBAY_API_TOKEN')) + $this->_postProcessRegister(); + else if (Tools::getValue('section') == 'parameters') + $this->_postProcessParameters(); + else if (Tools::getValue('section') == 'category') + $this->_postProcessCategory(); + else if (Tools::getValue('section') == 'template') + $this->_postProcessTemplateManager(); + else if (Tools::getValue('section') == 'sync') + $this->_postProcessEbaySync(); + } + + + /******************************************************************/ + /** Register Form Config Methods **********************************/ + /******************************************************************/ + + private function _displayFormRegister() + { + global $cookie; + $ebay = new eBayRequest(); + + if (!empty($cookie->eBaySession) && isset($_GET['action']) && $_GET['action'] == 'logged') + { + if (isset($_POST['eBayUsername'])) + { + $cookie->eBayUsername = $_POST['eBayUsername']; + Configuration::updateValue('EBAY_API_USERNAME', $_POST['eBayUsername']); + } + $ebay->session = $cookie->eBaySession; + $ebay->username = $cookie->eBayUsername; + + $html = ' + <script> + function checkToken() + { + $.ajax({ + url: \''._MODULE_DIR_.'ebay/ajax/checkToken.php?token='.Configuration::get('EBAY_SECURITY_TOKEN').'\', + success: function(data) + { + if (data == \'OK\') + window.location.href = \''.$_SERVER['REQUEST_URI'].'&action=validateToken\'; + else + setTimeout ("checkToken()", 5000); + } + }); + } + checkToken(); + </script>'; + $html .= '<fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Register the module on eBay').'</legend>'; + $html .= '<p align="center"><img src="'.$this->_path.'loading.gif" alt="'.$this->l('Loading').'" title="'.$this->l('Loading').'" /></p>'; + $html .= '<p align="center">'.$this->l('Once you sign in from the new eBay window, the module will automatically finish the installation a few seconds later').'</p>'; + $html .= '</fieldset>'; + } + else + { + if (empty($cookie->eBaySession)) + { + $ebay->login(); + $cookie->eBaySession = $ebay->session; + Configuration::updateValue('EBAY_API_SESSION', $ebay->session); + } + + $html = ' + <style>#button_ebay{background-image:url('.$this->_path.'ebay.gif);background-repeat:no-repeat;background-position:center 100px;width:385px;height:191px;cursor:pointer;padding-bottom:70px;font-weight:bold;font-size:22px;}</style> + <script> + $(document).ready(function() { + $(\'#button_ebay\').click(function() { + if ($(\'#eBayUsername\').val() == \'\') + { + alert(\''.$this->l('You have to set your eBay User ID').'\'); + return false; + } + else + window.open(\''.$ebay->getLoginUrl().'?SignIn&runame='.$ebay->runame.'&SessID='.$cookie->eBaySession.'\'); + }); + }); + </script> + <form action="'.$_SERVER['REQUEST_URI'].'&action=logged" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Register the module on eBay').'</legend> + <label>'.$this->l('Click on the button below').'</label> + <div class="margin-form"> + <br class="clear"/> + <label for="eBayUsername">'.$this->l('eBay User ID').'&nbsp;&nbsp;</label><input id="eBayUsername" type="text" name="eBayUsername" value="'.$cookie->eBayUsername.'" /> + <br class="clear"/><br /> + <input type="submit" id="button_ebay" class="button" value="'.$this->l('Register the module on eBay').'" /> + </div> + </fieldset> + </form>'; + } + + return $html; + } + + private function _postValidationRegister() + { + + } + + private function _postProcessRegister() + { + + } + + + /******************************************************************/ + /** Parameters Form Config Methods ********************************/ + /******************************************************************/ + + private function _displayFormConfig() + { + $html = ' + <ul id="menuTab"> + <li id="menuTab1" class="menuTabButton selected">1. '.$this->l('Parameters').'</li> + <li id="menuTab2" class="menuTabButton">2. '.$this->l('Categories settings').'</li> + <li id="menuTab3" class="menuTabButton">3. '.$this->l('Template manager').'</li> + <li id="menuTab4" class="menuTabButton">4. '.$this->l('eBay Sync').'</li> + <li id="menuTab5" class="menuTabButton">5. '.$this->l('Help').'</li> + </ul> + <div id="tabList"> + <div id="menuTab1Sheet" class="tabItem selected">'.$this->_displayFormParameters().'</div> + <div id="menuTab2Sheet" class="tabItem">'.$this->_displayFormCategory().'</div> + <div id="menuTab3Sheet" class="tabItem">'.$this->_displayFormTemplateManager().'</div> + <div id="menuTab4Sheet" class="tabItem">'.$this->_displayFormEbaySync().'</div> + <div id="menuTab5Sheet" class="tabItem">'.$this->_displayHelp().'</div> + </div> + <br clear="left" /> + <br /> + <style> + #menuTab { float: left; padding: 0; margin: 0; text-align: left; } + #menuTab li { text-align: left; float: left; display: inline; padding: 5px; padding-right: 10px; background: #EFEFEF; font-weight: bold; cursor: pointer; border-left: 1px solid #EFEFEF; border-right: 1px solid #EFEFEF; border-top: 1px solid #EFEFEF; } + #menuTab li.menuTabButton.selected { background: #FFF6D3; border-left: 1px solid #CCCCCC; border-right: 1px solid #CCCCCC; border-top: 1px solid #CCCCCC; } + #tabList { clear: left; } + .tabItem { display: none; } + .tabItem.selected { display: block; background: #FFFFF0; border: 1px solid #CCCCCC; padding: 10px; padding-top: 20px; } + </style> + <script> + $(".menuTabButton").click(function () { + $(".menuTabButton.selected").removeClass("selected"); + $(this).addClass("selected"); + $(".tabItem.selected").removeClass("selected"); + $("#" + this.id + "Sheet").addClass("selected"); + }); + </script> + '; + if (isset($_GET['id_tab'])) + $html .= '<script> + $(".menuTabButton.selected").removeClass("selected"); + $("#menuTab'.$_GET['id_tab'].'").addClass("selected"); + $(".tabItem.selected").removeClass("selected"); + $("#menuTab'.$_GET['id_tab'].'Sheet").addClass("selected"); + </script>'; + return $html; + } + + private function _displayFormParameters() + { + global $cookie; + + // Loading config currency + $configCurrency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + + + // Display Form + $html = '<form action="index.php?tab='.$_GET['tab'].'&configure='.$_GET['configure'].'&token='.$_GET['token'].'&tab_module='.$_GET['tab_module'].'&module_name='.$_GET['module_name'].'&id_tab=1&section=parameters" method="post" class="form" id="configForm1"> + <fieldset style="border: 0"> + <h4>'.$this->l('To export your products on eBay, you have to create a pro account on eBay (see Help) and configure your eBay-Prestashop module.').'</h4> + <label>'.$this->l('eBay Identifier').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ebay_identifier" value="'.Tools::getValue('ebay_identifier', Configuration::get('EBAY_IDENTIFIER')).'" /> + <p>'.(Configuration::get('EBAY_IDENTIFIER') ? '<a href="http://shop.ebay.fr/'.Configuration::get('EBAY_IDENTIFIER').'/m.html?_ipg=50&_sop=12&_rdc=1" target="_blank">'.$this->l('Your products on eBay').'</a>' : $this->l('Your eBay identifier')).'</p> + </div> + <label>'.$this->l('eBay shop').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ebay_shop" value="'.Tools::getValue('ebay_shop', Configuration::get('EBAY_SHOP')).'" /> + <p>'.(Configuration::get('EBAY_SHOP') ? '<a href="http://stores.ebay.fr/'.Configuration::get('EBAY_SHOP').'" target="_blank">'.$this->l('Your shop on eBay').'</a>' : $this->l('Your eBay shop name')).'</p> + </div> + <label>'.$this->l('Paypal Identifier (e-mail)').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ebay_paypal_email" value="'.Tools::getValue('ebay_paypal_email', Configuration::get('EBAY_PAYPAL_EMAIL')).'" /> + <p>'.$this->l('You have to set your PayPal e-mail account, it\'s the only payment available with this module').'</p> + </div> + <label>'.$this->l('Shipping method').' : </label> + <div class="margin-form"> + <select name="ebay_shipping_carrier_id">'; + foreach ($this->_shippingMethod as $id => $val) + $html .= '<option value="'.$id.'" '.(Tools::getValue('ebay_shipping_carrier_id', Configuration::get('EBAY_SHIPPING_CARRIER_ID')) == $id ? 'selected="selected"' : '').'>'.$val['description'].'</option>'; + $html .= ' </select> + <p>'.$this->l('Shipping cost configuration for your products on eBay').'</p> + </div> + <label>'.$this->l('Shipping cost').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ebay_shipping_cost" value="'.Tools::getValue('ebay_shipping_cost', Configuration::get('EBAY_SHIPPING_COST')).'" /> '.$configCurrency->sign.' + <p>'.$this->l('Shipping cost configuration for your products on eBay').'</p> + </div> + <label>'.$this->l('Shop postal code').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ebay_shop_postalcode" value="'.Tools::getValue('ebay_shop_postalcode', Configuration::get('EBAY_SHOP_POSTALCODE')).'" /> + <p>'.$this->l('Your shop\'s postal code').'</p> + </div> + </fieldset> + <div class="margin-form" id="buttonEbayParameters"><input class="button" name="submitSave" type="submit" id="save_ebay_parameters" value="'.$this->l('Save').'" /></div> + <div class="margin-form" id="categoriesProgression" style="font-weight: bold;"></div> + </form>'; + + if (!Configuration::get('EBAY_CATEGORY_LOADED')) + { + $html .= ' + <script> + percent = 0; + function checkCategories() + { + percent++; + if (percent > 100) + percent = 100; + $("#categoriesProgression").html("'.$this->l('Categories loading').' : " + percent + " %"); + if (percent < 100) + setTimeout ("checkCategories()", 1000); + } + $(document).ready(function() { + $("#save_ebay_parameters").click(function() { + $("#buttonEbayParameters").hide(); + checkCategories(); + }); + }); + </script>'; + } + + return $html; + } + + private function _postValidationParameters() + { + // Check configuration values + if (Tools::getValue('ebay_identifier') == NULL) + $this->_postErrors[] = $this->l('Your eBay identifier account is not specified or is invalid'); + if (Tools::getValue('ebay_paypal_email') == NULL OR !Validate::isEmail(Tools::getValue('ebay_paypal_email'))) + $this->_postErrors[] = $this->l('Your Paypal E-mail account is not specified or is invalid'); + if (Tools::getValue('ebay_shipping_cost') == '' OR !is_numeric(Tools::getValue('ebay_shipping_cost'))) + $this->_postErrors[] = $this->l('Your shipping cost is not specified or is invalid'); + if (Tools::getValue('ebay_shop_postalcode') == '' OR !Validate::isPostCode(Tools::getValue('ebay_shop_postalcode'))) + $this->_postErrors[] = $this->l('Your shop\'s postal code is not specified or is invalid'); + } + + private function _postProcessParameters() + { + // Saving new configurations + if (Configuration::updateValue('EBAY_PAYPAL_EMAIL', pSQL(Tools::getValue('ebay_paypal_email'))) && + Configuration::updateValue('EBAY_IDENTIFIER', pSQL(Tools::getValue('ebay_identifier'))) && + Configuration::updateValue('EBAY_SHOP', pSQL(Tools::getValue('ebay_shop'))) && + Configuration::updateValue('EBAY_SHIPPING_COST', (float)(Tools::getValue('ebay_shipping_cost'))) && + Configuration::updateValue('EBAY_SHIPPING_COST_CURRENCY', (int)(Configuration::get('PS_CURRENCY_DEFAULT'))) && + Configuration::updateValue('EBAY_SHIPPING_CARRIER_ID', pSQL(Tools::getValue('ebay_shipping_carrier_id'))) && + Configuration::updateValue('EBAY_SHOP_POSTALCODE', pSQL(Tools::getValue('ebay_shop_postalcode')))) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayError($this->l('Settings failed')); + } + + + /******************************************************************/ + /** Category Form Config Methods **********************************/ + /******************************************************************/ + + private function _getChildCategories($categories, $id, $path = array(), $pathAdd = '') + { + $categoryTmp = array(); + $categoryTab = array(); + if ($pathAdd != '') + $path[] = $pathAdd; + if (isset($categories[$id])) + foreach ($categories[$id] as $idc => $cc) + { + $name = ''; + if ($path) + foreach ($path as $p) + $name .= $p.' > '; + $name .= $cc['infos']['name']; + $categoryTab[] = array('id_category' => $cc['infos']['id_category'], 'name' => $name); + $categoryTmp = $this->_getChildCategories($categories, $idc, $path, $cc['infos']['name']); + $categoryTab = array_merge($categoryTab, $categoryTmp); + } + return $categoryTab; + } + + private function _displayFormCategory() + { + global $cookie; + + // Check if the module is configured + if (!Configuration::get('EBAY_PAYPAL_EMAIL')) + return '<p><b>'.$this->l('You have to configure "General Settings" tab before using this tab.').'</b></p><br />'; + + // Display eBay Categories + if (!Configuration::get('EBAY_CATEGORY_LOADED')) + { + $ebay = new eBayRequest(); + $ebay->saveCategories(); + Configuration::updateValue('EBAY_CATEGORY_LOADED', 1); + Configuration::updateValue('EBAY_CATEGORY_LOADED_DATE', date('Y-m-d H:i:s')); + } + + + // Loading categories + $categoryConfigList = array(); + $categoryConfigListTmp = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category_configuration`'); + foreach ($categoryConfigListTmp as $c) + $categoryConfigList[$c['id_category']] = $c; + $categoryList = $this->_getChildCategories(Category::getCategories($cookie->id_lang), 0); + $eBayCategoryList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category` WHERE `id_category_ref` = `id_category_ref_parent`'); + + + // Display header + $html = '<p><b>'.$this->l('To export your products on eBay, you have to associate each one of your shop categories to an eBay category. You can also define an impact of your price on eBay.').'</b></p><br /> + + <form action="index.php?tab='.$_GET['tab'].'&configure='.$_GET['configure'].'&token='.$_GET['token'].'&tab_module='.$_GET['tab_module'].'&module_name='.$_GET['module_name'].'&id_tab=2&section=category&action=suggestCategories" method="post" class="form" id="configForm2SuggestedCategories"> + <p><b>'.$this->l('You can use the button below to associate automatically the categories which have no association for the moment with an eBay suggested category.').'</b> + <input class="button" name="submitSave" type="submit" value="'.$this->l('Suggest Categories').'" /> + </p><br /> + </form> + + <form action="index.php?tab='.$_GET['tab'].'&configure='.$_GET['configure'].'&token='.$_GET['token'].'&tab_module='.$_GET['tab_module'].'&module_name='.$_GET['module_name'].'&id_tab=2&section=category" method="post" class="form" id="configForm2"> + <table class="table tableDnD" cellpadding="0" cellspacing="0" width="100%"> + <thead> + <tr class="nodrag nodrop"> + <th style="width:120px">'.$this->l('Category').'</th> + <th>'.$this->l('eBay Category').'</th> + <th style="width:80px">'.$this->l('Price impact').'</th> + </tr> + </thead> + <tbody>'; + + + // Displaying categories + if (!$categoryList) + $html .= '<tr><td colspan="4">'.$this->l('No category found.').'</td></tr>'; + foreach ($categoryList as $k => $c) + { + // Display line + $alt = 0; + if ($k % 2 != 0) + $alt = ' class="alt_row"'; + $html .= '<tr'.$alt.'> + <td>'.$c['name'].'</td> + <td id="categoryPath'.$c['id_category'].'"> + <select name="category'.$c['id_category'].'" id="categoryLevel1-'.$c['id_category'].'" rel="'.$c['id_category'].'" style="font-size: 12px; width: 160px;" OnChange="changeCategoryMatch(1, '.$c['id_category'].');"> + <option value="0">'.$this->l('No category selected').'</option>'; + foreach ($eBayCategoryList as $ec) + $html .= '<option value="'.$ec['id_ebay_category'].'">'.$ec['name'].($ec['is_multi_sku'] == 1 ? ' *' : '').'</option>'; + $html .= '</select>'; + if (isset($categoryConfigList[$c['id_category']])) + $html .= '<script>$(document).ready(function() { loadCategoryMatch('.$c['id_category'].'); });</script>'; + $html .= '</td> + <td><select name="percent'.$c['id_category'].'" id="percent'.$c['id_category'].'" rel="'.$c['id_category'].'" style="font-size: 12px;">'; + for ($i = 5; $i >= -80; $i--) + $html .= '<option value="'.$i.'" '.((isset($categoryConfigList[$c['id_category']]) && $categoryConfigList[$c['id_category']]['percent'] == $i) || (!isset($categoryConfigList[$c['id_category']]) && $i == 0) ? 'selected="selected"' : '').'>'.(($i >= 0) ? $i : '- '.($i * -1)).' %</option>'; + $html .= '</select></td></tr>'; + } + + $html .= ' + </tbody> + </table><br /> + <div class="margin-form"><input class="button" name="submitSave" type="submit" value="'.$this->l('Save').'" /></div> + </form> + + <p><b>'.$this->l('Beware : Only product default categories are used for this configuration.').'</b></p><br /> + + <p align="left"> + * Certaines catégories bénéficient du nouveau format d’annonces multi-versions qui permet de publier 1 seule annonce pour plusieurs versions du même produit.<br /> + Pour les catégories ne bénéficiant pas de ce format multi-versions, une annonce sera créée pour chaque version du produit.<br /> + <a href="http://sellerupdate.ebay.fr/may2011/multi-variation-listings.html" target="_blank">Cliquez ici pour plus d’informations sur les catégories multi-versions</a> + </p><br /><br /> + + <script> + function loadCategoryMatch(id_category) + { + $.ajax({ + url: "'._MODULE_DIR_.'ebay/ajax/loadCategoryMatch.php?token='.Configuration::get('EBAY_SECURITY_TOKEN').'&id_category=" + id_category, + success: function(data) { $("#categoryPath" + id_category).html(data); } + }); + } + function changeCategoryMatch(level, id_category) + { + var levelParams = "&level1=" + $("#categoryLevel1-" + id_category).val(); + if (level > 1) levelParams += "&level2=" + $("#categoryLevel2-" + id_category).val(); + if (level > 2) levelParams += "&level3=" + $("#categoryLevel3-" + id_category).val(); + if (level > 3) levelParams += "&level4=" + $("#categoryLevel4-" + id_category).val(); + if (level > 4) levelParams += "&level5=" + $("#categoryLevel5-" + id_category).val(); + + $.ajax({ + url: "'._MODULE_DIR_.'ebay/ajax/changeCategoryMatch.php?token='.Configuration::get('EBAY_SECURITY_TOKEN').'&id_category=" + id_category + "&level=" + level + levelParams, + success: function(data) { $("#categoryPath" + id_category).html(data); } + }); + } + </script>'; + + + return $html; + } + + private function _postValidationCategory() + { + } + + private function _postProcessCategory() + { + // Init Var + global $cookie; + $date = date('Y-m-d H:i:s'); + $services = Tools::getValue('service'); + + if (Tools::getValue('action') == 'suggestCategories') + { + // Loading categories + $ebay = new eBayRequest(); + $categoryConfigList = array(); + $categoryConfigListTmp = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category_configuration`'); + foreach ($categoryConfigListTmp as $c) + $categoryConfigList[$c['id_category']] = $c; + $categoryList = Db::getInstance()->ExecuteS('SELECT `id_category`, `name` FROM `'._DB_PREFIX_.'category_lang` WHERE `id_lang` = '.(int)$this->id_lang); + + foreach ($categoryList as $k => $c) + if (!isset($categoryConfigList[$c['id_category']])) + { + $productTest = Db::getInstance()->getRow(' + SELECT pl.`name`, pl.`description` + FROM `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int)$this->id_lang.') + WHERE `id_category_default` = '.(int)$c['id_category']); + $id_category_ref_suggested = $ebay->getSuggestedCategories($c['name'].' '.$productTest['name']); + $id_ebay_category_suggested = Db::getInstance()->getValue('SELECT `id_ebay_category` FROM `'._DB_PREFIX_.'ebay_category` WHERE `id_category_ref` = '.(int)$id_category_ref_suggested); + if ((int)$id_ebay_category_suggested > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category_configuration', array('id_country' => 8, 'id_ebay_category' => (int)$id_ebay_category_suggested, 'id_category' => (int)$c['id_category'], 'percent' => 0, 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + return true; + } + + + // Sort post datas + $postValue = array(); + foreach ($_POST as $k => $v) + { + if (strlen($k) > 8 && substr($k, 0, 8) == 'category') + $postValue[substr($k, 8, strlen($k) - 8)]['id_ebay_category'] = $v; + if (strlen($k) > 7 && substr($k, 0, 7) == 'percent') + $postValue[substr($k, 7, strlen($k) - 7)]['percent'] = $v; + } + + // Insert and update configuration + foreach ($postValue as $id_category => $tab) + { + $arraySQL = array(); + $date = date('Y-m-d H:i:s'); + if ($tab['id_ebay_category']) + $arraySQL = array('id_country' => 8, 'id_ebay_category' => (int)$tab['id_ebay_category'], 'id_category' => (int)$id_category, 'percent' => pSQL($tab['percent']), 'date_upd' => pSQL($date)); + $id_ebay_category_configuration = Db::getInstance()->getValue('SELECT `id_ebay_category_configuration` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` = '.(int)$id_category); + if ($id_ebay_category_configuration > 0) + { + if ($arraySQL) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category_configuration', $arraySQL, 'UPDATE', '`id_category` = '.(int)$id_category); + else + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` = '.(int)$id_category); + } + elseif ($arraySQL) + { + $arraySQL['date_add'] = $date; + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category_configuration', $arraySQL, 'INSERT'); + } + } + + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + } + + + + /******************************************************************/ + /** Template Manager Form Config Methods **************************/ + /******************************************************************/ + + private function _displayFormTemplateManager() + { + global $cookie; + + // Check if the module is configured + if (!Configuration::get('EBAY_PAYPAL_EMAIL')) + return '<p><b>'.$this->l('You have to configure "General Settings" tab before using this tab.').'</b></p><br />'; + + $iso = Language::getIsoById((int)($cookie->id_lang)); + $isoTinyMCE = (file_exists(_PS_ROOT_DIR_.'/js/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en'); + $ad = dirname($_SERVER["PHP_SELF"]); + + // Display Form + $html = '<form action="index.php?tab='.$_GET['tab'].'&configure='.$_GET['configure'].'&token='.$_GET['token'].'&tab_module='.$_GET['tab_module'].'&module_name='.$_GET['module_name'].'&id_tab=3&section=template" method="post" class="form" id="configForm3"> + <fieldset style="border: 0"> + <h4>'.$this->l('You can customise the template for your products page on eBay').' :</h4> + <textarea class="rte" cols="100" rows="50" name="ebay_product_template">'.Tools::getValue('ebay_product_template', Configuration::get('EBAY_PRODUCT_TEMPLATE')).'</textarea><br /> + + '.(substr(_PS_VERSION_, 0, 3) == '1.3' ? ' + <script type="text/javascript" src="'.__PS_BASE_URI__.'js/tinymce/jscripts/tiny_mce/tiny_mce.js"></script> + <script type="text/javascript"> + tinyMCE.init({ + mode : "textareas", + theme : "advanced", + plugins : "safari,pagebreak,style,layer,table,advimage,advlink,inlinepopups,media,searchreplace,contextmenu,paste,directionality,fullscreen", + // Theme options + theme_advanced_buttons1 : "newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", + theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,,|,forecolor,backcolor", + theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,media,|,ltr,rtl,|,fullscreen", + theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,pagebreak", + theme_advanced_toolbar_location : "top", + theme_advanced_toolbar_align : "left", + theme_advanced_statusbar_location : "bottom", + theme_advanced_resizing : false, + content_css : "'.__PS_BASE_URI__.'themes/'._THEME_NAME_.'/css/global.css", + document_base_url : "'.__PS_BASE_URI__.'", + width: "850", + height: "800", + font_size_style_values : "8pt, 10pt, 12pt, 14pt, 18pt, 24pt, 36pt", + // Drop lists for link/image/media/template dialogs + template_external_list_url : "lists/template_list.js", + external_link_list_url : "lists/link_list.js", + external_image_list_url : "lists/image_list.js", + media_external_list_url : "lists/media_list.js", + elements : "nourlconvert", + convert_urls : false, + language : "'.(file_exists(_PS_ROOT_DIR_.'/js/tinymce/jscripts/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en').'" + }); + </script> + ' : ' + <script type="text/javascript"> + var iso = \''.$isoTinyMCE.'\'; + var pathCSS = \''._THEME_CSS_DIR_.'\'; + var ad = \''.$ad.'\'; + </script> + <script type="text/javascript" src="'._PS_JS_DIR_.'/tiny_mce/tiny_mce.js"></script> + <script type="text/javascript" src="'._PS_JS_DIR_.'/tinymce.inc.js"></script> + <script> + tinyMCE.settings.width = 850; + tinyMCE.settings.height = 800; + tinyMCE.settings.extended_valid_elements = "iframe[id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]"; + tinyMCE.settings.extended_valid_elements = "link[href|type|rel|id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]"; + </script>').' + + </fieldset> + <div class="margin-form"><input class="button" name="submitSave" value="'.$this->l('Save').'" type="submit"></div> + </form>'; + + + return $html; + } + + private function _postValidationTemplateManager() + { + } + + private function _postProcessTemplateManager() + { + // Saving new configurations + if (Configuration::updateValue('EBAY_PRODUCT_TEMPLATE', Tools::getValue('ebay_product_template'), true)) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayError($this->l('Settings failed')); + } + + + + /******************************************************************/ + /** Ebay Sync Form Config Methods **************************/ + /******************************************************************/ + + private function _displayFormEbaySync() + { + global $cookie; + + // Check if the module is configured + if (!Configuration::get('EBAY_PAYPAL_EMAIL')) + return '<p><b>'.$this->l('You have to configure "General Settings" tab before using this tab.').'</b></p><br />'; + if (Db::getInstance()->getValue('SELECT COUNT(`id_ebay_category_configuration`) as nb FROM `'._DB_PREFIX_.'ebay_category_configuration`') < 1) + return '<p><b>'.$this->l('You have to configure "Categories Settings" tab before using this tab.').'</b></p><br />'; + + $nbProductsModeA = Db::getInstance()->getValue(' + SELECT COUNT(`id_product`) as nb + FROM `'._DB_PREFIX_.'product` + WHERE `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_ebay_category` > 0)'); + $nbProductsModeB = Db::getInstance()->getValue(' + SELECT COUNT(`id_product`) as nb + FROM `'._DB_PREFIX_.'product` + WHERE `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_ebay_category` > 0 AND `sync` = 1)'); + + $nbProducts = $nbProductsModeA; + if (Configuration::get('EBAY_SYNC_MODE') == 'B') + $nbProducts = $nbProductsModeB; + + + // Display Form + $html = '<style>#button_ebay_sync{background-image:url('.$this->_path.'ebay.gif);background-repeat:no-repeat;background-position:center 90px;width:500px;height:191px;cursor:pointer;padding-bottom:100px;font-weight:bold;font-size:25px;}</style> + <script> + var nbProducts = '.$nbProducts.'; + var nbProductsModeA = '.$nbProductsModeA.'; + var nbProductsModeB = '.$nbProductsModeB.'; + $(document).ready(function() { + $(".categorySync").click(function() { + + var params = ""; + if ($(this).attr("value") > 0) + params = "&id_category=" + $(this).attr("value"); + if ($(this).attr("checked")) + params = params + "&action=1"; + else + params = params + "&action=0"; + + $.ajax({ + url: "'._MODULE_DIR_.'ebay/ajax/getNbProductsSync.php?token='.Configuration::get('EBAY_SECURITY_TOKEN').'" + params, + success: function(data) { + nbProducts = data; + nbProductsModeB = data; + $("#button_ebay_sync").attr("value", "'.$this->l('Sync with eBay').'\n(" + data + " '.$this->l('products').')"); + } + }); + }); + }); + + + $(document).ready(function() { + $("#ebay_sync_mode1").click(function() { + nbProducts = nbProductsModeA; + $("#catSync").hide("slow"); + $("#button_ebay_sync").attr("value", "'.$this->l('Sync with eBay').'\n(" + nbProducts + " '.$this->l('products').')"); + }); + $("#ebay_sync_mode2").click(function() { + nbProducts = nbProductsModeB; + $("#catSync").show("slow"); + $("#button_ebay_sync").attr("value", "'.$this->l('Sync with eBay').'\n(" + nbProducts + " '.$this->l('products').')"); + }); + }); + </script> + + <form action="index.php?tab='.$_GET['tab'].'&configure='.$_GET['configure'].'&token='.$_GET['token'].'&tab_module='.$_GET['tab_module'].'&module_name='.$_GET['module_name'].'&id_tab=4&section=sync" method="post" class="form" id="configForm4"> + <fieldset style="border: 0"> + <h4>'.$this->l('You will now push your products on eBay.').' <b>'.$this->l('Reminder,').'</b> '.$this->l('you will not have to pay any fees if you have a shop on eBay.').'</h4> + <label style="width: 250px;">'.$this->l('Sync Mode').' : </label><br clear="left" /><br /><br /> + <div class="margin-form"> + <input type="radio" size="20" name="ebay_sync_mode" id="ebay_sync_mode1" value="A" checked="checked" /> '.$this->l('Option A').' : '.$this->l('Sync all your products with eBay').' + </div> + <div class="margin-form"> + <input type="radio" size="20" name="ebay_sync_mode" id="ebay_sync_mode2" value="B" /> '.$this->l('Option B').' : '.$this->l('Sync the products only from selected categories').' + </div> + <label style="width: 250px;">'.$this->l('Option').' : </label><br clear="left" /><br /><br /> + <div class="margin-form"> + <input type="checkbox" size="20" name="ebay_sync_option_resync" id="ebay_sync_option_resync" value="1" '.(Configuration::get('EBAY_SYNC_OPTION_RESYNC') == 1 ? 'checked="checked"' : '').' /> '.$this->l('When update a product, resync only price and quantity').' + </div> + <div style="display: none;" id="catSync">'; + + + // Loading categories + $categoryConfigList = array(); + $categoryConfigListTmp = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'ebay_category_configuration`'); + foreach ($categoryConfigListTmp as $c) + $categoryConfigList[$c['id_category']] = $c; + $categoryList = $this->_getChildCategories(Category::getCategories($cookie->id_lang), 0); + $html .= '<table class="table tableDnD" cellpadding="0" cellspacing="0" width="90%"> + <thead> + <tr class="nodrag nodrop"> + <th>'.$this->l('Select').'</th> + <th>'.$this->l('Category').'</th> + </tr> + </thead> + <tbody>'; + if (!$categoryList) + $html .= '<tr><td colspan="2">'.$this->l('No category found.').'</td></tr>'; + $i = 0; + foreach ($categoryList as $k => $c) + { + // Display line + $alt = 0; + if ($i % 2 != 0) + $alt = ' class="alt_row"'; + if (isset($categoryConfigList[$c['id_category']]['id_ebay_category']) && $categoryConfigList[$c['id_category']]['id_ebay_category'] > 0) + { + $html .= '<tr'.$alt.'><td><input type="checkbox" class="categorySync" name="category[]" value="'.$c['id_category'].'" '.($categoryConfigList[$c['id_category']]['sync'] == 1 ? 'checked="checked"' : '').' /><td>'.$c['name'].'</td></tr>'; + $i++; + } + } + $html .= '</tbody></table>'; + + if (Configuration::get('EBAY_SYNC_MODE') == 'B') + { + $html .= '<script> + $(document).ready(function() { + $("#catSync").show("slow"); + $("#ebay_sync_mode2").attr("checked", true); + }); + </script>'; + } + + $html .= ' + </div> + </fieldset> + <div class="margin-form"><input id="button_ebay_sync" class="button" name="submitSave" value="'.$this->l('Sync with eBay')."\n".'('.$nbProducts.' '.$this->l('products').')" OnClick="return confirm(\''.$this->l('You will push').' \' + nbProducts + \' '.$this->l('products on eBay. Do you want to confirm ?').'\');" type="submit"></div> + <h4>'.$this->l('Beware ! If some of your categories are not multi sku compliant, some of your products may create more than one product on eBay.').'</h4> + </form>'; + + + return $html; + } + + private function _postValidationEbaySync() + { + } + + private function _postProcessEbaySync() + { + // Update Sync Option + Configuration::updateValue('EBAY_SYNC_OPTION_RESYNC', (Tools::getValue('ebay_sync_option_resync') == 1 ? 1 : 0)); + + if ($_POST['ebay_sync_mode'] == 'A') + { + // Update Sync Mod + Configuration::updateValue('EBAY_SYNC_MODE', 'A'); + + // Retrieve product list for eBay (which have matched categories) + $productsList = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `active` = 1 AND `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` > 0 AND `id_ebay_category` > 0)'); + + // Send each product on eBay + $this->_syncProducts($productsList); + } + else + { + // Update Sync Mod + Configuration::updateValue('EBAY_SYNC_MODE', 'B'); + + // Select the sync Categories and Retrieve product list for eBay (which have matched and sync categories) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category_configuration', array('sync' => 0), 'UPDATE', ''); + foreach ($_POST['category'] as $id_category) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_category_configuration', array('sync' => 1), 'UPDATE', '`id_category` = '.(int)$id_category); + $productsList = Db::getInstance()->ExecuteS('SELECT `id_product` FROM `'._DB_PREFIX_.'product` WHERE `active` = 1 AND `id_category_default` IN (SELECT `id_category` FROM `'._DB_PREFIX_.'ebay_category_configuration` WHERE `id_category` > 0 AND `id_ebay_category` > 0 AND `sync` = 1)'); + + // Send each product on eBay + $this->_syncProducts($productsList); + } + } + + + private function _syncProducts($productsList) + { + global $link; + $fees = 0; + $count = 0; + $count_success = 0; + $count_error = 0; + $tab_error = array(); + $date = date('Y-m-d H:i:s'); + $ebay = new eBayRequest(); + $categoryDefaultCache = array(); + + // Up the time limit + set_time_limit(3600); + + // Run the products list + foreach ($productsList as $product) + { + // Product instanciation + $product = new Product((int)$product['id_product'], true, $this->id_lang); + if (Validate::isLoadedObject($product) && $product->id_category_default > 0) + { + // Load default category matched in cache + if (!isset($categoryDefaultCache[$product->id_category_default])) + $categoryDefaultCache[$product->id_category_default] = Db::getInstance()->getRow('SELECT ec.`id_category_ref`, ec.`is_multi_sku`, ecc.`percent` FROM `'._DB_PREFIX_.'ebay_category` ec LEFT JOIN `'._DB_PREFIX_.'ebay_category_configuration` ecc ON (ecc.`id_ebay_category` = ec.`id_ebay_category`) WHERE ecc.`id_category` = '.(int)$product->id_category_default); + + // Load Pictures + $pictures = array(); + $picturesMedium = array(); + $picturesLarge = array(); + $prefix = (substr(_PS_VERSION_, 0, 3) == '1.3' ? 'http://'.Configuration::get('PS_SHOP_DOMAIN').'/' : ''); + $images = $product->getImages($this->id_lang); + foreach ($images as $image) + { + $pictures[] = $prefix.$link->getImageLink('', $product->id.'-'.$image['id_image'], NULL); + $picturesMedium[] = $prefix.$link->getImageLink('', $product->id.'-'.$image['id_image'], 'medium'); + $picturesLarge[] = $prefix.$link->getImageLink('', $product->id.'-'.$image['id_image'], 'large'); + } + + // Load Variations + $variations = array(); + $variationsList = array(); + $combinations = $product->getAttributeCombinaisons($this->id_lang); + if (isset($combinations)) + foreach ($combinations as $c) + { + $variationsList[$c['group_name']][$c['attribute_name']] = 1; + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['id_attribute'] = $c['id_product_attribute']; + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['quantity'] = $c['quantity']; + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['variations'][] = array('name' => $c['group_name'], 'value' => $c['attribute_name']); + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['price_static'] = Product::getPriceStatic((int)$c['id_product'], true, (int)$c['id_product_attribute']); + + $price = $variations[$c['id_product'].'-'.$c['id_product_attribute']]['price_static']; + $price_original = $price; + if ($categoryDefaultCache[$product->id_category_default]['percent'] > 0) + $price *= (1 + ($categoryDefaultCache[$product->id_category_default]['percent'] / 100)); + else if ($categoryDefaultCache[$product->id_category_default]['percent'] < 0) + $price *= (1 - ($categoryDefaultCache[$product->id_category_default]['percent'] / (-100))); + + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['price'] = round($price, 2); + if ($categoryDefaultCache[$product->id_category_default]['percent'] < 0) + { + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['price_original'] = round($price_original, 2); + $variations[$c['id_product'].'-'.$c['id_product_attribute']]['price_percent'] = round($categoryDefaultCache[$product->id_category_default]['percent']); + } + } + + // Load Variations Pictures + $combinationsImages = $product->getCombinationImages(2); + if (isset($combinationsImages) && !empty($combinationsImages) && count($combinationsImages) > 0) + foreach ($combinationsImages as $ci) + foreach ($ci as $i) + $variations[$product->id.'-'.$i['id_product_attribute']]['pictures'][] = $prefix.$link->getImageLink('', $product->id.'-'.$i['id_image'], NULL); + + + // Load basic price + $price = Product::getPriceStatic((int)$product->id, true); + $price_original = $price; + if ($categoryDefaultCache[$product->id_category_default]['percent'] > 0) + $price *= (1 + ($categoryDefaultCache[$product->id_category_default]['percent'] / 100)); + else if ($categoryDefaultCache[$product->id_category_default]['percent'] < 0) + $price *= (1 - ($categoryDefaultCache[$product->id_category_default]['percent'] / (-100))); + $price = round($price, 2); + + + // Generate array and try insert in database + $datas = array( + 'id_product' => $product->id, + 'name' => str_replace('&', '&amp;', $product->name), + 'brand' => $product->manufacturer_name, + 'description' => $product->description, + 'price' => $price, + 'quantity' => $product->quantity, + 'categoryId' => $categoryDefaultCache[$product->id_category_default]['id_category_ref'], + 'shippingService' => $this->_shippingMethod[Configuration::get('EBAY_SHIPPING_CARRIER_ID')]['shippingService'], + 'shippingCost' => Configuration::get('EBAY_SHIPPING_COST'), + 'variationsList' => $variationsList, + 'variations' => $variations, + 'pictures' => $pictures, + 'picturesMedium' => $picturesMedium, + 'picturesLarge' => $picturesLarge, + ); + + // Save percent and price discount + if ($categoryDefaultCache[$product->id_category_default]['percent'] < 0) + { + $datas['price_original'] = round($price_original, 2); + $datas['price_percent'] = round($categoryDefaultCache[$product->id_category_default]['percent']); + } + + + // Load eBay Description + $datas['description'] = str_replace( + array('{DESCRIPTION}', '{EBAY_IDENTIFIER}', '{EBAY_SHOP}', '{SLOGAN}', '{PRODUCT_NAME}'), + array($datas['description'], Configuration::get('EBAY_IDENTIFIER'), Configuration::get('EBAY_SHOP'), '', $product->name), + Configuration::get('EBAY_PRODUCT_TEMPLATE') + ); + + + // Export on eBay + if (count($datas['variations']) > 0) + { + // Variations Case + if ($categoryDefaultCache[$product->id_category_default]['is_multi_sku'] == 1) + { + // Load eBay Description + $datas['description'] = str_replace( + array('{MAIN_IMAGE}', '{MEDIUM_IMAGE_1}', '{MEDIUM_IMAGE_2}', '{MEDIUM_IMAGE_3}', '{PRODUCT_PRICE}', '{PRODUCT_PRICE_DISCOUNT}'), + array( + (isset($datas['picturesLarge'][0]) ? '<img src="'.$datas['picturesLarge'][0].'" class="bodyMainImageProductPrestashop" />' : ''), + (isset($datas['picturesMedium'][1]) ? '<img src="'.$datas['picturesMedium'][1].'" class="bodyFirstMediumImageProductPrestashop" />' : ''), + (isset($datas['picturesMedium'][2]) ? '<img src="'.$datas['picturesMedium'][2].'" class="bodyMediumImageProductPrestashop" />' : ''), + (isset($datas['picturesMedium'][3]) ? '<img src="'.$datas['picturesMedium'][3].'" class="bodyMediumImageProductPrestashop" />' : ''), + '', + '' + ), + $datas['description'] + ); + + // Multi Sku case + // Check if product exists on eBay + $itemID = Db::getInstance()->getValue('SELECT `id_product_ref` FROM `'._DB_PREFIX_.'ebay_product` WHERE `id_product` = '.(int)$product->id); + if ($itemID) + { + // Update + $datas['itemID'] = $itemID; + if ($ebay->reviseFixedPriceItemMultiSku($datas)) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('date_upd' => pSQL($date)), 'UPDATE', '`id_product_ref` = '.(int)$itemID); + + // if product not on eBay we add it + if ($ebay->errorCode == 291) + { + // We delete from DB and Add it on eBay + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'ebay_product` WHERE `id_product_ref` = \''.pSQL($datas['itemID']).'\''); + $ebay->addFixedPriceItemMultiSku($datas); + if ($ebay->itemID > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('id_country' => 8, 'id_product' => (int)$product->id, 'id_attribute' => 0, 'id_product_ref' => pSQL($ebay->itemID), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + } + else + { + // Add + $ebay->addFixedPriceItemMultiSku($datas); + if ($ebay->itemID > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('id_country' => 8, 'id_product' => (int)$product->id, 'id_attribute' => 0, 'id_product_ref' => pSQL($ebay->itemID), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + } + else + { + // No Multi Sku case + foreach ($datas['variations'] as $v) + { + $datasTmp = $datas; + if (isset($v['pictures']) && count($v['pictures']) > 0) + $datasTmp['pictures'] = $v['pictures']; + if (isset($v['picturesMedium']) && count($v['picturesMedium']) > 0) + $datasTmp['picturesMedium'] = $v['picturesMedium']; + if (isset($v['picturesLarge']) && count($v['picturesLarge']) > 0) + $datasTmp['picturesLarge'] = $v['picturesLarge']; + foreach ($v['variations'] as $vLabel) + { + $datasTmp['name'] .= ' '.$vLabel['value']; + $datasTmp['attributes'][$vLabel['name']] = $vLabel['value']; + } + $datasTmp['price'] = $v['price']; + if (isset($v['price_original'])) + { + $datasTmp['price_original'] = $v['price_original']; + $datasTmp['price_percent'] = $v['price_percent']; + } + $datasTmp['quantity'] = $v['quantity']; + $datasTmp['id_attribute'] = $v['id_attribute']; + unset($datasTmp['variations']); + unset($datasTmp['variationsList']); + + // Load eBay Description + $datasTmp['description'] = str_replace( + array('{MAIN_IMAGE}', '{MEDIUM_IMAGE_1}', '{MEDIUM_IMAGE_2}', '{MEDIUM_IMAGE_3}', '{PRODUCT_PRICE}', '{PRODUCT_PRICE_DISCOUNT}'), + array( + (isset($datasTmp['picturesLarge'][0]) ? '<img src="'.$datasTmp['picturesLarge'][0].'" class="bodyMainImageProductPrestashop" />' : ''), + (isset($datasTmp['picturesMedium'][1]) ? '<img src="'.$datasTmp['picturesMedium'][1].'" class="bodyFirstMediumImageProductPrestashop" />' : ''), + (isset($datasTmp['picturesMedium'][2]) ? '<img src="'.$datasTmp['picturesMedium'][2].'" class="bodyMediumImageProductPrestashop" />' : ''), + (isset($datasTmp['picturesMedium'][3]) ? '<img src="'.$datasTmp['picturesMedium'][3].'" class="bodyMediumImageProductPrestashop" />' : ''), + Tools::displayPrice($datasTmp['price']), + (isset($datasTmp['price_original']) ? 'au lieu de <del>'.Tools::displayPrice($datasTmp['price_original']).'</del> (remise de '.round($datasTmp['price_percent']).'%)' : ''), + ), + $datas['description'] + ); + + $datasTmp['id_product'] = (int)$product->id.'-'.(int)$datasTmp['id_attribute']; + + // Check if product exists on eBay + $itemID = Db::getInstance()->getValue('SELECT `id_product_ref` FROM `'._DB_PREFIX_.'ebay_product` WHERE `id_product` = '.(int)$product->id.' AND `id_attribute` = '.(int)$datasTmp['id_attribute']); + if ($itemID) + { + // Update + $datasTmp['itemID'] = $itemID; + if ($ebay->reviseFixedPriceItem($datasTmp)) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('date_upd' => pSQL($date)), 'UPDATE', '`id_product_ref` = '.(int)$itemID); + + // if product not on eBay we add it + if ($ebay->errorCode == 291) + { + // We delete from DB and Add it on eBay + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'ebay_product` WHERE `id_product_ref` = \''.pSQL($datasTmp['itemID']).'\''); + $ebay->addFixedPriceItem($datasTmp); + if ($ebay->itemID > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('id_country' => 8, 'id_product' => (int)$product->id, 'id_attribute' => (int)$datasTmp['id_attribute'], 'id_product_ref' => pSQL($ebay->itemID), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + } + else + { + // Add + $ebay->addFixedPriceItem($datasTmp); + if ($ebay->itemID > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('id_country' => 8, 'id_product' => (int)$product->id, 'id_attribute' => (int)$datasTmp['id_attribute'], 'id_product_ref' => pSQL($ebay->itemID), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + } + } + } + else + { + // No variations case + + // Load eBay Description + $datas['description'] = str_replace( + array('{MAIN_IMAGE}', '{MEDIUM_IMAGE_1}', '{MEDIUM_IMAGE_2}', '{MEDIUM_IMAGE_3}', '{PRODUCT_PRICE}', '{PRODUCT_PRICE_DISCOUNT}'), + array( + (isset($datas['picturesLarge'][0]) ? '<img src="'.$datas['picturesLarge'][0].'" class="bodyMainImageProductPrestashop" />' : ''), + (isset($datas['picturesMedium'][1]) ? '<img src="'.$datas['picturesMedium'][1].'" class="bodyFirstMediumImageProductPrestashop" />' : ''), + (isset($datas['picturesMedium'][2]) ? '<img src="'.$datas['picturesMedium'][2].'" class="bodyMediumImageProductPrestashop" />' : ''), + (isset($datas['picturesMedium'][3]) ? '<img src="'.$datas['picturesMedium'][3].'" class="bodyMediumImageProductPrestashop" />' : ''), + Tools::displayPrice($datas['price']), + (isset($datas['price_original']) ? 'au lieu de <del>'.Tools::displayPrice($datas['price_original']).'</del> (remise de '.round($datas['price_percent']).'%)' : ''), + ), + $datas['description'] + ); + + // Check if product exists on eBay + $itemID = Db::getInstance()->getValue('SELECT `id_product_ref` FROM `'._DB_PREFIX_.'ebay_product` WHERE `id_product` = '.(int)$product->id); + + if ($itemID) + { + // Update + $datas['itemID'] = $itemID; + if ($ebay->reviseFixedPriceItem($datas)) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('date_upd' => pSQL($date)), 'UPDATE', '`id_product_ref` = '.(int)$itemID); + + // if product not on eBay we add it + if ($ebay->errorCode == 291) + { + // We delete from DB and Add it on eBay + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'ebay_product` WHERE `id_product_ref` = \''.pSQL($datas['itemID']).'\''); + $ebay->addFixedPriceItem($datas); + if ($ebay->itemID > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('id_country' => 8, 'id_product' => (int)$product->id, 'id_attribute' => 0, 'id_product_ref' => pSQL($ebay->itemID), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + } + else + { + // Add + $ebay->addFixedPriceItem($datas); + if ($ebay->itemID > 0) + Db::getInstance()->autoExecute(_DB_PREFIX_.'ebay_product', array('id_country' => 8, 'id_product' => (int)$product->id, 'id_attribute' => 0, 'id_product_ref' => pSQL($ebay->itemID), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)), 'INSERT'); + } + } + + + + // Check error + if (!empty($ebay->error)) + { + $tab_error[md5($ebay->error)]['msg'] = $ebay->error; + if (!isset($tab_error[md5($ebay->error)]['products'])) + $tab_error[md5($ebay->error)]['products'] = array(); + if (count($tab_error[md5($ebay->error)]['products']) < 10) + $tab_error[md5($ebay->error)]['products'][] = $datas['name']; + if (count($tab_error[md5($ebay->error)]['products']) == 10) + $tab_error[md5($ebay->error)]['products'][] = '...'; + $count_error++; + } + else + $count_success++; + $count++; + } + } + if ($count_success > 0) + $this->_html .= $this->displayConfirmation($this->l('Settings updated').' ('.$this->l('Option').' '.Configuration::get('EBAY_SYNC_MODE').' : '.$count_success.'/'.$count.' '.$this->l('product(s) sync with eBay').')'); + if ($count_error > 0) + { + foreach ($tab_error as $error) + { + $productsDetails = '<br /><u>'.$this->l('Product(s) concerned').' :</u>'; + foreach ($error['products'] as $product) + $productsDetails .= '<br />- '.$product; + $this->_html .= $this->displayError($error['msg'].'<br />'.$productsDetails); + } + } + } + + + /******************************************************************/ + /** Help Config Methods *******************************************/ + /******************************************************************/ + + private function _displayHelp() + { + return '<p><b>Si vous avez des suggestions sur le module eBay, veuillez les postez sur le Forum <a href="http://www.prestashop.com/forums/viewforum/134/ebay/" target="_blank">http://www.prestashop.com/forums/viewforum/134/ebay/</a></b></p><br /> + + <h2>Sommaire</h2> + <h4><u><a href="#EbayHelpPart1">Comment lancer lancer sur eBay ?</a></u></h4> + <ol> + <li><a href="#EbayHelpPart1-1">S’inscrire en tant que vendeur professionnel</a></li> + <li><a href="#EbayHelpPart1-2">Vérification du statut de professionnel</a></li> + <li><a href="#EbayHelpPart1-3">Lier son compte PayPal à son compte eBay</a></li> + <li><a href="#EbayHelpPart1-4">Configurer son compte vendeur et sa boutique eBay</a></li> + </ol> + <h4><u><a href="#EbayHelpPart2">Le Module Prestashop, comment ça marche ?</a></u></h4> + <ul> + <li><a href="#EbayHelpPart2-1">Onglet Paramètres</li> + <li><a href="#EbayHelpPart2-2">Onglet Configuration des catégories</a></li> + <li><a href="#EbayHelpPart2-3">Onglet Template de la fiche produit</a></li> + <li><a href="#EbayHelpPart2-4">Onglet Mise en ligne des produits</a></li> + </ul> + <h4><u><a href="#EbayHelpPart3">Conseils & Astuces pour bien vendre sur eBay</a></u></h4> + <ul> + <li><a href="#EbayHelpPart3-1">Conseil N°1 : Avoir une bonne fiche produit</a></li> + <li><a href="#EbayHelpPart3-2">Conseil N°2 : Avoir un bon Profil Vendeur</a></li> + </ul> + + + <br /> + <hr /> + <br /> + + + <h2 id="EbayHelpPart1">Comment se lancer sur eBay ?</h2> + <p>Plus d’infos et tous les liens sur <a href="http://www.inscriptionpro.com" target="_blank"><u>www.inscriptionpro.com</u></a></p><br /> + + <h3><u>4 Etapes pour s’inscrire sur eBay</u></h3> + <p>A noter : dès votre inscription en tant que professionnel sur eBay.fr, vous recevrez automatiquement un email (dans les 48h) de notre service dédié à l’intégration afin de vous aider dans cette démarche.<br /> + Vous pouvez contacter directement notre service “Inscription Pro” par email : <a href="mailto:inscriptionpro@ebay.com">inscriptionpro@ebay.com</a></p> + <br /> + + <h3 id="EbayHelpPart1-1"><a href="https://ebayfr.backpackit.com/pub/2214807-guide-pour-les-vendeurs-professionnels-comment-vendre-sur-la-place-de-march-ebay-france-marketplace-ouverture-du-compte-ebay-et-paramtrage-initial-page-2-5"><u>1) Inscription en tant que vendeur professionnel</u></a></h3> + <p>L’inscription se fait directement sur eBay.fr via un <a href="https://scgi.ebay.fr/ws/eBayISAPI.dll?RegisterEnterInfo&siteid=71&bizflow=2" target="_blank"><u>formulaire</u></a>. Choisissez un pseudo, un mot de passe, saisissez vos informations personnelles (adresse, téléphone…) et le tour est joué.</p> + <br /> + + <h3 id="EbayHelpPart1-2"><a href="https://ebayfr.backpackit.com/pub/2214807-guide-pour-les-vendeurs-professionnels-comment-vendre-sur-la-place-de-march-ebay-france-marketplace-ouverture-du-compte-ebay-et-paramtrage-initial-page-2-5"><u>2) Vérification de votre statut professionnel</u></a></h3> + <p>Envoyez à notre service clients les documents justifiant <a href="http://pages.ebay.fr/help/sell/business/existingbusinessvetting.html" target="_blank"><u>votre statut professionnel</u></a>.</p> + <br /> + + <h3 id="EbayHelpPart1-3"><a href="https://ebayfr.backpackit.com/pub/2214807-guide-pour-les-vendeurs-professionnels-comment-vendre-sur-la-place-de-march-ebay-france-marketplace-ouverture-du-compte-ebay-et-paramtrage-initial-page-2-5"><u>3) Liez votre compte PayPal à votre compte eBay</u></a></h3> + <p>Si vous n’avez pas de compte PayPal Business, il faut d’abord vous en créer un directement sur le site de PayPal : <a href="http://altfarm.mediaplex.com/ad/ck/3484-80712-8030-7" target="_blank"><u>créez votre compte PayPal business</u></a><br /> + Si vous avez déjà un compte PayPal, liez-le à votre compte eBay pour <a href="https://signin.ebay.fr/ws/eBayISAPI.dll?SignIn&UsingSSL=1&pUserId=&co_partnerId=2&siteid=71&ru=http%3A%2F%2Fmy.ebay.fr%2Fws%2FeBayISAPI.dll%3FMyeBay%26%26guest%3D1%26CurrentPage%3DMyeBayPayPalAccounts%26guest%3D1&pageType=1883" target="_blank"><u>recevoir les paiements</u></a> des acheteurs et <a href="https://signin.ebay.fr/ws/eBayISAPI.dll?SignIn&UsingSSL=1&pUserId=&co_partnerId=2&siteid=71&ru=https%3A%2F%2Farbd.ebay.fr%2Fws%2FeBayISAPI.dll%3FPaymentSelectionShowV4%26%26guest%3D1%26guest%3D1&pp=pass&pageType=4098&i1=0" target="_blank"><u>payer automatiquement les frais eBay</u></a>.</p> + <br /> + + <h3 id="EbayHelpPart1-4"><a href="https://ebayfr.backpackit.com/pub/2214807-guide-pour-les-vendeurs-professionnels-comment-vendre-sur-la-place-de-march-ebay-france-marketplace-ouverture-du-compte-ebay-et-paramtrage-initial-page-2-5"><u>4) Configurez votre compte vendeur et votre Boutique eBay</u></a></h3> + <ul> + <li><a href="http://cgi4.ebay.fr/ws/eBayISAPI.dll?RegisterBizSellerInfo&amp;guest=1" target="_blank"><u>Configurez votre compte</u></a> vendeur pro (coordonnées, CGV,…).</li> + <li><a href="http://cgi3.ebay.fr/ws/eBayISAPI.dll?CreateProductSubscription&amp;productId=3" target="_blank"><u>Ouvrez votre Boutique eBay</u></a> et <a href="http://cgi6.ebay.fr/ws/eBayISAPI.dll?StoreCategoryMgmt" target="_blank"><u>paramétrez-la</u></a> pour mettre en avant vos produits dans un espace dédié.</li> + <li><a href="http://cgi3.ebay.fr/ws/eBayISAPI.dll?CreateProductSubscription&amp;productId=7" target="_blank"><u>Inscrivez-vous au Gestionnaire de Ventes Pro</u></a>, tableau de bord indispensable au pilotage de votre activité.</li> + </ul> + <br /> + + <h3 align="center">Vous n’avez plus qu’à mettre en ligne vos produits avec le module eBay de Prestashop !</h3> + + + <br /> + <hr /> + <br /> + + + <h2 id="EbayHelpPart2">Le module eBay de Prestashop : comment ça marche ?</h2> + + <h3 id="EbayHelpPart2-1">1) Onglet « Paramètres »</h3> + <p>Cette section est à configurer lors de la première utilisation du module. <br />Vous devez définir votre <strong>compte PayPal</strong> comme <strong>moyen de paiement de produits sur eBay</strong> en renseignant l’email que vous utilisez pour votre compte PayPal. <br />Si vous n’en avez pas, vous devez <a href="https://www.paypal.com/fr/cgi-bin/webscr?cmd=_flow&amp;SESSION=85gB6zaK7zA5l_Y0UnNe_eJTaw1Al_e4hmrEfOLhrEiojJMJZGG-Cw9amIq&amp;dispatch=5885d80a13c0db1f8e263663d3faee8d5863a909c4bb5aeebb52c6e1151bdaa9" target="_blank"><u>souscrire à un compte PayPal Business</u></a>.<br />Vous devez définir le <strong>moyen et les frais de livraison</strong> qui seront appliqués à vos produits sur eBay.</p> + + + <h3 id="EbayHelpPart2-2">2) Onglet « Configuration des catégories »</h3> + <p>Avant de publier vos produits sur eBay, vous devez associer les catégories de produits de votre boutique Prestashop avec celles d’eBay. Vous pouvez également choisir de vendre les produits de votre boutique Prestashop à un prix différent sur eBay. Cet impact sur le prix est défini en %.</p> + <p><u>NB :</u> Certaines catégories bénéficient du nouveau format d’annonce multi-versions.</p> + <br /> + + <h3 id="EbayHelpPart2-3">3) Onglet « Template de la fiche produit »</h3> + <p>Afin d’optimiser le <strong>design de vos fiches produits</strong> sur eBay, vous pouvez <strong>personnaliser</strong> le header et le footer de vos annonces en créant un template qui s’appliquera à l’ensemble de vos produits sur eBay. En designant vos annonces selon votre charte graphique (logo, couleurs…), vous développez votre <strong>notoriété</strong> et votre <strong>visibilité</strong> sur eBay. De plus, un template d’annonce bien travaillé et présenté de manière agréable et professionnelle fait souvent la différence auprès des acheteurs.</p> + <br /> + + <h3 id="EbayHelpPart2-4">4) Onglet « Mise en ligne des produits »</h3> + <p>Cette section vous permet de mettre effectivement en ligne vos produits sur eBay. Vous avez le choix de placer la totalité des produits de votre boutique Prestashop sur eBay (option recommandée) ou seulement certaines catégories.</p> + <p><u>Rappel :</u> Si vous avez une Boutique eBay, vous ne paierez aucun frais d’insertion pour mettre vos produits en ligne sur eBay.</p> + <br /> + + + <br /> + <hr /> + <br /> + + + <h2 id="EbayHelpPart3">Conseils &amp; astuces pour bien vendre sur eBay.fr </h2> + + <h3 id="EbayHelpPart3-1">Conseil N°1 : Avoir une bonne fiche produit</h3> + <p>Sur eBay, comme ailleurs, il faut soigner la présentation de ses produits sous peine de ne pas atteindre le niveau de ventes attendu. Un produit mal photographié et mal décrit ne se vendra pas. Il y a donc certaines normes à respecter avant de mettre en ligne ses produits sur eBay.fr. Cela vous permettra de bénéficier d’un bon référencement de vos produits sur eBay, d’optimiser vos ventes et ainsi de développer d’une visibilité optimale.</p> + <ul> + <li><strong>Titre</strong> (champ limité à 55 caractères)<br />Un bon titre doit obligatoirement comporter ces informations : Type de produit &gt; Modèle &gt; Caractéristiques importantes &gt; Marque<br />Il doit également utiliser des mots clés pertinents : déterminer préalablement les mots clés les plus recherchés par les utilisateurs<br />A EVITER : abréviations, titre coupé car dépassant 55 caractères, références techniques trop poussées, ponctuation…</li> + <li><strong>Attributs spécifiques</strong><br />Renseigner la totalité des attributs produits car ils sont pris en compte par les filtres de recherche et peuvent, par leur absence, exclure vos produits des résultats de recherche.</li> + <li><strong>Prix &amp; frais de port</strong><br />Le prix de vos objets, ainsi que vos frais de port, doivent être adaptés à l’offre générale présente sur eBay sous peine de vous voir pénaliser dans l’algorithme de recherche.<br />La gratuité des frais de port (frais de port inclus) permet de bénéficier d’une visibilité privilégiée dans les pages de résultats.</li> + <li><strong>Description / détails du produit</strong><br />La description de vos produits doit être claire et précise, elle doit mentionner les caractéristiques clés de vos produits, les garanties, indiquer clairement les conditions et modalités de livraison et de retour. Enfin une annonce doit être mise en forme de manière attractive (images, logos…) et adaptée à votre communication en tant que vendeur.</li> + <li><strong>Qualité des photos</strong><br />3 photos minimum (1 principale + 2 dans la description), elles doivent être de bonne qualité et sur fond blanc. Photos des détails si nécessaire. Les photos en disent autant qu’une belle description et constituent un élément important dans la décision de l’acheteur.</li> + </ul> + <br /> + + <h3 id="EbayHelpPart3-2">Conseil N°2 : Avoir un bon profil vendeur</h3> + <p>eBay est la seule place de marché en France à vous donner la propriété du client. Vous êtes donc responsable de la relation client avec vos acheteurs qui vous évaluent en tant que vendeur. Pour avoir donc un bon profil vendeur, de bonnes évaluations et ainsi augmentez la confiance de vos acheteurs, il vous faut évidemment remplir vos obligations de vendeur mais aussi soigner votre relation client.</p> + <p>Vous devez avoir un <strong>objectif</strong> en taux <strong>de satisfaction</strong> (évaluations) de votre profil vendeur de minimum <strong>4.8/5</strong>.<br /><strong>Cette notation influence beaucoup le référencement de vos annonces dans eBay.</strong><br />Voici comment les <strong>4 critères</strong> sur lesquels vous devez soigner votre niveau de service client pour atteindre cet objectif de 4.8 de taux de satisfaction sur votre profil vendeur :</p> + <ul> + <li><u>Objet conforme à la description de l’annonce :</u> cf. Conseil N°1 Description produit</li> + <li><u>Communication :</u> réponse rapide aux questions pré ET post-ventes (Messages dans « Mon eBay »)</li> + <li><u>Délai de livraison :</u> assurer un service de livraison entre 48 et 72h maximum. Attention à la gestion des stocks (délai à rallonge avec un produit indisponible)</li> + <li><u>Frais de port :</u> la gratuité des frais de port permet d’obtenir 5/5 à ce critère</li> + </ul> + + <p><u>NB :</u> L’outil « Gestionnaire de Ventes Pro » vous permet d’automatiser un certain nombre de ses tâches de relation client et ainsi de vous faire gagner du temps.<br /><a href="http://pages.ebay.fr/outils-vendeurs/gestionnaire-de-ventes/pro.html" target="_blank"><u>Souscrire au Gestionnaire de ventes Pro</u></a></p>'; + } + + public function displayInfoByCart() + { + } + + private function _displayFormProduct() { } + private function _displayFormAssociation() { } + +} + +?> diff --git a/modules/ebay/es.php b/modules/ebay/es.php new file mode 100644 index 000000000..e69de29bb diff --git a/modules/ebay/forbbiden.gif b/modules/ebay/forbbiden.gif new file mode 100644 index 0000000000000000000000000000000000000000..c772d4989314e1c09300cd89e8d4ac69ab8ae42a GIT binary patch literal 594 zcmZ?wbhEHb6krfwc*el6Gtl_<(y3PpQofx(|18w|!-TqXiNXK>|9`z{-KVmo=SOya zefID}ciGFNsB5{&zZOl{8*Tq~QtzX>n!_pH?@k<k7V7_M!<y?c0UuiO5BnS6EiZc4 zT=Q$yoR4#+{y4Pvac<J@*RTKHxp6zx>&MpRZ{mWFWd*<MZg`g(_^PSqWmW!@@`BIH z7VQhR{57-fURLI>IbH8h9ea=x{b1Gn3x2kri(-CWKJ&P|;`fT#dy~DMMFxIdx8%$G zxo6YE-(|*rfBy7<kI|pwJ3m(>Jq!2#)|~x)Qtj78^FH=g{@k(dM|bJHisBcQCC_6b zK5W@~J0s=Onw8h$gTM4P{5*a5OrZ6jD`y|q)i4Y+Q2fcl$j-pdpaXIUC{7sI*Eg^? zHMg|3D)<QL>3MP}w6Qar3CfuUD$Da3v@+}YDZ2CPn>%Q-i8L#iX)Efoy1BS`%&@U* z^3e#^cj0l~=j>=@Y}6EDCBvg~>NID7mui!qyNg7dldY^yldsIaYrHp`q|{tYoSwgM zlJ*pC5>wJvSAXeb=_<+Cq`)L^b?T+-JckGaj<!Y#Z8MXIO^L@@8MwFtA1Jzdws2_G ZIdo*4Xzvjci16WX5SZlY)X2bK4FKWw+^hfq literal 0 HcmV?d00001 diff --git a/modules/ebay/fr.php b/modules/ebay/fr.php new file mode 100755 index 000000000..2f6d6b6c1 --- /dev/null +++ b/modules/ebay/fr.php @@ -0,0 +1,80 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ebay}prestashop>ebay_282539987a2276dd5259f8e745d668a1'] = 'eBay'; +$_MODULE['<{ebay}prestashop>ebay_1179327c010f54ade46baea3c3b0ceec'] = 'Ouvrez votre boutique pro sur la place de marché eBay !'; +$_MODULE['<{ebay}prestashop>ebay_6fecf5a008d74051f0e8aae985b37aa6'] = 'Le module eBay ne fonctionne actuellement que pour eBay.fr'; +$_MODULE['<{ebay}prestashop>ebay_8acabcc788c316f92b7850c76265b49b'] = 'Vous devez activer l\'extension cURL et l\'option allow_url_fopen sur votre serveur si vous désirez utiliser ce module.'; +$_MODULE['<{ebay}prestashop>ebay_d591cbc447d01e5a6165096ebfdf804e'] = 'Vous devez activer l\'extension cURL sur votre serveur si vous désirez utiliser ce module.'; +$_MODULE['<{ebay}prestashop>ebay_1b18bd5d9d85f4f667614345ee20e3b2'] = 'Vous devez activer l\'option allow_url_fopen sur votre serveur si vous désirez utiliser ce module.'; +$_MODULE['<{ebay}prestashop>ebay_8e64bc164aee46723ed2d70273c6f8ab'] = 'Vous devez enregistrer le module sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_98f54d8bba6523829eeb8fd7ab9a2088'] = 'Continuer quand même ?'; +$_MODULE['<{ebay}prestashop>ebay_2e4f4d8b849fb72905addc231d160e8b'] = 'Status du module eBay'; +$_MODULE['<{ebay}prestashop>ebay_85f9d92e0551772437b934b7222d63cb'] = 'Le module eBay est fonctionnel.'; +$_MODULE['<{ebay}prestashop>ebay_090bcb46805aadf384074d380b4c78c8'] = 'Le module eBay n\'est pas encore configuré.'; +$_MODULE['<{ebay}prestashop>ebay_9a5c99bf25e84cd8fe7c500f7ec698f2'] = 'Enregistrer le module sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_f09ea5dca3d187c50a634239778a5a3c'] = 'Activer \"Allow url fopen\"'; +$_MODULE['<{ebay}prestashop>ebay_c7760f2c36d4e647e8a254cef51cbae8'] = 'Activer cURL'; +$_MODULE['<{ebay}prestashop>ebay_16bfbf9c462762cf1cba4134ec53c504'] = 'Chargement'; +$_MODULE['<{ebay}prestashop>ebay_b383064f397ca4f9de45a6dadc6a07a1'] = 'Une fois identifié dans la fenêtre eBay, le module finira automatiquement l\'installation dans les secondes qui suivent.'; +$_MODULE['<{ebay}prestashop>ebay_d9334a0c5b4432b2ad87fb9c90e9f44c'] = 'Vous devez renseigner votre Identifiant eBay'; +$_MODULE['<{ebay}prestashop>ebay_4285b577739883af893c3b1320690b70'] = 'Cliquez sur le bouton ci-dessous'; +$_MODULE['<{ebay}prestashop>ebay_7ba7cc1dfb00eca77b600084f4ba1304'] = 'Identifiant eBay'; +$_MODULE['<{ebay}prestashop>ebay_3225a10b07f1580f10dee4abc3779e6c'] = 'Paramètres'; +$_MODULE['<{ebay}prestashop>ebay_dc2f736ed903b4f6f72a36b763cd7717'] = 'Configuration des catégories'; +$_MODULE['<{ebay}prestashop>ebay_0f5f872ba4c6575319e6beee6ebcc481'] = 'Template de la fiche produit'; +$_MODULE['<{ebay}prestashop>ebay_47ba6504eb5b1e3a95ea3dbd960904db'] = 'Mise en ligne des produits'; +$_MODULE['<{ebay}prestashop>ebay_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aide'; +$_MODULE['<{ebay}prestashop>ebay_e5beb503fe9553f0ed5be3c324fc9cb7'] = 'Pour exporter vos produits sur eBay, vous devez créer un compte pro sur eBay (voir la partie Aide) et configurer le module eBay-Prestashop.'; +$_MODULE['<{ebay}prestashop>ebay_230b8b5e65ef7731d72a42b1ddb0293f'] = 'Identifiant eBay'; +$_MODULE['<{ebay}prestashop>ebay_ad44bf098615279532ded210754420d4'] = 'Voir vos produits sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_5d8ae2a94331ebbfe854eea0274e939c'] = 'Votre identifiant eBay'; +$_MODULE['<{ebay}prestashop>ebay_4b9f5155cc88fe352fbf202a3ba57f04'] = 'Boutique eBay'; +$_MODULE['<{ebay}prestashop>ebay_3e0fb5fcfe85cdf0f83fefe3530d13f4'] = 'Votre boutique eBay'; +$_MODULE['<{ebay}prestashop>ebay_97b4fc969316e8d08c1b0bb1f0b05fbd'] = 'Voir votre boutique eBay'; +$_MODULE['<{ebay}prestashop>ebay_1734acc41e3889028ca0f0d13ef5bc93'] = 'Votre identifiant PayPal (email)'; +$_MODULE['<{ebay}prestashop>ebay_4883ffdb0b673bdd200f3d96709c26f5'] = 'Vous devez renseigner votre e-mail de compte PayPal, c\'est le seul moyen de paiement disponible avec ce module.'; +$_MODULE['<{ebay}prestashop>ebay_83d893ae1e34a74ab9a068e1d190c764'] = 'Moyen d’expédition'; +$_MODULE['<{ebay}prestashop>ebay_3d346df981cf71d3a81b57c1af58f1f4'] = 'Frais de livraison pour les produits sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_552a0d8c17d95d5dbdc0c28217024f5a'] = 'Frais de livraison'; +$_MODULE['<{ebay}prestashop>ebay_ce178f4fe9684e5786aff36ab3cf81f6'] = 'Votre code postal'; +$_MODULE['<{ebay}prestashop>ebay_bb9a2f66fc726c85e45c8ddc93297ab9'] = 'Votre code postal'; +$_MODULE['<{ebay}prestashop>ebay_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{ebay}prestashop>ebay_153e4104f5a42e006735dd85847760b1'] = 'Chargement des catégories'; +$_MODULE['<{ebay}prestashop>ebay_123b3c98806c47a9bfa5fc7480e5327b'] = 'Votre identifiant eBay n\'est pas spécifié ou est invalide.'; +$_MODULE['<{ebay}prestashop>ebay_179d471a6a534b682050411984ea1c05'] = 'Votre e-mail de compte Paypal n\'est pas spécifié ou est invalide.'; +$_MODULE['<{ebay}prestashop>ebay_d0f2d9c05a3140a5fc81fd0cb6b330e2'] = 'Vos frais de port ne sont spécifiés ou sont invalides.'; +$_MODULE['<{ebay}prestashop>ebay_458d329d5eb1caf63615141fb51e8329'] = 'Votre code postal n\'est pas spécifié ou est invalide'; +$_MODULE['<{ebay}prestashop>ebay_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{ebay}prestashop>ebay_b9284bff13acffdd879ef4ac7fca5234'] = 'Configuration non mise à jour.'; +$_MODULE['<{ebay}prestashop>ebay_67e19ffdaa0a11e69349810403a9727e'] = 'Vous devez configurer l\'onglet \"Paramètres\" avant d\'utiliser cet onglet.'; +$_MODULE['<{ebay}prestashop>ebay_1fe6b0032a7882ef20d08a5386441e33'] = 'Pour mettre en ligne vos produits sur eBay, vous devez associer chacune des catégories de votre boutique à une catégorie eBay. Vous pouvez également définir une variation du prix sur eBay.'; +$_MODULE['<{ebay}prestashop>ebay_1bffdb0b10182ea51f7baa97ee2d19a8'] = 'Vous pouvez utiliser le bouton ci-dessous pour associer automatiquement les catégories qui n\'ont pas encore d\'association avec des catégories suggérées par eBay.'; +$_MODULE['<{ebay}prestashop>ebay_36be9eda23888bf12f74d6cd9d46ba1d'] = 'Suggérer des catégories'; +$_MODULE['<{ebay}prestashop>ebay_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Catégorie'; +$_MODULE['<{ebay}prestashop>ebay_649829dea8fe9632cc51a9aa3c8826c3'] = 'Catégorie eBay'; +$_MODULE['<{ebay}prestashop>ebay_233c543a23378c4ffd0e1efb17408510'] = 'Impact sur le prix'; +$_MODULE['<{ebay}prestashop>ebay_a5612305bb46e3d0ea547f4a963a01d3'] = 'Aucune catégorie trouvée'; +$_MODULE['<{ebay}prestashop>ebay_55ac32003f11f511412875f283f4f303'] = 'Aucune catégorie selectionnée'; +$_MODULE['<{ebay}prestashop>ebay_628b583852257bd453a9a2c38a65fd6e'] = 'Attention : Seuls les catégories par défaut des produits sont pris en compte par cette configuration.'; +$_MODULE['<{ebay}prestashop>ebay_6c09b50ba3b52d0d61fb785adeed1895'] = 'Vous pouvez personnaliser le thème graphique de vos produit sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_c01f01fd2bd607cf17ddc2ee584227f8'] = 'Vous devez configurer l\'onglet \"Configuration des catégories\" avant d\'utiliser cet onglet.'; +$_MODULE['<{ebay}prestashop>ebay_1cbd8f2b57c85344f755caff03336306'] = 'Synchroniser avec eBay'; +$_MODULE['<{ebay}prestashop>ebay_86024cad1e83101d97359d7351051156'] = 'produits'; +$_MODULE['<{ebay}prestashop>ebay_05aaf6b3c49c3aa6219a1d730ee7988c'] = 'Vous allez maintenant mettre en ligne vos produits sur eBay.'; +$_MODULE['<{ebay}prestashop>ebay_3205b263a1a779c2b03cdbac836346f9'] = 'Pour rappel,'; +$_MODULE['<{ebay}prestashop>ebay_0eaf4172db11a5d6e914aabe920f0455'] = 'vous ne payez aucun frais d’insertion si vous avez une boutique sur eBay.'; +$_MODULE['<{ebay}prestashop>ebay_25740d6b53eafdd8a64299e1fe92f247'] = 'Choix des produits à mettre en ligne'; +$_MODULE['<{ebay}prestashop>ebay_97855df0367fedf5648d745bfb57412b'] = 'Option A'; +$_MODULE['<{ebay}prestashop>ebay_2c53ffc482419e404cd47559e5004b2e'] = 'mettre 100% de vos produits en ligne sur eBay (recommandé)'; +$_MODULE['<{ebay}prestashop>ebay_8890755ccd5ac4f777efdd0a6c16c4ab'] = 'Option B'; +$_MODULE['<{ebay}prestashop>ebay_4ac5ebfcb9b9d8c87e9ff03ee6bf24e5'] = 'choisir les catégories à mettre en ligne sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_054b4f3ea543c990f6b125f41af6ebf7'] = 'Option'; +$_MODULE['<{ebay}prestashop>ebay_892db3f832f6fe1a2d04e1e50e65d3ca'] = 'Lorsqu\'un produit est mis à jour, seule sa quantité et son prix sont resynchronisés avec eBay'; +$_MODULE['<{ebay}prestashop>ebay_e0626222614bdee31951d84c64e5e9ff'] = 'Sélection'; +$_MODULE['<{ebay}prestashop>ebay_caab0e2c2f3ae0d242b0b36f22d9acc5'] = 'Vous allez mettre en ligne'; +$_MODULE['<{ebay}prestashop>ebay_70b240eb3db5174e1c9520cabe2ae781'] = 'produits sur eBay. Voulez-vous confirmer ?'; +$_MODULE['<{ebay}prestashop>ebay_6d371302939f2bba5daf55544efb956f'] = 'Attention ! Si certaines de vos catégories ne sont pas compatibles multi sku, certains de vos produits peuvent créer plus d\'une fiche produit sur eBay.'; +$_MODULE['<{ebay}prestashop>ebay_547c708291fe196592dd1e4db7b206a5'] = 'produit(s) mis en ligne sur eBay'; +$_MODULE['<{ebay}prestashop>ebay_1761efb946aa43c14af989665dae691a'] = 'Produit(s) concerné(s)'; diff --git a/modules/ebay/it.php b/modules/ebay/it.php new file mode 100644 index 000000000..4e4c5bcc6 --- /dev/null +++ b/modules/ebay/it.php @@ -0,0 +1,7 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ebay}prestashop>ebay_282539987a2276dd5259f8e745d668a1'] = 'eBay'; + +?> \ No newline at end of file diff --git a/modules/ebay/loading.gif b/modules/ebay/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..21c7e74db6eeff618adbe86e4525dae1bebc24f1 GIT binary patch literal 58913 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 DCq47a literal 0 HcmV?d00001 diff --git a/modules/ebay/logo.gif b/modules/ebay/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..af3bf2751c6811bdca2541731bb735974df6463e GIT binary patch literal 597 zcmZ?wbhEHb6krf$I2O&o%Fw{TFo}U-vH(LHKjQ>ew%MT!G4k?@o-%N}Vqmq>EBed8 z@Rxz{9|OZLW|rT~%pN9DKe&0mi3oj@6#t>1_}jqXx2^3TSGRB8UU!01z9uJ~&uRLS znen}_@Ox3g*S?<Vrx|9PW}0?}eb!m-IcK?7oMxDNmhaEfrKfjw?%45Y*+u1Zrx{jW z(fzZ2{pu@*=k{IOa?^d=P2WGecJ8<x^y9q1|BH-&FNpuSD7X7w;@*1+zb|QjKXUl+ z{lX&;^DkX`@%y^n?^{8iZ{_^I7x(u;>hJ5<ufLk};Nja}&sv_p`1J41!r$-K{du?M z#iwI0znppV@z;lMcmDqR_3QVqKfizd{`>X!-*3PFe*gRL_dgK${~t{Jr!P?aXXzZ| z>KNi5WTlXvqMKEanyyf0sAr&{QCggtm#*OH<*wir;OeeWW@e<Rqfl6yn3GvjsbH&M zZotK$!@$7IAi%)Gz`$PH5Z%<=(%RM%-rn399noZ?=O1QZ7#-Pc#}w^tW}<5BtKb^t zqN{GC&!nm0Zm+GZr4lC3Eh5Xu!NSUAYUQA$=o2l-BP7hv$>t~EXzpa877{MOD`PDs r$?V49?B!{x791TQCnhQ`&B(~!Y^xJGts}@Iu(PM_d)Ke_Mh0sDK9Nou literal 0 HcmV?d00001 diff --git a/modules/ebay/sql-install.php b/modules/ebay/sql-install.php new file mode 100755 index 000000000..543291a1c --- /dev/null +++ b/modules/ebay/sql-install.php @@ -0,0 +1,52 @@ +<?php + + // Init + $sql = array(); + + // Create Category Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'ebay_category` ( + `id_ebay_category` int(16) NOT NULL AUTO_INCREMENT, + `id_category_ref` int(16) NOT NULL, + `id_category_ref_parent` int(16) NOT NULL, + `id_country` int(16) NOT NULL, + `level` tinyint(1) NOT NULL, + `is_multi_sku` tinyint(1) NOT NULL, + `name` varchar(255) NOT NULL, + UNIQUE(`id_category_ref`), + PRIMARY KEY (`id_ebay_category`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + + // Create Configuration Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'ebay_category_configuration` ( + `id_ebay_category_configuration` int(16) NOT NULL AUTO_INCREMENT, + `id_country` int(16) NOT NULL, + `id_ebay_category` int(16) NOT NULL, + `id_category` int(16) NOT NULL, + `percent` double(10,2) NOT NULL, + `sync` tinyint(1) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_ebay_category_configuration`), + KEY `id_ebay_category` (`id_ebay_category`), + KEY `id_category` (`id_category`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + + // Create Category Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'ebay_product` ( + `id_ebay_product` int(16) NOT NULL AUTO_INCREMENT, + `id_country` int(16) NOT NULL, + `id_product` int(16) NOT NULL, + `id_attribute` int(16) NOT NULL, + `id_product_ref` varchar(32) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + UNIQUE(`id_product_ref`), + PRIMARY KEY (`id_ebay_product`), + KEY `id_product` (`id_product`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + + +?> diff --git a/modules/ebay/sql-uninstall.php b/modules/ebay/sql-uninstall.php new file mode 100755 index 000000000..c5c2ed36e --- /dev/null +++ b/modules/ebay/sql-uninstall.php @@ -0,0 +1,9 @@ +<?php + + // Init + $sql = array(); + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'ebay_category`;'; + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'ebay_category_configuration`;'; + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'ebay_product`;'; + +?> diff --git a/modules/ebay/template/ebay.css b/modules/ebay/template/ebay.css new file mode 100755 index 000000000..bf575a4bd --- /dev/null +++ b/modules/ebay/template/ebay.css @@ -0,0 +1,14 @@ +.ProductPrestashop {background-image:url('images/header.png');background-repeat: no-repeat;width:1150px} +.headerProductPrestashop {width:1150px;height:130px} +.headerLeftProductPrestashop {text-align:left;padding-left:10px} +.headerLeftProductPrestashop img {border:1px solid grey} +.headerRightProductPrestashop {text-align:right;padding-right:10px} +.headerRightProductPrestashop a {color:black;text-decoration:none} +.headerSearchProductPrestashop {background-image:url('images/search.png');background-repeat:no-repeat;border:0px;width:215px;height:31px;background-color:transparent;padding-left:35px} +.bodyProductPrestashop {text-align:left} +.bodyMainImageProductPrestashop {border:1px solid grey;margin-right:15px} +.bodyFirstMediumImageProductPrestashop {border:1px solid grey;margin-top:10px} +.bodyMediumImageProductPrestashop {border:1px solid grey;margin-left:10px;margin-top:10px} +.bodyNameProductPrestashop {font-weight:bold} +.bodyDescriptionProductPrestashop { } +.footerProductPrestashop {background-image:url('images/footer.png');width:1150px;height:53px} diff --git a/modules/ebay/template/ebay.tpl b/modules/ebay/template/ebay.tpl new file mode 100755 index 000000000..769752ed5 --- /dev/null +++ b/modules/ebay/template/ebay.tpl @@ -0,0 +1,35 @@ +<link rel="stylesheet" type="text/css" href="{MODULE_URL}template/ebay.css" /> +<table border="0" cellpadding="0" cellspacing="0" class="ProductPrestashop"> +<tbody> + <tr class="headerProductPrestashop"> + <td class="headerLeftProductPrestashop"><img src="{SHOP_URL}img/logo.jpg" alt="{SHOP_NAME}" /></td> + <td class="headerCenterProductPrestashop">{SLOGAN}</td> + <td class="headerRightProductPrestashop"> + <a href="http://feedback.ebay.fr/ws/eBayISAPI.dll?ViewFeedback2&userid={EBAY_IDENTIFIER}&sspagename=VIP:feedback&ftab=FeedbackAsSeller">Consulter nos évaluations <img src="{MODULE_URL}template/images/stats.png" alt="Consulter nos évaluations" border="0" /></a><br /> + <a href="http://my.ebay.fr/ws/eBayISAPI.dll?AcceptSavedSeller&sellerid={EBAY_IDENTIFIER}&ssPageName=STRK:MEFS:ADDSTR">Ajouter cette boutique à mes favoris <img src="{MODULE_URL}template/images/favorite.png" alt="Ajouter cette boutique à mes favoris" border="0" /></a><br /><br /> + <form action="http://stores.ebay.fr/{EBAY_SHOP}/_i.html" method="GET"> + <input type="text" name="_nkw" class="headerSearchProductPrestashop" value="" /> + <input type="hidden" name="_armrs" value="1" /> + <input type="hidden" name="_from" value="" /> + <input type="hidden" name="_ipg" value="" /> + <input type="hidden" name="_sasi" value="1" /> + </form> + </td> + </tr> + <tr> + <td> + <br />{MAIN_IMAGE}<br /> + {MEDIUM_IMAGE_1} {MEDIUM_IMAGE_2} {MEDIUM_IMAGE_3}<br clear="left" /><br /> + </td> + <td colspan="2" class="bodyProductPrestashop"> + <br /><br /> + <span class="bodyNameProductPrestashop">{PRODUCT_NAME}</span><br /><br /> + <span class="bodyPriceProductPrestashop">{PRODUCT_PRICE} {PRODUCT_PRICE_DISCOUNT}</span><br /><br /> + Disponibilité : <b>En Stock</b><br /><br /><br /> + + <span class="bodyDescriptionProductPrestashop">{DESCRIPTION}</span> + </td> + </tr> + <tr class="footerProductPrestashop"><td colspan="3">&nbsp;</td></tr> +</tbody> +</table> diff --git a/modules/ebay/template/images/favorite.png b/modules/ebay/template/images/favorite.png new file mode 100755 index 0000000000000000000000000000000000000000..5e68725585a5d17dc0d02849c7cfc246deb9a98a GIT binary patch literal 1110 zcmV-c1gZOpP)<h;3K|Lk000e1NJLTq000&M000&U1^@s6#I$TX0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#_(?=TRCwC7lu2wGRT#&=x6JBz?9_46 z)FG{sl+|iPC8%f*J)~ukxRgWSP;PJlk)m>7k+^Z=gb)I$AV5M0AwVjJv^i0hAaNk7 z+NPvUA*pfVD9++#Jho@vEPUgPQJ^%5R58-?v)=Oi{@?Zp?C>jHeDOZu9eQ*5+{NBw z)Bbkn=}w@9bA1murKykH%B4@`<iSUGa%Wp`{u`iyYrd`+_aByH16lCwvC`CYsXGFP zP$2BIk~(}c-Zu*I%u~SCo)MtZsXJA?PwLqJlF|PRQ0f8!2h`*NC2+0h3*)`=Ru{=_ zl*VuxX0d(mB!|Wx(h`FJe!Zn5z~4rB7Ho6=JF2E%PG;YpzAYF*24VVxOv_{`j}KF2 z*C11S_9}^c2eiZxA%O`HcmN*Gz70Mxpk6HqUsyN%0H%FWne`frKLlPQ=UQ{Q%#+Iw zL1+@$V@mqyYiifSF*!a6Oo{>J46|kdxa$ZN2&~~~L~;}WX%Be50<I^6>y*K@7MqTF z{ZgZv|9I~cm(Oss$+;%OJ)ONHu~-r#Ag&<*9d_C&@He0Vt`QQgp#irJOuh?;0g8@A z(mkx21>?|q{wIzH&d}V7Rx<1K>)OJ3UpO{iZsI_tBve;H;0pf7_)=V_b~K|0QXFR* zoio9;i%?s+VwFuX9!g@LPdLE`XT57rA1(VzP&uM@4RT6LVXxsprJ;0!AmSn@9H^Y5 zXUy1GBR<Bw6IN!v6#3tOd4DD^z4`6;^?<drI65N#%DknFOzA;6?g1rvyyUbl0`)hb z1QSSA9Ox}&ErUK7P?@^`e_WmXWUXSqHTp)`Y$<MoKRfS;?A^O2`i=Z?u4;XXfo=mP zj+8gl6Fg5tL+x;(F&2mFpTEJ}l?y-5FTt}XUagecJhr*^#wRWBl~I3)>*^6L9T1?6 zNU;}%BaD4DGFEJbVtw|yu&OJkkDoFxZ)Wj-7dF?rZ4yEl0t5G-n_+iAxE6YYMj(fk zSQEM;3b$}>=@>bcrs^sIhVFv5sX56e_}`BymK#wx3)Jnw04XXXkU0^EfQL4mN)SS@ z$_NnNrdvR0n8j9;Z4LJA)g&+qzRy8aC8*B3P+1Ul*A>gyjJjsXsl<TBwcQS|ut1~$ zyN{+@jkFcmbBbW)I-$OxKyk@xu9oRpN3i$SYw|)u7ka$Rk0sWev7SA#{Za=uYOM~! zC45`Ovy1#g@XZ@*CYzg_W)tszQC*DsI1F+%tjtFas9(Ks!g;Je?LE%Wi(-lX80`oD z^=yW*;=8*PJ+6~ju3&@X2Kd@Q`0h%P2pVNn;Im;L%BotXo50kJvvjlIg>5RL{Q&;2 c?=Jxc0BeDyv!|}fhyVZp07*qoM6N<$f*t+|%K!iX literal 0 HcmV?d00001 diff --git a/modules/ebay/template/images/footer.png b/modules/ebay/template/images/footer.png new file mode 100755 index 0000000000000000000000000000000000000000..4a10b5c7a4be1cf71e5d3371c54466ff9480bb87 GIT binary patch literal 5910 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 Q2i+KQQp%EW@%MrM2jE6kP5=M^ literal 0 HcmV?d00001 diff --git a/modules/ebay/template/images/header.png b/modules/ebay/template/images/header.png new file mode 100755 index 0000000000000000000000000000000000000000..0a5b9fe5b0bddadde0edb259265e717b258167bc GIT binary patch literal 5345 zcmV<76dvn|P)<h;3K|Lk000e1NJLTq00fc%004pr0ssI2k`{Hq0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU`gGod|RCwC#-D!^8I1+|o72#v_{qNAH z^9;s7Ps4VVGbJvuJm0@6q$sYzco`)1@%P_<|Mk~j*L8h-d|dz1Pk(;#|9cO9_Os_H ztp5Mpq!v9G>IW;5y7$QH^d~<1{PF4O>`(mo>)Pg-=$^iR|1Qr5UpFi9hv__d{NA&# zKXoJhKRz<??U8@*B;|M0-2eZFDcpY1yXlXIj>SWi3d?L05eu_LV78C{DGRgR%WZ9D zn^-41GmP1&l`?kw&3Rt>u33pcOlSY}H_;Ud?g$<H!A>vkU|?nsmE2B$tjOi+cACgw zr+N}*+ste`C#{1MUOMNXo)?JLi2gkg(hc4k@OC_%{qrDli%f3uiSGHR*@I5wATq9N z>?|~o*^(OQb@OF}h0;*KhSrG6ARKsG#8>M|aW?FR+&Yk3oQTV|oIiQ*2y&$D_IuO) zAG2Y$)w3*M<Bt*<FU(z#uv=JidpCXLwwc^EkltDFyOI9bPl^XCG)~vSY?y8ONLe@i z12(iq)OMt&eo=%4!Oe#b-g*SN6(hGShum(Dh_Ul!LBf{@1GS4P5VK9O#YYaar3kWd z<IoyW+X1x`-Xf=L!z6O+KyIfFxxM(**w!#{VxXI8bDLqU&1|nv7%O%@1blXbOR>jU ziSM_eH6lYSyFCmNc0+C%$!-5aLrij84J@yuKOQD(d*tzTi#VoXDYHee>@k^bvz2TJ zY`khBBd!d*Avfgq?hj6FvO7D{H-O)b@_t+Wf>7Yw`5F?;hS}l(+ZFpG)KIN$b7cHl zbm0~c+Z;b~xH^0PeanhhOv(I{L>@l-?t`yC@^0dP{QbmNZ}`Ez9NvC!mjAD=v9JI9 z_5a^Cz-V6DKFjWjpspLU39<n;Dp}R9=L+DJp`&P6wWkKAWd2Dax1U9Bo58Ftxt#*P zuhSpb;=^<MX(!#SlE;~C+a1A}EqIV^wI>~U2bBGg>uUA4DqJ)jiQP!C#*uf!q}`Iy z{7K=KC!q9J?TrWr>?Xotz3q`%pboQTXSSrC2VjfLFe*fCOs~?OHe}H&rX-8pc9L5V zmv1u*#Bt{LI7nY)Z%j`yV0~3R(pH$+g4pg*%ocgt&d5ca>4{9DPOzMHmd;_fhhM=# zZi&Fm_W+hY{>LATCvQDvp>joO%U>ON@cV47m@T895gFLHzaTAO^{NoICGT8-+=BR2 zr$PeT$Sv23%-pS#V}B01ZI3(!U1!tBY?uwO0SQw1J>e~5sgYYNa$A)C*_)_0JN8FT znT=Wex9zUN6ivRmQ4?Jq*_qjn9~(I3>jd<rIKfas(}1^1Swe0{{DEyLmsz_HLR^~( zZQb1@WAjqMo(eiegR5aL+Gsp@4N1v~B+<kiX9*^0mO}A>+R$p?Eu-bBcS%V=ayzv) zeWhLBuW=n^*t<!_!{>LhTo!ge%R;V>#B8T5ksuqVpR}eSzcW9PFDYqDZh4o^V**(7 zyGg#nwu8r+!h(3Z?U9%bvz=l#-W%thv~rLN>64$ZN8OT6zM;s?R>`^l&uG4W`g7cV zG6;{xY~!#u{_h!|iA-m}X=BA4oOHz(us!$VdGMOPb3OFQ4{}@WBqSxbuv;ZVEubU{ zxQ!ZY8ieo9n#jnPL+&wNHJB|IQw8*mxT;)sx`g2R87Sno*;Uw<a?)K|_jodRkY>;0 zU+~_z@k|^NEp`)03aC4^J#t%{9_&0eMpp9A&>HC>9bgH$^&z)|*OR314}*BiM>4bM z@n1Cp8nqxzGPgek-`{x3cEn%hO4kGpnXRoqiq=S<$!H~zTOV?>RkDm5zuEcuEUY!& z`t?!<O%ZBa)b$-&3qpedPeNn1bT!ZOCKwa8)a-LQa?9R}nrxLkOJYYdvj=v5(kNyS zV}{hu#;?0=k94H13A1(cJJA~HRF&+;(wt=c=I8OLIb8u$aNUvE)N!|bT^Yx9>nq(? z)KFWBp;dAP1+#Tvwoo1qN0SJ@Wj7$L$jw&C&F@XYDgthA{cN1-#1YJ5jZj-mD$CVd zFdIjQCr#99jiAFKRHfbf(T*_04CS5OoYgAec53*H$m2HGskV$%7UYAExy&MF<7p`- z>49ZRirlhHd_l-3remDTtIX)_AGtaI*Po5Af3fF)U8snsP+JhVioZP)v-NbaxXT3I zkQ;JKROi{fl)_+k*5S{nkuJwVZJQsjJ#C+YJ<NvL02}F<$gM58<(jhhB#Y~U`1YYf zRzLl0Y<tt9Vn<*<p|<0!m~ML{X2WcNjr3CF)|T9QZk6nOH%ZKIxCI>DU;k_z?>zxA zEQNK>7;1~Q+*M|KBtM2LOr*!wC|#c$N^F&^>R~4G<Rc&QdK=pUvSxu0T%{qGV%I@5 z*ekPH1+#H~3B0j6o$a2b&wze%ggV^g!$&?dweDx*vxggAMzXW(3$@L9X|C;&j<j(N zuVx>eBk*Q~#>qqTt&#$6-TG(Jas9>5GF?eh=`xaBY*5ejtl@3cW;UKK5nHNU$gN?^ zMvi<O@z|I8|GD-_j)NW1Wh9YJq)=P-$qBOoHX?nSC9G;=L#<E;_g=cWG==v`jwe7B z;UbWRmyskgWR>c_$@WNSp;n1>^77=?82~Ev)vwFq!pVTh@DS%ljjkE0Av2y6U7Ckb zi&a(`6>W2IFdOwDw|c$3D!G{oYdB6ByFtC(Z9A)RL~Ex+k*Io5hZzdDT4x7Eafoz# zii{Zz18y!RDPQmvKO0wo>nx{NT;6G;2_7V6=Gw*xvndXd&d)aH%BO%^fy)#klqkzS z$q}=o<ZVKik;Ly#sae{+ZHhybVhHp(L6kQGq1s5mt&fLepX6<gP~E}~$@t@+r9({` zRR1LEHWrNQu(eb;;FcH6%J;@o{bAJW)_Pc+rU_-{3Y<lBHa-3jR+&V|Ez#RM2i(eZ zxqADRx_x*1^@bixUr-)$n)fpzoyzDSGBngAHsIQEvo~aEWXyEZe#78)v(7?on2m^x z^j3xP5oeBc&jRkLhtZ^?mv^d`-ptv}!12Y2h?vuW1u-ibI9%w?I5&D$qP|7M|4<Mj zBZaOKHy+z3S<D5sAM!r7`6PfImO2kEBO#tB5!D#=b`Qy0XScbGvwe@PMvYSGXGskN zmzU?E4vCl@BK_Q`DaH#cG&=MQJzgzo8qzLA298n`CXMF%B%QT6p7Raw8V#$}B0;NK zD*W|N9iE6-02Qc!RI<+FcZ2;o9F>YBTBvT7R{>QZ5itU!-BnsWJQ<twR27{KW0j_s z`jkl5B{GOKiY5jsN1W%*L7HJOFbx_=@rj7YMANfc%0v|Oid-Y>#=Az_PGDicP-m5h zh!`TaRNX4C9HuDOh+HWQqB?}xI;0{H5wUMXhQ??GsdC7U6A=*+af*~H-Mfb2N5s~U z79ldA)SmVwimYK^6A=*+abQT_2vr-_CL&@RH5~TJC5J>rM8pB05ZLDa5=MbY-ykAp zf%Fa1!9rsj5fKp)QDk4-P8mwke6Y<}A|fN5h=_<n3$}5~h=_=Yh`7+OjfjYdh=_<_ z+Z28O{#_*y5&J+yL}ZGDZF(vZ5fKp)SCe2Hu`EPHWXhmUePicS#Q1D}*H9xwWRMaO z5t)T4vP9dAG3Dx2E>@d}h(#r$bQWMVEHe=iV?{*F5ow^vwV@6pVjB@LSVY9ck@i(C z<;q*G)$bZwOAgJfL_|bnx+jXP5qU^6AL{U7K?LP>NJStb)`0XSD$qcqZBK#$>;>yX zM8ptLb0^K1;>u<z*T`5|Y<=+BU^i8!CMF_cg;b^->I@U#HMHxL95!F!P%hH$MAXU- z)H7w)9BUW9OqM!(#iLR$;SQ=>MnM5pAd%rir1$c~>fy=gFbtXpmqo6#XVsdnQV<dK zF+SbaTO;J$#;z2VHiEYq<k*%t(jX!t(|XT2uB{Ki&*aq2D*lFA8aMLcPI>cg2SZ>v zQ}ya3M23tyq_ggOz@_<seX>cka3rm=fc?*qK-$5rHkm4j3>F0`S-l!XLw5j~u|H?R zxM4dYtH)?^eYgumhDkTGX@{gdz_Sz{_-HbCjEb=3wNDZo@Z^Yy$aE0Xl@bwoCGkDA zG~&D3iPiv+XV^Rx*e6*sla*)(xe=8g9YSrZQ;R&sqnEHv)`wch+)OvexdJ8Pdh!?) zN?C{|4hqah8nkU5;MrWCd>qN2U~ZFwhhoJe3qk^J$c>0wOkpdtK&Y*-Kht)HBs}}< zXCuX^SbF*CPH(<|MUw|JH>pgbZUe!%F4i=C8no^Coq7k`t{>61d+!$5O$TOe*NVV4 zmq>Al41v7G5o$9`Dml`L?v{+!Eywiwa_NnN^9jt~+O*P<9wN-f=2vQ+cb~FDlAnCM zWq<rRg6Fa=_ZR4Jp_=||TW6Uak(&|`J?!w9t)~qUYKvK9J0#;1&0AR=@%`-h4U@=t zRk}}db0$MI>$<Y@QIv>CS1&(!h1!BUPJ3P|QZgm0J4e$v2#)qi<}G;YJsX{;D@8k1 zBJf7Ffeo{Do@#~KN_snXNFL0?XFnT>@|uYLBX_&V>qfyxU^EL@_`riN)Dh{}m`z<x ze{ZEwTSk{=Pes++A^FeGMr6b)z(_UlpdK^inr65xm3%?)M*1@YcrXvqnylgV{j)Ov zbvkD~$pW#En5T+H5PZywc^S{Y3Ai<%@Hj4<T_VF1vmH+`_zW)8mT~w;zRLf3j~cmh z+~@RU$$;A;3%I#~nrxLsZs3imTi2~UBooa(1;A!?vKbHK)C<AwiPZi3XCvA&Lq@h1 za5IM?H;$Cj5nwYI``Co%`OLNCx+mEV`zJ$zXgY&7_R!%vRNd2l0&cV35-Q-9Zn{El zTwx-;6tfkuqCK}qc0SeSGLn1v^V6T>%BDTUwWpWY2)G4Vcd4;%$D!%$HG((NGcj9= zluvmt)()<sApw_>yr}Ut)t%kkDc}}lbY(nl8-M=Db<Du_p`9)=ej~uvt&Dw`E&gPk zdRvfCTTIVkR;L=d#$M!x!F73UqC;-TjW<cuZS5dV8Cx-1jqQ=svmw+L#H9&)8Oe`7 z$E<=y4mHl=@{(W{{B9D5+>l#aaszLqzjd%?m@T8(&v+BbsmF!dCThG6U`Kj<uI5?9 zbq~*;roNjbz6nNd{L4Ls#c!m86|)|>Y;{IvYjqPz@W;=>-dwoY^Z0LnHV*dVL@jg{ z%!1VX^iq`BDv8`mIz8NL0x%_u+#x5J?drEZQmC!AlklS~<1G-J+toG)+|CA_Y?a(u zeB{=O+!|sGcq9Cudek(r&n1~H>GnvWwpsXaFw}OvekDnPfLm~O4+3Uk`3kuO^bCaE zINzkhWGQ=-%&bT}oog58xL}s;k&6!F+)FlBv}SXc9`ADAT$~FMa7*zKz#vO0r?yI_ z0I-<kChXS79fxp))*@Smj0X8&?QMJYsUsV<N5<(?DMD@6TOR<3Nob*3_hD|2kIZ6+ z+;Smb-g!6LGIn!x!Ec1*!&;|Y=}+lDZLcBOmSB_ZkwR_1!M3FVw;+_?{BDw%AK<={ zf87$f)xMe;zmY~yS`|%<(u%@PNwDoTBv+N~k<*><)a-XW)ONl5x$QlB8fzeR?X8lD zOyQBZSx<5kb_?#xs}SuA*y`mc>}1jT8j>>GBj+AY%jM_C{7lGr!hFTRDa+j?&9_P- zx5#EFVAzc>%f;7@fGwIIg4r<JhIDL?oaoF)2(?}BM%%7nk;LGQz4>U|{-KWCl9F4i zup4-L#r0P|Pz|tQwm!^ukOt!%X*+UzWVFE;{63Cf(;3gnFR8tY*-@f_8FDL0Zdbps z8+bznxEipP$<?Ctr%YHWm@WP_Bvp^JRow?SrPQyyW!!k**&}M{qN{Twb;rjfa?3Rl zo+UT%Rs$H+7)}FhadH)QE$_%g8H(A;Tn^cMd*s>ugJ1t(9O-$jwn}yww~1Dyl9Jn% zbHn5nc)tX<7*Swjz?RP3g`Eg6Tc0CsweQ>yvd8eVY>a!|sKa*>4lXdn0keY_OUC>R z_t~BIc{fagxAMrLCRJB+U`uL9kIzk*ZL{0fZF^*mn@IkTZL4Wpz-=kH#Tnr%EJe(n z49JbYMX$q2tGZPKJ;!O%ARA`eR*i|6?V-<^o!NqXknD@}#|joaOZN51Ez8=>S#sO? zk<BCVy4CK>9<L~}<Hf_?3^N()yi7sTRd`#NT=$COmqx~9wzgMCuJiM=Y|z_w-sj1; z*1o-)gO87o&;I=5|6lysi;tge+MPN7W3mx`FgKlhkGz}sllD6G?D5Vv%aDZ~<H566 z)iuBI)WbGHStWZ#vFr)5^<lQWEBL2qXZru=Cc9{p-B^@*?X8mA`eKSzmJKfoctgom z^pcWmW7sXSTPA*z!mWQI6&So_n`f_TkPWjP@z4%3o9&Tr)z2T(AG1ml4O_b%a=S`@ z5@5CEO?|y2cx#?RqGBA*8U(lM^_XqNIg6bxQ`oB`+g=F24ynfT+>{TSRwB1VW@sn5 zUFSCFM-IDP8#e-_fH(X`)N^p{1h(Kowk*u{dR7nK8+p}QvX912r*LB_9gLkE62A!x zkXxMb--p~TVYeRehTn*~4f(6Y>Q#gw+s^gPv#vreX4`xXNkGp$%l63MVB6Jxt7HT# zS>|F%<hFmpUOMZ8H~dD_XYB0EXMEG`Fk4S%Tg@tA|GyeCZ@+hJ#>8~ky}$1kTb}7g zZiT~c*Tw*NA|k?XM8!tR&V0t-D3NGmBxVc3Y<bT#Mcy8HefHh9_**3%azk#bO>^oE zlUIqb+m-D)5d21zeO#2WZxN=F{WB?M!)z;h`*gaw_u!8|$J{K2J>-Vm;*;Cb1IIl# zOoBIlD$&6qkZ#$f2Cx+fvSBvNwt5L8*O9h=G!_9^9H<RTbY;kG;$=-XOis61;0?bK z>F`bLSdjf1`-5zltrD~C_t>`uhn_>ze*_o+;m4pc13-!200000NkvXXu0mjfP#%Nf literal 0 HcmV?d00001 diff --git a/modules/ebay/template/images/search.png b/modules/ebay/template/images/search.png new file mode 100755 index 0000000000000000000000000000000000000000..2d75e2b30083adfd59125a1f3e199809598e7aeb GIT binary patch literal 1057 zcmV++1m63JP)<h;3K|Lk000e1NJLTq007qj0018d1^@s6bjDb00000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#!%0LzRCwC#oiR)zK@^5(Xl=X(Td~&Y zb##ZZCtPW#3BA@*+*xR?y~)v09-)WhI<3w`YqYjG8f%<?oX3sp?67c^%>O0hvao1E z{PNzsc{^xTkjZ4SV-5{7zL<f>tBQ~`7@Kix#&0vaTI<^)Z_)*%s+q$#Giv;d39$^# zI5m<D7m~|JwQdeSC>0@5$qtQVkA>xO(duVj>UV#CuSTPhdVYSk=PN5KYGY$VZEkMz z<0dJlj9)`hOb5g|a1raBQ2l=2ju_QyRn_Ztibhfc5v-jnmn&NQ@*@_a)7910OsPVW z9UUFns76R4eD;eS+7k;x{V`)*o_lzBP-kan>gnmpO0u`N_eK^(v%9;y+`oit&(F_Q zrBdO?PEz2}2{z8kg;elB&LI>c4<gt8{=OX{AmGKtg*{R*LR8zxbvTvFRR-VK0kI$q zj)+(y-1YUf6%Mi>^^?@`<m4n*uyVPqE-x>cB9c_7pn|AFQLEGG*x^Sk%)5HM-aBbp zt(FxHf;F4XX$3J0iX3>IkW`{q$(=O(0tO^Plz|W;TUIQIWQbTYCzI<#;QhFckOZ(k zmE4-vv^t2YAOzdm+Oonx2*{NOu9ep%eT)f4NCK?FD@3lE|Lo1p&1=%=3J|espdi;E zO^kv08X<{b<=PI3;zy=g6uCyy$fDO0^1<0Ismy|L_A%1KS;#d-#L25D60&TmVJYt) zUs5=vhqDBeLI%@5LjLhaE`J>gDV(%Cp(2>K2#j?w=_4Er2K+<`ap=ipg6{W5HVTPs zSl_}CDIa8$f(MEhs1EuKx`=!bF_s?U_suGN5V8bxA=h{HdNZU23%&k&6e8B~@p0ky zrC2)@B#o8z30Wdekroa^#R*>)q<&~$lGZ1A9_v=pCgsbR*GpKWI6}yhFqHPEzsgk& zMW%TOHRp!<4RJ30h=eRLW3BZkDQI;4$TM$*35g`a$@~gOibYbHZ{df?b?U#eNP{f| zL&WoMs)S%`Yisr~=52(eGT)lY<u=%8`_XIO)KI|OOnL}quMKq8^R|DI2yNN0CVD3_ zq7Y>HA5gAeR8&Gf7?A4yoybnG9VeLb1;g6ZB0YgfFJrf%5VA}~3^R6vduVuq9jMIi zPjcHy(M@U)t&j?Gv6v)8eD^0$u$l_&TPU~rV=jeACLQ#cqoHttc@-*xl!_!4v5M_m z=n1y2xZ^G%F@`F#<8CSMU3P;Ft#^?}s!SILA(YC_uXgjqibk$LB;&W7kd#xuxxeM) bMSuYStk>Hzn3Cpd00000NkvXXu0mjf9bWNH literal 0 HcmV?d00001 diff --git a/modules/ebay/template/images/stats.png b/modules/ebay/template/images/stats.png new file mode 100755 index 0000000000000000000000000000000000000000..de2140117cbc32ba6031dde7b37d380dfa2986fc GIT binary patch literal 941 zcmV;e15*5nP)<h;3K|Lk000e1NJLTq000&M000&U1^@s6#I$TX0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#Pf0{URCwB?l+9`sK@i8QduDd?Nj5=3 zF!2&EdWf!i@+N{OJ>-~^k~h#N$<3?!02=TCB!VYJL4!n5LLiBRO|se9*`3+`9IK{# zChN(-4%_r>_w=v+{qL$~Fv7F4_IiT_yh-o5%^^1ij52#Wn``UgDB!!dmY&{To&o0n z=Q+Ta-45(*!f4=?tFy3hr2(g@0mg|8a3ctcxskx#fq`GG3|c(}oH61;!|2h$Nv5F| zDM+#B%vr(h1;EY6ZyP~9dJ)v31`jweQiX?Pjd}I)`Gc3;0fIw~V6Pa-HaGtV*QUms z5AQ6jUY;8Rq*mkawol+AfCF<>oT?%yJqj)WCfNO(^YG~~gCM|#_?w@KVCm9$F+C6( zG;>yzaqG-FaC7}llLx^DMJy+aE!q5;RR)d{1)nj6!jKnpi;X(;2F^!GVALk0c8ba5 z5<E6uTU}Y6yH{?dNJ^aF-fgdnOm7i5?g~`wz;*00^pqZf0T`mCG|nmnv(gHS0iHa% z4j+DWDhIADPQusUZ7`Y?%j$3_XdH2nUa=s>qF)3mPk>EC4s5Ut<5a`XgI)!moeV)E z)G7^UJvtl-oIAxe1lxgAEYSjOa?rE`zf%z~uh>{P!L9ajarvB~N{d^u2&eHuk~$Bu z)wl(2+;$aOU@-lR*40|2La!JX|7jEWeDXLJ1=OJ8ULURK_6sP%L!Lw3t5SHlg#e|i z!_mqY2rb@k_2KB?v~&rk>wr+@6eF0vVcugU&`)nm@eNvmH(Dj?94r+axBH+{0p$sF z;tXh<(v1$rD(MS^6=3igVkGX&qUS?a7|BYogfjwXqDr?U?t@0K(de%ruyR&VGT}J$ zIj!XYOFVQ|uoCRkjQ~lUB6v_xX+BLNr&uN+F<=4nR%jXGh3<;LhzwIVK*egPT*ERe zGzg3sO>!v1;<2H33UjoB0aKWmnf6l*f+z%;w47p*LQtEoJa@rT2hNSy>z%Z=hOY>P zNpFqZGa~N9``_R5uy$USq&iK$6?vQ-Zt-y9p9>0kRRNbhl?+~EKsU^U@9BS?>H=Hf zzca-phFrRbuw}lbzNc|p-fp>HP*#cc@0kxsjSqdRhv3wN@3o(YzXA*ZKDP*|IZitl P00000NkvXXu0mjftU|8W literal 0 HcmV?d00001 diff --git a/modules/ebay/valid.png b/modules/ebay/valid.png new file mode 100644 index 0000000000000000000000000000000000000000..4f0790e5ccda55ed137697114dff4420e30691bd GIT binary patch literal 778 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gy!3-q#EwW`|U|`G(@Ck8kTI2KO%a@5;17__E zp0LTia)tN8y<uG&{94!gyn1)<)!V!Ii#>OrE1I!0=*_#=Ws5D^*H~uHwas1N{`SM` zoo6eiZ?k*-?!~J&FD~8P^z!ZVH}7BGdUUyOlh^7azMGG(U2`OM@+RAtZ=N@-_P+b% zV9j#Z&!0b?y1qSYPSEC)OI96<C|F>!;$ZZKV+nm5Z6<HctzBlm_DIj&CpXs~X`Qys zcjckJgO?hYA1ZHN>wE9%iOr{?r*0`cdS%^>hdb^+y;QMSYsG=ELswR`tnn^ithxF~ z#QP6#7Vay1@%rhL7muozm^Q9X>)hZ~vn>4P!|N*!gx0Net61*6_2jHgCsNiN^=Mq} zHhX8myj?C+wj@7${dmQJ)=PI+J$rSnXOsWpeIY<EY(JH|`f%`t+go10d$RfX%0ri? z9J)BKbA4v%V!yRVXKXlDbpPqu$=d>-zP!KtY|*^k0fmcf7VR&2_Ud}adf)WfcH2($ zUVm_I{+@`kC2^mD-Ufp=Q+56VBcQ4z$S?T+Kmmpq_Ak_cuDIyw;us=vIeEnqE{P2t zqBFFT1^ak5Z8<35Co=KrLmhYVb6<MTKh$zJw^qDjskchz?kSPLvku)wCDTQ;Z@l)H z;w+o7mQB?3Qtw3nw3Z##w-21tWH{3!aN_E@g2t-lDm|@74}0y|bjjuZjI~#`F=@r< z<s6efJwI*5LebM_-URS{uW1djn;afDF~J~s+G?$!86h358?0CT5Opi|Sj-aIx<rnd zxp`+$m1P!3*p8*YHgBrZUc{c`x<h??KoF~2Mfi^CD?cZ8wsFbt<jUC?e6B;riebO! W1|IqT_B%k&F?hQAxvX<aXaWH8INEst literal 0 HcmV?d00001 diff --git a/modules/ebay/warn.png b/modules/ebay/warn.png new file mode 100644 index 0000000000000000000000000000000000000000..b06d10dc7d6b59214db470557b4b987b5078b5bb GIT binary patch literal 1061 zcmeHE+e?#i0R4V>sflZ4R%;EXMk0jSi}YZ4-^>ybT`?3P^d$p*P@{{PU`6;~Bv?VE zL4mrd)9G}&xlgy+a9Tpnrr}m?F)_<fm-lvlef=BJ;ar~2IrX_Ynfwq@2*WV^tg{(; zTpr>SwkLq|%R8SW3=_cQX3M2$C1?vmJ3;#{s5sw^P69Q7Y9Bhn(RmnZF}fqrL(og0 z351qlfS`|uK>|I&Fab+o2*t1fY$yi8p%Y<nKZXv%C<J>1tOz4V!HWILXumoRJ;%@+ z4NVNRvCzgr9|^;87^A>)jDaozLy0h?z$k-R42u|}kuc@LqJXs!6Zx=R#KZ-R7r<5w zTL~u1@V*N6>zJv<Y#nCrQRiLix{tYfxEkPmfX_{EH^K9mdY@8nGhKK^7hCC%4!Yb& zR|lw1Pk-s@nvt%vbi+i~taN>xZkp)kYr6G@Zd>X07~P(tJJZ}~|M5>QkXJun#ufXL zm60kJ+RMgf(#)qAnOo7QFE}tKwlq}7dm;uce2*izhCW$-c`oR8_ax;Ny1de<XxoZr zL6TJQ{EqDQ;zL!Jb9ARX=4<(MrLxq$bXD&Bu%gl_ly9pi`fqsyD;<-;N}s5uQJ;MC zo4vy07f4#uU4F&Sv^F0vS$ksnyi_9pUi0X55r1{Qpl;n!J2V@{T)9?AQhiH;?oH8x z>*FHPj)Yg5c*MabWisYzO}|-|AC@9$Y2M33CcfzE*{TvIyJH!xVIwNUo^BPEWS@NY d&XREE#wtI)s<@%lTh#gY#4Kq}hC1z1-5)pmQi%Wn literal 0 HcmV?d00001 diff --git a/modules/editorial/EditorialClass.php b/modules/editorial/EditorialClass.php new file mode 100755 index 000000000..5bb8159aa --- /dev/null +++ b/modules/editorial/EditorialClass.php @@ -0,0 +1,115 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class EditorialClass extends ObjectModel +{ + /** @var integer editorial id*/ + public $id = 1; + + /** @var string body_title*/ + public $body_home_logo_link; + + /** @var string body_title*/ + public $body_title; + + /** @var string body_title*/ + public $body_subheading; + + /** @var string body_title*/ + public $body_paragraph; + + /** @var string body_title*/ + public $body_logo_subheading; + + protected $table = 'editorial'; + protected $identifier = 'id_editorial'; + + protected $fieldsValidate = array('body_home_logo_link' => 'isUrl'); + protected $fieldsValidateLang = array( + 'body_title' => 'isGenericName', + 'body_subheading' => 'isGenericName', + 'body_paragraph' => 'isCleanHtml', + 'body_logo_subheading' => 'isGenericName'); + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + + $fieldsArray = array('body_title', 'body_subheading', 'body_paragraph', 'body_logo_subheading'); + $fields = array(); + $languages = Language::getLanguages(false); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + foreach ($languages as $language) + { + $fields[$language['id_lang']]['id_lang'] = (int)($language['id_lang']); + $fields[$language['id_lang']][$this->identifier] = (int)($this->id); + foreach ($fieldsArray as $field) + { + if (!Validate::isTableOrIdentifier($field)) + die(Tools::displayError()); + if (isset($this->{$field}[$language['id_lang']]) AND !empty($this->{$field}[$language['id_lang']])) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$language['id_lang']], true); + elseif (in_array($field, $this->fieldsRequiredLang)) + $fields[$language['id_lang']][$field] = pSQL($this->{$field}[$defaultLanguage], true); + else + $fields[$language['id_lang']][$field] = ''; + } + } + return $fields; + } + + public function copyFromPost() + { + /* Classical fields */ + foreach ($_POST AS $key => $value) + if (key_exists($key, $this) AND $key != 'id_'.$this->table) + $this->{$key} = $value; + + /* Multilingual fields */ + if (sizeof($this->fieldsValidateLang)) + { + $languages = Language::getLanguages(false); + foreach ($languages AS $language) + foreach ($this->fieldsValidateLang AS $field => $validation) + if (isset($_POST[$field.'_'.(int)($language['id_lang'])])) + $this->{$field}[(int)($language['id_lang'])] = $_POST[$field.'_'.(int)($language['id_lang'])]; + } + } + + public function getFields() + { + parent::validateFields(); + $fields['id_editorial'] = (int)($this->id); + $fields['body_home_logo_link'] = pSQL($this->body_home_logo_link); + return $fields; + } +} diff --git a/modules/editorial/config.xml b/modules/editorial/config.xml new file mode 100755 index 000000000..8ad419850 --- /dev/null +++ b/modules/editorial/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>editorial</name> + <displayName><![CDATA[Home text editor]]></displayName> + <version><![CDATA[1.6]]></version> + <description><![CDATA[A text editor module for your homepage.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/editorial/de.php b/modules/editorial/de.php new file mode 100644 index 000000000..b378f8ae5 --- /dev/null +++ b/modules/editorial/de.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{editorial}prestashop>editorial_a46dcd3561c3feeb53903dfc0f796a35'] = 'Startseiten-Text-Editor'; +$_MODULE['<{editorial}prestashop>editorial_d02076897ed05399e22a0597404924ad'] = 'Ein Texteditor-Modul für Ihre Startseite'; +$_MODULE['<{editorial}prestashop>editorial_7fc8b5e7597368c070f5bc87c719dcc1'] = 'Sie können diese Handlung nicht ausführen'; +$_MODULE['<{editorial}prestashop>editorial_07b8c09e490f7afbdcfa9cd5bfcfd4a9'] = 'Ein Fehler trat beim Hochladen des Bilds auf.'; +$_MODULE['<{editorial}prestashop>editorial_462390017ab0938911d2d4e964c0cab7'] = 'Einstellungen erfolgreich aktualisiert'; +$_MODULE['<{editorial}prestashop>editorial_0245625ee10f9c6c0ed7f50eb1838856'] = 'Haupttitel'; +$_MODULE['<{editorial}prestashop>editorial_7496c27605d7ac3462a5dab8ecf1b569'] = 'Erscheint oben auf der Startseite'; +$_MODULE['<{editorial}prestashop>editorial_e1f46be647e598f00eeb0ab62561d695'] = 'Untertitel'; +$_MODULE['<{editorial}prestashop>editorial_bf75f228011d1443c4ea7aca23c3cff2'] = 'Einleitungstext'; +$_MODULE['<{editorial}prestashop>editorial_930919b6f854a62e62401e3e76377cc1'] = 'Text Ihrer Wahl, zum Beispiel erläutern Sie Ihre Mission, heben ein neues Produkt hervor oder beschreiben ein aktuelles Ereignis'; +$_MODULE['<{editorial}prestashop>editorial_78587f196180054fcb797d40f4a86f10'] = 'Logo der Startseite'; +$_MODULE['<{editorial}prestashop>editorial_b18c29b8470190a02813415a04a2191f'] = 'Dateigröße'; +$_MODULE['<{editorial}prestashop>editorial_729a51874fe901b092899e9e8b31c97a'] = 'Sind Sie sicher?'; +$_MODULE['<{editorial}prestashop>editorial_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{editorial}prestashop>editorial_f85e125f2a9ebcd47f420c94b535f50a'] = 'Erscheint neben dem einleitenden Text oben'; +$_MODULE['<{editorial}prestashop>editorial_28d74ee805e3a162047d8f917b74dcb3'] = 'Startseitenlogo-Link'; +$_MODULE['<{editorial}prestashop>editorial_62f6077d6d15a35ff4929a225205892f'] = 'Auf dem 2. Logo verwendeter Link '; +$_MODULE['<{editorial}prestashop>editorial_98039e8f2a0d93fc0fff503f9166f59b'] = 'Startseitenlogo Untertitel'; +$_MODULE['<{editorial}prestashop>editorial_c260ede55f0be17068302e7f842802f3'] = 'Aktualisieren Sie den Editor'; + +?> \ No newline at end of file diff --git a/modules/editorial/editorial.php b/modules/editorial/editorial.php new file mode 100644 index 000000000..8cf3dd346 --- /dev/null +++ b/modules/editorial/editorial.php @@ -0,0 +1,318 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Editorial extends Module +{ + /** @var max image size */ + protected $maxImageSize = 307200; + + public function __construct() + { + $this->name = 'editorial'; + $this->tab = 'front_office_features'; + $this->version = '1.6'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Home text editor'); + $this->description = $this->l('A text editor module for your homepage.'); + $path = dirname(__FILE__); + if (strpos(__FILE__, 'Module.php') !== false) + $path .= '/../modules/'.$this->name; + include_once($path.'/EditorialClass.php'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('home') OR !$this->registerHook('header')) + return false; + + if (!Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'editorial` ( + `id_editorial` int(10) unsigned NOT NULL auto_increment, + `body_home_logo_link` varchar(255) NOT NULL, + PRIMARY KEY (`id_editorial`)) + ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) + return false; + + if (!Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'editorial_lang` ( + `id_editorial` int(10) unsigned NOT NULL, + `id_lang` int(10) unsigned NOT NULL, + `body_title` varchar(255) NOT NULL, + `body_subheading` varchar(255) NOT NULL, + `body_paragraph` text NOT NULL, + `body_logo_subheading` varchar(255) NOT NULL, + PRIMARY KEY (`id_editorial`, `id_lang`)) + ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) + return false; + + if (!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'editorial`(`id_editorial`, `body_home_logo_link`) + VALUES(1, "http://www.prestashop.com")')) + return false; + + if (!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'editorial_lang`(`id_editorial`, `id_lang`, `body_title`, `body_subheading`, `body_paragraph`, `body_logo_subheading`) + VALUES(1, 1, "Lorem ipsum dolor sit amet", "Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", "&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum&lt;/p&gt;", "Excepteur sint prestashop cupidatat non proident")')) + return false; + + if (!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'editorial_lang`(`id_editorial`, `id_lang`, `body_title`, `body_subheading`, `body_paragraph`, `body_logo_subheading`) + VALUES(1, 2, "Lorem ipsum dolor sit amet", "Excepteur sint occaecat cupidatat non proident", "&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum&lt;/p&gt;", "Lorem ipsum presta shop amet")')) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall()) + return false; + return (Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'editorial`') AND + Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'editorial_lang`')); + } + + public function putContent($xml_data, $key, $field, $forbidden, $section) + { + foreach ($forbidden AS $line) + if ($key == $line) + return 0; + if (!preg_match('/^'.$section.'_/i', $key)) + return 0; + $key = preg_replace('/^'.$section.'_/i', '', $key); + $field = htmlspecialchars($field); + if (!$field) + return 0; + return ("\n".' <'.$key.'>'.$field.'</'.$key.'>'); + } + + public function getContent() + { + global $cookie; + + /* display the module name */ + $this->_html = '<h2>'.$this->displayName.'</h2>'; + $errors = ''; + + // Delete logo image + if (Tools::isSubmit('deleteImage')) + { + if (!file_exists(dirname(__FILE__).'/homepage_logo.jpg')) + $errors .= $this->displayError($this->l('This action cannot be taken.')); + else + { + unlink(dirname(__FILE__).'/homepage_logo.jpg'); + Configuration::updateValue('EDITORIAL_IMAGE_DISABLE', 1); + Tools::redirectAdmin('index.php?tab=AdminModules&configure='.$this->name.'&token='.Tools::getAdminToken('AdminModules'.(int)(Tab::getIdFromClassName('AdminModules')).(int)($cookie->id_employee))); + } + $this->_html .= $errors; + } + + /* update the editorial xml */ + if (Tools::isSubmit('submitUpdate')) + { + // Forbidden key + $forbidden = array('submitUpdate'); + + $editorial = new EditorialClass(1); + $editorial->copyFromPost(); + $editorial->update(); + + /* upload the image */ + if (isset($_FILES['body_homepage_logo']) AND isset($_FILES['body_homepage_logo']['tmp_name']) AND !empty($_FILES['body_homepage_logo']['tmp_name'])) + { + Configuration::set('PS_IMAGE_GENERATION_METHOD', 1); + if(file_exists(dirname(__FILE__).'/homepage_logo.jpg')) + unlink(dirname(__FILE__).'/homepage_logo.jpg'); + if ($error = checkImage($_FILES['body_homepage_logo'], $this->maxImageSize)) + $errors .= $error; + elseif (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($_FILES['body_homepage_logo']['tmp_name'], $tmpName)) + return false; + elseif (!imageResize($tmpName, dirname(__FILE__).'/homepage_logo.jpg')) + $errors .= $this->displayError($this->l('An error occurred during the image upload.')); + if (isset($tmpName)) + unlink($tmpName); + } + $this->_html .= $errors == '' ? $this->displayConfirmation($this->l('Settings updated successfully')) : $errors; + if (file_exists(dirname(__FILE__).'/homepage_logo.jpg')) + { + list($width, $height, $type, $attr) = getimagesize(dirname(__FILE__).'/homepage_logo.jpg'); + Configuration::updateValue('EDITORIAL_IMAGE_WIDTH', (int)round($width)); + Configuration::updateValue('EDITORIAL_IMAGE_HEIGHT', (int)round($height)); + Configuration::updateValue('EDITORIAL_IMAGE_DISABLE', 0); + } + } + + /* display the editorial's form */ + $this->_displayForm(); + + return $this->_html; + } + + private function _displayForm() + { + global $cookie; + /* Languages preliminaries */ + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(false); + $iso = Language::getIsoById((int)($cookie->id_lang)); + $divLangName = 'title¤subheading¤cpara¤logo_subheading'; + + $editorial = new EditorialClass(1); + // TinyMCE + global $cookie; + $iso = Language::getIsoById((int)($cookie->id_lang)); + $isoTinyMCE = (file_exists(_PS_ROOT_DIR_.'/js/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en'); + $ad = dirname($_SERVER["PHP_SELF"]); + $this->_html .= ' + <script type="text/javascript"> + var iso = \''.$isoTinyMCE.'\' ; + var pathCSS = \''._THEME_CSS_DIR_.'\' ; + var ad = \''.$ad.'\' ; + </script> + <script type="text/javascript" src="'.__PS_BASE_URI__.'js/tiny_mce/tiny_mce.js"></script> + <script type="text/javascript" src="'.__PS_BASE_URI__.'js/tinymce.inc.js"></script>'; + $this->_html .= ' + <script type="text/javascript">id_language = Number('.$defaultLanguage.');</script> + <form method="post" action="'.$_SERVER['REQUEST_URI'].'" enctype="multipart/form-data"> + <fieldset style="width: 905px;"> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" /> '.$this->displayName.'</legend> + <label>'.$this->l('Main title').'</label> + <div class="margin-form">'; + + foreach ($languages as $language) + { + $this->_html .= ' + <div id="title_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').';float: left;"> + <input type="text" name="body_title_'.$language['id_lang'].'" id="body_title_'.$language['id_lang'].'" size="64" value="'.(isset($editorial->body_title[$language['id_lang']]) ? $editorial->body_title[$language['id_lang']] : '').'" /> + </div>'; + } + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'title', true); + + + $this->_html .= ' + <p class="clear">'.$this->l('Appears along top of homepage').'</p> + </div> + <label>'.$this->l('Subheading').'</label> + <div class="margin-form">'; + + foreach ($languages as $language) + { + $this->_html .= ' + <div id="subheading_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').';float: left;"> + <input type="text" name="body_subheading_'.$language['id_lang'].'" id="body_subheading_'.$language['id_lang'].'" size="64" value="'.(isset($editorial->body_subheading[$language['id_lang']]) ? $editorial->body_subheading[$language['id_lang']] : '').'" /> + </div>'; + } + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'subheading', true); + + $this->_html .= ' + <div class="clear"></div> + </div> + <label>'.$this->l('Introductory text').'</label> + <div class="margin-form">'; + + foreach ($languages as $language) + { + $this->_html .= ' + <div id="cpara_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').';float: left;"> + <textarea class="rte" cols="70" rows="30" id="body_paragraph_'.$language['id_lang'].'" name="body_paragraph_'.$language['id_lang'].'">'.(isset($editorial->body_paragraph[$language['id_lang']]) ? $editorial->body_paragraph[$language['id_lang']] : '').'</textarea> + </div>'; + } + + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'cpara', true); + + $this->_html .= ' + <p class="clear">'.$this->l('Text of your choice; for example, explain your mission, highlight a new product, or describe a recent event.').'</p> + </div> + <label>'.$this->l('Homepage logo').' </label> + <div class="margin-form">'; + if (file_exists(dirname(__FILE__).'/homepage_logo.jpg') && !Configuration::get('EDITORIAL_IMAGE_DISABLE')) + $this->_html .= '<div id="image" > + <img src="'.$this->_path.'homepage_logo.jpg?t='.time().'" /> + <p align="center">'.$this->l('Filesize').' '.(filesize(dirname(__FILE__).'/homepage_logo.jpg') / 1000).'kb</p> + <a href="'.$_SERVER['REQUEST_URI'].'&deleteImage" onclick="return confirm(\''.$this->l('Are you sure?', __CLASS__, true, false).'\');"> + <img src="../img/admin/delete.gif" alt="'.$this->l('Delete').'" /> '.$this->l('Delete').'</a> + </div>'; + + $this->_html .= '<input type="file" name="body_homepage_logo" /> + <p style="clear: both">'.$this->l('Will appear next to the Introductory Text above').'</p> + + </div> + <label>'.$this->l('Homepage logo link').'</label> + <div class="margin-form"> + <input type="text" name="body_home_logo_link" size="64" value="'.$editorial->body_home_logo_link.'" /> + <p style="clear: both">'.$this->l('Link used on the 2nd logo').'</p> + </div> + <label>'.$this->l('Homepage logo subheading').'</label> + <div class="margin-form">'; + + foreach ($languages as $language) + { + $this->_html .= ' + <div id="logo_subheading_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').';float: left;"> + <input type="text" name="body_logo_subheading_'.$language['id_lang'].'" id="logo_subheading_'.$language['id_lang'].'" size="64" value="'.(isset($editorial->body_logo_subheading[$language['id_lang']]) ? $editorial->body_logo_subheading[$language['id_lang']] : '').'" /> + </div>'; + } + + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'logo_subheading', true); + + $this->_html .= ' + <div class="clear"></div> + </div> + <div class="clear pspace"></div> + <div class="margin-form clear"><input type="submit" name="submitUpdate" value="'.$this->l('Update the editor').'" class="button" /></div> + </fieldset> + </form>'; + } + + public function hookHome($params) + { + global $cookie, $smarty; + + $editorial = new EditorialClass(1, (int)$cookie->id_lang); + $smarty->assign(array( + 'editorial' => $editorial, + 'default_lang' => (int)$cookie->id_lang, + 'image_width' => Configuration::get('EDITORIAL_IMAGE_WIDTH'), + 'image_height' => Configuration::get('EDITORIAL_IMAGE_HEIGHT'), + 'id_lang' => $cookie->id_lang, + 'homepage_logo' => !Configuration::get('EDITORIAL_IMAGE_DISABLE') && file_exists('modules/editorial/homepage_logo.jpg'), + 'image_path' => $this->_path.'homepage_logo.jpg' + )); + return $this->display(__FILE__, 'editorial.tpl'); + } + + public function hookHeader() + { + Tools::addCSS(($this->_path).'editorial.css', 'all'); + } +} diff --git a/modules/editorial/editorial.tpl b/modules/editorial/editorial.tpl new file mode 100644 index 000000000..c26b68ef1 --- /dev/null +++ b/modules/editorial/editorial.tpl @@ -0,0 +1,41 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- Module Editorial --> +<div id="editorial_block_center" class="editorial_block"> + {if $editorial->body_home_logo_link}<a href="{$editorial->body_home_logo_link|escape:'htmlall':'UTF-8'}" title="{$editorial->body_title|escape:'htmlall':'UTF-8'|stripslashes}">{/if} + {if $homepage_logo}<img src="{$link->getMediaLink($image_path)}" alt="{$editorial->body_title|escape:'htmlall':'UTF-8'|stripslashes}" {if $image_width}width="{$image_width}"{/if} {if $image_height}height="{$image_height}" {/if}/>{/if} + {if $editorial->body_home_logo_link}</a>{/if} + {if $editorial->body_logo_subheading}<p id="editorial_image_legend">{$editorial->body_logo_subheading|stripslashes}</p> + {elseif $editorial->body_logo_subheading}<p id="editorial_image_legend">{$editorial->body_logo_subheading}</p>{/if} + {if $editorial->body_title}<h1>{$editorial->body_title|stripslashes}</h1> + {elseif $editorial->body_title}<h1>{$editorial->body_title|stripslashes}</h1>{/if} + {if $editorial->body_subheading}<h2>{$editorial->body_subheading|stripslashes}</h2> + {elseif $editorial->body_subheading}<h2>{$editorial->body_subheading|stripslashes}</h2>{/if} + {if $editorial->body_paragraph}<div class="rte">{$editorial->body_paragraph|stripslashes}</div> + {elseif $editorial->body_paragraph}<div class="rte">{$editorial->body_paragraph|stripslashes}</div>{/if} +</div> +<!-- /Module Editorial --> \ No newline at end of file diff --git a/modules/editorial/en.php b/modules/editorial/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/editorial/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/editorial/es.php b/modules/editorial/es.php new file mode 100644 index 000000000..226748ffb --- /dev/null +++ b/modules/editorial/es.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{editorial}prestashop>editorial_a46dcd3561c3feeb53903dfc0f796a35'] = 'Editor de textos página de inicio'; +$_MODULE['<{editorial}prestashop>editorial_d02076897ed05399e22a0597404924ad'] = 'Un módulo de editor de texto para su página de inicio'; +$_MODULE['<{editorial}prestashop>editorial_7fc8b5e7597368c070f5bc87c719dcc1'] = 'No puede efectuar esta acción'; +$_MODULE['<{editorial}prestashop>editorial_07b8c09e490f7afbdcfa9cd5bfcfd4a9'] = 'Se ha producido un error mientras se subía la imagen.'; +$_MODULE['<{editorial}prestashop>editorial_462390017ab0938911d2d4e964c0cab7'] = 'Parámetros actualizados con éxito'; +$_MODULE['<{editorial}prestashop>editorial_0245625ee10f9c6c0ed7f50eb1838856'] = 'Título principal'; +$_MODULE['<{editorial}prestashop>editorial_7496c27605d7ac3462a5dab8ecf1b569'] = 'Aparece a lo largo de la parte superior de la página de inicio'; +$_MODULE['<{editorial}prestashop>editorial_e1f46be647e598f00eeb0ab62561d695'] = 'Subtítulo'; +$_MODULE['<{editorial}prestashop>editorial_bf75f228011d1443c4ea7aca23c3cff2'] = 'Texto de introducción'; +$_MODULE['<{editorial}prestashop>editorial_930919b6f854a62e62401e3e76377cc1'] = 'Su texto; por ejm: explique su objetivo, destaque un nuevo producto, describa un evento..'; +$_MODULE['<{editorial}prestashop>editorial_78587f196180054fcb797d40f4a86f10'] = 'Imagen de página de inicio'; +$_MODULE['<{editorial}prestashop>editorial_b18c29b8470190a02813415a04a2191f'] = 'Tamaño de la imagen'; +$_MODULE['<{editorial}prestashop>editorial_729a51874fe901b092899e9e8b31c97a'] = '¿Está seguro?'; +$_MODULE['<{editorial}prestashop>editorial_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{editorial}prestashop>editorial_f85e125f2a9ebcd47f420c94b535f50a'] = 'Aparecerá arriba, junto al texto de introducción'; +$_MODULE['<{editorial}prestashop>editorial_28d74ee805e3a162047d8f917b74dcb3'] = 'Enlace del logo de página de inicio'; +$_MODULE['<{editorial}prestashop>editorial_62f6077d6d15a35ff4929a225205892f'] = 'Enlace usado en el segundo logo'; +$_MODULE['<{editorial}prestashop>editorial_98039e8f2a0d93fc0fff503f9166f59b'] = 'Subtítulo del logo de página de inicio'; +$_MODULE['<{editorial}prestashop>editorial_c260ede55f0be17068302e7f842802f3'] = 'Actualizar el editor'; diff --git a/modules/editorial/fr.php b/modules/editorial/fr.php new file mode 100644 index 000000000..6c0638c94 --- /dev/null +++ b/modules/editorial/fr.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{editorial}prestashop>editorial_a46dcd3561c3feeb53903dfc0f796a35'] = 'Editeur de page d\'accueil'; +$_MODULE['<{editorial}prestashop>editorial_d02076897ed05399e22a0597404924ad'] = 'Un éditeur de texte pour votre page d\'accueil'; +$_MODULE['<{editorial}prestashop>editorial_7fc8b5e7597368c070f5bc87c719dcc1'] = 'Vous ne pouvez pas effectuer cette action'; +$_MODULE['<{editorial}prestashop>editorial_07b8c09e490f7afbdcfa9cd5bfcfd4a9'] = 'Une erreur est survenue lors de l\'upload de l\'image'; +$_MODULE['<{editorial}prestashop>editorial_462390017ab0938911d2d4e964c0cab7'] = 'Paramètres mis à jour avec succès'; +$_MODULE['<{editorial}prestashop>editorial_0245625ee10f9c6c0ed7f50eb1838856'] = 'Titre principal'; +$_MODULE['<{editorial}prestashop>editorial_7496c27605d7ac3462a5dab8ecf1b569'] = 'Apparaît en haut de la page d\'accueil'; +$_MODULE['<{editorial}prestashop>editorial_e1f46be647e598f00eeb0ab62561d695'] = 'Pré-en-tête'; +$_MODULE['<{editorial}prestashop>editorial_bf75f228011d1443c4ea7aca23c3cff2'] = 'Texte d\'introduction'; +$_MODULE['<{editorial}prestashop>editorial_930919b6f854a62e62401e3e76377cc1'] = 'Texte d\'introduction de votre choix ; par exemple expliquez ce que vous vendez ou mettez en avant un produit'; +$_MODULE['<{editorial}prestashop>editorial_78587f196180054fcb797d40f4a86f10'] = 'Logo de la page d\'accueil'; +$_MODULE['<{editorial}prestashop>editorial_b18c29b8470190a02813415a04a2191f'] = 'Taille de l\'image'; +$_MODULE['<{editorial}prestashop>editorial_729a51874fe901b092899e9e8b31c97a'] = 'Êtes-vous sûr ?'; +$_MODULE['<{editorial}prestashop>editorial_f2a6c498fb90ee345d997f888fce3b18'] = 'Effacer'; +$_MODULE['<{editorial}prestashop>editorial_f85e125f2a9ebcd47f420c94b535f50a'] = 'Apparaîtra à côté du texte d\'introduction'; +$_MODULE['<{editorial}prestashop>editorial_28d74ee805e3a162047d8f917b74dcb3'] = 'Lien de l\'image'; +$_MODULE['<{editorial}prestashop>editorial_62f6077d6d15a35ff4929a225205892f'] = 'Lien utilisé sur le second logo'; +$_MODULE['<{editorial}prestashop>editorial_98039e8f2a0d93fc0fff503f9166f59b'] = 'Sous-titre de l\'image'; +$_MODULE['<{editorial}prestashop>editorial_c260ede55f0be17068302e7f842802f3'] = 'Mettre à jour'; diff --git a/modules/editorial/homepage_logo.jpg b/modules/editorial/homepage_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38a7b65e1b29e15454733c0dc7f771a7b0599f15 GIT binary patch literal 21250 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 GP5d`l(7V_G literal 0 HcmV?d00001 diff --git a/modules/editorial/it.php b/modules/editorial/it.php new file mode 100644 index 000000000..9f7eb6914 --- /dev/null +++ b/modules/editorial/it.php @@ -0,0 +1,25 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{editorial}prestashop>editorial_a46dcd3561c3feeb53903dfc0f796a35'] = 'Editor della home page'; +$_MODULE['<{editorial}prestashop>editorial_d02076897ed05399e22a0597404924ad'] = 'Un modulo editor di testo per la tua home page'; +$_MODULE['<{editorial}prestashop>editorial_7fc8b5e7597368c070f5bc87c719dcc1'] = 'Non è possibile effettuare questa azione'; +$_MODULE['<{editorial}prestashop>editorial_07b8c09e490f7afbdcfa9cd5bfcfd4a9'] = 'Errore durante il caricamento delle immagini.'; +$_MODULE['<{editorial}prestashop>editorial_462390017ab0938911d2d4e964c0cab7'] = 'Impostazioni aggiornate con successo'; +$_MODULE['<{editorial}prestashop>editorial_0245625ee10f9c6c0ed7f50eb1838856'] = 'Titolo principale'; +$_MODULE['<{editorial}prestashop>editorial_7496c27605d7ac3462a5dab8ecf1b569'] = 'Appare nella parte superiore della home page'; +$_MODULE['<{editorial}prestashop>editorial_e1f46be647e598f00eeb0ab62561d695'] = 'Sottotitolo'; +$_MODULE['<{editorial}prestashop>editorial_bf75f228011d1443c4ea7aca23c3cff2'] = 'Testo introduttivo'; +$_MODULE['<{editorial}prestashop>editorial_930919b6f854a62e62401e3e76377cc1'] = 'Testo a tua scelta; ad esempio, spiega la tua missione, evidenzia un nuovo prodotto, o descrivi un evento recente'; +$_MODULE['<{editorial}prestashop>editorial_78587f196180054fcb797d40f4a86f10'] = 'Logo della home page '; +$_MODULE['<{editorial}prestashop>editorial_b18c29b8470190a02813415a04a2191f'] = 'Dimensioni file'; +$_MODULE['<{editorial}prestashop>editorial_729a51874fe901b092899e9e8b31c97a'] = 'Sei sicuro?'; +$_MODULE['<{editorial}prestashop>editorial_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{editorial}prestashop>editorial_f85e125f2a9ebcd47f420c94b535f50a'] = 'Apparirà accanto al testo introduttivo sopra'; +$_MODULE['<{editorial}prestashop>editorial_28d74ee805e3a162047d8f917b74dcb3'] = 'Link logo home page'; +$_MODULE['<{editorial}prestashop>editorial_62f6077d6d15a35ff4929a225205892f'] = 'Link utilizzato sul secondo logo'; +$_MODULE['<{editorial}prestashop>editorial_98039e8f2a0d93fc0fff503f9166f59b'] = 'Sottotitolo logo home page '; +$_MODULE['<{editorial}prestashop>editorial_c260ede55f0be17068302e7f842802f3'] = 'Aggiorna l\'editor'; + +?> \ No newline at end of file diff --git a/modules/editorial/logo.gif b/modules/editorial/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa26b20b551a8783660280b808b4ed3a532ea1c3 GIT binary patch literal 627 zcmZ?wbhEHb6krfwc*ekB5<Bt2vu{gJzsy+sAZ+r9pMU;MS#{L2dHc)v-}c@4Q9W(@ zqMg_Lix;%6eRB5B8^5l74_|(odg4vY#A~}x-z%7N>HVi~NACTs-*CerW9HU#_aa(0 z$2G1A>%H8x??w8=-J6cyU$*nYxo7`xzxtcH_-f1I;{{uue*g9N|Ns9xZ+<-W@Ylq> z4<q|dAGrC!DSOJo<KI7g`O&@h>Z<c^Zan{*IqSMt@tmCg?b)5{)90PJ`ton-%zdG) z+qRy2U$gsp&c<hV-~POM_r=kB|DS&N8$I)EOzrafZ~q>;@_hdB=N1W5+P2@XT5_{{ z|Er8Sk3M|+f8+JvXW#!%S$FQ-z5h2~{|M^YS~Krp_SR>&U;J8f>h<cqmxFo^Bu%~X z`s3e-zAH<&UfXi@=bH21{fZY|zW;9K(bo(#1ByRc7}y#9Gw6V90L2Ld`-KK|bvs#E zRa;wTRT~>GK}Oal4X>sqwWz>AF(ziQCc{K^$HhKAYHI3gI?PROVXPJ#T^2j4d$W2p zX<7Sd?%TLgT|`H@NnFQ;lT&QpK6P!UgeG$%qf^&8HCb7Frt<rUT^D;S#u~9=CA->< z>zZopQ#q_y-<+}#u$uZq{oxxIJ~@`XGnkY+xb<VF7+y9~Y+t}BVWKkAP`SHBH+mXN zgoD$B#=faRGZQW?I3>*7wC+m8hlLyx9Qpx*ibkw03%J-sZb%$rU~W*B*q4*=!8t&I G!5RRdv>l)T literal 0 HcmV?d00001 diff --git a/modules/ekomi/config.xml b/modules/ekomi/config.xml new file mode 100644 index 000000000..7b8783a13 --- /dev/null +++ b/modules/ekomi/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>ekomi</name> + <displayName><![CDATA[eKomi]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Adds an eKomi block]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[advertising_marketing]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/ekomi/de.php b/modules/ekomi/de.php new file mode 100644 index 000000000..a7dfa3f70 --- /dev/null +++ b/modules/ekomi/de.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ekomi}prestashop>ekomi_c0858307dfd3d91768c79ec116820b60'] = 'eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_d245187b3591f5f6f723ece2217bb637'] = 'Fügt einen eKomi-Block hinzu'; +$_MODULE['<{ekomi}prestashop>ekomi_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{ekomi}prestashop>ekomi_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{ekomi}prestashop>ekomi_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{ekomi}prestashop>ekomi_597b9cfa17df5ac4e2a4b1f4b6de347a'] = 'eKomi-Konfiguration'; +$_MODULE['<{ekomi}prestashop>ekomi_c4fda5e26d4854b8718850c90694a54c'] = 'eKomi E-Mail'; +$_MODULE['<{ekomi}prestashop>ekomi_c48c140af813696592daafbabe6d8b9f'] = 'eKomi-Skript'; +$_MODULE['<{ekomi}prestashop>ekomi_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{ekomi}prestashop>ekomi_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{ekomi}prestashop>ekomi_ced21fe73878a0139d427ab2927f6772'] = 'Block anzeigen, oder verstecken. Bestellungen werden in jedem Fall an eKomi gesendet.'; +$_MODULE['<{ekomi}prestashop>ekomi_6a794dc942b2e8b4716dbc654e83d094'] = 'Bitte füllen Sie das Formular mit den Daten aus, die Sie von eKomi bekommen.'; +$_MODULE['<{ekomi}prestashop>ekomi_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/ekomi/ekomi.php b/modules/ekomi/ekomi.php new file mode 100755 index 000000000..0e646210f --- /dev/null +++ b/modules/ekomi/ekomi.php @@ -0,0 +1,133 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Ekomi extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + function __construct() + { + $this->name = 'ekomi'; + $this->tab = 'advertising_marketing'; + $this->version = 1.0; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('eKomi'); + $this->description = $this->l('Adds an eKomi block'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('rightColumn') AND $this->registerHook('newOrder')); + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitEkomi')) + { + $email = Tools::getValue('ekomi_email'); + Configuration::updateValue('PS_EKOMI_DISPLAY', Tools::getValue('ekomi_display')); + Configuration::updateValue('PS_EKOMI_SCRIPT', htmlentities(str_replace(array("\r\n", "\n"), '', Tools::getValue('ekomi_script')))); + if (!empty($email) && !Validate::isEmail($email)) + Configuration::updateValue('PS_EKOMI_EMAIL', ''); + else + Configuration::updateValue('PS_EKOMI_EMAIL', Tools::getValue('ekomi_email')); + $output .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + return ' + <form action="'.htmlentities($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('eKomi configuration').'</label> + <div class="margin-form"> + <br class="clear"/> + <label for="ekomi_email">'.$this->l('eKomi e-mail').'&nbsp;&nbsp;</label><input id="ekomi_email" type="text" name="ekomi_email" value="'.Configuration::get('PS_EKOMI_EMAIL').'" /> + <br class="clear"/><br /> + <label for="ekomi_script">'.$this->l('eKomi script').'&nbsp;&nbsp;</label><textarea id="ekomi_script" name="ekomi_script">'.stripslashes(html_entity_decode(Configuration::get('PS_EKOMI_SCRIPT'))).'</textarea> + <br class="clear"/><br /> + <label>Display block</label> + <div class="margin-form"> + <input type="radio" name="ekomi_display" id="ekomi_display_on" value="1" /> + <label class="t" for="ekomi_display_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="ekomi_display" id="ekomi_display_off" value="0" checked="checked" /> + <label class="t" for="ekomi_display_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p class="clear">'.$this->l('Show or don\'t show the block (orders will be sent to eKomi whether you choose to hide or display the block).').'</p> + </div> + <p class="clear">'.$this->l('Please fill the form with the data that eKomi gives you.').'</p> + </div> + <center><input type="submit" name="submitEkomi" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + } + + public function hookRightColumn($params) + { + if (!Configuration::get('PS_EKOMI_SCRIPT')) + return; + if (!Configuration::get('PS_EKOMI_DISPLAY')) + return; + return stripslashes(html_entity_decode(Configuration::get('PS_EKOMI_SCRIPT'))).'<br clear="left" /><br />'; + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookNewOrder($params) + { + if (!Configuration::get('PS_EKOMI_EMAIL')) + return true; + + /* Email generation */ + $subject = '[Ekomi-Prestashop] '.Configuration::get('PS_SHOP_NAME'); + $templateVars = array( + '{firstname}' => $params['customer']->firstname, + '{lastname}' => $params['customer']->lastname, + '{email}' => $params['customer']->email, + '{id_order}' => $params['order']->id + ); + + /* Email sending */ + if (!Mail::Send(1, 'ekomi', $subject, $templateVars, Configuration::get('PS_EKOMI_EMAIL'), NULL, $params['customer']->email, Configuration::get('PS_SHOP_NAME'), NULL, NULL, dirname(__FILE__).'/mails/')) + return true; + return true; + } +} + + diff --git a/modules/ekomi/es.php b/modules/ekomi/es.php new file mode 100644 index 000000000..3adcaf5f3 --- /dev/null +++ b/modules/ekomi/es.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ekomi}prestashop>ekomi_c0858307dfd3d91768c79ec116820b60'] = 'eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_d245187b3591f5f6f723ece2217bb637'] = 'Añadir un bloque eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{ekomi}prestashop>ekomi_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{ekomi}prestashop>ekomi_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{ekomi}prestashop>ekomi_597b9cfa17df5ac4e2a4b1f4b6de347a'] = 'configuración eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_c4fda5e26d4854b8718850c90694a54c'] = 'eKomi por e-mail'; +$_MODULE['<{ekomi}prestashop>ekomi_c48c140af813696592daafbabe6d8b9f'] = 'script eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Mostrar'; +$_MODULE['<{ekomi}prestashop>ekomi_b9f5c797ebbf55adccdd8539a65a0241'] = 'Ocultar'; +$_MODULE['<{ekomi}prestashop>ekomi_ced21fe73878a0139d427ab2927f6772'] = 'Mostrar o no el bloque (los pedidos serán enviados a eKomi independientemente de que usted elija ocultar o mostrar el bloque).'; +$_MODULE['<{ekomi}prestashop>ekomi_6a794dc942b2e8b4716dbc654e83d094'] = 'Por favor, rellene el formulario con los datos básicos que eKomi le da.'; +$_MODULE['<{ekomi}prestashop>ekomi_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; diff --git a/modules/ekomi/fr.php b/modules/ekomi/fr.php new file mode 100644 index 000000000..01a3fe1d0 --- /dev/null +++ b/modules/ekomi/fr.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ekomi}prestashop>ekomi_c0858307dfd3d91768c79ec116820b60'] = 'eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_d245187b3591f5f6f723ece2217bb637'] = 'Ajouter un bloc eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{ekomi}prestashop>ekomi_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{ekomi}prestashop>ekomi_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{ekomi}prestashop>ekomi_597b9cfa17df5ac4e2a4b1f4b6de347a'] = 'Configuration eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_c4fda5e26d4854b8718850c90694a54c'] = 'E-mail eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_c48c140af813696592daafbabe6d8b9f'] = 'Script eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Afficher'; +$_MODULE['<{ekomi}prestashop>ekomi_b9f5c797ebbf55adccdd8539a65a0241'] = 'Cacher'; +$_MODULE['<{ekomi}prestashop>ekomi_ced21fe73878a0139d427ab2927f6772'] = 'Afficher ou cacher le bloc (les commandes seront envoyés à eKomi que vous choississiez d\'afficher ou de cacher le bloc).'; +$_MODULE['<{ekomi}prestashop>ekomi_6a794dc942b2e8b4716dbc654e83d094'] = 'Veuillez remplir le formulaire avec les informations fournies par eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; diff --git a/modules/ekomi/it.php b/modules/ekomi/it.php new file mode 100644 index 000000000..01b07bef3 --- /dev/null +++ b/modules/ekomi/it.php @@ -0,0 +1,17 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ekomi}prestashop>ekomi_c0858307dfd3d91768c79ec116820b60'] = 'eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{ekomi}prestashop>ekomi_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{ekomi}prestashop>ekomi_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{ekomi}prestashop>ekomi_597b9cfa17df5ac4e2a4b1f4b6de347a'] = 'configurazione eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_c4fda5e26d4854b8718850c90694a54c'] = 'e-mail eKomi '; +$_MODULE['<{ekomi}prestashop>ekomi_c48c140af813696592daafbabe6d8b9f'] = 'script eKomi'; +$_MODULE['<{ekomi}prestashop>ekomi_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivo'; +$_MODULE['<{ekomi}prestashop>ekomi_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{ekomi}prestashop>ekomi_ccf7919cbd0248b0f86a8c39f74da5d0'] = 'Mostrare oppure no il blocco (gli ordini verranno inviati a eKomi e scegli di nascondere o visualizzare il blocco)'; +$_MODULE['<{ekomi}prestashop>ekomi_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/ekomi/logo.gif b/modules/ekomi/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..176cc078c15a27f76b52b1554584fb15ecea89c5 GIT binary patch literal 1095 zcmV-N1i1T0Nk%w1VGsZi0O$Vz6&DmOFDx%HE;TVQIyE#mIW{^tJUcx)Jw7}?JwZJ~ zIzU1{ML|G8Mm<4AM@B?POhidVM?^?QN<m9JOh-maNK8#hNJLCXP)JQkO+-peN={5q z8Dt1mO;S%$PD58fP*P7*QB_A*MnGFbRZ~|(Ts~D+R9975B5fQcZ53HpTUA+HTv}aP zTUlOQUrc33U0+->aw1}2WMN`pV`XA4d>dqCV>)^%Xl80hbvtKhW>9lRX=`Xdel0SA zJVbpoJAo)ndOt3PBWrDHZEtK)drfd|a&B;Ka&UAMm;`WgZylKcb#r$$ksKeJ0CjhC zA)Eksc6uY70C#zIdU$*#o&Y+PAts*yd3$&$paFe*e=4B^dwqH<q6K<?f=852Eu#m9 zeS?00eSv?2E2J8NfP^rm41j`vEu|Yjp(KBVhk}HGgoT4xmsmWf9z&%kiHD0nsUe7p zhe4|&ij0XptTsTbE?}QujE;+tj*?BTF_4mvlaZB9u{=w(Et`~}m6w!Hw=kKPn_IL% zVX|AAo0y!Mo?Es_KEoz(t$CfFoMyO8o}isd#WSOzq-VQUp`)Ouq^WVeSX9a|aK2!u zs;8@|t!Twwdcb3Nz-g_kudA)8uCT4Kv#^B6ceb;*w6?R5$cDPOytlfxmdk^e%!IzY zz_!4<z`nws&W^*t#K6M7p3#@Z!^gwL!l=`l%gD{g%EqwPq{hv{%FM~m%h1iw%hJ!( z&(Y4f+_%xw(7)Tb)za73)!D+|yw%s#+t$?D*WA?E+sog+*xJ|0;l<q9-rd^Y)ZW<3 z<HyqC$lu)I<K5iT<jLXQ<I?5P-{Ice;^gVy<=W=c<>Kby<lx-s)#K&j+UeZg>DK4v z>Eh|$-Rs`w=;i9@?Bwg<<?P|<>*(X{=<Mq5=I!F{>+tLD>hSII?eFXE@a^*N^!4xV z@A2;K^7ZiY@AL8X@$>NX^7i%f_xAMo{qy<w_4@zx`~3C)_W1Pw_5Atw`~Ua-|M>p- z`}q9&{{H;`A^s6Va%Ew3Wn>_CX>@2HM@dak04x9i000mG5C8xO{s7ep6d0>enKOJ; zjf*#soxola9vFeKK@I{0tIny@=x$SpGJ=fE&@e-W1T2-_v3s{H1d$;s8hikz0D~Af zQ$)#==K%y80y(VciPokE120?-P^(3Q1&JVb8cmv&$PW+*YMy-3v;aqjCXFtILUsyK z8WA(JXvw4HNC`WLhzVo%r%s?9B#^L>vqr{?G=!uD;}zzMogyc=n22P8$b=eqs0FLl z!H19!Es#8kWut<D9~^FN5`zOp3<m>fbdtA#iX{X$Mo<8-B1MEDh5}Gy>4Jui2PKS9 zxUhgvfe4`Fy?bYBhAI=THYA`@sRf8N@Z4#K*DC-UHgY%^5m6+-luCH-;=S96N)VGM Ncs`Yzr~X|)06V4~FK_?= literal 0 HcmV?d00001 diff --git a/modules/ekomi/mails/de/ekomi.html b/modules/ekomi/mails/de/ekomi.html new file mode 100755 index 000000000..186f5b5e0 --- /dev/null +++ b/modules/ekomi/mails/de/ekomi.html @@ -0,0 +1,10 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title></title> +</head> +<body> + <p>{firstname} {lastname} {email} {id_order}</p> +</body> +</html> \ No newline at end of file diff --git a/modules/ekomi/mails/de/ekomi.txt b/modules/ekomi/mails/de/ekomi.txt new file mode 100755 index 000000000..bed3e2c7b --- /dev/null +++ b/modules/ekomi/mails/de/ekomi.txt @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/ekomi/mails/en/ekomi.html b/modules/ekomi/mails/en/ekomi.html new file mode 100755 index 000000000..a7d94c885 --- /dev/null +++ b/modules/ekomi/mails/en/ekomi.html @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/ekomi/mails/en/ekomi.txt b/modules/ekomi/mails/en/ekomi.txt new file mode 100755 index 000000000..a7d94c885 --- /dev/null +++ b/modules/ekomi/mails/en/ekomi.txt @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/ekomi/mails/es/ekomi.html b/modules/ekomi/mails/es/ekomi.html new file mode 100755 index 000000000..f8bd0eb57 --- /dev/null +++ b/modules/ekomi/mails/es/ekomi.html @@ -0,0 +1,11 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title></title> +</head> +<body> + <p>{firstname} {lastname} {email} {id_order}</p> + +</body> +</html> \ No newline at end of file diff --git a/modules/ekomi/mails/es/ekomi.txt b/modules/ekomi/mails/es/ekomi.txt new file mode 100755 index 000000000..a7d94c885 --- /dev/null +++ b/modules/ekomi/mails/es/ekomi.txt @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/ekomi/mails/fr/ekomi.html b/modules/ekomi/mails/fr/ekomi.html new file mode 100755 index 000000000..a7d94c885 --- /dev/null +++ b/modules/ekomi/mails/fr/ekomi.html @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/ekomi/mails/fr/ekomi.txt b/modules/ekomi/mails/fr/ekomi.txt new file mode 100755 index 000000000..a7d94c885 --- /dev/null +++ b/modules/ekomi/mails/fr/ekomi.txt @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/ekomi/mails/it/ekomi.html b/modules/ekomi/mails/it/ekomi.html new file mode 100755 index 000000000..31a241c52 --- /dev/null +++ b/modules/ekomi/mails/it/ekomi.html @@ -0,0 +1,10 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>titolo</title> +</head> +<body> + <p>{firstname} {lastname} {email} {id_order}</p> +</body> +</html> \ No newline at end of file diff --git a/modules/ekomi/mails/it/ekomi.txt b/modules/ekomi/mails/it/ekomi.txt new file mode 100755 index 000000000..bed3e2c7b --- /dev/null +++ b/modules/ekomi/mails/it/ekomi.txt @@ -0,0 +1,4 @@ +{firstname} {lastname} +{email} +{id_order} + diff --git a/modules/envoimoinscher/AdminEnvoiMoinsCher.gif b/modules/envoimoinscher/AdminEnvoiMoinsCher.gif new file mode 100755 index 0000000000000000000000000000000000000000..5528809a78087d41ab71f6073bcd0e19fedd3e62 GIT binary patch literal 604 zcmZ?wbhEHb6krfwc*el6B0lU=yzl?JH~vp*{9m1Fms0dU(c}O6MgP|?{{Q!HYE$pu zc-Q~4yZ>he{ckC_6Yu?hUcXgB-r@Mb|8HLYZ!h*v$ohZv+`oG_{{fYCRs3Hv?f<6_ z|BGY(_g4QuxZOG-@87?F|G$3uUzTvMIQjpP-Ftu<fhvD||3A6$|MC4@@iG5@|NcL% z?ZKH-|Ns44nGpUy-u-{7@Bf({|2HrHfA;AAv&a5t`2U~N{l6(MD!0rkG5`PDSO4?E z{&!dY-@o~PN$gLcX@_<kK6m;5o$LR<eO<HX(Bq2q|K*AQ@8A0W^T+=LxBm(5|4$rn zPsskC>=lua{{R2K|7pJe|Nn1|kNyAR>Ho~Y51+qOO_}@u;;H|yU;J+?`kxc}8))W& ziT|&h{l9nPKVWDSMKjP0DE?&OWMD{Q&;i*1iW3I*oee=v&C+&qip`zPoDs}yemZfS zT|s)*9Eob~N@_Cfk)3)bvR-Df9?k-RUXnh|@itx}DxOX1j(ifl@lEDx7S4K|3c7A; z=1n|mej29QO<}HF`f5BU)ow&fi93a}$}?QOe&dF+rIpo#M?t5asPT)wcy;Z~yZ0Yo zKK!!p-3Kc{e-#<wC(6Q>6}}-X5e^616*R<BjvV-w;KivBx{IU1=me`Ef7G;sM#g3C VT~Sk(1XzA>KGMV4#l*;94FE0t5P$#x literal 0 HcmV?d00001 diff --git a/modules/envoimoinscher/AdminEnvoiMoinsCher.php b/modules/envoimoinscher/AdminEnvoiMoinsCher.php new file mode 100755 index 000000000..bf2599268 --- /dev/null +++ b/modules/envoimoinscher/AdminEnvoiMoinsCher.php @@ -0,0 +1,314 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once('envoimoinscher.php'); + +class AdminEnvoiMoinsCher extends AdminTab +{ + public $packaging = array('Pli' => 'Pli', 'Colis' => 'Colis', 'Encombrant' => 'Objet lourd', 'Palette' => 'Palette'); + public function __construct() + { + parent::__construct(); + } + + public function display() + { + global $cookie; + $emc = new Envoimoinscher(); + echo '<h2>'.$emc->lang('List of orders to export').'</h2>'; + if (Tools::isSubmit('submitExport')) + { + $orderToExport = array(); + $idsOrdersToExport = Tools::getValue('ordersBox'); + if (!empty($idsOrdersToExport)) + { + foreach($idsOrdersToExport as $id) + { + $orderToExport[] = self::getOrderDetails((int)($id)); + } + echo '<form action="http://www.envoimoinscher.com/index.html" method="POST"> + <input type="hidden" name="url_renvoi" value="'.Tools::getProtocol().htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').$_SERVER['REQUEST_URI'].'"> + <input type="hidden" name="login" value="'.htmlspecialchars(Configuration::get('EMC_LOGIN'), ENT_COMPAT, 'UTF-8').'"> + <input type="hidden" name="tracking" value="prestashop_module_v1">'; + self::inputMaker($orderToExport); + + echo '</form> + <script type="text/javascript"> + $(document).ready(function() { + $("form").submit(); + }); + </script>'; + } + else echo '<div class="alert error"> + <img src="' . _PS_IMG_ . 'admin/forbbiden.gif" alt="nok" /> + '.$emc->lang('No order to export').'</div> + <p><a class="button" href="'.Tools::getProtocol().htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').$_SERVER['REQUEST_URI'].'">Retour</a></p>'; + } + else + { + if (Configuration::get('EMC_ORDER_STATE') AND Configuration::get('EMC_CARRIER') AND Configuration::get('EMC_FIRST_NAME') AND Configuration::get('EMC_LAST_NAME') + AND Configuration::get('EMC_ADDRESS') AND Configuration::get('EMC_ZIP_CODE') AND Configuration::get('EMC_CITY') AND Configuration::get('EMC_COUNTRY') + AND Configuration::get('EMC_PHONE') AND Configuration::get('EMC_EMAIL') AND Configuration::get('EMC_LOGIN')) + { + echo '<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">'; + $orders = self::getOrders(); + self::displayOrders($orders); + echo '<p><input type="submit" value="'.$emc->lang('Send').'" name="submitExport" class="button" style="margin:10px 0px 0px 25px;"></p> + </form>'; + } + else + echo '<h2 style="color:red">'.$emc->lang('Please configure this module in order').'</h2>'; + } + echo '<br><p><a href="index.php?tab=AdminModules&configure=envoimoinscher&token='.Tools::getAdminToken('AdminModules'.(int)(Tab::getIdFromClassName('AdminModules')).(int)($cookie->id_employee)).'" class="button"> + ' . $emc->lang('Change configuration') . '</a></p>'; + } + + private function getOrders() + { + $id_order_state = (int)(Configuration::get('EMC_ORDER_STATE')); + $id_carrier = (int)(Configuration::get('EMC_CARRIER')); + + $sql = ' + SELECT o.id_order as id_order, o.`id_customer` as id_customer, + CONCAT(c.`firstname`, \' \', c.`lastname`) AS `customer`, + o.total_paid_real as total, o.total_shipping as shipping, + o.date_add as date, o.id_currency as id_currency, o.id_lang as id_lang, + SUM(od.product_weight * od.product_quantity) as weight + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (o.`id_order` = od.`id_order`) + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = o.`id_customer`) + LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = o.`id_order`) + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`) + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = o.`id_lang`) + WHERE (SELECT moh.`id_order_state` FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = o.`id_order` ORDER BY moh.date_add DESC LIMIT 1) = '.$id_order_state.' + AND o.id_carrier = '.pSQL($id_carrier).' + GROUP BY o.`id_order`, od.`id_order` + ORDER BY o.`date_add` ASC'; + return Db::getInstance()->ExecuteS($sql); + } + + private function displayOrders($orders) + { + global $cookie; + echo '<table cellspacing="0" cellpadding="0" class="table" align="center" style="margin:10px 0px 0px 25px;"> + <tr> + <th><input type="checkbox" name="checkme" class="noborder" onclick="checkDelBoxes(this.form, \'ordersBox[]\', this.checked)" /></th> + <th>'.$emc->lang('ID').'</th> + <th>'.$emc->lang('Name').'</th> + <th>'.$emc->lang('Total Cost').'</th> + <th>'.$emc->lang('Total shipment').'</th> + <th>'.$emc->lang('Date').'</th> + <th>'.$emc->lang('Packaging').'</th> + <th>'.$emc->lang('Nature of contents').'</th> + <th>'.$emc->lang('Detail').'</th> + </tr>'; + if (!empty($orders)) + { + foreach($orders as $order) + { + $customer = new Customer((int)($order['id_customer'])); + echo '<tr> + <td align="center"> + <input type="checkbox" name="ordersBox[]" class="ordersBox" value="'.(int)($order['id_order']).'" /> + </td> + <td align="center">'.(int)($order['id_order']).'</td> + <td>'.htmlentities($customer->lastname, ENT_COMPAT, 'UTF-8').' '.htmlentities($customer->firstname, ENT_COMPAT, 'UTF-8').'</td> + <td align="center">'.Tools::displayPrice($order['total'], new Currency((int)($order['id_currency']))).'</td> + <td align="center">'.Tools::displayPrice($order['shipping'], new Currency((int)($order['id_currency']))).'</td> + <td align="center">'.Tools::displayDate($order['date'], (int)($order['id_lang'])).'</td> + <td align="center"> + <select name="packaging_'.$order['id_order'].'">'; + foreach($this->packaging as $package => $value) + echo '<option '.(Configuration::get('EMC_PACKAGING_DEFAULT') == $value ? ' selected="selected" ' : '').' value="'.htmlentities($value, ENT_COMPAT, 'UTF-8').'"> + '.htmlentities($package, ENT_COMPAT, 'UTF-8').'</option>'; + echo '</select> + </td> + <td>'.envoimoinscher::selectNature(Configuration::get('EMC_CONTENT'),(int)($order['id_order'])).'</td> + <td align="center"><a href="index.php?tab=AdminOrders&id_order='.(int)($order['id_order']).'&vieworder&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee)).'"> + <img border="0" title="'.$emc->lang('View').'" alt="'.$emc->lang('View').'" src="'._PS_IMG_.'admin/details.gif"/></a></td> + </tr>'; + } + } + else + echo '<tr><td colspan="4" align="center">'.$emc->lang('No order to export').'</td></tr>'; + + echo '</table>'; + } + + private function getOrderDetails($id_order) + { + global $cookie; + $confs = Configuration::getMultiple(array('EMC_LOGIN', 'PS_SHOP_NAME', 'EMC_GENDER', 'EMC_FIRST_NAME', 'EMC_LAST_NAME', 'EMC_ADDRESS', + 'EMC_ZIP_CODE', 'EMC_CITY', 'EMC_COUNTRY', 'EMC_PHONE', 'EMC_EMAIL', 'EMC_EMAILS')); + $orderDetails = array(); + $order = new Order((int)($id_order)); + $customer = new Customer((int)($order->id_customer)); + $adresseDelivery = new Address((int)($order->id_address_delivery)); + + $genderTab = array(1 => 'M.', 2 => 'Mme', 9 => ''); + $orderDetails['url_suivi'] = Tools::getProtocol().htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/envoimoinscher/tracking.php?token='.$customer->secure_key; + $orderDetails['infoexterne'] = str_replace('.','_',str_replace('www.','',$_SERVER['HTTP_HOST'])).'_'.(int)($id_order); + $orderDetails['packaging'] = Tools::getValue('packaging_'.(int)($id_order)); + $orderDetails['type_objet'] = Tools::getValue('type_objet_'.(int)($id_order)); + $orderDetails['envoi_emailsconf'] = (int)($confs['EMC_EMAILS']); + + //products infos + $productsDetails = $order->getProductsDetail(); + $tabDetails = array(); + foreach($productsDetails as $details) + { + $features = self::getFeatures((int)($details['product_id'])); + $tabDetailsProduct = array(); + $tabDetailsProduct['id'] = (int)($details['product_id']); + $tabDetailsProduct['nb'] = (int)($details['product_quantity']); + $tabDetailsProduct['poids'] = (float)($details['product_weight']); + $tabDetailsProduct['description'] = htmlspecialchars($details['product_name'], ENT_COMPAT, 'UTF-8'); + foreach($features as $key => $value) + $tabDetailsProduct[$key] = $value; + $tabDetails[] = $tabDetailsProduct; + } + $orderDetails['products'] = $tabDetails; + + //sending infos + $orderExpediteur['civilite'] = htmlspecialchars($genderTab[$confs['EMC_GENDER']], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['collecte_type'] = 'entreprise'; + $orderExpediteur['societe'] = htmlspecialchars($confs['PS_SHOP_NAME'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['nom'] = htmlspecialchars($confs['EMC_LAST_NAME'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['prenom'] = htmlspecialchars($confs['EMC_FIRST_NAME'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['adresse'] = htmlspecialchars($confs['EMC_ADDRESS'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['codepostal'] = htmlspecialchars($confs['EMC_ZIP_CODE'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['ville'] = htmlspecialchars($confs['EMC_CITY'], ENT_COMPAT, 'UTF-8'); + + $orderExpediteur['pz_id'] = htmlspecialchars($confs['EMC_COUNTRY'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['tel'] = htmlspecialchars($confs['EMC_PHONE'], ENT_COMPAT, 'UTF-8'); + $orderExpediteur['email'] = htmlspecialchars($confs['EMC_EMAIL'], ENT_COMPAT, 'UTF-8'); + $orderDetails['expediteur'] = $orderExpediteur; + + //delivery infos + $orderDelivery['civilite'] = $genderTab[(int)($customer->id_gender)]; + if (isset($adresseDelivery->company)) + $orderDelivery['collecte_type'] = 'particulier'; + $orderDelivery['societe'] = htmlspecialchars($adresseDelivery->company, ENT_COMPAT, 'UTF-8'); + $orderDelivery['prenom'] = htmlspecialchars($adresseDelivery->firstname, ENT_COMPAT, 'UTF-8'); + $orderDelivery['nom'] = htmlspecialchars($adresseDelivery->lastname, ENT_COMPAT, 'UTF-8'); + $orderDelivery['adresse'] = htmlspecialchars($adresseDelivery->address1, ENT_COMPAT, 'UTF-8'); + $orderDelivery['codepostal'] = htmlspecialchars($adresseDelivery->postcode, ENT_COMPAT, 'UTF-8'); + $orderDelivery['ville'] = htmlspecialchars($adresseDelivery->city, ENT_COMPAT, 'UTF-8'); + $orderDelivery['pz_id'] = Country::getIsoById(Country::getIdByName((int)($cookie->id_lang),$adresseDelivery->country)); + if (isset($adresseDelivery->phone)) + $orderDelivery['tel'] = htmlspecialchars($adresseDelivery->phone, ENT_COMPAT, 'UTF-8'); + else + $orderDelivery['tel'] = htmlspecialchars($adresseDelivery->phone_mobile, ENT_COMPAT, 'UTF-8'); + $orderDelivery['email'] = htmlspecialchars($customer->email, ENT_COMPAT, 'UTF-8'); + + $orderDetails['destinataire'] = $orderDelivery; + //d($orderDetails); + return $orderDetails; + } + + private function getFeatures($id) + { + global $cookie; + $featuresTab = array(); + $confs = Configuration::getMultiple(array('EMC_WIDTH', 'EMC_HEIGHT', 'EMC_DEPTH')); + $features = Product::getFeaturesStatic((int)$id); + foreach($features as $feature) + { + switch ($feature['id_feature']) + { + case $confs['EMC_WIDTH'] : + $featureValue = new FeatureValue((int)($feature['id_feature_value'])); + $featuresTab['largeur'] = $featureValue->value[(int)($cookie->id_lang)]; + break; + case $confs['EMC_HEIGHT'] : + $featureValue = new FeatureValue((int)($feature['id_feature_value'])); + $featuresTab['hauteur'] = $featureValue->value[(int)($cookie->id_lang)]; + break; + case $confs['EMC_DEPTH'] : + $featureValue = new FeatureValue((int)($feature['id_feature_value'])); + $featuresTab['longueur'] = $featureValue->value[(int)($cookie->id_lang)]; + break; + } + } + return $featuresTab; + } + + private function inputMaker($orderDetails) + { + $nbrOrder = count($orderDetails)-1; + foreach($orderDetails as $details) + { + foreach($details as $detail => $values) + { + if ($detail == 'products') + { + if (count($values) > 1) + { + $weight = 0; + foreach($values as $key => $features) + { + $weight += (float)($features['poids']*$features['nb']); + } + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.groupe_0.poids" value="'.$weight.'">'; + } + elseif($values[0]['nb'] > 1) + { + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.groupe_0.poids" value="'.$values[0]['poids']*$values[0]['nb'].'">'; + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.description" value="'.$values[0]['description'].'">'; + } + else + { + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.groupe_0.poids" value="'.(isset($values[0]['poids']) ? ((float)($values[0]['poids']*$values[0]['nb'])) : '').'">'; + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.groupe_0.longueur" value="'.(isset($values[0]['longueur']) ? (float)($values[0]['longueur']) : '').'">'; + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.groupe_0.hauteur" value="'.(isset($values[0]['hauteur']) ? (float)($values[0]['hauteur']) : '').'">'; + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.groupe_0.largeur" value="'.(isset($values[0]['largeur']) ? (float)($values[0]['largeur']) : '').'">'; echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.description" value="'.(isset($values[0]['description']) ? htmlentities($values[0]['description'], ENT_COMPAT, 'UTF-8') : '').'">'; + } + } + elseif ($detail == 'packaging') + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.type_envoi" value="'.htmlentities($values, ENT_COMPAT, 'UTF-8').'">'; + elseif ($detail == 'infoexterne') + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.infoexterne" value="'.htmlentities($values, ENT_COMPAT, 'UTF-8').'">'; + elseif ($detail == 'url_suivi') + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.url_suivi" value="'.htmlentities($values, ENT_COMPAT, 'UTF-8').'">'; + elseif ($detail == 'infoexterne') + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.infoexterne" value="'.htmlentities($values, ENT_COMPAT, 'UTF-8').'">'; + elseif ($detail == 'envoi_emailsconf') + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.envoi_emailsconf" value="'.(int)($values).'">'; + elseif ($detail == 'type_objet') + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.type_objet" value="'.htmlentities($values, ENT_COMPAT, 'UTF-8').'">'; + else + { + foreach($values as $key => $value) + echo '<input type="hidden" name="envoi_'.htmlentities($nbrOrder, ENT_COMPAT, 'UTF-8').'.'.htmlentities($detail, ENT_COMPAT, 'UTF-8').'.'.htmlentities($key, ENT_COMPAT, 'UTF-8').'" value="'.htmlentities($value, ENT_COMPAT, 'UTF-8').'">'; + } + } + $nbrOrder -=1 ; + } + } +} + + diff --git a/modules/envoimoinscher/config.xml b/modules/envoimoinscher/config.xml new file mode 100755 index 000000000..0d0237123 --- /dev/null +++ b/modules/envoimoinscher/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>envoimoinscher</name> + <displayName><![CDATA[Envoimoinscher]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Find the best price for your shipment. Compare and order carriers offers at negotiated rates.]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[shipping_logistics]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries>fr</limited_countries> +</module> \ No newline at end of file diff --git a/modules/envoimoinscher/de.php b/modules/envoimoinscher/de.php new file mode 100644 index 000000000..e39b3b204 --- /dev/null +++ b/modules/envoimoinscher/de.php @@ -0,0 +1,119 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e0b8a2c577580cb773bda0486acc4bf8'] = 'Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bbd983fbdc5928ce36d6edce53639718'] = 'Finden Sie den günstigsten Versand. Vergleichen und fordern Sie Angebote von Lieferanten sowie ausgehandelte Preise an.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cc89336eed19f4c3bef8ae484eb43109'] = '\'Breite\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fab811cb477e7794389f16624ac9aff9'] = '\'Höhe\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7854da902d5f2ad746fe1b6f950da08e'] = '\'Tiefe\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_63a0a494ef3c3c22829660ef6081dce4'] = '\'Bestellstatus\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_786b7b25dcd85d7e972a377f56facb5a'] = '\'Lieferant\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1a3ade81b4ddac3ff0fe9f98f93ad843'] = '\'Status Bestellung vorbei\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_070d4ccfe53bdbc791cbd6119b872f34'] = '\'Status Bestellung senden\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c98d7be3b0acc53f7d2142cc3a3ab444'] = '\'Status Bestellung geliefert\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4d470fde8487e755a50e9235e3dc13ab'] = 'muss konfiguriert sein, um dieses Modul richtig zu nutzen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9d766be2c89b5af0010ac0c11dcddae7'] = 'Bitte manuell kopieren'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6357d3551190ec7e79371a8570121d3a'] = 'Es sind'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ce81305b7edb043d0a7a5c75cab17d0'] = 'Es ist'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_07213a0161f52846ab198be103b5ab43'] = 'Fehler'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cb5e100e5a9a3e7f6d1fd97512215282'] = 'Fehler'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_413c9cfb1b07fabd2f4e2873e6b92da1'] = 'Envoimoinscher Konto erstellen:'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8fc0ba19a15eeb50ab4ad8db449b0c74'] = 'Um Ihr Konto bei Envoimoinscher zu erstellen, klicken Sie auf das Bild unten. Damit gehen Sie zu einem speziellen persönlichen Bereich, wo Sie sämtliche Tools für eine einfache Versandverwaltung finden.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Beschreibung'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_82b213c84c7cf648a3cc9e718bb0f1c5'] = 'Dieses Modul ermöglicht es Ihnen, Lieferanten-Angebote und Online-Bestellungsservices mit ausgehandelten Lieferkosten zu vergleichen.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b843f182d32b5571e48879444311c38b'] = 'Sie müssen Ihren Envoimoinscher-Benutzernamen unten eingeben. Wenn Sie noch kein Kunde bei Envoimoinscher sind, können Sie ganz einfach ein Konto erstellen, indem Sie'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c92285fa6d3e827b198d120ea3ac674'] = 'hier klicken'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d64b03d7cc357f2ac9c63f8c88b49a0'] = 'Dokumentation downloaden '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_32954654ac8fe66a1d09be19001de2d4'] = 'Breite'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_af7bb0f5eddd2287cf3f6b880d189e19'] = 'Wählen Sie eine Funktion ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_31f12b07ff0701df3b6000412952f9c7'] = 'Wählen Sie die Breite in der Liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eec6c4bdbd339edf8cbea68becb85244'] = 'Höhe'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_97fd502c6a75bfb727fbb5a93d3bc60b'] = 'Wählen Sie die Höhe in der Liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_675056ad1441b6375b2c5abd48c27ef1'] = 'Tiefe'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ccccb5efc77dfc62afb2c5ad4223916d'] = 'Wählen Sie die Tiefe in der Liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a669003ea35aa39ca280b83bd259a032'] = 'Verpackung'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6106b8b4d1ecffdfa8357956183ec519'] = 'Verpackungsart aussuchen...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2b4c2d19b9293e812fa18765a407be4d'] = 'Standard-Verpackungsart auswählen.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f0c28b9363b60ed0a4579291ca510544'] = 'Art der Inhalte'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4c0dac58ce6ddb2fa8776d32b1571d4'] = 'Standard-Inhaltsart auswählen.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e74b7618bb3f99b8a7c00ef765c727eb'] = 'Bestellstatus zum Export'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_509d517463244dcd1ec09c4c5fa266ac'] = 'Wählen Sie einen Status ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bb4b4f2503c57254aaed1f1a07bb71da'] = 'Wählen Sie den Bestellstatus zum Export an Envoi Moins Cher.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_914419aa32f04011357d3b604a86d7eb'] = 'Lieferant'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6f2a31a74727092b14a9f25fa0761f4'] = 'Wählen Sie einen Lieferanten...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a22d9830367fdf0f6b2601e7484b387'] = 'Wählen Sie einen Lieferanten auf der Liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2aad255fde4750af3f559d078e1cb420'] = 'Bestellstatus \"Bestellung abgeschlossen\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd77298d81e440f5379f48dccf993a8b'] = 'Wählen Sie den Bestellstatus abgeschlossen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8532ff05a8576bdc04f8a9b8b1dbbfbc'] = 'Bestellstatus Absenden'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5af6d17d6837ce556286d019e06e4e0'] = 'Wählen Sie den Bestellstatus Absenden'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d2392c7501c4041d990cc0d372cde50a'] = 'Bestellstatus Geliefert'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b06087cef2468e82e0e07499fdba5c30'] = 'Wählen Sie den Bestellstatus Geliefert'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1e884e3078d9978e216a027ecd57fb34'] = 'E-Mail'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9e839460f2871eb777da1b74f3fab03e'] = 'Aktiviert oder deaktiviert das Senden von Mails aus EMC'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a995d9073f999ae5713f6994092b57e'] = 'bis es den Empfänger standardmäßig informiert'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7a16e0022af67a71b8d1521f746f41b3'] = 'EMC Login'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6ef6eed8e2c2d13d6823cbff8f139bad'] = 'Stellen Sie Ihr EMC Login ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a861c864b470344da673354f996ce0a7'] = 'Absenderinformationen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_019ec3132cdf8ee0f2e2a75cf5d3e459'] = 'Geschlecht'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5f33341287efce675cacf0b3ed818e70'] = 'Wählen Sie das Geschlecht des Absenders'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d3f5eff9c40ee315d452392bed5309b'] = 'Nachname'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8cf6db4af977baa86b7691da80601bd0'] = 'Stellen Sie den Nachnamen des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20db0bfeecd8fe60533206a2b5e9891a'] = 'Vorname'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49a768ce02314f39d386a66b77ae1858'] = 'Stellen Sie den Vornamen des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a56f1882e859d6ce5b0fbc96c544100'] = 'Stellen Sie die Adresse des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_642d3ba5db8b57e006584b544e490ec7'] = 'Postleitzahl'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_16e65be7ad7680a7148b8ddf0b5b4171'] = 'Stellen Sie die Postleitzahl des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_57d056ed0984166336b7879c2af3657f'] = 'Stadt'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e73af174484a98a10a852ab5bdb701bf'] = 'Stellen Sie die Stadt des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_59716c97497eb9694541f7c3d37b1a4d'] = 'Land'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_255529f7845194a47b4c2e28374cdb1f'] = 'Wählen Sie ein Land ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c820bc5f65e6258a648c3621b7b761e'] = 'Wählen Sie das Land des Absenders in der Liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bcc254b55c4a1babdf1dcb82c207506b'] = 'Telefon'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6770d2600f6b45aa0b18dd9a6e39b2f8'] = 'Stellen Sie die Telefonnummer des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-Mail'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43cdf4833105e72eb951833a030ad4d5'] = 'Stellen Sie die E-Mail des Absenders ein'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1fa598730b02d78aa07d07337c81c720'] = 'Breite nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c5ac8560e3b92c7941286fa8c2b3a1ed'] = 'Höhe nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_0eed429f3ae1e71de73b94e13f786893'] = 'Tiefe nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5d50fc169bba225de3df710ff98188c6'] = 'Bestellstatus nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_340ffdfdc019d0b001a4753b57aa398a'] = 'Lieferant nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ecdf47576d5d0d024f30199900c1761'] = 'Bestellstatus \"Bestellung abgeschlossen\" genicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6a9265e0dcf5d7a7f331055b9b93609'] = 'Bestellstatus Senden nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9f3440922590dae1ebc28c40555c6203'] = 'Bestellstatus Lieferung nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43b89b46dcf9440d5f852548ac5341a3'] = 'Nachname nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9a6dfbad73e6a8a852d4b1a266e941d2'] = 'Vorname nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fdda31acf2551d1edde59d64144975b8'] = 'Adresse nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_01fc0f14742ba00423886a14e31964de'] = 'PLZ nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2814eaaff876f0a3f29d87b23ceaa041'] = 'Stadt nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ae21c3189ecc1e32d10e8f3b264af190'] = 'Land nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_829d5874145d3477d778cdff96671448'] = 'Telefonnummer nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a3b23591400c94a94583a94c0ab1f19f'] = 'E-Mail nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_18f54b7a823f3349d841804a9fbc5aa3'] = 'Login nicht angegeben'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9284bff13acffdd879ef4ac7fca5234'] = 'Einstellungen fehlgeschlagen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1b67f24ea45fdf2e11ad8f6e777e8c8b'] = 'Versandinformationen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fad2b83dc128dfb793fa8ee944dd9931'] = 'Versandverfolgung'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d668e43f1d8b0584ed4f896de031d921'] = 'Keine Versandnummer'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bee4b55285d16e5fe85fc3474e343c51'] = 'Lieferscheine drucken'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_10f0b7273755ee4117c1517010e18c23'] = 'Keine Lieferscheinnummer'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9ab3e83b1071d09ca62e4cd258686f6b'] = 'Keine Bestellung zum Exportieren'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8c193493d8e4a97dc6da02d9809be530'] = 'Bitte konfigurieren Sie dieses Modul in der Bestellung'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2345e28c9b93f368968be4781ed70f5c'] = 'Konfiguration ändern'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_50e91dab2a063bc8c1dbc383b0c8e71c'] = 'Gesamtkosten'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5e8ff31378107b80ae8a9e7cd93eb1bc'] = 'Gesamt Versand'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_44749712dbec183e983dcd78a7736c41'] = 'Datum'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_403ddddf1f3eecc1a2566b3d81e12993'] = 'Art der Inhalte'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a254c25adc7d10d7e9c4889484f875a5'] = 'Detail'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4351cfebe4b61d8aa5efa1d020710005'] = 'Anzeigen'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_94966d90747b97d1f0f206c98a8b1ac3'] = 'Senden'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eae21050d83c239d047c9eb0d3bc930e'] = 'Liste der Bestellungen zum Exportieren'; + +?> \ No newline at end of file diff --git a/modules/envoimoinscher/envoimoinscher.php b/modules/envoimoinscher/envoimoinscher.php new file mode 100755 index 000000000..a6051255f --- /dev/null +++ b/modules/envoimoinscher/envoimoinscher.php @@ -0,0 +1,601 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Envoimoinscher extends Module +{ + private $_html = ''; + private $_postErrors = array(); + public $_errors = array(); + public $packaging = array('Pli' => 'Pli', 'Colis' => 'Colis', 'Encombrant' => 'Objet lourd', 'Palette' => 'Palette'); + const INSTALL_SQL_FILE = 'install.sql'; + function __construct() + { + global $cookie; + + $this->name = 'envoimoinscher'; + $this->tab = 'shipping_logistics'; + $this->version = '1.0'; + $this->limited_countries = array('fr'); + $this->needRange = true; + + parent::__construct (); + + $this->page = basename(__FILE__, '.php'); + $this->displayName = $this->l('Envoimoinscher'); + $this->description = $this->l('Find the best price for your shipment. Compare and order carriers offers at negotiated rates.'); + + if (self::isInstalled($this->name)) + { + $warning = array(); + //Check config and display warning + if (!Configuration::get('EMC_WIDTH')) + $warning[] .= $this->l('\'Width\'').' '; + if (!Configuration::get('EMC_HEIGHT')) + $warning[] .= $this->l('\'Height\'').' '; + if (!Configuration::get('EMC_DEPTH')) + $warning[] .= $this->l('\'Depth\'').' '; + if (!Configuration::get('EMC_ORDER_STATE')) + $warning[] .= $this->l('\'Order state\'').' '; + if (!Configuration::get('EMC_CARRIER')) + $warning[] .= $this->l('\'Carrier\'').' '; + if (!Configuration::get('EMC_ORDER_PAST_STATE')) + $warning[] .= $this->l('\'Order past state\'').' '; + if (!Configuration::get('EMC_SEND_STATE')) + $warning[] .= $this->l('\'Send order state\'').' '; + if (!Configuration::get('EMC_DELIVERY_STATE')) + $warning[] .= $this->l('\'Delivered order state\'').' '; + + if (count($warning)) + $this->warning .= implode(' , ',$warning).$this->l('must be configured to use this module correctly').' '; + } + } + + /** + * @see ModuleCore::install() + */ + public function install() + { + global $cookie; + + if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return false; + elseif (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return false; + $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); + $sql = preg_split("/;\s*[\r\n]+/", $sql); + foreach ($sql AS $query) + if ($query AND sizeof($query) AND !Db::getInstance()->Execute(trim($query))) + return false; + if (substr(_PS_VERSION_, 2, 3) <= 3.1) + { + if (!@copy(dirname(__FILE__).'/AdminEnvoiMoinsCher.gif', _PS_IMG_DIR_.'/t/AdminEnvoiMoinsCher.gif')) + $this->_errors[] = $this->l('Please manually copy ') .dirname(__FILE__).'/AdminEnvoiMoinsCher.gif'.' in the '._PS_IMG_DIR_.'/t/AdminEnvoiMoinsCher.gif folder located in your admin directory.'; + } + if (!parent::install() OR !Configuration::updateValue('EMC_EMAILS', 1) OR !$this->registerHook('AdminOrder') OR !self::adminInstall() + OR !Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'envoimoinscher` (`id_order` int(10) unsigned NOT NULL, `shipping_number` varchar(30) NOT NULL ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=latin1;')) + return false; + return true; + } + + /** + * Add new tab in administration + */ + private function adminInstall() + { + $tab = new Tab(); + $tab->class_name = 'AdminEnvoiMoinsCher'; + $tab->id_parent = 3; + $tab->module = 'envoimoinscher'; + $tab->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('Envoimoinscher'); + return $tab->add(); + } + + /** + * @see ModuleCore::uninstall() + */ + public function uninstall() + { + global $cookie; + + Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'envoimoinscher_contenu`'); + + $tab = new Tab(Tab::getIdFromClassName('AdminEnvoiMoinsCher')); + if (!parent::uninstall() OR !$tab->delete() OR !$this->unregisterHook('AdminOrder')) + return false; + return true; + } + + public function getContent() + { + $this->_html .= '<h2>' . $this->l('Envoimoinscher').'</h2>'; + + if (!empty($_POST) AND Tools::isSubmit('submitSave')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + { + $nbErrors = sizeof($this->_postErrors); + $this->_html .= '<div class="alert error" > + <h3>'.($nbErrors > 1 ? $this->l('There are') : $this->l('There is')).' '.$nbErrors.' '.($nbErrors > 1 ? $this->l('errors') : $this->l('error')).'</h3> + <ol style="margin: 0 0 0 20px;">'; + foreach ($this->_postErrors AS $err) + $this->_html .= '<li>- '.$err.'</li>'; + $this->_html .= '</ol></div>'; + } + } + $this->_displayForm(); + return $this->_html; + } + + + private function _displayForm() + { + global $cookie; + $genderTab = array(1 => 'M.', 2 => 'Mme', 9 => '', 0 => ''); + $features = Feature::getFeatures($cookie->id_lang); + $order_states = OrderState::getOrderStates($cookie->id_lang); + $carriers = Carrier::getCarriers($cookie->id_lang); + $countries = Country::getCountries($cookie->id_lang); + $confs = Configuration::getMultiple(array('PS_SHOP_NAME', 'EMC_LOGIN', 'EMC_GENDER', 'EMC_LAST_NAME', 'EMC_FIRST_NAME', 'EMC_ADDRESS', 'EMC_ZIP_CODE', 'EMC_CITY', 'EMC_COUNTRY', + 'EMC_PHONE', 'EMC_EMAIL')); + $link = '<a href="http://www.envoimoinscher.com/inscription.html?tracking=prestashop_module_v1 + &login='.(isset($confs['EMC_LOGIN']) ? htmlspecialchars($confs['EMC_LOGIN'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_civ='.(isset($genderTab[(int)(Configuration::get('EMC_GENDER'))]) ? htmlspecialchars($genderTab[(int)(Configuration::get('EMC_GENDER'))], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_ste='.(isset($confs['PS_SHOP_NAME']) ? htmlspecialchars($confs['PS_SHOP_NAME'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_nom='.(isset($confs['EMC_LAST_NAME']) ? htmlspecialchars($confs['EMC_LAST_NAME'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_prenom='.(isset($confs['EMC_FIRST_NAME']) ? htmlspecialchars($confs['EMC_FIRST_NAME'], ENT_COMPAT, 'UTF-8') : '' ).' + &user_type=entreprise&facturation.pz_id='.(isset($confs['EMC_COUNTRY']) ? htmlspecialchars($confs['EMC_COUNTRY'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.adresse1='.(isset($confs['EMC_ADDRESS']) ? htmlspecialchars($confs['EMC_ADDRESS'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_cp='.(isset($confs['EMC_ZIP_CODE']) ? htmlspecialchars($confs['EMC_ZIP_CODE'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_ville='.(isset($confs['EMC_CITY']) ? htmlspecialchars($confs['EMC_CITY'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_tel='.(isset($confs['EMC_PHONE']) ? htmlspecialchars($confs['EMC_PHONE'], ENT_COMPAT, 'UTF-8') : '' ).' + &facturation.contact_email='.(isset($confs['EMC_EMAIL']) ? htmlspecialchars($confs['EMC_EMAIL'], ENT_COMPAT, 'UTF-8') : '' ).' + &url_renvoi='.urlencode(Tools::getProtocol().htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').$_SERVER['REQUEST_URI']).'">'; + + + $this->_html .= '<form action="'.$_SERVER['REQUEST_URI'].'" method="post" class="form"> + <div style="float: right; width: 440px; height: 165px; border: 1px dashed rgb(102, 102, 102); padding: 8px; margin-left: 12px;margin-top: 11px;">'.$link.' + <h3>'.$this->l('Create Envoimoinscher account:').'</h3> + <p style="text-align:justify">'.$this->l('To create your account on Envoimoinscher, click the image below. You will go to a dedicated personal space where you will find the necessary tools for easy management of your shipments.').'</p> + <img src="'.$this->_path.'/ps_emc.png" alt="" /></a> + </div> + <fieldset style="width:420px;float:left"><legend><img src="'.$this->_path.'logo.gif" alt="" /> '.$this->l('Description').'</legend> + <img style="float:left;margin-right:10px" src="'.$this->_path.'logocarre.png" alt="" /><p style="text-align:justify"><b>'.$this->l('This module allows you to compare carrier offers and online ordering services\' negotiated delivery rates.').'</b></p> + <p style="text-align:justify">'.$this->l('Please enter your Envoimoinscher username below. If you are not a customer Envoimoinscher, you can easily create an account by clicking').$link.' + '.$this->l('here').'.</a></p><br> + <h3 style="text-align:center"><a href="http://www.prestashop.com/download/partner_modules/docs/doc_emc.pdf">'.$this->l('Download Documentation').'</a></h3> + </fieldset> + <div class="clear">&nbsp;</div> + + <fieldset class="width2"><legend><img src="'.$this->_path.'logo.gif" alt="" /> '.$this->l('Settings').'</legend> + <label>'.$this->l('Width').' : </label> + <div class="margin-form"> + <select name="EMC_WIDTH"> + <option value="O">'.$this->l('Choose a feature ...').'</option>'; + foreach($features as $feature) + { + $this->_html .= '<option value="'.(int)($feature['id_feature']).'" '.((int)(Tools::getValue('EMC_WIDTH', (int)(Configuration::get('EMC_WIDTH')))) == (int)($feature['id_feature']) ? ' selected="selected" ' : '').' > + '.htmlspecialchars($feature['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>' . $this->l('Choose width in the list') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Height').' : </label> + <div class="margin-form"> + <select name="EMC_HEIGHT"> + <option value="O">'.$this->l('Choose a feature ...').'</option>'; + + foreach($features as $feature) + { + $this->_html .= '<option value="'.(int)($feature['id_feature']).'" '.((int)(Tools::getValue('EMC_HEIGHT', (int)(Configuration::get('EMC_HEIGHT')))) == (int)($feature['id_feature']) ? ' selected="selected" ' : '').' > + '.htmlspecialchars($feature['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>' . $this->l('Choose Height in the list') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Depth').' : </label> + <div class="margin-form"> + <select name="EMC_DEPTH"> + <option value="O">'.$this->l('Choose a feature ...').'</option>'; + foreach($features as $feature) + { + $this->_html .= '<option value="'.(int)($feature['id_feature']).'" '.((int)(Tools::getValue('EMC_DEPTH', (int)(Configuration::get('EMC_DEPTH')))) == (int)($feature['id_feature']) ? ' selected="selected" ' : '').' > + '.htmlspecialchars($feature['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>' . $this->l('Choose Depth in the list') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label for="id_order_state">'.$this->l('Packaging').' :</label> + <div class="margin-form"> + <select name="EMC_PACKAGING_DEFAULT"> + <option value="">'.$this->l('Choose packaging...').'</option>'; + foreach($this->packaging as $package => $value) + $this->_html .= '<option '.(Tools::getValue('EMC_PACKAGING_DEFAULT', Configuration::get('EMC_PACKAGING_DEFAULT')) == $value ? ' selected="selected" ' : '').' value="'.$value.'">'.htmlspecialchars($package, ENT_COMPAT, 'UTF-8').'</option>'; + $this->_html .= '</select> + <p>'. $this->l('Choose the default packaging.').'</p> + </div> + <div class="clear">&nbsp;</div> + + <label for="id_order_state">'.$this->l('Nature of content').' :</label> + <div class="margin-form">'. + self::selectNature(Tools::getValue('type_objet', Configuration::get('EMC_CONTENT'))). + '<p>'. $this->l('Choose the default nature of content.').'</p> + </div> + <div class="clear">&nbsp;</div> + + <label for="id_order_state">'.$this->l('Order state to export').' :</label> + <div class="margin-form"> + <select name="EMC_ORDER_STATE"> + <option value="O">'.$this->l('Choose a state ...').'</option>'; + foreach ( $order_states as $state) + { + $this->_html .= '<option value="'.(int)($state['id_order_state']). '" style="background-color:' .$state['color'].';"'; + if (Tools::getValue('EMC_ORDER_STATE', Configuration::get('EMC_ORDER_STATE')) == (int)($state['id_order_state'])) + $this->_html .= ' selected="selected"'; + $this->_html .= '>'.htmlspecialchars($state['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>'. $this->l('Choose the order state to export to Envoi Moins Cher.').'</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Carrier').' : </label> + <div class="margin-form"> + <select name="EMC_CARRIER"> + <option value="O">'.$this->l('Choose a carrier ...').'</option>'; + foreach($carriers as $carrier) + $this->_html .= '<option value="'.(int)($carrier['id_carrier']).'" '.(Tools::getValue('EMC_CARRIER', Configuration::get('EMC_CARRIER')) == $carrier['id_carrier'] ? ' selected="selected" ' : '').' > + '.htmlspecialchars($carrier['name'], ENT_COMPAT, 'UTF-8').'</option>'; + $this->_html .= '</select> + <sup> *</sup> + <p>' . $this->l('Choose a carrier in the list') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label for="id_order_state">'.$this->l('Order state "Order past"').' :</label> + <div class="margin-form"> + <select name="EMC_ORDER_PAST_STATE"> + <option value="O">'.$this->l('Choose a state ...').'</option>'; + foreach ( $order_states as $state) + { + $this->_html .= '<option value="'.(int)($state['id_order_state']).'" style="background-color:'.$state['color'] . ';"'; + if (Tools::getValue('EMC_ORDER_PAST_STATE', Configuration::get('EMC_ORDER_PAST_STATE')) == $state['id_order_state'] ) $this->_html .= ' selected="selected"'; + $this->_html .= '>'.htmlspecialchars($state['name'], ENT_COMPAT, 'UTF-8'). '</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>'. $this->l('Choose the order state past.').'</p> + </div> + <div class="clear">&nbsp;</div> + + <label for="id_order_state">'.$this->l('Order state send').' :</label> + <div class="margin-form"> + <select name="EMC_SEND_STATE"> + <option value="O">'.$this->l('Choose a state ...').'</option>'; + foreach ($order_states as $state) + { + $this->_html .= '<option value="' . $state['id_order_state'] . '" style="background-color:' . $state['color'] . ';"'; + if (Tools::getValue('EMC_SEND_STATE', Configuration::get('EMC_SEND_STATE')) == $state['id_order_state']) $this->_html .= ' selected="selected"'; + $this->_html .= '>'.htmlspecialchars($state['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>'. $this->l('Choose the order state send.').'</p> + </div> + <div class="clear">&nbsp;</div>'; + + //objet livré (pas géré actuellement) + $this->_html .= '<label for="id_order_state">'.$this->l('Order state delivered').' :</label> + <div class="margin-form"> + <select name="EMC_DELIVERY_STATE"> + <option value="O">'.$this->l('Choose a state ...').'</option>'; + foreach ($order_states as $state) + { + $this->_html .= '<option value="'.(int)($state['id_order_state']).'" style="background-color:'.$state['color'].';"'; + if (Tools::getValue('EMC_DELIVERY_STATE', (int)(Configuration::get('EMC_DELIVERY_STATE'))) == (int)($state['id_order_state'])) $this->_html .= ' selected="selected"'; + $this->_html .= '>'.htmlspecialchars($state['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> + <sup> *</sup> + <p>'. $this->l('Choose the order state delivered.').'</p> + </div> + <div class="clear">&nbsp;</div> '; + + $this->_html .= ' + <label>'.$this->l('E-mail').' : </label> + <div class="margin-form"> + <input type="radio" name="EMC_EMAILS" id="active_on" value="7" '.(Tools::getValue('EMC_EMAILS', Configuration::get('EMC_EMAILS')) ? 'checked="checked" ' : '').'/> + <label class="t" for="active_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label> + <input type="radio" name="EMC_EMAILS" id="active_off" value="0" '.(!Tools::getValue('EMC_EMAILS', Configuration::get('EMC_EMAILS')) ? 'checked="checked" ' : '').'/> + <label class="t" for="active_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label> + <p>'.$this->l('Enables or disables sending mail from EMC');//.', '.$this->l('unless it informs the recipient that it is sent by default.').'</p> + $this->_html .= '</div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('EMC Login').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_LOGIN" value="'.htmlspecialchars(Tools::getValue('EMC_LOGIN', Configuration::get('EMC_LOGIN')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set your EMC login') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <p>----------------------------------------------------------------------------------------</p> + <h2>'.$this->l('Sender Information').' : </h2> + <label>'.$this->l('Gender').' : </label> + <div class="margin-form"> + <input name="EMC_GENDER" id="id_gender1" value="1" '.(Tools::getValue('EMC_GENDER', Configuration::get('EMC_GENDER')) == 1 ? 'checked="checked"' : '').' type="radio"> M. + <input name="EMC_GENDER" id="id_gender2" value="2" '.(Tools::getValue('EMC_GENDER', Configuration::get('EMC_GENDER')) == 2 ? 'checked="checked"' : '').' type="radio"> Mme + <p>' . $this->l('Select gender of sender') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Last name').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_LAST_NAME" value="'.htmlspecialchars(Tools::getValue('EMC_LAST_NAME', Configuration::get('EMC_LAST_NAME')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the Last Name of sender') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('First name').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_FIRST_NAME" value="'.htmlspecialchars(Tools::getValue('EMC_FIRST_NAME', Configuration::get('EMC_FIRST_NAME')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the First name of sender') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Address').' : </label> + <div class="margin-form"> + <input size="40" type="text" name="EMC_ADDRESS" value="'.htmlspecialchars(Tools::getValue('EMC_ADDRESS', Configuration::get('EMC_ADDRESS')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the Address of sender') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Zip code').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_ZIP_CODE" value="'.htmlspecialchars(Tools::getValue('EMC_ZIP_CODE', Configuration::get('EMC_ZIP_CODE')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the zip code of sender') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('City').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_CITY" value="'.htmlspecialchars(Tools::getValue('EMC_CITY', Configuration::get('EMC_CITY')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the city of sender') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Country').' : </label> + <div class="margin-form"> + <select name="EMC_COUNTRY"> + <option value="">'.$this->l('Choose a country ...').'</option>'; + foreach ($countries as $country) + { + $this->_html .= '<option value="'.htmlspecialchars($country['iso_code'], ENT_COMPAT, 'UTF-8').'" '; + if (Tools::getValue('EMC_COUNTRY',Configuration::get('EMC_COUNTRY')) == $country['iso_code'] ) $this->_html .= ' selected="selected"'; + $this->_html .= '>'.htmlspecialchars($country['name'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $this->_html .= '</select> <sup> *</sup> + <p>' . $this->l('Select the country of sender in the list') . '</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Phone').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_PHONE" value="'.htmlspecialchars(Tools::getValue('EMC_PHONE', Configuration::get('EMC_PHONE')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the Phone of sender').'</p> + </div> + <div class="clear">&nbsp;</div> + + <label>'.$this->l('Email').' : </label> + <div class="margin-form"> + <input type="text" name="EMC_EMAIL" value="'.htmlspecialchars(Tools::getValue('EMC_EMAIL', Configuration::get('EMC_EMAIL')), ENT_COMPAT, 'UTF-8').'"> + <sup> *</sup> + <p>' . $this->l('Set the e-mail of sender').'</p> + </div> + <div class="clear">&nbsp;</div> + + <div class="margin-form"> + <input type="submit" value="'.$this->l('Save').'" name="submitSave" class="button" style="margin:10px 0px 0px 25px;" /> + </div> + </fieldset></form> + <div class="clear">&nbsp;</div>'; + + } + + private function _postValidation() + { + if (Tools::getValue('EMC_WIDTH') == 0) + $this->_postErrors[] = $this->l('Width not specified'); + if (Tools::getValue('EMC_HEIGHT') == 0) + $this->_postErrors[] = $this->l('Height not specified'); + if (Tools::getValue('EMC_DEPTH') == 0) + $this->_postErrors[] = $this->l('Depth not specified'); + if (Tools::getValue('EMC_ORDER_STATE') == 0) + $this->_postErrors[] = $this->l('Order state not specified'); + if (Tools::getValue('EMC_CARRIER') == 0) + $this->_postErrors[] = $this->l('Carrier not specified'); + if (Tools::getValue('EMC_ORDER_PAST_STATE') == 0) + $this->_postErrors[] = $this->l('Order state "order past" not specified'); + if (Tools::getValue('EMC_SEND_STATE') == 0) + $this->_postErrors[] = $this->l('Order state send not specified'); + if (Tools::getValue('EMC_DELIVERY_STATE') == 0) + $this->_postErrors[] = $this->l('Order state delivery not specified'); + if (Tools::getValue('EMC_LAST_NAME') == '') + $this->_postErrors[] = $this->l('Last name not specified'); + if (Tools::getValue('EMC_FIRST_NAME') == '') + $this->_postErrors[] = $this->l('First name not specified'); + if (Tools::getValue('EMC_ADDRESS') == '') + $this->_postErrors[] = $this->l('Address not specified'); + if (Tools::getValue('EMC_ZIP_CODE') == '') + $this->_postErrors[] = $this->l('Zip Code not specified'); + if (Tools::getValue('EMC_CITY') == '') + $this->_postErrors[] = $this->l('City not specified'); + if (Tools::getValue('EMC_COUNTRY') == '') + $this->_postErrors[] = $this->l('Country not specified'); + if (Tools::getValue('EMC_PHONE') == '') + $this->_postErrors[] = $this->l('Phone not specified'); + if (Tools::getValue('EMC_EMAIL') == '') + $this->_postErrors[] = $this->l('E-mail not specified'); + if (Tools::getValue('EMC_LOGIN') == '') + $this->_postErrors[] = $this->l('Login not specified'); + } + + private function _postProcess() + { + if (Configuration::updateValue('EMC_WIDTH', (int)(Tools::getValue('EMC_WIDTH'))) AND Configuration::updateValue('EMC_HEIGHT', (int)(Tools::getValue('EMC_HEIGHT'))) AND + Configuration::updateValue('EMC_DEPTH', (int)(Tools::getValue('EMC_DEPTH'))) AND Configuration::updateValue('EMC_ORDER_STATE', (int)(Tools::getValue('EMC_ORDER_STATE'))) AND + Configuration::updateValue('EMC_CARRIER', (int)(Tools::getValue('EMC_CARRIER'))) AND Configuration::updateValue('EMC_PACKAGING_DEFAULT', Tools::getValue('EMC_PACKAGING_DEFAULT')) + AND Configuration::updateValue('EMC_GENDER', Tools::getValue('EMC_GENDER')) AND Configuration::updateValue('EMC_LAST_NAME', Tools::getValue('EMC_LAST_NAME')) + AND Configuration::updateValue('EMC_FIRST_NAME', Tools::getValue('EMC_FIRST_NAME')) AND Configuration::updateValue('EMC_ADDRESS', Tools::getValue('EMC_ADDRESS')) + AND Configuration::updateValue('EMC_ZIP_CODE', Tools::getValue('EMC_ZIP_CODE')) AND Configuration::updateValue('EMC_CITY', Tools::getValue('EMC_CITY')) + AND Configuration::updateValue('EMC_COUNTRY', Tools::getValue('EMC_COUNTRY')) AND Configuration::updateValue('EMC_PHONE', Tools::getValue('EMC_PHONE')) + AND Configuration::updateValue('EMC_EMAIL', Tools::getValue('EMC_EMAIL')) AND Configuration::updateValue('EMC_ORDER_PAST_STATE', Tools::getValue('EMC_ORDER_PAST_STATE')) + AND Configuration::updateValue('EMC_SEND_STATE', Tools::getValue('EMC_SEND_STATE')) AND Configuration::updateValue('EMC_EMAILS', Tools::getValue('EMC_EMAILS')) + AND Configuration::updateValue('EMC_LOGIN', Tools::getValue('EMC_LOGIN')) AND Configuration::updateValue('EMC_CONTENT', Tools::getValue('type_objet_')) + AND Configuration::updateValue('EMC_DELIVERY_STATE', Tools::getValue('EMC_DELIVERY_STATE'))) + { + $dataSync = (($emc_login = Configuration::get('EMC_LOGIN')) + ? '<img src="http://www.prestashop.com/modules/envoimoinscher.png?ps_id='.urlencode($emc_login).'" style="float:right" />' : ''); + $this->_html .= $this->displayConfirmation($this->l('Configuration updated').$dataSync); + } + else + $this->_html .= '<div class="alert error"><img src="' . _PS_IMG_ . 'admin/forbbiden.gif" alt="nok" />&nbsp;'.$this->l('Settings failed').'</div>'; + } + + static function selectNature($selected = '', $id = '') + { + $select = '<select name="type_objet_'.$id.'"> + <option value="ns">Contenu non spécifié</option>'; + $groups = array(1 => 'Documents', 2 => 'Alimentation et matières périssables', 3 => 'Produits', 4 => 'Habillement et accessoires', 5 => 'Appareils et matériels', 6 => 'Mobilier et décoration', + 7 => 'Effets personnels, cadeaux'); + $select .= '<optgroup label="'.htmlspecialchars($groups[1], ENT_COMPAT, 'UTF-8').'">'; + $optgroup = 1; + $results = Db::getInstance()->executeS('SELECT * FROM '._DB_PREFIX_.'envoimoinscher_contenu order by id'); + foreach($results as $result) + { + if ($result['id'][0] != $optgroup) + { + $optgroup ++; + $select .= '</optgroup><optgroup label="'.htmlspecialchars($groups[$optgroup], ENT_COMPAT, 'UTF-8').'">'; + } + $select .= '<option '.($selected == $result['id'] ? 'selected="selected"' : '').' value="'.(int)($result['id']).'" >'.htmlspecialchars($result['libelle'], ENT_COMPAT, 'UTF-8').'</option>'; + } + $select .= '</select>'; + return $select; + } + + public function hookAdminOrder($params) + { + $order = new Order($params['id_order']); + if ($order->id_carrier == Configuration::get('EMC_CARRIER')) + { + $return = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'envoimoinscher WHERE id_order = \''.(int)($order->id).'\' LIMIT 1'); + if (isset($return[0]['shipping_number'])) + { + $html = '<br><br><fieldset style="width: 400px;"><legend><img src="'.$this->_path.'logo.gif" alt="" /> '.$this->l('Envoimoinscher').'</legend>'; + $html .= '<b>'.$this->l('Delivery Information').' : </b><br> + '.(isset($return[0]['shipping_number']) ? '<p>--> <a href="http://www.envoimoinscher.com/suivre_vos_envois.html?reference='.$return[0]['shipping_number'].'" style="text-decoration:underline"> + '.$this->l('Follow shipping').'</a>' : '<p style="color:red">'.$this->l('No shipping number')).'</p>' + .(isset($return[0]['shipping_number']) ?' <p>--> <a href="http://www.envoimoinscher.com/documents?type=bordereau&envoi='.$return[0]['shipping_number'].'" style="text-decoration:underline"> + '.$this->l('Print delivery slips').'</a>' : '<p style="color:red">'.$this->l('No delivery slips number')).'</p> + </fieldset>'; + return $html; + } + } + } + + public function lang($str) + { + switch($str) + { + case 'No order to export': + return $this->l('No order to export'); + break; + case 'Please configure this module in order': + return $this->l('Please configure this module in order'); + break; + case 'Change configuration': + return $this->l('Change configuration'); + break; + case 'ID': + return $this->l('ID'); + break; + case 'Name': + return $this->l('Name'); + break; + case 'Total Cost': + return $this->l('Total Cost'); + break; + case 'Total shipment': + return $this->l('Total shipment'); + break; + case 'Date': + return $this->l('Date'); + break; + case 'Packaging': + return $this->l('Packaging'); + break; + case 'Nature of contents': + return $this->l('Nature of contents'); + break; + case 'Detail': + return $this->l('Detail'); + break; + case 'View': + return $this->l('View'); + break; + case 'Send': + return $this->l('Send'); + break; + case 'List of orders to export': + return $this->l('List of orders to export'); + break; + } + } +} + diff --git a/modules/envoimoinscher/es.php b/modules/envoimoinscher/es.php new file mode 100644 index 000000000..4baf3548a --- /dev/null +++ b/modules/envoimoinscher/es.php @@ -0,0 +1,117 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e0b8a2c577580cb773bda0486acc4bf8'] = 'Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bbd983fbdc5928ce36d6edce53639718'] = 'Encuentre el mejor precio para su envío. Compare y pida ofertas a transportistas, a precios negociados. '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cc89336eed19f4c3bef8ae484eb43109'] = '\'Ancho\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fab811cb477e7794389f16624ac9aff9'] = '\'Alto\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7854da902d5f2ad746fe1b6f950da08e'] = '\'Profundo\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_63a0a494ef3c3c22829660ef6081dce4'] = '\'Estados\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_786b7b25dcd85d7e972a377f56facb5a'] = '\'Transportista\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1a3ade81b4ddac3ff0fe9f98f93ad843'] = 'Estado pedido efectuado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_070d4ccfe53bdbc791cbd6119b872f34'] = 'Estado pedido enviada'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c98d7be3b0acc53f7d2142cc3a3ab444'] = 'Estado pedido entragado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4d470fde8487e755a50e9235e3dc13ab'] = 'debe estar configurado para utilizar este módulo correctamente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9d766be2c89b5af0010ac0c11dcddae7'] = 'Por favor, copie a mano'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6357d3551190ec7e79371a8570121d3a'] = 'Hay'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ce81305b7edb043d0a7a5c75cab17d0'] = 'Hay'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_07213a0161f52846ab198be103b5ab43'] = 'Errores'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cb5e100e5a9a3e7f6d1fd97512215282'] = 'Error'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_413c9cfb1b07fabd2f4e2873e6b92da1'] = 'Crear su cuenta Enviemoinscher:'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8fc0ba19a15eeb50ab4ad8db449b0c74'] = 'Para crear su cuenta Envoimoinscher pulse en la imagen? Accederá a un espacio personal en el que encontrará todas las herramientas que permiten una gestión sencilla y rápida de sus envíos. '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descripción'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_82b213c84c7cf648a3cc9e718bb0f1c5'] = 'Este módulo le permite comparar ofertas de transporte y tarifas de entrega negociadas para servicios de pedidos en línea . '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b843f182d32b5571e48879444311c38b'] = 'Debe introducir su nombre de usuario Envoimoinscher más abajo. Si todavía no es cliente de Envoimoinscher, puede crear fácilmente una cuenta haciendo clic'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c92285fa6d3e827b198d120ea3ac674'] = 'aquí'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d64b03d7cc357f2ac9c63f8c88b49a0'] = 'Bajar la documentación'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4f70727dc34561dfde1a3c529b6205c'] = 'Confuguración'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_32954654ac8fe66a1d09be19001de2d4'] = 'Ancho'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_af7bb0f5eddd2287cf3f6b880d189e19'] = 'Elegir una característica...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_31f12b07ff0701df3b6000412952f9c7'] = 'Elegir la característica \"ancho\" en la lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eec6c4bdbd339edf8cbea68becb85244'] = 'Alto'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_97fd502c6a75bfb727fbb5a93d3bc60b'] = 'Elegir la característica \"alto\" en la lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_675056ad1441b6375b2c5abd48c27ef1'] = 'Profundo'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ccccb5efc77dfc62afb2c5ad4223916d'] = 'Elegir la característica \"profundo\" en la lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a669003ea35aa39ca280b83bd259a032'] = 'Embalaje'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6106b8b4d1ecffdfa8357956183ec519'] = 'Elegir un embalaje...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2b4c2d19b9293e812fa18765a407be4d'] = 'Elegir un embalaje por defecto'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f0c28b9363b60ed0a4579291ca510544'] = 'Naturaleza delo contenido'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4c0dac58ce6ddb2fa8776d32b1571d4'] = 'Elegir la naturaleza de los contenidos de forma predeterminada.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e74b7618bb3f99b8a7c00ef765c727eb'] = 'Estado de pedidos a enviar'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_509d517463244dcd1ec09c4c5fa266ac'] = 'Elegir un estado de pedido...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bb4b4f2503c57254aaed1f1a07bb71da'] = 'Elegir un estado de pedido en la lista a exportar hacia Enviemoinscher.com'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_914419aa32f04011357d3b604a86d7eb'] = 'Transportista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6f2a31a74727092b14a9f25fa0761f4'] = 'Elegir un transportista...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a22d9830367fdf0f6b2601e7484b387'] = 'Elegir un transportista en la lista a exportar hacia Enviemoinscher.com'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2aad255fde4750af3f559d078e1cb420'] = 'Estado pedido realizado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd77298d81e440f5379f48dccf993a8b'] = 'Elegir un estado de pedido en la lista \"Pedido realizado\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8532ff05a8576bdc04f8a9b8b1dbbfbc'] = 'Estado de pedido enviado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5af6d17d6837ce556286d019e06e4e0'] = 'Elegir un estado de pedido en la lista \"Pedido enviado\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d2392c7501c4041d990cc0d372cde50a'] = 'Estado de pedido entregado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b06087cef2468e82e0e07499fdba5c30'] = 'Elegir un estado de pedido en la lista \"Pedido entregado\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1e884e3078d9978e216a027ecd57fb34'] = 'Correo electrónico'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9e839460f2871eb777da1b74f3fab03e'] = 'Activar o desactivar el envío de emails de parte de Enviemoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a995d9073f999ae5713f6994092b57e'] = 'excepto la notificación al destinatario que es enviada por defecto'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7a16e0022af67a71b8d1521f746f41b3'] = 'Login Enviemoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6ef6eed8e2c2d13d6823cbff8f139bad'] = 'Introduzca su login Enviemoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a861c864b470344da673354f996ce0a7'] = 'Información del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_019ec3132cdf8ee0f2e2a75cf5d3e459'] = 'Sexo'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5f33341287efce675cacf0b3ed818e70'] = 'Elegir el sexo del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d3f5eff9c40ee315d452392bed5309b'] = 'Apellido'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8cf6db4af977baa86b7691da80601bd0'] = 'Introducir el apellido del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20db0bfeecd8fe60533206a2b5e9891a'] = 'Nombre'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49a768ce02314f39d386a66b77ae1858'] = 'Introducir el nombre del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd7bf230fde8d4836917806aff6a6b27'] = 'Dirección'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a56f1882e859d6ce5b0fbc96c544100'] = 'Introducir la dirección del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_642d3ba5db8b57e006584b544e490ec7'] = 'Código postal'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_16e65be7ad7680a7148b8ddf0b5b4171'] = 'Introducir el código del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_57d056ed0984166336b7879c2af3657f'] = 'Ciudad'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e73af174484a98a10a852ab5bdb701bf'] = 'Introducir la ciudad del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_59716c97497eb9694541f7c3d37b1a4d'] = 'País'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_255529f7845194a47b4c2e28374cdb1f'] = 'Elegir un país'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c820bc5f65e6258a648c3621b7b761e'] = 'Introducir el país del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bcc254b55c4a1babdf1dcb82c207506b'] = 'Teléfono'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6770d2600f6b45aa0b18dd9a6e39b2f8'] = 'Introducir el teléfono del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43cdf4833105e72eb951833a030ad4d5'] = 'Introducir el email del remitente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1fa598730b02d78aa07d07337c81c720'] = 'Falta información \"alto\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c5ac8560e3b92c7941286fa8c2b3a1ed'] = 'Falta información \"ancho\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_0eed429f3ae1e71de73b94e13f786893'] = 'Falta información \"profundo\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5d50fc169bba225de3df710ff98188c6'] = 'Falta información \"estado de pedido\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_340ffdfdc019d0b001a4753b57aa398a'] = 'Falta información \"transportista\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ecdf47576d5d0d024f30199900c1761'] = 'Falta información estado \"pedido realizado\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6a9265e0dcf5d7a7f331055b9b93609'] = 'Falta información estado \"pedido enviado\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9f3440922590dae1ebc28c40555c6203'] = 'Falta información estado \"pedido entregado\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43b89b46dcf9440d5f852548ac5341a3'] = 'Falta apellido'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9a6dfbad73e6a8a852d4b1a266e941d2'] = 'Falta nombre'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fdda31acf2551d1edde59d64144975b8'] = 'Falta dirección'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_01fc0f14742ba00423886a14e31964de'] = 'Falta código postal'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2814eaaff876f0a3f29d87b23ceaa041'] = 'Falta ciudad'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ae21c3189ecc1e32d10e8f3b264af190'] = 'Falta país'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_829d5874145d3477d778cdff96671448'] = 'Falta teléfono'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a3b23591400c94a94583a94c0ab1f19f'] = 'Falta email'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_18f54b7a823f3349d841804a9fbc5aa3'] = 'Login Enviemoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración actualizada'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9284bff13acffdd879ef4ac7fca5234'] = 'Fallaron los ajustes'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1b67f24ea45fdf2e11ad8f6e777e8c8b'] = 'Información de entrega'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fad2b83dc128dfb793fa8ee944dd9931'] = 'Seguimiento del paquete'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d668e43f1d8b0584ed4f896de031d921'] = 'No hay número de seguimiento'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bee4b55285d16e5fe85fc3474e343c51'] = 'Imprimir el albarán de expedición'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_10f0b7273755ee4117c1517010e18c23'] = 'No hay número de expedición'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9ab3e83b1071d09ca62e4cd258686f6b'] = 'Ningún pedido para exportar'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8c193493d8e4a97dc6da02d9809be530'] = 'Por favor, configure este módulo '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2345e28c9b93f368968be4781ed70f5c'] = 'Modificación de la configuración'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_50e91dab2a063bc8c1dbc383b0c8e71c'] = 'Coste Total'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5e8ff31378107b80ae8a9e7cd93eb1bc'] = 'total del envío'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_44749712dbec183e983dcd78a7736c41'] = 'Fecha'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_403ddddf1f3eecc1a2566b3d81e12993'] = 'Naturaleza del contenido'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a254c25adc7d10d7e9c4889484f875a5'] = 'Detalle'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4351cfebe4b61d8aa5efa1d020710005'] = 'Ver'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_94966d90747b97d1f0f206c98a8b1ac3'] = 'Enviar'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eae21050d83c239d047c9eb0d3bc930e'] = 'Lista de pedidos para exportar'; diff --git a/modules/envoimoinscher/fr.php b/modules/envoimoinscher/fr.php new file mode 100755 index 000000000..67b76b404 --- /dev/null +++ b/modules/envoimoinscher/fr.php @@ -0,0 +1,117 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e0b8a2c577580cb773bda0486acc4bf8'] = 'Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bbd983fbdc5928ce36d6edce53639718'] = 'Trouvez le meilleur prix pour votre envoi. Comparez et commandez les offres des transporteurs, à des tarifs négociés.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cc89336eed19f4c3bef8ae484eb43109'] = '\'Largeur\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fab811cb477e7794389f16624ac9aff9'] = '\'Hauteur\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7854da902d5f2ad746fe1b6f950da08e'] = '\'Profondeur\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_63a0a494ef3c3c22829660ef6081dce4'] = '\'Statuts\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_786b7b25dcd85d7e972a377f56facb5a'] = '\'Transporteur\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1a3ade81b4ddac3ff0fe9f98f93ad843'] = 'Statut commande passée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_070d4ccfe53bdbc791cbd6119b872f34'] = 'Statut commande envoyée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c98d7be3b0acc53f7d2142cc3a3ab444'] = 'Statut commande livrée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4d470fde8487e755a50e9235e3dc13ab'] = 'doit être configuré pour utiliser ce module correctement'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9d766be2c89b5af0010ac0c11dcddae7'] = 'S\'il vous plaît copier manuellement'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6357d3551190ec7e79371a8570121d3a'] = 'Il y a'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ce81305b7edb043d0a7a5c75cab17d0'] = 'Il y a'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_07213a0161f52846ab198be103b5ab43'] = 'Erreurs'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cb5e100e5a9a3e7f6d1fd97512215282'] = 'Erreur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_413c9cfb1b07fabd2f4e2873e6b92da1'] = 'Créer son compte Envoimoinscher :'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8fc0ba19a15eeb50ab4ad8db449b0c74'] = 'Pour créer votre compte Envoimoinscher cliquez sur l\'image ci-dessous. Vous allez accéder à un espace personnel dédié sur lequel vous retrouverez tous les outils permettant une gestion facile et rapide de vos envois.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Description'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_82b213c84c7cf648a3cc9e718bb0f1c5'] = 'Ce module vous permet de comparer les offres des transporteurs et de commander en ligne des prestations de livraison à des tarifs négociés.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b843f182d32b5571e48879444311c38b'] = 'Vous devrez renseigner votre identifiant Envoimoinscher ci-dessous. Si vous n\'êtes pas encore client Envoimoinscher, vous pouvez créer un compte très facilement en cliquant'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c92285fa6d3e827b198d120ea3ac674'] = 'ici'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d64b03d7cc357f2ac9c63f8c88b49a0'] = 'Télécharger la documentation'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_32954654ac8fe66a1d09be19001de2d4'] = 'Largeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_af7bb0f5eddd2287cf3f6b880d189e19'] = 'Choisir une caractéristique ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_31f12b07ff0701df3b6000412952f9c7'] = 'Choisir la caractéristique \"largeur\" dans la liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eec6c4bdbd339edf8cbea68becb85244'] = 'Hauteur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_97fd502c6a75bfb727fbb5a93d3bc60b'] = 'Choisir la caractéristique \"hauteur\" dans la liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_675056ad1441b6375b2c5abd48c27ef1'] = 'Profondeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ccccb5efc77dfc62afb2c5ad4223916d'] = 'Choisir la caractéristique \"profondeur\" dans la liste'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a669003ea35aa39ca280b83bd259a032'] = 'Conditionnement'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6106b8b4d1ecffdfa8357956183ec519'] = 'Choisir un conditionnement ... '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2b4c2d19b9293e812fa18765a407be4d'] = 'Choisir un conditionnement par défaut'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f0c28b9363b60ed0a4579291ca510544'] = 'Contenu'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4c0dac58ce6ddb2fa8776d32b1571d4'] = 'Choisir le contenu par défaut'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e74b7618bb3f99b8a7c00ef765c727eb'] = 'Statut de commandes à envoyer'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_509d517463244dcd1ec09c4c5fa266ac'] = 'Choisir un statut de commande ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bb4b4f2503c57254aaed1f1a07bb71da'] = 'Choisir un statut de commande dans la liste à exporter vers Envoimoinscher.com'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_914419aa32f04011357d3b604a86d7eb'] = 'Transporteur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6f2a31a74727092b14a9f25fa0761f4'] = 'Choisir un transporteur ... '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a22d9830367fdf0f6b2601e7484b387'] = 'Choisir un transporteur dans la liste à exporter vers Envoimoinscher.com'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2aad255fde4750af3f559d078e1cb420'] = 'Statut commande passée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd77298d81e440f5379f48dccf993a8b'] = 'Choisir un statut de commande dans la liste \"Commande passée\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8532ff05a8576bdc04f8a9b8b1dbbfbc'] = 'Statut commande envoyée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5af6d17d6837ce556286d019e06e4e0'] = 'Choisir un statut de commande dans la liste \"Commande envoyée\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d2392c7501c4041d990cc0d372cde50a'] = 'Statut commande livrée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b06087cef2468e82e0e07499fdba5c30'] = 'Choisir un statut de commande dans la liste \"Commande livrée\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1e884e3078d9978e216a027ecd57fb34'] = 'Mails'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9e839460f2871eb777da1b74f3fab03e'] = 'Active ou désactive l\'envoi de mails de la part de Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a995d9073f999ae5713f6994092b57e'] = 'sauf la notification au destinataire qui est envoyée par défaut'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7a16e0022af67a71b8d1521f746f41b3'] = 'Identifiant Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6ef6eed8e2c2d13d6823cbff8f139bad'] = 'Saisir votre Identifiant Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a861c864b470344da673354f996ce0a7'] = 'Informations sur l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_019ec3132cdf8ee0f2e2a75cf5d3e459'] = 'Sexe'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5f33341287efce675cacf0b3ed818e70'] = 'Choisir le sexe de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d3f5eff9c40ee315d452392bed5309b'] = 'Nom de famille'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8cf6db4af977baa86b7691da80601bd0'] = 'Saisir le nom de famille de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20db0bfeecd8fe60533206a2b5e9891a'] = 'Prénom'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49a768ce02314f39d386a66b77ae1858'] = 'Saisir le prénom de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a56f1882e859d6ce5b0fbc96c544100'] = 'Saisir l\'adresse de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_642d3ba5db8b57e006584b544e490ec7'] = 'Code postal'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_16e65be7ad7680a7148b8ddf0b5b4171'] = 'Saisir le code postal de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_57d056ed0984166336b7879c2af3657f'] = 'Ville'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e73af174484a98a10a852ab5bdb701bf'] = 'Saisir la ville de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_59716c97497eb9694541f7c3d37b1a4d'] = 'Pays'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_255529f7845194a47b4c2e28374cdb1f'] = 'Choisir un pays'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c820bc5f65e6258a648c3621b7b761e'] = 'Saisir le pays de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bcc254b55c4a1babdf1dcb82c207506b'] = 'Téléphone'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6770d2600f6b45aa0b18dd9a6e39b2f8'] = 'Saisir le téléphone de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43cdf4833105e72eb951833a030ad4d5'] = 'Saisir l\'email de l\'expéditeur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1fa598730b02d78aa07d07337c81c720'] = 'Largeur non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c5ac8560e3b92c7941286fa8c2b3a1ed'] = 'Hauteur non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_0eed429f3ae1e71de73b94e13f786893'] = 'Profondeur non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5d50fc169bba225de3df710ff98188c6'] = 'Statut de commande non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_340ffdfdc019d0b001a4753b57aa398a'] = 'Transporteur non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ecdf47576d5d0d024f30199900c1761'] = 'Statut \"commande passée\" non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6a9265e0dcf5d7a7f331055b9b93609'] = 'Statut \"commande envoyée\" non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9f3440922590dae1ebc28c40555c6203'] = 'Statut \"commande livrée\" non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43b89b46dcf9440d5f852548ac5341a3'] = 'Nom de famille non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9a6dfbad73e6a8a852d4b1a266e941d2'] = 'Prénom non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fdda31acf2551d1edde59d64144975b8'] = 'Adresse non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_01fc0f14742ba00423886a14e31964de'] = 'Code postal non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2814eaaff876f0a3f29d87b23ceaa041'] = 'Ville non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ae21c3189ecc1e32d10e8f3b264af190'] = 'Pays non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_829d5874145d3477d778cdff96671448'] = 'Téléphone non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a3b23591400c94a94583a94c0ab1f19f'] = 'Email non renseignée'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_18f54b7a823f3349d841804a9fbc5aa3'] = 'Login Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration mise à jour'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9284bff13acffdd879ef4ac7fca5234'] = 'Configuration échoué'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1b67f24ea45fdf2e11ad8f6e777e8c8b'] = 'Informations de transporteur'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fad2b83dc128dfb793fa8ee944dd9931'] = 'Suivre le colis'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d668e43f1d8b0584ed4f896de031d921'] = 'Pas de numéro de suivi'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bee4b55285d16e5fe85fc3474e343c51'] = 'Imprimer le bordereau d\'expédition'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_10f0b7273755ee4117c1517010e18c23'] = 'Pas de numéro d\'expédition'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9ab3e83b1071d09ca62e4cd258686f6b'] = 'Aucune commande pour l\'export'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8c193493d8e4a97dc6da02d9809be530'] = 'Merci de configurer ce module'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2345e28c9b93f368968be4781ed70f5c'] = 'Modification de la configuration'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_50e91dab2a063bc8c1dbc383b0c8e71c'] = 'Coût total'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5e8ff31378107b80ae8a9e7cd93eb1bc'] = 'Total expédition '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_403ddddf1f3eecc1a2566b3d81e12993'] = 'Nature du contenu'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a254c25adc7d10d7e9c4889484f875a5'] = 'Détails'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_94966d90747b97d1f0f206c98a8b1ac3'] = 'Envoyer'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eae21050d83c239d047c9eb0d3bc930e'] = 'Liste des commandes à exporter'; diff --git a/modules/envoimoinscher/install.sql b/modules/envoimoinscher/install.sql new file mode 100755 index 000000000..e608afdf3 --- /dev/null +++ b/modules/envoimoinscher/install.sql @@ -0,0 +1,84 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_envoimoinscher_contenu` ( + `id` int(6) NOT NULL, + `abrv` varchar(10) character set utf8 NOT NULL, + `libelle` text character set utf8 NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +INSERT INTO `PREFIX_envoimoinscher_contenu` (`id`, `abrv`, `libelle`) VALUES +(50450, 'outi', 'Outillage, outils, bricolage'), +(50430, 'moto', 'Motos, scooters'), +(50420, 'motr', 'Moteurs'), +(50170, 'horl', 'Montres, horlogerie (hors bijoux)'), +(50100, 'med', 'Matériel médical'), +(50395, 'elec', 'Matériel électrique, transfo., câbles'), +(50390, 'labo', 'Matériel de labo, optique, de mesure'), +(50380, 'chff', 'Matériel de chauffage, chaudronnerie'), +(50360, 'musi', 'Instruments de musique et accessoires'), +(50110, 'info', 'Informatique, High tech, téléphonie fixe'), +(50400, 'fbur', 'Fournitures de bureau, papeterie, recharges'), +(50120, 'div', 'Autres appareils et matériels'), +(50350, 'spor', 'Articles de sport (hors vêtement)'), +(50330, 'camp', 'Articles de camping, de pêche'), +(40120, 'usag', 'Vêtements usagés'), +(40110, 'tiss', 'Tissus, vêtements neufs'), +(40130, 'cuir', 'Cuirs, peaux, maroquinerie'), +(40100, 'chau', 'Chaussures'), +(50160, 'bij', 'Bijoux, objets précieux'), +(40150, 'bijf', 'Bijoux fantaisie'), +(40125, 'vest', 'Accessoires vestimentaires, de mode'), +(50190, 'tab', 'Tabac'), +(30200, 'pharm', 'Pharmacie, médicaments'), +(50200, 'parf', 'Parfums'), +(30100, 'cosm', 'Cosmétiques, bien-être'), +(30300, 'chim', 'Chimie, droguerie, produits d''entretien'), +(20105, 'surg', 'Produits surgelés'), +(20103, 'refr', 'Produits réfrigérés'), +(20102, 'frai', 'Produits frais et périssables'), +(20130, 'plant', 'Plantes, fleurs, semences'), +(20100, 'alim', 'Denrées alimentaires non périssables'), +(20110, 'nalc', 'Boissons non alcoolisées'), +(20120, 'alc', 'Boissons alcoolisées'), +(10180, 'radio', 'Radiographies'), +(10210, 'prop', 'Propositions commerciales'), +(10250, 'plan', 'Plans, dessins'), +(10190, 'photo', 'Photographies'), +(10280, 'patr', 'Patrons'), +(10160, 'pass', 'Passeports'), +(10140, 'tech', 'Manuels techniques'), +(10130, 'mag', 'Magazines, revues'), +(10150, 'livr', 'Livres'), +(10240, 'list', 'Listings informatiques'), +(10120, 'journ', 'Journaux'), +(10290, 'etiq', 'Etiquettes, autocollants'), +(10100, 'ssval', 'Documents sans valeur commerciale'), +(10220, 'pub', 'Documents publicitaires'), +(10260, 'impr', 'Documents d''impression'), +(10300, 'apof', 'Documents d''appels d''offres'), +(10200, 'courr', 'Courrier interne d''entreprise'), +(10230, 'rapp', 'Catalogues, rapports annuels'), +(10170, 'bill', 'Billets d''avion'), +(50140, 'auto', 'Pièces de rechange et accessoires (auto)'), +(50150, 'rech', 'Pièces de rechange et accessoires (autres)'), +(50490, 'plom', 'Plomberie, sanitaire, tubes plastiques'), +(50500, 'quin', 'Quincaillerie, robinetterie, serrurerie'), +(50130, 'num', 'Supports numériques, CD, DVD'), +(50113, 'cell', 'Téléphonie mobile et accessoires'), +(50114, 'tvec', 'Téléviseurs, écrans d''ordinateur'), +(50440, 'velo', 'Vélos, cycles sans moteur'), +(60122, 'miro', 'Autres objets d''art et tableaux'), +(60130, 'frag', 'Autres objets fragiles'), +(60129, 'cera', 'Céramique, verres, cristallerie'), +(60110, 'emgr', 'Electroménager '), +(60124, 'lamp', 'Lampes, luminaire'), +(60108, 'moba', 'Mobilier ancien (antiquité)'), +(60100, 'mob', 'Mobilier d''habitation'), +(60102, 'mobb', 'Mobilier de bureau'), +(60105, 'mobn', 'Mobilier démonté sous emballage'), +(60120, 'antiq', 'Objets et tableaux cotés, miroirs, vitres'), +(60112, 'pelc', 'Petit électroménager, petits appareils ménagers'), +(60126, 'tapi', 'Tapis'), +(60128, 'toil', 'Toiles, rideaux, draps'), +(70100, 'baga', 'Bagages, valises, malles'), +(50180, 'cad', 'Cadeaux, cadeaux entreprise'), +(70200, 'carto', 'Cartons de déménagement, effets personnels'); \ No newline at end of file diff --git a/modules/envoimoinscher/it.php b/modules/envoimoinscher/it.php new file mode 100644 index 000000000..6fa6ebc1f --- /dev/null +++ b/modules/envoimoinscher/it.php @@ -0,0 +1,119 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e0b8a2c577580cb773bda0486acc4bf8'] = 'Envoimoinscher'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bbd983fbdc5928ce36d6edce53639718'] = 'Trova la tariffa migliore per la tua spedizione. Confronta e metti in ordine le offerte di corrieri, a tariffe negoziate.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cc89336eed19f4c3bef8ae484eb43109'] = '\'Larghezza\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fab811cb477e7794389f16624ac9aff9'] = '\'Altezza\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7854da902d5f2ad746fe1b6f950da08e'] = '\'Profondità\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_63a0a494ef3c3c22829660ef6081dce4'] = '\'Stato Ordine\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_786b7b25dcd85d7e972a377f56facb5a'] = '\'Corriere\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1a3ade81b4ddac3ff0fe9f98f93ad843'] = '\'Stato ordine passato\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_070d4ccfe53bdbc791cbd6119b872f34'] = '\'Stato ordine Inviato\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c98d7be3b0acc53f7d2142cc3a3ab444'] = '\'Stato ordine consegnato\''; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4d470fde8487e755a50e9235e3dc13ab'] = 'deve essere configurato per utilizzare questo modulo correttamente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9d766be2c89b5af0010ac0c11dcddae7'] = 'Copia manualmente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6357d3551190ec7e79371a8570121d3a'] = 'Ci sono'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ce81305b7edb043d0a7a5c75cab17d0'] = 'C\'è'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_07213a0161f52846ab198be103b5ab43'] = 'errori'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_cb5e100e5a9a3e7f6d1fd97512215282'] = 'errore'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_413c9cfb1b07fabd2f4e2873e6b92da1'] = 'Crea un account Envoimoinscher:'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8fc0ba19a15eeb50ab4ad8db449b0c74'] = 'Per creare il tuo account Envoimoinscher clicca sull\'immagine qui sotto. Sarai indirizzato ad uno spazio dedicato personale, dove trovi tutti gli strumenti per una facile gestione delle tue spedizioni.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descrizione'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_82b213c84c7cf648a3cc9e718bb0f1c5'] = 'Questo modulo permette di confrontare le offerte dei corrieri e servizi di ordine online a tariffe di consegna. negoziate'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b843f182d32b5571e48879444311c38b'] = 'Devi inserire il tuo nome utente Envoimoinscher qui di seguito. Se non sei ancora un cliente Envoimoinscher, puoi facilmente creare un account cliccando'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c92285fa6d3e827b198d120ea3ac674'] = 'qui'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d64b03d7cc357f2ac9c63f8c88b49a0'] = 'Download Documentazione'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_32954654ac8fe66a1d09be19001de2d4'] = 'Larghezza'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_af7bb0f5eddd2287cf3f6b880d189e19'] = 'Scegli una funzione ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_31f12b07ff0701df3b6000412952f9c7'] = 'Scegli la larghezza della lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eec6c4bdbd339edf8cbea68becb85244'] = 'Altezza'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_97fd502c6a75bfb727fbb5a93d3bc60b'] = 'Scegli Altezza nella lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_675056ad1441b6375b2c5abd48c27ef1'] = 'Profondità'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ccccb5efc77dfc62afb2c5ad4223916d'] = 'Scegli profondità nella lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a669003ea35aa39ca280b83bd259a032'] = 'Confezione'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6106b8b4d1ecffdfa8357956183ec519'] = 'Scegli una confezione...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2b4c2d19b9293e812fa18765a407be4d'] = 'Scegli la confezione di default.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f0c28b9363b60ed0a4579291ca510544'] = 'Natura dei contenuti'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_f4c0dac58ce6ddb2fa8776d32b1571d4'] = 'Scegli la natura dei contenuti di default.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e74b7618bb3f99b8a7c00ef765c727eb'] = 'Stato dell\'ordine da esportare'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_509d517463244dcd1ec09c4c5fa266ac'] = 'Scegli uno stato ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bb4b4f2503c57254aaed1f1a07bb71da'] = 'Scegliere lo stato di ordine per esportare a Envoi Moins Cher.'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_914419aa32f04011357d3b604a86d7eb'] = 'Corriere'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6f2a31a74727092b14a9f25fa0761f4'] = 'Scegli un corriere...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a22d9830367fdf0f6b2601e7484b387'] = 'Scegli un corriere nella lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2aad255fde4750af3f559d078e1cb420'] = 'Stato dell\'ordine \"Ordine passato\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd77298d81e440f5379f48dccf993a8b'] = 'Scegli l\'ordine \"Ordine passato\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8532ff05a8576bdc04f8a9b8b1dbbfbc'] = 'Stato dell\'ordine inviato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b5af6d17d6837ce556286d019e06e4e0'] = 'Scegli l\'ordine \"Ordine inviato\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d2392c7501c4041d990cc0d372cde50a'] = 'Stato dell\'ordine consegnato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b06087cef2468e82e0e07499fdba5c30'] = 'Scegli l\'ordine \"Ordine consegnato\"'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1e884e3078d9978e216a027ecd57fb34'] = 'E-mail'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9e839460f2871eb777da1b74f3fab03e'] = 'Attiva o disattiva l\'invio di posta da EMC'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a995d9073f999ae5713f6994092b57e'] = 'a meno che non informi il destinatario che viene inviato per default'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_7a16e0022af67a71b8d1521f746f41b3'] = 'Login EMC'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6ef6eed8e2c2d13d6823cbff8f139bad'] = 'Imposta il tuo login EMC'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a861c864b470344da673354f996ce0a7'] = 'Informazioni mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_019ec3132cdf8ee0f2e2a75cf5d3e459'] = 'Sesso'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5f33341287efce675cacf0b3ed818e70'] = 'Seleziona sesso del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8d3f5eff9c40ee315d452392bed5309b'] = 'Cognome'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8cf6db4af977baa86b7691da80601bd0'] = 'Imposta il Cognome del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20db0bfeecd8fe60533206a2b5e9891a'] = 'Nome'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49a768ce02314f39d386a66b77ae1858'] = 'Imposta il nome del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_dd7bf230fde8d4836917806aff6a6b27'] = 'Indirizzo'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4a56f1882e859d6ce5b0fbc96c544100'] = 'Imposta l\'indirizzo del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_642d3ba5db8b57e006584b544e490ec7'] = 'CAP'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_16e65be7ad7680a7148b8ddf0b5b4171'] = 'Impostare il CAP del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_57d056ed0984166336b7879c2af3657f'] = 'City'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_e73af174484a98a10a852ab5bdb701bf'] = 'Imposta il nome della città del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_59716c97497eb9694541f7c3d37b1a4d'] = 'Paese'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_255529f7845194a47b4c2e28374cdb1f'] = 'Scegli un paese ...'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6c820bc5f65e6258a648c3621b7b761e'] = 'Seleziona il paese del mittente nella lista'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bcc254b55c4a1babdf1dcb82c207506b'] = 'Telefono'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_6770d2600f6b45aa0b18dd9a6e39b2f8'] = 'Imposta il telefono del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43cdf4833105e72eb951833a030ad4d5'] = 'Imposta la mail del mittente'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1fa598730b02d78aa07d07337c81c720'] = 'Larghezza non specificata'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c5ac8560e3b92c7941286fa8c2b3a1ed'] = 'Altezza non specificata'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_0eed429f3ae1e71de73b94e13f786893'] = 'Profondità non specificata'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5d50fc169bba225de3df710ff98188c6'] = 'Stato dell\'ordine non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_340ffdfdc019d0b001a4753b57aa398a'] = 'Corriere non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4ecdf47576d5d0d024f30199900c1761'] = 'Stato dell\'ordine \"ordine passato\" non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_c6a9265e0dcf5d7a7f331055b9b93609'] = 'Stato dell\'ordine \"inviato\" non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9f3440922590dae1ebc28c40555c6203'] = 'Stato dell\'ordine \"consegna\" non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_43b89b46dcf9440d5f852548ac5341a3'] = 'Cognome non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9a6dfbad73e6a8a852d4b1a266e941d2'] = 'Nome non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fdda31acf2551d1edde59d64144975b8'] = 'Indirizzo non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_01fc0f14742ba00423886a14e31964de'] = 'CAP non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2814eaaff876f0a3f29d87b23ceaa041'] = 'Città non specificata'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_ae21c3189ecc1e32d10e8f3b264af190'] = 'Paese non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_829d5874145d3477d778cdff96671448'] = 'Telefono non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a3b23591400c94a94583a94c0ab1f19f'] = 'E-mail non specificata'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_18f54b7a823f3349d841804a9fbc5aa3'] = 'Login non specificato'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b9284bff13acffdd879ef4ac7fca5234'] = 'Impostazioni non riuscite'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_1b67f24ea45fdf2e11ad8f6e777e8c8b'] = 'Informazioni sulla consegna'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_fad2b83dc128dfb793fa8ee944dd9931'] = 'Segui la spedizione'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_d668e43f1d8b0584ed4f896de031d921'] = 'Nessun numero di spedizione '; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_bee4b55285d16e5fe85fc3474e343c51'] = 'Stampa note di consegna'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_10f0b7273755ee4117c1517010e18c23'] = 'Nessun numero di note di consegna'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_9ab3e83b1071d09ca62e4cd258686f6b'] = 'Nessun ordine da esportare'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_8c193493d8e4a97dc6da02d9809be530'] = 'Si prega di configurare questo modulo, al fine'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_2345e28c9b93f368968be4781ed70f5c'] = 'Modifica la configurazione'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_50e91dab2a063bc8c1dbc383b0c8e71c'] = 'Costo totale'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_5e8ff31378107b80ae8a9e7cd93eb1bc'] = 'totale della spedizione'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_44749712dbec183e983dcd78a7736c41'] = 'Data'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_403ddddf1f3eecc1a2566b3d81e12993'] = 'Natura del contenuto'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_a254c25adc7d10d7e9c4889484f875a5'] = 'Dettaglio'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_4351cfebe4b61d8aa5efa1d020710005'] = 'Visualizza'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_94966d90747b97d1f0f206c98a8b1ac3'] = 'Invia'; +$_MODULE['<{envoimoinscher}prestashop>envoimoinscher_eae21050d83c239d047c9eb0d3bc930e'] = 'Elenco degli ordini per l\'esportazione'; + +?> \ No newline at end of file diff --git a/modules/envoimoinscher/logo.gif b/modules/envoimoinscher/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..5528809a78087d41ab71f6073bcd0e19fedd3e62 GIT binary patch literal 604 zcmZ?wbhEHb6krfwc*el6B0lU=yzl?JH~vp*{9m1Fms0dU(c}O6MgP|?{{Q!HYE$pu zc-Q~4yZ>he{ckC_6Yu?hUcXgB-r@Mb|8HLYZ!h*v$ohZv+`oG_{{fYCRs3Hv?f<6_ z|BGY(_g4QuxZOG-@87?F|G$3uUzTvMIQjpP-Ftu<fhvD||3A6$|MC4@@iG5@|NcL% z?ZKH-|Ns44nGpUy-u-{7@Bf({|2HrHfA;AAv&a5t`2U~N{l6(MD!0rkG5`PDSO4?E z{&!dY-@o~PN$gLcX@_<kK6m;5o$LR<eO<HX(Bq2q|K*AQ@8A0W^T+=LxBm(5|4$rn zPsskC>=lua{{R2K|7pJe|Nn1|kNyAR>Ho~Y51+qOO_}@u;;H|yU;J+?`kxc}8))W& ziT|&h{l9nPKVWDSMKjP0DE?&OWMD{Q&;i*1iW3I*oee=v&C+&qip`zPoDs}yemZfS zT|s)*9Eob~N@_Cfk)3)bvR-Df9?k-RUXnh|@itx}DxOX1j(ifl@lEDx7S4K|3c7A; z=1n|mej29QO<}HF`f5BU)ow&fi93a}$}?QOe&dF+rIpo#M?t5asPT)wcy;Z~yZ0Yo zKK!!p-3Kc{e-#<wC(6Q>6}}-X5e^616*R<BjvV-w;KivBx{IU1=me`Ef7G;sM#g3C VT~Sk(1XzA>KGMV4#l*;94FE0t5P$#x literal 0 HcmV?d00001 diff --git a/modules/envoimoinscher/logocarre.png b/modules/envoimoinscher/logocarre.png new file mode 100755 index 0000000000000000000000000000000000000000..2d1a97835e60dfdaf32bfc485e7a941a70f73483 GIT binary patch literal 13384 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 literal 0 HcmV?d00001 diff --git a/modules/envoimoinscher/ps_emc.png b/modules/envoimoinscher/ps_emc.png new file mode 100755 index 0000000000000000000000000000000000000000..4828ce724b9a1fab1935930973782ce729fc1bca GIT binary patch literal 11858 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 literal 0 HcmV?d00001 diff --git a/modules/envoimoinscher/tracking.php b/modules/envoimoinscher/tracking.php new file mode 100755 index 000000000..e6f7435db --- /dev/null +++ b/modules/envoimoinscher/tracking.php @@ -0,0 +1,105 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include('../../config/config.inc.php'); +include('../../init.php'); + +global $cookie; + +$validReturn = array('infoexterne', 'token', 'etat', 'envoi'); + +$return = array(); +foreach ($_GET AS $key => $val) + if (in_array(strtolower($key), $validReturn)) + $return[strtolower($key)] = utf8_encode(urldecode(stripslashes($val))); + +if (isset($return['infoexterne']) AND isset($return['token']) AND isset($return['etat'])) +{ + $id_order = str_replace(str_replace('.', '_', str_replace('www.','',$_SERVER['HTTP_HOST'])).'_', '', $return['infoexterne']); + + $order = new Order((int)($id_order)); + $customer = new Customer((int)($order->id_customer)); + $confs = Configuration::getMultiple(array('EMC_SEND_STATE', 'EMC_ORDER_PAST_STATE', 'EMC_DELIVERY_STATE')); + + if ($customer->secure_key != $return['token']) + d(Tools::displayError('Hack attempt')); + else + { + switch ($return['etat']) + { + // New command + case 'CMD' : + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState((int)($confs['EMC_ORDER_PAST_STATE']), (int)($history->id_order)); + $history->id_employee = (int)($cookie->id_employee); + $history->addWithemail(); + + $db = Db::getInstance(); + $db->ExecuteS('SELECT * FROM '._DB_PREFIX_.'envoimoinscher WHERE id_order = '.(int)($id_order)); + $numRows = (int)($db->NumRows()); + if ($numRows == 0) + { + if (Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'envoimoinscher VALUES (\''.(int)($id_order).'\', \''.pSQL($return['envoi']).'\');')); + } + else + { + if (Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'envoimoinscher SET shipping_number=\''.pSQL($return['envoi']).'\' WHERE id_order=\''.(int)($id_order).'\' ')); + } + + break; + // Send object + case 'ENV' : + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState((int)($confs['EMC_SEND_STATE']), (int)($history->id_order)); + $history->id_employee = (int)($cookie->id_employee); + $history->addWithemail(); + break; + // Cancel + case 'ANN' : + $message = new Message(); + $texte = 'Envoi Moins cher : envoi annulé'; + $message->message = htmlentities($texte, ENT_COMPAT, 'UTF-8'); + $message->id_order = (int)($id_order); + $message->private = 1; + $message->add(); + break; + // todo ?? + case 'LIV' : + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState((int)($confs['EMC_DELIVERY_STATE']), (int)($history->id_order)); + $history->id_employee = (int)($cookie->id_employee); + $history->addWithemail(); + break; + } + } +} +else + d(Tools::displayError('Hack attempt')); + diff --git a/modules/fedexcarrier/RateService_v9.wsdl b/modules/fedexcarrier/RateService_v9.wsdl new file mode 100644 index 000000000..88d1b64d2 --- /dev/null +++ b/modules/fedexcarrier/RateService_v9.wsdl @@ -0,0 +1,4756 @@ +<?xml version="1.0" encoding="UTF-8"?> +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://fedex.com/ws/rate/v9" xmlns:s1="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://fedex.com/ws/rate/v9" name="RateServiceDefinitions"> + <types> + <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://fedex.com/ws/rate/v9"> + <xs:element name="RateRequest" type="ns:RateRequest"/> + <xs:element name="RateReply" type="ns:RateReply"/> + <xs:complexType name="AdditionalLabelsDetail"> + <xs:annotation> + <xs:documentation>Specifies additional labels to be produced. All required labels for shipments will be produced without the need to request additional labels. These are only available as thermal labels.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Type" type="ns:AdditionalLabelsType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The type of additional labels to return.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Count" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>The number of this type label to return</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="AdditionalLabelsType"> + <xs:annotation> + <xs:documentation>Identifies the type of additional labels.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BROKER"/> + <xs:enumeration value="CONSIGNEE"/> + <xs:enumeration value="CUSTOMS"/> + <xs:enumeration value="DESTINATION"/> + <xs:enumeration value="MANIFEST"/> + <xs:enumeration value="ORIGIN"/> + <xs:enumeration value="RECIPIENT"/> + <xs:enumeration value="SHIPPER"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Address"> + <xs:annotation> + <xs:documentation>Descriptive data for a physical location. May be used as an actual physical address (place to which one could go), or as a container of "address parts" which should be handled as a unit (such as a city-state-ZIP combination within the US).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="StreetLines" type="xs:string" minOccurs="0" maxOccurs="2"> + <xs:annotation> + <xs:documentation>Combination of number, street name, etc. At least one line is required for a valid physical address; empty lines should not be included.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="City" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Name of city, town, etc.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="StateOrProvinceCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifying abbreviation for US state, Canada province, etc. Format and presence of this field will vary, depending on country.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PostalCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identification of a region (usually small) for mail/package delivery. Format and presence of this field will vary, depending on country.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="UrbanizationCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Relevant only to addresses in Puerto Rico.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CountryCode" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>The two-letter code used to identify a country.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Residential" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates whether this address is residential (as opposed to commercial).</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="B13AFilingOptionType"> + <xs:annotation> + <xs:documentation> + Specifies which filing option is being exercised by the customer. + Required for non-document shipments originating in Canada destined for any country other than Canada, the United States, Puerto Rico or the U.S. Virgin Islands. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FILED_ELECTRONICALLY"/> + <xs:enumeration value="MANUALLY_ATTACHED"/> + <xs:enumeration value="NOT_REQUIRED"/> + <xs:enumeration value="SUMMARY_REPORTING"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="BarcodeSymbologyType"> + <xs:annotation> + <xs:documentation>Identification of the type of barcode (symbology) used on FedEx documents and labels.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CODABAR"/> + <xs:enumeration value="CODE128"/> + <xs:enumeration value="CODE128B"/> + <xs:enumeration value="CODE128C"/> + <xs:enumeration value="CODE39"/> + <xs:enumeration value="CODE93"/> + <xs:enumeration value="I2OF5"/> + <xs:enumeration value="MANUAL"/> + <xs:enumeration value="PDF417"/> + <xs:enumeration value="POSTNET"/> + <xs:enumeration value="UCC128"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="CarrierCodeType"> + <xs:annotation> + <xs:documentation>Identification of a FedEx operating company (transportation).</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FDXC"/> + <xs:enumeration value="FDXE"/> + <xs:enumeration value="FDXG"/> + <xs:enumeration value="FXCC"/> + <xs:enumeration value="FXFR"/> + <xs:enumeration value="FXSP"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CertificateOfOriginDetail"> + <xs:annotation> + <xs:documentation>The instructions indicating how to print the Certificate of Origin ( e.g. whether or not to include the instructions, image type, etc ...)</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="DocumentFormat" type="ns:ShippingDocumentFormat" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies characteristics of a shipping document to be produced.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomerImageUsages" type="ns:CustomerImageUsage" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the usage and identification of customer supplied images to be used on this document.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ClearanceBrokerageType"> + <xs:annotation> + <xs:documentation>Specifies the type of brokerage to be applied to a shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BROKER_INCLUSIVE"/> + <xs:enumeration value="BROKER_INCLUSIVE_NON_RESIDENT_IMPORTER"/> + <xs:enumeration value="BROKER_SELECT"/> + <xs:enumeration value="BROKER_SELECT_NON_RESIDENT_IMPORTER"/> + <xs:enumeration value="BROKER_UNASSIGNED"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ClientDetail"> + <xs:annotation> + <xs:documentation>Descriptive data for the client submitting a transaction.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="AccountNumber" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>The FedEx account number associated with this transaction.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MeterNumber" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>This number is assigned by FedEx and identifies the unique device from which the request is originating.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="IntegratorId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Only used in transactions which require identification of the Fed Ex Office integrator.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Region" type="ns:ExpressRegionCode" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the region from which the transaction is submitted.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Localization" type="ns:Localization" minOccurs="0"> + <xs:annotation> + <xs:documentation>The language to be used for human-readable Notification.localizedMessages in responses to the request containing this ClientDetail object. Different requests from the same client may contain different Localization data. (Contrast with TransactionDetail.localization, which governs data payload language/translation.)</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CodAddTransportationChargesType"> + <xs:annotation> + <xs:documentation>Identifies what freight charges should be added to the COD collect amount.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ADD_ACCOUNT_COD_SURCHARGE"/> + <xs:enumeration value="ADD_ACCOUNT_NET_CHARGE"/> + <xs:enumeration value="ADD_ACCOUNT_NET_FREIGHT"/> + <xs:enumeration value="ADD_ACCOUNT_TOTAL_CUSTOMER_CHARGE"/> + <xs:enumeration value="ADD_LIST_COD_SURCHARGE"/> + <xs:enumeration value="ADD_LIST_NET_CHARGE"/> + <xs:enumeration value="ADD_LIST_NET_FREIGHT"/> + <xs:enumeration value="ADD_LIST_TOTAL_CUSTOMER_CHARGE"/> + <xs:enumeration value="ADD_SUM_OF_ACCOUNT_NET_CHARGES"/> + <xs:enumeration value="ADD_SUM_OF_ACCOUNT_NET_FREIGHT"/> + <xs:enumeration value="ADD_SUM_OF_LIST_NET_CHARGES"/> + <xs:enumeration value="ADD_SUM_OF_LIST_NET_FREIGHT"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="CodCollectionType"> + <xs:annotation> + <xs:documentation>Identifies the type of funds FedEx should collect upon shipment delivery.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ANY"/> + <xs:enumeration value="CASH"/> + <xs:enumeration value="GUARANTEED_FUNDS"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CodDetail"> + <xs:annotation> + <xs:documentation>Descriptive data required for a FedEx COD (Collect-On-Delivery) shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="CodCollectionAmount" type="ns:Money" minOccurs="0"/> + <xs:element name="AddTransportationCharges" type="ns:CodAddTransportationChargesType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies if freight charges are to be added to the COD amount. This element determines which freight charges should be added to the COD collect amount. See CodAddTransportationChargesType for a list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CollectionType" type="ns:CodCollectionType" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the type of funds FedEx should collect upon package delivery</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CodRecipient" type="ns:Party" minOccurs="0"> + <xs:annotation> + <xs:documentation>For Express this is the descriptive data that is used for the recipient of the FedEx Letter containing the COD payment. For Ground this is the descriptive data for the party to receive the payment that prints the COD receipt.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ReferenceIndicator" type="ns:CodReturnReferenceIndicatorType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates which type of reference information to include on the COD return shipping label.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CodReturnReferenceIndicatorType"> + <xs:annotation> + <xs:documentation>Indicates which type of reference information to include on the COD return shipping label.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="INVOICE"/> + <xs:enumeration value="PO"/> + <xs:enumeration value="REFERENCE"/> + <xs:enumeration value="TRACKING"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CommercialInvoice"> + <xs:annotation> + <xs:documentation>CommercialInvoice element is required for electronic upload of CI data. It will serve to create/transmit an Electronic Commercial Invoice through the FedEx Systems. Customers are responsible for printing their own Commercial Invoice.If you would likeFedEx to generate a Commercial Invoice and transmit it to Customs. for clearance purposes, you need to specify that in the ShippingDocumentSpecification element. If you would like a copy of the Commercial Invoice that FedEx generated returned to you in reply it needs to be specified in the ETDDetail/RequestedDocumentCopies element. Commercial Invoice support consists of maximum of 99 commodity line items.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Comments" type="xs:string" minOccurs="0" maxOccurs="99"> + <xs:annotation> + <xs:documentation>Any comments that need to be communicated about this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Any freight charges that are associated with this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TaxesOrMiscellaneousCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Any taxes or miscellaneous charges(other than Freight charges or Insurance charges) that are associated with this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PackingCosts" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Any packing costs that are associated with this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="HandlingCosts" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Any handling costs that are associated with this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SpecialInstructions" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Free-form text.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DeclarationStatment" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Free-form text.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PaymentTerms" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Free-form text.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Purpose" type="ns:PurposeOfShipmentType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The reason for the shipment. Note: SOLD is not a valid purpose for a Proforma Invoice.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PurposeOfShipmentDescription" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive text for the purpose of the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomerInvoiceNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Customer assigned invoice number.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="OriginatorName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Name of the International Expert that completed the Commercial Invoice different from Sender.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TermsOfSale" type="ns:TermsOfSaleType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Required for dutiable international Express or Ground shipment. This field is not applicable to an international PIB(document) or a non-document which does not require a Commercial Invoice.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CommercialInvoiceDetail"> + <xs:annotation> + <xs:documentation>The instructions indicating how to print the Commercial Invoice( e.g. image type) Specifies characteristics of a shipping document to be produced.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Format" type="ns:ShippingDocumentFormat" minOccurs="0"/> + <xs:element name="CustomerImageUsages" type="ns:CustomerImageUsage" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Specifies the usage and identification of a customer supplied image to be used on this document.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CommitDetail"> + <xs:annotation> + <xs:documentation>Information about the transit time and delivery commitment date and time.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="CommodityName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The Commodity applicable to this commitment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ServiceType" type="ns:ServiceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The FedEx service type applicable to this commitment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AppliedOptions" type="ns:ServiceOptionType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Shows the specific combination of service options combined with the service type that produced this committment in the set returned to the caller.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AppliedSubOptions" type="ns:ServiceSubOptionDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Supporting detail for applied options identified in preceding field.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CommitTimestamp" type="xs:dateTime" minOccurs="0"> + <xs:annotation> + <xs:documentation>THe delivery commitment date/time. Express Only.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DayOfWeek" type="ns:DayOfWeekType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The delivery commitment day of the week.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TransitTime" type="ns:TransitTimeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The number of transit days; applies to Ground and LTL Freight; indicates minimum transit time for SmartPost.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MaximumTransitTime" type="ns:TransitTimeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Maximum number of transit days, for SmartPost shipments.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DestinationServiceArea" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The service area code for the destination of this shipment. Express only.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BrokerAddress" type="ns:Address" minOccurs="0"> + <xs:annotation> + <xs:documentation>The address of the broker to be used for this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BrokerLocationId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The FedEx location identifier for the broker.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BrokerCommitTimestamp" type="xs:dateTime" minOccurs="0"> + <xs:annotation> + <xs:documentation>The delivery commitment date/time the shipment will arrive at the border.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BrokerCommitDayOfWeek" type="ns:DayOfWeekType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The delivery commitment day of the week the shipment will arrive at the border.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BrokerToDestinationDays" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>The number of days it will take for the shipment to make it from broker to destination</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ProofOfDeliveryDate" type="xs:date" minOccurs="0"> + <xs:annotation> + <xs:documentation>The delivery commitment date for shipment served by GSP (Global Service Provider)</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ProofOfDeliveryDayOfWeek" type="ns:DayOfWeekType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The delivery commitment day of the week for the shipment served by GSP (Global Service Provider)</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CommitMessages" type="ns:Notification" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Messages concerning the ability to provide an accurate delivery commitment on an International commit quote. These could be messages providing information about why a commitment could not be returned or a successful message such as "REQUEST COMPLETED"</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DeliveryMessages" type="xs:string" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Messages concerning the delivery commitment on an International commit quote such as "0:00 A.M. IF NO CUSTOMS DELAY"</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DelayDetails" type="ns:DelayDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Information about why a shipment delivery is delayed and at what level (country/service etc.).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DocumentContent" type="ns:InternationalDocumentContentType" minOccurs="0"/> + <xs:element name="RequiredDocuments" type="ns:RequiredShippingDocumentType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Required documentation for this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightCommitDetail" type="ns:FreightCommitDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Freight origin and destination city center information and total distance between origin and destination city centers.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CommitmentDelayType"> + <xs:annotation> + <xs:documentation>The type of delay this shipment will encounter.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="HOLIDAY"/> + <xs:enumeration value="NON_WORKDAY"/> + <xs:enumeration value="NO_CITY_DELIVERY"/> + <xs:enumeration value="NO_HOLD_AT_LOCATION"/> + <xs:enumeration value="NO_LOCATION_DELIVERY"/> + <xs:enumeration value="NO_SERVICE_AREA_DELIVERY"/> + <xs:enumeration value="NO_SERVICE_AREA_SPECIAL_SERVICE_DELIVERY"/> + <xs:enumeration value="NO_SPECIAL_SERVICE_DELIVERY"/> + <xs:enumeration value="NO_ZIP_DELIVERY"/> + <xs:enumeration value="WEEKEND"/> + <xs:enumeration value="WEEKEND_SPECIAL"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Commodity"> + <xs:annotation> + <xs:documentation> + For international multiple piece shipments, commodity information must be passed in the Master and on each child transaction. + If this shipment cotains more than four commodities line items, the four highest valued should be included in the first 4 occurances for this request. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Name" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>total number of pieces of this commodity</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NumberOfPieces" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>total number of pieces of this commodity</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Description" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Complete and accurate description of this commodity.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>450</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="CountryOfManufacture" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Country code where commodity contents were produced or manufactured in their final form.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>2</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="HarmonizedCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Unique alpha/numeric representing commodity item. + At least one occurrence is required for US Export shipments if the Customs Value is greater than $2500 or if a valid US Export license is required. + </xs:documentation> + <xs:appinfo> + <xs:MaxLength>14</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Weight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total weight of this commodity. 1 explicit decimal position. Max length 11 including decimal.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Quantity" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Number of units of a commodity in total number of pieces for this line item. Max length is 9</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="QuantityUnits" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Unit of measure used to express the quantity of this commodity line item.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>3</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="AdditionalMeasures" type="ns:Measure" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Contains only additional quantitative information other than weight and quantity to calculate duties and taxes.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="UnitPrice" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Value of each unit in Quantity. Six explicit decimal positions, Max length 18 including decimal.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomsValue" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Total customs value for this line item. + It should equal the commodity unit quantity times commodity unit value. + Six explicit decimal positions, max length 18 including decimal. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ExciseConditions" type="ns:EdtExciseCondition" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Defines additional characteristic of commodity used to calculate duties and taxes</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ExportLicenseNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Applicable to US export shipping only.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>12</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="ExportLicenseExpirationDate" type="xs:date" minOccurs="0"/> + <xs:element name="CIMarksAndNumbers" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation> + An identifying mark or number used on the packaging of a shipment to help customers identify a particular shipment. + </xs:documentation> + <xs:appinfo> + <xs:MaxLength>15</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="NaftaDetail" type="ns:NaftaCommodityDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>All data required for this commodity in NAFTA Certificate of Origin.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ConfigurableLabelReferenceEntry"> + <xs:annotation> + <xs:documentation>Defines additional data to print in the Configurable portion of the label, this allows you to print the same type information on the label that can also be printed on the doc tab.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ZoneNumber" type="xs:positiveInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>1 of 12 possible zones to position data.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Header" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The identifiying text for the data in this zone.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DataField" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A reference to a field in either the request or reply to print in this zone following the header.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LiteralValue" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A literal value to print after the header in this zone.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Contact"> + <xs:annotation> + <xs:documentation>The descriptive data for a point-of-contact person.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ContactId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Client provided identifier corresponding to this contact information.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PersonName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the contact person's name.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Title" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the contact person's title.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CompanyName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the company this contact is associated with.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PhoneNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the phone number associated with this contact.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PhoneExtension" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the phone extension associated with this contact.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PagerNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the pager number associated with this contact.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FaxNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the fax number associated with this contact.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EMailAddress" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the email address associated with this contact.</xs:documentation> + <xs:appinfo> + <xs:MaxLength> + <ns:Express>120</ns:Express> + <ns:Ground>35</ns:Ground> + </xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ContactAndAddress"> + <xs:sequence> + <xs:element name="Contact" type="ns:Contact" minOccurs="0"/> + <xs:element name="Address" type="ns:Address" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ContentRecord"> + <xs:sequence> + <xs:element name="PartNumber" type="xs:string" minOccurs="0"/> + <xs:element name="ItemNumber" type="xs:string" minOccurs="0"/> + <xs:element name="ReceivedQuantity" type="xs:nonNegativeInteger" minOccurs="0"/> + <xs:element name="Description" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CurrencyExchangeRate"> + <xs:annotation> + <xs:documentation>Specifies the currency exchange performed on financial amounts for this rate.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="FromCurrency" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The currency code for the original (converted FROM) currency.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="IntoCurrency" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The currency code for the final (converted INTO) currency.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Rate" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>Multiplier used to convert fromCurrency units to intoCurrency units.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomDeliveryWindowDetail"> + <xs:sequence> + <xs:element name="Type" type="ns:CustomDeliveryWindowType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the type of custom delivery being requested.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RequestTime" type="xs:time" minOccurs="0"> + <xs:annotation> + <xs:documentation>Time by which delivery is requested.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RequestRange" type="ns:DateRange" minOccurs="0"> + <xs:annotation> + <xs:documentation>Range of dates for custom delivery request; only used if type is BETWEEN.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RequestDate" type="xs:date" minOccurs="0"> + <xs:annotation> + <xs:documentation>Date for custom delivery request; only used for types of ON, BETWEEN, or AFTER.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CustomDeliveryWindowType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="AFTER"/> + <xs:enumeration value="BEFORE"/> + <xs:enumeration value="BETWEEN"/> + <xs:enumeration value="ON"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CustomDocumentDetail"> + <xs:annotation> + <xs:documentation>Data required to produce a custom-specified document, either at shipment or package level.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Format" type="ns:ShippingDocumentFormat" minOccurs="0"> + <xs:annotation> + <xs:documentation>Common information controlling document production.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LabelPrintingOrientation" type="ns:LabelPrintingOrientationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Applicable only to documents produced on thermal printers with roll stock.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LabelRotation" type="ns:LabelRotationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Applicable only to documents produced on thermal printers with roll stock.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SpecificationId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the formatting specification used to construct this custom document.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomLabelBarcodeEntry"> + <xs:annotation> + <xs:documentation>Constructed string, based on format and zero or more data fields, printed in specified barcode symbology.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Position" type="ns:CustomLabelPosition" minOccurs="0"/> + <xs:element name="Format" type="xs:string" minOccurs="0"/> + <xs:element name="DataFields" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="BarHeight" type="xs:int" minOccurs="0"/> + <xs:element name="ThinBarWidth" type="xs:int" minOccurs="0"> + <xs:annotation> + <xs:documentation>Width of thinnest bar/space element in the barcode.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BarcodeSymbology" type="ns:BarcodeSymbologyType" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomLabelBoxEntry"> + <xs:annotation> + <xs:documentation>Solid (filled) rectangular area on label.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="TopLeftCorner" type="ns:CustomLabelPosition"/> + <xs:element name="BottomRightCorner" type="ns:CustomLabelPosition"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CustomLabelCoordinateUnits"> + <xs:restriction base="xs:string"> + <xs:enumeration value="MILS"/> + <xs:enumeration value="PIXELS"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CustomLabelDetail"> + <xs:sequence> + <xs:element name="CoordinateUnits" type="ns:CustomLabelCoordinateUnits" minOccurs="0"/> + <xs:element name="TextEntries" type="ns:CustomLabelTextEntry" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="GraphicEntries" type="ns:CustomLabelGraphicEntry" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="BoxEntries" type="ns:CustomLabelBoxEntry" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="BarcodeEntries" type="ns:CustomLabelBarcodeEntry" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomLabelGraphicEntry"> + <xs:annotation> + <xs:documentation>Image to be included from printer's memory, or from a local file for offline clients.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Position" type="ns:CustomLabelPosition" minOccurs="0"/> + <xs:element name="PrinterGraphicId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Printer-specific index of graphic image to be printed.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FileGraphicFullName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Fully-qualified path and file name for graphic image to be printed.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomLabelPosition"> + <xs:sequence> + <xs:element name="X" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Horizontal position, relative to left edge of custom area.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Y" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Vertical position, relative to top edge of custom area.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomLabelTextEntry"> + <xs:annotation> + <xs:documentation>Constructed string, based on format and zero or more data fields, printed in specified printer font (for thermal labels) or generic font/size (for plain paper labels).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Position" type="ns:CustomLabelPosition" minOccurs="0"/> + <xs:element name="Format" type="xs:string" minOccurs="0"/> + <xs:element name="DataFields" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="ThermalFontId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Printer-specific font name for use with thermal printer labels.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FontName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Generic font name for use with plain paper labels.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FontSize" type="xs:positiveInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Generic font size for use with plain paper labels.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomerImageUsage"> + <xs:sequence> + <xs:element name="Type" type="ns:CustomerImageUsageType" minOccurs="0"/> + <xs:element name="Id" type="ns:ImageId" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CustomerImageUsageType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="LETTER_HEAD"/> + <xs:enumeration value="SIGNATURE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CustomerReference"> + <xs:annotation> + <xs:documentation>Reference information to be associated with this package.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="CustomerReferenceType" type="ns:CustomerReferenceType"> + </xs:element> + <xs:element name="Value" type="xs:string"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="CustomerReferenceType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="BILL_OF_LADING"/> + <xs:enumeration value="CUSTOMER_REFERENCE"/> + <xs:enumeration value="DEPARTMENT_NUMBER"/> + <xs:enumeration value="ELECTRONIC_PRODUCT_CODE"/> + <xs:enumeration value="INTRACOUNTRY_REGULATORY_REFERENCE"/> + <xs:enumeration value="INVOICE_NUMBER"/> + <xs:enumeration value="P_O_NUMBER"/> + <xs:enumeration value="SHIPMENT_INTEGRITY"/> + <xs:enumeration value="STORE_NUMBER"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="CustomerSpecifiedLabelDetail"> + <xs:annotation> + <xs:documentation>Allows customer-specified control of label content.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="DocTabContent" type="ns:DocTabContent" minOccurs="0"> + <xs:annotation> + <xs:documentation>If omitted, no doc tab will be produced (i.e. default = former NONE type).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomContent" type="ns:CustomLabelDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Defines any custom content to print on the label.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ConfigurableReferenceEntries" type="ns:ConfigurableLabelReferenceEntry" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Defines additional data to print in the Configurable portion of the label, this allows you to print the same type information on the label that can also be printed on the doc tab.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MaskedData" type="ns:LabelMaskableDataType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Controls which data/sections will be suppressed.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TermsAndConditionsLocalization" type="ns:Localization" minOccurs="0"> + <xs:annotation> + <xs:documentation>The language to use when printing the terms and conditions on the label.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AdditionalLabels" type="ns:AdditionalLabelsDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Controls the number of additional copies of supplemental labels.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AirWaybillSuppressionCount" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>This value reduces the default quantity of destination/consignee air waybill labels. A value of zero indicates no change to default. A minimum of one copy will always be produced.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="CustomsClearanceDetail"> + <xs:sequence> + <xs:element name="Broker" type="ns:Party" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Descriptive data identifying the Broker responsible for the shipmet. + Required if BROKER_SELECT_OPTION is requested in Special Services. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ClearanceBrokerage" type="ns:ClearanceBrokerageType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Interacts both with properties of the shipment and contractual relationship with the shipper.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ImporterOfRecord" type="ns:Party" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Applicable only for Commercial Invoice. If the consignee and importer are not the same, the Following importer fields are required. + Importer/Contact/PersonName + Importer/Contact/CompanyName + Importer/Contact/PhoneNumber + Importer/Address/StreetLine[0] + Importer/Address/City + Importer/Address/StateOrProvinceCode - if Importer Country Code is US or CA + Importer/Address/PostalCode - if Importer Country Code is US or CA + Importer/Address/CountryCode + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RecipientCustomsId" type="ns:RecipientCustomsId" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies how the recipient is identified for customs purposes; the requirements on this information vary with destination country.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DutiesPayment" type="ns:Payment" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates how payment of duties for the shipment will be made.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DocumentContent" type="ns:InternationalDocumentContentType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates whether this shipment contains documents only or non-documents.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomsValue" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The total customs value for the shipment. This total will rrepresent th esum of the values of all commodities, and may include freight, miscellaneous, and insurance charges. Must contain 2 explicit decimal positions with a max length of 17 including the decimal. For Express International MPS, the Total Customs Value is in the master transaction and all child transactions</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightOnValue" type="ns:FreightOnValueType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies responsibilities with respect to loss, damage, etc.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="InsuranceCharges" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Documents amount paid to third party for coverage of shipment content.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PartiesToTransactionAreRelated" type="xs:boolean" minOccurs="0"/> + <xs:element name="CommercialInvoice" type="ns:CommercialInvoice" minOccurs="0"> + <xs:annotation> + <xs:documentation>CommercialInvoice element is required for electronic upload of CI data. It will serve to create/transmit an Electronic Commercial Invoice through FedEx System. Customers are responsible for printing their own Commercial Invoice. Commercial Invoice support consists of a maximum of 20 commodity line items.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Commodities" type="ns:Commodity" minOccurs="0" maxOccurs="99"> + <xs:annotation> + <xs:documentation> + For international multiple piece shipments, commodity information must be passed in the Master and on each child transaction. + If this shipment cotains more than four commodities line items, the four highest valued should be included in the first 4 occurances for this request. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ExportDetail" type="ns:ExportDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Country specific details of an International shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RegulatoryControls" type="ns:RegulatoryControlType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>FOOD_OR_PERISHABLE is required by FDA/BTA; must be true for food/perishable items coming to US or PR from non-US/non-PR origin.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DangerousGoodsAccessibilityType"> + <xs:annotation> + <xs:documentation>Identifies whether or not the products being shipped are required to be accessible during delivery.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ACCESSIBLE"/> + <xs:enumeration value="INACCESSIBLE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="DangerousGoodsDetail"> + <xs:annotation> + <xs:documentation>The descriptive data required for a FedEx shipment containing dangerous goods (hazardous materials).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Accessibility" type="ns:DangerousGoodsAccessibilityType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies whether or not the products being shipped are required to be accessible during delivery.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CargoAircraftOnly" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Shipment is packaged/documented for movement ONLY on cargo aircraft.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Options" type="ns:HazardousCommodityOptionType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Indicates which kinds of hazardous content are in the current package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="HazardousCommodities" type="ns:HazardousCommodityContent" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Documents the kinds and quantities of all hazardous commodities in the current package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Packaging" type="ns:HazardousCommodityPackagingDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Description of the packaging of this commodity, suitable for use on OP-900 and OP-950 forms.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EmergencyContactNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Telephone number to use for contact in the event of an emergency.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="DateRange"> + <xs:sequence> + <xs:element name="Begins" type="xs:date"> + </xs:element> + <xs:element name="Ends" type="xs:date"> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DayOfWeekType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="FRI"/> + <xs:enumeration value="MON"/> + <xs:enumeration value="SAT"/> + <xs:enumeration value="SUN"/> + <xs:enumeration value="THU"/> + <xs:enumeration value="TUE"/> + <xs:enumeration value="WED"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="DelayDetail"> + <xs:annotation> + <xs:documentation>Information about why a shipment delivery is delayed and at what level( country/service etc.).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Date" type="xs:date" minOccurs="0"> + <xs:annotation> + <xs:documentation>The date of the delay</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DayOfWeek" type="ns:DayOfWeekType" minOccurs="0"/> + <xs:element name="Level" type="ns:DelayLevelType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The attribute of the shipment that caused the delay(e.g. Country, City, LocationId, Zip, service area, special handling )</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Point" type="ns:DelayPointType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The point where the delay is occurring (e.g. Origin, Destination, Broker location)</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Type" type="ns:CommitmentDelayType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The reason for the delay (e.g. holiday, weekend, etc.).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Description" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The name of the holiday in that country that is causing the delay.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DelayLevelType"> + <xs:annotation> + <xs:documentation>The attribute of the shipment that caused the delay(e.g. Country, City, LocationId, Zip, service area, special handling )</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CITY"/> + <xs:enumeration value="COUNTRY"/> + <xs:enumeration value="LOCATION"/> + <xs:enumeration value="POSTAL_CODE"/> + <xs:enumeration value="SERVICE_AREA"/> + <xs:enumeration value="SERVICE_AREA_SPECIAL_SERVICE"/> + <xs:enumeration value="SPECIAL_SERVICE"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="DelayPointType"> + <xs:annotation> + <xs:documentation>The point where the delay is occurring ( e.g. Origin, Destination, Broker location).</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BROKER"/> + <xs:enumeration value="DESTINATION"/> + <xs:enumeration value="ORIGIN"/> + <xs:enumeration value="ORIGIN_DESTINATION_PAIR"/> + <xs:enumeration value="PROOF_OF_DELIVERY_POINT"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="DestinationControlDetail"> + <xs:annotation> + <xs:documentation>Data required to complete the Destionation Control Statement for US exports.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="StatementTypes" type="ns:DestinationControlStatementType" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="DestinationCountries" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Comma-separated list of up to four country codes, required for DEPARTMENT_OF_STATE statement.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EndUser" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Name of end user, required for DEPARTMENT_OF_STATE statement.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DestinationControlStatementType"> + <xs:annotation> + <xs:documentation>Used to indicate whether the Destination Control Statement is of type Department of Commerce, Department of State or both.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="DEPARTMENT_OF_COMMERCE"/> + <xs:enumeration value="DEPARTMENT_OF_STATE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Dimensions"> + <xs:annotation> + <xs:documentation>The dimensions of this package and the unit type used for the measurements.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Length" minOccurs="1"> + <xs:simpleType> + <xs:restriction base="xs:nonNegativeInteger"/> + </xs:simpleType> + </xs:element> + <xs:element name="Width" minOccurs="1"> + <xs:simpleType> + <xs:restriction base="xs:nonNegativeInteger"/> + </xs:simpleType> + </xs:element> + <xs:element name="Height" minOccurs="1"> + <xs:simpleType> + <xs:restriction base="xs:nonNegativeInteger"/> + </xs:simpleType> + </xs:element> + <xs:element name="Units" type="ns:LinearUnits" minOccurs="1"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Distance"> + <xs:annotation> + <xs:documentation>Driving or other transportation distances, distinct from dimension measurements.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Value" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the distance quantity.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Units" type="ns:DistanceUnits" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the unit of measure for the distance value.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DistanceUnits"> + <xs:restriction base="xs:string"> + <xs:enumeration value="KM"/> + <xs:enumeration value="MI"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="DocTabContent"> + <xs:sequence> + <xs:element name="DocTabContentType" type="ns:DocTabContentType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The DocTabContentType options available.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Zone001" type="ns:DocTabContentZone001" minOccurs="0"> + <xs:annotation> + <xs:documentation>The DocTabContentType should be set to ZONE001 to specify additional Zone details.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Barcoded" type="ns:DocTabContentBarcoded" minOccurs="0"> + <xs:annotation> + <xs:documentation>The DocTabContentType should be set to BARCODED to specify additional BarCoded details.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="DocTabContentBarcoded"> + <xs:sequence> + <xs:element name="Symbology" type="ns:BarcodeSymbologyType" minOccurs="0"/> + <xs:element name="Specification" type="ns:DocTabZoneSpecification" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DocTabContentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="BARCODED"/> + <xs:enumeration value="MINIMUM"/> + <xs:enumeration value="STANDARD"/> + <xs:enumeration value="ZONE001"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="DocTabContentZone001"> + <xs:sequence> + <xs:element name="DocTabZoneSpecifications" type="ns:DocTabZoneSpecification" minOccurs="1" maxOccurs="12"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DocTabZoneJustificationType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="LEFT"/> + <xs:enumeration value="RIGHT"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="DocTabZoneSpecification"> + <xs:sequence> + <xs:element name="ZoneNumber" type="xs:positiveInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Zone number can be between 1 and 12.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Header" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Header value on this zone.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DataField" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Reference path to the element in the request/reply whose value should be printed on this zone.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LiteralValue" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Free form-text to be printed in this zone.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Justification" type="ns:DocTabZoneJustificationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Justification for the text printed on this zone.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="DropoffType"> + <xs:annotation> + <xs:documentation>Identifies the method by which the package is to be tendered to FedEx. This element does not dispatch a courier for package pickup.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BUSINESS_SERVICE_CENTER"/> + <xs:enumeration value="DROP_BOX"/> + <xs:enumeration value="REGULAR_PICKUP"/> + <xs:enumeration value="REQUEST_COURIER"/> + <xs:enumeration value="STATION"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="EMailLabelDetail"> + <xs:annotation> + <xs:documentation>Specific information about the delivery of the email and options for the shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="NotificationEMailAddress" type="xs:string"> + <xs:annotation> + <xs:documentation>Email address to send the URL to.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NotificationMessage" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A message to be inserted into the email.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="EMailNotificationDetail"> + <xs:annotation> + <xs:documentation>Information describing email notifications that will be sent in relation to events that occur during package movement</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="PersonalMessage" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A message that will be included in the email notifications</xs:documentation> + <xs:appinfo> + <xs:MaxLength>120</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Recipients" type="ns:EMailNotificationRecipient" minOccurs="0" maxOccurs="6"> + <xs:annotation> + <xs:documentation>Information describing the destination of the email, format of the email and events to be notified on</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="EMailNotificationFormatType"> + <xs:annotation> + <xs:documentation>The format of the email.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="HTML"/> + <xs:enumeration value="TEXT"/> + <xs:enumeration value="WIRELESS"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="EMailNotificationRecipient"> + <xs:annotation> + <xs:documentation>The descriptive data for a FedEx email notification recipient.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="EMailNotificationRecipientType" type="ns:EMailNotificationRecipientType"> + <xs:annotation> + <xs:documentation>Identifies the relationship this email recipient has to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EMailAddress" type="xs:string"> + <xs:annotation> + <xs:documentation>The email address to send the notification to</xs:documentation> + <xs:appinfo> + <xs:MaxLength> + <ns:Express>120</ns:Express> + <ns:Ground>35</ns:Ground> + </xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="NotifyOnShipment" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Notify the email recipient when this shipment has been shipped.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NotifyOnException" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Notify the email recipient if this shipment encounters a problem while in route</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NotifyOnDelivery" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Notify the email recipient when this shipment has been delivered.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Format" type="ns:EMailNotificationFormatType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The format of the email notification.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Localization" type="ns:Localization" minOccurs="0"> + <xs:annotation> + <xs:documentation>The language/locale to be used in this email notification.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="EMailNotificationRecipientType"> + <xs:annotation> + <xs:documentation>Identifies the set of valid email notification recipient types. For SHIPPER, RECIPIENT and BROKER the email address asssociated with their definitions will be used, any email address sent with the email notification for these three email notification recipient types will be ignored.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BROKER"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="RECIPIENT"/> + <xs:enumeration value="SHIPPER"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="EdtCommodityTax"> + <xs:sequence> + <xs:element name="HarmonizedCode" type="xs:string" minOccurs="0"/> + <xs:element name="Taxes" type="ns:EdtTaxDetail" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="EdtExciseCondition"> + <xs:sequence> + <xs:element name="Category" type="xs:string" minOccurs="0"/> + <xs:element name="Value" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Customer-declared value, with data type and legal values depending on excise condition, used in defining the taxable value of the item.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="EdtRequestType"> + <xs:annotation> + <xs:documentation>Specifies the types of Estimated Duties and Taxes to be included in a rate quotation for an international shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ALL"/> + <xs:enumeration value="NONE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="EdtTaxDetail"> + <xs:sequence> + <xs:element name="TaxType" type="ns:EdtTaxType" minOccurs="0"/> + <xs:element name="EffectiveDate" type="xs:date" minOccurs="0"/> + <xs:element name="Name" type="xs:string" minOccurs="0"/> + <xs:element name="TaxableValue" type="ns:Money" minOccurs="0"/> + <xs:element name="Description" type="xs:string" minOccurs="0"/> + <xs:element name="Formula" type="xs:string" minOccurs="0"/> + <xs:element name="Amount" type="ns:Money" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="EdtTaxType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="ADDITIONAL_TAXES"/> + <xs:enumeration value="CONSULAR_INVOICE_FEE"/> + <xs:enumeration value="CUSTOMS_SURCHARGES"/> + <xs:enumeration value="DUTY"/> + <xs:enumeration value="EXCISE_TAX"/> + <xs:enumeration value="FOREIGN_EXCHANGE_TAX"/> + <xs:enumeration value="GENERAL_SALES_TAX"/> + <xs:enumeration value="IMPORT_LICENSE_FEE"/> + <xs:enumeration value="INTERNAL_ADDITIONAL_TAXES"/> + <xs:enumeration value="INTERNAL_SENSITIVE_PRODUCTS_TAX"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="SENSITIVE_PRODUCTS_TAX"/> + <xs:enumeration value="STAMP_TAX"/> + <xs:enumeration value="STATISTICAL_TAX"/> + <xs:enumeration value="TRANSPORT_FACILITIES_TAX"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="EtdDetail"> + <xs:annotation> + <xs:documentation>Electronic Trade document references used with the ETD special service.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="RequestedDocumentCopies" type="ns:RequestedShippingDocumentType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Indicates the types of shipping documents produced for the shipper by FedEx (see ShippingDocumentSpecification) which should be copied back to the shipper in the shipment result data.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Documents" type="ns:UploadDocumentDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DocumentReferences" type="ns:UploadDocumentReferenceDetail" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ExportDetail"> + <xs:annotation> + <xs:documentation>Country specific details of an International shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="B13AFilingOption" type="ns:B13AFilingOptionType" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Specifies which filing option is being exercised by the customer. + Required for non-document shipments originating in Canada destined for any country other than Canada, the United States, Puerto Rico or the U.S. Virgin Islands. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ExportComplianceStatement" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Required only if B13AFilingOption is one of the following: + FILED_ELECTRONICALLY + MANUALLY_ATTACHED + SUMMARY_REPORTING + If B13AFilingOption = NOT_REQUIRED, this field should contain a valid B13A Exception Number. + </xs:documentation> + <xs:appinfo> + <xs:MaxLength>50</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="PermitNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>This field is applicable only to Canada export non-document shipments of any value to any destination. No special characters allowed. </xs:documentation> + <xs:appinfo> + <xs:MaxLength>10</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="DestinationControlDetail" type="ns:DestinationControlDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Department of Commerce/Department of State information about this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ExpressFreightDetail"> + <xs:annotation> + <xs:documentation>Details specific to an Express freight shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="PackingListEnclosed" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates whether or nor a packing list is enclosed.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShippersLoadAndCount" type="xs:positiveInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation> + Total shipment pieces. + ie. 3 boxes and 3 pallets of 100 pieces each = Shippers Load and Count of 303. + Applicable to International Priority Freight and International Economy Freight. + Values must be in the range of 1 - 99999 + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BookingConfirmationNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Required for International Freight shipping. Values must be 8- 12 characters in length.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>12</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="ReferenceLabelRequested" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BeforeDeliveryContact" type="ns:ExpressFreightDetailContact" minOccurs="0"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="UndeliverableContact" type="ns:ExpressFreightDetailContact" minOccurs="0"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ExpressFreightDetailContact"> + <xs:annotation> + <xs:documentation>Currently not supported. Delivery contact information for an Express freight shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Name" type="xs:string" minOccurs="0"/> + <xs:element name="Phone" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ExpressRegionCode"> + <xs:annotation> + <xs:documentation>Indicates a FedEx Express operating region.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="APAC"/> + <xs:enumeration value="CA"/> + <xs:enumeration value="EMEA"/> + <xs:enumeration value="LAC"/> + <xs:enumeration value="US"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="FedExLocationType"> + <xs:annotation> + <xs:documentation>Identifies a kind of FedEx facility.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FEDEX_EXPRESS_STATION"/> + <xs:enumeration value="FEDEX_GROUND_TERMINAL"/> + <xs:enumeration value="FEDEX_OFFICE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="FlatbedTrailerDetail"> + <xs:annotation> + <xs:documentation>Specifies the optional features/characteristics requested for a Freight shipment utilizing a flatbed trailer.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Options" type="ns:FlatbedTrailerOption" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="FlatbedTrailerOption"> + <xs:restriction base="xs:string"> + <xs:enumeration value="OVER_DIMENSION"/> + <xs:enumeration value="TARP"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="FreightAccountPaymentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="COLLECT"/> + <xs:enumeration value="PREPAID"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="FreightBaseCharge"> + <xs:annotation> + <xs:documentation>Individual charge which contributes to the total base charge for the shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="FreightClass" type="ns:FreightClassType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Freight class for this line item.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RatedAsClass" type="ns:FreightClassType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Effective freight class used for rating this line item.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NmfcCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>NMFC Code for commodity.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Description" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Customer-provided description for this commodity or class line.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Weight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Weight for this commodity or class line.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ChargeRate" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Rate or factor applied to this line item.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ChargeBasis" type="ns:FreightChargeBasisType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the manner in which the chargeRate for this line item was applied.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ExtendedAmount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The net or extended charge for this line item.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="FreightBaseChargeCalculationType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="LINE_ITEMS"/> + <xs:enumeration value="UNIT_PRICING"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="FreightChargeBasisType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="CWT"/> + <xs:enumeration value="FLAT"/> + <xs:enumeration value="MINIMUM"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="FreightClassType"> + <xs:annotation> + <xs:documentation>These values represent the industry-standard freight classes used for FedEx Freight and FedEx National Freight shipment description. (Note: The alphabetic prefixes are required to distinguish these values from decimal numbers on some client platforms.)</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CLASS_050"/> + <xs:enumeration value="CLASS_055"/> + <xs:enumeration value="CLASS_060"/> + <xs:enumeration value="CLASS_065"/> + <xs:enumeration value="CLASS_070"/> + <xs:enumeration value="CLASS_077_5"/> + <xs:enumeration value="CLASS_085"/> + <xs:enumeration value="CLASS_092_5"/> + <xs:enumeration value="CLASS_100"/> + <xs:enumeration value="CLASS_110"/> + <xs:enumeration value="CLASS_125"/> + <xs:enumeration value="CLASS_150"/> + <xs:enumeration value="CLASS_175"/> + <xs:enumeration value="CLASS_200"/> + <xs:enumeration value="CLASS_250"/> + <xs:enumeration value="CLASS_300"/> + <xs:enumeration value="CLASS_400"/> + <xs:enumeration value="CLASS_500"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="FreightCommitDetail"> + <xs:annotation> + <xs:documentation>Information about the Freight Service Centers associated with this shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="OriginDetail" type="ns:FreightServiceCenterDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Information about the origin Freight Service Center.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DestinationDetail" type="ns:FreightServiceCenterDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Information about the destination Freight Service Center.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalDistance" type="ns:Distance" minOccurs="0"> + <xs:annotation> + <xs:documentation>The distance between the origin and destination FreightService Centers</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="FreightGuaranteeDetail"> + <xs:sequence> + <xs:element name="Type" type="ns:FreightGuaranteeType" minOccurs="0"/> + <xs:element name="Date" type="xs:date" minOccurs="0"> + <xs:annotation> + <xs:documentation>Date for all Freight guarantee types.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Time" type="xs:time" minOccurs="0"> + <xs:annotation> + <xs:documentation>Time for GUARANTEED_TIME only.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="FreightGuaranteeType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="GUARANTEED_DATE"/> + <xs:enumeration value="GUARANTEED_MORNING"/> + <xs:enumeration value="GUARANTEED_TIME"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="FreightOnValueType"> + <xs:annotation> + <xs:documentation>Identifies responsibilities with respect to loss, damage, etc.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CARRIER_RISK"/> + <xs:enumeration value="OWN_RISK"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="FreightRateDetail"> + <xs:annotation> + <xs:documentation>Rate data specific to FedEx Freight or FedEx National Freight services.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="QuoteNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A unique identifier for a specific rate quotation.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BaseChargeCalculation" type="ns:FreightBaseChargeCalculationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the way in which base charges for a Freight shipment are calculated.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BaseCharges" type="ns:FreightBaseCharge" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Freight charges which accumulate to the total base charge for the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Notations" type="ns:FreightRateNotation" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Human-readable descriptions of additional information on this shipment rating.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="FreightRateNotation"> + <xs:annotation> + <xs:documentation>Additional non-monetary data returned with Freight rates.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Code" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Unique identifier for notation.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Description" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Human-readable explanation of notation.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="FreightServiceCenterDetail"> + <xs:annotation> + <xs:documentation>This class describes the relationship between a customer-specified address and the FedEx Freight / FedEx National Freight Service Center that supports that address.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="InterlineCarrierCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Freight Industry standard non-FedEx carrier identification</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="InterlineCarrierName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The name of the Interline carrier.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AdditionalDays" type="xs:int" minOccurs="0"> + <xs:annotation> + <xs:documentation>Additional time it might take at the origin or destination to pickup or deliver the freight. This is usually due to the remoteness of the location. This time is included in the total transit time.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocalService" type="ns:ServiceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Service branding which may be used for local pickup or delivery, distinct from service used for line-haul of customer's shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocalDistance" type="ns:Distance" minOccurs="0"> + <xs:annotation> + <xs:documentation>Distance between customer address (pickup or delivery) and the supporting Freight / National Freight service center.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocalDuration" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Time to travel between customer address (pickup or delivery) and the supporting Freight / National Freight service center.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocalServiceScheduling" type="ns:FreightServiceSchedulingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies when/how the customer can arrange for pickup or delivery.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LimitedServiceDays" type="ns:DayOfWeekType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Specifies days of operation if localServiceScheduling is LIMITED.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="GatewayLocationId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Freight service center that is a gateway on the border of Canada or Mexico.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Location" minOccurs="0" type="xs:string"> + <xs:annotation> + <xs:documentation>Alphabetical code identifying a Freight Service Center</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ContactAndAddress" minOccurs="0" type="ns:ContactAndAddress"> + <xs:annotation> + <xs:documentation>Freight service center Contact and Address</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="FreightServiceSchedulingType"> + <xs:annotation> + <xs:documentation>Specifies the type of service scheduling offered from a Freight or National Freight Service Center to a customer-supplied address.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="LIMITED"/> + <xs:enumeration value="STANDARD"/> + <xs:enumeration value="WILL_CALL"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="FreightShipmentDetail"> + <xs:annotation> + <xs:documentation>Data applicable to shipments using FEDEX_FREIGHT and FEDEX_NATIONAL_FREIGHT services.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="FedExFreightAccountNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Account number used with FEDEX_FREIGHT service.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FedExFreightBillingContactAndAddress" type="ns:ContactAndAddress" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used for validating FedEx Freight account number and (optionally) identifying third party payment on the bill of lading.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FedExNationalFreightAccountNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Account number used with FEDEX_NATIONAL_FREIGHT service.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FedExNationalFreightBillingContactAndAddress" type="ns:ContactAndAddress" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used for validating FedEx National Freight account number and (optionally) identifying third party payment on the bill of lading.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Role" type="ns:FreightShipmentRoleType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the role of the party submitting the transaction.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PaymentType" type="ns:FreightAccountPaymentType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Designates which of the requester's tariffs will be used for rating.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DeclaredValuePerUnit" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the declared value for the shipment</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DeclaredValueUnits" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the declared value units corresponding to the above defined declared value</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LiabilityCoverageDetail" type="ns:LiabilityCoverageDetail" minOccurs="0"/> + <xs:element name="Coupons" type="xs:string" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Identifiers for promotional discounts offered to customers.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalHandlingUnits" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total number of individual handling units in the entire shipment (for unit pricing).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ClientDiscountPercent" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>Estimated discount rate provided by client for unsecured rate quote.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PalletWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total weight of pallets used in shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShipmentDimensions" type="ns:Dimensions" minOccurs="0"> + <xs:annotation> + <xs:documentation>Overall shipment dimensions.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Comment" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Description for the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SpecialServicePayments" type="ns:FreightSpecialServicePayment" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Specifies which party will pay surcharges for any special services which support split billing.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LineItems" type="ns:FreightShipmentLineItem" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Details of the commodities in the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="FreightShipmentLineItem"> + <xs:annotation> + <xs:documentation>Description of an individual commodity or class of content in a shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="FreightClass" type="ns:FreightClassType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Freight class for this line item.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Packaging" type="ns:PhysicalPackagingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specification of handling-unit packaging for this commodity or class line.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Description" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Customer-provided description for this commodity or class line.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Weight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Weight for this commodity or class line.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Dimensions" type="ns:Dimensions" minOccurs="0"> + <xs:annotation> + <xs:documentation>FED EX INTERNAL USE ONLY - Individual line item dimensions.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Volume" type="ns:Volume" minOccurs="0"> + <xs:annotation> + <xs:documentation>Volume (cubic measure) for this commodity or class line.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="FreightShipmentRoleType"> + <xs:annotation> + <xs:documentation>Indicates the role of the party submitting the transaction.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CONSIGNEE"/> + <xs:enumeration value="SHIPPER"/> + <xs:enumeration value="THIRD_PARTY"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="FreightSpecialServicePayment"> + <xs:annotation> + <xs:documentation>Specifies which party will be responsible for payment of any surcharges for Freight special services for which split billing is allowed.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="SpecialService" type="ns:ShipmentSpecialServiceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the special service.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PaymentType" type="ns:FreightAccountPaymentType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates who will pay for the special service.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="GeneralAgencyAgreementDetail"> + <xs:annotation> + <xs:documentation>Data required to produce a General Agency Agreement document. Remaining content (business data) to be defined once requirements have been completed.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Format" type="ns:ShippingDocumentFormat" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="HazardousCommodityContent"> + <xs:annotation> + <xs:documentation>Documents the kind and quantity of an individual hazardous commodity in a package.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Description" type="ns:HazardousCommodityDescription" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies and describes an individual hazardous commodity.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Quantity" type="ns:HazardousCommodityQuantityDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the amount of the commodity in alternate units.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Options" type="ns:HazardousCommodityOptionDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Customer-provided specifications for handling individual commodities.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="HazardousCommodityDescription"> + <xs:annotation> + <xs:documentation>Identifies and describes an individual hazardous commodity. For 201001 load, this is based on data from the FedEx Ground Hazardous Materials Shipping Guide.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Id" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Regulatory identifier for a commodity (e.g. "UN ID" value).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PackingGroup" type="ns:HazardousCommodityPackingGroupType" minOccurs="0"/> + <xs:element name="ProperShippingName" type="xs:string" minOccurs="0"/> + <xs:element name="TechnicalName" type="xs:string" minOccurs="0"/> + <xs:element name="HazardClass" type="xs:string" minOccurs="0"/> + <xs:element name="SubsidiaryClasses" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="LabelText" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="HazardousCommodityLabelTextOptionType"> + <xs:annotation> + <xs:documentation>Specifies how the commodity is to be labeled.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="APPEND"/> + <xs:enumeration value="OVERRIDE"/> + <xs:enumeration value="STANDARD"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="HazardousCommodityOptionDetail"> + <xs:annotation> + <xs:documentation>Customer-provided specifications for handling individual commodities.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="LabelTextOption" type="ns:HazardousCommodityLabelTextOptionType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies how the customer wishes the label text to be handled for this commodity in this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomerSuppliedLabelText" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Text used in labeling the commodity under control of the labelTextOption field.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="HazardousCommodityOptionType"> + <xs:annotation> + <xs:documentation>Indicates which kind of hazardous content (as defined by DOT) is being reported.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="HAZARDOUS_MATERIALS"/> + <xs:enumeration value="LITHIUM_BATTERY_EXCEPTION"/> + <xs:enumeration value="ORM_D"/> + <xs:enumeration value="REPORTABLE_QUANTITIES"/> + <xs:enumeration value="SMALL_QUANTITY_EXCEPTION"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="HazardousCommodityPackagingDetail"> + <xs:annotation> + <xs:documentation>Identifies number and type of packaging units for hazardous commodities.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Count" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Number of units of the type below.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Units" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Units in which the hazardous commodity is packaged.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="HazardousCommodityPackingGroupType"> + <xs:annotation> + <xs:documentation>Identifies DOT packing group for a hazardous commodity.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="I"/> + <xs:enumeration value="II"/> + <xs:enumeration value="III"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="HazardousCommodityQuantityDetail"> + <xs:annotation> + <xs:documentation>Identifies amount and units for quantity of hazardous commodities.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Amount" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>Number of units of the type below.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Units" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Units by which the hazardous commodity is measured.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="HoldAtLocationDetail"> + <xs:annotation> + <xs:documentation>Descriptive data required for a FedEx shipment that is to be held at the destination FedEx location for pickup by the recipient.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="PhoneNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Contact phone number for recipient of shipment.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>15</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="LocationContactAndAddress" type="ns:ContactAndAddress" minOccurs="0"> + <xs:annotation> + <xs:documentation>Contact and address of FedEx facility at which shipment is to be held.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocationType" type="ns:FedExLocationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Type of facility at which package/shipment is to be held.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocationId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Location identification (for facilities identified by an alphanumeric location code).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocationNumber" type="xs:int" minOccurs="0"> + <xs:annotation> + <xs:documentation>Location identification (for facilities identified by an numeric location code).</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="HomeDeliveryPremiumDetail"> + <xs:annotation> + <xs:documentation>The descriptive data required by FedEx for home delivery services.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="HomeDeliveryPremiumType" type="ns:HomeDeliveryPremiumType" minOccurs="1"> + </xs:element> + <xs:element name="Date" type="xs:date" minOccurs="0"> + <xs:annotation> + <xs:documentation>Required for Date Certain Home Delivery.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PhoneNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Required for Date Certain and Appointment Home Delivery.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>15</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="HomeDeliveryPremiumType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="APPOINTMENT"/> + <xs:enumeration value="DATE_CERTAIN"/> + <xs:enumeration value="EVENING"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="ImageId"> + <xs:restriction base="xs:string"> + <xs:enumeration value="IMAGE_1"/> + <xs:enumeration value="IMAGE_2"/> + <xs:enumeration value="IMAGE_3"/> + <xs:enumeration value="IMAGE_4"/> + <xs:enumeration value="IMAGE_5"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="InternationalDocumentContentType"> + <xs:annotation> + <xs:documentation>The type of International shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="DOCUMENTS_ONLY"/> + <xs:enumeration value="NON_DOCUMENTS"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="LabelFormatType"> + <xs:annotation> + <xs:documentation>Specifies the type of label to be returned.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="COMMON2D"/> + <xs:enumeration value="LABEL_DATA_ONLY"/> + <xs:enumeration value="MAILROOM"/> + <xs:enumeration value="NO_LABEL"/> + <xs:enumeration value="PRE_COMMON2D"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="LabelMaskableDataType"> + <xs:annotation> + <xs:documentation>Names for data elements / areas which may be suppressed from printing on labels.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CUSTOMS_VALUE"/> + <xs:enumeration value="DIMENSIONS"/> + <xs:enumeration value="DUTIES_AND_TAXES_PAYOR_ACCOUNT_NUMBER"/> + <xs:enumeration value="FREIGHT_PAYOR_ACCOUNT_NUMBER"/> + <xs:enumeration value="PACKAGE_SEQUENCE_AND_COUNT"/> + <xs:enumeration value="SHIPPER_ACCOUNT_NUMBER"/> + <xs:enumeration value="SUPPLEMENTAL_LABEL_DOC_TAB"/> + <xs:enumeration value="TERMS_AND_CONDITIONS"/> + <xs:enumeration value="TOTAL_WEIGHT"/> + <xs:enumeration value="TRANSPORTATION_CHARGES_PAYOR_ACCOUNT_NUMBER"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="LabelPrintingOrientationType"> + <xs:annotation> + <xs:documentation>This indicates if the top or bottom of the label comes out of the printer first.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BOTTOM_EDGE_OF_TEXT_FIRST"/> + <xs:enumeration value="TOP_EDGE_OF_TEXT_FIRST"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="LabelRotationType"> + <xs:annotation> + <xs:documentation>Relative to normal orientation for the printer. RIGHT=90 degrees clockwise, UPSIDE_DOWN=180 degrees, LEFT=90 degrees counterclockwise.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="LEFT"/> + <xs:enumeration value="NONE"/> + <xs:enumeration value="RIGHT"/> + <xs:enumeration value="UPSIDE_DOWN"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="LabelSpecification"> + <xs:annotation> + <xs:documentation>Description of shipping label to be returned in the reply</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="LabelFormatType" type="ns:LabelFormatType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specify type of label to be returned</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ImageType" type="ns:ShippingDocumentImageType" minOccurs="0"> + <xs:annotation> + <xs:documentation> + The type of image or printer commands the label is to be formatted in. + DPL = Unimark thermal printer language + EPL2 = Eltron thermal printer language + PDF = a label returned as a pdf image + PNG = a label returned as a png image + ZPLII = Zebra thermal printer language + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LabelStockType" type="ns:LabelStockType" minOccurs="0"> + <xs:annotation> + <xs:documentation>For thermal printer lables this indicates the size of the label and the location of the doc tab if present.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LabelPrintingOrientation" type="ns:LabelPrintingOrientationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>This indicates if the top or bottom of the label comes out of the printer first.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LabelRotation" type="ns:LabelRotationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Relative to normal orientation for the printer. RIGHT=90 degrees clockwise, UPSIDE_DOWN=180 degrees, LEFT=90 degrees counterclockwise.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PrintedLabelOrigin" type="ns:ContactAndAddress" minOccurs="0"> + <xs:annotation> + <xs:documentation>If present, this contact and address information will replace the return address information on the label.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomerSpecifiedDetail" type="ns:CustomerSpecifiedLabelDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Allows customer-specified control of label content.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="LabelStockType"> + <xs:annotation> + <xs:documentation>For thermal printer labels this indicates the size of the label and the location of the doc tab if present.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="PAPER_4X6"/> + <xs:enumeration value="PAPER_4X8"/> + <xs:enumeration value="PAPER_4X9"/> + <xs:enumeration value="PAPER_7X4.75"/> + <xs:enumeration value="PAPER_8.5X11_BOTTOM_HALF_LABEL"/> + <xs:enumeration value="PAPER_8.5X11_TOP_HALF_LABEL"/> + <xs:enumeration value="STOCK_4X6"/> + <xs:enumeration value="STOCK_4X6.75_LEADING_DOC_TAB"/> + <xs:enumeration value="STOCK_4X6.75_TRAILING_DOC_TAB"/> + <xs:enumeration value="STOCK_4X8"/> + <xs:enumeration value="STOCK_4X9_LEADING_DOC_TAB"/> + <xs:enumeration value="STOCK_4X9_TRAILING_DOC_TAB"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="LiabilityCoverageDetail"> + <xs:sequence> + <xs:element name="CoverageType" type="ns:LiabilityCoverageType" minOccurs="0"/> + <xs:element name="CoverageAmount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the Liability Coverage Amount. For Jan 2010 this value represents coverage amount per pound</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="LiabilityCoverageType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="NEW"/> + <xs:enumeration value="USED_OR_RECONDITIONED"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="LinearMeasure"> + <xs:annotation> + <xs:documentation>Represents a one-dimensional measurement in small units (e.g. suitable for measuring a package or document), contrasted with Distance, which represents a large one-dimensional measurement (e.g. distance between cities).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Value" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>The numerical quantity of this measurement.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Units" type="ns:LinearUnits" minOccurs="0"> + <xs:annotation> + <xs:documentation>The units for this measurement.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="LinearUnits"> + <xs:annotation> + <xs:documentation>CM = centimeters, IN = inches</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CM"/> + <xs:enumeration value="IN"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Localization"> + <xs:annotation> + <xs:documentation>Identifies the representation of human-readable text.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="LanguageCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Two-letter code for language (e.g. EN, FR, etc.)</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LocaleCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Two-letter code for the region (e.g. us, ca, etc..).</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Measure"> + <xs:sequence> + <xs:element name="Quantity" type="xs:decimal" minOccurs="0"/> + <xs:element name="Units" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="MinimumChargeType"> + <xs:annotation> + <xs:documentation>Internal FedEx use only.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CUSTOMER"/> + <xs:enumeration value="CUSTOMER_FREIGHT_WEIGHT"/> + <xs:enumeration value="EARNED_DISCOUNT"/> + <xs:enumeration value="MIXED"/> + <xs:enumeration value="RATE_SCALE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Money"> + <xs:sequence> + <xs:element name="Currency" type="xs:string" minOccurs="0"/> + <xs:element name="Amount" type="xs:decimal" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="NaftaCertificateOfOriginDetail"> + <xs:annotation> + <xs:documentation>Data required to produce a Certificate of Origin document.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Format" type="ns:ShippingDocumentFormat" minOccurs="0"/> + <xs:element name="BlanketPeriod" type="ns:DateRange" minOccurs="0"/> + <xs:element name="ImporterSpecification" type="ns:NaftaImporterSpecificationType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates which Party (if any) from the shipment is to be used as the source of importer data on the NAFTA COO form.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SignatureContact" type="ns:Contact" minOccurs="0"> + <xs:annotation> + <xs:documentation>Contact information for "Authorized Signature" area of form.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ProducerSpecification" type="ns:NaftaProducerSpecificationType" minOccurs="0"/> + <xs:element name="Producers" type="ns:NaftaProducer" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="CustomerImageUsages" type="ns:CustomerImageUsage" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="NaftaCommodityDetail"> + <xs:sequence> + <xs:element name="PreferenceCriterion" type="ns:NaftaPreferenceCriterionCode" minOccurs="0"> + <xs:annotation> + <xs:documentation>Defined by NAFTA regulations.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ProducerDetermination" type="ns:NaftaProducerDeterminationCode" minOccurs="0"> + <xs:annotation> + <xs:documentation>Defined by NAFTA regulations.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ProducerId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identification of which producer is associated with this commodity (if multiple producers are used in a single shipment).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NetCostMethod" type="ns:NaftaNetCostMethodCode" minOccurs="0"/> + <xs:element name="NetCostDateRange" type="ns:DateRange" minOccurs="0"> + <xs:annotation> + <xs:documentation>Date range over which RVC net cost was calculated.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="NaftaImporterSpecificationType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="IMPORTER_OF_RECORD"/> + <xs:enumeration value="RECIPIENT"/> + <xs:enumeration value="UNKNOWN"/> + <xs:enumeration value="VARIOUS"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="NaftaNetCostMethodCode"> + <xs:annotation> + <xs:documentation> + Net cost method used. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="NC"/> + <xs:enumeration value="NO"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="NaftaPreferenceCriterionCode"> + <xs:annotation> + <xs:documentation>See instructions for NAFTA Certificate of Origin for code definitions.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="A"/> + <xs:enumeration value="B"/> + <xs:enumeration value="C"/> + <xs:enumeration value="D"/> + <xs:enumeration value="E"/> + <xs:enumeration value="F"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="NaftaProducer"> + <xs:sequence> + <xs:element name="Id" type="xs:string" minOccurs="0"/> + <xs:element name="Producer" type="ns:Party" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="NaftaProducerDeterminationCode"> + <xs:annotation> + <xs:documentation>See instructions for NAFTA Certificate of Origin for code definitions.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="NO_1"/> + <xs:enumeration value="NO_2"/> + <xs:enumeration value="NO_3"/> + <xs:enumeration value="YES"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="NaftaProducerSpecificationType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="AVAILABLE_UPON_REQUEST"/> + <xs:enumeration value="MULTIPLE_SPECIFIED"/> + <xs:enumeration value="SAME"/> + <xs:enumeration value="SINGLE_SPECIFIED"/> + <xs:enumeration value="UNKNOWN"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Notification"> + <xs:annotation> + <xs:documentation>The descriptive data regarding the result of the submitted transaction.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Severity" type="ns:NotificationSeverityType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The severity of this notification. This can indicate success or failure or some other information about the request. The values that can be returned are SUCCESS - Your transaction succeeded with no other applicable information. NOTE - Additional information that may be of interest to you about your transaction. WARNING - Additional information that you need to know about your transaction that you may need to take action on. ERROR - Information about an error that occurred while processing your transaction. FAILURE - FedEx was unable to process your transaction at this time due to a system failure. Please try again later</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Source" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the source of this notification. Combined with the Code it uniquely identifies this notification</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Code" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A code that represents this notification. Combined with the Source it uniquely identifies this notification.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>8</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Message" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Human-readable text that explains this notification.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>255</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="LocalizedMessage" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The translated message. The language and locale specified in the ClientDetail. Localization are used to determine the representation. Currently only supported in a TrackReply.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MessageParameters" type="ns:NotificationParameter" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>A collection of name/value pairs that provide specific data to help the client determine the nature of an error (or warning, etc.) witout having to parse the message string.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="NotificationParameter"> + <xs:sequence> + <xs:element name="Id" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the type of data contained in Value (e.g. SERVICE_TYPE, PACKAGE_SEQUENCE, etc..).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Value" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The value of the parameter (e.g. PRIORITY_OVERNIGHT, 2, etc..).</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="NotificationSeverityType"> + <xs:annotation> + <xs:documentation>Identifies the set of severity values for a Notification.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ERROR"/> + <xs:enumeration value="FAILURE"/> + <xs:enumeration value="NOTE"/> + <xs:enumeration value="SUCCESS"/> + <xs:enumeration value="WARNING"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Op900Detail"> + <xs:annotation> + <xs:documentation>The instructions indicating how to print the OP-900 form for hazardous materials packages.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Format" type="ns:ShippingDocumentFormat" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies characteristics of a shipping document to be produced.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Reference" type="ns:CustomerReferenceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies which reference type (from the package's customer references) is to be used as the source for the reference on this OP-900.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomerImageUsages" type="ns:CustomerImageUsage" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Specifies the usage and identification of customer supplied images to be used on this document.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SignatureName" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Data field to be used when a name is to be printed in the document instead of (or in addition to) a signature image.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="OversizeClassType"> + <xs:annotation> + <xs:documentation>The Oversize classification for a package.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="OVERSIZE_1"/> + <xs:enumeration value="OVERSIZE_2"/> + <xs:enumeration value="OVERSIZE_3"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="PackageRateDetail"> + <xs:annotation> + <xs:documentation>Data for a package's rates, as calculated per a specific rate type.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="RateType" type="ns:ReturnedRateType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Type used for this specific set of rate data.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RatedWeightMethod" type="ns:RatedWeightMethod" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates which weight was used.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MinimumChargeType" type="ns:MinimumChargeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Internal FedEx use only.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BillingWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>The weight that was used to calculate the rate.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DimWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>The dimensional weight of this package (if greater than actual).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="OversizeWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>The oversize weight of this package (if the package is oversize).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="BaseCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The transportation charge only (prior to any discounts applied) for this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalFreightDiscounts" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The sum of all discounts on this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NetFreight" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>This package's baseCharge - totalFreightDiscounts.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalSurcharges" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The sum of all surcharges on this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NetFedExCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>This package's netFreight + totalSurcharges (not including totalTaxes).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalTaxes" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The sum of all taxes on this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NetCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>This package's netFreight + totalSurcharges + totalTaxes.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalRebates" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The total sum of all rebates applied to this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightDiscounts" type="ns:RateDiscount" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All rate discounts that apply to this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Rebates" type="ns:Rebate" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All rebates that apply to this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Surcharges" type="ns:Surcharge" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All surcharges that apply to this package (either because of characteristics of the package itself, or because it is carrying per-shipment surcharges for the shipment of which it is a part).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Taxes" type="ns:Tax" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All taxes applicable (or distributed to) this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="VariableHandlingCharges" type="ns:VariableHandlingCharges" minOccurs="0"> + <xs:annotation> + <xs:documentation>The variable handling charges calculated based on the type variable handling charges requested.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="PackageSpecialServiceType"> + <xs:annotation> + <xs:documentation>Identifies the collection of special services offered by FedEx.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="APPOINTMENT_DELIVERY"/> + <xs:enumeration value="COD"/> + <xs:enumeration value="DANGEROUS_GOODS"/> + <xs:enumeration value="DRY_ICE"/> + <xs:enumeration value="NON_STANDARD_CONTAINER"/> + <xs:enumeration value="PRIORITY_ALERT"/> + <xs:enumeration value="SIGNATURE_OPTION"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="PackageSpecialServicesRequested"> + <xs:annotation> + <xs:documentation>These special services are available at the package level for some or all service types. If the shipper is requesting a special service which requires additional data, the package special service type must be present in the specialServiceTypes collection, and the supporting detail must be provided in the appropriate sub-object below.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="SpecialServiceTypes" type="ns:PackageSpecialServiceType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>The types of all special services requested for the enclosing shipment or package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CodDetail" type="ns:CodDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>For use with FedEx Ground services only; COD must be present in shipment's special services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DangerousGoodsDetail" type="ns:DangerousGoodsDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data required for a FedEx shipment containing dangerous materials. This element is required when SpecialServiceType.DANGEROUS_GOODS or HAZARDOUS_MATERIAL is present in the SpecialServiceTypes collection.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DryIceWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data required for a FedEx shipment containing dry ice. This element is required when SpecialServiceType.DRY_ICE is present in the SpecialServiceTypes collection.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SignatureOptionDetail" type="ns:SignatureOptionDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>The descriptive data required for FedEx signature services. This element is required when SpecialServiceType.SIGNATURE_OPTION is present in the SpecialServiceTypes collection.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PriorityAlertDetail" type="ns:PriorityAlertDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>To be filled.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="PackagingType"> + <xs:annotation> + <xs:documentation>Identifies the packaging used by the requestor for the package. See PackagingType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FEDEX_10KG_BOX"/> + <xs:enumeration value="FEDEX_25KG_BOX"/> + <xs:enumeration value="FEDEX_BOX"/> + <xs:enumeration value="FEDEX_ENVELOPE"/> + <xs:enumeration value="FEDEX_PAK"/> + <xs:enumeration value="FEDEX_TUBE"/> + <xs:enumeration value="YOUR_PACKAGING"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Party"> + <xs:annotation> + <xs:documentation>The descriptive data for a person or company entitiy doing business with FedEx.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="AccountNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the FedEx account number assigned to the customer.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>12</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Tins" type="ns:TaxpayerIdentification" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Descriptive data for taxpayer identification information.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Contact" type="ns:Contact" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data identifying the point-of-contact person.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Address" type="ns:Address" minOccurs="0"> + <xs:annotation> + <xs:documentation>The descriptive data for a physical location.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Payment"> + <xs:annotation> + <xs:documentation>The descriptive data for the monetary compensation given to FedEx for services rendered to the customer.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="PaymentType" type="ns:PaymentType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the method of payment for a service. See PaymentType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Payor" type="ns:Payor" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data identifying the party responsible for payment for a service.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="PaymentType"> + <xs:annotation> + <xs:documentation>Identifies the method of payment for a service.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="SENDER"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Payor"> + <xs:annotation> + <xs:documentation>Descriptive data identifying the party responsible for payment for a service.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="AccountNumber" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the FedEx account number assigned to the payor.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>12</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="CountryCode" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the country of the payor.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="PendingShipmentDetail"> + <xs:annotation> + <xs:documentation>This information describes the kind of pending shipment being requested.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Type" type="ns:PendingShipmentType"> + </xs:element> + <xs:element name="ExpirationDate" type="xs:dateTime" minOccurs="0"> + <xs:annotation> + <xs:documentation>Date after which the pending shipment will no longer be available for completion.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EmailLabelDetail" type="ns:EMailLabelDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Only used with type of EMAIL.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="PendingShipmentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="EMAIL"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="PhysicalPackagingType"> + <xs:annotation> + <xs:documentation>This enumeration rationalizes the former FedEx Express international "admissibility package" types (based on ANSI X.12) and the FedEx Freight packaging types. The values represented are those common to both carriers.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BAG"/> + <xs:enumeration value="BARREL"/> + <xs:enumeration value="BASKET"/> + <xs:enumeration value="BOX"/> + <xs:enumeration value="BUCKET"/> + <xs:enumeration value="BUNDLE"/> + <xs:enumeration value="CARTON"/> + <xs:enumeration value="CASE"/> + <xs:enumeration value="CONTAINER"/> + <xs:enumeration value="CRATE"/> + <xs:enumeration value="CYLINDER"/> + <xs:enumeration value="DRUM"/> + <xs:enumeration value="ENVELOPE"/> + <xs:enumeration value="HAMPER"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="PAIL"/> + <xs:enumeration value="PALLET"/> + <xs:enumeration value="PIECE"/> + <xs:enumeration value="REEL"/> + <xs:enumeration value="ROLL"/> + <xs:enumeration value="SKID"/> + <xs:enumeration value="TANK"/> + <xs:enumeration value="TUBE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="PickupDetail"> + <xs:annotation> + <xs:documentation>This class describes the pickup characteristics of a shipment (e.g. for use in a tag request).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ReadyDateTime" type="xs:dateTime" minOccurs="0"/> + <xs:element name="LatestPickupDateTime" type="xs:dateTime" minOccurs="0"/> + <xs:element name="CourierInstructions" type="xs:string" minOccurs="0"/> + <xs:element name="RequestType" type="ns:PickupRequestType" minOccurs="0"/> + <xs:element name="RequestSource" type="ns:PickupRequestSourceType" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="PickupRequestSourceType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="AUTOMATION"/> + <xs:enumeration value="CUSTOMER_SERVICE"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="PickupRequestType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="FUTURE_DAY"/> + <xs:enumeration value="SAME_DAY"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="PricingCodeType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="ACTUAL"/> + <xs:enumeration value="ALTERNATE"/> + <xs:enumeration value="BASE"/> + <xs:enumeration value="HUNDREDWEIGHT"/> + <xs:enumeration value="HUNDREDWEIGHT_ALTERNATE"/> + <xs:enumeration value="INTERNATIONAL_DISTRIBUTION"/> + <xs:enumeration value="INTERNATIONAL_ECONOMY_SERVICE"/> + <xs:enumeration value="LTL_FREIGHT"/> + <xs:enumeration value="PACKAGE"/> + <xs:enumeration value="SHIPMENT"/> + <xs:enumeration value="SHIPMENT_FIVE_POUND_OPTIONAL"/> + <xs:enumeration value="SHIPMENT_OPTIONAL"/> + <xs:enumeration value="SPECIAL"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="PriorityAlertDetail"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Content" type="xs:string" minOccurs="0" maxOccurs="3"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="PurposeOfShipmentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="GIFT"/> + <xs:enumeration value="NOT_SOLD"/> + <xs:enumeration value="PERSONAL_EFFECTS"/> + <xs:enumeration value="REPAIR_AND_RETURN"/> + <xs:enumeration value="SAMPLE"/> + <xs:enumeration value="SOLD"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="RateDimensionalDivisorType"> + <xs:annotation> + <xs:documentation>Identifies the type of dim divisor that was applied.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="COUNTRY"/> + <xs:enumeration value="CUSTOMER"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="PRODUCT"/> + <xs:enumeration value="WAIVED"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="RateDiscount"> + <xs:annotation> + <xs:documentation>Identifies a discount applied to the shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="RateDiscountType" type="ns:RateDiscountType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the type of discount applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Description" type="xs:string" minOccurs="0"/> + <xs:element name="Amount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The amount of the discount applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Percent" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>The percentage of the discount applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="RateDiscountType"> + <xs:annotation> + <xs:documentation>Identifies the type of discount applied to the shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BONUS"/> + <xs:enumeration value="COUPON"/> + <xs:enumeration value="EARNED"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="VOLUME"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="RateReply"> + <xs:annotation> + <xs:documentation>The response to a RateRequest. The Notifications indicate whether the request was successful or not.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="HighestSeverity" type="ns:NotificationSeverityType" minOccurs="1"> + <xs:annotation> + <xs:documentation>This indicates the highest level of severity of all the notifications returned in this reply.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Notifications" type="ns:Notification" minOccurs="1" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>The descriptive data regarding the results of the submitted transaction.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TransactionDetail" type="ns:TransactionDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Contains the CustomerTransactionId that was sent in the request.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Version" type="ns:VersionId"> + <xs:annotation> + <xs:documentation>The version of this reply.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RateReplyDetails" type="ns:RateReplyDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Each element contains all rate data for a single service. If service was specified in the request, there will be a single entry in this array; if service was omitted in the request, there will be a separate entry in this array for each service being compared.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="RateReplyDetail"> + <xs:sequence> + <xs:element name="ServiceType" type="ns:ServiceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the FedEx service to use in shipping the package. See ServiceType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PackagingType" type="ns:PackagingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the packaging used by the requestor for the package. See PackagingType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AppliedOptions" type="ns:ServiceOptionType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Shows the specific combination of service options combined with the service type that produced this committment in the set returned to the caller.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AppliedSubOptions" type="ns:ServiceSubOptionDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Supporting detail for applied options identified in preceding field.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DeliveryStation" type="xs:string" minOccurs="0"/> + <xs:element name="DeliveryDayOfWeek" type="ns:DayOfWeekType" minOccurs="0"/> + <xs:element name="DeliveryTimestamp" type="xs:dateTime" minOccurs="0"/> + <xs:element name="CommitDetails" type="ns:CommitDetail" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="DestinationAirportId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identification of an airport, using standard three-letter abbreviations.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="IneligibleForMoneyBackGuarantee" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates whether or not this shipment is eligible for a money back guarantee.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="OriginServiceArea" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Commitment code for the origin.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DestinationServiceArea" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Commitment code for the destination.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TransitTime" type="ns:TransitTimeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Time in transit from pickup to delivery.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MaximumTransitTime" type="ns:TransitTimeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Maximum expected transit time.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SignatureOption" type="ns:SignatureOptionType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The signature option for this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ActualRateType" type="ns:ReturnedRateType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The actual rate type of the charges for this package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RatedShipmentDetails" type="ns:RatedShipmentDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Each element contains all rate data for a single rate type.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="RateRequest"> + <xs:annotation> + <xs:documentation>Descriptive data sent to FedEx by a customer in order to rate a package/shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="WebAuthenticationDetail" type="ns:WebAuthenticationDetail" minOccurs="1"> + <xs:annotation> + <xs:documentation>Descriptive data to be used in authentication of the sender's identity (and right to use FedEx web services).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ClientDetail" type="ns:ClientDetail" minOccurs="1"> + <xs:annotation> + <xs:documentation>Descriptive data identifying the client submitting the transaction.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TransactionDetail" type="ns:TransactionDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data for this customer transaction. The TransactionDetail from the request is echoed back to the caller in the corresponding reply.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Version" type="ns:VersionId"> + <xs:annotation> + <xs:documentation>Identifies the version/level of a service operation expected by a caller (in each request) and performed by the callee (in each reply).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ReturnTransitAndCommit" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>Allows the caller to specify that the transit time and commit data are to be returned in the reply.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CarrierCodes" type="ns:CarrierCodeType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Candidate carriers for rate-shopping use case. This field is only considered if requestedShipment/serviceType is omitted.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="VariableOptions" type="ns:ServiceOptionType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Contains zero or more service options whose combinations are to be considered when replying with available services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RequestedShipment" type="ns:RequestedShipment"> + <xs:annotation> + <xs:documentation>The shipment for which a rate quote (or rate-shopping comparison) is desired.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="RateRequestType"> + <xs:annotation> + <xs:documentation>Indicates the type of rates to be returned.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ACCOUNT"/> + <xs:enumeration value="LIST"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="RatedPackageDetail"> + <xs:annotation> + <xs:documentation>If requesting rates using the PackageDetails element (one package at a time) in the request, the rates for each package will be returned in this element. Currently total piece total weight rates are also retuned in this element.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="TrackingIds" type="ns:TrackingId" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Echoed from the corresponding package in the rate request (if provided).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="GroupNumber" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used with request containing PACKAGE_GROUPS, to identify which group of identical packages was used to produce a reply item.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EffectiveNetDiscount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The difference between "list" and "account" net charge.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AdjustedCodCollectionAmount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Ground COD is package level.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="OversizeClass" type="ns:OversizeClassType" minOccurs="0"/> + <xs:element name="PackageRateDetail" type="ns:PackageRateDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Rate data that are tied to a specific package and rate type combination.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="RatedShipmentDetail"> + <xs:annotation> + <xs:documentation>This class groups the shipment and package rating data for a specific rate type for use in a rating reply, which groups result data by rate type.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="EffectiveNetDiscount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The difference between "list" and "account" total net charge.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AdjustedCodCollectionAmount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Ground COD is package level.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShipmentRateDetail" type="ns:ShipmentRateDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>The shipment-level totals for this rate type.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RatedPackages" type="ns:RatedPackageDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>The package-level data for this rate type.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="RatedWeightMethod"> + <xs:annotation> + <xs:documentation>The method used to calculate the weight to be used in rating the package..</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ACTUAL"/> + <xs:enumeration value="AVERAGE_PACKAGE_WEIGHT_MINIMUM"/> + <xs:enumeration value="BALLOON"/> + <xs:enumeration value="DIM"/> + <xs:enumeration value="FREIGHT_MINIMUM"/> + <xs:enumeration value="MIXED"/> + <xs:enumeration value="OVERSIZE"/> + <xs:enumeration value="OVERSIZE_1"/> + <xs:enumeration value="OVERSIZE_2"/> + <xs:enumeration value="OVERSIZE_3"/> + <xs:enumeration value="PACKAGING_MINIMUM"/> + <xs:enumeration value="WEIGHT_BREAK"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Rebate"> + <xs:annotation> + <xs:documentation>Identifies a discount applied to the shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="RebateType" type="ns:RebateType" minOccurs="0"/> + <xs:element name="Description" type="xs:string" minOccurs="0"/> + <xs:element name="Amount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The amount of the discount applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Percent" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>The percentage of the discount applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="RebateType"> + <xs:annotation> + <xs:documentation>Identifies the type of discount applied to the shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BONUS"/> + <xs:enumeration value="EARNED"/> + <xs:enumeration value="OTHER"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="RecipientCustomsId"> + <xs:annotation> + <xs:documentation>Specifies how the recipient is identified for customs purposes; the requirements on this information vary with destination country.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Type" type="ns:RecipientCustomsIdType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the kind of identification being used.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Value" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Contains the actual ID value, of the type specified above.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="RecipientCustomsIdType"> + <xs:annotation> + <xs:documentation>Type of Brazilian taxpayer identifier provided in Recipient/TaxPayerIdentification/Number. For shipments bound for Brazil this overrides the value in Recipient/TaxPayerIdentification/TinType</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="COMPANY"/> + <xs:enumeration value="INDIVIDUAL"/> + <xs:enumeration value="PASSPORT"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="RegulatoryControlType"> + <xs:annotation> + <xs:documentation>FOOD_OR_PERISHABLE is required by FDA/BTA; must be true for food/perishable items coming to US or PR from non-US/non-PR origin</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="EU_CIRCULATION"/> + <xs:enumeration value="FOOD_OR_PERISHABLE"/> + <xs:enumeration value="NAFTA"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="RequestedPackageDetailType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="INDIVIDUAL_PACKAGES"/> + <xs:enumeration value="PACKAGE_GROUPS"/> + <xs:enumeration value="PACKAGE_SUMMARY"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="RequestedPackageLineItem"> + <xs:annotation> + <xs:documentation>This class rationalizes RequestedPackage and RequestedPackageSummary from previous interfaces. The way in which it is uses within a RequestedShipment depends on the RequestedPackageDetailType value specified for that shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="SequenceNumber" type="xs:positiveInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used only with INDIVIDUAL_PACKAGE, as a unique identifier of each requested package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="GroupNumber" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used only with PACKAGE_GROUPS, as a unique identifier of each group of identical packages.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="GroupPackageCount" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used only with PACKAGE_GROUPS, as a count of packages within a group of identical packages.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="VariableHandlingChargeDetail" type="ns:VariableHandlingChargeDetail" minOccurs="0"/> + <xs:element name="InsuredValue" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Only used for INDIVIDUAL_PACKAGES and PACKAGE_GROUPS. Ignored for PACKAGE_SUMMARY, in which case totalInsuredValue and packageCount on the shipment will be used to determine this value.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Weight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Only used for INDIVIDUAL_PACKAGES and PACKAGE_GROUPS. Ignored for PACKAGE_SUMMARY, in which case totalweight and packageCount on the shipment will be used to determine this value.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Dimensions" type="ns:Dimensions" minOccurs="0"/> + <xs:element name="PhysicalPackaging" type="ns:PhysicalPackagingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Provides additional detail on how the customer has physically packaged this item. As of June 2009, required for packages moving under international and SmartPost services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ItemDescription" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Human-readable text describing the package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomerReferences" type="ns:CustomerReference" minOccurs="0" maxOccurs="3"/> + <xs:element name="SpecialServicesRequested" type="ns:PackageSpecialServicesRequested" minOccurs="0"/> + <xs:element name="ContentRecords" type="ns:ContentRecord" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Only used for INDIVIDUAL_PACKAGES and PACKAGE_GROUPS.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="RequestedShipment"> + <xs:annotation> + <xs:documentation>The descriptive data for the shipment being tendered to FedEx.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ShipTimestamp" type="xs:dateTime" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the date and time the package is tendered to FedEx. Both the date and time portions of the string are expected to be used. The date should not be a past date or a date more than 10 days in the future. The time is the local time of the shipment based on the shipper's time zone. The date component must be in the format: YYYY-MM-DD (e.g. 2006-06-26). The time component must be in the format: HH:MM:SS using a 24 hour clock (e.g. 11:00 a.m. is 11:00:00, whereas 5:00 p.m. is 17:00:00). The date and time parts are separated by the letter T (e.g. 2006-06-26T17:00:00). There is also a UTC offset component indicating the number of hours/mainutes from UTC (e.g 2006-06-26T17:00:00-0400 is defined form June 26, 2006 5:00 pm Eastern Time).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DropoffType" type="ns:DropoffType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the method by which the package is to be tendered to FedEx. This element does not dispatch a courier for package pickup. See DropoffType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ServiceType" type="ns:ServiceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the FedEx service to use in shipping the package. See ServiceType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PackagingType" type="ns:PackagingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the packaging used by the requestor for the package. See PackagingType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the total weight of the shipment being conveyed to FedEx.This is only applicable to International shipments and should only be used on the first package of a mutiple piece shipment.This value contains 1 explicit decimal position</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalInsuredValue" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total insured amount.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Shipper" type="ns:Party"> + <xs:annotation> + <xs:documentation>Descriptive data identifying the party responsible for shipping the package. Shipper and Origin should have the same address.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Recipient" type="ns:Party"> + <xs:annotation> + <xs:documentation>Descriptive data identifying the party receiving the package.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RecipientLocationNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>A unique identifier for a recipient location</xs:documentation> + <xs:appinfo> + <xs:MaxLength>10</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Origin" type="ns:ContactAndAddress" minOccurs="0"> + <xs:annotation> + <xs:documentation>Physical starting address for the shipment, if different from shipper's address.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShippingChargesPayment" type="ns:Payment" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data indicating the method and means of payment to FedEx for providing shipping services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SpecialServicesRequested" type="ns:ShipmentSpecialServicesRequested" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data regarding special services requested by the shipper for this shipment. If the shipper is requesting a special service which requires additional data (e.g. COD), the special service type must be present in the specialServiceTypes collection, and the supporting detail must be provided in the appropriate sub-object. For example, to request COD, "COD" must be included in the SpecialServiceTypes collection and the CodDetail object must contain the required data.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ExpressFreightDetail" type="ns:ExpressFreightDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Details specific to an Express freight shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightShipmentDetail" type="ns:FreightShipmentDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Data applicable to shipments using FEDEX_FREIGHT and FEDEX_NATIONAL_FREIGHT services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DeliveryInstructions" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used with Ground Home Delivery and Freight.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="VariableHandlingChargeDetail" type="ns:VariableHandlingChargeDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Details about how to calculate variable handling charges at the shipment level.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomsClearanceDetail" type="ns:CustomsClearanceDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Customs clearance data, used for both international and intra-country shipping.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PickupDetail" type="ns:PickupDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>For use in "process tag" transaction.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SmartPostDetail" type="ns:SmartPostShipmentDetail" minOccurs="0"/> + <xs:element name="BlockInsightVisibility" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>If true, only the shipper/payor will have visibility of this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="LabelSpecification" type="ns:LabelSpecification" minOccurs="0"> + <xs:annotation> + <xs:documentation>Details about the image format and printer type the label is to returned in.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShippingDocumentSpecification" type="ns:ShippingDocumentSpecification" minOccurs="0"> + <xs:annotation> + <xs:documentation>Details such as shipping document types, NAFTA information, CI information, and GAA information.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RateRequestTypes" type="ns:RateRequestType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Specifies whether and what kind of rates the customer wishes to have quoted on this shipment. The reply will also be constrained by other data on the shipment and customer.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EdtRequestType" type="ns:EdtRequestType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies whether the customer wishes to have Estimated Duties and Taxes provided with the rate quotation on this shipment. Only applies with shipments moving under international services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PackageCount" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>For a multiple piece shipment this is the total number of packages in the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PackageDetail" type="ns:RequestedPackageDetailType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies whether packages are described individually, in groups, or summarized in a single description for total-piece-total-weight. This field controls which fields of the RequestedPackageLineItem will be used, and how many occurrences are expected.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RequestedPackageLineItems" type="ns:RequestedPackageLineItem" minOccurs="0" maxOccurs="999"> + <xs:annotation> + <xs:documentation>One or more package-attribute descriptions, each of which describes an individual package, a group of identical packages, or (for the total-piece-total-weight case) common characteristics all packages in the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="RequestedShippingDocumentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="CERTIFICATE_OF_ORIGIN"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:enumeration> + <xs:enumeration value="COMMERCIAL_INVOICE"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:enumeration> + <xs:enumeration value="CUSTOMER_SPECIFIED_LABELS"/> + <xs:enumeration value="GENERAL_AGENCY_AGREEMENT"/> + <xs:enumeration value="LABEL"/> + <xs:enumeration value="NAFTA_CERTIFICATE_OF_ORIGIN"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:enumeration> + <xs:enumeration value="PRO_FORMA_INVOICE"> + <xs:annotation> + <xs:documentation>Currently not supported.</xs:documentation> + </xs:annotation> + </xs:enumeration> + <xs:enumeration value="RETURN_INSTRUCTIONS"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="RequiredShippingDocumentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="CANADIAN_B13A"/> + <xs:enumeration value="CERTIFICATE_OF_ORIGIN"/> + <xs:enumeration value="COMMERCIAL_INVOICE"/> + <xs:enumeration value="INTERNATIONAL_AIRWAY_BILL"/> + <xs:enumeration value="MAIL_SERVICE_AIRWAY_BILL"/> + <xs:enumeration value="SHIPPERS_EXPORT_DECLARATION"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="ReturnEMailAllowedSpecialServiceType"> + <xs:annotation> + <xs:documentation>These values are used to control the availability of certain special services at the time when a customer uses the e-mail label link to create a return shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="SATURDAY_DELIVERY"/> + <xs:enumeration value="SATURDAY_PICKUP"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ReturnEMailDetail"> + <xs:sequence> + <xs:element name="MerchantPhoneNumber" type="xs:string" minOccurs="0"/> + <xs:element name="AllowedSpecialServices" type="ns:ReturnEMailAllowedSpecialServiceType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the allowed (merchant-authorized) special services which may be selected when the subsequent shipment is created. Only services represented in EMailLabelAllowedSpecialServiceType will be controlled by this list.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ReturnShipmentDetail"> + <xs:annotation> + <xs:documentation>Information relating to a return shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ReturnType" type="ns:ReturnType"> + <xs:annotation> + <xs:documentation>The type of return shipment that is being requested. At present the only type of retrun shipment that is supported is PRINT_RETURN_LABEL. With this option you can print a return label to insert into the box of an outbound shipment. This option can not be used to print an outbound label.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Rma" type="ns:Rma" minOccurs="0"> + <xs:annotation> + <xs:documentation>Return Merchant Authorization</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ReturnEMailDetail" type="ns:ReturnEMailDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specific information about the delivery of the email and options for the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ReturnType"> + <xs:annotation> + <xs:documentation>The type of return shipment that is being requested.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FEDEX_TAG"/> + <xs:enumeration value="PENDING"/> + <xs:enumeration value="PRINT_RETURN_LABEL"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="ReturnedRateType"> + <xs:annotation> + <xs:documentation>The "PAYOR..." rates are expressed in the currency identified in the payor's rate table(s). The "RATED..." rates are expressed in the currency of the origin country.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="PAYOR_ACCOUNT_PACKAGE"/> + <xs:enumeration value="PAYOR_ACCOUNT_SHIPMENT"/> + <xs:enumeration value="PAYOR_LIST_PACKAGE"/> + <xs:enumeration value="PAYOR_LIST_SHIPMENT"/> + <xs:enumeration value="RATED_ACCOUNT_PACKAGE"/> + <xs:enumeration value="RATED_ACCOUNT_SHIPMENT"/> + <xs:enumeration value="RATED_LIST_PACKAGE"/> + <xs:enumeration value="RATED_LIST_SHIPMENT"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Rma"> + <xs:annotation> + <xs:documentation>Return Merchant Authorization</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Number" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>Return Merchant Authorization Number</xs:documentation> + <xs:appinfo> + <xs:MaxLength>20</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Reason" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>The reason for the return.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>60</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ServiceOptionType"> + <xs:annotation> + <xs:documentation>These values control the optional features of service that may be combined in a commitment/rate comparision transaction.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FREIGHT_GUARANTEE"/> + <xs:enumeration value="SATURDAY_DELIVERY"/> + <xs:enumeration value="SMART_POST_ALLOWED_INDICIA"/> + <xs:enumeration value="SMART_POST_HUB_ID"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ServiceSubOptionDetail"> + <xs:annotation> + <xs:documentation>Supporting detail for applied options identified in a rate quote.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="FreightGuarantee" type="ns:FreightGuaranteeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the type of Freight Guarantee applied, if FREIGHT_GUARANTEE is applied to the rate quote.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SmartPostHubId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the smartPostHubId used during rate quote, if SMART_POST_HUB_ID is a variable option on the rate request.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SmartPostIndicia" type="ns:SmartPostIndiciaType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the indicia used during rate quote, if SMART_POST_ALLOWED_INDICIA is a variable option on the rate request.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ServiceType"> + <xs:annotation> + <xs:documentation>Identifies the FedEx service to use in shipping the package. See ServiceType for list of valid enumerated values.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="EUROPE_FIRST_INTERNATIONAL_PRIORITY"/> + <xs:enumeration value="FEDEX_1_DAY_FREIGHT"/> + <xs:enumeration value="FEDEX_2_DAY"/> + <xs:enumeration value="FEDEX_2_DAY_FREIGHT"/> + <xs:enumeration value="FEDEX_3_DAY_FREIGHT"/> + <xs:enumeration value="FEDEX_EXPRESS_SAVER"/> + <xs:enumeration value="FEDEX_FREIGHT"/> + <xs:enumeration value="FEDEX_GROUND"/> + <xs:enumeration value="FEDEX_NATIONAL_FREIGHT"/> + <xs:enumeration value="FIRST_OVERNIGHT"/> + <xs:enumeration value="GROUND_HOME_DELIVERY"/> + <xs:enumeration value="INTERNATIONAL_ECONOMY"/> + <xs:enumeration value="INTERNATIONAL_ECONOMY_FREIGHT"/> + <xs:enumeration value="INTERNATIONAL_FIRST"/> + <xs:enumeration value="INTERNATIONAL_GROUND"/> + <xs:enumeration value="INTERNATIONAL_PRIORITY"/> + <xs:enumeration value="INTERNATIONAL_PRIORITY_FREIGHT"/> + <xs:enumeration value="PRIORITY_OVERNIGHT"/> + <xs:enumeration value="SMART_POST"/> + <xs:enumeration value="STANDARD_OVERNIGHT"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ShipmentDryIceDetail"> + <xs:annotation> + <xs:documentation>Shipment-level totals of dry ice data across all packages.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="PackageCount" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total number of packages in the shipment that contain dry ice.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total shipment dry ice weight for all packages.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ShipmentRateDetail"> + <xs:annotation> + <xs:documentation>Data for a shipment's total/summary rates, as calculated per a specific rate type. The "total..." fields may differ from the sum of corresponding package data for Multiweight or Express MPS.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="RateType" type="ns:ReturnedRateType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Type used for this specific set of rate data.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RateScale" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the rate scale used.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>5</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="RateZone" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the rate zone used (based on origin and destination).</xs:documentation> + <xs:appinfo> + <xs:MaxLength>1</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="PricingCode" type="ns:PricingCodeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates the type of pricing used for this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="RatedWeightMethod" type="ns:RatedWeightMethod" minOccurs="0"> + <xs:annotation> + <xs:documentation>Indicates which weight was used.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MinimumChargeType" type="ns:MinimumChargeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>INTERNAL FEDEX USE ONLY.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CurrencyExchangeRate" type="ns:CurrencyExchangeRate" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the currency exchange performed on financial amounts for this rate.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SpecialRatingApplied" type="ns:SpecialRatingAppliedType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Indicates which special rating cases applied to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DimDivisor" type="xs:nonNegativeInteger" minOccurs="0"> + <xs:annotation> + <xs:documentation>The value used to calculate the weight based on the dimensions.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DimDivisorType" type="ns:RateDimensionalDivisorType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the type of dim divisor that was applied.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FuelSurchargePercent" type="xs:decimal" minOccurs="0"/> + <xs:element name="TotalBillingWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>The weight used to calculate these rates.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalDimWeight" type="ns:Weight" minOccurs="0"> + <xs:annotation> + <xs:documentation>Sum of dimensional weights for all packages.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalBaseCharge" type="ns:Money" minOccurs="0"/> + <xs:element name="TotalFreightDiscounts" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The total discounts used in the rate calculation.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalNetFreight" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The freight charge minus discounts.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalSurcharges" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The total amount of all surcharges applied to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalNetFedExCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>This shipment's totalNetFreight + totalSurcharges (not including totalTaxes).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalTaxes" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total of the transportation-based taxes.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalNetCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The net charge after applying all discounts and surcharges.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalRebates" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The total sum of all rebates applied to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalDutiesAndTaxes" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Total of all values under this shipment's dutiesAndTaxes; only provided if estimated duties and taxes were calculated for this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalNetChargeWithDutiesAndTaxes" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>This shipment's totalNetCharge + totalDutiesAndTaxes; only provided if estimated duties and taxes were calculated for this shipment AND duties, taxes and transportation charges are all paid by the same sender's account.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightRateDetail" type="ns:FreightRateDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Rate data specific to FedEx Freight and FedEx National Freight services.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FreightDiscounts" type="ns:RateDiscount" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All rate discounts that apply to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Rebates" type="ns:Rebate" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All rebates that apply to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Surcharges" type="ns:Surcharge" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All surcharges that apply to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Taxes" type="ns:Tax" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All transportation-based taxes applicable to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="DutiesAndTaxes" type="ns:EdtCommodityTax" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>All commodity-based duties and taxes applicable to this shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="VariableHandlingCharges" type="ns:VariableHandlingCharges" minOccurs="0"> + <xs:annotation> + <xs:documentation>The "order level" variable handling charges.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalVariableHandlingCharges" type="ns:VariableHandlingCharges" minOccurs="0"> + <xs:annotation> + <xs:documentation>The total of all variable handling charges at both shipment (order) and package level.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ShipmentSpecialServiceType"> + <xs:annotation> + <xs:documentation>Identifies the collection of special service offered by FedEx.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BROKER_SELECT_OPTION"/> + <xs:enumeration value="CALL_BEFORE_DELIVERY"/> + <xs:enumeration value="COD"/> + <xs:enumeration value="CUSTOM_DELIVERY_WINDOW"/> + <xs:enumeration value="DANGEROUS_GOODS"/> + <xs:enumeration value="DO_NOT_BREAK_DOWN_PALLETS"/> + <xs:enumeration value="DO_NOT_STACK_PALLETS"/> + <xs:enumeration value="DRY_ICE"/> + <xs:enumeration value="EAST_COAST_SPECIAL"/> + <xs:enumeration value="ELECTRONIC_TRADE_DOCUMENTS"/> + <xs:enumeration value="EMAIL_NOTIFICATION"/> + <xs:enumeration value="EXTREME_LENGTH"/> + <xs:enumeration value="FOOD"/> + <xs:enumeration value="FREIGHT_GUARANTEE"/> + <xs:enumeration value="FUTURE_DAY_SHIPMENT"/> + <xs:enumeration value="HOLD_AT_LOCATION"/> + <xs:enumeration value="HOME_DELIVERY_PREMIUM"/> + <xs:enumeration value="INSIDE_DELIVERY"/> + <xs:enumeration value="INSIDE_PICKUP"/> + <xs:enumeration value="LIFTGATE_DELIVERY"/> + <xs:enumeration value="LIFTGATE_PICKUP"/> + <xs:enumeration value="LIMITED_ACCESS_DELIVERY"/> + <xs:enumeration value="LIMITED_ACCESS_PICKUP"/> + <xs:enumeration value="PENDING_SHIPMENT"/> + <xs:enumeration value="POISON"/> + <xs:enumeration value="PROTECTION_FROM_FREEZING"/> + <xs:enumeration value="RETURN_SHIPMENT"/> + <xs:enumeration value="SATURDAY_DELIVERY"/> + <xs:enumeration value="SATURDAY_PICKUP"/> + <xs:enumeration value="TOP_LOAD"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ShipmentSpecialServicesRequested"> + <xs:annotation> + <xs:documentation>These special services are available at the shipment level for some or all service types. If the shipper is requesting a special service which requires additional data (such as the COD amount), the shipment special service type must be present in the specialServiceTypes collection, and the supporting detail must be provided in the appropriate sub-object below.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="SpecialServiceTypes" type="ns:ShipmentSpecialServiceType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>The types of all special services requested for the enclosing shipment (or other shipment-level transaction).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CodDetail" type="ns:CodDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data required for a FedEx COD (Collect-On-Delivery) shipment. This element is required when SpecialServiceType.COD is present in the SpecialServiceTypes collection.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="HoldAtLocationDetail" type="ns:HoldAtLocationDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data required for a FedEx shipment that is to be held at the destination FedEx location for pickup by the recipient. This element is required when SpecialServiceType.HOLD_AT_LOCATION is present in the SpecialServiceTypes collection.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EMailNotificationDetail" type="ns:EMailNotificationDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Descriptive data required for FedEx to provide email notification to the customer regarding the shipment. This element is required when SpecialServiceType.EMAIL_NOTIFICATION is present in the SpecialServiceTypes collection.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ReturnShipmentDetail" type="ns:ReturnShipmentDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>The descriptive data required for FedEx Printed Return Label. This element is required when SpecialServiceType.PRINTED_RETURN_LABEL is present in the SpecialServiceTypes collection</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PendingShipmentDetail" type="ns:PendingShipmentDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>This field should be populated for pending shipments (e.g. e-mail label) It is required by a PENDING_SHIPMENT special service type.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ShipmentDryIceDetail" type="ns:ShipmentDryIceDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>The number of packages with dry ice and the total weight of the dry ice.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="HomeDeliveryPremiumDetail" type="ns:HomeDeliveryPremiumDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>The descriptive data required for FedEx Home Delivery options. This element is required when SpecialServiceType.HOME_DELIVERY_PREMIUM is present in the SpecialServiceTypes collection</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FlatbedTrailerDetail" type="ns:FlatbedTrailerDetail" minOccurs="0"/> + <xs:element name="FreightGuaranteeDetail" type="ns:FreightGuaranteeDetail" minOccurs="0"/> + <xs:element name="EtdDetail" type="ns:EtdDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Electronic Trade document references.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomDeliveryWindowDetail" type="ns:CustomDeliveryWindowDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specification for date or range of dates on which delivery is to be attempted.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ShippingDocumentDispositionDetail"> + <xs:annotation> + <xs:documentation>Each occurrence of this class specifies a particular way in which a kind of shipping document is to be produced and provided.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="DispositionType" type="ns:ShippingDocumentDispositionType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Values in this field specify how to create and return the document.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Grouping" type="ns:ShippingDocumentGroupingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies how to organize all documents of this type.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="EMailDetail" type="ns:ShippingDocumentEMailDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies how to e-mail document images.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PrintDetail" type="ns:ShippingDocumentPrintDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies how a queued document is to be printed.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ShippingDocumentDispositionType"> + <xs:annotation> + <xs:documentation>Specifies how to return a shipping document to the caller.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CONFIRMED"/> + <xs:enumeration value="DEFERRED_RETURNED"/> + <xs:enumeration value="DEFERRED_STORED"/> + <xs:enumeration value="EMAILED"/> + <xs:enumeration value="QUEUED"/> + <xs:enumeration value="RETURNED"/> + <xs:enumeration value="STORED"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ShippingDocumentEMailDetail"> + <xs:annotation> + <xs:documentation>Specifies how to e-mail shipping documents.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="EMailRecipients" type="ns:ShippingDocumentEMailRecipient" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Provides the roles and email addresses for e-mail recipients.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Grouping" type="ns:ShippingDocumentEMailGroupingType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the convention by which documents are to be grouped as e-mail attachments.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ShippingDocumentEMailGroupingType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="BY_RECIPIENT"/> + <xs:enumeration value="NONE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ShippingDocumentEMailRecipient"> + <xs:annotation> + <xs:documentation>Specifies an individual recipient of e-mailed shipping document(s).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="RecipientType" type="ns:EMailNotificationRecipientType" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the relationship of this recipient in the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Address" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Address to which the document is to be sent.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ShippingDocumentFormat"> + <xs:annotation> + <xs:documentation>Specifies characteristics of a shipping document to be produced.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Dispositions" type="ns:ShippingDocumentDispositionDetail" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Specifies how to create, organize, and return the document.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TopOfPageOffset" type="ns:LinearMeasure" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies how far down the page to move the beginning of the image; allows for printing on letterhead and other pre-printed stock.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ImageType" type="ns:ShippingDocumentImageType" minOccurs="0"/> + <xs:element name="StockType" type="ns:ShippingDocumentStockType" minOccurs="0"/> + <xs:element name="ProvideInstructions" type="xs:boolean" minOccurs="0"> + <xs:annotation> + <xs:documentation>For those shipping document types which have both a "form" and "instructions" component (e.g. NAFTA Certificate of Origin and General Agency Agreement), this field indicates whether to provide the instructions.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Localization" type="ns:Localization" minOccurs="0"> + <xs:annotation> + <xs:documentation>Governs the language to be used for this individual document, independently from other content returned for the same shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ShippingDocumentGroupingType"> + <xs:annotation> + <xs:documentation>Specifies how to organize all shipping documents of the same type.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CONSOLIDATED_BY_DOCUMENT_TYPE"/> + <xs:enumeration value="INDIVIDUAL"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="ShippingDocumentImageType"> + <xs:annotation> + <xs:documentation>Specifies the image format used for a shipping document.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="DPL"/> + <xs:enumeration value="EPL2"/> + <xs:enumeration value="PDF"/> + <xs:enumeration value="PNG"/> + <xs:enumeration value="ZPLII"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ShippingDocumentPrintDetail"> + <xs:annotation> + <xs:documentation>Specifies printing options for a shipping document.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="PrinterId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Provides environment-specific printer identification.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ShippingDocumentSpecification"> + <xs:annotation> + <xs:documentation>Contains all data required for additional (non-label) shipping documents to be produced in conjunction with a specific shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ShippingDocumentTypes" type="ns:RequestedShippingDocumentType" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Indicates the types of shipping documents requested by the shipper.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CertificateOfOrigin" type="ns:CertificateOfOriginDetail" minOccurs="0"/> + <xs:element name="CommercialInvoiceDetail" type="ns:CommercialInvoiceDetail" minOccurs="0"/> + <xs:element name="CustomPackageDocumentDetail" type="ns:CustomDocumentDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the production of each package-level custom document (the same specification is used for all packages).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CustomShipmentDocumentDetail" type="ns:CustomDocumentDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the production of a shipment-level custom document.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="GeneralAgencyAgreementDetail" type="ns:GeneralAgencyAgreementDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Details pertaining to the GAA.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NaftaCertificateOfOriginDetail" type="ns:NaftaCertificateOfOriginDetail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Details pertaining to NAFTA COO.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Op900Detail" type="ns:Op900Detail" minOccurs="0"> + <xs:annotation> + <xs:documentation>Specifies the production of the OP-900 document for hazardous materials packages.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="ShippingDocumentStockType"> + <xs:annotation> + <xs:documentation>Specifies the type of paper (stock) on which a document will be printed.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="OP_900_LG_B"/> + <xs:enumeration value="OP_900_LL_B"/> + <xs:enumeration value="PAPER_4X6"/> + <xs:enumeration value="PAPER_LETTER"/> + <xs:enumeration value="STOCK_4X6"/> + <xs:enumeration value="STOCK_4X6.75_LEADING_DOC_TAB"/> + <xs:enumeration value="STOCK_4X6.75_TRAILING_DOC_TAB"/> + <xs:enumeration value="STOCK_4X8"/> + <xs:enumeration value="STOCK_4X9_LEADING_DOC_TAB"/> + <xs:enumeration value="STOCK_4X9_TRAILING_DOC_TAB"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="SignatureOptionDetail"> + <xs:annotation> + <xs:documentation>The descriptive data required for FedEx delivery signature services.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="OptionType" type="ns:SignatureOptionType"> + <xs:annotation> + <xs:documentation>Identifies the delivery signature services option selected by the customer for this shipment. See OptionType for the list of valid values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="SignatureReleaseNumber" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the delivery signature release authorization number.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>10</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="SignatureOptionType"> + <xs:annotation> + <xs:documentation>Identifies the delivery signature services options offered by FedEx.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ADULT"/> + <xs:enumeration value="DIRECT"/> + <xs:enumeration value="INDIRECT"/> + <xs:enumeration value="NO_SIGNATURE_REQUIRED"/> + <xs:enumeration value="SERVICE_DEFAULT"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="SmartPostAncillaryEndorsementType"> + <xs:annotation> + <xs:documentation>These values are mutually exclusive; at most one of them can be attached to a SmartPost shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ADDRESS_CORRECTION"/> + <xs:enumeration value="CARRIER_LEAVE_IF_NO_RESPONSE"/> + <xs:enumeration value="CHANGE_SERVICE"/> + <xs:enumeration value="FORWARDING_SERVICE"/> + <xs:enumeration value="RETURN_SERVICE"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="SmartPostIndiciaType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="MEDIA_MAIL"/> + <xs:enumeration value="PARCEL_RETURN"/> + <xs:enumeration value="PARCEL_SELECT"/> + <xs:enumeration value="PRESORTED_BOUND_PRINTED_MATTER"/> + <xs:enumeration value="PRESORTED_STANDARD"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="SmartPostShipmentDetail"> + <xs:annotation> + <xs:documentation>Data required for shipments handled under the SMART_POST and GROUND_SMART_POST service types.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Indicia" type="ns:SmartPostIndiciaType" minOccurs="0"/> + <xs:element name="AncillaryEndorsement" type="ns:SmartPostAncillaryEndorsementType" minOccurs="0"/> + <xs:element name="HubId" type="xs:string" minOccurs="0"/> + <xs:element name="CustomerManifestId" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="SpecialRatingAppliedType"> + <xs:annotation> + <xs:documentation>Indicates which special rating cases applied to this shipment.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FIXED_FUEL_SURCHARGE"/> + <xs:enumeration value="IMPORT_PRICING"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Surcharge"> + <xs:annotation> + <xs:documentation>Identifies each surcharge applied to the shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="SurchargeType" type="ns:SurchargeType" minOccurs="0"> + <xs:annotation> + <xs:documentation>The type of surcharge applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Level" type="ns:SurchargeLevelType" minOccurs="0"/> + <xs:element name="Description" type="xs:string" minOccurs="0"/> + <xs:element name="Amount" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The amount of the surcharge applied to the shipment.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="SurchargeLevelType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="PACKAGE"/> + <xs:enumeration value="SHIPMENT"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="SurchargeType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="ADDITIONAL_HANDLING"/> + <xs:enumeration value="ANCILLARY_FEE"/> + <xs:enumeration value="APPOINTMENT_DELIVERY"/> + <xs:enumeration value="BROKER_SELECT_OPTION"/> + <xs:enumeration value="CANADIAN_DESTINATION"/> + <xs:enumeration value="CLEARANCE_ENTRY_FEE"/> + <xs:enumeration value="COD"/> + <xs:enumeration value="CUT_FLOWERS"/> + <xs:enumeration value="DANGEROUS_GOODS"/> + <xs:enumeration value="DELIVERY_AREA"/> + <xs:enumeration value="DELIVERY_CONFIRMATION"/> + <xs:enumeration value="DOCUMENTATION_FEE"/> + <xs:enumeration value="DRY_ICE"/> + <xs:enumeration value="EMAIL_LABEL"/> + <xs:enumeration value="EUROPE_FIRST"/> + <xs:enumeration value="EXCESS_VALUE"/> + <xs:enumeration value="EXHIBITION"/> + <xs:enumeration value="EXPORT"/> + <xs:enumeration value="EXTREME_LENGTH"/> + <xs:enumeration value="FEDEX_TAG"/> + <xs:enumeration value="FICE"/> + <xs:enumeration value="FLATBED"/> + <xs:enumeration value="FREIGHT_GUARANTEE"/> + <xs:enumeration value="FREIGHT_ON_VALUE"/> + <xs:enumeration value="FUEL"/> + <xs:enumeration value="HOLD_AT_LOCATION"/> + <xs:enumeration value="HOME_DELIVERY_APPOINTMENT"/> + <xs:enumeration value="HOME_DELIVERY_DATE_CERTAIN"/> + <xs:enumeration value="HOME_DELIVERY_EVENING"/> + <xs:enumeration value="INSIDE_DELIVERY"/> + <xs:enumeration value="INSIDE_PICKUP"/> + <xs:enumeration value="INSURED_VALUE"/> + <xs:enumeration value="INTERHAWAII"/> + <xs:enumeration value="LIFTGATE_DELIVERY"/> + <xs:enumeration value="LIFTGATE_PICKUP"/> + <xs:enumeration value="LIMITED_ACCESS_DELIVERY"/> + <xs:enumeration value="LIMITED_ACCESS_PICKUP"/> + <xs:enumeration value="METRO_DELIVERY"/> + <xs:enumeration value="METRO_PICKUP"/> + <xs:enumeration value="NON_MACHINABLE"/> + <xs:enumeration value="OFFSHORE"/> + <xs:enumeration value="ON_CALL_PICKUP"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="OUT_OF_DELIVERY_AREA"/> + <xs:enumeration value="OUT_OF_PICKUP_AREA"/> + <xs:enumeration value="OVERSIZE"/> + <xs:enumeration value="OVER_DIMENSION"/> + <xs:enumeration value="PIECE_COUNT_VERIFICATION"/> + <xs:enumeration value="PRE_DELIVERY_NOTIFICATION"/> + <xs:enumeration value="PRIORITY_ALERT"/> + <xs:enumeration value="PROTECTION_FROM_FREEZING"/> + <xs:enumeration value="REGIONAL_MALL_DELIVERY"/> + <xs:enumeration value="REGIONAL_MALL_PICKUP"/> + <xs:enumeration value="RESIDENTIAL_DELIVERY"/> + <xs:enumeration value="RESIDENTIAL_PICKUP"/> + <xs:enumeration value="RETURN_LABEL"/> + <xs:enumeration value="SATURDAY_DELIVERY"/> + <xs:enumeration value="SATURDAY_PICKUP"/> + <xs:enumeration value="SIGNATURE_OPTION"/> + <xs:enumeration value="TARP"/> + <xs:enumeration value="THIRD_PARTY_CONSIGNEE"/> + <xs:enumeration value="TRANSMART_SERVICE_FEE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="Tax"> + <xs:annotation> + <xs:documentation>Identifies each tax applied to the shipment.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="TaxType" type="ns:TaxType" minOccurs="0"/> + <xs:element name="Description" type="xs:string" minOccurs="0"/> + <xs:element name="Amount" type="ns:Money" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="TaxType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="EXPORT"/> + <xs:enumeration value="GST"/> + <xs:enumeration value="HST"/> + <xs:enumeration value="INTRACOUNTRY"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="PST"/> + <xs:enumeration value="VAT"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="TaxpayerIdentification"> + <xs:annotation> + <xs:documentation>The descriptive data for taxpayer identification information.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="TinType" type="ns:TinType" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the category of the taxpayer identification number. See TinType for the list of values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Number" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the taxpayer identification number.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>18</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Usage" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Identifies the usage of Tax Identification Number in Shipment processing</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="TermsOfSaleType"> + <xs:annotation> + <xs:documentation> + Required for dutiable international express or ground shipment. This field is not applicable to an international PIB (document) or a non-document which does not require a commercial invoice express shipment. + CFR_OR_CPT (Cost and Freight/Carriage Paid TO) + CIF_OR_CIP (Cost Insurance and Freight/Carraige Insurance Paid) + DDP (Delivered Duty Paid) + DDU (Delivered Duty Unpaid) + EXW (Ex Works) + FOB_OR_FCA (Free On Board/Free Carrier) + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CFR_OR_CPT"/> + <xs:enumeration value="CIF_OR_CIP"/> + <xs:enumeration value="DDP"/> + <xs:enumeration value="DDU"/> + <xs:enumeration value="EXW"/> + <xs:enumeration value="FOB_OR_FCA"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="TinType"> + <xs:annotation> + <xs:documentation>Identifies the category of the taxpayer identification number.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="BUSINESS_NATIONAL"/> + <xs:enumeration value="BUSINESS_STATE"/> + <xs:enumeration value="PERSONAL_NATIONAL"/> + <xs:enumeration value="PERSONAL_STATE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="TrackingId"> + <xs:sequence> + <xs:element name="TrackingIdType" type="ns:TrackingIdType" minOccurs="0"/> + <xs:element name="FormId" type="xs:string" minOccurs="0"/> + <xs:element name="TrackingNumber" type="xs:string"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="TrackingIdType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="EXPRESS"/> + <xs:enumeration value="GROUND"/> + <xs:enumeration value="USPS"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="TransactionDetail"> + <xs:annotation> + <xs:documentation>Descriptive data for this customer transaction. The TransactionDetail from the request is echoed back to the caller in the corresponding reply.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="CustomerTransactionId" type="xs:string" minOccurs="0"> + <xs:annotation> + <xs:documentation>Free form text to be echoed back in the reply. Used to match requests and replies.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>40</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Localization" type="ns:Localization" minOccurs="0"> + <xs:annotation> + <xs:documentation>Governs data payload language/translations (contrasted with ClientDetail.localization, which governs Notification.localizedMessage language selection).</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="TransitTimeType"> + <xs:annotation> + <xs:documentation>Time in transit from pickup to delivery.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="ONE_DAY"/> + <xs:enumeration value="TWO_DAYS"/> + <xs:enumeration value="THREE_DAYS"/> + <xs:enumeration value="FOUR_DAYS"/> + <xs:enumeration value="FIVE_DAYS"/> + <xs:enumeration value="SIX_DAYS"/> + <xs:enumeration value="SEVEN_DAYS"/> + <xs:enumeration value="EIGHT_DAYS"/> + <xs:enumeration value="NINE_DAYS"/> + <xs:enumeration value="TEN_DAYS"/> + <xs:enumeration value="ELEVEN_DAYS"/> + <xs:enumeration value="TWELVE_DAYS"/> + <xs:enumeration value="THIRTEEN_DAYS"/> + <xs:enumeration value="FOURTEEN_DAYS"/> + <xs:enumeration value="FIFTEEN_DAYS"/> + <xs:enumeration value="SIXTEEN_DAYS"/> + <xs:enumeration value="SEVENTEEN_DAYS"/> + <xs:enumeration value="EIGHTEEN_DAYS"/> + <xs:enumeration value="NINETEEN_DAYS"/> + <xs:enumeration value="TWENTY_DAYS"/> + <xs:enumeration value="UNKNOWN"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="UploadDocumentDetail"> + <xs:sequence> + <xs:element name="LineNumber" type="xs:nonNegativeInteger" minOccurs="0"/> + <xs:element name="CustomerReference" type="xs:string" minOccurs="0"/> + <xs:element name="DocumentProducer" type="ns:UploadDocumentProducerType" minOccurs="0"/> + <xs:element name="DocumentType" type="ns:UploadDocumentType" minOccurs="0"/> + <xs:element name="FileName" type="xs:string" minOccurs="0"/> + <xs:element name="DocumentContent" type="xs:base64Binary" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="UploadDocumentIdProducer"> + <xs:restriction base="xs:string"> + <xs:enumeration value="CUSTOMER"/> + <xs:enumeration value="FEDEX_CSHP"/> + <xs:enumeration value="FEDEX_GTM"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="UploadDocumentProducerType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="CUSTOMER"/> + <xs:enumeration value="FEDEX_CLS"/> + <xs:enumeration value="FEDEX_GTM"/> + <xs:enumeration value="OTHER"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="UploadDocumentReferenceDetail"> + <xs:sequence> + <xs:element name="LineNumber" type="xs:nonNegativeInteger" minOccurs="0"/> + <xs:element name="CustomerReference" type="xs:string" minOccurs="0"/> + <xs:element name="DocumentProducer" type="ns:UploadDocumentProducerType" minOccurs="0"/> + <xs:element name="DocumentType" type="ns:UploadDocumentType" minOccurs="0"/> + <xs:element name="DocumentId" type="xs:string" minOccurs="0"/> + <xs:element name="DocumentIdProducer" type="ns:UploadDocumentIdProducer" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="UploadDocumentType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="CERTIFICATE_OF_ORIGIN"/> + <xs:enumeration value="COMMERCIAL_INVOICE"/> + <xs:enumeration value="ETD_LABEL"/> + <xs:enumeration value="NAFTA_CERTIFICATE_OF_ORIGIN"/> + <xs:enumeration value="OTHER"/> + <xs:enumeration value="PRO_FORMA_INVOICE"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="VariableHandlingChargeDetail"> + <xs:annotation> + <xs:documentation>Details about how to calculate variable handling charges at the shipment level.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="VariableHandlingChargeType" type="ns:VariableHandlingChargeType" minOccurs="1"> + <xs:annotation> + <xs:documentation>The type of handling charge to be calculated and returned in the reply.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="FixedValue" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used with Variable handling charge type of FIXED_VALUE. Contains the amount to be added to the freight charge. Contains 2 explicit decimal positions with a total max length of 10 including the decimal.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="PercentValue" type="xs:decimal" minOccurs="0"> + <xs:annotation> + <xs:documentation>Used with Variable handling charge types PERCENTAGE_OF_BASE, PERCENTAGE_OF_NET or PERCETAGE_OF_NET_EXCL_TAXES. Used to calculate the amount to be added to the freight charge. Contains 2 explicit decimal positions.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="VariableHandlingChargeType"> + <xs:annotation> + <xs:documentation>The type of handling charge to be calculated and returned in the reply.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="FIXED_AMOUNT"/> + <xs:enumeration value="PERCENTAGE_OF_NET_CHARGE"/> + <xs:enumeration value="PERCENTAGE_OF_NET_CHARGE_EXCLUDING_TAXES"/> + <xs:enumeration value="PERCENTAGE_OF_NET_FREIGHT"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="VariableHandlingCharges"> + <xs:annotation> + <xs:documentation>The variable handling charges calculated based on the type variable handling charges requested.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="VariableHandlingCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The variable handling charge amount calculated based on the requested variable handling charge detail.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="TotalCustomerCharge" type="ns:Money" minOccurs="0"> + <xs:annotation> + <xs:documentation>The calculated varibale handling charge plus the net charge.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="VersionId"> + <xs:annotation> + <xs:documentation>Identifies the version/level of a service operation expected by a caller (in each request) and performed by the callee (in each reply).</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ServiceId" type="xs:string" minOccurs="1" fixed="crs"> + <xs:annotation> + <xs:documentation>Identifies a system or sub-system which performs an operation.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Major" type="xs:int" fixed="9" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the service business level.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Intermediate" type="xs:int" fixed="0" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the service interface level.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Minor" type="xs:int" fixed="0" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifies the service code level.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Volume"> + <xs:annotation> + <xs:documentation>Three-dimensional volume/cubic measurement.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Units" type="ns:VolumeUnits" minOccurs="0"/> + <xs:element name="Value" type="xs:decimal" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="VolumeUnits"> + <xs:annotation> + <xs:documentation>Units of three-dimensional volume/cubic measure.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="CUBIC_FT"/> + <xs:enumeration value="CUBIC_M"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="WebAuthenticationCredential"> + <xs:annotation> + <xs:documentation>Two part authentication string used for the sender's identity</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Key" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>Identifying part of authentication credential. This value is provided by FedEx after registration</xs:documentation> + <xs:appinfo> + <xs:MaxLength>16</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + <xs:element name="Password" type="xs:string" minOccurs="1"> + <xs:annotation> + <xs:documentation>Secret part of authentication key. This value is provided by FedEx after registration.</xs:documentation> + <xs:appinfo> + <xs:MaxLength>25</xs:MaxLength> + </xs:appinfo> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="WebAuthenticationDetail"> + <xs:annotation> + <xs:documentation>Used in authentication of the sender's identity.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="UserCredential" type="ns:WebAuthenticationCredential" minOccurs="1"> + <xs:annotation> + <xs:documentation>Credential used to authenticate a specific software application. This value is provided by FedEx after registration.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Weight"> + <xs:annotation> + <xs:documentation>The descriptive data for the heaviness of an object.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Units" type="ns:WeightUnits"> + <xs:annotation> + <xs:documentation>Identifies the unit of measure associated with a weight value. See WeightUnits for the list of valid enumerated values.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Value" type="xs:decimal"> + <xs:annotation> + <xs:documentation>Identifies the weight value of the package/shipment. Contains 1 explicit decimal position</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="WeightUnits"> + <xs:annotation> + <xs:documentation>Identifies the unit of measure associated with a weight value. See WeightUnits for the list of valid enumerated values.</xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="KG"/> + <xs:enumeration value="LB"/> + </xs:restriction> + </xs:simpleType> + </xs:schema> + </types> + <message name="RateRequest"> + <part name="RateRequest" element="ns:RateRequest"/> + </message> + <message name="RateReply"> + <part name="RateReply" element="ns:RateReply"/> + </message> + <portType name="RatePortType"> + <operation name="getRates" parameterOrder="RateRequest"> + <input message="ns:RateRequest"/> + <output message="ns:RateReply"/> + </operation> + </portType> + <binding name="RateServiceSoapBinding" type="ns:RatePortType"> + <s1:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="getRates"> + <s1:operation soapAction="getRates" style="document"/> + <input> + <s1:body use="literal"/> + </input> + <output> + <s1:body use="literal"/> + </output> + </operation> + </binding> + <service name="RateService"> + <port name="RateServicePort" binding="ns:RateServiceSoapBinding"> + <s1:address location="https://gateway.fedex.com:443/web-services/rate"/> + </port> + </service> +</definitions> diff --git a/modules/fedexcarrier/carrier.jpg b/modules/fedexcarrier/carrier.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d29e008e84757550ff537a727aefa8825e45d9b GIT binary patch literal 2785 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 literal 0 HcmV?d00001 diff --git a/modules/fedexcarrier/config.xml b/modules/fedexcarrier/config.xml new file mode 100755 index 000000000..bc701ff49 --- /dev/null +++ b/modules/fedexcarrier/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>fedexcarrier</name> + <displayName><![CDATA[Fedex Carrier]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Offer your customers, different delivery methods with Fedex]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[shipping_logistics]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries>us</limited_countries> +</module> \ No newline at end of file diff --git a/modules/fedexcarrier/de.php b/modules/fedexcarrier/de.php new file mode 100644 index 000000000..a2eb44795 --- /dev/null +++ b/modules/fedexcarrier/de.php @@ -0,0 +1,147 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0d00fcb670ada42dad4698b865f40cd'] = 'Fedex Carrier'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0aad1e954489f441f8824e1f990d4774'] = 'Bieten Sie Ihren Kunden unterschiedliche Liefermethoden mit Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff86cba2f7fe4a2dec854d107a4d99d2'] = 'SOAP-Klasse'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_883fa0069f4b0454e2277dd567ab3991'] = '\'Gewichtseinheit (LB oder KG).\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5a3ceec65d417f5d92c26dbf0dccc00d'] = '\'Längeneinheit (CM oder IN).\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4d470fde8487e755a50e9235e3dc13ab'] = 'muss konfiguriert sein, um dieses Modul richtig nutzen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a1d8be175eff378884736e1b44da526e'] = 'Fedex Konto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c481cd53864462a87dcb89c33589ff8e'] = 'Fedex Zähler'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_918356c887962073f010ee06e1395713'] = 'Fedex Kennwort'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c2b826b79539fa093a6db05ca5ec9e0'] = 'Fedex API Schlüssel'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3ef2f9d666a37f95d963a84c46bae646'] = 'Fedex Standard-Abholungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_72f18dde0a5c9f75dd487adeacb92b56'] = 'Fedex Standard-Verpackungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bb8a37c6acccadf3e28a704d59f1f8a'] = 'Business Service Center'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0b3132d2759b40e8525f2466c477d1c'] = 'Drop Box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_22db7528d7c5df8e310bf19af75e61d3'] = 'Regelmäßige Abholung'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7e8eb99ef29d93f494ebdc27b59444f5'] = 'Kurier anfordern'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_394a844cc3d6d99eb45b4e71afde2c99'] = 'Station'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_57185ccd597e58ad9e4944f4356222b6'] = 'Fedex 10Kg Box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8ccd685b767c927bca8501ae80d954'] = 'Fedex 25kg Box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_38f14cc3e27cc856e61e3a7f555148d2'] = 'Fedex Box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_36aba1bfaa5062695e71a6524008dd8a'] = 'Fedex Umschlag'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0e6a558b4ce274905600856b20b471e'] = 'FedEx Pak'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b2953c3343913eee2398c1fe2651be7'] = 'Fedex Röhrenpackung'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_451400926783d7a47cd31025717bc97f'] = 'Ihre Verpackung'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46f58e2a308b68cae9d5f5dd8a5d4ad6'] = 'Europe first international Priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0fd6265588d27073ef45ed36d5c00c75'] = 'Fedex Freight 1 Geschäftstag'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dfa184d2bf6a5d6ee8ffebfbaa25394c'] = 'Fedex 2 Geschäftstage'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2c0f88b63bfbe05955db90f1dcccab2e'] = 'Fedex Freight 2 Geschäftstage'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_03aac4b90886eabd480cee819e24d09e'] = 'Fedex Freight 3 Geschäftstage'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_687009f2bc600c25a005b26f4cb4ab02'] = 'Fedex Express Saver'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6e8cf654ec68d7391f5d673331e2c212'] = 'FedEx Freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1497c5bee4dd896e0b84c442be1e8760'] = 'FedEx Ground Bodenversand'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_23044a6996eda8ad80874f5bdd72a0bc'] = 'Fedex national freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4cee621e07c270fb1031f231e592a8cd'] = 'First overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e1416870eb1cf36849393bf6ef6f6966'] = 'Hauszustellung per Bodenversand'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_124dd98ba09563af1900c14885e97d6e'] = 'International economy'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2751413ff6e957a3b6894929b008b123'] = 'Internationale economy freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cebbbe47be59307e1751e2febe44fdc6'] = 'International first'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f3f9ee160906e71040b437410459ec79'] = 'International ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_759d99c1c032d4171c2f142af4f79436'] = 'International priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a8c786474d046ba2b2b90b78a7b498cf'] = 'International priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec25bbf3daf58ec08920a781e25a3f3d'] = 'Priority overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e889962a8517669ba4ac839afa6384df'] = 'smart post'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0a7bd01967a1874144b1b4fab2ee6a6f'] = 'Strandard overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d999f792aee7c730cdc95f6aff4aa436'] = 'FEDEX Carrier'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_99e509958c21ac35438651547a7bb035'] = 'Fedex Modulstatus'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d23a9177c3c7256ede85643a19335afb'] = 'FEDEX Carrier ist richtig konfiguriert und online!'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bc95bc43c48a735773d4182dcf526fb'] = 'FEDEX Carrier ist noch nicht konfiguriert, Sie müssen:'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e203b9a16f360b88d90bba6eb61ce61'] = 'Das \"Allgemeine Einstellungen\"-Formular ausfüllen '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c0987b9315003df7dae7f130e3cf58e'] = 'Ihren verfügbaren Zustelldienst wählen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e20f6d6f13fe70e78f6e2ab488493ccf'] = 'Webservice Testverbindung'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_807b063fceafae2c51dc6afb45612389'] = 'SOAP ist aktiviert'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_52f4393e1b52ba63e27310ca92ba098c'] = 'Allgemeine Einstellungen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_277d63a9b24a09697e3c64092eaf4353'] = 'Einstellungen der Kategorien '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_098eec2cabe2c39c6dec3fc522b6571a'] = 'Einstellungen der Produkte '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Hilfe'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d2126da975d5b9a5b846efaf57d3fd53'] = 'Allgemeine Konfiguration'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a50bb127f9b307757cf52ab86d70adac'] = 'Ihr FedEx Konto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8b0ebd10992bd1576eccf605a84175'] = 'Ihre FedEx Zählernummer'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c36a272a8778a2e85de52a01675fd521'] = 'Ihr FedEx Kennwort'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e2cd475470bc7b47bef8d4ecdae2a67'] = 'Ihr FedEx API Schlüssel'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cdfa1b01c330bf745f776f6c6c8afffd'] = 'Bitte klicken Sie hier, um Ihren Fedex API Schlüssel zu erhalten.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_83ad4fdaf06650e6d9d7ca18f82fb975'] = 'Konfiguration der Lokalisierung '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f489118ea95c746d648d36bb50c226f0'] = 'Gewichtseinheit'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_659c95668841b7d6602ead454b28d4ba'] = 'Die Gewichtseinheit Ihres Shops (z.B. kg oder lbs)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cc13d156306185fd42a860da3049567c'] = 'Maßeinheit'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f804c2bdebc117d9cde3cddad3b49845'] = 'Die Maßeinheit Ihres Shops (z.B. cm oder in)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2481447d04ae756836d32e3ade240ff4'] = 'Adresskonfiguration'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b179e75d464a04d8a04111131b3a3ca'] = 'Ihre Adresszeile 1'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_281b2def1a9737b33f88013c94fdfeb8'] = 'Ihre Adresszeile 2'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d30f507473129e70c4b962ceccf175cf'] = 'Postleitzahl'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0585aac6bb77bb49423b2effca0e067'] = 'Ihre Stadt'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_59716c97497eb9694541f7c3d37b1a4d'] = 'Land'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f8f5a972333ee726fbe5bb52409c0ed0'] = 'Wählen Sie ein Land ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4e9863cf5326e6714388045321665d07'] = 'Wählen Sie ein Land aus der Liste.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46a2a41cc6e552044816a2d04634545d'] = 'Staat'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cf1580798f7aba85d519afadf1ffd886'] = 'Wählen Sie einen Staat ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_02546d525ab356bd43c91e6b07447496'] = 'Es gibt keine Konfiguration des Staats für dieses Land'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ddc2a5660f7d095fff34d6b93077c80'] = 'Service-Konfiguration'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f405714368454e1f9c932432693aea42'] = 'Standard-Abholungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ce135482b30deedcc0046df41c12de79'] = 'Wählen Sie eine Standard-Abholungsart ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a361a1f786db3dfe07aae42752d3446'] = 'Standard-Verpackungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4664d1ae1832bed2246e8a6850365075'] = 'Wählen Sie eine Standard-Verpackungsart ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5cdd307ba6e260beb4801c0c10e22a3a'] = 'Liefer-Service'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_78945de8de090e90045d299651a68a9b'] = 'Verfügbar'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2d25c72c1b18e562f6654fff8e11711e'] = 'Nicht verfügbar'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d63e135774e62574e2a1921267dad142'] = 'Wählen Sie den Lieferservice, der für die Kunden verfügbar ist.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9b8c4a7116e8c44e4ebc955fafd47586'] = 'Ihr FedEx Konto ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9cc1a101547b3ece6d946dbbe3469d7'] = 'Ihr FedEx Zähler ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ce0f66588bbbbbb3ef0634e5ea7da69'] = 'Ihre FedEx Kennwort ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7988c0adb770f0f945814c0fb2b5800b'] = 'Ihre FedEx API Schlüssel ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5d5ae09e7b6041d3449ef2cbfc39f560'] = 'Ihre Abholungsart ist nicht angegeben '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e794e452ed4d2cfa13083693a2c8810e'] = 'Ihre Verpackungsart ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_805353d2862ea0e658c9ddda871540fa'] = 'Ihre PLZ ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ef9bd955e165dfb0207877e9fe180aeb'] = 'Ihre Stadt ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ecc7697a320f93f3ee8fb4048dbd64c'] = 'Ihr Land ist nicht angegeben'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_729d4f7143a3de7b0ed18de667fdf4d5'] = 'Prestashop konnte keine Verbindung zu den FedEx Webservices herstellen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9d1b485edd50e6fbd288b340b386b07d'] = 'Kein Fehlerbeschreibung gefunden'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9284bff13acffdd879ef4ac7fca5234'] = 'Einstellungen fehlgeschlagen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_67e19ffdaa0a11e69349810403a9727e'] = 'Sie müssen die \"allgemeinen Einstellungen\" konfigurieren, bevor Sie diesen Tab benutzen.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a37b48e8684078c0620a997b3baeee9f'] = 'In diesem Tab können Sie eine spezielle Konfiguration für jede Kategorie einstellen.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f421827ff72ef9a61fb27aa0de62f1e4'] = 'ID Config'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ca2fb7f67355c05d2ffa963fac6e91e1'] = 'Abholungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d9bc28a26253438f5b16cea5eb35681a'] = 'Verpackungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20cde117cbc92b9ec1fb4e5bc4a7b9bd'] = 'Zusätzliche Gebühren'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Dienstleistungen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_06df33001c1d7187fdd81ea1f5b277aa'] = 'Handlungen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4f8e00c5ae41d97ab62a947b8e806d55'] = 'Es gibt keine spezifische FEDEX-Konfiguration für Kategorien an dieser Stelle.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f1c611f93510bbee05663c82f6d439e2'] = 'Sind Sie sicher, dass Sie diese spezifische FEDEX Konfiguration für diese Kategorie löschen wollen?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e0cb9fd22b124c0839302fef54762d7'] = ' Regel aktualisieren'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dd593f8a542ab628cbba98c709255e60'] = ' Regel hinzufügen'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1debf905ac528b3f0615cd379ced0d38'] = 'Abholungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b03dfe92d8c5b6a15d3f139998580563'] = 'Wählen Sie eine Abholungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_da42caf26ef85de3d7e48e16ca60b891'] = 'Verpackungsart'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8d2ee0603dfce09b57d60db628cde269'] = 'Wählen Sie eine Verpackungsart ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7fcafa7c47e984693fcb8a92c0fd1beb'] = 'Wählen Sie eine Kategorie ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d725c0166e978cc30853996c70440873'] = 'Sie müssen eine Kategorie auswählen.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff63f917e2a947d454bce41b104cfbd2'] = 'Diese Kategorie hat bereits eine bestimmte FEDEX Konfiguration.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_fd0119c2a5fc18aa64887b5b7ab41c19'] = 'Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20f40087c53c662adfb4e780500eaa15'] = 'In diesem Tab können Sie eine spezielle Konfiguration für jedes Produkt einstellen.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_deb10517653c255364175796ace3553f'] = 'Produkt'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cef3da9171b7ac6d7a6e206e68a2a246'] = 'Es gibt keine spezifische FEDEX-Konfiguration für Produkte an dieser Stelle.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ceb0ede9c02d159aa2360a3d0694d9ed'] = 'Sind Sie sicher, dass Sie diese spezifische FEDEX Konfiguration für dieses Produkt löschen wollen?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3c4d710b56f4318dae775cff80619f84'] = 'Wählen Sie ein Produkt ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c07640370e4681bf98638d0c458cd2e'] = 'Sie müssen ein Produkt auswählen.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8fc3abc76f5a163f81962a52fc5a3703'] = 'Dieses Produkt hat bereits eine bestimmte FEDEX Konfiguration.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c3eacca576fbfc5dca21b50d9f6ef8f'] = 'Willkommen im PrestaShop FEDEX Modul-Konfigurator!'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_92640c80a67da1782a18304336405dac'] = 'Dieser Abschnitt wird Ihnen helfen zu verstehen, wie dieses Modul richtig konfiguriert wird.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec0e6948e8f34818d80f27c309f46661'] = 'Siehe unten für die Beschreibung der einzelnen Felder:'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b12c6f84e131ed2192e9d9c6c531f239'] = 'Ihr FedEx Konto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ea2cd644fcacb9e8fe1d4c9c89a677b'] = 'Sie müssen sich auf der FEDEX Website unter folgender Adresse anmelden'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_35ba940948fa0ea163fd01281de10e2f'] = 'Dieses Feld muss die Postleitzahl Ihres Paketabsendeorts sein.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_81822348ace1ceabad5e9f8992ce9ea4'] = 'Dieses Feld muss das Land Ihres Paketabsendeorts sein.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_74395432668d0313b593712dfc40479a'] = 'Dieses Feld entspricht der Standard-Abholungsart (wenn keine spezielle Konfiguration für das Produkt oder die Produktkategorie vorhanden ist).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9bba478eb4348e49e672e944b072b68'] = 'Diese Kontrollkästchen entsprechen den Zustelldiensten, die verfügbar sein sollen (wenn es keine spezielle Konfiguration für das Produkt oder die Produktkategorie vorhanden ist).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_71ffd676000b4ec8ea95f4096adc3d3c'] = 'Dieser Abschnitt ermöglicht es Ihnen, eine bestimmte FEDEX Konfiguration für jede Produktkategorie (z.B. Verpackungsart und Zusatzkosten) zu definieren.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_89a9eabc8fc9335d484dcb1eb7ef4ac5'] = 'Dieser Abschnitt ermöglicht es Ihnen, eine bestimmte FEDEX Konfiguration für jedes Produkt (z. B. Verpackungsart und Zusatzkosten) zu definieren.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Fehler'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e303843029d99ced59415005037969d'] = 'Fedex Webservice scheint abgeschaltet zu sein, warten Sie bitte ein paar Minuten und versuchen es dann erneut'; + +?> \ No newline at end of file diff --git a/modules/fedexcarrier/es.php b/modules/fedexcarrier/es.php new file mode 100644 index 000000000..c5acd85e5 --- /dev/null +++ b/modules/fedexcarrier/es.php @@ -0,0 +1,145 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0d00fcb670ada42dad4698b865f40cd'] = 'Transportista Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0aad1e954489f441f8824e1f990d4774'] = 'Proponer sus clientes el transportista Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff86cba2f7fe4a2dec854d107a4d99d2'] = 'Clase SOAP '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_883fa0069f4b0454e2277dd567ab3991'] = '\'Unidad de peso (lb o kg).\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5a3ceec65d417f5d92c26dbf0dccc00d'] = '\'Unidad del tamaño (CM o pulgadas).\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4d470fde8487e755a50e9235e3dc13ab'] = 'deben configurarse correctamente para poder utilizar este módulo'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a1d8be175eff378884736e1b44da526e'] = 'Cuenta de FedEx '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c481cd53864462a87dcb89c33589ff8e'] = 'Meter de Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_918356c887962073f010ee06e1395713'] = 'Contraseña de Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c2b826b79539fa093a6db05ca5ec9e0'] = 'Clave API de Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3ef2f9d666a37f95d963a84c46bae646'] = 'Tipo de recogida predeterminado de Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_72f18dde0a5c9f75dd487adeacb92b56'] = 'Tipo de embalaje predeterminado de Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bb8a37c6acccadf3e28a704d59f1f8a'] = 'Business service center'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0b3132d2759b40e8525f2466c477d1c'] = 'Buzón de depósito'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_22db7528d7c5df8e310bf19af75e61d3'] = 'Recogida regular'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7e8eb99ef29d93f494ebdc27b59444f5'] = 'Solicitud de mensajería'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_394a844cc3d6d99eb45b4e71afde2c99'] = 'Estación'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_57185ccd597e58ad9e4944f4356222b6'] = 'Caja de 10 Kg de Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8ccd685b767c927bca8501ae80d954'] = 'Caja de 25 Kg de Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_38f14cc3e27cc856e61e3a7f555148d2'] = 'Caja de Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_36aba1bfaa5062695e71a6524008dd8a'] = 'Sobre de Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0e6a558b4ce274905600856b20b471e'] = 'Pak de Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b2953c3343913eee2398c1fe2651be7'] = 'Tubo de Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_451400926783d7a47cd31025717bc97f'] = 'Su embalaje'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46f58e2a308b68cae9d5f5dd8a5d4ad6'] = 'Europe first international priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0fd6265588d27073ef45ed36d5c00c75'] = 'Fedex 1 día flete'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dfa184d2bf6a5d6ee8ffebfbaa25394c'] = 'Fedex 2 días'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2c0f88b63bfbe05955db90f1dcccab2e'] = 'Fedex 2 días flete'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_03aac4b90886eabd480cee819e24d09e'] = 'Fedex 3 días flete'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_687009f2bc600c25a005b26f4cb4ab02'] = 'Fedex express saver'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6e8cf654ec68d7391f5d673331e2c212'] = 'Fedex flete'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1497c5bee4dd896e0b84c442be1e8760'] = 'Fedex ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_23044a6996eda8ad80874f5bdd72a0bc'] = 'Fedex flete nacional'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4cee621e07c270fb1031f231e592a8cd'] = 'First overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e1416870eb1cf36849393bf6ef6f6966'] = 'Ground home delivery'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_124dd98ba09563af1900c14885e97d6e'] = 'International economy'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2751413ff6e957a3b6894929b008b123'] = 'International economy freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cebbbe47be59307e1751e2febe44fdc6'] = 'International first'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f3f9ee160906e71040b437410459ec79'] = 'International ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_759d99c1c032d4171c2f142af4f79436'] = 'International priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a8c786474d046ba2b2b90b78a7b498cf'] = 'International priority freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec25bbf3daf58ec08920a781e25a3f3d'] = 'Priority overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e889962a8517669ba4ac839afa6384df'] = 'Smart post'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0a7bd01967a1874144b1b4fab2ee6a6f'] = 'Standard overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d999f792aee7c730cdc95f6aff4aa436'] = 'Transportista FEDEX '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_99e509958c21ac35438651547a7bb035'] = 'Módulo de estado Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d23a9177c3c7256ede85643a19335afb'] = '¡Transportista FEDEX está bien configurado y en línea!'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bc95bc43c48a735773d4182dcf526fb'] = 'Transportista FEDEX no está configurado todavía, usted tiene que:'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e203b9a16f360b88d90bba6eb61ce61'] = 'Cumplimentar el impreso \"Configuración general\"'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c0987b9315003df7dae7f130e3cf58e'] = 'Seleccione el servicio de entrega disponible que desee'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e20f6d6f13fe70e78f6e2ab488493ccf'] = 'Conexión de prueba al servicio web'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_807b063fceafae2c51dc6afb45612389'] = 'SOAP está habilitado'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_52f4393e1b52ba63e27310ca92ba098c'] = 'Configuración general'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_277d63a9b24a09697e3c64092eaf4353'] = 'Configuración de las categorías'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_098eec2cabe2c39c6dec3fc522b6571a'] = 'Configuración de los productos'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Ayuda'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d2126da975d5b9a5b846efaf57d3fd53'] = 'Configuración general'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a50bb127f9b307757cf52ab86d70adac'] = 'Su cuenta Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8b0ebd10992bd1576eccf605a84175'] = 'Su Fedex Mater Lumber'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c36a272a8778a2e85de52a01675fd521'] = 'Su contraseña fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e2cd475470bc7b47bef8d4ecdae2a67'] = 'Su Fedex Key API'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cdfa1b01c330bf745f776f6c6c8afffd'] = 'Pulse aquí para obtener su Fedex Key API'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_83ad4fdaf06650e6d9d7ca18f82fb975'] = 'Configuración de localización '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f489118ea95c746d648d36bb50c226f0'] = 'Unidad de peso'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_659c95668841b7d6602ead454b28d4ba'] = 'La unidad de peso para su tienda (kg o libras)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cc13d156306185fd42a860da3049567c'] = 'Unidad de dimensión'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f804c2bdebc117d9cde3cddad3b49845'] = 'La unidad de dimensión de su tienda (cm o pulgadas)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2481447d04ae756836d32e3ade240ff4'] = 'Dirección de configuración'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b179e75d464a04d8a04111131b3a3ca'] = 'Su dirección la línea 1'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_281b2def1a9737b33f88013c94fdfeb8'] = 'Su dirección la línea 2'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d30f507473129e70c4b962ceccf175cf'] = 'Código Postal'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0585aac6bb77bb49423b2effca0e067'] = 'Su ciudad'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_59716c97497eb9694541f7c3d37b1a4d'] = 'País'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f8f5a972333ee726fbe5bb52409c0ed0'] = 'Seleccione un país ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4e9863cf5326e6714388045321665d07'] = 'Seleccione el país desde dentro de la lista.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46a2a41cc6e552044816a2d04634545d'] = 'Estado'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cf1580798f7aba85d519afadf1ffd886'] = 'Seleccione un estado ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_02546d525ab356bd43c91e6b07447496'] = 'No hay configuración por Estado para este país'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ddc2a5660f7d095fff34d6b93077c80'] = 'Configuración del servicio'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f405714368454e1f9c932432693aea42'] = 'Tipo de recogida por defecto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ce135482b30deedcc0046df41c12de79'] = 'Elija su método de recogida por defecto…'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a361a1f786db3dfe07aae42752d3446'] = 'Tipo de embalaje por defecto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4664d1ae1832bed2246e8a6850365075'] = 'Seleccione un tipo de embalaje por defecto...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5cdd307ba6e260beb4801c0c10e22a3a'] = 'Servicio de entrega'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_78945de8de090e90045d299651a68a9b'] = 'Disponible'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2d25c72c1b18e562f6654fff8e11711e'] = 'No disponible'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d63e135774e62574e2a1921267dad142'] = 'Elija el servicio de entrega que estará disponible para los clientes.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9b8c4a7116e8c44e4ebc955fafd47586'] = 'No se ha especificado su cuenta Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9cc1a101547b3ece6d946dbbe3469d7'] = 'No se ha especificado su Fedex meter Lumber'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ce0f66588bbbbbb3ef0634e5ea7da69'] = 'No se ha especificado su contraseña Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7988c0adb770f0f945814c0fb2b5800b'] = 'No se ha especificado su Fedex API Key'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5d5ae09e7b6041d3449ef2cbfc39f560'] = 'No se ha especificado su método de recogida'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e794e452ed4d2cfa13083693a2c8810e'] = 'No se ha especificado su tipo de embalaje'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_805353d2862ea0e658c9ddda871540fa'] = 'No se ha especificado su Código postal'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ef9bd955e165dfb0207877e9fe180aeb'] = 'No se ha especificado su ciudad '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ecc7697a320f93f3ee8fb4048dbd64c'] = 'No se ha especificado su país'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_729d4f7143a3de7b0ed18de667fdf4d5'] = 'Prestashop no se pudo conectar con los servicios web de FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9d1b485edd50e6fbd288b340b386b07d'] = 'No se encuentra descripción del error'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9284bff13acffdd879ef4ac7fca5234'] = 'Configuración no actualizada'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_67e19ffdaa0a11e69349810403a9727e'] = 'Usted tiene que configurar \"General Settings\" antes de utilizar esta ficha.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a37b48e8684078c0620a997b3baeee9f'] = 'En esta ficha, puede establecer una configuración específica para cada categoría.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f421827ff72ef9a61fb27aa0de62f1e4'] = 'Id. de configuración'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoría'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ca2fb7f67355c05d2ffa963fac6e91e1'] = 'Tipo de recogida'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d9bc28a26253438f5b16cea5eb35681a'] = 'Tipo de embalaje'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20cde117cbc92b9ec1fb4e5bc4a7b9bd'] = 'Gastos adicionales'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Servicios'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_06df33001c1d7187fdd81ea1f5b277aa'] = 'Acciones'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4f8e00c5ae41d97ab62a947b8e806d55'] = 'No hay ninguna configuración específica de FEDEX para las categorías en este momento.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f1c611f93510bbee05663c82f6d439e2'] = '¿Está seguro que desea eliminar esta configuración específica de FEDEX para esta categoría?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e0cb9fd22b124c0839302fef54762d7'] = 'Actualizar una norma'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dd593f8a542ab628cbba98c709255e60'] = 'Agregar una regla'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1debf905ac528b3f0615cd379ced0d38'] = 'Tipo de recogida'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b03dfe92d8c5b6a15d3f139998580563'] = 'Seleccione un tipo de recogida ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_da42caf26ef85de3d7e48e16ca60b891'] = 'Tipo de Embalaje'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8d2ee0603dfce09b57d60db628cde269'] = 'Seleccione un tipo de embalaje ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7fcafa7c47e984693fcb8a92c0fd1beb'] = 'Seleccione una categoría ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d725c0166e978cc30853996c70440873'] = 'Tiene que seleccionar una categoría.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff63f917e2a947d454bce41b104cfbd2'] = 'Esta categoría ya tiene una configuración específica de FEDEX.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_fd0119c2a5fc18aa64887b5b7ab41c19'] = 'Se ha producido un error, inténtelo más tarde.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20f40087c53c662adfb4e780500eaa15'] = 'En esta ficha, puede establecer una configuración específica para cada producto.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_deb10517653c255364175796ace3553f'] = 'Producto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cef3da9171b7ac6d7a6e206e68a2a246'] = 'No hay ninguna configuración específica para los productos de Federal Express en este momento.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ceb0ede9c02d159aa2360a3d0694d9ed'] = '¿Está seguro que desea eliminar esta configuración específica de FEDEX para este producto?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3c4d710b56f4318dae775cff80619f84'] = 'Seleccione un producto ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c07640370e4681bf98638d0c458cd2e'] = 'Usted tiene que seleccionar un producto.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8fc3abc76f5a163f81962a52fc5a3703'] = 'Este producto ya tiene una configuración específica de FEDEX.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c3eacca576fbfc5dca21b50d9f6ef8f'] = '¡Bienvenido al configurador del módulo FEDEX para PrestaShop!'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_92640c80a67da1782a18304336405dac'] = 'Esta sección le ayudará a entender cómo configurar este módulo correctamente.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec0e6948e8f34818d80f27c309f46661'] = 'Vea a continuación la descripción de cada campo:'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b12c6f84e131ed2192e9d9c6c531f239'] = 'Su cuenta de FedEx'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ea2cd644fcacb9e8fe1d4c9c89a677b'] = 'Tendrá que inscribirse en el sitio web de FedEx en esta dirección'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_35ba940948fa0ea163fd01281de10e2f'] = 'Este campo debe ser el Código postal del punto de partida de su paquete.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_81822348ace1ceabad5e9f8992ce9ea4'] = 'Este campo debe ser el país punto de partida de su paquete.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_74395432668d0313b593712dfc40479a'] = 'Este campo corresponde al tipo de recogida por defecto (cuando no hay ninguna configuración específica para el producto o la categoría de productos).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9bba478eb4348e49e672e944b072b68'] = 'Estas casillas corresponden a los servicios de entrega que desea que estén disponibles (cuando no hay ninguna configuración específica para el producto o la categoría de productos).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_71ffd676000b4ec8ea95f4096adc3d3c'] = 'Esta sección le permite definir una configuración específica de FEDEX para cada categoría de productos (tales como tipo de embalaje y gastos adicionales).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_89a9eabc8fc9335d484dcb1eb7ef4ac5'] = 'Esta sección le permite definir una configuración específica de FEDEX para cada producto (tales como tipo de embalaje y gastos adicionales).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Error'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e303843029d99ced59415005037969d'] = 'El servicio web de Fedex parece estar fuera de servicio, por favor, espere unos minutos y vuelva a intentarlo'; diff --git a/modules/fedexcarrier/fedexcarrier.php b/modules/fedexcarrier/fedexcarrier.php new file mode 100644 index 000000000..4455d5309 --- /dev/null +++ b/modules/fedexcarrier/fedexcarrier.php @@ -0,0 +1,1702 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class FedexCarrier extends CarrierModule +{ + public $id_carrier; + + private $_html = ''; + private $_postErrors = array(); + private $_webserviceTestResult = ''; + private $_webserviceError = ''; + private $_fieldsList = array(); + private $_pickupTypeList = array(); + private $_packagingTypeList = array(); + private $_serviceTypeList = array(); + private $_dimensionUnit = ''; + private $_weightUnit = ''; + private $_dimensionUnitList = array('CM' => 'CM', 'IN' => 'IN', 'CMS' => 'CM', 'INC' => 'IN'); + private $_weightUnitList = array('KG' => 'KGS', 'KGS' => 'KGS', 'LBS' => 'LBS', 'LB' => 'LBS'); + private $_moduleName = 'fedexcarrier'; + + public function __construct() + { + $this->name = 'fedexcarrier'; + $this->tab = 'shipping_logistics'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->limited_countries = array('us'); + + parent::__construct (); + + $this->displayName = $this->l('Fedex Carrier'); + $this->description = $this->l('Offer your customers, different delivery methods with Fedex'); + + if (self::isInstalled($this->name)) + { + // Loading Var + $warning = array(); + $this->loadingVar(); + + // Check Class Soap availibility + if (!extension_loaded('soap')) + $warning[] = "'".$this->l('Class Soap')."', "; + + // Check Configuration Values + foreach ($this->_fieldsList as $keyConfiguration => $name) + if (!Configuration::get($keyConfiguration) && !empty($name)) + $warning[] = '\''.$name.'\' '; + + // Checking Unit + $this->_dimensionUnit = $this->_dimensionUnitList[strtoupper(Configuration::get('PS_DIMENSION_UNIT'))]; + $this->_weightUnit = $this->_weightUnitList[strtoupper(Configuration::get('PS_WEIGHT_UNIT'))]; + if (!$this->_weightUnit || !$this->_weightUnitList[$this->_weightUnit]) + $warning[] = $this->l('\'Weight Unit (LB or KG).\'').' '; + if (!$this->_dimensionUnit || !$this->_dimensionUnitList[$this->_dimensionUnit]) + $warning[] = $this->l('\'Dimension Unit (CM or IN).\'').' '; + + // Generate Warnings + if (count($warning)) + $this->warning .= implode(' , ',$warning).$this->l('must be configured to use this module correctly').' '; + } + } + + public function loadingVar() + { + // Loading Fields List + $this->_fieldsList = array( + 'FEDEX_CARRIER_ACCOUNT' => $this->l('Fedex account'), + 'FEDEX_CARRIER_METER' => $this->l('Fedex meter'), + 'FEDEX_CARRIER_PASSWORD' => $this->l('Fedex password'), + 'FEDEX_CARRIER_API_KEY' => $this->l('Fedex API Key'), + 'FEDEX_CARRIER_PICKUP_TYPE' => $this->l('Fedex default pickup type'), + 'FEDEX_CARRIER_PACKAGING_TYPE' => $this->l('Fedex default packaging type'), + 'FEDEX_CARRIER_ADDRESS1' => '', + 'FEDEX_CARRIER_ADDRESS2' => '', + 'FEDEX_CARRIER_POSTAL_CODE' => '', + 'FEDEX_CARRIER_CITY' => '', + 'FEDEX_CARRIER_STATE' => '', + 'FEDEX_CARRIER_COUNTRY' => '', + ); + + // Loading pickup type list + $this->_pickupTypeList = array( + 'BUSINESS_SERVICE_CENTER' => $this->l('Business service center'), + 'DROP_BOX' => $this->l('Drop box'), + 'REGULAR_PICKUP' => $this->l('Regular pickup'), + 'REQUEST_COURIER' => $this->l('Request courier'), + 'STATION' => $this->l('Station') + ); + + // Loading packaging type list + $this->_packagingTypeList = array( + 'FEDEX_10KG_BOX' => $this->l('Fedex 10Kg Box'), + 'FEDEX_25KG_BOX' => $this->l('Fedex 25Kg Box'), + 'FEDEX_BOX' => $this->l('Fedex Box'), + 'FEDEX_ENVELOPE' => $this->l('Fedex Envelope'), + 'FEDEX_PAK' => $this->l('Fedex Pak'), + 'FEDEX_TUBE' => $this->l('Fedex Tube'), + 'YOUR_PACKAGING' => $this->l('Your Packaging'), + ); + + // Loading service type list + $this->_serviceTypeList = array( + 'EUROPE_FIRST_INTERNATIONAL_PRIORITY' => $this->l('Europe first international priority'), + 'FEDEX_1_DAY_FREIGHT' => $this->l('Fedex 1 day freight'), + 'FEDEX_2_DAY' => $this->l('Fedex 2 day'), + 'FEDEX_2_DAY_FREIGHT' => $this->l('Fedex 2 day freight'), + 'FEDEX_3_DAY_FREIGHT' => $this->l('Fedex 3 day freight'), + 'FEDEX_EXPRESS_SAVER' => $this->l('Fedex express saver'), + 'FEDEX_FREIGHT' => $this->l('Fedex freight'), + 'FEDEX_GROUND' => $this->l('Fedex ground'), + 'FEDEX_NATIONAL_FREIGHT' => $this->l('Fedex national freight'), + 'FIRST_OVERNIGHT' => $this->l('First overnight'), + 'GROUND_HOME_DELIVERY' => $this->l('Ground home delivery'), + 'INTERNATIONAL_ECONOMY' => $this->l('International economy'), + 'INTERNATIONAL_ECONOMY_FREIGHT' => $this->l('International economy freight'), + 'INTERNATIONAL_FIRST' => $this->l('International first'), + 'INTERNATIONAL_GROUND' => $this->l('International ground'), + 'INTERNATIONAL_PRIORITY' => $this->l('International priority'), + 'INTERNATIONAL_PRIORITY_FREIGHT' => $this->l('International priority freight'), + 'PRIORITY_OVERNIGHT' => $this->l('Priority overnight'), + 'SMART_POST' => $this->l('Smart post'), + 'STANDARD_OVERNIGHT' => $this->l('Standard overnight') + ); + } + + + + /* + ** Install / Uninstall Methods + ** + */ + + public function install() + { + // Install SQL + include(dirname(__FILE__).'/sql-install.php'); + foreach ($sql as $s) + if (!Db::getInstance()->Execute($s)) + return false; + + // Install Carriers + $this->installCarriers(); + + // Install Module + if (!parent::install() OR !$this->registerHook('updateCarrier')) + return false; + + return true; + } + + public function uninstall() + { + // Uninstall Carriers + Db::getInstance()->autoExecute(_DB_PREFIX_.'carrier', array('deleted' => 1), 'UPDATE', '`external_module_name` = \'fedexcarrier\' OR `id_carrier` IN (SELECT DISTINCT(`id_carrier`) FROM `'._DB_PREFIX_.'fedex_rate_service_code`)'); + + // Uninstall Config + foreach ($this->_fieldsList as $keyConfiguration => $name) + if (!Configuration::deleteByName($keyConfiguration)) + return false; + + // Uninstall SQL + include(dirname(__FILE__).'/sql-uninstall.php'); + foreach ($sql as $s) + if (!Db::getInstance()->Execute($s)) + return false; + + // Uninstall Module + if (!parent::uninstall() OR !$this->unregisterHook('updateCarrier')) + return false; + + return true; + } + + public function installCarriers() + { + // Unactive all FEDEX Carriers + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_service_code', array('active' => 0), 'UPDATE'); + + // Get all services availables + $rateServiceList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + foreach ($rateServiceList as $rateService) + if (!$rateService['id_carrier']) + { + $config = array( + 'name' => $rateService['service'], + 'id_tax_rules_group' => 0, + 'active' => true, + 'deleted' => 0, + 'shipping_handling' => false, + 'range_behavior' => 0, + 'delay' => array('fr' => $rateService['service'], 'en' => $rateService['service'], Language::getIsoById(Configuration::get('PS_LANG_DEFAULT')) => $rateService['service']), + 'id_zone' => 1, + 'is_module' => true, + 'shipping_external' => true, + 'external_module_name' => $this->_moduleName, + 'need_range' => true + ); + $id_carrier = $this->installExternalCarrier($config); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_service_code', array('id_carrier' => (int)($id_carrier), 'id_carrier_history' => (int)($id_carrier)), 'UPDATE', '`id_fedex_rate_service_code` = '.(int)($rateService['id_fedex_rate_service_code'])); + } + } + + public static function installExternalCarrier($config) + { + $carrier = new Carrier(); + $carrier->name = $config['name']; + $carrier->id_tax_rules_group = $config['id_tax_rules_group']; + $carrier->id_zone = $config['id_zone']; + $carrier->active = $config['active']; + $carrier->deleted = $config['deleted']; + $carrier->delay = $config['delay']; + $carrier->shipping_handling = $config['shipping_handling']; + $carrier->range_behavior = $config['range_behavior']; + $carrier->is_module = $config['is_module']; + $carrier->shipping_external = $config['shipping_external']; + $carrier->external_module_name = $config['external_module_name']; + $carrier->need_range = $config['need_range']; + + $languages = Language::getLanguages(true); + foreach ($languages as $language) + { + if ($language['iso_code'] == 'fr') + $carrier->delay[(int)$language['id_lang']] = $config['delay'][$language['iso_code']]; + if ($language['iso_code'] == 'en') + $carrier->delay[(int)$language['id_lang']] = $config['delay'][$language['iso_code']]; + if ($language['iso_code'] == Language::getIsoById(Configuration::get('PS_LANG_DEFAULT'))) + $carrier->delay[(int)$language['id_lang']] = $config['delay'][$language['iso_code']]; + } + + if ($carrier->add()) + { + $groups = Group::getGroups(true); + foreach ($groups as $group) + Db::getInstance()->autoExecute(_DB_PREFIX_.'carrier_group', array('id_carrier' => (int)($carrier->id), 'id_group' => (int)($group['id_group'])), 'INSERT'); + + $rangePrice = new RangePrice(); + $rangePrice->id_carrier = $carrier->id; + $rangePrice->delimiter1 = '0'; + $rangePrice->delimiter2 = '10000'; + $rangePrice->add(); + + $rangeWeight = new RangeWeight(); + $rangeWeight->id_carrier = $carrier->id; + $rangeWeight->delimiter1 = '0'; + $rangeWeight->delimiter2 = '10000'; + $rangeWeight->add(); + + $zones = Zone::getZones(true); + foreach ($zones as $zone) + { + Db::getInstance()->autoExecute(_DB_PREFIX_.'carrier_zone', array('id_carrier' => (int)($carrier->id), 'id_zone' => (int)($zone['id_zone'])), 'INSERT'); + Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.'delivery', array('id_carrier' => (int)($carrier->id), 'id_range_price' => (int)($rangePrice->id), 'id_range_weight' => NULL, 'id_zone' => (int)($zone['id_zone']), 'price' => '0'), 'INSERT'); + Db::getInstance()->autoExecuteWithNullValues(_DB_PREFIX_.'delivery', array('id_carrier' => (int)($carrier->id), 'id_range_price' => NULL, 'id_range_weight' => (int)($rangeWeight->id), 'id_zone' => (int)($zone['id_zone']), 'price' => '0'), 'INSERT'); + } + + // Copy Logo + if (!copy(dirname(__FILE__).'/carrier.jpg', _PS_SHIP_IMG_DIR_.'/'.(int)$carrier->id.'.jpg')) + return false; + + // Return ID Carrier + return (int)($carrier->id); + } + + return false; + } + + + + /* + ** Global Form Config Methods + ** + */ + + public function getContent() + { + $this->_html .= '<h2>' . $this->l('FEDEX Carrier').'</h2>'; + if (!empty($_POST) AND Tools::isSubmit('submitSave')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= '<div class="alert error"><img src="'._PS_IMG_.'admin/forbbiden.gif" alt="nok" />&nbsp;'.$err.'</div>'; + } + $this->_displayForm(); + return $this->_html; + } + + private function _displayForm() + { + $this->_html .= '<fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" /> '.$this->l('Fedex Module Status').'</legend>'; + + $alert = array(); + $this->_webserviceTestResult = $this->webserviceTest(); + if (!Configuration::get('FEDEX_CARRIER_ACCOUNT')) + $alert['generalSettings'] = 1; + if (Db::getInstance()->getValue('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code` WHERE `active` = 1') < 1) + $alert['deliveryServices'] = 1; + if (!$this->_webserviceTestResult) + $alert['webserviceTest'] = 1; + if (!extension_loaded('soap')) + $alert['soap'] = 1; + + + if (!count($alert)) + $this->_html .= '<img src="'._PS_IMG_.'admin/module_install.png" /><strong>'.$this->l('FEDEX Carrier is configured and online!').'</strong>'; + else + { + $this->_html .= '<img src="'._PS_IMG_.'admin/warn2.png" /><strong>'.$this->l('FEDEX Carrier is not configured yet, you must:').'</strong>'; + $this->_html .= '<br />'.(isset($alert['generalSettings']) ? '<img src="'._PS_IMG_.'admin/warn2.png" />' : '<img src="'._PS_IMG_.'admin/module_install.png" />').' 1) '.$this->l('Fill the "General Settings" form'); + $this->_html .= '<br />'.(isset($alert['deliveryServices']) ? '<img src="'._PS_IMG_.'admin/warn2.png" />' : '<img src="'._PS_IMG_.'admin/module_install.png" />').' 2) '.$this->l('Select your available delivery service'); + $this->_html .= '<br />'.(isset($alert['webserviceTest']) ? '<img src="'._PS_IMG_.'admin/warn2.png" />' : '<img src="'._PS_IMG_.'admin/module_install.png" />').' 3) '.$this->l('Webservice test connection').($this->_webserviceError ? ' : '.$this->_webserviceError : ''); + $this->_html .= '<br />'.(isset($alert['soap']) ? '<img src="'._PS_IMG_.'admin/warn2.png" />' : '<img src="'._PS_IMG_.'admin/module_install.png" />').' 4) '.$this->l('Soap is enabled'); + } + + + $this->_html .= '</fieldset><div class="clear">&nbsp;</div>'; + $this->_html .= $this->_displayFormConfig(); + } + + private function _postValidation() + { + if (Tools::getValue('section') == 'general') + $this->_postValidationGeneral(); + elseif (Tools::getValue('section') == 'category') + $this->_postValidationCategory(); + elseif (Tools::getValue('section') == 'product') + $this->_postValidationProduct(); + } + + private function _postProcess() + { + if (Tools::getValue('section') == 'general') + $this->_postProcessGeneral(); + elseif (Tools::getValue('section') == 'category') + $this->_postProcessCategory(); + elseif (Tools::getValue('section') == 'product') + $this->_postProcessProduct(); + } + + + + + /* + ** General Form Config Methods + ** + */ + + private function _displayFormConfig() + { + $html = ' + <ul id="menuTab"> + <li id="menuTab1" class="menuTabButton selected">1. '.$this->l('General Settings').'</li> + <li id="menuTab2" class="menuTabButton">2. '.$this->l('Categories Settings').'</li> + <li id="menuTab3" class="menuTabButton">3. '.$this->l('Products Settings').'</li> + <li id="menuTab4" class="menuTabButton">4. '.$this->l('Help').'</li> + </ul> + <div id="tabList"> + <div id="menuTab1Sheet" class="tabItem selected">'.$this->_displayFormGeneral().'</div> + <div id="menuTab2Sheet" class="tabItem">'.$this->_displayFormCategory().'</div> + <div id="menuTab3Sheet" class="tabItem">'.$this->_displayFormProduct().'</div> + <div id="menuTab4Sheet" class="tabItem">'.$this->_displayHelp().'</div> + </div> + <br clear="left" /> + <br /> + <style> + #menuTab { float: left; padding: 0; margin: 0; text-align: left; } + #menuTab li { text-align: left; float: left; display: inline; padding: 5px; padding-right: 10px; background: #EFEFEF; font-weight: bold; cursor: pointer; border-left: 1px solid #EFEFEF; border-right: 1px solid #EFEFEF; border-top: 1px solid #EFEFEF; } + #menuTab li.menuTabButton.selected { background: #FFF6D3; border-left: 1px solid #CCCCCC; border-right: 1px solid #CCCCCC; border-top: 1px solid #CCCCCC; } + #tabList { clear: left; } + .tabItem { display: none; } + .tabItem.selected { display: block; background: #FFFFF0; border: 1px solid #CCCCCC; padding: 10px; padding-top: 20px; } + </style> + <script> + $(".menuTabButton").click(function () { + $(".menuTabButton.selected").removeClass("selected"); + $(this).addClass("selected"); + $(".tabItem.selected").removeClass("selected"); + $("#" + this.id + "Sheet").addClass("selected"); + }); + </script> + '; + if (isset($_GET['id_tab'])) + $html .= '<script> + $(".menuTabButton.selected").removeClass("selected"); + $("#menuTab'.Tools::getValue('id_tab').'").addClass("selected"); + $(".tabItem.selected").removeClass("selected"); + $("#menuTab'.Tools::getValue('id_tab').'Sheet").addClass("selected"); + </script>'; + return $html; + } + + private function _displayFormGeneral() + { + global $cookie; + + $html = '<script> + $(document).ready(function() { + var country = $("#fedex_carrier_country"); + country.change(function() { + if ($("#fedex_carrier_state_" + country.val())) + { + $(".stateInput.selected").removeClass("selected"); + if ($("#fedex_carrier_state_" + country.val()).size()) + $("#fedex_carrier_state_" + country.val()).addClass("selected"); + else + $("#fedex_carrier_state_none").addClass("selected"); + } + }); + + $("#configForm").submit(function() { + $("#fedex_carrier_state").val($(".stateInput.selected").val()); + }); + }); + </script> + <style> + .stateInput { display: none; } + .stateInput.selected { display: block; } + </style> + + + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=1&section=general" method="post" class="form" id="configForm"> + + <fieldset style="border: 0px;"> + <h4>'.$this->l('General configuration').' :</h4> + <label>'.$this->l('Your Fedex account').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_account" value="'.Tools::getValue('fedex_carrier_account', Configuration::get('FEDEX_CARRIER_ACCOUNT')).'" /></div> + <label>'.$this->l('Your Fedex meter number').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_meter" value="'.Tools::getValue('fedex_carrier_meter', Configuration::get('FEDEX_CARRIER_METER')).'" /></div> + <label>'.$this->l('Your Fedex password').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_password" value="'.Tools::getValue('fedex_carrier_password', Configuration::get('FEDEX_CARRIER_PASSWORD')).'" /></div> + <label>'.$this->l('Your Fedex API Key').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="fedex_carrier_api_key" value="'.Tools::getValue('fedex_carrier_api_key', Configuration::get('FEDEX_CARRIER_API_KEY')).'" /> + <p><a href="http://www.fedex.com/webtools/" target="_blank">' . $this->l('Please click here to get your Fedex API Key.') . '</a></p> + </div> + </fieldset> + + <fieldset style="border: 0px;"> + <h4>'.$this->l('Localization configuration').' :</h4> + <label>'.$this->l('Weight unit').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ps_weight_unit" value="'.Tools::getValue('ps_weight_unit', Configuration::get('PS_WEIGHT_UNIT')).'" /> + <p>'.$this->l('The weight unit of your shop (eg. kg or lbs)').'</p> + </div> + <label>'.$this->l('Dimension unit').' : </label> + <div class="margin-form"> + <input type="text" size="20" name="ps_dimension_unit" value="'.Tools::getValue('ps_dimension_unit', Configuration::get('PS_DIMENSION_UNIT')).'" /> + <p>'.$this->l('The dimension unit of your shop (eg. cm or in)').'</p> + </div> + </fieldset> + + <fieldset style="border: 0px;"> + <h4>'.$this->l('Address configuration').' :</h4> + <label>'.$this->l('Your address line 1').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_address1" value="'.Tools::getValue('fedex_carrier_address1', Configuration::get('FEDEX_CARRIER_ADDRESS1')).'" /></div> + <label>'.$this->l('Your address line 2').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_address2" value="'.Tools::getValue('fedex_carrier_address2', Configuration::get('FEDEX_CARRIER_ADDRESS2')).'" /></div> + <label>'.$this->l('Zip / Postal Code').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_postal_code" value="'.Tools::getValue('fedex_carrier_postal_code', Configuration::get('FEDEX_CARRIER_POSTAL_CODE')).'" /></div><br /> + <label>'.$this->l('Your City').' : </label> + <div class="margin-form"><input type="text" size="20" name="fedex_carrier_city" value="'.Tools::getValue('fedex_carrier_city', Configuration::get('FEDEX_CARRIER_CITY')).'" /></div> + <label>'.$this->l('Country').' : </label> + <div class="margin-form"> + <select name="fedex_carrier_country" id="fedex_carrier_country"> + <option value="0">'.$this->l('Select a country ...').'</option>'; + $idcountries = array(); + foreach (Country::getCountries($cookie->id_lang) as $v) + { + $html .= '<option value="'.$v['id_country'].'" '.($v['id_country'] == (int)(Tools::getValue('fedex_carrier_country', Configuration::get('FEDEX_CARRIER_COUNTRY'))) ? 'selected="selected"' : '').'>'.$v['name'].'</option>'; + $idcountries[] = $v['id_country']; + } + $html .= '</select> + <p>' . $this->l('Select country from within the list.') . '</p> + </div> + <label>'.$this->l('State').' : </label> + <div class="margin-form">'; + $id_country_current = 0; + $statesList = Db::getInstance()->ExecuteS(' + SELECT `id_state`, `id_country`, `name` + FROM `'._DB_PREFIX_.'state` WHERE `active` = 1 + ORDER BY `id_country`, `name` ASC'); + foreach ($statesList as $v) + { + if ($id_country_current != $v['id_country']) + { + if ($id_country_current != 0) + $html .= '</select>'; + $html .= '<select id="fedex_carrier_state_'.$v['id_country'].'" class="stateInput"> + <option value="0">'.$this->l('Select a state ...').'</option>'; + } + $html .= '<option value="'.$v['id_state'].'" '.($v['id_state'] == (int)(Tools::getValue('fedex_carrier_state', Configuration::get('FEDEX_CARRIER_STATE'))) ? 'selected="selected"' : '').'>'.$v['name'].'</option>'; + $id_country_current = $v['id_country']; + } + $html .= '</select><div id="fedex_carrier_state_none" class="stateInput selected">'.$this->l('There is no state configuration for this country').'</div> + <input type="hidden" id="fedex_carrier_state" name="fedex_carrier_state" value="s" /> + </div> + </fieldset> + + <fieldset style="border: 0px;"> + <h4>'.$this->l('Service configuration').' :</h4> + <label>'.$this->l('Default pickup type').' : </label> + <div class="margin-form"> + <select name="fedex_carrier_pickup_type"> + <option value="0">'.$this->l('Select a default pickup type ...').'</option>'; + foreach($this->_pickupTypeList as $kpickup => $vpickup) + $html .= '<option value="'.$kpickup.'" '.($kpickup == pSQL(Configuration::get('FEDEX_CARRIER_PICKUP_TYPE')) ? 'selected="selected"' : '').'>'.$vpickup.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Default packaging type').' : </label> + <div class="margin-form"> + <select name="fedex_carrier_packaging_type"> + <option value="0">'.$this->l('Select a default packaging type ...').'</option>'; + foreach($this->_packagingTypeList as $kpackaging => $vkpackaging) + $html .= '<option value="'.$kpackaging.'" '.($kpackaging == pSQL(Configuration::get('FEDEX_CARRIER_PACKAGING_TYPE')) ? 'selected="selected"' : '').'>'.$vkpackaging.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Delivery Service').' : </label> + <div class="margin-form">'; + $rateServiceList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + foreach($rateServiceList as $rateService) + $html .= '<input type="checkbox" name="service[]" value="'.$rateService['id_fedex_rate_service_code'].'" '.(($rateService['active'] == 1) ? 'checked="checked"' : '').' /> '.$rateService['service'].' '.($this->webserviceTest($rateService['code']) ? '('.$this->l('Available').')' : '('.$this->l('Not available').')').'<br />'; + $html .= ' + <p>' . $this->l('Choose the delivery service which will be available for customers.') . '</p> + </div> + </fieldset> + + <div class="margin-form"><input class="button" name="submitSave" type="submit"></div> + </form> + + <script> + var id_country = '.(int)(Tools::getValue('fedex_carrier_country', Configuration::get('FEDEX_CARRIER_COUNTRY'))).'; + if ($("#fedex_carrier_state_" + id_country)) + { + $(".stateInput.selected").removeClass("selected"); + if ($("#fedex_carrier_state_" + id_country).size()) + $("#fedex_carrier_state_" + id_country).addClass("selected"); + else + $("#fedex_carrier_state_none").addClass("selected"); + } + </script>'; + return $html; + } + + private function _postValidationGeneral() + { + // Check configuration values + if (Tools::getValue('fedex_carrier_account') == NULL) + $this->_postErrors[] = $this->l('Your Fedex account is not specified'); + elseif (Tools::getValue('fedex_carrier_meter') == NULL) + $this->_postErrors[] = $this->l('Your Fedex meter is not specified'); + elseif (Tools::getValue('fedex_carrier_password') == NULL) + $this->_postErrors[] = $this->l('Your Fedex password is not specified'); + elseif (Tools::getValue('fedex_carrier_api_key') == NULL) + $this->_postErrors[] = $this->l('Your Fedex API Key is not specified'); + elseif (Tools::getValue('fedex_carrier_pickup_type') == NULL OR Tools::getValue('fedex_carrier_pickup_type') == '0') + $this->_postErrors[] = $this->l('Your pickup type is not specified'); + elseif (Tools::getValue('fedex_carrier_packaging_type') == NULL OR Tools::getValue('fedex_carrier_packaging_type') == '0') + $this->_postErrors[] = $this->l('Your packaging type is not specified'); + elseif (Tools::getValue('fedex_carrier_postal_code') == NULL) + $this->_postErrors[] = $this->l('Your Zip / Postal code is not specified'); + elseif (Tools::getValue('fedex_carrier_city') == NULL) + $this->_postErrors[] = $this->l('Your city is not specified'); + elseif (Tools::getValue('fedex_carrier_country') == NULL OR Tools::getValue('fedex_carrier_country') == 0) + $this->_postErrors[] = $this->l('Your country is not specified'); + + + + // Check fedex webservice availibity + if (!$this->_postErrors) + { + // Unactive all FEDEX Carriers + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_service_code', array('active' => 0), 'UPDATE'); + + // If no errors appear, the carrier is being activated, else, the carrier is being deactivated + if (!$this->_postErrors) + { + // Get available services + $serviceSelected = Tools::getValue('service'); + + // Active available carrier + if ($serviceSelected) + foreach ($serviceSelected as $ss) + { + $id_carrier = Db::getInstance()->getValue('SELECT `id_carrier` FROM `'._DB_PREFIX_.'fedex_rate_service_code` WHERE `id_fedex_rate_service_code` = '.(int)($ss)); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_service_code', array('active' => 1), 'UPDATE', '`id_fedex_rate_service_code` = '.(int)($ss)); + } + } + + // All new configurations values are saved to be sure to test webservices with it + Configuration::updateValue('FEDEX_CARRIER_ACCOUNT', Tools::getValue('fedex_carrier_account')); + Configuration::updateValue('FEDEX_CARRIER_METER', Tools::getValue('fedex_carrier_meter')); + Configuration::updateValue('FEDEX_CARRIER_PASSWORD', Tools::getValue('fedex_carrier_password')); + Configuration::updateValue('FEDEX_CARRIER_API_KEY', Tools::getValue('fedex_carrier_api_key')); + Configuration::updateValue('FEDEX_CARRIER_PICKUP_TYPE', Tools::getValue('fedex_carrier_pickup_type')); + Configuration::updateValue('FEDEX_CARRIER_PACKAGING_TYPE', Tools::getValue('fedex_carrier_packaging_type')); + Configuration::updateValue('FEDEX_CARRIER_ADDRESS1', Tools::getValue('fedex_carrier_address1')); + Configuration::updateValue('FEDEX_CARRIER_ADDRESS2', Tools::getValue('fedex_carrier_address2')); + Configuration::updateValue('FEDEX_CARRIER_POSTAL_CODE', Tools::getValue('fedex_carrier_postal_code')); + Configuration::updateValue('FEDEX_CARRIER_CITY', Tools::getValue('fedex_carrier_city')); + Configuration::updateValue('FEDEX_CARRIER_STATE', Tools::getValue('fedex_carrier_state')); + Configuration::updateValue('FEDEX_CARRIER_COUNTRY', Tools::getValue('fedex_carrier_country')); + Configuration::updateValue('PS_WEIGHT_UNIT', $this->_weightUnitList[strtoupper(Tools::getValue('ps_weight_unit'))]); + Configuration::updateValue('PS_DIMENSION_UNIT', $this->_dimensionUnitList[strtoupper(Tools::getValue('ps_dimension_unit'))]); + if (isset($this->_weightUnitList[strtoupper(Tools::getValue('ps_weight_unit'))])) + $this->_weightUnit = $this->_weightUnitList[strtoupper(Tools::getValue('ps_weight_unit'))]; + if (isset($this->_dimensionUnitList[strtoupper(Tools::getValue('ps_dimension_unit'))])) + $this->_dimensionUnit = $this->_dimensionUnitList[strtoupper(Tools::getValue('ps_dimension_unit'))]; + if (!$this->webserviceTest()) + $this->_postErrors[] = $this->l('Prestashop could not connect to FEDEX webservices').' :<br />'.($this->_webserviceError ? $this->_webserviceError : $this->l('No error description found')); + } + } + + private function _postProcessGeneral() + { + // Saving new configurations + if (Configuration::updateValue('FEDEX_CARRIER_ACCOUNT', Tools::getValue('fedex_carrier_account')) AND + Configuration::updateValue('FEDEX_CARRIER_METER', Tools::getValue('fedex_carrier_meter')) AND + Configuration::updateValue('FEDEX_CARRIER_PASSWORD', Tools::getValue('fedex_carrier_password')) AND + Configuration::updateValue('FEDEX_CARRIER_API_KEY', Tools::getValue('fedex_carrier_api_key')) AND + Configuration::updateValue('FEDEX_CARRIER_PICKUP_TYPE', Tools::getValue('fedex_carrier_pickup_type')) AND + Configuration::updateValue('FEDEX_CARRIER_PACKAGING_TYPE', Tools::getValue('fedex_carrier_packaging_type')) AND + Configuration::updateValue('FEDEX_CARRIER_POSTAL_CODE', Tools::getValue('fedex_carrier_postal_code')) AND + Configuration::updateValue('FEDEX_CARRIER_CITY', Tools::getValue('fedex_carrier_city')) AND + Configuration::updateValue('FEDEX_CARRIER_STATE', Tools::getValue('fedex_carrier_state')) AND + Configuration::updateValue('FEDEX_CARRIER_COUNTRY', Tools::getValue('fedex_carrier_country')) AND + Configuration::updateValue('PS_WEIGHT_UNIT', $this->_weightUnitList[strtoupper(Tools::getValue('ps_weight_unit'))]) AND + Configuration::updateValue('PS_DIMENSION_UNIT', $this->_dimensionUnitList[strtoupper(Tools::getValue('ps_dimension_unit'))])) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + + + + /* + ** Category Form Config Methods + ** + */ + + private function _getPathInTab($id_category) + { + global $cookie; + + $category = Db::getInstance()->getRow(' + SELECT id_category, level_depth, nleft, nright + FROM '._DB_PREFIX_.'category + WHERE id_category = '.(int)$id_category); + + if (isset($category['id_category'])) + { + $categories = Db::getInstance()->ExecuteS(' + SELECT c.id_category, cl.name, cl.link_rewrite + FROM '._DB_PREFIX_.'category c + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = c.id_category) + WHERE c.nleft <= '.(int)$category['nleft'].' AND c.nright >= '.(int)$category['nright'].' AND cl.id_lang = '.(int)($cookie->id_lang).' + ORDER BY c.level_depth ASC + LIMIT '.(int)($category['level_depth'] + 1)); + + $n = 1; + $pathTab = array(); + $nCategories = (int)sizeof($categories); + foreach ($categories AS $category) + $pathTab[] = htmlentities($category['name'], ENT_NOQUOTES, 'UTF-8'); + + return $pathTab; + } + } + + private function _getChildCategories($categories, $id, $path = array(), $pathAdd = '') + { + $html = ''; + if ($pathAdd != '') + $path[] = $pathAdd; + if (isset($categories[$id])) + foreach ($categories[$id] as $idc => $cc) + { + $html .= '<option value="'.$cc['infos']['id_category'].'" '.($cc['infos']['id_category'] == (int)(Tools::getValue('id_category')) ? 'selected="selected"' : '').'>'; + if ($path) + foreach ($path as $p) + $html .= $p.' > '; + $html .= $cc['infos']['name']; + $html .= '</option>'; + $html .= $this->_getChildCategories($categories, $idc, $path, $cc['infos']['name']); + } + return $html; + } + + private function _isPostCheck($id_fedex_rate_service_code) + { + $services = Tools::getValue('service'); + if ($services) + foreach ($services as $s) + if ($s == $id_fedex_rate_service_code) + return 1; + return 0; + } + + private function _displayFormCategory() + { + global $cookie; + + // Check if the module is configured + if (!$this->_webserviceTestResult) + return '<p><b>'.$this->l('You have to configure "General Settings" tab before using this tab.').'</b></p><br />'; + + // Display header + $html = '<p><b>'.$this->l('In this tab, you can set a specific configuration for each category.').'</b></p><br /> + <table class="table tableDnD" cellpadding="0" cellspacing="0" width="90%"> + <thead> + <tr class="nodrag nodrop"> + <th>'.$this->l('ID Config').'</th> + <th>'.$this->l('Category').'</th> + <th>'.$this->l('Pickup type').'</th> + <th>'.$this->l('Packaging type').'</th> + <th>'.$this->l('Additional charges').'</th> + <th>'.$this->l('Services').'</th> + <th>'.$this->l('Actions').'</th> + </tr> + </thead> + <tbody>'; + + // Loading config list + $configCategoryList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_category` > 0'); + if (!$configCategoryList) + $html .= '<tr><td colspan="6">'.$this->l('There is no specific FEDEX configuration for categories at this point.').'</td></tr>'; + foreach ($configCategoryList as $k => $c) + { + // Category Path + $path = ''; + $pathTab = $this->_getPathInTab($c['id_category']); + foreach ($pathTab as $p) + { + if (!empty($path)) { $path .= ' > '; } + $path .= $p; + } + + // Loading config currency + $configCurrency = new Currency($c['id_currency']); + + // Loading services attached to this config + $services = ''; + $servicesTab = Db::getInstance()->ExecuteS(' + SELECT ursc.`service` + FROM `'._DB_PREFIX_.'fedex_rate_config_service` urcs + LEFT JOIN `'._DB_PREFIX_.'fedex_rate_service_code` ursc ON (ursc.`id_fedex_rate_service_code` = urcs.`id_fedex_rate_service_code`) + WHERE urcs.`id_fedex_rate_config` = '.(int)$c['id_fedex_rate_config']); + foreach ($servicesTab as $s) + $services .= $s['service'].'<br />'; + + // Display line + $alt = 0; + if ($k % 2 != 0) + $alt = ' class="alt_row"'; + $html .= ' + <tr'.$alt.'> + <td>'.$c['id_fedex_rate_config'].'</td> + <td>'.$path.'</td> + <td>'.(isset($this->_pickupTypeList[$c['pickup_type_code']]) ? $this->_pickupTypeList[$c['pickup_type_code']] : '-').'</td> + <td>'.(isset($this->_packagingTypeList[$c['packaging_type_code']]) ? $this->_packagingTypeList[$c['packaging_type_code']] : '-').'</td> + <td>'.$c['additional_charges'].' '.$configCurrency->sign.'</td> + <td>'.$services.'</td> + <td> + <a href="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=2&section=category&action=edit&id_fedex_rate_config='.(int)($c['id_fedex_rate_config']).'" style="float: left;"> + <img src="'._PS_IMG_.'admin/edit.gif" /> + </a> + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=2&section=category&action=delete&id_fedex_rate_config='.(int)($c['id_fedex_rate_config']).'&id_category='.(int)($c['id_category']).'" method="post" class="form" style="float: left;"> + <input name="submitSave" type="image" src="'._PS_IMG_.'admin/delete.gif" OnClick="return confirm(\''.$this->l('Are you sure you want to delete this specific FEDEX configuration for this category ?').'\');" /> + </form> + </td> + </tr>'; + } + + $html .= ' + </tbody> + </table><br /><br />'; + + // Add or Edit Category Configuration + if (Tools::getValue('action') == 'edit' && Tools::getValue('section') == 'category') + { + // Loading config + $configSelected = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_fedex_rate_config` = '.(int)(Tools::getValue('id_fedex_rate_config'))); + + // Category Path + $path = ''; + $pathTab = $this->_getPathInTab($configSelected['id_category']); + foreach ($pathTab as $p) + { + if (!empty($path)) { $path .= ' > '; } + $path .= $p; + } + + $html .= '<p align="center"><b>'.$this->l('Update a rule').' (<a href="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=2&section=category&action=add">'.$this->l('Add a rule').' ?</a>)</b></p> + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=2&section=category&action=edit&id_fedex_rate_config='.(int)(Tools::getValue('id_fedex_rate_config')).'" method="post" class="form"> + <label>'.$this->l('Category').' :</label> + <div class="margin-form" style="padding: 0.2em 0.5em 0 0; font-size: 12px;">'.$path.' <input type="hidden" name="id_category" value="'.(int)($configSelected['id_category']).'" /></div><br clear="left" /> + <label>'.$this->l('Pickup Type').' : </label> + <div class="margin-form"> + <select name="pickup_type_code"> + <option value="0">'.$this->l('Select a pickup type ...').'</option>'; + foreach($this->_pickupTypeList as $kpickup => $vpickup) + $html .= '<option value="'.$kpickup.'" '.($kpickup == pSQL(Tools::getValue('pickup_type_code', $configSelected['pickup_type_code'])) ? 'selected="selected"' : '').'>'.$vpickup.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Packaging Type').' : </label> + <div class="margin-form"> + <select name="packaging_type_code"> + <option value="0">'.$this->l('Select a packaging type ...').'</option>'; + foreach($this->_packagingTypeList as $kpackaging => $vpackaging) + $html .= '<option value="'.$kpackaging.'" '.($kpackaging == pSQL(Tools::getValue('packaging_type_code', $configSelected['packaging_type_code'])) ? 'selected="selected"' : '').'>'.$vpackaging.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Additional charges').' : </label> + <div class="margin-form"><input type="text" size="20" name="additional_charges" value="'.Tools::getValue('additional_charges', $configSelected['additional_charges']).'" /></div><br /> + <label>'.$this->l('Delivery Service').' : </label> + <div class="margin-form">'; + $rateServiceList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + foreach($rateServiceList as $rateService) + { + $configServiceSelected = Db::getInstance()->getValue('SELECT `id_fedex_rate_service_code` FROM `'._DB_PREFIX_.'fedex_rate_config_service` WHERE `id_fedex_rate_config` = '.(int)(Tools::getValue('id_fedex_rate_config')).' AND `id_fedex_rate_service_code` = '.(int)($rateService['id_fedex_rate_service_code'])); + $html .= '<input type="checkbox" name="service[]" value="'.$rateService['id_fedex_rate_service_code'].'" '.(($this->_isPostCheck($rateService['id_fedex_rate_service_code']) == 1 || $configServiceSelected > 0) ? 'checked="checked"' : '').' /> '.$rateService['service'].'<br />'; + } + $html .= ' + <p>' . $this->l('Choose the delivery service which will be available for customers.') . '</p> + </div> + <div class="margin-form"><input class="button" name="submitSave" type="submit"></div> + </form>'; + } + else + { + $html .= '<p align="center"><b>'.$this->l('Add a rule').'</b></p> + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=2&section=category&action=add" method="post" class="form"> + <label>'.$this->l('Category').' : </label> + <div class="margin-form"> + <select name="id_category"> + <option value="0">'.$this->l('Select a category ...').'</option> + '.$this->_getChildCategories(Category::getCategories($cookie->id_lang), 0).' + </select> + </div> + <label>'.$this->l('Pickup Type').' : </label> + <div class="margin-form"> + <select name="pickup_type_code"> + <option value="0">'.$this->l('Select a pickup type ...').'</option>'; + foreach($this->_pickupTypeList as $kpickup => $vpickup) + $html .= '<option value="'.$kpickup.'" '.($kpickup === pSQL(Tools::getValue('pickup_type_code')) ? 'selected="selected"' : '').'>'.$vpickup.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Packaging Type').' : </label> + <div class="margin-form"> + <select name="packaging_type_code"> + <option value="0">'.$this->l('Select a packaging type ...').'</option>'; + foreach($this->_packagingTypeList as $kpackaging => $vpackaging) + $html .= '<option value="'.$kpackaging.'" '.($kpackaging == pSQL(Tools::getValue('packaging_type_code')) ? 'selected="selected"' : '').'>'.$vpackaging.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Additional charges').' : </label> + <div class="margin-form"><input type="text" size="20" name="additional_charges" value="'.Tools::getValue('additional_charges').'" /></div><br /> + <label>'.$this->l('Delivery Service').' : </label> + <div class="margin-form">'; + $rateServiceList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + foreach($rateServiceList as $rateService) + $html .= '<input type="checkbox" name="service[]" value="'.$rateService['id_fedex_rate_service_code'].'" '.(($this->_isPostCheck($rateService['id_fedex_rate_service_code']) == 1) ? 'checked="checked"' : '').' /> '.$rateService['service'].'<br />'; + $html .= ' + <p>' . $this->l('Choose the delivery service which will be available for customers.') . '</p> + </div> + <div class="margin-form"><input class="button" name="submitSave" type="submit"></div> + </form>'; + } + + return $html; + } + + private function _postValidationCategory() + { + // Check post values + if (Tools::getValue('id_category') == NULL) + $this->_postErrors[] = $this->l('You have to select a category.'); + + if (!$this->_postErrors) + { + $id_fedex_rate_config = Db::getInstance()->getValue('SELECT `id_fedex_rate_config` FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_category` = '.(int)Tools::getValue('id_category')); + + // Check if a config does not exist in Add case + if ($id_fedex_rate_config > 0 && Tools::getValue('action') == 'add') + $this->_postErrors[] = $this->l('This category already has a specific FEDEX configuration.'); + + // Check if a config exists and if the IDs config correspond in Upd case + if (Tools::getValue('action') == 'edit' && (!isset($id_fedex_rate_config) || $id_fedex_rate_config != Tools::getValue('id_fedex_rate_config'))) + $this->_postErrors[] = $this->l('An error occurred, please try again.'); + + // Check if a config exists in Delete case + if (Tools::getValue('action') == 'delete' && !isset($id_fedex_rate_config)) + $this->_postErrors[] = $this->l('An error occurred, please try again.'); + } + } + + private function _postProcessCategory() + { + // Init Var + $date = date('Y-m-d H:i:s'); + $services = Tools::getValue('service'); + + // Add Script + if (Tools::getValue('action') == 'add') + { + $addTab = array( + 'id_product' => 0, + 'id_category' => (int)(Tools::getValue('id_category')), + 'id_currency' => (int)(Configuration::get('PS_CURRENCY_DEFAULT')), + 'pickup_type_code' => pSQL(Tools::getValue('pickup_type_code')), + 'packaging_type_code' => pSQL(Tools::getValue('packaging_type_code')), + 'additional_charges' => pSQL(Tools::getValue('additional_charges')), + 'date_add' => pSQL($date), + 'date_upd' => pSQL($date) + ); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config', $addTab, 'INSERT'); + $id_fedex_rate_config = Db::getInstance()->Insert_ID(); + foreach ($services as $s) + { + $addTab = array('id_fedex_rate_service_code' => pSQL($s), 'id_fedex_rate_config' => (int)$id_fedex_rate_config, 'date_add' => pSQL($date), 'date_upd' => pSQL($date)); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config_service', $addTab, 'INSERT'); + } + + // Display Results + if ($id_fedex_rate_config > 0) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + + // Update Script + if (Tools::getValue('action') == 'edit' && Tools::getValue('id_fedex_rate_config')) + { + $updTab = array( + 'id_currency' => (int)(Configuration::get('PS_CURRENCY_DEFAULT')), + 'pickup_type_code' => pSQL(Tools::getValue('pickup_type_code')), + 'packaging_type_code' => pSQL(Tools::getValue('packaging_type_code')), + 'additional_charges' => pSQL(Tools::getValue('additional_charges')), + 'date_upd' => pSQL($date) + ); + $result = Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config', $updTab, 'UPDATE', '`id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'fedex_rate_config_service` WHERE `id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + foreach ($services as $s) + { + $addTab = array('id_fedex_rate_service_code' => pSQL($s), 'id_fedex_rate_config' => (int)Tools::getValue('id_fedex_rate_config'), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config_service', $addTab, 'INSERT'); + } + + // Display Results + if ($result) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + + // Delete Script + if (Tools::getValue('action') == 'delete' && Tools::getValue('id_fedex_rate_config')) + { + $result1 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + $result2 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'fedex_rate_config_service` WHERE `id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + + // Display Results + if ($result1) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + } + + + + /* + ** Product Form Config Methods + ** + */ + + private function _displayFormProduct() + { + global $cookie; + + // Check if the module is configured + if (!$this->_webserviceTestResult) + return '<p><b>'.$this->l('You have to configure "General Settings" tab before using this tab.').'</b></p><br />'; + + // Display header + $html = '<p><b>'.$this->l('In this tab, you can set a specific configuration for each product.').'</b></p><br /> + <table class="table tableDnD" cellpadding="0" cellspacing="0" width="90%"> + <thead> + <tr class="nodrag nodrop"> + <th>'.$this->l('ID Config').'</th> + <th>'.$this->l('Product').'</th> + <th>'.$this->l('Pickup type').'</th> + <th>'.$this->l('Packaging type').'</th> + <th>'.$this->l('Additional charges').'</th> + <th>'.$this->l('Services').'</th> + <th>'.$this->l('Actions').'</th> + </tr> + </thead> + <tbody>'; + + // Loading config list + $configProductList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_product` > 0'); + if (!$configProductList) + $html .= '<tr><td colspan="6">'.$this->l('There is no specific FEDEX configuration for products at this point.').'</td></tr>'; + foreach ($configProductList as $k => $c) + { + // Loading Product + $product = new Product((int)$c['id_product'], false, (int)$cookie->id_lang); + + // Loading config currency + $configCurrency = new Currency($c['id_currency']); + + // Loading services attached to this config + $services = ''; + $servicesTab = Db::getInstance()->ExecuteS(' + SELECT ursc.`service` + FROM `'._DB_PREFIX_.'fedex_rate_config_service` urcs + LEFT JOIN `'._DB_PREFIX_.'fedex_rate_service_code` ursc ON (ursc.`id_fedex_rate_service_code` = urcs.`id_fedex_rate_service_code`) + WHERE urcs.`id_fedex_rate_config` = '.(int)$c['id_fedex_rate_config']); + foreach ($servicesTab as $s) + $services .= $s['service'].'<br />'; + + // Display line + $alt = 0; + if ($k % 2 != 0) + $alt = ' class="alt_row"'; + $html .= ' + <tr'.$alt.'> + <td>'.$c['id_fedex_rate_config'].'</td> + <td>'.$product->name.'</td> + <td>'.(isset($this->_pickupTypeList[$c['pickup_type_code']]) ? $this->_pickupTypeList[$c['pickup_type_code']] : '-').'</td> + <td>'.(isset($this->_packagingTypeList[$c['packaging_type_code']]) ? $this->_packagingTypeList[$c['packaging_type_code']] : '-').'</td> + <td>'.$c['additional_charges'].' '.$configCurrency->sign.'</td> + <td>'.$services.'</td> + <td> + <a href="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=3&section=product&action=edit&id_fedex_rate_config='.(int)($c['id_fedex_rate_config']).'" style="float: left;"> + <img src="'._PS_IMG_.'admin/edit.gif" /> + </a> + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=3&section=product&action=delete&id_fedex_rate_config='.(int)($c['id_fedex_rate_config']).'&id_product='.(int)($c['id_product']).'" method="post" class="form" style="float: left;"> + <input name="submitSave" type="image" src="'._PS_IMG_.'admin/delete.gif" OnClick="return confirm(\''.$this->l('Are you sure you want to delete this specific FEDEX configuration for this product ?').'\');" /> + </form> + </td> + </tr>'; + } + + $html .= ' + </tbody> + </table><br /><br />'; + + // Add or Edit Product Configuration + if (Tools::getValue('action') == 'edit' && Tools::getValue('section') == 'product') + { + // Loading config + $configSelected = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_fedex_rate_config` = '.(int)(Tools::getValue('id_fedex_rate_config'))); + $product = new Product((int)$configSelected['id_product'], false, (int)$cookie->id_lang); + + $html .= '<p align="center"><b>'.$this->l('Update a rule').' (<a href="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=3&section=product&action=add">'.$this->l('Add a rule').' ?</a>)</b></p> + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=3&section=product&action=edit&id_fedex_rate_config='.(int)(Tools::getValue('id_fedex_rate_config')).'" method="post" class="form"> + <label>'.$this->l('Product').' :</label> + <div class="margin-form" style="padding: 0.2em 0.5em 0 0; font-size: 12px;">'.$product->name.' <input type="hidden" name="id_product" value="'.(int)($configSelected['id_product']).'" /></div><br clear="left" /> + <label>'.$this->l('Pickup Type').' : </label> + <div class="margin-form"> + <select name="pickup_type_code"> + <option value="0">'.$this->l('Select a pickup type ...').'</option>'; + foreach($this->_pickupTypeList as $kpickup => $vpickup) + $html .= '<option value="'.$kpickup.'" '.($kpickup === pSQL(Tools::getValue('pickup_type_code', $configSelected['pickup_type_code'])) ? 'selected="selected"' : '').'>'.$vpickup.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Packaging Type').' : </label> + <div class="margin-form"> + <select name="packaging_type_code"> + <option value="0">'.$this->l('Select a packaging type ...').'</option>'; + foreach($this->_packagingTypeList as $kpackaging => $vpackaging) + $html .= '<option value="'.$kpackaging.'" '.($kpackaging == pSQL(Tools::getValue('packaging_type_code', $configSelected['packaging_type_code'])) ? 'selected="selected"' : '').'>'.$vpackaging.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Additional charges').' : </label> + <div class="margin-form"><input type="text" size="20" name="additional_charges" value="'.Tools::getValue('additional_charges', $configSelected['additional_charges']).'" /></div><br /> + <label>'.$this->l('Delivery Service').' : </label> + <div class="margin-form">'; + $rateServiceList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + foreach($rateServiceList as $rateService) + { + $configServiceSelected = Db::getInstance()->getValue('SELECT `id_fedex_rate_service_code` FROM `'._DB_PREFIX_.'fedex_rate_config_service` WHERE `id_fedex_rate_config` = '.(int)(Tools::getValue('id_fedex_rate_config')).' AND `id_fedex_rate_service_code` = '.(int)($rateService['id_fedex_rate_service_code'])); + $html .= '<input type="checkbox" name="service[]" value="'.$rateService['id_fedex_rate_service_code'].'" '.(($this->_isPostCheck($rateService['id_fedex_rate_service_code']) == 1 || $configServiceSelected > 0) ? 'checked="checked"' : '').' /> '.$rateService['service'].'<br />'; + } + $html .= ' + <p>' . $this->l('Choose the delivery service which will be available for customers.') . '</p> + </div> + <div class="margin-form"><input class="button" name="submitSave" type="submit"></div> + </form>'; + } + else + { + $html .= '<p align="center"><b>'.$this->l('Add a rule').'</b></p> + <form action="index.php?tab='.Tools::getValue('tab').'&configure='.Tools::getValue('configure').'&token='.Tools::getValue('token').'&tab_module='.Tools::getValue('tab_module').'&module_name='.Tools::getValue('module_name').'&id_tab=3&section=product&action=add" method="post" class="form"> + <label>'.$this->l('Product').' : </label> + <div class="margin-form"> + <select name="id_product"> + <option value="0">'.$this->l('Select a product ...').'</option>'; + $productsList = Db::getInstance()->ExecuteS(' + SELECT pl.* FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = 2) + WHERE p.`active` = 1 + ORDER BY pl.`name`'); + foreach ($productsList as $product) + $html .= '<option value="'.$product['id_product'].'" '.($product['id_product'] == (int)(Tools::getValue('id_product')) ? 'selected="selected"' : '').'>'.$product['name'].'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Pickup Type').' : </label> + <div class="margin-form"> + <select name="pickup_type_code"> + <option value="0">'.$this->l('Select a pickup type ...').'</option>'; + foreach($this->_pickupTypeList as $kpickup => $vpickup) + $html .= '<option value="'.$kpickup.'" '.($kpickup === pSQL(Tools::getValue('pickup_type_code')) ? 'selected="selected"' : '').'>'.$vpickup.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Packaging Type').' : </label> + <div class="margin-form"> + <select name="packaging_type_code"> + <option value="0">'.$this->l('Select a packaging type ...').'</option>'; + foreach($this->_packagingTypeList as $kpackaging => $vpackaging) + $html .= '<option value="'.$kpackaging.'" '.($kpackaging == pSQL(Tools::getValue('packaging_type_code')) ? 'selected="selected"' : '').'>'.$vpackaging.'</option>'; + $html .= '</select> + </div> + <label>'.$this->l('Additional charges').' : </label> + <div class="margin-form"><input type="text" size="20" name="additional_charges" value="'.Tools::getValue('additional_charges').'" /></div><br /> + <label>'.$this->l('Delivery Service').' : </label> + <div class="margin-form">'; + $rateServiceList = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + foreach($rateServiceList as $rateService) + $html .= '<input type="checkbox" name="service[]" value="'.$rateService['id_fedex_rate_service_code'].'" '.(($this->_isPostCheck($rateService['id_fedex_rate_service_code']) == 1) ? 'checked="checked"' : '').' /> '.$rateService['service'].'<br />'; + $html .= ' + <p>' . $this->l('Choose the delivery service which will be available for customers.') . '</p> + </div> + <div class="margin-form"><input class="button" name="submitSave" type="submit"></div> + </form>'; + } + + return $html; + } + + private function _postValidationProduct() + { + // Check post values + if (Tools::getValue('id_product') == NULL) + $this->_postErrors[] = $this->l('You have to select a product.'); + + if (!$this->_postErrors) + { + $id_fedex_rate_config = Db::getInstance()->getValue('SELECT `id_fedex_rate_config` FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_product` = '.(int)Tools::getValue('id_product')); + + // Check if a config does not exist in Add case + if ($id_fedex_rate_config > 0 && Tools::getValue('action') == 'add') + $this->_postErrors[] = $this->l('This product already has a specific FEDEX configuration.'); + + // Check if a config exists and if the IDs config correspond in Upd case + if (Tools::getValue('action') == 'edit' && (!isset($id_fedex_rate_config) || $id_fedex_rate_config != Tools::getValue('id_fedex_rate_config'))) + $this->_postErrors[] = $this->l('An error occurred, please try again.'); + + // Check if a config exists in Delete case + if (Tools::getValue('action') == 'delete' && !isset($id_fedex_rate_config)) + $this->_postErrors[] = $this->l('An error occurred, please try again.'); + } + } + + private function _postProcessProduct() + { + // Init Var + $date = date('Y-m-d H:i:s'); + $services = Tools::getValue('service'); + + // Add Script + if (Tools::getValue('action') == 'add') + { + $addTab = array( + 'id_product' => (int)(Tools::getValue('id_product')), + 'id_category' => 0, + 'id_currency' => (int)(Configuration::get('PS_CURRENCY_DEFAULT')), + 'pickup_type_code' => pSQL(Tools::getValue('pickup_type_code')), + 'packaging_type_code' => pSQL(Tools::getValue('packaging_type_code')), + 'additional_charges' => pSQL(Tools::getValue('additional_charges')), + 'date_add' => pSQL($date), + 'date_upd' => pSQL($date) + ); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config', $addTab, 'INSERT'); + $id_fedex_rate_config = Db::getInstance()->Insert_ID(); + foreach ($services as $s) + { + $addTab = array('id_fedex_rate_service_code' => pSQL($s), 'id_fedex_rate_config' => (int)$id_fedex_rate_config, 'date_add' => pSQL($date), 'date_upd' => pSQL($date)); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config_service', $addTab, 'INSERT'); + } + + // Display Results + if ($id_fedex_rate_config > 0) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + + // Update Script + if (Tools::getValue('action') == 'edit' && Tools::getValue('id_fedex_rate_config')) + { + $updTab = array( + 'id_currency' => (int)(Configuration::get('PS_CURRENCY_DEFAULT')), + 'pickup_type_code' => pSQL(Tools::getValue('pickup_type_code')), + 'packaging_type_code' => pSQL(Tools::getValue('packaging_type_code')), + 'additional_charges' => pSQL(Tools::getValue('additional_charges')), + 'date_upd' => pSQL($date) + ); + $result = Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config', $updTab, 'UPDATE', '`id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'fedex_rate_config_service` WHERE `id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + foreach ($services as $s) + { + $addTab = array('id_fedex_rate_service_code' => pSQL($s), 'id_fedex_rate_config' => (int)Tools::getValue('id_fedex_rate_config'), 'date_add' => pSQL($date), 'date_upd' => pSQL($date)); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_config_service', $addTab, 'INSERT'); + } + + // Display Results + if ($result) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + + // Delete Script + if (Tools::getValue('action') == 'delete' && Tools::getValue('id_fedex_rate_config')) + { + $result1 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + $result2 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'fedex_rate_config_service` WHERE `id_fedex_rate_config` = '.(int)Tools::getValue('id_fedex_rate_config')); + + // Display Results + if ($result1) + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + else + $this->_html .= $this->displayErrors($this->l('Settings failed')); + } + } + + + + /* + ** Help Config Methods + ** + */ + + private function _displayHelp() + { + return '<p><b>'.$this->l('Welcome to the PrestaShop FEDEX Module configurator.').'</b></p> + <p>'.$this->l('This section will help you to understand how to configure this module correctly.').'</p> + <br /> + <p><b><u>1. '.$this->l('General Settings').'</u></b></p> + <p>'.$this->l('See below for the description of each field :').'</p> + <p><b>'.$this->l('Your FEDEX Account').' :</b> '.$this->l('You must subscribe to FEDEX website at this address').' <a href="http://www.fedex.com/webtools/" target="_blank">http://www.fedex.com/webtools/</a></p> + <p><b>'.$this->l('Zip / Postal Code').' :</b> '.$this->l('This field must be the Zip / Postal code of your package starting point.').'</p> + <p><b>'.$this->l('Country').' :</b> '.$this->l('This field must be the country of your package starting point.').'</p> + <p><b>'.$this->l('Pickup Type').' :</b> '.$this->l('This field corresponds to the default pickup type (when there is no specific configuration for the product or the category product).').'</p> + <p><b>'.$this->l('Delivery Service').' :</b> '.$this->l('These checkboxes correspond to the delivery services you want to be available (when there is no specific configuration for the product or the category product).').'</p> + <br /> + <p><b><u>2. '.$this->l('Categories Settings').'</u></b></p> + <p>'.$this->l('This section allows you to define a specific FEDEX configuration for each product category (such as Packaging Type and Additional charges).').'</p> + <br /> + <p><b><u>3. '.$this->l('Products Settings').'</u></b></p> + <p>'.$this->l('This section allows you to define a specific FEDEX configuration for each product (such as Packaging Type and Additional charges).').'</p> + <br /> + '; + } + + public function hookupdateCarrier($params) + { + if ((int)($params['id_carrier']) != (int)($params['carrier']->id)) + { + $serviceSelected = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code` WHERE `id_carrier` = '.(int)$params['id_carrier']); + $update = array('id_carrier' => (int)($params['carrier']->id), 'id_carrier_history' => pSQL($serviceSelected['id_carrier_history'].'|'.(int)($params['carrier']->id))); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_rate_service_code', $update, 'UPDATE', '`id_carrier` = '.(int)$params['id_carrier']); + } + } + + public function displayInfoByCart() + { + } + + + + /* + ** Front Methods + ** + */ + + public function getCartCurrencyRate($id_currency_origin, $id_cart) + { + $conversionRate = 1; + $cart = new Cart($id_cart); + if ($cart->id_currency != $id_currency_origin) + { + $currencyOrigin = new Currency((int)$id_currency_origin); + $conversionRate /= $currencyOrigin->conversion_rate; + $currencySelect = new Currency((int)$cart->id_currency); + $conversionRate *= $currencySelect->conversion_rate; + } + return $conversionRate; + } + + public function getOrderShippingCostHash($wsParams) + { + $paramHash = ''; + $productHash = ''; + foreach ($wsParams['products'] as $product) + { + if (!empty($productHash)) + $productHash .= '|'; + $productHash .= $product['id_product'].':'.$product['id_product_attribute'].':'.$product['cart_quantity']; + } + foreach ($wsParams as $k => $v) + if ($k != 'products') + $paramHash .= '/'.$v; + return md5($productHash.$paramHash); + } + + public function getOrderShippingCostCache($wsParams) + { + // Get Cache + $row = Db::getInstance()->getRow(" + SELECT * FROM `"._DB_PREFIX_."fedex_cache` + WHERE `id_cart` = ".(int)($wsParams['id_cart'])." + AND `id_carrier` = ".(int)($this->id_carrier)." + AND `hash` = '".pSQL($wsParams['hash'])."'"); + + if ($row['id_currency']) + { + // Check Currency Rate And Calcul + $conversionRate = $this->getCartCurrencyRate($row['id_currency'], (int)$wsParams['id_cart']); + $row['total_charges'] = $row['total_charges'] * $conversionRate; + + // Return Cache + return $row; + } + + return false; + } + + public function saveOrderShippingCostCache($wsParams, $wscost) + { + $is_available = 1; + if (!$wscost) + $is_available = 0; + $date = date('Y-m-d H:i:s'); + $cart = new Cart((int)$wsParams['id_cart']); + $insert = array( + 'id_cart' => (int)($wsParams['id_cart']), + 'id_carrier' => (int)($this->id_carrier), + 'hash' => pSQL($wsParams['hash']), + 'id_currency' => (int)($cart->id_currency), + 'total_charges' => pSQL($wscost), + 'is_available' => (int)($is_available), + 'date_add' => pSQL($date), + 'date_upd' => pSQL($date) + ); + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_cache', $insert, 'INSERT'); + } + + public function loadShippingCostConfig($product) + { + // Init var + $config = array(); + + // Check if there is a specific product configuration + if ($product['id_product'] > 0) + { + $productConfiguration = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_product` = '.(int)($product['id_product'])); + if ($productConfiguration['id_fedex_rate_config']) + { + $servicesConfiguration = Db::getInstance()->ExecuteS(' + SELECT urcs.*, ursc.`id_carrier` + FROM `'._DB_PREFIX_.'fedex_rate_config_service` urcs + LEFT JOIN `'._DB_PREFIX_.'fedex_rate_service_code` ursc ON (ursc.`id_fedex_rate_service_code` = urcs.`id_fedex_rate_service_code`) + WHERE `id_fedex_rate_config` = '.(int)($productConfiguration['id_fedex_rate_config'])); + foreach ($servicesConfiguration as $service) + $productConfiguration['services'][$service['id_fedex_rate_service_code']] = $service; + return $productConfiguration; + } + } + + // Check if there is a specific category configuration + if ($product['id_category_default'] > 0) + { + $categoryConfiguration = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_config` WHERE `id_category` = '.(int)($product['id_category_default'])); + if ($categoryConfiguration['id_fedex_rate_config']) + { + $servicesConfiguration = Db::getInstance()->ExecuteS(' + SELECT urcs.*, ursc.`id_carrier` + FROM `'._DB_PREFIX_.'fedex_rate_config_service` urcs + LEFT JOIN `'._DB_PREFIX_.'fedex_rate_service_code` ursc ON (ursc.`id_fedex_rate_service_code` = urcs.`id_fedex_rate_service_code`) + WHERE `id_fedex_rate_config` = '.(int)($categoryConfiguration['id_fedex_rate_config'])); + foreach ($servicesConfiguration as $service) + $categoryConfiguration['services'][$service['id_fedex_rate_service_code']] = $service; + return $categoryConfiguration; + } + } + + // Return general config + $config['pickup_type_code'] = Configuration::get('FEDEX_CARRIER_PICKUP_TYPE'); + $servicesConfiguration = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code` WHERE `active` = 1'); + foreach ($servicesConfiguration as $service) + $config['services'][$service['id_fedex_rate_service_code']] = $service; + return $config; + } + + public function getWebserviceShippingCost($wsParams) + { + // Init var + $cost = 0; + + // Getting shipping cost for each product + foreach ($wsParams['products'] as $product) + { + // Load specific configuration + $config = $this->loadShippingCostConfig($product); + + // Get service in adequation with carrier and check if available + $serviceSelected = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fedex_rate_service_code` WHERE `id_carrier` = '.(int)($this->id_carrier)); + if (!isset($config['services'][$serviceSelected['id_fedex_rate_service_code']])) + return false; + + // Load param product + $wsParams['service'] = $serviceSelected['code']; + for ($qty = 0; $qty < $product['quantity']; $qty++) + $wsParams['package_list'][] = array( + 'width' => ($product['width'] ? $product['width'] : 1), + 'height' => ($product['height'] ? $product['height'] : 1), + 'depth' => ($product['depth'] ? $product['depth'] : 1), + 'weight' => ($product['weight'] ? $product['weight'] : 1), + 'pickup_type' => (isset($config['pickup_type_code']) ? $config['pickup_type_code'] : Configuration::get('FEDEX_CARRIER_PICKUP_TYPE')), + ); + + // If Additional charges + if (isset($config['id_currency']) && isset($config['additional_charges'])) + { + $conversionRate = 1; + $conversionRate = $this->getCartCurrencyRate((int)($config['id_currency']), (int)$wsParams['id_cart']); + $cost += ($config['additional_charges'] * $conversionRate); + } + } + + + // If webservice return a cost, we add it, else, we return the original shipping cost + $result = $this->getFedexShippingCost($wsParams); + if ($result['connect'] && $result['cost'] > 0) + return ($cost + $result['cost']); + return false; + } + + public function getOrderShippingCost($params, $shipping_cost) + { + // Init var + $address = new Address($params->id_address_delivery); + $recipient_country = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'country` WHERE `id_country` = '.(int)($address->id_country)); + $recipient_state = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'state` WHERE `id_state` = '.(int)($address->id_state)); + $shipper_country = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'country` WHERE `id_country` = '.(int)(Configuration::get('FEDEX_CARRIER_COUNTRY'))); + $shipper_state = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'state` WHERE `id_state` = '.(int)(Configuration::get('FEDEX_CARRIER_STATE'))); + $products = $params->getProducts(); + + // Webservices Params + $wsParams = array( + 'id_cart' => $params->id, + 'id_address_delivery' => $params->id_address_delivery, + 'recipient_address1' => $address->address1, + 'recipient_address2' => $address->address2, + 'recipient_postalcode' => $address->postcode, + 'recipient_city' => $address->city, + 'recipient_country_iso' => $recipient_country['iso_code'], + 'recipient_state_iso' => $recipient_state['iso_code'], + 'shipper_address1' => Configuration::get('FEDEX_CARRIER_ADDRESS1'), + 'shipper_address2' => Configuration::get('FEDEX_CARRIER_ADDRESS2'), + 'shipper_postalcode' => Configuration::get('FEDEX_CARRIER_POSTAL_CODE'), + 'shipper_city' => Configuration::get('FEDEX_CARRIER_CITY'), + 'shipper_country_iso' => $shipper_country['iso_code'], + 'shipper_state_iso' => $shipper_state['iso_code'], + 'products' => $params->getProducts() + ); + $wsParams['hash'] = $this->getOrderShippingCostHash($wsParams); + + // Check cache + $cache = $this->getOrderShippingCostCache($wsParams); + if ($cache['id_fedex_cache'] > 0) + { + if ($cache['is_available'] == 0) + return false; + if ($cache['total_charges']) + return $cache['total_charges']; + } + + // Get Webservices Cost and Cache it + $wscost = $this->getWebserviceShippingCost($wsParams); + $this->saveOrderShippingCostCache($wsParams, $wscost); + + if ($wscost > 0) + return $wscost + $shipping_cost; + return false; + } + + public function getOrderShippingCostExternal($params) + { + return $this->getOrderShippingCost($params, 23); + } + + + + /* + ** Webservices Methods + ** + */ + + public function webserviceTest($service = '') + { + // Check config + if (!Configuration::get('FEDEX_CARRIER_API_KEY')) + return false; + + // Check if class Soap is available + if (!extension_loaded('soap')) + return false; + + // Getting module directory + $dir = dirname(__FILE__); + if (preg_match('/classes/i', $dir)) + $dir .= '/../modules/fedexcarrier/'; + + // Enable Php Soap + ini_set("soap.wsdl_cache_enabled", "0"); + $client = new SoapClient($dir.'/RateService_v9.wsdl', array('trace' => 1)); // Refer to http://us3.php.net/manual/en/ref.soap.php for more information + + // Country / State + $shipper_country = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'country` WHERE `id_country` = '.(int)(Configuration::get('FEDEX_CARRIER_COUNTRY'))); + $shipper_state = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'state` WHERE `id_state` = '.(int)(Configuration::get('FEDEX_CARRIER_STATE'))); + + // Generating soap request + $request['WebAuthenticationDetail']['UserCredential'] = array('Key' => Configuration::get('FEDEX_CARRIER_API_KEY'), 'Password' => Configuration::get('FEDEX_CARRIER_PASSWORD')); + $request['ClientDetail'] = array('AccountNumber' => Configuration::get('FEDEX_CARRIER_ACCOUNT'), 'MeterNumber' => Configuration::get('FEDEX_CARRIER_METER')); + $request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Rate Available Services Request v9 using PHP ***'); + $request['Version'] = array('ServiceId' => 'crs', 'Major' => '9', 'Intermediate' => '0', 'Minor' => '0'); + $request['ReturnTransitAndCommit'] = true; + $request['RequestedShipment']['DropoffType'] = Configuration::get('FEDEX_CARRIER_PICKUP_TYPE'); // valid values REGULAR_PICKUP, REQUEST_COURIER, ... + $request['RequestedShipment']['ShipTimestamp'] = date('c'); + //$request['RequestedShipment']['ServiceType'] = 'PRIORITY_OVERNIGHT'; // valid values STANDARD_OVERNIGHT, PRIORITY_OVERNIGHT, FEDEX_GROUND, ... + $request['RequestedShipment']['PackagingType'] = Configuration::get('FEDEX_CARRIER_PACKAGING_TYPE'); // valid values FEDEX_BOX, FEDEX_PAK, FEDEX_TUBE, YOUR_PACKAGING, ... + + // Service Type and Packaging Type are not passed in the request + $request['RequestedShipment']['Shipper']['Address'] = array('StreetLines' => Configuration::get('FEDEX_CARRIER_ADDRESS1'), 'City' => Configuration::get('FEDEX_CARRIER_CITY'), 'StateOrProvinceCode' => $shipper_state['iso_code'], 'PostalCode' => Configuration::get('FEDEX_CARRIER_POSTAL_CODE'), 'CountryCode' => $shipper_country['iso_code']); + $request['RequestedShipment']['Recipient']['Address'] = array('StreetLines' => Configuration::get('FEDEX_CARRIER_ADDRESS1'), 'City' => Configuration::get('FEDEX_CARRIER_CITY'), 'StateOrProvinceCode' => $shipper_state['iso_code'], 'PostalCode' => Configuration::get('FEDEX_CARRIER_POSTAL_CODE'), 'CountryCode' => $shipper_country['iso_code']); + $request['RequestedShipment']['ShippingChargesPayment'] = array('PaymentType' => 'SENDER', 'Payor' => array('AccountNumber' => Configuration::get('FEDEX_CARRIER_ACCOUNT'), 'CountryCode' => 'US')); + $request['RequestedShipment']['RateRequestTypes'] = 'ACCOUNT'; + $request['RequestedShipment']['RateRequestTypes'] = 'LIST'; + $request['RequestedShipment']['PackageCount'] = '2'; + $request['RequestedShipment']['PackageDetail'] = 'INDIVIDUAL_PACKAGES'; + $request['RequestedShipment']['RequestedPackageLineItems'] = array('0' => array('Weight' => array('Value' => 2.0, 'Units' => 'LB'), 'Dimensions' => array('Length' => 10, 'Width' => 10, 'Height' => 3, 'Units' => 'IN'))); + + + // Unit or Large Test + if (!empty($service)) + $servicesList = array(array('code' => $service)); + else + $servicesList = Db::getInstance()->ExecuteS('SELECT `code` FROM `'._DB_PREFIX_.'fedex_rate_service_code`'); + + + // Testing Service + foreach ($servicesList as $service) + { + // Sending Request + $request['RequestedShipment']['ServiceType'] = $service['code']; + $requestHash = $request; + $requestHash['RequestedShipment']['ShipTimestamp'] = 'none'; + + $resultTabTmp = Db::getInstance()->getValue('SELECT `result` FROM `'._DB_PREFIX_.'fedex_cache_test` WHERE `hash` = \''.pSQL(md5(var_export($requestHash, true))).'\''); + if ($resultTabTmp) + $resultTab = unserialize($resultTabTmp); + else + $resultTab = $client->getRates($request); + + // Cache test result + if (empty($resultTabTmp) && isset($resultTab->HighestSeverity) && ($resultTab->HighestSeverity == 'SUCCESS' OR $resultTab->HighestSeverity == 'ERROR')) + Db::getInstance()->autoExecute(_DB_PREFIX_.'fedex_cache_test', array('hash' => pSQL(md5(var_export($requestHash, true))), 'result' => pSQL(serialize($resultTab)), 'date_add' => pSQL(date('Y-m-d H:i:s')), 'date_upd' => pSQL(date('Y-m-d H:i:s'))), 'INSERT'); + + // Return results + if (isset($resultTab->HighestSeverity) && $resultTab->HighestSeverity == 'SUCCESS') + return true; + + if (isset($resultTab->HighestSeverity) && $resultTab->HighestSeverity == 'ERROR') + $this->_webserviceError = $this->l('Error').' '.(isset($resultTab->Notifications->Code) ? $resultTab->Notifications->Code : '').' : '.(isset($resultTab->Notifications->Message) ? $resultTab->Notifications->Message : ''); + else + { + $this->_webserviceError = $this->l('Fedex Webservice seems to be down, please wait a few minutes and try again.'); + return false; + } + } + + return false; + } + + public function getFedexShippingCost($wsParams) + { + // Check config + if (!Configuration::get('FEDEX_CARRIER_API_KEY')) + return array('connect' => false, 'cost' => 0); + + // Check if class Soap is available + if (!extension_loaded('soap')) + return array('connect' => false, 'cost' => 0); + + // Getting module directory + $dir = dirname(__FILE__); + if (preg_match('/classes/i', $dir)) + $dir .= '/../modules/fedexcarrier/'; + + // Enable Php Soap + ini_set("soap.wsdl_cache_enabled", "0"); + $client = new SoapClient($dir.'/RateService_v9.wsdl', array('trace' => 1)); // Refer to http://us3.php.net/manual/en/ref.soap.php for more information + + // Country / State + $shipper_country = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'country` WHERE `id_country` = '.(int)(Configuration::get('FEDEX_CARRIER_COUNTRY'))); + $shipper_state = Db::getInstance()->getRow('SELECT `iso_code` FROM `'._DB_PREFIX_.'state` WHERE `id_state` = '.(int)(Configuration::get('FEDEX_CARRIER_STATE'))); + + // Generating soap request + $request['WebAuthenticationDetail']['UserCredential'] = array('Key' => Configuration::get('FEDEX_CARRIER_API_KEY'), 'Password' => Configuration::get('FEDEX_CARRIER_PASSWORD')); + $request['ClientDetail'] = array('AccountNumber' => Configuration::get('FEDEX_CARRIER_ACCOUNT'), 'MeterNumber' => Configuration::get('FEDEX_CARRIER_METER')); + $request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Rate Available Services Request v9 using PHP ***'); + $request['Version'] = array('ServiceId' => 'crs', 'Major' => '9', 'Intermediate' => '0', 'Minor' => '0'); + $request['ReturnTransitAndCommit'] = true; + $request['RequestedShipment']['DropoffType'] = Configuration::get('FEDEX_CARRIER_PICKUP_TYPE'); // valid values REGULAR_PICKUP, REQUEST_COURIER, ... + $request['RequestedShipment']['ShipTimestamp'] = date('c'); + $request['RequestedShipment']['ServiceType'] = $wsParams['service']; // valid values STANDARD_OVERNIGHT, PRIORITY_OVERNIGHT, FEDEX_GROUND, ... + $request['RequestedShipment']['PackagingType'] = Configuration::get('FEDEX_CARRIER_PACKAGING_TYPE'); // valid values FEDEX_BOX, FEDEX_PAK, FEDEX_TUBE, YOUR_PACKAGING, ... + + // Service Type and Packaging Type are not passed in the request + $request['RequestedShipment']['Shipper']['Address'] = array('StreetLines' => $wsParams['shipper_address1'], 'City' => $wsParams['shipper_city'], 'StateOrProvinceCode' => $wsParams['shipper_state_iso'], 'PostalCode' => $wsParams['shipper_postalcode'], 'CountryCode' => $wsParams['shipper_country_iso']); + $request['RequestedShipment']['Recipient']['Address'] = array('StreetLines' => $wsParams['recipient_address1'], 'City' => $wsParams['recipient_city'], 'StateOrProvinceCode' => $wsParams['recipient_state_iso'], 'PostalCode' => $wsParams['recipient_postalcode'], 'CountryCode' => $wsParams['recipient_country_iso']); + $request['RequestedShipment']['ShippingChargesPayment'] = array('PaymentType' => 'SENDER', 'Payor' => array('AccountNumber' => Configuration::get('FEDEX_CARRIER_ACCOUNT'), 'CountryCode' => 'US')); + $request['RequestedShipment']['RateRequestTypes'] = 'ACCOUNT'; + $request['RequestedShipment']['RateRequestTypes'] = 'LIST'; + $request['RequestedShipment']['PackageCount'] = '2'; + $request['RequestedShipment']['PackageDetail'] = 'INDIVIDUAL_PACKAGES'; + foreach ($wsParams['package_list'] as $p) + $request['RequestedShipment']['RequestedPackageLineItems'][] = array('Weight' => array('Value' => $p['weight'], 'Units' => substr($this->_weightUnit, 0, 2)), 'Dimensions' => array('Length' => $p['depth'], 'Width' => $p['width'], 'Height' => $p['height'], 'Units' => $this->_dimensionUnit)); + $request['RequestedShipment']['PackageCount'] = count($request['RequestedShipment']['RequestedPackageLineItems']); + + + // Get Rates + $resultTab = $client->getRates($request); + + + // Check currency + $conversionRate = 1; + if (isset($resultTab->RateReplyDetails->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Currency)) + { + $id_currency_return = Db::getInstance()->getValue('SELECT `id_currency` FROM `'._DB_PREFIX_.'currency` WHERE `iso_code` = \''.pSQL($resultTab->RateReplyDetails->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Currency).'\''); + $conversionRate = $this->getCartCurrencyRate($id_currency_return, (int)$wsParams['id_cart']); + } + + // Return results + if (isset($resultTab->HighestSeverity) && $resultTab->HighestSeverity == 'SUCCESS') + return array('connect' => true, 'cost' => number_format($resultTab->RateReplyDetails->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount,2,'.',',') * $conversionRate); + + if (isset($resultTab->HighestSeverity) && $resultTab->HighestSeverity == 'ERROR') + $this->_webserviceError = $this->l('Error').' '.(isset($resultTab->Notifications->Code) ? $resultTab->Notifications->Code : '').' : '.(isset($resultTab->Notifications->Message) ? $resultTab->Notifications->Message : ''); + else + $this->_webserviceError = $this->l('Fedex Webservice seems to be down, please wait a few minutes and try again.'); + + return array('connect' => false, 'cost' => 0); + } + +} + +?> diff --git a/modules/fedexcarrier/fr.php b/modules/fedexcarrier/fr.php new file mode 100644 index 000000000..abb58074c --- /dev/null +++ b/modules/fedexcarrier/fr.php @@ -0,0 +1,145 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0d00fcb670ada42dad4698b865f40cd'] = 'Transporteur Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0aad1e954489f441f8824e1f990d4774'] = 'Propose à vos clients le transporteur Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff86cba2f7fe4a2dec854d107a4d99d2'] = 'Class Soap'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_883fa0069f4b0454e2277dd567ab3991'] = '\'Unité de poids (LB ou KG)\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5a3ceec65d417f5d92c26dbf0dccc00d'] = '\'Unité de mesure (CM ou IN)\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4d470fde8487e755a50e9235e3dc13ab'] = 'doivent être configurés correctement pour utiliser ce module'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a1d8be175eff378884736e1b44da526e'] = 'Votre compte Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c481cd53864462a87dcb89c33589ff8e'] = 'Votre Fedex meter number'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_918356c887962073f010ee06e1395713'] = 'Votre mot de passe Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c2b826b79539fa093a6db05ca5ec9e0'] = 'Votre API Key Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3ef2f9d666a37f95d963a84c46bae646'] = 'Ramassage par défaut'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_72f18dde0a5c9f75dd487adeacb92b56'] = 'Type de colis par défaut'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bb8a37c6acccadf3e28a704d59f1f8a'] = 'Business service center'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0b3132d2759b40e8525f2466c477d1c'] = 'Drop box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_22db7528d7c5df8e310bf19af75e61d3'] = 'Regular pickup'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7e8eb99ef29d93f494ebdc27b59444f5'] = 'Request courier'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_394a844cc3d6d99eb45b4e71afde2c99'] = 'Station'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_57185ccd597e58ad9e4944f4356222b6'] = '10Kg Box Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8ccd685b767c927bca8501ae80d954'] = '25Kg Box Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_38f14cc3e27cc856e61e3a7f555148d2'] = 'Box Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_36aba1bfaa5062695e71a6524008dd8a'] = 'Enveloppe Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0e6a558b4ce274905600856b20b471e'] = 'Pak Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b2953c3343913eee2398c1fe2651be7'] = 'Tube Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_451400926783d7a47cd31025717bc97f'] = 'Votre type de colis'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46f58e2a308b68cae9d5f5dd8a5d4ad6'] = 'Europe first international priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0fd6265588d27073ef45ed36d5c00c75'] = 'Fedex 1 day freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dfa184d2bf6a5d6ee8ffebfbaa25394c'] = 'Fedex 2 day'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2c0f88b63bfbe05955db90f1dcccab2e'] = 'Fedex 2 day freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_03aac4b90886eabd480cee819e24d09e'] = 'Fedex 3 day freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_687009f2bc600c25a005b26f4cb4ab02'] = 'Fedex express saver'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6e8cf654ec68d7391f5d673331e2c212'] = 'Fedex freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1497c5bee4dd896e0b84c442be1e8760'] = 'Fedex ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_23044a6996eda8ad80874f5bdd72a0bc'] = 'Fedex national freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4cee621e07c270fb1031f231e592a8cd'] = 'First overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e1416870eb1cf36849393bf6ef6f6966'] = 'Ground home delivery'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_124dd98ba09563af1900c14885e97d6e'] = 'International economy'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2751413ff6e957a3b6894929b008b123'] = 'International economy freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cebbbe47be59307e1751e2febe44fdc6'] = 'International first'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f3f9ee160906e71040b437410459ec79'] = 'International ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_759d99c1c032d4171c2f142af4f79436'] = 'International priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a8c786474d046ba2b2b90b78a7b498cf'] = 'International priority freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec25bbf3daf58ec08920a781e25a3f3d'] = 'International priority freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e889962a8517669ba4ac839afa6384df'] = 'Smart post'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0a7bd01967a1874144b1b4fab2ee6a6f'] = 'Standard overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d999f792aee7c730cdc95f6aff4aa436'] = 'Transporteur FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_99e509958c21ac35438651547a7bb035'] = 'Statut du module FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d23a9177c3c7256ede85643a19335afb'] = 'Le transporteur FEDEX est fonctionnel !'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bc95bc43c48a735773d4182dcf526fb'] = 'Le transporteur FEDEX n\'est pas encore complètement configuré.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e203b9a16f360b88d90bba6eb61ce61'] = 'Veuillez remplir le formulaire \"Configuration Générale\"'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c0987b9315003df7dae7f130e3cf58e'] = 'Choississez vos services de livraison disponibles'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e20f6d6f13fe70e78f6e2ab488493ccf'] = 'Test de connection webservice'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_807b063fceafae2c51dc6afb45612389'] = 'Extension Soap activée'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_52f4393e1b52ba63e27310ca92ba098c'] = 'Configuration générale'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_277d63a9b24a09697e3c64092eaf4353'] = 'Configuration des catégories'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_098eec2cabe2c39c6dec3fc522b6571a'] = 'Configuration des produits'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aide'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d2126da975d5b9a5b846efaf57d3fd53'] = 'Configuration générale'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a50bb127f9b307757cf52ab86d70adac'] = 'Votre compte Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8b0ebd10992bd1576eccf605a84175'] = 'Votre Fedex meter number'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c36a272a8778a2e85de52a01675fd521'] = 'Votre mot de passe Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e2cd475470bc7b47bef8d4ecdae2a67'] = 'Votre Fedex Key API'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cdfa1b01c330bf745f776f6c6c8afffd'] = 'Veuillez cliquer ici pour obtenir votre Fedex Key API'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_83ad4fdaf06650e6d9d7ca18f82fb975'] = 'Configuration de localisation'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f489118ea95c746d648d36bb50c226f0'] = 'Unité de poids'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_659c95668841b7d6602ead454b28d4ba'] = 'L\'unité de poids de votre magasin (ex: kg ou lb)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cc13d156306185fd42a860da3049567c'] = 'Unité de mesure'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f804c2bdebc117d9cde3cddad3b49845'] = 'L\'unité de mesure de votre magasin (ex: cm ou in)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2481447d04ae756836d32e3ade240ff4'] = 'Configuration de l\'adresse'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b179e75d464a04d8a04111131b3a3ca'] = 'Adresse (ligne 1)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_281b2def1a9737b33f88013c94fdfeb8'] = 'Adresse (ligne 2)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d30f507473129e70c4b962ceccf175cf'] = 'Code postal'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0585aac6bb77bb49423b2effca0e067'] = 'Ville'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_59716c97497eb9694541f7c3d37b1a4d'] = 'Pays'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f8f5a972333ee726fbe5bb52409c0ed0'] = 'Choississez un pays ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4e9863cf5326e6714388045321665d07'] = 'Choississez un pays dans la liste'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46a2a41cc6e552044816a2d04634545d'] = 'Etat'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cf1580798f7aba85d519afadf1ffd886'] = 'Choississez un état ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_02546d525ab356bd43c91e6b07447496'] = 'Il n\'y a pas de configuration d\'état pour ce pays'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ddc2a5660f7d095fff34d6b93077c80'] = 'Configuration de service'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f405714368454e1f9c932432693aea42'] = 'Type de livraison par défault'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ce135482b30deedcc0046df41c12de79'] = 'Choisissez votre méthode de livraison par défault...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a361a1f786db3dfe07aae42752d3446'] = 'Type de colis par défaut'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4664d1ae1832bed2246e8a6850365075'] = 'Choississez un type de colis par défaut'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5cdd307ba6e260beb4801c0c10e22a3a'] = 'Services de livraison'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_78945de8de090e90045d299651a68a9b'] = 'Disponible'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2d25c72c1b18e562f6654fff8e11711e'] = 'Non disponible'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d63e135774e62574e2a1921267dad142'] = 'Choissisez les services de livraison qui seront disponibles pour vos clients'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9b8c4a7116e8c44e4ebc955fafd47586'] = 'Votre compte fedex n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9cc1a101547b3ece6d946dbbe3469d7'] = 'Votre Fedex meter number n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ce0f66588bbbbbb3ef0634e5ea7da69'] = 'Votre mot de passe Fedex n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7988c0adb770f0f945814c0fb2b5800b'] = 'Votre Fedex API Key n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5d5ae09e7b6041d3449ef2cbfc39f560'] = 'Votre méthode livraison n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e794e452ed4d2cfa13083693a2c8810e'] = 'Votre type de colis n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_805353d2862ea0e658c9ddda871540fa'] = 'Votre code postal n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ef9bd955e165dfb0207877e9fe180aeb'] = 'Votre ville n\'est pas spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ecc7697a320f93f3ee8fb4048dbd64c'] = 'Votre pays n\'est spécifié'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_729d4f7143a3de7b0ed18de667fdf4d5'] = 'Prestashop n\'a pas pu se connecter aux webservices FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9d1b485edd50e6fbd288b340b386b07d'] = 'Aucune description d\'erreur correspondante'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9284bff13acffdd879ef4ac7fca5234'] = 'Configuration non mise à jour'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_67e19ffdaa0a11e69349810403a9727e'] = 'Vous devez configurer l\'onglet \"Configuration Générale\" avant d\'utiliser cet onglet'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a37b48e8684078c0620a997b3baeee9f'] = 'Vous devez configurer l\'onglet \"Configuration Générale\" avant d\'utiliser cet onglet'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f421827ff72ef9a61fb27aa0de62f1e4'] = 'Configuration ID'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Catégorie'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ca2fb7f67355c05d2ffa963fac6e91e1'] = 'Type de ramassage'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d9bc28a26253438f5b16cea5eb35681a'] = 'Type de colis'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20cde117cbc92b9ec1fb4e5bc4a7b9bd'] = 'Frais additionnels'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Services'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_06df33001c1d7187fdd81ea1f5b277aa'] = 'Actions'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4f8e00c5ae41d97ab62a947b8e806d55'] = 'Il n\'y pas de configuration FEDEX spécifiques pour les catégories pour le moment.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f1c611f93510bbee05663c82f6d439e2'] = 'Êtes vous sûr de vouloir effacer cette configuration FEDEX spécifiques pour cette catégorie ?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e0cb9fd22b124c0839302fef54762d7'] = 'Mise à jour d\'une régle'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dd593f8a542ab628cbba98c709255e60'] = 'Ajouter une régle'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1debf905ac528b3f0615cd379ced0d38'] = 'Type de ramassage'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b03dfe92d8c5b6a15d3f139998580563'] = 'Choississez un type de ramassage ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_da42caf26ef85de3d7e48e16ca60b891'] = 'Type de colis'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8d2ee0603dfce09b57d60db628cde269'] = 'Choississez un type de colis ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7fcafa7c47e984693fcb8a92c0fd1beb'] = 'Choississez une catégorie ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d725c0166e978cc30853996c70440873'] = 'Vous devez choisir une catégorie'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff63f917e2a947d454bce41b104cfbd2'] = 'Cette catégorie a déjà une configuration FEDEX spécifique.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_fd0119c2a5fc18aa64887b5b7ab41c19'] = 'Une erreur est survenue, veuillez retenter ultérieurement.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20f40087c53c662adfb4e780500eaa15'] = 'Dans cet onglet, vous pouvez enregistrer une configuration spécifique pour chaque produit.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_deb10517653c255364175796ace3553f'] = 'Produit'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cef3da9171b7ac6d7a6e206e68a2a246'] = 'Il n\'y pas de configuration FEDEX spécifiques pour les produits pour le moment.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ceb0ede9c02d159aa2360a3d0694d9ed'] = 'Êtes vous sûr de vouloir effacer cette configuration FEDEX spécifiques pour ce produit ?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3c4d710b56f4318dae775cff80619f84'] = 'Choississez un produit ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c07640370e4681bf98638d0c458cd2e'] = 'Vous devez choisir un produit.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8fc3abc76f5a163f81962a52fc5a3703'] = 'Ce produit a déjà une configuration FEDEX spécifique'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c3eacca576fbfc5dca21b50d9f6ef8f'] = 'Bienvenue dans le configurateur du module FEDEX pour PrestaShop'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_92640c80a67da1782a18304336405dac'] = 'Cette section vous aidera à comprendre comment configurer chaque module correctement.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec0e6948e8f34818d80f27c309f46661'] = 'Ci-dessous, la description de chaque champs :'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b12c6f84e131ed2192e9d9c6c531f239'] = 'Votre compte FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ea2cd644fcacb9e8fe1d4c9c89a677b'] = 'Vous devez vous inscrire sur le site de FEDEX à cette adresse'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_35ba940948fa0ea163fd01281de10e2f'] = 'Ce champ doit être le code postal du lieu de départ de vos colis.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_81822348ace1ceabad5e9f8992ce9ea4'] = 'Ce champ doit être le pays de départ de vos colis'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_74395432668d0313b593712dfc40479a'] = 'Ce champ correspond au ramassage par défaut (quand il n\'y a pas de configuration spécifique pour le produit ou la catégorie)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9bba478eb4348e49e672e944b072b68'] = 'Ces champs correspondent aux services de livraison disponibles (quand il n\'y a pas de configuration spécifique pour le produit ou la catégorie)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_71ffd676000b4ec8ea95f4096adc3d3c'] = 'Cette section vous permet de définir des configurations FEDEX spécifiques pour chaque catégorie de produit (tel que le type de colis et les frais additionnels)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_89a9eabc8fc9335d484dcb1eb7ef4ac5'] = 'Cette section vous permet de définir des configurations FEDEX spécifiques pour chaque produit (tel que le type de colis et les frais additionnels)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Erreur'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e303843029d99ced59415005037969d'] = 'Les webservices Fedex sont injoignables, veuillez patienter quelques minutes et réessayer.'; diff --git a/modules/fedexcarrier/it.php b/modules/fedexcarrier/it.php new file mode 100644 index 000000000..e916e839a --- /dev/null +++ b/modules/fedexcarrier/it.php @@ -0,0 +1,147 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0d00fcb670ada42dad4698b865f40cd'] = 'Corriere Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0aad1e954489f441f8824e1f990d4774'] = 'Offri ai tuoi clienti modalità di consegna differenti con Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff86cba2f7fe4a2dec854d107a4d99d2'] = 'Class Soap'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_883fa0069f4b0454e2277dd567ab3991'] = 'Unita \'di peso (LB o KG).\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5a3ceec65d417f5d92c26dbf0dccc00d'] = '\'Unità di Dimensione (CM o IN).\''; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4d470fde8487e755a50e9235e3dc13ab'] = 'deve essere configurato per utilizzare questo modulo correttamente'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a1d8be175eff378884736e1b44da526e'] = 'Account Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c481cd53864462a87dcb89c33589ff8e'] = 'Fedex meter'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_918356c887962073f010ee06e1395713'] = 'Password Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c2b826b79539fa093a6db05ca5ec9e0'] = 'Chiave API Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3ef2f9d666a37f95d963a84c46bae646'] = 'Tipo di ritiro Fedex di default'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_72f18dde0a5c9f75dd487adeacb92b56'] = 'Tipo di confezione Fedex di default'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bb8a37c6acccadf3e28a704d59f1f8a'] = 'Centro servizi Business'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c0b3132d2759b40e8525f2466c477d1c'] = 'Drop box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_22db7528d7c5df8e310bf19af75e61d3'] = 'Ritiro regolare'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7e8eb99ef29d93f494ebdc27b59444f5'] = 'Corriere richiesto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_394a844cc3d6d99eb45b4e71afde2c99'] = 'Stazione'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_57185ccd597e58ad9e4944f4356222b6'] = 'FedEx Box 10 kg'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8ccd685b767c927bca8501ae80d954'] = 'FedEx Box 25 kg'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_38f14cc3e27cc856e61e3a7f555148d2'] = 'Fedex Box'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_36aba1bfaa5062695e71a6524008dd8a'] = 'Busta Fedex '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0e6a558b4ce274905600856b20b471e'] = 'Pak Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b2953c3343913eee2398c1fe2651be7'] = 'Tubo Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_451400926783d7a47cd31025717bc97f'] = 'La tua confezione'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46f58e2a308b68cae9d5f5dd8a5d4ad6'] = 'Prima priorità internazionale in Europa'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0fd6265588d27073ef45ed36d5c00c75'] = 'Fedex 1 day freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dfa184d2bf6a5d6ee8ffebfbaa25394c'] = 'Fedex 2 day'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2c0f88b63bfbe05955db90f1dcccab2e'] = 'Fedex 2 day freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_03aac4b90886eabd480cee819e24d09e'] = 'Fedex 3 day freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_687009f2bc600c25a005b26f4cb4ab02'] = 'Fedex express saver'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6e8cf654ec68d7391f5d673331e2c212'] = 'Fedex freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1497c5bee4dd896e0b84c442be1e8760'] = 'Fedex ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_23044a6996eda8ad80874f5bdd72a0bc'] = 'Fedex national freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4cee621e07c270fb1031f231e592a8cd'] = 'First overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e1416870eb1cf36849393bf6ef6f6966'] = 'Ground home delivery'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_124dd98ba09563af1900c14885e97d6e'] = 'International economy'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2751413ff6e957a3b6894929b008b123'] = 'International economy freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cebbbe47be59307e1751e2febe44fdc6'] = 'International first'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f3f9ee160906e71040b437410459ec79'] = 'International ground'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_759d99c1c032d4171c2f142af4f79436'] = 'International priority'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a8c786474d046ba2b2b90b78a7b498cf'] = 'International priority freight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec25bbf3daf58ec08920a781e25a3f3d'] = 'Priority overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e889962a8517669ba4ac839afa6384df'] = 'Smart post'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0a7bd01967a1874144b1b4fab2ee6a6f'] = 'Standard overnight'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d999f792aee7c730cdc95f6aff4aa436'] = 'Corriere FEDEX '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_99e509958c21ac35438651547a7bb035'] = 'Status modulo Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d23a9177c3c7256ede85643a19335afb'] = 'Corriere FEDEX è ben configurato e online!'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5bc95bc43c48a735773d4182dcf526fb'] = 'Corriere FEDEX non è ancora configurato, è necessario:'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e203b9a16f360b88d90bba6eb61ce61'] = 'Riempi il modulo \"Impostazioni generali\"'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8c0987b9315003df7dae7f130e3cf58e'] = 'Seleziona il tuo servizio di consegna disponibile'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e20f6d6f13fe70e78f6e2ab488493ccf'] = 'Test di connessione webservice'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_807b063fceafae2c51dc6afb45612389'] = 'Soap attivato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_52f4393e1b52ba63e27310ca92ba098c'] = 'Impostazioni generali'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_277d63a9b24a09697e3c64092eaf4353'] = 'Impostazioni categorie'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_098eec2cabe2c39c6dec3fc522b6571a'] = 'Impostazioni prodotti'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aiuto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d2126da975d5b9a5b846efaf57d3fd53'] = 'Configurazione generale'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a50bb127f9b307757cf52ab86d70adac'] = 'Il tuo account Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a8b0ebd10992bd1576eccf605a84175'] = 'Il tuo numero di Fedex meter'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c36a272a8778a2e85de52a01675fd521'] = 'La tua password Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e2cd475470bc7b47bef8d4ecdae2a67'] = 'La tua API Key Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cdfa1b01c330bf745f776f6c6c8afffd'] = 'Fare clic qui per ottenere il tuo API Key Fedex'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_83ad4fdaf06650e6d9d7ca18f82fb975'] = 'Configurazione di localizzazione '; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f489118ea95c746d648d36bb50c226f0'] = 'Unità di peso'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_659c95668841b7d6602ead454b28d4ba'] = 'Unità di peso del tuo negozio (es. kg o lb)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cc13d156306185fd42a860da3049567c'] = 'Unità di misura'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f804c2bdebc117d9cde3cddad3b49845'] = 'Unità di misura del tuo negozio (es. cm o in)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2481447d04ae756836d32e3ade240ff4'] = 'Configurazione indirizzo'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5b179e75d464a04d8a04111131b3a3ca'] = 'Indirizzo (linea 1)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_281b2def1a9737b33f88013c94fdfeb8'] = 'Indirizzo (linea 2)'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d30f507473129e70c4b962ceccf175cf'] = 'CAP'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d0585aac6bb77bb49423b2effca0e067'] = 'La tua città'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_59716c97497eb9694541f7c3d37b1a4d'] = 'Paese'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f8f5a972333ee726fbe5bb52409c0ed0'] = 'Scegliere un paese ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4e9863cf5326e6714388045321665d07'] = 'Seleziona il paese all\'interno della lista.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_46a2a41cc6e552044816a2d04634545d'] = 'Stato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cf1580798f7aba85d519afadf1ffd886'] = 'Seleziona uno stato ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_02546d525ab356bd43c91e6b07447496'] = 'Non vi è nessuna configurazione di stato per questo paese'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ddc2a5660f7d095fff34d6b93077c80'] = 'Configurazione servizio'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f405714368454e1f9c932432693aea42'] = 'Tipo ritiro default'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ce135482b30deedcc0046df41c12de79'] = 'Seleziona un tipo di ritiro di default ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9a361a1f786db3dfe07aae42752d3446'] = 'Tipo di confezione di default'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4664d1ae1832bed2246e8a6850365075'] = 'Seleziona un tipo di confezione di default ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5cdd307ba6e260beb4801c0c10e22a3a'] = 'Servizio di consegna'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_78945de8de090e90045d299651a68a9b'] = 'Disponibile'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_2d25c72c1b18e562f6654fff8e11711e'] = 'Non disponibile'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d63e135774e62574e2a1921267dad142'] = 'Scegli il servizio di consegna che sarà disponibile per i clienti.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9b8c4a7116e8c44e4ebc955fafd47586'] = 'Il tuo account Fedex non è specificato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9cc1a101547b3ece6d946dbbe3469d7'] = 'Il tuo Fedex meter non è specificato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ce0f66588bbbbbb3ef0634e5ea7da69'] = 'La tua password Fedex non è specificata'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7988c0adb770f0f945814c0fb2b5800b'] = 'La tua Fedex API Key non è specificata'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5d5ae09e7b6041d3449ef2cbfc39f560'] = 'Il tuo tipo di ritiro non è specificato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_e794e452ed4d2cfa13083693a2c8810e'] = 'Il tuo tipo di confezione non è specificato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_805353d2862ea0e658c9ddda871540fa'] = 'Il tuo CAP non è specificato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ef9bd955e165dfb0207877e9fe180aeb'] = 'La tua città non è specificata'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5ecc7697a320f93f3ee8fb4048dbd64c'] = 'Il tuo paese non è specificato'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_729d4f7143a3de7b0ed18de667fdf4d5'] = 'Prestashop non può connettersi al webservices FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9d1b485edd50e6fbd288b340b386b07d'] = 'Nessuna descrizione dell\'errore trovata'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9284bff13acffdd879ef4ac7fca5234'] = 'Impostazioni non riuscite'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_67e19ffdaa0a11e69349810403a9727e'] = 'È necessario configurare il tab \"Impostazioni generali\" prima di utilizzare questo tab.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_a37b48e8684078c0620a997b3baeee9f'] = 'In questo tab è possibile impostare una configurazione specifica per ogni categoria.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f421827ff72ef9a61fb27aa0de62f1e4'] = 'Config ID'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoria'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ca2fb7f67355c05d2ffa963fac6e91e1'] = 'Tipo di ritiro'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d9bc28a26253438f5b16cea5eb35681a'] = 'Tipo di confezione'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20cde117cbc92b9ec1fb4e5bc4a7b9bd'] = 'Spese aggiuntive'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Servizi'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_06df33001c1d7187fdd81ea1f5b277aa'] = 'Azioni'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_4f8e00c5ae41d97ab62a947b8e806d55'] = 'Non vi è alcuna configurazione specifica FEDEX per le categorie a questo punto.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_f1c611f93510bbee05663c82f6d439e2'] = 'Sei sicuro di voler cancellare questa specifica configurazione FEDEX per questa categoria?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3e0cb9fd22b124c0839302fef54762d7'] = 'Aggiorna di una regola'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_dd593f8a542ab628cbba98c709255e60'] = 'Aggiungi una regola'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_1debf905ac528b3f0615cd379ced0d38'] = 'Tipo ritiro'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b03dfe92d8c5b6a15d3f139998580563'] = 'Seleziona un tipo di ritiro ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_da42caf26ef85de3d7e48e16ca60b891'] = 'Tipo di confezione'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8d2ee0603dfce09b57d60db628cde269'] = 'Seleziona un tipo di confezione...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_7fcafa7c47e984693fcb8a92c0fd1beb'] = 'Seleziona una categoria ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_d725c0166e978cc30853996c70440873'] = 'Devi selezionare una categoria.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ff63f917e2a947d454bce41b104cfbd2'] = 'Questa categoria ha già una configurazione specifica FEDEX.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_fd0119c2a5fc18aa64887b5b7ab41c19'] = 'Si è verificato un errore, per favore riprova.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_20f40087c53c662adfb4e780500eaa15'] = 'In questo tab è possibile impostare una configurazione specifica per ogni prodotto.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_deb10517653c255364175796ace3553f'] = 'Prodotto'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_cef3da9171b7ac6d7a6e206e68a2a246'] = 'Non vi è alcuna configurazione specifica FEDEX per i prodotti a questo punto.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ceb0ede9c02d159aa2360a3d0694d9ed'] = 'Sei sicuro di voler cancellare questa specifica configurazione FEDEX per questo prodotto?'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_3c4d710b56f4318dae775cff80619f84'] = 'Scegli un prodotto ...'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c07640370e4681bf98638d0c458cd2e'] = 'Devi selezionare un prodotto.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_8fc3abc76f5a163f81962a52fc5a3703'] = 'Questo prodotto ha già una configurazione specifica FEDEX.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_9c3eacca576fbfc5dca21b50d9f6ef8f'] = 'Benvenuti nel configuratore di modulo PrestaShop FEDEX!'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_92640c80a67da1782a18304336405dac'] = 'Questa sezione ti aiuterà a capire come configurare questo modulo correttamente.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_ec0e6948e8f34818d80f27c309f46661'] = 'Vedi sotto per la descrizione di ogni campo:'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b12c6f84e131ed2192e9d9c6c531f239'] = 'Il tuo account FEDEX'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_0ea2cd644fcacb9e8fe1d4c9c89a677b'] = 'È necessario iscriversi sul sito web FEDEX a questo indirizzo'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_35ba940948fa0ea163fd01281de10e2f'] = 'Questo campo deve essere il CAP del punto di partenza del tuo pacco.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_81822348ace1ceabad5e9f8992ce9ea4'] = 'Questo campo deve essere il paese del punto di partenza del tuo pacco.'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_74395432668d0313b593712dfc40479a'] = 'Questo campo corrisponde al tipo di ritiro di default (quando non c\'è alcuna configurazione specifica per il prodotto o la categoria di prodotto).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_b9bba478eb4348e49e672e944b072b68'] = 'Queste caselle corrispondono ai servizi di consegna che vuoi mettere a disposizione (quando non c\'è alcuna configurazione specifica per il prodotto o la categoria di prodotto).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_71ffd676000b4ec8ea95f4096adc3d3c'] = 'Questa sezione ti permette di definire una configurazione specifica FEDEX per ogni categoria di prodotti (come il tipo di confezione e le spese supplementari).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_89a9eabc8fc9335d484dcb1eb7ef4ac5'] = 'Questa sezione ti permette di definire una configurazione specifica FEDEX per ogni prodotto (come il tipo di confezione e le spese supplementari).'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Errore'; +$_MODULE['<{fedexcarrier}prestashop>fedexcarrier_5e303843029d99ced59415005037969d'] = 'Fedex Webservice sembra non funzionare, attendi qualche minuto e riprova'; + +?> \ No newline at end of file diff --git a/modules/fedexcarrier/logo.gif b/modules/fedexcarrier/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..bcd02eb85bf0df588d80265dd496d06b942588b0 GIT binary patch literal 552 zcmZ?wbhEHb6krf$IOfY>pxEH4oZ+LE6`+-4qu*+8*zRD|?qu5OY}V!HI5FI7T7=K^ zX#bfpfisgMXBVU`EzVq4mIFj9s|r?C6|Q=jAXrnp=54azs}%8fsiN;PB;RF9y~>hr zuiMnou<3P~QE%I}S#2x(JGM{g*gmaq_nTIanUnUuZ}pr#<>1E!1)rCdep=JCYwN|` z+b?|H)ctYC)X%$TeBM3l^Zxm#j@|iuc<GlTi!Yvg^zFjVZ&wf8x%KqN^&{VJ9e@7x z-Iu4=U%q(v`qjs`uin3T^Xc8&&%fS3|MTI+=TG1MeE;<8*Y7{SfByab<L{r}|A65C z;022R1f7dg6H8K46v{J8G8EiBeFGR2f3h%gG1N2YFaQB4q8Qi<8ho3YTUy)NJ370% zdwN?P?VWtRr?@+~xOh&P!ok2jd5RgMxTw`^Z#E@kH5FeC1tuwd6ALdR4|XnAULHP9 zA!bQ+a~XL<9~MgiSzSR99VTg0H&qE|Z)H1IF<~2iIYli^13hbP+rF2tUcY(U+sI%I E07hw9_5c6? literal 0 HcmV?d00001 diff --git a/modules/fedexcarrier/sql-install.php b/modules/fedexcarrier/sql-install.php new file mode 100755 index 000000000..f8ea912b4 --- /dev/null +++ b/modules/fedexcarrier/sql-install.php @@ -0,0 +1,89 @@ +<?php + + // Init + $sql = array(); + + // Create Service Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'fedex_rate_service_code` ( + `id_fedex_rate_service_code` int(10) NOT NULL AUTO_INCREMENT, + `id_carrier` int(10) NOT NULL, + `id_carrier_history` text NOT NULL, + `code` varchar(64) NOT NULL, + `service` varchar(255) NOT NULL, + `active` tinyint(1) NOT NULL, + UNIQUE(`code`, `service`), + PRIMARY KEY (`id_fedex_rate_service_code`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + // Insert Service in database + $sql[] = "INSERT INTO `"._DB_PREFIX_."fedex_rate_service_code` (`id_carrier`, `id_carrier_history`, `code`, `service`, `active`) VALUES + ('0', '', 'EUROPE_FIRST_INTERNATIONAL_PRIORITY', 'Europe first international priority', '0'), + ('0', '', 'FEDEX_1_DAY_FREIGHT', 'Fedex 1 day freight', '0'), + ('0', '', 'FEDEX_2_DAY', 'Fedex 2 day', '0'), + ('0', '', 'FEDEX_2_DAY_FREIGHT', 'Fedex 2 day freight', '0'), + ('0', '', 'FEDEX_3_DAY_FREIGHT', 'Fedex 3 day freight', '0'), + ('0', '', 'FEDEX_EXPRESS_SAVER', 'Fedex express saver', '0'), + ('0', '', 'FEDEX_FREIGHT', 'Fedex freight', '0'), + ('0', '', 'FEDEX_GROUND', 'Fedex ground', '0'), + ('0', '', 'FEDEX_NATIONAL_FREIGHT', 'Fedex national freight', '0'), + ('0', '', 'FIRST_OVERNIGHT', 'First overnight', '0'), + ('0', '', 'GROUND_HOME_DELIVERY', 'Ground home delivery', '0'), + ('0', '', 'INTERNATIONAL_ECONOMY', 'International economy', '0'), + ('0', '', 'INTERNATIONAL_ECONOMY_FREIGHT', 'International economy freight', '0'), + ('0', '', 'INTERNATIONAL_FIRST', 'International first', '0'), + ('0', '', 'INTERNATIONAL_GROUND', 'International ground', '0'), + ('0', '', 'INTERNATIONAL_PRIORITY', 'International priority', '0'), + ('0', '', 'INTERNATIONAL_PRIORITY_FREIGHT', 'International priority freight', '0'), + ('0', '', 'PRIORITY_OVERNIGHT', 'Priority overnight', '0'), + ('0', '', 'SMART_POST', 'Smart post', '0'), + ('0', '', 'STANDARD_OVERNIGHT', 'Standard overnight', '0');"; + + // Create Cache Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'fedex_cache` ( + `id_fedex_cache` int(10) NOT NULL AUTO_INCREMENT, + `id_cart` int(10) NOT NULL, + `id_carrier` int(10) NOT NULL, + `hash` varchar(32) NOT NULL, + `id_currency` int(10) NOT NULL, + `total_charges` double(10,2) NOT NULL, + `is_available` tinyint(1) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_fedex_cache`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + // Create Test Cache Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'fedex_cache_test` ( + `id_fedex_cache_test` int(10) NOT NULL AUTO_INCREMENT, + `hash` varchar(1024) NOT NULL, + `result` text NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_fedex_cache_test`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + // Create Config Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'fedex_rate_config` ( + `id_fedex_rate_config` int(10) NOT NULL AUTO_INCREMENT, + `id_product` int(10) NOT NULL, + `id_category` int(10) NOT NULL, + `id_currency` int(10) NOT NULL, + `pickup_type_code` varchar(64) NOT NULL, + `packaging_type_code` varchar(64) NOT NULL, + `additional_charges` double(6,2) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_fedex_rate_config`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + // Create Config (Service) Table in Database + $sql[] = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'fedex_rate_config_service` ( + `id_fedex_rate_config_service` int(10) NOT NULL AUTO_INCREMENT, + `id_fedex_rate_service_code` int(10) NOT NULL, + `id_fedex_rate_config` int(10) NOT NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_fedex_rate_config_service`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + +?> diff --git a/modules/fedexcarrier/sql-uninstall.php b/modules/fedexcarrier/sql-uninstall.php new file mode 100755 index 000000000..63b945d4a --- /dev/null +++ b/modules/fedexcarrier/sql-uninstall.php @@ -0,0 +1,11 @@ +<?php + + // Init + $sql = array(); + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'fedex_rate_service_code`;'; + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'fedex_cache`;'; + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'fedex_cache_test`;'; + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'fedex_rate_config`;'; + $sql[] = 'DROP TABLE IF EXISTS `'._DB_PREFIX_.'fedex_rate_config_service`;'; + +?> diff --git a/modules/feeder/config.xml b/modules/feeder/config.xml new file mode 100755 index 000000000..070578c2e --- /dev/null +++ b/modules/feeder/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>feeder</name> + <displayName><![CDATA[RSS products feed]]></displayName> + <version><![CDATA[0.2]]></version> + <description><![CDATA[Generate a RSS products feed]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/feeder/de.php b/modules/feeder/de.php new file mode 100644 index 000000000..150a5b5ab --- /dev/null +++ b/modules/feeder/de.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{feeder}prestashop>feeder_4dce2f12546b229088d3cc214c3c2f7d'] = 'RSS-Feeds für Produkte'; +$_MODULE['<{feeder}prestashop>feeder_d70a880c7153de483014eababfa65f11'] = 'Generieren Sie ein RSS-Feed für Produkte'; + +?> \ No newline at end of file diff --git a/modules/feeder/en.php b/modules/feeder/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/feeder/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/feeder/es.php b/modules/feeder/es.php new file mode 100644 index 000000000..4b512133b --- /dev/null +++ b/modules/feeder/es.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{feeder}prestashop>feeder_4dce2f12546b229088d3cc214c3c2f7d'] = 'Fuente de productos RSS'; +$_MODULE['<{feeder}prestashop>feeder_d70a880c7153de483014eababfa65f11'] = 'Generar fuente de productos RSS'; diff --git a/modules/feeder/feeder.php b/modules/feeder/feeder.php new file mode 100644 index 000000000..abaedcfd3 --- /dev/null +++ b/modules/feeder/feeder.php @@ -0,0 +1,87 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Feeder extends Module +{ + private $_postErrors = array(); + + public function __construct() + { + $this->name = 'feeder'; + $this->tab = 'front_office_features'; + $this->version = 0.2; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_directory = dirname(__FILE__).'/../../'; + parent::__construct(); + + $this->displayName = $this->l('RSS products feed'); + $this->description = $this->l('Generate a RSS products feed'); + } + + function install() + { + if (!parent::install()) + return false; + if (!$this->registerHook('header')) + return false; + return true; + } + + function hookHeader($params) + { + global $smarty, $cookie; + + $id_category = (int)(Tools::getValue('id_category')); + if (!$id_category) + { + if (isset($_SERVER['HTTP_REFERER']) AND preg_match('!^(.*)\/([0-9]+)\-(.*[^\.])|(.*)id_category=([0-9]+)(.*)$!', $_SERVER['HTTP_REFERER'], $regs) AND !strstr($_SERVER['HTTP_REFERER'], '.html')) + { + if (isset($regs[2]) AND is_numeric($regs[2])) + $id_category = (int)($regs[2]); + elseif (isset($regs[5]) AND is_numeric($regs[5])) + $id_category = (int)($regs[5]); + } + elseif ($id_product = (int)(Tools::getValue('id_product'))) + { + $product = new Product($id_product); + $id_category = $product->id_category_default; + } + } + $category = new Category($id_category); + $orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby')); + $orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway')); + $smarty->assign(array( + 'feedUrl' => Tools::getShopDomain(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/rss.php?id_category='.$id_category.'&amp;orderby='.$orderBy.'&amp;orderway='.$orderWay, + )); + return $this->display(__FILE__, 'feederHeader.tpl'); + } +} diff --git a/modules/feeder/feederHeader.tpl b/modules/feeder/feederHeader.tpl new file mode 100644 index 000000000..d40e0442d --- /dev/null +++ b/modules/feeder/feederHeader.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<link rel="alternate" type="application/rss+xml" title="{$meta_title|escape:html:'UTF-8'}" href="{$feedUrl}" /> \ No newline at end of file diff --git a/modules/feeder/fr.php b/modules/feeder/fr.php new file mode 100644 index 000000000..845a6986c --- /dev/null +++ b/modules/feeder/fr.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{feeder}prestashop>feeder_4dce2f12546b229088d3cc214c3c2f7d'] = 'Flux RSS de produits'; +$_MODULE['<{feeder}prestashop>feeder_d70a880c7153de483014eababfa65f11'] = 'Générer un Flux RSS de produits'; diff --git a/modules/feeder/it.php b/modules/feeder/it.php new file mode 100644 index 000000000..862b13ff3 --- /dev/null +++ b/modules/feeder/it.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{feeder}prestashop>feeder_4dce2f12546b229088d3cc214c3c2f7d'] = 'Feed RSS prodotti'; +$_MODULE['<{feeder}prestashop>feeder_d70a880c7153de483014eababfa65f11'] = 'Crea un Feed RSS prodotti'; + +?> \ No newline at end of file diff --git a/modules/feeder/logo.gif b/modules/feeder/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a5e0099f7522ee53c55350a42a41c1018feaeea GIT binary patch literal 1009 zcmeH`=}Xgb0Ed6(%oUR6Jn|rqkW9o(E7YVs$}6*pcp|3rKyn_7G%=#-h8N2Y6R%vR z=8<JH#FNUYp^2Eik@8KXBLflC)b_i+pYo6BT_2wJ4?OS*4G;10O*5m+s0xZgs5!z# zh!i181hEJ)7KpV#q6LyIA+bcJ6{J?kv&Ic;+&aRB>L9m4g$=4~anBYHZ1Knrb@pg< z(AW6V_x+%Dp&$Cwwdd)_7tnSbo$lyzN3REZJ?XkYraqWy2xgitF;7C7mM}&gf%;f9 z#Gx?(O$lgDggO~dQ`pu>wk?WzCT2UtTvrU*u5mrF+>1D_H=cWy#J^7F-=v^D70=Vr znU3yEwl5#O+33sR2U7V#2^q?OCKvsAWF(7>Ws|qp$-5l9m$LmbcHkxkWEhmOL&X>_ z#7Gf0T7t1+Xmg>>!$dwN3&=zf#&2Wd4yNw%<7ND$5+CIJbOk?Mg_$zUC@`zUTsfIl zVZM^g*Ksq=Sg686HUFubEcTGaKJraVmZykrj{N*g*1nL96|%X4O&zv$*jXjpYuH)C z?mB+2L%#w27U*AKw!!Rx)r0#B4W0uC^?(1qfD<h+q$pF$eNVOb2}(FmISB2;G_6{N zP;|&bt4XUgJ$gD>6Oa}p5IQeqOKX3qY`oG&3;MlWsuijvjc2q(Ia6bQCZoesrYsen zP23g+d3Rn_+ZE~kot!QjRC>qn&poU&o~!pM%o?`YG%T&~x?<8p2d|o`-70r|zNb!( z8=bsta-igx@pOx?>ms$ZAqg<@h!9kr5_E|jPbev)j|<Lnfm?X>#)3={q7u3INyl6F rQ3BVna-qR;yRpjJBjKeu`fH%V=%Bfyk6133Q<P*nF08pIfI9aFStfGK literal 0 HcmV?d00001 diff --git a/modules/feeder/rss.php b/modules/feeder/rss.php new file mode 100644 index 000000000..f3f2a589d --- /dev/null +++ b/modules/feeder/rss.php @@ -0,0 +1,78 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); + +// Get data +$number = ((int)(Tools::getValue('n')) ? (int)(Tools::getValue('n')) : 10); +$orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby')); +$orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway')); +$id_category = ((int)(Tools::getValue('id_category')) ? (int)(Tools::getValue('id_category')) : 1); +$products = Product::getProducts((int)($cookie->id_lang), 0, ($number > 10 ? 10 : $number), $orderBy, $orderWay, $id_category, true); +$currency = new Currency((int)($cookie->id_currency)); +$affiliate = (Tools::getValue('ac') ? '?ac='.(int)(Tools::getValue('ac')) : ''); + +// Send feed +header("Content-Type:text/xml; charset=utf-8"); +echo '<?xml version="1.0" encoding="UTF-8"?>'."\n"; +?> +<rss version="2.0"> + <channel> + <title><![CDATA[<?php echo Configuration::get('PS_SHOP_NAME') ?>]]></title> + <link><?php echo _PS_BASE_URL_.__PS_BASE_URI__; ?></link> + <mail><?php echo Configuration::get('PS_SHOP_EMAIL') ?></mail> + <generator>PrestaShop</generator> + <language><?php echo Language::getIsoById((int)($cookie->id_lang)); ?></language> + <image> + <title><![CDATA[<?php echo Configuration::get('PS_SHOP_NAME') ?>]]></title> + <url><?php echo _PS_BASE_URL_.__PS_BASE_URI__.'img/logo.jpg'; ?></url> + <link><?php echo _PS_BASE_URL_.__PS_BASE_URI__; ?></link> + </image> +<?php + foreach ($products AS $product) + { + $image = Image::getImages((int)($cookie->id_lang), $product['id_product']); + echo "\t\t<item>\n"; + echo "\t\t\t<title><![CDATA[".$product['name']." - ".html_entity_decode(Tools::displayPrice(Product::getPriceStatic($product['id_product']), $currency), ENT_COMPAT, 'UTF-8')." ]]></title>\n"; + echo "\t\t\t<description>"; + $cdata = true; + if (is_array($image) AND sizeof($image)) + { + $imageObj = new Image($image[0]['id_image']); + echo "<![CDATA[<img src='"._PS_BASE_URL_._THEME_PROD_DIR_.$imageObj->getExistingImgPath()."-small.jpg' title='".str_replace('&', '', $product['name'])."' alt='thumb' />"; + $cdata = false; + } + if ($cdata) + echo "<![CDATA["; + echo $product['description_short']."]]></description>\n"; + + echo "\t\t\t<link><![CDATA[".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Category::getLinkRewrite((int)($product['id_category_default']), $cookie->id_lang))).$affiliate."]]></link>\n"; + echo "\t\t</item>\n"; + } +?> + </channel> +</rss> \ No newline at end of file diff --git a/modules/fianetfraud/config.xml b/modules/fianetfraud/config.xml new file mode 100755 index 000000000..c6d4db3e0 --- /dev/null +++ b/modules/fianetfraud/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>fianetfraud</name> + <displayName><![CDATA[FIA-NET - Syst&egrave;me d&#039;Analyse des Commandes]]></displayName> + <version><![CDATA[1.1]]></version> + <description><![CDATA[Prot&eacute;gez vous contre la fraude &agrave; la carte bancaire sans perturber l&#039;acte d&#039;achat]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[payment_security]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries>fr</limited_countries> +</module> \ No newline at end of file diff --git a/modules/fianetfraud/cron_reevaluate.php b/modules/fianetfraud/cron_reevaluate.php new file mode 100644 index 000000000..391b30389 --- /dev/null +++ b/modules/fianetfraud/cron_reevaluate.php @@ -0,0 +1,31 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/fianetfraud.php'); + +FianetFraud::reEvaluateOrder(); + diff --git a/modules/fianetfraud/cron_waiting.php b/modules/fianetfraud/cron_waiting.php new file mode 100644 index 000000000..4d9ec9159 --- /dev/null +++ b/modules/fianetfraud/cron_waiting.php @@ -0,0 +1,33 @@ +#!/usr/bin/php +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/fianetfraud.php'); + +FianetFraud::checkWaitingOrders(); + diff --git a/modules/fianetfraud/de.php b/modules/fianetfraud/de.php new file mode 100644 index 000000000..9a5301bd5 --- /dev/null +++ b/modules/fianetfraud/de.php @@ -0,0 +1,38 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetfraud}prestashop>fianetfraud_740e53a0ed1b643f69c4aaa8ad4ae8d2'] = 'Ungültige Lieferanten-Code'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7ccf58c950043c9fbfed668df13ce608'] = 'Die Einstellungen werden aktualisiert'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_380b4179d36bce6ca862459a43b217b5'] = 'Um sich anzumelden, melden Sie sich ab:'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_592fcfe937f6d58f70d0918ef6373afa'] = 'Fia-Net Website'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dea78007133396a7b8ed70578ac6ae'] = 'Login'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_dc647eb65e6711e155375218212b3964'] = 'Kennwort'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b250a007769c7ffe655c74cfb8176b8c'] = 'Seiten-ID'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_30dbd3dffa9dbd08b062436ba8dcbad7'] = 'Betriebsmodus'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dbbd4d0ac4c725f3b0d2ff29abaf63'] = 'Standard-Produkttyp'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7bc873cba11f035df692c3549366c722'] = '-- bitte auswählen --'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b16c6b201b9dea0dba4c5214e584d5a9'] = 'Kategoriedetails'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_32b1e872d533aced68e8fd06117c35d9'] = 'Kategorie Typ'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_bb8d6a9f57dcf8f450d8c8b6107cfabb'] = 'Wählen Sie eine Kategorie ...'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_5f001485711e47385cb84b10c888bbfd'] = 'Lieferanten-Konfiguration'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_84a4ee79ed85180a743340dceb2f98d1'] = 'Lieferant Detail'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_914419aa32f04011357d3b604a86d7eb'] = 'Lieferant'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Lieferantenart'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Wählen Sie eine Lieferantenart ...'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_803d8f90719db3a605cf4af72ab2d8ee'] = 'Standard-Lieferantenart'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_4a04490d2817c00012562df7bc43299d'] = 'Zahlungskonfiguration'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ff18b8d27988b97ba1dd72120dd524ea'] = 'Zahlungsdetails'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Zahlungs-Modul'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Zahlungsart'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_127469a6b4253ebb77adccc0dd48461e'] = 'Herr'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Frau'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Unbekannt'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_d13270d4831bb2a2723f0fb5b573807c'] = 'Fianet Bestätigung'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_e010021939a49b7cce07f0e546c1d54f'] = 'Detailansicht'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b086843368d1c92d0a86cbee76b20b6f'] = 'Evaluate'; + +?> \ No newline at end of file diff --git a/modules/fianetfraud/es.php b/modules/fianetfraud/es.php new file mode 100644 index 000000000..d1cc7540a --- /dev/null +++ b/modules/fianetfraud/es.php @@ -0,0 +1,36 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetfraud}prestashop>fianetfraud_740e53a0ed1b643f69c4aaa8ad4ae8d2'] = 'Código transportista no válido'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7ccf58c950043c9fbfed668df13ce608'] = 'Parámetros actualizados con éxito'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_380b4179d36bce6ca862459a43b217b5'] = 'Para conectarse, visita:'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_592fcfe937f6d58f70d0918ef6373afa'] = 'Web de FIA-net'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dea78007133396a7b8ed70578ac6ae'] = 'Usuario'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_dc647eb65e6711e155375218212b3964'] = 'Contraseña'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b250a007769c7ffe655c74cfb8176b8c'] = 'ID sitio Web'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_30dbd3dffa9dbd08b062436ba8dcbad7'] = 'Modo producción'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dbbd4d0ac4c725f3b0d2ff29abaf63'] = 'Tipo por defecto'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7bc873cba11f035df692c3549366c722'] = '--Elija--'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b16c6b201b9dea0dba4c5214e584d5a9'] = 'Detalle'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoría'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_32b1e872d533aced68e8fd06117c35d9'] = 'Tipo'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_bb8d6a9f57dcf8f450d8c8b6107cfabb'] = 'Elegir la categoría'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_5f001485711e47385cb84b10c888bbfd'] = 'Configurar el transportista'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_84a4ee79ed85180a743340dceb2f98d1'] = 'Detalle'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_914419aa32f04011357d3b604a86d7eb'] = 'Transportista'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Tipo de transportista'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Elegir tipo de transportista'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_803d8f90719db3a605cf4af72ab2d8ee'] = 'Tipo de transportista por defecto'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_4a04490d2817c00012562df7bc43299d'] = 'Confuguración del pago'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ff18b8d27988b97ba1dd72120dd524ea'] = 'Detalle del pago'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Módulo de pago'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Tipo de pago'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_127469a6b4253ebb77adccc0dd48461e'] = 'Sr.'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Sra.'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Desconocido'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_d13270d4831bb2a2723f0fb5b573807c'] = 'Validación Fia-Net'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_e010021939a49b7cce07f0e546c1d54f'] = 'Ver detalle'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b086843368d1c92d0a86cbee76b20b6f'] = 'Evaluación'; diff --git a/modules/fianetfraud/fianet/classes/fianet_key_32bits.php b/modules/fianetfraud/fianet/classes/fianet_key_32bits.php new file mode 100644 index 000000000..e201eda54 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/fianet_key_32bits.php @@ -0,0 +1,274 @@ +<?php +/* +** PHP implementation of the RSA Data Security, Inc. MD5 Message +** Digest Algorithm, as defined in RFC 1321. +* +** Version 1.1 +** Copyright 2004 Marcus Campbell +** http://www.tecknik.net/md5/ +* +** This code is available under the GNU Lesser General Public License: +** http://www.gnu.org/licenses/lgpl.txt +* +** Based on the JavaScript implementation by Paul Johnston +** http://pajhome.org.uk/ +*/ +Class HashMD5 { + var $a; + var $b; + var $c; + var $d; + + var $Save_a; + var $Save_b; + var $Save_c; + var $Save_d; + + function HashMD5() { + /* + $a = 1732584190; + $b = -271733879; + $c = -1732584194; + $d = 271733878; */ + $this->a = -279229019; + $this->b = -1875190530; + $this->c = 1737040641; + $this->d = 315143286; + + $this->Save_a = $this->a; + $this->Save_b = $this->b; + $this->Save_c = $this->c; + $this->Save_d = $this->d; + } + + function FlushKey($k0, $k1, $k2, $k3) { + $this->a = $k0; + $this->b = $k1; + $this->c = $k2; + $this->d = $k3; + + $this->Save_a = $this->a; + $this->Save_b = $this->b; + $this->Save_c = $this->c; + $this->Save_d = $this->d; + } + + function Init() { + $this->a = $this->Save_a; + $this->b = $this->Save_b; + $this->c = $this->Save_c; + $this->d = $this->Save_d; + } + + function rhex($num) { + $hex_chr = "0123456789abcdef"; + $str = ""; + for($j = 0; $j <= 3; $j++) + $str .= substr($hex_chr, ($num >> ($j * 8 + 4)) & 0x0F, 1) . substr($hex_chr, ($num >> ($j * 8)) & 0x0F, 1); + return $str; + } + + function str2blks_MD5($str) { + $nblk = ((strlen($str) + 8) >> 6) + 1; + for($i = 0; $i < $nblk * 16; $i++) $blks[$i] = 0; + for($i = 0; $i < strlen($str); $i++) + $blks[$i >> 2] |= ord(substr($str, $i, 1)) << (($i % 4) * 8); + $blks[$i >> 2] |= 0x80 << (($i % 4) * 8); + $blks[$nblk * 16 - 2] = strlen($str) * 8; + return $blks; + } + + function add($x, $y) { + $lsw = ($x & 0xFFFF) + ($y & 0xFFFF); + $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16); + return ($msw << 16) | ($lsw & 0xFFFF); + } + + function rol($num, $cnt) { + return ($num << $cnt) | $this->zeroFill($num, 32 - $cnt); + } + + function zeroFill($a, $b) { + $bin = decbin($a); + if (strlen($bin) < $b) $bin = 0; + else $bin = substr($bin, 0, strlen($bin) - $b); + for ($i=0; $i < $b; $i++) { + $bin = "0".$bin; + } + return bindec($bin); + } + + function cmn($q, $a, $b, $x, $s, $t) { + return $this->add($this->rol($this->add($this->add($a, $q), $this->add($x, $t)), $s), $b); + } + + function ff($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn(($b & $c) | ((~$b) & $d), $a, $b, $x, $s, $t); + } + + function gg($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn(($b & $d) | ($c & (~$d)), $a, $b, $x, $s, $t); + } + + function hh($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn($b ^ $c ^ $d, $a, $b, $x, $s, $t); + } + + function ii($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn($c ^ ($b | (~$d)), $a, $b, $x, $s, $t); + } + + function hash($str) { + $x = $this->str2blks_MD5($str); + + $this->Init(); + + for($i = 0; $i < sizeof($x); $i += 16) { + $olda = $this->a; + $oldb = $this->b; + $oldc = $this->c; + $oldd = $this->d; + + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+ 0], 7 , -680876936); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+ 1], 12, -389564586); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+ 2], 17, 606105819); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+ 3], 22, -1044525330); + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+ 4], 7 , -176418897); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+ 5], 12, 1200080426); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+ 6], 17, -1473231341); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+ 7], 22, -45705983); + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+ 8], 7 , 1770035416); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+ 9], 12, -1958414417); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+10], 17, -42063); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+11], 22, -1990404162); + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+12], 7 , 1804603682); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+13], 12, -40341101); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+14], 17, -1502002290); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+15], 22, 1236535329); + + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+ 1], 5 , -165796510); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+ 6], 9 , -1069501632); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+11], 14, 643717713); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+ 0], 20, -373897302); + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+ 5], 5 , -701558691); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+10], 9 , 38016083); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+15], 14, -660478335); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+ 4], 20, -405537848); + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+ 9], 5 , 568446438); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+14], 9 , -1019803690); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+ 3], 14, -187363961); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+ 8], 20, 1163531501); + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+13], 5 , -1444681467); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+ 2], 9 , -51403784); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+ 7], 14, 1735328473); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+12], 20, -1926607734); + + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+ 5], 4 , -378558); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+ 8], 11, -2022574463); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+11], 16, 1839030562); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+14], 23, -35309556); + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+ 1], 4 , -1530992060); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+ 4], 11, 1272893353); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+ 7], 16, -155497632); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+10], 23, -1094730640); + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+13], 4 , 681279174); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+ 0], 11, -358537222); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+ 3], 16, -722521979); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+ 6], 23, 76029189); + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+ 9], 4 , -640364487); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+12], 11, -421815835); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+15], 16, 530742520); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+ 2], 23, -995338651); + + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+ 0], 6 , -198630844); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+ 7], 10, 1126891415); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+14], 15, -1416354905); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+ 5], 21, -57434055); + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+12], 6 , 1700485571); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+ 3], 10, -1894986606); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+10], 15, -1051523); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+ 1], 21, -2054922799); + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+ 8], 6 , 1873313359); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+15], 10, -30611744); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+ 6], 15, -1560198380); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+13], 21, 1309151649); + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+ 4], 6 , -145523070); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+11], 10, -1120210379); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+ 2], 15, 718787259); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+ 9], 21, -343485551); + + $this->a = $this->add($this->a, $olda); + $this->b = $this->add($this->b, $oldb); + $this->c = $this->add($this->c, $oldc); + $this->d = $this->add($this->d, $oldd); + } + return $this->rhex($this->a) . $this->rhex($this->b) . $this->rhex($this->c) . $this->rhex($this->d); + } +} +Class EncodingKey { + var $clMD5; + + function EncodingKey() { + $this->clMD5 = new HashMD5(); + } + + function giveHashCode($pkey, $second, $email, $refid, $montant, $nom) { + + $modulo = $second % 4; + + switch($modulo) { + case 0: + $select = $montant; + break; + case 1: + $select = $email; + break; + case 2: + $select = $refid; + break; + case 3: + $select = $nom; + break; + default: + break; + } + + return $this->clMD5->hash($pkey.$refid.$select); + + } + + function giveHashCode2($pkey, $second, $email, $refid, $montant, $nom) { + $modulo = $second % 4; + +$montant = sprintf("%01.2f",$montant); + + switch($modulo) { + case 0: + $select = $montant; + break; + case 1: + $select = $email; + break; + case 2: + $select = $refid; + break; + case 3: + $select = $nom; + break; + default: + break; + } +/* + $fp = fopen('/var/www/fianet/test_greg.txt','ab'); + fwrite($fp,"second=".$second."\n"); + fwrite($fp,"montant=".$montant."\n"); + fwrite($fp,"email=".$email."\n"); + fwrite($fp,"refid=".$refid."\n"); + fwrite($fp,"nom=".$nom."\n"); + fclose($fp); +*/ + + return $this->clMD5->hash($pkey.$refid.$montant.$email.$select); + + } +} diff --git a/modules/fianetfraud/fianet/classes/fianet_key_64bits.php b/modules/fianetfraud/fianet/classes/fianet_key_64bits.php new file mode 100644 index 000000000..ecffe63a1 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/fianet_key_64bits.php @@ -0,0 +1,279 @@ +<?php +/* +** PHP implementation of the RSA Data Security, Inc. MD5 Message +** Digest Algorithm, as defined in RFC 1321. +* +** Version 1.1 +** Copyright 2004 Marcus Campbell +** http://www.tecknik.net/md5/ +* +** This code is available under the GNU Lesser General Public License: +** http://www.gnu.org/licenses/lgpl.txt +* +** Based on the JavaScript implementation by Paul Johnston +** http://pajhome.org.uk/ +* +** Modified by PJ ALBERT +** for 64bit system +*/ +Class HashMD5 { + var $a; + var $b; + var $c; + var $d; + + var $Save_a; + var $Save_b; + var $Save_c; + var $Save_d; + + function HashMD5() { + /* + $a = 1732584190; + $b = -271733879; + $c = -1732584194; + $d = 271733878; */ + $this->a = -279229019; + $this->b = -1875190530; + $this->c = 1737040641; + $this->d = 315143286; + + $this->Save_a = $this->a; + $this->Save_b = $this->b; + $this->Save_c = $this->c; + $this->Save_d = $this->d; + } + + function FlushKey($k0, $k1, $k2, $k3) { + $this->a = $k0; + $this->b = $k1; + $this->c = $k2; + $this->d = $k3; + + $this->Save_a = $this->a; + $this->Save_b = $this->b; + $this->Save_c = $this->c; + $this->Save_d = $this->d; + } + + function Init() { + $this->a = $this->Save_a; + $this->b = $this->Save_b; + $this->c = $this->Save_c; + $this->d = $this->Save_d; + } + + function rhex($num) { + $hex_chr = "0123456789abcdef"; + $str = ""; + for($j = 0; $j <= 3; $j++) + $str .= substr($hex_chr, ($num >> ($j * 8 + 4)) & 0x0F, 1) . substr($hex_chr, ($num >> ($j * 8)) & 0x0F, 1); + return $str; + } + + function str2blks_MD5($str) { + $nblk = ((strlen($str) + 8) >> 6) + 1; + for($i = 0; $i < $nblk * 16; $i++) $blks[$i] = 0; + for($i = 0; $i < strlen($str); $i++) + $blks[$i >> 2] |= ord(substr($str, $i, 1)) << (($i % 4) * 8); + $blks[$i >> 2] |= 0x80 << (($i % 4) * 8); + $blks[$nblk * 16 - 2] = strlen($str) * 8; + return $blks; + } + + function parse_unsigned_int($s) { + $x = (float)$s; + if($x > (float)2147483647) + $x -= (float)"4294967296"; + if($x < (float)-2147483648) + $x += (float)"4294967296"; + return (int)$x; + } + + function add($x, $y) { + $lsw = ($x & 0xFFFF) + ($y & 0xFFFF); + $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16); + return $this->parse_unsigned_int(($msw << 16) | ($lsw & 0xFFFF)); + } + + function rol($num, $cnt) { + $num = $num & 0xFFFFFFFF; + return $this->parse_unsigned_int(($num << $cnt) & 0xFFFFFFFF | $this->zeroFill($num, 32 - $cnt)); + } + + function zeroFill($a, $b) { + $bin = decbin($a); + if (strlen($bin) < $b) $bin = 0; + else $bin = substr($bin, 0, strlen($bin) - $b); + for ($i=0; $i < $b; $i++) { + $bin = "0".$bin; + } + return bindec($bin); + } + + function cmn($q, $a, $b, $x, $s, $t) { + return $this->add($this->rol($this->add($this->add($a, $q), $this->add($x, $t)), $s), $b); + } + + function ff($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn(($b & $c) | ((~$b) & $d), $a, $b, $x, $s, $t); + } + + function gg($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn(($b & $d) | ($c & (~$d)), $a, $b, $x, $s, $t); + } + + function hh($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn($b ^ $c ^ $d, $a, $b, $x, $s, $t); + } + + function ii($a, $b, $c, $d, $x, $s, $t) { + return $this->cmn($c ^ ($b | (~$d)), $a, $b, $x, $s, $t); + } + + function hash($str) { + + $x = $this->str2blks_MD5($str); + $this->Init(); + + for($i = 0; $i < sizeof($x); $i += 16) { + $olda = $this->a; + $oldb = $this->b; + $oldc = $this->c; + $oldd = $this->d; + + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+ 0], 7 , -680876936); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+ 1], 12, -389564586); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+ 2], 17, 606105819); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+ 3], 22, -1044525330); + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+ 4], 7 , -176418897); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+ 5], 12, 1200080426); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+ 6], 17, -1473231341); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+ 7], 22, -45705983); + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+ 8], 7 , 1770035416); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+ 9], 12, -1958414417); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+10], 17, -42063); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+11], 22, -1990404162); + $this->a = $this->ff($this->a, $this->b, $this->c, $this->d, $x[$i+12], 7 , 1804603682); + $this->d = $this->ff($this->d, $this->a, $this->b, $this->c, $x[$i+13], 12, -40341101); + $this->c = $this->ff($this->c, $this->d, $this->a, $this->b, $x[$i+14], 17, -1502002290); + $this->b = $this->ff($this->b, $this->c, $this->d, $this->a, $x[$i+15], 22, 1236535329); + + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+ 1], 5 , -165796510); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+ 6], 9 , -1069501632); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+11], 14, 643717713); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+ 0], 20, -373897302); + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+ 5], 5 , -701558691); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+10], 9 , 38016083); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+15], 14, -660478335); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+ 4], 20, -405537848); + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+ 9], 5 , 568446438); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+14], 9 , -1019803690); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+ 3], 14, -187363961); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+ 8], 20, 1163531501); + $this->a = $this->gg($this->a, $this->b, $this->c, $this->d, $x[$i+13], 5 , -1444681467); + $this->d = $this->gg($this->d, $this->a, $this->b, $this->c, $x[$i+ 2], 9 , -51403784); + $this->c = $this->gg($this->c, $this->d, $this->a, $this->b, $x[$i+ 7], 14, 1735328473); + $this->b = $this->gg($this->b, $this->c, $this->d, $this->a, $x[$i+12], 20, -1926607734); + + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+ 5], 4 , -378558); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+ 8], 11, -2022574463); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+11], 16, 1839030562); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+14], 23, -35309556); + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+ 1], 4 , -1530992060); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+ 4], 11, 1272893353); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+ 7], 16, -155497632); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+10], 23, -1094730640); + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+13], 4 , 681279174); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+ 0], 11, -358537222); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+ 3], 16, -722521979); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+ 6], 23, 76029189); + $this->a = $this->hh($this->a, $this->b, $this->c, $this->d, $x[$i+ 9], 4 , -640364487); + $this->d = $this->hh($this->d, $this->a, $this->b, $this->c, $x[$i+12], 11, -421815835); + $this->c = $this->hh($this->c, $this->d, $this->a, $this->b, $x[$i+15], 16, 530742520); + $this->b = $this->hh($this->b, $this->c, $this->d, $this->a, $x[$i+ 2], 23, -995338651); + + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+ 0], 6 , -198630844); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+ 7], 10, 1126891415); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+14], 15, -1416354905); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+ 5], 21, -57434055); + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+12], 6 , 1700485571); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+ 3], 10, -1894986606); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+10], 15, -1051523); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+ 1], 21, -2054922799); + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+ 8], 6 , 1873313359); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+15], 10, -30611744); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+ 6], 15, -1560198380); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+13], 21, 1309151649); + $this->a = $this->ii($this->a, $this->b, $this->c, $this->d, $x[$i+ 4], 6 , -145523070); + $this->d = $this->ii($this->d, $this->a, $this->b, $this->c, $x[$i+11], 10, -1120210379); + $this->c = $this->ii($this->c, $this->d, $this->a, $this->b, $x[$i+ 2], 15, 718787259); + $this->b = $this->ii($this->b, $this->c, $this->d, $this->a, $x[$i+ 9], 21, -343485551); + + $this->a = $this->add($this->a, $olda); + $this->b = $this->add($this->b, $oldb); + $this->c = $this->add($this->c, $oldc); + $this->d = $this->add($this->d, $oldd); + } + + return $this->rhex($this->a) . $this->rhex($this->b) . $this->rhex($this->c) . $this->rhex($this->d); + } +} + +Class EncodingKey { + var $clMD5; + + function EncodingKey() { + $this->clMD5 = new HashMD5(); + } + + function giveHashCode($pkey, $second, $email, $refid, $montant, $nom) { + + $modulo = $second % 4; + + switch($modulo) { + case 0: + $select = $montant; + break; + case 1: + $select = $email; + break; + case 2: + $select = $refid; + break; + case 3: + $select = $nom; + break; + default: + break; + } + + return $this->clMD5->hash($pkey.$refid.$select); + } + + function giveHashCode2($pkey, $second, $email, $refid, $montant, $nom) { + $modulo = $second % 4; + + switch($modulo) { + case 0: + $select = $montant; + break; + case 1: + $select = $email; + break; + case 2: + $select = $refid; + break; + case 3: + $select = $nom; + break; + default: + break; + } + //echo "String PHP : ".$pkey.$refid.$montant.$email.$select."<br>"; + + return $this->clMD5->hash($pkey.$refid.$montant.$email.$select); + + } +} +?> diff --git a/modules/fianetfraud/fianet/classes/fianet_sender.php b/modules/fianetfraud/fianet/classes/fianet_sender.php new file mode 100644 index 000000000..431ad97e6 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/fianet_sender.php @@ -0,0 +1,473 @@ +<?php + +class fianet_sender +{ + var $mode = null; + var $orders = array(); + + function fianet_sender() + { + } + + function add_order($order) + { + if (!is_array($order)) + { + if (var_is_object_of_class($order, 'fianet_order_xml')) + { + $this->orders[] = $order; + } + } + else + { + foreach ($order as $o) + { + if (var_is_object_of_class($o, 'fianet_order_xml')) + { + $this->orders[] = $o; + } + } + } + } + + //Envoie toutes les commandes une par une + function send_orders_singet() + { + if (!count($this->orders) > 0) + { + fianet_insert_log("fianet_sender.php - send_orders_singet() <br />\nNo order to send."); + return; + } + if (!$this->check_order_data()) + { + fianet_insert_log("fianet_sender.php - send_orders_singet() <br />\nOrders list is not valid."); + return; + } + + foreach ($this->orders as $order) + { + $xml = '<?xml version="1.0" encoding="'. FIANET_ENCODING . '" ?>' . "\n"; + $xml .= $order->get_xml(); + $data['siteid'] = $order->info_commande->siteid; + $data['controlcallback'] = clean_xml($xml); + $this->send_fsock_singet($data); + } + } + + //Envoie les commandes par lot de 25 + function send_orders_stacking() + { + if (!count($this->orders) > 0) + { + fianet_insert_log("fianet_sender.php - send_orders_stackfast() <br />\nNo order to send."); + return; + } + if (!$this->check_order_data()) + { + fianet_insert_log("fianet_sender.php - send_orders_stackfast() <br />\nOrders list is not valid."); + return; + } + $stack = array(); + $count = 0; + $results = array(); + foreach ($this->orders as $order) + { + if ($count < 25) + { + $count++; + $stack[] = $order; + } + elseif ($count == 25) + { + + $results = array_merge($results, $this->process_stack($stack)); + $stack = array(); + $stack[] = $order; + $count = 1; + } + } + $results = array_merge($results, $this->process_stack($stack)); + return ($results); + } + + //Recupre une liste d'valuations + function get_evaluation($order_list, $Separ = ',') + { + $evaluations = array(); + if (count($order_list) > 0) + { + $order_list_by_stack = array_chunk($order_list, 50, true); + foreach ($order_list_by_stack as $stack) + { + $evaluations = array_merge($this->get_evaluation_by_stack($stack, $Separ), $evaluations); + } + } + return ($evaluations); + } + + + function get_evaluation_by_stack($order_list, $Separ = ',') + { + if (count($order_list) > 0) + { + if ($this->mode == 'production') + { + $url = URL_SAC_PROD; + } + else + { + $url = URL_SAC_TEST; + } + $siteid = FIANET_SAC_SITE_ID; + $pwd = FIANET_SAC_PWD; + $mode = 'mini'; + $repFT = '0'; + $listID = ''; + foreach ($order_list as $id_order) + { + if ($listID != '') + { + $listID .= $Separ . $id_order; + } + else + { + $listID .= $id_order; + } + } + $data['SiteID'] = $siteid; + $data['Pwd'] = $pwd; + $data['Mode'] = $mode; + $data['RepFT'] = $repFT; + $data['ListID'] = $listID; + $data['Separ'] = $Separ; + + $s = new fianet_socket($url, URl_SAC_GETVALIDSTACK, 'POST', $data); + $result = $s->send(); + $evaluations = array(); + if ($result === false) + { + fianet_insert_log("fianet_sender.php - get_evaluation() <br />\nError when opening file : <br />\n".$url); + } + else + { + $xmldata = $result['data']; + $xml_array = xml2array($xmldata); + //debug($xml_array); + $evaluations = $this->process_result($xml_array); + return ($evaluations); + } + return ($evaluations); + } + } + + /* + mthodes prives + */ + + function process_result($xml_array) + { + $evaluations = array(); + //debug($xml_array, 'xml_array'); + if (isset($xml_array['stack']['result'])) + { + if (isset($xml_array['stack']['result'][0])) + { + foreach ($xml_array['stack']['result'] as $res) + { + if (eregi("error", $res['attr']['retour'])) + { + fianet_insert_log("fianet_sender.php - process_result() <br />\nErreur : <br />\n".$res['attr']['message']); + } + else + { + //$index = count($evaluations); + //$evaluations[$index] = $this->process_result_array($res); + $eval = $this->process_result_array($res); + if ($eval['refid'] != null) + { + $evaluations[$eval['refid']] = $eval; + } + } + } + } + else + { + $res = $xml_array['stack']['result']; + if (eregi("error", $res['attr']['retour'])) + { + fianet_insert_log("fianet_sender.php - process_result() <br />\nErreur : <br />\n".$res['attr']['message']); + } + else + { + //$index = count($evaluations); + $eval = $this->process_result_array($res); + if ($eval['refid'] != null) + { + $evaluations[$eval['refid']] = $eval; + } + } + } + } + else if (isset($xml_array['result']['transaction'])) + { + if (isset($xml_array['result']['transaction'][0])) + { + foreach ($xml_array['result']['transaction'] as $transaction) + { + $eval = $this->process_transaction_array($transaction); + //debug($eval); + if ($eval['refid'] != null) + { + $evaluations[$eval['refid']] = $eval; + } + } + } + else + { + $transaction = $xml_array['result']['transaction']; + $eval = $this->process_transaction_array($transaction); + if ($eval['refid'] != null) + { + $evaluations[$eval['refid']] = $eval; + } + } + } + + return ($evaluations); + } + + function process_result_array($res) + { + //debug($res, 'Result'); + $eval['refid'] = $res['attr']['refid']; + if ( $res['attr']['retour'] == 'absente') + { + $eval['info'] = 'absente'; + } + else + { + if (isset($res['transaction'][0])) + { + $transaction = end($res['transaction']); + } + else + { + $transaction = $res['transaction']; + } + $etat = $this->process_transaction_array($transaction); + $eval['eval'] = $etat['eval']; + $eval['info'] = $etat['info']; + $eval['cid'] = $etat['cid']; + } + return ($eval); + } + + function process_transaction_array($transaction) + { + $eval = array(); + //debug($transaction); + + if ($transaction['attr']['avancement'] == 'error') + { + $eval['eval'] = 'error'; + $eval['info'] = $transaction['detail']['value']; + $eval['cid'] = ''; + $eval['refid'] = $transaction['attr']['refid']; + } + elseif ($transaction['attr']['avancement'] == 'encours') + { + $eval['eval'] = 'encours'; + $eval['info'] = $transaction['detail']['value']; + $eval['cid'] = ''; + $eval['refid'] = $transaction['attr']['refid']; + } + elseif ($transaction['attr']['avancement'] == 'traitee') + { + $eval['eval'] = $transaction['analyse']['eval']['value']; + $eval['info'] = $transaction['analyse']['eval']['attr']['info']; + $eval['cid'] = $transaction['attr']['cid']; + $eval['refid'] = $transaction['attr']['refid']; + } + + return ($eval); + } + + function process_stack($stack) + { + $xml = '<?xml version="1.0" encoding="'. FIANET_ENCODING . '" ?>' . "\n"; + $xml .= '<stack>' . "\n"; + foreach ($stack as $order) + { + $xml .= $order->get_xml(); + if (!isset($siteid)) + { + $siteid = $order->info_commande->siteid; + } + } + $xml .= '</stack>'; + $data['siteid'] = $siteid; + $data['controlcallback'] = clean_xml($xml); + $result = array(); + $result = $this->send_fsock_stacking($data); + return ($result); + } + + function process_result_stacking($xml_data) + { + $result = array(); + $xml_array = xml2array($xml_data); + //debug($xml_array); + if (isset($xml_array['validstack']['unluck'])) + { + fianet_insert_log("fianet_sender.php - process_result_stacking() <br />\nError : <br />\n".$xml_array['validstack']['unluck']['value']); + return ($result); + } + elseif (isset($xml_array['validstack']['result'])) + { + $xml_array = $xml_array['validstack']['result']; + //debug($xml_array); + if (isset($xml_array[0])) + { + foreach ($xml_array as $transaction_result) + { + $index = count($result); + $result[$index]['refid'] = $transaction_result['attr']['refid']; + $result[$index]['etat'] = $transaction_result['attr']['avancement']; + $result[$index]['details'] = $transaction_result['detail']['value']; + } + } + else + { + $index = count($result); + $result[$index]['refid'] = $xml_array['attr']['refid']; + $result[$index]['etat'] = $xml_array['attr']['avancement']; + $result[$index]['details'] = $xml_array['detail']['value']; + } + } + return ($result); + } + + function check_order_data() + { + $res = true; + foreach ($this->orders as $order) + { + if (!var_is_object_of_class($order, 'fianet_order_xml')) + { + $res = false; + } + } + return ($res); + } + + function send_fsock_singet($data) + { + if ($this->mode == 'production') + { + $url_action = URL_SAC_PROD; + } + else + { + $url_action = URL_SAC_TEST; + } + $path = URl_SAC_SINGET; + + $s = new fianet_socket($url_action, $path, 'GET', $data); + $res = $s->send(); + if ($res === false) + { + fianet_insert_log("fianet_sender.php - send_fsock_post() <br />\nError when connecting : <br />\n".$url_action . $path); + return (false); + } + return (true); + } + + function send_fsock_stacking($data) + { + if ($this->mode == 'production') + { + $url_action = URL_SAC_PROD; + } + else + { + $url_action = URL_SAC_TEST; + } + $path = URl_SAC_STACKING; + + $s = new fianet_socket($url_action, $path, 'POST', $data); + $res = $s->send(); + if ($res === false) + { + fianet_insert_log("fianet_sender.php - send_fsock_post() <br />\nError when connecting : <br />\n".$url_action . $path); + return (false); + } + else + { + $result = $this->process_result_stacking($res['data']); + return ($result); + } + } + + function get_reevaluated_order() + { + if ($this->mode == 'production') + { + $url_action = URL_SAC_PROD; + } + else + { + $url_action = URL_SAC_TEST; + } + $path = URl_SAC_GETALERT; + $mode = 'new'; + $output = 'mini'; + $repFT = '0'; + + $data['SiteID'] = FIANET_SAC_SITE_ID; + $data['Pwd'] = FIANET_SAC_PWD; + $data['Mode'] = $mode; + $data['Output'] = $output; + $data['RepFT'] = $repFT; + + $s = new fianet_socket($url_action, $path, "POST", $data); + $res = $s->send(); + $evaluations = array(); + if ($res === false) + { + fianet_insert_log("fianet_sender.php - get_reevaluated_order() <br />\nError when opening file : <br />\n".$url); + } + else + { + $xmldata = $res['data']; + //Le code comment suivant permet de tester la rception d'une revaluation + /*$xmldata = '<?xml version="1.0" encoding="ISO-8859-1" ?> + <result version="3.1" site="10" retour="trouvee" count="1"> + <transaction avancement="traitee" cid="95458898" refid="Refresh04"> + <detail>Paiement valid</detail> + <analyse> + <eval date="20/05/2008 10:27:46" critere="16" validation="Acheteur connu" info="acheteur certifi">100</eval> + <classement id="1">Transactions traiter/Nouvelles/Contrle visuel</classement> + </analyse> + </transaction> + <transaction avancement="traitee" cid="15458898" refid="Refresh05"> + <detail>Paiement valid</detail> + <analyse> + <eval date="20/05/2008 10:27:46" critere="16" validation="Acheteur connu" info="acheteur certifi">100</eval> + <classement id="1">Transactions traiter/Nouvelles/Contrle visuel</classement> + </analyse> + </transaction> + </result>';*/ + $xml_array = xml2array($xmldata); + if (isset($xml_array['result']['attr']['retour'])) + { + if ($xml_array['result']['attr']['retour'] == "param_error") + { + fianet_insert_log("fianet_sender.php - get_reevaluated_order() <br />\nParam_error : <br />\n".$xml_array['result']['attr']['message']."\n<br>$url_action"); + } + } + $evaluations = $this->process_result($xml_array); + } + return ($evaluations); + } +} + diff --git a/modules/fianetfraud/fianet/classes/fianet_sender.private.inc.php b/modules/fianetfraud/fianet/classes/fianet_sender.private.inc.php new file mode 100644 index 000000000..6bfd22f76 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/fianet_sender.private.inc.php @@ -0,0 +1,235 @@ +<?php + +function process_result($xml_array) +{ + $evaluations = array(); + //debug($xml_array, 'xml_array'); + if (isset($xml_array['stack']['result'][0])) + { + foreach ($xml_array['stack']['result'] as $res) + { + if (eregi("error", $res['attr']['retour'])) + { + fianet_insert_log("fianet_sender.php - process_result() <br />\nErreur : <br />\n".$res['attr']['message']); + } + else + { + $index = count($evaluations); + $evaluations[$index] = $this->process_result_array($res); + } + } + } + else + { + $res = $xml_array['stack']['result']; + if (eregi("error", $res['attr']['retour'])) + { + fianet_insert_log("fianet_sender.php - process_result() <br />\nErreur : <br />\n".$res['attr']['message']); + } + else + { + $index = count($evaluations); + $evaluations[$index] = $this->process_result_array($res); + } + } + return ($evaluations); +} + +function process_result_array($res) +{ + //debug($res, 'Result'); + $eval['refid'] = $res['attr']['refid']; + if ( $res['attr']['retour'] == 'absente') + { + $eval['info'] = 'absente'; + } + else + { + if (isset($res['transaction'][0])) + { + $transaction = end($res['transaction']); + } + else + { + $transaction = $res['transaction']; + } + $etat = $this->process_transaction_array($transaction); + $eval['eval'] = $etat['eval']; + $eval['info'] = $etat['info']; + $eval['cid'] = $etat['cid']; + } + return ($eval); +} + +function process_transaction_array($transaction) +{ + $eval = array(); + //debug($transaction); + + if ($transaction['attr']['avancement'] == 'error') + { + $eval['refid'] = $transaction['attr']['refid']; + $eval['eval'] = 'error'; + $eval['info'] = $transaction['detail']['value']; + $eval['cid'] = ''; + } + elseif ($transaction['attr']['avancement'] == 'encours') + { + $eval['refid'] = $transaction['attr']['refid']; + $eval['eval'] = 'encours'; + $eval['info'] = $transaction['detail']['value']; + $eval['cid'] = ''; + } + elseif ($transaction['attr']['avancement'] == 'traitee') + { + $eval['refid'] = $transaction['attr']['refid']; + $eval['eval'] = $transaction['analyse']['eval']['value']; + $eval['info'] = $transaction['analyse']['eval']['attr']['info']; + $eval['cid'] = $transaction['attr']['cid']; + } + + return ($eval); +} + +function process_stack($stack) +{ + $xml = '<?xml version="1.0" encoding="'. FIANET_ENCODING . '" ?>' . "\n"; + $xml .= '<stack>' . "\n"; + foreach ($stack as $order) + { + $xml .= $order->get_xml(); + if (!isset($siteid)) + { + $siteid = $order->info_commande->siteid; + } + } + $xml .= '</stack>'; + $data['siteid'] = $siteid; + $data['controlcallback'] = clean_xml($xml); + $this->send_fsock_stacking($data); +} + +function process_result_stacking($xml_data) +{ + $result = array(); + $xml_array = xml2array($xml_data); + //debug($xml_array); + if (isset($xml_array['validstack']['unluck'])) + { + fianet_insert_log("fianet_sender.php - process_result_stacking() <br />\nError : <br />\n".$xml_array['validstack']['unluck']['value']); + return ($result); + } + elseif (isset($xml_array['validstack']['result'])) + { + $xml_array = $xml_array['validstack']['result']; + //debug($xml_array); + if (isset($xml_array[0])) + { + foreach ($xml_array as $transaction_result) + { + $index = count($result); + $result[$index]['refid'] = $transaction_result['attr']['refid']; + $result[$index]['etat'] = $transaction_result['attr']['avancement']; + $result[$index]['details'] = $transaction_result['detail']['value']; + } + } + else + { + $index = count($result); + $result[$index]['refid'] = $xml_array['attr']['refid']; + $result[$index]['etat'] = $xml_array['attr']['avancement']; + $result[$index]['details'] = $xml_array['detail']['value']; + } + } + return ($result); +} + +function check_order_data() +{ + $res = true; + foreach ($this->orders as $order) + { + if (!var_is_object_of_class($order, 'fianet_order_xml')) + { + $res = false; + } + } + return ($res); +} + +function send_fsock_singet($data) +{ + if ($mode == 'production') + { + $url_action = URL_SAC_PROD; + } + else + { + $url_action = URL_SAC_TEST; + } + $path = URl_SAC_SINGET; + + $s = new fianet_socket($url_action, $path, 'GET', $data); + $res = $s->send(); + if ($res === false) + { + fianet_insert_log("fianet_sender.php - send_fsock_post() <br />\nError when connecting : <br />\n".$url_action . $path); + return (false); + } + return (true); +} + +function send_fsock_stacking($data) +{ + if ($this->mode == 'production') + { + $url_action = URL_SAC_PROD; + } + else + { + $url_action = URL_SAC_TEST; + } + $path = URl_SAC_STACKING; + + $s = new fianet_socket($url_action, $path, 'POST', $data); + $res = $s->send(); + if ($res === false) + { + fianet_insert_log("fianet_sender.php - send_fsock_post() <br />\nError when connecting : <br />\n".$url_action . $path); + return (false); + } + else + { + $result = $this->process_result_stacking($res['data']); + //debug($result); + return ($result); + } +} + +function process_result_nostack($xml_array) +{ + $evaluations = array(); + //debug($xml_array, 'xml_array'); + if (isset($xml_array['result']['transaction'][0])) + { + foreach ($xml_array['result']['transaction'] as $res) + { + $eval = $this->process_transaction_array($res); + if ($eval['refid'] != null) + { + $evaluations[$eval['refid']] = $eval; + } + } + } + else + { + $res = $xml_array['result']['transaction']; + $eval = $this->process_transaction_array($res); + if ($eval['refid'] != null) + { + $evaluations[$eval['refid']] = $eval; + } + } + return ($evaluations); +} + diff --git a/modules/fianetfraud/fianet/classes/fianet_socket.php b/modules/fianetfraud/fianet/classes/fianet_socket.php new file mode 100644 index 000000000..4d8a8ab1d --- /dev/null +++ b/modules/fianetfraud/fianet/classes/fianet_socket.php @@ -0,0 +1,172 @@ +<?php + + + class fianet_socket + { + var $host; + var $port; + + var $is_ssl = false; + + var $method = 'GET'; + + var $data = array(); + var $path; + + function fianet_socket($fianet_url, $fianet_file, $method = 'GET', $data = array()) + { + if (is_array($data)) + { + $this->data = $data; + } + $this->parse_fianet_url($fianet_url, $fianet_file); + if (strtoupper($method) == 'GET' || strtoupper($method) == 'POST') + { + $this->method = strtoupper($method); + } + } + + function parse_fianet_url($fianet_url, $fianet_file) + { + if (ereg("^http://", $fianet_url)) + { + $this->is_ssl = false; + $this->host = eregi_replace("http://([^/]+)/.+", "\\1", $fianet_url); + $this->port = 80; + $this->path = eregi_replace("http://[^/]+/", "/", $fianet_url) . $fianet_file; + } + if (ereg("^https://", $fianet_url)) + { + $this->is_ssl = true; + $this->host = eregi_replace("https://([^/]+)/.+", "\\1", $fianet_url); + $this->port = 443; + $this->path = eregi_replace("https://[^/]+/", "/", $fianet_url) . $fianet_file; + } + //debug($this->path); + } + + function determine_boundary() + { + srand((double)microtime() * 1000000); + return ("---------------------".substr(md5(rand(0,32000)),0,10)); + } + + function build_header($boundary, $data) + { + if ($this->method == 'POST') + { + $header = "POST ".$this->path." HTTP/1.0\r\n"; + $header .= "Host: ".$this->host."\r\n"; + $header .= "Content-type: application/x-www-form-urlencoded; boundary=$boundary\r\n"; + $header .= "Content-length: " . strlen($data) . "\r\n\r\n"; + } + elseif ($this->method == 'GET') + { + if ($data != '') + { + if (strlen($this->path."?".$data) > 2048) + { + fianet_insert_log("fianet_socket.php - build_header() <br />\nMaximum length in get method reached(".strlen($this->path."?".$data).") : <br />\n".$this->path."?".$data); + } + $header = "GET ".$this->path."?".$data." HTTP/1.1\r\n"; + } + else + { + $header = "GET ".$this->path." HTTP/1.1\r\n"; + } + $header .= "Host: ".$this->host."\r\n"; + $header .= "Connection: close\r\n\r\n"; + } + return ($header); + } + + function build_data($boundary) + { + $data = ""; + foreach($this->data as $index => $value) + { + if ($data == '') + { + $data .= $index . '='. urlencode($value); + } + else + { + $data .= '&'.$index . '='. urlencode($value); + } + } + return ($data); + } + + function send() + { + $boundary = $this->determine_boundary(); + $data = $this->build_data($boundary); + $header = $this->build_header($boundary, $data); + + //debug($header, 'header'); + //debug(htmlentities($data), 'data'); + $response = $this->connect($header, $data); + if ($response != false) + { + $d['header'] = $response['header']; + $d['data'] = htmlentities($response['data']); + //debug($d, 'Rponse'); + } + + return ($response); + } + + function connect($header, $data) + { + $res['header'] = ""; + $res['data'] = ""; + if ($this->is_ssl) + { + $host = 'ssl://'.$this->host . ':'.$this->port; + $socket = fsockopen ('ssl://'.$this->host, $this->port); + } + else + { + $host = $this->host . ':' . $this->port; + $socket = fsockopen ($this->host, $this->port); + } + if ($socket !== false) + { + $data_reached = false; + if (@fputs($socket, $header.$data)) + { + while (!feof($socket)) + { + $line = fgets($socket); + if (!$data_reached) + { + if ($line == "\r\n") + { + $data_reached = true; + } + else + { + $res['header'] .= $line; + } + } + else + { + $res['data'] .= $line; + } + } + } + else + { + fianet_insert_log("fianet_socket.php - connect() <br />\nEnvoie des donnes impossible sur : <br />\n".$host); + $res = false; + } + fclose($socket); + } + else + { + fianet_insert_log("fianet_socket.php - connect() <br />\nConnexion socket impossible : <br />\n".$host); + $res = false; + } + return ($res); + } + } diff --git a/modules/fianetfraud/fianet/classes/order/fianet_adress_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_adress_xml.php new file mode 100644 index 000000000..2740b5de9 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_adress_xml.php @@ -0,0 +1,76 @@ +<?php + + class fianet_adress_xml + { + var $type; + var $format = 1; + var $rue1; + var $rue2; + var $cpostal; + var $ville; + var $pays; + var $appartement = null; + + function get_xml() + { + $xml = ''; + if ($this->type != null) + { + $xml .= "\t" . '<adresse type="'.$this->type.'" format="'.$this->format.'">' . "\n"; + if ($this->rue1 != '') + { + $xml .= "\t\t" . '<rue1>'.clean_invalid_char($this->rue1).'</rue1>' . "\n"; + } + else + { + fianet_insert_log("fianet_adress_xml.php - get_xml() <br />\n rue1 is undefined"); + return; + } + if ($this->rue2 != "") + { + $xml .= "\t\t" . '<rue2>'.clean_invalid_char($this->rue2).'</rue2>' . "\n"; + } + if ($this->cpostal != "") + { + $xml .= "\t\t" . '<cpostal>'.clean_invalid_char($this->cpostal).'</cpostal>' . "\n"; + } + else + { + fianet_insert_log("fianet_adress_xml.php - get_xml() <br />\n cpostal is undefined"); + return; + } + if ($this->ville != "") + { + $xml .= "\t\t" . '<ville>'.clean_invalid_char($this->ville).'</ville>' . "\n"; + } + else + { + fianet_insert_log("fianet_adress_xml.php - get_xml() <br />\n ville is undefined"); + return; + } + if ($this->pays != "") + { + $xml .= "\t\t" . '<pays>'.clean_invalid_char($this->pays).'</pays>' . "\n"; + } + else + { + fianet_insert_log("fianet_adress_xml.php - get_xml() <br />\n pays is undefined"); + return; + } + if ($this->appartement != null) + { + if (var_is_object_of_class($this->appartement, 'fianet_appartment_xml')) + { + $xml .= $this->appartement->get_xml(); + } + else + { + fianet_insert_log("fianet_adress_xml.php - get_xml() <br />\nAppartement is not an object of type fianet_appartment_xml"); + } + } + $xml .= "\t" . '</adresse>' . "\n"; + } + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_appartment_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_appartment_xml.php new file mode 100644 index 000000000..73e003ea6 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_appartment_xml.php @@ -0,0 +1,44 @@ +<?php + + class fianet_appartment_xml + { + var $digicode1; + var $digicode2; + var $escalier; + var $etage; + var $nporte; + var $batiment; + + function get_xml() + { + $xml = ''; + $xml .= "\t\t" . '<appartement>' . "\n"; + if ($this->digicode1 != '') + { + $xml .= "\t\t\t" . '<digicode1>'.clean_invalid_char($this->digicode1).'</digicode1>' . "\n"; + } + if ($this->digicode2 != '') + { + $xml .= "\t\t\t" . '<digicode2>'.clean_invalid_char($this->digicode2).'</digicode2>' . "\n"; + } + if ($this->escalier != '') + { + $xml .= "\t\t\t" . '<escalier>'.clean_invalid_char($this->escalier).'</escalier>' . "\n"; + } + if ($this->etage != '') + { + $xml .= "\t\t\t" . '<etage>'.clean_invalid_char($this->etage).'</etage>' . "\n"; + } + if ($this->nporte != '') + { + $xml .= "\t\t\t" . '<nporte>'.clean_invalid_char($this->nporte).'</nporte>' . "\n"; + } + if ($this->batiment != '') + { + $xml .= "\t\t\t" . '<batiment>'.clean_invalid_char($this->batiment).'</batiment>' . "\n"; + } + $xml .= "\t\t" . '</appartement>' . "\n"; + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_billing_adress_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_billing_adress_xml.php new file mode 100644 index 000000000..f808b986d --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_billing_adress_xml.php @@ -0,0 +1,13 @@ +<?php + + class fianet_billing_adress_xml extends fianet_adress_xml + { + var $type = 'facturation'; + + function fianet_billing_adress_xml($order = null) + { + } + + + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_billing_user_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_billing_user_xml.php new file mode 100644 index 000000000..401bbfa8f --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_billing_user_xml.php @@ -0,0 +1,13 @@ +<?php + + class fianet_billing_user_xml extends fianet_user_xml + { + var $type = 'facturation'; + + function fianet_billing_user_xml($order = null) + { + + } + + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_delivery_adress_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_delivery_adress_xml.php new file mode 100644 index 000000000..c3d4a057d --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_delivery_adress_xml.php @@ -0,0 +1,11 @@ +<?php + + class fianet_delivery_adress_xml extends fianet_adress_xml + { + var $type = 'livraison'; + + function fianet_delivery_adress_xml() + { + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_delivery_user_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_delivery_user_xml.php new file mode 100644 index 000000000..3aa1deba5 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_delivery_user_xml.php @@ -0,0 +1,11 @@ +<?php + + class fianet_delivery_user_xml extends fianet_user_xml + { + var $type = 'livraison'; + + function fianet_delivery_user_xml($order = null) + { + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_info_order_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_info_order_xml.php new file mode 100644 index 000000000..ae272a0f3 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_info_order_xml.php @@ -0,0 +1,50 @@ +<?php + class fianet_info_order_xml + { + var $siteid = 0; + var $refid = 0; + var $montant = 0; + var $devise = "EUR"; + var $ip; + var $timestamp; + var $transport; + var $list; + + function fianet_info_order_xml() + { + $this->list = new fianet_product_list_xml(); + $this->transport = new fianet_transport_xml(); + $this->siteid = FIANET_SAC_SITE_ID; + } + + + function get_xml() + { + $xml = ''; + if (!($this->siteid != "" && $this->refid != "" && $this->montant > 0 && $this->devise != "")) + { + fianet_insert_log("fianet_info_order_xml.php - get_xml() <br />Somes values are undefined\n"); + } + if ($this->transport == null) + { + fianet_insert_log("fianet_info_order_xml.php - get_xml() <br />Transport is undefined\n"); + } + if ($this->list == null) + { + fianet_insert_log("fianet_info_order_xml.php - get_xml() <br />List products is undefined\n"); + } + $xml .= "\t" . '<infocommande>' . "\n"; + $xml .= "\t\t" . '<siteid>'.$this->siteid.'</siteid>' . "\n"; + $xml .= "\t\t" . '<refid>'.$this->refid.'</refid>' . "\n"; + $xml .= "\t\t" . '<montant devise="'.$this->devise.'">'.number_format($this->montant, 2, '.', '').'</montant>' . "\n"; + if ($this->ip != null && $this->timestamp != null) + { + $xml .= "\t\t" . '<ip timestamp="'.$this->timestamp.'">'.$this->ip.'</ip>' . "\n"; + } + $xml .= $this->transport->get_xml(); + $xml .= $this->list->get_xml(); + $xml .= "\t" . '</infocommande>' . "\n"; + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_order_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_order_xml.php new file mode 100644 index 000000000..c6832c26a --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_order_xml.php @@ -0,0 +1,68 @@ +<?php + + class fianet_order_xml + { + var $billing_user = null; + var $billing_adress = null; + var $info_commande = null; + var $payment = null; + + var $delivery_user = null; + var $delivery_adress = null; + + function fianet_order_xml() + { + $this->billing_user = new fianet_billing_user_xml(); + $this->billing_adress = new fianet_billing_adress_xml(); + $this->info_commande = new fianet_info_order_xml(); + $this->payment = new fianet_payment_xml(); + } + + function reset() + { + $this->billing_user = new fianet_billing_user_xml(); + $this->delivery_user = null; + $this->billing_adress = new fianet_billing_adress_xml(); + $this->delivery_adress = null; + $this->info_commande = new fianet_info_order_xml(); + $this->payment = new fianet_payment_xml(); + } + + function get_xml() + { + $xml = ''; + $xml .= '<control fianetmodule="'.FIANET_MODULE.'" version="'.FIANET_VERSION.'">' . "\n"; + $xml .= $this->billing_user->get_xml(); + $xml .= $this->billing_adress->get_xml(); + if ($this->delivery_user != null) + { + if (var_is_object_of_class($this->delivery_user, 'fianet_delivery_user_xml')) + { + $xml .= $this->delivery_user->get_xml(); + } + else + { + fianet_insert_log("fianet_order_xml.php - get_xml() <br />\nDelivery user is not an object of type fianet_delivery_user_xml"); + } + } + if ($this->delivery_adress != null && ($this->info_commande->transport->type == 4 || $this->info_commande->transport->type == 5)) + { + if (var_is_object_of_class($this->delivery_adress, 'fianet_delivery_adress_xml')) + { + $xml .= $this->delivery_adress->get_xml(); + } + else + { + fianet_insert_log("fianet_order_xml.php - get_xml() <br />\nDelivery adress is not an object of type fianet_delivery_adress_xml"); + } + } + $xml .= $this->info_commande->get_xml(); + $xml .= $this->payment->get_xml(); + $xml .= '</control>'; + + save_flux_xml($xml, $this->info_commande->refid); + return ($xml); + } + + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_paraobject_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_paraobject_xml.php new file mode 100644 index 000000000..181438f73 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_paraobject_xml.php @@ -0,0 +1,23 @@ +<?php + +class fianet_paraobject_xml +{ + var $name; + var $value; + + function fianet_paraobject_xml($name, $value) + { + $this->name = $name; + $this->value = $value; + } + + function get_xml() + { + $xml = "\t". '<obj>' . "\n"; + $xml .= "\t\t". '<name>'.$this->name.'</name>' . "\n"; + $xml .= "\t\t". '<value>'.$this->value.'</value>' . "\n"; + $xml .= "\t". '</obj>' . "\n"; + return ($xml); + } +} + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_payment_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_payment_xml.php new file mode 100644 index 000000000..73c4642cc --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_payment_xml.php @@ -0,0 +1,76 @@ +<?php + + class fianet_payment_xml + { + var $type; + var $numcb; + var $dateval; + var $bin; + var $bin4; + var $bin42; + + function fianet_payment_xml($order = null) + { + + } + + function set_cb_number($cb, $dateval) + { + if (!eregi("^[0-9]{16}$", $cb)) + { + fianet_insert_log("fianet_payment_xml.php - set_cb_number() <br />Cb number format is invalid, must be 00001111222233334444\n"); + } + else if (!eregi("^[0-9]{2}/[0-9]{4}$", $dateval)) + { + fianet_insert_log("fianet_payment_xml.php - set_cb_number() <br />Validity date format is invalid, must be MM/YYYY\n"); + } + else + { + $crypt = new HashMD5(); + $this->numcb = $crypt->hash($cb); + $this->dateval = $crypt->hash($dateval); + } + } + + function get_xml() + { + $xml = ''; + if ($this->type != null) + { + $xml .= "\t".'<paiement>'."\n"; + + $xml .= "\t\t".'<type>'.$this->type.'</type>'."\n"; + if ($this->type == 'carte' || $this->type == 'paypal') + { + if ($this->numcb != null) + { + $xml .= "\t\t".'<numcb>'.$this->numcb.'</numcb>'."\n"; + } + if ($this->dateval != null) + { + $xml .= "\t\t".'<dateval>'.$this->dateval.'</dateval>'."\n"; + } + if ($this->bin != null) + { + $xml .= "\t\t".'<bin>'.$this->bin.'</bin>'."\n"; + } + if ($this->bin4 != null) + { + $xml .= "\t\t".'<bin4>'.$this->bin4.'</bin4>'."\n"; + } + if ($this->bin42 != null) + { + $xml .= "\t\t".'<bin42>'.$this->bin42.'</bin42>'."\n"; + } + } + $xml .= "\t".'</paiement>'."\n"; + } + else + { + fianet_insert_log("fianet_payment_xml.php - get_xml() <br />Type is undefined\n"); + return; + } + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_product_list_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_product_list_xml.php new file mode 100644 index 000000000..52a47dfe5 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_product_list_xml.php @@ -0,0 +1,49 @@ +<?php + + class fianet_product_list_xml + { + var $products_list = array(); + + function fianet_product_list_xml() + { + } + + function add_product($product) + { + if (var_is_object_of_class($product, 'fianet_product_xml')) + { + $this->products_list[] = $product; + } + else + { + fianet_insert_log("fianet_product_list_xml.php - add_product() <br />Data are not a valid fianet_product_xml type\n"); + } + } + + function get_xml() + { + $xml = ''; + if (count($this->products_list) > 0) + { + + $xml .= "\t\t". '<list nbproduit="'.$this->count_nbproduct().'">' . "\n"; + foreach ($this->products_list as $product) + { + $xml .= $product->get_xml(); + } + $xml .= "\t\t". '</list>' . "\n"; + } + return ($xml); + } + + function count_nbproduct() + { + $n = 0; + foreach ($this->products_list as $product) + { + $n += $product->nb; + } + return ($n); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_product_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_product_xml.php new file mode 100644 index 000000000..5b42e7963 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_product_xml.php @@ -0,0 +1,59 @@ +<?php + + class fianet_product_xml + { + var $type; + var $ref; + var $nb = 0; + var $prixunit; + var $name; + + function fianet_product_xml() + { + + } + + function get_xml() + { + $xml = ''; + if ($this->name != null) + { + $nb = ''; + $prixunit = ''; + if ($this->type != null) + { + $type = ' type="'.$this->type.'"'; + } + else + { + fianet_insert_log("fianet_product_xml.php - get_xml() <br />\nproduct type is missing"); + return; + } + if ($this->ref != null) + { + $ref = ' ref="'.clean_invalid_char($this->ref).'"'; + } + else + { + fianet_insert_log("fianet_product_xml.php - get_xml() <br />\nproduct ref is missing"); + return; + } + if ($this->nb != null) + { + $nb = ' nb="'.$this->nb.'"'; + } + if ($this->prixunit != null) + { + $prixunit = ' prixunit="'.number_format($this->prixunit, 2, '.', '').'"'; + } + $xml .= "\t\t\t<produit$type$ref$nb$prixunit>".clean_invalid_char($this->name)."</produit>\n"; + } + else + { + fianet_insert_log("fianet_product_xml.php - get_xml() <br />\nproduct name is missing"); + return; + } + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_rnp_info_order_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_rnp_info_order_xml.php new file mode 100644 index 000000000..b46b4a54e --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_rnp_info_order_xml.php @@ -0,0 +1,36 @@ +<?php + class fianet_rnp_info_order_xml + { + var $siteid = 0; + var $refid = 0; + var $montant = 0; + var $devise = 'EUR'; + var $transport; + var $list; + + function fianet_rnp_info_order_xml() + { + $this->list = new fianet_product_list_xml(); + $this->transport = new fianet_transport_xml(); + $this->siteid = FIANET_RNP_SITE_ID; + } + + function get_xml() + { + $xml = ''; + + if ($this->siteid == '' || $this->refid == '' || $this->montant <= 0 || $this->devise == '') + { + fianet_insert_log("fianet_rnp_info_order_xml.php - get_xml() <br />Somes values are undefined\n"); + } + $xml .= "\t" . '<infocommande>' . "\n"; + $xml .= "\t\t" . '<siteid>'.$this->siteid.'</siteid>' . "\n"; + $xml .= "\t\t" . '<refid>'.$this->refid.'</refid>' . "\n"; + $xml .= "\t\t" . '<montant devise="'.$this->devise.'">'.number_format($this->montant, 2, '.', '').'</montant>' . "\n"; + $xml .= $this->transport->get_xml(); + $xml .= $this->list->get_xml(); + $xml .= "\t" . '</infocommande>' . "\n"; + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_rnp_order_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_rnp_order_xml.php new file mode 100644 index 000000000..4bbd0ca3b --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_rnp_order_xml.php @@ -0,0 +1,142 @@ +<?php + + class fianet_rnp_order_xml + { + var $billing_user = null; + var $billing_adress = null; + var $info_commande = null; + var $wallet = null; + + var $delivery_user = null; + var $delivery_adress = null; + + function fianet_rnp_order_xml() + { + $this->billing_user = new fianet_billing_user_xml(); + $this->billing_adress = new fianet_billing_adress_xml(); + $this->info_commande = new fianet_rnp_info_order_xml(); + $this->wallet = new fianet_rnp_wallet_xml(); + } + + function reset() + { + $this->billing_user = new fianet_billing_user_xml(); + $this->delivery_user = null; + $this->billing_adress = new fianet_billing_adress_xml(); + $this->delivery_adress = null; + $this->info_commande = new fianet_rnp_info_order_xml(); + $this->wallet = new fianet_rnp_wallet_xml(); + } + + function get_xml() + { + $xml = ''; + $xml .= '<?xml version="1.0" encoding="'. FIANET_ENCODING . '" ?>' . "\n"; + $xml .= '<control fianetmodule="'.FIANET_MODULE.'" version="'.FIANET_VERSION.'">' . "\n"; + $xml .= $this->billing_user->get_xml(); + $xml .= $this->billing_adress->get_xml(); + if ($this->delivery_user != null) + { + if (var_is_object_of_class($this->delivery_user, 'fianet_delivery_user_xml')) + { + $xml .= $this->delivery_user->get_xml(); + } + else + { + fianet_insert_log("fianet_rnp_order_xml.php - get_xml() <br />\nDelivery user is not an object of type fianet_delivery_user_xml"); + } + } + if ($this->delivery_adress != null && ($this->info_commande->transport->type == 4 || $this->info_commande->transport->type == 5)) + { + if (var_is_object_of_class($this->delivery_adress, 'fianet_delivery_adress_xml')) + { + $xml .= $this->delivery_adress->get_xml(); + } + else + { + fianet_insert_log("fianet_rnp_order_xml.php - get_xml() <br />\nDelivery adress is not an object of type fianet_delivery_adress_xml"); + } + } + $xml .= $this->info_commande->get_xml(); + + $this->wallet->generate_wallet_crypt_data($this->info_commande->refid, $this->billing_user->nom, $this->billing_user->email, $this->info_commande->montant); + $xml .= $this->wallet->get_xml(); + + $xml .= '</control>'; + + save_flux_xml($xml, $this->info_commande->refid); + return ($xml); + } + + /* + Cette fonction gnre le formulaire de redirection vers ReceiveAndPay + Elle prends des paramtres optionnels + url_call : url de retour sur le site marchand + url_sys : url de rponse des tags asynchrone pour le serveur ReceiveAndPay + ParamCallBack : tableau associatif des donnes que vous souhaitez voir retourner par le serveur ReceiveAndPay sur url_sys et url_call + typeIHM : 1 pour carte bancaire seulement, 2 pour crdit uniquement, 3 pour les deux en mme temps + enProd : mettre true pour rediriger vers ReceiveAndPay de production + auto_send : si true : gnre un javascript qui soumettra immdiatement le formulaire + */ + function get_formular($url_call = null, $url_sys = null, $ParamCallBack = array(), $typeIHM = 3, $enProd = false, $auto_send = true) + { + + $flux = $this->get_xml(); + $flux = clean_xml($flux); + $flux = str_replace('"', "'", $flux); + $flux = str_replace('&amp;', '&amp;amp;', $flux); + $flux = str_replace('&lt;', '&amp;lt;', $flux); + $flux = str_replace('&gt;', '&amp;gt;', $flux); + $my_hashmd5 = new HashMD5(); + //$toto = html_entity_decode($flux); + //debug($toto); + $checksum = $my_hashmd5->hash(html_entity_decode($flux)); + + if (is_array($ParamCallBack) && count($ParamCallBack) > 0) + { + $XMLParam = new fianet_xml_paracallback_builder(); + foreach ($ParamCallBack as $index => $value) + { + $XMLParam->add_param(new fianet_paraobject_xml($index, urlencode(htmlentities($value)))); + } + } + + if ($enProd) + { + $url = URL_RNP_PROD; + } + else + { + $url = URL_RNP_TEST; + } + $url .= URL_RNP_FRONTLINE; + + $form = ''; + $form .= '<form name="RnPform" action="'.$url.'" method="post">'; + $form .= '<input type="hidden" name="MerchID" value="'. $this->info_commande->siteid .'">' . "\n"; + $form .= '<input type="hidden" name="XMLInfo" value="'. $flux .'">' . "\n"; + if ($url_call != null && $url_call != '') + { + $form .= '<input type="hidden" name="URLCall" value="'. $url_call .'">' . "\n"; + } + if ($url_sys != null && $url_sys != '') + { + $form .= '<input type="hidden" name="URLSys" value="'. $url_sys .'">' . "\n"; + } + if (isset($XMLParam)) + { + $form .= '<input type="hidden" name="XMLParam" value="'.clean_xml(str_replace('"', "'", $XMLParam->get_xml())).'">' . "\n"; + } + $form .= '<input type="hidden" name="CheckSum" value="'. $checksum .'">' . "\n"; + $form .= '<input type="hidden" name="TypeIHM" value="'. $typeIHM .'">' . "\n"; + $form .= '</form>'; + if ($auto_send) + { + $form .= '<script>document.RnPform.submit();</script>'; + } + + return ($form); + } + + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_rnp_wallet_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_rnp_wallet_xml.php new file mode 100644 index 000000000..851c50668 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_rnp_wallet_xml.php @@ -0,0 +1,60 @@ +<?php + + class fianet_rnp_wallet_xml + { + var $version = '1.0'; + var $datelivr = null; + var $datecom = null; + var $crypt = null; + var $crypt_version = '2.0'; + + var $order_date_time_seconds = null; + + function fianet_rnp_wallet_xml() + { + //$this->datecom = "2008-05-28 14:25:31"; + $this->datecom = date("Y-m-d H:i:s"); + $this->order_date_time_seconds = substr($this->datecom, -2, 2); + } + + function generate_wallet_crypt_data($order_id, $billing_lastname, $customer_email, $total) + { + $total = number_format($total, 2, '.', ''); + $this->generate_crypt_key($order_id, $billing_lastname, $customer_email, $total); + } + + function get_xml() + { + $xml = ''; + + $xml .= "\t" . '<wallet version="'.$this->version.'">' . "\n"; + $xml .= "\t\t" . '<datelivr>'.$this->datelivr.'</datelivr>' . "\n"; + $xml .= "\t\t" . '<datecom>'.$this->datecom.'</datecom>' . "\n"; + $xml .= "\t\t" . '<crypt version="'.$this->crypt_version.'">'.$this->crypt.'</crypt>' . "\n"; + $xml .= "\t" . '</wallet>' . "\n"; + + return ($xml); + } + + function generate_crypt_key($order_id, $billing_lastname, $customer_email, $total) + { + if (FIANET_ENCODING == 'UTF-8') + { + $billing_lastname = utf8_decode($billing_lastname); + } + else + { + $billing_lastname = $billing_lastname; + } + $key = FIANET_RNP_KEY; + + $encodingKey = new EncodingKey(); + $this->crypt = $encodingKey->giveHashCode2( $key, + $this->order_date_time_seconds, + $customer_email, + $order_id, + $total, + $billing_lastname); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_transport_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_transport_xml.php new file mode 100644 index 000000000..6cb36f729 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_transport_xml.php @@ -0,0 +1,42 @@ +<?php + + class fianet_transport_xml + { + var $type; + var $nom; + var $rapidite; + + function fianet_transport_xml() + { + + } + + function get_xml() + { + $xml = ''; + if ($this->type == null) + { + fianet_insert_log("fianet_transport_xml.php - get_xml() <br />\nTransport type undefined"); + return; + } + if ($this->nom == null) + { + fianet_insert_log("fianet_transport_xml.php - get_xml() <br />\nTransport name undefined"); + return; + } + if ($this->rapidite == null) + { + fianet_insert_log("fianet_transport_xml.php - get_xml() <br />\nTransport time undefined"); + return; + } + $xml .= "\t\t". '<transport>' . "\n"; + + $xml .= "\t\t\t". '<type>'.$this->type.'</type>' . "\n"; + $xml .= "\t\t\t". '<nom>'.clean_invalid_char($this->nom).'</nom>' . "\n"; + $xml .= "\t\t\t". '<rapidite>'.$this->rapidite.'</rapidite>' . "\n"; + + $xml .= "\t\t". '</transport>' . "\n"; + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_user_siteconso_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_user_siteconso_xml.php new file mode 100644 index 000000000..42aa48988 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_user_siteconso_xml.php @@ -0,0 +1,29 @@ +<?php + + class fianet_user_siteconso_xml + { + var $nb = 0; + var $ca = 0; + var $datepremcmd = null; + var $datederncmd = null; + + function fianet_user_siteconso_xml() + { + } + + function get_xml() + { + $xml = ''; + if ($this->nb > 0) + { + $xml .= "\t\t" . '<siteconso>' . "\n"; + $xml .= "\t\t\t" . '<nb>'.$this->nb.'</nb>' . "\n"; + $xml .= "\t\t\t" . '<ca>'.number_format($this->ca, 2, '.', '').'</ca>' . "\n"; + $xml .= "\t\t\t" . '<datepremcmd>'.$this->datepremcmd.'</datepremcmd>' . "\n"; + $xml .= "\t\t\t" . '<datederncmd>'.$this->datederncmd.'</datederncmd>' . "\n"; + $xml .= "\t\t" . '</siteconso>' . "\n"; + } + return ($xml); + } + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_user_xml.php b/modules/fianetfraud/fianet/classes/order/fianet_user_xml.php new file mode 100644 index 000000000..a5ad312bd --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_user_xml.php @@ -0,0 +1,80 @@ +<?php + + class fianet_user_xml + { + var $type; + //Qualit des clients par dfaut + var $qualite = 2; + var $titre; + var $nom; + var $prenom; + var $societe; + var $telhome; + var $teloffice; + var $telmobile; + var $telfax; + var $email; + var $site_conso = null; + + function set_quality_professional() + { + $this->qualite = 1; + } + + function set_quality_nonprofessional() + { + $this->qualite = 2; + } + + function get_xml() + { + $xml = ''; + $xml .= "\t" . '<utilisateur type="'.$this->type.'" qualite="'.$this->qualite.'">' . "\n"; + if ($this->titre != '') + { + if ($this->titre == 'f') + { + $this->titre = 'mme'; + } + $xml .= "\t\t" . '<nom titre="'.$this->titre.'">'.clean_invalid_char($this->nom).'</nom>' . "\n"; + } + else + { + $xml .= "\t\t" . '<nom>'.clean_invalid_char($this->nom).'</nom>' . "\n"; + } + $xml .= "\t\t" . '<prenom>'.clean_invalid_char($this->prenom).'</prenom>' . "\n"; + if ($this->societe != '') + { + $xml .= "\t\t" . '<societe>'.clean_invalid_char($this->societe).'</societe>' . "\n"; + } + if ($this->telhome != '') + { + $xml .= "\t\t" . '<telhome>'.clean_invalid_char($this->telhome).'</telhome>' . "\n"; + } + if ($this->teloffice != '') + { + $xml .= "\t\t" . '<teloffice>'.clean_invalid_char($this->teloffice).'</teloffice>' . "\n"; + } + if ($this->telmobile != '') + { + $xml .= "\t\t" . '<telmobile>'.clean_invalid_char($this->telmobile).'</telmobile>' . "\n"; + } + if ($this->telfax != '') + { + $xml .= "\t\t" . '<telfax>'.clean_invalid_char($this->telfax).'</telfax>' . "\n"; + } + if ($this->email != '') + { + $xml .= "\t\t" . '<email>'.clean_invalid_char($this->email).'</email>' . "\n"; + } + if ($this->site_conso != null) + { + $xml .= $this->site_conso->get_xml(); + } + $xml .= "\t" . '</utilisateur>' . "\n"; + + return ($xml); + } + + } + diff --git a/modules/fianetfraud/fianet/classes/order/fianet_xml_paracallback_builder.php b/modules/fianetfraud/fianet/classes/order/fianet_xml_paracallback_builder.php new file mode 100644 index 000000000..bc46e7d36 --- /dev/null +++ b/modules/fianetfraud/fianet/classes/order/fianet_xml_paracallback_builder.php @@ -0,0 +1,44 @@ +<?php + + class fianet_xml_paracallback_builder + { + var $param_list = array(); + + function fianet_xml_paracallback_builder() + { + + } + + function add_param($param) + { + if (var_is_object_of_class($param, 'fianet_paraobject_xml')) + { + $this->param_list[] = $param; + } + else + { + fianet_insert_log("Erreur : le paramtre n'est pas un objet fianet_paraobject_xml mais un objet : ".get_class($param)."<br>"); + } + } + + function get_xml() + { + $xml = ''; + + if (count($this->param_list) > 0) + { + $xml .= '<?xml version="1.0" encoding="'.FIANET_ENCODING.'" ?> + <ParamCBack>' . "\n"; + + foreach ($this->param_list as $param) + { + $xml .= $param->get_xml(); + } + + $xml .= '</ParamCBack>' . "\n"; + } + + return($xml); + } + } + diff --git a/modules/fianetfraud/fianet/const/fianet.php b/modules/fianetfraud/fianet/const/fianet.php new file mode 100644 index 000000000..35bdd5c4a --- /dev/null +++ b/modules/fianetfraud/fianet/const/fianet.php @@ -0,0 +1,4 @@ +<?php + +define('FIANET_VERSION', '2.5'); +define('FIANET_MODULE', 'api_php'); \ No newline at end of file diff --git a/modules/fianetfraud/fianet/const/url_rnp.php b/modules/fianetfraud/fianet/const/url_rnp.php new file mode 100644 index 000000000..344c5c84c --- /dev/null +++ b/modules/fianetfraud/fianet/const/url_rnp.php @@ -0,0 +1,6 @@ +<?php +define('URL_RNP_PROD', 'https://secure.fia-net.com/wallet'); +define('URL_RNP_TEST', 'https://secure.fia-net.com/walter'); + +define('URL_RNP_FRONTLINE', '/engine/frontline.cgi'); + diff --git a/modules/fianetfraud/fianet/const/url_sac.php b/modules/fianetfraud/fianet/const/url_sac.php new file mode 100644 index 000000000..644daed90 --- /dev/null +++ b/modules/fianetfraud/fianet/const/url_sac.php @@ -0,0 +1,10 @@ +<?php +define('URL_SAC_PROD', 'https://secure.fia-net.com/fscreener/'); +define('URL_SAC_TEST', 'https://secure.fia-net.com/pprod/'); + +define('URl_SAC_SINGET', '/engine/singet.cgi'); +define('URl_SAC_STACKING', '/engine/stacking.cgi'); +define('URl_SAC_GETVALIDSTACK', '/engine/get_validstack.cgi'); +define('URl_SAC_GETALERT', '/engine/get_alert.cgi'); + +define('FIANET_MAX_DELIVERY_TIME', 23); diff --git a/modules/fianetfraud/fianet/fianet.php b/modules/fianetfraud/fianet/fianet.php new file mode 100644 index 000000000..4c8be9da4 --- /dev/null +++ b/modules/fianetfraud/fianet/fianet.php @@ -0,0 +1,49 @@ +<?php + +define('RELATIVE_PATH', dirname(__FILE__).'/'); +define('FIANET_ENCODING','ISO-8859-1'); + +define('FIANET_SAC_SITE_ID', Configuration::get('SAC_SITEID')); +define('FIANET_SAC_LOGIN', Configuration::get('SAC_LOGIN')); +define('FIANET_SAC_PWD', Configuration::get('SAC_PASSWORD')); + +define('FIANET_RNP_KEY', ''); + +require_once(RELATIVE_PATH . 'to_implement/implement.php'); +require_once(RELATIVE_PATH . 'const/fianet.php'); +require_once(RELATIVE_PATH . 'const/url_sac.php'); +require_once(RELATIVE_PATH . 'const/url_rnp.php'); + +require_once(RELATIVE_PATH . 'includes/debug.php'); +require_once(RELATIVE_PATH . 'includes/general.php'); +require_once(RELATIVE_PATH . 'includes/xml2array.php'); + +if (!class_exists('HashMd5', false)) +{ + require_once(RELATIVE_PATH . 'classes/fianet_key_64bits.php'); + //require_once(RELATIVE_PATH . 'classes/fianet_key_32bits.php'); +} +require_once(RELATIVE_PATH . 'classes/fianet_sender.php'); +require_once(RELATIVE_PATH . 'classes/fianet_socket.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_adress_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_billing_adress_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_delivery_adress_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_appartment_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_user_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_billing_user_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_delivery_user_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_info_order_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_payment_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_product_list_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_product_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_transport_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_user_siteconso_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_order_xml.php'); + +require_once(RELATIVE_PATH . 'classes/order/fianet_rnp_order_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_rnp_info_order_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_rnp_wallet_xml.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_xml_paracallback_builder.php'); +require_once(RELATIVE_PATH . 'classes/order/fianet_paraobject_xml.php'); + + diff --git a/modules/fianetfraud/fianet/includes/debug.php b/modules/fianetfraud/fianet/includes/debug.php new file mode 100644 index 000000000..bbee574a9 --- /dev/null +++ b/modules/fianetfraud/fianet/includes/debug.php @@ -0,0 +1,77 @@ +<?php + +function debug(&$var, $info = FALSE) +{ + $scope = false; + $prefix = 'unique'; + $suffix = 'value'; + + if($scope) $vals = $scope; + else $vals = $GLOBALS; + + $old = $var; + $var = $new = $prefix.rand().$suffix; $vname = FALSE; + foreach($vals as $key => $val) if($val === $new) $vname = $key; + $var = $old; + + echo "<pre style='margin: 0px 0px 10px 0px; display: block; background: white; color: black; font-family: Verdana; border: 1px solid #cccccc; padding: 5px; font-size: 10px; line-height: 13px;'>"; + if($info != FALSE) echo "<b style='color: red;'>$info:</b><br>"; + do_dump($var, '$'.$vname); + echo "</pre>"; +} + + +function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL) +{ + $do_dump_indent = "<span style='color:#eeeeee;'>|</span> &nbsp;&nbsp; "; + $reference = $reference.$var_name; + $keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name'; + + if (is_array($var) && isset($var[$keyvar])) + { + $real_var = &$var[$keyvar]; + $real_name = &$var[$keyname]; + $type = ucfirst(gettype($real_var)); + echo "$indent$var_name <span style='color:#a2a2a2'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>"; + } + else + { + $var = array($keyvar => $var, $keyname => $reference); + $avar = &$var[$keyvar]; + + $type = ucfirst(gettype($avar)); + if($type == "String") $type_color = "<span style='color:green'>"; + elseif($type == "Integer") $type_color = "<span style='color:red'>"; + elseif($type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; } + elseif($type == "Boolean") $type_color = "<span style='color:#92008d'>"; + elseif($type == "NULL") $type_color = "<span style='color:black'>"; + + if(is_array($avar)) + { + $count = count($avar); + echo "$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#a2a2a2'>$type ($count)</span><br>$indent(<br>"; + $keys = array_keys($avar); + foreach($keys as $name) + { + $value = &$avar[$name]; + do_dump($value, "['$name']", $indent.$do_dump_indent, $reference); + } + echo "$indent)<br>"; + } + elseif(is_object($avar)) + { + echo "$indent$var_name <span style='color:#a2a2a2'>$type</span><br>$indent(<br>"; + foreach($avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference); + echo "$indent)<br>"; + } + elseif(is_int($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>"; + elseif(is_string($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color\"$avar\"</span><br>"; + elseif(is_float($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>"; + elseif(is_bool($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>"; + elseif(is_null($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>"; + else echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $avar<br>"; + + $var = $var[$keyvar]; + } +} + diff --git a/modules/fianetfraud/fianet/includes/general.php b/modules/fianetfraud/fianet/includes/general.php new file mode 100644 index 000000000..5e25dd3ae --- /dev/null +++ b/modules/fianetfraud/fianet/includes/general.php @@ -0,0 +1,71 @@ +<?php + +function clean_xml($xml) +{ + $xml = str_replace("\\'", "'", $xml); + $xml = str_replace("\\\"", "\"", $xml); + $xml = str_replace("\\\\", "\\", $xml); + $xml = str_replace("\t", "", $xml); + $xml = str_replace("\n", "", $xml); + $xml = str_replace("\r", "", $xml); + $xml = trim($xml); + return ($xml); +} + +function clean_invalid_char($var) +{ + //supprimes les balises html + $var = strip_tags($var); + $var = str_replace("&", "&amp;", $var); + $var = str_replace("<", "&lt;", $var); + $var = str_replace(">", "&gt;", $var); + $var = trim($var); + return ($var); +} + +function var_is_object_of_class($var, $class_name) +{ + $res = false; + if (is_object($var)) + { + $name = get_class($var); + if ($name == $class_name) + { + $res = true; + } + } + return ($res); +} + +//Calcule la date de livraison en jour ouvr partir de la date courante +function get_delivery_date($delivery_times) +{ + define('H', date("H")); + define('i', date("i")); + define('s', date("s")); + define('m', date("m")); + define('d', date("d")); + define('Y', date("Y")); + define('SUNDAY', 0); + define('SATURDAY', 6); + + $nb_days = 0; + $j = 0; + while ($nb_days < $delivery_times) + { + $j++; + $date = mktime(H, i, s, m, d + $j, Y); + $day = date("w", $date); + if ($day != SUNDAY && $day != SATURDAY) + { + $nb_days++; + } + } + if ($j > FIANET_MAX_DELIVERY_TIME) + {//si on dpasse le dlais de livraison max causes des samedi et dimanche on remet le dlais de livraison son maximum + $j = FIANET_MAX_DELIVERY_TIME; + } + $date = mktime(H, i, s, m, d + $j, Y); + return (date("Y-m-d", $date)); +} + diff --git a/modules/fianetfraud/fianet/includes/xml2array.php b/modules/fianetfraud/fianet/includes/xml2array.php new file mode 100644 index 000000000..de296f600 --- /dev/null +++ b/modules/fianetfraud/fianet/includes/xml2array.php @@ -0,0 +1,119 @@ +<?php + +/** + * xml2array() will convert the given XML text to an array in the XML structure. + * Link: http://www.bin-co.com/php?controller=scripts/xml2array/ + * Arguments : $contents - The XML text + * $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. + * Return: The parsed XML in an array form. + */ +function xml2array($contents, $get_attributes=1) +{ + if(!$contents) return array(); + + if(!function_exists('xml_parser_create')) + { + //print "'xml_parser_create()' function not found!"; + return array(); + } + //Get the XML parser of PHP - PHP must have this module for the parser to work + $parser = xml_parser_create(); + xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 ); + xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 ); + xml_parse_into_struct( $parser, $contents, $xml_values ); + xml_parser_free( $parser ); + + if(!$xml_values) return;//Hmm... + + //Initializations + $xml_array = array(); + $parents = array(); + $opened_tags = array(); + $arr = array(); + + $current = &$xml_array; + + //Go through the tags. + foreach($xml_values as $data) + { + unset($attributes,$value);//Remove existing values, or there will be trouble + //This command will extract these variables into the foreach scope + // tag(string), type(string), level(int), attributes(array). + extract($data);//We could use the array by itself, but this cooler. + + $result = ''; + if($get_attributes) + {//The second argument of the function decides this. + $result = array(); + if(isset($value)) $result['value'] = $value; + //Set the attributes too. + if(isset($attributes)) + { + foreach($attributes as $attr => $val) + { + if($get_attributes == 1) $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' + /** :TODO: should we change the key name to '_attr'? Someone may use the tagname 'attr'. Same goes for 'value' too */ + } + } + } + elseif(isset($value)) + { + $result = $value; + } + + //See tag status and do the needed. + if($type == "open") + {//The starting of the tag '<tag>' + $parent[$level-1] = &$current; + if(!is_array($current) or (!in_array($tag, array_keys($current)))) + { //Insert New tag + $current[$tag] = $result; + $current = &$current[$tag]; + + } + else + { //There was another element with the same tag name + if(isset($current[$tag][0])) + { + array_push($current[$tag], $result); + } + else + { + $current[$tag] = array($current[$tag],$result); + } + $last = count($current[$tag]) - 1; + $current = &$current[$tag][$last]; + } + + } + elseif($type == "complete") + { //Tags that ends in 1 line '<tag />' + //See if the key is already taken. + if(!isset($current[$tag])) + { //New Key + $current[$tag] = $result; + //array_push($current[$tag],$result); + } + else + { //If taken, put all things inside a list(array) + if((is_array($current[$tag]) and $get_attributes == 0)//If it is already an array... + or (isset($current[$tag][0]) and is_array($current[$tag][0]) and $get_attributes == 1)) + { + array_push($current[$tag],$result); // ...push the new element into that array. + } + else + { //If it is not an array... + $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value + } + } + + } + elseif ($type == 'close') + { //End of tag '</tag>' + $current = &$parent[$level-1]; + } + } + return($xml_array); +} + + diff --git a/modules/fianetfraud/fianet/to_implement/implement.php b/modules/fianetfraud/fianet/to_implement/implement.php new file mode 100644 index 000000000..665bdc703 --- /dev/null +++ b/modules/fianetfraud/fianet/to_implement/implement.php @@ -0,0 +1,12 @@ +<?php +//Cette fonction est appelle par l'API en cas d'erreur, vous pouvez l'implmenter pour crer un journal d'erreur +function fianet_insert_log($message) +{ + echo $message . '<br />'; +} + +//Cette fonction est appele ds qu'une flux xml est gnr. Le premier paramtre est le flux lui-mme, le second paramtre est la rfrence de la commande +function save_flux_xml($xml, $ref_id) +{ +} + diff --git a/modules/fianetfraud/fianetfraud.php b/modules/fianetfraud/fianetfraud.php new file mode 100644 index 000000000..d62ace69b --- /dev/null +++ b/modules/fianetfraud/fianetfraud.php @@ -0,0 +1,625 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +if ((basename(__FILE__) == 'fianetfraud.php')) + require_once(dirname(__FILE__).'/fianet/fianet.php'); + +class Fianetfraud extends Module +{ + const INSTALL_SQL_FILE = 'install.sql'; + + private $_html; + private $_product_type = array( + '1' => 'Alimentation & gastronomie', + '2' => 'Auto & moto', + '3' => 'Culture & divertissements', + '4' => 'Maison & jardin', + '5' => 'Electromenager', + '6' => 'Enchers et achats group&eacute;s', + '7' => 'Fleurs & cadeaux', + '8' => 'Informatique & logiciels', + '9' => 'Sant&eacute; & beaut&eacute;', + '10' => 'Services aux particuliers', + '11' => 'Services aux professionnels', + '12' => 'Sport', + '13' => 'Vetements & accessoires', + '14' => 'Voyage & tourisme', + '15' => 'Hifi, photo & videos', + '16' => 'Telephonie & communication', + '17' => 'Bijoux & Métaux précieux', + '18' => 'Articles et Accessoires pour bébé', + '19' => 'Sonorisation & Lumière' + ); + + private $_carrier_type = array( + 1 => 'Retrait de la marchandise chez le marchand', + 2 => 'Utilisation d\'un réseau de points-retrait tiers (type kiala, alveol, etc.)', + 3 => 'Retrait dans un aéroport, une gare ou une agence de voyage', + 4 => 'Transporteur (La Poste, Colissimo, UPS, DHL... ou tout transporteur privé)', + 5 => 'Emission d’un billet électronique, téléchargements' + ); + + private $_payement_type = array( + 1 => 'carte', + 2 => 'cheque', + 3 => 'contre-remboursement', + 4 => 'virement', + 5 => 'cb en n fois', + 6 => 'paypal', + 7 => '1euro.com' + ); + + public function __construct() + { + $this->name = 'fianetfraud'; + $this->tab = 'payment_security'; + $this->version = '1.1'; + $this->limited_countries = array('fr'); + + parent::__construct(); + + $this->displayName = 'FIA-NET - Système d\'Analyse des Commandes'; + $this->description = "Protégez vous contre la fraude à la carte bancaire sans perturber l'acte d'achat"; + } + + public function install() + { + if (!parent::install()) + return false; + + if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return false; + elseif (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return false; + $sql = str_replace('PREFIX_', _DB_PREFIX_, $sql); + $sql = preg_split("/;\s*[\r\n]+/", $sql); + foreach ($sql AS $query) + if ($query AND sizeof($query) AND !Db::getInstance()->Execute(trim($query))) + return false; + $langs = Language::getLanguages(); + + $orderState = new OrderState(); + foreach ($langs AS $lang) + $orderState->name[$lang['id_lang']] = 'Waiting FIA-NET checking'; + $orderState->name[2] = 'Attente validation commande FIA-NET'; + $orderState->invoice = false; + $orderState->send_email = false; + $orderState->logable = false; + $orderState->color = '#FF9999'; + $orderState->hidden = true; + $orderState->save(); + Configuration::updateValue('SAC_ID_WAITING', (int)($orderState->id)); + + $orderState = new OrderState(); + foreach ($langs AS $lang) + $orderState->name[$lang['id_lang']] = 'Fraud Detected By FIA-NET'; + $orderState->name[2] = 'Fraude détectée par FIA-NET'; + $orderState->invoice = false; + $orderState->send_email = false; + $orderState->logable = false; + $orderState->color = '#FF6666'; + $orderState->hidden = true; + $orderState->save(); + Configuration::updateValue('SAC_ID_FRAUD', (int)($orderState->id)); + + if (!$this->registerHook('updateCarrier')) + return false; + if (!Configuration::updateValue('SAC_SITEID', '') OR + !Configuration::updateValue('SAC_LOGIN', '') OR + !Configuration::updateValue('SAC_PASSWORD', '') OR + !Configuration::updateValue('SAC_MINIMAL_ORDER', 0)) + return false; + + return ($this->registerHook('cart') AND + $this->registerHook('newOrder') AND + $this->registerHook('adminOrder') AND + $this->registerHook('updateOrderStatus') + ); + } + + public function uninstall() + { + $orderState = new OrderState((int)(Configuration::get('SAC_ID_FRAUD')), Configuration::get('PS_LANG_DEFAULT')); + if (!$orderState->delete()) + return false; + $orderState = new OrderState((int)(Configuration::get('SAC_ID_WAITING')), Configuration::get('PS_LANG_DEFAULT')); + if (!$orderState->delete()) + return false; + + return parent::uninstall(); + } + + private function _postProcess() + { + global $cookie; + + $error = false; + + Configuration::updateValue('SAC_PRODUCTION', ((Tools::getValue('fianetfraud_production') == 1 ) ? 1 : 0)); + Configuration::updateValue('SAC_LOGIN', Tools::getValue('fianetfraud_login')); + Configuration::updateValue('SAC_PASSWORD', Tools::getValue('fianetfraud_password')); + Configuration::updateValue('SAC_SITEID', Tools::getValue('fianetfraud_siteid')); + Configuration::updateValue('SAC_DEFAULT_PRODUCT_TYPE', Tools::getValue('fianetfraud_product_type')); + Configuration::updateValue('SAC_DEFAULT_CARRIER_TYPE', Tools::getValue('fianetfraud_default_carrier')); + Configuration::updateValue('SAC_MINIMAL_ORDER', Tools::getValue('fianetfraud_minimal_order')); + + if (isset($_POST['payementBox'])) + { + Configuration::updateValue('SAC_PAYMENT_MODULE', implode(',', $_POST['payementBox'])); + foreach ($_POST['payementBox'] as $payment) + Configuration::updateValue('SAC_PAYMENT_TYPE_'.$payment,Tools::getValue($payment)); + } + + $categories = Category::getSimpleCategories($cookie->id_lang); + foreach ($categories AS $category) + Configuration::updateValue('SAC_CATEGORY_TYPE_'.$category['id_category'],Tools::getValue('cat_'.$category['id_category'])); + + $carriers = Carrier::getCarriers($cookie->id_lang); + foreach ($carriers as $carrier) + { + if (isset($_POST['carrier_'.$carrier['id_carrier']])) + Configuration::updateValue('SAC_CARRIER_TYPE_'.$carrier['id_carrier'], $_POST['carrier_'.$carrier['id_carrier']]); + else + { + $error = true; + $this->_html .= '<div class="alert error">'.$this->l('Invalid carrier code').'</div>'; + } + } + + if (!$error) + { + $dataSync = ((($site_id = Configuration::get('SAC_SITEID')) AND Configuration::get('SAC_PRODUCTION')) + ? '<img src="http://www.prestashop.com/modules/fianetfraud.png?site_id='.urlencode($site_id).'" style="float:right" />' + : '' + ); + $this->_html .= '<div class="conf confirm">'.$this->l('Settings are updated').$dataSync.'</div>'; + } + + } + + public function getContent() + { + if (isset($_POST['submitSettings'])) + $this->_postProcess(); + $id_lang = Configuration::get('PS_LANG_DEFAULT'); + $categories = Category::getSimpleCategories($id_lang); + + $carriers = Carrier::getCarriers($id_lang); + $this->_html .= ' + <fieldset><legend>FIA-NET - Système d\'Analyse des Commandes</legend> + <img src="../modules/'.$this->name.'/logo.jpg" style="float:right;margin:5px 10px 5px 0" /> + FIA-NET, le leader français de la lutte contre la fraude à la carte bancaire sur internet !<br /><br /> + Avec son réseau mutualisé de plus de 1 700 sites marchands, et sa base de données de 14 millions de cyber-acheteurs, le Système d’Analyse des Commandes vous offre une protection complète et unique contre le risque d’impayé.<br /><br /> + Le logiciel expert (SAC) score vos transactions en quasi temps réel à partir de plus de 200 critères pour valider plus de 92 % de vos transactions.<br /> + Le contrôle humain, prenant en charge les transactions les plus risqués, associé à l’assurance FIA-NET vous permet de valider et garantir jusqu’à 100 % de vos transactions.<br /><br /> + Ne restez pas isolé face à l’explosion des réseaux de fraudeurs ! + <p>'.$this->l('To sign in, check out: ').' <u><a href="https://www.fia-net.com/marchands/devispartenaire.php?p=185" target="_blank">'.$this->l('Fia-net Website').'</a></u></p> + </fieldset><br /> + <form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Login').'</label> + <div class="margin-form"> + <input type="text" name="fianetfraud_login" value="'.Configuration::get('SAC_LOGIN').'"/> + </div> + <label>'.$this->l('Password').'</label> + <div class="margin-form"> + <input type="text" name="fianetfraud_password" value="'.Configuration::get('SAC_PASSWORD').'"/> + </div> + <label>'.$this->l('Site ID').'</label> + <div class="margin-form"> + <input type="text" name="fianetfraud_siteid" value="'.Configuration::get('SAC_SITEID').'"/> + </div> + <label>'.$this->l('Production mode').'</label> + <div class="margin-form"> + <input type="checkbox" name="fianetfraud_production" id="activated_on" value="1" '.((Configuration::get('SAC_PRODUCTION') == 1) ? 'checked="checked" ' : '').'/> + </div> + <label>'.$this->l('Default Product Type').'</label> + <div class="margin-form"> + <select name="fianetfraud_product_type"> + <option value="0">'.$this->l('-- Choose --').'</option>'; + foreach ($this->_product_type AS $k => $product_type) + $this->_html .= '<option value="'.$k.'"'.(Configuration::get('SAC_DEFAULT_PRODUCT_TYPE') == $k ? ' selected="selected"' : '').'>'.$product_type.'</option>'; + $this->_html .= '</select> + </div> + </fieldset><br /> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Category Detail').'</legend> + <label>'.$this->l('Category Detail').'</label> + <div class="margin-form"> + <table cellspacing="0" cellpadding="0" class="table"> + <thead><tr><th>'.$this->l('Category').'</th><th>'.$this->l('Category Type').'</th></tr></thead><tbody>'; + foreach ($categories AS $category) + { + $this->_html .= '<tr><td>'.$category['name'].'</td><td> + <select name="cat_'.$category['id_category'].'" id="cat_'.$category['id_category'].'"> + <option value="0">'.$this->l('Choose a category...').'</option>'; + foreach ($this->_product_type AS $id => $cat) + $this->_html .= '<option value="'.$id.'" '.((Configuration::get('SAC_CATEGORY_TYPE_'.$category['id_category']) == $id) ? ' selected="true"' : '').'>'.$cat.'</option>'; + $this->_html .= '</select></td></tr>'; + } + $this->_html .= '</tbody></table></div> + </fieldset> + <div class="clear">&nbsp;</div> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Carrier Configuration').'</legend> + <label>'.$this->l('Carrier Detail').'</label> + <div class="margin-form"> + <table cellspacing="0" cellpadding="0" class="table"> + <thead><tr><th>'.$this->l('Carrier').'</th><th>'.$this->l('Carrier Type').'</th></tr></thead><tbody>'; + foreach ($carriers AS $carrier) + { + $this->_html .= '<tr><td>'.$carrier['name'].'</td><td><select name="carrier_'.$carrier['id_carrier'].'" id="cat_'.$carrier['id_carrier'].'"> + <option value="0">'.$this->l('Choose a carrier type...').'</option>'; + foreach ($this->_carrier_type AS $id => $type) + $this->_html .= '<option value="'.$id.'"'.((Configuration::get('SAC_CARRIER_TYPE_'.$carrier['id_carrier']) == $id) ? ' selected="true"' : '').'>'.$type.'</option>'; + $this->_html .= '</select></td>'; + } + $this->_html .= '</tbody></table></margin> + </div> + <div class="clear">&nbsp;</div> + <label>'.$this->l('Default Carrier Type').'</label> + <div class="margin-form"> + <select name="fianetfraud_default_carrier">'; + foreach ($this->_carrier_type AS $k => $type) + $this->_html .= '<option value="'.$k.'"'.($k == Configuration::get('SAC_DEFAULT_CARRIER_TYPE') ? ' selected' : '').'>'.$type.'</option>'; + $this->_html .= '</select> + </div> + </fieldset><div class="clear">&nbsp;</div>'; + + /* Get all modules then select only payment ones*/ + $modules = Module::getModulesOnDisk(); + $modules_is_fianet = explode(',', Configuration::get('SAC_PAYMENT_MODULE')); + $this->paymentModules = array(); + foreach ($modules AS $module) + if (method_exists($module, 'hookPayment')) + { + if($module->id) + { + $module->country = array(); + $countries = DB::getInstance()->ExecuteS('SELECT id_country FROM '._DB_PREFIX_.'module_country WHERE id_module = '.(int)($module->id)); + foreach ($countries as $country) + $module->country[] = $country['id_country']; + + $module->currency = array(); + $currencies = DB::getInstance()->ExecuteS('SELECT id_currency FROM '._DB_PREFIX_.'module_currency WHERE id_module = '.(int)($module->id)); + foreach ($currencies as $currency) + $module->currency[] = $currency['id_currency']; + + $module->group = array(); + $groups = DB::getInstance()->ExecuteS('SELECT id_group FROM '._DB_PREFIX_.'module_group WHERE id_module = '.(int)($module->id)); + foreach ($groups as $group) + $module->group[] = $group['id_group']; + } + else + { + $module->country = NULL; + $module->currency = NULL; + $module->group = NULL; + } + $this->paymentModules[] = $module; + } + + $this->_html .= '<fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Payment Configuration').'</legend> + <label>'.$this->l('Payment Detail').'</label> + <div class="margin-form"> + <table cellspacing="0" cellpadding="0" class="table" ><thead><tr> + <th><input type="checkbox" name="checkme" class="noborder" onclick="checkDelBoxes(this.form, \'payementBox[]\', this.checked)" /></th> + <th>'.$this->l('Payment Module').'</th><th>'.$this->l('Payment Type').'</th></tr></thead><tbody>'; + + foreach ($this->paymentModules as $module) + { + $this->_html .= '<tr><td><input type="checkbox" class="noborder" value="'.substr($module->name,0,15).'" name="payementBox[]" ' .(in_array(substr($module->name,0,15), $modules_is_fianet) ? 'checked="checked"' : '').'></td>'; + $this->_html .= '<td><img src="'.__PS_BASE_URI__.'modules/'.$module->name.'/logo.gif" alt="'.$module->name.'" title="'.$module->displayName.'" />'.stripslashes($module->displayName).'</td><td><select name="'.substr($module->name,0,15).'">'; + $this->_html .= '<option value="0">'.$this->l('-- Choose --').'</option>'; + foreach ($this->_payement_type as $type) + $this->_html .= '<option '.((Configuration::get('SAC_PAYMENT_TYPE_'.substr($module->name,0,15)) == $type) ? 'selected="true"' : '').'>'.$type.'</option>'; + $this->_html .= '</select></tr>'; + } + + $this->_html .= '</tbody></table></margin></fieldset><br class="clear" /><br /> + <center><input type="submit" name="submitSettings" value="'.$this->l('Save').'" class="button" /></center> + </form> + <div class="clear">&nbsp;</div>'; + return $this->_html; + } + + public function hookCart($params) + { + if ($_SERVER['REMOTE_ADDR'] == '0.0.0.0' OR $_SERVER['REMOTE_ADDR'] == '' OR $_SERVER['REMOTE_ADDR'] === false) + return true; + $res = Db::getInstance()->ExecuteS(' + SELECT `id_cart` + FROM '._DB_PREFIX_.'fianet_fraud + WHERE id_cart = '.(int)($params['cart']->id)); + if (Db::getInstance()->NumRows() > 0) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'fianet_fraud` + SET `ip_address` = '.ip2long($_SERVER['REMOTE_ADDR']).', `date` = \''.pSQL(date('Y-m-d H:i:s')).'\' + WHERE `id_cart` = '.(int)($params['cart']->id).' LIMIT 1'); + else + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'fianet_fraud` (`id_cart`, `ip_address`, `date`) + VALUES ('.(int)($params['cart']->id).', '.ip2long($_SERVER['REMOTE_ADDR']).',\''.date('Y-m-d H:i:s').'\')'); + return true; + } + + static private function getIpByCart($id_cart = false) + { + if ($id_cart == false) + return false; + return long2ip(Db::getInstance()->getValue(' + SELECT `ip_address` + FROM '._DB_PREFIX_.'fianet_fraud + WHERE id_cart = '.(int)($id_cart))); + } + + public function hookUpdateOrderStatus($params) + { + $order_status = false; + $conf = Configuration::getMultiple(array('SAC_PRODUCTION', 'PS_SAC_ID_FRAUD', 'SAC_SITEID', 'SAC_LOGIN', 'SAC_PASSWORD')); + if ($params['newOrderStatus']->id == Configuration::get('SAC_ID_FRAUD')) + $order_status = 2; + elseif ($params['newOrderStatus']->id == _PS_OS_DELIVERED_) + $order_status = 1; + elseif ($params['newOrderStatus']->id == _PS_OS_CANCELED_) + $order_status = 2; + elseif ($params['newOrderStatus']->id == _PS_OS_REFUND_) + $order_status = 6; + if ($order_status != false) + return file_get_contents('https://secure.fia-net.com/'.($conf['SAC_PRODUCTION'] ? 'fscreener' : 'pprod').'/engine/delivery.cgi?SiteID='.$conf['SAC_SITEID'].'&Pwd='.urlencode($conf['SAC_PASSWORD']).'&RefID='.(int)$params['id_order'].'&Status='.$order_status); + else + return true; + } + + public function needCheck($id_module, $total_paid) + { + $modules = explode(',', Configuration::get('SAC_PAYMENT_MODULE')); + if (!in_array($id_module, $modules)) + return false; + if ($total_paid < Configuration::get('SAC_MINIMAL_ORDER')) + return false; + return true; + } + + public function hookNewOrder($params) + { + if ($params['order']->total_paid <= 0) + return; + + if (!$this->needCheck($params['order']->module, $params['order']->total_paid)) + return false; + + $address_delivery = new Address((int)($params['order']->id_address_delivery)); + $address_invoice = new Address((int)($params['order']->id_address_invoice)); + $customer = new Customer((int)($params['order']->id_customer)); + $orderFianet = new fianet_order_xml(); + $id_lang = Configuration::get('PS_LANG_DEFAULT'); + if($address_invoice->company == '') + $orderFianet->billing_user->set_quality_nonprofessional(); + else + $orderFianet->billing_user->set_quality_professional(); + + $orderFianet->billing_user->titre = (($customer->id_gender == 1) ? $this->l('Mr.') : (($customer->id_gender == 2 ) ? $this->l('Mrs') : $this->l('Mr.'))); + $orderFianet->billing_user->nom = utf8_decode($address_invoice->lastname); + $orderFianet->billing_user->prenom = utf8_decode($address_invoice->firstname); + $orderFianet->billing_user->societe = utf8_decode($address_invoice->company); + $orderFianet->billing_user->telhome = utf8_decode($address_invoice->phone); + $orderFianet->billing_user->office = ''; + $orderFianet->billing_user->telmobile = utf8_decode($address_invoice->phone_mobile); + $orderFianet->billing_user->telfax = ''; + $orderFianet->billing_user->email = $customer->email; + + $customer_stats = $customer->getStats(); + $all_orders = Order::getCustomerOrders((int)($customer->id)); + $orderFianet->billing_user->site_conso = new fianet_user_siteconso_xml(); + $orderFianet->billing_user->site_conso->ca = $customer_stats['total_orders']; + $orderFianet->billing_user->site_conso->nb = $customer_stats['nb_orders']; + $orderFianet->billing_user->site_conso->datepremcmd = $all_orders[count($all_orders) - 1]['date_add']; + if (count($all_orders) > 1) + $orderFianet->billing_user->site_conso->datederncmd = $all_orders[1]['date_add']; + + $orderFianet->billing_adress->rue1 = utf8_decode($address_invoice->address1); + $orderFianet->billing_adress->rue2 = utf8_decode($address_invoice->address2); + $orderFianet->billing_adress->cpostal = utf8_decode($address_invoice->postcode); + $orderFianet->billing_adress->ville = utf8_decode($address_invoice->city); + $country = new Country((int)($address_invoice->id_country)); + $orderFianet->billing_adress->pays = utf8_decode($country->name[$id_lang]); + + //delivery adresse not send if carrier id is 1 or 2 + $carrier_id = array(1,2); + if (!in_array(Configuration::get('SAC_CARRIER_TYPE_'.(int)($params['cart']->id_carrier)),$carrier_id)) + { + $orderFianet->delivery_user = new fianet_delivery_user_xml(); + $orderFianet->delivery_adress = new fianet_delivery_adress_xml(); + + if ($address_delivery->company == '') + $orderFianet->delivery_user->set_quality_nonprofessional(); + else + $orderFianet->delivery_user->set_quality_professional(); + + $orderFianet->delivery_user->titre = (($customer->id_gender == 1) ? $this->l('Mr.') : (($customer->id_gender == 2) ? $this->l('Mrs') : $this->l('Unknown'))); + + $orderFianet->delivery_user->nom = utf8_decode($address_delivery->lastname); + $orderFianet->delivery_user->prenom = utf8_decode($address_delivery->firstname); + $orderFianet->delivery_user->societe = utf8_decode($address_delivery->company); + $orderFianet->delivery_user->telhome = utf8_decode($address_delivery->phone); + $orderFianet->delivery_user->office = ''; + $orderFianet->delivery_user->telmobile = utf8_decode($address_delivery->phone_mobile); + $orderFianet->delivery_user->telfax = ''; + $orderFianet->delivery_user->email = $customer->email; + + $orderFianet->delivery_adress->rue1 = utf8_decode($address_delivery->address1); + $orderFianet->delivery_adress->rue2 = utf8_decode($address_delivery->address2); + $orderFianet->delivery_adress->cpostal = utf8_decode($address_delivery->postcode); + $orderFianet->delivery_adress->ville = utf8_decode($address_delivery->city); + $country = new Country((int)($address_delivery->id_country)); + $orderFianet->delivery_adress->pays = utf8_decode($country->name[$id_lang]); + } + + $orderFianet->info_commande->refid = ($params['order']->id); + $orderFianet->info_commande->montant = $params['order']->total_paid; + $currency = new Currency((int)($params['order']->id_currency)); + $orderFianet->info_commande->devise = $currency->iso_code; + $orderFianet->info_commande->ip = self::getIpByCart((int)($params['cart']->id)); + $orderFianet->info_commande->timestamp = date('Y-m-d H:i:s'); + + $products = $params['cart']->getProducts(); + $default_product_type = Configuration::get('SAC_DEFAULT_PRODUCT_TYPE'); + foreach ($products AS $product) + { + $product_categories = Product::getIndexedCategories((int)($product['id_product'])); + $have_sac_cat = false; + + $produit = new fianet_product_xml(); + + if(Configuration::get('SAC_CATEGORY_TYPE_'.$product['id_category_default'])) + { + $produit->type = Configuration::get('SAC_CATEGORY_TYPE_'.$product['id_category_default']); + } + else + $produit->type = $default_product_type; + $produit->ref = utf8_decode((((isset($product['reference']) AND !empty($product['reference'])) ? $product['reference'] : ((isset($product['ean13']) AND !empty($product['ean13'])) ? $product['ean13'] : $product['name'])))); + $produit->nb = $product['cart_quantity']; + $produit->prixunit = $product['price']; + $produit->name = utf8_decode($product['name']); + $orderFianet->info_commande->list->add_product($produit); + } + + $carrier = new Carrier((int)($params['order']->id_carrier)); + $orderFianet->info_commande->transport->type = Configuration::get('SAC_CARRIER_TYPE_'.(int)($carrier->id)); + $orderFianet->info_commande->transport->nom = $carrier->name; + $orderFianet->info_commande->transport->rapidite = self::getCarrierFastById((int)($carrier->id)); + $orderFianet->payment->type = Configuration::get('SAC_PAYMENT_TYPE_'.substr($params['order']->module,0,15)); + + $xml = $orderFianet->get_xml(); + $sender = new fianet_sender(); + if (Configuration::get('SAC_PRODUCTION')) + $sender->mode = 'production'; + else + $sender->mode = 'test'; + + $sender->add_order($orderFianet); + $res = $sender->send_orders_stacking(); + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'fianet_fraud_orders(id_order, date_add) VALUES('.(int)($params['order']->id).', \''.pSQL(date('Y-m-d H:i:s')).'\')'); + return true; + } + + static public function checkWaitingOrders() + { + $orders = Db::getInstance()->ExecuteS('SELECT id_order FROM '._DB_PREFIX_.'fianet_fraud_orders WHERE `date_add` > \''.pSQL(strtotime('+5 minute')).'\''); + foreach ($orders AS $order) + { + self::updateOrderHistory((int)($order['id_order'])); + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'fianet_fraud_orders WHERE id_order='.(int)($order['id_order'])); + } + } + + public function hookAdminOrder($params) + { + $conf = Configuration::get('SAC_PRODUCTION'); + $order = new Order((int)($params['id_order'])); + if (!self::needCheck($order->module, $order->total_paid)) + return null; + + if (isset($_POST['submitFianet'])) + $this->_postProcess(); + $html = '<br /><fieldset style="width:400px;"><legend>'.$this->l('Fianet Validation').'</legend>'; + $html .= '<a href="https://secure.fia-net.com/'.($conf ? 'fscreener' : 'pprod').'/BO/visucheck_detail.php?sid='.Configuration::get('SAC_SITEID').'&log='.Configuration::get('SAC_LOGIN').'&pwd='.urlencode(Configuration::get('SAC_PASSWORD')).'&rid='.$params['id_order'].'">'.$this->l('See Detail').'</a><br />'; + $html .= $this->l('Evaluate').': '.self::getEval((int)($order->id)); + $html .= '</fieldset>'; + + return $html; + } + + private static function getHCarriers($field) + { + $carriers = Carrier::getCarriers(Configuration::get('PS_LANG_DEFAULT')); + $hcarrier = '<option value=""></option>'; + foreach ($carriers AS $carrier) + $hcarrier .= '<option value="'.$carrier['id_carrier'].'"'.(($carrier['id_carrier'] == Configuration::get($field)) ? 'selected="selected"' : '').'>'.$carrier['name'].'</option>'; + return $hcarrier; + } + + private static function updateOrderHistory($id_order) + { + if (self::getEval((int)($id_order)) > 0) + return true; + elseif (self::getEval((int)($id_order)) == 0) + { + $orderHistory = new OrderHistory(); + $orderHistory->id_order = (int)($id_order); + $orderHistory->id_order_state = Configuration::get('SAC_ID_FRAUD'); + $orderHistory->save(); + return true; + } + } + + private static function getEval($id_order) + { + $sender = new fianet_sender(); + if (Configuration::get('SAC_PRODUCTION')) + $sender->mode = 'production'; + $result = $sender->get_evaluation(array($id_order)); + return $result[0]['eval']; + } + + public static function reEvaluateOrder() + { + $sender = new fianet_sender(); + if (Configuration::get('SAC_PRODUCTION')) + $sender->mode = 'production'; + $result = $sender->get_reevaluated_order(); + + foreach ($result AS $row) + if ($row['eval'] > 0) + if (OrderHistory::getLastOrderState($row['refid']) == Configuration::get('SAC_ID_WAITING')) + { + $orderHistory = new OrderHistory(); + $orderHistory->id_order = (int)($row['refid']); + $orderHistory->id_order_state = _PS_OS_PAYMENT_; + $orderHistory->save(); + } + return true; + } + + private static function getCarrierFastById($id_carrier) + { + return 2; + } + + public function getSACCategories() + { + $categories = Db::getInstance()->ExecuteS('SELECT id_category, id_sac FROM '._DB_PREFIX_.'sac_categories'); + $sac_cat = array(); + if ($categories) + foreach ($categories AS $category) + $sac_cat[$category['id_category']] = $category['id_sac']; + return $sac_cat; + } +} + diff --git a/modules/fianetfraud/fr.php b/modules/fianetfraud/fr.php new file mode 100644 index 000000000..4ffb257b6 --- /dev/null +++ b/modules/fianetfraud/fr.php @@ -0,0 +1,36 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetfraud}prestashop>fianetfraud_740e53a0ed1b643f69c4aaa8ad4ae8d2'] = 'Code transporteur invalide'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour avec succès'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_380b4179d36bce6ca862459a43b217b5'] = 'Pour vous inscrire, rendez-vous sur:'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_592fcfe937f6d58f70d0918ef6373afa'] = 'le site internet de Fia-Net'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dea78007133396a7b8ed70578ac6ae'] = 'Utilisateur'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_dc647eb65e6711e155375218212b3964'] = 'Mot de passe'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b250a007769c7ffe655c74cfb8176b8c'] = 'ID Site'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_30dbd3dffa9dbd08b062436ba8dcbad7'] = 'Mode production'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dbbd4d0ac4c725f3b0d2ff29abaf63'] = 'Type par défaut'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7bc873cba11f035df692c3549366c722'] = '-- Choisissez --'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b16c6b201b9dea0dba4c5214e584d5a9'] = 'Détail'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Catégorie'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_32b1e872d533aced68e8fd06117c35d9'] = 'Type'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_bb8d6a9f57dcf8f450d8c8b6107cfabb'] = 'Choix de la catégorie'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_5f001485711e47385cb84b10c888bbfd'] = 'Configuration du transporteur'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_84a4ee79ed85180a743340dceb2f98d1'] = 'Détail'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_914419aa32f04011357d3b604a86d7eb'] = 'Transporteur'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Type de transporteur'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Choix du type de transporteur'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_803d8f90719db3a605cf4af72ab2d8ee'] = 'Type de transporteur par defaut'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_4a04490d2817c00012562df7bc43299d'] = 'Configuration du paiement'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ff18b8d27988b97ba1dd72120dd524ea'] = 'Détails du paiement'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Module de paiement'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Type de paiement'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_127469a6b4253ebb77adccc0dd48461e'] = 'M.'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Mme'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Inconnu'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_d13270d4831bb2a2723f0fb5b573807c'] = 'Validation Fia-Net'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_e010021939a49b7cce07f0e546c1d54f'] = 'Voir le détail'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b086843368d1c92d0a86cbee76b20b6f'] = 'Evaluation'; diff --git a/modules/fianetfraud/install.sql b/modules/fianetfraud/install.sql new file mode 100644 index 000000000..eb438a853 --- /dev/null +++ b/modules/fianetfraud/install.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_fianet_fraud` ( + `id_cart` int(11) unsigned NOT NULL, + `ip_address` int(11) NOT NULL, + `date` datetime NOT NULL, + KEY `id_cart_index` (`id_cart`), + KEY `ip_address_index` (`ip_address`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_fianet_fraud_orders` ( + `id_order` int(11) NOT NULL, + `date_add` datetime NOT NULL, + UNIQUE KEY `id_order` (`id_order`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/modules/fianetfraud/it.php b/modules/fianetfraud/it.php new file mode 100644 index 000000000..3031f583b --- /dev/null +++ b/modules/fianetfraud/it.php @@ -0,0 +1,38 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetfraud}prestashop>fianetfraud_740e53a0ed1b643f69c4aaa8ad4ae8d2'] = 'Codice corriere non valido'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7ccf58c950043c9fbfed668df13ce608'] = 'Impostazioni aggiornate'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_380b4179d36bce6ca862459a43b217b5'] = 'Per accedere, visitare:'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_592fcfe937f6d58f70d0918ef6373afa'] = 'Sito web Fia-net'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dea78007133396a7b8ed70578ac6ae'] = 'Login'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_dc647eb65e6711e155375218212b3964'] = 'Password'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b250a007769c7ffe655c74cfb8176b8c'] = 'ID sito'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_30dbd3dffa9dbd08b062436ba8dcbad7'] = 'Modalità di Produzione'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_99dbbd4d0ac4c725f3b0d2ff29abaf63'] = 'Tipo di prodotto per default'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7bc873cba11f035df692c3549366c722'] = '-- Scegli --'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b16c6b201b9dea0dba4c5214e584d5a9'] = 'Dettagli categoria'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoria'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_32b1e872d533aced68e8fd06117c35d9'] = 'Tipo di categoria'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_bb8d6a9f57dcf8f450d8c8b6107cfabb'] = 'Scegli una categoria ...'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_5f001485711e47385cb84b10c888bbfd'] = 'Configurazione corriere'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_84a4ee79ed85180a743340dceb2f98d1'] = 'Dettagli corriere'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_914419aa32f04011357d3b604a86d7eb'] = 'Corriere'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Tipo di corriere'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Scegli un tipo di vettorecorriere...'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_803d8f90719db3a605cf4af72ab2d8ee'] = 'Tipo di corriere di default'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_4a04490d2817c00012562df7bc43299d'] = 'Configurazione pagamento'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ff18b8d27988b97ba1dd72120dd524ea'] = 'Dettaglio di pagamento'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Modulo Pagamento'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Tipo di pagamento'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_127469a6b4253ebb77adccc0dd48461e'] = 'Sig.'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Sig.ra'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Sconosciuto'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_d13270d4831bb2a2723f0fb5b573807c'] = 'Convalida Fianet'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_e010021939a49b7cce07f0e546c1d54f'] = 'Vedi dettaglio'; +$_MODULE['<{fianetfraud}prestashop>fianetfraud_b086843368d1c92d0a86cbee76b20b6f'] = 'Valutaz.'; + +?> \ No newline at end of file diff --git a/modules/fianetfraud/logo.gif b/modules/fianetfraud/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d5fe1ef3d719ec9c009cfaa24437de836a88a9c GIT binary patch literal 230 zcmZ?wbhEHb6krfw*v!vx;K@IS{v(F<TQ)uTcl5=-8CU+69sm9I$A6WQ6>NU>H{Sna z^RA9v`;g76@;?|T{$ycfVBlxaVE_V<84N6wKb(BNYHjhg!x0>J8$G8AGB_+0b2OA| zJFvsyI;Y-Jou-74hPeEN1qEWAtcQy@6vW#OGj3d=$J@ZQSjys!SnmdlDh(5XuDKEi z9TeDF7$41<*Dl$@<QTZ(k|+-^CofMX7h9-jD?4){XDb&Y=VVR}7IyyjCLYHr&1_sM eENr};lM~sdOBLqk<rK`2oLR`cwOUe;!5RSh7gxvt literal 0 HcmV?d00001 diff --git a/modules/fianetfraud/logo.jpg b/modules/fianetfraud/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb0dee31fc1487f616aa9fdbd620d66117b107da GIT binary patch literal 15435 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 literal 0 HcmV?d00001 diff --git a/modules/fianetsceau/config.xml b/modules/fianetsceau/config.xml new file mode 100755 index 000000000..53d99e653 --- /dev/null +++ b/modules/fianetsceau/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>fianetsceau</name> + <displayName><![CDATA[FIA-NET Seal of Confidence]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Turn your visitors into buyers by creating confidence in your site.]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries>fr</limited_countries> +</module> \ No newline at end of file diff --git a/modules/fianetsceau/de.php b/modules/fianetsceau/de.php new file mode 100644 index 000000000..f5c60a064 --- /dev/null +++ b/modules/fianetsceau/de.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetsceau}prestashop>fianetsceau_21d574c0b27fc6bebc399be75502d84d'] = 'FIA-NET Vertrauenssiegel'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_76c3b678f626c3858c3c98baac90c7ac'] = 'Machen Sie Ihre Besucher zu Käufern durch Vertrauensbildung in Ihre Webseite'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_32c355617b8730b1603e31d144513890'] = 'Bitte füllen Sie Ihr geheimes Schlüsselfeld aus'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_59dd48942de548b075014fe901bfae1b'] = 'Bitte geben Sie Ihre Seiten-ID ein'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_380b4179d36bce6ca862459a43b217b5'] = 'Um sich anzumelden, melden Sie sich ab:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_592fcfe937f6d58f70d0918ef6373afa'] = 'Fia-Net Website'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_ee56be2890222bce04455a34055fd107'] = 'Ihre Seiten-ID'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Beispiel:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_7b00d0388fa5d48b7b00e4f71e4d71d0'] = '(Nur Zahlen)'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_d2560860c51f895a9871741f0805c39e'] = 'geheimer Schlüssel'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_15e8f5f1bb8a1c0cd63bb832412799b1'] = 'geheimer Schlüssel, den Sie von Fia-Net erhalten haben'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_650be61892bf690026089544abbd9d26'] = 'Modus'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_756d97bb256b8580d4d71ee0c547804e'] = 'Betrieb'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aktualisierungseinstellungen'; + +?> \ No newline at end of file diff --git a/modules/fianetsceau/es.php b/modules/fianetsceau/es.php new file mode 100644 index 000000000..8e8d41ebe --- /dev/null +++ b/modules/fianetsceau/es.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetsceau}prestashop>fianetsceau_21d574c0b27fc6bebc399be75502d84d'] = 'Sello de confianza de la FIA-NET'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_76c3b678f626c3858c3c98baac90c7ac'] = 'Convierta a sus visitantes en compradores creando confianza en su sitio web'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_32c355617b8730b1603e31d144513890'] = 'Por favor, introduzca su campo de clave privada'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_59dd48942de548b075014fe901bfae1b'] = 'Por favor, introduzca su Identificación de sitio'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Parámetros actualizados con éxito'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_380b4179d36bce6ca862459a43b217b5'] = 'Para conectarse, visite:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_592fcfe937f6d58f70d0918ef6373afa'] = 'Web de FIA-net'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_ee56be2890222bce04455a34055fd107'] = 'ID de su sitio'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Ejemplo:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_7b00d0388fa5d48b7b00e4f71e4d71d0'] = '(números solamente)'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_d2560860c51f895a9871741f0805c39e'] = 'Clave privada'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_15e8f5f1bb8a1c0cd63bb832412799b1'] = 'Clave privada comunicada por FIA-NET'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_650be61892bf690026089544abbd9d26'] = 'Modo'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_756d97bb256b8580d4d71ee0c547804e'] = 'Producción'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar'; diff --git a/modules/fianetsceau/fianetsceau.php b/modules/fianetsceau/fianetsceau.php new file mode 100644 index 000000000..cae2d1c39 --- /dev/null +++ b/modules/fianetsceau/fianetsceau.php @@ -0,0 +1,239 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class FianetSceau extends Module +{ + private $id_order; + + function __construct() + { + $this->name = 'fianetsceau'; + $this->tab = 'front_office_features'; + $this->version = '1.0'; + $this->limited_countries = array('fr'); + + parent::__construct(); + + $this->displayName = $this->l('FIA-NET Seal of Confidence'); + $this->description = $this->l('Turn your visitors into buyers by creating confidence in your site.'); + if (!Configuration::get('FIANET_SCEAU_PRIVATEKEY')) + $this->warning = $this->l('Please enter your Private Key field.'); + if (!Configuration::get('FIANET_SCEAU_SITEID')) + $this->warning = $this->l('Please enter your site ID.'); + } + + public function install() + { + return (parent::install() AND + $this->registerHook('rightColumn') AND + $this->registerHook('updateOrderStatus') AND + Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'fianet_seal`( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_order` int(10) unsigned NOT NULL, + `upload_success` int(10) unsigned NOT NULL, + `valid` int(10) unsigned NOT NULL, + `status` int(10) unsigned NOT NULL, + `date_upd` datetime NOT NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id`) + )')); + } + + private function getProcess() + { + if ((int)Tools::getValue('fia_net_mode') == 1) + Configuration::updateValue('FIA_NET_SEAL_MODE', 1); + else + Configuration::updateValue('FIA_NET_SEAL_MODE', 0); + + if (!preg_match('#^[0-9]+$#', Tools::getValue('FIANET_SCEAU_SITEID'))) + return parent::displayError('Bad site id (numbers only)'); + else + Configuration::updateValue('FIANET_SCEAU_SITEID', Tools::getValue('FIANET_SCEAU_SITEID')); + Configuration::updateValue('FIANET_SCEAU_PRIVATEKEY', Tools::getValue('FIANET_SCEAU_PRIVATEKEY')); + + if ((int)Tools::getValue('fia_net_mode')) + $dataSync = (($site_id = Configuration::get('FIANET_SCEAU_SITEID')) ? '<img src="http://www.prestashop.com/modules/fianetsceau.png?site_id='.urlencode($site_id).'" style="float:right" />' : 'toto'); + else + $dataSync = ''; + return $this->_html .= $this->displayConfirmation($this->l('Configuration updated').$dataSync); } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (!is_callable('curl_init')) + $output .= parent::displayError('You need to enable Curl library to use this module'); + else if (Tools::isSubmit('submitFianet')) + $output .= self::getProcess(); + + $output .= ' + <fieldset style="width:80%"><legend>'.$this->displayName.'</legend> + <img src="../modules/'.$this->name.'/logo.jpg" style="float:right;margin:5px 10px 5px 0" /> + <blockquote style="margin-left:5px"><b>« Le Sceau de Confiance FIA-NET, leader de la confiance sur le web, influence la décision d’achat de 83 % des internautes (*)</b></blockquote> + <p style="margin-left:30px"><br /> + Le Sceau de Confiance FIA-NET, le plus connu en France, fait la preuve de vos performances. Il restitue les avis de vos clients grâce à l’envoi <b>de deux questionnaires de satisfaction</b> après l’achat et après la livraison.<br /><br /> + <b>L’extranet, un outil d’analyse de performance unique</b>, exploite les réponses de vos clients à ces questionnaires. Une aide inestimable qui vous permet de mieux connaitre vos clients et de piloter votre politique marketing et communication.<br /> + <br /> + <span style="font-size:0.8em;font-style:italic;">(*Etude FIA-NET – Novembre 2009 – 836 répondants)</span> »</p> + <p>'.$this->l('To sign in, check out: ').' <u><a href="https://www.fia-net.com/marchands/devispartenaire.php?p=185" target="_blank">'.$this->l('Fia-net Website').'</a></u></p> + </fieldset><p class="clear">&nbsp;</p>'; + $output .= ' + <form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset class="width2"> + <legend><img src="'.$this->_path.'logo.gif" alt="" class="middle" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Your site ID').'</label> + <div class="margin-form"> + <input type="text" name="FIANET_SCEAU_SITEID" value="'.Configuration::get('FIANET_SCEAU_SITEID').'" /> + <p class="clear">'.$this->l('Sample:').' site_id = \'<b>XXXXX</b>\' '.$this->l('(numbers only)').'</p> + </div> + <label>'.$this->l('Private Key').'</label> + <div class="margin-form"> + <input type="text" name="FIANET_SCEAU_PRIVATEKEY" value="'.Configuration::get('FIANET_SCEAU_PRIVATEKEY').'" /> + <p class="clear">'.$this->l('Private key communicated by Fia-Net').'</p> + </div> + <label>'.$this->l('Mode').'</label> + <div class="margin-form"> + <span style="display:block;float:left;margin-top:3px;"> + <input type="radio" id="test" name="fia_net_mode" value="0" style="vertical-align:middle;display:block;float:left;margin-top:2px;margin-right:3px;" + '.(!Configuration::get('FIA_NET_SEAL_MODE') ? 'checked' : '').'/> + <label for="test" style="color:#900;display:block;float:left;text-align:left;width:60px;">'.$this->l('Test').'</label>&nbsp;</span> + <span style="display:block;float:left;margin-top:3px;"> + <input type="radio" id="production" name="fia_net_mode" value="1" style="vertical-align:middle;display:block;float:left;margin-top:2px;margin-right:3px;" + '.(Configuration::get('FIA_NET_SEAL_MODE') ? 'checked' : '').'/> + <label for="production" style="color:#080;display:block;float:left;text-align:left;width:85px;">'.$this->l('Production').'</label></span> + </div> + <p class="clear">&nbsp;</p> + <input type="submit" name="submitFianet" value="'.$this->l('Update settings').'" class="button" /> + </fieldset> + </form>'; + + return $output; + } + + private function sendXML() + { + $SiteID = Configuration::get('FIANET_SCEAU_SITEID'); + $order = new Order((int)$this->id_order); + $customer = new Customer((int)$order->id_customer); + $currency = new Currency((int)$order->id_currency); + $control = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?><control></control>'); + + $user = $control->addChild('utilisateur'); + $name = $user->addChild('nom', $customer->lastname); + if ($customer->id_gender == 1 OR $customer->id_gender == 2) + $name->addAttribute('titre', 1); + $user->addChild('prenom', $customer->firstname); + $user->addChild('email', $customer->email); + + $info = $control->addChild('infocommande'); + $info->addChild('siteid', $SiteID); + $info->addChild('refid', (int)$order->id); + + $total = round($order->total_paid / $currency->conversion_rate, 2); + $amount = $info->addChild('montant', $total); + $amount->addAttribute('devise', 'EUR'); + + $ip = long2ip(Db::getInstance()->getValue(' + SELECT ip_address + FROM '._DB_PREFIX_.'connections a + WHERE a.id_guest = ( + SELECT id_guest FROM '._DB_PREFIX_.'guest + WHERE id_customer = '.(int)$customer->id.' + LIMIT 1)')); + + $order_date = Db::getInstance()->getValue(' + SELECT date_add + FROM '._DB_PREFIX_.'orders + WHERE id_order = '.(int)$order->id); + $customer_ip = $info->addChild('ip', $ip); + $customer_ip->addAttribute('timestamp', $order_date); + + $cryptKey = md5(Configuration::get('FIANET_SCEAU_PRIVATEKEY').'_'.(int)$order->id.'+'.$order_date.'='.$customer->email); + $control->addChild('crypt', $cryptKey); + + $XMLInfo = $control->asXML(); + $CheckSum = md5($XMLInfo); + + $curl = curl_init('https://www.fia-net.com/engine/'.(!Configuration::get('FIA_NET_SEAL_MODE') ? 'preprod/' : '').'sendrating.cgi'); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_POSTFIELDS, 'SiteID='.$SiteID.'&XMLInfo='.$XMLInfo.'&CheckSum='.$CheckSum); + curl_setopt($curl, CURLOPT_TIMEOUT, 10); + $result = new simpleXMLelement(curl_exec($curl)); + curl_close ($curl); + + if ($result['type'] == 'OK') + return true; + return false; + } + + public function hookUpdateOrderStatus($params) + { + $this->id_order = (int)$params['id_order']; + $res = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'fianet_seal` a WHERE a.id_order = '.(int)$params['id_order']); + $upload_success = false; + if (!$res) + { + if (!($order = new Order((int)$params['id_order']))) + return; + if ($params['newOrderStatus']->logable == 1) + $upload_success = self::sendXML(); + Db::getInstance()->Execute(' + INSERT INTO '._DB_PREFIX_.'fianet_seal (id_order, upload_success, valid, status, date_upd, date_add) + VALUES ('.(int)$order->id.', 0,'.(int)$params['newOrderStatus']->logable.', '.(int)$params['newOrderStatus']->id.', NOW(), NOW())'); + } + else + { + if ($res['valid'] == 1 AND $res['upload_success'] == 1) + return; + if ($params['newOrderStatus']->logable == 1) + $upload_success = self::sendXML(); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'fianet_seal` a + SET valid = '.(int)$params['newOrderStatus']->logable.', upload_success = '.(int)$upload_success.', status = '.(int)$params['newOrderStatus']->id.', date_upd = NOW() + WHERE a.id = '.(int)$res['id']); + } + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookRightColumn($params) + { + global $cookie; + return '<a href="javascript:;" onclick="varwin=window.open(\'https://www.fia-net.com/certif/certificat.php?key='.Configuration::get('FIANET_SCEAU_SITEID').'&amp;lang='.Language::getIsoById((int)($cookie->id_lang)).'\', \'certificat\', \'width=650, height=510\', \'toolbar=no, location=no,directories=no, status=no, menubar=no, scrollbars=no, resizable=yes,dependent=yes\');"><img src="https://www.fia-net.com/img/logos/'.(($cookie->id_lang != 2 ) ? 'en/' : '' ).'rouge3bc.gif" title="Voir la fiche marchand sur Fia-net.com" alt="Voir la fiche marchand sur Fia-net.com" /></a>'; + } +} + + diff --git a/modules/fianetsceau/fr.php b/modules/fianetsceau/fr.php new file mode 100644 index 000000000..b73ccf8db --- /dev/null +++ b/modules/fianetsceau/fr.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetsceau}prestashop>fianetsceau_21d574c0b27fc6bebc399be75502d84d'] = 'FIA-NET Sceau de Confiance'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_76c3b678f626c3858c3c98baac90c7ac'] = 'Transformez vos visiteurs en acheteurs en créant la confiance sur votre site'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_32c355617b8730b1603e31d144513890'] = 'Veuillez renseigner votre clé privée'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_59dd48942de548b075014fe901bfae1b'] = 'Veuillez renseigner l\'ID de votre site'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Paramètres mis à jour avec succès'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_380b4179d36bce6ca862459a43b217b5'] = 'Pour vous inscrire, rendez-vous sur:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_592fcfe937f6d58f70d0918ef6373afa'] = 'le site internet de Fia-Net'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_ee56be2890222bce04455a34055fd107'] = 'L\'id de votre site'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Exemple :'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_7b00d0388fa5d48b7b00e4f71e4d71d0'] = '(nombres seulement)'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_d2560860c51f895a9871741f0805c39e'] = 'Clé privée'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_15e8f5f1bb8a1c0cd63bb832412799b1'] = 'Clé privée communiquée par Fia-Net'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_650be61892bf690026089544abbd9d26'] = 'Mode'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_756d97bb256b8580d4d71ee0c547804e'] = 'Production'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour'; diff --git a/modules/fianetsceau/it.php b/modules/fianetsceau/it.php new file mode 100644 index 000000000..29371f78f --- /dev/null +++ b/modules/fianetsceau/it.php @@ -0,0 +1,23 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{fianetsceau}prestashop>fianetsceau_21d574c0b27fc6bebc399be75502d84d'] = 'Sigillo di fiducia FIA-NET '; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_76c3b678f626c3858c3c98baac90c7ac'] = 'Trasforma il tuo visitatori in acquirenti creando fiducia creando nel tuo sito'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_32c355617b8730b1603e31d144513890'] = 'Inserisci il tuo campo chiave privata'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_59dd48942de548b075014fe901bfae1b'] = 'Inserisci il tuo id sito '; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_380b4179d36bce6ca862459a43b217b5'] = 'Per accedere, visitare:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_592fcfe937f6d58f70d0918ef6373afa'] = 'Sito web Fia-net'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_ee56be2890222bce04455a34055fd107'] = 'ID del tuo sito'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Esempio:'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_7b00d0388fa5d48b7b00e4f71e4d71d0'] = '(solo numeri)'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_d2560860c51f895a9871741f0805c39e'] = 'Chiave Privata'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_15e8f5f1bb8a1c0cd63bb832412799b1'] = 'La chiave privata comunicata da FIA-NET'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_650be61892bf690026089544abbd9d26'] = 'Modalità'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_756d97bb256b8580d4d71ee0c547804e'] = 'Produzione'; +$_MODULE['<{fianetsceau}prestashop>fianetsceau_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; + +?> \ No newline at end of file diff --git a/modules/fianetsceau/logo.gif b/modules/fianetsceau/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..c02ec1ba73b5cfc3c0ceae9a2c100091c4afb121 GIT binary patch literal 994 zcmZ?wbhEHb6krfw_|5<VlZ2(Fib${Gm7MS9vo|60oMXV*=I-+=);!yO;L^35w;w$I zc<K7{SFgW){r3O=f3S{GVl)JXNeC$ZWMO1r_|KpN@((CaFmUW=_|N(0`+@}ro0!?f zN(vr0G&1qZDu_e~I5M*F2xa&LC>(TQ=irg~aAHBCGqW70nLxq;hNdQ-sBIz_9xysH zGPB4SyjZ~C$H*aLp`ftfg&zwKmz+k_frDO*jElT@Unw{;F!6?YsTMRaFtT!s2<(_u znsbGjTSzBk!UBz(Z0t-t90dy5%q*_O*Gd;CylU9R%f%yM({O-^{r|gDwgQts#IW#c j=s5@|ynnEQgHN01_Eqih4IRR2e5)6Hxz)nR$Y2cs-tb_L literal 0 HcmV?d00001 diff --git a/modules/fianetsceau/logo.jpg b/modules/fianetsceau/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ff0ae6f97c751c3bb16c6054d783b8562f3d5c4 GIT binary patch literal 20511 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 literal 0 HcmV?d00001 diff --git a/modules/followup/config.xml b/modules/followup/config.xml new file mode 100755 index 000000000..948925ab5 --- /dev/null +++ b/modules/followup/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>followup</name> + <displayName><![CDATA[Customer follow-up]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Follow-up with your customers with daily customized e-mails.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[advertising_marketing]]></tab> + <confirmUninstall>Are you sure you want to delete all settings and your logs?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/followup/cron.php b/modules/followup/cron.php new file mode 100644 index 000000000..0ebf04a52 --- /dev/null +++ b/modules/followup/cron.php @@ -0,0 +1,40 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/followup.php'); + +if (isset($_GET['secure_key'])) +{ + $secureKey = Configuration::get('PS_FOLLOWUP_SECURE_KEY'); + if (!empty($secureKey) AND $secureKey === $_GET['secure_key']) + { + $followup = new Followup(); + $followup->cronTask(); + } +} + diff --git a/modules/followup/de.php b/modules/followup/de.php new file mode 100644 index 000000000..0214de5c2 --- /dev/null +++ b/modules/followup/de.php @@ -0,0 +1,46 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{followup}prestashop>followup_9c34e90380dac7b56fdd19192a99d531'] = 'Kundenkontakt'; +$_MODULE['<{followup}prestashop>followup_57476355fcd04050bff196ae9aa4673c'] = 'Bleiben Sie dran an Ihren Kunden mit täglichen kundenspezifischen E-Mails'; +$_MODULE['<{followup}prestashop>followup_f71a41841c80c2ef0ec02a6ad5449c65'] = 'Sie sind sicher, dass Sie alle Einstellungen und Ihre Logs löschen wollen?'; +$_MODULE['<{followup}prestashop>followup_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{followup}prestashop>followup_599fac49ffe947cd0f9e934e6af89879'] = 'Vier Arten von E-Mail Alerts, um in Kontakt mit Ihren Kunden bleiben!'; +$_MODULE['<{followup}prestashop>followup_8b1aa589b33a54906ae78f5820eab42c'] = 'Definieren Sie die Einstellungen und setzen Sie diese URL in eine Crontab oder rufen Sie sie manuell täglich auf:'; +$_MODULE['<{followup}prestashop>followup_b547c073d144a57761d1d00d0b9d9f27'] = 'Gelöschte Warenkörbe'; +$_MODULE['<{followup}prestashop>followup_ea9dc62a0ddf4640f019f04a22ab9835'] = 'Generieren Sie einen Rabatt für jeden gelöschten Warenkorb (ohne Reihenfolge) und senden Sie ihn an den Kunden'; +$_MODULE['<{followup}prestashop>followup_2faec1f9f8cc7f8f40d521c4dd574f49'] = 'Aktivieren'; +$_MODULE['<{followup}prestashop>followup_b30690be173bcd4a83df0cd68f89a385'] = 'Rabattbetrag'; +$_MODULE['<{followup}prestashop>followup_2018945d252b94aeb99b0909f288717c'] = 'Rabattgültigkeit'; +$_MODULE['<{followup}prestashop>followup_225e75c29d32392d311f5dc94c792384'] = 'Tag (e)'; +$_MODULE['<{followup}prestashop>followup_79645190f574ce5b72b89f4122107b72'] = 'Der nächste Prozess sendet:'; +$_MODULE['<{followup}prestashop>followup_46e89640babbc6a0e52599a92a6c13b4'] = 'E-Mails'; +$_MODULE['<{followup}prestashop>followup_1ec5f5ec77c51a968271b2ca9862907d'] = 'E-Mail'; +$_MODULE['<{followup}prestashop>followup_a8b8dbd070a92fb8b17baab71d8d633f'] = 'Neu sortieren'; +$_MODULE['<{followup}prestashop>followup_895858cf10b8a1750a42875cb9c69092'] = 'Erzeugen einen Rabatt Für jede bestätigte Bestellung und senden Sie ihn an den Kunden'; +$_MODULE['<{followup}prestashop>followup_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Beste Kunden'; +$_MODULE['<{followup}prestashop>followup_a46ad892f7f00e051cc90050ff2e1ddf'] = 'Erzeugen Sie einen Rabatt für jeden Kunden, der eine bestimmte Schwelle erreicht, und senden Sie ihn an den Kunden'; +$_MODULE['<{followup}prestashop>followup_2a63f555989152ba866b43a1faacd680'] = 'Schwelle '; +$_MODULE['<{followup}prestashop>followup_7d75b7b0f976b3091f490864c6ffbf97'] = 'Schlechte Kunden'; +$_MODULE['<{followup}prestashop>followup_e552313de5ebebdafa8bfa0dcc703e19'] = 'Erzeugen Sie einen Rabatt und senden Sie ihn an alle Kunden, die mindestens eine Bestellung durchgeführt haben und seit einem bestimmten Zeitraum nichts mehr bestellt haben'; +$_MODULE['<{followup}prestashop>followup_d82843c16839bfb05827d1912d89c917'] = 'Seit x Tagen'; +$_MODULE['<{followup}prestashop>followup_3fb7b0bbf0c95bba3ed2ba0b147ca588'] = 'Löschen Sie veraltete Rabatte bei jedem Start, um die Datenbank zu leeren'; +$_MODULE['<{followup}prestashop>followup_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{followup}prestashop>followup_c33e404a441c6ba9648f88af3c68a1ca'] = 'Statistik'; +$_MODULE['<{followup}prestashop>followup_1deaabda093f617a57f732c07e635fac'] = 'Detaillierte Statistik der letzten 30 Tage:'; +$_MODULE['<{followup}prestashop>followup_f23b0eec6c25c49afa4b29c57e671728'] = 'S = Anzahl der gesendeten E-Mails'; +$_MODULE['<{followup}prestashop>followup_fde0b9a66bffdd6ee0886613e8031d9a'] = 'U = Anzahl der verwendeten Rabatte (nur bestätigte Bestellungen)'; +$_MODULE['<{followup}prestashop>followup_cceb59e78d00c10436ff5e777dd5d895'] = '% = Umrechnungskurs'; +$_MODULE['<{followup}prestashop>followup_44749712dbec183e983dcd78a7736c41'] = 'Datum'; +$_MODULE['<{followup}prestashop>followup_5e53dfa887dfb989f0bc3e9fb9b34a2d'] = 'Bester Kunde'; +$_MODULE['<{followup}prestashop>followup_66ff4e89c767ab0a4e5ddc0251a101bc'] = 'Schlechter Kunde'; +$_MODULE['<{followup}prestashop>followup_5dbc98dcc983a70728bd082d1a47546e'] = 'S'; +$_MODULE['<{followup}prestashop>followup_4c614360da93c0a041b22e537de151eb'] = 'U'; +$_MODULE['<{followup}prestashop>followup_85b6769250887ba6c16099596c75164d'] = 'noch keine Statistik '; +$_MODULE['<{followup}prestashop>followup_edf9feeab43a7623f6afc152d1ede515'] = 'Rabatt für Ihren abgebrochenen Warenkorb'; +$_MODULE['<{followup}prestashop>followup_a053fc9952a7dfc79282eba56ab8ad3a'] = 'Danke für Ihre Bestellung'; +$_MODULE['<{followup}prestashop>followup_7fcd592dd47028c7c1f2d0ce9168a303'] = 'Sie sind einer unserer besten Kunden'; +$_MODULE['<{followup}prestashop>followup_c2ab23672d4bb31c7664bf8e854a10f7'] = 'Wir vermissen Sie'; + +?> \ No newline at end of file diff --git a/modules/followup/en.php b/modules/followup/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/followup/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/followup/es.php b/modules/followup/es.php new file mode 100644 index 000000000..bbbaf5850 --- /dev/null +++ b/modules/followup/es.php @@ -0,0 +1,44 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{followup}prestashop>followup_9c34e90380dac7b56fdd19192a99d531'] = 'Retome contacto con sus clientes'; +$_MODULE['<{followup}prestashop>followup_57476355fcd04050bff196ae9aa4673c'] = 'Retome contacto con sus clientes enviando emails diariamente'; +$_MODULE['<{followup}prestashop>followup_f71a41841c80c2ef0ec02a6ad5449c65'] = '¿Está seguro de querer suprimir sus parámetros y sus estadísticas?'; +$_MODULE['<{followup}prestashop>followup_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{followup}prestashop>followup_599fac49ffe947cd0f9e934e6af89879'] = 'Existen cuatro maneras de estar en contacto con sus clientes'; +$_MODULE['<{followup}prestashop>followup_8b1aa589b33a54906ae78f5820eab42c'] = 'Efectúe sus reglages y añada esta URL a sus crontab o llámela manualmente cada día:'; +$_MODULE['<{followup}prestashop>followup_b547c073d144a57761d1d00d0b9d9f27'] = 'Carritos anulados'; +$_MODULE['<{followup}prestashop>followup_ea9dc62a0ddf4640f019f04a22ab9835'] = 'Cada carrito abandonado (sin pedido) genera un vale de compra y lo envía al cliente'; +$_MODULE['<{followup}prestashop>followup_2faec1f9f8cc7f8f40d521c4dd574f49'] = 'Activado'; +$_MODULE['<{followup}prestashop>followup_b30690be173bcd4a83df0cd68f89a385'] = 'Importe del descuento'; +$_MODULE['<{followup}prestashop>followup_2018945d252b94aeb99b0909f288717c'] = 'Duración de validez'; +$_MODULE['<{followup}prestashop>followup_225e75c29d32392d311f5dc94c792384'] = 'día(s)'; +$_MODULE['<{followup}prestashop>followup_79645190f574ce5b72b89f4122107b72'] = 'El próximo envío transmmitirá:'; +$_MODULE['<{followup}prestashop>followup_46e89640babbc6a0e52599a92a6c13b4'] = 'emails'; +$_MODULE['<{followup}prestashop>followup_1ec5f5ec77c51a968271b2ca9862907d'] = 'email'; +$_MODULE['<{followup}prestashop>followup_a8b8dbd070a92fb8b17baab71d8d633f'] = 'Pedir de nuevo'; +$_MODULE['<{followup}prestashop>followup_895858cf10b8a1750a42875cb9c69092'] = 'Para cada pedido validado, genera un vale de compra y lo envía al cliente'; +$_MODULE['<{followup}prestashop>followup_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Mejores clientes'; +$_MODULE['<{followup}prestashop>followup_a46ad892f7f00e051cc90050ff2e1ddf'] = 'Para cada cliente cuyo pedido total alcanza cierto importe en un plazo de tiempo concreto, genera un vale de compra y se lo envía'; +$_MODULE['<{followup}prestashop>followup_2a63f555989152ba866b43a1faacd680'] = 'Importe'; +$_MODULE['<{followup}prestashop>followup_7d75b7b0f976b3091f490864c6ffbf97'] = 'Malos clientes'; +$_MODULE['<{followup}prestashop>followup_e552313de5ebebdafa8bfa0dcc703e19'] = 'Para cada cliente que no haya hecho un pedido desde un cierto tiempo, genera un vale de compra y se lo envía'; +$_MODULE['<{followup}prestashop>followup_d82843c16839bfb05827d1912d89c917'] = 'Desde X días'; +$_MODULE['<{followup}prestashop>followup_3fb7b0bbf0c95bba3ed2ba0b147ca588'] = 'Suprimir los vales de compra cuya fecha de expiración está caducada para limpiar los datos'; +$_MODULE['<{followup}prestashop>followup_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{followup}prestashop>followup_c33e404a441c6ba9648f88af3c68a1ca'] = 'Estadísticas'; +$_MODULE['<{followup}prestashop>followup_1deaabda093f617a57f732c07e635fac'] = 'estadísticas detalladas de los 30 últimos días:'; +$_MODULE['<{followup}prestashop>followup_f23b0eec6c25c49afa4b29c57e671728'] = 'E= Número de emails enviados'; +$_MODULE['<{followup}prestashop>followup_fde0b9a66bffdd6ee0886613e8031d9a'] = 'U= Número de vales de compra utilizados (pedidos válidos únicamente)'; +$_MODULE['<{followup}prestashop>followup_cceb59e78d00c10436ff5e777dd5d895'] = 'ù= Tasa de transformación'; +$_MODULE['<{followup}prestashop>followup_44749712dbec183e983dcd78a7736c41'] = 'Fecha'; +$_MODULE['<{followup}prestashop>followup_5e53dfa887dfb989f0bc3e9fb9b34a2d'] = 'Mejores clientes'; +$_MODULE['<{followup}prestashop>followup_66ff4e89c767ab0a4e5ddc0251a101bc'] = 'Malos clientes'; +$_MODULE['<{followup}prestashop>followup_5dbc98dcc983a70728bd082d1a47546e'] = 'E'; +$_MODULE['<{followup}prestashop>followup_4c614360da93c0a041b22e537de151eb'] = 'U'; +$_MODULE['<{followup}prestashop>followup_85b6769250887ba6c16099596c75164d'] = 'Ningún dato registrado por el momento'; +$_MODULE['<{followup}prestashop>followup_edf9feeab43a7623f6afc152d1ede515'] = 'Vale de descuento para su carrito abandonado'; +$_MODULE['<{followup}prestashop>followup_a053fc9952a7dfc79282eba56ab8ad3a'] = 'Gracias por su pedido'; +$_MODULE['<{followup}prestashop>followup_7fcd592dd47028c7c1f2d0ce9168a303'] = 'Es usted uno de nuestros mejores clientes'; +$_MODULE['<{followup}prestashop>followup_c2ab23672d4bb31c7664bf8e854a10f7'] = 'le echamos de menos'; diff --git a/modules/followup/followup.php b/modules/followup/followup.php new file mode 100644 index 000000000..c449e3978 --- /dev/null +++ b/modules/followup/followup.php @@ -0,0 +1,488 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Followup extends Module +{ + function __construct() + { + $this->name = 'followup'; + $this->tab = 'advertising_marketing'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->confKeys = array( + 'PS_FOLLOW_UP_ENABLE_1', 'PS_FOLLOW_UP_ENABLE_2', 'PS_FOLLOW_UP_ENABLE_3', 'PS_FOLLOW_UP_ENABLE_4', + 'PS_FOLLOW_UP_AMOUNT_1', 'PS_FOLLOW_UP_AMOUNT_2', 'PS_FOLLOW_UP_AMOUNT_3', 'PS_FOLLOW_UP_AMOUNT_4', + 'PS_FOLLOW_UP_DAYS_1', 'PS_FOLLOW_UP_DAYS_2', 'PS_FOLLOW_UP_DAYS_3', 'PS_FOLLOW_UP_DAYS_4', + 'PS_FOLLOW_UP_THRESHOLD_3', + 'PS_FOLLOW_UP_DAYS_THRESHOLD_4', + 'PS_FOLLOW_UP_CLEAN_DB'); + + parent::__construct(); + + $this->displayName = $this->l('Customer follow-up'); + $this->description = $this->l('Follow-up with your customers with daily customized e-mails.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete all settings and your logs?'); + } + + public function install() + { + $logEmailTable = Db::getInstance()->Execute(' + CREATE TABLE '._DB_PREFIX_.'log_email ( + `id_log_email` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , + `id_email_type` INT UNSIGNED NOT NULL , + `id_discount` INT UNSIGNED NOT NULL , + `id_customer` INT UNSIGNED NULL , + `id_cart` INT UNSIGNED NULL , + `date_add` DATETIME NOT NULL, + INDEX `date_add`(`date_add`), + INDEX `id_cart`(`id_cart`) + ) ENGINE='._MYSQL_ENGINE_); + + foreach ($this->confKeys AS $key) + Configuration::updateValue($key, 0); + + Configuration::updateValue('PS_FOLLOWUP_SECURE_KEY', strtoupper(Tools::passwdGen(16))); + + return parent::install(); + } + + public function uninstall() + { + foreach ($this->confKeys AS $key) + Configuration::deleteByName($key); + + Configuration::deleteByName('PS_FOLLOWUP_SECURE_KEY'); + + Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'log_email'); + + return parent::uninstall(); + } + + public function getContent() + { + /* Save settings */ + if (Tools::isSubmit('submitFollowUp')) + foreach ($this->confKeys AS $c) + Configuration::updateValue($c, (float)(Tools::getValue($c))); + + /* Init */ + $conf = Configuration::getMultiple($this->confKeys); + foreach ($this->confKeys AS $k) + if (!isset($conf[$k])) + $conf[$k] = ''; + $currency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + + $n1 = $this->cancelledCart(true); + $n2 = $this->reOrder(true); + $n3 = $this->bestCustomer(true); + $n4 = $this->badCustomer(true); + + echo ' + <h2>'.$this->l('Customer follow-up').'</h2> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset style="width: 400px; float: left;"> + <legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <p>'.$this->l('Four kinds of e-mail alerts available in order to stay in touch with your customers!').'<br /><br /> + '.$this->l('Define settings and place this URL in crontab or call it manually daily:').'<br /> + <b>'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'modules/followup/cron.php?secure_key='.Configuration::get('PS_FOLLOWUP_SECURE_KEY').'</b></p> + <hr size="1" /> + <p><b>1. '.$this->l('Cancelled carts').'</b><br /><br />'.$this->l('For each cancelled cart (with no order), generate a discount and send it to the customer.').'</p> + <label>'.$this->l('Enable').'</label> + <div class="margin-form" style="padding-top: 5px;"><input type="checkbox" name="PS_FOLLOW_UP_ENABLE_1" value="1" style="vertical-align: middle;" '.($conf['PS_FOLLOW_UP_ENABLE_1'] == 1 ? 'checked="checked"' : '').' /></div> + <label>'.$this->l('Discount amount').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_AMOUNT_1" value="'.$conf['PS_FOLLOW_UP_AMOUNT_1'].'" size="6" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\');" /> %</div> + <label>'.$this->l('Discount validity').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_DAYS_1" value="'.$conf['PS_FOLLOW_UP_DAYS_1'].'" size="6" /> '.$this->l('day(s)').'</div> + <p>'.$this->l('Next process will send:').' <b>'.(int)($n1).' '.($n1 > 1 ? $this->l('e-mails') : $this->l('e-mail')).'</b></p> + <hr size="1" /> + <p><b>2. '.$this->l('Re-order').'</b><br /><br />'.$this->l('For each validated order, generate a discount and send it to the customer.').'</p> + <label>'.$this->l('Enable').'</label> + <div class="margin-form" style="padding-top: 5px;"><input type="checkbox" name="PS_FOLLOW_UP_ENABLE_2" value="1" style="vertical-align: middle;" '.($conf['PS_FOLLOW_UP_ENABLE_2'] == 1 ? 'checked="checked"' : '').' /></div> + <label>'.$this->l('Discount amount').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_AMOUNT_2" value="'.$conf['PS_FOLLOW_UP_AMOUNT_2'].'" size="6" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\');" /> %</div> + <label>'.$this->l('Discount validity').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_DAYS_2" value="'.$conf['PS_FOLLOW_UP_DAYS_2'].'" size="6" /> '.$this->l('day(s)').'</div> + <p>'.$this->l('Next process will send:').' <b>'.(int)($n2).' '.($n2 > 1 ? $this->l('e-mails') : $this->l('e-mail')).'</b></p> + <hr size="1" /> + <p><b>3. '.$this->l('Best customers').'</b><br /><br />'.$this->l('For each customer raising a threshold, generate a discount and send it to the customer.').'</p> + <label>'.$this->l('Enable').'</label> + <div class="margin-form" style="padding-top: 5px;"><input type="checkbox" name="PS_FOLLOW_UP_ENABLE_3" value="1" style="vertical-align: middle;" '.($conf['PS_FOLLOW_UP_ENABLE_3'] == 1 ? 'checked="checked"' : '').' /></div> + <label>'.$this->l('Discount amount').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_AMOUNT_3" value="'.$conf['PS_FOLLOW_UP_AMOUNT_3'].'" size="6" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\');" /> %</div> + <label>'.$this->l('Threshold').'</label> + <div class="margin-form">'.($currency->format == 1 ? ' '.$currency->sign.' ' : '').'<input type="text" name="PS_FOLLOW_UP_THRESHOLD_3" value="'.$conf['PS_FOLLOW_UP_THRESHOLD_3'].'" size="6" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\');" /> '.($currency->format == 2 ? ' '.$currency->sign : '').'</div> + <label>'.$this->l('Discount validity').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_DAYS_3" value="'.$conf['PS_FOLLOW_UP_DAYS_3'].'" size="6" /> '.$this->l('day(s)').'</div> + <p>'.$this->l('Next process will send:').' <b>'.(int)($n3).' '.($n3 > 1 ? $this->l('e-mails') : $this->l('e-mail')).'</b></p> + <hr size="1" /> + <p><b>4. '.$this->l('Bad customers').'</b><br /><br />'.$this->l('For each customer who has already passed at least one order and with no orders since a given duration, generate a discount and send it to the customer.').'</p> + <label>'.$this->l('Enable').'</label> + <div class="margin-form" style="padding-top: 5px;"><input type="checkbox" name="PS_FOLLOW_UP_ENABLE_4" value="1" style="vertical-align: middle;" '.($conf['PS_FOLLOW_UP_ENABLE_4'] == 1 ? 'checked="checked"' : '').' /></div> + <label>'.$this->l('Discount amount').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_AMOUNT_4" value="'.$conf['PS_FOLLOW_UP_AMOUNT_4'].'" size="6" onKeyUp="javascript:this.value = this.value.replace(/,/g, \'.\');" /> %</div> + <label>'.$this->l('Since x days').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_DAYS_THRESHOLD_4" value="'.$conf['PS_FOLLOW_UP_DAYS_THRESHOLD_4'].'" size="6" /> '.$this->l('day(s)').'</div> + <label>'.$this->l('Discount validity').'</label> + <div class="margin-form"><input type="text" name="PS_FOLLOW_UP_DAYS_4" value="'.$conf['PS_FOLLOW_UP_DAYS_4'].'" size="6" /> '.$this->l('day(s)').'</div> + <p>'.$this->l('Next process will send:').' <b>'.(int)($n4).' '.($n4 > 1 ? $this->l('e-mails') : $this->l('e-mail')).'</b></p> + <hr size="1" /> + <input type="checkbox" style="vertical-align: middle;" name="PS_FOLLOW_UP_CLEAN_DB" value="1" '.($conf['PS_FOLLOW_UP_CLEAN_DB'] == 1 ? 'checked="checked"' : '').' /> '.$this->l('Delete outdated discounts during each launch to clean database.').' + <hr size="1" /> + <center><input type="submit" name="submitFollowUp" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + + <style type="text/css"> + table tr th { + text-align: center; + font-weight: bold; + } + + table tr td, table tr th { + padding: 3px; + } + + table tr td { + text-align: right; + } + + table { width: 460px; border: 1px solid #666; } + </style> + <fieldset style="width: 460px; margin-left: 10px; float: left;"> + <legend><img src="'.$this->_path.'logo-2.gif" alt="" title="" />'.$this->l('Statistics').'</legend> + '.$this->l('Detailed statistics for last 30 days:').'<br /><br /> + <p style="font-size: 10px; font-weight: bold;"> + '.$this->l('S = Number of sent e-mails').'<br /> + '.$this->l('U = Number of discounts used (valid orders only)').'<br /> + '.$this->l('% = Conversion rate').' + </p><br /> + <table border="1" style="font-size: 11px;"> + <tr> + <th rowspan="2" style="width: 75px;">'.$this->l('Date').'</th> + <th colspan="3">'.$this->l('Cancelled carts').'</th> + <th colspan="3">'.$this->l('Re-order').'</th> + <th colspan="3">'.$this->l('Best cust.').'</th> + <th colspan="3">'.$this->l('Bad cust.').'</th> + </tr>'; + + $stats = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DATE_FORMAT(l.date_add, \'%Y-%m-%d\') date_stat, l.id_email_type, COUNT(l.id_log_email) nb, + (SELECT COUNT(l2.id_discount) + FROM '._DB_PREFIX_.'log_email l2 + LEFT JOIN '._DB_PREFIX_.'order_discount od ON (od.id_discount = l2.id_discount) + LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_order = od.id_order) + WHERE l2.id_email_type = l.id_email_type AND l2.date_add = l.date_add AND od.id_order IS NOT NULL AND o.valid = 1) nb_used + FROM '._DB_PREFIX_.'log_email l + WHERE l.date_add >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) + GROUP BY DATE_FORMAT(l.date_add, \'%Y-%m-%d\'), l.id_email_type'); + + $statsArray = array(); + foreach ($stats AS $stat) + { + $statsArray[$stat['date_stat']][$stat['id_email_type']]['nb'] = (int)($stat['nb']); + $statsArray[$stat['date_stat']][$stat['id_email_type']]['nb_used'] = (int)($stat['nb_used']); + } + + echo ' + <tr> + <td class="center">'.$this->l('S').'</td> + <td class="center">'.$this->l('U').'</td> + <td class="center">%</td> + <td class="center">'.$this->l('S').'</td> + <td class="center">'.$this->l('U').'</td> + <td class="center">%</td> + <td class="center">'.$this->l('S').'</td> + <td class="center">'.$this->l('U').'</td> + <td class="center">%</td> + <td class="center">'.$this->l('S').'</td> + <td class="center">'.$this->l('U').'</td> + <td class="center">%</td> + </tr>'; + + if (!sizeof($statsArray)) + echo '<tr><td colspan="13" style="font-weight: bold; text-align: center;">'.$this->l('No statistics at this time.').'</td></tr>'; + foreach ($statsArray AS $date_stat => $array) + { + $rates = array(); + for ($i = 1; $i != 5; $i++) + if (isset($statsArray[$date_stat][$i]['nb']) AND isset($statsArray[$date_stat][$i]['nb_used']) AND $statsArray[$date_stat][$i]['nb_used'] > 0) + $rates[$i] = number_format(($statsArray[$date_stat][$i]['nb_used'] / $statsArray[$date_stat][$i]['nb'])*100, 2, '.', ''); + + echo ' + <tr> + <td>'.$date_stat.'</td>'; + + for ($i = 1; $i != 5; $i++) + { + echo ' + <td>'.(isset($statsArray[$date_stat][$i]['nb']) ? (int)($statsArray[$date_stat][$i]['nb']) : 0).'</td> + <td>'.(isset($statsArray[$date_stat][$i]['nb_used']) ? (int)($statsArray[$date_stat][$i]['nb_used']) : 0).'</td> + <td>'.(isset($rates[$i]) ? '<b>'.$rates[$i].'</b>' : '0.00').'</td>'; + } + + echo ' + </tr>'; + } + + echo ' + </table> + </fieldset> + <div class="clear"></div> + </form>'; + } + + /* Log each sent e-mail */ + private function logEmail($id_email_type, $id_discount, $id_customer = NULL, $id_cart = NULL) + { + $values = array('id_email_type' => (int)($id_email_type), 'id_discount' => (int)($id_discount), 'date_add' => date('Y-m-d H:i:s')); + if (!empty($id_cart)) + $values['id_cart'] = (int)($id_cart); + if (!empty($id_customer)) + $values['id_customer'] = (int)($id_customer); + Db::getInstance()->autoExecute(_DB_PREFIX_.'log_email', $values, 'INSERT'); + } + + /* Each cart which wasn't transformed into an order */ + private function cancelledCart($count = false) + { + $emails = Db::getInstance()->ExecuteS(' + SELECT c.id_cart, c.id_lang, cu.id_customer, cu.firstname, cu.lastname, cu.email + FROM '._DB_PREFIX_.'cart c + LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_cart = c.id_cart) + LEFT JOIN '._DB_PREFIX_.'customer cu ON (cu.id_customer = c.id_customer) + WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= c.date_add AND cu.id_customer IS NOT NULL AND o.id_order IS NULL AND c.id_cart NOT IN + ('.join(',', $this->getLogsEmail(1)).')'); + + if ($count OR !sizeof($emails)) + return sizeof($emails); + + $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_1', 'PS_FOLLOW_UP_DAYS_1')); + foreach ($emails AS $email) + { + $voucher = $this->createDiscount(1, (float)($conf['PS_FOLLOW_UP_AMOUNT_1']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_1']).' day')), $this->l('Discount for your cancelled cart')); + if ($voucher !== false) + { + $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_1'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_1'], '{voucher_num}' => $voucher->name); + $result = Mail::Send((int)($email['id_lang']), 'followup_1', Mail::l('Your cart and your discount'), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); + $this->logEmail(1, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); + } + } + } + + private function getLogsEmail($emailType) + { + static $idList = array( + '1' => array(), + '2' => array(), + '3' => array(), + '4' => array(), + ); + static $executed = false; + + if(!$executed) + { + $query = ' + SELECT id_cart, id_customer, id_email_type FROM '._DB_PREFIX_.'log_email + WHERE id_email_type <> 4 OR date_add >= DATE_SUB(date_add,INTERVAL '.(int)(Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')).' DAY)'; + $results = Db::getInstance()->ExecuteS($query); + foreach ($results as $line) + { + switch ($line['id_email_type']) + { + case 1: + $idList['1'][] = $line['id_cart']; + break; + case 2: + $idList['2'][] = $line['id_cart']; + break; + case 3: + $idList['3'][] = $line['id_customer']; + break; + case 4: + $idList['4'][] = $line['id_customer']; + break; + } + } + $executed = true; + } + return $idList[$emailType]; + } + + /* For all validated orders, a discount if re-ordering before x days */ + private function reOrder($count = false) + { + $emails = Db::getInstance()->ExecuteS(' + SELECT o.id_order, c.id_cart, c.id_lang, cu.id_customer, cu.firstname, cu.lastname, cu.email + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'customer cu ON (cu.id_customer = o.id_customer) + LEFT JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = o.id_cart) + WHERE o.valid = 1 AND c.date_add >= DATE_SUB(CURDATE(),INTERVAL 7 DAY) AND o.id_cart NOT IN + ('.join(',', $this->getLogsEmail(2)).')'); + + if ($count OR !sizeof($emails)) + return sizeof($emails); + + $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_2', 'PS_FOLLOW_UP_DAYS_2')); + foreach ($emails AS $email) + { + $voucher = $this->createDiscount(2, (float)($conf['PS_FOLLOW_UP_AMOUNT_2']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_2']).' day')), $this->l('Thank you for your order.')); + if ($voucher !== false) + { + $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_2'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_2'], '{voucher_num}' => $voucher->name); + $result = Mail::Send((int)($email['id_lang']), 'followup_2', Mail::l('Thanks for your order'), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); + $this->logEmail(2, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); + } + } + } + + /* For all customers with more than x euros in 90 days */ + private function bestCustomer($count = false) + { + $emails = Db::getInstance()->ExecuteS(' + SELECT SUM(o.total_paid) total, c.id_cart, c.id_lang, cu.id_customer, cu.firstname, cu.lastname, cu.email + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'customer cu ON (cu.id_customer = o.id_customer) + LEFT JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = o.id_cart) + WHERE o.valid = 1 AND DATE_SUB(CURDATE(),INTERVAL 90 DAY) <= o.date_add AND cu.id_customer NOT IN + ('.join(',', $this->getLogsEmail(3)).') + GROUP BY o.id_customer + HAVING total >= '.(float)(Configuration::get('PS_FOLLOW_UP_THRESHOLD_3'))); + + if ($count OR !sizeof($emails)) + return sizeof($emails); + + $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_3', 'PS_FOLLOW_UP_DAYS_3')); + foreach ($emails AS $email) + { + $voucher = $this->createDiscount(3, (float)($conf['PS_FOLLOW_UP_AMOUNT_3']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_3']).' day')), $this->l('You are one of our best customers!')); + if ($voucher !== false) + { + $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_3'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_3'], '{voucher_num}' => $voucher->name); + $result = Mail::Send((int)($email['id_lang']), 'followup_3', Mail::l('You are one of our best customers'), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); + $this->logEmail(3, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); + } + } + } + + /* For all customers with no orders since more than x days */ + + /** + * badCustomer send mails to all customers with no orders since more than x days, + * with at least one valid order in history + * + * @param boolean $count if set to true, will return number of customer (default : false, will send mails, no return value) + * @return void + */ + private function badCustomer($count = false) + { + $emails = Db::getInstance()->ExecuteS(' + SELECT c.id_lang, c.id_cart, cu.id_customer, cu.firstname, cu.lastname, cu.email, (SELECT COUNT(o.id_order) FROM '._DB_PREFIX_.'orders o WHERE o.id_customer = cu.id_customer and o.valid = 1) nb_orders + FROM '._DB_PREFIX_.'customer cu + LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_customer = cu.id_customer) + LEFT JOIN '._DB_PREFIX_.'cart c ON (c.id_cart = o.id_cart) + WHERE cu.id_customer NOT IN + (SELECT o.id_customer FROM '._DB_PREFIX_.'orders o WHERE DATE_SUB(CURDATE(),INTERVAL '.(int)(Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')).' DAY) <= o.date_add) + AND cu.id_customer NOT IN + ('.join(',',$this->getLogsEmail(4)).') + GROUP BY cu.id_customer + HAVING nb_orders >= 1'); + + if ($count OR !sizeof($emails)) + return sizeof($emails); + + $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_AMOUNT_4', 'PS_FOLLOW_UP_DAYS_4')); + foreach ($emails AS $email) + { + $voucher = $this->createDiscount(4, (float)($conf['PS_FOLLOW_UP_AMOUNT_4']), (int)($email['id_customer']), strftime('%Y-%m-%d', strtotime('+'.(int)($conf['PS_FOLLOW_UP_DAYS_4']).' day')), $this->l('We miss you!')); + if ($voucher !== false) + { + $templateVars = array('{email}' => $email['email'], '{lastname}' => $email['lastname'], '{firstname}' => $email['firstname'], '{amount}' => $conf['PS_FOLLOW_UP_AMOUNT_4'], '{days}' => $conf['PS_FOLLOW_UP_DAYS_4'], '{days_threshold}' => (int)(Configuration::get('PS_FOLLOW_UP_DAYS_THRESHOLD_4')), '{voucher_num}' => $voucher->name); + $result = Mail::Send((int)($email['id_lang']), 'followup_4', Mail::l('We miss you'), $templateVars, $email['email'], $email['firstname'].' '.$email['lastname'], NULL, NULL, NULL, NULL, dirname(__FILE__).'/mails/'); + $this->logEmail(4, (int)($voucher->id), (int)($email['id_customer']), (int)($email['id_cart'])); + } + } + } + + private function createDiscount($id_email_type, $amount, $id_customer, $dateValidity, $description) + { + $discount = new Discount(); + $discount->id_discount_type = 1; + $discount->value = (float)($amount); + $discount->id_customer = (int)($id_customer); + $discount->date_to = $dateValidity; + $discount->date_from = date('Y-m-d H:i:s'); + $discount->quantity = 1; + $discount->quantity_per_user = 1; + $discount->cumulable = 0; + $discount->cumulable_reduction = 1; + $discount->minimal = 0; + + $languages = Language::getLanguages(true); + foreach ($languages AS $language) + $discount->description[(int)($language['id_lang'])] = $description; + + $name = 'FLW-'.(int)($id_email_type).'-'.strtoupper(Tools::passwdGen(10)); + $discount->name = $name; + $discount->active = 1; + $result = $discount->add(); + + if (!$result) + return false; + return $discount; + } + + public function cronTask() + { + $conf = Configuration::getMultiple(array('PS_FOLLOW_UP_ENABLE_1', 'PS_FOLLOW_UP_ENABLE_2', 'PS_FOLLOW_UP_ENABLE_3', 'PS_FOLLOW_UP_ENABLE_4', 'PS_FOLLOW_UP_CLEAN_DB')); + + if ($conf['PS_FOLLOW_UP_ENABLE_1']) + $this->cancelledCart(); + if ($conf['PS_FOLLOW_UP_ENABLE_2']) + $this->reOrder(); + if ($conf['PS_FOLLOW_UP_ENABLE_3']) + $this->bestCustomer(); + if ($conf['PS_FOLLOW_UP_ENABLE_4']) + $this->badCustomer(); + + /* Clean-up database by deleting all outdated discounts */ + if ($conf['PS_FOLLOW_UP_CLEAN_DB'] == 1) + { + $outdatedDiscounts = Db::getInstance()->ExecuteS('SELECT id_discount FROM '._DB_PREFIX_.'discount WHERE date_to < NOW()'); + foreach ($outdatedDiscounts AS $outdatedDiscount) + { + $discount = new Discount((int)($outdatedDiscount['id_discount'])); + if (Validate::isLoadedObject($discount)) + $discount->delete(); + } + } + } +} + diff --git a/modules/followup/fr.php b/modules/followup/fr.php new file mode 100644 index 000000000..0604893cc --- /dev/null +++ b/modules/followup/fr.php @@ -0,0 +1,44 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{followup}prestashop>followup_9c34e90380dac7b56fdd19192a99d531'] = 'Relancez vos clients'; +$_MODULE['<{followup}prestashop>followup_57476355fcd04050bff196ae9aa4673c'] = 'Relancez vos clients grâce à des envoi d\'e-mails quotidiens'; +$_MODULE['<{followup}prestashop>followup_f71a41841c80c2ef0ec02a6ad5449c65'] = 'Etes-vous sûr de vouloir supprimer vos paramètres ainsi que vos statistiques liées aux relances ?'; +$_MODULE['<{followup}prestashop>followup_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{followup}prestashop>followup_599fac49ffe947cd0f9e934e6af89879'] = 'Quatre types de relances afin de rester en contact avec vos clients !'; +$_MODULE['<{followup}prestashop>followup_8b1aa589b33a54906ae78f5820eab42c'] = 'Effectuez vos réglages et ajoutez cette URL à votre crontab ou appelez-la manuellement chaque jour :'; +$_MODULE['<{followup}prestashop>followup_b547c073d144a57761d1d00d0b9d9f27'] = 'Paniers annulés'; +$_MODULE['<{followup}prestashop>followup_ea9dc62a0ddf4640f019f04a22ab9835'] = 'Pour chaque panier abandonné (sans commande), génère un bon d\'achat et l\'envoi au client'; +$_MODULE['<{followup}prestashop>followup_2faec1f9f8cc7f8f40d521c4dd574f49'] = 'Activé'; +$_MODULE['<{followup}prestashop>followup_b30690be173bcd4a83df0cd68f89a385'] = 'Montant de la remise'; +$_MODULE['<{followup}prestashop>followup_2018945d252b94aeb99b0909f288717c'] = 'Durée de validité'; +$_MODULE['<{followup}prestashop>followup_225e75c29d32392d311f5dc94c792384'] = 'jour(s)'; +$_MODULE['<{followup}prestashop>followup_79645190f574ce5b72b89f4122107b72'] = 'Le prochain envoi transmettra :'; +$_MODULE['<{followup}prestashop>followup_46e89640babbc6a0e52599a92a6c13b4'] = 'e-mails'; +$_MODULE['<{followup}prestashop>followup_1ec5f5ec77c51a968271b2ca9862907d'] = 'e-mail'; +$_MODULE['<{followup}prestashop>followup_a8b8dbd070a92fb8b17baab71d8d633f'] = 'Re-commander'; +$_MODULE['<{followup}prestashop>followup_895858cf10b8a1750a42875cb9c69092'] = 'Pour chaque commande validée, génère un bon d\'achat et l\'envoi au client'; +$_MODULE['<{followup}prestashop>followup_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Meilleurs clients'; +$_MODULE['<{followup}prestashop>followup_a46ad892f7f00e051cc90050ff2e1ddf'] = 'Pour chaque client dont le total des commandes atteind un certain seuil, génère un bon d\'achat et l\'envoi au client'; +$_MODULE['<{followup}prestashop>followup_2a63f555989152ba866b43a1faacd680'] = 'Seuil'; +$_MODULE['<{followup}prestashop>followup_7d75b7b0f976b3091f490864c6ffbf97'] = 'Mauvais clients'; +$_MODULE['<{followup}prestashop>followup_e552313de5ebebdafa8bfa0dcc703e19'] = 'Pour chaque client ayant déjà passé commande au moins une fois et sans commande depuis une certaine durée, génère un bon d\'achat et l\'envoi au client'; +$_MODULE['<{followup}prestashop>followup_d82843c16839bfb05827d1912d89c917'] = 'Depuis x jours'; +$_MODULE['<{followup}prestashop>followup_3fb7b0bbf0c95bba3ed2ba0b147ca588'] = 'Supprimer les bons d\'achat dont la date d\'expiration est dépassée afin de nettoyer la base de données'; +$_MODULE['<{followup}prestashop>followup_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{followup}prestashop>followup_c33e404a441c6ba9648f88af3c68a1ca'] = 'Statistiques'; +$_MODULE['<{followup}prestashop>followup_1deaabda093f617a57f732c07e635fac'] = 'Statistiques détaillées sur les 30 derniers jours :'; +$_MODULE['<{followup}prestashop>followup_f23b0eec6c25c49afa4b29c57e671728'] = 'E = Nombre d\'e-mails envoyés'; +$_MODULE['<{followup}prestashop>followup_fde0b9a66bffdd6ee0886613e8031d9a'] = 'U = Nombre de bons d\'achat utilisés (commandes valides uniquement)'; +$_MODULE['<{followup}prestashop>followup_cceb59e78d00c10436ff5e777dd5d895'] = '% = Taux de transformation'; +$_MODULE['<{followup}prestashop>followup_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{followup}prestashop>followup_5e53dfa887dfb989f0bc3e9fb9b34a2d'] = 'Meilleurs clients'; +$_MODULE['<{followup}prestashop>followup_66ff4e89c767ab0a4e5ddc0251a101bc'] = 'Mauvais clients'; +$_MODULE['<{followup}prestashop>followup_5dbc98dcc983a70728bd082d1a47546e'] = 'E'; +$_MODULE['<{followup}prestashop>followup_4c614360da93c0a041b22e537de151eb'] = 'U'; +$_MODULE['<{followup}prestashop>followup_85b6769250887ba6c16099596c75164d'] = 'Aucune donnée enregistrée pour l\'instant'; +$_MODULE['<{followup}prestashop>followup_edf9feeab43a7623f6afc152d1ede515'] = 'Bon de réduction pour votre panier abandonné'; +$_MODULE['<{followup}prestashop>followup_a053fc9952a7dfc79282eba56ab8ad3a'] = 'Merci pour votre commande'; +$_MODULE['<{followup}prestashop>followup_7fcd592dd47028c7c1f2d0ce9168a303'] = 'Vous êtes l\'un de nos meilleurs clients'; +$_MODULE['<{followup}prestashop>followup_c2ab23672d4bb31c7664bf8e854a10f7'] = 'Vous nous manquez'; diff --git a/modules/followup/it.php b/modules/followup/it.php new file mode 100644 index 000000000..d93aa45b9 --- /dev/null +++ b/modules/followup/it.php @@ -0,0 +1,46 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{followup}prestashop>followup_9c34e90380dac7b56fdd19192a99d531'] = 'Follow-up clienti'; +$_MODULE['<{followup}prestashop>followup_57476355fcd04050bff196ae9aa4673c'] = 'Segui i tuoi clienti con e-mail quotidiane personalizzate'; +$_MODULE['<{followup}prestashop>followup_f71a41841c80c2ef0ec02a6ad5449c65'] = 'Sei sicuro di voler eliminare tutte le impostazioni ed i registri?'; +$_MODULE['<{followup}prestashop>followup_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{followup}prestashop>followup_599fac49ffe947cd0f9e934e6af89879'] = 'Quattro tipi di avvisi via e-mail per rimanere in contatto con i tuoi clienti!'; +$_MODULE['<{followup}prestashop>followup_8b1aa589b33a54906ae78f5820eab42c'] = 'Definire le impostazioni e mettere questo URL nel crontab o chiamare ogni giorno:'; +$_MODULE['<{followup}prestashop>followup_b547c073d144a57761d1d00d0b9d9f27'] = 'Carrelli cancellati'; +$_MODULE['<{followup}prestashop>followup_ea9dc62a0ddf4640f019f04a22ab9835'] = 'Per ogni carrello annullato (senza ordine), genera uno sconto e invialo al cliente'; +$_MODULE['<{followup}prestashop>followup_2faec1f9f8cc7f8f40d521c4dd574f49'] = 'Attiva'; +$_MODULE['<{followup}prestashop>followup_b30690be173bcd4a83df0cd68f89a385'] = 'Importo sconto'; +$_MODULE['<{followup}prestashop>followup_2018945d252b94aeb99b0909f288717c'] = 'Validità sconto'; +$_MODULE['<{followup}prestashop>followup_225e75c29d32392d311f5dc94c792384'] = 'giorno (i)'; +$_MODULE['<{followup}prestashop>followup_79645190f574ce5b72b89f4122107b72'] = 'La prossima elaborazione invierà:'; +$_MODULE['<{followup}prestashop>followup_46e89640babbc6a0e52599a92a6c13b4'] = 'e-mail'; +$_MODULE['<{followup}prestashop>followup_1ec5f5ec77c51a968271b2ca9862907d'] = 'e-mail'; +$_MODULE['<{followup}prestashop>followup_a8b8dbd070a92fb8b17baab71d8d633f'] = 'Riordino'; +$_MODULE['<{followup}prestashop>followup_895858cf10b8a1750a42875cb9c69092'] = 'Per ogni ordine convalidato, genera uno sconto e invialo al cliente'; +$_MODULE['<{followup}prestashop>followup_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Migliori clienti'; +$_MODULE['<{followup}prestashop>followup_a46ad892f7f00e051cc90050ff2e1ddf'] = 'Per ogni cliente che aumenta una soglia, genera uno sconto e invialo al cliente'; +$_MODULE['<{followup}prestashop>followup_2a63f555989152ba866b43a1faacd680'] = 'Soglia'; +$_MODULE['<{followup}prestashop>followup_7d75b7b0f976b3091f490864c6ffbf97'] = 'Cattivi clienti'; +$_MODULE['<{followup}prestashop>followup_e552313de5ebebdafa8bfa0dcc703e19'] = 'Per ogni cliente che ha già inviato almeno un ordine e senza ordini da un periodo dato, genera uno sconto e invialo al cliente'; +$_MODULE['<{followup}prestashop>followup_d82843c16839bfb05827d1912d89c917'] = 'Da x giorni'; +$_MODULE['<{followup}prestashop>followup_3fb7b0bbf0c95bba3ed2ba0b147ca588'] = 'Elimina sconti scaduti nel corso di ogni lancio per la pulizia del database'; +$_MODULE['<{followup}prestashop>followup_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{followup}prestashop>followup_c33e404a441c6ba9648f88af3c68a1ca'] = 'Statistiche'; +$_MODULE['<{followup}prestashop>followup_1deaabda093f617a57f732c07e635fac'] = 'Statistiche dettagliate per ultimi 30 giorni:'; +$_MODULE['<{followup}prestashop>followup_f23b0eec6c25c49afa4b29c57e671728'] = 'S = numero di e-mail inviate'; +$_MODULE['<{followup}prestashop>followup_fde0b9a66bffdd6ee0886613e8031d9a'] = 'U = Numero di sconti usati (solo ordini validi)'; +$_MODULE['<{followup}prestashop>followup_cceb59e78d00c10436ff5e777dd5d895'] = '% = Tasso di conversione'; +$_MODULE['<{followup}prestashop>followup_44749712dbec183e983dcd78a7736c41'] = 'Data'; +$_MODULE['<{followup}prestashop>followup_5e53dfa887dfb989f0bc3e9fb9b34a2d'] = 'Miglior cliente'; +$_MODULE['<{followup}prestashop>followup_66ff4e89c767ab0a4e5ddc0251a101bc'] = 'Catt. cliente'; +$_MODULE['<{followup}prestashop>followup_5dbc98dcc983a70728bd082d1a47546e'] = 'S'; +$_MODULE['<{followup}prestashop>followup_4c614360da93c0a041b22e537de151eb'] = 'U'; +$_MODULE['<{followup}prestashop>followup_85b6769250887ba6c16099596c75164d'] = 'Nessuna statistica ancora'; +$_MODULE['<{followup}prestashop>followup_edf9feeab43a7623f6afc152d1ede515'] = 'Sconto per il carrello annullato'; +$_MODULE['<{followup}prestashop>followup_a053fc9952a7dfc79282eba56ab8ad3a'] = 'Grazie per il vostro ordine'; +$_MODULE['<{followup}prestashop>followup_7fcd592dd47028c7c1f2d0ce9168a303'] = 'Sei uno dei nostri migliori clienti'; +$_MODULE['<{followup}prestashop>followup_c2ab23672d4bb31c7664bf8e854a10f7'] = 'Ci manchi'; + +?> \ No newline at end of file diff --git a/modules/followup/logo-2.gif b/modules/followup/logo-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..9102f3a81eb460fa1d0bc3884a025db0bbf658af GIT binary patch literal 606 zcmZ?wbhEHb6krfwc*ejWpt=9EjYIVEK+EdeLI#J67r)TXQTsP#($vE<t8^<Q6EFTN z$dPg^>DlzEXk$gpqzC`jt^St~<J@Jl;^Nv_yWeRR-|*?U+q9=s)cb7as{DV87ygKf zN}KhpY0Zm&wH5WwZHvz?{}vDwvcTtGURL(*c&nP5|F&(mt~XhKb<5HtA6%O6PuM?M z#OdV!nKLJEd#m7CnKbQT!ul}TtZV;D3nTjOe|7V$TK2rgyl(c1`M;8re5SfoZma*- zQ2j3=RM_&UQK{~~P3y%&&KImN`@eRnXX~A`t<hO?o&|N^`&UttJmp!>+GqcEZQpWp z=js!mrtE#+z3KJRz3&yBivOpjIn>{(HmY8Aaov<d)90RCShKz9UrWQk*r@;i|1;1L zDE?$&WM_zG&;i*AiW3I*-3`%A%`L5MtQ~G{{B13)zM2!=dz)o6_54M&rZn*f_{-`s zw|Xq)=5`m6HRBas;_a>GprvQVDr?lrtrlq`!0g{;#?`9qAm`yMDr;cC>Zsys$fRT` zV9YILWX5meCgJ0wA#5e>tgI}>#p*6*praukp&+CvWhtoZ=;q?WZx>o-aiDNf8=I~z zUqXZ7QWjn&g_abD56TYR%o33$iwju}Ow|qxllbxBA=^|IyBYz81D}p^vl&>La<MR2 F0{|ZS)kXjS literal 0 HcmV?d00001 diff --git a/modules/followup/logo.gif b/modules/followup/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2194c59dbdfb95ed058b5a8a7c7ebbd580f939c8 GIT binary patch literal 587 zcmZ?wbhEHb6krfwc*ejGVkl6u=!|vw8msi_ch@&8&(?W$X4RHS<uyL)E0!)gkro@$ zzWu?|SCe<#D7EHU>g$u;wc_2`WfKa67S<<DU3W5K!oeroI$fH!RVS9sn>O)OxmKl} z@Z!RdmbI7XrRrRW^7JZSl3>ced+XstlhV>=9uMx_zy8#t*O#|BR;@c(uJ?9(?TaJx zK7Rd~)3-i<($1b$$GtoEo?TG9CDy6kgFnMU==+s*^Y`A^ykXtkO{d~4L|$zwFKC>4 zzR|eYT+q67MMa?5rFj3iiiM8#n=6){`*CKrSM$~v=Qpoyj99w=#{1n(8M9A3e(`o@ zML@ib)Z3GbY%12Ct5Of|*;}{j;<xil=I*-_Wg=K(%NsrEaGwYN>ZJ=K+P5{h@V&pj z=l#}}zSXC)odg!`ybxg_{p{M-+<B)MXaE#{vM{nU=l~%QfZ~LKeMN&#Q*%peTcmUt zpNV8!vpI*caWtPVXP=IJ1m7G!MTQx+>|)BHmWd1c<YN4^4O!G#X9x?j1qZVUy3f!R zaxpax_7UjQ*D$k|F>*9>ifi@Ia0)R{;&PQ0)evb;2v-vq=azRca54xAv}g*ja+VE> z;+Jp@S5?u{eB-Ig>&&Rv(i3=Tp@$G}lb?g8;u7XP+<bvQ9wfG05E9Usmr?U5nSt3y Kft8hs!5RR_-PjQT literal 0 HcmV?d00001 diff --git a/modules/followup/mails/de/followup_1.html b/modules/followup/mails/de/followup_1.html new file mode 100644 index 000000000..4901905f0 --- /dev/null +++ b/modules/followup/mails/de/followup_1.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihr Warenkorb bei {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Uns ist aufgefallen, dass Sie bei Ihrem letzten Besuch auf {shop_name}&nbsp;Ihre Bestellung nicht abgeschlossen haben.<br /><br />Ihr Warenkorb wurde gespeichert, Sie k&ouml;nnen Ihre Bestellung abschlie&szlig;en, indem Sie auf unsere Shop-Seite gehen:<br /><br /><a title="{shop_name}" href="{shop_url}">{shop_url}</a><br /><br />Als Anreiz erhalten Sie einen Rabatt &uuml;ber {amount}% auf Ihre n&auml;chste Bestellung! Dieses Angebot gilt nur noch {days} Tage, also warten Sie nicht l&auml;nger!</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hier ist Ihr Gutschein: <strong>{voucher_num}</strong><br /><br />Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/de/followup_1.txt b/modules/followup/mails/de/followup_1.txt new file mode 100644 index 000000000..119052799 --- /dev/null +++ b/modules/followup/mails/de/followup_1.txt @@ -0,0 +1,11 @@ +Uns ist aufgefallen, dass Sie bei Ihrem letzten Besuch auf {shop_name} Ihre Bestellung nicht abgeschlossen haben. + +Ihr Warenkorb wurde gespeichert, Sie können Ihre Bestellung abschließen, indem Sie auf unsere Shop-Seite gehen: + +{shop_url} + +Als Anreiz erhalten Sie einen Rabatt über {amount}% auf Ihre nächste Bestellung! Dieses Angebot gilt nur noch {days} Tage, also warten Sie nicht länger! + +Hier ist Ihr Gutschein: {voucher_num} + +Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten. \ No newline at end of file diff --git a/modules/followup/mails/de/followup_2.html b/modules/followup/mails/de/followup_2.html new file mode 100644 index 000000000..96db35370 --- /dev/null +++ b/modules/followup/mails/de/followup_2.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Danke f&uuml;r Ihre Bestellung bei {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Als Dankesch&ouml;n m&ouml;chten wir Ihnen einen Rabatt &uuml;ber {amount}% auf Ihre n&auml;chste Bestellung geben! Dieses Angebot gilt nur noch {days} Tage, also warten Sie nicht l&auml;nger!<br /><br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hier ist Ihr Gutschein: <strong>{voucher_num}</strong><br /><br />Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/de/followup_2.txt b/modules/followup/mails/de/followup_2.txt new file mode 100644 index 000000000..1d49330bc --- /dev/null +++ b/modules/followup/mails/de/followup_2.txt @@ -0,0 +1,10 @@ +Hallo {firstname} {lastname}, + +Danke für Ihre Bestellung bei {shop_name} + +Als Dankeschön möchten wir Ihnen einen Rabatt über {amount}% auf Ihre nächste Bestellung geben! Dieses Angebot gilt nur noch {days} Tage, also warten Sie nicht länger! + + +Hier ist Ihr Gutschein: {voucher_num} + +Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten. \ No newline at end of file diff --git a/modules/followup/mails/de/followup_3.html b/modules/followup/mails/de/followup_3.html new file mode 100644 index 000000000..5c2d38561 --- /dev/null +++ b/modules/followup/mails/de/followup_3.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Danke f&uuml;r Ihr Vertrauen</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie sind einer unserer besten Kunden, desshalb m&ouml;chten wir Ihnen f&uuml;r Ihr Vertrauen danken.<br /><br />Als Anerkennung f&uuml;r Ihre Treue m&ouml;chten wir Ihnen einen Rabatt &uuml;ber {amount}% f&uuml;r Ihre n&auml;chste Bestellung geben! Dieses Angebot gilt nur noch {days}, Tage, also warten Sie nicht l&auml;nger!</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"> +<p>Hier ist Ihr Gutschein: <strong>{voucher_num}</strong></p> +<p><strong>&nbsp;</strong><br />Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten.</p> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/de/followup_3.txt b/modules/followup/mails/de/followup_3.txt new file mode 100644 index 000000000..25e2bdf36 --- /dev/null +++ b/modules/followup/mails/de/followup_3.txt @@ -0,0 +1,9 @@ +Hallo {firstname} {lastname}, + +Sie sind einer unserer besten Kunden, desshalb möchten wir Ihnen für Ihr Vertrauen danken. + +Als Anerkennung für Ihre Treue möchten wir Ihnen einen Rabatt über {amount}% für Ihre nächste Bestellung geben! Dieses Angebot gilt nur noch {days}, Tage, also warten Sie nicht länger! + +Hier ist Ihr Gutschein: {voucher_num} + +Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten. \ No newline at end of file diff --git a/modules/followup/mails/de/followup_4.html b/modules/followup/mails/de/followup_4.html new file mode 100644 index 000000000..76f0e9c2f --- /dev/null +++ b/modules/followup/mails/de/followup_4.html @@ -0,0 +1,48 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Nachricht von {shop_name}</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hallo <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Ihr Warenkorb bei {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie sind einer unserer besten Kunden, seit {days_threshold} Tagen haben Sie nichts mehr bestellt.<br /><br />Wir m&ouml;chten Ihnen f&uuml;r Ihr Vertrauen danken und Ihnen einen Rabatt &uuml;ber {amount}% f&uuml;r Ihre n&auml;chste Bestellung geben! Dieses Angebot gilt nur noch {days} days, Tage, also warten Sie nicht l&auml;nger!</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hier ist Ihr Gutschein: <strong>{voucher_num}</strong><br /><br /> +<p>Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten.</p> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/de/followup_4.txt b/modules/followup/mails/de/followup_4.txt new file mode 100644 index 000000000..662e42515 --- /dev/null +++ b/modules/followup/mails/de/followup_4.txt @@ -0,0 +1,11 @@ +Wir vermissen Sie bei {shop_name} + +Hallo {firstname} {lastname}, + +Sie sind einer unserer besten Kunden, seit {days_threshold} Tagen haben Sie nichts mehr bestellt. + +Wir möchten Ihnen für Ihr Vertrauen danken und Ihnen einen Rabatt über {amount}% für Ihre nächste Bestellung geben! Dieses Angebot gilt nur noch {days} days, Tage, also warten Sie nicht länger! + +Hier ist Ihr Gutschein: {voucher_num} + +Geben Sie diesen Code in Ihrem Warenkorb-Fenster ein, um Ihren Rabatt zu erhalten. diff --git a/modules/followup/mails/en/followup_1.html b/modules/followup/mails/en/followup_1.html new file mode 100644 index 000000000..b5d2fb98c --- /dev/null +++ b/modules/followup/mails/en/followup_1.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your cart at {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + We noticed that during your last visit on {shop_name}, you did not validate the order you had started.<br /><br /> + + Your cart has been saved, you can resume your order by visiting our shop:<br /><br /> + + <a href="{shop_url}" title="{shop_name}">{shop_url}</a><br /><br /> + + As an incentive, we can give you a discount of {amount}% off your next order! This offer is valid for {days} days, so do not waste a moment! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Here is your coupon: <b>{voucher_num}</b><br /><br /> + Enter this code in your shopping cart to get your discount. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/en/followup_1.txt b/modules/followup/mails/en/followup_1.txt new file mode 100644 index 000000000..b5348d858 --- /dev/null +++ b/modules/followup/mails/en/followup_1.txt @@ -0,0 +1,13 @@ +Hello {firstname} {lastname}, + +We noticed that during your last visit on {shop_name}, you did not validate the order you had started. + +Your cart has been saved, you can resume your order by visiting our shop: + +{shop_url} + +As an incentive, we can give you a discount of {amount}% off your next order! This offer is valid for {days} days, so do not waste a moment! + +Here is your coupon: {voucher_num} + +Enter this code in your shopping cart to get your discount. \ No newline at end of file diff --git a/modules/followup/mails/en/followup_2.html b/modules/followup/mails/en/followup_2.html new file mode 100644 index 000000000..3b2ba23e4 --- /dev/null +++ b/modules/followup/mails/en/followup_2.html @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Thank you for your order at {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + By way of saying thanks, we want to give you a discount of {amount}% off your next order! This offer is valid for {days} days, so do not waste a moment!<br /><br /> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Here is your coupon: <b>{voucher_num}</b><br /><br /> + Enter this code in your shopping cart to get your discount. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/en/followup_2.txt b/modules/followup/mails/en/followup_2.txt new file mode 100644 index 000000000..c7d921f41 --- /dev/null +++ b/modules/followup/mails/en/followup_2.txt @@ -0,0 +1,9 @@ +Hello {firstname} {lastname}, + +Thank you for your order at {shop_name} + +By way of saying thanks, we want to give you a discount of {amount}% off your next order! This offer is valid for {days} days, so do not waste a moment! + +Here is your coupon: {voucher_num} + +Enter this code in your shopping cart to get your discount. \ No newline at end of file diff --git a/modules/followup/mails/en/followup_3.html b/modules/followup/mails/en/followup_3.html new file mode 100644 index 000000000..fb8211645 --- /dev/null +++ b/modules/followup/mails/en/followup_3.html @@ -0,0 +1,45 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Thanks for your trust</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You are one of our best customers and as such we want to thank you for the confidence you share.<br /><br /> + + As appreciation for your loyalty, we want to give you a discount of {amount}% valid on your next order! This offer is valid for {days} days, so do not waste a moment! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Here is your coupon: <b>{voucher_num}</b><br /><br /> + Enter this code in your shopping cart to get your discount. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/en/followup_3.txt b/modules/followup/mails/en/followup_3.txt new file mode 100644 index 000000000..97ff24261 --- /dev/null +++ b/modules/followup/mails/en/followup_3.txt @@ -0,0 +1,9 @@ +Hello {firstname} {lastname}, + +You are one of our best customers and as such we want to thank you for the confidence you share. + +As appreciation for your loyalty, we want to give you a discount of {amount}% valid on your next order! This offer is valid for {days} days, so do not waste a moment! + +Here is your coupon: {voucher_num} + +Enter this code in your shopping cart to get your discount. \ No newline at end of file diff --git a/modules/followup/mails/en/followup_4.html b/modules/followup/mails/en/followup_4.html new file mode 100644 index 000000000..96ca99706 --- /dev/null +++ b/modules/followup/mails/en/followup_4.html @@ -0,0 +1,45 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message from {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Hi <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Your cart at {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + You are one of our best customers, however you have not ordered for {days_threshold} days.<br /><br /> + + We wish to thank you for the trust you have placed in us and want to give you a discount of {amount}% valid on your next order! This offer is valid for {days} days, so do not waste a moment! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Here is your coupon: <b>{voucher_num}</b><br /><br /> + Enter this code in your shopping cart to get your discount. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/en/followup_4.txt b/modules/followup/mails/en/followup_4.txt new file mode 100644 index 000000000..c1fbdb160 --- /dev/null +++ b/modules/followup/mails/en/followup_4.txt @@ -0,0 +1,11 @@ +We miss you at {shop_name} + +Hello {firstname} {lastname}, + +You are one of our best customers, however you have not ordered for {days_threshold} days. + +We wish to thank you for the trust you have placed in us and want to give you a discount of {amount}% valid on your next order! This offer is valid for {days} days, so do not waste a moment! + +Here is your coupon: {voucher_num} + +Enter this code in your shopping cart to get your discount. \ No newline at end of file diff --git a/modules/followup/mails/es/followup_1.html b/modules/followup/mails/es/followup_1.html new file mode 100644 index 000000000..fd10b7d59 --- /dev/null +++ b/modules/followup/mails/es/followup_1.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Su cesta de {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Nos dimos cuenta de que durante su &uacute;ltima visita en {shop_name}, que no ha validado la orden que hab&iacute;a comenzado.<br /><br />Su carrito ha sido guardado, puede reanudar su solicitud por visitar nuestra tienda:<br /><br /><a title="{shop_name}" href="{shop_url}">{shop_url}</a><br /><br />Como excepci&oacute;n, le ofrecemos un descuento del {amount}% de descuento en su pr&oacute;ximo pedido! Esta oferta es v&aacute;lida para {days} d&iacute;as, as&iacute; que no pierdas un instante!</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Aqu&iacute; est&aacute; tu cup&oacute;n: <strong>{voucher_num}</strong><br /><br />Introduzca este c&oacute;digo en tu carrito de compras para obtener el descuento.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/es/followup_1.txt b/modules/followup/mails/es/followup_1.txt new file mode 100644 index 000000000..e69de29bb diff --git a/modules/followup/mails/es/followup_2.html b/modules/followup/mails/es/followup_2.html new file mode 100644 index 000000000..af026cee2 --- /dev/null +++ b/modules/followup/mails/es/followup_2.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Gracias por su orden en {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Con car&aacute;cter excepcional, le concedemos un descuento de {amount}% fuera de su pr&oacute;ximo pedido! Esta oferta es v&aacute;lida para {days} d&iacute;as, as&iacute; que no pierdas un instante!<br /><br /></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Aqu&iacute; est&aacute; tu cup&oacute;n: <strong>{voucher_num}</strong><br /><br />Introduzca este c&oacute;digo en tu carrito de compras para obtener el descuento.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/es/followup_2.txt b/modules/followup/mails/es/followup_2.txt new file mode 100644 index 000000000..e69de29bb diff --git a/modules/followup/mails/es/followup_3.html b/modules/followup/mails/es/followup_3.html new file mode 100644 index 000000000..9b3b1d8e6 --- /dev/null +++ b/modules/followup/mails/es/followup_3.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Gracias por su confianza.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Usted es parte de nuestros mejores clientes y, como tal, queremos darle las gracias por la confianza que comparten.<br /><br />Como excepci&oacute;n, le concedemos un descuento de {amount}% v&aacute;lido en su pr&oacute;ximo pedido! Esta oferta es v&aacute;lida para {days} d&iacute;as, as&iacute; que no pierdas un instante!</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Aqu&iacute; est&aacute; tu cup&oacute;n: <strong>{voucher_num}</strong><br /><br />Introduzca este c&oacute;digo en tu carrito de compras para obtener el descuento.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/es/followup_3.txt b/modules/followup/mails/es/followup_3.txt new file mode 100644 index 000000000..e69de29bb diff --git a/modules/followup/mails/es/followup_4.html b/modules/followup/mails/es/followup_4.html new file mode 100644 index 000000000..49e090d1b --- /dev/null +++ b/modules/followup/mails/es/followup_4.html @@ -0,0 +1,47 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Mensaje de {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Hola <strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Su cesta de {shop_name}</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Usted es parte de nuestros mejores clientes, sin embargo, no han ordenado para {days_threshold} d&iacute;as.<br /><br />Queremos darle las gracias por la confianza que ustedes depositan en nosotros y nosotros le concedemos un descuento de {amount}% v&aacute;lido en su pr&oacute;ximo pedido! Esta oferta es v&aacute;lida para {days} d&iacute;as, as&iacute; que no pierdas un instante!</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Aqu&iacute; est&aacute; tu cup&oacute;n: <strong>{voucher_num}</strong><br /><br />Introduzca este c&oacute;digo en tu carrito de compras para obtener el descuento.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/es/followup_4.txt b/modules/followup/mails/es/followup_4.txt new file mode 100644 index 000000000..e69de29bb diff --git a/modules/followup/mails/fr/followup_1.html b/modules/followup/mails/fr/followup_1.html new file mode 100644 index 000000000..92286551e --- /dev/null +++ b/modules/followup/mails/fr/followup_1.html @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Votre panier chez {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Nous avons remarqu&eacute; que lors de votre dernier passage chez {shop_name}, vous n'avez pas valid&eacute; la commande que vous aviez entam&eacute;e.<br /><br /> + + Vous panier a &eacute;t&eacute; conserv&eacute;, vous pouvez reprendre votre commande en vous rendant sur notre boutique :<br /><br /> + + <a href="{shop_url}" title="{shop_name}">{shop_url}</a><br /><br /> + + A titre exceptionnel, nous vous accordons &eacute;galement une remise de {amount}% sur votre commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Voici votre bon de r&eacute;duction : <b>{voucher_num}</b><br /><br /> + Saisissez ce code dans votre panier afin d'obtenir votre r&eacute;duction. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_1.txt b/modules/followup/mails/fr/followup_1.txt new file mode 100644 index 000000000..57706b9b1 --- /dev/null +++ b/modules/followup/mails/fr/followup_1.txt @@ -0,0 +1,9 @@ +Bonjour {firstname} {lastname}, + +Vous faites partie de nos meilleurs clients et à ce titre, nous souhaitons vous remercier pour la confiance dont vous nous faites part. + +A titre exceptionnel, nous vous accordons une remise de {amount}% valable sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + +Voici votre bon de réduction : {voucher_num} + +Saisissez ce code dans votre panier afin d'obtenir votre réduction. \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_2.html b/modules/followup/mails/fr/followup_2.html new file mode 100644 index 000000000..6865f0765 --- /dev/null +++ b/modules/followup/mails/fr/followup_2.html @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Merci pour votre commande chez {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Merci pour votre commande, &agrave; titre exceptionnel, nous vous accordons une remise de {amount}% sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Voici votre bon de r&eacute;duction : <b>{voucher_num}</b><br /><br /> + Saisissez ce code dans votre panier afin d'obtenir votre r&eacute;duction. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_2.txt b/modules/followup/mails/fr/followup_2.txt new file mode 100644 index 000000000..50c3d3cf9 --- /dev/null +++ b/modules/followup/mails/fr/followup_2.txt @@ -0,0 +1,9 @@ +Bonjour {firstname} {lastname}, + +Merci pour votre commande chez {shop_name} + +Merci pour votre commande, ? titre exceptionnel, nous vous accordons une remise de {amount}% sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + +Voici votre bon de réduction : {voucher_num} + +Saisissez ce code dans votre panier afin d'obtenir votre réduction. \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_3.html b/modules/followup/mails/fr/followup_3.html new file mode 100644 index 000000000..be167a716 --- /dev/null +++ b/modules/followup/mails/fr/followup_3.html @@ -0,0 +1,44 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{shop_name} vous remercie pour votre confiance</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous faites partie de nos meilleurs clients et &agrave; ce titre, nous souhaitons vous remercier pour la confiance dont vous nous faites part.<br /><br /> + A titre exceptionnel, nous vous accordons <b>une remise de {amount}%</b> valable sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Voici votre bon de r&eacute;duction : <b>{voucher_num}</b><br /><br /> + Saisissez ce code dans votre panier afin d'obtenir votre r&eacute;duction. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_3.txt b/modules/followup/mails/fr/followup_3.txt new file mode 100644 index 000000000..57706b9b1 --- /dev/null +++ b/modules/followup/mails/fr/followup_3.txt @@ -0,0 +1,9 @@ +Bonjour {firstname} {lastname}, + +Vous faites partie de nos meilleurs clients et à ce titre, nous souhaitons vous remercier pour la confiance dont vous nous faites part. + +A titre exceptionnel, nous vous accordons une remise de {amount}% valable sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + +Voici votre bon de réduction : {voucher_num} + +Saisissez ce code dans votre panier afin d'obtenir votre réduction. \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_4.html b/modules/followup/mails/fr/followup_4.html new file mode 100644 index 000000000..f39cb0689 --- /dev/null +++ b/modules/followup/mails/fr/followup_4.html @@ -0,0 +1,44 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Message de {shop_name}</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">Bonjour <strong style="color:#DB3484;">{firstname} {lastname}</strong>,</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Vous nous manquez chez {shop_name}</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Vous faites partie de nos meilleurs clients cependant vous n'avez pas pass&eacute; de commande depuis {days_threshold} jours.<br /><br /> + Nous souhaitons vous remercier pour la confiance dont vous nous faites part et &agrave; ce titre, nous vous accordons <b>une remise de {amount}%</b> valable sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Voici votre bon de r&eacute;duction : <b>{voucher_num}</b><br /><br /> + Saisissez ce code dans votre panier afin d'obtenir votre r&eacute;duction. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> r&eacute;alis&eacute; avec <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop&trade;</a> + </td> + </tr> + </table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/fr/followup_4.txt b/modules/followup/mails/fr/followup_4.txt new file mode 100644 index 000000000..6125a5fc0 --- /dev/null +++ b/modules/followup/mails/fr/followup_4.txt @@ -0,0 +1,9 @@ +Bonjour {firstname} {lastname}, + +Vous faites partie de nos meilleurs clients cependant vous n'avez pas pass? de commande depuis {days_threshold} jours. + +Nous souhaitons vous remercier pour la confiance dont vous nous faites part et ? ce titre, nous vous accordons une remise de {amount}% valable sur votre prochaine commande ! Cette offre est valable {days} jours, ne perdez plus un instant ! + +Voici votre bon de réduction : {voucher_num} + +Saisissez ce code dans votre panier afin d'obtenir votre réduction. \ No newline at end of file diff --git a/modules/followup/mails/it/followup_1.html b/modules/followup/mails/it/followup_1.html new file mode 100644 index 000000000..93a55701e --- /dev/null +++ b/modules/followup/mails/it/followup_1.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Il tuo carrello su {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Abbiamo notato che durante la tua ultima visita a {shop_name}, non hai convalidato un ordine che avevi iniziato.<br /><br />Il tuo carrello &egrave; stato salvato, puoi riprendere l&#039;ordine visitando il nostro negozio:<br /><br /> <a title="{shop_name}" href="{shop_url}">{shop_url}</a><br /><br />Come incentivo, possiamo offrirti uno sconto del {amount}% sul tuo prossimo ordine! Questa offerta &egrave; valida per {days} giorni, quindi approfittane subito!</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ecco il tuo buono: <strong>{voucher_num}</strong><br /><br />Inserisci questo codice nel tuo carrello per ottenere lo sconto.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/it/followup_1.txt b/modules/followup/mails/it/followup_1.txt new file mode 100644 index 000000000..71035a8b4 --- /dev/null +++ b/modules/followup/mails/it/followup_1.txt @@ -0,0 +1,13 @@ +Salve {firstname} {lastname}, + +Abbiamo notato che durante la tua ultima visita a {shop_name}, non hai convalidato un ordine che avevi iniziato. + +Il tuo carrello è stato salvato, puoi riprendere l'ordine visitando il nostro negozio: + +{shop_url} + +Come incentivo, possiamo offrirti uno sconto del {amount}% nel tuo prossimo ordine! Questa offerta è valida per {days} giorni, quindi approfittane subito! + +Ecco il tuo buono: {voucher_num} + +Inserisci questo codice nel tuo carrello per ottenere lo sconto. \ No newline at end of file diff --git a/modules/followup/mails/it/followup_2.html b/modules/followup/mails/it/followup_2.html new file mode 100644 index 000000000..f38381b11 --- /dev/null +++ b/modules/followup/mails/it/followup_2.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Grazie del tuo ordine su {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Per ringraziarti, vogliamo offrirti uno sconto del {amount}% sul tuo prossimo ordine! Questa offerta &egrave; valida per {days} giorni, quindi approfittane subito!<br /><br /></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ecco il tuo buono: <strong>{voucher_num}</strong><br /><br />Inserisci questo codice nel tuo carrello per ottenere lo sconto.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/it/followup_2.txt b/modules/followup/mails/it/followup_2.txt new file mode 100644 index 000000000..3d17fe89b --- /dev/null +++ b/modules/followup/mails/it/followup_2.txt @@ -0,0 +1,9 @@ +Salve {firstname} {lastname}, + +Grazie del tuo ordine su {shop_name} + +Per ringraziarti, vogliamo offrirti uno sconto del {amount}% sul tuo prossimo ordine! Questa offerta è valida per {days} giorni, quindi approfittane subito! + +Ecco il tuo buono: {voucher_num} + +Inserisci questo codice nel carrello per ottenere lo sconto. \ No newline at end of file diff --git a/modules/followup/mails/it/followup_3.html b/modules/followup/mails/it/followup_3.html new file mode 100644 index 000000000..12ce29b3b --- /dev/null +++ b/modules/followup/mails/it/followup_3.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Grazie della tua fiducia</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Sei uno dei nostro migliori clienti e per questo vogliamo ringraziarti per la fiducia che ci accordi.<br /><br />Come apprezzamento della tua fedelt&agrave;, vogliamo offrirti uno sconto del {amount}% valido per il tuo prossimo ordine! Questa offerta &egrave; valida per {days} giorni, quindi approfittane subito!</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ecco il tuo buono: <strong>{voucher_num}</strong><br /><br />Inserisci questo codice nel tuo carrello per ottenere lo sconto.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/it/followup_3.txt b/modules/followup/mails/it/followup_3.txt new file mode 100644 index 000000000..23dfb25ae --- /dev/null +++ b/modules/followup/mails/it/followup_3.txt @@ -0,0 +1,9 @@ +Salve {firstname} {lastname}, + +Sei uno dei nostri migliori clienti e per questo vogliamo ringraziarti per la fiducia che ci accordi. + +Come apprezzamento della tua fedeltà, vogliamo offrirti uno sconto del {amount}% valido per il tuo prossimo ordine! Questa offerta è valida per {days} giorni, quindi approfittane subito! + +Ecco il tuo buono: {voucher_num} + +Inserisci questo codice nel tuo carrello per ottenere lo sconto. \ No newline at end of file diff --git a/modules/followup/mails/it/followup_4.html b/modules/followup/mails/it/followup_4.html new file mode 100644 index 000000000..bb7997146 --- /dev/null +++ b/modules/followup/mails/it/followup_4.html @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Messaggio da {shop_name}</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Salve&nbsp;<strong style="color: #db3484;">{firstname} {lastname}</strong>,</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Il tuo carrello su {shop_name}</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Sei uno dei nostri migliori clienti, per&ograve; sono {days_threshold} giorni che non effettui un ordine.<br /><br />Vogliamo ringraziarti della fiducia che ci hai accordato e vogliamo offrirti uno sconto del {amount}% valido sul tuo prossimo ordine! Questa offerta &egrave; valida per {days} giorni, quindi approfittane subito!</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ecco il tuo buono: <strong>{voucher_num}</strong><br /><br />Inserisci questo codice nel tuo carrello per ottenere il tuo sconto.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/followup/mails/it/followup_4.txt b/modules/followup/mails/it/followup_4.txt new file mode 100644 index 000000000..8dddccf88 --- /dev/null +++ b/modules/followup/mails/it/followup_4.txt @@ -0,0 +1,11 @@ +Ci manchi a {shop_name} + +Salve {firstname} {lastname}, + +Sei uno dei nostri clienti migliori, però sono {days_threshold} giorni che non effettui un ordine. + +Vogliamo ringraziarti per la fiducia che ci hai accordato e vogliamo offrirti uno sconto del {amount}% valido sul tuo prossimo ordine! Questa offerta è valida per {days} giorni, quindi approfittane subito! + +Ecco il tuo buono: {voucher_num} + +Inserisci questo codice nel tuo carrello per ottenere il tuo sconto. \ No newline at end of file diff --git a/modules/gadsense/adsense_script.gif b/modules/gadsense/adsense_script.gif new file mode 100644 index 0000000000000000000000000000000000000000..6cef11cba866d1d1d32158350e1344795639def9 GIT binary patch literal 2456 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 W?01v-Jn)1syx|Xz_{5K;0028$KF$&V literal 0 HcmV?d00001 diff --git a/modules/gadsense/config.xml b/modules/gadsense/config.xml new file mode 100755 index 000000000..dc96fa0e2 --- /dev/null +++ b/modules/gadsense/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>gadsense</name> + <displayName><![CDATA[Google Adsense]]></displayName> + <version><![CDATA[1.1]]></version> + <description><![CDATA[Integrate Google Adsense script into your shop]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[advertising_marketing]]></tab> + <confirmUninstall>Are you sure you want to delete your details ?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/gadsense/de.php b/modules/gadsense/de.php new file mode 100644 index 000000000..3c64c8a9d --- /dev/null +++ b/modules/gadsense/de.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gadsense}prestashop>gadsense_8a41674922e424cde4dd47c91f9d62e8'] = 'Google Adsense'; +$_MODULE['<{gadsense}prestashop>gadsense_4148996483a2cfeed90c66dc539c8f1a'] = 'Sie haben Ihren Google Adsense Code noch nicht eingestellt'; +$_MODULE['<{gadsense}prestashop>gadsense_e32c2b519ed33ed45a4c0a4b1b359447'] = 'Integrieren Sie das Google Adsense Script in Ihren Shop'; +$_MODULE['<{gadsense}prestashop>gadsense_fa214007826415a21a8456e3e09f999d'] = 'Sie sind sicher, dass Sie Ihre Daten löschen wollen?'; +$_MODULE['<{gadsense}prestashop>gadsense_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{gadsense}prestashop>gadsense_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{gadsense}prestashop>gadsense_30c2b4b5e19ac71fefa1b4d688a7a98f'] = 'Ihr Code'; +$_MODULE['<{gadsense}prestashop>gadsense_81eeab9506186e2dca8faefa78d54067'] = 'Beispiel:'; +$_MODULE['<{gadsense}prestashop>gadsense_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; + +?> \ No newline at end of file diff --git a/modules/gadsense/en.php b/modules/gadsense/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/gadsense/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/gadsense/es.php b/modules/gadsense/es.php new file mode 100644 index 000000000..28843bd89 --- /dev/null +++ b/modules/gadsense/es.php @@ -0,0 +1,13 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gadsense}prestashop>gadsense_8a41674922e424cde4dd47c91f9d62e8'] = 'Google Adsense'; +$_MODULE['<{gadsense}prestashop>gadsense_4148996483a2cfeed90c66dc539c8f1a'] = 'Aún no ha configurado su código de Google Adsense'; +$_MODULE['<{gadsense}prestashop>gadsense_e32c2b519ed33ed45a4c0a4b1b359447'] = 'Integrar el script de Google Adsense en su tienda'; +$_MODULE['<{gadsense}prestashop>gadsense_fa214007826415a21a8456e3e09f999d'] = '¿Está seguro de querer eliminar todos sus datos?'; +$_MODULE['<{gadsense}prestashop>gadsense_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{gadsense}prestashop>gadsense_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{gadsense}prestashop>gadsense_30c2b4b5e19ac71fefa1b4d688a7a98f'] = 'Su código'; +$_MODULE['<{gadsense}prestashop>gadsense_81eeab9506186e2dca8faefa78d54067'] = 'Ejemplo:'; +$_MODULE['<{gadsense}prestashop>gadsense_b17f3f4dcf653a5776792498a9b44d6a'] = 'Ajustes de actualización'; diff --git a/modules/gadsense/fr.php b/modules/gadsense/fr.php new file mode 100644 index 000000000..5039f3a81 --- /dev/null +++ b/modules/gadsense/fr.php @@ -0,0 +1,13 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gadsense}prestashop>gadsense_8a41674922e424cde4dd47c91f9d62e8'] = 'Google Adsense'; +$_MODULE['<{gadsense}prestashop>gadsense_4148996483a2cfeed90c66dc539c8f1a'] = 'Vous n\'avez pas encore paramétré votre code Google Adsense.'; +$_MODULE['<{gadsense}prestashop>gadsense_e32c2b519ed33ed45a4c0a4b1b359447'] = 'Intégrer le script Google Adsense dans sa boutique'; +$_MODULE['<{gadsense}prestashop>gadsense_fa214007826415a21a8456e3e09f999d'] = 'Etes-vous sûr de vouloir supprimer vos paramètres ?'; +$_MODULE['<{gadsense}prestashop>gadsense_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour.'; +$_MODULE['<{gadsense}prestashop>gadsense_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres.'; +$_MODULE['<{gadsense}prestashop>gadsense_30c2b4b5e19ac71fefa1b4d688a7a98f'] = 'Votre code'; +$_MODULE['<{gadsense}prestashop>gadsense_81eeab9506186e2dca8faefa78d54067'] = 'Exemple :'; +$_MODULE['<{gadsense}prestashop>gadsense_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour les paramètres'; diff --git a/modules/gadsense/gadsense.php b/modules/gadsense/gadsense.php new file mode 100644 index 000000000..ae7f0644d --- /dev/null +++ b/modules/gadsense/gadsense.php @@ -0,0 +1,116 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GAdsense extends Module +{ + function __construct() + { + $this->name = 'gadsense'; + $this->tab = 'advertising_marketing'; + $this->version = '1.1'; + $this->author = 'PrestaShop'; + $this->displayName = $this->l('Google Adsense'); + + parent::__construct(); + + if ($this->id AND !Configuration::get('GADSENSE_ID')) + $this->warning = $this->l('You have not yet set your Google Adsense code'); + $this->description = $this->l('Integrate Google Adsense script into your shop'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details ?'); + } + + function install() + { + if (!parent::install() OR !$this->registerHook('home')) + return false; + return true; + } + + function uninstall() + { + if (!Configuration::deleteByName('GADSENSE_ID') OR !parent::uninstall()) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitGAdsense') AND ($gai = Tools::getValue('gadsense_id'))) + { + $gai = htmlentities($gai, ENT_COMPAT, 'UTF-8'); + Configuration::updateValue('GADSENSE_ID', $gai); + $output .= ' + <div class="conf confirm"> + <img src="../img/admin/ok.gif" alt="" title="" /> + '.$this->l('Settings updated').' + </div>'; + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend>'.$this->l('Settings').'</legend> + <label>'.$this->l('Your code').'</label> + <div class="margin-form"> + <textarea name="gadsense_id" cols="90" rows="10" />'.Tools::getValue('gadsense_id', Configuration::get('GADSENSE_ID')).'</textarea> + <p class="clear">'.$this->l('Example:').' <br /><br /><img src="../modules/gadsense/adsense_script.gif"></p> + </div> + <center><input type="submit" name="submitGAdsense" value="'.$this->l('Update settings').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + function hookLeftColumn($params) + { + return $this->hookHome($params); + } + + function hookRightColumn($params) + { + return $this->hookHome($params); + } + + function hookTop($params) + { + return $this->hookHome($params); + } + + function hookHome($params) + { + $output = html_entity_decode(Configuration::get('GADSENSE_ID'), ENT_COMPAT, 'UTF-8'); + return $output; + } + +} diff --git a/modules/gadsense/it.php b/modules/gadsense/it.php new file mode 100644 index 000000000..c6d4122af --- /dev/null +++ b/modules/gadsense/it.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gadsense}prestashop>gadsense_8a41674922e424cde4dd47c91f9d62e8'] = 'Google Adsense'; +$_MODULE['<{gadsense}prestashop>gadsense_4148996483a2cfeed90c66dc539c8f1a'] = 'Non hai ancora impostato il codice di Google Adsense'; +$_MODULE['<{gadsense}prestashop>gadsense_e32c2b519ed33ed45a4c0a4b1b359447'] = 'Integrare lo script di Google Adsense nel tuo negozio'; +$_MODULE['<{gadsense}prestashop>gadsense_fa214007826415a21a8456e3e09f999d'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{gadsense}prestashop>gadsense_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{gadsense}prestashop>gadsense_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{gadsense}prestashop>gadsense_30c2b4b5e19ac71fefa1b4d688a7a98f'] = 'Il tuo codice'; +$_MODULE['<{gadsense}prestashop>gadsense_81eeab9506186e2dca8faefa78d54067'] = 'Esempio:'; +$_MODULE['<{gadsense}prestashop>gadsense_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; + +?> \ No newline at end of file diff --git a/modules/gadsense/logo.gif b/modules/gadsense/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24a14a90921f6b698df98d4c7135dfc7d97dd70 GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGsZi0M!5h025YktnbGo08gz|s<y&cbG#f{vF-o%042RGw?Na` z`3n}L!p{B&W9WR3$9kmJzuxe~+v6xEi_R1oBs#H7v^)R*|F6>e6)LJGTgxdhbmjK_ zMs&&qHnH6p5{Zx56(4|an&}rilgut6O|?=0B9{06|II1@97(Xv-1EWp{}VCAATGs1 zZrlI$|6+ux-Ru7rKfl}>0A+>P(kKrxV7L=3pw=KSftlYiH?h#=|Jx-R4l2v(|NlI- zM9~ljA^8LV2LS&7EC2ui01yBW000J;zy_%@s0@w1iZbEzH7wAmR62TEdN5ppvg*_V z5a{W7P;pkU-jyNJK!4VmNG(l8ptL7Wq%cjTV-_J4E`L&R7BvQjQXWqkD2!1zPc0>W zP$mZvIyxy90#6SJ4hK;TIT#cl7CTQHEDH>nP&yz4786!55(^(276%6x0JwP;CMFvN Y5;iL_JSZ=~u98zbP1)MpJ~BZ7JC9qMJpcdz literal 0 HcmV?d00001 diff --git a/modules/ganalytics/config.xml b/modules/ganalytics/config.xml new file mode 100755 index 000000000..f21eddf05 --- /dev/null +++ b/modules/ganalytics/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>ganalytics</name> + <displayName><![CDATA[Google Analytics]]></displayName> + <version><![CDATA[1.3]]></version> + <description><![CDATA[Integrate Google Analytics script into your shop]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[analytics_stats]]></tab> + <confirmUninstall>Are you sure you want to delete your details ?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/ganalytics/de.php b/modules/ganalytics/de.php new file mode 100644 index 000000000..aad9211f9 --- /dev/null +++ b/modules/ganalytics/de.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ganalytics}prestashop>ganalytics_7510f8b22dd3e10476096425f78d4239'] = 'Sie haben Ihre Google Analytics-ID noch nicht eingestellt'; +$_MODULE['<{ganalytics}prestashop>ganalytics_aba1a7971f85c725ba4aed21343eeb4b'] = 'Integrieren Sie das Google Analytics-Skript in Ihren Shop'; +$_MODULE['<{ganalytics}prestashop>ganalytics_fa214007826415a21a8456e3e09f999d'] = 'Sie sind sicher, dass Sie Ihre Daten löschen wollen?'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d7c9ce3337a28d63ce6626d90fdaedaa'] = 'Ihr Benutzername'; +$_MODULE['<{ganalytics}prestashop>ganalytics_81eeab9506186e2dca8faefa78d54067'] = 'Beispiel:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a3e7f361e6fc12caf872119338642143'] = ' ID aktualisieren'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Hilfe'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d78b0fcff6b55bafe615f3fc1572c282'] = 'Der erste Schritt zum Erfassen von E-Commerce-Transaktionen ist, E-Commerce-Berichte für das Profil Ihrer Website zu aktivieren.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d02388589ecfd3b58e0a90e42127ca61'] = 'Bitte folgen Sie diesen Schritten, um die E-Commerce-Bereichte zu aktivieren:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_11f4b4ba23dc72ee5e86ff5a90bdde60'] = 'Melden Sie sich bei Ihrem Konto an'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b452493b16ead8b4b25ab3fb7174b8f5'] = 'Klicken Sie auf Bearbeiten neben dem Profil, das Sie aktivieren möchten'; +$_MODULE['<{ganalytics}prestashop>ganalytics_95df6d8c97e880d8f6895d824d72c353'] = 'Klicken Sie auf der Seite Profileinstellungen auf Bearbeiten neben der Hauptwebseiten-Profilinformation'; +$_MODULE['<{ganalytics}prestashop>ganalytics_5189c0be0481408c9301c377818e69dc'] = 'Drehen Sie den Radioknopf der E-Commerce-Webseite von Nein auf Ja'; +$_MODULE['<{ganalytics}prestashop>ganalytics_98d12a01ab2aeeb10b7100eecf1974a8'] = 'Geben Sie Ihre Ziel-Informationen ein, um Ihre Ziele einzustellen:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a44698a775d2fec04549ba6a2ac00491'] = 'Zurück zu Ihrer persönlichen Startseite'; +$_MODULE['<{ganalytics}prestashop>ganalytics_dbec126ee3be2cd285a32a8d413fd1fa'] = 'Suchen Sie das Profil, für das Sie ein Ziel erstellen möchten, klicken Sie dann auf Bearbeiten'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c4af40d39b97cf98040540639841e27a'] = 'Wählen Sie eine der 4 verfügbaren Zielpositionen für dieses Profil und klicken dann auf \"Bearbeiten\"'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c3b99aa9b4638183dc1bf55f955ed9ae'] = 'Geben Sie die Ziel-URL ein. Das Erreichen dieser Seite ist ein Zeichen für eine erfolgreiche Umwandlung'; +$_MODULE['<{ganalytics}prestashop>ganalytics_54849fd1a3b8bdde81bfd979bc43aaa9'] = 'Geben Sie den Zielnamen ein, wie er in Ihrem Google Analytics-Konto angezeigt werden soll'; +$_MODULE['<{ganalytics}prestashop>ganalytics_62034d209119c06315f59a5de39c6717'] = 'Aktivieren Sie das Ziel'; +$_MODULE['<{ganalytics}prestashop>ganalytics_792795e7f3cedd66897ca35349101ba8'] = 'Dann definieren Sie mit den folgenden Schritten einen Trichter:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_467ed594f2aa9b3e802037a10bad61b1'] = 'Geben Sie die URL der ersten Seite Ihres Umwandlungstrichters ein. Dies sollte allen Nutzern vertraut sein, die auf Ihr Ziel zugehen.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_2edf3f56ba30ad663429ba0e812a2396'] = 'Geben Sie einen Namen für diesen Schritt ein.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c909bea215f88ff0de9888dc95eed1ca'] = 'Wenn dieser Schritt erforderlich für die Umwandlung ist, klicken Sie das Kontrollkästchen rechts von diesem Schritt an.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9d25cb4b66791343ca319b3cdb82dba6'] = 'Geben Sie weitere Zielschritte ein, bis Ihr Trichter vollständig definiert ist. Sie können bis zu 10 Schritte oder auch nur einen einzigen Schritt eingeben.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_1c681b64f4cd8f52aecbb55c98f5c768'] = 'Konfigurieren Sie abschließend die Zusätzlichen Einstellungen durch die folgenden Schritte unten:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_bb1ca9cfa0f3f7dbd06a2364c9a0dc9c'] = 'Wenn die oben angegebenen URLs die Groß-/Kleinschreibung berücksichtigen, markieren Sie das Kontrollkästchen.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_047cf7562621a3639b3e04a63dc6b41f'] = 'Wählen Sie den entsprechenden Ziel-Übereinstimmungstyp. ('; +$_MODULE['<{ganalytics}prestashop>ganalytics_d59048f21fd887ad520398ce677be586'] = 'Erfahren Sie mehr'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f0c5b61aabf16d5ce925722b65c9aad8'] = 'über Übereinstimmungstypen und wie den entsprechenden Ziel-Übereinstimmungstyp für Ihr Ziel wählen können.)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3dcb5dddc6b7c11d4ea76a60dc1a0466'] = 'Geben Sie einen Zielwert ein. Dies ist der Wert, der in den Google Analytics ROI-Berechnungen verwendet wird.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a39f026ca75c6279ac9487265c00e3f5'] = 'Klicken Sie auf Änderungen speichern, um dieses Ziel und diesen Trichter zu erstellen , oder Abbrechen, um ohne Speichern zu beenden.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_cd4952b65560a1242c68ffc980a6e515'] = 'Demonstration: Der Bestellvorgang'; +$_MODULE['<{ganalytics}prestashop>ganalytics_efbf206b1b60cc0400c6147723509bd6'] = 'Nachdem Sie Ihre E-Commerce-Berichte aktiviert und das jeweilige Profil ausgewählt haben, geben Sie \'bestellung-bestätigung.php\' ein, als gewünschte URL-Seite'; +$_MODULE['<{ganalytics}prestashop>ganalytics_68db264effa9364901183d9d12fac500'] = 'Dieses Ziel benennen (zum Beispiel \'Bestellvorgang\')'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9b8bc3519c65da8fac122f91ac5b7673'] = 'Aktivieren Sie das Ziel'; +$_MODULE['<{ganalytics}prestashop>ganalytics_86a358dd6df1ba0cb3565b88380ba7a6'] = 'Fügen Sie \'product.php\' als erste Seite Ihres Umwandlungstrichters hinzu'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b7f896191caad09b5fc34e79f1cefa76'] = 'Benennen Sie sie (zum Beispiel \'Produktseite\')'; +$_MODULE['<{ganalytics}prestashop>ganalytics_ef7060dd05e779dcfbf82f236df43823'] = 'Markieren Sie das Kontrollkästchen nicht als \"erforderlich\", denn der Kunde kann direkt von einer \"In den Warenkorb\"-Schaltfläche gekommen sein wie etwa auf dem Startseitenblock '; +$_MODULE['<{ganalytics}prestashop>ganalytics_3bab28a0105361c49ca261ca08a19bf7'] = 'Fahren Sie fort, indem Sie die folgenden URLs als Zielschritte eingeben:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9bfb6e6af6e6793bfa9387e728187c87'] = '(Erforderlich)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a47891ae07f45802bc948d2618e36f5'] = 'Überprüfen Sie die \'Groß-/Kleinschreibung\'-Option'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d2d0c38d112e1d775057388122ae7545'] = 'Speichern Sie dieses neue Ziel'; + +?> \ No newline at end of file diff --git a/modules/ganalytics/en.php b/modules/ganalytics/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/ganalytics/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/ganalytics/es.php b/modules/ganalytics/es.php new file mode 100644 index 000000000..30cbf51e5 --- /dev/null +++ b/modules/ganalytics/es.php @@ -0,0 +1,49 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ganalytics}prestashop>ganalytics_7510f8b22dd3e10476096425f78d4239'] = 'Aún no ha configurado su ID de Google Analytics'; +$_MODULE['<{ganalytics}prestashop>ganalytics_aba1a7971f85c725ba4aed21343eeb4b'] = 'Integrar el script de Google Analytics en su tienda'; +$_MODULE['<{ganalytics}prestashop>ganalytics_fa214007826415a21a8456e3e09f999d'] = '¿Está seguro de querer eliminar todos sus datos?'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d7c9ce3337a28d63ce6626d90fdaedaa'] = 'Su nombre de usuario'; +$_MODULE['<{ganalytics}prestashop>ganalytics_81eeab9506186e2dca8faefa78d54067'] = 'Ejemplo:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a3e7f361e6fc12caf872119338642143'] = 'Actualizar ID'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Ayuda'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d78b0fcff6b55bafe615f3fc1572c282'] = 'El primer paso para seguir las transacciones de comercio electrónico es activar el informe de su tienda en su perfil.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d02388589ecfd3b58e0a90e42127ca61'] = 'Para activar el informe de comercio electrónico, por favor revise estos pasos:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_11f4b4ba23dc72ee5e86ff5a90bdde60'] = 'Entrar en su cuenta'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b452493b16ead8b4b25ab3fb7174b8f5'] = 'Haga clic en Editar en el perfil que quiere activar'; +$_MODULE['<{ganalytics}prestashop>ganalytics_95df6d8c97e880d8f6895d824d72c353'] = 'En la página de Configuración del Perfil, haga clic en \\\"Editar\\\" para el Perfil de Información de la Web Principal'; +$_MODULE['<{ganalytics}prestashop>ganalytics_5189c0be0481408c9301c377818e69dc'] = 'seleccione sí/no en Web de comercio electrónico'; +$_MODULE['<{ganalytics}prestashop>ganalytics_98d12a01ab2aeeb10b7100eecf1974a8'] = 'Para configurar sus objetivos, introduzca información sobre ellos:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a44698a775d2fec04549ba6a2ac00491'] = 'Volver a la página principal de su cuenta'; +$_MODULE['<{ganalytics}prestashop>ganalytics_dbec126ee3be2cd285a32a8d413fd1fa'] = 'Encuentra el perfil del objetivo que quieres crear, y pulsa \\\"Editar\\\"'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c4af40d39b97cf98040540639841e27a'] = 'Seleccione uno de los cuatro objetivos disponibles para su perfil, después haga clic en Edit'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c3b99aa9b4638183dc1bf55f955ed9ae'] = 'Introduzca la URL objetivo. Acceder a esta página generará una conversión correcta'; +$_MODULE['<{ganalytics}prestashop>ganalytics_54849fd1a3b8bdde81bfd979bc43aaa9'] = 'Introduzca el nombre del objetivo tal como aparece en su cuenta Google Analytics'; +$_MODULE['<{ganalytics}prestashop>ganalytics_62034d209119c06315f59a5de39c6717'] = 'Activar el objetivo'; +$_MODULE['<{ganalytics}prestashop>ganalytics_792795e7f3cedd66897ca35349101ba8'] = 'Después, defina un redireccionamiento siguiendo estos pasos:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_467ed594f2aa9b3e802037a10bad61b1'] = 'Introduzca la URL de la primera página de su redireccionamiento de conversión. Esta página deberá ser común para todos los usuarios hacia su objetivo.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_2edf3f56ba30ad663429ba0e812a2396'] = 'Introduzca un nombre para este paso'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c909bea215f88ff0de9888dc95eed1ca'] = 'Si este paso es necesario en el proceso de conversión, seleccione la casilla de la derecha del paso.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9d25cb4b66791343ca319b3cdb82dba6'] = 'Continue avanzando hasta completar el objetivo. Debe introducir de 1 a 10 etapas.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_1c681b64f4cd8f52aecbb55c98f5c768'] = 'Para terminar, configure los parámetros complementarios para continuar los siguientes pasos: '; +$_MODULE['<{ganalytics}prestashop>ganalytics_bb1ca9cfa0f3f7dbd06a2364c9a0dc9c'] = 'Si las URLs introducidas arriba distinguen entre mayúsculas y minúsculas, marque la casilla de verificación.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_047cf7562621a3639b3e04a63dc6b41f'] = 'Seleccione el objetivo apropiado. ('; +$_MODULE['<{ganalytics}prestashop>ganalytics_d59048f21fd887ad520398ce677be586'] = 'Más información'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f0c5b61aabf16d5ce925722b65c9aad8'] = 'sobre los Tipos de Partidos y sobre la manera de elegir el tipo de correspondencia adecuada a su objetivo.)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3dcb5dddc6b7c11d4ea76a60dc1a0466'] = 'Introduzca un valor objetivo. Este es el valor utilizado para los cáculos de Google Analitics.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a39f026ca75c6279ac9487265c00e3f5'] = 'Haga clic en \\\"Salvar cambios\\\" para crear este objetivo, o cancelar para salir sin guardar cambios.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_cd4952b65560a1242c68ffc980a6e515'] = 'Demostración: El proceso de pedido'; +$_MODULE['<{ganalytics}prestashop>ganalytics_efbf206b1b60cc0400c6147723509bd6'] = 'Después de activar sus informes sobre e-commerce y de seleccionar el perfil, introduzca \'order-confirmation.php\' como la página URL de destino'; +$_MODULE['<{ganalytics}prestashop>ganalytics_68db264effa9364901183d9d12fac500'] = 'Nombre del objetivo (por ejemplo \\\"proceso del pedido\\\")'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9b8bc3519c65da8fac122f91ac5b7673'] = 'Activar el objetivo'; +$_MODULE['<{ganalytics}prestashop>ganalytics_86a358dd6df1ba0cb3565b88380ba7a6'] = 'Añadir \'producto.php\' como la primera página de redireccionamiento'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b7f896191caad09b5fc34e79f1cefa76'] = 'Dele un nombre (por ejemplo \\\"Página del producto\\\")'; +$_MODULE['<{ganalytics}prestashop>ganalytics_ef7060dd05e779dcfbf82f236df43823'] = 'No marque \\\"obligatorio\\\" porque el cliente deberá visitar desde el botón \\\"Añadir al carrito\\\" como en el homefeatured de producto de la página de inicio.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3bab28a0105361c49ca261ca08a19bf7'] = 'Continúe introduciendo las siguientes URL como objetivos:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9bfb6e6af6e6793bfa9387e728187c87'] = '(obligatorio)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a47891ae07f45802bc948d2618e36f5'] = 'Revise la opción de \\\"distinción mayúsculas-minúsculas\\\"'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d2d0c38d112e1d775057388122ae7545'] = 'Guardar este nuevo objetivo'; diff --git a/modules/ganalytics/fr.php b/modules/ganalytics/fr.php new file mode 100644 index 000000000..a9c594c7b --- /dev/null +++ b/modules/ganalytics/fr.php @@ -0,0 +1,49 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ganalytics}prestashop>ganalytics_7510f8b22dd3e10476096425f78d4239'] = 'Vous n\'avez pas encore renseigné votre ID Google Analytics'; +$_MODULE['<{ganalytics}prestashop>ganalytics_aba1a7971f85c725ba4aed21343eeb4b'] = 'Intègre le script de Google Analytics à votre boutique'; +$_MODULE['<{ganalytics}prestashop>ganalytics_fa214007826415a21a8456e3e09f999d'] = 'Etes-vous sûr de vouloir supprimer vos paramètres ?'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d7c9ce3337a28d63ce6626d90fdaedaa'] = 'Votre identifiant'; +$_MODULE['<{ganalytics}prestashop>ganalytics_81eeab9506186e2dca8faefa78d54067'] = 'Exemple :'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a3e7f361e6fc12caf872119338642143'] = 'Enregistrer l\'identifiant'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aide'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d78b0fcff6b55bafe615f3fc1572c282'] = 'La première étape pour analyser les transactions e-commerce consiste à activer l\'archivage sur le profil de votre site.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d02388589ecfd3b58e0a90e42127ca61'] = 'Pour activer l\'option e-commerce, suivez ces étapes :'; +$_MODULE['<{ganalytics}prestashop>ganalytics_11f4b4ba23dc72ee5e86ff5a90bdde60'] = 'Connectez-vous à votre compte'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b452493b16ead8b4b25ab3fb7174b8f5'] = 'Cliquez sur Edit, à côté du profil que vous désirez activer'; +$_MODULE['<{ganalytics}prestashop>ganalytics_95df6d8c97e880d8f6895d824d72c353'] = 'Sur la page \"Paramètres des profils\", cliquez sur \"Modifier\" en regard de l\'option \"Informations sur le profil du site principal\"'; +$_MODULE['<{ganalytics}prestashop>ganalytics_5189c0be0481408c9301c377818e69dc'] = 'Modifiez le bouton radio \"E-commerce\" sur \"Oui\"'; +$_MODULE['<{ganalytics}prestashop>ganalytics_98d12a01ab2aeeb10b7100eecf1974a8'] = 'Afin de définir vos objectifs, saisissez les informations de l\'objectif :'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a44698a775d2fec04549ba6a2ac00491'] = 'Retournez sur la page d\'accueil de votre compte'; +$_MODULE['<{ganalytics}prestashop>ganalytics_dbec126ee3be2cd285a32a8d413fd1fa'] = 'Trouvez le profil correspondant à l\'objectif et éditez-le'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c4af40d39b97cf98040540639841e27a'] = 'Sélectionnez un des 4 emplacements disponibles pour ce profil et cliquez sur Editer'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c3b99aa9b4638183dc1bf55f955ed9ae'] = 'Entrez l\'URL de la page d\'objectif. Une conversion est enregistrée chaque fois qu\'un visiteur accède à cette page'; +$_MODULE['<{ganalytics}prestashop>ganalytics_54849fd1a3b8bdde81bfd979bc43aaa9'] = 'Entrez le nom de l\'objectif tel qu\'il doit apparaître dans votre compte Google Analytics.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_62034d209119c06315f59a5de39c6717'] = 'Activez l\'objectif'; +$_MODULE['<{ganalytics}prestashop>ganalytics_792795e7f3cedd66897ca35349101ba8'] = 'Ensuite, définissez un entonnoir de conversion en suivant ces étapes :'; +$_MODULE['<{ganalytics}prestashop>ganalytics_467ed594f2aa9b3e802037a10bad61b1'] = 'Entrez l\'URL de la première page de votre entonnoir de conversion. Cette page doit être commune à tous les internautes que vous souhaitez amener jusqu\'à votre objectif'; +$_MODULE['<{ganalytics}prestashop>ganalytics_2edf3f56ba30ad663429ba0e812a2396'] = 'Attribuez un nom à cette étape.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c909bea215f88ff0de9888dc95eed1ca'] = 'Si cette étape est obligatoire dans l\'objectif, cochez la case à droite de cette étape.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9d25cb4b66791343ca319b3cdb82dba6'] = 'Entrez toutes les étapes précédant l\'objectif jusqu\'à ce que vous ayez terminé de définir l\'entonnoir de conversion. Vous pouvez entrer de 1 à 10 étapes'; +$_MODULE['<{ganalytics}prestashop>ganalytics_1c681b64f4cd8f52aecbb55c98f5c768'] = 'Pour finir, configurez les Paramètres complémentaires en procédant comme suit :'; +$_MODULE['<{ganalytics}prestashop>ganalytics_bb1ca9cfa0f3f7dbd06a2364c9a0dc9c'] = 'Si les URL entrées ci-dessus sont sensibles à la casse, cochez la case.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_047cf7562621a3639b3e04a63dc6b41f'] = 'Sélectionnez l\'objectif approprié. ('; +$_MODULE['<{ganalytics}prestashop>ganalytics_d59048f21fd887ad520398ce677be586'] = 'En savoir plus'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f0c5b61aabf16d5ce925722b65c9aad8'] = 'sur les types de correspondances et sur la façon de choisir le type de correspondance approprié à votre objectif)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3dcb5dddc6b7c11d4ea76a60dc1a0466'] = 'Entrez un objectif. Cette valeur est utilisée par les calculs ROI de Google Analytics.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a39f026ca75c6279ac9487265c00e3f5'] = 'Cliquez sur Enregistrer les modifications pour créer cet objectif et cet entonnoir de conversion ou sur Annuler pour quitter sans enregistrer.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_cd4952b65560a1242c68ffc980a6e515'] = 'Démonstration : Le processus de commande'; +$_MODULE['<{ganalytics}prestashop>ganalytics_efbf206b1b60cc0400c6147723509bd6'] = 'Après avoir activé vos reports e-commerce et sélectionné les profils respectifs, entrez \'order-confirmation.php\' comme page cible.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_68db264effa9364901183d9d12fac500'] = 'Nommez cet objectif (par exemple \'Processus de commande\')'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9b8bc3519c65da8fac122f91ac5b7673'] = 'Activez l\'objectif'; +$_MODULE['<{ganalytics}prestashop>ganalytics_86a358dd6df1ba0cb3565b88380ba7a6'] = 'Ajoutez \'product.php\' comme la première page du cheminement de vos visiteurs'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b7f896191caad09b5fc34e79f1cefa76'] = 'Donnez lui un nom (par exemple \'Page produit\')'; +$_MODULE['<{ganalytics}prestashop>ganalytics_ef7060dd05e779dcfbf82f236df43823'] = 'N\'activez pas la case \'requis\' parce que les clients pourraient visiter directement par un bouton \'Ajouter au panier\', tel que dans le module HomeFeatured sur la page d\'accueil.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3bab28a0105361c49ca261ca08a19bf7'] = 'Faites de même en entrant les urls suivantes comme étapes de l\'objectif'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9bfb6e6af6e6793bfa9387e728187c87'] = 'requis'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a47891ae07f45802bc948d2618e36f5'] = 'Vérifiez l\'option \'sensibilité de la casse\''; +$_MODULE['<{ganalytics}prestashop>ganalytics_d2d0c38d112e1d775057388122ae7545'] = 'Sauvegardez cet objectif'; diff --git a/modules/ganalytics/ganalytics.php b/modules/ganalytics/ganalytics.php new file mode 100644 index 000000000..6e251d876 --- /dev/null +++ b/modules/ganalytics/ganalytics.php @@ -0,0 +1,209 @@ +<?php + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GAnalytics extends Module +{ + function __construct() + { + $this->name = 'ganalytics'; + $this->tab = 'analytics_stats'; + $this->version = '1.3'; + $this->author = 'PrestaShop'; + $this->displayName = 'Google Analytics'; + + parent::__construct(); + + if ($this->id AND !Configuration::get('GANALYTICS_ID')) + $this->warning = $this->l('You have not yet set your Google Analytics ID'); + $this->description = $this->l('Integrate Google Analytics script into your shop'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details ?'); + } + + function install() + { + if (!parent::install() OR !$this->registerHook('header') OR !$this->registerHook('orderConfirmation')) + return false; + return true; + } + + function uninstall() + { + if (!Configuration::deleteByName('GANALYTICS_ID') OR !parent::uninstall()) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>Google Analytics</h2>'; + if (Tools::isSubmit('submitGAnalytics') AND ($gai = Tools::getValue('ganalytics_id'))) + { + Configuration::updateValue('GANALYTICS_ID', $gai); + $output .= ' + <div class="conf confirm"> + <img src="../img/admin/ok.gif" alt="" title="" /> + '.$this->l('Settings updated').' + </div>'; + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset class="width2"> + <legend><img src="../img/admin/cog.gif" alt="" class="middle" />'.$this->l('Settings').'</legend> + <label>'.$this->l('Your username').'</label> + <div class="margin-form"> + <input type="text" name="ganalytics_id" value="'.Tools::getValue('ganalytics_id', Configuration::get('GANALYTICS_ID')).'" /> + <p class="clear">'.$this->l('Example:').' UA-1234567-1</p> + </div> + <center><input type="submit" name="submitGAnalytics" value="'.$this->l('Update ID').'" class="button" /></center> + </fieldset> + </form>'; + + $output .= ' + <fieldset class="space"> + <legend><img src="../img/admin/unknown.gif" alt="" class="middle" />'.$this->l('Help').'</legend> + <h3>'.$this->l('The first step of tracking e-commerce transactions is to enable e-commerce reporting for your website\'s profile.').'</h3> + '.$this->l('To enable e-Commerce reporting, please follow these steps:').' + <ol> + <li>'.$this->l('Log in to your account').'</li> + <li>'.$this->l('Click Edit next to the profile you would like to enable.').'</li> + <li>'.$this->l('On the Profile Settings page, click Edit (next to Main Website Profile Information).').'</li> + <li>'.$this->l('Change the e-Commerce Website radio button from No to Yes').'</li> + </ol> + <h3>'.$this->l('To set up your goals, enter Goal Information:').'</h3> + <ol> + <li>'.$this->l('Return to Your Account main page').'</li> + <li>'.$this->l('Find the profile for which you will be creating goals, then click Edit').'</li> + <li>'.$this->l('Select one of the 4 goal slots available for that profile, then click Edit').'</li> + <li>'.$this->l('Enter the Goal URL. Reaching this page marks a successful conversion.').'</li> + <li>'.$this->l('Enter the Goal name as it should appear in your Google Analytics account.').'</li> + <li>'.$this->l('Turn on Goal.').'</li> + </ol> + <h3>'.$this->l('Then, define a funnel by following these steps:').'</h3> + <ol> + <li>'.$this->l('Enter the URL of the first page of your conversion funnel. This page should be a common page to all users working their way towards your Goal.').'</li> + <li>'.$this->l('Enter a Name for this step.').'</li> + <li>'.$this->l('If this step is a required step in the conversion process, mark the checkbox to the right of the step.').'</li> + <li>'.$this->l('Continue entering goal steps until your funnel has been completely defined. You may enter up to 10 steps, or only one step.').'</li> + </ol> + '.$this->l('Finally, configure Additional settings by following the steps below:').' + <ol> + <li>'.$this->l('If the URLs entered above are case sensitive, mark the checkbox.').'</li> + <li>'.$this->l('Select the appropriate goal Match Type. (').'<a href="http://www.google.com/support/analytics/bin/answer.py?answer=72285">'.$this->l('Learn more').'</a> '.$this->l('about Match Types and how to choose the appropriate goal Match Type for your goal.)').'</li> + <li>'.$this->l('Enter a Goal value. This is the value used in Google Analytics\' ROI calculations.').'</li> + <li>'.$this->l('Click Save Changes to create this Goal and funnel, or Cancel to exit without saving.').'</li> + </ol> + <h3>'.$this->l('Demonstration: The order process').'</h3> + <ol> + <li>'.$this->l('After having enabled your e-commerce reports and selected the respective profile enter \'order-confirmation.php\' as the targeted page URL.').'</li> + <li>'.$this->l('Name this goal (for example \'Order process\')').'</li> + <li>'.$this->l('Activate the goal').'</li> + <li>'.$this->l('Add \'product.php\' as the first page of your conversion funnel').'</li> + <li>'.$this->l('Give it a name (for example, \'Product page\')').'</li> + <li>'.$this->l('Do not mark the \'required\' checkbox because the customer could be visiting directly from an \'adding to cart\' button such as in the homefeatured block on the homepage.').'</li> + <li>'.$this->l('Continue by entering the following URLs as goal steps:').' + <ul> + <li>order/step0.html '.$this->l('(required)').'</li> + <li>authentication.php '.$this->l('(required)').'</li> + <li>order/step1.html '.$this->l('(required)').'</li> + <li>order/step2.html '.$this->l('(required)').'</li> + <li>order/step3.html '.$this->l('(required)').'</li> + </ul> + </li> + <li>'.$this->l('Check the \'Case sensitive\' option').'</li> + <li>'.$this->l('Save this new goal').'</li> + </ol> + </fieldset>'; + + return $output; + } + + function hookHeader($params) + { + global $smarty, $cookie; + + // hookOrderConfirmation() already send the sats bypass this step + if (strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.'order-confirmation.php') === 0) return ''; + + // Otherwise, create Google Analytics stats + $ganalytics_id = Configuration::get('GANALYTICS_ID'); + $multilang = (Language::countActiveLanguages() > 1); + $defaultMetaOrder = Meta::getMetaByPage('order',(int)$cookie->id_lang); + $order = ($multilang?((string)Tools::getValue('isolang').'/'):'').$defaultMetaOrder['url_rewrite']; + $pageTrack = ((strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.'order.php') === 0 || strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.($multilang?((string)Tools::getValue('isolang').'/'):'').$defaultMetaOrder['url_rewrite']) === 0) ? '/order/step'.(int)(Tools::getValue('step')).'.html' : ''); + $smarty->assign('ganalytics_id', $ganalytics_id); + $smarty->assign('pageTrack', $pageTrack); + $smarty->assign('isOrder', false); + return $this->display(__FILE__, 'header.tpl'); + } + + function hookFooter($params) + { + // for retrocompatibility + if (!$this->isRegisteredInHook('header')) $this->registerHook('header'); + return ; + } + + function hookOrderConfirmation($params) + { + global $smarty; + // Setting parameters + $parameters = Configuration::getMultiple(array('PS_LANG_DEFAULT')); + + $order = $params['objOrder']; + if (Validate::isLoadedObject($order)) + { + $deliveryAddress = new Address(intval($order->id_address_delivery)); + + $conversion_rate = 1; + if ($order->id_currency != Configuration::get('PS_CURRENCY_DEFAULT')) + { + $currency = new Currency(intval($order->id_currency)); + $conversion_rate = floatval($currency->conversion_rate); + } + + // Order general information + $trans = array('id' => intval($order->id), // order ID - required + 'store' => htmlentities(Configuration::get('PS_SHOP_NAME')), // affiliation or store name + 'total' => Tools::ps_round(floatval($order->total_paid) / floatval($conversion_rate), 2), // total - required + 'tax' => '0', // tax + 'shipping' => Tools::ps_round(floatval($order->total_shipping) / floatval($conversion_rate), 2), // shipping + 'city' => addslashes($deliveryAddress->city), // city + 'state' => '', // state or province + 'country' => addslashes($deliveryAddress->country) // country + ); + + // Product information + $products = $order->getProducts(); + foreach ($products AS $product) + { + $category = Db::getInstance()->getRow(' + SELECT name FROM `'._DB_PREFIX_.'category_lang` , '._DB_PREFIX_.'product + WHERE `id_product` = '.intval($product['product_id']).' AND `id_category_default` = `id_category` + AND `id_lang` = '.intval($parameters['PS_LANG_DEFAULT'])); + + $items[] = array('OrderId' => intval($order->id), // order ID - required + 'SKU' => addslashes($product['product_id']), // SKU/code - required + 'Product' => addslashes($product['product_name']), // product name + 'Category' => addslashes($category['name']), // category or variation + 'Price' => Tools::ps_round(floatval($product['product_price_wt']) / floatval($conversion_rate), 2), // unit price - required + 'Quantity' => addslashes(intval($product['product_quantity'])) //quantity - required + ); + } + $ganalytics_id = Configuration::get('GANALYTICS_ID'); + $pageTrack = (strpos($_SERVER['REQUEST_URI'], __PS_BASE_URI__.'order.php') === 0 ? '/order/step'.intval($step).'.html' : ''); + $smarty->assign('items', $items); + $smarty->assign('trans', $trans); + $smarty->assign('ganalytics_id', $ganalytics_id); + $smarty->assign('pageTrack', $pageTrack); + $smarty->assign('isOrder', true); + return $this->display(__FILE__, 'header.tpl'); + } + } +} diff --git a/modules/ganalytics/header.tpl b/modules/ganalytics/header.tpl new file mode 100644 index 000000000..bfa718ae6 --- /dev/null +++ b/modules/ganalytics/header.tpl @@ -0,0 +1,39 @@ +<script type="text/javascript"> +var _gaq = _gaq || []; +_gaq.push(['_setAccount', '{$ganalytics_id}']); +_gaq.push(['_trackPageview', '{$pageTrack}']); +_gaq.push(['_trackPageLoadTime']); +{if $isOrder eq true} {* If it's an order we need more data for stats *} + _gaq.push(['_addTrans', + '{$trans.id}', {* order ID - required *} + '{$trans.store}', {* affiliation or store name *} + '{$trans.total}', {* total - required *} + '{$trans.tax}', {* tax *} + '{$trans.shipping}', {* shipping *} + '{$trans.city}', {* city *} + '{$trans.state}', {* state or province *} + '{$trans.country}' {* country *} + ]); + + {foreach from=$items item=item} + _gaq.push(['_addItem', + '{$item.OrderId}', {* order ID - required *} + '{$item.SKU}', {* SKU/code - required *} + '{$item.Product}', {* product name *} + '{$item.Category}', {* category or variation *} + '{$item.Price}', {* unit price - required *} + '{$item.Quantity}' {* quantity - required *} + ]); + {/foreach} + {* submits transaction to the Analytics servers *} +{literal} + _gaq.push(['_trackTrans']); +{/literal} +{/if} +{literal} +(function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); +})(); {/literal} +</script> \ No newline at end of file diff --git a/modules/ganalytics/it.php b/modules/ganalytics/it.php new file mode 100644 index 000000000..7ac40b095 --- /dev/null +++ b/modules/ganalytics/it.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{ganalytics}prestashop>ganalytics_7510f8b22dd3e10476096425f78d4239'] = 'Non hai ancora impostato l\'ID di Google Analytics'; +$_MODULE['<{ganalytics}prestashop>ganalytics_aba1a7971f85c725ba4aed21343eeb4b'] = 'Integra lo script di Google Analytics nel tuo negozio'; +$_MODULE['<{ganalytics}prestashop>ganalytics_fa214007826415a21a8456e3e09f999d'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d7c9ce3337a28d63ce6626d90fdaedaa'] = 'Il tuo nome utente'; +$_MODULE['<{ganalytics}prestashop>ganalytics_81eeab9506186e2dca8faefa78d54067'] = 'Esempio:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a3e7f361e6fc12caf872119338642143'] = 'Aggiorna ID'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aiuto'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d78b0fcff6b55bafe615f3fc1572c282'] = 'La prima fase del monitoraggio delle transazioni e-commerce è quello di attivare i rapporti e-commerce per il profilo del tuo sito web.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_d02388589ecfd3b58e0a90e42127ca61'] = 'Per attivare il rapporto dell\'e-commerce, segui queste fasi:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_11f4b4ba23dc72ee5e86ff5a90bdde60'] = 'Accedi al tuo account'; +$_MODULE['<{ganalytics}prestashop>ganalytics_b452493b16ead8b4b25ab3fb7174b8f5'] = 'Clicca su Modifica accanto al profilo che desideri attivare'; +$_MODULE['<{ganalytics}prestashop>ganalytics_95df6d8c97e880d8f6895d824d72c353'] = 'Nella pagina Impostazioni profilo, fai clic su modifica accanto alle informazioni profilo sito web principale'; +$_MODULE['<{ganalytics}prestashop>ganalytics_5189c0be0481408c9301c377818e69dc'] = 'Modifica il tasto radio del sito e-commerce da No a Sì.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_98d12a01ab2aeeb10b7100eecf1974a8'] = 'Per impostare gli obiettivi, inserisci i dati dell\'obiettivo:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a44698a775d2fec04549ba6a2ac00491'] = 'Ritorna alla pagina principale dell\'account '; +$_MODULE['<{ganalytics}prestashop>ganalytics_dbec126ee3be2cd285a32a8d413fd1fa'] = 'Individua il profilo per il quale desideri creare gli obiettivi, quindi clicca su Modifica'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c4af40d39b97cf98040540639841e27a'] = 'Selezionare uno dei 4 spazi adibiti agli obiettivi disponibili per il profilo, quindi clicca su Modifica'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c3b99aa9b4638183dc1bf55f955ed9ae'] = 'Inserire l\'URL dell\'obiettivo. Il raggiungimento di questa pagina segna una conversione riuscita'; +$_MODULE['<{ganalytics}prestashop>ganalytics_54849fd1a3b8bdde81bfd979bc43aaa9'] = 'Inserisci il nome dell\'obiettivo come dovrebbe apparire nel tuo account Google Analytics'; +$_MODULE['<{ganalytics}prestashop>ganalytics_62034d209119c06315f59a5de39c6717'] = 'Attiva l\'obiettivo'; +$_MODULE['<{ganalytics}prestashop>ganalytics_792795e7f3cedd66897ca35349101ba8'] = 'Quindi, definire un imbuto nel seguente modo:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_467ed594f2aa9b3e802037a10bad61b1'] = 'Inserisci l\'URL della prima pagina della canalizzazione di conversione. Questa pagina dovrebbe essere una pagina comune a tutti gli utenti che cercano di raggiungere il tuo obiettivo.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_2edf3f56ba30ad663429ba0e812a2396'] = 'Inserisci un nome per questa fase.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_c909bea215f88ff0de9888dc95eed1ca'] = 'Se questa fase è un passaggio obbligatorio nella procedura di conversione, seleziona la casella a destra del passaggio.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9d25cb4b66791343ca319b3cdb82dba6'] = 'Continua a inserire i passaggi che conducono all\'obiettivo finché il percorso obiettivo è stato completamente definito. È possibile inserire fino a 10 passi, o anche solo un passo.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_1c681b64f4cd8f52aecbb55c98f5c768'] = 'Infine, configura le Impostazioni aggiuntive procedendo nel seguente modo:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_bb1ca9cfa0f3f7dbd06a2364c9a0dc9c'] = 'Se gli URL inseriti sopra sono case sensitive, segna la casella di controllo.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_047cf7562621a3639b3e04a63dc6b41f'] = 'Seleziona l\'obiettivo appropriato. ('; +$_MODULE['<{ganalytics}prestashop>ganalytics_d59048f21fd887ad520398ce677be586'] = 'Per saperne di più'; +$_MODULE['<{ganalytics}prestashop>ganalytics_f0c5b61aabf16d5ce925722b65c9aad8'] = 'sui tipi di corrispondenze e su come scegliere il tipo di corrispondenza per il tuo obiettivo.)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3dcb5dddc6b7c11d4ea76a60dc1a0466'] = 'Inserire un valore obiettivo. Questo è il valore utilizzato nei calcoli ROI di Google Analytics.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_a39f026ca75c6279ac9487265c00e3f5'] = 'Fai clic su Salva modifiche per creare l\'obiettivo e la canalizzazione o su Annulla per uscire senza salvare.'; +$_MODULE['<{ganalytics}prestashop>ganalytics_cd4952b65560a1242c68ffc980a6e515'] = 'Dimostrazione: Il processo di ordinazione'; +$_MODULE['<{ganalytics}prestashop>ganalytics_efbf206b1b60cc0400c6147723509bd6'] = 'Dopo aver attivato i rapporti e-commerce e selezionato il profilo inserire \'order-confirmation.php\' come pagina obiettivo'; +$_MODULE['<{ganalytics}prestashop>ganalytics_68db264effa9364901183d9d12fac500'] = 'Nome di questo obiettivo (per esempio \'elaborazione ordine\')'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9b8bc3519c65da8fac122f91ac5b7673'] = 'Attiva l\'obiettivo'; +$_MODULE['<{ganalytics}prestashop>ganalytics_86a358dd6df1ba0cb3565b88380ba7a6'] = 'Aggiungi \'Product.php\' come prima pagina della tua conversione '; +$_MODULE['<{ganalytics}prestashop>ganalytics_b7f896191caad09b5fc34e79f1cefa76'] = 'Dagli un nome (ad esempio, \'pagina del prodotto\')'; +$_MODULE['<{ganalytics}prestashop>ganalytics_ef7060dd05e779dcfbf82f236df43823'] = 'Non segnare la casella \'richiesta\' perché il cliente potrebbe essere visitato direttamente da un tasto \"aggiungi al carrello\', come nel blocco homefeatured sulla homepage'; +$_MODULE['<{ganalytics}prestashop>ganalytics_3bab28a0105361c49ca261ca08a19bf7'] = 'Proseguire inserendo i seguenti URL come fasi:'; +$_MODULE['<{ganalytics}prestashop>ganalytics_9bfb6e6af6e6793bfa9387e728187c87'] = '(Obbligatorio)'; +$_MODULE['<{ganalytics}prestashop>ganalytics_6a47891ae07f45802bc948d2618e36f5'] = 'Spuntare l\'opIone \'case sensitive\' '; +$_MODULE['<{ganalytics}prestashop>ganalytics_d2d0c38d112e1d775057388122ae7545'] = 'Salva questo nuovo obiettivo'; + +?> \ No newline at end of file diff --git a/modules/ganalytics/logo.gif b/modules/ganalytics/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..22eb91371359c4c68943c2eb66285c8b1029023a GIT binary patch literal 1117 zcmb_b`B&6+6n&r1cO-TgIusqy1}sEkPL=|*!mvmTp@JfaDMk<{OU=Zx5IZO{EV2tC zAS7W<Y^Mf_Wl}K}2sj+JfLM}UAsLnd8XUee-*3bJ(EahA^X@(G-TU4X`*FCDOklz~ z07Y*?M^iMVg<L*GQ7BKKCnzng15hJa`^A=~$pHi-Qwz&Auc&IR(IpSKD1a;>TzA(X zgr#0Oz)ST9Am1Hj2{$laY>uCAiC?PU_xH0E$lybvJKS_#1_HtqPN(WnhBHd`c;i$( zN)tl7XcB|E$td*OT963!wj@dF5S+>Wozl_x!t0RASy7J7BTxbZC41|D!1^hv2c!sa zsu17cLYxQWb0J?)<H-DDr_)ma$n~@iEni=K?)|w8!XK(Cx7D+ls|d!r^LK=o8Kt@@ zx@Xi~xwK}rb9BnFC|JLGr{$KU>R#fC=W?yZqt^^*1dznlk~GBa*?N|x?jL|6cQ~Y& zt^<u~X~NGBV!Clm8$NP>Lrcz9y{#rGMsx@7V>ToSrhdW@a(73>tr1L=J{XfW7E*{n ziG11Jp81veQF(w_k|$*IVe^JU4WQA<g$WGsjSs1%$LCa?GIz-0Y?TI>A6G1`Xh13m z%j|+YHu2RvivZ(tV<KNj(K;QiwLDM^SB2r(Z4Tm0e7u!>Y}`9J_SlnWclZZVOW_33 z(yzeuFSz=aMfb=e<Z>R2w9lFvS9COJ33zfSNL8~JE_*;!+h21Ng*7)<|LNIS9vE*p z@w^fs&WjQFJ*4jOEB|a=VL4dgjMKO%gH3B`^N;S$snjavFywLg@l6_1J@-U@rJ^tK z=RSP2S*0+=@t#{Q`$)=~<`;Ev#f4l`Dt|P6Gv{!ZoC8ThB3(egpg9pG`ob9od}sHy z7_zyn6Edm=<7@n(GF!3iG*Q4Kiuh~5ctNg>1FY0p1SK|BHx1&b&PnAA%HiP~e0^i} zIsY%P*D&;H&w|UQ+U8GyAr0L|cK&kKL$8qP_D2pC=`sUbt7AbE{-v+Nq<{LK|3->z z4jL(&gA%s)C}3AmIq$Y_fi)wBDyZBw)!God`<&)CNz9Og0owoNblGij4tLhv&d^P^ zuP6YQGKb%lv|qP2>q1yw<!k2~407y)tdP?gQAzIh#k~$Zb4I_o_4Efxtf%QSoD0zh zuSF3y>1Fl~5*xz6^bY5X#dg`rTZY!GFlnzv?0xykq2TG_JD;$lC03R@E!fAr4J`{q z?JZnE8#Ll)3^BNl1g1>IRwb9k_8oP-=xdP4jvzu8D%71XWrfV%vtBuG_Oi*5IAhj_ zZYGl5QOvGkUR!9I4To(q7#JB_o+foK(H2jyeL74Sn&h8_pvvA7mrG!uBI-DwfSkAa UtKN6)j}J~awrW1NUj+RB0Ci>KC;$Ke literal 0 HcmV?d00001 diff --git a/modules/gcheckout/.htaccess b/modules/gcheckout/.htaccess new file mode 100644 index 000000000..a382585ab --- /dev/null +++ b/modules/gcheckout/.htaccess @@ -0,0 +1,5 @@ +<IfModule mod_rewrite.c> + RewriteEngine on + RewriteCond %{HTTP:Authorization} ^(.*) + RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] +</IfModule> diff --git a/modules/gcheckout/config.xml b/modules/gcheckout/config.xml new file mode 100755 index 000000000..e9e6991de --- /dev/null +++ b/modules/gcheckout/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>gcheckout</name> + <displayName><![CDATA[Google Checkout]]></displayName> + <version><![CDATA[1.1]]></version> + <description><![CDATA[Google Checkout API implementation]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/gcheckout/confirm.tpl b/modules/gcheckout/confirm.tpl new file mode 100644 index 000000000..f91010522 --- /dev/null +++ b/modules/gcheckout/confirm.tpl @@ -0,0 +1,56 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}<a href="{$link->getPageLink('order', true)}">{l s='Your shopping cart' mod='gcheckout'}</a><span class="navigation-pipe">{$navigationPipe}</span>{l s='Google Checkout' mod='gcheckout'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +<h2>{l s='Order summary' mod='gcheckout'}</h2> + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +<p> + <img src="gcheckout.gif" alt="{l s='Google Checkout' mod='gcheckout'}" style="margin-bottom: 5px" /> + <br />{l s='You have chosen to pay with Google Checkout.' mod='gcheckout'} + <br/><br /> + {l s='Here is a short summary of your order:' mod='gcheckout'} +</p> +<p style="margin-top:20px;"> + - {l s='The total amount of your order is' mod='gcheckout'} + <span class="price">{convertPriceWithCurrency price=$googleTotal currency=$currency}</span> {if $use_taxes == 1}{l s='(tax incl.)' mod='gcheckout'}{/if} +</p> +<p> + - {l s='We accept the following currency to be sent by Google Checkout:' mod='gcheckout'}&nbsp;<b>{$currency->name}</b> +</p> +<p> + <b>{l s='Please confirm your order by clicking \'I confirm my order\'' mod='gcheckout'}.</b> +</p> +<p class="cart_navigation"> + <a href="{$link->getPageLink('order', true, NULL, "step=3")}" class="button_large">{l s='Other payment methods' mod='gcheckout'}</a> + <a href="#" class="exclusive_large" onclick="$('#gcheckout_form').submit();return false;">{l s='I confirm my order' mod='gcheckout'}</a> +</p> + +{$googleCheckoutExtraForm} diff --git a/modules/gcheckout/de.php b/modules/gcheckout/de.php new file mode 100644 index 000000000..f3f9fb6a7 --- /dev/null +++ b/modules/gcheckout/de.php @@ -0,0 +1,44 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gcheckout}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Ihr Warenkorb'; +$_MODULE['<{gcheckout}prestashop>confirm_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Bestellsumme'; +$_MODULE['<{gcheckout}prestashop>confirm_3575814f89e55ba8061c55dd93214aae'] = 'Sie haben Google Checkout für Ihre Zahlung ausgewählt.'; +$_MODULE['<{gcheckout}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Hier eine kurze Zusammenfassung Ihrer Bestellung:'; +$_MODULE['<{gcheckout}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung beträgt'; +$_MODULE['<{gcheckout}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. Mwst.)'; +$_MODULE['<{gcheckout}prestashop>confirm_eecc59d9ca953545b6c5ac9bf11ded00'] = 'Wir akzeptieren die folgende Währung bei einer Zahlung mit Google Checkout:'; +$_MODULE['<{gcheckout}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Bitte bestätigen Sie Ihre Bestellung durch Klicken auf \"BESTELLEN\"'; +$_MODULE['<{gcheckout}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Andere Zahlungsmethoden'; +$_MODULE['<{gcheckout}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'BESTELLEN'; +$_MODULE['<{gcheckout}prestashop>gcheckout_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_3f3c0194c5adbe6953eb571f125af16d'] = 'Google Checkout-API-Implementierung'; +$_MODULE['<{gcheckout}prestashop>gcheckout_4402acab1c8f90dcf4a31dc96833bd86'] = 'Keine Währung für dieses Modul eingestellt'; +$_MODULE['<{gcheckout}prestashop>gcheckout_82b8bb0d807e6d2e43a068f954c3559f'] = 'Händler-ID scheint falsch zu sein'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9dd37c2106ceacbf0a40778b2109c386'] = 'Händler-Schlüssel scheint falsch zu sein'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a1ffd2dc2538ea3093532029514d42ac'] = 'Nutzen Sie zuerst die Sandbox, um das Modul zu testen, dann können Sie den Echtbetrieb-Modus benutzen, wenn alles in Ordnung ist. Vergessen Sie nicht, je nach Modus Händler-Schlüssel und -ID zu ändern!'; +$_MODULE['<{gcheckout}prestashop>gcheckout_650be61892bf690026089544abbd9d26'] = 'Modus'; +$_MODULE['<{gcheckout}prestashop>gcheckout_7f80fcc452c2f1ed2bb51b39d0864df1'] = 'Echtzeit'; +$_MODULE['<{gcheckout}prestashop>gcheckout_2652eec977dcb2a5aea85f5bec235b05'] = 'Sandbox'; +$_MODULE['<{gcheckout}prestashop>gcheckout_76055653a95e0a559b734ec322d89632'] = 'Sie finden diese Schlüssel in Ihrem Google Checkout-Konto> Einstellungen> Integration. Sowohl Sandkasten als auch Echtzeit-Modus haben diese Tasten.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_229a7ec501323b94db7ff3157a7623c9'] = 'Händler-ID'; +$_MODULE['<{gcheckout}prestashop>gcheckout_795acb9a0c89791314d3032fe65eeb92'] = 'Händler-Schlüssel'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a7ba8619e32091c343b340ec5b80e541'] = 'Wenn Sie dieses Feld ankreuzen, werden die Käufer in der Lage sein, die Versandkosten zu sehen, die Sie in Google Checkout auf der Kaufseite eingerichtet haben.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_de6fa0b14f259108c4b38e5be0374f46'] = 'Google Versandkosten benutzen'; +$_MODULE['<{gcheckout}prestashop>gcheckout_74692aae1cff5dc9dfd44f8c4e0540ad'] = 'Sie können die Server-zu-Server-Kommunikation protokollieren. Die Protokolldateien sind'; +$_MODULE['<{gcheckout}prestashop>gcheckout_be5d5d37542d75f93a87094459f76678'] = 'und'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f2f19b2cbcb395e254ebb1d9bf7cccd4'] = 'Wenn Sie sie aktivieren, vergewissern Sie sich, dass Sie sie schützen, indem Sie eine .htaccess-Datei ins gleiche Verzeichnis speichern. Wenn Sie dies vergessen, werden sie von jedermann lesbar sein'; +$_MODULE['<{gcheckout}prestashop>gcheckout_b2d37ae1cedf42ff874289b721860af2'] = 'Logs'; +$_MODULE['<{gcheckout}prestashop>gcheckout_38fb7d24e0d60a048f540ecb18e13376'] = 'Speichern'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{gcheckout}prestashop>gcheckout_968913ba2d4e25f3589d4c612ecbaa8d'] = 'Um Ihr Google Checkout-Modul zu verwenden, müssen Sie in Ihr Google Checkout-Konto (Sandbox-Konto sowie Live-Konto) konfigurieren. Melden Sie sich bei Google Checkout an, gehen Sie dann auf Einstellungen> Integration. Die API-Rückruf-URL lautet:'; +$_MODULE['<{gcheckout}prestashop>gcheckout_dba727a9adc372723baef4533a7fc9da'] = 'Die Callback-Methode muss eingestellt werden auf'; +$_MODULE['<{gcheckout}prestashop>gcheckout_0d46d15f70a7cfa670545b308c022840'] = 'Die bestellungen müssen mit der gleichen Währung wie Ihr Verkäufer-Konto eingestelltwerden. Warenkörbe in anderen Währungen werden umgerechnet, wenn der Kunde mit diesem Modul bezahlen möchte.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_8dd85f4218069de952672fe3180dacdb'] = 'Bezahlen Sie mit GoogleCheckout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_ba794350deb07c0c96fe73bd12239059'] = 'Verpackung'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9f06b28a40790c4c4df5739bce3c1eb0'] = 'Versandkosten'; + +?> \ No newline at end of file diff --git a/modules/gcheckout/en.php b/modules/gcheckout/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/gcheckout/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/gcheckout/es.php b/modules/gcheckout/es.php new file mode 100644 index 000000000..431b4034d --- /dev/null +++ b/modules/gcheckout/es.php @@ -0,0 +1,42 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gcheckout}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Su carrito de la compra'; +$_MODULE['<{gcheckout}prestashop>confirm_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Resumen del pedido '; +$_MODULE['<{gcheckout}prestashop>confirm_3575814f89e55ba8061c55dd93214aae'] = 'Ha elegido pagar con Google Checkout. '; +$_MODULE['<{gcheckout}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Breve resumen del pedido: '; +$_MODULE['<{gcheckout}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'El importe total de su pedido es de'; +$_MODULE['<{gcheckout}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(TTC)'; +$_MODULE['<{gcheckout}prestashop>confirm_eecc59d9ca953545b6c5ac9bf11ded00'] = 'Aceptamos esta divisa para el pago : '; +$_MODULE['<{gcheckout}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Confirme su pedido pulsando \"Confirmar pedido\"'; +$_MODULE['<{gcheckout}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Otras formas de pago'; +$_MODULE['<{gcheckout}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'Confirmar pedido'; +$_MODULE['<{gcheckout}prestashop>gcheckout_6c132b5e262594950586ae13a7d3aa94'] = 'Google checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_3f3c0194c5adbe6953eb571f125af16d'] = 'Implementación de API de Google Checkout '; +$_MODULE['<{gcheckout}prestashop>gcheckout_4402acab1c8f90dcf4a31dc96833bd86'] = 'No hay moneda configurada para este módulo'; +$_MODULE['<{gcheckout}prestashop>gcheckout_82b8bb0d807e6d2e43a068f954c3559f'] = 'La ID del comerciante parece incorrecta'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9dd37c2106ceacbf0a40778b2109c386'] = 'La contraseña del comerciante parece incorrecta'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f4f70727dc34561dfde1a3c529b6205c'] = 'Ajustes'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a1ffd2dc2538ea3093532029514d42ac'] = 'Primero utilice el sandbox para probar el múdulo, luego podrá utilizarlo en modo real si toda la configuración se hizo correctamente. No olvide cambiar su contraseña e identificación mercantil según el modo'; +$_MODULE['<{gcheckout}prestashop>gcheckout_650be61892bf690026089544abbd9d26'] = 'Modo'; +$_MODULE['<{gcheckout}prestashop>gcheckout_7f80fcc452c2f1ed2bb51b39d0864df1'] = 'Real'; +$_MODULE['<{gcheckout}prestashop>gcheckout_2652eec977dcb2a5aea85f5bec235b05'] = 'Sandbox'; +$_MODULE['<{gcheckout}prestashop>gcheckout_76055653a95e0a559b734ec322d89632'] = 'Puede encontrar estas claves en su cuenta de comprobación de Google > Ajustes > Integración. En Sandbox y modo real tiene las mismas claves.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_229a7ec501323b94db7ff3157a7623c9'] = 'ID comerciante'; +$_MODULE['<{gcheckout}prestashop>gcheckout_795acb9a0c89791314d3032fe65eeb92'] = 'Contraseña comerciante'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a7ba8619e32091c343b340ec5b80e541'] = 'Si marca esta casilla, los compradores podrán ver en la página de compra los gastos de transporte que usted ha pagado en Google Checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_de6fa0b14f259108c4b38e5be0374f46'] = 'Utilice los gastos de transporte Google'; +$_MODULE['<{gcheckout}prestashop>gcheckout_74692aae1cff5dc9dfd44f8c4e0540ad'] = 'Usted puede registrar la comunicación del servidor-a-servidor. Los ficheros de diario son'; +$_MODULE['<{gcheckout}prestashop>gcheckout_be5d5d37542d75f93a87094459f76678'] = 'y'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f2f19b2cbcb395e254ebb1d9bf7cccd4'] = 'Si usted lo activa, está seguro de protegerlos poniendo un archivo .htaccess en el mismo directorio. Si usted olvida hacer eso, cualquiera podrá leerlos'; +$_MODULE['<{gcheckout}prestashop>gcheckout_b2d37ae1cedf42ff874289b721860af2'] = 'Registros'; +$_MODULE['<{gcheckout}prestashop>gcheckout_38fb7d24e0d60a048f540ecb18e13376'] = 'Guardar'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Información'; +$_MODULE['<{gcheckout}prestashop>gcheckout_968913ba2d4e25f3589d4c612ecbaa8d'] = 'Para utilizar su módulo de la comprobación de Google, tiene que configurar su cuenta Google (cuenta de sandbox y su cuenta). La conexión a la comprobación de la cuenta Google > ajustes; Integración. La URL del servicio repetido del API es:'; +$_MODULE['<{gcheckout}prestashop>gcheckout_dba727a9adc372723baef4533a7fc9da'] = 'El método de callback debe fijarse a '; +$_MODULE['<{gcheckout}prestashop>gcheckout_0d46d15f70a7cfa670545b308c022840'] = 'Los pedidos deben pasarse con la misma moneda que la cuenta del vendedor. Los carritos en otras monedas serán convertidas si el cliente elige pagar con este módulo.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_8dd85f4218069de952672fe3180dacdb'] = 'Pagar con GoogleCheckout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_ba794350deb07c0c96fe73bd12239059'] = 'Embalaje '; +$_MODULE['<{gcheckout}prestashop>gcheckout_9f06b28a40790c4c4df5739bce3c1eb0'] = 'Costos de envío'; diff --git a/modules/gcheckout/fr.php b/modules/gcheckout/fr.php new file mode 100644 index 000000000..af521edcc --- /dev/null +++ b/modules/gcheckout/fr.php @@ -0,0 +1,42 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gcheckout}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{gcheckout}prestashop>confirm_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Résumé de la commande'; +$_MODULE['<{gcheckout}prestashop>confirm_3575814f89e55ba8061c55dd93214aae'] = 'Vous avez choisi de payer avec Google Checkout'; +$_MODULE['<{gcheckout}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un court résumé de votre commande :'; +$_MODULE['<{gcheckout}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande s\'élève à'; +$_MODULE['<{gcheckout}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(TTC)'; +$_MODULE['<{gcheckout}prestashop>confirm_eecc59d9ca953545b6c5ac9bf11ded00'] = 'Nous acceptons la devise suivante pour votre paiement :'; +$_MODULE['<{gcheckout}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Merci de confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{gcheckout}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Autres moyens de paiement'; +$_MODULE['<{gcheckout}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{gcheckout}prestashop>gcheckout_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_3f3c0194c5adbe6953eb571f125af16d'] = 'Implémentation de l\'API de Google Checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_4402acab1c8f90dcf4a31dc96833bd86'] = 'Aucune devise disponible pour ce module'; +$_MODULE['<{gcheckout}prestashop>gcheckout_82b8bb0d807e6d2e43a068f954c3559f'] = 'L\'ID marchand semble incorrect'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9dd37c2106ceacbf0a40778b2109c386'] = 'La clé marchand semble incorrecte'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a1ffd2dc2538ea3093532029514d42ac'] = 'Utilisez le mode bac à sable pour tester le module avant de l\'utiliser en mode réel. N\'oubliez pas de changer vos clés et ID marchand selon le mode !'; +$_MODULE['<{gcheckout}prestashop>gcheckout_650be61892bf690026089544abbd9d26'] = 'Mode'; +$_MODULE['<{gcheckout}prestashop>gcheckout_7f80fcc452c2f1ed2bb51b39d0864df1'] = 'Réel'; +$_MODULE['<{gcheckout}prestashop>gcheckout_2652eec977dcb2a5aea85f5bec235b05'] = 'Bac à sable'; +$_MODULE['<{gcheckout}prestashop>gcheckout_76055653a95e0a559b734ec322d89632'] = 'Vous trouverez ces identifiants dans votre compte Google Checkout > Settings > Integration. Les modes réel et bac à sable ont tous les deux besoin de ces clés.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_229a7ec501323b94db7ff3157a7623c9'] = 'ID marchand'; +$_MODULE['<{gcheckout}prestashop>gcheckout_795acb9a0c89791314d3032fe65eeb92'] = 'Clé marchand'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a7ba8619e32091c343b340ec5b80e541'] = 'Si vous cochez cette case, les acheteurs pourront voir sur la page d\'achat les frais de transport que vous avez réglé dans Google Checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_de6fa0b14f259108c4b38e5be0374f46'] = 'Utilisez les frais de transport Google'; +$_MODULE['<{gcheckout}prestashop>gcheckout_74692aae1cff5dc9dfd44f8c4e0540ad'] = 'Vous pouvez archiver les échanges de serveur à serveur. Les fichiers d\'archives sont'; +$_MODULE['<{gcheckout}prestashop>gcheckout_be5d5d37542d75f93a87094459f76678'] = 'et'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f2f19b2cbcb395e254ebb1d9bf7cccd4'] = 'Si vous activez les logs, soyez certain de protéger ces fichiers en plaçant un fichier .htaccess dans le même répertoire. Si vous ne le faites pas, ils seront lisibles par tous vos clients.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_b2d37ae1cedf42ff874289b721860af2'] = 'Archivage'; +$_MODULE['<{gcheckout}prestashop>gcheckout_38fb7d24e0d60a048f540ecb18e13376'] = 'Enregistrer'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Informations'; +$_MODULE['<{gcheckout}prestashop>gcheckout_968913ba2d4e25f3589d4c612ecbaa8d'] = 'Pour utiliser votre module Google Checkout, vous devez configurer votre compte marchand (en mode bac à sable comme en mode réel). Accédez à votre compte Google Checkout puis allez dans Settings > Integration. L\'API callback URL doit être :'; +$_MODULE['<{gcheckout}prestashop>gcheckout_dba727a9adc372723baef4533a7fc9da'] = 'La \"callback method\" doit être réglée sur'; +$_MODULE['<{gcheckout}prestashop>gcheckout_0d46d15f70a7cfa670545b308c022840'] = 'Les commandes doivent être passées en utilisant la même devise que celle indiquée dans votre compte marchand. Les paniers utilisant d\'autres devises seront convertis si l\'utilisateur décide de payer par le biais de ce module.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_8dd85f4218069de952672fe3180dacdb'] = 'Payer par GoogleCheckout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_ba794350deb07c0c96fe73bd12239059'] = 'Emballage'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9f06b28a40790c4c4df5739bce3c1eb0'] = 'Frais de port'; diff --git a/modules/gcheckout/gcheckout.gif b/modules/gcheckout/gcheckout.gif new file mode 100644 index 0000000000000000000000000000000000000000..419e54547033e4716267c279baa7b8a197c41720 GIT binary patch literal 2569 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 literal 0 HcmV?d00001 diff --git a/modules/gcheckout/gcheckout.php b/modules/gcheckout/gcheckout.php new file mode 100644 index 000000000..9a5c65ad2 --- /dev/null +++ b/modules/gcheckout/gcheckout.php @@ -0,0 +1,230 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GCheckout extends PaymentModule +{ + function __construct() + { + $this->name = 'gcheckout'; + $this->tab = 'payments_gateways'; + $this->version = 1.1; + $this->author = 'PrestaShop'; + + $this->currencies = true; + $this->currencies_mode = 'radio'; + + parent::__construct(); + + $this->displayName = $this->l('Google Checkout'); + $this->description = $this->l('Google Checkout API implementation'); + + if (!sizeof(Currency::checkPaymentCurrencies($this->id))) + $this->warning = $this->l('No currency set for this module'); + } + + function install() + { + if (!parent::install() OR !$this->registerHook('payment') OR + !$this->registerHook('paymentReturn') OR + !Configuration::updateValue('GCHECKOUT_MERCHANT_ID', '822305931131113') OR + !Configuration::updateValue('GCHECKOUT_MERCHANT_KEY', '2Lv_osMomVIocnLK0aif3A') OR + !Configuration::updateValue('GCHECKOUT_LOGS', '1') OR + !Configuration::updateValue('GCHECKOUT_MODE', 'real') OR + !Configuration::updateValue('GCHECKOUT_NO_SHIPPING', '0')) + return false; + return true; + } + + function uninstall() + { + return (parent::uninstall() AND + Configuration::deleteByName('GCHECKOUT_MERCHANT_ID') AND + Configuration::deleteByName('GCHECKOUT_MERCHANT_KEY') AND + Configuration::deleteByName('GCHECKOUT_MODE') AND + Configuration::deleteByName('GCHECKOUT_LOGS') AND + Configuration::deleteByName('GCHECKOUT_NO_SHIPPING')); + } + + function getContent() + { + global $currentIndex, $cookie; + + if (Tools::isSubmit('submitGoogleCheckout')) + { + $errors = array(); + if (($merchant_id = Tools::getValue('gcheckout_merchant_id')) AND preg_match('/[0-9]{15}/', $merchant_id)) + Configuration::updateValue('GCHECKOUT_MERCHANT_ID', $merchant_id); + else + $errors[] = '<div class="warning warn"><h3>'.$this->l('Merchant ID seems to be wrong').'</h3></div>'; + if (($merchant_key = Tools::getValue('gcheckout_merchant_key')) AND preg_match('/[a-zA-Z0-9_-]{22}/', $merchant_key)) + Configuration::updateValue('GCHECKOUT_MERCHANT_KEY', $merchant_key); + else + $errors[] = '<div class="warning warn"><h3>'.$this->l('Merchant key seems to be wrong').'</h3></div>'; + if ($mode = (Tools::getValue('gcheckout_mode') == 'real' ? 'real' : 'sandbox')) + Configuration::updateValue('GCHECKOUT_MODE', $mode); + if (Tools::getValue('gcheckout_logs')) + Configuration::updateValue('GCHECKOUT_LOGS', 1); + else + Configuration::updateValue('GCHECKOUT_LOGS', 0); + if (!sizeof($errors)) + Tools::redirectAdmin($currentIndex.'&configure=gcheckout&token='.Tools::getValue('token').'&conf=4'); + foreach ($errors as $error) + echo $error; + } + + $html = '<h2>'.$this->displayName.'</h2> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend><img src="'.__PS_BASE_URI__.'modules/gcheckout/logo.gif" />'.$this->l('Settings').'</legend> + <p>'.$this->l('Use the sandbox to test out the module then you can use the real mode if no problems arise. Remember to change your merchant key and ID according to the mode.').'</p> + <label> + '.$this->l('Mode').' + </label> + <div class="margin-form"> + <select name="gcheckout_mode"> + <option value="real"'.(Configuration::get('GCHECKOUT_MODE') == 'real' ? ' selected="selected"' : '').'>'.$this->l('Real').'&nbsp;&nbsp;</option> + <option value="sandbox"'.(Configuration::get('GCHECKOUT_MODE') == 'sandbox' ? ' selected="selected"' : '').'>'.$this->l('Sandbox').'&nbsp;&nbsp;</option> + </select> + </div> + <p>'.$this->l('You can find these keys in your Google Checkout account > Settings > Integration. Sandbox and real mode both have these keys.').'</p> + <label> + '.$this->l('Merchant ID').' + </label> + <div class="margin-form"> + <input type="text" name="gcheckout_merchant_id" value="'.Tools::getValue('gcheckout_merchant_id', Configuration::get('GCHECKOUT_MERCHANT_ID')).'" /> + </div> + <label> + '.$this->l('Merchant Key').' + </label> + <div class="margin-form"> + <input type="text" name="gcheckout_merchant_key" value="'.Tools::getValue('gcheckout_merchant_key', Configuration::get('GCHECKOUT_MERCHANT_KEY')).'" /> + </div> + <p>'.$this->l('If you click this box, buyers will be able to see the shipping fees you have setup in Google Checkout on the purchase page.').'</p> + <label> + '.$this->l('Use Google shipping fees').' + </label> + <div class="margin-form" style="margin-top:5px"> + <input type="checkbox" name="gcheckout_no_shipping"'.(Tools::getValue('gcheckout_no_shipping', Configuration::get('GCHECKOUT_NO_SHIPPING')) ? ' checked="checked"' : '').' /> + </div> + <p>'.$this->l('You can log the server-to-server communication. The log files are').' '.__PS_BASE_URI__.'modules/gcheckout/googleerror.log '.$this->l('and').' '.__PS_BASE_URI__.'modules/gcheckout/googlemessage.log. '.$this->l('If activated, be sure to protect them by putting a .htaccess file in the same directory. If not, they will be readable by everyone.').'</p> + <label> + '.$this->l('Logs').' + </label> + <div class="margin-form" style="margin-top:5px"> + <input type="checkbox" name="gcheckout_logs"'.(Tools::getValue('gcheckout_logs', Configuration::get('GCHECKOUT_LOGS')) ? ' checked="checked"' : '').' /> + </div> + <div class="clear center"><input type="submit" name="submitGoogleCheckout" class="button" value="'.$this->l(' Save ').'" /></div> + </fieldset> + </form> + <br /><br /> + <fieldset> + <legend><img src="../img/admin/warning.gif" />'.$this->l('Information').'</legend> + <p>- '.$this->l('In order to use your Google Checkout module, you must configure your Google Checkout account (sandbox account as well as live account). Log in to Google Checkout then go to Settings > Integration. The API callback URL is:').'<br /> + <b>'.Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/gcheckout/validation.php</b> + </p> + <p>- '.$this->l('The callback method must be set to').' <b>XML</b>.</p> + <p>- '.$this->l('Orders must be placed with the same currency as your seller account. Carts in other currencies will be converted if the customer chooses to pay with this module.').'<p> + </fieldset>'; + + return $html; + } + + function hookPayment($params) + { + if (!$this->active) + return; + + global $smarty; + + $smarty->assign('buttonText', $this->l('Pay with GoogleCheckout')); + return $this->display(__FILE__, 'payment.tpl'); + } + + function hookPaymentReturn($params) + { + if (!$this->active) + return; + return $this->display(__FILE__, 'payment_return.tpl'); + } + + function preparePayment() + { + global $smarty, $cart, $cookie; + + + require_once(dirname(__FILE__).'/library/googlecart.php'); + require_once(dirname(__FILE__).'/library/googleitem.php'); + require_once(dirname(__FILE__).'/library/googleshipping.php'); + + $currency = $this->getCurrency((int)$cart->id_currency); + + if ($cart->id_currency != $currency->id) + { + $cart->id_currency = (int)$currency->id; + $cookie->id_currency = (int)$cart->id_currency; + $cart->update(); + Tools::redirect('modules/'.$this->name.'/payment.php'); + } + + $googleCart = new GoogleCart( + Configuration::get('GCHECKOUT_MERCHANT_ID'), + Configuration::get('GCHECKOUT_MERCHANT_KEY'), + Configuration::get('GCHECKOUT_MODE'), $currency->iso_code); + + foreach ($cart->getProducts() AS $product) + $googleCart->AddItem(new GoogleItem(utf8_decode($product['name']. + ((isset($product['attributes']) AND !empty($product['attributes'])) ? + ' - '.$product['attributes'] : '')), utf8_decode($product['description_short']), + (int)$product['cart_quantity'], $product['price_wt'], + strtoupper(Configuration::get('PS_WEIGHT_UNIT')), (float)$product['weight'])); + + if ($wrapping = $cart->getOrderTotal(true, Cart::ONLY_WRAPPING)) + $googleCart->AddItem(new GoogleItem(utf8_decode($this->l('Wrapping')), '', 1, $wrapping)); + foreach ($cart->getDiscounts() AS $voucher) + $googleCart->AddItem(new GoogleItem(utf8_decode($voucher['name']), + utf8_decode($voucher['description']), 1, '-'.$voucher['value_real'])); + + if (!Configuration::get('GCHECKOUT_NO_SHIPPING')) + $googleCart->AddShipping(new GooglePickUp($this->l('Shipping costs'), + $cart->getOrderShippingCost($cart->id_carrier))); + + $googleCart->SetEditCartUrl(Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'order.php'); + $googleCart->SetContinueShoppingUrl(Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'order-confirmation.php'); + $googleCart->SetRequestBuyerPhone(false); + $googleCart->SetMerchantPrivateData($cart->id.'|'.$cart->secure_key); + + $total = $cart->getOrderTotal(); + + $smarty->assign(array( + 'googleCheckoutExtraForm' => $googleCart->CheckoutButtonCode($this->l('Pay with GoogleCheckout'), 'LARGE'), + 'total' => $total, + 'googleTotal' => $total)); + } +} diff --git a/modules/gcheckout/htaccessBugInformation.php b/modules/gcheckout/htaccessBugInformation.php new file mode 100644 index 000000000..ac2b160d4 --- /dev/null +++ b/modules/gcheckout/htaccessBugInformation.php @@ -0,0 +1,21 @@ +<?php + +/* + +BUG FIXED : PSCFI-1480 + +There is problem with server using apache with php under CGI MODE. +The authentification isn't created in CGI MOD and this module won't work. + +To fix it, the .htaccess will create this missing variable + +Here is the .htaccess detailed : + +<IfModule mod_rewrite.c> +RewriteEngine on +RewriteCond %{HTTP:Authorization} ^(.*) +RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] +</IfModule> + +*/ +?> diff --git a/modules/gcheckout/it.php b/modules/gcheckout/it.php new file mode 100644 index 000000000..7b7dd1402 --- /dev/null +++ b/modules/gcheckout/it.php @@ -0,0 +1,44 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gcheckout}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Il tuo carrello'; +$_MODULE['<{gcheckout}prestashop>confirm_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Riepilogo ordine'; +$_MODULE['<{gcheckout}prestashop>confirm_3575814f89e55ba8061c55dd93214aae'] = 'Hai scelto di pagare con Google Checkout.'; +$_MODULE['<{gcheckout}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Ecco un breve riepilogo del tuo ordine:'; +$_MODULE['<{gcheckout}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'L\'importo totale del tuo ordine è'; +$_MODULE['<{gcheckout}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(Tasse incl.)'; +$_MODULE['<{gcheckout}prestashop>confirm_eecc59d9ca953545b6c5ac9bf11ded00'] = 'Accettiamo le seguente valuta da inviare tramite Google Checkout:'; +$_MODULE['<{gcheckout}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Si prega di confermare l\'ordine cliccando su \'confermo il mio ordine\''; +$_MODULE['<{gcheckout}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Altri metodi di pagamento'; +$_MODULE['<{gcheckout}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'Confermo il mio ordine'; +$_MODULE['<{gcheckout}prestashop>gcheckout_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_3f3c0194c5adbe6953eb571f125af16d'] = 'Attuazione API di Google Checkout '; +$_MODULE['<{gcheckout}prestashop>gcheckout_4402acab1c8f90dcf4a31dc96833bd86'] = 'Nessuna valuta impostata per questo modulo'; +$_MODULE['<{gcheckout}prestashop>gcheckout_82b8bb0d807e6d2e43a068f954c3559f'] = 'ID commerciante sembra essere sbagliato'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9dd37c2106ceacbf0a40778b2109c386'] = 'Chiave commerciante sembra essere sbagliata'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a1ffd2dc2538ea3093532029514d42ac'] = 'In primo luogo, utilizza la pagina per testare il modulo, poi puoi utilizzare la modalità reale se va tutto bene. Non dimenticare di cambiare la chiave e l\'ID commerciante secondo la modalità!'; +$_MODULE['<{gcheckout}prestashop>gcheckout_650be61892bf690026089544abbd9d26'] = 'Modalità'; +$_MODULE['<{gcheckout}prestashop>gcheckout_7f80fcc452c2f1ed2bb51b39d0864df1'] = 'Reale'; +$_MODULE['<{gcheckout}prestashop>gcheckout_2652eec977dcb2a5aea85f5bec235b05'] = 'Sandbox'; +$_MODULE['<{gcheckout}prestashop>gcheckout_76055653a95e0a559b734ec322d89632'] = 'È possibile trovare queste chiavi nel tuo account Google Checkout> Impostazioni> Integrazione. Sandbox e modalità reale hanno entrambe queste chiavi.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_229a7ec501323b94db7ff3157a7623c9'] = 'ID commerciante'; +$_MODULE['<{gcheckout}prestashop>gcheckout_795acb9a0c89791314d3032fe65eeb92'] = 'Chiave commerciante'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a7ba8619e32091c343b340ec5b80e541'] = 'Se si spunta questa casella, gli acquirenti saranno in grado di vedere le spese di spedizione che hai configurato in Google Checkout nella pagina di acquisto.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_de6fa0b14f259108c4b38e5be0374f46'] = 'Usa spese di spedizione Google'; +$_MODULE['<{gcheckout}prestashop>gcheckout_74692aae1cff5dc9dfd44f8c4e0540ad'] = 'È possibile registrare la comunicazione server-to-server. I file di registro sono'; +$_MODULE['<{gcheckout}prestashop>gcheckout_be5d5d37542d75f93a87094459f76678'] = 'e'; +$_MODULE['<{gcheckout}prestashop>gcheckout_f2f19b2cbcb395e254ebb1d9bf7cccd4'] = 'Se lo attivi, assicurati di proteggerli mettendo un file. Htaccess nella stessa directory. Se dimentichi di farlo, sarà leggibile da tutti'; +$_MODULE['<{gcheckout}prestashop>gcheckout_b2d37ae1cedf42ff874289b721860af2'] = 'Archivi '; +$_MODULE['<{gcheckout}prestashop>gcheckout_38fb7d24e0d60a048f540ecb18e13376'] = 'Salva'; +$_MODULE['<{gcheckout}prestashop>gcheckout_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Informazioni'; +$_MODULE['<{gcheckout}prestashop>gcheckout_968913ba2d4e25f3589d4c612ecbaa8d'] = 'Per poter utilizzare il modulo Google Checkout, è necessario configurare il tuo account Google Checkout (account sandbox così come account live). Accedi a Google Checkout poi vai su Settings > Integration. L\'URL callback API è:'; +$_MODULE['<{gcheckout}prestashop>gcheckout_dba727a9adc372723baef4533a7fc9da'] = 'Il metodo di callback deve essere impostato su'; +$_MODULE['<{gcheckout}prestashop>gcheckout_0d46d15f70a7cfa670545b308c022840'] = 'Gli ordini devono essere posizionati con la stessa valuta del tuo account venditore. Carrelli in altre valute saranno convertiti se il cliente sceglie di pagare con questo modulo.'; +$_MODULE['<{gcheckout}prestashop>gcheckout_8dd85f4218069de952672fe3180dacdb'] = 'Paga con GoogleCheckout'; +$_MODULE['<{gcheckout}prestashop>gcheckout_ba794350deb07c0c96fe73bd12239059'] = 'Confezione'; +$_MODULE['<{gcheckout}prestashop>gcheckout_9f06b28a40790c4c4df5739bce3c1eb0'] = 'Costi di spedizione'; + +?> \ No newline at end of file diff --git a/modules/gcheckout/library/googlecart.php b/modules/gcheckout/library/googlecart.php new file mode 100644 index 000000000..8f505f2b7 --- /dev/null +++ b/modules/gcheckout/library/googlecart.php @@ -0,0 +1,1612 @@ +<?php +/* + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes used to build a shopping cart and submit it to Google Checkout + * @version $Id: googlecart.php 6844 2011-06-03 14:46:51Z dMetzger $ + */ + + define('MAX_DIGITAL_DESC', 1024); + + /** + * Creates a Google Checkout shopping cart and posts it + * to the google checkout sandbox or production environment + * Refer demo/cartdemo.php for different use case scenarios for this code + */ + class GoogleCart { + var $merchant_id; + var $merchant_key; + var $variant = false; + var $currency; + var $server_url; + var $schema_url; + var $base_url; + var $checkout_url; + var $checkout_diagnose_url; + var $request_url; + var $request_diagnose_url; + + var $cart_expiration = ""; + var $merchant_private_data = ""; + var $edit_cart_url = ""; + var $continue_shopping_url = ""; + var $request_buyer_phone = ""; + var $merchant_calculated_tax = ""; + var $merchant_calculations_url = ""; + var $accept_merchant_coupons = ""; + var $accept_gift_certificates = ""; + var $rounding_mode; + var $rounding_rule; + var $analytics_data; + + var $item_arr; + var $shipping_arr; + var $default_tax_rules_arr; + var $alternate_tax_tables_arr; + var $xml_data; + + var $googleAnalytics_id = false; + var $thirdPartyTackingUrl = false; + var $thirdPartyTackingParams = array(); + + // For HTML API Conversion + + // This tags are those that can be used more than once as a sub tag + // so a "-#" must be added always + /** + * used when using the html api + * tags that can be used more than once, so they need to be numbered + * ("-#" suffix) + */ + var $multiple_tags = array( + 'flat-rate-shipping' => array(), + 'merchant-calculated-shipping' => array(), + 'pickup' => array(), + 'parameterized-url' => array(), + 'url-parameter' => array(), + 'item' => array(), + 'us-state-area' => array('tax-area'), + 'us-zip-area' => array('tax-area'), + 'us-country-area' => array('tax-area'), + 'postal-area' => array('tax-area'), + 'alternate-tax-table' => array(), + 'world-area' => array('tax-area'), + 'default-tax-rule' => array(), + 'alternate-tax-rule' => array(), + 'gift-certificate-adjustment' => array(), + 'coupon-adjustment' => array(), + 'coupon-result' => array(), + 'gift-certificate-result' => array(), + 'method' => array(), + 'anonymous-address' => array(), + 'result' => array(), + 'string' => array(), + ); + + var $ignore_tags = array( + 'xmlns' => true, + 'checkout-shopping-cart' => true, + // Dont know how to translate these tag yet + 'merchant-private-data' => true, + 'merchant-private-item-data' => true, + ); + + + + /** + * Has all the logic to build the cart's xml (or html) request to be + * posted to google's servers. + * + * @param string $id the merchant id + * @param string $key the merchant key + * @param string $server_type the server type of the server to be used, one + * of 'sandbox' or 'production'. + * defaults to 'sandbox' + * @param string $currency the currency of the items to be added to the cart + * , as of now values can be 'USD' or 'GBP'. + * defaults to 'USD' + */ + function GoogleCart($id, $key, $server_type="sandbox", $currency="USD") { + $this->merchant_id = $id; + $this->merchant_key = $key; + $this->currency = $currency; + + if(strtolower($server_type) == "sandbox") { + $this->server_url = "https://sandbox.google.com/checkout/"; + } else { + $this->server_url= "https://checkout.google.com/"; + } + + + $this->schema_url = "http://checkout.google.com/schema/2"; + $this->base_url = $this->server_url . "api/checkout/v2/"; + $this->checkout_url = $this->base_url . "checkout/Merchant/" . $this->merchant_id; + $this->checkoutForm_url = $this->base_url . "checkoutForm/Merchant/" . $this->merchant_id; + + //The item, shipping and tax table arrays are initialized + $this->item_arr = array(); + $this->shipping_arr = array(); + $this->alternate_tax_tables_arr = array(); + } + + /** + * Sets the cart's expiration date + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_good-until-date <good-until-date>} + * + * @param string $cart_expire a string representing a date in the + * iso 8601 date and time format: {@link http://www.w3.org/TR/NOTE-datetime} + * + * @return void + */ + function SetCartExpiration($cart_expire) { + $this->cart_expiration = $cart_expire; + } + + /** + * Sets the merchant's private data. + * + * Google Checkout will return this data in the + * <merchant-calculation-callback> and the + * <new-order-notification> for the order. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_merchant-private-data <merchant-private-data>} + * + * @param MerchantPrivateData $data an object which contains the data to be + * sent as merchant-private-data + * + * @return void + */ + function SetMerchantPrivateData($data) { + $this->merchant_private_data = $data; + } + + /** + * Sets the url where the customer can edit his cart. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_edit-cart-url <edit-cart-url>} + * + * @param string $url the merchant's site edit cart url + * @return void + */ + function SetEditCartUrl($url) { + $this->edit_cart_url= $url; + } + + /** + * Sets the continue shopping url, which allows the customer to return +die(); + * to the merchant's site after confirming an order. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_continue-shopping-url <continue-shopping-url>} + * + * @param string $url the merchant's site continue shopping url + * @return void + */ + function SetContinueShoppingUrl($url) { + $this->continue_shopping_url = $url; + } + + /** + * Sets whether the customer must enter a phone number to complete an order. + * If set to true, the customer must enter a number, which Google Checkout + * will return in the new order notification for the order. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_request-buyer-phone-number <request-buyer-phone-number>} + * + * @param bool $req true if the customer's phone number is *required* + * to complete an order. + * defaults to false. + * @return void + */ + function SetRequestBuyerPhone($req) { + $this->request_buyer_phone = $this->_GetBooleanValue($req, "false"); + } + + /** + * Sets the information about calculations that will be performed by the + * merchant. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_merchant-calculations <merchant-calculations>} + * + * @param string $url the merchant calculations callback url + * @param bool $tax_option true if the merchant has to do tax calculations. + * defaults to false. + * @param bool $coupons true if the merchant accepts discount coupons. + * defaults to false. + * @param bool $gift_cert true if the merchant accepts gift certificates. + * defaults to false. + * @return void + */ + function SetMerchantCalculations($url, $tax_option = "false", + $coupons = "false", $gift_cert = "false") { + $this->merchant_calculations_url = $url; + $this->merchant_calculated_tax = $this->_GetBooleanValue($tax_option, "false"); + $this->accept_merchant_coupons = $this->_GetBooleanValue($coupons, "false"); + $this->accept_gift_certificates = $this->_GetBooleanValue($gift_cert, "false"); + } + + /** + * Add an item to the cart. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_item <item>} + * + * @param GoogleItem $google_item an object that represents an item + * (defined in googleitem.php) + * + * @return void + */ + function AddItem($google_item) { + $this->item_arr[] = $google_item; + } + + /** + * Add a shipping method to the cart. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_shipping-methods <shipping-methods>} + * + * @param object $ship an object that represents a shipping method, must be + * one of the methods defined in googleshipping.php + * + * @return void + */ + function AddShipping($ship) { + $this->shipping_arr[] = $ship; + } + + /** + * Add a default tax rule to the cart. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_default-tax-rule <default-tax-rule>} + * + * @param GoogleDefaultTaxRule $rules an object that represents a default + * tax rule (defined in googletax.php) + * + * @return void + */ + function AddDefaultTaxRules($rules) { + $this->default_tax_table = true; + $this->default_tax_rules_arr[] = $rules; + } + + /** + * Add an alternate tax table to the cart. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_alternate-tax-table <alternate-tax-table>} + * + * @param GoogleAlternateTaxTable $tax an object that represents an + * alternate tax table + * (defined in googletax.php) + * + * @return void + */ + function AddAlternateTaxTables($tax) { + $this->alternate_tax_tables_arr[] = $tax; + } + + /** + * Set the policy to be used to round monetary values. + * Rounding policy explanation here: + * {@link http://code.google.com/apis/checkout/developer/Google_Checkout_Rounding_Policy.html} + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_rounding-policy <rounding-policy>} + * + * @param string $mode one of "UP", "DOWN", "CEILING", "HALF_DOWN" + * or "HALF_EVEN", described here: {@link http://java.sun.com/j2se/1.5.0/docs/api/java/math/RoundingMode.html} + * @param string $rule one of "PER_LINE", "TOTAL" + * + * @return void + */ + function AddRoundingPolicy($mode, $rule) { + switch ($mode) { + case "UP": + case "DOWN": + case "CEILING": + case "HALF_UP": + case "HALF_DOWN": + case "HALF_EVEN": + $this->rounding_mode = $mode; + break; + default: + break; + } + switch ($rule) { + case "PER_LINE": + case "TOTAL": + $this->rounding_rule = $rule; + break; + default: + break; + } + } + + /** + * Set the google analytics data. + * + * {@link http://code.google.com/apis/checkout/developer/checkout_analytics_integration.html info on Checkout and Analytics integration} + * + * @param string $data the analytics data + * + * @return void + */ + function SetAnalyticsData($data) { + $this->analytics_data = $data; + } + + /** + * Add a google analytics tracking id. + * + * {@link http://code.google.com/apis/checkout/developer/checkout_analytics_integration.html info on Checkout and Analytics integration} + * + * @param string $GA_id the google analytics id + * + * @return void + */ + function AddGoogleAnalyticsTracking($GA_id) { + $this->googleAnalytics_id = $GA_id; + } + + /** + * Add third-party tracking to the cart + * + * Described here: + * {@link http://code.google.com/apis/checkout/developer/checkout_analytics_integration.html#googleCheckoutAnalyticsIntegrationAlternate} + * + * @param $tracking_attr_types attributes to be tracked, one of + * ('buyer-id', + * 'order-id', + * 'order-subtotal', + * 'order-subtotal-plus-tax', + * 'order-subtotal-plus-shipping', + * 'order-total', + * 'tax-amount', + * 'shipping-amount', + * 'coupon-amount', + * 'coupon-amount', + * 'billing-city', + * 'billing-region', + * 'billing-postal-code', + * 'billing-country-code', + * 'shipping-city', + * 'shipping-region', + * 'shipping-postal-code', + * 'shipping-country-code') + * More info http://code.google.com/apis/checkout/developer/checkout_pixel_tracking.html#googleCheckout_tag_url-parameter + */ + function AddThirdPartyTracking($url, $tracking_param_types = array()) { + $this->thirdPartyTackingUrl = $url; + $this->thirdPartyTackingParams = $tracking_param_types; + } + + /** + * Builds the cart's xml to be sent to Google Checkout. + * + * @return string the cart's xml + */ + function GetXML() { + require_once('xml-processing/gc_xmlbuilder.php'); + + $xml_data = new gc_XmlBuilder(); + + $xml_data->Push('checkout-shopping-cart', + array('xmlns' => $this->schema_url)); + $xml_data->Push('shopping-cart'); + + //Add cart expiration if set + if($this->cart_expiration != "") { + $xml_data->Push('cart-expiration'); + $xml_data->Element('good-until-date', $this->cart_expiration); + $xml_data->Pop('cart-expiration'); + } + + //Add XML data for each of the items + $xml_data->Push('items'); + foreach($this->item_arr as $item) { + $xml_data->Push('item'); + $xml_data->Element('item-name', $item->item_name); + $xml_data->Element('item-description', $item->item_description); + $xml_data->Element('unit-price', $item->unit_price, + array('currency' => $this->currency)); + $xml_data->Element('quantity', $item->quantity); + if($item->merchant_private_item_data != '') { +// echo get_class($item->merchant_private_item_data); + if(is_a($item->merchant_private_item_data, + 'merchantprivate')) { + $item->merchant_private_item_data->AddMerchantPrivateToXML($xml_data); + } + else { + $xml_data->Element('merchant-private-item-data', + $item->merchant_private_item_data); + } + } + if($item->merchant_item_id != '') + $xml_data->Element('merchant-item-id', $item->merchant_item_id); + if($item->tax_table_selector != '') + $xml_data->Element('tax-table-selector', $item->tax_table_selector); +// Carrier calculation + if($item->item_weight != '' && $item->numeric_weight !== '') { + $xml_data->EmptyElement('item-weight', array( 'unit' => $item->item_weight, + 'value' => $item->numeric_weight + )); + } +// New Digital Delivery Tags + if($item->digital_content) { + $xml_data->push('digital-content'); + if(!empty($item->digital_url)) { + $xml_data->element('description', substr($item->digital_description, + 0, MAX_DIGITAL_DESC)); + $xml_data->element('url', $item->digital_url); +// To avoid NULL key message in GC confirmation Page + if(!empty($item->digital_key)) { + $xml_data->element('key', $item->digital_key); + } + } + else { + $xml_data->element('email-delivery', + $this->_GetBooleanValue($item->email_delivery, "true")); + } + $xml_data->pop('digital-content'); + } + $xml_data->Pop('item'); + } + $xml_data->Pop('items'); + + if($this->merchant_private_data != '') { + if (is_object($this->merchant_private_data) && get_class($this->merchant_private_data) == 'merchantprivate') { + $this->merchant_private_data->AddMerchantPrivateToXML($xml_data); + } + else { + $xml_data->Element('merchant-private-data', + $this->merchant_private_data); + } + } + $xml_data->Pop('shopping-cart'); + + $xml_data->Push('checkout-flow-support'); + $xml_data->Push('merchant-checkout-flow-support'); + if($this->edit_cart_url != '') + $xml_data->Element('edit-cart-url', $this->edit_cart_url); + if($this->continue_shopping_url != '') + $xml_data->Element('continue-shopping-url', + $this->continue_shopping_url); + + if(count($this->shipping_arr) > 0) + $xml_data->Push('shipping-methods'); + + //Add the shipping methods + foreach($this->shipping_arr as $ship) { + //Pickup shipping handled in else part + if($ship->type == "flat-rate-shipping" || + $ship->type == "merchant-calculated-shipping" +// If shipping-company calc support addr-filtering and shipping restrictions as a subatag of shipping-company-calculated-shipping +// ||$ship->type == "shipping-company-calculated-shipping" + ) { + $xml_data->Push($ship->type, array('name' => $ship->name)); + $xml_data->Element('price', $ship->price, + array('currency' => $this->currency)); + + $shipping_restrictions = $ship->shipping_restrictions; + if (isset($shipping_restrictions)) { + $xml_data->Push('shipping-restrictions'); + + if ($shipping_restrictions->allow_us_po_box === true) { + $xml_data->Element('allow-us-po-box', "true"); + } else { + $xml_data->Element('allow-us-po-box', "false"); + } + + //Check if allowed restrictions specified + if($shipping_restrictions->allowed_restrictions) { + $xml_data->Push('allowed-areas'); + if($shipping_restrictions->allowed_country_area != "") + $xml_data->EmptyElement('us-country-area', + array('country-area' => + $shipping_restrictions->allowed_country_area)); + foreach($shipping_restrictions->allowed_state_areas_arr as $current) { + $xml_data->Push('us-state-area'); + $xml_data->Element('state', $current); + $xml_data->Pop('us-state-area'); + } + foreach($shipping_restrictions->allowed_zip_patterns_arr as $current) { + $xml_data->Push('us-zip-area'); + $xml_data->Element('zip-pattern', $current); + $xml_data->Pop('us-zip-area'); + } + if($shipping_restrictions->allowed_world_area === true) { + $xml_data->EmptyElement('world-area'); + } + for($i=0; $i<count($shipping_restrictions->allowed_country_codes_arr); $i++) { + $xml_data->Push('postal-area'); + $country_code = $shipping_restrictions->allowed_country_codes_arr[$i]; + $postal_pattern = $shipping_restrictions->allowed_postal_patterns_arr[$i]; + $xml_data->Element('country-code', $country_code); + if ($postal_pattern != "") { + $xml_data->Element('postal-code-pattern', $postal_pattern); + } + $xml_data->Pop('postal-area'); + } + $xml_data->Pop('allowed-areas'); + } + + if($shipping_restrictions->excluded_restrictions) { + if (!$shipping_restrictions->allowed_restrictions) { + $xml_data->EmptyElement('allowed-areas'); + } + $xml_data->Push('excluded-areas'); + if($shipping_restrictions->excluded_country_area != "") + $xml_data->EmptyElement('us-country-area', + array('country-area' => + $shipping_restrictions->excluded_country_area)); + foreach($shipping_restrictions->excluded_state_areas_arr as $current) { + $xml_data->Push('us-state-area'); + $xml_data->Element('state', $current); + $xml_data->Pop('us-state-area'); + } + foreach($shipping_restrictions->excluded_zip_patterns_arr as $current) { + $xml_data->Push('us-zip-area'); + $xml_data->Element('zip-pattern', $current); + $xml_data->Pop('us-zip-area'); + } + for($i=0; $i<count($shipping_restrictions->excluded_country_codes_arr); $i++) { + $xml_data->Push('postal-area'); + $country_code = $shipping_restrictions->excluded_country_codes_arr[$i]; + $postal_pattern = $shipping_restrictions->excluded_postal_patterns_arr[$i]; + $xml_data->Element('country-code', $country_code); + if ($postal_pattern != "") { + $xml_data->Element('postal-code-pattern', $postal_pattern); + } + $xml_data->Pop('postal-area'); + } + $xml_data->Pop('excluded-areas'); + } + $xml_data->Pop('shipping-restrictions'); + } + + if ($ship->type == "merchant-calculated-shipping") { + $address_filters = $ship->address_filters; + if (isset($address_filters)) { + $xml_data->Push('address-filters'); + + if ($address_filters->allow_us_po_box === true) { + $xml_data->Element('allow-us-po-box', "true"); + } else { + $xml_data->Element('allow-us-po-box', "false"); + } + + //Check if allowed restrictions specified + if($address_filters->allowed_restrictions) { + $xml_data->Push('allowed-areas'); + if($address_filters->allowed_country_area != "") + $xml_data->EmptyElement('us-country-area', + array('country-area' => + $address_filters->allowed_country_area)); + foreach($address_filters->allowed_state_areas_arr as $current) { + $xml_data->Push('us-state-area'); + $xml_data->Element('state', $current); + $xml_data->Pop('us-state-area'); + } + foreach($address_filters->allowed_zip_patterns_arr as $current) { + $xml_data->Push('us-zip-area'); + $xml_data->Element('zip-pattern', $current); + $xml_data->Pop('us-zip-area'); + } + if($address_filters->allowed_world_area === true) { + $xml_data->EmptyElement('world-area'); + } + for($i=0; $i<count($address_filters->allowed_country_codes_arr); $i++) { + $xml_data->Push('postal-area'); + $country_code = $address_filters->allowed_country_codes_arr[$i]; + $postal_pattern = $address_filters->allowed_postal_patterns_arr[$i]; + $xml_data->Element('country-code', $country_code); + if ($postal_pattern != "") { + $xml_data->Element('postal-code-pattern', $postal_pattern); + } + $xml_data->Pop('postal-area'); + } + $xml_data->Pop('allowed-areas'); + } + + if($address_filters->excluded_restrictions) { + if (!$address_filters->allowed_restrictions) { + $xml_data->EmptyElement('allowed-areas'); + } + $xml_data->Push('excluded-areas'); + if($address_filters->excluded_country_area != "") + $xml_data->EmptyElement('us-country-area', + array('country-area' => + $address_filters->excluded_country_area)); + foreach($address_filters->excluded_state_areas_arr as $current) { + $xml_data->Push('us-state-area'); + $xml_data->Element('state', $current); + $xml_data->Pop('us-state-area'); + } + foreach($address_filters->excluded_zip_patterns_arr as $current) { + $xml_data->Push('us-zip-area'); + $xml_data->Element('zip-pattern', $current); + $xml_data->Pop('us-zip-area'); + } + for($i=0; $i<count($address_filters->excluded_country_codes_arr); $i++) { + $xml_data->Push('postal-area'); + $country_code = $address_filters->excluded_country_codes_arr[$i]; + $postal_pattern = $address_filters->excluded_postal_patterns_arr[$i]; + $xml_data->Element('country-code', $country_code); + if ($postal_pattern != "") { + $xml_data->Element('postal-code-pattern', $postal_pattern); + } + $xml_data->Pop('postal-area'); + } + $xml_data->Pop('excluded-areas'); + } + $xml_data->Pop('address-filters'); + } + } + $xml_data->Pop($ship->type); + } + else if ($ship->type == "carrier-calculated-shipping"){ +// $xml_data->Push($ship->type, array('name' => $ship->name)); + $xml_data->Push($ship->type); + $xml_data->Push('carrier-calculated-shipping-options'); + $CCSoptions = $ship->CarrierCalculatedShippingOptions; + foreach($CCSoptions as $CCSoption){ + $xml_data->Push('carrier-calculated-shipping-option'); + $xml_data->Element('price', $CCSoption->price, + array('currency' => $this->currency)); + $xml_data->Element('shipping-company', $CCSoption->shipping_company); + $xml_data->Element('shipping-type', $CCSoption->shipping_type); + $xml_data->Element('carrier-pickup', $CCSoption->carrier_pickup); + if(!empty($CCSoption->additional_fixed_charge)) { + $xml_data->Element('additional-fixed-charge', + $CCSoption->additional_fixed_charge, + array('currency' => $this->currency)); + } + if(!empty($CCSoption->additional_variable_charge_percent)) { + $xml_data->Element('additional-variable-charge-percent', + $CCSoption->additional_variable_charge_percent); + } + $xml_data->Pop('carrier-calculated-shipping-option'); + } + $xml_data->Pop('carrier-calculated-shipping-options'); +// $ShippingPackage = $ship->ShippingPackage; + $xml_data->Push('shipping-packages'); + $xml_data->Push('shipping-package'); + $xml_data->Push('ship-from', array('id' => $ship->ShippingPackage->ship_from->id)); + $xml_data->Element('city', $ship->ShippingPackage->ship_from->city); + $xml_data->Element('region', $ship->ShippingPackage->ship_from->region); + $xml_data->Element('postal-code', $ship->ShippingPackage->ship_from->postal_code); + $xml_data->Element('country-code', $ship->ShippingPackage->ship_from->country_code); + $xml_data->Pop('ship-from'); + + $xml_data->EmptyElement('width', array('unit' => $ship->ShippingPackage->unit, + 'value' => $ship->ShippingPackage->width + )); + $xml_data->EmptyElement('length', array('unit' => $ship->ShippingPackage->unit, + 'value' => $ship->ShippingPackage->length + )); + $xml_data->EmptyElement('height', array('unit' => $ship->ShippingPackage->unit, + 'value' => $ship->ShippingPackage->height + )); + $xml_data->Element('delivery-address-category', + $ship->ShippingPackage->delivery_address_category); + $xml_data->Pop('shipping-package'); + $xml_data->Pop('shipping-packages'); + + $xml_data->Pop($ship->type); + } + else if ($ship->type == "pickup") { + $xml_data->Push('pickup', array('name' => $ship->name)); + $xml_data->Element('price', $ship->price, + array('currency' => $this->currency)); + $xml_data->Pop('pickup'); + } + } + if(count($this->shipping_arr) > 0) + $xml_data->Pop('shipping-methods'); + + if($this->request_buyer_phone != "") + $xml_data->Element('request-buyer-phone-number', + $this->request_buyer_phone); + + if($this->merchant_calculations_url != "") { + $xml_data->Push('merchant-calculations'); + $xml_data->Element('merchant-calculations-url', + $this->merchant_calculations_url); + if($this->accept_merchant_coupons != "") { + $xml_data->Element('accept-merchant-coupons', + $this->accept_merchant_coupons); + } + if($this->accept_gift_certificates != "") { + $xml_data->Element('accept-gift-certificates', + $this->accept_gift_certificates); + } + $xml_data->Pop('merchant-calculations'); + } + //Set Third party Tracking + if($this->thirdPartyTackingUrl) { + $xml_data->push('parameterized-urls'); + $xml_data->push('parameterized-url', + array('url' => $this->thirdPartyTackingUrl)); + if(is_array($this->thirdPartyTackingParams) + && count($this->thirdPartyTackingParams)>0) { + $xml_data->push('parameters'); + foreach($this->thirdPartyTackingParams as $tracking_param_name => + $tracking_param_type) { + $xml_data->emptyElement('url-parameter', + array('name' => $tracking_param_name, + 'type' => $tracking_param_type)); + } + $xml_data->pop('parameters'); + } + $xml_data->pop('parameterized-url'); + $xml_data->pop('parameterized-urls'); + } + + //Set Default and Alternate tax tables + if( (count($this->alternate_tax_tables_arr) != 0) + || (count($this->default_tax_rules_arr) != 0)) { + if($this->merchant_calculated_tax != "") { + $xml_data->Push('tax-tables', + array('merchant-calculated' => $this->merchant_calculated_tax)); + } + else { + $xml_data->Push('tax-tables'); + } + if(count($this->default_tax_rules_arr) != 0) { + $xml_data->Push('default-tax-table'); + $xml_data->Push('tax-rules'); + foreach($this->default_tax_rules_arr as $curr_rule) { + + if($curr_rule->country_area != "") { + $xml_data->Push('default-tax-rule'); + $xml_data->Element('shipping-taxed', $curr_rule->shipping_taxed); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->EmptyElement('us-country-area', + array('country-area' => $curr_rule->country_area)); + $xml_data->Pop('tax-area'); + $xml_data->Pop('default-tax-rule'); + } + + foreach($curr_rule->state_areas_arr as $current) { + $xml_data->Push('default-tax-rule'); + $xml_data->Element('shipping-taxed', $curr_rule->shipping_taxed); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->Push('us-state-area'); + $xml_data->Element('state', $current); + $xml_data->Pop('us-state-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('default-tax-rule'); + } + + foreach($curr_rule->zip_patterns_arr as $current) { + $xml_data->Push('default-tax-rule'); + $xml_data->Element('shipping-taxed', $curr_rule->shipping_taxed); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->Push('us-zip-area'); + $xml_data->Element('zip-pattern', $current); + $xml_data->Pop('us-zip-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('default-tax-rule'); + } + + for($i=0; $i<count($curr_rule->country_codes_arr); $i++) { + $xml_data->Push('default-tax-rule'); + $xml_data->Element('shipping-taxed', $curr_rule->shipping_taxed); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->Push('postal-area'); + $country_code = $curr_rule->country_codes_arr[$i]; + $postal_pattern = $curr_rule->postal_patterns_arr[$i]; + $xml_data->Element('country-code', $country_code); + if ($postal_pattern != "") { + $xml_data->Element('postal-code-pattern', $postal_pattern); + } + $xml_data->Pop('postal-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('default-tax-rule'); + } + + if ($curr_rule->world_area === true) { + $xml_data->Push('default-tax-rule'); + $xml_data->Element('shipping-taxed', $curr_rule->shipping_taxed); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->EmptyElement('world-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('default-tax-rule'); + } + } + $xml_data->Pop('tax-rules'); + $xml_data->Pop('default-tax-table'); + } + + if(count($this->alternate_tax_tables_arr) != 0) { + $xml_data->Push('alternate-tax-tables'); + foreach($this->alternate_tax_tables_arr as $curr_table) { + $xml_data->Push('alternate-tax-table', + array('standalone' => $curr_table->standalone, + 'name' => $curr_table->name)); + $xml_data->Push('alternate-tax-rules'); + + foreach($curr_table->tax_rules_arr as $curr_rule) { + if($curr_rule->country_area != "") { + $xml_data->Push('alternate-tax-rule'); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->EmptyElement('us-country-area', + array('country-area' => $curr_rule->country_area)); + $xml_data->Pop('tax-area'); + $xml_data->Pop('alternate-tax-rule'); + } + + foreach($curr_rule->state_areas_arr as $current) { + $xml_data->Push('alternate-tax-rule'); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->Push('us-state-area'); + $xml_data->Element('state', $current); + $xml_data->Pop('us-state-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('alternate-tax-rule'); + } + + foreach($curr_rule->zip_patterns_arr as $current) { + $xml_data->Push('alternate-tax-rule'); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->Push('us-zip-area'); + $xml_data->Element('zip-pattern', $current); + $xml_data->Pop('us-zip-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('alternate-tax-rule'); + } + + for($i=0; $i<count($curr_rule->country_codes_arr); $i++) { + $xml_data->Push('alternate-tax-rule'); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->Push('postal-area'); + $country_code = $curr_rule->country_codes_arr[$i]; + $postal_pattern = $curr_rule->postal_patterns_arr[$i]; + $xml_data->Element('country-code', $country_code); + if ($postal_pattern != "") { + $xml_data->Element('postal-code-pattern', $postal_pattern); + } + $xml_data->Pop('postal-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('alternate-tax-rule'); + } + + if ($curr_rule->world_area === true) { + $xml_data->Push('alternate-tax-rule'); + $xml_data->Element('rate', $curr_rule->tax_rate); + $xml_data->Push('tax-area'); + $xml_data->EmptyElement('world-area'); + $xml_data->Pop('tax-area'); + $xml_data->Pop('alternate-tax-rule'); + } + } + $xml_data->Pop('alternate-tax-rules'); + $xml_data->Pop('alternate-tax-table'); + } + $xml_data->Pop('alternate-tax-tables'); + } + $xml_data->Pop('tax-tables'); + } + + if (($this->rounding_mode != "") && ($this->rounding_rule != "")) { + $xml_data->Push('rounding-policy'); + $xml_data->Element('mode', $this->rounding_mode); + $xml_data->Element('rule', $this->rounding_rule); + $xml_data->Pop('rounding-policy'); + } + if($this->analytics_data != ''){ + $xml_data->Element('analytics-data', $this->analytics_data); + } + + $xml_data->Pop('merchant-checkout-flow-support'); + $xml_data->Pop('checkout-flow-support'); + $xml_data->Pop('checkout-shopping-cart'); + + return $xml_data->GetXML(); + } + + /** + * Set the Google Checkout button's variant. + * {@link http://code.google.com/apis/checkout/developer/index.html#google_checkout_buttons} + * + * @param bool $variant true for an enabled button, false for a + * disabled one + * + * @return void + */ + function SetButtonVariant($variant) { + switch ($variant) { + case false: + $this->variant = "disabled"; + break; + case true: + default: + $this->variant = "text"; + break; + } + } + + /** + * Submit a server-to-server request. + * Creates a GoogleRequest object (defined in googlerequest.php) and sends + * it to the Google Checkout server. + * + * more info: + * {@link http://code.google.com/apis/checkout/developer/index.html#alternate_technique} + * + * @return array with the returned http status code (200 if OK) in index 0 + * and the redirect url returned by the server in index 1 + */ + function CheckoutServer2Server($proxy=array(), $certPath='') + { + ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'.'); + require_once('library/googlerequest.php'); + $GRequest = new GoogleRequest($this->merchant_id, + $this->merchant_key, + $this->server_url=="https://checkout.google.com/"? + "Production":"sandbox", + $this->currency); + $GRequest->SetProxy($proxy); + $GRequest->SetCertificatePath($certPath); + return $GRequest->SendServer2ServerCart($this->GetXML()); + } + + /** + * Get the Google Checkout button's html to be used in a server-to-server + * request. + * + * {@link http://code.google.com/apis/checkout/developer/index.html#google_checkout_buttons} + * + * @param string $url the merchant's site url where the form will be posted + * to + * @param string $size the size of the button, one of 'large', 'medium' or + * 'small'. + * defaults to 'large' + * @param bool $variant true for an enabled button, false for a + * disabled one. defaults to true. will be ignored if + * SetButtonVariant() was used before. + * @param string $loc the locale of the button's text, the only valid value + * is 'en_US' (used as default) + * @param bool $showtext whether to show Google Checkout text or not, + * defaults to true. + * @param string $style the background style of the button, one of 'white' + * or 'trans'. defaults to "trans" + * + * @return string the button's html + */ + function CheckoutServer2ServerButton($url, $size="large", $variant=true, + $loc="en_US",$showtext=true, $style="trans") { + + switch (strtolower($size)) { + case "medium": + $width = "168"; + $height = "44"; + break; + + case "small": + $width = "160"; + $height = "43"; + break; + case "large": + default: + $width = "180"; + $height = "46"; + break; + } + + if($this->variant == false) { + switch ($variant) { + case false: + $this->variant = "disabled"; + break; + case true: + default: + $this->variant = "text"; + break; + } + } + $data = "<div style=\"width: ".$width."px\">"; + if ($this->variant == "text") + { + $data .= "<div align=center><form method=\"POST\" action=\"". + $url . "\"" . ($this->googleAnalytics_id? + " onsubmit=\"setUrchinInputCode();\"":"") . "> + <input type=\"image\" name=\"Checkout\" alt=\"Checkout\" + src=\"". $this->server_url."buttons/checkout.gif?merchant_id=" . + $this->merchant_id."&w=".$width. "&h=".$height."&style=". + $style."&variant=".$this->variant."&loc=".$loc."\" + height=\"".$height."\" width=\"".$width. "\" />"; + + if($this->googleAnalytics_id) + { + $data .= "<input type=\"hidden\" name=\"analyticsdata\" value=\"\">"; + } + $data .= "</form></div>"; + if($this->googleAnalytics_id) + { + $data .= "<!-- Start Google analytics --> + <script src=\"https://ssl.google-analytics.com/urchin.js\" type=\"". + "text/javascript\"> + </script> + <script type=\"text/javascript\"> + _uacct = \"" . $this->googleAnalytics_id . "\"; + urchinTracker(); + </script> + <script src=\"https://checkout.google.com/files/digital/urchin_po" . + "st.js\" type=\"text/javascript\"></script> + <!-- End Google analytics -->"; + } + } + else + { + $data .= "<div><img alt=\"Checkout\" src=\"" . + "". $this->server_url."buttons/checkout.gif?merchant_id=" . + "".$this->merchant_id."&w=".$width. "&h=".$height."&style=".$style. + "&variant=".$this->variant."&loc=".$loc."\" height=\"".$height."\"". + " width=\"".$width. "\" /></div>"; + + } + $data .= "</div>"; + return $data; + } + + /** + * Get the Google Checkout button's html. + * + * {@link http://code.google.com/apis/checkout/developer/index.html#google_checkout_buttons} + * + * @param string $size the size of the button, one of 'large', 'medium' or + * 'small'. + * defaults to 'large' + * @param bool $variant true for an enabled button, false for a + * disabled one. defaults to true. will be ignored if + * SetButtonVariant() was used before. + * @param string $loc the locale of the button's text, the only valid value + * is 'en_US' (used as default) + * @param bool $showtext whether to show Google Checkout text or not, + * defaults to true. + * @param string $style the background style of the button, one of 'white' + * or 'trans'. defaults to "trans" + * + * @return string the button's html + */ + function CheckoutButtonCode($size="large", $variant=true, $loc="en_US", + $showtext=true, $style="trans") { + + switch (strtolower($size)) { + case "medium": + $width = "168"; + $height = "44"; + break; + + case "small": + $width = "160"; + $height = "43"; + break; + case "large": + default: + $width = "180"; + $height = "46"; + break; + } + + if($this->variant == false) { + switch ($variant) { + case false: + $this->variant = "disabled"; + break; + case true: + default: + $this->variant = "text"; + break; + } + } + + + $data = ""; + if ($this->variant == "text") + { + $data .= " + <form id=\"gcheckout_form\" method=\"POST\" action=\"". + $this->checkout_url . "\"" . ($this->googleAnalytics_id? + " onsubmit=\"setUrchinInputCode();\"":"") . "> + <input type=\"hidden\" name=\"cart\" value=\"". + base64_encode($this->GetXML()) ."\"> + <input type=\"hidden\" name=\"signature\" value=\"". + base64_encode($this->CalcHmacSha1($this->GetXML())). "\"> + "; + + if ($this->googleAnalytics_id) + { + $data .= "<input type=\"hidden\" name=\"analyticsdata\" value=\"\">"; + } + $data .= "</form>"; + if ($this->googleAnalytics_id) + { + $data .= "<!-- Start Google analytics --> + <script src=\"https://ssl.google-analytics.com/urchin.js\" type=\"". + "text/javascript\"> + </script> + <script type=\"text/javascript\"> + _uacct = \"" . $this->googleAnalytics_id . "\"; + urchinTracker(); + </script> + <script src=\"https://checkout.google.com/files/digital/urchin_po" . + "st.js\" type=\"text/javascript\"></script> + <!-- End Google analytics -->"; + } + } + else + { + $data .= "<div><img alt=\"Checkout\" src=\"" . + "". $this->server_url."buttons/checkout.gif?merchant_id=" . + "".$this->merchant_id."&w=".$width. "&h=".$height."&style=".$style. + "&variant=".$this->variant."&loc=".$loc."\" height=\"".$height."\"". + " width=\"".$width. "\" /></div>"; + } + return $data; + } + //Code for generating Checkout button + //@param $variant will be ignored if SetButtonVariant() was used before + function CheckoutButtonNowCode($size="large", $variant=true, $loc="en_US", + $showtext=true, $style="trans") { + + switch (strtolower($size)) { + case "small": + $width = "121"; + $height = "44"; + break; + case "large": + default: + $width = "117"; + $height = "48"; + break; + } + + if($this->variant == false) { + switch ($variant) { + case false: + $this->variant = "disabled"; + break; + case true: + default: + $this->variant = "text"; + break; + } + } + + + + $data = "<div style=\"width: ".$width."px\">"; + if ($this->variant == "text") { + $data .= "<div align=center><form method=\"POST\" action=\"". + $this->checkout_url . "\"" . ($this->googleAnalytics_id? + " onsubmit=\"setUrchinInputCode();\"":"") . "> + <input type=\"hidden\" name=\"buyButtonCart\" value=\"". + base64_encode($this->GetXML()) ."//separator//" . + base64_encode($this->CalcHmacSha1($this->GetXML())) . "\"> + <input type=\"image\" name=\"Checkout\" alt=\"BuyNow\" + src=\"". $this->server_url."buttons/buy.gif?merchant_id=" . + $this->merchant_id."&w=".$width. "&h=".$height."&style=". + $style."&variant=".$this->variant."&loc=".$loc."\" + height=\"".$height."\" width=\"".$width. "\" />"; + + if($this->googleAnalytics_id) { + $data .= "<input type=\"hidden\" name=\"analyticsdata\" value=\"\">"; + } + $data .= "</form></div>"; + if($this->googleAnalytics_id) { + $data .= "<!-- Start Google analytics --> + <script src=\"https://ssl.google-analytics.com/urchin.js\" type=\"". + "text/javascript\"> + </script> + <script type=\"text/javascript\"> + _uacct = \"" . $this->googleAnalytics_id . "\"; + urchinTracker(); + </script> + <script src=\"https://checkout.google.com/files/digital/urchin_po" . + "st.js\" type=\"text/javascript\"></script> + <!-- End Google analytics -->"; + } +// ask for link to BuyNow disable button + } else { + $data .= "<div><img alt=\"Checkout\" src=\"" . + "". $this->server_url."buttons/buy.gif?merchant_id=" . + "".$this->merchant_id."&w=".$width. "&h=".$height."&style=".$style. + "&variant=".$this->variant."&loc=".$loc."\" height=\"".$height."\"". + " width=\"".$width. "\" /></div>"; + } + if($showtext) { + $data .="<div align=\"center\"><a href=\"javascript:void(window.ope". + "n('http://checkout.google.com/seller/what_is_google_checkout.html'" . + ",'whatischeckout','scrollbars=0,resizable=1,directories=0,height=2" . + "50,width=400'));\" onmouseover=\"return window.status = 'What is G" . + "oogle Checkout?'\" onmouseout=\"return window.status = ''\"><font " . + "size=\"-2\">What is Google Checkout?</font></a></div>"; + } + $data .= "</div>"; + return $data; + } + + + /** + * Get the Google Checkout button's html to be used with the html api. + * + * {@link http://code.google.com/apis/checkout/developer/index.html#google_checkout_buttons} + * + * @param string $size the size of the button, one of 'large', 'medium' or + * 'small'. + * defaults to 'large' + * @param bool $variant true for an enabled button, false for a + * disabled one. defaults to true. will be ignored if + * SetButtonVariant() was used before. + * @param string $loc the locale of the button's text, the only valid value + * is 'en_US' (used as default) + * @param bool $showtext whether to show Google Checkout text or not, + * defaults to true. + * @param string $style the background style of the button, one of 'white' + * or 'trans'. defaults to "trans" + * + * @return string the button's html + */ + function CheckoutHTMLButtonCode($size="large", $variant=true, $loc="en_US", + $showtext=true, $style="trans") { + + switch (strtolower($size)) { + case "medium": + $width = "168"; + $height = "44"; + break; + + case "small": + $width = "160"; + $height = "43"; + break; + case "large": + default: + $width = "180"; + $height = "46"; + break; + } + + if($this->variant == false) { + switch ($variant) { + case false: + $this->variant = "disabled"; + break; + case true: + default: + $this->variant = "text"; + break; + } + } + + + $data = "<div style=\"width: ".$width."px\">"; + if ($this->variant == "text") { + $data .= "<div align=\"center\"><form method=\"POST\" action=\"". + $this->checkoutForm_url . "\"" . ($this->googleAnalytics_id? + " onsubmit=\"setUrchinInputCode();\"":"") . ">"; + + $request = $this->GetXML(); + require_once('xml-processing/gc_xmlparser.php'); + $xml_parser = new gc_xmlparser($request); + $root = $xml_parser->GetRoot(); + $XMLdata = $xml_parser->GetData(); + $this->xml2html($XMLdata[$root], '', $data); + $data .= "<input type=\"image\" name=\"Checkout\" alt=\"Checkout\" " . + "src=\"". $this->server_url."buttons/checkout.gif?merchant_id=". + $this->merchant_id."&w=".$width. "&h=".$height."&style=". + $style."&variant=".$this->variant."&loc=".$loc."\" + height=\"".$height."\" width=\"".$width. "\" />"; + + if($this->googleAnalytics_id) { + $data .= "<input type=\"hidden\" name=\"analyticsdata\" value=\"\">"; + } + $data .= "</form></div>"; + if($this->googleAnalytics_id) { + $data .= "<!-- Start Google analytics --> + <script src=\"https://ssl.google-analytics.com/urchin.js\" type=\"". + "text/javascript\"> + </script> + <script type=\"text/javascript\"> + _uacct = \"" . $this->googleAnalytics_id . "\"; + urchinTracker(); + </script> + <script src=\"https://checkout.google.com/files/digital/urchin_po" . + "st.js\" type=\"text/javascript\"></script> + <!-- End Google analytics -->"; + } + } else { + $data .= "<div align=\"center\"><img alt=\"Checkout\" src=\"" . + "". $this->server_url."buttons/checkout.gif?merchant_id=" . + "".$this->merchant_id."&w=".$width. "&h=".$height."&style=".$style. + "&variant=".$this->variant."&loc=".$loc."\" height=\"".$height."\"". + " width=\"".$width. "\" /></div>"; + } + if($showtext){ + $data .= "<div align=\"center\"><a href=\"javascript:void(window.ope" . + "n('http://checkout.google.com/seller/what_is_google_checkout.html'" . + ",'whatischeckout','scrollbars=0,resizable=1,directories=0,height=2" . + "50,width=400'));\" onmouseover=\"return window.status = 'What is G" . + "oogle Checkout?'\" onmouseout=\"return window.status = ''\"><font " . + "size=\"-2\">What is Google Checkout?</font></a></div>"; + } + $data .= "</div>"; + + + return $data; + + } + + /** + * @access private + */ + function xml2html($data, $path = '', &$rta){ +// global $multiple_tags,$ignore_tags; + // $arr = gc_get_arr_result($data); + foreach($data as $tag_name => $tag) { + if(isset($this->ignore_tags[$tag_name])){ + continue; + } + if(is_array($tag)){ + // echo print_r($tag, true) . $tag_name . "<- tag name\n"; + if(!$this->is_associative_array($data)) { + $new_path = $path . '-' . ($tag_name +1); + } else { + if(isset($this->multiple_tags[$tag_name]) + && $this->is_associative_array($tag) + && !$this->isChildOf($path, $this->multiple_tags[$tag_name])){ + $tag_name .= '-1'; + } + $new_path = $path . (empty($path)?'':'.') . $tag_name; + } + $this->xml2html($tag, $new_path, $rta); + } + else { + $new_path = $path; + if($tag_name != 'VALUE'){ + $new_path = $path . "." . $tag_name; + } + $rta .= '<input type="hidden" name="' . + $new_path . '" value="' .$tag . '"/>'."\n"; + } + } + } + + // Returns true if a given variable represents an associative array + /** + * @access private + */ + function is_associative_array($var) { + return is_array($var) && !is_numeric(implode('', array_keys($var))); + } + + /** + * @access private + */ + function isChildOf($path='', $parents=array()){ + $intersect =array_intersect(explode('.',$path), $parents); + return !empty($intersect); + } + + /** + * Get the Google Checkout acceptance logos html + * + * {@link http://checkout.google.com/seller/acceptance_logos.html} + * + * @param integer $type the acceptance logo type, valid values: 1, 2, 3 + * + * @return string the logo's html + */ + function CheckoutAcceptanceLogo($type=1) { + switch ($type) { + case 2: + return '<link rel="stylesheet" href="https://checkout.google.com/' . + 'seller/accept/s.css" type="text/css" media="screen" /><scrip' . + 't type="text/javascript" src="https://checkout.google.com/se' . + 'ller/accept/j.js"></script><script type="text/javascript">sh' . + 'owMark(1);</script><noscript><img src="https://checkout.goog' . + 'le.com/seller/accept/images/st.gif" width="92" height="88" a' . + 'lt="Google Checkout Acceptance Mark" /></noscript>'; + break; + case 3: + return '<link rel="stylesheet" href="https://checkout.google.com/' . + 'seller/accept/s.css" type="text/css" media="screen" /><scrip' . + 't type="text/javascript" src="https://checkout.google.com/se' . + 'ller/accept/j.js"></script><script type="text/javascript">sh' . + 'owMark(2);</script><noscript><img src="https://checkout.goog' . + 'le.com/seller/accept/images/ht.gif" width="182" height="44" ' . + 'alt="Google Checkout Acceptance Mark" /></noscript>'; + break; + case 1: + default: + return '<link rel="stylesheet" href="https://checkout.google.com/' . + 'seller/accept/s.css" type="text/css" media="screen" /><scrip' . + 't type="text/javascript" src="https://checkout.google.com/se' . + 'ller/accept/j.js"></script><script type="text/javascript">sh' . + 'owMark(3);</script><noscript><img src="https://checkout.goog' . + 'le.com/seller/accept/images/sc.gif" width="72" height="73" a' . + 'lt="Google Checkout Acceptance Mark" /></noscript>'; + break; + } + } + + /** + * Calculates the cart's hmac-sha1 signature, this allows google to verify + * that the cart hasn't been tampered by a third-party. + * + * {@link http://code.google.com/apis/checkout/developer/index.html#create_signature} + * + * @param string $data the cart's xml + * @return string the cart's signature (in binary format) + */ + function CalcHmacSha1($data) { + $key = $this->merchant_key; + $blocksize = 64; + $hashfunc = 'sha1'; + if (strlen($key) > $blocksize) { + $key = pack('H*', $hashfunc($key)); + } + $key = str_pad($key, $blocksize, chr(0x00)); + $ipad = str_repeat(chr(0x36), $blocksize); + $opad = str_repeat(chr(0x5c), $blocksize); + $hmac = pack( + 'H*', $hashfunc( + ($key^$opad).pack( + 'H*', $hashfunc( + ($key^$ipad).$data + ) + ) + ) + ); + return $hmac; + } + + //Method used internally to set true/false cart variables + /** + * @access private + */ + function _GetBooleanValue($value, $default) { + switch(strtolower($value)){ + case "true": + return "true"; + break; + case "false": + return"false"; + break; + default: + return $default; + break; + } + } + //Method used internally to set true/false cart variables + // Deprecated, must NOT use eval, bug-prune function + /** + * @access private + */ + function _SetBooleanValue($string, $value, $default) { + $value = strtolower($value); + if($value == "true" || $value == "false") + eval('$this->'.$string.'="'.$value.'";'); + else + eval('$this->'.$string.'="'.$default.'";'); + } + } + + /** + * @abstract + * Abstract class that represents the merchant-private-data. + * + * See {@link MerchantPrivateData} and {@link MerchantPrivateItemData} + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_merchant-private-data <merchant-private-data>} + */ + class MerchantPrivate { + var $data; + var $type = "Abstract"; + function MerchantPrivate() { + } + + function AddMerchantPrivateToXML(&$xml_data) { + if(is_array($this->data)) { + $xml_data->Push($this->type); + $this->_recursiveAdd($xml_data, $this->data); + $xml_data->Pop($this->type); + } + else { + $xml_data->Element($this->type, (string)$this->data); + } + } + + /** + * @access private + */ + function _recursiveAdd(&$xml_data, $data){ + foreach($data as $name => $value) { + if(is_array($value)) { + $xml_data->Push($name); + $this->_recursiveAdd($xml_data, $name); + $xml_data->Pop($name); + } + else { + $xml_data->Element($name, (string)$value); + } + } + } + } + + /** + * Class that represents the merchant-private-data. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_merchant-private-data <merchant-private-data>} + */ + class MerchantPrivateData extends MerchantPrivate { + /** + * @param mixed $data a string with the data that will go in the + * merchant-private-data tag or an array that will + * be mapped to xml, formatted like (e.g.): + * array('my-order-id' => 34234, + * 'stuff' => array('registered' => 'yes', + * 'category' => 'hip stuff')) + * this will map to: + * <my-order-id> + * <stuff> + * <registered>yes</registered> + * <category>hip stuff</category> + * </stuff> + * </my-order-id> + */ + function MerchantPrivateData($data = array()) { + $this->data = $data; + $this->type = 'merchant-private-data'; + } + } + + /** + * Class that represents a merchant-private-item-data. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_merchant-private-item-data <merchant-private-data>} + */ + class MerchantPrivateItemData extends MerchantPrivate { + /** + * @param mixed $data a string with the data that will go in the + * merchant-private-item-data tag or an array that will + * be mapped to xml, formatted like: + * array('my-item-id' => 34234, + * 'stuff' => array('label' => 'cool', + * 'category' => 'hip stuff')) + * this will map to: + * <my-item-id> + * <stuff> + * <label>cool</label> + * <category>hip stuff</category> + * </stuff> + * </my-item-id> + */ + function MerchantPrivateItemData($data = array()) { + $this->data = $data; + $this->type = 'merchant-private-item-data'; + } + } diff --git a/modules/gcheckout/library/googleitem.php b/modules/gcheckout/library/googleitem.php new file mode 100644 index 000000000..8ab6ce8a6 --- /dev/null +++ b/modules/gcheckout/library/googleitem.php @@ -0,0 +1,161 @@ +<?php +/* + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Classes used to represent an item to be used for Google Checkout + * @version $Id: googleitem.php 6844 2011-06-03 14:46:51Z dMetzger $ + */ + + /** + * Creates an item to be added to the shopping cart. + * A new instance of the class must be created for each item to be added. + * + * Required fields are the item name, description, quantity and price + * The private-data and tax-selector for each item can be set in the + * constructor call or using individual Set functions + */ + class GoogleItem { + + var $item_name; + var $item_description; + var $unit_price; + var $quantity; + var $merchant_private_item_data; + var $merchant_item_id; + var $tax_table_selector; + var $email_delivery; + var $digital_content=false; + var $digital_description; + var $digital_key; + var $digital_url; + + var $item_weight; + var $numeric_weight; + + /** + * {@link http://code.google.com/apis/checkout/developer/index.html#tag_item <item>} + * + * @param string $name the name of the item -- required + * @param string $desc the description of the item -- required + * @param integer $qty the number of units of this item the customer has + * in its shopping cart -- required + * @param double $price the unit price of the item -- required + * @param string $item_weight the weight unit used to specify the item's + * weight, + * one of 'LB' (pounds) or 'KG' (kilograms) + * @param double $numeric_weight the weight of the item + * + */ + function GoogleItem($name, $desc, $qty, $price, $item_weight='', $numeric_weight='') { + $this->item_name = $name; + $this->item_description= $desc; + $this->unit_price = $price; + $this->quantity = $qty; + + if($item_weight != '' && $numeric_weight !== '') { + switch(strtoupper($item_weight)){ + case 'KG': + $this->item_weight = strtoupper($item_weight); + break; + case 'LB': + default: + $this->item_weight = 'LB'; + } + $this->numeric_weight = (double)$numeric_weight; + } + } + + function SetMerchantPrivateItemData($private_data) { + $this->merchant_private_item_data = $private_data; + } + + /** + * Set the merchant item id that the merchant uses to uniquely identify an + * item. Google Checkout will include this value in the + * merchant calculation callbacks + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_merchant-item-id <merchant-item-id>} + * + * @param mixed $item_id the value that identifies this item on the + * merchant's side + * + * @return void + */ + function SetMerchantItemId($item_id) { + $this->merchant_item_id = $item_id; + } + + /** + * Sets the tax table selector which identifies an alternate tax table that + * should be used to calculate tax for a particular item. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_tax-table-selector <tax-table-selector>} + * + * @param string $tax_selector this value should correspond to the name + * of an alternate-tax-table. + * + * @return void + */ + function SetTaxTableSelector($tax_selector) { + $this->tax_table_selector = $tax_selector; + } + + /** + * Used when the item's content is digital, sets whether the merchant will + * send an email to the buyer explaining how to access the digital content. + * Email delivery allows the merchant to charge the buyer for an order + * before allowing the buyer to access the digital content. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_email-delivery <email-delivery>} + * + * @param bool $email_delivery true if email_delivery applies, defaults to + * false + * + * @return void + */ + function SetEmailDigitalDelivery($email_delivery='false') { + $this->digital_url = ''; + $this->digital_key = ''; + $this->digital_description = ''; + $this->email_delivery = $email_delivery; + $this->digital_content=true; + } + + /** + * Sets the information related to the digital delivery of the item. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_digital-content <digital-content>} + * + * @param string $digital_url the url the customer must go to download the + * item. --optional + * @param string $digital_key the key which allows to download or unlock the + * digital content item -- optional + * @param string $digital_description instructions for downloading adigital + * content item, 1024 characters max, can + * contain xml-escaped HTML -- optional + * + * @return void + */ + function SetURLDigitalContent($digital_url, $digital_key, $digital_description) { + $this->digital_url = $digital_url; + $this->digital_key = $digital_key; + $this->digital_description = $digital_description; + $this->email_delivery = 'false'; + $this->digital_content = true; + } + } + diff --git a/modules/gcheckout/library/googlelog.php b/modules/gcheckout/library/googlelog.php new file mode 100644 index 000000000..93ea3c14c --- /dev/null +++ b/modules/gcheckout/library/googlelog.php @@ -0,0 +1,96 @@ +<?php +/** + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + // Log levels + define("L_OFF", 0); // No log + define("L_ERR", 1); // Log Errors + define("L_RQST", 2); // Log Request from GC + define("L_RESP", 4); // Log Resoponse To Google + define("L_ERR_RQST", L_ERR | L_RQST); + define("L_ALL", L_ERR | L_RQST | L_RESP); + +class GoogleLog { + + var $errorLogFile; + var $messageLogFile; + // L_ALL (err+requests+responses), L_ERR, L_RQST, L_RESP, L_OFF + var $logLevel = L_ERR_RQST; + + /** + * SetLogFiles + */ + function GoogleLog($errorLogFile, $messageLogFile, $logLevel=L_ERR_RQST, $die=true){ + $this->logLevel = $logLevel; + if($logLevel == L_OFF) { + $this->logLevel = L_OFF; + } else { + if (!$this->errorLogFile = @fopen($errorLogFile, "a")) { + header('HTTP/1.0 500 Internal Server Error'); + $log = "Cannot open " . $errorLogFile . " file.\n" . + "Logs are not writable, set them to 777"; + error_log($log, 0); + if($die) { + die($log); + }else { + echo $log; + $this->logLevel = L_OFF; + } + } + if (!$this->messageLogFile = @fopen($messageLogFile, "a")) { + fclose($this->errorLogFile); + header('HTTP/1.0 500 Internal Server Error'); + $log = "Cannot open " . $messageLogFile . " file.\n" . + "Logs are not writable, set them to 777"; + error_log($log, 0); + if($die) { + die($log); + }else { + echo $log; + $this->logLevel = L_OFF; + } + } + } + $this->logLevel = $logLevel; + } + + function LogError($log){ + if($this->logLevel & L_ERR){ + fwrite($this->errorLogFile, + sprintf("\n%s:- %s\n",date("D M j G:i:s T Y"),$log)); + return true; + } + return false; + } + + function LogRequest($log){ + if($this->logLevel & L_RQST){ + fwrite($this->messageLogFile, + sprintf("\n%s:- %s\n",date("D M j G:i:s T Y"),$log)); + return true; + } + return false; + } + + function LogResponse($log) { + if($this->logLevel & L_RESP){ + $this->LogRequest($log); + return true; + } + return false; + } +} + diff --git a/modules/gcheckout/library/googlemerchantcalculations.php b/modules/gcheckout/library/googlemerchantcalculations.php new file mode 100644 index 000000000..c5fe5c1eb --- /dev/null +++ b/modules/gcheckout/library/googlemerchantcalculations.php @@ -0,0 +1,115 @@ +<?php + +/* + * Copyright (C) 2006 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * Used to create the merchant callback results when a + * merchant-calculated feedback structure is received. + * + * Multiple results are generated depending on the possible + * combinations for shipping options and address ids + * + * More info: {@link http://code.google.com/apis/checkout/developer/index.html#understanding_merchant_calculation_results} + */ + // refer to demo/responsehandler.php for generating these results + class GoogleMerchantCalculations { + var $results_arr; + var $currency; + var $schema_url = "http://checkout.google.com/schema/2"; + + /** + * @param string $currency the currency used for the calculations, + * one of "USD" or "GBP" + * + * @return void + */ + function GoogleMerchantCalculations($currency = "USD") { + $this->results_arr = array(); + $this->currency = $currency; + } + + /** + * Add a result of a merchant calculation to the response to be sent. + * + * @param GoogleResult $results the result of a particular merchant + * calculation + * @return void + */ + function AddResult($results) { + $this->results_arr[] = $results; + } + + /** + * Builds the merchant calculation response xml to be sent to + * Google Checkout. + * + * @return string the response xml + */ + function GetXML() { + require_once('xml-processing/gc_xmlbuilder.php'); + + $xml_data = new gc_XmlBuilder(); + $xml_data->Push('merchant-calculation-results', + array('xmlns' => $this->schema_url)); + $xml_data->Push('results'); + + foreach($this->results_arr as $result) { + if($result->shipping_name != "") { + $xml_data->Push('result', array('shipping-name' => + $result->shipping_name, 'address-id' => $result->address_id)); + $xml_data->Element('shipping-rate', $result->ship_price, + array('currency' => $this->currency)); + $xml_data->Element('shippable', $result->shippable); + } else + $xml_data->Push('result', array('address-id' => $result->address_id)); + + if($result->tax_amount != "") + $xml_data->Element('total-tax', $result->tax_amount, + array('currency' => $this->currency)); + + if((count($result->coupon_arr) != 0) || + (count($result->giftcert_arr) != 0) ) { + $xml_data->Push('merchant-code-results'); + + foreach($result->coupon_arr as $curr_coupon) { + $xml_data->Push('coupon-result'); + $xml_data->Element('valid', $curr_coupon->coupon_valid); + $xml_data->Element('code', $curr_coupon->coupon_code); + $xml_data->Element('calculated-amount', $curr_coupon->coupon_amount, + array('currency'=> $this->currency)); + $xml_data->Element('message', $curr_coupon->coupon_message); + $xml_data->Pop('coupon-result'); + } + foreach($result->giftcert_arr as $curr_gift) { + $xml_data->Push('gift-result'); + $xml_data->Element('valid', $curr_gift->gift_valid); + $xml_data->Element('code', $curr_gift->gift_code); + $xml_data->Element('calculated-amount', $curr_gift->gift_amount, + array('currency'=> $this->currency)); + $xml_data->Element('message', $curr_gift->gift_message); + $xml_data->Pop('gift-result'); + } + $xml_data->Pop('merchant-code-results'); + } + $xml_data->Pop('result'); + } + $xml_data->Pop('results'); + $xml_data->Pop('merchant-calculation-results'); + return $xml_data->GetXML(); + } + } + diff --git a/modules/gcheckout/library/googlerequest.php b/modules/gcheckout/library/googlerequest.php new file mode 100644 index 000000000..4ae4a4c49 --- /dev/null +++ b/modules/gcheckout/library/googlerequest.php @@ -0,0 +1,757 @@ +<?php + +/* + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + + /** This class is instantiated everytime any notification or + * order processing commands are received. + * + * @version $Id: googlerequest.php 6844 2011-06-03 14:46:51Z dMetzger $ + * It has a SendReq function to post different requests to the Google Server + * Send functions are provided for most of the commands that are supported + * by the server for this code + */ + define('PHP_SAMPLE_CODE_VERSION', 'v1.2.5'); + define('ENTER', "\r\n"); + define('DOUBLE_ENTER', ENTER.ENTER); + // Max size of the Google Messsage string + define('GOOGLE_MESSAGE_LENGTH', 254); + define('GOOGLE_REASON_LENGTH', 140); + + /** + * Send requests to the Google Checkout server to perform different actions + */ + // refer demo/responsehandlerdemo.php for different use case scenarios + class GoogleRequest { + var $merchant_id; + var $merchant_key; + var $currency; + var $server_url; + var $schema_url; + var $base_url; + var $checkout_url; + var $checkout_diagnose_url; + var $request_url; + var $request_diagnose_url; + var $merchant_checkout; + var $proxy = array(); + + var $certPath=''; + var $log; + + /** + * @param string $id the merchant id + * @param string $key the merchant key + * @param string $server_type the server type of the server to be used, one + * of 'sandbox' or 'production'. + * defaults to 'sandbox' + * @param string $currency the currency of the items to be added to the cart + * , as of now values can be 'USD' or 'GBP'. + * defaults to 'USD' + */ + function GoogleRequest($id, $key, $server_type="sandbox", $currency="USD") { + $this->merchant_id = $id; + $this->merchant_key = $key; + $this->currency = $currency; + + if(strtolower($server_type) == "sandbox") { + $this->server_url = "https://sandbox.google.com/checkout/"; + } else { + $this->server_url = "https://checkout.google.com/"; + } + + + $this->schema_url = "http://checkout.google.com/schema/2"; + $this->base_url = $this->server_url . "api/checkout/v2/"; + $this->request_url = $this->base_url . "request/Merchant/" . $this->merchant_id; + $this->merchant_checkout = $this->base_url . "merchantCheckout/Merchant/" . $this->merchant_id; + + ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'.'); + require_once('googlelog.php'); + $this->log = new GoogleLog('', '', L_OFF); + + } + + function SetLogFiles($errorLogFile, $messageLogFile, $logLevel=L_ERR_RQST) { + $this->log = new GoogleLog($errorLogFile, $messageLogFile, $logLevel); + } + /** + * Submit a SetCertificatePath request. + * + * GC Accepted SSL Certs: + * {@link http://googlecheckoutapi.blogspot.com/2007/07/accepting-50-additional-ssl-root-cas.html} + * + * @param string $certPath The name of a file holding one or more certificates + * to verify the peer with + */ + + function SetCertificatePath($certPath) { + $this->certPath = $certPath; + } + + /** + * Submit a server-to-server request. + * + * more info: + * {@link http://code.google.com/apis/checkout/developer/index.html#alternate_technique} + * + * @param string $xml_cart the cart's xml + * @param bool $die whether to die() or not after performing the request, + * defaults to true + * + * @return array with the returned http status code (200 if OK) in index 0 + * and the redirect url returned by the server in index 1 + */ + public function SendServer2ServerCart($xml_cart, $die=true) { + list($status, $body) = $this->SendReq($this->merchant_checkout, + $this->GetAuthenticationHeaders(), $xml_cart); + if($status != 200 ){ + return array($status, $body); + } else { + ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'.'); + require_once('xml-processing/gc_xmlparser.php'); + + $xml_parser = new gc_xmlparser($body); + $root = $xml_parser->GetRoot(); + $data = $xml_parser->GetData(); + + $this->log->logRequest("Redirecting to: ". + $data[$root]['redirect-url']['VALUE']); + header('Location: ' . $data[$root]['redirect-url']['VALUE']); + if($die) { + die($data[$root]['redirect-url']['VALUE']); + } + else { + return array(200, $data[$root]['redirect-url']['VALUE']); + } + } + } + + /** + * Send a <charge-order> command to the Google Checkout server + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#charge_order_example} + * + * @param string $google_order the google id of the order + * @param double $amount the amount to be charged, if empty the whole + * amount of the order will be charged + * + * @return array the status code and body of the response + */ + function SendChargeOrder($google_order, $amount='') { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <charge-order xmlns=\"".$this->schema_url. + "\" google-order-number=\"". $google_order. "\">"; + if ($amount != '') { + $postargs .= "<amount currency=\"" . $this->currency . "\">" . + $amount . "</amount>"; + } + $postargs .= "</charge-order>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <refund-order> command to the Google Checkout server + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#refund_order_example} + * + * @param string $google_order the google id of the order + * @param double $amount the amount to be refunded, if empty the whole + * amount of the order will be refunded + * @param string $reason the reason why the refund is taking place + * @param string $comment a comment about the refund + * + * @return array the status code and body of the response + */ + function SendRefundOrder($google_order, $amount, $reason, + $comment='') { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <refund-order xmlns=\"".$this->schema_url. + "\" google-order-number=\"". $google_order. "\">" . + "<reason>". $reason . "</reason>"; + if($amount!=0) { + $postargs .= "<amount currency=\"" . $this->currency . "\">". + htmlentities($amount)."</amount>"; + } + $postargs .= "<comment>". htmlentities($comment) . "</comment> + </refund-order>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <cancel-order> command to the Google Checkout server + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#refund_order_example} + * + * @param string $google_order the google id of the order + * @param string $reason the reason why the order is being cancelled + * @param string $comment a comment about the cancellation + * + * @return array the status code and body of the response + */ + function SendCancelOrder($google_order, $reason, $comment) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <cancel-order xmlns=\"".$this->schema_url. + "\" google-order-number=\"". $google_order. "\"> + <reason>". + (substr(htmlentities(strip_tags($reason)),0,GOOGLE_REASON_LENGTH)) . + "</reason> + <comment>". + (substr(htmlentities(strip_tags($comment)),0,GOOGLE_REASON_LENGTH)) . + "</comment> + </cancel-order>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send an <add-tracking-data> command to the Google Checkout server, which + * will associate a shipper's tracking number with an order. + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#add_tracking_data_example} + * + * @param string $google_order the google id of the order + * @param string $carrier the carrier, valid values are "DHL", "FedEx", + * "UPS", "USPS" and "Other" + * @param string $tracking_no the shipper's tracking number + * + * @return array the status code and body of the response + */ + function SendTrackingData($google_order, $carrier, + $tracking_no) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <add-tracking-data xmlns=\"". $this->schema_url . + "\" google-order-number=\"". $google_order . "\"> + <tracking-data> + <carrier>". htmlentities($carrier) . "</carrier> + <tracking-number>". $tracking_no . "</tracking-number> + </tracking-data> + </add-tracking-data>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send an <add-merchant-order-number> command to the Google Checkout + * server, which will associate a merchant order number with an order + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#add_merchant_order_number_example} + * + * @param string $google_order the google id of the order + * @param string $merchant_order the merchant id of the order + * + * @return array the status code and body of the response + */ + function SendMerchantOrderNumber($google_order, + $merchant_order, $timeout=false) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <add-merchant-order-number xmlns=\"". $this->schema_url . + "\" google-order-number=\"". $google_order . "\"> + <merchant-order-number>" . $merchant_order . + "</merchant-order-number> + </add-merchant-order-number>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs, $timeout); + } + + /** + * Send a <send-buyer-message> command to the Google Checkout + * server, which will place a message in the customer's Google Checkout + * account + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#send_buyer_message_example} + * + * @param string $google_order the google id of the order + * @param string $message the message to be sent to the customer + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + function SendBuyerMessage($google_order, $message, + $send_mail="true", $timeout=false) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <send-buyer-message xmlns=\"". $this->schema_url . + "\" google-order-number=\"". $google_order . "\"> + <message>" . + (substr(htmlentities(strip_tags($message)),0,GOOGLE_MESSAGE_LENGTH)) + . "</message> + <send-email>" . strtolower($send_mail) . "</send-email> + </send-buyer-message>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs, $timeout); + } + + /** + * Send a <process-order> command to the Google Checkout + * server, which will update an order's fulfillment state from NEW to + * PROCESSING + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#process_order_example} + * + * @param string $google_order the google id of the order + * + * @return array the status code and body of the response + */ + function SendProcessOrder($google_order) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <process-order xmlns=\"".$this->schema_url . + "\" google-order-number=\"". $google_order. "\"/> "; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <deliver-order> command to the Google Checkout server, which + * will update an order's fulfillment state from either NEW or PROCESSING + * to DELIVERED + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#deliver_order_example} + * + * @param string $google_order the google id of the order + * @param string $carrier the carrier, valid values are "DHL", "FedEx", + * "UPS", "USPS" and "Other" + * @param string $tracking_no the shipper's tracking number + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + function SendDeliverOrder($google_order, $carrier="", + $tracking_no="", $send_mail = "true") { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <deliver-order xmlns=\"". $this->schema_url . + "\" google-order-number=\"". $google_order . "\">"; + if($carrier != "" && $tracking_no != "") { + $postargs .= "<tracking-data> + <carrier>". htmlentities($carrier) . "</carrier> + <tracking-number>". htmlentities($tracking_no) . "</tracking-number> + </tracking-data>"; + } + $postargs .= "<send-email>". strtolower($send_mail) . "</send-email> + </deliver-order>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <archive-order> command to the Google Checkout + * server, which removes an order from the merchant's Merchant Center Inbox + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#archive_order_example} + * + * @param string $google_order the google id of the order + * + * @return array the status code and body of the response + */ + function SendArchiveOrder($google_order) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <archive-order xmlns=\"".$this->schema_url. + "\" google-order-number=\"". $google_order. "\"/>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <archive-order> command to the Google Checkout + * server, which returns a previously archived order to the merchant's + * Merchant Center Inbox + * + * info: {@link http://code.google.com/apis/checkout/developer/index.html#unarchive_order_example} + * + * @param string $google_order the google id of the order + * + * @return array the status code and body of the response + */ + function SendUnarchiveOrder($google_order) { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <unarchive-order xmlns=\"". + $this->schema_url."\" google-order-number=\"". + $google_order. "\"/>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + +/** + * Ship items API Commands + * info: {@link http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Line_Item_Shipping.html} + * + * + */ + + /** + * Send a <ship-items> command to the Google Checkout + * server, + * + * info: {@link http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Line_Item_Shipping.html#tag_ship-items} + * + * @param string $google_order the google id of the order + * @param array $items_list a list of GoogleShipItem classes. + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + + function SendShipItems($google_order, $items_list=array(), $send_mail="true") { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <ship-items xmlns=\"". $this->schema_url . + "\" google-order-number=\"". $google_order . "\">" . + "<item-shipping-information-list>\n"; + foreach($items_list as $item) { + $postargs .= "<item-shipping-information> + <item-id> + <merchant-item-id>" . $item->merchant_item_id . "</merchant-item-id> + </item-id>\n"; + + if(count($item->tracking_data_list)) { + $postargs .= "<tracking-data-list>\n"; + foreach($item->tracking_data_list as $tracking_data) { + $postargs .= "<tracking-data> + <carrier>". htmlentities($tracking_data['carrier']) . "</carrier> + <tracking-number>". $tracking_data['tracking-number'] . "</tracking-number> + </tracking-data>\n"; + } + $postargs .= "</tracking-data-list>\n"; + } + $postargs .= "</item-shipping-information>\n"; + } + $postargs .= "</item-shipping-information-list>\n" . + "<send-email>". strtolower($send_mail) . "</send-email> + </ship-items>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + + } + + /** + * Send a <backorder-items> command to the Google Checkout + * + * info: {@link http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Line_Item_Shipping.html#tag_backorder-items} + * + * @param string $google_order the google id of the order + * @param array $items_list a list of GoogleShipItem classes. + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + function SendBackorderItems($google_order, $items_list=array(), $send_mail="true") { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <backorder-items xmlns=\"". + $this->schema_url."\" google-order-number=\"". + $google_order. "\">"; + $postargs .= "<item-ids>"; + foreach($items_list as $item) { + $postargs .= "<item-id> + <merchant-item-id>" . $item->merchant_item_id . "</merchant-item-id> + </item-id>"; + } + $postargs .= "</item-ids>"; + $postargs .= "<send-email>". strtolower($send_mail) . "</send-email> + </backorder-items>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <cancel-items> command to the Google Checkout + * + * info: {@link http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Line_Item_Shipping.html#tag_cancel-items} + * + * @param string $google_order the google id of the order + * @param array $items_list a list of GoogleShipItem classes. + * @param string $reason the reason why the refund is taking place + * @param string $comment a comment about the refund + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + function SendCancelItems($google_order, $items_list=array(), $reason, + $comment='', $send_mail="true") { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <cancel-items xmlns=\"". + $this->schema_url."\" google-order-number=\"". + $google_order. "\">"; + $postargs .= "<item-ids>"; + foreach($items_list as $item) { + $postargs .= "<item-id> + <merchant-item-id>" . $item->merchant_item_id . "</merchant-item-id> + </item-id>"; + } + $postargs .= "</item-ids>"; + $postargs .= "<send-email>". strtolower($send_mail) . "</send-email> + <reason>". + (substr(htmlentities(strip_tags($reason)),0,GOOGLE_REASON_LENGTH)) . + "</reason> + <comment>". + (substr(htmlentities(strip_tags($comment)),0,GOOGLE_REASON_LENGTH)) . + "</comment> + </cancel-items>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <return-items> command to the Google Checkout + * + * info: {@link http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Line_Item_Shipping.html#tag_return-items} + * + * @param string $google_order the google id of the order + * @param array $items_list a list of GoogleShipItem classes. + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + function SendReturnItems($google_order, $items_list=array(), $send_mail="true") { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <return-items xmlns=\"". + $this->schema_url."\" google-order-number=\"". + $google_order. "\">"; + $postargs .= "<item-ids>"; + foreach($items_list as $item) { + $postargs .= "<item-id> + <merchant-item-id>" . $item->merchant_item_id . "</merchant-item-id> + </item-id>"; + } + $postargs .= "</item-ids>"; + $postargs .= "<send-email>". strtolower($send_mail) . "</send-email> + </return-items>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * Send a <reset-items-shipping-information> command to the Google Checkout + * + * info: {@link http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Line_Item_Shipping.html#tag_reset-items-shipping-information} + * + * @param string $google_order the google id of the order + * @param array $items_list a list of GoogleShipItem classes. + * @param string $send_email whether Google should send an email to + * the buyer, use "true" or"false", + * defaults to "true" + * + * @return array the status code and body of the response + */ + function SendResetItemsShippingInformation($google_order, $items_list=array(), $send_mail="true") { + $postargs = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> + <reset-items-shipping-information xmlns=\"". + $this->schema_url."\" google-order-number=\"". + $google_order. "\">"; + $postargs .= "<item-ids>"; + foreach($items_list as $item) { + $postargs .= "<item-id> + <merchant-item-id>" . $item->merchant_item_id . "</merchant-item-id> + </item-id>"; + } + $postargs .= "</item-ids>"; + $postargs .= "<send-email>". strtolower($send_mail) . "</send-email> + </reset-items-shipping-information>"; + return $this->SendReq($this->request_url, + $this->GetAuthenticationHeaders(), $postargs); + } + + /** + * @access private + */ + function GetAuthenticationHeaders() { + $headers = array(); + $headers[] = "Authorization: Basic ".base64_encode( + $this->merchant_id.':'.$this->merchant_key); + $headers[] = "Content-Type: application/xml; charset=UTF-8"; + $headers[] = "Accept: application/xml; charset=UTF-8"; + $headers[] = "User-Agent: GC-PHP-Sample_code (" . PHP_SAMPLE_CODE_VERSION . "/ropu)"; + return $headers; + } + /** + * Set the proxy to be used by the connections to the outside + * + * @param array $proxy Array('host' => 'proxy-host', 'port' => 'proxy-port') + * + */ + function SetProxy($proxy=array()) { + if(is_array($proxy) && count($proxy)) { + $this->proxy['host'] = $proxy['host']; + $this->proxy['port'] = $proxy['port']; + } + } + + /** + * @access private + */ + function SendReq($url, $header_arr, $postargs, $timeout=false) { + // Get the curl session object + $session = curl_init($url); + $this->log->LogRequest($postargs); + // Set the POST options. + curl_setopt($session, CURLOPT_POST, true); + curl_setopt($session, CURLOPT_HTTPHEADER, $header_arr); + curl_setopt($session, CURLOPT_POSTFIELDS, $postargs); + curl_setopt($session, CURLOPT_HEADER, true); + curl_setopt($session, CURLOPT_RETURNTRANSFER, true); + + if(!empty($this->certPath) && file_exists($this->certPath)) { + curl_setopt($session, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($session, CURLOPT_CAINFO, $this->certPath); + } + else { + curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false); + } + + if(is_array($this->proxy) && count($this->proxy)) { + curl_setopt($session, CURLOPT_PROXY, + $this->proxy['host'] . ":" . $this->proxy['port']); + } + if($timeout != false){ + curl_setopt($session, CURLOPT_TIMEOUT, $timeout); + + } + // Do the POST and then close the session + $response = curl_exec($session); + if (curl_errno($session)) { + $this->log->LogError(curl_error($session)); + return array("CURL_ERR", curl_error($session)); + } else { + curl_close($session); + } + $heads = $this->parse_headers($response); + $body = $this->get_body_x($response); + +// // Get HTTP Status code from the response + $status_code = array(); + preg_match('/\d\d\d/', $heads[0], $status_code); + + // Check for errors + switch( $status_code[0] ) { + case 200: + // Success + $this->log->LogResponse($response); + return array(200, $body); + break; + case 503: + $this->log->LogError($response); + return array(503, htmlentities($body)); + break; + case 403: + $this->log->LogError($response); + return array(403, htmlentities($body)); + break; + case 400: + $this->log->LogError($response); + return array(400, htmlentities($body)); + break; + default: + $this->log->LogError($response); + return array("ERR", htmlentities($body)); + break; + } + } + +// Private functions +// Function to get HTTP headers, +// will also work with HTTP 200 status added by some proxy servers + /** + * @access private + */ + function parse_headers($message) { + $head_end = strpos($message, DOUBLE_ENTER); + $headers = $this->get_headers_x(substr($message,0, + $head_end + strlen(DOUBLE_ENTER))); + if(!is_array($headers) || empty($headers)){ + return null; + } + if(!preg_match('%[HTTP/\d\.\d] (\d\d\d)%', $headers[0], $status_code)) { + return null; + } + switch( $status_code[1] ) { + case '200': + $parsed = $this->parse_headers(substr($message, + $head_end + strlen(DOUBLE_ENTER))); + return is_null($parsed)?$headers:$parsed; + break; + default: + return $headers; + break; + } + } + + /** + * @access private + */ + function get_headers_x($heads, $format=0) { + $fp = explode(ENTER, $heads); + foreach($fp as $header){ + if($header == "") { + $eoheader = true; + break; + } else { + $header = trim($header); + } + + if($format == 1) { + $key = array_shift(explode(':',$header)); + if($key == $header) { + $headers[] = $header; + } else { + $headers[$key]=substr($header,strlen($key)+2); + } + unset($key); + } else { + $headers[] = $header; + } + } + return $headers; + } + + /** + * @access private + */ + function get_body_x($heads){ + $fp = explode(DOUBLE_ENTER, $heads, 2); + return $fp[1]; + } + } + +class GoogleShipItem { + var $merchant_item_id; + var $tracking_data_list; + var $tracking_no; + + function GoogleShipItem($merchant_item_id, $tracking_data_list=array()) { + $this->merchant_item_id = $merchant_item_id; + $this->tracking_data_list = $tracking_data_list; + } + + function AddTrackingData($carrier, $tracking_no) { + if($carrier != "" && $tracking_no != "") { + $this->tracking_data_list[] = array('carrier' => $carrier, + 'tracking-number' => $tracking_no); + } + } +} diff --git a/modules/gcheckout/library/googleresponse.php b/modules/gcheckout/library/googleresponse.php new file mode 100644 index 000000000..ba564d67d --- /dev/null +++ b/modules/gcheckout/library/googleresponse.php @@ -0,0 +1,221 @@ +<?php + +/* + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* This class is instantiated everytime any notification or + * order processing commands are received. + * + * Refer demo/responsehandlerdemo.php for different use case scenarios + * for this code + */ + + + /** + * Handles the response to notifications sent by the Google Checkout server. + */ + class GoogleResponse { + var $merchant_id; + var $merchant_key; + var $schema_url; + + var $log; + var $response; + var $root=''; + var $data=array(); + var $xml_parser; + + /** + * @param string $id the merchant id + * @param string $key the merchant key + */ + function GoogleResponse($id=null, $key=null) { + $this->merchant_id = $id; + $this->merchant_key = $key; + $this->schema_url = "http://checkout.google.com/schema/2"; + ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'.'); + require_once('googlelog.php'); + $this->log = new GoogleLog('', '', L_OFF); + } + + /** + * @param string $id the merchant id + * @param string $key the merchant key + */ + function SetMerchantAuthentication($id, $key){ + $this->merchant_id = $id; + $this->merchant_key = $key; + } + + function SetLogFiles($errorLogFile, $messageLogFile, $logLevel=L_ERR_RQST) { + $this->log = new GoogleLog($errorLogFile, $messageLogFile, $logLevel); + } + + /** + * Verifies that the authentication sent by Google Checkout matches the + * merchant id and key + * + * @param string $headers the headers from the request + */ + function HttpAuthentication($headers=null, $die=true) { + if(!is_null($headers)) { + $_SERVER = $headers; + } + if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { + $compare_mer_id = $_SERVER['PHP_AUTH_USER']; + $compare_mer_key = $_SERVER['PHP_AUTH_PW']; + } + // IIS Note:: For HTTP Authentication to work with IIS, + // the PHP directive cgi.rfc2616_headers must be set to 0 (the default value). + else if(isset($_SERVER['HTTP_AUTHORIZATION'])){ + list($compare_mer_id, $compare_mer_key) = explode(':', + base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], + strpos($_SERVER['HTTP_AUTHORIZATION'], " ") + 1))); + } else if(isset($_SERVER['Authorization'])) { + list($compare_mer_id, $compare_mer_key) = explode(':', + base64_decode(substr($_SERVER['Authorization'], + strpos($_SERVER['Authorization'], " ") + 1))); + } else { + $this->SendFailAuthenticationStatus( + "Failed to Get Basic Authentication Headers",$die); + return false; + } + if($compare_mer_id != $this->merchant_id + || $compare_mer_key != $this->merchant_key) { + $this->SendFailAuthenticationStatus("Invalid Merchant Id/Key Pair",$die); + return false; + } + return true; + } + + function ProcessMerchantCalculations($merchant_calc) { + $this->SendOKStatus(); + $result = $merchant_calc->GetXML(); + echo $result; + } + +// Notification API + function ProcessNewOrderNotification() { + $this->SendAck(); + } + function ProcessRiskInformationNotification() { + $this->SendAck(); + } + function ProcessOrderStateChangeNotification() { + $this->SendAck(); + } +// Amount Notifications + function ProcessChargeAmountNotification() { + $this->SendAck(); + } + function ProcessRefundAmountNotification() { + $this->SendAck(); + } + function ProcessChargebackAmountNotification() { + $this->SendAck(); + } + function ProcessAuthorizationAmountNotification() { + $this->SendAck(); + } + + function SendOKStatus() { + header('HTTP/1.0 200 OK'); + } + + /** + * Set the response header indicating an erroneous authentication from + * Google Checkout + * + * @param string $msg the message to log + */ + function SendFailAuthenticationStatus($msg="401 Unauthorized Access", + $die=true) { + $this->log->logError($msg); + header('WWW-Authenticate: Basic realm="GoogleCheckout PHPSample Code"'); + header('HTTP/1.0 401 Unauthorized'); + if($die) { + die($msg); + } else { + echo $msg; + } + } + + /** + * Set the response header indicating a malformed request from Google + * Checkout + * + * @param string $msg the message to log + */ + function SendBadRequestStatus($msg="400 Bad Request", $die=true) { + $this->log->logError($msg); + header('HTTP/1.0 400 Bad Request'); + if($die) { + die($msg); + } else { + echo $msg; + } + } + + /** + * Set the response header indicating that an internal error ocurred and + * the notification sent by Google Checkout can't be processed right now + * + * @param string $msg the message to log + */ + function SendServerErrorStatus($msg="500 Internal Server Error", + $die=true) { + $this->log->logError($msg); + header('HTTP/1.0 500 Internal Server Error'); + if($die) { + die($msg); + } else { + echo $msg; + } + } + + /** + * Send an acknowledgement in response to Google Checkout's request + */ + function SendAck($die=true) { + $this->SendOKStatus(); + $acknowledgment = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" . + "<notification-acknowledgment xmlns=\"" . + $this->schema_url . "\"/>"; + $this->log->LogResponse($acknowledgment); + if($die) { + die($acknowledgment); + } else { + echo $acknowledgment; + } + } + + /** + * @access private + */ + function GetParsedXML($request=null){ + if(!is_null($request)) { + $this->log->LogRequest($request); + $this->response = $request; + ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'.'); + require_once('xml-processing/gc_xmlparser.php'); + + $this->xml_parser = new gc_xmlparser($request); + $this->root = $this->xml_parser->GetRoot(); + $this->data = $this->xml_parser->GetData(); + } + return array($this->root, $this->data); + } + } diff --git a/modules/gcheckout/library/googleresult.php b/modules/gcheckout/library/googleresult.php new file mode 100644 index 000000000..2123cb1de --- /dev/null +++ b/modules/gcheckout/library/googleresult.php @@ -0,0 +1,105 @@ +<?php + +/* + * Copyright (C) 2006 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * Used to create a Google Checkout result as a response to a + * merchant-calculations feedback structure, i.e shipping, tax, coupons and + * gift certificates. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_result <result>} + */ + // refer to demo/responsehandlerdemo.php for usage of this code + class GoogleResult { + var $shipping_name; + var $address_id; + var $shippable; + var $ship_price; + + var $tax_amount; + + var $coupon_arr = array(); + var $giftcert_arr = array(); + + /** + * @param integer $address_id the id of the anonymous address sent by + * Google Checkout. + */ + function GoogleResult($address_id) { + $this->address_id = $address_id; + } + + function SetShippingDetails($name, $price, $shippable = "true") { + $this->shipping_name = $name; + $this->ship_price = $price; + $this->shippable = $shippable; + } + + function SetTaxDetails($amount) { + $this->tax_amount = $amount; + } + + function AddCoupons($coupon) { + $this->coupon_arr[] = $coupon; + } + + function AddGiftCertificates($gift) { + $this->giftcert_arr[] = $gift; + } + } + + /** + * This is a class used to return the results of coupons the buyer supplied in + * the order page. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_coupon-result <coupon-result>} + */ + class GoogleCoupons { + var $coupon_valid; + var $coupon_code; + var $coupon_amount; + var $coupon_message; + + function googlecoupons($valid, $code, $amount, $message) { + $this->coupon_valid = $valid; + $this->coupon_code = $code; + $this->coupon_amount = $amount; + $this->coupon_message = $message; + } + } + + /** + * This is a class used to return the results of gift certificates + * supplied by the buyer on the place order page + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_gift-certificate-result} <gift-certificate-result> + */ + + class GoogleGiftcerts { + var $gift_valid; + var $gift_code; + var $gift_amount; + var $gift_message; + + function googlegiftcerts($valid, $code, $amount, $message) { + $this->gift_valid = $valid; + $this->gift_code = $code; + $this->gift_amount = $amount; + $this->gift_message = $message; + } + } + diff --git a/modules/gcheckout/library/googleshipping.php b/modules/gcheckout/library/googleshipping.php new file mode 100644 index 000000000..693cae04e --- /dev/null +++ b/modules/gcheckout/library/googleshipping.php @@ -0,0 +1,532 @@ +<?php +/* + * Copyright (C) 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +/** + * Classes used to represent shipping types + * @version $Id: googleshipping.php 6844 2011-06-03 14:46:51Z dMetzger $ + */ + + /** + * Class that represents flat rate shipping + * + * info: + * {@link http://code.google.com/apis/checkout/developer/index.html#tag_flat-rate-shipping} + * {@link http://code.google.com/apis/checkout/developer/index.html#shipping_xsd} + * + */ + class GoogleFlatRateShipping { + + var $price; + var $name; + var $type = "flat-rate-shipping"; + var $shipping_restrictions; + + /** + * @param string $name a name for the shipping + * @param double $price the price for this shipping + */ + function GoogleFlatRateShipping($name, $price) { + $this->name = $name; + $this->price = $price; + } + + /** + * Adds a restriction to this shipping. + * + * @param GoogleShippingFilters $restrictions the shipping restrictions + */ + function AddShippingRestrictions($restrictions) { + $this->shipping_restrictions = $restrictions; + } + } + + /** + * Represents a merchant calculated shipping + * + * info: + * {@link http://code.google.com/apis/checkout/developer/index.html#shipping_xsd} + * {@link http://code.google.com/apis/checkout/developer/index.html#merchant_calculations_specifying} + */ + class GoogleMerchantCalculatedShipping { + + var $price; + var $name; + var $type = "merchant-calculated-shipping"; + var $shipping_restrictions; + var $address_filters; + + /** + * @param string $name a name for the shipping + * @param double $price the default price for this shipping, used if the + * calculation can't be made for some reason. + */ + function GoogleMerchantCalculatedShipping($name, $price) { + $this->price = $price; + $this->name = $name; + } + + /** + * Adds a restriction to this shipping. + * + * @param GoogleShippingFilters $restrictions the shipping restrictions + */ + function AddShippingRestrictions($restrictions) { + $this->shipping_restrictions = $restrictions; + } + + /** + * Adds an address filter to this shipping. + * + * @param GoogleShippingFilters $filters the address filters + */ + function AddAddressFilters($filters) { + $this->address_filters = $filters; + } + } + + /** + * Represents carrier calculated shipping + */ + class GoogleCarrierCalculatedShipping { + + var $name; + var $type = "carrier-calculated-shipping"; + + var $CarrierCalculatedShippingOptions = array(); +// var $ShippingPackages = array(); + var $ShippingPackage; + + /** + * @param string $name the name of this shipping + */ + function GoogleCarrierCalculatedShipping($name) { + $this->name = $name; + } + + /** + * @param GoogleCarrierCalculatedShippingOption $option the option to be + * added to the carrier calculated shipping + */ + function addCarrierCalculatedShippingOptions($option){ + $this->CarrierCalculatedShippingOptions[] = $option; + } + + /** + * @param GoogleShippingPackage $package + */ + function addShippingPackage($package){ +// $this->ShippingPackages[] = $package; + $this->ShippingPackage = $package; + } + } + + /** + * Represents a shipping method for which Google Checkout will obtain + * shipping costs for the order. + */ + class GoogleCarrierCalculatedShippingOption { + + var $price; + var $shipping_company; + var $shipping_type; + var $carrier_pickup; + var $additional_fixed_charge; + var $additional_variable_charge_percent; +// var $shipping_restrictions; +// var $address_filters; + + /** + * @param double $price the default shipping cost to be used if Google is + * unable to obtain the shipping_company's shipping rate for + * the option + * @param string $shipping_company the name of the shipping_company + * @param string $shipping_type the shipping option, valid values are here: + * http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API_Carrier_Calculated_Shipping.html#tag_shipping-type + * @param double $additional_fixed_charge a handling charge that will be + * added to the total cost of the order if this shipping option is selected. + * defaults to 0 + * @param double $additional_variable_charge_percent A percentage by which + * the shipping rate will be adjusted. The value may be positive or + * negative. defaults to 0. + * @param string $carrier_pickup Specifies how the package will be + * transfered from the merchand to the shipper. Valid values are + * "REGULAR_PICKUP", "SPECIAL_PICKUP", "DROP_OFF". Defaults to "DROP_OFF". + * + */ + function GoogleCarrierCalculatedShippingOption($price, $shipping_company, + $shipping_type, $additional_fixed_charge=0, + $additional_variable_charge_percent=0, $carrier_pickup='DROP_OFF') { + $this->price = (double)$price; + $this->shipping_company = $shipping_company; + $this->shipping_type = trim($shipping_type); + switch(strtoupper($carrier_pickup)){ + case 'DROP_OFF': + case 'REGULAR_PICKUP': + case 'SPECIAL_PICKUP': + $this->carrier_pickup = $carrier_pickup; + break; + default: + $this->carrier_pickup = 'DROP_OFF'; + } + if($additional_fixed_charge){ + $this->additional_fixed_charge = (double)$additional_fixed_charge; + } + if($additional_variable_charge_percent){ + $this->additional_variable_charge_percent = (double)$additional_variable_charge_percent; + } + } + +// function AddShippingRestrictions($restrictions) { +// $this->shipping_restrictions = $restrictions; +// } +// +// function AddAddressFilters($filters) { +// $this->address_filters = $filters; +// } + } + + /** + * Represents an individual package that will be shipped to the buyer. + */ + class GoogleShippingPackage { + + var $width; + var $length; + var $height; + var $unit; + var $ship_from; + var $delivery_address_category; + + /** + * @param GoogleShipFrom $ship_from where the package ships from + * @param double $width the width of the package + * @param double $length the length of the package + * @param double $height the height of the package + * @param string $unit the unit used to measure the width/length/height + * of the package, valid values "IN", "CM" + * @param string $delivery_address_category indicates whether the shipping + * method should be applied to a residential or commercial address, valid + * values are "RESIDENTIAL", "COMMERCIAL" + */ + function GoogleShippingPackage($ship_from, $width, $length, $height, $unit, + $delivery_address_category='RESIDENTIAL') { + $this->width = (double)$width; + $this->length = (double)$length; + $this->height = (double)$height; + switch(strtoupper($unit)){ + case 'CM': + $this->unit = strtoupper($unit); + break; + case 'IN': + default: + $this->unit = 'IN'; + } + + $this->ship_from = $ship_from; + switch(strtoupper($delivery_address_category)){ + case 'COMMERCIAL': + $this->delivery_address_category = strtoupper($delivery_address_category); + break; + case 'RESIDENTIAL': + default: + $this->delivery_address_category = 'RESIDENTIAL'; + } + } + } + + /** + * Represents the location from where packages will be shipped from. + * Used with {@link GoogleShippingPackage}. + */ + class GoogleShipFrom { + var $id; + var $city; + var $country_code; + var $postal_code; + var $region; + + /** + * @param string $id an id for this address + * @param string $city the city + * @param string $country_code a 2-letter iso country code + * @param string $postal_code the zip + * @param string $region the region + */ + function GoogleShipFrom($id, $city, $country_code, + $postal_code, $region) { + $this->id = $id; + $this->city = $city; + $this->country_code = $country_code; + $this->postal_code = $postal_code; + $this->region = $region; + } + } + + /** + * + * Shipping restrictions contain information about particular areas where + * items can (or cannot) be shipped. + * + * More info: + * {@link http://code.google.com/apis/checkout/developer/index.html#tag_shipping-restrictions} + * + * Address filters identify areas where a particular merchant-calculated + * shipping method is available or unavailable. Address filters are applied + * before Google Checkout sends a <merchant-calculation-callback> to the + * merchant. Google Checkout will not ask you to calculate the cost of a + * particular shipping method for an address if the address filters in the + * Checkout API request indicate that the method is not available for the + * address. + * + * More info: + * {@link http://code.google.com/apis/checkout/developer/index.html#tag_address-filters} + */ + class GoogleShippingFilters { + + var $allow_us_po_box = true; + + var $allowed_restrictions = false; + var $excluded_restrictions = false; + + var $allowed_world_area = false; + var $allowed_country_codes_arr; + var $allowed_postal_patterns_arr; + var $allowed_country_area; + var $allowed_state_areas_arr; + var $allowed_zip_patterns_arr; + + var $excluded_country_codes_arr; + var $excluded_postal_patterns_arr; + var $excluded_country_area; + var $excluded_state_areas_arr; + var $excluded_zip_patterns_arr; + + function GoogleShippingFilters() { + $this->allowed_country_codes_arr = array(); + $this->allowed_postal_patterns_arr = array(); + $this->allowed_state_areas_arr = array(); + $this->allowed_zip_patterns_arr = array(); + + $this->excluded_country_codes_arr = array(); + $this->excluded_postal_patterns_arr = array(); + $this->excluded_state_areas_arr = array(); + $this->excluded_zip_patterns_arr = array(); + } + + /** + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_allow-us-po-box <allow-us-po-box>} + * + * @param bool $allow_us_po_box whether to allow delivery to PO boxes in US, + * defaults to true + */ + function SetAllowUsPoBox($allow_us_po_box = true) { + $this->allow_us_po_box = $allow_us_po_box; + } + + /** + * Set the world as allowed delivery area. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_world-area <world-area>} + * + * @param bool $world_area Set worldwide allowed shipping, defaults to true + */ + function SetAllowedWorldArea($world_area = true) { + $this->allowed_restrictions = true; + $this->allowed_world_area = $world_area; + } + + // Allows + /** + * Add a postal area to be allowed for delivery. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_postal-area <postal-area>} + * + * @param string $country_code 2-letter iso country code + * @param string $postal_pattern Pattern that matches the postal areas to + * be allowed, as defined in {@link http://code.google.com/apis/checkout/developer/index.html#tag_postal-code-pattern} + */ + function AddAllowedPostalArea($country_code, $postal_pattern = "") { + $this->allowed_restrictions = true; + $this->allowed_country_codes_arr[] = $country_code; + $this->allowed_postal_patterns_arr[]= $postal_pattern; + } + + /** + * Add a us country area to be allowed for delivery. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_us-country-area <us-country-area>} + * + * @param string $country_area the area to allow, one of "CONTINENTAL", + * "FULL_50_STATES" or "ALL" + * + */ + function SetAllowedCountryArea($country_area) { + switch ($country_area) { + case "CONTINENTAL_48": + case "FULL_50_STATES": + case "ALL": + $this->allowed_country_area = $country_area; + $this->allowed_restrictions = true; + break; + default: + $this->allowed_country_area = ""; + break; + } + } + + /** + * Allow shipping to areas specified by state. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_us-state-area <us-state-area>} + * + * @param array $areas Areas to be allowed + */ + function SetAllowedStateAreas($areas) { + $this->allowed_restrictions = true; + $this->allowed_state_areas_arr = $areas; + } + + /** + * Allow shipping to areas specified by state. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_us-state-area <us-state-area>} + * + * @param string $area Area to be allowed + */ + function AddAllowedStateArea($area) { + $this->allowed_restrictions = true; + $this->allowed_state_areas_arr[] = $area; + } + + /** + * Allow shipping to areas specified by zip patterns. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_us-zip-area <us-zip-area>} + * + * @param array $zips + */ + function SetAllowedZipPatterns($zips) { + $this->allowed_restrictions = true; + $this->allowed_zip_patterns_arr = $zips; + } + + /** + * Allow shipping to area specified by zip pattern. + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_us-zip-area <us-zip-area>} + * + * @param string + */ + function AddAllowedZipPattern($zip) { + $this->allowed_restrictions = true; + $this->allowed_zip_patterns_arr[] = $zip; + } + + /** + * Exclude postal areas from shipping. + * + * @see AddAllowedPostalArea + */ + function AddExcludedPostalArea($country_code, $postal_pattern = "") { + $this->excluded_restrictions = true; + $this->excluded_country_codes_arr[] = $country_code; + $this->excluded_postal_patterns_arr[]= $postal_pattern; + } + + /** + * Exclude state areas from shipping. + * + * @see SetAllowedStateAreas + */ + function SetExcludedStateAreas($areas) { + $this->excluded_restrictions = true; + $this->excluded_state_areas_arr = $areas; + } + + /** + * Exclude state area from shipping. + * + * @see AddAllowedStateArea + */ + function AddExcludedStateArea($area) { + $this->excluded_restrictions = true; + $this->excluded_state_areas_arr[] = $area; + } + + /** + * Exclude shipping to area specified by zip pattern. + * + * @see SetAllowedZipPatterns + */ + function SetExcludedZipPatternsStateAreas($zips) { + $this->excluded_restrictions = true; + $this->excluded_zip_patterns_arr = $zips; + } + + /** + * Exclude shipping to area specified by zip pattern. + * + * @see AddExcludedZipPattern + */ + function SetAllowedZipPatternsStateArea($zip) { + $this->excluded_restrictions = true; + $this->excluded_zip_patterns_arr[] = $zip; + } + + /** + * Exclude shipping to country area + * + * @see SetAllowedCountryArea + */ + function SetExcludedCountryArea($country_area) { + switch ($country_area) { + case "CONTINENTAL_48": + case "FULL_50_STATES": + case "ALL": + $this->excluded_country_area = $country_area; + $this->excluded_restrictions = true; + break; + + default: + $this->excluded_country_area = ""; + break; + } + } + } + + /** + * Used as a shipping option in which neither a carrier nor a ship-to + * address is specified + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_pickup} <pickup> + */ + class GooglePickUp { + + var $price; + var $name; + var $type = "pickup"; + + /** + * @param string $name the name of this shipping option + * @param double $price the handling cost (if there is one) + */ + function GooglePickUp($name, $price) { + $this->price = $price; + $this->name = $name; + } + } + diff --git a/modules/gcheckout/library/googletax.php b/modules/gcheckout/library/googletax.php new file mode 100644 index 000000000..45023227d --- /dev/null +++ b/modules/gcheckout/library/googletax.php @@ -0,0 +1,146 @@ +<?php + +/* + * Copyright (C) 2006 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * Classes used to handle tax rules and tables + */ + + /** + * Represents a tax rule + * + * @see GoogleDefaultTaxRule + * @see GoogleAlternateTaxRule + * + * @abstract + */ + class GoogleTaxRule { + + var $tax_rate; + + var $world_area = false; + var $country_codes_arr; + var $postal_patterns_arr; + var $state_areas_arr; + var $zip_patterns_arr; + var $country_area; + + function GoogleTaxRule() { + } + + function SetWorldArea($world_area = true) { + $this->world_area = $world_area; + } + + function AddPostalArea($country_code, $postal_pattern = "") { + $this->country_codes_arr[] = $country_code; + $this->postal_patterns_arr[]= $postal_pattern; + } + + function SetStateAreas($areas) { + if(is_array($areas)) + $this->state_areas_arr = $areas; + else + $this->state_areas_arr = array($areas); + } + + function SetZipPatterns($zips) { + if(is_array($zips)) + $this->zip_patterns_arr = $zips; + else + $this->zip_patterns_arr = array($zips); + } + + function SetCountryArea($country_area) { + switch ($country_area) { + case "CONTINENTAL_48": + case "FULL_50_STATES": + case "ALL": + $this->country_area = $country_area; + break; + default: + $this->country_area = ""; + break; + } + } + } + + /** + * Represents a default tax rule + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_default-tax-rule <default-tax-rule>} + */ + class GoogleDefaultTaxRule extends GoogleTaxRule { + + var $shipping_taxed = false; + + function GoogleDefaultTaxRule($tax_rate, $shipping_taxed = "false") { + $this->tax_rate = $tax_rate; + $this->shipping_taxed= $shipping_taxed; + + $this->country_codes_arr = array(); + $this->postal_patterns_arr = array(); + $this->state_areas_arr = array(); + $this->zip_patterns_arr = array(); + } + } + + /** + * Represents an alternate tax rule + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_alternate-tax-rule <alternate-tax-rule>} + */ + class GoogleAlternateTaxRule extends GoogleTaxRule { + + function GoogleAlternateTaxRule($tax_rate) { + $this->tax_rate = $tax_rate; + + $this->country_codes_arr = array(); + $this->postal_patterns_arr = array(); + $this->state_areas_arr = array(); + $this->zip_patterns_arr = array(); + } + + } + + + /** + * Represents an alternate tax table + * + * GC tag: {@link http://code.google.com/apis/checkout/developer/index.html#tag_alternate-tax-table <alternate-tax-table>} + */ + class GoogleAlternateTaxTable { + + var $name; + var $tax_rules_arr; + var $standalone; + + function GoogleAlternateTaxTable($name = "", $standalone = "false") { + if($name != "") { + $this->name = $name; + $this->tax_rules_arr = array(); + $this->standalone = $standalone; + } + } + + function AddAlternateTaxRules($rules) { + $this->tax_rules_arr[] = $rules; + } + } + + + diff --git a/modules/gcheckout/library/xml-processing/gc_xmlbuilder.php b/modules/gcheckout/library/xml-processing/gc_xmlbuilder.php new file mode 100644 index 000000000..0b4a62599 --- /dev/null +++ b/modules/gcheckout/library/xml-processing/gc_xmlbuilder.php @@ -0,0 +1,94 @@ +<?php +/* + Copyright (C) 2006 Google Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/** + * Classes used to generate XML data + * Based on sample code available at http://simon.incutio.com/code/php?controller=XmlWriter.class.php.txt + */ + + /** + * Generates xml data + */ + class gc_XmlBuilder { + var $xml; + var $indent; + var $stack = array(); + + function gc_XmlBuilder($indent = ' ') { + $this->indent = $indent; + $this->xml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; + } + + function _indent() { + for ($i = 0, $j = count($this->stack); $i < $j; $i++) { + $this->xml .= $this->indent; + } + } + + //Used when an element has sub-elements + // This function adds an open tag to the output + function Push($element, $attributes = array()) { + $this->_indent(); + $this->xml .= '<'.$element; + foreach ($attributes as $key => $value) { + $this->xml .= ' '.$key.'="'.htmlentities($value).'"'; + } + $this->xml .= ">\n"; + $this->stack[] = $element; + } + + //Used when an element has no subelements. + //Data within the open and close tags are provided with the + //contents variable + function Element($element, $content, $attributes = array()) { + $this->_indent(); + $this->xml .= '<'.$element; + foreach ($attributes as $key => $value) { + $this->xml .= ' '.$key.'="'.htmlentities($value).'"'; + } + $this->xml .= '>'.htmlentities($content).'</'.$element.'>'."\n"; + } + + function EmptyElement($element, $attributes = array()) { + $this->_indent(); + $this->xml .= '<'.$element; + foreach ($attributes as $key => $value) { + $this->xml .= ' '.$key.'="'.htmlentities($value).'"'; + } + $this->xml .= " />\n"; + } + + //Used to close an open tag + function Pop($pop_element) { + $element = array_pop($this->stack); + $this->_indent(); + if($element !== $pop_element) + die('XML Error: Tag Mismatch when trying to close "'. $pop_element. '"'); + else + $this->xml .= "</$element>\n"; + } + + function GetXML() { + if(count($this->stack) != 0) + die ('XML Error: No matching closing tag found for " '. array_pop($this->stack). '"'); + else + return $this->xml; + } + } + diff --git a/modules/gcheckout/library/xml-processing/gc_xmlparser.php b/modules/gcheckout/library/xml-processing/gc_xmlparser.php new file mode 100644 index 000000000..027267e74 --- /dev/null +++ b/modules/gcheckout/library/xml-processing/gc_xmlparser.php @@ -0,0 +1,202 @@ +<?php +/** + * Classes used to parse xml data + */ +/* + Copyright (C) 2007 Google Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + For more info: http://code.google.com/p/google-checkout-php-sample-code/ + + Upgrades (05/23/2007) ropu: + Remove UpdateRecursive() + Support for empty tags (like <world-area/>) + Accept multiple options in a second parameter +* +**/ + +/* This uses SAX parser to convert XML data into PHP associative arrays + * When invoking the constructor with the input data, strip out the first XML line + * + * Member field Description: + * $params: This stores the XML data. The attributes and contents of XML tags + * can be accessed as follows + * + * <addresses> + * <anonymous-address id="123"> <test>data 1 </test> + * </anonymous-address> + * <anonymous-address id="456"> <test>data 2 </test> + * </anonymous-address> + * </addresses> + * + * print_r($this->params) will return + Array +( + [addresses] => Array + ( + [anonymous-address] => Array + ( + [0] => Array + ( + [id] => 123 + [test] => Array + ( + [VALUE] => data 1 + ) + + ) + + [1] => Array + ( + [id] => 456 + [test] => Array + ( + [VALUE] => data 2 + ) + + ) + + ) + + ) + +) + * gc_xmlparser returns an empty params array if it encounters + * any error during parsing + */ + // XML to Array + class gc_xmlparser { + + var $params = array(); //Stores the object representation of XML data + var $root = NULL; + var $global_index = -1; + var $fold = false; + + /* Constructor for the class + * Takes in XML data as input( do not include the <xml> tag + */ + function gc_xmlparser($input, $xmlParams=array(XML_OPTION_CASE_FOLDING => 0)) { + $xmlp = xml_parser_create(); + foreach($xmlParams as $opt => $optVal) { + switch( $opt ) { + case XML_OPTION_CASE_FOLDING: + $this->fold = $optVal; + break; + default: + break; + } + xml_parser_set_option($xmlp, $opt, $optVal); + } + + if(xml_parse_into_struct($xmlp, $input, $vals, $index)) { + $this->root = $this->_foldCase($vals[0]['tag']); + $this->params = $this->xml2ary($vals); + } + xml_parser_free($xmlp); + } + + function _foldCase($arg) { + return( $this->fold ? strtoupper($arg) : $arg); + } + +/* + * Credits for the structure of this function + * http://mysrc.blogspot.com/2007/02/php-xml-to-array-and-backwards.html + * + * Adapted by Ropu - 05/23/2007 + * + */ + function xml2ary($vals) { + + $mnary=array(); + $ary=&$mnary; + foreach ($vals as $r) { + $t=$r['tag']; + if ($r['type']=='open') { + if (isset($ary[$t]) && !empty($ary[$t])) { + if (isset($ary[$t][0])){ + $ary[$t][]=array(); + } + else { + $ary[$t]=array($ary[$t], array()); + } + $cv=&$ary[$t][count($ary[$t])-1]; + } + else { + $cv=&$ary[$t]; + } + $cv=array(); + if (isset($r['attributes'])) { + foreach ($r['attributes'] as $k=>$v) { + $cv[$k]=$v; + } + } + + $cv['_p']=&$ary; + $ary=&$cv; + + } else if ($r['type']=='complete') { + if (isset($ary[$t]) && !empty($ary[$t])) { // same as open + if (isset($ary[$t][0])) { + $ary[$t][]=array(); + } + else { + $ary[$t]=array($ary[$t], array()); + } + $cv=&$ary[$t][count($ary[$t])-1]; + } + else { + $cv=&$ary[$t]; + } + if (isset($r['attributes'])) { + foreach ($r['attributes'] as $k=>$v) { + $cv[$k]=$v; + } + } + $cv['VALUE'] = (isset($r['value']) ? $r['value'] : ''); + + } elseif ($r['type']=='close') { + $ary=&$ary['_p']; + } + } + + $this->_del_p($mnary); + return $mnary; + } + + // _Internal: Remove recursion in result array + function _del_p(&$ary) { + foreach ($ary as $k=>$v) { + if ($k==='_p') { + unset($ary[$k]); + } + else if(is_array($ary[$k])) { + $this->_del_p($ary[$k]); + } + } + } + + /* Returns the root of the XML data */ + function GetRoot() { + return $this->root; + } + + /* Returns the array representing the XML data */ + function GetData() { + return $this->params; + } + } + diff --git a/modules/gcheckout/logo.gif b/modules/gcheckout/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24a14a90921f6b698df98d4c7135dfc7d97dd70 GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGsZi0M!5h025YktnbGo08gz|s<y&cbG#f{vF-o%042RGw?Na` z`3n}L!p{B&W9WR3$9kmJzuxe~+v6xEi_R1oBs#H7v^)R*|F6>e6)LJGTgxdhbmjK_ zMs&&qHnH6p5{Zx56(4|an&}rilgut6O|?=0B9{06|II1@97(Xv-1EWp{}VCAATGs1 zZrlI$|6+ux-Ru7rKfl}>0A+>P(kKrxV7L=3pw=KSftlYiH?h#=|Jx-R4l2v(|NlI- zM9~ljA^8LV2LS&7EC2ui01yBW000J;zy_%@s0@w1iZbEzH7wAmR62TEdN5ppvg*_V z5a{W7P;pkU-jyNJK!4VmNG(l8ptL7Wq%cjTV-_J4E`L&R7BvQjQXWqkD2!1zPc0>W zP$mZvIyxy90#6SJ4hK;TIT#cl7CTQHEDH>nP&yz4786!55(^(276%6x0JwP;CMFvN Y5;iL_JSZ=~u98zbP1)MpJ~BZ7JC9qMJpcdz literal 0 HcmV?d00001 diff --git a/modules/gcheckout/payment.php b/modules/gcheckout/payment.php new file mode 100644 index 000000000..b65e1aff2 --- /dev/null +++ b/modules/gcheckout/payment.php @@ -0,0 +1,47 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/gcheckout.php'); + +if (!$cookie->isLogged(true)) + Tools::redirect('index.php?controller=authentication&back=order.php'); +elseif (!$cart->getOrderTotal(true, Cart::BOTH)) + Tools::displayError('Error: Empty cart'); + +$gcheckout = new GCheckout(); +// Prepare payment +$gcheckout->preparePayment(); + +include(dirname(__FILE__).'/../../header.php'); +// Display +echo $gcheckout->display('gcheckout.php', 'confirm.tpl'); + +include_once(dirname(__FILE__).'/../../footer.php'); + + diff --git a/modules/gcheckout/payment.tpl b/modules/gcheckout/payment.tpl new file mode 100644 index 000000000..3b86c359c --- /dev/null +++ b/modules/gcheckout/payment.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="payment_module"> + <a href="{$base_dir_ssl}modules/gcheckout/payment.php" title="{$buttonText}"> + <img src="modules/gcheckout/gcheckout.gif" alt="{$buttonText}" /> + {$buttonText} + </a> +</p> \ No newline at end of file diff --git a/modules/gcheckout/payment_return.tpl b/modules/gcheckout/payment_return.tpl new file mode 100644 index 000000000..24c60fcf6 --- /dev/null +++ b/modules/gcheckout/payment_return.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +Page de retour de paiement diff --git a/modules/gcheckout/validation.php b/modules/gcheckout/validation.php new file mode 100644 index 000000000..5c53e797a --- /dev/null +++ b/modules/gcheckout/validation.php @@ -0,0 +1,158 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/gcheckout.php'); +require_once(dirname(__FILE__).'/library/googleresponse.php'); +require_once(dirname(__FILE__).'/library/googlemerchantcalculations.php'); +require_once(dirname(__FILE__).'/library/googleresult.php'); +require_once(dirname(__FILE__).'/library/googlerequest.php'); +require_once(dirname(__FILE__).'/library/googlecart.php'); + + +$merchant_id = Configuration::get('GCHECKOUT_MERCHANT_ID'); +$merchant_key = Configuration::get('GCHECKOUT_MERCHANT_KEY'); +$server_type = Configuration::get('GCHECKOUT_MODE'); + +$Gresponse = new GoogleResponse($merchant_id, $merchant_key); +//$Grequest = new GoogleRequest($merchant_id, $merchant_key, $server_type, $currency); + +//Setup the log file +if (Configuration::get('GCHECKOUT_LOGS')) + $Gresponse->SetLogFiles('googleerror.log', 'googlemessage.log', L_ALL); + +// Retrieve the XML sent in the HTTP POST request to the ResponseHandler +$xml_response = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA:file_get_contents("php://input"); +if (get_magic_quotes_gpc()) + $xml_response = stripslashes($xml_response); + +list($root, $data) = $Gresponse->GetParsedXML($xml_response); +$Gresponse->SetMerchantAuthentication($merchant_id, $merchant_key); + +$status = $Gresponse->HttpAuthentication(); +if(!$status) + die('authentication failed'); + + /* Commands to send the various order processing APIs + * Send charge order : $Grequest->SendChargeOrder($data[$root] + * ['google-order-number']['VALUE'], <amount>); + * Send process order : $Grequest->SendProcessOrder($data[$root] + * ['google-order-number']['VALUE']); + * Send deliver order: $Grequest->SendDeliverOrder($data[$root] + * ['google-order-number']['VALUE'], <carrier>, <tracking-number>, + * <send_mail>); + * Send archive order: $Grequest->SendArchiveOrder($data[$root] + * ['google-order-number']['VALUE']); + * + */ + +switch ($root) { + case "request-received": { + break; + } + case "error": { + break; + } + case "diagnosis": { + break; + } + case "checkout-redirect": { + break; + } + case "merchant-calculation-callback": { + break; + } + case "new-order-notification": { + // secure_cart[0] => id_cart + // secure_cart[1] => secure_key + + $gcheckout = new GCheckout(); + $secure_cart = explode('|', $data[$root]['shopping-cart']['merchant-private-data']['VALUE']); + $cart = new Cart((int)$secure_cart[0]); + $currency = $gcheckout->getCurrency((int)$cart->id_currency); + unset($cart); + + $orderTotal = (float)($data[$root]['order-total']['VALUE']); + $gcheckout->validateOrder((int)$secure_cart[0], _PS_OS_PAYMENT_, (float)$orderTotal, + $gcheckout->displayName, NULL, array(), NULL, false, $secure_cart[1]); + $Gresponse->SendAck(); + break; + } + case "order-state-change-notification": { + $Gresponse->SendAck(); + break; + } + case "charge-amount-notification": { + $Gresponse->SendAck(); + break; + } + case "chargeback-amount-notification": { + $Gresponse->SendAck(); + break; + } + case "refund-amount-notification": { + $Gresponse->SendAck(); + break; + } + case "risk-information-notification": { + $Gresponse->SendAck(); + break; + } + default: + $Gresponse->SendBadRequestStatus("Invalid or not supported Message"); + break; +} + + +/* In case the XML API contains multiple open tags + with the same value, then invoke this function and + perform a foreach on the resultant array. + This takes care of cases when there is only one unique tag + or multiple tags. + Examples of this are "anonymous-address", "merchant-code-string" + from the merchant-calculations-callback API +*/ +function get_arr_result($child_node) { + $result = array(); + if(isset($child_node)) { + if(is_associative_array($child_node)) { + $result[] = $child_node; + } + else { + foreach($child_node as $curr_node){ + $result[] = $curr_node; + } + } + } + return $result; +} + +/* Returns true if a given variable represents an associative array */ +function is_associative_array($var) { + return is_array($var) && !is_numeric(implode('', array_keys($var))); +} + diff --git a/modules/graphartichow/artichow/AntiSpam.class.php b/modules/graphartichow/artichow/AntiSpam.class.php new file mode 100644 index 000000000..fea3cb23e --- /dev/null +++ b/modules/graphartichow/artichow/AntiSpam.class.php @@ -0,0 +1,224 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Image.class.php"; + +/** + * AntiSpam + * String printed on the images are case insensitive. + * + * @package Artichow + */ +class awAntiSpam extends awImage { + + /** + * Anti-spam string + * + * @var string + */ + protected $string; + + /** + * Noise intensity + * + * @var int + */ + protected $noise = 0; + + /** + * Construct a new awAntiSpam image + * + * @param string $string A string to display + */ + public function __construct($string = '') { + + parent::__construct(); + + $this->string = (string)$string; + + } + + /** + * Create a random string + * + * @param int $length String length + * @return string String created + */ + public function setRand($length) { + + $length = (int)$length; + + $this->string = ''; + + $letters = 'aAbBCDeEFgGhHJKLmMnNpPqQRsStTuVwWXYZz2345679'; + $number = strlen($letters); + + for($i = 0; $i < $length; $i++) { + $this->string .= $letters{mt_rand(0, $number - 1)}; + } + + return $this->string; + + } + + /** + * Set noise on image + * + * @param int $nois Noise intensity (from 0 to 10) + */ + public function setNoise($noise) { + if($noise < 0) { + $noise = 0; + } + if($noise > 10) { + $noise = 10; + } + $this->noise = (int)$noise; + } + + /** + * Save string value in session + * You can use check() to verify the value later + * + * @param string $qName A name that identify the anti-spam image + */ + public function save($qName) { + $this->session(); + $session = 'artichow_'.(string)$qName; + $_SESSION[$session] = $this->string; + } + + /** + * Verify user entry + * + * @param string $qName A name that identify the anti-spam image + * @param string $value User-defined value + * @param bool $case TRUE for case insensitive check, FALSE for case sensitive check ? (default to TRUE) + * @return bool TRUE if the value is correct, FALSE otherwise + */ + public function check($qName, $value, $case = TRUE) { + + $this->session(); + + $session = 'artichow_'.(string)$qName; + + return ( + array_key_exists($session, $_SESSION) === TRUE and + $case ? + (strtolower($_SESSION[$session]) === strtolower((string)$value)) : + ($_SESSION[$session] === (string)$value) + ); + + } + + /** + * Draw image + */ + public function draw() { + + $fonts = array( + 'Tuffy', + 'TuffyBold', + 'TuffyItalic', + 'TuffyBoldItalic' + ); + + $sizes = array(12, 12.5, 13, 13.5, 14, 15, 16, 17, 18, 19); + + $widths = array(); + $heights = array(); + $texts = array(); + + // Set up a temporary driver to allow font size calculations... + $this->setSize(10, 10); + $driver = $this->getDriver(); + + for($i = 0; $i < strlen($this->string); $i++) { + + $fontKey = array_rand($fonts); + $sizeKey = array_rand($sizes); + + $font = new awTTFFont( + $fonts[$fontKey], $sizes[$sizeKey] + ); + + $text = new awText( + $this->string{$i}, + $font, + NULL, + mt_rand(-15, 15) + ); + + $widths[] = $driver->getTextWidth($text); + $heights[] = $driver->getTextHeight($text); + $texts[] = $text; + + } + + // ... and get rid of it. + $this->driver = NULL; + + $width = array_sum($widths); + $height = array_max($heights); + + $totalWidth = $width + 10 + count($texts) * 10; + $totalHeight = $height + 20; + + $this->setSize($totalWidth, $totalHeight); + + $this->create(); + + for($i = 0; $i < strlen($this->string); $i++) { + + $this->driver->string( + $texts[$i], + new awPoint( + 5 + array_sum(array_slice($widths, 0, $i)) + $widths[$i] / 2 + $i * 10, + 10 + ($height - $heights[$i]) / 2 + ) + ); + + } + + $this->drawNoise($totalWidth, $totalHeight); + + $this->send(); + + } + + protected function drawNoise($width, $height) { + + $points = $this->noise * 30; + $color = new awColor(0, 0, 0); + + for($i = 0; $i < $points; $i++) { + $this->driver->point( + $color, + new awPoint( + mt_rand(0, $width), + mt_rand(0, $height) + ) + ); + } + + } + + protected function session() { + + // Start session if needed + if(!session_id()) { + session_start(); + } + + } + +} + +registerClass('AntiSpam'); + diff --git a/modules/graphartichow/artichow/Artichow.cfg.php b/modules/graphartichow/artichow/Artichow.cfg.php new file mode 100644 index 000000000..3b9f71555 --- /dev/null +++ b/modules/graphartichow/artichow/Artichow.cfg.php @@ -0,0 +1,84 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +/* + * Path to Artichow + */ + +define('ARTICHOW', dirname(__FILE__)); + + +/* + * Path to TrueType fonts + * DO NOT USE FONT PATH WITH SPACE CHARACTER (" ") WITH GD <= 2.0.18 + */ +if(!defined('ARTICHOW_FONT')) { + + define('ARTICHOW_FONT', ARTICHOW.DIRECTORY_SEPARATOR.'font'); + + } + +/* + * Patterns directory + */ +if(!defined('ARTICHOW_PATTERN')) { + + define('ARTICHOW_PATTERN', ARTICHOW.DIRECTORY_SEPARATOR.'patterns'); + + } + +/* + * Images directory + */ +if(!defined('ARTICHOW_IMAGE')) { + + define('ARTICHOW_IMAGE', ARTICHOW.DIRECTORY_SEPARATOR.'images'); + + } + +/* + * Enable/disable cache support + */ +define('ARTICHOW_CACHE', TRUE); + +/* + * Cache directory + */ +if(!defined('ARTICHOW_CACHE_DIRECTORY')) { + + define('ARTICHOW_CACHE_DIRECTORY', ARTICHOW.DIRECTORY_SEPARATOR.'cache'); + + } + +/* + * Prefix for class names + * No prefix by default + */ +define('ARTICHOW_PREFIX', ''); + +/* + * Trigger errors when use of a deprecated feature + */ +define('ARTICHOW_DEPRECATED', TRUE); + +/* + * Defines the default driver + */ +define('ARTICHOW_DRIVER', 'gd'); + +/* + * Fonts to use + */ +$fonts = array( + 'Tuffy', + 'TuffyBold', + 'TuffyBoldItalic', + 'TuffyItalic' +); + diff --git a/modules/graphartichow/artichow/BarPlot.class.php b/modules/graphartichow/artichow/BarPlot.class.php new file mode 100644 index 000000000..08b84848e --- /dev/null +++ b/modules/graphartichow/artichow/BarPlot.class.php @@ -0,0 +1,364 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Plot.class.php"; + +/** + * BarPlot + * + * @package Artichow + */ +class awBarPlot extends awPlot implements awLegendable { + + /** + * Labels on your bar plot + * + * @var Label + */ + public $label; + + /** + * Bar plot identifier + * + * @var int + */ + protected $identifier; + + /** + * Bar plot number + * + * @var int + */ + protected $number; + + /** + * Bar plot depth + * + * @var int + */ + protected $depth; + + /** + * For moving bars + * + * @var int + */ + protected $move; + + /** + * Bars shadow + * + * @var Shadow + */ + public $barShadow; + + /** + * Bars border + * + * @var Border + */ + public $barBorder; + + /** + * Bars padding + * + * @var Side + */ + protected $barPadding; + + /** + * Bars space + * + * @var int + */ + protected $barSpace = 0; + + /** + * Bars background + * + * @var Color, Gradient + */ + protected $barBackground; + + /** + * Construct a new awBarPlot + * + * @param array $values Some numeric values for Y axis + * @param int $identifier Plot identifier + * @param int $number Bar plot number + * @param int $depth Bar plot depth in pixels + */ + public function __construct($values, $identifier = 1, $number = 1, $depth = 0) { + + parent::__construct(); + + $this->label = new awLabel; + + $this->barPadding = new awSide(0.08, 0.08, 0, 0); + $this->barShadow = new awShadow(awShadow::RIGHT_TOP); + $this->barBorder = new awBorder; + + $this->setValues($values); + + $this->identifier = (int)$identifier; + $this->number = (int)$number; + $this->depth = (int)$depth; + + $this->move = new awSide; + + // Hide vertical grid + $this->grid->hideVertical(TRUE); + + } + + /** + * Change bars padding + * This method is not compatible with awBarPlot::setBarPadding() + * + * @param float $left Left padding (between 0 and 1) + * @param float $right Right padding (between 0 and 1) + */ + public function setBarPadding($left = NULL, $right = NULL) { + $this->barPadding->set($left, $right); + } + + /** + * Change bars size + * This method is not compatible with awBarPlot::setBarPadding() + * + * @param int $width Bars size (between 0 and 1) + */ + public function setBarSize($size) { + $padding = (1 - $size) / 2; + $this->barPadding->set($padding, $padding); + } + + /** + * Move bars + * + * @param int $x + * @param int $y + */ + public function move($x, $y) { + $this->move->set($x, NULL, $y, NULL); + } + + /** + * Change bars space + * + * @param int $space Space in pixels + */ + public function setBarSpace($space) { + $this->barSpace = (int)$space; + } + + /** + * Change line background color + * + * @param awColor $color + */ + public function setBarColor(awColor $color) { + $this->barBackground = $color; + } + + /** + * Change line background gradient + * + * @param awGradient $gradient + */ + public function setBarGradient(awGradient $gradient) { + $this->barBackground = $gradient; + } + + /** + * Get the line thickness + * + * @return int + */ + public function getLegendLineThickness() { + } + + /** + * Get the line type + * + * @return int + */ + public function getLegendLineStyle() { + } + + /** + * Get the color of line + * + * @return Color + */ + public function getLegendLineColor() { + } + + /** + * Get the background color or gradient of an element of the component + * + * @return Color, Gradient + */ + public function getLegendBackground() { + return $this->barBackground; + } + + /** + * Get a mark object + * + * @return Mark + */ + public function getLegendMark() { + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + $count = count($this->datay); + $max = $this->getRealYMax(NULL); + $min = $this->getRealYMin(NULL); + + // Find zero for bars + if($this->xAxisZero and $min <= 0 and $max >= 0) { + $zero = 0; + } else if($max < 0) { + $zero = $max; + } else { + $zero = $min; + } + + // Get base position + $zero = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint(0, $zero)); + + // Distance between two values on the graph + $distance = $this->xAxis->getDistance(0, 1); + + // Compute paddings + $leftPadding = $this->barPadding->left * $distance; + $rightPadding = $this->barPadding->right * $distance; + + $padding = $leftPadding + $rightPadding; + $space = $this->barSpace * ($this->number - 1); + + $barSize = ($distance - $padding - $space) / $this->number; + $barPosition = $leftPadding + $barSize * ($this->identifier - 1); + + for($key = 0; $key < $count; $key++) { + + $value = $this->datay[$key]; + + if($value !== NULL) { + + $position = awAxis::toPosition( + $this->xAxis, + $this->yAxis, + new awPoint($key, $value) + ); + + $barStart = $barPosition + ($this->identifier - 1) * $this->barSpace + $position->x; + $barStop = $barStart + $barSize; + + $t1 = min($zero->y, $position->y); + $t2 = max($zero->y, $position->y); + + if(round($t2 - $t1) == 0) { + continue; + } + + $p1 = new awPoint( + round($barStart) + $this->depth + $this->move->left, + round($t1) - $this->depth + $this->move->top + ); + + $p2 = new awPoint( + round($barStop) + $this->depth + $this->move->left, + round($t2) - $this->depth + $this->move->top + ); + + $this->drawBar($driver, $p1, $p2); + + } + + } + + // Draw labels + foreach($this->datay as $key => $value) { + + if($value !== NULL) { + + $position = awAxis::toPosition( + $this->xAxis, + $this->yAxis, + new awPoint($key, $value) + ); + + $point = new awPoint( + $barPosition + ($this->identifier - 1) * $this->barSpace + $position->x + $barSize / 2 + 1 + $this->depth, + $position->y - $this->depth + ); + + $this->label->draw($driver, $point, $key); + + } + + } + + } + + public function getXAxisNumber() { + return count($this->datay) + 1; + } + // ça bidouille à fond ici ! + public function getXMax() { + return array_max($this->datax) + 1; + } + + public function getXCenter() { + return TRUE; + } + + protected function drawBar(awDriver $driver, awPoint $p1, awPoint $p2) { + + // Draw shadow + $this->barShadow->draw( + $driver, + $p1, + $p2, + awShadow::OUT + ); + + if(abs($p2->y - $p1->y) > 1) { + + $this->barBorder->rectangle( + $driver, + $p1, + $p2 + ); + + if($this->barBackground !== NULL) { + + $size = $this->barBorder->visible() ? 1 : 0; + + $b1 = $p1->move($size, $size); + $b2 = $p2->move(-1 * $size, -1 * $size); + + // Draw background + $driver->filledRectangle( + $this->barBackground, + new awLine($b1, $b2) + ); + + } + + } + } + +} + +registerClass('BarPlot'); + diff --git a/modules/graphartichow/artichow/Component.class.php b/modules/graphartichow/artichow/Component.class.php new file mode 100644 index 000000000..2a683d67c --- /dev/null +++ b/modules/graphartichow/artichow/Component.class.php @@ -0,0 +1,415 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Graph.class.php"; + + +/** + * A graph can contain some groups of components + * + * @package Artichow + */ +abstract class awComponentGroup extends awComponent { + + /** + * Components of this group + * + * @var array + */ + protected $components; + + /** + * Build the component group + */ + public function __construct() { + parent::__construct(); + $this->components = array(); + } + + /** + * Add a component to the group + * + * @param awComponent $component A component + */ + public function add(awComponent $component) { + $this->components[] = $component; + } + +} + +registerClass('ComponentGroup', TRUE); + +abstract class awComponent { + + /** + * Component driver + * + * @var Driver + */ + protected $driver; + + /** + * Component width + * + * @var float + */ + public $width = 1.0; + + /** + * Component height + * + * @var float + */ + public $height = 1.0; + + /** + * Position X of the center the graph (from 0 to 1) + * + * @var float + */ + public $x = 0.5; + + /** + * Position Y of the center the graph (from 0 to 1) + * + * @var float + */ + public $y = 0.5; + + /** + * Component absolute width (in pixels) + * + * + * @var int + */ + public $w; + + /** + * Component absolute height (in pixels) + * + * + * @var int + */ + public $h; + + /** + * Left-top corner Y position + * + * @var float + */ + public $top; + + /** + * Left-top corner X position + * + * @var float + */ + public $left; + + /** + * Component background color + * + * @var Color + */ + protected $background; + + /** + * Component padding + * + * @var Side + */ + protected $padding; + + /** + * Component space + * + * @var Side + */ + protected $space; + + /** + * Component title + * + * @var Label + */ + public $title; + + /** + * Adjust automatically the component ? + * + * @var bool + */ + protected $auto = TRUE; + + /** + * Legend + * + * @var Legend + */ + public $legend; + + /** + * Build the component + */ + public function __construct() { + + // Component legend + $this->legend = new awLegend(); + + $this->padding = new awSide(25, 25, 25, 25); + $this->space = new awSide(0, 0, 0, 0); + + // Component title + $this->title = new awLabel( + NULL, + new awTuffy(10), + NULL, + 0 + ); + $this->title->setAlign(awLabel::CENTER, awLabel::TOP); + + } + + /** + * Adjust automatically the component ? + * + * @param bool $auto + */ + public function auto($auto) { + $this->auto = (bool)$auto; + } + + /** + * Change the size of the component + * + * @param int $width Component width (from 0 to 1) + * @param int $height Component height (from 0 to 1) + */ + public function setSize($width, $height) { + + $this->width = (float)$width; + $this->height = (float)$height; + + } + + /** + * Change the absolute size of the component + * + * @param int $w Component width (in pixels) + * @param int $h Component height (in pixels) + */ + public function setAbsSize($w, $h) { + + $this->w = (int)$w; + $this->h = (int)$h; + + } + + /** + * Change component background color + * + * @param awColor $color (can be null) + */ + public function setBackgroundColor($color) { + if($color === NULL or $color instanceof awColor) { + $this->background = $color; + } + } + + /** + * Change component background gradient + * + * @param awGradient $gradient (can be null) + */ + public function setBackgroundGradient($gradient) { + if($gradient === NULL or $gradient instanceof awGradient) { + $this->background = $gradient; + } + } + + /** + * Change component background image + * + * @param awImage $image (can be null) + */ + public function setBackgroundImage($image) { + if($image === NULL or $image instanceof awImage) { + $this->background = $image; + } + } + + /** + * Return the component background + * + * @return Color, Gradient + */ + public function getBackground() { + return $this->background; + } + + /** + * Change component padding + * + * @param int $left Padding in pixels (NULL to keep old value) + * @param int $right Padding in pixels (NULL to keep old value) + * @param int $top Padding in pixels (NULL to keep old value) + * @param int $bottom Padding in pixels (NULL to keep old value) + */ + public function setPadding($left = NULL, $right = NULL, $top = NULL, $bottom = NULL) { + $this->padding->set($left, $right, $top, $bottom); + } + + /** + * Change component space + * + * @param float $left Space in % (NULL to keep old value) + * @param float $right Space in % (NULL to keep old value) + * @param float $bottom Space in % (NULL to keep old value) + * @param float $top Space in % (NULL to keep old value) + */ + public function setSpace($left = NULL, $right = NULL, $bottom = NULL, $top = NULL) { + $this->space->set($left, $right, $bottom, $top); + } + + /** + * Change the absolute position of the component on the graph + * + * @var int $x Left-top corner X position + * @var int $y Left-top corner Y position + */ + public function setAbsPosition($left, $top) { + + $this->left = (int)$left; + $this->top = (int)$top; + + } + + /** + * Set the center of the component + * + * @param int $x Position X of the center of the component + * @param int $y Position Y of the center of the component + */ + public function setCenter($x, $y) { + + $this->x = (float)$x; + $this->y = (float)$y; + + } + + /** + * Get component coords with its padding + * + * @return array Coords of the component + */ + public function getPosition() { + + // Get component coords + $x1 = $this->padding->left; + $y1 = $this->padding->top; + $x2 = $this->w - $this->padding->right; + $y2 = $this->h - $this->padding->bottom; + + return array($x1, $y1, $x2, $y2); + + } + + /** + * Init the drawing of the component + */ + public function init(awDriver $driver) { + + // Set component background + $background = $this->getBackground(); + + if($background !== NULL) { + + $p1 = new awPoint(0, 0); + $p2 = new awPoint($this->w - 1, $this->h - 1); + + if($background instanceof awImage) { + + $driver->copyImage( + $background, + $p1, + $p2 + ); + + } else { + + $driver->filledRectangle( + $background, + new awLine($p1, $p2) + ); + + } + + } + } + + /** + * Finalize the drawing of the component + */ + public function finalize(awDriver $driver) { + + // Draw component title + $point = new awPoint( + $this->w / 2, + $this->padding->top - 8 + ); + $this->title->draw($driver, $point); + + // Draw legend + $this->legend->draw($driver); + + } + + /** + * Draw the grid around your component + * + * @param Driver A driver + * @return array Coords for the component + */ + abstract public function drawEnvelope(awDriver $driver); + + /** + * Draw the component on the graph + * Component should be drawed into specified coords + * + * @param Driver A driver + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + * @param bool $aliasing Use anti-aliasing to draw the component ? + */ + abstract public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing); + + /** + * Get space width in pixels + * + * @param int $width Component width + * @param int $height Component height + * @return array + */ + protected function getSpace($width, $height) { + + $left = (int)($width * $this->space->left / 100); + $right = (int)($width * $this->space->right / 100); + $top = (int)($height * $this->space->top / 100); + $bottom = (int)($height * $this->space->bottom / 100); + + return array($left, $right, $top, $bottom); + + } + +} + +registerClass('Component', TRUE); + diff --git a/modules/graphartichow/artichow/Graph.class.php b/modules/graphartichow/artichow/Graph.class.php new file mode 100644 index 000000000..bf018a518 --- /dev/null +++ b/modules/graphartichow/artichow/Graph.class.php @@ -0,0 +1,412 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Image.class.php"; + + +/** + * A graph + * + * @package Artichow + */ +class awGraph extends awImage { + + /** + * Graph name + * + * @var string + */ + protected $name; + + /** + * Cache timeout + * + * @var int + */ + protected $timeout = 0; + + /** + * Graph timing ? + * + * @var bool + */ + protected $timing; + + /** + * Components + * + * @var array + */ + private $components = array(); + + /** + * Some labels to add to the component + * + * @var array + */ + protected $labels = array(); + + /** + * Graph title + * + * @var Label + */ + public $title; + + /** + * File cache location + * + * @var string + */ + private $fileCache; + + /** + * Time file cache location + * + * @var string + */ + private $fileCacheTime; + + /** + * Drawing mode to return the graph + * + * @var int + */ + const DRAW_RETURN = 1; + + /** + * Drawing mode to display the graph + * + * @var int + */ + const DRAW_DISPLAY = 2; + + /** + * Construct a new graph + * + * @param int $width Graph width + * @param int $height Graph height + * @param string $name Graph name for the cache (must be unique). Let it null to not use the cache. + * @param int $timeout Cache timeout (unix timestamp) + */ + public function __construct($width = NULL, $height = NULL, $name = NULL, $timeout = 0) { + + parent::__construct(); + + $this->setSize($width, $height); + + if(ARTICHOW_CACHE) { + + $this->name = $name; + $this->timeout = $timeout; + + // Clean sometimes all the cache + if(mt_rand(0, 5000) === 0) { + awGraph::cleanCache(); + } + + // Take the graph from the cache if possible + if($this->name !== NULL) { + + $this->fileCache = ARTICHOW_CACHE_DIRECTORY."/".$this->name; + $this->fileCacheTime = $this->fileCache."-time"; + + if(is_file($this->fileCache)) { + + $type = awGraph::cleanGraphCache($this->fileCacheTime); + + if($type === NULL) { + awGraph::deleteFromCache($this->name); + } else { + header("Content-Type: image/".$type); + echo file_get_contents($this->fileCache); + exit; + } + + } + + } + + } + + $this->title = new awLabel( + NULL, + new awTuffy(16), + NULL, + 0 + ); + $this->title->setAlign(awLabel::CENTER, awLabel::BOTTOM); + + } + + /** + * Delete a graph from the cache + * + * @param string $name Graph name + * @return bool TRUE on success, FALSE on failure + */ + public static function deleteFromCache($name) { + + if(ARTICHOW_CACHE) { + + if(is_file(ARTICHOW_CACHE_DIRECTORY."/".$name."-time")) { + unlink(ARTICHOW_CACHE_DIRECTORY."/".$name.""); + unlink(ARTICHOW_CACHE_DIRECTORY."/".$name."-time"); + } + + } + + } + + /** + * Delete all graphs from the cache + */ + public static function deleteAllCache() { + + if(ARTICHOW_CACHE) { + + $dp = opendir(ARTICHOW_CACHE_DIRECTORY); + + while($file = readdir($dp)) { + if($file !== '.' and $file != '..') { + unlink(ARTICHOW_CACHE_DIRECTORY."/".$file); + } + } + + } + + } + + /** + * Clean cache + */ + public static function cleanCache() { + + if(ARTICHOW_CACHE) { + + $glob = glob(ARTICHOW_CACHE_DIRECTORY."/*-time"); + + foreach($glob as $file) { + + $type = awGraph::cleanGraphCache($file); + + if($type === NULL) { + $name = preg_replace('!.*/(.*)\-time!', "\\1", $file); + awGraph::deleteFromCache($name); + } + + } + + } + + } + + /** + * Enable/Disable Graph timing + * + * @param bool $timing + */ + public function setTiming($timing) { + $this->timing = (bool)$timing; + } + + /** + * Add a component to the graph + * + * @param awComponent $component + */ + public function add(awComponent $component) { + + $this->components[] = $component; + + } + + /** + * Add a label to the component + * + * @param awLabel $label + * @param int $x Position on X axis of the center of the text + * @param int $y Position on Y axis of the center of the text + */ + public function addLabel(awLabel $label, $x, $y) { + + $this->labels[] = array( + $label, $x, $y + ); + + } + + /** + * Add a label to the component with absolute position + * + * @param awLabel $label + * @param awPoint $point Text position + */ + public function addAbsLabel(awLabel $label, awPoint $point) { + + $this->labels[] = array( + $label, $point + ); + + } + + /** + * Build the graph and draw component on it + * + * @param string $mode Display mode (can be a file name) + */ + public function draw($mode = Graph::DRAW_DISPLAY) { + + if($this->timing) { + $time = microtimeFloat(); + } + + $this->create(); + + foreach($this->components as $component) { + + $this->drawComponent($component); + + } + + $this->drawTitle(); + $this->drawShadow(); + $this->drawLabels(); + + if($this->timing) { + $this->drawTiming(microtimeFloat() - $time); + } + + // Create graph + $data = $this->get(); + + // Put the graph in the cache if needed + $this->cache($data); + + switch($mode) { + + case Graph::DRAW_DISPLAY : + $this->sendHeaders(); + echo $data; + break; + + case Graph::DRAW_RETURN : + return $data; + + default : + if(is_string($mode)) { + file_put_contents($mode, $data); + } else { + awImage::drawError("Class Graph: Unable to draw the graph."); + } + + } + + } + + private function drawLabels() { + + $driver = $this->getDriver(); + + foreach($this->labels as $array) { + + if(count($array) === 3) { + + // Text in relative position + list($label, $x, $y) = $array; + + $point = new awPoint( + $x * $this->width, + $y * $this->height + ); + + } else { + + // Text in absolute position + list($label, $point) = $array; + + } + + $label->draw($driver, $point); + + } + + } + + private function drawTitle() { + + $driver = $this->getDriver(); + + $point = new awPoint( + $this->width / 2, + 10 + ); + + $this->title->draw($driver, $point); + + } + + private function drawTiming($time) { + + $driver = $this->getDriver(); + + $label = new awLabel; + $label->set("(".sprintf("%.3f", $time)." s)"); + $label->setAlign(awLabel::LEFT, awLabel::TOP); + $label->border->show(); + $label->setPadding(1, 0, 0, 0); + $label->setBackgroundColor(new awColor(230, 230, 230, 25)); + + $label->draw($driver, new awPoint(5, $driver->imageHeight - 5)); + + } + + private function cache($data) { + if(ARTICHOW_CACHE and $this->name !== NULL) { + + if(is_writable(ARTICHOW_CACHE_DIRECTORY) === FALSE) { + awImage::drawError("Class Graph: Cache directory is not writable."); + } + + file_put_contents($this->fileCache, $data); + file_put_contents($this->fileCacheTime, $this->timeout."\n".$this->getFormatString()); + + } + } + + private static function cleanGraphCache($file) { + + list( + $time, + $type + ) = explode("\n", file_get_contents($file)); + + $time = (int)$time; + + if($time !== 0 and $time < time()) { + return NULL; + } else { + return $type; + } + + + } + +} + +registerClass('Graph'); + +/* + * To preserve PHP 4 compatibility + */ +function microtimeFloat() { + list($usec, $sec) = explode(" ", microtime()); + return (float)$usec + (float)$sec; +} + diff --git a/modules/graphartichow/artichow/Image.class.php b/modules/graphartichow/artichow/Image.class.php new file mode 100644 index 000000000..129508e3f --- /dev/null +++ b/modules/graphartichow/artichow/Image.class.php @@ -0,0 +1,606 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + + +if(is_file(dirname(__FILE__)."/Artichow.cfg.php")) { // For PHP 4+5 version + require_once dirname(__FILE__)."/Artichow.cfg.php"; +} + + + + +/* + * Register a class with the prefix in configuration file + */ +function registerClass($class, $abstract = FALSE) { + + if(ARTICHOW_PREFIX === 'aw') { + return; + } + + + if($abstract) { + $abstract = 'abstract'; + } else { + $abstract = ''; + } + + + eval($abstract." class ".ARTICHOW_PREFIX.$class." extends aw".$class." { }"); + +} + +/* + * Register an interface with the prefix in configuration file + */ +function registerInterface($interface) { + + if(ARTICHOW_PREFIX === 'aw') { + return; + } + + + eval("interface ".ARTICHOW_PREFIX.$interface." extends aw".$interface." { }"); + + +} + +// Some useful files +require_once ARTICHOW."/Component.class.php"; + +require_once ARTICHOW."/inc/Grid.class.php"; +require_once ARTICHOW."/inc/Tools.class.php"; +require_once ARTICHOW."/inc/Driver.class.php"; +require_once ARTICHOW."/inc/Math.class.php"; +require_once ARTICHOW."/inc/Tick.class.php"; +require_once ARTICHOW."/inc/Axis.class.php"; +require_once ARTICHOW."/inc/Legend.class.php"; +require_once ARTICHOW."/inc/Mark.class.php"; +require_once ARTICHOW."/inc/Label.class.php"; +require_once ARTICHOW."/inc/Text.class.php"; +require_once ARTICHOW."/inc/Color.class.php"; +require_once ARTICHOW."/inc/Font.class.php"; +require_once ARTICHOW."/inc/Gradient.class.php"; +require_once ARTICHOW."/inc/Shadow.class.php"; +require_once ARTICHOW."/inc/Border.class.php"; + +require_once ARTICHOW."/common.php"; + +/** + * An image for a graph + * + * @package Artichow + */ +class awImage { + + /** + * Graph width + * + * @var int + */ + public $width; + + /** + * Graph height + * + * @var int + */ + public $height; + + /** + * Use anti-aliasing ? + * + * @var bool + */ + protected $antiAliasing = FALSE; + + /** + * Image format + * + * @var int + */ + protected $format = awImage::PNG; + + /** + * Image background color + * + * @var Color + */ + protected $background; + + /** + * GD resource + * + * @var resource + */ + protected $resource; + + /** + * A Driver object + * + * @var Driver + */ + protected $driver; + + /** + * Driver string + * + * @var string + */ + protected $driverString; + + /** + * Shadow + * + * @var Shadow + */ + public $shadow; + + /** + * Image border + * + * @var Border + */ + public $border; + + /** + * Use JPEG for image + * + * @var int + */ + const JPEG = IMG_JPG; + + /** + * Use PNG for image + * + * @var int + */ + const PNG = IMG_PNG; + + /** + * Use GIF for image + * + * @var int + */ + const GIF = IMG_GIF; + + /** + * Build the image + */ + public function __construct() { + + $this->background = new awColor(255, 255, 255); + $this->shadow = new awShadow(awShadow::RIGHT_BOTTOM); + $this->border = new awBorder; + + } + + /** + * Get driver of the image + * + * @param int $w Driver width (from 0 to 1) (default to 1) + * @param int $h Driver height (from 0 to 1) (default to 1) + * @param float $x Position on X axis of the center of the driver (default to 0.5) + * @param float $y Position on Y axis of the center of the driver (default to 0.5) + * @return Driver + */ + public function getDriver($w = 1, $h = 1, $x = 0.5, $y = 0.5) { + $this->create(); + $this->driver->setSize($w, $h); + $this->driver->setPosition($x, $y); + return $this->driver; + } + + /** + * Sets the driver that will be used to draw the graph + * + * @param string $driverString + */ + public function setDriver($driverString) { + $this->driver = $this->selectDriver($driverString); + + $this->driver->init($this); + } + + /** + * Change the image size + * + * @var int $width Image width + * @var int $height Image height + */ + public function setSize($width, $height) { + + if($width !== NULL) { + $this->width = (int)$width; + } + if($height !== NULL) { + $this->height = (int)$height; + } + + } + + /** + * Change image background + * + * @param mixed $background + */ + public function setBackground($background) { + if($background instanceof awColor) { + $this->setBackgroundColor($background); + } elseif($background instanceof awGradient) { + $this->setBackgroundGradient($background); + } + } + + /** + * Change image background color + * + * @param awColor $color + */ + public function setBackgroundColor(awColor $color) { + $this->background = $color; + } + + /** + * Change image background gradient + * + * @param awGradient $gradient + */ + public function setBackgroundGradient(awGradient $gradient) { + $this->background = $gradient; + } + + /** + * Return image background, whether a Color or a Gradient + * + * @return mixed + */ + public function getBackground() { + return $this->background; + } + + /** + * Turn antialiasing on or off + * + * @var bool $bool + */ + public function setAntiAliasing($bool) { + $this->antiAliasing = (bool)$bool; + } + + /** + * Return the antialiasing setting + * + * @return bool + */ + public function getAntiAliasing() { + return $this->antiAliasing; + } + + /** + * Change image format + * + * @var int $format New image format + */ + public function setFormat($format) { + if($format === awImage::JPEG or $format === awImage::PNG or $format === awImage::GIF) { + $this->format = $format; + } + } + + /** + * Returns the image format as an integer + * + * @return unknown + */ + public function getFormat() { + return $this->format; + } + + /** + * Returns the image format as a string + * + * @return string + */ + public function getFormatString() { + + switch($this->format) { + case awImage::JPEG : + return 'jpeg'; + case awImage::PNG : + return 'png'; + case awImage::GIF : + return 'gif'; + } + + } + + /** + * Create a new awimage + */ + public function create() { + + if($this->driver === NULL) { + $driver = $this->selectDriver($this->driverString); + + $driver->init($this); + + $this->driver = $driver; + } + + } + + /** + * Select the correct driver + * + * @param string $driver The desired driver + * @return mixed + */ + protected function selectDriver($driver) { + $drivers = array('gd'); + $driver = strtolower((string)$driver); + + if(in_array($driver, $drivers, TRUE)) { + $string = $driver; + } else { + $string = ARTICHOW_DRIVER; + } + + switch ($string) { + case 'gd': + require_once ARTICHOW.'/inc/drivers/gd.class.php'; + $this->driverString = $string; + return new awGDDriver(); + + default: + // We should never get here, unless the wrong string is used AND the ARTICHOW_DRIVER + // global has been messed with. + awImage::drawError('Class Image: Unknown driver type (\''.$string.'\')'); + break; + } + } + + /** + * Draw a component on the image + * + * @var awComponent $component A component + */ + public function drawComponent(awComponent $component) { + + $shadow = $this->shadow->getSpace(); // Image shadow + $border = $this->border->visible() ? 1 : 0; // Image border size + + $driver = clone $this->driver; + $driver->setImageSize( + $this->width - $shadow->left - $shadow->right - $border * 2, + $this->height - $shadow->top - $shadow->bottom - $border * 2 + ); + + // No absolute size specified + if($component->w === NULL and $component->h === NULL) { + + list($width, $height) = $driver->setSize($component->width, $component->height); + + // Set component size in pixels + $component->setAbsSize($width, $height); + + } else { + + $driver->setAbsSize($component->w, $component->h); + + } + + if($component->top !== NULL and $component->left !== NULL) { + $driver->setAbsPosition( + $border + $shadow->left + $component->left, + $border + $shadow->top + $component->top + ); + } else { + $driver->setPosition($component->x, $component->y); + } + + $driver->movePosition($border + $shadow->left, $border + $shadow->top); + + list($x1, $y1, $x2, $y2) = $component->getPosition(); + + $component->init($driver); + + $component->drawComponent($driver, $x1, $y1, $x2, $y2, $this->antiAliasing); + $component->drawEnvelope($driver, $x1, $y1, $x2, $y2); + + $component->finalize($driver); + + } + + protected function drawShadow() { + + $driver = $this->getDriver(); + + $this->shadow->draw( + $driver, + new awPoint(0, 0), + new awPoint($this->width, $this->height), + awShadow::IN + ); + + } + + /** + * Send the image into a file or to the user browser + * + */ + public function send() { + $this->driver->send($this); + } + + /** + * Return the image content as binary data + * + */ + public function get() { + return $this->driver->get($this); + } + + /** + * Send the correct HTTP header according to the image type + * + */ + public function sendHeaders() { + + if(headers_sent() === FALSE) { + + switch ($this->driverString) { + case 'gd' : + header('Content-type: image/'.$this->getFormatString()); + break; + + } + + } + + } + + + private static $errorWriting = FALSE; + + + /* + * Display an error image and exit + * + * @param string $message Error message + */ + public static function drawError($message) { + + + if(self::$errorWriting) { + return; + } + + self::$errorWriting = TRUE; + + $message = wordwrap($message, 40, "\n", TRUE); + + $width = 400; + $height = max(100, 40 + 22.5 * (substr_count($message, "\n") + 1)); + + $image = new awImage(); + $image->setSize($width, $height); + $image->setDriver('gd'); + + $driver = $image->getDriver(); + $driver->init($image); + + // Display title + $driver->filledRectangle( + new awWhite, + new awLine( + new awPoint(0, 0), + new awPoint($width, $height) + ) + ); + + $driver->filledRectangle( + new awRed, + new awLine( + new awPoint(0, 0), + new awPoint(110, 25) + ) + ); + + $text = new awText( + "Artichow error", + new awFont3, + new awWhite, + 0 + ); + + $driver->string($text, new awPoint(5, 6)); + + // Display red box + $driver->rectangle( + new awRed, + new awLine( + new awPoint(0, 25), + new awPoint($width - 90, $height - 1) + ) + ); + + // Display error image + $file = ARTICHOW_IMAGE.DIRECTORY_SEPARATOR.'error.png'; + + $imageError = new awFileImage($file); + $driver->copyImage( + $imageError, + new awPoint($width - 81, $height - 81), + new awPoint($width - 1, $height - 1) + ); + + // Draw message + $text = new awText( + strip_tags($message), + new awFont2, + new awBlack, + 0 + ); + + $driver->string($text, new awPoint(10, 40)); + + $image->send(); + + exit; + + } + + /* + * Display an error image located in a file and exit + * + * @param string $error Error name + */ + public static function drawErrorFile($error) { + + $file = ARTICHOW_IMAGE.DIRECTORY_SEPARATOR.'errors'.DIRECTORY_SEPARATOR.$error.'.png'; + + header("Content-Type: image/png"); + readfile($file); + exit; + + } + +} + +registerClass('Image'); + + +/** + * Load an image from a file + * + * @package Artichow + */ +class awFileImage extends awImage { + + /** + * Build a new awimage + * + * @param string $file Image file name + */ + public function __construct($file) { + + $driver = $this->selectDriver($this->driverString); + + $driver->initFromFile($this, $file); + + $this->driver = $driver; + + } + +} + +registerClass('FileImage'); + + diff --git a/modules/graphartichow/artichow/LinePlot.class.php b/modules/graphartichow/artichow/LinePlot.class.php new file mode 100644 index 000000000..e2a494c39 --- /dev/null +++ b/modules/graphartichow/artichow/LinePlot.class.php @@ -0,0 +1,585 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Plot.class.php"; + + +/** + * LinePlot + * + * @package Artichow + */ +class awLinePlot extends awPlot implements awLegendable { + + /** + * Add marks to your line plot + * + * @var Mark + */ + public $mark; + + /** + * Labels on your line plot + * + * @var Label + */ + public $label; + + /** + * Filled areas + * + * @var bool + */ + protected $areas = array(); + + /** + * Is the line hidden + * + * @var bool + */ + protected $lineHide = FALSE; + + /** + * Line color + * + * @var Color + */ + protected $lineColor; + + /** + * Line mode + * + * @var int + */ + protected $lineMode = awLinePlot::LINE; + + /** + * Line type + * + * @var int + */ + protected $lineStyle = awLine::SOLID; + + /** + * Line thickness + * + * @var int + */ + protected $lineThickness = 1; + + /** + * Line background + * + * @var Color, Gradient + */ + protected $lineBackground; + + /** + * Line mode + * + * @var int + */ + const LINE = 0; + + /** + * Line in the middle + * + * @var int + */ + const MIDDLE = 1; + + /** + * Construct a new awLinePlot + * + * @param array $values Some numeric values for Y axis + * @param int $mode + */ + public function __construct($values, $mode = awLinePlot::LINE) { + + parent::__construct(); + + $this->mark = new awMark; + $this->label = new awLabel; + + $this->lineMode = (int)$mode; + + $this->setValues($values); + + } + + /** + * Hide line + * + * @param bool $hide + */ + public function hideLine($hide) { + $this->lineHide = (bool)$hide; + } + + /** + * Add a filled area + * + * @param int $start Begining of the area + * @param int $end End of the area + * @param mixed $background Background color or gradient of the area + */ + public function setFilledArea($start, $stop, $background) { + + if($stop <= $start) { + awImage::drawError("Class LinePlot: End position can not be greater than begin position in setFilledArea()."); + } + + $this->areas[] = array((int)$start, (int)$stop, $background); + + } + + /** + * Change line color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->lineColor = $color; + } + + /** + * Change line style + * + * @param int $style + */ + public function setStyle($style) { + $this->lineStyle = (int)$style; + } + + /** + * Change line tickness + * + * @param int $tickness + */ + public function setThickness($tickness) { + $this->lineThickness = (int)$tickness; + } + + /** + * Change line background color + * + * @param awColor $color + */ + public function setFillColor(awColor $color) { + $this->lineBackground = $color; + } + + /** + * Change line background gradient + * + * @param awGradient $gradient + */ + public function setFillGradient(awGradient $gradient) { + $this->lineBackground = $gradient; + } + + /** + * Get the line thickness + * + * @return int + */ + public function getLegendLineThickness() { + return $this->lineThickness; + } + + /** + * Get the line type + * + * @return int + */ + public function getLegendLineStyle() { + return $this->lineStyle; + } + + /** + * Get the color of line + * + * @return Color + */ + public function getLegendLineColor() { + return $this->lineColor; + } + + /** + * Get the background color or gradient of an element of the component + * + * @return Color, Gradient + */ + public function getLegendBackground() { + return $this->lineBackground; + } + + /** + * Get a mark object + * + * @return Mark + */ + public function getLegendMark() { + return $this->mark; + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + $max = $this->getRealYMax(); + $min = $this->getRealYMin(); + + // Get start and stop values + list($start, $stop) = $this->getLimit(); + + if($this->lineMode === awLinePlot::MIDDLE) { + $inc = $this->xAxis->getDistance(0, 1) / 2; + } else { + $inc = 0; + } + + // Build the polygon + $polygon = new awPolygon; + + for($key = $start; $key <= $stop; $key++) { + + $value = $this->datay[$key]; + + if($value !== NULL) { + + $p = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($key, $value)); + $p = $p->move($inc, 0); + $polygon->set($key, $p); + + } + + } + + // Draw backgrounds + if($this->lineBackground instanceof awColor or $this->lineBackground instanceof awGradient) { + + $backgroundPolygon = new awPolygon; + + $p = $this->xAxisPoint($start); + $p = $p->move($inc, 0); + $backgroundPolygon->append($p); + + // Add others points + foreach($polygon->all() as $point) { + $backgroundPolygon->append(clone $point); + } + + $p = $this->xAxisPoint($stop); + $p = $p->move($inc, 0); + $backgroundPolygon->append($p); + + // Draw polygon background + $driver->filledPolygon($this->lineBackground, $backgroundPolygon); + + } + + $this->drawArea($driver, $polygon); + + // Draw line + $prev = NULL; + + // Line color + if($this->lineHide === FALSE) { + + if($this->lineColor === NULL) { + $this->lineColor = new awColor(0, 0, 0); + } + + foreach($polygon->all() as $point) { + + if($prev !== NULL) { + $driver->line( + $this->lineColor, + new awLine( + $prev, + $point, + $this->lineStyle, + $this->lineThickness + ) + ); + } + $prev = $point; + + } + + } + + // Draw marks and labels + foreach($polygon->all() as $key => $point) { + + $this->mark->draw($driver, $point); + $this->label->draw($driver, $point, $key); + + } + + } + + protected function drawArea(awDriver $driver, awPolygon $polygon) { + + $starts = array(); + foreach($this->areas as $area) { + list($start) = $area; + $starts[$start] = TRUE; + } + + // Draw filled areas + foreach($this->areas as $area) { + + list($start, $stop, $background) = $area; + + $polygonArea = new awPolygon; + + $p = $this->xAxisPoint($start); + $polygonArea->append($p); + + for($i = $start; $i <= $stop; $i++) { + $p = clone $polygon->get($i); + if($i === $stop and array_key_exists($stop, $starts)) { + $p = $p->move(-1, 0); + } + $polygonArea->append($p); + } + + $p = $this->xAxisPoint($stop); + if(array_key_exists($stop, $starts)) { + $p = $p->move(-1, 0); + } + $polygonArea->append($p); + + // Draw area + $driver->filledPolygon($background, $polygonArea); + + } + + } + + public function getXAxisNumber() { + if($this->lineMode === awLinePlot::MIDDLE) { + return count($this->datay) + 1; + } else { + return count($this->datay); + } + } + + protected function xAxisPoint($position) { + $y = $this->xAxisZero ? 0 : $this->getRealYMin(); + return awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($position, $y)); + } + + public function getXCenter() { + return ($this->lineMode === awLinePlot::MIDDLE); + } + +} + +registerClass('LinePlot'); + + +/** + * Simple LinePlot + * Useful to draw simple horizontal lines + * + * @package Artichow + */ +class awSimpleLinePlot extends awPlot implements awLegendable { + + /** + * Line color + * + * @var Color + */ + protected $lineColor; + + /** + * Line start + * + * @var int + */ + protected $lineStart; + + /** + * Line stop + * + * @var int + */ + protected $lineStop; + + /** + * Line value + * + * @var flaot + */ + protected $lineValue; + + /** + * Line mode + * + * @var int + */ + protected $lineMode = awLinePlot::LINE; + + /** + * Line type + * + * @var int + */ + protected $lineStyle = awLine::SOLID; + + /** + * Line thickness + * + * @var int + */ + protected $lineThickness = 1; + + /** + * Line mode + * + * @var int + */ + const LINE = 0; + + /** + * Line in the middle + * + * @var int + */ + const MIDDLE = 1; + + /** + * Construct a new awLinePlot + * + * @param float $value A Y value + * @param int $start Line start index + * @param int $stop Line stop index + * @param int $mode Line mode + */ + public function __construct($value, $start, $stop, $mode = awLinePlot::LINE) { + + parent::__construct(); + + $this->lineMode = (int)$mode; + + $this->lineStart = (int)$start; + $this->lineStop = (int)$stop; + $this->lineValue = (float)$value; + + $this->lineColor = new awColor(0, 0, 0); + + } + + /** + * Change line color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->lineColor = $color; + } + + /** + * Change line style + * + * @param int $style + */ + public function setStyle($style) { + $this->lineStyle = (int)$style; + } + + /** + * Change line tickness + * + * @param int $tickness + */ + public function setThickness($tickness) { + $this->lineThickness = (int)$tickness; + } + + /** + * Get the line thickness + * + * @return int + */ + public function getLegendLineThickness() { + return $this->lineThickness; + } + + /** + * Get the line type + * + * @return int + */ + public function getLegendLineStyle() { + return $this->lineStyle; + } + + /** + * Get the color of line + * + * @return Color + */ + public function getLegendLineColor() { + return $this->lineColor; + } + + public function getLegendBackground() { + return NULL; + } + + public function getLegendMark() { + return NULL; + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + if($this->lineMode === awLinePlot::MIDDLE) { + $inc = $this->xAxis->getDistance(0, 1) / 2; + } else { + $inc = 0; + } + + $p1 = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($this->lineStart, $this->lineValue)); + $p2 = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($this->lineStop, $this->lineValue)); + + $driver->line( + $this->lineColor, + new awLine( + $p1->move($inc, 0), + $p2->move($inc, 0), + $this->lineStyle, + $this->lineThickness + ) + ); +} + + public function getXAxisNumber() { + if($this->lineMode === awLinePlot::MIDDLE) { + return count($this->datay) + 1; + } else { + return count($this->datay); + } + } + + protected function xAxisPoint($position) { + $y = $this->xAxisZero ? 0 : $this->getRealYMin(); + return awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($position, $y)); + } + + public function getXCenter() { + return ($this->lineMode === awLinePlot::MIDDLE); + } + +} + +registerClass('SimpleLinePlot'); + diff --git a/modules/graphartichow/artichow/MathPlot.class.php b/modules/graphartichow/artichow/MathPlot.class.php new file mode 100644 index 000000000..7d318207d --- /dev/null +++ b/modules/graphartichow/artichow/MathPlot.class.php @@ -0,0 +1,438 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Component.class.php"; + +/** + * A mathematic function + * + * @package Artichow + */ +class awMathFunction implements awLegendable { + + /** + * Function line + * + * @var Line + */ + public $line; + + /** + * Marks for your plot + * + * @var Mark + */ + public $mark; + + /** + * Callback function + * + * @var string + */ + public $f; + + /** + * Start the drawing from this value + * + * @var float + */ + public $fromX; + + /** + * Stop the drawing at this value + * + * @var float + */ + public $toX; + + /** + * Line color + * + * @var Color + */ + protected $color; + + /** + * Construct the function + * + * @param string $f Callback function + * @param float $fromX + * @param float $toX + */ + public function __construct($f, $fromX = NULL, $toX = NULL) { + + $this->f = (string)$f; + $this->fromX = is_null($fromX) ? NULL : (float)$fromX; + $this->toX = is_null($toX) ? NULL : (float)$toX; + + $this->line = new awLine; + $this->mark = new awMark; + $this->color = new awBlack; + + } + + /** + * Change line color + * + * @param awColor $color A new awcolor + */ + public function setColor(awColor $color) { + $this->color = $color; + } + + /** + * Get line color + * + * @return Color + */ + public function getColor() { + return $this->color; + } + + /** + * Get the background color or gradient of an element of the component + * + * @return Color, Gradient + */ + public function getLegendBackground() { + } + + /** + * Get the line thickness + * + * @return NULL + */ + public function getLegendLineThickness() { + return $this->line->getThickness(); + } + + /** + * Get the line type + * + * @return NULL + */ + public function getLegendLineStyle() { + return $this->line->getStyle(); + } + + /** + * Get the color of line + * + * @return NULL + */ + public function getLegendLineColor() { + return $this->color; + } + + /** + * Get a mark object + * + * @return NULL + */ + public function getLegendMark() { + return $this->mark; + } + +} + +registerClass('MathFunction'); + +/** + * For mathematics functions + * + * @package Artichow + */ +class awMathPlot extends awComponent { + + /** + * Functions + * + * @var array + */ + protected $functions = array(); + + /** + * Grid properties + * + * @var Grid + */ + public $grid; + + /** + * X axis + * + * @var Axis + */ + public $xAxis; + + /** + * Y axis + * + * @var Axis + */ + public $yAxis; + + /** + * Extremum + * + * @var Side + */ + private $extremum = NULL; + + /** + * Interval + * + * @var float + */ + private $interval = 1; + + /** + * Build the plot + * + * @param int $xMin Minimum X value + * @param int $xMax Maximum X value + * @param int $yMax Maximum Y value + * @param int $yMin Minimum Y value + */ + public function __construct($xMin, $xMax, $yMax, $yMin) { + + parent::__construct(); + + $this->setPadding(8, 8, 8, 8); + + $this->grid = new awGrid; + + // Hide grid by default + $this->grid->hide(TRUE); + + // Set extremum + $this->extremum = new awSide($xMin, $xMax, $yMax, $yMin); + + // Create axis + $this->xAxis = new awAxis; + $this->xAxis->setTickStyle(awTick::IN); + $this->xAxis->label->hideValue(0); + $this->initAxis($this->xAxis); + + $this->yAxis = new awAxis; + $this->yAxis->setTickStyle(awTick::IN); + $this->yAxis->label->hideValue(0); + $this->initAxis($this->yAxis); + + } + + protected function initAxis(awAxis $axis) { + + $axis->setLabelPrecision(1); + $axis->addTick('major', new awTick(0, 5)); + $axis->addTick('minor', new awTick(0, 3)); + $axis->addTick('micro', new awTick(0, 1)); + $axis->setNumberByTick('minor', 'major', 1); + $axis->setNumberByTick('micro', 'minor', 4); + $axis->label->setFont(new awTuffy(7)); + + } + + /** + * Interval to calculate values + * + * @param float $interval + */ + public function setInterval($interval) { + $this->interval = (float)$interval; + } + + /** + * Add a formula f(x) + * + * @param awMathFunction $function + * @param string $name Name for the legend (can be NULL if you don't want to set a legend) + * @param int $type Type for the legend + */ + public function add(awMathFunction $function, $name = NULL, $type = awLegend::LINE) { + + $this->functions[] = $function; + + if($name !== NULL) { + $this->legend->add($function, $name, $type); + } + + } + + public function init(awDriver $driver) { + + list($x1, $y1, $x2, $y2) = $this->getPosition(); + + $this->xAxis->line->setX($x1, $x2); + $this->xAxis->label->setAlign(NULL, awLabel::BOTTOM); + $this->xAxis->label->move(0, 3); + $this->xAxis->setRange($this->extremum->left, $this->extremum->right); + + $this->yAxis->line->setY($y2, $y1); + $this->yAxis->label->setAlign(awLabel::RIGHT); + $this->yAxis->label->move(-6, 0); + $this->yAxis->reverseTickStyle(); + $this->yAxis->setRange($this->extremum->bottom, $this->extremum->top); + + + $this->xAxis->setYCenter($this->yAxis, 0); + $this->yAxis->setXCenter($this->xAxis, 0); + + if($this->yAxis->getLabelNumber() === NULL) { + $number = $this->extremum->top - $this->extremum->bottom + 1; + $this->yAxis->setLabelNumber($number); + } + + if($this->xAxis->getLabelNumber() === NULL) { + $number = $this->extremum->right - $this->extremum->left + 1; + $this->xAxis->setLabelNumber($number); + } + + // Set ticks + + $this->xAxis->tick('major')->setNumber($this->xAxis->getLabelNumber()); + $this->yAxis->tick('major')->setNumber($this->yAxis->getLabelNumber()); + + + // Set axis labels + $labels = array(); + for($i = 0, $count = $this->xAxis->getLabelNumber(); $i < $count; $i++) { + $labels[] = $i; + } + $this->xAxis->label->set($labels); + + $labels = array(); + for($i = 0, $count = $this->yAxis->getLabelNumber(); $i < $count; $i++) { + $labels[] = $i; + } + $this->yAxis->label->set($labels); + + parent::init($driver); + + // Create the grid + $this->createGrid(); + + // Draw the grid + $this->grid->draw($driver, $x1, $y1, $x2, $y2); + + } + + public function drawEnvelope(awDriver $driver) { + + // Draw axis + $this->xAxis->draw($driver); + $this->yAxis->draw($driver); + + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + foreach($this->functions as $function) { + + $f = $function->f; + $fromX = is_null($function->fromX) ? $this->extremum->left : $function->fromX; + $toX = is_null($function->toX) ? $this->extremum->right : $function->toX; + + $old = NULL; + + for($i = $fromX; $i <= $toX; $i += $this->interval) { + + $p = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($i, $f($i))); + + if($p->y >= $y1 and $p->y <= $y2) { + $function->mark->draw($driver, $p); + } + + if($old !== NULL) { + + $line = $function->line; + $line->setLocation($old, $p); + + if( + ($line->p1->y >= $y1 and $line->p1->y <= $y2) or + ($line->p2->y >= $y1 and $line->p2->y <= $y2) + ) { + $driver->line( + $function->getColor(), + $line + ); + } + + } + + $old = $p; + + } + + // Draw last point if needed + if($old !== NULL and $i - $this->interval != $toX) { + + $p = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($toX, $f($toX))); + + if($p->y >= $y1 and $p->y <= $y2) { + $function->mark->draw($driver, $p); + } + + + $line = $function->line; + $line->setLocation($old, $p); + + if( + ($line->p1->y >= $y1 and $line->p1->y <= $y2) or + ($line->p2->y >= $y1 and $line->p2->y <= $y2) + ) { + $driver->line( + $function->getColor(), + $line + ); + } + + } + + } + + } + + protected function createGrid() { + + // Horizontal lines of the grid + + $major = $this->yAxis->tick('major'); + $interval = $major->getInterval(); + $number = $this->yAxis->getLabelNumber() - 1; + + $h = array(); + if($number > 0) { + for($i = 0; $i <= $number; $i++) { + $h[] = $i / $number; + } + } + + // Vertical lines + + $major = $this->xAxis->tick('major'); + $interval = $major->getInterval(); + $number = $this->xAxis->getLabelNumber() - 1; + + $w = array(); + if($number > 0) { + for($i = 0; $i <= $number; $i++) { + if($i%$interval === 0) { + $w[] = $i / $number; + } + } + } + + $this->grid->setGrid($w, $h); + + } + +} + +registerClass('MathPlot'); diff --git a/modules/graphartichow/artichow/Pattern.class.php b/modules/graphartichow/artichow/Pattern.class.php new file mode 100644 index 000000000..0eee7e1ee --- /dev/null +++ b/modules/graphartichow/artichow/Pattern.class.php @@ -0,0 +1,96 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Graph.class.php"; + +/** + * All patterns must derivate from this class + * + * @package Artichow + */ +abstract class awPattern { + + /** + * Pattern arguments + * + * @var array + */ + protected $args = array(); + + /** + * Load a pattern + * + * @param string $pattern Pattern name + * @return Component + */ + public static function get($pattern) { + + $file = ARTICHOW_PATTERN.DIRECTORY_SEPARATOR.$pattern.'.php'; + + if(is_file($file)) { + + require_once $file; + + $class = $pattern.'Pattern'; + + if(class_exists($class)) { + return new $class; + } else { + awImage::drawError("Class Pattern: Class '".$class."' does not exist."); + } + + } else { + awImage::drawError("Class Pattern: Pattern '".$pattern."' does not exist."); + } + + } + + /** + * Change pattern argument + * + * @param string $name Argument name + * @param mixed $value Argument value + */ + public function setArg($name, $value) { + if(is_string($name)) { + $this->args[$name] = $value; + } + } + + /** + * Get an argument + * + * @param string $name + * @param mixed $default Default value if the argument does not exist (default to NULL) + * @return mixed Argument value + */ + protected function getArg($name, $default = NULL) { + if(array_key_exists($name, $this->args)) { + return $this->args[$name]; + } else { + return $default; + } + } + + /** + * Change several arguments + * + * @param array $args New arguments + */ + public function setArgs($args) { + if(is_array($args)) { + foreach($args as $name => $value) { + $this->setArg($name, $value); + } + } + } + +} + +registerClass('Pattern', TRUE); diff --git a/modules/graphartichow/artichow/Pie.class.php b/modules/graphartichow/artichow/Pie.class.php new file mode 100644 index 000000000..8dec47825 --- /dev/null +++ b/modules/graphartichow/artichow/Pie.class.php @@ -0,0 +1,694 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Component.class.php"; + + +/** + * Pie + * + * @package Artichow + */ +class awPie extends awComponent { + + /** + * A dark theme for pies + * + * + * @var int + */ + const DARK = 1; + + /** + * A colored theme for pies + * + * @var int + */ + const COLORED = 2; + + /** + * A water theme for pies + * + * @var int + */ + const AQUA = 3; + + /** + * A earth theme for pies + * + * @var int + */ + const EARTH = 4; + + /** + * Pie values + * + * @var array + */ + protected $values; + + /** + * Pie colors + * + * @var array + */ + protected $colors; + + /** + * Pie legend + * + * @var array + */ + protected $legendValues = array(); + + /** + * Intensity of the 3D effect + * + * @var int + */ + protected $size; + + /** + * Border color + * + * @var Color + */ + protected $border; + + /** + * Pie explode + * + * @var array + */ + protected $explode = array(); + + /** + * Initial angle + * + * @var int + */ + protected $angle = 0; + + /** + * Labels precision + * + * @var int + */ + protected $precision; + + /** + * Labels number + * + * @var int + */ + protected $number; + + /** + * Labels minimum + * + * @var int + */ + protected $minimum; + + /** + * Labels position + * + * @var int + */ + protected $position = 15; + + /** + * Labels of your pie + * + * @var Label + */ + public $label; + + /** + * Build the plot + * + * @param array $values Pie values + */ + public function __construct($values, $colors = awPie::COLORED) { + + $this->setValues($values); + + if(is_array($colors)) { + $this->colors = $colors; + } else { + + switch($colors) { + + case awPie::AQUA : + $this->colors = array( + new awColor(131, 220, 215), + new awColor(131, 190, 215), + new awColor(131, 160, 215), + new awColor(160, 140, 215), + new awColor(190, 131, 215), + new awColor(220, 131, 215) + ); + break; + + case awPie::EARTH : + $this->colors = array( + new awColor(97, 179, 110), + new awColor(130, 179, 97), + new awColor(168, 179, 97), + new awColor(179, 147, 97), + new awColor(179, 108, 97), + new awColor(99, 107, 189), + new awColor(99, 165, 189) + ); + break; + + case awPie::DARK : + $this->colors = array( + new awColor(140, 100, 170), + new awColor(130, 170, 100), + new awColor(160, 160, 120), + new awColor(150, 110, 140), + new awColor(130, 150, 160), + new awColor(90, 170, 140) + ); + break; + + default : + $this->colors = array( + new awColor(187, 213, 151), + new awColor(223, 177, 151), + new awColor(111, 186, 132), + new awColor(197, 160, 230), + new awColor(165, 169, 63), + new awColor(218, 177, 89), + new awColor(116, 205, 121), + new awColor(200, 201, 78), + new awColor(127, 205, 177), + new awColor(205, 160, 160), + new awColor(190, 190, 190) + ); + break; + + } + + } + + parent::__construct(); + + $this->label = new awLabel; + $this->label->setCallbackFunction('callbackPerCent'); + + } + + /** + * Change legend values + * + * @param array $legend An array of values for each part of the pie + */ + public function setLegend($legend) { + + $this->legendValues = (array)$legend; + + } + + /** + * Set a border all around the pie + * + * @param awColor $color A color for the border + */ + public function setBorderColor(awColor $color) { + $this->border = $color; + } + + /** + * Set a border all around the pie + * + * @param awColor $color A color for the border + */ + public function setBorder(awColor $color) { + if(ARTICHOW_DEPRECATED === TRUE) { + awImage::drawError('Class Pie: Method setBorder() has been deprecated since Artichow 1.0.9. Please use setBorderColor() instead.'); + } else { + $this->setBorderColor($color); + } + } + + /** + * Change 3D effect intensity + * + * @param int $size Effect size + */ + public function set3D($size) { + $this->size = (int)$size; + } + + /** + * Change initial angle + * + * @param int $angle New angle in degrees + */ + public function setStartAngle($angle) { + $this->angle = (int)$angle; + } + + /** + * Change label precision + * + * @param int $precision New precision + */ + public function setLabelPrecision($precision) { + $this->precision = (int)$precision; + } + + /** + * Change label position + * + * @param int $position New position in pixels + */ + public function setLabelPosition($position) { + $this->position = (int)$position; + } + + /** + * Change label number + * + * @param int $number New number + */ + public function setLabelNumber($number) { + $this->number = is_null($number) ? $number : (int)$number; + } + + /** + * Change label minimum + * + * @param int $minimum New minimum + */ + public function setLabelMinimum($minimum) { + $this->minimum = is_null($minimum) ? $minimum : (int)$minimum; + } + + /** + * Change Pie explode + * + * @param array $explode + */ + public function explode($explode) { + $this->explode = (array)$explode; + } + + public function drawEnvelope(awDriver $driver) { + + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + $count = count($this->values); + $sum = array_sum($this->values); + + $width = $x2 - $x1; + $height = $y2 - $y1; + + if($aliasing) { + $x = $width / 2; + $y = $height / 2; + } else { + $x = $width / 2 + $x1; + $y = $height / 2 + $y1; + } + + $position = $this->angle; + $values = array(); + $parts = array(); + $angles = 0; + + if($aliasing) { + $side = new awSide(0, 0, 0, 0); + } + + foreach($this->values as $key => $value) { + + $angle = ($value / $sum * 360); + + if($key === $count - 1) { + $angle = 360 - $angles; + } + + $angles += $angle; + + if(array_key_exists($key, $this->explode)) { + $middle = 360 - ($position + $angle / 2); + $posX = $this->explode[$key] * cos($middle * M_PI / 180); + $posY = $this->explode[$key] * sin($middle * M_PI / 180) * -1; + + if($aliasing) { + $explode = new awPoint( + $posX * 2, + $posY * 2 + ); + $side->set( + max($side->left, $posX * -2), + max($side->right, $posX * 2), + max($side->top, $posY * -2), + max($side->bottom, $posY * 2) + ); + } else { + $explode = new awPoint( + $posX, + $posY + ); + } + + } else { + $explode = new awPoint(0, 0); + } + + $values[$key] = array( + $position, ($position + $angle), $explode + ); + + $color = $this->colors[$key % count($this->colors)]; + $parts[$key] = new awPiePart($color); + + // Add part to the legend + $legend = array_key_exists($key, $this->legendValues) ? $this->legendValues[$key] : $key; + $this->legend->add($parts[$key], $legend, awLegend::BACKGROUND); + + $position += $angle; + + } + + if($aliasing) { + + $mainDriver = $driver; + + $x *= 2; + $y *= 2; + $width *= 2; + $height *= 2; + $this->size *= 2; + + $image = new awImage; + $image->border->hide(); + + // Adds support for antialiased pies on non-white background + $background = $this->getBackground(); + + if($background instanceof awColor) { + $image->setBackgroundColor($background); + } +// elseif($background instanceof awGradient) { +// $image->setBackgroundColor(new White(100)); +// } + + $image->setSize( + $width + $side->left + $side->right, + $height + $side->top + $side->bottom + $this->size + 1 /* bugs.php.net ! */ + ); + + $driver = $image->getDriver( + $width / $image->width, + $height / $image->height, + ($width / 2 + $side->left) / $image->width, + ($height / 2 + $side->top) / $image->height + ); + + } + + // Draw 3D effect + for($i = $this->size; $i > 0; $i--) { + + foreach($values as $key => $value) { + + $color = clone $this->colors[$key % count($this->colors)]; + $color->brightness(-50); + + list($from, $to, $explode) = $value; + + $driver->filledArc($color, $explode->move($x, $y + $i), $width, $height, $from, $to); + + unset($color); + + if($this->border instanceof awColor) { + + $point = $explode->move($x, $y); + + if($i === $this->size) { + + $driver->arc($this->border, $point->move(0, $this->size), $width, $height, $from, $to); + + } + + } + + } + + } + + foreach($values as $key => $value) { + + $color = $this->colors[$key % count($this->colors)]; + + list($from, $to, $explode) = $value; + + $driver->filledArc($color, $explode->move($x, $y), $width, $height, $from, $to); + + if($this->border instanceof awColor) { + + $point = $explode->move($x, $y); + $driver->arc($this->border, $point, $width, $height, $from, $to); + } + + } + + if($aliasing) { + + $x = $x / 2 + $x1; + $y = $y / 2 + $y1; + $width /= 2; + $height /= 2; + $this->size /= 2; + + foreach($values as $key => $value) { + $old = $values[$key][2]; + $values[$key][2] = new awPoint( + $old->x / 2, $old->y / 2 + ); + } + + $mainDriver->copyResizeImage( + $image, + new awPoint($x1 - $side->left / 2, $y1 - $side->top / 2), + new awPoint($x1 - $side->left / 2 + $image->width / 2, $y1 - $side->top / 2 + $image->height/ 2), + new awPoint(0, 0), + new awPoint($image->width, $image->height), + TRUE + ); + + $driver = $mainDriver; + + } + + // Get labels values + $pc = array(); + foreach($this->values as $key => $value) { + $pc[$key] = round($value / $sum * 100, $this->precision); + } + if($this->label->count() === 0) { // Check that there is no user defined values + $this->label->set($pc); + } + + $position = 0; + + foreach($pc as $key => $value) { + + // Limit number of labels to display + if($position === $this->number) { + break; + } + + if(is_null($this->minimum) === FALSE and $value < $this->minimum) { + continue; + } + + $position++; + + list($from, $to, $explode) = $values[$key]; + + $angle = $from + ($to - $from) / 2; + $angleRad = (360 - $angle) * M_PI / 180; + + $point = new awPoint( + $x + $explode->x + cos($angleRad) * ($width / 2 + $this->position), + $y + $explode->y - sin($angleRad) * ($height / 2 + $this->position) + ); + + $angle %= 360; + + // We don't display labels on the 3D effect + if($angle > 0 and $angle < 180) { + $point = $point->move(0, -1 * sin($angleRad) * $this->size); + } + + if($angle >= 45 and $angle < 135) { + $this->label->setAlign(awLabel::CENTER, awLabel::BOTTOM); + } else if($angle >= 135 and $angle < 225) { + $this->label->setAlign(awLabel::RIGHT, awLabel::MIDDLE); + } else if($angle >= 225 and $angle < 315) { + $this->label->setAlign(awLabel::CENTER, awLabel::TOP); + } else { + $this->label->setAlign(awLabel::LEFT, awLabel::MIDDLE); + } + + $this->label->draw( + $driver, + $point, + $key + ); + + } + + } + + /** + * Return margins around the component + * + * @return array Left, right, top and bottom margins + */ + public function getMargin() { + + // Get axis informations + + $leftAxis = $this->padding->left; + $rightAxis = $this->padding->right; + $topAxis = $this->padding->top; + $bottomAxis = $this->padding->bottom; + + return array($leftAxis, $rightAxis, $topAxis, $bottomAxis); + + } + + + /** + * Change values of Y axis + * This method ignores not numeric values + * + * @param array $values + */ + public function setValues($values) { + + $this->checkArray($values); + $this->values = $values; + + } + + + /** + * Return values of Y axis + * + * @return array + */ + public function getValues() { + return $this->values; + } + + private function checkArray(&$array) { + + if(is_array($array) === FALSE) { + awImage::drawError("Class Pie: You tried to set values that are not an array."); + } + + foreach($array as $key => $value) { + if(is_numeric($value) === FALSE) { + unset($array[$key]); + } + } + + if(count($array) < 1) { + awImage::drawError("Class Pie: Your graph must have at least 1 value."); + } + + } + +} + +registerClass('Pie'); + +/** + * Pie + * + * @package Artichow + */ +class awPiePart implements awLegendable { + + /** + * Pie part color + * + * @var Color + */ + protected $color; + + /** + * Build a new awPiePart + * + * @param awColor $color Pie part color + */ + public function __construct(awColor $color) { + + $this->color = $color; + + } + + /** + * Get the background color or gradient of an element of the component + * + * @return Color, Gradient + */ + public function getLegendBackground() { + return $this->color; + } + + /** + * Get the line thickness + * + * @return NULL + */ + public function getLegendLineThickness() { + } + + /** + * Get the line type + * + * @return NULL + */ + public function getLegendLineStyle() { + } + + /** + * Get the color of line + * + * @return NULL + */ + public function getLegendLineColor() { + } + + /** + * Get a mark object + * + * @return NULL + */ + public function getLegendMark() { + } + +} + +registerClass('PiePart'); + +function callbackPerCent($value) { + return $value.'%'; +} diff --git a/modules/graphartichow/artichow/Plot.class.php b/modules/graphartichow/artichow/Plot.class.php new file mode 100644 index 000000000..614b68efb --- /dev/null +++ b/modules/graphartichow/artichow/Plot.class.php @@ -0,0 +1,1463 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Component.class.php"; + + +/** + * Graph using X and Y axis + * + * @package Artichow + */ +abstract class awPlot extends awComponent { + + /** + * Values for Y axis + * + * @var array + */ + protected $datay; + + /** + * Values for X axis + * + * @var array + */ + protected $datax; + + /** + * Grid properties + * + * @var Grid + */ + public $grid; + + /** + * X axis + * + * @var Axis + */ + public $xAxis; + + /** + * Y axis + * + * @var Axis + */ + public $yAxis; + + /** + * Position of X axis + * + * @var int + */ + protected $xAxisPosition = awPlot::BOTTOM; + + /** + * Set X axis on zero ? + * + * @var bool + */ + protected $xAxisZero = TRUE; + + /** + * Set Y axis on zero ? + * + * @var bool + */ + protected $yAxisZero = FALSE; + + /** + * Position of Y axis + * + * @var int + */ + protected $yAxisPosition = awPlot::LEFT; + + /** + * Change min value for Y axis + * + * @var mixed + */ + private $yMin = NULL; + + /** + * Change max value for Y axis + * + * @var mixed + */ + private $yMax = NULL; + + /** + * Change min value for X axis + * + * @var mixed + */ + private $xMin = NULL; + + /** + * Change max value for X axis + * + * @var mixed + */ + private $xMax = NULL; + + /** + * Left axis + * + * @var int + */ + const LEFT = 'left'; + + /** + * Right axis + * + * @var int + */ + const RIGHT = 'right'; + + /** + * Top axis + * + * @var int + */ + const TOP = 'top'; + + /** + * Bottom axis + * + * @var int + */ + const BOTTOM = 'bottom'; + + /** + * Both left/right or top/bottom axis + * + * @var int + */ + const BOTH = 'both'; + + /** + * Build the plot + * + */ + public function __construct() { + + parent::__construct(); + + $this->grid = new awGrid; + $this->grid->setBackgroundColor(new awWhite); + + $this->padding->add(20, 0, 0, 20); + + $this->xAxis = new awAxis; + $this->xAxis->addTick('major', new awTick(0, 5)); + $this->xAxis->addTick('minor', new awTick(0, 3)); + $this->xAxis->setTickStyle(awTick::OUT); + $this->xAxis->label->setFont(new awTuffy(7)); + + $this->yAxis = new awAxis; + $this->yAxis->auto(TRUE); + $this->yAxis->addTick('major', new awTick(0, 5)); + $this->yAxis->addTick('minor', new awTick(0, 3)); + $this->yAxis->setTickStyle(awTick::OUT); + $this->yAxis->setNumberByTick('minor', 'major', 3); + $this->yAxis->label->setFont(new awTuffy(7)); + $this->yAxis->title->setAngle(90); + + } + + /** + * Get plot values + * + * @return array + */ + public function getValues() { + return $this->datay; + } + + /** + * Reduce number of values in the plot + * + * @param int $number Reduce number of values to $number + */ + public function reduce($number) { + + $count = count($this->datay); + $ratio = ceil($count / $number); + + if($ratio > 1) { + + $tmpy = $this->datay; + $datay = array(); + + $datax = array(); + $cbLabel = $this->xAxis->label->getCallbackFunction(); + + for($i = 0; $i < $count; $i += $ratio) { + + $slice = array_slice($tmpy, $i, $ratio); + $datay[] = array_sum($slice) / count($slice); + + // Reduce data on X axis if needed + if($cbLabel !== NULL) { + $datax[] = $cbLabel($i + round($ratio / 2)); + } + + } + + $this->setValues($datay); + + if($cbLabel !== NULL) { + $this->xAxis->setLabelText($datax); + } + + + } + + } + + /** + * Count values in the plot + * + * @return int + */ + public function getXAxisNumber() { + list($min, $max) = $this->xAxis->getRange(); + return ($max - $min + 1); + } + + /** + * Change X axis + * + * @param int $axis + */ + public function setXAxis($axis) { + $this->xAxisPosition = $axis; + } + + /** + * Get X axis + * + * @return int + */ + public function getXAxis() { + return $this->xAxisPosition; + } + + /** + * Set X axis on zero + * + * @param bool $zero + */ + public function setXAxisZero($zero) { + $this->xAxisZero = (bool)$zero; + } + + /** + * Set Y axis on zero + * + * @param bool $zero + */ + public function setYAxisZero($zero) { + $this->yAxisZero = (bool)$zero; + } + + /** + * Change Y axis + * + * @param int $axis + */ + public function setYAxis($axis) { + $this->yAxisPosition = $axis; + } + + /** + * Get Y axis + * + * @return int + */ + public function getYAxis() { + return $this->yAxisPosition; + } + + /** + * Change min value for Y axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setYMin($value) { + $this->yMin = $value; + $this->yAxis->auto(FALSE); + $this->updateAxis(); + } + + /** + * Change max value for Y axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setYMax($value) { + $this->yMax = $value; + $this->yAxis->auto(FALSE); + $this->updateAxis(); + } + + /** + * Change min value for X axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setXMin($value) { + $this->xMin = $value; + $this->updateAxis(); + } + + /** + * Change max value for X axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setXMax($value) { + $this->xMax = $value; + $this->updateAxis(); + } + + /** + * Get min value for Y axis + * + * @return float $value + */ + public function getYMin() { + if($this->auto) { + if(is_null($this->yMin)) { + $min = array_min($this->datay); + if($min > 0) { + return 0; + } + } + } + return is_null($this->yMin) ? array_min($this->datay) : (float)$this->yMin; + } + + /** + * Get max value for Y axis + * + * @return float $value + */ + public function getYMax() { + if($this->auto) { + if(is_null($this->yMax)) { + $max = array_max($this->datay); + if($max < 0) { + return 0; + } + } + } + return is_null($this->yMax) ? array_max($this->datay) : (float)$this->yMax; + } + + /** + * Get min value for X axis + * + * @return float $value + */ + public function getXMin() { + return floor(is_null($this->xMin) ? array_min($this->datax) : $this->xMin); + } + + /** + * Get max value for X axis + * + * @return float $value + */ + public function getXMax() { + return (ceil(is_null($this->xMax) ? array_max($this->datax) : (float)$this->xMax)) + ($this->getXCenter() ? 1 : 0); + } + + /** + * Get min value with spaces for Y axis + * + * @return float $value + */ + public function getRealYMin() { + $min = $this->getYMin(); + if($this->space->bottom !== NULL) { + $interval = ($this->getYMax() - $min) * $this->space->bottom / 100; + return $min - $interval; + } else { + return is_null($this->yMin) ? $min : (float)$this->yMin; + } + } + + /** + * Get max value with spaces for Y axis + * + * @return float $value + */ + public function getRealYMax() { + $max = $this->getYMax(); + if($this->space->top !== NULL) { + $interval = ($max - $this->getYMin()) * $this->space->top / 100; + return $max + $interval; + } else { + return is_null($this->yMax) ? $max : (float)$this->yMax; + } + } + + public function init(awDriver $driver) { + + list($x1, $y1, $x2, $y2) = $this->getPosition(); + + // Get space informations + list($leftSpace, $rightSpace, $topSpace, $bottomSpace) = $this->getSpace($x2 - $x1, $y2 - $y1); + + $this->xAxis->setPadding($leftSpace, $rightSpace); + + if($this->space->bottom > 0 or $this->space->top > 0) { + + list($min, $max) = $this->yAxis->getRange(); + $interval = $max - $min; + + $this->yAxis->setRange( + $min - $interval * $this->space->bottom / 100, + $max + $interval * $this->space->top / 100 + ); + + } + + // Auto-scaling mode + $this->yAxis->autoScale(); + + // Number of labels is not specified + if($this->yAxis->getLabelNumber() === NULL) { + $number = round(($y2 - $y1) / 75) + 2; + $this->yAxis->setLabelNumber($number); + } + + $this->xAxis->line->setX($x1, $x2); + $this->yAxis->line->setY($y2, $y1); + + // Set ticks + + $this->xAxis->tick('major')->setNumber($this->getXAxisNumber()); + $this->yAxis->tick('major')->setNumber($this->yAxis->getLabelNumber()); + + + // Center X axis on zero + if($this->xAxisZero) { + $this->xAxis->setYCenter($this->yAxis, 0); + } + + // Center Y axis on zero + if($this->yAxisZero) { + $this->yAxis->setXCenter($this->xAxis, 0); + } + + // Set axis labels + $labels = array(); + + list($xMin, $xMax) = $this->xAxis->getRange(); + for($i = $xMin; $i <= $xMax; $i++) { + $labels[] = $i; + } + $this->xAxis->label->set($labels); + + parent::init($driver); + + list($x1, $y1, $x2, $y2) = $this->getPosition(); + + list($leftSpace, $rightSpace) = $this->getSpace($x2 - $x1, $y2 - $y1); + + // Create the grid + $this->createGrid(); + + // Draw the grid + $this->grid->setSpace($leftSpace, $rightSpace, 0, 0); + $this->grid->draw($driver, $x1, $y1, $x2, $y2); + + } + + public function drawEnvelope(awDriver $driver) { + + list($x1, $y1, $x2, $y2) = $this->getPosition(); + + if($this->getXCenter()) { + $size = $this->xAxis->getDistance(0, 1); + $this->xAxis->label->move($size / 2, 0); + $this->xAxis->label->hideLast(TRUE); + } + + // Draw top axis + if($this->xAxisPosition === awPlot::TOP or $this->xAxisPosition === awPlot::BOTH) { + $top = clone $this->xAxis; + if($this->xAxisZero === FALSE) { + $top->line->setY($y1, $y1); + } + $top->label->setAlign(NULL, awLabel::TOP); + $top->label->move(0, -3); + $top->title->move(0, -25); + $top->draw($driver); + } + + // Draw bottom axis + if($this->xAxisPosition === awPlot::BOTTOM or $this->xAxisPosition === awPlot::BOTH) { + $bottom = clone $this->xAxis; + if($this->xAxisZero === FALSE) { + $bottom->line->setY($y2, $y2); + } + $bottom->label->setAlign(NULL, awLabel::BOTTOM); + $bottom->label->move(0, 3); + $bottom->reverseTickStyle(); + $bottom->title->move(0, 25); + $bottom->draw($driver); + } + + // Draw left axis + if($this->yAxisPosition === awPlot::LEFT or $this->yAxisPosition === awPlot::BOTH) { + $left = clone $this->yAxis; + if($this->yAxisZero === FALSE) { + $left->line->setX($x1, $x1); + } + $left->label->setAlign(awLabel::RIGHT); + $left->label->move(-6, 0); + $left->title->move(-25, 0); + $left->draw($driver); + } + + // Draw right axis + if($this->yAxisPosition === awPlot::RIGHT or $this->yAxisPosition === awPlot::BOTH) { + $right = clone $this->yAxis; + if($this->yAxisZero === FALSE) { + $right->line->setX($x2, $x2); + } + $right->label->setAlign(awLabel::LEFT); + $right->label->move(6, 0); + $right->reverseTickStyle(); + $right->title->move(25, 0); + $right->draw($driver); + } + + } + + protected function createGrid() { + + $max = $this->getRealYMax(); + $min = $this->getRealYMin(); + + $number = $this->yAxis->getLabelNumber() - 1; + + if($number < 1) { + return; + } + + // Horizontal lines of the grid + + $h = array(); + for($i = 0; $i <= $number; $i++) { + $h[] = $i / $number; + } + + // Vertical lines + + $major = $this->yAxis->tick('major'); + $interval = $major->getInterval(); + $number = $this->getXAxisNumber() - 1; + + $w = array(); + + if($number > 0) { + + for($i = 0; $i <= $number; $i++) { + if($i%$interval === 0) { + $w[] = $i / $number; + } + } + + } + + $this->grid->setGrid($w, $h); + + } + + /** + * Change values of Y axis + * This method ignores not numeric values + * + * @param array $datay + * @param array $datax + */ + public function setValues($datay, $datax = NULL) { + + $this->checkArray($datay); + + foreach($datay as $key => $value) { + unset($datay[$key]); + $datay[(int)$key] = $value; + } + + if($datax === NULL) { + $datax = array(); + for($i = 0; $i < count($datay); $i++) { + $datax[] = $i; + } + } else { + foreach($datax as $key => $value) { + unset($datax[$key]); + $datax[(int)$key] = $value; + } + } + + $this->checkArray($datax); + + if(count($datay) === count($datax)) { + + // Set values + $this->datay = $datay; + $this->datax = $datax; + // Update axis with the new awvalues + $this->updateAxis(); + } else { + awImage::drawError("Class Plot: Plots must have the same number of X and Y points."); + } + + } + + /** + * Return begin and end values + * + * @return array + */ + protected function getLimit() { + + $i = 0; + while(array_key_exists($i, $this->datay) and $this->datay[$i] === NULL) { + $i++; + } + $start = $i; + $i = count($this->datay) - 1; + while(array_key_exists($i, $this->datay) and $this->datay[$i] === NULL) { + $i--; + } + $stop = $i; + + return array($start, $stop); + + } + + /** + * Return TRUE if labels must be centered on X axis, FALSE otherwise + * + * @return bool + */ + abstract public function getXCenter(); + + private function updateAxis() { + + $this->xAxis->setRange( + $this->getXMin(), + $this->getXMax() + ); + $this->yAxis->setRange( + $this->getRealYMin(), + $this->getRealYMax() + ); + + } + + private function checkArray(&$array) { + + if(is_array($array) === FALSE) { + awImage::drawError("Class Plot: You tried to set a value that is not an array."); + } + + foreach($array as $key => $value) { + if(is_numeric($value) === FALSE and is_null($value) === FALSE) { + awImage::drawError("Class Plot: Expected numeric values for the plot."); + } + } + + if(count($array) < 1) { + awImage::drawError("Class Plot: Your plot must have at least 1 value."); + } + + } + +} + +registerClass('Plot', TRUE); + +class awPlotAxis { + + /** + * Left axis + * + * @var Axis + */ + public $left; + + /** + * Right axis + * + * @var Axis + */ + public $right; + + /** + * Top axis + * + * @var Axis + */ + public $top; + + /** + * Bottom axis + * + * @var Axis + */ + public $bottom; + + /** + * Build the group of axis + */ + public function __construct() { + + $this->left = new awAxis; + $this->left->auto(TRUE); + $this->left->label->setAlign(awLabel::RIGHT); + $this->left->label->move(-6, 0); + $this->yAxis($this->left); + $this->left->setTickStyle(awTick::OUT); + $this->left->title->move(-25, 0); + + $this->right = new awAxis; + $this->right->auto(TRUE); + $this->right->label->setAlign(awLabel::LEFT); + $this->right->label->move(6, 0); + $this->yAxis($this->right); + $this->right->setTickStyle(awTick::IN); + $this->right->title->move(25, 0); + + $this->top = new awAxis; + $this->top->label->setAlign(NULL, awLabel::TOP); + $this->top->label->move(0, -3); + $this->xAxis($this->top); + $this->top->setTickStyle(awTick::OUT); + $this->top->title->move(0, -25); + + $this->bottom = new awAxis; + $this->bottom->label->setAlign(NULL, awLabel::BOTTOM); + $this->bottom->label->move(0, 3); + $this->xAxis($this->bottom); + $this->bottom->setTickStyle(awTick::IN); + $this->bottom->title->move(0, 25); + + } + + protected function xAxis(awAxis $axis) { + + $axis->addTick('major', new awTick(0, 5)); + $axis->addTick('minor', new awTick(0, 3)); + $axis->label->setFont(new awTuffy(7)); + + } + + protected function yAxis(awAxis $axis) { + + $axis->addTick('major', new awTick(0, 5)); + $axis->addTick('minor', new awTick(0, 3)); + $axis->setNumberByTick('minor', 'major', 3); + $axis->label->setFont(new awTuffy(7)); + $axis->title->setAngle(90); + + } + +} + +registerClass('PlotAxis'); + +/** + * A graph with axis can contain some groups of components + * + * @package Artichow + */ +class awPlotGroup extends awComponentGroup { + + /** + * Grid properties + * + * @var Grid + */ + public $grid; + + /** + * Left, right, top and bottom axis + * + * @var PlotAxis + */ + public $axis; + + /** + * Set the X axis on zero + * + * @var bool + */ + protected $xAxisZero = TRUE; + + /** + * Set the Y axis on zero + * + * @var bool + */ + protected $yAxisZero = FALSE; + + /** + * Real axis used for Y axis + * + * @var string + */ + private $yRealAxis = awPlot::LEFT; + + /** + * Real axis used for X axis + * + * @var string + */ + private $xRealAxis = awPlot::BOTTOM; + + /** + * Change min value for Y axis + * + * @var mixed + */ + private $yMin = NULL; + + /** + * Change max value for Y axis + * + * @var mixed + */ + private $yMax = NULL; + + /** + * Change min value for X axis + * + * @var mixed + */ + private $xMin = NULL; + + /** + * Change max value for X axis + * + * @var mixed + */ + private $xMax = NULL; + + /** + * Build the PlotGroup + * + */ + public function __construct() { + + parent::__construct(); + + $this->grid = new awGrid; + $this->grid->setBackgroundColor(new awWhite); + + $this->axis = new awPlotAxis; + + } + + /** + * Set the X axis on zero or not + * + * @param bool $zero + */ + public function setXAxisZero($zero) { + $this->xAxisZero = (bool)$zero; + } + + /** + * Set the Y axis on zero or not + * + * @param bool $zero + */ + public function setYAxisZero($zero) { + $this->yAxisZero = (bool)$zero; + } + + /** + * Change min value for Y axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setYMin($value) { + $this->axis->left->auto(FALSE); + $this->axis->right->auto(FALSE); + $this->yMin = $value; + } + + /** + * Change max value for Y axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setYMax($value) { + $this->axis->left->auto(FALSE); + $this->axis->right->auto(FALSE); + $this->yMax = $value; + } + + /** + * Change min value for X axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setXMin($value) { + $this->xMin = $value; + } + + /** + * Change max value for X axis + * Set NULL for auto selection. + * + * @param float $value + */ + public function setXMax($value) { + $this->xMax = $value; + } + + /** + * Get min value for X axis + * + * @return float $value + */ + public function getXMin() { + + return $this->getX('min'); + + } + + /** + * Get max value for X axis + * + * @return float $value + */ + public function getXMax() { + + return $this->getX('max'); + + } + + private function getX($type) { + + switch($type) { + case 'max' : + if($this->xMax !== NULL) { + return $this->xMax; + } + break; + case 'min' : + if($this->xMin !== NULL) { + return $this->xMin; + } + break; + } + + $value = NULL; + $get = 'getX'.ucfirst($type); + + for($i = 0; $i < count($this->components); $i++) { + + $component = $this->components[$i]; + + if($value === NULL) { + $value = $component->$get(); + } else { + $value = $type($value, $component->$get()); + } + + } + + return $value; + + } + + /** + * Get min value with spaces for Y axis + * + * @param string $axis Axis name + * @return float $value + */ + public function getRealYMin($axis = NULL) { + + if($axis === NULL) { + return NULL; + } + + $min = $this->getRealY('min', $axis); + $max = $this->getRealY('max', $axis); + + if($this->space->bottom !== NULL) { + $interval = ($min - $max) * $this->space->bottom / 100; + return $min + $interval; + } else { + return $min; + } + + } + + /** + * Get max value with spaces for Y axis + * + * @param string $axis Axis name + * @return float $value + */ + public function getRealYMax($axis = NULL) { + + if($axis === NULL) { + return NULL; + } + + $min = $this->getRealY('min', $axis); + $max = $this->getRealY('max', $axis); + + if($this->space->top !== NULL) { + $interval = ($max - $min) * $this->space->top / 100; + return $max + $interval; + } else { + return $max; + } + + } + + private function getRealY($type, $axis) { + + switch($type) { + case 'max' : + if($this->yMax !== NULL) { + return $this->yMax; + } + break; + case 'min' : + if($this->yMin !== NULL) { + return $this->yMin; + } + break; + } + + $value = NULL; + $get = 'getY'.ucfirst($type); + + for($i = 0; $i < count($this->components); $i++) { + + $component = $this->components[$i]; + + switch($axis) { + + case awPlot::LEFT : + case awPlot::RIGHT : + $test = ($component->getYAxis() === $axis); + break; + default : + $test = FALSE; + + } + + if($test) { + + $auto = $component->yAxis->isAuto(); + $this->axis->{$axis}->auto($auto); + + if($value === NULL) { + $value = $component->$get(); + } else { + $value = $type($value, $component->$get()); + } + + } + + } + + return $value; + + } + + public function init(awDriver $driver) { + + list($x1, $y1, $x2, $y2) = $this->getPosition(); + + // Get PlotGroup space + list($leftSpace, $rightSpace, $topSpace, $bottomSpace) = $this->getSpace($x2 - $x1, $y2 - $y1); + + // Count values in the group + $values = $this->getXAxisNumber(); + + // Init the PlotGroup + $this->axis->top->line->setX($x1, $x2); + $this->axis->bottom->line->setX($x1, $x2); + $this->axis->left->line->setY($y2, $y1); + $this->axis->right->line->setY($y2, $y1); + + $this->axis->top->setPadding($leftSpace, $rightSpace); + $this->axis->bottom->setPadding($leftSpace, $rightSpace); + + $xMin = $this->getXMin(); + $xMax = $this->getXMax(); + + $this->axis->top->setRange($xMin, $xMax); + $this->axis->bottom->setRange($xMin, $xMax); + + for($i = 0; $i < count($this->components); $i++) { + + + $component = $this->components[$i]; + + $component->auto($this->auto); + + // Copy space to the component + + $component->setSpace($this->space->left, $this->space->right, $this->space->top, $this->space->bottom); + + $component->xAxis->setPadding($leftSpace, $rightSpace); + $component->xAxis->line->setX($x1, $x2); + + $component->yAxis->line->setY($y2, $y1); + + } + + // Set Y axis range + foreach(array('left', 'right') as $axis) { + + if($this->isAxisUsed($axis)) { + + $min = $this->getRealYMin($axis); + $max = $this->getRealYMax($axis); + + $interval = $max - $min; + + $this->axis->{$axis}->setRange( + $min - $interval * $this->space->bottom / 100, + $max + $interval * $this->space->top / 100 + ); + + // Auto-scaling mode + if($this->axis->{$axis}->isAuto()) { + $this->axis->{$axis}->autoScale(); + } + + } + + } + + if($this->axis->left->getLabelNumber() === NULL) { + $number = round(($y2 - $y1) / 75) + 2; + $this->axis->left->setLabelNumber($number); + } + + if($this->axis->right->getLabelNumber() === NULL) { + $number = round(($y2 - $y1) / 75) + 2; + $this->axis->right->setLabelNumber($number); + } + + // Center labels on X axis if needed + $test = array(awPlot::TOP => FALSE, awPlot::BOTTOM => FALSE); + + for($i = 0; $i < count($this->components); $i++) { + + + $component = $this->components[$i]; + + + if($component->getValues() !== NULL) { + + $axis = $component->getXAxis(); + + if($test[$axis] === FALSE) { + + // Center labels for bar plots + if($component->getXCenter()) { + $size = $this->axis->{$axis}->getDistance(0, 1); + $this->axis->{$axis}->label->move($size / 2, 0); + $this->axis->{$axis}->label->hideLast(TRUE); + $test[$axis] = TRUE; + } + + } + + } + + + } + + // Set axis labels + $labels = array(); + for($i = $xMin; $i <= $xMax; $i++) { + $labels[] = $i; + } + if($this->axis->top->label->count() === 0) { + $this->axis->top->label->set($labels); + } + if($this->axis->bottom->label->count() === 0) { + $this->axis->bottom->label->set($labels); + } + + // Set ticks + + $this->axis->top->tick('major')->setNumber($values); + $this->axis->bottom->tick('major')->setNumber($values); + $this->axis->left->tick('major')->setNumber($this->axis->left->getLabelNumber()); + $this->axis->right->tick('major')->setNumber($this->axis->right->getLabelNumber()); + + + // Set X axis on zero + if($this->xAxisZero) { + $axis = $this->selectYAxis(); + $this->axis->bottom->setYCenter($axis, 0); + $this->axis->top->setYCenter($axis, 0); + } + + // Set Y axis on zero + if($this->yAxisZero) { + $axis = $this->selectXAxis(); + $this->axis->left->setXCenter($axis, 1); + $this->axis->right->setXCenter($axis, 1); + } + + parent::init($driver); + + list($leftSpace, $rightSpace, $topSpace, $bottomSpace) = $this->getSpace($x2 - $x1, $y2 - $y1); + + // Create the grid + $this->createGrid(); + + // Draw the grid + $this->grid->setSpace($leftSpace, $rightSpace, 0, 0); + $this->grid->draw($driver, $x1, $y1, $x2, $y2); + + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + $xMin = $this->getXMin(); + $xMax = $this->getXMax(); + + $maxLeft = $this->getRealYMax(awPlot::LEFT); + $maxRight = $this->getRealYMax(awPlot::RIGHT); + + $minLeft = $this->getRealYMin(awPlot::LEFT); + $minRight = $this->getRealYMin(awPlot::RIGHT); + + foreach($this->components as $component) { + + $min = $component->getYMin(); + $max = $component->getYMax(); + + // Set component minimum and maximum + if($component->getYAxis() === awPlot::LEFT) { + + list($min, $max) = $this->axis->left->getRange(); + + $component->setYMin($min); + $component->setYMax($max); + + } else { + + list($min, $max) = $this->axis->right->getRange(); + + $component->setYMin($min); + $component->setYMax($max); + + } + + $component->setXAxisZero($this->xAxisZero); + $component->setYAxisZero($this->yAxisZero); + + $component->xAxis->setRange($xMin, $xMax); + + $component->drawComponent( + $driver, + $x1, $y1, + $x2, $y2, + $aliasing + ); + + $component->setYMin($min); + $component->setYMax($max); + + } + + } + + public function drawEnvelope(awDriver $driver) { + + list($x1, $y1, $x2, $y2) = $this->getPosition(); + + // Hide unused axis + foreach(array(awPlot::LEFT, awPlot::RIGHT, awPlot::TOP, awPlot::BOTTOM) as $axis) { + if($this->isAxisUsed($axis) === FALSE) { + $this->axis->{$axis}->hide(TRUE); + } + } + + // Draw top axis + $top = $this->axis->top; + if($this->xAxisZero === FALSE) { + $top->line->setY($y1, $y1); + } + $top->draw($driver); + + // Draw bottom axis + $bottom = $this->axis->bottom; + if($this->xAxisZero === FALSE) { + $bottom->line->setY($y2, $y2); + } + $bottom->draw($driver); + + // Draw left axis + $left = $this->axis->left; + if($this->yAxisZero === FALSE) { + $left->line->setX($x1, $x1); + } + $left->draw($driver); + + // Draw right axis + $right = $this->axis->right; + if($this->yAxisZero === FALSE) { + $right->line->setX($x2, $x2); + } + $right->draw($driver); + + } + + /** + * Is the specified axis used ? + * + * @param string $axis Axis name + * @return bool + */ + protected function isAxisUsed($axis) { + + for($i = 0; $i < count($this->components); $i++) { + + $component = $this->components[$i]; + + switch($axis) { + + case awPlot::LEFT : + case awPlot::RIGHT : + if($component->getYAxis() === $axis) { + return TRUE; + } + break; + + case awPlot::TOP : + case awPlot::BOTTOM : + if($component->getXAxis() === $axis) { + return TRUE; + } + break; + + } + + } + + return FALSE; + + } + + protected function createGrid() { + + $max = $this->getRealYMax(awPlot::LEFT); + $min = $this->getRealYMin(awPlot::RIGHT); + + // Select axis (left if possible, right otherwise) + $axis = $this->selectYAxis(); + + $number = $axis->getLabelNumber() - 1; + + if($number < 1) { + return; + } + + // Horizontal lines of grid + + $h = array(); + for($i = 0; $i <= $number; $i++) { + $h[] = $i / $number; + } + + // Vertical lines + + $major = $axis->tick('major'); + $interval = $major->getInterval(); + $number = $this->getXAxisNumber() - 1; + + $w = array(); + + if($number > 0) { + + for($i = 0; $i <= $number; $i++) { + if($i%$interval === 0) { + $w[] = $i / $number; + } + } + + } + + $this->grid->setGrid($w, $h); + + } + + protected function selectYAxis(){ + + // Select axis (left if possible, right otherwise) + if($this->isAxisUsed(awPlot::LEFT)) { + $axis = $this->axis->left; + } else { + $axis = $this->axis->right; + } + + return $axis; + + } + + protected function selectXAxis(){ + + // Select axis (bottom if possible, top otherwise) + if($this->isAxisUsed(awPlot::BOTTOM)) { + $axis = $this->axis->bottom; + } else { + $axis = $this->axis->top; + } + + return $axis; + + } + + protected function getXAxisNumber() { + $offset = $this->components[0]; + $max = $offset->getXAxisNumber(); + for($i = 1; $i < count($this->components); $i++) { + $offset = $this->components[$i]; + $max = max($max, $offset->getXAxisNumber()); + } + return $max; + } + +} + +registerClass('PlotGroup'); diff --git a/modules/graphartichow/artichow/ScatterPlot.class.php b/modules/graphartichow/artichow/ScatterPlot.class.php new file mode 100644 index 000000000..7e01c1425 --- /dev/null +++ b/modules/graphartichow/artichow/ScatterPlot.class.php @@ -0,0 +1,300 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/Plot.class.php"; + +/** + * ScatterPlot + * + * @package Artichow + */ +class awScatterPlot extends awPlot implements awLegendable { + + /** + * Add marks to the scatter plot + * + * @var Mark + */ + public $mark; + + /** + * Labels on the plot + * + * @var Label + */ + public $label; + + /** + * Link points ? + * + * @var bool + */ + protected $link = FALSE; + + /** + * Display impulses + * + * @var bool + */ + protected $impulse = NULL; + + /** + * Link NULL points ? + * + * @var bool + */ + protected $linkNull = FALSE; + + /** + * Line color + * + * @var Color + */ + protected $lineColor; + + /** + * Line type + * + * @var int + */ + protected $lineStyle = awLine::SOLID; + + /** + * Line thickness + * + * @var int + */ + protected $lineThickness = 1; + + /** + * Construct a new awScatterPlot + * + * @param array $datay Numeric values for Y axis + * @param array $datax Numeric values for X axis + * @param int $mode + */ + public function __construct($datay, $datax = NULL) { + + parent::__construct(); + + // Defaults marks + $this->mark = new awMark; + $this->mark->setType(awMark::CIRCLE); + $this->mark->setSize(7); + $this->mark->border->show(); + + $this->label = new awLabel; + + $this->setValues($datay, $datax); + $this->setColor(new awBlack); + + } + + /** + * Display plot as impulses + * + * @param awColor $impulse Impulses color (or NULL to disable impulses) + */ + public function setImpulse($color) { + $this->impulse = $color; + } + + /** + * Link scatter plot points + * + * @param bool $link + * @param awColor $color Line color (default to black) + */ + public function link($link, $color = NULL) { + $this->link = (bool)$link; + if($color instanceof awColor) { + $this->setColor($color); + } + } + + /** + * Ignore null values for Y data and continue linking + * + * @param bool $link + */ + public function linkNull($link) { + $this->linkNull = (bool)$link; + } + + /** + * Change line color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->lineColor = $color; + } + + /** + * Change line style + * + * @param int $style + */ + public function setStyle($style) { + $this->lineStyle = (int)$style; + } + + /** + * Change line tickness + * + * @param int $tickness + */ + public function setThickness($tickness) { + $this->lineThickness = (int)$tickness; + } + + /** + * Get the line thickness + * + * @return int + */ + public function getLegendLineThickness() { + return $this->lineThickness; + } + + /** + * Get the line type + * + * @return int + */ + public function getLegendLineStyle() { + return $this->lineStyle; + } + + /** + * Get the color of line + * + * @return Color + */ + public function getLegendLineColor() { + return $this->lineColor; + } + + /** + * Get the background color or gradient of an element of the component + * + * @return Color, Gradient + */ + public function getLegendBackground() { + return NULL; + } + + /** + * Get a mark object + * + * @return Mark + */ + public function getLegendMark() { + return $this->mark; + } + + public function drawComponent(awDriver $driver, $x1, $y1, $x2, $y2, $aliasing) { + + $count = count($this->datay); + + // Get start and stop values + list($start, $stop) = $this->getLimit(); + + // Build the polygon + $polygon = new awPolygon; + + for($key = 0; $key < $count; $key++) { + + $x = $this->datax[$key]; + $y = $this->datay[$key]; + + if($y !== NULL) { + $p = awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($x, $y)); + $polygon->set($key, $p); + } else if($this->linkNull === FALSE) { + $polygon->set($key, NULL); + } + + } + + // Link points if needed + if($this->link) { + + $prev = NULL; + + foreach($polygon->all() as $point) { + + if($prev !== NULL and $point !== NULL) { + $driver->line( + $this->lineColor, + new awLine( + $prev, + $point, + $this->lineStyle, + $this->lineThickness + ) + ); + } + $prev = $point; + + } + } + + // Draw impulses + if($this->impulse instanceof awColor) { + + foreach($polygon->all() as $key => $point) { + + if($point !== NULL) { + + $zero = awAxis::toPosition( + $this->xAxis, + $this->yAxis, + new awPoint($key, 0) + ); + + $driver->line( + $this->impulse, + new awLine( + $zero, + $point, + awLine::SOLID, + 1 + ) + ); + + } + + } + + } + + // Draw marks and labels + foreach($polygon->all() as $key => $point) { + + $this->mark->draw($driver, $point); + $this->label->draw($driver, $point, $key); + + } + + } + + protected function xAxisPoint($position) { + $y = $this->xAxisZero ? 0 : $this->getRealYMin(); + return awAxis::toPosition($this->xAxis, $this->yAxis, new awPoint($position, $y)); + } + + public function getXCenter() { + return FALSE; + } + +} + +registerClass('ScatterPlot'); + diff --git a/modules/graphartichow/artichow/cache/Abel b/modules/graphartichow/artichow/cache/Abel new file mode 100644 index 0000000000000000000000000000000000000000..82538a61245451da65c5188198e03a074a3685c0 GIT binary patch literal 15596 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 literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/cache/Abel-time b/modules/graphartichow/artichow/cache/Abel-time new file mode 100644 index 000000000..a730f38b1 --- /dev/null +++ b/modules/graphartichow/artichow/cache/Abel-time @@ -0,0 +1,2 @@ +1166203484 +png \ No newline at end of file diff --git a/modules/graphartichow/artichow/cache/Albert b/modules/graphartichow/artichow/cache/Albert new file mode 100644 index 0000000000000000000000000000000000000000..a40f424419122eb9ffca1cfd4b4db79ed72bd768 GIT binary patch literal 14816 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 an7gxu{Bxm?TVUrVBqyaLSt0Qz@P7cSTHN3O literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/cache/Albert-time b/modules/graphartichow/artichow/cache/Albert-time new file mode 100644 index 000000000..7e2eb85de --- /dev/null +++ b/modules/graphartichow/artichow/cache/Albert-time @@ -0,0 +1,2 @@ +1166203480 +png \ No newline at end of file diff --git a/modules/graphartichow/artichow/cache/Example-006 b/modules/graphartichow/artichow/cache/Example-006 new file mode 100644 index 0000000000000000000000000000000000000000..a16839b7d28c3345cf2539971308d6c1fafcc7ed GIT binary patch literal 13372 zcmcJWbx<796X%fxcSvw2Sa6qMi$idCcXtcExCi&ZLJ00|!GpU5cXxMg@;kqO?{2EL zYHMp|cHZlL-+tZwnFvLBNmL{PBq%5-RB0(OWhf|UhJPOf7~q#%QhW+1C^9H%F%ebI ztdndnO&pDuxA9^)C6OPQ=1!vfDWhUt#M04*(R{2X(INxVS?Nu^+lN$%rn|4-`Bw)= z6It;SkM6f)b!M7SFry{TI3vW!$ns;U=_x3JHj!dPQuL){H8U#KNDJ+zS6nqT+U1Bd zuDr&!L`kC@I*Wcaj`5!T#mHBr{T_q~Vi=aOgA19G?80MLUJ}l`cKd~`Op7I&9S=&t zI|SoI_A1g8C{l&;k%v&Q&LGm^MC8d!<w>Eqfsn+F|8Gx)>qkUJLZVj4$x2C4S5gYZ zkns`r^t_M2reR2Rb9HUI-;7czlGm#;6w%Qk{G*{l+fJOuh+ZU@>3)B11fJ*)L5?Hh zH6HZ89Has6!$2zZxDN>k2v93k_kDfX^Eh4hdOB$o_hSy3T7q7>R4i6Kyzz!iTC$}x zq>GD-)6vn*rS5ERGw8M8kk?sG=087wi?95t=*=%kMxV*;pkHm=*B6B=^stRByL-CQ zy5_Y<d^9{_eiZ->ivjBB=$Jbl3S@0~{ZnJBrG<ZYwLb}ICZ!tGYQEf#z<z_v*Hu^V zfBC!$8kQV9i`#QPMwT5Tu6;&<MedblZa01SYsvBR=g&pm_>7Fj)zz^YTN|6wmp2$~ z=Zj5o+TybAm13(*ZvSRvG1LhbVLDAtwnD>Ms6q@wR}OA&kN#-<lsI@aqBJ4@j#189 zi}A6cArOL@nb~L-FZN-nKx9SE4LaLe$#K#mM&vw<`^UaeR6_L%UAn}<rZ@$G8&!36 zbxTXyJEz$awM;HMYa1J#HcuyCUtcjXF$sy#+*|`(6&ASacPX5N9&@^9Gqag@79AAz zj5y5iTvk{>B))9f=jCsUd5W9)Jtv(8TW`m`Yf^S-eM>*!yPG6598$tqCogI;>%?U) zP*xAXb51M?mPextl0`D-&00o;V;`V?7zHR-S)0mqm2?s8X3HalH*^sd7+T3mT@ab_ zlJ_r|*C}e>elYtZiU&^kl4LY$`F4R)%$V;<&cU)3&1i7?O5V8@G7nD%Mmw`2Civv@ zl>AAVQ2c`4(y;&i;-kD5t?^&^l#}RK6MI#6DLc$Q<UIL(6gz=Z1QU#IgpK`oe@BsO zXFe*mVVt>weyt}rtd=2|5D*ezfMB1Ueh^t~A5(X+X#Tfpw{)%Bo8YXvoCph~PzySi zcpsCX9Ppp}wewO%i|G2`kOMzc18ahVgKv@XDemR!>h0m7z7wr(yNcn_aJGGG;7txx zN~;g&G^v!|kLZSKE>0Uvsv3+(4hO+xtvPvXm9?Ix)qg*duTL9Zg4p~kT8{eUqw;U^ zQfe>^m1m)y;fFjt@|lSV%RwAo|Cj|R;`Gp)5H<=2HxLHV99R^R7RuL97!tdv^81JU z0^=ea7Zr}q9pc%5)K+@-TdSn?5$!5$OsxBGot2Kd!@0$=zKTT@AAz6ge5Dpsh!T!N zaMM05FA?pd#Sfw-A2N{C2j*6hR8FP!AM*QYKOg1AX-)p34`;+X{)A+gS8~f3<Mlm} z4I}3DBlf{px}uhCiiA~F=RsGOxheMzv!R_N_Od8Qb(P3vx4f5$TwwEdah)+5r9?y% zg?yYrtT}S6o4|Z)cN++Ra-S#X%k4t_;|y}HLc!t_`!K%zt6(^TNYQzbLw8ooH@G8j z`8R*I;`7HHxf@%l1z#Ff`ed#*eikTnr0)4j?wdBFocJK+rPR*SzVQCS`+40kFHuZQ z2}io^a(P;krwGU`B*dqam#RM9RLQx-MK{tGoKXzt+${*>27+I1w?RSZM(4uzKq3BB zRkWRCWg9sT<$o-MaP}1Ij{E?#4sLF41~e%9i<h&#Jrn2`1hSQ^p)V~fo5^M-V`WwR zasw<M<<i;B&Ur+NU=4%Z1yZcX^Dz!Cu0;dN5yS}8i3p9Qq-K+*4E*&t0z$&jQpX$A zfT8$0Hg6D8U|IhCc@O&4<t3mh(+WZYHggP+$tLHWq2Au!%gf7o1OJuBctvo$e9`pL zO+rEf@GmZwM_S@(ZmOX+f$k#IqCNR$g@qni*kRWNcD>5L0Bwg}`b7)0-Jb~TsL$X3 zphiJP2CgkHFNcPPMj&t2%}GlO$6zCfd3m~PY}RB-t<-PVeopnq(St2TFk|UP|Gs6P z$ESb0)3_#M$AF24QqDO)dSPO^+)A%JD%@xO2m{5rQCiuNk(7jkhj+i~bEd_H%b*#b zn(A@9z}i?)CV8mk6b9BN-P*5^S83;UE~qU0U>y;=xczI>EbMM&%P*mbZ9O4XF)Su% zx%%yIwS{fuh_gSa+tCL3@$tH1KL9b{<9C+<LkI*4yD8WI^+CYr76p&xM_t`DAg~S{ z57em!YHG<jIj2=RX+YS})U>ogVg*h$Xmaav?yTyn$V9YRZMw6&9e#OAtmkUk^J03L zHt0MoLh-*xTWPKLwXLz;*)+q_p8Xt<{##E&qiFsJ6V%n!#mmdPv$NCJ*M~qJ0?JdQ z?LE5tvItj8ku;yJ)HghqJ?*(j(*4)ha_={k?MWa)o)n*A7a<glZl~YN@!#6qZ<m9O ztKK$OyQ4j!s89D>ann;%yQ7(n=A#6s89+#ic%yg?N7SF4Cwzf7A|+)9-KnUUKoadY zG@2g-Ow#rW#7dI0xMH#|s~9I17Qh$;dFJ*}?jYx(eO|hEQ#4s$ylUh!UDgDb21fyx zt9i9t`}ir$LH@Wgy{dn7(cQC}FNfEqtzGh%BK4|>FIR7QoZ3Z`L&ay<ma7&;bZAVk z7X*J~XXRZr|LZ-?l{ttq?N+@ZZzD%_PG)Sa@f0tW!o|~tV)kplhU=eIPC&GcgEU&; z3K06#x3CxdPJeOQyCFwpchG8{JX=jS(djL!$e1DA1>f6~lbc=t!nstZ!4Xvn<^>z5 zhKdr8o9>a`WeHHJ=#@LL)+AUDG$I%1EZ_o?A-(WC@BQ+QbmpSw$kz?)AY}y}ShlY7 z+HtDGmH|oVfcVek>$7%!e!4)UnN*6N_#ymdf^@B|_@>S%ClRa6{WZzzTV&iQYV~pj zG_0c`%W5u7n~oF+Uw|=0$^|rNW!c0%LHhLQ?p30jA8YZrZn;sE&QCczBJ97!-@EFc zTEj4mrolQp|76J?C^UoE>Ue+OfdSvD%~OoP3eqG#OVqh<f43_mb3q4;l5Gynrl?>A zB<NX$jfAGpyFA<N<%-ih%}B*1yjPLYHKFahLL}7Rl`$M2AJ!;q8jvI*`9$$gsc3^W zZL@V}f)O4b^YapFYHIk3N6&a)FaG8@(Zy;A=&Yq<e6n{C)jk;)u+={c;xod{AkZva znY;U@IKU2HQ!8LYB%LK>M<CS4MYVPAE?$z(jAkKiXnfWMsG;Ne(8kP3f2c$+#hx_r zK&iNlZNL~~eN9bE;A;bW10x3~r`D5cQn)>NOsq`6_7+&~W;dS2G`(f?lOSA-;;?lo z|I*Tv7?tC|p21SwS63bE61@0wrZ&8qEXBo9e?r2u8`5xJU%M-<-o>WEo`Tq;&%+s! z3Lde!Qzu-STz)(Zk<BW0r^f|;3ygrlaJqvu>gz)>Bne;XlVwsNI0zdF7d4{1UO6ly z)5`Y6W)>QJ7s6mgDXDO|F$B)5hrAV%`jW6&OV=3{oGii3IWQ;T%*Du!U=`!t>Wlc6 z^0E%Jq$F~-X!bcd5XuUMU*(y&ylbR4g41))s<rK+W_HfWW@jIL?iOg1YwZ$FrV$ny zT_ZjC@~YO=Oxm>$_A&6no?`jLPOP=CtD*UFtaUs{@q`MO@RxKq)#r5BL5!`8mX`!E zvA4V}{O>~jk=2L?O#L<9Sz=jb@tb9=moP@2y<M?9+zfOf?e?SUyDUGE%^;F)p2~oH zB>IOdyv}NVCek>>IC7X|qEpU{ypcQzIVQHj*4!R$!6Ej=DI*~0b8^<-qyF}5&?zMA zH97qi^26|WFU(<WE)EY9#Z1%V`rGz-u2wVl&p(>AQH{|c^2SbTHUd4DH!(>9;$$eq z0YpxMfi3J)wkg?EPJEQ|S?-1VNf^>JO!{4}m{C_)EqPk<kTw6$HH<@fv8g-60-yB5 zIBIG?Q-5`0rnSz-A#a)n6A(U~#%ju+%hTXsv{_plww5Ah9(Vi7JFfo6f0a*$gN2%+ zqnwMSkM02vJAZY!?biO349tr+_$OR#O{R)S0)OSVPCr^>T9<<<y@+9087-}Be<=0K z%)yBj@jCHEVng|bzki#Jdf<i!f`Wnu6KRSH3)NIrHQDq?^k~UrZpuJ|8N?eEGg6gH zg#MEK^J7INZhaTX*5Jry-{A0C2`N}=f(VSEkr5!S*P4%R3d(14ot$s<AmoK0<C5?? zgNJ7hTxVxzSBUj!PXbvK#uhI3&>!!vVB=f7MzeD5h8Av+0zTq@&2HK0L2W2nMqFRv z*15V=zkj^Evp9p_6~>EgYx@!fPXSJnDb%mzCWxU<9Q=OpybnU0wDv!pM-TQS1JQa@ zsrXLYvUy2Qf97v>{>B!)6s^eWYyAeD^E(=w<csI|{l(U}z}<3#-4aMt6chBnrw5r) z*+hB>o`QKgyaX|VQub5UF+dF2e5HUo35E(*i@g<z?e>x{7&=?#m2-A3*t0#Y&T4;( zG8a19+P81YW(V~hza0itp1EQTeWHf{n6|sGq9Bl*kYL1?zUsLZ6AX{8eVNLjRb!JH zY)3;(qKB|RR4;h;9sRBLrj}4`_qxwr77-JKU{$Z}G49FlHN)|1jk5F2H&Uu63yO9} zth`10EsVR<^N87=1FLS4ItqJHQO!tD%W|<f#zC~*Vu-dJN7H3yV1R~<OgK+b(;5z} zXm5WSjn7`jOnJKx3ey=zh>CTlqn1~9z0B_|3?c*OXcK2(uN|RD&$yxG+}JS7aizu0 zWp6B7(D$+Rtixuo&HLssUp%TQxA_VYcw#9Sc{s!nOjevXQ(<r4$~Cj&2@PE8CQRI& z{ag9lqc9NYqTa?ny7l(`?|jH+0t;Wuen|P1{|UP*&-Sl_)fM8a9O+C}N;t*ZFkY`q zbqV!T2MwMK#U+6;19O9uGX%ns=Y#qkW0WguG6<wSqaUso%Xln<leOI+%gWuouh;&T z({+`|4TiX;F^rFV>cH>zrq6Fo;_I?68Y{@tH0#))sN!0a?l&u*_IT>DJYGz5aAe*T z0%wPKYlz;3JdLZ3wSiqZx!A!m>gtNA)ZV+{>NxZ%OOzl~m)N2`HD~sQ_fl4wS&XZw zDJCi6sHhS~>JfnpnF=Y`GBszGaxo(K{T`I~jmnido$l-F=-Bt83k}jtm3VpGxXe@J zPhs&p;O}KL&w2NrQnZx$nbVA{P9uM7IRk#);+dJb!NNMG{qRVX%~$=Zzo8VDns+Ch zf(_c36Sg*?B+M6+Z(${0K@n)BqSn9dLFax?xJwjQ!8bluk+y&Pr`Hz*0uh~P-m!?6 zrt8dmwObzyJ$8Uh1PBkWlbP{^gm6A~sjAKd|6Nouwa}3N>h2Jo^L9eO7H!pJV{gOW z+)?KsoQ=WBnIW1qb{1T^W!R#?>eTM=Bj`#v&QBaCd(bY#gOB`eJ-KUwK5^p}HcM~o z%kmykCZk0->V#G)ApK23vb*Gq)bm~2fOajN#WtBGdxp0^06UE5;$l`>udkZeBxEs0 zGBVbq<`lbB7kMq(1|E0zNkg^h5=j|(kdTj$E!fUszr&BWd5S#hrQVM$G<51QRYs_@ zHtx5j!vk}txCMR=)>zB^?5u?y3J%vkHxl@lBxQ@A{ByGi%P0!TBDTL<M^W9~=_T~I zd&m>}zusLx^B9@H4j1v#hbFWaQGWsaDhUaB$z(}yKfe8aO;**Om9=U1xRxjdfw?XL zS9Ec?owdFFQ94!xIe)A1R1(Qzl7RLo4#{0Ns`mT!Z23Pzo;%L*7;AB{k(Xk!QArC> zdO%%(+vF)>vfJZ+=X-_p@E)7s3W$LC#t$V_edGr;tZrk6m|$vkd!BekwjQe$QcooO zMGHL(f>HG8>JDe(QtQFAyrzzgV@+wurwAHqeTi49spI1z=|RCUi>wRTZ)<Xs^t$S| zkeQtn5+IMw>G~Ygk1<3^-$MhKAOyxEExNvbv=?q41Ig@LhNyVfNBh9HQxPTl-Bw75 zJkyU!rL(;!7jbf#V`p-DglZ=-W}6|vYqmFvt#8F9CqZCEQV&qh7B&Sx_^vg?^voTa z&miec51$RllMHoq_yal`8$p04qRw5R=<}`}OnlGCAn23)EYZK|vd3Wxx4--4>cGa| zHc)xmDsy@NV+lSDB!q*H9@^i_fp94}_@>PU6ySCT3%_pYCF#cL)b$%zf4ODbY)vFs zGahMeh1*h<L)3)bl-FoBIp>Jn5wiCR>qEgegh@D{s(!d}4dv;!GlyUMEmRUD2xsqA zCexSoMGfZuq#YBmUU32=U%g5jTJHJ>Zow`|RO{OFG#&{Ew9X*Cpzz(TzipI4yZ~QD z7eWXv=!bRp>FsZi@T&zBV8bN*m1x=|IZvWz9x-n{^jJqHLR0B=Lvjfot(PuN_M1$4 z96G@laB-P!{2YoEv}5;PuD>ATzvBd`65W!P^ZGuzy1Le37ccPamfZ1?gZ9tf_Ju6Q zZo3nq>f7<S>>tXC6JGk*1vunpc$Iwp{*e4e95r__`p@C%+4Lf5BlvPXO)eVBlMv(# z66`9Ss=3OO(Z|HiPMJ5A%2BqNzj?Ei^I27@_M_zyzI#|D#vSu`Jq%%zRMg7dro{4a zNTtu9<GW}Vr6VBT87`Df{VA8pWigfonCB_(<L&86W=_s(Wo~USYLd)IhLXLAf+~(c zRd_M~>mzq(Om3aUo|Gc#YE$0J?i-)J)?f6)dJ4hV59P-8w<qL20dRwXu<%&e*a}%Z z7jrrez7IR8T%^r5i;Ih~BmynIPq#Nm^ZW@J9QJge{i8}u(6Hvej4+pM?>yu2QJyr{ z2Vt<8hz34DJBR5t4D6m8jM=SS?mkO8krK0edz(Ezs&}Z~+`IjJt+G`5)^Jw-=202J zkEZte8<hQ#e5SyzX0W<5Q~^!m58HV7xI;Q$Jqr8zLUnC%F}9s;gD^Vc4p8Noj*N^X z@>{OAneUGwgoTA=)@_PUO1kdDHCW(QXYIF$^w6bcHDEYdK1UxXxwq$N7|rcG3Xb#4 z@jWO;a(VG@9L+p?D!ncwnQA1rdrU!p+uhr`r&XmJd|tl3W>&Tsi%wp|K!oB+E-opF z<o7whJy}8u>E4Cx)O?an!NJAF{rHjk(<k0zChhQuJ~a&iL45-i69iQ8FAA&|y2B@N zZ>M)B8?gdf{9p9+!4qwJg1%4Le($`=S~|1x&njwgkHD;~teBXXaRRpsn|)D2&*!3< zar<2tKb|k{2D-ZTC%AKbnI6!wy1Q%4Gq0cKeWQ@%_&xl0C(mA1WOe*sg5rh+-W5>r zWjt(*m=%}Dqx{+ZCDpV`3);`Dl!Jb~e|vcv4l2|oq3iJRaEkePkE?KXh;`)Z{p;e9 z+Aa~q)HuG@3^Dmiadn8q9Xay0a6SK4bu&3xQ@xed?&!vsy_{eKGjZUGHoTwp=Gl5O zk!SY$s<-KWJ>reHPGIF!Ju+LGgPNMG&#+tjJw8~x%omlK!R_vYZ0du4u_3qZGMZ{f z*z?YcT|&Z0lM@qHx$u;@ByaxHdCoGBPe`Jp{N?7V%KI{>aBZsnOh_t++Uh4zKzh2Q z5s4uqcQk3m+8tRL`BPpBZh0-Z%W_+4H_ErWRhlUiDJG`uy9c~9xrXpV#+CbGx50y@ z+wo$Y=R@8w+eaK-ez(IXuPe`N4`PZ`(RR6ab>f(yN&0U?_SD?j{PfV+{mhvxe)yM; zW}avIt;LC`2pG$*Siw;i_sx6XmX;=-&Z5fEWo7+G?%UQIJ1N=l4iS<gn<q8Gjt8B) zUHbUPKAZ_7^!2f6e3@gMu|&x$=m+*?E;$zmdtt9v%-t_l4Gj<NcOBj@ZjE0ss>~SQ zg^KiqZmoJoXL$k@uwha*=XWlRv36FNO&5Vz#lFk0^3S<+*=V+>wBvLc3IaQjcu3>g zD)o=(lauVu2f1DU*S>MaX$EYqUdZer_$7bHK9Kp}IOfL1b+c^WUj4l{bv*5Bb`kGe z#jQ)m&o@Rg9r&(9!=5iwm)88((5v*ZlfcKxzm$2G4!fhshY`yoqD(40f9iN%7*{JF zJjXvWNfY>s(|!_9iT_=uy%S2xq<epG=6^QbDP-f0J)RsSME}9%^;vFy-iz3jH}581 z+m-?A7(5oNfr?tD!<nax#;zQP@f{w%)|~x~!;dJ31-kS3Qr(B{iS6|wE-cqqoy)W; zJ`eZ3F8+H3TRaYgr-!`7MRQp+K!(3s(w^=M-`t$@Q#Nx727<XNh^V3GV(~`{<W2nU zS{1SlZW}v4l*|hC4<J4VgGMC`wYc?JZ|V42n3>K$4I|p=k2^WtuLrhQ8B9)1O|Fii zAsJ%Y>}IZG%=O8HTjZo~U3DX`JZ{{cSg@4H<WSu*;0~&+5!KKPBMvBN3i@?B4@-8f zfM|fADsg773dh1%GL0BbRHAmTf&6VM*MC1Og^h$y)o;staHL2~E(+5YuPlk4AeUFg z=s^ks!BYHoTD$3jPBY|bT&D=JN}=bV|Gv?4QDY|Pvgclmu8`A~p6cT)!iU+~7fwR~ zLx@r~xqv+8{0_`OQ%6n)^&W2XXg(8)laru*iSni_-Hc!4yVO=s&pE07Rl0x=@?CXJ zjnVM#^3HHuFD&n)VN?=uokJ(!eFnsQ`xUW?>mM|*TV_MS+FQXG%HcWr#qnEj&vAYV zg3V^<hO@b^uICC44?%T_eS~nI3M2iRey2)EMvyU~88pK*FJBBLe?FZ9D=HNEtSt(> zzV7#Q-j+7s^ck!jajJ+uK$KZ=nQzOX=(OZ5-)8znJ&*|r6g7Xf=7?qxQWW{jAwpMy zDH8bzRA{J>(^14FH>Rfe?O)VAx=M5XPc0oR;8C5&@u4WgytB~`jov49_likkg76@i z2~BO!O!<>a&f!sJX#OsEVv*-J*xx~lc9o|ljLJ1xj>q5~6B>rb2S|S(tKtgCNTpGP zR6&?^;a#|<$)k2aQrZ4(hzlB*mWnuQy$7GRj@--BReeM2f9B$;7g|Dc=h6^ts81W9 zEVb|Ki7s6XxmbN^#E6N-64zxI(V8ZRA!krs)DBYBY@*5tfcjzx1?=*nwA-P(v#K&r zJhn`n#u~jgcPdr&PYS2a9tjTj1!owkMi5)c1!Id{EwHSBA@)nC<9B;(*~wC{7a$T7 z&w|uK$dnH)fqsxA1oEv~$jx#3r<`^D;znO~b~YiG?Y?|Tt0WZ#N@IOqXsD0zv8~<7 zeRDD@nyXK<o&nTEuE_TmW@2rGbud>E+Mz37yFMvC{=xYsbH_aem-?S((u-<M(?-C< zKJo}c&l`My-Z*^~7oA(8{({2IwSTrkxv6TRKskqaqClK9yi=-Cd3yTT*4Cy~YmRuI z-=s+`bcQz`MGRMIZS&rq@rn!$F<uz9+)#Pn4?nNK5JjaFFA=dOx>rI{998N3i`ztZ zS1^1WsnF}P%edVVP-^0sc@64~K*z;S$$9x&H18rb92~s0b^hkdc-Y%rYr$!RZVk%T zzZ2Fvm54nJ6hJ4@%Gheo>cZ>*5}P<7l8^$ynE3rG#Oy4-|5na*dHFxGU%Pn;!)WFl zw}zuz1EItF{jHG6Nti~Khkb}i*Q*-cpmKkHIFHu=rYWZckOk{?4(@&kwOxJAnhEv% zSPkEOF60*9^WT$O1b%XXoIA_Bp7q(}NExG1rQuTTFW%WCCAjdkAtJ*Fp9*8)1nVX; zArPi&BBdt#m6m3gJ^5V0mlcn-4?nO;qmYs1k+~opm?3l_&zr$b?-k#HrT)~}UjG_f z$?eKj6(?Yso;%jbnd1eDw3~jO+X<4#mD>v6h_3$H2X53faH+^56XH-^^uXQUn6{w8 zaN1r|{=CBdW)Or;g<S)8l&wMW@=bBuQC|+{35|o>NKSL-Q<#n$2?{RwT@vVS7@@YD z@`q7e5ehvcd*&#Mo|Q2K0toN$0FPkG!|jp7yM1epP!^bvtkCvGNSWb`TlZAExw&4q z$F76qHXlM{H%-zjYeH;ORdqg_zP#fxXOpLHgqQVqAY%6`JHAHGmM!4wfyAp}$L2KI zUiX^G|8$Ct?r$s|Jvm`|o)Gj@Q=zndc_)DYTfxV@-$nfmM#e~)rvA{ar9d+M63Imp z{`W^3Up~H}+#2@W<ZLG=Vdl3$BpYiRRHIXcm0henw|6WIIP1z=18n&ED-?i8KeQ2J z8#~#%SF{c_+P~5on;=VZgG)X^0nN_eh1686eYoK~+(V*3j`uA*&Wv8~q|+R`&D!CN zgFwrxO4#80aByA@{V)p81r*Rp43v!_=~GotUs~*y-~BnM#1blIxFt|9+i?E&A)zQJ zsJ=ofW+;9fOtpJO+*;7kt#U0$BZly)skuxV!V3QU9u2FTI+CT|$L*h%Za>h{^s+th zj+w76ysK=wK<rXKxG}t<NA<2k%>CE9%!wz+{;k_;WN&qV;c{i=it`<;sp~Ww^OKlc znfYEx*m0asoMkI9Z6v$3u%Vk07{V7)GcSzOvoQO$T^$iCj!;MVQWvodS|}*&yMHVI zZXxtUZeGD}1CE^d44xETjm_-;Xx>c04uqP~!<QI@C@+a@7o^c>zl=Felng(dm-E?+ zWf{hu2WV8HOUFc-+0Ul+5$OTZr>*JRZtZXd+z~I9@kRBs|3z~Rq-XgVyA*>@P=q`T zQTprd7)o(@Ko~Gk1rUQu*I6BPj07pQeWlWbI_VF*>OqySQpRImCei<<;?3i94IPy* zh*_`YNO6GAQ%&bHJ$<m1>x>;8><ktXVKEpleHYD!r4Fg}frD=dxe=~o%fvJ0<J=5h zxA<8L>P<jRS^5ao<*O%x4?hjn21BJy!uK7py}$&-I2}90LeF|`jsO%QztWLQMQ^A; zExhzadn6)aq*)ncfFE>Vb_8rp)HaS9wGs!9w@jYstI_nWI7X+bjad!e;hiE=D<hHP z5aA%Gk%DCYCbO!?935(v-&%wi2eevq@Eu}edDcleto}m9t?NwuP^E?@j)RSr&g|~b zRR19!FbiU$fqdFC+uM<3v$hUE2cV9YftXGYEcm;y#5u4N(`uCmq>AKMV17xYV5`4Y zwO@vvJeMXbRo@#7FfSfy25D@HLh#7jNsfPf30{R#D}?#yiZZ<6fBVI@`l)9Y_HPe_ z70E}-%D&g(DAj7(0bP(4vjs!j`-s^i|I^c;3<A-n{g-U0T(`(fo(>D_#B<zMcAo_t z<n;7UR&*x;LBIkJ81Pn&uKj2Q6rsLK$L~Qsx){hO7T6?^2<j%_t(^)%v6;)KU?UkO zLFz+N);~0USKQWk2M-^iN~VjXUJhTNN?ElUaCj7BUmOVLU}u*#SFi{QA`_j?&pJQz ze|rKFCK8|H>dQ-KCYlrIjg1W&`K+prg+c!aBUKbZ-$NOXH`zb#5FAHp>J8u4TJL*V zg{&rgf@LD;c8{OuPM~c0qFL*x$Vh8zYkl9F+2dnd)B2~EL<K=!w?oyVqwMEYJRIla z&!Pk|Mhh(P4st-5f_j^ymkH`LX85}glM1tmF;=2iRS{$q81vQ79&VD5&qF(x=z{l9 z<Q(7b9U;}SJwJZ^qW$!#Z^ME2ftji<%y5ljXVWk{d-w4%7xZBh0ts-Dltuv=-y`Od zFhi_)UJpnfF9ytCxeZKRf#%^rY>M|RLNo>&-fx&)1k?VnA|hSa2h-&)?q{nnWBg}4 zZNO;B!N%oqh?TEZD{Neb2ZTH$5d`#~X=!u0&oG(7TIT`2A~3M08I4>a`_!31vu%<s zQB)BPZmPOLs~|S#30ExaGiChP%Str^y07BIOJ{7CAs+S`v&m6K<JuE!>ehiMNa*GI zlKG1wD#eAorjk-Za&o=h5|`{)yU!gEYChoNTKHEdzHR<`%p2y_bZ+%)?#YrinOv>R zWZ;EJ#xZ^VOeo-eU98gBJVE>K8LquyJ915yh&{N&e4?V}Hwum|+z{0pZiQL-5Xjs0 z<H%hxK;G@KN67D%-h+aIgL2bGPM6=R#H~p^phueBWQ*+XHH?Fzhr1B4l;ky4RBGK% z7J;BXXv!wL3*`8_<GE+&-ZXE0<hC_+20|P>L>j6yG*n<G-eunz%j*pp20w_%Z><aw z5fMc~QWzO>AQteUgCx-U%I#J{VUIDfiAP5my!cLxI4z6gMKJW+xi~oiLgngmXBc2s zUT-S>?FQF?Z$PD(fs~O3y!e(X5X6rj$CDveGRYD4S(?8(e1gh4Ibz_uY%LAV2J>4p z`Z@YGM)~cY%3I6j!n=M^g^=?M7AmTO{QPdgH=y)f`)Ubv5MMi?@IUly=T1KFa&MKf z+t{G0BpMQ;;nbw1{jnXt^o-_UuQip=7`br+9oz)p5Ft`JNlTaSa7b6s=&6`swEMx3 zFR1OoH3@&t!YR{MkU=Gl=KuPuC1ai&DJs_8Jp-MHHv2&gS0S+dL4Oncr$XGCtJckJ zG!H2)qYB+Ncugl0B{A_l75_<~C^ub;ZGc@w2^m<$X)?PB6~h^S{yuitz;HzTo{~0P zC=lB%qnTf{Fw^toQ!{^S4*(R2GSPq}{kY#7WFw(93kED-Q66FyMKPg>mktD;AIcT5 z<)V}<p#5FB^5M_##U#;*>2o=Lnh5)|gY=XY6@RoU%ahsoL>;X;c=#%Di=p;;SQBPu zF2TUQ#H#^>jW_itHpw`BgNCor6<Nt{8|9x+Tt_XCwK(&nNUF8x-qrX8O?^(w0=v{k zb(tX}SE3_7A<~zvzdLj8hEJ3l9vXtm#&FF40qvR~n1mC=XcD(p(UrF_0I%1%y8X=N z0fA^~eR5I84<nv5pJ;~Y?||d_*J~|onsT9^z&Ho%{AEIPn4|*U#OG1txs_&LV<vli z@>#`Gup?2DLg=fSdo*>HMr!uQvUkrhez6dbT*53^eXN2?siqNyq$Fj9yL1Ymdy2BL z%kCENR=~A?;iD(15HC>_3k?fcq5bV>;ONLQQ;S9$f*Fct)y;$JU)r7A)Ja-WV(sdT z`nJDcZzJbMFuLDlPfETp!J##&MCCnt1Yx}gnlqZ3!k)AN1n`Ea633PT>24fHv3iNv z=|Mp@tgKMk@qmK!S_x<fC8%MSeAoE(T_ap+eRp(bjsVIABvp`uwF0a2BHOnumgTV> z<e41`XL6Blqtee-L2u3S$GJOm&7t$*#hrDO{tcRkqv>UP@H5#FO_P}AHU@{V1<O9B zu?W@=)!MEY@kb-1FMmkYRA)RiByuJvM@Epxe1g*?B=s((Q06S7F~!iZWU%Vi6UhRd zgvssh1|z;2<^965(#br?tQ<BMT!r|Fq+kbqQHbkj<I~dt@1IDNV<9IObab_&c)TeO zM(~_T6{k6j47Hp`ms(>y*8@`@bZ&{V`jCg>*n(o}%0Y{8I15Glz7&pj=QJA~vHy}x zRsZyUUsLek!+f_;He)K?{~^q#KBq$aj?D{&(sSl@y-QZ%E6d$gNc|s9fD_agcgA{U z8tB3o`Sxdo;lYf4`s%_IC{Zu0tJUV=m-x=wI-2BuO;s0>1^_UbW}mPRfjp{#Lqmth zvssdoS68LRp{vM<n|B_zp=}R90a*2NSZR<s%6|@Xf16Gdsyv91GF=%)O5PX=siOHw z2Z$P-$6e6gHo!bD0rSjgES(odHkaE@GU5Z%=q5uFeC4vD!{W62byQe_kT>lt7vWYx zdajQ1SIzrirf+b%5~!AVw)le_3@nP_s)|qqSfN10Ffoavmv2ql6%dQ<bX9J8Dx*+0 zcr8xy;_Hx>_+B=o2C~1|$#TibsE?2Qaj~wI$gl`*-6U}5T48dgDN1B2Sm|fZ%olAu zpG&t>PgR50e}B6J3b8ZRoOdpgk^`SB+rFoyaG4DyO(`!OAisbAK9NR2URKtn$%$pg zb=$lh+R?dIhaE4w$UK;2jGl$ABAQGA1_o7*o0}Us^OWC`jD+=Fu8@IE`7R6J<5t}0 zP9gXAfhG;qZV5@~M=)QueC52PgoHC`jKmg@&0}L@4-XF;_`lo)1;HFet@*#b0Knt_ zpeQNdH(4SmB7GFDC6oPAgJ*vn1=bNVLvgv@uXoxC<?CeleALaXBG8eX=mKR8YS!)W zzOg=vi-?FoAcssYbo%>eMkW7`2CMY5#vRI3V}&<dmDarBO>G)K*QbOBrn8zWo6{AW z@lm?mgyRO>->-B6ABg|qo%;H#)g}YBm)s7kZN`0(QMk;00MmKf$@y)lM^4g4-l37h z7KU_$d^<fD)0zu!`K8?61twUNJqp9x-Y?DNjey&wi8pN14Fe<+C_=`kize}_`7fD1 zyqm8uG@~oG#X1y+vE$zB3k?=lP;(QlhdGG{YHDJ#n~}M*q>D>b>)HndJ`Ws9uyBKg zf~;&UQTV9Re;6bCHAXQ6My(pt`3k*;pN6_F8BHP}FoHh%*-3brBhq-9jgHBhAAfx- zva(8}`8TpeL~As(>>AxFqdCLqjbPCK$`kP{#Bu&tax)f{f+MgTJ*9=Ly)2qSTHX|? z!v*I}6oI_X-~XTthiU}YD3IG|p~{HV|Jg}fd$G;yYOYMH$4om{+4JU5ZLbI?65jLF zl08k^#f5!_5{WhhgStLCe{%}<MNyaI_4Ubmj3sm5(%gKojRQXH>$!A5BQo?YBBR~p zj~_pLpKQnN>I4hV>*w{4<i(zc$FcuAhbbLVj#(6)KrG-bz{@*DEkv_71eq)ke2xBH zfoF*x5-`++Y*^_&A(j9)QWJiHlc?NZ_5LCGb_iH}<MLbeK^^cph*Mb@aO>Dn>mZ|l zXeYGHdpI<#;)!uw0Y0o;J~u+GQDOn#$A<h)Kh373P_3<Od8rFD;S5$flk-W4o;sJA zdCHeedai(X2ms&U)tX41kA*-N(M0xEvSZ@)u<}t)55$r51<I6nBc5(JOc<q8SW<E$ zB@&ws&?@?yL{Cgod;-ESptLq9E(z>%cMBtLgfV&;;_GwH2c~lYvFX@{n*Ea$q(=EG zMFhbq*{JL0;i`v|pr<}Evr>REaWS6>2)||c`{zz6?-PSUIBOYH@iz*j-c!C~!vvPY zYE_H%>+?Avf?mbZo^lI~C|dFeY7Jx)A>#o6%t{Upf_qO!mI{{?r2Tu0#d3<Wsi9%5 z8uFp_6?r{9Oiv4F2xCPyYVh>JXl@il8{HoB3Na^>mlsC^=n{+rMjyWvey~bEo^+I$ zbG&7u=cB}Se2NkqCjhNrBe*VL*v>?L1yVglI;n8fHz0w+j4KyLn0=9bE&=_4PXb-g z;z2VWen9WPX9{>yq7@L)MCyw2ro)NUiJv7ZWR!~J1lLV|iSd{N`;wQ;;SSwTE5w_< zQw`>fF3Z4(?7&bvqBNsYLA~Aev5-SRt&XE5>m}F)whY*ymm9;PTWBT-wF;6ts<Ji4 z{u-t{>Ksc=7Rz;YDkcb(rcv5XN`qy&G<!h`))1f09%u`4ec$yX>h(q=^UaGc*v$6r z-pwV$6@)EG0E{K^6Q_)z%n0ZKml!-JeEkpH{Ld`GoFn`IdVV1Oo8JhK$SCFx9=F4p z_sAdX>g$_F8vA!uVRyDZAII@kjn|D=r*1w(p>-z28GVr}G`r4VgMm2%AI(=PNK5lN zZT2oVyOfU$9WmvC4z_^X$;*#T70P0QqCPTiqV2flIK;d(B%<Br<HU>lC%jS|GsE-* zUG`!tX!^;^$+@LFbYY7_6u$)CZoAX^i{#+ZnBx6}Kzioq=YMX^>vg<83`^=j{O00% zd;C{ROA8^dtgI}Z-J)frNb!*ePeen+&dv^yv5LydxbW~lfBu|bUFp<Y&jRv)d<ET^ z1Ue`*jK&N)#cq-H@p(dKZaW8n!J?v~#)gI<OZ(*}r9$P1d96nK6>Nns3E#gvA548> z<vTe!`K(?hB_}5*FW=#~5#-q;pUwB-!v}!;G5h;)wO0i2<UfDT&CUiQWPJVU|GY&? zA+Ah{@$sYk^Su+RGQc;+3BBGINGCcwJBw-eCFJG`Sxptp%*+g@GDm5&o<(hj^i}~G zKnx*w4MS!^Lbdye_C*lTnj6jFL^BaOJ$!x`_czySXlZ#oD9Zgv*Y~jcueGR<%QVH3 zV&?y}wDz;0Abj3P%YC)Yi;V9hFg36@O|=Z4U)=>Rda;29sRU$_kAqgZ3V>>xn}MR# z-_2PJM0WFg6uqVpT_%HeZ_e;Bc+zhH7zBdfnkFrA=#u{@t%_^4u-fi3Jw5$&b3~&Y zwgngyD5GYwTL9)l4L1ZrNSRixZ~@TwQ&v_Miv)*+9Naw4&CLY_Kw*^rPxc2<41>Jb z29zp_+YOa8G(PTs)_&J}R8Uj|4+obc<gXtsWn*&$<R@B9FwSb%7h40sKlYUp^Ei^x z(^~`My1BX8oYnU}C>$D+NuYRmcmTS#l#;Q_wH9%niJB?prKOqt9`*oHktZ6~TZ*{> zE-o$x4976s(9nRj4^Cw^&~I@q9yEnfY6TFPG***d+GD^|mz$h`69Eb}fS9-8Xi1TU z-F&18s64v4-8?^BiOb-}NW=?m0$+8swKY@P9XGlkZ;twqo!hRbWXbr#!Mn7BqPU!# zoHp|nD{Wr2U#SnpS^<K1bJG|c{|{!xF)m19&{Edb)z#EYOG;AJ)WjoU+T3;nmz0#K zmurV$0DapAsUDth-@d`Xz~CT-sF!}Ab6fu%2>4YLcX34pu$iC)2L%VaI6L<uQ-Gaa zTr5V?peaJ6G-sar2^|>p+dKjMXL%xIX7@`$ak16zNIF0q1G!ync=$rAN2Ou0QBP>O zW_5l?$Eqn?xnAqX38@4Ca|T{G_;R~og3@EV1Xq>s{a-O6J1Z+pgAsuIb#$;uC^P8v z16)O>kd24O6ToXX-(!L_D)sf6oj--+T=wz+wC)D_N?;}^f#m=93oHNcUV{Nl;+y$~ Z4!L0LH4#=F1l|gQk`|X2s{k1W{TJdi;z$4h literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/cache/Example-006-time b/modules/graphartichow/artichow/cache/Example-006-time new file mode 100644 index 000000000..615edc04f --- /dev/null +++ b/modules/graphartichow/artichow/cache/Example-006-time @@ -0,0 +1,2 @@ +1204776421 +png \ No newline at end of file diff --git a/modules/graphartichow/artichow/common.php b/modules/graphartichow/artichow/common.php new file mode 100644 index 000000000..f4e6e042f --- /dev/null +++ b/modules/graphartichow/artichow/common.php @@ -0,0 +1,96 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +/* + * Get the minimum of an array and ignore non numeric values + */ +function array_min($array) { + + if(is_array($array) and count($array) > 0) { + + do { + $min = array_pop($array); + if(is_numeric($min) === FALSE) { + $min = NULL; + } + } while(count($array) > 0 and $min === NULL); + + if($min !== NULL) { + $min = (float)$min; + } + + foreach($array as $value) { + if(is_numeric($value) and (float)$value < $min) { + $min = (float)$value; + } + } + + return $min; + + } + + return NULL; + +} + +/* + * Get the maximum of an array and ignore non numeric values + */ +function array_max($array) { + + if(is_array($array) and count($array) > 0) { + + do { + $max = array_pop($array); + if(is_numeric($max) === FALSE) { + $max = NULL; + } + } while(count($array) > 0 and $max === NULL); + + if($max !== NULL) { + $max = (float)$max; + } + + foreach($array as $value) { + if(is_numeric($value) and (float)$value > $max) { + $max = (float)$value; + } + } + + return $max; + + } + + return NULL; + +} +/* + * Define file_put_contents() if needed + */ +if(function_exists('file_put_contents') === FALSE) { + + function file_put_contents($file, $content) { + $fp = fopen($file, 'w'); + if($fp) { + fwrite($fp, $content); + fclose($fp); + } + } + +} + +/* + * Change error handler + */ +set_error_handler('errorHandlerArtichow'); + +function errorHandlerArtichow($level, $message, $file, $line) { + awImage::drawError($message.' in '.$file.' on line '.$line.'.'); +} + diff --git a/modules/graphartichow/artichow/font/Tuffy.ttf b/modules/graphartichow/artichow/font/Tuffy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8151817be0cd6ef44548420de0f34450bbd78fb6 GIT binary patch literal 19300 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 a$Zj!Ywo;PQge0F$kjySg7Dpg=<o^Igwy4Aa literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/font/TuffyBold.ttf b/modules/graphartichow/artichow/font/TuffyBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2f45b4f1778912b162aff17b23dd51824f496403 GIT binary patch literal 16440 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 literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/font/TuffyBoldItalic.ttf b/modules/graphartichow/artichow/font/TuffyBoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..554faf20211288e69e37514ccb8ca844875c0628 GIT binary patch literal 18068 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 literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/font/TuffyItalic.ttf b/modules/graphartichow/artichow/font/TuffyItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5f972ec086f38a46c661439c0cb7889b1adad372 GIT binary patch literal 18904 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 Z>_#B7C6b&bB>Aj^WVTAOxCC-X{x{8C&Y}PS literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/images/book.png b/modules/graphartichow/artichow/images/book.png new file mode 100644 index 0000000000000000000000000000000000000000..da188510059e706fefc435bf908e30e00658f059 GIT binary patch literal 797 zcmV+&1LFLNP)<h;3K|Lk000e1NJLTq000*N000mO1^@s6{V(Jg00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-Ud4HP&MOQg1r0008KNkl<Z7}M>PTS(J!6vxl+zpI;T z=oB+yZZ3spQMLsdh*V%vVM1t9*h2*MB$6=@ddZ+de9C$-iY|&^h!y3KP&CvrFWE(L zssG$&D($Az{pW7~|NrzL357~lkA0ud`J8h&=X(JDYaNj-MJHbs03qbUS%b15PnTL= zVi>0=ir*4^SAK1>PNPbv?OvN$Bw(v64p(JmB%cyXgffZ{p+YW60RZL5=<MSF6Rs>T zIS|;isqBI}>U!OqBmIN+w=Pd0#IhW3n{qksH(AXb$K!fpSq`o5oVHtcx(pkF3(FeR zUA<Gy0VWdt74XfyjFurg^6T>v5pj0j&pc?hUeV;#P(OhmHd~W!*LT^LmO~pRyS)td zSZL%nsSu5_d}r^Z`C`>G^$)h7qS90;ixZz&^oKyJPF!~~xl9c4atZVg+Ci&U0U@ia z@+}5o@{0#P(;oOb?<ZoBAX7+D=eDID>K_|!n+5;Uin97<`^2a5d9+Qra5H%qg7~sy z440Ne_@ZMBEkh3UEd-GXMlcrRkmnIOj>ob~jSD>%`ZNIm7<}(6?&_u6@{H-^piu)N zkzlQBL;%|E1-Fj@L<H|b5c&q}P-8j@6SN1~%%d<f=Le6E0hZ+<NhL?Om%-v=*)0SB zfaiHqd$;>lt}*=tMF`~QW~@RTUYK_JK%bQYJGLt!7Gt5ikA||#O;B32mnVd{L?Xdt zVuEZ|m#(6BYE(`|yu_i?Bu(>(zO_52?H>KTM;7b(QllaoWg!%ffjTV#wkf3W+&l_B z78<2e(VS8tbs&Jhs8HWrkf&?;Z4))M4&PV~M6T(yD#$ZvprO$U10&9GrZ%bLWTF0P z&hE5MS)4fVNA_O{MdD30?H?o(p)M4TdG_x~ds0@suRdNbo%tuvW?;m5y!G`*6B7(4 b|1Ik~?(WlL=xAxB00000NkvXXu0mjf`fOpE literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/images/error.png b/modules/graphartichow/artichow/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..e5addb1107c770e1daa86924375a03df224d1fdb GIT binary patch literal 6066 zcmV;j7ftAiP)<h;3K|Lk000e1NJLTq002+`002-31^@s6juG;$00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$nL`g(JRCt`l zoqLca*InN~r~5wpzIyKL?9A@Yt{%IVktNxduw`793(CZ?Vkfa7AtX);0wLsv3VDz} zNEBj%oIoW&s8m9@nD8k62vxBSjuSg68!#4S*$S3H7Sd|94{0?sJMTMvUwt3_IQgTy z?{weWeIK(c`B!zT-{<_!x4*x~Idl4qkW%ukl)5gKfNuxh3A_VX2UH;CZ`IK85V#CH zANpOZ8Pa*<HTOik(E!$U@gVRQIR@;~Z5G)BUIe}gd<OX38wuze0$^Pi1>pOEzYl!J zJkKZyGHMEdp=0ARx1QU;ZvnqvGvxJ!m0eI?R{-m}co_Im;G;l!{CY-7v79TCPi4re zDKbimtePgHrbsJl<X+2l7&<ls$71N(3>=%DJ>;<8Vd&a%)l1+@z<&dNw`Rz}9d977 z6M%JHd;s`&c)l$nc{RgIzQn0qiE<{75CVkowGlBI3W(FuKPO$6w$*39*W#ex#<YiV zDm8$Q0l!i+q<g|<#mXH8u&#?Uz%SvM>qxXzhShw9m3)apIu`{@2!xcRG>ud)hfow0 zRYfSu@lObZqTpB-cE6837+?<uNZa-dJ7|NHbccNo`fYa2CS7}ibYBC0v}VZX?^K)b z2!M56D8P^5v2J9l870NN<rUU69ib?Gjlu&Yl_FCpkS!EQ7mKK>8e8@>acvuWFu>~f z8FV_>rilzObJsMu(b{9+L`>WUegSy0X2{+Nn>>=+2C%M+M}S|&i>LsoLg7Mjne)YE z4;Y_mYC27RX^Bk0wm6f$4YB%t%tnJjtK|VHC64Q`**@fE`v50uz1M+%STp1oZ>P@N z0<f-&pTuLG3Lt>9g(dDTt&mBjM{HA4DYR3k$m{wY2Q5xq+r~UPqHh?uwvCh$%eHv6 zwa-?!F&@u<u4c$5PFmNA0Icgm0RIvAr@^^=D#Jt7^AyrqP!tdXMOD$3m(iA%j!pOt z6jw?Htrnf#U0lZjDKQ5<o^Nc72b)jev2o!5voL^lU8M2ytd9ogma+vNsIHS%Qy%M7 z6>Vt=ZFw2x1ir0ncGy1Hp=EXuLXcKfPA{*rQdvIHi*PK9=JvMdBV8BUv3cQelg6ME zzU@=M->w-lHjF39LIBovQ3O7X*OLHXy-?*+Wz}n#qL9kvsI0G(N~agm0|2Ab<m)d! zOa75}aN+%biRuGyMF_#bIAZIMzr@xTKF^ypoqN~sUASy1CEdeA%!31@lt|a*y0Ohh zrxCvGi@^8P4B4Hx+_?d)>*5sfdAu$d0=Q2<!`Z?T_^C#^RHAa`%!yd{%GRq~?jG{K zU->Q8zT>gjdz^lsXa4O^arEg=^6m#8ML7W*2i-31?QLAkLQ2VYyTKLXR@g5-1AMS% z$VOrzA(;!nx-Rm-)4<ySQi{q$)${0C%>z$S$mu$z)zuRPiB_k@Q`f)A_dWehveo68 z_doj|KF;t{pW^;|zHQ;U036$<b?X+EZ_-A;!}Et5*zTwc{S5Hlnjx)OWzG8v{|i2N z0(hvpj-D%wz{{4)l-AZx9AW?L%5%K;KYd~@@BkkE=TERx%Con(gW2gY?Duh;`Nt2` zR0@54os^~_6a_t3<e}yBgtUJb@bBj-YbJnoUHlO6!@===`Wf_W!3!3OLaI=pytc+k zpmSUov)iSc%W&5RJ~a1pimGzq10Q17IACa5n5Id)*~B<HqT6oc*s*=%hzLcYa_$^z zHai0G%}Zy)xBRoZE<Q3-muVO4x_BG#%faz_p?d7|6a_V#ML&CX;m9bZq~Gt;ZntUo zx-7rr(S@D|IQ6ziXqjz<sv=a?OPv7AvS=9won{kjI6a`Ms!HYDIYcUjP!!G-tDG-Z z!?*lqT^DyxD<iSxbzPM4LVF&(ROM1-bp)PJ6e{cM3kM9_w&}Fn42DCme=8;0>Y0Vg z07&KXIIiOX7t#quL8z)%Ppd`SFt7&612L&g2L0T*(eoGeGgPz1;Ia<<kGd{0NzYHC z&TrxmcIMR#4^-Dj9eaczzqGVasuHlSYnr&e`3prMlgT3IFu8FV95p~FkwJ$Dkp6&# z?KpH=En1C+mrTb<I-jS!wg!NrC_J#dj+Po>_D<mElk|uMu&#>_1K%4QKe+5C$sr~4 z)oR?MvEoXJX_^cy%WI&jdJR-n(wQuFfAKzj|LBlxCVOnc{x%F`7*NM`X*C*HR(xR1 zmdj|>s+Y^A(mb?$A?(+GysnFf;+{)l;J*%b&T2YEe+VjIpOQ|`J$hnW7M*q*TgnJC zf(9z76z10ETxEr&-#8?f*CtJP48-uh6oSst5rba*3)7aDy_X;aS|;cDdrt)L({ayC z09e<>hwukN6(P90e0t)Ix>C+e8yv@>YnpWX{fXzt8{NOPH9vB`^p6_kb6Ttk$AK4Q z4JZm`yN%gyGoAx0s!G9Up->d=uB@Vp5k%ix*Tq|B0*E(q3&4fqDYE{kN|=EH=r$U$ zAWA9enI`Q{2itKH8#H2zs$%W$A>GCL@q?oVnpPZ{?^N(&KpgaXbPQtx#JsMfro29V zCY9zw=~Qq@0RLtxfOTCw4m=8wQB*Dzmm|Q16|(w$jGY}iM@N|LHob0_POC-JFc=2D zZW=2>rlue;cWx~VU`{(u=0ym^Sn$Fi`t7lYL%Pjoq+FpWXv@d#K3_UTMo9&iKT_Al z+Y<pK#J+pVrz3-*LFEx93c+wVWYF)^@AoGd7xa;*u|p^d=}eZ+f_|{yI3yb~;Y9Fa z>L>IY4hHnQ(XoSExlAgX1tCbOD)&@QkML#87mfg|>*BkCcY~L<tmP|F_Koj{6->Bq zn(|>LW-?j23;IF3)gqP2M41<3%Jb-Gw%gdDq+1B#MP&b;GleDc>L{)Ga9tOpPI#Ds ze>2!w)yfQPJDGi<<2axa8<D`0OeRZrK@*leGx8D=>z(%ULT%_625!g?XN$gn_1nLy zRYv#%qb^<;zz+mF6;(q@nasX%Fc)QF;Q#z>I+LZly%>N>e=s}hE}*;Xx^$0@M#EY{ z2-2E1y7yGR6s~^MaaRE9y0{-W50F#SNZT3tztITGm?DY5&SGNFxX?MRSfaZ<zX=bF zBQmM<BzR%hGAHxG`_^zszjHiFoz=9_^-@+Nr;d7F@2=~jIs%Xo`%dLbbo+f$L82T3 zTB2`EVB)wd7;kv7ytGghHm<!)Hm^-2<*^_pF)u;yUMN4z_za9;p$a@63t%-<pg$a< z__@$D7AEaS01LAqfg#1RzEBV`u3jM*6M@G;8-X(p*!X^!C{i-;qq3UzS?*t7$wy|V zd<a0P>mmnyCqP<JQC<H}k-=M80Jv#yIpTB10!zM7WN@&*7=T(KF;$5LEryLr`@K$Q z#6mTl9-Xgb3*k9CkJojfD!^m-Lsr#nk#4x3IL@lzT->#3CZ6PbLXFNUDpoi0SF&UP zuU#P@N}`keTAT?_{rT;39fzThgPO^Vt_ej64|P?6M-<>q!I^w2LvJ`lN{Q>gfe97{ z`ynt-#Lh9ZD^-@}j>OGtFO$`Z@quDaJrdjFpYONZ9)Q7+oqtb09T^(DO957cql}`C zav?j&14BSfuxuQ}FwjYFK7lQz%F<kZP`WP7>sQGait%+#iL&9DV2Rm<f6lfnhW)-b zU>rK1RU>1d=OO^6#qki89Sjsq0V)>YX@JM=2Z5wgohzB{Zf)WW`Vj`sWunvcOK9Jq z)A537==vCd>$3rjlc16@WfB<~Qg*^O1`O1zb20Gf>Pw_ES<kd$%88Ax)AUJd7hn$t zqbM9)iDTeea1<K*N;cuK3Ps%Y8QWMBURtJk{pDED!eYGq5+%KwoSH16PpBPm3{r6H zx~@0(Fk-@~@RLy!RzgE#NkiYGisn!<(e%f+LXgSjX<eHGz^hl#Pp!^0&!m92=++*? zA+4rRj-fsVFr%bKkr#-jGjRYU$keMd8Y}nrXAZ0$y?hyc`E<Nab1-hY_90dMtsDHo zD^y12n1yE*IGz^bgp{`|i{WrM6R_!8B!eDTYNe#pd?k5ey>uM*|MctVE2|UNZbQqd zGS0v;87jaIz|gfPl<0K3@e{n~mC)SfiAyoJFP%O^<Avnu%f^)#u{!M$180?YC&V5O zkD2bv@OaAbo`UyXg(qrsfVvYJnUGV!2+P!~<7EW%nf+~bWsSoZzM1&=)>ocFD^*Bm zvhh02+RoB1tZK01x}IC{%dn!~tn5Ys6w%^)y<TLHF;e&(N{8>8+F1WrDC@MZTuyA% z&ey(zerk0z|9SL_DOV=wF|WQ6qJ$VYHer2lWWoTJbR%??QhF?0w9*;dFaW{6bX{;= zcx?lx-zQFXp7{!A@46Ua#Y9<)=yTlA_~V%Ez=`<8s0mxrA)SikIW!tG<{8exxY7CX z2FHMKdi5-uPyOLUHRjGXovjVd-E}F-zEC+6<<G0ncw6F{>2JpXjGFMku_gfQ^?H$D zGLQMhnP)6pr1V(l|D@}(vbN5~7d|)9fLl*L#p>A$WU{#tTSu%-Dtlf%X94YRZO4ga z;LQ<O_K?gNfB*;k`%yq*DoAR;L}Ofc^12U(bX`(viuO02ozP+DYhU5qJ@-ZKjjb!h z#zbAlftnL&(=_Q>ktuW66}+jt9e~3@cY=WcX19yk?ansKIe;8BGQ^<qbJdI%NoS<% z^6LNnEaxs<JZ4?^`S7_JFEPnyPHhjKB|5Il;qlD=9`KanPwW38fbBXsYP=sf*xNgP z8*y)Jnz@cOZk%}|Ryhv1E*CC-8#g}t=~3OAfA|IRLx*fO=iTc#6W}G5J<Y6VnR)29 zcX)`cxZ!!!e^fJMFG&3UcW|~b=u*h#CIIYoI+%V$j(uBkESr;gGJMW)JTv~{7wGNo z;0}j;?a3#&?}0}=;Czr}LOF>{T$G(5Fq`c*(sel+MrJU49=y-!g98bO{eFvw%In^& zsxjHx*x=s#?jxlrqY6c+av`H{O}Z{3DA+F}*dJ{}{b3mzReAH99^{XH@NdwwEsC8U zYi~WD$g~K{lT3V?g(U0;<sKX!QYsYKGIu8cQ~+v*+yR~iFHw{#C^7w4%d*(n+Dfi8 z;Vn-vG;Fr63%*H?v+#j4_wuIl3U7PIV-XWid@d%i%wrwnelL7(|KI@2wh<{2j=)!H zhP*KX(3er}a4_gl)U*iz0h)$Ev(bq9w*<cy=jbQE3;RFcM1$jOHpl7HXHgY3az1=t zTv>?$Cdprhf1&HmR*QyVpehQ6Wlpef9KhcTc6QAsr33&0Zf$Nd91Q06FR=k5#307b z2Ta2Ui-37!jKiJ6#5r|Jy02@R?Cg3bt5+)Q^;%&F{%5cg`BJH_i_ZZc1h`aQ#p(>b zk?9!87Yf{c>5?}YaoQY}n7;#uhvCQn5Z-PX+_-U>R@*>StDZAIY)~pyxcB1yRLV<{ zAQrZQku}5wmbuvKzX)qE;FVWj#c>=`s!FDk<Ek<0@jhKM<a>gH@ucr#0f09<2Rv9l z$6n(o7QkM&%WK!KbK%k@R3Tym%6Jfwq0wQ9A2_50A+T+W%U7PGzqZ1ozx->Qe&n5~ zem3Cr`|N$=Pk83ZC&*pD%v<h%m~<*VJ)ner?Y!0@C5~;gv9U3leY;et@IosxckyH4 zgNbkD>bm$0@L_<vN~g#S1ZG0#9zZJ=x$EM^<7p7n=BmUnFc|50=IdYP{-1i1`+x99 z66*rE{M*0I3qSL(c=x;B=e?8|CPo-Ig^A;gbZnc=jSaf~)Q(I#jjJi#Y##*Gf4OGJ z?+WV^9RT#?r}0R`M&}T{Qkoc042#+6aP!(V9NUgpGA`<d%mvrw<*R?rnZNaSW`YNB z{}22<&i}v<bLHjdW0UZC0!kbshr=PSzVgZlJOI5?Vl(<V?8nCSiTzr$u8U6se;r^= z(>bjcIUJiyJT7@n<L>+JJ7(e>%o9RjJ2qe4c!}?S=7r<G!OjrZaroq8Z|7ZW7fGq9 zN%Ktdg<~%>*qWUV8?U_<nKYlzW-&7^x4I($f4^qP_mArm$3XCAqq_h*ra?NJitQtZ zrDvL4zkJ#Id|(d89qb#;24~;<U2}s6pr|Tm-}9X`n~nIWJTDVn7o*YOrXMf@5kgQb z71-`hXI~<KHAB7t{9<tY!qFDXdL{1Ghzth<ZoKpoyPKQdXH{_x8A~~uts_o9{LVR{ zJC>EVJ%Z6}Or$_0<%eUw&~;sQx3{^qwZ*s<o~l;4(%KFW|NlnKkYA0{W7=zf0&mj! zV|~ZsdS{Qb#R|>N>={)1+uO98P1f(Zhg_lHMO#AMH7Q5?X0J=}{Ds+wjY(nsJZ8`I zd|y(O4FMN6-=<-(x4rHC)p1OgD-~{<`}B?%rFahbM@f1lnJ_g&+ITAv?Ex4=6GNI) z6YQ|`O_S>{zR3QqTi*A(G0CoUT}oPs!{?uytIV)8Ui@>)TJbpfp2EbDuWPrtarG*j zH*dy*S1uGdlqN@mQ6Omoe{I?VJ&6DU)C_qGZ*>kA;8w4Roq<9=KUX8Al<aP9a^<<_ z*xA^?>h~v1tCBCW_osg{S9xJM__JpzYo$pOj@cjddTiXd!7JCU(KF51^77d%b{4jx zQTOl8S^;h<fB-c^{sHha!SVIhF1bRMe9Vwnk~p@_{`NLko_mhX>(}XZI-~w<A*ZqT z$6sD(mVR$<m))nnL?Ndg4{-(kV}IYaERGHixOw#|S1(_tH6@Ekr&4HTjcdof4S=7o z8S*o;beVV22?cMk;c<YJP<YGIIl3*A{*14}lcZQKQ_^*`QVG-Uvvs<{U-|4G%=~~` zx-S3gBk$+T&Jio+YNT7|Iu0#=u%i<!|1?8#nG9N4<MPoK_VKzqPXXWUyRoUV$g(FI z-kLFwgV!~?SX#w3Ee6x4Kg<+GQ7|(ul@C77dw%wpD4abPdtY~Zi>LqPPvCy_8SY+L zXV~vE==B&31`K*VdfhH@f5%ReN~wgEcDZKkgd^@#z+bHya(d$H%c2YKq=DZi^i|W@ ze1!^mTHU$Vs!5bSHXTjj%|BA(^tV4s_04YqpmF6z_MZKJy!;!#N@b{!wwQ}uNg{+` zrCMdrYK{B6-vd5cGh}k#b-b)a74gmaKjSTT2Y{Z@xVNyvfze!O`H?u0NCr4qI9S4C zQ(7vdQOTkrZgUz@DwX2&sb#J;x5LpEy!EqwY|-^sPrQ0tT^COh`m#Nzrg_WKIm}Lv zc0#24R!dRSD3%Jmc(fVL^8h|xGh}Q}W0u_R@^}9jZxy$Z=U>xwRx@Q9Msp#5^m>Yx z&r>cH+3p>2s~Z`fvw?q7Gvt3gY1wyT0miojzeZ>QMnwqLwJHUfp<|lgG9a~F4!u%g zf6(H!_I_jnDezUGRx@Psbg(((PAvhd0zVFX92k9xl2%miDy>jfa<sZ#dQ-*~@1*3j zS*p5D(>8gfxi`MbuL1lE;1f0D_8Whv7ooj?x6;vH4xi7dX;!rgOX&j6(5Bh#-gdAF zix2`WmqW|tkgA|*ne6tO<9-g{zXLx}GvsbeF(<40P68N6T^HX6{46o6lxNixr*b7K zN}iNZv22^6Wihm@g-kt@PE*L|(Q-M4I2`m_9Q4}so!Ff88^BN24Eg&fZBvrGZVPey z%Y?oU_y>4jcuy>Ilu}fdvjy_$ELk;8TBs;eAY6%*pbGD!M@3PPNNg#wq=O}GhOV~| zccb6Ia%0)t0e%P1RKNbZG?Ld5z_8SHu?qYU-cs=Q&hw0N@}=Ovfw!vg@6-(0UR>M7 z<PH621U@VO0^aw@596&#IR6?_@v?z8tKwPU|I`dQIXCWglsEjpIgE=RcmgmV#`}6S s_-p9+&jnuL7_et+hMfOH<JUp{KRxI6Ww_boF8}}l07*qoM6N<$f?*ud8vp<R literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/images/errors/missing-anti-aliasing.png b/modules/graphartichow/artichow/images/errors/missing-anti-aliasing.png new file mode 100644 index 0000000000000000000000000000000000000000..f020d263f1dbf41bb183c10d7d6479564e4d89be GIT binary patch literal 7634 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 literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/images/errors/missing-gd2.png b/modules/graphartichow/artichow/images/errors/missing-gd2.png new file mode 100644 index 0000000000000000000000000000000000000000..cac144cb8089ab478ada868280b47df2591ea8c4 GIT binary patch literal 7448 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 A5&!@I literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/images/paperclip.png b/modules/graphartichow/artichow/images/paperclip.png new file mode 100644 index 0000000000000000000000000000000000000000..12188f90cd9e0b0f7213dc840b13aba94aee64e7 GIT binary patch literal 452 zcmV;#0XzPQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-Ud4HPm4tC5O%0004FNkl<Z7}J%Kze~eV5XZmwl2lEH zQfdd6wi)Uo4jHn>rQ+b=DmV$^AL8cZsDsYZKfu*h2dU6tX~0Dg6dEYBwd7ZGE)`>v zV*1_g-reWE_ueC9s9vuhX^qC7>v<JsRwPLpbUK}L*LA!2Pr9xj@3vZxk|gZ|Fo;Mm zm&=Dcruhk=kgS(e(`&WuzHQ&mX0tm0U}g-5!)GG81h4|YkJpPNKnOum6!AQ)04M<f zFL0c4KthP=bh>32h8_5R$UqUy_s9znM6}s#o>-Q3I&hpD0E%gvZ($IWvH+<Sh=`Oz zfd-EAI!^_%EKe4#kO=@li8O<GDL_)3+W~$7@gAnUfOflmMSvAQBOpRv05f;jRQ2P} z3lZf9%s*2Y2Q1|v29SQ@zHMI<QGg7PoQY))iD;df6#%Q_@%WvD7y$T6-Fa5OrfCP& uYW2+byp4!?QdHHamtOB;G#Wi5Yrg@;=Y1@~zUCSL0000<MNUMnLSTXiTe=7U literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/images/star.png b/modules/graphartichow/artichow/images/star.png new file mode 100644 index 0000000000000000000000000000000000000000..4acf0033092550107743197ff17016341f5e184e GIT binary patch literal 748 zcmV<I0u%j-P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-Ud4HPLNKBT2G0007uNkl<Z7}Jf@&1+*-7{~GNJ?FmV zCbvz}w6&dPY^CGN;0wsWEEJuUGSqR=L2)C_W>ByT1qTH;#pN)J|AHV$YjiQ4MZsFT zaU}y5Y!!=>q!=3eLeeH}ZgTIr_qgarr2)_GIsEu69)6EOpLg%h>qaW=`$EdNzO!@k z_Wbu}=FEP;`1$FSpOWtwIx4rD`^!LbR!;N-viYIn;85Xx*K@8vHZ|e*%bf|_y78hR zoPlf7&s|7moY#nhC;m6^#+6Clnz{5y%5!g;xnW^uv%?uTnp^z%ap%k(EX_YNIbF;a zv3()!42fYH(g|P2c8ZzY1j_2-xbdsw{?Y6YpUS^TVx&N$3AgI}Zh8)*ank+3N!d?X zg9Ra-0>bq3UT(m(Opu<9UC0&AT^zlg^i+`a4pHs6*KV+qcKF=1r23_Ma`=tw1)q7@ zk?G9%2+}HGx)G>{2z@|yA}##<*hJWB(B5w9_7SU5%vbpgb@|20LG<ic_?s6se@(^v zm!)%@cQYNs6uY3RpvuUkf;uVFs_aC^+iGpA!n<Ftv3aXRA_11yL;d7Pv_0+xEn7EU z5^gQ!SXB&F1yx0dRa*5u+Lf@pzspA-e$D#I=6{OxNs0KC=b{Z29ClDgc|uL14M1a% zU>F)H2u#85Mx{>^BTZTvamKbG?85N@NC{pZqzwoPj>TZ#Dr*=sO$J(f5bV=Un*1px z^oA)~Ib1EthnhlPz|c$*kaVil!WQ?BS}Ym@W2noUUYo0KLQ%j}U%(NhRhy+yv9P_z z>dajl0HrxLo-Xp8YcZ=L{&g4fpTi3mXbiY~yIJGGdkdU&I;a1op9r3Rls`P1A2({0 emwrBl0saQPHuzyOqY|+I0000<MNUMnLSTa9;${W_ literal 0 HcmV?d00001 diff --git a/modules/graphartichow/artichow/inc/Axis.class.php b/modules/graphartichow/artichow/inc/Axis.class.php new file mode 100644 index 000000000..4eb4ce7d4 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Axis.class.php @@ -0,0 +1,768 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Handle axis + * + * @package Artichow + */ +class awAxis { + + /** + * Axis line + * + * @var Line + */ + public $line; + + /** + * Axis labels + * + * @var Label + */ + public $label; + + /** + * Axis title + * + * @var Label + */ + public $title; + + /** + * Title position + * + * @var float + */ + protected $titlePosition = 0.5; + + /** + * Labels number + * + * @var int + */ + protected $labelNumber; + + /** + * Axis ticks + * + * @var array + */ + protected $ticks = array(); + + /** + * Axis and ticks color + * + * @var Color + */ + protected $color; + + /** + * Axis left and right padding + * + * @var Side + */ + protected $padding; + + /** + * Axis range + * + * @var array + */ + protected $range; + + /** + * Hide axis + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Auto-scaling mode + * + * @var bool + */ + protected $auto = TRUE; + + /** + * Axis range callback function + * + * @var array + */ + protected $rangeCallback = array( + 'toValue' => 'toProportionalValue', + 'toPosition' => 'toProportionalPosition' + ); + + /** + * Build the axis + * + * @param float $min Begin of the range of the axis + * @param float $max End of the range of the axis + */ + public function __construct($min = NULL, $max = NULL) { + + $this->line = new awVector( + new awPoint(0, 0), + new awPoint(0, 0) + ); + + $this->label = new awLabel; + $this->padding = new awSide; + + $this->title = new awLabel( + NULL, + NULL, + NULL, + 0 + ); + + $this->setColor(new awBlack); + + if($min !== NULL and $max !== NULL) { + $this->setRange($min, $max); + } + + } + + /** + * Enable/disable auto-scaling mode + * + * @param bool $auto + */ + public function auto($auto) { + $this->auto = (bool)$auto; + } + + /** + * Get auto-scaling mode status + * + * @return bool + */ + public function isAuto() { + return $this->auto; + } + + /** + * Hide axis + * + * @param bool $hide + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Show axis + * + * @param bool $show + */ + public function show($show = TRUE) { + $this->hide = !(bool)$show; + } + + /** + * Return a tick object from its name + * + * @param string $name Tick object name + * @return Tick + */ + public function tick($name) { + + return array_key_exists($name, $this->ticks) ? $this->ticks[$name] : NULL; + + } + + /** + * Add a tick object + * + * @param string $name Tick object name + * @param awTick $tick Tick object + */ + public function addTick($name, awTick $tick) { + + $this->ticks[$name] = $tick; + + } + + /** + * Delete a tick object + * + * @param string $name Tick object name + */ + public function deleteTick($name) { + if(array_key_exists($name, $this->ticks)) { + unset($this->ticks[$name]); + } + } + + /** + * Hide all ticks + * + * @param bool $hide Hide or not ? + */ + public function hideTicks($hide = TRUE) { + + foreach($this->ticks as $tick) { + $tick->hide($hide); + } + + } + + /** + * Change ticks style + * + * @param int $style Ticks style + */ + public function setTickStyle($style) { + + foreach($this->ticks as $tick) { + $tick->setStyle($style); + } + + } + + /** + * Change ticks interval + * + * @param int $interval Ticks interval + */ + public function setTickInterval($interval) { + + foreach($this->ticks as $tick) { + $tick->setInterval($interval); + } + + } + + /** + * Change number of ticks relative to others ticks + * + * @param awTick $to Change number of theses ticks + * @param awTick $from Ticks reference + * @param float $number Number of ticks by the reference + */ + public function setNumberByTick($to, $from, $number) { + $this->ticks[$to]->setNumberByTick($this->ticks[$from], $number); + } + + /** + * Reverse ticks style + */ + public function reverseTickStyle() { + + foreach($this->ticks as $tick) { + if($tick->getStyle() === awTick::IN) { + $tick->setStyle(awTick::OUT); + } else if($tick->getStyle() === awTick::OUT) { + $tick->setStyle(awTick::IN); + } + } + + } + + /** + * Change interval of labels + * + * @param int $interval Interval + */ + public function setLabelInterval($interval) { + $this->auto(FALSE); + $this->setTickInterval($interval); + $this->label->setInterval($interval); + } + + /** + * Change number of labels + * + * @param int $number Number of labels to display (can be NULL) + */ + public function setLabelNumber($number) { + $this->auto(FALSE); + $this->labelNumber = is_null($number) ? NULL : (int)$number; + } + + /** + * Get number of labels + * + * @return int + */ + public function getLabelNumber() { + return $this->labelNumber; + } + + /** + * Change precision of labels + * + * @param int $precision Precision + */ + public function setLabelPrecision($precision) { + $this->auto(FALSE); + $function = 'axis'.time().'_'.(microtime() * 1000000); + eval('function '.$function.'($value) { + return sprintf("%.'.(int)$precision.'f", $value); + }'); + $this->label->setCallbackFunction($function); + } + + /** + * Change text of labels + * + * @param array $texts Some texts + */ + public function setLabelText($texts) { + if(is_array($texts)) { + $this->auto(FALSE); + $function = 'axis'.time().'_'.(microtime() * 1000000); + eval('function '.$function.'($value) { + $texts = '.var_export($texts, TRUE).'; + return isset($texts[$value]) ? $texts[$value] : \'?\'; + }'); + $this->label->setCallbackFunction($function); + } + } + + /** + * Get the position of a point + * + * @param awAxis $xAxis X axis + * @param awAxis $yAxis Y axis + * @param awPoint $p Position of the point + * @return Point Position on the axis + */ + public static function toPosition(awAxis $xAxis, awAxis $yAxis, awPoint $p) { + + $p1 = $xAxis->getPointFromValue($p->x); + $p2 = $yAxis->getPointFromValue($p->y); + + return new awPoint( + round($p1->x), + round($p2->y) + ); + + } + + /** + * Change title alignment + * + * @param int $alignment New Alignment + */ + public function setTitleAlignment($alignment) { + + switch($alignment) { + + case awLabel::TOP : + $this->setTitlePosition(1); + $this->title->setAlign(NULL, awLabel::BOTTOM); + break; + + case awLabel::BOTTOM : + $this->setTitlePosition(0); + $this->title->setAlign(NULL, awLabel::TOP); + break; + + case awLabel::LEFT : + $this->setTitlePosition(0); + $this->title->setAlign(awLabel::LEFT); + break; + + case awLabel::RIGHT : + $this->setTitlePosition(1); + $this->title->setAlign(awLabel::RIGHT); + break; + + } + + } + + /** + * Change title position on the axis + * + * @param float $position A new awposition between 0 and 1 + */ + public function setTitlePosition($position) { + $this->titlePosition = (float)$position; + } + + /** + * Change axis and axis title color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->color = $color; + $this->title->setColor($color); + } + + /** + * Change axis padding + * + * @param int $left Left padding in pixels + * @param int $right Right padding in pixels + */ + public function setPadding($left, $right) { + $this->padding->set($left, $right); + } + + /** + * Get axis padding + * + * @return Side + */ + public function getPadding() { + return $this->padding; + } + + /** + * Change axis range + * + * @param float $min + * @param float $max + */ + public function setRange($min, $max) { + if($min !== NULL) { + $this->range[0] = (float)$min; + } + if($max !== NULL) { + $this->range[1] = (float)$max; + } + } + + /** + * Get axis range + * + * @return array + */ + public function getRange() { + return $this->range; + } + + /** + * Change axis range callback function + * + * @param string $toValue Transform a position between 0 and 1 to a value + * @param string $toPosition Transform a value to a position between 0 and 1 on the axis + */ + public function setRangeCallback($toValue, $toPosition) { + $this->rangeCallback = array( + 'toValue' => (string)$toValue, + 'toPosition' => (string)$toPosition + ); + } + + /** + * Center X values of the axis + * + * @param awAxis $axis An axis + * @param float $value The reference value on the axis + */ + public function setXCenter(awAxis $axis, $value) { + + // Check vector angle + if($this->line->isVertical() === FALSE) { + awImage::drawError("Class Axis: setXCenter() can only be used on vertical axes."); + } + + $p = $axis->getPointFromValue($value); + + $this->line->setX( + $p->x, + $p->x + ); + + } + + /** + * Center Y values of the axis + * + * @param awAxis $axis An axis + * @param float $value The reference value on the axis + */ + public function setYCenter(awAxis $axis, $value) { + + // Check vector angle + if($this->line->isHorizontal() === FALSE) { + awImage::drawError("Class Axis: setYCenter() can only be used on horizontal axes."); + } + + $p = $axis->getPointFromValue($value); + + $this->line->setY( + $p->y, + $p->y + ); + + } + + /** + * Get the distance between to values on the axis + * + * @param float $from The first value + * @param float $to The last value + * @return Point + */ + public function getDistance($from, $to) { + + $p1 = $this->getPointFromValue($from); + $p2 = $this->getPointFromValue($to); + + return $p1->getDistance($p2); + + } + + /** + * Get a point on the axis from a value + * + * @param float $value + * @return Point + */ + protected function getPointFromValue($value) { + + $callback = $this->rangeCallback['toPosition']; + + list($min, $max) = $this->range; + $position = $callback($value, $min, $max); + + return $this->getPointFromPosition($position); + + } + + /** + * Get a point on the axis from a position + * + * @param float $position A position between 0 and 1 + * @return Point + */ + protected function getPointFromPosition($position) { + + $vector = $this->getVector(); + + $angle = $vector->getAngle(); + $size = $vector->getSize(); + + return $vector->p1->move( + cos($angle) * $size * $position, + -1 * sin($angle) * $size * $position + ); + + } + + /** + * Draw axis + * + * @param awDriver $driver A driver + */ + public function draw(awDriver $driver) { + + if($this->hide) { + return; + } + + $vector = $this->getVector(); + + // Draw axis ticks + $this->drawTicks($driver, $vector); + + // Draw axis line + $this->line($driver); + + // Draw labels + $this->drawLabels($driver); + + // Draw axis title + $p = $this->getPointFromPosition($this->titlePosition); + $this->title->draw($driver, $p); + + } + + public function autoScale() { + + if($this->isAuto() === FALSE) { + return; + } + + list($min, $max) = $this->getRange(); + $interval = $max - $min; + + if($interval > 0) { + $partMax = $max / $interval; + $partMin = $min / $interval; + } else { + $partMax = 0; + $partMin = 0; + } + + $difference = log($interval) / log(10); + $difference = floor($difference); + + $pow = pow(10, $difference); + + if($pow > 0) { + $intervalNormalize = $interval / $pow; + } else { + $intervalNormalize = 0; + } + + if($difference <= 0) { + + $precision = $difference * -1 + 1; + + if($intervalNormalize > 2) { + $precision--; + } + + } else { + $precision = 0; + } + + if($min != 0 and $max != 0) { + $precision++; + } + + if($this->label->getCallbackFunction() === NULL) { + $this->setLabelPrecision($precision); + } + + if($intervalNormalize <= 1.5) { + $intervalReal = 1.5; + $labelNumber = 4; + } else if($intervalNormalize <= 2) { + $intervalReal = 2; + $labelNumber = 5; + } else if($intervalNormalize <= 3) { + $intervalReal = 3; + $labelNumber = 4; + } else if($intervalNormalize <= 4) { + $intervalReal = 4; + $labelNumber = 5; + } else if($intervalNormalize <= 5) { + $intervalReal = 5; + $labelNumber = 6; + } else if($intervalNormalize <= 8) { + $intervalReal = 8; + $labelNumber = 5; + } else if($intervalNormalize <= 10) { + $intervalReal = 10; + $labelNumber = 6; + } + + if($min == 0) { + + $this->setRange( + $min, + $intervalReal * $pow + ); + + } else if($max == 0) { + + $this->setRange( + $intervalReal * $pow * -1, + 0 + ); + + } + + $this->setLabelNumber($labelNumber); + + } + + protected function line(awDriver $driver) { + + $driver->line( + $this->color, + $this->line + ); + + } + + protected function drawTicks(awDriver $driver, awVector $vector) { + + foreach($this->ticks as $tick) { + $tick->setColor($this->color); + $tick->draw($driver, $vector); + } + + } + + protected function drawLabels($driver) { + + if($this->labelNumber !== NULL) { + list($min, $max) = $this->range; + $number = $this->labelNumber - 1; + if($number < 1) { + return; + } + $function = $this->rangeCallback['toValue']; + $labels = array(); + for($i = 0; $i <= $number; $i++) { + $labels[] = $function($i / $number, $min, $max); + } + $this->label->set($labels); + } + + $labels = $this->label->count(); + + for($i = 0; $i < $labels; $i++) { + + $p = $this->getPointFromValue($this->label->get($i)); + $this->label->draw($driver, $p, $i); + + } + + } + + protected function getVector() { + + $angle = $this->line->getAngle(); + + // Compute paddings + $vector = new awVector( + $this->line->p1->move( + cos($angle) * $this->padding->left, + -1 * sin($angle) * $this->padding->left + ), + $this->line->p2->move( + -1 * cos($angle) * $this->padding->right, + -1 * -1 * sin($angle) * $this->padding->right + ) + ); + + return $vector; + + } + + public function __clone() { + + $this->label = clone $this->label; + $this->line = clone $this->line; + $this->title = clone $this->title; + + foreach($this->ticks as $name => $tick) { + $this->ticks[$name] = clone $tick; + } + + } + +} + +registerClass('Axis'); + +function toProportionalValue($position, $min, $max) { + return $min + ($max - $min) * $position; +} + +function toProportionalPosition($value, $min, $max) { + if($max - $min == 0) { + return 0; + } + return ($value - $min) / ($max - $min); +} diff --git a/modules/graphartichow/artichow/inc/Border.class.php b/modules/graphartichow/artichow/inc/Border.class.php new file mode 100644 index 000000000..6e8fc41fc --- /dev/null +++ b/modules/graphartichow/artichow/inc/Border.class.php @@ -0,0 +1,197 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Draw border + * + * @package Artichow + */ +class awBorder { + + /** + * Border color + * + * @var Color + */ + protected $color; + + /** + * Hide border ? + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Border line style + * + * @var int + */ + protected $style; + + /** + * Build the border + * + * @param awColor $color Border color + * @param int $style Border style + */ + public function __construct($color = NULL, $style = awLine::SOLID) { + + $this->setStyle($style); + + if($color instanceof awColor) { + $this->setColor($color); + } else { + $this->setColor(new awBlack); + } + + } + + /** + * Change border color + * This method automatically shows the border if it is hidden + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->color = $color; + $this->show(); + } + + /** + * Change border style + * + * @param int $style + */ + public function setStyle($style) { + $this->style = (int)$style; + } + + /** + * Hide border ? + * + * @param bool $hide + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Show border ? + * + * @param bool $show + */ + public function show($show = TRUE) { + $this->hide = (bool)!$show; + } + + /** + * Is the border visible ? + * + * @return bool + */ + public function visible() { + return !$this->hide; + } + + /** + * Draw border as a rectangle + * + * @param awDriver $driver + * @param awPoint $p1 Top-left corner + * @param awPoint $p2 Bottom-right corner + */ + public function rectangle(awDriver $driver, awPoint $p1, awPoint $p2) { + + // Border is hidden + if($this->hide) { + return; + } + + $line = new awLine; + $line->setStyle($this->style); + $line->setLocation($p1, $p2); + + $driver->rectangle($this->color, $line); + + } + + /** + * Draw border as an ellipse + * + * @param awDriver $driver + * @param awPoint $center Ellipse center + * @param int $width Ellipse width + * @param int $height Ellipse height + */ + public function ellipse(awDriver $driver, awPoint $center, $width, $height) { + + // Border is hidden + if($this->hide) { + return; + } + + switch($this->style) { + + case awLine::SOLID : + $driver->ellipse($this->color, $center, $width, $height); + break; + + default : + awImage::drawError("Class Border: Dashed and dotted borders and not yet implemented on ellipses."); + break; + + } + + + } + + /** + * Draw border as a polygon + * + * @param awDriver $driver A Driver object + * @param awPolygon $polygon A Polygon object + */ + public function polygon(awDriver $driver, awPolygon $polygon) { + + // Border is hidden + if($this->hide) { + return; + } + + $polygon->setStyle($this->style); + $driver->polygon($this->color, $polygon); + + // In case of Line::SOLID, Driver::polygon() uses imagepolygon() + // which automatically closes the shape. In any other case, + // we have to do it manually here. + if($this->style !== Line::SOLID) { + $this->closePolygon($driver, $polygon); + } + } + + /** + * Draws the last line of a Polygon, between the first and last point + * + * @param awDriver $driver A Driver object + * @param awPolygon $polygon The polygon object to close + */ + private function closePolygon(awDriver $driver, awPolygon $polygon) { + $first = $polygon->get(0); + $last = $polygon->get($polygon->count() - 1); + + $line = new awLine($first, $last, $this->style, $polygon->getThickness()); + $driver->line($this->color, $line); + } + +} + +registerClass('Border'); diff --git a/modules/graphartichow/artichow/inc/Color.class.php b/modules/graphartichow/artichow/inc/Color.class.php new file mode 100644 index 000000000..40a7a93fb --- /dev/null +++ b/modules/graphartichow/artichow/inc/Color.class.php @@ -0,0 +1,165 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Create your colors + * + * @package Artichow + */ +class awColor { + + public $red; + public $green; + public $blue; + public $alpha; + + /** + * Build your color + * + * @var int $red Red intensity (from 0 to 255) + * @var int $green Green intensity (from 0 to 255) + * @var int $blue Blue intensity (from 0 to 255) + * @var int $alpha Alpha channel (from 0 to 100) + */ + public function __construct($red, $green, $blue, $alpha = 0) { + + $this->red = (int)$red; + $this->green = (int)$green; + $this->blue = (int)$blue; + $this->alpha = (int)round($alpha * 127 / 100); + + } + + /** + * Get RGB and alpha values of your color + * + * @return array + */ + public function getColor() { + return $this->rgba(); + } + + /** + * Change color brightness + * + * @param int $brightness Add this intensity to the color (betweeen -255 and +255) + */ + public function brightness($brightness) { + + $brightness = (int)$brightness; + + $this->red = min(255, max(0, $this->red + $brightness)); + $this->green = min(255, max(0, $this->green + $brightness)); + $this->blue = min(255, max(0, $this->blue + $brightness)); + + } + + /** + * Get RGB and alpha values of your color + * + * @return array + */ + public function rgba() { + + return array($this->red, $this->green, $this->blue, $this->alpha); + + } + +} + +registerClass('Color'); + +$colors = array( + 'Black' => array(0, 0, 0), + 'AlmostBlack' => array(48, 48, 48), + 'VeryDarkGray' => array(88, 88, 88), + 'DarkGray' => array(128, 128, 128), + 'MidGray' => array(160, 160, 160), + 'LightGray' => array(195, 195, 195), + 'VeryLightGray' => array(220, 220, 220), + 'White' => array(255, 255, 255), + 'VeryDarkRed' => array(64, 0, 0), + 'DarkRed' => array(128, 0, 0), + 'MidRed' => array(192, 0, 0), + 'Red' => array(255, 0, 0), + 'LightRed' => array(255, 192, 192), + 'VeryDarkGreen' => array(0, 64, 0), + 'DarkGreen' => array(0, 128, 0), + 'MidGreen' => array(0, 192, 0), + 'Green' => array(0, 255, 0), + 'LightGreen' => array(192, 255, 192), + 'VeryDarkBlue' => array(0, 0, 64), + 'DarkBlue' => array(0, 0, 128), + 'MidBlue' => array(0, 0, 192), + 'Blue' => array(0, 0, 255), + 'LightBlue' => array(192, 192, 255), + 'VeryDarkYellow' => array(64, 64, 0), + 'DarkYellow' => array(128, 128, 0), + 'MidYellow' => array(192, 192, 0), + 'Yellow' => array(255, 255, 2), + 'LightYellow' => array(255, 255, 192), + 'VeryDarkCyan' => array(0, 64, 64), + 'DarkCyan' => array(0, 128, 128), + 'MidCyan' => array(0, 192, 192), + 'Cyan' => array(0, 255, 255), + 'LightCyan' => array(192, 255, 255), + 'VeryDarkMagenta' => array(64, 0, 64), + 'DarkMagenta' => array(128, 0, 128), + 'MidMagenta' => array(192, 0, 192), + 'Magenta' => array(255, 0, 255), + 'LightMagenta' => array(255, 192, 255), + 'DarkOrange' => array(192, 88, 0), + 'Orange' => array(255, 128, 0), + 'LightOrange' => array(255, 168, 88), + 'VeryLightOrange' => array(255, 220, 168), + 'DarkPink' => array(192, 0, 88), + 'Pink' => array(255, 0, 128), + 'LightPink' => array(255, 88, 168), + 'VeryLightPink' => array(255, 168, 220), + 'DarkPurple' => array(88, 0, 192), + 'Purple' => array(128, 0, 255), + 'LightPurple' => array(168, 88, 255), + 'VeryLightPurple' => array(220, 168, 255), +); + + + +$php = ''; + +foreach($colors as $name => $color) { + + list($red, $green, $blue) = $color; + + $php .= ' + class aw'.$name.' extends awColor { + + public function __construct($alpha = 0) { + parent::__construct('.$red.', '.$green.', '.$blue.', $alpha); + } + + } + '; + + if(ARTICHOW_PREFIX !== 'aw') { + $php .= ' + class '.ARTICHOW_PREFIX.$name.' extends aw'.$name.' { + + } + '; + } + +} + +eval($php); + + + + diff --git a/modules/graphartichow/artichow/inc/Driver.class.php b/modules/graphartichow/artichow/inc/Driver.class.php new file mode 100644 index 000000000..345b01698 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Driver.class.php @@ -0,0 +1,724 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Draw your objects + * + * @package Artichow + */ +abstract class awDriver { + + /** + * Image width + * + * @var int + */ + public $imageWidth; + + /** + * Image height + * + * @var int + */ + public $imageHeight; + + /** + * Driver X position + * + * @var int + */ + public $x; + + /** + * Driver Y position + * + * @var int + */ + public $y; + + /** + * Use anti-aliasing ? + * + * @var bool + */ + protected $antiAliasing = FALSE; + + /** + * The FontDriver object that will be used to draw text + * with PHP fonts. + * + * @var awPHPFontDriver + */ + protected $phpFontDriver; + + /** + * The FontDriver object that will be used to draw text + * with TTF or FDB fonts. + * + * @var awFileFontDriver + */ + protected $fileFontDriver; + + /** + * A string representing the type of the driver + * + * @var string + */ + protected $driverString; + + private $w; + private $h; + + public function __construct() { + $this->phpFontDriver = new awPHPFontDriver(); + $this->fileFontDriver = new awFileFontDriver(); + } + + /** + * Initialize the driver for a particular awImage object + * + * @param awImage $image + */ + abstract public function init(awImage $image); + + /** + * Initialize the Driver for a particular FileImage object + * + * @param awFileImage $fileImage The FileImage object to work on + * @param string $file Image filename + */ + abstract public function initFromFile(awFileImage $fileImage, $file); + + /** + * Change the image size + * + * @param int $width Image width + * @param int $height Image height + */ + abstract public function setImageSize($width, $height); + + /** + * Inform the driver of the position of your image + * + * @param float $x Position on X axis of the center of the component + * @param float $y Position on Y axis of the center of the component + */ + abstract public function setPosition($x, $y); + + /** + * Inform the driver of the position of your image + * This method need absolutes values + * + * @param int $x Left-top corner X position + * @param int $y Left-top corner Y position + */ + abstract public function setAbsPosition($x, $y); + + /** + * Move the position of the image + * + * @param int $x Add this value to X axis + * @param int $y Add this value to Y axis + */ + abstract public function movePosition($x, $y); + + /** + * Inform the driver of the size of your image + * Height and width must be between 0 and 1. + * + * @param int $w Image width + * @param int $h Image height + * @return array Absolute width and height of the image + */ + abstract public function setSize($w, $h); + + /** + * Inform the driver of the size of your image + * You can set absolute size with this method. + * + * @param int $w Image width + * @param int $h Image height + */ + abstract public function setAbsSize($w, $h); + + /** + * Get the size of the component handled by the driver + * + * @return array Absolute width and height of the component + */ + abstract public function getSize(); + + /** + * Turn antialiasing on or off + * + * @var bool $bool + */ + abstract public function setAntiAliasing($bool); + + /** + * When passed a Color object, returns the corresponding + * color identifier (driver dependant). + * + * @param awColor $color A Color object + * @return int $rgb A color identifier representing the color composed of the given RGB components + */ + abstract public function getColor(awColor $color); + + /** + * Draw an image here + * + * @param awImage $image Image + * @param int $p1 Image top-left point + * @param int $p2 Image bottom-right point + */ + abstract public function copyImage(awImage $image, awPoint $p1, awPoint $p2); + + /** + * Draw an image here + * + * @param awImage $image Image + * @param int $d1 Destination top-left position + * @param int $d2 Destination bottom-right position + * @param int $s1 Source top-left position + * @param int $s2 Source bottom-right position + * @param bool $resample Resample image ? (default to TRUE) + */ + abstract public function copyResizeImage(awImage $image, awPoint $d1, awPoint $d2, awPoint $s1, awPoint $s2, $resample = TRUE); + + /** + * Draw a string + * + * @var awText $text Text to print + * @param awPoint $point Draw the text at this point + * @param int $width Text max width + */ + abstract public function string(awText $text, awPoint $point, $width = NULL); + + /** + * Draw a pixel + * + * @param awColor $color Pixel color + * @param awPoint $p + */ + abstract public function point(awColor $color, awPoint $p); + + /** + * Draw a colored line + * + * @param awColor $color Line color + * @param awLine $line + * @param int $thickness Line tickness + */ + abstract public function line(awColor $color, awLine $line); + + /** + * Draw a color arc + + * @param awColor $color Arc color + * @param awPoint $center Point center + * @param int $width Ellipse width + * @param int $height Ellipse height + * @param int $from Start angle + * @param int $to End angle + */ + abstract public function arc(awColor $color, awPoint $center, $width, $height, $from, $to); + + /** + * Draw an arc with a background color + * + * @param awColor $color Arc background color + * @param awPoint $center Point center + * @param int $width Ellipse width + * @param int $height Ellipse height + * @param int $from Start angle + * @param int $to End angle + */ + abstract public function filledArc(awColor $color, awPoint $center, $width, $height, $from, $to); + + /** + * Draw a colored ellipse + * + * @param awColor $color Ellipse color + * @param awPoint $center Ellipse center + * @param int $width Ellipse width + * @param int $height Ellipse height + */ + abstract public function ellipse(awColor $color, awPoint $center, $width, $height); + + /** + * Draw an ellipse with a background + * + * @param mixed $background Background (can be a color or a gradient) + * @param awPoint $center Ellipse center + * @param int $width Ellipse width + * @param int $height Ellipse height + */ + abstract public function filledEllipse($background, awPoint $center, $width, $height); + + /** + * Draw a colored rectangle + * + * @param awColor $color Rectangle color + * @param awLine $line Rectangle diagonale + * @param awPoint $p2 + */ + abstract public function rectangle(awColor $color, awLine $line); + + /** + * Draw a rectangle with a background + * + * @param mixed $background Background (can be a color or a gradient) + * @param awLine $line Rectangle diagonale + */ + abstract public function filledRectangle($background, awLine $line); + + /** + * Draw a polygon + * + * @param awColor $color Polygon color + * @param Polygon A polygon + */ + abstract public function polygon(awColor $color, awPolygon $polygon); + + /** + * Draw a polygon with a background + * + * @param mixed $background Background (can be a color or a gradient) + * @param Polygon A polygon + */ + abstract public function filledPolygon($background, awPolygon $polygon); + + /** + * Sends the image, as well as the correct HTTP headers, to the browser + * + * @param awImage $image The Image object to send + */ + abstract public function send(awImage $image); + + /** + * Get the image as binary data + * + * @param awImage $image + */ + abstract public function get(awImage $image); + + /** + * Return the width of some text + * + * @param awText $text + */ + abstract public function getTextWidth(awText $text); + + /** + * Return the height of some text + * + * @param awText $text + */ + abstract public function getTextHeight(awText $text); + + /** + * Return the string representing the type of driver + * + * @return string + */ + public function getDriverString() { + return $this->driverString; + } + + /** + * Returns whether or not the driver is compatible with the given font type + * + * @param awFont $font + * @return bool + */ + abstract protected function isCompatibleWithFont(awFont $font); + +// abstract private function drawImage(awImage $image, $return = FALSE, $header = TRUE); + +} + +registerClass('Driver', TRUE); + +/** + * Abstract class for font drivers. + * Those are used to do all the grunt work on fonts. + * + * @package Artichow + */ + +abstract class awFontDriver { + + public function __construct() { + + } + + /** + * Draw the actual text. + * + * @param awDriver $driver The Driver object to draw upon + * @param awText $text The Text object + * @param awPoint $point Where to draw the text + * @param float $width The width of the area containing the text + */ + abstract public function string(awDriver $driver, awText $text, awPoint $point, $width = NULL); + + /** + * Calculate the width of a given Text. + * + * @param awText $text The Text object + * @param awDriver $driver The awDriver object used to draw the graph + */ + abstract public function getTextWidth(awText $text, awDriver $driver); + + /** + * Calculate the height of a given Text. + * + * @param awText $text The Text object + * @param awDriver $driver The awDriver object used to draw the graph + */ + abstract public function getTextHeight(awText $text, awDriver $driver); + +} + +registerClass('FontDriver', TRUE); + +/** + * Class to handle calculations on PHPFont objects + * + * @package Artichow + */ +class awPHPFontDriver extends awFontDriver { + + public function __construct() { + parent::__construct(); + } + + public function string(awDriver $driver, awText $text, awPoint $point, $width = NULL) { + + switch ($driver->getDriverString()) { + case 'gd': + $this->gdString($driver, $text, $point, $width); + break; + + default: + awImage::drawError('Class PHPFontDriver: Incompatibility between driver and font - You should never see this error message: have you called awDriver::isCompatibleWithFont() properly?'); + break; + + } + } + + /** + * Draw a string onto a GDDriver object + * + * @param awGDDriver $driver The GDDriver to draw the text upon + * @param awText $text The awText object containing the string to draw + * @param awPoint $point Where to draw the text + * @param float $width The width of the text + */ + private function gdString(awGDDriver $driver, awText $text, awPoint $point, $width = NULL) { + + $angle = $text->getAngle(); + if($angle !== 90 and $angle !== 0) { + awImage::drawError("Class PHPFontDriver: You can only use 0° and 90° angles."); + } + + if($angle === 90) { + $function = 'imagestringup'; + $addAngle = $this->getGDTextHeight($text); + } else { + $function = 'imagestring'; + $addAngle = 0; + } + + $color = $text->getColor(); + $rgb = $driver->getColor($color); + + $textString = $text->getText(); + $textString = str_replace("\r", "", $textString); + + $textHeight = $this->getGDTextHeight($text); + + // Split text if needed + if($width !== NULL) { + + $characters = floor($width / ($this->getGDTextWidth($text) / strlen($textString))); + + if($characters > 0) { + $textString = wordwrap($textString, $characters, "\n", TRUE); + } + + } + + $font = $text->getFont(); + $lines = explode("\n", $textString); + + foreach($lines as $i => $line) { + + // Line position handling + if($angle === 90) { + $addX = $i * $textHeight; + $addY = 0; + } else { + $addX = 0; + $addY = $i * $textHeight; + } + + $function( + $driver->resource, + $font->font, + $driver->x + $point->x + $addX, + $driver->y + $point->y + $addY + $addAngle, + $line, + $rgb + ); + + } + } + + public function getTextWidth(awText $text, awDriver $driver) { + + switch ($driver->getDriverString()) { + case 'gd': + return $this->getGDTextWidth($text); + + default: + awImage::drawError('Class PHPFontDriver: Cannot get text width - incompatibility between driver and font'); + break; + } + + } + + public function getTextHeight(awText $text, awDriver $driver) { + + switch ($driver->getDriverString()) { + case 'gd': + return $this->getGDTextHeight($text); + + default: + awImage::drawError('Class PHPFontDriver: Cannot get text height - incompatibility between driver and font'); + break; + } + + } + + /** + * Return the width of a text for a GDDriver + * + * @param awText $text + * @return int $fontWidth + */ + private function getGDTextWidth(awText $text) { + $font = $text->getFont(); + + if($text->getAngle() === 90) { + $text->setAngle(45); + return $this->getGDTextHeight($text); + } else if($text->getAngle() === 45) { + $text->setAngle(90); + } + + $fontWidth = imagefontwidth($font->font); + + if($fontWidth === FALSE) { + awImage::drawError("Class PHPFontDriver: Unable to get font size."); + } + + return (int)$fontWidth * strlen($text->getText()); + } + + /** + * Return the height of a text for a GDDriver + * + * @param awText $text + * @return int $fontHeight + */ + private function getGDTextHeight(awText $text) { + $font = $text->getFont(); + + if($text->getAngle() === 90) { + $text->setAngle(45); + return $this->getGDTextWidth($text); + } else if($text->getAngle() === 45) { + $text->setAngle(90); + } + + $fontHeight = imagefontheight($font->font); + + if($fontHeight === FALSE) { + awImage::drawError("Class PHPFontDriver: Unable to get font size."); + } + + return (int)$fontHeight; + } +} + +registerClass('PHPFontDriver'); + +/** + * Class to handle calculations on FileFont objects + * + * @package Artichow + */ +class awFileFontDriver extends awFontDriver { + + public function __construct() { + parent::__construct(); + } + + public function string(awDriver $driver, awText $text, awPoint $point, $width = NULL) { + + switch ($driver->getDriverString()) { + case 'gd': + $this->gdString($driver, $text, $point, $width); + break; + + default: + awImage::drawError('Class fileFontDriver: Incompatibility between driver and font - You should never see this error message: have you called awDriver::isCompatibleWithFont() properly?'); + break; + } + } + + /** + * Draw an awFileFont object on a GD ressource + * + * @param awGDDriver $driver The awGDDriver object containing the ressource to draw upon + * @param awText $text The awText object containing the string to draw + * @param awPoint $point Where to draw the string from + * @param float $width The width of the area containing the text + */ + private function gdString(awGDDriver $driver, awText $text, awPoint $point, $width = NULL) { + // Make easier font positionment + $text->setText($text->getText()." "); + + $font = $text->getFont(); + if($font instanceof awTTFFont === FALSE and $font->getExtension() === NULL) { + $font->setExtension('ttf'); + } + + $filePath = $font->getName().'.'.$font->getExtension(); + + $box = imagettfbbox($font->getSize(), $text->getAngle(), $filePath, $text->getText()); + $textHeight = - $box[5]; + + $box = imagettfbbox($font->getSize(), 90, $filePath, $text->getText()); + $textWidth = abs($box[6] - $box[2]); + + // Restore old text + $text->setText(substr($text->getText(), 0, strlen($text->getText()) - 1)); + + $textString = $text->getText(); + + // Split text if needed + if($width !== NULL) { + + $characters = floor($width / $this->getGDAverageWidth($font)); + $textString = wordwrap($textString, $characters, "\n", TRUE); + + } + + $color = $text->getColor(); + $rgb = $driver->getColor($color); + + imagettftext( + $driver->resource, + $font->getSize(), + $text->getAngle(), + $driver->x + $point->x + $textWidth * sin($text->getAngle() / 180 * M_PI), + $driver->y + $point->y + $textHeight, + $rgb, + $filePath, + $textString + ); + } + + public function getTextWidth(awText $text, awDriver $driver) { + switch ($driver->getDriverString()) { + case 'gd': + return $this->getGDTextWidth($text); + + default: + awImage::drawError('Class FileFontDriver: Cannot get text width - incompatibility between driver and font'); + break; + } + } + + public function getTextHeight(awText $text, awDriver $driver) { + switch ($driver->getDriverString()) { + case 'gd': + return $this->getGDTextHeight($text); + + default: + awImage::drawError('Class FileFontDriver: Cannot get text height - incompatibility between driver and font'); + break; + } + } + + private function getGDTextWidth(awText $text) { + $font = $text->getFont(); + if($font->getExtension() === NULL) { + $font->setExtension('ttf'); + } + + $filePath = $font->getName().'.'.$font->getExtension(); + + $box = imagettfbbox($font->getSize(), $text->getAngle(), $filePath, $text->getText()); + + if($box === FALSE) { + awImage::drawError("Class FileFontDriver: Unable to get font width (GD)."); + } + + list(, , $x2, , , , $x1, ) = $box; + + return abs($x2 - $x1); + } + + private function getGDTextHeight(awText $text) { + $font = $text->getFont(); + if($font->getExtension() === NULL) { + $font->setExtension('ttf'); + } + + $filePath = $font->getName().'.'.$font->getExtension(); + + $box = imagettfbbox($font->getSize(), $text->getAngle(), $filePath, $text->getText()); + + if($box === FALSE) { + awImage::drawError("Class FileFontDriver: Unable to get font height (GD)."); + } + + list(, , , $y2, , , , $y1) = $box; + + return abs($y2 - $y1); + } + + private function getGDAverageWidth(awFileFont $font) { + + $text = "azertyuiopqsdfghjklmmmmmmmwxcvbbbn,;:!?."; + + $box = imagettfbbox($font->getSize(), 0, $font->getName().'.'.$font->getExtension(), $text); + + if($box === FALSE) { + awImage::drawError("Class FileFontDriver: Unable to get font average width."); + } + + list(, , $x2, $y2, , , $x1, $y1) = $box; + + return abs($x2 - $x1) / strlen($text); + + } + +} + +registerClass('FileFontDriver'); + +// Include ARTICHOW_DRIVER by default to preserve backward compatibility. +require_once dirname(__FILE__).'/drivers/'.ARTICHOW_DRIVER.'.class.php'; + diff --git a/modules/graphartichow/artichow/inc/Font.class.php b/modules/graphartichow/artichow/inc/Font.class.php new file mode 100644 index 000000000..79267bde4 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Font.class.php @@ -0,0 +1,262 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Common font characteristics and methods. + * Declared abstract only so that it can't be instanciated. + * Users have to call 'new awPHPFont' or 'new awFileFont', + * or any of their inherited classes (awFont1, awTuffy, awTTFFont, etc.) + * + * @package Artichow + */ +abstract class awFont { + + /** + * Build the font + * + */ + public function __construct() { + + } + + /** + * Draw a text + * + * @param awDriver $driver + * @param awPoint $p Draw text at this point + * @param awText $text The text + * @param int $width Text box width + */ + public function draw(awDriver $driver, awPoint $point, awText $text, $width = NULL) { + + $driver->string($this, $text, $point, $width); + + } + +} + +registerClass('Font', TRUE); + +/** + * Class for fonts that cannot be transformed, + * like the built-in PHP fonts for example. + * + * @package Artichow + */ +class awPHPFont extends awFont { + + /** + * The used font identifier + * + * @var int + */ + public $font; + + public function __construct($font = NULL) { + parent::__construct(); + + if($font !== NULL) { + $this->font = (int)$font; + } + } + +} + +registerClass('PHPFont'); + +/** + * Class for fonts that can be transformed (rotated, skewed, etc.), + * like TTF or FDB fonts for example. + * + * @package Artichow + */ +class awFileFont extends awFont { + + /** + * The name of the font, without the extension + * + * @var string + */ + protected $name; + + /** + * The size of the font + * + * @var int + */ + protected $size; + + /** + * The font filename extension + * + * @var string + */ + protected $extension; + + public function __construct($name, $size) { + parent::__construct(); + + $this->setName($name); + $this->setSize($size); + } + + /** + * Set the name of the font. The $name variable can contain the full path, + * or just the filename. Artichow will try to do The Right Thing, + * as well as set the extension property correctly if possible. + * + * @param string $name + */ + public function setName($name) { + $fontInfo = pathinfo((string)$name); + + if(strpos($fontInfo['dirname'], '/') !== 0) { + // Path is not absolute, use ARTICHOW_FONT + $name = ARTICHOW_FONT.DIRECTORY_SEPARATOR.$fontInfo['basename']; + $fontInfo = pathinfo($name); + } + + $this->name = $fontInfo['dirname'].DIRECTORY_SEPARATOR.$fontInfo['basename']; + + if(array_key_exists('extension', $fontInfo) and $fontInfo['extension'] !== '') { + $this->setExtension($fontInfo['extension']); + } + } + + /** + * Return the name of the font, i.e. the absolute path and the filename, without the extension. + * + * @return string + */ + public function getName() { + return $this->name; + } + + /** + * Set the size of the font, in pixels + * + * @param int $size + */ + public function setSize($size) { + $this->size = (int)$size; + } + + /** + * Return the size of the font, in pixels + * + * @return int + */ + public function getSize() { + return $this->size; + } + + /** + * Set the extension, without the dot + * + * @param string $extension + */ + public function setExtension($extension) { + $this->extension = (string)$extension; + } + + /** + * Get the filename extension for that font + * + * @return string + */ + public function getExtension() { + return $this->extension; + } + +} + +registerClass('FileFont'); + +/** + * Class representing TTF fonts + * + * @package Artichow + */ +class awTTFFont extends awFileFont { + + public function __construct($name, $size) { + parent::__construct($name, $size); + + if($this->getExtension() === NULL) { + $this->setExtension('ttf'); + } + } + +} + +registerClass('TTFFont'); + + + +$php = ''; + +for($i = 1; $i <= 5; $i++) { + + $php .= ' + class awFont'.$i.' extends awPHPFont { + + public function __construct() { + parent::__construct('.$i.'); + } + + } + '; + + if(ARTICHOW_PREFIX !== 'aw') { + $php .= ' + class '.ARTICHOW_PREFIX.'Font'.$i.' extends awFont'.$i.' { + } + '; + } + +} + +eval($php); + +$php = ''; + +foreach($fonts as $font) { + + $php .= ' + class aw'.$font.' extends awFileFont { + + public function __construct($size) { + parent::__construct(\''.$font.'\', $size); + } + + } + '; + + if(ARTICHOW_PREFIX !== 'aw') { + $php .= ' + class '.ARTICHOW_PREFIX.$font.' extends aw'.$font.' { + } + '; + } + +} + +eval($php); + + + +/* + * Environment modification for GD2 and TTF fonts + */ +if(function_exists('putenv')) { + putenv('GDFONTPATH='.ARTICHOW_FONT); +} + diff --git a/modules/graphartichow/artichow/inc/Gradient.class.php b/modules/graphartichow/artichow/inc/Gradient.class.php new file mode 100644 index 000000000..d9d95ed1d --- /dev/null +++ b/modules/graphartichow/artichow/inc/Gradient.class.php @@ -0,0 +1,135 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + + +require_once dirname(__FILE__)."/../Graph.class.php"; + + +/** + * Create your gradients + * + * @package Artichow + */ +abstract class awGradient { + + /** + * From color + * + * @var Color + */ + public $from; + + /** + * To color + * + * @var Color + */ + public $to; + + /** + * Build the gradient + * + * @param awColor $from From color + * @param awColor $to To color + */ + public function __construct(awColor $from, awColor $to) { + + $this->from = $from; + $this->to = $to; + + } + +} + +registerClass('Gradient', TRUE); + + +/** + * Create a linear gradient + * + * @package Artichow + */ +class awLinearGradient extends awGradient { + + /** + * Gradient angle + * + * @var int + */ + public $angle; + + /** + * Build the linear gradient + * + * @param awColor $from From color + * @param awColor $to To color + * @param int $angle Gradient angle + */ + public function __construct($from, $to, $angle) { + + parent::__construct( + $from, $to + ); + + $this->angle = (int)$angle; + + } + +} + +registerClass('LinearGradient'); + + +/** + * Create a bilinear gradient + * + * @package Artichow + */ +class awBilinearGradient extends awLinearGradient { + + /** + * Gradient center + * + * @var float Center between 0 and 1 + */ + public $center; + + /** + * Build the bilinear gradient + * + * @param awColor $from From color + * @param awColor $to To color + * @param int $angle Gradient angle + * @param int $center Gradient center + */ + public function __construct($from, $to, $angle, $center = 0.5) { + + parent::__construct( + $from, $to, $angle + ); + + $this->center = (float)$center; + + } + +} + +registerClass('BilinearGradient'); + +/** + * Create a radial gradient + * + * @package Artichow + */ +class awRadialGradient extends awGradient { + +} + +registerClass('RadialGradient'); + diff --git a/modules/graphartichow/artichow/inc/Grid.class.php b/modules/graphartichow/artichow/inc/Grid.class.php new file mode 100644 index 000000000..2b02a53ee --- /dev/null +++ b/modules/graphartichow/artichow/inc/Grid.class.php @@ -0,0 +1,290 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Grid + * + * @package Artichow + */ +class awGrid { + + /** + * Vertical lines of the grid + * + * @var array + */ + private $xgrid = array(); + + /** + * Horizontal lines of the grid + * + * @var array + */ + private $ygrid = array(); + + /** + * Is the component grid hidden ? + * + * @var bool + */ + private $hide = FALSE; + + /** + * Are horizontal lines hidden ? + * + * @var bool + */ + private $hideHorizontal = FALSE; + + /** + * Are vertical lines hidden ? + * + * @var bool + */ + private $hideVertical = FALSE; + + /** + * Grid color + * + * @var Color + */ + private $color; + + /** + * Grid space + * + * @var int + */ + private $space; + + /** + * Line type + * + * @var int + */ + private $type = awLine::SOLID; + + /** + * Grid interval + * + * @var int + */ + private $interval = array(1, 1); + + /** + * Grid background color + * + * @var Color + */ + private $background; + + /** + * Build the factory + */ + public function __construct() { + + // Set a grid default color + $this->color = new awColor(210, 210, 210); + $this->background = new awColor(255, 255, 255, 100); + + } + + /** + * Hide grid ? + * + * @param bool $hide + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Hide horizontal lines ? + * + * @param bool $hideHorizontal + */ + public function hideHorizontal($hide = TRUE) { + $this->hideHorizontal = (bool)$hide; + } + + /** + * Hide vertical lines ? + * + * @param bool $hideVertical + */ + public function hideVertical($hide = TRUE) { + $this->hideVertical = (bool)$hide; + } + + /** + * Change grid color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->color = $color; + } + + /** + * Remove grid background + */ + public function setNoBackground() { + $this->background = NULL; + } + + /** + * Change grid background color + * + * @param awColor $color + */ + public function setBackgroundColor(awColor $color) { + $this->background = $color; + } + + /** + * Change line type + * + * @param int $type + */ + public function setType($type) { + $this->type = (int)$type; + } + + /** + * Change grid interval + * + * @param int $hInterval + * @param int $vInterval + */ + public function setInterval($hInterval, $vInterval) { + $this->interval = array((int)$hInterval, (int)$vInterval); + } + + /** + * Set grid space + * + * @param int $left Left space in pixels + * @param int $right Right space in pixels + * @param int $top Top space in pixels + * @param int $bottom Bottom space in pixels + */ + public function setSpace($left, $right, $top, $bottom) { + $this->space = array((int)$left, (int)$right, (int)$top, (int)$bottom); + } + + /** + * Change the current grid + * + * @param array $xgrid Vertical lines + * @param array $ygrid Horizontal lines + */ + public function setGrid($xgrid, $ygrid) { + + if(empty($this->xgrid)) { + $this->xgrid = $xgrid; + } + if(empty($this->ygrid)) { + $this->ygrid = $ygrid; + } + + } + + /** + * Draw grids + * + * @param awDriver $driver A driver object + * @param int $x1 + * @param int $y1 + * @param int $x2 + * @param int $y2 + */ + public function draw(awDriver $driver, $x1, $y1, $x2, $y2) { + + if($this->background instanceof awColor) { + + // Draw background color + $driver->filledRectangle( + $this->background, + awLine::build($x1, $y1, $x2, $y2) + ); + + } + + if($this->hide === FALSE) { + + $this->drawGrid( + $driver, + $this->color, + $this->hideVertical ? array() : $this->xgrid, + $this->hideHorizontal ? array() : $this->ygrid, + $x1, $y1, $x2, $y2, + $this->type, + $this->space, + $this->interval[0], + $this->interval[1] + ); + + } + + } + + private function drawGrid( + awDriver $driver, awColor $color, + $nx, $ny, $x1, $y1, $x2, $y2, + $type, $space, $hInterval, $vInterval + ) { + + list($left, $right, $top, $bottom) = $space; + + $width = $x2 - $x1 - $left - $right; + $height = $y2 - $y1 - $top - $bottom; + + foreach($nx as $key => $n) { + + if(($key % $vInterval) === 0) { + + $pos = (int)round($x1 + $left + $n * $width); + $driver->line( + $color, + new awLine( + new awPoint($pos, $y1), + new awPoint($pos, $y2), + $type + ) + ); + + } + + } + + foreach($ny as $key => $n) { + + if(($key % $hInterval) === 0) { + + $pos = (int)round($y1 + $top + $n * $height); + $driver->line( + $color, + new awLine( + new awPoint($x1, $pos), + new awPoint($x2, $pos), + $type + ) + ); + + } + + } + + } + +} + +registerClass('Grid'); diff --git a/modules/graphartichow/artichow/inc/Label.class.php b/modules/graphartichow/artichow/inc/Label.class.php new file mode 100644 index 000000000..43bbae5af --- /dev/null +++ b/modules/graphartichow/artichow/inc/Label.class.php @@ -0,0 +1,587 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + + + +/** + * Draw labels + * + * @package Artichow + */ +class awLabel implements awPositionable { + + /** + * Label border + * + * @var int + */ + public $border; + + /** + * Label texts + * + * @var array + */ + protected $texts; + + /** + * Text font + * + * @var int + */ + protected $font; + + /** + * Text angle + * + * @var int + */ + protected $angle = 0; + + /** + * Text color + * + * @var Color + */ + protected $color; + + /** + * Text background + * + * @var Color, Gradient + */ + private $background; + + /** + * Callback function + * + * @var string + */ + private $function; + + /** + * Padding + * + * @var int + */ + private $padding; + + /** + * Move position from this vector + * + * @var Point + */ + protected $move; + + /** + * Label interval + * + * @var int + */ + protected $interval = 1; + + /** + * Horizontal align + * + * @var int + */ + protected $hAlign = awLabel::CENTER; + + /** + * Vertical align + * + * @var int + */ + protected $vAlign = awLabel::MIDDLE; + + /** + * Hide all labels ? + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Keys to hide + * + * @var array + */ + protected $hideKey = array(); + + /** + * Values to hide + * + * @var array + */ + protected $hideValue = array(); + + /** + * Hide first label + * + * @var bool + */ + protected $hideFirst = FALSE; + + /** + * Hide last label + * + * @var bool + */ + protected $hideLast = FALSE; + + /** + * Build the label + * + * @param string $label First label + */ + public function __construct($label = NULL, $font = NULL, $color = NULL, $angle = 0) { + + if(is_array($label)) { + $this->set($label); + } else if(is_string($label)) { + $this->set(array($label)); + } + + if($font === NULL) { + $font = new awFont2; + } + + $this->setFont($font); + $this->setAngle($angle); + + if($color instanceof awColor) { + $this->setColor($color); + } else { + $this->setColor(new awColor(0, 0, 0)); + } + + $this->move = new awPoint(0, 0); + + $this->border = new awBorder; + $this->border->hide(); + + } + + /** + * Get an element of the label from its key + * + * @param int $key Element key + * @return string A value + */ + public function get($key) { + return array_key_exists($key, $this->texts) ? $this->texts[$key] : NULL; + } + + /** + * Get all labels + * + * @return array + */ + public function all() { + return $this->texts; + } + + /** + * Set one or several labels + * + * @param array $labels Array of string or a string + */ + public function set($labels) { + + if(is_array($labels)) { + $this->texts = $labels; + } else { + $this->texts = array((string)$labels); + } + + } + + /** + * Count number of texts in the label + * + * @return int + */ + public function count() { + return is_array($this->texts) ? count($this->texts) : 0; + } + + /** + * Set a callback function for labels + * + * @param string $function + */ + public function setCallbackFunction($function) { + $this->function = is_null($function) ? $function : (string)$function; + } + + /** + * Return the callback function for labels + * + * @return string + */ + public function getCallbackFunction() { + return $this->function; + } + + /** + * Change labels format + * + * @param string $format New format (printf style: %.2f for example) + */ + public function setFormat($format) { + $function = 'label'.time().'_'.(microtime() * 1000000); + eval('function '.$function.'($value) { + return sprintf("'.addcslashes($format, '"').'", $value); + }'); + $this->setCallbackFunction($function); + } + + /** + * Change font for label + * + * @param awFont $font New font + * @param awColor $color Font color (can be NULL) + */ + public function setFont(awFont $font, $color = NULL) { + $this->font = $font; + if($color instanceof awColor) { + $this->setColor($color); + } + } + + /** + * Change font angle + * + * @param int $angle New angle + */ + public function setAngle($angle) { + $this->angle = (int)$angle; + } + + /** + * Change font color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->color = $color; + } + + /** + * Change text background + * + * @param mixed $background + */ + public function setBackground($background) { + $this->background = $background; + } + + /** + * Change text background color + * + * @param Color + */ + public function setBackgroundColor(awColor $color) { + $this->background = $color; + } + + /** + * Change text background gradient + * + * @param Gradient + */ + public function setBackgroundGradient(awGradient $gradient) { + $this->background = $gradient; + } + + /** + * Change padding + * + * @param int $left Left padding + * @param int $right Right padding + * @param int $top Top padding + * @param int $bottom Bottom padding + */ + public function setPadding($left, $right, $top, $bottom) { + $this->padding = array((int)$left, (int)$right, (int)$top, (int)$bottom); + } + + /** + * Hide all labels ? + * + * @param bool $hide + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Show all labels ? + * + * @param bool $show + */ + public function show($show = TRUE) { + $this->hide = (bool)!$show; + } + + /** + * Hide a key + * + * @param int $key The key to hide + */ + public function hideKey($key) { + $this->hideKey[$key] = TRUE; + } + + /** + * Hide a value + * + * @param int $value The value to hide + */ + public function hideValue($value) { + $this->hideValue[] = $value; + } + + /** + * Hide first label + * + * @param bool $hide + */ + public function hideFirst($hide) { + $this->hideFirst = (bool)$hide; + } + + /** + * Hide last label + * + * @param bool $hide + */ + public function hideLast($hide) { + $this->hideLast = (bool)$hide; + } + + /** + * Set label interval + * + * @param int + */ + public function setInterval($interval) { + + $this->interval = (int)$interval; + + } + + /** + * Change label position + * + * @param int $x Add this interval to X coord + * @param int $y Add this interval to Y coord + */ + public function move($x, $y) { + + $this->move = $this->move->move($x, $y); + + } + + /** + * Change alignment + * + * @param int $h Horizontal alignment + * @param int $v Vertical alignment + */ + public function setAlign($h = NULL, $v = NULL) { + if($h !== NULL) { + $this->hAlign = (int)$h; + } + if($v !== NULL) { + $this->vAlign = (int)$v; + } + } + + /** + * Get a text from the labele + * + * @param mixed $key Key in the array text + * @return Text + */ + public function getText($key) { + + if(is_array($this->texts) and array_key_exists($key, $this->texts)) { + + $value = $this->texts[$key]; + + if(is_string($this->function)) { + $value = call_user_func($this->function, $value); + } + + $text = new awText($value); + $text->setFont($this->font); + $text->setAngle($this->angle); + $text->setColor($this->color); + + if($this->background instanceof awColor) { + $text->setBackgroundColor($this->background); + } else if($this->background instanceof awGradient) { + $text->setBackgroundGradient($this->background); + } + + $text->border = $this->border; + + if($this->padding !== NULL) { + call_user_func_array(array($text, 'setPadding'), $this->padding); + } + + return $text; + + } else { + return NULL; + } + + } + + /** + * Get max width of all texts + * + * @param awDriver $driver A driver + * @return int + */ + public function getMaxWidth(awDriver $driver) { + + return $this->getMax($driver, 'getTextWidth'); + + } + + /** + * Get max height of all texts + * + * @param awDriver $driver A driver + * @return int + */ + public function getMaxHeight(awDriver $driver) { + + return $this->getMax($driver, 'getTextHeight'); + + } + + /** + * Draw the label + * + * @param awDriver $driver + * @param awPoint $p Label center + * @param int $key Text position in the array of texts (default to zero) + */ + public function draw(awDriver $driver, awPoint $p, $key = 0) { + + if(($key % $this->interval) !== 0) { + return; + } + + // Hide all labels + if($this->hide) { + return; + } + + // Key is hidden + if(array_key_exists($key, $this->hideKey)) { + return; + } + + // Hide first label + if($key === 0 and $this->hideFirst) { + return; + } + + // Hide last label + if($key === count($this->texts) - 1 and $this->hideLast) { + return; + } + + $text = $this->getText($key); + + if($text !== NULL) { + + // Value must be hidden + if(in_array($text->getText(), $this->hideValue)) { + return; + } + + $x = $p->x; + $y = $p->y; + + // Get padding + list($left, $right, $top, $bottom) = $text->getPadding(); + +// $font = $text->getFont(); + $width = $driver->getTextWidth($text); + $height = $driver->getTextHeight($text); + + switch($this->hAlign) { + + case awLabel::RIGHT : + $x -= ($width + $right); + break; + + case awLabel::CENTER : + $x -= ($width - $left + $right) / 2; + break; + + case awLabel::LEFT : + $x += $left; + break; + + } + + switch($this->vAlign) { + + case awLabel::TOP : + $y -= ($height + $bottom); + break; + + case awLabel::MIDDLE : + $y -= ($height - $top + $bottom) / 2; + break; + + case awLabel::BOTTOM : + $y += $top; + break; + + } + + $driver->string($text, $this->move->move($x, $y)); + + } + + } + + protected function getMax(awDriver $driver, $function) { + + $max = NULL; + + foreach($this->texts as $key => $text) { + + $text = $this->getText($key); + $font = $text->getFont(); + + if(is_null($max)) { + $max = $font->{$function}($text); + } else { + $max = max($max, $font->{$function}($text)); + } + + } + + return $max; + + } + +} + +registerClass('Label'); diff --git a/modules/graphartichow/artichow/inc/Legend.class.php b/modules/graphartichow/artichow/inc/Legend.class.php new file mode 100644 index 000000000..bbfd64a03 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Legend.class.php @@ -0,0 +1,709 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + + +/** + * Some legends + * + * @package Artichow + */ +class awLegend implements awPositionable { + + /** + * Legends added + * + * @var array + */ + protected $legends = array(); + + /** + * The current component + * + * @var Component + */ + protected $component; + + /** + * Background color or gradient + * + * @var Color, Gradient + */ + protected $background; + + /** + * Text color + * + * @var Color + */ + protected $textColor; + + /** + * Text font + * + * @var Font + */ + protected $textFont; + + /** + * Text margin + * + * @var Side + */ + protected $textMargin; + + /** + * Number of columns + * + * @var int + */ + protected $columns = NULL; + + /** + * Number of rows + * + * @var int + */ + protected $rows = NULL; + + /** + * Legend position + * + * @var Point + */ + protected $position; + + /** + * Hide legend ? + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Space between each legend + * + * @var int + */ + protected $space = 4; + + /** + * Horizontal alignment + * + * @var int + */ + protected $hAlign; + + /** + * Vertical alignment + * + * @var int + */ + protected $vAlign; + + /** + * Margin + * + * @var array Array for left, right, top and bottom margins + */ + private $margin; + + /** + * Legend shadow + * + * @var Shadow + */ + public $shadow; + + /** + * Legend border + * + * @var Border + */ + public $border; + + /** + * Line legend + * + * @var int + */ + const LINE = 1; + + /** + * Color/Gradient background legend + * + * @var int + */ + const BACKGROUND = 2; + + /** + * Use marks and line as legend + * + * @var int + */ + const MARK = 3; + + /** + * Use marks as legend + * + * @var int + */ + const MARKONLY = 4; + + /** + * Right side model + * + * @var int + */ + const MODEL_RIGHT = 1; + + /** + * Bottom side model + * + * @var int + */ + const MODEL_BOTTOM = 2; + + /** + * Build the legend + * + * @param int $model Legend model + */ + public function __construct($model = awLegend::MODEL_RIGHT) { + + $this->shadow = new awShadow(awShadow::LEFT_BOTTOM); + $this->border = new awBorder; + + $this->textMargin = new awSide(4); + $this->setModel($model); + + } + + /** + * Set a predefined model for the legend + * + * @param int $model + */ + public function setModel($model) { + + $this->setBackgroundColor(new awColor(255, 255, 255, 15)); + $this->setPadding(8, 8, 8, 8); + $this->setTextFont(new awFont2); + $this->shadow->setSize(3); + + switch($model) { + + case awLegend::MODEL_RIGHT : + + $this->setColumns(1); + $this->setAlign(awLegend::RIGHT, awLegend::MIDDLE); + $this->setPosition(0.96, 0.50); + + break; + + case awLegend::MODEL_BOTTOM : + + $this->setRows(1); + $this->setAlign(awLegend::CENTER, awLegend::TOP); + $this->setPosition(0.50, 0.92); + + break; + + default : + + $this->setPosition(0.5, 0.5); + + break; + + } + + } + + /** + * Hide legend ? + * + * @param bool $hide TRUE to hide legend, FALSE otherwise + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Show legend ? + * + * @param bool $show + */ + public function show($show = TRUE) { + $this->hide = (bool)!$show; + } + + + /** + * Add a Legendable object to the legend + * + * @param awLegendable $legendable + * @param string $title Legend title + * @param int $type Legend type (default to awLegend::LINE) + */ + public function add(awLegendable $legendable, $title, $type = awLegend::LINE) { + + $legend = array($legendable, $title, $type); + + $this->legends[] = $legend; + + } + + /** + * Change legend padding + * + * @param int $left + * @param int $right + * @param int $top + * @param int $bottom + */ + public function setPadding($left, $right, $top, $bottom) { + $this->padding = array((int)$left, (int)$right, (int)$top, (int)$bottom); + } + + /** + * Change space between each legend + * + * @param int $space + */ + public function setSpace($space) { + $this->space = (int)$space; + } + + /** + * Change alignment + * + * @param int $h Horizontal alignment + * @param int $v Vertical alignment + */ + public function setAlign($h = NULL, $v = NULL) { + if($h !== NULL) { + $this->hAlign = (int)$h; + } + if($v !== NULL) { + $this->vAlign = (int)$v; + } + } + + /** + * Change number of columns + * + * @param int $columns + */ + public function setColumns($columns) { + $this->rows = NULL; + $this->columns = (int)$columns; + } + + /** + * Change number of rows + * + * @param int $rows + */ + public function setRows($rows) { + $this->columns = NULL; + $this->rows = (int)$rows; + } + + /** + * Change legend position + * X and Y positions must be between 0 and 1. + * + * @param float $x + * @param float $y + */ + public function setPosition($x = NULL, $y = NULL) { + $x = (is_null($x) and !is_null($this->position)) ? $this->position->x : $x; + $y = (is_null($y) and !is_null($this->position)) ? $this->position->y : $y; + + $this->position = new awPoint($x, $y); + } + + /** + * Get legend position + * + * @return Point + */ + public function getPosition() { + return $this->position; + } + + /** + * Change text font + * + * @param awFont $font + */ + public function setTextFont(awFont $font) { + $this->textFont = $font; + } + + /** + * Change text margin + * + * @param int $left + * @param int $right + */ + public function setTextMargin($left, $right) { + $this->textMargin->set($left, $right); + } + + /** + * Change text color + * + * @param awColor $color + */ + public function setTextColor(awColor $color) { + $this->textColor = $color; + } + + /** + * Change background + * + * @param mixed $background + */ + public function setBackground($background) { + $this->background = $background; + } + + /** + * Change background color + * + * @param awColor $color + */ + public function setBackgroundColor(awColor $color) { + $this->background = $color; + } + + /** + * Change background gradient + * + * @param awGradient $gradient + */ + public function setBackgroundGradient(awGradient $gradient) { + $this->background = $gradient; + } + + /** + * Count the number of Legendable objects in the legend + * + * @return int + */ + public function count() { + return count($this->legends); + } + + public function draw(awDriver $driver) { + + if($this->hide) { + return; + } + + $count = $this->count(); + + // No legend to print + if($count === 0) { + return; + } + + // Get text widths and heights of each element of the legend + $widths = array(); + $heights = array(); + $texts = array(); + for($i = 0; $i < $count; $i++) { + list(, $title, ) = $this->legends[$i]; + $text = new awText( + $title, + $this->textFont, + $this->textColor, + 0 + ); +// $font = $text->getFont(); + $widths[$i] = $driver->getTextWidth($text) + $this->textMargin->left + $this->textMargin->right; + $heights[$i] = $driver->getTextHeight($text); + $texts[$i] = $text; + } + + // Maximum height of the font used + $heightMax = array_max($heights); + + // Get number of columns + if($this->columns !== NULL) { + $columns = $this->columns; + } else if($this->rows !== NULL) { + $columns = ceil($count / $this->rows); + } else { + $columns = $count; + } + + // Number of rows + $rows = (int)ceil($count / $columns); + + // Get maximum with of each column + $widthMax = array(); + for($i = 0; $i < $count; $i++) { + // Get column width + $column = $i % $columns; + if(array_key_exists($column, $widthMax) === FALSE) { + $widthMax[$column] = $widths[$i]; + } else { + $widthMax[$column] = max($widthMax[$column], $widths[$i]); + } + } + + $width = $this->padding[0] + $this->padding[1] - $this->space; + for($i = 0; $i < $columns; $i++) { + $width += $this->space + 5 + 10 + $widthMax[$i]; + } + + $height = ($heightMax + $this->space) * $rows - $this->space + $this->padding[2] + $this->padding[3]; + + // Look for legends position + list($x, $y) = $driver->getSize(); + + $p = new awPoint( + $this->position->x * $x, + $this->position->y * $y + ); + + switch($this->hAlign) { + + case awLegend::CENTER : + $p->x -= $width / 2; + break; + + case awLegend::RIGHT : + $p->x -= $width; + break; + + } + + switch($this->vAlign) { + + case awLegend::MIDDLE : + $p->y -= $height / 2; + break; + + case awLegend::BOTTOM : + $p->y -= $height; + break; + + } + + // Draw legend shadow + $this->shadow->draw( + $driver, + $p, + $p->move($width, $height), + awShadow::OUT + ); + + // Draw legends base + $this->drawBase($driver, $p, $width, $height); + + // Draw each legend + for($i = 0; $i < $count; $i++) { + + list($component, $title, $type) = $this->legends[$i]; + + $column = $i % $columns; + $row = (int)floor($i / $columns); + + // Get width of all previous columns + $previousColumns = 0; + for($j = 0; $j < $column; $j++) { + $previousColumns += $this->space + 10 + 5 + $widthMax[$j]; + } + + // Draw legend text + $driver->string( + $texts[$i], + $p->move( + $this->padding[0] + $previousColumns + 10 + 5 + $this->textMargin->left, + $this->padding[2] + $row * ($heightMax + $this->space) + $heightMax / 2 - $heights[$i] / 2 + ) + ); + + // Draw legend icon + switch($type) { + + case awLegend::LINE : + case awLegend::MARK : + case awLegend::MARKONLY : + + // Get vertical position + $x = $this->padding[0] + $previousColumns; + $y = $this->padding[2] + $row * ($heightMax + $this->space) + $heightMax / 2 - $component->getLegendLineThickness(); + + // Draw two lines + if($component->getLegendLineColor() !== NULL) { + + $color = $component->getLegendLineColor(); + + if($color instanceof awColor and $type !== awLegend::MARKONLY) { + + $driver->line( + $color, + new awLine( + $p->move( + $x, // YaPB ?? + $y + $component->getLegendLineThickness() / 2 + ), + $p->move( + $x + 10, + $y + $component->getLegendLineThickness() / 2 + ), + $component->getLegendLineStyle(), + $component->getLegendLineThickness() + ) + ); + + unset($color); + + } + + } + + if($type === awLegend::MARK or $type === awLegend::MARKONLY) { + + $mark = $component->getLegendMark(); + + if($mark !== NULL) { + $mark->draw( + $driver, + $p->move( + $x + 5.5, + $y + $component->getLegendLineThickness() / 2 + ) + ); + } + + unset($mark); + + } + + break; + + case awLegend::BACKGROUND : + + // Get vertical position + $x = $this->padding[0] + $previousColumns; + $y = $this->padding[2] + $row * ($heightMax + $this->space) + $heightMax / 2 - 5; + + $from = $p->move( + $x, + $y + ); + + $to = $p->move( + $x + 10, + $y + 10 + ); + + $background = $component->getLegendBackground(); + + if($background !== NULL) { + + $driver->filledRectangle( + $component->getLegendBackground(), + new awLine($from, $to) + ); + + // Draw rectangle border + $this->border->rectangle( + $driver, + $from->move(0, 0), + $to->move(0, 0) + ); + + } + + unset($background, $from, $to); + + break; + + } + + } + + } + + private function drawBase(awDriver $driver, awPoint $p, $width, $height) { + + $this->border->rectangle( + $driver, + $p, + $p->move($width, $height) + ); + + $size = $this->border->visible() ? 1 : 0; + + $driver->filledRectangle( + $this->background, + new awLine( + $p->move($size, $size), + $p->move($width - $size, $height - $size) + ) + ); + + } + +} + +registerClass('Legend'); + +/** + * You can add a legend to components which implements this interface + * + * @package Artichow + */ +interface awLegendable { + + /** + * Get the line type + * + * @return int + */ + public function getLegendLineStyle(); + + /** + * Get the line thickness + * + * @return int + */ + public function getLegendLineThickness(); + + /** + * Get the color of line + * + * @return Color + */ + public function getLegendLineColor(); + + /** + * Get the background color or gradient of an element of the component + * + * @return Color, Gradient + */ + public function getLegendBackground(); + + /** + * Get a Mark object + * + * @return Mark + */ + public function getLegendMark(); + +} + +registerInterface('Legendable'); diff --git a/modules/graphartichow/artichow/inc/Mark.class.php b/modules/graphartichow/artichow/inc/Mark.class.php new file mode 100644 index 000000000..d89437f24 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Mark.class.php @@ -0,0 +1,489 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + + +/** + * Draw marks + * + * @package Artichow + */ +class awMark { + + /** + * Circle mark + * + * @var int + */ + const CIRCLE = 1; + + /** + * Square mark + * + * @var int + */ + const SQUARE = 2; + + /** + * Triangle mark + * + * @var int + */ + const TRIANGLE = 3; + + /** + * Inverted triangle mark + * + * @var int + */ + const INVERTED_TRIANGLE = 4; + + /** + * Rhombus mark + * + * @var int + */ + const RHOMBUS = 5; + + /** + * Cross (X) mark + * + * @var int + */ + const CROSS = 6; + + /** + * Plus mark + * + * @var int + */ + const PLUS = 7; + + /** + * Image mark + * + * @var int + */ + const IMAGE = 8; + + /** + * Star mark + * + * @var int + */ + const STAR = 9; + + /** + * Paperclip mark + * + * @var int + */ + const PAPERCLIP = 10; + + /** + * Book mark + * + * @var int + */ + const BOOK = 11; + + /** + * Must marks be hidden ? + * + * @var bool + */ + protected $hide; + + /** + * Mark type + * + * @var int + */ + protected $type; + + /** + * Mark size + * + * @var int + */ + protected $size = 8; + + /** + * Fill mark + * + * @var Color, Gradient + */ + protected $fill; + + /** + * Mark image + * + * @var Image + */ + protected $image; + + /** + * To draw marks + * + * @var Driver + */ + protected $driver; + + /** + * Move position from this vector + * + * @var Point + */ + protected $move; + + /** + * Marks border + * + * @var Border + */ + public $border; + + /** + * Build the mark + */ + public function __construct() { + + $this->fill = new awColor(255, 0, 0, 0); + $this->border = new awBorder; + $this->border->hide(); + + $this->move = new awPoint(0, 0); + + } + + /** + * Change mark position + * + * @param int $x Add this interval to X coord + * @param int $y Add this interval to Y coord + */ + public function move($x, $y) { + + $this->move = $this->move->move($x, $y); + + } + + /** + * Hide marks ? + * + * @param bool $hide TRUE to hide marks, FALSE otherwise + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Show marks ? + * + * @param bool $show + */ + public function show($show = TRUE) { + $this->hide = (bool)!$show; + } + + /** + * Change mark type + * + * @param int $size Size in pixels + */ + public function setSize($size) { + $this->size = (int)$size; + } + + /** + * Change mark type + * + * @param int $type New mark type + * @param int $size Mark size (can be NULL) + */ + public function setType($type, $size = NULL) { + $this->type = (int)$type; + if($size !== NULL) { + $this->setSize($size); + } + } + + /** + * Fill the mark with a color or a gradient + * + * @param mixed $fill A color or a gradient + */ + public function setFill($fill) { + if($fill instanceof awColor or $fill instanceof awGradient) { + $this->fill = $fill; + } + } + + /** + * Set an image + * Only for awMark::IMAGE type. + * + * @param Image An image + */ + public function setImage(awImage $image) { + $this->image = $image; + } + + /** + * Draw the mark + * + * @param awDriver $driver + * @param awPoint $point Mark center + */ + public function draw(awDriver $driver, awPoint $point) { + + // Hide marks ? + if($this->hide) { + return; + } + + // Check if we can print marks + if($this->type !== NULL) { + + $this->driver = $driver; + $realPoint = $this->move->move($point->x, $point->y); + + switch($this->type) { + + case awMark::CIRCLE : + $this->drawCircle($realPoint); + break; + + case awMark::SQUARE : + $this->drawSquare($realPoint); + break; + + case awMark::TRIANGLE : + $this->drawTriangle($realPoint); + break; + + case awMark::INVERTED_TRIANGLE : + $this->drawTriangle($realPoint, TRUE); + break; + + case awMark::RHOMBUS : + $this->drawRhombus($realPoint); + break; + + case awMark::CROSS : + $this->drawCross($realPoint); + break; + + case awMark::PLUS : + $this->drawCross($realPoint, TRUE); + break; + + case awMark::IMAGE : + $this->drawImage($realPoint); + break; + + case awMark::STAR : + $this->changeType('star'); + $this->draw($driver, $point); + break; + + case awMark::PAPERCLIP : + $this->changeType('paperclip'); + $this->draw($driver, $point); + break; + + case awMark::BOOK : + $this->changeType('book'); + $this->draw($driver, $point); + break; + + } + + } + + } + + protected function changeType($image) { + $this->setType(awMARK::IMAGE); + $this->setImage(new awFileImage(ARTICHOW_IMAGE.DIRECTORY_SEPARATOR.$image.'.png')); + } + + protected function drawCircle(awPoint $point) { + + $this->driver->filledEllipse( + $this->fill, + $point, + $this->size, $this->size + ); + + $this->border->ellipse( + $this->driver, + $point, + $this->size, $this->size + ); + + } + + protected function drawSquare(awPoint $point) { + + list($x, $y) = $point->getLocation(); + + $x1 = (int)($x - $this->size / 2); + $x2 = $x1 + $this->size; + $y1 = (int)($y - $this->size / 2); + $y2 = $y1 + $this->size; + + $this->border->rectangle($this->driver, new awPoint($x1, $y1), new awPoint($x2, $y2)); + + $size = $this->border->visible() ? 1 : 0; + + $this->driver->filledRectangle( + $this->fill, + new awLine( + new awPoint($x1 + $size, $y1 + $size), + new awPoint($x2 - $size, $y2 - $size) + ) + ); + + } + + protected function drawTriangle(awPoint $point, $inverted = FALSE) { + + list($x, $y) = $point->getLocation(); + + $size = $this->size; + + $triangle = new awPolygon; + // Set default style and thickness + $triangle->setStyle(awPolygon::SOLID); + $triangle->setThickness(1); + + if($inverted === TRUE) { + // Bottom of the triangle + $triangle->append(new awPoint($x, $y + $size / sqrt(3))); + + // Upper left corner + $triangle->append(new awPoint($x - $size / 2, $y - $size / (2 * sqrt(3)))); + + // Upper right corner + $triangle->append(new awPoint($x + $size / 2, $y - $size / (2 * sqrt(3)))); + } else { + // Top of the triangle + $triangle->append(new awPoint($x, $y - $size / sqrt(3))); + + // Lower left corner + $triangle->append(new awPoint($x - $size / 2, $y + $size / (2 * sqrt(3)))); + + // Lower right corner + $triangle->append(new awPoint($x + $size / 2, $y + $size / (2 * sqrt(3)))); + } + + $this->driver->filledPolygon($this->fill, $triangle); + + if($this->border->visible()) { + $this->border->polygon($this->driver, $triangle); + } + } + + protected function drawRhombus(awPoint $point) { + + list($x, $y) = $point->getLocation(); + + $rhombus = new awPolygon; + // Set default style and thickness + $rhombus->setStyle(awPolygon::SOLID); + $rhombus->setThickness(1); + + // Top of the rhombus + $rhombus->append(new awPoint($x, $y - $this->size / 2)); + + // Right of the rhombus + $rhombus->append(new awPoint($x + $this->size / 2, $y)); + + // Bottom of the rhombus + $rhombus->append(new awPoint($x, $y + $this->size / 2)); + + // Left of the rhombus + $rhombus->append(new awPoint($x - $this->size / 2, $y)); + + $this->driver->filledPolygon($this->fill, $rhombus); + + if($this->border->visible()) { + $this->border->polygon($this->driver, $rhombus); + } + } + + protected function drawCross(awPoint $point, $upright = FALSE) { + + list($x, $y) = $point->getLocation(); + + if($upright === TRUE) { + $x11 = (int)($x); + $y11 = (int)($y - $this->size / 2); + $x12 = (int)($x); + $y12 = (int)($y + $this->size / 2); + + $y21 = (int)($y); + $y22 = (int)($y); + } else { + $x11 = (int)($x - $this->size / 2); + $y11 = (int)($y + $this->size / 2); + $x12 = (int)($x + $this->size / 2); + $y12 = (int)($y - $this->size / 2); + + $y21 = (int)($y - $this->size / 2); + $y22 = (int)($y + $this->size / 2); + } + + $x21 = (int)($x - $this->size / 2); + $x22 = (int)($x + $this->size / 2); + + $this->driver->line( + $this->fill, + new awLine( + new awPoint($x11, $y11), + new awPoint($x12, $y12) + ) + ); + + $this->driver->line( + $this->fill, + new awLine( + new awPoint($x21, $y21), + new awPoint($x22, $y22) + ) + ); + } + + protected function drawImage(awPoint $point) { + + if($this->image instanceof awImage) { + + $width = $this->image->width; + $height = $this->image->height; + + list($x, $y) = $point->getLocation(); + + $x1 = (int)($x - $width / 2); + $x2 = $x1 + $width; + $y1 = (int)($y - $width / 2); + $y2 = $y1 + $height; + + $this->border->rectangle($this->driver, new awPoint($x1 - 1, $y1 - 1), new awPoint($x2 + 1, $y2 + 1)); + + $this->driver->copyImage($this->image, new awPoint($x1, $y1), new awPoint($x2, $y2)); + + } + + } + +} + +registerClass('Mark'); diff --git a/modules/graphartichow/artichow/inc/Math.class.php b/modules/graphartichow/artichow/inc/Math.class.php new file mode 100644 index 000000000..0f1334b00 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Math.class.php @@ -0,0 +1,831 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +abstract class awShape { + + /** + * Is the shape hidden ? + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Shape style + * + * @var int + */ + public $style; + + /** + * Shape thickness + * + * @var int + */ + public $thickness; + + /** + * Solid shape + * + * @var int + */ + const SOLID = 1; + + /** + * Dotted shape + * + * @var int + */ + const DOTTED = 2; + + /** + * Dashed shape + * + * @var int + */ + const DASHED = 3; + + /** + * Change shape style + * + * @param int $style Line style + */ + public function setStyle($style) { + $this->style = (int)$style; + } + + /** + * Return shape style + * + * @return int + */ + public function getStyle() { + return $this->style; + } + + /** + * Change shape thickness + * + * @param int $thickness Shape thickness in pixels + */ + public function setThickness($thickness) { + $this->thickness = (int)$thickness; + } + + /** + * Return shape thickness + * + * @return int + */ + public function getThickness() { + return $this->thickness; + } + + /** + * Hide the shape + * + * @param bool $hide + */ + public function hide($hide) { + $this->hide = (bool)$hide; + } + + /** + * Show the shape + * + * @param bool $shape + */ + public function show($shape) { + $this->hide = (bool)!$shape; + } + + /** + * Is the line hidden ? + * + * @return bool + */ + public function isHidden() { + return $this->hide; + } + +} + +registerClass('Shape', TRUE); + +/** + * Describe a point + * + * @package Artichow + */ +class awPoint extends awShape { + + /** + * X coord + * + * @var float + */ + public $x; + + /** + * Y coord + * + * @var float + */ + public $y; + + /** + * Build a new awpoint + * + * @param float $x + * @param float $y + */ + public function __construct($x, $y) { + + $this->setLocation($x, $y); + + } + + /** + * Change X value + * + * @param float $x + */ + public function setX($x) { + $this->x = (float)$x; + } + + /** + * Change Y value + * + * @param float $y + */ + public function setY($y) { + $this->y = (float)$y; + } + + /** + * Change point location + * + * @param float $x + * @param float $y + */ + public function setLocation($x, $y) { + $this->setX($x); + $this->setY($y); + } + + /** + * Get point location + * + * @param array Point location + */ + public function getLocation() { + return array($this->x, $this->y); + } + + /** + * Get distance to another point + * + * @param awPoint $p A point + * @return float + */ + public function getDistance(awPoint $p) { + + return sqrt(pow($p->x - $this->x, 2) + pow($p->y - $this->y, 2)); + + } + + /** + * Move the point to another location + * + * @param Point A Point with the new awlocation + */ + public function move($x, $y) { + + return new awPoint( + $this->x + $x, + $this->y + $y + ); + + } + +} + +registerClass('Point'); + + +/** + * Describe a line + * + * @package Artichow + */ +class awLine extends awShape { + + /** + * Line first point + * + * @param Point + */ + public $p1; + + /** + * Line second point + * + * @param Point + */ + public $p2; + + /** + * The line slope (the m in y = mx + p) + * + * @param float + */ + private $slope; + + /** + * The y-intercept value of the line (the p in y = mx + p) + * + * @param float + */ + private $origin; + + /** + * Build a new awline + * + * @param awPoint $p1 First point + * @param awPoint $p2 Second point + * @param int $type Style of line (default to solid) + * @param int $thickness Line thickness (default to 1) + */ + public function __construct($p1 = NULL, $p2 = NULL, $type = awLine::SOLID, $thickness = 1) { + + $this->setLocation($p1, $p2); + $this->setStyle($type); + $this->setThickness($thickness); + + } + + /** + * Build a line from 4 coords + * + * @param int $x1 Left position + * @param int $y1 Top position + * @param int $x2 Right position + * @param int $y2 Bottom position + */ + public static function build($x1, $y1, $x2, $y2) { + + return new awLine( + new awPoint($x1, $y1), + new awPoint($x2, $y2) + ); + + } + + /** + * Change X values of the line + * + * @param int $x1 Begin value + * @param int $x2 End value + */ + public function setX($x1, $x2) { + $this->p1->setX($x1); + $this->p2->setX($x2); + + // Resets slope and origin values so they are + // recalculated when and if needed. + $this->slope = NULL; + $this->origin = NULL; + } + + /** + * Change Y values of the line + * + * @param int $y1 Begin value + * @param int $y2 End value + */ + public function setY($y1, $y2) { + $this->p1->setY($y1); + $this->p2->setY($y2); + + // Resets slope and origin values so they are + // recalculated when and if needed. + $this->slope = NULL; + $this->origin = NULL; + } + + /** + * Change line location + * + * @param awPoint $p1 First point + * @param awPoint $p2 Second point + */ + public function setLocation($p1, $p2) { + if(is_null($p1) or $p1 instanceof awPoint) { + $this->p1 = $p1; + } + if(is_null($p2) or $p2 instanceof awPoint) { + $this->p2 = $p2; + } + + // Resets slope and origin values so they are + // recalculated when and if needed. + $this->slope = NULL; + $this->origin = NULL; + } + + /** + * Get line location + * + * @param array Line location + */ + public function getLocation() { + return array($this->p1, $this->p2); + } + + /** + * Get the line size + * + * @return float + */ + public function getSize() { + + $square = pow($this->p2->x - $this->p1->x, 2) + pow($this->p2->y - $this->p1->y, 2); + return sqrt($square); + + } + + /** + * Calculate the line slope + * + */ + private function calculateSlope() { + if($this->isHorizontal()) { + $this->slope = 0; + } else { + $slope = ($this->p1->y - $this->p2->y) / ($this->p1->x - $this->p2->x); + + $this->slope = $slope; + } + } + + /** + * Calculate the y-intercept value of the line + * + */ + private function calculateOrigin() { + if($this->isHorizontal()) { + $this->origin = $this->p1->y; // Or p2->y + } else { + $y1 = $this->p1->y; + $y2 = $this->p2->y; + $x1 = $this->p1->x; + $x2 = $this->p2->x; + + $origin = ($y2 * $x1 - $y1 * $x2) / ($x1 - $x2); + + $this->origin = $origin; + } + } + + /** + * Calculate the slope and y-intercept value of the line + * + */ + private function calculateEquation() { + $this->calculateSlope(); + $this->calculateOrigin(); + } + + /** + * Get the line slope value + * + * @return float + */ + public function getSlope() { + if($this->isVertical()) { + return NULL; + } elseif($this->slope !== NULL) { + return $this->slope; + } else { + $this->calculateSlope(); + return $this->slope; + } + } + + /** + * Get the line y-intercept value + * + * @return float + */ + public function getOrigin() { + if($this->isVertical()) { + return NULL; + } elseif($this->origin !== NULL) { + return $this->origin; + } else { + $this->calculateOrigin(); + return $this->origin; + } + } + + /** + * Get the line equation + * + * @return array An array containing the slope and y-intercept value of the line + */ + public function getEquation() { + $slope = $this->getSlope(); + $origin = $this->getOrigin(); + + return array($slope, $origin); + } + + /** + * Return the x coordinate of a point on the line + * given its y coordinate. + * + * @param float $y The y coordinate of the Point + * @return float $x The corresponding x coordinate + */ + public function getXFrom($y) { + $x = NULL; + + if($this->isVertical()) { + list($p, ) = $this->getLocation(); + $x = $p->x; + } else { + list($slope, $origin) = $this->getEquation(); + + if($slope !== 0) { + $y = (float)$y; + $x = ($y - $origin) / $slope; + } + } + + return $x; + } + + /** + * Return the y coordinate of a point on the line + * given its x coordinate. + * + * @param float $x The x coordinate of the Point + * @return float $y The corresponding y coordinate + */ + public function getYFrom($x) { + $y = NULL; + + if($this->isHorizontal()) { + list($p, ) = $this->getLocation(); + $y = $p->y; + } else { + list($slope, $origin) = $this->getEquation(); + + if($slope !== NULL) { + $x = (float)$x; + $y = $slope * $x + $origin; + } + } + + return $y; + } + + /** + * Test if the line can be considered as a point + * + * @return bool + */ + public function isPoint() { + return ($this->p1->x === $this->p2->x and $this->p1->y === $this->p2->y); + } + + /** + * Test if the line is a vertical line + * + * @return bool + */ + public function isVertical() { + return ($this->p1->x === $this->p2->x); + } + + /** + * Test if the line is an horizontal line + * + * @return bool + */ + public function isHorizontal() { + return ($this->p1->y === $this->p2->y); + } + + /** + * Returns TRUE if the line is going all the way from the top + * to the bottom of the polygon surrounding box. + * + * @param $polygon Polygon A Polygon object + * @return bool + */ + public function isTopToBottom(awPolygon $polygon) { + list($xMin, $xMax) = $polygon->getBoxXRange(); + list($yMin, $yMax) = $polygon->getBoxYRange(); + + if($this->isHorizontal()) { + return FALSE; + } else { + if($this->p1->y < $this->p2->y) { + $top = $this->p1; + $bottom = $this->p2; + } else { + $top = $this->p2; + $bottom = $this->p1; + } + + return ( + $this->isOnBoxTopSide($top, $xMin, $xMax, $yMin) + and + $this->isOnBoxBottomSide($bottom, $xMin, $xMax, $yMax) + ); + } + } + + /** + * Returns TRUE if the line is going all the way from the left side + * to the right side of the polygon surrounding box. + * + * @param $polygon Polygon A Polygon object + * @return bool + */ + public function isLeftToRight(awPolygon $polygon) { + list($xMin, $xMax) = $polygon->getBoxXRange(); + list($yMin, $yMax) = $polygon->getBoxYRange(); + + if($this->isVertical()) { + return FALSE; + } else { + if($this->p1->x < $this->p2->x) { + $left = $this->p1; + $right = $this->p2; + } else { + $left = $this->p2; + $right = $this->p1; + } + } + + return ( + $this->isOnBoxLeftSide($left, $yMin, $yMax, $xMin) + and + $this->isOnBoxRightSide($right, $yMin, $yMax, $xMax) + ); + } + + private function isOnBoxTopSide(awPoint $point, $xMin, $xMax, $yMin) { + if( + $point->y === $yMin + and + $point->x >= $xMin + and + $point->x <= $xMax + ) { + return TRUE; + } else { + return FALSE; + } + } + + private function isOnBoxBottomSide(awPoint $point, $xMin, $xMax, $yMax) { + if( + $point->y === $yMax + and + $point->x >= $xMin + and + $point->x <= $xMax + ) { + return TRUE; + } else { + return FALSE; + } + } + + private function isOnBoxLeftSide(awPoint $point, $yMin, $yMax, $xMin) { + if( + $point->x === $xMin + and + $point->y >= $yMin + and + $point->y <= $yMax + ) { + return TRUE; + } else { + return FALSE; + } + } + + private function isOnBoxRightSide(awPoint $point, $yMin, $yMax, $xMax) { + if( + $point->x === $xMax + and + $point->y >= $yMin + and + $point->y <= $yMax + ) { + return TRUE; + } else { + return FALSE; + } + } + +} + +registerClass('Line'); + +/** + * A vector is a type of line + * The sense of the vector goes from $p1 to $p2. + * + * @package Artichow + */ +class awVector extends awLine { + + /** + * Get vector angle in radians + * + * @return float + */ + public function getAngle() { + + if($this->isPoint()) { + return 0.0; + } + + $size = $this->getSize(); + + $width = ($this->p2->x - $this->p1->x); + $height = ($this->p2->y - $this->p1->y) * -1; + + if($width >= 0 and $height >= 0) { + return acos($width / $size); + } else if($width <= 0 and $height >= 0) { + return acos($width / $size); + } else { + $height *= -1; + if($width >= 0 and $height >= 0) { + return 2 * M_PI - acos($width / $size); + } else if($width <= 0 and $height >= 0) { + return 2 * M_PI - acos($width / $size); + } + } + + } + +} + +registerClass('Vector'); + + +/** + * Describe a polygon + * + * @package Artichow + */ +class awPolygon extends awShape { + + /** + * Polygon points + * + * @var array + */ + protected $points = array(); + + /** + * Set a point in the polygon + * + * @param int $pos Point position + * @param awPoint $point + */ + public function set($pos, $point) { + if(is_null($point) or $point instanceof awPoint) { + $this->points[$pos] = $point; + } + } + + /** + * Add a point at the end of the polygon + * + * @param awPoint $point + */ + public function append($point) { + if(is_null($point) or $point instanceof awPoint) { + $this->points[] = $point; + } + } + + /** + * Get a point at a position in the polygon + * + * @param int $pos Point position + * @return Point + */ + public function get($pos) { + return $this->points[$pos]; + } + + /** + * Count number of points in the polygon + * + * @return int + */ + public function count() { + return count($this->points); + } + + /** + * Returns all points in the polygon + * + * @return array + */ + public function all() { + return $this->points; + } + + /** + * Returns the different lines formed by the polygon vertices + * + * @return array + */ + public function getLines() { + $lines = array(); + $count = $this->count(); + + for($i = 0; $i < $count - 1; $i++) { + $lines[] = new Line($this->get($i), $this->get($i + 1)); + } + + // "Close" the polygon + $lines[] = new Line($this->get($count - 1), $this->get(0)); + + return $lines; + } + + /** + * Get the upper-left and lower-right points + * of the bounding box around the polygon + * + * @return array An array of two Point objects + */ + public function getBoxPoints() { + $count = $this->count(); + $x = $y = array(); + + for($i = 0; $i < $count; $i++) { + $point = $this->get($i); + + list($x[], $y[]) = $point->getLocation(); + } + + $upperLeft = new Point(min($x), min($y)); + $lowerRight = new Point(max($x), max($y)); + + return array($upperLeft, $lowerRight); + } + + /** + * Return the range of the polygon on the y axis, + * i.e. the minimum and maximum y value of any point in the polygon + * + * @return array + */ + public function getBoxYRange() { + list($p1, $p2) = $this->getBoxPoints(); + + list(, $yMin) = $p1->getLocation(); + list(, $yMax) = $p2->getLocation(); + + return array($yMin, $yMax); + } + + /** + * Return the range of the polygon on the x axis, + * i.e. the minimum and maximum x value of any point in the polygon + * + * @return array + */ + public function getBoxXRange() { + list($p1, $p2) = $this->getBoxPoints(); + + list($xMin, ) = $p1->getLocation(); + list($xMax, ) = $p2->getLocation(); + + return array($xMin, $xMax); + } + +} + +registerClass('Polygon'); diff --git a/modules/graphartichow/artichow/inc/Shadow.class.php b/modules/graphartichow/artichow/inc/Shadow.class.php new file mode 100644 index 000000000..1d528db5c --- /dev/null +++ b/modules/graphartichow/artichow/inc/Shadow.class.php @@ -0,0 +1,405 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + + +/** + * Draw shadows + * + */ +class awShadow { + + /** + * Shadow on left and top sides + * + * @var int + */ + const LEFT_TOP = 1; + + /** + * Shadow on left and bottom sides + * + * @var int + */ + const LEFT_BOTTOM = 2; + + + /** + * Shadow on right and top sides + * + * @var int + */ + const RIGHT_TOP = 3; + + /** + * Shadow on right and bottom sides + * + * @var int + */ + const RIGHT_BOTTOM = 4; + + /** + * In mode + * + * @var int + */ + const IN = 1; + + /** + * Out mode + * + * @var int + */ + const OUT = 2; + + /** + * Shadow size + * + * @var int + */ + private $size = 0; + + /** + * Hide shadow ? + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Shadow color + * + * @var Color + */ + private $color; + + /** + * Shadow position + * + * @var int + */ + private $position; + + /** + * Smooth shadow ? + * + * @var bool + */ + private $smooth = FALSE; + + /** + * Shadow constructor + * + * @param int $position Shadow position + */ + public function __construct($position) { + $this->setPosition($position); + } + + /** + * Hide shadow ? + * + * @param bool $hide + */ + public function hide($hide = TRUE) { + $this->hide = (bool)$hide; + } + + /** + * Show shadow ? + * + * @param bool $show + */ + public function show($show = TRUE) { + $this->hide = (bool)!$show; + } + + /** + * Change shadow size + * + * @param int $size + * @param bool $smooth Smooth the shadow (facultative argument) + */ + public function setSize($size, $smooth = NULL) { + $this->size = (int)$size; + if($smooth !== NULL) { + $this->smooth($smooth); + } + } + + /** + * Change shadow color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->color = $color; + } + + /** + * Change shadow position + * + * @param int $position + */ + public function setPosition($position) { + $this->position = (int)$position; + } + + /** + * Smooth shadow ? + * + * @param bool $smooth + */ + public function smooth($smooth) { + $this->smooth = (bool)$smooth; + } + + /** + * Get the space taken by the shadow + * + * @return Side + */ + public function getSpace() { + + return new awSide( + ($this->position === awShadow::LEFT_TOP or $this->position === awShadow::LEFT_BOTTOM) ? $this->size : 0, + ($this->position === awShadow::RIGHT_TOP or $this->position === awShadow::RIGHT_BOTTOM) ? $this->size : 0, + ($this->position === awShadow::LEFT_TOP or $this->position === awShadow::RIGHT_TOP) ? $this->size : 0, + ($this->position === awShadow::LEFT_BOTTOM or $this->position === awShadow::RIGHT_BOTTOM) ? $this->size : 0 + ); + + } + + /** + * Draw shadow + * + * @param awDriver $driver + * @param awPoint $p1 Top-left point + * @param awPoint $p2 Right-bottom point + * @param int Drawing mode + */ + public function draw(awDriver $driver, awPoint $p1, awPoint $p2, $mode) { + + if($this->hide) { + return; + } + + if($this->size <= 0) { + return; + } + + $driver = clone $driver; + + $color = ($this->color instanceof awColor) ? $this->color : new awColor(125, 125, 125); + + switch($this->position) { + + case awShadow::RIGHT_BOTTOM : + + if($mode === awShadow::OUT) { + $t1 = $p1->move(0, 0); + $t2 = $p2->move($this->size + 1, $this->size + 1); + } else { // PHP 4 compatibility + $t1 = $p1->move(0, 0); + $t2 = $p2->move(0, 0); + } + + $width = $t2->x - $t1->x; + $height = $t2->y - $t1->y; + + $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint($width - $this->size, $this->size), + new awPoint($width - 1, $height - 1) + ) + ); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint($this->size, $height - $this->size), + new awPoint($width - $this->size - 1, $height - 1) + ) + ); + + $this->smoothPast($driver, $color, $width, $height); + + break; + + case awShadow::LEFT_TOP : + + if($mode === awShadow::OUT) { + $t1 = $p1->move(- $this->size, - $this->size); + $t2 = $p2->move(0, 0); + } else { // PHP 4 compatibility + $t1 = $p1->move(0, 0); + $t2 = $p2->move(0, 0); + } + + $width = $t2->x - $t1->x; + $height = $t2->y - $t1->y; + + $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y); + + $height = max($height + 1, $this->size); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint(0, 0), + new awPoint($this->size - 1, $height - $this->size - 1) + ) + ); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint($this->size, 0), + new awPoint($width - $this->size - 1, $this->size - 1) + ) + ); + + $this->smoothPast($driver, $color, $width, $height); + + break; + + case awShadow::RIGHT_TOP : + + if($mode === awShadow::OUT) { + $t1 = $p1->move(0, - $this->size); + $t2 = $p2->move($this->size + 1, 0); + } else { // PHP 4 compatibility + $t1 = $p1->move(0, 0); + $t2 = $p2->move(0, 0); + } + + $width = $t2->x - $t1->x; + $height = $t2->y - $t1->y; + + $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y); + + $height = max($height + 1, $this->size); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint($width - $this->size, 0), + new awPoint($width - 1, $height - $this->size - 1) + ) + ); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint($this->size, 0), + new awPoint($width - $this->size - 1, $this->size - 1) + ) + ); + + $this->smoothFuture($driver, $color, $width, $height); + + break; + + case awShadow::LEFT_BOTTOM : + + if($mode === awShadow::OUT) { + $t1 = $p1->move(- $this->size, 0); + $t2 = $p2->move(0, $this->size + 1); + } else { // PHP 4 compatibility + $t1 = $p1->move(0, 0); + $t2 = $p2->move(0, 0); + } + + $width = $t2->x - $t1->x; + $height = $t2->y - $t1->y; + + $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint(0, $this->size), + new awPoint($this->size - 1, $height - 1) + ) + ); + + $driver->filledRectangle( + $color, + new awLine( + new awPoint($this->size, $height - $this->size), + new awPoint($width - $this->size - 1, $height - 1) + ) + ); + + $this->smoothFuture($driver, $color, $width, $height); + + break; + + } + + } + + private function smoothPast(awDriver $driver, awColor $color, $width, $height) { + + if($this->smooth) { + + for($i = 0; $i < $this->size; $i++) { + for($j = 0; $j <= $i; $j++) { + $driver->point( + $color, + new awPoint($i, $j + $height - $this->size) + ); + } + } + + for($i = 0; $i < $this->size; $i++) { + for($j = 0; $j <= $i; $j++) { + $driver->point( + $color, + new awPoint($width - $this->size + $j, $i) + ); + } + } + + } + + } + + private function smoothFuture(awDriver $driver, awColor $color, $width, $height) { + + if($this->smooth) { + + for($i = 0; $i < $this->size; $i++) { + for($j = 0; $j <= $i; $j++) { + $driver->point( + $color, + new awPoint($i, $this->size - $j - 1) + ); + } + } + + for($i = 0; $i < $this->size; $i++) { + for($j = 0; $j <= $i; $j++) { + $driver->point( + $color, + new awPoint($width - $this->size + $j, $height - $i - 1) + ); + } + } + + } + } + +} + +registerClass('Shadow'); diff --git a/modules/graphartichow/artichow/inc/Text.class.php b/modules/graphartichow/artichow/inc/Text.class.php new file mode 100644 index 000000000..663444425 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Text.class.php @@ -0,0 +1,233 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * To handle text + * + * @package Artichow + */ +class awText { + + /** + * Your text + * + * @var string + */ + private $text; + + /** + * Text font + * + * @var Font + */ + private $font; + + /** + * Text angle + * Can be 0 or 90 + * + * @var int + */ + private $angle; + + /** + * Text color + * + * @var Color + */ + private $color; + + /** + * Text background + * + * @var Color, Gradient + */ + private $background; + + /** + * Padding + * + * @var array Array for left, right, top and bottom paddings + */ + private $padding; + + /** + * Text border + * + * @var Border + */ + public $border; + + /** + * Build a new awtext + * + * @param string $text Your text + */ + public function __construct($text, $font = NULL, $color = NULL, $angle = 0) { + + if(is_null($font)) { + $font = new awFont2; + } + + $this->setText($text); + $this->setFont($font); + + // Set default color to black + if($color === NULL) { + $color = new awColor(0, 0, 0); + } + + $this->setColor($color); + $this->setAngle($angle); + + $this->border = new awBorder; + $this->border->hide(); + + } + + /** + * Get text + * + * @return string + */ + public function getText() { + return $this->text; + } + + /** + * Change text + * + * @param string $text New text + */ + public function setText($text) { + $this->text = (string)$text; + $this->text = str_replace("\r", "", $text); + } + + /** + * Change text font + * + * @param Font + */ + public function setFont(awFont $font) { + $this->font = $font; + } + + /** + * Get text font + * + * @return int + */ + public function getFont() { + return $this->font; + } + + /** + * Change text angle + * + * @param int + */ + public function setAngle($angle) { + $this->angle = (int)$angle; + } + + /** + * Get text angle + * + * @return int + */ + public function getAngle() { + return $this->angle; + } + + /** + * Change text color + * + * @param Color + */ + public function setColor(awColor $color) { + $this->color = $color; + } + + /** + * Get text color + * + * @return Color + */ + public function getColor() { + return $this->color; + } + + /** + * Change text background + * + * @param mixed $background + */ + public function setBackground($background) { + if($background instanceof awColor) { + $this->setBackgroundColor($background); + } elseif($background instanceof awGradient) { + $this->setBackgroundGradient($background); + } + } + + /** + * Change text background color + * + * @param awColor $color + */ + public function setBackgroundColor(awColor $color) { + $this->background = $color; + } + + /** + * Change text background gradient + * + * @param awGradient $gradient + */ + public function setBackgroundGradient(awGradient $gradient) { + $this->background = $gradient; + } + + /** + * Get text background + * + * @return Color, Gradient + */ + public function getBackground() { + return $this->background; + } + + /** + * Change padding + * + * @param int $left Left padding + * @param int $right Right padding + * @param int $top Top padding + * @param int $bottom Bottom padding + */ + public function setPadding($left, $right, $top, $bottom) { + $this->padding = array((int)$left, (int)$right, (int)$top, (int)$bottom); + } + + /** + * Get current padding + * + * @return array + */ + public function getPadding() { + return $this->padding; + } + +} + +registerClass('Text'); + diff --git a/modules/graphartichow/artichow/inc/Tick.class.php b/modules/graphartichow/artichow/inc/Tick.class.php new file mode 100644 index 000000000..4bfc46b80 --- /dev/null +++ b/modules/graphartichow/artichow/inc/Tick.class.php @@ -0,0 +1,343 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + + +/** + * Handle ticks + * + * @package Artichow + */ +class awTick { + + /** + * Ticks style + * + * @var int + */ + protected $style = awTick::IN; + + /** + * Ticks size + * + * @var int + */ + protected $size; + + /** + * Ticks color + * + * @var Color + */ + protected $color; + + /** + * Ticks number + * + * @var int + */ + protected $number; + + /** + * Ticks number by other tick + * + * @var array + */ + protected $numberByTick; + + /** + * Ticks interval + * + * @var int + */ + protected $interval = 1; + + /** + * Hide ticks + * + * @var bool + */ + protected $hide = FALSE; + + /** + * Hide first tick + * + * @var bool + */ + protected $hideFirst = FALSE; + + /** + * Hide last tick + * + * @var bool + */ + protected $hideLast = FALSE; + + /** + * In mode + * + * @param int + */ + const IN = 0; + + /** + * Out mode + * + * @param int + */ + const OUT = 1; + + /** + * In and out mode + * + * @param int + */ + const IN_OUT = 2; + + /** + * Build the ticks + * + * @param int $number Number of ticks + * @param int $size Ticks size + */ + public function __construct($number, $size) { + + $this->setSize($size); + $this->setNumber($number); + $this->setColor(new awBlack); + $this->style = awTick::IN; + + } + + /** + * Change ticks style + * + * @param int $style + */ + public function setStyle($style) { + $this->style = (int)$style; + } + + /** + * Get ticks style + * + * @return int + */ + public function getStyle() { + return $this->style; + } + + /** + * Change ticks color + * + * @param awColor $color + */ + public function setColor(awColor $color) { + $this->color = $color; + } + + /** + * Change ticks size + * + * @param int $size + */ + public function setSize($size) { + $this->size = (int)$size; + } + + /** + * Change interval of ticks + * + * @param int $interval + */ + public function setInterval($interval) { + $this->interval = (int)$interval; + } + + /** + * Get interval between each tick + * + * @return int + */ + public function getInterval() { + return $this->interval; + } + + /** + * Change number of ticks + * + * @param int $number + */ + public function setNumber($number) { + $this->number = (int)$number; + } + + /** + * Get number of ticks + * + * @return int + */ + public function getNumber() { + return $this->number; + } + + /** + * Change number of ticks relative to others ticks + * + * @param awTick $tick Ticks reference + * @param int $number Number of ticks + */ + public function setNumberByTick(awTick $tick, $number) { + + $this->numberByTick = array($tick, (int)$number); + + } + + /** + * Hide ticks + * + * @param bool $hide + */ + public function hide($hide) { + $this->hide = (bool)$hide; + } + + /** + * Hide first tick + * + * @param bool $hide + */ + public function hideFirst($hide) { + $this->hideFirst = (bool)$hide; + } + + /** + * Hide last tick + * + * @param bool $hide + */ + public function hideLast($hide) { + $this->hideLast = (bool)$hide; + } + + /** + * Draw ticks on a vector + * + * @param awDriver $driver A driver + * @param awVector $vector A vector + */ + public function draw(awDriver $driver, awVector $vector) { + + if($this->numberByTick !== NULL) { + list($tick, $number) = $this->numberByTick; + $this->number = 1 + ($tick->getNumber() - 1) * ($number + 1); + $this->interval = $tick->getInterval(); + } + + if($this->number < 2 or $this->hide) { + return; + } + + $angle = $vector->getAngle(); + // echo "INIT:".$angle."<br>"; + switch($this->style) { + + case awTick::IN : + $this->drawTicks($driver, $vector, NULL, $angle + M_PI / 2); + break; + + case awTick::OUT : + $this->drawTicks($driver, $vector, $angle + 3 * M_PI / 2, NULL); + break; + + default : + $this->drawTicks($driver, $vector, $angle + M_PI / 2, $angle + 3 * M_PI / 2); + break; + + } + + } + + protected function drawTicks(awDriver $driver, awVector $vector, $from, $to) { + + // Draw last tick + if($this->hideLast === FALSE) { + + //echo '<b>'; + if(($this->number - 1) % $this->interval === 0) { + $this->drawTick($driver, $vector->p2, $from, $to); + } + //echo '</b>'; + + } + + $number = $this->number - 1; + $size = $vector->getSize(); + + // Get tick increment in pixels + $inc = $size / $number; + + // Check if we must hide the first tick + $start = $this->hideFirst ? $inc : 0; + $stop = $inc * $number; + + $position = 0; + + for($i = $start; round($i, 6) < $stop; $i += $inc) { + + if($position % $this->interval === 0) { + $p = $vector->p1->move( + round($i * cos($vector->getAngle()), 6), + round($i * sin($vector->getAngle() * -1), 6) + ); + $this->drawTick($driver, $p, $from, $to); + } + + $position++; + + } + //echo '<br><br>'; + } + + protected function drawTick(awDriver $driver, awPoint $p, $from, $to) { +// echo $this->size.':'.$angle.'|<b>'.cos($angle).'</b>/'; + // The round avoid some errors in the calcul + // For example, 12.00000008575245 becomes 12 + $p1 = $p; + $p2 = $p; + + if($from !== NULL) { + $p1 = $p1->move( + round($this->size * cos($from), 6), + round($this->size * sin($from) * -1, 6) + ); + } + + if($to !== NULL) { + $p2 = $p2->move( + round($this->size * cos($to), 6), + round($this->size * sin($to) * -1, 6) + ); + } + //echo $p1->x.':'.$p2->x.'('.$p1->y.':'.$p2->y.')'.'/'; + $vector = new awVector( + $p1, $p2 + ); + + $driver->line( + $this->color, + $vector + ); + + } + +} + +registerClass('Tick'); diff --git a/modules/graphartichow/artichow/inc/Tools.class.php b/modules/graphartichow/artichow/inc/Tools.class.php new file mode 100644 index 000000000..05ca3342e --- /dev/null +++ b/modules/graphartichow/artichow/inc/Tools.class.php @@ -0,0 +1,174 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Graph.class.php"; + +/** + * Objects capable of being positioned + * + * @package Artichow + */ +interface awPositionable { + + /** + * Left align + * + * @var int + */ + const LEFT = 1; + + /** + * Right align + * + * @var int + */ + const RIGHT = 2; + + /** + * Center align + * + * @var int + */ + const CENTER = 3; + + /** + * Top align + * + * @var int + */ + const TOP = 4; + + /** + * Bottom align + * + * @var int + */ + const BOTTOM = 5; + + /** + * Middle align + * + * @var int + */ + const MIDDLE = 6; + + /** + * Change alignment + * + * @param int $h Horizontal alignment + * @param int $v Vertical alignment + */ + public function setAlign($h = NULL, $v = NULL); + +} + +registerInterface('Positionable'); + +/** + * Manage left, right, top and bottom sides + * + * @package Artichow + */ +class awSide { + + /** + * Left side + * + * @var int + */ + public $left = 0; + + /** + * Right side + * + * @var int + */ + public $right = 0; + + /** + * Top side + * + * @var int + */ + public $top = 0; + + /** + * Bottom side + * + * @var int + */ + public $bottom = 0; + + /** + * Build the side + * + * @param mixed $left + * @param mixed $right + * @param mixed $top + * @param mixed $bottom + */ + public function __construct($left = NULL, $right = NULL, $top = NULL, $bottom = NULL) { + $this->set($left, $right, $top, $bottom); + } + + + /** + * Change side values + * + * @param mixed $left + * @param mixed $right + * @param mixed $top + * @param mixed $bottom + */ + public function set($left = NULL, $right = NULL, $top = NULL, $bottom = NULL) { + + if($left !== NULL) { + $this->left = (float)$left; + } + if($right !== NULL) { + $this->right = (float)$right; + } + if($top !== NULL) { + $this->top = (float)$top; + } + if($bottom !== NULL) { + $this->bottom = (float)$bottom; + } + + } + + + /** + * Add values to each side + * + * @param mixed $left + * @param mixed $right + * @param mixed $top + * @param mixed $bottom + */ + public function add($left = NULL, $right = NULL, $top = NULL, $bottom = NULL) { + + if($left !== NULL) { + $this->left += (float)$left; + } + if($right !== NULL) { + $this->right += (float)$right; + } + if($top !== NULL) { + $this->top += (float)$top; + } + if($bottom !== NULL) { + $this->bottom += (float)$bottom; + } + + } + +} + +registerClass('Side'); diff --git a/modules/graphartichow/artichow/inc/drivers/gd.class.php b/modules/graphartichow/artichow/inc/drivers/gd.class.php new file mode 100644 index 000000000..dcf2f33be --- /dev/null +++ b/modules/graphartichow/artichow/inc/drivers/gd.class.php @@ -0,0 +1,1335 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Driver.class.php"; + +/** + * Draw your objects + * + * @package Artichow + */ + +class awGDDriver extends Driver { + + /** + * A GD resource + * + * @var $resource + */ + public $resource; + + public function __construct() { + parent::__construct(); + + $this->driverString = 'gd'; + } + + public function init(awImage $image) { + + if($this->resource === NULL) { + + $this->setImageSize($image->width, $image->height); + + // Create image + $this->resource = imagecreatetruecolor($this->imageWidth, $this->imageHeight); + if(!$this->resource) { + awImage::drawError("Class Image: Unable to create a graph."); + } + + imagealphablending($this->resource, TRUE); + + // Antialiasing is now handled by the Driver object + $this->setAntiAliasing($image->getAntiAliasing()); + + // Original color + $this->filledRectangle( + new awWhite, + new awLine( + new awPoint(0, 0), + new awPoint($this->imageWidth, $this->imageHeight) + ) + ); + + $shadow = $image->shadow; + if($shadow !== NULL) { + $shadow = $shadow->getSpace(); + $p1 = new awPoint($shadow->left, $shadow->top); + $p2 = new awPoint($this->imageWidth - $shadow->right - 1, $this->imageHeight - $shadow->bottom - 1); + + + // Draw image background + $this->filledRectangle($image->getBackground(), new awLine($p1, $p2)); + + // Draw image border + $image->border->rectangle($this, $p1, $p2); + } + + } + } + + public function initFromFile(awFileImage $fileImage, $file) { + + $image = @getimagesize((string)$file); + + if($image and in_array($image[2], array(2, 3))) { + + $fileImage->setSize($image[0], $image[1]); + + switch($image[2]) { + + case 2 : + $this->resource = imagecreatefromjpeg($file); + break; + + case 3 : + $this->resource = imagecreatefrompng($file); + break; + + } + + $this->setImageSize($fileImage->width, $fileImage->height); + } else { + awImage::drawError("Class FileImage: Artichow does not support the format of this image (must be in PNG or JPEG)"); + } + } + + public function setImageSize($width, $height) { + + $this->imageWidth = $width; + $this->imageHeight = $height; + + } + + public function setPosition($x, $y) { + + // Calculate absolute position + $this->x = round($x * $this->imageWidth - $this->w / 2); + $this->y = round($y * $this->imageHeight - $this->h / 2); + + } + + public function setAbsPosition($x, $y) { + + $this->x = $x; + $this->y = $y; + + } + + public function movePosition($x, $y) { + + $this->x += (int)$x; + $this->y += (int)$y; + + } + + public function setSize($w, $h) { + + // Calcul absolute size + $this->w = round($w * $this->imageWidth); + $this->h = round($h * $this->imageHeight); + + return $this->getSize(); + + } + + public function setAbsSize($w, $h) { + + $this->w = $w; + $this->h = $h; + + return $this->getSize(); + + } + + public function getSize() { + + return array($this->w, $this->h); + + } + + public function setAntiAliasing($bool) { + + if(function_exists('imageantialias')) { + imageantialias($this->resource, (bool)$bool); + + $this->antiAliasing = (bool)$bool; + } elseif ($bool == true) { + awImage::drawErrorFile('missing-anti-aliasing'); + } + } + + public function getColor(awColor $color) { + + if($color->alpha === 0 or function_exists('imagecolorallocatealpha') === FALSE) { + $gdColor = imagecolorallocate($this->resource, $color->red, $color->green, $color->blue); + } else { + $gdColor = imagecolorallocatealpha($this->resource, $color->red, $color->green, $color->blue, $color->alpha); + } + + return $gdColor; + } + + public function copyImage(awImage $image, awPoint $p1, awPoint $p2) { + + list($x1, $y1) = $p1->getLocation(); + list($x2, $y2) = $p2->getLocation(); + + $driver = $image->getDriver(); + imagecopy($this->resource, $driver->resource, $this->x + $x1, $this->y + $y1, 0, 0, $x2 - $x1, $y2 - $y1); + + } + + public function copyResizeImage(awImage $image, awPoint $d1, awPoint $d2, awPoint $s1, awPoint $s2, $resample = TRUE) { + + if($resample) { + $function = 'imagecopyresampled'; + } else { + $function = 'imagecopyresized'; + } + + $driver = $image->getDriver(); + + $function( + $this->resource, + $driver->resource, + $this->x + $d1->x, $this->y + $d1->y, + $s1->x, $s1->y, + $d2->x - $d1->x, $d2->y - $d1->y, + $s2->x - $s1->x, $s2->y - $s1->y + ); + + } + + public function string(awText $text, awPoint $point, $width = NULL) { + + $font = $text->getFont(); + + // Can we deal with that font? + if($this->isCompatibleWithFont($font) === FALSE) { + awImage::drawError('Class GDDriver: Incompatible font type (\''.get_class($font).'\')'); + } + + // Check which FontDriver to use + if($font instanceof awPHPFont) { + $fontDriver = $this->phpFontDriver; + } else { + $fontDriver = $this->fileFontDriver; + } + + if($text->getBackground() !== NULL or $text->border->visible()) { + + list($left, $right, $top, $bottom) = $text->getPadding(); + + $textWidth = $fontDriver->getTextWidth($text, $this); + $textHeight = $fontDriver->getTextHeight($text, $this); + + $x1 = floor($point->x - $left); + $y1 = floor($point->y - $top); + $x2 = $x1 + $textWidth + $left + $right; + $y2 = $y1 + $textHeight + $top + $bottom; + + $this->filledRectangle( + $text->getBackground(), + awLine::build($x1, $y1, $x2, $y2) + ); + + $text->border->rectangle( + $this, + new awPoint($x1 - 1, $y1 - 1), + new awPoint($x2 + 1, $y2 + 1) + ); + + } + + $fontDriver->string($this, $text, $point, $width); + + } + + public function point(awColor $color, awPoint $p) { + + if($p->isHidden() === FALSE) { + $rgb = $this->getColor($color); + imagesetpixel($this->resource, $this->x + round($p->x), $this->y + round($p->y), $rgb); + } + + } + + public function line(awColor $color, awLine $line) { + + if($line->thickness > 0 and $line->isHidden() === FALSE) { + + $rgb = $this->getColor($color); + $thickness = $line->thickness; + + list($p1, $p2) = $line->getLocation(); + + $this->startThickness($thickness); + + switch($line->getStyle()) { + + case awLine::SOLID : + imageline($this->resource, $this->x + round($p1->x), $this->y + round($p1->y), $this->x + round($p2->x), $this->y + round($p2->y), $rgb); + break; + + case awLine::DOTTED : + $size = sqrt(pow($p2->y - $p1->y, 2) + pow($p2->x - $p1->x, 2)); + $cos = ($p2->x - $p1->x) / $size; + $sin = ($p2->y - $p1->y) / $size; + for($i = 0; $i <= $size; $i += 2) { + $p = new awPoint( + round($i * $cos + $p1->x), + round($i * $sin + $p1->y) + ); + $this->point($color, $p); + } + break; + + case awLine::DASHED : + $width = $p2->x - $p1->x; + $height = $p2->y - $p1->y; + $size = sqrt(pow($height, 2) + pow($width, 2)); + + if($size == 0) { + return; + } + + $cos = $width / $size; + $sin = $height / $size; + + $functionX = ($width > 0) ? 'min' : 'max'; + $functionY = ($height > 0) ? 'min' : 'max'; + + for($i = 0; $i <= $size; $i += 6) { + + $t1 = new awPoint( + round($i * $cos + $p1->x), + round($i * $sin + $p1->y) + ); + + $t2 = new awPoint( + round($functionX(($i + 3) * $cos, $width) + $p1->x), + round($functionY(($i + 3) * $sin, $height) + $p1->y) + ); + + $this->line($color, new awLine($t1, $t2)); + + } + break; + + } + + $this->stopThickness($thickness); + + } + + } + + public function arc(awColor $color, awPoint $center, $width, $height, $from, $to) { + + imagefilledarc( + $this->resource, + $this->x + $center->x, $this->y + $center->y, + $width, $height, + $from, $to, + $this->getColor($color), + IMG_ARC_EDGED | IMG_ARC_NOFILL + ); + + } + + public function filledArc(awColor $color, awPoint $center, $width, $height, $from, $to) { + + imagefilledarc( + $this->resource, + $this->x + $center->x, $this->y + $center->y, + $width, $height, + $from, $to, + $this->getColor($color), + IMG_ARC_PIE + ); + + } + + public function ellipse(awColor $color, awPoint $center, $width, $height) { + + list($x, $y) = $center->getLocation(); + + $rgb = $this->getColor($color); + imageellipse( + $this->resource, + $this->x + $x, + $this->y + $y, + $width, + $height, + $rgb + ); + + } + + public function filledEllipse($background, awPoint $center, $width, $height) { + + if($background instanceof awColor) { + + list($x, $y) = $center->getLocation(); + + $rgb = $this->getColor($background); + + imagefilledellipse( + $this->resource, + $this->x + $x, + $this->y + $y, + $width, + $height, + $rgb + ); + + } else if($background instanceof awGradient) { + + list($x, $y) = $center->getLocation(); + + $x1 = $x - round($width / 2); + $y1 = $y - round($height / 2); + $x2 = $x1 + $width; + $y2 = $y1 + $height; + + $gradientDriver = new awGDGradientDriver($this); + $gradientDriver->filledEllipse( + $background, + $x1, $y1, + $x2, $y2 + ); + + } + + } + + public function rectangle(awColor $color, awLine $line) { + + list($p1, $p2) = $line->getLocation(); + + switch($line->getStyle()) { + + case awLine::SOLID : + $thickness = $line->getThickness(); + $this->startThickness($thickness); + $rgb = $this->getColor($color); + imagerectangle($this->resource, $this->x + $p1->x, $this->y + $p1->y, $this->x + $p2->x, $this->y + $p2->y, $rgb); + $this->stopThickness($thickness); + break; + + default : + + $side = clone $line; + + + + // Top side + $side->setLocation( + new awPoint($p1->x, $p1->y), + new awPoint($p2->x, $p1->y) + ); + $this->line($color, $side); + + // Right side + $side->setLocation( + new awPoint($p2->x, $p1->y), + new awPoint($p2->x, $p2->y) + ); + $this->line($color, $side); + + // Bottom side + $side->setLocation( + new awPoint($p1->x, $p2->y), + new awPoint($p2->x, $p2->y) + ); + $this->line($color, $side); + + // Left side + $side->setLocation( + new awPoint($p1->x, $p1->y), + new awPoint($p1->x, $p2->y) + ); + $this->line($color, $side); + + break; + + } + + } + + public function filledRectangle($background, awLine $line) { + + $p1 = $line->p1; + $p2 = $line->p2; + + if($background instanceof awColor) { + $rgb = $this->getColor($background); + imagefilledrectangle($this->resource, $this->x + $p1->x, $this->y + $p1->y, $this->x + $p2->x, $this->y + $p2->y, $rgb); + } else if($background instanceof awGradient) { + $gradientDriver = new awGDGradientDriver($this); + $gradientDriver->filledRectangle($background, $p1, $p2); + } + + } + + public function polygon(awColor $color, awPolygon $polygon) { + + switch($polygon->getStyle()) { + + case awPolygon::SOLID : + $thickness = $polygon->getThickness(); + $this->startThickness($thickness); + $points = $this->getPolygonPoints($polygon); + $rgb = $this->getColor($color); + imagepolygon($this->resource, $points, $polygon->count(), $rgb); + $this->stopThickness($thickness); + break; + + default : + + if($polygon->count() > 1) { + + $prev = $polygon->get(0); + + $line = new awLine; + $line->setStyle($polygon->getStyle()); + $line->setThickness($polygon->getThickness()); + + for($i = 1; $i < $polygon->count(); $i++) { + $current = $polygon->get($i); + $line->setLocation($prev, $current); + $this->line($color, $line); + $prev = $current; + } + + // Close the polygon + $line->setLocation($prev, $polygon->get(0)); + $this->line($color, $line); + + } + + } + + } + + public function filledPolygon($background, awPolygon $polygon) { + + if($background instanceof awColor) { + + $points = $this->getPolygonPoints($polygon); + $rgb = $this->getColor($background); + + imagefilledpolygon($this->resource, $points, $polygon->count(), $rgb); + + } else if($background instanceof awGradient) { + + $gradientDriver = new awGDGradientDriver($this); + $gradientDriver->filledPolygon($background, $polygon); + + } + + } + + public function send(awImage $image) { + + $this->drawImage($image); + + } + + public function get(awImage $image) { + + return $this->drawImage($image, TRUE, FALSE); + + } + + public function getTextWidth(awText $text) { + $font = $text->getFont(); + + if($font instanceof awPHPFont) { + $fontDriver = $this->phpFontDriver; + } else { + $fontDriver = $this->fileFontDriver; + } + + return $fontDriver->getTextWidth($text, $this); + } + + public function getTextHeight(awText $text) { + $font = $text->getFont(); + + if($font instanceof awPHPFont) { + $fontDriver = $this->phpFontDriver; + } else { + $fontDriver = $this->fileFontDriver; + } + + return $fontDriver->getTextHeight($text, $this); + } + + protected function isCompatibleWithFont(awFont $font) { + if($font instanceof awFDBFont) { + return FALSE; + } else { + return TRUE; + } + } + + private function drawImage(awImage $image, $return = FALSE, $header = TRUE) { + + $format = $image->getFormatString(); + + // Test if format is available + if((imagetypes() & $image->getFormat()) === FALSE) { + awImage::drawError("Class Image: Format '".$format."' is not available on your system. Check that your PHP has been compiled with the good libraries."); + } + + // Get some infos about this image + switch($format) { + case 'jpeg' : + $function = 'imagejpeg'; + break; + case 'png' : + $function = 'imagepng'; + break; + case 'gif' : + $function = 'imagegif'; + break; + } + + // Send headers to the browser + if($header === TRUE) { + $image->sendHeaders(); + } + + if($return) { + ob_start(); + } + + $function($this->resource); + + if($return) { + return ob_get_clean(); + } + } + + private function getPolygonPoints(awPolygon $polygon) { + + $points = array(); + + foreach($polygon->all() as $point) { + $points[] = $point->x + $this->x; + $points[] = $point->y + $this->y; + } + + return $points; + + } + + private function startThickness($thickness) { + + if($thickness > 1) { + + // Beurk :'( + if($this->antiAliasing and function_exists('imageantialias')) { + imageantialias($this->resource, FALSE); + } + imagesetthickness($this->resource, $thickness); + + } + + } + + private function stopThickness($thickness) { + + if($thickness > 1) { + + if($this->antiAliasing and function_exists('imageantialias')) { + imageantialias($this->resource, TRUE); + } + imagesetthickness($this->resource, 1); + + } + + } + + +} + +registerClass('GDDriver'); + +/** + * To your gradients + * + * @package Artichow + */ + +class awGDGradientDriver { + + /** + * A driver + * + * @var awGDDriver + */ + protected $driver; + + /** + * Build your GDGradientDriver + * + * @var awGDDriver $driver + */ + public function __construct(awGDDriver $driver) { + + $this->driver = $driver; + + } + + public function drawFilledFlatTriangle(awGradient $gradient, awPoint $a, awPoint $b, awPoint $c) { + + if($gradient->angle !== 0) { + awImage::drawError("Class GDGradientDriver: Flat triangles can only be used with 0 degree gradients."); + } + + // Look for right-angled triangle + if($a->x !== $b->x and $b->x !== $c->x) { + awImage::drawError("Class GDGradientDriver: Not right-angled flat triangles are not supported yet."); + } + + if($a->x === $b->x) { + $d = $a; + $e = $c; + } else { + $d = $c; + $e = $a; + } + + $this->init($gradient, $b->y - $d->y); + + for($i = $c->y + 1; $i < $b->y; $i++) { + + $color = $this->color($i - $d->y); + $pos = ($i - $d->y) / ($b->y - $d->y); + + $p1 = new awPoint($e->x, $i); + $p2 = new awPoint(1 + floor($e->x - $pos * ($e->x - $d->x)), $i); + + $this->driver->filledRectangle($color, new awLine($p1, $p2)); + + unset($color); + + } + + } + + protected function drawFilledTriangle(awGradient $gradient, awPolygon $polygon) { + + if($gradient->angle === 0) { + $this->drawFilledTriangleVertically($gradient, $polygon); + } elseif($gradient->angle === 90) { + $this->drawFilledTriangleHorizontally($gradient, $polygon); + } + + } + + private function drawFilledTriangleVertically(awGradient $gradient, awPolygon $polygon) { + list($yMin, $yMax) = $polygon->getBoxYRange(); + + $this->init($gradient, $yMax - $yMin); + + // Get the triangle line we will draw our lines from + $fromLine = NULL; + $lines = $polygon->getLines(); + + $count = count($lines); + + // Pick the side of the triangle going from the top + // to the bottom of the surrounding box + for($i = 0; $i < $count; $i++) { + if($lines[$i]->isTopToBottom($polygon)) { + list($fromLine) = array_splice($lines, $i, 1); + break; + } + } + + // If for some reason the three points are aligned, + // $fromLine will still be NULL + if($fromLine === NULL) { + return; + } + + $fillLine = NULL; + for($y = round($yMin); $y < round($yMax); $y++) { + + $fromX = $fromLine->getXFrom($y); + + $toX = array(); + foreach($lines as $line) { + $xValue = $line->getXFrom($y); + + if(!is_null($xValue)) { + $toX[] = $xValue; + } + } + + if(count($toX) === 1) { + $fillLine = new Line( + new Point($fromX, $y), + new Point($toX[0], $y) + ); + } else { + + $line1 = new Line( + new Point($fromX, $y), + new Point($toX[0], $y) + ); + $line2 = new Line( + new Point($fromX, $y), + new Point($toX[1], $y) + ); + + if($line1->getSize() < $line2->getSize()) { + $fillLine = $line1; + } else { + $fillLine = $line2; + } + } + + if(!$fillLine->isPoint()) { + $color = $this->color($y - $yMin); + $this->driver->line($color, $fillLine); + + unset($color); + } + } + + } + + private function drawFilledTriangleHorizontally(awGradient $gradient, awPolygon $polygon) { + list($xMin, $xMax) = $polygon->getBoxXRange(); + + $this->init($gradient, $xMax - $xMin); + + // Get the triangle line we will draw our lines from + $fromLine = NULL; + $lines = $polygon->getLines(); + + $count = count($lines); + + // Pick the side of the triangle going all the way + // from the left side to the right side of the surrounding box + for($i = 0; $i < $count; $i++) { + if($lines[$i]->isLeftToRight($polygon)) { + list($fromLine) = array_splice($lines, $i, 1); + break; + } + } + + // If for some reason the three points are aligned, + // $fromLine will still be NULL + if($fromLine === NULL) { + return; + } + + $fillLine = NULL; + for($x = round($xMin); $x < round($xMax); $x++) { + + $fromY = floor($fromLine->getYFrom($x)); + + $toY = array(); + foreach($lines as $line) { + $yValue = $line->getYFrom($x); + + if(!is_null($yValue)) { + $toY[] = floor($yValue); + } + } + + if(count($toY) === 1) { + $fillLine = new Line( + new Point($x, $fromY), + new Point($x, $toY[0]) + ); + } else { + + $line1 = new Line( + new Point($x, $fromY), + new Point($x, $toY[0]) + ); + $line2 = new Line( + new Point($x, $fromY), + new Point($x, $toY[1]) + ); + + if($line1->getSize() < $line2->getSize()) { + $fillLine = $line1; + } else { + $fillLine = $line2; + } + } + + $color = $this->color($x - $xMin); + if($fillLine->isPoint()) { + $this->driver->point($color, $fillLine->p1); + } elseif($fillLine->getSize() >= 1) { + $this->driver->line($color, $fillLine); + } + unset($color); + } + + } + + public function filledRectangle(awGradient $gradient, awPoint $p1, awPoint $p2) { + + list($x1, $y1) = $p1->getLocation(); + list($x2, $y2) = $p2->getLocation(); + + if($y1 < $y2) { + $y1 ^= $y2 ^= $y1 ^= $y2; + } + + if($x2 < $x1) { + $x1 ^= $x2 ^= $x1 ^= $x2; + } + + if($gradient instanceof awLinearGradient) { + $this->rectangleLinearGradient($gradient, new awPoint($x1, $y1), new awPoint($x2, $y2)); + } else { + awImage::drawError("Class GDGradientDriver: This gradient is not supported by rectangles."); + } + + } + + public function filledPolygon(awGradient $gradient, awPolygon $polygon) { + + if($gradient instanceof awLinearGradient) { + $this->polygonLinearGradient($gradient, $polygon); + } else { + awImage::drawError("Class GDGradientDriver: This gradient is not supported by polygons."); + } + + } + + protected function rectangleLinearGradient(awLinearGradient $gradient, awPoint $p1, awPoint $p2) { + + list($x1, $y1) = $p1->getLocation(); + list($x2, $y2) = $p2->getLocation(); + + if($y1 - $y2 > 0) { + + if($gradient->angle === 0) { + + $this->init($gradient, $y1 - $y2); + + for($i = $y2; $i <= $y1; $i++) { + + $color = $this->color($i - $y2); + + $p1 = new awPoint($x1, $i); + $p2 = new awPoint($x2, $i); + + $this->driver->filledRectangle($color, new awLine($p1, $p2)); + + unset($color); + + } + + } else if($gradient->angle === 90) { + + $this->init($gradient, $x2 - $x1); + + for($i = $x1; $i <= $x2; $i++) { + + $color = $this->color($i - $x1); + + $p1 = new awPoint($i, $y2); + $p2 = new awPoint($i, $y1); + + $this->driver->filledRectangle($color, new awLine($p1, $p2)); + + unset($color); + + } + + } + + } + + } + + public function filledEllipse(awGradient $gradient, $x1, $y1, $x2, $y2) { + + if($y1 < $y2) { + $y1 ^= $y2 ^= $y1 ^= $y2; + } + + if($x2 < $x1) { + $x1 ^= $x2 ^= $x1 ^= $x2; + } + + if($gradient instanceof awRadialGradient) { + $this->ellipseRadialGradient($gradient, $x1, $y1, $x2, $y2); + } else if($gradient instanceof awLinearGradient) { + $this->ellipseLinearGradient($gradient, $x1, $y1, $x2, $y2); + } else { + awImage::drawError("Class GDGradientDriver: This gradient is not supported by ellipses."); + } + + } + + protected function ellipseRadialGradient(awGradient $gradient, $x1, $y1, $x2, $y2) { + + if($y1 - $y2 > 0) { + + if($y1 - $y2 != $x2 - $x1) { + awImage::drawError("Class GDGradientDriver: Radial gradients are only implemented on circle, not ellipses."); + } + + $c = new awPoint($x1 + ($x2 - $x1) / 2, $y1 + ($y2 - $y1) / 2); + $r = ($x2 - $x1) / 2; + $ok = array(); + + // Init gradient + $this->init($gradient, $r); + + for($i = 0; $i <= $r; $i += 0.45) { + + $p = ceil((2 * M_PI * $i)); + + if($p > 0) { + $interval = 360 / $p; + } else { + $interval = 360; + } + + $color = $this->color($i); + + for($j = 0; $j < 360; $j += $interval) { + + $rad = ($j / 360) * (2 * M_PI); + + $x = round($i * cos($rad)); + $y = round($i * sin($rad)); + + $l = sqrt($x * $x + $y * $y); + + if($l <= $r) { + + if( + array_key_exists((int)$x, $ok) === FALSE or + array_key_exists((int)$y, $ok[$x]) === FALSE + ) { + + // Print the point + $this->driver->point($color, new awPoint($c->x + $x, $c->y + $y)); + + $ok[(int)$x][(int)$y] = TRUE; + + } + + } + + } + + unset($color); + + } + + } + + } + + protected function ellipseLinearGradient(awGradient $gradient, $x1, $y1, $x2, $y2) { + + // Gauche->droite : 90° + + if($y1 - $y2 > 0) { + + if($y1 - $y2 != $x2 - $x1) { + awImage::drawError("Class GDGradientDriver: Linear gradients are only implemented on circle, not ellipses."); + } + + $r = ($x2 - $x1) / 2; + + // Init gradient + $this->init($gradient, $x2 - $x1); + + for($i = -$r; $i <= $r; $i++) { + + $h = sin(acos($i / $r)) * $r; + + $color = $this->color($i + $r); + + if($gradient->angle === 90) { + + // Print the line + $p1 = new awPoint( + $x1 + $i + $r, + round(max($y2 + $r - $h + 1, $y2)) + ); + + $p2 = new awPoint( + $x1 + $i + $r, + round(min($y1 - $r + $h - 1, $y1)) + ); + + } else { + + // Print the line + $p1 = new awPoint( + round(max($x1 + $r - $h + 1, $x1)), + $y2 + $i + $r + ); + + $p2 = new awPoint( + round(min($x2 - $r + $h - 1, $x2)), + $y2 + $i + $r + ); + + } + + $this->driver->filledRectangle($color, new awLine($p1, $p2)); + + unset($color); + + } + + } + + } + + protected function polygonLinearGradient(awLinearGradient $gradient, awPolygon $polygon) { + + $count = $polygon->count(); + + if($count >= 4) { + + $left = $polygon->get(0); + $right = $polygon->get($count - 1); + + if($gradient->angle === 0) { + + // Get polygon maximum and minimum + $offset = $polygon->get(0); + $max = $min = $offset->y; + for($i = 1; $i < $count - 1; $i++) { + $offset = $polygon->get($i); + $max = max($max, $offset->y); + $min = min($min, $offset->y); + } + + $this->init($gradient, $max - $min); + + $prev = $polygon->get(1); + + $sum = 0; + + for($i = 2; $i < $count - 1; $i++) { + + $current = $polygon->get($i); + + $interval = 1; + + if($i !== $count - 2) { + $current->x -= $interval; + } + + if($current->x - $prev->x > 0) { + + // Draw rectangle + $x1 = $prev->x; + $x2 = $current->x; + $y1 = max($prev->y, $current->y); + $y2 = $left->y; + + $gradient = new awLinearGradient( + $this->color($max - $min - ($y2 - $y1)), + $this->color($max - $min), + 0 + ); + + if($y1 > $y2) { + $y2 = $y1; + } + + $this->driver->filledRectangle( + $gradient, + awLine::build($x1, $y1, $x2, $y2) + ); + + $top = ($prev->y < $current->y) ? $current : $prev; + $bottom = ($prev->y >= $current->y) ? $current : $prev; + + $gradient = new awLinearGradient( + $this->color($bottom->y - $min), + $this->color($max - $min - ($y2 - $y1)), + 0 + ); + + + $gradientDriver = new awGDGradientDriver($this->driver); + $gradientDriver->drawFilledFlatTriangle( + $gradient, + new awPoint($prev->x, min($prev->y, $current->y)), + $top, + new awPoint($current->x, min($prev->y, $current->y)) + ); + unset($gradientDriver); + + $sum += $current->x - $prev->x; + + } + + $prev = $current; + $prev->x += $interval; + + } + + } else if($gradient->angle === 90) { + + $width = $right->x - $left->x; + $this->init($gradient, $width); + + $pos = 1; + $next = $polygon->get($pos++); + + $this->next($polygon, $pos, $prev, $next); + + for($i = 0; $i <= $width; $i++) { + + $x = $left->x + $i; + + $y1 = round($prev->y + ($next->y - $prev->y) * (($i + $left->x - $prev->x) / ($next->x - $prev->x))); + $y2 = $left->y; + + // Draw line + $color = $this->color($i); + // YaPB : PHP does not handle alpha on lines + $this->driver->filledRectangle($color, awLine::build($x, $y1, $x, $y2)); + + unset($color); + + // Jump to next point + if($next->x == $i + $left->x) { + + $this->next($polygon, $pos, $prev, $next); + + } + + } + + } + + } else if($count === 3) { + $this->drawFilledTriangle( + $gradient, + $polygon + ); + } + + } + + private function next($polygon, &$pos, &$prev, &$next) { + + do { + $prev = $next; + $next = $polygon->get($pos++); + } + while($next->x - $prev->x == 0 and $pos < $polygon->count()); + + } + + /** + * Start colors + * + * @var int + */ + private $r1, $g1, $b1, $a1; + + /** + * Stop colors + * + * @var int + */ + private $r2, $g2, $b2, $a2; + + /** + * Gradient size in pixels + * + * @var int + */ + private $size; + + + private function init(awGradient $gradient, $size) { + + list( + $this->r1, $this->g1, $this->b1, $this->a1 + ) = $gradient->from->rgba(); + + list( + $this->r2, $this->g2, $this->b2, $this->a2 + ) = $gradient->to->rgba(); + + $this->size = $size; + } + + private function color($pos) { + + return new awColor( + $this->getRed($pos), + $this->getGreen($pos), + $this->getBlue($pos), + $this->getAlpha($pos) + ); + + } + + + private function getRed($pos) { + if((float)$this->size !== 0.0) { + return (int)round($this->r1 + ($pos / $this->size) * ($this->r2 - $this->r1)); + } else { + return 0; + } + } + + private function getGreen($pos) { + if((float)$this->size !== 0.0) { + return (int)round($this->g1 + ($pos / $this->size) * ($this->g2 - $this->g1)); + } else { + return 0; + } + } + + private function getBlue($pos) { + if((float)$this->size !== 0.0) { + return (int)round($this->b1 + ($pos / $this->size) * ($this->b2 - $this->b1)); + } else { + return 0; + } + } + + private function getAlpha($pos) { + if((float)$this->size !== 0.0) { + return (int)round(($this->a1 + ($pos / $this->size) * ($this->a2 - $this->a1)) / 127 * 100); + } else { + return 0; + } + } + +} + +registerClass('GDGradientDriver'); + +/* + * Check for GD2 + */ +if(function_exists('imagecreatetruecolor') === FALSE) { + awImage::drawErrorFile('missing-gd2'); +} + diff --git a/modules/graphartichow/artichow/inc/drivers/ming.class.php b/modules/graphartichow/artichow/inc/drivers/ming.class.php new file mode 100644 index 000000000..aee0ae7db --- /dev/null +++ b/modules/graphartichow/artichow/inc/drivers/ming.class.php @@ -0,0 +1,773 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once dirname(__FILE__)."/../Driver.class.php"; + +/** + * Draw your objects + * + * @package Artichow + */ +class awMingDriver extends awDriver { + + /** + * The Flash movie + * + * @var $movie + */ + public $movie; + + public function __construct() { + + parent::__construct(); + + $this->driverString = 'ming'; + + // Nice defaults + ming_setScale(20.0); + ming_useswfversion(6); + + } + + /** + * Initialize the driver for a particular awImage object + * + * @param awImage $image + */ + public function init(awImage $image) { + + if($this->movie === NULL) { + $this->setImageSize($image->width, $image->height); + + // Create movie + $this->movie = new SWFMovie(); + if(!$this->movie) { + awImage::drawError("Class Image: Unable to create a graph."); + } + + $this->movie->setDimension($image->width, $image->height); + + $this->setAntiAliasing($image->getAntiAliasing()); + + // Original color + $this->filledRectangle( + new awWhite, + new awLine( + new awPoint(0, 0), + new awPoint($this->imageWidth, $this->imageHeight) + ) + ); + + $shadow = $image->shadow; + if($shadow !== NULL) { + $shadow = $shadow->getSpace(); + $p1 = new awPoint($shadow->left, $shadow->top); + $p2 = new awPoint($this->imageWidth - $shadow->right - 1, $this->imageHeight - $shadow->bottom - 1); + + // Draw image background + $this->filledRectangle($image->getBackground(), new awLine($p1, $p2)); + + // Draw image border + $image->border->rectangle($this, $p1, $p2); + } + } + } + + /** + * Initialize the Driver for a particular FileImage object + * + * @param awFileImage $fileImage The FileImage object to work on + * @param string $file Image filename + */ + public function initFromFile(awFileImage $fileImage, $file) { + + } + + /** + * Change the image size + * + * @param int $width Image width + * @param int $height Image height + */ + public function setImageSize($width, $height) { + $this->imageWidth = $width; + $this->imageHeight = $height; + } + + /** + * Inform the driver of the position of your image + * + * @param float $x Position on X axis of the center of the component + * @param float $y Position on Y axis of the center of the component + */ + public function setPosition($x, $y) { + // Calculate absolute position + $this->x = round($x * $this->imageWidth - $this->w / 2); + $this->y = round($y * $this->imageHeight - $this->h / 2); + } + + /** + * Inform the driver of the position of your image + * This method need absolutes values + * + * @param int $x Left-top corner X position + * @param int $y Left-top corner Y position + */ + public function setAbsPosition($x, $y) { + $this->x = $x; + $this->y = $y; + } + + /** + * Move the position of the image + * + * @param int $x Add this value to X axis + * @param int $y Add this value to Y axis + */ + public function movePosition($x, $y) { + $this->x += (int)$x; + $this->y += (int)$y; + } + + /** + * Inform the driver of the size of your image + * Height and width must be between 0 and 1. + * + * @param int $w Image width + * @param int $h Image height + * @return array Absolute width and height of the image + */ + public function setSize($w, $h) { + + // Calcul absolute size + $this->w = round($w * $this->imageWidth); + $this->h = round($h * $this->imageHeight); + + return $this->getSize(); + + } + + /** + * Inform the driver of the size of your image + * You can set absolute size with this method. + * + * @param int $w Image width + * @param int $h Image height + */ + public function setAbsSize($w, $h) { + $this->w = $w; + $this->h = $h; + + return $this->getSize(); + } + + /** + * Get the size of the component handled by the driver + * + * @return array Absolute width and height of the component + */ + public function getSize() { + return array($this->w, $this->h); + } + + /** + * Turn antialiasing on or off + * + * @var bool $bool + */ + public function setAntiAliasing($bool) { + if($this->movie !== NULL) { + + $actionscript = ' + _quality = "%s"; + '; + + if((bool)$bool) { + $actionscript = sprintf($actionscript, 'high'); + } else { + $actionscript = sprintf($actionscript, 'low'); + } + + $this->movie->add(new SWFAction(str_replace("\r", "", $actionscript))); + } + } + + /** + * When passed a Color object, returns the corresponding + * color identifier (driver dependant). + * + * @param awColor $color A Color object + * @return array $rgba A color identifier representing the color composed of the given RGB components + */ + public function getColor(awColor $color) { + + // Ming simply works with R, G, B and Alpha values. + list($red, $green, $blue, $alpha) = $color->rgba(); + + // However, the Ming alpha channel ranges from 255 (opaque) to 0 (transparent), + // while the awColor alpha channel ranges from 0 (opaque) to 100 (transparent). + // First, we convert from 0-100 to 0-255. + $alpha = (int)($alpha * 255 / 100); + + // Then from 0-255 to 255-0. + $alpha = abs($alpha - 255); + + return array($red, $green, $blue, $alpha); + } + + /** + * Draw an image here + * + * @param awImage $image Image + * @param int $p1 Image top-left point + * @param int $p2 Image bottom-right point + */ + public function copyImage(awImage $image, awPoint $p1, awPoint $p2) { + + } + + /** + * Draw an image here + * + * @param awImage $image Image + * @param int $d1 Destination top-left position + * @param int $d2 Destination bottom-right position + * @param int $s1 Source top-left position + * @param int $s2 Source bottom-right position + * @param bool $resample Resample image ? (default to TRUE) + */ + public function copyResizeImage(awImage $image, awPoint $d1, awPoint $d2, awPoint $s1, awPoint $s2, $resample = TRUE) { + + } + + /** + * Draw a string + * + * @var awText $text Text to print + * @param awPoint $point Draw the text at this point + * @param int $width Text max width + */ + public function string(awText $text, awPoint $point, $width = NULL) { + $font = $text->getFont(); + + // Can we deal with that font? + if($this->isCompatibleWithFont($font) === FALSE) { + awImage::drawError('Class MingDriver: Incompatible font type (\''.get_class($font).'\')'); + } + + // Ming can only work with awFileFont objects for now + // (i.e. awFDBFont, or awTuffy et al.) + $fontDriver = $this->fileFontDriver; + + if($text->getBackground() !== NULL or $text->border->visible()) { + + list($left, $right, $top, $bottom) = $text->getPadding(); + + $textWidth = $fontDriver->getTextWidth($text, $this); + $textHeight = $fontDriver->getTextHeight($text, $this); + + $x1 = floor($point->x - $left); + $y1 = floor($point->y - $top); + $x2 = $x1 + $textWidth + $left + $right; + $y2 = $y1 + $textHeight + $top + $bottom; + + $this->filledRectangle( + $text->getBackground(), + awLine::build($x1, $y1, $x2, $y2) + ); + + $text->border->rectangle( + $this, + new awPoint($x1 - 1, $y1 - 1), + new awPoint($x2 + 1, $y2 + 1) + ); + + } + + $fontDriver->string($this, $text, $point, $width); + } + + /** + * Draw a pixel + * + * @param awColor $color Pixel color + * @param awPoint $p + */ + public function point(awColor $color, awPoint $p) { + if($p->isHidden() === FALSE) { + list($red, $green, $blue, $alpha) = $this->getColor($color); + + $point = new SWFShape(); + $point->setLine(1, $red, $green, $blue, $alpha); + $point->movePenTo($this->x + round($p->x), $this->y + round($p->y)); + $point->drawLine(0.5, 0.5); + $point->movePen(-0.5, 0); + $point->drawLine(0.5, -0.5); + + $this->movie->add($point); + } + } + + /** + * Draw a colored line + * + * @param awColor $color Line color + * @param awLine $line + * @param int $thickness Line tickness + */ + public function line(awColor $color, awLine $line) { + if($line->getThickness() > 0 and $line->isHidden() === FALSE) { + + list($red, $green, $blue, $alpha) = $this->getColor($color); + + $mingLine = new SWFShape(); + $mingLine->setLine($line->getThickness(), $red, $green, $blue, $alpha); + + list($p1, $p2) = $line->getLocation(); + + $mingLine->movePenTo($this->x + round($p1->x), $this->y + round($p1->y)); + + switch($line->getStyle()) { + + case awLine::SOLID : + $mingLine->drawLineTo($this->x + round($p2->x), $this->y + round($p2->y)); + $this->movie->add($mingLine); + break; + + case awLine::DOTTED : + $size = sqrt(pow($p2->y - $p1->y, 2) + pow($p2->x - $p1->x, 2)); + $cos = ($p2->x - $p1->x) / $size; + $sin = ($p2->y - $p1->y) / $size; + + for($i = 0; $i <= $size; $i += 2) { + $p = new awPoint( + round($i * $cos + $p1->x), + round($i * $sin + $p1->y) + ); + $this->point($color, $p); + } + + break; + + case awLine::DASHED : + $width = $p2->x - $p1->x; + $height = $p2->y - $p1->y; + $size = sqrt(pow($height, 2) + pow($width, 2)); + + if($size == 0) { + return; + } + + $cos = $width / $size; + $sin = $height / $size; + + $functionX = ($width > 0) ? 'min' : 'max'; + $functionY = ($height > 0) ? 'min' : 'max'; + + for($i = 0; $i <= $size; $i += 6) { + + $t1 = new awPoint( + round($i * $cos + $p1->x), + round($i * $sin + $p1->y) + ); + + $t2 = new awPoint( + round($functionX(($i + 3) * $cos, $width) + $p1->x), + round($functionY(($i + 3) * $sin, $height) + $p1->y) + ); + + $this->line($color, new awLine($t1, $t2)); + + } + + break; + + } + + } + + } + + /** + * Draw a color arc + + * @param awColor $color Arc color + * @param awPoint $center Point center + * @param int $width Ellipse width + * @param int $height Ellipse height + * @param int $from Start angle + * @param int $to End angle + */ + public function arc(awColor $color, awPoint $center, $width, $height, $from, $to) { + + } + + /** + * Draw an arc with a background color + * + * @param awColor $color Arc background color + * @param awPoint $center Point center + * @param int $width Ellipse width + * @param int $height Ellipse height + * @param int $from Start angle + * @param int $to End angle + */ + public function filledArc(awColor $color, awPoint $center, $width, $height, $from, $to) { + + } + + /** + * Draw a colored ellipse + * + * @param awColor $color Ellipse color + * @param awPoint $center Ellipse center + * @param int $width Ellipse width + * @param int $height Ellipse height + */ + public function ellipse(awColor $color, awPoint $center, $width, $height) { + + } + + /** + * Draw an ellipse with a background + * + * @param mixed $background Background (can be a color or a gradient) + * @param awPoint $center Ellipse center + * @param int $width Ellipse width + * @param int $height Ellipse height + */ + public function filledEllipse($background, awPoint $center, $width, $height) { + + } + + /** + * Draw a colored rectangle + * + * @param awColor $color Rectangle color + * @param awLine $line Rectangle diagonale + * @param awPoint $p2 + */ + public function rectangle(awColor $color, awLine $line) { + list($p1, $p2) = $line->getLocation(); + + // Get Red, Green, Blue and Alpha values for the line + list($r, $g, $b, $a) = $this->getColor($color); + + // Calculate the coordinates of the two other points of the rectangle + $p3 = new Point($p1->x, $p2->y); + $p4 = new Point($p2->x, $p1->y); + + + $side = clone $line; + + + + // Draw the four sides of the rectangle, clockwise + if( + ($p1->x <= $p2->x and $p1->y <= $p2->y) + or + ($p1->x >= $p2->x and $p1->y >= $p2->y) + ) { + $side->setLocation($p1, $p4); + $this->line($color, $side); + + $side->setLocation($p4, $p2); + $this->line($color, $side); + + $side->setLocation($p2, $p3); + $this->line($color, $side); + + $side->setLocation($p3, $p1); + $this->line($color, $side); + } else { + $side->setLocation($p1, $p3); + $this->line($color, $side); + + $side->setLocation($p3, $p2); + $this->line($color, $side); + + $side->setLocation($p2, $p4); + $this->line($color, $side); + + $side->setLocation($p4, $p1); + $this->line($color, $side); + } + } + + /** + * Draw a rectangle with a background + * + * @param mixed $background Background (can be a color or a gradient) + * @param awLine $line Rectangle diagonale + */ + public function filledRectangle($background, awLine $line) { + list($p1, $p2) = $line->getLocation(); + + // Common shape settings + $shape = new SWFShape(); + $shape->setLine(0); + + if($background instanceof awColor) { + + // Get the Red, Green, Blue and Alpha values + list($r, $g, $b, $a) = $this->getColor($background); + $shape->setRightFill($r, $g, $b, $a); + + } else if($background instanceof awGradient) { + + // Get the Gradient object as an SWFGradient one + list($flashGradient, $style) = $this->getGradient($background); + + $fill = $shape->addFill($flashGradient, $style); + + // Angles between Artichow and Ming don't match. + // Don't use abs() or vertical gradients get inverted. + $angle = $background->angle - 90; + $fill->rotateTo($angle); + + // Move the gradient based on the position of the rectangle we're drawing + $centerX = min($p1->x, $p2->y) + abs($p1->x - $p2->x) / 2; + $centerY = min($p1->y, $p2->y) + abs($p1->y - $p2->y) / 2; + $fill->moveTo($centerX, $centerY); + + // Ming draws its gradients on a 1600x1600 image, + // so we have to resize it. + if($angle === -90) { + $ratio = abs($p1->y - $p2->y) / 1600; + } else { + $ratio = abs($p1->x - $p2->x) / 1600; + } + $fill->scaleTo($ratio); + + $shape->setRightFill($fill); + + } + + // Set starting position + $shape->movePenTo($this->x + round($p1->x), $this->y + round($p1->y)); + + // Depending on the points' relative positions, + // we have two drawing possibilities + if( + ($p1->x <= $p2->x and $p1->y <= $p2->y) + or + ($p1->x >= $p2->x and $p1->y >= $p2->y) + ) { + $shape->drawLineTo($this->x + round($p2->x), $this->y + round($p1->y)); + $shape->drawLineTo($this->x + round($p2->x), $this->y + round($p2->y)); + $shape->drawLineTo($this->x + round($p1->x), $this->y + round($p2->y)); + $shape->drawLineTo($this->x + round($p1->x), $this->y + round($p1->y)); + } else { + $shape->drawLineTo($this->x + round($p1->x), $this->y + round($p2->y)); + $shape->drawLineTo($this->x + round($p2->x), $this->y + round($p2->y)); + $shape->drawLineTo($this->x + round($p2->x), $this->y + round($p1->y)); + $shape->drawLineTo($this->x + round($p1->x), $this->y + round($p1->y)); + } + + $this->movie->add($shape); + } + + /** + * Draw a polygon + * + * @param awColor $color Polygon color + * @param Polygon A polygon + */ + public function polygon(awColor $color, awPolygon $polygon) { + $points = $polygon->all(); + $count = count($points); + + if($count > 1) { + + $side = new awLine; + $side->setStyle($polygon->getStyle()); + $side->setThickness($polygon->getThickness()); + + $prev = $points[0]; + + for($i = 1; $i < $count; $i++) { + $current = $points[$i]; + $side->setLocation($prev, $current); + $this->line($color, $side); + $prev = $current; + } + + // Close the polygon + $side->setLocation($prev, $points[0]); + $this->line($color, $side); + } + } + + /** + * Draw a polygon with a background + * + * @param mixed $background Background (can be a color or a gradient) + * @param Polygon A polygon + */ + public function filledPolygon($background, awPolygon $polygon) { + $shape = new SWFShape(); + + if($background instanceof awColor) { + list($red, $green, $blue, $alpha) = $this->getColor($background); + + $shape->setRightFill($red, $green, $blue, $alpha); + } elseif($background instanceof awGradient) { + list($flashGradient, $style) = $this->getGradient($background); + + $fill = $shape->addFill($flashGradient, $style); + + list($xMin, $xMax) = $polygon->getBoxXRange(); + list($yMin, $yMax) = $polygon->getBoxYRange(); + + if($background->angle === 0) { + $fill->scaleTo(($yMax - $yMin) / 1600); + } else { + $fill->scaleTo(($xMax - $xMin) / 1600); + } + $fill->moveTo($xMin + ($xMax - $xMin) / 2, $yMin + ($yMax - $yMin) / 2); + + $shape->setRightFill($fill); + } + + $points = $polygon->all(); + $count = count($points); + + if($count > 1) { + + $prev = $points[0]; + + $shape->movePenTo($prev->x, $prev->y); + + for($i = 1; $i < $count; $i++) { + $current = $points[$i]; + $shape->drawLineTo($current->x, $current->y); + } + + // Close the polygon + $shape->drawLineTo($prev->x, $prev->y); + + $this->movie->add($shape); + + } + } + + /** + * Sends the image, as well as the correct HTTP headers, to the browser + * + * @param awImage $image The Image object to send + */ + public function send(awImage $image) { + $this->drawImage($image); + } + + /** + * Get the image as binary data + * + * @param awImage $image + */ + public function get(awImage $image) { + return $this->drawImage($image, TRUE, FALSE); + } + + public function getTextWidth(awText $text) { + $font = $text->getFont(); + if($this->isCompatibleWithFont($font) === FALSE) { + awImage::drawError('Class MingDriver: Incompatible font type (\''.get_class($font).'\')'); + } + + // Ming only supports FileFont + $fontDriver = $this->fileFontDriver; + + return $fontDriver->getTextWidth($text, $this); + } + + public function getTextHeight(awText $text) { + $font = $text->getFont(); + if($this->isCompatibleWithFont($font) === FALSE) { + awImage::drawError('Class MingDriver: Incompatible font type (\''.get_class($font).'\')'); + } + + // Ming only supports FileFont + $fontDriver = $this->fileFontDriver; + + return $fontDriver->getTextHeight($text, $this); + } + + protected function isCompatibleWithFont(awFont $font) { + if($font instanceof awTTFFont or $font instanceof awPHPFont) { + return FALSE; + } else { + return TRUE; + } + } + + private function drawImage(awImage $image, $return = FALSE, $header = TRUE) { + + // Send headers to the browser + if($header === TRUE) { + $image->sendHeaders(); + } + + if($return) { + ob_start(); + } + + $this->movie->output(); + + if($return) { + return ob_get_clean(); + } + } + + /** + * Convert an awGradient object to an SWFGradient one. + * Returns an object as well as the style of the Flash gradient. + * + * @param awGradient $gradient The awGradient object to convert + * @return array + */ + private function getGradient(awGradient $gradient) { + $flashGradient = new SWFGradient(); + + // Get RGBA values for the gradient boundaries + list($r1, $g1, $b1, $a1) = $this->getColor($gradient->from); + list($r2, $g2, $b2, $a2) = $this->getColor($gradient->to); + + $flashGradient->addEntry(0, $r1, $g1, $b1, $a1); + + if($gradient instanceof awBilinearGradient) { + + $flashGradient->addEntry($gradient->center, $r2, $g2, $b2, $a2); + $flashGradient->addEntry(1, $r1, $g1, $b1, $a1); + + return array($flashGradient, SWFFILL_LINEAR_GRADIENT); + } else { + + $flashGradient->addEntry(1, $r2, $g2, $b2, $a2); + + if($gradient instanceof awLinearGradient) { + return array($flashGradient, SWFFILL_LINEAR_GRADIENT); + } else { + return array($flashGradient, SWFFILL_RADIAL_GRADIENT); + } + } + } +// abstract private function getPolygonPoints(awPolygon $polygon); + +} + +registerClass('MingDriver'); + +/* + * Check for ming presence + */ +if(function_exists('ming_useswfversion') === FALSE) { + awImage::drawErrorFile('missing-ming'); +} + diff --git a/modules/graphartichow/artichow/patterns/BarDepth.php b/modules/graphartichow/artichow/patterns/BarDepth.php new file mode 100644 index 000000000..eaf822f4b --- /dev/null +++ b/modules/graphartichow/artichow/patterns/BarDepth.php @@ -0,0 +1,84 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once ARTICHOW."/BarPlot.class.php"; + +class BarDepthPattern extends Pattern { + + protected function getPlot($y, $depth) { + + $plot = new BarPlot($y, 1, 1, $depth); + + $plot->barShadow->setSize(2); + $plot->barShadow->smooth(TRUE); + $plot->barShadow->setColor(new Color(160, 160, 160, 10)); + + return $plot; + + } + + public function create() { + + $group = new PlotGroup; + $group->setSpace(2, 2, 2, 0); + $group->setPadding(30, 10, NULL, NULL); + + $group->grid->hideVertical(TRUE); + $group->grid->setType(Line::DASHED); + + $yForeground = $this->getArg('yForeground'); + $yBackground = $this->getArg('yBackground'); + + $legendForeground = $this->getArg('legendForeground'); + $legendBackground = $this->getArg('legendBackground'); + + $colorForeground = $this->getArg('colorForeground', new LightBlue(10)); + $colorBackground = $this->getArg('colorBackground', new Orange(25)); + + if($yForeground === NULL) { + awImage::drawError("Class BarDepthPattern: Argument 'yForeground' must not be NULL."); + } + + // Background + if($yBackground !== NULL) { + + $plot = $this->getPlot($yBackground, 6); + $plot->setBarColor($colorBackground); + + $group->add($plot); + if($legendBackground !== NULL) { + $group->legend->add($plot, $legendBackground, Legend::BACKGROUND); + } + + } + + // Foreground + $plot = $this->getPlot($yForeground, 0); + $plot->setBarColor($colorForeground); + + $group->add($plot); + if($legendForeground !== NULL) { + $group->legend->add($plot, $legendForeground, Legend::BACKGROUND); + } + + $group->axis->bottom->hideTicks(TRUE); + + $group->legend->shadow->setSize(0); + $group->legend->setAlign(Legend::CENTER); + $group->legend->setSpace(6); + $group->legend->setTextFont(new Tuffy(8)); + $group->legend->setPosition(0.50, 0.10); + $group->legend->setBackgroundColor(new Color(255, 255, 255, 10)); + $group->legend->setColumns(2); + + return $group; + + } + +} diff --git a/modules/graphartichow/artichow/patterns/LightLine.php b/modules/graphartichow/artichow/patterns/LightLine.php new file mode 100644 index 000000000..156d9aa66 --- /dev/null +++ b/modules/graphartichow/artichow/patterns/LightLine.php @@ -0,0 +1,49 @@ +<?php +/* + * This work is hereby released into the Public Domain. + * To view a copy of the public domain dedication, + * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. + * + */ + +require_once ARTICHOW."/LinePlot.class.php"; + +class LightLinePattern extends Pattern { + + public function create() { + + $legend = $this->getArg('legend'); + + $y = $this->getArg('y'); + + if($y === NULL) { + awImage::drawError("Class LightLinePattern: Argument 'y' must not be NULL."); + } + + $plot = new LinePlot($y); + $plot->setSize(0.7, 1); + $plot->setCenter(0.35, 0.5); + $plot->setPadding(35, 15, 35, 30); + $plot->setColor(new Orange()); + $plot->setFillColor(new LightOrange(80)); + + $plot->grid->setType(Line::DASHED); + + $plot->mark->setType(Mark::CIRCLE); + $plot->mark->setFill(new MidRed); + $plot->mark->setSize(6); + + $plot->legend->setPosition(1, 0.5); + $plot->legend->setAlign(Legend::LEFT); + $plot->legend->shadow->smooth(TRUE); + + if($legend !== NULL) { + $plot->legend->add($plot, $legend, Legend::MARK); + } + + return $plot; + + } + +} diff --git a/modules/graphartichow/config.xml b/modules/graphartichow/config.xml new file mode 100755 index 000000000..9872f11f4 --- /dev/null +++ b/modules/graphartichow/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>graphartichow</name> + <displayName><![CDATA[Artichow]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Artichow is a library which enables the display of simple picture-based graphs using PHP and GD.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[administration]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/graphartichow/de.php b/modules/graphartichow/de.php new file mode 100644 index 000000000..160392a6e --- /dev/null +++ b/modules/graphartichow/de.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphartichow}prestashop>graphartichow_6b1e6241446c46f7ab8d28ae83d53e71'] = 'Artichow'; +$_MODULE['<{graphartichow}prestashop>graphartichow_83196a03f22b50fec58a7fd9507b378a'] = 'Artichow ist eine Bibliothek, die die Anzeige von einfachen Bild-basierten Grafiken mit PHP und GD ermöglicht.'; + +?> \ No newline at end of file diff --git a/modules/graphartichow/en.php b/modules/graphartichow/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/graphartichow/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/graphartichow/es.php b/modules/graphartichow/es.php new file mode 100644 index 000000000..654e22b00 --- /dev/null +++ b/modules/graphartichow/es.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphartichow}prestashop>graphartichow_6b1e6241446c46f7ab8d28ae83d53e71'] = 'Artichow'; +$_MODULE['<{graphartichow}prestashop>graphartichow_83196a03f22b50fec58a7fd9507b378a'] = 'Artichow es una biblioteca que permite mostrar simples gráficos cuadro-base usando el PHP y GD.'; diff --git a/modules/graphartichow/fr.php b/modules/graphartichow/fr.php new file mode 100644 index 000000000..de042a075 --- /dev/null +++ b/modules/graphartichow/fr.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphartichow}prestashop>graphartichow_6b1e6241446c46f7ab8d28ae83d53e71'] = 'Artichow'; +$_MODULE['<{graphartichow}prestashop>graphartichow_83196a03f22b50fec58a7fd9507b378a'] = 'Artichow est une librairie qui permet d\'afficher des graphiques simples basés sur des images utilisant PHP et GD.'; diff --git a/modules/graphartichow/graphartichow.php b/modules/graphartichow/graphartichow.php new file mode 100644 index 000000000..731f3af96 --- /dev/null +++ b/modules/graphartichow/graphartichow.php @@ -0,0 +1,370 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GraphArtichow extends ModuleGraphEngine +{ + private $_graph; + private $_plot = array(); //for simple-layer graphics + private $_group = NULL; //for multi-layer graphics + private $_error = 0; + + function __construct($type = null) + { + if ($type != null) + { + require_once(dirname(__FILE__).'/artichow/Graph.class.php'); + $this->_graph = new Graph(); + $this->_graph->setAntiAliasing(function_exists('imageantialias')); + parent::__construct($type); + } + else + { + $this->name = 'graphartichow'; + $this->tab = 'administration'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + Module::__construct(); + + $this->displayName = $this->l('Artichow'); + $this->description = $this->l('Artichow is a library which enables the display of simple picture-based graphs using PHP and GD.'); + } + } + + function install() + { + return (parent::install() AND $this->registerHook('GraphEngine')); + } + + public static function hookGraphEngine($params, $drawer) + { + return '<img src="'.$drawer.'&width='.$params['width'].'&height='.$params['height'].'" />'; + } + + private function drawLine($values) + { + require_once(dirname(__FILE__).'/artichow/LinePlot.class.php'); + // Single layer + if (!isset($values[0]) OR !is_array($values[0])) + { + $this->_plot = new LinePlot(array_values($values)); + $this->_plot->setFillGradient(new LinearGradient(new Color(255, 246, 211, 20), new Color(240, 225, 160, 50), 90)); + $this->_plot->setColor(new Color(80, 50, 0, 0)); + } + // Multiple layers + else + { + $tabColors = array(new Color(120, 120, 30, 10), new Color(66, 127, 195, 10), new Color(195, 65, 60, 10), new Color(85, 163, 57, 10), new Color(255, 35, 152, 10)); + $tabFilledColors = array(new Color(120, 120, 30, 90), new Color(66, 127, 195, 90), new Color(195, 65, 60, 90), new Color(85, 163, 57, 90), new Color(255, 35, 152, 90)); + + $this->_group = new PlotGroup; + $i = 0; + foreach ($values as $val) + { + $this->_plot[$i] = new LinePlot(array_values($val)); + $this->_plot[$i]->setColor($tabColors[$i % 5]); + $this->_plot[$i]->setFillColor($tabFilledColors[$i % 5]); + $this->_group->add($this->_plot[$i]); + $i++; + } + } + } + + private function drawColumn($values) + { + require_once(dirname(__FILE__).'/artichow/BarPlot.class.php'); + + if (!is_array($values[0])) //simpleline + { + $this->_plot = new BarPlot(array_values($values)); + $this->_plot->label->set(array_values($values)); + $this->_plot->label->setColor(new Color(110, 110, 110)); + $this->_plot->label->move(0, -7); + $this->_plot->label->setAlign(Positionable::CENTER, NULL); + $this->_plot->setBarGradient(new LinearGradient(new Color(254, 255, 216), new Color(233, 231, 218), 90)); + $this->_plot->barBorder->setColor(new Color(115, 115, 150)); + $this->_plot->barShadow->setSize(1); + $this->_plot->barShadow->setColor(new Color(215, 215, 215)); + $this->_plot->barShadow->setPosition(Shadow::RIGHT_TOP); + $this->_plot->barShadow->smooth(TRUE); + } + else + { + $tabColors = array(new Color(120, 120, 30, 10), new Color(66, 127, 195, 10), new Color(195, 65, 60, 10), new Color(85, 163, 57, 10), new Color(255, 35, 152, 10)); + $tabFilledColors = array(new Color(120, 120, 30, 90), new Color(66, 127, 195, 90), new Color(195, 65, 60, 90), new Color(85, 163, 57, 90), new Color(255, 35, 152, 90)); + + $this->_group = new PlotGroup; + $i = 0; + foreach ($values as $val) + { + $this->_plot[$i] = new BarPlot(array_values($val)); + $this->_plot[$i]->label->set(array_values($val)); + $this->_plot[$i]->label->setColor($tabColors[$i % 5]); + $this->_plot[$i]->label->move(0, -7); + $this->_plot[$i]->label->setAlign(Positionable::CENTER, NULL); + $this->_plot[$i]->setBarColor($tabFilledColors[$i % 5]); + $this->_plot[$i]->barBorder->setColor($tabColors[$i % 5]); + $this->_plot[$i]->barShadow->setSize(1); + $this->_plot[$i]->barShadow->setColor(new Color(215, 215, 215)); + $this->_plot[$i]->barShadow->setPosition(Shadow::RIGHT_TOP); + $this->_plot[$i]->barShadow->smooth(TRUE); + $this->_group->add($this->_plot[$i]); + $i++; + } + } + } + + private function setErrorImage() + { + require_once(dirname(__FILE__).'/artichow/BarPlot.class.php'); + + $this->_plot = new BarPlot(array(0)); + $this->_type = 'column'; + $this->_plot->setSize(0, 0); + $this->_plot->setCenter(-20, -20); + } + + private function drawPie($values) + { + require_once(dirname(__FILE__).'/artichow/Pie.class.php'); + $exploder = array(); + $counter = sizeof($values); + + $this->_plot = new Pie(array_values($values), Pie::COLORED); + $this->_plot->set3D(10); + $this->_plot->setLabelPrecision(2); + $this->_plot->setLabelPosition(2); + $this->_plot->legend->shadow->setSize(1); + $this->_plot->legend->setModel(Legend::MODEL_BOTTOM); + $this->_plot->legend->setPosition(NULL, 0.87); + $this->_plot->setSize(0.90, 0.90); + for ($i = 0; $i < $counter; $i++) + $exploder[$i] = 8; + $this->_plot->explode($exploder); + } + + private function drawLineColumn($y_max) + { + if ($this->_group == NULL) + { + $this->_plot->setYMax($y_max); + $this->_plot->setSize(1, 1); + $this->_plot->setCenter(0.508, 0.53); + $this->_plot->setPadding(28, 10, NULL, 40); + } + else + { + foreach ($this->_plot as $plot) + $plot->setYMax($y_max); + $this->_group->setYMax($y_max); + $this->_group->setSize(1, 1); + $this->_group->setCenter(0.508, 0.53); + $this->_group->setPadding(28, 10, NULL, 40); + } + } + + public function createValues($values) + { + // $this->_values = array(); + // if (!isset($this->_values[0]) || !is_array($this->_values[0])) + // foreach ($values as $value) + // $this->_values[] = $value; + // else + // { + // foreach ($values as $i => $layerValue) + // { + // $this->_values[$i] = array(); + // foreach ($values[$i] as $value) + // $this->_values[$i][] = $value; + // } + // } + // $values = $this->_values; + + if (sizeof($values) == 0) + { + $this->setErrorImage(); + return; + } + switch ($this->_type) + { + case 'pie': + $this->drawPie($values); + break; + case 'line': + $this->drawLine($values); + $this->drawLineColumn($this->getYMax($values)); + break; + case 'column': + default: + $this->drawColumn($values); + $this->drawLineColumn($this->getYMax($values)); + break; + } + } + + public function setSize($width, $height) + { + if (Validate::isUnsignedInt($width) AND Validate::isUnsignedInt($height)) + $this->_graph->setSize($width, $height); + } + + public function setLegend($legend) + { + $this->_legend = array(); + if (!isset($this->_legend[0]) || !is_array($this->_legend[0])) + foreach ($legend as $label) + $this->_legend[] = $label; + else + { + foreach ($legend as $i => $layerlabel) + { + $this->_legend[$i] = array(); + foreach ($legend[$i] as $label) + $this->_legend[$i][] = $label; + } + } + $legend = $this->_legend; + + if ($this->_plot == NULL && $this->_group == NULL) + return; + foreach ($legend as $k => $val) + $legend[$k] = html_entity_decode(htmlentities(html_entity_decode($val), ENT_NOQUOTES, 'utf-8')); + switch ($this->_type) + { + case 'pie': + $this->_plot->setLegend($legend); + break; + case 'column': + default: + if ($this->_group == NULL) + { + if (isset($this->_plot->xAxis, $this->_plot->yAxis, $this->_plot->grid)) + { + $this->_plot->xAxis->setLabelText($legend); + $this->_plot->xAxis->label->setFont(new Tuffy(7)); + $this->_plot->yAxis->setLabelPrecision(0); + $this->_plot->grid->setType(Line::DASHED); + } + } + else + { + if (isset($this->_group->axis->bottom, $this->_group->axis->left, $this->_group->grid)) + { + $this->_group->axis->bottom->setLabelText($legend); + $this->_group->axis->bottom->label->setFont(new Tuffy(7)); + $this->_group->axis->left->setLabelPrecision(0); + $this->_group->grid->setType(Line::DASHED); + } + } + break; + } + } + + public function setTitles($titles) + { + if ($this->_plot == NULL && $this->_group == NULL) + return; + if (isset($titles['main'])) + { + if (is_array($titles['main']) && $this->_group != NULL) + { + $i = 0; + foreach ($titles['main'] as $key => $val) + if ($key != 0) + $this->_group->legend->add($this->_plot[$i++], $val, ($this->_type == 'line') ? Legend::LINE : Legend::BACKGROUND); + $titles['main'] = $titles['main'][0]; + } + $this->_graph->title->set($titles['main']); + $this->_graph->title->setFont(new Tuffy(10)); + $this->_graph->title->setAlign(Positionable::CENTER, Positionable::MIDDLE); + } + if (isset($titles['x'])) + { + if ($this->_plot != NULL && !is_array($this->_plot)) + { + $this->_plot->xAxis->title->set($titles['x']); + $this->_plot->xAxis->title->setFont(new Tuffy(10)); + $this->_plot->xAxis->setTitleAlignment(Label::RIGHT); + } + else + { + $this->_group->axis->bottom->title->set($titles['x']); + $this->_group->axis->bottom->title->setFont(new Tuffy(10)); + $this->_group->axis->bottom->setTitleAlignment(Label::RIGHT); + } + } + if (isset($titles['y'])) + { + if ($this->_plot != NULL && !is_array($this->_plot)) + { + $this->_plot->yAxis->title->set($titles['y']); + $this->_plot->yAxis->title->setFont(new Tuffy(10)); + $this->_plot->yAxis->setTitleAlignment(Label::TOP); + } + else + { + $this->_group->axis->left->title->set($titles['y']); + $this->_group->axis->left->title->setFont(new Tuffy(10)); + $this->_group->axis->left->setTitleAlignment(Label::TOP); + } + } + } + + public function draw() + { + if ($this->_plot != NULL && !is_array($this->_plot)) + $this->_graph->add($this->_plot); + if ($this->_group != NULL) + $this->_graph->add($this->_group); + $this->_graph->draw(); + } + + private function getYMax($values) + { + $max = 0; + if (isset($values[0]) && is_array($values[0])) + { + foreach ($values as $val) + foreach ($val as $k => $nb) + if ($nb > $max) + $max = $nb; + } + else + { + foreach ($values as $k => $val) + if ($val > $max) + $max = $val; + } + return ($max < 4) ? 4 : (round($max, 0)); + } +} + + diff --git a/modules/graphartichow/it.php b/modules/graphartichow/it.php new file mode 100644 index 000000000..c542ed023 --- /dev/null +++ b/modules/graphartichow/it.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphartichow}prestashop>graphartichow_6b1e6241446c46f7ab8d28ae83d53e71'] = 'Artichow'; +$_MODULE['<{graphartichow}prestashop>graphartichow_83196a03f22b50fec58a7fd9507b378a'] = 'Artichow è una libreria che permette la visualizzazione di grafici semplici basati su immagini con PHP e GD.'; + +?> \ No newline at end of file diff --git a/modules/graphartichow/logo.gif b/modules/graphartichow/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed937ee8bf2c8b003c0df38bf84728140680d002 GIT binary patch literal 1042 zcmZ?wbhEHb6krfw_|CvkCni=WE?zGo(I6?=ASKl(Bhw@++axE~EHB@psMw;U)T*r9 zs-n`Ss@krm)~>GJuA$YTsoANe)vc%3YiQVOWYlM3(r02i(aLIyy?vi^;8aJa=`JqQ zJw0c*yU+IVnd9p_*WZ6`K)~Y2$YqI%OOsNTr>3n)PF`PBvaYCfV@b)T($X!})%zw+ z+&^*h?%gjAPo8{e%9JBBW*nO{=fvE(N9Qj(xp3jR)vM31S#x&H`jcz6T-m<;+MWY9 z4;;98@W{=hr|zFRb>jG|6DMAuI`!uC>33((zBzmL-G!46FI;$k>C*cLCr>^&d-ma_ zOHYC5%9SVAufMo;>*d|M&mTN}^YG!@M~~h-fBp8wo3}6CK79E3(W9?Vo_u`q;^WJg zU*5j`^zQBFcke#Dd-wUxoA2-5efjw6)#vx`KYsl9>C>mrpFe;2@b$xoZy!E<|Mcnm zmyaL6eg6FI%a^ZTzkd1h{Tm2;|MKO>k8j_8e*gaC$B&;sfBpi2-@ktS0Ro0mFla(R z@h1x-1H*p?9gvGad4hrCJ;PIup5kM?-OPL`djvI(^Eg|wG)gcqG#ub-OO@Ma=*;BM z%)wx@Mev8~<H;<HRW6YR587lb^xF(-E;BVWsCqjTDFnN4OIbVIELq^8z;Kkos-?j( zc$wy8CJ{!B2@ZjWr|Bg%-0Bqk+B{i9ghAnlqT1QH)@2R>a~z(&;px)cGh;7vYoo7p z`g@s1h6jyPOe#J+Fo;U@NicQv30T7@(a+VT&GgvtkZL;vgX*Ox3nw33Hp!;)kV<6n zQKkm&&~GL?Z5ExIXXA41L|Nd(_PN3gE<QImt8<H46g-Q#$-uzcD`4RE?qYLFU-5H0 Kp#%;N25SJcE?n&Z literal 0 HcmV?d00001 diff --git a/modules/graphgooglechart/config.xml b/modules/graphgooglechart/config.xml new file mode 100755 index 000000000..83b2740be --- /dev/null +++ b/modules/graphgooglechart/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>graphgooglechart</name> + <displayName><![CDATA[Google Chart]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[The Google Chart API lets you dynamically generate charts.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[administration]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/graphgooglechart/de.php b/modules/graphgooglechart/de.php new file mode 100644 index 000000000..25430ee14 --- /dev/null +++ b/modules/graphgooglechart/de.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_b3b8abce7e542a30dc415f612d4e0f23'] = 'Google Chart'; +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_e01118a336bd13f2f0e70bf7178c1fdc'] = 'Mit der Google Chart API können Sie dynamische Charts generieren.'; + +?> \ No newline at end of file diff --git a/modules/graphgooglechart/en.php b/modules/graphgooglechart/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/graphgooglechart/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/graphgooglechart/es.php b/modules/graphgooglechart/es.php new file mode 100644 index 000000000..8ecd452b0 --- /dev/null +++ b/modules/graphgooglechart/es.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_b3b8abce7e542a30dc415f612d4e0f23'] = 'Carta Google '; +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_e01118a336bd13f2f0e70bf7178c1fdc'] = 'La carta API de Google le permite generar dinámicamente sus cartas.'; diff --git a/modules/graphgooglechart/fr.php b/modules/graphgooglechart/fr.php new file mode 100644 index 000000000..bbf436577 --- /dev/null +++ b/modules/graphgooglechart/fr.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_b3b8abce7e542a30dc415f612d4e0f23'] = 'Google Chart'; +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_e01118a336bd13f2f0e70bf7178c1fdc'] = 'L\'API Google Chart permet de générer dynamiquement des graphiques.'; diff --git a/modules/graphgooglechart/graphgooglechart.php b/modules/graphgooglechart/graphgooglechart.php new file mode 100644 index 000000000..7f4aeba49 --- /dev/null +++ b/modules/graphgooglechart/graphgooglechart.php @@ -0,0 +1,248 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GraphGoogleChart extends ModuleGraphEngine +{ + private $_width; + private $_height; + private $_values; + private $_legend; + private $_titles; + + function __construct($type = null) + { + if ($type != null) + { + parent::__construct($type); + } + else + { + $this->name = 'graphgooglechart'; + $this->tab = 'administration'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + Module::__construct(); + + $this->displayName = $this->l('Google Chart'); + $this->description = $this->l('The Google Chart API lets you dynamically generate charts.'); + } + } + + function install() + { + return (parent::install() AND $this->registerHook('GraphEngine')); + } + + public static function hookGraphEngine($params, $drawer) + { + return '<img src="'.$drawer.'&width='.$params['width'].'&height='.$params['height'].'" />'; + } + + + public function createValues($values) + { + $this->_values = $values; + } + + public function setSize($width, $height) + { + $this->_width = $width; + $this->_height = $height; + } + + public function setLegend($legend) + { + $this->_legend = $legend; + } + + public function setTitles($titles) + { + $this->_titles = $titles; + } + + private function getChbh($sizeof_values) + { + $chbh = 12; + + if ($sizeof_values < 25) + $chbh += 4; + if ($sizeof_values < 20) + $chbh += 4; + if ($sizeof_values < 15) + $chbh += 8; + if ($sizeof_values < 10) + $chbh += 14; + return ($chbh); + } + + private function drawColumn($max_y) + { + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + $sizeof_values = sizeof($this->_values); + else + $sizeof_values = sizeof($this->_values[0]); + $url = 'bvs&chxt=x,y&chxr=1,0,'.$max_y.'&chbh='.$this->getChbh($sizeof_values).'&chg=0,12.5&chxl=0:|'; + for ($i = 0; $i < $sizeof_values; $i++) + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + { + if (isset($this->_values[$i])) + $this->_values[$i] = ($this->_values[$i] * 100) / $max_y; + else + $this->_values[$i] = 0; + } + else + foreach ($this->_values as $k => $value) + { + if (!isset($this->_values[$k][$i])) + $this->_values[$k][$i] = 0; + $this->_values[$k][$i] = ($this->_values[$k][$i] * 100) / $max_y; + } + return ($url); + } + + private function drawLine($max_y) + { + return ('lc'./*&chxt=x,y*/'&chbh='.$this->getChbh(sizeof($this->_values)).'&chg=0,12.5&chxl=0:|'); + } + + private function drawPie() + { + return ('p3&chl='); + } + + public function draw() + { + $url = 'http://chart.apis.google.com/chart?cht='; + $legend = ''; + $values = ''; + $scale = ''; + + switch ($this->_type) + { + case 'pie': + $url .= $this->drawPie(); + break; + case 'line': + $url .= $this->drawLine($this->getYMax($this->_values)); + case 'column': + default: + $url .= $this->drawColumn($this->getYMax($this->_values)); + break; + } + + foreach ($this->_legend as $label) + $legend .= $label.'|'; + $url .= htmlentities(urlencode(html_entity_decode(rtrim($legend, '|')))); + + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + { + foreach ($this->_values as $label) + $values .= ($label ? $label : '0').','; + $url .= '&chd=t:'.urlencode(rtrim($values, ',')); + } + else + { + $i = 0; + $url .= '&chd=t:'; + foreach ($this->_values as $val) + { + $values = ''; + if ($i++ > 0) + $url .= '|'; + foreach ($val as $label) + $values .= ($label ? $label : '0').','; + $url .= urlencode(rtrim($values, ',')); + } + } + + $url .= '&chs='.(int)($this->_width).'x'.(int)($this->_height); + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + $url .= (isset($this->_titles['main'])) ? '&chtt='.urlencode($this->_titles['main']) : ''; + else + { + $url .= $this->getStringColor(sizeof($this->_values)); + $i = 0; + foreach ($this->_titles['main'] as $val) + { + if ($i == 0 && !empty($this->_titles['main'])) + $url .= '&chtt='.urlencode($this->_titles['main'][$i]); + else if ($i == 1) + $url .= '&chdl='; + else if ($i > 1) + $url .= '|'; + if ($i != 0) + $url .= urlencode($this->_titles['main'][$i]); + $i++; + } + } + header("Content-type: image/png"); + readfile($url); + } + + private function getYMax($values) + { + $max = 0; + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + { + foreach ($values as $k => $val) + if ($val > $max) + $max = $val; + } + else + { + foreach ($values as $value) + foreach ($value as $val) + if ($val > $max) + $max = $val; + } + return ($max < 4) ? 4 : (round($max, 0)); + } + + private function getStringColor($nb_colors) + { + $tabColors = array('ffb649', '427fc3', 'ff0000', '55a339', 'ff2398'); + $color = ''; + if ($nb_colors > 1) + { + $color = '&chco='; + for ($i = 0; $i < $nb_colors; $i++) + { + if ($i > 0) + $color .= ','; + $color .= $tabColors[$i % 5]; + } + } + return $color; + } +} + + diff --git a/modules/graphgooglechart/it.php b/modules/graphgooglechart/it.php new file mode 100644 index 000000000..f2a4c600a --- /dev/null +++ b/modules/graphgooglechart/it.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_b3b8abce7e542a30dc415f612d4e0f23'] = 'Google Chart'; +$_MODULE['<{graphgooglechart}prestashop>graphgooglechart_e01118a336bd13f2f0e70bf7178c1fdc'] = 'Google Chart API permette di generare dinamicamente grafici.'; + +?> \ No newline at end of file diff --git a/modules/graphgooglechart/logo.gif b/modules/graphgooglechart/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f5d64543948d757aff4bd67d43500f25a80b423 GIT binary patch literal 953 zcmb`Gu}hW#5XLVkRLamL{K6rJ!oeXrgu=k4N?Jn9sR#>hhzJYEAQzQ_Xp=4{p&?y_ zAQ5aZLkPJ+2cz8jACf4r>v!+p(80(1-FJ7-J<oIRcWvbA#Y+?2(k;KFV!HWEH;-wu z>57ewjpX-~Y#u!MM)2GJ3l%XD7m3<LrYdTpE*hd)MN=^obFmQ1>U9-2aTgEqtkF;j zlW>WUD5jDsX_77(&@SMD28&_3v-VV&s;h=-)><+%HCGF@EEW{q)LlK)vq;e!rr{c) zk#J;G(==T(G}#Jkz#t7vXi;M^*g%8DaF(FT2{#L~EPbpcb2kt3EV;0t7;X_3iF!!U zYw4C@i9Gy(Cezq~en_AY)__48mbAiy#b5&sR+e*BCMUu@%SiOGmMp>}@fEqSpy(N% z_=wXO0594x8nsx7AJAkPJK%(16v7%XNHYm7c(533ptDX?-IU3R<YE|!KGu>&^OBXX z&AqGGoUm+eu2Q{?(dByMU5z$&)Daqmh18I)n>0KMxPj(%;7XW>CRX+RK6*r?O9tw# zuK$Fz&r5dnu62$N-r8I3yxo6(esOqtbZLKc=EmS`o;(~mc(p(LEXN)%ZcgsakDX~f z`q@9Z&^O%E_Woh}eT$j7)o&la?{=Mddb#yvw>9<Sb<a@8-}U~Totv|J<E<B4$G&bn zxUlx_-u0Jn7JGWzmbbU3CI;RfUpjpLX{+n=%0%0rg)e7k`>u@MJ$Ep-()uuVXZ=*? I=`I=i2V69vdH?_b literal 0 HcmV?d00001 diff --git a/modules/graphvisifire/config.xml b/modules/graphvisifire/config.xml new file mode 100755 index 000000000..d01a43c73 --- /dev/null +++ b/modules/graphvisifire/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>graphvisifire</name> + <displayName><![CDATA[Visifire]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Visifire is a set of open source data visualization components - powered by Microsoft Silverlight 2 beta 2.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[administration]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/graphvisifire/de.php b/modules/graphvisifire/de.php new file mode 100644 index 000000000..d99d49aa0 --- /dev/null +++ b/modules/graphvisifire/de.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphvisifire}prestashop>graphvisifire_46495d329b07c973daa82a7a9c084d6b'] = 'Visifire'; +$_MODULE['<{graphvisifire}prestashop>graphvisifire_9c3adc09754ac25e4ed1da6176c0e74c'] = 'Visifire ist eine Reihe von Open-Source-Komponenten zur Datenvisualisierung - powered by Microsoft Silverlight 2 Beta 2.'; + +?> \ No newline at end of file diff --git a/modules/graphvisifire/en.php b/modules/graphvisifire/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/graphvisifire/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/graphvisifire/es.php b/modules/graphvisifire/es.php new file mode 100644 index 000000000..187813949 --- /dev/null +++ b/modules/graphvisifire/es.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphvisifire}prestashop>graphvisifire_46495d329b07c973daa82a7a9c084d6b'] = 'Visifire'; +$_MODULE['<{graphvisifire}prestashop>graphvisifire_9c3adc09754ac25e4ed1da6176c0e74c'] = 'Visifire es un conjunto de datos de código abierto componentes de visualización - Powered by Microsoft Silverlight 2 beta 2.'; diff --git a/modules/graphvisifire/fr.php b/modules/graphvisifire/fr.php new file mode 100644 index 000000000..0d4e40bc9 --- /dev/null +++ b/modules/graphvisifire/fr.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphvisifire}prestashop>graphvisifire_46495d329b07c973daa82a7a9c084d6b'] = 'Visifire'; +$_MODULE['<{graphvisifire}prestashop>graphvisifire_9c3adc09754ac25e4ed1da6176c0e74c'] = 'Visifire est un pack de composants permettant de visualiser graphiquement des données. Il utilise la technologie Microsoft Silverlight 2 beta 2.'; diff --git a/modules/graphvisifire/graphvisifire.php b/modules/graphvisifire/graphvisifire.php new file mode 100644 index 000000000..3753cfc5f --- /dev/null +++ b/modules/graphvisifire/graphvisifire.php @@ -0,0 +1,187 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GraphVisifire extends ModuleGraphEngine +{ + private $_xml; + private $_values = NULL; + private $_legend = NULL; + private $_titles = NULL; + + function __construct($type = null) + { + if ($type != null) + { + $this->_xml = '<vc:Chart xmlns:vc="clr-namespace:Visifire.Charts;assembly=Visifire.Charts" BorderThickness="0" AnimationEnabled="True" AnimationType="Type5"'; + if ($type == 'pie' || $type == 'line') + $this->_xml .= ' Theme="Theme1" View3D="True"'; + else + $this->_xml .= ' Theme="Theme2" ColorSet="Visifire2" UniqueColors="True"'; + $this->_xml .= '>'; + parent::__construct($type); + } + else + { + $this->name = 'graphvisifire'; + $this->tab = 'administration'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + Module::__construct(); + + $this->displayName = $this->l('Visifire'); + $this->description = $this->l('Visifire is a set of open source data visualization components - powered by Microsoft Silverlight 2 beta 2.'); + } + } + + function install() + { + return (parent::install() AND $this->registerHook('GraphEngine')); + } + + public static function hookGraphEngine($params, $drawer) + { + static $divid = 1; + return '<script type="text/javascript" src="../modules/graphvisifire/visifire/Visifire.js"></script> + <div id="VisifireChart'.$divid.'"> + <script language="javascript" type="text/javascript"> + var vChart = new Visifire("../modules/graphvisifire/visifire/Visifire.xap", '.$params['width'].', '.$params['height'].'); + vChart.setLogLevel(0); + vChart.setDataUri(\''.$drawer.'\'); + vChart.render("VisifireChart'.$divid++.'"); + </script> + </div>'; + } + + public function createValues($values) + { + $this->_values = array(); + if (!is_array($values[array_rand($values)])) + foreach ($values as $value) + $this->_values[] = $value; + else + { + foreach ($values as $i => $layerValue) + { + $this->_values[$i] = array(); + foreach ($layerValue as $value) + $this->_values[$i][] = $value; + } + } + } + + public function setSize($width, $height) + { + // Unavailable + } + + public function setLegend($legend) + { + $this->_legend = array(); + if (!is_array($legend[array_rand($legend)])) + foreach ($legend as $label) + $this->_legend[] = $label; + else + { + foreach ($legend as $i => $layerlabel) + { + $this->_legend[$i] = array(); + foreach ($layerlabel as $label) + $this->_legend[$i][] = $label; + } + } + } + + public function setTitles($titles) + { + $this->_titles = $titles; + if (isset($titles['main']) && !is_array($titles['main'])) + $this->_xml .= '<vc:Title Text="'.$titles['main'].'"/>'; + if (is_array($titles['main']) && isset($titles['main'][0])) + $this->_xml .= '<vc:Title Text="'.$titles['main'][0].'"/>'; + if (isset($titles['x'])) + $this->_xml .= '<vc:AxisX Title="'.$titles['x'].'" />'; + if (isset($titles['y'])) + $this->_xml .= '<vc:AxisY Title="'.$titles['y'].'" />'; + } + + public function draw() + { + header('content-type: text/xml'); + if ($this->_values != NULL && $this->_legend != NULL) + { + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + $size = sizeof($this->_values); + else + $size = sizeof($this->_values[0]); + if ($size == sizeof($this->_legend)) + { + if (!is_array($this->_values[array_rand($this->_values)])) + { + $this->_xml .= '<vc:DataSeries RenderAs="'.$this->_type.'">'; + for ($i = 0; $i < $size; $i++) + { + $this->_xml .= '<vc:DataPoint '; + $this->_xml .= 'AxisLabel=" '.str_replace('<', '&lt;', str_replace('>', '&gt;', str_replace('&', '&amp;', str_replace('&quot', "'", $this->_legend[$i])))).'" '; + $this->_xml .= 'YValue="'.$this->_values[$i].'"'; + if ($this->_type == 'pie') + $this->_xml .= ' ExplodeOffset="0.2"'; + $this->_xml .= '/>'; + } + $this->_xml .= '</vc:DataSeries>'; + } + else + { + foreach ($this->_values as $layer => $values) + { + $this->_xml .= '<vc:DataSeries Name="'.(isset($this->_titles['main'][$layer+1]) ? $this->_titles['main'][$layer+1] : '').'" RenderAs="'.$this->_type.'">'; + foreach ($values as $i => $value) + { + $this->_xml .= '<vc:DataPoint '; + if ($layer == 0) + $this->_xml .= 'AxisLabel=" '.str_replace('<', '&lt;', str_replace('>', '&gt;', str_replace('&', '&amp;', str_replace('&quot', "'", $this->_legend[$i])))).'" '; + $this->_xml .= 'YValue="'.$value.'"'; + if ($this->_type == 'pie') + $this->_xml .= ' ExplodeOffset="0.2"'; + $this->_xml .= '/>'; + } + $this->_xml .= '</vc:DataSeries>'; + } + } + } + } + $this->_xml .= '</vc:Chart>'; + echo $this->_xml; + exit(1); + } +} + + diff --git a/modules/graphvisifire/it.php b/modules/graphvisifire/it.php new file mode 100644 index 000000000..8d3d18379 --- /dev/null +++ b/modules/graphvisifire/it.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphvisifire}prestashop>graphvisifire_46495d329b07c973daa82a7a9c084d6b'] = 'Visifire'; +$_MODULE['<{graphvisifire}prestashop>graphvisifire_9c3adc09754ac25e4ed1da6176c0e74c'] = 'Visifire è un insieme di componenti di visualizzazione dei dati open source powered by Microsoft Silverlight 2 beta 2.'; + +?> \ No newline at end of file diff --git a/modules/graphvisifire/logo.gif b/modules/graphvisifire/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..df365f2d3609317db7852d0eede3a0a19d14cdd3 GIT binary patch literal 1012 zcmeH`>r0bS9DvX3a=okttD$9CDavxOOxV!OKFBJaVkQ+~Udlp<9F~stt-@K#OewV# zyFglkORPjO3n|+)l&mPRGDV!1WrQ@RyPWf0&ae72f}X$N;ejVLEoFD&DFsrX074MO zfCf=b2xwW*$siF?tpZXI=;bthBh3tl!w8N_;g}S15#%8_i=Ze7j1n*-u`oe2>ZmD- znzmDOl#r_z^7O))RQ^&iSP+ymP$q?I4Ad~tz(8X#)UAc4AgEWsEhW7kL95lYMonu~ z&?W&}Fztw>ZSnNQF8V5ovzYkW3w%SV*qtHv9~T}L3T;Jve+eB)paaQtXrDN6LU0(x zvCHE4Mee4RyJIEyZjifmTx&IHxs7`|aL;4h*GcRhWT=z>*vyZ&^W)FC$v$DBSD1Z? z-`nv!2mUrhCWggDM__I$FgH!+Mv3bSS(*;GoL=`YzuV1uX1S#Weq|o7xOwdMFME8; z%RZma@Anh$5(#)Y;v+bKF(!m?9Ebk%uN8<StC&9*AkAO#zfU0c6PjYpTB$X}vZq;| z7ZWF!Z#_A&h+8UWUdL#1yhu6lrm><}|KL%ie$W~opN<X6F4rcNN<SR!2^y?Y8FQYM zmOHK-y1#9&IolH*y?N&jRZRX{-GR{f(<O$o<ev7=Y{Foc-RZP^eOj<3+tzi}Uf#VX zwmE;YpsHR{GBavZ^gdaymdSn`jB};0ld;~=tcZ${O2n|N$Mjv^7$#AicbZgH3<?|8 ooy$m(AW7PXCbe=uTCKGm8BxTwX8epbSX(oT=M5Xi7zQQ%201G{;s5{u literal 0 HcmV?d00001 diff --git a/modules/graphvisifire/visifire/Visifire.js b/modules/graphvisifire/visifire/Visifire.js new file mode 100644 index 000000000..6cf9d76c1 --- /dev/null +++ b/modules/graphvisifire/visifire/Visifire.js @@ -0,0 +1,353 @@ +/* + Copyright (C) 2008 Webyog Softworks Private Limited + + This file is a part of Visifire Charts. + + Visifire is a free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + You should have received a copy of the GNU General Public License + along with Visifire Charts. If not, see <http://www.gnu.org/licenses/>. + + If GPL is not suitable for your products or company, Webyog provides Visifire + under a flexible commercial license designed to meet your specific usage and + distribution requirements. If you have already obtained a commercial license + from Webyog, you can use this file under those license terms. +*/ + +if(!window.Visifire) +{ + // Visifire class + window.Visifire = function(pXapPath, pId, pWidth, pHeight, pBackground) + { + this.id = null; + this.logLevel = 1; // Determines whether to log or not. + this.xapPath = "Visifire.xap"; // Default is taken as Visifire.xap in the same directory. + this.targetElement = null; + this.dataXml = null; + this.dataUri = null; + this.listeners = null; + this.elements = new Array("Chart", "DataPoint", "Title", "AxisX", "AxisY", "Legend"); + this.events = new Array("MouseLeftButtonDown", "MouseLeftButtonUp", "MouseMove", "MouseEnter", "MouseLeave"); + this.windowless = false; + this.width = null; + this.height = null; + this.background = null; + + // pId not present + if(Number(pId)) + { + if(pHeight) + this.background = pHeight; + + pHeight = pWidth; + pWidth = pId; + } + else // pId present + { + this.id = pId; + + if(pBackground) + this.background = pBackground; + } + + if(pXapPath) + this.xapPath = pXapPath; + + if(pWidth) + this.width = pWidth; + + if(pHeight) + this.height = pHeight; + + this._uThisObject = this; + + this.index = ++Visifire._slCount; + } + + window.Visifire._slCount = 0; + + Visifire.prototype.setWindowlessState = function(pWindowless) + { + if(pWindowless != null) + { + this.windowless = Boolean(pWindowless); + } + } + + Visifire.prototype._getSlControl = function () + { + var _uThisObject = this; + if(_uThisObject.id != null) + { + var slControl = document.getElementById(_uThisObject.id); + return slControl; + } + + return null; + } + + Visifire.prototype.isLoaded = function() + { + var slControl = this._getSlControl(); + try + { + if(slControl.Content.wrapper != null) + return true; + } + catch(ex) + { + return false; + } + } + Visifire.prototype.isDataLoaded = function() + { + var slControl = this._getSlControl(); + + return slControl.Content.wrapper.IsDataLoaded; + } + Visifire.prototype.setSize = function(pWidth,pHeight) + { + var slControl = this._getSlControl(); + if(slControl != null) + { + slControl.width = pWidth; + slControl.height = pHeight; + slControl.Content.wrapper.Resize(pWidth,pHeight); + } + else + { + this.width = pWidth; + this.height = pHeight; + } + } + + Visifire.prototype.setDataXml = function(pDataXml) + { + var slControl = this._getSlControl(); + + if(slControl != null && this.dataXml != null) + { + slControl.Content.wrapper.AddDataXML(pDataXml); + } + + this.dataXml = pDataXml; + } + + + Visifire.prototype.setDataUri = function(pDataUri) + { + var slControl = this._getSlControl(); + + if(slControl != null && this.dataUri != null) + { + slControl.Content.wrapper.AddDataUri(pDataUri); + } + + this.dataUri = pDataUri; + } + + Visifire.prototype.setLogLevel = function(level) + { + if(level != null) + { + this.logLevel = level; + } + } + + Visifire.prototype._isString = function() + { + if (typeof arguments[0] == 'string') return true; + + if (typeof arguments[0] == 'object') + { + var criterion = arguments[0].constructor.toString().match(/string/i); + return (criterion != null); + } + + return false; + } + + Visifire.prototype._validateChartElement = function(pElement) + { + if(this.logLevel != 0) + { + for(var i = 0; i < this.elements.length; i++) + if(this.elements[i] == pElement) + return; + + alert('Error occurred while attaching event.\nUnknown element "' + pElement + '".'); + } + } + + Visifire.prototype._validateEvent = function(pEvent) + { + if(this.logLevel != 0) + { + for(var i = 0; i < this.events.length; i++) + if(this.events[i] == pEvent) + return; + + alert('Error occurred while attaching event.\nUnsupported event type "' + pEvent + '".'); + } + } + + Visifire.prototype.attachEvent = function(pElement, pEvent, pCallBack) + { + var _uThisObject = this; + + _uThisObject._validateChartElement(pElement); + _uThisObject._validateEvent(pEvent); + + if(pEvent && pElement && pCallBack) + { + if(_uThisObject.listeners == null) + _uThisObject.listeners = {}; + + if(_uThisObject.listeners[pEvent] == null) + _uThisObject.listeners[pEvent] = new Array(); + + if(!window["dispatchEvent" + _uThisObject.index]) + window["dispatchEvent" + _uThisObject.index] = function(args) + { + if(_uThisObject.listeners[args.Event] != null) + { + var listener = _uThisObject.listeners[args.Event]; + if(listener.length != 0) + { + for (var i = 0; i < listener.length; i++) + { + if ((listener[i].event == args.Event) && (listener[i].element == args.Element)) + { + args.ControlId = _uThisObject.id; + + if(_uThisObject._isString(listener[i].fire)) + eval(listener[i].fire + "(args)"); + else + listener[i].fire(args); + } + } + } + } + }; + + _uThisObject.listeners[pEvent].push({element: pElement, event: pEvent, fire: pCallBack}); + } + } + + Visifire.prototype._render = function(pTargetElement) + { + var _uThisObject = this; + var width; + var height; + + _uThisObject.targerElement = (typeof(pTargetElement) == "string")?document.getElementById(pTargetElement):pTargetElement; + + if(_uThisObject.width != null) + width = _uThisObject.width; + else if(_uThisObject.targerElement.offsetWidth != 0) + width = _uThisObject.targerElement.offsetWidth; + else + width = 500; + + if(_uThisObject.height != null) + height = _uThisObject.height; + else if(_uThisObject.targerElement.offsetHeight != 0) + height = _uThisObject.targerElement.offsetHeight; + else + height = 300; + + if(!_uThisObject.id) + { + _uThisObject.id = 'VisifireControl' + _uThisObject.index; + } + + var html = '<object id="' + _uThisObject.id + '" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="' + width + '" height="' + height + '">'; + + html += '<param name="source" value="' + _uThisObject.xapPath +'"/>' + + '<param name="onLoad" value="slLoaded' + _uThisObject.index +'"/>' + + '<param name="onResize" value="slResized' + _uThisObject.index +'"/>'; + html += '<param name="initParams" value="'; + + html += "logLevel=" + _uThisObject.logLevel + ","; + + if(_uThisObject.dataXml != null) + { + window["getDataXml"+_uThisObject.index] = function(sender, args) + { + var _uThisObj = _uThisObject; + return _uThisObj.dataXml; + }; + + html += 'dataXml=getDataXml'+ _uThisObject.index +','; + } + else if(_uThisObject.dataUri != null) + { + html += 'dataUri='+ _uThisObject.dataUri +','; + } + + if(_uThisObject.listeners != null) + { + html += 'EventDispatcher=dispatchEvent' + _uThisObject.index + ','; + + html += 'jsEvents='; + + var events = _uThisObject.events; + + for(var i=0; i< events.length; i++) + { + var listener = _uThisObject.listeners[events[i]]; + + if(listener != null) + { + for (var j = 0; j < listener.length; j++) + { + html += listener[j].element + ' ' + listener[j].event + ';'; + } + } + } + + html += ',' + } + + + if(_uThisObject.background == null) + _uThisObject.background = "White"; + + html += 'width=' + width + ',' + 'height=' + height + ''; + html += "\"/>"; + html += '<param name="enableHtmlAccess" value="true" />' + + '<param name="background" value="' + _uThisObject.background + '" />' + + '<param name="windowless" value="' + this.windowless + '" />' + + '<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">' + + '<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>' + + '<br/>You need Microsoft Silverlight to view Visifire Charts.' + + '<br/> You can install it by clicking on this link.' + + '<br/>Please restart the browser after installation.' + + '</a>' + + '</object>'; + + this.targerElement.innerHTML = html; + } + + Visifire.prototype._reRender = function(pSlControl) + { + pSlControl.Content.wrapper.ReRenderChart(); + } + + Visifire.prototype.render = function(pTargetElement) + { + var slControl = this._getSlControl(); + + if(slControl == null) + { + this._render(pTargetElement); + } + else + { + this._reRender(slControl); + } + } +} \ No newline at end of file diff --git a/modules/graphvisifire/visifire/Visifire.xap b/modules/graphvisifire/visifire/Visifire.xap new file mode 100644 index 0000000000000000000000000000000000000000..5896c90db40c37cf71afdef1a8aa7a752f6b51d6 GIT binary patch literal 152606 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/config.xml b/modules/graphxmlswfcharts/config.xml new file mode 100755 index 000000000..702884f8d --- /dev/null +++ b/modules/graphxmlswfcharts/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>graphxmlswfcharts</name> + <displayName><![CDATA[XML/SWF Charts]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[XML/SWF Charts is a simple, yet powerful tool using Adobe Flash to create attractive web charts and graphs from dynamic data.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[administration]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/graphxmlswfcharts/de.php b/modules/graphxmlswfcharts/de.php new file mode 100644 index 000000000..b79ecf496 --- /dev/null +++ b/modules/graphxmlswfcharts/de.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_fd1d6df8df2837bc1690e3ca9d84f502'] = 'XML / SWF Charts'; +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_f0f38a8ecaa33a7db97194b325992d1b'] = 'XML / SWF Charts ist ein einfaches, aber leistungsfähiges Werkzeug mit Adobe Flash, um attraktive Web-Diagramme und Grafiken aus dynamischen Daten zu erstellen.'; + +?> \ No newline at end of file diff --git a/modules/graphxmlswfcharts/en.php b/modules/graphxmlswfcharts/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/graphxmlswfcharts/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/graphxmlswfcharts/es.php b/modules/graphxmlswfcharts/es.php new file mode 100644 index 000000000..32d8c0915 --- /dev/null +++ b/modules/graphxmlswfcharts/es.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_fd1d6df8df2837bc1690e3ca9d84f502'] = 'Cartas XML/SWF'; +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_f0f38a8ecaa33a7db97194b325992d1b'] = 'Las cartas de XML/SWF son unas herramientas simples, de un gran alcance, que pueden usar el flash de Adobe para crear cartas y gráficos atractivos de datos dinámicos.'; diff --git a/modules/graphxmlswfcharts/fr.php b/modules/graphxmlswfcharts/fr.php new file mode 100644 index 000000000..1340e3b31 --- /dev/null +++ b/modules/graphxmlswfcharts/fr.php @@ -0,0 +1,6 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_fd1d6df8df2837bc1690e3ca9d84f502'] = 'XML/SWF Charts'; +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_f0f38a8ecaa33a7db97194b325992d1b'] = 'XML/SWF Charts est un outil simple mais puissant utilisant Adobe Flash pour créer des graphiques à partir de données dynamiques.'; diff --git a/modules/graphxmlswfcharts/graphxmlswfcharts.php b/modules/graphxmlswfcharts/graphxmlswfcharts.php new file mode 100644 index 000000000..d3eac49b3 --- /dev/null +++ b/modules/graphxmlswfcharts/graphxmlswfcharts.php @@ -0,0 +1,259 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * Statistics + * @category stats + * + * @author PrestaShop + * @copyright PrestaShop + * @license http://www.opensource.org/licenses/afl-3.0.php Open-source licence 3.0 + * @version 1.4 + */ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GraphXmlSwfCharts extends ModuleGraphEngine +{ + private $_xml; + private $_values = NULL; + private $_legend = NULL; + private $_legend_more = ''; + private $_titles = ''; + + function __construct($type = null) + { + if ($type != null) + { + $this->_xml = '<chart>'; + parent::__construct($type); + } + else + { + $this->name = 'graphxmlswfcharts'; + $this->tab = 'administration'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + Module::__construct(); + + $this->displayName = $this->l('XML/SWF Charts'); + $this->description = $this->l('XML/SWF Charts is a simple, yet powerful tool using Adobe Flash to create attractive web charts and graphs from dynamic data.'); + } + } + + function install() + { + return (parent::install() AND $this->registerHook('GraphEngine')); + } + + public static function hookGraphEngine($params, $drawer) + { + return '<script language="javascript">AC_FL_RunContent = 0;</script> + <script language="javascript"> DetectFlashVer = 0; </script> + <script src="../modules/graphxmlswfcharts/xml_swf_charts/AC_RunActiveContent.js" language="javascript"></script> + <script language="JavaScript" type="text/javascript"> + <!-- + var requiredMajorVersion = 9; + var requiredMinorVersion = 0; + var requiredRevision = 45; + --> + </script> + + <script language="JavaScript" type="text/javascript"> + <!-- + if (AC_FL_RunContent == 0 || DetectFlashVer == 0) { + alert("This page requires AC_RunActiveContent.js."); + } else { + var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision); + if(hasRightVersion) { + AC_FL_RunContent( + \'codebase\', \'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,45,0\', + \'width\', \''.$params['width'].'\', + \'height\', \''.$params['height'].'\', + \'bgcolor\', \'#EFEFEF\', + \'movie\', \'charts\', + \'src\', \'../modules/graphxmlswfcharts/xml_swf_charts/charts\', + \'FlashVars\', \'library_path=../modules/graphxmlswfcharts/xml_swf_charts/charts_library&xml_source='.urlencode($drawer).'\', + \'wmode\', \'opaque\', + \'scale\', \'noScale\', + \'id\', \'charts\', + \'name\', \'charts\', + \'menu\', \'true\', + \'allowFullScreen\', \'true\', + \'allowScriptAccess\',\'sameDomain\', + \'quality\', \'high\', + \'pluginspage\', \'http://www.macromedia.com/go/getflashplayer\', + \'align\', \'middle\', + \'play\', \'true\', + \'devicefont\', \'false\', + \'salign\', \'TL\' + ); + } else { + var alternateContent = \'This content requires the Adobe Flash Player. \' + + \'<u><a href=http://www.macromedia.com/go/getflash/>Get Flash</a></u>.\'; + document.write(alternateContent); + } + } + // --> + </script> + <noscript> + <P>This content requires JavaScript.</P> + </noscript>'; + } + + private function drawColumn() + { + $this->_xml .= '<axis_category font="arial" bold="true" size="10" color="000000" /> + <axis_ticks value_ticks="true" position="inside" /> + <axis_value font="arial" bold="true" size="11" color="000000" show_min="true" /> + <chart_border color="000000" top_thickness="0" bottom_thickness="1" left_thickness="1" right_thickness="0" /> + <chart_transition type="scale" delay="0.5" duration="0.5" order="series" /> + <chart_label color="000000" size="12" position="cursor" background_color="E2EBEE" alpha="80" /> + <chart_guide horizontal="true" vertical="true" thickness="1" alpha="25" type="dashed" text_h_alpha="0" text_v_alpha="0" />'; + } + + private function drawLine() + { + $this->drawColumn(); + $this->_xml .= '<series_color><color>A3B6DA</color><color>C3413C</color><color>5A6C83</color><color>CA9A51</color><color>5B7751</color><color>55AA26</color><color>FF2398</color><color>427FC3</color></series_color> + <chart_pref line_thickness="2" point_shape="none" fill_shape="false" />'; + } + + private function drawPie($counter) + { + $this->_xml .= '<chart_rect positive_color="ffffff" positive_alpha="20" negative_color="ff0000" negative_alpha="10" /> + <chart_label color="ffffff" alpha="90" font="arial" bold="true" size="10" position="inside" prefix="" suffix="" decimals="0" separator="" as_percentage="true" /> + <series_color> + <color>427FC3</color> + <color>C3413C</color> + <color>5A6C83</color> + <color>CA9A51</color> + <color>5B7751</color> + <color>55AA26</color> + <color>FF2398</color> + </series_color> + <series_explode>'; + for ($i = 0; $i < $counter; $i++) + $this->_xml .= '<number>9</number>'; + $this->_xml .= '</series_explode>'; + $this->_legend_more = ' bullet="circle"'; + } + + public function createValues($values) + { + $this->_values = $values; + $this->_xml .= '<chart_type>'.$this->_type.'</chart_type><chart_grid_h alpha="20" color="000000" thickness="1" type="dashed" />'; + + switch ($this->_type) + { + case 'pie': + $this->drawPie(sizeof($values)); + break; + case 'line': + $this->drawLine(); + break; + case 'column': + default: + $this->drawColumn(); + $this->_xml .= '<series_color><color>A3B6DA</color><color>C3413C</color><color>5A6C83</color><color>CA9A51</color><color>5B7751</color><color>55AA26</color><color>FF2398</color><color>427FC3</color></series_color>'; + break; + } + } + + public function setSize($width, $height) + { + if (isset($width) && !empty($width)) + $this->_width = $width; + else + $this->_width = 550; + if (isset($height) && !empty($height)) + $this->_height = $height; + else + $this->_height = 270; + } + + public function setLegend($legend) + { + $this->_legend = $legend; + $this->_xml .= '<legend'.$this->_legend_more.' layout="horizontal" font="arial" bold="true" size="13" color="000000" alpha="85" shadow="low" transition="dissolve" delay="0.5" duration="0.25" fill_color="D4D4D4" fill_alpha="0" line_color="D4D4D4" line_alpha="0" line_thickness="0" />'; + } + + public function setTitles($titles) + { + $this->_titles = $titles; + $this->_xml .= '<draw>'; + if (isset($titles['main'])) + { + if ($this->_type == 'pie') + $this->_xml .= '<text color="000033" alpha="50" font="arial" rotation="0" bold="true" x="0" y="0" width="'.$this->_width.'" height="'.$this->_height.'" h_align="center" v_align="top">'.$titles['main'].'</text>'; + } + if ($this->_type != 'pie' AND isset($titles['x']) AND isset($titles['y'])) + { + $this->_xml .= '<text color="000033" alpha="50" font="arial" rotation="0" bold="true" size="15" x="0" y="'.($this->_height - 30).'" width="'.$this->_width.'" height="30" h_align="right" v_align="middle">'.$titles['x'].'</text>'; + $this->_xml .= '<text color="000033" alpha="50" font="arial" rotation="-90" bold="true" size="15" x="0" y="'.$this->_height.'" width="'.$this->_height.'" height="30" h_align="center" v_align="middle">'.$titles['y'].'</text>'; + } + $this->_xml .= '</draw>'; + } + + public function draw() + { + header('content-type: text/xml'); + + $this->_xml .= '<chart_data><row><null/>'; + foreach ($this->_legend as $value) + $this->_xml .= '<string>'.$value.'</string>'; + $this->_xml .= '</row>'; + + if (!isset($this->_values[0]) || !is_array($this->_values[0])) + { + $this->_xml .= '<row><string>'.$this->_titles['main'].'</string>'; + foreach ($this->_values as $value) + $this->_xml .= '<number>'. (($value > 0) ? $value : -$value) .'</number>'; //si jamais la valeur est n�gative... logiquement ne devrait jamais arriver + $this->_xml .= '</row>'; + } + else + { + $i = 1; + foreach ($this->_values as $value) + { + $this->_xml .= '<row>'; + if (isset($this->_titles['main'][$i])) + $this->_xml .= '<string>'.$this->_titles['main'][$i].'</string>'; + foreach ($value as $val) + $this->_xml .= '<number>'.$val.'</number>'; + $this->_xml .= '</row>'; + $i++; + } + } + $this->_xml .= '</chart_data>'; + $this->_xml .= '</chart>'; + echo $this->_xml; + } +} diff --git a/modules/graphxmlswfcharts/it.php b/modules/graphxmlswfcharts/it.php new file mode 100644 index 000000000..e2c7aa1b7 --- /dev/null +++ b/modules/graphxmlswfcharts/it.php @@ -0,0 +1,8 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_fd1d6df8df2837bc1690e3ca9d84f502'] = 'XML / SWF Charts'; +$_MODULE['<{graphxmlswfcharts}prestashop>graphxmlswfcharts_f0f38a8ecaa33a7db97194b325992d1b'] = 'XML / SWF Charts è uno strumento semplice ma potente con Adobe Flash per creare grafici web attraenti e grafici dai dati dinamici.'; + +?> \ No newline at end of file diff --git a/modules/graphxmlswfcharts/logo.gif b/modules/graphxmlswfcharts/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..98919ed13b42d04d5bdc75449116101d2e71e314 GIT binary patch literal 979 zcmZ?wbhEHb6krfw_|5<VA5E=4TH1fIvj1f5@W}><96#DSKMxH1<ly?*!{?)y|5s0+ zFJ8Xi!y~_iM}3Ko`yLbhDk1rMLgJ6qq@TH&zlw6d6&8OjDgRbc^}Dp-cSX_fisIij zWq;}_{<PG5ZD{%0)bh2t?R!V(kH+R7z5PG;?mcwq(9xquzaKyG^T45>r_cVndhOS> z>%VW@{B`%<vuDqqKY#x6<;z#EUcG+(`pug+Z{NOs|Ni~2Cr^LBc=`MF>)-F*fB5j> z<HwJmK7IQ9`SX`AU%r0*`t94d@87@w`0?ZC&!4}3{rdg;_a7ko^9Ss|QDQU%aE5^5 zPZmZ7hW`vYAQhlI!N9SB;XkL0#|8yQCHF}hF&<A^4k|k|dAuofcAF%@$EhY6q;j-F zz$Q&akcp-Bn39@WO~QlbV~13v;w>(GU~rxwXPS1P!BT*;lTWflMp5X<ab9T~)?FPJ z9FF#>IJf@!F!4(~C!ZWwLqNuo4gtkb=^O)v1nnzIt{o~<6BG}2iCOf?7$&uJ+^QE> ukXfMMv@m8@L!y>KK%!$`Ymu<}A9Do;CNX_wZIuX@Pp6gGjD>kP7_0&N66Jyb literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/AC_RunActiveContent.js b/modules/graphxmlswfcharts/xml_swf_charts/AC_RunActiveContent.js new file mode 100644 index 000000000..39c294bbd --- /dev/null +++ b/modules/graphxmlswfcharts/xml_swf_charts/AC_RunActiveContent.js @@ -0,0 +1,292 @@ +//v1.7 +// Flash Player Version Detection +// Detect Client Browser type +// Copyright 2005-2007 Adobe Systems Incorporated. All rights reserved. +var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false; +var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false; +var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false; + +function ControlVersion() +{ + var version; + var axo; + var e; + + // NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry + + try { + // version will be set for 7.X or greater players + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + version = axo.GetVariable("$version"); + } catch (e) { + } + + if (!version) + { + try { + // version will be set for 6.X players only + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + + // installed player is some revision of 6.0 + // GetVariable("$version") crashes for versions 6.0.22 through 6.0.29, + // so we have to be careful. + + // default to the first public version + version = "WIN 6,0,21,0"; + + // throws if AllowScripAccess does not exist (introduced in 6.0r47) + axo.AllowScriptAccess = "always"; + + // safe to call for 6.0r47 or greater + version = axo.GetVariable("$version"); + + } catch (e) { + } + } + + if (!version) + { + try { + // version will be set for 4.X or 5.X player + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3"); + version = axo.GetVariable("$version"); + } catch (e) { + } + } + + if (!version) + { + try { + // version will be set for 3.X player + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3"); + version = "WIN 3,0,18,0"; + } catch (e) { + } + } + + if (!version) + { + try { + // version will be set for 2.X player + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + version = "WIN 2,0,0,11"; + } catch (e) { + version = -1; + } + } + + return version; +} + +// JavaScript helper required to detect Flash Player PlugIn version information +function GetSwfVer(){ + // NS/Opera version >= 3 check for Flash plugin in plugin array + var flashVer = -1; + + if (navigator.plugins != null && navigator.plugins.length > 0) { + if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) { + var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : ""; + var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description; + var descArray = flashDescription.split(" "); + var tempArrayMajor = descArray[2].split("."); + var versionMajor = tempArrayMajor[0]; + var versionMinor = tempArrayMajor[1]; + var versionRevision = descArray[3]; + if (versionRevision == "") { + versionRevision = descArray[4]; + } + if (versionRevision[0] == "d") { + versionRevision = versionRevision.substring(1); + } else if (versionRevision[0] == "r") { + versionRevision = versionRevision.substring(1); + if (versionRevision.indexOf("d") > 0) { + versionRevision = versionRevision.substring(0, versionRevision.indexOf("d")); + } + } + var flashVer = versionMajor + "." + versionMinor + "." + versionRevision; + } + } + // MSN/WebTV 2.6 supports Flash 4 + else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4; + // WebTV 2.5 supports Flash 3 + else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3; + // older WebTV supports Flash 2 + else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2; + else if ( isIE && isWin && !isOpera ) { + flashVer = ControlVersion(); + } + return flashVer; +} + +// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available +function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision) +{ + versionStr = GetSwfVer(); + if (versionStr == -1 ) { + return false; + } else if (versionStr != 0) { + if(isIE && isWin && !isOpera) { + // Given "WIN 2,0,0,11" + tempArray = versionStr.split(" "); // ["WIN", "2,0,0,11"] + tempString = tempArray[1]; // "2,0,0,11" + versionArray = tempString.split(","); // ['2', '0', '0', '11'] + } else { + versionArray = versionStr.split("."); + } + var versionMajor = versionArray[0]; + var versionMinor = versionArray[1]; + var versionRevision = versionArray[2]; + + // is the major.revision >= requested major.revision AND the minor version >= requested minor + if (versionMajor > parseFloat(reqMajorVer)) { + return true; + } else if (versionMajor == parseFloat(reqMajorVer)) { + if (versionMinor > parseFloat(reqMinorVer)) + return true; + else if (versionMinor == parseFloat(reqMinorVer)) { + if (versionRevision >= parseFloat(reqRevision)) + return true; + } + } + return false; + } +} + +function AC_AddExtension(src, ext) +{ + if (src.indexOf('?') != -1) + return src.replace(/\?/, ext+'?'); + else + return src + ext; +} + +function AC_Generateobj(objAttrs, params, embedAttrs) +{ + var str = ''; + if (isIE && isWin && !isOpera) + { + str += '<object '; + for (var i in objAttrs) + { + str += i + '="' + objAttrs[i] + '" '; + } + str += '>'; + for (var i in params) + { + str += '<param name="' + i + '" value="' + params[i] + '" /> '; + } + str += '</object>'; + } + else + { + str += '<embed '; + for (var i in embedAttrs) + { + str += i + '="' + embedAttrs[i] + '" '; + } + str += '> </embed>'; + } + + document.write(str); +} + +function AC_FL_RunContent(){ + var ret = + AC_GetArgs + ( arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" + , "application/x-shockwave-flash" + ); + AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs); +} + +function AC_SW_RunContent(){ + var ret = + AC_GetArgs + ( arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000" + , null + ); + AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs); +} + +function AC_GetArgs(args, ext, srcParamName, classid, mimeType){ + var ret = new Object(); + ret.embedAttrs = new Object(); + ret.params = new Object(); + ret.objAttrs = new Object(); + for (var i=0; i < args.length; i=i+2){ + var currArg = args[i].toLowerCase(); + + switch (currArg){ + case "classid": + break; + case "pluginspage": + ret.embedAttrs[args[i]] = args[i+1]; + break; + case "src": + case "movie": + args[i+1] = AC_AddExtension(args[i+1], ext); + ret.embedAttrs["src"] = args[i+1]; + ret.params[srcParamName] = args[i+1]; + break; + case "onafterupdate": + case "onbeforeupdate": + case "onblur": + case "oncellchange": + case "onclick": + case "ondblclick": + case "ondrag": + case "ondragend": + case "ondragenter": + case "ondragleave": + case "ondragover": + case "ondrop": + case "onfinish": + case "onfocus": + case "onhelp": + case "onmousedown": + case "onmouseup": + case "onmouseover": + case "onmousemove": + case "onmouseout": + case "onkeypress": + case "onkeydown": + case "onkeyup": + case "onload": + case "onlosecapture": + case "onpropertychange": + case "onreadystatechange": + case "onrowsdelete": + case "onrowenter": + case "onrowexit": + case "onrowsinserted": + case "onstart": + case "onscroll": + case "onbeforeeditfocus": + case "onactivate": + case "onbeforedeactivate": + case "ondeactivate": + case "type": + case "codebase": + case "id": + ret.objAttrs[args[i]] = args[i+1]; + break; + case "width": + case "height": + case "align": + case "vspace": + case "hspace": + case "class": + case "title": + case "accesskey": + case "name": + case "tabindex": + ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1]; + break; + default: + ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1]; + } + } + ret.objAttrs["classid"] = classid; + if (mimeType) ret.embedAttrs["type"] = mimeType; + return ret; +} diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts.swf new file mode 100644 index 0000000000000000000000000000000000000000..287833972895194fa4db70cb4312779d122e51bb GIT binary patch literal 51456 zcmV(#K;*weS5pa;hynn3ob0`MR8z^e_`gpe5W<WJAOZ#ig)oRH%A_4enGGRf5-=br zA}S&vgW3lW1E`2HIH4U7Fa%IQK~&Hnf`Ah$C^$7JDgq+Tc3->uTZ#RC?{@cH@7;HQ z>)qSyuGhUje`wc9?OnC^uD$D2osI)#K0pZrD6-(J3g{mv!Y{x40y4j-5n}-`*p10J z#IFgDg=rX58i0jhBm5D8h+sqrA`HPrL?9v&s}RwM7(^^$Jt7Vfk4QiyA(9cPh%Jb1 z2po}t*pAqN$VTKMb|LZ*`G|dp3y8PkK8OGdWB{yW0W3%Wo`?g83B+<afK0?$#5KhC zh>wUpWPo#sZ{z_!BP<jEP9Q=R0rn%dDFK)&127TAh_i^t2uua_jrf4Z$V3g`9U@^G zz)y(T6aWvz5JHX$pp96M_zuyGc#Y6d2PjAAXaL+s#ApK8Oa}-++(5iRm};T%L*ybF z5WR>O2$>lGMhH8EFTz+Gpb9ZZ2S9)@(?z->yl0~45O)zaG=MdTEr=O<XlxN=eKdv$ z^;t+?gn|LU21GwX))0V!NJQK~D9r|Vh?qj0odZBILeC-W5fO-N#0f+n;ztC{7{C<~ zi`a)~Mm$DH(*fuRCL#$@g1CejMJSn|`9lOFa6~2I8saTN(-dF{A`+2{s6*UE3?QV< z0ECE4b7Y5eksOHIh}RYX)8+v<TB0`d0UQv)h;@il3jjJ1i>;6xh}Vd+g-A}sj77+n z5GjZ|h%bmlYk+!$z74=V#2s6JjdlR%5k!0RyNHhnpT%hI5Q~?fIsOLu24XK_5MjVT zHi?Kwlp_Wa8yx_CLGT@sd``$#5#Ku_`*s1ig4pB=@G~N3DS)mUz!}6l#71`jcMoLi zo&b7YXneep?mlQ-mjM(p(b)I`)UW`Y{m{H2zGVX#asa##n-CR<`-uJiX#N6_n+F0M zMYsk5EDQ#Cg3wqFa2c^A1dR*AJ{0{KF)s|sfv{Ww;D<PmxQTd*(BdMSMDP%A5uxEo z55#MPX#}!!#CM2*NHp$<BE-BX<Yx$#|Ns9gb{R&Lj+UHUQsA=n!5s6BsiY>mo0UqX zT>Pv)AMEIQ4}6t6l9Q_2rBU0bd1m>kw8Iy1Vd#UE<{e#0$L%ieqgG@P-pi|Z+5V0H zfSy?=N>1A)RM(-@K1fmG#ZDTGag%~(G`-c?xn**`n?;iT%8T=7It*;jd%7S~Hp15K z?eKdYa_N1ZQufH}!Dsv=!@o2t=@d4-zBWgY6nd<=r!;&pE$_?SR9@753r5&_`fFa) zq}|8vXq{{~@o#f+)Mt10hPF2sas|$h6vCQ&>QkQrAzBD>c@EY5Dwz}Mrxq`-{9>z~ zSs_i2pmo{K+Aesmq~f5_-dadV56E6Vn->3K?X7ALl?s{iZ+dob#BeO14zi?{?KgyP zr>W71CKcCgjWa73(D$7*Z@v0l_-XE@Gi6fe3Kyrl6-T+Q(PypN7eAYJfHrrw-p1uk ze(d|{oKj_?t;!Tg=eU8ROY(D8K%QFREKQnu#H9kIdpPUt;`9^eD2K*RgHaKUP`_rE znNQhewHeza+6+CUhr|HM$I6r;xIND}1}9Y91}T<Z%x>B%9D9vKYq^@)RBe)X{{Rq# z2B6S<S=ex%3IwG(M%dhpiVg-eT*4Q#XL>q?0P`Wp_RnJ;j;jMd4g>QJExJtM_9f(l zuQ6y^-U{F<Gr_cpB!B<COa7<q?q{-5KeisZv7>DuJyu1dit${P366SI5ggaOIi6d9 zYBmL0dmpgZ$i{+l3KJGT57B813Q6h{0o9iVQJsdIqJctC$;lvmT&Ru07O|Lu4e@^r zIW$DrF$DI;xmi+KIN^{G$T1Tq)Q`zj8sLN+8eCS-JrAik7FEYU12Ab|zd7xhJB1Ti z*%Ly&@27WAT61m@H|_#^2m;t5i1A#)2`dtS^bc&HjIP>0-S@kYQwvs67w9{!u4?ny zUIK&zY@n9#G;guAS2{ffBJz3C_7sj@+Yk_1STG}NGLpJsW4?F&`_1265*VAQLk7d= z<ww=5P*QbhuTS6P_E&X^hI0ZRnvWQIOrja&aPgK4oK@>%x{Ee({d<ZlLUCeJIfQv# zKU#I|zS?o5j|gtMuyR$|Fe8^iAo+TpmnM#e*qq;75t&_;DO)XX(i7Lv0P->U@U%e9 zxx&<7>1QzZ6Jd56di+*>S?-@E@wh~@{It10ec#$|{;Ga|#AiFdBj0!C-flzx>FSVP z+h{iV-K`BLRs}g;SQVrR>d$L{(lpa$YxNAPUUF2<Bo9ByzIt~`P0i%>CA8ia_Tbnd z>A@59X{(y`I;8~xd!`;Ac_8km!$|UDyY-!jeriJMgom1mrNGmaKg&FWzv~<yn#M%f z+GSYSlZ#l`Q@=v`XfpZg(2nqOLt%ZnAr5kNH9(?|t8uDdygl5&IA$u2ESD1;^~RTK z?DZJgr;riH<ojRZc?V>EOBE#dTNc!9m>b?#Y>-i5uY2r^!B~r9JT4`5Zbk+lOm4j0 z9OJsQ&gTKWc<;gD9goL6727x?Btt7%9y>cAm-@W9%jw*$OWK?7CN|Iqr2VfMJQ0t_ z4eJeU6ScfphMhk4fU9%`Pr58s@1b)NCX!`iaP*h=rxe6u?PP%N{p=)@_KKhBAbsQQ zliuU|P1h#pRW-SdEuko#Z;YWdUT+Duh%!7TgSlJX^4FwEMms!ws;a%IOqbmCYc%X~ z18hRTTjy*?9ln23^4o$qSzg2V<IZO1sR<X23oNC}7GeW_mOM*yt&;`FC9J3>^0nPS zTB8OqqE8V|`(zC9c}p*twBTS>e_-5p;JG!(KQslx7c8dveoe8K7J3c^x`2#SqKXPO z-<bV^P}F(IW!qzYE>NNZfx=XAc*b%%TAFV}u_Q}<0agZJ`FHyc*2XR}><HI?GzBL0 zfnajv^^F;REu~Fycl%z{uG<DOBqZ32-dUPkLq?O>PIv1oQf16IKW0Te;F9;sS5iz! zLZ*VIPRxx7*N@_+-SgLmPX&%QdgvB2>149GrSNi1RPYUt#(To#Dg~`qxfOHV0W&rR zRn`|SeM2W9k3l%_8Ro{5s#8d_Ce+$nofkg~TyjF&&s>3B8EEk%V8OF+@X_~Sm$(~% zVyzpb-4DOySE+6AKD8)L)q`Uh!C`kFxg(|LV$l`3^SM}vW3<dq=LCygnD+XrN~--v z8}%({nCAi@jn%VVwJw8(856>azr=DDJ?ZcjVLl2#<*wN*M{O564(ZNPoUG7Xfn&3) zfZ}N$nY(GBn*hb0I+%z3d|ZC!YwHho15#J|Nrn+B#cNr-IZ`#9MLK7+42FRH1&0H< zzP|7ERe+ww1^bE***~#jNgLyJ8eJYH;&8kOq<Yx<Y6GhDYgY(>>L`MM#xtC-yKkP| z@)fUwqkRBrXfa)?O!l&iZJfA7J-`0)#nf`f=q9DUfdp4x%!maeBs4KlXII0UQ{y+* zbZ1Ip|1la*<6O()R=4D2IU7w@!QM;)@^CI3sOop_IL^R)ihvjq`?20{bv0!nP=kgb zf<W4QR-?{-r-O=YW{r-JIaPi2;+_H<&!)~jd|*#7pn}{O<U#HN>7{H?@=n`n7ItWl zI0NBefQ8-TaMD6$GhJN8!#zf!&rR#c4cI?)AKX8`-^O#XKMnKR0_wi`0fP?tThr~R zdWMDbxWIml!_l7IL5p*DfwZ|lNXM+TuI7w$s{@9BxY+|_4p?ptJ75`&Rxy7dX=r%T zIQu<m?p{FjRshn01dhJyExDD6T)g>%{4BIetT!tAT;XE=d<z&y0;Uw?k?k1;gfcpi z{U2NptbFQk>;}gBf$-Fb+%#2&W7d*&;`z@;&0FRey{hGv1uFHa1T+$SV!NkNCrYR3 zBzaqHP4dPGdlnD+lSR83m;8KK4Sqh!pYK|VV@Kyoha%y#<~#VQ;1Z%WNHYX5JACFz zj|STf?y@4NB{IOkL0-6Y#2jRz%i)`=4?C(_uVu{8@+h!Q&4pJ&BdI17OHdFb+^c7p zAm+LOnLi39wx3LHx?aJtWVCGe$=OK>4R>iW6-U~z<Z*IyA1<>cS*dXjK0c3&d7_0p zlgdg)`S$@fF4vzuk7!*@_2FY)cR@37$}bxgQ4s?)b8E-vbR09zQK>L?%k@14<lrH2 zzDp>x7~sQc)XNWNW<*q-Qzv)>nHvXfI~_|*n{X*Nv6{z3#Tv+cTHPX7?TBt?tx>QP z0Hsj`2aXdX0$(ucHNKq5*$K~p$U<|xIIw8KFMt6p{aiR(?_uQ~<Y8rv)4)Gh1nL$8 zoZ`R%25g~nVVi57;>)l+#h=y=0f)}OwhTPuyj!_HW@!>h{)TmMt^nwVqZa5NHg=p{ z2bJG~g7jhfkbW!>cL_ip&&f?K<Q_jb1r_-q?HwxAUx$M{MJ#PM*HQ1U<EsW*Xk??D z?PBx>PAc^$f6erM*G7E_4oQ7Z^<g@5-!NhJ=Kbnf_GecvzntjZu+(>opZKVnS#e_B zlUsO|nI?(sF_~K@?rH4wB1Rf#c=F1Q*Le?I(|q(=<~K&`MhcA2UtLRFBk5@Dp@qs; zlYyiGsauY`7#v09+V)&tMVitBNHt=<VoJj4*y#oItpii~HV=H2&1zyopL^_Po{!Oc zWu2}(*;g(3of~x#r4x0;Z|=VWWt2+=F|MyBI_Z_j<)rt|o~<CeD2f$QR|ieV0BS>P zp9K$|*^e@puzXmPK8I5&UH{lU@v&&8ieSdE;gzPWhR#@D8ZythA~3CAEDV;O0Ga%9 zur+yjQ}})6l7eUaN+)xlkT~I6hfA1qb{n>-1{D#3QcYz#$Y=w0Aeog&g)1g>FYga% z+fH2}DD1!gS*X?w#7){j6f80e6)bXS8b2L?K#39uCmbOfol1-{Iu-xT!l+>TrpU9X zh$=w~YI16ked%l3{2YJA${fJti*SrF{VgLZIl{My1en(~n7(O)-@&F&3FkS>FIh2h z;4ENZDH=r1NQeqJS8$=p!NsB@D7$vcK^m~{i(vItV&9Szf2n8aruuKtIyx!@xKIK= zE}|V@q)P#^4;PmEzdhD>OFytqn3H=6C)Ah#@u=mR17mO39LyO7!nr#jr6uhzT%fv~ zIy2_N+?go)Y)2ltgqD7a?ofFxF;l%}T#Dw2)<<_5DC+g+9$M?K{I&+g;m29eI6z2K zE;VJP?z?m!C}mtoUgRQQ9Cy-#qx|uve9;-Ux&IVs>M$YXj7;nYYjWSRA+eT}mmVBJ z*5W?*BLQBs<3MMX*eph?jxn|t=WfCVZ6^Oh*)N+lC-md4+e+Ox(@br&r0Vwu(#%;I z1xi<XQ-<_wl<iIF>Eb10=Mc;c?A4WzW+Ojan{MXGQq4t`!|}ZOODiZPv!y|&kpUSq zPOmL|RC%4MnCKB{(XlJBNIm@l5}gGzix(vIJvkm^t=b<XTI%1W!g+syOnD2(v-S<p z=2}=W+RK8@2Rrn>;aJ6i;+z+(3ybHS=wTn4C<nSBjZhOkan>jAYT>3k0V8`}pfwE@ zD{C#|l&%IRwK~;vIF<m4oA0p7S{%wd3lG+?VNL~&&=jk%#z)jyd~83bQ8!cy$1)^N zVZ}|W7Okg#$eB0&i@~#$w+7E@0Snc|v78CbfE+JPAow8DvRWD|Dq0;YDv(8)!7+d} z$7t+rOJkSp?th#|=&inJE^pD;P;=?7NidKrxiI&oLG_TH0S?FL$OA4(sd<#kxOYYa zdEY1~wmS<Ku2a+Ku4((vfh6<TPjN^l%wys5!`E~xmTIRsiRw5!9IYJ;G?Y(EwjAqU zf5(u!@iphWjyIv1?*8g>r*DC5mPa6Mu9+_yu%^X+DoOeg<u`yZ`;&)1&&zhuqo8)5 zT%^9h(;^!T<M~iz-q)F%R36`Y@5$kAyi&ufdUfk<J6uYfFir#lY^A%UcH-~Z;r9<K zlLGC6N{62EVq)!Q<-gi0oB2hjN)nH{L@2X7#;b`|b{;@~HC5o$*sLo*lvLS%X}hwz zrX;5vXQN>?Y<m!;EMsc#KT@rcXX{3OTSYT5ngsHsHYilZ-LDF{tWdru_XqbqID|c^ zgAkRJAO*pc!Mt1Z2o0SH2gOTUfCwz~W(v6@+h*`aUN6NoIfDTe1<R@atk{Y)ATsMf zL;7I<tD%D;@Z@m8cdtI#nB{DAtR9Hw*<fp?<5_cuocbl9qnPy9k}Gv|CD&p@O}yO} zIy>_}AlqN6JiW%=*y2r;lO%aQ@ShD+&*EaOuhRkyKQulXIIGOw*$+|$N!S>t$AcQ* zN#yiuMy^DOL_WwoXz~q1{IZt0Ie=G3mog+%2-@Z2md6XhI2DJkkeD576M*0(8Kd7w zQ$P4DCa1%0=J0c2M^0;Tp=;xy(p+m3k2Q}U%f-BL*(sK4JRi-F$w2BA+C&IX_)b~Y z!p<*TY{XqONv@A(L^`51_kz#H2{v`t9_i555D`kAzyB#WAnZqLGuH{>nG0F$6Rp1t z1n-tS7WeC8N*!m@%pUG{x_gTk(Xtpl#Juyk_-f$eDj!Ma($>7xss=O`Qa)~{&-CP5 zUE5J{V(FD13Wc27mJJN3Ef9gd?++&Sr5|w^LY3v?U5uGAEeNz&o`}ZbvW$WW0x*Lb z6%F0e>5W|QzBMx!W7!%>C88ut1f>3O&fe;92GpTRtS^4G(3f*R$T=Q}zNbNhUBa2f zkDz3{^EY#-EG?*J*MZCy#h!vX*6xj(bSndYkQqY>u2WWCM2Y68z)`I-N6)yAE^MXU zP8Y%Gj+@j-v^Ita(|Il?$)$R|*Qtw`pmt?9tDrfZ-BwtHyxk;<Mpzpm|Hy~l+IRRI zr}cXqtFMt_V$$9;#(9>)vhZuKTee&K1)lA|`-{>(Jz8pbl;b7+%8-GDG~!rxjZQ#z z4T>7}{WxKXY*Jg+YP>CT0btAN0Gn4n^-pSl3fKh>NHuMUzskAkc5t8U4;h3HOzng! zS8ClZXW{mhR3O|$>&31!4)tRvggvu{fSxx5=cJ#UOpty8giX~bhLZZ0#q3SD(;5O} zCSW@8V=JGv?ACfv^_^#yCwoaQGi`wOo6(YyuSN?A$!$70KR-NY;1{}))LS4@1Tg&_ zRpnfbhf}sdH8(WE*2^QcEP}pWCT8;a`(W9~lJnn_V>uy|s`wW(ea+ofW!eI$sf|B@ ztl`l&TqkMb2-iq6>0EogGKc>e2&5mQj65sVOt-q5b_1cF1xCfGorN!I*7&rzgwFfn zwkGK8R}y<uTXb;x<Vj^No3@i3NnGr^lj?X3h@PfEY;2^|$}?dOkw*Bk&U>Cu-yMo) z3P%)HJ0oOk=;`yjFP~s>g6<}R8ixs?m|b|33zn7ReUWO&!xr>{fAtVhhmI5#H6InZ zI($mC#vD&NHk;)R(VP4-O_@MH$%R{&)Q(fBLy%VmB-%rbp37XFNNZW)X=~Zu41#tQ zmK|4+*HGqci;_tXl)N{pPNVlZJJu1@gd&oMK2A8d52Re~e>~~(06u;wmUzfbkPLIJ zl(Kx6U2N%Sqf_HTU5)(Ilf7bPFMamlyvbT#AFn%?kBXWJ#mnJt7dBp<K8+nL?R6M1 z)<(b>8#?HOFC@Al(;=Dx?g6{7BRlioB=^*T@!BWSj@6e{<+<`tYLm>zyJqB`q{Wqg z29pb1ShRIG=H#sGg(i!Q>;3MOc#QqjTF-!>wc>CwIt_=kIoRv)!f2&V{WNViq13>W zu{xbywx4Q$xF$&nud5=t4_&#yyv4WEXq#}pwE1<!*&2tWMehbmpAmI0dj$+ktdPCn z<HNO^ZTPy}khy0oxoC?dRjhpsvJLKGe*1WK*YDg8N?N$H+dtbo#YF$(`p&A9b1C(6 zjl1n14bD7iBMR((vGDQ>Nz5Cip-R(e`00}Ut)Uv#=V!Q#+>JVGf5^=3#meZ`u~EnC zPegacf{kB8q0VS1sXue@p=YqJ+TEl<r(0gU80W>qGT!N<_;}+&$;QVu!OY>QhRo;p zo!S;E^>LGyxA$M<ML65}N|Kb?C9=HljY&s!vdcbNwGHs1?n!2Ah&hX~Wg7Pf_c-)u z)2L34%7;DagBz3{bV)S3g1eWZuvl<hPi4YobwQr)6#COq1v900Z5d&K;$Fv1Wj}8< zwn*sYmEBj`Zy}!Jr*ZmIX~pUBI%*D&%P4UZ;o|gF@e0Xh_%&DAnr(Hb5Fh-BMT&O% z0z{u|kkz(kH$UATQdHzP;?IB=p}%l%jNuqJBk*{YT2JzA3-g|AzmYRbx#y-$@*kUJ zEock#x^&Cyn#rwX;LH<Yxd#>f4OgOyCW}U}(elV~FF)=j@5o-ELuz<*%daD0<K`q; z#a1`iuVv@U={+)U8(`kfFnzSxuS9OO$_kV&ZE$?5w7k^+3$db8wm(2~W~j3+<?&Mm zQ0t&!bF`j@x}UJ>VFIfOCmd}n{LY(Xc%onLycdvk!~=VB3Qc~KZap6rHcyUqcwkEv zYk+E32XoXq{eAR10rTYGnEzq2d67Tmtm;FcbaAoS^&cz?v;wOXZ?~iV9SG&QI98cW z>k*neCwTIq;w})WRzhP`P|DE-p#N_9d~$8<wX0K-O0ilYqc*~l4^b21ovbnDJfpNe zhCStzdsbFMk#(l|G6u%^3^F%043`^);4pyVtB8W-vzaocJR}W@e6y(RZyvI>0;WF- z!-lF0kFstmr?wtbPW?p$CmsXz73Z1sJ>Q9AAs!+uIHETCNkc>QFv{Sn9^sgd!jI)K z^M}V`yd=F(&0=gttE7K>WvcOs8@6uR^vHS5dvJo_K9DEM#y)hE4S|1r9dK~IRzlU{ zs#`B`Lgmju)D79A^#l!B2I1*;x|;xISfuW<ENgL<{s`n1`4F)0Nm*yl5bPJ?1k=Wq z7Q()XYppa8egP?81!1l8d<I0;s7T7RsJ6+IFvV%T`eB2N8K-T!^dTT7dVx&SyvDFE z3l4yMg+GvQPz#(mMFmc7OMtk>5itK<K|%hzT)wylCA)<)mFK9sP@mC_gY5a3M=r?9 z`?KO2xz9_{+$_vZRF*ao{%qnp_zJJQ8CbOdjB|0qP2;hq<m0%pj>T6mn(LOfL9h3; z_9-DBYST6E_PA4%R!l!s_W60_K9uPm0M*aIw(r~f`~uGt3xP7oz%G(H?7DV=j9E|9 zc@>BIJf*8ssikqqy=q@7<#NS-l*0|yo#<7_(sNK!)2ndbVc_is>}&=&9SL&0wOgZ? zsxOa>FsM)VI6;`5;8qCa*Qh`!Tp4p=#u^+n4k0t#HmB*3kV#HRqCwRQ9CJK8zcR;; z>M&MJ;6svmk8MwqU(Gp^$6-ECztpr^V|&9P6w@0)D*j=#@L4?{jBm#gd#ToK*v3m# z12!neabz4k1d+<gz}}8S$iaiY>sFx*rjdb}Yvmm3UvqaAs(?Aj!>VN*{A;EI%$ICW z4M)#nq#^eZBzo*#;8OyW7Jznn7gN$%&B$=~9ZMa9*lg9TNRW4Ua(RE0v;CU;0x)bJ zu)e)JV@b(e`lcOk8-Z}B1m^0oD_>D36>5Z25e+Eied9OYP=;JjG6^FFM$zJ(yXE57 zU{z>67H|6w`YH!s*2$gv;MbP%x7rLxo2Vq2wD&tx8SsnF$QsJ)&b^Mx#Go&>caf)h zFr>{M`DL|c^-dnStQwm$NXX)+Ch~nvq4Wf(?j~<v>7{;>p1$@X5SkXR{U`~Uziu{* zGs)!SmhMMIs`e9WdCBh<7jzGMFG=!kzj30NpIGk_{A%q&((l^;nqTK|VWwDWco{4# ziU~S`7QSr^EMChaK(E~PdVEoo@pPGxilV41+CX1A1eT>k75TbS3Zp_beF4Zwzga7f zMrDC48>Xc{(q7|}dg_h<{5Ambvl(Sb|5-QnS=fRA94_e6l~GFEnUBnQb8Gb;!J}E@ zCR)d%;!&Y(TnADz)Ui0#=#gC3Ndw~{;J&7+pQr0d>clR~pSJ`{BcXTuQ9=5<)YX`8 zH3JQkPuwF72KadavD1?Bpxx?f;fJsg77oL@#@i%2*Rm0Xwt*21wJV3E0V=Klaf)NS zg2-&A<$77Fsr9h<#i%FmU1Gm(%V&QOfbr*=YTGhF?e>Yjv4Wkxn$}?AQ3vwxBYLjB zj}U>Ounr9W^34v$$tA9gCX^ahaN&emgs{o#l)uUSTAw<AU9l<}+IoRm4Cw6Wis5MJ zmFuejn+M2vH~OxNijx?x-F@%<)ad5{VGQ7G7GcMBRQTs<F<@Skc!DbU-}3Ix<3$LN z=mjsWwOkbhea-VQNf?u!Snkn%dHE0+iL;ZZT;gq^NW;Sh2nSJ^xLa0P7GwO<q=ln2 zA=p8Z&u3Jjx^q)m=OUs1{J3v%!hQiz*mnhGrvgF$EguSZM_kQaOKINDAXNVdih=Vz z8o4)dY@cMI9-ET=j4bzQz_UebR(iF&dtI9EYXlq}5f)qI9d>+vEUL9pocl=e^XNCK zFtKL>J4*!NnOU9+*6!g~5^j8oz!!&%a`9F<nJP5nAyzBr8`t<*5`cVC1Xk8Jg?&zL zAgd+-ZQAi&8AbM8x>Hc`8i?I9>E>QLKu%p!@4BtBd9`{@l=I@XDoMsp6)8fa>f5xu znhLp?4kIv5U|^^8ZhUF>&a#@O6^vuv4KQ6);dd}MKr4pxC3-Cm9DnhUmJXH5o@=om zc00YgEABQcXZNN)pz4W0<;8sF*-(&nU|`EvPdBtbU*e}!8`5m^)0G<?oRxzMVA>Bz zFGr0CPNek{mK9*Z({XUX*0D2PPFq}^{<sMnI$r00ZH=I+^H6RG(##F4dznTJyG2+u zAH4Twdeohj&Y?JxYNruMGw`!?t4p6z7!iQ_kGJyowH{O1cMq+A?-(#}+<;y`k^e%d zBG!6@Yod~>E7ho^ql!Jr>1V)kJb6aJuEV>wH_A9@?gh$0fD4QE$3^Om)tG8|S^^p6 zt*0KmJ-qnh!jG$tCq&&e^rio}UIEA|Z<=P5)!3n>La1|QX!4{&Gb$LQB|e3cL6h)1 zHtdJ1DyYhwz?Q`U?|~XN1W{M0e&+LJ@(PO*W(NR~lzdfg;G{C87ZpBMnCZ+hvg{A} zZdLQ0>lXsq9|zazmkPs6WQrPUv_escY_ne<I1#`T9+kZHx}Jw(P2KU<m(*-K4ZV>q zQ32=n-YH<&2x;~sg(|*p9JEq&-wMq;y3)QU9nTcYbu9@!QMLI3vp*Xx)+68Uc+`@Y zXb=!l(Xw0g;LJWK&z%TZbb&=qwxhp%k>~Ex@}}#aWQuFwqO>UZvCoaF_8YdGfusd@ z&feLt`0)F_)QL5+CHo5o-lptp)7f|Jb@H0+n?+7bzHS4c;{8)w28t6S_62pX7VV4B z4@UL<1rra|b7Spgew8}vO^ez7H_OY5{R(p$bE)h>2aYXHoR7n@$=dIqXhc`IkY;@W z<79y6%jrH*ExM{##cI6FMme-ue$r#7?x%O}v6Jpe+mtx?(23J}iJSBCWzVl09_2|@ zytf}ZP`EibA%ebd(}Xk^>{Yd2c}tSlG92eM^-yY+>q5>&$-5rlc^2k-l}|S%GD<H4 zww43ZcErkWS#*KJwGQ@?*yx9gik$0T<^pJE&uTQKuD~IQ@8BDwJflo*S;9;PwvY`( z0L8XtH_{%iS?Je2ZB>mWWo(w7&+bIyI^lGwgYNk@neHxZEf<Px_CY4h9|EN)8n#R> zLe9Z7!*Dy*V8Hbo8g{=}$@2{-7G#d3BrX`=7ojlSN4@PxMgeE+zBNp1Wr8cOZhgP~ zxwy#PE<SGkd#}Fun$-*R+9q0f*9Ec>+Dlj>$<W{6dbPds&RQU%tVv(vq8+?qx1rtC zy%a+%U_cqb;28tngdO0rKdd5VD>Yi<&s{Tg{CkKMt5Nkk@~V;OwjBsnlZD31-#Bbz z8ChFELlMeALAsnR6L3xY0oCn!!;TpStQD4yfp`0QcR2{^D?%J<j~@J%^RuS_hepmf z_j5K+DlS#c<Q)DGx^8m6H0U((N1Tf2y`bK^hSjuV@B1Z%-#LAu7xz0vqpY^02&D3) z>or-6ren<}eTOpyPtzqETWySh@K<$256nw31SrS3z>}sr8>r?!bSpC1I7b=f@p(95 zq_^;d*ZcZPjTnJ(XSRNbcF!u+YxyEVwgqG_8f(scGPgaOess5OH-PX6s@~Pb&LH0S zz>yu9LhALp_e^Z88zm4=M&|HSPg=ZpZyR@Vx;-c<CI7G0|F!zRR{z)PPuB{ydqOf% zNfW<<RqDx3>O;*swz`-0b{uuQpLnOS@kk-<)xP8TO=Y_z2X(eF_P)Dv>9wCQOKC%+ zDG6qJahShsWJZRpPE3}~IKfKsv|l_{tNDpf1EWkJ-8uKV=|w~0$@Q$srK3rlz{62x z92@^Ujs>{5pu~LR^3xlGmY?3fZwQ#fph!!3xJ&i)SgBL!_bEySHKQ50>g`46#XA}4 z9<M5`)JgJtXZL4zJz~3gC%!UF<a`e@=QR?S0}B3wMTGfJ)zeQ%R<oCNw$^F+4ht!d z2<b~@To%MdvWGB#Cm?FayRbvMwGx0Dj6+~)^XBif_(BJTyV}>H%b&aAn1ul5&W-3B z%~pEQm0-pRxxSWxt>OUjzFMaO+f&mbd-)sI><yQ4fw(Lg<P1_c2E${dS$UhQAzb+0 z<l*po`f-^Ep*0vEVGus)$85M{0gC$huy%VyZ@H&wczMBjO&e6#_mukRt_STtT*jf1 z>JlpO4{XUPEL+!m6DN|VU@wu9EusjCME4TC_Bfzw*1?=6kwmfKYi2{Ky;*^Yn@ISW zP=46`=K+#u9c%k}!feTl&h1%5qd4YF$Mk-NkyG^n8(y#qlk9>0Od-YZW$=JtTMn~M zh<L^mq)ptJlhs3fos|yPYzK%WzpPy1B!%*L*Z~!Vi=tsgUYqyigr+<<v5q)3ZlH?w zv&|fj6lK~rP9CpYfn!Nkpb^bnk?TVIY@}H&O}t{URL>0}NiQ{7yHqpPfzp8LEb}a* zOQRsy<_0Aij-!4F=G%vWas#jg)vQGhnjqtl@oTaBO2CU`qZD{xT<I`#BA2&r#EwdQ zVe?XCrx`wyEWOy+OhJ&W*W+f`LNA=vHKmcBWYK<O(=|MaE{`(sz08-MN>>7tO4}Rg zI>IS&VI|3E+)GhLvrAtmJMK+dI}#D4ID;w5n$C7A!%sd*+Po|=#?$&3x|E-CZH}Gl zx1F}wUxaxVg4Vz;U+yd*++x57n>?yxtl{qMyEzNhEL8C+);;xGTY@S34f!y`iiX`< z>1yV)B;r;ngH^1WZpx(WGXzk#V!&CAE!#Mgy<0VYM&(2as5fR(m(P|>F=*W!z`JZr z^%hOd$n~jjUd|vC4uHICS!sMVkb-dn{g`0vC!Nvpy=yGb7q6LL^>AUe|2zP*n0$<s z7uj4s?8z%iF>c#mkQow_Y=u%GR3=uJt8{qeJ5hDAfu76<mz7Ob)IDISF)mH)#)8g1 z3X>I-mX|2fZ8P=rfZhY-2U>!vkwduzU-J(!ZT;%Ldv}|&Bjoep9vfswDwj%jF`pzK z?@BW*eGsK|c_6704dC<qIbBIXPE9>JId#7#!7p(Au9!3tY@GGD>WXqHR&uFaWfO`z zLLB>8r+S4hdZC@?^j2u2{8kPp2rPg!BJwy^AXTSkLl?P?0BN=WXa}WdIhL#JmQ`!Z zE!jjm+9f_QmrMvD`k_+zKtw+)eCH~)5zYb6d{C%jf+cpy?1L-2Y3G(Gj#=p;O8_>i zlg<ntWZhp?U&M-XUE{{Utf?UVU=>xHbATP{ez2c2do_CuWJvP24@5J@x}?Jc9A|fW zQ!0XJtm0&#dJI8WQ70!w!xU7)nGm2d#Wi$l`*x{ZTaor0Our7;2Su=Id%f==wYcX- z0YRea<jpRmZmourt<`1>sI&q3<dgIVmr!kWTL2ogyxg~i+>_G*Dwcs%+tI4UL8H8- z*Cde^NAb6fXU($V>$kM_Q=fk_<pTSR2v$fbx{u9tYGbg~+G#-Qzh4xCV;J5QY@|^1 zWFC7oZ*0-{yUIPnu1J}aTo675snDj>!&nqZGs=PeBt6@B_CWf=4RoIT4fV`(#*sSs z^Mr1Z#<HfdJ@*y*n}o^t%+KJ2Y!Y0Q_ekaLde()ebEL#1Chi7hr8A}3h?9VweI|P2 z+`JVOtbh=>YbJY^Z02@g9l)_2*ZK~`4#6DBNx~5W)2=j?;TK%#)h&gPuMst3{{q|a zseoo4(T1h`Aa9Ah?Oh#V{$metlW%ydy9qz@m+pLxdB2{+vF=3`?b8I=?F^kJc+V_- z@=&r;{fz^fFOtNTMT5A^$5og2q=+p`W)uHc%d+`uSx?^z?e@G?0D{04NR!C2&VRM6 z(f_b4?3k9=vPhTcC7z_Ce6eM1j`(U>qKJM!?01$`WL6=zEcU7*GvEKPtkcsEvietr zODxMBmsr-_ua>pZW3ZoNv6}r_Y+3thH>Ao!?74BHk>pzf03NW4O;z($ek^~e;^>@V zY?zJKLo!2Z)j7F_!~DavxZ=|ISqd4#Od3C+q{p#0`J3yTs-9VXiu!Cj9<`cNP0hLX zD99(I&)*2*d~|AQXmI1@b#(-BBTOnC2Xa6+vtm=$hi493Q-B%;#C4@B3fJs^7Szq@ zTVWW8W8K`Z2MtX1>b4pOieJU_|N1IssLPlX1LPaF*Vuybc_|)1s4xPl8rz<{x^cif z=s+~;aH^@MDm63#K{x;k><*85KPnKK(CE#+l%GYz?6hZXbZ@qH9{|=79BaPPS7MqE zrW_ifW97tNAGa%ajleGgmvOUZKYbbp(<EDF*GD7M|JxJ38p2+{UWT<diF9)*c5KOu z<)^adf;5enx4U#HajfZv8xPfR6z<lTM%A*j1{G!;X?1j24Ac67s8bSIxO%!lGx*Mj z>1}71S<m>+#xyZgIYD4}B5?1bC&vhV&oY2qqzUqxeB;0#fQ2y(!t4=V#?b|-bq%EI zw(V-46yp!?ifhKFBm>1X+njoqSIVNO>|IDJH00gs1LiM4CRRDFivd+4NblVcN(tWY z%m%*(oS3Wj$m!AnV`q`k;S@SWiI&lS+<}9ud4T*em0rQ+1ziFtql0;7{E?PLi!Djx z2D*w&-iqE|;$2)h)o9hH8cl(w>Oz*NKm{TxApd*;-#2EFikgeZQC%W)oE4DA1)n}# zcAc?$e~?>9;TNC=sK9Ff9?p^F)XDwBlCg?2YECuCJR5B^JkYN6K_x^Iq|58R?pC(g z`^kvUP$|Y;pzF=*b7Vk;CP@8MX}si+_11ux%yupime|KWlxz+uU4?`Jj-Btc^%*)Y zBfDH&T~tde9D#D1izO^Dv>D$JA-D0#@kLS25<7ctY81V7MRZbd=H2Ej-^G&$bW*5X z!x4~9XM@JI`9XT_hxU=LVyv3FX*DmXs=UjVQ;=-F^?rrY&Z!SuO9x|=183_{^uFc; ze!oANUAkqfY~_0)gS*~J1Qo3)_|*znbzDL!9|SekZ;upRG^vA15s)ui+T^>f^Hg~3 zqXO(BIQTkyd*nKcuzc|~0So8;@cPY5X}}2+VYNpkosC@9pV|^yH=3!e^-kDLIC>6a zzbqk#%zhhE+*9z=L7r9TXq4oo){s5jCI$r=yI4)ZtGe)=K&UhYsitq}c>_NJc8Lx$ zKVLpJT1{0hi^mC7eW2jcmRoN^!U;=|*BCgKXE9*6<7eBx{j)>|aH266jfw;F!bT>9 zG%~RGM{*tPQ7?xWATCUX=%=*-j!JbftMaSgq=ut3W*=@I@ve?|@lkf%+eiW<Y!mL9 zCQYotU-D1{F2puz9Kp?go^aw7(9{U;N(l2M#~Vf_{z|*cWk*kki?s{$e;Z!hQ|Nt= zmnG3oqp@aZ+vJ;R9ZESpA9<-dJf|64y!ACqSIVKitW@fzCG;&VIBpg_%3Ve&u~l)Z zh_;>EUJ;G-63uVmIi)5&+<C!CwKd~^&><al_+b|6u<v75JnB##b;y6wsMM*S&>)*d zqU?AXvbLJ)6k096buCA~$w_w624?XxhV%ypwlwmf;q=+=T0n6JnFZ_px@BJ6@YLb9 zKcdU6<<B;o6tr8}tV1y^5(xK=$o{u+P&||mJnLIy$M@+fNN3Prw@IIW8dCXK+gxGE zukXA6)6exKeqIC2A3-jv$}#9yKTimyglafPgI^;M1z-K#0gQ@M=xXL-KezwY&kcG7 z-3z+ipv(>Cw#Og&{QvoR#){q_k)NAYlljQc0W|a$vd;f^er{6S9~2T&WR3is3#%)8 zI7bgl{G9Odwr}#{$I{8Aw`{_0NjcSxMqE?TXdRN$yJeuWpl#4V=}`9DglDxn3UW^h zc#fomT3MIR3AJdE8jwk1j&AUIuy=D;#3G6A&j6Kv6bzMqS3y$x^?-Zn0H4e#I||r7 zKDgzv7UZ6FyKR~xBdj0MnhGyJo;jTl+p9ofo{M2_u2I2W63`v^U~*j`IJvOP)#SlB z92*X(Hj;U(RTS*CSG~)Xx?FFXA0Gl@0M=A<seYU+kZxvyNxgJK;ht*yoSF(}n}!_k zOiEKs!lHRZhl-9BuhvQq68r;aFQu?s@+*{{@k4md`I`k<+NglY_{V;U@b0k+*Y*#= z^dI^qbrr6idHN%TzPJf*-lkXPP7R|v8}zr^K6d;pNsRuHAAOsP#4{y)dpa81hN{-M zZ_j8Iyxe%84obs7t<7;?pz49}_==tCD2p@l#-%n{^Kajf>dGu-(0_@F9FFigE^qMi z3mDbn<Ok=D?@kl^aI7jX*v=ftrhF+cOQSmqdj^Nv{!xW3m|VNRE*-{_X`<hi4*$sS zzTc*D*;w8ycyN|*-9C#048p-aFt_Th91Y=OwpB2#N;4$Jx4$<+L?|`|)!P;onzI19 zP^9`cLo*Ad2-~=Q+<VWo!FMTWTFSY6-U{+XKp4rG$)4$^KLX6NAlv_gqg*CXlEflb zd4X(0^wH~auK4>^>Ec75z2ZZked0r(hH>IUpCX;Ay7x814+;D7r%riZNI!(!^WC$8 z7W>hmo4l3h?QvfVp23!{$JGCoCuy;GGajDsxX4XGv9lQ{XZWzTv61Yr0L$1wr50`T zYdG^P2`B@A1@2gCDW_N!ez^M*kPGU7Y?M>w>vjMvQSusBNjg-s&>W@L<mv&iI`#E} z)Zce97Q-KBo#e&$nmd)b+4VW*>FknZqkreaDOX4qI%*CNPm9kE@lvzRo&Nqaxmd~; z^zeShWCqzfY0k>CKWpd>CMccR>!`CqZ_EEggOmaz3!P%-s|H>~toUdt;e(~hZ_FJ2 zcr+Hn*AxGS+J9)4Ec{yv{;}EC|3;NRKC$O_LcgQ`LFnNvb4RzVs+(e~9k&H3ks7_w zC_In*Nof7_u})M*jZIcE5QsvM)gCfDUA;~H4rvd)=4W${k6Ipeb>7Gb?dc(JN~FrR z+pcsfMPh^n_oVY&RwrG^tlyzy9zM8O>7F1-KeysE5b!tT;OBjdrUlpAtq%nC=K`2L z?c%(*N1n~Jpx!@@g~}c5rVl7{a~L2QrN8F{ZkR`ef~*U^?Bi~ji^_mW<&RHUTg~UI z1I0u{2sC1O66PzIv+E;z<8Y!}9jsqX(Fzi!s3aH>S4`BDn7a23M;`eGCsOOM<(t`W zPA1M=kT~z^(kKz;QV45yxM+p%{foWiFx{W$oUa0Df!P+jKOCp~^9U$^GuZ(j-G|oU zW4x6Lc6|=<f3gvjzaHm+Pn?rYQ1NZAx6`>fbyn#rKd~iOWjsY*Qc3-ZM7`RK#<EWC z=UaT@k9=rt`}twavWiZ$#v!-#B$C~^uHjid#iqeZDp0x*6t6wW^t4viSIUCwpNa~y za%@XX3yx1gSreG7A3JI_dF**!rA_oiGZ;1CiWXhRyez+2EqSm1CsO(P0W>=eymf_k z(@;ECP|>K)%ftqwlpYu*&2InoY-@G&8D0&0>6OIi%=xWEfm#2H^1qz>Uj2th+X_a; z9{Id_oa=davZdpB;%-@s*G^+IH<#_3lH|POA1iE9>k@V*u8^)9r!QOV%hslyH7;`e zTmf*FiepU!_&0{h_>#T}91HaW?BMRg#P4PgjXSEB_E+iMZ?z5Q!nDpBP>Z)~k~Ohg zC3j!|$bEc}S~YE_G_fmj`Nn5ksul__nf}b@g3t*Fucqa;-k+8YayJB^S+{C$wKQ?u zt0p;xUtiyouQ{xa109X;Qjdw6yh9&>xK#*pWzS5W|EtbM%SegTFX&uloJIBDYhSd` zSV$I$e}yQ-7tS<Mg1c;dFLKizI%Bl6lKp^xi73w*D1{A`I!8j~z>&NcpF?<2y|#~C zNQo_3Q~#=|B0kUN|0b`N?`QnhbKvhhR4#vA^tU4RUthvWs%|emSM5gwnP|nH0xm~U zZyJ66h!@D*6#(U3wo*ii=~KZI$(@ofM)ZsDFq03XIX>dco-JoO8kBOg-#AE>?iNN3 z!HhloD&{2}bH}T!21wvVXAlGX50G;k6tWled@*}}^#e%#)g}GfYC2Ak%VK?@Q^%(k zd&desHP-J0!tn->>RA}GhxrgN$0}6j4=%}F=QR3JDt_zyIN<YvmH(`aFI1NHcM$GP zm&uxHs<OD64;DQ*7IRYcfqqe{uLMB&3Z!N(I(OiQwEFV*lNpM=%uSZ0je8v}B8?eD zMG+hhE;KCWV>6lHbyvC~pfcGiZFz_9qj@4MhXXQw8isysxBbluM{Y5?H-LHtNN<e_ zV!!fE-v&fgKITs=<YdoLxy>27>;;M&$BHB$Z1}f4_fB{_q8j<fq~zaJ*A|M~ANL0S zO?CC5xQTZ!q|u!ET-o&H54#uto@&3jgr@kPu)p%}IeKry*lxes0UGTy%KzOC(7&hV z?`qVdjX@!Jbe3?vrNxoIe~&84(VO@`-=lgpY7>`MEwZPspRcfd;||USndv$rjB^!a z3=<OPNiAJA=IwuE8nst3F@Rxpw@dQ2JEGEwlM|!>RBtyp)WH(5ST(*wcPK{{E&9$p zbJBZ#bNAK4*2$2Q*7p=|xxta3!;XFjPxb8p%1s8go6NEPEZme8^;o1!6Qmwbky~)6 zK`mjUG6O1p1{ubZsz|9e9bKVcllt-y$D;1GL-|m(AICJwW#uu(PjFUl2ZgogFNW2Z zmXI^5mgiU>sdCGyKLKQa3s@YSTkuklZK&ObrKXsU>5{(ndt<<Jyvd$gyL;P0;-aTq zHUslUNp$ZnzdhMWZ(S)bvrfwv%8=ws;_3+Jd2%~nfNN!w(z+3E!NqA@th^iyo`$Td zvg%wDhC1j4-#}qOtzdi9q=0q?6+llV$E^Q#m!;IJHxB76s$fY;Z9D-)vr*7`wa&39 zQ}Q~~C2B?CMC}iuIB_9>zuw+!8BQ^QtKP=pgz^a><m$(;S+hYQBOe|bXUwiv+<DFh z2*Qt`82d)y&v6GTEF{D9j~icq3b}G*o%1)F5ydYD9+%1I|4HO>CFICP_1f_>@^o?r zCcn+<Le)m?2$Q$GYsH^sN<GCQ7TU#@4jfkM8{p!tnjh4Zt{No`I@K@ykIx_cnzKiU z?=DphwPDG(NezFjCjZz>NH+Kz8=!w^wh1-+FE>E{@I)5f;I|u~>J+!%ZGb+d&tjx$ z=y}*KBGHBu<96+MzV^uKV6O4lQS6zb-WYuWPXIF4YJhCiJ1@KX=I~B4X&}F921U~9 z)K=2!WKegl0rmBkA2$oxF;CX;p+X6yy^M@4vEg;og`4`Fzdv~B$PWik^!vPCdC70n zrCV3e=~>J9E37PPSfx&q&#S90<3p6=eJlFT=)U}BpgZAUK5;^D!7?9=_VJ-q;eEI8 z)L#td#sMAGgSS^MsdnG>88kM1y(jX&efLUZFJ9(wi#zS7V+{EZ3@k14r{=!zJa=_S zPAe9ZDf>jb+U1K(15azyFvnP!aj-+CI8N7Dhl~aM#bl1WTB3E(oMl6pODy<5>bGC} zXz6twulQSoao`&TTH$+L4@7ReDLDu9C%NGzf9<nN{$wz*E5ThhHCw#(@OAt0Pa@rQ znlJ5dY_9%Er0X&ArTv#XtA7$XyW-F&{xh~!|0MeMoJI5U*L$iJy=4x++f#i$WIC1h zSD%d~j`0`7r3R?Hs*^3-qtp*v{A{z*g5P~u_T}svPHJi5o<vtE(fH=>R~~`E#FQ~M z9mP!2#z0W3J(@Wq0I{5glFxkL++`&;xkQd9Xr}j@()ABh-5VpNs|9r`FgLyqf-Nov zy{)+zH0lXJU(W}>_S80P?UiGDM?QLfTU8Sf69D8BILsG3q~COkL-}SoEXmLor_a1& zhWks5_l{I}=vJ0XF2P!u<_p>_qhSs!A5%NyJSKS!`@eswPUGOzPQ8bx<@1q`eoztn zsAOUKr}WH6aoRxVs>4#HPR-4NjFEp@&xNRGv=Wcfj`1Rr?7kb0M~n1$3PtbkTaAC# zWk!vnOTRVfxn2&=nGHQUP0R^zUQF!&;&npevxi3cf83`QUlV?Q->E)Kmu}CxK3h#N zK&dv1eT)-*tU+#~si<J!j0k*-xZu|*lCR+4=7sS<L<Z|u>*DR)=XX0GS*SDUi!`I9 zvs@T($5|zcqoHqW*bA(2R0AC9r&O*5=^{3$rqmwH@^4xd^%;m3*1*}};9ozT36_#0 zyZ=inkBkU@Q_#!b`uy7fBR=nJVbq-VUu_)?>l@{#{u4G?#-$fEZ#5oC`abhk_>~xv z*c6n=pffphCn!Cb+F}Grd`Yk#@iOjB;|ve_DjgsRz_e@8f=hcVeD)c3R_KSUmaDVf zYZ>TgE~lRNP2cF#pZ=n?-%;>YjcBB&<kN=xKMP=*-PN6rM?>mspV(Fo&JuiP+D`Th zSoapbiEb+_-la)2xaSfmdF&tin(fms|8p5zRkCcA`jb)CS4p6QypiH{+wwJj<vAOx z-0w|qja4f5DyCe`a5=W;gRS*1+d3<Hg_5qGb^S)Kl~;Fa9d$ct_QV<KRYgO3WeHe) zO>g2w?ER+Fgo@2#y;_Wj8cP4E)xg^)oyYf^Tut6<{5!3vhQ~0>J@h}m(VH*11`^R? zyW$BSy!V)!#-!-CoXJr;9GO?1&KN(ZUh2tu&~X)Gh198#iyl!?Cf@<@5A<~Xzzp$8 z<XUZ|uHK{v?e*7m>S2P#TPw1gk$!)#Qa3I21Vi#kGm)fSY_r`ghX)&!u2>{r(;L)M zdXSuCli3ualgoUyMt0?PJC@$yOl9>gcG`OA;jYg~r@vm3?p>-UwuITc<7>(nuC)hp z4IeBEW(&J(4uQPAc-{sZ_8kl9E*}7LfeI+b-J>sD8G^KE6Mxt73xKZVGFE+<j&Q0C zOYH~HDN>OPkR4|@gD`?Jg5RBz9iq@_F+dW`_hJjK&+~P}2^9cR3vB7T1fw`MWC8^8 z*&4f;Q-R|q*+8$w;f6x=$s-}rKt#(#7)|o6@k|F(N4DbC;e4jgZRQeu+67!;CsD># zWX~*;Zu$hocWltO{%ZN7rK*mrXGp)>DXodwYhu<+-x7+p;|~FiD)~UWOOh|pBDI%I zYdzq#qpkO2*t`4o{5EXUm+4L@Qbn#hQ003lqAVAP9sn}z1kM0KK)%0p-&-Kn<PXwX zoA9LmRrL=7RDctRV@CpSt*~uw0r@Uuzl(Vmxi}`1fo~Vg*xyd$AIax$g*jVcy1Gzd zH@^O;kgPZf^3PEWX&+d$FVAE9jfHYA)JYbEWD7zZ|CqIr&1|icTpA7zH7XkC;+`oo z!Da8Ehzi#=xw#a{nat^>x7bljok3|Z5LDJ&4}ZWpbY)!#0~6n+j$7%nW$eim%+<?~ zk~UDb$o=-zC{Zdt|8x#7U7A0&q<~A<jAIpC{_TEVt}Va#F#|4=al)6y)hR|#jJ%$5 zk8b2<gV9A$7!u23y+i9{%vV{&{yh5iN=20P>XriT*DDpJ8$J~%m`8}suzKhvui>q( zd)?WcH+s~6Nz!ZY-XVvj+;o`!^;<v5vwlwdSjsJm>U8tw0%xHJOYaW%?)7`<@Ix{^ z{a&3$`=xr}H!DRDBK~5l?~W;-O((f?d0DrMWN#}fzcFQRC4K3@F~9R@y$$BAm8GAI zC@jR`L=g@h#Y)0D;koD0+M{JYW$BLEd+2)}$iQ4WkZ?++t;s0?pUHFdVK2zHF5!3w z-JSbIgaf-*1c#*u#i{-^+&g@9zw-1DJ5%hAm#)I+gj(4sfqig3GU%%ccXiZ;$G>%| zXY0D^2hQrc%>I%@pWl!1oST!cwY}Ia6K!kcbW>}ZMe-?!3=sd%SO_2m(m(_mkOdOR z0U6{$0Te+AltBelK@Fw>noCdz4bX(?panBP8+1SyW&#cLKp$p-0T{w;m;**&40JF7 zQ!oQ_m<tv#4=iCmEC4H52#dfPY`_-mz#bOE68Huf-~f)`1kT_BuCNr`z#Tlm6THA1 zd|(+c!53KI2W;SgKLkJ^1VJz?hY$#bFjxUx2!{w*36T&5t6()m!y1TzwGa#IU_EU3 zf9!n+U|hw~@V?VYdS}VK+b3H#;D&nvY;YHri!2G*U|MqDNjja*KHZ7ClPrM^Hi5)I zFkrBZF_4e|34tU8NCF`R2$&j5Xd&Q)UPDNS073theedlncam&VzV8ph@3zd&&d$!v z&X%`NG>g+jN~A?bw1`%*QM8G6ak@A|Y!aKrnc^(5MQjyki?4`t#JS?D;%j1?I8U4} zE)ZWA7mDrTB5|>}MC=fkip#`K(IIw;%f)VSh1esm6jzC>#W%z^#Wmtv;@jd{ah<qc zd`Em&+#tRuZWK3(?~5OZABvmBkHjtFR&ks7vG|GjskmL-A$}(A6h9Zg5Wf_^5_gHa z#XaKJ;$Cr|*emWA4~PfFL*ilai1>|oR6Hgg7f*=aiYLWW;%V`Wcvk#QJSToHo)<5O zec}(|kK#q~l6YCXB3>1*iPyy&;!W|Ecw4+9{v_TNe-`hFzlgtzzlpz#e~5pIe~I_S z2jbu2L-CRLSo}wPB09xh-wVEhrGrX`l@2c*Q5q~QDIHZ>S~{k5Z0Wet>7{c^=at@6 zI(AHa`9J!7*9XFKjO|a94KYHF9Oob9mkqgg#0Q6Mo4jrE<nqVo_8WNZh-*ho9)0^% zOfMT!HUx8=e+YB?RQ!8$dU56BbNTPoId4ucTk!Z?Ec5u>H>Y2_1i}kWor7tZhtIFC zI&}_)5jWyMT-zqUIi3GqJL1jhfP-o+8#1{ZWB50DH0MF;0<2$5m^?Z@1gY$zh28i= zI*fM3hhRM)&%3f@+vMA)V(8itdg+^oV|%Y1F>ESQg`uNLj1t%?>rYf;8~G1gfq$4@ zw!ruUzAmu%g`80NI=S2m8|4ii$iKs_u)#B=UsN+Rs5<;%`Qjj`X|<87i~s)p_phrz zA<i0bcP|`$7NK3?|Na{~z|fzLz@L|w<oS}bg!tysFG6T7rIkYHv7?RLw;^=@!k5il zd+4K?MkqAT2rV{4*ASLQ2+ebp{pNx^-!UHeE&zO&Ex=Iz0(Y(zikrFl3v<DFg$5jn zq2UmkWQLq@!)$49n%wy7G!I(L(4S_iX*-E)O=j+w&Ct>%Mra+RH51%XX6`r4w#7WC z9|57VB^Wx@Ec+PLJD$>_CfqxaHj&c89$0QNTZHu0X6;`qG{mDn)_A}Tn`cjZ(+pj3 zq!D@p(jHu3@czgnjL^23M(EguM(7YT?Pn(3Dl>Nlq<w1vhUS~O)6CG(X2{CD8l?Tq z1xD_T6xsoG^jnCb8jm`T^1$+4TOBt#DCllzlF6&vP5${D{M)rKPtn@$%J_dn-XV*V z#~x{<SyFe|cq8pOkdkJyL&c`XTYXe$>iN{sLM%TT<@uqpx$0eQN|R;(Rvm4Jt6i#= z*vh#JyK2!sp!A0%f4xjg$d>g)TiJ#4a$(6G(sJ73?uOb;`W`j;S9e6NkYzhpn;~n| zm~4h7n4w0~?nWTAo<cu^+74fmE%XG0#!=`k2o*Ri;oFclfpSlPwB*8UA+)g(3XNP~ zr{2)`{G&1LKGW)Xg&s0PH=85Vug$a{0xf5m_KMSn<_uk9Vp(m{a*P?8YKANee7;#0 zt={*|+WIcc7P<q!WI>^GA+(7~Y?z8zjsy9-1k$Eb?hL^9g9X__mL0F2Wl(U0hsFH- zEyw|c77n>cpc_k{vn^ecjMs~`?ah&fa9yPIo*PQnHbzQUClkpGq?ImBrkazfa3+>a zls3ofrk0k4GvThFrXjl0HOY7jrld<(B%t7oxpSvafyd0LrHkY7(wbPbF_SK>iKHW` z)=0fr*ryi}CCL)M5+wp1#p=>4&e^a{6K9=umgqNl#rIx$rRkkxYQ7Xbw^D-SiRy}L z^DlT)6BQK|0J3t)N3SH;zfdzJdhT%masq((VY2stDBhxpM;>_uKq{6uJ$k}hfho@( zadqgiU2l9l^JvGOuRXct=u5u8@#oR2XFc=#_@xWp`p!EW>rO8J+T2&Jy7a=1*37q` zxorLm>E+uRFC2L3)YijSCPZhT6maJQ#a}Hb&;)*~x1azQrtmipecVNmzp&2`YFEB! zNyS68EtyO*5t<Q-)yE@1-6+T_5Nn5hxcH)PYGQXMjQ@kHt{wi`=HSJ39mS~yTg0#Q z-T+gGUDvk&@IXDCfe{eXA@Zw&VhD}XAirRGqO~?5tL#Tr>Y^?lYnF9NZUsd3&A(I_ zTI4@-;>4=G&rkedL#YJmC8{6#^||ku3@yIylZpMS_WnVFtObxFCquW~xGx=h?mx#| zbM>Dd8~oPgzd5q-j-gMEAJP2E{3%yodeOi?Wj<>C(}v}LdE=P$E$z>5o*KRC;}<e- zZMyu*tI~J0|MoZI?zpyW3$wG>U}uqJXD`XlfSsMiDm!Ny>_qZ=n<8`l_1C*a2IZlT zN&f4vziyKM+Q<Js^YkMt-iqD6`KY`*Mm&4Q-u74KH(meWtUq6I=1*JaT-%nudhT;a zJr|9xoF7}d@BZ1_zPjy+xijCWz3uwfQ$Jn4Ldrv5qXB&!^3dDffWCHlNVY~&vH|_f zF5(6_x(NB--?IS+gZ~2z^7}jZ-_K6|06YH`@&}6Qaaa0_ES0@S^8Xal$KwHHkf-?k zr}r_}UH^LeH&@ipT77q7*=_s&)&5>Z#~Z(x{YIZ}Oy755tZ(l_Le~wy^(R-H`s~Ut z|9S3h*AJ?ge8s72=Iy#ERs3=ruzwh!9&FG*NYX#hpnE9MJ=o6n=2Rq|mV^%x)jzpQ zA-t%5)WnI$Bj4Bm1wd8<$k6PBKQsHGj@^M5E_majf4ua}6_cOLeE4B#--XdbGZ!T; zd-KAU*4uvZlUKg8QY*XX!RvlJ`&*CxX!#;0c$h)(P)YC*JHf;3j5Y|KfCCXz(*}lP z_imy_dt%ku%}?C9_2T@Bvp@RQF8@p4-k4{o^$3%86Z)n4qsI3c{_Cw5OXiI<Xc-}C z8E()rh-eu}w4~#)`ba8No2+jaorA_ePEb_O9vS%Fu<GhTMX~RK4G%&hFtJlRZ1Iu} z`z{3v4uO;spkSuOy+IFYzpH+!{)owk-ujnmFI{(N!K-&kIz}0Elt?;)1|7qQj!`Nd zjo}0+e`toJWwfY1^)RHRZIqLi!V5M(^El9QD5R9yX&Jn9?0+uy#|vwJ{nh5*RbR45 ztU5O?i5X)MQ!0rWZ6{`o2Qf1x&&P`DMYo@gWUxpr_HB6i_)}h3nYrNXA4-rzM0NZg z|3fDl)^_nNyIwx-`AsWt+jaIWQtA%%l)9Hbe*erXc0M`r_e}#+bFLpXYww2}Zmdkb z_2+%RduGR&M=#&|y(9j5Yu`UycIOM}*ru<)SGjZDZ_}rjEtgj6Fr!h2%0?X`)qJec zxY5+O!`!1*2vj{2t22k_aoENSHoR%Han-h;zH-yGr?zZ3W9xAeWW1<uxU2Z4YNL%6 z;$Z;!dCQH-t*Zf~5<n(oZ)3;y*m;>3M!mYB;+W`#|9JL<D_?tZ-<?1D{-H~+nsMRU zrdJw9|6=0C+h70fzlZ<fs!2b*_Vs^kyI3}IqS43+vXSFuBgferInh0qI2$?1>`1oB zj*i4$I^5GHA5bq%HX3laqn9Sx8!*{DmN*+Q#q1?+fTNeN3#Mjoz<zhZG@}Jm9bGWR z-hyfF;l$a3>7shU?Y`JuhMX<>@U)lLfTCQx3%Y<+b%xXUPd92QrCMfq7=LFqGqIYY zxG=?e%THgq@z9^Q>`4NnxSCl`lReX3%`6X-ZB@fKW@k0EC4^(P)6^;m$j;3X)mL2e zmBlw#|Ky5uwM8~NR}?APYuLFXs8jPw4ZT|R7wwW#u_m(g?B?fgzPM;W-d2O6BMpj< zkQB`^C>lc)9qDCsom3r#RGoWIHBj}ntuNZBTJhcX7cP}l&2>=atJpm)@1rB)M-A`2 zGay#Jc>BaflB#(IRdXd(N7<>G=Vg7JR2?m<Zl1X0NwHjLCp?IA3>-b-KcK3#*H4ds z5$d{3$Nj!yuIp$aItu#u;P<{e8~5FIpU}1laos1KXKlgsJWPjHb>4SpY;2{t?w*&L zw}?v%`uHLJl08E^KL!{5x{DvECnWihc)!ToA`rMjT=(T4t|KG`kiNHU&)C%x`Q(mO zLR?bNrx4S@XVlIU*ZlLJ{}4M1`sf6@du+x1LICJBmt1l&CI=w-9^3#QK43%ZBjTDV zQznZY1u%<3D$sHWan+^c7KzIW`V=w6TL8`F`)(7vJ5IvXVrpN*zT55>KES*4y*A+N z_JVv(Z8gMwT$USfenEboIOjnj?h;!d&krPw5F>}Yd)s*v5H_D0RdFA-7-0*H#z0;n zH~4<xXS_NvMl)yv*nl|iv@P1g&buJ57u4BnOa9)ntM~l~VT+h1=D-C7`NiUa&dx<* z>>`t78;L$iBIe~$H5zvok-WF;nz7aQiK4SUMpXIYVWHiHsJ0WmNaH;sAG(ofrowy6 zuH1JkBG$z@50e0HM|vesF^_4!GqLZd_lUure-h^)&6rxuJZ5e#!U{F$pF?q4z|6e| z4=D_J_vhyw%GB;H`^MPgOzQm1z@3*F+`V+{ihIOxsDY{NeE+PE_LhBf-^~bID0XZZ zCW@GJUEJOIZs&W$2drv+L6Upt|LnVYZ|4VF{77CeVK5emzPt0!U^JOrp>N5*@6Pbp zDucJwP0U-On1qoVbRJUtuq6$9%XW@kY0{T(^zaqj!v*4;y~5Yo$(+5n^ApaymC03l zn55yp&QCf!&oek%yYENHl#e9Qw(c$#=YTleB@BY?1p1gjgS)%OR&pgwaOc0z`q*S( zzPMoKU0|C8bNBAf|8#budOgk*V^7}7h0j5X4Yoom)}}G7#CGn`^O06d6pIa05Cysy zA#IvPn@?48OKwp;ZedB-aiiI}`3Cn;cZgPnw)2Tr<lY4eXH9($aJz=Qd*ykv5pgd- zY|3MiqqmD$q3`YN++t_1NvF@D#(AV7tj2yr2G_Lyj>(n=M;PXT$lSI_vbS;Ht#@~R z0``;1wsmqqoO2(Dj*pp4f`8wgbs(igwY|%WfvrAE9_$4A6dlg9?BXpf5T=ski*u3S zW4B250t-#rfL64b*paKHSui^}z*ZUAdz7RVm6kQ^Jf!tuOCI)?U4^XlskVV_w=}$} z5zHf9{V^JtHxZMcxo0qzG$g<pQea3S+GVy3@9@Y(oV9Z=z-oJU=i4ybB!M6b5Bs*k z+HZ`l+S~ar;0V!-7Jn#q=?gaFYs#We)nqad4_fkY-<|P&KS5p$lVlrwtYCRK@3gZ( zky#$@5xtO)*MgWb)m9&qJnR+u!bh^x%Ryw3+T}D{oCkV+u@JTq&eUX|AqyygrY8HD z{m7<jHVzjSUo46Z<ABr^nbZ|hS61S{r(vUYtCs_mRmHtb#FEKp4zh(X<+0e{<<&qq z`#AyfbB+<UE$Mc#FmDPFyX`4(J;BFG$C3#V6HAlL?I~PNEuBy|v2^D2>9eN5<EY7{ zP2q4NHnk-!HbmOjWKyCv9B+wWpgEihH&xZH7n#ObTBMT6jEE=0;6klPG$ciZ6(qn& z2C5QkGT~@MY>d@s8YQp@wTV!>XpCUpA{34{H-<$tl3CK8iKGchy%}Ab%z!(VZjL1q zu|zbqu`v>fi-vGK9TB0{SUOf4kBE*Up^JjOs|GE)^{V&2Q_|rVx~BU|I($OUTZ~Wt zVob}|3xXIcti-2Y*-<D8QDgMLd`#$7c?|yK2ao?6q;_b+x8f?F7$vZ1o?j4JKV%cy zVCAZk-9GVDC&r2>t+=uy017Psiw=Oos|9BC4r0+h7FfP0#Erb(RaS0ancL5uTPXDY zg?Oy23fgJn*9XkEMF-AbKA-~Y1RcvsQ-Rp(17lc#*@FmZ@Cr=tqtH4eUsQ=-6^z8m z9g5I>zkcYY7w7yVaBoa3>L-j|Tm({u>&sh_+yaXB{yPZSF@sO_HMNK8nnYboI+JW# zk%=^=#o|;d+%BR^lZi~EEfZ>rBw9qcHrbL9G00y|9(YPD#+1?%S6571vu;`G(#CKq zlNPefYAAxZL~~2JQ8cGwiHxYmC&P(`mN<Cyb*V@sA%(6!mTr!RL4?DZh)5(;O(04L zwT6I9e9IuIl+#2dK^d|2&5>vbCJN%%w&r9iQ<_PZuB<+`9CRuc&#Xvr%diUINwQg_ zA{%3gdeM+fZ49UCMLOIXF(RSbaNP!RdNSE0PHPFrW0`hQ7jDLF4zUKnO2g^WC9zCX zxLKSGFr_OJvQhDvm^yW;SRZZ;L(^i-nR#L0Q)a?=2a`(qzY|!w=argjE;GuKP2m`( zM>!<MPZZt2dIEDe#Kc613z8W!Eefnk#z93h7)v*Y6F_rqsE#trQsIpfP8P}}L&#L6 z8w4=1*)RrdCK}>l=waD=g872`N1`6^p=qd&wSgJPB*7+uRUpH2LKtjKtSKt0tJbU) zAVtj}TImRM2Uw9zs38`K*NgC4kRyS@1V%U%kF-YO(?w0BDcKqcVHQJ0%OcG{1yBca zgUQP%xv3?diN#|HFlNbA{kjzNRXP%n)MdhGgrHDuOH=^CAjZ)O{7H*?PKzX>fDc*| ztBZh;V09K+j;~I(#v)7Ov1VrY%4Dr*TMgaRwmRG<+A-9Qp>TbDHA;3kENR3N;V@Mv z2|l)|In!>T<0dtL3W+dnknuKIE$-fh$bv_jY9sX_gh+FE83j{dc}YIQEx_p5=@HQg zraBf)2o&XLD%p~#Uz&_3Q%YRaQ9>G_sfDOb*bNyaCJjD6LuNI=L_k2#)yevZXqB}! z#p-dBrZ$-YTOyigQ1>loaj8zm!>P5&>Ll6%7*%Lo0nLhl!AJ=j+XQYjg55zOq~1@r z)TUu53s<%@%@nJ{z{KX{M#1EVYttgU25X%HzbssF0n$BPgx57DfsF97RJe}WvL=F~ zTm}X!Mv1^-;6NJM57~(*f@eS<QsMd-45sPRKn=pwDJVtjctnKIV&X(P6KPJvz#0KL zugj$3HC(D87LPLkh9tuy(O6;`M5#EZVQ5XJ9qLR%yJLy!j37Bnidc+^SsjD^X%ltr zqPa~p1D9G-ln)FyaX~blj3Zzq2DTEcT8fmo0>vK1Hvt3hylK+}*ttksRfCu&=7A@H z+P)MzZE;2{o?9{Vgq77ZmQPtzGplmd5l5|9x1?<8^f@Q5tvYGy@y9MJKk~%YvyTG< zovKNaUB<FdPI9{;m26rnv5DzzpyL(Ejgi#SFw{Gxwk5s+ENxvl-k3~h#8e6r-63#D z>NX^BkAtFNlVfVI&g7H~HbZx%5|LCW6E{OCkq{(MC|4j}Mn<g_ii`FcqHTs~pDEgA z3Q%`Z3mr=s!z6C?Agmx4^<c)}XX8d;kylp-9TFp^E{&z?pud`%n*n4a<kX2sBqB0w zH*3JMfRJrK1+R%@T2cuq#i11DM4?MIgzC{M;s6yci-84BfPJA1ww6W`2%t!l@u^QH zz$_91Fy?V&GHM-*3@8G&cSU+hB(o7L^J0`55Xn?Hk&dCvPl3E++ah%>&~4G>$;_H& zFduc$iP2;V#&)oXpiD7C+d`~)HOY->7$qX9n1QQ-EMz1KHHVh)CNp%0Fx<IV6Ii%X z#FGNWl(?Exkp^jQxrGJ>kdP>8n#m-C!n$NrQy7&R{fAhh1z^}{N^?02m;%J3rKoMG zHEYH}1{4{T97gYO1@O>wqsD6|$+`48)3xvAu_x!=4|VTQd+a^BcY)pK1mxH}6`BDf zBsX4;c4UUqludSP2`Jc!{Bx2>Z-ns{q0=Ii06!i~D{u-BhT8ep5(#jt66k25NRbs! zLLIe)td?-qxA6H6=#Cb$%JmT()T7I)*H|7rq@X9*2y%EjbQX?J+z>f*)`e3>(9Uxs zF$11N#)w5>WNt<eA;eCJxvC2$9pm9O=%v(v@I+G5dqE$J<!N!Ez9vF`29uBmmjyhI zMx3^=cM_7mN-BarRz#8lEkdt_930cF5{w>(S9XFFhs&NbVLaKv4D_2AKUqu`6TzWC zA}BRIHNCMx_ExAK28bB?Tghf4EE_Rjj1!3#7{NiHlQ398BQq%w`x#<!eLc%Oc%u<H zRD;9P5C)e9M|-wiSRoCO(!r;h<LYD!nBH_FsA8lIT6uhPJzDK1G#!~(QzS|DBm?>n z|3XG5*EPoC^)o~i+(|IKsdQ#3CV;TiM=DXE*gYhunIblWLzR%5mV98t#&xj?Ad^OL zvqWqrhh~e|EFp*91bCEG!3j89<vFW3H3j_)USwTljX6d~*P_F@v@ue*VQ~hMYSCE4 z!?h7C4#5oYE(6+;09LF4@x(Hj<nhhTau~8(E&z(85@8%%5*g?Q@M}0<9-l#80)tT2 zU~tHU>l(>76OA#+K;Szy5_}|x5qv0}Y)OH&ZflA&BNVw|u?;OnMuXHuIZjcb=7Ey{ z-YrNa%v7L`bYr+4t!W${wegmeVUguP$Shv!43~vdU}%@Nq|)fssRh6WMZgj-Zi_*R zF#?342hdQ*+Q21hz@Pd^9T?Sk+6d6RKuiT(<U0YPrf>>}o-~egsz{Q@3HAV7Ikq2M z7bx<EG<U8H8@0=5b5a^65X?04xGB6onNs`%j&m!TVhMX5#nn6#XjwOl6skf9GL4a` z7A6D0U{ps75qqnuR}yK+C{c1vRrs*M_fRwys}D8WVy$MZ1zVI(gqs0^ep)5NF-|NG zH5w_cMoKHW%(7V&Y?NLRMOuv&7_Ngg0mU<PdL#wzV}jTiPKQ7N(6h!dQo@qHz-%ol zk_`<Y5a5E#K)W(4kToj_vck1e(?E3+IIv5L3SHC&n1ILlgm62B+s!EnB%49-X3<#- z(VQcLie|Kp!WN4qSYsHRk~;Rh$SLF$8l92Z<Q_tAgkdrzg{jqW7ZZ_aSc#gsT%nn3 zW2Z7yvY;rkBzZl(t%3f7z;yc0?$UxChJgYmE~m8sQ6TR)+@w+3(LskQ(LR9|0Z0fu zqz30|8QUXr#6n@i;F&I2$nXQP*Kp(nQRH79fz!<qaAA2>&Y1FZ%cK(GfDyLTBkXKl zSTzwct$~eF9R0Yooeb!2LE5$0qntv%VP0`!f}W4*Cy_6N>V_&QV)bP1PNe5a<S3Aj z02~6a4T)sk2J$>W#H(u8qYyG}X&4QY&1=YNN)y@$IvYp5<>{CiWve;8Z5jP1Ev=l> zQJ4XipgoqTrnen+R6_%Fba~uFzXS-B!RAy9EMKNwp#6;`mPgv8WsYRniK~s0>hct_ z96D~9B)T=6nn9x&s7UxkjLzgJ80V8XL|%CqPug;v6empPmg1%+t1&3Pm}cYkR6jX| zQ>p8x*5aZE&N6Dj{3oGHHVSaDQ|P<nBA>Ccr!3-$B`q*^Q;61)X)O>Jgn01|UG50> zj_i<RVwtsAME)nO4<wRnmZC4ps|0H+g!ECP%oXXWM&(LDSVkksCV?|6o}RNyMKdk% zl?i~G83u>RAY&~}FhX*=VT||USQ%J>4iBDz#zH_*oL2g16~|cgqBTQyoI=OfR2V^Y zj<EA=!}gv&3VVd8)Nol=1Uq^QU9*;ZeT%Ai9h#Q6D{%q$aKX#h9RZ;i&=Rs<xX4`N z76hsB(s#{Jt8l<oxL5ZJ7g6CT6)vWf-UQT#mXt>dUfO1~{S36Ya6ZJA)!)p*!hM5X zS3IDyLlb!`1~_RS*cI)2f;Or2iDd11O2J)?`-NmSu8mhBg@f}&l{0OKN7_)2v|%1; z!#&bQc%+T=NDIg`=0LEL8b8QIauC3_kFu?*`-E?jpq6TwEcR&t=-2d;O4{mxq6H0r zYYlb^VCaRBn`C4ZMsAal(HOZ$Mh0SJoyL)V7zxQpe~d&l=;t(vZz+*ChJ<1g_54`< zkYG6`9!k%{I5Li&<F5dspzL7;IiVYny*1lj$i(?WA@KuYOPoYB9A1N2`>4&6X|H1n z{z7a@rA&k8RN95{<1S2jl?6K0mThg)m<T}T>ai{ZtZ2DZ0|o;5oZ<keg2a3&snaNN zI#GDEo%k8lqH%_v0WH1tnN_>-l(L%C2a|-@KE%1&E<|9xNMY~jv!tTVuC$bP4v|ip za|9(ENts8jDFO2Q8k0ARa^`{-s+9Q_fe7W3X3mnhAfZr6n2iYqL)DEaNXQ$CqLSw? zjFK3iE*$wj%J=yTIDe(+7%U3$^#mdYGV+*Su47&eK98<}f_|jW?`N=lX*K-5YQhQZ z`3`Q``SYrY28eI$w6*6LY>z&)qrdR$`g}7TFdbb})lq<{v;74!G{;|vA$@_q(6UPb zQHW<EAbU~G(CsB+E%<7nf%y|fp0T9t55r^<#*!hZ9ezJHa4vP^;-F>LMv(X~!8FKO zN<C6mj>c1$IpggS1UQy}7h8Lq%jOU57z=DFJQ3JcSehrSwpxuY*UN**5K#id3}9Pa zh<RWjme-U>vLJOuzE)+$R@!2#q;2BZQhiB~xXjv95ybXPBtlnPBucqoYSLO6ltvoN zmupi-LmQ^ien*F}u(r|eZ<W~=qPL0=F}mtXQo?FsB~=B9nXB>X*T^c36($u`K~otR z{5aCczC?Z%WLG2GcXa}*Eb-9v8X$YPZFTL7PVpL`c%W^64<uxgxWhvgRSj8-8lnw# zAe&NyMAeFpzCu6V0zSdAFp#m%$~e(7L(<eP?HFKTq}Bl1lL&2*P;?m8+h^a?rZFsE z;NVW16*O1y$=yC<tL&<LtncI??d)SI@IgR#PgbQLYT^DM`PEOUG=cjQ@TnlbCkIIh znY*W&kR=j3JWsXy<4d4^Q@MR^y|Y?N-S}nFIw(y@mb1IV=tI=~|FfdvDm3}7jPMHD z`tPmg)K*qlNp+M|Un%X1&#dLk<T6A+m!V06g)9#8*<cb^<pMX9-IgeI9t@Q`FDmmI zIgcYT$y}sqhMT6C3FgMPUfLc5Yez5e1@!UxAOmLWt^5s2I9_Sv9dr{OlhK<jf6=N4 zo(b**OoM8ZvS71C5~Q9cQybLAr7X$mV{jE<Q!qp;Mbjp<QZ!>aWi9AN4UpbeD@Jys zw=<f?@r@Fk$8j6gZIwl)gM#fk8QWzLS#HW^`}`7xmeVD~8H8e^4413qZjvCI6_CvU z0yO<xbc3ePh7?PdY^c0Tv%{pylEM5lRpy_Ck*&!5_iPQFV|juWj)uyt?UF1xJy*jd z%qDls($2a+{VIhVv`;0-EwZ{TX0xrqd#f>ccbFsHp=RM=j=`QOS+ISCvM0<#r{OM@ z3!bi2n?6GkdRZC|5og!9b3I0qvuny1Y+od|nPINo)D*^>;3k1rR@u@de8zTuG6fZv z8OzpwBghNaXZvvU(Uj3gI{5YxQ=>+WXK!?X(7ytXu2$H~phiE3+J0_LF&!%VivAUA z#>-h>1-}a_$}^FYM=)Mw0smSJA=;*&XL*F%&?AK3^8tJng)Y#~m;MDszph^pBvJV~ zqLW^JxiMoYz>*h2iE;`2b@n2D(}~gTCMp~<wW5xG4u;G8v$-9beYl<=a5dv1#eFC; z8)TL<8*-6s$i>pd-EP$EJlXaT>FveYvWuxv7yEqxQf|kT&n|mZE@n_=&P<C$&bg$9 zYh(Uw_keft#3+bu8)mD<LPI|NP&!t)&B#I?`)R^^Q4oZ9q@a!YnRq}XoG^5S*0cK2 zv~k%VFIhPEs+w>4wc-WagM#5^QXvVQ;-Ul&z4O9#6^qh`d}#!LA7VdK<3kPcGjdIy zV_A>luJ0&p#FxtbsEQ_n-X+N6GeF&TIA!$Gnqutr&9+{LbQj=d0BBg31uzq^oyCCJ z(Inx^G)9=b=LFa11Di%wZ-(Gz>igBT)eAqq;jh1C#_rV5V6ztN?WnG!Mr}ZG2}7yU zLn<*;Fq)lY%5WGXFK~b@xsQg)$eo?U9Y`+1{9Us4GlInuJw1!d9kg6tW3_zGm((*N z0qazc?1ivA-DR8!vd#(F4;NXdgE*IuSw(zU-|paLK5;Syudp?l9GAW{QQ4zRR0@TD zWuZ<%XyaAf#w&rPK=o}j2m+3e#sn4(n^Ly6_!w;Z)%q@K+EqcDOJWm@-pAnYHz@W^ z%XhwJKAF)yl>V)tq_U9JOaC_KUaPnP*D7AauAt>zTsI#l4f;;ACC6a&dixCQdMbQn zka~NNW_Byl&O-DZGj6t}h%&xwtNJ@`(Z}c2(BA}ogN<kx^ksJF@7Zwg^v1o*fWFa& z+Xa1@0u6y1De-&syn&wIr4l$@(QlfMOECKNz!|dq&wXN>27aIUpR(ptY_7q@En(j_ z6)f2kHjgr~4Jo2qN%<UwJVtR~g8cnFtn3U_F!vA&Ih#@2JagvgbF$>j)@OU=7z*>Y z$SSTXgFs@{5kM8%&C(j!BvegD_f8SuAE?>0c?GoFP-=FMJ5WME^oP)R4|VjQnlrL! z`^`1w&NA77e^f)GE;>&7Ehf3$AZB(q$*>W<xf|3t8Nc78?GL+bML&10b)Q`dF?)1T zL+jBe`;nqj{nj9jC5P$b3;ROySo9Ymb{k_lj4=JU#&D{v0rN1^zl731aYJ{)f8@_i z7mU#f<MPgI7=PLgj82#w7=5${V(3|K!EGOdX7#u{nd>vW$5DpQVS}5PhqYc{AB}G( z5(xk8K^4z(NhrDf7X&4M!90e#qlU+f+aZfA{7*Y=ZLonNVao)%wGh34Ivx9TVL65h z$YpSm-0EYJ#&z_8AHt_1J)5oV8T!wpr7jJYaOv?R1-IJ==-U;klMNi8xs3mv^W|Je zX)c%fd5xKHhU~Hut1%-CrcaYCU>Z4du}$=TK{>yyAqQ}au)q#Aa2(}<V>;oGH5GXy zo8?h%ic#*+Eahxn`1B{Z+Fxo}`Ck?C+c`GDH27b>vZI)j?CJQt%M@EvF!OB`sK9rV zT<7Bg$yQ<ri~c<;_?@H@f!ja&uf3IOh1}rb+UyFhKvmF^?NBFCK7;AHDSCVQS_h~# z5f%--5PSy}y0_Bh=kl`W4qEoS&%W%*WlpJtQGbkrWN)PvzQ5Au0hsCcDKHOI+6Yix zSRna9ne&hW<zCR)q4;$V%5b@rafXs{My1{NRqB|d)bVg-(Wg)$x*0GLdj!<dtg@dv z?{lmh{e~6x5&aQ@-bH9Rywk=I`)XkUwn?di42aP#_v)0a<v~gCE`|79we*|~juMY# zEAfcRIMd($qPEJ>x!Gu(tyKD`wFv$B6Z}Yag0s<hpaN-QME9!v-zJ@3$R=hL)yKNq z^Peq^{Yg5l0sB)B&Hls&&nnC^kA1G{dSG(-#c!XZ!#$~e=!+teB~FPv$V2z1<?<Yu z5P2+(a3R-L?hb1!mzGHku#!DRg5HxvpYt7IVIcqU_o8FC*Vg}jdyZ!M;|k0Z789>i zVScN?JXvY$?t{?q?Gv0Qm3_EQugP~Jec@_;b3hFA!BkK=#-;I@Ep4c}g@@$u^o~6G z3;kL-!NBC=*-l`h{*=d@hIaT$ItB~<X=_5`$a#hn{f-<MC7#lMr9Tyf=@1?>;XQz- zX!g}9<hD=|9=Cy-F`)$Kvrk#gKv*9hKQjvYT$2+%KJt`)Ayy-Aj(~)xq28zM^*-%Y z@6%SjPb>94t=9W=_IjU&dY@M7eFo}%#$N9;UiCg>)%%Q6?=xz>&t$Ln8L0OevtH;+ z;xZFk&SlG2F4!~Ddh^VAXlI-s!9IsWJ0`l>$~HUrJf;7C9N#(MQ!HP^LplFFS@YSS ztoe*ikL+1uT~pADUd^9@ujaSURNlNd-q7dUCurA+-`3}yq*XfNq8*+^6zqCu<Ov>6 zgA79}+D~Aj=ibrdJP-$?)~gXaAdxUW4(Sy5Eexsz-AvHWX5U_VHv9I{?}CP$Kc~w1 z?=i9m<$N;9`Sbb<=Hfk{MA-*qFsZaM^t@}cTsCE&vgq%KI^l^my#!<57pyMfnr-#$ z3-(6i{1c&4mH!2ys#G}gXyJVyFTAsigT4KOeXaTrLB>F1;qNu>6zUMF`D;STm!m_~ zs3`y>l=yr>X%H=YKM~{^ElU>H`8=K~pkEWX+@@}1TK`Dz6HL-9xwMyl!d0Q?7L)2{ z?hhK=Pjc*Ddbj0sz@|3w2fT>-2gD@7$(<PJ+7gGvJU?sn<5}#0VKi)Z;0ad$Cm@{y zPkzpJ;7OiMeCir!tEWpl@Oe^Y*a0)|3uOm#>%U<ox?u-$D}*V&N@bpQpyz0$W_l`c zZk_-1vGv>zY+pzINLef#O(w!|>6eU{B=W#F@qu$P9K4fZ;GSrfe=<-yC_~soDP|XC zDElaV*h$%v*P#pjMg0u_aDQGApLiSQ_hnhzf|=3K>?VNDGY{5qXYM7xMwWvW?PdK% zYCA9JyyVieAF-aj>^L$er)PlRB^!d5L4h#!6)Yh=Ibz%W;y~(Fb^PV->G;b4$U2^# zLL_XeqZPCr{jz=Q{gv)${wu8c50RaHRVKc~rvMrGPW!4C^v+Oe9M+4DNy6VJ$7>`0 zA^w5>VqhOPoK8aK>8~1Iy>TA$Rl|qRrvE{$;|QTYW(n}4R`4M!_^=f`#b4~Gi%t-m z{b9CEo|P<88kv>4o}s`Jbc*YxAgaV{zos`>g=Px<e*ZvyuYZXCfJL^oyQ|-81ylY$ zw6<aC&TE#Qv$${wSarxJ+XsoN)=0{{WJ};m*PcRzdOe>-;|<!drr`KO`~u2Yr0Pw{ zt0+zO$HC0rJKqY=sVrYkz{3sT!FJ%yPGqipD?GcB&vw5>H-ElGX>U{hcvjuV3lPUU zg?-1P2xmKg@h5u9^A`g(E9rKAMQsZ`-z5otjTGZ47@?GA+Mv&<#N)#-I4Pvt05*Fs z+Z$@>1m7iJ3x~@4(E`?==~R*R#`&L}@XC_ipM%WpKD_9{iSMum^UIj;KqAS*8-SpM zyIiv$z<BBtEcH5;&FA9<ZTa0}W_7*?GY#wg9vbY?(t7^|Bf5_xf5pfYKiZ*uURt-I z_!}uuy`fc())%|d_%&!-(%;=lQ<QZO*II)O@*m1uUhM3i=>$NwC1|DYOb`_>HBjpE zsVn~E*LaD#R{_-kl6?QuE|_Nqvq|Kc!5pGUP5!50ce=$pa~c0%^GV>wu)zIO8Ic_Q zWUQ$=MGrXFEAPL({(rUC32si8aIT~mDvP4oCFXa+G4eP}GLI><T?3Q@%#~ygSEa7u z$YIkRHDm*GB^hIwce{AC(X_<7KExt#1Q%={NF%m!UnLFLb9Ju)8${rJ?%@yS+fJwD z>5j3{^W}kmyT?XOy1tuZqYc_iCT##+kBv6)Zj6l%`28IlueXnl<{Jdr#>TFh$z!8~ znfo&~+E6&Gq@(r4t~9oiwxqwilX6-~8>E+&bO8Jxvyxr&t{Ya;(N8vuaJ}c)_}^at zzt`*8#zv>jb0#^*#_MyBjSiEXZESRaxsq~>jSichZESRaxsse?<Mke6qiKnavC(|5 zLH%?DqkV(Xen`)c$Xfr0)@wfIe*O<ZDX&K0e)VCD;S+N?W`#OxbOt-{d%PO$W7i0b zXj;%-C8YT@>rHM-$b%A?{~s!k_n-8$jwr~n8ydABE5>{;j4l+IQJ_&Bg`W9@aKWD5 z<^llVE7ep8&xs!3(=~N8d(9?fR<^?fJHjqy9&qk7Q_jZN1;_=s*;z?eICq*MYJDs> z%sg9Rx?ftS!LPo|FTOrch}oKh=K<z<FP4iwT2?M<xw)uylZ#F`cUlfEYTe|b6V9F1 zGcIl)q1?SLZx)jGn}1z&=ps<0Su*H$sG#;@8~3V2M=#^0e<SO9)|TFUS)SvqCm<{z zYeB<e(rFo#PAplZ0iko;H!kN1KhWD4Zck_MZbV-q62aR#^AeGbGWc!6-bX{1F%JVl zxj%xJ{TOG(92A}6%JsbVp@S}>a)RRJV!(@X+eH%QIkSL44!Os1x-v||gG%N_+CJkJ zd3jJNts&igS(N)}_QOP+geMC|Y90N#!a^ZBl`Xwd3h9{Rv7?v$_#ke*40fDH%6`Ca zzX|Y(+;_)a=YTQR`aOZO96jW-ABQ3T_0`0+9EU%)PjP*$AWsxbqKnq>J}WJJEa-<X z%vT@0!`F!T^NRS$A+0y#E9}N~Tm8T>BF9j!LmQ`6&oCV<_OA@@DckI8XQg?j(Z{v< zhAPN?2aeph9Z!oI!xT)Zv<18I^G+BPXmwX4Vi|ceyb#G^(Dy)pEyv(3-_rU^*C4rE z015KX93Z0r1c(`six>$rup2OgvcVv0J}@p{1brT?$&+s!9il|RXil*onVU>s-kM5X zR@E_11cqvXVOn6g78s!gMrwhe7AVmIqqM+iEl{cj#_;_vOS1a_Lv8lA2HpF>Sj|X= zL7_ZoO$-jD>_as8AGaV#86a4WdmU`E57l^+!W=3t>y%{s1yJKN8j*+Xro)8O*bC#d zF`Ar)(D*e-%^IaCGn9gW#jwMOVGtOn$r~)$)1B;^lpw`{@dngp1!}ep>Y%gr0WBw6 zuh494^~<Xd2_3-olA31l8qiPBYKE%phvE}e>{SX45XJrpOwy#(xU&w=l0^p@nM3j* zBlpE*jfUhY8q<G|=qMI}sajx~7MQL<KM+APG~hLgD-7NG`&LPu-34Z9GGQj5>LUWP zlv{*3V>Z_@M++9aHcyL8znPg}(To{|WS<O)lwJfL%5$_1$T$LJhwr`d%+#uE!aV8| zn_wy8vz!=lrB9|o^N-X5M`=|a@KDiQ&6Kxd5|Gi#)vt3rfDAmq=6RaSBIILg7u6J5 zluWHGw$>V)``Ah^&(q9ngN%dkoTp<RrIW-A*Mf@D;;af1hiQs{pCIg5jd?Yv9IcSa z&gVD-zL!~(7i>4UYpa)$Pw9f!_96<8kLfOtA$h)<tl(H+$o(;zB0p1<9#J}AfmUfJ z#)?7lsB}qk;pTEhDB|C<%jQB=HfMKNHfQ%hHUVs;Dg<XMq?+QIt>*vZ;+n15U5Kj} z`@0s`u6X>#6IaY$q?xtRxV>02<)H**%@nl25{>6Fi!}GqMwModBRJ@P9K`~#IA`gp zUZv%_mP*S~NlU3l&Rf#14kezcqdilD?o`!9q*p6uXb0a_Nw`Krn`?KFy~8%cJM7BS zRW;d>a*REt7$qwU*F@F!LG~|f36U2QKk922V&^SuLqty82UqmX=#lII9mN+bznE|3 zl<}I>If7kg`Qn3@@2k);*RJAL$xWs|Y^DN<$7)tNHGP?7RZs*^@uuP6;AgkL+s!Ld z3pi>Wm8I5E-nH5WuK)2{)s!>qpVeHwkrqZlHz!79X#`77xm|S35(P*v@x@0srOITA z(2#z;ca=7#D9Gol$h%#l2c(Y5LaIWgqgzIJrjB%U)&k9fR?}_T13*PK>WWlc&JG^o zDb05aSGP{=ipR(mEW4=Zo#8-|olQ=L%+o4!HLhz9=R!q(rASu`qbL~e(+RcNmm_%r z@mPb(VFr}h$rie!rN8-2VNqzqr$SndW(l$?vVl1amj{vd>TNXUY{_s>eh+u>`)JLU z?&S9{Pb9;#AQ|Q<diQkOzI)qN)wk@@>YHSd6?L0mX&?{WzURj8Y2Uq#c=qO5R^Ox6 zQCVuW+4pj{egCD~zNb|E?#hgH%V>gh&Nj^ZCe>zcVhy^^yT<OC_wJSGKBc3wP}+lG z&uz@Ct{Um+Du>Zu)?K6D4KtptpIl~qe^{7<AKh&EJndka@lA&D+oT%5WezjG$?DB6 z%(#j#s~KOWDHV0YjAuhyWT!D_ONM*$d$>2hhdcPK8fG_=VctlFWkFJE3_GUZrY3K) z^xaIh+&mtb)Qn|j#xj{vV&ETT!(U?HA7#T|V)M-u{3Ry-QFi>Jz3CtAP5<a@^pDO) zf6$x$pf~-&Z1e{`>Gv56B~!fSWneja8|xOu?qNV(XqjrMVy^Pbx$YILdP`~kyHX3R zf=Mr?S7?T9@ZkakrL9)ergB=PW_>q|Hv{?o?%~-F9aL%Rr2Q{KNwZ#g$irPI!gLpI zN(ZXt#=0HwZLfXxi##x%!n{B=4jgC5{c*BGvV+zbpfy$(QQKAC;1Yq)P1`Bdh&8y| zp)MQz>yzyh=o^K{*HnZ~2&Z@}--lnE*IL7=SQx+Fokwq|P1Aq|zZO`lS)1xU=QWSL z1Rg@gjY^^6b?`gn5d?;mm%x-;JI5BHOKM7R)$e$@*~fR!ICwb&*NF5TZXnmytek^5 zf#$rx37T=^IlYa$Be)V9e}drLb(~vHpDoy7ZJ#ibyK0bgCu(%Nhdk-DgSz1)Z3Q=3 zUX7X0+qCj-qXm10in3U`IUa65HkHE9PRP4Y{@^n=ruc%BVm!+_mwWAGO}(6CJQ4Ps z=$PKa_qX)9!H)U3Y;=kin5+e+Xo1<*a!X*Q<lh$kuih6y>2s_NeOfIoHr79nR_`9s z@5jCo`d<F(o%$vgr&w=c(eWJH8(4T?_zT=H(XhV_>lS@WdrIGUp*QMh>KVO7r8A_5 z_1b(*j~5nWbVJ}&jg|nL3#&0sx4wV|4G`)^-k0Rs>X$WZ>khXLi)|kurGq*l&9UaF zuF?Jv8|^R}6<q{s<q4(j14MN=m5zku`*Vep#I5-qb48#|)8E#|2kJGwkBuu4jqXGa zH1M&EK-9{kJ9n1i9ZrEpEfC`h*K3tTTq8#}@bX@qwRllJ0yk+!E&&&dK*B;wg%g}D zp^`j2$x+~AKPfUDK+i*DYCX-`3Osf`mW+op^EA#JhiB3+^&?YL4yFQeY0W5Q5SMWf zm*MOtFXHaY!?YA<Wi<QS<oMlKsG&uJN^CW>I%;U;?6g-6iySpn8U>s+<zY=m^9^oo z)Eeky9kb^Iid`*ZZ4}#!#_~0x6kpHWYuBuI7!DKOM9@fhx~7jupL%gtpdtb)3!I^O z)S>e>RA7@fAF-UA6-xnPaU)oXr4G$n%8#Xd@`4=T{bq~zEXtc1r!i8WDfMx)7CfG~ zh@R9{^vy^dtNq+#UNxCs%w}`2$7=8B%vJz?&r*+ntjxv0vm^s^AW}J*qs}eeu5(N7 zI=6Jc&aK_9b8GH8w>s-&1(Q;7wnks30cb2hPSw>POD#{^K{6WRCXnGD@1}*2F+zXZ zey-2%$f)MUN4If9<SSZDIk+l(%1`rxDmSc$Dq<{;Y#f{HlqEE@heX-SAENxmG+)W~ zpySind@MDVsE@RXBbCG0evLFGPgCM~d<eVBHej3sRBRt9<c<;DA?Qo<NxpP*I3dO< zv+#3yDlkw(4f?93K}$;bqCR>%AHn%urBC=>r7|MxtE>%AnP&@&EMnDEgG@S`@)YC{ z2X3$qTIo~#K4mgA)vtMe&^H%Fi$%7&nPqNT9pv29>Ehv@Uh@0nLVgj-w8|49v!Cs= z<SvjI&<6|Eua)PEUXz55E`K2197`nd`)L~+BN3Pagfp?GNU|j(eBo3ilWG?QP55c{ zNj`Mdzot3gr6VW(aQsFni=_f#2%<bh#9uJIy%X_l^TspI!m}+G9$>G(AkVnzJrCUs za%<4dKx5d?o`@g!m2u$m+kV}Q77NuY!A|f8^4Y0q7Y>)bAC6`r4gP1laGo^bA!Fsk z^x}-ua8*k7CfgZWneE|Oov(58G;UrowIrei`S>Yh_|%LB%J2;}+A~Z9F0k5TA^*Cz z2th8?YUtc!Z!NH03(R8Yt*a6pBar}@1vbFc+U=-$oE6(X#gMfVS69IF5@oHe$t`R7 zBw7E~zDSY<0&|h(*Kzpu=l4Lw^0Uem7{|cpFHoPJcod*`pon6q0mUTP(ci<P_Y#z0 zv=G6E3PMYhEo9&FVmM6)WEb04gW%^98TDNB89+ysB^drdVLbmyuMPMDJ2d*7Ggi1P z7SBXdY5w$_7R5!7w?&8R8|c2Fy!>&g>Q;=V8ZM)b=e$Z~NkgxZWp?H$volMXjvQq= zvXt4Cqs%UM8N3{J!S+5pTT4Ouu1Vsu35I;|f|hYZ;y{6unadrMnRz0xTPs|?>>N?J zcteFK+`X*<LYF=u3cpu2RuqbT`$S<w1Eh(vPEf$IZ4i27qc9HAfOcGA8`*mceXG3& z0NG;$fywQk)Oh!2hBLGSpBcXEm=GG1o-1i$L#sgF@#NG2Py1F;J(pY4zI>toN}1)! zsY&_DsxF<+OFO&g3jXzztgEJ%+g42vC)#!!a}Wi9PEe~0j(2vt<;zIPL*q#exk_8n z9}!3UbX1GL)f%J+zM<(?(%sI1Z^G;^a1B1brK}=+TMJyP1+LQqtF^%OTD}(ej?x9@ zI!WNW%sO5v8GtJ#c>7S`20Ua;FU-RfZMg`1PYc|rfi=GgF@0YP{6Gu*P%cm0tW^3V zxe$Ddl6I@cS5WJWtV{%M>v02q4Apj*=ssMJ$67-duX4!ShdJ*rq$8_E$5Ijai5B>& zLfGv}_zorfGo`u>mVwVFdZ4dw#&^&HcjkJ1V}<Bg*hPKJ^seeE^G3vlyG?Y*VIuHz zO-Tn%<NBWdg0XJ*L;jY1NykJH_=P8=m7+lRyeEc`PW_yh^DLxQ9lsHQUt+(5a4v+0 zL7I({nX>x8uTXsNLSfp)SK;4pf$g<|UEQG-xEqD_9(?>7ANOXHU46V`NiuMs0<~8o z$^!TEZ{f%;nS-3D7afB|-~lc0AT~FPQXGZN#-&+Q)`zq%R1A_I24sc34e<%}xQ_FC zRtKVgMANqfe&f{Z)qtLt(HXgZ2ALs!bK%SAaXqS_eoP5Ju7sbE{4D0G7K^}dHP_Ox zT8CF@T%1NNFznXF__lQ5NtClfd_0As^t4uZ62d;Clz&#H{Z2_6jKI&yb=}{~-{&=Y zqa^TxMye9n0Es|$zb8+4-^ZGBFMGa!&;ozd0xx1eYze%i1zy$yuV{q>O;O4A<{63# zJK_c0X<GuX!gM{?i)faf6|kP&tLT|eeIcEP{+U95Gt0(=_a?>}mfIc>1-o}YxbTYI zyLY=^!{Jv0O&=a$XU+Qc!ddX2H|!i6-dVF=$pJgthPR>N^@UMz$vj~5jjjiMcwg&E zD-WC<LOi|@lMgmK9(m-|g^xY*$Rh`l9d90RV{<pa-q_r7GRMKhH*+x2-q;+BF&m5V zH|aF^Yc%C!MR=2DvahQ%*`AMRBZY<P4F%P1;|&w8_YJLZm7#!~@+RAhs*dp@@D|!o z?_IUP+vsB%BQCf@?>O9{KDa5~Z4U`a{-fwP2`?}R^g?@fJsU{<{=lC!eJ>BP4+P%T zlrb~#XGu%;y}vWq+GUe(utIbAbE@5z)Zy|yq`-Sx;4fL-#$v;5q)QA)tiPmLR_?F7 z!7bmp{aY6%vlzLe>}ud5h}Kba(0O$LI&{Oq(4kVmN4>#sA@+>JC~&$%;HC-vE!qYB zyB7F|7WgNQtd9Lp{X<Cmmu9?wNod}8i}DAKBp|gj@NYS^eyA{0X!2z)K=p#qCkM{O z4#Jmx1IKBF#~?^KM&`@zz}Kkh9S`M268ZXwcUKY7S+=taA0Sa?s>W!(Kq>qi4gW^L zzY_QtgnuL9-w60O9R3Z1e{*Fkj%FbWe8jKb1j>*o>A^UdRyc+mI26wk1wO_m?7+tg zrSU_Bo~Qev--7Tj0RM{eO>=Qz+tYn;h2Paf|8cJYbaScV{2>RvRIzMGj!o=Oc%S+) z&rNK(!@XAX%IxIKr}DirVKR@I&lb2cfv&lf_k5vOL5&Lz?Cq85<IE8QyfX7RbLJp0 zLBAY?DYwy@Xu$9DRVmSYC0Z!tOuXu|-hkUa=u<fpu-K1j@8>)du$h;Hy4rM}VcT@J zP-fk1zT2_c{NM8k|2>cJ-}4Cn%g!TQ^%1W3_Vx0b57;=}D-_L^R=bVIIle989m{qA zgQ|8L@6Ngwx6R#%;m&fn|APhRI5Tv?ymaGovM?uqM&Oe96Mc|B1-{RkKLx)1<Bw9# z&L1V?VDjfjy}hPb>Nccof1!`szq(SMuZ8D&<12Lec$b#Gp04+#EsB0x;1um3u=y6h zoz2Gh@JAX0R>%=y5XBymG2Pd|r^hK4pxC*Za{26sGO`pSclyxQ(O^|&+oz$6t~#1? z&2+W^9a((nUA!!)uH1IxSSl?$VwX?IO3=LA1Pvm8SUqjZt~aj~AnM=vvY|dHH)`D% z=;Z@ny9gdxXAab&+597GE;edjleOk>?wSKW{Ryj*$F1O#T+wf{vX;F)lY%ES2L&^- zomuu?9%5>@=A<_JDP|jU)N{){6Ow^OYx10}G5J}Zo5HN;m<un~h{DPE(-<iB5zb7Y zw-1jVc%EUl&!+nsvuUVfJfC2$%3<{e&<zy!R?s&pmv+a%<@Aku?l!9=WOtjpGOCkt zP(D>hvM#gjfgi9fd?<@8+)37NnzVkGQf$4nejOBhz{jy&6uT!6-Bo|bDa5BfsLk*4 zKGV*^DZ;rcMRWSTKHdZECx83%t&Mt+CsG4^FaQk1#~^qZI~v*h;WEwSE&TNHRVuMT zw%9;hY=9L5wglCz{x-mVwpd?Vv1a9}X)ASu3bIp;yi1p#6k&6ZAasKn-4Ndz6p8+M z9Ss&Eck-HtgI|)rfuTNT=P+MjxQ`fSaBzgo8EN?`$Yffi*#hl0Hl+5Crvq&a*m9su z%tLzJT+BoARiL5XK*M}p@VeN=>mc*`I;~@g#p?}$5?>Ah^?3;>ePQWf@bOcZ#zG#l z?R*%;e7H(<9BT5xC2ZVgV~uP-TIy_#n||X;C>wF3nK(Y9lG8>GLK}Hhp4U?A0b9xE zXi(IxL9tqRFW5S_T2-S*@8R_DU7wLcSt2gA^q9}5R2{r=%4%B|%R6bC<GxfGbNL{+ zipVwQTBV#*Wd$J5F+-l~!mG@T-Q{{TTgm@~U7iD$kmW?=2bP3*`6t~tk=4=pMSUIM z^0%^{0h8ywBrDbsE3PnP2lbk~O}-R<r^eqBFs+k$Sj>81b&PMm{jAufo#v|uL&Vx- zGM<Sw3r!4IFZ%PFltc16`r@U`)<CzF8#2~cQ^JzrczrF8?{FqjQeL?1%SRIRrJS~v ziThH`(2i+r{mdHN0d`;b>+nX&rNsE<eAxE4oTh#xevokIgjcAy6UZ$7Ong8L<#%WK z6Y(R3(KfRx>qGHbvgo7m-dRii{XMh5rHF#x?#P4Gq(L2CWs2_&`iu|3TVyM3*q}z@ zmG*`!AA>hK%1MWhKMCJYW*_2nbyA+$@rU>n3iI%6OC{ccr=Ow%jLd3~U3Ei=L)rB} z`6%c6J3I(%Q(*epXJiH`kApU@@SK);ow(8;qTN6JVg7lPe;%VB9tLc$oZ7!7VGbl7 zz3MZ+a(@Vb^S3g}goA|vJW{UQcAp&yl0w&89F`MDKEEehUgZWl-MqVB?$i}Ifqcfr zMCNemK@#^A(NttMY_XFl`%(ICpz)?fzN)j_T5D54pf66RY`5l|?ujbT#u*cMlLL5@ z2XFzpOeA53_8bOQbWf3}OwxA*!ea9TEXyyfkK^%jyiaax$V2j=w-bCW5VXKU?U@sO z@{<ZBE}WCxI1l%^KrEbxJ8*9Hz&Y8CbBfOeV&R<Pz`4Z(=TtY&X+9T-g>#w%XWYa| zcf0cy0em@`4asz$wRJRHSlJUf`%$eDomb&ij;|iwAwT}kHEed*Fe7&jk7cW2hEHDg zGQsEgz^}OgJJYA1i7c2YJm8G4MHC<$*!~jpdkRqOEQRB<d<xOCebzuvLvA12kZVDi zMty3JMqZ^F_?hD?4;mw|jWLdKc!bE7FGu4+9soQh%L7hzR1c5KhX{Ln6+)EpIXB2E zd1rkNkfrwi+#)Xn$yUM~#yw%^Vscyan)w=%nLd19#u(V09B?s(2l;8fpcg-tLEad& zvQaAs`@Z(U-a|Z`tvSM@HHHJAo`aaedml&oNC5h>w<Qyg;<E(w8pkUE(}lGmd|b1> zap5KasJf=c{^1K(Y4x&_ysT)xZMIQWe>OHb>%XqX(Ih%hLQ~npea@?SzgA;txHFya zVZTAxh+rJ$He$Fu-RXkuD#}gW4;;<v2FCI(F+z7;>rJRhlo$T}BGe>me=q`}fAgV( z@SuJMaUC>kGj&V0@2ovYLcL3VHe{DP+x8ZpZL8wX-<f$n<I8W3ua56m*MHojuGf3s z^*;4Gbt+n)`o+70DNTBJrD?U6%cA=1{yqdo7|vjS`c~6iA1OADjKxL*3QdV8u_pHp zSVliZj+)%tFCyLc&;j&)Hd;NG(g$+(RGv9~>+9+v<Kw8~$ak6R>jDW~ojxx+6bVI% zH!(EpaB<DU1q1qy_42uvlf!}S_*Z8qt`&{2-<Cet7o;f*o|Y`%O`eEXHoX{ZPP59h zy9Aru0w8<G=?F4ah;KK3)i8TcJ6S~p6*3*TiKKP27rLXD{p_7R&qpaGyXA+cKJ9K? z?&Qmy?(rqhntST|)j{*Dfuy(D;XH-4y8{{?ThLGO_Mp!2CeWIz7MU{>H`FEtDj!!= z<}yu1!dyO)RI>5xYhNsJdrP0zk_mLnk;6L<6?&gsGYoJ4&(rq|@O(v`6xt_n>JU%v z@E_-Q;VE|MXJ++Ki@9VM{^fpI+&_Bx1zGHZpXFbt$j4y1?Bhq5e(Zr%<mC%=W9a|A zy?O58uKN`9sCfrc(ZL;u|M!XHdj}?xJ(iSDLo|CZg?RhmiD<WK^=_^g`Jb1_@&IQ{ z@qc4o#xUK#e-ia^7Pqn|p4|WB_T={4Hz22JH+>Jehb2w_kNkq3xEDQ_ZEv0|>8Xck zC)vD5|I>6u-|s=+_gvuJ#3Nsp9$;UZjQNzr?Lg-WmOgw+JqHEnADC=W-<R&Ez4*sL zuotK1?!Y2u&kX!5cHsvgQ~$LUUD=9tT}Yf{>GZBy>SZV1``>9N)_q!Hb}($jsh?Jl z9VGi;?jaby#(TE6%Z{cu1YVVAWZ4h7Bmm{^@3nt+rCs}!r>MD2(yZLF;u2q8@Kj*S z9dqD=Ya#mE>e@{wmwQ@+*Q|UueaQW@V0_Q*f)_utY18bUvcseQvhe3$g`fZS*nVl$ zd%lA*bvsA`sjD@7;94L#AnkPF_UPTuWSZ+uy^TmGUEODbi{-kBcfYne4sP?Zu>F9W z_d(YSOuSa`mY29^vlp|xq_t-PbuiWhyoqyhVrmb?e?M0_x=D>HcAp*-aw^S!ZS3`^ zdD$$~!EN6D*sAU>6#?F(Ka<T5x@D&8eM#OIq2vEuZfkx1J0{ef!hXz&E<GNs9+Oj# zBI1^h2pr?H4k*s|Ejq@wJGsEe2eTK_zEEJ1PZz-|JlMThd4p*Qmde94s%EKgJJ6>I z|9X*EyR0Q1XG7=Dqe~^p<`vWF$TDBxSU&s2@nyb1xsN`Jz1(Lz2)e=-w7yA2o4qT2 zwu7{*>;QR)foNIj3(}@qC7p?@@L_t1EFm#>4EJ&%$tC3XURHDWRr=P@Rl~sL3e8>x z?Pp$XtHOTikyT-ZFKB&M+&+^b;w4OPlSs4(tdmHqsz#fGMK*^lC&{}F>Q+kX&Tw*g zzo?T%(cS=&gFHA18Fcm}J9Qv^el0LbL(EkiIb22xF;eA|7yb7oD^Q~M$JyRaVH2ck z1Xm^LI85lpnB}LldogMmJ0Ky*LRr76Dnk(r<t(P+HNG0<NMgD2E)9S8>Q<R^D_=ac zka=3i!aJM9Z4Gt54}R5`veq(P$Meq#K6bs=XcAWI8g`w;yRI8}Pn57Hb_4b#342mE zU{98?CwBvOhiuy^UBHS(@V7AU^mRgP+f{s;7OqH!>&qg|nMM&4(Xv!{qliZmQHatf z)M8EHXhhVuWHQNwh=<!FDG{!qpC}iq#}bR{>p8J59%~kLu~c0=BI2<`M5H2h8Ii#^ zUoaX9$D13&9IQ*mlPL~n8e?@E5|MOTG{oX@2}D5#N`>oVEospv+65B0l<|j`gwv4| z`R62&-WYBsiqayK2scGUs4ZO=2Cz^&|89)c1GypoX^h08jTsR#e%k;{)W-3XA@p30 zH~WWLW9b-vO)iv5X2O{maKH>mBKg@Ys*|xqW^J-M84m-45>Y5bVNAlWUWAgZz?}wp zZ@YSjd#E{u4Ug4B5dx}DZcK=}a3&H>rrJexc`~!6Ihhg7E$K#4fh=vCA=+k&_8Fpm zCb6T2S=`i2F?!1=lL{x&F(NdPgd+7Z><5h2CZYAU#JF1GTV1lLDGbfFicAspEh%ng z9bRdVG)186MRZy98nHSI2vU$<FQUh`Me15I5mDC|PGv&1QBf0Vf;NPfq7*cR(;Gr& zPHi%UcjRZFqthT@^l_HP@|GB|xs`u7M&!3z!E_?rEHd&%s&GXtoe?dmcqko@A-YDO zJRS+n^hlebrqw3v+bPb19GWS)Zc8HW+ft}gl$06nVl!ODW^l1O5nY;$rv)fVO>$#e zL{s7B#*he+GK56BF$^6YVlF`^Wg;@n!AuGm1gK<yav&C6iu@$TEKa4MOA@WM3F9*S z=(2b?-5AOwL+it>;dEUp)|?Tj-I4kbl@n1JYl23gT3c}QRJaM_Wsk<{#rTOrfO@7; z2S5s=@<TZE?Hm3MPHnhuLzD#q<!?=6xH$q{9INHdr$kwQLoyYSpequwjKnpoUbZX5 z76(7pQ`I1vV-e9z`c$7xv}6pJC<{w66+1nd$b{p<G9JX)MyZ(+4q~w=SguF|h?R_F zl3=6AuuusOremi^fI!gI+GM;QR5b$6a7!k+1~aTiN^mP-DaG-_lX2)2d`6mTft83W z&EaJftV=~etB-AJ&a|&iw#Fi)C16EsTcXf2Xg<?MBgtwa<4EB_z(8-XsYq_C(Lnx2 z35uS;Z{DOt8AhX#%vy+vICN+zooq?fMTGH59R45<{0kY1jrLj!t_Wu`;krg5O{~eF zd?XV!k$42mgh+E&tw<XxpKgxF>WuVQA}ZE|TO<6@rNxQ*ng|UGYk<?uz=|~{lp=Ai zOc1;Alf`5)5$MF?AV0BqJ;*;>U62M+zGR}Be&aDQb?Q_RE<*#iD$<TEU!1Os#nei` z@S{AJp18VV+M0FCN{PMcQvUA*;5b;hd8No<3<;T0mTU^gFg?m4BfSEeoJdFJl}-?G z4vL8~OPm0*Rgdp5m2${PF9i*1Yl<6PA%Ci%M(EoO^u56-^DVT5`ypy(q>>wjF$RUj zLe2@*V^+GQHl0a{aRPJ@8ZKH`7_iqxioQnzeFHs;eVmNX$A=gP_~wgot>Jh}WWE$N zs)tg<<We!t7<T{+OiC=0o)2Sxx?MQFe6u>)0&Q<Z4O47Q7(dMf3X@4;SEHhYU_@w+ zhwCD1h+Ileq1hV`gDX}F2GOVzf?Op8V)Y>r0s5OQPI2Qw24bN4nRX0-u4edaUkxyw z0wN+HE43}P$gb0q$tIC#0qslKJ{C(Kp_1mPo<DWEhJ-7TOf`XuA*MBqiE8GN%HBbk zVGPS;)<vYPIgTDf7zWwah@r(GuMOxQMMZOCvmpRWT0p2*M-nZdOeDHd{(KC7J;wGa z8AXoObkLJH7-HfT58DmUNE#?iLu!rxVa63+ipqpKo{E9KLrENHz@w{$?o3CT!!Y6} zaiFgQk1tN98}+Rr)&`>1fIl1yHOe>yWJ;@%(kgI}=8;X*Mp^-LZM+2rrZ~i7_2khB z`esrz1yMG}wZL$YU+4$4P~;_m*~d;w<46Kw*%0XVNFrnSC5Z%@NU(>IR08P*3kzlh z%q>{g5U3^!ej1Ed9a=q9?}&5^M7S0!V!;uowEz_$P2m%aF9*Y@ogh2ggnfkK5R#IG zt_U_Ce_BcSt7_L{1)v&G+lEB4ZUdrbgJur8Y+chZE`y#nq8AvB#SNlFI2~$^q>x}V zxQH}#dL)%(@0U4{ZUl{Kidjyf^rBdSINStQ03f1^+hS=`qXZ94nPf$BBM2DU@k|O7 zeTJCcMmC8o3A+vJ$SvmZa(0Rvnt|v@8hy)j#vC!C5>f(zLx9dTx!B}1M;BAKMr*LA zMEW#zJIW#r;g)y?hd~-mqg4$J=}6{8BXE+4vPGdL!PviNi0Vsd#*|}NUwjco6i#o! z7ZZwvuHJh96GMI#l_!aL{Eq)?eXJyTWrUxe`Rdzr9{B~v$Dv^w3V*@s5*J`0J$0Uq zHf679Kn1@7pQ9=SSV(mR^nme!tpdEJt(UGTXU>Y|JCGE>RGMLUqVGUYd%h6rjoZ4* z1mFCYkCDUVHE;zK@pGgPM(zu6q%TJ5dvT;6Mw)R?`m4pRdiqzok_Nbw2D+05xswLd z8DwseD{}~C4z(u^rNm+O#9{Ws%XFE{@cHy5@e$7AwD2?1Ssu^cUr}Us33Y!UXnc=K z2b7Y+Ab+4-CKTX;2a#W;Gz7$Ulw4r3C61Pf-S5*<Ws#&*DA*u0#tG^!J~l`3L!6-Q z;zM&3Khz28E<P+r@xz>;?&9Ne6d&&dt+MA&z!zC<DHH7_COJzSZqJ`wiI<}2Q=H;g zYJI@YLk`DQ+LjCLFU(DyU*ai{_?!}y0`FwPBqe*A@@~}h`CPc%TbvI7=P<wt%5b6n zxhq3g(%zLgcO|c%r9gU!m#4r=hTDdr9<d(tW+)xNanEj0vPNgg%FTEMDhK-&s2rW3 zK=rUI#tAPZIXXmv%F!(f)P#I**348&8(KbV{=w_V*^YjkoxLAtXYa?^-Rj5L-Rj5L z-Rj5L2csWncdH*~cdH*~XX(e;x%;sIw@9UqLih-~06@x-c2vbeKT0pq{d(W-dM%Jx z>Kb4maje(460i*?a|vJ`?HIr4vvbyfIoi_)I>tRD%y%apqnt7H9Ay@`%Pe#!EwG`% z<I`DaT?DlLe?8)kq;3Dj9;{h1zvTaK)(FRFn@wSz$obZ!GPW;w;Jdc^vHCK-TpvMb zmg^%)jaTR^o#p7r!zz2~s!II+YlXF|Ys=-!!YhN;M|!F#ySj!H08@&vvO;My<iTI7 zOO7)X+UXgv(b9Bz<DKuXdy3@J5fppva4c10?X|AqN#j~q%JHt06I?0lTq!5IQceoG zl1_Ffo#IM4)t)k3=wH&mtcUdf!OJQ2I=x<x=nZ7#mSmsqe@UJ0PZU-X^nx9~%CcW} z;@}viOhOi=GL3v_VSt9!#q8C^2x2`$yhQT10g92WkC!t<xvR#eu0axAgCx5KY3>^2 zw5~y7kV*_H#+wZFD3qY+^PeEUVivz_+&G%Jk@Cct&Rx$fomqP}qxS4HVI`UCFWLL| z_D<ByjHQ_^i@LdD^d;4@IM6$sWbeG$?mUyM^E(lu)eZoR4bXjZCANbs8(B%(h`9Dj zT13)$5$W{c0Qs#2KOR}x#1(I*=b2Z?HJ`Jn;FciUx{E1olU4H;#>)pVII@-4dbYfz ztAg(v^U9Y8Ul{Wdgn28Ormxr_zry|<XPxapLf_*%hiN$%ni>%K@{0Da65Q9=?4jF? z^<6$sh;sV+-8QR?%C7SWhkiciUO+g$Zhi%Bh1nW_xiA+@A8s*cZkKGZC0@ks9#w#m ziz(?6?jE_E$Z0z&U1tm*^;y}My0h=qIu?L61$Xf>eW=y4VOFrz3XbJ_>ig+u>O1ug zeV2Z@KG{MIoZBs9S5Rz^jP0q!<9L%SJXgw$D+%l>8M}%)xsPo)TEh4HptUzfAsL0A ztEu=m^o}a4iQiOwd6p6z@HHlw8__v1`vrX&>@IbVSG|XuEmx|)k|gb0w9q?H?HSJa zHuraLHRme2D6No_t_^aZx@x;FD{<FJ;?}uLfU>SzgbS+c*r~ammHazFc^ex|{MH2x z|G;AYcTHcwB$ii?*9EPV$(2@kw-Vk_X;YOOD3M(|4wr&^;|XEBLh(J*8<1VUn{M9Y z8X)Ns*>JA!#-6LgP1)4p<O5cRn?6-_IN7caC-+1hPR^kYCudcMlfBg8WG{8N>C;k& zle4PB$zJMkVwdW0Vh(jUu_x+qV)xX+l>A{zc&w)u470!BqpHJ++0@}i*>Jbd%M=W< zOM8Wr@%`y`#;2S+Ld2?5a<J-@?y;)B!i)h*cwnWCL^C|NQZ~j+8A5jwdupY}t_v4d zrY_Dlood_O`aV_h1FG~))|bnK%orl{A9@_8y?GJl|EPvOkGMj=MX#VCJtr&@a;vQD zR+87-Wb8KVa{b3vlM00Qyv*lv=Io8@jg4#7f5K-nf9lm`tzC6lt6X5aU0P~$4qs*E z9wu|gdghKX%PNV7m_>|4aE}i+o2)<@rmdCW@7RvrD)M7uq7R*^pE1dI&NtjBvfbqx zUYANa7JxC6Xa4=1o5$YaFJv7Ja`A4fRA5T1_oA)N3o`72RQ36nsz?1RQn3Zp3wIeV z^xfr>Bp-UO6uC!9I-8SztvK3v$+=$|^~pj7RWadn6D{_lAozXyujqPkkkosnq&ik( zED;OfSCG6|e5f#4d|wV0XPflQRVO`P7FLp+T^&Ww0^6msHh{gvz`>4^z|FnR^@;O3 z75TZJ<)>(p_|6E7KR~GuG6#P=91A{_4}`+3=uCObw#`&>r9;*He7;6*c?DlAEb|6; zQFgGcEM`sBY~u1TQT7PU4@x0ng&qHAOWTDcsK3!4WkG$6o{w|n33~pPBTtsAT;($i z5PS+hB0-_23E&x7hK0aLqRR0#nz5AftbIoLJA!@=qkzpn45!%27fgOX-w-cDOsP>P zvFtogg<nu5XrFm4c@fV!aU7h~J#dKsfdr6WT>7JaCQS}sWKDQU89|f@o_x=X;9o?^ z+(zwEq4TUtOl4H_U#4&Wy&~s@^O)G4BY2VJU6;hXQevTbmB3yjV(0p?QLlUI|3pjw zU(c@p(8xPG5y=}}8Id<~+i9NrzDZ;qqsh@2i2s4Db$?_be5>5mdvCLlz2nZ=$2otZ z=eu70Ug?32e*Vlw-|JaXql3y-9DgxzC|cQ7y?@PBuM-cHK{xU5h9~m{;oWD_ZrNlQ zi&oo5@$PtZ@bfp9AI*&WJDGrMoPIL7U4PU6mc#A(TUTz^-*UQLf6MN6sYA#=DEps) zv8Qh7OE$Okr5?GZAZ4%RI}OUe_>I3jG}`Z5wK`P;o*xhi|F&eaP+n{B;rx<ZrS~bN zKhob1+RAxoq538*TK+L?Or1EL7yd^DPTAkrKeou|so*o6B*Y)nzRrIf<nE>eat^Ea zvx8dkd-l2JejBguwB;n>=(qi&+Y7rFOS)%CT!eqp4b<H;I4;zkU7_9-w3o>j0ik)w z@cRUJrgVYM@;PPX6wT7R|IbE5^L1%Wo4-G!gsZ$^y(F^-d_h?I1!K$RV({P;H$33e zTz)u8<|p~yQ^7nD$kWuh;N$t~{Kd*PPXw@Ae}sLW;{oSRE3GW&iO?APM8^d<%vniR zICt7us07RY+mEq_f&*}D8O>kKP#_`Z*G$1D<-Om}vrnzWjrCRYEcMUuDD+f$eO5kQ znDv7E;A{cKUX@3yU&Ba0{KEEpe|NX0E;`WdD+#l`8!&I?f*A!cy+oi;>jt9yEHDW2 zbAf1d&2#oKNtmBaQ6RkLFn4sKpSS|R3>WGvfq(`NdoTUK`mACvZ9aYt=4=EzJ2#lT z_ru$hy2WR^`k{!wLwF@w{@dyLhhj~BUa*)ypx9f(X?Ky}FaQ@&un(=0*ZDr>8QsKg z&FC13j~wuPV2F!B2is+LDb)W-*Bw}StD~K_()WyRbENjbm7gKp%=>|d-7`l7J{x7O zz76>hJr&I{O7!&}C6)-&1p16c7`d$X2PNvG)t4%pX7ppt80@U6zjsaVdM!DUjfIvC zu<k>?Pvo$9>duL|IS)w}kkuL3rPUeOrPVRGfs3^OZb-q~cFNy2uhH@DLm|4yl*L(@ z;*+oH5Kl&UExKw|=1n&b@%fNi8UeSGZ5pJJzRk~52W_9RLTwD{<LraFl5d60LEN#L zX#xy$B6H<iVPmj<So7RVSRs!A(^C1*x>_o?Q{F)7hh}Y=k#B{^WN#S*9G10ZM!pq3 zM7E3%E;V><VbnXfFrWkP5e_ozx@bn7(u}&Uno-w9GwPIP)Y+ObNys#JGs3Q&7(0bG zbRlA%#}Tr%;D#<l%yU<FxioDDE@GfbgV|{w!V2|?$l=;Wy><+~XdH3vF4;J8Ul$zN zO`q5J95zJA5Z2RZF%){lJXtYOd}WMi%w(G9O`EoH<Ho5?;cy~0wIw}`uA@j#6Cu3+ z0m@DgUpdSZ5MPb80o%v9VfZabaQlX9I4%^3zz7Zgmv3~mk!*})*%(is?g?tj?qVK- z2VJ{}KId`0QXxSxkx%W>=(I)RuNk^$faA4vAy(z#*T730Ujr{;B+sjJyfJyX233r% zH^0lX0+Ebjp&zYP_UkW4Z}4h15OQPfz&KiJ#Ch`=D`qOB+dvnrHSKrF#D14--mj7% zDZRB^hlSsB9R-$5H*3mDl;eDGPs%0svt09jmNQQRfAR^+e5uyWqQLi5H$hoQZHdU= z>B5~;D33YWQ+WiP-2-^V_b<S7%%WD__wk+~Vy$(Jg82^mlZ0IlvKTl|Q=3-kCbEeu z^p$}ztbYDV`j*rxBfhE<Jwof%0VCafX+U{L07xFI@kPpoS*p%4hy8!;T?u@Y)wTb= znS{)cL~vnICjto~ibf#d(z2t3P@I8)3M#}Tj3ELcO~O`fU2E-PYkyi=v@YFL1hwxe zwzhrR{n<XNZJ$PLYqVl5w6BY8?E)=%_ndR@ch_&`8<JqP<@aOq-E+^~&OP_s{eN@i zm!IyqeXKWkb+&oUYyl79#R9~L02$%g639pu8G^BX`g|OhLWx;<zf^*Ajv{Oy{OQt| zIBIYSF7NX*v=shCA8CA*VH_WZ`>x?VUu1YN2TOSnHTxZEr*@KW)5a4`3;JoB?PN#L zQyjDj4%(>>+G!42wU3XuPA{f)BO;#e$ltg+MIc2v1foSh(UIgN2W_&0R^y;eanPnZ zXlFQRXF5t%qN>7Kxl}<5_NpEG*^U(7;h??KL7V2FO?S{{I7%=V>+hbpT7NSgVP`pL zvmLZK4%%D??HmW~T%wItY4dzquj6kA*AjKUqa+vDq_gZa>Ky47J7W8|P1<3HT;Pc9 zU5?oPXtN#TV0*)6Tj)sPJO?f9ppA0ShC7noVw0Y*LmuylE#sgqa?ln#X!Q=-5(jOm zgLb}yc7cO-p@X)}A%Qz=#ar%Fyo<=*J>=2h&uuwcJhuuLhgk)Prw2y!B|c9eB~zDu z713~bkT4n5vAq=nT$lLu5bzoA5CX!V6@Fm0U6}&cN<TQMh4UIbsYNR~%gkiiK&8RA zqp4j0+^3k_t`rw!1TgYD{|fW@dzA@8IU70Xx29N_hf_8(>%*x9Fi<MRfzHDvCy24} zBNp!?jHd8Df+H@Rnp`R-Zi+7LR!IEhIW7ODar<3aiG@6f_>I-n;*g;b<9<&uKC60G z&bw32dr}zKuW(!}i{VzlAlLy&mirm?Mpwd1Hu@zu`~17fFWHZD#**eNK?xUlTaWdU z&3^7R=Ar7ak*4LCr~C9gv6<j1btcGWqFFy!5=ZxCey|9R?iR6;vDzm>t00`k375+l zc%kvTOgbvl>UUYKdiRw@w1%2QBdH|&gW$<c<Ya$b0m|W!cyg_e$m1*vjtjMTx9{wr zv~#fd>(t^icbnl}?<Ynm%NB`|!8*fGb$^4Fb**-A0-mXOSPK1N%x}A2Z#RoFn99q< z5rOx+4|?8>&zFDL&u-32C{>QV8{ji?bk_Q8XSNHcBLWOj#dpN-*0$!g8&(1ICb|H( zm%agYPe1~8bz~dY5$>17h%?=%t!nM;T)%c>R;3}5YD0j|sd9I$Z`U~6TiY}@B7`Xf z#O71nO=|(!Pk_7vcv=JCs0mO#6AcoBb3n>g73x-^Q?}HB^g1@QcPUdi4q3U`^R@&y zz73l-u)cu2#aq`3p6ePn!*456*!LE~;dO&u0)iXC3rlddW#=vQ;D2jN+xm{|g{xb; za=~$OG*AUE60p~*nHvCAI~o~lJK*oq>Qn=#1xSJ%5wvqnYr9YYKnF$0J&teK0g9v} zg%WruLHsr@ks5_R*;NQ3%XDb;G;hXe;9WJEWxjg!_|qnx?43gpisyE8tnW}!TsytS zr2yut0=uqj-3&048`iaXSeKK$%UU}+yJ(t;l*wM}B>GCPUxg5btFmdpa&DHf2;fa* zt3eh_2|g}B97`4Nj!<%2Cwpz#&0R}cn-GMwKHCE5p@>i2+11#*h82lt>@rs7E+{N_ z*91O-QBnXiaqZgdT9wqAg&^>!sj-8=vxOfyz)M60ERC!|1_X4}@V`oe=x#>%!cM^Z z3!ptY*kzFGrT{IMkaL?ibg)*uwykZw*Sxl~i~U@-mi^SM0%r~TX|G{<X1?vMjMmhF ze68!4ll?TY%3=9qv_|@3EbNN~gZMg|*-z63_Oos?e08vxS<);j_-Ur7*pJX#VXANu zMWO?vyI~bViE~WT(+%}L-K*~0beX3Bm1BF;kjWKX%f<%Lz8V{-h4Gaez-SH-odeWn z0+sC(vb4_iCSXk)2$u-*NDZo53Z|MhafD&?HVOFi)f(n+Lx3|J0H0I4LrbPYd%Ka0 zIfOBXC+=dVl;v{^R0*>*bKqks(70JKya<2V17qS^lNYqW4LO_L<t;=EV8bp=K3Ru$ z#RNMD$hHHEA#+W*lK`>l5w0%vkc31lTmhga$JjvBZNiM_c=7>|JfUQhnsT_{(XE}M zJF@TI(8@ZpY5+~$h@iV|*-ZrU%K^d#U^s#CD(Jij@7;i(1a^$z+X}2U*f#QBL{Os0 zH5*XqC)YFE&A1V@y_5CJ96MUyIZ$zi1MGK1dnd4NM9)TC`V9uuy~M*0zF;_@0p>4h z&$62B%(kp!S<_+hIj}zg<~KHVDnRuL!grvTgj?U7ZC%U3>p5&_%Thje2+;CznBtkx z`T&B=fpZ(g=z>7Z0Xr9JW?6vKJ_+5+y>`l-4$Vy%?h>fEW$uQKPJmhkq;z^j0Xr)) zWN5zdWds4A4pBEy%Jc~}+T7UDz=waJciArCYH!_~UCY@?0|g3ufUAw3Oe5*<7MImx zzAmbZce0arGUG)GQ$VOuUKpOSz=cI&y)^5)2>h4~eLJ((4NQGF&@VbsrMM}hI0Y=O z1)7^(#f*JRW4jyWzF?qniEmGc<Bb`@_g#j+%Q?s|w!}s@#_4Ko1MF@bKQg@ps9laR zT-P}#+qEg1ZJSM6f=^vE(jyE3F#TGu%WI-IH`AXjo={l>-@2~z0^Sfch;RjqT1B4@ z3=;>QmQeZxe=l&7Idn09aDh;QsdRuV%m%g+-C09`=8jGUA)3&=8|K2qL_$GtVS}tz zu8%mT<{4Yk-q;M)p*-$D$odGf?}Xn6rg<<}W!cVlDK6k9@L~Ak_`@8Hd81mgKq@vs z_2$h2D%pHvqLCh@5McNgzP4^L5fwfFNM<@(*G5V*yNhi9?MdSCyd`(Q+|*O1o-qIb zl*?u@+LFC-izIn;rYEjAW3YF-D5LYl#C5aa08!1Bt@i#4XBBwFux9rCSg=-YG7Lh7 zuf#(cN|52Dl2C>OGR!RxWk@2!6-S3M3`T~VM};z!BExs8LK(`Cp?X{>Lpd_+sSag0 z0vWEYp+(9e>H?(3H&kDZ96mKP#v?JtnzKV0jzWgt&k1EX8X2yt4P`ink~lAvVHgQ+ zaVW!ZWVmx_D8mS3m~nn6!$@TK@`a%c$0EZ`D?%BLLx$xmLm7@ohI1RY#k|=YU2Vd= zG;}+xH78PfD@@s~uoI8ORH&7m3aM-vHf1)&`9mSDk)F;{!dTE7H`G&%hFi^Dy-JcN z=%;W_$5qNvbRU{HJb4&|q8?34li;%$;+wc3ia;*$b*?191XR*uSjO_IVqU`>UU<y* zM1BIz_8Z6j#*rU6PSP?nUtS_V5f7K0q#rJ$Fym3Q%RP<^bEM#BA{~!ph4<v#@t^F9 z|CI3fPvP-nJ<vhWqC_#TN#j%$6@CKkxu2NQMF5di$}?VC1&vWKF-tQtv=lCd9_9>P zr6Ou7rJ_TDLh8CCl*ms?hlClQZV3xBUJWxYtxDfYXI$VF66O>;opFJet&E4Dr$)iX zrfGknQr*7dd}_wVrD?5qsQwQ7snd;M1vCRi39Qp@{4|`RB!q%lou04zhn$u({MGPB z@$+brt;nz1fqJ^K;9ZJnq!WQAVwpsH9}@|J69B7+K<h~G){&^uMO%Z?n4%M>;7RzY zVS6{SNnzB<0f{=!N*XJ`#5Na2F|m8l#GaAj8dL=6z-J*K>e-2R;FirqsZ+Kn+23~- zQ%5xosna<|$}~)OhJq$_v@hv|xI2pj6mZ}U)oV6|A-EzDGfU6;OywNhb(&jmmG>NG zbApJ^Mf15g?s;X{k}ty2&I@vig_tMxW+KvS>y2hKoJE@>53p-F))>~hM#+nTu@M>1 zRP;B=Gj(RF|FUyYj8__MSso>~F)7aZc!F(|Qa#g=GQp#Mq%==I!jgE@dy6)z$gOFZ ze`vaA=2cU{uiNvVscDNeMS^u;x3%5~r3~2$QVmN<r<z$=1nP4<s$?D0McjT~AU8kX zg?DMPYk<6vs~0s|7T~-@I#ofhRHG{+jD%tq?hxMT1fk9^<|<iF@0~2+yW-$vqoSqy z$apFG5y$zMV?I7!gQ~m)JuV1trd$Z4@uT?jGRwg62RL0Y8hec8oV`BH;UnSqqTs?z z9lu?`Z1BQ3TE(;!C^27*Ik*HjR&VtT$mJEYDyWzlEXYc|AS+Wczgj^SdR(-`q;~Ji zd3M#LGgK1tY9JA=WC3vm{|R{eyT&sM3$h4GpkupU%HO7@npmR7x|9hYW8HWVsExAn zjZw&@Gzv+lL@hLd;3x9Sr_HKkmFmc<j>}X>i|SadI$Bl7<*H+i>R78f)~Sv*)v;c6 zw5yJHtBwxU(WyGRR7Xa2Y)~B=RmUdPv6&oj4#cO)*p>>#@g8tY;EpT6aRPT-363MV z<GtW0;*R%$<1ZdLuEHS{cU%pQ7rEmaaQu)vt_8=pxZ}DCvi9h>9vs`b<Ne_HG<Vzp zj*oH22f%SHciae$4czfTaIEHz4}s%i?)We`(%kV8aLne8n=0t|G&(*Cj+40KV-<Ak z3>`OvqntZFUZK9Pj=;g7t6RLS$3fRJSadD7ByLT7qU2~$+!?@`$AUuSHHn%ObwE>6 zMxUcUe4uuh`<1J4mAp%aLu6$%tEK?ty%l?wPpU_i&gNd9tc61xC9gX}e99H#Q!GS| z5}(ai0npBGs~wo)NAGgWve32N#$QtFx8C6;7#GXcN6}5d@9lNL?Zw-ROiNjS-CkZK zI}zCdeOm2+?g$$95eoC2VweyN2&wnI%kWoDs@)||wW&N)tT^sA{FONF=BM2f0PuQC z;<m(X;-)h*9e`*(#88^gV5NV8@xk92TFf)@jyy<l?&6Abcl36%C-(Ld)n^AtRAvc3 z$I;U708k6flSTVEBTJe7Dck1`Q`tVBt8AYin6iC-;8fi6at-2cJdk%p7CX>?rt-FM zQ+d2Jl@}CA&+t~cBtolPlBZQJv0LR3Tr<C0DbVp=;tPp;689$VOKeZvpV*PunRp=a zVB(>Y!5$vEG}3t}t;~y$rFpUHzf;M_Up>?JK{=Bdqk9$sa-N=0#ti*HuFwzU3%w&( z=p9BOtkC!83VnaR(A)D!?Th&PA0g4-XT+5W?OeZ*Qq*xTj$;3l6IZ6v>SeaC`QdHb z3dKGi#=OORGw0RPo($zj!JmXY0Z0WuDXz0GuvBW78O5V?h&qVkQG<PfIF!zQA597T z2j;j9NuN<fu`(s0?!JT*v<W#l*`F`hs{F)+X6Z3P1i#+PW%>qz>C<I5Fjif)a=rh^ zYvpSD(aK%whg!L>NGq4J)(Hw25dK8(nPU3N=$+o-9eEWzWY5tfmGtJVt7{HM9P`8G z$YAFd<GAQck=@JSJKwUm?^|5AC@=MV)!aN`e?DQa%-xa>it{xJK?~`VP#(9~@mr8U z|D_IVH1-*;<Zko5S*~2L-&;wSs_Z32NSNvB<8n_C?%*KC<`YsytRU>q*Xwbu>l?Yb zzFCjT{|$6Jk(#e9>OY}D(4lF&$t8PUggX!$N?k#6rT8tZ>6E*u+_d#s=YFo}+&^+{ zqaNWUzD=}Bf~5wJq4gGYD4<>(5kOgl^U?x6WU(<(2@U8%Ea)=c6+$Lq#55n`toBBj zesmpMWRrZpi)#Y^t>QU1CZ2@2D+gj-`v-4@b?xzdUE64NxcKosbCLV%r9hrW;|&n} z947d@f}_>$&|N5OC;XKY+64W+*cXG90-Wsrk5p*2RXm04Kd9HAmwFnh&oHVEdcI<o zviLqTSdjQ3bZ(>gg2a#Tb~ktY7#tTvw|5P11?BlI?;6fpmY;Q2bk<?IIrv|(D9sp# zn|2L|&tll;(o(3^5<!7>)cNgC;_Oy9cbS~WtDMhkaXJ`wYf<rCPduwrsp`_%nE4lw z?I#>lUfGmuM2{!MRtgLKQ#JIT7f0#en$W!eOjiL$c~Pe@@%89Km>!JyB|;7P1?H6S zKYLPgRGZT1TK%k;g@gH*^;lm<)}K?XR~xaSzd4IHyww8E%{ap|wS6VA$E319uMjxM z%gl}Ak#z`|*2B2andsFD@G3sp<`&Bybv8ni!52e>^J1aG*<)k1@`SE75^~Dx#eDLz z!bg_ZMY_CxcQBgT><N*~o<6CKm0?{Bd-93F3Xfv2lqr(hFy}8g2%&m*;YXOCpZZej zG5g&x+N<edBE!M*OYDQdnGRJvHw>V7UbJ;HL`W^YTZfSm*KhxFL5!w>Zm3jfXz~kr zqJ;gvmX<p<9UiHf9Oo!(EqtbMB>B+~CcZ}<_kpMvSLBOF$w|`VT!~we<CpcW9-9wc zW5(FSeeh$_LQ`pejJ0%3jEl!M1(vLa`y~0FlLq~qeJsjr(H|ICE#Xu%_n;-Y)Pl#v zD=27UvwEXTBcJBnFCI||t?`v!KH*Ic*R7Bee6?3p&EkrD=_@60oa6fiPAs2|dN@wT zPV>l0^@Xx&c^7f;g|ebViCA~YzotNmiNiSLvQFW^mwS{qx=wF7G3TgePRu>3+57KN zO&>-znppORh-Gh|#IiTHSoY=<ixs{PV(Fvl-Z&5Z_PH*&zy?D(qGt3+7(PwLPvLU# z%hFeq)m?7moMVLIluh8{4ufk07eV#yQ$Q+yH9h$JH3s{?`m$PGlxba*V|rb7YF}XC z=s52ycxdWpF@RD@?2UYW^{r;VE<GoT{rbGEWWRAPa6L{tF27A#vHmW{b7cA0nfv!? z*`(boXFjGpN*oAg>bj5Ab(>h%v~}N%>~;M8L#nL2A}pcDb?R@@q&#JY7XFczb4;yT z99jS?-lz+KaOPu9luCTsuEa6UN_@_7%D&3U+5L8^ZoZR}^b&uHdL6BWgKWJKHNbs5 zz@MWA*oPa{?nQqV&vWKY7uicx(~4lQloZu?mS%FM*lpg9k%{c0^}=9DD!RF5DZUz7 z*Ev(HJ){(|j2)pV=9FsbAxX7X;>Vjd;fm<_urJ<($*2J9v0_FP>+xDl=NjZCHig;` zO+>-ft6X+Ot40~3*fUmG|1#aSP5orWG|s;|Isf)%+dIu~zdQ+1X>UR7#}}d}3hdfa zXLz%gN4nyHY}%m@$kfmCL`6;1p8Tn>V>>{xZF44dz_n|_=zkB%!t1;MFVBPm;AC{B z-O0Uf1!8#|FER@U98k|zdBFw0ejP-Z&An8OmNT$YY}@w2%-gnY+eWWM<uHa;E76(` zi|MJSen0b>r=EJM%#OSq0)f3M3v9warju#0H^(;N??JnO<k4$;>`&Jk@mA5ZoCjlS zUiQg?e$(z}{;oe8^|)Q3e>Vdx%FqDc$c&iAu;?BU`hmw-aV`Ml)hwCP3M+yA;EkHK z7d5NQP(3ztKM=Cfdw>ZtN66?E$(wDtU5TYujXr`k%B!~Y@K$YASPjNR4LWX>xoYsx z<uufk(>_&B-}@(!Q;3Ly8#-BUU=&!0q6}*4OuHWTTOERJ<!k%ixO!6RfG7^HKjJ8N zhzPjC)$I%sHor$(SV6mSYLv3@addba{F_ewtFt<t^SCdB8fYud(9{pl=<cd1R;-TE z-4Bdb{I5K^i@wZZdD*-AZ;z>Q{y|J3OC=dNP1J+-0e^sI8nHZ$v?t{-szJN5l+$93 zWY}3ERv!_bY)D7dAIVmQSfOVMSxtJ2*sEtwk7BPX4SO{}cB0zJ`MiU3my>h%n>}9~ zpykjwJeV82Cm6%`1dryAw#L!52iC2=7P^Y`yiTnarop|6nok?!^xCYMMT-^-MtNXy zj4?^EAD)=4&~ULc7RJ6?r|#-o>7uu_I6RVT%fX_>2-PNB4uHZjfOXfu@;R)v-=89O zF9(Jj^*$NksFfML(h4x@`%kuFbr|)9wo#8b{Q9@~Kdk0I7Cz1>xFy@xMBMt>7d(<z zR@x`y(#Hrx#*_I6nPX_n+D^ML<CAy&!<~9np{bjO=x_Znx_s-JtlAT!n5=)%jq%89 z+TW8)y{8wTPJk}ptMMpn<KrV<6#9WDBdDp_GqZ;MJCuyP-%~TPukehVV|DX|XTm*H z7?{%p=i%L+;pq1mYS(pMo+~5Fij+`faA$<Mc+{^O_iLt#>kmZ*-F4bl7`om^#%#@r z21)l<rdW7@2Af5y7S9Bawx9qF+hwE>#%7Ur@wbCtz<E{DH<~}A4ffOcx0D{iUFKOF zWqvvkujyAF=EwfLkrw8HiEzmw#_QOnd?N_P;yv(Y7wkPb;x#iLG2TMd`1KQ_^eT&d zD<env${ji89zwn`4nBDaz8IX6WD9~<#)BF*0geRA17Z-b2+S|e1`xWB^y;w;@{&V+ z!5o@NvsaEosNl3A=HUdRE)rhyNFR4*p{C5u<1+A77FUZ3f{b<ca;0+fnD=c`vf<Kq z70aX@>7X&bf{rl80DcU9*P>Fi#z8<w`N^YwD|5B<Tw^Vt^WbA>!}4=>)4OBCeSSgU zU^<Eb(q+MRIdI&HgUAt%0&9VkB~45;XWp1DKbIUy{$tRaJCxyeExi@Vd1`r9uoR`4 zC@FM{NUPKocDYlia;0!=t`th33^_TluJY!TxZ+UtsnXg=>2~K$w>wh0-AElq>4w;C zy^@(&M@BIX@!<LO{)z1P{)%i{7#^`X_9|pRa$qDRlp@a;Qg!@7ixV?F9=s{fZ_!=v zDYO*j`2=chpT?M$LQKg~^oXa*7!!w(l{1A9pvv1i*ekaAS;V6$;!}+-ps6={VUHLY zrHiALV|bREx)b;cv86!cyuykqc--8FRqt!!mG9T=fz@k46zDJ!y|vD*Qq7I+UFFMo zGD;!F2Ek7B_0*)jRQbob_$g5}fcg&VN&fT^vcSplJ`7n*UDf=(j2^SK>fw~O$wb$D z&+$fR#mW<xo2QQ7*pRs#>RTBIGR^erH8aXLL*}N8BR2+rSd_-lU1Zg&7HTlOlpcc1 zJ{Vq14*_P^N<7Y`%u;}3E$?D@cRg`0?}2R3Q-!CsbXp8Au_x{c4OuNbT_I2Rt-*E? zJhL9Nb3Z9}OP#E>R5P6#CN;HnO!3pG=Ev#tLOC)J6UXu44BAMAPZp2UXMvKV%8buu z(8eV+H8fXx20=-ZQ*m<h(b(3bRS>bAiHGp&$DE4L_c=72s{NiZBmRQu8+cVxhR?8O z&L*EtdtQiRj5R6N8N1CyLiudkZZ0DeONMGY;LU6k_@Y4v_nU)?_4pzw!tv(&1#yT5 zligkyUKM9xRmANn91mNmfhKHMkieetv`kPQTqW5KDSRd@bw#JoBr6y5F~9FHt9QGo zR`4C+jPEQg%~a2*i|wMWa)xw?05^>p<ssN5Zs)KaJHc_PPaDW*;0E$9x$7)+rTK$N z_kp9AJGO&kYZ38HMZVLD$?INx17{F9?g7VjNdWFE4;9XZp0l4Ar}YzO(^!$_K9YPQ zbRX8DI$koUADC$8lpV%`)DBERFxoApmd-!!Im@<?ZpoXbXS-r@wo6mPc<0LTii{|3 zMr5h9{1)b9e3YWI{u68Ft{l0ypCA#r#|)p5E5r8lBO=3v=doyTpC#PVUlML9B=@K? z^OA)~_`aa)DqO<%saCF_JbpG2+CI-!2fyQt!S6Uf{3W9}i~`f882_wDkvP_!<1k$0 zk^G|sF1uY$&60XhIa9>EuI^)Awee87#loaTSFw7qOE?jw^$uD9j+S(I3ALe9j-;Ch zJ{=VH&4WTUq6^0g_qq<YOo*ZnO2qFZ;SKjdNv8$l-!W+z<eX+vu_G2uT8U;lQ{xJr zshC)Qn&#7O@1Y*|!Bsj&&1jtLSB(6{8TV4j@O-+og|9y=WzHQyndCEhN@gY1Qkm@Y zX?0Zqs?;b1R{MHI=EnJ+Q=>GW{4%d{%DhUE`R-gY?+%rDw;}UxMdsZu5$<-#ygN?- zr_8(4YO0FNcZbNlTa)=s@z5sln9n1#o4{#@)&$1FjtEPd%lf&rF6vUKoKb>jX9$m` z%v2Ip(MYVcQE`uK4;o8Gi^FIrLd9!ECDhKB6(yvRJ3wC>hZ-Q@F~$s{=-P;`6zlX6 zrQ(csRDEde$f&sP2o-1ZXf495xZRG5>$X@jS{!O?6QWlej9qcvc>?scg{c7op6CG^ z2;}z_$7W$+ON(*$I_xArEnx`dpxs<;jl;qV2N66k&(nT|uHn3y@B2;i75R@Bi&PJx z_B<{!$&W%k;JOO3)5&_j#mZ8dK@yosEn*(_A+!ACY(IrHJjbuq>k6H7B^AYmu5*0U zy2{)5S#4z#f*;7xYEst#_J<`IoFaRHXR465PzYfeoVd=?a05h95{y4&g-KXS$xx*l z5Xx{<mGIZ!s+2_Kl}c7o=laF?21|0DAH%=3@Rxba_Y;-4Pg>{W0hNk>=0(3VlA)VL zeCLa=;FTxA@mtj=mE)M%gy5K2ZvL1!XLe`8;EdyDl(-47z*mu3@r9@>_*>Wq@%iRr zfLk2|>O9;x5*(>79q671(`9zTTt#)_kuIXXX{2pMTfFb`6@>E>u<0%IZ65v{R04bx zV+!4@W`>}u(Cue&TMid<H%a9OwuK_<QmqLnUdl7J>U}%Zq)o`tTYxlKxzQ#h&-14* zBmjaDGNyxOAf%y!ws>}YX<vPmp@K|+%@PaHlq#`SGG?tXrV8HXeLQSa{BK43msB)l zJS#t=o#G;&j|~r}p4P<?;!YQ|9%Qla5V+1#@4E$0MHTn3Eh+SHaSb7H5lbDPc77Gd z*>yf6I}~_8<N+M>Ope9CF$g+uyU^${-)!WsV7vL9Z*<yLv@QCkl#5XjQl-^vTiI!e z#JI#i%;qq!hAqvnVdqEEFn+H;hgL0BwaQi9OT()B{M^;;>6>~l{29WW>!)aV4~`5A zmEgx6FYpnUyw->7$Z~9zywIO6##id8nNc|YUzWeBY!<327;w$7SlFN8Y9y%;4q4q> zy*@`#AvDJ10kIwH@D%Fg5TR5tDeTKVF(A*2cgR$3I4M%d(<#IA9qo+C!|FT>!MpP0 z#rnX<fQ%D@<vxenZNxB767RJMLkTXjl>lXXu{vTtuD}s?4*r-JVISe~Tw>QSCZclc zp?>Wdp)QURYL^-6k|?3B@^a3~hv}BJm|nDwHX|RV`-`yPm6Uk^4H{u;kRzk@rYJ*- zcM7)iq^A2Ts1e_Rikb9tr;SXndPXe8aI_s34N$2^aHUQT_96X2a0=Z>6ON@1f)nTl zy&U&g6K|;G7@kIF)G-EiOqxc3I<*R^)dm$uk%?Ufbysj^+tv2s!Fs_;TC12)q|nCu z4wYUQH@ezjHzI7NEw?MABgafTSZNQNY0IT}=@2vR<6^RMW6l#prEtOqPS$`unp0t{ zIf>QgmXOWVU^P0X?7TReL%`5&MrQfTZ?O<L(c?6G8R|i68EPA%`p3c+vmUf!(TlV* zPmy;jMc$dO$UE~Cd8bn3osJ^!bQO7rtH=`szoW=I9M`yR^`w{|x6klR@CuP&ko(Y> zB4$i!ZEukSY^v#wiA~=rWGViP@T-F&So5dg40E!<cW+*|yu}2u%@WJA%7|vUKB9S+ zk7$;|h=zGzO4T1D5uQJ&zw(IeD`_mr(`aNW#)x(OCs^RVu2@N;iEHr@lyI%D9FQB1 zoochscWjtnh8|kt)FkY>1gpQCD6e+OrxHnDI&p-?58@H23*SvVnWOZE9F0I=-lqZJ zBo?FYbrt13>!))FRAeYdTRU;>+yHa&NG_vDWR#_4wH1^M7f}mwaMx<h)vCEJr*TUa zj@SWCFuBH`UaK&yg-vHxkg>2zn_S1&$lH9xJ5QwKg<d)>%JJU6?V0OJF>w!QJ>PX| z_k%0v<)u6VB1387kd}Ot>@=!tAnDe=DrH_)_xyUa29vS<uk-VA;}p0JMp+fw<nZKP zOQtdVF{3zy6;n)?;C}5{S~`SFXTG1pmu0-SiH^_`|GRyv$qpQbvRNSunE^!1KP4&? zmBn6h5Ux{8rb}~e&|Dj7oey5|Om6aL1=CA4E%s+K?L6f-D{^I1Jgp-#Zd@$mQwlm( z7RserEHN4`HHE?cY=QH2(X6W@^n3hZr?`w3A*X9u>Xw?}4qYnBQ_Asm-GMU!U0#bF z71&U5rB&nc)Q%=j9nI5&`n7Y--O=<<kNbDEqq#!wXy(}+&6Pe^g?Va6b0u{&&uM#) zR}Nf9^L6NGKIK#Eey?UkuJpywT9vMO>W;bItC<ZMiDfq4*MDZ?DsDD*#4Pa|7IL}M zLPjoJWSckug?k#_vPxbZvEN+oE8@R~RD3qm3Z_m?A*V2dg+<2GmgA)6T#u&zvW*qi zCDS4Q2vImY^Q-O7{A$se2lK!&c{=l}{k+^^o%yW?t%@$BGrvmf;jTT5J>0cnJzSLj z<Jx@v$2eIY<G!=q@wvG46xEK;PP#O6C|&b(E$!#@Mt`l{yE=L}N8n6AH+#6iPJ0Fq zxwUcJUJP-aI@?eP)GPcm&o7S&@-L+@M5lR9+U+B~C5;=i3$rcRwpFv+R@G-$bu?~b zNluFa3d8jhg<%e^fUXYdy}<cWU~}pqmG@I~xWP{kJreSm&H1j>9L(AERIHcvC+L1_ z68Rds{`Auhc;)?4OeE}SD=m>8S0X*`M1lvUcJw-*TI`!-nsQ2po;h&HfNAFM9TGFd z@*s$1MNYA(DfEP;&|{_$$mGFZ?Ren_V53MS+~}+C&X2^7@q^T|;`kARo3e{C`GJQx z^EqT3;3yYbmhX7NGw&9ZjD(&;!|h9mV-4QXk1NNnoTso@kck^0SqMWY>nXWM_91_| ze9dt%?oh@Pad`4l?ZF=I71_{I%y_+n!Jt>Qd$YWm@e=lV4I5vwV$5Qn{||UPyEeTp Br`G@g literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts.txt b/modules/graphxmlswfcharts/xml_swf_charts/charts.txt new file mode 100644 index 000000000..0af122356 --- /dev/null +++ b/modules/graphxmlswfcharts/xml_swf_charts/charts.txt @@ -0,0 +1 @@ +XML/SWF Charts.php V5 ---------------------------------- Copyright (c) 2003-2008, maani.us ---------------------------------- XML/SWF Charts is a shareware. See this web page for more information: http://www.maani.us/xml_charts/ See this web page for licensing information: http://www.maani.us/xml_charts/index.php?menu=License \ No newline at end of file diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/ar3d.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/ar3d.swf new file mode 100644 index 0000000000000000000000000000000000000000..91a323822e5ea6919e1f95a76030543ad5b9f9a6 GIT binary patch literal 10349 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 L3q1ZSzU~JjBpWNs literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/arno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/arno.swf new file mode 100644 index 0000000000000000000000000000000000000000..b1179dba2890cfdf7c5d8937dbc98a9b937603e4 GIT binary patch literal 8119 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 RG|%eOTFL3~{eOZ2l&1`W^!We) literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/ars3.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/ars3.swf new file mode 100644 index 0000000000000000000000000000000000000000..1e83815cc99161788243f2819cd32961583e392d GIT binary patch literal 10756 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 C6F8Ir literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/arst.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/arst.swf new file mode 100644 index 0000000000000000000000000000000000000000..0d3420e7ce18c2a1eeb5468624c31f92be2552df GIT binary patch literal 8444 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/brfl.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/brfl.swf new file mode 100644 index 0000000000000000000000000000000000000000..42f7466ea73d9d62ba0fd10db14b3251befe4500 GIT binary patch literal 7351 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/brno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/brno.swf new file mode 100644 index 0000000000000000000000000000000000000000..e96c6ae654fe1b25bf01c9c604d88e11cb59588c GIT binary patch literal 8660 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/brst.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/brst.swf new file mode 100644 index 0000000000000000000000000000000000000000..c0cc86936910c88c2520ed9c335ec08fb6619622 GIT binary patch literal 8646 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 YO@OnY-=i~LZSQL!XTtaY1Mo3P2;;EOPXGV_ literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/buno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/buno.swf new file mode 100644 index 0000000000000000000000000000000000000000..45871cda51c97689065115865bc8e80530c2221e GIT binary patch literal 7014 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 EAHM~-RsaA1 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/cl3d.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/cl3d.swf new file mode 100644 index 0000000000000000000000000000000000000000..63840029eaedde97e84a5a28b5868540c06c781f GIT binary patch literal 10512 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 SrKL1WYhYKx<G%tn864nV`q(J| literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clfl.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clfl.swf new file mode 100644 index 0000000000000000000000000000000000000000..b02e1123787bcde6100c53a8204084daa70e065a GIT binary patch literal 7125 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 LgWq2Rds8<UEF#t! literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clim.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clim.swf new file mode 100644 index 0000000000000000000000000000000000000000..ab2a15a360ce250ebc6a684e0faf67713c337a2d GIT binary patch literal 6963 zcmV-38_eWGS5pY(g8%?{ob5dem|RtPXYR~w?qp_3vLpnPy8;512muVr)0k`$GP}B& z#Z4qaf$80uyR(zb&I~hmH@gVop)Fu5549Uoing@`1m6WkKoBZOGy+y_71CNQRPY6b zV(}5S|No!+IQKPkXLl07HebG(d(QdKfByIR&$;K!PO#Wd7)##8SSrHSEnx6(tu#G7 z%{o>^zw!abt{O?qjby88O)KlH&@)l2XUEmjn8rqnWu~rC>l!Pp9Z_p~wx;EDHpxb` zVqrvQ8&rLSsY7)(s!p(4WvrZM>e@<aY_z<&n1`mqT2<EymD=RSs+ud73#_nFs};36 zt803;pjKI7u(GXg_DMs<kXoY#b+}m4wOZXAx1<hfC6<P6>y3sY%T-F*x(==Mq`}}O z_&QZr8RuYv)pNB<sg#{y27|{JYHD>P%d$)@RYz2o<zFMLQY#jUWwn&u#<JUpeye7L zWet`Q&m=Rc<6tAjyq3L4t5p~$Q|+g(YE2t1PO!X|D~<w=98hK!Py#@Ws#j`kqh15i zWY<<kM^#oI8^%7lv05FPs+D?CFILK|Sk7w`1H%U9w;JCom|m%r^kNmulUj`pRdl^F z3R=tOOWN|Ws`-?!Y%3ejtTLw8fnMke;@_l=R@Z4&;6b0PYAja*T)H-)XX%rTfNY9| zGRuM30R6aGtdxMbdhsF+l&-5p;cx{^XQ)!jvvoCf8yA2na7I>BFRN7$9equ(64MzF zjJN>FHc*_w@>m`0roUL;N=h89nfj~iT9uWwash~4apH-m;>RiYaWZ3rS^;P{yoc;5 ztLh-pp)nootfy8}C)rr7#7f1Xnp&F#lAwPc5URD~w^YF*!S+BKpa?Ci+J=v#)y<)~ zmPacnwOVl$8f%)K1IzC()^(<CKquJ%9su5w&8ejvx&wbu*;@Dl0Bk1A*%J228GgY_ zg*BwNO(VtJ*0NT&jDDz6%UfE_>Q?h`sREKJ^lQVq-KPX40Vc;W6j)sy*YepsDY?LP zUC?ynVIwifhHHSoL?)zHj0XVfD}#HLb6Sr9KB$dW#<lEPv=UC@CbSYAjL6~$=qQjY zR!ha4#(MI3ZkmOjYPB?()oW_muxZs@fo=q%t8dL(#OG=n;5~D+s!wjHj2AT;dNkKx zQBg2fl~D%nA(+63AXKdk6*&k=y7|p?wN%nj+}!_x!3>b!3vLayoI~)<g2s;LUnRiG z2Sl1IYvv`00N~Q(2=vH<NU2!Xj9PjWY6aC)YCv38FIi7D^J&O_Dv=`%lILjp1{f5g zi%BOoWk~}ooOD@|D{BRC%yE+h9!adC)yiqLT6u8@+^Gz4wnUU~)F&ZqpyoGKr~<w~ z!_;mVYN1xlLyWXpq!<984uEl1*if9%^5CP4n|4-*4t17Bg|PZImB*sG#S-`#m=d3m zIOwRlrBV}Q$$g5q70VRZc(Br7D%wbsgL)>KW2IEg8@)M`;H(ZzWw3>Fj9P9lMZ{xQ zVJFp`eS}HUn447c1(-2lcpeh-MYT}D*#iQx^-Q67T&n@eyv2H^ma{4lm^M|;s=(l^ zMl()*1Y#PWh+Sbq-MAHFzcJSmMV1@Zt7=&YGe}~VVg#7022mR0yU`JYZ8ne5wvPDf z#$2se2)(HbH!iEpg|7-^ZGxwM9;tC^2f1x~D`!TK_qG+FsbUG|A)(f=7a=N?D_}-| z1~rnyITEyKH!sf@>!90ljpfH`hS)U-V63qItc}cwWM@ujIhYPucDz_G4&fX~akb8K zksRA(j|M>%!&i3A7>F8Gh*K9fm}-IyrLLVLQoyu{D$oezRl%?+3)1pE=wcgb62bXl z1sWq1R<IlA8s^T}Bg&M-WJaHn41P+PsRZj_#=qXKuA3yboK3};95vu#1Q*ZPJ$X$> zCf&VLVpCy(eMX+c=0sprc@9;}gKm&S#@i{`>BXH&x=_s>>_)1R23(4U%40jP=%kJZ zWs*~IUf-FrvChk2En<VQeDThglS%-*<Q!r_#vY*?E1;tR+>4@4G8jQlQU#&zGP)mZ zONUo1<U=o#4^arwBC1`i6i8*yEtyI(`A|!d1ahc9ku>n9me_4?$QaNDL^{I<psyvF zsR)z$XcTS9R40>{TBBIvB{@pSrCT{m=~GdXHqB<IR66ZT9~V=~LYcIAf$B7gp&M{f z?>DAhw5OGiN$lP?gyilp<Sxp&>u1d{WBcLZ&<-?qv;q!z2@QBeNG*6hVaD!)emmaM z;BE6%(%zfoBNci$N<NxD94#NgAC80v1bvf29(k0~N!4$bms0h7t{d(}WF1sK(k>^v z!yC3I^1V5QgZ+^lrS3;4NgDi^rs%w`il(plk?M4gLRdg|&9Y3ocRrF_7R=yaYI;j% zMiS_o-_>GBpz(h-H)OA4jb6~_<79isIjCNqar1G!r{)At&514W3QCIEN_y*H+Kp@l zpV5wUP}hW~ZV;h-lBj)->uvP;_Cf464gbjDZz0SlzZUsM!cLKoQ&0d2gUsWUu)cJv z5JtK9P6^kodn(H0(<B@x9=Q?#P@JcS5a%$A^b&(f55_tpB>cA`9R3|4;Xf>K_?02y z&yRBWcZP(2ON_&>3JEXAQ8^t`9UwA!wY*w63nkV)l|m#v^0D$7d2R6Qg<4sPu?D{5 zc7#KKC{4RizYL=ge0N|JhVOOq$qJyC&y?58Y58>dFb9z^c>+wYqpp|g`W$tAnW=e9 zewUp#yxY<IZtBwSsOzV6U>@!oqWwy?d^QZCiALk?k^*skgu!*vhwGIy=NeM7cg@)a z>T3hX3u3e7Si(6b?N<MO=l|UHXnaAm&350^+-JdfyUl%})PASGE`m<)@qW-*2erL+ zoxdZ}erXUubDLQ8+K~dxmGFF;VlU4QrkOVbb$qFEjNGLR;KP!TnSzWm9FWg)ddYhl z<lfLcC^SQHqqFlSA@UHA**Qhc?=?d3I{6g(J{#AF@V!~25+9PL9E7RzeMI*;gNseV zmpVyl;_ZQB&G8xQTyrdt`~^vKmGIhM9(++q&tHw@!HWN19{eFM4-R1Veou?p`}<qW z-p^<;dw)6FTK4|+7|8C<R`S+AR=hLT>vF2Pzm?q8k829z>DNuJ{#Yxys>rY8OwnI2 zx%rP;Nl*Rs`+Ca7UuY%!Y+%er=52d&Q0Dy_a^zpL*@v&!-)6&s$h6Zl%(O$M*!CFv zFVk*Yij6%Eg&t?2@ZbJ478e=sj?Pmk2iy15jfV>-5?I80wBwjX?iA>JXFiL1TpDoz zb=l3J$qR_MwV2Z^k+WjqPsD<16yiLOS~K84xxip?$(;AXmjRl>^1EH-g?5?n4h7@Q zWu_L|q}nv+S37~`bA-VFhDyjMG^2W$gjGnJkkB;GB}buY#BLIV>w=SLSwgYEwQO;} zUiI{dJ9@-J^jPLv2sQ7~;poxf*8`x61{8n2wIyTjjdz0O`bik--{-6cBwJm?bz{_5 zoUd)UU{mr|#U^w_c*i_|uZ$0|Ul}j<!gM3Zc?O7u#H8Hu26{1b06@Pj)aZGES;|m` z4^N|*&URr4gwe}b*bxDzOv&yplD(!|>Kq2RmMpG4LnRvZOEm1~p@5h?!ifdQPPo7Z zP+t{MUnIB+PRs81-F6=!XOUBR;wx@b-uxAPnHdOup`?s|z3+?Fly{8I^ne*BDQwoJ z;p3G#4nSC}Nz#D3DgjmSRh4KpccIkin8Ab57LOTR9Cb(G5XTHorA}2o-x`l$u@n~A z@1UyTx)2i=+M`_<ezaa;v<t(I_F6bX;qR#aM%jYg@ALSX6s~)i;}RzYA{V<X{Ooh9 zKA-;aMX3RBfa61TdFhzvS1mj5+6PlXfvAyFhO&_1!1&XWTs(0r;ig~AoQ8hylR3TR z_W`;`G8g%XtEw~#&)yyh@E^Y(p0gHSb^7tPXV3Gi9^12LPk=i8x(pBhYE@x)c-X5> zAEOFqAz@MWhDT{L_J=t0d@$lOjA=A)3!Mu9-da3@s$b|4YAxO{aX8VF*CggV@YUz1 zJp<H(2B_lz@U1(BsC&dx^VIl>&MP=fGvlb+v6bEKvA4*&!l69$N=B397aVv~A~V33 ztzcQ>PRk0i8*Uxv^K@w$$zoh_H$zx*>iWKE9Aevyhu9Ws2#ZVe*rvzj#4NFsEb1UX zi?aF~XEF=!1h|t7<sfSG^jpxZ-vW0(J|m+hJh?2Va)F0RV12>>nWRxK%Gim4b6xWO zL7~&dj!u_^=mekJZFfmA%>FKwP~?wC5aXo=&}HIE=Q4Lh+D_wLK4_&LhW2>t71a8H zj3+?xh7TG6>QrX5J2wRWbkJ4tXMAtKvW;7(o5aB@GlI$ehPfMzX|{(xuj=aupu^eX zhET_bf?5&^>grHXAL=vCWSg?!auRl_c&9(Nh4Y?nhnSvu#kP~nEUnW1-2i`wv0X&> z7lQ&pS5RR2fYpoC`(gPS@n{%NQ?JdCE<YY^HrRFIVAsQ7U{@cp?dqee-+>Juv#sGH z1o@W$3EG|#v<<}_&f*P15j^s2dkK8DU=}0XAbunv%w`*AvtuPgFrSv}DxRxt=E^zS zyKcEqYQTC2vc40#2|J{lq2N>{7l$p3ZchgS`>R1@_D0?_0Oopb58hV%`s=j7YEI-! z%UC3Fx!=U`?2vbWH8o@K<6#)=VDcLI6FyY??GX9x0r~Cn`0eAYacl(tjs5ty{4&7b z*)^ZEAOGHdyxD>AW*TLeqiz?~-QuXbh3al~)ZOabV-|wir?`Cm<dHA{12lXa@3|Q& z$j{H%$M;;%=0%x`x7%TSC+*t6^M`HU`t-`h*BrtsWxUVUS1#gKYV<ZHjpo=ETGdX; zQ>b=OnI4nmqmeWCJ~Gourf>tH))jIU{$BV7C{o)Lwe3(SeEE%w783zGx?LH#@d(HL zGN0|-Lr)HfH&bs%SGcehzrTYu_xsC<VDDCd$NSwU<9m$^*Rvzgv}d<NnZwf#Wu7FY zL4k{zbB#0oBH8V^EwItX+}^7I`{jy`#Ee@6{F=@UN{YmDGILPj7csm&lRTqYBY)=q zaD1}FwmtJPiFJ11<7aGBxNW5X;=eBTu@Z;%(l*ILsTmqq-py(MY{rUgV)f_zR$<Mt zecm727wmcQi@@%ieBQrU5A=>x{s&PimTg#X!CXyCg(h>LJ6grys#%t?aoy>Q%j1;? z4y%V-#3gQdd}$>fw!19q>ta4b1aFtjJoY6$Y3>(<gzub)yY+J(%Kkv?Ca$!vTNurI zz0wx@s7LId_0aP9nTkCe#dpj~Dz7gm<OdwAj=qOkdEv{1_AYN?a(yIlq0V=ij3s(8 z!kyjRdh&DA8T+z_&>o@Z_KdsrFi%adr{*q?m;(hLSCZ})f2{_&X^WUaO$l2~Uvcf6 zY=6b>a(9r{)<(=%fx?SrOL68q!S0B-NgCpn6@H(mINnuRjlS17?{28AyFJ>v+oP?! zThf-O0o~)_ypOH~OPDiAuUj5_1-I4iks2+WX;b80_YMryt+pU-8s-VlBeuM_R83!^ z!ZxvBc20LYy!)$G<nSXb0fdRZelLxE9}ox2r%m?qX_F!jL5|$RnlQ}q-Vc5GTJ}E9 z@+PPt1Kkz8wdaT!nT`V!F}_B14>+B~-TYvN&b%v<yWwrt*@=I|;}VA%XD8l?g}hPt zIu<^~@PKs$x5OTDXEPTI?}%yb^st*Y(-`dGFXm^~zs!6wdO9Y>o=L|b7u#FPh*6t8 z#^z)*T6KQIHb3VQkt28{<D;e7#ZLHqSeb1AhR=ui_LnP4xTxLjwJE2a+b1gK2N>Mx zlp}xBeq-Z!ncO~a0Jq;^yZsKuP0qKB{ruY`q-T$j9(_~s2+0Ju2<_wu9Y+(INPUl2 z>hVnB)$_mIGxfjSZTG)$7@LzF%KyIY@xR^S{m(~<t@~df5`X`*HnV}lllM8&qMg4H za~W?mG5IUFb`H#X*Uo{7fQ(vKn#~<vt0jvyZc-gBOsN;!M!_*#X#j0jJ!-qNH(L)i zt==-{z)Y);Wla3m>Tapyew77)>bb<x#K&0f8TEKi%?X|wenHCSuE8ZJ-hnPbK`QsS z)a`Eijul+~Y1ljs24sF03-5{W!uPOnt;7r8$HI+K%yME=a{;H^BQNppEH2=8bmuGw z!o=+Gp9c*9e;+rilVSHwBp#f*VEMtXA6T~#jx)~V|BK^1e#A_;WA=Ich?#Q7?DP1% z&b(^!UGZuSZ*rc+=XLxn{z1&U56REsUq2g(wMS5mM~P>eigMK~MTrBqL6qyG4Mb^O z5O0UXpxYy~plTqP^=+`RUG1^4<x&H|v{4=n4P|{B4CUPR7z(WL53Hdy^`MnA7mWYq zpqUGYNB+lsE(bksT@HGbpNL%K$N)U2N`H{y6TKq#Z+rk|^~<kXzT!+yjv|_WXh2MO z(h?+go(qOjktdwzH=Y!VLL#%bwO_;AO6T66aEiO1MC&}-0-yhCo$4|VZ^qEpIf&1# z7W*JKzG63^)tQ{?CaVwFBNKihz}bnvN%L!Q*DTAV3tTz#IzqZ3WjI%f8P49O8O};E z!<j2)IL}HTp>IU-%Gg!%8u{Pob|Bp!yPDr0Yd&2Q+3{wOaW2Xq@=KLc&`k5V?-ab( zCxGnr2_Soevzfg<!DFuwJpA6O^5Ah@1L>H&x4_wt+Q6A3xtKX;Uy_13v!cAoqA`cG zti_eH<aJkjwD`?PQ(n_ERp)G3JhwgS{3&Zeoh`7qes&h?Kbg;*O&;W~5+?IrV=}(V zF`46WD6<ke{5v84u{CeP=aWjoJ`?q%c_xaF^%DZWI)eap=Dt#EP6EQ^9aFHvxsp_d z-xogyS)gmS^O?Naex=#;g6$J9Kl1Z@PYA<uG5rVMN1MmoGqm>w$K@|KnNU;odgv*e zZ0eh$+5TzgKE#t`OLLhK37+C2<hQGyf}%q@91Z_vlBeaTc|LU4v@gZJNkW|&%sVax zW6Pm5;(wx{o9d0B(W(P}f_qvCEv!l55Lc)d3a-831@88r^8Md|Sa`ONjQOzL-_<NR zqV%bUE%rzTKG)Hw+Sk<_4VlC))@U4hr`Tkmo9Mm<@cfL;^G>>r1ihZ|WV2BDtXu46 zYD%p?bF@A}x!t4>vfX~jb~i-!?Tq00+-{$-eg`4dYn#q9PG@*V@w|^+DuvGD4p25K zT=onEk%H3Fe&HBL^KJS8ahv{9+@`<Ny#@ZPxDPzx+U=fj?w?Qi@1IY2_xPVxM5N@$ zXM`Ntr)%Jr`p*<Y>ymk_#MlB~DpWmWRrzjfw<)IY{+-b|hL=%(C|>8Yu9vuNlb?9~ zxf?9-7K*VT1X_OXx&3Y-_(jk-zjT8IjPomDoL>fybCGwPA2)vWF==KcUQ8}~pT+qe z`1)lFuR**Be=h#EVS^Wuoc8CuQn+VkQg|+e6lTYAoA~py+UI6#wLaG5XSKl>yFyy6 zj~9M%X8O7$yw&<>$E(S>r5!J5Q#JWG{SRiw)-T%3)-tc3HR9B#cM$V*N@lefXrHG( z{LIsT_0jBljY8Ar&6MoDAlSvBOny=RZ}}x|LsRZKjidUtK+ykWQl3-umM0M_FMvD} zOnzD3PVdFsD~aD&D+vqdc1n_ei+5)CCq4IurRQFoo)+#1rXubJ*Nwe~%}e^|82epp ze~BQ5BJdgh<&60=LBW!tWvp*szOwzTaoyS4T>idrMvxQyJ1al?z4#L_S7YH}Ov$c@ zG(Q@41KqyaXT$6hV2m3&$I>rJ?&OTTvT`w&*4iZ)b02ggD(|IxGB1F5+|<6*OuUr) zSSQW~@ZNfFq&ab%fyPWWXTTbFwhUO3AO@}sA>9l12Ll!vS5I3TDU9w6PY3+|6u(;f zL8EjTzs`QCu=g_0aft9z#dF_%i(FI&ZahT%Yf2IG4-+00;TC@ykL>%z3v_ho&>H5q zG`nm@Da3FuWgq_XLV`sSkw`*{;4hnjv|da^Bd*X)?)Z{hW1a1G_tO+V`Vm%c?(c!z z8xDWX>EfRYjI+77u_*t$QB0!0G8m&jGZ@Eb1Y{jprl%L@d95ghH~I_<y28hmsNJx_ zjS*htx8pYPV6@M9s}`>aN`Wv1nh!@=BRmkWBs|d`lbk8V8yK&&elCUpcN+T&&|v+j z3ddml!fkwUIHF^LF#KnkS2ZI#MnuOPWW+2oI;<FI<-h29H@xC-%pw+J@mL29d1++I z`k7vbJbJr^`OmR*LNJFR&H6s9zTH#Zi`AdRXumu%m12ol#BujBCeaRF!T8xNtD=+3 zu>(86e@@|}(|E{OawgdvFb?$y2SZSQ{@Mp%qAU@Q4BBd8q?VoZv(ZMe1B=%(f9ifc zJw4rf;Hjg9KNxe2cCY3OW2d=ly}tsJbcnsnt+n}1fI^qs%;!@!atPzMcVjUL14}GQ z`yahz1TiOf@?gOr&gj8m6<UetZdd~u$Rg1Zp&f3wyrbCS*vBHle~1OO9E~GG3pE;h z!KrSSS{|4dfIKTFp)JZ9sE9bb+@i!7tPn&+r<;n0+Cl~G7@~{vEwNOzO-g@}x#9Rp z*ML+w7VR~*+9lzKg6OI@PnC5g<@%YQ2d5pdfFp)KIy1)5H)6y&;!P#Z2;6Ak<^BV6 z-MB}7z<=b&Bf%EEDB`&Gpu>92?b-Yyv#xj-<AyVXanFf_?Sozsi$Vtly*t{B{|n3? zK#AfY{L1_roiY(z1-b2RK~>lJ3+xjZAT6XQX&xU8ejz?Zxgx#ng<@*fO2yAOE`5y| z?DBSb$B~$t#A3t~*~dkUM|8_-)8-VszpeJ8``agZo?)GXb^ikH!OQ}HZ0!UJPe|7y zDcGBiiI`E-G#8$&L_OZY!2<0^a{tU(Od3Exlf8ZxgvrjC-L{+xIO>dcZN9X)iT3hE znOWP3Q6$5x^;hX<rv1B`y8RC0YC;Le0z*p-vx!6^5{u%jfj;L8+RWwn+dVOmB-$QG zuALSW%I`(m<c=F$32C2kG2dfkJQryYv;g3_28qojJ~+MTd}f9q>q}Y7i$L4wdIQ4F zZX9l{JR~UQ8srLLIh;wf6s5j4Ed*Vjlf2X}H6Mudqqjj4a69u?RKOJ8C`Li3Tx2h7 zMIKIY@<2<$C_E(%Hj+*@?)PWoayFY#(4Ki?0h6}?=@Rryz+8#1tJl7B4qFZ1{|m!D FivITH*pdJM literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clno.swf new file mode 100644 index 0000000000000000000000000000000000000000..3ea3c17a97c8bdd8e0cadda0d2ce200bac5a5f0b GIT binary patch literal 8394 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clp3.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clp3.swf new file mode 100644 index 0000000000000000000000000000000000000000..1a783e07a1a13ebfe0f615c2df6742d0ef1fed39 GIT binary patch literal 10524 zcmV+%DdW~dS5pW)$^Za(ob7!LcpTMr=$+k_cBI{v<$nw-u=xwv7-Jg<U>jpgSaPvf zvTU$q2x6pNtv0N8m)({Bl0f*$OVSp|YeB8+kT#T%Kz{m4DbR$UnkIQko?m`mO6vCY zz1Jkr($Yec5ZW|=-Z|&qnYnXkW_Kj5jnWT)u$p`Cx#ygF{_eeJ?#vuuksmP@dy28R z#=7P*_}3YloSbCM8^i72V(er2SXvt@8Rbl&%CenfM!7naH-<BLRw`C<)m*W_#&YQl zGe&dyYNlLa-I?mp7IB^3mMh#mls2jc8!@VxY_WWh<p4`DUttH}uc+HuGDdQREGw;M z2iYOkY2-)NcCpeLRy|nCuySUk%J%2d)iE}f$z{i?Y^0cH<>G#hz6-IJ#w%kC==B%( zS6C%e&SfgSqob8fl^H;6d~abl_0R64CV;38WsQ;;4`JA6<i|5C+m$H+TxHBi7xxdb zA+{-<-ew%kl$j90g=W(j+in1)F$`2U9mrLNID);#0k$_+FeOF2b3yIP3>o>-n8A#l zgo0BtHXD@;>jy9xF%>qI%f>;*f3szyG&W?>7DbLmV5^pmLS+;f#DNyesqwwcKy)mh zE0`4NvO1O<xw(+3RCsX&p#_`NljSpoEO690KAZtws>Ncynk$iVhYn@RMaH#mY~#u= zXGU`eSUNM3+iT>9MgWajK=A^@Mip@Gtd>EsL!HIFdkt0@AH_Z+<K+r8<qGM{f!<Mp zaJBdgI?wDavEn`$(cWA-ozJk5Jg`yC9H<V_FB^kV<+24f0wMvZeWEyAtX7MA86Q_A zcL)rpST)E%M~h&)!^M1>b(M|%d;q3QnQ6CqR%K;23?kwD4HwJlOnImZQme3mK~^c| zb7=+^htgSd(M6Zx&wKIbQU(gl0->dw%!|#e0>cOS+m=zOW=a*{X}pj|3mF;#D@SwT z7Y14V_FQ2*7!Y+B%I7LzzT5EEbRJ$eY?Qh6Zl)pcvJ@+fj&m*qBI$iJUqqE}%Zyg- zK6xlfFj-VTXcBD`{Bv&?5Ht!S8Md{MLlYh06tb*h?8~Hw1YoAhtvS1Mq+HDB*=QLE z=gDuXMR5T@TMHc7CIMc~>;*+{FYe1_I#J1-|6Qo$d?uR#K~+lm91yoWh-<gYDBqkZ z^kfcj!!2a8hU8yXQ8w|RY&n-68e{fI2lqId_OSt|*q%F(Nkb4}-RNqpvfn5XtEQ84 zYuIbNzgU)p#`VS9a)k<p!{T_A{&FMDq`~W}K#Lhyqxz{oXAexlfvW(c9|S8N2b1M( z{5pqt2CXXWYFJ^`4nQI{8zjUc1iOOpfppHu77O62<0bnV!cc*Ms{!l0#k!^zqmTvv z>nj57UB$j)9(=sCmeB>4p_-L0W@U=W)nW<4CPYSze#Xw5L7kS>a>*FB(HXnoY8#I? zJZ_0GShGY05uk0d{i`_zNk;qEAUTKCk|HS<@;RwcEWn&pD&-H#wLlAHIfCH`^kBEF zOy?@#;QPSz$IDz`B=!tOwLC`REqyzgFyyNbWJboT88);pSIG^7gt)))X@`xlT{gig z#F+FD`W%@vAOOSQQHa+_%%yWUTi_LV?ihG^B{M+3gEFHSCy@(NQzq`A&Ew$i1+ysT zJ6_<U9?fMS0%8c|jS%?q!e!`E_!jVn^9R@c@OVC-;d2S~?BNrzz+36dlrbQhWxNIf zWO8{h@p2XnVXV(cr_(sMk8MS1f{n6$R^2|U&cLohIl1x(P)0sF`K1}Ex%h_;aQP8k zKFJTTp@Zi2ATzZx!aWZDWJ)Y^pad3y1`EzjK{%7%grQ<5g=GUG?;7+`D6GK+3L=N_ z*H^62-~OVt_`#Xanp%Jv>+&E=L%_NPNcQ!xO(?!K{RX&NfprbAu0ghQ6HH45*0~8x ztHO3}W}Tba&TiJ(&30{JAaAy-k8K)Yo6!3UnQcX!WA_m!XfwGSM!^C68N{DG%n&OG zuFYYXcnS~@@}#Vt)q@}bjIO(iQ~`fLLDUYx8RTFHRhj`FV*9W$ax)t>Al|0Us1Fli zwYR|4vx%=>xTYxn;HB-<RS+)Q#<sH*>mOwOdszPfI2^`xWPo#-xA2rfG~>`|EQ5=~ zYB}G}E6@}-Sw<;VCN{~wynzCNh>$B>2WE<ODC+GnH^ah$##<CdQ4|Kj|L&0j(13J3 zC|v^#EjiOLbwbQe8<jEmvwuGu836_47&k~<sd3t?&5Jb@j0NL#Dfs2h81Z0P!xwcB zKMz9qMJ!lpj)FHHX%$lsV{a{*2r-={@mEXXZ-{=wTj$MtAjFoki3rmpHb9g`HRvWP zn)*BJ?#<LOn!<kL8bIng!4im`v;kXEJqWWyn@BLdwV8>3qBWL^O*FA+2x<~)&sZwn z-7(S3^tj%tw>lcEKCy|@n4Yk)wpo|aFz!37A<Wr8sM`Hebx#GA&h)wZJU|vFG_5I= zTtbu*RGP21n{DuG!o?<HOkWUPgNPR5aNC)_$fgu^P~to;CIqMSFGj5JFWJ{|IK(F2 z#^MqIbE-9t7-?Wha-xM<XnRP#8zb1`G(9Pezk_g}p6ceE;vMxh`Hx|{>Wq{i*2FpP zPVr9kXK89eV<B!@pD{ZD2g^j~WvRZ8LZ@EP3)G$o-H3~`x)q$=D36dWkF&WX&hhV% zyf4JohNoq4_&1rf?W+Sxof~ktrrzE|(C78rsLv;m<tephMJkrC>n@<W1*v$4TDLMK z>vOAM!vd1jzqK9ZeHyv)h5EU|4qo1f{o-gi3q_OD03?d_M(HxF2bg<UGE^3U7BIB@ zRaPakGDNJbQoA-zj6mangGRlvx$(|Ghjol}Vx=u2_eHcxE?HqK3Fs))tRi1((@(Ri zo6JBJ5#T;>@aIAq9K@|7iHkNkBh1^s<Pl~`at9Va`%84F)iz6OuIfOQF0obWHcN^a zw~~FVPKxFjlX3JS4&8~vBkHVh;1F8FF<d|)MCSYHNt16X<|d~aD8JIykU*Jfn?|5q zW_I!olxwFNC@-!ZDE}xCkj+bwO|ewi#_D0l_Dh4I?QKw`_6UbtRSmuuf15NOB^T2u zE)$ldkx_ufw20~@NeQQKVEYi8$`sMa00XS<n-cL8F+aUKTQqLAxI75mD|oa3Azdg* zvQC%72#9U1&=#=Qx~UUdXA{zb6IwrYLhF%GoXK|Mm{&N84Fr3c6gYUzm8p%Xy77yL z7x+C_y5_U!D!!OcqV2_z+{O*$5!Mu^ux!o9&XCnTF~_;%K=e)S?FM#BK$Hw7nyW;Z z-Ujl#g)O#wDLX#3VG~70wiWwbCik0yhi{!narIbpz}}n1%m;lwMV{B`V5uvmGI_PD zW{az)I~AOF5OTz}m!AG^71`EQH^zkv9Ng6zQwNAd|226FCyV}?e(W|0|0vRZmN0Ld zjpIhfw(FfqdrsVjr77AW4w8#+d$4XD6Je&OLP)1c!-Wruvp0Y^M}g8M7zcn>UqJXf zG#K1Jg`8;yhmV@8Xo>{Zvbo#2s+QnA9GE1T@>|u#k>9!cW_^d=Ut?`YF~mwYK>asx zy`tnDp!yRUR?lPle7e*Z@IO2CZAl=d@6xZ;uhVzympEi|3B|(!N8JF`4La%uQy8=M z*fHyRNAva6<pxLH4aC(PQzX**^nLwkS$nmh!gtpDMaz>aY+hYQ*nP7{*nCb-CG8Ez zd~(ejp^mTFhxACYH)sIEx#FV0bA=oc9wD+z1BNS+Zo5gpoWO6QksG39P-$3{hN(0n zN+VR-sc)yTEfjO{BAFCkv@mztEltER?PewWWa<eA_4zh+_%-3kU>4Y{SWO0R^5rLZ z8t{&vI5z1keq!swYjI5*(>J75Rwe~oz?V++${Ia<RL@#8Cl)hGff9Z>$su=~pR(M) z-6I`4$FXPh1v9f7V;dG9SxWbLhUl&f)7&@n{-#H@<SUis4M;DnIe_L#{4dpWG@?%Q zpQZZy<-*N!AukF|d>Y>DT-(hRa$g#~)|62vMw6w{Yn1W=yG(fZ*25d(cykJ#B}(}` z1#iIzFX-n~MP5=<i`^s%(SierqQiPhRu(b==I%@qS@mhJdTuij)q+}88@{FA)g$5P zkqFRZzG|g)dn`~KqE-)66lOf=5s3;JAPNA~=<2t^UQl1`>;v2B6_)6n{eZ)Alh%8f zw%x7<H<9Hwk&9f6Esq|3=3ggW1S)<6Do6l~tSZMkPN(9EFJ)JaR}AtHCI}n{ua9r& zP#Gxc)g*^<F}*@Gt#CIj7fs7~_G+IiE$W%l+@IvePf9(XWU())Hp8^%OlUqki6jn8 zo5X=YB&-3NsZQ6taT;>~0SBjhS(McuEI7?XLT9nFFBr<{)adGWFbLg){&Wx4qkB-L zD`g9VQUlQ)5+ENSsvorPBP!1Qp?;~;t&UE&1?v=3<Bi2$ixnke3DRd$G{nf_)3!sI zvWc0(NyJ@2sG~;Kn`ZD2yThwj0QCxyUO^D*ZWkLUSrIgxI9}l$kWMn~4=3%R^XmmE zGfxO;?yvyRmghL?7NjH$w-bgtlGN7;cYCUX7w@q48SxHBPU+4K(n9wxI|jxXZdgAO zLfYTf5XncZU57NGEmN~ocM&uHrQaH~a7o_!QEL5I%5`^vH+&q%kHjx^=DqZ!vTFQw zTDAR#vTA&Evd&$X-%LqS<QGhB5G(V!^qZoT(NcLE-~qKc5Y*B@P|-k8cawHjGD{*{ zIMSYoce=+G&W;X;m|lL{_CnWAlF|%!srOrCH9`BwtX|GV0sMwjq`-yi>;~@@`#Y8o zcUXHzt(%pOt}8KUHXl3o;>PbBJ9f;`bZ<)0z$f~>*73Bv_r3e(9W1;z1xm=NwL!Q@ zaqr**{;&Q6{w<FIpX%gM&i^)K%yl+GVw|gzuA45hpHD*oqoY6Am>nG*tt$Z6IvoOg zowGNMmYF0B@TAwLJMfkM1NSoZ*){O#k6DQo_j+u-q|N&Y^XBOzZivq-Qur-zDX6!2 z8s*{*9{g`p@B7?$VhbVPrNTaWtFa}-6>jclyk?mhOhthEeg~^_rM`Ei)PY>$s=3cq zGmvu0HPJ|GP1H?DA+gcMkIL5>8$G<4+u)dT=IGOJ**z!xOmd6ANt*j2GRf0JvVbRQ z3V6aL;0c$2CmaG+&Z9KO(LFJ{HdzgceM0oV^D8f&`p0%XP3@a+;kNB}L*_Eqca5J> z*ZA^=>#!9>o&BZd{xbC-b%uufdxR-KWPQHrghp1Y?g-U=(&=w%^8+cm!~X+KZ3w04 zRxMn83h%3)ftwRx`}eVs7KJ|;r8_@(JDHAye_EYeZ<Wq`QOti(<;~oh+vIQMcj%vF zo)}#nV{*@!gUGFRJ_a#nW{$Bw+aNOa-iR}EW1&#w{fENO9!y%X-D|cXm`~S+kv&AA z@{rpaoEB<%X-~V4sk}~6_%n8*({YcladsSK`os2l%!iXIJD(L9lQi-3ITQxeeujP% z$(S45Vl=@K;?oEU;e=}yxPS+-&&dc)*z7y!IS)<Oa~^8A=LEx8pY4F2^N`DP9#K5! za{)ZZ2S%A&9tJC+x#fdzIi{L({sW8EIv)K{Dyt-{&3ZsF&sF_No*Jws>&0ugy^*bn zvs&kvh^6%Otto-o6n;0QCLgsO(fwplpsDP^_{o{dKA$r2Tjv~3bDZF^08l+2ax`%o zT`sCuyK1($YIsbuM_1#R74JaDtY8`Pg^=s0@fWSI@TF1n2o<pTM_4F@c;UZcp*O+{ ze~g7{GYsg6j?1mM`%JZn5@@`!dQ*aRoMsL^HdPaqI0@5j;j}91AqN+J4E)UdQ7OX4 zn-Wq}!j5(7A&EbsbmwFI2;SrTFwSGd&K_danUeX_eu8^KhI^dYcEh!TlJvRyQu$mE z{5~$ONwZH_1?NE_3oaqUVZr0%P^UOK^rYjM*7@cFTsk>)zO>*Tbkq$}-5wlL#6C8} z+nmRScpX1B)aD^jer%|yPs~*eDv;?U$aKgQ9Ci_#4R&G8Cia=W(2T91hT`k!`l(r> z>pPpLr|Y>&n3#2Oz@hIZr@m`O2QuGT79FmgMbTkLr12K>4n_#*`?zCWtHg#qJ~l9` zZDqDZmvcfmDS)j+KRG!$IRiVH<pIS{`Kpol1s=&r+5;L%`;3g_NykCuch*SwviA!f zr<A{7ol<@@NhvnnvHg)A_v4iQEX8*@r{a#(wjhBh<USd3_0Mo8^JQr#Q};Q~<<bN3 zzB#lnJNa~N$~+P+N|$-<bJb2?;Te|UkQX>KY$vHb?b<d%<uiU6Dr$XJNj0HldOVOl z<b~{^n#dkWbxiY35X#_drA>O}w8?FlHu+OECGm`$p*f^v9}YS583(-c8He0CmuHeP zQp!`T3rN|cYmF4g(^T=S{b*Ujkp+J+={<pZLx0)_T1jtw8EmYtL)e<d>vN=yKTnxw zsucH;o$Hx5-?2Q%SEiB&Ib@qbNX>(|hxe#02zOefZuGb}=HtApVm_Prx(`M>mFuuo zoTch7t*qy-94fArkT_LNNc?SBN=Pihgv1)%CyOxivB2cjMic5uUIPS88l+$rk19*O z8mqgSb2Ufoah%?MQpRID`JBgG{+!2L{#=c@{5g-g{JB7LdFQlMZ|xoH+Q2)%XYf+A zQ@1lv=h0cD&T8`s^W<5QD+sVSpP~CVey2B;z|c2KENOY<L|f7<iw99w-?qGMA!yGT zTF22@WF7I)iJvxRt95uAh5Gbyoes#z3~b@rSv2Pad1x8a0gc$A47_f4v!2pX51?I4 z<eyi;d>`gP#H$>AtkYBeeN;aF!jF%ys$c>5`0Die_@JAQA3Gi>o;b7Sd(EUf^dFE+ z$aP{7e!rUZ_F|I}DH3@3vNO%_d{TIjGMJhuJkQGVu3vM@Ve$mZL1NuH1nB0-9E^8x zt0|BGSbdjfQ;?CD?|f}azVq7+u~{$Qsr3|}+jpkHhes@Fr0=*Rk<)v=>XYa3%Ey_w zBp>rJmgkdGwhNC~cA|X8CpM~q#ZNR-!|Ll$Q<BlwsS7`f```JCn!b^wB-P6ioV&g$ z&0VK3{agC~(2sG$`=6>7IjV0<Jbx$Ue)2PBo#MmtH-T5!;e1!Wiw>`-bMp5H*(v?b zCnsRs{|lewK9T%ng7TBG`I*9Fj&V(GP#!w0*}Qb?TtxB|J5eHtpa?w3f0xX!wq$6r z<k^?6pGZ{lGU$c3ZT2|B-?y@Ve~D?mc_RB4#lpW}hW$x;3-qv^>>QQ^E#3tB96pSx zzhJ|>Ai;=)=;idjr!)CLegJ*}rL~Syzg+?jUH~M-^Oq)N<N)_q4!CcE6xBf;tEUB8 z91g=!h{Ac3@RQc+kKtifUlvmxr^UsWCTBJrOJJLDIQIuoN&dtS$71ROlh%r#<3CP= z`fK_XFAw@*$Z-b$Z{*;~!T+}zJhvfyls_r_jU*Nx3gHWV{#O4#`u}xwX-%m}=F8Is z@c926tqB+W0vWy;qrl%OOc9!6j!Mv3!Xru?pK6q#2zj^Xn}a+e<lWPXkh$6sl0R^L ziT0mTzO}<|ZLv=|{2q|PFMp8y<Dw)UB>#xC8J;8ExmpG-u6LD`^kTC2$RhbGBAWTp zj|(-<-4FSz&|Z+=h&GJ7Yl}>TAQz$UNAT5E5GP2_KLWk+7hewZQM~|v9NID0GY;*1 zy_R-nG)Mk0=`|9B)$41?R}Ml=N9M@iT4C%F^F5j{j33*>uwP9S@q4W3Zr@i2aOWJd zEmgg(C~5e(W8rIgT8$SB9e2F7!}7JdJ?5*vTerso)qDMVKnQx#lAZUPS?o%W_c(vi zj7vcDC2Q)ktfRNaUD%hzQz02`;zEAp=5C({uIEPwLX=6nU?z8Oj(cR%j(cR%j+>b@ z?>7J*_eiE4ub)hl4$(lx-&2Qwki6_go+3NLj40s7FM4$7RS)CTuv9s$-TpTGe9l8z zr=B!r3H_)#dskT=%8~`|I-c+~*Andt*Mz;^RkO}j^RlbvAElbRy%qsV&3spld+ESK zVyivcf9l5<KfDrG0biltf2JX>lP1;|Eur&+WRa^##j3dfB^B?+_nci?qwAX+{ky8{ z@MZ6hh@C|yPH>P{Npnc)L5b3<zH)hy3=PNM?f<SR_<hy+-nqGMk`7phXFfpR7I882 zlKe`**KC85@Te^PYrjhn%3ze%pV&vvx{2}kI;~ThzG`=N(Ur~ZwUn1jg5K(~lX9`M zU?w<ST>h%Lo|nOGwcm5}Q+q!G7H&}1^{2jsUv-#<{7|7waxpK$F@AXOXAT4TX;MCM z_?j1&uRFNBnYes?>c$h0-`5=cLahI}2QvJ99XSW~-f(W}R4iHXaxAa4po<|ojkrH3 zaDBUR4AE08cG|hy|Jgz_mXME~5%p4TRs?ddMY1>NZ&20G@Nr*!JM~n$)^-hVy}sxi zs?z5bE9>@ea@Osiv2ZrNy1YWKE+6)?1(>ndu6<?WTKE^2&Z!2@tZzuEl9s-npoEEG z$2Sg!llGH<A#3+#-4oYs8voAsUB3{;WsWH&#_4yPx)fiP`491JBkv(I_B#L870tsr zfAKg@?mmqpaC|8Xp`K1UX2Tez!JZatQ|OhoWe}Z`==kYfTRI_TNzP2>#vS_W_JWV{ z7gq}kzig~1t;xnl^Ja=<x==d-Hsq^M+k^vvSVH2`Q6`-eX=sd18U0)0aVP!=tp)#f zN}k{OcNXua?<}4srQd>XjrTG8_2uR#!T6hd=0l7_=UCu1zKD1^xykWVK2vxYzdJH5 zs<3@pXm6huIT-LsvN_(0?%KDtGJUd1)4w}4#Y~B3AHIGp^YsQyD*RN+8<Hoy3iFog z9WTi*)Ij}R!Gg}^?M#ljKTmc$54L>c-|yKXe-XTywLZ$i{QI;lgkP&=5d#~V@EQSG zGnVO!8C|)(nL-6qhquiE-L^1Igh9C0%xl+80+_5c^9I3k4cOIRfSyV7J_9w2dkk+f zUOYq0Cn*j?f6Nc0;Rnz{zA)K#@u9dHcwjaSEuIh`7HL`>jAX<YrY9K5h()s5x@9#H zM!_X%k@4Ewjyobpu^4HJG!ypQv<d4&C@~nnWePp>a22o?A1?v$h`l|>>d(8Xd$9Ts z@lM@JZ6eNELYm_tr$~sxC7IGPW>+M*$eOVO{Kq-`_9R3=0B~$0IbajiBOH*R{yfY1 z9vW|0>yKL+V5EV=^yME>Y{uff%$vJ6CMPF*PCj=O*um-|TZNNZw7a=x6HMPPCw_6c zDvN!ds<n0}Kvn_B&TF45w)+rss$hK~j8l<tLOg|qy`7^wuiuOSq6ddfQtYUzumTy# zq6Lh$3f`#7JB%&LhY<n)uQR`vbC5E$P@_mR&{rR1wH%$4fYc3thtw8kHB>|+yWQeM z5X<^;kx;q#T0^*?C)?0P`NKo;aD$ZoGp54vmjL<ffFj`@@p+|?{c3lzS23$plj7Yi z);#e1qyrXkL~#8wjvsA{L}=uQHy-1zP@C{dZ^B$RD&?czl)tO_Tl7NBaih1IjJZ6U zzu>r<bmx$SGlOwAX+is-S46_lA&K4{t~dT0nWzaPktBtP)15MrTm?tlF$Gn9!dqa! zj{(v`ijwB>L5vsTQ<y8#J-k4Jnz2&xw+WXvVg}pZDDQZUqHn}r^BiJ4qFYugV)BW% z+M$!+lM6%so^hULMnF^bG;C14YUv!z*A_To$;%=k{7P0!v)gC<Fxj_ZRlAJ)<ZjSL z#VXfMv|Ho1*8E{)!>sjI&le}XyP7im9^)cM1w?$qL<Cm`Em18J#u)(p#}l-k`|!I{ za!`miJSf~dDK8HHQfrWFZC4hTTgAsSTt>#%6*U6TVe(U7!~Kv4PB%J_DDP)|adV>b zw|%ZRVC=fuq0?GZ_{C4bt`uT}nZ%SL&Yw?80hF&Ve%>fGpNyqMPmKxv^UPaOKGSin z80B%BSd3wna}2bD3&T}R3?t?o#&h1oxSh=;6f{Jb_~w%mu)YHNEr)rJ&J169PaE4> z$W_;NL8<9c_N_MDgX<c7^{->%eAd#U`Mon<Ietvgt-+zeF|?MLmO{ggYwi#AEMYcC z96_W*9dh49{k{pmzDO6M{2&ucfQ3>&9h<4iO|M3ugxM#8&)d`YU(|8Z@*j3f_*7>Y zB`gv|=F?cBuk^)8b+jHB60(f#N6UI83at`_FzSll*3wE(oa(Iv1+8sJP*0e}gq0h_ z&$p4?0%7y<vlxCyzNJl*panfD#HCVO%29}S%WeQIb2L7fR@zE|I4q7@1xIaKvKBAa z<BZnmVzNw#({>GvJ2}y6c5a!g(K5Ydo@Rd+$a+S>TmTTne9ig@kQW3XU!W0H&as1p zGSr0{-yALq+F`NiaEjF-5sbo;pdCyKr&=A_f>AgvXa|!*QUfg{mBtRyc)AAdgw3Um zxLqr0fTteL@X}rw(Iq*+QZMC&k(ngF0g9iDb)z7+ba#y4JI8tT?M`FxeD1S-D!7~Y zEsyRg5s~aY+J=XeX7Zq^pO?SuJMa3A+jsbK0jE5=UM8jT&ot}7E+3W_HqF=tAc=dO z|5=8sXX)1UyY}|3y?NRj0Gy>YG0HQat>l@{<_iSfTn6457PWN0Ls}%_-HUO`|L~Dv z`7@#%66NEf92Vs^jh7>$yh)UsM7bc!&7%A%QI3l8_cZ<{0(G*f|HTP2%tQZUnybHa z9;x#h0zmQcdMI2Ij~A9sHx~7y9Q9BzZQ?xjO`m}U@fXbFHK9|G!ksny2NJ<mY$92M z|N7%+^4zR!3i&qn!_p+~a+>a#XEkj~+L&+@jUI!ND7jAO%ajr+Psf!hEvQLpF5NXb zTSKR#ooMz=Q6a^7^3}7nq<E8hGuC3eIWwFImxt+uOfya*yeVS75#MxlaOcB^AKCbO zhYug77qmT0zK<UQ?`a3bzx#_LCDu7UoPn)voRx}|0sI-npFPajol958n9-BTWyh+_ z=*pC^$e&^{I*a)t{Mk8Xq>KB_rd%N->hW^dSZ?IzLZ(vT#ZCFrn860;Oq|8^%k`V0 z8#jY982ryLeZyEEp+Ef5O4{51FnM2yoiPXZI$%RB=TPi|UCz1uqOIjUTw>>G$!<>* z!k+DQdjh2kYan=BAOP_5IiYDHdLl3)PYjEAAhn$qEv#j^wqY^IwAT3`MAfoF<4^6$ zFFdjwOBcv45J2+sw_OEVDS#fAfFAb)dO`wv!V^eN5MGECuq;}oIYec9nJqJDxkzo{ zLbQY@_R=P`)!GJHbFG;Pa+ij@h=8t-s#aGIrK6=b?kD~1sDU(|3MiwQ(AZs<#x!xm zV*2}*QEjGhxQZiLqa|tCa}gbSSgS#O%f%YC$|okt=e|$o$`4qrFyYq_{F<8Z_~%I~ z9Ocw5WU!Qk-ujc!8JlX-I^TpoiqJ>vQF@9ByA?`LVc(~MQreBsyK7Pcz>77j5=424 z)=$2AwnlyANyijD|Ca8JEr^460szW!t<|i9wol^9uSXoTJ&J`x8ZSJBh2Io!y4;P0 zXTzB3Lv3Q|I}u)5L#3}b!HE98S)MHX18u#@!pF6|qD;`)!pC1u*mTj(qC+?hSl`Kg zR()~RC;Bb7!C3^v_t~b}b8X-`cFN+KxtLCZcs>^K6i?v6))!N~!JY)`3N{*3e1{MJ zoYt2?#J4rvAnTgBxEkn$4HM7u&^zUP(~ox36i<|k2c@D2;T)~OtNq#NVnH$Z35n4? z{YyE5_wqlN@kP+D-dg{1GaVYnYwLLoej|S_9l^hxkllo@IcT{;L#S?nJ}WlJ97qQs z1)$gNKkU)JN9{lC-`{ZcPq^tD3V_sq#G}89{)nr8Gl~VPC|Pj)Z999g11moI2Jd|3 zJ&WnMIqc;%7Fo_T<GRd96*l9m@%<|i*z@53-f5CpF9%8B|K9lx6Qm9Qmq2cJfJ9l# zI*rq@Z)CROEBB#gy~feYcRzW{290BtZ+^xo)p4Z;-N?QdX-T?Ox`7uLX!LzZ0NJRS zbtcGq8-!z7uK^;SJK3N?2Yz{#2Fw!V5-09ctd1KkkW-u>ODyv1G(c1X_i0Y1PPIDP zLo-3v*&s0$w>g9+ybV2%1D?VEtg~55bjv9*5pm{ou%-OZdI?&}StU~TGh<iYb1v)3 zRjNi|1XDvH7GBOm!kkuHhP4J?;B_)Bt4)i95Q5JBx6z$CXGNUXBt%WZ1d%GdZ>bYh ztAJ`XyGa!!u{JKiHq@XS%auoNVx772NFGJj!iwcwHdhcXST@qR@d`6K^SKfm&E@kv zO@>!IEtby}GCbdww~}aiD`{r*<&8py?Q2F-n>0*{y`Qc(Ywph&w9`(tQ%U=GY1Rqt z9_w7aUZRAONF>^2-0NMfMaS?iX(>r}h4B1C0%`qnS<6+YtnAtqUyoL~MI+2%gtvF+ z?mH!k^?1?EL3=dkgobsUylE@{vss<XpzhbiEef!VQTh8L_sgGc{T=JGt#9BHQ4mYP zTdpy~kPw7$i)+jn#HZtH%)sM083V?LyfD_rWYhD+*xzuBd|_~f)!Qzp6Mu~9k69+N z-tSIP2n~P?=4JfGg#H-5W0-53-$mS}*)_JicGOkaIhv%f6(L~#a%*$o(APFiy|)JD zgnzb>8!FQB?66SjP*2z9GScQFWWM#;%|@3O8(#1W75D%acW%fnl9>)Th)9EoWQHRS zAW=_|%+~^1i7JEIKGhJB1d%}vHl`~Q?qZ&+_!?UPTw=Fu$4KD385MccwMf6`Mus<V zU|Q2z%wAZoW?^e35E3_pB8Gj}r`h1MS5(|HV#cn6r3`DbLHM-R6vgP1lA{lldzEsZ zQr@AI`<3!exh$q}{2PY9{QYWQVQM`s<~!)I&QwIhJ5Z4@gfNXZHz|x}VLXcr>L74y zbwGC&Qsy=WPmAlLG#9UCj@1u6OTqKky%TK?o+FVMO8-peSPR)5VtBw31{H}Q*ln7* zpy8}1#E|}&sr6GDlC(~uA@zC;={?M`=2JP`Avg>;kSCbAc;gJWO^sn`?MDpvIT*fw zW;&=fLUhVqVt#|mYbgOepYe3`byT_!S0SfsxR%<j2^9Phy#Z^{wA+2={T6=0b3k5B zsb#eXjWf;!?g8{<yxwim8Ng#9hv_u9$xhQOU?<7!deYy3&>xR#;KhT=nq<&IK#P)Z zg@huw5{U3`V8$TQ<iGT|Q(i0n18QlfHgOhokxskYm(7t-Bx+g!p66(_wzs<_A<+9V zg^9tHFncRv>-^0TEqi$W=0|Mm1ikRPnD8Tb%gH9lP_BPKo)nfuma+^jPEQ-{fOTXq z2TEAUfnEiu-v+YT=u?1p63_)K60LD3oW>fCX!bk6WlwkVXAUyn?cBmT8FWE;awtPJ zqZN}Oi%NPTec4+_hFCw$rZmf1Gpsei8e6PgBVCG(p>pIxs+CV)(Db{OzM4rVD$b)b zU)Rfv$Q#VUR`D39SY=)BT<~4*T)bQ#XdQjS3~@Z}#&Lra#|?FHJmDV8lyHEG+E1cT z>JRAT2&K+gz;NEjt^7uhJ^g=z{PdAQ)>q6Q%oYpamr>IlD-Cc*{#H(M#|N~T3DV3V z3^}twDOs;xZKjgF+G=P#NOplA3$W7qXLHVnIIwuR_5IAjc~~3{P?(mgWqzgV>9e}h zz5VH%blX6hb!9Ro+YWTe4#d&78Jojc1Q(+>*~=Yzv4u}o#wE&qv<kh+k_*og&s3^m z<>pkcBCFygH(}E#U6%SjZdgy9{=&wkA9-a*+_Z1OtIiMpwiv=a$r%=gk;<^<vdWG? zM)iYGV|;1Y85W0~VR5)_SPbYS@3{3hiU-wJX2MHt*}s#tXRLSco1nJAi-C10o;K&L eV4gNQ`s&8)=;)~IX(NiKMcGww`Tqea@e=8KW1x!w literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/cls3.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/cls3.swf new file mode 100644 index 0000000000000000000000000000000000000000..fc3e6ff2fbc7e6099b3de04242a939a57c3349c0 GIT binary patch literal 10616 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 SmNu+eS{=I#9{&xZJ@M;*j?ORu literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clst.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/clst.swf new file mode 100644 index 0000000000000000000000000000000000000000..ae3c3682a2430485c3bde06d1921e1e21c8c5351 GIT binary patch literal 8486 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 U@6nuB`@0&*neg}j0Wk!*1jr?+Y5)KL literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/cnno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/cnno.swf new file mode 100644 index 0000000000000000000000000000000000000000..2e1c6e7c183fae1495d8fa897c6edee66c3ec4d7 GIT binary patch literal 7450 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 YH=tb##yxsopzr)nasmAQA3p1EyR_M&f&c&j literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/dono.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/dono.swf new file mode 100644 index 0000000000000000000000000000000000000000..dabe0a8010a3c9ee154ab2e338b074dee7715738 GIT binary patch literal 6615 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 VDiHtZidgS^TF5!@`y2d{!qK|ews-&l literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/lnno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/lnno.swf new file mode 100644 index 0000000000000000000000000000000000000000..65cf9553faa400952da4ab3118342d7bda7bcbe2 GIT binary patch literal 9111 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 V1^pf_H}zf6&Mt(%{|_Ccd=Pe!+xGwf literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/mxno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/mxno.swf new file mode 100644 index 0000000000000000000000000000000000000000..82500fb0d8cbc81cd814f202bc2d74d1b7487e3f GIT binary patch literal 10229 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/pi3d.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/pi3d.swf new file mode 100644 index 0000000000000000000000000000000000000000..7a4c1174c7dd2dfea73049e4b51a06eaaf0f9b3e GIT binary patch literal 9222 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 literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/piim.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/piim.swf new file mode 100644 index 0000000000000000000000000000000000000000..e232d176283a5a5614eae1f9ed24df964c1179b8 GIT binary patch literal 5572 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 S_=-mVhvRG${QeJNd?a6<`20!$ literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/pino.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/pino.swf new file mode 100644 index 0000000000000000000000000000000000000000..94fbcdcc11703aa53755267b6d506708e192d156 GIT binary patch literal 6814 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 ME8+LQ0VB_XY}KJo`~Uy| literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/pono.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/pono.swf new file mode 100644 index 0000000000000000000000000000000000000000..7f872a900505feaee51b431e5080166bcc46a2c5 GIT binary patch literal 8529 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 L1Kj@sX`pyP!I;yo literal 0 HcmV?d00001 diff --git a/modules/graphxmlswfcharts/xml_swf_charts/charts_library/scno.swf b/modules/graphxmlswfcharts/xml_swf_charts/charts_library/scno.swf new file mode 100644 index 0000000000000000000000000000000000000000..f8d22a4e2ea0f9979ab298b1e5c98673563be5d0 GIT binary patch literal 8069 zcmV;0A9~<JS5pYip8x=Oob5dem>fl!)$`cx&F&^)NwSd4#)Jh0A(#Y20mG1NV3NCJ zHg19@!DHy`%+8LPompmPlT8#~=L?VH5xIpmJfb23ib_0{)2QGbD!wqHccPwvFFZUS zcWQ)Fv-em1)!p^z?&;l~4fx2HZ>PKJufP6x{Z(DnJxXFfAf)v^LfQ<n_BaCndLk1O z6Qn5_ea~%#y#1xKPBJpXRwY-ek^Jh>LN&9?DvspHP@zPuHC8o8@;!rArIxAW`fFql z8O#;(gEg|zstporN0kg&qoh(EDP?WAqO~JeB*W!up;joD$Y3FxBi2BnSj$zaB$caW zF6P(P7U(ofR#z(49#SRwzVhxWDFB*svC5IHwQ3eYdPY}}JuArQO0s7q86K$)l47ou z2O9EgbHng6WL0-&R%A$jC1=%g7Yz;9_G~QgD&%^Kg<;Z9|8OSHv>`{y?m`w?R?0Pt zQ3^B`GyUaaxq_Egad^-o#X>2^OWCDRS{p3%?=0o2RnlLslya3!t>|1;?5iE_RgtW% zSiAeE9IXx3o?M0GE7tHJC1!OtizPOd1pBdX9YEfHHCNjRe31O+T&0k!W^$v$#WEH2 z7KbLTj^Rpffb7WS3nh?yk(c&3{A{l6Ddx!VDA#>I2rpl*>><N@$WVD#ZcCX#!4Ig4 zA+R;M8&q5<)iTw>-kg0oXbtB`^@<Uo*<sZx<%@XNQ>gUAB{hi5-dqJRGfM$cFoOX) z3!@~P>n{vhpa&q+zNrGcAP1`kG;gj|3Z;Cer#v(SQWzPaZO&Li`bR2Ns4bMTxzXMM zj&lY7T}f)?a<K+BP|FR0HGn`t($)^(4<u78?*>~MsF4aY?EDshL7S@W0d{J+(He-I z{gOcte<5EYyZG-=A)5u3&^(wV2Fl<^JIci@V;Nc7QLfd>LqNnZsaV;<NR<=`bVr+k z_3Z|oAobZo6~xsK9=D-T+R1FcRIcT~0V*r#pOv;wS!u}{%CY(k$cd7hrlrifu~ag6 zxd`uS)c-QJKiGA0Dc)(-PL1mWc#r1UPpZ2ulp-jvTr6Zk2$d{#3;?g9Y{0Gvseomc zOG{SR7b{5>)C_LsMxtshH(V8q9U~p0CJzQN1d0aP(U=95#eN!;@WLWJ@UyW{+6ZBa zq01C0q>TdaxEE2c%H*wKvcsyd-~1Y;InAe#7p_-91Ovq~s4>3*tjTRdZA*a3_wcSa z4_p0U%AoaKq#x1dN!8kw%VtoY`CJX{Fu%FKQl_p~f!>NNOw`K!0)W<+&}>$7@Jfz) zt{eT3=q=QK9my4Qc^Z4G!^J{BHyVcq$!?s|QZ5f+a+e(dF}^#uPA$5EQ;WA;Z23wd zn*p~{#mUNdk^IKOXf6w*07=nkCtDnkPiQ_v)~m}EL8ho!tSgkNbi^r-)YvaNdoD|? z%{AzYSQh~<Y>%{o%}BUPAg68Mnj@teufyvC#k0*RqD?J(BooF>KKxls+-0z;5+7Z% z1uI`JL1Y^lcCWML-4IN26(AjJoNHFIsa&)wTgsbgbS2fn^6m^9l{fFCW14Nj$TlT= zD-yX?iRGN6Ds8oU1%^3+;oU1iNQEK|PZ>=$wTe~Z19_<o{%Q>m7x##zRu7X-KaIyA zS+`~xL^JSw2(j6b3W|UUGDpKY*e=OmylFGxMtsp|u73ogS7ukCTG#;*6&<XKZi#~* z+2Zz!v4(mYGh@I4`o^e&B?5)n0?l0L75M8Q_;xk7mHpi&QtL?GMw(eO0^VJ+Z(qrB z1%87(4-|3`=IOYAl{-d?#axYzm#lOhW=gzGbyKdwLLR@T*VK|LFfxNnkikt>Hk+jZ zVQ@W_5?B-2<&^Dm$}HND3mpek+fPuI85qiY2L>RNZ6%pK_VqR#Q!-gPsIW}VmUKV* z1^ncO38WFAWk5X)UdXb#Ty`~e?#(O)TM$TBQcr@Lm1O@c?x=)(<<zkVF-d~{HPZBN zBt6zbnh5{5uA}3Y2w6tPV#JJcxEO<rr`?uV(v(hhjYr5>SYVHyn@O_)y_(Ie*z8k5 zTGD!>)^;6tTdRU<R$rG3)ykmS*x&Z`jKd|2=-DoS-5d+%K=XED&UNHs9(Q3Ez?dBj zis9}^xIG-7UPrN#7=@YF9I;{M2{7{!W|`p@El4AxG>45N5lC-mddwh^^&P(864YFZ z`;&~T6GCDK&=Z3(1H{7c$QA`7gBCG5sc}R-mq91`I>CrK8RhdhW-32sTc13t7yHO{ zBr<byjWFCuFaGUH%ScZ^@DN~OiOe5Idwv@UL>XS&z4h<}n?i7NxL+7f01LwlU|mQ7 zgtXAQ0thzWUQhe1{E-%S0Q4q$`{eKI$B2DPc@Z>R%&QisH@ywo^o}(VD19C@OHnV0 zxB+QNUnf+WOU;vLC2QO*#lUXHLtKr*P<FCZb}}n#QsU>>8e*Q}2D|6GmoI3}(w|e^ zlGEJF7rK|HOBhdQy__MHox#eMNoC7e*_l$=nM^Npq)>tNFG3+KH&;+0bOp#UM&-CX zp$Ks$w1@JupeB{LAwoJ9c^M-&3U+@swdyDi882cX>cx)y&#BXrSqxW~&Bsetb*g6Z z(li=lp7ybj^>Hq*I*(PoFilPCe9sycO^0CiZS;~VuboNi+=MvJv)-1+#!hsLoC_4$ z`9La=opHtYGPMi0_m^=dl4;%*w2ac0s~DC#L*h*{I3%88P`O>8`by~j9KfWVeyBw) zUO-xoa&o#2EEY()a59OK4|`6%p%XRP#Hq`F^z98l`hIH$Rk*|O40q3-3biQvY^#u7 zT*wM9aAV$Tj5Tpq-tCsJS=EUy(VgH18OIAv{~briTHUZ<_F%)c{&7!FqU-wpHS=fA za2Cx+0Jn)pu)RnMsTT{uR;^Ld_yt?RSVNd5CL<jQHBoH!uUr`1uw63JnIU0OK*JN$ zt!+~$J_s*{ACFp=zxuTb<BRb`t8M!2jv03+TH8{+{#`B#6wai&WG+fO`)j1D8|g06 zGnu7P7aH9)m8O{>y;?T_038H#!ftx=2mv2o9+86EWKx{DLavmZY-1+@<*Yb=<My>} z6s>3#S}B<4EVtM7Z2r6?Qa_cOG^tL<QQIw?oNkiz>I0Ghk@9Spk_N2s{iUYZU#rxg zGVXzdKSQ1y_Tq#L7Ad+D=%#U}f=!xCx0k<R_JOX@EewTDbcv%mwdQ>xwCIqs8>QCG z-9Y`Xn+T#-LWYFj6G9Iv>)81H^I2{c#<;(&A6bRauzoI^xNV)~+enU}8+h^nZC0|J zbEDLGI<1n^tCeihN?tyR_}z?4WE{G$FQp>ejPZ7hR*_C?Mbjj1GBnYg=?o%Dtd5+! zKuzW)VzMZ%(Y~UO!cV|I7TnKgx_ISZbrDV%R9IWhjR~rh7J{OKyO5l36IMJ>rCY-_ z>l%v^b9;pL6F1n{3o5=ego^2i{2&dk(ATR%!tXN>{_jG<k46ywvXJnXL=ip{68`)c z2)idvSEsg{mz$R-*g90#SQ|xRnH$Wd<_?e<(^r2A<(P6JIAHoBi~m9>$AS)sw$0Z8 zDzgcHvgRujfYr>Imzo1+-aK2P?QAw&3`%8#tgIlF71CpKqy@iMOVzJtO?FCUJLOe5 zVO6czM=kB*SOb}-tg_Ki8lQP0QdcTN&mE~Ok2Xpw5haD;!bsH<M(MdDjPA(Pg;B>M zCgV7n=a%EN8&i~uuSHBo7?(Y_gn?=5_5|i(bPPJ4U<SOMuez@_XD8S!xijQAZc<T} z&0(G@UqL0)O3VtQ0wl4O6<5Wkw4lZlbCc-LAx0SPL|-Q&-zDeaLD=FR*mgVE!i~_Q z!U%nCgks-Qw;2HK<v_1VQ+s=@d8G)Um>2-OPBcjNSW2C2G<opydVIp7Hhn`tUp~*d z-ss=tFZk&ffCmbug|~Q95D@&n1aWCAzT2LnwSJ3p{&fq};==5F=V5=I&Eu|%@jBl} zo_`-?3UB@kS9%@Uy~RUz{7L6qndEMWkl9gs`)1FFk>aY^+tTvV8e2st5){PFw>uEM zbyl4e^lulYIH8xI6#A4^sJcrD{zfaV3^!nHQZ4Ha@E36(NCVbt)g`ZK2xZZ;CzORV zBovSJJZaa)CEsTWfdjy%%9VtRlkeO(K<MMFtK7#~R|zouan=w^SKb6wLe#BLuXD!i zvxqW8(wU|mw)J-K`wsNxt7wN}wB9>Giz@)f_()CYT9NklZNR5q%tWFIRc7&Yegkg) z^9As*B*yhF#?n9Vx~tP;^GWkcDIzfTbd=tUi=MrAGuLl%W86RXb?#rnwvuMp7Fc5F zn_geC&PB6;M-^#>kUd|PcaC)krqXG~8R<QAF{9J$7H^JK%{BZ6G~WsrYkDPW=X2S1 z0@1Mx9a;B`&Gj!^=u!4`QYeF|L1%NbavxRhP31nK+{d*(9vAyyyj@$5w@46gZ60N( zXl3K$?H9gle0)5Jw*cBbc{lv;8DH1=@C9CSykd?*)qJ-~uu%sNAg-6(dtaI@_PtXI zhqMqew!_>)+`!uFmXCOqqpNwPS?b<et%a6^)or1rXmwj?30y!6TR!#x!=h9tkpLi; z?_-rhyJWp~N$+;p-wn<)$A6-Wf^qtoai5_=Mck(hi)4ym6p9F`l|JbDw`&P(r%}N8 zS}J1!5w|E{z0_95<W0~}F_!Rn6y~-8a^}f{skraMRt+YXCBhMULPgTv<(~ORo8Cuz z%GtKbM##zp{CP`|MwV+f5@}AZnWIP*aNZa<dI8xyO@=qd168MY(9-<Cr++n}b#Rkk z2RG3UAj*u3^91bYCQU9kY9(H>^KhJIoZy@9TGgczu+JP%Ae2UQgjYrMsuo_=lJ3QY z9x$!_vT6Al4w^?7TJ32}Ao~+)^}Iw{R`zFvbSN3hKa)ZJne_M1WRQO*{r%HFqt*N~ zDfwq|3jUc4>7U6^{+aag&wwPoP4A<we`*?8uEk=_Ka+m`ne^~aO?7$)ntvw!{4=Te zXGE3$O`2S8)JnW$r%TS;Ka>9cne_M1q_2P8JZ1m9d2;@F3uEh6<tUQkNw+Xhy4A~* zoc4SdUS1uyZ(*vul~ro(ZmZYsHnrXHX?r53`8!g1n?@zDet?6#oAvr02S>Y-%DlHv zXmq>O=zZZD-Jxbz4tew4QxEOEl(+Z0^I3$r({+Y6LLchh6`|_-8hZ+V7YAA_W|@oC zSaT=q@a{gRE3SF0{Q#@|U|I`3SaA;zJ?F?9ZssMFrLhmO(_$ZXS2CGZ-91q!zI`Mu z80#}ct>6#aE%tZ&`VH)?SZ5&AhEPzQp`h*!1$A&eKc#0&WS)A|0ULeP70%1MBr*N; zsB0|RvLbu*eW$vfD5?qSKj^fQGj;geo@NT%^5S}Z{Ij~=8>8#JANz}6>t!x<Lxi+9 z(aVqdEZKUW-&E^clqFqus%l=O9vUSMBJCefkF%|mO7SPWQp)<+?(@d>FKNe?=@Rlu z9t+Iwx>CSWFpoVcwW?dF3SKu2z@U`SRV!t?qJm2)kv7iGFjkFQ?+uP`h=$$q>p%IM z?$%z#4xFdJ+YGh#6B=cICU&Fmkeqt6Fq+rB(iQuVCiahOwA?pUv4^90^|Yk&r{#pW zzrks!pQdrpev+a6R9f2zf4$+G{_GdC^n!uTZqK8=+;qymtPyGnE$>XLwP$N3gIdX_ zG%@=Mo}Q}+rBy#Sog`-Msf3hhz3!;n<dC1%di}L_v#7Nf_@0EjS=VDj&VVSi`zi8} zrpQB@A`eYgk@{YA1jVy#0W!b;D4n)^Iudk3nB|{WdptA0+<|m^KVG<=k7vDT!?u*@ zS1D0lDY0>?OY-#3tnz-QFXYjSRqwx=Q9vIAHq*UJ2JwGPnIa*u+Z#nbt3G6Oo+cjf zpGZlO<dUXi6G`r8We>>CvjMk=b*f;WOVf%(L@jS~RsjE%t^hudp9=andXwch57L{v z=-Ob5L1(w0SCgIF)9%47HmmxAN}_EaZuht2CizbgPmEf_R<UKP)XDAc3IN5Jn?A<+ zWE1uIu6&vZ5qvT2p{%gJ?i;kfkeF_KhQFW34Khl|P^f)KHZ9%Uoz;wWb9H-T8=cN$ zDfE}z)oFW(X|Pj34EVAe1HPP4$@vOjLb;o55Bw_6p1zdOgk*y|gtj9>DfHKo`d4+S z$MJyev*UjcP1XM%YPkP}!&sl}Q2zHd&Ho+>?|&XjoV@?}BJuV=VCl<XYizVR=a13| zzV8`&JMJ4zZ2t1f!h&6{EG*avm{E@>G(T5dS+`ndvGyA!gz@!u*C-IPlNqoT&xc)i z)|2^AqwD*ckIm@%^|X!Onfxu14s<yHR6SQpRoF*b>$O)a*`$@=p(mHSfD=yGfSquH z?Cx-+ORf5b6I>n{uum@mnct*0FE{Y!TlD7I2;TfVz1bfHhVF=s%>taJMK|B527DYI zKWJV?h_uG~AAKCa+sEzV*09Se5e&{AyY)8;M;F}FEry+R$K2iehMjiD+}-+ER$$L1 zPHBE*Vq(JCsgG6iPJJxHo%*whzD$Wb^{=0f#2O>0;9lbCx}q#iQ<Svh28i<FXn-ii zvoF(@7(Wr>d1z>(=LxE*3FeN**x0g2fM6OZk3d7Yv;l^)y)lN;WgKHesp~=csSC#Y z=+M-KgOUHR$I+p~&e5TV6TLXlNP9rlapc=+9OxI))XpW5BZ}zH9M?Qe)%>V1n1@=; zncwuRt>$=6rq$~2;H2h=p;j~`iw~Ni9#Asm19Hyolf@sH!o2(dCfHM$MXNN{?_}m@ z(L7oATR8J*@p-4k)aS>xQ3uSAxhc(K^W*OZSiIMaxgn+>cFKGOn=*fo%kaAilur05 z^Y=8_doDh&n{m(bo_o%SXL(Lt!+2IW8tZp5^YdfwS-N)XdDi!Q7OS0^Z&{xCe&gAj z`F>|IGv5QQ0Y%iAuQC`46XE1!Cc@HS`4HO*@n}Ljy>Uq3_CNh*v4>RvcNTltB`qS) zVw2h|HmS{Glfo?49kl~yu}NnZJ5I}xf@`{tbtVul9TeW_A>j?0X}?sQX%lg#{hbJ~ z{82X9*$z4Ey?COy{#-G}&m7mA?+H>qfRFdsNhz-!_ORzHFzJ!QCOvZ4q?FuC6Y8W# z{+bMxzrI!#jLr6>nYye2Oi5GQsWbKdh{BZL+dihKyZkiSyrVI?yWj9;Gc`RWPM5pw zjZxwcNIfM^n!8J<XQJM7$EkA|=Cu<K<7+1#g)wMT7axn1u=ss^>@kOUjDXGnzxWxq znX{)?-4Jj#>;5qn%y;WAMU34(CXb{dg2(;(c|ryA>E{PRKTr7g^B%pQCxR2SciYO= zF)4%6G&b?T&l8h)n4u$l3>QY6Z9IO{C8Yg_x)eS&H7WcsgcPR7a)bEuvf3X`*J?ei z$;)c}chiToS`RNgI5mB}FTB-yXh+v%+|iB>T31aTPXFzxvGsU^**aPGvmj1ATKh52 zHojb*5O%!$h_%7pOFza}mHZ^Z<}@E}qIU75U>7G4^QY#2nNOh&{Y;&?BC7uu2>N-t zO*@O~coJjfNsvbiF@Is+seA$j5&V)NOUT>5DHp$@M~P;Vo~y&sbG1v)B#u|K8ES=c z*degGb3NOuejk}B5yYqnJi7md$H!_^$*}Cevn?hJOjP2y|1Du7AQJpP&MfMG#a9&H zOK%>d>pS-t^>=&S%U??2z<9ir;&k>d#$O{Nzgg8u?{>I%F?_WIqw>&%hz{U>E5SVp za#PuOs-E1tq<v-Q&@+B_81<>XjMV48K4(t9hbAOOuaX$8+ff(Mh2fz75@qR;5Q_K{ zV+oD(Nqx=bJTeVq2=%U&6G9lskL$l{<)dUQ!DEN>{)xuLk0u&FuGIPu6+FDi7Q%+3 z)QJ3!mxqNYa)jag9sA2aYxacvQuC+9{ptw*j6DXjt&`2Tb@C?(dUJb(zR&Le%-@@T zkeY~t?-4%u3hx~R^8P5*#x?jR5x$8k<fuXvL-UkW2&UBTp{yg5RTdlQ4zgE%gc#@! zPHCVk1P^q0Uhl=mpQU_*N6}!hPkIy`73?3+A>PC9_&LP8gh~7yX(#ku3GJN(`^@VT z+Ck`j<~tL;`xl5`u{7+@Krb<n<mKqQUXh3QeS`(48jWo+`a(#EUrhNEpv-7OR+62a zN=o`skdmgA@hnex(N1B#UUsP{%a?Pmt^ISvuX_^me)~Y;Y|=suuh-7R{C4Lb^gV%! zPP*2$SoNWTpwuJMD{UN)3wU|V5$UX{<8yUeoUHnA-4;!%7yGqnBQ1t2Ji9bbS|Wxs zZVHF3*;jX*q0@<4Q3}tWbM7?8&cwYW2hDC*Ephkq<mRmrwsv<0uH9ij3mi99Us2SV z_F8^M*5tLlBlZkaSlh!g-?crgme=;MEO2d4*Z=~|N5SjiCuXEwffxoZ+MQ&_ie_5o z*{E0DP7+{#V$9lmRFc1zO+82?yMVu^X%YTZt>lGT$qTfS=L;nVy+#dv+)+yOu?Brd z`vA#jXG?&<Y8(aEWH2U^Hj{BCUq|@3#RlK*rAxipNVlcv`zX!}Z2pI2P;-?7%$O$D zOQ(`e(qbC;S||Dz0iiq7@RkuLAkM#p;r~8{D8(VaQmVtFTNzsRSdmhPB&-yIL5ol< zVbhnyG@+<$DaxE>xR2j)^TN5Z)!OkdM02h0CZX>ZBkk$5RF(CK>eGm7nl9d6wN|$4 zw;D7!w;DpC7?3xjZWyT#5MHAnLk#&z$d#c!2??QE{}QBVi>+)@dM+O?qLi5gg0bpZ zgql{X0r&EQj8i7+=@D^-P}}N2wS_^W+0>s}2=$B=%);gqYGG}Hg@Nz~m{!{SLzAft za^eOXU4E^e-P140K`-rMyp7Uc-H)$w73uWOmg&8M(L37+v==}B3`=^8OgfC@b38`! zX8f7WxByD$8rnkv85eWIGl^$Xs1wFEcDyDubRCP*nDvp7yFV)xHUPCZdn%oAdjauG zn!V_cQVB97?FQWh2iy;bZyoGC{;D<<mh~9T)>h&2IAZ{x=f+`90a2UYoo)b?kF(EF zRJ;uYa<sF~`dRWU_~#t=1(OPXyMgv?FLAxV>!sEhP%8X=H@M}nl8|-{@R^y<m%XS{ zb=Xd|I4vo;6)AAfxu;l?aJ<1cm-z8b$ZuFWg^Aa<gQVmN=D9eO2@kmrst>v9>E~Ql z=Bgk<9QD}Cdu@`Dq`ctu2ULyLmvj;xQOyItqMBQ5%z(KD*p2Hip@1B5p`4V_aK`PL zkSX*r-{4!8@T)UUiv?8V?rkTIy$9JL^bxkqZnd0Xs9(@9Po^Q0x>u7o(J&RRx>Mnr z<Y7KbYwpKHpdW1x4x`<PM%*xeF)7CF;4}%!y{L=Q1t5pKCOT};kz-SrJ%os(5x&Pt z8McHC=2Wt)NciFVIO32WrD;JTB`33wK7Gx_q{k}uZ!DBHTBBest#^~CwYioXu9Aoa zr6gw2ia5QdfTW4uv#VLw+QLw-RHaLWzncR*$7Z?d5cCX_yoCn7W^bImR1XU<O2PFa zUa3E`iIJFLKN5L^K_!0`v`pAfL|8R{8q#Or?E*fgq!Gqmn!#@;H<4Jx7Y0Ap!QNo+ z3j?ESgub^X=DrA($@fHph4Vi2%j8E=PwZ`DfcSn)R`J_Yf0aD#Ro8wFE5`Uo;^Lj* zh>rQfpeZEl5glVh$0Rah4jE1E`}Lz#9SN4kj31RAz3im7v3RVB_4s;Y%=yrrB#w0* zG{ZQHZhMc>9_{k=wD<#BG5b30d+F2OWo#yy5X~7ZDZ(OSp1%*)DQHJAHqi#~A1VCW z1cVv@kX9iO5R#t=g@Z0wdt6#=X8d*;eXdpr(+VKFmDsmU^!8ffP2G`+iHUW`o;tSU zA8a|sd~B}JcM3JDzZkbw5_^ZLwYf4tzC*S0xokJW0z$*yI9Oza#>!Zfots$4j36d+ zXZGbeal8e>CfH7-aTS&$qr=Q%!yHd^Y4VQJ8tGvy6Z|`fU(G4BXQ*M7e4VPTOHs=M z69SO7b4sX-k^mJk&fe%y!aK|RQPHka@nA!!XzSuGisu#Dq772|uZaqW=W%={TCpe- z{~7YTlc~M(5pCT5)VDMKd~QO51spM&rHrs?ON?<&@wT<v0XV4RW!@d5Zq%M1@b3BR zhQCG6H>9V`<B3+yvza|ZjlS~8of(Y#c}Cba)GK09Xpo@Z9j(XzW%klqly;I}A!4yC z6Twv|w_TG^)pgziyNw1&2Pu^_#s|(X#HT1KQfDs|Q`1%|{Trug6(7MiHp)AG$)az} zO}6$DjOdQlrtA@TrmZ$}4198a#NRVcHS7pzs~!`NsAlO1=4%TP^)2qPNH6u7CA!b} zVR9e-s&?7tvqVH~lqcAfne$~?Ia7})CBrWDR?j^X-c4;89wsPqs(_epn251?;8G(N zW#18u`heDRAAH~`28E>!4+_^#h{@qMjRv{aMkTqlpIK=}hIvIm02*h0>T9@Hdf?R2 zc|>_X>uYmn3cj|FdIQ2<5ga<5oWd`Da&m<b8_pyq6>;vL5CSOX7r$+knvX>)u`Xah z{{Zn;l+SP+6r()09&jFBB=f*#by2u#<!rRdY<$+6jW?3%go1_$bL==`?gP>z(5?l> TJ-Qgwb3rq?5Ptt3X+pHPU*zA% literal 0 HcmV?d00001 diff --git a/modules/gridhtml/config.xml b/modules/gridhtml/config.xml new file mode 100755 index 000000000..28c3f680e --- /dev/null +++ b/modules/gridhtml/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>gridhtml</name> + <displayName><![CDATA[Simple HTML table display]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[administration]]></tab> + <is_configurable>0</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/gridhtml/de.php b/modules/gridhtml/de.php new file mode 100644 index 000000000..9dbee4fc8 --- /dev/null +++ b/modules/gridhtml/de.php @@ -0,0 +1,7 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gridhtml}prestashop>gridhtml_cf6b972204ee563b4e5691b293e931b6'] = 'Einfache HTML-Tabellenanzeige'; + +?> \ No newline at end of file diff --git a/modules/gridhtml/en.php b/modules/gridhtml/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/gridhtml/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/gridhtml/es.php b/modules/gridhtml/es.php new file mode 100644 index 000000000..35d118412 --- /dev/null +++ b/modules/gridhtml/es.php @@ -0,0 +1,5 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gridhtml}prestashop>gridhtml_cf6b972204ee563b4e5691b293e931b6'] = 'Mostrar HTML simple'; diff --git a/modules/gridhtml/fr.php b/modules/gridhtml/fr.php new file mode 100644 index 000000000..780a9cdb7 --- /dev/null +++ b/modules/gridhtml/fr.php @@ -0,0 +1,5 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gridhtml}prestashop>gridhtml_cf6b972204ee563b4e5691b293e931b6'] = 'Affichage HTML simple'; diff --git a/modules/gridhtml/gridhtml.php b/modules/gridhtml/gridhtml.php new file mode 100644 index 000000000..798c4266f --- /dev/null +++ b/modules/gridhtml/gridhtml.php @@ -0,0 +1,190 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class GridHtml extends ModuleGridEngine +{ + private $_values; + private static $_columns; + + function __construct($type = null) + { + if ($type != null) + parent::__construct($type); + else + { + $this->name = 'gridhtml'; + $this->tab = 'administration'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + Module::__construct(); + + $this->displayName = $this->l('Simple HTML table display'); + $this->description = ''; + } + } + + function install() + { + return (parent::install() AND $this->registerHook('GridEngine')); + } + + public static function hookGridEngine($params, $grider) + { + self::$_columns = $params['columns']; + if (!isset($params['emptyMsg'])) + $params['emptyMsg'] = 'Empty'; + + $html = '<div style="width:'.$params['width'].'px;height:'.$params['height'].'px;overflow:scroll"> + <table class="table" cellpadding="0" cellspacing="0" id="grid_1"><thead><tr>'; + foreach ($params['columns'] as $column) + $html .= '<th style="width:'.$column['width'].'px;cursor:pointer"> + '.$column['header'].'<br /> + <a href="javascript:getGridData(\''.$grider.'&sort='.$column['dataIndex'].'&dir=ASC\');"> + <img src="../img/admin/up.gif" /> + </a> + <a href="javascript:getGridData(\''.$grider.'&sort='.$column['dataIndex'].'&dir=DESC\');"> + <img src="../img/admin/down.gif" /> + </a> + </th>'; + $html .= '</tr></thead> + <tbody></tbody> + <tfoot><tr><th colspan="'.count($params['columns']).'"></th></tr></tfoot> + </table> + </div> + <script type="text/javascript"> + function getGridData(url) + { + $("#grid_1 tbody").html("<tr><td style=\"text-align:center\" colspan=\"" + '.count($params['columns']).' + "\"><img src=\"../img/loadingAnimation.gif\" /></td></tr>"); + $.get(url, "", function(json) { + $("#grid_1 tbody").html(""); + var array = $.parseJSON(json); + $("#grid_1 tfoot tr th").html("'.addslashes($params['pagingMessage']).'"); + $("#grid_1 tfoot tr th").html($("#grid_1 tfoot tr th").html().replace("{0}", array["from"])); + $("#grid_1 tfoot tr th").html($("#grid_1 tfoot tr th").html().replace("{1}", array["to"])); + $("#grid_1 tfoot tr th").html($("#grid_1 tfoot tr th").html().replace("{2}", array["total"])); + + if (array["from"] > 1) + $("#grid_1 tfoot tr th").html($("#grid_1 tfoot tr th").html() + " &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a style=\\"cursor:pointer;text-decoration:none\\" onclick=\\"gridPrevPage(\'"+ url +"\');\\">&lt;&lt;</a>"); + if (array["to"] < array["total"]) + $("#grid_1 tfoot tr th").html($("#grid_1 tfoot tr th").html() + " | <a style=\\"cursor:pointer;text-decoration:none\\" onclick=\\"gridNextPage(\'"+ url +"\');\\">&gt;&gt;</a>"); + var values = array["values"]; + if (values.length > 0) + $.each(values, function(index, row){ + var newLine = "<tr>";'; + foreach ($params['columns'] as $column) + $html .= ' newLine += "<td'.(isset($column['align']) ? ' style=\"text-align:'.$column['align'].'\"' : '').'>" + row["'.$column['dataIndex'].'"] + "</td>";'; + if (!isset($params['defaultSortColumn'])) + $params['defaultSortColumn'] = false; + if (!isset($params['defaultSortDirection'])) + $params['defaultSortDirection'] = false; + $html .= ' $("#grid_1 tbody").append(newLine); + }); + else + $("#grid_1 tbody").append("<tr><td style=\"text-align:center\" colspan=\"" + '.count($params['columns']).' + "\">'.$params['emptyMsg'].'</td></tr>"); + }); + } + + function gridNextPage(url) + { + var from = url.match(/&start=[0-9]+/i); + if (from && from[0] && parseInt(from[0].replace("&start=", "")) > 0) + from = "&start=" + (parseInt(from[0].replace("&start=", "")) + 40); + else + from = "&start=40"; + url = url.replace(/&start=[0-9]+/i, "") + from; + getGridData(url); + } + + function gridPrevPage(url) + { + var from = url.match(/&start=[0-9]+/i); + if (from && from[0] && parseInt(from[0].replace("&start=", "")) > 0) + { + var fromInt = parseInt(from[0].replace("&start=", "")) - 40; + if (fromInt > 0) + from = "&start=" + fromInt; + else + from = "&start=0"; + } + else + from = "&start=0"; + url = url.replace(/&start=[0-9]+/i, "") + from; + getGridData(url); + } + + $(document).ready(function(){getGridData("'.$grider.'&sort='.urlencode($params['defaultSortColumn']).'&dir='.urlencode($params['defaultSortDirection']).'");}); + </script>'; + return $html; + } + + public function setColumnsInfos(&$infos) + { + } + + public function setValues($values) + { + $this->_values = $values; + } + + public function setTitle($title) + { + $this->_title = $title; + } + + public function setSize($width, $height) + { + $this->_width = $width; + $this->_height = $height; + } + + public function setTotalCount($totalCount) + { + $this->_totalCount = $totalCount; + } + + public function setLimit($start, $limit) + { + $this->_start = (int)$start; + $this->_limit = (int)$limit; + } + + public function render() + { + echo Tools::jsonEncode(array( + 'total' => $this->_totalCount, + 'from' => min($this->_start + 1, $this->_totalCount), + 'to' => min($this->_start + $this->_limit, $this->_totalCount), + 'values' => $this->_values + )); + } +} + diff --git a/modules/gridhtml/it.php b/modules/gridhtml/it.php new file mode 100644 index 000000000..8cc11aa42 --- /dev/null +++ b/modules/gridhtml/it.php @@ -0,0 +1,7 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gridhtml}prestashop>gridhtml_cf6b972204ee563b4e5691b293e931b6'] = 'Semplice tabella di visualizzazione HTML'; + +?> \ No newline at end of file diff --git a/modules/gridhtml/logo.gif b/modules/gridhtml/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9b9215e1dfaa9fd915cd31ce928a0d2e483f95d GIT binary patch literal 998 zcmZ?wbhEHb6krfw_|5<VHT%kfS`LS_9SLna7S?_|uIp$_*RlAXW074aqPtGU_nwIB zJDoh~T*~BgnbR)j&%RPJ_e$x)>*b4X)GWMEwd7{)(mQo4?lv5(YB^lju<~xxs{50+ z+;3U)pncuLj`fdvHa_mz^rU~w(+OLjP2T=|>b8edwm+Y?>*b7HFK6v}J$K*hdHdgV z9&745**^Jn_l$EB=3bbx@bZkMSLe(>@OIhZmn)CFSas~>ilgt>9DlLq*vmD?U#&aw zV%^D?>rTE}bNs`G6E8NLe7WJ|t4*h0Z9emA>zNl@&%WAz?$xgIuXbH{z4zkleV1O} zc=X}+laKeFf4cYl^P^W^p1u9{>cjW9pMJdi{PV+?Umw5y`t<Ghm+!y-|NjpTj8S4_ zg@EEu7Dfh!{|q`HZ-ep#1IJ;8|C}-&8y+~w8;2~ha7=RP;FmRt&`|tvY-+cJaoik* zf}^66h6#HLE;hNc@i4A)5Sa0ZYua>!<hV)&fuo{Q7R9gjJaSmjIXfcjz!64cF6Kt1 zRX0v7RA%Q_uxR+Ba7m@nK_Ij$fzwDtO_+(vHbBs5$r}M>i-JElHl{Qj;0^9caAf-2 zF?G7P7{?w1*3S6-o?RSzo1Qcr;0m6S5cnsE{fsIHi`N7p)>FdjKGQPp<v1v`bMQ+U T1OzxVyu2*Jvr0`ufWaC7zi|(* literal 0 HcmV?d00001 diff --git a/modules/gsitemap/config.xml b/modules/gsitemap/config.xml new file mode 100755 index 000000000..1d6d86a64 --- /dev/null +++ b/modules/gsitemap/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>gsitemap</name> + <displayName><![CDATA[Google sitemap]]></displayName> + <version><![CDATA[1.6]]></version> + <description><![CDATA[Generate your Google sitemap file]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[seo]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/gsitemap/de.php b/modules/gsitemap/de.php new file mode 100644 index 000000000..0b2b83779 --- /dev/null +++ b/modules/gsitemap/de.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gsitemap}prestashop>gsitemap_3aaaafde6f9b2701f9e6eb9292e95521'] = 'Google Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_935a6bc13704a117d22333c3155b5dae'] = 'Generieren Sie Ihre Google Sitemap-Datei'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5bbdad908e423585a7ecc6b61b66b313'] = 'Kann nicht erstellt werden'; +$_MODULE['<{gsitemap}prestashop>gsitemap_09fa1e865bdcf4d3215d5b0005b93154'] = 'sitemap.xml Datei.'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5a517cec50ac8e742f6583c6c404c4e9'] = 'Sitemap-Datei erfolgreich erzeugt'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0a6ee1a4f10278211d74152e633d0ed0'] = 'Fehler beim Erstellen der Sitemap-Datei'; +$_MODULE['<{gsitemap}prestashop>gsitemap_eb175747116b689caadea1b84202f513'] = 'Ihr Google-Sitemap-Datei ist online unter folgender Adresse:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_39d616ecc73e174052f1877ac2b3c853'] = 'Aktualisierung:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b908c2f34052b5276e0bf50f0e042211'] = 'Dateigröße:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_3f69f5c6c3c90eee482f28ae77390cb9'] = 'Indizierte Seiten:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b8cb67a25f16d9000d8c974e30441b59'] = 'Die Sitemap enthält auch Produkte der nicht aktivierten Kategorien'; +$_MODULE['<{gsitemap}prestashop>gsitemap_60ee4e03c30c4827c80eb31bfd27130d'] = 'Die Sitemap enthält auch CMS-Seiten die nicht in einem CMS-Block sind'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8103220a578f92ec726809c3d47adc6e'] = 'Sitemap-Datei erzeugen'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0033cf1fdbd4354facfaa51f6f0de6a4'] = 'Sitemap-Datei aktualisieren'; +$_MODULE['<{gsitemap}prestashop>gsitemap_f5a592018c8b55d2c968515ad7c58c91'] = 'Search Engine Optimization'; +$_MODULE['<{gsitemap}prestashop>gsitemap_4ff2e716a7d06ce5274b4090b39abad3'] = 'Siehe'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8334797b9b3383d4f48d98178b8845ea'] = 'diese Seite'; +$_MODULE['<{gsitemap}prestashop>gsitemap_abf27597777430142de13ed6eea36d75'] = 'für weitere Informationen'; diff --git a/modules/gsitemap/en.php b/modules/gsitemap/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/gsitemap/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/gsitemap/es.php b/modules/gsitemap/es.php new file mode 100644 index 000000000..8660aefd0 --- /dev/null +++ b/modules/gsitemap/es.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gsitemap}prestashop>gsitemap_3aaaafde6f9b2701f9e6eb9292e95521'] = 'Google Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_935a6bc13704a117d22333c3155b5dae'] = 'Genere su fichero de Google Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5bbdad908e423585a7ecc6b61b66b313'] = 'Creación imposible'; +$_MODULE['<{gsitemap}prestashop>gsitemap_09fa1e865bdcf4d3215d5b0005b93154'] = 'fichero sitemap.xml'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5a517cec50ac8e742f6583c6c404c4e9'] = 'El fichero sitemap fue generado correctamente'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0a6ee1a4f10278211d74152e633d0ed0'] = 'Error mientras se creaba el fichero sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_eb175747116b689caadea1b84202f513'] = 'Su fichero de google sitemap está online en la siguiente dirección:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_39d616ecc73e174052f1877ac2b3c853'] = 'Actualizar:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b908c2f34052b5276e0bf50f0e042211'] = 'Tamaño'; +$_MODULE['<{gsitemap}prestashop>gsitemap_3f69f5c6c3c90eee482f28ae77390cb9'] = 'Páginas Indexadas:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b8cb67a25f16d9000d8c974e30441b59'] = 'Mapa del sitio también incluye productos de las categorías de inactivos'; +$_MODULE['<{gsitemap}prestashop>gsitemap_60ee4e03c30c4827c80eb31bfd27130d'] = 'Mapa del sitio también incluye páginas de CMS que no están en un bloque de CMS'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8103220a578f92ec726809c3d47adc6e'] = 'Generar fichero Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0033cf1fdbd4354facfaa51f6f0de6a4'] = 'Actualizar fichero Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_f5a592018c8b55d2c968515ad7c58c91'] = 'Optimizar Motor de Búsqueda'; +$_MODULE['<{gsitemap}prestashop>gsitemap_4ff2e716a7d06ce5274b4090b39abad3'] = 'Lea'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8334797b9b3383d4f48d98178b8845ea'] = 'esta página'; +$_MODULE['<{gsitemap}prestashop>gsitemap_abf27597777430142de13ed6eea36d75'] = 'para más información'; diff --git a/modules/gsitemap/fr.php b/modules/gsitemap/fr.php new file mode 100644 index 000000000..6b8e3ba5e --- /dev/null +++ b/modules/gsitemap/fr.php @@ -0,0 +1,22 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gsitemap}prestashop>gsitemap_3aaaafde6f9b2701f9e6eb9292e95521'] = 'Google sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_935a6bc13704a117d22333c3155b5dae'] = 'Génère votre fichier sitemap pour Google'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5bbdad908e423585a7ecc6b61b66b313'] = 'Impossible de créer'; +$_MODULE['<{gsitemap}prestashop>gsitemap_09fa1e865bdcf4d3215d5b0005b93154'] = 'sitemap.xml.'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5a517cec50ac8e742f6583c6c404c4e9'] = 'Fichier Sitemap généré avec succès'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0a6ee1a4f10278211d74152e633d0ed0'] = 'Erreur durant la création du fichier Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_eb175747116b689caadea1b84202f513'] = 'Votre fichier Google Sitemap est en ligne à l\'adresse suivante :'; +$_MODULE['<{gsitemap}prestashop>gsitemap_39d616ecc73e174052f1877ac2b3c853'] = 'Mise à jour'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b908c2f34052b5276e0bf50f0e042211'] = 'Taille du fichier'; +$_MODULE['<{gsitemap}prestashop>gsitemap_3f69f5c6c3c90eee482f28ae77390cb9'] = 'Nombre de pages indexées'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b8cb67a25f16d9000d8c974e30441b59'] = 'Le Sitemap inclus également les produits des catégories inactives'; +$_MODULE['<{gsitemap}prestashop>gsitemap_60ee4e03c30c4827c80eb31bfd27130d'] = 'Le Sitemap inclus également les pages CMS qui ne sont pas dans un bloc de CMS'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8103220a578f92ec726809c3d47adc6e'] = 'Générer le fichier sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0033cf1fdbd4354facfaa51f6f0de6a4'] = 'Mettre à jour le fichier sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_f5a592018c8b55d2c968515ad7c58c91'] = 'Optimisation pour les moteurs de recherche (SEO)'; +$_MODULE['<{gsitemap}prestashop>gsitemap_4ff2e716a7d06ce5274b4090b39abad3'] = 'Voir'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8334797b9b3383d4f48d98178b8845ea'] = 'cette page'; +$_MODULE['<{gsitemap}prestashop>gsitemap_abf27597777430142de13ed6eea36d75'] = 'pour plus d\'informations'; diff --git a/modules/gsitemap/gsitemap.php b/modules/gsitemap/gsitemap.php new file mode 100644 index 000000000..dfbd93a3e --- /dev/null +++ b/modules/gsitemap/gsitemap.php @@ -0,0 +1,384 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7515 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Gsitemap extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + public function __construct() + { + $this->name = 'gsitemap'; + $this->tab = 'seo'; + $this->version = '1.6'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Google sitemap'); + $this->description = $this->l('Generate your Google sitemap file'); + + if (!defined('GSITEMAP_FILE')) + define('GSITEMAP_FILE', dirname(__FILE__).'/../../sitemap.xml'); + } + + public function uninstall() + { + file_put_contents(GSITEMAP_FILE, ''); + return parent::uninstall(); + } + + private function _postValidation() + { + file_put_contents(GSITEMAP_FILE, ''); + if (!($fp = fopen(GSITEMAP_FILE, 'w'))) + $this->_postErrors[] = $this->l('Cannot create').' '.realpath(dirname(__FILE__.'/../..')).'/'.$this->l('sitemap.xml file.'); + else + fclose($fp); + } + + private function getUrlWith($url, $key, $value) + { + if (empty($value)) + return $url; + if (strpos($url, '?') !== false) + return $url.'&'.$key.'='.$value; + return $url.'?'.$key.'='.$value; + } + + private function _postProcess() + { + Configuration::updateValue('GSITEMAP_ALL_CMS', (int)Tools::getValue('GSITEMAP_ALL_CMS')); + Configuration::updateValue('GSITEMAP_ALL_PRODUCTS', (int)Tools::getValue('GSITEMAP_ALL_PRODUCTS')); + + if (Tools::isMultiShopActivated()) + $res = $this->generateSitemapIndex(); + else + $res = $this->generateSitemap(Configuration::get('PS_SHOP_DEFAULT'), GSITEMAP_FILE); + + $this->_html .= '<h3 class="'. ($res ? 'conf confirm' : 'alert error') .'" style="margin-bottom: 20px">'; + $this->_html .= $res ? $this->l('Sitemap file generated') : $this->l('Error while creating sitemap file'); + $this->_html .= '</h3>'; + } + + /** + * Generate sitemap index to reference the sitemap of each shop + * + * @return bool + */ + private function generateSitemapIndex() + { + $xmlString = <<<XML +<?xml version="1.0" encoding="UTF-8" ?> +<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" +xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"> +</sitemapindex> +XML; + $xml = new SimpleXMLElement($xmlString); + + $sql = 'SELECT s.id_shop, su.domain, su.domain_ssl, su.uri + FROM '._DB_PREFIX_.'shop s + INNER JOIN '._DB_PREFIX_.'shop_url su ON s.id_shop = su.id_shop AND su.main = 1 + WHERE s.active = 1 + AND s.deleted = 0 + AND su.active = 1'; + if (!$result = Db::getInstance()->ExecuteS($sql)) + return false; + + $res = true; + foreach ($result as $row) + { + $info = pathinfo(GSITEMAP_FILE); + $filename = $info['filename'].'-'.$row['id_shop'].'.'.$info['extension']; + $replaceUrl = array('http://'.$row['domain'].$row['uri'], ((Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://').$row['domain_ssl'].$row['uri']); + + $last = $this->generateSitemap($row['id_shop'], $info['dirname'].'/'.$filename, $replaceUrl); + if ($last) + $this->_addSitemapIndexNode($xml, 'http://'.$row['domain'].(($row['uri']) ? $row['uri'] : '/').$filename, date('Y-m-d')); + $res &= $last; + } + + $fp = fopen(GSITEMAP_FILE, 'w'); + fwrite($fp, $xml->asXML()); + fclose($fp); + + return $res && file_exists(GSITEMAP_FILE); + } + + /** + * Generate a sitemap for a shop + * + * @param int $shopID + * @param string $filename + * @return bool + */ + private function generateSitemap($shopID, $filename = '', $replaceUrl = array()) + { + $link = new Link(); + $langs = Language::getLanguages(); + $shop = new Shop($shopID); + if (!$shop->id) + return false; + + $xmlString = <<<XML +<?xml version="1.0" encoding="UTF-8" ?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" +xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"> +</urlset> +XML; + + $xml = new SimpleXMLElement($xmlString); + + if (Configuration::get('PS_REWRITING_SETTINGS') AND sizeof($langs) > 1) + foreach($langs as $lang) + $this->_addSitemapNode($xml, Tools::getShopDomain(true, true).__PS_BASE_URI__.$lang['iso_code'].'/', '1.00', 'daily', date('Y-m-d')); + else + $this->_addSitemapNode($xml, Tools::getShopDomain(true, true).__PS_BASE_URI__, '1.00', 'daily', date('Y-m-d')); + + /* CMS Generator */ + if (Configuration::get('GSITEMAP_ALL_CMS') OR !Module::isInstalled('blockcms')) + $sql = 'SELECT DISTINCT '.(Configuration::get('PS_REWRITING_SETTINGS') ? 'cl.id_cms, cl.link_rewrite, cl.id_lang' : 'cl.id_cms').' + FROM '._DB_PREFIX_.'cms_lang cl + LEFT JOIN '._DB_PREFIX_.'lang l ON (cl.id_lang = l.id_lang) + LEFT JOIN '._DB_PREFIX_.'cms_shop cs ON cs.id_cms = cl.id_cms + WHERE l.`active` = 1 + AND cs.id_shop = '.$shopID.' + ORDER BY cl.id_cms, cl.id_lang ASC'; + else if (Module::isInstalled('blockcms')) + $sql = 'SELECT DISTINCT '.(Configuration::get('PS_REWRITING_SETTINGS') ? 'cl.id_cms, cl.link_rewrite, cl.id_lang' : 'cl.id_cms').' + FROM '._DB_PREFIX_.'cms_block_page b + LEFT JOIN '._DB_PREFIX_.'cms_lang cl ON (b.id_cms = cl.id_cms) + LEFT JOIN '._DB_PREFIX_.'lang l ON (cl.id_lang = l.id_lang) + LEFT JOIN '._DB_PREFIX_.'cms_shop cs ON cs.id_cms = cl.id_cms + WHERE l.`active` = 1 + AND cs.id_shop = '.$shopID.' + ORDER BY cl.id_cms, cl.id_lang ASC'; + + $cmss = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + foreach ($cmss AS $cms) + { + $tmpLink = Configuration::get('PS_REWRITING_SETTINGS') ? $link->getCMSLink((int)$cms['id_cms'], $cms['link_rewrite'], false, (int)$cms['id_lang']) : $link->getCMSLink((int)$cms['id_cms']); + $this->_addSitemapNode($xml, $tmpLink, '0.8', 'daily'); + } + + /* Categories Generator */ + $limits = Category::getInterval($shop->id_category); + if (Configuration::get('PS_REWRITING_SETTINGS')) + { + $sql = 'SELECT c.id_category, c.level_depth, link_rewrite, DATE_FORMAT(IF(date_upd,date_upd,date_add), \'%Y-%m-%d\') AS date_upd, cl.id_lang + FROM '._DB_PREFIX_.'category c + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON c.id_category = cl.id_category AND cl.id_shop = '.$shopID.' + LEFT JOIN '._DB_PREFIX_.'lang l ON cl.id_lang = l.id_lang + WHERE l.`active` = 1 + AND c.`active` = 1 + AND c.id_category != 1 + AND nleft >= '.$limits['nleft'].' + AND nright <= '.$limits['nright'].' + ORDER BY cl.id_category, cl.id_lang ASC'; + $categories = Db::getInstance()->ExecuteS($sql); + } + else + { + $sql = 'SELECT c.id_category, c.level_depth, DATE_FORMAT(IF(date_upd,date_upd,date_add), \'%Y-%m-%d\') AS date_upd + FROM '._DB_PREFIX_.'category c + WHERE nleft >= '.$limits['nleft'].' + AND nright <= '.$limits['nright'].' + ORDER BY c.id_category ASC'; + $categories = Db::getInstance()->ExecuteS($sql); + } + + foreach($categories as $category) + { + if (($priority = 0.9 - ($category['level_depth'] / 10)) < 0.1) + $priority = 0.1; + + $tmpLink = Configuration::get('PS_REWRITING_SETTINGS') ? $link->getCategoryLink((int)$category['id_category'], $category['link_rewrite'], (int)$category['id_lang']) : $link->getCategoryLink((int)$category['id_category']); + $this->_addSitemapNode($xml, $tmpLink, $priority, 'weekly', substr($category['date_upd'], 0, 10)); + } + + $sql = 'SELECT p.id_product, pl.link_rewrite, DATE_FORMAT(IF(date_upd,date_upd,date_add), \'%Y-%m-%d\') date_upd, pl.id_lang, cl.`link_rewrite` category, ean13, i.id_image, il.legend legend_image, ( + SELECT MIN(level_depth) + FROM '._DB_PREFIX_.'product p2 + LEFT JOIN '._DB_PREFIX_.'category_product cp2 ON p2.id_product = cp2.id_product + LEFT JOIN '._DB_PREFIX_.'category c2 ON cp2.id_category = c2.id_category + WHERE p2.id_product = p.id_product AND p2.`active` = 1 AND c2.`active` = 1) AS level_depth + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'product_shop ps ON ps.id_product = p.id_product + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_shop ='.$shopID.') + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (p.id_category_default = cl.id_category AND pl.id_lang = cl.id_lang AND cl.id_shop = '.$shopID.') + LEFT JOIN '._DB_PREFIX_.'image i ON p.id_product = i.id_product + LEFT JOIN '._DB_PREFIX_.'image_lang il ON (i.id_image = il.id_image AND il.id_lang = pl.id_lang) + LEFT JOIN '._DB_PREFIX_.'lang l ON (pl.id_lang = l.id_lang) + WHERE l.`active` = 1 + AND p.`active` = 1 + AND ps.id_shop = '.$shopID.' + '.(Configuration::get('GSITEMAP_ALL_PRODUCTS') ? '' : 'HAVING level_depth IS NOT NULL').' + ORDER BY pl.id_product, pl.id_lang ASC'; + $products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + foreach($products AS $product) + { + if (($priority = 0.7 - ($product['level_depth'] / 10)) < 0.1) + $priority = 0.1; + + $tmpLink = $link->getProductLink((int)($product['id_product']), $product['link_rewrite'], $product['category'], $product['ean13'], (int)($product['id_lang'])); + $sitemap = $this->_addSitemapNode($xml, $tmpLink, $priority, 'weekly', substr($product['date_upd'], 0, 10)); + $sitemap = $this->_addSitemapNodeImage($sitemap, $product); + } + + /* Add classic pages (contact, best sales, new products...) */ + $pages = array( + 'authentication' => true, + 'best-sales' => false, + 'contact' => true, + 'discount' => false, + 'index' => false, + 'manufacturer' => false, + 'new-products' => false, + 'prices-drop' => false, + 'supplier' => false, + 'store' => false); + + // Don't show suppliers and manufacturers if they are disallowed + if (!Module::getInstanceByName('blockmanufacturer')->id && !Configuration::get('PS_DISPLAY_SUPPLIERS')) + unset($pages['manufacturer']); + + if (!Module::getInstanceByName('blocksupplier')->id && !Configuration::get('PS_DISPLAY_SUPPLIERS')) + unset($pages['supplier']); + + // Generate nodes for pages + if(Configuration::get('PS_REWRITING_SETTINGS')) + foreach ($pages AS $page => $ssl) + foreach($langs as $lang) + $this->_addSitemapNode($xml, $link->getPageLink($page, $ssl, $lang['id_lang']), '0.5', 'monthly'); + else + foreach($pages AS $page => $ssl) + $this->_addSitemapNode($xml, $link->getPageLink($page, $ssl), '0.5', 'monthly'); + + $xmlString = $xml->asXML(); + + // Replace URL in XML strings by real shops URL + if ($replaceUrl) + $xmlString = str_replace(array(Tools::getShopDomain(true), Tools::getShopDomainSsl(true)), $replaceUrl, $xmlString); + + $fp = fopen($filename, 'w'); + fwrite($fp, $xmlString); + fclose($fp); + + return file_exists($filename); + } + + private function _addSitemapIndexNode($xml, $loc, $last_mod) + { + $sitemap = $xml->addChild('sitemap'); + $sitemap->addChild('loc', htmlspecialchars($loc)); + $sitemap->addChild('lastmod', $last_mod); + return $sitemap; + } + + private function _addSitemapNode($xml, $loc, $priority, $change_freq, $last_mod = NULL) + { + $sitemap = $xml->addChild('url'); + $sitemap->addChild('loc', htmlspecialchars($loc)); + $sitemap->addChild('priority', $priority); + if ($last_mod) + $sitemap->addChild('lastmod', $last_mod); + $sitemap->addChild('changefreq', $change_freq); + return $sitemap; + } + + private function _addSitemapNodeImage($xml, $product) + { + $link = new Link(); + $image = $xml->addChild('image', null, 'http://www.google.com/schemas/sitemap-image/1.1'); + $image->addChild('loc', htmlspecialchars($link->getImageLink($product['link_rewrite'], (int)$product['id_product'].'-'.(int)$product['id_image'])), 'http://www.google.com/schemas/sitemap-image/1.1'); + + $legend_image = preg_replace('/(&+)/i', '&amp;', $product['legend_image']); + $image->addChild('caption', $legend_image, 'http://www.google.com/schemas/sitemap-image/1.1'); + $image->addChild('title', $legend_image, 'http://www.google.com/schemas/sitemap-image/1.1'); + } + + private function _displaySitemap() + { + if (file_exists(GSITEMAP_FILE) AND filesize(GSITEMAP_FILE)) + { + $fp = fopen(GSITEMAP_FILE, 'r'); + $fstat = fstat($fp); + fclose($fp); + $xml = simplexml_load_file(GSITEMAP_FILE); + + $nbPages = sizeof($xml->url); + + $this->_html .= '<p>'.$this->l('Your Google sitemap file is online at the following address:').'<br /> + <a href="'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'sitemap.xml" target="_blank"><b>'.Tools::getShopDomain(true, true).__PS_BASE_URI__.'sitemap.xml</b></a></p><br />'; + + $this->_html .= $this->l('Update:').' <b>'.utf8_encode(strftime('%A %d %B %Y %H:%M:%S',$fstat['mtime'])).'</b><br />'; + $this->_html .= $this->l('Filesize:').' <b>'.number_format(($fstat['size']*.000001), 3).'MB</b><br />'; + $this->_html .= $this->l('Indexed pages:').' <b>'.$nbPages.'</b><br /><br />'; + } + } + + private function _displayForm() + { + $this->_html .= + '<form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <div style="margin:0 0 20px 0;"> + <input type="checkbox" name="GSITEMAP_ALL_PRODUCTS" id="GSITEMAP_ALL_PRODUCTS" style="vertical-align: middle;" value="1" '.(Configuration::get('GSITEMAP_ALL_PRODUCTS') ? 'checked="checked"' : '').' /> <label class="t" for="GSITEMAP_ALL_PRODUCTS">'.$this->l('Sitemap also includes products from inactive categories').'</label> + </div> + <div style="margin:0 0 20px 0;"> + <input type="checkbox" name="GSITEMAP_ALL_CMS" id="GSITEMAP_ALL_CMS" style="vertical-align: middle;" value="1" '.(Configuration::get('GSITEMAP_ALL_CMS') ? 'checked="checked"' : '').' /> <label class="t" for="GSITEMAP_ALL_CMS">'.$this->l('Sitemap also includes CMS pages which are not in a CMS block').'</label> + </div> + <input name="btnSubmit" class="button" type="submit" + value="'.((!file_exists(GSITEMAP_FILE)) ? $this->l('Generate sitemap file') : $this->l('Update sitemap file')).'" /> + </form>'; + } + + public function getContent() + { + $this->_html .= '<h2>'.$this->l('Search Engine Optimization').'</h2> + '.$this->l('See').' <a href="https://www.google.com/webmasters/tools/docs/en/about.html" style="font-weight:bold;text-decoration:underline;" target="_blank"> + '.$this->l('this page').'</a> '.$this->l('for more information').'<br /><br />'; + if (Tools::isSubmit('btnSubmit')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= '<div class="alert error">'.$err.'</div>'; + } + + $this->_displaySitemap(); + $this->_displayForm(); + + return $this->_html; + } +} diff --git a/modules/gsitemap/it.php b/modules/gsitemap/it.php new file mode 100644 index 000000000..16b6a8487 --- /dev/null +++ b/modules/gsitemap/it.php @@ -0,0 +1,26 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{gsitemap}prestashop>gsitemap_3aaaafde6f9b2701f9e6eb9292e95521'] = 'Google sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_935a6bc13704a117d22333c3155b5dae'] = 'Genera il tuo file sitemap di Google'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5bbdad908e423585a7ecc6b61b66b313'] = 'Non è possibile creare'; +$_MODULE['<{gsitemap}prestashop>gsitemap_09fa1e865bdcf4d3215d5b0005b93154'] = 'file sitemap.xml.'; +$_MODULE['<{gsitemap}prestashop>gsitemap_5a517cec50ac8e742f6583c6c404c4e9'] = 'File Sitemap generato con successo'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0a6ee1a4f10278211d74152e633d0ed0'] = 'Errore durante la creazione del file sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_eb175747116b689caadea1b84202f513'] = 'Il tuo file sitemap di Google è online al seguente indirizzo:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_39d616ecc73e174052f1877ac2b3c853'] = 'Aggiornamento:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_b908c2f34052b5276e0bf50f0e042211'] = 'Dimensioni:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_3f69f5c6c3c90eee482f28ae77390cb9'] = 'Pagine indicizzate:'; +$_MODULE['<{gsitemap}prestashop>gsitemap_a0548d857c8e9fcfd2b3c8e08d231456'] = 'Sitemap contiene tutti i prodotti'; +$_MODULE['<{gsitemap}prestashop>gsitemap_570b9e0ce727cb56ff261113fa1c4eba'] = 'Default, solo i prodotti delle categorie attive sono inclusi nel Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_bbb0ad1beeb2e94661f89f8edfc79322'] = 'Sitemap contiene tutte le pagine CMS'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8a1b79d3b66d3234795649a69cf86410'] = 'Default, solo le pagine CMS nel blocco CMS sono inclusi nel Sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8103220a578f92ec726809c3d47adc6e'] = 'Genera file sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_0033cf1fdbd4354facfaa51f6f0de6a4'] = 'Aggiornamento file sitemap'; +$_MODULE['<{gsitemap}prestashop>gsitemap_f5a592018c8b55d2c968515ad7c58c91'] = 'Search Engine Optimization'; +$_MODULE['<{gsitemap}prestashop>gsitemap_4ff2e716a7d06ce5274b4090b39abad3'] = 'Vedi'; +$_MODULE['<{gsitemap}prestashop>gsitemap_8334797b9b3383d4f48d98178b8845ea'] = 'questa pagina'; +$_MODULE['<{gsitemap}prestashop>gsitemap_abf27597777430142de13ed6eea36d75'] = 'per maggiori informazioni'; + +?> \ No newline at end of file diff --git a/modules/gsitemap/logo.gif b/modules/gsitemap/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d24a14a90921f6b698df98d4c7135dfc7d97dd70 GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGsZi0M!5h025YktnbGo08gz|s<y&cbG#f{vF-o%042RGw?Na` z`3n}L!p{B&W9WR3$9kmJzuxe~+v6xEi_R1oBs#H7v^)R*|F6>e6)LJGTgxdhbmjK_ zMs&&qHnH6p5{Zx56(4|an&}rilgut6O|?=0B9{06|II1@97(Xv-1EWp{}VCAATGs1 zZrlI$|6+ux-Ru7rKfl}>0A+>P(kKrxV7L=3pw=KSftlYiH?h#=|Jx-R4l2v(|NlI- zM9~ljA^8LV2LS&7EC2ui01yBW000J;zy_%@s0@w1iZbEzH7wAmR62TEdN5ppvg*_V z5a{W7P;pkU-jyNJK!4VmNG(l8ptL7Wq%cjTV-_J4E`L&R7BvQjQXWqkD2!1zPc0>W zP$mZvIyxy90#6SJ4hK;TIT#cl7CTQHEDH>nP&yz4786!55(^(276%6x0JwP;CMFvN Y5;iL_JSZ=~u98zbP1)MpJ~BZ7JC9qMJpcdz literal 0 HcmV?d00001 diff --git a/modules/hipay/1.png b/modules/hipay/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b1620358961d2f56205f71a8b74808ba086fc78a GIT binary patch literal 2216 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 literal 0 HcmV?d00001 diff --git a/modules/hipay/2.png b/modules/hipay/2.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb36bc037c73ae25b3d9c94bf895f9b91e2799d GIT binary patch literal 2399 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 ReQf{$002ovPDHLkV1k%kivIur literal 0 HcmV?d00001 diff --git a/modules/hipay/3.png b/modules/hipay/3.png new file mode 100644 index 0000000000000000000000000000000000000000..f68967db66300894a25651644b62c20dd8198d1f GIT binary patch literal 2530 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 literal 0 HcmV?d00001 diff --git a/modules/hipay/config.xml b/modules/hipay/config.xml new file mode 100755 index 000000000..a10d3870a --- /dev/null +++ b/modules/hipay/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>hipay</name> + <displayName><![CDATA[Hipay]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Secure payement with Visa, Mastercard and European solutions.]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[payments_gateways]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/hipay/create.jpg b/modules/hipay/create.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4ee636dc560998b0dc1ea30be56a522bd2f3616 GIT binary patch literal 13498 zcmdUVWl$Y&v**DbLU4C?hl9HWclU$C!Cis{hu|*3o!~AB?!g^`20IWSxGn$J?)~uY z-COs=)^68KRnODE)~BDIs;PNhe%%J(OMBZ|0RZyyi~vNyf6(hG08`4t!rlh}1%Q29 zwgdoPw_zM@+})jlY-~<$tY(&Aa}cWq*pbcK%$bdYm7NVBB<k&KW?>I<CpQOK+d2tT zo_F?AlG|DeQ|j<2u`4-Cf^2N%d|g2rzRH>wzV;RZmXx9*<U-y+Z%1cGkh>YVx1)oT z8_-*r@^8k0Z~R}&Y?S1GgSguZQ;PrPm0VXzm0S|+3L@uWWoNNq=Vd47<zVID;^yPy zV<zWh=U``J=VasHWZ~cga&ZFL*~$MwlyBZ#Ev<m+QZoPW_4Xu8`H!T$yu4VwxLCoi z)@&RC0s?>8;N)a^L$J8{IJuj7vpBg?{nLUJ$j!pl*4f<_>_q;TMKg1-hr2N4Tcm$a z!O>Ys>0gHbZM7U7|H|ucXg7Ct(0_#SZ_#d=KF%OEb&wm_!_@-x2B-R`@>}ixYe#<p z-=YDkxZ1vLikX8H*uujR<m4_dB~1AyVYRfi1WL+CNbvDU@$ztUb4jyva0p0pu#1a} zvkP$Y%kW8a@&41sztiR5l;q;!<znaN;^E=okY<;Vl$Mm>=Hld%5a5;M=9c`YuDp|* zyP1;(=%0RV-~9evms94y)CEeqg3R2(u9{%5!#_Jf)duVicC!IHlS^vwkn7kwS%SUX z{@R?s=PCtqwe<v9%D93Z$^TYepzXi$F2(+T%KGoRmj9EAvAqSu_E&5Cr&jsr(p&%i z#r~`D-yZ&TbU;pT=f(ByV7#6I(Erx%0L#9&0|@oH1_%Q{{r3s_KM3Yu^bd7tD5y8- z+x;)Wf0udf17IQoH~}XxP?!K{Oeh#ksMi6&`rDL%hJgaSUH>EmM0g}*I4EcsSSTm} z6zqSJyyXH72af;)i-h<N0Dy;rf`dkZg@Z#u`zy;g{F@9BfcYL92@8)RafZ@-HU$S) zJA*^5flr)<2OpV=%Ys|;x0%ZqPD^Q8-bKA{66%tn$<$$5R`hbZZ!tl^z(B)7!@(k> zqQm^nAOI8gJsdm*0!JbiqB!MmH5X27v*3E9FW+V))TyZFaquq88)h5lG*g;D&A8jH zAxT^s$x?f%3$$rEyjFa#s{quu;Gr>LFae?f$OCEl&=LO7<mYz;_X25$V@22(<KYEW zaa+_{YtjQUIO-e>tGucem4~A-5p+--lbvBD1t`}dJR|ZNpx<>G9bLAUhIsYqi>nSz zi+|4Q2>sLHPC?f#dbTx38^+xCtSHOlCk_pB26O*Hu7FBg%RId2_S)Di*lHTamB3p0 zJfLUhpE;qC7c8ZDmq85H3`o5Ao5510Ld`2QbKy)D3gbQEnRB*KM)3zRYa^n1o!rsL z#K$<?sRA66zmgpvSvB!Fi?6IL$&&a}xbBwU6Qlr?Ad7oU%}qtAt2tPWPfKk=VBZ4+ zv4P<o16Y?HCo99F1XwF0;~X1(2={dH;U^j&{3GO&Oi8`?<BPIUXX7Cg1Bdu={ks1$ zaOHntL1|f=xeL20Nk6+|ds@a>c)A6vhVp5?`4I#-rs>=Jdg;W8d<ePWd{|@tpV#UC zA$I{vF^41P`jq5Mu2Kxa)srsc89p-ByywDrN_dLOO8e;4^DxB)K4lEil+a(FnijW6 z3+qMWz(Qphy{nIFo5D-3n@1Mo{wC*BOS^e<4G{hp<X6Dpr9r#0{lw3ozae-$K<!sR z^6*uFu}AL0I!3?N7RCcI-Anon{3~E<Rk}u1MMMAWn5WJMLM^d#3jSmRY3QlsA+o-s zLsTUrSZY`EWvVwnTeDY6P6KO)!~`%eP_|Ni3fY%dwBVP<##7Azv+QHkSL=Es(rnO) z(hIxCiOYV7Q<vM5eV_CtTf^}1$16a~&*bK+)vHL<YhUQZIUu`<*aYjspw|58T480y zrGC7MJWD!WW>H-UN(^)4QYKD=MYFam<2aWkE6dJA$;Wsc19@kVretV2njzIlbCnW( zL+4nhwE1{p%+)4t4M|;Ty^%UyPa07NrX33{#O5(EJd(?5^po69X9rv9Yy(OzjSORz zE?K6<XP&f~t~k@jWb3`4s@~-D&&~pEWlSqA6_>CKy)C;`duXx>lgW{DDlynP_Vo#* z+R|DUWLr2!JP`}805$_(gKZYGBfIbZWXaXO=@I<`65OU0UVC52z7DlZd;`^T(i}Hi z#AvgstqVyN@rf<q4cJuLW(;C6zrCnjpVn)+v*QWgogt-Bq>T}Pj|fDJOrNT&<D5$5 z87i961Z5jY$J&f1&(4ERgS_fLy=@~0e{p9XY+kK4K`NObG(Me0l+b%5Dm_=zG*Pue zPNuJDmS(o4e|{~!@5P`KfSJ#Jzj<J;3;Y~cI$@iQyHw;bwOZ(*7VgG}6TkR54&i{! zN=t+FGDp%orE`L~T{mFV(97oX!Xwy^LgHXUPV6oV1#?DHPyQ=&(E(u)LPuVom(X&{ z^Kf(a;zlTUbV4fbW1A8+@&F9uAg!tF%#K!qnxEmaCS_pd$~5~Q?MeONqMqo%j)Va( zePh<FuVP|SN`2ueu4(un7CsDvuE7;Eh1KDNO9hY`+^n}ut&XOefTGkOu-=FDBzb_7 z505cBUT7TuGhAbw8i_A@L2-3BzW!ipt`<(JjwxFcDb#o2dk5jTy|>YM)9c$eHXTh+ zn#9nJariv58?ARi9b%+vW!jueNJU9$uTBse;Ov<R{CY4JPq{GfrOHeO6*Pg*Myk@> zEHo3CPqOEo#d847`!MwJ=FcZK1=~I55AEMLvT@8Cx$<ZfGLTv!3qxx@wR#EO(MFw1 zN#xoxn(xD$(PB^~WIq_fQ<c;@FballOj{Ep_-}Tyq^>!MClB+ANM@s0)X{C~AS-ss z=c8R=z5A7sriV)olgbI(fJd&=KA*2DEana~w}q=ub{tK6RKB95A~RQ=8G?nmb9ca{ z``{UxR$YB!CYN3;S~1KxxNn<)Rg9mwav$`oO;fe>%&EOA-*P$ZeuaZ~=l&zSw0a>I z!M%vhXRL}3Cejb9H#jplHEVT_FM9#wU?Le&%zT*U-xqYFp^oV;(_S&0#FHKH`4?*Y zw2~2e`%PemSo_CxElTU>#fQbWX8S-KK)XGC3uE^RfLjM&c9Drb(U=A;;eFkD$=?XN z$NlwmR)t%1WuoED;&XT|rhB6I6$d3=adwP%A|hGqTSl}i^k@=O9S@p-Fc=Xj8fLg2 zX?m$XhE~daROU3BURAXMjH6hl!N!&$*=BxPzc1m%KyGC<TgbV30Pa3aySLC%v&3U^ zg&VDDUOhvD$hzDdO$m=&2BIWq*F%K5cDGH@)?A})*sYDS=v}&Pu5c{bC-a$0^|baq zI?}(2_4JgT8Cd`W%p+Edy5Dj@J5DD2QH_JmiO!$?t?9{oTTYNAkFk1Tz`dEV435^V zJu}N;MbfQ2vyB-!rSf+s$B9$JEs9N)7iw&^=b+4e2&}XGVNYR>clKPbgheXp9@LLC z;{;pYAWM;bpOk>Y-7dO-9pWmNp;3OHnX?svN}3QPPJDS%ZK(=SG@S=&wmqY2N}E}) zkZ_9m6)W{%dmvKhC)G?H;#p2bE<Oo20b3lO>LI<|HGcNekD2a-3hyE?DfluFCNUZv zlUqS8o?Gy4Wu;dV@#@=6>8gVs=n+Z~mmjOwzxeoe?sJH;oSx`hOdmf@cYsXC#&7i% z<@bVDeDlJKs6B*5=!Uw`#1HP2gtym*jK6YvF;5i{&rfXYW?=aUn`Wh07+3Z2YKd_W zRq$D+*)275C~7K{my?sLp|yDh3^*G2XLcyYw;&g+X>`JhsTiOs@(__QdDb^qZm$Jm zw0Y5GJ3g^FdVKO<(dDj1(lv|b%ks%UFP27il`qz9$t4f5&tA{2cqt~}m7ibXDmpd7 zZcOwc_%P(rvB#}QflJY*_js`<`4~2Xr6^X&R;)vw!#^T*dxi#1>&kZ~Y;dzu$yU`> zDa7493rX`-`~6-pf84mhMS1?wc&9Du<0G=uePx#A=v1B$bxOjP?*~c?X}5V_)r$IA zy)L`@RUWAMcoH6I5<}2u4p=e1j_}`SP-I`tWbK8P{odxPpy1OE`255UBHVV<ozriE zzRDa#-Med#JiKAx8+G)3gMh(zRAyQeJ^^q;NGlOsQ+g~TEG<P6t2K*@4xGcHm5QZY z{^h!#WetE3(Ti=9B6__jH8!M-+M27&%SR=eT;kb}^{%EkL)A0(+460EINe&)ar2aS z@xEDkId|n#*>U}SkW<M|##Rx>TnC$&eA_4WIp!!;MgPc8ld$@8`cZ1qwPV={ah$%g z34kJnV{fOr$WT#xQ@%OgGYLaiR6?D4_QzP8T4PGQ^bF%s4ooBf)|2+Or|XIP+`ytq zUH))&z)oUrm^f0dZNAl=+FzW}AI-;THGXb)`>}krQ()cUZRnfrS;KIWPf=y6<;v?w z66fW7M38|a`oM7LtHpQ7Q<W=aH;!g)z+32Qnf4*K(sG%f@lRN+v=jM7J!@sT9KThT zR)((3aiVMlR#Xbbbe9)Yt2b}UZ<aadb=rvppmi#hF7h#7y&Jnd8EFSz31qG;st59H zCY%qcv-X)LTkW)MmTh*t&sJ=hh@!qkNOUED!4hit+VGLN7-Q6T3y)niXy+1A|Dco4 z_h_%3Yv`D@T6NTuOi?h;R_pq(($O+Cr0Am=*`@@~ryh}{ogr90I^r`FDIK2M#ZTf| ztc6@&D#i~r0Y4y6E3+HdEK9q{sVqLC8UULlJ6HH&U8ee*6Wl0ncleoffbHp;<EhNa z`sq`UbIr#t7EgjKtW2S{i$HGBHsYTyPN^XkvAq=(9H#O_4_KuQ0cOI){FyxBw1rvE z6du&`F4o`b9pdaYdLNcSANuX`yS`8s?PPH76jKq>-#E@eh@!ChFk@+nBJi?V1EP`K zp3Txcj<2<5m6P}hQ@?*bvNuGji9D1x4LtbzXwrJy>(_reI_R`o_VX10?^5DZa1tE7 zLP(Ri=lP;(y-+cgK3~`eU_JkPeS(hkNnZhu0>O{30K9Z-1rtcw-vp;eAD){I5YC^B zjdB@+T5|fHUjZ@WjU{Y1a~Wj47e1cuB`>RPFt;yktWznyYs#j9Z{vS|Wj6iMuKQ-I z#_RkQa7u^wbl&>2drf11*D(F%pm?mm?%J;V7tsx|%Hb=39sJdJ6G#3+)X|2|uug4w z!=b|#loNeVn~`T8>N500xdc(uEW>ix@iK=?TJhdw@4ff2J&iV?OTrk2QWA`T_^EDB z!@|t1TBz%=H#vhs^;cgab03j66pUPwpf|m#?nkJ)4*}gnPx;Gy9(Q28xctm-Z9Bgd z>XShJaE?9NPzdT3xadB--Thx5g0}{)vltr@xGZx&D{!KB<4_53Q6BbX+uW6>*^4In zZc8HKa1%B;d7zv9hEkwv85<joKp|9|NWvqeU)f0bs0EktVv1D9*8=I~@?0lhZ8=;u z>Zi4grdIRxp*D?-7NN=bh_Gm%s$5SvINY&&WE*uA$X2zdUn6Yf*tej^Gn&XVV%v_# zbIO-_e=oyQh1(hC`+4W+A{$c@NLknkie^YDVMwUHXT6W<b$JC0m{Ug)>zxoR0%*G5 z-{M-qIs7z!A&+rCIW?)@9JvI8H-GchZeBi3)^Yh8L-9(sz$TBsXI{%&D&%vB^|yY1 zq`HSVcIZwqO3iXV_PIMCeP}6#(y0SVUD~(nI}6s}$N?-TM~YTb#aVHkU)2{?nK2sn z%TJ#L-Z8F)Ng;S{Jdb1Kp(4rUF^EWdgwdx)3{cq2PDnp|(kAPos4?MlexADq%Z|0& zbFurSaOkj74humdkiP}LXmW6(%ZI*vl|V`D4zJT+jL#fkdj)(t5gao2Mxk-scOzH( z$vKCjag*eF0^0L{38Ai5Q9MefZwd~LWT5X+!r~FPnnccGgpPhU&J^#626J=EQK)f3 zoXRPD*1+N5T1R%1mtI=n(Z~cnC7#$*InsZyyj3F_zjq~+W7y_;v)<nFYgi_pq9r%m zOAecfJ3=>2;92H9uq$f=xeC@Gy+j!3;hZyjmTgtvstzQ<Bl+-CNSHyqxNDA;A<s*> zM9yODq@!7D{xptZK5Q=Q4`DgCVDo~SHLaAUz=Q>2+&Q@aS4}XC+1?H-ML06Nu!Jq4 z_>1C(#Of=6%i}JeaK>owthHgXvva))yl+&s?nSDCK)t>@F=q7W67K4n%<C~SqN~B6 zPLrj2i8!OB%9{!RF!G;tBBa@Eur(bSOl4wz(jCVH7L-xAkGOa&kEH~Zin*kH!Eq$t zY)Adh$x4lcUx}DWtxCb4jQKk<>XU$!U^TH0sqnE>w#$<q^9aCzOt%16^RZkDT>M`9 zS4B6-q^iz+JA0`!Pp!lA)*;<$yU~TXbnttUEvE^IC|M)COrB1XyomEDK~6S135%KY zE5H-IDgQ!o*hK!$>$!ie^Nw^kDAmj-;UKlBx0cOp>shoT=#pjnenS;v|8@Q<u&Dzj z=KEr-7EL8QkilUvx0mH>4k!k68oT46pC+D}6<aLBz&_eFK<Qe^E}gBONLN{)fgKs# z=GYla^kdJ!6R1S6B?Aqg@)5Hbg{^#5;xmk1BoqLT1fl=1=bM#hnu%G!(A2NC><Odd zK;MbwNBi$<Vb0t+-rIv%`y-SV#APH_ww5%7dWg(>CKty+cnfC2+_{_e)ZE)Hvnh^e zQB=81t1>=rAtT^pNDT)Sp&kKqor+PFu6uQvRiU+I^pMigJHe34eSsLKgLkfXp8Ekq zHhbR}q5k}-{6r0VjTC2aKqukfK%SVI#Y+LF1EF%haijD2Bx+H#uPeNl?li7c=p@(H zuuUszF<K|#xI&So0Z5fgP2rZ2j?F|4o%KY?E1WW87UYS^E*~Zs-<j}Zh+iRwiOa>6 zD0z2QIKR%s&xYj<XYkpJz5tAI8Fv#uz5EJ5_cY`RCz6f0)9vOC>Zv%YO?4_e(E93B zRxYgMqqj~hBH8K&xdQJ`*QI{zvXaf(`aZ6hiAU3gH)Q&&FCg@L6`tC{dlMyeEJH!5 z2nMr8;!^0db;Se|kyik}m=H9P!96<yE}EFZh0DvQnkq>6hG2OdLE|ex>df;Mz>!sH z{N5O6(QMd3d8H`Ka4HebpgP)~vcbw~4?U@ZUW4`vy7;^IkxuVc%b|0^;5YPJ*@OjV zoO7osj24!NKa1BRs4s^ALqzHq%ZwClaFL(JWWGh<SZFsyVLSUKLyi{qQ-9|S#5t>~ z>0hP7%7$g9SW&eVXrgqjxjG5*)s|d1kloSsJx6Rmh>R^gm)}z54_%tCwf7~n*|ot? z0H^UEHhhs%{FMgss58;RUGuA=wHgVQttxzw>u59^hoi#R6+4Xw&7_q@zU^wsG4gzl zcUMO&+;3lSs`uZUGW`vyyv^8zx3N-hi1{NTsuC%JFrZV{owH{k%Cttl<-KU>ldah6 zDYv?_v!qQzKmxv!*)~#<QMLE}QHu)RUdblU>3;<bqlSoWQj){6%GalaLy=)1$pHXl z1u&i)PeHGM)EAY3)<?Oee7!}o>ROmr0E9p2(0NH<6>(xi3cJS8y|qB*2Aj5y7yZKN za{kk2<{G5o;Q{WN7U}(i#ZGS^O8|~0Lwh0Xx7pfx3aDX>OPPV2r48i|KOvmTG-J|m z<{j;rX~2mXYiSep!BEPOJ`S1`45jV?=UzvqPBSn2b&cH?ba=j>^%i5cS<vTH$`fsE zKgUx!@CcE|35N(`z3#({LXQO(B+ERD3MzrE&6WmS)Cp)@UIX{a%H5tcNfA`!ReYRH zRepF$k$j%!LqIBo`UWe|RDn6GmV%ZBQJ7#E)$YnZbvpet5t_@MJay#mF&abC*cOtR zFye(N0eZ>w%_M|uz0QG?FK@!!ak(8~AqLO+oBTyLag*3MskUI{``#fLP`nLnPx7bO z3dV)ro)+Jhi4OOf7W(m3n^6@Tw_D~5=@24rOHJ5{eFk1)z0~TR5h6WvT0Pp(rLPXe zE~%8&(2)RqWLg-9K$8xIY+RARH73drj5r`_T$#A#K#Lzsxp@PE;@=*#HzB*9ygt|~ z4Lg0`U2%QDpq`1m{4%}vbD<K6(p(Fa%B)*AArJdehAQ&fzWf896yme$l;x=G%JqQo z;P-ZH^QxLX#V)6^Q*3QUSbI5lrhVLNT3ar(NdRp44#_cMj#G{`9Ti=Ic;e@YtCr42 zqGVfLl>Dy-r!{(KuYk}C<#oT<JwvXr?OFu<@Ax9I$g{w*s^;x!nk=0p$x2(xpv=h_ zT|F@v1AJ?pTrCg7McH>|osgCl#+BJLB9dB)Zq5=m%y&nfR!aDCn>k<LNDO1-JwGrn z$1ONLuO2h1XF4-r(HwHe{m_{ddvai+E4MEzhY!7~b`;d&)Ts&x@US3VV<13Q3h$ms z)w<kBN+b63l)m~ibzLc?`wn*&SvGf8R(v+#3)+fundD+vLPEHcMtM(9zHOs&6VVX9 zHqdS@7j>&MhB=ho4+Trd1$s4LV<MIqN<GP6hBG#Luwfq?PS&V$P&G0WuASr*u7?M= zRpWP!;jW>^BAe>nn5f8NGnuIwfs1)fNUOd_8g)f7)~TNt1Ftb{I~@9II`X2JflDh@ z1S%G%!n++fhSmstJ$yT|(#q~G$Njf&4JzHN*BAM2R^r{Z)}s1*AO~a(=BXn+*qM4o zHZ7ly`|QE-Z=*5Zv$Be{3!NpTE$-KF#FR&wbGlQA^~hmEdrxJ%Y8StcnUH?aws}Y> zxhvRKX|&5IAFPbE6A{vmsq?mz&N5MI5Z95fN_S?oWt1T>{b4-UBiA61V79I}qt8$< zrE00-L93OWJ927fybfK0x9iJ9K;I=s`&?`@r(Btw&QzGFXhxkQ-;|XOMpCmWbiGJ2 zUDvNMN*39HQY>>adI6waQN43ug!=ka+A1ElW^8r=&lxv5H|>x~(oEQZx6)d{E#3bZ zQqQ7OU$MerGgv8C##%XAtX`~)9jQvP+a;SSX^Tf<N4Rvft(y*hm=3&ndft5$y-7fS z1^hmJUafmv{d~eIy3p|o2n#Zo4%k{If{_0y2X_UomUYw(tm-f7pV*vp(?cN7$aVx% z4JlN%kyVbgBqhQ628zMj?O_TF2P(<gx~KEzMd6yxi33`8?q0;qemDKWBQByy83aa7 zYKyCBJHrDwAhVgoV2vNkoJFiFr%S%~zs!AnuSgL-C+;`N5d2IHP;_X+5BXs!?NWmT z6%1#D4=<zPcMQX5>j{tVltHAPYsQ1a_pu%lLGXhuBTtrSnNT;oDw*7p6&rc7ksH&G ziilfi!wKqPjJeqL;#6Ip6UYg##7Tx42$Rjs5SQ99bvO1irKyBFL?KLe#CyJMOtk?> zp{mVcim;GjeEsM(eD(I(T7+O#nW@FgK!bl>>QaPT{VVx6{5r>uF6q9U<tUo-FRk@N z*XwUzghdWEgpS<GN>Jz<=KQeh(Ce1XQUZb5V{)q&E;2%GU%-}~DGsTnEXBkvqo6bo z20CVxURQ)|s_-;{xlu24wwUC`{)X+=FR-pB2+9pZ)8%<p3z_3s*LN6I#y4D>7<3RF zzuTVsD`td!;&lHt>%m+DdNaM!(f%B{>b7>q`hm6>RPUqrlrm$OsTPQ91QWi+-*n;T zsRMOK6z$(HaxWU=qIDTQXMMlVcEgVuN$OUQ%*|F{!1_GM)%=diJPH*$V4wH2xXpy{ z?l-hQoNa1a<nK89(u2x+*Q}ovWYEXyoC8+CGjk0B<nST|8t;PX?us~{o)36l?JKbL z*}50vWbPtPKXC=JGUS)Bpw_%CAZw^=c)L71BlU11snJcAcGSKR+F#3AE{|rFR&U6B z5ByeR_<GivdQ=A8&-_1_1~e#|wfkpQF1NQGF^)O2#eBIcNuFa!E{BT+X1B+)AH16+ zSyYtWVQp)<;lEOD+vrGYPWkh>T5%ACK=s5_#y&0Id_;+LYTKM?22Kg*z0KaZGj=!* zHiy`{ZGS6{YNFG<Jz)$0wGSW!fOZCu0-#KR$nEDnkbqWKrE{*t^Nqx{2CwdZM#G$_ z?4Xea=Bts}aVoeqG1N;gj<3*r%TVeqMciw;3o430N`drpi_TQm{LJx8<KqS}V3P6J zCsZ_n!_b4?g-bBjD1^ro%ZuGkTA{KkSEhHti)j_BlMQEdbmbLL#CcVm5u2|mcRcmY z-R94WEed9NTDwzvbIoFX-lAW}_D0Tm>F!1k(l?5}-S%~VNJW!$2fLhJS%2<j5boW3 z?(jA2P|RS*WA~)dlENwnTHm6!67G7B*>MKoi1%uHdL>$66Nf_sf9f#rT)RRq2*}e( z+>jXAqxNNtWfR8BCIf&Y7h-;Xlt<BlLGp|5#eHjvaYuO4Pfvs-dQJ4|DgT+bAw+QY z+DkhNxVWfs3^=FOW9QAy-PJ3BQCi{n*3j6_F^!|6BR|gLGBL+&&vveuRn7o?6q+s% z>%x~&?43B*ZhEoea&_T_nlqH=V3Ugk0_Jd}R4^MQj5WZWl;`5n)hSB4+<s^XQp=gE z&#{k^ZN7NX8cB8wo^$4;T_col?$}|LMN^g|o5>2W;6}K6%ovTIHJmiH^O9N3obA5C zQ1~@EhAQG=YhKW2FdEuO5_~0ptXAPU8m?YWn2SM2y~%)d*k1{+Rj7>RYF^w+sBq(D zEZ#!<+$^#@>npxVyHKVTt6p57zjMm~#<bsTG68ia^I7|qHQcf?Q?!Z9q@M)hkC|Nu z%f=-yV2&Rp)jGUne-xv^H`Ge{Aw5jgJ{QP8=zT)pF+Ta5hBZHG&#7vcsD~bjyXu|N zE;$a1@nu#5rp7v|Dq~@2Ym{dg<__IETH~pi7*_Z#Qq+d1JaQdXBR+#%80FH(3Q$jN zOLzDwOZUQo_r}nf%>6p5BJSFk&0EFTxmc?w@u*8n+Y%F9NrZA?S=X`|2`IpN$S}-t z9M_p6#qxn70xT6LD}n32Dt$&IwSSSe4RWRFZ`#Z>R|zmC0E-v~@@{o*+^}?mI1Q*n z%c(LCOqiSxzK2}Y)IsR5e|eQ*!3NEKXgRYhe4#eA<cU~xC|)~;ePYtda+v%fJ$+Z> zQ!#|efv6|$gCuVYUw;uxNJD(DmDBBip{d{O5GCI=th&!22_dP`&Af<hTa|(0iAi!m zSTixWl?}0e1!zBhH{BiOwKrd(iX+(bWc|oU88R{a6F|KXyojfB$XKa9pUXqgHBf=P zoxEN~{{uVPyd9xYpyEf}`|S+X(BANq?=VLDn^`EO=2fjC=VOaJ9F8}=zeis7$Yz6B zB7$oiS42T;pU!@qKhH106U>eV6Y0w$ls_p}21O(6Vq4GGH_8)1r;b~Bj^8jx@bH0} zmqFEw1QE!cDVdr6I|}kwp`W(Z`pXy@8?vJTs%Vdq>cL`w0svv7D5LyxXT25pz0&AY zaX#6!ar4b9AOhlV4-U0k<@hqNMy^^vNEjxi_FD@8b)6qYo$P8~!Vkl!vb~u?IiN;W zQ93@>r-e+-Ui^z<x=mUY#)-YOfiY!|Z`nKpRtOrVMFZ{?P&tnI3h)8nB-SzA;z>S? znbV7_jnzwk>(v^F#JmYX6jg&IZGInwhRrPLAYO3-bTCNsm8DiUH5v^@nPkGm&<&y> z?bCX<0}t7p0;(dzv?-QeJi>T^TYd(z2`5A*5Mzvb=G{EhnFZC32SMqTohYtffezL+ z>}-i4Gmd(k)m}iUB<1pR@HXcl;nuN!b?-ojW?WX&P`idAt_W)fWnrHLbR~6Meddhf zF~B90JHCCOfU2#~4KbjoXJxwY72rL;R`;{;6@ZdxpmVLKup4?gG75x;M2q!`DGP>( zJxqpA5A`2cSuB|;i=-2(vc3Wu*-gJZlNBl7dyDR`9`yv>kuJRgu!x>Xs#F5&O6ShT z)AO%sPhM8ms&-+S`kw?6rM6yzd!DymMw`%AOfW?sEy!L>?sV#MpYL;xPX+XzvcZo; z;EIHTre^z&iCgTDiIAP#msSeKD8<imc}?B!kgDTyW7hf8q!chMEXg{J!1VT}V}o3W zNs0eQk#m*WBI6#{g>VzwLIxg!yn~fmmCv48=ILETi)1Vcj>KMl8qgt=r`3K1wnG|t zaR|iFYP&m8zKPdAo;Q0<Zi4K(o*L^M8jIuJ9ZuuyI_Z-!n*7c&s<>|P6v*j}&PCN0 z^o{yyUL4(Jcj=}C<7(IK(CG;wI%AYoQ!fv*2dTno4nPH!eXPUH{1RW>(NUq}l-a0p zsih#j3KR*bu^aYoRUCm8s?y9G9?2$N)JQ1i<Qig1lqe_~I+KIn*5aOmR<*Il6Txo3 zTMx(=*IFyq^u>88i2T-)s9@B@V$Uqqn(CxEC!>UTFvg`Ijy-2IYbk$h6A}(xSpXn% z#{afWXz|#$c4YUFSr_BubG>?*7O<%&qj@XlT2jq{p08c7V$ZWsA{x!m*v0S8=8;?X z3`*)qUWzY9??=!Qp|~+;!n>$S7wa~%wDjies{m0R3os3($M(Vj!93%(XdLC)Z*(<- za4n0pFWZsuvq{pbd+V0Fjv8O>izNZU((;_aO1}UQvVbQcmAM<npn&V;08y)s-UHDd z(Vew=H_dshwZQtV?WfzV2N9j0TTLc^7J}OKo^9Ry1)#S1PUY%4ACZZmaKBvCI9pAG zLY2h@EOH&_scW}JKnUdnK7H;jffD9J!1D*CzwjYO4Hj5X&qx0<ixqeBP=M3i5sYv_ zrz!Y~=C*C8o7XJfkj;-K4yx+WVx}%0f|=*-=0=jN9-ACcS~A%BdDM1!FV|f|xTsaF zS+Pw_Xo#saDyJ;M1wc}k1gOec1O-#w9NBBGNGFWx_8UD2%>_ydrN;M$>)8np5sxOs zx>bP((hUtafL*ZBpA?JL2jdg8j5(H5!~{uA!an9(6@GF4rt<N5EctpNBzvS;iQV2$ zaGyoIiV9ACBI6cY)~q_KIndYh?UyD^gSN*h9<F8lQIL6wwF4s^qZBryX&aQccf2c9 z<$UE{mTuy`XrpRw@Gcy&ZJ8#6?V>&5QAcV8@tS}8{O<Ax75VYuO{SU8{A(I+O;V=# z<J#}+1xc%ei+<P~>XBQf$x9=*%i1}06K=5_`zG5z1D{2Oef0Bt7On-{8upDuAHRDh zL^QcojdTsCz6;I_uU#=Pa-rTuX5|6X@Q~mZ?}fpAj2<W8R;aYW5yxaFE(Ih>5+!^r zClA)*0mgM@7!4))ASs{Ve3v_!rwcniLteIRn@*_!Kz+k-M=#V+Qij@eBI8F0yo3xd zF5c<C0_y+Z2($co@V>6%i(+b5UMLS>mfaDmB8zm0{1g8j-B_=<elPHY^g5+i<UFwi z9UP6Qk<)@T#yYPv`lCh0$7PMv0URv6^nn;6_ez9>g9=fdHiDkK2YWm7wvrz8XX|cD z#sjSpJ^}tkb_>gH!z*nLq4{Kf#Qw_faM4k+<mx=~(uk7SLr_<3V$z=zuq2Ip)v99j zm5aFPYy;94`yl4MK4(izC7SV_6<WW_o4j|N7ir87iuRuGioV8?&NOsK3PC=6x9r<b z7ZxXBxH!>4kQ1;&p`CRYlRDOORO$TGjGs_zzq=gk)P&`A!7*f}i*KWF?GidLqg50E za%Uj1Kq;cN_+2W7Bm?Wc{+w1B`Oqb@Hb0r=q9rM`(>X-m)9QLq;TNV)DyLV8wpFiL zS$M;0#o@vjCZP{+R^(NK?wS+sx*lRqTtGvbcGS9iw*21l9uIQ_L2akHn3Mg^$dC!( zR2;)j`E%cpC=(pey}wL67vE8O(YlAEq1wS-uSexFdofNVqz(|LKZSxHaJ^0j%A71# zalZgR^$3mg6nMJt(CwbFRB}!gjdmFTv+LHNqA^v_RiGnz0>~xE`m~fy1RYf}hufW) z9@H#q)q~Ils8nV95}Ag?sVZPp;eT?Wmn|AIovW-Zo(GevP%2GZZ@9xyv&6bm>D*Oo zSRC782VUpV%abx<D1^`e<*w-ycei4Wd%WXcnCr#R9$%j4tjOROS9sBlUj*HIZ`!t| zn9O$kW^X#<?48=XMHlXac1|b<gb_T#Ki4w9pVH8b6%<q2h7S}EkBdA02?-XfWQ?;T zMb!z%WA$f%p3W!N-VrXd{ECew%8P-r=hJXF7G^FTSVJ}R%<Nk^a9$qj6gz_0J0Zeb zYyU7H$TG|;PxjH`jA)69J^<U>0FS_=k6<rt_Q*J{ls;Sc-eX9)<cLeX!&?1Y!9-l~ zItnHc!RmIgOCaB;ltf&Y$sciG(lHJO2GB@Hj*Qb>lovA8yp|frWY-WTNkWf9?7CKq zQ3($xViN;7?hK>g`=P#0Tk0g~<@H40%iZRUMIx^@rN%Dd?|FJn=Mkd3a&sE>o?f4e zO@nt9HF1$!)Jz#m|2WQQyUd_7Pw)``T>Uz03<-*;|BhQ@s{DQVqPnVLh?O;sO1rD$ z=V54DAxu{f$)o<A$YeW2C7pF2ujDu~BxGdZ@LFD!iXY||ZhLQn!n*OT;6-2O_4tj^ zNwA24nJJ_}oNb5VkAZ=rC811d+pIr$ceY@vAs5(8Q;QlE?$9QX%P|jnpAHJi<Efla z^)c^F&9Ql|(5LiN9{g_D0W;vZzb+Ws-zu4TN;I_JS!%Tbm4(qyNhD+^$uu^!y&)tS z^EL~J)^_tBDQ*SUNWZ&u-`fA0&TBXL<o<r}&Ob=kCZ1Mi-lI0z6PE<6k*`sMV@;xS zm<;>VL3#D-&T~TD-S=TLnSN7cLK^<nQtDm}P<T#aRy$M4IG2S3QVJrmEmB+;zZXW3 z-%6`MTPgZd3|>_>APiVV-V&*Yzp;Y-aghXV^4#8d8KIf<$(eQ9YwNQYN=A?V1!UN9 zDg+Bvq&obP4^=Vanzm$CnBMr{nXrFXEvyG_MBnhxLokFhOO4+6@CR4kvkbgqBPR7- zwg#A$!@oF6%?X|V%PHER3OoPXoa*oI0<XJa(IJ>d;Blb(FjO8ZB(X7JE_`596+cu- zFz#kjfBbUBM|8Fn;I;Ylf=bW@(r5M{WBF(Ah01AgC|TX8=@meLvR2Wt{A923z&FQQ z2cEBj_njpfoR@AXb99r+_!!<sCtEMasZB`eNV7IFCY(?`F<5K8qqWlG9Hjwd$SEk# zzGoVl_f42H5iS2Zk7m%NHruLmf6LX{eWGA2f!>3W0c;&pG1+EIe+;t>0#F$Q8#fA? zflwDbk6=`dyy$U-VO+>V3f0S+#dY(#;g~VBFCYAw%r-s%eJAWf>f%pz6-_DX+VaqR zQydk<)g>i#%eO{q2;lJViUsL?kattiQ6nqV?JAX17^BPjG9U&u4|Q?!gdIF;j5684 zX_YyO-_#4UDg@@*7g0;?_Y*O(B!0C`GT{lg?9&#vE&f?&EcgS#9n8TRys)h_2eecj zF~Uu2Wou$8OW?Aj3Q4g5U^7Qaw{HKQeUp*0Ea~u&ah3ga|EezI6NGwalkZc80^&~$ zKte8`7<y!erc_L1`~~^Pu}`Q-B=p!Ur?P7IfgSk|liY*pMr^`*kb|@(8uRRKJG*W` z^&h#_{Ksd@s=3sbdRR|ecCL&}a|L?k;rq7l<${rF>{=AKNA}T}m)E~5%YMYXN1hX? z6Y6zvLR{p~t!y|P37!+oq%l~nCC@5lhgK$Nu|OrYK?>)yLfeOW$HQ^AK2ML^_Ha`4 zvcBchJJ`xI$cO=n$lvM;65@MFXx;8!lRaDTe8x$e1BoyA@^pl2RmXm?G_xwwCdG5n z;E+#@O|frk3)3*FDppi`h9(N*`}py+obq7zdqbYZtZ1x%C$k;1?S!xFMM63#?*Ajs z4sQMi|9SVfvcz`_TVcN4Axy;{np^he?uD~)RH<A0GqB&ctBux<PF7M!Qqs8?@87>; zIg?m4EL4ZW-8~5zhnJAaEt4(lVpvUZALkiil=ei`Wh5Va6YokFCIhD+g2pSNmv`Pm z#FEHab^vnyIt-2@vLO+p%KDNxfdsi1j?2^k4QI=wAxuGRN2jV2JM-8_qZQvP-<TX^ zayBX-@nb!VSQF@|FYoV199GbIYm+mUi@T9P`jaw8gp`YbHr&a{-a5;n58H@!N8yHY z_#m)LQ($96UQvMn>%;Qtdpqda#-vXUS@h6nit4nPh^mZeiSp!_(118I_ZZ~t0Am~= z^F8emeP{SLY)pz2Es!ScoDwG><CnmMDT9J4+74CIY8nsPP4KASlJ9eGx8KRFmwBDQ z#?}BCyuakiZ>PQIwTHQwpldQw$d#u-+1yD*ugUV$P2I_S*@4Q7eEPo00p2xiFZ(NC zBIwW7A#d8ngK<T~*;9~c#6daPF@~N0N%~m6s-Mu&zDl`pp8I9lJn1yhN8=d7I#;OT z8liD2PxB#k<(CR$fcWWES*l3EjnCZwWraHR-j|v0K}}mr>Q8^3nqGX^)=cJJ0oE_+ gp3{-f9iJY{Zo2Fp^KXMDUjbgvdF$7+b+0S`3yJ|aHUIzs literal 0 HcmV?d00001 diff --git a/modules/hipay/de.php b/modules/hipay/de.php new file mode 100644 index 000000000..b2e2fc021 --- /dev/null +++ b/modules/hipay/de.php @@ -0,0 +1,50 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{hipay}prestashop>payment_cb047ebd77ec02c36fbac405f8c9922c'] = 'Bezahlen Sie mit Hipay'; +$_MODULE['<{hipay}prestashop>payment_35d5d65e0fb908f81b8c36820ddd7cc6'] = 'erforderlicher Minimalbetrag , um mit Hipay bezahlen:'; +$_MODULE['<{hipay}prestashop>payment_e755d43d98e3d597b4492d2e6493ffed'] = '(Sandbox / Test-Modus)'; +$_MODULE['<{hipay}prestashop>hipay_50089d40ef4536271e8b16dbe5763c01'] = 'Hipay'; +$_MODULE['<{hipay}prestashop>hipay_3a630598b9817a76dbb984ba467f6400'] = 'Secure payement Visa Mastercard und europäische Lösungen.'; +$_MODULE['<{hipay}prestashop>hipay_5063b1c7402ff93d09defb875fa0085b'] = '[Hipay] Fehler: kann keine PaymentParams erstellen '; +$_MODULE['<{hipay}prestashop>hipay_a85eba4c6c699122b2bb1387ea4813ad'] = 'Warenkorb'; +$_MODULE['<{hipay}prestashop>hipay_d4126d0b64579211d37151ef9b5af754'] = '[Hipay] Fehler: kann \"Warenkorb\" Produkt nicht erstellen'; +$_MODULE['<{hipay}prestashop>hipay_ac2e397ffc0808f909e9712ca575c121'] = 'Gesamt Bestellung'; +$_MODULE['<{hipay}prestashop>hipay_0f750bac4745ff32a0c4a4c663ae6b9f'] = '[Hipay] Fehler: kann Bestellung nicht erstellen'; +$_MODULE['<{hipay}prestashop>hipay_8eafa453be20eba610cc8f5a8170681c'] = '[Hipay] Fehler:'; +$_MODULE['<{hipay}prestashop>hipay_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{hipay}prestashop>hipay_0851f7a0844553fa1168718de0f87262'] = 'Sie sind nicht berechtigt, externe URLs (allow_url_fopen) zu öffnen'; +$_MODULE['<{hipay}prestashop>hipay_6401593f1412a6b385c8e645d1f056ac'] = 'cURL ist nicht aktiviert'; +$_MODULE['<{hipay}prestashop>hipay_f8b94463fa8b5591e5edbbb8021e8038'] = 'OpenSSL ist nicht aktiviert'; +$_MODULE['<{hipay}prestashop>hipay_54457f20f1d9f9d7cf14d8e928cad1aa'] = 'Kann nicht auf Zahlungs-Gateway zugreifen'; +$_MODULE['<{hipay}prestashop>hipay_527557971b02f68ead6a278fb96ac396'] = 'überprüfen Sie Ihre Firewall'; +$_MODULE['<{hipay}prestashop>hipay_1c5f361b20c116ab2324e28b1ac54e12'] = 'Ihr Shop ist nicht online'; +$_MODULE['<{hipay}prestashop>hipay_66170e45eb6eb71c35fc3b259a866ff7'] = 'Hipay Kategorien nicht für jede Seiten-ID eingestellt'; +$_MODULE['<{hipay}prestashop>hipay_1a1a01512e42b64541ed9b1f43a56036'] = 'Unmöglich, Hipay Kategorien abzurufen. Bitte beziehen Sie sich auf Ihr Fehlerprotokoll für weitere Details.'; +$_MODULE['<{hipay}prestashop>hipay_01ad06b7c5887516f56ff824278feb67'] = 'Hinweis: Wenn Sie eine Zahlung erstatten möchten, melden Sie sich auf Ihrem Hipay-Konto an, dann gehen Sie zu Merchant Management> Verkaufsmanagement.'; +$_MODULE['<{hipay}prestashop>hipay_254f642527b45bc260048e30704edb39'] = 'Konfiguration'; +$_MODULE['<{hipay}prestashop>hipay_d86590564b22be4d3b242472722bf969'] = 'Die Konfiguration von Hipay ist einfach und erfolgt in drei Schritten'; +$_MODULE['<{hipay}prestashop>hipay_f21850b58e4866b30f7d3724cc29edb1'] = 'Melden Sie sich bei Ihrem Händler-Konto an'; +$_MODULE['<{hipay}prestashop>hipay_dc32882bf2b1893d53aeaaa862c46d5c'] = 'Erstellen Sie ein hipay-Konto '; +$_MODULE['<{hipay}prestashop>hipay_854348e0cffd068204ce979351b2eb10'] = 'Aktivieren Sie Hipay für Ihren Prestashop, es ist kostenlos!'; +$_MODULE['<{hipay}prestashop>hipay_b7ce0a1dce723a074049b88fb22dbb4d'] = 'Erfahren Sie mehr über Sonderkonditionen auf Transaktionen über prestashop, indem Sie'; +$_MODULE['<{hipay}prestashop>hipay_7667c2b31b9980267cb526ed2f0d235d'] = 'unseren Support kontaktieren'; +$_MODULE['<{hipay}prestashop>hipay_08bd40c7543007ad06e4fce31618f6ec'] = 'Konto'; +$_MODULE['<{hipay}prestashop>hipay_9596f310ab4657258496ab217d3b5d85'] = 'Echtzeit/ Betrieb'; +$_MODULE['<{hipay}prestashop>hipay_aeda5c9c68fbc42071d76a8d2b3d73e8'] = 'Sandbox / Test'; +$_MODULE['<{hipay}prestashop>hipay_d08cf8ae06cc7e3151aad4618c6efe3a'] = 'Konfiguration im'; +$_MODULE['<{hipay}prestashop>hipay_0f26e4f64d58beb4d924627c707e43ad'] = 'Kontonummer'; +$_MODULE['<{hipay}prestashop>hipay_315f3c78ea54c8dadb082acc328dd5bd'] = 'Händler-Kennwort'; +$_MODULE['<{hipay}prestashop>hipay_b250a007769c7ffe655c74cfb8176b8c'] = 'Seiten-ID'; +$_MODULE['<{hipay}prestashop>hipay_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{hipay}prestashop>hipay_5c5fe383c7a097fea1d804ddbc83f4c6'] = 'Test Kontonummer'; +$_MODULE['<{hipay}prestashop>hipay_4de3b490bff03a1e715d142cdd41d3f4'] = 'Autorisierte Altersgruppe'; +$_MODULE['<{hipay}prestashop>hipay_a19a3f71c627a4bde1e016a46f313799'] = 'Für alle Altersstufen'; +$_MODULE['<{hipay}prestashop>hipay_1ddfab06495a5d2dfcf174034546502d'] = 'Ab 12 Jahren und älter'; +$_MODULE['<{hipay}prestashop>hipay_524fefef83fd5b0b82292a5366b40cd2'] = 'Ab 16 Jahren und älter'; +$_MODULE['<{hipay}prestashop>hipay_4f47a2eb5f2af6c1419baa17794e5f03'] = 'Ab 18 Jahren und älter'; +$_MODULE['<{hipay}prestashop>hipay_0d10a9cae9827e30b09913c1ec6ef2db'] = 'Hinweis: Bitte sicherstellen, dass der Währungsmodus, den Sie im Zahlungs-Tab gewählt haben, mit Ihrem Hipay Konto (en) kompatibel ist.'; +$_MODULE['<{hipay}prestashop>hipay_c80a51a60c5ee43553c3881459b8f431'] = 'Konfiguration aktualisieren'; + +?> \ No newline at end of file diff --git a/modules/hipay/es.php b/modules/hipay/es.php new file mode 100644 index 000000000..0f0d924c4 --- /dev/null +++ b/modules/hipay/es.php @@ -0,0 +1,45 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{hipay}prestashop>hipay_50089d40ef4536271e8b16dbe5763c01'] = 'Hipay'; +$_MODULE['<{hipay}prestashop>hipay_035ab5edb2d8af86d51f6a92e65b4c0f'] = 'Asegure los pagos de Visa Mastercard y soluciones europeas.'; +$_MODULE['<{hipay}prestashop>hipay_5063b1c7402ff93d09defb875fa0085b'] = '[Hipay] Error: imposible crear PaymentParams'; +$_MODULE['<{hipay}prestashop>hipay_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrito'; +$_MODULE['<{hipay}prestashop>hipay_d4126d0b64579211d37151ef9b5af754'] = '[Hipay] Error: imposible crear el Producto \"Carrito\"'; +$_MODULE['<{hipay}prestashop>hipay_ac2e397ffc0808f909e9712ca575c121'] = 'Total pedido'; +$_MODULE['<{hipay}prestashop>hipay_0f750bac4745ff32a0c4a4c663ae6b9f'] = '[Hipay] Error: imposible crear el pedido'; +$_MODULE['<{hipay}prestashop>hipay_8eafa453be20eba610cc8f5a8170681c'] = '[Hipay] Error:'; +$_MODULE['<{hipay}prestashop>hipay_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración actualizada'; +$_MODULE['<{hipay}prestashop>hipay_0851f7a0844553fa1168718de0f87262'] = 'La directiva allow_url_fopen está desactivada'; +$_MODULE['<{hipay}prestashop>hipay_6401593f1412a6b385c8e645d1f056ac'] = 'La librería cURL no está activada'; +$_MODULE['<{hipay}prestashop>hipay_f8b94463fa8b5591e5edbbb8021e8038'] = 'OpenSSL no está activado'; +$_MODULE['<{hipay}prestashop>hipay_54457f20f1d9f9d7cf14d8e928cad1aa'] = 'Imposible acceder al servicio de pago'; +$_MODULE['<{hipay}prestashop>hipay_527557971b02f68ead6a278fb96ac396'] = 'vérifiez le firewall de votre serveur pour le port 443'; +$_MODULE['<{hipay}prestashop>hipay_1c5f361b20c116ab2324e28b1ac54e12'] = 'Su tienda no está en línea'; +$_MODULE['<{hipay}prestashop>hipay_66170e45eb6eb71c35fc3b259a866ff7'] = 'La categoría de productos Hipay no está configurada para cada ID del sitio web'; +$_MODULE['<{hipay}prestashop>hipay_1a1a01512e42b64541ed9b1f43a56036'] = 'imposible recuperar las categorías Hipay. Vea el diario de errores para más información.'; +$_MODULE['<{hipay}prestashop>hipay_74e0ddca931daefcd88f3c118e8eb0f1'] = 'Hipay es un monedero electrónico seguro que tiene el aval bancario europeo. Hipay le ofrece muchas posibilidades, sin necesidad de negociar con un banco. Fácil y de uso gratuito, la solución Hipay constituye una real ventaja para los sitios de venta en línea que desean expandirse por Europa: pagos seguros con tarjetas internacionales, soluciones locales de pago, transferencias bancarias ...'; +$_MODULE['<{hipay}prestashop>hipay_01ad06b7c5887516f56ff824278feb67'] = 'Nota : Para reenbolsar integramente una transacción, vaya al sitio www.hipay.com, en la gestión de venta Hipay/gestión de las ventas.'; +$_MODULE['<{hipay}prestashop>hipay_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{hipay}prestashop>hipay_d86590564b22be4d3b242472722bf969'] = 'La configuración de Hipay es muy fácil y funciona en 3 pasos'; +$_MODULE['<{hipay}prestashop>hipay_f21850b58e4866b30f7d3724cc29edb1'] = 'Acceder a su espacio de venta Hipay'; +$_MODULE['<{hipay}prestashop>hipay_dc32882bf2b1893d53aeaaa862c46d5c'] = 'Crear una cuenta Hipay'; +$_MODULE['<{hipay}prestashop>hipay_854348e0cffd068204ce979351b2eb10'] = 'Activar la solución Hipay en su PrestaShop, ¡es gratis!'; +$_MODULE['<{hipay}prestashop>hipay_b7ce0a1dce723a074049b88fb22dbb4d'] = 'Disfrutar de precios especiales en las transacciones a través de PrestaShop '; +$_MODULE['<{hipay}prestashop>hipay_7667c2b31b9980267cb526ed2f0d235d'] = 'poniéndose en contacto con nuestro departamento de ventas'; +$_MODULE['<{hipay}prestashop>hipay_d08cf8ae06cc7e3151aad4618c6efe3a'] = 'Configuración en'; +$_MODULE['<{hipay}prestashop>hipay_0f26e4f64d58beb4d924627c707e43ad'] = 'Número de cuenta'; +$_MODULE['<{hipay}prestashop>hipay_315f3c78ea54c8dadb082acc328dd5bd'] = 'Contraseña vendedor'; +$_MODULE['<{hipay}prestashop>hipay_b250a007769c7ffe655c74cfb8176b8c'] = 'ID del sitio web'; +$_MODULE['<{hipay}prestashop>hipay_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoría'; +$_MODULE['<{hipay}prestashop>hipay_4de3b490bff03a1e715d142cdd41d3f4'] = 'Edad mínima'; +$_MODULE['<{hipay}prestashop>hipay_a19a3f71c627a4bde1e016a46f313799'] = 'Para todas las edades'; +$_MODULE['<{hipay}prestashop>hipay_1ddfab06495a5d2dfcf174034546502d'] = '12 años y más'; +$_MODULE['<{hipay}prestashop>hipay_524fefef83fd5b0b82292a5366b40cd2'] = '16 años y más'; +$_MODULE['<{hipay}prestashop>hipay_4f47a2eb5f2af6c1419baa17794e5f03'] = '18 años y más'; +$_MODULE['<{hipay}prestashop>hipay_0d10a9cae9827e30b09913c1ec6ef2db'] = 'Nota : Compruebe, por favor, que el modo de gestión de las divisas que ha elegido en la pestaña Pago es compatible con su/sus cuenta(s) Hipay.'; +$_MODULE['<{hipay}prestashop>hipay_c80a51a60c5ee43553c3881459b8f431'] = 'Guardar las modificaciones'; +$_MODULE['<{hipay}prestashop>payment_cb047ebd77ec02c36fbac405f8c9922c'] = 'Pagar con Hipay'; +$_MODULE['<{hipay}prestashop>payment_35d5d65e0fb908f81b8c36820ddd7cc6'] = 'Importe mínimo para pagar con Hipay:'; +$_MODULE['<{hipay}prestashop>payment_e755d43d98e3d597b4492d2e6493ffed'] = 'sandbox / modo test'; diff --git a/modules/hipay/fr.php b/modules/hipay/fr.php new file mode 100644 index 000000000..bf67c18b1 --- /dev/null +++ b/modules/hipay/fr.php @@ -0,0 +1,45 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{hipay}prestashop>hipay_50089d40ef4536271e8b16dbe5763c01'] = 'Hipay'; +$_MODULE['<{hipay}prestashop>hipay_035ab5edb2d8af86d51f6a92e65b4c0f'] = 'Paiement sécurisé Visa Mastercard et solutions européennes.'; +$_MODULE['<{hipay}prestashop>hipay_5063b1c7402ff93d09defb875fa0085b'] = '[Hipay] Erreur: impossible de créer PaymentParams'; +$_MODULE['<{hipay}prestashop>hipay_a85eba4c6c699122b2bb1387ea4813ad'] = 'Panier'; +$_MODULE['<{hipay}prestashop>hipay_d4126d0b64579211d37151ef9b5af754'] = '[Hipay] Erreur : impossible de créer le produit \"panier\"'; +$_MODULE['<{hipay}prestashop>hipay_ac2e397ffc0808f909e9712ca575c121'] = 'Total commande'; +$_MODULE['<{hipay}prestashop>hipay_0f750bac4745ff32a0c4a4c663ae6b9f'] = '[Hipay] Erreur : impossible de créer la commande'; +$_MODULE['<{hipay}prestashop>hipay_8eafa453be20eba610cc8f5a8170681c'] = '[Hipay] Erreur :'; +$_MODULE['<{hipay}prestashop>hipay_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration mise à jour'; +$_MODULE['<{hipay}prestashop>hipay_0851f7a0844553fa1168718de0f87262'] = 'La directive allow_url_fopen est désactivée'; +$_MODULE['<{hipay}prestashop>hipay_6401593f1412a6b385c8e645d1f056ac'] = 'La librairie cURL n\'est pas activée'; +$_MODULE['<{hipay}prestashop>hipay_f8b94463fa8b5591e5edbbb8021e8038'] = 'OpenSSL n\'est pas activé'; +$_MODULE['<{hipay}prestashop>hipay_54457f20f1d9f9d7cf14d8e928cad1aa'] = 'Impossible d\'accéder au service de paiement'; +$_MODULE['<{hipay}prestashop>hipay_527557971b02f68ead6a278fb96ac396'] = 'vérifiez le firewall de votre serveur pour le port 443'; +$_MODULE['<{hipay}prestashop>hipay_1c5f361b20c116ab2324e28b1ac54e12'] = 'Votre boutique n\'est pas en ligne'; +$_MODULE['<{hipay}prestashop>hipay_66170e45eb6eb71c35fc3b259a866ff7'] = 'La catégorie de produits Hipay n\'est pas configurée pour chaque ID site'; +$_MODULE['<{hipay}prestashop>hipay_1a1a01512e42b64541ed9b1f43a56036'] = 'Impossible de récupérer les catégories Hipay. Merci de vous référer à votre journal des erreurs pour plus de détails.'; +$_MODULE['<{hipay}prestashop>hipay_74e0ddca931daefcd88f3c118e8eb0f1'] = 'Hipay est un portefeuille électronique sécurisé et possédant l\'agrément bancaire européen. Hipay vous offre de nombreuses possibilités sans avoir besoin de négocier avec une banque. Facile et gratuite, l’implémentation de la solution Hipay constitue un véritable atout pour un site e-commerce qui souhaite se développer en Europe : paiements sécurisés par cartes internationales, solutions de paiement locales, virements bancaires...'; +$_MODULE['<{hipay}prestashop>hipay_01ad06b7c5887516f56ff824278feb67'] = 'Note : Pour rembourser intégralement une transaction, veuillez vous rendre sur le site www.hipay.com, dans la gestion marchande Hipay/gestion des ventes.'; +$_MODULE['<{hipay}prestashop>hipay_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{hipay}prestashop>hipay_d86590564b22be4d3b242472722bf969'] = 'La configuration de Hipay est vraiment facile et fonctionne en 3 étapes'; +$_MODULE['<{hipay}prestashop>hipay_f21850b58e4866b30f7d3724cc29edb1'] = 'Accédez à votre espace marchand Hipay'; +$_MODULE['<{hipay}prestashop>hipay_dc32882bf2b1893d53aeaaa862c46d5c'] = 'Créez un compte Hipay'; +$_MODULE['<{hipay}prestashop>hipay_854348e0cffd068204ce979351b2eb10'] = 'Activer la solution Hipay dans votre PrestaShop, c\'est gratuit !'; +$_MODULE['<{hipay}prestashop>hipay_b7ce0a1dce723a074049b88fb22dbb4d'] = 'Profitez de tarifs préférentiels sur les transactions via Prestashop en'; +$_MODULE['<{hipay}prestashop>hipay_7667c2b31b9980267cb526ed2f0d235d'] = 'contactant notre département des ventes'; +$_MODULE['<{hipay}prestashop>hipay_d08cf8ae06cc7e3151aad4618c6efe3a'] = 'Configuration en'; +$_MODULE['<{hipay}prestashop>hipay_0f26e4f64d58beb4d924627c707e43ad'] = 'Numéro de compte'; +$_MODULE['<{hipay}prestashop>hipay_315f3c78ea54c8dadb082acc328dd5bd'] = 'Mot de passe marchand'; +$_MODULE['<{hipay}prestashop>hipay_b250a007769c7ffe655c74cfb8176b8c'] = 'ID du site'; +$_MODULE['<{hipay}prestashop>hipay_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Catégorie'; +$_MODULE['<{hipay}prestashop>hipay_4de3b490bff03a1e715d142cdd41d3f4'] = 'Âge minimum'; +$_MODULE['<{hipay}prestashop>hipay_a19a3f71c627a4bde1e016a46f313799'] = 'Pour tous les âges'; +$_MODULE['<{hipay}prestashop>hipay_1ddfab06495a5d2dfcf174034546502d'] = '12 ans et plus'; +$_MODULE['<{hipay}prestashop>hipay_524fefef83fd5b0b82292a5366b40cd2'] = '16 ans et plus'; +$_MODULE['<{hipay}prestashop>hipay_4f47a2eb5f2af6c1419baa17794e5f03'] = '18 ans et plus'; +$_MODULE['<{hipay}prestashop>hipay_0d10a9cae9827e30b09913c1ec6ef2db'] = 'Note : Merci de vérifier que le mode de gestion des devises que vous avez choisi dans l\'onglet Paiement est compatible avec votre/vos compte(s) Hipay.'; +$_MODULE['<{hipay}prestashop>hipay_c80a51a60c5ee43553c3881459b8f431'] = 'Enregistrer les modifications'; +$_MODULE['<{hipay}prestashop>payment_cb047ebd77ec02c36fbac405f8c9922c'] = 'Payer avec Hipay'; +$_MODULE['<{hipay}prestashop>payment_35d5d65e0fb908f81b8c36820ddd7cc6'] = 'Montant minimum pour payer avec Hipay :'; +$_MODULE['<{hipay}prestashop>payment_e755d43d98e3d597b4492d2e6493ffed'] = '(bac à sable / mode test)'; diff --git a/modules/hipay/help.png b/modules/hipay/help.png new file mode 100644 index 0000000000000000000000000000000000000000..f5abce06b1ca52bdf8c330e738edb9ef0af69c0d GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cM#li35Z8|%KR$f;P$YVt@6=1P*ByzPcfD-Eh5eUbhRnR; z)_2aX^NdjB+Vq9jb#k^#$8WIhJQK6vX2Rq%aSLzcuY0iI@RR%%H-)3tr7XXbwD?w1 z_nwTEcdM6OO<8hFIBM;Nb1$=2-^*M3Ah~yM@y1625o_(5j;=fX;@r7&Y0K|S+xNty z?`*~Td-5d*Boj7fF2Ci`bt-E9b(M<4Ce0_}=HEzIbTfO+eW|$hH9MY#&ABESw^1T) z<D3JJVi(=&-T6Q=etrG=+oI9yrQ$Y*&bksY=c-Hp`Jm~SgJxXWd;MMdlAAUiXRbW` z5<KmqOYhl(H{Vuof5soN)@$-bvzAk7EAIMCx#TtVvU~q|&&e0PCtnPjd9`Z8U7fn4 z{xh!Fcb$<fIp{v|g72gY;d8F-zwy?f;e>YWQKP04qIvrx=3X~zJ+=Pq%QI)r{0D=T z&t8F|AiE^UFBl?150ar`rt3qXwI4lQ978H@sq{NfV__6v-MnU7?(MSv+}Tqr|1<l9 zo{#@4zM4ZJ`H?~GB)P6<stS|D&IP_PH!IRx!aHHjJkO1PLiPM?!cMX@uUTs7d?fPl zBv}aup6c1(E53YbllRS!P?;h2=9T2WJ@OBhXX*QJ)~G&x^&#-@&EvMNnm;*iXdN#! ze=U2bcHe_lItTacoAUH+_8#lIlcs;QY|MQs(DMHF>Gp8Pf;BlTCw=TLlzrX!K8yX+ zOcln%+pHA-OC0|fu>7b|n?!u)k~<$i@30nK`C*ynhl^2*%I|nzS!9#*$brAi)b}-8 p>5uiQNkzNXJ)hzGZ$1Mv!y6NeL+{%e5`ms)@O1TaS?83{1OUCl!Ds*g literal 0 HcmV?d00001 diff --git a/modules/hipay/hipay.php b/modules/hipay/hipay.php new file mode 100644 index 000000000..205b66110 --- /dev/null +++ b/modules/hipay/hipay.php @@ -0,0 +1,511 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Hipay extends PaymentModule +{ + private $arrayCategories; + private $prod; + + public function __construct() + { + $this->name = 'hipay'; + $this->tab = 'payments_gateways'; + $this->version = 1.0; + + $this->currencies = true; + $this->currencies_mode = 'radio'; + + parent::__construct(); + + $this->displayName = $this->l('Hipay'); + $this->description = $this->l('Secure payement with Visa, Mastercard and European solutions.'); + + $result = Db::getInstance()->ExecuteS(' + SELECT iso_code + FROM '._DB_PREFIX_.'country as c + LEFT JOIN '._DB_PREFIX_.'zone as z + ON z.id_zone = c.id_zone + WHERE z.id_zone = 1'); + + foreach ($result as $num => $iso) + $this->limited_countries[] = $iso['iso_code']; + + if ($this->id) + { + $this->prod = (int)Tools::getValue('HIPAY_PROD', Configuration::get('HIPAY_PROD')); + // Define extracted from mapi/mapi_defs.php + if (!defined('HIPAY_GATEWAY_URL')) + define('HIPAY_GATEWAY_URL','https://'.($this->prod ? '' : 'test.').'payment.hipay.com/order/'); + } + } + + public function install() + { + Configuration::updateValue('HIPAY_SALT', uniqid()); + // Force using Prod mod + Configuration::updateValue('HIPAY_PROD', 1); + + if (!Configuration::get('HIPAY_UNIQID')) + Configuration::updateValue('HIPAY_UNIQID', uniqid()); + if (!Configuration::get('HIPAY_RATING')) + Configuration::updateValue('HIPAY_RATING', 'ALL'); + + if (!(parent::install() AND $this->registerHook('payment'))) + return false; + // Check only the European country for the country restrictions + Db::getInstance()->Execute(' + DELETE FROM '._DB_PREFIX_.'module_country + WHERE id_module = '.$this->id.' + AND id_country NOT IN + (SELECT id_country FROM '._DB_PREFIX_.'country WHERE id_zone = 1)'); + + return true; + } + + public function hookPayment($params) + { + global $smarty, $cart; + + $currency = new Currency($this->getModuleCurrency($cart)); + $hipayAccount = ($this->prod ? Configuration::get('HIPAY_ACCOUNT_'.$currency->iso_code) : Configuration::get('HIPAY_ACCOUNT_TEST_'.$currency->iso_code)); + $hipayPassword = ($this->prod ? Configuration::get('HIPAY_PASSWORD_'.$currency->iso_code) : Configuration::get('HIPAY_PASSWORD_TEST_'.$currency->iso_code)); + $hipaySiteId = ($this->prod ? Configuration::get('HIPAY_SITEID_'.$currency->iso_code) : Configuration::get('HIPAY_SITEID_TEST_'.$currency->iso_code)); + $hipayCategory = ($this->prod ? Configuration::get('HIPAY_CATEGORY_'.$currency->iso_code) : Configuration::get('HIPAY_CATEGORY_TEST_'.$currency->iso_code)); + + if ($hipayAccount AND $hipayPassword AND $hipaySiteId AND $hipayCategory AND Configuration::get('HIPAY_RATING')) + { + $smarty->assign('hipay_prod', $this->prod); + $smarty->assign(array('this_path' => $this->_path, 'this_path_ssl' => self::getHttpHost(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/')); + return $this->display(__FILE__, 'payment.tpl'); + } + } + + private function getModuleCurrency($cart) + { + $id_currency = (int)self::MysqlGetValue('SELECT id_currency FROM `'._DB_PREFIX_.'module_currency` WHERE id_module = '.(int)$this->id); + + if (!$id_currency OR $id_currency == -2) + $id_currency = Configuration::get('PS_CURRENCY_DEFAULT'); + elseif ($id_currency == -1) + $id_currency = $cart->id_currency; + + return $id_currency; + } + + public function payment() + { + global $cookie, $cart; + + $id_currency = (int)$this->getModuleCurrency($cart); + // If the currency is forced to a different one than the current one, then the cart must be updated + if ($cart->id_currency != $id_currency) + if (Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'cart SET id_currency = '.(int)$id_currency.' WHERE id_cart = '.(int)$cart->id)) + $cart->id_currency = $id_currency; + + $currency = new Currency($id_currency); + $language = new Language($cart->id_lang); + $customer = new Customer($cart->id_customer); + $carrier = new Carrier($cart->id_carrier, $cart->id_lang); + $id_zone = self::MysqlGetValue('SELECT id_zone FROM '._DB_PREFIX_.'address a INNER JOIN '._DB_PREFIX_.'country c ON a.id_country = c.id_country WHERE id_address = '.(int)$cart->id_address_delivery); + + require_once(dirname(__FILE__).'/mapi/mapi_package.php'); + + $hipayAccount = ($this->prod ? Configuration::get('HIPAY_ACCOUNT_'.$currency->iso_code) : Configuration::get('HIPAY_ACCOUNT_TEST_'.$currency->iso_code)); + $hipayPassword = ($this->prod ? Configuration::get('HIPAY_PASSWORD_'.$currency->iso_code) : Configuration::get('HIPAY_PASSWORD_TEST_'.$currency->iso_code)); + $hipaySiteId = ($this->prod ? Configuration::get('HIPAY_SITEID_'.$currency->iso_code) : Configuration::get('HIPAY_SITEID_TEST_'.$currency->iso_code)); + $hipaycategory = ($this->prod ? Configuration::get('HIPAY_CATEGORY_'.$currency->iso_code) : Configuration::get('HIPAY_CATEGORY_TEST_'.$currency->iso_code)); + + $paymentParams = new HIPAY_MAPI_PaymentParams(); + $paymentParams->setLogin($hipayAccount, $hipayPassword); + $paymentParams->setAccounts($hipayAccount, $hipayAccount); + $paymentParams->setDefaultLang(strtolower($language->iso_code).'_'.strtoupper($language->iso_code)); + $paymentParams->setMedia('WEB'); + $paymentParams->setRating(Configuration::get('HIPAY_RATING')); + $paymentParams->setPaymentMethod(HIPAY_MAPI_METHOD_SIMPLE); + $paymentParams->setCaptureDay(HIPAY_MAPI_CAPTURE_IMMEDIATE); + $paymentParams->setCurrency(strtoupper($currency->iso_code)); + $paymentParams->setIdForMerchant($cart->id); + $paymentParams->setMerchantSiteId($hipaySiteId); + $paymentParams->setUrlCancel(self::getHttpHost(true, true).'index.php?controller=order&step=3'); + $paymentParams->setUrlNok(self::getHttpHost(true, true).__PS_BASE_URI__.'index.php?controller=order-confirmation&id_cart='.(int)$cart->id.'&amp;id_module='.(int)$this->id.'&amp;secure_key='.$customer->secure_key); + $paymentParams->setUrlOk(self::getHttpHost(true, true).__PS_BASE_URI__.'index.php?controller=order-confirmation&id_cart='.(int)$cart->id.'&amp;id_module='.(int)$this->id.'&amp;secure_key='.$customer->secure_key); + $paymentParams->setUrlAck(self::getHttpHost(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/validation.php?token='.$cart->secure_key); + $paymentParams->setBackgroundColor('#FFFFFF'); + + if (!$paymentParams->check()) + return $this->l('[Hipay] Error: cannot create PaymentParams'); + + $item = new HIPAY_MAPI_Product(); + $item->setName($this->l('Cart')); + $item->setInfo(''); + $item->setquantity(1); + $item->setRef($cart->id); + $item->setCategory($hipaycategory); + $item->setPrice($cart->getOrderTotal()); + + try { + if (!$item->check()) + return $this->l('[Hipay] Error: cannot create "Cart" Product'); + } catch (Exception $e) { + return $this->l('[Hipay] Error: cannot create "Cart" Product'); + } + + $items = array($item); + + $order = new HIPAY_MAPI_Order(); + $order->setOrderTitle($this->l('Order total')); + $order->setOrderCategory($hipaycategory); + + if (!$order->check()) + return $this->l('[Hipay] Error: cannot create Order'); + + try { + $commande = new HIPAY_MAPI_SimplePayment($paymentParams, $order, $items); + } catch (Exception $e) { + return $this->l('[Hipay] Error:').' '.$e->getMessage(); + } + + $xmlTx = $commande->getXML(); + $output = HIPAY_MAPI_SEND_XML::sendXML($xmlTx); + $reply = HIPAY_MAPI_COMM_XML::analyzeResponseXML($output, $url, $err_msg, $err_keyword, $err_value, $err_code); + + if ($reply === true) + Tools::redirectLink($url); + else + { + global $smarty; + include(dirname(__FILE__).'/../../header.php'); + + $smarty->assign('errors', array('[Hipay] '.strval($err_msg).' ('.$output.')')); + $_SERVER['HTTP_REFERER'] = self::getHttpHost(true, true).'index.php?controller=order&step=3'; + $smarty->display(_PS_THEME_DIR_.'errors.tpl'); + + include(dirname(__FILE__).'/../../footer.php'); + } + } + + public function validation() + { + if (!array_key_exists('xml', $_POST)) + return; + + if (_PS_MAGIC_QUOTES_GPC_) + $_POST['xml'] = stripslashes($_POST['xml']); + + require_once(dirname(__FILE__).'/mapi/mapi_package.php'); + + if (HIPAY_MAPI_COMM_XML::analyzeNotificationXML($_POST['xml'], $operation, $status, $date, $time, $transid, $amount, $currency, $id_cart, $data) === false) + { + file_put_contents('logs'.Configuration::get('HIPAY_UNIQID').'.txt', '['.date('Y-m-d H:i:s').'] Analysis error: '.htmlentities($_POST['xml'])."\n", FILE_APPEND); + return false; + } + + $cart = new Cart((int)$id_cart); + if ($cart->secure_key != Tools::getValue('token')) + file_put_contents('logs'.Configuration::get('HIPAY_UNIQID').'.txt', '['.date('Y-m-d H:i:s').'] Token error: '.htmlentities($_POST['xml'])."\n", FILE_APPEND); + else + { + if (trim($operation) == 'capture' AND trim(strtolower($status)) == 'ok') + { + /* Paiement capturé sur Hipay = Paiement accepté sur Prestashop */ + $orderMessage = $operation.': '.$status.'\ndate: '.$date.' '.$time.'\ntransaction: '.$transid.'\namount: '.(float)$amount.' '.$currency.'\nid_cart: '.(int)$id_cart; + $this->validateOrder((int)$id_cart, _PS_OS_PAYMENT_, (float)$amount, $this->displayName, $orderMessage, array(), NULL, false, Tools::getValue('token')); + } + elseif (trim($operation) == 'refund' AND trim(strtolower($status)) == 'ok') + { + /* Paiement remboursé sur Hipay */ + if (!($id_order = Order::getOrderByCartId((int)($id_cart)))) + die(Tools::displayError()); + + $order = new Order((int)($id_order)); + if (!$order->valid OR $order->getCurrentState() === _PS_OS_REFUND_) + die(Tools::displayError()); + + $orderHistory = new OrderHistory(); + $orderHistory->id_order = (int)($order->id); + $orderHistory->changeIdOrderState((int)(_PS_OS_REFUND_), (int)($id_order)); + $orderHistory->addWithemail(); + } + } + } + + public function getContent() + { + global $currentIndex, $cookie; + + $currencies = DB::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT c.iso_code, c.name, c.sign FROM '._DB_PREFIX_.'currency c'); + + if (Tools::isSubmit('submitHipay')) + { + Configuration::updateValue('HIPAY_PROD', Tools::getValue('HIPAY_PROD')); + $this->prod = (int)Tools::getValue('HIPAY_PROD', Configuration::get('HIPAY_PROD')); + + $accounts = array(); + foreach ($currencies as $currency) + { + if (Configuration::get('HIPAY_SITEID_'.$currency['iso_code']) != Tools::getValue('HIPAY_SITEID_'.$currency['iso_code'])) + Configuration::updateValue('HIPAY_CATEGORY_'.$currency['iso_code'], false); + if (Configuration::get('HIPAY_SITEID_TEST_'.$currency['iso_code']) != Tools::getValue('HIPAY_SITEID_TEST_'.$currency['iso_code'])) + Configuration::updateValue('HIPAY_CATEGORY_TEST_'.$currency['iso_code'], false); + + Configuration::updateValue('HIPAY_ACCOUNT_'.$currency['iso_code'], Tools::getValue('HIPAY_ACCOUNT_'.$currency['iso_code'])); + Configuration::updateValue('HIPAY_PASSWORD_'.$currency['iso_code'], Tools::getValue('HIPAY_PASSWORD_'.$currency['iso_code'])); + Configuration::updateValue('HIPAY_SITEID_'.$currency['iso_code'], Tools::getValue('HIPAY_SITEID_'.$currency['iso_code'])); + Configuration::updateValue('HIPAY_CATEGORY_'.$currency['iso_code'], Tools::getValue('HIPAY_CATEGORY_'.$currency['iso_code'])); + + if ($this->prod AND Tools::getValue('HIPAY_ACCOUNT_'.$currency['iso_code'])) + $accounts[Tools::getValue('HIPAY_ACCOUNT_'.$currency['iso_code'])] = 1; + + Configuration::updateValue('HIPAY_ACCOUNT_TEST_'.$currency['iso_code'], Tools::getValue('HIPAY_ACCOUNT_TEST_'.$currency['iso_code'])); + Configuration::updateValue('HIPAY_PASSWORD_TEST_'.$currency['iso_code'], Tools::getValue('HIPAY_PASSWORD_TEST_'.$currency['iso_code'])); + Configuration::updateValue('HIPAY_SITEID_TEST_'.$currency['iso_code'], Tools::getValue('HIPAY_SITEID_TEST_'.$currency['iso_code'])); + Configuration::updateValue('HIPAY_CATEGORY_TEST_'.$currency['iso_code'], Tools::getValue('HIPAY_CATEGORY_TEST_'.$currency['iso_code'])); + + if (!$this->prod AND Tools::getValue('HIPAY_ACCOUNT_TEST_'.$currency['iso_code'])) + $accounts[Tools::getValue('HIPAY_ACCOUNT_TEST_'.$currency['iso_code'])] = 1; + } + + $i = 1; + $dataSync = 'http://www.prestashop.com/modules/hipay.png?mode='.($this->prod ? 'prod' : 'test'); + foreach ($accounts as $account => $null) + $dataSync .= '&account'.($i++).'='.urlencode($account); + + Configuration::updateValue('HIPAY_RATING', Tools::getValue('HIPAY_RATING')); + + echo $this->displayConfirmation($this->l('Configuration updated').'<img src="'.$dataSync.'" style="float:right" />'); + } + + // Check configuration + $allow_url_fopen = ini_get('allow_url_fopen'); + $openssl = extension_loaded('openssl'); + $curl = extension_loaded('curl'); + $ping = ($allow_url_fopen AND $openssl AND $fd = fsockopen('payment.hipay.com', 443) AND fclose($fd)); + $online = (in_array(Tools::getRemoteAddr(), array('127.0.0.1', '::1')) ? false : true); + $categories = true; + $categoryRetrieval = true; + + foreach ($currencies as $currency) + { + if (($hipaySiteId = Configuration::get('HIPAY_SITEID_'.$currency['iso_code']) AND $hipayAccountId = Configuration::get('HIPAY_ACCOUNT_'.$currency['iso_code']) AND !count($this->getHipayCategories(true, $hipaySiteId, $hipayAccountId))) + OR ($hipaySiteIdTest = Configuration::get('HIPAY_SITEID_TEST_'.$currency['iso_code']) AND $hipayAccountIdTest = Configuration::get('HIPAY_ACCOUNT_TEST_'.$currency['iso_code']) AND !count($this->getHipayCategories(false, $hipaySiteIdTest, $hipayAccountIdTest)))) + $categoryRetrieval = false; + + if ((Configuration::get('HIPAY_SITEID_'.$currency['iso_code']) AND !Configuration::get('HIPAY_CATEGORY_'.$currency['iso_code'])) + OR (Configuration::get('HIPAY_SITEID_TEST_'.$currency['iso_code']) AND !Configuration::get('HIPAY_CATEGORY_TEST_'.$currency['iso_code']))) + $categories = false; + } + + if (!$allow_url_fopen OR !$openssl OR !$curl OR !$ping OR !$categories OR !$categoryRetrieval OR !$online) + { + echo ' + <div class="warning warn"> + '.($allow_url_fopen ? '' : '<h3>'.$this->l('You are not allowed to open external URLs').'</h3>').' + '.($curl ? '' : '<h3>'.$this->l('cURL is not enabled').'</h3>').' + '.($openssl ? '' : '<h3>'.$this->l('OpenSSL is not enabled').'</h3>').' + '.(($allow_url_fopen AND $openssl AND !$ping) ? '<h3>'.$this->l('Cannot access payment gateway').' '.HIPAY_GATEWAY_URL.' ('.$this->l('check your firewall').')</h3>' : '').' + '.($online ? '' : '<h3>'.$this->l('Your shop is not online').'</h3>').' + '.($categories ? '' : '<h3>'.$this->l('Hipay categories not set for every Site ID').'</h3>').' + '.($categoryRetrieval ? '' : '<h3>'.$this->l('Impossible to retrieve Hipay categories. Please refer to your error log for more details.').'</h3>').' + </div>'; + } + + $link = $currentIndex.'&configure='.$this->name.'&token='.Tools::getValue('token'); + $form = ' + <style> + .hipay_label {float:none;font-weight:normal;padding:0;text-align:left;width:100%;line-height:30px} + .hipay_help {vertical-align:middle} + #hipay_table {border:1px solid #383838;} + #hipay_table td {border:1px solid #383838; width:250px; padding-left;8px; text-align:center;} + #hipay_table td.hipay_end {border-top:none} + #hipay_table td.hipay_block {border-bottom:none} + #hipay_steps_infos {border:none; margin-bottom:20px;} + #hipay_steps_infos td {border:none; width:70px; height:60px;padding-left;8px; text-align:left;} + #hipay_steps_infos td.tab2 {border:none; width:700px;; height:60px;padding-left;8px; text-align:left;} + #hipay_steps_infos td.hipay_end {border-top:none} + #hipay_steps_infos td.hipay_block {border-bottom:none} + + </style> + <fieldset><legend><img src="../modules/'.$this->name.'/logo.gif" /> '.$this->l('Hipay').'</legend> + '.$this->l('Hipay is a secure electronic wallet which has the European Bank approval. Hipay offer you many opportunities without need to negotiate with a bank. Easy and free to use, Hipay\'s solution of the implementation is a real asset for an e-commerce website that wants to expand in Europe: secure payment by international card, local payment solutions, bank transfers...').' + <br /> + <!-- <br />'.$this->l('Notice: if you want to refund a payment, please log in to your Hipay account then go to Merchant Management > Sales management.').'--> + </fieldset> + <div class="clear">&nbsp;</div> + <fieldset><legend><img src="../modules/'.$this->name.'/logo.gif" /> '.$this->l('Configuration').'</legend> + '.$this->l('The configuration of Hipay is really easy and runs into 3 steps').'<br /><br /> + <table id="hipay_steps_infos" cellspacing="0" cellpadding="0"> + <tr> + <td><img src="../modules/'.$this->name.'/1.png" alt="step 1" /></td> + <td class="tab2">'.(Configuration::get('HIPAY_SITEID') + ? '<a href="https://www.hipay.com/auth" style="color:#D9263F;font-weight:700">'.$this->l('Log in to your merchant account').'</a><br />' + : '<a href="https://www.hipay.com/registration/register" style="color:#D9263F;font-weight:700"><img src="../modules/'.$this->name.'/create.jpg" alt="'.$this->l('Create a Hipay account').'" title="'.$this->l('Create a Hipay account').'" border="0" /></a><br />').' + </td> + </tr> + <tr> + <td><img src="../modules/'.$this->name.'/2.png" alt="step 2" /></td> + <td class="tab2">'.$this->l('Activate the Hipay solution in your Prestashop, it\'s free!').'</td> + </tr> + <tr> + <td><img src="../modules/'.$this->name.'/3.png" alt="step 3" /></td> + <td class="tab2">'.$this->l('Enjoy preferred pricing on transactions via Prestashop by').' + <a style="color:blue; text-decoration:underline;" href="mailto:commercial@hipay.com">' + .$this->l('contacting our sales department').'</a></td> + </tr> + </table> + <form action="'.$link.'" method="post"> + <table id="hipay_table" cellspacing="0" cellpadding="0"> + <tr> + <td style="">&nbsp;</td> + <td style="height:40px;">Compte Hipay</td> + </tr>'; + + foreach ($currencies as $currency) + { + $form .= '<tr> + <td class="hipay_block"><b>'.$this->l('Configuration in').' '.$currency['name'].' '.$currency['sign'].'</b></td> + <td class="hipay_prod hipay_block" style="padding-left:10px"> + <label class="hipay_label" for="HIPAY_ACCOUNT_'.$currency['iso_code'].'">'.$this->l('Account number').' <a href="../modules/'.$this->name.'/screenshots/accountnumber.png" target="_blank"><img src="../modules/'.$this->name.'/help.png" class="hipay_help" /></a></label><br /> + <input type="text" id="HIPAY_ACCOUNT_'.$currency['iso_code'].'" name="HIPAY_ACCOUNT_'.$currency['iso_code'].'" value="'.Tools::getValue('HIPAY_ACCOUNT_'.$currency['iso_code'], Configuration::get('HIPAY_ACCOUNT_'.$currency['iso_code'])).'" /><br /> + <label class="hipay_label" for="HIPAY_PASSWORD_'.$currency['iso_code'].'">'.$this->l('Merchant password').' <a href="../modules/'.$this->name.'/screenshots/merchantpassword.png" target="_blank"><img src="../modules/'.$this->name.'/help.png" class="hipay_help" /></a></label><br /> + <input type="text" id="HIPAY_PASSWORD_'.$currency['iso_code'].'" name="HIPAY_PASSWORD_'.$currency['iso_code'].'" value="'.Tools::getValue('HIPAY_PASSWORD_'.$currency['iso_code'], Configuration::get('HIPAY_PASSWORD_'.$currency['iso_code'])).'" /><br /> + <label class="hipay_label" for="HIPAY_SITEID_'.$currency['iso_code'].'">'.$this->l('Site ID').' <a href="../modules/'.$this->name.'/screenshots/siteid.png" target="_blank"><img src="../modules/'.$this->name.'/help.png" class="hipay_help" /></a></label><br /> + <input type="text" id="HIPAY_SITEID_'.$currency['iso_code'].'" name="HIPAY_SITEID_'.$currency['iso_code'].'" value="'.Tools::getValue('HIPAY_SITEID_'.$currency['iso_code'], Configuration::get('HIPAY_SITEID_'.$currency['iso_code'])).'" /><br />'; + if ($ping AND $hipaySiteId = (int)Configuration::get('HIPAY_SITEID_'.$currency['iso_code']) AND $hipayAccountId = (int)Configuration::get('HIPAY_ACCOUNT_'.$currency['iso_code'])) + { + $form .= ' <label for="HIPAY_CATEGORY_'.$currency['iso_code'].'" class="hipay_label">'.$this->l('Category').'</label><br /> + <select id="HIPAY_CATEGORY_'.$currency['iso_code'].'" name="HIPAY_CATEGORY_'.$currency['iso_code'].'">'; + foreach ($this->getHipayCategories(true, $hipaySiteId, $hipayAccountId) as $id => $name) + $form.= ' <option value="'.(int)$id.'" '.(Tools::getValue('HIPAY_CATEGORY_'.$currency['iso_code'], Configuration::get('HIPAY_CATEGORY_'.$currency['iso_code'])) == $id ? 'selected="selected"' : '').'>'.htmlentities($name, ENT_COMPAT, 'UTF-8').'</option>'; + $form .= ' </select><br />'; + } + + if ($ping AND $hipaySiteId = (int)Configuration::get('HIPAY_SITEID_TEST_'.$currency['iso_code']) AND $hipayAccountIdTest = (int)Configuration::get('HIPAY_ACCOUNT_TEST_'.$currency['iso_code'])) + { + $form .= ' <label for="HIPAY_CATEGORY_TEST_'.$currency['iso_code'].'" class="hipay_label">'.$this->l('Category').'</label><br /> + <select id="HIPAY_CATEGORY_TEST_'.$currency['iso_code'].'" name="HIPAY_CATEGORY_TEST_'.$currency['iso_code'].'">'; + foreach ($this->getHipayCategories(true, $hipaySiteId, $hipayAccountIdTest) as $id => $name) + $form.= ' <option value="'.(int)$id.'" '.(Tools::getValue('HIPAY_CATEGORY_TEST_'.$currency['iso_code'], Configuration::get('HIPAY_CATEGORY_TEST_'.$currency['iso_code'])) == $id ? 'selected="selected"' : '').'>'.htmlentities($name, ENT_COMPAT, 'UTF-8').'</option>'; + $form .= ' </select><br />'; + } + $form .= ' </td> + </tr> + <tr><td class="hipay_end">&nbsp;</td><td class="hipay_prod hipay_end">&nbsp;</td>'; + $form .= '</tr>'; + } + + $form .= '</table> + <hr class="clear" /> + <label for="HIPAY_RATING">'.$this->l('Authorized age group').'</label> + <div class="margin-form"> + <select id="HIPAY_RATING" name="HIPAY_RATING"> + <option value="ALL">'.$this->l('For all ages').'</option> + <option value="+12" '.(Tools::getValue('HIPAY_RATING', Configuration::get('HIPAY_RATING')) == '+12' ? 'selected="selected"' : '').'>'.$this->l('For ages 12 and over').'</option> + <option value="+16" '.(Tools::getValue('HIPAY_RATING', Configuration::get('HIPAY_RATING')) == '+16' ? 'selected="selected"' : '').'>'.$this->l('For ages 16 and over').'</option> + <option value="+18" '.(Tools::getValue('HIPAY_RATING', Configuration::get('HIPAY_RATING')) == '+18' ? 'selected="selected"' : '').'>'.$this->l('For ages 18 and over').'</option> + </select> + </div> + <hr class="clear" /> + <p>'.$this->l('Notice: please verify that the currency mode you have chosen in the payment tab is compatible with your Hipay account(s).').'</p> + <input type="submit" name="submitHipay" value="'.$this->l('Update configuration').'" class="button" /> + </form> + </fieldset> + <script type="text/javascript"> + function switchHipayAccount(prod) { + if (prod) + {'; + foreach ($currencies as $currency) + $form .= ' + $("#HIPAY_ACCOUNT_'.$currency['iso_code'].'").css("background-color", "#FFFFFF"); + $("#HIPAY_ACCOUNT_TEST_'.$currency['iso_code'].'").css("background-color", "#EEEEEE"); + $("#HIPAY_PASSWORD_'.$currency['iso_code'].'").css("background-color", "#FFFFFF"); + $("#HIPAY_PASSWORD_TEST_'.$currency['iso_code'].'").css("background-color", "#EEEEEE"); + $("#HIPAY_SITEID_'.$currency['iso_code'].'").css("background-color", "#FFFFFF"); + $("#HIPAY_SITEID_TEST_'.$currency['iso_code'].'").css("background-color", "#EEEEEE");'; + $form .= ' $(".hipay_prod").css("background-color", "#AADEAA"); + $(".hipay_test").css("background-color", "transparent"); + $(".hipay_prod_span").css("font-weight", "700"); + $(".hipay_test_span").css("font-weight", "200"); + } + else + {'; + foreach ($currencies as $currency) + $form .= ' + $("#HIPAY_ACCOUNT_'.$currency['iso_code'].'").css("background-color", "#EEEEEE"); + $("#HIPAY_ACCOUNT_TEST_'.$currency['iso_code'].'").css("background-color", "#FFFFFF"); + $("#HIPAY_PASSWORD_'.$currency['iso_code'].'").css("background-color", "#EEEEEE"); + $("#HIPAY_PASSWORD_TEST_'.$currency['iso_code'].'").css("background-color", "#FFFFFF"); + $("#HIPAY_SITEID_'.$currency['iso_code'].'").css("background-color", "#EEEEEE"); + $("#HIPAY_SITEID_TEST_'.$currency['iso_code'].'").css("background-color", "#FFFFFF");'; + $form .= ' $(".hipay_prod").css("background-color", "transparent"); + $(".hipay_test").css("background-color", "#AADEAA"); + $(".hipay_prod_span").css("font-weight", "200"); + $(".hipay_test_span").css("font-weight", "700"); + } + } + switchHipayAccount('.(int)$this->prod.'); + </script>'; + return $form; + } + + private function getHipayCategories($prod, $hipaySiteId, $hipayAccountId) + { + if (!is_array($this->arrayCategories)) + { + $this->arrayCategories = array(); + if ($xml = simplexml_load_string(file_get_contents('https://www.prestashop.com/partner/hipay/ws.php?site='.$hipaySiteId.'&accountId='.$hipayAccountId.($prod ? '&prod' : '')))) + { + foreach ($xml->children() as $categoriesList) + foreach ($categoriesList->children() as $category) + $this->arrayCategories[strval($category['id'])] = strval($category); + } + } + return $this->arrayCategories; + } + + // Retro compatibility with 1.2.5 + static private function MysqlGetValue($query) + { + $row = Db::getInstance()->getRow($query); + return array_shift($row); + } + + // Retro compatibility with 1.2.5 + static private function getHttpHost($http = false, $entities = false) + { + $host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']); + + if ($entities) + $host = htmlspecialchars($host, ENT_COMPAT, 'UTF-8'); + if ($http) + $host = (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$host; + + return $host; + } +} diff --git a/modules/hipay/hipay.png b/modules/hipay/hipay.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8624fe166b624c7f29aa4aa1f9f51da806a2d7 GIT binary patch literal 2636 zcmeH``#;kQ1INGLZMN@5%(ZQ_Hs;Qf6heJBqmksE<Y+BPF13&p9ot-*+?Aq-n#&QP zRJ!PN`HIR3opn*>x}iwal9Zl0&U2ps;rZ?P{P6kl{ln+={%rE{baLL62Ur4M0pOjm zAV2@a2rFd%{-c+8#*G`TlarHjdH=_AjjH<AgoFc+A3tntY)DH>QB}3{X<EM0v60FC zeD`bNhw{2UqE%JZ`Gtiq)1s4QWu>q5nM3P*=C0j&O|n;bMJNNK<@EJ4h3ETe&I`TI z2dvmrhjZQ?&Ff#WZrIs(loK{!?fzzO>i5yHiJgg)f{gc)@{x@}O24Rns^h5V4yEtz zxBEr?h7QAyzQgOc4%u;M@+(K(LkCxF8r>8=VCwdoyylgG-I)KLiOA%!keJz0>9A|S zk58WmZ9U$`rjN3>$xU2FJ;H_@e3U-?uP^!sS91r<HhiqTJh3ZraE-Uz0-njM7_#?% z8<RS|J^nSt;X_5k`{QTEw#5xHJth;f`i<5Oy9Iu%ZkkNW9&rm)21Jbo#Y`n<zllou zG5b-@a2+(?IB3IpD-e!{#gFroMqK=+vrmnO?;mpT{<-kApXM~m4jHg<e-m*~;k|Rf z*k!<yHDvFl@ZrrASB~#adM7TD)12jIZX>P%3h#*V(D*kosmg#oQ%7@@!O;^@$rJp< z`OYUVz!m%U?O9q{0{)->!2<L}%zvpi|MWkf0H7tn5O2h7k+x?*x>n&`Ema-IiOV%r ziCjD(*TTM9Cc@xXfH0t8Q7r(3CjlZyFIwlfC#80~FNM<~aiO!DDihM~;N(*_*hflX zB`B)Nosz&1ulR)rins0<CAhAy5o)g$@H_GWaMeAcb5+#|U8ZFnBS-lVhpE9B+_iD) z+t(*KRK*|u{br7~shw-wt~Fc<PRp(=si<naJIBh!(-rT(J9?-M{dpv-zWnmu@_>}G zD+!sN>XeY6`sfaEufF}7vaXba#s$UZtDXF4fQZrl)LN8I{Xq07rRkJxzExC#$+5F7 zsE3|Y)@gy}6%&g{y9IE2>lf^j*8TEZM>4abxY80697GHXkAC*x4ySzT<>kD#nsH2l zwiyfysS5u?BO=^cB1T`=VTxw}A(Iabm-lZ%)8i2qR`;h;mZ7C(6CnKsI_)$B+4?Au z6V}EpA|qo}aYmYcHY<Z*69=NT_%^HA8YpHd`G}c8+ZjDmS`kv>2P+XQO1~I@n0A}k z%R?|#J8`IJzsEQ-(GEGlStkaFEB&rNB0zLi-?msiJ)|O$B9nj`7^LeQXvZ^m$4#_N zo+HeYSu6vY^Ii~o<7JLU+0sSm%^}lB8G0=!E)B(k$8m>~_F>BSC5w7G#!lKJ7Y|Yx z6>!FfC319AEBmYrTqe61i^dUaC#4{*7H-O0SKVG)YNlYE!u)YXbj&tX`=LIZq!MFm zvU3{XBgcUDiwaL=OgZ}5`ld@)LWDBZ)Q!}7SWWiboQ3VOmM!bDZ!^B8)?Cz)@BAU9 znL>wd#hV-vHL8qpCO*ujS<j~ZEF35A5(?dC_#TCQ=n{=a2h&9*cqc_|E<PSctFwD( z?uC|_(&h&BRT`a=vC=_i<<vbFBKC?^i%<>ip?WVhQcrR)A(1fiQeDTZoDv&jA#Cu2 zn)FDGDoDwon)K|l>s6W>*Fvx`H}S}n0o)2>ZF-?D%(JjKR-0x_tjWxyr5IUT>h~E8 zUN^MT!(drdevxq`@1{G&Y$jRoAc4$4F0vE;Eikz~GHczuA=WkeGIljFwgt5vSbw)w zr`4V0P8(4W-5H1sfYU_rTA^Iu1>-SFYx~8M2YjuEu{rnlz9g>{AcN%PEe_Ktx4W(^ z>PPuJY?%Z;z_i{!lQE00+{MLlhx|MUUh@&tMan(CGIHn1-sGlK!&Zm6|5zZJ7rLxq zeZOJ;*Y-kfFWoM^0yyidkmt!1z)vp8K)tE`xIl<?c;rHxic$Nk%EW(|?{Pb$?CAkX z7=T6HS|bjn2|r(b4IkxYJKj=che?T1*sEf7L@I7Q$R;ewc;c0$-%_w_2y(GtSLQS6 z^1(nB0b%F*Z>8zePQzB%CNYCf=x!5|O#Q@o5(8wDGU6fx8BPNFvX%AiJ4jLYwX$(J zTQd7~wRJo^d#rP{0|BgN%0o{MEX<cwPg1l|^dc#yC`oe$x{A_)l*he^LPH1D`Rf80 zHcATB(Yng<e_Nc$$mGAru#p$RJTUzPpKhoPSKG!%pxRNo(XuRqZ}#h*i4r4(S4IXt zVJm!CT5O?Ow`_H$^BS(@&a5Y_#U7f_=p{T?=NSG#y%_U{8LH9QF(VSjvHbF5dSqBz zhid#LQisL@4Gl_^*v*oj$UCYfuNs?b{Gp(+73k^C_w>wv<-wJ6q;}UCQ6eooJc2_m z-Y6on&^ve{&siSMsR#fia(6W~7-Ps4sha?uI3EP;?%WffoJOG5cs+GHa<cULfN`_8 z#f9Vh6a5I1v9)Sq300-AqXH;?o*Xotf;CJ_QJT|5*^Er#dG}A|Iy@`Ca-E<;L`)qD z{dOV8o?q<rr2+P>x6UJDG&Z(?S}9Tt*#?VWmBR8Grv<O|slu(4fCgdT4QkUS8`a9| zJ|(MlyZ9G}ybSzBCfFz1VAh&GJ8+KWE5sTOA<H;WCq7OpGF2duWmku8Ny~GJK!GD# z5CV>N1P3f>>Ye?1jdWXJ=~$-^AGLLb*u~jJW@QSr3AbG{8BtrC$0KZo(bT_)Xz33c z`byU3@N+q#VvFQcygu85cz(#Ihy~i|J(;2E&oL{12+?K|7UZK)lL{2qiCveHZ>ob2 zR~Off+?`EN{M~ifOjczOi-3!d*LN{%p=00L{ZGsZ3A()dTsc$KpG1to_BY<L?eaaC z#f&gzpn@Yge%99RKjpo2YZ&m3^4Wc+>m$vYBrL!Qc8h01AK%mF7936+uOv*Q7gDBg z8|e#C-+E9_bLY0)CpTIeHgG)e&9N3PykYL$-i@<Bz@V}h%$<wf+k7u?=}mhZl)T-t u_gds<ku0uu-U@k=V5V7_8z~1A&VP0+HcOY%s7v_USA@Q;)%rR_z~yhnW8<U% literal 0 HcmV?d00001 diff --git a/modules/hipay/it.php b/modules/hipay/it.php new file mode 100644 index 000000000..3c7456114 --- /dev/null +++ b/modules/hipay/it.php @@ -0,0 +1,51 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{hipay}prestashop>payment_cb047ebd77ec02c36fbac405f8c9922c'] = 'Paga con Hipay'; +$_MODULE['<{hipay}prestashop>payment_35d5d65e0fb908f81b8c36820ddd7cc6'] = 'importo minimo richiesto per pagare con Hipay:'; +$_MODULE['<{hipay}prestashop>payment_e755d43d98e3d597b4492d2e6493ffed'] = '(Sandbox / modalità di prova)'; +$_MODULE['<{hipay}prestashop>hipay_50089d40ef4536271e8b16dbe5763c01'] = 'Hipay'; +$_MODULE['<{hipay}prestashop>hipay_3a630598b9817a76dbb984ba467f6400'] = 'Pagamento sicuro Visa Mastercard e soluzioni europee.'; +$_MODULE['<{hipay}prestashop>hipay_5063b1c7402ff93d09defb875fa0085b'] = '[Hipay] Errore: non è possibile creare PaymentParams'; +$_MODULE['<{hipay}prestashop>hipay_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrello'; +$_MODULE['<{hipay}prestashop>hipay_d4126d0b64579211d37151ef9b5af754'] = '[Hipay] Errore: non è possibile creare prodotti \"Carrello\"'; +$_MODULE['<{hipay}prestashop>hipay_ac2e397ffc0808f909e9712ca575c121'] = 'Ordine totale'; +$_MODULE['<{hipay}prestashop>hipay_0f750bac4745ff32a0c4a4c663ae6b9f'] = '[Hipay] Errore: non può creare l\'Ordine'; +$_MODULE['<{hipay}prestashop>hipay_8eafa453be20eba610cc8f5a8170681c'] = '[Hipay] Errore:'; +$_MODULE['<{hipay}prestashop>hipay_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{hipay}prestashop>hipay_0851f7a0844553fa1168718de0f87262'] = 'Non hai i permessi per aprire gli URL esterni (allow_url_fopen)'; +$_MODULE['<{hipay}prestashop>hipay_6401593f1412a6b385c8e645d1f056ac'] = 'cURL non è abilitato'; +$_MODULE['<{hipay}prestashop>hipay_f8b94463fa8b5591e5edbbb8021e8038'] = 'OpenSSL non è abilitato'; +$_MODULE['<{hipay}prestashop>hipay_54457f20f1d9f9d7cf14d8e928cad1aa'] = 'Impossibile accedere al gateway di pagamento'; +$_MODULE['<{hipay}prestashop>hipay_527557971b02f68ead6a278fb96ac396'] = 'Controlla il tuo firewall'; +$_MODULE['<{hipay}prestashop>hipay_1c5f361b20c116ab2324e28b1ac54e12'] = 'Il tuo negozio non è online'; +$_MODULE['<{hipay}prestashop>hipay_66170e45eb6eb71c35fc3b259a866ff7'] = 'categorie Hipay non impostate per ogni ID del sito'; +$_MODULE['<{hipay}prestashop>hipay_1a1a01512e42b64541ed9b1f43a56036'] = 'Impossibile recuperare categorie Hipay. Consulta il log degli errori per ulteriori dettagli.'; +$_MODULE['<{hipay}prestashop>hipay_74e0ddca931daefcd88f3c118e8eb0f1'] = 'Impossibile recuperare la categoria di Hipay. Consulta il registro degli Errori per ulteriori dettagli.rnHipay è un portafoglio elettronico sicuro che ha l\'approvazione della Banca Europea. Hipay offre molte opportunità, senza bisogno di negoziare con una banca. Facile e libero l\'utilizzo, la soluzione Hipay di attuazione è un bene reale per un sito di e-commerce che vuole espandersi in Europa: pagamento sicuro con carta internazionali, soluzioni di pagamento locali, bonifici ...'; +$_MODULE['<{hipay}prestashop>hipay_01ad06b7c5887516f56ff824278feb67'] = 'Avviso: se vuoi rimborsare un pagamento, accedi al tuo account Hipay poi vai a Merchant Management > Sales management.'; +$_MODULE['<{hipay}prestashop>hipay_254f642527b45bc260048e30704edb39'] = 'Configurazione'; +$_MODULE['<{hipay}prestashop>hipay_d86590564b22be4d3b242472722bf969'] = 'La configurazione di Hipay è molto semplice e viene eseguita in 3 passi'; +$_MODULE['<{hipay}prestashop>hipay_f21850b58e4866b30f7d3724cc29edb1'] = 'Accedi al tuo account commerciante'; +$_MODULE['<{hipay}prestashop>hipay_dc32882bf2b1893d53aeaaa862c46d5c'] = 'Crea un account hipay'; +$_MODULE['<{hipay}prestashop>hipay_04c85eb0ee32a3a352e80c9bce37b038'] = 'L\'attivazione di Hipay nel tuo Prestashop è gratuita!'; +$_MODULE['<{hipay}prestashop>hipay_b7ce0a1dce723a074049b88fb22dbb4d'] = 'Approfitta di prezzi convenienti per transazioni via Prestashop da'; +$_MODULE['<{hipay}prestashop>hipay_7667c2b31b9980267cb526ed2f0d235d'] = 'contattando il nostro ufficio commerciale'; +$_MODULE['<{hipay}prestashop>hipay_08bd40c7543007ad06e4fce31618f6ec'] = 'Account'; +$_MODULE['<{hipay}prestashop>hipay_9596f310ab4657258496ab217d3b5d85'] = 'reale / produzione'; +$_MODULE['<{hipay}prestashop>hipay_aeda5c9c68fbc42071d76a8d2b3d73e8'] = 'sandbox / test'; +$_MODULE['<{hipay}prestashop>hipay_d08cf8ae06cc7e3151aad4618c6efe3a'] = 'Configurazione in'; +$_MODULE['<{hipay}prestashop>hipay_0f26e4f64d58beb4d924627c707e43ad'] = 'Numero di account'; +$_MODULE['<{hipay}prestashop>hipay_315f3c78ea54c8dadb082acc328dd5bd'] = 'Password commerciante'; +$_MODULE['<{hipay}prestashop>hipay_b250a007769c7ffe655c74cfb8176b8c'] = 'ID sito'; +$_MODULE['<{hipay}prestashop>hipay_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoria'; +$_MODULE['<{hipay}prestashop>hipay_5c5fe383c7a097fea1d804ddbc83f4c6'] = 'Numero account di prova'; +$_MODULE['<{hipay}prestashop>hipay_4de3b490bff03a1e715d142cdd41d3f4'] = 'Gruppo di età autorizzato'; +$_MODULE['<{hipay}prestashop>hipay_a19a3f71c627a4bde1e016a46f313799'] = 'Per tutte le età'; +$_MODULE['<{hipay}prestashop>hipay_1ddfab06495a5d2dfcf174034546502d'] = 'Per 12 anni e oltre'; +$_MODULE['<{hipay}prestashop>hipay_524fefef83fd5b0b82292a5366b40cd2'] = 'Per 16 anni e oltre'; +$_MODULE['<{hipay}prestashop>hipay_4f47a2eb5f2af6c1419baa17794e5f03'] = 'Per 18 anni e oltre'; +$_MODULE['<{hipay}prestashop>hipay_0d10a9cae9827e30b09913c1ec6ef2db'] = 'Nota: verificare che la modalità di valuta che hai scelto nella scheda di pagamento sia compatibile con il tuo/i tuoi account Hipay.'; +$_MODULE['<{hipay}prestashop>hipay_c80a51a60c5ee43553c3881459b8f431'] = 'Aggiorna la configurazione'; + +?> \ No newline at end of file diff --git a/modules/hipay/logo.gif b/modules/hipay/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae91fbef79f2aeb5389a8190bc455e44d1d1823d GIT binary patch literal 1073 zcmZ?wbhEHb6krfw_|5<VSJ;)Vuq$8TRJp>XdX-20D!=Ac0j;Zo+Si11t_ka26V|&X zs()R~;JUcsbqOFcx-MmWL)zqqjM)u&i<=6THx#XIDp}uDwY{ZgcT3IwmWIP^O~+eW zPPet4Z|l0;)^)wD=XzV;?Y4pY9Rv5<1|D||J?<EJ-ZApJW8!_s)aQ<w?_CSOyB7X; ztpe`Z2H&#-qL6zIq4%7^?>j}@caFU85_#V>>b_glefOCA9zYcP0Ej%}9(ct+@J@K> zo%p~f;h|6B!+?~B0jUpz(jNt9JPOHt6qfZkBIj{r-s7m;$5DBYV+tO}7d%NSev(-7 zB(d~K3J{e&O|5vETKP1s;%R#2(~OFznKjR{>z?J*Kg+Lwme=q+zv+2#>+_Q47sahF zO4?qOw!bLvdQs8!vby(0P1nnszL#}<uj(eeY?|=8b=vFpX|FqHyzZLyx@YE_?%8j8 zfN0K}{<&}Z=e?OQ_wA&GZznB!J9W|9DU07uU-WMJ;<wY5yqmk?-JF&0=dFG}f9?AP zYd<XB@L|cu4@)<FSib4Qvdte>Z27oy>&MmGKCRvPaovs|S8x5ecKheedp~bK`19e@ z-!EVPegE<Q|9@}<juPaDfZ|UUMh1re3_2hqKzV|J<3GdyzqcPRVdWB5aVWWQp{d)U z(K+i6$EL-{x<wTYd^`*q&h0l1J~Bb_v8uO-s!PU(8w?8%*vl1tc(F6M-FKEj__RM6 z3l$mXC^hl$dWm#ils1iDBeT&^iAhYYRX{e%rE`+9WzrgjgN05_B5EyMylcHOCoR%) z%b3!kz{<J6p`K^rTCSDcJ^cJj1YTZNKR<ux6uHF6lMY<{=Eb)jC|Y|?m>{95r!ql^ zxmU_0ca_;GAs4qUUSS>^$%U!i(~Ks45_l-++}h5?&*d|*u*GwdT0qsAg2E){Rt|Qi z8<v}$*m@=Of+jpDNIcZc%)-L)B~j72jax*`BB5b{0|R57+&{j_i<H^<WXy8Td|-T* I=)hnN0L>U_NdN!< literal 0 HcmV?d00001 diff --git a/modules/hipay/mapi/mapi_affiliate.php b/modules/hipay/mapi/mapi_affiliate.php new file mode 100644 index 000000000..46c909073 --- /dev/null +++ b/modules/hipay/mapi/mapi_affiliate.php @@ -0,0 +1,232 @@ +<?php +/** + * Objet représentant un affilié + * montant de base : montant à partir duquel est calculé le montant qui sera distribué à l'affilié + * cible : si l'affiliation est un piurcentage, la cible indique sur quels montant de la transaction + * s'applique ce pourcentage + * montant calculé : montant reversé à l'affilié + * + * + */ +class HIPAY_MAPI_Affiliate extends HIPAY_MAPI_lockable { + /** + * Numéro de client + * + * @var int + */ + protected $customerId; + + /** + * Numéro de compte + * + * @var unknown_type + */ + protected $accountId; + + /** + * Valeur de l'affiliation (montant fixe ou pourcentage) + * + * @var float + */ + protected $val; + + /** + * Si >0, $val est un pourcentage et $percentageTarget détermine + * sur quels montants appliquer le pourcentage + * + * @var unknown_type + */ + protected $percentageTarget; + + /** + * Montant à reversé à l'affilié + * + * @var unknown_type + */ + protected $_amount; + + /** + * Montant de base sur lequel est calculé le montant + * reversé à l'affilié + * + * @var unknown_type + */ + protected $_baseAmount; + + /** + * Assigne le numéro de client + * + * @param int $customerId + * @return boolean + */ + public function setCustomerId($customerId) { + if ($this->_locked) + return false; + + $customerId = (int)$customerId; + if ($customerId <= 0) + return false; + + $this->customerId = $customerId; + return true; + } + + /** + * Retourne le numéro de client + * + * @return int + */ + public function getCustomerId() { + return $this->customerId; + } + + /** + * Assigne le numéro de compte + * + * @param int $accountId + * @return boolean + */ + public function setAccountId($accountId) { + if ($this->_locked) + return false; + + $accountId = (int)$accountId; + if ($accountId <= 0) + return false; + + $this->accountId = $accountId; + return true; + } + + /** + * Retourne le numéro de compte + * + * @return int + */ + public function getAccountId() { + return $this->accountId; + } + + /** + * Assigne le valeur de l'affiliation, qui est un montant fixe ou un pourcentage + * S'il s'agit d'un pourcentage, $percentageTarget représente la cible, c'est à dire sur quels + * montants est basé le montant de l'affiliation + * + * @param float $val + * @param int $percentageTarget + * @return boolean + */ + public function setValue($val, $percentageTarget = 0) { + if ($this->_locked) + return false; + + $val = sprintf('%.02f',(float)$val); + $percentageTarget = (int)$percentageTarget; + + if ($val <= 0 || $percentageTarget < 0) + return false; + if ($percentageTarget > 0 && $val > 100) + return false; + if ($percentageTarget > 0 && $percentageTarget > HIPAY_MAPI_TTARGET_ALL) + return false; + + $this->val = $val; + $this->percentageTarget = $percentageTarget; + $this->setAmount(); + return true; + } + + /** + * Retourne la valeur de l'affiliation + * + * @return float + */ + public function getValue() { + return $this->val; + } + + /** + * Retourne sur quoi s'applique le pourcentage + * + * @return int + */ + public function getPercentageTarget() { + return $this->percentageTarget; + } + + /** + * Assigne le montant sur lequel sera calculé l'affiliation + * + * @param float $baseAmount + * @return boolean + */ + public function setBaseAmount($baseAmount) { + if ($this->_locked) + return false; + + $baseAmount = sprintf('%.02f',(float)$baseAmount); + + if ($baseAmount < 0) + return false; + + $this->_baseAmount = $baseAmount; + $this->setAmount(); + return true; + } + + /** + * Retourne le montant sur lequel sera calculé l'affiliation + * + * @return int + */ + public function getBaseAmount() { + return $this->_baseAmount; + } + + + /** + * Retourne le montant calculé de l'affiliation + * + * @return float + */ + public function getAmount() { + return $this->_amount; + } + + /** + * Assigne le montant calculé de l'affiliation + * + */ + protected function setAmount() { + if ($this->percentageTarget > 0) { + $this->_amount = sprintf('%.02f',($this->_baseAmount/100) * $this->val); + } else { + $this->_amount = sprintf('%.02f',$this->_baseAmount); + } + } + + /** + * Vérifie que l'objet est bien initialisé + * + * @return boolean + */ + public function check() { + if ($this->customerId <= 0 || $this->accountId <= 0 || $this->val <= 0 || $this->percentageTarget < 0) + throw new Exception('Customer identifier, account number, value or invalid target'); + return true; + } + + protected function init() { + $this->customerId = 0; + $this->accountId = 0; + $this->_amount = 0; + $this->_baseAmount = 0; + $this->val = 0; + $this->percentageTarget = 0; + } + + function __construct() { + $this->init(); + parent::__construct(); + } +} diff --git a/modules/hipay/mapi/mapi_comm_xml.php b/modules/hipay/mapi/mapi_comm_xml.php new file mode 100644 index 000000000..87b660b54 --- /dev/null +++ b/modules/hipay/mapi/mapi_comm_xml.php @@ -0,0 +1,124 @@ +<?php +class HIPAY_MAPI_COMM_XML +{ + /** + * Traitement de la réponse de la plateforme après l'envoi du + * flux représentant un paiement + * + * @param string $xml + * @param string $url + * @param string $err_msg + * @param string $err_keyword + * @param string $err_value + * @param string $err_code + * @return boolean + */ + public static function analyzeResponseXML($xml, &$url, &$err_msg, &$err_keyword, &$err_value, &$err_code) + { + $url = ''; + $err_msg = ''; + $err_keyword = ''; + $err_value = ''; + $err_code = ''; + try { + $obj = @new SimpleXMLElement(trim($xml)); + } catch (Exception $e) { + return false; + } + + if (isset($obj->result[0]->url)) { + $url = $obj->result[0]->url; + return true; + } + if (isset($obj->result[0]->message)) + $err_msg = $obj->result[0]->message; + if (isset($obj->result[0]->keyword)) + $err_keyword = $obj->result[0]->keyword; + if (isset($obj->result[0]->value)) + $err_value = $obj->result[0]->value; + if (isset($obj->result[0]->code)) + $err_code = $obj->result[0]->code; + + return false; + } + + /** + * Traitement du flux XML envoyé par HiPay notifiant le résultat d'une action sur une transaction + * + * @param string $xml + * @param unknown_type $status + * @param string $date + * @param string $time + * @param string $transid + * @param string $origAmount + * @param string $origCurrency + * @param string $idformerchant + * @param array $merchantdatas + * @return boolean + */ + public static function analyzeNotificationXML($xml, &$operation, &$status, &$date, &$time, &$transid, &$origAmount, &$origCurrency, &$idformerchant, &$merchantdatas) + { + $operation = ''; + $status = ''; + $date = ''; + $time = ''; + $transid = ''; + $origAmount = ''; + $origCurrency = ''; + $idformerchant = ''; + $merchantdatas = array(); + + try { + $obj = new SimpleXMLElement(trim($xml)); + } catch (Exception $e) { + return false; + } + + if (isset($obj->result[0]->operation)) + $operation=$obj->result[0]->operation; + else return false; + + if (isset($obj->result[0]->status)) + $status=$obj->result[0]->status; + else return false; + + if (isset($obj->result[0]->date)) + $date=$obj->result[0]->date; + else return false; + + if (isset($obj->result[0]->time)) + $time=$obj->result[0]->time; + else return false; + + if (isset($obj->result[0]->transid)) + $transid=$obj->result[0]->transid; + else return false; + + if (isset($obj->result[0]->origAmount)) + $origAmount=$obj->result[0]->origAmount; + else return false; + + if (isset($obj->result[0]->origCurrency)) + $origCurrency=$obj->result[0]->origCurrency; + else return false; + + if (isset($obj->result[0]->idForMerchant)) + $idformerchant=$obj->result[0]->idForMerchant; + else return false; + + if (isset($obj->result[0]->merchantDatas)) { + $d = $obj->result[0]->merchantDatas->children(); + foreach($d as $xml2) { + if (preg_match('#^_aKey_#i',$xml2->getName())) { + $indice = substr($xml2->getName(),6); + $xml2 = (array)$xml2; + $valeur = (string)$xml2[0]; + $merchantdatas[$indice] = $valeur; + } + } + } + + return true; + } +} + diff --git a/modules/hipay/mapi/mapi_defs.php b/modules/hipay/mapi/mapi_defs.php new file mode 100644 index 000000000..5eeb1141f --- /dev/null +++ b/modules/hipay/mapi/mapi_defs.php @@ -0,0 +1,83 @@ +<?php + +/** + * Définition des montants sur lesquels s'appliquent les taxes + * + */ +define('HIPAY_MAPI_TTARGET_TAX', 1); +define('HIPAY_MAPI_TTARGET_INSURANCE', 2); +define('HIPAY_MAPI_TTARGET_FCOST', 4); +define('HIPAY_MAPI_TTARGET_SHIPPING', 8); +define('HIPAY_MAPI_TTARGET_ITEM', 16); +define('HIPAY_MAPI_TTARGET_ALL', HIPAY_MAPI_TTARGET_TAX+HIPAY_MAPI_TTARGET_INSURANCE+HIPAY_MAPI_TTARGET_FCOST+HIPAY_MAPI_TTARGET_SHIPPING+HIPAY_MAPI_TTARGET_ITEM); + +/** + * Type de paiements possibles + * + */ +define('HIPAY_MAPI_METHOD_SIMPLE', 0); +define('HIPAY_MAPI_METHOD_MULTI', 1); + +/** + * Valeurs par défaut + * + */ +define('HIPAY_MAPI_DEFLANG', 'FR_fr'); +define('HIPAY_MAPI_DEFMEDIA', 'WEB'); + +define('HIPAY_MAPI_MAX_INFO_LENGTH', 200); +define('HIPAY_MAPI_MAX_TITLE_LENGTH', 80); + +define('HIPAY_MAPI_MAX_LOGIN_LENGTH', 20); +define('HIPAY_MAPI_MAX_PASSWORD_LENGTH', 20); + +define('HIPAY_MAPI_MAX_RATING_LENGTH', 8); + +define('HIPAY_MAPI_MAX_MDATAS_LENGTH', 200); + +define('HIPAY_MAPI_MAX_ACKWD_LENGTH', 8); + +define('HIPAY_MAPI_MAX_ACKMAIL_LENGTH', 64); + +define('HIPAY_MAPI_MAX_PRODUCT_NAME_LENGTH', 100); + +define('HIPAY_MAPI_MAX_PRODUCT_INFO_LENGTH', 100); + +define('HIPAY_MAPI_MAX_PRODUCT_REF_LENGTH', 35); + +define('HIPAY_MAPI_MAX_TAX_NAME_LENGTH', 32); + +/** + * Valeurs particulières pour le délai de capture + * + */ +define('HIPAY_MAPI_CAPTURE_MANUAL', -1); +define('HIPAY_MAPI_CAPTURE_IMMEDIATE', 0); +define('HIPAY_MAPI_CAPTURE_MAX_DAYS', 7); + +define('HIPAY_MAPI_OPE_PREAUTH', 'preauthorization'); +define('HIPAY_MAPI_OPE_AUTH', 'authorization'); +define('HIPAY_MAPI_OPE_CANCEL', 'cancellation'); +define('HIPAY_MAPI_OPE_REFUND', 'refund'); +define('HIPAY_MAPI_OPE_CAPTURE', 'capture'); +define('HIPAY_MAPI_OPE_REJECT', 'rejet'); +define('HIPAY_MAPI_STATUS_OK', 'ok'); +define('HIPAY_MAPI_STATUS_NOK', 'nok'); + +// Nombre de secondes avant le timeout de curl avec le serveur Hipay +// A régler en fonction de votre rapidité d'accès à la plate forme hipay +define('HIPAY_MAPI_CURL_TIMEOUT', 30); + +// Configuration d'un serveur proxy +// activer cette option a true pour demander au curl de passer par un proxy +define('HIPAY_MAPI_CURL_PROXY_ON', false); +// Adresse du proxy +define('HIPAY_MAPI_CURL_PROXY', 'http://'); +// port du proxy +define('HIPAY_MAPI_CURL_PROXYPORT', ''); + +// Configuration d'un fichier de log pour curl en cas de pb de connexion avec le serveur Hipay +define('HIPAY_MAPI_CURL_LOG_ON', false); +// fichier de log de curl (sous environnement windows, le chemin du fichier pourra être de type C:\tmp\mapicurl.log) +define('HIPAY_MAPI_CURL_LOGFILE', '/tmp/curl.log'); +define('MAPI_VERSION','1.0'); \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_exception.php b/modules/hipay/mapi/mapi_exception.php new file mode 100644 index 000000000..464c1d527 --- /dev/null +++ b/modules/hipay/mapi/mapi_exception.php @@ -0,0 +1,125 @@ +<?php + +define('MAPI_EXCEPTION_AFFILIATE_BASE_ERROR', 101); +define('MAPI_EXCEPTION_AFFILIATE_UNKNOWN_AFFILIATE', 102); +define('MAPI_EXCEPTION_AFFILIATE_INCORRECT_EU', 103); +define('MAPI_EXCEPTION_AFFILIATE_CUSTOMER_ID_ERROR', 104); +define('MAPI_EXCEPTION_AFFILIATE_ACCOUNT_ID_ERROR', 105); +define('MAPI_EXCEPTION_AFFILIATE_VALUE_ERROR', 106); +define('MAPI_EXCEPTION_AFFILIATE_INCORRECT_TAG', 107); + +define('MAPI_EXCEPTION_INSTALLMENT_BASE_ERROR', 201); +define('MAPI_EXCEPTION_INSTALLMENT_SETFIRST_ERROR', 202); +define('MAPI_EXCEPTION_INSTALLMENT_FIRST_BOOLEAN', 203); +define('MAPI_EXCEPTION_INSTALLMENT_PRICE_ERROR', 204); +define('MAPI_EXCEPTION_INSTALLMENT_INCORRECT_TAG', 205); +define('MAPI_EXCEPTION_INSTALLMENT_TAX_ERROR', 206); + +define('MAPI_EXCEPTION_MULTIPLEP_ORDER_TAG_CONTENT_ERROR', 301); +define('MAPI_EXCEPTION_MULTIPLEP_ORDER_TAG_TOO_MANY_OBJECTS', 302); +define('MAPI_EXCEPTION_MULTIPLEP_ITEMS_TAG_CONTENT_ERROR', 303); +define('MAPI_EXCEPTION_MULTIPLEP_ITEMS_TAG_TOO_MANY_OBJECTS', 304); +define('MAPI_EXCEPTION_MULTIPLEP_INCORRECT_TAG', 305); +define('MAPI_EXCEPTION_MULTIPLEP_CONSTRUCT_ERROR', 306); + +define('MAPI_EXCEPTION_ORDER_BASE_ERROR', 401); +define('MAPI_EXCEPTION_ORDER_UNKNOWN_CATEGORY', 402); +define('MAPI_EXCEPTION_ORDER_TITLE_ERROR', 403); +define('MAPI_EXCEPTION_ORDER_INFO_ERROR', 404); +define('MAPI_EXCEPTION_ORDER_UNKNOWN_TAG', 405); +define('MAPI_EXCEPTION_ORDER_SHIPPING_ERROR', 406); +define('MAPI_EXCEPTION_ORDER_INSURANCE_ERROR', 407); +define('MAPI_EXCEPTION_ORDER_FCOST_ERROR', 408); +define('MAPI_EXCEPTION_ORDER_AFFILIATE_ERROR', 409); + +define('MAPI_EXCEPTION_SIMPLEP_ORDER_TAG_CONTENT_ERROR', 501); +define('MAPI_EXCEPTION_SIMPLEP_ITEMS_TAG_CONTENT_ERROR', 502); +define('MAPI_EXCEPTION_SIMPLEP_INCORRECT_TAG', 503); +define('MAPI_EXCEPTION_SIMPLEP_CONSTRUCT_ERROR', 504); + +define('MAPI_EXCEPTION_PARAMS_BASE_ERROR', 601); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_LOGIN', 602); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_PASSWORD', 603); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_LOGIN_2', 604); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_ITEM_ACCT', 605); +define('MAPI_EXCEPTION_PARAMS_FORBIDDEN_ITEM_ACCT', 606); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_ITEM_ACCT_2', 607); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_TAX_ACCT', 608); +define('MAPI_EXCEPTION_PARAMS_FORBIDDEN_TAX_ACCT', 609); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_TAX_ACCT_2', 610); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_INS_ACCT', 611); +define('MAPI_EXCEPTION_PARAMS_FORBIDDEN_INS_ACCT', 612); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_INS_ACCT_2', 613); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_FCOST_ACCT', 614); +define('MAPI_EXCEPTION_PARAMS_FORBIDDEN_FCOST_ACCT', 615); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_FCOST_ACCT_2', 616); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_SHIP_ACCT', 617); +define('MAPI_EXCEPTION_PARAMS_FORBIDDEN_SHIP_ACCT', 618); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_SHIP_ACCT_2', 619); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_EU_ID', 620); +define('MAPI_EXCEPTION_PARAMS_NO_LANG_AVAILABLE', 621); +define('MAPI_EXCEPTION_PARAMS_LANG_NOT_SUPPORTED', 622); +define('MAPI_EXCEPTION_PARAMS_NO_MEDIA_AVAILABLE', 623); +define('MAPI_EXCEPTION_PARAMS_MEDIA_NOT_SUPPORTED', 624); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_RATING', 625); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_PAYMENT_METHOD', 626); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_CURRENCY', 627); +define('MAPI_EXCEPTION_PARAMS_INCORRECT_MERCH_SITE_ID', 628); +define('MAPI_EXCEPTION_PARAMS_LANG_ERROR', 629); +define('MAPI_EXCEPTION_PARAMS_MEDIA_ERROR', 630); +define('MAPI_EXCEPTION_PARAMS_RATING_ERROR', 631); +define('MAPI_EXCEPTION_PARAMS_METHOD_ERROR', 632); +define('MAPI_EXCEPTION_PARAMS_CAPTURE_DAY_ERROR', 633); +define('MAPI_EXCEPTION_PARAMS_CURRENCY_ERROR', 634); +define('MAPI_EXCEPTION_PARAMS_ID_MERCHANT_ERROR', 635); +define('MAPI_EXCEPTION_PARAMS_SITE_ID_ERROR', 636); +define('MAPI_EXCEPTION_PARAMS_URLOK_ERROR', 637); +define('MAPI_EXCEPTION_PARAMS_URLNOK_ERROR', 638); +define('MAPI_EXCEPTION_PARAMS_URLCAN_ERROR', 639); +define('MAPI_EXCEPTION_PARAMS_URLACK_ERROR', 640); +define('MAPI_EXCEPTION_PARAMS_ACKWD_ERROR', 641); +define('MAPI_EXCEPTION_PARAMS_EMAILACK_ERROR', 642); +define('MAPI_EXCEPTION_PARAMS_BGCOLOR_ERROR', 643); +define('MAPI_EXCEPTION_PARAMS_URLLOGO_ERROR', 644); +define('MAPI_EXCEPTION_PARAMS_MDATAS_ERROR', 645); +define('MAPI_EXCEPTION_PARAMS_UNKNOWN_TAG', 646); +define('MAPI_EXCEPTION_PARAMS_LOGIN_ERROR', 647); +define('MAPI_EXCEPTION_PARAMS_ACCTS_ERROR', 648); +define('MAPI_EXCEPTION_PARAMS_ID_GROUP_ERROR', 649); + +define('MAPI_EXCEPTION_PRODUCT_BASE_ERROR', 701); +define('MAPI_EXCEPTION_PRODUCT_NAME_ERROR', 702); +define('MAPI_EXCEPTION_PRODUCT_INFO_ERROR', 703); +define('MAPI_EXCEPTION_PRODUCT_QUANTITY_ERROR', 704); +define('MAPI_EXCEPTION_PRODUCT_REF_ERROR', 705); +define('MAPI_EXCEPTION_PRODUCT_CATEGORY_ERROR', 706); +define('MAPI_EXCEPTION_PRODUCT_PRICE_ERROR', 707); +define('MAPI_EXCEPTION_PRODUCT_INCORRECT_TAG', 708); +define('MAPI_EXCEPTION_PRODUCT_TAX_ERROR', 709); + +define('MAPI_EXCEPTION_TAX_BASE_ERROR', 801); +define('MAPI_EXCEPTION_TAX_NAME_ERROR', 802); +define('MAPI_EXCEPTION_TAX_ACCOUNT_ERROR', 803); +define('MAPI_EXCEPTION_TAX_PERCENTAGE_NOT_BOOLEAN_ERROR', 804); +define('MAPI_EXCEPTION_TAX_VALUE_ERROR', 805); +define('MAPI_EXCEPTION_TAX_INCORRECT_TAG', 806); + +class MAPI_Exception extends Exception { + private $keyword; + private $value; + + function __construct($keyword, $value, $msg, $code = 0) { + $this->keyword = $keyword; + $this->value = $value; + + parent::__construct($msg, $code); + } + + public function getKeyword() { + return $this->keyword; + } + + public function getValue() { + return $this->value; + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_installment.php b/modules/hipay/mapi/mapi_installment.php new file mode 100644 index 000000000..2794a91af --- /dev/null +++ b/modules/hipay/mapi/mapi_installment.php @@ -0,0 +1,215 @@ +<?php +/** + * Représente la ligne de la commande pour un paiement récurrent + * + */ +class HIPAY_MAPI_Installment extends HIPAY_MAPI_Item { + + /** + * Montant HT + * + * @var float + */ + protected $price; + + /** + * Taxes s'appliquant à ce paiement + * + * @var array + */ + protected $tax; + + /** + * Indique s'il s'agit du premier paiement (true) ou des suivants (false) + * + * @var boolean + */ + protected $first; + + /** + * Délai avant le déclenchement du premier paiement (si $first=true), + * ou interval entre les paiements suivants (si $first=false) + * + * @var string + */ + protected $paymentDelay; + + /** + * timestamp du premier paiement ou des paiements récurrents + * + * @var integer + */ + protected $_delayTS; + + + /** + * Assigne le montant HT + * + * @param float $price + * @return boolean + */ + public function setPrice($price) { + if ($this->_locked) + return false; + + $price = sprintf('%.02f',(float)$price); + if ($price < 0) + return false; + $this->price = $price; + + return true; + } + + /** + * Retourne le montant HT + * + * @return float + */ + public function getPrice() { + return $this->price; + } + + /** + * Défini s'il s'agit du premier paiement ou des suivants et le délai de déclenchement + * + * @param boolean $first + * @param string $paymentDelay + * @return boolean + */ + public function setFirst($first,$paymentDelay) { + if ($this->_locked) + return false; + if (!is_bool($first)) + return false; + + $paymentDelay=trim($paymentDelay); + if ($first) { + if (!preg_match("#[0-9]+[HDM]#",$paymentDelay)) + { + return false; + } + } else { + if (!preg_match("#[0-9]+[DM]#",$paymentDelay)) { + return false; + } + } + + $num = (int)substr($paymentDelay, 0, strlen($paymentDelay)-1); + if (($num < 1 && !$first) || ($num < 0 && $first) || $num > 365) { + return false; + } + $this->first = $first; + $this->paymentDelay = $paymentDelay; + return true; + } + + /** + * Assigne les taxes s'appliquant à ce paiement + * + * @param array $tax + * @return boolean + */ + public function setTax($tax) { + if ($this->_locked) + return false; + + if (!HIPAY_MAPI_UTILS::is_an_array_of($tax, 'HIPAY_MAPI_Tax')) + return false; + foreach ($tax as $obj) + $this->tax[]= clone $obj; + + return true; + } + + /** + * assigne le timestamp du premier paiement ou des paiements récurrents + * + */ + public function setDelayTS( $baseTS=0 ) + { + if ((int)$baseTS <= 0) { + $baseTS = time(); + } + + switch (substr($this->paymentDelay, -1, 1)) { + case 'd': case 'D': $unit='day'; break; + case 'm': case 'M': $unit='month'; break; + case 'h': case 'H': + default : $unit='hour'; break; + } + + $this->_delayTS = strtotime('+'.substr($this->paymentDelay, 0, -1).' '.$unit, $baseTS); + } + + /** + * Retourne les taxes s'appliquant à ce paiement + * + * @return array + */ + public function getTax() { + return $this->tax; + } + + /** + * Retourne s'il s'agit du premier paiement + * + * @return boolean + */ + public function getFirst() { + return $this->first; + } + + /** + * Retourne le délai de déclenchement + * + * @return string + */ + public function getPaymentDelay() { + return $this->paymentDelay; + } + + /** + * retourne le timestamp du premier paiement + * + */ + public function getDelayTS() + { + return $this->_delayTS; + } + + /** + * Vérifie si l'objet est correctement initialisé + * + * @return float + */ + public function check() { + if ($this->price < 0) + throw new Exception('Invalid amount or not initialized'); + if (!HIPAY_MAPI_UTILS::is_an_array_of($this->tax, 'HIPAY_MAPI_Tax')) + throw new Exception('Invalid taxes or not initialized'); + foreach($this->tax as $obj) { + if (!$obj->check()) + return false; + } + + if (!is_bool($this->first)) + throw new Exception('Premier paiement ou suivant n\'est pas initialisé'); + + return true; + } + + protected function init() + { + $this->price = -1; + $this->tax = array(); + $this->first = ''; + $this->paymentDelay = ''; + $this->_delayTS = ''; + } + + function __construct() { + $this->init(); + + parent::__construct(); + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_item.php b/modules/hipay/mapi/mapi_item.php new file mode 100644 index 000000000..71ce7c1da --- /dev/null +++ b/modules/hipay/mapi/mapi_item.php @@ -0,0 +1,43 @@ +<?php +/** + * Représente une ligne de la commande + * + */ +class HIPAY_MAPI_Item extends HIPAY_MAPI_lockable { + + function __construct() { + parent::__construct(); + } + + public function getName() { + return ''; + } + + public function getInfo() { + return ''; + } + + public function getQuantity() { + return 1; + } + + public function getRef() { + return ''; + } + + public function getCategory() { + return 1; + } + + public function getPrice() { + return 0; + } + + public function getTax() { + return array(); + } + + public function check() { + return false; + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_lockable.php b/modules/hipay/mapi/mapi_lockable.php new file mode 100644 index 000000000..40adeb503 --- /dev/null +++ b/modules/hipay/mapi/mapi_lockable.php @@ -0,0 +1,21 @@ +<?php +class HIPAY_MAPI_lockable extends HIPAY_MAPI_XML { + /** + * Etat du vérou + * + * @var boolean + */ + protected $_locked; + + /** + * Verouille l'objet + * + */ + public function lock() { + $this->_locked = true; + } + + function __construct() { + $this->_locked = false; + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_multiplepayment.php b/modules/hipay/mapi/mapi_multiplepayment.php new file mode 100644 index 000000000..c81883a88 --- /dev/null +++ b/modules/hipay/mapi/mapi_multiplepayment.php @@ -0,0 +1,45 @@ +<?php +/** + * Représente un paiement récurrent + * Un paiement simple contient : + * - 1 objet paramètres HIPAY_MAPI_PaymentParams + * - 1 objet order pour le premier paiement HIPAY_MAPI_Order + * - 1 objet installment pour le premier paiement HIPAY_MAPI_Installment + * - 1 objet order pour le second paiement HIPAY_MAPI_Order + * - 1 objet installment pour le second paiement HIPAY_MAPI_Installment + * + */ +class HIPAY_MAPI_MultiplePayment extends HIPAY_MAPI_Payment { + function __construct(HIPAY_MAPI_PaymentParams $paymentParams, HIPAY_MAPI_Order $firstOrder, HIPAY_MAPI_Installment $firstInstallment, HIPAY_MAPI_Order $nextOrder, HIPAY_MAPI_Installment $nextInstallment) { + if ($firstInstallment->getFirst() === $nextInstallment->getFirst() || !$firstInstallment->getFirst()) { + throw new Exception('You must define a installment object for the first payment and next payments'); + } + + $firstInstallment->setDelayTS(); + $nextInstallment->setDelayTS($firstInstallment->getDelayTS()); + + try { + parent::__construct($paymentParams, array($firstOrder, $nextOrder), array($firstInstallment, $nextInstallment)); + } catch(Exception $e) { + throw new Exception($e->getMessage()); + } + } + + /** + * Retourne le montant total de la somme devant être + * distribuée aux affiliés + */ + protected function _getTotalAmountForAffiliates($installement_nr) { + $affiliates = $this->order[0]->getAffiliate(); + + if (!HIPAY_MAPI_UTILS::is_an_array_of($affiliates, 'HIPAY_MAPI_Affiliate')) + return false; + + $total_aff = 0; + foreach($affiliates as $aff) { + $total_aff += $aff->getAmount(); + } + + return $total_aff; + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_order.php b/modules/hipay/mapi/mapi_order.php new file mode 100644 index 000000000..0add9b112 --- /dev/null +++ b/modules/hipay/mapi/mapi_order.php @@ -0,0 +1,396 @@ +<?php +/** + * Objet représentant les informations de la commande + * + */ +class HIPAY_MAPI_Order extends HIPAY_MAPI_lockable { + + /** + * Montant des frais de livraison + * + * @var float + */ + protected $shippingAmount; + + /** + * Taxes s'appliquants aux frais de livraison + * + * @var array + */ + protected $shippingTax; + + /** + * Montant des assurances + * + * @var float + */ + protected $insuranceAmount; + + /** + * Taxes s'appliquants aux assurances + * + * @var array + */ + protected $insuranceTax; + + /** + * Montant des coûts fixes + * + * @var float + */ + protected $fixedCostAmount; + + /** + * Taxes s'appliquants aux coûts fixes + * + * @var array + */ + protected $fixedCostTax; + + /** + * Affiliés + * + * @var array + */ + protected $affiliate; + + /** + * Intitulé de la commande + * + * @var string + */ + protected $orderTitle; + + /** + * Informations sur la commande + * + * @var string + */ + protected $orderInfo; + + /** + * Catégorie de la commande + * + * @var int + */ + protected $orderCategory; + + /** + * Défini le montant des frais d'envoi et les taxes s'y appliquant + * + * @param float $shippingAmount + * @param array $shippingTax + * @return boolean + */ + public function setShipping($shippingAmount, $shippingTax) { + if ($this->_locked) + return false; + + $shippingAmount = sprintf('%.02f', (float)$shippingAmount); + if ($shippingAmount < 0) { + return false; + } + + if(empty($shippingTax)) { + return false; + } + if (!HIPAY_MAPI_UTILS::is_an_array_of($shippingTax, 'HIPAY_MAPI_Tax')) { + return false; + } + + $this->shippingAmount = $shippingAmount; + foreach ($shippingTax as $obj) + $this->shippingTax[] = clone $obj; + + return true; + } + + /** + * Retourne le montant des frais d'envoi + * + * @return float + */ + public function getShippingAmount() { + return $this->shippingAmount; + } + + /** + * Retourne les taxes s'appliquants aux frais d'envoi + * + * @return array + */ + public function &getShippingTax() { + return $this->shippingTax; + } + + /** + * Défini le montant des assurances + * + * @param float $insuranceAmount + * @param array $insuranceTax + * @return boolean + */ + public function setInsurance($insuranceAmount, $insuranceTax) { + if ($this->_locked) + return false; + + $insuranceAmount = sprintf('%.02f', (float)$insuranceAmount); + + if ($insuranceAmount < 0) + return false; + + if(empty($insuranceTax)) { + return false; + } + if (!HIPAY_MAPI_UTILS::is_an_array_of($insuranceTax, 'HIPAY_MAPI_Tax')) + return false; + + $this->insuranceAmount = $insuranceAmount; + foreach ($insuranceTax as $obj) + $this->insuranceTax[] = clone $obj; + + return true; + } + + /** + * Retourne le montant des assurances + * + * @return float + */ + public function getInsuranceAmount() { + return $this->insuranceAmount; + } + + /** + * Retourne les taxes s'appliquants aux assurances + * + * @return array + */ + public function &getInsuranceTax() { + return $this->insuranceTax; + } + + /** + * Défini le montant des coûts fixes et les taxes s'y appliquant + * + * @param float $fixedCostAmount + * @param array $fixedCostTax + * @return boolean + */ + public function setFixedCost($fixedCostAmount,$fixedCostTax) { + if ($this->_locked) + return false; + + $fixedCostAmount = sprintf('%.02f', (float)$fixedCostAmount); + + if ($fixedCostAmount<0) + return false; + + if(empty($fixedCostTax)) { + return false; + } + if (!HIPAY_MAPI_UTILS::is_an_array_of($fixedCostTax, 'HIPAY_MAPI_Tax')) + return false; + + $this->fixedCostAmount = $fixedCostAmount; + foreach ($fixedCostTax as $obj) + $this->fixedCostTax[] = clone $obj; + return true; + } + + /** + * Retourne le montant des coûts fixes + * + * @return float + */ + public function getFixedCostAmount() { + return $this->fixedCostAmount; + } + + /** + * Retourne les taxes s'appliquant aux coûts fixes + * + * @return array + */ + public function &getFixedCostTax() { + return $this->fixedCostTax; + } + + /** + * Défini les affiliés qui recevront une rétribution pour cette commande + * + * @param array $affiliate + * @return boolean + */ + public function setAffiliate($affiliate) { + if ($this->_locked) + return false; + + if(empty($affiliate)) { + return false; + } + if (!HIPAY_MAPI_UTILS::is_an_array_of($affiliate, 'HIPAY_MAPI_Affiliate')) + return false; + + foreach ($affiliate as $obj) + $this->affiliate[] = clone $obj; + + return true; + } + + /** + * Retourne la liste des affiliés de cette commande + * + * @return array + */ + public function &getAffiliate() { + return $this->affiliate; + } + + /** + * Assigne l'intitulé de la commande + * + * @param string $orderTitle + * @return boolean + */ + public function setOrderTitle($orderTitle) { + if ($this->_locked) + return false; + + $orderTitle = HIPAY_MAPI_UTF8::forceUTF8($orderTitle); + $len = HIPAY_MAPI_UTF8::strlen_utf8($orderTitle); + if ($len < 1 || $len > HIPAY_MAPI_MAX_TITLE_LENGTH) + return false; + + $this->orderTitle = $orderTitle; + return true; + } + + /** + * Retourne l'intitulé de la commande + * + * @return string + */ + public function getOrderTitle() { + return $this->orderTitle; + } + + /** + * Assigne les infos sur la commande + * + * @param string $orderInfo + * @return boolean + */ + public function setOrderInfo($orderInfo) { + if ($this->_locked) + return false; + + $orderInfo = HIPAY_MAPI_UTF8::forceUTF8($orderInfo); + $len = HIPAY_MAPI_UTF8::strlen_utf8($orderInfo); + if ($len > HIPAY_MAPI_MAX_INFO_LENGTH) + return false; + + $this->orderInfo = $orderInfo; + return true; + } + + /** + * Retourne les infos sur la commande + * + * @return string + */ + public function getOrderInfo() { + return $this->orderInfo; + } + + + /** + * Assigne la catégorie de la commande + * + * @param int $orderCategory + * @return boolean + */ + public function setOrderCategory($orderCategory) { + if ($this->_locked) + return false; + + $orderCategory = (int)$orderCategory; + if ($orderCategory < 1) + return false; + + $this->orderCategory = $orderCategory; + return true; + } + + /** + * Retourne la catégorie de la commande + * + * @return int + */ + public function getOrderCategory() { + return $this->orderCategory; + } + + + /** + * Vérifie si l'objet est correctement initialisé + * + * @return boolean + */ + public function check() { + if ($this->orderTitle == '' || $this->orderCategory < 0) + throw new Exception('Label and/or category of order are missing'); + + foreach($this->affiliate as $obj) { + try { + $obj->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + } + + foreach($this->shippingTax as $obj) { + try { + $obj->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + } + + foreach($this->insuranceTax as $obj) { + try { + $obj->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + } + + foreach($this->fixedCostTax as $obj) { + try { + $obj->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + } + + return true; + } + + protected function init() { + $this->shippingAmount = 0; + $this->shippingTax = array(); + $this->insuranceAmount = 0; + $this->insuranceTax = array(); + $this->fixedCostAmount = 0; + $this->fixedCostTax = array(); + $this->affiliate = array(); + $this->orderTitle = ''; + $this->orderInfo = ''; + $this->orderCategory = -1; + } + + function __construct() { + $this->init(); + parent::__construct(); + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_package.php b/modules/hipay/mapi/mapi_package.php new file mode 100644 index 000000000..33e829feb --- /dev/null +++ b/modules/hipay/mapi/mapi_package.php @@ -0,0 +1,20 @@ +<?php +$_mapi_dir = dirname(__FILE__); + +require_once($_mapi_dir.'/mapi_defs.php'); +require_once($_mapi_dir.'/mapi_utils.php'); +require_once($_mapi_dir.'/mapi_utf8.php'); +require_once($_mapi_dir.'/mapi_xml.php'); +require_once($_mapi_dir.'/mapi_send_xml.php'); +require_once($_mapi_dir.'/mapi_comm_xml.php'); +require_once($_mapi_dir.'/mapi_lockable.php'); +require_once($_mapi_dir.'/mapi_tax.php'); +require_once($_mapi_dir.'/mapi_affiliate.php'); +require_once($_mapi_dir.'/mapi_item.php'); +require_once($_mapi_dir.'/mapi_installment.php'); +require_once($_mapi_dir.'/mapi_product.php'); +require_once($_mapi_dir.'/mapi_paymentparams.php'); +require_once($_mapi_dir.'/mapi_order.php'); +require_once($_mapi_dir.'/mapi_payment.php'); +require_once($_mapi_dir.'/mapi_multiplepayment.php'); +require_once($_mapi_dir.'/mapi_simplepayment.php'); \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_payment.php b/modules/hipay/mapi/mapi_payment.php new file mode 100644 index 000000000..ebfd4c9e0 --- /dev/null +++ b/modules/hipay/mapi/mapi_payment.php @@ -0,0 +1,447 @@ +<?php +/** + * Représente un paiement. + * N'est pas utilisé directement + * + */ +class HIPAY_MAPI_Payment extends HIPAY_MAPI_XML { + + /** + * Paramètres du paiement + * + * @var HIPAY_MAPI_PaymentParams + */ + protected $paymentParams; + + /** + * Objets HIPAY_MAPI_Order + * + * @var array + */ + protected $order; + + /** + * Objets HIPAY_MAPI_Item + * + * @var array + */ + protected $items; + + /** + * Total des taxes sur les produits + * + * @var array + */ + protected $_taxItemsAmount; + + /** + * Total des taxes sur les frais d'envoi + * + * @var array + */ + protected $_taxShippingAmount; + /** + * Total des taxes sur les assurances + * + * @var array + */ + protected $_taxInsuranceAmount; + + /** + * Total des taxes sur les coûts fixes + * + * @var array + */ + protected $_taxFixedCostAmount; + + /** + * Total du montant HT des produits + * + * @var array + */ + protected $_itemsTotalAmount; + + /** + * Total des taxes + * + * @var array + */ + public $_taxTotalAmount; + + /** + * Total de la commande hors taxes + * + * @var array + */ + protected $_orderTotalAmountHT; + + /** + * Total de la commande + * + * @var array + */ + protected $_orderTotalAmount; + + /** + * Total des affilies + * + * @var array + */ + protected $_affiliateTotalAmount; + + public function __construct($paymentParams, $order, $items) { + try { + $this->init($paymentParams, $order, $items); + } catch(Exception $e) { + throw new Exception($e->getMessage()); + } + } + + protected function init($paymentParams, $order, $items) { + if (!($paymentParams instanceof HIPAY_MAPI_PaymentParams) + || !HIPAY_MAPI_UTILS::is_an_array_of($order, 'HIPAY_MAPI_Order') + || !HIPAY_MAPI_UTILS::is_an_array_of($items, 'HIPAY_MAPI_Item') + || count($items) < 1) + throw new Exception('Wrong parameters'); + + try { + $paymentParams->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + + foreach($order as $orderObj) { + try { + $orderObj->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + } + + foreach($items as $obj) { + try { + $obj->check(); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + } + + $this->paymentParams = clone $paymentParams; + $this->paymentParams->lock(); + + foreach($order as $obj) { + $this->order[] = clone $obj; + end($this->order)->lock(); + $this->_taxItemsAmount[] = 0; + $this->_taxShippingAmount[] = 0; + $this->_taxInsuranceAmount[] = 0; + $this->_taxFixedCostAmount[] = 0; + $this->_itemsTotalAmount[] = 0; + $this->_taxTotalAmount[] = 0; + $this->_orderTotalAmount[] = 0; + $this->_affiliateTotalAmount[] = 0; + } + + foreach($items as $obj) { + $this->items[] = clone $obj; + end($this->items)->lock(); + } + + try { + $this->compute(); + } catch(Exception $e) { + throw new Exception($e->getMessage()); + } + } + + /** + * Calcul les différents montants (taxes, affiliés, totaux) de la commande + * + */ + protected function compute() { + // Mise à jour du montant total des taxes pour chaque item du tableau _taxItemsAmount + // Mise à jour du montant total des taxes de livraison pour chaque order du tableau _taxShippingAmount + // Mise à jour du montant total des taxes d'assurances pour chaque order du tableau _taxInsuranceAmount + // Mise à jour du montant total des taxes de couts fixes pour chaque order du tableau _taxFixedCostAmount + $this->computeTaxes(); + // Mise a jour du montant total HT des produits pour chaque item du tableau _itemsTotalAmount + $this->computeItemsAmount(); + // Pour chaque commande + foreach($this->order as $key=>$order) { + $this->_taxTotalAmount[$key] = $this->_taxItemsAmount[$key] + $this->_taxShippingAmount[$key] + $this->_taxInsuranceAmount[$key] + $this->_taxFixedCostAmount[$key]; + $this->_orderTotalAmountHT[$key] = $order->getShippingAmount() + $order->getInsuranceAmount() + $order->getFixedCostAmount() + $this->_itemsTotalAmount[$key]; + $this->_orderTotalAmount[$key] = $this->_orderTotalAmountHT[$key] + $this->_taxTotalAmount[$key]; +// $this->_orderTotalAmount[$key] = $order->getShippingAmount() + $order->getInsuranceAmount() + $order->getFixedCostAmount() + $this->_itemsTotalAmount[$key] + +// $this->_taxItemsAmount[$key] + +// $this->_taxShippingAmount[$key] + +// $this->_taxInsuranceAmount[$key] + +// $this->_taxFixedCostAmount[$key]; + } + try { + $this->computeAffiliates(); + } catch(Exception $e) { + throw new Exception($e->getMessage()); + } + } + + /** + * Calcul le montant des taxes + * + */ + protected function computeTaxes() { + // Taxes sur les produits au niveau de l'item (ligne de commande) + // @FIXME bug et confusion entre indice d'item et indice d'order ? + $cur = 0; + // pour chaque ligne de commande + foreach($this->items as $item) { + // Liste des taxes de la ligne + $itemTaxes = $item->getTax(); + $tItemsAmount = 0; + + // pour chaque taxe appliquée sur cette ligne + foreach($itemTaxes as $tax) { + $amount = HIPAY_MAPI_UTILS::computeTax($item->getPrice(), $tax); + $tax->setTaxAmount($amount); + $tax->lock(); + // mise a jour du montant total des taxes pour cet item (ligne de commande) + $tItemsAmount += $amount; + } + + if (!isset($this->order[$cur])) + $cur = 0; + if (!isset($this->_taxItemsAmount[$cur])) + $this->_taxItemsAmount[$cur] = 0; + + // mise a jour du montant total des taxes pour cette ligne de commande + // avec prise en compte du nombre de produits dans l'indice numLigneCommande + // du tableau _taxItemsAmount de cette commande + $this->_taxItemsAmount[$cur] += ($tItemsAmount*$item->getQuantity()); + $item->lock(); + $cur++; + } + + // Taxes sur frais d'envoi, assurances, coûts fixes + // au niveau des commandes + $cur = 0; + foreach($this->order as $order) { + // Taxes sur frais d'envoi + $taxArr =& $order->getShippingTax(); + foreach($taxArr as $key=>$tax) { + $amount = HIPAY_MAPI_UTILS::computeTax($order->getShippingAmount(), $tax); + $taxArr[$key]->setTaxAmount($amount); + $taxArr[$key]->lock(); + + if (!isset($this->_taxShippingAmount[$cur])) + $this->_taxShippingAmount[$cur] = 0; + $this->_taxShippingAmount[$cur] += $amount; + } + + // Taxes sur assurances + $taxArr =& $order->getInsuranceTax(); + foreach($taxArr as $key=>$tax) { + $amount = HIPAY_MAPI_UTILS::computeTax($order->getInsuranceAmount(), $tax); + $taxArr[$key]->setTaxAmount($amount); + $taxArr[$key]->lock(); + if (!isset($this->_taxInsuranceAmount[$cur])) + $this->_taxInsuranceAmount[$cur] = 0; + $this->_taxInsuranceAmount[$cur] += $amount; + } + + // Taxes sur coûts fixes + $taxArr =& $order->getFixedCostTax(); + foreach($taxArr as $key=>$tax) { + $amount = HIPAY_MAPI_UTILS::computeTax($order->getFixedCostAmount(), $tax); + $taxArr[$key]->setTaxAmount($amount); + $taxArr[$key]->lock(); + if (!isset($this->_taxFixedCostAmount[$cur])) + $this->_taxFixedCostAmount[$cur] = 0; + $this->_taxFixedCostAmount[$cur] += $amount; + } + + $cur++; + } + } + + /** + * Calcul le montant total HT des produits + * + */ + protected function computeItemsAmount() { + $itemsAmount = 0; + $cur = 0; + foreach($this->items as $item) { + $mt = sprintf("%.02f", $item->getPrice() * $item->getQuantity()); + + if (!isset($this->order[$cur])) + $cur = 0; + if (!isset($this->_itemsTotalAmount[$cur])) + $this->_itemsTotalAmount[$cur] = 0; + $this->_itemsTotalAmount[$cur] += $mt; + + $cur++; + } + } + + /** + * Retourne le montant total des taxes + * + * @param array $tItemsAmount + * @param array $tShippingAmount + * @param array $tInsuranceAmount + * @param array $tFixedCostAmount + */ + public function getTotalTaxes(&$tItemsAmount, &$tShippingAmount, &$tInsuranceAmount, &$tFixedCostAmount) { + $tItemsAmount = $this->getItemsTaxes(); + $tShippingAmount = $this->getShippingTaxes(); + $tInsuranceAmount = $this->getInsuranceTaxes(); + $tFixedCostAmount = $this->getFixedCostTaxes(); + } + + /** + * Retourne le montant des taxes sur les articles + * + * @return float + */ + public function getItemsTaxes() { + return $this->_taxItemsAmount; + } + + /** + * Retourne le montant des taxes sur les frais de port + * + * @return float + */ + public function getShippingTaxes() { + return $this->_taxShippingAmount; + } + + /** + * Retourne le montant des taxes sur les assurances + * + * @return float + */ + public function getInsuranceTaxes() { + return $this->_taxInsuranceAmount; + } + + /** + * Retourne le montant des taxes sur les couts fixes + * + * @return float + */ + public function getFixedCostTaxes() { + return $this->_taxFixedCostAmount; + } + + /** + * Retourne le montant total des produits + * + * @return array + */ + public function getItemsTotalAmount() { + return $this->_itemsTotalAmount; + } + + /** + * Retourne le montant total des taxes + * + * @return array + */ + public function getTaxesTotalAmount() { + return $this->_taxTotalAmount; + } + + /** + * Retourne le montant total hors taxes de la commande + * + * @return array + */ + public function getOrderTotalAmountHT() { + return $this->_orderTotalAmountHT; + } + + /** + * Retourne le montant total TTC de la commande + * + * @return array + */ + public function getOrderTotalAmount() { + return $this->_orderTotalAmount; + } + + /** + * Retourne le montant total des affiliés + * + * @return array + */ + public function getAffiliateTotalAmount() { + return $this->_affiliateTotalAmount; + } + + /** + * Retourne les objets order + * + * @return array + */ + public function getOrder() { + return $this->order; + } + + /** + * Retourne les objets items + * + * @return array + */ + public function getItems() { + return $this->items; + } + + /** + * Retourne l'objet paramètre + * + * @return HIPAY_MAPI_PaymentParams + */ + public function getPaymentParams() { + return $this->paymentParams; + } + + /** + * Calcul les montants à redistribuer aux affiliés + * + */ + protected function computeAffiliates() { + foreach($this->order as $k=>$order) { + $totalAmount = 0; + $tAffiliate = $order->getAffiliate(); + foreach($tAffiliate as $key=>$affiliate) { + $baseAmount = 0; + $percentageTarget = $affiliate->getPercentageTarget(); + if ($percentageTarget > 0) { + if ($percentageTarget & HIPAY_MAPI_TTARGET_ITEM) + $baseAmount +=$this->_itemsTotalAmount[$k]; + if ($percentageTarget & HIPAY_MAPI_TTARGET_TAX) + $baseAmount += $this->_taxItemsAmount[$k] + $this->_taxFixedCostAmount[$k] + $this->_taxInsuranceAmount[$k] + $this->_taxShippingAmount[$k]; + if ($percentageTarget& HIPAY_MAPI_TTARGET_INSURANCE) + $baseAmount += $order->getInsuranceAmount(); + if ($percentageTarget & HIPAY_MAPI_TTARGET_FCOST) + $baseAmount += $order->getFixedCostAmount(); + if ($percentageTarget & HIPAY_MAPI_TTARGET_SHIPPING) + $baseAmount += $order->getShippingAmount(); + + $tAffiliate[$key]->setBaseAmount($baseAmount); + } else { + $baseAmount = $affiliate->getValue(); + $tAffiliate[$key]->setBaseAmount($baseAmount); + } + + $totalAmount += $tAffiliate[$key]->getAmount(); + $tAffiliate[$key]->lock(); + } + + $this->_affiliateTotalAmount[$k] = $totalAmount; + if ($totalAmount > $this->_orderTotalAmount[$k]) { + throw new Exception('The total amount to distribute is greather than the transaction amount ('.$totalAmount.'/'.$this->_orderTotalAmount.')'); + } + } + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_paymentparams.php b/modules/hipay/mapi/mapi_paymentparams.php new file mode 100644 index 000000000..cbb6c8613 --- /dev/null +++ b/modules/hipay/mapi/mapi_paymentparams.php @@ -0,0 +1,880 @@ +<?php +/** + * Paramètres + * + */ +class HIPAY_MAPI_PaymentParams extends HIPAY_MAPI_lockable { + + /** + * Nom d'utilisateur pour se connecter à la plateforme + * + * @var string + */ + protected $login; + + /** + * Mot de passe de connexion + * + * @var string + */ + protected $password; + + /** + * Compte sur lequel verser le montant HT des produits + * + * @var int + */ + protected $itemAccount; + + /** + * Compte sur lequel verser le montant des taxes + * + * @var int + */ + protected $taxAccount; + + /** + * Compte sur lequel verser le montant des assurances + * + * @var int + */ + protected $insuranceAccount; + + /** + * Compte sur lequel verser le montant des coûts fixes + * + * @var int + */ + protected $fixedCostAccount; + + /** + * Compte sur lequel verser le montant des frais de livraison + * + * @var int + */ + protected $shippingCostAccount; + + /** + * Langue par défaut de l'interface de paiement + * + * @var string + */ + protected $defaultLang; + + /** + * Type d'interface de paiement + * + * @var string + */ + protected $media; + + /** + * Classe d'age à laquelle s'applique cette vente + * + * @var string + */ + protected $rating; + + /** + * Type du paiement (simple ou récurrent) + * + * @var int + */ + protected $paymentMethod; + + /** + * Délai de capture + * + * @var int + */ + protected $captureDay; + + /** + * Devise dans laquelle sont exprimés les montants + * + * @var string + */ + protected $currency; + + /** + * Identifiant de cette vente pour le marchant + * + * @var int + */ + protected $idForMerchant; + + /** + * Identifiant du site marchand tel que renseigné + * dans l'interface marchande de la plateforme + * + * @var int + */ + protected $merchantSiteId; + + + /** + * Identifiant du groupe statistique auquel appartient ce paiement + * + * @var int + */ + protected $statsGroupId; + + + /** + * Données propres au marchand + * + * @var string + */ + protected $merchantDatas; + + /** + * Url sur laquelle est redirigée le client si le paiement est ok + * + * @var string + */ + protected $url_ok; + + /** + * Url sur laquelle est redirigée le client si le paiement n'est pas ok + * + * @var string + */ + protected $url_nok; + + /** + * Url sur laquelle est redirigée le client si le paiement est annulé + * + * @var string + */ + protected $url_cancel; + + /** + * Url du script qui sera appellé pour signifier le résultat du paiement + * + * @var string + */ + protected $url_ack; + + /** + * Chaine de caractère devant etre retournée par le script $url_ack + * pour informer de la bonne réception des informations + * + * @var string + */ + protected $ack_wd; + + /** + * Adresse email vers laquelle la plateforme enverra un email + * pour informer d'un nouveau paiement + * + * @var string + */ + protected $email_ack; + + /** + * code hexa de la couleur de fond de l'interface + * + * @var string + */ + protected $bg_color; + + /** + * Url du logo du marchand + * + * @var string + */ + protected $logo_url; + + + /** + * Assigne le login et le mot de passe + * + * @param string $login + * @param string $password + * @return boolean + */ + public function setLogin($login, $password) { + if ($this->_locked) + return false; + + $login = HIPAY_MAPI_UTF8::forceUTF8($login); + if (empty($login)) + return false; + + $password = HIPAY_MAPI_UTF8::forceUTF8($password); + if (empty($password)) + return false; + + $this->login = $login; + $this->password = $password; + return true; + } + + /** + * Retourne le login + * + * @return string + */ + public function getLogin() { + return $this->login; + } + + /** + * Retourne le mot de passe + * + * @return string + */ + public function getPassword() { + return $this->password; + } + + /** + * Assigne les comptes sur lesquels seront versés les différents montants + * + * @param int $itemAccount + * @param int $taxAccount + * @param int $insuranceAccount + * @param int $fixedCostAccount + * @param int $shippingCostAccount + * @return boolean + */ + public function setAccounts($itemAccount, $taxAccount = 0, $insuranceAccount = 0, $fixedCostAccount =0, $shippingCostAccount = 0) { + if ($this->_locked) + return false; + + $itemAccount = (int)$itemAccount; + $taxAccount = (int)$taxAccount; + $insuranceAccount = (int)$insuranceAccount; + $fixedCostAccount = (int)$fixedCostAccount; + $shippingCostAccount = (int)$shippingCostAccount; + + if ($itemAccount <= 0) + return false; + if ($taxAccount <= 0) + $taxAccount = $itemAccount; + if ($insuranceAccount <= 0) + $insuranceAccount = $itemAccount; + if ($fixedCostAccount <= 0) + $fixedCostAccount = $itemAccount; + if ($shippingCostAccount <= 0) + $shippingCostAccount = $itemAccount; + + $this->itemAccount = $itemAccount; + $this->taxAccount = $taxAccount; + $this->insuranceAccount = $insuranceAccount; + $this->fixedCostAccount = $fixedCostAccount; + $this->shippingCostAccount = $shippingCostAccount; + + return true; + } + + /** + * Retourne le numéro de compte sur lequel sera versé + * le montant de produits + * + * @return int + */ + public function getItemAccount() { + return $this->itemAccount; + } + + /** + * Retourne le numéro de compte sur lequel sera versé + * le montant des taxes + * + * @return int + */ + public function getTaxAccount() { + return $this->taxAccount; + } + + /** + * Retourne le numéro de compte sur lequel sera versé + * le montant des assurances + * + * @return int + */ + public function getInsuranceAccount() { + return $this->insuranceAccount; + } + + /** + * Retourne le numéro de compte sur lequel sera versé + * le montant des coûts fixes + * + * @return int + */ + public function getFixedCostAccount() { + return $this->fixedCostAccount; + } + + /** + * Retourne le numéro de compte sur lequel sera versé + * le montant des frais d'envoi + * + * @return int + */ + public function getShippingCostAccount() { + return $this->shippingCostAccount; + } + + /** + * Assigne la lange par défaut (AZ_az = pays_langue) + * + * @param string $defaultLang + * @return boolean + */ + public function setDefaultLang($defaultLang) { + if ($this->_locked) + return false; + + if (!preg_match('#^[A-Z]{2}_[a-z]{2}$#', $defaultLang)) + return false; + + $this->defaultLang = $defaultLang; + return true; + } + + /** + * Retourne la langue par défaut + * + * @return string + */ + public function getDefaultLang() { + return $this->defaultLang; + } + + /** + * Défini le type d'interface de paiement + * + * @param string $media + * @return boolean + */ + public function setMedia($media) { + if ($this->_locked) + return false; + + if (!preg_match('#^[A-Z]+$#', $media)) + return false; + + $this->media = $media; + return true; + } + + /** + * Retourne le type d'interface de paiement + * + * @return string + */ + public function getMedia() { + return $this->media; + } + + /** + * Défini le public visé + * + * @param string $rating + * @return boolean + */ + public function setRating($rating) { + if ($this->_locked) + return false; + + $rating = trim(substr($rating, 0, HIPAY_MAPI_MAX_RATING_LENGTH)); + if ($rating == '') + return false; + + $this->rating = $rating; + return true; + } + + /** + * Retourne le type de public visé + * + * @return string + */ + public function getRating() { + return $this->rating; + } + + /** + * Défini si le paiement est simple ou récurrent + * + * @param int $paymentMethod + * @return boolean + */ + public function setPaymentMethod($paymentMethod) { + if ($this->_locked) + { + return false; + } + + $paymentMethod = (int)$paymentMethod; + if ($paymentMethod != HIPAY_MAPI_METHOD_SIMPLE && $paymentMethod != HIPAY_MAPI_METHOD_MULTI) + return false; + + $this->paymentMethod = $paymentMethod; + return true; + } + + /** + * Retourne le type de paiement (simple ou récurrent) + * + * @return int + */ + public function getPaymentMethod() { + return $this->paymentMethod; + } + + /** + * Défini le délai de capture + * + * @param int $captureDay + * @return boolean + */ + public function setCaptureDay($captureDay) { + if ($this->_locked) + return false; + + $captureDay = (int)$captureDay; + if (($captureDay != HIPAY_MAPI_CAPTURE_MANUAL && $captureDay != HIPAY_MAPI_CAPTURE_IMMEDIATE && $captureDay <= 0) || $captureDay > HIPAY_MAPI_CAPTURE_MAX_DAYS) + return false; + + $this->captureDay = $captureDay; + return true; + + } + + /** + * Retourne le délai de capture + * + * @return int + */ + public function getCaptureDay() { + return $this->captureDay; + } + + /** + * Défini la devise + * + * @param string $currency + * @return boolean + */ + public function setCurrency($currency) { + if ($this->_locked) + return false; + + if (!preg_match('#^[A-Z]{3}$#', $currency)) + return false; + + $this->currency = $currency; + return true; + } + + /** + * Retourne la devise + * + * @return string + */ + public function getCurrency() { + return $this->currency; + } + + + + /** + * Défini l'identifiant du groupe statistique auquel appartient ce paiement + * + * @param int $statsGroupId + * @return boolean + */ + public function setStatsGroupId($statsGroupId) { + if ($this->_locked) + return false; + + $statsGroupId = (int)$statsGroupId; + if ($statsGroupId < 0) + return false; + + $this->statsGroupId = $statsGroupId; + return true; + } + + + /** + * Retourne l'identifiant du groupe statistique auquel appartient ce paiement + * + * @return int + */ + public function getStatsGroupId() { + return $this->statsGroupId; + } + + + /** + * Défini l'identifiant de cette vente chez le marchand + * + * @param string $idForMerchant + * @return boolean + */ + public function setIdForMerchant($idForMerchant) { + if ($this->_locked) + return false; + + $this->idForMerchant = $idForMerchant; + return true; + } + + /** + * Retourne l'identifiant de la vente pour le marchand + * + * @return string + */ + public function getIdForMerchant() { + return $this->idForMerchant; + } + + /** + * Défini l'identifiant du site marchand + * + * @param int $merchantSiteId + * @return boolean + */ + public function setMerchantSiteId($merchantSiteId) { + if ($this->_locked) + return false; + + $merchantSiteId = (int)$merchantSiteId; + if ($merchantSiteId < 0) + return false; + + $this->merchantSiteId = $merchantSiteId; + return true; + } + + /** + * Retourne l'identifiant du site marchand + * + * @return int + */ + public function getMerchantSiteId() { + return $this->merchantSiteId; + } + + /** + * Assigne des données marchandes + * + * @param string $merchantDatas + * @return boolean + */ + public function setMerchantDatas($key,$merchantDatas) { + if ($this->_locked) + return false; + + if ($key == '') + return false; + + $merchantDatas = substr($merchantDatas, 0, HIPAY_MAPI_MAX_MDATAS_LENGTH); + $this->merchantDatas[$key] = $merchantDatas; + + return true; + } + + /** + * Retourne les données marchandes + * + * @return array + */ + public function getMerchantDatas() { + return $this->merchantDatas; + + } + + /** + * Assigne l'url à appeller si le paiement est ok + * + * @param string $url_ok + * @return unknown + */ + public function setUrlOk($url_ok) { + if ($this->_locked) + return false; + + $url_ok = trim($url_ok); + if (!HIPAY_MAPI_UTILS::checkURL($url_ok) && $url_ok != '') + return false; + + $this->url_ok = $url_ok; + return true; + } + + /** + * Retourne l'url_ok + * + * @return string + */ + public function getUrlOk() { + return $this->url_ok; + + } + + /** + * Assigne l'url à appeller si le paiement n'est pas ok + * + * @param string $url_nok + * @return unknown + */ + public function setUrlNok($url_nok) { + if ($this->_locked) + return false; + + $url_nok = trim($url_nok); + if (!HIPAY_MAPI_UTILS::checkURL($url_nok) && $url_nok != '') + return false; + + $this->url_nok = $url_nok; + return true; + } + + /** + * Retourne l'url_nok + * + * @return string + */ + public function getUrlNok() { + return $this->url_nok; + + } + + /** + * Assigne l'url à appeller si le paiement est annulé + * + * @param string $url_cancel + * @return boolean + */ + public function setUrlCancel($url_cancel) { + if ($this->_locked) + return false; + + $url_cancel = trim($url_cancel); + if (!HIPAY_MAPI_UTILS::checkURL($url_cancel) && $url_cancel != '') + return false; + + $this->url_cancel = $url_cancel; + return true; + } + + /** + * Retourne l'url_cancel + * + * @return string + */ + public function getUrlCancel() { + return $this->url_cancel; + } + + + /** + * Assigne l'url à appeller pour notifier le paiement + * + * @param string $url_cancel + * @return boolean + */ + public function setUrlAck($url_ack) { + if ($this->_locked) + return false; + + $url_ack = trim($url_ack); + if (!HIPAY_MAPI_UTILS::checkURL($url_ack) && $url_ack != '') + return false; + + $this->url_ack = $url_ack; + return true; + } + + /** + * Retourne l'url_ack + * + * @return string + */ + public function getUrlAck() { + return $this->url_ack; + } + + /** + * Assigne le mot clé d'acquittement + * + * @param string $ack_wd + * @return boolean + */ + public function setAckWd($ack_wd) { + if ($this->_locked) + return false; + + $ack_wd=trim($ack_wd); + if (strlen($ack_wd) > HIPAY_MAPI_MAX_ACKWD_LENGTH) + return false; + + $this->ack_wd = $ack_wd; + return true; + } + + /** + * Retourne le mot clé d'acquittement + * + * @return string + */ + public function getAckWd() { + return $this->ack_wd; + } + + /** + * Assigne l'adresse email de notification de paiement + * + * @param string $email_ack + * @return boolean + */ + public function setEmailAck($email_ack) { + if ($this->_locked) + return false; + + $email_ack = trim($email_ack); + if (strlen($email_ack) > HIPAY_MAPI_MAX_ACKMAIL_LENGTH || (!HIPAY_MAPI_UTILS::checkemail($email_ack) && $email_ack != '')) + return false; + + $this->email_ack = $email_ack; + return true; + } + + /** + * Retourne l'email de notification + * + * @return string + */ + public function getEmailAck() { + return $this->email_ack; + } + + /** + * Assigne la couleur de fond de l'interface (#XXXXXX) + * + * @param string $bg_color + * @return boolean + */ + public function setBackgroundColor($bg_color) { + if ($this->_locked) + return false; + + $bg_color = trim($bg_color); + if (!preg_match('#^\#([0-9a-f]){6}$#i', $bg_color) && $bg_color != '') + return false; + + $this->bg_color = $bg_color; + return true; + } + + /** + * Retourne la couleur de fond de l'interface + * + * @return string + */ + public function getBackgroundColor() { + return $this->bg_color; + } + + /** + * Assigne l'url du logo du marchand + * + * @param string $logo_url + * @return boolean + */ + public function setLogoUrl($logo_url) { + if ($this->_locked) + return false; + + $logo_url = trim($logo_url); + if (!HIPAY_MAPI_UTILS::checkURL($logo_url) && $logo_url != '') + return false; + + $this->logo_url = $logo_url; + return true; + } + + /** + * Retourne l'url du logo du marchand + * + * @return string + */ + public function getLogoUrl() { + return $this->logo_url; + } + + /** + * Vérifie que l'objet est correctement initialisé + * + * @return boolean + */ + public function check() { + if ($this->login == '') + throw new Exception('Username is missing'); + if ($this->itemAccount <= 0 || $this->taxAccount <= 0 || $this->insuranceAccount <= 0 || + $this->fixedCostAccount <= 0 || $this->shippingCostAccount <= 0) + throw new Exception('Invalid account numbers'); + + if ($this->rating == '') + throw new Exception('Invalid public target'); + if ($this->paymentMethod < 0) + throw new Exception('Invalid payment type'); + + if ($this->captureDay == -100) + throw new Exception('Invalid capture delay'); + if ($this->currency == '') + throw new Exception('Undefined currency'); + + if ($this->idForMerchant < 0) + throw new Exception('Merchant ID is missing'); + if ($this->idForMerchant > 0) + if ($this->password == '') + throw new Exception('Password is missing'); + + if ($this->statsGroupId < 0) + throw new Exception('Negative group ID'); + if ($this->merchantSiteId < 0) + throw new Exception('Merchant site ID is missing'); + + return true; + } + + protected function init() { + $this->login = ''; + $this->password = ''; + $this->itemAccount = 0; + $this->taxAccount = 0; + $this->insuranceAccount = 0; + $this->fixedCostAccount = 0; + $this->shippingCostAccount = 0; + $this->defaultLang = HIPAY_MAPI_DEFLANG; + $this->media = HIPAY_MAPI_DEFMEDIA; + $this->rating = ''; + $this->paymentMethod = -1; + $this->captureDay = -100; + $this->currency = ''; + $this->idForMerchant = -1; + $this->statsGroupId = 0; + $this->merchantSiteId = -1; + $this->merchantDatas = array(); + $this->url_ok = ''; + $this->url_nok = ''; + $this->url_cancel = ''; + $this->url_ack = ''; + $this->ack_wd = ''; + $this->email_ack = ''; + $this->bg_color = ''; + $this->logo_url = ''; + } + + function __construct() { + $this->init(); + parent::__construct(); + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_product.php b/modules/hipay/mapi/mapi_product.php new file mode 100644 index 000000000..9e0b253e7 --- /dev/null +++ b/modules/hipay/mapi/mapi_product.php @@ -0,0 +1,285 @@ +<?php +/** + * Représente une ligne de la commande pour un paiement simple + * + */ +class HIPAY_MAPI_Product extends HIPAY_MAPI_Item { + /** + * Nom du produit + * + * @var string + */ + protected $name; + + /** + * Informations sur le produit + * + * @var string + */ + protected $info; + + /** + * quantité + * + * @var int + */ + protected $quantity; + + /** + * Réference produit + * + * @var string + */ + protected $ref; + + /** + * Catégorie du produit + * + * @var int + */ + protected $category; + + /** + * Montant unitaire HT du produit + * + * @var float + */ + protected $price; + + /** + * Taxes s'appliquant à ce produit + * + * @var array + */ + protected $tax; + + /** + * Assigne le nom du produit + * + * @param string $name + * @return boolean + */ + public function setName($name) { + if ($this->_locked) + return false; + + $name = HIPAY_MAPI_UTF8::forceUTF8($name); + $len = HIPAY_MAPI_UTF8::strlen_utf8($name); + + if ($len < 1 || $len > HIPAY_MAPI_MAX_PRODUCT_NAME_LENGTH) + return false; + + $this->name = $name; + return true; + } + + /** + * Retourne le nom du produit + * + * @return string + */ + public function getName() { + return $this->name; + } + + /** + * Assigne les informations sur le produit + * + * @param string $info + * @return boolean + */ + public function setInfo($info) { + if ($this->_locked) + return false; + + $info = HIPAY_MAPI_UTF8::forceUTF8($info); + $len = HIPAY_MAPI_UTF8::strlen_utf8($info); + + if ($len > HIPAY_MAPI_MAX_PRODUCT_INFO_LENGTH) + return false; + + $this->info = $info; + return true; + } + + /** + * Retourne les informations sur le produit + * + * @return string + */ + public function getInfo() { + return $this->info; + } + + /** + * Assigne la quantité de produit + * + * @param int $quantity + * @return boolean + */ + public function setQuantity($quantity) { + if ($this->_locked) + return false; + + $quantity = (int)$quantity; + if ($quantity < 1) + return false; + + $this->quantity = $quantity; + return true; + } + + /** + * Retourne la quantité de produit + * + * @return int + */ + public function getQuantity() { + return $this->quantity; + } + + /** + * Assigne la réference du produit + * + * @param string $ref + * @return boolean + */ + public function setRef($ref) { + if ($this->_locked) + return false; + + $ref = HIPAY_MAPI_UTF8::forceUTF8($ref); + $len = HIPAY_MAPI_UTF8::strlen_utf8($ref); + if ($len > HIPAY_MAPI_MAX_PRODUCT_REF_LENGTH) + return false; + + $this->ref = $ref; + return true; + } + + /** + * Retourne la réference du produit + * + * @return string + */ + public function getRef() { + return $this->ref; + } + + + /** + * Assigne la catégorie du produit + * + * @param int $category + * @return boolean + */ + public function setCategory($category) { + if ($this->_locked) + return false; + + $category = (int)$category; + if ($category < 1) + return false; + + $this->category = $category; + return true; + } + + /** + * Retourne la catégorie du produit + * + * @return int + */ + public function getCategory() { + return $this->category; + } + + /** + * Assigne le montant unitaire HT du produit + * + * @param float $price + * @return boolean + */ + public function setPrice($price) { + if ($this->_locked) + return false; + + $price = sprintf('%.02f', (float)$price); + if ($price < 0) + return false; + + $this->price = $price; + return true; + } + + /** + * Retourne montant unitaire HT du produit + * + * @return float + */ + public function getPrice() { + return $this->price; + } + + /** + * Assigne les taxes s'appliquant à ce produit + * + * @param array $tax + * @return boolean + */ + public function setTax($tax) { + if ($this->_locked) + return false; + + if (empty($tax)) + return false; + if (!HIPAY_MAPI_UTILS::is_an_array_of($tax,'HIPAY_MAPI_Tax')) + return false; + + foreach ($tax as $obj) + $this->tax[]= clone $obj; + + return true; + } + + /** + * Retourne les taxes s'appliquant à ce produit + * + * @return array + */ + public function getTax() { + return $this->tax; + } + + /** + * Vérifie que l'objet est correctement initialisé + * + * @return boolean + */ + public function check() { + if ($this->name == '' || $this->quantity < 0 || $this->category < 0 || $this->price < 0 || !HIPAY_MAPI_UTILS::is_an_array_of($this->tax, 'HIPAY_MAPI_Tax')) + throw new Exception('Object not initialized. Please precise a product name, quantity, price, category and taxes'); + + foreach($this->tax as $obj) { + if (!$obj->check()) + return false; + } + + return true; + } + + protected function init() { + $this->name = ''; + $this->info = ''; + $this->quantity = -1; + $this->ref = ''; + $this->category = -1; + $this->price = -1; + $this->tax = array(); + } + + function __construct() { + $this->init(); + parent::__construct(); + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_send_xml.php b/modules/hipay/mapi/mapi_send_xml.php new file mode 100644 index 000000000..cd1fdd0b5 --- /dev/null +++ b/modules/hipay/mapi/mapi_send_xml.php @@ -0,0 +1,89 @@ +<?php +class HIPAY_MAPI_SEND_XML { + + /** + * Envoi le flux XML et retourne la réponse du serveur + * + * un timeout trop bas + * Une mauvaise url + * un proxy mal configuré s'il existe + * + * peuvent engendrer une erreur de connexion + * + * @param string $xml + * @return string + */ + public static function sendXML($xml, $url = "") { + $xml = self::prepare($xml); + + if ($url == "") + $turl = parse_url(HIPAY_GATEWAY_URL); + else + $turl = parse_url($url); + + if (!isset($turl['path'])) + $turl['path'] = '/'; + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_TIMEOUT, HIPAY_MAPI_CURL_TIMEOUT); + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_USERAGENT, "HIPAY"); + curl_setopt($curl, CURLOPT_URL, $turl['scheme'].'://'.$turl['host'].$turl['path']); + curl_setopt($curl, CURLOPT_POSTFIELDS, 'xml='.urlencode($xml)); + + if(HIPAY_MAPI_CURL_PROXY_ON === true) + { + curl_setopt($curl, CURLOPT_PROXY, HIPAY_MAPI_CURL_PROXY); + curl_setopt($curl, CURLOPT_PROXYPORT, HIPAY_MAPI_CURL_PROXYPORT); + } + + if(HIPAY_MAPI_CURL_LOG_ON === true) + { + $errorFileLog = fopen(HIPAY_MAPI_CURL_LOGFILE, "a+"); + curl_setopt($curl, CURLOPT_VERBOSE, true); + curl_setopt($curl, CURLOPT_STDERR, $errorFileLog); + } + + curl_setopt($curl, CURLOPT_HEADER, 0); + + ob_start(); + if (curl_exec($curl) !== true) + { + $output = $turl['scheme'].'://'.$turl['host'].$turl['path'].' is not reachable'; + $output .= '<br />Network problem ? Verify your proxy configuration in mapi_defs.php'; + } + else + $output = ob_get_contents(); + + ob_end_clean(); + curl_close($curl); + + if(HIPAY_MAPI_CURL_LOG_ON === true) + { + fclose($errorFileLog); + } + + return $output; + } + + /** + * Prépare le flux XML + * + * @param string $xml + * @return string + */ + public static function prepare($xml) { + $cleanXML = ''; + $xml = trim($xml); + $md5 = hash('md5', $xml); + $cleanXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; + $cleanXML .= "<mapi>\n"; + $cleanXML .= "<mapiversion>".MAPI_VERSION."</mapiversion>\n"; + $cleanXML .= '<md5content>'.$md5."</md5content>\n"; + $cleanXML .= $xml; + $cleanXML .= "\n</mapi>\n"; + + return trim($cleanXML); + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_simplepayment.php b/modules/hipay/mapi/mapi_simplepayment.php new file mode 100644 index 000000000..fb3e079a7 --- /dev/null +++ b/modules/hipay/mapi/mapi_simplepayment.php @@ -0,0 +1,19 @@ +<?php +/** + * Représente un paiement simple + * Un paiement simple contient : + * - 1 objet paramètres HIPAY_MAPI_PaymentParams + * - 1 objet order HIPAY_MAPI_Order + * - n objet produits représentant les lignes de la commande HIPAY_MAPI_Product + * + */ +class HIPAY_MAPI_SimplePayment extends HIPAY_MAPI_Payment { + + function __construct(HIPAY_MAPI_PaymentParams $paymentParams, HIPAY_MAPI_Order $order, $items) { + try { + parent::__construct($paymentParams, array($order), $items); + } catch(Exception $e) { + throw new Exception($e->getMessage()); + } + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_tax.php b/modules/hipay/mapi/mapi_tax.php new file mode 100644 index 000000000..4537f87e6 --- /dev/null +++ b/modules/hipay/mapi/mapi_tax.php @@ -0,0 +1,165 @@ +<?php +/** + * Gestion des taxes + * + */ +class HIPAY_MAPI_Tax extends HIPAY_MAPI_lockable +{ + /** + * nom de la taxe + * + * @var string + */ + protected $taxName; + + /** + * valeur de la taxe + * + * @var float + */ + protected $taxVal; + + /** + * true si la valeur de la taxe est un pourcentage + * + * @var boolean + */ + protected $percentage; + + /** + * Montant calculé de la taxe + * + * @var float + */ + protected $_amount; + + /** + * assigne le nom de la taxe + * + * @param string $taxName nom de la taxe + * @return boolean true si l'assignation s'est bien déroulée + */ + public function setTaxName($taxName) { + if ($this->_locked) + return false; + + $taxName = HIPAY_MAPI_UTF8::forceUTF8($taxName); + $len = HIPAY_MAPI_UTF8::strlen_utf8($taxName); + if ($len < 1 || $len > HIPAY_MAPI_MAX_TAX_NAME_LENGTH) + return false; + + $this->taxName = $taxName; + return true; + } + + /** + * retourne le nom de la taxe + * + * @return string nom de la taxe + */ + public function getTaxName() { + return $this->taxName; + } + + /** + * assigne la valeur de la taxe + * + * @param float $taxVal valeur de la taxe + * @param boolean $percentage true si la valeur de la taxe est un pourcentage + * @return boolean true si l'assignation s'est bien déroulée + */ + public function setTaxVal($taxVal, $percentage = true) { + if ($this->_locked) + return false; + + if (!is_bool($percentage)) + return false; + $taxVal = sprintf('%.02f', (float)$taxVal); + + if ($percentage && ($taxVal <= 0 || $taxVal > 100)) + return false; + + $this->taxVal = $taxVal; + $this->percentage = $percentage; + + return true; + } + + /** + * retourne la valeur de la taxe + * + * @return float valeur de la taxe + */ + public function getTaxVal() { + return $this->taxVal; + } + + /** + * détermine si la valeur de la taxe est un pourcentage + * + * @return boolean true si la valeur de la taxe est un pourcentage + */ + public function isPercentage() { + return $this->percentage; + } + + /** + * effectue une vérification des propriétés de la taxe + * + * @return boolean true si les propriétés de la taxe sont correctes + */ + public function check() { + if ($this->taxName == '' || $this->taxVal < 0) + throw new Exception('Tax name or Tax value not initialized'); + + return true; + } + + /** + * initilise les propriétés de la taxe + * + */ + protected function init() { + $this->taxVal = -1; + $this->taxName = ''; + $this->percentage = false; + $this->_amount = 0; + $this->_locked = false; + } + + /** + * assigne le montant calculé de la taxe + * + * @param float $amount montant calculé + * @return boolean true si l'assignation s'est bien déroulée + */ + public function setTaxAmount($amount) { + if ($this->_locked) + return false; + + $amount = (float)$amount; + if ($amount < 0) + $amount = 0; + + $this->_amount = sprintf("%.02f", $amount); + return true; + } + + /** + * retourne le montant calculé de la taxe + * + * @return float montant calculé + */ + public function getTaxAmount() { + return $this->_amount; + } + + /** + * constructeur + * + */ + function __construct() { + $this->init(); + parent::__construct(); + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_utf8.php b/modules/hipay/mapi/mapi_utf8.php new file mode 100644 index 000000000..8da930da0 --- /dev/null +++ b/modules/hipay/mapi/mapi_utf8.php @@ -0,0 +1,70 @@ +<?php +class HIPAY_MAPI_UTF8 +{ + /** + * Test si une chaine est en UTF-8 + * + * @param string $string + * @return boolean + */ + public static function is_utf8($string) { + // From http://w3.org/International/questions/qa-forms-utf-8.html + return preg_match('%^(?: + [\x09\x0A\x0D\x20-\x7E] # ASCII + | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )*$%xs', $string); + } + + + /** + * Encode une chaine en UTF-8 si elle ne l'est pas déjà + * + * @param string $string + * @return string + */ + public static function forceUTF8($string) { + if (!self::is_utf8($string)) + return utf8_encode($string); + else + return $string; + } + + + /** + * Longueur d'une chaine UTF-8 + * + * @param string $str + * @return int longueur de la chaine + */ + public static function strlen_utf8 ($str) { + $i = 0; + $count = 0; + $len = strlen ($str); + + while ($i < $len) + { + $chr = ord($str[$i]); + $count++; + $i++; + if ($i >= $len) + break; + + if ($chr & 0x80) + { + $chr <<= 1; + while ($chr & 0x80) + { + $i++; + $chr <<= 1; + } + } + } + return $count; + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_utils.php b/modules/hipay/mapi/mapi_utils.php new file mode 100644 index 000000000..b704608d8 --- /dev/null +++ b/modules/hipay/mapi/mapi_utils.php @@ -0,0 +1,73 @@ +<?php +class HIPAY_MAPI_UTILS { + + /** + * Vérifie si le tableau $array contient des objet $objectName + * + * @param array $array + * @param string $objectName + * @return boolean + */ + public static function is_an_array_of($array, $objectName) { + if (!is_array($array)) + return false; + try { + foreach($array as $obj) { + if (!($obj instanceof $objectName)) { + return false; + } + } + } catch (Exception $e) { + return false; + } + return true; + } + + /** + * Retourne le montant calculé d'une taxe en fonction de la valeur $itemValue + * + * @param float $itemValue + * @param HIPAY_MAPI_Tax $tax + * @return float + */ + public static function computeTax($itemValue, HIPAY_MAPI_Tax $tax) { + $itemValue = (float)$itemValue; + $taxAmount = 0; + if ($tax->isPercentage()) { + $taxAmount = sprintf("%.02f", ($itemValue / 100) * $tax->getTaxVal()); + } else { + $taxAmount += sprintf("%.02f", $tax->getTaxVal()); + } + return (float)$taxAmount; + } + + /** + * Vérifie la validité d'une URL + * + * @param string $url + * @return boolean + */ + public static function checkURL($url) { + return preg_match('#^(((http|https):\/\/){0,1})(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(.*)#i', $url); + } + + /** + * Vérifie la validité de l'email + * + * @param string $email + * @return boolean + */ + public static function checkemail($email) { + return preg_match('#^[_a-z0-9-]+(\.[_a-z0-9-]*)*@[a-z0-9-]+(\.[a-z0-9-]+)+$#i', $email); + } + + public static function parseDelay($delay) + { + $array = array_fill_keys(array('H', 'I', 'S', 'M', 'D', 'Y'), 0); + $n = substr($delay, 0, -1); + $r = substr($delay, -1, 1); + $array[strtoupper($r)] = $n; + + return $array; + } +} \ No newline at end of file diff --git a/modules/hipay/mapi/mapi_xml.php b/modules/hipay/mapi/mapi_xml.php new file mode 100644 index 000000000..3e8da9a2c --- /dev/null +++ b/modules/hipay/mapi/mapi_xml.php @@ -0,0 +1,72 @@ +<?php +class HIPAY_MAPI_XML { + + /** + * Cré le flux XML de cet objet. + * Les membres commençants par "_" sont ignorées + * + * @param int $t + * @return string + */ + public function getXML($t = 0, $noshow = true) { + $xml = ''; + $xml .= str_repeat(chr(9), $t)."<".get_class($this).">\n"; + + foreach($this as $name => $value) { + if ($noshow && substr($name, 0, 1) == '_') + continue; + + if (!is_array($this->$name) && !is_object($this->$name) && !is_bool($this->$name)) { + $xml .= str_repeat(chr(9), $t + 1)."<$name>$value</$name>\n"; + } else if (is_bool($this->$name)) { + if ($value === true) + $xml .= str_repeat(chr(9), $t + 1)."<$name>true</$name>\n"; + else + $xml .= str_repeat(chr(9), $t + 1)."<$name>false</$name>\n"; + } else if (is_object($this->$name) && method_exists($this->$name, 'getXML')) { + $xml .= $this->$name->getXml($t + 1); + } else if (is_array($this->$name)) { + $xml .= str_repeat(chr(9), $t + 1)."<$name>\n"; + $xml .= self::getXMLArray($this->$name, $t + 1, $noshow); + $xml .= str_repeat(chr(9), $t + 1)."</$name>\n"; + } + // else : no getXML method available + } + + $xml .= str_repeat(chr(9), $t)."</".get_class($this).">\n"; + return $xml; + } + + /** + * Cré le flux XML d'un tableau + * + * @param array $array + * @param int $t + * @return string + */ + protected function getXMLArray($array, $t = 0, $noshow = true) { + $xml = ''; + + foreach($array as $name => $value) { + if (substr($name, 0, 1) == '_') + continue; + + if (!is_array($array[$name]) && !is_object($array[$name]) && !is_bool($array[$name])) { + $xml .= str_repeat(chr(9), $t + 1)."<_aKey_$name>$value</_aKey_$name>\n"; + } else if (is_bool($array[$name])) { + if ($value === true) + $xml .= str_repeat(chr(9), $t + 1)."<$name>true</$name>\n"; + else + $xml .= str_repeat(chr(9), $t + 1)."<$name>false</$name>\n"; + } else if (is_object($array[$name]) && method_exists($array[$name], 'getXML')) { + $xml .= $array[$name]->getXml($t + 1); + } else if (is_array($array[$name])){ + $xml .= str_repeat(chr(9), $t + 1)."<$name>\n"; + $xml .= self::getXMLArray($array[$name], $t + 1, $noshow); + $xml .= str_repeat(chr(9), $t + 1)."</$name>\n"; + } + } + + return $xml; + } +} \ No newline at end of file diff --git a/modules/hipay/payment.tpl b/modules/hipay/payment.tpl new file mode 100644 index 000000000..9529f2dd1 --- /dev/null +++ b/modules/hipay/payment.tpl @@ -0,0 +1,39 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p class="payment_module"> + {if $cart->getOrderTotal() < 2} + <a href=""> + <img src="{$this_path}hipay.png" alt="{l s='Pay with Hipay' mod='hipay'}" /> + {l s='Minimum amount required in order to pay with Hipay:' mod='hipay'} {convertPrice price=2} + </a> + {else} + <a href="{$this_path_ssl}redirect.php" title="{l s='Pay with Hipay' mod='hipay'}"> + <img src="{$this_path}hipay.png" alt="{l s='Pay with Hipay' mod='hipay'}" /> + {l s='Pay with Hipay' mod='hipay'} {if !$hipay_prod}{l s='(sandbox / test mode)' mod='hipay'}{/if} + </a> + {/if} +</p> \ No newline at end of file diff --git a/modules/hipay/redirect.php b/modules/hipay/redirect.php new file mode 100644 index 000000000..fb4a252ab --- /dev/null +++ b/modules/hipay/redirect.php @@ -0,0 +1,41 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/hipay.php'); + +if (!$cookie->isLogged(true)) + Tools::redirect('index.php?controller=authentication&back=order.php'); + +$hipay = new HiPay(); +$hipay->payment(); + + diff --git a/modules/hipay/screenshots/accountnumber.png b/modules/hipay/screenshots/accountnumber.png new file mode 100644 index 0000000000000000000000000000000000000000..820a423686c043d5a39c6b13017953996d0c7ea2 GIT binary patch literal 17281 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 W>X$G<6bb_TCm|vuTqgL%_x}L5KpRT{ literal 0 HcmV?d00001 diff --git a/modules/hipay/screenshots/merchantpassword.png b/modules/hipay/screenshots/merchantpassword.png new file mode 100644 index 0000000000000000000000000000000000000000..e03742a903dd8c9d57113335578cb2df02ff518e GIT binary patch literal 40449 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 literal 0 HcmV?d00001 diff --git a/modules/hipay/screenshots/siteid.png b/modules/hipay/screenshots/siteid.png new file mode 100644 index 0000000000000000000000000000000000000000..688aded296e20d56baf1a7ab9538f5f2ebd6baf4 GIT binary patch literal 43597 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 literal 0 HcmV?d00001 diff --git a/modules/hipay/validation.php b/modules/hipay/validation.php new file mode 100644 index 000000000..0ff93aa6c --- /dev/null +++ b/modules/hipay/validation.php @@ -0,0 +1,33 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/hipay.php'); +$hipay = new HiPay(); +$hipay->validation(); + + diff --git a/modules/homefeatured/config.xml b/modules/homefeatured/config.xml new file mode 100755 index 000000000..a743125c5 --- /dev/null +++ b/modules/homefeatured/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>homefeatured</name> + <displayName><![CDATA[Featured Products on the homepage]]></displayName> + <version><![CDATA[0.9]]></version> + <description><![CDATA[Displays Featured Products in the middle of your homepage.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/homefeatured/de.php b/modules/homefeatured/de.php new file mode 100644 index 000000000..2eaf58359 --- /dev/null +++ b/modules/homefeatured/de.php @@ -0,0 +1,20 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{homefeatured}prestashop>homefeatured_ca7d973c26c57b69e0857e7a0332d545'] = 'Ausgewählte Produkte'; +$_MODULE['<{homefeatured}prestashop>homefeatured_d3da97e2d9aee5c8fbe03156ad051c99'] = 'Mehr'; +$_MODULE['<{homefeatured}prestashop>homefeatured_4351cfebe4b61d8aa5efa1d020710005'] = 'Anzeigen'; +$_MODULE['<{homefeatured}prestashop>homefeatured_2d0f6b8300be19cf35e89e66f0677f95'] = 'In den Warenkorb'; +$_MODULE['<{homefeatured}prestashop>homefeatured_e0e572ae0d8489f8bf969e93d469e89c'] = 'Keine ausgewählten Produkte'; +$_MODULE['<{homefeatured}prestashop>homefeatured_cd2c2dc24eaf11ba856da4a2e2a248be'] = 'Ausgewählte Produkte auf der Startseite'; +$_MODULE['<{homefeatured}prestashop>homefeatured_bedd0eb227b31705fce270fe1ec5639f'] = 'Zeigt Ausgewählte Produkte in der Mitte Ihrer Startseite an'; +$_MODULE['<{homefeatured}prestashop>homefeatured_dd0de17e8450a0fd3248b19c4a4f803b'] = 'Ungültige Anzahl von Produkten'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{homefeatured}prestashop>homefeatured_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{homefeatured}prestashop>homefeatured_6df1f9b5662398a551a2c9185b26638a'] = 'Um Produkte zu Ihrer Startseite hinzufügen, fügen Sie einfach sie zur die \"Start\"-Kategorie hinzu.'; +$_MODULE['<{homefeatured}prestashop>homefeatured_3c230497560c52be92b93c65de9defc9'] = 'Anzahl der angezeigten Produkte'; +$_MODULE['<{homefeatured}prestashop>homefeatured_5bc8290012fcc597689ef8959c2fc969'] = 'Anzahl der auf der Startseite angezeigten Produkte (Standard: 10)'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/homefeatured/en.php b/modules/homefeatured/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/homefeatured/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/homefeatured/es.php b/modules/homefeatured/es.php new file mode 100644 index 000000000..d392efb0d --- /dev/null +++ b/modules/homefeatured/es.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{homefeatured}prestashop>homefeatured_cd2c2dc24eaf11ba856da4a2e2a248be'] = 'Productos Destacados en la Página de inicio'; +$_MODULE['<{homefeatured}prestashop>homefeatured_bedd0eb227b31705fce270fe1ec5639f'] = 'Mostrar Productos Destacados en el centro de su página de inicio'; +$_MODULE['<{homefeatured}prestashop>homefeatured_dd0de17e8450a0fd3248b19c4a4f803b'] = 'Número de productos no válido'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{homefeatured}prestashop>homefeatured_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{homefeatured}prestashop>homefeatured_6df1f9b5662398a551a2c9185b26638a'] = 'Para añadir productos a su página de inicio, sólo tiene que añadirlas en la categoía \\\"Inicio\\\" .'; +$_MODULE['<{homefeatured}prestashop>homefeatured_3c230497560c52be92b93c65de9defc9'] = 'Número de productos mostrados'; +$_MODULE['<{homefeatured}prestashop>homefeatured_5bc8290012fcc597689ef8959c2fc969'] = 'Número de productos mostrados en la página de inicio (por defecto: 10)'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{homefeatured}prestashop>homefeatured_ca7d973c26c57b69e0857e7a0332d545'] = 'Productos destacados'; +$_MODULE['<{homefeatured}prestashop>homefeatured_d3da97e2d9aee5c8fbe03156ad051c99'] = 'Más'; +$_MODULE['<{homefeatured}prestashop>homefeatured_4351cfebe4b61d8aa5efa1d020710005'] = 'Ver'; +$_MODULE['<{homefeatured}prestashop>homefeatured_2d0f6b8300be19cf35e89e66f0677f95'] = 'Añadir al carrito'; +$_MODULE['<{homefeatured}prestashop>homefeatured_e0e572ae0d8489f8bf969e93d469e89c'] = 'No hay productos destacados'; diff --git a/modules/homefeatured/fr.php b/modules/homefeatured/fr.php new file mode 100644 index 000000000..f212da397 --- /dev/null +++ b/modules/homefeatured/fr.php @@ -0,0 +1,18 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{homefeatured}prestashop>homefeatured_cd2c2dc24eaf11ba856da4a2e2a248be'] = 'Produits phares sur la page d\'accueil'; +$_MODULE['<{homefeatured}prestashop>homefeatured_bedd0eb227b31705fce270fe1ec5639f'] = 'Affiche les produits phares au centre de votre page d\'accueil'; +$_MODULE['<{homefeatured}prestashop>homefeatured_dd0de17e8450a0fd3248b19c4a4f803b'] = 'Nombre de produit invalide'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{homefeatured}prestashop>homefeatured_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{homefeatured}prestashop>homefeatured_6df1f9b5662398a551a2c9185b26638a'] = 'Pour ajouter des produits à votre page d\'accueil, ajoutez-les simplement à la catégorie \"Accueil\" du catalogue.'; +$_MODULE['<{homefeatured}prestashop>homefeatured_3c230497560c52be92b93c65de9defc9'] = 'Nombre de produits'; +$_MODULE['<{homefeatured}prestashop>homefeatured_5bc8290012fcc597689ef8959c2fc969'] = 'Le nombre de produits affichés sur la page d\'accueil (défaut : 10)'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{homefeatured}prestashop>homefeatured_ca7d973c26c57b69e0857e7a0332d545'] = 'Produits phares'; +$_MODULE['<{homefeatured}prestashop>homefeatured_d3da97e2d9aee5c8fbe03156ad051c99'] = 'Plus d\'infos'; +$_MODULE['<{homefeatured}prestashop>homefeatured_4351cfebe4b61d8aa5efa1d020710005'] = 'Plus d\'infos'; +$_MODULE['<{homefeatured}prestashop>homefeatured_2d0f6b8300be19cf35e89e66f0677f95'] = 'Ajouter au panier'; +$_MODULE['<{homefeatured}prestashop>homefeatured_e0e572ae0d8489f8bf969e93d469e89c'] = 'Aucun produit phare'; diff --git a/modules/homefeatured/homefeatured.php b/modules/homefeatured/homefeatured.php new file mode 100644 index 000000000..6d84ae79f --- /dev/null +++ b/modules/homefeatured/homefeatured.php @@ -0,0 +1,107 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class HomeFeatured extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + function __construct() + { + $this->name = 'homefeatured'; + $this->tab = 'front_office_features'; + $this->version = '0.9'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Featured Products on the homepage'); + $this->description = $this->l('Displays Featured Products in the middle of your homepage.'); + } + + function install() + { + if (!Configuration::updateValue('HOME_FEATURED_NBR', 8) OR !parent::install() OR !$this->registerHook('home')) + return false; + return true; + } + + public function getContent() + { + $output = '<h2>'.$this->displayName.'</h2>'; + if (Tools::isSubmit('submitHomeFeatured')) + { + $nbr = (int)(Tools::getValue('nbr')); + if (!$nbr OR $nbr <= 0 OR !Validate::isInt($nbr)) + $errors[] = $this->l('Invalid number of products'); + else + Configuration::updateValue('HOME_FEATURED_NBR', (int)($nbr)); + if (isset($errors) AND sizeof($errors)) + $output .= $this->displayError(implode('<br />', $errors)); + else + $output .= $this->displayConfirmation($this->l('Settings updated')); + } + return $output.$this->displayForm(); + } + + public function displayForm() + { + $output = ' + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend> + <p>'.$this->l('In order to add products to your homepage, just add them to the "home" category.').'</p><br /> + <label>'.$this->l('Number of products displayed').'</label> + <div class="margin-form"> + <input type="text" size="5" name="nbr" value="'.Tools::getValue('nbr', (int)(Configuration::get('HOME_FEATURED_NBR'))).'" /> + <p class="clear">'.$this->l('The number of products displayed on homepage (default: 10).').'</p> + + </div> + <center><input type="submit" name="submitHomeFeatured" value="'.$this->l('Save').'" class="button" /></center> + </fieldset> + </form>'; + return $output; + } + + function hookHome($params) + { + global $smarty; + + $category = new Category(1, Configuration::get('PS_LANG_DEFAULT')); + $nb = (int)(Configuration::get('HOME_FEATURED_NBR')); + $products = $category->getProducts((int)$params['cookie']->id_lang, 1, ($nb ? $nb : 10), NULL, NULL, false, true, false, 1, true, $this->shopID); + $smarty->assign(array( + 'products' => $products, + 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), + 'homeSize' => Image::getSize('home'))); + + return $this->display(__FILE__, 'homefeatured.tpl'); + } +} diff --git a/modules/homefeatured/homefeatured.tpl b/modules/homefeatured/homefeatured.tpl new file mode 100644 index 000000000..6a3f000a8 --- /dev/null +++ b/modules/homefeatured/homefeatured.tpl @@ -0,0 +1,64 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Home Featured Products --> +<div id="featured-products_block_center" class="block products_block"> + <h4>{l s='Featured products' mod='homefeatured'}</h4> + {if isset($products) AND $products} + <div class="block_content"> + {assign var='liHeight' value=342} + {assign var='nbItemsPerLine' value=4} + {assign var='nbLi' value=$products|@count} + {math equation="nbLi/nbItemsPerLine" nbLi=$nbLi nbItemsPerLine=$nbItemsPerLine assign=nbLines} + {math equation="nbLines*liHeight" nbLines=$nbLines|ceil liHeight=$liHeight assign=ulHeight} + <ul style="height:{$ulHeight}px;"> + {foreach from=$products item=product name=homeFeaturedProducts} + <li class="ajax_block_product {if $smarty.foreach.homeFeaturedProducts.first}first_item{elseif $smarty.foreach.homeFeaturedProducts.last}last_item{else}item{/if} {if $smarty.foreach.homeFeaturedProducts.iteration%$nbItemsPerLine == 0}last_item_of_line{elseif $smarty.foreach.homeFeaturedProducts.iteration%$nbItemsPerLine == 1}clear{/if} {if $smarty.foreach.homeFeaturedProducts.iteration > ($smarty.foreach.homeFeaturedProducts.total - ($smarty.foreach.homeFeaturedProducts.total % $nbItemsPerLine))}last_line{/if}"> + <h5><a href="{$product.link}" title="{$product.name|truncate:32:'...'|escape:'htmlall':'UTF-8'}">{$product.name|truncate:27:'...'|escape:'htmlall':'UTF-8'}</a></h5> + <div class="product_desc"><a href="{$product.link}" title="{l s='More' mod='homefeatured'}">{$product.description_short|strip_tags|truncate:130:'...'}</a></div> + <a href="{$product.link}" title="{$product.name|escape:html:'UTF-8'}" class="product_image"><img src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home')}" height="{$homeSize.height}" width="{$homeSize.width}" alt="{$product.name|escape:html:'UTF-8'}" /></a> + <div> + {if $product.show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE}<p class="price_container"><span class="price">{if !$priceDisplay}{convertPrice price=$product.price}{else}{convertPrice price=$product.price_tax_exc}{/if}</span></p>{else}<div style="height:21px;"></div>{/if} + <a class="button" href="{$product.link}" title="{l s='View' mod='homefeatured'}">{l s='View' mod='homefeatured'}</a> + {if ($product.id_product_attribute == 0 OR (isset($add_prod_display) AND ($add_prod_display == 1))) AND $product.available_for_order AND !isset($restricted_country_mode) AND $product.minimal_quantity == 1 AND $product.customizable != 2 AND !$PS_CATALOG_MODE} + {if ($product.quantity > 0 OR $product.allow_oosp)} + <a class="exclusive ajax_add_to_cart_button" rel="ajax_id_product_{$product.id_product}" href="{$link->getPageLink('cart', true, NULL, "qty=1&amp;id_product={$product.id_product}&amp;token={$static_token}&amp;add")}" title="{l s='Add to cart' mod='homefeatured'}">{l s='Add to cart' mod='homefeatured'}</a> + {else} + <span class="exclusive">{l s='Add to cart' mod='homefeatured'}</span> + {/if} + {else} + <div style="height:23px;"></div> + {/if} + </div> + </li> + {/foreach} + </ul> + </div> + {else} + <p>{l s='No featured products' mod='homefeatured'}</p> + {/if} +</div> +<!-- /MODULE Home Featured Products --> diff --git a/modules/homefeatured/it.php b/modules/homefeatured/it.php new file mode 100644 index 000000000..1eaba51a2 --- /dev/null +++ b/modules/homefeatured/it.php @@ -0,0 +1,20 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{homefeatured}prestashop>homefeatured_ca7d973c26c57b69e0857e7a0332d545'] = 'prodotti in vetrina'; +$_MODULE['<{homefeatured}prestashop>homefeatured_d3da97e2d9aee5c8fbe03156ad051c99'] = 'Più'; +$_MODULE['<{homefeatured}prestashop>homefeatured_4351cfebe4b61d8aa5efa1d020710005'] = 'Visualizza'; +$_MODULE['<{homefeatured}prestashop>homefeatured_2d0f6b8300be19cf35e89e66f0677f95'] = 'Aggiungi al carrello'; +$_MODULE['<{homefeatured}prestashop>homefeatured_e0e572ae0d8489f8bf969e93d469e89c'] = 'Nessun prodotto in vetrina'; +$_MODULE['<{homefeatured}prestashop>homefeatured_cd2c2dc24eaf11ba856da4a2e2a248be'] = 'Prodotti in vetrina sulla homepage'; +$_MODULE['<{homefeatured}prestashop>homefeatured_bedd0eb227b31705fce270fe1ec5639f'] = 'Mostra Prodotti in vetrina nel cuore della tua home page'; +$_MODULE['<{homefeatured}prestashop>homefeatured_dd0de17e8450a0fd3248b19c4a4f803b'] = 'Numero non valido di prodotti'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{homefeatured}prestashop>homefeatured_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{homefeatured}prestashop>homefeatured_6df1f9b5662398a551a2c9185b26638a'] = 'Per poter aggiungere prodotti alla tua home page, basta aggiungere alla categoria \"home\".'; +$_MODULE['<{homefeatured}prestashop>homefeatured_3c230497560c52be92b93c65de9defc9'] = 'Numero di prodotto esposto'; +$_MODULE['<{homefeatured}prestashop>homefeatured_5bc8290012fcc597689ef8959c2fc969'] = 'Il numero di prodotti esposti in homepage (default: 10)'; +$_MODULE['<{homefeatured}prestashop>homefeatured_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/homefeatured/logo.gif b/modules/homefeatured/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8847824364c22aceb6dbe5c68526a2f50dc2131 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc*ekBUTU;@_3CY9Ce_u|;k|(kUOF4Pqu;-O-?X#3xVZSv?VC%N zF5TDR6jc(DvpMn1nKPGG=BK5l&73)NUcU3e>-)RAyDRP079Uu+q2B4iy*oEg96Y|H zEOu_#w{PEe^@Q{$_}1(zTwCumEh}`-%q-7x*C(GJ^_^;-5M!~U#roCl<EgU~TUuI{ zUt4f~b<NYKPj}ThB~FMvIwk1)hnE|h{U;||Pnk01>Xl2!A0J*=;&!mheMgmL;o3~! zR`<kp5sUI|H#a%hRastGnt5nW+T!E$cePj@Xm{IHYdxi>=kl7;y;FiNud96g@cyA5 zuc*$5xSHtL#UWFotlr!?zPH6Gc}jB8j?AT{HVgv_6o0ZXvNOms=zv@SiW3I*O%1Y5 z&9X*DEgdcTOjfR)9aff(j)pw_O>RB{v%RMF&lE6paWT}Dljv|W^q6X9W-ljgY}XuQ zI5&u&ot-OGQQ1OW)@i%p&fUAYOoZ7?lmeI7OP)C4&8jXYC9CP=F3ZmOkds|jRQ^`8 z>26LTA?7EXdL5#>ncr%E_#~@p&cPzi&ZZO5(C^wW>#Py5km(R3kGM7y%Zd#wEt~@W d3<?hxG`Tc0YHM}$JZNd>Qt;J_<ziv51^@;B$;$u$ literal 0 HcmV?d00001 diff --git a/modules/iadvize/config.xml b/modules/iadvize/config.xml new file mode 100755 index 000000000..00bdc8420 --- /dev/null +++ b/modules/iadvize/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>iadvize</name> + <displayName><![CDATA[iAdvize]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[Offer an interactive live chat to your customers]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/iadvize/de.php b/modules/iadvize/de.php new file mode 100644 index 000000000..874fe1fc8 --- /dev/null +++ b/modules/iadvize/de.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{iadvize}prestashop>iadvize_439a106a26eb0e34079618cc72d3d920'] = 'Bieten Sie Ihren Kunden einen interaktiven Live-Chat'; +$_MODULE['<{iadvize}prestashop>iadvize_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{iadvize}prestashop>iadvize_162167872bb576ce8c76785ec4c4cb37'] = 'iAdvize ist ein interaktiver Live-Chat'; +$_MODULE['<{iadvize}prestashop>iadvize_895cd381041fa87a2dbfca7904de7209'] = 'mit dem Sie direkt auf Ihre Besucher reagieren und sie zu den Produkten führen können, die ihren Bedürfnissen entsprechen.'; +$_MODULE['<{iadvize}prestashop>iadvize_dfb55db021feb46384cc7215190b777a'] = 'Für weitere Informationen, klicken Sie hier'; +$_MODULE['<{iadvize}prestashop>iadvize_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{iadvize}prestashop>iadvize_f6c38837bb877b26405a7fd792d2e741'] = 'iAdvize Händler-ID:'; +$_MODULE['<{iadvize}prestashop>iadvize_d2fd5b945bd364e52b2be4cf584b1f8e'] = 'iAdvize \"Anruftaste\" ID:'; +$_MODULE['<{iadvize}prestashop>iadvize_ab4abc3ebef89969caf167af7b90bcec'] = 'Leer lassen, wenn Sie diese Funktion nicht aktivieren wollen'; +$_MODULE['<{iadvize}prestashop>iadvize_34d5d712f0fd89ca0950d5df4bf7b346'] = '\"Anruftaste\" Standort:'; +$_MODULE['<{iadvize}prestashop>iadvize_a3ab67209a2c6b0df679f22380d7e0c8'] = 'Keine Anruftaste'; +$_MODULE['<{iadvize}prestashop>iadvize_f9e4884c7654daa6581b42ed90aeaba4'] = 'Linke Spalte'; +$_MODULE['<{iadvize}prestashop>iadvize_feb6cc332459769fe15570bf332a6b50'] = 'Rechte Spalte'; +$_MODULE['<{iadvize}prestashop>iadvize_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{iadvize}prestashop>iadvize_70397c4b252a5168c5ec003931cea215'] = 'Pflichtfelder'; + +?> \ No newline at end of file diff --git a/modules/iadvize/es.php b/modules/iadvize/es.php new file mode 100644 index 000000000..a9af2191f --- /dev/null +++ b/modules/iadvize/es.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{iadvize}prestashop>iadvize_439a106a26eb0e34079618cc72d3d920'] = 'Proponga a sus clientes un chat interactivo en directo'; +$_MODULE['<{iadvize}prestashop>iadvize_c888438d14855d7d96a2724ee9c306bd'] = 'Parámetros actualizados'; +$_MODULE['<{iadvize}prestashop>iadvize_162167872bb576ce8c76785ec4c4cb37'] = 'Advice es un chat interactivo en directo'; +$_MODULE['<{iadvize}prestashop>iadvize_895cd381041fa87a2dbfca7904de7209'] = 'que le permite responder directamente a sus visitantes y orientarlos hacia los productos que responden a sus necesidades.'; +$_MODULE['<{iadvize}prestashop>iadvize_dfb55db021feb46384cc7215190b777a'] = 'Para más información, pulse aquí'; +$_MODULE['<{iadvize}prestashop>iadvize_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{iadvize}prestashop>iadvize_f6c38837bb877b26405a7fd792d2e741'] = 'ID vendedor iAdvize:'; +$_MODULE['<{iadvize}prestashop>iadvize_d2fd5b945bd364e52b2be4cf584b1f8e'] = 'ID botón de llamada iAdvize:'; +$_MODULE['<{iadvize}prestashop>iadvize_ab4abc3ebef89969caf167af7b90bcec'] = 'Deje vacío si no desea activar esta aplicación'; +$_MODULE['<{iadvize}prestashop>iadvize_34d5d712f0fd89ca0950d5df4bf7b346'] = 'Posición del \"Botón llamar\"'; +$_MODULE['<{iadvize}prestashop>iadvize_a3ab67209a2c6b0df679f22380d7e0c8'] = 'No hay botón de llamada'; +$_MODULE['<{iadvize}prestashop>iadvize_f9e4884c7654daa6581b42ed90aeaba4'] = 'Columna de izquierda'; +$_MODULE['<{iadvize}prestashop>iadvize_feb6cc332459769fe15570bf332a6b50'] = 'Columna de derecha'; +$_MODULE['<{iadvize}prestashop>iadvize_b17f3f4dcf653a5776792498a9b44d6a'] = 'Guardar'; +$_MODULE['<{iadvize}prestashop>iadvize_70397c4b252a5168c5ec003931cea215'] = 'Campos necesarios'; diff --git a/modules/iadvize/fr.php b/modules/iadvize/fr.php new file mode 100644 index 000000000..a0590c002 --- /dev/null +++ b/modules/iadvize/fr.php @@ -0,0 +1,19 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{iadvize}prestashop>iadvize_439a106a26eb0e34079618cc72d3d920'] = 'Offrez un chat interactif en direct à vos clients'; +$_MODULE['<{iadvize}prestashop>iadvize_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{iadvize}prestashop>iadvize_162167872bb576ce8c76785ec4c4cb37'] = 'iAdvize est un chat en direct interactif'; +$_MODULE['<{iadvize}prestashop>iadvize_895cd381041fa87a2dbfca7904de7209'] = 'vous permettant de répondre directement à vos visiteurs et les orienter vers les produits qui répondent à leurs besoins.'; +$_MODULE['<{iadvize}prestashop>iadvize_dfb55db021feb46384cc7215190b777a'] = 'Pour plus d\'informations, cliquez ici'; +$_MODULE['<{iadvize}prestashop>iadvize_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{iadvize}prestashop>iadvize_f6c38837bb877b26405a7fd792d2e741'] = 'ID marchand iAdvize :'; +$_MODULE['<{iadvize}prestashop>iadvize_d2fd5b945bd364e52b2be4cf584b1f8e'] = 'ID bouton d\'appel iAdvize :'; +$_MODULE['<{iadvize}prestashop>iadvize_ab4abc3ebef89969caf167af7b90bcec'] = 'Laissez vide si vous ne souhaitez pas activer cette fonctionnalité'; +$_MODULE['<{iadvize}prestashop>iadvize_34d5d712f0fd89ca0950d5df4bf7b346'] = 'Position du \"Bouton appeler\"'; +$_MODULE['<{iadvize}prestashop>iadvize_a3ab67209a2c6b0df679f22380d7e0c8'] = 'Pas de bouton d\'appel'; +$_MODULE['<{iadvize}prestashop>iadvize_f9e4884c7654daa6581b42ed90aeaba4'] = 'Colonne de gauche'; +$_MODULE['<{iadvize}prestashop>iadvize_feb6cc332459769fe15570bf332a6b50'] = 'Colonne de droite'; +$_MODULE['<{iadvize}prestashop>iadvize_b17f3f4dcf653a5776792498a9b44d6a'] = 'Enregistrer'; +$_MODULE['<{iadvize}prestashop>iadvize_70397c4b252a5168c5ec003931cea215'] = 'Champs requis'; diff --git a/modules/iadvize/iadvize.php b/modules/iadvize/iadvize.php new file mode 100755 index 000000000..123efd47d --- /dev/null +++ b/modules/iadvize/iadvize.php @@ -0,0 +1,161 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class iAdvize extends Module +{ + function __construct() + { + $this->name = 'iadvize'; + $this->tab = 'front_office_features'; + $this->version = '1.0'; + $this->displayName = 'iAdvize'; + $this->need_instance = 0; + + parent::__construct(); + + $this->description = $this->l('Offer an interactive live chat to your customers'); + } + + function install() + { + if (!parent::install() OR !$this->registerHook('footer') OR !$this->registerHook('leftColumn') OR !$this->registerHook('rightColumn')) + return false; + return true; + } + + function uninstall() + { + if (!Configuration::deleteByName('IADVIZE_SID') OR !Configuration::deleteByName('IADVIZE_BID') OR !parent::uninstall()) + return false; + return true; + } + + public function getContent() + { + global $cookie; + + $lang = new Language((int)($cookie->id_lang)); + if (!in_array($lang->iso_code, array('fr', 'en', 'es'))) + $lang->iso_code = 'en'; + + $output = '<p style="margin-bottom: 20px;"><img src="'.__PS_BASE_URI__.'modules/'.$this->name.'/logo-iadvize.gif" alt="" /></p>'; + + if (Tools::isSubmit('submitiAdvize')) + { + Configuration::updateValue('IADVIZE_SID', (int)(Tools::getValue('iadvize_sid'))); + Configuration::updateValue('IADVIZE_BID', (int)(Tools::getValue('iadvize_bid'))); + Configuration::updateValue('IADVIZE_BUTTON', (int)(Tools::getValue('iadvize_button'))); + + $output .= ' + <div class="conf confirm"> + <img src="../img/admin/ok.gif" alt="" title="" /> + '.$this->l('Settings updated').'<img src="http://www.prestashop.com/modules/iadvize.png?sid='.urlencode(Tools::getValue('iadvize_sid')).'" style="float:right" /> + </div>'; + } + + $output .= ' + <div style="float: left; width: 550px;"> + <p style="margin: 15px 0 30px 0; width: 540px; line-height: 18px; text-align: justify;"> + <b>'.$this->l('iAdvize is an interactive live chat').'</b> '.$this->l('allowing you to respond directly to your visitors and direct them towards the product that meets their needs.').' + <br /> + <a href="http://www.iadvize.com/offre_prestashop.html" target="_blank">'.$this->l('For more information, click here').'</a> + </p> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset class="width2"> + <legend><img src="../img/admin/cog.gif" alt="" class="middle" />'.$this->l('Settings').'</legend> + <label>'.$this->l('iAdvize merchant ID:').'</label> + <div class="margin-form"> + <input type="text" name="iadvize_sid" value="'.(int)(Tools::getValue('iadvize_sid', Configuration::get('IADVIZE_SID'))).'" /> <sup>*</sup> + </div> + <hr size="1" style="margin-bottom: 20px;" noshade /> + <label>'.$this->l('iAdvize "Call button" ID:').'</label> + <div class="margin-form"> + <input type="text" name="iadvize_bid" value="'.(int)(Tools::getValue('iadvize_bid', Configuration::get('IADVIZE_BID'))).'" /> + <p class="clear">'.$this->l('Leave empty if you do not want to enable this feature.').'</p> + </div> + <label style="vertical-align: middle;">'.$this->l('"Call button" location:').'</label> + <div class="margin-form" style="margin-top: 5px;"> + <input type="radio" name="iadvize_button" value="0" style="vertical-align: middle;" /> '.$this->l('No call button').'&nbsp; + <input type="radio" name="iadvize_button" value="1" style="vertical-align: middle;" /> '.$this->l('Left column').'&nbsp; + <input type="radio" name="iadvize_button" value="2" style="vertical-align: middle;" /> '.$this->l('Right column').' + </div> + <hr size="1" style="margin-bottom: 20px;" noshade /> + <center><input type="submit" name="submitiAdvize" value="'.$this->l('Update settings').'" class="button" /></center> + </fieldset> + <p style="font-size: 10px;"><sup>*</sup> '.$this->l('Required fields').'</p> + </form> + </div> + <div style="float: left; margin-left: 50px; width: 200px;"> + '.(file_exists(dirname(__FILE__).'/offer-'.$lang->iso_code.'.jpg') ? ' + <p><a href="http://www.iadvize.com/offre_prestashop.html" target="_blank"><img src="'.__PS_BASE_URI__.'modules/'.$this->name.'/offer-'.$lang->iso_code.'.jpg"></a></p> + ' : '').' + </div> + <div class="clear"></div>'; + + return $output; + } + + private function _displayCallButton() + { + return "\n".' + <!-- iAdvize - Call button --> + <div style="margin: 20px 0;"> + <script type="text/javascript"> + var iAdvize = ((\'https:\' == document.location.protocol) ? \'https://\' : \'http://\'); + document.write(unescape(\'%3Cscript src="\' + iAdvize + \'livechat.iadvize.com/chat_button.js?bid='.(int)(Configuration::get('IADVIZE_BID')).'" type="text/javascript"%3E%3C/script%3E\')); + </script> + </div> + <!-- /End - iAdvize - Call button -->'."\n"; + } + + public function hookLeftColumn($params) + { + if (Configuration::get('IADVIZE_BUTTON') == 1) + return $this->_displayCallButton(); + } + + public function hookRightColumn($params) + { + if (Configuration::get('IADVIZE_BUTTON') == 2) + return $this->_displayCallButton(); + } + + public function hookFooter($params) + { + return "\n".' + <!-- iAdvize - Live chat --> + <script type="text/javascript"> + '.(isset($params['cookie']->id_customer) ? 'var idzCustomData = {\'extID\':\''.(int)($params['cookie']->id_customer).'\'};' : '').' + var iAdvize = ((\'https:\' == document.location.protocol) ? \'https://\' : \'http://\'); + document.write(unescape(\'%3Cscript src="\' + iAdvize + \'livechat.iadvize.com/chat_init.js?sid='.(int)(Configuration::get('IADVIZE_SID')).'" type="text/javascript"%3E%3C/script%3E\')); + + </script> + <!-- /End - iAdvize - Live chat -->'."\n"; + } +} \ No newline at end of file diff --git a/modules/iadvize/it.php b/modules/iadvize/it.php new file mode 100644 index 000000000..1f0fa418f --- /dev/null +++ b/modules/iadvize/it.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{iadvize}prestashop>iadvize_439a106a26eb0e34079618cc72d3d920'] = 'Offrire una live chat interattiva per i tuoi clienti'; +$_MODULE['<{iadvize}prestashop>iadvize_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{iadvize}prestashop>iadvize_162167872bb576ce8c76785ec4c4cb37'] = 'iAdvize è una live chat interattiva'; +$_MODULE['<{iadvize}prestashop>iadvize_895cd381041fa87a2dbfca7904de7209'] = 'che consente di rispondere direttamente ai tuoi visitatori e indirizzarli verso il prodotto che soddisfi le loro esigenze.'; +$_MODULE['<{iadvize}prestashop>iadvize_dfb55db021feb46384cc7215190b777a'] = 'Per maggiori informazioni, clicca qui'; +$_MODULE['<{iadvize}prestashop>iadvize_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{iadvize}prestashop>iadvize_f6c38837bb877b26405a7fd792d2e741'] = 'ID commerciante iAdvize:'; +$_MODULE['<{iadvize}prestashop>iadvize_d2fd5b945bd364e52b2be4cf584b1f8e'] = 'ID \"Tasto di chiamata\" iAdvize'; +$_MODULE['<{iadvize}prestashop>iadvize_ab4abc3ebef89969caf167af7b90bcec'] = 'Lascia vuoto se non vuoi attivare questa funzionalità'; +$_MODULE['<{iadvize}prestashop>iadvize_34d5d712f0fd89ca0950d5df4bf7b346'] = 'Posizione \"Tasto di chiamata\"'; +$_MODULE['<{iadvize}prestashop>iadvize_a3ab67209a2c6b0df679f22380d7e0c8'] = 'Nessun tasto di chiamata'; +$_MODULE['<{iadvize}prestashop>iadvize_f9e4884c7654daa6581b42ed90aeaba4'] = 'Colonna di sinistra'; +$_MODULE['<{iadvize}prestashop>iadvize_feb6cc332459769fe15570bf332a6b50'] = 'Colonna di destra'; +$_MODULE['<{iadvize}prestashop>iadvize_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{iadvize}prestashop>iadvize_70397c4b252a5168c5ec003931cea215'] = 'I campi obbligatori'; + +?> \ No newline at end of file diff --git a/modules/iadvize/logo-iadvize.gif b/modules/iadvize/logo-iadvize.gif new file mode 100755 index 0000000000000000000000000000000000000000..82e4da3ce0fac00ff57c48e4db61814217d257e0 GIT binary patch literal 4771 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 bG)LS_(%*^pM|KN<ZV^tU`RPd_1X%tLJ(4h8 literal 0 HcmV?d00001 diff --git a/modules/iadvize/logo.gif b/modules/iadvize/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..193edf06fee464b1acf86020a1c831e567050a1a GIT binary patch literal 585 zcmZ?wbhEHb6krfwc*el+?9;t>@7_IpeisP#UR}NQ#_Tz#D_5;r)xAZib(6r%nKNrP z@Hej%EMCi7vx2{GYDd;8?zq*eiOadVdpe?)a&&Zb1TGN`S<LRckS%Ejuh)Fmz*+3B z^H`jwu{us=DK9T~=w(Z(2n%fCwdrDZY~x5O3NtBZb}Qs}$yag6=Z%UE3y%!7%VaZ6 z5w=TY*G^{APvWr&XEzUH(+y(L4CK@C7SQ%&F?43rb`mnRFqU&=(z9ffHx$y)QkKyY zl2j8BmlNezVw8{+5)l^^78T<VVqoWFWME+U|NlRb9Q;7>CkrDxg9n2S$f=+>VPId@ z;L+6F(%Q->YU%Fotj*l!!S3v4uBT({=q}vK?rzP;Eg&Q!q2|ip%;;>*!O1J&;vyj< zXVdQ?>c+##y?&$A0cF)DOY=RvlIoh`GG}Epn%oU}*DG1LsGK`{(MVvCkg1EpEtw`; zGoi)e4)#w3o8(=k#U)f+OrEecF}qtGP<WGIv6&%ZLQ~y2s|@Xc7YP%^m1p&4I5J#f T5Oos!$)U(F>9|uP1A{dHg9v`D literal 0 HcmV?d00001 diff --git a/modules/iadvize/offer-fr.jpg b/modules/iadvize/offer-fr.jpg new file mode 100755 index 0000000000000000000000000000000000000000..970d0fecccb492df95d90be06e21a867c7d58ae7 GIT binary patch literal 23217 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 literal 0 HcmV?d00001 diff --git a/modules/importerosc/config.xml b/modules/importerosc/config.xml new file mode 100644 index 000000000..e8c37ade1 --- /dev/null +++ b/modules/importerosc/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>importerosc</name> + <displayName><![CDATA[Importer osCommerce]]></displayName> + <version><![CDATA[1.0]]></version> + <description><![CDATA[This module allows you to import from osCommerce to Prestashop.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[migration_tools]]></tab> + <is_configurable>0</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/importerosc/de.php b/modules/importerosc/de.php new file mode 100644 index 000000000..6b7e879af --- /dev/null +++ b/modules/importerosc/de.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{importerosc}prestashop>importerosc_e273168c3697c35b8c737d14b1a5fb26'] = 'Importeur osCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_f4a344f88bab7b04a73077bafc8a0187'] = 'Mit diesem Modul können Sie von osCommerce nach Prestashop importieren'; +$_MODULE['<{importerosc}prestashop>importerosc_2737b271f276b90d8a04ea4b9d18b920'] = 'Standardsprache osCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_1b473540f20c3e31ead53f84511d6c77'] = 'Standardwährung osCommerce '; +$_MODULE['<{importerosc}prestashop>importerosc_6c61ebc45acfe2f244e91ac4cd423e81'] = 'Shop URL'; +$_MODULE['<{importerosc}prestashop>importerosc_a1831ea8716cc4375483dc42bf5fde96'] = 'Bitte wählen Sie einen Standardsprache'; +$_MODULE['<{importerosc}prestashop>importerosc_375e6e17d4bd18a5163d3a7d13b80b4b'] = 'Bitte wählen Sie eine Standardwährung'; +$_MODULE['<{importerosc}prestashop>importerosc_294f0969b5f80f1bae24a7183eb338d5'] = 'Bitte stellen Sie Ihren Shop URL ein'; +$_MODULE['<{importerosc}prestashop>importerosc_86545d77ce5790e924190d9b5a7ac1b6'] = 'Standardgruppe OS Commerce'; + +?> \ No newline at end of file diff --git a/modules/importerosc/es.php b/modules/importerosc/es.php new file mode 100644 index 000000000..ed6ea55ce --- /dev/null +++ b/modules/importerosc/es.php @@ -0,0 +1,14 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{importerosc}prestashop>importerosc_e273168c3697c35b8c737d14b1a5fb26'] = 'Importer osCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_f4a344f88bab7b04a73077bafc8a0187'] = 'Este módulo permite importar su tienda OsCommerce en PrestaShop'; +$_MODULE['<{importerosc}prestashop>importerosc_2737b271f276b90d8a04ea4b9d18b920'] = 'Idioma por defecto OsCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_1b473540f20c3e31ead53f84511d6c77'] = 'Moneda por defecto OsCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_6c61ebc45acfe2f244e91ac4cd423e81'] = 'URL de la tienda'; +$_MODULE['<{importerosc}prestashop>importerosc_f106e79e646e4262fae765f77db9ca91'] = 'Especificar la URL de su sitio oscommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_a89a64592edf58aee0fc749735902cea'] = 'Por favor, seleccione un idioma por defecto'; +$_MODULE['<{importerosc}prestashop>importerosc_375e6e17d4bd18a5163d3a7d13b80b4b'] = 'Por favor seleccione una moneda por defecto'; +$_MODULE['<{importerosc}prestashop>importerosc_294f0969b5f80f1bae24a7183eb338d5'] = 'Por favor, establezca la URL de su tienda'; +$_MODULE['<{importerosc}prestashop>importerosc_86545d77ce5790e924190d9b5a7ac1b6'] = 'Sistema operativo por defecto Grupo de Comercio'; diff --git a/modules/importerosc/fr.php b/modules/importerosc/fr.php new file mode 100644 index 000000000..f68c35499 --- /dev/null +++ b/modules/importerosc/fr.php @@ -0,0 +1,14 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{importerosc}prestashop>importerosc_e273168c3697c35b8c737d14b1a5fb26'] = 'Import OsCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_f4a344f88bab7b04a73077bafc8a0187'] = 'Ce module permet d\'importer votre boutique OsCommerce dans prestashop'; +$_MODULE['<{importerosc}prestashop>importerosc_2737b271f276b90d8a04ea4b9d18b920'] = 'Langue par défaut OsCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_1b473540f20c3e31ead53f84511d6c77'] = 'Devise par défaut OsCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_6c61ebc45acfe2f244e91ac4cd423e81'] = 'Url de la boutique'; +$_MODULE['<{importerosc}prestashop>importerosc_f106e79e646e4262fae765f77db9ca91'] = 'Indiquez l\'URL racine de votre site oscommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_a89a64592edf58aee0fc749735902cea'] = 'Merci de choisir une langue par défaut'; +$_MODULE['<{importerosc}prestashop>importerosc_375e6e17d4bd18a5163d3a7d13b80b4b'] = 'Merci de choisir la devise par défaut'; +$_MODULE['<{importerosc}prestashop>importerosc_294f0969b5f80f1bae24a7183eb338d5'] = 'Merci de choisir l\'url de la boutique'; +$_MODULE['<{importerosc}prestashop>importerosc_86545d77ce5790e924190d9b5a7ac1b6'] = 'Group par défaut OsCommerce'; diff --git a/modules/importerosc/importerosc.php b/modules/importerosc/importerosc.php new file mode 100644 index 000000000..c2eece072 --- /dev/null +++ b/modules/importerosc/importerosc.php @@ -0,0 +1,434 @@ +<?php +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class importerosc extends ImportModule +{ + public function __construct() + { + global $cookie; + + $this->name = 'importerosc'; + $this->tab = 'migration_tools'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->theImporter = 1; + $this->need_instance = 1; + + parent::__construct (); + + $this->displayName = $this->l('Importer osCommerce'); + $this->description = $this->l('This module allows you to import from osCommerce to Prestashop.'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('beforeAuthentication')) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall()) + return false; + return true; + } + + public function displaySpecificOptions() + { + $langagues = $this->ExecuteS('SELECT * FROM `'.addslashes($this->prefix).'languages`'); + $curencies = $this->ExecuteS('SELECT * FROM `'.addslashes($this->prefix).'currencies`'); + + $html = '<label style="width:220px">'.$this->l('Default osCommerce language').' : </label> + <div class="margin-form"> + <select name="defaultOscLang"><option value="0">------</option>'; + foreach($langagues AS $lang) + $html .= '<option value="'.$lang['languages_id'].'">'.$lang['name'].'</option>'; + $html .= '</select></div> + <label style="width:220px">'.$this->l('Default osCommerce currency').' : </label> + <div class="margin-form"> + <select name="defaultOscCurrency"><option value="0">------</option>'; + foreach($curencies AS $curency) + $html .= '<option value="'.$curency['currencies_id'].'">'.$curency['title'].'</option>'; + $html .= '</select></div>'; + $html .= '<label style="width:220px">'.$this->l('Shop url').' : </label> + <div class="margin-form"> + http://<input type="text" name="shop_url">/ + <p>'.$this->l('Specify the root URL of your site oscommerce').'</p> + </div>'; + + + + return $html; + } + + + public function validateSpecificOptions() + { + $errors = array(); + if (Tools::getValue('defaultOscLang') == 0) + $errors[] = $this->l('Please select a default language'); + if (Tools::getValue('defaultOscCurrency') == 0) + $errors[] = $this->l('Please select a default currency'); + if (Tools::getValue('shop_url') == '') + $errors[] = $this->l('Please set your shop url'); + if (!sizeof($errors)) + die('{"hasError" : false, "error" : []}'); + else + die('{"hasError" : true, "error" : '.Tools::jsonEncode($errors).'}'); + } + + + public function getDefaultIdLang () + { + return Tools::getValue('defaultOscLang'); + } + + public function getDefaultIdCurrency () + { + return Tools::getValue('defaultOscCurrency'); + } + + + public function getLangagues($limit = 0, $nrb_import = 100) + { + $identifier = 'id_lang'; + $langagues = $this->ExecuteS('SELECT languages_id as id_lang, name as name, code as iso_code, 1 as active FROM `'.addslashes($this->prefix).'languages` LIMIT '.(int)($limit).' , '.(int)$nrb_import); + return $this->autoFormat($langagues, $identifier); + } + + public function getCurrencies($limit = 0, $nrb_import = 100) + { + $identifier = 'id_currency'; + $currencies = $this->ExecuteS(' + SELECT currencies_id as id_currency, title as name, code as iso_code, 0 as format, 999 as iso_code_num, 1 as decimals, + CONCAT(`symbol_left`, `symbol_right`) as sign, value as conversion_rate + FROM `'.addslashes($this->prefix).'currencies` LIMIT '.(int)($limit).' , '.(int)$nrb_import + ); + return $this->autoFormat($currencies, $identifier); + } + + public function getZones($limit = 0, $nrb_import = 100) + { + $identifier = 'id_zone'; + $zones = $this->ExecuteS('SELECT geo_zone_id as id_zone, geo_zone_name as name, 1 as active FROM `'.addslashes($this->prefix).'geo_zones` LIMIT '.(int)($limit).' , '.(int)$nrb_import); + return $this->autoFormat($zones, $identifier); + } + + public function getCountries($limit = 0, $nrb_import = 100) + { + $multiLangFields = array('name'); + $keyLanguage = 'id_lang'; + $identifier = 'id_country'; + $defaultIdLang = $this->getDefaultIdLang(); + $countries = $this->ExecuteS(' + SELECT countries_id as id_country, countries_name as name, countries_iso_code_2 as iso_code, '.$defaultIdLang.' as id_lang, + 1 as id_zone, 0 as id_currency, 1 as contains_states, 1 as need_identification_number, 1 as active, 1 as display_tax_label + FROM `'.addslashes($this->prefix).'countries` as c LIMIT '.(int)($limit).' , '.(int)$nrb_import); + return $this->autoFormat($countries, $identifier, $keyLanguage, $multiLangFields); + } + + public function getStates($limit = 0, $nrb_import = 100) + { + $identifier = 'id_state'; + $states = array( + 0 => array( + 'id_state' => 0, + 'id_country' => 0, + 'id_zone' => 0, + 'iso_code' => 999, + 'name' => 'osc', + 'active' => 0 + ) + ); + return $this->autoFormat($states, $identifier); + } + + public function getGroups() + { + $idLang = $this->getDefaultIdLang(); + return array( 1 => array( + 'id_group' => 1, + 'price_display_method' => 0, + 'name' => array($idLang => $this->l('Default osCommerce Group')) + ) + ); + } + + public function getCustomers($limit = 0, $nrb_import = 100) + { + $genderMatch = array('m' => 1,'f' => 2); + $identifier = 'id_customer'; + $customers = $this->ExecuteS(' + SELECT c.`customers_id` as id_customer, 1 as id_default_group, c.`customers_gender` as id_gender, c.`customers_firstname` as firstname, + IFNULL( STRCMP(c.`customers_newsletter`, \'\') , 0 ) as newsletter, c.`customers_lastname` as lastname, + DATE(c.`customers_dob`) as birthday, c.`customers_email_address` as email, c.`customers_password` as passwd, 1 as active, + ci.`customers_info_date_account_created` as date_add + FROM `'.addslashes($this->prefix).'customers` c + LEFT JOIN `'.addslashes($this->prefix).'customers_info` ci ON (c.`customers_id` = ci.`customers_info_id`) + LIMIT '.(int)($limit).' , '.(int)$nrb_import + ); + + foreach($customers AS &$customer) + if (isset($customer['id_gender']) && array_key_exists($customer['id_gender'], $genderMatch)) + $customer['id_gender'] = $genderMatch[$customer['id_gender']]; + else + $customer['id_gender'] = 9; + + return $this->autoFormat($customers, $identifier); + } + + public function getAddresses($limit = 0, $nrb_import = 100) + { + $identifier = 'id_address'; + $addresses = $this->ExecuteS(' + SELECT address_book_id as id_address, customers_id as id_customer, CONCAT(customers_id, \'_address\') as alias, entry_company as company, entry_firstname as firstname, + entry_lastname as lastname, entry_street_address as address1, entry_postcode as postcode, entry_city as city, entry_country_id as id_country, 0 as id_state + FROM `'.addslashes($this->prefix).'address_book` LIMIT '.(int)($limit).' , '.(int)$nrb_import); + return $this->autoFormat($addresses, $identifier); + } + + public function getCategories($limit = 0, $nrb_import = 100) + { + $multiLangFields = array('name', 'link_rewrite'); + $keyLanguage = 'id_lang'; + $identifier = 'id_category'; + + $categories = $this->ExecuteS(' + SELECT c.categories_id as id_category, c.parent_id as id_parent, 0 as level_depth, cd.language_id as id_lang, cd.categories_name as name , 1 as active, categories_image as images + FROM `'.addslashes($this->prefix).'categories` c + LEFT JOIN `'.addslashes($this->prefix).'categories_description` cd ON (c.categories_id = cd.categories_id) + WHERE cd.categories_name IS NOT NULL AND cd.language_id IS NOT NULL + ORDER BY c.categories_id, cd.language_id + LIMIT '.(int)($limit).' , '.(int)$nrb_import); + foreach($categories as& $cat) + { + $cat['link_rewrite'] = Tools::link_rewrite($cat['name']); + $cat['images'] = array(Tools::getProtocol().Tools::getValue('shop_url').'/images/'.$cat['images']); + } + return $this->autoFormat($categories, $identifier, $keyLanguage, $multiLangFields); + } + + public function getAttributesGroups($limit = 0, $nrb_import = 100) + { + $multiLangFields = array('name', 'public_name'); + $keyLanguage = 'id_lang'; + $identifier = 'id_attribute_group'; + $countries = $this->ExecuteS(' + SELECT products_options_id as id_attribute_group, products_options_name as name , products_options_name as public_name, language_id as id_lang, 0 as is_color_group + FROM `'.addslashes($this->prefix).'products_options` + LIMIT '.(int)($limit).' , '.(int)$nrb_import); + return $this->autoFormat($countries, $identifier, $keyLanguage, $multiLangFields); + } + + public function getAttributes($limit = 0, $nrb_import = 100) + { + $multiLangFields = array('name'); + $keyLanguage = 'id_lang'; + $identifier = 'id_attribute'; + $countries = $this->ExecuteS(' + SELECT p.`products_options_values_id` as id_attribute, p.`products_options_values_name` as name, p.`language_id` as id_lang , po.`products_options_id` as id_attribute_group + FROM `'.addslashes($this->prefix).'products_options_values` p + LEFT JOIN `'.addslashes($this->prefix).'products_options_values_to_products_options` po ON (po.products_options_values_id = p.products_options_values_id) + LIMIT '.(int)($limit).' , '.(int)$nrb_import); + return $this->autoFormat($countries, $identifier, $keyLanguage, $multiLangFields); + } + + public function getProducts($limit = 0, $nrb_import = 100) + { + $multiLangFields = array('name', 'link_rewrite', 'description'); + $keyLanguage = 'id_lang'; + $identifier = 'id_product'; + $products = $this->ExecuteS(' + SELECT p.`products_id` as id_product, p.`products_quantity` as quantity, p.`products_model` as reference, p.`products_price` as price, p.`products_weight` as weight, + IFNULL(STRCMP(p.`products_status`, \'\') , 0 ) as active, p.`manufacturers_id` as id_manufacturer, pd.language_id as id_lang, pd.products_name as name, + pd.products_description as description, CONCAT(\''.Tools::getProtocol().Tools::getValue('shop_url').'\/images/\',p.`products_image`) as images, + (SELECT ptc.categories_id FROM `'.addslashes($this->prefix).'products_to_categories` ptc WHERE ptc.`products_id` = p.`products_id` LIMIT 1) as id_category_default, + p.`products_date_added` as date_add + FROM `'.addslashes($this->prefix).'products` p + LEFT JOIN `'.addslashes($this->prefix).'products_description` pd ON (p.products_id = pd.products_id) + WHERE pd.products_name IS NOT NULL AND pd.language_id IS NOT NULL + LIMIT '.(int)($limit).' , '.(int)$nrb_import); + + $this->Execute('CREATE TABLE IF NOT EXISTS`products_images` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `products_id` int(11) NOT NULL, + `image` varchar(64) DEFAULT NULL, + `htmlcontent` text, + `sort_order` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `products_images_prodid` (`products_id`) + )'); + foreach($products as& $product) + { + $result = $this->ExecuteS('SELECT `image` FROM `'.addslashes($this->prefix).'products_images` WHERE products_id = '.(int)$product['id_product']); + $images = array(); + foreach($result as $res) + $images[] = Tools::getProtocol().Tools::getValue('shop_url').'/images/'.$res['image']; + $product['images'] = array_merge(array($product['images']), $images); + $product['link_rewrite'] = Tools::link_rewrite($product['name']); + $product['association'] = array('category_product' => array($product['id_category_default'] => $product['id_product'])); + } + return $this->autoFormat($products, $identifier, $keyLanguage, $multiLangFields); + } + + public function getProductsCombination($limit = 0, $nrb_import = 100) + { + $identifier = 'id_product_attribute'; + $combinations = $this->ExecuteS(' + SELECT products_attributes_id as id_product_attribute, products_id as id_product, options_values_price as price, options_values_id + FROM `'.addslashes($this->prefix).'products_attributes` LIMIT '.(int)($limit).' , '.(int)$nrb_import); + foreach($combinations as& $combination) + { + $combination['association'] = array('product_attribute_combination' => array($combination['options_values_id'] => $combination['id_product_attribute'])); + unset($combination['options_values_price']); + } + return $this->autoFormat($combinations, $identifier); + } + + public function getManufacturers($limit = 0, $nrb_import = 100) + { + $identifier = 'id_manufacturer'; + $manufacturers = $this->ExecuteS(' + SELECT manufacturers_id as id_manufacturer, manufacturers_name as name, 1 as active, manufacturers_image as images + FROM `'.addslashes($this->prefix).'manufacturers` LIMIT '.(int)($limit).' , '.(int)$nrb_import); + foreach($manufacturers as& $manufacturer) + $manufacturer['images'] = array(Tools::getProtocol().Tools::getValue('shop_url').'/images/'.$manufacturer['images']); + + return $this->autoFormat($manufacturers, $identifier); + } + + public function getOrdersStates($limit = 0, $nrb_import = 100) + { + $multiLangFields = array('name'); + $keyLanguage = 'id_lang'; + $identifier = 'id_order_state'; + $ordersStates = $this->ExecuteS(' + SELECT `orders_status_id` as id_order_state, `language_id` as id_lang, `orders_status_name` as name , 1 as hidden + FROM `'.addslashes($this->prefix).'orders_status` + LIMIT '.(int)($limit).' , '.(int)$nrb_import);//IF(`public_flag` = 0, 1, 0) as hidden + return $this->autoFormat($ordersStates, $identifier, $keyLanguage, $multiLangFields); + } + + public function getOrders($limit = 0, $nrb_import = 100) + { + $orders = array(); + $addresses = $this->ExecuteS('SELECT customers_id as id_customer, address_book_id as id_address FROM `'.addslashes($this->prefix).'address_book` GROUP BY customers_id'); + $matchAddresses = array(); + foreach($addresses as $address) + $matchAddresses[$address['id_customer']] = $address['id_address']; + $psCarrierDefault = (int)Configuration::get('PS_CARRIER_DEFAULT'); + $psCurrency = Currency::getCurrencies(); + + foreach($psCurrency as $key => $currency) + { + $psCurrency[$currency['iso_code']] = $currency['id_currency']; + unset($psCurrency[$key]); + } + + $orders = $this->ExecuteS(' + SELECT orders_id as id_cart, '.$psCarrierDefault.' as id_carrier, 1 as id_lang, currency as id_currency, customers_id as id_customer, payment_method as payment, 1 as valid, + date_purchased as date_add, last_modified as date_upd + FROM `'.addslashes($this->prefix).'orders` LIMIT '.(int)($limit).' , '.(int)$nrb_import); + foreach($orders as $key => $order) + { + $orders[$key]['id_currency'] = (array_key_exists($order['id_currency'], $psCurrency) ? $psCurrency[$order['id_currency']] : 0); + $orders[$key]['id_address_delivery'] = (array_key_exists($order['id_customer'], $matchAddresses) ? $matchAddresses[$order['id_customer']] : 0); + $orders[$key]['id_address_invoice'] = (array_key_exists($order['id_customer'], $matchAddresses) ? $matchAddresses[$order['id_customer']] : 0); + $orders[$key]['total_paid'] = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_total\''); + $orders[$key]['total_paid_real'] = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_total\''); + $orders[$key]['total_products'] = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_shipping\''); + $tax = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_tax\''); + $orders[$key]['total_products_wt'] = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_total\'') - $tax; + $orders[$key]['total_shipping'] = $this->getValue('SELECT value FROM `'.addslashes($this->prefix).'orders_total` WHERE `orders_id` = '.$order['id_cart'].' AND class=\'ot_shipping\''); + $orders[$key]['total_discounts'] = 0; + $orders[$key]['total_wrapping'] = 0; + $orders[$key]['cart_products'] = $this->ExecuteS(' + SELECT `orders_id` as id_cart, `products_id` as id_product, 0 as id_product_attribute, `products_quantity` as quantity + FROM `'.addslashes($this->prefix).'orders_products` WHERE `orders_id` = '.$order['id_cart']); + $orders[$key]['order_products'] = $this->ExecuteS(' + SELECT `orders_id` as id_order, `products_id` as product_id, 0 as product_attribute_id, `products_name` as product_name, `products_quantity` as product_quantity, + `final_price` as product_price, 0 as product_weight + FROM `'.addslashes($this->prefix).'orders_products` WHERE `orders_id` = '.$order['id_cart']); + $orders[$key]['order_history'] = $this->ExecuteS(' + SELECT `orders_status_history_id` as id_order_history, 0 as id_employee, `orders_id` as id_order, `orders_status_id` as id_order_state, `date_added` as date_add + FROM `'.addslashes($this->prefix).'orders_status_history` WHERE `orders_id` = '.$order['id_cart']); + + } + return $orders; + } + + private function autoFormat($items, $identifier, $keyLanguage = NULL, $multiLangFields = array()) + { + $array = array(); + foreach ($items AS $item) + if (sizeof($multiLangFields) && is_array($multiLangFields) && isset($array[$item[$identifier]][$multiLangFields[0]])) + foreach ($multiLangFields AS $key) + $array[$item[$identifier]][$key][$item[$keyLanguage]] = $item[$key]; + else + foreach ($item AS $key => $value) + if (sizeof($multiLangFields) AND in_array($key, $multiLangFields)) + $array[$item[$identifier]][$key] = array($item[$keyLanguage] => $value); + elseif (sizeof($multiLangFields) AND $key == $keyLanguage) + continue; + else + $array[$item[$identifier]][$key] = $value; + return $array; + } + + public function hookbeforeAuthentication($params) + { + $passwd = trim(Tools::getValue('passwd')); + $email = trim(Tools::getValue('email')); + $result = Db::getInstance()->GetRow(' + SELECT * + FROM `'._DB_PREFIX_ .'customer` + WHERE `active` = 1 AND `email` = \''.pSQL($email).'\''); + if ($result && !empty($result['passwd_'.$this->name])) + { + if($this->checkPwd($passwd, $result['passwd_'.pSQL($this->name)])) + { + $ps_passwd = md5(pSQL(_COOKIE_KEY_.$passwd)); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'customer` + SET `passwd` = \''.pSQL($ps_passwd).'\', passwd_'.pSQL($this->name).' = \'\' + WHERE `'._DB_PREFIX_.'customer`.`id_customer` ='.(int)$result['id_customer'].' LIMIT 1'); + } + } + + } + + private function checkPwd($passwd, $encrypt_pwd) + { + //checks the type of encryption password + if (preg_match('/^[A-Z0-9]{32}\:[A-Z0-9]{2}$/i', $encrypt_pwd) === 1) + { + //salt + $stack = explode(':', $encrypt_pwd); + if (sizeof($stack) != 2) + return false; + + if (md5($stack[1] . $passwd) == $stack[0]) + return true; + else + return false; + } + else + { + //phpass + if (file_exists(dirname(__FILE__).'/passwordhash.php')) + { + include(dirname(__FILE__).'/passwordhash.php'); + $hasher = new PasswordHash(10, true); + return $hasher->CheckPassword($passwd, $encrypt_pwd); + } + else + return false; + } + + } + +} + +?> diff --git a/modules/importerosc/it.php b/modules/importerosc/it.php new file mode 100644 index 000000000..b7ccd41b1 --- /dev/null +++ b/modules/importerosc/it.php @@ -0,0 +1,15 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{importerosc}prestashop>importerosc_e273168c3697c35b8c737d14b1a5fb26'] = 'Importatore osCommerce'; +$_MODULE['<{importerosc}prestashop>importerosc_f4a344f88bab7b04a73077bafc8a0187'] = 'Questo modulo consente di importare da osCommerce per Prestashop'; +$_MODULE['<{importerosc}prestashop>importerosc_2737b271f276b90d8a04ea4b9d18b920'] = 'Lingua osCommerce di default'; +$_MODULE['<{importerosc}prestashop>importerosc_1b473540f20c3e31ead53f84511d6c77'] = 'Valuta osCommerce di default'; +$_MODULE['<{importerosc}prestashop>importerosc_6c61ebc45acfe2f244e91ac4cd423e81'] = 'Url negozio'; +$_MODULE['<{importerosc}prestashop>importerosc_a1831ea8716cc4375483dc42bf5fde96'] = 'Seleziona una lingua di default'; +$_MODULE['<{importerosc}prestashop>importerosc_375e6e17d4bd18a5163d3a7d13b80b4b'] = 'Seleziona una valuta di default'; +$_MODULE['<{importerosc}prestashop>importerosc_294f0969b5f80f1bae24a7183eb338d5'] = 'Imposta il tuo url negozio'; +$_MODULE['<{importerosc}prestashop>importerosc_86545d77ce5790e924190d9b5a7ac1b6'] = 'Gruppo di Commercio OS di default'; + +?> \ No newline at end of file diff --git a/modules/importerosc/logo.gif b/modules/importerosc/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..cabfae43e6612a7321766890f8acd36eebfcbf56 GIT binary patch literal 2378 zcmeHJdr(w$6#f?1<eiM9M5PxoHF>x!nd_*yE-zOe60Ri1WXtXa7B2g^yF5gPRz%SZ z#aEH}NJU2*OP$QDu?EyZDjfyENYNA>6<;}Gnv-%ncbCUDI`vO~_M5qPzkAMi&iT&o z-rt#xSH~$PXa~X%4?!yp{@-ED3dqV4brmtY5Z?r~9tkJ$<|U*9S$5<BOVQ5)&s=z# z;cH(o&;&pK^@Eb|k_}8Xf;N~&giIe*gxB)!hm<0u5}_LrW_d1rzI*s$gjf5F-G_+z z{UbI&K7XLR2J$0_T!C@lVEj)|q=zYr?km<w6z4JF3ryrXCjN*??U+0^dU7L_vNGir z#HMeWrYTA=H6<+{mwW@M_n~=&w__tS%xUicb4xF40c~-*_6~Hvd+IB0vukD<fZPp2 z9%s#a45Ka2Vli8UK%0QVjr#dZzAoKnS%{=XdxY{;_QgWfk}rjd$nozlT~-NHBB)A; ztrBLeE#J6#=&&tg^jkK4x=k?b*j}@<)V@nFe|BKU?i0e^y`S$ZF4@0l|5qPW9uO8D zT>r_p=Y;R4&!{_b=&<lneM5ai^`7Iv@wWP=#+Ih$OU=T*GfA4(%cswsZ9aGQTwCza z^ET7@YpuU7TY0g$`Qn9(7dy_kulu<DQv22Rw(BitI<8;6arf@68#jN`W_Mn@-r3oC z|K81qw{AV+ZCzbm;(Pml{TDkB^hoLftVWRVSREam8n23vkVVLW{xYrE%(*c@zR|{$ zotd3JhZ*n--0&j25C|`=&T5{Tl9DK@5V=pQd2j|2(Rw=U+5V>^Tr6ICt1cgqxC3tY z^sH3}^m|NxQ#J_!q+&h)BAeMp*e+t;X<sYiOefyyuxnDIiF1gsug=VieEKk<(B)|L z)TfkiXtv-&%5=f`Tmcn!EI+z?v&LC7>31ZFDrK#)-B?nl*Ty7}J)8vJ(6ceIghL7M z%reBO36G|$EsKwv<;0RP2Af*r#BOOuE;+Fq2N*MxXAq|R5~<myO6|sF*20-$PKP~L zJ3WPPAaPRjObH@qFzHd2<Y?Y<VhLB06P?_RoB4uNvF>o<)R;NP3nOiA^)%c#urR;~ zR-hY$RK!DtFqpx^ge-Cyh+-fsE0V}+fR(1<vzQ!GdZRdE#G`{^Ivg<;6i~Dnl?GKZ z%0hcHFtVRzw`DD|EwUQf&8onH(S4pWey%}xa^+phD^?cOh<TkF#r&csXMP>2ol0H~ z*<{V9%h42R?cs;Hs>?D~1@?Lvu?8ztBtLLzlXWQ-hD=H*wk@__NSLE1)={vhoG7KQ zRNwXy_t=6%0lhw^MS3vfwD++Eu5w6xPi#+H&aD>Pa@~5J3(s}4S?N$|gj6k6NGE`i zPLV35QPLQCnkY@|jhICW4JabrJgL`G4@S%*Z?{(AZ@UZUd83bp&Qd&UWO;**5obUO zZ^|-oti$2F{fpa$`A<-sEl&TO0${fl81j0btuxgzM<jz!_StMnz~nnL6HfKnM$?ga zVKZ>>4P60W*j-N|IRV(%VmkLgw8=b=H)QA77`aR~o|#Hxi)GYCU3hdTqvbfp;j=P4 zYi0RDRv!*)RwNBWS`u#+4T}qc&`D=-z-r*hDna;js~|ktMk3mPT24IifcU=x?w1kl z@p8lU#@a>h{kG3rQ&Ba%e8BVCMpd@oh$%}L&y3(J3B#1u+G2IhD(}@{GjsiwRZPPx zOY`l2C}fO%Nr;+nouF{{tneR`8DqE9`z#;5LfX~X$Sn35mGNPQOci^ia&qNxwf5BT z{ww9htpn4Qwea2j-gJ#JD6=A9l4aBEYDVd?HLgIe!Bkc3s_?Xua@ZwFBVtS9G_AFD zM?Hqfb2QZvBlEV!#Rsf?H}UY%<-Q@!OnGo!U4;*mVos@gHAEFTG(cv*YgY}53Jm^X Xm;B0rHL}IL7pIwaD!Ni4!Nk7+6WlRu literal 0 HcmV?d00001 diff --git a/modules/importerosc/passwordhash.php b/modules/importerosc/passwordhash.php new file mode 100755 index 000000000..55e80ceab --- /dev/null +++ b/modules/importerosc/passwordhash.php @@ -0,0 +1,254 @@ +<?php +# +# Portable PHP password hashing framework. +# +# Version 0.3 / genuine. +# Version 0.3 / osCommerce (silenced @is_readable('/dev/urandom')) +# +# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in +# the public domain. Revised in subsequent years, still public domain. +# +# There's absolutely no warranty. +# +# The homepage URL for this framework is: +# +# http://www.openwall.com/phpass/ +# +# Please be sure to update the Version line if you edit this file in any way. +# It is suggested that you leave the main version number intact, but indicate +# your project name (after the slash) and add your own revision information. +# +# Please do not change the "private" password hashing method implemented in +# here, thereby making your hashes incompatible. However, if you must, please +# change the hash type identifier (the "$P$") to something different. +# +# Obviously, since this code is in the public domain, the above are not +# requirements (there can be none), but merely suggestions. +# +class PasswordHash { + var $itoa64; + var $iteration_count_log2; + var $portable_hashes; + var $random_state; + + function PasswordHash($iteration_count_log2, $portable_hashes) + { + $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + + if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) + $iteration_count_log2 = 8; + $this->iteration_count_log2 = $iteration_count_log2; + + $this->portable_hashes = $portable_hashes; + + $this->random_state = microtime(); + if (function_exists('getmypid')) + $this->random_state .= getmypid(); + } + + function get_random_bytes($count) + { + $output = ''; + if (@is_readable('/dev/urandom') && + ($fh = @fopen('/dev/urandom', 'rb'))) { + $output = fread($fh, $count); + fclose($fh); + } + + if (strlen($output) < $count) { + $output = ''; + for ($i = 0; $i < $count; $i += 16) { + $this->random_state = + md5(microtime() . $this->random_state); + $output .= + pack('H*', md5($this->random_state)); + } + $output = substr($output, 0, $count); + } + + return $output; + } + + function encode64($input, $count) + { + $output = ''; + $i = 0; + do { + $value = ord($input[$i++]); + $output .= $this->itoa64[$value & 0x3f]; + if ($i < $count) + $value |= ord($input[$i]) << 8; + $output .= $this->itoa64[($value >> 6) & 0x3f]; + if ($i++ >= $count) + break; + if ($i < $count) + $value |= ord($input[$i]) << 16; + $output .= $this->itoa64[($value >> 12) & 0x3f]; + if ($i++ >= $count) + break; + $output .= $this->itoa64[($value >> 18) & 0x3f]; + } while ($i < $count); + + return $output; + } + + function gensalt_private($input) + { + $output = '$P$'; + $output .= $this->itoa64[min($this->iteration_count_log2 + + ((PHP_VERSION >= '5') ? 5 : 3), 30)]; + $output .= $this->encode64($input, 6); + + return $output; + } + + function crypt_private($password, $setting) + { + $output = '*0'; + if (substr($setting, 0, 2) == $output) + $output = '*1'; + + $id = substr($setting, 0, 3); + # We use "$P$", phpBB3 uses "$H$" for the same thing + if ($id != '$P$' && $id != '$H$') + return $output; + + $count_log2 = strpos($this->itoa64, $setting[3]); + if ($count_log2 < 7 || $count_log2 > 30) + return $output; + + $count = 1 << $count_log2; + + $salt = substr($setting, 4, 8); + if (strlen($salt) != 8) + return $output; + + # We're kind of forced to use MD5 here since it's the only + # cryptographic primitive available in all versions of PHP + # currently in use. To implement our own low-level crypto + # in PHP would result in much worse performance and + # consequently in lower iteration counts and hashes that are + # quicker to crack (by non-PHP code). + if (PHP_VERSION >= '5') { + $hash = md5($salt . $password, TRUE); + do { + $hash = md5($hash . $password, TRUE); + } while (--$count); + } else { + $hash = pack('H*', md5($salt . $password)); + do { + $hash = pack('H*', md5($hash . $password)); + } while (--$count); + } + + $output = substr($setting, 0, 12); + $output .= $this->encode64($hash, 16); + + return $output; + } + + function gensalt_extended($input) + { + $count_log2 = min($this->iteration_count_log2 + 8, 24); + # This should be odd to not reveal weak DES keys, and the + # maximum valid value is (2**24 - 1) which is odd anyway. + $count = (1 << $count_log2) - 1; + + $output = '_'; + $output .= $this->itoa64[$count & 0x3f]; + $output .= $this->itoa64[($count >> 6) & 0x3f]; + $output .= $this->itoa64[($count >> 12) & 0x3f]; + $output .= $this->itoa64[($count >> 18) & 0x3f]; + + $output .= $this->encode64($input, 3); + + return $output; + } + + function gensalt_blowfish($input) + { + # This one needs to use a different order of characters and a + # different encoding scheme from the one in encode64() above. + # We care because the last character in our encoded string will + # only represent 2 bits. While two known implementations of + # bcrypt will happily accept and correct a salt string which + # has the 4 unused bits set to non-zero, we do not want to take + # chances and we also do not want to waste an additional byte + # of entropy. + $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + $output = '$2a$'; + $output .= chr(ord('0') + $this->iteration_count_log2 / 10); + $output .= chr(ord('0') + $this->iteration_count_log2 % 10); + $output .= '$'; + + $i = 0; + do { + $c1 = ord($input[$i++]); + $output .= $itoa64[$c1 >> 2]; + $c1 = ($c1 & 0x03) << 4; + if ($i >= 16) { + $output .= $itoa64[$c1]; + break; + } + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 4; + $output .= $itoa64[$c1]; + $c1 = ($c2 & 0x0f) << 2; + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 6; + $output .= $itoa64[$c1]; + $output .= $itoa64[$c2 & 0x3f]; + } while (1); + + return $output; + } + + function HashPassword($password) + { + $random = ''; + + if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { + $random = $this->get_random_bytes(16); + $hash = + crypt($password, $this->gensalt_blowfish($random)); + if (strlen($hash) == 60) + return $hash; + } + + if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { + if (strlen($random) < 3) + $random = $this->get_random_bytes(3); + $hash = + crypt($password, $this->gensalt_extended($random)); + if (strlen($hash) == 20) + return $hash; + } + + if (strlen($random) < 6) + $random = $this->get_random_bytes(6); + $hash = + $this->crypt_private($password, + $this->gensalt_private($random)); + if (strlen($hash) == 34) + return $hash; + + # Returning '*' on error is safe here, but would _not_ be safe + # in a crypt(3)-like function used _both_ for generating new + # hashes and for validating passwords against existing hashes. + return '*'; + } + + function CheckPassword($password, $stored_hash) + { + $hash = $this->crypt_private($password, $stored_hash); + if ($hash[0] == '*') + $hash = crypt($password, $stored_hash); + + return $hash == $stored_hash; + } +} + +?> diff --git a/modules/index.php b/modules/index.php new file mode 100644 index 000000000..dce251852 --- /dev/null +++ b/modules/index.php @@ -0,0 +1,36 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/modules/livezilla/config.xml b/modules/livezilla/config.xml new file mode 100644 index 000000000..2dd4b8788 --- /dev/null +++ b/modules/livezilla/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>livezilla</name> + <displayName><![CDATA[LiveZilla]]></displayName> + <version><![CDATA[1]]></version> + <description><![CDATA[Live support chat]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[front_office_features]]></tab> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/livezilla/de.php b/modules/livezilla/de.php new file mode 100644 index 000000000..7de69647a --- /dev/null +++ b/modules/livezilla/de.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{livezilla}prestashop>livezilla_2bc19baeea1dd9e939091b1d414da0f7'] = 'LiveZilla Live Help'; +$_MODULE['<{livezilla}prestashop>livezilla_2b6ffc604d5470a856c3a7bba581d1ae'] = 'Live Support Chat'; +$_MODULE['<{livezilla}prestashop>livezilla_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{livezilla}prestashop>livezilla_1445650302f377af43ee1f7738dc7b50'] = 'Anleitungen'; +$_MODULE['<{livezilla}prestashop>livezilla_3e4804ddb635637d8b873f7cfee85ed5'] = 'LiveZilla ist keine gehostete Lösung, das heißt, das LiveZilla auf Ihrem lokalen Computer (Schritt 1) und auf Ihrem Webserver (Schritt 2) installiert werden muss bedeutet.'; +$_MODULE['<{livezilla}prestashop>livezilla_f3a98489037e44119b187247b5894526'] = 'Die LiveZilla Installation auf Ihrem Webserver heißt LiveZilla Server.'; +$_MODULE['<{livezilla}prestashop>livezilla_1965c2fd150423248634c52fc53c6e80'] = 'Die vollständige Installationsanleitung finden Sie auf'; +$_MODULE['<{livezilla}prestashop>livezilla_10827a74160be97df6c0873f7c9809b9'] = 'der offiziellen LiveZilla Webseite '; +$_MODULE['<{livezilla}prestashop>livezilla_0f7c0aba4acddebc7d72b7a91d339d46'] = 'Jetzt LiveZilla downloaden !'; +$_MODULE['<{livezilla}prestashop>livezilla_254f642527b45bc260048e30704edb39'] = 'Konfiguration'; +$_MODULE['<{livezilla}prestashop>livezilla_e6e29281ee59dd8ab5c79b21737b6430'] = 'Geben Sie die URL für Ihre LiveZilla Installation ein'; +$_MODULE['<{livezilla}prestashop>livezilla_a1c537e365d5243201b00d3ea5a1ea00'] = 'Endgültige URL mit dem Schrägstrich, z.B.'; +$_MODULE['<{livezilla}prestashop>livezilla_c718af0f8ee7235462f7c70ef974b2e7'] = '- ODER -'; +$_MODULE['<{livezilla}prestashop>livezilla_66a4362239a5cf0c365bacbf13e98ee0'] = 'Kopieren das von LiveZilla erhaltene Skript '; +$_MODULE['<{livezilla}prestashop>livezilla_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; + +?> \ No newline at end of file diff --git a/modules/livezilla/es.php b/modules/livezilla/es.php new file mode 100644 index 000000000..97ec02883 --- /dev/null +++ b/modules/livezilla/es.php @@ -0,0 +1,20 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{livezilla}prestashop>livezilla_2b6ffc604d5470a856c3a7bba581d1ae'] = 'Ayuda Chat en directo'; +$_MODULE['<{livezilla}prestashop>livezilla_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{livezilla}prestashop>livezilla_1445650302f377af43ee1f7738dc7b50'] = 'Cómo proceder'; +$_MODULE['<{livezilla}prestashop>livezilla_3e4804ddb635637d8b873f7cfee85ed5'] = 'LiveZilla no es una solución alojada, lo que significa que LiveZilla necesita ser instalado en su equipo local (paso 1) y también en su servidor web (paso 2).'; +$_MODULE['<{livezilla}prestashop>livezilla_f3a98489037e44119b187247b5894526'] = 'La instalación LiveZilla en su servidor web se llama servidor LiveZilla.'; +$_MODULE['<{livezilla}prestashop>livezilla_6dc42b5059b4c589e225323855cd1100'] = 'Una vez que haya terminado los pasos 1 y 2, es necesario rellenar la dirección URL de su instalación LiveZilla abajo o copiar y pegar directamente el código en el área de texto. Esto integra LiveZilla con su sitio web (paso 3).'; +$_MODULE['<{livezilla}prestashop>livezilla_1965c2fd150423248634c52fc53c6e80'] = 'La guía de instalación completa está disponible en'; +$_MODULE['<{livezilla}prestashop>livezilla_10827a74160be97df6c0873f7c9809b9'] = 'el sitio web oficial LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_0f7c0aba4acddebc7d72b7a91d339d46'] = '¡Descargue LiveZilla ahora!'; +$_MODULE['<{livezilla}prestashop>livezilla_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{livezilla}prestashop>livezilla_e6e29281ee59dd8ab5c79b21737b6430'] = 'Introduzca la dirección URL de su instalación LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_a1c537e365d5243201b00d3ea5a1ea00'] = 'URL absoluta con la barra final, por ejemplo,'; +$_MODULE['<{livezilla}prestashop>livezilla_c718af0f8ee7235462f7c70ef974b2e7'] = '- O -'; +$_MODULE['<{livezilla}prestashop>livezilla_66a4362239a5cf0c365bacbf13e98ee0'] = 'Copie / pegue el código dado por LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualice la configuración'; +$_MODULE['<{livezilla}prestashop>livezilla_2bc19baeea1dd9e939091b1d414da0f7'] = 'Ayuda en directo LiveZilla'; diff --git a/modules/livezilla/fr.php b/modules/livezilla/fr.php new file mode 100644 index 000000000..765457bc8 --- /dev/null +++ b/modules/livezilla/fr.php @@ -0,0 +1,20 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{livezilla}prestashop>livezilla_2b6ffc604d5470a856c3a7bba581d1ae'] = 'Chat intégré à votre site web'; +$_MODULE['<{livezilla}prestashop>livezilla_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{livezilla}prestashop>livezilla_1445650302f377af43ee1f7738dc7b50'] = 'Guide'; +$_MODULE['<{livezilla}prestashop>livezilla_3e4804ddb635637d8b873f7cfee85ed5'] = 'LiveZilla n\'est pas une solution hébergée, ce qui signifie que LiveZilla doit être installé sur votre poste local (étape 1) ainsi que sur votre serveur (étape 2).'; +$_MODULE['<{livezilla}prestashop>livezilla_f3a98489037e44119b187247b5894526'] = 'L\'installation de LiveZilla sur votre serveur est dénommée \"LiveZilla Server\"'; +$_MODULE['<{livezilla}prestashop>livezilla_6dc42b5059b4c589e225323855cd1100'] = 'Une fois les étapes 1 et 2 complétées, vous devez renseigner l\'URL de votre installation de LiveZilla Server ci-dessous, ou directement copier / coller le script dans le bloc prévu à cet effet. Cette manipulation intégrera LiveZilla sur votre boutique (étape 3).'; +$_MODULE['<{livezilla}prestashop>livezilla_1965c2fd150423248634c52fc53c6e80'] = 'Le guide d\'installation complet est disponible sur'; +$_MODULE['<{livezilla}prestashop>livezilla_10827a74160be97df6c0873f7c9809b9'] = 'le site officiel de LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_0f7c0aba4acddebc7d72b7a91d339d46'] = 'Téléchargez LiveZilla dès maintenant !'; +$_MODULE['<{livezilla}prestashop>livezilla_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{livezilla}prestashop>livezilla_e6e29281ee59dd8ab5c79b21737b6430'] = 'Indiquez l\'URL de LiveZilla Server'; +$_MODULE['<{livezilla}prestashop>livezilla_a1c537e365d5243201b00d3ea5a1ea00'] = 'URL absolue avec le slash de fin, ex. '; +$_MODULE['<{livezilla}prestashop>livezilla_c718af0f8ee7235462f7c70ef974b2e7'] = '-- OU --'; +$_MODULE['<{livezilla}prestashop>livezilla_66a4362239a5cf0c365bacbf13e98ee0'] = 'Copiez / Collez le script donné par LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour'; +$_MODULE['<{livezilla}prestashop>livezilla_2bc19baeea1dd9e939091b1d414da0f7'] = 'Aide LiveZilla'; diff --git a/modules/livezilla/it.php b/modules/livezilla/it.php new file mode 100644 index 000000000..f209589fe --- /dev/null +++ b/modules/livezilla/it.php @@ -0,0 +1,21 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{livezilla}prestashop>livezilla_2bc19baeea1dd9e939091b1d414da0f7'] = 'LiveZilla Live Help'; +$_MODULE['<{livezilla}prestashop>livezilla_2b6ffc604d5470a856c3a7bba581d1ae'] = 'Chat integrata '; +$_MODULE['<{livezilla}prestashop>livezilla_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{livezilla}prestashop>livezilla_1445650302f377af43ee1f7738dc7b50'] = 'Guida'; +$_MODULE['<{livezilla}prestashop>livezilla_3e4804ddb635637d8b873f7cfee85ed5'] = 'LiveZilla non è una soluzione in hosting, il che significa che LiveZilla ha bisogno di essere installato sul computer locale (fase 1) e anche sul tuo server (fase 2) .'; +$_MODULE['<{livezilla}prestashop>livezilla_f3a98489037e44119b187247b5894526'] = 'L\'installazione LiveZilla sul tuo server è chiamata Server LiveZilla.'; +$_MODULE['<{livezilla}prestashop>livezilla_1965c2fd150423248634c52fc53c6e80'] = 'La guida di installazione completa è disponibile sul'; +$_MODULE['<{livezilla}prestashop>livezilla_10827a74160be97df6c0873f7c9809b9'] = 'sito ufficiale LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_0f7c0aba4acddebc7d72b7a91d339d46'] = 'Scarica ora LiveZilla!'; +$_MODULE['<{livezilla}prestashop>livezilla_254f642527b45bc260048e30704edb39'] = 'Configurazione'; +$_MODULE['<{livezilla}prestashop>livezilla_e6e29281ee59dd8ab5c79b21737b6430'] = 'Inserisci l\'URL della tua installazione LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_a1c537e365d5243201b00d3ea5a1ea00'] = 'URL assoluto con il trailing slash, ad esempio,'; +$_MODULE['<{livezilla}prestashop>livezilla_c718af0f8ee7235462f7c70ef974b2e7'] = '- OPPURE -'; +$_MODULE['<{livezilla}prestashop>livezilla_66a4362239a5cf0c365bacbf13e98ee0'] = 'Copia / incolla lo script dato da LiveZilla'; +$_MODULE['<{livezilla}prestashop>livezilla_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; + +?> \ No newline at end of file diff --git a/modules/livezilla/livezilla.php b/modules/livezilla/livezilla.php new file mode 100644 index 000000000..eb20658ba --- /dev/null +++ b/modules/livezilla/livezilla.php @@ -0,0 +1,124 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class LiveZilla extends Module +{ + public function __construct() + { + $this->name = 'livezilla'; + $this->tab = 'front_office_features'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = 'LiveZilla'; + $this->description = $this->l('Live support chat'); + } + + public function install() + { + if (!Configuration::get('LIVEZILLA_URL')) + Configuration::updateValue('LIVEZILLA_URL', Tools::htmlentitiesUTF8($_SERVER['HTTP_HOST']).'/LiveZilla/'); + return (parent::install() AND $this->registerHook('rightColumn')); + } + + public function getContent() + { + if (Tools::isSubmit('submitLiveZilla')) + { + Configuration::updateValue('LIVEZILLA_URL', Tools::getValue('LIVEZILLA_URL_TYPE').Tools::getValue('LIVEZILLA_URL')); + Configuration::updateValue('LIVEZILLA_SCRIPT', Tools::getValue('LIVEZILLA_SCRIPT'), true); + echo $this->displayConfirmation($this->l('Settings updated')); + } + + $html = '<h2>'.$this->displayName.'</h2> + <fieldset><legend><img src="../modules/'.$this->name.'/logo.gif" /> '.$this->l('How-to').'</legend> + <img src="../modules/'.$this->name.'/lz_package.gif" style="float:right;margin-left:10px" /> + '.$this->l('LiveZilla is not a hosted solution, which means that LiveZilla needs to be installed on your local computer (step 1) and on your webserver (step 2) as well.').' + '.$this->l('The LiveZilla installation on your webserver is called the LiveZilla Server.').' + <br /><br /> + '.$this->l('Once you have finished step 1 & 2, you must fill in the URL of your LiveZilla installation below or directly copy / paste the script in the text area. This will integrate LiveZilla with your website (step 3).').' + <br /><br /> + '.$this->l('The full installation guide is available on').' <a href="http://www.livezilla.net/installation/" style="text-decoration:underline">'.$this->l('the official LiveZilla website').'</a>. + <br /><br /> + <a href="https://www.livezilla.net/downloads/" style="font-weight:700"><img src="../modules/'.$this->name.'/lz_download.gif" style="vertical-align:middle" /> '.$this->l('Download LiveZilla now!').'</a> + </fieldset> + <div class="clear">&nbsp;</div> + <form action="'.Tools::htmlentitiesUTF8($_SERVER['REQUEST_URI']).'" method="post"> + <fieldset><legend><img src="../modules/'.$this->name.'/logo.gif" /> '.$this->l('Configuration').'</legend> + <label>'.$this->l('Enter the URL to your LiveZilla installation').'</label> + <div class="margin-form"> + <select name="LIVEZILLA_URL_TYPE"> + <option '.(Tools::getValue('LIVEZILLA_URL_TYPE') == 'http://' ? ' selected="selected" ' : '' ).' value="http://">http://</option> + <option '.(Tools::getValue('LIVEZILLA_URL_TYPE') == 'https://' ? ' selected="selected" ' : '' ).' value="https://">https://</option> + </select> + <input type="text" name="LIVEZILLA_URL" style="width:300px" value="'.Tools::htmlentitiesUTF8(Tools::getValue('LIVEZILLA_URL', Configuration::get('LIVEZILLA_URL'))).'" /> + <p>'.$this->l('Absolute URL with the trailing slash, e.g.,').' '.Tools::getProtocol().Tools::htmlentitiesUTF8($_SERVER['HTTP_HOST']).'/LiveZilla/</p> + </div> + <div class="clear">&nbsp;</div> + <div style="font-size:1.2em;font-weight:700;text-align:center">'.$this->l('-- OR --').'</div> + <div class="clear">&nbsp;</div> + <label>'.$this->l('Copy / paste the script given by LiveZilla').'</label> + <div class="margin-form"> + <textarea name="LIVEZILLA_SCRIPT" style="width:600px;height:200px" />'.Tools::htmlentitiesUTF8(Tools::getValue('LIVEZILLA_SCRIPT', Configuration::get('LIVEZILLA_SCRIPT'))).'</textarea> + </div> + <div class="clear">&nbsp;</div> + <input type="submit" name="submitLiveZilla" value="'.$this->l('Update settings').'" class="button" /> + </fieldset> + </form>'; + return $html; + } + + private function displayBlock() + { + global $smarty; + + + if ($livezilla_script = Configuration::get('LIVEZILLA_SCRIPT')) + $smarty->assign('LIVEZILLA_SCRIPT', $livezilla_script); + elseif ($livezilla_url = Configuration::get('LIVEZILLA_URL')) + $smarty->assign('LIVEZILLA_URL', $livezilla_url); + else + $smarty->assign('LIVEZILLA_UNDEFINED', 1); + return $this->display(__FILE__, 'livezilla.tpl'); + } + + public function hookLeftColumn($params) + { + return $this->displayBlock(); + } + + public function hookRightColumn($params) + { + return $this->displayBlock(); + } +} \ No newline at end of file diff --git a/modules/livezilla/livezilla.tpl b/modules/livezilla/livezilla.tpl new file mode 100644 index 000000000..24191e252 --- /dev/null +++ b/modules/livezilla/livezilla.tpl @@ -0,0 +1,54 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<div style="margin:10px 0"> +{if isset($LIVEZILLA_SCRIPT)} + {$LIVEZILLA_SCRIPT} +{elseif isset($LIVEZILLA_URL)} + <a href="javascript:void(window.open('{$LIVEZILLA_URL}chat.php','','width=590,height=610,left=0,top=0,resizable=yes,menubar=no,location=no,status=yes,scrollbars=yes'))"> + <img src="{$LIVEZILLA_URL}image.php?id=01" width="191" height="69" border="0" alt="{l s='LiveZilla Live Help'}" /> + </a> + <noscript> + <div> + <a href="{$LIVEZILLA_URL}chat.php" target="_blank">Start Live Help Chat</a> + </div> + </noscript> + <div id="livezilla_tracking" style="display:none"></div> + <script type="text/javascript"> + /* <![CDATA[ */ + var script = document.createElement("script"); + script.type = "text/javascript"; + var src = "{$LIVEZILLA_URL}server.php?request=track&output=jcrpt&nse=" + Math.random(); + setTimeout("script.src = src;document.getElementById('livezilla_tracking').appendChild(script)", 1); + /* ]]> */ + </script> + <noscript> + <img src="{$LIVEZILLA_URL}server.php?request=track&amp;output=nojcrpt" width="0" height="0" style="visibility:hidden" alt="" /> + </noscript> +{else} + <img src="{$base_dir}modules/livezilla/offline.png" width="191" height="69" border="0" alt="LiveZilla" /> +{/if} +</div> \ No newline at end of file diff --git a/modules/livezilla/logo.gif b/modules/livezilla/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..1102b93c6446c52767086260b95f625fac2ad496 GIT binary patch literal 1066 zcmZ?wbhEHb6krfw_|Cv!7ExprS!0`!;*o3RSE=t?Y8Y6h@08-=m>TPr9pzi%>{;aN zU+d(OUEq>a<eOQmA3jkhY^qlHY@P5K`VrIgB4+4D%+!mTts6N<Cvu){)Lf&mCc}t! zlc;8s=zf!!e&eV~1`$)VW0&d2F4Rd_qm#5zH+hqO%0|7EO?oL?^;5SQCoC~cSZ0#2 z*fe>$LBdLdq&3E=>rIkZn5C?=NLy{4xy~wcy<y4*qx4P2X`4+lw;5;bFv;3&lD)?? zXP<TUCfl41W_gFq@(!ElA2H8AYEf{^vhcV=!B*#@?XJb!T#B|k7wrgcw2SC6i<_#N zG+!=psd(~gq4aekCHtjH_sXX&)z06nP_#{@X1`%Xw`)jqaM?kbvIBDE2jr`c$<>{e zt3NMSeN?gLxKiyg)w(0PHO*5Sj_Ng@(rP)Y-F(cr`@Bu-b;Y);8XXt)JFjbZ-`4KA zt<!VGr0<IL#CxWb?^;c{XFct*_q1zX({4M@x$igkk>~seL96a(EqoHV<Z0NFr{OCe zq^x?9y5>>Vx<`5IUSw^4m$&6@{`NPOyFXOz`B2j}rEB5Vu7yk2u3Ecf`?l@-_U_+u zWWk<e8}=UAa`N8#Bah}E{?vW^!?aT$XP*8z`{I`sSH7;j`gPsauN!WD+jjHY_S@fg z-1@fj_V-=4er&t*WA~jOd+z?&d-TxpBS#LOIDY&z5S%=7_Vn3vXV0I%eDcD%3s<jS zx_b4>%^Npw-MDr4_T4*oZ{53l@BY2}H(wulaR0%>pNF6PI`!z`qi0W_y?^)q%a<=- zzkdDp?c0y<KYsrF`S<VNfB*jd|Noz1NC6#?Ye9K|f#W|zFNevY!%i&%B04=E3@><0 zRB|?HIML+FE2+U_w@2dBgpLWEeCHZ2O+7t%sX?H?1_39PjyASrr>RO`J%yLq#4q94 zA(-OMq19|rDy5orS=FxWlEudh%*|pZO-7Bou5yLx#%v6+)SB#kNYt`H?cyiXH8XA| zY?jlU6xeurZur47r*yAnhblAaYR#Canv=INagUEKQ}6*-Hn(kcg34w*H}pa#FkPKl zbfB$+eNx0uuTm|crCx2nc2qJw;ON>`_({NO3P<2V`;u)u84I0RJNaU7J-GS#c>g@h zI39<HMM|z*5;Chg5}BW$mD1)?P%+F~RMo@HC}xs4Dd8}e>Q&z<{1Wkxj`T|zXD~Q6 LHP>`DFjxZs#q_~) literal 0 HcmV?d00001 diff --git a/modules/livezilla/lz_download.gif b/modules/livezilla/lz_download.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ac921541504e1bb2c4f3289cd1b20f4e33966a7 GIT binary patch literal 1500 zcmV<21ta=LNk%w1VITk?0Qdg@q1=yx(*KRv{tBM|YR3NtoWD)D|ANedh1LI%)Ql~u zE>OKz)cD9}#s68o|Jv*RUBXutjoN$BY(TO=m)`yYn*VLb|F-X`!t=Byr~c~v;!(L# z-1^c9h}qHW{)y86mDQD!(~^zRja|V1q2`f~-hHg=opI4(;O+h;tN+*Q{?hlyz~=sn z*Z->J{(;Q@Rl8LZq5s<X(RRslOSemO(qUu5|8C7*Ev*0K?*7l||I7Bjx#Rzv+5djg z|9Z~<cg_E8$p7p8<mUU~c-3Uw`q0wq|H<^d!1A+r&i`S-|3<a{E}P(%&zRxq@L0T9 z7@`<Fp5DXT?P;>(OQqkX&gveK+AWvdRJ;E$tT14|V1v_J2%HFV&t8SjfrZvyb<F=e zvHzdh|BKsW9i{&ThS>m%hP2wY%JshI?*1pF_qgw=1)Kjnqvny@{(#Y2)aw3Y!T(~w zVwBYXPp<1pwftwvTNb7NsoMXc+W#?|->K+|wc-E1?zAAPzl+ZLkl%hnsp)sg{}iOZ zfZ1~+m*U&({-5IhvFxaV(sdb<-&MN&;O_n>s3)`I{&~&)mDBt&p5z^%_v-Kd9H{>Q znI90J5CECq0G9Dgv-K06`enoabIe+X)BiD|>qfLjU(9Atxt~L~zXgTYg42eH(1`$< zpMcYDv+Mq#;(^cf#+BimpX88t)MM55&4<s0e9C)a##(B^^^w<kyzsM@*>^;z<)`3{ zMX2R}(1UNs`*YA>vgYpW{O5$ydffQcamxPymkq1sk)z`NoaCK;*KrVz-ha*iPPk65 z=#-7t{wJE^2Auy<we)Svzn<KIV7c)SkmDbj=uo-;RlNTTo(~V6569>Kl-&MSzgC0O zzTNEpnA(1F$M{#mTU5VTkkXKi-H?;kjK}f4l-G^p?f%f||8dE6T*FzT=clRUqkPg` z6r=xg$G>&YzNX*)FQf2v&Sr4RY<JB4F{YAy*M`dI|F`7+ZNBoW;r^=WoGY2%0E5>6 zng0Np0PpYeA^8LW00930EC2ui03ZM$000R80RIUbNN}K(DN*<-<QHX%l!6c=3any9 zVT5H&A}Q*i&`K4F5}i=t*CCLsPJHa;`Cy@0A%#?&fF$VT3O^>@0wCaF#E3Z^AA)Sk zWQ^YxnKNsS!u1G&05>{RsDNXn2N(i27DY3PRN_cm^OUimz(R$g2UD;80M=l{w4zi% zR^hi#mk$AsjG)-N?SVZW0j?@>P^S#Pj}fhOfCeUjfO{x%NJin|kQ)R^EZA^>1s*>u z5vB0cL!dFX2j$XCO2Y`1i+l)v1lf!Qi{Xa_rv&rIySMLZyj;ACJ)1KYY5b-@jN-4+ zljqQ%fAXhon417V2n;rm0TV-r{QSZH=%qn}kn=(`fbi!ITMHjO=1{}Irk^H-;QehF zB7=i}|3$3lObY=t&;SktRM5{7FW^^DcpLn(!U_yj$iNCA_|wiD$5<dp3TzAzh67?a zNDzdspn=8?ETVA)IR1z-0v<0I5JNvW#_@-V12Kn;Do7xK!H`JMB7#4Dq(BKf2`(`J z8Dik`U2gu+FwO;7uCWFp=^Q!89Wf->&j8beAx0a?K_o?$eduGtn<fymN-6#nFhG4c z;ur=b9N|`wKNG0K3JHXg5KcV@)S2g^WYF>1KnnN<C@IC1Py!$&5CTe~zEy$=j%p}` z*gw|zlf?w6%8`pVClEnIE3MSIaDW!HYSD;4m-HhEM{y0*gg;Qg0>CWX$g{vVH`K7p zE?t}wPa>~u;EyT&sKL=u1^o(z7qx8h1_TQ%5X%i+lzU17S@;u52A(K{EkxRS@r<|N zhKr6J5}@l3J#BErPfQ@id&?GEaFR{9=YW&084GzdlRyH0A@MrCl(H~G4n0iJuUyO^ z%ot;&A`TS(G@)_8{&bwo9wV20@=P4hKn}?!zYKHAmbh&5!@ugh^TTJH@v}ey0RTIP Cq&T1e literal 0 HcmV?d00001 diff --git a/modules/livezilla/lz_package.gif b/modules/livezilla/lz_package.gif new file mode 100644 index 0000000000000000000000000000000000000000..93d1dc1fe34b1fe89a68a392b08a4eb9a144e761 GIT binary patch literal 9189 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 literal 0 HcmV?d00001 diff --git a/modules/livezilla/offline.png b/modules/livezilla/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..c18fc15d9086dc348a9a906a3b3b996c453e7a2d GIT binary patch literal 6608 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 literal 0 HcmV?d00001 diff --git a/modules/loyalty/LoyaltyModule.php b/modules/loyalty/LoyaltyModule.php new file mode 100644 index 000000000..053dd57b9 --- /dev/null +++ b/modules/loyalty/LoyaltyModule.php @@ -0,0 +1,250 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class LoyaltyModule extends ObjectModel +{ + public $id_loyalty_state; + public $id_customer; + public $id_order; + public $id_discount; + public $points; + public $date_add; + public $date_upd; + + protected $fieldsRequired = array('id_customer', 'points'); + protected $fieldsValidate = array('id_loyalty_state' => 'isInt', 'id_customer' => 'isInt', 'id_discount' => 'isInt', 'id_order' => 'isInt', 'points' => 'isInt'); + + protected $table = 'loyalty'; + protected $identifier = 'id_loyalty'; + + public function getFields() + { + parent::validateFields(); + $fields['id_loyalty_state'] = (int)$this->id_loyalty_state; + $fields['id_customer'] = (int)$this->id_customer; + $fields['id_order'] = (int)$this->id_order; + $fields['id_discount'] = (int)$this->id_discount; + $fields['points'] = (int)$this->points; + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + public function save($nullValues = false, $autodate = true) + { + parent::save($nullValues, $autodate); + $this->historize(); + } + + static public function getByOrderId($id_order) + { + if (!Validate::isUnsignedId($id_order)) + return false; + + $result = Db::getInstance()->getRow(' + SELECT f.id_loyalty + FROM `'._DB_PREFIX_.'loyalty` f + WHERE f.id_order = '.(int)($id_order)); + + return isset($result['id_loyalty']) ? $result['id_loyalty'] : false; + } + + static public function getOrderNbPoints($order) + { + if (!Validate::isLoadedObject($order)) + return false; + return self::getCartNbPoints(new Cart((int)$order->id_cart)); + } + + static public function getCartNbPoints($cart, $newProduct = NULL) + { + $total = 0; + if (Validate::isLoadedObject($cart)) + { + $cartProducts = $cart->getProducts(); + $taxesEnabled = Product::getTaxCalculationMethod(); + if (isset($newProduct) AND !empty($newProduct)) + { + $cartProductsNew['id_product'] = (int)$newProduct->id; + if ($taxesEnabled == PS_TAX_EXC) + $cartProductsNew['price'] = number_format($newProduct->getPrice(false, (int)($newProduct->getIdProductAttributeMostExpensive())), 2, '.', ''); + else + $cartProductsNew['price_wt'] = number_format($newProduct->getPrice(true, (int)($newProduct->getIdProductAttributeMostExpensive())), 2, '.', ''); + $cartProductsNew['cart_quantity'] = 1; + $cartProducts[] = $cartProductsNew; + } + foreach ($cartProducts AS $product) + { + if (!(int)(Configuration::get('PS_LOYALTY_NONE_AWARD')) AND Product::isDiscounted((int)$product['id_product'])) + { + global $smarty; + if (isset($smarty) AND is_object($newProduct) AND $product['id_product'] == $newProduct->id) + $smarty->assign('no_pts_discounted', 1); + continue; + } + $total += ($taxesEnabled == PS_TAX_EXC ? $product['price'] : $product['price_wt'])* (int)($product['cart_quantity']); + } + foreach ($cart->getDiscounts(false) AS $discount) + $total -= $discount['value_real']; + } + + return self::getNbPointsByPrice($total); + } + + static public function getVoucherValue($nbPoints, $id_currency = NULL) + { + global $cookie; + + if (empty($id_currency)) + $id_currency = (int)$cookie->id_currency; + + return (int)$nbPoints * (float)Tools::convertPrice(Configuration::get('PS_LOYALTY_POINT_VALUE'), new Currency((int)$id_currency)); + } + + static public function getNbPointsByPrice($price) + { + global $cookie; + + if (Configuration::get('PS_CURRENCY_DEFAULT') != $cookie->id_currency) + { + $currency = new Currency((int)($cookie->id_currency)); + if ($currency->conversion_rate) + $price = $price / $currency->conversion_rate; + } + + /* Prevent division by zero */ + $points = 0; + if ($pointRate = (float)(Configuration::get('PS_LOYALTY_POINT_RATE'))) + $points = floor(number_format($price, 2, '.', '') / $pointRate); + + return (int)$points; + } + + static public function getPointsByCustomer($id_customer) + { + return + Db::getInstance()->getValue(' + SELECT SUM(f.points) points + FROM `'._DB_PREFIX_.'loyalty` f + WHERE f.id_customer = '.(int)($id_customer).' + AND f.id_loyalty_state IN ('.(int)(LoyaltyStateModule::getValidationId()).', '.(int)(LoyaltyStateModule::getNoneAwardId()).')') + + + Db::getInstance()->getValue(' + SELECT SUM(f.points) points + FROM `'._DB_PREFIX_.'loyalty` f + WHERE f.id_customer = '.(int)($id_customer).' + AND f.id_loyalty_state = '.(int)LoyaltyStateModule::getCancelId().' AND points < 0'); + } + + static public function getAllByIdCustomer($id_customer, $id_lang, $onlyValidate = false, $pagination = false, $nb = 10, $page = 1) + { + $query = ' + SELECT f.id_order AS id, f.date_add AS date, (o.total_paid - o.total_shipping) total_without_shipping, f.points, f.id_loyalty, f.id_loyalty_state, fsl.name state + FROM `'._DB_PREFIX_.'loyalty` f + LEFT JOIN `'._DB_PREFIX_.'orders` o ON (f.id_order = o.id_order) + LEFT JOIN `'._DB_PREFIX_.'loyalty_state_lang` fsl ON (f.id_loyalty_state = fsl.id_loyalty_state AND fsl.id_lang = '.(int)($id_lang).') + WHERE f.id_customer = '.(int)($id_customer); + if ($onlyValidate === true) + $query .= ' AND f.id_loyalty_state = '.(int)LoyaltyStateModule::getValidationId(); + $query .= ' GROUP BY f.id_loyalty '. + ($pagination ? 'LIMIT '.(((int)($page) - 1) * (int)($nb)).', '.(int)($nb) : ''); + + return Db::getInstance()->ExecuteS($query); + } + + static public function getDiscountByIdCustomer($id_customer, $last=false) + { + $query = ' + SELECT f.id_discount AS id_discount, f.date_upd AS date_add + FROM `'._DB_PREFIX_.'loyalty` f + LEFT JOIN `'._DB_PREFIX_.'orders` o ON (f.`id_order` = o.`id_order`) + WHERE f.`id_customer` = '.(int)($id_customer).' + AND f.`id_discount` > 0 + AND o.`valid` = 1'; + if ($last === true) + $query.= ' ORDER BY f.id_loyalty DESC LIMIT 0,1'; + $query.= ' GROUP BY f.id_discount'; + + return Db::getInstance()->ExecuteS($query); + } + + static public function registerDiscount($discount) + { + if (!Validate::isLoadedObject($discount)) + die(Tools::displayError('Incorrect object Discount.')); + $items = self::getAllByIdCustomer((int)$discount->id_customer, NULL, true); + foreach ($items AS $item) + { + $f = new LoyaltyModule((int)$item['id_loyalty']); + + /* Check for negative points for this order */ + $negativePoints = (int)Db::getInstance()->getValue('SELECT SUM(points) points FROM '._DB_PREFIX_.'loyalty WHERE id_order = '.(int)$f->id_order.' AND id_loyalty_state = '.(int)LoyaltyStateModule::getCancelId().' AND points < 0'); + + if ($f->points + $negativePoints <= 0) + continue; + + $f->id_discount = (int)$discount->id; + $f->id_loyalty_state = (int)LoyaltyStateModule::getConvertId(); + $f->save(); + } + } + + static public function getOrdersByIdDiscount($id_discount) + { + $items = Db::getInstance()->ExecuteS(' + SELECT f.id_order AS id_order, f.points AS points, f.date_upd AS date + FROM `'._DB_PREFIX_.'loyalty` f + WHERE f.id_discount = '.(int)($id_discount).' AND f.id_loyalty_state = '.(int)(LoyaltyStateModule::getConvertId())); + + if (!empty($items) AND is_array($items)) + { + foreach ($items AS $key => $item) + { + $order = new Order((int)$item['id_order']); + $items[$key]['id_currency'] = (int)$order->id_currency; + $items[$key]['id_lang'] = (int)$order->id_lang; + $items[$key]['total_paid'] = $order->total_paid; + $items[$key]['total_shipping'] = $order->total_shipping; + } + return $items; + } + + return false; + } + + /* Register all transaction in a specific history table */ + private function historize() + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'loyalty_history` (`id_loyalty`, `id_loyalty_state`, `points`, `date_add`) + VALUES ('.(int)($this->id).', '.(int)($this->id_loyalty_state).', '.(int)($this->points).', NOW())'); + } + +} \ No newline at end of file diff --git a/modules/loyalty/LoyaltyStateModule.php b/modules/loyalty/LoyaltyStateModule.php new file mode 100644 index 000000000..7118d7521 --- /dev/null +++ b/modules/loyalty/LoyaltyStateModule.php @@ -0,0 +1,93 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class LoyaltyStateModule extends ObjectModel +{ + public $name; + public $id_order_state; + + protected $fieldsValidate = array('id_order_state' => 'isInt'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 128); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'loyalty_state'; + protected $identifier = 'id_loyalty_state'; + + public function getFields() + { + parent::validateFields(); + $fields['id_order_state'] = (int)($this->id_order_state); + return $fields; + } + + /** + * Check then return multilingual fields for database interaction + * + * @return array Multilingual fields + */ + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + static public function getDefaultId() { return 1; } + static public function getValidationId() { return 2; } + static public function getCancelId() { return 3; } + static public function getConvertId() { return 4; } + static public function getNoneAwardId() { return 5; } + + static public function insertDefaultData() + { + $loyaltyModule = new Loyalty(); + $languages = Language::getLanguages(); + + $defaultTranslations = array('default' => array('id_loyalty_state' => (int)LoyaltyStateModule::getDefaultId(), 'default' => $loyaltyModule->getL('Awaiting validation'), 'en' => 'Awaiting validation', 'fr' => 'En attente de validation')); + $defaultTranslations['validated'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getValidationId(), 'id_order_state' => _PS_OS_DELIVERED_, 'default' => $loyaltyModule->getL('Available'), 'en' => 'Available', 'fr' => 'Disponible'); + $defaultTranslations['cancelled'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getCancelId(), 'id_order_state' => _PS_OS_CANCELED_, 'default' => $loyaltyModule->getL('Cancelled'), 'en' => 'Cancelled', 'fr' => 'Annulés'); + $defaultTranslations['converted'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getConvertId(), 'default' => $loyaltyModule->getL('Already converted'), 'en' => 'Already converted', 'fr' => 'Déjà convertis'); + $defaultTranslations['none_award'] = array('id_loyalty_state' => (int)LoyaltyStateModule::getNoneAwardId(), 'default' => $loyaltyModule->getL('Unavailable on discounts'), 'en' => 'Unavailable on discounts', 'fr' => 'Non disponbile sur produits remisés'); + + foreach ($defaultTranslations AS $loyaltyState) + { + $state = new LoyaltyStateModule((int)$loyaltyState['id_loyalty_state']); + if (isset($loyaltyState['id_order_state'])) + $state->id_order_state = (int)$loyaltyState['id_order_state']; + $state->name[(int)Configuration::get('PS_LANG_DEFAULT')] = $loyaltyState['default']; + foreach ($languages AS $language) + if (isset($loyaltyState[$language['iso_code']])) + $state->name[(int)$language['id_lang']] = $loyaltyState[$language['iso_code']]; + $state->save(); + } + + return true; + } +} \ No newline at end of file diff --git a/modules/loyalty/config.xml b/modules/loyalty/config.xml new file mode 100755 index 000000000..c91c5bbb3 --- /dev/null +++ b/modules/loyalty/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>loyalty</name> + <displayName><![CDATA[Customer loyalty and rewards]]></displayName> + <version><![CDATA[1.8]]></version> + <description><![CDATA[Provide a loyalty program to your customers.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[pricing_promotion]]></tab> + <confirmUninstall>Are you sure you want to delete all loyalty points and customer history?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>0</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/loyalty/de.php b/modules/loyalty/de.php new file mode 100644 index 000000000..f008de691 --- /dev/null +++ b/modules/loyalty/de.php @@ -0,0 +1,102 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{loyalty}prestashop>loyalty_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mein Konto'; +$_MODULE['<{loyalty}prestashop>loyalty_c540093e64d84440025b2d8201f04336'] = 'Meine Treuepunkte'; +$_MODULE['<{loyalty}prestashop>loyalty_a240fa27925a635b08dc28c9e4f9216d'] = 'Bestellung'; +$_MODULE['<{loyalty}prestashop>loyalty_44749712dbec183e983dcd78a7736c41'] = 'Datum'; +$_MODULE['<{loyalty}prestashop>loyalty_75dd5f1160a3f02b6fae89c54361a1b3'] = 'Punkte'; +$_MODULE['<{loyalty}prestashop>loyalty_1026e44f047fb9da36a62c0a8846baac'] = 'Punkte-Status'; +$_MODULE['<{loyalty}prestashop>loyalty_66c2c90ea9f6f4a12854195085781d7f'] = 'Gesamtpunktezahl zur Verfügung:'; +$_MODULE['<{loyalty}prestashop>loyalty_01abfc750a0c942167651c40d088531d'] = 'Nr.'; +$_MODULE['<{loyalty}prestashop>loyalty_5acc2ceeb883ba07cef2d02ea382f242'] = 'Sie haben keine Bestellungen vorgenommen.'; +$_MODULE['<{loyalty}prestashop>loyalty_dd1f775e443ff3b9a89270713580a51b'] = 'Zurück'; +$_MODULE['<{loyalty}prestashop>loyalty_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Weiter'; +$_MODULE['<{loyalty}prestashop>loyalty_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{loyalty}prestashop>loyalty_6c583afb157e33bfb5b7c3d4114c4dd5'] = 'Artikel:'; +$_MODULE['<{loyalty}prestashop>loyalty_c48105520852bbd0fa692e4c9fd61628'] = 'Hier generierte Gutscheine sind in den folgenden Kategorien anwendbar:'; +$_MODULE['<{loyalty}prestashop>loyalty_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Alle'; +$_MODULE['<{loyalty}prestashop>loyalty_5b7d558a20e8bcb6d9355a012becb1eb'] = 'Sind Sie sicher, dass Sie Ihre Punkte in Gutscheine umwandeln wollen?'; +$_MODULE['<{loyalty}prestashop>loyalty_4db04271e368fe3d4e1aa7332a18fa9d'] = 'Meine Punkte in einen Gutschein im Wert von umwandeln'; +$_MODULE['<{loyalty}prestashop>loyalty_b39cba8836db01a04888aef6ba386420'] = 'Meine Gutscheine aus Treuepunkten'; +$_MODULE['<{loyalty}prestashop>loyalty_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Erstellt'; +$_MODULE['<{loyalty}prestashop>loyalty_689202409e48743b914713f96d93947c'] = 'Wert'; +$_MODULE['<{loyalty}prestashop>loyalty_ca0dbad92a874b2f69b549293387925e'] = 'Code'; +$_MODULE['<{loyalty}prestashop>loyalty_eb902cf204f3e4dfffeb56d92a9b5c26'] = 'Gültig ab'; +$_MODULE['<{loyalty}prestashop>loyalty_b2844b8e17ecaaeae68d018fe9418af0'] = 'Gültig bis'; +$_MODULE['<{loyalty}prestashop>loyalty_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{loyalty}prestashop>loyalty_3ec365dd533ddb7ef3d1c111186ce872'] = 'Details'; +$_MODULE['<{loyalty}prestashop>loyalty_29aa46cc3d2677c7e0f216910df600ff'] = 'Kostenloser Versand'; +$_MODULE['<{loyalty}prestashop>loyalty_cec73b5ce095a59305ad92a0d47495cb'] = 'So verwenden Sie'; +$_MODULE['<{loyalty}prestashop>loyalty_019d1ca7d50cc54b995f60d456435e87'] = 'Gebraucht'; +$_MODULE['<{loyalty}prestashop>loyalty_2af3bf4c82c5b33875d532820a959799'] = 'Durch diese Befehle erstellt'; +$_MODULE['<{loyalty}prestashop>loyalty_d1228f5476d15142b1358ae4b5fa2454'] = 'Bestellung Nr.'; +$_MODULE['<{loyalty}prestashop>loyalty_d5797f3bbadc278f756576dafc6ab4b8'] = 'Punkte.'; +$_MODULE['<{loyalty}prestashop>loyalty_a149e85a44aeec9140e92733d9ed694e'] = 'Abgebrochen'; +$_MODULE['<{loyalty}prestashop>loyalty_1f67ea7a0b26e9eacc70523bde28df0c'] = 'mehr ...'; +$_MODULE['<{loyalty}prestashop>loyalty_a16cf3ec5200cc519f4fe48e34b1df83'] = 'Die Mindestbestellmenge zur Verwendung dieser Gutscheine beträgt:'; +$_MODULE['<{loyalty}prestashop>loyalty_8e69341aca5dbf9f55c2e75a2ed5df3c'] = 'Noch keine Gutscheine.'; +$_MODULE['<{loyalty}prestashop>loyalty_00d56a5e37c19c59d521530fc8e7f337'] = 'Noch keine Bonuspunkte.'; +$_MODULE['<{loyalty}prestashop>loyalty_0b3db27bc15f682e92ff250ebb167d4b'] = 'Zurück zu Ihrem Konto'; +$_MODULE['<{loyalty}prestashop>loyalty_8cf04a9734132302f96da8e113e80ce5'] = 'Start'; +$_MODULE['<{loyalty}prestashop>loyalty_30146a132c2aa28808a8411ed74c12ed'] = 'Kundentreue und Belohnungen'; +$_MODULE['<{loyalty}prestashop>loyalty_f8763c754ba455aa6e8ddf0e62911eb7'] = 'Bieten Sie Ihren Kunden ein Treueprogramm'; +$_MODULE['<{loyalty}prestashop>loyalty_f0338d5a7bbd642cc188ca69c8a97b12'] = 'Dies löscht alle Treuepunkte und die Verlaufsgeschichte Ihrer Kunden, sind Sie sicher?'; +$_MODULE['<{loyalty}prestashop>loyalty_7307b68f93443d5863f1d3943c546b20'] = 'Treuebonus'; +$_MODULE['<{loyalty}prestashop>loyalty_e81b2826b5aebd9c92fb5d090f0cdc9d'] = 'Sie müssen mindestens eine Kategorie für Gutschein-Aktionen wählen'; +$_MODULE['<{loyalty}prestashop>loyalty_f38f5974cdc23279ffe6d203641a8bdf'] = 'Einstellungen aktualisiert.'; +$_MODULE['<{loyalty}prestashop>loyalty_5be9427a9169ad6e9b63b0c9c61575d9'] = 'Treueprogramm'; +$_MODULE['<{loyalty}prestashop>loyalty_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{loyalty}prestashop>loyalty_8334a158298fbcf163f4dcb4a387d150'] = 'Quote'; +$_MODULE['<{loyalty}prestashop>loyalty_315eae70bcaee168f1654c0ceeeef357'] = '1 Bonuspunkt'; +$_MODULE['<{loyalty}prestashop>loyalty_e3ff7eaa9deb31e1e91178a7216135c0'] = '1 Punkt ='; +$_MODULE['<{loyalty}prestashop>loyalty_46108358594124685e77e7d49f762b30'] = 'für den Rabatt'; +$_MODULE['<{loyalty}prestashop>loyalty_98cf9475009d3c6e795ffac5d391cec4'] = 'Gutschein-Details'; +$_MODULE['<{loyalty}prestashop>loyalty_dd98e4d652530674f61201056fdbe9b4'] = 'Minimalbetrag zur Benutzung des Gutscheins'; +$_MODULE['<{loyalty}prestashop>loyalty_51ab56dd5b46c7b5c8fdf22651ae0db6'] = 'Punkte auf herabgesetzte Produkte verteilen'; +$_MODULE['<{loyalty}prestashop>loyalty_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{loyalty}prestashop>loyalty_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{loyalty}prestashop>loyalty_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{loyalty}prestashop>loyalty_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{loyalty}prestashop>loyalty_ade45d72ab6ba1ab576d8b9deb0c2438'] = 'Punkte werden vergeben, wenn die Bestellung'; +$_MODULE['<{loyalty}prestashop>loyalty_9611a682e61c503c32e2dc58fdbc8ddf'] = 'Punkte werden gelöscht, wenn die Bestellung'; +$_MODULE['<{loyalty}prestashop>loyalty_2a46cccdea2f18fdfdfacf99a98b758d'] = 'Gutscheine, die vom Treue-System erstellt wurden, können in den folgenden Kategorien verwendet werden:'; +$_MODULE['<{loyalty}prestashop>loyalty_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{loyalty}prestashop>loyalty_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{loyalty}prestashop>loyalty_c2a7db7dec4de1bdb143ccd790f5a62c'] = 'Markieren Sie alle Kontrollkästchen der Kategorien, in denen Treue-Gutscheine nutzbar sind'; +$_MODULE['<{loyalty}prestashop>loyalty_30e793698766edbaaf84a74d4c377f72'] = 'Treuepunkte-Fortschritt'; +$_MODULE['<{loyalty}prestashop>loyalty_4f2a91e15af2631ff9424564b8a45fb2'] = 'Ursprünglich'; +$_MODULE['<{loyalty}prestashop>loyalty_453e6aa38d87b28ccae545967c53004f'] = 'Nicht verfügbar'; +$_MODULE['<{loyalty}prestashop>loyalty_6366c60fc5b4f4fce0e3dd146494a4f4'] = 'Eingelöst'; +$_MODULE['<{loyalty}prestashop>loyalty_13148717f8faa9037f37d28971dfc219'] = 'Bestätigung'; +$_MODULE['<{loyalty}prestashop>loyalty_38fb7d24e0d60a048f540ecb18e13376'] = 'Speichern'; +$_MODULE['<{loyalty}prestashop>loyalty_f67fb9d4e53cbac558e2735a7503ce92'] = 'Treuepunkte'; +$_MODULE['<{loyalty}prestashop>loyalty_0aab81de5c4c87021772015efc184d67'] = 'Punkte'; +$_MODULE['<{loyalty}prestashop>loyalty_309cd9f5437d1bb06a7fdab1811afe1a'] = 'Dieser Kunde hat keine Punkte'; +$_MODULE['<{loyalty}prestashop>loyalty_aa7f22f84f7be784055a3e7e7d22c519'] = 'Insgesamt (ohne Versandkosten)'; +$_MODULE['<{loyalty}prestashop>loyalty_928666bdf20510dfa5c58393b77f1798'] = 'Gutschein-Wert:'; +$_MODULE['<{loyalty}prestashop>loyalty_a9be824aae4f2381a27b7c699b1e041e'] = 'Warten auf Bestätigung'; +$_MODULE['<{loyalty}prestashop>loyalty_78945de8de090e90045d299651a68a9b'] = 'Verfügbar'; +$_MODULE['<{loyalty}prestashop>loyalty_4cb08bf5ad3d3c7b010dde725a078b28'] = 'Bereits eingelöst'; +$_MODULE['<{loyalty}prestashop>loyalty_df05c2db84dacb19b599b489bf3963db'] = 'Nicht auf Gutscheine anwendbar'; +$_MODULE['<{loyalty}prestashop>loyalty_01371a1d58e9234c0b9dbc08cf54fa8b'] = 'Nicht für Rabatte zur Verfügung'; +$_MODULE['<{loyalty}prestashop>my-account_c540093e64d84440025b2d8201f04336'] = 'Meine Treuepunkte'; +$_MODULE['<{loyalty}prestashop>product_ded9088edfbcc1041c3a642b031c8f72'] = 'Treueprogramm'; +$_MODULE['<{loyalty}prestashop>product_08ef6b34ab8e7039ef0ee69378f0ac0b'] = 'Sammeln Sie mit dem Kauf dieses Produktes Sie bis zu'; +$_MODULE['<{loyalty}prestashop>product_2996152bb442bf98c80c515c6055de5f'] = 'Treuepunkte'; +$_MODULE['<{loyalty}prestashop>product_b40d5c523ee75453134b1449dd9cd13a'] = 'Treuepunkte'; +$_MODULE['<{loyalty}prestashop>product_b9cb3a85529dd593c14c838e22976cff'] = 'Ihr Warenkorb hat insgesamt'; +$_MODULE['<{loyalty}prestashop>product_0aab81de5c4c87021772015efc184d67'] = 'Punkte'; +$_MODULE['<{loyalty}prestashop>product_78ee54aa8f813885fe2fe20d232518b9'] = 'Punkt'; +$_MODULE['<{loyalty}prestashop>product_443c3e03e194c2a4cdb107808b051615'] = 'die in einen Gutschein im Wert von umgerechnet werden können'; +$_MODULE['<{loyalty}prestashop>product_054a9c66cc92b7f1bfcacee3b7c7ad54'] = 'Keine Bonuspunkte für dieses Produkt, weil es bereits herabgesetzt ist.'; +$_MODULE['<{loyalty}prestashop>product_e94d481804904a48c1a8093e7a069570'] = 'Keine Bonuspunkte für dieses Produkt.'; +$_MODULE['<{loyalty}prestashop>shopping-cart_ea2c0ea1a08add3a75273e7f32f05f7a'] = 'Treue'; +$_MODULE['<{loyalty}prestashop>shopping-cart_4cd8259257033282f11cc9bbe648dff7'] = 'Durch die Überprüfung dieses Warenkorbs können Sie bis zu'; +$_MODULE['<{loyalty}prestashop>shopping-cart_2996152bb442bf98c80c515c6055de5f'] = 'Treuepunkte'; +$_MODULE['<{loyalty}prestashop>shopping-cart_b40d5c523ee75453134b1449dd9cd13a'] = 'Treuepunkte'; +$_MODULE['<{loyalty}prestashop>shopping-cart_443c3e03e194c2a4cdb107808b051615'] = 'die in einen Gutschein im Wert von umgerechnet werden können'; +$_MODULE['<{loyalty}prestashop>shopping-cart_8cec799df06a3f5a026b31fcd95e0172'] = 'Fügen Sie einige Produkte zu Ihrem Warenkorb, um einige Treuepunkte zu sammeln.'; + +?> \ No newline at end of file diff --git a/modules/loyalty/en.php b/modules/loyalty/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/loyalty/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/loyalty/es.php b/modules/loyalty/es.php new file mode 100644 index 000000000..9ef0a0b71 --- /dev/null +++ b/modules/loyalty/es.php @@ -0,0 +1,100 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{loyalty}prestashop>loyalty_30146a132c2aa28808a8411ed74c12ed'] = 'La fidelidad de los clientes y las recompensas'; +$_MODULE['<{loyalty}prestashop>loyalty_f8763c754ba455aa6e8ddf0e62911eb7'] = 'Propone un programa de fidelización a sus clientes'; +$_MODULE['<{loyalty}prestashop>loyalty_f0338d5a7bbd642cc188ca69c8a97b12'] = 'Esta acción suprimirá todos los puntos de fidelidad y el historial de los puntos de todos sus clientes, ¿está seguro de que desea continuar?'; +$_MODULE['<{loyalty}prestashop>loyalty_7307b68f93443d5863f1d3943c546b20'] = 'Recompensa fidelidad'; +$_MODULE['<{loyalty}prestashop>loyalty_e81b2826b5aebd9c92fb5d090f0cdc9d'] = 'Debe elegir al menos una categoría para generar vales descuento'; +$_MODULE['<{loyalty}prestashop>loyalty_f38f5974cdc23279ffe6d203641a8bdf'] = 'Ajustes actualizados.'; +$_MODULE['<{loyalty}prestashop>loyalty_5be9427a9169ad6e9b63b0c9c61575d9'] = 'Programa de Fidelidad'; +$_MODULE['<{loyalty}prestashop>loyalty_f4f70727dc34561dfde1a3c529b6205c'] = 'Ajustes'; +$_MODULE['<{loyalty}prestashop>loyalty_8334a158298fbcf163f4dcb4a387d150'] = 'Ratio'; +$_MODULE['<{loyalty}prestashop>loyalty_315eae70bcaee168f1654c0ceeeef357'] = '1 punto de recompensa'; +$_MODULE['<{loyalty}prestashop>loyalty_e3ff7eaa9deb31e1e91178a7216135c0'] = '1 punto ='; +$_MODULE['<{loyalty}prestashop>loyalty_46108358594124685e77e7d49f762b30'] = 'para el descuento'; +$_MODULE['<{loyalty}prestashop>loyalty_98cf9475009d3c6e795ffac5d391cec4'] = 'Detalles del vale'; +$_MODULE['<{loyalty}prestashop>loyalty_dd98e4d652530674f61201056fdbe9b4'] = 'Importe mínimo para utilizar este vale'; +$_MODULE['<{loyalty}prestashop>loyalty_51ab56dd5b46c7b5c8fdf22651ae0db6'] = 'Dar puntos por los productos en descuento'; +$_MODULE['<{loyalty}prestashop>loyalty_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{loyalty}prestashop>loyalty_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{loyalty}prestashop>loyalty_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{loyalty}prestashop>loyalty_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{loyalty}prestashop>loyalty_ade45d72ab6ba1ab576d8b9deb0c2438'] = 'Los Puntos se otorgan cuando el pedido sea'; +$_MODULE['<{loyalty}prestashop>loyalty_9611a682e61c503c32e2dc58fdbc8ddf'] = 'Los puntos se cancelarán cuando la pedido sea'; +$_MODULE['<{loyalty}prestashop>loyalty_2a46cccdea2f18fdfdfacf99a98b758d'] = 'Los vales descuento creados por el sistema de fidelidad pueden utilizarse en las categorías de artículos siguientes:'; +$_MODULE['<{loyalty}prestashop>loyalty_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{loyalty}prestashop>loyalty_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{loyalty}prestashop>loyalty_c2a7db7dec4de1bdb143ccd790f5a62c'] = 'Marcar para qué categorías se utilizarán los vales descuento de fidelidad'; +$_MODULE['<{loyalty}prestashop>loyalty_30e793698766edbaaf84a74d4c377f72'] = 'Progresión de puntos de fidelidad'; +$_MODULE['<{loyalty}prestashop>loyalty_4f2a91e15af2631ff9424564b8a45fb2'] = 'Inicial'; +$_MODULE['<{loyalty}prestashop>loyalty_453e6aa38d87b28ccae545967c53004f'] = 'No disponible'; +$_MODULE['<{loyalty}prestashop>loyalty_6366c60fc5b4f4fce0e3dd146494a4f4'] = 'Convertido'; +$_MODULE['<{loyalty}prestashop>loyalty_13148717f8faa9037f37d28971dfc219'] = 'Validación'; +$_MODULE['<{loyalty}prestashop>loyalty_a149e85a44aeec9140e92733d9ed694e'] = 'Cancelado'; +$_MODULE['<{loyalty}prestashop>loyalty_38fb7d24e0d60a048f540ecb18e13376'] = 'Guardar'; +$_MODULE['<{loyalty}prestashop>loyalty_f67fb9d4e53cbac558e2735a7503ce92'] = 'Puntos de fidelidad'; +$_MODULE['<{loyalty}prestashop>loyalty_0aab81de5c4c87021772015efc184d67'] = 'Puntos'; +$_MODULE['<{loyalty}prestashop>loyalty_309cd9f5437d1bb06a7fdab1811afe1a'] = 'Este cliente no tiene puntos'; +$_MODULE['<{loyalty}prestashop>loyalty_a240fa27925a635b08dc28c9e4f9216d'] = 'Pedido'; +$_MODULE['<{loyalty}prestashop>loyalty_44749712dbec183e983dcd78a7736c41'] = 'Fecha'; +$_MODULE['<{loyalty}prestashop>loyalty_aa7f22f84f7be784055a3e7e7d22c519'] = 'Total (sin transporte)'; +$_MODULE['<{loyalty}prestashop>loyalty_75dd5f1160a3f02b6fae89c54361a1b3'] = 'Puntos'; +$_MODULE['<{loyalty}prestashop>loyalty_1026e44f047fb9da36a62c0a8846baac'] = 'Estado de los puntos'; +$_MODULE['<{loyalty}prestashop>loyalty_01abfc750a0c942167651c40d088531d'] = '#'; +$_MODULE['<{loyalty}prestashop>loyalty_66c2c90ea9f6f4a12854195085781d7f'] = 'Total puntos disponibles:'; +$_MODULE['<{loyalty}prestashop>loyalty_928666bdf20510dfa5c58393b77f1798'] = 'Valor de bono:'; +$_MODULE['<{loyalty}prestashop>loyalty_a9be824aae4f2381a27b7c699b1e041e'] = 'En espera de validación'; +$_MODULE['<{loyalty}prestashop>loyalty_78945de8de090e90045d299651a68a9b'] = 'Disponibles'; +$_MODULE['<{loyalty}prestashop>loyalty_4cb08bf5ad3d3c7b010dde725a078b28'] = 'Convertidos'; +$_MODULE['<{loyalty}prestashop>loyalty_df05c2db84dacb19b599b489bf3963db'] = 'No disponible en los descuentos'; +$_MODULE['<{loyalty}prestashop>loyalty_01371a1d58e9234c0b9dbc08cf54fa8b'] = 'No válidos en descuentos'; +$_MODULE['<{loyalty}prestashop>loyalty_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mi cuenta:'; +$_MODULE['<{loyalty}prestashop>loyalty_c540093e64d84440025b2d8201f04336'] = 'Mis puntos recompensa'; +$_MODULE['<{loyalty}prestashop>loyalty_5acc2ceeb883ba07cef2d02ea382f242'] = 'Usted no ha solicitado pedidos.'; +$_MODULE['<{loyalty}prestashop>loyalty_dd1f775e443ff3b9a89270713580a51b'] = 'Anterior'; +$_MODULE['<{loyalty}prestashop>loyalty_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Siguiente'; +$_MODULE['<{loyalty}prestashop>loyalty_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{loyalty}prestashop>loyalty_6c583afb157e33bfb5b7c3d4114c4dd5'] = 'objetos:'; +$_MODULE['<{loyalty}prestashop>loyalty_c48105520852bbd0fa692e4c9fd61628'] = 'Los vales descuento generados aquí pueden utilizarse para los artículos de las siguientes categorías:'; +$_MODULE['<{loyalty}prestashop>loyalty_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Todas'; +$_MODULE['<{loyalty}prestashop>loyalty_5b7d558a20e8bcb6d9355a012becb1eb'] = '¿Está seguro de querer transformar sus puntos en vales de compra?'; +$_MODULE['<{loyalty}prestashop>loyalty_4db04271e368fe3d4e1aa7332a18fa9d'] = 'Transformar mis puntos en un vale de'; +$_MODULE['<{loyalty}prestashop>loyalty_b39cba8836db01a04888aef6ba386420'] = 'Mis vales de puntos de fidelidad'; +$_MODULE['<{loyalty}prestashop>loyalty_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Creado'; +$_MODULE['<{loyalty}prestashop>loyalty_689202409e48743b914713f96d93947c'] = 'Valor'; +$_MODULE['<{loyalty}prestashop>loyalty_ca0dbad92a874b2f69b549293387925e'] = 'Código'; +$_MODULE['<{loyalty}prestashop>loyalty_eb902cf204f3e4dfffeb56d92a9b5c26'] = 'Válido del'; +$_MODULE['<{loyalty}prestashop>loyalty_b2844b8e17ecaaeae68d018fe9418af0'] = 'Válido hasta'; +$_MODULE['<{loyalty}prestashop>loyalty_ec53a8c4f07baed5d8825072c89799be'] = 'Estado'; +$_MODULE['<{loyalty}prestashop>loyalty_3ec365dd533ddb7ef3d1c111186ce872'] = 'Detalles'; +$_MODULE['<{loyalty}prestashop>loyalty_29aa46cc3d2677c7e0f216910df600ff'] = 'Transporte gratuíto'; +$_MODULE['<{loyalty}prestashop>loyalty_cec73b5ce095a59305ad92a0d47495cb'] = 'Para usar'; +$_MODULE['<{loyalty}prestashop>loyalty_019d1ca7d50cc54b995f60d456435e87'] = 'Usado'; +$_MODULE['<{loyalty}prestashop>loyalty_2af3bf4c82c5b33875d532820a959799'] = 'Generado por los siguientes pedidos'; +$_MODULE['<{loyalty}prestashop>loyalty_d1228f5476d15142b1358ae4b5fa2454'] = 'Pedido n°'; +$_MODULE['<{loyalty}prestashop>loyalty_d5797f3bbadc278f756576dafc6ab4b8'] = 'puntos.'; +$_MODULE['<{loyalty}prestashop>loyalty_1f67ea7a0b26e9eacc70523bde28df0c'] = 'más...'; +$_MODULE['<{loyalty}prestashop>loyalty_a16cf3ec5200cc519f4fe48e34b1df83'] = 'El importe mínimo requerido para utilizar estos vales es de.'; +$_MODULE['<{loyalty}prestashop>loyalty_8e69341aca5dbf9f55c2e75a2ed5df3c'] = 'Sin vales aún'; +$_MODULE['<{loyalty}prestashop>loyalty_00d56a5e37c19c59d521530fc8e7f337'] = 'Sin recompensa de puntos todavía'; +$_MODULE['<{loyalty}prestashop>loyalty_0b3db27bc15f682e92ff250ebb167d4b'] = 'Volver a su cuenta'; +$_MODULE['<{loyalty}prestashop>loyalty_8cf04a9734132302f96da8e113e80ce5'] = 'Inicio'; +$_MODULE['<{loyalty}prestashop>my-account_c540093e64d84440025b2d8201f04336'] = 'Mis puntos de fidelidad'; +$_MODULE['<{loyalty}prestashop>product_ded9088edfbcc1041c3a642b031c8f72'] = 'Programa de fidelización'; +$_MODULE['<{loyalty}prestashop>product_08ef6b34ab8e7039ef0ee69378f0ac0b'] = 'Al comprar este producto puede obtener hasta'; +$_MODULE['<{loyalty}prestashop>product_2996152bb442bf98c80c515c6055de5f'] = 'puntos de fidelidad'; +$_MODULE['<{loyalty}prestashop>product_b40d5c523ee75453134b1449dd9cd13a'] = 'punto de fidelidad'; +$_MODULE['<{loyalty}prestashop>product_b9cb3a85529dd593c14c838e22976cff'] = 'Su carrito totalizará'; +$_MODULE['<{loyalty}prestashop>product_0aab81de5c4c87021772015efc184d67'] = 'puntos'; +$_MODULE['<{loyalty}prestashop>product_78ee54aa8f813885fe2fe20d232518b9'] = 'punto'; +$_MODULE['<{loyalty}prestashop>product_443c3e03e194c2a4cdb107808b051615'] = 'que se puede(n) transformar en un vale de descuento de'; +$_MODULE['<{loyalty}prestashop>product_054a9c66cc92b7f1bfcacee3b7c7ad54'] = 'No hay puntos de recompensa para este producto porque ya hay un descuento'; +$_MODULE['<{loyalty}prestashop>product_e94d481804904a48c1a8093e7a069570'] = 'No hay puntos de recompensa para este producto.'; +$_MODULE['<{loyalty}prestashop>shopping-cart_ea2c0ea1a08add3a75273e7f32f05f7a'] = 'fidelidad'; +$_MODULE['<{loyalty}prestashop>shopping-cart_4cd8259257033282f11cc9bbe648dff7'] = 'Si valida su carrito, puede reunir'; +$_MODULE['<{loyalty}prestashop>shopping-cart_2996152bb442bf98c80c515c6055de5f'] = 'puntos de fidelidad'; +$_MODULE['<{loyalty}prestashop>shopping-cart_b40d5c523ee75453134b1449dd9cd13a'] = 'punto de fidelidad'; +$_MODULE['<{loyalty}prestashop>shopping-cart_443c3e03e194c2a4cdb107808b051615'] = 'que se puede(n) transformar en un vale de descuento de'; +$_MODULE['<{loyalty}prestashop>shopping-cart_8cec799df06a3f5a026b31fcd95e0172'] = 'Añadir más productos al carrito para obtener puntos de fidelidad.'; diff --git a/modules/loyalty/fr.php b/modules/loyalty/fr.php new file mode 100644 index 000000000..a905233a6 --- /dev/null +++ b/modules/loyalty/fr.php @@ -0,0 +1,100 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{loyalty}prestashop>loyalty_30146a132c2aa28808a8411ed74c12ed'] = 'Programme de fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_f8763c754ba455aa6e8ddf0e62911eb7'] = 'Propose un programme de fidélité à vos clients'; +$_MODULE['<{loyalty}prestashop>loyalty_f0338d5a7bbd642cc188ca69c8a97b12'] = 'Cette action effacera tous les points de fidélité et l\'historique des points de tous vos clients, êtes vous sûr ?'; +$_MODULE['<{loyalty}prestashop>loyalty_7307b68f93443d5863f1d3943c546b20'] = 'Récompense fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_e81b2826b5aebd9c92fb5d090f0cdc9d'] = 'Vous devez choisir au moins une catégorie pour la génération des bons de réductions'; +$_MODULE['<{loyalty}prestashop>loyalty_f38f5974cdc23279ffe6d203641a8bdf'] = 'Configuration mise à jour.'; +$_MODULE['<{loyalty}prestashop>loyalty_5be9427a9169ad6e9b63b0c9c61575d9'] = 'Programme de fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{loyalty}prestashop>loyalty_8334a158298fbcf163f4dcb4a387d150'] = 'Ratio'; +$_MODULE['<{loyalty}prestashop>loyalty_315eae70bcaee168f1654c0ceeeef357'] = '1 point de fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_e3ff7eaa9deb31e1e91178a7216135c0'] = '1 point ='; +$_MODULE['<{loyalty}prestashop>loyalty_46108358594124685e77e7d49f762b30'] = 'de réduction'; +$_MODULE['<{loyalty}prestashop>loyalty_98cf9475009d3c6e795ffac5d391cec4'] = 'Détails du bon'; +$_MODULE['<{loyalty}prestashop>loyalty_dd98e4d652530674f61201056fdbe9b4'] = 'Montant minimal pour utiliser le bon'; +$_MODULE['<{loyalty}prestashop>loyalty_51ab56dd5b46c7b5c8fdf22651ae0db6'] = 'Donner des points sur les produits en promotion'; +$_MODULE['<{loyalty}prestashop>loyalty_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{loyalty}prestashop>loyalty_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{loyalty}prestashop>loyalty_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{loyalty}prestashop>loyalty_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{loyalty}prestashop>loyalty_ade45d72ab6ba1ab576d8b9deb0c2438'] = 'Points attribués au statut suivant'; +$_MODULE['<{loyalty}prestashop>loyalty_9611a682e61c503c32e2dc58fdbc8ddf'] = 'Points annulés au statut suivant'; +$_MODULE['<{loyalty}prestashop>loyalty_2a46cccdea2f18fdfdfacf99a98b758d'] = 'Les bons de réductions crées par le système de fidélité peuvent être utilisés dans les catégories d\'articles suivantes :'; +$_MODULE['<{loyalty}prestashop>loyalty_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{loyalty}prestashop>loyalty_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{loyalty}prestashop>loyalty_c2a7db7dec4de1bdb143ccd790f5a62c'] = 'Cocher pour quelle(s) catégorie(s) seront utilisables les bons de réductions fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_30e793698766edbaaf84a74d4c377f72'] = 'Statuts des points de fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_4f2a91e15af2631ff9424564b8a45fb2'] = 'Initial'; +$_MODULE['<{loyalty}prestashop>loyalty_453e6aa38d87b28ccae545967c53004f'] = 'Indisponibles'; +$_MODULE['<{loyalty}prestashop>loyalty_6366c60fc5b4f4fce0e3dd146494a4f4'] = 'Convertis'; +$_MODULE['<{loyalty}prestashop>loyalty_13148717f8faa9037f37d28971dfc219'] = 'Disponibles'; +$_MODULE['<{loyalty}prestashop>loyalty_a149e85a44aeec9140e92733d9ed694e'] = 'Annulé'; +$_MODULE['<{loyalty}prestashop>loyalty_38fb7d24e0d60a048f540ecb18e13376'] = 'Sauvegarder'; +$_MODULE['<{loyalty}prestashop>loyalty_f67fb9d4e53cbac558e2735a7503ce92'] = 'Points de fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_0aab81de5c4c87021772015efc184d67'] = 'points'; +$_MODULE['<{loyalty}prestashop>loyalty_309cd9f5437d1bb06a7fdab1811afe1a'] = 'Ce client n\'a pas de point'; +$_MODULE['<{loyalty}prestashop>loyalty_a240fa27925a635b08dc28c9e4f9216d'] = 'Commande'; +$_MODULE['<{loyalty}prestashop>loyalty_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{loyalty}prestashop>loyalty_aa7f22f84f7be784055a3e7e7d22c519'] = 'Total (hors frais de ports)'; +$_MODULE['<{loyalty}prestashop>loyalty_75dd5f1160a3f02b6fae89c54361a1b3'] = 'Points'; +$_MODULE['<{loyalty}prestashop>loyalty_1026e44f047fb9da36a62c0a8846baac'] = 'Statut des points'; +$_MODULE['<{loyalty}prestashop>loyalty_01abfc750a0c942167651c40d088531d'] = 'n°'; +$_MODULE['<{loyalty}prestashop>loyalty_66c2c90ea9f6f4a12854195085781d7f'] = 'Total de points disponibles'; +$_MODULE['<{loyalty}prestashop>loyalty_928666bdf20510dfa5c58393b77f1798'] = 'Valeur du bon :'; +$_MODULE['<{loyalty}prestashop>loyalty_a9be824aae4f2381a27b7c699b1e041e'] = 'En attente de validation'; +$_MODULE['<{loyalty}prestashop>loyalty_78945de8de090e90045d299651a68a9b'] = 'Disponibles'; +$_MODULE['<{loyalty}prestashop>loyalty_4cb08bf5ad3d3c7b010dde725a078b28'] = 'Déjà convertis'; +$_MODULE['<{loyalty}prestashop>loyalty_df05c2db84dacb19b599b489bf3963db'] = 'Non disponible sur les remises'; +$_MODULE['<{loyalty}prestashop>loyalty_01371a1d58e9234c0b9dbc08cf54fa8b'] = 'Non valables sur les promotions'; +$_MODULE['<{loyalty}prestashop>loyalty_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mon compte'; +$_MODULE['<{loyalty}prestashop>loyalty_c540093e64d84440025b2d8201f04336'] = 'Mes points de fidélité'; +$_MODULE['<{loyalty}prestashop>loyalty_5acc2ceeb883ba07cef2d02ea382f242'] = 'Vous n\'avez passé aucune commande.'; +$_MODULE['<{loyalty}prestashop>loyalty_dd1f775e443ff3b9a89270713580a51b'] = 'Précédent'; +$_MODULE['<{loyalty}prestashop>loyalty_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Suivant'; +$_MODULE['<{loyalty}prestashop>loyalty_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{loyalty}prestashop>loyalty_6c583afb157e33bfb5b7c3d4114c4dd5'] = 'objets :'; +$_MODULE['<{loyalty}prestashop>loyalty_c48105520852bbd0fa692e4c9fd61628'] = 'Les bons de réductions générés ici peuvent être utilisés pour les articles des catégories suivantes :'; +$_MODULE['<{loyalty}prestashop>loyalty_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Toutes'; +$_MODULE['<{loyalty}prestashop>loyalty_5b7d558a20e8bcb6d9355a012becb1eb'] = 'Etes-vous sûrs de vouloir transformer vos points en bon de réduction ?'; +$_MODULE['<{loyalty}prestashop>loyalty_4db04271e368fe3d4e1aa7332a18fa9d'] = 'Transformer mes points en un bon de réduction de'; +$_MODULE['<{loyalty}prestashop>loyalty_b39cba8836db01a04888aef6ba386420'] = 'Mes bons de réductions obtenus'; +$_MODULE['<{loyalty}prestashop>loyalty_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Créé le'; +$_MODULE['<{loyalty}prestashop>loyalty_689202409e48743b914713f96d93947c'] = 'Valeur'; +$_MODULE['<{loyalty}prestashop>loyalty_ca0dbad92a874b2f69b549293387925e'] = 'Code'; +$_MODULE['<{loyalty}prestashop>loyalty_eb902cf204f3e4dfffeb56d92a9b5c26'] = 'Valide du'; +$_MODULE['<{loyalty}prestashop>loyalty_b2844b8e17ecaaeae68d018fe9418af0'] = 'Valide jusqu\'au'; +$_MODULE['<{loyalty}prestashop>loyalty_ec53a8c4f07baed5d8825072c89799be'] = 'Statut'; +$_MODULE['<{loyalty}prestashop>loyalty_3ec365dd533ddb7ef3d1c111186ce872'] = 'Détails'; +$_MODULE['<{loyalty}prestashop>loyalty_29aa46cc3d2677c7e0f216910df600ff'] = 'Frais de port offerts'; +$_MODULE['<{loyalty}prestashop>loyalty_cec73b5ce095a59305ad92a0d47495cb'] = 'A utiliser'; +$_MODULE['<{loyalty}prestashop>loyalty_019d1ca7d50cc54b995f60d456435e87'] = 'Utilisé'; +$_MODULE['<{loyalty}prestashop>loyalty_2af3bf4c82c5b33875d532820a959799'] = 'Généré par les commandes suivantes'; +$_MODULE['<{loyalty}prestashop>loyalty_d1228f5476d15142b1358ae4b5fa2454'] = 'Commande n°'; +$_MODULE['<{loyalty}prestashop>loyalty_d5797f3bbadc278f756576dafc6ab4b8'] = 'points.'; +$_MODULE['<{loyalty}prestashop>loyalty_1f67ea7a0b26e9eacc70523bde28df0c'] = 'plus...'; +$_MODULE['<{loyalty}prestashop>loyalty_a16cf3ec5200cc519f4fe48e34b1df83'] = 'Le montant minimum de commande afin d\'utiliser ces bons est : '; +$_MODULE['<{loyalty}prestashop>loyalty_8e69341aca5dbf9f55c2e75a2ed5df3c'] = 'Aucun bon de réduction pour le moment.'; +$_MODULE['<{loyalty}prestashop>loyalty_00d56a5e37c19c59d521530fc8e7f337'] = 'Aucun point de fidélité pour le moment.'; +$_MODULE['<{loyalty}prestashop>loyalty_0b3db27bc15f682e92ff250ebb167d4b'] = 'Retour à votre compte'; +$_MODULE['<{loyalty}prestashop>loyalty_8cf04a9734132302f96da8e113e80ce5'] = 'Accueil'; +$_MODULE['<{loyalty}prestashop>my-account_c540093e64d84440025b2d8201f04336'] = 'Mes points de fidélité'; +$_MODULE['<{loyalty}prestashop>product_ded9088edfbcc1041c3a642b031c8f72'] = 'Programme de fidélisation'; +$_MODULE['<{loyalty}prestashop>product_08ef6b34ab8e7039ef0ee69378f0ac0b'] = 'En achetant ce produit vous pouvez gagner jusqu\'à '; +$_MODULE['<{loyalty}prestashop>product_2996152bb442bf98c80c515c6055de5f'] = 'points de fidélité'; +$_MODULE['<{loyalty}prestashop>product_b40d5c523ee75453134b1449dd9cd13a'] = 'point de fidélité'; +$_MODULE['<{loyalty}prestashop>product_b9cb3a85529dd593c14c838e22976cff'] = 'Votre panier totalisera'; +$_MODULE['<{loyalty}prestashop>product_0aab81de5c4c87021772015efc184d67'] = 'points'; +$_MODULE['<{loyalty}prestashop>product_78ee54aa8f813885fe2fe20d232518b9'] = 'point'; +$_MODULE['<{loyalty}prestashop>product_443c3e03e194c2a4cdb107808b051615'] = 'pouvant être transformé(s) en un bon de réduction de'; +$_MODULE['<{loyalty}prestashop>product_054a9c66cc92b7f1bfcacee3b7c7ad54'] = 'Aucun point de fidélité pour ce produit car il y a déjà une réduction.'; +$_MODULE['<{loyalty}prestashop>product_e94d481804904a48c1a8093e7a069570'] = 'Aucun point de fidélité pour ce produit.'; +$_MODULE['<{loyalty}prestashop>shopping-cart_ea2c0ea1a08add3a75273e7f32f05f7a'] = 'fidélité'; +$_MODULE['<{loyalty}prestashop>shopping-cart_4cd8259257033282f11cc9bbe648dff7'] = 'En validant votre panier, vous pouvez collecter'; +$_MODULE['<{loyalty}prestashop>shopping-cart_2996152bb442bf98c80c515c6055de5f'] = 'points de fidélité'; +$_MODULE['<{loyalty}prestashop>shopping-cart_b40d5c523ee75453134b1449dd9cd13a'] = 'point de fidélité'; +$_MODULE['<{loyalty}prestashop>shopping-cart_443c3e03e194c2a4cdb107808b051615'] = 'pouvant être transformé(s) en un bon de réduction de'; +$_MODULE['<{loyalty}prestashop>shopping-cart_8cec799df06a3f5a026b31fcd95e0172'] = 'Ajoutez des produits à votre panier pour gagner plus de points de fidélité.'; diff --git a/modules/loyalty/it.php b/modules/loyalty/it.php new file mode 100644 index 000000000..476c91238 --- /dev/null +++ b/modules/loyalty/it.php @@ -0,0 +1,102 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{loyalty}prestashop>loyalty_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Il mio account'; +$_MODULE['<{loyalty}prestashop>loyalty_c540093e64d84440025b2d8201f04336'] = 'I miei punti fedeltà'; +$_MODULE['<{loyalty}prestashop>loyalty_a240fa27925a635b08dc28c9e4f9216d'] = 'Ordine'; +$_MODULE['<{loyalty}prestashop>loyalty_44749712dbec183e983dcd78a7736c41'] = 'Data'; +$_MODULE['<{loyalty}prestashop>loyalty_75dd5f1160a3f02b6fae89c54361a1b3'] = 'Punti'; +$_MODULE['<{loyalty}prestashop>loyalty_1026e44f047fb9da36a62c0a8846baac'] = 'Status dei punti'; +$_MODULE['<{loyalty}prestashop>loyalty_66c2c90ea9f6f4a12854195085781d7f'] = 'Totale punti disponibili:'; +$_MODULE['<{loyalty}prestashop>loyalty_01abfc750a0c942167651c40d088531d'] = 'n.'; +$_MODULE['<{loyalty}prestashop>loyalty_5acc2ceeb883ba07cef2d02ea382f242'] = 'Non ha effettuato ordini.'; +$_MODULE['<{loyalty}prestashop>loyalty_dd1f775e443ff3b9a89270713580a51b'] = 'Precedente'; +$_MODULE['<{loyalty}prestashop>loyalty_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Successivo'; +$_MODULE['<{loyalty}prestashop>loyalty_e0aa021e21dddbd6d8cecec71e9cf564'] = 'OK'; +$_MODULE['<{loyalty}prestashop>loyalty_6c583afb157e33bfb5b7c3d4114c4dd5'] = 'elementi:'; +$_MODULE['<{loyalty}prestashop>loyalty_c48105520852bbd0fa692e4c9fd61628'] = 'I buoni generati qui sono utilizzabili nelle seguenti categorie:'; +$_MODULE['<{loyalty}prestashop>loyalty_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tutti'; +$_MODULE['<{loyalty}prestashop>loyalty_5b7d558a20e8bcb6d9355a012becb1eb'] = 'Sei sicuro di voler trasformare i tuoi punti in buoni?'; +$_MODULE['<{loyalty}prestashop>loyalty_4db04271e368fe3d4e1aa7332a18fa9d'] = 'Trasformare i miei punti in un buono di'; +$_MODULE['<{loyalty}prestashop>loyalty_b39cba8836db01a04888aef6ba386420'] = 'I miei buoni da punti fedeltà'; +$_MODULE['<{loyalty}prestashop>loyalty_0eceeb45861f9585dd7a97a3e36f85c6'] = 'Creato'; +$_MODULE['<{loyalty}prestashop>loyalty_689202409e48743b914713f96d93947c'] = 'Valore'; +$_MODULE['<{loyalty}prestashop>loyalty_ca0dbad92a874b2f69b549293387925e'] = 'Codice'; +$_MODULE['<{loyalty}prestashop>loyalty_eb902cf204f3e4dfffeb56d92a9b5c26'] = 'Valido dal'; +$_MODULE['<{loyalty}prestashop>loyalty_b2844b8e17ecaaeae68d018fe9418af0'] = 'Valido fino al'; +$_MODULE['<{loyalty}prestashop>loyalty_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{loyalty}prestashop>loyalty_3ec365dd533ddb7ef3d1c111186ce872'] = 'Dettagli'; +$_MODULE['<{loyalty}prestashop>loyalty_29aa46cc3d2677c7e0f216910df600ff'] = 'Spedizione gratuita'; +$_MODULE['<{loyalty}prestashop>loyalty_cec73b5ce095a59305ad92a0d47495cb'] = 'Per utilizzare'; +$_MODULE['<{loyalty}prestashop>loyalty_019d1ca7d50cc54b995f60d456435e87'] = 'Usato'; +$_MODULE['<{loyalty}prestashop>loyalty_2af3bf4c82c5b33875d532820a959799'] = 'Generato dai seguenti ordini '; +$_MODULE['<{loyalty}prestashop>loyalty_d1228f5476d15142b1358ae4b5fa2454'] = 'Ordine n.'; +$_MODULE['<{loyalty}prestashop>loyalty_d5797f3bbadc278f756576dafc6ab4b8'] = 'punti.'; +$_MODULE['<{loyalty}prestashop>loyalty_a149e85a44aeec9140e92733d9ed694e'] = 'Annullato'; +$_MODULE['<{loyalty}prestashop>loyalty_1f67ea7a0b26e9eacc70523bde28df0c'] = 'di più ...'; +$_MODULE['<{loyalty}prestashop>loyalty_a16cf3ec5200cc519f4fe48e34b1df83'] = 'L\'importo minimo di ordine al fine di utilizzare questi buoni è:'; +$_MODULE['<{loyalty}prestashop>loyalty_8e69341aca5dbf9f55c2e75a2ed5df3c'] = 'Ancora nessun buono.'; +$_MODULE['<{loyalty}prestashop>loyalty_00d56a5e37c19c59d521530fc8e7f337'] = 'Ancora nessuna ricompensa punti.'; +$_MODULE['<{loyalty}prestashop>loyalty_0b3db27bc15f682e92ff250ebb167d4b'] = 'Torna al tuo account'; +$_MODULE['<{loyalty}prestashop>loyalty_8cf04a9734132302f96da8e113e80ce5'] = 'Home'; +$_MODULE['<{loyalty}prestashop>loyalty_30146a132c2aa28808a8411ed74c12ed'] = 'Fidelizzazione della clientela e premi'; +$_MODULE['<{loyalty}prestashop>loyalty_f8763c754ba455aa6e8ddf0e62911eb7'] = 'Prevedi un programma di fidelizzazione per i clienti'; +$_MODULE['<{loyalty}prestashop>loyalty_f0338d5a7bbd642cc188ca69c8a97b12'] = 'Ciò eliminerà tutti i punti fedeltà e la storia dei tuoi clienti, sei sicuro?'; +$_MODULE['<{loyalty}prestashop>loyalty_7307b68f93443d5863f1d3943c546b20'] = 'Ricompensa fedeltà'; +$_MODULE['<{loyalty}prestashop>loyalty_e81b2826b5aebd9c92fb5d090f0cdc9d'] = 'È necessario scegliere almeno una categoria per la creazione di buoni'; +$_MODULE['<{loyalty}prestashop>loyalty_f38f5974cdc23279ffe6d203641a8bdf'] = 'Impostazioni aggiornate.'; +$_MODULE['<{loyalty}prestashop>loyalty_5be9427a9169ad6e9b63b0c9c61575d9'] = 'Programma di fedeltà'; +$_MODULE['<{loyalty}prestashop>loyalty_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{loyalty}prestashop>loyalty_8334a158298fbcf163f4dcb4a387d150'] = 'Rapporto'; +$_MODULE['<{loyalty}prestashop>loyalty_315eae70bcaee168f1654c0ceeeef357'] = '1 punto premio'; +$_MODULE['<{loyalty}prestashop>loyalty_e3ff7eaa9deb31e1e91178a7216135c0'] = '1 punto ='; +$_MODULE['<{loyalty}prestashop>loyalty_46108358594124685e77e7d49f762b30'] = 'per lo sconto'; +$_MODULE['<{loyalty}prestashop>loyalty_98cf9475009d3c6e795ffac5d391cec4'] = 'Dati buono sconto'; +$_MODULE['<{loyalty}prestashop>loyalty_dd98e4d652530674f61201056fdbe9b4'] = 'importo minimo per utilizzare il voucher'; +$_MODULE['<{loyalty}prestashop>loyalty_51ab56dd5b46c7b5c8fdf22651ae0db6'] = 'Dare i punti per i prodotti scontati'; +$_MODULE['<{loyalty}prestashop>loyalty_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{loyalty}prestashop>loyalty_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{loyalty}prestashop>loyalty_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{loyalty}prestashop>loyalty_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{loyalty}prestashop>loyalty_ade45d72ab6ba1ab576d8b9deb0c2438'] = 'I punti vengono assegnati quando l\'ordine è'; +$_MODULE['<{loyalty}prestashop>loyalty_9611a682e61c503c32e2dc58fdbc8ddf'] = 'I punti vengono cancellati quando l\'ordine è'; +$_MODULE['<{loyalty}prestashop>loyalty_2a46cccdea2f18fdfdfacf99a98b758d'] = 'I buoni creati dal sistema di fidelizzazione possono essere utilizzati nelle seguenti categorie:'; +$_MODULE['<{loyalty}prestashop>loyalty_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{loyalty}prestashop>loyalty_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{loyalty}prestashop>loyalty_c2a7db7dec4de1bdb143ccd790f5a62c'] = 'Segna tutte le caselle di categorie in cui buoni fedeltà sono utilizzabili'; +$_MODULE['<{loyalty}prestashop>loyalty_30e793698766edbaaf84a74d4c377f72'] = 'Progressione punti fedeltà '; +$_MODULE['<{loyalty}prestashop>loyalty_4f2a91e15af2631ff9424564b8a45fb2'] = 'Iniziale'; +$_MODULE['<{loyalty}prestashop>loyalty_453e6aa38d87b28ccae545967c53004f'] = 'Non disponibile'; +$_MODULE['<{loyalty}prestashop>loyalty_6366c60fc5b4f4fce0e3dd146494a4f4'] = 'Convertito'; +$_MODULE['<{loyalty}prestashop>loyalty_13148717f8faa9037f37d28971dfc219'] = 'Convalida'; +$_MODULE['<{loyalty}prestashop>loyalty_38fb7d24e0d60a048f540ecb18e13376'] = 'Salva'; +$_MODULE['<{loyalty}prestashop>loyalty_f67fb9d4e53cbac558e2735a7503ce92'] = 'Punti fedeltà'; +$_MODULE['<{loyalty}prestashop>loyalty_0aab81de5c4c87021772015efc184d67'] = 'punti'; +$_MODULE['<{loyalty}prestashop>loyalty_309cd9f5437d1bb06a7fdab1811afe1a'] = 'Il cliente non ha punti'; +$_MODULE['<{loyalty}prestashop>loyalty_aa7f22f84f7be784055a3e7e7d22c519'] = 'Totale (senza spese di spedizione)'; +$_MODULE['<{loyalty}prestashop>loyalty_928666bdf20510dfa5c58393b77f1798'] = 'Valore del buono:'; +$_MODULE['<{loyalty}prestashop>loyalty_a9be824aae4f2381a27b7c699b1e041e'] = 'In attesa di convalida'; +$_MODULE['<{loyalty}prestashop>loyalty_78945de8de090e90045d299651a68a9b'] = 'Disponibile'; +$_MODULE['<{loyalty}prestashop>loyalty_4cb08bf5ad3d3c7b010dde725a078b28'] = 'Già convertito'; +$_MODULE['<{loyalty}prestashop>loyalty_df05c2db84dacb19b599b489bf3963db'] = 'Non disponibile sugli sconti'; +$_MODULE['<{loyalty}prestashop>loyalty_01371a1d58e9234c0b9dbc08cf54fa8b'] = 'Non disponibile sugli sconti'; +$_MODULE['<{loyalty}prestashop>my-account_c540093e64d84440025b2d8201f04336'] = 'I miei punti fedeltà'; +$_MODULE['<{loyalty}prestashop>product_ded9088edfbcc1041c3a642b031c8f72'] = 'Programma fedeltà'; +$_MODULE['<{loyalty}prestashop>product_08ef6b34ab8e7039ef0ee69378f0ac0b'] = 'Con l\'acquisto di questo prodotto è possibile raccogliere fino a'; +$_MODULE['<{loyalty}prestashop>product_2996152bb442bf98c80c515c6055de5f'] = 'Punti fedeltà'; +$_MODULE['<{loyalty}prestashop>product_b40d5c523ee75453134b1449dd9cd13a'] = 'Punto Fedeltà'; +$_MODULE['<{loyalty}prestashop>product_b9cb3a85529dd593c14c838e22976cff'] = 'Il totale del tuo carrello'; +$_MODULE['<{loyalty}prestashop>product_0aab81de5c4c87021772015efc184d67'] = 'punti'; +$_MODULE['<{loyalty}prestashop>product_78ee54aa8f813885fe2fe20d232518b9'] = 'punto'; +$_MODULE['<{loyalty}prestashop>product_443c3e03e194c2a4cdb107808b051615'] = 'che può essere convertito in un buono di'; +$_MODULE['<{loyalty}prestashop>product_054a9c66cc92b7f1bfcacee3b7c7ad54'] = 'Nessun punto fedeltà per questo prodotto, perché c\'è già uno sconto.'; +$_MODULE['<{loyalty}prestashop>product_e94d481804904a48c1a8093e7a069570'] = 'Nessun punto fedeltà per questo prodotto.'; +$_MODULE['<{loyalty}prestashop>shopping-cart_ea2c0ea1a08add3a75273e7f32f05f7a'] = 'fedeltà'; +$_MODULE['<{loyalty}prestashop>shopping-cart_4cd8259257033282f11cc9bbe648dff7'] = 'Con il check-out di questo carrello della spesa è possibile raccogliere fino a'; +$_MODULE['<{loyalty}prestashop>shopping-cart_2996152bb442bf98c80c515c6055de5f'] = 'punti fedeltà'; +$_MODULE['<{loyalty}prestashop>shopping-cart_b40d5c523ee75453134b1449dd9cd13a'] = 'punto fedeltà'; +$_MODULE['<{loyalty}prestashop>shopping-cart_443c3e03e194c2a4cdb107808b051615'] = 'che può essere convertito in un buono di'; +$_MODULE['<{loyalty}prestashop>shopping-cart_8cec799df06a3f5a026b31fcd95e0172'] = 'Aggiungi alcuni prodotti al carrello della spesa di raccogliere dei punti fedeltà.'; + +?> \ No newline at end of file diff --git a/modules/loyalty/logo.gif b/modules/loyalty/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..039f3fa77234f43857ac408692755924cf2520f9 GIT binary patch literal 1016 zcmZ?wbhEHb6krfwc;3liSfaBnkin=_*Sy+rZ#08VqnTre^^qI~_dff}g$!2;8P1e4 zTq|d|R>2T3)BSoC!;MCUnNuWhv@qOhWr$oF&@k65ZgoiV#)zs_B~`1-?#+@&-yZXL zwnFxvgopE0-pyxd*yp}=llGfs44FqFpDxvTvO?tXO1|u4(Vtf^bnI@*Jsw+dJn8-_ z+rpCxuht3|pGthQUbysha@m=b@-wOJC*mv4ru850c)8K4>Rfu&xr{l-eV=Z2t~sA^ z{D97@ttPb>vL5WxslS-rc%h)-Qts6QTCaDSHeb&Fyj$$eF3Y#OEGC}sJbEJZ=K+bY zhxOha4t;+(^urOqPe(oHU7zyxnEi)i!QW0ed^sNY?s&@gla4=5IWE3EYssBiYi=!D zac}PDOUa)vr+vGW_4#ta=gUQ(ujG8clJog$-sh|NU#{kFdc6G0)uQiL3%*`0-~43x zm+Pfpu9xk6ym9N(m0z#de7RBa{d(=!>&;(pRDHc!_w{D|mz!;0?{s{-)A{XA_t(3f z-|lvOyW9QkUhnsZv%Wu^^W)*{?~fP$c)alE(^Ws7ul@Oa^{=;w|BnLNhk)WgLFb~> z#FEq$h4Rdj3<Y;j-v9>1pDc`A4F4H)7=QqjQ5ZN5F#P9y!*Kk>1bK_JJujLZ796gZ zzQOV^P}z-JG@8doq=M0xPtvMtj>N*H2aeT?-Q&n~T*BEQ8pAecNrE$1uX2`?#z}<- zPwd$>r%ljIVPa;O&!o*D=%V4(GTCQS!b+o5zXi613sf8*EpBlZNf3}_nsVGv*1GP) z1dk6Nnx{I}zS|<1{Olz2e5GqICI&zAmg4aEANcU`v!3Y&LK6-x`0U;@*{s||p)~OY fTQi&7x;G9{EzL~r+z~P#EFY>gGVn1oF<1itCjz@v literal 0 HcmV?d00001 diff --git a/modules/loyalty/loyalty-program.php b/modules/loyalty/loyalty-program.php new file mode 100644 index 000000000..553daaddc --- /dev/null +++ b/modules/loyalty/loyalty-program.php @@ -0,0 +1,166 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); + +include_once(dirname(__FILE__).'/LoyaltyModule.php'); +include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + +if (!$cookie->isLogged()) + Tools::redirect('index.php?controller=authentication&back=modules/loyalty/loyalty-program.php'); + +Tools::addCSS(_PS_CSS_DIR_.'jquery.cluetip.css', 'all'); +Tools::addJS(array(_PS_JS_DIR_.'jquery/jquery.dimensions.js',_PS_JS_DIR_.'jquery/jquery.cluetip.js')); + +$customerPoints = (int)(LoyaltyModule::getPointsByCustomer((int)($cookie->id_customer))); + +/* transform point into voucher if needed */ +if (Tools::getValue('transform-points') == 'true' AND $customerPoints > 0) +{ + /* Generate a voucher code */ + $voucherCode = NULL; + do $voucherCode = 'FID'.rand(1000, 100000); + while (Discount::discountExists($voucherCode)); + + /* Voucher creation and affectation to the customer */ + $voucher = new Discount(); + $voucher->name = $voucherCode; + $voucher->id_discount_type = 2; // Discount on order (amount) + $voucher->id_customer = (int)($cookie->id_customer); + $voucher->id_currency = (int)($cookie->id_currency); + $voucher->value = LoyaltyModule::getVoucherValue((int)$customerPoints); + $voucher->quantity = 1; + $voucher->quantity_per_user = 1; + $voucher->cumulable = 1; + $voucher->cumulable_reduction = 1; + + /* If merchandise returns are allowed, the voucher musn't be usable before this max return date */ + $dateFrom = Db::getInstance()->getValue(' + SELECT UNIX_TIMESTAMP(date_add) n + FROM '._DB_PREFIX_.'loyalty + WHERE id_discount = 0 AND id_customer = '.(int)$cookie->id_customer.' + ORDER BY date_add DESC'); + + if (Configuration::get('PS_ORDER_RETURN')) + $dateFrom += 60 * 60 * 24 * (int)Configuration::get('PS_ORDER_RETURN_NB_DAYS'); + + $voucher->date_from = date('Y-m-d H:i:s', $dateFrom); + $voucher->date_to = date('Y-m-d H:i:s', $dateFrom + 31536000); // + 1 year + + $voucher->minimal = (float)Configuration::get('PS_LOYALTY_MINIMAL'); + $voucher->active = 1; + + $categories = Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY'); + if ($categories != '' AND $categories != 0) + $categories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); + else + die(Tools::displayError()); + + $languages = Language::getLanguages(true); + $default_text = Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)(Configuration::get('PS_LANG_DEFAULT'))); + + foreach ($languages AS $language) + { + $text = Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)($language['id_lang'])); + $voucher->description[(int)($language['id_lang'])] = $text ? strval($text) : strval($default_text); + } + + if (is_array($categories) AND sizeof($categories)) + $voucher->add(true, false, $categories); + else + $voucher->add(); + + /* Register order(s) which contributed to create this voucher */ + LoyaltyModule::registerDiscount($voucher); + + Tools::redirect('modules/loyalty/loyalty-program.php'); +} + +include(dirname(__FILE__).'/../../header.php'); + +$orders = LoyaltyModule::getAllByIdCustomer((int)($cookie->id_customer), (int)($cookie->id_lang)); +$displayorders = LoyaltyModule::getAllByIdCustomer((int)($cookie->id_customer), (int)($cookie->id_lang), false, true, ((int)(Tools::getValue('n')) > 0 ? (int)(Tools::getValue('n')) : 10), ((int)(Tools::getValue('p')) > 0 ? (int)(Tools::getValue('p')) : 1)); +$smarty->assign(array( + 'orders' => $orders, + 'displayorders' => $displayorders, + 'pagination_link' => __PS_BASE_URI__.'modules/loyalty/loyalty-program.php', + 'totalPoints' => (int)$customerPoints, + 'voucher' => LoyaltyModule::getVoucherValue($customerPoints, (int)($cookie->id_currency)), + 'validation_id' => LoyaltyStateModule::getValidationId(), + 'transformation_allowed' => $customerPoints > 0, + 'page' => ((int)(Tools::getValue('p')) > 0 ? (int)(Tools::getValue('p')) : 1), + 'nbpagination' => ((int)(Tools::getValue('n') > 0) ? (int)(Tools::getValue('n')) : 10), + 'nArray' => array(10, 20, 50), + 'max_page' => floor(sizeof($orders) / ((int)(Tools::getValue('n') > 0) ? (int)(Tools::getValue('n')) : 10)) +)); + +/* Discounts */ +$nbDiscounts = 0; +$discounts = array(); +if ($ids_discount = LoyaltyModule::getDiscountByIdCustomer((int)($cookie->id_customer))) +{ + $nbDiscounts = count($ids_discount); + foreach ($ids_discount AS $key => $discount) + { + $discounts[$key] = new Discount((int)$discount['id_discount'], (int)($cookie->id_lang)); + $discounts[$key]->orders = LoyaltyModule::getOrdersByIdDiscount((int)$discount['id_discount']); + } +} + +$allCategories = Category::getSimpleCategories((int)($cookie->id_lang)); +$voucherCategories = Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY'); +if ($voucherCategories != '' AND $voucherCategories != 0) + $voucherCategories = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); +else + die(Tools::displayError()); + +if (sizeof($voucherCategories) == sizeof($allCategories)) + $categoriesNames = null; +else +{ + $categoriesNames = array(); + foreach ($allCategories AS $k => $allCategory) + if (in_array($allCategory['id_category'], $voucherCategories)) + $categoriesNames[$allCategory['id_category']] = trim($allCategory['name']); + if (!empty($categoriesNames)) + $categoriesNames = Tools::truncate(implode(', ', $categoriesNames), 100).'.'; + else + $categoriesNames = null; +} +$smarty->assign(array( + 'nbDiscounts' => (int)$nbDiscounts, + 'discounts' => $discounts, + 'minimalLoyalty' => (float)Configuration::get('PS_LOYALTY_MINIMAL'), + 'categories' => $categoriesNames)); + +echo Module::display(dirname(__FILE__).'/loyalty.php', 'loyalty.tpl'); + +include(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/loyalty/loyalty.gif b/modules/loyalty/loyalty.gif new file mode 100644 index 0000000000000000000000000000000000000000..039f3fa77234f43857ac408692755924cf2520f9 GIT binary patch literal 1016 zcmZ?wbhEHb6krfwc;3liSfaBnkin=_*Sy+rZ#08VqnTre^^qI~_dff}g$!2;8P1e4 zTq|d|R>2T3)BSoC!;MCUnNuWhv@qOhWr$oF&@k65ZgoiV#)zs_B~`1-?#+@&-yZXL zwnFxvgopE0-pyxd*yp}=llGfs44FqFpDxvTvO?tXO1|u4(Vtf^bnI@*Jsw+dJn8-_ z+rpCxuht3|pGthQUbysha@m=b@-wOJC*mv4ru850c)8K4>Rfu&xr{l-eV=Z2t~sA^ z{D97@ttPb>vL5WxslS-rc%h)-Qts6QTCaDSHeb&Fyj$$eF3Y#OEGC}sJbEJZ=K+bY zhxOha4t;+(^urOqPe(oHU7zyxnEi)i!QW0ed^sNY?s&@gla4=5IWE3EYssBiYi=!D zac}PDOUa)vr+vGW_4#ta=gUQ(ujG8clJog$-sh|NU#{kFdc6G0)uQiL3%*`0-~43x zm+Pfpu9xk6ym9N(m0z#de7RBa{d(=!>&;(pRDHc!_w{D|mz!;0?{s{-)A{XA_t(3f z-|lvOyW9QkUhnsZv%Wu^^W)*{?~fP$c)alE(^Ws7ul@Oa^{=;w|BnLNhk)WgLFb~> z#FEq$h4Rdj3<Y;j-v9>1pDc`A4F4H)7=QqjQ5ZN5F#P9y!*Kk>1bK_JJujLZ796gZ zzQOV^P}z-JG@8doq=M0xPtvMtj>N*H2aeT?-Q&n~T*BEQ8pAecNrE$1uX2`?#z}<- zPwd$>r%ljIVPa;O&!o*D=%V4(GTCQS!b+o5zXi613sf8*EpBlZNf3}_nsVGv*1GP) z1dk6Nnx{I}zS|<1{Olz2e5GqICI&zAmg4aEANcU`v!3Y&LK6-x`0U;@*{s||p)~OY fTQi&7x;G9{EzL~r+z~P#EFY>gGVn1oF<1itCjz@v literal 0 HcmV?d00001 diff --git a/modules/loyalty/loyalty.php b/modules/loyalty/loyalty.php new file mode 100644 index 000000000..777021120 --- /dev/null +++ b/modules/loyalty/loyalty.php @@ -0,0 +1,674 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +/* +* TODO: +* +* - Bad behaviour when an order is cancelled after an order return +* - We shouldn't use $cookie->id_currency in all situations +*/ + +class Loyalty extends Module +{ + function __construct() + { + $this->name = 'loyalty'; + $this->tab = 'pricing_promotion'; + $this->version = '1.8'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Customer loyalty and rewards'); + $this->description = $this->l('Provide a loyalty program to your customers.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete all loyalty points and customer history?'); + } + + private function instanceDefaultStates() + { + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + + /* Recover default loyalty status save at module installation */ + $this->loyaltyStateDefault = new LoyaltyStateModule(LoyaltyStateModule::getDefaultId()); + $this->loyaltyStateValidation = new LoyaltyStateModule(LoyaltyStateModule::getValidationId()); + $this->loyaltyStateCancel = new LoyaltyStateModule(LoyaltyStateModule::getCancelId()); + $this->loyaltyStateConvert = new LoyaltyStateModule(LoyaltyStateModule::getConvertId()); + $this->loyaltyStateNoneAward = new LoyaltyStateModule(LoyaltyStateModule::getNoneAwardId()); + } + + function install() + { + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + + if (!parent::install() OR !$this->installDB() OR !$this->registerHook('extraRight') OR !$this->registerHook('updateOrderStatus') + OR !$this->registerHook('newOrder') OR !$this->registerHook('adminCustomers') OR !$this->registerHook('shoppingCart') + OR !$this->registerHook('orderReturn') OR !$this->registerHook('cancelProduct') OR !$this->registerHook('customerAccount') + OR !Configuration::updateValue('PS_LOYALTY_POINT_VALUE', '0.20') OR !Configuration::updateValue('PS_LOYALTY_MINIMAL', 0) + OR !Configuration::updateValue('PS_LOYALTY_POINT_RATE', '10') OR !Configuration::updateValue('PS_LOYALTY_NONE_AWARD', '1')) + return false; + + $defaultTranslations = array('en' => 'Loyalty reward', 'fr' => 'Récompense fidélité'); + $conf = array((int)Configuration::get('PS_LANG_DEFAULT') => $this->l('Loyalty reward')); + foreach (Language::getLanguages() AS $language) + if (isset($defaultTranslations[$language['iso_code']])) + $conf[(int)$language['id_lang']] = $defaultTranslations[$language['iso_code']]; + Configuration::updateValue('PS_LOYALTY_VOUCHER_DETAILS', $conf); + + $category_config = ''; + $categories = Category::getSimpleCategories((int)(Configuration::get('PS_LANG_DEFAULT'))); + foreach ($categories AS $category) + $category_config .= (int)$category['id_category'].','; + $category_config = rtrim($category_config, ','); + Configuration::updateValue('PS_LOYALTY_VOUCHER_CATEGORY', $category_config); + + /* This hook is optional */ + $this->registerHook('myAccountBlock'); + if (!LoyaltyStateModule::insertDefaultData()) + return false; + return true; + } + + function installDB() + { + Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'loyalty` ( + `id_loyalty` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_loyalty_state` INT UNSIGNED NOT NULL DEFAULT 1, + `id_customer` INT UNSIGNED NOT NULL, + `id_order` INT UNSIGNED DEFAULT NULL, + `id_discount` INT UNSIGNED DEFAULT NULL, + `points` INT NOT NULL DEFAULT 0, + `date_add` DATETIME NOT NULL, + `date_upd` DATETIME NOT NULL, + PRIMARY KEY (`id_loyalty`), + INDEX index_loyalty_loyalty_state (`id_loyalty_state`), + INDEX index_loyalty_order (`id_order`), + INDEX index_loyalty_discount (`id_discount`), + INDEX index_loyalty_customer (`id_customer`) + ) DEFAULT CHARSET=utf8 ;'); + + Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'loyalty_history` ( + `id_loyalty_history` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_loyalty` INT UNSIGNED DEFAULT NULL, + `id_loyalty_state` INT UNSIGNED NOT NULL DEFAULT 1, + `points` INT NOT NULL DEFAULT 0, + `date_add` DATETIME NOT NULL, + PRIMARY KEY (`id_loyalty_history`), + INDEX `index_loyalty_history_loyalty` (`id_loyalty`), + INDEX `index_loyalty_history_loyalty_state` (`id_loyalty_state`) + ) DEFAULT CHARSET=utf8 ;'); + + Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'loyalty_state` ( + `id_loyalty_state` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_order_state` INT UNSIGNED DEFAULT NULL, + PRIMARY KEY (`id_loyalty_state`), + INDEX index_loyalty_state_order_state (`id_order_state`) + ) DEFAULT CHARSET=utf8 ;'); + + Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'loyalty_state_lang` ( + `id_loyalty_state` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_lang` INT UNSIGNED NOT NULL, + `name` varchar(64) NOT NULL, + UNIQUE KEY `index_unique_loyalty_state_lang` (`id_loyalty_state`,`id_lang`) + ) DEFAULT CHARSET=utf8 ;'); + + return true; + } + + function uninstall() + { + if (!parent::uninstall() OR !$this->uninstallDB() OR !Configuration::deleteByName('PS_LOYALTY_POINT_VALUE') OR !Configuration::deleteByName('PS_LOYALTY_POINT_RATE') + OR !Configuration::deleteByName('PS_LOYALTY_NONE_AWARD') OR !Configuration::deleteByName('PS_LOYALTY_MINIMAL') OR !Configuration::deleteByName('PS_LOYALTY_VOUCHER_CATEGORY') + OR !Configuration::deleteByName('PS_LOYALTY_VOUCHER_DETAILS')) + return false; + return true; + } + + function uninstallDB() + { + Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'loyalty`;'); + Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'loyalty_state`;'); + Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'loyalty_state_lang`;'); + Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'loyalty_history`;'); + + return true; + } + + private function _postProcess() + { + if (Tools::isSubmit('submitLoyalty')) + { + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(); + + $this->_errors = array(); + if (!is_array(Tools::getValue('categoryBox')) OR !sizeof(Tools::getValue('categoryBox'))) + $this->_errors[] = $this->l('You must choose at least one category for voucher\'s action'); + if (!sizeof($this->_errors)) + { + Configuration::updateValue('PS_LOYALTY_VOUCHER_CATEGORY', $this->voucherCategories(Tools::getValue('categoryBox'))); + Configuration::updateValue('PS_LOYALTY_POINT_VALUE', (float)(Tools::getValue('point_value'))); + Configuration::updateValue('PS_LOYALTY_POINT_RATE', (float)(Tools::getValue('point_rate'))); + Configuration::updateValue('PS_LOYALTY_NONE_AWARD', (int)(Tools::getValue('PS_LOYALTY_NONE_AWARD'))); + Configuration::updateValue('PS_LOYALTY_MINIMAL', (float)(Tools::getValue('minimal'))); + + $this->loyaltyStateValidation->id_order_state = (int)(Tools::getValue('id_order_state_validation')); + $this->loyaltyStateCancel->id_order_state = (int)(Tools::getValue('id_order_state_cancel')); + + $arrayVoucherDetails = array(); + foreach ($languages AS $language) + { + $arrayVoucherDetails[(int)($language['id_lang'])] = Tools::getValue('voucher_details_'.(int)($language['id_lang'])); + $this->loyaltyStateDefault->name[(int)($language['id_lang'])] = Tools::getValue('default_loyalty_state_'.(int)($language['id_lang'])); + $this->loyaltyStateValidation->name[(int)($language['id_lang'])] = Tools::getValue('validation_loyalty_state_'.(int)($language['id_lang'])); + $this->loyaltyStateCancel->name[(int)($language['id_lang'])] = Tools::getValue('cancel_loyalty_state_'.(int)($language['id_lang'])); + $this->loyaltyStateConvert->name[(int)($language['id_lang'])] = Tools::getValue('convert_loyalty_state_'.(int)($language['id_lang'])); + $this->loyaltyStateNoneAward->name[(int)($language['id_lang'])] = Tools::getValue('none_award_loyalty_state_'.(int)($language['id_lang'])); + } + if (empty($arrayVoucherDetails[$defaultLanguage])) + $arrayVoucherDetails[$defaultLanguage] = ' '; + Configuration::updateValue('PS_LOYALTY_VOUCHER_DETAILS', $arrayVoucherDetails); + + if (empty($this->loyaltyStateDefault->name[$defaultLanguage])) + $this->loyaltyStateDefault->name[$defaultLanguage] = ' '; + $this->loyaltyStateDefault->save(); + + if (empty($this->loyaltyStateValidation->name[$defaultLanguage])) + $this->loyaltyStateValidation->name[$defaultLanguage] = ' '; + $this->loyaltyStateValidation->save(); + + if (empty($this->loyaltyStateCancel->name[$defaultLanguage])) + $this->loyaltyStateCancel->name[$defaultLanguage] = ' '; + $this->loyaltyStateCancel->save(); + + if (empty($this->loyaltyStateConvert->name[$defaultLanguage])) + $this->loyaltyStateConvert->name[$defaultLanguage] = ' '; + $this->loyaltyStateConvert->save(); + + if (empty($this->loyaltyStateNoneAward->name[$defaultLanguage])) + $this->loyaltyStateNoneAward->name[$defaultLanguage] = ' '; + $this->loyaltyStateNoneAward->save(); + + echo $this->displayConfirmation($this->l('Settings updated.')); + } + else + { + $errors = ''; + foreach ($this->_errors AS $error) + $errors .= $error.'<br />'; + echo $this->displayError($errors); + } + } + } + + private function voucherCategories($categories) + { + $cat = ''; + if ($categories) + foreach ($categories AS $category) + $cat .= $category.','; + return rtrim($cat, ','); + } + + public function getContent() + { + global $cookie; + + $this->instanceDefaultStates(); + $this->_postProcess(); + + $categories = Category::getCategories((int)($cookie->id_lang)); + $order_states = OrderState::getOrderStates((int)$cookie->id_lang); + $currency = new Currency((int)(Configuration::get('PS_CURRENCY_DEFAULT'))); + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(false); + $languageIds = 'voucher_details¤default_loyalty_state¤none_award_loyalty_state¤convert_loyalty_state¤validation_loyalty_state¤cancel_loyalty_state'; + + $html = ' + <script type="text/javascript"> + id_language = Number('.$defaultLanguage.'); + </script> + <h2>'.$this->l('Loyalty Program').'</h2> + <form action="'.$_SERVER['REQUEST_URI'].'" method="post"> + <fieldset> + <legend>'.$this->l('Settings').'</legend> + + <label>'.$this->l('Ratio').'</label> + <div class="margin-form"> + <input type="text" size="2" id="point_rate" name="point_rate" value="'.(float)(Configuration::get('PS_LOYALTY_POINT_RATE')).'" /> '.$currency->sign.' + <label for="point_rate" class="t"> = '.$this->l('1 reward point').'.</label> + <br /> + <label for="point_value" class="t">'.$this->l('1 point = ').'</label> + <input type="text" size="2" name="point_value" id="point_value" value="'.(float)(Configuration::get('PS_LOYALTY_POINT_VALUE')).'" /> '.$currency->sign.' + <label for="point_value" class="t">'.$this->l('for the discount').'.</label> + </div> + <div class="clear"></div> + <label>'.$this->l('Voucher details').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $html .= ' + <div id="voucher_details_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input size="33" type="text" name="voucher_details_'.$language['id_lang'].'" value="'.Configuration::get('PS_LOYALTY_VOUCHER_DETAILS', (int)($language['id_lang'])).'" /> + </div>'; + $html .= $this->displayFlags($languages, $defaultLanguage, $languageIds, 'voucher_details', true); + $html .= ' </div> + <div class="clear" style="margin-top: 20px"></div> + <label>'.$this->l('Minimum amount in which the voucher can be used').'</label> + <div class="margin-form"> + <input type="text" size="2" name="minimal" value="'.(float)(Configuration::get('PS_LOYALTY_MINIMAL')).'" /> '.$currency->sign.' + </div> + <div class="clear" style="margin-top: 20px"></div> + <label>'.$this->l('Give points on discounted products').' </label> + <div class="margin-form"> + <input type="radio" name="PS_LOYALTY_NONE_AWARD" id="PS_LOYALTY_NONE_AWARD_on" value="1" '.(Configuration::get('PS_LOYALTY_NONE_AWARD') ? 'checked="checked" ' : '').'/> + <label class="t" for="PS_LOYALTY_NONE_AWARD_on"><img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Yes').'" /></label> + <input type="radio" name="PS_LOYALTY_NONE_AWARD" id="PS_LOYALTY_NONE_AWARD_off" value="0" '.(!Configuration::get('PS_LOYALTY_NONE_AWARD') ? 'checked="checked" ' : '').'/> + <label class="t" for="PS_LOYALTY_NONE_AWARD_off"><img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('No').'" /></label> + </div> + <div class="clear"></div> + <label>'.$this->l('Points are awarded when the order is').'</label> + <div class="margin-form" style="margin-top:10px"> + <select id="id_order_state_validation" name="id_order_state_validation">'; + foreach ($order_states AS $order_state) + { + $html .= '<option value="' . $order_state['id_order_state'] . '" style="background-color:' . $order_state['color'] . ';"'; + if ((int)($this->loyaltyStateValidation->id_order_state) == $order_state['id_order_state'] ) + $html .= ' selected="selected"'; + $html .= '>' . $order_state['name'] . '</option>'; + } + $html .= '</select> + </div> + <div class="clear"></div> + <label>'.$this->l('Points are cancelled when the order is').'</label> + <div class="margin-form" style="margin-top:10px"> + <select id="id_order_state_cancel" name="id_order_state_cancel">'; + foreach ($order_states AS $order_state) + { + $html .= '<option value="' . $order_state['id_order_state'] . '" style="background-color:' . $order_state['color'] . ';"'; + if ((int)($this->loyaltyStateCancel->id_order_state) == $order_state['id_order_state'] ) + $html .= ' selected="selected"'; + $html .= '>' . $order_state['name'] . '</option>'; + } + $html .= '</select> + </div> + <div class="clear"></div> + <label>'.$this->l('Vouchers created by the loyalty system can be used in the following categories :').'</label>'; + + $html .= '<table cellspacing="0" cellpadding="0" class="table"> + <tr> + <th><input type="checkbox" name="checkme" class="noborder" onclick="checkDelBoxes(this.form, \'categoryBox[]\', this.checked)" /></th> + <th>'.$this->l('ID').'</th> + <th style="width: 400px">'.$this->l('Name').'</th> + </tr>'; + $index = explode(',', Configuration::get('PS_LOYALTY_VOUCHER_CATEGORY')); + $indexedCategories = isset($_POST['categoryBox']) ? $_POST['categoryBox'] : array(); + foreach ($indexedCategories AS $k => $row) + $index[] = (int)$row['id_category']; + + $html .= $this->recurseCategoryForInclude((int)(Tools::getValue($this->identifier)), $index, $categories, $categories[0][1], 1, NULL); + $html .= ' </table> + <p style="padding-left:200px;">'.$this->l('Mark the box(es) of categories in which loyalty vouchers are usable.').'</p> + <div class="clear"></div> + <h3 style="margin-top:20px">'.$this->l('Loyalty points progression').'</h3> + <label>'.$this->l('Initial').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $html .= ' + <div id="default_loyalty_state_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input size="33" type="text" name="default_loyalty_state_'.$language['id_lang'].'" value="'.(isset($this->loyaltyStateDefault->name[(int)($language['id_lang'])]) ? $this->loyaltyStateDefault->name[(int)($language['id_lang'])] : $this->loyaltyStateDefault->name[(int)$defaultLanguage]).'" /> + </div>'; + $html .= $this->displayFlags($languages, $defaultLanguage, $languageIds, 'default_loyalty_state', true); + $html .= ' </div> + <div class="clear"></div> + <label>'.$this->l('Unavailable').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $html .= ' + <div id="none_award_loyalty_state_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input size="33" type="text" name="none_award_loyalty_state_'.$language['id_lang'].'" value="'.(isset($this->loyaltyStateNoneAward->name[(int)($language['id_lang'])]) ? $this->loyaltyStateNoneAward->name[(int)($language['id_lang'])] : $this->loyaltyStateNoneAward->name[(int)$defaultLanguage]).'" /> + </div>'; + $html .= $this->displayFlags($languages, $defaultLanguage, $languageIds, 'none_award_loyalty_state', true); + $html .= ' </div> + <div class="clear"></div> + <label>'.$this->l('Converted').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $html .= ' + <div id="convert_loyalty_state_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input size="33" type="text" name="convert_loyalty_state_'.$language['id_lang'].'" value="'.(isset($this->loyaltyStateConvert->name[(int)($language['id_lang'])]) ? $this->loyaltyStateConvert->name[(int)($language['id_lang'])] : $this->loyaltyStateConvert->name[(int)$defaultLanguage]).'" /> + </div>'; + $html .= $this->displayFlags($languages, $defaultLanguage, $languageIds, 'convert_loyalty_state', true); + $html .= ' </div> + <div class="clear"></div> + <label>'.$this->l('Validation').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $html .= ' + <div id="validation_loyalty_state_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input size="33" type="text" name="validation_loyalty_state_'.$language['id_lang'].'" value="'.(isset($this->loyaltyStateValidation->name[(int)($language['id_lang'])]) ? $this->loyaltyStateValidation->name[(int)($language['id_lang'])] : $this->loyaltyStateValidation->name[(int)$defaultLanguage]).'" /> + </div>'; + $html .= $this->displayFlags($languages, $defaultLanguage, $languageIds, 'validation_loyalty_state', true); + $html .= ' </div> + <div class="clear"></div> + <label>'.$this->l('Cancelled').'</label> + <div class="margin-form">'; + foreach ($languages as $language) + $html .= ' + <div id="cancel_loyalty_state_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;"> + <input size="33" type="text" name="cancel_loyalty_state_'.$language['id_lang'].'" value="'.(isset($this->loyaltyStateCancel->name[(int)($language['id_lang'])]) ? $this->loyaltyStateCancel->name[(int)($language['id_lang'])] : $this->loyaltyStateCancel->name[(int)$defaultLanguage]).'" /> + </div>'; + $html .= $this->displayFlags($languages, $defaultLanguage, $languageIds, 'cancel_loyalty_state', true); + $html .= ' </div> + <div class="clear center"> + <input type="submit" style="margin-top:20px" name="submitLoyalty" id="submitLoyalty" value="'.$this->l(' Save ').'" class="button" /> + </div> + </fieldset> + </form>'; + + return $html; + } + + public static function recurseCategoryForInclude($id_obj, $indexedCategories, $categories, $current, $id_category = 1, $id_category_default = NULL, $has_suite = array()) + { + global $done; + static $irow; + $html = ''; + + if (!isset($done[$current['infos']['id_parent']])) + $done[$current['infos']['id_parent']] = 0; + $done[$current['infos']['id_parent']] += 1; + + $todo = sizeof($categories[$current['infos']['id_parent']]); + $doneC = $done[$current['infos']['id_parent']]; + + $level = $current['infos']['level_depth'] + 1; + + $html .= ' + <tr class="'.($irow++ % 2 ? 'alt_row' : '').'"> + <td> + <input type="checkbox" name="categoryBox[]" class="categoryBox'.($id_category_default == $id_category ? ' id_category_default' : '').'" id="categoryBox_'.$id_category.'" value="'.$id_category.'"'.((in_array($id_category, $indexedCategories) OR ((int)(Tools::getValue('id_category')) == $id_category AND !(int)($id_obj))) ? ' checked="checked"' : '').' /> + </td> + <td> + '.$id_category.' + </td> + <td>'; + for ($i = 2; $i < $level; $i++) + $html .= '<img src="../img/admin/lvl_'.$has_suite[$i - 2].'.gif" alt="" style="vertical-align: middle;"/>'; + $html .= '<img src="../img/admin/'.($level == 1 ? 'lv1.gif' : 'lv2_'.($todo == $doneC ? 'f' : 'b').'.gif').'" alt="" style="vertical-align: middle;"/> &nbsp; + <label for="categoryBox_'.$id_category.'" class="t">'.stripslashes($current['infos']['name']).'</label></td> + </tr>'; + + if ($level > 1) + $has_suite[] = ($todo == $doneC ? 0 : 1); + if (isset($categories[$id_category])) + foreach ($categories[$id_category] AS $key => $row) + if ($key != 'infos') + $html .= self::recurseCategoryForInclude($id_obj, $indexedCategories, $categories, $categories[$id_category][$key], $key, $id_category_default, $has_suite); + return $html; + } + + /* Hook display on product detail */ + public function hookExtraRight($params) + { + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + + global $smarty; + + $product = new Product((int)Tools::getValue('id_product')); + if (Validate::isLoadedObject($product)) + { + if (Validate::isLoadedObject($params['cart'])) + { + $pointsBefore = (int)(LoyaltyModule::getCartNbPoints($params['cart'])); + $pointsAfter = (int)(LoyaltyModule::getCartNbPoints($params['cart'], $product)); + $points = (int)($pointsAfter - $pointsBefore); + } + else + { + if (!(int)(Configuration::get('PS_LOYALTY_NONE_AWARD')) AND Product::isDiscounted((int)$product->id)) + { + $points = 0; + $smarty->assign('no_pts_discounted', 1); + } + else + $points = (int)(LoyaltyModule::getNbPointsByPrice($product->getPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? false : true, (int)($product->getIdProductAttributeMostExpensive())))); + $pointsAfter = $points; + $pointsBefore = 0; + } + $smarty->assign(array( + 'points' => (int)($points), + 'total_points' => (int)($pointsAfter), + 'point_rate' => Configuration::get('PS_LOYALTY_POINT_RATE'), + 'point_value' => Configuration::get('PS_LOYALTY_POINT_VALUE'), + 'points_in_cart' => (int)$pointsBefore, + 'voucher' => LoyaltyModule::getVoucherValue((int)$pointsAfter))); + + return $this->display(__FILE__, 'product.tpl'); + } + + return false; + } + + /* Hook display on customer account page */ + public function hookCustomerAccount($params) + { + return $this->display(__FILE__, 'my-account.tpl'); + } + + public function hookMyAccountBlock($params) + { + return $this->hookCustomerAccount($params); + } + + /* Catch product returns and substract loyalty points */ + public function hookOrderReturn($params) + { + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + + $totalPrice = 0; + $details = OrderReturn::getOrdersReturnDetail((int)($params['orderReturn']->id)); + foreach ($details AS $detail) + { + $price_wt = Db::getInstance()->getValue(' + SELECT product_price * (1 + (tax_rate / 100)) price + FROM '._DB_PREFIX_.'order_detail od + WHERE id_order_detail = '.(int)($detail['id_order_detail'])); + + $totalPrice += number_format($price_wt, 2, '.', '') * $detail['product_quantity']; + } + + $loyaltyNew = new LoyaltyModule(); + $loyaltyNew->points = (int)(-1 * LoyaltyModule::getNbPointsByPrice($totalPrice)); + $loyaltyNew->id_loyalty_state = (int)LoyaltyStateModule::getCancelId(); + $loyaltyNew->id_order = (int)$params['orderReturn']->id_order; + $loyaltyNew->id_customer = (int)$params['orderReturn']->id_customer; + $loyaltyNew->save(); + } + + /* Hook display on shopping cart summary */ + public function hookShoppingCart($params) + { + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + + global $smarty; + + if (Validate::isLoadedObject($params['cart'])) + { + $points = LoyaltyModule::getCartNbPoints($params['cart']); + $smarty->assign(array('points' => (int)$points, 'voucher' => LoyaltyModule::getVoucherValue((int)$points))); + } + + return $this->display(__FILE__, 'shopping-cart.tpl'); + } + + /* Hook called when a new order is created */ + public function hookNewOrder($params) + { + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + + if (!Validate::isLoadedObject($params['customer']) OR !Validate::isLoadedObject($params['order'])) + die(Tools::displayError('Missing parameters')); + $loyalty = new LoyaltyModule(); + $loyalty->id_customer = (int)$params['customer']->id; + $loyalty->id_order = (int)$params['order']->id; + $loyalty->points = LoyaltyModule::getOrderNbPoints($params['order']); + if ((int)(Configuration::get('PS_LOYALTY_NONE_AWARD')) AND (int)($loyalty->points) == 0) + $loyalty->id_loyalty_state = LoyaltyStateModule::getNoneAwardId(); + else + $loyalty->id_loyalty_state = LoyaltyStateModule::getDefaultId(); + return $loyalty->save(); + } + + /* Hook called when an order change its status */ + public function hookUpdateOrderStatus($params) + { + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + + if (!Validate::isLoadedObject($params['newOrderStatus'])) + die(Tools::displayError('Missing parameters')); + $newOrder = $params['newOrderStatus']; + $order = new Order((int)($params['id_order'])); + if ($order AND !Validate::isLoadedObject($order)) + die(Tools::displayError('Incorrect object Order.')); + $this->instanceDefaultStates(); + + if ($newOrder->id == $this->loyaltyStateValidation->id_order_state OR $newOrder->id == $this->loyaltyStateCancel->id_order_state) + { + if (!Validate::isLoadedObject($loyalty = new LoyaltyModule(LoyaltyModule::getByOrderId($order->id)))) + return false; + if ((int)(Configuration::get('PS_LOYALTY_NONE_AWARD')) AND $loyalty->id_loyalty_state == LoyaltyStateModule::getNoneAwardId()) + return true; + + if ($newOrder->id == $this->loyaltyStateValidation->id_order_state) + { + $loyalty->id_loyalty_state = LoyaltyStateModule::getValidationId(); + if ((int)($loyalty->points) < 0) + $loyalty->points = abs((int)($loyalty->points)); + } + elseif ($newOrder->id == $this->loyaltyStateCancel->id_order_state) + { + $loyalty->id_loyalty_state = LoyaltyStateModule::getCancelId(); + $loyalty->points = 0; + } + return $loyalty->save(); + } + return true; + } + + /* Hook display in tab AdminCustomers on BO */ + public function hookAdminCustomers($params) + { + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + + $customer = new Customer((int)$params['id_customer']); + if ($customer AND !Validate::isLoadedObject($customer)) + die(Tools::displayError('Incorrect object Customer.')); + + $details = LoyaltyModule::getAllByIdCustomer((int)$params['id_customer'], (int)$params['cookie']->id_lang); + $points = (int)LoyaltyModule::getPointsByCustomer((int)$params['id_customer']); + + $html = ' + <br /><h2>'.$this->l('Loyalty points').' ('.(int)$points.' '.$this->l('points').')</h2>'; + + if (!$points) + return $html.' '.$this->l('This customer has no points'); + + $html .= ' + <table cellspacing="0" cellpadding="0" class="table"> + <tr style="background-color:#F5E9CF; padding: 0.3em 0.1em;"> + <th>'.$this->l('Order').'</th> + <th>'.$this->l('Date').'</th> + <th>'.$this->l('Total (without shipping)').'</th> + <th>'.$this->l('Points').'</th> + <th>'.$this->l('Points Status').'</th> + </tr>'; + foreach ($details AS $key => $loyalty) + { + $html.= ' + <tr style="background-color: '.($key % 2 != 0 ? '#FFF6CF' : '#FFFFFF').';"> + <td>'.((int)$loyalty['id'] > 0 ? '<a style="color: #268CCD; font-weight: bold; text-decoration: underline;" href="index.php?tab=AdminOrders&id_order='.$loyalty['id'].'&vieworder&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($params['cookie']->id_employee)).'">'.$this->l('#').sprintf('%06d', $loyalty['id']).'</a>' : '--').'</td> + <td>'.Tools::displayDate($loyalty['date'], (int)($params['cookie']->id_lang)).'</td> + <td>'.((int)$loyalty['id'] > 0 ? $loyalty['total_without_shipping'] : '--').'</td> + <td>'.(int)$loyalty['points'].'</td> + <td>'.$loyalty['state'].'</td> + </tr>'; + } + $html.= ' + <tr> + <td>&nbsp;</td> + <td colspan="2" class="bold" style="text-align: right;">'.$this->l('Total points available:').'</td> + <td>'.$points.'</td> + <td>'.$this->l('Voucher value:').' '.Tools::displayPrice(LoyaltyModule::getVoucherValue((int)$points, (int)Configuration::get('PS_CURRENCY_DEFAULT')), new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT'))).'</td> + </tr> + </table>'; + + return $html; + } + + public function hookCancelProduct($params) + { + include_once(dirname(__FILE__).'/LoyaltyStateModule.php'); + include_once(dirname(__FILE__).'/LoyaltyModule.php'); + + if (!Validate::isLoadedObject($params['order']) OR !Validate::isLoadedObject($orderDetail = new OrderDetail((int)($params['id_order_detail']))) + OR !Validate::isLoadedObject($loyalty = new LoyaltyModule((int)(LoyaltyModule::getByOrderId((int)($params['order']->id)))))) + return false; + + $loyaltyNew = new LoyaltyModule(); + $loyaltyNew->points = -1 * LoyaltyModule::getNbPointsByPrice(number_format($orderDetail->product_price * (1 + $orderDetail->tax_rate / 100), 2, '.', '')) * $orderDetail->product_quantity; + $loyaltyNew->id_loyalty_state = (int)LoyaltyStateModule::getCancelId(); + $loyaltyNew->id_order = (int)$params['order']->id; + $loyaltyNew->id_customer = (int)$loyalty->id_customer; + $loyaltyNew->add(); + + return; + } + + public function getL($key) + { + $translations = array( + 'Awaiting validation' => $this->l('Awaiting validation'), + 'Available' => $this->l('Available'), + 'Cancelled' => $this->l('Cancelled'), + 'Already converted' => $this->l('Already converted'), + 'Unavailable on discounts' => $this->l('Unavailable on discounts'), + 'Not available on discounts.' => $this->l('Not available on discounts.')); + + return (array_key_exists($key, $translations)) ? $translations[$key] : $key; + } +} diff --git a/modules/loyalty/loyalty.tpl b/modules/loyalty/loyalty.tpl new file mode 100644 index 000000000..b6352f85f --- /dev/null +++ b/modules/loyalty/loyalty.tpl @@ -0,0 +1,205 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<script type="text/javascript"> +//<![CDATA[ + var baseDir = '{$base_dir_ssl}'; +//]]> +</script> + +{capture name=path}<a href="{$link->getPageLink('my-account', true)}">{l s='My account' mod='loyalty'}</a><span class="navigation-pipe">{$navigationPipe}</span>{l s='My loyalty points' mod='loyalty'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +<h2>{l s='My loyalty points' mod='loyalty'}</h2> + +{if $orders} +<div class="block-center" id="block-history"> + {if $orders && count($orders)} + <table id="order-list" class="std"> + <thead> + <tr> + <th class="first_item">{l s='Order' mod='loyalty'}</th> + <th class="item">{l s='Date' mod='loyalty'}</th> + <th class="item">{l s='Points' mod='loyalty'}</th> + <th class="last_item">{l s='Points Status' mod='loyalty'}</th> + </tr> + </thead> + <tfoot> + <tr class="alternate_item"> + <td colspan="2" class="history_method bold" style="text-align:center;">{l s='Total points available:' mod='loyalty'}</td> + <td class="history_method" style="text-align:left;">{$totalPoints|intval}</td> + <td class="history_method">&nbsp;</td> + </tr> + </tfoot> + <tbody> + {foreach from=$displayorders item='order'} + <tr class="alternate_item"> + <td class="history_link bold">{l s='#' mod='loyalty'}{$order.id|string_format:"%06d"}</td> + <td class="history_date">{dateFormat date=$order.date full=1}</td> + <td class="history_method">{$order.points|intval}</td> + <td class="history_method">{$order.state|escape:'htmlall':'UTF-8'}</td> + </tr> + {/foreach} + </tbody> + </table> + <div id="block-order-detail" class="hidden">&nbsp;</div> + {else} + <p class="warning">{l s='You have not placed any orders.'}</p> + {/if} +</div> +<div id="pagination" class="pagination"> + {if $nbpagination < $orders|@count} + <ul class="pagination"> + {if $page != 1} + {assign var='p_previous' value=$page-1} + <li id="pagination_previous"><a href="{$pagination_link}?p={$p_previous}&n={$nbpagination}"> + &laquo;&nbsp;{l s='Previous' mod='loyalty'}</a></li> + {else} + <li id="pagination_previous" class="disabled"><span>&laquo;&nbsp;{l s='Previous' mod='loyalty'}</span></li> + {/if} + {if $page > 2} + <li><a href="{$pagination_link}?p=1&n={$nbpagination}">1</a></li> + {if $page > 3} + <li class="truncate">...</li> + {/if} + {/if} + {section name=pagination start=$page-1 loop=$page+2 step=1} + {if $page == $smarty.section.pagination.index} + <li class="current"><span>{$page|escape:'htmlall':'UTF-8'}</span></li> + {elseif $smarty.section.pagination.index > 0 && $orders|@count+$nbpagination > ($smarty.section.pagination.index)*($nbpagination)} + <li><a href="{$pagination_link}?p={$smarty.section.pagination.index}&n={$nbpagination}">{$smarty.section.pagination.index|escape:'htmlall':'UTF-8'}</a></li> + {/if} + {/section} + {if $max_page-$page > 1} + {if $max_page-$page > 2} + <li class="truncate">...</li> + {/if} + <li><a href="{$pagination_link}?p={$max_page}&n={$nbpagination}">{$max_page}</a></li> + {/if} + {if $orders|@count > $page * $nbpagination} + {assign var='p_next' value=$page+1} + <li id="pagination_next"><a href="{$pagination_link}?p={$p_next}&n={$nbpagination}">{l s='Next' mod='loyalty'}&nbsp;&raquo;</a></li> + {else} + <li id="pagination_next" class="disabled"><span>{l s='Next' mod='loyalty'}&nbsp;&raquo;</span></li> + {/if} + </ul> + {/if} + {if $orders|@count > 10} + <form action="{$pagination_link}" method="get" class="pagination"> + <p> + <input type="submit" class="button_mini" value="{l s='OK'}" /> + <label for="nb_item">{l s='items:' mod='loyalty'}</label> + <select name="n" id="nb_item"> + {foreach from=$nArray item=nValue} + {if $nValue <= $orders|@count} + <option value="{$nValue|escape:'htmlall':'UTF-8'}" {if $nbpagination == $nValue}selected="selected"{/if}>{$nValue|escape:'htmlall':'UTF-8'}</option> + {/if} + {/foreach} + </select> + <input type="hidden" name="p" value="1" /> + </p> + </form> + {/if} + </div> + +<br />{l s='Vouchers generated here are usable in the following categories : ' mod='loyalty'} +{if $categories}{$categories}{else}{l s='All' mod='loyalty'}{/if} + +{if $transformation_allowed} +<p style="text-align:center; margin-top:20px"> + <a href="{$base_dir}modules/loyalty/loyalty-program.php?transform-points=true" onclick="return confirm('{l s='Are you sure you want to transform your points into vouchers?' mod='loyalty' js=1}');">{l s='Transform my points into a voucher of' mod='loyalty'} <span class="price">{convertPrice price=$voucher}</span>.</a> +</p> +{/if} + +<br /> +<h2>{l s='My vouchers from loyalty points' mod='loyalty'}</h2> + +{if $nbDiscounts} +<div class="block-center" id="block-history"> + <table id="order-list" class="std"> + <thead> + <tr> + <th class="first_item">{l s='Created' mod='loyalty'}</th> + <th class="item">{l s='Value' mod='loyalty'}</th> + <th class="item">{l s='Code' mod='loyalty'}</th> + <th class="item">{l s='Valid from' mod='loyalty'}</th> + <th class="item">{l s='Valid until' mod='loyalty'}</th> + <th class="item">{l s='Status' mod='loyalty'}</th> + <th class="last_item">{l s='Details' mod='loyalty'}</th> + </tr> + </thead> + <tbody> + {foreach from=$discounts item=discount name=myLoop} + <tr class="alternate_item"> + <td class="history_date">{dateFormat date=$discount->date_add}</td> + <td class="history_price"><span class="price">{if $discount->id_discount_type == 1} + {$discount->value}% + {elseif $discount->id_discount_type == 2} + {displayPrice price=$discount->value currency=$discount->id_currency} + {else} + {l s='Free shipping' mod='loyalty'} + {/if}</span></td> + <td class="history_method bold">{$discount->name}</td> + <td class="history_date">{dateFormat date=$discount->date_from}</td> + <td class="history_date">{dateFormat date=$discount->date_to}</td> + <td class="history_method bold">{if $discount->quantity > 0}{l s='To use' mod='loyalty'}{else}{l s='Used' mod='loyalty'}{/if}</td> + <td class="history_method"><a href="{$smarty.server.SCRIPT_NAME}" onclick="return false" class="tips" title="{l s='Generated by these following orders' mod='loyalty'}|{foreach from=$discount->orders item=myorder name=myLoop}{l s='Order #' mod='loyalty'}{$myorder.id_order} ({displayPrice price=$myorder.total_paid currency=$myorder.id_currency}) : {if $myorder.points > 0}{$myorder.points} {l s='points.' mod='loyalty'}{else}{l s='Cancelled' mod='loyalty'}{/if}{if !$smarty.foreach.myLoop.last}|{/if}{/foreach}">{l s='more...' mod='loyalty'}</a></td> + </tr> + {/foreach} + </tbody> + </table> + <div id="block-order-detail" class="hidden">&nbsp;</div> +</div> + +{if $minimalLoyalty > 0}<p>{l s='The minimum order amount in order to use these vouchers is:'} {convertPrice price=$minimalLoyalty}</p>{/if} + +<script type="text/javascript"> +{literal} +$(document).ready(function() +{ + $('a.tips').cluetip({ + showTitle: false, + splitTitle: '|', + arrows: false, + fx: { + open: 'fadeIn', + openSpeed: 'fast' + } + }); +}); +{/literal} +</script> +{else} +<p class="warning">{l s='No vouchers yet.' mod='loyalty'}</p> +{/if} +{else} +<p class="warning">{l s='No reward points yet.' mod='loyalty'}</p> +{/if} + +<ul class="footer_links"> + <li><a href="{$link->getPageLink('my-account', true)}"><img src="{$img_dir}icon/my-account.gif" alt="" class="icon" /></a><a href="{$link->getPageLink('my-account', true)}">{l s='Back to Your Account' mod='loyalty'}</a></li> + <li><a href="{$base_dir}"><img src="{$img_dir}icon/home.gif" alt="" class="icon" /></a><a href="{$base_dir}">{l s='Home' mod='loyalty'}</a></li> +</ul> diff --git a/modules/loyalty/my-account.tpl b/modules/loyalty/my-account.tpl new file mode 100644 index 000000000..2d3e314f1 --- /dev/null +++ b/modules/loyalty/my-account.tpl @@ -0,0 +1,29 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Loyalty --> +<li><a href="{$base_dir_ssl}modules/loyalty/loyalty-program.php" title="{l s='My loyalty points' mod='loyalty'}"><img src="{$module_template_dir}loyalty.gif" alt="{l s='My loyalty points' mod='loyalty'}" class="icon" /></a><a href="{$base_dir_ssl}modules/loyalty/loyalty-program.php" title="{l s='My loyalty points' mod='loyalty'}">{l s='My loyalty points' mod='loyalty'}</a></li> +<!-- END : MODULE Loyalty --> \ No newline at end of file diff --git a/modules/loyalty/product.tpl b/modules/loyalty/product.tpl new file mode 100644 index 000000000..0b3902072 --- /dev/null +++ b/modules/loyalty/product.tpl @@ -0,0 +1,43 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<p id="loyalty" class="align_justify"> + <img src="{$module_template_dir}loyalty.gif" alt="{l s='Loyalty program' mod='loyalty'}" class="icon" /> + {if $points} + {l s='By buying this product you can collect up to' mod='loyalty'} <b><span id="loyalty_points">{$points}</span> + {if $points > 1}{l s='loyalty points' mod='loyalty'}{else}{l s='loyalty point' mod='loyalty'}{/if}</b>. + {l s='Your cart will total' mod='loyalty'} <b><span id="total_loyalty_points">{$total_points}</span> + {if $total_points > 1}{l s='points' mod='loyalty'}{else}{l s='point' mod='loyalty'}{/if}</b> {l s='that can be converted into a voucher of' mod='loyalty'} + <span id="loyalty_price">{convertPrice price=$voucher}</span>. + {else} + {if isset($no_pts_discounted) && $no_pts_discounted == 1} + {l s='No reward points for this product because there\'s already a discount.' mod='loyalty'} + {else} + {l s='No reward points for this product.' mod='loyalty'} + {/if} + {/if} +</p> +<br class="clear" /> \ No newline at end of file diff --git a/modules/loyalty/shopping-cart.tpl b/modules/loyalty/shopping-cart.tpl new file mode 100644 index 000000000..30a878363 --- /dev/null +++ b/modules/loyalty/shopping-cart.tpl @@ -0,0 +1,31 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE Loyalty --> +<p id="loyalty"> + <img src="{$module_template_dir}loyalty.gif" alt="{l s='loyalty' mod='loyalty'}" class="icon" />{if $points > 0}{l s='By checking out of this shopping cart you can collect up to' mod='loyalty'} <b>{$points} {if $points > 1}{l s='loyalty points' mod='loyalty'}{else}{l s='loyalty point' mod='loyalty'}{/if}</b> {l s='that can be converted into a voucher of' mod='loyalty'} {convertPrice price=$voucher}.{else}{l s='Add some products to your shopping cart to collect some loyalty points.' mod='loyalty'}{/if} +</p> +<!-- END : MODULE Loyalty --> \ No newline at end of file diff --git a/modules/mailalerts/config.xml b/modules/mailalerts/config.xml new file mode 100755 index 000000000..256f8b042 --- /dev/null +++ b/modules/mailalerts/config.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>mailalerts</name> + <displayName><![CDATA[Mail alerts]]></displayName> + <version><![CDATA[2.2]]></version> + <description><![CDATA[Sends e-mail notifications to customers and merchants.]]></description> + <author><![CDATA[PrestaShop]]></author> + <tab><![CDATA[administration]]></tab> + <confirmUninstall>Are you sure you want to delete all customer notifications?</confirmUninstall> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/mailalerts/de.php b/modules/mailalerts/de.php new file mode 100644 index 000000000..67c98c972 --- /dev/null +++ b/modules/mailalerts/de.php @@ -0,0 +1,43 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mailalerts}prestashop>my-account_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'Meine Benachrichtigungen'; +$_MODULE['<{mailalerts}prestashop>my-account_abca7cba75e5a9ff86b1490f32891f82'] = 'Benachrichtigungen'; +$_MODULE['<{mailalerts}prestashop>myalerts_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mein Konto'; +$_MODULE['<{mailalerts}prestashop>myalerts_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'Meine Benachrichtigungen'; +$_MODULE['<{mailalerts}prestashop>myalerts_deb10517653c255364175796ace3553f'] = 'Produkt'; +$_MODULE['<{mailalerts}prestashop>myalerts_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{mailalerts}prestashop>myalerts_074c07016d3e5a9f011aa8e62abe4517'] = 'Sie haben keine Benachrichtigungen abonniert.'; +$_MODULE['<{mailalerts}prestashop>myalerts_0b3db27bc15f682e92ff250ebb167d4b'] = 'Zurück zu Ihrem Konto'; +$_MODULE['<{mailalerts}prestashop>myalerts_8cf04a9734132302f96da8e113e80ce5'] = 'Startseite'; +$_MODULE['<{mailalerts}prestashop>product_61172eb93737ebf095d3fa02119ce1df'] = 'Anfragenachricht registriert'; +$_MODULE['<{mailalerts}prestashop>product_900f8551b29793ecb604a545b2059cc1'] = 'Ihre E-Mail-Adresse ist ungültig'; +$_MODULE['<{mailalerts}prestashop>product_546e02eaa9a986c83cc347e273269f2c'] = 'Mich bei Verfügbarkeit benachrichtigen'; +$_MODULE['<{mailalerts}prestashop>mailalerts_fd30254803e8db32521d3390131a44da'] = 'Mail-Benachrichtigungen'; +$_MODULE['<{mailalerts}prestashop>mailalerts_2d51f4a7ab8a12c4f35b507019523b8c'] = 'Sendet E-Mail-Benachrichtigungen an Kunden und Händler.'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8fd3b84964bd6dfec8095f658d200b29'] = 'Sind Sie sicher, dass alle Kundenmitteilungen löschen wollen?'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7cb9a154f101c674c945f88dad5c5e28'] = 'Keine Nachricht'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9137796c15dd92e5553c3f29574d0968'] = 'Gutschein-Code:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4c9120f1a5947445c0e9620254ceb30b'] = 'Neue Bestellung'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7a608706e248c21437882f5d1a8ece3a'] = 'Kundennachricht'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ea379dd90c33c1345f40aa0afa6688d8'] = 'Produktverfügbarkeit:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_86e8d61297942b00e9937299735df971'] = 'Gibt dem Kunden die Möglichkeit, eine Nachricht zu einem verfügbaren Produkt zu erhalten, wenn dieses vorher nicht auf Lager war'; +$_MODULE['<{mailalerts}prestashop>mailalerts_38fb7d24e0d60a048f540ecb18e13376'] = 'Speichern'; +$_MODULE['<{mailalerts}prestashop>mailalerts_d9b64868bb5b490c5c0627abe835acf6'] = 'Händlernachricht'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9204d21640382a89a95ec42f44f9051c'] = 'Neue Bestellung:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_fd5dc19a70d21e130f2e4ab5eb205e66'] = 'Eine Benachrichtigung erhalten, wenn eine neue Bestellung gemacht wird'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ebc3ccf8441dba3c1615afa6acb3282a'] = 'Nicht auf Lager:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c009546071b59092716ba006f307c6af'] = 'Eine Benachrichtigung erhalten, wenn die Menge eines Produkts unterhalb der der Alarmgrenze ist'; +$_MODULE['<{mailalerts}prestashop>mailalerts_af097c4096dc45754451f6f656dd1ee0'] = 'Alarmgrenze'; +$_MODULE['<{mailalerts}prestashop>mailalerts_65d0578157fd293e96f55f2d9228c07b'] = 'Menge, bei der ein Produkt als ausverkauft gilt'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4cf0e54bd20f173efae53b6b4d3d8d9a'] = 'An diese E-Mail-Adressen senden:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8c5b6fe38a32f46c355f025a820c804c'] = 'Eine E-Mail-Adresse pro Zeile'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f77ed609e48d550f0166dfbafc102710'] = 'z.B.,'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c1ee76f076a5b97e3b4b0c0e5703246e'] = 'Kann Einstellungen nicht aktualisieren'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ce241f25e003bafeb9fce6857d8f027f'] = 'Bitte geben Sie eine (oder mehrere) E-Mail Adressen ein'; +$_MODULE['<{mailalerts}prestashop>mailalerts_29aae9c646337554f4de7ae29050c39f'] = 'Ungültige E-Mail:'; + +?> \ No newline at end of file diff --git a/modules/mailalerts/en.php b/modules/mailalerts/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/mailalerts/en.php @@ -0,0 +1,4 @@ +<?php + +global $_MODULE; +$_MODULE = array(); diff --git a/modules/mailalerts/es.php b/modules/mailalerts/es.php new file mode 100644 index 000000000..611c0df02 --- /dev/null +++ b/modules/mailalerts/es.php @@ -0,0 +1,41 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mailalerts}prestashop>mailalerts_fd30254803e8db32521d3390131a44da'] = 'Alertas por correo'; +$_MODULE['<{mailalerts}prestashop>mailalerts_2d51f4a7ab8a12c4f35b507019523b8c'] = 'Enviar correos de notificación a los clientes y comerciantes.'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8fd3b84964bd6dfec8095f658d200b29'] = '¿Está seguro de querer suprimir todas las notificaciones de los clientes?'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7cb9a154f101c674c945f88dad5c5e28'] = 'No hay mensaje'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9137796c15dd92e5553c3f29574d0968'] = 'Código del vale:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4c9120f1a5947445c0e9620254ceb30b'] = 'Nuevo pedido'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7a608706e248c21437882f5d1a8ece3a'] = 'Notificación al cliente'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ea379dd90c33c1345f40aa0afa6688d8'] = 'Disponibilidad del producto:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_86e8d61297942b00e9937299735df971'] = 'Da al cliente la posibilidad de recibir una notificación cuando un producto agotado se encuentra de nuevo disponible'; +$_MODULE['<{mailalerts}prestashop>mailalerts_38fb7d24e0d60a048f540ecb18e13376'] = 'Guardar'; +$_MODULE['<{mailalerts}prestashop>mailalerts_d9b64868bb5b490c5c0627abe835acf6'] = 'Notificación al comerciante'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9204d21640382a89a95ec42f44f9051c'] = 'Nuevo pedido:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_fd5dc19a70d21e130f2e4ab5eb205e66'] = 'Recibir una notificación si se recibe un nuevo pedido'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ebc3ccf8441dba3c1615afa6acb3282a'] = 'Fuera de stock'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c009546071b59092716ba006f307c6af'] = 'Recibir una notificación si la cantidad del producto se encuentra por debajo del umbral de alerta'; +$_MODULE['<{mailalerts}prestashop>mailalerts_af097c4096dc45754451f6f656dd1ee0'] = 'Umbral de alerta:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_65d0578157fd293e96f55f2d9228c07b'] = 'Cantidad a partir de la cual el producto se considera fuera de stock'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4cf0e54bd20f173efae53b6b4d3d8d9a'] = 'Enviar por email:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8c5b6fe38a32f46c355f025a820c804c'] = 'Una dirección email por línea'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f77ed609e48d550f0166dfbafc102710'] = 'ej:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c1ee76f076a5b97e3b4b0c0e5703246e'] = 'No se pueden actualizar los ajustes'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c888438d14855d7d96a2724ee9c306bd'] = 'Ajustes actualizados'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ce241f25e003bafeb9fce6857d8f027f'] = 'Por favor, una o máas direcciones email'; +$_MODULE['<{mailalerts}prestashop>mailalerts_29aae9c646337554f4de7ae29050c39f'] = 'Email no válido:'; +$_MODULE['<{mailalerts}prestashop>my-account_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'Mis alertas'; +$_MODULE['<{mailalerts}prestashop>my-account_abca7cba75e5a9ff86b1490f32891f82'] = 'alertas'; +$_MODULE['<{mailalerts}prestashop>myalerts_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mi cuenta'; +$_MODULE['<{mailalerts}prestashop>myalerts_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'Mis alertas'; +$_MODULE['<{mailalerts}prestashop>myalerts_deb10517653c255364175796ace3553f'] = 'Producto'; +$_MODULE['<{mailalerts}prestashop>myalerts_f2a6c498fb90ee345d997f888fce3b18'] = 'Borrar'; +$_MODULE['<{mailalerts}prestashop>myalerts_074c07016d3e5a9f011aa8e62abe4517'] = 'No está inscrito a ninguna alerta.'; +$_MODULE['<{mailalerts}prestashop>myalerts_0b3db27bc15f682e92ff250ebb167d4b'] = 'Volver a mi cuenta'; +$_MODULE['<{mailalerts}prestashop>myalerts_8cf04a9734132302f96da8e113e80ce5'] = 'Inicio'; +$_MODULE['<{mailalerts}prestashop>product_61172eb93737ebf095d3fa02119ce1df'] = 'Notificación de la petición registrada'; +$_MODULE['<{mailalerts}prestashop>product_900f8551b29793ecb604a545b2059cc1'] = 'Su dirección de correo electrónico no es válida.'; +$_MODULE['<{mailalerts}prestashop>product_546e02eaa9a986c83cc347e273269f2c'] = 'Indicarme cuando esté disponible'; diff --git a/modules/mailalerts/fr.php b/modules/mailalerts/fr.php new file mode 100644 index 000000000..bf6bf677e --- /dev/null +++ b/modules/mailalerts/fr.php @@ -0,0 +1,41 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mailalerts}prestashop>mailalerts_fd30254803e8db32521d3390131a44da'] = 'Alertes email'; +$_MODULE['<{mailalerts}prestashop>mailalerts_2d51f4a7ab8a12c4f35b507019523b8c'] = 'Envoie des notifications par e-mail aux clients et aux marchands.'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8fd3b84964bd6dfec8095f658d200b29'] = 'Etes-vous sûr de vouloir supprimer toutes les notifications clients ?'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7cb9a154f101c674c945f88dad5c5e28'] = 'Aucun message'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9137796c15dd92e5553c3f29574d0968'] = 'Code de réduction :'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4c9120f1a5947445c0e9620254ceb30b'] = 'Nouvelle commande'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7a608706e248c21437882f5d1a8ece3a'] = 'Notification client'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ea379dd90c33c1345f40aa0afa6688d8'] = 'Disponibilité du produit'; +$_MODULE['<{mailalerts}prestashop>mailalerts_86e8d61297942b00e9937299735df971'] = 'Donne au client la possibilité de recevoir une notification lorsqu\'un produit hors-stock est de nouveau disponible'; +$_MODULE['<{mailalerts}prestashop>mailalerts_38fb7d24e0d60a048f540ecb18e13376'] = 'Enregistrer'; +$_MODULE['<{mailalerts}prestashop>mailalerts_d9b64868bb5b490c5c0627abe835acf6'] = 'Notification marchand'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9204d21640382a89a95ec42f44f9051c'] = 'Nouvelle commande : '; +$_MODULE['<{mailalerts}prestashop>mailalerts_fd5dc19a70d21e130f2e4ab5eb205e66'] = 'Recevoir une notification si une nouvelle commande est passée'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ebc3ccf8441dba3c1615afa6acb3282a'] = 'Hors stock : '; +$_MODULE['<{mailalerts}prestashop>mailalerts_c009546071b59092716ba006f307c6af'] = 'Recevoir une notification si la quantité du produit est en dessous du seuil d\'alerte'; +$_MODULE['<{mailalerts}prestashop>mailalerts_af097c4096dc45754451f6f656dd1ee0'] = 'Seuil d\'alerte:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_65d0578157fd293e96f55f2d9228c07b'] = 'Quantité pour laquelle le produit est considéré hors stock'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4cf0e54bd20f173efae53b6b4d3d8d9a'] = 'Envoyer aux adresses e-mail suivantes :'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8c5b6fe38a32f46c355f025a820c804c'] = 'Une adresse email par ligne'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f77ed609e48d550f0166dfbafc102710'] = 'ex :'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c1ee76f076a5b97e3b4b0c0e5703246e'] = 'Mise à jour des réglages impossible'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ce241f25e003bafeb9fce6857d8f027f'] = 'Merci d\'entrer une (ou plusieurs) addresse(s) email'; +$_MODULE['<{mailalerts}prestashop>mailalerts_29aae9c646337554f4de7ae29050c39f'] = 'E-mail invalide : '; +$_MODULE['<{mailalerts}prestashop>my-account_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'Mes alertes'; +$_MODULE['<{mailalerts}prestashop>my-account_abca7cba75e5a9ff86b1490f32891f82'] = 'alertes'; +$_MODULE['<{mailalerts}prestashop>myalerts_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mon compte'; +$_MODULE['<{mailalerts}prestashop>myalerts_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'Mes alertes'; +$_MODULE['<{mailalerts}prestashop>myalerts_deb10517653c255364175796ace3553f'] = 'Produit'; +$_MODULE['<{mailalerts}prestashop>myalerts_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{mailalerts}prestashop>myalerts_074c07016d3e5a9f011aa8e62abe4517'] = 'Vous n\'avez souscrit à aucune alerte.'; +$_MODULE['<{mailalerts}prestashop>myalerts_0b3db27bc15f682e92ff250ebb167d4b'] = 'Retour à votre compte'; +$_MODULE['<{mailalerts}prestashop>myalerts_8cf04a9734132302f96da8e113e80ce5'] = 'Accueil'; +$_MODULE['<{mailalerts}prestashop>product_61172eb93737ebf095d3fa02119ce1df'] = 'Demande de notification enregistrée'; +$_MODULE['<{mailalerts}prestashop>product_900f8551b29793ecb604a545b2059cc1'] = 'Votre adresse e-mail est invalide'; +$_MODULE['<{mailalerts}prestashop>product_546e02eaa9a986c83cc347e273269f2c'] = 'Prévenez-moi lorsque le produit est disponible'; diff --git a/modules/mailalerts/img/delete.gif b/modules/mailalerts/img/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..da95ba165b5ed033bf1658a951deff313d1853d8 GIT binary patch literal 358 zcmZ?wbhEHb6krfwxXQrrL`Ch#x(z>5(!Y6n|9$lMe`&?9o3~yYn|_Oo{&n`;|JsK4 zt{y**9{rzR^dmOmdq~(j8@vDS-aXUN{gIgby{GTb-FyGDbN^S@{tpiOUs(LX-Rs}8 zXaA#O|7_p!(%9^OTG~5D=fBskeev=C-`4pnJNH{i_$xhw|BbEBG&TR9IrBd>f`Kxi z_>+Z^ok5U62V@M$PYi6$2RaHobi~ZvoYX^fL?$>Na&b`P;pTE>^D3C2*LT36STfdQ z_Pgr~H79W`Ka=vQOs7YXQFFD1!n+DV4sjV7$%YCR4puEKUT)D&4kpQ|V*COVUAm@l zC<rLYE3vZ$atQOPDmck;%QLGj6;xCeUgaVruz|;!Q)#s;gW4V!&c-8+Cmk8A0Zl}E AP5=M^ literal 0 HcmV?d00001 diff --git a/modules/mailalerts/it.php b/modules/mailalerts/it.php new file mode 100644 index 000000000..28fd18b90 --- /dev/null +++ b/modules/mailalerts/it.php @@ -0,0 +1,43 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mailalerts}prestashop>my-account_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'I miei avvisi'; +$_MODULE['<{mailalerts}prestashop>my-account_abca7cba75e5a9ff86b1490f32891f82'] = 'avvisi'; +$_MODULE['<{mailalerts}prestashop>myalerts_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Il mio account'; +$_MODULE['<{mailalerts}prestashop>myalerts_4edfd10d0bb5f51e0fd2327df608b5a8'] = 'I miei avvisi'; +$_MODULE['<{mailalerts}prestashop>myalerts_deb10517653c255364175796ace3553f'] = 'Prodotto'; +$_MODULE['<{mailalerts}prestashop>myalerts_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{mailalerts}prestashop>myalerts_074c07016d3e5a9f011aa8e62abe4517'] = 'Non sei iscritto ad alcuna notifica.'; +$_MODULE['<{mailalerts}prestashop>myalerts_0b3db27bc15f682e92ff250ebb167d4b'] = 'Torna al tuo account'; +$_MODULE['<{mailalerts}prestashop>myalerts_8cf04a9734132302f96da8e113e80ce5'] = 'Home'; +$_MODULE['<{mailalerts}prestashop>product_61172eb93737ebf095d3fa02119ce1df'] = 'Richiesta di notifica registrata'; +$_MODULE['<{mailalerts}prestashop>product_900f8551b29793ecb604a545b2059cc1'] = 'Il tuo indirizzo e-mail non è valido'; +$_MODULE['<{mailalerts}prestashop>product_546e02eaa9a986c83cc347e273269f2c'] = 'Avvisami quando disponibile'; +$_MODULE['<{mailalerts}prestashop>mailalerts_fd30254803e8db32521d3390131a44da'] = 'Mail di notifica'; +$_MODULE['<{mailalerts}prestashop>mailalerts_2d51f4a7ab8a12c4f35b507019523b8c'] = 'Invia notifiche via e-mail a clienti e commercianti.'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8fd3b84964bd6dfec8095f658d200b29'] = 'Sei sicuro di voler eliminare tutte le notifiche ai clienti?'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7cb9a154f101c674c945f88dad5c5e28'] = 'Nessun messaggio'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9137796c15dd92e5553c3f29574d0968'] = 'Codice del buono:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4c9120f1a5947445c0e9620254ceb30b'] = 'Nuovo ordine'; +$_MODULE['<{mailalerts}prestashop>mailalerts_7a608706e248c21437882f5d1a8ece3a'] = 'Notifica cliente'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ea379dd90c33c1345f40aa0afa6688d8'] = 'Disponibilità prodotto:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_86e8d61297942b00e9937299735df971'] = 'Offre al cliente la possibilità di ricevere una notifica per un prodotto disponibile se questo è fuori stock'; +$_MODULE['<{mailalerts}prestashop>mailalerts_38fb7d24e0d60a048f540ecb18e13376'] = 'Salva'; +$_MODULE['<{mailalerts}prestashop>mailalerts_d9b64868bb5b490c5c0627abe835acf6'] = 'Notifica commerciante'; +$_MODULE['<{mailalerts}prestashop>mailalerts_9204d21640382a89a95ec42f44f9051c'] = 'Nuovo ordine:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_fd5dc19a70d21e130f2e4ab5eb205e66'] = 'Ricevere una notifica se viene fatto un nuovo ordine '; +$_MODULE['<{mailalerts}prestashop>mailalerts_ebc3ccf8441dba3c1615afa6acb3282a'] = 'Esaurito:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c009546071b59092716ba006f307c6af'] = 'Ricevere una notifica se la quantità di un prodotto è al di sotto della soglia di allarme'; +$_MODULE['<{mailalerts}prestashop>mailalerts_af097c4096dc45754451f6f656dd1ee0'] = 'Soglia di allarme:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_65d0578157fd293e96f55f2d9228c07b'] = 'Quantità per la quale un prodotto è considerato esaurito'; +$_MODULE['<{mailalerts}prestashop>mailalerts_4cf0e54bd20f173efae53b6b4d3d8d9a'] = 'Invia a questi indirizzi e-mail:'; +$_MODULE['<{mailalerts}prestashop>mailalerts_8c5b6fe38a32f46c355f025a820c804c'] = 'Un indirizzo e-mail per riga'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f77ed609e48d550f0166dfbafc102710'] = 'ad esempio,'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c1ee76f076a5b97e3b4b0c0e5703246e'] = 'Impossibile aggiornare le impostazioni'; +$_MODULE['<{mailalerts}prestashop>mailalerts_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{mailalerts}prestashop>mailalerts_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{mailalerts}prestashop>mailalerts_ce241f25e003bafeb9fce6857d8f027f'] = 'Si prega di digitare uno (o più) indirizzo e-mail'; +$_MODULE['<{mailalerts}prestashop>mailalerts_29aae9c646337554f4de7ae29050c39f'] = 'e-mail non valida:'; + +?> \ No newline at end of file diff --git a/modules/mailalerts/logo.gif b/modules/mailalerts/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bdd3304de57761ba769f304df43ef97b4e6cc98 GIT binary patch literal 792 zcmV+z1LypSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!s!2paR5;6} zQ%z4(K@>gn-s{Jsef@w|XbT!@L<vD9tc)9s3zukEsXxGl3lrBG6IZTW5LcoblP)B> zKqWCIT8+A(7Sx3z9}!4Pu(d7F()NAMIIl$mh8>gK+?nLgnRCyXOBiF=&l0fDCEXmG zO1fK=fkMUbY^kO|IUx!Li*G1rXYru4dEO2NVi`tlvyl0*xG05#{;n&-JwDA~#O)Gy zp_Bjjq?zlQDb_VBdhw2?3i+}b*G)<i$u(pOI;tAON|7Q{qR4JgtZh={D-4AygJA*L zqK?rQYgn&pf)egJEL1g%xEumv5g%Sn=drP6pxsB{;AEU4fm5;r2*?D*vX1c&IRsjL zXbZR+oP?TcHYmnByy$HA;bl6H^@@RzS7=;x+CW>Mkej}RiH|=KYV#o;^MY)fCsb9d zsU|OsN4*FKTk!a82BnG)znj1#sVFUsLkabxPk!I1k)<6rR_jd$gsWp3CfpLm!B_y3 zsXVd;6|1uoP{IT7MFtSAy@Rth*I@QnS)ry`u-WLkiCn3Iu66|{;z1la6h!*_9BM0* z{Ph5=@-syHFF{yNfEpSa|Bn$Hz+|?+`69m@R^azIIYol*12T?FuMz1z52!OpJxahE zsKZrEL0x&ntu#0QWkR*Ix~y>@k9Eo{8Whm#vABR1lv)~Yvjinr1J#!7Vpv?v?xE{w z`;|a0UsB7zvrDA!!ri2^HGa~ics!CzBobHC!F9M6c_^MfJ51b;DNsGT-LnItXArps z0g2@NX5wr7GudmHX6_GN4fPJ+>*$gBt0~^Ej_Ief7#!&Z5&eLC4(SIs@{H0mdjh0J zPi6ZrCt{+o3}&v|YVDdoQ9g>?w=bA~e*1~E*Mymx?w%PNsdJ5Z>vTu3e;IaWtm6;T WSyNB7T<n(s0000<MNUMnLSTY?cwdeH literal 0 HcmV?d00001 diff --git a/modules/mailalerts/mailalerts-ajax_add.php b/modules/mailalerts/mailalerts-ajax_add.php new file mode 100644 index 000000000..9e8ba6fd0 --- /dev/null +++ b/modules/mailalerts/mailalerts-ajax_add.php @@ -0,0 +1,67 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); + +if (!$id_product = (int)(Tools::getValue('id_product'))) + die ('0'); +$id_product_attribute = (int)(Tools::getValue('id_product_attribute')); + +if (!$cookie->isLogged()) +{ + $customer_email = trim(Tools::getValue('customer_email')); + if (empty($customer_email) OR !Validate::isEmail($customer_email)) + die ('0'); + if ($customer_email == 'your@email.com') + die ('0'); + + $id_customer = (int)Db::getInstance()->getValue('SELECT id_customer FROM '._DB_PREFIX_.'customer WHERE email=\''.pSQL($customer_email).'\' AND is_guest=0'); + // Check if already in DB + if (Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'mailalert_customer_oos` + WHERE `id_customer` = '.(int)($id_customer).' + AND `customer_email` = \''.pSQL($customer_email).'\' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute))) + die('1'); +} +else +{ + $id_customer = (int)($cookie->id_customer); + $customer_email = 0; +} + +if (Db::getInstance()->Execute(' + REPLACE INTO `'._DB_PREFIX_.'mailalert_customer_oos` (`id_customer`, `customer_email`, `id_product` , `id_product_attribute`) + VALUES ('.(int)($id_customer).', \''.pSQL($customer_email).'\', '.(int)($id_product).', '.(int)($id_product_attribute).')')) + die ('1'); + +die ('0'); + + diff --git a/modules/mailalerts/mailalerts-ajax_check.php b/modules/mailalerts/mailalerts-ajax_check.php new file mode 100644 index 000000000..e618194a0 --- /dev/null +++ b/modules/mailalerts/mailalerts-ajax_check.php @@ -0,0 +1,44 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/../../modules/mailalerts/mailalerts.php'); + +if (!$cookie->isLogged()) + die('0'); + +$id_customer = (int)($cookie->id_customer); +if (!$id_product = (int)(Tools::getValue('id_product'))) + die ('0'); +$id_product_attribute = (int)(Tools::getValue('id_product_attribute')); + +$mA = new MailAlerts(); +if ($mA->customerHasNotification((int)($id_customer), (int)($id_product), (int)($id_product_attribute))) + die ('1'); +die('0'); + diff --git a/modules/mailalerts/mailalerts.php b/modules/mailalerts/mailalerts.php new file mode 100644 index 000000000..691cf998c --- /dev/null +++ b/modules/mailalerts/mailalerts.php @@ -0,0 +1,571 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class MailAlerts extends Module +{ + private $_html = ''; + private $_postErrors = array(); + + private $_merchant_mails; + private $_merchant_order; + private $_merchant_oos; + private $_customer_qty; + + const __MA_MAIL_DELIMITOR__ = ','; + + public function __construct() + { + $this->name = 'mailalerts'; + $this->tab = 'administration'; + $this->version = '2.2'; + $this->author = 'PrestaShop'; + + parent::__construct(); + + if ($this->id) + $this->_refreshProperties(); + + $this->displayName = $this->l('Mail alerts'); + $this->description = $this->l('Sends e-mail notifications to customers and merchants.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete all customer notifications?'); + } + + public function install() + { + if (!parent::install() OR + !$this->registerHook('newOrder') OR + !$this->registerHook('updateQuantity') OR + !$this->registerHook('productOutOfStock') OR + !$this->registerHook('customerAccount') OR + !$this->registerHook('updateProduct') OR + !$this->registerHook('deleteProduct') OR + !$this->registerHook('deleteProductAttribute') OR + !$this->registerHook('updateProductAttribute') + ) + return false; + + Configuration::updateValue('MA_MERCHANT_ORDER', 1); + Configuration::updateValue('MA_MERCHANT_OOS', 1); + Configuration::updateValue('MA_CUSTOMER_QTY', 1); + Configuration::updateValue('MA_MERCHANT_MAILS', Configuration::get('PS_SHOP_EMAIL')); + Configuration::updateValue('MA_LAST_QTIES', Configuration::get('PS_LAST_QTIES')); + + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'mailalert_customer_oos` ( + `id_customer` int(10) unsigned NOT NULL, + `customer_email` varchar(128) NOT NULL, + `id_product` int(10) unsigned NOT NULL, + `id_product_attribute` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_customer`,`customer_email`,`id_product`,`id_product_attribute`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci') + ) + return false; + + /* This hook is optional */ + $this->registerHook('myAccountBlock'); + return true; + } + + public function uninstall() + { + Configuration::deleteByName('MA_MERCHANT_ORDER'); + Configuration::deleteByName('MA_MERCHANT_OOS'); + Configuration::deleteByName('MA_CUSTOMER_QTY'); + Configuration::deleteByName('MA_MERCHANT_MAILS'); + Configuration::deleteByName('MA_LAST_QTIES'); + if (!Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.'mailalert_customer_oos')) + return false; + return parent::uninstall(); + } + + private function _refreshProperties() + { + $this->_merchant_mails = Configuration::get('MA_MERCHANT_MAILS'); + $this->_merchant_order = (int)Configuration::get('MA_MERCHANT_ORDER'); + $this->_merchant_oos = (int)Configuration::get('MA_MERCHANT_OOS'); + $this->_customer_qty = (int)Configuration::get('MA_CUSTOMER_QTY'); + } + + public function hookNewOrder($params) + { + if (!$this->_merchant_order OR empty($this->_merchant_mails)) + return; + + // Getting differents vars + $id_lang = (int)(Configuration::get('PS_LANG_DEFAULT')); + $currency = $params['currency']; + $configuration = Configuration::getMultiple(array('PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME')); + $order = $params['order']; + $customer = $params['customer']; + $delivery = new Address((int)($order->id_address_delivery)); + $invoice = new Address((int)($order->id_address_invoice)); + $order_date_text = Tools::displayDate($order->date_add, (int)($id_lang)); + $carrier = new Carrier((int)($order->id_carrier)); + $message = $order->getFirstMessage(); + if (!$message OR empty($message)) + $message = $this->l('No message'); + + $itemsTable = ''; + + $customizedDatas = Product::getAllCustomizedDatas(intval($params['cart']->id)); + Product::addCustomizationPrice($products, $customizedDatas); + foreach ($params['order']->getProducts() AS $key => $product) + { + $unit_price = $product['product_price_wt']; + $price = $product['total_price']; + + $customizationText = ''; + if (isset($customizedDatas[$product['product_id']][$product['product_attribute_id']])) + { + + foreach ($customizedDatas[$product['product_id']][$product['product_attribute_id']] AS $customization) + { + if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_])) + foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] AS $text) + $customizationText .= $text['name'].':'.' '.$text['value'].'<br />'; + + if (isset($customization['datas'][_CUSTOMIZE_FILE_])) + $customizationText .= sizeof($customization['datas'][_CUSTOMIZE_FILE_]) .' '. Tools::displayError('image(s)').'<br />'; + + $customizationText .= '---<br />'; + } + + $customizationText = rtrim($customizationText, '---<br />'); + } + + $itemsTable .= + '<tr style="background-color:'.($key % 2 ? '#DDE2E6' : '#EBECEE').';"> + <td style="padding:0.6em 0.4em;">'.$product['product_reference'].'</td> + <td style="padding:0.6em 0.4em;"><strong>'.$product['product_name'].(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '').(!empty($customizationText) ? '<br />'.$customizationText : '').'</strong></td> + <td style="padding:0.6em 0.4em; text-align:right;">'.Tools::displayPrice($unit_price, $currency, false).'</td> + <td style="padding:0.6em 0.4em; text-align:center;">'.(int)($product['product_quantity']).'</td> + <td style="padding:0.6em 0.4em; text-align:right;">'.Tools::displayPrice(($unit_price * $product['product_quantity']), $currency, false).'</td> + </tr>'; + } + foreach ($params['order']->getDiscounts() AS $discount) + { + $itemsTable .= + '<tr style="background-color:#EBECEE;"> + <td colspan="4" style="padding:0.6em 0.4em; text-align:right;">'.$this->l('Voucher code:').' '.$discount['name'].'</td> + <td style="padding:0.6em 0.4em; text-align:right;">-'.Tools::displayPrice($discount['value'], $currency, false).'</td> + </tr>'; + } + if ($delivery->id_state) + $delivery_state = new State((int)($delivery->id_state)); + if ($invoice->id_state) + $invoice_state = new State((int)($invoice->id_state)); + + // Filling-in vars for email + $template = 'new_order'; + $subject = $this->l('New order'); + $templateVars = array( + '{firstname}' => $customer->firstname, + '{lastname}' => $customer->lastname, + '{email}' => $customer->email, + '{delivery_company}' => $delivery->company, + '{delivery_firstname}' => $delivery->firstname, + '{delivery_lastname}' => $delivery->lastname, + '{delivery_address1}' => $delivery->address1, + '{delivery_address2}' => $delivery->address2, + '{delivery_city}' => $delivery->city, + '{delivery_postal_code}' => $delivery->postcode, + '{delivery_country}' => $delivery->country, + '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', + '{delivery_phone}' => $delivery->phone, + '{delivery_other}' => $delivery->other, + '{invoice_company}' => $invoice->company, + '{invoice_firstname}' => $invoice->firstname, + '{invoice_lastname}' => $invoice->lastname, + '{invoice_address2}' => $invoice->address2, + '{invoice_address1}' => $invoice->address1, + '{invoice_city}' => $invoice->city, + '{invoice_postal_code}' => $invoice->postcode, + '{invoice_country}' => $invoice->country, + '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', + '{invoice_phone}' => $invoice->phone, + '{invoice_other}' => $invoice->other, + '{order_name}' => sprintf("%06d", $order->id), + '{shop_name}' => Configuration::get('PS_SHOP_NAME'), + '{date}' => $order_date_text, + '{carrier}' => (($carrier->name == '0') ? Configuration::get('PS_SHOP_NAME') : $carrier->name), + '{payment}' => Tools::substr($order->payment, 0, 32), + '{items}' => $itemsTable, + '{total_paid}' => Tools::displayPrice($order->total_paid, $currency), + '{total_products}' => Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency), + '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency), + '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency), + '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency), + '{currency}' => $currency->sign, + '{message}' => $message + ); + $iso = Language::getIsoById((int)($id_lang)); + if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html')) + Mail::Send($id_lang, $template, $subject, $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, dirname(__FILE__).'/mails/'); + } + + public function hookProductOutOfStock($params) + { + global $smarty, $cookie; + + if (!$this->_customer_qty) + return ; + + $id_product = (int)($params['product']->id); + $id_product_attribute = 0; + + if (!$cookie->isLogged()) + $smarty->assign('email', 1); + else + { + $id_customer = (int)($params['cookie']->id_customer); + if ($this->customerHasNotification($id_customer, $id_product, $id_product_attribute)) + return ; + } + + $smarty->assign(array( + 'id_product' => $id_product, + 'id_product_attribute' => $id_product_attribute)); + + return $this->display(__FILE__, 'product.tpl'); + } + + public function customerHasNotification($id_customer, $id_product, $id_product_attribute) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'mailalert_customer_oos` + WHERE `id_customer` = '.(int)($id_customer).' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute)); + return sizeof($result); + } + + public function hookUpdateQuantity($params) + { + global $cookie; + + if (is_object($params['product'])) + $params['product'] = get_object_vars($params['product']); + + if (is_array($params['product']['name'])) + { + $params['product']['name'] = $params['product']['name'][(int)Configuration::get('PS_LANG_DEFAULT')]; + } + + if (isset($params['product']['id_product'])) + $params['product']['id'] = (int)$params['product']['id_product']; + + $qty = (int)$params['product']['quantity']; + if ($qty <= (int)(Configuration::get('MA_LAST_QTIES')) AND !(!$this->_merchant_oos OR empty($this->_merchant_mails)) AND Configuration::get('PS_STOCK_MANAGEMENT')) + { + $templateVars = array( + '{qty}' => $qty, + '{last_qty}' => (int)(Configuration::get('MA_LAST_QTIES')), + '{product}' => strval($params['product']['name']).(isset($params['product']['attributes_small']) ? ' '.$params['product']['attributes_small'] : '')); + $id_lang = (is_object($cookie) AND isset($cookie->id_lang)) ? (int)$cookie->id_lang : (int)Configuration::get('PS_LANG_DEFAULT'); + $iso = Language::getIsoById((int)$id_lang); + if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html')) + Mail::Send((int)Configuration::get('PS_LANG_DEFAULT'), 'productoutofstock', Mail::l('Product out of stock'), $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + } + + if ($this->_customer_qty AND $params['product']['quantity'] > 0) + $this->sendCustomerAlert((int)$params['product']['id'], 0); + } + + public function hookUpdateProduct($params) + { + /* We specify 0 as an id_product_attribute because this hook is called when the main product is updated */ + if ($this->_customer_qty AND $params['product']->getStock() > 0) + $this->sendCustomerAlert((int)$params['product']->id, 0); + } + + public function hookUpdateProductAttribute($params) + { + $sql = 'SELECT id_product, quantity + FROM '._DB_PREFIX_.'stock + WHERE id_product_attribute = '.(int)$params['id_product_attribute'] + .Shop::sqlSharedStock(); + $result = Db::getInstance()->getRow($sql); + + if ($this->_customer_qty AND $result['quantity'] > 0) + $this->sendCustomerAlert((int)$result['id_product'], (int)$params['id_product_attribute']); + } + + public function sendCustomerAlert($id_product, $id_product_attribute) + { + global $cookie, $link; + + $link = new Link(); + + $customers = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT id_customer, customer_email + FROM `'._DB_PREFIX_.'mailalert_customer_oos` + WHERE `id_product` = '.(int)$id_product.' AND `id_product_attribute` = '.(int)$id_product_attribute); + + $product = new Product((int)$id_product, false, (int)$cookie->id_lang); + $templateVars = array( + '{product}' => (is_array($product->name) ? $product->name[(int)Configuration::get('PS_LANG_DEFAULT')] : $product->name), + '{product_link}' => $link->getProductLink($product) + ); + foreach ($customers AS $cust) + { + if ($cust['id_customer']) + { + $customer = new Customer((int)$cust['id_customer']); + $customer_email = $customer->email; + $customer_id = (int)$customer->id; + } + else + { + $customer_email = $cust['customer_email']; + $customer_id = 0; + } + $id_lang = (is_object($cookie) AND isset($cookie->id_lang)) ? (int)$cookie->id_lang : (int)Configuration::get('PS_LANG_DEFAULT'); + $iso = Language::getIsoById((int)$id_lang); + + if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.html')) + Mail::Send((int)(Configuration::get('PS_LANG_DEFAULT')), 'customer_qty', Mail::l('Product available'), $templateVars, strval($customer_email), NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + if ($customer_id) + $customer_email = 0; + self::deleteAlert((int)$customer_id, strval($customer_email), (int)$id_product, (int)$id_product_attribute); + } + } + + public function hookCustomerAccount($params) + { + return $this->_customer_qty ? $this->display(__FILE__, 'my-account.tpl') : NULL; + } + + public function hookMyAccountBlock($params) + { + return $this->hookCustomerAccount($params); + } + + public function getContent() + { + $this->_html = '<h2>'.$this->displayName.'</h2>'; + $this->_postProcess(); + $this->_displayForm(); + return $this->_html; + } + + private function _displayForm() + { + global $currentIndex; + + $tab = Tools::getValue('tab'); + $token = Tools::getValue('token'); + + $this->_html .= ' + <form action="'.$currentIndex.'&token='.$token.'&configure=mailalerts" method="post"> + <fieldset class="width3"><legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Customer notification').'</legend> + <label>'.$this->l('Product availability:').' </label> + <div class="margin-form"> + <input type="checkbox" value="1" id="mA_customer_qty" name="mA_customer_qty" '.(Tools::getValue('mA_customer_qty', $this->_customer_qty) == 1 ? 'checked' : '').'> + &nbsp;<label for="mA_customer_qty" class="t">'.$this->l('Gives the customer the option of receiving a notification for an available product if this one is out of stock.').'</label> + </div> + <div class="margin-form"> + <input type="submit" value="'.$this->l(' Save ').'" name="submitMACustomer" class="button" /> + </div> + </fieldset> + </form> + <br /> + <form action="'.$currentIndex.'&token='.$token.'&configure=mailalerts" method="post"> + <fieldset class="width3"><legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Merchant notification').'</legend> + <label>'.$this->l('New order:').' </label> + <div class="margin-form"> + <input type="checkbox" value="1" id="mA_merchand_order" name="mA_merchand_order" '.(Tools::getValue('mA_merchand_order', $this->_merchant_order) == 1 ? 'checked' : '').'> + &nbsp;<label for="mA_merchand_order" class="t">'.$this->l('Receive a notification if a new order is made').'</label> + </div> + <label>'.$this->l('Out of stock:').' </label> + <div class="margin-form"> + <input type="checkbox" value="1" id="mA_merchand_oos" name="mA_merchand_oos" '.(Tools::getValue('mA_merchand_oos', $this->_merchant_oos) == 1 ? 'checked' : '').'> + &nbsp;<label for="mA_merchand_oos" class="t">'.$this->l('Receive a notification if the quantity of a product is below the alert threshold').'</label> + </div> + <label>'.$this->l('Alert threshold:').'</label> + <div class="margin-form"> + <input type="text" name="MA_LAST_QTIES" value="'.(Tools::getValue('MA_LAST_QTIES') != NULL ? (int)(Tools::getValue('MA_LAST_QTIES')) : Configuration::get('MA_LAST_QTIES')).'" size="3" /> + <p>'.$this->l('Quantity for which a product is regarded as out of stock').'</p> + </div> + <label>'.$this->l('Send to these e-mail addresses:').' </label> + <div class="margin-form"> + <div style="float:left; margin-right:10px;"> + <textarea name="ma_merchant_mails" rows="10" cols="30">'.Tools::getValue('ma_merchant_mails', str_replace(self::__MA_MAIL_DELIMITOR__, "\n", $this->_merchant_mails)).'</textarea> + </div> + <div style="float:left;"> + '.$this->l('One e-mail address per line').'<br /> + '.$this->l('e.g.,').' bob@example.com + </div> + </div> + <div style="clear:both;">&nbsp;</div> + <div class="margin-form"> + <input type="submit" value="'.$this->l(' Save ').'" name="submitMAMerchant" class="button" /> + </div> + </fieldset> + </form>'; + } + + private function _postProcess() + { + if (Tools::isSubmit('submitMACustomer')) + { + if (!Configuration::updateValue('MA_CUSTOMER_QTY', (int)(Tools::getValue('mA_customer_qty')))) + $this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>'; + else + $this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + elseif (Tools::isSubmit('submitMAMerchant')) + { + $emails = strval(Tools::getValue('ma_merchant_mails')); + if (!$emails OR empty($emails)) + $this->_html .= '<div class="alert error">'.$this->l('Please type one (or more) e-mail address').'</div>'; + else + { + $emails = explode("\n", $emails); + foreach ($emails AS $k => $email) + { + $email = trim($email); + if (!empty($email) AND !Validate::isEmail($email)) + return ($this->_html .= '<div class="alert error">'.$this->l('Invalid e-mail:').' '.$email.'</div>'); + if (!empty($email) AND sizeof($email)) + $emails[$k] = $email; + else + unset($emails[$k]); + } + $emails = implode(self::__MA_MAIL_DELIMITOR__, $emails); + if (!Configuration::updateValue('MA_MERCHANT_MAILS', strval($emails))) + $this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>'; + elseif (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)(Tools::getValue('mA_merchand_order')))) + $this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>'; + elseif (!Configuration::updateValue('MA_MERCHANT_OOS', (int)(Tools::getValue('mA_merchand_oos')))) + $this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>'; + elseif (!Configuration::updateValue('MA_LAST_QTIES', (int)(Tools::getValue('MA_LAST_QTIES')))) + $this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>'; + else + $this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>'; + } + } + $this->_refreshProperties(); + } + + static public function getProductsAlerts($id_customer, $id_lang) + { + if (!Validate::isUnsignedId($id_customer) OR + !Validate::isUnsignedId($id_lang) + ) + die (Tools::displayError()); + + $sql = 'SELECT ma.`id_product`, s.quantity AS product_quantity, pl.`name`, ma.`id_product_attribute` + FROM `'._DB_PREFIX_.'mailalert_customer_oos` ma + JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ma.`id_product` + JOIN `'._DB_PREFIX_.'product_lang` pl ON pl.`id_product` = ma.`id_product` + LEFT JOIN '._DB_PREFIX_.'stock s ON s.id_product = p.id_product AND s.id_product_attribute = 0 '.Shop::sqlSharedStock('s').' + WHERE ma.`id_customer` = '.$id_customer.' + AND pl.`id_lang` = '.(int)$id_lang; + $products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + if (empty($products) === true OR !sizeof($products)) + return array(); + for ($i = 0; $i < sizeof($products); ++$i) + { + $obj = new Product($products[$i]['id_product'], false, (int)($id_lang)); + if (!Validate::isLoadedObject($obj)) + continue; + + if (isset($products[$i]['id_product_attribute']) AND + Validate::isUnsignedInt($products[$i]['id_product_attribute'])) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT al.`name` AS attribute_name + FROM `'._DB_PREFIX_.'product_attribute_combination` pac + LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`) + LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`) + LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pac.`id_product_attribute` = pa.`id_product_attribute`) + WHERE pac.`id_product_attribute` = '.(int)($products[$i]['id_product_attribute'])); + $products[$i]['attributes_small'] = ''; + if ($result) + foreach ($result AS $k => $row) + $products[$i]['attributes_small'] .= $row['attribute_name'].', '; + $products[$i]['attributes_small'] = rtrim($products[$i]['attributes_small'], ', '); + + // cover + $attrgrps = $obj->getAttributesGroups((int)($id_lang)); + foreach ($attrgrps AS $attrgrp) + if ($attrgrp['id_product_attribute'] == (int)($products[$i]['id_product_attribute']) AND $images = Product::_getAttributeImageAssociations((int)($attrgrp['id_product_attribute']))) + { + $products[$i]['cover'] = $obj->id.'-'.array_pop($images); + break; + } + } + if (!isset($products[$i]['cover']) OR !$products[$i]['cover']) + { + $images = $obj->getImages((int)($id_lang)); + foreach ($images AS $k => $image) + if ($image['cover']) + { + $products[$i]['cover'] = $obj->id.'-'.$image['id_image']; + break; + } + } + if (!isset($products[$i]['cover'])) + $products[$i]['cover'] = Language::getIsoById($id_lang).'-default'; + $products[$i]['link'] = $obj->getLink(); + $products[$i]['link_rewrite'] = $obj->link_rewrite; + } + return ($products); + } + + static public function deleteAlert($id_customer, $customer_email, $id_product, $id_product_attribute) + { + return Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos` + WHERE `id_customer` = '.(int)($id_customer).' + AND `customer_email` = \''.pSQL($customer_email).'\' + AND `id_product` = '.(int)($id_product).' + AND `id_product_attribute` = '.(int)($id_product_attribute)); + } + + public function hookDeleteProduct($params) + { + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos` WHERE `id_product` = '.(int)$params['product']->id); + } + + public function hookDeleteProductAttribute($params) + { + if ($params['deleteAllAttributes']) + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos` + WHERE `id_product` = '.(int)$params['id_product']); + else + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos` + WHERE `id_product_attribute` = '.(int)$params['id_product_attribute'].' + AND `id_product` = '.(int)$params['id_product']); + } +} \ No newline at end of file diff --git a/modules/mailalerts/mails/de/customer_qty.html b/modules/mailalerts/mails/de/customer_qty.html new file mode 100644 index 000000000..30d34c383 --- /dev/null +++ b/modules/mailalerts/mails/de/customer_qty.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Produkt verfügbar</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{product}ist nun verf&uuml;gbar.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Der Artikel ist nun wieder auf Lager.<br /><br />Gehen Sie auf die Produktseite, indem Sie auf diesen Link klicken: <a href="{product_link}">{product}</a><br /><br />Sie k&ouml;nnen ihn gleich in Ihrem Online-Shop bestellen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/de/customer_qty.txt b/modules/mailalerts/mails/de/customer_qty.txt new file mode 100644 index 000000000..b3887d79e --- /dev/null +++ b/modules/mailalerts/mails/de/customer_qty.txt @@ -0,0 +1,10 @@ +Hallo, + +Das Produkt {product} ist nun verfügbar. +Der Artikel ist nun wieder auf Lager. + +Gehen Sie auf die Produktseite, indem Sie auf diesen Link klicken: {product} + +Sie können ihn gleich in Ihrem Online-Shop bestellen. + +{shop_url} powered by PrestaShop™ diff --git a/modules/mailalerts/mails/de/new_order.html b/modules/mailalerts/mails/de/new_order.html new file mode 100644 index 000000000..f86c830b2 --- /dev/null +++ b/modules/mailalerts/mails/de/new_order.html @@ -0,0 +1,116 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Neue Bestellung</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Sie haben eine neue Bestellung erhalten von <strong style="color: #db3484;">{firstname} {lastname}</strong>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Einzelheiten zur Bestellung</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Bestellung: <strong><span style="color: #db3484;">{order_name}</span> ausgef&uuml;hrt am {date}</strong> <br />Zahlung: <strong>{payment}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">{items} +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-align: center;"> +<th style="width: 15%; padding: 0.6em 0;">Referenz</th><th>Produkt</th><th style="width: 15%; padding: 0.6em 0;">St&uuml;ckpreis</th><th style="width: 15%; padding: 0.6em 0;">Menge</th><th style="width: 20%; padding: 0.6em 0;">Gesamtpreis</th> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;" colspan="4">Produkte</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;">{total_products}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="4">Erm&auml;&szlig;igungen</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_discounts}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="4">Geschenkverpackung</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_wrapping}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;" colspan="4">Versand</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;">{total_shipping}</td> +</tr> +<tr style="text-align: right; font-weight: bold;"> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;" colspan="4">Gesamt bezahlt</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;">{total_paid}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Versand</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Lieferer: <strong>{carrier}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td> +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-transform: uppercase;"> +<th style="text-align: left; padding: 0.3em 1em;">LIEFERadressE</th><th style="text-align: left; padding: 0.3em 1em;">RECHNUNGSadressE</th> +</tr> +<tr> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{delivery_company} <br /><span style="color: #db3484; font-weight: bold;">{delivery_firstname} {delivery_lastname}</span> <br />{delivery_address1} <br />{delivery_address2} <br />{delivery_city} {delivery_postal_code} <br />{delivery_country} {delivery_state} <br />{delivery_phone} <br />{delivery_other}</td> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{invoice_company} <br /><span style="color: #db3484; font-weight: bold;">{invoice_firstname} {invoice_lastname}</span> <br />{invoice_address1} <br />{invoice_address2} <br />{invoice_city} {invoice_postal_code} <br />{invoice_country} {invoice_state} <br />{invoice_phone} <br />{invoice_other}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Kundennachricht</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>{message}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/de/new_order.txt b/modules/mailalerts/mails/de/new_order.txt new file mode 100644 index 000000000..5785f66ff --- /dev/null +++ b/modules/mailalerts/mails/de/new_order.txt @@ -0,0 +1,40 @@ +Hallo, + +Sie haben eine neue Bestellung erhalten von {firstname} {lastname} auf {shop_name}. + +Bestellung: {order_name} +Ausgeführt am: {date} +Lieferer: {carrier} +Zahlung: {payment} +Ermäßigungen: {total_discounts} +Versand: {total_shipping} +Produkte: {total_products} +Geschenkverpackung: {total_wrapping} +Gesamt bezahlt: {total_paid} + +Lieferadresse: + +{delivery_company} +{delivery_firstname} {delivery_lastname} +{delivery_address1} +{delivery_address2} +{delivery_postal_code} {delivery_city} +{delivery_country} {delivery_state} +{delivery_other} + +Rechnungsadresse: + +{invoice_company} +{invoice_firstname} {invoice_lastname} +{invoice_address1} +{invoice_address2} +{invoice_postal_code} {invoice_city} +{invoice_country} {invoice_state} +{invoice_other} + +Kundennachricht: + +{message} + + +{shop_name} powered with PrestaShop™ diff --git a/modules/mailalerts/mails/de/productoutofstock.html b/modules/mailalerts/mails/de/productoutofstock.html new file mode 100644 index 000000000..9ca6c0828 --- /dev/null +++ b/modules/mailalerts/mails/de/productoutofstock.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Ausverkauft</title> +</head> +<body> +<table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{product} ist fast ausverkauft.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Der verbleibende Lagerbestand liegt unter der festgelegten Mindestzahl von <strong>{last_qty}</strong>.<br /><br /><strong>Verbleibender Lagerbestand: <span style="color: #db3484;">{qty}</span></strong><br /><br />Wir raten Ihnen, die Produktseite im Administrator zu &ouml;ffnen, um Ihren Lagerbestand aufzuf&uuml;llen.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="versions/1.4.1.0/mails/en/%7Bshop_url%7D">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/de/productoutofstock.txt b/modules/mailalerts/mails/de/productoutofstock.txt new file mode 100644 index 000000000..73a9904c6 --- /dev/null +++ b/modules/mailalerts/mails/de/productoutofstock.txt @@ -0,0 +1,12 @@ +Hallo, + +Das Produkt {product} ist fast ausverkauft. +The remaining stock is now less than the specified minimum of {last_qty}. +Remaining stock : {qty} + + +Verbleibender Lagerbestand: {qty} + +Wir raten Ihnen, die Produktseite im Administrator zu öffnen, um Ihren Lagerbestand aufzufüllen. + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/mailalerts/mails/en/customer_qty.html b/modules/mailalerts/mails/en/customer_qty.html new file mode 100644 index 000000000..eac4a0435 --- /dev/null +++ b/modules/mailalerts/mails/en/customer_qty.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Product available</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{product} is now available.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Indeed, the item is once again in-stock.<br /><br /> + You can access the product page by clicking on the link: <a href="{product_link}">{product}</a><br /><br /> + You can order it right now from our on-line shop. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/mailalerts/mails/en/customer_qty.txt b/modules/mailalerts/mails/en/customer_qty.txt new file mode 100644 index 000000000..19c3d0ee4 --- /dev/null +++ b/modules/mailalerts/mails/en/customer_qty.txt @@ -0,0 +1,12 @@ +Hi, + +Product {product} is now available. +Indeed, the item is once again in-stock. + +You can access the product page on: {product_link} + +You can order it right now from our on-line shop. + + + +{shop_url} powered by PrestaShop™ diff --git a/modules/mailalerts/mails/en/new_order.html b/modules/mailalerts/mails/en/new_order.html new file mode 100644 index 000000000..4f9edbb57 --- /dev/null +++ b/modules/mailalerts/mails/en/new_order.html @@ -0,0 +1,125 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] New order</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left">You've a new order from <strong style="color:#DB3484;">{firstname} {lastname} ({email})</strong>.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Order details</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Order: <strong><span style="color:#DB3484;">{order_name}</span> placed on {date}</strong> + <br >Payment: <strong>{payment}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <tr style="background-color:#B9BABE; text-align:center;"> + <th style="width:15%; padding: 0.6em 0;">Reference</th> + <th>Product</th> + <th style="width:15%; padding: 0.6em 0;">Unit price</th> + <th style="width:15%; padding: 0.6em 0;">Quantity</th> + <th style="width:20%; padding: 0.6em 0;">Total price</th> + </tr> + {items} + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#B9BABE; padding:0.6em 0.4em;">Products</td> + <td style="background-color:#B9BABE; padding:0.6em 0.4em;">{total_products}</td> + </tr> + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#EBECEE; padding:0.6em 0.4em;">Discounts</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_discounts}</td> + </tr> + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#EBECEE; padding:0.6em 0.4em;">Gift-wrapping</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_wrapping}</td> + </tr> + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#DDE2E6; padding:0.6em 0.4em;">Shipping</td> + <td style="background-color:#DDE2E6; padding:0.6em 0.4em;">{total_shipping}</td> + </tr> + <tr style="text-align:right; font-weight:bold;"> + <td colspan="4" style="background-color:#F1AECF; padding:0.6em 0.4em;">Total paid</td> + <td style="background-color:#F1AECF; padding:0.6em 0.4em;">{total_paid}</td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Shipping</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Carrier: <strong>{carrier}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <tr style="background-color:#B9BABE; text-transform:uppercase;"> + <th style="text-align:left; padding: 0.3em 1em;">Delivery address</th> + <th style="text-align:left; padding: 0.3em 1em;">Billing address</th> + </tr> + <tr> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {delivery_company} + <br><span style="color:#DB3484; font-weight:bold;">{delivery_firstname} {delivery_lastname}</span> + <br>{delivery_address1} + <br>{delivery_address2} + <br>{delivery_city} {delivery_postal_code} + <br>{delivery_country} {delivery_state} + <br>{delivery_phone} + <br>{delivery_other} + </td> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {invoice_company} + <br><span style="color:#DB3484; font-weight:bold;">{invoice_firstname} {invoice_lastname}</span> + <br>{invoice_address1} + <br>{invoice_address2} + <br>{invoice_city} {invoice_postal_code} + <br>{invoice_country} {invoice_state} + <br>{invoice_phone} + <br>{invoice_other} + </td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Customer message</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <strong>{message}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/mailalerts/mails/en/new_order.txt b/modules/mailalerts/mails/en/new_order.txt new file mode 100644 index 000000000..97dd3f4f4 --- /dev/null +++ b/modules/mailalerts/mails/en/new_order.txt @@ -0,0 +1,41 @@ +Hi, + +You've a new order from {firstname} {lastname} ({email}) on {shop_name}. + +Order: {order_name} +Placed on : {date} +Carrier : {carrier} +Payment: {payment} +Discounts: {total_discounts} +Shipping: {total_shipping} +Products: {total_products} +Gift-wrapping: {total_wrapping} +Total paid: {total_paid} + +Delivery address: + +{delivery_company} +{delivery_firstname} {delivery_lastname} +{delivery_address1} +{delivery_address2} +{delivery_postal_code} {delivery_city} +{delivery_country} {delivery_state} +{delivery_other} + +Billing address: + +{invoice_company} +{invoice_firstname} {invoice_lastname} +{invoice_address1} +{invoice_address2} +{invoice_postal_code} {invoice_city} +{invoice_country} {invoice_state} +{invoice_other} + +Customer message: + +{message} + + + +{shop_url} powered by PrestaShop™ diff --git a/modules/mailalerts/mails/en/productoutofstock.html b/modules/mailalerts/mails/en/productoutofstock.html new file mode 100644 index 000000000..0f4122320 --- /dev/null +++ b/modules/mailalerts/mails/en/productoutofstock.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Out of stock</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{product} is nearly out of stock.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + The remaining stock is now less than the specified minimum of <strong>{last_qty}</strong>.<br /><br /> + <strong>Remaining stock: <span style="color:#DB3484;">{qty}</span></strong><br /><br /> + You are advised to open the product's admin Product Page in order to replenish your inventory. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> powered with <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/mailalerts/mails/en/productoutofstock.txt b/modules/mailalerts/mails/en/productoutofstock.txt new file mode 100644 index 000000000..7952a5241 --- /dev/null +++ b/modules/mailalerts/mails/en/productoutofstock.txt @@ -0,0 +1,11 @@ +Hi, + +The product {product} is nearly out of stock. +The remaining stock is now less than the specified minimum of {last_qty}. +Remaining stock : {qty} + +You are advised to open the product's admin Product Page in order to replenish your inventory. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/mailalerts/mails/es/customer_qty.html b/modules/mailalerts/mails/es/customer_qty.html new file mode 100644 index 000000000..ac3024610 --- /dev/null +++ b/modules/mailalerts/mails/es/customer_qty.html @@ -0,0 +1,35 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Producto disponible</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{product} ya est&aacute; disponible.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">De hecho, el tema es una vez m&aacute;s en acciones.<br /><br />Puede acceder a la p&aacute;gina del producto haciendo clic en el enlace: <a href="{product_link}">{product}</a><br /><br />Puede solicitar ahora mismo en nuestra tienda on-line.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/es/customer_qty.txt b/modules/mailalerts/mails/es/customer_qty.txt new file mode 100644 index 000000000..058328868 --- /dev/null +++ b/modules/mailalerts/mails/es/customer_qty.txt @@ -0,0 +1,12 @@ +Hola, + +Producto {product} ya está disponible. +De hecho, el tema es una vez más en acciones. + +Puede acceder a la página del producto en este enlace: {product_link} + +Puede solicitar ahora mismo en nuestra tienda on-line. + + + +{shop_url} powered by PrestaShop™ diff --git a/modules/mailalerts/mails/es/new_order.html b/modules/mailalerts/mails/es/new_order.html new file mode 100644 index 000000000..67a71b8e4 --- /dev/null +++ b/modules/mailalerts/mails/es/new_order.html @@ -0,0 +1,118 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Nuevo orden</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Has un nuevo orden de <strong style="color: #db3484;">{firstname} {lastname} ({email})</strong>.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Detalles del orden</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Orden: <strong><span style="color: #db3484;">{order_name}</span> puesto en {date}</strong> <br />De pago: <strong>{payment}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"> +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-align: center;"> +<th style="width: 15%; padding: 0.6em 0;">Referencia</th><th>Producto</th><th style="width: 15%; padding: 0.6em 0;">Precio unitario</th><th style="width: 15%; padding: 0.6em 0;">Cantidad</th><th style="width: 20%; padding: 0.6em 0;">El precio total</th> +</tr> +{items} +<tr style="text-align: right;"> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;" colspan="4">Productos</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;">{total_products}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="4">Descuentos</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_discounts}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="4">Envolver regalos</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_wrapping}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;" colspan="4">Transporte</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;">{total_shipping}</td> +</tr> +<tr style="text-align: right; font-weight: bold;"> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;" colspan="4">Total pagado</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;">{total_paid}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Transporte</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">Carrier: <strong>{carrier}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td> +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-transform: uppercase;"> +<th style="text-align: left; padding: 0.3em 1em;">Direcci&oacute;n de entrega</th><th style="text-align: left; padding: 0.3em 1em;">Direcci&oacute;n de facturaci&oacute;n</th> +</tr> +<tr> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{delivery_company} <br /><span style="color: #db3484; font-weight: bold;">{delivery_firstname} {delivery_lastname}</span> <br />{delivery_address1} <br />{delivery_address2} <br />{delivery_city} {delivery_postal_code} <br />{delivery_country} {delivery_state} <br />{delivery_phone} <br />{delivery_other}</td> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{invoice_company} <br /><span style="color: #db3484; font-weight: bold;">{invoice_firstname} {invoice_lastname}</span> <br />{invoice_address1} <br />{invoice_address2} <br />{invoice_city} {invoice_postal_code} <br />{invoice_country} {invoice_state} <br />{invoice_phone} <br />{invoice_other}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Customer message</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left"><strong>{message}</strong></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/es/new_order.txt b/modules/mailalerts/mails/es/new_order.txt new file mode 100644 index 000000000..498fabaaa --- /dev/null +++ b/modules/mailalerts/mails/es/new_order.txt @@ -0,0 +1,41 @@ +Hola, + +Has un nuevo orden de {firstname} {lastname} ({email}) en {shop_name}. + +Orden: {order_name} +Puesto en: {date} +Carrier: {carrier} +De pago: {payment} +Descuentos: {total_discounts} +Gastos de envío: {total_shipping} +Productos: {total_products} +Envolver regalos: {total_wrapping} +Total pagado: {total_paid} + +Dirección de entrega: + +{delivery_company} +{delivery_firstname} {delivery_lastname} +{delivery_address1} +{delivery_address2} +{delivery_postal_code} {delivery_city} +{delivery_country} {delivery_state} +{delivery_other} + +Dirección de facturación: + +{invoice_company} +{invoice_firstname} {invoice_lastname} +{invoice_address1} +{invoice_address2} +{invoice_postal_code} {invoice_city} +{invoice_country} {invoice_state} +{invoice_other} + +Mensaje al cliente: + +{message} + + + +{shop_url} desarrollado por PrestaShop™ diff --git a/modules/mailalerts/mails/es/productoutofstock.html b/modules/mailalerts/mails/es/productoutofstock.html new file mode 100644 index 000000000..34767318a --- /dev/null +++ b/modules/mailalerts/mails/es/productoutofstock.html @@ -0,0 +1,35 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Fuera de stock</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{product} est&aacute; fuera de stock</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td align="left">De hecho, la ruptura de stock de <strong>{last_qty}</strong> ha sido superado.<br /><br /><strong>Existencias restantes: <span style="color: #db3484;">{qty}</span></strong><br /><br />Se aconseja abrir administrador del producto Producto a fin de reponer el inventario.</td> +</tr> +<tr> +<td>&nbsp;</td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> desarrollado por <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> + +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/es/productoutofstock.txt b/modules/mailalerts/mails/es/productoutofstock.txt new file mode 100644 index 000000000..5470b39ed --- /dev/null +++ b/modules/mailalerts/mails/es/productoutofstock.txt @@ -0,0 +1,10 @@ +Hola, + +El producto {product} es pronto fuera de stock. +De hecho, la ruptura de stock de {last_qty} ha sido superado. +Existencias restantes: {qty} + +Se aconseja abrir administrador del producto Producto a fin de reponer el inventario. + + +{shop_url} desarrollado por PrestaShop™ \ No newline at end of file diff --git a/modules/mailalerts/mails/fr/customer_qty.html b/modules/mailalerts/mails/fr/customer_qty.html new file mode 100644 index 000000000..ca454af08 --- /dev/null +++ b/modules/mailalerts/mails/fr/customer_qty.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Produit disponible</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{product} est de nouveau disponible</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + En effet, le stock a &eacute;t&eacute; r&eacute;aprovisionn&eacute;.<br /><br /> + Vous pouvez acc&eacute;der à la page produit en cliquant sur le lien suivant: <a href="{product_link}">{product}</a><br /><br /> + Vous pouvez donc de nouveau commander ce produit depuis notre catalogue en ligne. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> propuls&eacute; par <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/mailalerts/mails/fr/customer_qty.txt b/modules/mailalerts/mails/fr/customer_qty.txt new file mode 100644 index 000000000..8a1678700 --- /dev/null +++ b/modules/mailalerts/mails/fr/customer_qty.txt @@ -0,0 +1,10 @@ +Bonjour, + +Le produit {product} est de nouveau disponible. +En effet, le stock a été réaprovisionné. + +Vous pouvez accéder à la page produit à ce lien: {product_link} + +Vous pouvez donc de nouveau commander ce produit depuis notre catalogue en ligne. + +{shop_url} réalisé par PrestaShop™ diff --git a/modules/mailalerts/mails/fr/new_order.html b/modules/mailalerts/mails/fr/new_order.html new file mode 100644 index 000000000..98bc84c16 --- /dev/null +++ b/modules/mailalerts/mails/fr/new_order.html @@ -0,0 +1,125 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Nouvelle commande</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"><strong style="color:#DB3484;">{firstname} {lastname} ({email})</strong> vient de passer une commande.</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">D&eacute;tails</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Commande <strong><span style="color:#DB3484;">{order_name}</span> pass&eacute;e le {date}</strong> + <br />Paiement : <strong>{payment}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <tr style="background-color:#B9BABE; text-align:center;"> + <th style="width:15%; padding: 0.6em 0;">R&eacute;f&eacute;rence</th> + <th>Article</th> + <th style="width:15%; padding: 0.6em 0;">Prix unitaire</th> + <th style="width:15%; padding: 0.6em 0;">Quantit&eacute;</th> + <th style="width:20%; padding: 0.6em 0;">Prix total</th> + </tr> + {items} + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#B9BABE; padding:0.6em 0.4em;">Produits</td> + <td style="background-color:#B9BABE; padding:0.6em 0.4em;">{total_products}</td> + </tr> + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#EBECEE; padding:0.6em 0.4em;">R&eacute;ductions</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_discounts}</td> + </tr> + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#EBECEE; padding:0.6em 0.4em;">Emballage cadeau</td> + <td style="background-color:#EBECEE; padding:0.6em 0.4em;">{total_wrapping}</td> + </tr> + <tr style="text-align:right;"> + <td colspan="4" style="background-color:#DDE2E6; padding:0.6em 0.4em;">Frais de port</td> + <td style="background-color:#DDE2E6; padding:0.6em 0.4em;">{total_shipping}</td> + </tr> + <tr style="text-align:right; font-weight:bold;"> + <td colspan="4" style="background-color:#F1AECF; padding:0.6em 0.4em;">Total</td> + <td style="background-color:#F1AECF; padding:0.6em 0.4em;">{total_paid}</td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Transport</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + Transporteur : <strong>{carrier}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td> + <table style="width:100%; font-family:Verdana,sans-serif; font-size:11px; color:#374953;"> + <tr style="background-color:#B9BABE; text-transform:uppercase;"> + <th style="text-align:left; padding: 0.3em 1em;">Adresse de livraison</th> + <th style="text-align:left; padding: 0.3em 1em;">Adresse de facturation</th> + </tr> + <tr> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {delivery_company} + <br><span style="color:#DB3484; font-weight:bold;">{delivery_firstname} {delivery_lastname}</span> + <br>{delivery_address1} + <br>{delivery_address2} + <br>{delivery_city} {delivery_postal_code} + <br>{delivery_country} {delivery_state} + <br>{delivery_phone} + <br>{delivery_other} + </td> + <td style="padding:0.5em 0 0.5em 0.5em; background-color:#EBECEE;"> + {invoice_company} + <br><span style="color:#DB3484; font-weight:bold;">{invoice_firstname} {invoice_lastname}</span> + <br>{invoice_address1} + <br>{invoice_address2} + <br>{invoice_city} {invoice_postal_code} + <br>{invoice_country} {invoice_state} + <br>{invoice_phone} + <br>{invoice_other} + </td> + </tr> + </table> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">Message client</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + <strong>{message}</strong> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> propuls&eacute; par <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/mailalerts/mails/fr/new_order.txt b/modules/mailalerts/mails/fr/new_order.txt new file mode 100644 index 000000000..c114d8dad --- /dev/null +++ b/modules/mailalerts/mails/fr/new_order.txt @@ -0,0 +1,39 @@ +Bonjour, + +Vous avez reçu une nouvelle commande de {firstname} {lastname} ({email}) sur {shop_name}. + +Commande : {order_name} +Date : {date} +Transporteur : {carrier} +Mode de paiement : {payment} +Bons d'achat et réductions : {total_discounts} +Frais d'expédition : {total_shipping} +Total produits : {total_products} +Emballage cadeau: {total_wrapping} +Total TTC : {total_paid} + +Adresse de livraison : + +{delivery_company} +{delivery_firstname} {delivery_lastname} +{delivery_address1} +{delivery_address2} +{delivery_postal_code} {delivery_city} +{delivery_country} {delivery_state} +{delivery_other} + +Adresse de facturation : + +{invoice_company} +{invoice_firstname} {invoice_lastname} +{invoice_address1} +{invoice_address2} +{invoice_postal_code} {invoice_city} +{invoice_country} {invoice_state} +{invoice_other} + +Message client : + +{message} + +{shop_url} réalisé par PrestaShop™ diff --git a/modules/mailalerts/mails/fr/productoutofstock.html b/modules/mailalerts/mails/fr/productoutofstock.html new file mode 100644 index 000000000..6526871c8 --- /dev/null +++ b/modules/mailalerts/mails/fr/productoutofstock.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Rupture de stock</title> +</head> +<body> + <table style="font-family:Verdana,sans-serif; font-size:11px; color:#374953; width: 550px;"> + <tr> + <td align="left"> + <a href="{shop_url}" title="{shop_name}"><img alt="{shop_name}" src="{shop_logo}" style="border:none;" ></a> + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left" style="background-color:#DB3484; color:#FFF; font-size: 12px; font-weight:bold; padding: 0.5em 1em;">{product} est en rupture de stock</td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="left"> + En effet, la quantit&eacute; est maintenant inf&eacute;rieure &agrave; <strong>{last_qty}</strong>.<br /><br /> + <strong>Stock restant : <span style="color:#DB3484;">{qty}</span></strong><br /><br /> + Nous vous conseillons de vous rendre sur la page produit du panneau d'administration afin de renouveler vos stocks. + </td> + </tr> + <tr><td>&nbsp;</td></tr> + <tr> + <td align="center" style="font-size:10px; border-top: 1px solid #D9DADE;"> + <a href="{shop_url}" style="color:#DB3484; font-weight:bold; text-decoration:none;">{shop_name}</a> propuls&eacute; par <a href="http://www.prestashop.com/" style="text-decoration:none; color:#374953;">PrestaShop™</a> + </td> + </tr> + </table> +</body> +</html> diff --git a/modules/mailalerts/mails/fr/productoutofstock.txt b/modules/mailalerts/mails/fr/productoutofstock.txt new file mode 100644 index 000000000..a1df8395d --- /dev/null +++ b/modules/mailalerts/mails/fr/productoutofstock.txt @@ -0,0 +1,9 @@ +Bonjour, + +Le produit {product} est bientôt en rupture de stock. +En effet, le seuil de rupture de stock de {last_qty} a été dépassé. +Stock restant : {qty} + +Nous vous conseillons de vous rendre sur la fiche du produit afin de renouveler vos stocks. + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/mailalerts/mails/it/customer_qty.html b/modules/mailalerts/mails/it/customer_qty.html new file mode 100644 index 000000000..fa3c7063a --- /dev/null +++ b/modules/mailalerts/mails/it/customer_qty.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Prodotto disponibile</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{product} &egrave; ora disponibile.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">L&#039;articolo &egrave; di nuovo in magazzino.<br /><br />Puoi accedere alla pagina del prodotto cliccando sul link: <a href="{product_link}">{product}</a><br /><br />Puoi ordinarlo fin d&#039;ora dal nostro negozio online.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/it/customer_qty.txt b/modules/mailalerts/mails/it/customer_qty.txt new file mode 100644 index 000000000..3e20851a8 --- /dev/null +++ b/modules/mailalerts/mails/it/customer_qty.txt @@ -0,0 +1,12 @@ +Salve, + +Il prodotto {product} è ora disponibile. +Infatti l'articolo è di nuovo in magazzino. + +Puoi accedere alla pagina del prodotto su: {product_link} + +Puoi ordinarlo fin d'ora dal nostro negozio online. + + + +{shop_url} powered by PrestaShop™ diff --git a/modules/mailalerts/mails/it/new_order.html b/modules/mailalerts/mails/it/new_order.html new file mode 100644 index 000000000..2bf351a7d --- /dev/null +++ b/modules/mailalerts/mails/it/new_order.html @@ -0,0 +1,116 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Nuovo ordine</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Hai un nuovo ordine da parte di <strong style="color: #db3484;">{firstname} {lastname}</strong>.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Dati dell&#039;ordine</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Ordine: <strong><span style="color: #db3484;">{order_name}</span> effettuato il {date}</strong> <br />Pagamento: <strong>{payment}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">{items} +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-align: center;"> +<th style="width: 15%; padding: 0.6em 0;">Riferimento</th> <th>Prodotto</th> <th style="width: 15%; padding: 0.6em 0;">Prezzo unitario</th><th style="width: 15%; padding: 0.6em 0;">Quantit&agrave;</th> <th style="width: 20%; padding: 0.6em 0;">Prezzo totale</th> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;" colspan="4">Prodotti</td> +<td style="background-color: #b9babe; padding: 0.6em 0.4em;">{total_products}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="4">Sconti</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_discounts}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;" colspan="4">Carta regalo</td> +<td style="background-color: #ebecee; padding: 0.6em 0.4em;">{total_wrapping}</td> +</tr> +<tr style="text-align: right;"> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;" colspan="4">Spedizione</td> +<td style="background-color: #dde2e6; padding: 0.6em 0.4em;">{total_shipping}</td> +</tr> +<tr style="text-align: right; font-weight: bold;"> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;" colspan="4">Totale pagato</td> +<td style="background-color: #f1aecf; padding: 0.6em 0.4em;">{total_paid}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Spedizione</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">Mezzo di spedizione: <strong>{carrier}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td> +<table style="width: 100%; font-family: Verdana,sans-serif; font-size: 11px; color: #374953;"> +<tbody> +<tr style="background-color: #b9babe; text-transform: uppercase;"> +<th style="text-align: left; padding: 0.3em 1em;">INDIRIZZO DI CONSEGNA</th> <th style="text-align: left; padding: 0.3em 1em;">INDIRIZZO DI FATTURAZIONE</th> +</tr> +<tr> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{delivery_company} <br /><span style="color: #db3484; font-weight: bold;">{delivery_firstname} {delivery_lastname}</span> <br />{delivery_address1} <br />{delivery_address2} <br />{delivery_city} {delivery_postal_code} <br />{delivery_country} {delivery_state} <br />{delivery_phone} <br />{delivery_other}</td> +<td style="padding: 0.5em 0 0.5em 0.5em; background-color: #ebecee;">{invoice_company} <br /><span style="color: #db3484; font-weight: bold;">{invoice_firstname} {invoice_lastname}</span> <br />{invoice_address1} <br />{invoice_address2} <br />{invoice_city} {invoice_postal_code} <br />{invoice_country} {invoice_state} <br />{invoice_phone} <br />{invoice_other}</td> +</tr> +</tbody> +</table> +</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">Messaggio cliente</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left"><strong>{message}</strong></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/it/new_order.txt b/modules/mailalerts/mails/it/new_order.txt new file mode 100644 index 000000000..6385c06ef --- /dev/null +++ b/modules/mailalerts/mails/it/new_order.txt @@ -0,0 +1,41 @@ +Salve, + +Hai un nuovo ordine da parte di {firstname} {lastname} su {shop_name}. + +Ordine: {order_name} +Effettuato il: {date} +Mezzo di spedizione: {carrier} +Pagamento: {payment} +Sconti: {total_discounts} +Spedizione: {total_shipping} +Prodotti: {total_products} +Carta regalo: {total_wrapping} +Totale pagato: {total_paid} + +Indirizzo di consegna: + +{delivery_company} +{delivery_firstname} {delivery_lastname} +{delivery_address1} +{delivery_address2} +{delivery_postal_code} {delivery_city} +{delivery_country} {delivery_state} +{delivery_other} + +Indirizzo di fatturazione: + +{invoice_company} +{invoice_firstname} {invoice_lastname} +{invoice_address1} +{invoice_address2} +{invoice_postal_code} {invoice_city} +{invoice_country} {invoice_state} +{invoice_other} + +Messaggio del cliente: + +{message} + + + +{shop_url} powered by PrestaShop™ diff --git a/modules/mailalerts/mails/it/productoutofstock.html b/modules/mailalerts/mails/it/productoutofstock.html new file mode 100644 index 000000000..d57cdd826 --- /dev/null +++ b/modules/mailalerts/mails/it/productoutofstock.html @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>[{shop_name}] Prodotto esaurito</title> +</head> +<body> + <table style="font-family: Verdana,sans-serif; font-size: 11px; color: #374953; width: 550px;"> +<tbody> +<tr> +<td align="left"><a title="{shop_name}" href="{shop_url}"><img style="border: none;" src="{shop_logo}" alt="{shop_name}" /></a></td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="background-color: #db3484; color: #fff; font-size: 12px; font-weight: bold; padding: 0.5em 1em;" align="left">{product} &egrave; quasi esaurito.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td align="left">La quantit&agrave; rimanente &egrave; adesso inferiore al minimo previsto di&nbsp;<strong>{last_qty}</strong>.<br /><br /> <strong>Stock rimanente: <span style="color: #db3484;">{qty}</span></strong><br /><br />Ti consigliamo di aprire la Pagina Prodotto dell&#039;admin prodotti per rifornire il tuo inventario.</td> +</tr> +<tr> +<td></td> +</tr> +<tr> +<td style="font-size: 10px; border-top: 1px solid #D9DADE;" align="center"><a style="color: #db3484; font-weight: bold; text-decoration: none;" href="{shop_url}">{shop_name}</a> powered with <a style="text-decoration: none; color: #374953;" href="http://www.prestashop.com/">PrestaShop&trade;</a></td> +</tr> +</tbody> +</table> +</body> +</html> \ No newline at end of file diff --git a/modules/mailalerts/mails/it/productoutofstock.txt b/modules/mailalerts/mails/it/productoutofstock.txt new file mode 100644 index 000000000..3da41f042 --- /dev/null +++ b/modules/mailalerts/mails/it/productoutofstock.txt @@ -0,0 +1,11 @@ +Salve, + +Il prodotto {product} è quasi esaurito. +La quantità rimanente è adesso inferiore del minimo previsto di {last_qty}. +Stock rimanente: {qty} + +Ti consigliamo di aprire la Pagina Prodotto dell'admin prodotti per rifornire il tuo inventorio. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/mailalerts/my-account.tpl b/modules/mailalerts/my-account.tpl new file mode 100644 index 000000000..ebf5dc88f --- /dev/null +++ b/modules/mailalerts/my-account.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<!-- MODULE MailAlerts --> +<li> + <a href="{$base_dir_ssl}modules/mailalerts/myalerts.php" title="{l s='My alerts' mod='mailalerts'}"><img src="{$module_template_dir}logo.gif" alt="{l s='alerts' mod='mailalerts'}" class="icon" /></a> + <a href="{$base_dir_ssl}modules/mailalerts/myalerts.php" title="{l s='My alerts' mod='mailalerts'}">{l s='My alerts' mod='mailalerts'}</a> +</li> +<!-- END : MODULE MailAlerts --> \ No newline at end of file diff --git a/modules/mailalerts/myalerts.php b/modules/mailalerts/myalerts.php new file mode 100644 index 000000000..8ba31bd46 --- /dev/null +++ b/modules/mailalerts/myalerts.php @@ -0,0 +1,65 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include_once(dirname(__FILE__).'/mailalerts.php'); + +$errors = array(); + +if ($cookie->isLogged()) +{ + if (Tools::getValue('action') == 'delete') + { + $id_customer = (int)($cookie->id_customer); + if (!$id_product = (int)(Tools::getValue('id_product'))) + $errors[] = Tools::displayError('You must have a product to delete an alert.'); + $id_product_attribute = (int)(Tools::getValue('id_product_attribute')); + $customer = new Customer((int)($id_customer)); + MailAlerts::deleteAlert((int)($id_customer), 0, (int)($id_product), (int)($id_product_attribute)); + } + $smarty->assign('alerts', MailAlerts::getProductsAlerts((int)($cookie->id_customer), (int)($cookie->id_lang))); +} +else + $errors[] = Tools::displayError('You must be logged in to manage your alerts.'); + +$smarty->assign(array( + 'id_customer' => (int)($cookie->id_customer), + 'errors' => $errors +)); + +if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/mailalerts/myalerts.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/mailalerts/myalerts.tpl'); +elseif (Tools::file_exists_cache(dirname(__FILE__).'/myalerts.tpl')) + $smarty->display(dirname(__FILE__).'/myalerts.tpl'); +else + echo Tools::displayError('No template found'); + +include(dirname(__FILE__).'/../../footer.php'); diff --git a/modules/mailalerts/myalerts.tpl b/modules/mailalerts/myalerts.tpl new file mode 100644 index 000000000..2ac6f41a1 --- /dev/null +++ b/modules/mailalerts/myalerts.tpl @@ -0,0 +1,79 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +<script type="text/javascript"> +//<![CDATA[ + var baseDir = '{$base_dir_ssl}'; +//]]> +</script> + +<div id="myalerts"> + {capture name=path}<a href="{$link->getPageLink('my-account', true)}">{l s='My account' mod='mailalerts'}</a><span class="navigation-pipe">{$navigationPipe}</span>{l s='My alerts' mod='mailalerts'}{/capture} + {include file="$tpl_dir./breadcrumb.tpl"} + + <h2>{l s='My alerts' mod='mailalerts'}</h2> + + {include file="$tpl_dir./errors.tpl"} + + {if $id_customer|intval neq 0} + {if $alerts} + <div id="block-history" class="block-center"> + <table class="std"> + <thead> + <tr> + <th class="first_item">{l s='Product' mod='mailalerts'}</th> + <th class="last_item" style="width:20px;">{l s='Delete' mod='mailalerts'}</th> + </tr> + </thead> + <tbody> + {foreach from=$alerts item=product name=i} + <tr> + <td class="first_item"> + <span style="float:left;"><a href="{$product.link|escape:'htmlall':'UTF-8'}"><img src="{$link->getImageLink($product.link_rewrite, $product.cover, 'small')}" alt="{$product.name|escape:'htmlall':'UTF-8'}" /></a></span> + <span style="float:left;"><a href="{$product.link|escape:'htmlall':'UTF-8'}">{$product.name|truncate:40:'...'|escape:'htmlall':'UTF-8'}</a> + {if isset($product.attributes_small)} + <br /><i>{$product.attributes_small|escape:'htmlall':'UTF-8'}</i> + {/if}</span> + </td> + <td class="align_center"> + <a href="{$base_dir_ssl}modules/mailalerts/myalerts.php?action=delete&id_product={$product.id_product}{if $product.id_product_attribute}&id_product_attribute={$product.id_product_attribute}{/if}"><img src="{$content_dir}modules/mailalerts/img/delete.gif" alt="{l s='Delete' mod='mailalerts'}" /></a> + </td> + </tr> + </tbody> + {/foreach} + </table> + </div> + <div id="block-order-detail">&nbsp;</div> + {else} + <p class="warning">{l s='You are not subscribed to any alerts.' mod='mailalerts'}</p> + {/if} + {/if} + + <ul class="footer_links"> + <li><a href="{$link->getPageLink('my-account', true)}"><img src="{$img_dir}icon/my-account.gif" alt="" class="icon" /></a><a href="{$link->getPageLink('my-account', true)}">{l s='Back to Your Account' mod='mailalerts'}</a></li> + <li><a href="{$base_dir}"><img src="{$img_dir}icon/home.gif" alt="" class="icon" /></a><a href="{$base_dir}">{l s='Home' mod='mailalerts'}</a></li> + </ul> +</div> diff --git a/modules/mailalerts/product.tpl b/modules/mailalerts/product.tpl new file mode 100644 index 000000000..1d2012976 --- /dev/null +++ b/modules/mailalerts/product.tpl @@ -0,0 +1,93 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} +<script type="text/javascript">{literal} +// <![CDATA[ +oosHookJsCodeFunctions.push('oosHookJsCodeMailAlert'); + +function clearText() { + if ($('#oos_customer_email').val() == 'your@email.com') + $('#oos_customer_email').val(''); +} + +function oosHookJsCodeMailAlert() { + $.ajax({ + type: 'POST', + url: '{/literal}{$base_dir}{literal}modules/mailalerts/mailalerts-ajax_check.php', + data: 'id_product={/literal}{$id_product}{literal}&id_product_attribute='+$('#idCombination').val(), + success: function (msg) { + if (msg == '0') { + $('#mailalert_link').show(); + $('#oos_customer_email').show(); + } + else { + $('#mailalert_link').hide(); + $('#oos_customer_email').hide(); + } + } + }); +} + +function addNotification() { + $.ajax({ + type: 'POST', + url: '{/literal}{$base_dir}{literal}modules/mailalerts/mailalerts-ajax_add.php', + data: 'id_product={/literal}{$id_product}{literal}&id_product_attribute='+$('#idCombination').val()+'&customer_email='+$('#oos_customer_email').val()+'', + success: function (msg) { + if (msg == '1') { + $('#mailalert_link').hide(); + $('#oos_customer_email').hide(); + $('#oos_customer_email_result').html("{/literal}{l s='Request notification registered' mod='mailalerts'}{literal}"); + $('#oos_customer_email_result').css('color', 'green').show(); + } + else { + $('#oos_customer_email_result').html("{/literal}{l s='Your e-mail address is invalid' mod='mailalerts'}{literal}"); + $('#oos_customer_email_result').css('color', 'red').show(); + } + } + }); + return false; +} + +$(document).ready(function() { + $('#oos_customer_email').bind('keypress', function(e) { + if(e.keyCode == 13) + { + addNotification(); + return false; + } + }); +}); +{/literal} +//]]> +</script> + +<!-- MODULE MailAlerts --> +{if isset($email) AND $email} + <input type="text" id="oos_customer_email" name="customer_email" size="20" value="your@email.com" class="mailalerts_oos_email" onclick="clearText();" /><br /> +{/if} +<a href="#" onclick="return addNotification();" id="mailalert_link">{l s='Notify me when available' mod='mailalerts'}</a> +<span id="oos_customer_email_result" style="display:none;"></span> +<!-- END : MODULE MailAlerts --> diff --git a/modules/mondialrelay/AdminMondialRelay.gif b/modules/mondialrelay/AdminMondialRelay.gif new file mode 100755 index 0000000000000000000000000000000000000000..7550096d4031efabf11da4324ce83acc8394bb9a GIT binary patch literal 800 zcmZ?wbhEHblw*)*IL5$`k|eTbRZUKw%9(Rpp5&EWadLSxZ^@HqS9;of-n8{RiHiC1 z>CKTtOIqq|zHHmFBuMAWr7I<IGIzW}{yclKrZ45qq$y`kt@(23NKKW=o4S@MlVYBv z<^1{eWzViDcW#}z<L2|`)txteQ_dV)Go{Jr%f2IjZr!QLQkgR=Cnrm0%ch=^BAq8? zHFxY>zN}jF<k_7!T|G~dQvQ7Va^%>WmL``kyY|$?$vg=P`Sb40n`v{-oZ9l`7|<e{ zH%%>brlmZ|0$TLv$)hWO?%nzS|3Aaf1d2ad7#SFx7<53+2gL~k`@aUKrskGbCk0te zYX*(BzWydDYcXaiErtm*n;E7v^f+m8&zhj5p*c@O!HLmwai2oZJO(8vJq@FEO**@U zjg1yH+cT&;*{{>xts~9M*eWHpbC-^&{IMC$T^F0Ib{mL0ZDQcPu#-*K(MeuMzKK^) zPe=EnvX0qFc>^{!i&r{qtquZj44y1HwjhOL@<E9wiyC#D9ej8`UDQ|XZf#DeRI2dp zU~J)5{IH^pw_&4On*hV^=Z6KGduK7+x!u}#fye)t+uId^3=er{_cXX9H!wN$vh!<L zd}(ozcHq}s#AUnV;DLUAu7nVcg%9QjD{>hLC@?a|hqG#5xVzy+My_60oqelMf};6M zCPlj!%Wj7rythES<TY>8hl2-qrG&q)TC*a&!{~Tq;+sW|#wS|&B_n($Z1A4TTlzv| z!))!AqPC-AuWM&09GT})zndlW!fx;5?wr5A+%$dmJ-MlL7YD~LMw^)nBy=hSJR+{& bzwWNuU|+t(?|6xGn`pfHljhQe4h+@+apWM2 literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/AdminMondialRelay.php b/modules/mondialrelay/AdminMondialRelay.php new file mode 100755 index 000000000..2951c91f0 --- /dev/null +++ b/modules/mondialrelay/AdminMondialRelay.php @@ -0,0 +1,219 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/classes/MondialRelayClass.php'); +require_once(dirname(__FILE__).'/mondialrelay.php'); + +class AdminMondialRelay extends AdminTab +{ + private $mondialrelay = NULL; + + public function __construct() + { + MondialRelay::initModuleAccess(); + + $this->table = 'mr_selected'; + $this->className = 'MondialRelayClass'; + + parent::__construct(); + } + + private function displayOrdersTable() + { + global $cookie; + + $mondialrelay = new MondialRelay(); + $order_state = new OrderState((int)(Configuration::get('MONDIAL_RELAY_ORDER_STATE')), $cookie->id_lang); + $mr_weight_coef = (int)(Configuration::get('MR_WEIGHT_COEF')); + + $html = ''; + + $html .= $this->l('To generate labels, you must register a correct address for your store on'). + ' <a href="index.php?tab=AdminContact&token='.Tools::getAdminToken('AdminContact'. + (int)(Tab::getIdFromClassName('AdminContact')).(int)($cookie->id_employee)).'" class="green">'. + $this->l('The contact page').'</a>'; + $html .= '<p>'.$this->l('All orders which have the state').' "<b>'.$order_state->name.'</b>"'; + $html .= '.&nbsp;<a href="index.php?tab=AdminModules&configure=mondialrelay&token='. + Tools::getAdminToken('AdminModules'.(int)(Tab::getIdFromClassName('AdminModules')). + (int)($cookie->id_employee)).'" class="green">' . $this->l('Change configuration') . '</a></p> + <div class="PS_MRErrorList error" id="otherErrors"> + <img src="'._PS_IMG_.'admin/error2.png" alt="" /> + <span></span> + </div>'; + + $orders = MondialRelay::getOrders(); + if (empty($orders)) + $html.= '<h3 style="color:red;">' . $this->l('No orders with this state.') . '</h3>'; + else + { + $html.= '<form method="post" action="'.$_SERVER['REQUEST_URI'].'">'; + $html.= "\n<table class=\"table\" id='orders'>"; + $html.= '<tr>'; + $html.= '<th>'.$this->l('Order ID').'</th>'; + $html.= '<th>'.$this->l('Customer').'</th>'; + $html.= '<th>'.$this->l('Total price').'</th>'; + $html.= '<th>'.$this->l('Total shipping').'</th>'; + $html.= '<th>'.$this->l('Date').'</th>'; + $html.= '<th>'.$this->l('Put a Weight (grams)').'</th>'; + $html.= '<th class="fixed"><a href="javascript:void(0);" id="toggleStatusOrderList">'.$this->l('Toggle selection').'</a><br /></th>'; + $html.= '<th>'.$this->l('MR Number').'</th>'; + $html.= '<th>'.$this->l('MR Country').'</th>'; + $html.= '<th>'.$this->l('Exp Number').'</th>'; + $html.= '<th>'.$this->l('Detail').'</th>'; + $html.= '</tr>'; + + foreach ($orders as $order) + { + if ($order['weight'] == 0) + { + $result_weight = Db::getInstance()->getRow(' + SELECT SUM(product_weight * product_quantity) as weight + FROM '._DB_PREFIX_.'order_detail + WHERE id_order = '.(int)($order['id_order'])); + $order['weight'] = round($mr_weight_coef * $result_weight['weight']); + } + + $html .= '<tr id="PS_MRLineOrderInformation-'.$order['id_order'].'">'; + $html .= '<td>'.$order['id_order'].'</td>'; + $html .= '<td>'.$order['customer'].'</td>'; + $html .= '<td>'.Tools::displayPrice($order['total'], new Currency($order['id_currency'])) . '</td>'; + $html .= '<td>'.Tools::displayPrice($order['shipping'], new Currency($order['id_currency'])) . '</td>'; + $html .= '<td>'.Tools::displayDate($order['date'], $order['id_lang']).'</td>'; + $html .= '<td><input type="text" name="weight_'.$order['id_order'].'" id="weight_' . $order['id_order'] . '" size="7" value="'.$order['weight'].'" /></td>'; + $html .= '<td><input type="checkbox" class="order_id_list" name="order_id_list[]" id="order_id_list" value="'.$order['id_order'].'" /></td>'; + $html .= '<td>'.$order['MR_Selected_Num'].'</td>'; + $html .= '<td>'.$order['MR_Selected_Pays'].'</td>'; + $html .= '<td>'.$order['exp_number'].'</td>'; + $html .= ' + <td class="center"> + <a href="index.php?tab=AdminOrders&id_order='.$order['id_order'].'&vieworder&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee)).'"> + <img border="0" title="'.$this->l('View').'" alt="'.$this->l('View').'" src="'._PS_IMG_.'admin/details.gif"/></a> + </td> + </tr> + <tr class="PS_MRErrorList error" id="errorCreatingTicket_'.$order['id_order'].'" style="display:none;"> + <td colspan="11" style="background:url('._PS_IMG_.'admin/error2.png) 10px 10px no-repeat;"> + <span></span> + </td> + </tr> + <tr class="PS_MRSuccessList" id="successCreatingTicket_'.$order['id_order'].'" style="display:none;"> + <td>'.$order['id_order'].'</td> + <td colspan="10" style="background:url('._PS_IMG_.'admin/ok2.png) 10px 5px no-repeat #DFFAD3;"> + '.$this->l('Operation successful').' + <span></span> + </td> + </tr>'; + } + $html .= ' + </table>'; + $html .= ' + <div class="submit_button"> + <div class="PS_MRSubmitButton" id="PS_MRSubmitButtonGenerateTicket"> + <input type="button" name="generate" id="generate" value="' . $this->l('Generate') . '" class="button" /> + </div> + <div class="PS_MRLoader" id="PS_MRSubmitGenerateLoader"><img src="'.MondialRelay::$moduleURL.'images/getTickets.gif"</div> + </div>'; + $html .= '</form>'; + } + unset($mondialrelay); + unset($order_state); + return $html; + } + + public function displayhistoriqueForm() + { + $mondialrelay = new MondialRelay(); + $_html = ''; + $query = "SELECT * FROM `" . _DB_PREFIX_ ."mr_historique` ORDER BY `id` DESC ;"; + $query = Db::getInstance()->ExecuteS($query); + + $_html.= ' + <fieldset> + <legend>' . $this->l('History of labels creation') . '</legend> + <div style="overflow-x: auto;overflow-y: scroller; height: 300px; padding-top: 0.6em;" > + <form method="post" action="'.$_SERVER['REQUEST_URI'].'"> + <table class="table" id="PS_MRHistoriqueTableList"> + <tbody> + <tr> + <th><a href="javascript:void(0);" id="toggleStatusHistoryList">' . $this->l('Toggle selection') . '</a></th> + <th>' . $this->l('Order ID') . '</th> + <th>' . $this->l('Exp num') . '</th> + <th>' . $this->l('Print stick A4') . '</th> + <th>' . $this->l('Print stick A5') . '</th> + </tr>'; + foreach ($query AS $k => $row) + { + $_html.= ' + <tr id="detailHistory_'.$row['order'].'"> + <td> + <input type="checkbox" id="PS_MRHistoryId_'.$row['id'].'" class="history_id_list" name="history_id_list[]" value="' . $row['id'] . '" /> + </td> + <td>'.$row['order'].'</td> + <td id="expeditionNumber_'.$row['order'].'">'.$row['exp'].'</td> + <td id="URLA4_'.$row['order'].'"> + <a href="'.$row['url_a4'].'" target="a4"><img width="20" src="'.MondialRelay::$moduleURL.'images/pdf_icon.jpg" /></a> + </td> + <td id="URLA5_'.$row['order'].'"> + <a href="'.$row['url_a5'].'" target="a5"><img width="20" src="'.MondialRelay::$moduleURL.'images/pdf_icon.jpg" /></a> + </td> + </tr>'; + } + $_html .= ' + </tbody> + </table> + <div class="PS_MRSubmitButton"> + <input type="button" id="PS_MRSubmitButtonDeleteHistories" name="deleteSelectedHistories" value="' . $this->l('Delete selected history') . '" class="button" /> + <div class="PS_MRLoader" id="PS_MRSubmitDeleteHistoriesLoader"> + <img src="'.MondialRelay::$moduleURL.'images/getTickets.gif" + </div> + </div> + </form></div></fieldset>'; + + return $_html; + } + + public function display() + { + $html = ''; + + // Allow to override the older jquery to use a new one :) + // Added for the 1.3 compatibility to keep using the recent code + if (_PS_VERSION_ < '1.4') + $html .= MondialRelay::getjQueryCompatibility(); + + $html .= ' + <script type="text/javascript" language="javascript"> + var _PS_MR_MODULE_DIR_ = "'.MondialRelay::$moduleURL.'"; + </script>'; + + $html .= $this->displayOrdersTable(); + $html .= '<br/><br/>'; + $html .= $this->displayhistoriqueForm(); + echo $html; + } +} + +?> diff --git a/modules/mondialrelay/ajax.php b/modules/mondialrelay/ajax.php new file mode 100755 index 000000000..b974aef44 --- /dev/null +++ b/modules/mondialrelay/ajax.php @@ -0,0 +1,105 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* + * File called by ajax. It's like a controler, you have to send the + * method name of the webservice and implement it. + * Each Name method allow to instanciate an object containing + * methods to manage correctly the data and name fields + */ + +require_once(realpath(dirname(__FILE__).'/../../config/config.inc.php')); + +if (Tools::getValue('mrtoken') != sha1('mr'._COOKIE_KEY_.'mrAgain')) + die; + +require_once(realpath(dirname(__FILE__).'/../../init.php')); +require(dirname(__FILE__).'/classes/MRCreateTickets.php'); +require(dirname(__FILE__).'/classes/MRGetTickets.php'); +require(dirname(__FILE__).'/classes/MRManagement.php'); + +$method = Tools::getValue('method'); +$params = array(); +$result = array(); + +// Method name allow to instanciate his object to properly call the +// implemented interface method and do his job +switch($method) +{ + case 'MRCreateTickets': + $params['orderIdList'] = Tools::getValue('order_id_list'); + $params['totalOrder'] = Tools::getValue('numSelected'); + $params['weightList'] = Tools::getValue('weight_list'); + break; + case 'MRGetTickets': + $params['detailedExpeditionList'] = Tools::getValue('detailedExpeditionList'); + break; + case 'DeleteHistory': + $params['historyIdList'] = Tools::getValue('history_id_list'); + break; + // 1.3 compatibility to add carrier info when an user select one + case 'addSelectedCarrierToDB': + $params['cart'] = new Cart($cookie->id_cart); + // Sometimes the carrier id isn't set into the cart object + if (($id_carrier = Tools::getValue('id_carrier'))) + $params['cart']->id_carrier = $id_carrier; + break; + default: +} + +// Try to instanciate the method object name and call the necessaries method +try +{ + if (class_exists($method, false)) + { + $obj = new $method($params); + + // Verify that the class implement correctly the interface + // Else use a Management class to do some ajax stuff + if (($obj instanceof IMondialRelayWSMethod)) + { + $obj->init(); + $obj->send(); + $result = $obj->getResult(); + } + unset($obj); + } + else if (($management = new MRManagement($params)) && + method_exists($management, $method)) + $result = $management->{$method}(); + else + throw new Exception('Method Class : '.$method.' can\'t be found'); + unset($management); +} +catch(Exception $e) +{ + echo MondialRelay::jsonEncode(array('other' => array('error' => array($e->getMessage())))); + exit(-1); +} +echo MondialRelay::jsonEncode($result); +exit(0); +?> \ No newline at end of file diff --git a/modules/mondialrelay/classes/IMondialRelayWSMethod.php b/modules/mondialrelay/classes/IMondialRelayWSMethod.php new file mode 100755 index 000000000..9bd66cfe7 --- /dev/null +++ b/modules/mondialrelay/classes/IMondialRelayWSMethod.php @@ -0,0 +1,60 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../errorCode.php'); +require_once(realpath(dirname(__FILE__).'/../mondialrelay.php')); +require_once(realpath(dirname(__FILE__).'/../lib/nusoap/nusoap.php')); + +/* + * This method allow to create any method object to dial more + * easyly with the Mondial Reelay WebService + */ +interface IMondialRelayWSMethod +{ + /* + * Initiate the data needed to be send properly + * Can manage a list of data for multiple request + */ + public function init(); + + /* + * Send one or multiple request to the webservice + */ + public function send(); + + /* + * Get the values with associated fields name + */ + public function getFieldsList(); + + /* + * Get the result of one or multiple send request + */ + public function getResult(); +} + +?> diff --git a/modules/mondialrelay/classes/MRCreateTickets.php b/modules/mondialrelay/classes/MRCreateTickets.php new file mode 100755 index 000000000..add1bdc1e --- /dev/null +++ b/modules/mondialrelay/classes/MRCreateTickets.php @@ -0,0 +1,527 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* + * Interface + */ +require_once(dirname(__FILE__).'/IMondialRelayWSMethod.php'); + +/* + * Allow to create tickets - 'WSI2_CreationEtiquette' + */ +class MRCreateTickets implements IMondialRelayWSMethod +{ + private $_fields = array( + 'id_mr_selected' => 0, + 'list' => array( + 'Enseigne' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z]{2}[0-9A-Z ]{6}$#'), + 'ModeCol' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^(CCC|CDR|CDS|REL)$#'), + 'ModeLiv' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^(LCC|LDR|LDS|24R|ESP|DRI)$#'), + 'NDossier' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|[0-9A-Z_ -]{0,15})$#'), + 'NClient' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|[0-9A-Z]{0,9})$#'), + 'Expe_Langage' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'Expe_Ad1' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{2,32}$#'), + 'Expe_Ad2' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{0,32}$#'), + 'Expe_Ad3' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{0,32}$#'), + 'Expe_Ad4' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z]{2}[0-9A-Z ]{6}$#'), + 'Expe_Ville' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z_\-\' ]{2,26}$#'), + 'Expe_CP' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9]{5}$#'), + 'Expe_Pays' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'Expe_Tel1' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^((00|\+)33|0)[0-9][0-9]{8}$#'), + 'Expe_Tel2' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^((00|\+)33|0)[0-9][0-9]{8}$#'), + 'Expe_Mail' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[\w\-\.\@_]{0,70}$#'), + 'Dest_Langage' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'Dest_Ad1' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{2,32}$#'), + 'Dest_Ad2' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{2,32}$#'), + 'Dest_Ad3' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{2,32}$#'), + 'Dest_Ad4' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{0,32}$#'), + 'Dest_Ville' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z_\-\' ]{2,26}$#'), + 'Dest_CP' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9]{5}$#'), + 'Dest_Pays' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'Dest_Tel1' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^((00|\+)33|0)[0-9][0-9]{8}$#'), + 'Dest_Tel2' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^((00|\+)33|0)[0-9][0-9]{8}$#'), + 'Dest_Mail' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[\w\-\.\@_]{0,70}$#'), + 'Poids' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9]{3,7}$#'), + 'Longueur' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9]{0,3}$#'), + 'Taille' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(XS|S|M|L|XL|XXL|3XL)$#'), + 'NbColis' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9]{1,2}$#'), + 'CRT_Valeur' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9]{1,7}$#'), + 'CRT_Devise' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|EUR)$#'), + 'Exp_Valeur' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9]{0,7}$#'), + 'Exp_Devise' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|EUR)$#'), + 'COL_Rel_Pays' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'COL_Rel' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|[0-9]{6})$#'), + 'LIV_Rel_Pays' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'LIV_Rel' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|[0-9]{6})$#'), + 'TAvisage' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|O|N)$#'), + 'TReprise' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|O|N)$#'), + 'Montage' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|[0-9]{1,3})$#'), + 'TRDV' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|O|N)$#'), + 'Assurance' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^(|[0-9A-Z]{1})$#'), + 'Instructions' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z_\-\'., /]{0,31}#'), + 'Security' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z]{32}$#'), + 'Texte' => array( + 'required' => false, + 'value' => '', + 'regexValidation' => '#^([^<>&\']{3,30})(\(cr\)[^<>&\']{0,30}){0,9}$#'))); + + private $_orderListId = NULL; + private $_totalOrder = 0; + private $_weightList = NULL; + private $_mondialRelay = NULL; + private $_fieldsList = array(); + private $_webServiceKey = ''; + private $_markCode = ''; + + private $_resultList = array( + 'error' => array(), + 'success' => array()); + + private $_webserviceURL = 'http://www.mondialrelay.fr/webservice/Web_Services.asmx?WSDL'; + + public function __construct($params) + { + $this->_orderListId = $params['orderIdList']; + $this->_totalOrder = $params['totalOrder']; + $this->_weightList = $params['weightList']; + $this->_webServiceKey = Configuration::get('MR_KEY_WEBSERVICE'); + $this->_markCode = Configuration::get('MR_CODE_MARQUE'); + } + + public function __destruct() + { + unset($this->_mondialRelay); + } + + /* + * Build a correct weight format (NNNNN) + */ + private function _weightFormat($weight) + { + while (strlen($weight) != 5) + $weight = '0'.$weight; + return $weight; + } + + /* + * Set the default value to the order paramaters + */ + private function _setRequestDefaultValue() + { + $this->_fields['list']['Enseigne']['value'] = Configuration::get('MR_ENSEIGNE_WEBSERVICE'); + $this->_fields['list']['Expe_Langage']['value'] = Configuration::get('MR_LANGUAGE'); + $this->_fields['list']['Expe_Ad1']['value'] = Configuration::get('PS_MR_SHOP_NAME'); + $this->_fields['list']['Expe_Ad3']['value'] = Configuration::get('PS_SHOP_ADDR1'); + $this->_fields['list']['Expe_Ad4']['value'] = Configuration::get('PS_SHOP_ADDR2'); + $this->_fields['list']['Expe_Ville']['value'] = Configuration::get('PS_SHOP_CITY'); + $this->_fields['list']['Expe_CP']['value'] = Configuration::get('PS_SHOP_CODE'); + + if (_PS_VERSION_ >= '1.4') + $this->_fields['list']['Expe_Pays']['value'] = Country::getIsoById(Configuration::get('PS_SHOP_COUNTRY_ID')); + else + $this->_fields['list']['Expe_Pays']['value'] = substr(Configuration::get('PS_SHOP_COUNTRY'), 0, 2); + + $this->_fields['list']['Expe_Tel1']['value'] = Configuration::get('PS_SHOP_PHONE'); + $this->_fields['list']['Expe_Mail']['value'] = Configuration::get('PS_SHOP_EMAIL'); + $this->_fields['list']['NbColis']['value'] = 1; + $this->_fields['list']['CRT_Valeur']['value'] = 0; + $this->_fields['list']['CRT_Devise']['value'] = 'EUR'; + } + + /* + * Initiate the data needed to be send properly + * Can manage a list of data for multiple request + */ + public function init() + { + $this->_mondialRelay = new MondialRelay(); + + if ($this->_totalOrder == 0) + throw new Exception($this->_mondialRelay->l('Please select at least one order')); + + $this->_setRequestDefaultValue(); + if (count($orderListDetails = $this->_mondialRelay->getOrders($this->_orderListId))) + { + foreach ($orderListDetails as $orderDetail) + { + // Storage temporary + $base = $this->_fields; + $tmp = &$base['list']; + + $deliveriesAddress = new Address($orderDetail['id_address_delivery']); + $customer = new Customer($orderDetail['id_customer']); + + // Store the weight order set by the user + foreach($this->_weightList as $orderWeightInfos) + { + $detail = explode('-', $orderWeightInfos); + if (count($detail) == 2 && $detail[1] == $orderDetail['id_order']) + $tmp['Poids']['value'] = $this->_weightFormat($detail[0]); + } + + $destIsoCode = Country::getIsoById($deliveriesAddress->id_country); + $tmp['ModeCol']['value'] = $orderDetail['mr_ModeCol']; + $tmp['ModeLiv']['value'] = $orderDetail['mr_ModeLiv']; + $tmp['NDossier']['value'] = $orderDetail['id_order']; + $tmp['NClient']['value'] = $orderDetail['id_customer']; + $tmp['Dest_Langage']['value'] = $destIsoCode; + $tmp['Dest_Ad1']['value'] = $deliveriesAddress->lastname; + $tmp['Dest_Ad2']['value'] = $deliveriesAddress->address2; + $tmp['Dest_Ad3']['value'] = $deliveriesAddress->address1; + $tmp['Dest_Ville']['value'] = $deliveriesAddress->city; + $tmp['Dest_CP']['value'] = $deliveriesAddress->postcode; + $tmp['Dest_Pays']['value'] = $destIsoCode; + $tmp['Dest_Tel1']['value'] = $deliveriesAddress->phone; + $tmp['Dest_Tel2']['value'] = $deliveriesAddress->phone_mobile; + $tmp['Dest_Mail']['value'] = $customer->email; + $tmp['Assurance']['value'] = $orderDetail['mr_ModeAss']; + + if ($orderDetail['MR_Selected_Num'] != 'LD1' && $orderDetail['MR_Selected_Num'] != 'LDS') + { + $tmp['LIV_Rel_Pays']['value'] = $orderDetail['MR_Selected_Pays']; + $tmp['LIV_Rel']['value'] = $orderDetail['MR_Selected_Num']; + } + + // Store the necessary information to the root case table + $base['id_mr_selected'] = $orderDetail['id_mr_selected']; + + // Add the temporary values to a field list for multiple request + $this->_fieldsList[] = $base; + unset($deliveriesAddress); + unset($customer); + } + $this->_generateMD5SecurityKey(); + } + } + + /* + * Generate the MD5 key for each param list + */ + private function _generateMD5SecurityKey() + { + // RootCase is the array case where the main information are stored + // it's an array containing id_mr_selected and an array with the necessary fields + foreach($this->_fieldsList as &$rootCase) + { + $concatenationValue = ''; + foreach($rootCase['list'] as $paramName => &$valueDetailed) + if ($paramName != 'Texte' && $paramName != 'Security') + { + $valueDetailed['value'] = strtoupper(MRManagement::replaceAccentedCharacters($valueDetailed['value'])); + if (preg_match($valueDetailed['regexValidation'], $valueDetailed['value'], $matches)) + $concatenationValue .= $valueDetailed['value']; + else if ((!strlen($valueDetailed['value']) && $valueDetailed['required']) || strlen($valueDetailed['value'])) + { + if (empty($valueDetailed['value'])) + $error = $this->_mondialRelay->l('This key').' ['.$paramName.'] '.$this->_mondialRelay->l('is empty and need to be filled'); + else + $error = 'This key ['.$paramName.'] hasn\'t a valid value format : '.$valueDetailed['value']; + $this->_resultList['error'][$rootCase['list']['NDossier']['value']][] = $error; + } + } + $concatenationValue .= $this->_webServiceKey; + $rootCase['list']['Security']['value' ] = strtoupper(md5($concatenationValue)); + } + } + + /* + * Update the tables used and send mail with the order history + */ + private function _updateTable($params, $expeditionNum, $ticketURL, $trackingURL, $id_mr_selected) + { + global $cookie; + + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'mr_selected` + SET `MR_poids` = \''.$params['Poids'].'\', + `exp_number` = \''.$expeditionNum.'\', + `url_etiquette` = \''.$ticketURL.'\', + `url_suivi` = \''.$trackingURL.'\' + WHERE id_mr_selected = '.(int)$id_mr_selected); + + // NDossier contains the id_order + $order = new Order($params['NDossier']); + + // Update the database for order and orderHistory + $order->shipping_number = $id_mr_selected; + $order->update(); + + $templateVars = array('{followup}' => $trackingURL); + + $history = new OrderHistory(); + $history->id_order = (int)($params['NDossier']); + $history->changeIdOrderState(_PS_OS_SHIPPING_, (int)($params['NDossier'])); + $history->id_employee = (int)($cookie->id_employee); + $history->addWithemail(true, $templateVars); + + unset($order); + unset($history); + } + + /* + * Manage the return value of the webservice, handle the errors or build the + * succeed message + */ + private function _parseResult($client, $result, $params, $id_mr_selected) + { + $errors = &$this->_resultList['error'][$params['NDossier']]; + $success = &$this->_resultList['success'][$params['NDossier']]; + + if ($client->fault) + $errors[] = $this->_mondialRelay->l('It seems the request isn\'t valid:'). + $result; + + $result = $result['WSI2_CreationEtiquetteResult']; + if (($errorNumber = $result['STAT']) != 0) + { + $errors[] = $this->_mondialRelay->l('There is an error number : ').$errorNumber; + $errors[] = $this->_mondialRelay->l('Details : '). + $this->_mondialRelay->getErrorCodeDetail($errorNumber); + } + else + { + $baseURL = 'http://www.mondialrelay.fr/'; + $expedition = $result['ExpeditionNum']; + $securityKey = strtoupper(md5('<'.$params['Enseigne'].$this->_markCode. + '>'.$expedition.'<'.$this->_webServiceKey.'>')); + $ticketURL = $baseURL.$result['URL_Etiquette']; + $trackingURL = $baseURL. + 'lg_fr/espaces/url/popup_exp_details.aspx?cmrq='.$params['Enseigne']. + $this->_markCode.'&nexp='.$expedition.'&crc='.$securityKey; + + $success['displayExpedition'] = $this->_mondialRelay->l('Expedition Number : ') . $expedition; + $success['displayTicketURL'] = $this->_mondialRelay->l('Ticket URL : ') . $ticketURL; + $success['displayTrackingURL'] = $this->_mondialRelay->l('Tracking URL: ') . $trackingURL; + $success['expeditionNumber'] = $expedition; + + $this->_updateTable($params, $expedition, $ticketURL, $trackingURL, $id_mr_selected); + } + } + + /* + * Send one or multiple request to the webservice + */ + public function send() + { + if ($client = new nusoap_client($this->_webserviceURL, true)) + { + $client->soap_defencoding = 'UTF-8'; + $client->decode_utf8 = false; + + foreach($this->_fieldsList as $rootCase) + { + $params = $this->_getSimpleParamArray($rootCase['list']); + $result = $client->call( + 'WSI2_CreationEtiquette', + $params, + 'http://www.mondialrelay.fr/webservice/', + 'http://www.mondialrelay.fr/webservice/WSI2_CreationEtiquette'); + + $this->_parseResult($client, $result, $params, $rootCase['id_mr_selected']); + } + unset($client); + } + else + throw new Exception($this->_mondialRelay->l('The Mondial Relay webservice isn\'t currently reliable')); + } + + /* + * Get the values with associated fields name + * @fields : array containing multiple values information + */ + private function _getSimpleParamArray($fields) + { + $params = array(); + + foreach($fields as $keyName => $valueDetailed) + $params[$keyName] = $valueDetailed['value']; + return $params; + } + + /* + * Return the fields list + */ + public function getFieldsList() + { + return $this->_fieldsList['list']; + } + + /* + * Return the result of one or multiple sent requests + */ + public function getResult() + { + return $this->_resultList; + } + + /* + * Return which number order of the list is currently managed + */ + static public function getCurrentRequestUnderTraitment() + { + // TODO: Build a SQL Query to know how many request have been executed + } +} +?> diff --git a/modules/mondialrelay/classes/MRGetTickets.php b/modules/mondialrelay/classes/MRGetTickets.php new file mode 100755 index 000000000..291ff5135 --- /dev/null +++ b/modules/mondialrelay/classes/MRGetTickets.php @@ -0,0 +1,265 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* + * Interface + */ +require_once(dirname(__FILE__).'/IMondialRelayWSMethod.php'); + +/* + * Allow to retrieve tickets - 'WSI2_GetEtiquettes' + */ +class MRGetTickets implements IMondialRelayWSMethod +{ + private $_fields = array( + 'list' => array( + 'Enseigne' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z]{2}[0-9A-Z ]{6}$#'), + 'Expeditions' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9]{8}(;[0-9]{8})*$#'), + 'Langue' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[A-Z]{2}$#'), + 'Security' => array( + 'required' => true, + 'value' => '', + 'regexValidation' => '#^[0-9A-Z]{32}$#'))); + + private $_detailedExpeditionList = array(); + private $_webServiceKey = ''; + private $_markCode = ''; + private $_mondialRelay = NULL; + + private $_resultList = array( + 'error' => array(), + 'success' => array()); + + private $_webserviceURL = 'http://www.mondialrelay.fr/webservice/Web_Services.asmx?WSDL'; + + public function __construct($params) + { + $this->_detailedExpeditionList = $params['detailedExpeditionList']; + $this->_webServiceKey = Configuration::get('MR_KEY_WEBSERVICE'); + $this->_markCode = Configuration::get('MR_CODE_MARQUE'); + } + + public function __destruct() + { + unset($this->_mondialRelay); + } + + public function init() + { + $this->_mondialRelay = new MondialRelay(); + + $this->_fields['list']['Enseigne']['value'] = Configuration::get('MR_ENSEIGNE_WEBSERVICE'); + $this->_fields['list']['Langue']['value'] = Configuration::get('MR_LANGUAGE'); + + foreach ($this->_detailedExpeditionList as $detailedExpedition) + { + // Storage temporary + $base = $this->_fields; + $tmp = &$base['list']; + + $tmp['Expeditions']['value'] = $detailedExpedition['expeditionNumber']; + $this->_fieldsList[] = $base; + } + $this->_generateMD5SecurityKey(); + } + + /* + * Generate the MD5 key for each param list + */ + private function _generateMD5SecurityKey() + { + // RootCase is the array case where the main information are stored + // it's an array containing id_mr_selected and an array with the necessary fields + foreach($this->_fieldsList as &$rootCase) + { + $concatenationValue = ''; + foreach($rootCase['list'] as $paramName => &$valueDetailed) + if ($paramName != 'Texte' && $paramName != 'Security') + { + $valueDetailed['value'] = strtoupper($valueDetailed['value']); + if (preg_match($valueDetailed['regexValidation'], $valueDetailed['value'], $matches)) + $concatenationValue .= $valueDetailed['value']; + else if ((!strlen($valueDetailed['value']) && $valueDetailed['required']) || strlen($valueDetailed['value'])) + { + $error = $this->_mondialRelay->l('This key').' ['.$paramName.'] '.$this->_mondialRelay->l('hasn\'t a valide value format').' : '.$valueDetailed['value']; + $id_order = $this->_getOrderIdWithExpeditionNumber($rootCase['list']['Expeditions']['value']); + $this->_resultList['error'][$id_order][] = $error; + } + } + $concatenationValue .= $this->_webServiceKey; + $rootCase['list']['Security']['value' ] = strtoupper(md5($concatenationValue)); + } + } + + /* + * Get the values with associated fields name + * @fields : array containing multiple values information + */ + private function _getSimpleParamArray($fields) + { + $params = array(); + + foreach($fields as $keyName => $valueDetailed) + $params[$keyName] = $valueDetailed['value']; + return $params; + } + + /* + * Update the history tables + */ + private function _updateTable($id_order, $expeditionNumber, $URLA4, $URLA5, &$success) + { + $query = ' + SELECT id FROM `'._DB_PREFIX_.'mr_historique` + WHERE `order`=\''.$id_order.'\''; + + $row = Db::getInstance()->getRow($query); + if ($row) + { + $query = ' + UPDATE `'._DB_PREFIX_.'mr_historique` + SET + `exp` = \''.(int)$expeditionNumber.'\', + `url_a4` = \''.(string)$URLA4.'\', + `url_a5` = \''.(string)$URLA5.'\' + WHERE `order` = \''.$id_order.'\''; + } + else + { + $query = ' + INSERT INTO '._DB_PREFIX_.'mr_historique + (`order`, `exp`, `url_a4`, `url_a5`) + VALUES ( + \''.(int)$id_order.'\', + \''.(int)$expeditionNumber.'\', + \''.(string)$URLA4.'\', + \''.(string)$URLA5.'\')'; + } + Db::getInstance()->Execute($query); + $success['id_mr_history'] = isset($row['id']) ? $row['id'] : Db::getInstance()->Insert_ID(); + } + + /* + * Manage the return value of the webservice, handle the errors or build the + * succeed message + */ + private function _parseResult($client, $result, $params) + { + $errors = array(); + $success = array(); + + $id_order = $this->_getOrderIdWithExpeditionNumber($params['Expeditions']); + if ($client->fault) + $errors[$errorTotal++] = $this->_mondialRelay->l('It seems the request isn\'t valid:'). + $result; + + $result = $result['WSI2_GetEtiquettesResult']; + if (($errorNumber = $result['STAT']) != 0) + { + $errors[] = $this->_mondialRelay->l('There is an error number : ').$errorNumber; + $errors[] = $this->_mondialRelay->l('Details : '). + $this->_mondialRelay->getErrorCodeDetail($errorNumber); + } + else + { + $baseURL = 'http://www.mondialrelay.fr'; + $URLPDF_A4 = $baseURL.$result['URL_PDF_A4']; + $URLPDF_A5 = $baseURL.$result['URL_PDF_A5']; + + $success['id_order'] = $id_order; + $success['expeditionNumber'] = $params['Expeditions']; + $success['URLPDF_A4'] = $URLPDF_A4; + $success['URLPDF_A5'] = $URLPDF_A5; + $this->_updateTable($id_order, $params['Expeditions'], $URLPDF_A4, $URLPDF_A5, $success); + } + $this->_resultList['error'][$id_order] = $errors; + $this->_resultList['success'][$id_order] = $success; + } + + /* + * Get the order id using the expedition number + */ + private function _getOrderIdWithExpeditionNumber($expeditionNumber) + { + foreach($this->_detailedExpeditionList as $detailedExpedition) + if ($detailedExpedition['expeditionNumber'] == $expeditionNumber) + return $detailedExpedition['id_order']; + return 0; + } + + /* + * Send one or multiple request to the webservice + */ + public function send() + { + if ($client = new nusoap_client($this->_webserviceURL, true)) + { + $client->soap_defencoding = 'UTF-8'; + $client->decode_utf8 = false; + + foreach($this->_fieldsList as $rootCase) + { + $params = $this->_getSimpleParamArray($rootCase['list']); + $result = $client->call( + 'WSI2_GetEtiquettes', + $params, + 'http://www.mondialrelay.fr/webservice/', + 'http://www.mondialrelay.fr/webservice/WSI2_GetEtiquettes'); + + $this->_parseResult($client, $result, $params); + } + unset($client); + } + else + throw new Exception($this->_mondialRelay->l('The Mondial Relay webservice isn\'t currently reliable')); + } + + /* + * Get the values with associated fields name + */ + public function getFieldsList() + { + return $this->_fieldsList['list']; + } + + /* + * Get the result of one or multiple send request + */ + public function getResult() + { + return $this->_resultList; + } +} \ No newline at end of file diff --git a/modules/mondialrelay/classes/MRManagement.php b/modules/mondialrelay/classes/MRManagement.php new file mode 100755 index 000000000..6a4321e87 --- /dev/null +++ b/modules/mondialrelay/classes/MRManagement.php @@ -0,0 +1,105 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(realpath(dirname(__FILE__).'/../mondialrelay.php')); + +class MRManagement extends MondialRelay +{ + private $_params = array(); + + private $_resultList = array( + 'error' => array(), + 'success' => array()); + + public function __construct($params) + { + $this->_params = $params; + + parent::__construct(); + } + + public function __destruct() + { + + } + + static public function replaceAccentedCharacters($string) + { + $currentLocale = setlocale(LC_ALL, NULL); + setlocale(LC_ALL, 'en_US.UTF8'); + $cleanedString = iconv('UTF-8','ASCII//TRANSLIT', $string); + setLocale(LC_ALL, $currentLocale); + return $cleanedString; + } + + /* + ** Retro compatibility for 1.3 + ** This method fill the database with the selected carrier + */ + public function addSelectedCarrierToDB() + { + $this->hookProcessCarrier($this->_params, false); + } + + public function DeleteHistory() + { + $success = array(); + $error = array(); + + if (is_array($this->_params['historyIdList']) && count($this->_params['historyIdList'])) + { + $query = ' + DELETE FROM `'._DB_PREFIX_.'mr_historique` + WHERE id IN('; + foreach($this->_params['historyIdList'] as $id) + $query .= (int)$id.', '; + $query = trim($query, ', ').')'; + + $success['deletedListId'] = $this->_params['historyIdList']; + $totalDeleted = Db::getInstance()->Execute($query); + if (count($success['deletedListId']) != $totalDeleted) + { + $error[] = $this->l('Some items can\'t be removed, please try to remove it again'); + foreach($success['deletedListId'] as $id) + { + $query = ' + SELECT id FROM `'._DB_PREFIX_.'mr_historique` + WHERE id='.(int)$id; + if (Db::getInstance()->getRow($query) && + ($key = array_search($id, $success['deletedListId'])) !== FALSE) + unset($success['deletedListId'][$key]); + } + } + $this->_resultList['success'] = $success; + $this->_resultList['other']['error'] = $error; + } + else + throw new Exception($this->l('Please select at least one history element')); + return $this->_resultList; + } +} +?> diff --git a/modules/mondialrelay/classes/MondialRelayClass.php b/modules/mondialrelay/classes/MondialRelayClass.php new file mode 100755 index 000000000..d82ea482e --- /dev/null +++ b/modules/mondialrelay/classes/MondialRelayClass.php @@ -0,0 +1,83 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class MondialRelayClass extends ObjectModel +{ + public $id_customer; + public $id_method; + public $id_cart; + public $id_order = NULL; + public $MR_poids = NULL; + public $MR_Selected_Num; + public $MR_Selected_LgAdr1; + public $MR_Selected_LgAdr2 = NULL; + public $MR_Selected_LgAdr3; + public $MR_Selected_LgAdr4 = NULL; + public $MR_Selected_CP; + public $MR_Selected_Ville; + public $MR_Selected_Pays; + public $url_suivi= NULL; + public $url_etiquette= NULL; + public $exp_number= NULL; + public $date_add; + public $date_upd; + + + protected $table = 'mr_selected'; + protected $identifier = 'id_mr_selected'; + + + public function getFields() + { + parent::validateFields(); + + if (isset($this->id_mr_selected)) + $fields['id_mr_selected'] = (int)($this->id_mr_selected); + + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_method'] = (int)($this->id_method); + $fields['id_cart'] = (int)($this->id_cart); + $fields['id_order'] = is_null($this->id_order) ? 0 : (int)($this->id_order); + $fields['MR_Selected_Num'] = pSQL($this->MR_Selected_Num); + $fields['MR_Selected_LgAdr1'] = pSQL($this->MR_Selected_LgAdr1); + $fields['MR_Selected_LgAdr2'] = pSQL($this->MR_Selected_LgAdr2); + $fields['MR_Selected_LgAdr3'] = pSQL($this->MR_Selected_LgAdr3); + $fields['MR_Selected_LgAdr4'] = pSQL($this->MR_Selected_LgAdr4); + $fields['MR_Selected_CP'] = (int)($this->MR_Selected_CP); + $fields['MR_Selected_Ville'] = pSQL($this->MR_Selected_Ville); + $fields['MR_Selected_Pays'] = pSQL($this->MR_Selected_Pays); + $fields['url_suivi'] = is_null($this->url_suivi) ? 0 : pSQL($this->url_suivi) ; + $fields['url_etiquette'] = is_null($this->url_etiquette) ? 0 : pSQL($this->url_etiquette) ; + $fields['exp_number'] = is_null($this->exp_number) ? 0 : pSQL($this->exp_number) ; + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + $fields['MR_poids'] = is_null($this->MR_poids) ? 0 : pSQL($this->MR_poids) ; + return $fields; + } +} + +?> diff --git a/modules/mondialrelay/config.xml b/modules/mondialrelay/config.xml new file mode 100755 index 000000000..2cba83db5 --- /dev/null +++ b/modules/mondialrelay/config.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<module> + <name>mondialrelay</name> + <displayName><![CDATA[Mondial Relay]]></displayName> + <version><![CDATA[1.6]]></version> + <description><![CDATA[Deliver in Relay points]]></description> + <author><![CDATA[]]></author> + <tab><![CDATA[shipping_logistics]]></tab> + <is_configurable>1</is_configurable> + <need_instance>1</need_instance> + <limited_countries></limited_countries> +</module> \ No newline at end of file diff --git a/modules/mondialrelay/cron.php b/modules/mondialrelay/cron.php new file mode 100755 index 000000000..2a69ec355 --- /dev/null +++ b/modules/mondialrelay/cron.php @@ -0,0 +1,76 @@ +<?php +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA <contact@prestashop.com> +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once('../../config/config.inc.php'); +include_once('mondialrelay.php'); + +if (Tools::getValue('secure_key') != Configuration::get('MONDIAL_RELAY_SECURE_KEY')) + exit; + +$expeditions = Db::getInstance()->ExecuteS(' +SELECT ms.`exp_number`, ms.`id_cart`, o.`id_order` +FROM `'._DB_PREFIX_.'mr_selected` ms +LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_cart` = ms.`id_cart`) +WHERE `exp_number` != 0'); + +if (empty($expeditions)) + exit; + +$params = array( +'Enseigne' => Configuration::get('MR_ENSEIGNE_WEBSERVICE'), +'Langue' => 'FR' +); + +require_once('kit_mondialrelay/tools/nusoap/lib/nusoap.php'); +$client_mr = new nusoap_client("http://www.mondialrelay.fr/webservice/Web_Services.asmx?WSDL", true); +$client_mr->soap_defencoding = 'UTF-8'; +$client_mr->decode_utf8 = false; + +foreach ($expeditions as $expedition) +{ + if ($expedition['id_order'] == NULL) + continue; + if (OrderHistory::getLastOrderState((int)($expedition['id_order']))->id == _PS_OS_DELIVERED_) + continue; + $params['Expedition'] = $expedition['exp_number']; + $params['Security'] = strtoupper(md5($params['Enseigne'].$params['Expedition'].'FR'.Configuration::get('MR_KEY_WEBSERVICE'))); + + $is_delivered = 0; + $result_mr = $client_mr->call('WSI2_TracingColisDetaille', $params, 'http://www.mondialrelay.fr/webservice/', 'http://www.mondialrelay.fr/webservice/WSI2_TracingColisDetaille'); + if (isset($result_mr['WSI2_TracingColisDetailleResult']['Tracing']['ret_WSI2_sub_TracingColisDetaille'])) + foreach ($result_mr['WSI2_TracingColisDetailleResult']['Tracing']['ret_WSI2_sub_TracingColisDetaille'] as $result) + if (isset($result['Libelle']) AND $result['Libelle'] == 'COLIS LIVRÉ') + $is_delivered = 1; + + if ($is_delivered == 1) + { + $history = new OrderHistory(); + $history->id_order = (int)($expedition['id_order']); + $history->changeIdOrderState((int)(_PS_OS_DELIVERED_), (int)($expedition['id_order'])); + $history->addWithemail(); + } +} diff --git a/modules/mondialrelay/de.php b/modules/mondialrelay/de.php new file mode 100644 index 000000000..e6960879d --- /dev/null +++ b/modules/mondialrelay/de.php @@ -0,0 +1,124 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2f84f9d5731852c4d07d52ef0badc42e'] = 'Problem beim Lesen der Adressen aus MondialRelay Webservice: Mondial Relay-Server kann abgeschaltet sein'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_016854c68c7122b18d89ff0f5e40502b'] = 'Es gibt keinen Relay Point in der Nähe Ihre eingegebenen Adresse. Ändern Sie die Adresse, oder wählen Sie eine andere Versandmethode'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_21034ae6d01a83e702839a72ba8a77b0'] = '(zzgl. MwSt.).'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. Mwst.)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e7a6ca4e744870d455a57b644f696457'] = 'Kostenlos!'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_44585fcd617dce6416d8283b026714c1'] = 'Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ed4a3b96dc1f38c160775cac1f7bcd6d'] = 'Liefern Sie in Relay-Punkten'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70d70ce314f545b7c500a086f147f64b'] = 'Ungültiger Shop'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_709b076565df5fa98cdb2528d897633d'] = 'Ungültiger Mark-Code'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c86508f5bc6b4456e7003d6a1868689d'] = 'Ungültiger Webservice Schlüssel'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ea9261a3dad976b40ff2088a19fda2c3'] = 'Ungültige Sprache'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_4eb287cc225ba0e1bcfe9cc1b8315def'] = 'Ungültiger Gewichtskoeffizient'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f82576de014726e9ef9b4ed2a9eb947b'] = 'Bitte konfigurieren Sie Ihre Mondial Relay-Konto-Einstellungen vor dem Erstellen eines Lieferanten'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70ff82d47f295f730c6accf07a2948e8'] = 'Ungültiger Lieferantennamen'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e1f1787db2fee596f4c3bfaf1d098f8d'] = 'Ungültiger Col-Modus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9414b7de379a09941e894d28f19949ae'] = 'Ungültiger Liefermodus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5eeb9ca7eee4be7192dd10d917f79a12'] = 'Ungültiger Assurance-Modus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8b446ac2013dc7085802de71cc342ead'] = 'Sie müssen mindestens ein Zustellungsland angeben'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9a85d87ae6dd77f2107734a4cd0bb15'] = 'Ungültiger Google-Schlüssel'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_979c6094728c14aac1b66d544dc5cebd'] = 'Ungültiger Bestellstatus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen erfolgreich aktualisiert'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_07213a0161f52846ab198be103b5ab43'] = 'Fehler'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_cb5e100e5a9a3e7f6d1fd97512215282'] = 'Fehler'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_350c1cc4343826a89f08a33bb49c6d98'] = 'Mondial Relay Bewertungsmodul konfigurieren'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d21a9f93917604d5490ad529a7cf1ff9'] = 'So erstellen Sie eine Mondial Relay Lieferanten'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6a2e6af5fff47adb3afd780b97d9b4b'] = 'Geben Sie Ihre Mondial Relay-Konto-Einstellungen ein und speichern Sie sie'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_abfc836cd1df9d6d2bdfd2fc98e6fa93'] = 'Erstellen Sie einen Lieferanten'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b962d8fb95f5a439f50502152f3bad71'] = 'Definieren Sie einen Preis für Ihren Lieferanten auf'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_faf1247ae6846a9955a466d4f301bbe4'] = 'Der Lieferanten-Seite'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_10d78806b84b97ebc774e9f6277af6ac'] = 'Um Labels zu generieren, müssen Sie eine gültige und registrierte Adresse Ihres Shops auf Ihrer'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_af5efea250326c1c34d69aa9364b482c'] = 'Kontakt-Seite haben'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ddcd6a653f661fd7d219d9102528b917'] = 'Gehen Sie zum Front-Office'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_fcf5b2122da1d5a5f5c7253b96a3f9d9'] = 'URL Cron Task:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_362dff77f7403550e886db901404856c'] = 'Löschen erfolgreich'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_66661dacf33146201b60dc16520ddd68'] = 'Fügen Sie eine Versandart hinzu'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b651efdb98a5d6bd2b3935d0c3f4a5e2'] = 'Erforderlich'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_531e144cc23ef08408b81cb4d9c641dc'] = 'Lieferantenname'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9b415ea1576b19d10d42b332798cd16'] = 'Sammel-Modus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d24262afca47ba80b691c878243441e8'] = 'Sammeln im Shop'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_201bdb87f8e278b943d07ae924d5de6e'] = 'Liefer-Modus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_142ef02888af88b8b772335277d1c0c8'] = 'Lieferung an einen Abholpunkt'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eeab8b7cf3c7a558a0e8a4050fa994ca'] = 'Colis Drive Lieferung'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8f7794b107749728c3333ef38d2687e8'] = 'Hauslieferung RDC (1 Person)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e451efc8ce05b96b214b4c2935f2c657'] = 'Besondere Hauslieferung (2 Personen)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eaff1bdf24fcffe0e14e29a1bff51a12'] = 'Versicherung'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_96ba408f20bc3e065f400c650d32fd1a'] = 'Keine Versicherung'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e5a8fafb1dfb538c172e1e014e86b871'] = 'Zusatzversicherung Lv1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b02f8d6d4b6217cca317161c87f64065'] = 'Zusatzversicherung Lv2'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_90b95ae88150c6a34c4129dc4f1ebbd5'] = 'Zusatzversicherung Lv3'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c15b40b8c535191f6f0b6f9beaced3cf'] = 'Zusatzversicherung LV4'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b67a442fff3ca0a03ea253b0668f946d'] = 'Zusatzversicherung Lv5'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_33cbd0d8b6476501f55a8320481ec0f1'] = 'Zustellländer:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_aef71ba4fd060dea2e2c76d1b5076caf'] = 'Halten Sie die die STRG-Taste gedrückt, um mehrere Länder zu wählen'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0309a6c666a7a803fdb9db95de71cf01'] = 'Frankreich'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6c1674d14bf5f95742f572cddb0641a7'] = 'Belgien'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_06630c890abadde9228ea818ce52b621'] = 'Luxemburg'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_907eba32d950bfab68227fd7ea22999b'] = 'Spanien'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0c24ec05a02c710cedd400e3680d8b81'] = 'Versandart-Liste'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_14039af96b01e718a9c9d9c1259b6472'] = 'Keine Versandmethoden erstellt'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8596361cec00f8d2438d264827eee737'] = 'Versand konfigurieren'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d02bbc3cb147c272b0445ac5ca7d1a36'] = 'Bestellstatus'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_818f954f4838ecad839c5dcbd287d291'] = 'Wählen Sie den Bestellstatus für Marken. Sie können die Marken auf'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5117e194c641ad4fc55417b554aead3c'] = 'der Mondial Relay Verwaltungsseite verwalten'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_235072af42d72915159f0e6c9d6a870c'] = 'Google map'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9c5c09beb32c36129b857c2a40c861b6'] = 'Anzeige einer Google-Karte auf Ihre Mondial Relay Lieferantenseite, kann das Laden der Lieferantenseite verlangsameN'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1ba3935c9858ffb8e19a35ca640b8505'] = 'Mondial Relay Kontoeinstellungen'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_12a3fbd35c1cab4b1101b91d708efd15'] = 'mr_marke_WebService:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6f0434b67007b555dfd1201f4e0d5254'] = 'mr_code_marke:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_08f785193c96b2a78dec8d76a46648d6'] = 'mr_Schlüssel_WebService:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dae2d7c71f2daaedb00191af25dc28d'] = 'mr_Sprache:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_a26329cba9723551cb8654deba32872b'] = 'mr_Gewicht_koef:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_99244b234ec089eca40ff9e8ec343e87'] = 'Gramm = 1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61cbc2d26b4157292673c772ddd6c0f7'] = 'Einstellungen aktualisieren'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2673bca5ba0a7871770e69c962e6ce38'] = 'Nb Versand:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dbe844fb964d5eca2f51be724e43294'] = 'Label URL'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6aefd5e2191e1210a2f50416812b517'] = 'Follow-up-URL'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61e70b58e38fd01daa254f44c4fa264b'] = 'Nb Abholpunkt:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bba366864d25056c941b72f18ef79e7c'] = 'Dieser Fehler ist nicht bekannt :'; +$_MODULE['<{mondialrelay}prestashop>orderdetail_81b7b4587a2a3ea7a0d6bb1df3fbba54'] = 'Lieferung nach'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_a1c3470a944b9625cfb924fd15c8bdbf'] = 'Bitte mindestens eine Bestellung auswählen'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_e6940b76f045c8bc0aaaa5b2476cdaf7'] = 'Die Anfrage scheint ungültig zu sein'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_c9b4de92f371ae545ad6f051c07d58ca'] = 'Fehler Nummer:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_ea5f761be4e4888eabf4e1501d7817d1'] = 'Detail:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_eabb11bf9623f08409a0a4c9d035a336'] = 'Expedition Nummer:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_b92c3d3319314513c547675924ceecd1'] = 'Ticket URL : '; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_66b793b6b4125e300717e8cf7449f533'] = 'Tracking URL: '; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_2653c23b8c0daac59571e4be5e8fa7d0'] = 'Der Webservice von Mondial Relay ist zu r Zeit nicht erreichbar'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_23e794a72c9b95b20a6c05cf7d3a17a5'] = 'Ihre Anfrage scheint ungültig zu sein: '; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_c9b4de92f371ae545ad6f051c07d58ca'] = 'Fehler:'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_ea5f761be4e4888eabf4e1501d7817d1'] = 'Details: '; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_2653c23b8c0daac59571e4be5e8fa7d0'] = 'Der Webservice von Mondial Relay ist zu r Zeit nicht erreichbar'; +$_MODULE['<{mondialrelay}prestashop>mrmanagement_a42bb0eaa485682166770a54469385f6'] = 'Einige Einträge konnten nicht entfernt werden, bitte versuchen Sie es noch einmal.'; +$_MODULE['<{mondialrelay}prestashop>mrmanagement_11744bfebb33e52be37a66a530b7045d'] = 'Bitte wählen Sie mindestens ein Verlaufselement aus'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_03f4a47830f97377a35321051685071e'] = 'Geschlossen'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_6f8522e0610541f1ef215a22ffa66ff6'] = 'Montag'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_5792315f09a5d54fb7e3d066672b507f'] = 'Dienstag'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_796c163589f295373e171842f37265d5'] = 'Mitwoch'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_78ae6f0cd191d25147e252dc54768238'] = 'Donnerstag'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_c33b138a163847cdb6caeeb7c9a126b4'] = 'Freitag'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samstag'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Sonntag'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_621895c388c9bb22abbbc69fad001846'] = 'Wählen Sie ein Relay Point aus'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3d2da0d2e731d59465a92f13216cf82d'] = 'Die Kontaktseite'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_de21dc13e1ea638777fbfad49f88b332'] = 'Alle Bestellugen, die den Status haben'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_2345e28c9b93f368968be4781ed70f5c'] = 'Konfiguration ändern'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_37c85a61df6352af7285c307022c4413'] = 'Keine Bestelungen mit diesem Status'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_d79cf3f429596f77db95c65074663a54'] = 'Bestell ID'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_ce26601dac0dea138b7295f02b7620a7'] = 'Kunde'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_0eede552438475bdfe820c13f24c9399'] = 'Gesamtpreis'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_f4e8b53a114e5a17d051ab84d326cae5'] = 'Versandkosten Gesamt'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_44749712dbec183e983dcd78a7736c41'] = 'Datum'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3715c824cbc0f966c61a72254f248a2e'] = 'Gewicht (Gramm)'; + +?> \ No newline at end of file diff --git a/modules/mondialrelay/en.php b/modules/mondialrelay/en.php new file mode 100755 index 000000000..957e3610a --- /dev/null +++ b/modules/mondialrelay/en.php @@ -0,0 +1,9 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mondialrelay}prestashop>mondialrelay_12a3fbd35c1cab4b1101b91d708efd15'] = 'Webservice Enseigne:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6f0434b67007b555dfd1201f4e0d5254'] = 'Code marque:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_08f785193c96b2a78dec8d76a46648d6'] = 'Webservice Key:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dae2d7c71f2daaedb00191af25dc28d'] = 'Etiquette\'s Language:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_a26329cba9723551cb8654deba32872b'] = 'Weight Coefficient:'; diff --git a/modules/mondialrelay/errorCode.php b/modules/mondialrelay/errorCode.php new file mode 100755 index 000000000..7b0e39c85 --- /dev/null +++ b/modules/mondialrelay/errorCode.php @@ -0,0 +1,79 @@ +<?php + +global $statCode; + +$statCode = array( + '1' => 'Enseigne invalide', + '2' => 'Numéro d\'enseigne vide ou inexistant', + '3' => 'Numéro de compte enseigne invalide', + '5' => 'Numéro de dossier enseigne invalide', + '7' => 'Numéro de client enseigne invalide', + '9' => 'Nom de ville non reconnu ou non unique', + '10' => 'Type de collecte invalide ou incorrect (1/D > Domicile -- 3/R > Relais)', + '11' => 'Numéro de Point Relais de collecte invalide', + '12' => 'Pays du Point Relais de collecte invalide', + '13' => 'Type de livraison invalide ou incorrect (1/D > Domicile -- 3/R > Relais)', + '14' => 'Numéro du Point Relais de livraison invalide', + '15' => 'Pays du Point Relais de livraison invalide', + '16' => 'Code pays invalide', + '17' => 'Adresse invalide', + '18' => 'Ville invalide', + '19' => 'Code postal invalide', + '20' => 'Poids du colis invalide', + '21' => 'Taille (Longueur + Hauteur) du colis invalide', + '22' => 'Taille du Colis invalide', + '24' => 'Numéro de Colis Mondial Relay invalide', + '29' => 'Mode de livraison invalide', + '30' => 'Adresse (L1) de l\'expéditeur invalide', + '31' => 'Adresse (L2) de l\'expéditeur invalide', + '33' => 'Adresse (L3) de l\'expéditeur invalide', + '34' => 'Adresse (L4) de l\'expéditeur invalide', + '35' => 'Ville de l\'expéditeur invalide', + '36' => 'Code postal de l\'expéditeur invalide', + '37' => 'Pays de l\'expéditeur invalide', + '38' => 'Numéro de téléphone de l\'expéditeur invalide', + '39' => 'Adresse e-mail de l\'expéditeur invalide', + '40' => 'Action impossible sans ville ni code postal', + '41' => 'Mode de livraison invalide', + '42' => 'Montant CRT invalide', + '43' => 'Devise CRT invalide', + '44' => 'Valeur du colis invalide', + '45' => 'Devise de la valeur du colis invalide', + '46' => 'Plage de numéro d\'expédition épuisée', + '47' => 'Nombre de colis invalide', + '48' => 'Multi-colis en Point Relais Interdit', + '49' => 'Mode de collecte ou de livraison invalide', + '50' => 'Adresse (L1) du destinataire invalide', + '51' => 'Adresse (L2) du destinataire invalide', + '53' => 'Adresse (L3) du destinataire invalide', + '54' => 'Adresse (L4) du destinataire invalide', + '55' => 'Ville du destinataire invalide', + '56' => 'Code postal du destinataire invalide', + '57' => 'Pays du destinataire invalide', + '58' => 'Numéro de téléphone du destinataire invalide', + '59' => 'Adresse e-mail du destinataire invalide', + '60' => 'Champ texte libre invalide', + '61' => 'Top avisage invalide', + '62' => 'Instruction de livraison invalide', + '63' => 'Assurance invalide ou incorrecte', + '64' => 'Temps de montage invalide', + '65' => 'Top rendez-vous invalide', + '66' => 'Top reprise invalide', + '70' => 'Numéro de Point Relais invalide', + '72' => 'Langue expéditeur invalide', + '73' => 'Langue destinataire invalide', + '74' => 'Langue invalide', + '80' => 'Code tracing : Colis enregistré', + '81' => 'Code tracing : Colis en traitement chez Mondial Relay', + '82' => 'Code tracing : Colis livré', + '83' => 'Code tracing : Anomalie', + '90' => 'AS400 indisponible', + '91' => 'Numéro d\'expédition invalide', + '94' => 'Colis Inexistant', + '95' => 'Compte Enseigne non activé', + '96' => 'Type d\'enseigne incorrect en Base', + '97' => 'Clé de sécurité invalide', + '98' => 'Service Indisponible', + '99' => 'Erreur générique du service. Cette erreur peut être dû autant à un problème technique du service qu\'à des données incorrectes ou inexistantes dans la Base de Données. Lorsque vous avez cette erreur veuillez la notifier à Mondial Relay en précisant la date et l\'heure de la connexion ainsi que les informations envoyés au WebService afin d\'effectuer une vérification.'); + +?> diff --git a/modules/mondialrelay/es.php b/modules/mondialrelay/es.php new file mode 100644 index 000000000..c9ff769c7 --- /dev/null +++ b/modules/mondialrelay/es.php @@ -0,0 +1,144 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_a25569b97604bddcfba04d7eb9950eeb'] = 'Para generar etiquetas, debe registrar una dirección correcta para su tienda'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3d2da0d2e731d59465a92f13216cf82d'] = 'La página de contacto'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_de21dc13e1ea638777fbfad49f88b332'] = 'Todos los pedidos que tengan un estado'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_2345e28c9b93f368968be4781ed70f5c'] = 'Cambio de configuración'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_37c85a61df6352af7285c307022c4413'] = 'No hay pedidos con este estado.'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_d79cf3f429596f77db95c65074663a54'] = 'ID del pedido'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_0eede552438475bdfe820c13f24c9399'] = 'El precio total'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_f4e8b53a114e5a17d051ab84d326cae5'] = 'Total de gastos de envío'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_44749712dbec183e983dcd78a7736c41'] = 'Fecha'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3715c824cbc0f966c61a72254f248a2e'] = 'Ponga un peso (gramos)'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_5635c2608fff4c95a564aea8c6118b8c'] = 'Cambiar la selección'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_6ccc0fdff9995e1a0fce00c99e5b6085'] = 'Número MR'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_f9c50cba4de9032d7a6797a2458f8ed9'] = 'País RM '; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_428c091372d840900cf8536519fa0056'] = 'Número envío'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_a254c25adc7d10d7e9c4889484f875a5'] = 'Detalle'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_4351cfebe4b61d8aa5efa1d020710005'] = 'Ver'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_2e01172e31495f41fcebcf3f831cc82c'] = 'Operación realizada con éxito'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_32b919d18cfaca89383f6000dcc9c031'] = 'Generar'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_4f1a377c20ace646ddd303ad1e1d243d'] = 'Historia de la creación de etiquetas'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_e1a98101d56e29eeea312a0eb2748a92'] = 'Exp. número'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_aab39f783ba2e72eaad1770f4d9ad0c4'] = 'Imprimir etiqutea en formato A4'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3eb2bc1ee46258d2a166e89398756b3e'] = 'Imprimir etiqueta en formato A5 '; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_fa98e6528c9df7f26978c2beb7de3d99'] = 'Borrar los historiales seleccionados'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_44585fcd617dce6416d8283b026714c1'] = 'Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ed4a3b96dc1f38c160775cac1f7bcd6d'] = 'Entregue sus envíos en un punto de recogida '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70d70ce314f545b7c500a086f147f64b'] = 'Tienda no válida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_709b076565df5fa98cdb2528d897633d'] = 'Código Marca no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c86508f5bc6b4456e7003d6a1868689d'] = 'Clave Webservice no válida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ea9261a3dad976b40ff2088a19fda2c3'] = 'Idioma no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_4eb287cc225ba0e1bcfe9cc1b8315def'] = 'Coeficiente de peso no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f82576de014726e9ef9b4ed2a9eb947b'] = 'Antes de crear un transportista, debe configurar los parámetros de su cuenta Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70ff82d47f295f730c6accf07a2948e8'] = 'Nombre del transportista no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e1f1787db2fee596f4c3bfaf1d098f8d'] = 'Modo Col no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9414b7de379a09941e894d28f19949ae'] = 'Modo de entrega no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5eeb9ca7eee4be7192dd10d917f79a12'] = 'Seguro no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8b446ac2013dc7085802de71cc342ead'] = 'Debe elegir al menos un país de entrega'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9a85d87ae6dd77f2107734a4cd0bb15'] = 'Clave Google no válida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_979c6094728c14aac1b66d544dc5cebd'] = 'Estado de pedido no válido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_808fb4e3a637a759565de1d314ea526f'] = 'La dirección principal entrada no tiene un buen formato'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c888438d14855d7d96a2724ee9c306bd'] = 'Se ha actualizado con éxito'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_07213a0161f52846ab198be103b5ab43'] = 'errores'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_cb5e100e5a9a3e7f6d1fd97512215282'] = 'error'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_350c1cc4343826a89f08a33bb49c6d98'] = 'Configuración del módulo Relay Rate'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d21a9f93917604d5490ad529a7cf1ff9'] = 'Para crear un transportista Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6a2e6af5fff47adb3afd780b97d9b4b'] = 'Introduzca y guarde los parámetros de la cuenta Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_abfc836cd1df9d6d2bdfd2fc98e6fa93'] = 'Crear un transportista'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b962d8fb95f5a439f50502152f3bad71'] = 'Deafina un precio para sus transportista en'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_faf1247ae6846a9955a466d4f301bbe4'] = 'La página de transportistas'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_10d78806b84b97ebc774e9f6277af6ac'] = 'Para generar sus etiquetas, debe haber introducido una dirección correcta de su tienda en'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_af5efea250326c1c34d69aa9364b482c'] = 'página contacto'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_fcf5b2122da1d5a5f5c7253b96a3f9d9'] = 'URL del cron para lanzar la actualización de los pedidos'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_362dff77f7403550e886db901404856c'] = 'Borrado con éxito'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_66661dacf33146201b60dc16520ddd68'] = 'Añadir un transportista'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b651efdb98a5d6bd2b3935d0c3f4a5e2'] = 'Campo obligatorio'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_531e144cc23ef08408b81cb4d9c641dc'] = 'Nombre del transportista'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9b415ea1576b19d10d42b332798cd16'] = 'Modo de recogida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d24262afca47ba80b691c878243441e8'] = 'Recogida en la tienda'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_201bdb87f8e278b943d07ae924d5de6e'] = 'Modo de entraga'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_142ef02888af88b8b772335277d1c0c8'] = 'Entrega en Punto de recogida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eeab8b7cf3c7a558a0e8a4050fa994ca'] = 'Entrega Colis Drive'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8f7794b107749728c3333ef38d2687e8'] = 'Entrega a domicilio RDC (1 persona)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e451efc8ce05b96b214b4c2935f2c657'] = 'Entrega a domicilio especializada (2 personas)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eaff1bdf24fcffe0e14e29a1bff51a12'] = 'Seguro'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_96ba408f20bc3e065f400c650d32fd1a'] = 'Sin seguro'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e5a8fafb1dfb538c172e1e014e86b871'] = 'Seguro complementario N1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b02f8d6d4b6217cca317161c87f64065'] = 'Seguro complementario N2'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_90b95ae88150c6a34c4129dc4f1ebbd5'] = 'Seguro complementario N3'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c15b40b8c535191f6f0b6f9beaced3cf'] = 'Seguro complementario N4'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b67a442fff3ca0a03ea253b0668f946d'] = 'Seguro complementario N5'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_33cbd0d8b6476501f55a8320481ec0f1'] = 'Lista de países :'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_aef71ba4fd060dea2e2c76d1b5076caf'] = 'Puede elegir varios países pulsando Ctrl mientras selecciona los países'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0309a6c666a7a803fdb9db95de71cf01'] = 'Francia'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6c1674d14bf5f95742f572cddb0641a7'] = 'Bélgica'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_06630c890abadde9228ea818ce52b621'] = 'Luxemburgo'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_907eba32d950bfab68227fd7ea22999b'] = 'España'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0c24ec05a02c710cedd400e3680d8b81'] = 'Lista de transportistas'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_14039af96b01e718a9c9d9c1259b6472'] = 'No se ha creado ningún transportista'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8596361cec00f8d2438d264827eee737'] = 'Configuración transportista'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c437cbdaa5799236b2f5b07634679e3d'] = 'Los campos de personalización'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0eddbda2340214e74be063ed1d1af8a0'] = 'Dirección principal'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_7e9bbecd32836500b557db33c3b3e93b'] = 'La clave utilizada por Mondialrelay es'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_32963eea43914b6a418fb2fd9850beb9'] = 'y tiene el valor por defecto'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d02bbc3cb147c272b0445ac5ca7d1a36'] = 'Estado de los pedidos'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_818f954f4838ecad839c5dcbd287d291'] = 'Elija un estado para generar etiquetas. Puede administrar sus etiquetas en'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5117e194c641ad4fc55417b554aead3c'] = 'la página de administración de Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_235072af42d72915159f0e6c9d6a870c'] = 'Google map'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9c5c09beb32c36129b857c2a40c861b6'] = 'Muestra un Google map en su transportista Mondial Relay, pero la página de selección del transportista puede ralentizarse.'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1ba3935c9858ffb8e19a35ca640b8505'] = 'Parámetros de la cuenta Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_12a3fbd35c1cab4b1101b91d708efd15'] = 'Tienda WebService '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6f0434b67007b555dfd1201f4e0d5254'] = 'Código marca:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_08f785193c96b2a78dec8d76a46648d6'] = 'Clave Webservice:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dae2d7c71f2daaedb00191af25dc28d'] = 'Idioma:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_a26329cba9723551cb8654deba32872b'] = 'Coeficinte de peso:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_99244b234ec089eca40ff9e8ec343e87'] = 'gramos = 1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61cbc2d26b4157292673c772ddd6c0f7'] = 'Guardar cambios'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2673bca5ba0a7871770e69c962e6ce38'] = 'Número de expediciones'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dbe844fb964d5eca2f51be724e43294'] = 'URL de las etiquetas'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6aefd5e2191e1210a2f50416812b517'] = 'URL de los seguimientos'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61e70b58e38fd01daa254f44c4fa264b'] = 'Número de puntos recogida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bba366864d25056c941b72f18ef79e7c'] = 'Este error no se conoce:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2f84f9d5731852c4d07d52ef0badc42e'] = 'Problemas para obtener las direcciones de servicio web MondialRelay: los servidores de Mondial Relay pueden estar fuera de servicio'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_016854c68c7122b18d89ff0f5e40502b'] = 'No hay Punto de entrega cerca de su domicilio, por favor cambie su dirección o utilice otro modo de transporte'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_21034ae6d01a83e702839a72ba8a77b0'] = '(sin IVA)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1f87346a16cf80c372065de3c54c86d9'] = '(IVA incluido)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e7a6ca4e744870d455a57b644f696457'] = '¡Gratis!'; +$_MODULE['<{mondialrelay}prestashop>orderdetail_81b7b4587a2a3ea7a0d6bb1df3fbba54'] = 'Entregado a'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_a1c3470a944b9625cfb924fd15c8bdbf'] = 'Por favor, seleccione al menos un pedido'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_dc41aac14af17f1d19fca5e3b9439e74'] = 'La clave'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_306b346c19017609403424203ea3d720'] = 'está vacío y debe ser llenado'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_e6940b76f045c8bc0aaaa5b2476cdaf7'] = 'Parece que la petición no es válida:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_c9b4de92f371ae545ad6f051c07d58ca'] = 'Hay un número de error:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_ea5f761be4e4888eabf4e1501d7817d1'] = 'Detalles:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_eabb11bf9623f08409a0a4c9d035a336'] = 'Envío Número:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_b92c3d3319314513c547675924ceecd1'] = 'Ticket URL'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_66b793b6b4125e300717e8cf7449f533'] = 'URL de seguimiento:'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_2653c23b8c0daac59571e4be5e8fa7d0'] = 'El servicio web Mondial Relay no es seguro actualmente '; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_dc41aac14af17f1d19fca5e3b9439e74'] = 'La clave'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_135a7b9a62531e066a95093d8951b344'] = 'no tiene un formato de valor válido'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_e6940b76f045c8bc0aaaa5b2476cdaf7'] = 'Parece que la petición no es válida'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_c9b4de92f371ae545ad6f051c07d58ca'] = 'Hay un número de error:'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_ea5f761be4e4888eabf4e1501d7817d1'] = 'Detalles: '; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_2653c23b8c0daac59571e4be5e8fa7d0'] = 'El servicio web Mondial Relay no es seguro actualmente '; +$_MODULE['<{mondialrelay}prestashop>mrmanagement_a42bb0eaa485682166770a54469385f6'] = 'Algunos artículos no se pueden quitar, por favor, inténtelo de nuevo'; +$_MODULE['<{mondialrelay}prestashop>mrmanagement_11744bfebb33e52be37a66a530b7045d'] = 'Por favor, seleccione al menos un elemento'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_03f4a47830f97377a35321051685071e'] = 'Cerrado'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lunes'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_5792315f09a5d54fb7e3d066672b507f'] = 'Martes'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_796c163589f295373e171842f37265d5'] = 'Miércoles'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_78ae6f0cd191d25147e252dc54768238'] = 'Jueves'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_c33b138a163847cdb6caeeb7c9a126b4'] = 'Viernes'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Sábado'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Domingo'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_621895c388c9bb22abbbc69fad001846'] = 'Seleccione un punto de recogida'; diff --git a/modules/mondialrelay/fr.php b/modules/mondialrelay/fr.php new file mode 100755 index 000000000..c6602732f --- /dev/null +++ b/modules/mondialrelay/fr.php @@ -0,0 +1,144 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_a25569b97604bddcfba04d7eb9950eeb'] = 'Pour générer des étiquettes, vous devez inscrire une adresse correcte pour votre boutique sur '; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3d2da0d2e731d59465a92f13216cf82d'] = 'La page de contact'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_de21dc13e1ea638777fbfad49f88b332'] = 'Toutes les commandes qui auront un status'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_2345e28c9b93f368968be4781ed70f5c'] = 'Changer la configuration'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_37c85a61df6352af7285c307022c4413'] = 'Aucune commande n\'existe avec ce status'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_d79cf3f429596f77db95c65074663a54'] = 'Identifiant de la commande'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_ce26601dac0dea138b7295f02b7620a7'] = 'Client'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_0eede552438475bdfe820c13f24c9399'] = 'Prix total'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_f4e8b53a114e5a17d051ab84d326cae5'] = 'Total frais d\'expédition'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3715c824cbc0f966c61a72254f248a2e'] = 'Mettez un poids (grammes)'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_5635c2608fff4c95a564aea8c6118b8c'] = 'Inverser la sélection'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_6ccc0fdff9995e1a0fce00c99e5b6085'] = 'Numéro MR'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_f9c50cba4de9032d7a6797a2458f8ed9'] = 'Pays MR'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_428c091372d840900cf8536519fa0056'] = 'Numéro d\'expedition'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_a254c25adc7d10d7e9c4889484f875a5'] = 'Détail'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_2e01172e31495f41fcebcf3f831cc82c'] = 'Opération réussie'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_32b919d18cfaca89383f6000dcc9c031'] = 'Générer'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_4f1a377c20ace646ddd303ad1e1d243d'] = 'Historique de la création d\'étiquettes'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_e1a98101d56e29eeea312a0eb2748a92'] = 'Exp num'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_aab39f783ba2e72eaad1770f4d9ad0c4'] = 'Imprimer l\'étiquette format A4'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_3eb2bc1ee46258d2a166e89398756b3e'] = 'Imprimer l\'étiquette format A5'; +$_MODULE['<{mondialrelay}prestashop>adminmondialrelay_fa98e6528c9df7f26978c2beb7de3d99'] = 'Supprimer les historiques sélectionnés'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_44585fcd617dce6416d8283b026714c1'] = 'Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ed4a3b96dc1f38c160775cac1f7bcd6d'] = 'Livrez vos colis en point relais'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70d70ce314f545b7c500a086f147f64b'] = 'Enseigne invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_709b076565df5fa98cdb2528d897633d'] = 'Code Marque invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c86508f5bc6b4456e7003d6a1868689d'] = 'Clé Webservice invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ea9261a3dad976b40ff2088a19fda2c3'] = 'Langage invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_4eb287cc225ba0e1bcfe9cc1b8315def'] = 'Coefficient de poids invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f82576de014726e9ef9b4ed2a9eb947b'] = 'Configurez d\'abord vos paramètres de compte Mondial Relay avant de créer un transporteur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70ff82d47f295f730c6accf07a2948e8'] = 'Nom de transporteur invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e1f1787db2fee596f4c3bfaf1d098f8d'] = 'Col Mode invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9414b7de379a09941e894d28f19949ae'] = 'Mode de livraison invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5eeb9ca7eee4be7192dd10d917f79a12'] = 'Assurance invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8b446ac2013dc7085802de71cc342ead'] = 'Vous devez choisir au moins un pays de livraison'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9a85d87ae6dd77f2107734a4cd0bb15'] = 'Clé google invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_979c6094728c14aac1b66d544dc5cebd'] = 'Etat de commande invalide'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_808fb4e3a637a759565de1d314ea526f'] = 'L\'adresse principale envoyée ne n\'a pas un bon format'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour avec succès'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_07213a0161f52846ab198be103b5ab43'] = 'erreurs'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_cb5e100e5a9a3e7f6d1fd97512215282'] = 'erreur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_350c1cc4343826a89f08a33bb49c6d98'] = 'Configuration du Module Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d21a9f93917604d5490ad529a7cf1ff9'] = 'Pour créer un transporteur Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6a2e6af5fff47adb3afd780b97d9b4b'] = 'Remplissez et sauvegarder vos paramètres Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_abfc836cd1df9d6d2bdfd2fc98e6fa93'] = 'Créez un transporteur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b962d8fb95f5a439f50502152f3bad71'] = 'Definissez un prix pour votre transporteur sur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_faf1247ae6846a9955a466d4f301bbe4'] = 'La page Transporteurs'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_10d78806b84b97ebc774e9f6277af6ac'] = 'Pour générer vos étiquettes, vous devez avoir enregistré une adresse valide de votre boutique sur votre'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_af5efea250326c1c34d69aa9364b482c'] = 'page contact'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_fcf5b2122da1d5a5f5c7253b96a3f9d9'] = 'URL de la tache CRON à lancer pour la mise à jour des statuts de commandes'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_362dff77f7403550e886db901404856c'] = 'Suppression effectuée'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_66661dacf33146201b60dc16520ddd68'] = 'Ajouter un transporteur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b651efdb98a5d6bd2b3935d0c3f4a5e2'] = 'Champ obligatoire'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_531e144cc23ef08408b81cb4d9c641dc'] = 'Nom du transporteur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9b415ea1576b19d10d42b332798cd16'] = 'Mode de collecte'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d24262afca47ba80b691c878243441e8'] = 'Collecte à l\'enseigne'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_201bdb87f8e278b943d07ae924d5de6e'] = 'Mode de livraison'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_142ef02888af88b8b772335277d1c0c8'] = 'Livraison dans un point relais'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eeab8b7cf3c7a558a0e8a4050fa994ca'] = 'Livraison Colis Drive'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8f7794b107749728c3333ef38d2687e8'] = 'Livraison à domicile RDC (1 personne)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e451efc8ce05b96b214b4c2935f2c657'] = 'Livraison à domicile spécialisée (2 personnes)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eaff1bdf24fcffe0e14e29a1bff51a12'] = 'Assurance'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_96ba408f20bc3e065f400c650d32fd1a'] = 'Défaut, pas d\'assurance complémentaire'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e5a8fafb1dfb538c172e1e014e86b871'] = 'Assurance complémentaire N1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b02f8d6d4b6217cca317161c87f64065'] = 'Assurance complémentaire N2'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_90b95ae88150c6a34c4129dc4f1ebbd5'] = 'Assurance complémentaire N3'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c15b40b8c535191f6f0b6f9beaced3cf'] = 'Assurance complémentaire N4'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b67a442fff3ca0a03ea253b0668f946d'] = 'Assurance complémentaire N5'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_33cbd0d8b6476501f55a8320481ec0f1'] = 'Pays de livraison :'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_aef71ba4fd060dea2e2c76d1b5076caf'] = 'Vous pouvez choisir plusieurs pays en appuyant sur Ctrl tout en sélectionnant les pays'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0309a6c666a7a803fdb9db95de71cf01'] = 'France'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6c1674d14bf5f95742f572cddb0641a7'] = 'Belgique'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_06630c890abadde9228ea818ce52b621'] = 'Luxembourg'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_907eba32d950bfab68227fd7ea22999b'] = 'Espagne'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0c24ec05a02c710cedd400e3680d8b81'] = 'Liste des tranporteurs'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_14039af96b01e718a9c9d9c1259b6472'] = 'Aucun transporteur créé'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8596361cec00f8d2438d264827eee737'] = 'Modification de la configuration'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c437cbdaa5799236b2f5b07634679e3d'] = 'Personnalisation des champs'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0eddbda2340214e74be063ed1d1af8a0'] = 'Adresse principale'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_7e9bbecd32836500b557db33c3b3e93b'] = 'La clé utilisée par Mondialrelay est'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_32963eea43914b6a418fb2fd9850beb9'] = 'et elle contient comme valeur par défaut'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d02bbc3cb147c272b0445ac5ca7d1a36'] = 'Etat des commandes'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_818f954f4838ecad839c5dcbd287d291'] = 'Choississez le statut pour la génération d\'étiquette. Vous pouvez administrer vos étiquettes sur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5117e194c641ad4fc55417b554aead3c'] = 'la page d\'administration de Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_235072af42d72915159f0e6c9d6a870c'] = 'Google map'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9c5c09beb32c36129b857c2a40c861b6'] = 'Affiche une Google map sur votre transporteur Mondial Relay, mais votre page de sélection du transporteur peut devenir plus lente.'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1ba3935c9858ffb8e19a35ca640b8505'] = 'Paramètres du compte Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_12a3fbd35c1cab4b1101b91d708efd15'] = 'Enseigne Webservice:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6f0434b67007b555dfd1201f4e0d5254'] = 'Code marque:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_08f785193c96b2a78dec8d76a46648d6'] = 'Clé Webservice:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dae2d7c71f2daaedb00191af25dc28d'] = 'Langage:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_a26329cba9723551cb8654deba32872b'] = 'Coefficient de Poids:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_99244b234ec089eca40ff9e8ec343e87'] = 'grammes = 1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61cbc2d26b4157292673c772ddd6c0f7'] = 'Enregistrer les modifications'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2673bca5ba0a7871770e69c962e6ce38'] = 'Nombre d\'expéditions'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dbe844fb964d5eca2f51be724e43294'] = 'URL des étiquettes'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6aefd5e2191e1210a2f50416812b517'] = 'URL du suivi'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61e70b58e38fd01daa254f44c4fa264b'] = 'Nombre de Points Relais'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bba366864d25056c941b72f18ef79e7c'] = 'Cette erreur n\'est pas mentionnée:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2f84f9d5731852c4d07d52ef0badc42e'] = 'Mondial Relay est inaccessible'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_016854c68c7122b18d89ff0f5e40502b'] = 'Il n\'y a pas de point relais à proximité de votre adresse, veuillez changer votre adresse ou utiliser un autre transporteur'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_21034ae6d01a83e702839a72ba8a77b0'] = 'HT'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1f87346a16cf80c372065de3c54c86d9'] = 'TTC'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e7a6ca4e744870d455a57b644f696457'] = 'Gratuit !'; +$_MODULE['<{mondialrelay}prestashop>orderdetail_81b7b4587a2a3ea7a0d6bb1df3fbba54'] = 'Livraison à'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_a1c3470a944b9625cfb924fd15c8bdbf'] = 'Veuillez choisir au moins une commande'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_dc41aac14af17f1d19fca5e3b9439e74'] = 'Cette clé'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_306b346c19017609403424203ea3d720'] = 'est vide et doit être rensignée'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_e6940b76f045c8bc0aaaa5b2476cdaf7'] = 'Il semble que la requête ne soit pas valide'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_c9b4de92f371ae545ad6f051c07d58ca'] = 'Erreur numéro :'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_ea5f761be4e4888eabf4e1501d7817d1'] = 'Détails :'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_eabb11bf9623f08409a0a4c9d035a336'] = 'Numéro d\'expédition :'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_b92c3d3319314513c547675924ceecd1'] = 'URL du Ticket :'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_66b793b6b4125e300717e8cf7449f533'] = 'Url de Tracking :'; +$_MODULE['<{mondialrelay}prestashop>mrcreatetickets_2653c23b8c0daac59571e4be5e8fa7d0'] = 'Le webservice Mondial Relay est actuellement innaccessible.'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_dc41aac14af17f1d19fca5e3b9439e74'] = 'Cette clé'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_135a7b9a62531e066a95093d8951b344'] = 'n\'a pas un format valide'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_e6940b76f045c8bc0aaaa5b2476cdaf7'] = 'Il semble que la requête n\'est pas valide:'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_c9b4de92f371ae545ad6f051c07d58ca'] = 'Erreur numéro :'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_ea5f761be4e4888eabf4e1501d7817d1'] = 'Détails :'; +$_MODULE['<{mondialrelay}prestashop>mrgettickets_2653c23b8c0daac59571e4be5e8fa7d0'] = 'Le webservice Mondial Relay est actuellement innaccessible.'; +$_MODULE['<{mondialrelay}prestashop>mrmanagement_a42bb0eaa485682166770a54469385f6'] = 'Certains objets ne peuvent pas être retirés, veuillez réessayez un peu plus tard.'; +$_MODULE['<{mondialrelay}prestashop>mrmanagement_11744bfebb33e52be37a66a530b7045d'] = 'Veuillez choisir au moins un élèment de l\'historique'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_03f4a47830f97377a35321051685071e'] = 'Fermé'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lundi'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_5792315f09a5d54fb7e3d066672b507f'] = 'Mardi'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_796c163589f295373e171842f37265d5'] = 'Mercredi'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_78ae6f0cd191d25147e252dc54768238'] = 'Jeudi'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_c33b138a163847cdb6caeeb7c9a126b4'] = 'Vendredi'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samedi'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Dimanche'; +$_MODULE['<{mondialrelay}prestashop>recherchedetailpointrelais_ajax_621895c388c9bb22abbbc69fad001846'] = 'Sélectionnez ce point relais'; diff --git a/modules/mondialrelay/googlemap.php b/modules/mondialrelay/googlemap.php new file mode 100755 index 000000000..446b95ee7 --- /dev/null +++ b/modules/mondialrelay/googlemap.php @@ -0,0 +1,120 @@ +<?php + require_once(dirname(__FILE__).'/../../config/config.inc.php'); + require_once(dirname(__FILE__).'/../../init.php'); + require_once(dirname(__FILE__).'/mondialrelay.php'); + + MondialRelay::initModuleAccess(); + echo '<script type="text/javascript" src="'.MondialRelay::$moduleURL.'jquery-1.4.4.min.js"></script>'; + ?> + +<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script> +<script type="text/javascript"> + +var geocoder; +var map; +var infowindow = new google.maps.InfoWindow(); +var markers = []; +var json_addresses = null; + +function google_map_init() { + geocoder = new google.maps.Geocoder(); + var latlng = new google.maps.LatLng(-34.397, 150.644); + var myOptions = { + zoom: 11, + center: latlng, + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + map = new google.maps.Map(document.getElementById("map"), myOptions); + + geocoder.geocode( {'address': "<?php echo $_GET['address']; ?>"}, function(results, status) + { + if (status == google.maps.GeocoderStatus.OK) + { + map.setCenter(results[0].geometry.location); + var marker = new google.maps.Marker({ + map: map, + position: results[0].geometry.location + }); + google.maps.event.addListener(marker, 'click', function() { + infowindow.setContent("<?php echo $_GET['address']; ?>"); + infowindow.open(map,marker); + }); + } + }); +} + +function codeAddress(address, address_google) +{ + geocoder.geocode( {'address': address_google}, function(results, status) + { + if (status == google.maps.GeocoderStatus.OK) + { + var image = new google.maps.MarkerImage('<?php echo $_GET['relativ_base_dir']; ?>modules/mondialrelay/kit_mondialrelay/marker.gif'); + var marker = new google.maps.Marker({ + map: map, + position: results[0].geometry.location, + icon : image + }); + google.maps.event.addListener(marker, 'click', function() { + infowindow.setContent('<img src="<?php echo $_GET['relativ_base_dir']; ?>modules/mondialrelay/kit_mondialrelay/MR_small.gif" />' + ' ' + address); + infowindow.open(map,marker); + }); + } + }); + +} + +function recherche_MR(args) +{ + var ok = 1; + if (ok == 1) + { + $.ajax({ + type: "POST", + url: 'kit_mondialrelay/RecherchePointRelais_ajax.php', + data: args , + dataType: 'json', + async : false, + success: function(obj) { + json_addresses = obj; + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {} + }); + } + else + { + alert('Formulaire incomplet'); + return false; + } +} + +</script> + +<div id="map" style="height:300px; width:500px; border:1px;" ></div> + +<?php + echo '<script type="text/javascript"> + + $(document).ready(function () + { + recherche_MR(\'relativ_base_dir='.$_GET['relativ_base_dir'].'&Pays='.$_GET['Pays'].'&Ville='.$_GET['Ville'].'&CP='.$_GET['CP'].'&Taille=&Poids='.$_GET['Poids'].'&Action='.$_GET['Action'].'&num='.$_GET['num'].'\'); + + window.onload = function() + { + var cpt = 0; + google_map_init(); + if (json_addresses && json_addresses.addresses) + while (json_addresses.addresses[cpt]) + { + if (json_addresses.addresses[cpt].address3.length) + { + address_google = json_addresses.addresses[cpt].address3+\' \'+json_addresses.addresses[cpt].postcode+\' \'+json_addresses.addresses[cpt].city+\' \'+json_addresses.addresses[cpt].iso_country; + address = json_addresses.addresses[cpt].address1+\'<br />\'+json_addresses.addresses[cpt].address2+\' \'+json_addresses.addresses[cpt].address3+\'<br />\'+json_addresses.addresses[cpt].postcode+\' \'+json_addresses.addresses[cpt].city+\' \'+json_addresses.addresses[cpt].iso_country; + codeAddress(address, address_google); + } + cpt++; + } + } + }); +</script>'; +?> diff --git a/modules/mondialrelay/images/getTickets.gif b/modules/mondialrelay/images/getTickets.gif new file mode 100755 index 0000000000000000000000000000000000000000..b4c8c376011d00c5f3236e397b47b139725d0be6 GIT binary patch literal 1849 zcmb8wdr(tX9tZI2z31lM+(&YVNJFGf2tkvOnD7cwta}qc5LgzdfaOsVFsz}W1}cxX zh~$9~-YCUFwc;*oQM3ho%x+f@A~V=_?8@kLr@Px3?XWw(whOyD)tR<7;g9_*`^WzN zJaf*R&wPL9Hz$4fF2gnpL?H46L0-IgQD`oB^7P5n<;jPS9(uamXC}`0SNezgY8vc| zpD*72>UO2QVrKs8-io5PolPU7Bgp?#kuT_+v^}q;7<1F&w(78T{<D!kNmA;pmV?%P z(nj0C{ZdP{rOAH4vTv*H&8h=P<a5BM{JYeFTLMS~Z<I<=lpp!`aWvILE*kqMG9tWp zZ}`rOF3wvfu`{VIAN&U=ef>(P@xk6_{kdb@>hEO*Zr8=UDE^oCOwQ8eQ#a}BvFAjL z7(ei*?QwER1I7VL-mH!XLYiWMt2_!Nc?i1?v?c;x{BarmRw7MXBZFBQ0u~!*-PW6G zBtJ94?&;2j)j2_kb|T#D*e@6Nq*$UkDc-&Kz>#s5Bu~Q0rkP!+(^vnhHx#<pHAS`I zEC9Z(*S_%_c`dZ6Hw0v(<uVMX98|o?UE~B1&>dyX**vyXfArnvcSZ~+lS-0;Qknvk zuNglDq>^bevTwT6<DQGFQ%}4!TARBN+K#p&q2lUGKJ$tJ@`y(w9|uW8MOcPNEmbXj zs}pO^uq!pYip1Y7Z=1=^9ZQRkK`E$kp(Yv2qpNz}?NFJD%C+9ZD9e@0y{?w5I%krx zE;wc_m#-827*8abu`2sQCF<Kq-^%OLa_*@PjR1<A39S&|*Uvg&f}lG;=KHG}5pnAN zWyb~b#z*F*T*Z){bl)32DOoAd{vhR(v`P&;N`NV1v}H2;uiCUnRK_<34j=2Jvj)36 z%Zx30{ir@@F7~w+i37RF$i>x7eoFgBnwgnJFwIv6T?P=jrdnUgNj}Zo`aEQhC++bq zI1~2qhVN=OK*{~Fe@<CHWF8hA$cig3D*pF3-G$yuvDLpW0#@!|eTG)sX#Pc;x2h%T zsCP&|cq}R?pd|qKgW3;p$w>FAWI;t8NoE}R7o$<nWR#9KHex<4os(?2UOB873&RF8 zIWA(;wU_2Ei$W#Z*m)b406To<nZgSaFThOS&K3e8TYtzSt0V~Al4H{{L>a*-l|34Q zM6#{+!+e6Su^mDH!PZzyVuF(14v=<3KglN}fB7H%g3328OG>*r<Z*K83PtwjJC53F zuDI<Z@AFSXq>SfZ(cA?9@y7GTN-6X>?3jY;Yj@tc&`XlFPwQ3d!w4dOb0rV*2{R#7 zDisWY5pNwX&+G>sJIhN2#1=t%O%mBH53X4o=rs+hQg=xe3#wVg52nNtQLK2~wDfny z)3<k9_DAy4kDs$PiQk!ioT=-uUenL{xWeXw2^_2@e0n9dX1Xm}F1Y!@BZruw_@xA% zj$loEK6?n^Vn8!s7*t5S5<?NO$29yjOCoAl2Dhvwqdc)Z{^1tmiLA3nKe_vt9`$do z{3rm&ylJHhyZgl1&B=+<p1Uwnl<HjwZ`Ix3bTQs#Ij_@*x;FG*)<g)FUOqi19t6GD z-HwceP>2`uVKi&Q2uvuX93}a(W<J`Dl7fLKY8d4U^|-CLv9eM1zx%YNQD+URo?lr& zyT)~=Xv;|QpSx~Nu6xbktS~1$cynwM?He~$Ag+o(Hbu<h>Z$oVA>p$Fqf=jm&E8zU zyrkfZh#NDLFG~SU@}jAo7{QV_%}{YFKnT%Jlqa;QXucN5x5MEWIfgX^*VG4I&6>tu za!!7an$Co^CBOC6GV#Oaypm^v#P!Z++rtH&@2!B{dn0vob;eYKm`Q1v=>IGf|64|G zl`Uj;*@ol|f<Ct~mvd}{DLghh6=8FE5D4=U^bGFDu(nDY3dx*mT_fvJ1|O;ac4;e9 zJ3CIP(^2~4Oo-GeK8eWeH!x&-%F41Tq_h2q>5_U_(%bfMvv>#9=Ip-o*KpDPDW<4J z1FsI4m(+Zwedy_!Sp9e>hC*I4#TxQ+cBpBr4ep5DBZOr<lzP7s3>@FW*1jR9xPT@( I@DZ)m&lPSMga7~l literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/images/loader.gif b/modules/mondialrelay/images/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..afc385a200326b29f6fcc15a2d561b36eb73d36a GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`<;O|NsB?_V(Yue=l6P@W_!Pot>RCX3Ti~`t{YTS0_%KxNqOS zZQHhe{P^+QxpR*nKVGq7#rpN@8At(&|GE8KLxP<h16+;t444^#dKLdkITxiSmZYXA zlxLP?C?sYjR^;R-rs!qnrR6gy{$%0g0;<vh*#dGT18abSLSIVeyrl*rIf_~>39Hu5 z5IHtc%CzAF+s%%K=w22Zrp(rWi2|*Rovn-d)@bT9ct-tLq>}Vum&c?D7A-4G)nqF= zO|unjghf78${u~+?}W{g3<ZTQ_e(t)T2e<JtXSco;#zy)z`<)rnK*i;G^A#T2=N>| zpx_|L<#V9nLvo;dGn3Pnr`rNdXDHaLG7U`$+@}3PY2V`XDF!RV)-77t@0cxcUfGd> z+a|!=fZc|ZrNMwNlFdSkm$O}25u4=+Kp!f9o}h6{#6yegNPq~Z?vi%H_r{G}R?epl zy|;L@G(BYV(3_!hb7Lg~hrqszXIO7!aqBgPyExq8i)2`2;K3=@s$<aSbcL%gTfpnt zTb@vR({g5(8kKC`7)^ejZmgCDL4vhGVG5I>$WezC&CYUcYs8ObcQ?&pRCIchV9(IF zooU|$W!EN)DyP7RhUDG3i^{l#lol$yJhV8WF`<n&)NPq$(H%*?r3J4wKd1d~z-kT1 zZ@}1F;lSf+C~)YcL~g9a@tqPLJr~+;Xs`=(v6wI^JlD{XSmvgf=)n*XJcFY#*L2BN z#v~VyEo=;{b|xn2aP_G+6c~#oA5q?*{)6|861$0+d4QT$gnolYPp=AAOXH!IdH_Af zvCP4Q;n1dIj!K>rIX28%n80C|*UIW?pwc1HE9Y&#iPuAi{a~kVNwZc{v#XSdz>>qd s7ZX-=BphJ+DPY*iA+ce)LqDIhc?O5RAxj!-jAnO_nj(WWD0zYb0CL|C(f|Me literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/images/logo.gif b/modules/mondialrelay/images/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..06f847112cfcc82141bafe2d7370007594d1eeba GIT binary patch literal 1035 zcmZ?wbhEHb6krfwc;3RWiNSX>gWqNb|4j@*n;8POFa&R92-?CBx)sC-*$QHWZDR=C z1|q|^gHXga#)$2V;oBJ_wlPI)XNuU$9KM|;avN*J4%VoxY>_)SqPKBJ@8F5u$rHPa zFJUKt{7(LaodOBFKqzsiP~tA(#GN8ZyF`<Ailyw5Ox+`$v0FB6uUytX`Rv_Fnfn!U z_9|uXQO@40n!8s$Z=Xiq9<AI1ngx4x^Y`i%9MCJ?V^DBVzhu8b@gbwq1IDF?jLQz1 zlpQcFJ8WKg#H#9uP1O;*>O&4S$DA9EIX512Z94AJeB7($q<`n(u$EJyJ*UEYPDb{g zitIZR*?%;q^IXitvvHHo#ZNw()_XF2%7xTv7qezv$eDF1XU>KE*%u1uTq>M*qGH<B zip5temRzk~a;<vl_1fh(8dhFzT6(>4<@M%Or@IzjZ(Dt*chmVv%WwB>x;J6Vo$1>j z&fR-{)uv|~PrcZ7?!~TiuMS*(e)!Uxqu1UZz47+U?GI<~y}Nk-%cGay-+cJ_?(^@@ z-~ayp^Y8E9|D%BJA)xqA(77lzu_QG`p**uBL&4qCH-JHh0SG`Dgn{EW1N+O&#jGcJ zh52MEIvi6@Nm@1D)5(}{;b5zQwU$-Jh6nB(?7~id0*36|Ol(T(0X{1)aY$<UIrvRD z5Y*J9+wx{dr1IpaEF6q~jtE{@(C9x=fZ>nf<OdqwOy#FcN>3>?GP8*|MC2|=SnR>( zvuR4lp+)Rdgx!~15ojuEV&<{Xc@og*bhuI6$l^xC%?F$^`ju-M3=5W?pJbcGwZr$o z(N+l)$9+5xnwN7(ODI~KJaAm(Dy|T^Oe50p$Z_`VnIZveemEo_Vl!d6DtXz(y^B{= RDMi9i`J|X-0}~U2H2_yJqE7$- literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/images/pdf_icon.jpg b/modules/mondialrelay/images/pdf_icon.jpg new file mode 100755 index 0000000000000000000000000000000000000000..81712ce79677d37e5adfa1f74b27f6427784cba5 GIT binary patch literal 9713 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 S)J)L}IMKO)NGAY#n*Tp)#sT~Q literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/it.php b/modules/mondialrelay/it.php new file mode 100644 index 000000000..0a25e3c38 --- /dev/null +++ b/modules/mondialrelay/it.php @@ -0,0 +1,90 @@ +<?php + +global $_MODULE; +$_MODULE = array(); +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2f84f9d5731852c4d07d52ef0badc42e'] = 'Problema per ottenere gli indirizzi da MondialRelay Webservice: i server di Mondial Relay potrebbero essere inattivi'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_016854c68c7122b18d89ff0f5e40502b'] = 'Il Relay Point non è vicino al tuo indirizzo, per favore cambia il tuo indirizzo o utilizza un altro corriere'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_21034ae6d01a83e702839a72ba8a77b0'] = '(Tasse escl.)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1f87346a16cf80c372065de3c54c86d9'] = '(Tasse incl.)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e7a6ca4e744870d455a57b644f696457'] = 'Gratis!'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_44585fcd617dce6416d8283b026714c1'] = 'Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ed4a3b96dc1f38c160775cac1f7bcd6d'] = 'Consegna nei punti Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70d70ce314f545b7c500a086f147f64b'] = 'Negozio non valido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_709b076565df5fa98cdb2528d897633d'] = 'Codice marchio non valido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c86508f5bc6b4456e7003d6a1868689d'] = 'Chiave webservice non valida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ea9261a3dad976b40ff2088a19fda2c3'] = 'Lingua non valida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_4eb287cc225ba0e1bcfe9cc1b8315def'] = 'Coefficiente di peso non valido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f82576de014726e9ef9b4ed2a9eb947b'] = 'Si prega di configurare le impostazioni dell\'account Mondial Relay prima di creare un corriere'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_70ff82d47f295f730c6accf07a2948e8'] = 'Nome del corriere non valido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e1f1787db2fee596f4c3bfaf1d098f8d'] = 'Col mode non valido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9414b7de379a09941e894d28f19949ae'] = 'Modalità di consegna non valida'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5eeb9ca7eee4be7192dd10d917f79a12'] = 'Modalità di garanzia non valida '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8b446ac2013dc7085802de71cc342ead'] = 'È necessario scegliere almeno un paese di consegna'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9a85d87ae6dd77f2107734a4cd0bb15'] = 'Chiave Google non valida '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_979c6094728c14aac1b66d544dc5cebd'] = 'Stato dell\'ordine non valido'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate con successo'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_07213a0161f52846ab198be103b5ab43'] = 'errori'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_cb5e100e5a9a3e7f6d1fd97512215282'] = 'errore'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_350c1cc4343826a89f08a33bb49c6d98'] = 'Configura del Modulo Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d21a9f93917604d5490ad529a7cf1ff9'] = 'Per creare un corriere Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6a2e6af5fff47adb3afd780b97d9b4b'] = 'Inserisci e salva le impostazioni dell\'account Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_abfc836cd1df9d6d2bdfd2fc98e6fa93'] = 'Crea un corriere'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b962d8fb95f5a439f50502152f3bad71'] = 'Definisci un prezzo per il tuo corriere'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_faf1247ae6846a9955a466d4f301bbe4'] = 'Pagina corriere'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_10d78806b84b97ebc774e9f6277af6ac'] = 'Per generare le etichette, è necessario disporre di un indirizzo valido e registrato per il tuo negozio sulla tua '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_af5efea250326c1c34d69aa9364b482c'] = 'pagina contatti'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_ddcd6a653f661fd7d219d9102528b917'] = 'Vai al front office'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_fcf5b2122da1d5a5f5c7253b96a3f9d9'] = 'URL Cron task:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_362dff77f7403550e886db901404856c'] = 'Cancellazione riuscita'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_66661dacf33146201b60dc16520ddd68'] = 'Aggiungere un metodo di spedizione'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b651efdb98a5d6bd2b3935d0c3f4a5e2'] = 'Obbligatorio'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_531e144cc23ef08408b81cb4d9c641dc'] = 'il nome del corriere'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9b415ea1576b19d10d42b332798cd16'] = 'Modalità di raccolta'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d24262afca47ba80b691c878243441e8'] = 'Raccolta presso il negozio'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_201bdb87f8e278b943d07ae924d5de6e'] = 'Modalità di consegna'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_142ef02888af88b8b772335277d1c0c8'] = 'La consegna a un relay point'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eeab8b7cf3c7a558a0e8a4050fa994ca'] = 'Consegna Colis Drive '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8f7794b107749728c3333ef38d2687e8'] = 'Consegna a domicilio RDC (1 persona)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e451efc8ce05b96b214b4c2935f2c657'] = 'Speciale a domicilio (2 persone)'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_eaff1bdf24fcffe0e14e29a1bff51a12'] = 'Assicurazioni'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_96ba408f20bc3e065f400c650d32fd1a'] = 'Nessuna assicurazione'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_e5a8fafb1dfb538c172e1e014e86b871'] = 'Assicurazione complementare LV1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b02f8d6d4b6217cca317161c87f64065'] = 'Assicurazione complementare LV2'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_90b95ae88150c6a34c4129dc4f1ebbd5'] = 'Assicurazione complementare LV3'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c15b40b8c535191f6f0b6f9beaced3cf'] = 'Assicurazione complementare LV4'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b67a442fff3ca0a03ea253b0668f946d'] = 'Assicurazione complementare LV5'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_33cbd0d8b6476501f55a8320481ec0f1'] = 'Consegna nei paesi:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_aef71ba4fd060dea2e2c76d1b5076caf'] = 'È possibile scegliere diversi paesi premendo Ctrl durante la selezione'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0309a6c666a7a803fdb9db95de71cf01'] = 'Francia'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6c1674d14bf5f95742f572cddb0641a7'] = 'Belgio'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_06630c890abadde9228ea818ce52b621'] = 'Lussemburgo'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_907eba32d950bfab68227fd7ea22999b'] = 'Spagna'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0c24ec05a02c710cedd400e3680d8b81'] = 'Elenco metodo di spedizione '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_14039af96b01e718a9c9d9c1259b6472'] = 'Nessun metodo di spedizione creato'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_8596361cec00f8d2438d264827eee737'] = 'Config di spedizione.'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_d02bbc3cb147c272b0445ac5ca7d1a36'] = 'Stato ordine'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_818f954f4838ecad839c5dcbd287d291'] = 'Scegli lo stato dell\'ordine per le etichette. È possibile gestire le etichette'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_5117e194c641ad4fc55417b554aead3c'] = 'pagina di amministrazione Mondial Relay '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_235072af42d72915159f0e6c9d6a870c'] = 'Google map'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_9c5c09beb32c36129b857c2a40c861b6'] = 'Visualizza una mappa di Google sul tuo operatore Mondial Relay, può rallentare il caricamento della pagina del corriere '; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_1ba3935c9858ffb8e19a35ca640b8505'] = 'Impostazioni account Mondial Relay'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_12a3fbd35c1cab4b1101b91d708efd15'] = 'Insegna WebService:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_6f0434b67007b555dfd1201f4e0d5254'] = 'Codice marchio:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_08f785193c96b2a78dec8d76a46648d6'] = 'Chiave WebService:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dae2d7c71f2daaedb00191af25dc28d'] = 'Lingua:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_a26329cba9723551cb8654deba32872b'] = 'Coeff. peso:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_99244b234ec089eca40ff9e8ec343e87'] = 'grammi = 1'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61cbc2d26b4157292673c772ddd6c0f7'] = 'Aggiorna impostazioni'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_2673bca5ba0a7871770e69c962e6ce38'] = 'N. di spedizione:'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_0dbe844fb964d5eca2f51be724e43294'] = 'Etichetta URL'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_c6aefd5e2191e1210a2f50416812b517'] = 'Follow-up URL'; +$_MODULE['<{mondialrelay}prestashop>mondialrelay_61e70b58e38fd01daa254f44c4fa264b'] = 'N. Point Relay:'; +$_MODULE['<{mondialrelay}prestashop>orderdetail_81b7b4587a2a3ea7a0d6bb1df3fbba54'] = 'Consegna a'; + +?> \ No newline at end of file diff --git a/modules/mondialrelay/jquery-1.4.4.min.js b/modules/mondialrelay/jquery-1.4.4.min.js new file mode 100644 index 000000000..8f3ca2e2d --- /dev/null +++ b/modules/mondialrelay/jquery-1.4.4.min.js @@ -0,0 +1,167 @@ +/*! + * jQuery JavaScript Library v1.4.4 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Nov 11 19:04:53 2010 -0500 + */ +(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= +h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"|| +h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--; +if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z], +z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j, +s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v= +s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)|| +[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u, +false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this, +a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e= +c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, +a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan", +colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType=== +1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "), +l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this, +"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r= +a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b= +w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this, +Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp= +c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U}; +var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!== +"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V, +xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d, +a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d= +1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d=== +"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}}); +c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i, +[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*")); +return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!== +B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, +POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()=== +i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m= +i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g, +"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n=== +"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1; +for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"), +i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML; +c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})}, +not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1, +"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d= +c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a, +b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")): +this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay", +d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b, +d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)=== +"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L|| +1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a=== +b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&& +h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle; +for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+= +parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px", +height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells= +f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a, +"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/modules/mondialrelay/kit_mondialrelay/MR.gif b/modules/mondialrelay/kit_mondialrelay/MR.gif new file mode 100755 index 0000000000000000000000000000000000000000..aff6ee744c7c34cd652dfca2c4a86efab7022a90 GIT binary patch literal 1756 zcmeH`i$Bu|0Kk9yZDWo#W3%PrgS>i>&<6<{8$(_-QXND1$Rm%OC}V8Wi<=liwHBY# zojZ?1UUk?+dd+bjrA!TT-ZnN%=RVz^ai9DC2jB1K^Y!p_w|5A)25f<R0Js#YcO^tW z`kYQ|1U@cC??U|Eqy&?U^JW*5_h)9<WvAO0o-$=*IdkG1c>$L1UC6IUF2k<G4`lBt zFaIg;0Fi&-$1}7~VNv3!*qOM**~HY@)bzRUGv+R5Nv>o|vT|9ur0e<K#Y{g=aY%V- z#GSIpyOptZx1xWl&HA;D+0=NWwT1n-^>$}_nS{ZbXI=a2M&Ux??FDx6VoCYZovNjZ zd&_qpEZ^s?)YPs%s#~jXT5oP$Z|jtHbV;9f^LwlNpFJAr|9S9v{fohdH?LcTZ`wwN zpG>|Rl=1syf@hnr-pGglRE$q3Cf;s+n3@(1iN#|xGvo8~AC?wBDaGQ?lKJiBm9@2n zjg8f9sq~9Xrc}z6O2wD0t(|`X{^vhkz;Fu&0RS3s@T=w5Cji6_@H=7;rGZOip5Qk7 zqjMo31h&hoiqa@5g@M+wBZwMa{|}%Cg3{oMK${z>BM6YD8j|*2&-gtKQPnRhq1gxm zJHj;Q08Jn4o3KWZu+B9Il3^GkfbD0{TE0*8oUj*kJ+@(<#{e`#?NoM;2X>GD0;9id zOX3gWpf+eL^PUJ%X}*h4D|3yz0#&2BA^<R|mVC=pC52eYucv9a1^HqeTn`b|3qN<X zHA!a%EJ{_C1>wZpo0c>yUHxme5Qz{xBx@0EdKVlzeo`YKpf}td^a@u${!x+3GNx7g zBe`5w;1lYF$$@D>0!oc;BEt`G;TUtga&`ydWGtoOoXh=-+W0F4H%`4iff<s!!lhWt zNOsmai!`~mlOZ0e4-bRH(iE%rGc-0iImENgtHMMq5lu({j|_>f;xHJpn|3sH8ln=_ zV93-n!telWQ?L+eRv`~1`lWLK9ehi=;HJhOra~=Cd>JISE=qhR1s%|w2bf?m_cHLl zsc^*Zg4HuA`fAbm<XNZSAyoJy#!0GLW;pzoMj_6?T@$-jLP1tZSR_CH(=#0V5Muy9 z+u~~oZsYC47h@8_=Ri%uKB10BiRP%UubOJKI}|4BuGv*3dgpFH+CRy&Xz=8?zu(;& zf^&>aBBHD^r*l+s-8)<;)>>qBfO3|Q%=)Hl{V2&p#fc45(Vi5N;ab6A#C)6hZWbIf zX*KsF$k`;S>M9sLa34xij<!x$7!!_-X9${UNl85&i_2pI56|zod>l1+C=W|j2>UKm zB_bv^h&n{ZIUhG;W6g{_(7mYib`DCh71cusvOoO(GI(T@Q4#G`27M;ekE|z{I%}F> z>4AimVy%Zk)>qY?4fu^n9L$YIOD#$v>N<;DQAl0KZ;5vJxiT$Bl)yxVc5rA+19m!R z0;=f}*3(IAmUqJg-Fy;v*(un0v_J*<aGDl(wl{w9=qR6#GM^SqQbrzcLaDZpOKFZf z?RHBe!4G}NFHbop^VDPH+XVPYmoIto)a;%ys10vXiX+6CYE~fMawq5vHIfwSotZ30 z-m$R|YS1}<_r0PU=Fh@xSNo^L$6mS{ODg3X;9HWfUS?X5`Gt)xXitIzGgNmOKMFcf z{Bbdz@J<<c{z1D6QfVMuFTshKPvNJFpjU$q9@Z=J>GZ8fEjD>q3r0FdeuHI?x}Y~2 g7f>fu>E}5+$9OH*kqt)M{3!^!c0XIs*Z^?+2RFM*(*OVf literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/kit_mondialrelay/MR_small.gif b/modules/mondialrelay/kit_mondialrelay/MR_small.gif new file mode 100755 index 0000000000000000000000000000000000000000..571069d5700d50111aab8a23114765b899eb58a9 GIT binary patch literal 797 zcmZ?wbhEHblw*)*c;?D**WNWPS?t~XMfY62A4SDKPDuUr<jI48&`le=o;<mpogw=) zJOAgs`+tA_eEIU;i-wklI=iWpW4|0Z_UGOE6USG7{P?=1$>qb!HNSp+uc<Wuylc;s z)U3{S?>AFstXff5T&PtYEBE8(t?!qwE(+8;d}ztD{F2kBHavWA@yCsuPoLhHIXz`^ zv;UXFN8im|_^hNNFGsmDQ~mFkFPEJh*Yu>7$H~r}omF39@v5uu*RLPv&uzQ!74Uk( z<QH{KpSEl}er)CEeFt9mO?uhVv3uwAJGW1rI=TM;|Njg_3Ml?$VPs%%WzYe+8WblC z?Ef2Fo0?l%UHP0i1Q@y6`udv$C0#59^%*D3Y-W^aoYyNaI%|Rm7sotCK36%l#eIA| zD@5A4Hm`GK*vTeix2Rcy(bUyqo%l`$X*Ic4LBZ`!I~|yLU1v0NNS<#J+Q}+(b%mMM zc_wilS7rw0CIL=P2J!RS4D81lSeck)UotSYs>>)ycrheR*xUS_ZE3`lOobjtZUH%M z2ad4APMm8*1rz!m1O@q*#d0?+^iXz|sks^bpyS9<A4Y+B$|(nfPX<b6oY-LAxNN!b zc@GT^hNL4Ml03{27upIrnwE2NC<<RlU}$8L4G{Qnd<zGooNAqjL_mWBH<R8uUxybN zZ`XF%R&`4-D14uByrb#I+ZE<7*kY@iofs|@Y+z*Qm;U+GXb0o<t4upNm=g{(ur{zW z@LUOY*S~AYRPtO*@lV3yBj?z<t}x%sFPz9%Qph;rK%o1+nzEH2pGvsMnoM)$S#PbT jaqOuO`|EG7e|dbcde(QTwmELa@x)hcVoUTyI2fz}Uojb| literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/kit_mondialrelay/RechercheDetailPointRelais_ajax.php b/modules/mondialrelay/kit_mondialrelay/RechercheDetailPointRelais_ajax.php new file mode 100755 index 000000000..97d4584ed --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/RechercheDetailPointRelais_ajax.php @@ -0,0 +1,151 @@ +<?php +include(dirname(__FILE__).'/../../../config/config.inc.php'); +include(dirname(__FILE__).'/../mondialrelay.php'); + +$mondialrelay = new mondialrelay(); + +DEFINE('_Enseigne_webservice', Configuration::get('MR_ENSEIGNE_WEBSERVICE')); +DEFINE('_Key_webservice', Configuration::get('MR_KEY_WEBSERVICE')); + +header('Content-Type: text/html; charset=utf-8'); + +$relativ_base_dir=$_POST['relativ_base_dir']; +$client_Num=$_POST['Num']; +$client_Pays=$_POST['Pays']; +$num=$_POST['num_mode']; + + +function mr_horaire_fr($o1,$f1,$o2,$f2) +{ +$mondialrelay = new mondialrelay(); + +if ($o1=='' || $o1==null) {$o1='0000';}; +if ($f1=='' || $f1==null) {$f1='0000';}; +if ($o2=='' || $o2==null) {$o2='0000';}; +if ($f2=='' || $f2==null) {$f2='0000';}; +$o1=substr($o1, 0, 2).':'.substr($o1, 2, 2); +$f1=substr($f1, 0, 2).':'.substr($f1, 2, 2); +$o2=substr($o2, 0, 2).':'.substr($o2, 2, 2); +$f2=substr($f2, 0, 2).':'.substr($f2, 2, 2); +if ($o1=='00:00' && $f1=='00:00') {$p1=$mondialrelay->l('Closed');} else {$p1=$o1.' - '.$f1;}; +if ($o2=='00:00' && $f2=='00:00') {$p2=$mondialrelay->l('Closed');} else {$p2=$o2.' - '.$f2;}; +if ($p1=='Ferm' && $p2=='Ferm' ) {$p=$mondialrelay->l('Closed');} else {$p=$p1.'&nbsp;&nbsp;'.$p2;}; +return utf8_encode($p); +}; + + + + + +$k_security=strtoupper(md5(_Enseigne_webservice.$client_Num.$client_Pays._Key_webservice)); + +require_once('tools/nusoap/lib/nusoap.php'); +$client_mr = new nusoap_client("http://www.mondialrelay.fr/webservice/Web_Services.asmx?WSDL",true); + +$client_mr->soap_defencoding = 'UTF-8'; +$client_mr->decode_utf8 = false; + +$params = array( +'Enseigne' => _Enseigne_webservice, +'Num' => $client_Num, +'Pays' => $client_Pays, +'Security' => $k_security, +); + + + + +$result_mr = $client_mr->call('WSI2_DetailPointRelais', $params, 'http://www.mondialrelay.fr/webservice/', 'http://www.mondialrelay.fr/webservice/WSI2_DetailPointRelais'); +if ($client_mr->fault) +{ +echo 'a|<h2>Fault (Expect - The request contains an invalid SOAP body)</h2><pre>'; +print_r($result); +echo '</pre>|'.$num; +} else +{ +$err = $client_mr->getError(); +if ($err) { echo 'a|<h2>Error</h2><pre>' . $err . '</pre>|'.$num; } +else +{ +$sortie_titre=""; +$sortie_loc=""; +$sortie_info=""; +$sortie_photo=""; +$sortie_plan=""; +$sortie_horaires=""; +echo $result_mr['WSI2_DetailPointRelaisResult']['STAT'].'|'; + + +$sortie_horaires.="<tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Monday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Lundi']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Lundi']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Lundi']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Lundi']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; +$sortie_horaires.="<tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Tuesday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mardi']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mardi']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mardi']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mardi']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; +$sortie_horaires.="<tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Wednesday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mercredi']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mercredi']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mercredi']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Mercredi']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Thursday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Jeudi']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Jeudi']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Jeudi']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Jeudi']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Friday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Vendredi']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Vendredi']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Vendredi']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Vendredi']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Saturday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Samedi']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Samedi']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Samedi']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Samedi']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; +$sortie_horaires.="<td>".$mondialrelay->l('Sunday')."</td>"; +$sortie_horaires.="<td>".mr_horaire_fr($result_mr['WSI2_DetailPointRelaisResult']['Horaires_Dimanche']['string'][0],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Dimanche']['string'][1],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Dimanche']['string'][2],$result_mr['WSI2_DetailPointRelaisResult']['Horaires_Dimanche']['string'][3])."</td>"; +$sortie_horaires.="</tr>"; + +$sortie_horaires="<table border=0>".$sortie_horaires."</table>"; + + +$sortie_titre.="<strong>".$result_mr['WSI2_DetailPointRelaisResult']['LgAdr1']."</strong>"; +if ($result_mr['WSI2_DetailPointRelaisResult']['LgAdr2']!='') {$sortie_titre.="<br>".$result_mr['WSI2_DetailPointRelaisResult']['LgAdr2'];}; +if ($result_mr['WSI2_DetailPointRelaisResult']['LgAdr3']!='') {$sortie_titre.="<br>".$result_mr['WSI2_DetailPointRelaisResult']['LgAdr3'];}; +if ($result_mr['WSI2_DetailPointRelaisResult']['LgAdr4']!='') {$sortie_titre.="<br>".$result_mr['WSI2_DetailPointRelaisResult']['LgAdr4'];}; +if ($result_mr['WSI2_DetailPointRelaisResult']['CP']!='') {$sortie_titre.="<br>".$result_mr['WSI2_DetailPointRelaisResult']['CP'];}; +if ($result_mr['WSI2_DetailPointRelaisResult']['Ville']!='') {$sortie_titre.=" ".$result_mr['WSI2_DetailPointRelaisResult']['Ville'];}; +//if ($result_mr['WSI2_DetailPointRelaisResult']['Pays']!='') {$sortie_titre.=" - ".$result_mr['WSI2_DetailPointRelaisResult']['Pays'];}; +$sortie_titre="<p>".$sortie_titre."</p>"; + + +if ($result_mr['WSI2_DetailPointRelaisResult']['Localisation1']!='') {$sortie_loc.=$result_mr['WSI2_DetailPointRelaisResult']['Localisation1'];}; +if ($result_mr['WSI2_DetailPointRelaisResult']['Localisation2']!='') {$sortie_loc.="<br>".$result_mr['WSI2_DetailPointRelaisResult']['Localisation2'];}; +if ($sortie_loc!="") {$sortie_loc="<p>".$sortie_loc."</p>";} + +if ($result_mr['WSI2_DetailPointRelaisResult']['Information']!='') {$sortie_info="<p>".$result_mr['WSI2_DetailPointRelaisResult']['Information']."</p>";}; + + +if ($result_mr['WSI2_DetailPointRelaisResult']['URL_Photo']!='') {$sortie_photo="<img src=\"".$result_mr['WSI2_DetailPointRelaisResult']['URL_Photo']."\" width=\"306\" vspace=3 hspace=3>";}; +if ($result_mr['WSI2_DetailPointRelaisResult']['URL_Plan']!='') {$sortie_plan.="<iframe src=\"".$result_mr['WSI2_DetailPointRelaisResult']['URL_Plan']."\" width=\"394\" height=\"234\" border=\"0\"></iframe>";}; +$fermer="<a href=\"javascript:void(0)\" onclick=\"masque_recherche_MR_detail('".$num."');\"><img src=\"".$relativ_base_dir."modules/mondialrelay/kit_mondialrelay/close.gif\" border=\"0\" height=\"15\" align=\"right\"></a>"; + + +echo "<div style=\"width=740px;height:15px;\">".$fermer."</div> + <div style=\"width=716px;height:459px;padding:3px;overflow:auto;\"> + <table style='border:none;' width=100%> + <tr style='border:none;'><td colspan=2 style='border:none;'><h1>Votre Point Relais</h1></td></tr> + <tr style='border:none;'> + <td valign=top style='border:none;'> + <table style='border:none;' ><tr style='border:none;'><td style='border:none;'><img src=\"".$relativ_base_dir."modules/mondialrelay/kit_mondialrelay/MR.gif\" vspace=3 hspace=3></td><td style='border:none;'>".utf8_encode($sortie_titre.$sortie_loc.$sortie_info)."</td></tr></table><br> + ".$sortie_plan." + </td> + + <td valign=top style='border:none;'> + ".$sortie_horaires."<br>".$sortie_photo." + </td> + </tr> + </table> + <center><input name=\"select_MR_PR\" id=\"select_MR_PR\" value=\"".utf8_encode($mondialrelay->l('Select this Relay Point'))."\" type=\"button\" onclick=\" + document.getElementById('MRchoixRelais".$num.'_'.$result_mr['WSI2_DetailPointRelaisResult']['Num']."').checked=true;select_PR_MR('".$result_mr['WSI2_DetailPointRelaisResult']['Num']."','".$num."');masque_recherche_MR_detail('".$num."');\"></center> + </div>|".$num; + + +} +} +?> diff --git a/modules/mondialrelay/kit_mondialrelay/RecherchePointRelais_ajax.php b/modules/mondialrelay/kit_mondialrelay/RecherchePointRelais_ajax.php new file mode 100755 index 000000000..9e0e20025 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/RecherchePointRelais_ajax.php @@ -0,0 +1,101 @@ +<?php + +include(dirname(__FILE__).'/../../../config/config.inc.php'); +include(dirname(__FILE__).'/../../../init.php'); +include(dirname(__FILE__).'/../mondialrelay.php'); +include(dirname(__FILE__).'/../errorCode.php'); + +global $cookie; + +$id_cart_address = Db::getInstance()->getValue('SELECT `MR_Selected_Num` FROM `'._DB_PREFIX_.'mr_selected` WHERE `id_cart` = '.$cookie->id_cart); + +$mondialrelay = new MondialRelay(); + +DEFINE('_Enseigne_webservice', Configuration::get('MR_ENSEIGNE_WEBSERVICE')); +DEFINE('_Key_webservice', Configuration::get('MR_KEY_WEBSERVICE')); + +header('Content-Type: text/html; charset=utf-8'); + +$relativ_base_dir = $_POST['relativ_base_dir']; +$client_pays_iso = $_POST['Pays']; +$client_ville = $_POST['Ville']; +$client_cp = $_POST['CP']; +$card_taille = $_POST['Taille']; +$card_weight = $_POST['Poids']; +$client_type_exp = $_POST['Action']; +$num = $_POST['num']; + + +$k_security = strtoupper(md5(_Enseigne_webservice.$client_pays_iso.$client_ville.$client_cp.$card_taille.$card_weight.$client_type_exp._Key_webservice)); + +require_once('tools/nusoap/lib/nusoap.php'); +$client_mr = new nusoap_client("http://www.mondialrelay.fr/webservice/Web_Services.asmx?WSDL", true); + +$client_mr->soap_defencoding = 'UTF-8'; +$client_mr->decode_utf8 = false; + +$params = array( +'Enseigne' => _Enseigne_webservice, +'Pays' => $client_pays_iso, +'Ville' => $client_ville, +'CP' => $client_cp, +'Taille' => '', +'Poids' => $card_weight, +'Action' => $client_type_exp, +'Security' => $k_security, +); + +$result_mr = $client_mr->call('WSI2_RecherchePointRelais', $params, 'http://www.mondialrelay.fr/webservice/', 'http://www.mondialrelay.fr/webservice/WSI2_RecherchePointRelais'); +if ($client_mr->fault) +{ + echo 'a|<h2>Fault (Expect - The request contains an invalid SOAP body)</h2><pre>'; + print_r($result); + echo '</pre>|'.$num; +} +else +{ + $err = $client_mr->getError(); + if ($err) + echo '{"error" : "'.$err.'"}'; + else if (($code = $result_mr['WSI2_RecherchePointRelaisResult']['STAT']) != 0) + echo '{"statError": {"code": "'.$code.'", "msg": "'. + (array_key_exists($code, $statCode)) ? $statCode[$code] : 'Unknown error'.'}}'; + else + { + $tr = ""; + echo '{'; + for ($i = 1; $i <= 10; $i++) + { + //if ($i==1) {$checked="checked=\"checked\"" ;} else {$checked="";}; + if($i < 10) + $l = '0'.$i; + else + $l = '10'; + $numWSI2 = $result_mr['WSI2_RecherchePointRelaisResult']['PR'.$l]['Num']; + } + + echo '"base_dir" : "'.$relativ_base_dir.'", '; + echo '"addresses" : ['; + $i = 0; + $total = count($result_mr['WSI2_RecherchePointRelaisResult'] ); + + foreach ($result_mr['WSI2_RecherchePointRelaisResult'] as $key => $val) + { + if ($key != 'STAT') + { + echo '{"address1" : "'.addslashes($val['LgAdr1']).'", + "address2" : "'.addslashes($val['LgAdr2']).'", + "address3" : "'.addslashes($val['LgAdr3']).'", + "address4" : "'.addslashes($val['LgAdr4']).'", + "postcode" : "'.addslashes($val['CP']).'", + "city" : "'.addslashes($val['Ville']).'", + "iso_country" : "'.addslashes($val['Pays']).'", + "num" : "'.$val['Num'].'", + "checked" : '.($val['Num'] == $id_cart_address ? 1 : 0).'}'.(($i + 1) == $total ? '' : ', '); + } + ++$i; + } + echo ']}'; + } +} +?> diff --git a/modules/mondialrelay/kit_mondialrelay/SuiviExpedition_ajax.php b/modules/mondialrelay/kit_mondialrelay/SuiviExpedition_ajax.php new file mode 100755 index 000000000..296dcdb9a --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/SuiviExpedition_ajax.php @@ -0,0 +1,6 @@ +<?php +require('config.MR.inc.php'); +header('Content-Type: text/html; charset=utf-8'); +$var_Expedition=$_POST['Expedition']; +$k_security=strtoupper(md5('<'._Enseigne_webservice.'>'.$var_Expedition.'<'._Key_webservice.'>')); +echo 'http://www.mondialrelay.fr/lg_fr/espaces/url/popup_exp_details.aspx?cmrq='._Enseigne_webservice.'&nexp='.$var_Expedition.'&crc='.$k_security; diff --git a/modules/mondialrelay/kit_mondialrelay/close.gif b/modules/mondialrelay/kit_mondialrelay/close.gif new file mode 100755 index 0000000000000000000000000000000000000000..02de7f792451d1e68a9ca36008973fcaf18b063c GIT binary patch literal 246 zcmZ?wbhEHbRAEqI*v!eWckkZn>gp3GPRyAz=gXHbGiJ<4O-;Rb?_N|?)c^ng88Cq2 zPZmZ722KVYkPOHS2A0JJCp}m1wRnAY_x}WquH!#s-A;09b|`hsVl245x4`Ck$6iUB z89h$izl@p|YzX4vGd(*;e^zzgioHT%;)mF{yw+u8Z)rMVT5R6KvBH&kX=B1Bfre9# zbBj1O2r^W2TGThHwFG&!DY7Rrv(!0u%k_2%br?*Ro;s<f!e*AloCRWwEtzJ|w_G^A kNTy?r@M3pKi;Xpz>TD~_w=^x?fAG-ZBS(*M3Nly&0J0=rq5uE@ literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/kit_mondialrelay/js/include_MR.js b/modules/mondialrelay/kit_mondialrelay/js/include_MR.js new file mode 100755 index 000000000..ddc54d7bc --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/js/include_MR.js @@ -0,0 +1,56 @@ +var gl_base_dir; + +function set_html_MR_recherche(obj, num, base_dir, cpt) +{ +gl_base_dir = base_dir; + +var html = '\ + <div style=\'z-index:9998;cursor: wait;position:absolute; top:0; left:0; height:100%; width:100%;display:none;\ + background-color:#cccccc;-moz-opacity:0.8; opacity:0.8; filter:alpha(opacity=80); -khtml-opacity:0.8;\' id=\'bg_detail_md_'+num+'\'></div>\ + <div id=\'detail_md_'+num+'\' style=\'position: absolute; background-color:#ffffff; float:left; width:740px; height:480px; border:1px solid #89a; overflow:none; text-align:left; z-index:9999; display:none;\'></div>\ + <table style=\'border:none;\'>\ + <tr style=\'border:none;\'>\ + <td valign=top style=\'border:none;\'><img src="'+base_dir+'modules/mondialrelay/kit_mondialrelay/MR_small.gif"></td>\ + <td valign=top style=\'border:none; width:500px;\'><strong><span id="MR_LgAdr1_'+obj.num+'">'+obj.address1+'</span></strong> - \ +<span id="MR_LgAdr2_'+obj.num+'">'+obj.address2+'</span>'; +if (obj.address2 != '') + html = html + ' - '; +html = html + '<span id="MR_LgAdr3_'+obj.num+'">'+obj.address3+'</span>'; +if (obj.address3 != '') + html = html + ' - '; +html = html + '<span id="MR_LgAdr4_'+obj.num+'">'+obj.address4+'</span>'; +if (obj.address4 != '') + html = html + ' - '; +html = html + '<span id="MR_CP_'+obj.num+'">'+obj.postcode+'</span> \ +<span id="MR_Ville_'+obj.num+'">'+obj.city+'</span> - \ +<span id="MR_Pays_'+obj.num+'">'+obj.iso_country+'</span></td>\ + <td valign=top style=\'border:none;\'><a href="#" onclick="recherche_MR_detail(\''+obj.num+'\',\''+obj.iso_country+'\',\''+num+'\'); return false;"><img src="'+base_dir+'modules/mondialrelay/kit_mondialrelay/loupe.gif" border="0"></a></td>\ + <td valign=top style=\'border:none;\'><input id="MRchoixRelais'+num+'_'+obj.num+'" name="MRchoixRelais_'+num+'" value="MR'+obj.num+'" onclick="select_PR_MR(\''+obj.num+'\',\''+num+'\')" type="radio"'; + if (obj.checked == '1' || cpt == 0) + html = html + ' checked="checked" '; + + html = html + '> </td>\ + </tr>\ + </table>'; + $('#mondialrelay_'+num).html($('#mondialrelay_'+num).html()+html); + if (obj.checked == '1' || cpt == 0) + select_PR_MR(obj.num, num); +} + +function include_mondialrelay(num) +{ + $('#form_mondialrelay_'+num).html('\ + <input id="MR_Selected_Num_'+num+'" name="MR_Selected_Num_'+num+'" type="hidden" >\ + <input id="MR_Selected_LgAdr1_'+num+'" name="MR_Selected_LgAdr1_'+num+'" type="hidden" >\ + <input id="MR_Selected_LgAdr2_'+num+'" name="MR_Selected_LgAdr2_'+num+'" type="hidden" >\ + <input id="MR_Selected_LgAdr3_'+num+'" name="MR_Selected_LgAdr3_'+num+'" type="hidden" >\ + <input id="MR_Selected_LgAdr4_'+num+'" name="MR_Selected_LgAdr4_'+num+'" type="hidden" >\ + <input id="MR_Selected_CP_'+num+'" name="MR_Selected_CP_'+num+'" type="hidden" >\ + <input id="MR_Selected_Ville_'+num+'" name="MR_Selected_Ville_'+num+'" type="hidden" >\ + <input id="MR_Selected_Pays_'+num+'" name="MR_Selected_Pays_'+num+'" type="hidden" >\ + \ + \ + <div id="recherche_MR_form_'+num+'" >\ + </div>\ + <div id="mondialprelay_'+num+'" style="padding:3px;"></div>'); +} diff --git a/modules/mondialrelay/kit_mondialrelay/js/ressources_MR.js b/modules/mondialrelay/kit_mondialrelay/js/ressources_MR.js new file mode 100755 index 000000000..ee04adafe --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/js/ressources_MR.js @@ -0,0 +1,344 @@ +var relativ_base_dir = _PS_MR_MODULE_DIR_; +var num_mode_actif = -1; + +img_loader = new Image; +img_loader.src = _PS_MR_MODULE_DIR_+'images/loader.gif'; + +var google_map_general = null; +var geocoder = null; +var recherche = 0; +var json_addresses = null; + +function affiche_mydiv_mr(id_carrier, args) +{ + if ($('#id_carrier_mr' + id_carrier).attr("checked") == true) + { + if ($('#mondialrelay_' + id_carrier).css('display') == 'none') + { + $('#mondialrelay_' + id_carrier).toggle('slow'); + $('#mondialrelay_' + id_carrier).show(); + if ($('#mondialrelay_' + id_carrier).html() == '') + recherche_MR(id_carrier, args); + else + $("#all_mondialrelay_map_" + id_carrier).show(); + } + } + else + { + if ($('#mondialrelay_' + id_carrier).css('display') == 'block') + $('#mondialrelay_' + id_carrier).toggle('slow'); + $('#mondialrelay_' + id_carrier).hide(); + $("#all_mondialrelay_map_" + id_carrier).hide(); + } +} + +function recherche_MR(num, args) +{ + $.ajax({ + type: "POST", + url: _PS_MR_MODULE_DIR_ + 'kit_mondialrelay/RecherchePointRelais_ajax.php', + data: args , + dataType: 'json', + beforeSend : function(params) + { + $('#loading_mr').show(); + }, + success: function(obj) + { + $('#loading_mr').hide(); + $('#mondialrelay_'+num).html(''); + $("#all_mondialrelay_map_" + num).show(); + var cpt = 0; + if (obj.error) + $('#mondialrelay_'+num).html('<div class="error"><p>'+server_error+'</p></div>'); + else + { + while (obj.addresses[cpt]) + { + if (obj.addresses[cpt].num) + set_html_MR_recherche(obj.addresses[cpt], num, obj.base_dir, cpt); + ++cpt; + } + if (!obj.addresses[0].num) + $('#mondialrelay_'+num).html('<div class="error"><p>'+address_error+'</p></div>'); + } + }, + error: function(xhr, ajaxOptions, thrownError) + { + + } + }); +} + + function masque_recherche_MR_detail(num) + { + document.getElementById('bg_detail_md_'+num).style.display='none'; + document.getElementById('detail_md_'+num).style.display='none'; + document.getElementById('detail_md_'+num).innerHTML='' + } + + function recherche_MR_detail(num, pays, num_mode) + { + oXmlhttpMR5.open('POST',_PS_MR_MODULE_DIR_ + 'kit_mondialrelay/RechercheDetailPointRelais_ajax.php'); + oXmlhttpMR5.onreadystatechange=function() { + if (oXmlhttpMR5.readyState==1) { + var arrayPageSize = getPageSize_MR(); + var arrayScroll = getPageScroll_MR(); + document.getElementById('bg_detail_md_'+num_mode).style.height = (arrayPageSize[1] + 'px'); + document.getElementById('bg_detail_md_'+num_mode).style.display='block'; + document.getElementById('detail_md_'+num_mode).style.top = (Math.round(arrayScroll[1]+(arrayPageSize[3]-480)/2)+ 'px'); + document.getElementById('detail_md_'+num_mode).style.left = (Math.round((arrayPageSize[2]-740)/2)+ 'px'); + document.getElementById('detail_md_'+num_mode).innerHTML="<table width=100%><tr height=478 style='border:none;'><td valing=middle style='border:none;'><center><img class='none' src='"+img_loader.src+"' ></center></td></tr></table>"; + document.getElementById('detail_md_'+num_mode).style.display='block'; + } + /*if (oXmlhttpMR5.readyState==2) { + var arrayPageSize = getPageSize_MR(); + var arrayScroll = getPageScroll_MR(); + document.getElementById('bg_detail_md').style.height = (arrayPageSize[1] + 'px'); + document.getElementById('bg_detail_md').style.display='block'; + document.getElementById('detail_md').style.top = (Math.round(arrayScroll[1]+(arrayPageSize[3]-480)/2)+ 'px'); + document.getElementById('detail_md').style.left = (Math.round((arrayPageSize[2]-740)/2)+ 'px'); + document.getElementById('detail_md').innerHTML="<table width=100%><tr height=478 style='border:none;'><td valing=middle style='border:none;'><center><img class='none' src='"+img_loader.src+"' ></center></td></tr></table>"; + document.getElementById('detail_md').style.display='block'; + }*/ + if (oXmlhttpMR5.readyState==4 && oXmlhttpMR5.status == 200) { + var response = oXmlhttpMR5.responseText || "z|"; + res=response.split('|'); + if (res[0]!=0 && res[0]!='a' && res[0]!='z') + {masque_recherche_MR_detail(num_mode); + message_MR(res[0]);} + else if (res[0]=='a') {document.getElementById('detail_md_'+res[2]).innerHTML=res[1];} + else if (res[0]=='z') {masque_recherche_MR_detail(res[2]); alert('Requ�te sans r�ponse.');} + else {document.getElementById('detail_md_'+res[2]).innerHTML=res[1];};}; + } + + oXmlhttpMR5.setRequestHeader("Content-type", "application/x-www-form-urlencoded; "); + var data = 'relativ_base_dir='+encodeURIComponent(relativ_base_dir)+'&Num='+encodeURIComponent(num)+'&Pays='+encodeURIComponent(pays)+'&num_mode='+num_mode; + oXmlhttpMR5.send (data); + + + } + +function select_PR_MR(num, id_carrier) +{ + if (num != '') + { + $('#MR_Selected_Num_'+id_carrier).val(num); + $('#MR_Selected_LgAdr1_'+id_carrier).val($('#MR_LgAdr1_'+num).html()); + $('#MR_Selected_LgAdr2_'+id_carrier).val($('#MR_LgAdr2_'+num).html()); + $('#MR_Selected_LgAdr3_'+id_carrier).val($('#MR_LgAdr3_'+num).html()); + $('#MR_Selected_LgAdr4_'+id_carrier).val($('#MR_LgAdr4_'+num).html()); + $('#MR_Selected_CP_'+id_carrier).val($('#MR_CP_'+num).html()); + $('#MR_Selected_Ville_'+id_carrier).val($('#MR_Ville_'+num).html()); + $('#MR_Selected_Pays_'+id_carrier).val($('#MR_Pays_'+num).html()); + } + else + { + $('#MR_Selected_Num_'+id_carrier).val(''); + $('#MR_Selected_LgAdr1_'+id_carrier).val(''); + $('#MR_Selected_LgAdr2_'+id_carrier).val(''); + $('#MR_Selected_LgAdr3_'+id_carrier).val(''); + $('#MR_Selected_LgAdr4_'+id_carrier).val(''); + $('#MR_Selected_CP_'+id_carrier).val(''); + $('#MR_Selected_Ville_'+id_carrier).val(''); + $('#MR_Selected_Pays_'+id_carrier).val(''); + }; + if (one_page_checkout == true) + { + $.ajax({ + type: 'POST', + url: gl_base_dir + 'modules/mondialrelay/kit_mondialrelay/mr_opc_ajax.php', + async: true, + cache: false, + data: 'Num='+$('#MR_Selected_Num_'+id_carrier).val()+'&LgAdr1='+$('#MR_Selected_LgAdr1_'+id_carrier).val()+'&LgAdr2='+$('#MR_Selected_LgAdr2_'+id_carrier).val()+'&LgAdr3='+$('#MR_Selected_LgAdr3_'+id_carrier).val()+'&LgAdr4='+$('#MR_Selected_LgAdr4_'+id_carrier).val()+'&CP='+ $('#MR_Selected_CP_'+id_carrier).val()+'&Ville='+$('#MR_Selected_Ville_'+id_carrier).val()+'&Pays='+$('#MR_Selected_Pays_'+id_carrier).val() + }); + } + + // 1.3 compatibility, hookProcessCarrier Missing + // Allow to fill the database with the selected information + $.ajax({ + type: 'POST', + url: _PS_MR_MODULE_DIR_ + 'ajax.php', + data: 'method=addSelectedCarrierToDB' + + '&id_carrier=' + id_carrier + + '&MR_Selected_Num_' + id_carrier + '=' + $('#MR_Selected_Num_' + id_carrier).val() + + '&MR_Selected_LgAdr1_' + id_carrier + '=' + $('#MR_Selected_LgAdr1_' + id_carrier).val() + + '&MR_Selected_LgAdr2_' + id_carrier + '=' + $('#MR_Selected_LgAdr2_' + id_carrier).val() + + '&MR_Selected_LgAdr3_' + id_carrier + '=' + $('#MR_Selected_LgAdr3_' + id_carrier).val() + + '&MR_Selected_LgAdr4_' + id_carrier + '=' + $('#MR_Selected_LgAdr4_' + id_carrier).val() + + '&MR_Selected_CP_' + id_carrier + '=' + $('#MR_Selected_CP_' + id_carrier).val() + + '&MR_Selected_Ville_' + id_carrier + '=' + $('#MR_Selected_Ville_' + id_carrier).val() + + '&MR_Selected_Pays_' + id_carrier + '=' + $('#MR_Selected_Pays_' + id_carrier).val(), + success: function(json) + { + //console.log(json); + }, + error: function(xhr, ajaxOptions, thrownError) + { + //console.log(xhr); + //console.log(thrownError); + //console.log(ajaxOptions); + } + }); + +} + +function message_MR(etat) +{ + if (etat == 'a') {alert("R�sultat vide");} + if (etat == 1) {alert("Enseigne invalide");} + if (etat == 2) {alert("Num�ro d'enseigne vide ou inexistant");} + if (etat == 3) {alert("Num�ro de compte enseigne invalide");} + if (etat == 5) {alert("Num�ro de dossier enseigne invalide");} + if (etat == 7) {alert("Num�ro de client enseigne invalide");} + if (etat == 9) {alert("Nom de ville non reconnu ou non unique");} + if (etat == 10) {alert("Type de collecte invalide ou incorrect (1/D > Domicile -- 3/R > Relais)");} + if (etat == 11) {alert("Num�ro de Point Relais de collecte invalide");} + if (etat == 12) {alert("Pays du Point Relais de collecte invalide");} + if (etat == 13) {alert("Type de livraison invalide ou incorrect (1/D > Domicile -- 3/R > Relais)");} + if (etat == 14) {alert("Num�ro du Point Relais de livraison invalide");} + if (etat == 15) {alert("Pays du Point Relais de livraison invalide");} + if (etat == 16) {alert("Code pays invalide");} + if (etat == 17) {alert("Adresse invalide");} + if (etat == 18) {alert("Ville invalide");} + if (etat == 19) {alert("Code postal invalide");} + if (etat == 20) {alert("Poids du colis invalide");} + if (etat == 21) {alert("Taille (Longueur + Hauteur) du colis invalide");} + if (etat == 22) {alert("Taille du Colis invalide");} + if (etat == 24) {alert("Num�ro de Colis Mondial Relay invalide");} + if (etat == 28) {alert("Mode de collecte invalide");} + if (etat == 29) {alert("Mode de livraison invalide");} + if (etat == 30) {alert("Adresse (L1) de l'exp�diteur invalide");} + if (etat == 31) {alert("Adresse (L2) de l'exp�diteur invalide");} + if (etat == 33) {alert("Adresse (L3) de l'exp�diteur invalide");} + if (etat == 34) {alert("Adresse (L4) de l'exp�diteur invalide");} + if (etat == 35) {alert("Ville de l'exp�diteur invalide");} + if (etat == 36) {alert("Code postal de l'exp�diteur invalide");} + if (etat == 37) {alert("Pays de l'exp�diteur invalide");} + if (etat == 38) {alert("Num�ro de t�l�phone de l'exp�diteur invalide");} + if (etat == 39) {alert("Adresse e-mail de l'exp�diteur invalide");} + if (etat == 40) {alert("Action impossible sans ville ni code postal");} + if (etat == 41) {alert("Mode de livraison invalide");} + if (etat == 42) {alert("Montant CRT invalide");} + if (etat == 43) {alert("Devise CRT invalide");} + if (etat == 44) {alert("Valeur du colis invalide");} + if (etat == 45) {alert("Devise de la valeur du colis invalide");} + if (etat == 46) {alert("Plage de num�ro d'exp�dition epuisee");} + if (etat == 47) {alert("Nombre de colis invalide");} + if (etat == 48) {alert("Multi-colis en Point Relais Interdit");} + if (etat == 49) {alert("Mode de collecte ou de livraison invalide");} + if (etat == 50) {alert("Adresse (L1) du destinataire invalide");} + if (etat == 51) {alert("Adresse (L2) du destinataire invalide");} + if (etat == 53) {alert("Adresse (L3) du destinataire invalide");} + if (etat == 54) {alert("Adresse (L4) du destinataire invalide");} + if (etat == 55) {alert("Ville du destinataire invalide");} + if (etat == 56) {alert("Code postal du destinataire invalide");} + if (etat == 57) {alert("Pays du destinataire invalide");} + if (etat == 58) {alert("Num�ro de t�l�phone du destinataire invalide");} + if (etat == 59) {alert("Adresse e-mail du destinataire invalide");} + if (etat == 60) {alert("Champ texte libre invalide");} + if (etat == 61) {alert("Top avisage invalide");} + if (etat == 62) {alert("Instruction de livraison invalide");} + if (etat == 63) {alert("Assurance invalide ou incorrecte");} + if (etat == 64) {alert("Temps de montage invalide");} + if (etat == 65) {alert("Top rendez-vous invalide");} + if (etat == 66) {alert("Top reprise invalide");} + if (etat == 70) {alert("Num�ro de Point Relais invalide");} + if (etat == 72) {alert("Langue exp�diteur invalide");} + if (etat == 73) {alert("Langue destinataire invalide");} + if (etat == 74) {alert("Langue invalide");} + if (etat == 80) {alert("Code tracing : Colis enregistre");} + if (etat == 81) {alert("Code tracing : Colis en traitement chez Mondial Relay");} + if (etat == 82) {alert("Code tracing : Colis livre");} + if (etat == 83) {alert("Code tracing : Anomalie");} + if (etat == 84) {alert("84 (R�serv� Code Tracing)");} + if (etat == 85) {alert("85 (R�serv� Code Tracing)");} + if (etat == 86) {alert("86 (R�serv� Code Tracing)");} + if (etat == 87) {alert("87 (R�serv� Code Tracing)");} + if (etat == 88) {alert("88 (R�serv� Code Tracing)");} + if (etat == 89) {alert("89 (R�serv� Code Tracing)");} + if (etat == 90) {alert("AS400 indisponible");} + if (etat == 91) {alert("Num�ro d'exp�dition invalide");} + if (etat == 93) {alert("Aucun �l�ment retourn� par le plan de tri\n\ + Si vous effectuez une collecte ou une livraison en Point Relais, v�rifiez que les\n\ + Point Relais sont bien disponibles.\n\ + Si vous effectuez une livraison � domicile, il est probable que le code postal que\n\ + vous avez indiquez n'existe pas.");} + if (etat == 94) {alert("Colis Inexistant");} + if (etat == 95) {alert("Compte Enseigne non active");} + if (etat == 96) {alert("Type d'enseigne incorrect en Base");} + if (etat == 97) {alert("Cl� de s�curit� invalide");} + if (etat == 98) {alert("Service Indisponible");} + if (etat == 99) {alert("Erreur g�n�rique du service\n\ + Cette erreur peut �tre d� autant � un probl�me technique du service qu'� des\n\ + donn�es incorrectes ou inexistantes dans la Base de Donn�es. Lorsque vous avez\n\ + cette erreur veuillez la notifier � Mondial Relay en pr�cisant la date et l'heure de la\n\ + connexion ainsi que les informations envoy�s au WebService afin d'effectuer une\n\ + v�rification.");} +} + + +function getPageScroll_MR() +{ + + var yScroll; + + if (self.pageYOffset) { + yScroll = self.pageYOffset; + } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict + yScroll = document.documentElement.scrollTop; + } else if (document.body) {// all other Explorers + yScroll = document.body.scrollTop; + } + + arrayPageScroll = new Array('',yScroll) + return arrayPageScroll; +} + + +function getPageSize_MR() +{ + + var xScroll, yScroll; + + if (window.innerHeight && window.scrollMaxY) { + xScroll = document.body.scrollWidth; + yScroll = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac + xScroll = document.body.scrollWidth; + yScroll = document.body.scrollHeight; + } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari + xScroll = document.body.offsetWidth; + yScroll = document.body.offsetHeight; + } + + var windowWidth, windowHeight; + if (self.innerHeight) { // all except Explorer + windowWidth = self.innerWidth; + windowHeight = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode + windowWidth = document.documentElement.clientWidth; + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { // other Explorers + windowWidth = document.body.clientWidth; + windowHeight = document.body.clientHeight; + } + + // for small pages with total height less then height of the viewport + if(yScroll < windowHeight){ + pageHeight = windowHeight; + } else { + pageHeight = yScroll; + } + + // for small pages with total width less then width of the viewport + if(xScroll < windowWidth){ + pageWidth = windowWidth; + } else { + pageWidth = xScroll; + } + + + arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) + return arrayPageSize; +} diff --git a/modules/mondialrelay/kit_mondialrelay/loading.gif b/modules/mondialrelay/kit_mondialrelay/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..33e386eb26fa373fea8336b26e5edfff56542737 GIT binary patch literal 6494 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 W7)bf^T00wX1TY$Z{MX~pzyAXbz^{1# literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/kit_mondialrelay/loupe.gif b/modules/mondialrelay/kit_mondialrelay/loupe.gif new file mode 100755 index 0000000000000000000000000000000000000000..530a8e9d4d8f90a14d72970325e985cec2e543a7 GIT binary patch literal 1756 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 literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/kit_mondialrelay/marker.gif b/modules/mondialrelay/kit_mondialrelay/marker.gif new file mode 100755 index 0000000000000000000000000000000000000000..3850b2cd1ff7924a9bb7cb76b0afb6a81a13b472 GIT binary patch literal 1196 zcmdth{ZpC+0KoAFK}BJJiiijsFQOAQh0JE*CWZ(b>2zK>U8iiiZi;#;b+$ZT>AIWF z0kfSiv@Bn)7MW+Zot{6qiO78G(3PHYM%*LLM0><X!v<3R8-4EkFMQJ_qH{?yBESST zp8)?sAP`;%gb&io7m4)uMq#|Yu|D2tG&%t78;C|@Fc>Tr8;Zr?@%S(-hKj||PGJKB z1JB@31qB5$2{<B=7*4<k2M3c#q=-NQnM|foC{!wyMx(t>CMATD5<^20DIw=5WG0iD zOrxBqQ7)VgW3$;JI!(kloz9?fIGpI{=*)0N2Ah$|W?p79u0*nOB3WE6m&fDfaU$}g zBW1Bs#c>=ypP!bN)|mXJR4V;EC8<U5minFKHX&b=cD_rJnwOXN)g@ukbz(t5L1AH` z`Mj_%JLdZ=iM)hr7D-D>OUug26jd?h<>eI>6_u5hV0KP*b+tmFsJ+dvsi{%c@oQ^q ze=W{mx_J$}UZiXi*45S3*Vi{RG=MkdU}+&(A_wI%n_Skex%NfdU0qvIM@NUfN!i)i z+11t6-QBI#YIj?k`}_Otn)ZQ#0o|io`vdLZ;Gq3s-^g(5&m(t7M@QjDy0Nh_cvuJj z^uy${$9jWqYHDiEpfeZ@Mx$|VMmM)G0zcEw&(FgK{ojVCCX;DtX=!<Rd1Yk<UVO2- zy1KTuW;UDG*Vio;3ut{|wOT<Cbgi3@ez$-&v(0AP+S;=JX?EGb?d|QIogD~z2|<u+ z*S@#6=lTnR9d?Jq;ew$3{e2jQ4-O6v4-cJA*y(g09UZ!zPS-y!x7+1$yN{2LJtuko z#~4Q_gg@W`Vopvtc>+Km10FxBcx(PXD_uLJP8gC+#*wi~759c7;g?IrX>)p?-s3(= zUFRXgQ(Hth)<<Gfdf%+-HC}v)_{P*F^@oE*p2BBlA|7usj~AovsC%WH+<=!1<7I&q zqVFW2Ci{}SXUz5@<?}37Q~9lnmVp^xwPf+O!^_w{n=6uv1r8?oa73aff3xqH3k?&i zCeWSlW!%pdeqbG~+V;^z(NiNXu5A!ZKVDr>@&h)`G$ePFzad!+FCx9$rLp^cceXJF z$bk~Ksx~veG)Z=qF{uJN8C?hYPp`4T&p61ddV2GxH5zN8I6<NRqYbj&`;EFF6R?=T zt?oOjPohwbhWbvxf{WE)0AMq@Ig>ZD@yh9G9e-aFF>89|bYJlUYKXbdV>vLPC*?u> zkWieD?wM}#3gE89@_Phdr+j>tph4%!oxeoll)?!*^SHN}QX*GbFJxORleoCYSxs1D l|F_d9%J?3Wi6l%+x2RA6z=*3F1_1TA6Yo#6gb;wY{{<jYpTqzF literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/kit_mondialrelay/mr_opc_ajax.php b/modules/mondialrelay/kit_mondialrelay/mr_opc_ajax.php new file mode 100644 index 000000000..2cb184a99 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/mr_opc_ajax.php @@ -0,0 +1,27 @@ +<?php + +include(dirname(__FILE__).'/../../../config/config.inc.php'); +include(dirname(__FILE__).'/../../../init.php'); +include(dirname(__FILE__).'/../mondialrelay.php'); + +global $cookie; + +$cart = new Cart($cookie->id_cart); +$result_MR = Db::getInstance()->ExecuteS("SELECT * FROM "._DB_PREFIX_."mr_method WHERE id_carrier='".(int)($cart->id_carrier)."' ;"); + +Db::getInstance()->delete(_DB_PREFIX_.'mr_selected','id_cart = "'.(int)($cart->id).'"'); +$mrselected = new MondialRelayClass(); +$mrselected->id_customer = $cart->id_customer; +$mrselected->id_method = $result_MR[0]['id_mr_method']; +$mrselected->id_cart = $cart->id; +$mrselected->MR_Selected_Num = $_POST['Num']; +$mrselected->MR_Selected_LgAdr1 = $_POST['LgAdr1']; +$mrselected->MR_Selected_LgAdr2 = $_POST['LgAdr2']; +$mrselected->MR_Selected_LgAdr3 = $_POST['LgAdr3']; +$mrselected->MR_Selected_LgAdr4 = $_POST['LgAdr4']; +$mrselected->MR_Selected_CP = $_POST['CP']; +$mrselected->MR_Selected_Ville = $_POST['Ville']; +$mrselected->MR_Selected_Pays = $_POST['Pays']; +$mrselected->save(); + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.nusoap_base.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.nusoap_base.php new file mode 100755 index 000000000..1f9eb6057 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.nusoap_base.php @@ -0,0 +1,995 @@ +<?php + +/* +$Id: class.nusoap_base.php 7091 2011-06-16 11:34:02Z mMarinetti $ + +NuSOAP - Web Services Toolkit for PHP + +Copyright (c) 2002 NuSphere Corporation + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +The NuSOAP project home is: +http://sourceforge.net/projects/nusoap/ + +The primary support for NuSOAP is the Help forum on the project home page. + +If you have any questions or comments, please email: + +Dietrich Ayala +dietrich@ganx4.com +http://dietrich.ganx4.com/nusoap + +NuSphere Corporation +http://www.nusphere.com + +*/ + +/* + * Some of the standards implmented in whole or part by NuSOAP: + * + * SOAP 1.1 (http://www.w3.org/TR/2000/NOTE-SOAP-20000508/) + * WSDL 1.1 (http://www.w3.org/TR/2001/NOTE-wsdl-20010315) + * SOAP Messages With Attachments (http://www.w3.org/TR/SOAP-attachments) + * XML 1.0 (http://www.w3.org/TR/2006/REC-xml-20060816/) + * Namespaces in XML 1.0 (http://www.w3.org/TR/2006/REC-xml-names-20060816/) + * XML Schema 1.0 (http://www.w3.org/TR/xmlschema-0/) + * RFC 2045 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies + * RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1 + * RFC 2617 HTTP Authentication: Basic and Digest Access Authentication + */ + +/* load classes + +// necessary classes +require_once('class.soapclient.php'); +require_once('class.soap_val.php'); +require_once('class.soap_parser.php'); +require_once('class.soap_fault.php'); + +// transport classes +require_once('class.soap_transport_http.php'); + +// optional add-on classes +require_once('class.xmlschema.php'); +require_once('class.wsdl.php'); + +// server class +require_once('class.soap_server.php');*/ + +// class variable emulation +// cf. http://www.webkreator.com/php?controller=techniques/php-static-class-variables.html +$GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel'] = 9; + +/** +* +* nusoap_base +* +* @author Dietrich Ayala <dietrich@ganx4.com> +* @author Scott Nichol <snichol@users.sourceforge.net> +* @version $Id: class.nusoap_base.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_base { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.9.5'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 7091 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the nusoap_xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel'] = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + $ret = "<!--\n" . $this->debug_str . "\n-->"; + return $ret; + } + + /** + * expands entities, e.g. changes '<' to '&lt;'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&amp;', $val); + $val = str_replace("'", '&apos;', $val); + $val = str_replace('"', '&quot;', $val); + $val = str_replace('<', '&lt;', $val); + $val = str_replace('>', '&gt;', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @param boolean $soapval Whether this is called from soapval. + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded',$soapval=false) { + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use, soapval=$soapval"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if (is_object($val) && get_class($val) == 'soapval' && (! $soapval)) { + $this->debug("serialize_val: serialize soapval"); + $xml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + $this->debug("serialize_val of soapval returning $xml"); + return $xml; + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + $this->debug("serialize_val: serialize null"); + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$xmlns$atts/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + $xml = "<$name$xmlns$type_str$atts xsi:nil=\"true\"/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + $this->debug("serialize_val: serialize xsd built-in primitive type"); + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + $xml = "<$name$xmlns$atts>$val</$name>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + $xml = "<$name$xmlns xsi:type=\"xsd:$type\"$atts>$val</$name>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + $this->debug("serialize_val: serialize boolean"); + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val</$name>"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val</$name>"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + $this->debug("serialize_val: serialize int"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val</$name>"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val</$name>"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + $this->debug("serialize_val: serialize float"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val</$name>"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val</$name>"; + } + break; + case (is_string($val) || $type == 'string'): + $this->debug("serialize_val: serialize string"); + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val</$name>"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val</$name>"; + } + break; + case is_object($val): + $this->debug("serialize_val: serialize object"); + if (get_class($val) == 'soapval') { + $this->debug("serialize_val: serialize soapval object"); + $pXml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + } else { + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$pXml</$name>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>$pXml</$name>"; + } + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || preg_match('/^ArrayOf/',$type)){ + $this->debug("serialize_val: serialize array"); + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml."</$name>"; + } else { + // got a struct + $this->debug("serialize_val: serialize struct"); + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= '<item>'; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= '</item>'; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= "</$name>"; + } + break; + default: + $this->debug("serialize_val: serialize unknown"); + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + $this->debug("serialize_val returning $xml"); + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $k => $v) { + if (is_object($v) && get_class($v) == 'soapval') { + $xml .= $this->serialize_val($v, false, false, false, false, false, $use); + } else { + $xml .= $this->serialize_val($v, $k, false, false, false, false, $use); + } + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialized array of headers to $headers"); + } + $headers = "<SOAP-ENV:Header>".$headers."</SOAP-ENV:Header>"; + } + // serialize envelope + return + '<?xml version="1.0" encoding="'.$this->soap_defencoding .'"?'.">". + '<SOAP-ENV:Envelope'.$ns_string.">". + $headers. + "<SOAP-ENV:Body>". + $body. + "</SOAP-ENV:Body>". + "</SOAP-ENV:Envelope>"; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $qname qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !preg_match('/^http:\/\//',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } + + /** + * represents the object as a string + * + * @return string + * @access public + */ + function __toString() { + return $this->varDump($this); + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param int $timestamp Unix time stamp +* @param boolean $utc Whether the time stamp is UTC or local +* @return mixed ISO 8601 date string or false +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + $pos = strrpos($datestr, "+"); + if ($pos === FALSE) { + $pos = strrpos($datestr, "-"); + } + if ($pos !== FALSE) { + if (strlen($datestr) == $pos + 5) { + $datestr = substr($datestr, 0, $pos + 3) . ':' . substr($datestr, -2); + } + } + if($utc){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + + if(preg_match($pattern,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @return mixed Unix timestamp (int) or false +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + if(preg_match($pattern,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); +// return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_fault.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_fault.php new file mode 100755 index 000000000..bc496e474 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_fault.php @@ -0,0 +1,89 @@ +<?php + + + + +/** +* Contains information for a SOAP fault. +* Mainly used for returning faults from deployed functions +* in a server instance. +* @author Dietrich Ayala <dietrich@ganx4.com> +* @version $Id: class.soap_fault.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_fault extends nusoap_base { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (SOAP-ENV:Client | SOAP-ENV:Server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function nusoap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + '<?xml version="1.0" encoding="'.$this->soap_defencoding.'"?>'. + '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'.$ns_string.">\n". + '<SOAP-ENV:Body>'. + '<SOAP-ENV:Fault>'. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + '</SOAP-ENV:Fault>'. + '</SOAP-ENV:Body>'. + '</SOAP-ENV:Envelope>'; + return $return_msg; + } +} + +/** + * Backward compatibility + */ +class soap_fault extends nusoap_fault { +} + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_parser.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_parser.php new file mode 100755 index 000000000..cce2874a0 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_parser.php @@ -0,0 +1,642 @@ +<?php + + + + +/** +* +* nusoap_parser class parses SOAP XML messages into native PHP values +* +* @author Dietrich Ayala <dietrich@ganx4.com> +* @author Scott Nichol <snichol@users.sourceforge.net> +* @version $Id: class.soap_parser.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_parser extends nusoap_base { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; // parsed SOAP Body + var $soapheader = NULL; // parsed SOAP Header + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '<?xml'); + if ($pos_xml !== FALSE) { + $xml_decl = substr($xml, $pos_xml, strpos($xml, '?>', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering nusoap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('in nusoap_parser ctor, message:'); + $this->appendDebug($this->varDump($this->message)); + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value + if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ + $this->soapheader = $this->message[$this->root_header]['result']; + } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if ($name == 'Envelope' && $this->status == '') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'envelope') { + $this->root_header = $pos; + $this->status = 'header'; + } elseif ($name == 'Body' && $this->status == 'envelope'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)) { + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(preg_match('/^http:\/\/www.w3.org\/[0-9]{4}\/XMLSchema$/',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + if (isset($this->message[$pos]['type']) && $this->message[$pos]['type'] == 'array') { + // do nothing: already processed arrayType + } else { + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '/([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]/'; + if(preg_match($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>"; + } + } elseif($pos >= $this->root_struct){ + $this->document .= "</" . (isset($prefix) ? $prefix . ':' : '') . "$name>"; + } + // switch status + if ($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif ($pos == $this->root_header) { + $this->status = 'envelope'; + } elseif ($name == 'Body' && $this->status == 'body') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'header') { // will never happen + $this->status = 'envelope'; + } elseif ($name == 'Envelope' && $this->status == 'envelope') { + $this->status = ''; + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message (SOAP Body) + * + * @return mixed + * @access public + * @deprecated use get_soapbody instead + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Body (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapbody(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Header (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapheader(){ + return $this->soapheader; + } + + /** + * get the unparsed SOAP Header + * + * @return string XML or empty if no Header + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector or generic compound type '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + $ret = is_array($params) ? $params : array(); + $this->debug('in buildVal, return:'); + $this->appendDebug($this->varDump($ret)); + return $ret; + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + $ret = $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $ret = $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $ret = $this->message[$pos]['cdata']; + $this->debug("in buildVal, return: $ret"); + return $ret; + } + } +} + +/** + * Backward compatibility + */ +class soap_parser extends nusoap_parser { +} + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_server.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_server.php new file mode 100755 index 000000000..87db07909 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_server.php @@ -0,0 +1,1126 @@ +<?php + + + + +/** +* +* nusoap_server allows the user to create a SOAP server +* that is capable of receiving messages and returning responses +* +* @author Dietrich Ayala <dietrich@ganx4.com> +* @author Scott Nichol <snichol@users.sourceforge.net> +* @version $Id: class.soap_server.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_server extends nusoap_base { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP Headers from request (parsed) + * @var mixed + * @access public + */ + var $requestHeader = NULL; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text or array of soapval or associative array) + * @var mixed + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function nusoap_server($wsdl=false){ + parent::nusoap_base(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In nusoap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In nusoap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['REQUEST_METHOD'])) { + $rm = $_SERVER['REQUEST_METHOD']; + } elseif (isset($HTTP_SERVER_VARS['REQUEST_METHOD'])) { + $rm = $HTTP_SERVER_VARS['REQUEST_METHOD']; + } else { + $rm = ''; + } + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, request method=$rm query string=$qs strlen(\$data)=" . strlen($data)); + + if ($rm == 'POST') { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } elseif (preg_match('/wsdl/', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if ($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL, "http://") !== false) { // assume URL + $this->debug("In service, re-direct for WSDL"); + header('Location: '.$this->externalWSDLURL); + } else { // assume file + $this->debug("In service, use file passthru for WSDL"); + header("Content-Type: text/xml\r\n"); + $pos = strpos($this->externalWSDLURL, "file://"); + if ($pos === false) { + $filename = $this->externalWSDLURL; + } else { + $filename = substr($this->externalWSDLURL, $pos + 7); + } + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + $this->debug("In service, serialize WSDL"); + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + $this->debug("In service, there is no WSDL"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($this->wsdl) { + $this->debug("In service, return Web description"); + print $this->wsdl->webDescription(); + } else { + $this->debug("In service, no Web description"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide a Web description"; + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('SOAP-ENV:Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('SOAP-ENV:Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + // + // if you are debugging in this area of the code, your service uses a class to implement methods, + // you use SOAP RPC, and the client is .NET, please be aware of the following... + // when the .NET wsdl.exe utility generates a proxy, it will remove the '.' or '..' from the + // method name. that is fine for naming the .NET methods. it is not fine for properly constructing + // the XML request and reading the XML response. you need to add the RequestElementName and + // ResponseElementName to the System.Web.Services.Protocols.SoapRpcMethodAttribute that wsdl.exe + // generates for the method. these parameters are used to specify the correct XML element names + // for .NET to use, i.e. the names with the '.' in them. + // + $orig_methodname = $this->methodname; + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('SOAP-ENV:Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + $this->debug("in invoke_method, delim=$delim"); + + $class = ''; + $method = ''; + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1) { + $try_class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + if (class_exists($try_class)) { + // get the class and method name + $class = $try_class; + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } else { + $this->debug("in invoke_method, class=$try_class not found"); + } + } else { + $try_class = ''; + $this->debug("in invoke_method, no class to try"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'('$orig_methodname') not defined in service('$try_class' '$delim')"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'/'$method_to_compare'('$orig_methodname') not defined in service/'$class'('$try_class' '$delim')"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('SOAP-ENV:Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param) || is_object($param)) { + $this->fault('SOAP-ENV:Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + if (is_array($this->methodparams)) { + $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams)); + } else { + $this->methodreturn = call_user_func_array($call_arg, array()); + } + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received data of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && is_object($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + if (sizeof($this->opData['output']['parts']) > 1) { + $this->debug('more than one output part, so use the method return unchanged'); + $opParams = $this->methodreturn; + } elseif (sizeof($this->opData['output']['parts']) == 1) { + $this->debug('exactly one output part, so wrap the method return in a simple array'); + // TODO: verify that it is not already wrapped! + //foreach ($this->opData['output']['parts'] as $name => $type) { + // $this->debug('wrap in element named ' . $name); + //} + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('SOAP-ENV:Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + if ($this->methodURI) { + $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'</'.$this->methodname.'Response>'; + } + } else { + if ($this->methodURI) { + $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'</'.$this->methodname.'Response>'; + } + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = '<ns1:'.$this->methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'</ns1:'.$this->methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($this->opData['output']['encodingStyle'])) { + $encodingStyle = $this->opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$this->opData['output']['use'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= "<!-- Content being gzipped -->"; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= "<!-- Content will not be gzipped: no gzencode -->"; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= "<!-- Content being deflated -->"; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= "<!-- Content will not be deflated: no gzcompress -->"; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Request not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + // parse response, get soap parser obj + $parser = new nusoap_parser($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('SOAP-ENV:Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_soapbody()'); + $this->methodparams = $parser->get_soapbody(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // get SOAP Header + $this->requestHeader = $parser->get_soapheader(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $soapaction = "$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occurred. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new nusoap_fault($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + // If server name has port number attached then strip it (else port number gets duplicated in WSDL output) (occurred using lighttpd and FastCGI) + $colon = strpos($SERVER_NAME,":"); + if ($colon) { + $SERVER_NAME = substr($SERVER_NAME, 0, $colon); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new nusoap_xmlschema('', '', $this->wsdl->namespaces); + if ($style == 'document') { + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo['elementFormDefault'] = 'qualified'; + } + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + +/** + * Backward compatibility + */ +class soap_server extends nusoap_server { +} + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_transport_http.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_transport_http.php new file mode 100755 index 000000000..dbefc8bb9 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_transport_http.php @@ -0,0 +1,1306 @@ +<?php + + + + +/** +* transport class for sending/receiving data via HTTP and HTTPS +* NOTE: PHP must be compiled with the CURL extension for HTTPS support +* +* @author Dietrich Ayala <dietrich@ganx4.com> +* @author Scott Nichol <snichol@users.sourceforge.net> +* @version $Id: class.soap_transport_http.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class soap_transport_http extends nusoap_base { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $response_status_line; // HTTP response status line + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $ch_options = array(); // cURL custom options + var $use_curl = false; // force cURL use + var $proxy = null; // proxy information (associative array) + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // certpassword: SSL certificate password + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + * + * @param string $url The URL to which to connect + * @param array $curl_options User-specified cURL options + * @param boolean $use_curl Whether to try to force cURL use + * @access public + */ + function soap_transport_http($url, $curl_options = NULL, $use_curl = false){ + parent::nusoap_base(); + $this->debug("ctor url=$url use_curl=$use_curl curl_options:"); + $this->appendDebug($this->varDump($curl_options)); + $this->setURL($url); + if (is_array($curl_options)) { + $this->ch_options = $curl_options; + } + $this->use_curl = $use_curl; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->setHeader('User-Agent', $this->title.'/'.$this->version.' ('.$rev[1].')'); + } + + /** + * sets a cURL option + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access private + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + curl_setopt($this->ch, $option, $value); + } + + /** + * sets an HTTP header + * + * @param string $name The name of the header + * @param string $value The value of the header + * @access private + */ + function setHeader($name, $value) { + $this->outgoing_headers[$name] = $value; + $this->debug("set header $name: $value"); + } + + /** + * unsets an HTTP header + * + * @param string $name The name of the header + * @access private + */ + function unsetHeader($name) { + if (isset($this->outgoing_headers[$name])) { + $this->debug("unset header $name"); + unset($this->outgoing_headers[$name]); + } + } + + /** + * sets the URL to which to connect + * + * @param string $url The URL to which to connect + * @access private + */ + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("parsed URL $k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->setHeader('Host', $this->host); + } else { + $this->setHeader('Host', $this->host.':'.$this->port); + } + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + /** + * gets the I/O method to use + * + * @return string I/O method to use (socket|curl|unknown) + * @access private + */ + function io_method() { + if ($this->use_curl || ($this->scheme == 'https') || ($this->scheme == 'http' && $this->authtype == 'ntlm') || ($this->scheme == 'http' && is_array($this->proxy) && $this->proxy['authtype'] == 'ntlm')) + return 'curl'; + if (($this->scheme == 'http' || $this->scheme == 'ssl') && $this->authtype != 'ntlm' && (!is_array($this->proxy) || $this->proxy['authtype'] != 'ntlm')) + return 'socket'; + return 'unknown'; + } + + /** + * establish an HTTP connection + * + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return boolean true if connected, false if not + * @access private + */ + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->io_method() == 'socket') { + if (!is_array($this->proxy)) { + $host = $this->host; + $port = $this->port; + } else { + $host = $this->proxy['host']; + $port = $this->proxy['port']; + } + + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->io_method() == 'curl') { + if (!extension_loaded('curl')) { +// $this->setError('cURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + $this->setError('The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to include cURL or change php.ini to load the PHP cURL extension.'); + return false; + } + // Avoid warnings when PHP does not have these options + if (defined('CURLOPT_CONNECTIONTIMEOUT')) + $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT; + else + $CURLOPT_CONNECTIONTIMEOUT = 78; + if (defined('CURLOPT_HTTPAUTH')) + $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH; + else + $CURLOPT_HTTPAUTH = 107; + if (defined('CURLOPT_PROXYAUTH')) + $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH; + else + $CURLOPT_PROXYAUTH = 111; + if (defined('CURLAUTH_BASIC')) + $CURLAUTH_BASIC = CURLAUTH_BASIC; + else + $CURLAUTH_BASIC = 1; + if (defined('CURLAUTH_DIGEST')) + $CURLAUTH_DIGEST = CURLAUTH_DIGEST; + else + $CURLAUTH_DIGEST = 2; + if (defined('CURLAUTH_NTLM')) + $CURLAUTH_NTLM = CURLAUTH_NTLM; + else + $CURLAUTH_NTLM = 8; + + $this->debug('connect using cURL'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "$this->scheme://$this->host:$this->port" : "$this->scheme://$this->host"; + // add path + $hostURL .= $this->path; + $this->setCurlOption(CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + if (ini_get('safe_mode') || ini_get('open_basedir')) { + $this->debug('safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION'); + $this->debug('safe_mode = '); + $this->appendDebug($this->varDump(ini_get('safe_mode'))); + $this->debug('open_basedir = '); + $this->appendDebug($this->varDump(ini_get('open_basedir'))); + } else { + $this->setCurlOption(CURLOPT_FOLLOWLOCATION, 1); + } + // ask for headers in the response output + $this->setCurlOption(CURLOPT_HEADER, 1); + // ask for the response output as the return value + $this->setCurlOption(CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// $this->setCurlOption(CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // I believe the following comment is now bogus, having applied to + // the code when it used CURLOPT_CUSTOMREQUEST to send the request. + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //$this->setCurlOption(CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->setHeader('Connection', 'close'); + } + // set timeouts + if ($connection_timeout != 0) { + $this->setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + } + if ($response_timeout != 0) { + $this->setCurlOption(CURLOPT_TIMEOUT, $response_timeout); + } + + if ($this->scheme == 'https') { + $this->debug('set cURL SSL verify options'); + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. + //$this->setCurlOption(CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 0); + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + $this->debug('set cURL certificate options'); + if (isset($this->certRequest['cainfofile'])) { + $this->setCurlOption(CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + $this->setCurlOption(CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + $this->setCurlOption(CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + $this->setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest['passphrase']); + } + if (isset($this->certRequest['certpassword'])) { + $this->setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest['certpassword']); + } + } + } + if ($this->authtype && ($this->authtype != 'certificate')) { + if ($this->username) { + $this->debug('set cURL username/password'); + $this->setCurlOption(CURLOPT_USERPWD, "$this->username:$this->password"); + } + if ($this->authtype == 'basic') { + $this->debug('set cURL for Basic authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_BASIC); + } + if ($this->authtype == 'digest') { + $this->debug('set cURL for digest authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_DIGEST); + } + if ($this->authtype == 'ntlm') { + $this->debug('set cURL for NTLM authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_NTLM); + } + } + if (is_array($this->proxy)) { + $this->debug('set cURL proxy options'); + if ($this->proxy['port'] != '') { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host'].':'.$this->proxy['port']); + } else { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host']); + } + if ($this->proxy['username'] || $this->proxy['password']) { + $this->debug('set cURL proxy authentication options'); + $this->setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy['username'].':'.$this->proxy['password']); + if ($this->proxy['authtype'] == 'basic') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_BASIC); + } + if ($this->proxy['authtype'] == 'ntlm') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_NTLM); + } + } + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * sends the SOAP request and gets the SOAP response via HTTP[S] + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError("Too many tries to get an OK response ($this->response_status_line)"); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * sends the SOAP request and gets the SOAP response via HTTPS using CURL + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + * @deprecated + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype digestRequest="); + $this->appendDebug($this->varDump($digestRequest)); + $this->debug("certRequest="); + $this->appendDebug($this->varDump($certRequest)); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->setHeader('Authorization', 'Basic '.base64_encode(str_replace(':','',$username).':'.$password)); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = md5($A1); + + // A2 = Method ":" digest-uri-value + $A2 = $this->request_method . ':' . $this->digest_uri; + + // H(A2) + $HA2 = md5($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = md5($unhashedDigest); + + $opaque = ''; + if (isset($digestRequest['opaque'])) { + $opaque = ', opaque="' . $digestRequest['opaque'] . '"'; + } + + $this->setHeader('Authorization', 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . $opaque . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'); + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + $this->debug('Authorization header not set for certificate'); + } elseif ($authtype == 'ntlm') { + // do nothing + $this->debug('Authorization header not set for ntlm'); + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->setHeader('SOAPAction', '"' . $soapaction . '"'); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->setHeader('Accept-Encoding', $enc); + if (!isset($this->outgoing_headers['Connection'])) { + $this->setHeader('Connection', 'close'); + $this->persistentConnection = false; + } + // deprecated as of PHP 5.3.0 + //set_magic_quotes_runtime(0); + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost use an empty string to remove proxy + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param string $proxyauthtype (basic|ntlm) + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 'basic') { + if ($proxyhost) { + $this->proxy = array( + 'host' => $proxyhost, + 'port' => $proxyport, + 'username' => $proxyusername, + 'password' => $proxypassword, + 'authtype' => $proxyauthtype + ); + if ($proxyusername != '' && $proxypassword != '' && $proxyauthtype = 'basic') { + $this->setHeader('Proxy-Authorization', ' Basic '.base64_encode($proxyusername.':'.$proxypassword)); + } + } else { + $this->debug('remove proxy'); + $proxy = null; + unsetHeader('Proxy-Authorization'); + } + } + + + /** + * Test if the given string starts with a header that is to be skipped. + * Skippable headers result from chunked transfer and proxy requests. + * + * @param string $data The string to check. + * @returns boolean Whether a skippable header was found. + * @access private + */ + function isSkippableCurlHeader(&$data) { + $skipHeaders = array( 'HTTP/1.1 100', + 'HTTP/1.0 301', + 'HTTP/1.1 301', + 'HTTP/1.0 302', + 'HTTP/1.1 302', + 'HTTP/1.0 401', + 'HTTP/1.1 401', + 'HTTP/1.0 200 Connection established'); + foreach ($skipHeaders as $hd) { + $prefix = substr($data, 0, strlen($hd)); + if ($prefix == $hd) return true; + } + + return false; + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /** + * Writes the payload, including HTTP headers, to $this->outgoing_payload. + * + * @param string $data HTTP body + * @param string $cookie_str data for HTTP Cookie header + * @return void + * @access private + */ + function buildPayload($data, $cookie_str = '') { + // Note: for cURL connections, $this->outgoing_payload is ignored, + // as is the Content-Length header, but these are still created as + // debugging guides. + + // add content-length header + if ($this->request_method != 'GET') { + $this->setHeader('Content-Length', strlen($data)); + } + + // start building outgoing payload: + if ($this->proxy) { + $uri = $this->url; + } else { + $uri = $this->uri; + } + $req = "$this->request_method $uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + /** + * sends the SOAP request via HTTP[S] + * + * @param string $data message data + * @param array $cookies cookies to send + * @return boolean true if OK, false if problem + * @access private + */ + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->io_method() == 'socket') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->io_method() == 'curl') { + // set payload + // cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with (so we no longer use this method!) + //$this->setCurlOption(CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + $curl_headers = array(); + foreach($this->outgoing_headers as $k => $v){ + if ($k == 'Connection' || $k == 'Content-Length' || $k == 'Host' || $k == 'Authorization' || $k == 'Proxy-Authorization') { + $this->debug("Skip cURL header $k: $v"); + } else { + $curl_headers[] = "$k: $v"; + } + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + $this->setCurlOption(CURLOPT_HTTPHEADER, $curl_headers); + $this->debug('set cURL HTTP headers'); + if ($this->request_method == "POST") { + $this->setCurlOption(CURLOPT_POST, 1); + $this->setCurlOption(CURLOPT_POSTFIELDS, $data); + $this->debug('set cURL POST data'); + } else { + } + // insert custom user-set cURL options + foreach ($this->ch_options as $key => $val) { + $this->setCurlOption($key, $val); + } + + $this->debug('set cURL payload'); + return true; + } + } + + /** + * gets the SOAP response via HTTP[S] + * + * @return string the response (also sets member variables like incoming_payload) + * @access private + */ + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->io_method() == 'socket') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 headers + if (isset($lb) && preg_match('/^HTTP\/1.1 100/',$data)) { + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "<pre>\nde-chunked:\n---------------\n$data\n\n---------------\n</pre>"; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->io_method() == 'curl') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'<br>'; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v<br>"; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '<pre>'; + //var_dump(curl_getinfo($this->ch)); + //echo '</pre>'; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // try removing skippable headers + $savedata = $data; + while ($this->isSkippableCurlHeader($data)) { + $this->debug("Found HTTP header to skip"); + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + if ($data == '') { + // have nothing left; just remove 100 header(s) + $data = $savedata; + while (preg_match('/^HTTP\/1.1 100/',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $this->response_status_line = $header_array[0]; + $arr = explode(' ', $this->response_status_line, 3); + $http_version = $arr[0]; + $http_status = (int)($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && ($http_status == 301 || $http_status == 302)) { + $this->debug("Got $http_status $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "<xmp>\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + /** + * sets the content-type for the SOAP message to be sent + * + * @param string $type the content type, MIME style + * @param mixed $charset character set used for encoding (or false) + * @access public + */ + function setContentType($type, $charset = false) { + $this->setHeader('Content-Type', $type . ($charset ? '; charset=' . $charset : '')); + } + + /** + * specifies that an HTTP persistent connection should be used + * + * @return boolean whether the request was honored by this method. + * @access public + */ + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->setHeader('Connection', 'Keep-Alive'); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = preg_split('/;/', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } +} + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_val.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_val.php new file mode 100755 index 000000000..9287e0861 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soap_val.php @@ -0,0 +1,106 @@ + +* @version $Id: class.soap_val.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class soapval extends nusoap_base { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use, true); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soapclient.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soapclient.php new file mode 100755 index 000000000..c21822967 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.soapclient.php @@ -0,0 +1,991 @@ +call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @author Scott Nichol +* @version $Id: class.soapclient.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_client extends nusoap_base { + + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $responseHeader = NULL; // SOAP Header from response (parsed) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $portName = ''; // port name to use in WSDL + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + var $curl_options = array(); // User-specified cURL options + var $bindingType = ''; // WSDL operation binding type + var $use_curl = false; // whether to always try to use cURL + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param mixed $wsdl optional, set to 'wsdl' or true if using WSDL + * @param string $proxyhost optional + * @param string $proxyport optional + * @param string $proxyusername optional + * @param string $proxypassword optional + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param string $portName optional portName in WSDL document + * @access public + */ + function nusoap_client($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30, $portName = ''){ + parent::nusoap_base(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + $this->portName = $portName; + + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->appendDebug('endpoint=' . $this->varDump($endpoint)); + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + $this->checkWSDL(); + } else { + $this->wsdlFile = $this->endpoint; + $this->wsdl = null; + $this->debug('will use lazy evaluation of wsdl from ' . $this->endpoint); + } + $this->endpointType = 'wsdl'; + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $operation SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call, normally an associative array mirroring the structure of the XML response, false for certain fatal errors + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params,$this->bindingType); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError('operation '.$operation.' not present in WSDL.'); + $this->debug("operation '$operation' not present in WSDL."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * check WSDL passed as an instance or pulled from an endpoint + * + * @access private + */ + function checkWSDL() { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('checkWSDL'); + // catch errors + if ($errstr = $this->wsdl->getError()) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap12')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap12'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + $this->debug('**************** WARNING: SOAP 1.2 BINDING *****************'); + } else { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } + + /** + * instantiate wsdl object and parse wsdl file + * + * @access public + */ + function loadWSDL() { + $this->debug('instantiating wsdl class with doc: '.$this->wsdlFile); + $this->wsdl = new wsdl('',$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout,$this->curl_options,$this->use_curl); + $this->wsdl->setCredentials($this->username, $this->password, $this->authtype, $this->certRequest); + $this->wsdl->fetchWSDL($this->wsdlFile); + $this->checkWSDL(); + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case preg_match('/^http/',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint, $this->curl_options, $this->use_curl); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(preg_match('/^http:/',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(preg_match('/^https/',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Response not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml: ' . $headers['content-type']); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + $parser = new nusoap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get SOAP headers + $this->responseHeader = $parser->get_soapheader(); + // get decoded message + $return = $parser->get_soapbody(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets user-specified cURL options + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access public + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + $this->curl_options[$option] = $value; + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param string $endpoint The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->debug("setEndpoint(\"$endpoint\")"); + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param mixed $headers String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->debug("setHeaders headers="); + $this->appendDebug($this->varDump($headers)); + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * get the SOAP response Header (parsed) + * + * @return mixed + * @access public + */ + function getHeader(){ + return $this->responseHeader; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc HTTP encoding + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->debug("setHTTPEncoding(\"$enc\")"); + $this->http_encoding = $enc; + } + + /** + * Set whether to try to use cURL connections if possible + * + * @param boolean $use Whether to try to use cURL + * @access public + */ + function setUseCURL($use) { + $this->debug("setUseCURL($use)"); + $this->use_curl = $use; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->debug("useHTTPPersistentConnection"); + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy() { + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"); + if ($this->getError()) { + $this->debug("Error from _getProxyClassCode, so return NULL"); + return null; + } + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new nusoap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->certRequest = $this->certRequest; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->http_encoding = $this->http_encoding; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->persistentConnection = &$this->persistentConnection; + $proxy->decode_utf8 = $this->decode_utf8; + $proxy->curl_options = $this->curl_options; + $proxy->bindingType = $this->bindingType; + $proxy->use_curl = $this->use_curl; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + $this->debug("in getProxy endpointType=$this->endpointType"); + $this->appendDebug("wsdl=" . $this->varDump($this->wsdl)); + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + $evalStr = "echo \"$evalStr\";"; + return $evalStr; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) { + return "echo \"" . $this->getError() . "\";"; + } + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class nusoap_proxy_'.$r.' extends nusoap_client { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return boolean if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return boolean always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return boolean always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} + +if (!extension_loaded('soap')) { + /** + * For backwards compatiblity, define soapclient unless the PHP SOAP extension is loaded. + */ + class soapclient extends nusoap_client { + } +} +?> diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdl.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdl.php new file mode 100755 index 000000000..d775098af --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdl.php @@ -0,0 +1,1937 @@ + +* @author Scott Nichol +* @version $Id: class.wsdl.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class wsdl extends nusoap_base { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + var $curl_options = array(); // User-specified cURL options + var $use_curl = false; // whether to always try to use cURL + // for HTTP authentication + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param array $curl_options user-specified cURL options + * @param boolean $use_curl try to use cURL + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30,$curl_options=null,$use_curl=false){ + parent::nusoap_base(); + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + if (is_array($curl_options)) + $this->curl_options = $curl_options; + $this->use_curl = $use_curl; + $this->fetchWSDL($wsdl); + } + + /** + * fetches the WSDL document and parses it + * + * @access public + */ + function fetchWSDL($wsdl) { + $this->debug("parse and process WSDL path=$wsdl"); + $this->wsdl = $wsdl; + // parse wsdl file + if ($this->wsdl != "") { + $this->parseWSDL($this->wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + // Set operation style if necessary, but do not override one already provided + if (isset($bindingData['style']) && !isset($this->bindings[$binding]['operations'][$operation]['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') { + $this->debug("parse WSDL at path=$wsdl"); + + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl, $this->curl_options, $this->use_curl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if ($this->authtype != '') { + $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'Getting ' . $wsdl . ' - HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (preg_match('/schema$/', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new nusoap_xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (preg_match('/^xmlns/',$k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (preg_match('/:/', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with type) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with element) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element'] . '^'; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*preg_match('/types$/', $name) ||*/ preg_match('/schema$/', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $portName WSDL port name + * @param string $bindingType eg: soap, smtp, dime (only soap and soap12 are currently supported) + * @return array + * @access public + */ + function getOperations($portName = '', $bindingType = 'soap') { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } else { + $this->debug("getOperations bindingType $bindingType may not be supported"); + } + $this->debug("getOperations for port '$portName' bindingType $bindingType"); + // loop thru ports + foreach($this->ports as $port => $portData) { + $this->debug("getOperations checking port $port bindingType " . $portData['bindingType']); + if ($portName == '' || $port == $portName) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + $this->debug("getOperations found port $port bindingType $bindingType"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + } + if (count($ops) == 0) { + $this->debug("getOperations found no operations for port '$portName' bindingType $bindingType"); + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation name of operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param string $type the type + * @param string $ns namespace (not prefix) of the type + * @return mixed + * @access public + * @see nusoap_xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (!isset($this->schemas[$ns])) { + foreach ($this->schemas as $ns0 => $schema0) { + if (strcasecmp($ns, $ns0) == 0) { + $this->debug("in getTypeDef: replacing schema namespace $ns with $ns0"); + $ns = $ns0; + break; + } + } + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + $this->debug("in getTypeDef: found type $type"); + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } else { + $this->debug("did not find type for [element] $type"); + } + } + return $t; + } + } + $this->debug("in getTypeDef: did not find type $type"); + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $localPart = $this->getLocalPart($partType); + $typeDef = $this->getTypeDef($localPart, $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + if (substr($localPart, -1) == '^') { + $localPart = substr($localPart, 0, -1); + } + } else { + $elementortype = 'type'; + } + $xml .= "\n" . ' '; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' ' . htmlspecialchars($opParts['documentation']) . ''; + } + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + } + $portType_xml .= "\n" . ''; + $binding_xml .= "\n" . ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + } + } + $xml .= "\n" . ''; + return $xml . "\n"; + } + + /** + * determine whether a set of parameters are unwrapped + * when they are expect to be wrapped, Microsoft-style. + * + * @param string $type the type (element name) of the wrapper + * @param array $parameters the parameter values for the SOAP call + * @return boolean whether they parameters are unwrapped (and should be wrapped) + * @access private + */ + function parametersMatchWrapped($type, &$parameters) { + $this->debug("in parametersMatchWrapped type=$type, parameters="); + $this->appendDebug($this->varDump($parameters)); + + // split type into namespace:unqualified-type + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in parametersMatchWrapped: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in parametersMatchWrapped: expanded prefixed type: $uqType, $ns"); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in parametersMatchWrapped: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + + // get the type information + if (!$typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("in parametersMatchWrapped: $type ($uqType) is not a supported type."); + return false; + } + $this->debug("in parametersMatchWrapped: found typeDef="); + $this->appendDebug($this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + $phpType = $typeDef['phpType']; + $arrayType = (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : ''); + $this->debug("in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType"); + + // we expect a complexType or element of complexType + if ($phpType != 'struct') { + $this->debug("in parametersMatchWrapped: not a struct"); + return false; + } + + // see whether the parameter names match the elements + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $elements = 0; + $matches = 0; + foreach ($typeDef['elements'] as $name => $attrs) { + if (isset($parameters[$name])) { + $this->debug("in parametersMatchWrapped: have parameter named $name"); + $matches++; + } else { + $this->debug("in parametersMatchWrapped: do not have parameter named $name"); + } + $elements++; + } + + $this->debug("in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names"); + if ($matches == 0) { + return false; + } + return true; + } + + // since there are no elements for the type, if the user passed no + // parameters, the parameters match wrapped. + $this->debug("in parametersMatchWrapped: no elements type $ns:$uqType"); + return count($parameters) == 0; + } + + /** + * serialize PHP values according to a WSDL message definition + * contrary to the method name, this is not limited to RPC + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @param string $bindingType (soap|soap12) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters, $bindingType = 'soap') { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation, $bindingType)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + return false; + } + $this->debug('in serializeRPCParameters: opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + $parts = &$opData[$direction]['parts']; + $part_count = sizeof($parts); + $style = $opData['style']; + $use = $opData[$direction]['use']; + $this->debug("have $part_count part(s) to serialize using $style/$use"); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $parameter_count = count($parameters); + $this->debug("have $parameter_count parameter(s) provided as $parametersArrayType to serialize"); + // check for Microsoft-style wrapped parameters + if ($style == 'document' && $use == 'literal' && $part_count == 1 && isset($parts['parameters'])) { + $this->debug('check whether the caller has wrapped the parameters'); + if ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1) { + // TODO: consider checking here for double-wrapping, when + // service function wraps, then NuSOAP wraps again + $this->debug("change simple array to associative with 'parameters' element"); + $parameters['parameters'] = $parameters[0]; + unset($parameters[0]); + } + if (($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) { + $this->debug('check whether caller\'s parameters match the wrapped ones'); + if ($this->parametersMatchWrapped($parts['parameters'], $parameters)) { + $this->debug('wrap the parameters for the caller'); + $parameters = array('parameters' => $parameters); + $parameter_count = 1; + } + } + } + foreach ($parts as $name => $type) { + $this->debug("serializing part $name of type $type"); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'Array') { + // JBoss/Axis does this sometimes + return $this->serialize_val($value, $name, false, false, false, false, $use); + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + } + if (!isset($typeDef['phpType'])) { + $this->setError("$type ($uqType) has no phpType."); + $this->debug("in serializeType: $type ($uqType) has no phpType."); + return false; + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs and nillable + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + if (isset($typeDef['simpleContent']) && $typeDef['simpleContent'] == 'true') { + if (isset($value['!'])) { + $xml .= $value['!']; + $this->debug("in serializeType: serialized simpleContent for type $type"); + } else { + $this->debug("in serializeType: no simpleContent to serialize for type $type"); + } + } else { + // complexContent + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $this->debug("serializeComplexTypeAttributes for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize attributes for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeAttributes($typeDefx, $value, $nsx, $uqTypex); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $this->debug("in serializeComplexTypeElements for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize elements for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeElements($typeDefx, $value, $nsx, $uqTypex, $use, $encodingStyle); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (is_null($v) && isset($attrs['minOccurs']) && $attrs['minOccurs'] == '0') { + // do nothing + } elseif (is_null($v) && isset($attrs['nillable']) && $attrs['nillable'] == 'true') { + // TODO: serialize a nil correctly, but for now serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } elseif (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string $name + * @param string $typeClass (complexType|simpleType|attribute) + * @param string $phpType currently supported are array and struct (php assoc array) + * @param string $compositor (all|sequence|choice) + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array $elements e.g. array ( name => array(name=>'',type=>'') ) + * @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string $arrayType as namespace:name (xsd:string) + * @see nusoap_xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + $eElements = array(); + foreach($elements as $n => $e){ + // expand each element + $ee = array(); + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see nusoap_xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name . '^'); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType', 'form' => 'qualified')); + $out = array('parameters' => 'tns:' . $name . 'Response' . '^'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdlcache.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdlcache.php new file mode 100755 index 000000000..990a0c7ae --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.wsdlcache.php @@ -0,0 +1,209 @@ + +* @author Ingo Fischer +* @version $Id: class.wsdlcache.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_wsdlcache { + /** + * @var resource + * @access private + */ + var $fplock; + /** + * @var integer + * @access private + */ + var $cache_lifetime; + /** + * @var string + * @access private + */ + var $cache_dir; + /** + * @var string + * @access public + */ + var $debug_str = ''; + + /** + * constructor + * + * @param string $cache_dir directory for cache-files + * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited + * @access public + */ + function nusoap_wsdlcache($cache_dir='.', $cache_lifetime=0) { + $this->fplock = array(); + $this->cache_dir = $cache_dir != '' ? $cache_dir : '.'; + $this->cache_lifetime = $cache_lifetime; + } + + /** + * creates the filename used to cache a wsdl instance + * + * @param string $wsdl The URL of the wsdl instance + * @return string The filename used to cache the instance + * @access private + */ + function createFilename($wsdl) { + return $this->cache_dir.'/wsdlcache-' . md5($wsdl); + } + + /** + * adds debug data to the class level debug string + * + * @param string $string debug data + * @access private + */ + function debug($string){ + $this->debug_str .= get_class($this).": $string\n"; + } + + /** + * gets a wsdl instance from the cache + * + * @param string $wsdl The URL of the wsdl instance + * @return object wsdl The cached wsdl instance, null if the instance is not in the cache + * @access public + */ + function get($wsdl) { + $filename = $this->createFilename($wsdl); + if ($this->obtainMutex($filename, "r")) { + // check for expired WSDL that must be removed from the cache + if ($this->cache_lifetime > 0) { + if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) { + unlink($filename); + $this->debug("Expired $wsdl ($filename) from cache"); + $this->releaseMutex($filename); + return null; + } + } + // see what there is to return + if (!file_exists($filename)) { + $this->debug("$wsdl ($filename) not in cache (1)"); + $this->releaseMutex($filename); + return null; + } + $fp = @fopen($filename, "r"); + if ($fp) { + $s = implode("", @file($filename)); + fclose($fp); + $this->debug("Got $wsdl ($filename) from cache"); + } else { + $s = null; + $this->debug("$wsdl ($filename) not in cache (2)"); + } + $this->releaseMutex($filename); + return (!is_null($s)) ? unserialize($s) : null; + } else { + $this->debug("Unable to obtain mutex for $filename in get"); + } + return null; + } + + /** + * obtains the local mutex + * + * @param string $filename The Filename of the Cache to lock + * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode + * @return boolean Lock successfully obtained ?! + * @access private + */ + function obtainMutex($filename, $mode) { + if (isset($this->fplock[md5($filename)])) { + $this->debug("Lock for $filename already exists"); + return false; + } + $this->fplock[md5($filename)] = fopen($filename.".lock", "w"); + if ($mode == "r") { + return flock($this->fplock[md5($filename)], LOCK_SH); + } else { + return flock($this->fplock[md5($filename)], LOCK_EX); + } + } + + /** + * adds a wsdl instance to the cache + * + * @param object wsdl $wsdl_instance The wsdl instance to add + * @return boolean WSDL successfully cached + * @access public + */ + function put($wsdl_instance) { + $filename = $this->createFilename($wsdl_instance->wsdl); + $s = serialize($wsdl_instance); + if ($this->obtainMutex($filename, "w")) { + $fp = fopen($filename, "w"); + if (! $fp) { + $this->debug("Cannot write $wsdl_instance->wsdl ($filename) in cache"); + $this->releaseMutex($filename); + return false; + } + fputs($fp, $s); + fclose($fp); + $this->debug("Put $wsdl_instance->wsdl ($filename) in cache"); + $this->releaseMutex($filename); + return true; + } else { + $this->debug("Unable to obtain mutex for $filename in put"); + } + return false; + } + + /** + * releases the local mutex + * + * @param string $filename The Filename of the Cache to lock + * @return boolean Lock successfully released + * @access private + */ + function releaseMutex($filename) { + $ret = flock($this->fplock[md5($filename)], LOCK_UN); + fclose($this->fplock[md5($filename)]); + unset($this->fplock[md5($filename)]); + if (! $ret) { + $this->debug("Not able to release lock for $filename"); + } + return $ret; + } + + /** + * removes a wsdl instance from the cache + * + * @param string $wsdl The URL of the wsdl instance + * @return boolean Whether there was an instance to remove + * @access public + */ + function remove($wsdl) { + $filename = $this->createFilename($wsdl); + if (!file_exists($filename)) { + $this->debug("$wsdl ($filename) not in cache to be removed"); + return false; + } + // ignore errors obtaining mutex + $this->obtainMutex($filename, "w"); + $ret = unlink($filename); + $this->debug("Removed ($ret) $wsdl ($filename) from cache"); + $this->releaseMutex($filename); + return $ret; + } +} + +/** + * For backward compatibility + */ +class wsdlcache extends nusoap_wsdlcache { +} +?> diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.xmlschema.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.xmlschema.php new file mode 100755 index 000000000..1552e8254 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/class.xmlschema.php @@ -0,0 +1,972 @@ + +* @author Scott Nichol +* @version $Id: class.xmlschema.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_xmlschema extends nusoap_base { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function nusoap_xmlschema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base(); + $this->debug('nusoap_xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml path/URL to XML file + * @param string $type (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * gets a type name for an unnamed type + * + * @param string Element name + * @return string A type name for an unnamed type + * @access private + */ + function CreateTypeName($ename) { + $scope = ''; + for ($i = 0; $i < count($this->complexTypeStack); $i++) { + $scope .= $this->complexTypeStack[$i] . '_'; + } + return $scope . $ename . '_ContainedType'; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(preg_match('/^xmlns/',$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + // TODO: handle globals + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + $this->xdebug("do nothing for element $name"); + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + // TODO: what is the scope of named complexTypes that appear + // nested within other c complexTypes? + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } else { + $name = $this->CreateTypeName($this->currentElement); + $this->xdebug('processing unnamed complexType for element ' . $this->currentElement . ' named ' . $name); + $this->currentComplexType = $name; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'false'; + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + if (!isset($attrs['form'])) { + if ($this->currentComplexType) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } else { + // global + $attrs['form'] = 'qualified'; + } + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $type = $this->CreateTypeName($this->currentComplexType . '_' . $attrs['name']); + $this->xdebug("processing untyped element " . $attrs['name'] . ' type ' . $type); + $this->currentElement = $attrs['name']; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $type; + $ename = $attrs['name']; + } + if (isset($ename) && $this->currentComplexType) { + $this->xdebug("add element $ename to complexType $this->currentComplexType"); + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } elseif (!isset($attrs['ref'])) { + $this->xdebug("add element $ename to elements array"); + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $ns = $this->getPrefix($attrs['base']); + if ($ns == '') { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $this->schemaTargetNamespace . ':' . $attrs['base']; + } else { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + } else { + $this->xdebug('no current complexType to set extensionBase'); + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'include': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('include into namespace ' . $this->schemaTargetNamespace . ' from ' . $attrs['schemaLocation']); + $this->imports[$this->schemaTargetNamespace][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('ignoring invalid XML Schema construct: include without schemaLocation attribute'); + } + break; + case 'list': // simpleType value list + $this->xdebug("do nothing for element $name"); + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + if ($this->currentComplexType) { // This should *always* be + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'true'; + } else { + $this->xdebug("do nothing for element $name because there is no current complexType"); + } + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $name = $this->CreateTypeName($this->currentComplexType . '_' . $this->currentElement); + $this->xdebug('processing unnamed simpleType for element ' . $this->currentElement . ' named ' . $name); + $this->currentSimpleType = $name; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + $this->xdebug("do nothing for element $name"); + break; + default: + $this->xdebug("do not have any logic to process element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->xdebug($this->varDump($this->complexTypes[$this->currentComplexType])); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->xdebug($this->varDump($this->simpleTypes[$this->currentSimpleType])); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\">\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " \n "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $attr = ''; + foreach ($this->schemaInfo as $k => $v) { + if ($k == 'elementFormDefault' || $k == 'attributeFormDefault') { + $attr .= " $k=\"$v\""; + } + } + $el = "<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\""; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type name of defined type + * @param string $ns namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string $type + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if (substr($type, -1) == '^') { + $is_element = 1; + $type = substr($type, 0, -1); + } else { + $is_element = 0; + } + + if((! $is_element) && isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif((! $is_element) && isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + if (isset($etype['extensionBase'])) { + $this->elements[$type]['extensionBase'] = $etype['extensionBase']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (preg_match('/_ContainedType$/', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($typeDef['attrs'] as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name name for type instance + * @param string $type name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see nusoap_xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + +/** + * Backward compatibility + */ +class XMLSchema extends nusoap_xmlschema { +} + + diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoap.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoap.php new file mode 100755 index 000000000..7d1fa1f92 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoap.php @@ -0,0 +1,8148 @@ + +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_base { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.9.5'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 7091 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the nusoap_xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel'] = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + $ret = ""; + return $ret; + } + + /** + * expands entities, e.g. changes '<' to '<'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&', $val); + $val = str_replace("'", ''', $val); + $val = str_replace('"', '"', $val); + $val = str_replace('<', '<', $val); + $val = str_replace('>', '>', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @param boolean $soapval Whether this is called from soapval. + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded',$soapval=false) { + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use, soapval=$soapval"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if (is_object($val) && get_class($val) == 'soapval' && (! $soapval)) { + $this->debug("serialize_val: serialize soapval"); + $xml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + $this->debug("serialize_val of soapval returning $xml"); + return $xml; + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + $this->debug("serialize_val: serialize null"); + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$xmlns$atts/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + $xml = "<$name$xmlns$type_str$atts xsi:nil=\"true\"/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + $this->debug("serialize_val: serialize xsd built-in primitive type"); + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + $xml = "<$name$xmlns$atts>$val"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + $xml = "<$name$xmlns xsi:type=\"xsd:$type\"$atts>$val"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + $this->debug("serialize_val: serialize boolean"); + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + $this->debug("serialize_val: serialize int"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + $this->debug("serialize_val: serialize float"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val"; + } + break; + case (is_string($val) || $type == 'string'): + $this->debug("serialize_val: serialize string"); + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val"; + } + break; + case is_object($val): + $this->debug("serialize_val: serialize object"); + if (get_class($val) == 'soapval') { + $this->debug("serialize_val: serialize soapval object"); + $pXml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + } else { + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$pXml"; + } else { + $xml .= "<$name$xmlns$type_str$atts>$pXml"; + } + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || preg_match('/^ArrayOf/',$type)){ + $this->debug("serialize_val: serialize array"); + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml.""; + } else { + // got a struct + $this->debug("serialize_val: serialize struct"); + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= ''; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= ''; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= ""; + } + break; + default: + $this->debug("serialize_val: serialize unknown"); + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + $this->debug("serialize_val returning $xml"); + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $k => $v) { + if (is_object($v) && get_class($v) == 'soapval') { + $xml .= $this->serialize_val($v, false, false, false, false, false, $use); + } else { + $xml .= $this->serialize_val($v, $k, false, false, false, false, $use); + } + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialized array of headers to $headers"); + } + $headers = "".$headers.""; + } + // serialize envelope + return + 'soap_defencoding .'"?'.">". + '". + $headers. + "". + $body. + "". + ""; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $qname qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !preg_match('/^http:\/\//',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } + + /** + * represents the object as a string + * + * @return string + * @access public + */ + function __toString() { + return $this->varDump($this); + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param int $timestamp Unix time stamp +* @param boolean $utc Whether the time stamp is UTC or local +* @return mixed ISO 8601 date string or false +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + $pos = strrpos($datestr, "+"); + if ($pos === FALSE) { + $pos = strrpos($datestr, "-"); + } + if ($pos !== FALSE) { + if (strlen($datestr) == $pos + 5) { + $datestr = substr($datestr, 0, $pos + 3) . ':' . substr($datestr, -2); + } + } + if($utc){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + + if(preg_match($pattern,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @return mixed Unix timestamp (int) or false +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + if(preg_match($pattern,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); +// return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + +?> +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_fault extends nusoap_base { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (SOAP-ENV:Client | SOAP-ENV:Server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function nusoap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + 'soap_defencoding.'"?>'. + '\n". + ''. + ''. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + ''. + ''. + ''; + return $return_msg; + } +} + +/** + * Backward compatibility + */ +class soap_fault extends nusoap_fault { +} + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_xmlschema extends nusoap_base { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function nusoap_xmlschema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base(); + $this->debug('nusoap_xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml path/URL to XML file + * @param string $type (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * gets a type name for an unnamed type + * + * @param string Element name + * @return string A type name for an unnamed type + * @access private + */ + function CreateTypeName($ename) { + $scope = ''; + for ($i = 0; $i < count($this->complexTypeStack); $i++) { + $scope .= $this->complexTypeStack[$i] . '_'; + } + return $scope . $ename . '_ContainedType'; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(preg_match('/^xmlns/',$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + // TODO: handle globals + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + $this->xdebug("do nothing for element $name"); + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + // TODO: what is the scope of named complexTypes that appear + // nested within other c complexTypes? + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } else { + $name = $this->CreateTypeName($this->currentElement); + $this->xdebug('processing unnamed complexType for element ' . $this->currentElement . ' named ' . $name); + $this->currentComplexType = $name; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'false'; + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + if (!isset($attrs['form'])) { + if ($this->currentComplexType) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } else { + // global + $attrs['form'] = 'qualified'; + } + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $type = $this->CreateTypeName($this->currentComplexType . '_' . $attrs['name']); + $this->xdebug("processing untyped element " . $attrs['name'] . ' type ' . $type); + $this->currentElement = $attrs['name']; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $type; + $ename = $attrs['name']; + } + if (isset($ename) && $this->currentComplexType) { + $this->xdebug("add element $ename to complexType $this->currentComplexType"); + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } elseif (!isset($attrs['ref'])) { + $this->xdebug("add element $ename to elements array"); + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $ns = $this->getPrefix($attrs['base']); + if ($ns == '') { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $this->schemaTargetNamespace . ':' . $attrs['base']; + } else { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + } else { + $this->xdebug('no current complexType to set extensionBase'); + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'include': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('include into namespace ' . $this->schemaTargetNamespace . ' from ' . $attrs['schemaLocation']); + $this->imports[$this->schemaTargetNamespace][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('ignoring invalid XML Schema construct: include without schemaLocation attribute'); + } + break; + case 'list': // simpleType value list + $this->xdebug("do nothing for element $name"); + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + if ($this->currentComplexType) { // This should *always* be + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'true'; + } else { + $this->xdebug("do nothing for element $name because there is no current complexType"); + } + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $name = $this->CreateTypeName($this->currentComplexType . '_' . $this->currentElement); + $this->xdebug('processing unnamed simpleType for element ' . $this->currentElement . ' named ' . $name); + $this->currentSimpleType = $name; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + $this->xdebug("do nothing for element $name"); + break; + default: + $this->xdebug("do not have any logic to process element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->xdebug($this->varDump($this->complexTypes[$this->currentComplexType])); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->xdebug($this->varDump($this->simpleTypes[$this->currentSimpleType])); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\">\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " \n "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $attr = ''; + foreach ($this->schemaInfo as $k => $v) { + if ($k == 'elementFormDefault' || $k == 'attributeFormDefault') { + $attr .= " $k=\"$v\""; + } + } + $el = "<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\""; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type name of defined type + * @param string $ns namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string $type + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if (substr($type, -1) == '^') { + $is_element = 1; + $type = substr($type, 0, -1); + } else { + $is_element = 0; + } + + if((! $is_element) && isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif((! $is_element) && isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + if (isset($etype['extensionBase'])) { + $this->elements[$type]['extensionBase'] = $etype['extensionBase']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (preg_match('/_ContainedType$/', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($typeDef['attrs'] as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name name for type instance + * @param string $type name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see nusoap_xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + +/** + * Backward compatibility + */ +class XMLSchema extends nusoap_xmlschema { +} + +?> +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class soapval extends nusoap_base { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use, true); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class soap_transport_http extends nusoap_base { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $response_status_line; // HTTP response status line + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $ch_options = array(); // cURL custom options + var $use_curl = false; // force cURL use + var $proxy = null; // proxy information (associative array) + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // certpassword: SSL certificate password + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + * + * @param string $url The URL to which to connect + * @param array $curl_options User-specified cURL options + * @param boolean $use_curl Whether to try to force cURL use + * @access public + */ + function soap_transport_http($url, $curl_options = NULL, $use_curl = false){ + parent::nusoap_base(); + $this->debug("ctor url=$url use_curl=$use_curl curl_options:"); + $this->appendDebug($this->varDump($curl_options)); + $this->setURL($url); + if (is_array($curl_options)) { + $this->ch_options = $curl_options; + } + $this->use_curl = $use_curl; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->setHeader('User-Agent', $this->title.'/'.$this->version.' ('.$rev[1].')'); + } + + /** + * sets a cURL option + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access private + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + curl_setopt($this->ch, $option, $value); + } + + /** + * sets an HTTP header + * + * @param string $name The name of the header + * @param string $value The value of the header + * @access private + */ + function setHeader($name, $value) { + $this->outgoing_headers[$name] = $value; + $this->debug("set header $name: $value"); + } + + /** + * unsets an HTTP header + * + * @param string $name The name of the header + * @access private + */ + function unsetHeader($name) { + if (isset($this->outgoing_headers[$name])) { + $this->debug("unset header $name"); + unset($this->outgoing_headers[$name]); + } + } + + /** + * sets the URL to which to connect + * + * @param string $url The URL to which to connect + * @access private + */ + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("parsed URL $k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->setHeader('Host', $this->host); + } else { + $this->setHeader('Host', $this->host.':'.$this->port); + } + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + /** + * gets the I/O method to use + * + * @return string I/O method to use (socket|curl|unknown) + * @access private + */ + function io_method() { + if ($this->use_curl || ($this->scheme == 'https') || ($this->scheme == 'http' && $this->authtype == 'ntlm') || ($this->scheme == 'http' && is_array($this->proxy) && $this->proxy['authtype'] == 'ntlm')) + return 'curl'; + if (($this->scheme == 'http' || $this->scheme == 'ssl') && $this->authtype != 'ntlm' && (!is_array($this->proxy) || $this->proxy['authtype'] != 'ntlm')) + return 'socket'; + return 'unknown'; + } + + /** + * establish an HTTP connection + * + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return boolean true if connected, false if not + * @access private + */ + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->io_method() == 'socket') { + if (!is_array($this->proxy)) { + $host = $this->host; + $port = $this->port; + } else { + $host = $this->proxy['host']; + $port = $this->proxy['port']; + } + + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->io_method() == 'curl') { + if (!extension_loaded('curl')) { +// $this->setError('cURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + $this->setError('The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to include cURL or change php.ini to load the PHP cURL extension.'); + return false; + } + // Avoid warnings when PHP does not have these options + if (defined('CURLOPT_CONNECTIONTIMEOUT')) + $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT; + else + $CURLOPT_CONNECTIONTIMEOUT = 78; + if (defined('CURLOPT_HTTPAUTH')) + $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH; + else + $CURLOPT_HTTPAUTH = 107; + if (defined('CURLOPT_PROXYAUTH')) + $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH; + else + $CURLOPT_PROXYAUTH = 111; + if (defined('CURLAUTH_BASIC')) + $CURLAUTH_BASIC = CURLAUTH_BASIC; + else + $CURLAUTH_BASIC = 1; + if (defined('CURLAUTH_DIGEST')) + $CURLAUTH_DIGEST = CURLAUTH_DIGEST; + else + $CURLAUTH_DIGEST = 2; + if (defined('CURLAUTH_NTLM')) + $CURLAUTH_NTLM = CURLAUTH_NTLM; + else + $CURLAUTH_NTLM = 8; + + $this->debug('connect using cURL'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "$this->scheme://$this->host:$this->port" : "$this->scheme://$this->host"; + // add path + $hostURL .= $this->path; + $this->setCurlOption(CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + if (ini_get('safe_mode') || ini_get('open_basedir')) { + $this->debug('safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION'); + $this->debug('safe_mode = '); + $this->appendDebug($this->varDump(ini_get('safe_mode'))); + $this->debug('open_basedir = '); + $this->appendDebug($this->varDump(ini_get('open_basedir'))); + } else { + $this->setCurlOption(CURLOPT_FOLLOWLOCATION, 1); + } + // ask for headers in the response output + $this->setCurlOption(CURLOPT_HEADER, 1); + // ask for the response output as the return value + $this->setCurlOption(CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// $this->setCurlOption(CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // I believe the following comment is now bogus, having applied to + // the code when it used CURLOPT_CUSTOMREQUEST to send the request. + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //$this->setCurlOption(CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->setHeader('Connection', 'close'); + } + // set timeouts + if ($connection_timeout != 0) { + $this->setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + } + if ($response_timeout != 0) { + $this->setCurlOption(CURLOPT_TIMEOUT, $response_timeout); + } + + if ($this->scheme == 'https') { + $this->debug('set cURL SSL verify options'); + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. + //$this->setCurlOption(CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 0); + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + $this->debug('set cURL certificate options'); + if (isset($this->certRequest['cainfofile'])) { + $this->setCurlOption(CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + $this->setCurlOption(CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + $this->setCurlOption(CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + $this->setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest['passphrase']); + } + if (isset($this->certRequest['certpassword'])) { + $this->setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest['certpassword']); + } + } + } + if ($this->authtype && ($this->authtype != 'certificate')) { + if ($this->username) { + $this->debug('set cURL username/password'); + $this->setCurlOption(CURLOPT_USERPWD, "$this->username:$this->password"); + } + if ($this->authtype == 'basic') { + $this->debug('set cURL for Basic authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_BASIC); + } + if ($this->authtype == 'digest') { + $this->debug('set cURL for digest authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_DIGEST); + } + if ($this->authtype == 'ntlm') { + $this->debug('set cURL for NTLM authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_NTLM); + } + } + if (is_array($this->proxy)) { + $this->debug('set cURL proxy options'); + if ($this->proxy['port'] != '') { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host'].':'.$this->proxy['port']); + } else { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host']); + } + if ($this->proxy['username'] || $this->proxy['password']) { + $this->debug('set cURL proxy authentication options'); + $this->setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy['username'].':'.$this->proxy['password']); + if ($this->proxy['authtype'] == 'basic') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_BASIC); + } + if ($this->proxy['authtype'] == 'ntlm') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_NTLM); + } + } + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * sends the SOAP request and gets the SOAP response via HTTP[S] + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError("Too many tries to get an OK response ($this->response_status_line)"); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * sends the SOAP request and gets the SOAP response via HTTPS using CURL + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + * @deprecated + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype digestRequest="); + $this->appendDebug($this->varDump($digestRequest)); + $this->debug("certRequest="); + $this->appendDebug($this->varDump($certRequest)); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->setHeader('Authorization', 'Basic '.base64_encode(str_replace(':','',$username).':'.$password)); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = md5($A1); + + // A2 = Method ":" digest-uri-value + $A2 = $this->request_method . ':' . $this->digest_uri; + + // H(A2) + $HA2 = md5($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = md5($unhashedDigest); + + $opaque = ''; + if (isset($digestRequest['opaque'])) { + $opaque = ', opaque="' . $digestRequest['opaque'] . '"'; + } + + $this->setHeader('Authorization', 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . $opaque . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'); + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + $this->debug('Authorization header not set for certificate'); + } elseif ($authtype == 'ntlm') { + // do nothing + $this->debug('Authorization header not set for ntlm'); + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->setHeader('SOAPAction', '"' . $soapaction . '"'); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->setHeader('Accept-Encoding', $enc); + if (!isset($this->outgoing_headers['Connection'])) { + $this->setHeader('Connection', 'close'); + $this->persistentConnection = false; + } + // deprecated as of PHP 5.3.0 + //set_magic_quotes_runtime(0); + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost use an empty string to remove proxy + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param string $proxyauthtype (basic|ntlm) + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 'basic') { + if ($proxyhost) { + $this->proxy = array( + 'host' => $proxyhost, + 'port' => $proxyport, + 'username' => $proxyusername, + 'password' => $proxypassword, + 'authtype' => $proxyauthtype + ); + if ($proxyusername != '' && $proxypassword != '' && $proxyauthtype = 'basic') { + $this->setHeader('Proxy-Authorization', ' Basic '.base64_encode($proxyusername.':'.$proxypassword)); + } + } else { + $this->debug('remove proxy'); + $proxy = null; + unsetHeader('Proxy-Authorization'); + } + } + + + /** + * Test if the given string starts with a header that is to be skipped. + * Skippable headers result from chunked transfer and proxy requests. + * + * @param string $data The string to check. + * @returns boolean Whether a skippable header was found. + * @access private + */ + function isSkippableCurlHeader(&$data) { + $skipHeaders = array( 'HTTP/1.1 100', + 'HTTP/1.0 301', + 'HTTP/1.1 301', + 'HTTP/1.0 302', + 'HTTP/1.1 302', + 'HTTP/1.0 401', + 'HTTP/1.1 401', + 'HTTP/1.0 200 Connection established'); + foreach ($skipHeaders as $hd) { + $prefix = substr($data, 0, strlen($hd)); + if ($prefix == $hd) return true; + } + + return false; + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /** + * Writes the payload, including HTTP headers, to $this->outgoing_payload. + * + * @param string $data HTTP body + * @param string $cookie_str data for HTTP Cookie header + * @return void + * @access private + */ + function buildPayload($data, $cookie_str = '') { + // Note: for cURL connections, $this->outgoing_payload is ignored, + // as is the Content-Length header, but these are still created as + // debugging guides. + + // add content-length header + if ($this->request_method != 'GET') { + $this->setHeader('Content-Length', strlen($data)); + } + + // start building outgoing payload: + if ($this->proxy) { + $uri = $this->url; + } else { + $uri = $this->uri; + } + $req = "$this->request_method $uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + /** + * sends the SOAP request via HTTP[S] + * + * @param string $data message data + * @param array $cookies cookies to send + * @return boolean true if OK, false if problem + * @access private + */ + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->io_method() == 'socket') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->io_method() == 'curl') { + // set payload + // cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with (so we no longer use this method!) + //$this->setCurlOption(CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + $curl_headers = array(); + foreach($this->outgoing_headers as $k => $v){ + if ($k == 'Connection' || $k == 'Content-Length' || $k == 'Host' || $k == 'Authorization' || $k == 'Proxy-Authorization') { + $this->debug("Skip cURL header $k: $v"); + } else { + $curl_headers[] = "$k: $v"; + } + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + $this->setCurlOption(CURLOPT_HTTPHEADER, $curl_headers); + $this->debug('set cURL HTTP headers'); + if ($this->request_method == "POST") { + $this->setCurlOption(CURLOPT_POST, 1); + $this->setCurlOption(CURLOPT_POSTFIELDS, $data); + $this->debug('set cURL POST data'); + } else { + } + // insert custom user-set cURL options + foreach ($this->ch_options as $key => $val) { + $this->setCurlOption($key, $val); + } + + $this->debug('set cURL payload'); + return true; + } + } + + /** + * gets the SOAP response via HTTP[S] + * + * @return string the response (also sets member variables like incoming_payload) + * @access private + */ + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->io_method() == 'socket') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 headers + if (isset($lb) && preg_match('/^HTTP\/1.1 100/',$data)) { + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "
    \nde-chunked:\n---------------\n$data\n\n---------------\n
    "; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->io_method() == 'curl') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'
    '; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v
    "; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '
    ';
    +			//var_dump(curl_getinfo($this->ch));
    +			//echo '
    '; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // try removing skippable headers + $savedata = $data; + while ($this->isSkippableCurlHeader($data)) { + $this->debug("Found HTTP header to skip"); + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + if ($data == '') { + // have nothing left; just remove 100 header(s) + $data = $savedata; + while (preg_match('/^HTTP\/1.1 100/',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $this->response_status_line = $header_array[0]; + $arr = explode(' ', $this->response_status_line, 3); + $http_version = $arr[0]; + $http_status = (int)($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && ($http_status == 301 || $http_status == 302)) { + $this->debug("Got $http_status $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + /** + * sets the content-type for the SOAP message to be sent + * + * @param string $type the content type, MIME style + * @param mixed $charset character set used for encoding (or false) + * @access public + */ + function setContentType($type, $charset = false) { + $this->setHeader('Content-Type', $type . ($charset ? '; charset=' . $charset : '')); + } + + /** + * specifies that an HTTP persistent connection should be used + * + * @return boolean whether the request was honored by this method. + * @access public + */ + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->setHeader('Connection', 'Keep-Alive'); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = preg_split('/;/', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } +} + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_server extends nusoap_base { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP Headers from request (parsed) + * @var mixed + * @access public + */ + var $requestHeader = NULL; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text or array of soapval or associative array) + * @var mixed + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function nusoap_server($wsdl=false){ + parent::nusoap_base(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In nusoap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In nusoap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['REQUEST_METHOD'])) { + $rm = $_SERVER['REQUEST_METHOD']; + } elseif (isset($HTTP_SERVER_VARS['REQUEST_METHOD'])) { + $rm = $HTTP_SERVER_VARS['REQUEST_METHOD']; + } else { + $rm = ''; + } + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, request method=$rm query string=$qs strlen(\$data)=" . strlen($data)); + + if ($rm == 'POST') { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } elseif (preg_match('/wsdl/', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if ($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL, "http://") !== false) { // assume URL + $this->debug("In service, re-direct for WSDL"); + header('Location: '.$this->externalWSDLURL); + } else { // assume file + $this->debug("In service, use file passthru for WSDL"); + header("Content-Type: text/xml\r\n"); + $pos = strpos($this->externalWSDLURL, "file://"); + if ($pos === false) { + $filename = $this->externalWSDLURL; + } else { + $filename = substr($this->externalWSDLURL, $pos + 7); + } + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + $this->debug("In service, serialize WSDL"); + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + $this->debug("In service, there is no WSDL"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($this->wsdl) { + $this->debug("In service, return Web description"); + print $this->wsdl->webDescription(); + } else { + $this->debug("In service, no Web description"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide a Web description"; + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('SOAP-ENV:Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('SOAP-ENV:Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + // + // if you are debugging in this area of the code, your service uses a class to implement methods, + // you use SOAP RPC, and the client is .NET, please be aware of the following... + // when the .NET wsdl.exe utility generates a proxy, it will remove the '.' or '..' from the + // method name. that is fine for naming the .NET methods. it is not fine for properly constructing + // the XML request and reading the XML response. you need to add the RequestElementName and + // ResponseElementName to the System.Web.Services.Protocols.SoapRpcMethodAttribute that wsdl.exe + // generates for the method. these parameters are used to specify the correct XML element names + // for .NET to use, i.e. the names with the '.' in them. + // + $orig_methodname = $this->methodname; + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('SOAP-ENV:Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + $this->debug("in invoke_method, delim=$delim"); + + $class = ''; + $method = ''; + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1) { + $try_class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + if (class_exists($try_class)) { + // get the class and method name + $class = $try_class; + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } else { + $this->debug("in invoke_method, class=$try_class not found"); + } + } else { + $try_class = ''; + $this->debug("in invoke_method, no class to try"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'('$orig_methodname') not defined in service('$try_class' '$delim')"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'/'$method_to_compare'('$orig_methodname') not defined in service/'$class'('$try_class' '$delim')"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('SOAP-ENV:Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param) || is_object($param)) { + $this->fault('SOAP-ENV:Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + if (is_array($this->methodparams)) { + $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams)); + } else { + $this->methodreturn = call_user_func_array($call_arg, array()); + } + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received data of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && is_object($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + if (sizeof($this->opData['output']['parts']) > 1) { + $this->debug('more than one output part, so use the method return unchanged'); + $opParams = $this->methodreturn; + } elseif (sizeof($this->opData['output']['parts']) == 1) { + $this->debug('exactly one output part, so wrap the method return in a simple array'); + // TODO: verify that it is not already wrapped! + //foreach ($this->opData['output']['parts'] as $name => $type) { + // $this->debug('wrap in element named ' . $name); + //} + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('SOAP-ENV:Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + if ($this->methodURI) { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'methodname.'Response>'; + } + } else { + if ($this->methodURI) { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'methodname.'Response>'; + } + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($this->opData['output']['encodingStyle'])) { + $encodingStyle = $this->opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$this->opData['output']['use'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Request not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + // parse response, get soap parser obj + $parser = new nusoap_parser($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('SOAP-ENV:Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_soapbody()'); + $this->methodparams = $parser->get_soapbody(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // get SOAP Header + $this->requestHeader = $parser->get_soapheader(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $soapaction = "$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occurred. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new nusoap_fault($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + // If server name has port number attached then strip it (else port number gets duplicated in WSDL output) (occurred using lighttpd and FastCGI) + $colon = strpos($SERVER_NAME,":"); + if ($colon) { + $SERVER_NAME = substr($SERVER_NAME, 0, $colon); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new nusoap_xmlschema('', '', $this->wsdl->namespaces); + if ($style == 'document') { + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo['elementFormDefault'] = 'qualified'; + } + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + +/** + * Backward compatibility + */ +class soap_server extends nusoap_server { +} + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class wsdl extends nusoap_base { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + var $curl_options = array(); // User-specified cURL options + var $use_curl = false; // whether to always try to use cURL + // for HTTP authentication + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param array $curl_options user-specified cURL options + * @param boolean $use_curl try to use cURL + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30,$curl_options=null,$use_curl=false){ + parent::nusoap_base(); + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + if (is_array($curl_options)) + $this->curl_options = $curl_options; + $this->use_curl = $use_curl; + $this->fetchWSDL($wsdl); + } + + /** + * fetches the WSDL document and parses it + * + * @access public + */ + function fetchWSDL($wsdl) { + $this->debug("parse and process WSDL path=$wsdl"); + $this->wsdl = $wsdl; + // parse wsdl file + if ($this->wsdl != "") { + $this->parseWSDL($this->wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + // Set operation style if necessary, but do not override one already provided + if (isset($bindingData['style']) && !isset($this->bindings[$binding]['operations'][$operation]['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') { + $this->debug("parse WSDL at path=$wsdl"); + + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl, $this->curl_options, $this->use_curl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if ($this->authtype != '') { + $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'Getting ' . $wsdl . ' - HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (preg_match('/schema$/', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new nusoap_xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (preg_match('/^xmlns/',$k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (preg_match('/:/', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with type) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with element) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element'] . '^'; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*preg_match('/types$/', $name) ||*/ preg_match('/schema$/', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $portName WSDL port name + * @param string $bindingType eg: soap, smtp, dime (only soap and soap12 are currently supported) + * @return array + * @access public + */ + function getOperations($portName = '', $bindingType = 'soap') { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } else { + $this->debug("getOperations bindingType $bindingType may not be supported"); + } + $this->debug("getOperations for port '$portName' bindingType $bindingType"); + // loop thru ports + foreach($this->ports as $port => $portData) { + $this->debug("getOperations checking port $port bindingType " . $portData['bindingType']); + if ($portName == '' || $port == $portName) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + $this->debug("getOperations found port $port bindingType $bindingType"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + } + if (count($ops) == 0) { + $this->debug("getOperations found no operations for port '$portName' bindingType $bindingType"); + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation name of operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param string $type the type + * @param string $ns namespace (not prefix) of the type + * @return mixed + * @access public + * @see nusoap_xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (!isset($this->schemas[$ns])) { + foreach ($this->schemas as $ns0 => $schema0) { + if (strcasecmp($ns, $ns0) == 0) { + $this->debug("in getTypeDef: replacing schema namespace $ns with $ns0"); + $ns = $ns0; + break; + } + } + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + $this->debug("in getTypeDef: found type $type"); + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } else { + $this->debug("did not find type for [element] $type"); + } + } + return $t; + } + } + $this->debug("in getTypeDef: did not find type $type"); + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $localPart = $this->getLocalPart($partType); + $typeDef = $this->getTypeDef($localPart, $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + if (substr($localPart, -1) == '^') { + $localPart = substr($localPart, 0, -1); + } + } else { + $elementortype = 'type'; + } + $xml .= "\n" . ' '; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' ' . htmlspecialchars($opParts['documentation']) . ''; + } + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + } + $portType_xml .= "\n" . ''; + $binding_xml .= "\n" . ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + } + } + $xml .= "\n" . ''; + return $xml . "\n"; + } + + /** + * determine whether a set of parameters are unwrapped + * when they are expect to be wrapped, Microsoft-style. + * + * @param string $type the type (element name) of the wrapper + * @param array $parameters the parameter values for the SOAP call + * @return boolean whether they parameters are unwrapped (and should be wrapped) + * @access private + */ + function parametersMatchWrapped($type, &$parameters) { + $this->debug("in parametersMatchWrapped type=$type, parameters="); + $this->appendDebug($this->varDump($parameters)); + + // split type into namespace:unqualified-type + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in parametersMatchWrapped: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in parametersMatchWrapped: expanded prefixed type: $uqType, $ns"); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in parametersMatchWrapped: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + + // get the type information + if (!$typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("in parametersMatchWrapped: $type ($uqType) is not a supported type."); + return false; + } + $this->debug("in parametersMatchWrapped: found typeDef="); + $this->appendDebug($this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + $phpType = $typeDef['phpType']; + $arrayType = (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : ''); + $this->debug("in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType"); + + // we expect a complexType or element of complexType + if ($phpType != 'struct') { + $this->debug("in parametersMatchWrapped: not a struct"); + return false; + } + + // see whether the parameter names match the elements + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $elements = 0; + $matches = 0; + foreach ($typeDef['elements'] as $name => $attrs) { + if (isset($parameters[$name])) { + $this->debug("in parametersMatchWrapped: have parameter named $name"); + $matches++; + } else { + $this->debug("in parametersMatchWrapped: do not have parameter named $name"); + } + $elements++; + } + + $this->debug("in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names"); + if ($matches == 0) { + return false; + } + return true; + } + + // since there are no elements for the type, if the user passed no + // parameters, the parameters match wrapped. + $this->debug("in parametersMatchWrapped: no elements type $ns:$uqType"); + return count($parameters) == 0; + } + + /** + * serialize PHP values according to a WSDL message definition + * contrary to the method name, this is not limited to RPC + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @param string $bindingType (soap|soap12) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters, $bindingType = 'soap') { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation, $bindingType)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + return false; + } + $this->debug('in serializeRPCParameters: opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + $parts = &$opData[$direction]['parts']; + $part_count = sizeof($parts); + $style = $opData['style']; + $use = $opData[$direction]['use']; + $this->debug("have $part_count part(s) to serialize using $style/$use"); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $parameter_count = count($parameters); + $this->debug("have $parameter_count parameter(s) provided as $parametersArrayType to serialize"); + // check for Microsoft-style wrapped parameters + if ($style == 'document' && $use == 'literal' && $part_count == 1 && isset($parts['parameters'])) { + $this->debug('check whether the caller has wrapped the parameters'); + if ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1) { + // TODO: consider checking here for double-wrapping, when + // service function wraps, then NuSOAP wraps again + $this->debug("change simple array to associative with 'parameters' element"); + $parameters['parameters'] = $parameters[0]; + unset($parameters[0]); + } + if (($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) { + $this->debug('check whether caller\'s parameters match the wrapped ones'); + if ($this->parametersMatchWrapped($parts['parameters'], $parameters)) { + $this->debug('wrap the parameters for the caller'); + $parameters = array('parameters' => $parameters); + $parameter_count = 1; + } + } + } + foreach ($parts as $name => $type) { + $this->debug("serializing part $name of type $type"); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'Array') { + // JBoss/Axis does this sometimes + return $this->serialize_val($value, $name, false, false, false, false, $use); + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + } + if (!isset($typeDef['phpType'])) { + $this->setError("$type ($uqType) has no phpType."); + $this->debug("in serializeType: $type ($uqType) has no phpType."); + return false; + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs and nillable + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + if (isset($typeDef['simpleContent']) && $typeDef['simpleContent'] == 'true') { + if (isset($value['!'])) { + $xml .= $value['!']; + $this->debug("in serializeType: serialized simpleContent for type $type"); + } else { + $this->debug("in serializeType: no simpleContent to serialize for type $type"); + } + } else { + // complexContent + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $this->debug("serializeComplexTypeAttributes for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize attributes for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeAttributes($typeDefx, $value, $nsx, $uqTypex); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $this->debug("in serializeComplexTypeElements for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize elements for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeElements($typeDefx, $value, $nsx, $uqTypex, $use, $encodingStyle); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (is_null($v) && isset($attrs['minOccurs']) && $attrs['minOccurs'] == '0') { + // do nothing + } elseif (is_null($v) && isset($attrs['nillable']) && $attrs['nillable'] == 'true') { + // TODO: serialize a nil correctly, but for now serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } elseif (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string $name + * @param string $typeClass (complexType|simpleType|attribute) + * @param string $phpType currently supported are array and struct (php assoc array) + * @param string $compositor (all|sequence|choice) + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array $elements e.g. array ( name => array(name=>'',type=>'') ) + * @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string $arrayType as namespace:name (xsd:string) + * @see nusoap_xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + $eElements = array(); + foreach($elements as $n => $e){ + // expand each element + $ee = array(); + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see nusoap_xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name . '^'); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType', 'form' => 'qualified')); + $out = array('parameters' => 'tns:' . $name . 'Response' . '^'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_parser extends nusoap_base { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; // parsed SOAP Body + var $soapheader = NULL; // parsed SOAP Header + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering nusoap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('in nusoap_parser ctor, message:'); + $this->appendDebug($this->varDump($this->message)); + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value + if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ + $this->soapheader = $this->message[$this->root_header]['result']; + } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if ($name == 'Envelope' && $this->status == '') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'envelope') { + $this->root_header = $pos; + $this->status = 'header'; + } elseif ($name == 'Body' && $this->status == 'envelope'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)) { + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(preg_match('/^http:\/\/www.w3.org\/[0-9]{4}\/XMLSchema$/',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + if (isset($this->message[$pos]['type']) && $this->message[$pos]['type'] == 'array') { + // do nothing: already processed arrayType + } else { + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '/([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]/'; + if(preg_match($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= ""; + } + } elseif($pos >= $this->root_struct){ + $this->document .= ""; + } + // switch status + if ($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif ($pos == $this->root_header) { + $this->status = 'envelope'; + } elseif ($name == 'Body' && $this->status == 'body') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'header') { // will never happen + $this->status = 'envelope'; + } elseif ($name == 'Envelope' && $this->status == 'envelope') { + $this->status = ''; + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message (SOAP Body) + * + * @return mixed + * @access public + * @deprecated use get_soapbody instead + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Body (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapbody(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Header (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapheader(){ + return $this->soapheader; + } + + /** + * get the unparsed SOAP Header + * + * @return string XML or empty if no Header + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector or generic compound type '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + $ret = is_array($params) ? $params : array(); + $this->debug('in buildVal, return:'); + $this->appendDebug($this->varDump($ret)); + return $ret; + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + $ret = $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $ret = $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $ret = $this->message[$pos]['cdata']; + $this->debug("in buildVal, return: $ret"); + return $ret; + } + } +} + +/** + * Backward compatibility + */ +class soap_parser extends nusoap_parser { +} + +?>call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_client extends nusoap_base { + + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $responseHeader = NULL; // SOAP Header from response (parsed) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $portName = ''; // port name to use in WSDL + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + var $curl_options = array(); // User-specified cURL options + var $bindingType = ''; // WSDL operation binding type + var $use_curl = false; // whether to always try to use cURL + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param mixed $wsdl optional, set to 'wsdl' or true if using WSDL + * @param string $proxyhost optional + * @param string $proxyport optional + * @param string $proxyusername optional + * @param string $proxypassword optional + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param string $portName optional portName in WSDL document + * @access public + */ + function nusoap_client($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30, $portName = ''){ + parent::nusoap_base(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + $this->portName = $portName; + + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->appendDebug('endpoint=' . $this->varDump($endpoint)); + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + $this->checkWSDL(); + } else { + $this->wsdlFile = $this->endpoint; + $this->wsdl = null; + $this->debug('will use lazy evaluation of wsdl from ' . $this->endpoint); + } + $this->endpointType = 'wsdl'; + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $operation SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call, normally an associative array mirroring the structure of the XML response, false for certain fatal errors + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params,$this->bindingType); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError('operation '.$operation.' not present in WSDL.'); + $this->debug("operation '$operation' not present in WSDL."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * check WSDL passed as an instance or pulled from an endpoint + * + * @access private + */ + function checkWSDL() { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('checkWSDL'); + // catch errors + if ($errstr = $this->wsdl->getError()) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap12')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap12'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + $this->debug('**************** WARNING: SOAP 1.2 BINDING *****************'); + } else { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } + + /** + * instantiate wsdl object and parse wsdl file + * + * @access public + */ + function loadWSDL() { + $this->debug('instantiating wsdl class with doc: '.$this->wsdlFile); + $this->wsdl = new wsdl('',$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout,$this->curl_options,$this->use_curl); + $this->wsdl->setCredentials($this->username, $this->password, $this->authtype, $this->certRequest); + $this->wsdl->fetchWSDL($this->wsdlFile); + $this->checkWSDL(); + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case preg_match('/^http/',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint, $this->curl_options, $this->use_curl); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(preg_match('/^http:/',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(preg_match('/^https/',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Response not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml: ' . $headers['content-type']); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + $parser = new nusoap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get SOAP headers + $this->responseHeader = $parser->get_soapheader(); + // get decoded message + $return = $parser->get_soapbody(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets user-specified cURL options + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access public + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + $this->curl_options[$option] = $value; + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param string $endpoint The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->debug("setEndpoint(\"$endpoint\")"); + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param mixed $headers String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->debug("setHeaders headers="); + $this->appendDebug($this->varDump($headers)); + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * get the SOAP response Header (parsed) + * + * @return mixed + * @access public + */ + function getHeader(){ + return $this->responseHeader; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc HTTP encoding + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->debug("setHTTPEncoding(\"$enc\")"); + $this->http_encoding = $enc; + } + + /** + * Set whether to try to use cURL connections if possible + * + * @param boolean $use Whether to try to use cURL + * @access public + */ + function setUseCURL($use) { + $this->debug("setUseCURL($use)"); + $this->use_curl = $use; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->debug("useHTTPPersistentConnection"); + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy() { + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"); + if ($this->getError()) { + $this->debug("Error from _getProxyClassCode, so return NULL"); + return null; + } + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new nusoap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->certRequest = $this->certRequest; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->http_encoding = $this->http_encoding; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->persistentConnection = &$this->persistentConnection; + $proxy->decode_utf8 = $this->decode_utf8; + $proxy->curl_options = $this->curl_options; + $proxy->bindingType = $this->bindingType; + $proxy->use_curl = $this->use_curl; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + $this->debug("in getProxy endpointType=$this->endpointType"); + $this->appendDebug("wsdl=" . $this->varDump($this->wsdl)); + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + $evalStr = "echo \"$evalStr\";"; + return $evalStr; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) { + return "echo \"" . $this->getError() . "\";"; + } + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class nusoap_proxy_'.$r.' extends nusoap_client { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return boolean if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return boolean always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return boolean always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} + +if (!extension_loaded('soap')) { + /** + * For backwards compatiblity, define soapclient unless the PHP SOAP extension is loaded. + */ + class soapclient extends nusoap_client { + } +} +?> diff --git a/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoapmime.php b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoapmime.php new file mode 100755 index 000000000..12534e6d8 --- /dev/null +++ b/modules/mondialrelay/kit_mondialrelay/tools/nusoap/lib/nusoapmime.php @@ -0,0 +1,501 @@ + +* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list +* @version $Id: nusoapmime.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_client_mime extends nusoap_client { + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $requestAttachments = array(); + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $responseAttachments; + /** + * @var string + * @access private + */ + var $mimeContentType; + + /** + * adds a MIME attachment to the current request. + * + * If the $data parameter contains an empty string, this method will read + * the contents of the file named by the $filename parameter. + * + * If the $cid parameter is false, this method will generate the cid. + * + * @param string $data The data of the attachment + * @param string $filename The filename of the attachment (default is empty string) + * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) + * @param string $cid The content-id (cid) of the attachment (default is false) + * @return string The content-id (cid) of the attachment + * @access public + */ + function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { + if (! $cid) { + $cid = md5(uniqid(time())); + } + + $info['data'] = $data; + $info['filename'] = $filename; + $info['contenttype'] = $contenttype; + $info['cid'] = $cid; + + $this->requestAttachments[] = $info; + + return $cid; + } + + /** + * clears the MIME attachments for the current request. + * + * @access public + */ + function clearAttachments() { + $this->requestAttachments = array(); + } + + /** + * gets the MIME attachments from the current response. + * + * Each array element in the return is an associative array with keys + * data, filename, contenttype, cid. These keys correspond to the parameters + * for addAttachment. + * + * @return array The attachments. + * @access public + */ + function getAttachments() { + return $this->responseAttachments; + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + if (count($this->requestAttachments) > 0) { + $params['content_type'] = 'multipart/related; type="text/xml"'; + $mimeMessage = new Mail_mimePart('', $params); + unset($params); + + $params['content_type'] = 'text/xml'; + $params['encoding'] = '8bit'; + $params['charset'] = $this->soap_defencoding; + $mimeMessage->addSubpart($soapmsg, $params); + + foreach ($this->requestAttachments as $att) { + unset($params); + + $params['content_type'] = $att['contenttype']; + $params['encoding'] = 'base64'; + $params['disposition'] = 'attachment'; + $params['dfilename'] = $att['filename']; + $params['cid'] = $att['cid']; + + if ($att['data'] == '' && $att['filename'] <> '') { + if ($fd = fopen($att['filename'], 'rb')) { + $data = fread($fd, filesize($att['filename'])); + fclose($fd); + } else { + $data = ''; + } + $mimeMessage->addSubpart($data, $params); + } else { + $mimeMessage->addSubpart($att['data'], $params); + } + } + + $output = $mimeMessage->encode(); + $mimeHeaders = $output['headers']; + + foreach ($mimeHeaders as $k => $v) { + $this->debug("MIME header $k: $v"); + if (strtolower($k) == 'content-type') { + // PHP header() seems to strip leading whitespace starting + // the second line, so force everything to one line + $this->mimeContentType = str_replace("\r\n", " ", $v); + } + } + + return $output['body']; + } + + return parent::getHTTPBody($soapmsg); + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + if (count($this->requestAttachments) > 0) { + return $this->mimeContentType; + } + return parent::getHTTPContentType(); + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + if (count($this->requestAttachments) > 0) { + return false; + } + return parent::getHTTPContentTypeCharset(); + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); + $this->responseAttachments = array(); + if (strstr($headers['content-type'], 'multipart/related')) { + $this->debug('Decode multipart/related'); + $input = ''; + foreach ($headers as $k => $v) { + $input .= "$k: $v\r\n"; + } + $params['input'] = $input . "\r\n" . $data; + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + $structure = Mail_mimeDecode::decode($params); + + foreach ($structure->parts as $part) { + if (!isset($part->disposition) && (strstr($part->headers['content-type'], 'text/xml'))) { + $this->debug('Have root part of type ' . $part->headers['content-type']); + $root = $part->body; + $return = parent::parseResponse($part->headers, $part->body); + } else { + $this->debug('Have an attachment of type ' . $part->headers['content-type']); + $info['data'] = $part->body; + $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; + $info['contenttype'] = $part->headers['content-type']; + $info['cid'] = $part->headers['content-id']; + $this->responseAttachments[] = $info; + } + } + + if (isset($return)) { + $this->responseData = $root; + return $return; + } + + $this->setError('No root part found in multipart/related content'); + return ''; + } + $this->debug('Not multipart/related'); + return parent::parseResponse($headers, $data); + } +} + +/* + * For backwards compatiblity, define soapclientmime unless the PHP SOAP extension is loaded. + */ +if (!extension_loaded('soap')) { + class soapclientmime extends nusoap_client_mime { + } +} + +/** +* nusoap_server_mime server supporting MIME attachments defined at +* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library. +* +* @author Scott Nichol +* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list +* @version $Id: nusoapmime.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_server_mime extends nusoap_server { + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $requestAttachments = array(); + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $responseAttachments; + /** + * @var string + * @access private + */ + var $mimeContentType; + + /** + * adds a MIME attachment to the current response. + * + * If the $data parameter contains an empty string, this method will read + * the contents of the file named by the $filename parameter. + * + * If the $cid parameter is false, this method will generate the cid. + * + * @param string $data The data of the attachment + * @param string $filename The filename of the attachment (default is empty string) + * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) + * @param string $cid The content-id (cid) of the attachment (default is false) + * @return string The content-id (cid) of the attachment + * @access public + */ + function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { + if (! $cid) { + $cid = md5(uniqid(time())); + } + + $info['data'] = $data; + $info['filename'] = $filename; + $info['contenttype'] = $contenttype; + $info['cid'] = $cid; + + $this->responseAttachments[] = $info; + + return $cid; + } + + /** + * clears the MIME attachments for the current response. + * + * @access public + */ + function clearAttachments() { + $this->responseAttachments = array(); + } + + /** + * gets the MIME attachments from the current request. + * + * Each array element in the return is an associative array with keys + * data, filename, contenttype, cid. These keys correspond to the parameters + * for addAttachment. + * + * @return array The attachments. + * @access public + */ + function getAttachments() { + return $this->requestAttachments; + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + if (count($this->responseAttachments) > 0) { + $params['content_type'] = 'multipart/related; type="text/xml"'; + $mimeMessage = new Mail_mimePart('', $params); + unset($params); + + $params['content_type'] = 'text/xml'; + $params['encoding'] = '8bit'; + $params['charset'] = $this->soap_defencoding; + $mimeMessage->addSubpart($soapmsg, $params); + + foreach ($this->responseAttachments as $att) { + unset($params); + + $params['content_type'] = $att['contenttype']; + $params['encoding'] = 'base64'; + $params['disposition'] = 'attachment'; + $params['dfilename'] = $att['filename']; + $params['cid'] = $att['cid']; + + if ($att['data'] == '' && $att['filename'] <> '') { + if ($fd = fopen($att['filename'], 'rb')) { + $data = fread($fd, filesize($att['filename'])); + fclose($fd); + } else { + $data = ''; + } + $mimeMessage->addSubpart($data, $params); + } else { + $mimeMessage->addSubpart($att['data'], $params); + } + } + + $output = $mimeMessage->encode(); + $mimeHeaders = $output['headers']; + + foreach ($mimeHeaders as $k => $v) { + $this->debug("MIME header $k: $v"); + if (strtolower($k) == 'content-type') { + // PHP header() seems to strip leading whitespace starting + // the second line, so force everything to one line + $this->mimeContentType = str_replace("\r\n", " ", $v); + } + } + + return $output['body']; + } + + return parent::getHTTPBody($soapmsg); + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + if (count($this->responseAttachments) > 0) { + return $this->mimeContentType; + } + return parent::getHTTPContentType(); + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + if (count($this->responseAttachments) > 0) { + return false; + } + return parent::getHTTPContentTypeCharset(); + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); + $this->requestAttachments = array(); + if (strstr($headers['content-type'], 'multipart/related')) { + $this->debug('Decode multipart/related'); + $input = ''; + foreach ($headers as $k => $v) { + $input .= "$k: $v\r\n"; + } + $params['input'] = $input . "\r\n" . $data; + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + $structure = Mail_mimeDecode::decode($params); + + foreach ($structure->parts as $part) { + if (!isset($part->disposition) && (strstr($part->headers['content-type'], 'text/xml'))) { + $this->debug('Have root part of type ' . $part->headers['content-type']); + $return = parent::parseRequest($part->headers, $part->body); + } else { + $this->debug('Have an attachment of type ' . $part->headers['content-type']); + $info['data'] = $part->body; + $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; + $info['contenttype'] = $part->headers['content-type']; + $info['cid'] = $part->headers['content-id']; + $this->requestAttachments[] = $info; + } + } + + if (isset($return)) { + return $return; + } + + $this->setError('No root part found in multipart/related content'); + return; + } + $this->debug('Not multipart/related'); + return parent::parseRequest($headers, $data); + } +} + +/* + * For backwards compatiblity + */ +class nusoapservermime extends nusoap_server_mime { +} + +?> diff --git a/modules/mondialrelay/lib/nusoap/class.nusoap_base.php b/modules/mondialrelay/lib/nusoap/class.nusoap_base.php new file mode 100755 index 000000000..1f9eb6057 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.nusoap_base.php @@ -0,0 +1,995 @@ + +* @author Scott Nichol +* @version $Id: class.nusoap_base.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_base { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.9.5'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 7091 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the nusoap_xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel'] = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + $ret = ""; + return $ret; + } + + /** + * expands entities, e.g. changes '<' to '<'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&', $val); + $val = str_replace("'", ''', $val); + $val = str_replace('"', '"', $val); + $val = str_replace('<', '<', $val); + $val = str_replace('>', '>', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @param boolean $soapval Whether this is called from soapval. + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded',$soapval=false) { + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use, soapval=$soapval"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if (is_object($val) && get_class($val) == 'soapval' && (! $soapval)) { + $this->debug("serialize_val: serialize soapval"); + $xml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + $this->debug("serialize_val of soapval returning $xml"); + return $xml; + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + $this->debug("serialize_val: serialize null"); + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$xmlns$atts/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + $xml = "<$name$xmlns$type_str$atts xsi:nil=\"true\"/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + $this->debug("serialize_val: serialize xsd built-in primitive type"); + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + $xml = "<$name$xmlns$atts>$val"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + $xml = "<$name$xmlns xsi:type=\"xsd:$type\"$atts>$val"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + $this->debug("serialize_val: serialize boolean"); + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + $this->debug("serialize_val: serialize int"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + $this->debug("serialize_val: serialize float"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val"; + } + break; + case (is_string($val) || $type == 'string'): + $this->debug("serialize_val: serialize string"); + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val"; + } + break; + case is_object($val): + $this->debug("serialize_val: serialize object"); + if (get_class($val) == 'soapval') { + $this->debug("serialize_val: serialize soapval object"); + $pXml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + } else { + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$pXml"; + } else { + $xml .= "<$name$xmlns$type_str$atts>$pXml"; + } + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || preg_match('/^ArrayOf/',$type)){ + $this->debug("serialize_val: serialize array"); + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml.""; + } else { + // got a struct + $this->debug("serialize_val: serialize struct"); + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= ''; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= ''; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= ""; + } + break; + default: + $this->debug("serialize_val: serialize unknown"); + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + $this->debug("serialize_val returning $xml"); + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $k => $v) { + if (is_object($v) && get_class($v) == 'soapval') { + $xml .= $this->serialize_val($v, false, false, false, false, false, $use); + } else { + $xml .= $this->serialize_val($v, $k, false, false, false, false, $use); + } + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialized array of headers to $headers"); + } + $headers = "".$headers.""; + } + // serialize envelope + return + 'soap_defencoding .'"?'.">". + '". + $headers. + "". + $body. + "". + ""; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $qname qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !preg_match('/^http:\/\//',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } + + /** + * represents the object as a string + * + * @return string + * @access public + */ + function __toString() { + return $this->varDump($this); + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param int $timestamp Unix time stamp +* @param boolean $utc Whether the time stamp is UTC or local +* @return mixed ISO 8601 date string or false +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + $pos = strrpos($datestr, "+"); + if ($pos === FALSE) { + $pos = strrpos($datestr, "-"); + } + if ($pos !== FALSE) { + if (strlen($datestr) == $pos + 5) { + $datestr = substr($datestr, 0, $pos + 3) . ':' . substr($datestr, -2); + } + } + if($utc){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + + if(preg_match($pattern,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @return mixed Unix timestamp (int) or false +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + if(preg_match($pattern,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); +// return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + + diff --git a/modules/mondialrelay/lib/nusoap/class.soap_fault.php b/modules/mondialrelay/lib/nusoap/class.soap_fault.php new file mode 100755 index 000000000..bc496e474 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.soap_fault.php @@ -0,0 +1,89 @@ + +* @version $Id: class.soap_fault.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_fault extends nusoap_base { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (SOAP-ENV:Client | SOAP-ENV:Server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function nusoap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + 'soap_defencoding.'"?>'. + '\n". + ''. + ''. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + ''. + ''. + ''; + return $return_msg; + } +} + +/** + * Backward compatibility + */ +class soap_fault extends nusoap_fault { +} + + diff --git a/modules/mondialrelay/lib/nusoap/class.soap_parser.php b/modules/mondialrelay/lib/nusoap/class.soap_parser.php new file mode 100755 index 000000000..cce2874a0 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.soap_parser.php @@ -0,0 +1,642 @@ + +* @author Scott Nichol +* @version $Id: class.soap_parser.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_parser extends nusoap_base { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; // parsed SOAP Body + var $soapheader = NULL; // parsed SOAP Header + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering nusoap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('in nusoap_parser ctor, message:'); + $this->appendDebug($this->varDump($this->message)); + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value + if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ + $this->soapheader = $this->message[$this->root_header]['result']; + } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if ($name == 'Envelope' && $this->status == '') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'envelope') { + $this->root_header = $pos; + $this->status = 'header'; + } elseif ($name == 'Body' && $this->status == 'envelope'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)) { + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(preg_match('/^http:\/\/www.w3.org\/[0-9]{4}\/XMLSchema$/',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + if (isset($this->message[$pos]['type']) && $this->message[$pos]['type'] == 'array') { + // do nothing: already processed arrayType + } else { + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '/([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]/'; + if(preg_match($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= ""; + } + } elseif($pos >= $this->root_struct){ + $this->document .= ""; + } + // switch status + if ($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif ($pos == $this->root_header) { + $this->status = 'envelope'; + } elseif ($name == 'Body' && $this->status == 'body') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'header') { // will never happen + $this->status = 'envelope'; + } elseif ($name == 'Envelope' && $this->status == 'envelope') { + $this->status = ''; + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message (SOAP Body) + * + * @return mixed + * @access public + * @deprecated use get_soapbody instead + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Body (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapbody(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Header (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapheader(){ + return $this->soapheader; + } + + /** + * get the unparsed SOAP Header + * + * @return string XML or empty if no Header + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector or generic compound type '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + $ret = is_array($params) ? $params : array(); + $this->debug('in buildVal, return:'); + $this->appendDebug($this->varDump($ret)); + return $ret; + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + $ret = $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $ret = $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $ret = $this->message[$pos]['cdata']; + $this->debug("in buildVal, return: $ret"); + return $ret; + } + } +} + +/** + * Backward compatibility + */ +class soap_parser extends nusoap_parser { +} + + diff --git a/modules/mondialrelay/lib/nusoap/class.soap_server.php b/modules/mondialrelay/lib/nusoap/class.soap_server.php new file mode 100755 index 000000000..87db07909 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.soap_server.php @@ -0,0 +1,1126 @@ + +* @author Scott Nichol +* @version $Id: class.soap_server.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_server extends nusoap_base { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP Headers from request (parsed) + * @var mixed + * @access public + */ + var $requestHeader = NULL; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text or array of soapval or associative array) + * @var mixed + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function nusoap_server($wsdl=false){ + parent::nusoap_base(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In nusoap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In nusoap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['REQUEST_METHOD'])) { + $rm = $_SERVER['REQUEST_METHOD']; + } elseif (isset($HTTP_SERVER_VARS['REQUEST_METHOD'])) { + $rm = $HTTP_SERVER_VARS['REQUEST_METHOD']; + } else { + $rm = ''; + } + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, request method=$rm query string=$qs strlen(\$data)=" . strlen($data)); + + if ($rm == 'POST') { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } elseif (preg_match('/wsdl/', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if ($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL, "http://") !== false) { // assume URL + $this->debug("In service, re-direct for WSDL"); + header('Location: '.$this->externalWSDLURL); + } else { // assume file + $this->debug("In service, use file passthru for WSDL"); + header("Content-Type: text/xml\r\n"); + $pos = strpos($this->externalWSDLURL, "file://"); + if ($pos === false) { + $filename = $this->externalWSDLURL; + } else { + $filename = substr($this->externalWSDLURL, $pos + 7); + } + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + $this->debug("In service, serialize WSDL"); + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + $this->debug("In service, there is no WSDL"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($this->wsdl) { + $this->debug("In service, return Web description"); + print $this->wsdl->webDescription(); + } else { + $this->debug("In service, no Web description"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide a Web description"; + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('SOAP-ENV:Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('SOAP-ENV:Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + // + // if you are debugging in this area of the code, your service uses a class to implement methods, + // you use SOAP RPC, and the client is .NET, please be aware of the following... + // when the .NET wsdl.exe utility generates a proxy, it will remove the '.' or '..' from the + // method name. that is fine for naming the .NET methods. it is not fine for properly constructing + // the XML request and reading the XML response. you need to add the RequestElementName and + // ResponseElementName to the System.Web.Services.Protocols.SoapRpcMethodAttribute that wsdl.exe + // generates for the method. these parameters are used to specify the correct XML element names + // for .NET to use, i.e. the names with the '.' in them. + // + $orig_methodname = $this->methodname; + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('SOAP-ENV:Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + $this->debug("in invoke_method, delim=$delim"); + + $class = ''; + $method = ''; + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1) { + $try_class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + if (class_exists($try_class)) { + // get the class and method name + $class = $try_class; + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } else { + $this->debug("in invoke_method, class=$try_class not found"); + } + } else { + $try_class = ''; + $this->debug("in invoke_method, no class to try"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'('$orig_methodname') not defined in service('$try_class' '$delim')"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'/'$method_to_compare'('$orig_methodname') not defined in service/'$class'('$try_class' '$delim')"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('SOAP-ENV:Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param) || is_object($param)) { + $this->fault('SOAP-ENV:Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + if (is_array($this->methodparams)) { + $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams)); + } else { + $this->methodreturn = call_user_func_array($call_arg, array()); + } + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received data of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && is_object($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + if (sizeof($this->opData['output']['parts']) > 1) { + $this->debug('more than one output part, so use the method return unchanged'); + $opParams = $this->methodreturn; + } elseif (sizeof($this->opData['output']['parts']) == 1) { + $this->debug('exactly one output part, so wrap the method return in a simple array'); + // TODO: verify that it is not already wrapped! + //foreach ($this->opData['output']['parts'] as $name => $type) { + // $this->debug('wrap in element named ' . $name); + //} + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('SOAP-ENV:Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + if ($this->methodURI) { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'methodname.'Response>'; + } + } else { + if ($this->methodURI) { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'methodname.'Response>'; + } + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($this->opData['output']['encodingStyle'])) { + $encodingStyle = $this->opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$this->opData['output']['use'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Request not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + // parse response, get soap parser obj + $parser = new nusoap_parser($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('SOAP-ENV:Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_soapbody()'); + $this->methodparams = $parser->get_soapbody(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // get SOAP Header + $this->requestHeader = $parser->get_soapheader(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $soapaction = "$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occurred. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new nusoap_fault($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + // If server name has port number attached then strip it (else port number gets duplicated in WSDL output) (occurred using lighttpd and FastCGI) + $colon = strpos($SERVER_NAME,":"); + if ($colon) { + $SERVER_NAME = substr($SERVER_NAME, 0, $colon); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new nusoap_xmlschema('', '', $this->wsdl->namespaces); + if ($style == 'document') { + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo['elementFormDefault'] = 'qualified'; + } + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + +/** + * Backward compatibility + */ +class soap_server extends nusoap_server { +} + + diff --git a/modules/mondialrelay/lib/nusoap/class.soap_transport_http.php b/modules/mondialrelay/lib/nusoap/class.soap_transport_http.php new file mode 100755 index 000000000..dbefc8bb9 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.soap_transport_http.php @@ -0,0 +1,1306 @@ + +* @author Scott Nichol +* @version $Id: class.soap_transport_http.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class soap_transport_http extends nusoap_base { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $response_status_line; // HTTP response status line + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $ch_options = array(); // cURL custom options + var $use_curl = false; // force cURL use + var $proxy = null; // proxy information (associative array) + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // certpassword: SSL certificate password + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + * + * @param string $url The URL to which to connect + * @param array $curl_options User-specified cURL options + * @param boolean $use_curl Whether to try to force cURL use + * @access public + */ + function soap_transport_http($url, $curl_options = NULL, $use_curl = false){ + parent::nusoap_base(); + $this->debug("ctor url=$url use_curl=$use_curl curl_options:"); + $this->appendDebug($this->varDump($curl_options)); + $this->setURL($url); + if (is_array($curl_options)) { + $this->ch_options = $curl_options; + } + $this->use_curl = $use_curl; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->setHeader('User-Agent', $this->title.'/'.$this->version.' ('.$rev[1].')'); + } + + /** + * sets a cURL option + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access private + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + curl_setopt($this->ch, $option, $value); + } + + /** + * sets an HTTP header + * + * @param string $name The name of the header + * @param string $value The value of the header + * @access private + */ + function setHeader($name, $value) { + $this->outgoing_headers[$name] = $value; + $this->debug("set header $name: $value"); + } + + /** + * unsets an HTTP header + * + * @param string $name The name of the header + * @access private + */ + function unsetHeader($name) { + if (isset($this->outgoing_headers[$name])) { + $this->debug("unset header $name"); + unset($this->outgoing_headers[$name]); + } + } + + /** + * sets the URL to which to connect + * + * @param string $url The URL to which to connect + * @access private + */ + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("parsed URL $k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->setHeader('Host', $this->host); + } else { + $this->setHeader('Host', $this->host.':'.$this->port); + } + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + /** + * gets the I/O method to use + * + * @return string I/O method to use (socket|curl|unknown) + * @access private + */ + function io_method() { + if ($this->use_curl || ($this->scheme == 'https') || ($this->scheme == 'http' && $this->authtype == 'ntlm') || ($this->scheme == 'http' && is_array($this->proxy) && $this->proxy['authtype'] == 'ntlm')) + return 'curl'; + if (($this->scheme == 'http' || $this->scheme == 'ssl') && $this->authtype != 'ntlm' && (!is_array($this->proxy) || $this->proxy['authtype'] != 'ntlm')) + return 'socket'; + return 'unknown'; + } + + /** + * establish an HTTP connection + * + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return boolean true if connected, false if not + * @access private + */ + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->io_method() == 'socket') { + if (!is_array($this->proxy)) { + $host = $this->host; + $port = $this->port; + } else { + $host = $this->proxy['host']; + $port = $this->proxy['port']; + } + + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->io_method() == 'curl') { + if (!extension_loaded('curl')) { +// $this->setError('cURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + $this->setError('The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to include cURL or change php.ini to load the PHP cURL extension.'); + return false; + } + // Avoid warnings when PHP does not have these options + if (defined('CURLOPT_CONNECTIONTIMEOUT')) + $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT; + else + $CURLOPT_CONNECTIONTIMEOUT = 78; + if (defined('CURLOPT_HTTPAUTH')) + $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH; + else + $CURLOPT_HTTPAUTH = 107; + if (defined('CURLOPT_PROXYAUTH')) + $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH; + else + $CURLOPT_PROXYAUTH = 111; + if (defined('CURLAUTH_BASIC')) + $CURLAUTH_BASIC = CURLAUTH_BASIC; + else + $CURLAUTH_BASIC = 1; + if (defined('CURLAUTH_DIGEST')) + $CURLAUTH_DIGEST = CURLAUTH_DIGEST; + else + $CURLAUTH_DIGEST = 2; + if (defined('CURLAUTH_NTLM')) + $CURLAUTH_NTLM = CURLAUTH_NTLM; + else + $CURLAUTH_NTLM = 8; + + $this->debug('connect using cURL'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "$this->scheme://$this->host:$this->port" : "$this->scheme://$this->host"; + // add path + $hostURL .= $this->path; + $this->setCurlOption(CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + if (ini_get('safe_mode') || ini_get('open_basedir')) { + $this->debug('safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION'); + $this->debug('safe_mode = '); + $this->appendDebug($this->varDump(ini_get('safe_mode'))); + $this->debug('open_basedir = '); + $this->appendDebug($this->varDump(ini_get('open_basedir'))); + } else { + $this->setCurlOption(CURLOPT_FOLLOWLOCATION, 1); + } + // ask for headers in the response output + $this->setCurlOption(CURLOPT_HEADER, 1); + // ask for the response output as the return value + $this->setCurlOption(CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// $this->setCurlOption(CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // I believe the following comment is now bogus, having applied to + // the code when it used CURLOPT_CUSTOMREQUEST to send the request. + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //$this->setCurlOption(CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->setHeader('Connection', 'close'); + } + // set timeouts + if ($connection_timeout != 0) { + $this->setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + } + if ($response_timeout != 0) { + $this->setCurlOption(CURLOPT_TIMEOUT, $response_timeout); + } + + if ($this->scheme == 'https') { + $this->debug('set cURL SSL verify options'); + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. + //$this->setCurlOption(CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 0); + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + $this->debug('set cURL certificate options'); + if (isset($this->certRequest['cainfofile'])) { + $this->setCurlOption(CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + $this->setCurlOption(CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + $this->setCurlOption(CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + $this->setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest['passphrase']); + } + if (isset($this->certRequest['certpassword'])) { + $this->setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest['certpassword']); + } + } + } + if ($this->authtype && ($this->authtype != 'certificate')) { + if ($this->username) { + $this->debug('set cURL username/password'); + $this->setCurlOption(CURLOPT_USERPWD, "$this->username:$this->password"); + } + if ($this->authtype == 'basic') { + $this->debug('set cURL for Basic authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_BASIC); + } + if ($this->authtype == 'digest') { + $this->debug('set cURL for digest authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_DIGEST); + } + if ($this->authtype == 'ntlm') { + $this->debug('set cURL for NTLM authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_NTLM); + } + } + if (is_array($this->proxy)) { + $this->debug('set cURL proxy options'); + if ($this->proxy['port'] != '') { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host'].':'.$this->proxy['port']); + } else { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host']); + } + if ($this->proxy['username'] || $this->proxy['password']) { + $this->debug('set cURL proxy authentication options'); + $this->setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy['username'].':'.$this->proxy['password']); + if ($this->proxy['authtype'] == 'basic') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_BASIC); + } + if ($this->proxy['authtype'] == 'ntlm') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_NTLM); + } + } + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * sends the SOAP request and gets the SOAP response via HTTP[S] + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError("Too many tries to get an OK response ($this->response_status_line)"); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * sends the SOAP request and gets the SOAP response via HTTPS using CURL + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + * @deprecated + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype digestRequest="); + $this->appendDebug($this->varDump($digestRequest)); + $this->debug("certRequest="); + $this->appendDebug($this->varDump($certRequest)); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->setHeader('Authorization', 'Basic '.base64_encode(str_replace(':','',$username).':'.$password)); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = md5($A1); + + // A2 = Method ":" digest-uri-value + $A2 = $this->request_method . ':' . $this->digest_uri; + + // H(A2) + $HA2 = md5($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = md5($unhashedDigest); + + $opaque = ''; + if (isset($digestRequest['opaque'])) { + $opaque = ', opaque="' . $digestRequest['opaque'] . '"'; + } + + $this->setHeader('Authorization', 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . $opaque . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'); + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + $this->debug('Authorization header not set for certificate'); + } elseif ($authtype == 'ntlm') { + // do nothing + $this->debug('Authorization header not set for ntlm'); + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->setHeader('SOAPAction', '"' . $soapaction . '"'); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->setHeader('Accept-Encoding', $enc); + if (!isset($this->outgoing_headers['Connection'])) { + $this->setHeader('Connection', 'close'); + $this->persistentConnection = false; + } + // deprecated as of PHP 5.3.0 + //set_magic_quotes_runtime(0); + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost use an empty string to remove proxy + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param string $proxyauthtype (basic|ntlm) + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 'basic') { + if ($proxyhost) { + $this->proxy = array( + 'host' => $proxyhost, + 'port' => $proxyport, + 'username' => $proxyusername, + 'password' => $proxypassword, + 'authtype' => $proxyauthtype + ); + if ($proxyusername != '' && $proxypassword != '' && $proxyauthtype = 'basic') { + $this->setHeader('Proxy-Authorization', ' Basic '.base64_encode($proxyusername.':'.$proxypassword)); + } + } else { + $this->debug('remove proxy'); + $proxy = null; + unsetHeader('Proxy-Authorization'); + } + } + + + /** + * Test if the given string starts with a header that is to be skipped. + * Skippable headers result from chunked transfer and proxy requests. + * + * @param string $data The string to check. + * @returns boolean Whether a skippable header was found. + * @access private + */ + function isSkippableCurlHeader(&$data) { + $skipHeaders = array( 'HTTP/1.1 100', + 'HTTP/1.0 301', + 'HTTP/1.1 301', + 'HTTP/1.0 302', + 'HTTP/1.1 302', + 'HTTP/1.0 401', + 'HTTP/1.1 401', + 'HTTP/1.0 200 Connection established'); + foreach ($skipHeaders as $hd) { + $prefix = substr($data, 0, strlen($hd)); + if ($prefix == $hd) return true; + } + + return false; + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /** + * Writes the payload, including HTTP headers, to $this->outgoing_payload. + * + * @param string $data HTTP body + * @param string $cookie_str data for HTTP Cookie header + * @return void + * @access private + */ + function buildPayload($data, $cookie_str = '') { + // Note: for cURL connections, $this->outgoing_payload is ignored, + // as is the Content-Length header, but these are still created as + // debugging guides. + + // add content-length header + if ($this->request_method != 'GET') { + $this->setHeader('Content-Length', strlen($data)); + } + + // start building outgoing payload: + if ($this->proxy) { + $uri = $this->url; + } else { + $uri = $this->uri; + } + $req = "$this->request_method $uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + /** + * sends the SOAP request via HTTP[S] + * + * @param string $data message data + * @param array $cookies cookies to send + * @return boolean true if OK, false if problem + * @access private + */ + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->io_method() == 'socket') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->io_method() == 'curl') { + // set payload + // cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with (so we no longer use this method!) + //$this->setCurlOption(CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + $curl_headers = array(); + foreach($this->outgoing_headers as $k => $v){ + if ($k == 'Connection' || $k == 'Content-Length' || $k == 'Host' || $k == 'Authorization' || $k == 'Proxy-Authorization') { + $this->debug("Skip cURL header $k: $v"); + } else { + $curl_headers[] = "$k: $v"; + } + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + $this->setCurlOption(CURLOPT_HTTPHEADER, $curl_headers); + $this->debug('set cURL HTTP headers'); + if ($this->request_method == "POST") { + $this->setCurlOption(CURLOPT_POST, 1); + $this->setCurlOption(CURLOPT_POSTFIELDS, $data); + $this->debug('set cURL POST data'); + } else { + } + // insert custom user-set cURL options + foreach ($this->ch_options as $key => $val) { + $this->setCurlOption($key, $val); + } + + $this->debug('set cURL payload'); + return true; + } + } + + /** + * gets the SOAP response via HTTP[S] + * + * @return string the response (also sets member variables like incoming_payload) + * @access private + */ + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->io_method() == 'socket') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 headers + if (isset($lb) && preg_match('/^HTTP\/1.1 100/',$data)) { + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "
    \nde-chunked:\n---------------\n$data\n\n---------------\n
    "; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->io_method() == 'curl') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'
    '; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v
    "; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '
    ';
    +			//var_dump(curl_getinfo($this->ch));
    +			//echo '
    '; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // try removing skippable headers + $savedata = $data; + while ($this->isSkippableCurlHeader($data)) { + $this->debug("Found HTTP header to skip"); + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + if ($data == '') { + // have nothing left; just remove 100 header(s) + $data = $savedata; + while (preg_match('/^HTTP\/1.1 100/',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $this->response_status_line = $header_array[0]; + $arr = explode(' ', $this->response_status_line, 3); + $http_version = $arr[0]; + $http_status = (int)($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && ($http_status == 301 || $http_status == 302)) { + $this->debug("Got $http_status $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + /** + * sets the content-type for the SOAP message to be sent + * + * @param string $type the content type, MIME style + * @param mixed $charset character set used for encoding (or false) + * @access public + */ + function setContentType($type, $charset = false) { + $this->setHeader('Content-Type', $type . ($charset ? '; charset=' . $charset : '')); + } + + /** + * specifies that an HTTP persistent connection should be used + * + * @return boolean whether the request was honored by this method. + * @access public + */ + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->setHeader('Connection', 'Keep-Alive'); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = preg_split('/;/', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } +} + + diff --git a/modules/mondialrelay/lib/nusoap/class.soap_val.php b/modules/mondialrelay/lib/nusoap/class.soap_val.php new file mode 100755 index 000000000..9287e0861 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.soap_val.php @@ -0,0 +1,106 @@ + +* @version $Id: class.soap_val.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class soapval extends nusoap_base { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use, true); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + + diff --git a/modules/mondialrelay/lib/nusoap/class.soapclient.php b/modules/mondialrelay/lib/nusoap/class.soapclient.php new file mode 100755 index 000000000..c21822967 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.soapclient.php @@ -0,0 +1,991 @@ +call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @author Scott Nichol +* @version $Id: class.soapclient.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_client extends nusoap_base { + + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $responseHeader = NULL; // SOAP Header from response (parsed) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $portName = ''; // port name to use in WSDL + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + var $curl_options = array(); // User-specified cURL options + var $bindingType = ''; // WSDL operation binding type + var $use_curl = false; // whether to always try to use cURL + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param mixed $wsdl optional, set to 'wsdl' or true if using WSDL + * @param string $proxyhost optional + * @param string $proxyport optional + * @param string $proxyusername optional + * @param string $proxypassword optional + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param string $portName optional portName in WSDL document + * @access public + */ + function nusoap_client($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30, $portName = ''){ + parent::nusoap_base(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + $this->portName = $portName; + + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->appendDebug('endpoint=' . $this->varDump($endpoint)); + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + $this->checkWSDL(); + } else { + $this->wsdlFile = $this->endpoint; + $this->wsdl = null; + $this->debug('will use lazy evaluation of wsdl from ' . $this->endpoint); + } + $this->endpointType = 'wsdl'; + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $operation SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call, normally an associative array mirroring the structure of the XML response, false for certain fatal errors + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params,$this->bindingType); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError('operation '.$operation.' not present in WSDL.'); + $this->debug("operation '$operation' not present in WSDL."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * check WSDL passed as an instance or pulled from an endpoint + * + * @access private + */ + function checkWSDL() { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('checkWSDL'); + // catch errors + if ($errstr = $this->wsdl->getError()) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap12')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap12'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + $this->debug('**************** WARNING: SOAP 1.2 BINDING *****************'); + } else { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } + + /** + * instantiate wsdl object and parse wsdl file + * + * @access public + */ + function loadWSDL() { + $this->debug('instantiating wsdl class with doc: '.$this->wsdlFile); + $this->wsdl = new wsdl('',$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout,$this->curl_options,$this->use_curl); + $this->wsdl->setCredentials($this->username, $this->password, $this->authtype, $this->certRequest); + $this->wsdl->fetchWSDL($this->wsdlFile); + $this->checkWSDL(); + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case preg_match('/^http/',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint, $this->curl_options, $this->use_curl); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(preg_match('/^http:/',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(preg_match('/^https/',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Response not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml: ' . $headers['content-type']); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + $parser = new nusoap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get SOAP headers + $this->responseHeader = $parser->get_soapheader(); + // get decoded message + $return = $parser->get_soapbody(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets user-specified cURL options + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access public + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + $this->curl_options[$option] = $value; + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param string $endpoint The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->debug("setEndpoint(\"$endpoint\")"); + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param mixed $headers String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->debug("setHeaders headers="); + $this->appendDebug($this->varDump($headers)); + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * get the SOAP response Header (parsed) + * + * @return mixed + * @access public + */ + function getHeader(){ + return $this->responseHeader; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc HTTP encoding + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->debug("setHTTPEncoding(\"$enc\")"); + $this->http_encoding = $enc; + } + + /** + * Set whether to try to use cURL connections if possible + * + * @param boolean $use Whether to try to use cURL + * @access public + */ + function setUseCURL($use) { + $this->debug("setUseCURL($use)"); + $this->use_curl = $use; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->debug("useHTTPPersistentConnection"); + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy() { + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"); + if ($this->getError()) { + $this->debug("Error from _getProxyClassCode, so return NULL"); + return null; + } + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new nusoap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->certRequest = $this->certRequest; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->http_encoding = $this->http_encoding; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->persistentConnection = &$this->persistentConnection; + $proxy->decode_utf8 = $this->decode_utf8; + $proxy->curl_options = $this->curl_options; + $proxy->bindingType = $this->bindingType; + $proxy->use_curl = $this->use_curl; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + $this->debug("in getProxy endpointType=$this->endpointType"); + $this->appendDebug("wsdl=" . $this->varDump($this->wsdl)); + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + $evalStr = "echo \"$evalStr\";"; + return $evalStr; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) { + return "echo \"" . $this->getError() . "\";"; + } + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class nusoap_proxy_'.$r.' extends nusoap_client { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return boolean if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return boolean always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return boolean always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} + +if (!extension_loaded('soap')) { + /** + * For backwards compatiblity, define soapclient unless the PHP SOAP extension is loaded. + */ + class soapclient extends nusoap_client { + } +} +?> diff --git a/modules/mondialrelay/lib/nusoap/class.wsdl.php b/modules/mondialrelay/lib/nusoap/class.wsdl.php new file mode 100755 index 000000000..d775098af --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.wsdl.php @@ -0,0 +1,1937 @@ + +* @author Scott Nichol +* @version $Id: class.wsdl.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class wsdl extends nusoap_base { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + var $curl_options = array(); // User-specified cURL options + var $use_curl = false; // whether to always try to use cURL + // for HTTP authentication + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param array $curl_options user-specified cURL options + * @param boolean $use_curl try to use cURL + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30,$curl_options=null,$use_curl=false){ + parent::nusoap_base(); + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + if (is_array($curl_options)) + $this->curl_options = $curl_options; + $this->use_curl = $use_curl; + $this->fetchWSDL($wsdl); + } + + /** + * fetches the WSDL document and parses it + * + * @access public + */ + function fetchWSDL($wsdl) { + $this->debug("parse and process WSDL path=$wsdl"); + $this->wsdl = $wsdl; + // parse wsdl file + if ($this->wsdl != "") { + $this->parseWSDL($this->wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + // Set operation style if necessary, but do not override one already provided + if (isset($bindingData['style']) && !isset($this->bindings[$binding]['operations'][$operation]['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') { + $this->debug("parse WSDL at path=$wsdl"); + + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl, $this->curl_options, $this->use_curl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if ($this->authtype != '') { + $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'Getting ' . $wsdl . ' - HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (preg_match('/schema$/', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new nusoap_xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (preg_match('/^xmlns/',$k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (preg_match('/:/', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with type) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with element) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element'] . '^'; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*preg_match('/types$/', $name) ||*/ preg_match('/schema$/', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $portName WSDL port name + * @param string $bindingType eg: soap, smtp, dime (only soap and soap12 are currently supported) + * @return array + * @access public + */ + function getOperations($portName = '', $bindingType = 'soap') { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } else { + $this->debug("getOperations bindingType $bindingType may not be supported"); + } + $this->debug("getOperations for port '$portName' bindingType $bindingType"); + // loop thru ports + foreach($this->ports as $port => $portData) { + $this->debug("getOperations checking port $port bindingType " . $portData['bindingType']); + if ($portName == '' || $port == $portName) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + $this->debug("getOperations found port $port bindingType $bindingType"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + } + if (count($ops) == 0) { + $this->debug("getOperations found no operations for port '$portName' bindingType $bindingType"); + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation name of operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param string $type the type + * @param string $ns namespace (not prefix) of the type + * @return mixed + * @access public + * @see nusoap_xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (!isset($this->schemas[$ns])) { + foreach ($this->schemas as $ns0 => $schema0) { + if (strcasecmp($ns, $ns0) == 0) { + $this->debug("in getTypeDef: replacing schema namespace $ns with $ns0"); + $ns = $ns0; + break; + } + } + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + $this->debug("in getTypeDef: found type $type"); + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } else { + $this->debug("did not find type for [element] $type"); + } + } + return $t; + } + } + $this->debug("in getTypeDef: did not find type $type"); + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $localPart = $this->getLocalPart($partType); + $typeDef = $this->getTypeDef($localPart, $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + if (substr($localPart, -1) == '^') { + $localPart = substr($localPart, 0, -1); + } + } else { + $elementortype = 'type'; + } + $xml .= "\n" . ' '; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' ' . htmlspecialchars($opParts['documentation']) . ''; + } + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + } + $portType_xml .= "\n" . ''; + $binding_xml .= "\n" . ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + } + } + $xml .= "\n" . ''; + return $xml . "\n"; + } + + /** + * determine whether a set of parameters are unwrapped + * when they are expect to be wrapped, Microsoft-style. + * + * @param string $type the type (element name) of the wrapper + * @param array $parameters the parameter values for the SOAP call + * @return boolean whether they parameters are unwrapped (and should be wrapped) + * @access private + */ + function parametersMatchWrapped($type, &$parameters) { + $this->debug("in parametersMatchWrapped type=$type, parameters="); + $this->appendDebug($this->varDump($parameters)); + + // split type into namespace:unqualified-type + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in parametersMatchWrapped: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in parametersMatchWrapped: expanded prefixed type: $uqType, $ns"); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in parametersMatchWrapped: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + + // get the type information + if (!$typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("in parametersMatchWrapped: $type ($uqType) is not a supported type."); + return false; + } + $this->debug("in parametersMatchWrapped: found typeDef="); + $this->appendDebug($this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + $phpType = $typeDef['phpType']; + $arrayType = (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : ''); + $this->debug("in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType"); + + // we expect a complexType or element of complexType + if ($phpType != 'struct') { + $this->debug("in parametersMatchWrapped: not a struct"); + return false; + } + + // see whether the parameter names match the elements + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $elements = 0; + $matches = 0; + foreach ($typeDef['elements'] as $name => $attrs) { + if (isset($parameters[$name])) { + $this->debug("in parametersMatchWrapped: have parameter named $name"); + $matches++; + } else { + $this->debug("in parametersMatchWrapped: do not have parameter named $name"); + } + $elements++; + } + + $this->debug("in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names"); + if ($matches == 0) { + return false; + } + return true; + } + + // since there are no elements for the type, if the user passed no + // parameters, the parameters match wrapped. + $this->debug("in parametersMatchWrapped: no elements type $ns:$uqType"); + return count($parameters) == 0; + } + + /** + * serialize PHP values according to a WSDL message definition + * contrary to the method name, this is not limited to RPC + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @param string $bindingType (soap|soap12) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters, $bindingType = 'soap') { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation, $bindingType)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + return false; + } + $this->debug('in serializeRPCParameters: opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + $parts = &$opData[$direction]['parts']; + $part_count = sizeof($parts); + $style = $opData['style']; + $use = $opData[$direction]['use']; + $this->debug("have $part_count part(s) to serialize using $style/$use"); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $parameter_count = count($parameters); + $this->debug("have $parameter_count parameter(s) provided as $parametersArrayType to serialize"); + // check for Microsoft-style wrapped parameters + if ($style == 'document' && $use == 'literal' && $part_count == 1 && isset($parts['parameters'])) { + $this->debug('check whether the caller has wrapped the parameters'); + if ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1) { + // TODO: consider checking here for double-wrapping, when + // service function wraps, then NuSOAP wraps again + $this->debug("change simple array to associative with 'parameters' element"); + $parameters['parameters'] = $parameters[0]; + unset($parameters[0]); + } + if (($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) { + $this->debug('check whether caller\'s parameters match the wrapped ones'); + if ($this->parametersMatchWrapped($parts['parameters'], $parameters)) { + $this->debug('wrap the parameters for the caller'); + $parameters = array('parameters' => $parameters); + $parameter_count = 1; + } + } + } + foreach ($parts as $name => $type) { + $this->debug("serializing part $name of type $type"); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'Array') { + // JBoss/Axis does this sometimes + return $this->serialize_val($value, $name, false, false, false, false, $use); + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + } + if (!isset($typeDef['phpType'])) { + $this->setError("$type ($uqType) has no phpType."); + $this->debug("in serializeType: $type ($uqType) has no phpType."); + return false; + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs and nillable + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + if (isset($typeDef['simpleContent']) && $typeDef['simpleContent'] == 'true') { + if (isset($value['!'])) { + $xml .= $value['!']; + $this->debug("in serializeType: serialized simpleContent for type $type"); + } else { + $this->debug("in serializeType: no simpleContent to serialize for type $type"); + } + } else { + // complexContent + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $this->debug("serializeComplexTypeAttributes for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize attributes for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeAttributes($typeDefx, $value, $nsx, $uqTypex); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $this->debug("in serializeComplexTypeElements for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize elements for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeElements($typeDefx, $value, $nsx, $uqTypex, $use, $encodingStyle); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (is_null($v) && isset($attrs['minOccurs']) && $attrs['minOccurs'] == '0') { + // do nothing + } elseif (is_null($v) && isset($attrs['nillable']) && $attrs['nillable'] == 'true') { + // TODO: serialize a nil correctly, but for now serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } elseif (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string $name + * @param string $typeClass (complexType|simpleType|attribute) + * @param string $phpType currently supported are array and struct (php assoc array) + * @param string $compositor (all|sequence|choice) + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array $elements e.g. array ( name => array(name=>'',type=>'') ) + * @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string $arrayType as namespace:name (xsd:string) + * @see nusoap_xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + $eElements = array(); + foreach($elements as $n => $e){ + // expand each element + $ee = array(); + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see nusoap_xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name . '^'); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType', 'form' => 'qualified')); + $out = array('parameters' => 'tns:' . $name . 'Response' . '^'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} + diff --git a/modules/mondialrelay/lib/nusoap/class.wsdlcache.php b/modules/mondialrelay/lib/nusoap/class.wsdlcache.php new file mode 100755 index 000000000..990a0c7ae --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.wsdlcache.php @@ -0,0 +1,209 @@ + +* @author Ingo Fischer +* @version $Id: class.wsdlcache.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_wsdlcache { + /** + * @var resource + * @access private + */ + var $fplock; + /** + * @var integer + * @access private + */ + var $cache_lifetime; + /** + * @var string + * @access private + */ + var $cache_dir; + /** + * @var string + * @access public + */ + var $debug_str = ''; + + /** + * constructor + * + * @param string $cache_dir directory for cache-files + * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited + * @access public + */ + function nusoap_wsdlcache($cache_dir='.', $cache_lifetime=0) { + $this->fplock = array(); + $this->cache_dir = $cache_dir != '' ? $cache_dir : '.'; + $this->cache_lifetime = $cache_lifetime; + } + + /** + * creates the filename used to cache a wsdl instance + * + * @param string $wsdl The URL of the wsdl instance + * @return string The filename used to cache the instance + * @access private + */ + function createFilename($wsdl) { + return $this->cache_dir.'/wsdlcache-' . md5($wsdl); + } + + /** + * adds debug data to the class level debug string + * + * @param string $string debug data + * @access private + */ + function debug($string){ + $this->debug_str .= get_class($this).": $string\n"; + } + + /** + * gets a wsdl instance from the cache + * + * @param string $wsdl The URL of the wsdl instance + * @return object wsdl The cached wsdl instance, null if the instance is not in the cache + * @access public + */ + function get($wsdl) { + $filename = $this->createFilename($wsdl); + if ($this->obtainMutex($filename, "r")) { + // check for expired WSDL that must be removed from the cache + if ($this->cache_lifetime > 0) { + if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) { + unlink($filename); + $this->debug("Expired $wsdl ($filename) from cache"); + $this->releaseMutex($filename); + return null; + } + } + // see what there is to return + if (!file_exists($filename)) { + $this->debug("$wsdl ($filename) not in cache (1)"); + $this->releaseMutex($filename); + return null; + } + $fp = @fopen($filename, "r"); + if ($fp) { + $s = implode("", @file($filename)); + fclose($fp); + $this->debug("Got $wsdl ($filename) from cache"); + } else { + $s = null; + $this->debug("$wsdl ($filename) not in cache (2)"); + } + $this->releaseMutex($filename); + return (!is_null($s)) ? unserialize($s) : null; + } else { + $this->debug("Unable to obtain mutex for $filename in get"); + } + return null; + } + + /** + * obtains the local mutex + * + * @param string $filename The Filename of the Cache to lock + * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode + * @return boolean Lock successfully obtained ?! + * @access private + */ + function obtainMutex($filename, $mode) { + if (isset($this->fplock[md5($filename)])) { + $this->debug("Lock for $filename already exists"); + return false; + } + $this->fplock[md5($filename)] = fopen($filename.".lock", "w"); + if ($mode == "r") { + return flock($this->fplock[md5($filename)], LOCK_SH); + } else { + return flock($this->fplock[md5($filename)], LOCK_EX); + } + } + + /** + * adds a wsdl instance to the cache + * + * @param object wsdl $wsdl_instance The wsdl instance to add + * @return boolean WSDL successfully cached + * @access public + */ + function put($wsdl_instance) { + $filename = $this->createFilename($wsdl_instance->wsdl); + $s = serialize($wsdl_instance); + if ($this->obtainMutex($filename, "w")) { + $fp = fopen($filename, "w"); + if (! $fp) { + $this->debug("Cannot write $wsdl_instance->wsdl ($filename) in cache"); + $this->releaseMutex($filename); + return false; + } + fputs($fp, $s); + fclose($fp); + $this->debug("Put $wsdl_instance->wsdl ($filename) in cache"); + $this->releaseMutex($filename); + return true; + } else { + $this->debug("Unable to obtain mutex for $filename in put"); + } + return false; + } + + /** + * releases the local mutex + * + * @param string $filename The Filename of the Cache to lock + * @return boolean Lock successfully released + * @access private + */ + function releaseMutex($filename) { + $ret = flock($this->fplock[md5($filename)], LOCK_UN); + fclose($this->fplock[md5($filename)]); + unset($this->fplock[md5($filename)]); + if (! $ret) { + $this->debug("Not able to release lock for $filename"); + } + return $ret; + } + + /** + * removes a wsdl instance from the cache + * + * @param string $wsdl The URL of the wsdl instance + * @return boolean Whether there was an instance to remove + * @access public + */ + function remove($wsdl) { + $filename = $this->createFilename($wsdl); + if (!file_exists($filename)) { + $this->debug("$wsdl ($filename) not in cache to be removed"); + return false; + } + // ignore errors obtaining mutex + $this->obtainMutex($filename, "w"); + $ret = unlink($filename); + $this->debug("Removed ($ret) $wsdl ($filename) from cache"); + $this->releaseMutex($filename); + return $ret; + } +} + +/** + * For backward compatibility + */ +class wsdlcache extends nusoap_wsdlcache { +} +?> diff --git a/modules/mondialrelay/lib/nusoap/class.xmlschema.php b/modules/mondialrelay/lib/nusoap/class.xmlschema.php new file mode 100755 index 000000000..1552e8254 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/class.xmlschema.php @@ -0,0 +1,972 @@ + +* @author Scott Nichol +* @version $Id: class.xmlschema.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_xmlschema extends nusoap_base { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function nusoap_xmlschema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base(); + $this->debug('nusoap_xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml path/URL to XML file + * @param string $type (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * gets a type name for an unnamed type + * + * @param string Element name + * @return string A type name for an unnamed type + * @access private + */ + function CreateTypeName($ename) { + $scope = ''; + for ($i = 0; $i < count($this->complexTypeStack); $i++) { + $scope .= $this->complexTypeStack[$i] . '_'; + } + return $scope . $ename . '_ContainedType'; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(preg_match('/^xmlns/',$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + // TODO: handle globals + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + $this->xdebug("do nothing for element $name"); + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + // TODO: what is the scope of named complexTypes that appear + // nested within other c complexTypes? + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } else { + $name = $this->CreateTypeName($this->currentElement); + $this->xdebug('processing unnamed complexType for element ' . $this->currentElement . ' named ' . $name); + $this->currentComplexType = $name; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'false'; + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + if (!isset($attrs['form'])) { + if ($this->currentComplexType) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } else { + // global + $attrs['form'] = 'qualified'; + } + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $type = $this->CreateTypeName($this->currentComplexType . '_' . $attrs['name']); + $this->xdebug("processing untyped element " . $attrs['name'] . ' type ' . $type); + $this->currentElement = $attrs['name']; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $type; + $ename = $attrs['name']; + } + if (isset($ename) && $this->currentComplexType) { + $this->xdebug("add element $ename to complexType $this->currentComplexType"); + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } elseif (!isset($attrs['ref'])) { + $this->xdebug("add element $ename to elements array"); + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $ns = $this->getPrefix($attrs['base']); + if ($ns == '') { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $this->schemaTargetNamespace . ':' . $attrs['base']; + } else { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + } else { + $this->xdebug('no current complexType to set extensionBase'); + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'include': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('include into namespace ' . $this->schemaTargetNamespace . ' from ' . $attrs['schemaLocation']); + $this->imports[$this->schemaTargetNamespace][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('ignoring invalid XML Schema construct: include without schemaLocation attribute'); + } + break; + case 'list': // simpleType value list + $this->xdebug("do nothing for element $name"); + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + if ($this->currentComplexType) { // This should *always* be + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'true'; + } else { + $this->xdebug("do nothing for element $name because there is no current complexType"); + } + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $name = $this->CreateTypeName($this->currentComplexType . '_' . $this->currentElement); + $this->xdebug('processing unnamed simpleType for element ' . $this->currentElement . ' named ' . $name); + $this->currentSimpleType = $name; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + $this->xdebug("do nothing for element $name"); + break; + default: + $this->xdebug("do not have any logic to process element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->xdebug($this->varDump($this->complexTypes[$this->currentComplexType])); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->xdebug($this->varDump($this->simpleTypes[$this->currentSimpleType])); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\">\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " \n "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $attr = ''; + foreach ($this->schemaInfo as $k => $v) { + if ($k == 'elementFormDefault' || $k == 'attributeFormDefault') { + $attr .= " $k=\"$v\""; + } + } + $el = "<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\""; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type name of defined type + * @param string $ns namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string $type + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if (substr($type, -1) == '^') { + $is_element = 1; + $type = substr($type, 0, -1); + } else { + $is_element = 0; + } + + if((! $is_element) && isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif((! $is_element) && isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + if (isset($etype['extensionBase'])) { + $this->elements[$type]['extensionBase'] = $etype['extensionBase']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (preg_match('/_ContainedType$/', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($typeDef['attrs'] as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name name for type instance + * @param string $type name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see nusoap_xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + +/** + * Backward compatibility + */ +class XMLSchema extends nusoap_xmlschema { +} + + diff --git a/modules/mondialrelay/lib/nusoap/nusoap.php b/modules/mondialrelay/lib/nusoap/nusoap.php new file mode 100755 index 000000000..7d1fa1f92 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/nusoap.php @@ -0,0 +1,8148 @@ + +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_base { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.9.5'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 7091 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the nusoap_xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel']; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']['globalDebugLevel'] = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + $ret = ""; + return $ret; + } + + /** + * expands entities, e.g. changes '<' to '<'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&', $val); + $val = str_replace("'", ''', $val); + $val = str_replace('"', '"', $val); + $val = str_replace('<', '<', $val); + $val = str_replace('>', '>', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @param boolean $soapval Whether this is called from soapval. + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded',$soapval=false) { + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use, soapval=$soapval"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if (is_object($val) && get_class($val) == 'soapval' && (! $soapval)) { + $this->debug("serialize_val: serialize soapval"); + $xml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + $this->debug("serialize_val of soapval returning $xml"); + return $xml; + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + $this->debug("serialize_val: serialize null"); + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$xmlns$atts/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + $xml = "<$name$xmlns$type_str$atts xsi:nil=\"true\"/>"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + $this->debug("serialize_val: serialize xsd built-in primitive type"); + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + $xml = "<$name$xmlns$atts>$val"; + $this->debug("serialize_val returning $xml"); + return $xml; + } else { + $xml = "<$name$xmlns xsi:type=\"xsd:$type\"$atts>$val"; + $this->debug("serialize_val returning $xml"); + return $xml; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + $this->debug("serialize_val: serialize boolean"); + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + $this->debug("serialize_val: serialize int"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + $this->debug("serialize_val: serialize float"); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val"; + } + break; + case (is_string($val) || $type == 'string'): + $this->debug("serialize_val: serialize string"); + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val"; + } + break; + case is_object($val): + $this->debug("serialize_val: serialize object"); + if (get_class($val) == 'soapval') { + $this->debug("serialize_val: serialize soapval object"); + $pXml = $val->serialize($use); + $this->appendDebug($val->getDebug()); + $val->clearDebug(); + } else { + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>$pXml"; + } else { + $xml .= "<$name$xmlns$type_str$atts>$pXml"; + } + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || preg_match('/^ArrayOf/',$type)){ + $this->debug("serialize_val: serialize array"); + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml.""; + } else { + // got a struct + $this->debug("serialize_val: serialize struct"); + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns$atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= ''; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= ''; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= ""; + } + break; + default: + $this->debug("serialize_val: serialize unknown"); + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + $this->debug("serialize_val returning $xml"); + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $k => $v) { + if (is_object($v) && get_class($v) == 'soapval') { + $xml .= $this->serialize_val($v, false, false, false, false, false, $use); + } else { + $xml .= $this->serialize_val($v, $k, false, false, false, false, $use); + } + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialized array of headers to $headers"); + } + $headers = "".$headers.""; + } + // serialize envelope + return + 'soap_defencoding .'"?'.">". + '". + $headers. + "". + $body. + "". + ""; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $qname qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !preg_match('/^http:\/\//',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } + + /** + * represents the object as a string + * + * @return string + * @access public + */ + function __toString() { + return $this->varDump($this); + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param int $timestamp Unix time stamp +* @param boolean $utc Whether the time stamp is UTC or local +* @return mixed ISO 8601 date string or false +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + $pos = strrpos($datestr, "+"); + if ($pos === FALSE) { + $pos = strrpos($datestr, "-"); + } + if ($pos !== FALSE) { + if (strlen($datestr) == $pos + 5) { + $datestr = substr($datestr, 0, $pos + 3) . ':' . substr($datestr, -2); + } + } + if($utc){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + + if(preg_match($pattern,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @return mixed Unix timestamp (int) or false +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $pattern = '/'. + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'. // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + '/'; + if(preg_match($pattern,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); +// return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + +?> +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_fault extends nusoap_base { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (SOAP-ENV:Client | SOAP-ENV:Server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function nusoap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + 'soap_defencoding.'"?>'. + '\n". + ''. + ''. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + ''. + ''. + ''; + return $return_msg; + } +} + +/** + * Backward compatibility + */ +class soap_fault extends nusoap_fault { +} + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_xmlschema extends nusoap_base { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function nusoap_xmlschema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base(); + $this->debug('nusoap_xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml path/URL to XML file + * @param string $type (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * gets a type name for an unnamed type + * + * @param string Element name + * @return string A type name for an unnamed type + * @access private + */ + function CreateTypeName($ename) { + $scope = ''; + for ($i = 0; $i < count($this->complexTypeStack); $i++) { + $scope .= $this->complexTypeStack[$i] . '_'; + } + return $scope . $ename . '_ContainedType'; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(preg_match('/^xmlns/',$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + // TODO: handle globals + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + $this->xdebug("do nothing for element $name"); + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + // TODO: what is the scope of named complexTypes that appear + // nested within other c complexTypes? + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } else { + $name = $this->CreateTypeName($this->currentElement); + $this->xdebug('processing unnamed complexType for element ' . $this->currentElement . ' named ' . $name); + $this->currentComplexType = $name; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && preg_match('/:Array$/',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'false'; + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + if (!isset($attrs['form'])) { + if ($this->currentComplexType) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } else { + // global + $attrs['form'] = 'qualified'; + } + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $type = $this->CreateTypeName($this->currentComplexType . '_' . $attrs['name']); + $this->xdebug("processing untyped element " . $attrs['name'] . ' type ' . $type); + $this->currentElement = $attrs['name']; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $type; + $ename = $attrs['name']; + } + if (isset($ename) && $this->currentComplexType) { + $this->xdebug("add element $ename to complexType $this->currentComplexType"); + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } elseif (!isset($attrs['ref'])) { + $this->xdebug("add element $ename to elements array"); + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $ns = $this->getPrefix($attrs['base']); + if ($ns == '') { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $this->schemaTargetNamespace . ':' . $attrs['base']; + } else { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + } else { + $this->xdebug('no current complexType to set extensionBase'); + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'include': + if (isset($attrs['schemaLocation'])) { + $this->xdebug('include into namespace ' . $this->schemaTargetNamespace . ' from ' . $attrs['schemaLocation']); + $this->imports[$this->schemaTargetNamespace][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + $this->xdebug('ignoring invalid XML Schema construct: include without schemaLocation attribute'); + } + break; + case 'list': // simpleType value list + $this->xdebug("do nothing for element $name"); + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + if ($this->currentComplexType) { // This should *always* be + $this->complexTypes[$this->currentComplexType]['simpleContent'] = 'true'; + } else { + $this->xdebug("do nothing for element $name because there is no current complexType"); + } + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $name = $this->CreateTypeName($this->currentComplexType . '_' . $this->currentElement); + $this->xdebug('processing unnamed simpleType for element ' . $this->currentElement . ' named ' . $name); + $this->currentSimpleType = $name; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + $this->xdebug("do nothing for element $name"); + break; + default: + $this->xdebug("do not have any logic to process element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->xdebug($this->varDump($this->complexTypes[$this->currentComplexType])); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->xdebug($this->varDump($this->simpleTypes[$this->currentSimpleType])); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\">\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " \n "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $attr = ''; + foreach ($this->schemaInfo as $k => $v) { + if ($k == 'elementFormDefault' || $k == 'attributeFormDefault') { + $attr .= " $k=\"$v\""; + } + } + $el = "<$schemaPrefix:schema$attr targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\""; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type name of defined type + * @param string $ns namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string $type + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if (substr($type, -1) == '^') { + $is_element = 1; + $type = substr($type, 0, -1); + } else { + $is_element = 0; + } + + if((! $is_element) && isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif((! $is_element) && isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + if (isset($etype['extensionBase'])) { + $this->elements[$type]['extensionBase'] = $etype['extensionBase']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (preg_match('/_ContainedType$/', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($typeDef['attrs'] as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name name for type instance + * @param string $type name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see nusoap_xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + +/** + * Backward compatibility + */ +class XMLSchema extends nusoap_xmlschema { +} + +?> +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class soapval extends nusoap_base { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use, true); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class soap_transport_http extends nusoap_base { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $response_status_line; // HTTP response status line + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $ch_options = array(); // cURL custom options + var $use_curl = false; // force cURL use + var $proxy = null; // proxy information (associative array) + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // certpassword: SSL certificate password + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + * + * @param string $url The URL to which to connect + * @param array $curl_options User-specified cURL options + * @param boolean $use_curl Whether to try to force cURL use + * @access public + */ + function soap_transport_http($url, $curl_options = NULL, $use_curl = false){ + parent::nusoap_base(); + $this->debug("ctor url=$url use_curl=$use_curl curl_options:"); + $this->appendDebug($this->varDump($curl_options)); + $this->setURL($url); + if (is_array($curl_options)) { + $this->ch_options = $curl_options; + } + $this->use_curl = $use_curl; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->setHeader('User-Agent', $this->title.'/'.$this->version.' ('.$rev[1].')'); + } + + /** + * sets a cURL option + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access private + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + curl_setopt($this->ch, $option, $value); + } + + /** + * sets an HTTP header + * + * @param string $name The name of the header + * @param string $value The value of the header + * @access private + */ + function setHeader($name, $value) { + $this->outgoing_headers[$name] = $value; + $this->debug("set header $name: $value"); + } + + /** + * unsets an HTTP header + * + * @param string $name The name of the header + * @access private + */ + function unsetHeader($name) { + if (isset($this->outgoing_headers[$name])) { + $this->debug("unset header $name"); + unset($this->outgoing_headers[$name]); + } + } + + /** + * sets the URL to which to connect + * + * @param string $url The URL to which to connect + * @access private + */ + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("parsed URL $k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->setHeader('Host', $this->host); + } else { + $this->setHeader('Host', $this->host.':'.$this->port); + } + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + /** + * gets the I/O method to use + * + * @return string I/O method to use (socket|curl|unknown) + * @access private + */ + function io_method() { + if ($this->use_curl || ($this->scheme == 'https') || ($this->scheme == 'http' && $this->authtype == 'ntlm') || ($this->scheme == 'http' && is_array($this->proxy) && $this->proxy['authtype'] == 'ntlm')) + return 'curl'; + if (($this->scheme == 'http' || $this->scheme == 'ssl') && $this->authtype != 'ntlm' && (!is_array($this->proxy) || $this->proxy['authtype'] != 'ntlm')) + return 'socket'; + return 'unknown'; + } + + /** + * establish an HTTP connection + * + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return boolean true if connected, false if not + * @access private + */ + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->io_method() == 'socket') { + if (!is_array($this->proxy)) { + $host = $this->host; + $port = $this->port; + } else { + $host = $this->proxy['host']; + $port = $this->proxy['port']; + } + + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->io_method() == 'curl') { + if (!extension_loaded('curl')) { +// $this->setError('cURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + $this->setError('The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to include cURL or change php.ini to load the PHP cURL extension.'); + return false; + } + // Avoid warnings when PHP does not have these options + if (defined('CURLOPT_CONNECTIONTIMEOUT')) + $CURLOPT_CONNECTIONTIMEOUT = CURLOPT_CONNECTIONTIMEOUT; + else + $CURLOPT_CONNECTIONTIMEOUT = 78; + if (defined('CURLOPT_HTTPAUTH')) + $CURLOPT_HTTPAUTH = CURLOPT_HTTPAUTH; + else + $CURLOPT_HTTPAUTH = 107; + if (defined('CURLOPT_PROXYAUTH')) + $CURLOPT_PROXYAUTH = CURLOPT_PROXYAUTH; + else + $CURLOPT_PROXYAUTH = 111; + if (defined('CURLAUTH_BASIC')) + $CURLAUTH_BASIC = CURLAUTH_BASIC; + else + $CURLAUTH_BASIC = 1; + if (defined('CURLAUTH_DIGEST')) + $CURLAUTH_DIGEST = CURLAUTH_DIGEST; + else + $CURLAUTH_DIGEST = 2; + if (defined('CURLAUTH_NTLM')) + $CURLAUTH_NTLM = CURLAUTH_NTLM; + else + $CURLAUTH_NTLM = 8; + + $this->debug('connect using cURL'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "$this->scheme://$this->host:$this->port" : "$this->scheme://$this->host"; + // add path + $hostURL .= $this->path; + $this->setCurlOption(CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + if (ini_get('safe_mode') || ini_get('open_basedir')) { + $this->debug('safe_mode or open_basedir set, so do not set CURLOPT_FOLLOWLOCATION'); + $this->debug('safe_mode = '); + $this->appendDebug($this->varDump(ini_get('safe_mode'))); + $this->debug('open_basedir = '); + $this->appendDebug($this->varDump(ini_get('open_basedir'))); + } else { + $this->setCurlOption(CURLOPT_FOLLOWLOCATION, 1); + } + // ask for headers in the response output + $this->setCurlOption(CURLOPT_HEADER, 1); + // ask for the response output as the return value + $this->setCurlOption(CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// $this->setCurlOption(CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // I believe the following comment is now bogus, having applied to + // the code when it used CURLOPT_CUSTOMREQUEST to send the request. + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //$this->setCurlOption(CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->setHeader('Connection', 'close'); + } + // set timeouts + if ($connection_timeout != 0) { + $this->setCurlOption($CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + } + if ($response_timeout != 0) { + $this->setCurlOption(CURLOPT_TIMEOUT, $response_timeout); + } + + if ($this->scheme == 'https') { + $this->debug('set cURL SSL verify options'); + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. + //$this->setCurlOption(CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 0); + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + $this->debug('set cURL certificate options'); + if (isset($this->certRequest['cainfofile'])) { + $this->setCurlOption(CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + $this->setCurlOption(CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + $this->setCurlOption(CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + $this->setCurlOption(CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + $this->setCurlOption(CURLOPT_SSLKEYPASSWD, $this->certRequest['passphrase']); + } + if (isset($this->certRequest['certpassword'])) { + $this->setCurlOption(CURLOPT_SSLCERTPASSWD, $this->certRequest['certpassword']); + } + } + } + if ($this->authtype && ($this->authtype != 'certificate')) { + if ($this->username) { + $this->debug('set cURL username/password'); + $this->setCurlOption(CURLOPT_USERPWD, "$this->username:$this->password"); + } + if ($this->authtype == 'basic') { + $this->debug('set cURL for Basic authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_BASIC); + } + if ($this->authtype == 'digest') { + $this->debug('set cURL for digest authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_DIGEST); + } + if ($this->authtype == 'ntlm') { + $this->debug('set cURL for NTLM authentication'); + $this->setCurlOption($CURLOPT_HTTPAUTH, $CURLAUTH_NTLM); + } + } + if (is_array($this->proxy)) { + $this->debug('set cURL proxy options'); + if ($this->proxy['port'] != '') { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host'].':'.$this->proxy['port']); + } else { + $this->setCurlOption(CURLOPT_PROXY, $this->proxy['host']); + } + if ($this->proxy['username'] || $this->proxy['password']) { + $this->debug('set cURL proxy authentication options'); + $this->setCurlOption(CURLOPT_PROXYUSERPWD, $this->proxy['username'].':'.$this->proxy['password']); + if ($this->proxy['authtype'] == 'basic') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_BASIC); + } + if ($this->proxy['authtype'] == 'ntlm') { + $this->setCurlOption($CURLOPT_PROXYAUTH, $CURLAUTH_NTLM); + } + } + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * sends the SOAP request and gets the SOAP response via HTTP[S] + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError("Too many tries to get an OK response ($this->response_status_line)"); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * sends the SOAP request and gets the SOAP response via HTTPS using CURL + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + * @deprecated + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype digestRequest="); + $this->appendDebug($this->varDump($digestRequest)); + $this->debug("certRequest="); + $this->appendDebug($this->varDump($certRequest)); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->setHeader('Authorization', 'Basic '.base64_encode(str_replace(':','',$username).':'.$password)); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = md5($A1); + + // A2 = Method ":" digest-uri-value + $A2 = $this->request_method . ':' . $this->digest_uri; + + // H(A2) + $HA2 = md5($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = md5($unhashedDigest); + + $opaque = ''; + if (isset($digestRequest['opaque'])) { + $opaque = ', opaque="' . $digestRequest['opaque'] . '"'; + } + + $this->setHeader('Authorization', 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . $opaque . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'); + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + $this->debug('Authorization header not set for certificate'); + } elseif ($authtype == 'ntlm') { + // do nothing + $this->debug('Authorization header not set for ntlm'); + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->setHeader('SOAPAction', '"' . $soapaction . '"'); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->setHeader('Accept-Encoding', $enc); + if (!isset($this->outgoing_headers['Connection'])) { + $this->setHeader('Connection', 'close'); + $this->persistentConnection = false; + } + // deprecated as of PHP 5.3.0 + //set_magic_quotes_runtime(0); + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost use an empty string to remove proxy + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param string $proxyauthtype (basic|ntlm) + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '', $proxyauthtype = 'basic') { + if ($proxyhost) { + $this->proxy = array( + 'host' => $proxyhost, + 'port' => $proxyport, + 'username' => $proxyusername, + 'password' => $proxypassword, + 'authtype' => $proxyauthtype + ); + if ($proxyusername != '' && $proxypassword != '' && $proxyauthtype = 'basic') { + $this->setHeader('Proxy-Authorization', ' Basic '.base64_encode($proxyusername.':'.$proxypassword)); + } + } else { + $this->debug('remove proxy'); + $proxy = null; + unsetHeader('Proxy-Authorization'); + } + } + + + /** + * Test if the given string starts with a header that is to be skipped. + * Skippable headers result from chunked transfer and proxy requests. + * + * @param string $data The string to check. + * @returns boolean Whether a skippable header was found. + * @access private + */ + function isSkippableCurlHeader(&$data) { + $skipHeaders = array( 'HTTP/1.1 100', + 'HTTP/1.0 301', + 'HTTP/1.1 301', + 'HTTP/1.0 302', + 'HTTP/1.1 302', + 'HTTP/1.0 401', + 'HTTP/1.1 401', + 'HTTP/1.0 200 Connection established'); + foreach ($skipHeaders as $hd) { + $prefix = substr($data, 0, strlen($hd)); + if ($prefix == $hd) return true; + } + + return false; + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /** + * Writes the payload, including HTTP headers, to $this->outgoing_payload. + * + * @param string $data HTTP body + * @param string $cookie_str data for HTTP Cookie header + * @return void + * @access private + */ + function buildPayload($data, $cookie_str = '') { + // Note: for cURL connections, $this->outgoing_payload is ignored, + // as is the Content-Length header, but these are still created as + // debugging guides. + + // add content-length header + if ($this->request_method != 'GET') { + $this->setHeader('Content-Length', strlen($data)); + } + + // start building outgoing payload: + if ($this->proxy) { + $uri = $this->url; + } else { + $uri = $this->uri; + } + $req = "$this->request_method $uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + /** + * sends the SOAP request via HTTP[S] + * + * @param string $data message data + * @param array $cookies cookies to send + * @return boolean true if OK, false if problem + * @access private + */ + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->io_method() == 'socket') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->io_method() == 'curl') { + // set payload + // cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with (so we no longer use this method!) + //$this->setCurlOption(CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + $curl_headers = array(); + foreach($this->outgoing_headers as $k => $v){ + if ($k == 'Connection' || $k == 'Content-Length' || $k == 'Host' || $k == 'Authorization' || $k == 'Proxy-Authorization') { + $this->debug("Skip cURL header $k: $v"); + } else { + $curl_headers[] = "$k: $v"; + } + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + $this->setCurlOption(CURLOPT_HTTPHEADER, $curl_headers); + $this->debug('set cURL HTTP headers'); + if ($this->request_method == "POST") { + $this->setCurlOption(CURLOPT_POST, 1); + $this->setCurlOption(CURLOPT_POSTFIELDS, $data); + $this->debug('set cURL POST data'); + } else { + } + // insert custom user-set cURL options + foreach ($this->ch_options as $key => $val) { + $this->setCurlOption($key, $val); + } + + $this->debug('set cURL payload'); + return true; + } + } + + /** + * gets the SOAP response via HTTP[S] + * + * @return string the response (also sets member variables like incoming_payload) + * @access private + */ + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->io_method() == 'socket') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 headers + if (isset($lb) && preg_match('/^HTTP\/1.1 100/',$data)) { + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "
    \nde-chunked:\n---------------\n$data\n\n---------------\n
    "; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->io_method() == 'curl') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'
    '; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v
    "; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '
    ';
    +			//var_dump(curl_getinfo($this->ch));
    +			//echo '
    '; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // try removing skippable headers + $savedata = $data; + while ($this->isSkippableCurlHeader($data)) { + $this->debug("Found HTTP header to skip"); + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + if ($data == '') { + // have nothing left; just remove 100 header(s) + $data = $savedata; + while (preg_match('/^HTTP\/1.1 100/',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $this->response_status_line = $header_array[0]; + $arr = explode(' ', $this->response_status_line, 3); + $http_version = $arr[0]; + $http_status = (int)($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && ($http_status == 301 || $http_status == 302)) { + $this->debug("Got $http_status $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + /** + * sets the content-type for the SOAP message to be sent + * + * @param string $type the content type, MIME style + * @param mixed $charset character set used for encoding (or false) + * @access public + */ + function setContentType($type, $charset = false) { + $this->setHeader('Content-Type', $type . ($charset ? '; charset=' . $charset : '')); + } + + /** + * specifies that an HTTP persistent connection should be used + * + * @return boolean whether the request was honored by this method. + * @access public + */ + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->setHeader('Connection', 'Keep-Alive'); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = preg_split('/;/', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } +} + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_server extends nusoap_base { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP Headers from request (parsed) + * @var mixed + * @access public + */ + var $requestHeader = NULL; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text or array of soapval or associative array) + * @var mixed + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function nusoap_server($wsdl=false){ + parent::nusoap_base(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In nusoap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In nusoap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In nusoap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['REQUEST_METHOD'])) { + $rm = $_SERVER['REQUEST_METHOD']; + } elseif (isset($HTTP_SERVER_VARS['REQUEST_METHOD'])) { + $rm = $HTTP_SERVER_VARS['REQUEST_METHOD']; + } else { + $rm = ''; + } + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, request method=$rm query string=$qs strlen(\$data)=" . strlen($data)); + + if ($rm == 'POST') { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } elseif (preg_match('/wsdl/', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if ($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL, "http://") !== false) { // assume URL + $this->debug("In service, re-direct for WSDL"); + header('Location: '.$this->externalWSDLURL); + } else { // assume file + $this->debug("In service, use file passthru for WSDL"); + header("Content-Type: text/xml\r\n"); + $pos = strpos($this->externalWSDLURL, "file://"); + if ($pos === false) { + $filename = $this->externalWSDLURL; + } else { + $filename = substr($this->externalWSDLURL, $pos + 7); + } + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + $this->debug("In service, serialize WSDL"); + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + $this->debug("In service, there is no WSDL"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($this->wsdl) { + $this->debug("In service, return Web description"); + print $this->wsdl->webDescription(); + } else { + $this->debug("In service, no Web description"); + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide a Web description"; + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('SOAP-ENV:Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('SOAP-ENV:Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + // + // if you are debugging in this area of the code, your service uses a class to implement methods, + // you use SOAP RPC, and the client is .NET, please be aware of the following... + // when the .NET wsdl.exe utility generates a proxy, it will remove the '.' or '..' from the + // method name. that is fine for naming the .NET methods. it is not fine for properly constructing + // the XML request and reading the XML response. you need to add the RequestElementName and + // ResponseElementName to the System.Web.Services.Protocols.SoapRpcMethodAttribute that wsdl.exe + // generates for the method. these parameters are used to specify the correct XML element names + // for .NET to use, i.e. the names with the '.' in them. + // + $orig_methodname = $this->methodname; + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('SOAP-ENV:Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + $this->debug("in invoke_method, delim=$delim"); + + $class = ''; + $method = ''; + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1) { + $try_class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + if (class_exists($try_class)) { + // get the class and method name + $class = $try_class; + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } else { + $this->debug("in invoke_method, class=$try_class not found"); + } + } else { + $try_class = ''; + $this->debug("in invoke_method, no class to try"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'('$orig_methodname') not defined in service('$try_class' '$delim')"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('SOAP-ENV:Client',"method '$this->methodname'/'$method_to_compare'('$orig_methodname') not defined in service/'$class'('$try_class' '$delim')"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('SOAP-ENV:Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param) || is_object($param)) { + $this->fault('SOAP-ENV:Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + if (is_array($this->methodparams)) { + $this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams)); + } else { + $this->methodreturn = call_user_func_array($call_arg, array()); + } + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received data of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && is_object($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + if (sizeof($this->opData['output']['parts']) > 1) { + $this->debug('more than one output part, so use the method return unchanged'); + $opParams = $this->methodreturn; + } elseif (sizeof($this->opData['output']['parts']) == 1) { + $this->debug('exactly one output part, so wrap the method return in a simple array'); + // TODO: verify that it is not already wrapped! + //foreach ($this->opData['output']['parts'] as $name => $type) { + // $this->debug('wrap in element named ' . $name); + //} + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('SOAP-ENV:Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + if ($this->methodURI) { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'methodname.'Response>'; + } + } else { + if ($this->methodURI) { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = '<'.$this->methodname.'Response>'.$return_val.'methodname.'Response>'; + } + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($this->opData['output']['encodingStyle'])) { + $encodingStyle = $this->opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$this->opData['output']['use'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + preg_match('/\$Revisio' . 'n: ([^ ]+)/', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Request not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + // parse response, get soap parser obj + $parser = new nusoap_parser($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('SOAP-ENV:Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_soapbody()'); + $this->methodparams = $parser->get_soapbody(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // get SOAP Header + $this->requestHeader = $parser->get_soapheader(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $soapaction = "$SCHEME://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occurred. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new nusoap_fault($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : (isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'); + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = isset($HTTP_SERVER_VARS['HTTPS']) ? $HTTP_SERVER_VARS['HTTPS'] : 'off'; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + // If server name has port number attached then strip it (else port number gets duplicated in WSDL output) (occurred using lighttpd and FastCGI) + $colon = strpos($SERVER_NAME,":"); + if ($colon) { + $SERVER_NAME = substr($SERVER_NAME, 0, $colon); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new nusoap_xmlschema('', '', $this->wsdl->namespaces); + if ($style == 'document') { + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaInfo['elementFormDefault'] = 'qualified'; + } + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + +/** + * Backward compatibility + */ +class soap_server extends nusoap_server { +} + +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class wsdl extends nusoap_base { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + var $curl_options = array(); // User-specified cURL options + var $use_curl = false; // whether to always try to use cURL + // for HTTP authentication + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param array $curl_options user-specified cURL options + * @param boolean $use_curl try to use cURL + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30,$curl_options=null,$use_curl=false){ + parent::nusoap_base(); + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + if (is_array($curl_options)) + $this->curl_options = $curl_options; + $this->use_curl = $use_curl; + $this->fetchWSDL($wsdl); + } + + /** + * fetches the WSDL document and parses it + * + * @access public + */ + function fetchWSDL($wsdl) { + $this->debug("parse and process WSDL path=$wsdl"); + $this->wsdl = $wsdl; + // parse wsdl file + if ($this->wsdl != "") { + $this->parseWSDL($this->wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + // Set operation style if necessary, but do not override one already provided + if (isset($bindingData['style']) && !isset($this->bindings[$binding]['operations'][$operation]['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') { + $this->debug("parse WSDL at path=$wsdl"); + + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl, $this->curl_options, $this->use_curl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if ($this->authtype != '') { + $tr->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'Getting ' . $wsdl . ' - HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (preg_match('/schema$/', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new nusoap_xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (preg_match('/^xmlns/',$k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (preg_match('/:/', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with type) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part (with element) $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element'] . '^'; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*preg_match('/types$/', $name) ||*/ preg_match('/schema$/', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, certpassword (optional), verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $portName WSDL port name + * @param string $bindingType eg: soap, smtp, dime (only soap and soap12 are currently supported) + * @return array + * @access public + */ + function getOperations($portName = '', $bindingType = 'soap') { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } else { + $this->debug("getOperations bindingType $bindingType may not be supported"); + } + $this->debug("getOperations for port '$portName' bindingType $bindingType"); + // loop thru ports + foreach($this->ports as $port => $portData) { + $this->debug("getOperations checking port $port bindingType " . $portData['bindingType']); + if ($portName == '' || $port == $portName) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + $this->debug("getOperations found port $port bindingType $bindingType"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + } + if (count($ops) == 0) { + $this->debug("getOperations found no operations for port '$portName' bindingType $bindingType"); + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation name of operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap, soap12 + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } elseif ($bindingType == 'soap12') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap12/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param string $type the type + * @param string $ns namespace (not prefix) of the type + * @return mixed + * @access public + * @see nusoap_xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (!isset($this->schemas[$ns])) { + foreach ($this->schemas as $ns0 => $schema0) { + if (strcasecmp($ns, $ns0) == 0) { + $this->debug("in getTypeDef: replacing schema namespace $ns with $ns0"); + $ns = $ns0; + break; + } + } + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + $this->debug("in getTypeDef: found type $type"); + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } else { + $this->debug("did not find type for [element] $type"); + } + } + return $t; + } + } + $this->debug("in getTypeDef: did not find type $type"); + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $localPart = $this->getLocalPart($partType); + $typeDef = $this->getTypeDef($localPart, $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + if (substr($localPart, -1) == '^') { + $localPart = substr($localPart, 0, -1); + } + } else { + $elementortype = 'type'; + } + $xml .= "\n" . ' '; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= "\n" . ' '; + $binding_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' ' . htmlspecialchars($opParts['documentation']) . ''; + } + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + $portType_xml .= "\n" . ' '; + } + $portType_xml .= "\n" . ''; + $binding_xml .= "\n" . ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + $xml .= "\n" . ' '; + } + } + $xml .= "\n" . ''; + return $xml . "\n"; + } + + /** + * determine whether a set of parameters are unwrapped + * when they are expect to be wrapped, Microsoft-style. + * + * @param string $type the type (element name) of the wrapper + * @param array $parameters the parameter values for the SOAP call + * @return boolean whether they parameters are unwrapped (and should be wrapped) + * @access private + */ + function parametersMatchWrapped($type, &$parameters) { + $this->debug("in parametersMatchWrapped type=$type, parameters="); + $this->appendDebug($this->varDump($parameters)); + + // split type into namespace:unqualified-type + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in parametersMatchWrapped: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in parametersMatchWrapped: expanded prefixed type: $uqType, $ns"); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in parametersMatchWrapped: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + + // get the type information + if (!$typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("in parametersMatchWrapped: $type ($uqType) is not a supported type."); + return false; + } + $this->debug("in parametersMatchWrapped: found typeDef="); + $this->appendDebug($this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + $phpType = $typeDef['phpType']; + $arrayType = (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : ''); + $this->debug("in parametersMatchWrapped: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: $arrayType"); + + // we expect a complexType or element of complexType + if ($phpType != 'struct') { + $this->debug("in parametersMatchWrapped: not a struct"); + return false; + } + + // see whether the parameter names match the elements + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $elements = 0; + $matches = 0; + foreach ($typeDef['elements'] as $name => $attrs) { + if (isset($parameters[$name])) { + $this->debug("in parametersMatchWrapped: have parameter named $name"); + $matches++; + } else { + $this->debug("in parametersMatchWrapped: do not have parameter named $name"); + } + $elements++; + } + + $this->debug("in parametersMatchWrapped: $matches parameter names match $elements wrapped parameter names"); + if ($matches == 0) { + return false; + } + return true; + } + + // since there are no elements for the type, if the user passed no + // parameters, the parameters match wrapped. + $this->debug("in parametersMatchWrapped: no elements type $ns:$uqType"); + return count($parameters) == 0; + } + + /** + * serialize PHP values according to a WSDL message definition + * contrary to the method name, this is not limited to RPC + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @param string $bindingType (soap|soap12) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters, $bindingType = 'soap') { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion, bindingType=$bindingType"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation, $bindingType)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation . ' bindingType: ' . $bindingType); + return false; + } + $this->debug('in serializeRPCParameters: opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + $parts = &$opData[$direction]['parts']; + $part_count = sizeof($parts); + $style = $opData['style']; + $use = $opData[$direction]['use']; + $this->debug("have $part_count part(s) to serialize using $style/$use"); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $parameter_count = count($parameters); + $this->debug("have $parameter_count parameter(s) provided as $parametersArrayType to serialize"); + // check for Microsoft-style wrapped parameters + if ($style == 'document' && $use == 'literal' && $part_count == 1 && isset($parts['parameters'])) { + $this->debug('check whether the caller has wrapped the parameters'); + if ($direction == 'output' && $parametersArrayType == 'arraySimple' && $parameter_count == 1) { + // TODO: consider checking here for double-wrapping, when + // service function wraps, then NuSOAP wraps again + $this->debug("change simple array to associative with 'parameters' element"); + $parameters['parameters'] = $parameters[0]; + unset($parameters[0]); + } + if (($parametersArrayType == 'arrayStruct' || $parameter_count == 0) && !isset($parameters['parameters'])) { + $this->debug('check whether caller\'s parameters match the wrapped ones'); + if ($this->parametersMatchWrapped($parts['parameters'], $parameters)) { + $this->debug('wrap the parameters for the caller'); + $parameters = array('parameters' => $parameters); + $parameter_count = 1; + } + } + } + foreach ($parts as $name => $type) { + $this->debug("serializing part $name of type $type"); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'Array') { + // JBoss/Axis does this sometimes + return $this->serialize_val($value, $name, false, false, false, false, $use); + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + if (substr($uqType, -1) == '^') { + $uqType = substr($uqType, 0, -1); + } + } + if (!isset($typeDef['phpType'])) { + $this->setError("$type ($uqType) has no phpType."); + $this->debug("in serializeType: $type ($uqType) has no phpType."); + return false; + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs and nillable + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + if (isset($typeDef['simpleContent']) && $typeDef['simpleContent'] == 'true') { + if (isset($value['!'])) { + $xml .= $value['!']; + $this->debug("in serializeType: serialized simpleContent for type $type"); + } else { + $this->debug("in serializeType: no simpleContent to serialize for type $type"); + } + } else { + // complexContent + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $this->debug("serializeComplexTypeAttributes for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize attributes for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeAttributes($typeDefx, $value, $nsx, $uqTypex); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $this->debug("in serializeComplexTypeElements for XML Schema type $ns:$uqType"); + $xml = ''; + if (isset($typeDef['extensionBase'])) { + $nsx = $this->getPrefix($typeDef['extensionBase']); + $uqTypex = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($nsx)) { + $nsx = $this->getNamespaceFromPrefix($nsx); + } + if ($typeDefx = $this->getTypeDef($uqTypex, $nsx)) { + $this->debug("serialize elements for extension base $nsx:$uqTypex"); + $xml .= $this->serializeComplexTypeElements($typeDefx, $value, $nsx, $uqTypex, $use, $encodingStyle); + } else { + $this->debug("extension base $nsx:$uqTypex is not a supported type"); + } + } + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (is_null($v) && isset($attrs['minOccurs']) && $attrs['minOccurs'] == '0') { + // do nothing + } elseif (is_null($v) && isset($attrs['nillable']) && $attrs['nillable'] == 'true') { + // TODO: serialize a nil correctly, but for now serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } elseif (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string $name + * @param string $typeClass (complexType|simpleType|attribute) + * @param string $phpType currently supported are array and struct (php assoc array) + * @param string $compositor (all|sequence|choice) + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array $elements e.g. array ( name => array(name=>'',type=>'') ) + * @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string $arrayType as namespace:name (xsd:string) + * @see nusoap_xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + $eElements = array(); + foreach($elements as $n => $e){ + // expand each element + $ee = array(); + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see nusoap_xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see nusoap_xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name . '^'); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t, 'form' => 'unqualified'); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType', 'form' => 'qualified')); + $out = array('parameters' => 'tns:' . $name . 'Response' . '^'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} +?> +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_parser extends nusoap_base { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; // parsed SOAP Body + var $soapheader = NULL; // parsed SOAP Header + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function nusoap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering nusoap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('in nusoap_parser ctor, message:'); + $this->appendDebug($this->varDump($this->message)); + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value + if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ + $this->soapheader = $this->message[$this->root_header]['result']; + } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if ($name == 'Envelope' && $this->status == '') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'envelope') { + $this->root_header = $pos; + $this->status = 'header'; + } elseif ($name == 'Body' && $this->status == 'envelope'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)) { + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(preg_match('/^http:\/\/www.w3.org\/[0-9]{4}\/XMLSchema$/',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + if (isset($this->message[$pos]['type']) && $this->message[$pos]['type'] == 'array') { + // do nothing: already processed arrayType + } else { + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '/([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]/'; + if(preg_match($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= ""; + } + } elseif($pos >= $this->root_struct){ + $this->document .= ""; + } + // switch status + if ($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif ($pos == $this->root_header) { + $this->status = 'envelope'; + } elseif ($name == 'Body' && $this->status == 'body') { + $this->status = 'envelope'; + } elseif ($name == 'Header' && $this->status == 'header') { // will never happen + $this->status = 'envelope'; + } elseif ($name == 'Envelope' && $this->status == 'envelope') { + $this->status = ''; + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message (SOAP Body) + * + * @return mixed + * @access public + * @deprecated use get_soapbody instead + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Body (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapbody(){ + return $this->soapresponse; + } + + /** + * get the parsed SOAP Header (NULL if there was none) + * + * @return mixed + * @access public + */ + function get_soapheader(){ + return $this->soapheader; + } + + /** + * get the unparsed SOAP Header + * + * @return string XML or empty if no Header + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector or generic compound type '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + $ret = is_array($params) ? $params : array(); + $this->debug('in buildVal, return:'); + $this->appendDebug($this->varDump($ret)); + return $ret; + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + $ret = $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $ret = $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + $this->debug("in buildVal, return: $ret"); + return $ret; + } + $ret = $this->message[$pos]['cdata']; + $this->debug("in buildVal, return: $ret"); + return $ret; + } + } +} + +/** + * Backward compatibility + */ +class soap_parser extends nusoap_parser { +} + +?>call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @author Scott Nichol +* @version $Id: nusoap.php 7091 2011-06-16 11:34:02Z mMarinetti $ +* @access public +*/ +class nusoap_client extends nusoap_base { + + var $username = ''; // Username for HTTP authentication + var $password = ''; // Password for HTTP authentication + var $authtype = ''; // Type of HTTP authentication + var $certRequest = array(); // Certificate for HTTP SSL authentication + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $responseHeader = NULL; // SOAP Header from response (parsed) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $portName = ''; // port name to use in WSDL + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + var $curl_options = array(); // User-specified cURL options + var $bindingType = ''; // WSDL operation binding type + var $use_curl = false; // whether to always try to use cURL + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param mixed $wsdl optional, set to 'wsdl' or true if using WSDL + * @param string $proxyhost optional + * @param string $proxyport optional + * @param string $proxyusername optional + * @param string $proxypassword optional + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @param string $portName optional portName in WSDL document + * @access public + */ + function nusoap_client($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30, $portName = ''){ + parent::nusoap_base(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + $this->portName = $portName; + + $this->debug("ctor wsdl=$wsdl timeout=$timeout response_timeout=$response_timeout"); + $this->appendDebug('endpoint=' . $this->varDump($endpoint)); + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + $this->checkWSDL(); + } else { + $this->wsdlFile = $this->endpoint; + $this->wsdl = null; + $this->debug('will use lazy evaluation of wsdl from ' . $this->endpoint); + } + $this->endpointType = 'wsdl'; + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $operation SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers, or associative array + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call, normally an associative array mirroring the structure of the XML response, false for certain fatal errors + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params,$this->bindingType); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError('operation '.$operation.' not present in WSDL.'); + $this->debug("operation '$operation' not present in WSDL."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + // http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html R2735 says rpc/literal accessor elements should not be in a namespace + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * check WSDL passed as an instance or pulled from an endpoint + * + * @access private + */ + function checkWSDL() { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('checkWSDL'); + // catch errors + if ($errstr = $this->wsdl->getError()) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + } elseif ($this->operations = $this->wsdl->getOperations($this->portName, 'soap12')) { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->bindingType = 'soap12'; + $this->debug('got '.count($this->operations).' operations from wsdl '.$this->wsdlFile.' for binding type '.$this->bindingType); + $this->debug('**************** WARNING: SOAP 1.2 BINDING *****************'); + } else { + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->debug('getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } + + /** + * instantiate wsdl object and parse wsdl file + * + * @access public + */ + function loadWSDL() { + $this->debug('instantiating wsdl class with doc: '.$this->wsdlFile); + $this->wsdl = new wsdl('',$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout,$this->curl_options,$this->use_curl); + $this->wsdl->setCredentials($this->username, $this->password, $this->authtype, $this->certRequest); + $this->wsdl->fetchWSDL($this->wsdlFile); + $this->checkWSDL(); + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) + return false; + } + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case preg_match('/^http/',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint, $this->curl_options, $this->use_curl); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(preg_match('/^http:/',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(preg_match('/^https/',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' headers:'); + $this->appendDebug($this->varDump($headers)); + if (!isset($headers['content-type'])) { + $this->setError('Response not of type text/xml (no content-type header)'); + return false; + } + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml: ' . $headers['content-type']); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/^(ISO-8859-1|US-ASCII|UTF-8)$/i',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating nusoap_parser'); + $parser = new nusoap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get SOAP headers + $this->responseHeader = $parser->get_soapheader(); + // get decoded message + $return = $parser->get_soapbody(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets user-specified cURL options + * + * @param mixed $option The cURL option (always integer?) + * @param mixed $value The cURL option value + * @access public + */ + function setCurlOption($option, $value) { + $this->debug("setCurlOption option=$option, value="); + $this->appendDebug($this->varDump($value)); + $this->curl_options[$option] = $value; + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param string $endpoint The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->debug("setEndpoint(\"$endpoint\")"); + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param mixed $headers String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->debug("setHeaders headers="); + $this->appendDebug($this->varDump($headers)); + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * get the SOAP response Header (parsed) + * + * @return mixed + * @access public + */ + function getHeader(){ + return $this->responseHeader; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate|ntlm) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->debug("setCredentials username=$username authtype=$authtype certRequest="); + $this->appendDebug($this->varDump($certRequest)); + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc HTTP encoding + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->debug("setHTTPEncoding(\"$enc\")"); + $this->http_encoding = $enc; + } + + /** + * Set whether to try to use cURL connections if possible + * + * @param boolean $use Whether to try to use cURL + * @access public + */ + function setUseCURL($use) { + $this->debug("setUseCURL($use)"); + $this->use_curl = $use; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->debug("useHTTPPersistentConnection"); + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy() { + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"); + if ($this->getError()) { + $this->debug("Error from _getProxyClassCode, so return NULL"); + return null; + } + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new nusoap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->certRequest = $this->certRequest; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->http_encoding = $this->http_encoding; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->persistentConnection = &$this->persistentConnection; + $proxy->decode_utf8 = $this->decode_utf8; + $proxy->curl_options = $this->curl_options; + $proxy->bindingType = $this->bindingType; + $proxy->use_curl = $this->use_curl; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + $this->debug("in getProxy endpointType=$this->endpointType"); + $this->appendDebug("wsdl=" . $this->varDump($this->wsdl)); + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + $evalStr = "echo \"$evalStr\";"; + return $evalStr; + } + if ($this->endpointType == 'wsdl' && is_null($this->wsdl)) { + $this->loadWSDL(); + if ($this->getError()) { + return "echo \"" . $this->getError() . "\";"; + } + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class nusoap_proxy_'.$r.' extends nusoap_client { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return boolean if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return boolean always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return boolean always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} + +if (!extension_loaded('soap')) { + /** + * For backwards compatiblity, define soapclient unless the PHP SOAP extension is loaded. + */ + class soapclient extends nusoap_client { + } +} +?> diff --git a/modules/mondialrelay/lib/nusoap/nusoapmime.php b/modules/mondialrelay/lib/nusoap/nusoapmime.php new file mode 100755 index 000000000..12534e6d8 --- /dev/null +++ b/modules/mondialrelay/lib/nusoap/nusoapmime.php @@ -0,0 +1,501 @@ + +* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list +* @version $Id: nusoapmime.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_client_mime extends nusoap_client { + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $requestAttachments = array(); + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $responseAttachments; + /** + * @var string + * @access private + */ + var $mimeContentType; + + /** + * adds a MIME attachment to the current request. + * + * If the $data parameter contains an empty string, this method will read + * the contents of the file named by the $filename parameter. + * + * If the $cid parameter is false, this method will generate the cid. + * + * @param string $data The data of the attachment + * @param string $filename The filename of the attachment (default is empty string) + * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) + * @param string $cid The content-id (cid) of the attachment (default is false) + * @return string The content-id (cid) of the attachment + * @access public + */ + function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { + if (! $cid) { + $cid = md5(uniqid(time())); + } + + $info['data'] = $data; + $info['filename'] = $filename; + $info['contenttype'] = $contenttype; + $info['cid'] = $cid; + + $this->requestAttachments[] = $info; + + return $cid; + } + + /** + * clears the MIME attachments for the current request. + * + * @access public + */ + function clearAttachments() { + $this->requestAttachments = array(); + } + + /** + * gets the MIME attachments from the current response. + * + * Each array element in the return is an associative array with keys + * data, filename, contenttype, cid. These keys correspond to the parameters + * for addAttachment. + * + * @return array The attachments. + * @access public + */ + function getAttachments() { + return $this->responseAttachments; + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + if (count($this->requestAttachments) > 0) { + $params['content_type'] = 'multipart/related; type="text/xml"'; + $mimeMessage = new Mail_mimePart('', $params); + unset($params); + + $params['content_type'] = 'text/xml'; + $params['encoding'] = '8bit'; + $params['charset'] = $this->soap_defencoding; + $mimeMessage->addSubpart($soapmsg, $params); + + foreach ($this->requestAttachments as $att) { + unset($params); + + $params['content_type'] = $att['contenttype']; + $params['encoding'] = 'base64'; + $params['disposition'] = 'attachment'; + $params['dfilename'] = $att['filename']; + $params['cid'] = $att['cid']; + + if ($att['data'] == '' && $att['filename'] <> '') { + if ($fd = fopen($att['filename'], 'rb')) { + $data = fread($fd, filesize($att['filename'])); + fclose($fd); + } else { + $data = ''; + } + $mimeMessage->addSubpart($data, $params); + } else { + $mimeMessage->addSubpart($att['data'], $params); + } + } + + $output = $mimeMessage->encode(); + $mimeHeaders = $output['headers']; + + foreach ($mimeHeaders as $k => $v) { + $this->debug("MIME header $k: $v"); + if (strtolower($k) == 'content-type') { + // PHP header() seems to strip leading whitespace starting + // the second line, so force everything to one line + $this->mimeContentType = str_replace("\r\n", " ", $v); + } + } + + return $output['body']; + } + + return parent::getHTTPBody($soapmsg); + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + if (count($this->requestAttachments) > 0) { + return $this->mimeContentType; + } + return parent::getHTTPContentType(); + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + if (count($this->requestAttachments) > 0) { + return false; + } + return parent::getHTTPContentTypeCharset(); + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); + $this->responseAttachments = array(); + if (strstr($headers['content-type'], 'multipart/related')) { + $this->debug('Decode multipart/related'); + $input = ''; + foreach ($headers as $k => $v) { + $input .= "$k: $v\r\n"; + } + $params['input'] = $input . "\r\n" . $data; + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + $structure = Mail_mimeDecode::decode($params); + + foreach ($structure->parts as $part) { + if (!isset($part->disposition) && (strstr($part->headers['content-type'], 'text/xml'))) { + $this->debug('Have root part of type ' . $part->headers['content-type']); + $root = $part->body; + $return = parent::parseResponse($part->headers, $part->body); + } else { + $this->debug('Have an attachment of type ' . $part->headers['content-type']); + $info['data'] = $part->body; + $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; + $info['contenttype'] = $part->headers['content-type']; + $info['cid'] = $part->headers['content-id']; + $this->responseAttachments[] = $info; + } + } + + if (isset($return)) { + $this->responseData = $root; + return $return; + } + + $this->setError('No root part found in multipart/related content'); + return ''; + } + $this->debug('Not multipart/related'); + return parent::parseResponse($headers, $data); + } +} + +/* + * For backwards compatiblity, define soapclientmime unless the PHP SOAP extension is loaded. + */ +if (!extension_loaded('soap')) { + class soapclientmime extends nusoap_client_mime { + } +} + +/** +* nusoap_server_mime server supporting MIME attachments defined at +* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library. +* +* @author Scott Nichol +* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list +* @version $Id: nusoapmime.php 6844 2011-06-03 14:46:51Z dMetzger $ +* @access public +*/ +class nusoap_server_mime extends nusoap_server { + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $requestAttachments = array(); + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $responseAttachments; + /** + * @var string + * @access private + */ + var $mimeContentType; + + /** + * adds a MIME attachment to the current response. + * + * If the $data parameter contains an empty string, this method will read + * the contents of the file named by the $filename parameter. + * + * If the $cid parameter is false, this method will generate the cid. + * + * @param string $data The data of the attachment + * @param string $filename The filename of the attachment (default is empty string) + * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) + * @param string $cid The content-id (cid) of the attachment (default is false) + * @return string The content-id (cid) of the attachment + * @access public + */ + function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { + if (! $cid) { + $cid = md5(uniqid(time())); + } + + $info['data'] = $data; + $info['filename'] = $filename; + $info['contenttype'] = $contenttype; + $info['cid'] = $cid; + + $this->responseAttachments[] = $info; + + return $cid; + } + + /** + * clears the MIME attachments for the current response. + * + * @access public + */ + function clearAttachments() { + $this->responseAttachments = array(); + } + + /** + * gets the MIME attachments from the current request. + * + * Each array element in the return is an associative array with keys + * data, filename, contenttype, cid. These keys correspond to the parameters + * for addAttachment. + * + * @return array The attachments. + * @access public + */ + function getAttachments() { + return $this->requestAttachments; + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + if (count($this->responseAttachments) > 0) { + $params['content_type'] = 'multipart/related; type="text/xml"'; + $mimeMessage = new Mail_mimePart('', $params); + unset($params); + + $params['content_type'] = 'text/xml'; + $params['encoding'] = '8bit'; + $params['charset'] = $this->soap_defencoding; + $mimeMessage->addSubpart($soapmsg, $params); + + foreach ($this->responseAttachments as $att) { + unset($params); + + $params['content_type'] = $att['contenttype']; + $params['encoding'] = 'base64'; + $params['disposition'] = 'attachment'; + $params['dfilename'] = $att['filename']; + $params['cid'] = $att['cid']; + + if ($att['data'] == '' && $att['filename'] <> '') { + if ($fd = fopen($att['filename'], 'rb')) { + $data = fread($fd, filesize($att['filename'])); + fclose($fd); + } else { + $data = ''; + } + $mimeMessage->addSubpart($data, $params); + } else { + $mimeMessage->addSubpart($att['data'], $params); + } + } + + $output = $mimeMessage->encode(); + $mimeHeaders = $output['headers']; + + foreach ($mimeHeaders as $k => $v) { + $this->debug("MIME header $k: $v"); + if (strtolower($k) == 'content-type') { + // PHP header() seems to strip leading whitespace starting + // the second line, so force everything to one line + $this->mimeContentType = str_replace("\r\n", " ", $v); + } + } + + return $output['body']; + } + + return parent::getHTTPBody($soapmsg); + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + if (count($this->responseAttachments) > 0) { + return $this->mimeContentType; + } + return parent::getHTTPContentType(); + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + if (count($this->responseAttachments) > 0) { + return false; + } + return parent::getHTTPContentTypeCharset(); + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); + $this->requestAttachments = array(); + if (strstr($headers['content-type'], 'multipart/related')) { + $this->debug('Decode multipart/related'); + $input = ''; + foreach ($headers as $k => $v) { + $input .= "$k: $v\r\n"; + } + $params['input'] = $input . "\r\n" . $data; + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + $structure = Mail_mimeDecode::decode($params); + + foreach ($structure->parts as $part) { + if (!isset($part->disposition) && (strstr($part->headers['content-type'], 'text/xml'))) { + $this->debug('Have root part of type ' . $part->headers['content-type']); + $return = parent::parseRequest($part->headers, $part->body); + } else { + $this->debug('Have an attachment of type ' . $part->headers['content-type']); + $info['data'] = $part->body; + $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; + $info['contenttype'] = $part->headers['content-type']; + $info['cid'] = $part->headers['content-id']; + $this->requestAttachments[] = $info; + } + } + + if (isset($return)) { + return $return; + } + + $this->setError('No root part found in multipart/related content'); + return; + } + $this->debug('Not multipart/related'); + return parent::parseRequest($headers, $data); + } +} + +/* + * For backwards compatiblity + */ +class nusoapservermime extends nusoap_server_mime { +} + +?> diff --git a/modules/mondialrelay/logo.gif b/modules/mondialrelay/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..06f847112cfcc82141bafe2d7370007594d1eeba GIT binary patch literal 1035 zcmZ?wbhEHb6krfwc;3RWiNSX>gWqNb|4j@*n;8POFa&R92-?CBx)sC-*$QHWZDR=C z1|q|^gHXga#)$2V;oBJ_wlPI)XNuU$9KM|;avN*J4%VoxY>_)SqPKBJ@8F5u$rHPa zFJUKt{7(LaodOBFKqzsiP~tA(#GN8ZyF`O&4S$DA9EIX512Z94AJeB7($q<`n(u$EJyJ*UEYPDb{g zitIZR*?%;q^IXitvvHHo#ZNw()_XF2%7xTv7qezv$eDF1XU>KE*%u1uTq>M*qGH4<@M%Or@IzjZ(Dt*chmVv%WwB>x;J6Vo$1>j z&fR-{)uv|~PrcZ7?!~TiuMS*(e)!Uxqu1UZz47+U?GI<~y}Nk-%cGay-+cJ_?(^@@ z-~ayp^Y8E9|D%BJA)xqA(77lzu_QG`p**uBL&4qCH-JHh0SG`Dgn{EW1N+O&#jGcJ zh52MEIvi6@Nm@1D)5(}{;b5zQwU$-Jh6nB(?7~id0*36|Ol(T(0X{1)aY$nf3>?GP8*|MC2|=SnR>( zvuR4lp+)Rdgx!~15ojuEV&<{Xc@og*bhuI6$l^xC%?F$^`ju-M3=5W?pJbcGwZr$o z(N+l)$9+5xnwN7(ODI~KJaAm(Dy|T^Oe50p$Z_`VnIZveemEo_Vl!d6DtXz(y^B{= RDMi9i`J|X-0}~U2H2_yJqE7$- literal 0 HcmV?d00001 diff --git a/modules/mondialrelay/mondialrelay.js b/modules/mondialrelay/mondialrelay.js new file mode 100755 index 000000000..d25f3cbb5 --- /dev/null +++ b/modules/mondialrelay/mondialrelay.js @@ -0,0 +1,273 @@ +var toggle_status_order_list = false; +var toggle_history_order_list = false; + +function toggleOrderListSelection() +{ + toggle_status_order_list = !toggle_status_order_list; + + $('input[name="order_id_list[]"]').attr('checked', toggle_status_order_list); +} + +function toggleHistoryListSelection() +{ + toggle_history_order_list = !toggle_history_order_list; + + $('input[name="history_id_list[]"]').attr('checked', toggle_history_order_list); +} + +function getTickets(detailedExpeditionList) +{ + $.ajax( + { + type : 'POST', + url : _PS_MR_MODULE_DIR_ + 'ajax.php', + data : {'detailedExpeditionList':detailedExpeditionList, + 'method' : 'MRGetTickets'}, + dataType: 'json', + success: function(json) + { + if (json && json.success) + for (id_order in json.success) + if (json.success[id_order]) + { + $('#URLA4_' + id_order).html('\ + download pdf'); + $('#URLA5_' + id_order).html('\ + download pdf'); + $('#expeditionNumber_' + id_order).html(json.success[id_order].expeditionNumber); + $('#detailHistory_' + id_order).children('td').children('input').attr('value', json.success[id_order].id_mr_history); + $('#detailHistory_' + id_order).children('td').children('input').attr('id', 'PS_MRHistoryId_' + json.success[id_order].id_mr_history); + } + displayBackGenerateSubmitButton(); + displayBackHistoriesSubmitButton(); + }, + error: function(xhr, ajaxOptions, thrownError) + { + //console.log(thrownError); + displayBackGenerateSubmitButton(); + } + }); +} + +function checkErrorGenetateTickets(json) +{ + i = 0; + $('.PS_MRErrorList').fadeOut('fast', function() + { + if ((++i >= $('.PS_MRErrorList').length) && json && json.error) + for (id_order in json.error) + if (json.error[id_order] && json.error[id_order].length) + { + $('#errorCreatingTicket_' + id_order).children('td').children('span').html(''); + $('#errorCreatingTicket_' + id_order).fadeOut('slow'); + $('#errorCreatingTicket_' + id_order).fadeIn('slow'); + for (numError in json.error[id_order]) + $('#errorCreatingTicket_' + id_order).children('td').children('span').append(json.error[id_order][numError] + '
    '); + } + }); + checkOtherErrors(json); +} + +function checkOtherErrors(json) +{ + $('#otherErrors').fadeOut('fast', function() + { + + if (json && json.other && json.other.error) + for (numError in json.other.error) + if (json.other.error[numError]) + { + $('#otherErrors').fadeIn('slow'); + $('#otherErrors').children('span').html(''); + $('#otherErrors').children('span').append(json.other.error[numError]); + } + }); +} + +function checkSucceedGenerateTickets(json) +{ + detailedExpeditionList = new Array(); + + i = 0; + $('.PS_MRSuccessList').fadeOut('fast', function() + { + if ((++i >= $('.PS_MRSuccessList').length) && json && json.success) + { + for (id_order in json.success) + if (json.success[id_order] && json.success[id_order].expeditionNumber) + { + $('#successCreatingTicket_' + id_order).children('td').children('span').html(''); + $('#PS_MRLineOrderInformation-' + id_order).remove(); + $('#successCreatingTicket_' + id_order).fadeIn('slow'); + detailedExpeditionList.push({'id_order':id_order, 'expeditionNumber':json.success[id_order].expeditionNumber}); + + if (!$('#detailHistory_' + id_order).length) + $('#PS_MRHistoriqueTableList').append('\ + \ + \ + ' + id_order + '\ + \ + \ + \ + '); + else + { + $('#detailHistory_' + id_order).children('#URLA4_' + id_order).html(''); + $('#detailHistory_' + id_order).children('#URLA5_' + id_order).html(''); + $('#detailHistory_' + id_order).children('#expeditionNumber_' + id_order).html(''); + } + } + } + }); + return detailedExpeditionList; +} + +function displayBackGenerateSubmitButton() +{ + $('#PS_MRSubmitGenerateLoader').css('display', 'none'); + if ($('.order_id_list').length) + $('#PS_MRSubmitButtonGenerateTicket').fadeIn('slow'); +} + +function displayBackHistoriesSubmitButton() +{ + $('#PS_MRSubmitDeleteHistoriesLoader').css('display', 'none'); + if ($('.history_id_list').length) + $('#PS_MRSubmitButtonDeleteHistories').fadeIn('slow'); +} + +function generateTicketsAjax() +{ + var order_id_list = new Array(); + var weight_list = new Array(); + + $('#PS_MRSubmitButtonGenerateTicket').css('display', 'none'); + $('#PS_MRSubmitGenerateLoader').fadeIn('slow'); + + numSelected = $('input[name="order_id_list[]"]:checked').length; + $('input[name="order_id_list[]"]:checked').each(function() + { + order_id_list.push($(this).val()); + weight_list.push(($('#weight_' + $(this).val()).val()) + '-' + $(this).val()); + }); + + $.ajax( + { + type : 'POST', + url : _PS_MR_MODULE_DIR_ + 'ajax.php', + data : {'order_id_list' : order_id_list, + 'numSelected' : numSelected, + 'weight_list' : weight_list, + 'method' : 'MRCreateTickets'}, + dataType: 'json', + success: function(json) + { + detailedExpeditionList = new Array(); + + checkErrorGenetateTickets(json); + detailedExpeditionList = checkSucceedGenerateTickets(json); + + if (detailedExpeditionList.length) + getTickets(detailedExpeditionList); + else + displayBackGenerateSubmitButton(); + }, + error: function(xhr, ajaxOptions, thrownError) + { + display_generate_button = true; + displayBackGenerateSubmitButton(); + } + }); + delete(order_id_list); + delete(weight_list); +} + +function displayDeletedHistoryInformation() +{ + :x + + + $('input[name="history_id_list[]"]:checked').each(function() + { + $(this).parent().parent().css('background-color', '#FFE2E3'); + }); + displayBackHistoriesSubmitButton(); +} + +function checkDeletedHistoriesId(json) +{ + if (json && json.success) + { + // Allow to wait the end of the loop to manage unremoved item + i = 0; + for (numberHistoryId in json.success.deletedListId) + { + $('#PS_MRHistoryId_' + json.success.deletedListId[numberHistoryId]).parent().parent().fadeOut('fast', function() + { + $(this).remove(); + // Fadeout is asynchome verify everytime the number element + if (++i == json.success.deletedListId.length) + displayDeletedHistoryInformation(json.success.deletedListId.length); + }); + } + // Use if none element exist in the list + if (i == json.success.deletedListId.length) + displayDeletedHistoryInformation(); + } + else + displayBackHistoriesSubmitButton(); +} + +function deleteSelectedHistories() +{ + var history_id_list = new Array(); + + $('#PS_MRSubmitButtonDeleteHistories').css('display', 'none'); + $('#PS_MRSubmitDeleteHistoriesLoader').fadeIn('slow'); + + numSelected = $('input[name="order_id_list[]"]:checked').length; + $('input[name="history_id_list[]"]:checked').each(function() + { + history_id_list.push($(this).val()); + }); + + $.ajax( + { + type : 'POST', + url : _PS_MR_MODULE_DIR_ + 'ajax.php', + data : {'history_id_list' : history_id_list, + 'numSelected' : numSelected, + 'method' : 'DeleteHistory'}, + dataType: 'json', + success: function(json) + { + checkOtherErrors(json); + checkDeletedHistoriesId(json); + }, + error: function(xhr, ajaxOptions, thrownError) + { + display_generate_button = true; + displayBackHistoriesSubmitButton(); + } + }); +} + +$(document).ready(function() +{ + $('#toggleStatusOrderList').click(function() + { + toggleOrderListSelection(); + }); + $('#toggleStatusHistoryList').click(function() + { + toggleHistoryListSelection(); + }); + $('#generate').click(function() + { + generateTicketsAjax(); + }); + $('#PS_MRSubmitButtonDeleteHistories').click(function() + { + deleteSelectedHistories(); + }); +}); diff --git a/modules/mondialrelay/mondialrelay.php b/modules/mondialrelay/mondialrelay.php new file mode 100755 index 000000000..665347e80 --- /dev/null +++ b/modules/mondialrelay/mondialrelay.php @@ -0,0 +1,1189 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +require_once(_PS_MODULE_DIR_.'mondialrelay/classes/MondialRelayClass.php'); + +class MondialRelay extends Module +{ + const INSTALL_SQL_FILE = 'mrInstall.sql'; + + private $_postErrors; + + static public $modulePath = ''; + static public $moduleURL = ''; + + // Added for 1.3 compatibility + const ONLY_PRODUCTS = 1; + const ONLY_DISCOUNTS = 2; + const BOTH = 3; + const BOTH_WITHOUT_SHIPPING = 4; + const ONLY_SHIPPING = 5; + const ONLY_WRAPPING = 6; + const ONLY_PRODUCTS_WITHOUT_SHIPPING = 7; + + public function __construct() + { + $this->name = 'mondialrelay'; + $this->tab = 'shipping_logistics'; + $this->version = '1.6'; + + parent::__construct(); + + $this->page = basename(__FILE__, '.php'); + $this->displayName = $this->l('Mondial Relay'); + $this->description = $this->l('Deliver in Relay points'); + + self::initModuleAccess(); + + // Call everytime if the merchant make a replace file update + $this->_updateProcess(); + } + + public function install() + { + global $cookie; + + $name = "shipping"; + $title = "Mondial Relay API"; + + if (!parent::install()) + return false; + + Db::getInstance()->ExecuteS( + 'SELECT `name` + FROM `' . _DB_PREFIX_ . 'hook` + WHERE `name` = \''.$name.'\' + AND `title` = \''.$title.'\''); + + if (!Db::getInstance()->NumRows()) + Db::getInstance()->Execute('INSERT INTO ' . _DB_PREFIX_ . 'hook + (name, title, description, position) + VALUES(\''.$name.'\', \''.$title.'\', NULL, 0)'); + + if (!$this->registerHookByVersion()) + return false; + + if ((!file_exists(self::$modulePath.self::INSTALL_SQL_FILE)) || + (!$sql = file_get_contents(self::$modulePath.self::INSTALL_SQL_FILE))) + return false; + + $sql = str_replace('PREFIX_', _DB_PREFIX_, $sql); + $sql = preg_split("/;\s*[\r\n]+/", $sql); + foreach($sql AS $k => $query) + if (!empty($query)) + Db::getInstance()->Execute(trim($query)); + + $result = Db::getInstance()->getRow(' + SELECT id_tab + FROM `' . _DB_PREFIX_ . 'tab` + WHERE class_name="AdminMondialRelay"'); + + if (!$result) + { + /*tab install */ + + $result = Db::getInstance()->getRow(' + SELECT position + FROM `' . _DB_PREFIX_ . 'tab` + WHERE `id_parent` = 3 + ORDER BY `'. _DB_PREFIX_ .'tab`.`position` DESC'); + + $pos = (isset($result['position'])) ? $result['position'] + 1 : 0; + + Db::getInstance()->Execute(' + INSERT INTO ' . _DB_PREFIX_ . 'tab + (id_parent, class_name, position, module) + VALUES(3, "AdminMondialRelay", "'.(int)($pos).'", "mondialrelay")'); + + $id_tab = Db::getInstance()->Insert_ID(); + + $languages = Language::getLanguages(); + foreach ($languages as $language) + Db::getInstance()->Execute(' + INSERT INTO ' . _DB_PREFIX_ . 'tab_lang + (id_lang, id_tab, name) + VALUES("'.(int)($language['id_lang']).'", "'.(int)($id_tab).'", "Mondial Relay")'); + + $profiles = Profile::getProfiles(Configuration::get('PS_LANG_DEFAULT')); + foreach ($profiles as $profile) + Db::getInstance()->Execute(' + INSERT INTO ' . _DB_PREFIX_ . 'access + (`id_profile`,`id_tab`,`view`,`add`,`edit`,`delete`) + VALUES('.$profile['id_profile'].', '.(int)($id_tab).', 1, 1, 1, 1)'); + + @copy(_PS_MODULE_DIR_.'mondialrelay/AdminMondialRelay.gif', _PS_IMG_DIR_.'t/AdminMondialRelay.gif'); + } + + Configuration::updateValue('MONDIAL_RELAY_1_4', '1'); + Configuration::updateValue('MONDIAL_RELAY_INSTALL_UPDATE_1', 1); + Configuration::updateValue('MONDIAL_RELAY_ORDER_STATE', 3); + Configuration::updateValue('MONDIAL_RELAY_SECURE_KEY', md5(time().rand(0,10))); + Configuration::updateValue('MR_GOOGLE_MAP', '1'); + Configuration::updateValue('MR_ENSEIGNE_WEBSERVICE', ''); + Configuration::updateValue('MR_CODE_MARQUE', ''); + Configuration::updateValue('MR_KEY_WEBSERVICE', ''); + Configuration::updateValue('MR_LANGUAGE', ''); + Configuration::updateValue('MR_WEIGHT_COEF', ''); + Configuration::updateValue('PS_MR_SHOP_NAME', Configuration::get('PS_SHOP_NAME')); + return true; + } + + /* + ** Register hook depending of the Prestashop version used + */ + private function registerHookByVersion() + { + if (_PS_VERSION_ >= '1.3' && + (!$this->registerHook('shipping') || + !$this->registerHook('extraCarrier') || + !$this->registerHook('updateCarrier') || + !$this->registerHook('newOrder') || + !$this->registerHook('BackOfficeHeader'))) + return false; + + if (_PS_VERSION_ >= '1.4' && + (!$this->registerHook('processCarrier') || + !$this->registerHook('orderDetail') || + !$this->registerHook('orderDetailDisplayed'))) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall()) + return false; + + /* Tab uninstallation */ + $result = Db::getInstance()->getRow(' + SELECT id_tab + FROM `' . _DB_PREFIX_ . 'tab` + WHERE class_name="AdminMondialRelay"'); + if ($result) + { + $id_tab = $result['id_tab']; + if (isset($id_tab) && !empty($id_tab)) + { + Db::getInstance()->Execute('DELETE FROM ' . _DB_PREFIX_ . 'tab WHERE id_tab = '.(int)($id_tab)); + Db::getInstance()->Execute('DELETE FROM ' . _DB_PREFIX_ . 'tab_lang WHERE id_tab = '.(int)($id_tab)); + Db::getInstance()->Execute('DELETE FROM ' . _DB_PREFIX_ . 'access WHERE id_tab = '.(int)($id_tab)); + } + } + + if (!Configuration::deleteByName('MONDIAL_RELAY_1_4') || + !Configuration::deleteByName('MONDIAL_RELAY_INSTALL_UPDATE') || + !Configuration::deleteByName('MONDIAL_RELAY_SECURE_KEY') || + !Configuration::deleteByName('MONDIAL_RELAY_ORDER_STATE') || + !Configuration::deleteByName('MR_GOOGLE_MAP') || + !Configuration::deleteByName('MR_ENSEIGNE_WEBSERVICE') || + !Configuration::deleteByName('MR_CODE_MARQUE') || + !Configuration::deleteByName('MR_KEY_WEBSERVICE') || + !Configuration::deleteByName('MR_WEIGHT_COEF') || + !Configuration::deleteByName('PS_MR_SHOP_NAME') || + !Db::getInstance()->Execute(' + DROP TABLE '._DB_PREFIX_ .'mr_historique, + '._DB_PREFIX_ .'mr_method, + '._DB_PREFIX_ .'mr_selected')) + return false; + + if (_PS_VERSION_ >= '1.4' && + !Db::getInstance()->Execute(' + UPDATE '._DB_PREFIX_ .'carrier + SET `active` = 0, `deleted` = 1 + WHERE `external_module_name` = "mondialrelay"')) + return false; + else if (!Db::getInstance()->Execute(' + UPDATE '._DB_PREFIX_ .'carrier + SET `active` = 0, `deleted` = 1 + WHERE `name` = "mondialrelay"')) + return false; + + return true; + } + + private function _updateProcess() + { + $this->_update_v1_4(); + $this->_update_v1_4_2(); + } + + private function _update_v1_4() + { + if (Module::isInstalled('mondialrelay') && + !Configuration::get('MONDIAL_RELAY_1_4')) + { + Configuration::updateValue('MONDIAL_RELAY_1_4', 1); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'carrier` + SET + `shipping_external` = 0, + `need_range` = 1, + `external_module_name` = + "mondialrelay", + `shipping_method` = 1 + WHERE `id_carrier` + IN (SELECT `id_mr_method` + FROM `'._DB_PREFIX_.'mr_method`)'); + return true; + } + return false; + } + + private function _update_v1_4_2() + { + if (!$this->isRegisteredInHook('newOrder')) + $this->registerHook('newOrder'); + if (!$this->isRegisteredInHook('BackOfficeHeader')) + $this->registerHook('BackOfficeHeader'); + } + + /* + ** Init the access directory module for URL and file system + ** Allow a compatibility for Presta < 1.4 + */ + static public function initModuleAccess() + { + self::$modulePath = _PS_MODULE_DIR_. 'mondialrelay/'; + + $protocol = (Configuration::get('PS_SSL_ENABLED') || (!empty($_SERVER['HTTPS']) + && strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://'; + + $endURL = __PS_BASE_URI__.'/modules/mondialrelay/'; + + if (method_exists('Tools', 'getShopDomainSsl')) + self::$moduleURL = $protocol.Tools::getShopDomainSsl().$endURL; + else + self::$moduleURL = $protocol.$_SERVER['HTTP_HOST'].$endURL; + } + + /* + ** Override a jQuery version included by another one us. + ** Allow a compatibility for Presta < 1.4 + */ + static public function getJqueryCompatibility() + { + return ' + + '; + } + + public function hookNewOrder($params) + { + DB::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'mr_selected` + SET `id_order` = '.(int)$params['order']->id.' + WHERE `id_cart` = '.(int)$params['cart']->id); + } + + public function hookBackOfficeHeader() + { + $cssFilePath = $this->_path.'style.css'; + $jsFilePath= $this->_path.'mondialrelay.js'; + $mrtoken = sha1('mr'._COOKIE_KEY_.'mrAgain'); + + return ' + + + '; + } + + private function _postValidation() + { + if (Tools::isSubmit('submitMR')) + { + if (Tools::getValue('mr_Enseigne_WebService') != '' AND !preg_match("#^[0-9A-Z]{2}[0-9A-Z ]{6}$#", Tools::getValue('mr_Enseigne_WebService'))) + $this->_postErrors[] = $this->l('Invalid Shop'); + if (Tools::getValue('mr_code_marque') != '' AND !preg_match("#^[0-9]{2}$#", Tools::getValue('mr_code_marque'))) + $this->_postErrors[] = $this->l('Invalid Mark code'); + if (Tools::getValue('mr_Key_WebService') != '' AND !preg_match("#^[0-9A-Za-z_\'., /\-]{2,32}$#", Tools::getValue('mr_Key_WebService'))) + $this->_postErrors[] = $this->l('Invalid Webservice Key'); + if (Tools::getValue('mr_Langage') != '' AND !preg_match("#^[A-Z]{2}$#", Tools::getValue('mr_Langage'))) + $this->_postErrors[] = $this->l('Invalid Language'); + if (!Tools::getValue('mr_weight_coef') OR !Validate::isInt(Tools::getValue('mr_weight_coef'))) + $this->_postErrors[] = $this->l('Invalid Weight Coefficient'); + } + else if (Tools::isSubmit('submitMethod')) + { + if (Configuration::get('MR_ENSEIGNE_WEBSERVICE') == '' OR Configuration::get('MR_CODE_MARQUE') == '' OR + Configuration::get('MR_KEY_WEBSERVICE') == '' OR Configuration::get('MR_LANGUAGE') == '') + $this->_postErrors[] = $this->l('Please configure your Mondial Relay account settings before creating a carrier.'); + if (!preg_match("#^[0-9A-Za-z_\'., /\-]{2,32}$#", Tools::getValue('mr_Name'))) + $this->_postErrors[] = $this->l('Invalid carrier name'); + if (Tools::getValue('mr_ModeCol') != 'CCC') + $this->_postErrors[] = $this->l('Invalid Col mode'); + if (!preg_match("#^REL|24R|ESP|DRI|LDS|LDR|LD1$#", Tools::getValue('mr_ModeLiv'))) + $this->_postErrors[] = $this->l('Invalid delivery mode'); + if (!Validate::isInt(Tools::getValue('mr_ModeAss')) OR Tools::getValue('mr_ModeAss') > 5 OR Tools::getValue('mr_ModeAss') < 0) + $this->_postErrors[] = $this->l('Invalid Assurance mode'); + if (!Tools::getValue('mr_Pays_list')) + $this->_postErrors[] = $this->l('You must choose at least one delivery country.'); + } + else if (Tools::isSubmit('submit_order_state')) + { + if (!Validate::isBool(Tools::getValue('mr_google_key'))) + $this->_postErrors[] = $this->l('Invalid google key'); + if (!Validate::isUnsignedInt(Tools::getValue('id_order_state'))) + $this->_postErrors[] = $this->l('Invalid order state'); + } + else if (Tools::isSubmit('PS_MRSubmitFieldPersonalization')) + { + $addr1 = Tools::getValue('Expe_ad1'); + if (!preg_match('#^[0-9A-Z_\-\'., /]{2,32}$#', strtoupper($addr1), $match)) + $this->_postErrors[] = $this->l('The Main address submited hasn\'t a good format'); + } + } + + private function _postProcess() + { + foreach($_POST AS $key => $value) + { + $setArray[] = $value; + $keyArray[] = pSQL($key); + } + array_pop($setArray); + array_pop($keyArray); + + if (isset($_POST['submitMR']) AND $_POST['submitMR']) + self::mrUpdate('settings', $setArray, $keyArray); + else if (isset($_POST['submitShipping']) AND $_POST['submitShipping']) + self::mrUpdate('shipping', $_POST, array()); + else if (Tools::getValue('PS_MRSubmitFieldPersonalization')) + $this->updateFieldsPersonalization(); + else if (isset($_POST['submitMethod']) AND $_POST['submitMethod']) + self::mrUpdate('addShipping', $setArray, $keyArray); + else if (isset($_POST['submit_order_state']) AND $_POST['submit_order_state']) + { + Configuration::updateValue('MONDIAL_RELAY_ORDER_STATE', Tools::getValue('id_order_state')); + Configuration::updateValue('MR_GOOGLE_MAP', Tools::getValue('mr_google_key')); + $this->_html .= '
    '.$this->l('Settings updated').'
    '; + } + } + + public function getmrth($id_lang, $active = false, $id_zone = false, $id_iso_code = false) + { + if (!Validate::isBool($active)) + die(Tools::displayError()); + + $carriers = Db::getInstance()->ExecuteS(' + SELECT c.*, cl.delay + FROM `'._DB_PREFIX_.'mr_method` m + LEFT JOIN `'._DB_PREFIX_.'carrier` c ON (c.`id_carrier` = m.`id_carrier` and c.`deleted` = 0) + LEFT JOIN `'._DB_PREFIX_.'carrier_lang` cl ON (c.`id_carrier` = cl.`id_carrier` AND cl.`id_lang` = '.(int)($id_lang).') + LEFT JOIN `'._DB_PREFIX_.'carrier_zone` cz ON (cz.`id_carrier` = c.`id_carrier`)'. + ($id_zone ? 'LEFT JOIN `'._DB_PREFIX_.'zone` z ON (z.`id_zone` = '.(int)($id_zone).')' : '').' + WHERE 1 '. + ($id_iso_code ? ' AND m.`mr_Pays_list` LIKE \'%'.pSQL($id_iso_code).'%\'' : ''). + ($active ? ' AND c.`active` = 1' : ''). + ($id_zone ? ' AND cz.`id_zone` = '.(int)($id_zone).' + AND z.`active` = 1' : '').' + GROUP BY c.`id_carrier`'); + + if (!is_array($carriers)) + $carriers = array(); + foreach ($carriers as $key => $carrier) + if ($carrier['name'] == '0') + $carriers[$key]['name'] = Configuration::get('PS_SHOP_NAME'); + return $carriers; + } + + public function hookOrderDetail($params) + { + global $smarty; + + $carrier = $params['carrier']; + $order = $params['order']; + + if ($carrier->is_module AND $order->shipping_number) + { + $module = $carrier->external_module_name; + include_once(_PS_MODULE_DIR_.$module.'/'.$module.'.php'); + $module_carrier = new $module(); + $smarty->assign('followup', $module_carrier->get_followup($order->shipping_number)); + } + else if ($carrier->url AND $order->shipping_number) + $smarty->assign('followup', str_replace('@', $order->shipping_number, $carrier->url)); + } + + public function hookOrderDetailDisplayed($params) + { + global $smarty; + + $res = Db::getInstance()->getRow(' + SELECT s.`MR_Selected_LgAdr1`, s.`MR_Selected_LgAdr2`, s.`MR_Selected_LgAdr3`, s.`MR_Selected_LgAdr4`, s.`MR_Selected_CP`, s.`MR_Selected_Ville`, s.`MR_Selected_Pays`, s.`MR_Selected_Num` + FROM `'._DB_PREFIX_.'mr_selected` s + WHERE s.`id_cart` = '.$params['order']->id_cart); + if ((!$res) OR ($res['MR_Selected_Num'] == 'LD1') OR ($res['MR_Selected_Num'] == 'LDS')) + return ''; + $smarty->assign('mr_addr', $res['MR_Selected_LgAdr1'].($res['MR_Selected_LgAdr1'] ? ' - ' : '').$res['MR_Selected_LgAdr2'].($res['MR_Selected_LgAdr2'] ? ' - ' : '').$res['MR_Selected_LgAdr3'].($res['MR_Selected_LgAdr3'] ? ' - ' : '').$res['MR_Selected_LgAdr4'].($res['MR_Selected_LgAdr4'] ? ' - ' : '').$res['MR_Selected_CP'].' '.$res['MR_Selected_Ville'].' - '.$res['MR_Selected_Pays']); + return $this->display(__FILE__, 'orderDetail.tpl'); + } + + public function hookProcessCarrier($params, $redirect = true) + { + $cart = $params['cart']; + $result_MR = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'mr_method` WHERE `id_carrier` = '.(int)($cart->id_carrier)); + if (count($result_MR) > 0) + { + $mr_mode_liv = $result_MR[0]['mr_ModeLiv']; + if ($mr_mode_liv == 'LDS' || $mr_mode_liv == 'LD1') + { + $deliveryAddressLDS = new Address((int)($cart->id_address_delivery)); + if (Validate::isLoadedObject($deliveryAddressLDS) AND ($deliveryAddressLDS->id_customer == $cart->id_customer)) + { + Db::getInstance()->delete(_DB_PREFIX_.'mr_selected','id_cart = "'.(int)($cart->id).'"'); + $mrselected = new MondialRelayClass(); + $mrselected->id_customer = $cart->id_customer; + $mrselected->id_method = $result_MR[0]['id_mr_method']; + $mrselected->id_cart = $cart->id; + $mrselected->MR_Selected_Num = $mr_mode_liv; + $mrselected->save(); + } + } + else if (!Configuration::get('PS_ORDER_PROCESS_TYPE')) + { + // Redirect is set to false in Presta 1.3 for compatibility + // when this method is called under an ajax process + if (empty($_POST['MR_Selected_Num_'.$cart->id_carrier]) && $redirect) // Case error : the customer didn't choose a 'relais' but selected Relais Colis TNT as a carrier + Tools::redirect('index.php?controller=order&step=2&mr_null'); + else + { + Db::getInstance()->delete(_DB_PREFIX_.'mr_selected','id_cart = "'.(int)($cart->id).'"'); + $mrselected = new MondialRelayClass(); + $mrselected->id_customer = $cart->id_customer; + $mrselected->id_method = $result_MR[0]['id_mr_method']; + $mrselected->id_cart = $cart->id; + $mrselected->MR_Selected_Num = $_POST['MR_Selected_Num_'.$cart->id_carrier]; + $mrselected->MR_Selected_LgAdr1 = $_POST['MR_Selected_LgAdr1_'.$cart->id_carrier]; + $mrselected->MR_Selected_LgAdr2 = $_POST['MR_Selected_LgAdr2_'.$cart->id_carrier]; + $mrselected->MR_Selected_LgAdr3 = $_POST['MR_Selected_LgAdr3_'.$cart->id_carrier]; + $mrselected->MR_Selected_LgAdr4 = $_POST['MR_Selected_LgAdr4_'.$cart->id_carrier]; + $mrselected->MR_Selected_CP = $_POST['MR_Selected_CP_'.$cart->id_carrier]; + $mrselected->MR_Selected_Ville = $_POST['MR_Selected_Ville_'.$cart->id_carrier]; + $mrselected->MR_Selected_Pays = $_POST['MR_Selected_Pays_'.$cart->id_carrier]; + $mrselected->save(); + } + } + } + } + + public function hookupdateCarrier($params) + { + $new_carrier = $params['carrier']; + // Depends of the Prestashop version, the matches key isn't the same + if ((_PS_VERSION_ >= '1.4' && $new_carrier->external_module_name == 'mondialrelay') || + $new_carrier->name = 'mondialrelay') + { + $mr_data = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'mr_method` + WHERE `id_carrier` = '.(int)($params['id_carrier'])); + + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'mr_method` + (mr_Name, mr_Pays_list, mr_ModeCol, mr_ModeLiv, mr_ModeAss, id_carrier) + VALUES ( + "'.pSQL($mr_data['mr_Name']).'", + "'.pSQL($mr_data['mr_Pays_list']).'", + "'.pSQL($mr_data['mr_ModeCol']).'", + "'.pSQL($mr_data['mr_ModeLiv']).'", + "'.pSQL($mr_data['mr_ModeAss']).'", + '.(int)($new_carrier->id).')'); + } + } + + public function hookextraCarrier($params) + { + global $smarty, $cart, $cookie, $defaultCountry, $nbcarriers; + + if (Configuration::get('MR_ENSEIGNE_WEBSERVICE') == '' OR + Configuration::get('MR_CODE_MARQUE') == '' OR + Configuration::get('MR_KEY_WEBSERVICE') == '' OR + Configuration::get('MR_LANGUAGE') == '') + return ''; + + $totalweight = Configuration::get('MR_WEIGHT_COEF') * $cart->getTotalWeight(); + + if (Validate::isUnsignedInt($cart->id_carrier)) + { + $carrier = new Carrier((int)($cart->id_carrier)); + if ($carrier->active AND !$carrier->deleted) + $checked = (int)($cart->id_carrier); + } + if (!isset($checked) OR $checked == 0) + $checked = (int)(Configuration::get('PS_CARRIER_DEFAULT')); + + $address = new Address((int)($cart->id_address_delivery)); + $id_zone = Address::getZoneById((int)($address->id)); + $country = new Country((int)($address->id_country)); + + $query = self::getmrth((int)($cookie->id_lang), true, (int)($country->id_zone), $country->iso_code); + + $resultsArray = array(); + $i = 0; + foreach ($query AS $k => $row) + { + $carrier = new Carrier((int)($row['id_carrier'])); + if ((Configuration::get('PS_SHIPPING_METHOD') AND $carrier->getMaxDeliveryPriceByWeight($id_zone) === false) OR + (!Configuration::get('PS_SHIPPING_METHOD') AND $carrier->getMaxDeliveryPriceByPrice($id_zone) === false)) + { + unset($result[$k]); + continue ; + } + + if ($row['range_behavior']) + { + // Get id zone + if (isset($cart->id_address_delivery) AND $cart->id_address_delivery) + $id_zone = Address::getZoneById((int)($cart->id_address_delivery)); + else + $id_zone = (int)$defaultCountry->id_zone; + if ((Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByWeight($row['id_carrier'], $cart->getTotalWeight(), $id_zone))) OR + (!Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $cart->getOrderTotal(true, self::BOTH_WITHOUT_SHIPPING), $id_zone, $cart->id_currency)))) + { + unset($result[$k]); + continue ; + } + } + + $settings = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'mr_method` WHERE `id_carrier` = '.(int)($row['id_carrier'])); + $row['name'] = $settings[0]['mr_Name']; + $row['col'] = $settings[0]['mr_ModeCol']; + $row['liv'] = $settings[0]['mr_ModeLiv']; + $row['ass'] = $settings[0]['mr_ModeAss']; + $row['price'] = $cart->getOrderShippingCost((int)($row['id_carrier'])); + $row['img'] = file_exists(_PS_SHIP_IMG_DIR_.(int)($row['id_carrier']).'.jpg') ? _THEME_SHIP_DIR_.(int)($row['id_carrier']).'.jpg' : ''; + + $resultsArray[] = $row; + $i++; + } + + if ($i > 0) + { + include_once(_PS_MODULE_DIR_.'mondialrelay/page_iso.php'); + + $smarty->assign( array( + 'address_map' => $address->address1.', '.$address->postcode.', '.ote_accent($address->city).', '.$country->iso_code, + 'input_cp' => $address->postcode, + 'input_ville' => ote_accent($address->city), + 'input_pays' => $country->iso_code, + 'input_poids' => Configuration::get('MR_WEIGHT_COEF') * $cart->getTotalWeight(), + 'nbcarriers' => $nbcarriers, + 'checked' => (int)($checked), + 'google_api_key' => Configuration::get('MR_GOOGLE_MAP'), + 'one_page_checkout' => (Configuration::get('PS_ORDER_PROCESS_TYPE') ? Configuration::get('PS_ORDER_PROCESS_TYPE') : 0), + 'new_base_dir' => self::$moduleURL, + 'carriersextra' => $resultsArray)); + $nbcarriers = $nbcarriers + $i; + return $this->display(__FILE__, 'mondialrelay.tpl'); + } + } + + public function getContent() + { + global $cookie; + + $error = null; + + $html = ''; + if (!empty($_POST)) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + { + $nbErrors = sizeof($this->_postErrors); + $this->_html .= '

    '.$nbErrors.' '.($nbErrors > 1 ? $this->l('errors') : $this->l('error')).'

      '; + foreach ($this->_postErrors AS $error) + $this->_html .= '
    1. '.$error.'
    2. '; + $this->_html .= '
    '; + } + } + + if (isset($_GET['delete_mr']) && !empty($_GET['delete_mr'])) + self::mrDelete((int)($_GET['delete_mr'])); + + $this->_html .= '

    '.$this->l('Configure Mondial Relay Rate Module').'

    +
    + + '.$this->l('To create a Mondial Relay carrier'). + ' + - '.$this->l('Enter and save your Mondial Relay account settings').'
    + - '.$this->l('Create a Carrier').'
    + - '.$this->l('Define a price for your carrier on').' + '.$this->l('The Carrier page').'
    + - '.$this->l('To generate labels, you must have a valid and registered address of your store on your'). + ' '.$this->l('contact page').'
    +

    + '.$this->l('URL Cron Task:').' '.Tools::getHttpHost(true, true)._MODULE_DIR_.$this->name.'/cron.php?secure_key='.Configuration::get('MONDIAL_RELAY_SECURE_KEY'). + '

    +
    +
    +
    '. + $this->settingsForm(). + '
    +
    '. + $this->settingsstateorderForm(). + '
    +
    '. + $this->personalizeFormFields(). + '
    +
    '. + $this->addMethodForm(). + '
    +
    '. + $this->shippingForm(). + '

    '; + return $this->_html; + } + + /* + ** Update the new defined fields of the merchant + */ + public function updateFieldsPersonalization() + { + Configuration::updateValue('PS_MR_SHOP_NAME', Tools::getValue('Expe_ad1')); + $this->_html .= '
    '.$this->l('Settings updated').'
    '; + } + + public function mrDelete($id) + { + $id = Db::getInstance()->getValue('SELECT `id_carrier` FROM `'._DB_PREFIX_ .'mr_method` WHERE `id_mr_method` = "'.(int)($id).'"'); + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_ .'carrier` SET `active` = 0, `deleted` = 1 WHERE `id_carrier` = "'.(int)($id).'"'); + $this->_html .= '
    '.$this->l('Delete successful').'
    '; + } + + public function mrUpdate($type, $array, $keyArray) + { + global $cookie; + + if ($type == 'settings') + { + Configuration::updateValue('MR_ENSEIGNE_WEBSERVICE', $array[0]); + Configuration::updateValue('MR_CODE_MARQUE', $array[1]); + Configuration::updateValue('MR_KEY_WEBSERVICE', $array[2]); + Configuration::updateValue('MR_LANGUAGE', $array[3]); + Configuration::updateValue('MR_WEIGHT_COEF', $array[4]); + } + else if ($type == 'shipping') + { + array_pop($array); + foreach ($array AS $Key => $value) + { + $key = explode(',', $Key); + $id = Db::getInstance()->getValue('SELECT `id_carrier` FROM `'._DB_PREFIX_ .'mr_method` WHERE `id_mr_method` = "'.(int)($key[0]).'"'); + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'carrier SET active = "'.(int)($value).'" WHERE `id_carrier` = "'.(int)($id).'"'); + } + } + else if ($type == 'addShipping') + { + $query = 'INSERT INTO ' . _DB_PREFIX_ . 'mr_method ('; + + for ($q = 0; $q <= count($keyArray) - 1; $q++) + { + $end = ($q == count($keyArray) - 1) ? '' : ', '; + $query .= $keyArray[$q] . $end; + } + + $query .= ') VALUES('; + + for ($j = 0; $j <= count($array) - 1; $j++) + { + $var = $array[$j]; + if (is_array($var)) + $var = implode(",", $var); + $end = ($j == count($array) - 1) ? '' : ', '; + $query .= "'" . pSQL($var). "'" . $end; + } + $query .= ')'; + + Db::getInstance()->Execute($query); + + $mainInsert = mysql_insert_id(); + $default = Db::getInstance()->ExecuteS("SELECT * FROM " . _DB_PREFIX_ . "configuration WHERE name = 'PS_CARRIER_DEFAULT'"); + $check = Db::getInstance()->ExecuteS("SELECT * FROM " . _DB_PREFIX_ . "carrier"); + $checkD = array(); + + foreach($check AS $Key) + { + foreach($Key AS $key => $value) + if($key == "id_carrier") + $checkD[] = $value; + } + + // Added for 1.3 compatibility to match with the right key + if (_PS_VERSION_ >= '1.4') + Db::getInstance()->Execute(' + INSERT INTO `' . _DB_PREFIX_ . 'carrier` + (`id_tax_rules_group`, `url`, `name`, `active`, `is_module`, `range_behavior`, `shipping_external`, `need_range`, `external_module_name`, `shipping_method`) + VALUES("0", NULL, "'.pSQL($array[0]).'", "1", "1", "1", "0", "1", "mondialrelay", "1")'); + else + Db::getInstance()->Execute(' + INSERT INTO `' . _DB_PREFIX_ . 'carrier` + (`url`, `name`, `active`, `is_module`, `range_behavior`) + VALUES(NULL, "'.pSQL('mondialrelay').'", "1", "1", "1")'); + + $get = Db::getInstance()->getRow('SELECT * FROM `' . _DB_PREFIX_ . 'carrier` WHERE `id_carrier` = "' . mysql_insert_id() . '"'); + Db::getInstance()->Execute('UPDATE `' . _DB_PREFIX_ . 'mr_method` SET `id_carrier` = "' . (int)($get['id_carrier']) . '" WHERE `id_mr_method` = "' . pSQL($mainInsert) . '"'); + $weight_coef = Configuration::get('MR_WEIGHT_COEF'); + $range_weight = array('24R' => array(0, 20000 / $weight_coef), 'DRI' => array(20000 / $weight_coef, 130000 / $weight_coef), 'LD1' => array(0, 60000 / $weight_coef), 'LDS' => array(30000 / $weight_coef, 130000 / $weight_coef)); + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'range_weight` (`id_carrier`, `delimiter1`, `delimiter2`) + VALUES ('.(int)($get['id_carrier']).', '.$range_weight[$array[2]][0].', '.$range_weight[$array[2]][1].')'); + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'range_price` (`id_carrier`, `delimiter1`, `delimiter2`) VALUES ('.(int)($get['id_carrier']).', 0.000000, 10000.000000)'); + $groups = Group::getGroups(Configuration::get('PS_LANG_DEFAULT')); + foreach ($groups as $group) + + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'carrier_group` (id_carrier, id_group) VALUES('.(int)($get['id_carrier']).', '.(int)($group['id_group']).')'); + + $zones = Zone::getZones(); + foreach ($zones as $zone) + { + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'carrier_zone` (id_carrier, id_zone) VALUES('.(int)($get['id_carrier']).', '.(int)($zone['id_zone']).')'); + $range_price_id = Db::getInstance()->getValue('SELECT id_range_price FROM ' . _DB_PREFIX_ . 'range_price WHERE id_carrier = "'.(int)($get['id_carrier']).'"'); + $range_weight_id = Db::getInstance()->getValue('SELECT id_range_weight FROM ' . _DB_PREFIX_ . 'range_weight WHERE id_carrier = "'.(int)($get['id_carrier']).'"'); + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'delivery` (id_carrier, id_range_price, id_range_weight, id_zone, price) VALUES('.(int)($get['id_carrier']).', '.(int)($range_price_id).', NULL,'.(int)($zone['id_zone']).', 0.00)'); + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'delivery` (id_carrier, id_range_price, id_range_weight, id_zone, price) VALUES('.(int)($get['id_carrier']).', NULL, '.(int)($range_weight_id).','.(int)($zone['id_zone']).', 0.00)'); + } + + if(!in_array($default[0]['value'], $checkD)) + $default = Db::getInstance()->ExecuteS("UPDATE " . _DB_PREFIX_ . "configuration SET value = '" . (int)($get['id_carrier']) . "' WHERE name = 'PS_CARRIER_DEFAULT'"); + } + else + return false; + + $this->_html .= '
    '.$this->l('Settings updated').'
    '; + return true; + } + + public function addMethodForm() + { + $zones = Db::getInstance()->ExecuteS("SELECT * FROM " . _DB_PREFIX_ . "zone WHERE active = 1"); + $output = ' +
    +
    + '.$this->l('Add a Shipping Method').' +
      +
    • + * ' . $this->l('Required') . ' +
    • +
    • + + +
    • +
    • + + +
    • + +
    • + + +
    • + +
    • + + +
    • + +
    • + + +
    • +
    • + +
    • +
    +
    +
    '; + + return $output; + } + + public function shippingForm() + { + global $cookie; + + $query = Db::getInstance()->ExecuteS(' + SELECT m.* + FROM `'._DB_PREFIX_.'mr_method` m + JOIN `'._DB_PREFIX_.'carrier` c + ON (c.`id_carrier` = m.`id_carrier`) + WHERE c.`deleted` = 0'); + + $output = ' +
    +
    + '.$this->l('Shipping Method\'s list').' +
      '; + if (!sizeof($query)) + $output .= '
    1. '.$this->l('No shipping methods created').'
    2. '; + foreach ($query AS $Options) + { + $output .= ' +
    3. + Delete' . str_replace('_', ' ', $Options['mr_Name']) . ' (' . $Options['mr_ModeCol'] . '-' . $Options['mr_ModeLiv'] . ' - ' . $Options['mr_ModeAss'] . ' : '.$Options['mr_Pays_list'].') + '.$this->l('Config Shipping.').' +
    4. '; + } + $output .= ' + +
    +
    +

    + '; + + return $output; + } + + /* + ** Form to allow personalization fields sent for MondialRelay + */ + public function personalizeFormFields() + { + $form = ''; + $warn = ''; + + // Load the Default value from the configuration + $addr1 = (Configuration::get('PS_MR_SHOP_NAME')) ? + Configuration::get('PS_MR_SHOP_NAME') : + Configuration::get('PS_SHOP_NAME'); + + // Check if a request exist and if errors occured, use the post variable + if (Tools::isSubmit('PS_MRSubmitFieldPersonalization') && count($this->_postErrors)) + $addr1 = Tools::getValue('Expe_ad1'); + + + if (!Configuration::get('PS_MR_SHOP_NAME')) + $warn .= '
    '. + $this->l('Its seems you updated Mondialrelay without use the uninstall / install method, + you have to set up this part to make working the generating ticket process'). + '
    '; + // Form + $form = '
    '; + $form .= ' +
    + + '.$this->l('Fields personalization'). + ''. + $warn.' + +
    +
    +

    '.$this->l('The key used by Mondialrelay is').' Expe_ad1 '.$this->l('and has this default value').' + : '.Configuration::get('PS_SHOP_NAME').'

    +
    + +
    + +
    +
    '; + return $form; + } + + + public function settingsstateorderForm() + { + global $cookie; + + $this->orderState = Configuration::get('MONDIAL_RELAY_ORDER_STATE'); + $output = ''; + $output .= '
    '; + $output .= '
    '.$this->l('Settings').''; + $output .= ''; + $output .= '
    '; + $output .= ''; + $output .= '

    ' . $this->l('Choose the order state for labels. You can manage the labels on').' '; + $output .= ''. + $this->l('the Mondial Relay administration page').'

    '; + $output .= '
    +
    + +
    + + + + +

    '.$this->l('Displaying a google map on your Mondial Relay carrier may make carrier page loading slower.').'

    +
    '; + $output .= '
    '; + $output .= '

    '; + + return $output; + } + + + public function settingsForm() + { + $output = ' +
    +
    + '.$this->l('Mondial Relay Account Settings').' +
      +
    • + * ' . $this->l('Required') . ' +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + +
    • +
    • + + + (' . $this->l('grammes = 1 ') . Configuration::get('PS_WEIGHT_UNIT').') +
    • +
    • + +
    • +
    +
    +
    '; + + return $output; + } + + public function displayInfoByCart($id_cart) + { + $html = '

    '; + $simpleresul = Db::getInstance()->ExecuteS(' + SELECT * FROM ' . _DB_PREFIX_ . 'mr_selected + WHERE id_cart='.(int)($id_cart)); + + if (trim($simpleresul[0]['exp_number']) != '0') + $html .= $this->l('Nb expedition:').$simpleresul[0]['exp_number']."
    "; + if (trim($simpleresul[0]['url_etiquette']) != '0') + $html .= "".$this->l('Label URL')."
    "; + if (trim($simpleresul[0]['url_suivi']) != '0') + $html .= "".$this->l('Follow-up URL')."
    "; + if (trim($simpleresul[0]['MR_Selected_Num']) != '') + $html .= $this->l('Nb Point Relay :').$simpleresul[0]['MR_Selected_Num']."
    "; + if (trim($simpleresul[0]['MR_Selected_LgAdr1']) != '') + $html .= $simpleresul[0]['MR_Selected_LgAdr1']."
    "; + if (trim($simpleresul[0]['MR_Selected_LgAdr2']) != '') + $html .= $simpleresul[0]['MR_Selected_LgAdr2']."
    "; + if (trim($simpleresul[0]['MR_Selected_LgAdr3']) != '') + $html .= $simpleresul[0]['MR_Selected_LgAdr3']."
    "; + if (trim($simpleresul[0]['MR_Selected_LgAdr4']) != '') + $html .= $simpleresul[0]['MR_Selected_LgAdr4']."
    "; + if (trim($simpleresul[0]['MR_Selected_CP']) != '') + $html .= $simpleresul[0]['MR_Selected_CP']." "; + if (trim($simpleresul[0]['MR_Selected_Ville']) != '') + $html .= $simpleresul[0]['MR_Selected_Ville']."
    "; + if (trim($simpleresul[0]['MR_Selected_Pays']) != '') + $html .= $simpleresul[0]['MR_Selected_Pays']."
    "; + $html .= '

    '; + return $html; + } + + public function get_followup($shipping_number) + { + $query = 'SELECT url_suivi + FROM '._DB_PREFIX_ .'mr_selected + WHERE id_mr_selected=\''.(int)($shipping_number).'\';'; + + $settings = Db::getInstance()->ExecuteS($query); + + return $settings[0]['url_suivi']; + } + + public function set_carrier($key, $value, $id_carrier) + { + if ($key == 'name') + $key = 'mr_Name'; + + return Db::getInstance()->Execute(' + UPDATE ' . _DB_PREFIX_ . 'mr_method + SET '.pSQL($key).'="'.pSQL($value).'" + WHERE id_carrier=\''.(int)($id_carrier).'\' ; '); + } + + // Add for 1.3 compatibility and avoid duplicate code + static public function jsonEncode($result) + { + return (method_exists('Tools', 'jsonEncode')) ? + Tools::jsonEncode($result) : json_encode($result); + } + + static public function ordersSQLQuery1_4($id_order_state) + { + return 'SELECT o.`id_address_delivery` as id_address_delivery, + o.`id_order` as id_order, + o.`id_customer` as id_customer, + o.`id_cart` as id_cart, + mrs.`id_mr_selected` as id_mr_selected, + CONCAT(c.`firstname`, \' \', c.`lastname`) AS `customer`, + o.`total_paid_real` as total, o.`total_shipping` as shipping, + o.`date_add` as date, o.`id_currency` as id_currency, o.`id_lang` as id_lang, + mrs.`MR_poids` as weight, mr.`mr_Name` as mr_Name, mrs.`MR_Selected_Num` as MR_Selected_Num, + mrs.`MR_Selected_Pays` as MR_Selected_Pays, mrs.`exp_number` as exp_number, + mr.`mr_ModeCol` as mr_ModeCol, mr.`mr_ModeLiv` as mr_ModeLiv, mr.`mr_ModeAss` as mr_ModeAss + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'carrier` ca + ON (ca.`id_carrier` = o.`id_carrier` + AND ca.`external_module_name` = "mondialrelay") + LEFT JOIN `'._DB_PREFIX_.'mr_selected` mrs + ON (mrs.`id_cart` = o.`id_cart`) + LEFT JOIN `'._DB_PREFIX_.'mr_method` mr + ON (mr.`id_carrier` = ca.`id_carrier`) + LEFT JOIN `'._DB_PREFIX_.'customer` c + ON (c.`id_customer` = o.`id_customer`) + WHERE ( + SELECT moh.`id_order_state` + FROM `'._DB_PREFIX_.'order_history` moh + WHERE moh.`id_order` = o.`id_order` + ORDER BY moh.`date_add` DESC LIMIT 1) = '.(int)($id_order_state).' + AND ca.`external_module_name` = "mondialrelay"'; + } + + static public function ordersSQLQuery1_3($id_order_state) + { + return ' + SELECT o.`id_address_delivery` as id_address_delivery, + o.`id_order` as id_order, + o.`id_customer` as id_customer, + o.`id_cart` as id_cart, + mrs.`id_mr_selected` as id_mr_selected, + CONCAT(c.`firstname`, \' \', c.`lastname`) AS `customer`, + o.`total_paid_real` as total, o.`total_shipping` as shipping, + o.`date_add` as date, o.`id_currency` as id_currency, o.`id_lang` as id_lang, + mrs.`MR_poids` as weight, mr.`mr_Name` as mr_Name, mrs.`MR_Selected_Num` as MR_Selected_Num, + mrs.`MR_Selected_Pays` as MR_Selected_Pays, mrs.`exp_number` as exp_number, + mr.`mr_ModeCol` as mr_ModeCol, mr.`mr_ModeLiv` as mr_ModeLiv, mr.`mr_ModeAss` as mr_ModeAss + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'carrier` ca + ON (ca.`id_carrier` = o.`id_carrier`) + AND ca.`name` = "mondialrelay" + LEFT JOIN `'._DB_PREFIX_.'mr_selected` mrs + ON (mrs.`id_cart` = o.`id_cart`) + LEFT JOIN `'._DB_PREFIX_.'mr_method` mr + ON (mr.`id_carrier` = ca.`id_carrier`) + LEFT JOIN `'._DB_PREFIX_.'customer` c + ON (c.`id_customer` = o.`id_customer`) + WHERE ( + SELECT moh.`id_order_state` + FROM `'._DB_PREFIX_.'order_history` moh + WHERE moh.`id_order` = o.`id_order` + ORDER BY moh.`date_add` DESC LIMIT 1) = '.(int)($id_order_state).' + AND ca.`name` = "mondialrelay"'; + } + + static public function getBaseOrdersSQLQuery($id_order_state) + { + if (_PS_VERSION_ >= '1.4') + return self::ordersSQLQuery1_4($id_order_state); + else + return self::ordersSQLQuery1_3($id_order_state); + } + + static public function getOrders($orderIdList = array()) + { + $id_order_state = Configuration::get('MONDIAL_RELAY_ORDER_STATE'); + $sql = self::getBaseOrdersSQLQuery($id_order_state); + + if (count($orderIdList)) + { + $sql .= ' AND o.id_order IN ('; + foreach ($orderIdList as $id_order) + $sql .= (int)$id_order.', '; + $sql = rtrim($sql, ', ').')'; + } + $sql .= ' + GROUP BY o.`id_order` + ORDER BY o.`date_add` ASC'; + return Db::getInstance()->ExecuteS($sql); + } + + public function getErrorCodeDetail($code) + { + global $statCode; + + if (isset($statCode[$code])) + return $statCode[$code]; + return $this->l('This error isn\'t referred : ') . $code; + } +} diff --git a/modules/mondialrelay/mondialrelay.tpl b/modules/mondialrelay/mondialrelay.tpl new file mode 100755 index 000000000..881d9c315 --- /dev/null +++ b/modules/mondialrelay/mondialrelay.tpl @@ -0,0 +1,95 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + + +{foreach from=$carriersextra item=carrier name=myLoop} + + + + + + + + + + + + {$carrier.delay|escape:'htmlall':'UTF-8'} + + {if $carrier.price} + + {if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if} + + {if $priceDisplay == 1} {l s='(tax excl.)' mod='mondialrelay'}{else} {l s='(tax incl.)' mod='mondialrelay'}{/if} + {else} + {l s='Free!' mod='mondialrelay'} + {/if} + + + {if $carrier.liv !='LDR' && $carrier.liv != 'LD1' && $carrier.liv != 'LDS'} + + + + {if ($google_api_key)} + + {/if} + + + + + {/if} + +{/foreach} + + diff --git a/modules/mondialrelay/mrInstall.sql b/modules/mondialrelay/mrInstall.sql new file mode 100755 index 000000000..9d299f424 --- /dev/null +++ b/modules/mondialrelay/mrInstall.sql @@ -0,0 +1,43 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_mr_method` ( + `id_mr_method` int(10) unsigned NOT NULL auto_increment, + `mr_Name` varchar(255) NOT NULL, + `mr_Pays_list` varchar(1000) NOT NULL, + `mr_ModeCol` varchar(3) NOT NULL, + `mr_ModeLiv` varchar(3) NOT NULL, + `mr_ModeAss` varchar(3) NOT NULL DEFAULT '0', + `id_carrier` int(10) NOT NULL, + PRIMARY KEY (`id_mr_method`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `PREFIX_mr_selected` ( + `id_mr_selected` int(10) unsigned NOT NULL auto_increment, + `id_customer` int(10) unsigned NULL, + `id_method` int(10) unsigned NULL, + `id_cart` int(10) unsigned NULL, + `id_order` int(10) unsigned NULL, + `MR_poids` varchar(7) NULL, + `MR_Selected_Num` varchar(6) NULL, + `MR_Selected_LgAdr1` varchar(36) NULL, + `MR_Selected_LgAdr2` varchar(36) NULL, + `MR_Selected_LgAdr3` varchar(36) NULL, + `MR_Selected_LgAdr4` varchar(36) NULL, + `MR_Selected_CP` varchar(10) NULL, + `MR_Selected_Ville` varchar(32) NULL, + `MR_Selected_Pays` varchar(2) NULL, + `url_suivi` varchar(1000) NULL, + `url_etiquette` varchar(1000) NULL, + `exp_number` varchar(8) NULL, + `date_add` datetime NOT NULL, + `date_upd` datetime NOT NULL, + PRIMARY KEY (`id_mr_selected`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `PREFIX_mr_historique` ( +`id` int(10) unsigned NOT NULL auto_increment, +`order` TEXT NOT NULL , +`exp` TEXT NOT NULL , +`url_a4` VARCHAR( 1000 ) NOT NULL , +`url_a5` VARCHAR( 1000 ) NOT NULL , +PRIMARY KEY ( `id` ) +)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; + diff --git a/modules/mondialrelay/orderDetail.tpl b/modules/mondialrelay/orderDetail.tpl new file mode 100755 index 000000000..d533fae55 --- /dev/null +++ b/modules/mondialrelay/orderDetail.tpl @@ -0,0 +1,29 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $mr_addr} +

    {l s='Delivery to' mod='mondialrelay'} {$mr_addr}

    +{/if} diff --git a/modules/mondialrelay/page_iso.php b/modules/mondialrelay/page_iso.php new file mode 100755 index 000000000..bc4f6f639 --- /dev/null +++ b/modules/mondialrelay/page_iso.php @@ -0,0 +1,42 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +//header('Content-Type: text/html; charset=iso-8859-15'); +function ote_accent($str){ + +$str = str_replace("'", " ", $str); + +$str = utf8_decode($str); + +$ch = strtr($str, + + '����������������������������������������������������', + + 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); + +return utf8_encode($ch); + +} diff --git a/modules/mondialrelay/sitemap.xml b/modules/mondialrelay/sitemap.xml new file mode 100755 index 000000000..e69de29bb diff --git a/modules/mondialrelay/style.css b/modules/mondialrelay/style.css new file mode 100755 index 000000000..bf7c16566 --- /dev/null +++ b/modules/mondialrelay/style.css @@ -0,0 +1,176 @@ +div.PS_MRFormType +{ + width:100%; + margin-top:20px; +} + +div.PS_MRFormType fieldset > ul +{ + list-style-type: none; +} + +div.PS_MRFormType fieldset > ul > li +{ + margin-top:10px; +} + +div.PS_MRFormType fieldset > ul > li > span.indication +{ + font-style:italic; + font-size:11px; + margin-left:5px; +} + +div.PS_MRFormType fieldset > ul > li.PS_MRSubmit +{ + text-align:center; +} + +div.PS_MRSubmitButton +{ + text-align:center; + margin-top:20px; +} + +div.PS_MRFormType fieldset > ul > li.PS_MRRequireFields +{ + display:block; + text-align:right; + margin-right:10px; +} + +tr.PS_MRErrorList td +{ + border: 1px solid #EC9B9B; + background-color: #FFE2E3; + color: #383838; + font-weight: 700; + line-height: 18px; + text-align:center; +} + +tr.PS_MRSuccessList td +{ + border: 1px solid #72CB67; + background-color: #DFFAD3; + color: #383838; + font-weight: 700; + line-height: 18px; + text-align:center; +} + +table#PS_MRHistoriqueTableList +{ + text-align:center; +} + +table#PS_MRHistoriqueTableList tr > td > img +{ + margin-bottom:5px; +} + +table#PS_MRHistoriqueTableList +{ + width:100%; +} + +table#PS_MRHistoriqueTableList tr +{ + height:30px; +} + +div#otherErrors +{ + display:none; +} + +div#otherErrors span +{ + text-align:left; +} + +div#PS_MRUnRemovedItem +{ + display:none; + color:#FF0000; +} + +.shippingList { + width: 400px; + float: right; +} +.shippingList li { + margin: 5px; + display: block; + clear: both; +} +.shipLabel { + width: 230px; + float: left; + text-align: left; +} +.selectShipping { + width: 100px; +} +.settingsList { + width: 400px; + float: left; + margin-right: 10px; +} +.settingsList li { + display: block; + padding: 5px; + clear: both; +} +.upsLabel { + width: 170px; + float: left; + text-align: left; +} +.upsInput { + float: left; +} +.upsSubmit { + text-align: center; +} +.addMethodForm { + margin-bottom: 10px; +} + +table#orders +{ + width:100%; +} + +table#orders td +{ + text-align:center; + height: 30px; +} + +table#orders th +{ + text-align:center; + height: 40px; +} + +table#orders th.fixed +{ + width:70px; +} + +table#orders tr +{ + text-align:center; +} + +div.submit_button +{ + margin-top:10px; + text-align:center; +} + +div.PS_MRLoader +{ + display:none; +} diff --git a/modules/moneybookers/config.xml b/modules/moneybookers/config.xml new file mode 100755 index 000000000..e743d3acb --- /dev/null +++ b/modules/moneybookers/config.xml @@ -0,0 +1,13 @@ + + + moneybookers + + + + + + Are you sure you want to delete your details ? + 1 + 1 + + \ No newline at end of file diff --git a/modules/moneybookers/confirmation.tpl b/modules/moneybookers/confirmation.tpl new file mode 100644 index 000000000..503108a83 --- /dev/null +++ b/modules/moneybookers/confirmation.tpl @@ -0,0 +1,44 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $status == 'ok'} +

    {l s='Your order on' mod='moneybookers'} {$shop_name} {l s='is complete.' mod='moneybookers'} +

    {l s='Your order will be shipped as soon as possible.' mod='moneybookers'} +

    {l s='For any questions or for further information, please contact our' mod='moneybookers'} {l s='customer support' mod='moneybookers'}. +

    +{else} + {if $status == 'pending'} +

    {l s='Your order on' mod='moneybookers'} {$shop_name} {l s='is pending.' mod='moneybookers'} +

    {l s='Your order will be shipped as soon as we receive your bankwire.' mod='moneybookers'} +

    {l s='For any questions or for further information, please contact our' mod='moneybookers'} {l s='customer support' mod='moneybookers'}. +

    + {else} +

    + {l s='We noticed a problem with your order. If you think this is an error, you can contact our' mod='moneybookers'} + {l s='customer support' mod='moneybookers'}. +

    + {/if} +{/if} diff --git a/modules/moneybookers/de.php b/modules/moneybookers/de.php new file mode 100644 index 000000000..a1a2a1365 --- /dev/null +++ b/modules/moneybookers/de.php @@ -0,0 +1,73 @@ +confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{moneybookers}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{moneybookers}prestashop>confirmation_15d18c17d7aef219c342bb0d81e823ab'] = 'Ihre Bestellung wird so schnell wie möglich verschickt werden.'; +$_MODULE['<{moneybookers}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{moneybookers}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{moneybookers}prestashop>confirmation_df194447dfecf36bb8043bd8d94feed3'] = 'ist anhängig.'; +$_MODULE['<{moneybookers}prestashop>confirmation_047e219d25b398033511b18041dbfd7a'] = 'Ihre Bestellung wird verschickt, sobald wir Ihre Banküberweisung erhalten haben.'; +$_MODULE['<{moneybookers}prestashop>confirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Wir haben ein Problem bei Ihrer Bestellung festgestellt. Wenn Sie denken, dies sei ein Fehler, können Sie an unseren'; +$_MODULE['<{moneybookers}prestashop>moneybookers-currency-error_6484c945379d81c37ac734c9768605cf'] = 'Sie können mit Ihren derzeitigen Währung nicht mit Moneybookers bezahlen, wählen Sie bitte eine andere Währung'; +$_MODULE['<{moneybookers}prestashop>moneybookers_27266fe4d37bf06589c7c6dbf2d5c067'] = 'Zahlung mit'; +$_MODULE['<{moneybookers}prestashop>moneybookers_6861a58e2be4956b3f2fd6420fe6c28c'] = 'Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a356736cbcf740f8648d71067fca090d'] = 'Akzeptiert Zahlungen per Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fa214007826415a21a8456e3e09f999d'] = 'Sie sind sicher, dass Sie Ihre Daten löschen wollen?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_088b74050a381d98fca38d5990b097be'] = 'Sie nutzen zur Zeit die Standard-E-Mail-Adresse von Moneybookers, Sie müssen Ihre eigene E-Mail-Adresse verwenden'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87ef564ed1574eda7e77b4012eef0b85'] = 'Unmöglich,den Aktivierungs-Server zu kontaktieren, bitte versuchen Sie es später'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b863542eebcb27fa230b647b5dd07819'] = 'Konto-Bestätigung fehlgeschlagen, Ihre E-Mail könnte falsch sein'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d70c5b5767846906e0abe68498db887b'] = 'E-Mail-Aktivierung erfolgreich, Sie können nun Ihr Kennwort bestâtigen'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7757ea03f2a0893e36c7916a2ad07ef8'] = 'Das E-Mail-Feld ist erforderlich'; +$_MODULE['<{moneybookers}prestashop>moneybookers_aa1c444c2ee2f620d5b349fedfa68ba2'] = 'Kennwortbestätigung fehlgeschlagen, max. Versuchszahl überschritten (3 pro Stunde)'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cdbef58d093e0ff38e13686a669e9fee'] = 'Kennwortbestätigung fehlgeschlagen, Ihr Kennwort könnte falsch sein'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cd1dfa342c3c11c17ede212e6429ca01'] = 'Kontoaktivierung erfolgreich, Kennwort ok'; +$_MODULE['<{moneybookers}prestashop>moneybookers_2e531f9ad978a2a1a88a00ae0d4dc78e'] = 'Das Kennwortfeld ist erforderlich'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a9dd80641753cafc9c967e317ba92a28'] = 'Über Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8342dda89e8c20bb92916fbe052c583a'] = 'Freuen Sie sich auf Sonderkonditionen, die Moneybookers für Prestashop-Shopbetreiber vorbereitet hat!'; +$_MODULE['<{moneybookers}prestashop>moneybookers_80346621324d2aa2c1a953100bad1711'] = 'Aus Moneybookers wird Skrill!'; +$_MODULE['<{moneybookers}prestashop>moneybookers_5138738b54f0d4bdf7c72780db651abc'] = 'Kontoeröffnung'; +$_MODULE['<{moneybookers}prestashop>moneybookers_41992c760318e60740f7a9b2819af191'] = 'Starten Sie mit der Eröffung eines '; +$_MODULE['<{moneybookers}prestashop>moneybookers_c0302a6fbca061af831bc12f06cadb2f'] = 'Gratis-Kontos'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5ac14a97f40e4aadd7eb202f7c124b1'] = 'mit Moneybookers:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_3513f0ecb96b6c959454534578ee1404'] = 'Dann klicken Sie hier:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_64d37ad3bf2f0aee7c8a321321c7e9d9'] = 'Ich habe bereits ein Moneybookers-Konto'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b0e8c8326985417a5efdd6649f02e385'] = 'Dank der PrestaShop / Moneybookers Partnerschaft'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5086eeb1bc1994c5abf945fd79d4246'] = 'erhalten Sie eine bevorzugte Provision!'; +$_MODULE['<{moneybookers}prestashop>moneybookers_68db2cda800ddb2ae307c60b0a96252f'] = 'Online Bezahlsystem von Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b9c758264b134743b13a85ca4055c629'] = 'Monatlicher Umsatz über Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_826ba0a71ab6e534b04bfdd4dd98ac9e'] = 'Für Verkäufer mit Umsatz über 100,000 € kann verhandelt werden.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_11c8ff1cde03aa19406dfe5971b92553'] = 'Moneybookers eWallet'; +$_MODULE['<{moneybookers}prestashop>moneybookers_223b661f7b13d33498a9274bb10e3538'] = 'Quick Checkout Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_f284fe53995a4cc2e1e099cb1e511ec8'] = 'Konto-Bestätigung'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c5093f03229416cc06a625654429d7f2'] = 'Ihr Konto wurde aktiviert'; +$_MODULE['<{moneybookers}prestashop>moneybookers_bd8df5ae85f76ba759fa979ada8566ea'] = 'Sie müssen '; +$_MODULE['<{moneybookers}prestashop>moneybookers_558b256c79bbcf473cc7347ec1ca9d54'] = 'Ihr Konto bestätigen '; +$_MODULE['<{moneybookers}prestashop>moneybookers_61725fab1e3a4ccf8388c89bdc93d7c5'] = 'Warnung: stellen Sie sicher, dass Sie die Testmailadresse testmerchant@moneybookers.com » nit Ihrer eigenen ersetzt haben, bevor Sie ein Moneybookes Konto eröffnen'; +$_MODULE['<{moneybookers}prestashop>moneybookers_71b5b9efebe9c2f73fad6dd1849b4312'] = 'Mein Konto bestätigen'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ece6bf0de28bb0442df6e3a1fd7657d4'] = 'Wenn Sie Hilfe benötigen, lesen Sie das Aktivierungshandbuch'; +$_MODULE['<{moneybookers}prestashop>moneybookers_0b65457508cf73c9ed8c96f56b8910ce'] = 'Kennwortbestätigung'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e44efbda9396a5641d730f0ac4866e52'] = 'Ihr Kennwort wurde aktiviert'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7360d9333103eec04f2d91fa513a1f46'] = 'bestätigen Sie Ihr Kennwort'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7986dbc3b2bf0e8f72a328c094981836'] = 'Bitte geben Sie das gleiche Kennwort ein, das Sie zum Öffnen Ihres Moneybookers Kontos benutzen:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_22f2d26badcc700d11b93f57dc96d386'] = 'Mein Kennwort bestätigen'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cbcd58fce9759ea6e84c86ed92a3db44'] = 'Wie lautet das Geheimwort?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ef3cefa901bd32ea6aa2d0f6900b7725'] = 'Das Geheimwort unterscheidet sich vom Passwort. Es ist dazu da, um die Transmission von Ihrem Server zu entschlüsseln.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e1674c7b15040ce09b9615714eb3e787'] = 'Warum das Geheimwort sich vom Passwort unterscheiden soll'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e2571078c4c457621378b3ae187771c7'] = 'Das Geheimwort wird verwendet, um die Sicherheit beim Bezahlen zu erhöhen.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_4746f98d01ce62cd5805981a289d182c'] = 'Wo kann ich mein Geheimwort finden?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_72d809da732bc81a8a81fede00831836'] = 'Nachdem Ihr Konto überprüft ist, gehen Sie bitte in den Bereich \"Verkäufertools\". Dort können Sie Ihr Geheimwort setzen.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fd432cdfbae76a7ebde57e6fa44ad90b'] = 'Kreuzen Sie die'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cf189f988336fea71f05010d1525be9c'] = 'internationalen Zahlungsmethoden an,'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8298231c293193e2ab9ac388106edac4'] = 'die Sie aktivieren möchten:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b119e159b6f2d56f8ddead2af4561f38'] = 'lokalen Zahlungsmethoden'; +$_MODULE['<{moneybookers}prestashop>moneybookers_542725fe3d40df98822aa76779462d44'] = 'Einstellungen und Zahlungsmethoden'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87337b7475d1287ff99aaa30446b3bb7'] = 'Seitenanzeig nach Abbruch der Zahlung:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ab67f0d68dd6f5cb407e04abacd06120'] = 'Blenden Sie das Login-Formular auf der Moneybookers-Seite aus'; +$_MODULE['<{moneybookers}prestashop>moneybookers_554fd8768f165251646ce21ba4998208'] = 'Anzeigemodus:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a190bc880b04cf478e0370d1b315a5a3'] = 'Alle Logos in 1 Block'; +$_MODULE['<{moneybookers}prestashop>moneybookers_852d04b5f455aaf5264e9a8c561ced71'] = '1 Block für jedes Logo'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d4dccb8ca2dac4e53c01bd9954755332'] = 'Speichern Sie die Einstellungen'; + +?> \ No newline at end of file diff --git a/modules/moneybookers/es.php b/modules/moneybookers/es.php new file mode 100644 index 000000000..790ff010b --- /dev/null +++ b/modules/moneybookers/es.php @@ -0,0 +1,74 @@ +confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido en'; +$_MODULE['<{moneybookers}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'se ha completado.'; +$_MODULE['<{moneybookers}prestashop>confirmation_15d18c17d7aef219c342bb0d81e823ab'] = 'Su pedido será enviado tan pronto como sea posible.'; +$_MODULE['<{moneybookers}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier duda o para más información, póngase en contacto con nuestro servicio de atención al cliente'; +$_MODULE['<{moneybookers}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = ' servicio clientela'; +$_MODULE['<{moneybookers}prestashop>confirmation_df194447dfecf36bb8043bd8d94feed3'] = 'está en espera.'; +$_MODULE['<{moneybookers}prestashop>confirmation_047e219d25b398033511b18041dbfd7a'] = 'Su pedido será enviado tan pronto como recibamos su transferencia bancaria.'; +$_MODULE['<{moneybookers}prestashop>confirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Nos hemos dado cuenta de un problema con su pedido. Si usted piensa que esto es un error, puede contactar con nuestro'; +$_MODULE['<{moneybookers}prestashop>moneybookers-currency-error_6484c945379d81c37ac734c9768605cf'] = 'rnNo puede efectuar el pago de su pedido con Moneybookers ya que su divisa actual no está autorizada. Por favor, elija otra.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_6861a58e2be4956b3f2fd6420fe6c28c'] = 'Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a356736cbcf740f8648d71067fca090d'] = 'Acepta pagos por Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fa214007826415a21a8456e3e09f999d'] = '¿Está seguro de que quiere eliminar sus datos?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_088b74050a381d98fca38d5990b097be'] = 'Actualmente utiliza la dirección por defecto del módulo Moneybookers. Debe utilizar sus parámetros.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87ef564ed1574eda7e77b4012eef0b85'] = 'Imposible contactar con el servidor de activación, por favor inténtelo más tarde'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b863542eebcb27fa230b647b5dd07819'] = 'Error durante la validación de la cuenta, su correo electrónico podría estar equivocado'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d70c5b5767846906e0abe68498db887b'] = 'Activación correcta de su dirección email, ya puede validar su palabra secreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7757ea03f2a0893e36c7916a2ad07ef8'] = 'El campo email es obligatorio'; +$_MODULE['<{moneybookers}prestashop>moneybookers_aa1c444c2ee2f620d5b349fedfa68ba2'] = 'Error durante la validación de su palabra secreta, ha sobrepasado el número máximo de intentos (3 por hora)'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cdbef58d093e0ff38e13686a669e9fee'] = 'Error durante la validación de la palabra secreta, su palabra secreta podría estar equivocada'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cd1dfa342c3c11c17ede212e6429ca01'] = 'Activación de su cuenta con éxito, palabra secreta correcta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_2e531f9ad978a2a1a88a00ae0d4dc78e'] = 'El campo palabra secreta es obligatorio'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a9dd80641753cafc9c967e317ba92a28'] = 'Sobre Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8342dda89e8c20bb92916fbe052c583a'] = 'Disfrute de las tarifas especiales que PrestaShop Moneybookers frece a los comerciantes '; +$_MODULE['<{moneybookers}prestashop>moneybookers_4f4c1b5e5d775709e08ccc3afad1a5c3'] = 'Moneybookers, controlado por Holdings Skrill, es uno de los más importantes sistemas de pago en línea en Europa, y propone más de 100 opciones de pago y 41 divisas en más de 200 países y territorios. Más de 80.000 comerciantes ya utilizan esta solución entre los que se encuentran eBay.com, Skype y Thomas Cook.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_acf2b73b741f10cd1e0d075ed43fed39'] = 'Con más de 17 millones de usuarios y más de 15.000 nuevas cuentas creadas cada día, Moneybookers también ofrece uno de los mayores monedero electrónico en el mundo. Sus clientes también pueden pagar por medio de su e-mail y contraseña gracias a la solución de e-Wallet.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_76264fd7352f803c63396bc27b0ee893'] = '¡Moneybookers cambia de nombre y se convierte en Skrill!'; +$_MODULE['<{moneybookers}prestashop>moneybookers_5138738b54f0d4bdf7c72780db651abc'] = 'Abrir una cuenta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_41992c760318e60740f7a9b2819af191'] = 'Comience por abrir'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c0302a6fbca061af831bc12f06cadb2f'] = 'una cuenta gratis'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5ac14a97f40e4aadd7eb202f7c124b1'] = 'con Moneybookers:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_3513f0ecb96b6c959454534578ee1404'] = 'A continuación, haga clic aquí:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_64d37ad3bf2f0aee7c8a321321c7e9d9'] = 'Ya tengo una cuenta en Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b0e8c8326985417a5efdd6649f02e385'] = 'Gracias a la asociación entre PrestaShop y Moneybookers,'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5086eeb1bc1994c5abf945fd79d4246'] = '¡obtendrá una tasa de comisión preferencial!'; +$_MODULE['<{moneybookers}prestashop>moneybookers_68db2cda800ddb2ae307c60b0a96252f'] = 'Solución de pago en línea de Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b9c758264b134743b13a85ca4055c629'] = 'Estimación del volumen mensual de los pagos realizados a través de Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7d294d4900ff1a38f5b0a89612916eac'] = 'Para los comerciantes que sobrepasan 100 000€ se pueden establecer tarifas especiales.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_11c8ff1cde03aa19406dfe5971b92553'] = 'Monedero electrónico Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_223b661f7b13d33498a9274bb10e3538'] = 'Portal de Pedido Rápido Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_f284fe53995a4cc2e1e099cb1e511ec8'] = 'Validación de cuenta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c5093f03229416cc06a625654429d7f2'] = 'Su cuenta ha sido activada'; +$_MODULE['<{moneybookers}prestashop>moneybookers_bd8df5ae85f76ba759fa979ada8566ea'] = 'Necesita'; +$_MODULE['<{moneybookers}prestashop>moneybookers_558b256c79bbcf473cc7347ec1ca9d54'] = 'validar su cuenta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_61725fab1e3a4ccf8388c89bdc93d7c5'] = '¡Cuidado! Asegúrese de que ha sustituido el correo electrónico de prueba «testmerchant@moneybookers.com» por el correo electrónico que ha utilizado para abrir su cuenta de Moneybookers:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_71b5b9efebe9c2f73fad6dd1849b4312'] = 'Validar mi cuenta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ece6bf0de28bb0442df6e3a1fd7657d4'] = 'Si necesita ayuda, lea la activación manual'; +$_MODULE['<{moneybookers}prestashop>moneybookers_0b65457508cf73c9ed8c96f56b8910ce'] = 'Validación de la palabra secreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e44efbda9396a5641d730f0ac4866e52'] = 'Su palabra secreta ha sido activada'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7360d9333103eec04f2d91fa513a1f46'] = 'valide su palabra secreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7986dbc3b2bf0e8f72a328c094981836'] = 'por favor, escriba la misma palabra secreta que introdujo en su cuenta en Moneybookers:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_22f2d26badcc700d11b93f57dc96d386'] = 'Validar mi palabra secreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cbcd58fce9759ea6e84c86ed92a3db44'] = '¿Cuál es la palabra secreta?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ef3cefa901bd32ea6aa2d0f6900b7725'] = 'La palabra secreta es diferente de la contraseña. Es utilizada por Moneybookers para cifrar de forma segura la transmisión de su servidor.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e1674c7b15040ce09b9615714eb3e787'] = '¿Por qué una palabra secreta diferente de la contraseña?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e2571078c4c457621378b3ae187771c7'] = 'La palabra secreta se utiliza para reforzar la garantía de pago.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_f47e1a59732792522cefc5c2f2fdc181'] = 'La contraseña sólo se utiliza para conectar de forma segura a su cuenta de Moneybookers. Si cambia de contraseña, ésto no afectará a su palabra secreta. Por lo tanto, para proteger doblemente sus datos, se recomienda disponer de una contraseña diferente de la palabra secreta.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_4746f98d01ce62cd5805981a289d182c'] = '¿Dónde puedo encontrar mi palabra secreta?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_72d809da732bc81a8a81fede00831836'] = 'Una vez que su cuenta ha sido validado, vaya a su cuenta en el \"Mercader Herramientas\". Allí, usted será capaz de definir su palabra secreta.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fd432cdfbae76a7ebde57e6fa44ad90b'] = 'Marque los'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cf189f988336fea71f05010d1525be9c'] = 'métodos de pago internacionales'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8298231c293193e2ab9ac388106edac4'] = 'que desea activar:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b119e159b6f2d56f8ddead2af4561f38'] = 'métodos de pago locales'; +$_MODULE['<{moneybookers}prestashop>moneybookers_542725fe3d40df98822aa76779462d44'] = 'Parámetros y formas de pago'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87337b7475d1287ff99aaa30446b3bb7'] = 'Página que se muestra si error de pago:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ab67f0d68dd6f5cb407e04abacd06120'] = 'Ocultar el formulario de acceso a la página de Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_554fd8768f165251646ce21ba4998208'] = 'Modo de visualización:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a190bc880b04cf478e0370d1b315a5a3'] = 'Todos los logos en un bloque'; +$_MODULE['<{moneybookers}prestashop>moneybookers_852d04b5f455aaf5264e9a8c561ced71'] = 'Un bloque para cada logo'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d4dccb8ca2dac4e53c01bd9954755332'] = 'Guardar los parámetros'; +$_MODULE['<{moneybookers}prestashop>moneybookers_27266fe4d37bf06589c7c6dbf2d5c067'] = 'Pagar por'; diff --git a/modules/moneybookers/fr.php b/modules/moneybookers/fr.php new file mode 100644 index 000000000..170879205 --- /dev/null +++ b/modules/moneybookers/fr.php @@ -0,0 +1,74 @@ +confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{moneybookers}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est validée.'; +$_MODULE['<{moneybookers}prestashop>confirmation_15d18c17d7aef219c342bb0d81e823ab'] = 'Votre commande va être livrée dès que possible.'; +$_MODULE['<{moneybookers}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toutes questions complémentaires, merci de contact notre'; +$_MODULE['<{moneybookers}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'service client'; +$_MODULE['<{moneybookers}prestashop>confirmation_df194447dfecf36bb8043bd8d94feed3'] = 'est en attente.'; +$_MODULE['<{moneybookers}prestashop>confirmation_047e219d25b398033511b18041dbfd7a'] = 'Votre commande va être envoyée dès que nous recevrons votre virement bancaire'; +$_MODULE['<{moneybookers}prestashop>confirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Nous avons décelé une erreur avec votre commande. Si vous pensez qu\'il s\'agit d\'une erreur, merci de contacter notre'; +$_MODULE['<{moneybookers}prestashop>moneybookers-currency-error_6484c945379d81c37ac734c9768605cf'] = 'Vous ne pouvez pas régler votre commande avec Moneybookers car votre devise actuelle n\'est pas autorisée. Merci de choisir une autre devise.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_6861a58e2be4956b3f2fd6420fe6c28c'] = 'Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a356736cbcf740f8648d71067fca090d'] = 'Acceptez des paiements de façon sécurisée par cartes bancaires (Visa, MasterCard, CB, JCB, Amex) , par virement bancaire et par eWallet avec Moneybookers/Skrill'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fa214007826415a21a8456e3e09f999d'] = 'Etes-vous sûr de vouloir supprimer vos paramètres ?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_088b74050a381d98fca38d5990b097be'] = 'Vous utilisez actuellement l\'adresse e-mail par défaut du module Moneybookers, vous devez utiliser vos paramètres.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87ef564ed1574eda7e77b4012eef0b85'] = 'Serveur d\'activation injoignable, merci d\'essayer ultérieurement'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b863542eebcb27fa230b647b5dd07819'] = 'Erreur lors de la validation du compte, votre adresse e-mail est peut être incorrecte'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d70c5b5767846906e0abe68498db887b'] = 'Activation de votre adresse e-mail OK, vous pouvez désormais valider votre mot secret'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7757ea03f2a0893e36c7916a2ad07ef8'] = 'Le champ e-mail est obligatoire'; +$_MODULE['<{moneybookers}prestashop>moneybookers_aa1c444c2ee2f620d5b349fedfa68ba2'] = 'Erreur lors de la validation de votre mot secret, vous avez dépassé le nombre maximum d\'essai (3 par heure)'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cdbef58d093e0ff38e13686a669e9fee'] = 'Erreur lors de la validation de votre mot secret, votre mot secret est peut être incorrect'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cd1dfa342c3c11c17ede212e6429ca01'] = 'Activation du compte réussie, mot secret OK'; +$_MODULE['<{moneybookers}prestashop>moneybookers_2e531f9ad978a2a1a88a00ae0d4dc78e'] = 'Le mot secret est obligatoire'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a9dd80641753cafc9c967e317ba92a28'] = 'A propos de Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8342dda89e8c20bb92916fbe052c583a'] = 'Profitez des tarifs spéciaux que Moneybookers offre aux marchands de Prestashop !'; +$_MODULE['<{moneybookers}prestashop>moneybookers_4f4c1b5e5d775709e08ccc3afad1a5c3'] = 'Moneybookers, géré par Skrill Holdings, est un des plus importants systèmes de paiement en ligne d’Europe, proposant plus de 100 options de paiement et 41 devises dans plus de 200 pays et territoires. Plus de 80 000 marchands utilisent déjà cette solution, parmi lesquels eBay.com, Skype et Thomas Cook. '; +$_MODULE['<{moneybookers}prestashop>moneybookers_acf2b73b741f10cd1e0d075ed43fed39'] = 'Avec plus de 17 millions de titulaires de comptes et plus de 15 000 nouveaux comptes chaque jour, Moneybookers offre aussi l’un des plus grands portemonnaies électroniques du monde. Vos clients peuvent également régler leur paiement en utilisant seulement leur e-mail et leur mot de passe grâce à notre e-Wallet. '; +$_MODULE['<{moneybookers}prestashop>moneybookers_76264fd7352f803c63396bc27b0ee893'] = 'Moneybookers change de nom et devient Skrill !'; +$_MODULE['<{moneybookers}prestashop>moneybookers_5138738b54f0d4bdf7c72780db651abc'] = 'Ouverture de compte'; +$_MODULE['<{moneybookers}prestashop>moneybookers_41992c760318e60740f7a9b2819af191'] = 'Commencez par ouvrir'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c0302a6fbca061af831bc12f06cadb2f'] = 'un compte gratuit'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5ac14a97f40e4aadd7eb202f7c124b1'] = 'avec Moneybookers :'; +$_MODULE['<{moneybookers}prestashop>moneybookers_3513f0ecb96b6c959454534578ee1404'] = 'Ensuite cliquez ici :'; +$_MODULE['<{moneybookers}prestashop>moneybookers_64d37ad3bf2f0aee7c8a321321c7e9d9'] = 'J\'ai déjà un compte Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b0e8c8326985417a5efdd6649f02e385'] = 'Grâce au partenariat PrestaShop/Moneybookers,'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5086eeb1bc1994c5abf945fd79d4246'] = 'vous bénéficierez d\'un taux de commission préférentiel !'; +$_MODULE['<{moneybookers}prestashop>moneybookers_68db2cda800ddb2ae307c60b0a96252f'] = 'Solution de Paiement en ligne Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b9c758264b134743b13a85ca4055c629'] = 'Estimation du volume mensuel passant par Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7d294d4900ff1a38f5b0a89612916eac'] = 'Pour les marchands au-dessus de €100,000 des tarifs sur mesure peuvent être mis en place.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_11c8ff1cde03aa19406dfe5971b92553'] = 'Porte-monnaie électronique Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_223b661f7b13d33498a9274bb10e3538'] = 'Portail de Paiements Directs Moneybookers '; +$_MODULE['<{moneybookers}prestashop>moneybookers_f284fe53995a4cc2e1e099cb1e511ec8'] = 'Validation de votre compte'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c5093f03229416cc06a625654429d7f2'] = 'Votre compte a bien été validé'; +$_MODULE['<{moneybookers}prestashop>moneybookers_bd8df5ae85f76ba759fa979ada8566ea'] = 'Vous avez besoin'; +$_MODULE['<{moneybookers}prestashop>moneybookers_558b256c79bbcf473cc7347ec1ca9d54'] = 'de valider votre compte'; +$_MODULE['<{moneybookers}prestashop>moneybookers_61725fab1e3a4ccf8388c89bdc93d7c5'] = 'Attention ! Assurez-vous que vous avez bien remplacé l’adresse email de test « testmerchant@moneybookers.com » par l’adresse email que vous avez utilisée pour ouvrir votre compte Moneybookers.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_71b5b9efebe9c2f73fad6dd1849b4312'] = 'Valider mon compte'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ece6bf0de28bb0442df6e3a1fd7657d4'] = 'Si vous avez besoin d\'aide, lisez le manuel d\'activation'; +$_MODULE['<{moneybookers}prestashop>moneybookers_0b65457508cf73c9ed8c96f56b8910ce'] = 'Validation de votre mot secret'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e44efbda9396a5641d730f0ac4866e52'] = 'Votre mot secret a bien été validé'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7360d9333103eec04f2d91fa513a1f46'] = 'validez votre mot secret'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7986dbc3b2bf0e8f72a328c094981836'] = 'merci de saisir le même mot secret que celui entré dans votre compte Moneybookers :'; +$_MODULE['<{moneybookers}prestashop>moneybookers_22f2d26badcc700d11b93f57dc96d386'] = 'Valider mon mot secret'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cbcd58fce9759ea6e84c86ed92a3db44'] = 'Qu’est-ce que le mot secret ?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ef3cefa901bd32ea6aa2d0f6900b7725'] = 'Le mot secret est différent du mot de passe. Il s’agit d’un mot à renseigner qui permettra à Moneybookers de crypter les demandes de votre serveur de manière sécurisée.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e1674c7b15040ce09b9615714eb3e787'] = 'Pourquoi un mot secret en plus du mot de passe ?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e2571078c4c457621378b3ae187771c7'] = 'Le mot secret existe afin de renforcer le degré de sécurité des transactions. '; +$_MODULE['<{moneybookers}prestashop>moneybookers_f47e1a59732792522cefc5c2f2fdc181'] = 'Le mot de passe, lui, est seulement utilisé pour la connexion à Moneybookers par sécurité. Son éventuelle modification ne doit pas affecter le mot secret. Ainsi pour une double protection des données, ils vaut mieux qu’ils soient différents.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_4746f98d01ce62cd5805981a289d182c'] = 'Ou puis-je trouver mon mot secret ?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_72d809da732bc81a8a81fede00831836'] = 'Une fois votre compte validé, connectez vous sur votre compte Moneybookers et rentrez dans la section « Outils Marchands ». Vous pourrez définir votre mot secret.'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fd432cdfbae76a7ebde57e6fa44ad90b'] = 'Cochez les'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cf189f988336fea71f05010d1525be9c'] = 'moyens de paiement internationaux'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8298231c293193e2ab9ac388106edac4'] = 'que vous souhaitez activer :'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b119e159b6f2d56f8ddead2af4561f38'] = 'moyens de paiement locaux'; +$_MODULE['<{moneybookers}prestashop>moneybookers_542725fe3d40df98822aa76779462d44'] = 'Paramètres et moyens de paiement'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87337b7475d1287ff99aaa30446b3bb7'] = 'Page affichée si erreur de paiement :'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ab67f0d68dd6f5cb407e04abacd06120'] = 'Masquer le formulaire d\'identification'; +$_MODULE['<{moneybookers}prestashop>moneybookers_554fd8768f165251646ce21ba4998208'] = 'Affichage :'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a190bc880b04cf478e0370d1b315a5a3'] = 'Tous les logos dans un même bloc'; +$_MODULE['<{moneybookers}prestashop>moneybookers_852d04b5f455aaf5264e9a8c561ced71'] = 'Un bloc pour chaque logo'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d4dccb8ca2dac4e53c01bd9954755332'] = 'Sauvegarder les paramètres'; +$_MODULE['<{moneybookers}prestashop>moneybookers_27266fe4d37bf06589c7c6dbf2d5c067'] = 'Payer par'; diff --git a/modules/moneybookers/it.php b/modules/moneybookers/it.php new file mode 100644 index 000000000..205fe2303 --- /dev/null +++ b/modules/moneybookers/it.php @@ -0,0 +1,59 @@ +confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine'; +$_MODULE['<{moneybookers}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{moneybookers}prestashop>confirmation_15d18c17d7aef219c342bb0d81e823ab'] = 'Il tuo ordine sarà spedito al più presto.'; +$_MODULE['<{moneybookers}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{moneybookers}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{moneybookers}prestashop>confirmation_df194447dfecf36bb8043bd8d94feed3'] = 'è in corso.'; +$_MODULE['<{moneybookers}prestashop>confirmation_047e219d25b398033511b18041dbfd7a'] = 'Il tuo ordine verrà spedito non appena avremo ricevuto il bonifico bancario.'; +$_MODULE['<{moneybookers}prestashop>confirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Abbiamo notato un problema con il tuo ordine. Se pensi che sia un errore, contatta la nostra'; +$_MODULE['<{moneybookers}prestashop>moneybookers-currency-error_6484c945379d81c37ac734c9768605cf'] = 'Non puoi pagare con Moneybookers con la valuta attuale, scegli un\'altra valuta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_27266fe4d37bf06589c7c6dbf2d5c067'] = 'Paga con'; +$_MODULE['<{moneybookers}prestashop>moneybookers_6861a58e2be4956b3f2fd6420fe6c28c'] = 'Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a356736cbcf740f8648d71067fca090d'] = 'Si accettano pagamenti con Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fa214007826415a21a8456e3e09f999d'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{moneybookers}prestashop>moneybookers_088b74050a381d98fca38d5990b097be'] = 'Si sta attualmente utilizzando l\'indirizzo e-mail Moneybookers di default, è necessario utilizzare il proprio indirizzo e-mail'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87ef564ed1574eda7e77b4012eef0b85'] = 'Impossibile contattare il server di attivazione, riprova più tardi'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b863542eebcb27fa230b647b5dd07819'] = 'convalida account non riuscita, la tua e-mail potrebbe essere errata'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d70c5b5767846906e0abe68498db887b'] = 'attivazione e-mail di successo, ora è possibile convalidare la parola segreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7757ea03f2a0893e36c7916a2ad07ef8'] = 'Il campo email è obbligatorio'; +$_MODULE['<{moneybookers}prestashop>moneybookers_aa1c444c2ee2f620d5b349fedfa68ba2'] = 'convalida parola segreta fallita, ha superato il numero massimo di tentativi (3 per ora)'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cdbef58d093e0ff38e13686a669e9fee'] = 'convalida parola segreta fallita, la tua parola segreta potrebbe essere sbagliata'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cd1dfa342c3c11c17ede212e6429ca01'] = 'attivazione del conto riuscito, parola segreta OK'; +$_MODULE['<{moneybookers}prestashop>moneybookers_2e531f9ad978a2a1a88a00ae0d4dc78e'] = 'Il campo parola segreta è obbligatorio'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a9dd80641753cafc9c967e317ba92a28'] = 'A proposito di Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_5138738b54f0d4bdf7c72780db651abc'] = 'Apertura account'; +$_MODULE['<{moneybookers}prestashop>moneybookers_41992c760318e60740f7a9b2819af191'] = 'Inizia aprendo un'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c0302a6fbca061af831bc12f06cadb2f'] = 'account gratuito'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5ac14a97f40e4aadd7eb202f7c124b1'] = 'con Moneybookers:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_3513f0ecb96b6c959454534578ee1404'] = 'Poi clicca qui:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_64d37ad3bf2f0aee7c8a321321c7e9d9'] = 'Ho già un account Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b0e8c8326985417a5efdd6649f02e385'] = 'Grazie alla partnership tra PrestaShop Moneybookers,'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d5086eeb1bc1994c5abf945fd79d4246'] = 'avrai un tasso di commissione speciale!'; +$_MODULE['<{moneybookers}prestashop>moneybookers_f284fe53995a4cc2e1e099cb1e511ec8'] = 'Convalida account'; +$_MODULE['<{moneybookers}prestashop>moneybookers_c5093f03229416cc06a625654429d7f2'] = 'Il tuo account è stato attivato'; +$_MODULE['<{moneybookers}prestashop>moneybookers_bd8df5ae85f76ba759fa979ada8566ea'] = 'È necessario'; +$_MODULE['<{moneybookers}prestashop>moneybookers_558b256c79bbcf473cc7347ec1ca9d54'] = 'convalidare il tuo account'; +$_MODULE['<{moneybookers}prestashop>moneybookers_71b5b9efebe9c2f73fad6dd1849b4312'] = 'Convalida il mio account'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ece6bf0de28bb0442df6e3a1fd7657d4'] = 'Se hai bisogno di aiuto, leggi il manuale di attivazione'; +$_MODULE['<{moneybookers}prestashop>moneybookers_0b65457508cf73c9ed8c96f56b8910ce'] = 'Convalida parola segreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_e44efbda9396a5641d730f0ac4866e52'] = 'La tua parola segreta è stata attivata'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7360d9333103eec04f2d91fa513a1f46'] = 'convalida la parola segreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_7986dbc3b2bf0e8f72a328c094981836'] = 'si prega di scrivere la stessa parola segreta che hai inserito sul tuo conto Moneybookers:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_22f2d26badcc700d11b93f57dc96d386'] = 'Convalida la mia parola segreta'; +$_MODULE['<{moneybookers}prestashop>moneybookers_fd432cdfbae76a7ebde57e6fa44ad90b'] = 'Spunta i'; +$_MODULE['<{moneybookers}prestashop>moneybookers_cf189f988336fea71f05010d1525be9c'] = 'metodi di pagamento internazionali'; +$_MODULE['<{moneybookers}prestashop>moneybookers_8298231c293193e2ab9ac388106edac4'] = 'che si desidera attivare:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_b119e159b6f2d56f8ddead2af4561f38'] = 'metodi di pagamento locale'; +$_MODULE['<{moneybookers}prestashop>moneybookers_542725fe3d40df98822aa76779462d44'] = 'Impostazioni e metodi di pagamento'; +$_MODULE['<{moneybookers}prestashop>moneybookers_87337b7475d1287ff99aaa30446b3bb7'] = 'Pagina visualizzata dopo la cancellazione di pagamento:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_ab67f0d68dd6f5cb407e04abacd06120'] = 'Nascondi il modulo di login nella pagina Moneybookers'; +$_MODULE['<{moneybookers}prestashop>moneybookers_554fd8768f165251646ce21ba4998208'] = 'Modalità di visualizzazione:'; +$_MODULE['<{moneybookers}prestashop>moneybookers_a190bc880b04cf478e0370d1b315a5a3'] = 'Tutti i loghi in 1 blocco'; +$_MODULE['<{moneybookers}prestashop>moneybookers_852d04b5f455aaf5264e9a8c561ced71'] = '1 blocco per ogni logo'; +$_MODULE['<{moneybookers}prestashop>moneybookers_d4dccb8ca2dac4e53c01bd9954755332'] = 'Salva impostazioni'; + +?> \ No newline at end of file diff --git a/modules/moneybookers/logo-cc-1.gif b/modules/moneybookers/logo-cc-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a48fc34e4300fb4293c9ee16764a7824db9eab1 GIT binary patch literal 3877 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 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-cc-2.gif b/modules/moneybookers/logo-cc-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..c461ab996d122f5482c305a41e77b6b460bcbbd0 GIT binary patch literal 3969 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 bDxraJ4dE#x7@DCPx}hA}p&p8%0RaFz6r5KG literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-mb-1.gif b/modules/moneybookers/logo-mb-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed0bcbd829bcd4e370383c4cba309c0db92ce9d2 GIT binary patch literal 3987 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 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-mb-2.gif b/modules/moneybookers/logo-mb-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e011959107bb7bb214356dadfe5923eee4154d2b GIT binary patch literal 4470 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 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-mb-3.gif b/modules/moneybookers/logo-mb-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0ef23346624695b6ff0642a7f75e9cd744991e8 GIT binary patch literal 5117 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 S+_1)s^hSPJV;Kqroc;qW&5#iQ literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-mb-5.gif b/modules/moneybookers/logo-mb-5.gif new file mode 100644 index 0000000000000000000000000000000000000000..c220966f610cf1b1d1e90974afa6b9e3dfdda8fb GIT binary patch literal 5021 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 dDlfL27vI54oZuz>1(7 zz9%Nx+8#^vXptcmO7lMN`)9o8!})lw>s;6Q{m$9#Xm4s3BnBA3PXGY4c=^2g)%MIU zD%-L$Gl9al-CbRIHw8XkUJDBg&-zDa{+Xk0-I|a!5PC9oczF2z`}Y;)<-05_gb#cA z2Hq^MtU5V5{`t9ZI5c#*%!|i=@_VxDN7mMg>W)VZ4J&mqU*;A{%bWLl#>0gP@g^<1bh$G0=Pk$a$=T?0SJplbH$3gvcdBk|eLlbV z!#g-3g55JPJlFK$N9N7pc{>lWd+_hq4THnu>buJ4mw#71n*4q_cjYPb*U;#ic;U2f zlJnuGgyO%)XXX-~&o%YE4QTmTZE>Kg>E*Y`3j--?Kko|4e9wH{;ZQZP#Bn<}r(-d` zxJuB?m3$kwI4@`#oC>IYoABt>YGy%7ZIY0Uk(e?TF z)U3J1m;u8%KX5W9HSIy_y@C zS!mk6U-Hzs>g9)oAV%*kK|opmHRp(S?+D3o=Ew5do~)8v4KF0+>IwJztnz#Ndq)W= zZC00`svD-y=i&6tS(1T-%Ep&gWur+!7aJS6G^kxeC zyV<#pF?_45ZHBvoe_T@6QYT9!l7G|je-DinqnDx4T z-GZXFi?G(7LWk<&jx@#XN8ff=mvm*ygr=%Gx{|>4lu&~>8r8Zt3yING>>=|(7Sg|0 zSwqz9fJGRjr;{0F4rtg%nPN_5qHf4$|KR9QrFsg4_OsJw+}l#wG>suAY;-YBRVlbb zmJz896>3$JHaLp!I$$x{>9yRz38yTiqeMfGnrO zD{@LPq@dfv!fc}p4O^yI1#V%ayxinWSq1Y|hDsWnTT>tN`R~h*k#pV@HP@p1tO*X# ztpL|DEonHGyb*bnQ8dB*pnOvm`J(77K*r}BlIYMHFRbX5qVEI@+)R~cGi46?&=Znw zvTT7_DIU8$9+1XdZO2R29wO_nvLm)AE_su-o(%#(h(kEbf2{D&olxU7~bt2k8Y$_@a{uw65O!Qqyzv#3H44AQzIsZg29#ndM( zkThgE5x>P8U!35UaW*yYk7IZW#{xG+%(Ct-qwlxv};71`Uzg$=2q1tx23n_MIY}jl&o$mm5jiTuWXJhuWTrLv_z! zFRhcz8DBp$vzH7n_s}p1o2%Urf@b9HnS7@bnQli?d6Hg_Mt2V8|gQr+}$kVZ!_p+rMoP7D}x^dOg~~WLTB=+$h(`; zX-D?Dx;OMt5XjW4$&Od*34uGW+x2R0_j>Zal^h2n{7NrBd!5)Zy-9bcY$8x@(7Xl9 zXgzT07@0r@(CcgfTc7A$Q!tDk?U+xrr6uLM7t@bpK}azS+1SqCPD})SDyfhbH65FA zfE(86x~-v*Vp^68glN9Z#q`WHGPqstdqAS z-DnLGlm$q+q5C|fl1~rGy5KsF6Kj7iJjR^C9Yi%Bz3rxK!;(w9Owz`A7i>5Sx769a z&Da@Y(JgCEM6ZqoksX!^xUizqHGxif#1+<_EHPw)oj%jP*MUgwvLrGhYzWab0{zJvXb zqW^AL@4xP)bvc<=y?MW_jB?s}(&~%f7Y?sbYnaPx8xihsV(E_OANQYMeaVxlyR&=W zC)a}2p*#EQ?s=>+J^b|$my&BM4)6Qy^JaCVzQ3;W%=6Fwzg9<^WgZAF?jxRB?JYpU z8r9f6z3&_%UnQMu!@^j znyPj)!t3~^Rs$}gwKgi76i0(9qATgy2C1u(3p=1_8epZC{%)OV7*g}PV-`mhTI+XvN09$cMo8tA&fIsd#>n>3+9P6cO2>xlP=} z0jIJ}I+V=dPYJ-1N)*@@WuQ8NfPh5o^zIv*j;oM?Aukm~5^?F&k&8*rKFAYT7bt~< z*Vssu57E2 zy=#p1AqHGb-ta2F);c&$9vWe z<`*YT&oC5bHfRVCv`Dry90DdL&#Eo>b1>U}O(plMg@z zqL=E_zA|C{1onFox{;mIDpdEigVGca{o<1!^Wp8{Ko~-twS&o1I}E6>f~TKmvF14s zQ%(%RIMFQC2DYZDWF*7tBjLzNH+_45`wocc0asno#cO2zlLY(nE=>oa{lys%US4|S z2Ghb!wg5Q93*S|jO+sI)M|5&S151s#RB-f9U?0ps7&DK&x6WS}6@v>+Nmnu4;U zb$a+*0)!Zw*-vxxHf&8TMjV)o)y)i5?WPAyPjX0hFpHs9K*7aR@o|7uqyYVw1eW@X zii;8<^BE{75z-01dWfgyln7@oV}HKL{Ivk-+i}5Cb$t<_Zw&7hs52tdBo6QnAPh%7 zm{J1t$Rlt9OaHToFdZ{Zo<^<~BntH+4I+9xkfR8E;73a-CWm~NbTP-fL<>$2&DJ%6 z>A@N6=m*eI2MVZouVAFT2m?h?E=_2=h;TwG+FmSWPs4^#@#jnd4Ab*Spp@4~52z>y zARiKPkrGNyQ%e5v;En&*CmOB8v4M{pr{|bz?wIf^7~HICsF^@9Bh_%xMc1g-D#Vlw zkebZVaYsyYlFjg@e2|b8?6VmTr>Rwm&|DFk(~QlP2&7H|n2KifNinL3iVjG`n{*gVd9 zem@G|jw;2_RgCVyx{6HUgj?9G5u&BA(olE882op0IZtee_6`wuWK@h@a^b`FrRry+ z^CisNNq5M#{LFoxFgOwbN$6Ral^u41blBP~K$oAOsgtpoe#ua?CoX8%8bo Rv=AEk3QdrBA_xK&{{cH2E-C;3 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-mb-7.gif b/modules/moneybookers/logo-mb-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfb1bdacdb291512b88119443ff27b1d7840d813 GIT binary patch literal 4428 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 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo-mb.gif b/modules/moneybookers/logo-mb.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e6d02f5c44df1285adc58de66f76c76ab125983 GIT binary patch literal 12201 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 EKbp{#W&i*H literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logo.gif b/modules/moneybookers/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..bcae52801abdd11b663995e89fa24baeb47a271f GIT binary patch literal 585 zcmZ?wbhEHb6krfwc*el+|NsAg|Nj5^_xJDLf4_hK`St71ub)8p`^V2;-@pI*{N?+* z4`1HC|MK?T=eKV^zk2iO<*ScRpTB$h;@#6{K=k&>vv-f5zJ2ic&BMoU?mc{c@8PR^ z4_@E6^ZeHB=htpNy?W#6m77m4U3+xt+T)8?9$mWf=-j0T=Po`tbK(Bk3-?c-zjx}~ z-IHg5=+4now~n5=edOfLqbF}2IC_2mk?VU8UEOo=%C7yFcka8ibKm71doOL@dvV+D zi(7YH*s}BdrtRm}Z#%Po>zNH(&#v2Ydfk>YYd4=>v+4Beji**^IJt8DiN&jq&RcqD z_TmEz7VTfKaR0Qqd%7lX%_(1$UA8EzbYWKMg3Qu|nLx5+L3;80^rHExh4WGi<|XIP zP062|oHr*SXLelntoZC%aapsR0@@w@+8lh_?0j17eOiGb#y~xw_>+Z^ogs}u2V^8D zP8isiHTa~&#J0Az$ENtCN-*^GPv{d*jhHyCKO%Pe^i~FT2G$82eUg3gfpR)JvW5bt zf+oxk#*Wp*{bGLF1i;@;r5LHX7@i1KUpo>jqONJHuN^h~Y2^)GQ XG6*)b8hIbeacs%xmQZVCV6X-N*OnY} literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/international/amex.gif b/modules/moneybookers/logos/international/amex.gif new file mode 100644 index 0000000000000000000000000000000000000000..24b98b119380752e4ff83aa67c1c3cc3d0f44204 GIT binary patch literal 2462 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 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/international/jcb.gif b/modules/moneybookers/logos/international/jcb.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d992220cdaa537c69f71e9e9b2e00c75e4f1f2b GIT binary patch literal 2084 zcmbW0{Xf%*1HeD#AvA^bxSX*2B@#Dwp>MD=F zu(Glumn)W*mPBI7^767!B$CQx5{YziQ6-j01OlN_`JKNYkjdm~wOXN2s#I#__wQ(Tb#%G+&!IY)-Rv+{be`{?#OxU>8H zksZfuir`MA@B@eLOjvm19e&0-dT8J5SbwECpc!fwj)xIpF4Zu-Yp*t5cy_cFmI84T zizV64M>b}{J4(uR(-2+LG`T_{5{a{)kBY=%l}hD>egAHT#-8P%DTF8Q3Cx0O%pifw zeE!0>sp-6iLDmdgp;64_*9e6o z{=x#4#x5XGGDu@3rJXDmoB3^u&E{mi7!?SGWg`UP_+&;Op^8SZN8$wIliduFM5P#d zRM2w%>XpBK#Rf-2wkD2nnclc0c4se7$@>%%Pda~9C=}j9H7-y;j=k+(eA><&{*cg2 zr_T2`jN@r+N#g|mlav37RKW;N;9R^Hk>8c}da`&lXK=p%^6SKDXmnb4Esal$h_9`9 zIeLjOimmAKZ#;LcGjZ}}=GnGDDH@0W)FjBo4TW8&3z?g5cX0D+=DA!Uk<5}Y=Ul_b z+(WzA?Lp_UJre@F&uM{B^dcp#A@cXRIdLE{kuXL`ZD;cM`~r6%YQ6F%@mS~+g;JUDHs-|1 ztSKq8X`(5#DRE{&Ayq3rwzTz}z2*+fc!#Z!4veVe^3lhYU9A2^xm=iw8{p6|AMdC4 z)G{1TNfwtVpE zq_z+S@~ynH!O!}s#@V3zMSHqm)(sa!E)G>7TI)|@qwWQ)M9!s-RC}fyTKcv8$ zc}KDEt$b@L0HCzj@9-m&B6a@Ur1)+VkjWT`GtgN*kd;*m5pL<}-Aw*aX@?-AI_d|5 zS_jm|I=1~sYPDI-3IBNDII_Eje_@2;!5qn~#Mxk0Pw3Omc8KEwt| zg{Y^}A>QuxI$My7nO&0zQaLRWgR~%Cx*aOEw;2!-o^XnV7+g~LX&k*~hPV+}C;_hR0 z?EFxc>pByLyFqr8{YEc)z{qR6wuYFq-AeV__(T>Qi6((tn`N#@`X|49h0o!?fJa02 zgLh~BkSQ2jBjo57J9wF2hEa$%Xpi%2`rZl~gKeP@92HW;w#wNNk9uTa!w5Q)VfiF-b|(9$B)0+B#^sg@$i5f{&Yh$VTV$!K ztgpJ=lyMiAKOIw#Cp4Ds#U4W~48i(fQLoETHmvaIvAwXt!wOa4|6 zag$^8U_s7mr3K1*{!c}+{;fP+R>uBSHRmkSQ)ztT;18Vn%Kv^Yn*f4WR}|IO0U$F@ z^V;f)>Qw3`UZa;4KzeIl00Jb8&kkdpERg9 z1t!3|E2vd3>Z*0}AvE4B?sMKjKUQ|gd;FF+Zd!Ul;+#|y)Fv{Va=_ne3n-!cWb_3z zm@LbUM-wc#ZZN|YWUgyynrBrF>gbXz9|f+pT8E$>GnZr1!4Ez0Box$LUVuT@?y^S= z`i991AES@?V&hT%f5;!#fa@G!h@rqTc@Zugbb8Y3p$=L8goLhhx{MeOo0Mb8MY}iK z$+ex_SjFAodPoN1{RMMH3Dqwe(n1<4!f1g;(e;NK5FcX06lL`H^{zO?qv+sE;J|Gt sw*kb*8)b?Lo?nCe_%r`K=$Ty()^Ke)V&soWMHS~N>bQfcmNDS*5AVrO)c^nh literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/international/maestro.gif b/modules/moneybookers/logos/international/maestro.gif new file mode 100644 index 0000000000000000000000000000000000000000..3df6433e3282c7e9773b4f4da0fe55c53c7513e1 GIT binary patch literal 2021 zcma)6`CrnB0{o)pNlMnMw(?3dI-Xf>iN~sCDVnWT+Ll>rz3nc1Z#%UT!~>PGLy;v@ z6t6te)I3rXq!f`nqSo?6#N_yLqg)>A{s(V2zpa6tNY$Wh+KrIIr78byb zEzlgZ^urAi`|&dsSc8jVNOX}A4a|WCY#~&!C7tFl(MGlJBP!yDjH9$XD??oSN2*2f&zh1+tgk?uHZ~^ zKO@gPW=s2+Lw46oY|AFVucI0|!#A5Qjk!)db6tHaxh$~nSbsSIM3zDj>iJG8YG(e$DbuZf0Pt_muFQm^k0VNNE9IF>)Z>9 z?;jLYw`j}}!50WDpASlp$BxUjRyS)q>^!xgxS(ZFpj0=FOGDrN$lenk{f;Zk$#1-b z)=OmZ7c&*_=}{4A>7j5?EV)XbvAdX`Sj`e|^ZX&3^}Rqi(lV`n+o~EF6VK^7+Z_F*9L%rQj%BX^xal#4yuo(c`pVK!Jw zZ6N+D?eaGlo6fByPZOeUf1ma!-*SLTY&3OqUggFo)1hr~F)O@~-j`NbJKadR{h>1`n;vypPR%V-!aTY_7xy`ENRZOgr4Fvb0BiJk9(sX@}7_*UM{g zFxL;2`|v^C#G}+#aE3!xklz6LI^()I3Iy;>PYh{crJFgk^ zm_=WE8eolW;LvvFAZ_~KpYjHd?A__w+q2d-F9x}GZ%068|0N}e_VX$e?}K;<;pkP1 zUl%a@{NA6SkKCwPvI!lzuMertSoNdb28yAG)olnX88h{NCfzBMr`p&WU}F^A2@oB0 zq4H9@PcZFXY=kEnmzTZP39BgYAI;oMgvIaLP`rGORmUB|OcN$^(&70Q182uy8L{T~ymG+Z7w`G>^z*>+1cdd%+-SYS6NB~1yB0OP+)y8cPaNOSW3p*AHhDMk z{NlVSZC8q4cocbQab7L$SV}?%=&FvJgoj}hr#N(d<7%vb%v2%_&slV~hXtSHB&}zW zjoleE3u}tWFS4X{@i5cFH)TmgzW_@jHF*;c{nJ)_A=G`f)xMuOsR&k~uT@QnO|DkT^VL(+slPb6EcPE{kF-U>KHuFtji?Ew(oaVjS3@c!CQl-n{M< za%V`fVGIuKv^A(FI8yP9$SQVr?+FS{qGfHn+-VdL#5_h)WS57OZ2zr?dE#-M8M%t_ u6Cn;AIjkTwvr1g<^z@$9)#V;W(1XGbz)a>9L`F#I9+Ut`4|B2yy#5BL`BRqw literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/international/mastercard.gif b/modules/moneybookers/logos/international/mastercard.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1f8f860263d930ab391bfbc322af5a7644bdd33 GIT binary patch literal 2074 zcma)*`8(8$0>;0?q!}Yy_g?O?4H0E&CY_p7u7;5i(sr-37&mpfIXJDB(lD|$wv%kx z_i#`o4QWuuGTD_f82gOb_Z8Rq5AOTx`##V6Jn!>)PkXwfehCTy>;b6&*xcMy)cmxy zwZ%5J+}_?+sZ;`ikj~gpC=_fCm&Imtxjdmz#N+chT&_eSmC0mGCQBp|Gd7rfzCfu| zio{~cjT{SnI9TI%40Qo>%R z(`mFN>B~}C-)Ch{5R=7Hbe`v&_n)WHIH;4dkraiPrCM6%{%kQf+V(Ew(Z~Q%5P4tm z)@}aB__Z79yo&*1Le`dyCugy*xZjZt#(YoOujmh#cM#Xs*M*c3)na>GN~SQ>OZeLZ z32QbYsd8lU>lSC~@tsR5DTkk1kXhE&>*Oo@)L(EriOyi~LvI!(S8Vcl%C80d({Oq5 zPvNmiviA4lS*rYFpqzM)N&X^wg3ox77mLNSSLl+(Zt1JWnXH$kja|%FPQthZuDdsr z#jf$WC8jgxztMQHI6-&MnEeTvh^hKk*d7qUS^pk={(f9~@upyLbNQVhHKRDUxumu! zBd<+0Q>fYjiN%sl<|-zq9$0&;=IX-ZDg}8j*E4bz!;hrx9kaww+zXdKR7ZWj94ce7 zB!wk~(K*hS!o+J737^hSP3NBSuGsev*+}aA!UCmhkar<~wL>TBq-5fSlwhP>e4AtG zDvmLE6rLq{St1B<+94VE|70!)g8)DP*!>y*^AiAM8(4)J`}f56;30btUL9yD?@QLU z)ha^q-1k`jft=ZjiDmX)*7GOYtDWu?5Tv& zQZ!!E#H+1tywW2+VEmVsetfN8rB|`n+xqDS|5o2WkUVt*2(~ZHv%89X3d362qHzs%;bkv?k*zdI|lNv zl(nvpmSLWm-o1@uOxEm4hqBjvao<`3xsm&b?d(xa)WZDc_d?St(pe^d>ODDoW+2Ec zh};<+PZju~7VK?0#FOpyRtwsluH)J_g90!IQg{o=wt9u@=)B@O;Qj3Cb;98C3NCHflukkRyBMN$fi8jF(hFz zTEhah6h)1MP<5=^=oJUd`rU_8S6_JSi)PfN{J=Xo(|rj;bEuN^W6q8wO^1#aS3S=r zsd~yqoF6$B9gM^vT`RDqz|{wg)x5x=!z634ZkZ1hJcdB)oyt$DIuxPHqgnDr{xIlG zeO;3Fi7+x0blFXPtqi}v#i~5zPC*}VIOl*@!P*J~^7GAb8VGcE%~NP*TJ05Lh0qpnA5VPflX#$!a4Bu9X zzC~=SX0gv>ZR$I^hYm?$WdIwly9-OhLA=Y<4C+WXXgCZizaLawt`243jI}6b8af@| z_>@I8xK=sjw1=yHO@e_=o3?guIZQ9%hR$E98QOn4m#Y7Rmtr3QItwk=>XYT!Oz64EbjyBC+{*8WTkjlSr`lsxE~i} zX9WivpZ|9v*kAB_KBa2^vB5##7{T+hsVcpEi%cgQT27sJ^}&A)4*ioTc+o;wJt#zE z>)_1QIw;i+4+n>@D+GBYts2CAsK)sk%RPHNY7XZOQf?g=7K{;Uj?@-Vju^ID+?nYG swGVy?j}gA4Y1N|0o+H17yJ%axKwXUeMjjA_#XMGxx}|G24ggO453lBD>i_@% literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/international/visa.gif b/modules/moneybookers/logos/international/visa.gif new file mode 100644 index 0000000000000000000000000000000000000000..62b6ad35ad79fd4ef2e9b54663ff7e51843e31be GIT binary patch literal 1544 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 SBYCV8U%SR4Vsx|tp8p4oLTs!6 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/cartasi.gif b/modules/moneybookers/logos/local/cartasi.gif new file mode 100644 index 0000000000000000000000000000000000000000..021785bc46b307638800c9257241f5f9559d9c56 GIT binary patch literal 2406 zcmV-s37PgsNk%w1VOjt!0Qdg@v}`)PaV55mbkx+-`|{eIoSgBP7wzuv{jCs^k&^TA z?(p#OB_t+eV_eM4%joIq`{$?n>$?7|5Bt+t>+9@=go69NCCi0LI5#!-&V2l^5d7C> z{Q33xuOa-&G`YCD^S4;^qa)OUIr#YZ>FVo#e0ucs^68a2&2%R9!!otFBY-(FtT-n*z{rKTaOG@~< zJ@(|*{QUbxL__-S$@Hcb+{wKB$SL^n>-X&A`{=Uf<>uMh*?@n2b8>QiqD= z`R&x+-r4>B{qVYjjE#%+s2ZxKqwDJF;o#o*_3`@i?cLtr;Njwoi-qm&?&9O*_^=Y> z#I*M6-sFez5va+tp$;SP+ z5Nm2>W@chpSXcbrfBO6R{rmI$^y2RA?JO%R($dejwzmDZ7Eex1{r&y?{QUm@{_^tk z`uh6&`}^$e?f3Wi@9*&T_V)Dk_4xSs_V)Mg@9*^V_3-iW`1$$&|Nr~@{O<1W|Ns8; z^Ys1w{Q3F${{Q~>_xJ4V?DqEc{r>*m;NbJ~^0~LT`T6+#{rvs>{P*|vN2`}_Lcnk)I|v--5c0xfw$HvC}_wDZP z?fc=;dU<$1K0xyF@~Nq){J|Q!iAlqTTJXSdGB7ad>E-kE?wDFU&3i|=YaDNGZrGSs zaBpvihlZVLPT;D0|Nj1@qo4Kl^yum7`>GN9`R@6z6kuUm{NjoG_wB*LzNMz4rKYR- z`TF_#`Tzg_A^8LW00930EC2ui09pVo000R80RIUbSg4V~g9sBUT*$DY!-ozF4V*YI z(-$s}GHTq&v7^V2AVZ1_$>mEXiUKQr8N{-s%a<@?%A85FrcIV#Dp9ON%8}2XK!XY$ zO0=laqey|0(mC)8qo+`#N}Wozs@1Dlvrhdou+oA>V8e=-03t2xPuEHPQ18r;$8&OJ{}0w z1q2#g`PoqIxb^GUizolL{5S^z=?sYf2hs0L_VehEZ|`m#Q?+AZn%&SMD!u*tx7S}U zWhoF4OQM)(34R2kr{8d)ShCs^vOqAygEK%N1P^#{5J-U-8h4;@sI1b$1RfM&fh#21 z(}4vq*bxB~cw~s*2;N*M+yTl7V&jc5SOSF)!ua8e1QH-Xj{zcxaDh1Cpb*PAPvjB9 zjZiw`Krn4Ikpz@jW(i1^P@bWQ6;6d>rCH{#F)A!o+0OC3G1qf7#V;821dXQnwxmeHIL zC!9dq0F8~DKm!5<5x|g!7~&ZJlMj>>+!Dk9PXh6&6oQzyXbdrga>f}{urLcCPsV_n zjir=;K^B4p(vKjV)YfT@ScZYjs1j)4K?J}GBE=Cy$Nn99QQ1Pc&asU7_ZwBcx$btYn%@9BWDMJx3K!b^mZ~Vc+mR$x?h&(2= zLkB48kh2D`F|@-1Fj4^jA_Wkem_WrIj|75E4-C|>iy$9FU2!9kL@qfdMx2Ap#u9kU zgCLPmg2~sTBH+pfc}PA;4Y$A}dFPaTa0@vY?9spo>NLQ4B)kMe%_W#%5`_-1@47{C>*um?9#f)btk1~~?Bil{YDa?krm^j5cx zcc=gr&k(=`P5^>D^o|l7m_qi#CL|xAVRcxjfifHb3P6lP8+;%~93lYpl!3-=kkOB{kTm-3xr5mgR2~9GB7N7wvDP$u9 zRR9vlG!TMixC=@<_yY#0Q34huU=$emgYJTG58APSS2n^129{6&3jE<3Z74wy7+?ll z{DB*FAV)A@(Lha{X%fm2jwRF}f^o3w2`W%Q1R!7s3yewwWK01Egp-6O%;6q6&_@hx z!3H`czya~-2MxXD1#UvtvYPd* zH6epoN5a;&y7jGZRqH>C%iG@i_P4+du5fWnTa^4G6I?LG1D4C&<~sMe(2cHir%T=Gnt}@_ YF|I%gQr+%)_q*V2ZX+Z@k$?aIJJaC}UH||9 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/cartebleue.gif b/modules/moneybookers/logos/local/cartebleue.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3e5616eee25e26f8a3f8125631d6c5eb721a356 GIT binary patch literal 2082 zcmcJO`8(8$0>-~H4NZ)qMUvwnl|o6%q~%Ivcjr-^TdpItsZ^d)q~#1I#vqbwtQ}(y zIfP6U-!WqBq-4fm7GoB(@AljIBhLHl`#zudm-qGbK8rjS76jM>8aA-i6T7yywz9HP zM^&z_uAV3Iczl6eu2@`LTwY!li6u)*OG1%IDw9bhQmt02R%^r($^5)fsZ{X=^D>z{ z;9+^!DAT=QWSFDCkH}I=$(=(p3dK)frT&@LXtfIqOH0dQvBdS}n}FzYxk3?{)MF~?>YviG#U+yJ;_`S> zsZ2009}Njje|IF{VH#S?oXy^FzMfeh6MR{=7VW*4#p|C*vtP1`+q%VN!1hZiuI ztnTsI<}Xx_U`x4af zvsB2DFMQ`IyJywk=hczbBdDj zFTbZZPAaQ@h&x$om(=!gmdK-YOd?m}$lPyS#qa4Y=yuM1BDJql4+rO zoGqqI%q3O#Z9}F1Rys7m)jB7(gx5_Te*S)5C>j^20v=XmexlOmRd!eY^sT0Tnv$K) zA4nl_ue_tS(4>T6p_ zlzIX=dE<6OAu{u9`krl$x9F6H(w+>9GdKjbOxFMh^|w0)zAx{`J6!22^lq&1&++v` zIfY$I82-~WQSTR@rmE3WulS(RWA(b2N>r&&kxz5=_nM210q+itbiG_3O2+--`=OTF z7%^78yDjnNCRh}^ugJHhZmKO-A!wdF6Pl`nUZ-#FN33U(v0H49E|c#i^knYx4KS=R zwTukTe$`6aVURprd?wZ0zco7I^y_oJ*BKX^XYD^uGayR%SjkydYuH=&4QR;>n5h42 zfLW~dkLpVqx8qN|$Dg1-zj;RfVyrSe9{c^KPBl>@nLg&UcG*4(gI4gyO7TY`Xh-~q zJ9p5UdtMc~O}6VC*I{%e8IUeXXV5zfM=r;MD>onjY$Gq>-m|K`gt-0L&IC*V{eHLO zBM|Do1A?&$2g1NtgF2SFEhMaE2ms&?tQuRP?UINV!0zDKuovvy%3X19{Jy?8I4C8! z@3d^s!r6LYC`nF5Wx1hP2SkKL8aN1d#o7fkI6Bta9CpUmAg>Al2|KN0TUtfxam)0G-QsYp z?bC(MRLu2#yc|gM!nIta74A(5_Nbn#o}JxVgh4rk0d;qba|tRQ2OZIzU9W#S$qINgcM78OawMDgc2W58Z0Ym>S{dK68 z#K*7R5ppVx|H^d3?$ZVd@S(T`DcL|nbZj%Kl)8V(4sjK4IC9q&s&ChAL#9|&p!b7z zx=Zgn?K7g9TD!BP31dK)MICX|>K@g%3;(_Yscui{Z@y<8;eX(zZ(~6;)#&zyX>mmr-O`rr1xULrnHFbbJ$c=~I05%#RrSXPo#jw3z zB)##3Kh_nKA)8Ee;vE2(1%d$g^m4Nbm11oC2zvjCb+gLM#GEkn+IY&9Y)X?RA)TQ5 zF%+`-Mi7qdvea3FxfyISkzu|3N;ZFCkoUNZ#x-s|1#6BL-`;+0~s73>X&lfN!Tl-qcE_XXx}&ORF2hpYh6 zzqQK$SD#jHcf-3sh$hczDC~6iL+NbL%JCqg!XepvAly`uOMzYAc0Mo58pX&PNvm+G z^d7twq{yEbm^=I$9Kaz+>viFk$R6*Z`}vAOo?oTQ7(dan5VjkZ0=jU$hvR4u3XL-1 J9#AN7{QqbeSgQa4 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/dankort.gif b/modules/moneybookers/logos/local/dankort.gif new file mode 100644 index 0000000000000000000000000000000000000000..de16f6b405623aa16c337ec57eacafaf826f84a6 GIT binary patch literal 1987 zcmb`G`#;l*1ICxL!({4oIYr6Ygj_S}g7d9bl=~%4wNkxM$!#jtN&0r$=00+ZINx#^ zDQOj{kdEVSSdmC9%(mEUpM5^t*!8nHo&Vwc{P?_{*ZY^}dAxiMyShc3L^vW8JjC+y zGGJz@)oOJ*om4903l?A)9vd42#GnWOAc+J7Au$Lll}fo>Ary)h7ncMJLWxAGR;!Qy zc9d}Rm`0qGl*(jUNCE)j z{MP!D1;)BB=m&X-X$a`I4dLL zOxP*F$`L%^rIkow_N&|6-5U)|I9XGtk*auS}NdG?eJPfh3Md;5%k z9v8c~%Mz|smREqT`;&gZ4(>Z7jfxu^9g`RTnVFs;4T}(p0G&cvdap#heV2k(GdDl4 z?&?vsw#kc1FPuLQPq4uMc)(m|8`-cURZzSFfvSw8oc>(z7wLXkuva zk&vJu&4*#WK%iX^s{02!J32po`V9Xw7HF@4$z|vkb zGO8IJi;s;>PD%o{+5zU)P(Y}9fC+)1>Rp=%5HH>&X~w@uFT^|8*hpcP`wwfy;;PC@T190FnG)pZuN5pPDyoJ)3`s&xh(sb;>_xzOyM%CNG3gfkWfHKk zt0*s*Mqb$Eyn{j_?b*3g5_I%xV&eC$BL3gPs*o!X2p+=WU+}-5K%kZp{f1`IWO7Fe zYMtFFMm?=7W0fQNf$Q+0Z2Pr4V!tvPs{8UV9#r&=nlvM-o}VYS{bkKy3GVE`1E0o6 z0r!sh20KI`DMJv82zcv$}cUZ(C`v>pv?ZbzI}AK9e--D>BY?7B-I}WX&KKWx_po?>)V?fxP5oB zlH6qRz2w1Cm$+$W%ayq;PUr6Ypx?5{HKQ8Wo_YWFb*#nAK}2al>l=X8d_`!EA1oHm zJX`lrU&o@@PQ0opC4Bg=YW3>jYQKuW)9x>$%$exgI|8H2?9Tp%Wu^&5Q&ST}94N%%?wrhGQre7kcP%D&cwon<@8|0NrNAL+=$>)$}4 zJlEdn-*x)cp3Xx5T!fyBsArg0RLCS$=jvuNzvVhE%zaz;OXeE9aSN@%+}4|&p0Z~J zp``|KGNHe^&!u-K_9w+;RTZ-zd7y#!nUqKLGgN%dvzN;QPfFV8eF4sAdG~}wfBzH~ z;zsl1SUSCpYSHk&4|Oao@G(4^=*o+t{M@PcQ)e9`GS60e_Lc>3}Cd`1(V-vbRBLWP9kxJ34!$`ehK%L zv_zDHlW2z8BZHfMoVs z!Kqi*{l6TryDVw7B-mWYc5jcqPC4dX$IWtxUuG+2NCs^yTt}I^2d6SyOM2rA7+59u zwgGn7Fk{Q-Oqa%rDlytutO2g$u1jJ+V z&28A}u1wmh>x?dQHI#uzN3O24#pc^Nurs~=tJanz?MX-Hc&V3CyYu zO^lxH$&&1FG`!|#c0ERyyL#<3{sO%bBTa%DlT5Ieg%#2hnWlqJm6>TY}wAJBQX_^taMTXi` zV{lS3E?Jjd8}p58m~tzM!5Ejh_`bQ{U1q00Vc%ch^PKaZ=fwx(ynZ};3UCD$5`dMJ zmDSZ%;BGhM;ASuwmY0|1a)m%B((CoGSOUSYL?V^SWD12+ERkrnTD4lUxCkkgDxqjm zCX;V>L@zBZDOD=1PPeqQtTxsfZR9uGw|WJO#S&dtpWI016iJSqRpmbPE&uRy*+?pD z<~EB5!{XcRJXkE29zV2k?~_4&cOPFMgdli|%T4}z=Z2hK&g9hO z)HIjN6N*H}L83)SC=_vLc;gcsM=CqiH*^t#P7;Z;bMrjj9A6-KIlO?3xGuf-Kp+%K zaK|;3b@D9gm_Vw?F0?vdpzG>If9DKA(AAbH2o^8R%-sTKZZWy+d6^=+D1|vKJ9lM) z&zEIVk5-O;L+vja5~hMPj)m`1BTuSc)MR(@^dn=k%z|eF{9tkk?CiY=!J9%ZLQ1XC zA@G0Vq%$)CfCRwh3-sj^z`{UEAX8A*=^6Jjv$At?@8{h|QK%F*cVFAb#ZR6-qm|H0 z%SwIS-3rNQ+*(F;O>N!l`o9_)n;1BBAv$Pd8xv%;cXW1j_q+vzS}5)|1A{}uBOgAF zj(z$(;!Z*PY%ppwdRj0V7R~vvu?VS5u28Df8m&&R#*&>;fT@)Op^k3udgc%&`fb8j z$ZyXF5}p#m%eGMLzdt3NsU`K~p#!oUbPMSuD&`oj5-jK-J#vp}TfeWq;z+)g_Y`M$ z#F4&|UD!GXH=-iE*oT_Tw#46!cpgJqwH+T847~_`oD6`CRb#bhI*Rj)3!KBN_6MZ> z(m%S#%0J35(PxfDUCgof&p-uXuh&f1T%GA$!8Tv%b2d9MSM5#jU$>L^aU*S8k~Fp{ zJ-mYOMhlVb0AgU9OY?qV)8o)9L>DkVe6TE!_S@y;rW5okEYtd@@dKa6+gdA7`TsUf zJ&H)`w-!g5bAZ9}kdmXVdP{mNf$RBR8vuAXwr3j>p10@}!<&5Y12p~3`j%gluZA*P zlUb@oW`^Wc>Z;-6B;SMt!Fb|rQ#KxbXN_AD?M{T#OFBj8NhtlpZ_=+leFuWY$~d4M z>qP8$=+&NPcQCQU)T}|k%XaU^#8~+~ke*wI>-7Wf<8slnd46pI653^LTx^cVYHYc| zep@nv7ve3)Q1kG_&%FEu+qn4$!4GYBqA2)CLr|%ZqOM=pSJ6~Z?5$4Fil)cqpdSn#llJI%PFdAXCbR)|T zCH3zc1HzJ8Hf$!JxWjtIXcCF4>V8K$C(?37W{kfV#zi({OdYEhT)PLV>!j`5LoQGC zhw9mDCn#u-i)gsv1MxE47|Jg0yjE_V-`&Vf4}s0d4cA!z2r8uz?x~2g`1X}W_Q%f#``JR%E{VZtewrri_{r~^}^78ZO>FVY; zGy3}a{QUgw?(gjF?eFjK^YirZ@$vZh`1bbq?(gsG>+JOO_37&C@$vHe`}_X?|Mtqs z`}_R&_xSkv`SkVm_V)Jbac=Rwyyiqe?(XmALqPui{S{1%^7HfSXk{2rjpa8o^1ZzN z|NiGhK<(}B2YrV|Ne}q#S~176-|tLn!SXf!P4I85=n~x{{Qfx zp7;0n@1UOIGHn36ith%ywcO&>Eq<( z>FMh1?Ct97?CI+2+S}X|O^l1A!`$88-QM5A(BR+J01JvtUmjQaZg`uqIe z;NbA^@fS~x;Naro;^ec$*yrfz1}D|HZ$i#K=;wl?Vg;FsmDEQpi_IP>t|$on7S%lm3x}L zsk_nfzPuw>k}X`7>VADCSd;wt_h^f=>~e2La-;FMw@!Gcz|G(6?Cj(^W^~lE7;OXv*i1f|O>+kgBG%%&P z&-2U4_4oJ{O^b)2!RF`Zbd|XM{{7S3=cKpL@u#KmsHXYj;#z;K_u1IxMndI2Iq2!> z)!*p%-`?goGUPTfh@`~$DB{rUL)`ugpRi@C_z_W1gKo4v}`;}}ki8BUF!w9WVV`Dlx=7fp;^f~{YJuS|EQ zO?Id3fq(1l?RJ&8@xQ$xRgi_F!+V*##?s#|UY6>Ae0`g|zs}vi&fXSGj8b~3N_3`6 zbf@ZOWB>pEA^8LW00930EC2ui09pVo000R80RIUbn1O=9g9sBUT*$DY!-ozt44gRd zM-VL-GHTq&v7^V2AVZ1_sU^q{iULuTLBO)5%a<@?%A85FrcIV*P*6ni#DdSCK!XY$ zO0=laqey{1(K#^4gr`uWN}Wozs@1DlvrY{%5QP{CV8e4Vpmb&!$VCE)7}%5Y4b-JE$DH_GQkfO?MW}TJ`DBxqk!y{Mxqd+5cu3w~ae@ z@Zru=J6{bPc=6@1k&`gMy}S4C;8R5ZA6|WW^w#4Q_yEto{R@HH+sp4RzBlRKx;>-G zFa3Pz_4Cd5-aqjL*j{}E=mOnp{h^V^bI_sZ*$NZ_Xdrt77I@)z;=$k{4CjUDnE)Vu zR$__H0kI*5@T~~mC?bfkM2s}nNFxh2ih!ezF|y!ek1Q-PBaMaR;^KE19_d{H2Q=Aa z0Z>K>r3p}KPym%CWU1wqT4pI_lus(zU6NuNz+{s(v=R#dlDJ`yECnp10x{-j@C`Yk zu%p7BD)0h_3S$7e=P&aFutosooLNAb2Fw88mykv(rIQ6#t4JI$ekcE>6XkY^lgB(zR94D|cskXoF+AD$K?&@S5GQg9`5bVCejSxHpazYbz zoZv(ZNo?`V98C6bZ4OO}bHWX?0COg|*4y)m5N zM?dQH`|p#47?MOh$|%|}qzkVMDVo}>a0(JMZ!=8+MDS2RI5>DhY7A9m(ZZSj;sCG_ zP)@SX4e6-ta+EDU4Q7*-*is891<-K`Gu`A|12~D?@G}#TeDMV|8u)txzy;6)Mhny& z^M}(?k4piyc;~IRlh`=_(!~nS>>|S_2IM?+A58qL&j5^XQ3EzMtgY=jUI^j^I@cV$ z_vX}6Akf{MhfZw)v_#_%AazG@wDA1&%S*38^vn;Re3QmAEOh~lxG=)_Ba~3W_~MV?Li*;P z&%Pe(mv6rK?UQf*2(Wx#00}LYi6Ckbico48B%<6{NJ#^l0S6Yyzy><-f&Xg_gLVVJ z0*a^@56qwjqactM?8Poeu#b5rD4gJYW;CL?!w2gU34v6@12BxC3};Bg5CTv*ygA_n zB`BR7eufV;45ASKxgZb+bl`|cOrjE(Xu}h-#)lSsA^{07j3rv}ic%0r6hOemE_(5c zVDv{6LqwtJtY!rSkil@W0me4E@d5&I#|P#}$2!{aj?D;x9`#6rJ^FEvef%R00{KTl z@{tCPxT7K$Ntu6e0RoVWq$DRv$x2%Cl9cSIB2Y$UubzIP{?qji^K?O3{j1^r9A}0vS$% X5`s_wqaY2bNJk1$3P^+^0RaFzs#KD+ literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/epay.gif b/modules/moneybookers/logos/local/epay.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ea1278b6cf934475c122cbe47c215bb20586666 GIT binary patch literal 1182 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 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/giropay.gif b/modules/moneybookers/logos/local/giropay.gif new file mode 100644 index 0000000000000000000000000000000000000000..642afcf9077b499a2cd5ac0848bf87cded72ddf6 GIT binary patch literal 1504 zcmcJP`#aMM9LK*q#?YGkrJg)(Q6x%Hte#wQ2#;#YNz^h2hl7JU<-{{R)83v=$dDkw7NBDQ;P~CGt*woX zjm^zXfk3#j%9P9H3Wb8r;j-9lE|u3(AH-&J zbUf4FeVY3+ML%@4fX(4-@c8p|j$(8yr)Gfbd1m+dY{|V`Wu%EkXROwB*&tV)Ed^kHy7B+UhFPIf{4?oxjFn&CJft&dp!B_b1A-78aIh%U7{=Du}ZQRkHTZt2h#i#a>xmWwALd7K_ec ztg+ZCIl%vU2pJdz02sjLXUWe^0LWGv28)Bh9z4u=l$nLkew_0dg3HGpL!L4&{^uF7 zvhfJF9M?Vc7Um#o;i6v5*TWySy68x^bEY z)(&2M^SFn)=02l-%h>)bQ~RhHYU9#?^>K?#d=ce`SDq_Sb7iop`a_{z=nxp7RZ*W{ zf+p}a?t34YfUw$TKFwBsQ2YEQXonDSR`-_*pAze%+W@HNt0=Qf|Chry{=J?a2+i6{ zwR?cviJ|Y20c86v4`Q{CF@CbcZ=`khgHi1Hj->Zbw-Zf(`QEsV9`LSq4*JclwuBl~ zx!QbRCi=+0T2Vt9HOMmHEfGnlca&)1U<=rR9DTdvg!pgexGa4$3_%K*yK3#+Z3FSB zb?b#1nf=M+bIL%M!Jxj#ehZG>(=--O2+Hw=2h715vscdF3g< zn+&%tZBx9dA>ah&VYNWHlqYyc7|L8T@Ooh=aH5G`dCOH}Z+@;0A<3cHFqSABFl*OPyY>2R+B9T0G+n*Hq1}#{ z^f`p$u5DeM2GXG3?8jC%a+cHJEv+}B)sGNSbCD0tZpWNIR2LrJ@)vrWXKTzX^Letv z{R5*FMP0u}6xg)iICPnLeR7%PHn}e@IHfw5+?9;AD~f`{h`)7JqZxr{+jtCrtKT&E z%Kac%wEDF^k1(62{vb_kk8^kZ$UFISuiCCtP6Bpj|_HIK(C*zJsZ1?SE5oSHqxH;=;W zGl^63sg`7=;G<)z(l8&NdmlU+5Vs+kh#+r>XA-$xB5$Bn`=q`hA#PK)@`Ai6XSH!R y70c#`l)Y!Y{3shz26<~!DdDP~lCsp07_aTG+XDjmmi=Nvr6`fE`UFidaNL literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/ideal.gif b/modules/moneybookers/logos/local/ideal.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3ba9f8ed36d8a77504dcd60ea41c08b51e11211 GIT binary patch literal 2031 zcmeHH`8V5%9{q|SNJUXi5fY`x_AK?DrSn8esU=0vd-JM&MFvw22IsZs3?YP6DJhw1 z(M6=zj-`mUDwNn|MCmxSbSx2ytg;})l4t&a_aD6b6SXjvV=0#%h&LsC+7Cj>))5*zc+5&&DwZmOqBM=DR zvgrziV#bMtMx)=odmj-I5gHo0vB`^!jO3N{%zKlUqiDje>6Vt3iHV86zCLcsuZxR| z!m1HAo9*c6$m8?TXm5c~n4Fw!Zf?%yu6_Mufl8(BEen^Us`w`hp=gP70wSGEWAIbp9C?qyFJ$SYA|2V9{SQlqWQ?t;9|nUSbNQA z3DUO^I-fUkst^>2@nq8L#><^!etQ|%QGcy0EFjEEs*yWcg(2x6g5JLVToaI!_1Tl+ zPihFO391Zw*Z8F=yd$K}g>wI_4sNgz5$q;3hs94fMvTu~pYKdveXuidPdm3eP0n9@ z(K$lwBdY6~AKqXU|25OlKCDQae2^U>I+C)32|U zz}ryo5~l+ncsx`~^Lsq|;jTTrvfDl9OADbdWMHH9q0d0+mgW~r&ty*P;LD1T%1d?5 z6+ti;=?$`cY1|J`!9#m{_T}GlYAjSf!~=z7QN7ER3i;Xa#~HzLi4Se>2zcDEgcl9R z(K53D%uo~>yva#B%8@OTl&1M>T(lEfac67HD%uEy)?v*gnETRg|J;Mrn0$ zTjS*M^??E1@kCOg9S9}q*XRp!sVg%v4cAutJ5-u8^t+p6xY$uZEVpTBrk8aX(_Ct-OjWO;Mt~O}*mb>Fls_(ZyOITq< zQ}qhu-=;zvg6YlYbVu4p!*wMAz+0)aTdn0@gUw6epI$^bP#fS{^jS}Z99{sf%;jp{ zKbyR_Qee8o0}4XDG0z;8$7MhMr;x_uaKj$ zcqGNnnNt|ft~Tx*8+OD?i*V4Gv;9bYM+Xi$9$RBFJ2v9RkUmN!$C!3e9-CWniqqIN z=8CaVv{G6^gsz!qFpa`)Usfx?)>@urjrm`a{X!wvTAfSJdq^QdVPmxy+*zy;ysVT4 zt+Tn>6?oC;qIFCG(e4K8w|_BYPus|K4sn6O-xseuIn(cB1Z9p#DrMzNXuWfOAUoQ? dRVUm-I|#xBVlK&_O_A%J5XjSoU@-9Ae*tw@j647U literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/instantbanktransfer.gif b/modules/moneybookers/logos/local/instantbanktransfer.gif new file mode 100644 index 0000000000000000000000000000000000000000..4272a2b5d29530805b6ebcf0a088c24809355791 GIT binary patch literal 3521 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 v1aT1xzy;tKj^a3uS-xkMbCf3IG!W5fA`78|x88 literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/laser.gif b/modules/moneybookers/logos/local/laser.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a3b9925c6d952f3098c3305655f22454395bc94 GIT binary patch literal 1458 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 N{YJoh+Mxi4{txNKT*CkW literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/pekao.gif b/modules/moneybookers/logos/local/pekao.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c69d43eb142d082a914df77cff0bbbc47e2751a GIT binary patch literal 841 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 MZ&M-Q0KlsM0fhL=4FCWD literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/sofort.gif b/modules/moneybookers/logos/local/sofort.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6fe1d5c36692d29886f05392008d64e5d04583f GIT binary patch literal 2447 zcmeH``#;nB1IORnnAyJjR3dQ2Wf?{rN{_EE{wOZ5M!dYEi)oQiV(=#(Ovr46Ec2+Kz ze^see^YaUfi^?@7r>13-QxmdDl}at0kd2Ow4-O44iCQ!ot)}IHiW#OX3RN*fwIj{T zqb*a@)0_`&+SUi^mtkVDWJEMNIW?tfN|jDbd>ItrazMc|DpxVKuK%qtSfo>*w|GRdu)dpZbP|h0Ai0rX{Vf z@AKT;oVq-!y`!_Im%p&Epl(iElThV)kBo@M#gb*ETv>KXE$&u6aTphir>18*I=Naw zl~^Lx&I&aP)7`vYUN66!*P~Xem04~}vm+Ae#EMEjHa6bf(<_lk)y=6LUEOORsQ>(R zSUA$l?_1(Cmj+l}-8_wir`BkMBcjg(gPQ6%p-?n7F4hQ}+S@xtqS2utp+GRe-`~6bglQfTe1qtEw()riZl))9TM}Re3&>lT(_GENw^D?Cfk$4_}$(3jWXk z?g1;c4g!F5K>U01?QVDG&_r+Bw~ySCpcxlpb{TEauB-~mTQhHtIs%1C`CyT6TIt&pN5q`-hd9#s| zF4loiPD+(LQCd+1hO~tHwsiJg>oA?jD2RZbi%b$3(l9CK2UWv>R0bolyRLW-J=kDW z1{;xN-Co8>DDuwwGhyjDkDS6-Y<&l@6)AH(*gS#i9_>1mWK5KQL7EUFtf53AguvUd z)AcMvfRz`Zq>f1bkcXa|c=6Pxo-FxYykJQ3iMfxgXI*y*Qjem45q)?Q;& zLM-#f2hx4)iEh=^`MqahX?iS!lMBZ zNmOdUH!;8y)WhI(s?0Nnt|-{uWs<>ZLjC|II98#Y;N}e|;c6fXkJ(+EgCW**Pj8S3 z%Gqohkx@iVHgIC5oozqg)Ngn6-COF5Fxk&n1H%cF22_x+4C&ubPTX`L2qIaYyHyXr zu<6D5niv$OG>UfbuPYj}S{GE!fA%uN^;YI%*^XOy_`(iU0$s>P?gjc$TX9Wf(bi}A zCwJjaOFQ55>pYEa0Y6NvtC;>!P+ib5Z~E@VAx?+Du)yIW3S7o8+2{;HqUmAAod-J* z>raIYvP%|O;NXQg+`a})YM*wvmjy(@94i~zeDIF- z?Q(nne+$2VD$L8-SPTCr)r?&e?gW1_5XLOT1#kPo^SMs|gfx)Dwk{uF9eMo?#-92u zdr+|F!C)#B)Ub{K!Ppu$-hM5GwXz@sc)ejllbQ2;LfQu&ei!FEOnx&4L>~dCu7=d>UGMO05(FO10UGPLUPamYfBtxUv4VCN=n*R@W_SjIVOSjP?JwZb7vB^H7N7IPQ4HJ35Q#<6 zJ>x$hI4@YNWOWo@h;JJh;+f($vFd}c33uJeLL?`!B<@+;px8}W%}p!0vWs*Ns-Z$S z63~;D>Fqc_@?L0Idac!eXpXL|k#3Lm5^&M_N5>r3hu5R!q+yLfS*PkKy{&8;UJ=Km M45h{%NF><*7s~lf$N&HU literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/solo.gif b/modules/moneybookers/logos/local/solo.gif new file mode 100644 index 0000000000000000000000000000000000000000..624e56c8662a1ef55bf12119f0b7741e57fba9ff GIT binary patch literal 1495 zcmcJN_fwMx9LC>}kN^oQ9EgHQ1Qn2JF(`$a$P}TXwFjlj$e~qQhF1%=cx?=bND*WR zY8gSOsDK7!D2Muj(O5)?i~zEd5Xqhdl0Zh``Zx6R>+{3+8Q+K_;Rg<;BmiE(QX-(! z=?1;Z^?JR*V9;u{Jib7oSYBIO6HBBbu~;UTOQo{aRh2|46$(X4eba%<;u!rN}GIeaV+r>tNaZB0CTy$jFeW1L@J~(=n?gwGCEf#1?zJ4 zhrrvMs&|UzWkzzVu=NC&$CoaNms&nfB)3fGbTe5S`sca%g?T3P)66ViAQ(@2#ALF$JRT#B^1I{r z0-=b_=7>aMK3_09H!qXPk6K}cqD`tX>8y&kLXmih%ROUvM6_X`Z7kmA5RcDC8JTVr zvJv6`2BU#N03Z?Y+&r|o34kyV6G?e!^MY%I*NgrvzEM(Ig3hbR^T*<>@7(>Xrnau0 z+;Fb}hxM-{xktlW+a5omw0Au1?CNffcCU2DTfTe+_7A+KzIjV~2jYA4u&5FG$I-Fz z3C85q^cXhJJ$B1~oiT&AZ;UAtZx3FQD_F5ZVF*7>WzE zLYZ2*MAbyL?+mqtf01@FrM;0>__ZV2{zymDKNW5f1kVGcH*gy${Pq+`$j95d|15C5 zgX0X>?};-DxT_S&5iGCwg|V!~qg@d1^+}adx;(=akWKg^Z#d&tg7cJqriSz2a&5_21M< z&p}gmmg9Hil5G#5bc^Ka1G8)fYcNbsO0J}3Cy~i@x?ZLt^Yi2QU>UZG2u>rl6jIPy zw=WDiHS+4!#$QO{X5d}s)EPTSx-STaod?NqNVps34-;Mh>#D&#a)97;(VC9%vko1| zv#*M5xVoDV?_jogeK*t=Qf9@*dFrbO*KISh8;c;9L2`JE&W#Rl!9QEfKUk2(G30mE z`VwRIw8oMWgWpmIa4sm|R@qVb?bK>(JGaB9_YJz%k)Zk6)r39ho$~9|(G}buXJ=a_t z_^Ht}E{#euRp{Uz&4mKq*#h%!N`Jx54Bt6i`pe!V6Yd<1kpjDd9W&e8*K`*@p)n(# z^^InVp3=kjiaUoh!ssU3Qd|1tj~^F`dq%LBLL~CmOlenkda9&X6ODz*Bv(PFe z3;MxX{?0X^FW)&PnXDM}>=7y6dwdgQh4i+~J#6YTe$@!M!^R&vghRa82P4Io^?!`q z)21Aa-jNQ&S3LG5nK+P{E@hSBfj6yVa>V;bF~4HMj8m)ASEtW4$E;fNySIauX*92# z=~E_b(CbpqKnU7VDON2I5yN*~I}8_2SJ4Zw;q1&PiiSa&8BgYH}nR zF8P}G8n3C^DG>coL<9w`J(4vch3363>YUWCSqxqB3pMIfN!Fzx!bdBkZpjRig+!N= ztStPc+GTo#k4`xrm#JGBL6+ru9K$hnD&{pGy}z1MovGLGat+kgTaNfph>YfA&?+Z0 h4LUWq^pJH#4ap2+POk?Lk)YAw6G%BZ)ENN2{1?yV>#_g< literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/unionpay.gif b/modules/moneybookers/logos/local/unionpay.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b2a50d7755519e3850355282ac0fd98888e61c2 GIT binary patch literal 2088 zcmd^8`#Y2g8-CyM%EVwk+FkjSLmG$VP>OV*8OdnMq}n7gWK+7nSnVz?GJ_n4)J{kv zG)xYuiLoLw#+1`Ywzjm(cw-uKHfCzZAzAx(e9sThb=}wf{BYm*bw3C30p7c!!ho%S zjs+|)F9WI9zJC1*97tVRS^2o$ORd(3CDJcnz9^Kli;IhLg<^JArJ9?YpP$!ib;{XU znN0ra(`SiPHaDkUT3XU*R?%mjZk5%}FDxuAeetC;l&g1IUAF+Xrqa|JjT`OGq;j^h zeRxD9t{fgs@8Vu>dah6?AH5xmZ|z9G*A-mT*!@Z{GA@$%hnr?mXEj=dQW@FQ9GTx_ z9ZtRed|+uxWP(l7>2y=m!pRxs;_LUp={2UrELq3};Kxh_>1R#({TZ>O!xpEe-ns5X z6z?ET3qQi}6mTltEtdAVj(yPUoH9P+Fr!{3m+$h4`|I!VWtH0ZGF_Ec6kpN`e1COD zES?Zd-sQi7KTJ(c34!3W6Q0rI6M{#)x4_St0vMLd6%t&y$N{Hq<47b@sZ74QR-;LD zJ2fs-RA2~47!7b@witI>$K#u37O3)XFDhn5o=2Sb!~=n;K*-gF$>~K{c%`lL61$!3 zazffaDw>%Iu4zyWzG`~&ZsGNqTrLMLWt^^mq_{*@=9M+vX7x{gkSmmP1?BV4ha(>} z%j60Ty9+o=Dd>4FA;u0(31uPYXHyHGO-xS6l|U@TEwwb_L9=Nlbp{&-kjTKHv_|_t z@s8jak29Km-Bang_-IdUnd7sD#st9Ur z__Hyz<;aAGJI~U9)SJKI(C-i4x14|7u=#0ry`_G_^kBuIB-eUxeYNz@6yZy9H(Ae= zV`fkO(3@+Dt3TfMID7{p_IMegz4_zNEs1<094>%I^h)eER?HiVUf&w^58!mP%HFX~ z%RY3rAMdSrRDz~v9nFDKyWyWrxI|YhLgWq-I(hPxvBS-NB_xM z%3>s~0DjLp7c}Cbf{qBk-6W5RgQh{jlc|Q3X_?HeJE!Y^x@4YL7-nfS$=YS%o6txn zeH#!$>6gusBCbC13I*&Es;ZF_lq%A%2AFx0$?Au5_|2+=v?-|j8xJ9|rXAaGOGey$B2IGufcz$}IGtWJv(27jFpKZeius{=OE$7zN!J_~gBHs88+-q@^VPubn zGf~^n=m3W2T@nJ^Zl>DL+!^P?MSAdH2Vgtwz^SieHb@%~o+0FWMe9~Y&M<;l zetrx$&wLj!C(REqC|~0@ZIIm*vbFUOyJWZ4D?MbrLhn5k2uv@&=xX>>8`j&t2TgYA z%03fz0pKQ*EHF#^?!+6cZwW%CTuLoDM~V<*5ILax1#Z-amX05X8kk&xW7T^O_8UF- z$9dUX-&{c$TPAXBQuQD=5(%7IOpJ8@XmCkW(t9*=#a=5QPjez1tF9eATeJDeMZ|9j zy-pAQ_ON>41gGeXhbC#I6HrS3T5V>#8;jFR-JYmo8g5KhQCOQ33Zq1{(=X@#c*xS- zBN03aSccadM+B`@z(N#mftUN=)%`-Qtn`g26~+p`e=JjB=;QV@2jp&-=;K9;u`&P6 za{D?jydIg8-nQ(lSIZUn^%~r{>B>cJws{+{Fh66xZ#|+G9$UFV8u^b4%>cAzny(xp zg&W$U1J1(~G_?xaREE?hzt~&pUKNe$?=iu;8zN2tYXSnfX639b8fj#UOAON3@|>9i zwHk#lTSFao%0hh=zU4!g%9U zUMN4>{DfYCV<=oeLNP3Q9g(}kXOPD_3%`TSD|e})s0mbt#VOljN2OkF``6=Mrk{jMpM5F%+C})1!5#|BCA;U~`O%h|vVH<{Tj>BH zIs88?#}b??;BaG59Sf=ZGheX0P2&p-2eap literal 0 HcmV?d00001 diff --git a/modules/moneybookers/logos/local/visaelectron.gif b/modules/moneybookers/logos/local/visaelectron.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b7af39cc90a9a27d018d6437820e535013deaa1 GIT binary patch literal 1530 zcmcK4i#wAG90%~1nXMsoMxIm3HF9$4tP_U_P3YuFoyw)8PNIw3)59U%W^R*f2t_rW zLqSZFbDIciTI&`*@H3i1YggzTfBbeV(7M|3Q~u&xHc^z+yN6!|>|r z>e|{GU`bwH7B6wQN~Kb*R`Ufykk1ziAxI<=i&q3fpy6g(Q6Ul8;80+&o}Xoi z)^ULU`OFns8UPRu?E0SbeG>o$6T*pU#(J4qr0hF6xq0~o`NnC*X}fXmKiq#%QTg!E zV{+A#DtFxO5~7W>R>OxzD>jF4-S1D z9vK}Q|28o>f=jb;+qjOmF0{DL%VoI@;I$#qvUo)zmB|%KDW2$H3?MLD{h(}PM~zK( zr)kYq-B~*N29{)C-6 zUWfknsJ#D|e-6bSE+^gCO^(gLCc33RHF(lE-+Yrtw6BvgCLJ&7;B+xSe+lIno@okc zcxJt|1Og!*1IZl01bFZv$B-h<;Dxxs+DKjxA zv^D~Pzn3t1qpI{W*Iy5<$$jot^qE^<{Y=?gSCfz7y?FU~;<@iGrt9$NjnCD50jX671wRx%bG^+JMlwX9u4U8&n?b!K}yq%m+&D2`C2_x(h2t&M>|yLLhRT1@eVLUk3%NBq;U`>o{7I zYG0WoP_SEv%t-n=C9z6QZB3(++dvU0dG!a({R}Xpu_}H$yHO>0FB7PQ?@)I!dT4B% zT12yHQZElU3)SNOk4OzYHkg;EW2$yzqHRC9=qtu@0V UY-!YuDNvejG{MT&5DmEf2W^57y8r+H literal 0 HcmV?d00001 diff --git a/modules/moneybookers/moneybookers-currency-error.tpl b/modules/moneybookers/moneybookers-currency-error.tpl new file mode 100644 index 000000000..4ca044d96 --- /dev/null +++ b/modules/moneybookers/moneybookers-currency-error.tpl @@ -0,0 +1,29 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + {l s='You cannot pay with Moneybookers with your present currency, please choose another currency' mod='moneybookers'} +

    \ No newline at end of file diff --git a/modules/moneybookers/moneybookers.php b/modules/moneybookers/moneybookers.php new file mode 100644 index 000000000..dbfd65766 --- /dev/null +++ b/modules/moneybookers/moneybookers.php @@ -0,0 +1,542 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class MoneyBookers extends PaymentModule +{ + public function __construct() + { + $this->name = 'moneybookers'; + $this->tab = 'payments_gateways'; + $this->version = '1.5'; + + parent::__construct(); + + $this->page = basename(__FILE__, '.php'); + $this->displayName = $this->l('Moneybookers'); + $this->description = $this->l('Accepts payments by Moneybookers.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details ?'); + if (Configuration::get('MB_PAY_TO_EMAIL') == 'testmerchant@moneybookers.com') + $this->warning = $this->l('You are currently using the default Moneybookers e-mail address, please use your own e-mail address.'); + + /* MoneyBookers payment methods */ + $this->_internationalPaymentMethods = array( + 0 => array('file' => 'amex', 'name' => 'American Express', 'code' => 'AMX'), + 1 => array('file' => 'diners', 'name' => 'Diners', 'code' => 'DIN'), + 2 => array('file' => 'jcb', 'name' => 'JCB', 'code' => 'JCB'), + 3 => array('file' => 'maestro', 'name' => 'Maestro', 'code' => 'MAE'), + 4 => array('file' => 'mastercard', 'name' => 'Mastercard', 'code' => 'MSC'), + 5 => array('file' => 'visa', 'name' => 'Visa', 'code' => 'VSA'), + 6 => array('file' => 'visadebit', 'name' => 'Visa Debit', 'code' => 'VSD'), + 7 => array('file' => 'ewallet', 'name' => 'Moneybookers eWallet', 'code' => 'WLT')); + + $this->_localPaymentMethods = array( + 0 => array('file' => '4b', 'name' => '4B', 'code' => 'MSC'), + 1 => array('file' => 'cartasi', 'name' => 'Cartasi', 'code' => 'CSI'), + 2 => array('file' => 'cartebleue', 'name' => 'Carte bleue', 'code' => 'GCB'), + 3 => array('file' => 'dankort', 'name' => 'Dankort' , 'code' => 'DNK'), + 4 => array('file' => 'ec', 'name' => 'EC', 'code' => 'ELV'), + 5 => array('file' => 'enets', 'name' => 'eNets', 'code' => 'ENT'), + 6 => array('file' => 'epay', 'name' => 'ePay', 'code' => 'EPY'), + 7 => array('file' => 'eps', 'name' => 'EPS', 'code' => 'NPY'), + 8 => array('file' => 'euro6000', 'name' => 'Euro 6000', 'code' => 'MSC'), + 9 => array('file' => 'giropay', 'name' => 'Giropay', 'code' => 'GIR'), + 10 => array('file' => 'ideal', 'name' => 'iDeal', 'code' => 'IDL'), + 11 => array('file' => 'instantbanktransfer', 'name' => 'Instant Bank Transfer', 'code' => 'PWY'), + 12 => array('file' => 'laser', 'name' => 'Laser', 'code' => 'LSR'), + 13 => array('file' => 'nordea', 'name' => 'Nordea', 'code' => 'EBT,SO2'), + 14 => array('file' => 'p24', 'name' => 'P24', 'code' => ''), + 15 => array('file' => 'pekao', 'name' => 'Pekao', 'code' => 'PWY18'), + 16 => array('file' => 'poli', 'name' => 'Poli', 'code' => 'PLI'), + 17 => array('file' => 'postepay', 'name' => 'PostePay', 'code' => 'PSP'), + 18 => array('file' => 'sofort', 'name' => 'Sofort', 'code' => 'SFT'), + 19 => array('file' => 'solo', 'name' => 'Solo', 'code' => 'SLO'), + 20 => array('file' => 'unionpay', 'name' => 'UnionPay', 'code' => ''), + 21 => array('file' => 'visaelectron', 'name' => 'Visa Electron', 'code' => 'VSE')); + + /* MoneyBookers countries (for iso 3 letters compatibility) */ + $this->_country = array('AF' => 'AFG', 'AL' => 'ALB', 'DZ' => 'DZA', 'AS' => 'ASM', 'AD' => 'AND', 'AO' => 'AGO', 'AI' => 'AIA', 'AQ' => 'ATA', 'AG' => 'ATG', 'AR' => 'ARG', + 'AM' => 'ARM', 'AW' => 'ABW', 'AU' => 'AUS', 'AT' => 'AUT', 'AZ' => 'AZE', 'BS' => 'BHS', 'BH' => 'BHR', 'BD' => 'BGD', 'BB' => 'BRB', 'BY' => 'BLR', 'BE' => 'BEL', + 'BZ' => 'BLZ', 'BJ' => 'BEN', 'BM' => 'BMU', 'BT' => 'BTN', 'BO' => 'BOL', 'BA' => 'BIH', 'BW' => 'BWA', 'BV' => 'BVT', 'BR' => 'BRA', 'IO' => 'IOT', 'BN' => 'BRN', + 'BG' => 'BGR', 'BF' => 'BFA', 'BI' => 'BDI', 'KH' => 'KHM', 'CM' => 'CMR', 'CA' => 'CAN', 'CV' => 'CPV', 'KY' => 'CYM', 'CF' => 'CAF', 'TD' => 'TCD', 'CL' => 'CHL', + 'CN' => 'CHN', 'CX' => 'CXR', 'CC' => 'CCK', 'CO' => 'COL', 'KM' => 'COM', 'CG' => 'COG', 'CK' => 'COK', 'CR' => 'CRI', 'CI' => 'CIV', 'HR' => 'HRV', 'CU' => 'CUB', + 'CY' => 'CYP', 'CZ' => 'CZE', 'DK' => 'DNK', 'DJ' => 'DJI', 'DM' => 'DMA', 'DO' => 'DOM', 'TP' => 'TMP', 'EC' => 'ECU', 'EG' => 'EGY', 'SV' => 'SLV', 'GQ' => 'GNQ', + 'ER' => 'ERI', 'EE' => 'EST', 'ET' => 'ETH', 'FK' => 'FLK', 'FO' => 'FRO', 'FJ' => 'FJI', 'FI' => 'FIN', 'FR' => 'FRA', 'FX' => 'FXX', 'GF' => 'GUF', 'PF' => 'PYF', + 'TF' => 'ATF', 'GA' => 'GAB', 'GM' => 'GMB', 'GE' => 'GEO', 'DE' => 'DEU', 'GH' => 'GHA', 'GI' => 'GIB', 'GR' => 'GRC', 'GL' => 'GRL', 'GD' => 'GRD', 'GP' => 'GLP', + 'GU' => 'GUM', 'GT' => 'GTM', 'GN' => 'GIN', 'GW' => 'GNB', 'GY' => 'GUY', 'HT' => 'HTI', 'HM' => 'HMD', 'HN' => 'HND', 'HK' => 'HKG', 'HU' => 'HUN', 'IS' => 'ISL', + 'IN' => 'IND', 'ID' => 'IDN', 'IR' => 'IRN', 'IQ' => 'IRQ', 'IE' => 'IRL', 'IL' => 'ISR', 'IT' => 'ITA', 'JM' => 'JAM', 'JP' => 'JPN', 'JO' => 'JOR', 'KZ' => 'KAZ', + 'KE' => 'KEN', 'KI' => 'KIR', 'KP' => 'PRK', 'KR' => 'KOR', 'KW' => 'KWT', 'KG' => 'KGZ', 'LA' => 'LAO', 'LV' => 'LVA', 'LB' => 'LBN', 'LS' => 'LSO', 'LR' => 'LBR', + 'LY' => 'LBY', 'LI' => 'LIE', 'LT' => 'LTU', 'LU' => 'LUX', 'MO' => 'MAC', 'MK' => 'MKD', 'MG' => 'MDG', 'MW' => 'MWI', 'MY' => 'MYS', 'MV' => 'MDV', 'ML' => 'MLI', + 'MT' => 'MLT', 'MH' => 'MHL', 'MQ' => 'MTQ', 'MR' => 'MRT', 'MU' => 'MUS', 'YT' => 'MYT', 'MX' => 'MEX', 'FM' => 'FSM', 'MD' => 'MDA', 'MC' => 'MCO', 'MN' => 'MNG', + 'MS' => 'MSR', 'MA' => 'MAR', 'MZ' => 'MOZ', 'MM' => 'MMR', 'NA' => 'NAM', 'NR' => 'NRU', 'NP' => 'NPL', 'NL' => 'NLD', 'AN' => 'ANT', 'NC' => 'NCL', 'NZ' => 'NZL', + 'NI' => 'NIC', 'NE' => 'NER', 'NG' => 'NGA', 'NU' => 'NIU', 'NF' => 'NFK', 'MP' => 'MNP', 'NO' => 'NOR', 'OM' => 'OMN', 'PK' => 'PAK', 'PW' => 'PLW', 'PA' => 'PAN', + 'PG' => 'PNG', 'PY' => 'PRY', 'PE' => 'PER', 'PH' => 'PHL', 'PN' => 'PCN', 'PL' => 'POL', 'PT' => 'PRT', 'PR' => 'PRI', 'QA' => 'QAT', 'RE' => 'REU', 'RO' => 'ROM', + 'RU' => 'RUS', 'RW' => 'RWA', 'KN' => 'KNA', 'LC' => 'LCA', 'VC' => 'VCT', 'WS' => 'WSM', 'SM' => 'SMR', 'ST' => 'STP', 'SA' => 'SAU', 'SN' => 'SEN', 'SC' => 'SYC', + 'SL' => 'SLE', 'SG' => 'SGP', 'SK' => 'SVK', 'SI' => 'SVN', 'SB' => 'SLB', 'SO' => 'SOM', 'ZA' => 'ZAF', 'GS' => 'SGS', 'ES' => 'ESP', 'LK' => 'LKA', 'SH' => 'SHN', + 'PM' => 'SPM', 'SD' => 'SDN', 'SR' => 'SUR', 'SJ' => 'SJM', 'SZ' => 'SWZ', 'SE' => 'SWE', 'CH' => 'CHE', 'SY' => 'SYR', 'TW' => 'TWN', 'TJ' => 'TJK', 'TZ' => 'TZA', + 'TH' => 'THA', 'TG' => 'TGO', 'TK' => 'TKL', 'TO' => 'TON', 'TT' => 'TTO', 'TN' => 'TUN', 'TR' => 'TUR', 'TM' => 'TKM', 'TC' => 'TCA', 'TV' => 'TUV', 'UG' => 'UGA', + 'UA' => 'UKR', 'AE' => 'ARE', 'GB' => 'GBR', 'US' => 'USA', 'UM' => 'UMI', 'UY' => 'URY', 'UZ' => 'UZB', 'VU' => 'VUT', 'VA' => 'VAT', 'VE' => 'VEN', 'VN' => 'VNM', + 'VG' => 'VGB', 'VI' => 'VIR', 'WF' => 'WLF', 'EH' => 'ESH', 'YE' => 'YEM', 'YU' => 'YUG', 'ZR' => 'ZAR', 'ZM' => 'ZMB', 'ZW' => 'ZWE'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('payment') OR !$this->registerHook('paymentReturn')) + return false; + Configuration::updateValue('MB_HIDE_LOGIN', 1); + Configuration::updateValue('MB_PAY_TO_EMAIL', Configuration::get('PS_SHOP_EMAIL')); + Configuration::updateValue('MB_CANCEL_URL', (Configuration::get('PS_SSL_ENABLED') ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__); + Configuration::updateValue('MB_ID_LOGO', 1); + Configuration::updateValue('MB_ID_LOGO_WALLET', 1); + Configuration::updateValue('MB_PARAMETERS', 0); + Configuration::updateValue('MB_DISPLAY_MODE', 1); + + return true; + } + + public function uninstall() + { + if (!parent::uninstall()) + return false; + + /* Clean configuration table */ + Configuration::deleteByName('MB_PAY_TO_EMAIL'); + Configuration::deleteByName('MB_CANCEL_URL'); + Configuration::deleteByName('MB_HIDE_LOGIN'); + Configuration::deleteByName('MB_SECRET_WORD'); + Configuration::deleteByName('MB_ID_LOGO'); + Configuration::deleteByName('MB_ID_LOGO_WALLET'); + Configuration::deleteByName('MB_PARAMETERS'); + Configuration::deleteByName('MB_DISPLAY_MODE'); + + return true; + } + + public function getContent() + { + global $cookie; + + $output = ' +

    Moneybookers


    '; + + $errors = array(); + + /* Validate account */ + if (isset($_POST['SubmitValidation'])) + { + if (isset($_POST['mb_email_to_validate']) AND !empty($_POST['mb_email_to_validate'])) + { + $fp = fopen('http://moneybookers.prestashop.com/email_check.php?email='.$_POST['mb_email_to_validate'].'&url='.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__, 'r'); + if (!$fp) + $errors[] = $this->l('Unable to contact activation server, please try again later.'); + else + { + $response = trim(strtolower(fgets($fp, 4096))); + if (!strstr('ok', $response)) + $errors[] = $this->l('Account validation failed, please check your e-mail.'); + else + { + Configuration::updateValue('MB_PAY_TO_EMAIL', $_POST['mb_email_to_validate']); + Configuration::updateValue('MB_PARAMETERS', 1); + + $output .= ' +
      +
    • '.$this->l('E-mail activation successful, you can now validate your secret word.').'
    • +
    '; + } + fclose($fp); + } + } + else + $errors[] = $this->l('E-mail field is required'); + } + + /* Validate secret word */ + if (isset($_POST['SubmitSecret'])) + { + if (isset($_POST['mb_sw_to_validate']) AND !empty($_POST['mb_sw_to_validate'])) + { + $fp = fopen('http://moneybookers.prestashop.com/email_check.php?email='.Configuration::get('MB_PAY_TO_EMAIL').'&url='.Tools::getProtocol().$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'&sw=1&secret_word='.md5($_POST['mb_sw_to_validate']), 'r'); + if (!$fp) + $errors[] = $this->l('Unable to contact activation server, please try again later.'); + else + { + $response = trim(strtolower(fgets($fp, 4096))); + if (strstr('velocity_check_exceeded', $response)) + $errors[] = $this->l('Secret word validation failed, exceeded max tries (3 per hour)'); + elseif (!strstr('ok', $response)) + $errors[] = $this->l('Secret word validation failed, please check your secret word.'); + else + { + Configuration::updateValue('MB_SECRET_WORD', $_POST['mb_sw_to_validate']); + Configuration::updateValue('MB_PARAMETERS_2', 1); + + $output .= ' +
      +
    • '.$this->l('Account activation successful, secret word OK').'
    • +
    '; + } + fclose($fp); + } + } + else + $errors[] = $this->l('Secret word field is required'); + } + + /* Update configuration variables */ + if (isset($_POST['submitMoneyBookers'])) + { + if (!isset($_POST['mb_hide_login'])) + $_POST['mb_hide_login'] = 0; + + Configuration::updateValue('MB_CANCEL_URL', $_POST['mb_cancel_url']); + Configuration::updateValue('MB_HIDE_LOGIN', (int)($_POST['mb_hide_login'])); + + $local = ''; + $inter = ''; + foreach ($_POST AS $key => $value) + { + if (strstr($key, 'mb_local_')) + { + preg_match('/mb_local_([0-9]+)/', $key, $matches); + if (isset($matches[1])) + $local .= $matches[1].'|'; + } + elseif (strstr($key, 'mb_inter_')) + { + preg_match('/mb_inter_([0-9]+)/', $key, $matches); + if (isset($matches[1])) + $inter .= $matches[1].'|'; + } + } + $local = rtrim($local, '|'); + $inter = rtrim($inter, '|'); + + Configuration::updateValue('MB_LOCAL_METHODS', $local); + Configuration::updateValue('MB_INTER_METHODS', $inter); + Configuration::updateValue('MB_DISPLAY_MODE', (int)($_POST['mb_display_mode'])); + } + + /* Display errors */ + if (sizeof($errors)) + { + $output .= '
      '; + foreach ($errors AS $error) + $output .= '
    • '.$error.'
    • '; + $output .= '
    '; + } + + $lang = new Language((int)($cookie->id_lang)); + $iso_img = $lang->iso_code; + if ($lang->iso_code != 'fr' AND $lang->iso_code != 'en') + $iso_img = 'en'; + + $manual_links = array( + 'en' => 'http://www.prestashop.com/partner/Activation_Manual_Prestashop_EN.pdf', + 'es' => 'http://www.prestashop.com/partner/Manual%20de%20Activacion%20Prestashop_ES.pdf', + 'fr' => 'http://www.prestashop.com/partner/Manuel_Activation_Prestashop_FR.pdf'); + + $iso_manual = $lang->iso_code; + if (!array_key_exists($lang->iso_code, $manual_links)) + $iso_manual = 'en'; + + /* Display settings form */ + $output .= ' + '.$this->l('About Moneybookers').'

    '. + $this->l('Take advantage of the special fees offered by Moneybookers to PrestaShop merchants !').'

    '. + $this->l('Moneybookers, controlled by Skrill Holdings, is one of the biggest online payment systems in Europe, and proposes more than 100 payment options and 41 currencies in more than 200 countries and territories. More than 80,000 merchants already use this solution among which eBay.com, Skype and Thomas Cook.').'

    '. + $this->l('With more than 17 million users and more than 15,000 new accounts created per day, Moneybookers also offers one of the biggest electronic wallet in the world. Your customers can also pay by using their e-mail and password thanks to the e-Wallet solution.').'

    '. + $this->l('Moneybookers changes its name and becomes Skrill!').'

    +

    + +
    +
    + '.$this->l('Open Account').' + '.$this->l('Start by opening a').' '.$this->l('free account').' '.$this->l('with Moneybookers:').' +

    PrestaShop & Moneybookers

    +

    + '.$this->l('Then click here:').' +


    +

    + '.$this->l('Thanks to the PrestaShop/Moneybookers partnership,').' '.$this->l('you will get a preferential commission rate!').'

    + +

    + + + + + + + + + + +
    PrestaShop'.$this->l('Online payment solution by Moneybookers').'
    '.$this->l('Monthly volume for payments made via Moneybookers').'Quick Checkout Moneybookers ***Moneybookers eWallet **
    € 0 - € 1,0002.9% + 0.19€0.9% + 0.19€
    € 1,000.01 - € 10,0001.8% + 0.19€
    € 10,000.01 - € 50,0001.6% + 0.19€
    € 50,000.01 - € 100,0001.4% + 0.19€
    € 100,0001.2% + 0.19€
    '.$this->l('For merchants over €100,000 fees can be negotiated.').' Contact: ecommerce@moneybookers.com
    + +

    +** '.$this->l('Moneybookers eWallet').'
    +*** '.$this->l('Quick Checkout Moneybookers').' +

    + +
    +
    + + + + + + '; + + return $output; + } + + public function hookPayment($params) + { + global $smarty, $cookie; + + if (!Configuration::get('MB_PARAMETERS') OR !Configuration::get('MB_PARAMETERS_2') OR (Configuration::get('MB_LOCAL_METHODS') == '' AND Configuration::get('MB_INTER_METHODS') == '')) + return; + + $flag = false; + $allowedCurrencies = $this->getCurrency((int)$params['cart']->id_currency); + foreach ($allowedCurrencies AS $allowedCurrency) + if ($allowedCurrency['id_currency'] == $params['cart']->id_currency) + { + $flag = true; + break; + } + + if (!$flag) + { + /* Uncomment the line below if you'd like to display an error message, rather than not showing the Moneybookers module */ + // return $this->display(__FILE__, 'moneybookers-currency-error.tpl'); + } + else + { + $localMethods = Configuration::get('MB_LOCAL_METHODS'); + $interMethods = Configuration::get('MB_INTER_METHODS'); + + $smarty->assign(array( + 'display_mode' => (int)(Configuration::get('MB_DISPLAY_MODE')), + 'local' => $localMethods ? explode('|', $localMethods) : array(), + 'inter' => $interMethods ? explode('|', $interMethods) : array(), + 'local_logos' => $this->_localPaymentMethods, + 'inter_logos' => $this->_internationalPaymentMethods)); + + /* Load objects */ + $address = new Address((int)($params['cart']->id_address_delivery)); + $countryObj = new Country((int)($address->id_country), Configuration::get('PS_LANG_DEFAULT')); + $customer = new Customer((int)($params['cart']->id_customer)); + $currency = new Currency((int)($params['cart']->id_currency)); + $lang = new Language((int)($cookie->id_lang)); + + $mbParams = array(); + + /* About the merchant */ + $mbParams['pay_to_email'] = Configuration::get('MB_PAY_TO_EMAIL'); + $mbParams['recipient_description'] = Configuration::get('PS_SHOP_NAME'); + $mbParams['hide_login'] = (int)(Configuration::get('MB_HIDE_LOGIN')); + $mbParams['id_logo'] = (int)(Configuration::get('MB_ID_LOGO')); + $mbParams['return_url'] = (Configuration::get('PS_SSL_ENABLED') ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].'index.php?controller=order-confirmation&id_cart='.(int)($params['cart']->id).'&id_module='.(int)($this->id).'&key='.$customer->secure_key; + $mbParams['cancel_url'] = Configuration::get('MB_CANCEL_URL'); + + /* About the customer */ + $mbParams['pay_from_email'] = $customer->email; + $mbParams['firstname'] = $address->firstname; + $mbParams['lastname'] = $address->lastname; + $mbParams['address'] = $address->address1; + $mbParams['address2'] = $address->address2; + $mbParams['phone_number'] = !empty($address->phone_mobile) ? $address->phone_mobile : $address->phone; + $mbParams['postal_code'] = $address->postcode; + $mbParams['city'] = $address->city; + $mbParams['country'] = isset($this->_country[strtoupper($countryObj->iso_code)]) ? $this->_country[strtoupper($countryObj->iso_code)] : ''; + $mbParams['language'] = strtoupper($lang->iso_code); + $mbParams['date_of_birth'] = substr($customer->birthday, 5, 2).substr($customer->birthday, 8, 2).substr($customer->birthday, 0, 4); + + /* About the cart */ + $mbParams['transaction_id'] = (int)($params['cart']->id).'_'.date('YmdHis').'_'.$params['cart']->secure_key; + $mbParams['currency'] = $currency->iso_code; + $mbParams['amount'] = number_format($params['cart']->getOrderTotal(), 2, '.', ''); + + /* URLs */ + $mbParams['status_url'] = (Configuration::get('PS_SSL_ENABLED') ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/validation.php'; + + /* Assign settings to Smarty template */ + $smarty->assign($mbParams); + + /* Display the MoneyBookers iframe */ + return $this->display(__FILE__, 'moneybookers.tpl'); + } + } + + public function hookPaymentReturn($params) + { + if (!$this->active) + return ; + + global $smarty; + + switch($params['objOrder']->getCurrentState()) + { + case _PS_OS_PAYMENT_: + case _PS_OS_OUTOFSTOCK_: + $smarty->assign('status', 'ok'); + break; + + case _PS_OS_BANKWIRE_: + $smarty->assign('status', 'pending'); + break; + + case _PS_OS_ERROR_: + default: + $smarty->assign('status', 'failed'); + break; + } + + return $this->display(__FILE__, 'confirmation.tpl'); + } +} + + diff --git a/modules/moneybookers/moneybookers.tpl b/modules/moneybookers/moneybookers.tpl new file mode 100644 index 000000000..c7b53640b --- /dev/null +++ b/modules/moneybookers/moneybookers.tpl @@ -0,0 +1,160 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $display_mode == 0} +
    +

    + + + + + + + + + + + + + + {if (!empty($date_of_birth))}{/if} + + {if (!empty($address2))}{/if} + {if (!empty($phone_number))}{/if} + + + {if isset($state) && !empty($state)}{/if} + + + + + + + + + + + + + + + {foreach from=$inter item=i} + + {/foreach} + {foreach from=$local item=i} + + {/foreach} +

    +
    +
    +{else} + {foreach from=$inter item=i} +
    +

    + + + + + + + + + + + + + + {if (!empty($date_of_birth))}{/if} + + {if (!empty($address2))}{/if} + {if (!empty($phone_number))}{/if} + + + {if isset($state) && !empty($state)}{/if} + + + + + + + + + + + + + + + + {l s='Pay by' mod='moneybookers'} {$inter_logos[$i].name} +

    +
    + {/foreach} + {foreach from=$local item=i} +
    +

    + + + + + + + + + + + + + + {if (!empty($date_of_birth))}{/if} + + {if (!empty($address2))}{/if} + {if (!empty($phone_number))}{/if} + + + {if isset($state) && (!empty($state))}{/if} + + + + + + + + + + + + + + + + {l s='Pay by' mod='moneybookers'} {$local_logos[$i].name} +
    +

    +
    + {/foreach} +{/if} + diff --git a/modules/moneybookers/prestashop_mb_en.gif b/modules/moneybookers/prestashop_mb_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e07028de3ece4b9d550fa79b764e2c9eedf39b5 GIT binary patch literal 12740 zcmeI2XHe7M+vdLsAqfy5BE14ya-Qxl>@@YRuWyx>)NOp~IavIg5%s zrT_fKHJPQwwPYLtlr|g^l4kbUrLS)cB#3*Ab_)zh?CBoS(lAU-XpDc6Z{M~S)s@lx z;#+%L|9E-#?o>)-WTvxoU|nt7I?u)W$;GMFo%vyW_^1Bx=r0}~5&IQ7*KS)swR!LD zpQ>m0(#Y&JQTYC!KGINU>HchHTuS-y@FXN>)Xv@;^f0%oss$AGeU`LD4vV$JwoFYe z^rpA!+v625_@kraDsz{GxHhG)LK#%sN57i_ zLUXnX%Qkin;`>&kCFK@L!Y#a&f1M*Pl8q9y|Q< z@X5|B-dSBHlXvzO%eJ?7)xv%{z6$X5jVr5}e(vDg)Yzl0YxltTRYH8?I;nfV@fAL$ z`OmNFT`LJ2yQGErl>zBQ*hj7)NKVoYdGc8;EI)OwRoU2%4OeFrwa$j-CznXT9EY8Uxe@AH=d zlfgf-)8l(*H$p?Oh7X=BC1idGa<{U@6c^+UjW0j)ItPP;k};T=mKI`ERCY{Ejv$IpO~+P6>)8{lcd02~@!uO06F#4w zo@VBh94=Sx?EZ;Q`WzCG{;jyWr*roB_+-Pi$fwP9aB!ltW1zQp#LVQ`=|Ffq=5+Ny|9D4x%Oq*jHy~S9GU$}_y`z~hGBVxP+E>*yUsg&CjPA_IF6|mvAq`EP z?2tnuKfii~`Sok9tu}jq|G)#2v{>o3*n`{diK|=u6B?1^5q%IL__;KjXjKm|c=pI1&D^mfNW^2`RR(v$ZFO0= zL!4g0!@kc_feJ-X%YI_o54SS1=8;Y4L|4dI9X}kufqJEj*5v*M-#rIT+gYZ8Sa{Xjw;HX+M{8 z<3npytjBBNk&mL!bFxxw`iW!Lx|6QcC&|8Mdn|3WWrf0WtTvme+TJN+eavD3R|~c$ z0;a)^_;`^x{fIo&oh&di&EskXuO@yu|+0r)!{qA zj~!iE)~qdB`bYA-=RroG#&3r*|wv=W6y>cVs+6ehvr^L0bbCTD3724GN z_4<3e_N6k*^!YNBgKsk{Yb$p1D)L>Y-bPI6)61FDm#OZXYrCo%X?|<$U+QuCGtQjY zA34ly>ku<;5ZSFirk?`dSMg7z%>7Zd)O^{jdfnXXt(vq+!`>Y8GU?4E@N1!Y$j`H> zV$AMM4t~(0>3zjC@45bp!B~Gt^KzJ^WAik->WA}^fn^N9pn?3fzPxd#^|e*zr*(Zx z`fdzN=fl>Br8A+n>kkG5`7TtfbI(fPyI&kL0AyzP%sHWqP6lAwAmyhr!N0Ama$D|- zB-6pC_ku@57%&u|L)SIEyP6TxsU)dnoF&~MuB zL$id(Rw#Pc3Np+JlDdHmGY(6>{Zmv~N+;rtWq~E%Pc>D^rB@NIUDoV0zF~Kdwjwcz zg$r?(GKx#O96kdrInUUqAL!8{e}LEn1@1A7_fqS(v=+X0Pe1OiHLne3A;{(0XX*llYWdc&|pP zOWL5Gx~+y&D2wB^mDz*Do~KLKzpHCKdA*ZzPD=QCwn~@HjhNT-IrY*3rZV||s8WY> zgl;#eBlX92(hs^s?i$-ssJ+s!W-Q`t?xy8ad2L59oh_u^Wee$bxVoE3_f14uM8nTq zrJI^2Zv4`Aeuw8mS)6d!FFLW}kT3%@lzHgaMM!f0N2VO4RCvCYt;T~Sxft+u9`V8al z=H?q@qK1+zFm7z3Ukzyt{3@&dd~*sHH&)CX@_)^%5v)E5#U;p@(IHpl=-la2Zxma25KZJQY z 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 P)@=TDu>Xh4Z@2ynvd;@B literal 0 HcmV?d00001 diff --git a/modules/moneybookers/prestashop_mb_fr.gif b/modules/moneybookers/prestashop_mb_fr.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec2bd9ddd37f38c15e597a702946b17348463f06 GIT binary patch literal 31807 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/moneybookers.php'); + +$moneyBookers = new MoneyBookers(); + +$errors = array(); + +/* Check for mandatory fields */ +$requiredFields = array('status', 'md5sig', 'merchant_id', 'pay_to_email', 'mb_amount', +'mb_transaction_id', 'currency', 'amount', 'transaction_id', 'pay_from_email', 'mb_currency'); + +foreach ($requiredFields AS $field) + if (!isset($_POST[$field])) + $errors[] = 'Missing field '.$field; + +/* Check for MD5 signature */ +$md5 = strtoupper(md5($_POST['merchant_id'].$_POST['transaction_id'].strtoupper(md5(Configuration::get('MB_SECRET_WORD'))).$_POST['mb_amount'].$_POST['mb_currency'].$_POST['status'])); +if ($md5 != $_POST['md5sig']) + $errors[] = 'Please double-check your Moneybookers account to make sure you have received the payment (Yours / MB) ['.$md5.'] ['.$_POST['md5sig'].']'; + +$message = ''; +foreach ($_POST AS $key => $value) + $message .= $key.': '.$value."\n"; +if (sizeof($errors)) +{ + $message .= sizeof($errors).' error(s):'."\n"; + + /* Force status to 1 - ERROR ! */ + $_POST['status'] = 1; +} +foreach ($errors AS $error) + $message .= $error."\n"; +$message = nl2br(strip_tags($message)); + +$id_cart = (int)(substr($_POST['transaction_id'], 0, strpos($_POST['transaction_id'], '_'))); +$secure_cart = explode('_', $_POST['transaction_id']); +$status = (int)($_POST['status']); +if (!isset($secure_cart[1])) + $secure_cart[1] = 'KO'; +switch ($status) +{ + /* Bankwire */ + case 0: + $moneyBookers->validateOrder((int)($secure_cart[0]), _PS_OS_BANKWIRE_, (float)($_POST['amount']), $moneyBookers->displayName, $message, array(), NULL, false, $secure_cart[1]); + break; + + /* Payment OK */ + case 2: + $moneyBookers->validateOrder((int)($secure_cart[0]), _PS_OS_PAYMENT_, (float)($_POST['amount']), $moneyBookers->displayName, $message, array(), NULL, false, $secure_cart[1]); + break; + + /* Unknown or error */ + default: + $moneyBookers->validateOrder((int)($secure_cart[0]), _PS_OS_ERROR_, 0, $moneyBookers->displayName, $message, array(), NULL, false, $secure_cart[1]); + break; +} + + diff --git a/modules/newsletter/config.xml b/modules/newsletter/config.xml new file mode 100755 index 000000000..f3e4ca012 --- /dev/null +++ b/modules/newsletter/config.xml @@ -0,0 +1,12 @@ + + + newsletter + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/newsletter/de.php b/modules/newsletter/de.php new file mode 100644 index 000000000..a5b3b3207 --- /dev/null +++ b/modules/newsletter/de.php @@ -0,0 +1,32 @@ +newsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_804a924e464fd21ed92f820224c4091d'] = 'Erzeugt eine .CSV-Datei für Massenmailings'; +$_MODULE['<{newsletter}prestashop>newsletter_c3987e4cac14a8456515f0d200da04ee'] = 'Alle Länder'; +$_MODULE['<{newsletter}prestashop>newsletter_fa01fd956e87307bce4c90a0de9b0437'] = 'Kundenländer'; +$_MODULE['<{newsletter}prestashop>newsletter_c0859b0a5241dff468da2a9a93c3284f'] = 'Betreiben Sie einen Filter für das Kundenland.'; +$_MODULE['<{newsletter}prestashop>newsletter_2198f293f5e1e95dddeff819fbca0975'] = 'Newsletter-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_99006a61d48499231e1be92241cf772a'] = 'Newsletter-Abonnenten Filtern.'; +$_MODULE['<{newsletter}prestashop>newsletter_7e3a51a56ddd2846e21c33f05e0aea6f'] = 'Alle Kunden'; +$_MODULE['<{newsletter}prestashop>newsletter_39f7a3e2b56e9bfd753ba6325533a127'] = 'Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_011d8c5d94f729f013963d856cd78745'] = 'Nicht-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_793ee192a9124cd6f529460eef17d3e5'] = 'Opt-in-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_7b15c043d66fecc45c8752592aa38e38'] = 'Opt-in Abonnenten filtern.'; +$_MODULE['<{newsletter}prestashop>newsletter_82e5e0bc0f9c776c98253d569c111c0f'] = 'Keine Kunden mit diesen Filtern gefunden!'; +$_MODULE['<{newsletter}prestashop>newsletter_d526d090aa22242fa5f6acfccc6bd007'] = 'Die .CSV-Datei wurde erfolgreich exportiert'; +$_MODULE['<{newsletter}prestashop>newsletter_55caa4828d4e935c2ba9f1558f1c4edd'] = 'Kunden gefunden'; +$_MODULE['<{newsletter}prestashop>newsletter_48e3d5f66961b621c78f709afcd7d437'] = 'Laden Sie die Datei herunter'; +$_MODULE['<{newsletter}prestashop>newsletter_faa1115fbab933e7178ee43ce1590977'] = 'ACHTUNG: Wenn Sie diese CSV-Datei mit Excel zu öffnen versuchen, vergessen Sie nicht, den UTF-8 Code zu wählen, sonst können seltsame Zeichen erscheinen'; +$_MODULE['<{newsletter}prestashop>newsletter_81573e0ea79138f02fd2cee94786d7e9'] = 'Fehler: kann nicht schreiben'; +$_MODULE['<{newsletter}prestashop>newsletter_8d550e9bf69bfc7a09be6eeb1622ae23'] = 'Es gibt zwei Arten für dieses Modul:'; +$_MODULE['<{newsletter}prestashop>newsletter_23e8f8a55548b88bfbdcd1f6ba26a010'] = 'Personen, die den Newsletter über den BlockNewsletter Block im Front-Office abonniert haben.'; +$_MODULE['<{newsletter}prestashop>newsletter_27d1ec406fd2baf49d03f81a4bb41122'] = 'Dies wird eine Liste mit E-Mails von Personen, die Ihren Shop besuchen und nicht Kunden werden, sondern Ihren Newsletter erhalten wollen. Mit der Benutzung der untenstehenden Liste \"Export Newsletter Abonnenten\"wird eine . CSV-Datei generiert, die auf den BlockNewsletter Abonnenten-Daten basiert .'; +$_MODULE['<{newsletter}prestashop>newsletter_74ca54506cdbc82e3aa763ba91b8fa39'] = 'Kunden, die \"ja\" angeklickt haben, um einen Newsletter in ihrem Kundenprofil zu erhalten.'; +$_MODULE['<{newsletter}prestashop>newsletter_1aa14f5a6423dbde1ef2cfe4734980b4'] = 'Der Abschnitt \"Export Kunden\" unten filtert die Kunden, denen Sie einen Newsletter schicken möchten.'; +$_MODULE['<{newsletter}prestashop>newsletter_b192ab83a19105bbf1e2d1fab548249a'] = 'Export Newsletter-Abonnenten'; +$_MODULE['<{newsletter}prestashop>newsletter_a60401e616125189d78605b2ddd7ff45'] = 'Erzeugen Sie eine. CSV-Datei aus BlockNewsletter Abonnenten-Daten.'; +$_MODULE['<{newsletter}prestashop>newsletter_dbb392a2dc9b38722e69f6032faea73e'] = '.CSV-Datei exportieren'; +$_MODULE['<{newsletter}prestashop>newsletter_4713ef5f2d6fc1e8f088c850e696a04b'] = 'Kunden exportieren '; +$_MODULE['<{newsletter}prestashop>newsletter_2f5a2bf1a10d25a408a8bab945e4dd3c'] = '.CSV-Datei aus Kunden-Konto-Daten generieren '; diff --git a/modules/newsletter/en.php b/modules/newsletter/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/newsletter/en.php @@ -0,0 +1,4 @@ +newsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_804a924e464fd21ed92f820224c4091d'] = 'Genere un fichero .CSV para mailing masivo'; +$_MODULE['<{newsletter}prestashop>newsletter_c3987e4cac14a8456515f0d200da04ee'] = 'Todos los países'; +$_MODULE['<{newsletter}prestashop>newsletter_fa01fd956e87307bce4c90a0de9b0437'] = 'País del cliente'; +$_MODULE['<{newsletter}prestashop>newsletter_c0859b0a5241dff468da2a9a93c3284f'] = 'Aplicar un filtro al país del cliente'; +$_MODULE['<{newsletter}prestashop>newsletter_2198f293f5e1e95dddeff819fbca0975'] = 'Suscritos a la newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_99006a61d48499231e1be92241cf772a'] = 'Filtro de suscriptores a la newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_7e3a51a56ddd2846e21c33f05e0aea6f'] = 'Todos los clientes'; +$_MODULE['<{newsletter}prestashop>newsletter_39f7a3e2b56e9bfd753ba6325533a127'] = 'suscritos'; +$_MODULE['<{newsletter}prestashop>newsletter_011d8c5d94f729f013963d856cd78745'] = 'no suscritos'; +$_MODULE['<{newsletter}prestashop>newsletter_793ee192a9124cd6f529460eef17d3e5'] = 'Inscritos a publicidades'; +$_MODULE['<{newsletter}prestashop>newsletter_7b15c043d66fecc45c8752592aa38e38'] = 'Operar un filtro a los inscritos a publicidades'; +$_MODULE['<{newsletter}prestashop>newsletter_82e5e0bc0f9c776c98253d569c111c0f'] = 'Noy hay clientes a los que se aplique este filtro'; +$_MODULE['<{newsletter}prestashop>newsletter_d526d090aa22242fa5f6acfccc6bd007'] = 'El fichero .CSV ha sido exportado correctamente'; +$_MODULE['<{newsletter}prestashop>newsletter_55caa4828d4e935c2ba9f1558f1c4edd'] = 'clientes encontrados'; +$_MODULE['<{newsletter}prestashop>newsletter_48e3d5f66961b621c78f709afcd7d437'] = 'Descargar el fichero'; +$_MODULE['<{newsletter}prestashop>newsletter_faa1115fbab933e7178ee43ce1590977'] = 'ATENCION: Si trata de abrir el fichero .CSV con Excel, no olvide seleccionar el UTF-8 para el encodage, si no aparecerán caracteres incorrectos'; +$_MODULE['<{newsletter}prestashop>newsletter_81573e0ea79138f02fd2cee94786d7e9'] = 'Error: imposible escribir en'; +$_MODULE['<{newsletter}prestashop>newsletter_8d550e9bf69bfc7a09be6eeb1622ae23'] = 'Hay dos tipos de módulos:'; +$_MODULE['<{newsletter}prestashop>newsletter_23e8f8a55548b88bfbdcd1f6ba26a010'] = 'Las personas que hayan suscrito utilizando el bloque newsletter en la página de inicio.'; +$_MODULE['<{newsletter}prestashop>newsletter_27d1ec406fd2baf49d03f81a4bb41122'] = 'Esta será una lista de direcciones de correo para las personas que visiten su tienda y no se convierta en clientes, pero que desean obtener su newsletter. Use \\\"Newsletter Suscriptores de exportación\\\" más abajo para generar una . CSV sobre la base de los usuarios de los datos del bloque Newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_74ca54506cdbc82e3aa763ba91b8fa39'] = 'Los clientes que han dicho \"sí\" para recibir la newsletter en su perfil de cliente.'; +$_MODULE['<{newsletter}prestashop>newsletter_1aa14f5a6423dbde1ef2cfe4734980b4'] = 'La sección \"exportación clientes\" debajo de los filtros para clientes a los que quiere enviar la newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_b192ab83a19105bbf1e2d1fab548249a'] = 'Exportar suscritos a la newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_a60401e616125189d78605b2ddd7ff45'] = 'Generar un archivo. CSV BlockNewsletter sobre la base de datos de suscriptores.'; +$_MODULE['<{newsletter}prestashop>newsletter_dbb392a2dc9b38722e69f6032faea73e'] = 'Exportar un fichero .CSV'; +$_MODULE['<{newsletter}prestashop>newsletter_4713ef5f2d6fc1e8f088c850e696a04b'] = 'Exportar clientes'; +$_MODULE['<{newsletter}prestashop>newsletter_2f5a2bf1a10d25a408a8bab945e4dd3c'] = 'Generar un archivo. CSV de datos de la cuenta del cliente'; diff --git a/modules/newsletter/fr.php b/modules/newsletter/fr.php new file mode 100644 index 000000000..60c7c154f --- /dev/null +++ b/modules/newsletter/fr.php @@ -0,0 +1,32 @@ +newsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Lettre d\'informations'; +$_MODULE['<{newsletter}prestashop>newsletter_804a924e464fd21ed92f820224c4091d'] = 'Génère un fichier .CSV pour votre envoi d\'e-mails'; +$_MODULE['<{newsletter}prestashop>newsletter_c3987e4cac14a8456515f0d200da04ee'] = 'Tous les pays'; +$_MODULE['<{newsletter}prestashop>newsletter_fa01fd956e87307bce4c90a0de9b0437'] = 'Pays du client'; +$_MODULE['<{newsletter}prestashop>newsletter_c0859b0a5241dff468da2a9a93c3284f'] = 'Opérer un filtre sur le pays des clients.'; +$_MODULE['<{newsletter}prestashop>newsletter_2198f293f5e1e95dddeff819fbca0975'] = 'Inscrits lettre d\'info.'; +$_MODULE['<{newsletter}prestashop>newsletter_99006a61d48499231e1be92241cf772a'] = 'Opérer un filtre sur les inscrits à la lettre d\'information.'; +$_MODULE['<{newsletter}prestashop>newsletter_7e3a51a56ddd2846e21c33f05e0aea6f'] = 'Tous les clients'; +$_MODULE['<{newsletter}prestashop>newsletter_39f7a3e2b56e9bfd753ba6325533a127'] = 'Inscrits'; +$_MODULE['<{newsletter}prestashop>newsletter_011d8c5d94f729f013963d856cd78745'] = 'Non-inscrits'; +$_MODULE['<{newsletter}prestashop>newsletter_793ee192a9124cd6f529460eef17d3e5'] = 'Inscrits pub'; +$_MODULE['<{newsletter}prestashop>newsletter_7b15c043d66fecc45c8752592aa38e38'] = 'Opérer un filtre sur les inscrits aux messages publicitaires.'; +$_MODULE['<{newsletter}prestashop>newsletter_82e5e0bc0f9c776c98253d569c111c0f'] = 'Aucun client trouvé avec ces paramètres'; +$_MODULE['<{newsletter}prestashop>newsletter_d526d090aa22242fa5f6acfccc6bd007'] = 'Le fichier .CSV a été créé avec succès'; +$_MODULE['<{newsletter}prestashop>newsletter_55caa4828d4e935c2ba9f1558f1c4edd'] = 'clients trouvés'; +$_MODULE['<{newsletter}prestashop>newsletter_48e3d5f66961b621c78f709afcd7d437'] = 'Télécharger le fichier'; +$_MODULE['<{newsletter}prestashop>newsletter_faa1115fbab933e7178ee43ce1590977'] = 'ATTENTION: Si vous tentez d\'ouvrir le fichier .csv avec Excel, n\'oubliez pas de sélectionner l\'UTF-8 comme encodage, sinon vous aurez des caractères incorrects'; +$_MODULE['<{newsletter}prestashop>newsletter_81573e0ea79138f02fd2cee94786d7e9'] = 'Erreur : impossible d\'écrire vers'; +$_MODULE['<{newsletter}prestashop>newsletter_8d550e9bf69bfc7a09be6eeb1622ae23'] = 'Ce module est divisé en 2 parties :'; +$_MODULE['<{newsletter}prestashop>newsletter_23e8f8a55548b88bfbdcd1f6ba26a010'] = 'Les personnes ayant indiqué leur adresse dans le bloc newsletter de la page d\'accueil'; +$_MODULE['<{newsletter}prestashop>newsletter_27d1ec406fd2baf49d03f81a4bb41122'] = 'La liste ne comprendra alors que les adresses e-mails.'; +$_MODULE['<{newsletter}prestashop>newsletter_74ca54506cdbc82e3aa763ba91b8fa39'] = 'Les clients ayant coché la case \"oui\" pour la souscription à la liste de diffusion.'; +$_MODULE['<{newsletter}prestashop>newsletter_1aa14f5a6423dbde1ef2cfe4734980b4'] = 'Cette liste pourra être triée selon le type de client.'; +$_MODULE['<{newsletter}prestashop>newsletter_b192ab83a19105bbf1e2d1fab548249a'] = 'Exporter les inscrits à la newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_a60401e616125189d78605b2ddd7ff45'] = 'Génère un fichier .CSV à partir des données des inscrits au BlockNewsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_dbb392a2dc9b38722e69f6032faea73e'] = 'Exporte un fichier CSV'; +$_MODULE['<{newsletter}prestashop>newsletter_4713ef5f2d6fc1e8f088c850e696a04b'] = 'Export des clients'; +$_MODULE['<{newsletter}prestashop>newsletter_2f5a2bf1a10d25a408a8bab945e4dd3c'] = 'Génère un fichier .CSV à partir des données des clients.'; diff --git a/modules/newsletter/it.php b/modules/newsletter/it.php new file mode 100644 index 000000000..a731d6d14 --- /dev/null +++ b/modules/newsletter/it.php @@ -0,0 +1,32 @@ +newsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_804a924e464fd21ed92f820224c4091d'] = 'Genera un file. CSV per invii di massa'; +$_MODULE['<{newsletter}prestashop>newsletter_c3987e4cac14a8456515f0d200da04ee'] = 'Tutti i paesi'; +$_MODULE['<{newsletter}prestashop>newsletter_fa01fd956e87307bce4c90a0de9b0437'] = 'Paese dei clienti'; +$_MODULE['<{newsletter}prestashop>newsletter_c0859b0a5241dff468da2a9a93c3284f'] = 'Opera un filtro sul paese dei clienti.'; +$_MODULE['<{newsletter}prestashop>newsletter_2198f293f5e1e95dddeff819fbca0975'] = 'Iscritti alla newsletter'; +$_MODULE['<{newsletter}prestashop>newsletter_99006a61d48499231e1be92241cf772a'] = 'Filtro iscritti newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_7e3a51a56ddd2846e21c33f05e0aea6f'] = 'Tutti i clienti'; +$_MODULE['<{newsletter}prestashop>newsletter_39f7a3e2b56e9bfd753ba6325533a127'] = 'Iscritti'; +$_MODULE['<{newsletter}prestashop>newsletter_011d8c5d94f729f013963d856cd78745'] = 'Non iscritti'; +$_MODULE['<{newsletter}prestashop>newsletter_793ee192a9124cd6f529460eef17d3e5'] = 'Iscritti opt-in'; +$_MODULE['<{newsletter}prestashop>newsletter_7b15c043d66fecc45c8752592aa38e38'] = 'Sottoscrittori opt-in filtri'; +$_MODULE['<{newsletter}prestashop>newsletter_82e5e0bc0f9c776c98253d569c111c0f'] = 'Nessun cliente trovato con questi filtri!'; +$_MODULE['<{newsletter}prestashop>newsletter_d526d090aa22242fa5f6acfccc6bd007'] = 'Il file. CSV è stato esportato con successo'; +$_MODULE['<{newsletter}prestashop>newsletter_55caa4828d4e935c2ba9f1558f1c4edd'] = 'cliente trovato'; +$_MODULE['<{newsletter}prestashop>newsletter_48e3d5f66961b621c78f709afcd7d437'] = 'Scarica il file'; +$_MODULE['<{newsletter}prestashop>newsletter_faa1115fbab933e7178ee43ce1590977'] = '. ATTENZIONE: Se si tenta di aprire questo file .csv con Excel, non dimenticare di scegliere la codifica UTF-8 o puoi vedere caratteri strani'; +$_MODULE['<{newsletter}prestashop>newsletter_81573e0ea79138f02fd2cee94786d7e9'] = 'Errore: impossibile scrivere a'; +$_MODULE['<{newsletter}prestashop>newsletter_8d550e9bf69bfc7a09be6eeb1622ae23'] = 'Modulo diviso in due tipologie:'; +$_MODULE['<{newsletter}prestashop>newsletter_23e8f8a55548b88bfbdcd1f6ba26a010'] = 'Le persone che si sono iscritte usando il blocco BlockNewsletter nel front office.'; +$_MODULE['<{newsletter}prestashop>newsletter_27d1ec406fd2baf49d03f81a4bb41122'] = 'Questo sarà un elenco di indirizzi email delle persone che si recano nel tuo negozio non per diventare un cliente, ma per ottenere la tua newsletter. Utilizzando il seguente \"Esporta iscritti alla newsletter\" genererà un file. CSV sulla base dei dati abbonati BlockNewsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_74ca54506cdbc82e3aa763ba91b8fa39'] = 'I clienti che hanno risposto \"sì\" per ricevere una newsletter nel loro profilo del cliente.'; +$_MODULE['<{newsletter}prestashop>newsletter_1aa14f5a6423dbde1ef2cfe4734980b4'] = 'La sezione seguente \"Esporta clienti\" filtra a quali clienti si desidera inviare una newsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_b192ab83a19105bbf1e2d1fab548249a'] = 'Export Newsletter Iscritti'; +$_MODULE['<{newsletter}prestashop>newsletter_a60401e616125189d78605b2ddd7ff45'] = 'Genera un file. CSV sulla base dei dati abbonati BlockNewsletter.'; +$_MODULE['<{newsletter}prestashop>newsletter_dbb392a2dc9b38722e69f6032faea73e'] = 'Esporta file. CSV'; +$_MODULE['<{newsletter}prestashop>newsletter_4713ef5f2d6fc1e8f088c850e696a04b'] = 'Esporta clienti'; +$_MODULE['<{newsletter}prestashop>newsletter_2f5a2bf1a10d25a408a8bab945e4dd3c'] = 'Genera un file. CSV dai dati account clienti'; diff --git a/modules/newsletter/logo.gif b/modules/newsletter/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dd879dab4c880aaa0593a92b497456037c82c1 GIT binary patch literal 983 zcmZ?wbhEHb6krfwXlG!s&DmmIwA-#?pLgN9_?lI&r3amA4*J&|32WXO(7r#aeQR|4 zuGr3Pp3R4Y+l~fw9gk`~8PRnjw&zr8@0t9m7Yb)wte$iEx9^j-<#$@v-s@U%ea_}< z^S9mUS^s$ImdCUAy`8`B<&@nYmK}Ms>gd}|r(f+j|7OG4kGn6t*>?TUo~vK>-~My% z*6YK!e;mF4=j?+Y*Pi^m_WbY7Cm-)V|9| z$)e!GfrCs;G8Hc#9Nf6rUDjM8;=)76wmwOX^cx#CI=i(=@N0Z92n=HHooZ2b<%NLK z@n%k&gbPzPGPCo^S=%r8z^SOwBPfwou%_{0Gnc3xKTD~jlZ&UMoJ&W-#Y5?ga{697 z8YVKabch)2*tFxL!ht?v{frA9Gbd&DvNIQ5x!_pQ{_wDM-kJah1_uU4HXf51cN7|* RvT$%H+&Qz;_;~|^H2?}N&ustz literal 0 HcmV?d00001 diff --git a/modules/newsletter/newsletter.php b/modules/newsletter/newsletter.php new file mode 100644 index 000000000..23522a47e --- /dev/null +++ b/modules/newsletter/newsletter.php @@ -0,0 +1,234 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Newsletter extends Module +{ + private $_postErrors = array(); + private $_html = ''; + private $_postSucess; + + public function __construct() + { + global $cookie; + + $this->name = 'newsletter'; + $this->tab = 'administration'; + $this->version = 2.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Newsletter'); + $this->description = $this->l('Generates a .CSV file for mass mailings'); + + if ($this->id) + { + $this->_file = 'export_'.Configuration::get('PS_NEWSLETTER_RAND').'.csv'; + $this->_postValid = array(); + + // Getting data... + $_countries = Country::getCountries((int)($cookie->id_lang)); + + // ...formatting array + $countries[0] = $this->l('All countries'); + foreach ($_countries as $country) + $countries[$country['id_country']] = $country['name']; + + // And filling fields to show ! + $this->_fieldsExport = array( + 'COUNTRY' => array( + 'title' => $this->l('Customers\' country'), + 'desc' => $this->l('Operate a filter on customers\' country.'), + 'type' => 'select', + 'value' => $countries, + 'value_default' => 0 + ), + 'SUSCRIBERS' => array( + 'title' => $this->l('Newsletter subscribers'), + 'desc' => $this->l('Filter newsletter subscribers.'), + 'type' => 'select', + 'value' => array(0 => $this->l('All customers'), 2 => $this->l('Subscribers'), 1 => $this->l('Non-subscribers')), + 'value_default' => 2 + ), + 'OPTIN' => array( + 'title' => $this->l('Opted-in subscribers'), + 'desc' => $this->l('Filter opted-in subscribers.'), + 'type' => 'select', + 'value' => array(0 => $this->l('All customers'), 2 => $this->l('Subscribers'), 1 => $this->l('Non-subscribers')), + 'value_default' => 0 + ), + ); + } + } + + public function install() + { + return (parent::install() AND Configuration::updateValue('PS_NEWSLETTER_RAND', rand().rand())); + } + + private function _postProcess() + { + if (isset($_POST['submitExport']) AND isset($_POST['action'])) + { + if ($_POST['action'] == 'customers') + $result = $this->_getCustomers(); + else + { + if (!Module::isInstalled('blocknewsletter')) + $this->_html .= $this->displayError('The module "blocknewsletter" is required for this feature'); + else + $result = $this->_getBlockNewsletter(); + } + if (!$nb = (int)(Db::getInstance(_PS_USE_SQL_SLAVE_)->NumRows())) + $this->_html .= $this->displayError($this->l('No customers found with these filters!')); + elseif ($fd = @fopen(dirname(__FILE__).'/'.strval(preg_replace('#\.{2,}#', '.', $_POST['action'])).'_'.$this->_file, 'w')) + { + foreach ($result AS $tab) + $this->_my_fputcsv($fd, $tab); + fclose($fd); + $this->_html .= $this->displayConfirmation( + $this->l('The .CSV file has been successfully exported.'). + ' ('.$nb.' '.$this->l('customers found').')
    > +
    '.$this->l('Download the file').' '.$this->_file.' +
    +
      +
    1. '.$this->l('WARNING: If opening this .csv file with Excel, remember to choose UTF-8 encoding or you may see strange characters.').'
    2. +
    '); + } + else + $this->_html .= $this->displayError($this->l('Error: cannot write').' '.dirname(__FILE__).'/'.strval($_POST['action']).'_'.$this->_file.' !'); + } + } + + private function _getCustomers() + { + $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`, c.`ip_registration_newsletter`, c.`newsletter_date_add` + FROM `'._DB_PREFIX_.'customer` c + WHERE 1 + '.((isset($_POST['SUSCRIBERS']) AND (int)($_POST['SUSCRIBERS']) != 0) ? 'AND c.`newsletter` = '.(int)($_POST['SUSCRIBERS'] - 1) : '').' + '.((isset($_POST['OPTIN']) AND (int)($_POST['OPTIN']) != 0) ? 'AND c.`optin` = '.(int)($_POST['OPTIN'] - 1) : '').' + '.((isset($_POST['COUNTRY']) AND (int)($_POST['COUNTRY']) != 0) ? 'AND (SELECT COUNT(a.`id_address`) as nb_country FROM `'._DB_PREFIX_.'address` a WHERE a.`id_customer` = c.`id_customer` AND a.`id_country` = '.(int)($_POST['COUNTRY']).') >= 1' : '').' + GROUP BY c.`email`'); + $header = array('id_customer', 'lastname', 'firstname', 'email', 'ip_address', 'newsletter_date_add'); + $result = (is_array($rq) ? array_merge(array($header), $rq) : $header); + return $result; + } + + private function _getBlockNewsletter() + { + $rq = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'newsletter`'); + $header = array('id_customer', 'email', 'newsletter_date_add', 'ip_address'); + $result = (is_array($rq) ? array_merge(array($header), $rq) : $header); + return $result; + } + + private function _my_fputcsv($fd, $array) + { + $line = implode(';', $array); + $line .= "\n"; + if (!fwrite($fd, $line, 4096)) + $this->_postErrors[] = $this->l('Error: cannot write').' '.dirname(__FILE__).'/'.$this->_file.' !'; + } + + private function _displayFormExport() + { + $this->_html .= ' +
    + '.$this->l('There are two sorts for this module:').' +

      +
    1. + '.$this->l('Persons who have subscribed using the BlockNewsletter block in the front office.').'
      + '.$this->l('This is a list of e-mail addresses of persons who come to your store that do not become customers, but have subscribed to your newsletter. Using the "Export Newsletter Subscribers" below will generate a .CSV file based on the BlockNewsletter subscribers data.').'

      '.' +
    2. +
    3. + '.$this->l('Customers that have checked "yes" to receive a newsletter in their customer profile.').'
      + '.$this->l('The "Export Customers" section below filters which customers you want to send a newsletter to.').' +
    4. +
    +

    +

    +
    '.$this->l('Export Newsletter Subscribers').' +
    + + '.$this->l('Generate a .CSV file based on BlockNewsletter subscribers data.').'.

    '; + $this->_html .= '
    +
    +

    +
    '.$this->l('Export customers').' +
    + + '.$this->l('Generate a .CSV file from customer account data').'.

    '; + foreach ($this->_fieldsExport as $key => $field) + { + $this->_html .= ' + +
    '; + switch ($field['type']) + { + case 'select': + $this->_html .= ''; + break; + default: + break; + } + if (isset($field['desc']) AND !empty($field['desc'])) + $this->_html .= '

    '.$field['desc'].'

    '; + $this->_html .= ' +
    '; + } + $this->_html .= '
    +
    +
    '; + } + + private function _displayForm() + { + $this->_displayFormExport(); + } + + public function getContent() + { + $this->_html .= '

    '.$this->displayName.'

    '; + + if (!empty($_POST)) + $this->_html .= $this->_postProcess(); + $this->_displayForm(); + + return $this->_html; + } +} + diff --git a/modules/ogone/checkwaitingorder.php b/modules/ogone/checkwaitingorder.php new file mode 100644 index 000000000..784a36825 --- /dev/null +++ b/modules/ogone/checkwaitingorder.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +die( + Db::getInstance()->getValue('SELECT id_order FROM '._DB_PREFIX_.'orders WHERE id_cart = '.(int)Tools::getValue('id_cart').' AND secure_key = "'.pSQL(Tools::getValue('key')).'"') + ? 'ok' + : 'ko' +); + + diff --git a/modules/ogone/config.xml b/modules/ogone/config.xml new file mode 100755 index 000000000..d262f28cb --- /dev/null +++ b/modules/ogone/config.xml @@ -0,0 +1,12 @@ + + + ogone + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/ogone/confirmation.php b/modules/ogone/confirmation.php new file mode 100644 index 000000000..147a1714d --- /dev/null +++ b/modules/ogone/confirmation.php @@ -0,0 +1,48 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../header.php'); +include(dirname(__FILE__).'/ogone.php'); + +$ogone = new Ogone(); +$id_module = $ogone->id; +$id_cart = Tools::getValue('orderID'); +$key = Db::getInstance()->getValue('SELECT secure_key FROM '._DB_PREFIX_.'customer WHERE id_customer = '.(int)$cookie->id_customer); +$link = new Link(); + +$smarty->assign(array( + 'id_module' => $id_module, + 'id_cart' => $id_cart, + 'key' => $key, + 'ogone_link' => (method_exists($link, 'getPageLink') ? $link->getPageLink('my-account') : _PS_BASE_URL_.'my-account') + )); +echo $ogone->display(dirname(__FILE__), 'waiting.tpl'); + +include(dirname(__FILE__).'/../../footer.php'); + + diff --git a/modules/ogone/de.php b/modules/ogone/de.php new file mode 100644 index 000000000..6051aebfc --- /dev/null +++ b/modules/ogone/de.php @@ -0,0 +1,45 @@ +hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Ihre Bestellung wird so schnell wie möglich zugeschickt.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Wir haben ein Problem bei Ihrer Bestellung festgestellt. Wenn Sie denken, dies sei ein Fehler, können Sie an unseren'; +$_MODULE['<{ogone}prestashop>ogone_75310bf8b7cf2ca4e09332871f98c271'] = 'Bezahlen Sie mit Ogone'; +$_MODULE['<{ogone}prestashop>ogone_51e550f8a0e9e127a566c21e9a15538b'] = 'Ogone Logo'; +$_MODULE['<{ogone}prestashop>ogone_15ee0c3bac84f0ff0a2af1e6cdc1a048'] = 'Bezahlen Sie sicher und schnell auf der nächsten Seite mit IDEAL / Mastercard / Visa / Paypal / Mister Cash / Bancontact.'; +$_MODULE['<{ogone}prestashop>ogone_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{ogone}prestashop>ogone_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Hilfe'; +$_MODULE['<{ogone}prestashop>ogone_c3aace2676937d5cb50e536abbe9113d'] = 'Folgen Sie zunächst diesen Schritten:'; +$_MODULE['<{ogone}prestashop>ogone_0ad87dec5bc422a24ca801c473d44213'] = 'PrestaShop Seite'; +$_MODULE['<{ogone}prestashop>ogone_1d1f6896858b1bc96cecf995b1800a82'] = 'Füllen Sie Ihre Ogone-ID (PSPID) aus'; +$_MODULE['<{ogone}prestashop>ogone_c76d97611c239318461a32e3ce151b83'] = 'Füllen Sie die Signaturen Ihrer Wahl aus (Sie müssen Sie dann in das Ogone Back-Office kopieren)'; +$_MODULE['<{ogone}prestashop>ogone_8c2fc0d78cab9c2bd9cef54931cc0808'] = 'Wählen Sie den Test-Modus, wenn Sie gerade Ihr Test-Konto auf Ogone erstellt haben (es funktioniert nicht mit dem Demo-Konto)'; +$_MODULE['<{ogone}prestashop>ogone_39963c4d14081a701198768d7b9b00d9'] = 'Ogone Seite'; +$_MODULE['<{ogone}prestashop>ogone_2ee3d80e1919fc84a184c727e3ccfa20'] = 'Test-Modus'; +$_MODULE['<{ogone}prestashop>ogone_20226890d13b230111fe30e1eb7a167b'] = 'Betriebsmodus'; +$_MODULE['<{ogone}prestashop>ogone_38056880101f21752c2dbce4549b8423'] = 'Siehe Screenshot für Schritt'; +$_MODULE['<{ogone}prestashop>ogone_8da6d1ecd712792004829aa57eb4a9f7'] = 'Testkarten'; +$_MODULE['<{ogone}prestashop>ogone_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{ogone}prestashop>ogone_05d749acfbb6a79553aef6a644db881f'] = 'PSPID'; +$_MODULE['<{ogone}prestashop>ogone_ac3b5413fdb77e3726a94891c9844b44'] = 'SHA-in Signatur'; +$_MODULE['<{ogone}prestashop>ogone_7c287610a5cd0fddf4261f153996da5e'] = 'SHA-out Signatur'; +$_MODULE['<{ogone}prestashop>ogone_650be61892bf690026089544abbd9d26'] = 'Modus'; +$_MODULE['<{ogone}prestashop>ogone_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{ogone}prestashop>ogone_756d97bb256b8580d4d71ee0c547804e'] = 'Betrieb'; +$_MODULE['<{ogone}prestashop>ogone_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{ogone}prestashop>waiting_1fe3bb016fa11dd93fb1929f118fd492'] = 'Bitte warten, Ihre Bestellung wird bearbeitet ...'; +$_MODULE['<{ogone}prestashop>validation_e9f77209121063c8aedd7698f20f4878'] = 'Eingegangene Parameter:'; +$_MODULE['<{ogone}prestashop>validation_273e5454628021d87e34051074ac62d1'] = 'Fehlende Parameter:'; +$_MODULE['<{ogone}prestashop>validation_cbb285f0e88adea7d492a5b14b9e6d1d'] = 'Fehler (Auth. abgelehnt)'; +$_MODULE['<{ogone}prestashop>validation_ee5698e64b5157ad1cbe6aa614288c33'] = 'Zahlung autorisiert / OK'; +$_MODULE['<{ogone}prestashop>validation_6b4fcb57371df22836b78f67bc444213'] = 'Unbekannter Status:'; +$_MODULE['<{ogone}prestashop>validation_a04830387e55082ed6096ab698ac8238'] = 'Ungültige SHA-1 Signatur'; +$_MODULE['<{ogone}prestashop>validation_7eaab6a852dfe4707acde8847dba7ce9'] = 'SHA-1 gegeben:'; +$_MODULE['<{ogone}prestashop>validation_8fbed6331a34a844224bfee15145e00f'] = 'SHA-1 berechnet:'; +$_MODULE['<{ogone}prestashop>validation_671c1f78cd9a17103c43a10d19157678'] = 'Voller Schlüssel'; + +?> \ No newline at end of file diff --git a/modules/ogone/docs/en1.png b/modules/ogone/docs/en1.png new file mode 100644 index 0000000000000000000000000000000000000000..55e4d57ea0ed0441d258cb19773eea923e53d1f2 GIT binary patch literal 29227 zcmeFZ2T+q;+b&8`YzRsbk*a`ncmV|d%w#QS0+|}RH9Myrj#m<)hg&u zj^2W)d27QZoO<-ax~($2YL7))>tY11bn=xsbv}zNo(*8Lw9+%~J7^E>=m_g6-Z*nR z=1DT6OJ68$?B!-z#+7rH?z>0KlCef`?Ur(>AR0xPnLb9xAI!@1n zPM7f%3sUax<}WWRd*o4NghH)b79LMbq?Z>_o{aP9iK2=@jgDG*dvocKxDoaY$48>Z z#>P4xA15TNpZ|I?2!_Kv2^^-hsdI1ZhGq;==HK-hACai5s!J(gsn*l)E)_i)xO|=E zLd-WDyzz@;dNTdWI2(M7w6V8 z5`0Y7Cu`B6y3z(_W=RP?a&BYgm6emaq#sl>JluzRzmh^%z;J38V_5xMWA0=<SC+|fiz5%z5C*_bY+z`M|3@{_?2KLx>GYu`7Yd=$nL!Qqzqfli*>77jOAt#(Ra zJ+;8QYgBD%Vey@)))emO;6S(KE%bUZ(~z6`1I+6 zqv)s(oUn)80o{3LeB&d$bEfsARD8J2Jcoib2Zz;Yb}>>xiidh{yk_(~p+zD=GoqxU zDFrv#`#8)vvG%WZe4|7Efs$Ed_Uow2at!PRZS4zxbDvp=Vy93Yaw=xxRX50VVi7ev|%GDz!I#_JF#Fb`+=N8RI>Jt+D^$)Bf z3;IeteWSi_bTMT1)KAqtRS*(@oo9O!?q!;f96{BY`Pe>e@@jbJ(^_qj>^Q8xNqB31 z=(#K6?TgfX=|KPZY|PtD)B`I*fBjV3Bknep#BIrHf1cH=Ki-fI7Rny``OT%pFD>P^ zkQ5l?yD)YjTWB~j(k}D!RMc%gwuEs?OtCe=m^JK7-2#7MQh zCR1=B>wH4o>{iH7l7i3p=AHMLP&NdDg)8!ECXNwRrMzS0l zGbb32$m7P19}vm0T~DXPC2@vL><| zYzIGL2X^{PmhLBRXNzqOevR#Dom3Yd7wU4`yZ1@RusIp!a&xO%WlDfZ?>zSoRb8-) zIm|atr;d?m-&fx#MBBAUUkMu*>h*!Q{Fa`R;Q#m_k0?{_XO&sOCbqSc<&jpl(Y-<( zd@v_eGNXYWoKEUQ<~uC4NLS89cr)ikC3%%O>MUF>MsUdY#rp(@Nw23x!;LVkjJH2E z&2Y{{mpilzY&1JzHzMKRz6e|T2UPBcVBzXBHnV6K8KkbO1Fyv`tO&+G9@v=#^5T;1 z>AvNao*Ih=smQFmovuxDJ}e*873e&plHtq-rMkmzHI`FTeLAz4a%ZJEk#Evh2EkU6 zAtc&{c-av7=lT5^%t@~nXXbX% z4mLFk#b_<>rrHdoVMrf~B^symB;wE{9ImKYB*w$qXo#A%znYmZ|TPsO&uxpIB zpZRaA4RcgFS+FP4uyajV`f#ZG3LNF7WDC={|G*12MUA~&{9RsoB)S`ktu1RWM(4lD z-6v+fb4hK8aSW($S-tG-)WoQg+@2{dQKi)wkFVXy@=1HNw;-SP>g9rxm5)y%(k7WD z{&wG!wk!!#jqXZE9qiTOQV#Dd^J%k6e^gsKaV)8+-&sBpPx@fOqi5>~GjU`(#x20G zlRVAVOZ;`%L~okW?R`%fnZO(4!jj!(v0D3fju2F)HQ3i$=RPSit=+DFJHEq>wQw)< z;KO96ThARb&fMlT_kJ;QRdldz`&k@9dhapt*%HMJi@(@gXu|y9#z?ZjUPkUc#0zny zSCxnkM(Zzcl_)I+XpB7gDQ#sDm+fw`x)H*XYfC!~^n&ZGv64zG9MAgQ)@K^vSI|*E z@X0p$_u949GRN@OANRi!+Q0S_d0J&c6?SNOdrx%`)%sxTwW!}OTGc5IXBhtPTL``@O&?jU#GHne9bG6g)JC4d6FvMIF?xLhjl7Ad6CL;(7i+Ur_ z{-|VTj%(EAK9lg~r$5^MF47_rk0RXlo0MWBOrjj?-@TZL@}3EhITnx6Cd+v}&E~ja zgj|qH*MDhg)S6Kg`J=MEnDD4+o8B$cvN=HAGeV}#Xm#I}F>^Jfw6tBWx(R*cV!2!$ zevHAW_W9KK&S-uB z`D>X8=9f~)1?##+&b#wr`(B{w8Uu3~dEI7Q>KLhnP2jNCk;}m+eEM7({4zp4FRm$G zE8jT3E3fy4O6^&}L+i|7$(m=lGgdbrOq?!v5umFwnYb9^TG=@!?^|Ol%y@@Fhb^xU zR=(B^zsi1Z{Z;(J?Fr4AIiIv2ZR!m1%2NIM#@6iaKkc!(r&VOk8?1aXJq_JZ!d%Y8M&RUBe5q7*89 z#MJ73W-?CSfMxhIKmQ52%B^XOq6cVNc5!N0*^A!9M4Os3?|qtC+Yw)q&4y%Ef|G0y z;{7XFVy%eF@8&3T2FmaBt2UQ8_BE*t-@{ZpWFFq$OTATjr{&1hCF@oF}UmD?Jxgx0^VC$}>5MbZbw;n6{5i@^A*fbG3x^*}lwSrI1<_$N8Db9FT6=S)GPW^1WjTme6X`YL2Y-sis@ zJsMa-*DB$@EVs(9mAX{F=|)DVhN+upo`kybH_p#>Omg2eVP?<5B-|pm$>)HrHqjiP zW^-GK44*X>n5tB$i3~F3+tfNMBl9LJ3I8RvZK{tCt#Fgq>3@k?FR@=&Aj{Fd#Qq2b zlt-|WfD**i|8b#HDzNB(A3C0m31t2Eq3tDhQn}!N8?0T2k@-;m+c5J^;HjOf|2A}d zOLA^m7qlxD!<8(8LFGM9S{v}Bwg+vDNv|B}t9 z1wfykq(>w`_>(s<<-k*aKA|V2`Sa%SDV0BO9$x{ z@B)fi?~MIg29h|tfkh8UhCq2R`|S%M3RyIdr;;9Swr z%%VH4H;YYq%=NDKxm|BZfo=oZ~$WkzEPPx!8kmHtI&KwuBpw6E8glH=R?-fRu%2XIfDHFHkSG~Sq| z4Y;%sN{rmOXP=Jvu%qo{7!hV@)!N#?o)_3y0&T zMq7RH4>mLWby)Y8$X)F`YIi65u?nL;Jp|`BvvLQ)Yxq?C`GUswbMGMmNK7J0&ULKp zv^2=l9jY}Tjy(9Uo==#{x1m9J|IDPmn~95d4#n-nteyAgcw>V|9Du4qBqW2tcBR%B zuQF_i`L+=HirRj6fK{dbau?gIQy^}>J2>d448`TnbY{HTyo2#RK7tz<8@|85Ak?uu z_JNY>VkdYpu6dz&B`IaC!j5mi z$V4F>nPmDaHaP3I`uea}f%)oPpRVQ|;>v8jf1Y`>f;b?Mj_-~(Cl+A3R}xf3Y@%f zR6kH?+Jzq!H4`%qM`n)R9R63WaI|q%ka+_gZ z{mkzYorz_Sj`nb~@B^#Oro(bS+%Ap-k#209aOP-JaIz}%JQ%o zH;ke1FLlo~zzSK6$xq~{08fjuK{eH88$fHXLoi)LC-Al{{F zh&$A+3TY-3dSy;&dBUf(j1T=L{p0qdmR?>@ zsF+#f+B3Wik5-$H!ViD%R32uAaL>;i|BT*pK0d^39W)cpFv|I>1&4$zv~g`k{TNt8xrmv6F^!RsNfJ2WVemlT1KDwEGn%h&-nhTE4pM~$;+icpb^U9o@ zLQ&?}r;5c;vB_PJh7;N51Mn5?3jv31h=rNMpC1mX&5o-MJ2|4e^_#ZIrQqvwkN`UQ znz_Q2dY5Oeof^rR^^F}@Rm6mrkre1%R@jkkelH(#Vz>{5fR5gT$Tv$~yK(PZ&hr>c z%9ti%NH3yBylD}2K2HAVwO8iY`8W?^s}{O&>D#y0%(5?4`qJRard}(!t!BSH`>mfG zX0ZX=EBW(UM>s^sF@B78>zKGH=pEo^OvNhANlQ!Xbiw0dz>SK8JEYn--a@`Li1K9h zIwn$@n7?&=qf^N_l|DdA?}q*ISMB|4#mq=7Zh}aUtoPjL`eD&-`Qo{XX1ces|0ZE{ zA=Ku`>|ikNm~-an$Ze~BG-SRJ*KP%DCW=+&=B|%iyWzEps1&it!dEu63ferduo)#@ z5u=j@2O=Shy@K(y9L+aXp^jzs)}%@Uk;=@ZbAy@o{vx_wzQQQ4RJht?bbQ=^@!GZb zSy|VmaO?H1>xVUIa%OSc3_@K8xS6D^U*^!aU{Gzqu|J-yNYSC~5f7}8Vm3&J-I3z` zP-OLqf0+WIP{;G%Ya@GPoY+M)8{Bk{GJ-+7A5?jh)6)~;xV5@||NTbvH_B+Mjmf#= z>(@X^YU=LJIBqKs4?PJ93Ff3H3G5PX&-ov!O_O)tCRgR$6u;d+$L|2`zX2?`8)h(J ze&1b?9n6e5Hy`X}_tRft4Vr57)lW=HvT}0LEH!Bsa&vP7wqq~8p z=3n|eoA%eiDrdy?6MthnwzW*s;?B%w4P{3j%L8-~_1d#j6+F2QDCDXvDBma+SHXKm zH}X&i%;C0vOZq$e`2kJFKn|!CpI)ANGB^-~We;QE9B~lV4I8NTj^B@#^M&n2Y9yLi zL93Ib0nfz(rY{7JPvew|neWkyaorP4VTWSC@8F)en~-h#sFTr+K#5}%o0n|st*=it z2be)V<6F=LQE7>rZ+)}N2*k6qvtt9aw6wZGIbIoaBKtD@l*(5LL*Ovv$mh1oHX3gxz-?seN`a^G z#$c-#I$|$N5&G(Z8<3K6-!lRK(;D2?P5yJ2fFJl5n6FrxP5@Bf@iR+=QP%Gs4#{;t+g-dYcAoq&Kq z$JSQ4fRIpEmHnt8>0p6Q{^S+oqIVnmIf-XqJu}z9ct?Ki+?G&Zu4-!D^;Af^>Dc$e zE)k`XZ+OpdhGAyAWt*(vKFT0Y?YXz9{mn;*8%EvgD1H=$k=)?wNzeg*2kH94g$u5~ z2mWmKBjN?uEWJ1;NvDp%!S}_*#T@|ndiwj-OZ4L2giv+1w7ea1wWn{UPkei9b|Iz* z#IAoo+}`|sTy0vZq`Ys<3_kdudmUz}EAg^?vo(4e^Cf(Fmb@HxWC!;!`OnalTl+RGxQRuI$Wov^tAD zvm{<`rTq)*7%q?oUA28tm!|KO~zCTN!3>tuZJ+M_pxdCUid?~;u z0SKcmA5~Ug+t)4#o(`nVq>-5B;iw2X3>%i1xdjivY&2n6hVc|^zH=oMKgMN$jkd6& zyPj*W{=nPaRb$zfmBi-UD{=Fa(Bs;wE^)WJg>LQYUPcJ=YH&8 zCD-1X+G9h;LZ7H*-o&J?F)g{o8rQf;+0`=>>Szq_TY8VcWM`rs85}cpPzAdQ-A5@_ z_4b4UE2-FIp8~Wd69X@CuEwO7pzCLy*X?iVtX%G2=CL4`$CdK@`5X7~1Ed)NQ&r6? zC9&hbMQLGfkA6GT{;6H2%F!_MZVroEyom0+NL!X^n}w#|!K&z;jb4;bPK0j0W0EJM z0rG(&!PI;%hlslwWxl4WefOVS04(cw(FjE&lW>3M)A&mO?6{GdJVi8br%Cv$dKpz? z$5oJ81SW2l63JbF%xG@iO+@cK)(PYLhr65Mq?lWFxvZh1yqR>i{TDNfZ((vOI~y9j z(!cM%>&1sPNPKszl4xNoqUem95g;Z!W#qS0usj>1u^SoQApd>;Wob4_C>LS0YnSod z=`_1yYo$}Se3C7}a?A`pt~E@&)sPlnW_d1jr(Ii~rN5Fo7|-2}>>Z?9BHoxQ6L(jj z5|qL1*}FB`rE0X_R#&Kvq8-ABZXl>=+L=d1MixbG8eAsSvEY)IeFKUkSN*YG#$`_R z4c#i{MrMzeXdNTtZcL}%4(3`-CCG^?!DV)*&+qVpIL7SO%!?w$d7Ymh3)4E7W^Ot5 zR}~8%z;5M)2KeN?6*sE*9PiVjkShv*UsVOeEfqSR7Zlb?r#EkXjWalsP7jy38bspmGfl=!I~FBORCRY5g30|{&cvaQh4|RysKoIV@6z&q zs|k6=z0qPqC^FM9DNfb}>0JMsEJuUzbh%6eEukbc3(p|ze`&2_Lno&D5~^xVs~+%L z4C&2OlBg#Cea$wtE{YRp5jD6G+tle2q52Rdm}ucLcR*ybz zX;ICsCP^1cv@xvI;t6tF0FBW$MK4Ox4^V^M(o`nCAhA^tx>0Y|W9{>OD(!}2-5Kru zBArd!jy|!NcrAn*{Lb?I#xvT}(%eVsziJJcG#DP|X%XY)-v!WrYlwoqegW4}@Q#KD ziF8wP?!J|`_-b2{Jt#EVl-L_*sW4{e>1NhV!)|pg8{DqP9xe8h9RAzFOsdZ{*=`ntD#V}BKK!q|D5M70PZp*cL-YU%B?Xc6UzQci9EV97CP zQ`nZ2c|%lY%)Pm<5<4+<6nefM8-6cci%wcI?8B=T5rJc0%Mh|0=A{H!GpLo~Rpy## zHzk+7*lFO|4sbPk!bIvy?M>U}Z`Q|j8Z?>nEzS1MCCVi<2S>Gdep`bK`=Sa_i7nw~q?$he@J?&VNxsuAX>;=u@oLAN;L~zt3!YQpJ?-m>e#x*4Oq!LFC8V zAWAV?-uo;2E#93I#y9H@T{Ykf!S=(8cbad^>gVVI??src_SfY+Qs>BUAbP3K=_?!# z%=z2fJv?;p9haQgdbWG6uoK_(;odEZiTSHZsb->-ExZ+e4@#(q(+p)~B^SP63H~7(%oW6f%QD6tN+))e63F2qGlcM(} z?h1-dn!Hm47FI1KPu}UH!1;Z2r5J8S9TP$1jD$tPpz!OYE`h&mPoaTfRr&Rm)7y+K ziBY904AIbrl-+hnQz43i?2{L!jo}aVWe?iWp({y6Nf7kM957rkD9wO&J9q*AK7zYA zdGr7Mz-&wp1V|ZP8Qd95>bZ$-BETv4(<-!+6)L7;rmtTk&Z|BYtiO30%`9UYeJf%U zs++z%L&o{l;P&CU1WJb4sxUJRp3CQAQg+X`Se30a%#SCc4ba9(y+_#ChY7Od)yr=3+O9bzGV)(uxfX4dvvKL3 zA3-_}{$YB0SVFq@{<#s^lV#dSR7+B8wUDnrj`id{d6*rZg&mfF*m^M_?|6|nNzQvz#oSF7;uT2O_+-6@GH2g`QRk z_?}YYUP@-F0?hSzx9t8v_Gy*87wr?=v51F3M;X__hMLw3%<&8Atz?P!?-e8O9AR=`5*c;3Yrl@gP21X@?;gt z^@bXqD@RjVD|&B&B51d0YNt7x6VE>xZ8)V(;C!q#2TuT<|3nX2aj*|%zn8cc7kMUXT1xy|md`t4t9#n3Y zsZ6dI-@TLRv3e!b_A#;&;qE@}0eyR7sL-4LyI^2Buoch3DC;Z!2-NVpO0S))l?<|r z)8mq&ywSQ83t5OG&4y-w)rMx@dkx%2?9;RariE19&8D65HT;(If<-@NN5(4`GA`&+ zm=-|Gi7!u@Ikd2HLiMa@{%L*FD;xEQaNJJnENDE){_a0BKfLCOsm(+Ol{aN^Kwb9=XKd;Hl#d-CTAN#T68v^{)8}dUe^?x%#im`c6NaK~^ zl}Gb9mr0Whq*aP&n+w0Asd!f^D<+$+Fw8!o}$#o@c zWiu_HnaH;?vu*Q9!NQ`6cI+8RxeBxBkDvD{>-$?Ux-Ih0ml1c|3xzFwRwm8S?$0La ziX(BwuF>u!VW7-3|HbC1aYO&wx*7ER}4iOL$+{af>VOx;gN2w!3jkiltOlC(1XPpwsVQ@+utA>Xt*Sb2KL zxoc@JGrVDac&!}ox8ds?j@v(yP~!9roF{-1^9_cP65iI}cA9YNPhx4`xGyIz4D&Ua z-+%lvZ&)wza#6tiT`NqP-P3|MIwn|*mXLl?k!?cWxEXSkn{8WyO#`L0k_45RqBSpg zPUq#(O8Yie?hW(#FMCHy+(OwKnsRMPR&PFMYe#K<%vk2b-rBWwkPT{Abgj>KAjgcY z4SP@tOHMm2yq%t~#(pTT5+Zz1nYkiF2tE2h{8aXtI9$^x>J&Y{DS{F+WHYRe_Fxv@ zZFDqR9G|J!QTkMtx*Nfkw1yR7t4P4f7-e$p2`9mCcKfOpU##5|tlAchFyEHXtQGd` zsC|PjgRMljjPV6bUY)6k$JNN9h5NjU-KNDhb{Ed zqRvU|#|G$AX-vf*%S#ASA3ptyC?24|UVnri6?KP8HHzLxlJM@eG1ro~AGU}bP41^6 z+@*Lkr42N9piC=wXf?%(xaww6NR^qQY|6Hg^xH%9fraN9K>+>OPJ466y12D1x=Id- zwWzyFNkn_g^39FaO;utGD#fa_lpOzZ^ekang|rk!aYd6M$1pX$`d**bQ96!x6wb4A zoIauD<`li7wIGOnSgnO3=|l=v`MZ=P5sKgZ9*c<58N~&~?>&cG`w6tmTa+YWklkP8 zm@%`)$4Gp+RzC|3x@}WVNoLW;R++mka>zHa-1)Y1^IfIvXsZb}+DM+gnh%}|>u^P@ZT?qgW=u$c{~gx-Uk~y2O_J=>qetwZ%FS+b(WL3ymHH1` z4R=L?Pmi!4*cxs3>YHe8y}hxuqCY=W{92Q&s?OS=89&K`R;?rMF8X)Uvj<_~tx}~= ztNij=A^yNi8_yS6@K&5lYtKfe-5|?(DDwb*4fA!;EfQ^FA0jOwQ8jGPJgk^9@WlN!V*kG^tf2S`^%x^SiM-v zuw8?YUCR>0!a!Irnupl{*!^!eA-fE|N04eKO7`x%rO){3XkMe?_9&q z&8ztM?TU`v?(Ren^N?yzu305AuN)rKtBt5U`mEc6BR@xzIVeq`QY-vYaPIo{)}2iM zn|aGNX|LvQ%?TcDXgb;uj-E9Z*yd@?CODci(}t?ePeKZcXH>bjmS0;P@|}_eP`&&I zon)eJURh_Ysaf0b7H-iNJ~WCjMu_cMHD}0J zPDmg(vn!j|T;c#bp%k06{LVovCe1qR%1dKT(B1<957gq*Y!E&yd?ZhB+mzp<-IT`* z&l1P2526*E;*WP|rG9H}>5s4;t%EM4U9?x`L4jB1ae|lG6!&x-A{0mbRkAfD*-BUo zclCKDuY6IALghxPbImWU=rsnh*o`mwe$>q$}iAA}XZ)g}gTDl@VTkM5#yW0d&!uWf`{D*hl^_ex(v|Nr7s?)nma*5WIF%Iz0 z5vl~2;b9!oG1(@de~|je0%x$w@*N|4t*s9w%+ABUr60(1o=vMWV`3#?+NHIErB<&{3*AU<`pf^J)PaJ z+^w8y#jhd#0(FU<2-j^m>63bd<2vPLPdcTGHnYS9)6J&6Ft6j6Dh)PNVK@fiu8+TV zm$}z*6e|wm8r;?1m=P{Vn%JGXmpUc{gL-1xuZ(MO`}|7UW$U$&sUR$Ad=PLSUw!9m zOSV3<-ekEg6X!+zu60xnq3psG|?;u+D>-RreFgoXj-PIU$vc6S~B&ziXd&-$fpfko*S*YW4&?2`Nhe$R<3zBM2Xo)T9CVbsew_2~}T7Ej^ z>MWzvIAJoqC|b9tZz}y``t<@8;}$YE&Y~hUI+QEo^paz0?#8Ub%v3L&iUhU+0x{Py zvA;5;X*;j7!!4SLi|A`_2d5S@jXHxVt%ok{qGj$O*EyUk7AqLi=9bPQkK_O${HSqZzL z{Sn@NG~X`+_7V1-u|@K{W^tPs&ZNsSq|s@=C54I)2k@!Q{`3YRShBy7egEtxiKQL3 z2fWI@_SWB>UtflX{({`-^nEw8V6)Wnz9%Le#K%PrNQGL>UH91aNCjo*@H)*0MJAgU z9DNC5qrKk6E!8GoGtW`IP5qo0diyu-e!0VD*+OE5{T;&nV@Ul^T3yc0NDIv^ktH}s zo!%00%y5(pm)hbg=D^)}G~Qloo9cib>o0TcMYo_N&>~|fEzmtV4XUkqT}>4z_LUjA zy-%`-ku%-jXZ9O6H%&5q6f-7#jX}5^R`U3E&gW~^Z$BJ?Du^?2^^Rd6UHymZAnrV$ z2~@I|K%eWYn0i2#Opr*y4~oOWMsVPm z*%vJTLp=R2Caq6JiZ89dFN!h+sAayg%y4<{`VCPs^vnKYRoIM|llZ$n`L2uEN%wleXdRJW=+jhfUTjVHSx{AfeXxP1wvcfXW`l(fM>h_aRq0!shTt~PLfwK!Y z3|Y*0D-aH%f?_)#kd2fUpL+JJs33wkxLQPWXb&1h@d=B9XM#jbZ-om4bEp~mez z&qPX4EC;NsK_dj-vZLE6icSR%CA%Gq=UAjEr63Zp`UUA8}A_{+>dte50m`rGON>YUy<45}Qy6rO_eah)RPC4MTt zc2)jf-$+!;`*dO1U0?PUOoVKrt8mP3qV(`+GM>kECMMpO&H!ag+jRB9Za?hp^ z(r4eLivGnHV>YgnXKuO$#@A_BS%*9Na^Z6h_mJ*AonM?=P$^=t)k%L^1E)M}PXAj6 z`?S<)Ch6N(ww%!O5}gv{sz$<4)nf(7>UfDdR$BCet@3K38J0{sNCaf4f$M+-=n(gJ zg+2#Pc|ztn@EK@(z$gCCsX(CZVCBA=mki z%ZyA+akSi;9c32n^DUvYq7o7}m7|zr0Y?Fx78I^8gf0pc0+fxN0&B0Ai#?3VDJky@ z3V08GzM(ce4p{6-)_d2Yal)z%42GKD_V)HA2Fm)S#<6ql(cMhW4c8G(_`(MKYLV;O zm`HMRvTg5uLqkKp`mR4y13v3cR;r{kB(H{sM#tt{`$E;IXe1v!^i_okXPCvVZ5Ku zM@PrIwA(J<%nNkS$!aycIA<*ETfcC_yMFc2-4`?nep2l>-zAE5TQ)*}tK|6ZMdpdF z(wf=mk_kIb?#v#66;DVb^0&mqH~=s2eQ4;p@oMMHwV7r!DmHlm=Vl_ZVQ<3zXjszH7%ZB#wL)zq^_kZb_Dd)zu7qT(m!%=9pM&1lDmn8)IyC<*y5% z*7_78{lb?gs_Y@9KpNLKgX`|CjdL^;rZ#d6OS-y+n*~54Jh6J(N4?anSqP9+TvvyA zLvmAuw!V=n&e?PQ0>|;f_w6p>A(HTx@m$KA{bFwHZfASSb^UVIGKnCY(qX*``9YU#OR{2h~-BZ)3+J3)HcsCwhXao|}{Do`y_J(u^cTIHg;wTrP zb-2mvc|vaQ!D_;o!i|cLl~#FgxktVpN)PR8jQ643gIDd=%#2vhuZ~s{MWsqL;Na+N zpeA6p;RgUsA|fK91Mnl#nP#P(n(!`g2N@cS>&E`}sN)f{_M49s>@X|Tt z7D{l>{rc!a8=IIDcWz&(9Tz#nHfGSeXgFuqUeQJ^HM}rMBF_XDdAIS-E^0N+J>53i zpxIRKaWfwwx9->zy(S3cJvuSr6M9*;^1@h|g{X`S|3)J&gYx3V&Q#|n-ZRv!@qj7; zm{ZUekn-92JdAM<$<6D9h4s?C>$z0sN9^67{A}2&m6=8B4HuOiKVJ*tvR~4z*5=D% z`IXXdo1W$RpXSE$JCud5O}eYsdQ}Tbq7)XfIf!mJQ(drA?`YjAl|7e-Dvi&GaaJ>9 zg?cgjVbATErFxoNO!KcSK6mFSHp3z+u*ZwL5VXZXC@|6xy9W$TLsPRWl1XyDEs{x8 zK|vVWV*mso4lKA0+{TROlV@FWF|!OQ2105TeK2h^L~oc%t%0+b$)>awzAoZ>52Zp3 ztWn`%Fi8Qn&OivCZu8@vD7osnMp4J_0;KO(_#GJUR7~!cN8}0+?&nPKip5kqX4Gk_ zo1imZ#pj#3^}$5nepr{>1GP|?9@wY<$_`Kcf@kIZq2Jgd^bRQ zYv;-%o=^Sd&y&Y^HPM&d)=bB(_Kfz+#CPzUnw6}n4Cy6S`+JNkz0LRVFha@)d8Up9 ziuq1?9U+w1NG}}q&b>DHs0^GqX(+99T>i^VHM!~vc0$0h&rBHeL_2A`PcEi%;NeXB zn!ET8!iPHN241{LvmJ2Ft$&|5h?iGDth5BtaJsv@MI|MrASs zR)Wms&lkbj{Ds&|kC+!A;mL0BM}_lI{?Sf>BB`_AV!hns}PSO_-G{ioe4 z2r5ZP{`H6gEVCX?KmsCBcTZ0Q1Xv?Q`d0q_rcN_WCLSXv!{wkRmktvX6U5hp5GEXC zGW+{AX$k?RLdG@hfKBPTGRS3MY#bjM8ChO*!p2^9g`R*R_^h*2H90LU9(aOUugy=x zcH+=q-ATgLtVYJh0{`k6vV3vtfPYj8#?<;9lxsYA0MVKtyUJBhnqM6$a>Y(m>3wJ! z9Y2xl8VGHuOG-<-&anBh$Hm2oii?k&kFvJ5o(E9oO2oS-oAMA<|H%bNO|=hFVe{WN z2Z--n{dv+%;FK@mpfgdt!h{X8i3wwBYIP|i;y)7ytavd<5Jk7ksFZFM8sx+tAH^IpA z!<%okjv6FP+C*pU3ZFAen*5X(L9h+}(Bc^!1^W zbQKME*ntJwCi6=y9E)?q?xIhS#*Ut?66GzGrrcC5#lnYnslB2!FnN zv{tc~IW`1a& z^lE2AqXhRSI5zU`J%p~Gy8`xkz1!MxavO-(VboB!a$t3}5VA24AHW?2nOR3L?ggWm ze*h9-v^~gQK=JuwUh^CtuLd=(h+sy$HU56QJQF&4pU=k3W`9OEWL#%+_qo`m;a$7_ zNS6}*`8yJm`jHpVZM#K-NBgcCj_w&FzYNdhnhkHpWKD;*;uFI?-5Mt|oDH38s3)#A zcT&_u^UrCdJ-ozV>YRv8ozQD{&%rA6wZC~kk#2vy5u6O28)-cew$T?iKbWg7DkU|3 zJ|@M?q~0BqI9cbe4m|`PA4ABN`_g5o)Wv&BznBQvGBl5{i=;lq$aC|GrB){2jWrSdAC42&603@mma%c2g@-%6_0&Ri@#-7wax- z`MKKV$6~TI(kD67`D!!js8hm!1fLgCG{&#f)J1>cp-Hv#G%{~ZA=Ldg8#S_Qs&+4+ zT?7yl2eMD1zVh-x{AnaaMVy`e1b*V8b8E}he(}ffa6H6IBoc5#3?F>5*y>({_vG1n zQoI+9>+p%y|4Nzj+wI$NU-@(~!{BE7@Th%-iMG=XR?{RD>M@m=(;GKgOwrl14;{`vv&tg5i@4I(@Q8&{{0d)#otzO^x6b3mr?ktFlzN)bV+iJ7R|?|Hka5E*@_zGHlGqE(mjuzM|dR`&w)-f z?4%7o34RNqxTK_NJ)p9#jt|7R7YSY<5;CMIe_|csThS}fu79!ACZOxS0;q=N6&=>36Tet#R@H|j2K*E}0j zXOXJ+=C{1QMtU*nU?ln0+FW$^T(p8vw8Bv_^H`oLIQs@PIR%(4%SyXGCeX8hT=GH} zeXYw}u;2c#kaD14etv!k=xuFz^#dPYls)$vCcAW@2BZNKcLOaI11sfbiIbfqE5XcO z5_H$5ZnO8x`@)bMN+;Y2hzkQ_1I|dhXasV7kaGn#5woyh1;Di&SaMNOQF(d!4Zv82 z?ivIzZbmOK-vk$4OT2uge^GX`p?9!h8J*TTEMO$Y4-%@z4hz$Vp@+TBCASVH7hT_D zB2dCxHI96`#ZgAD3=(%IGVM*R8cZiJ58%4)b^-Hb4M5|#Y_n)PxCuC{6H01c0;LXk zd(*{w5Ijzg41`_KEmVAl>PHbx z2Ac}AdpN^-)V?(Lt;~v;wvU}IA^-vJkFQz zP^qrJn9K{4@IH=6^{xjk-!X#|DP87mk!&g-r?`3DDc)N&>fCj@gMBERe~Ewm!y&2m zqGP(vea*-Hfa-ud;$f_I-?DcG(u_gp3JM6gjc)LRGSKsUo%1^YVcNLL%Bp&(|IzTo z3y70{mF&OtqVCLl%;_5Q`|q?lOW@SoWS|3&u~L! zGaNUGtXd;q&4WXL^DM4@VrsLD^J=VI;%-A!1xzHribs~ji8ZFJ#!JE8mmbn18wlAd zNXL^n?kQCAs0HUd0QA{U9YfZJLZK|-@W!>mEWyU#7oJZUwmX%K?v+!haJhhUq#9$8 zX+jn5z>HxcL)(;eYPJ!kYRcnIU<(rb*cA^IREm-r0KfpoJp=>_5)zM(5X!o*#!oiE z>(>gw@AOnJ3>WB}-~x1PgCvmUISB3UE1#s5uAtbW-3pEzQVxJy$<{e$rA_~ zzmS8U`B7;!O$rJMD&+xS0?zw%{m-w#FcR2*{}3~D`TuhM^v_5CnvneYDhMva?o3{7+7 z6YevmMjN55j5Ev`=}V@dl>#$>6S-Z{3)|v45JWDzNwV1o$^3$G?~N^j!yPkMk51`^ zp4Kz!zgWnNQArh{qbf@29za?r9%^tG=gO9g>}=JL6qgSp*bV-PQ6Q&QaZdM zZamVMcDl*RZ(Ktf`D1Gt#-!TMtz+thz^`-k3Y8<7plb)jAf}SfS&NJ;+7w6H1L-Hr z8{l_&P@)>wHU1`jUsp;=`o8L4Z42}Vx9gC!uaTYpEdP%T__HVc zGVta9(ev}r`u{uA8^D1l4=)(*Dh&z$AI*JtP*dIiCW@d^suD807;0itvWy#*7J>g??7AG7$(8tt(*E|Gtu&l)t4Q|^qLx6h5FaSr*HpdaVSTpbXOPR%8t>rtENq}~nWyZF$b zJEe(fLdD9ohqf4(94085 zJR6XeTpzA^Xv_TO;C(8qW&T)AI_3396Au@`!ZN_XzTwp9JO4D|jXD@IT++$1AbQlz zPb&!KX2lLWD)bZG;j+avuVb*P8&Ok~o^?6*IQv&(cIqoN1_WhaH~o|ZXNqi$Gn!Cm z{kn~C^NZBZ0VS5d=FjB2da23KI61m=1fu2uPwEGJwq{aw2xXX1Te$t$tuQD<*e2xjVb!eH(0#ht}9LQ(n`#7Go=OV-ZjM3iLv-pc5r zBC`H6f0U^TIk5Jexuf7uTA}u8v3;O?l5+cNHwGvr>mb_ur%-;8BQyZF-<#A_#!4E| zeUA(_p>2JW-IQ@azTVgtgqX*S71>=k%-CrhbKv-}GJNe~t_ab7zYmtd^UI;gu*;PhCmWkpwcxwP zbsiQ~P3qm3cA<28x@r3wE7@J%DL%Jf=ddQx-O&jD*>0XfsOwRCi}yOb9z=u}#9w0nI=^HEuVKGBAk z^AarP!)KlSAU7##&S-PI%v^Ps?B&GB+w&;R$(`MQdq~w%li_i4%>o##hSr(*x8sx% zui+273^fxiU9M%sz&38p^351NULwsTz|+0t=o5(@i}&vxvht&yj|La+qHz3Y&jL!& zCE{FNUyrz(Hzjf>-C>51I}pesgsz^z39KkNEI!Ot-TvyapsH{HV|A>>-(E#u-Scag zQHSBD2hp&VXX6F+)&4Fd-sx%!%eNC_(srXwI${;b((aq#BZ_Q6OqJ`{6%53D^J(?{ zF7NZ0OCXc3{Xyu}pZL09s;oIszR)M@*tL9CZDnHj^S7NLV+ZHt;prnV{cj2PF~RZiRJuC#ll z*F400m2zRvnz%$WkVl1I&#KDGi%}GKNC1JiGi)iKk^Iyt!tZHs&N7SHBY{&L&rY6H zIrA^U#2edUmvGmWcj%MPsQy9*{4HRn{TW$eRk7e3dwOS5BF0WPRH)i-969z{u61K^ zbe>6})h_Uz=EIOHZr&ZAC)hxei4Y`c!2WBWjj4@t@Qlny!9=V55*yMgnhht1EuJZL za#%oZNL3)}9l(kF4T;I=X_b|1;MJp+#yLqNn1@|gj;}ErSv&f~(U@mg)6*y8LS9!Q ztZ(}31Q!BS8UW!CAhy=ov7i{a|F(D(uTw8k2|lX4n@h3ejqmpZs7aKdMh@U{@BICX zCrjP3d~ZaPJ%T`VA-KXvtv#crbXC4$y-kzM3p06W{DaSPw_NJWOasGKsM@F zhoWJx{G3t8O7O48VB!6GevMl^_uQ#8XLPb1-%EMt8ds6!tLyzEGkPc4Iml=i&VK(M|MEFk zrIn}k;rjevty@%c)-MaduZ(ZO`DQM&F>u|cp}ePWL;Kk)=!6MulcEJmoUn;wQG0Ek zYcXRnCGT85Z~oY2XNW()q#do7t}(252~*87so>P`;?H?ZZ1!pwG?I<=r23*3{u!vm z20BL_#QMFv z9iY2H-|#_>+Z3ecP@f%)8nSrgwdZHx@G`a16-VdZ{T9?@<=i=IED)*nm!T5#Q-1VW zBMmy~A2Gz}>h#c~PSRO7*88&$!tn1Z`Rc6ItLL=JFSV;2e%L-7jy2BlVdZa|_wj(% zg!hQyVTv|IOWL`25-KbDah_L(S3{k5Qb1WvFk|l#0Sy?t%N4{6m?D?^w+-$%G6&zIp)`5EdTJ7rosFlS&jbw zt2Krdfmc;@MHl2?NBv?9)vk)GVzd`!C{2{mjS z+zDo~U3QyW^Shn1Gs;(7jlopm#j}QM?UNUeSNt+PKmm~|AIk?aaDwTLE7nENZ&z7A zE>}~erYHdEVg|HK*GXmM4E#Lr0~dCc#nWz((w0#jF@d$Pw*L@?{~|#&@k4z&#(1RP8^TeZD;ie$G*n-ZD7R>u)Pop1ovNO9;?eRG1U z2}DSP-QHmLw1`Hx^Esx*=;>`${_2(54A+tg@*mo)D%krmoO^`tO^*wHk2>llC(-Ub z7pX&Z1hr=4E%s*XIh1`bKTwcRv?BTN5Y!@kmnHYv!S!!mV4e)3>S_;O(E}lI==7FF z?yp5F^BH^oFqV8_^YvU(;WPhBkhr3!#ZB+Fc5BHK{_D+S`U0*EOs1wkPl^8yzpmK! z{OZ{nv%u)v z;v>#5Sh!6tG5+DJBtz6F#9dx+$w*+hE;gx2^;Ugi1aFLSRAwI ztc3U96(3?j#W%%i$Q@oJ>PM-gOFx(3&)!#us_N)ny11A&;i>A!ZbQ?y99VS6lq*|e zz5-ebPYuEN<_z4$xf~RbQ0S6Mh`Zg-xMLL|qM|KozC7pPP7LQkC6TDukwi9P_v+(uV+i7KL4D_OW zg=$(%ysYB!JjVC_jA;*}%Yir#YEb9J@ig`MF`h_N++z}w2xPa&?R`tL)N@9LVZ?fSUovy zA5Hp#3N~LNuQ96xtSH{1Zo@Rcj6m}izCO-Yaf*p{i)gOL>JIv9=@xN##v%(#c^LN0wnJO-eg>9HZrjFnV$ai^=rzd2?+_` z@IP(!8yXt;CXNeMd<+1a`N7Jjxj6YkWy0|q1Qr`|zUuZ1k7ZVy!+PtZ4dEDQ*1)%49~p9TijBlGxCN>0sOf^O zDs5}oFxB2F@Xi<``e}D6+}IMel~$@tc`#N0&v(Qk7~P0{iyr$OHr5II$QwBrVk%{A zb*dnI$^>$w%VA+RX!?C^o(FtWgMjBm70JMtmIz;?JeF;a3LN+QAxBkY;?FE6Zx^jU zq1GNU($z>vXR@7wH^yzj{(>&HDO#$#uLHLeJ~``PAApR@l&uz4@+sD!J~lNVOdrpV z&B=5UM&ew%+u?#ZT5QrjxjAWH<8*g3$sP7506UB->Y(Wv72&^w!e&8El+29eD&(B>3JYpq zf{bY%Vu%SLbx}n_A1*Mzjny23!)F|<+)h}Nr-0mP#T)Q z`l#;+cp-tiBhyXTlK7(Ptv{B8P2I1gh=E+1PQnrI7xELeF~%Ts_|cvHcDJmtrUeHF z9|cl9TvNbTx&yU^-K&6KErT2mz6+-`$F79Icb=*e_EO*R)s?$R7u?Q{uZN*4=Wps1 zrsbQ0vhG{5{-T~rnI!qLJceA3*jB&7+th%+K2WXlc!v3;bl0eZLv@F>*B~G(zKFhh`OOCQZLr6LOt69pshNPLA zw!Jvip<&bJcK@oJ4Kc-C2WujqI{f3u-TIff6L)Ig&WqmNlC3U%R`r8|1Yn%BZ9HQZ zsg?h&zL?G!8ULLTW>;vfP#DWl6K1w=OPo|-xYEL|`N}4}T7ipE;y3cwM`5F>=g(5N zyety76(=?1aPrHpPCcb+bct}u+5U9g4>ydHTYY%R1u(kf(5vIs{q&-N-~$Hw`;{k# zOv8gbqb%3uYl7eJWv4oX9g03s#J6KTO0pKb&HqH6m`+0sbwh$4Qg-ID(2(#WIYN_2 z)-aLW>$q3ZXEQ({kFxjn_Devne9X(sGg=SkZs4asY(Dp#IXk|y+7%Lzu?6#ZTjwCo zGk*$iw}x0#6P##m{0=GsR-Q_Ce8Miy7%`=q;@;|x;?;PFk%)lMZx!( ztS|frfoIS^$u1H3mJ?fMoo$IYiMhK;rvw$-nbdbmhF%>lJSpa%?m4QHJ1eH_UIya0 z)Fkg=(^gyqdzilK?F2EdD~*mH^H&;2sw3t(fDA?aU@Gq`&A8@V*BaZCxiU@s#6}@X zYfXRH8vC^Qv`a%pp27VIHxuwPEGL(inSq`!Etq(5ueYyPEWKMSy%+3I&Tx3M*R!^W z%UovyKUgg2Oa1a(826WYe}$go6;{cciN!p&%wBP7%q()`J55oM<>$1z7i9p{iz+JT z1X!7_|8*^oCw)NiH-__=Kd1u!kOa^X!x;a71shHY@U8SfT_R0kFos1&Lm-UE`%fdG z96AW942`1E1wi(0Qa72;S+^1~bC`E4__%5Og55Bi_HRlTdUVK`n7NXfG6&S6?sB%5k;zN6s1w#!D30a*f16%h`4 z!w4#n-zdHNmN`B%NafFOjBevd6*PR-rO33C{gaH9Q3#buYEw<+CaeL+n>tA zO-_Y-4!t@CP&I03!yRkBaE+zruwJudUo)658H3(i-BJ>ncA(yl#sHWZ>T}`V<`w6f zSH5&R1V|H$P6>KnR0sVpq?+(rh<=0f4%qSL+@?Z5}bUk*r>q zTs>;MBtZ4`%}oJq$notRK}9^z2Vg|B{TlV-H?X6m^^J{UGf5YxKr`BB&vzSo%7%>u~5CDA;2I+10gKmBpR;G`+Mr^RA>WByjYG>+e z8cP8dtzdk3F4UD{c0F8Ibo9IP5`p8f3WX}S-3D)Y!IyujLx9(_6#H9=@Nm_E9`zM& zW61@`lSLSkB8W?_W%<3?Pk6z6!oaRTL9J!m?kJtAv{H-Fsj*ln6spy$C>3m{Cs{!2 zbCQ#dle-;YFqpHCk0A&&*r#!}wf*FkW3BG*rZ-Qqt35!%1dK%|_L~!1M^8~fC1F#( z_&xe>l4fx%14(~FDMjs`@$B{=Oc`HEY9(%+*qnmv@J0~Gvy&`GJzl(Vk-BbhD-qAB zwojj*`!z-LEgK#ZH?o>9Pr5yB828d%O;1gLVfHb2S@LekfC+4R84*=6{x<8*<3)vJ zXD;MOis?uMP51ONr4TMgJn8MNHne_ zhlT(JS6lxpu~|3zs;< z^Sv0O8oq5+xYqLhsCAcP*POly7sI#(HK@-m;w;y03RlggUa2_0q&Iuul+{2oM3|&(9+3$segQ*T4uWwp4?e32S>Y*K+!zx~>8|%w1h^ljEW#P-z^9 zv+i2(=HcTVJ~;57Q%^5cbGe{+molp2pT5;x%PZmb2@VyYvn)HU`D*h%uJ8N3@Y-U*@$e%$1G$>0pQjA2*08t5CU{Nz10NTn`5mmf(W<9bcwg#CIU10U zQ++n`A0D0E6%Rl6;=`g*$=p=i)apnb%w>jeX)}6$my@Wx}lM6waK$5;plxpQA9^mnYRe^f`0(hoewZftAQQzq~?+=oNNsNKZ zHm$UybiFD*EdqT2R+BZu1ggUZuqNX17L6Scc6QB-oACAvf*%MR_%yJVmAuyml(l$8 z4?_@aTbx3W`aZ_^N`5vWu@gV zFxbOnt$U*``?(GDG>)c*?EZWlmYwhE`v(EImH{1^hQ?{E5>Tt+a~&IZ!t5oxZ2wbZG{1acVlDYegM^c zMdR58KvM-k>uT3%2@em?*!)QJW%q}!w%+QjNyBMr0ROf=mqVM1Z7Vf}kM(@2t#J94 zl9G~mbgavxM|w%aay&du+2qKlgwq=!BRvBwZvtbi`%A3f3)=IY>P`C&}{AmFxtv1--L%aI2v4sP21m<%c=dk!7%78d6E z00Ya4xc6B&uF0#Gb$$ry4biSQY%Hatg5XA`{;jB{v;7(nohr`Vdug(H=8Be zSJm`bIXI^-L_36CrB`yis+OoYMveWU5dpcZu7!o@JiCPU3n9a#ro~+9 zjD`T618-0>mL#i#db7szsfO8ln$y)dGw%x`Z2pJ?8nFwu&zm>H!C?59rfr{s3Tykn zOX)Qep|8Y+z|DU}gQXHY&~=NBN;qP$h>_VLzOvHNVyHCWi`wbw=@#bZMW;1E*xd?G z`77Ga6Va)a4tzqwBYu9>G?QzL} z#Jywck=jiKmf$DqUws%Ywv?%1uwc<|qKM^P3tzyn!49=UOAB(Pv_{JTxPFhM;MB(d z#qhzc;b3=5%ATQ=*X0tMW?r%Nn^Ur6%fYlFHHOogsBj|wuZgUp+Z~2&v1g+aZ*$*( z{vK7gX{or*@MhN9wT@J~O?69oa!}W7At28{%OOpaawzNmob>=9nO^|gKvwFT)IrBU zo=tN1!Zn~Q0aDLa_EI7;lqEOzxpXX4<`TwB7@aW3PbV7Lm8OT(BFR?_Na+r`Ah^m| zgVsf>Ttw8g%w(W`ti{1^W36&%7DNT#vh-T4X$L|r&c<7~L)=4;wG8S^#EBp)kRm-8O6(|W)Ur=Ore}7*LXn-I@7ARgJAt6PRQOxeE zk$QzKLTnL2kbY4@;|26t6K=Xp(~;$*uJb^nNd_8C-8U(x{3W@2{GX&ubqYVVL;XgB zZ64Th1+HIN#yujwTKWlhJNABjn*gM2uhs=wTvjGkR#xWh;Aae$B*3a-lM<0>B$vuj z!Y0f5v)qtF1l8`q@)t0Z7N}R4<_B_PptnYST-Y6p_@7eC>>S$+siQg8eUDH6uX-62 z&kI(5{%^+~8AP?U{I|mvYQaGD+<;@t^LUR2XH<^ZGp|ru}dxrahX>2fz~?)^&!7=?v4Y>uQF6X@m*9s~IUBySmOXuvbRB zGG;;b(KG1XM*>IhZmGT4TT$j*bgXvdj7Oy$JoZTG>Sx_^PEJCYT0Fde{(MM7=cqQD zwEn12X?joF)${JQemrl_wWeP8&@o}V!QEvI;f*9}o4rM-oRL>b#MZFb`GvQTj%=MP zvHk5Ej7!7Hd;XSck}vl<>g?k3)R~a6K&%)hveMjC2`+U`&d%o-Xbpj+@`{RhpQ=4T za;C2*9#_2d=O(8h9lngln3bnzk7$ zk%rL3$#0sMIpRBh|IS`2EEYcY5XcvOxIrhyxR`{cMU>aEFd8YCJ+j|enYW1iAo6d& zg(SldsJW^p(~lwxZ!Qty_TAtc)FuyqihdxuB+_Nh%Vx;kTAgL0A0@aha~AR;_m~(i z;t|s?W_WISq`Q{>(p1v>pCWC1gON{oldE2FWS+R;ee(qOp4AiF`VOb2qd$zdN~(R* zk5c@6s#Wf)E1QJ6VC2G^bCA7Lf{+hCFSYUAsCjMmTsw=?*YI+ryEW#5MW`nG;Mp7Y z`@d`1U;lJJN-@%dqkVt8rsPtt5&LvU{hfMdxX5RXNEGwS7}QJcd`@5XS@GyYm*7vv z^$SJXV*OM7z|e*f?3pKy3uK;%H~Np$SUpFd$3=C)Gb-wWmkL3{cXe_Xav@+o6(2aY zemhUyu)nU)cP~`)T2QE_p$VA3h_AcOT?h8*=%+U%qkG1_zec_Mpzx6y9$>l5g^s&0Y?o#N1{v|CFd~odp zR^O3o*2~eaG(P)8iJ?nI7jYs66{TXHl1sG>$8bBD`EB~I`%dujbNAv~mp5xwn3aND zF8q4$pk+TW&ry$|_Re|cj0L`3T3pzmoHFBMR9|JC0R;512D!4>Wr#iTC{w%}ms zjLm1q35Vd#muLQ{}gRlV{M@D~$L-)dy81#(p*}ogj}?McEcPoNIes^?WmL87jY< zVhiKKxSw9$x!^V4+UPTEx%mhgf>Y?6fGta#l~RVI@pV~lI-JpAR(@hj0;XrJAPXg5 zr*lV;`f65VtC%u0;&k7*1G3txzLi^}QQM<|jU?qiOw_=uWStk#+Eb%8C!N-`yjo;X z-+dSp(dK!5^5IKhv*~QyTzcB!$(mpVA5FefT9^IY#xkQl#MT2@6H_fPN3QV|^DT0{ zBwbi?LUI-*XN$B=82xTc*4ux_3H^PntL7-u@V1?4qfdGx2zvN2eSD`6d zz8~~#d;ot_usZDOn?UMvt(cqZ@AKp%cDWL}{PkeZ_m(xlU^Y%T*t83q0b)uCTa(uB zxiCWZMSHxcLO7Unv{Y7=AkLBt;c4BD6Yj&2q~o**^a}*Kxewjj3(*du9#gK0fYzP* z*(5i1WdkZI2U%!K)@-7fcMPlx;WMmH-|cZsL9IS{DrJx07I+&_}h#w{=xx<`_CmUs@`bC@sG}8sAXi+6)8d+cB;G{d~xO>Z%*S96i z(m5U$T}Miz*uph48V^+Qc&tuB({ZWd27$lTI6S6qmKQcxs>O{}gpGAoS!A&Gljj}2 zSH11SX%d&;z}kZzX8y3~IJxx=!?mz~|4lulgX*>6^iNaNSBd==xyPyNRbSB&#K#ij z%!gf@)dlVDPML&1-n=9Dapcf_GeUAg9l3sZ?E65@L!_^3pf9aQs(qY{{Zdr2xgD$; zxEEd0Fv`JQgFMye>9Vrzh}+$*`H}7!?Hi8zhID*P5NgWNFYsP#g!xH4*+=H4@~8Om zgg3_URiQeRkG(bP4|Vo+l_sk2$yn5%s?>uPzpjf)`UcPBMjK(=Imn}DF{Lk5hug2CdSa}C#rS13v-poFMW@tZWL@KCNLKSv?(KfBc`e=B>>dheR9UVN@6<8W zJe+X4q@f4uDg!w@+86$BI(~wiYq{k3aqjae4l{nDo2{DP`_?k#PNoO7zz%TuUv>2# z9e1*4_pGb*GW8$2yaZ{?byXA;Pcsc}`Sx<3SMg}qsl(NFWquk5EWgeK75Y}fCH>ru z29)D=r5rOdq4NveDoXm?z-Eq2w2$+}QXn(l!-Z4nc=cLW~Y;&*#PMIeV@+sO2?gm8~bYxQ~S z`@_3amxoGEhH9G2_ve;;$Y8yscFXK}Aa@u>O89rHjUb=Xcz=hyNb@KQt?lBLv>G8f zPWu7vq;tNIt0C|Pr=2fP!z6U7gJl-rxduIO_F|a;xg`FgXcVPnp<*mRAm{ zq?@!f3?uB=S-n+trDF5x-OjO(lI!8M2X~srF1~+%+dI;zFA{$NK2m&eCZh zrJw5GR?l7KJzt`uJJMffQHgi$;ag%fN&eC|Ww?o-ipw82YZ*H&wHP40WVa?aCJuLJ z|1z<+^1(xFRxx(df&-`A<`z9y8_2ECXYp7-A=fB={k@B7zi7e=LW&T-+^EpEh9S4z zUk%Qvv02p|KK!~NayB}+MFK_o_9HG zu%jI{J>@YIR_+;2{mK`kr(_lj++eik->cheArWVHusI2CK8 zIe3nHo7m4#F6(GD)noTp`erxlkA|m1mZBfKcNPAAVkB`t?&q^Wq=G{h6nmfgQgvh2AD}e)@yMb6rG>J5bCFjLtOi z`tNrtp_+dlt(=AIW!#0ZW}f)-D2N&4N%X%-4g39n?gZ2Y|J-aH=Vl}!OkX4Z^RC>6 zyNqo_ZzrVRt`k1k|AE*sk|26H%colQ8JnoULm%d8cI+z7ap{p=lh3}y)1jKbq|%O3V%WIl`ANOeZ|$IIB*@iGiNy>} z$^R*w+YFcO9>#p#u7zrTjb(Rh5~2^!WD@$HZzba;rvDbL__wY?vg6}>t>1~|OvEtF z7Filb$cF2y!udn1GsmNptFcYja64XN6T*e#EF& zz|5oae4YDW?!%N-i?6)YO}FAES`%C4Q23G37vY)&OtwStq`XO{{<;Ko-Y1gg<=$%%apmNM%^O9&6xLd01xd(LS@o>VD%iu~^APoWe3g7LhM>HCzq-^-rK!NF zZJWhv<*%E4GC@a@%gnL5OO{p#B%0EC{YFINbhpNALTL`@a%XKx{VH86gT~2jW z)-lLQeJI>CIU9(^HYv{}c`R8*`>JlCg_l%VmaKMBBKF4aB!^)c<*zD7`FMVfp}SR= z1l!b}LveL;*g)s$62Ep^RFZVG7!K2I%S~I_rFD&zE;{vi-eemSu_w#4xq6PF%X}JF z%bHl4+k#O(uGDG|3E4*zC(~Ng$tSC!CTN_S>H<8i3_AZ zg<2nTB{JToy>4kMd@#W2>M^!uB=IO}yYjx&v9LD_jHZu)XQ$A5nviV6*cH0^11%{pyev7Xlme? zm-!e)4HvzsHp1y()ZY{dU%kI6g*|Pks2?> zYqv+>5#RKA`?_}3qUMBD>xs7{NhfmoOg(DBDlZPJ(L5yP#npH!h8g}OIs!$id(+tZ zM5X;8wOo3`jCXUKxo}t}TjoVu(rU>^kV|=*4|{73Q#TG8wM~EZvygF0g%rO&M;`bf z$@Cr%sF9NI+x{kQ%#U_A(Jfog1ntNfO|V$5%H5Yo`0P?|iEk-$94#UqCRfTkZI_@s zCH%HeWX6)lq}r=of3pVfQ5AbRoU>Y`|D5O~dKqW~Hv0}iWBF>mm7p~_Ai2u-`_`TE zSG11Hi2 zp1)`}TJeeTH477yJ-7H0dhE5Vqp+8ZniMX~NZ@w*F8|3&m(1=J=iZKF%~xo_0@piG zzv#yBmoV{T0#%LY+k+8NburK*%=}i3XlbeFx8@v>=oe`XFeRZ;#A*T``^g-rx%JP@ zzpnwWD8!?JeWUk@0rsS<`?qE2G|4>Izd8QP5o)yn?@4IZ>GdfQ{ku<+9N2yK@JjY~ z(B8g*ay#<0HZhM|8jV9oKd{1XwQ0V6-JLt4hG`VS_+}()o=|0F*&S*cN!A>txW$%` zU`9!u)wTjRGBn=02+~qoS>Y$4SFTh{4-ZMIy6tx+P4YxVh{|@>O82+#AIr&GSI>|6 zqzg1YrQu|tVyI}@2=V66s)u`@3!strtukJ-o}Bv*b-h_z+-%GJ*I!p-r*msi_Bni} zKI5d_3mSscs|lOlv7L|UDjow={L?n7gP6J{gk^547q~HXBzW0F3F<+tTK#1de&j$4 z^o9=hr(LP`&KSjyL+f!j(5}s)c4DE`SJ}q8bk8C^@l6#Lywxrur*(U%G|%-U8=*zW zN-&5Va03(3Q3pLqs0#r|el$k=itRoN{78`^_O5_+<&(IwwR0_>R|xoonT%_DrbXJC zge_ghuZj8#v{WM1b_6&JghmCl2+Bf16L0H%4~R=WQBD~__C{!CIRDmWj{{bXz>i!# zgb`+Q;=wM20kkXf<`9q8K_K2J@j_(@$u6#4?W;2U7^${n=1m(@NRg)feqLYq;KZ1$ zFleO43BfD)&$G=h*I7)Sx$kG<18_#pryi@oHyIu|cYM*{<1^Hp-&D{Gqer}ZzUr&} zQ}mMQQF=#KG}LtZK%CgPW+v>{^fi`<@>VLH6%J7bVI#NUcqVYIMtvI`ccWm3J{er! z9oaAvJHMi5C2;L?<`2xDSEs??%=dxsW;x-sY)O)lv2KBsb zCq*4Gf+O;|EO<7Pa#Ry8Lk_2m#5<*Ksb@7%y=HVI>4EenKy0Y;5R{0MZH((?l;EUW zePvqj{&2`M!mN{4$H@V$b{KhQVRzod4SO{GO6Zk7oC3ez+QT^=K|PQZv1ysMwKMR* z$;=aOOlnf_@w1_h*{?xYQq1mEIK){tOoqJu;X`nbN>`s=YQw8$^6%gNMZT49JU8_Q ztoo?H$b0<-K3R`_mzT=xhgmQH$~*v+DW?S?+U%kG4@$v9gbErGkdUWWAy@a?JsT5V zEa`BbO%i)&pXz4|*k4IM`P5%HNBVT4`P2p9JGk3&b1k(3z~nI@EV6)6iJnci6_%zJ zz6#`)KE+LNK8SWY*P5xE#8p8nYN=-kMGOUb!%5c=+(GPMr&BTi_D>0G%80x%Y&E;U zpy{3W0z7@^sqT=0YX2)F%}gLTQ_C*kH*+jQa;?3YC*GhIcJ?Xz`WOo9X2cW25S;;= zV#dfOG5mHF5rs7y^7AfS9Y@wnPWbigNHmn{TB2U5!VHkOVr~({z zXqLwpT1;+PW=TQN)GdY#no!9ZH5UTC#?`aFY#w6dNbd&$PtO@3?AjeLC2fpsIK{~c zW>yF$LkO7g^A_9K9;y=W+?nFJb3jW!Q{Q+b>U{U8gd#4eaJ{6#$7i%hj=y{V1NwmR>Q}SIyac-1W?K zz)tXc!#>-+&F|A?%)i|k=h7(p+I524f6Pq9W(BV6fo*S zZczYWoXAjAyo4`P#nf=x6}l17ei!=2%5j4w zWsXtuHyX;5wP|o0F}EZS>OyC|jS;lu0whfb*(i+Aan?>K1S++c!SP(J3)(U=*AU<#u9xx$8V}jQN(~S@nFXvc z%b^IW(U8FMP!k2COQ~DNuf3xcXDaV3V!L;~a~UIcpA`th&f#z4Y|^O}1sq4n#Ko~v z6{4WIx!EmL*$fF%%B!j;g*>i(wO^zfx{PnORSLs`*aq<^pRdk2@i!$q29)euz@m+D zOp_>n^}#qXvtg9=jkq4SdR9|U=gwSysmf+bK@1|6_?^`nx(4gq=`Sm7+|4d%T8bm8 z>klDzZ#IOZebdwUg0Sc5D|M~?3}o-QhcONHmN5|rZzc-6Zd=gi<}C?5x;q_M!hn`# zJaHB6V=JJ%y3ZJ~6I)=1c?%w#?1Ly=s+W3O4LeTnh4(KI^Fp;Ul<>!*&Gx)iRJt0j zX-S)1LZW?wn}?X+sO)?$h#?%jDNLO?c(H(w-h|1P-UQbdouVPA5n_E5-ng0li>ej4 z=OLglRsOMNv_g75b$Tn@t!V=y()R_IVwo*-Vt6mHkE!&o^0A@UG2X z1}$+-3ncI-t81%I23ak(TMXG*)XoG@x0*}&*ACo?S>9b1)XTUJI(|3Apff_;fcR{s zIN^OQS+L+Wt$>YWG;vOCdku&k9@ktO1M<;cVY0JV6yS$7- zsoOiipg2#lL?<~jgptz*>Mpa8UQejS{s8`^ypHksnkbMl703a6jy!bBw8?05*Lrk< zu@>|J8L~0`b2jE$;s^#a^t7R9d)uESUVEVzCvAAiAvo9~pIBR2Rn@DLH1pH-P_?- zn7Udb`L=@pfFhS@)yxC=ZieFix|Z)(5)T++#+{<^HNy&+3PQnz03hJuWWQfv5St;oz<|AC3k${W=ii6J;dysOKjWrum{+^0DJv^qVn58y z!(&ikGB`A3bnS@zNCpB?1Iswg%gwd#oW`4(!10=TA(#ila#2RWBsoThhf$-WDG7;* z6<)Y#aJgTMt|%#q^+D5hk4X#gnv9!&9Z1ey9UB`nDMU-FsupM7yVbB=AFh4A7m0MN zut0Ba`iz=090Kni`sgF$DOZ-k?80V zpt-N*!NAyqd#GbPb1^G|U zeo2~(CqN(ynU~qnUfw&kMP}(g2YS4F&FZqBl;rxJKK*m)D!t+R7eLX?Kh&0gRL^|> zDvyh}nFzTmQ`ng--y6^2o#kN=-*uMvI58B##Sir_6R9Ge#biMspTACbH zYSZr7ZEV9GQ)lUl`w(CTc)5qsvo4Burc1$o{1SFj0jPoyVj?;y7nP@Bo8Z+-$ zwjjVgSW)9!?w9ppZ16LEA4^L=XwS;l`mbmId*i%*^&gB=NO+8Eb7s7_bL87M1Nqcf zKUC-wnLGo$w|GgpV*lJI(HL%?KF~bHA|^JWUue`1w8ZGagNpL<0cLnxdpiXVc({jw zXJePY&7pEvvEew))$-YNhjM{4v(^VU8Crw71U5M_ckt<@O`-$Pc(ff(+EN_fK*AU_ zSfIf%AjAB@av-ipO~F6fXLE{<;Pxstt%tl`kT+;a@qRt zv?Kc&E3eEDxTGZWSL_Mm@AVXk#QS->npG|nLu+f1OPInuqx|{by{UA=;OF|Wvl9?y znR{6 z0Wm{-7_n(+DB<(q=eD*sLy^;io~s|k&8pvLWbmIl{1@GjO$whnI$nMsmga=iYZ_P8 zJ8}#jwI}xMO^=2lvXoRe*WJHpv*nWr6vF|U&>f&U4-b!tscHY(T4}=4_z!SdAl3qp z^>c}vv6(Obj1I>Cmun&Bwt<1BAg=z#(SvNBECPKu?<0u2g+usJ3`V!^HNE2y!4NR| zxzyCu&xV({Ie85&VND?7N<$zsJImUiKJ@nXme%v zAP5+_yIs$+VypFm8bK+PODwGU7R5RL7$v_?fROM+|ABB0#UZ6BW(9D>BzLoK%yUCe~fL2?{U9ZvlZGr(e0~=OUl4Gwn{o6U@92o|Ur} z39}BC_xd)erp6;WTMRmY>7W*UW~NoHmn}u?cSZ|#A~e07m-xgmxpO`hpJ!)n3JVHy z?`^|fF!g!BwD0B3xPCvrch<>Naa*q*C1Ph<>O6Kr=CAINv%l^M)~|)D%a8PN%ub0N zp)cE;qjay3;A6*aUZ;{@k{@UCus-wCC&kZ$Pw5)6u<$t{A%Q#d$JSPLQ>=#(m!pKx znldLJw={KZ#cbcQjvy?AJ&Uj3NtoW**JliOW|W^djLw-)<^m>w4yq|2VFLAt0p_Ho z2?O8`y1F8}W=kWXP!lsVh^%4XrDTdmrovh`qpra~3Y` zzo94<^1+rnS^d*{}^{6${^doj8b z0LK;SX6fXl6ZS-3nL}csIqb;7{JcH@Rl~zcz?Lg3EBBgobZ+kM_E6T#Cs7@o$GM&h zwZCqm9Zn$?R}(6xx3|q!C~xRpG99GLm2*_Fb|E7qFzjjvaje!0GG% zYC)3G<-Z=4|GfUcy-fOlPb&M^LE=Gr-jNTke_PFv?;twtlT+O)(zOjFb|eO$#UuMV zcV5fdr0;wxFmPQQcmQaIon+l0DsE@xh%!jfv|j#6V@`sWp+;zdxtg*p1^2ar0*PIn zp)%Lb0ID;c5s9GwE^W(qgyVvL!{^(qhG6sY-aF5AcehgmmKNvEhH3$H$z{{+Y@s82 ziB5jBX44UdTN*H|LuTe?KLj`RtfBKb^5ZvI7IgvLq!fCGWPg~q{?NLA`WIR;$iD=t z^=6$k6Kv$4N{DD*hIDmSI?WynEGe8h4EHD%Yi7_!?ev`VU!;1n$?wXnKyh-UD@^%8-M2xEl}{f98%Viq=R3B((Na|q zLWDHPcu{sKqm=fq#1$3W8e47xQ7kC=oAY8tOB5sj*E;z3{90-Cb3rlAS{ch`jPSS8 zOmrO|go)kXKve|-N+wZRVbxA`5U%L>Bi+4ggleoQuJ}0S^3lUbY|ZxQb?BVMd3sg~ zbH)Zq!Gj3$w%1yXjZls)L&yOMOVjA%?c}6ooI@W<&OB=l`hUP81 z14_PFA{)i<2C6>?TjRe|)_eCxvbk|C8L%t$i_FwuW|zZn!(m6Nb7D`i4<+qykm=O< z%t?Z*QBKu<%#3xg{Nv5!nt?Sj4_Qfc2kg@MqNyTQ!eDTSm;cY>+!Pz#Av&{Dg0_b4 zMimGLpTWn`ZVw>-n|bxt~7Gm>3_x74(Ub@T)6K^J_C= zSiFETB|m-SmcVvhI)i+oj`l5P(YrHHeM{^yEmfhK7)ZfU7we@;)m>H?-uBPN#|k5B zUkE-3nK>2{mH7h=tD(bA#24wkA7dIX;jPGfe!f!OR{KX*hpsEXQ60z6aA{-}H#k(& zeprNT_`JyBhj z&^*e3bB{n>=sQZ$pZo~aT3E_eHzNBsdOm$IqR*9SKfU@6ToZ@M9dUMpivEh9q!|O9p>rRh zi`$)FSLP6i-B^C;Z*S$D9(-H7UeMHiI;owHXZ>lxSRJOlz*`-33tll#-|d@4jc5gy zMFJ+Yw2!qh^>5V1OL{>l6Vo{c_@g2T$j;hj%HLh@bs(3FT)z~Ke2ZIEi=p?t=fSR} z`n?deb1oV)`r?&y?bjBzJfj|TLh(I8e*D+el?FGV#m)6we0kjH8B0$+V zK61OOp`lSkD>A$^IzFybmroxi;n{bY_v~m_` zZC>wnD_%Q{ON-IsEN^H-iv|bNCoe$KF0M)qz@!skDii5 zgs$(RW@?%%T)Vq$MQv(*U+lRyMh9j8g%tK^VUl={3FTYgn1yV(ruoX_VegXkIA`za zh`4==IoYcA3RSae(P2J(TJ9w8;Q%2AL3^_Aj^x0ig6|7X@`Z)1xsUIEcckG*{d*!B zmX|}tKssEB?<52uoW1RZykV#VOawY$`mZ2nYx^)%uCxMWpX<@|jm#qFpUm*)1ni+q zeW{d*=m~aiKH(pDi#}VWZ_k$xrF#a?e{2lZmV$VQ=A_;KeYa1Uzzi3fbppzHO`X1p z4@c7-ya+o5ZAH3IAFqZdB!JH<@*SL=@8sv_o0yn@qg>O|)8R&MgQw>j-i*UU=RSzq zDOw;pKi3C-OYYoXFJoKRSV>4@ANA>|$^nOhl6#gsoM+E9IuOOtP0?rZzf2R~-`EhXj{I!zNjuH_EW_#odY~H@N$ttj5d4pS2tB zLYS?;$6>%Nrh_O z>BC4iX|>C%a<;jZ;pPR|PVT*iqbIZ13ylm)iuL-XqyTwUyzODU+&}`K`qVB>)a95I zg40l^;=655k$1|gtL^R2?@pDZ^(ILuu|e1EcPa4Rytk+htr$b{n;=$%e2bH z(ck}u@A42JIlR_?-vMbpOH7nK6gq*@-az(G^;k&uJvn3+PI}(I>i68ISHMkubhGHS zZ{;hTy3}0F@7Zvqf?J{1KvhQO*cm^7CAvnIT<0q|tU39QP|lnx1uAm0)FK*9UXqxi zg-n@5gvhYgBi)($2HMpYX@M ziVkeoltW4K`|x&1YQ`;EEi1?>t7uf(d>_8zntuTlo~Y*)+FKPdsj7Mv^JeJCRX36L z`gv?xx8%h7MGJd&cJ($z)$e9i56N_|{1y}~YHwDU+*d(7P(h%HBgPZ8-nV_1F@x!f zzJ}t7fKh&j#N976s%U6%w*N*$-)N@p)tzpZ{o%E|pQG{CC`+2d!1o(X^DQRB2Q%cP z9;Q$(tH=Jj-m!B&-C>4ObMq(by-a6F31-M;<)lKth&5lDNdw~Cj%D9c&y}Y^s4iGT%9qMwz<$qWR7`MmY7=e1W2a}n5wJoquK0Zj`boWea^5&OW`t}m4tTO}bGQznE@ zoJ%^2c*e1t@`88zSJ_ZK>5Ic9$SAq$LR${LL^Fg7WBV|$ak>rdO@n_)4W!v``mtjB zB7%z?TmA0VMQ=Bt6%afp4$nHZdme4qy?GN4i;4COe%a&_i*s-ZWnp?nX9w&-`tIoH zXkuY8^fO%%T#Nvt*Vd*vYTn|0632h~RRvyx$Yd@=7-1JPrJj(-jCmAk;Q3-#!7-O` zpe?9#`m#FCgIBBP4yu3RLH|D%h1d+F z76=j!)=nmIQl2T7B^ESiK@lu9B|R10-25CACyJurTqYMUr^)T=>gMiN^Jd~03$MLVfBSj>|4E{@J%es%w^#$tBVJ>5#F zDE_* zd7sJEP))U8ug~5cgjvo<%Vp(-24}%8ZTmYs`#5RD1pU^&T;QyB&L3xlz`qR|5~- z?mM=7(Zovg&3cY)-`#d18${2ZZ8NFZGQ(Ie8&UKZ@o~4~kUjJf0Fz}{Xe2Eo zldWEooAH{%`&aW{#ElI=dD;W|3y|I51KK@eNz?!n-O5?&$b+`HFOYR~|2S;E2kMER zY)_-C)4X~|SX~9+^{`XoMjZ?qrF|dhI}A|L<&~A$fZ`OJsL2ACLAfSqu~2_ zh7eF(YNQ6U96k2b-oAr~jn}>b_-hB>Q}l6B;2Yf#@q2lOUaLRPvm8D8H0a5_#7K=D z8$Gqeop6YXWZwT0=6_vDve?1I5Cs}HKd4aRUFZ8Px3j?$V-|RHesL4M6g7w^{_Pv) zxkrp7!8AYbq3A-_R%qioMF5XQ1n64^&f<2~rCb+cR7eHX*7l5_G&xV*I0FMvkqWST zeD>cJsy^So4ayp|0fK+RSE-3N5i zIix6BLY%X4sg4cK2Z7rr=@`wvKZbKcdlJl0Y>ahtVCe9Fxd@yY{{@ws3_CIfb$N?s zRN9Zxx1YgE6Im^PbmlbW!8Y412UMZIb9NeBW9AS_6a(mFiNwMY>{cb<=nWe0q5wmk z8Q*dk-qmHxTlN~9acZ_b&yeaEAHB1u6)AvoPDx7pnUAwTH|-825?8D&QOnA!X(}tO zjqhRJYwxJYV)3UwF1nyNEG90_Z6a@PZ@mrk_`S=OBE{)JQ4-4%eZ{Cxd9l;If|HXI z-4;QivQ0R9qsbC>JI7)R5wNgfiN{Mc7FgEDqbo+_{{g;ro$ZCJ^@?7)oO)J{QQpy2 z|99*&pv>=BBKl{DrA0`Ixt+xVP=^DyOXrKLs#wGpcb!D1Z@Pl4>{s}Z7&APG1OdL~`=;_b)L0_Oek^#eazPb~*$@0p~L`G*n(+U+_s0uCW*hdhVkC zzW~1UM*$5*px9Ji$2jUCckaLA(-^u1G5zOEG=z^^pZ&)F{7qPbPuKt9-|vc_L}>o$ fN3QWdlW7+=E|&Pl);CFr{`RdKy4Q=;A3gscC$|hD literal 0 HcmV?d00001 diff --git a/modules/ogone/docs/en3.png b/modules/ogone/docs/en3.png new file mode 100644 index 0000000000000000000000000000000000000000..5f090d1aa9d2e9435fb595c4695a675726bd85ca GIT binary patch literal 11914 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 NZGFQV#kvn){5RIvs=5FG literal 0 HcmV?d00001 diff --git a/modules/ogone/docs/en4.png b/modules/ogone/docs/en4.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1624897ec7e14b6e61e849fd4fcd6a6d18e6dc GIT binary patch literal 73459 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�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 U#YI0j1HNSMD@f+v(|`WI03*3Z{{R30 literal 0 HcmV?d00001 diff --git a/modules/ogone/es.php b/modules/ogone/es.php new file mode 100644 index 000000000..25b3b50c6 --- /dev/null +++ b/modules/ogone/es.php @@ -0,0 +1,43 @@ +hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido en'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'está terminado.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Su pedido le será enviado lo antes posible.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier pregunta o información, contacte con nuestro'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'servicio clientela'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Hemos constatado un problema con su pedido. Si piensa que se trata de un error, contacte con nuestro'; +$_MODULE['<{ogone}prestashop>ogone_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración guardada'; +$_MODULE['<{ogone}prestashop>ogone_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Ayuda'; +$_MODULE['<{ogone}prestashop>ogone_c3aace2676937d5cb50e536abbe9113d'] = 'Primero, siga los siguientes pasos:'; +$_MODULE['<{ogone}prestashop>ogone_0ad87dec5bc422a24ca801c473d44213'] = 'En PrestaShop'; +$_MODULE['<{ogone}prestashop>ogone_1d1f6896858b1bc96cecf995b1800a82'] = 'Indique su login Ogone (PSPID)'; +$_MODULE['<{ogone}prestashop>ogone_c76d97611c239318461a32e3ce151b83'] = 'Indique las firmas SHA-1 que elija (debe copiarlas en su interfaz Organe para más tarde)'; +$_MODULE['<{ogone}prestashop>ogone_8c2fc0d78cab9c2bd9cef54931cc0808'] = 'Elija el modo de test si acaba de crear su cuenta de test en Ogone (el módulo no funciona con una cuenta demo)'; +$_MODULE['<{ogone}prestashop>ogone_39963c4d14081a701198768d7b9b00d9'] = 'En Ogone'; +$_MODULE['<{ogone}prestashop>ogone_2ee3d80e1919fc84a184c727e3ccfa20'] = 'modo test'; +$_MODULE['<{ogone}prestashop>ogone_20226890d13b230111fe30e1eb7a167b'] = 'modo producción'; +$_MODULE['<{ogone}prestashop>ogone_38056880101f21752c2dbce4549b8423'] = 'Ver la captura de pantalla para el paso'; +$_MODULE['<{ogone}prestashop>ogone_8da6d1ecd712792004829aa57eb4a9f7'] = 'Cartas de test'; +$_MODULE['<{ogone}prestashop>ogone_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{ogone}prestashop>ogone_05d749acfbb6a79553aef6a644db881f'] = 'PSPID'; +$_MODULE['<{ogone}prestashop>ogone_ac3b5413fdb77e3726a94891c9844b44'] = 'Firma SHA-in'; +$_MODULE['<{ogone}prestashop>ogone_7c287610a5cd0fddf4261f153996da5e'] = 'Firma SHA-out'; +$_MODULE['<{ogone}prestashop>ogone_650be61892bf690026089544abbd9d26'] = 'Modo'; +$_MODULE['<{ogone}prestashop>ogone_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{ogone}prestashop>ogone_756d97bb256b8580d4d71ee0c547804e'] = 'Producción'; +$_MODULE['<{ogone}prestashop>ogone_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar'; +$_MODULE['<{ogone}prestashop>ogone_75310bf8b7cf2ca4e09332871f98c271'] = 'Pagar con Ogone'; +$_MODULE['<{ogone}prestashop>ogone_51e550f8a0e9e127a566c21e9a15538b'] = 'Logo Ogone'; +$_MODULE['<{ogone}prestashop>ogone_15ee0c3bac84f0ff0a2af1e6cdc1a048'] = 'Pagar rápidamente con toda seguridad en la siguiente página con IDEAL / Mastercard / Visa / PayPal / Mister Cash / Bancontact'; +$_MODULE['<{ogone}prestashop>validation_e9f77209121063c8aedd7698f20f4878'] = 'Parámetros recibidos:'; +$_MODULE['<{ogone}prestashop>validation_273e5454628021d87e34051074ac62d1'] = 'Parámetros que faltan'; +$_MODULE['<{ogone}prestashop>validation_cbb285f0e88adea7d492a5b14b9e6d1d'] = 'Error (identificación rechazada)'; +$_MODULE['<{ogone}prestashop>validation_ee5698e64b5157ad1cbe6aa614288c33'] = 'Pago autorizado / OK'; +$_MODULE['<{ogone}prestashop>validation_6b4fcb57371df22836b78f67bc444213'] = 'Estado desconocido:'; +$_MODULE['<{ogone}prestashop>validation_a04830387e55082ed6096ab698ac8238'] = 'Firma SHA-1 no válida'; +$_MODULE['<{ogone}prestashop>validation_7eaab6a852dfe4707acde8847dba7ce9'] = 'SHA-1 incluido'; +$_MODULE['<{ogone}prestashop>validation_8fbed6331a34a844224bfee15145e00f'] = 'SHA-1 calculado'; +$_MODULE['<{ogone}prestashop>validation_671c1f78cd9a17103c43a10d19157678'] = 'Clave simple'; +$_MODULE['<{ogone}prestashop>waiting_1fe3bb016fa11dd93fb1929f118fd492'] = 'Por favor, espere mientras se procesa su pedido'; diff --git a/modules/ogone/fr.php b/modules/ogone/fr.php new file mode 100644 index 000000000..1859f6503 --- /dev/null +++ b/modules/ogone/fr.php @@ -0,0 +1,43 @@ +hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est terminée.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Votre commande vous sera expédiée dès que possible.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou pour plus d\'informations, merci de contacter notre'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'service client'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Nous avons constaté un problème avec votre commande. Si vous pensez que c\'est une erreur, merci de contacter notre'; +$_MODULE['<{ogone}prestashop>ogone_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration enregistrée'; +$_MODULE['<{ogone}prestashop>ogone_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aide'; +$_MODULE['<{ogone}prestashop>ogone_c3aace2676937d5cb50e536abbe9113d'] = 'Suivez tout d\'abord ces étapes :'; +$_MODULE['<{ogone}prestashop>ogone_0ad87dec5bc422a24ca801c473d44213'] = 'Sur PrestaShop'; +$_MODULE['<{ogone}prestashop>ogone_1d1f6896858b1bc96cecf995b1800a82'] = 'Renseignez votre identifiant Ogone (PSPID)'; +$_MODULE['<{ogone}prestashop>ogone_c76d97611c239318461a32e3ce151b83'] = 'Renseignez les signatures SHA-1 de votre choix (vous devrez les copier sur votre interface Ogone par la suite)'; +$_MODULE['<{ogone}prestashop>ogone_8c2fc0d78cab9c2bd9cef54931cc0808'] = 'Choisissez le mode de test si vous venez juste de créer votre compte de test sur Ogone (le module ne fonctionne pas avec un compte de demo)'; +$_MODULE['<{ogone}prestashop>ogone_39963c4d14081a701198768d7b9b00d9'] = 'Sur Ogone'; +$_MODULE['<{ogone}prestashop>ogone_2ee3d80e1919fc84a184c727e3ccfa20'] = 'mode test'; +$_MODULE['<{ogone}prestashop>ogone_20226890d13b230111fe30e1eb7a167b'] = 'mode production'; +$_MODULE['<{ogone}prestashop>ogone_38056880101f21752c2dbce4549b8423'] = 'Voir la capture d\'écran pour l\'étape'; +$_MODULE['<{ogone}prestashop>ogone_8da6d1ecd712792004829aa57eb4a9f7'] = 'Cartes de test'; +$_MODULE['<{ogone}prestashop>ogone_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{ogone}prestashop>ogone_05d749acfbb6a79553aef6a644db881f'] = 'PSPID'; +$_MODULE['<{ogone}prestashop>ogone_ac3b5413fdb77e3726a94891c9844b44'] = 'Signature SHA-in'; +$_MODULE['<{ogone}prestashop>ogone_7c287610a5cd0fddf4261f153996da5e'] = 'Signature SHA-out'; +$_MODULE['<{ogone}prestashop>ogone_650be61892bf690026089544abbd9d26'] = 'Mode'; +$_MODULE['<{ogone}prestashop>ogone_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{ogone}prestashop>ogone_756d97bb256b8580d4d71ee0c547804e'] = 'Production'; +$_MODULE['<{ogone}prestashop>ogone_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour'; +$_MODULE['<{ogone}prestashop>ogone_75310bf8b7cf2ca4e09332871f98c271'] = 'Payer avec Ogone'; +$_MODULE['<{ogone}prestashop>ogone_51e550f8a0e9e127a566c21e9a15538b'] = 'Logo Ogone'; +$_MODULE['<{ogone}prestashop>ogone_15ee0c3bac84f0ff0a2af1e6cdc1a048'] = 'Payer rapidement et en toute sécurité à la page suivante avec IDEAL / Mastercard / Visa / Paypal / Mister Cash / Bancontact.'; +$_MODULE['<{ogone}prestashop>validation_e9f77209121063c8aedd7698f20f4878'] = 'Paramètres reçus :'; +$_MODULE['<{ogone}prestashop>validation_273e5454628021d87e34051074ac62d1'] = 'Paramètres manquants'; +$_MODULE['<{ogone}prestashop>validation_cbb285f0e88adea7d492a5b14b9e6d1d'] = 'Erreur (authentification refusée)'; +$_MODULE['<{ogone}prestashop>validation_ee5698e64b5157ad1cbe6aa614288c33'] = 'Payment autorisé / OK'; +$_MODULE['<{ogone}prestashop>validation_6b4fcb57371df22836b78f67bc444213'] = 'Statut inconnu :'; +$_MODULE['<{ogone}prestashop>validation_a04830387e55082ed6096ab698ac8238'] = 'Signature SHA-1 invalide'; +$_MODULE['<{ogone}prestashop>validation_7eaab6a852dfe4707acde8847dba7ce9'] = 'SHA-1 fourni'; +$_MODULE['<{ogone}prestashop>validation_8fbed6331a34a844224bfee15145e00f'] = 'SHA-1 calculé'; +$_MODULE['<{ogone}prestashop>validation_671c1f78cd9a17103c43a10d19157678'] = 'Clé simple :'; +$_MODULE['<{ogone}prestashop>waiting_1fe3bb016fa11dd93fb1929f118fd492'] = 'Merci de patienter pendant que votre commande se valide...'; diff --git a/modules/ogone/hookorderconfirmation.tpl b/modules/ogone/hookorderconfirmation.tpl new file mode 100644 index 000000000..c6ffddc7d --- /dev/null +++ b/modules/ogone/hookorderconfirmation.tpl @@ -0,0 +1,37 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $status == 'ok'} +

    {l s='Your order on' mod='ogone'} {$shop_name} {l s='is complete.' mod='ogone'} +

    {l s='Your order will be sent as soon as possible.' mod='ogone'} +

    {l s='For any questions or for further information, please contact our' mod='ogone'}
    {l s='customer support' mod='ogone'}. +

    +{else} +

    + {l s='We noticed a problem with your order. If you think this is an error, you can contact our' mod='ogone'} + {l s='customer support' mod='ogone'}. +

    +{/if} diff --git a/modules/ogone/it.php b/modules/ogone/it.php new file mode 100644 index 000000000..9f6b8abee --- /dev/null +++ b/modules/ogone/it.php @@ -0,0 +1,45 @@ +hookorderconfirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine '; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_30163d8fc3068e8297e7ab5bf32aec87'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{ogone}prestashop>hookorderconfirmation_8de637e24570c1edb0357826a2ad5aea'] = 'Abbiamo notato un problema con il tuo ordine. Se pensi che sia un errore, contatta la nostra'; +$_MODULE['<{ogone}prestashop>ogone_75310bf8b7cf2ca4e09332871f98c271'] = 'Paga con Ogone'; +$_MODULE['<{ogone}prestashop>ogone_51e550f8a0e9e127a566c21e9a15538b'] = 'Logo Ogone'; +$_MODULE['<{ogone}prestashop>ogone_15ee0c3bac84f0ff0a2af1e6cdc1a048'] = 'Paga in modo sicuro e veloce alla pagina successiva con IDEAL / Mastercard / Visa / Paypal / Mister Cash / Bancontact.'; +$_MODULE['<{ogone}prestashop>ogone_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{ogone}prestashop>ogone_6a26f548831e6a8c26bfbbd9f6ec61e0'] = 'Aiuto'; +$_MODULE['<{ogone}prestashop>ogone_c3aace2676937d5cb50e536abbe9113d'] = 'Prima di tutto, si potrebbe procedere come segue:'; +$_MODULE['<{ogone}prestashop>ogone_0ad87dec5bc422a24ca801c473d44213'] = 'Su PrestaShop '; +$_MODULE['<{ogone}prestashop>ogone_1d1f6896858b1bc96cecf995b1800a82'] = 'Inserisci il tuo Ogone ID (PSPID)'; +$_MODULE['<{ogone}prestashop>ogone_c76d97611c239318461a32e3ce151b83'] = 'Compila le firme di tua scelta (dovrai poi copiarli nel back office Ogone)'; +$_MODULE['<{ogone}prestashop>ogone_8c2fc0d78cab9c2bd9cef54931cc0808'] = 'Scegli la modalità di test se hai appena creato l\'account di prova su Ogone (non funziona con l\'account demo)'; +$_MODULE['<{ogone}prestashop>ogone_39963c4d14081a701198768d7b9b00d9'] = 'Su Ogone'; +$_MODULE['<{ogone}prestashop>ogone_2ee3d80e1919fc84a184c727e3ccfa20'] = 'modalità di prova'; +$_MODULE['<{ogone}prestashop>ogone_20226890d13b230111fe30e1eb7a167b'] = 'modalità di produzione'; +$_MODULE['<{ogone}prestashop>ogone_38056880101f21752c2dbce4549b8423'] = 'Vedi la schermata per la fase'; +$_MODULE['<{ogone}prestashop>ogone_8da6d1ecd712792004829aa57eb4a9f7'] = 'Schede prova'; +$_MODULE['<{ogone}prestashop>ogone_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{ogone}prestashop>ogone_05d749acfbb6a79553aef6a644db881f'] = 'PSPID'; +$_MODULE['<{ogone}prestashop>ogone_ac3b5413fdb77e3726a94891c9844b44'] = 'Firma SHA-in '; +$_MODULE['<{ogone}prestashop>ogone_7c287610a5cd0fddf4261f153996da5e'] = 'Firma SHA-out'; +$_MODULE['<{ogone}prestashop>ogone_650be61892bf690026089544abbd9d26'] = 'Modalità'; +$_MODULE['<{ogone}prestashop>ogone_0cbc6611f5540bd0809a388dc95a615b'] = 'Prova'; +$_MODULE['<{ogone}prestashop>ogone_756d97bb256b8580d4d71ee0c547804e'] = 'Produzione'; +$_MODULE['<{ogone}prestashop>ogone_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiornare le impostazioni'; +$_MODULE['<{ogone}prestashop>waiting_1fe3bb016fa11dd93fb1929f118fd492'] = 'Si prega di attendere l\'ordine è in fase di elaborazione ...'; +$_MODULE['<{ogone}prestashop>validation_e9f77209121063c8aedd7698f20f4878'] = 'Parametri ricevuti:'; +$_MODULE['<{ogone}prestashop>validation_273e5454628021d87e34051074ac62d1'] = 'Parametri mancanti:'; +$_MODULE['<{ogone}prestashop>validation_cbb285f0e88adea7d492a5b14b9e6d1d'] = 'Errore (aut. rifiutata)'; +$_MODULE['<{ogone}prestashop>validation_ee5698e64b5157ad1cbe6aa614288c33'] = 'Pagamento autorizzato / OK'; +$_MODULE['<{ogone}prestashop>validation_6b4fcb57371df22836b78f67bc444213'] = 'Stato sconosciuto:'; +$_MODULE['<{ogone}prestashop>validation_a04830387e55082ed6096ab698ac8238'] = 'Firma SHA-1 non valida'; +$_MODULE['<{ogone}prestashop>validation_7eaab6a852dfe4707acde8847dba7ce9'] = 'SHA-1 dato:'; +$_MODULE['<{ogone}prestashop>validation_8fbed6331a34a844224bfee15145e00f'] = 'SHA-1 calcolato:'; +$_MODULE['<{ogone}prestashop>validation_671c1f78cd9a17103c43a10d19157678'] = 'Chiave semplice:'; + +?> \ No newline at end of file diff --git a/modules/ogone/logo.gif b/modules/ogone/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe328d2f67a6151147805cefcf63153612eab7a5 GIT binary patch literal 1079 zcmZ?wbhEHb6krfw_|Cw#Hf?Z zq?g2~o5HABpVVBsgp143iV~Imti$h|&b4s^IN}ESYyL0*kx9n+NSra^RrugSf z_RpK_mp{#~U}jKmcW}wf(9)UV<#VFTXU0}cj;@#!RW&cBW`11Fg7muSSbjWXJJEJI*cJbz=GMlS}uUU$yJxsy!#y z>^Ze&-|4mc&#d2ncHxc-i}zh#zW36W{ijwPxU%ZV_4P-tuRD5k%c1kTj-B6d?ADgk zclVyWwCCjIy{9hkJ$ZHSsVnoxb<#)Vc#%zI^@m?He%d z3+XG5C?-CNiB{>f4S>K@JXm zPHXE_6pUVrYD@5~+VH73fq{L6xk$vqqpLzEaQb9eE@C*~v@ps+M5puXtEoL~K}lN` z6&w!T*5~o~qv^W*FpKHhc_IuO77DBlvJh)XXl!hp6j)&+AYsrVpc}Dh)0v8mi@7!I z)kP#S9=ZvvjaU=Z`00t}l^H@@0&7kfA2-bjU21ppWuPNtt5S#DQALsLP%Yooz6BB! z71<=+dc{ueY(Ca4EUOoFL#87reWH?UyAb28QdUo4t>{C0X6{$>l`^ZXU}a&j1^~=f ByjTDL literal 0 HcmV?d00001 diff --git a/modules/ogone/ogone.gif b/modules/ogone/ogone.gif new file mode 100644 index 0000000000000000000000000000000000000000..35c4b55ba439e33951675a62332a05d3369fdebe GIT binary patch literal 1843 zcmV-32h8|KNk%w1VO9V!0OkMym8rm_waKx-(F8PV%+}#NV2jk;<`_hFEmVTw=I!+M z_;!%4X@#a(c$~Y)))hf?k*2=H(A?77xrPcov_8e%Gp3F;2DpmdL|n5@Db zNO>eqeGEEoCs2NDh^Qh=dZh+ci5TY8?N zw8(^;w*3A6o36x3Ym?gI>aM=er?|_jyUvZHyy)%nn5)9?^7h2f+;NPnd6KVtl(B!8 zv*+ybfS9y~oVU=~41ejER4bkdcy;l$Dl`K}HxI0V@;~DgXpeLYJnHf~Tsh zs!k$d3|u}nZvYYsKdh3ey1l-ULrhW!Aulv!5<$MazsArHajs&rKj87?3cM1atD2VAuUBpD5mS}{FOizR|bR#(Fey05101!TPUds1RwJT z!oZ@Sl0t?U{|G68fC#-l92i8QbTK2t9|XJ*oHu}rl3bBWnq2q;gNb=KA5Z}j)6dMG zk@gh8Iq$)U3#fboU5cj#(LN6Vz?AvJgMkQ2hQM6f>j!`wL_^ph@TjDOD;(&Bkij4U zS6@c|C_L>W1H+$-5n#;Y;NnG}0W{3K?d1T+TopnTKDjYZiUSO1^bUxT@6VJfB#=bu z;6TEo9|;76VSyw8%qR{@WY7{IOow!TP)JAvfP@1hsw^;mdH{(+0cpp=1P(PD0WJeW z_!yVukptu(5g>U~q)(0$I0(Lg08>nMf>~4`JOyBGA1MkK%=-X)%Z_;tJWQA;gTfAi zJpN#C0TRTAvg2m>7PNCIIFQC$`R{1Jo-Y8v2|4>WYz zDF_*yf&v)kDO5q5eFTt;5OmDY#{>$HFb^0|{J;cQ`7O~05hP$aPZ>6rY3UbgCg79_ zYd9f<6AFm1l_gH3IhR60tbm{kbOaCs2gO(c1O^bzP{0-0CHe;zX_;_@1ajqIg^e>X zVJW74AfbQ`AM*~irVu2K;Dm94*Um&QKSaDQzffYFnAn^m^^J{7-pUiTHN*e^UgTX!s0~P&_OPO9EpAZGe009{ai1w zF_j-jq~QDbrVK#^*&1#T#QH{1Q3d?EBml;Q=6L`gkdhQjQDFmS2pj(z(kA3a9`a ze1Jy^h#@{gK!F=g@dF^BAP5owz!@LlBJ&VITx`Gq;`HH1N*Do<2}JftG2blV^hh66l}<8MtZyFL=NKxKM)+ ze1HcGh$aKT@Bt}!!37WCKo$f7LC +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Ogone extends PaymentModule +{ + private $_ignoreKeyList = array('secure_key'); + + public function __construct() + { + $this->name = 'ogone'; + $this->tab = 'payments_gateways'; + $this->version = '2.0'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = 'Ogone'; + $this->description = ''; + } + + public function install() + { + return (parent::install() AND + $this->registerHook('payment') AND + $this->registerHook('orderConfirmation')); + } + + public function getContent() + { + if (Tools::isSubmit('submitOgone')) + { + Configuration::updateValue('OGONE_PSPID', Tools::getValue('OGONE_PSPID')); + Configuration::updateValue('OGONE_SHA_IN', Tools::getValue('OGONE_SHA_IN')); + Configuration::updateValue('OGONE_SHA_OUT', Tools::getValue('OGONE_SHA_OUT')); + Configuration::updateValue('OGONE_MODE', (int)Tools::getValue('OGONE_MODE')); + $dataSync = (($pspid = Configuration::get('OGONE_PSPID')) + ? '' + : '' + ); + echo $this->displayConfirmation($this->l('Configuration updated').$dataSync); + } + + return ' +
    '.$this->l('Help').' +

    '.$this->l('Please follow these steps:').'

    +
      +
    1. +

      '.$this->l('PrestaShop side').'

      +
        +
      1. '.$this->l('Fill in your Ogone ID (PSPID)').'
      2. +
      3. '.$this->l('Fill in the signatures of your choice (you will have to copy them to Ogone back office).').'
      4. +
      5. '.$this->l('Select test mode if you just created your test account on Ogone (it does not work with the demo account).').'
      6. +
      +
    2. +
    3. +

      + '.$this->l('Ogone Side').' / + '.$this->l('test mode').' / + '.$this->l('production mode').' +

      +
        +
      1. '.$this->l('See the screenshot for step').' 1
      2. +
      3. '.$this->l('See the screenshot for step').' 2
      4. +
      5. '.$this->l('See the screenshot for step').' 3
      6. +
      7. '.$this->l('See the screenshot for step').' 4
      8. +
      +
    4. +
    +

    '.$this->l('Test cards').'

    +
      +
    • Visa : 4111 1111 1111 1111
    • +
    • Visa 3D : 4000 0000 0000 0002
    • +
    • American Express : 3741 1111 1111 111
    • +
    • MasterCard : 5399 9999 9999 9999
    • +
    • Diners : 3625 5695 5800 17
    • +
    • Bancontact/Mister : 67030000000000003
    • +
    • Visa Purchasing : 4484 1200 0000 0029
    • +
    • American Express : 3742 9101 9071 995
    • +
    +
     
    +
    +
     
    +
    +
    '.$this->l('Settings').' + +
    + +
    +
     
    + +
    + +
    +
     
    + +
    + +
    +
     
    + +
    + +   + + + +
    +
     
    + +
    +
    +
     
    '; + } + + public function hookPayment($params) + { + global $smarty; + + $currency = new Currency((int)($params['cart']->id_currency)); + $lang = new Language((int)($params['cart']->id_lang)); + $customer = new Customer((int)($params['cart']->id_customer)); + $address = new Address((int)($params['cart']->id_address_invoice)); + $country = new Country((int)($address->id_country), (int)($params['cart']->id_lang)); + + $ogoneParams = array(); + $ogoneParams['PSPID'] = Configuration::get('OGONE_PSPID'); + $ogoneParams['OPERATION'] = 'SAL'; + $ogoneParams['ORDERID'] = pSQL($params['cart']->id); + $ogoneParams['AMOUNT'] = number_format(Tools::convertPrice((float)(number_format($params['cart']->getOrderTotal(true, Cart::BOTH), 2, '.', '')), $currency), 2, '.', '') * 100; + $ogoneParams['CURRENCY'] = $currency->iso_code; + $ogoneParams['LANGUAGE'] = $lang->iso_code.'_'.strtoupper($lang->iso_code); + $ogoneParams['CN'] = $customer->lastname; + $ogoneParams['EMAIL'] = $customer->email; + $ogoneParams['OWNERZIP'] = $address->postcode; + $ogoneParams['OWNERADDRESS'] = ($address->address1); + $ogoneParams['OWNERCTY'] = $country->iso_code; + $ogoneParams['OWNERTOWN'] = $address->city; + $ogoneParams['paramplus'] = 'secure_key='.$params['cart']->secure_key; + if (!empty($address->phone)) + $ogoneParams['OWNERTELNO'] = $address->phone; + + ksort($ogoneParams); + $shasign = ''; + foreach ($ogoneParams as $key => $value) + $shasign .= strtoupper($key).'='.$value.Configuration::get('OGONE_SHA_IN'); + $ogoneParams['SHASign'] = strtoupper(sha1($shasign)); + + $smarty->assign('ogone_params', $ogoneParams); + $smarty->assign('OGONE_MODE', Configuration::get('OGONE_MODE')); + + return $this->display(dirname(__FILE__), 'ogone.tpl'); + } + + public function hookOrderConfirmation($params) + { + global $smarty, $cookie; + + if ($params['objOrder']->module != $this->name) + return; + + if ($params['objOrder']->valid) + $smarty->assign(array('status' => 'ok', 'id_order' => $params['objOrder']->id)); + else + $smarty->assign('status', 'failed'); + $link = new Link(); + $smarty->assign('ogone_link', (method_exists($link, 'getPageLink') ? $link->getPageLink('contact', true) : Tools::getHttpHost(true).'contact')); + return $this->display(dirname(__FILE__), 'hookorderconfirmation.tpl'); + } + + public function validate($id_cart, $id_order_state, $amount, $message = '', $secure_key) + { + $this->validateOrder((int)$id_cart, $id_order_state, $amount, $this->displayName, $message, NULL, NULL, true, pSQL($secure_key)); + if ($amount > 0 AND class_exists('PaymentCC')) + { + $pcc = new PaymentCC(); + $order = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'orders WHERE id_cart = '.(int)$secure_cart[0]); + $pcc->id_order = (int)$order['id_order']; + $pcc->id_currency = (int)$order['id_currency']; + $pcc->amount = $amount; + $pcc->transaction_id = Tools::getValue('PAYID'); + $pcc->card_number = Tools::getValue('CARDNO'); + $pcc->card_brand = Tools::getValue('BRAND'); + $pcc->card_expiration = Tools::getValue('ED'); + $pcc->card_holder = Tools::getValue('CN'); + $pcc->add(); + } + } +} + + diff --git a/modules/ogone/ogone.tpl b/modules/ogone/ogone.tpl new file mode 100644 index 000000000..cf6e3961e --- /dev/null +++ b/modules/ogone/ogone.tpl @@ -0,0 +1,43 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + + {l s='Ogone logo' mod='ogone'} + {l s='Pay with Ogone' mod='ogone'}
    {l s='Pay safely and quickly on the next page with IDEAL / Mastercard / Visa / Paypal / Mister Cash / Bancontact.' mod='ogone'}
    +

    + +
     
    +

    +
    +{foreach from=$ogone_params key=ogone_key item=ogone_value} + +{/foreach} +
    + + + + diff --git a/modules/ogone/validation.php b/modules/ogone/validation.php new file mode 100644 index 000000000..4e4823749 --- /dev/null +++ b/modules/ogone/validation.php @@ -0,0 +1,109 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/ogone.php'); + +$ogone = new Ogone(); + +/* First we need to check var presence */ +$neededVars = array('orderID', 'amount', 'currency', 'PM', 'ACCEPTANCE', 'STATUS', 'CARDNO', 'PAYID', 'NCERROR', 'BRAND', 'SHASIGN'); +$params = '

    '.$ogone->l('Received parameters:').'

    '; + +foreach ($neededVars AS $k) + if (!isset($_GET[$k])) + die($ogone->l('Missing parameter:').' '.$k); + else + $params .= $k.' : '.$_GET[$k].'
    '; + +/* Then, load the customer cart and perform some checks */ +$cart = new Cart((int)($_GET['orderID'])); +if (Validate::isLoadedObject($cart)) +{ + /* Fist, check for a valid SHA-1 signature */ + $ogoneParams = array(); + $ignoreKeyList = $ogone->getIgnoreKeyList(); + + foreach ($_GET as $key => $value) + if (strtoupper($key) != 'SHASIGN' AND + $value != '' AND + !in_array($key, $ignoreKeyList)) + $ogoneParams[strtoupper($key)] = $value; + + ksort($ogoneParams); + $shasign = ''; + foreach ($ogoneParams as $key => $value) + $shasign .= strtoupper($key).'='.$value.Configuration::get('OGONE_SHA_OUT'); + $sha1 = strtoupper(sha1($shasign)); + + if ($sha1 == $_GET['SHASIGN']) + { + switch ($_GET['STATUS']) + { + case 1: + /* Real error or payment canceled */ + $ogone->validate((int)$_GET['orderID'], _PS_OS_ERROR_, 0, $_GET['NCERROR'].$params, $_GET['secure_key']); + break; + case 2: + /* Real error - authorization refused */ + $ogone->validate((int)$_GET['orderID'], _PS_OS_ERROR_, 0, $ogone->l('Error (auth. refused)').'
    '.$_GET['NCERROR'].$params, $_GET['secure_key']); + break; + case 5: + case 9: + /* Payment OK */ + $ogone->validate((int)$_GET['orderID'], _PS_OS_PAYMENT_, (float)($_GET['amount']), $ogone->l('Payment authorized / OK').$params, $_GET['secure_key']); + break; + case 6: + case 7: + case 8: + // Payment canceled later + if ($id_order = (int)(Order::getOrderByCartId((int)($_GET['orderID'])))) + { + // Update the amount really paid + $order = new Order($id_order); + $order->total_paid_real = 0; + $order->update(); + + // Send a new message and change the state + $history = new OrderHistory(); + $history->id_order = $id_order; + $history->changeIdOrderState(_PS_OS_ERROR_, $id_order); + $history->addWithemail(true, array()); + } + break; + default: + $ogone->validate((int)$_GET['orderID'], _PS_OS_ERROR_, (float)($_GET['amount']), $ogone->l('Unknown status:').' '.$_GET['STATUS'].$params, $_GET['secure_key']); + } + exit; + } + else + { + $message = $ogone->l('Invalid SHA-1 signature').'
    '.$ogone->l('SHA-1 given:').' '.$_GET['SHASIGN'].'
    '.$ogone->l('SHA-1 calculated:').' '.$sha1.'
    '.$ogone->l('Plain key:').' '.$shasign; + $ogone->validate((int)$_GET['orderID'], _PS_OS_ERROR_, 0, $message.'
    '.$params, $_GET['secure_key']); + } +} + diff --git a/modules/ogone/waiting.tpl b/modules/ogone/waiting.tpl new file mode 100644 index 000000000..0a01a256f --- /dev/null +++ b/modules/ogone/waiting.tpl @@ -0,0 +1,44 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='Please wait while your order is being processed...' mod='ogone'}

    + diff --git a/modules/pagesnotfound/comment.gif b/modules/pagesnotfound/comment.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bc9233ea63c89d52a99494dd0f0735a29a3ec3b GIT binary patch literal 413 zcmV;O0b>4%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/modules/pagesnotfound/config.xml b/modules/pagesnotfound/config.xml new file mode 100755 index 000000000..59aa1c0c5 --- /dev/null +++ b/modules/pagesnotfound/config.xml @@ -0,0 +1,12 @@ + + + pagesnotfound + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/pagesnotfound/de.php b/modules/pagesnotfound/de.php new file mode 100644 index 000000000..8c7fcc5ca --- /dev/null +++ b/modules/pagesnotfound/de.php @@ -0,0 +1,23 @@ +pagesnotfound_251295238bdf7693252f2804c8d3707e'] = 'Nicht gefundene Seiten'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3ae7050d9f8502e9b69448a6db73fab2'] = 'Anzeige der Seiten, die Besucher aufrufen wollten, aber nicht gefunden haben'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_50004bd606668bb842e80f51337b765d'] = 'Nicht gefundene Seiten geleert'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6cb944288ac528fcfd76b20156dddce1'] = 'Sie müssen eine .htaccess-Datei benutzen, um 404-Fehler auf die Seit.php zu leiten'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_193cfc9be3b995831c6af2fea6650e60'] = 'Seite'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_b6f05e5ddde1ec63d992d61144452dfa'] = 'Referrer'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_64d129224a5377b63e9727479ec987d9'] = 'Counter'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d372ffc9065cb7d2ea24df137927d060'] = 'Keine Seiten registriert'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d8847bc418fc4f5a3e37c2e8390bb9ed'] = 'Leere Datenbank'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_254b5e94768b90388cc7002d362351f0'] = 'Leer KEINE Seiten gefunden'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3604249130acf7fda296e16edc996e5b'] = '404-Fehler'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_1c4e115caef0bed8f5ca76da1909f967'] = 'Fehler 404 ist ein HTTP-Fehlercode, der besagt, dass die durch den Benutzer angeforderte Datei nicht gefunden werden kann. In Ihrem Fall bedeutet es, dass einer Ihrer Besucher eine falsche URL-Adresse in das Adressfeld eingegeben hat oder dass Sie oder eine andere Webseite irgendwo einen toten Link haben. Wenn sie verfügbar ist, wird der Referrer angezeigt, so dass Sie die Seite finden können, die den toten Link enthält. Ansonsten bedeutet es meist, dass es ein Direktzugang ist, dass also jemand einen Link, den es nicht mehr gibt, mit einem Bookmark versehen hat.'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_a90083861c168ef985bf70763980aa60'] = 'Wie fängt man diese Fehler ab?'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_535ff57deda0b45d32cb37fd430accc8'] = 'Falls Ihr Provider die .htaccess-Datei unterstützt, können Sie sie im Root-Verzeichnis von PrestaShop erstellen und folgende Zeile einfügen:'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_9cfaa8e935f9e3e65b0959b15b070b15'] = 'Ein Benutzer, der eine Seite aufruft, die es nicht gibt, wird zur Seite weitergeleitet'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_feb436b0dabe28068aa6d866ac47bf0a'] = 'Dieses Modul protokolliert die Zugänge zu dieser Seite: die aufgerufene Seite, den Referrer und die Anzahl der Aufrufe.'; + +?> \ No newline at end of file diff --git a/modules/pagesnotfound/en.php b/modules/pagesnotfound/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/pagesnotfound/en.php @@ -0,0 +1,4 @@ +pagesnotfound_251295238bdf7693252f2804c8d3707e'] = 'Página no encontrada'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3ae7050d9f8502e9b69448a6db73fab2'] = 'Mostrar las páginas solicitadas por sus visitantes pero no encontradas'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_50004bd606668bb842e80f51337b765d'] = 'Páginas no encontradas suprimidas'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6cb944288ac528fcfd76b20156dddce1'] = 'Usted debe utilizar un archivo .htaccess para volver a redirigir error 404 al \\\" de la página; 404.php\\\"'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_193cfc9be3b995831c6af2fea6650e60'] = 'Página'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_b6f05e5ddde1ec63d992d61144452dfa'] = 'Referente'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_64d129224a5377b63e9727479ec987d9'] = 'Contador'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d372ffc9065cb7d2ea24df137927d060'] = 'Páginas no registradas'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d8847bc418fc4f5a3e37c2e8390bb9ed'] = 'Suprimir'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_254b5e94768b90388cc7002d362351f0'] = 'Suprimir TODAS las páginas no encontradas'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3604249130acf7fda296e16edc996e5b'] = 'error 404'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_1c4e115caef0bed8f5ca76da1909f967'] = 'Error 404 es un código HTTP que significa que el archivo pedido por el usuario no se encuentra. En su caso esto significa que uno de sus visitantes introdujo una URL incorrecta en la barra de direcciones o que usted tiene un enlace roto en alguna parte. Cuando está disponible, el referente se muestra, así puede encontrar la página que contiene el enlace roto. Si no, significa generalmente que es un acceso directo que ya no existe.'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_a90083861c168ef985bf70763980aa60'] = '¿Como prevenir estos errores?'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_535ff57deda0b45d32cb37fd430accc8'] = 'Si su servidor soporta el archivo .htaccess, puede crear uno en el directorio raíz de PrestaShop e insertar la línea siguiente:'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_9cfaa8e935f9e3e65b0959b15b070b15'] = 'El usuario que busca una página que no existe será reenviado a la página'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_feb436b0dabe28068aa6d866ac47bf0a'] = 'Este módulo registra los accesos a esta página: la página requerida, la referencia y el número de veces que se visitó.'; diff --git a/modules/pagesnotfound/fr.php b/modules/pagesnotfound/fr.php new file mode 100644 index 000000000..8cfe72302 --- /dev/null +++ b/modules/pagesnotfound/fr.php @@ -0,0 +1,21 @@ +pagesnotfound_251295238bdf7693252f2804c8d3707e'] = 'Pages introuvables'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3ae7050d9f8502e9b69448a6db73fab2'] = 'Affiche les pages demandées mais qui n\'existent pas'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_50004bd606668bb842e80f51337b765d'] = 'Pages introuvables supprimées'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6cb944288ac528fcfd76b20156dddce1'] = 'Vous devez utiliser un fichier .htaccess redirigeant les erreurs 404 vers la page \"404.php\"'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_193cfc9be3b995831c6af2fea6650e60'] = 'Page'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_b6f05e5ddde1ec63d992d61144452dfa'] = 'Origine'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_64d129224a5377b63e9727479ec987d9'] = 'Compteur'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d372ffc9065cb7d2ea24df137927d060'] = 'Aucune page enregistrée'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d8847bc418fc4f5a3e37c2e8390bb9ed'] = 'Suppression'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_254b5e94768b90388cc7002d362351f0'] = 'Supprimer toutes les pages introuvables'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3604249130acf7fda296e16edc996e5b'] = 'Erreurs 404'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_1c4e115caef0bed8f5ca76da1909f967'] = 'Une erreur 404 est un code d\'erreur HTTP signifiant que le fichier demandé par l\'utilisateur est introuvable. Dans votre cas cela signifie qu\'un de vos visiteurs a tapé une mauvaise URL dans la barre d\'adresse ou que vous ou un autre site contient un lien mort quelque part. Quand elle est disponible, la page source est affichée afin de vous permettre de trouver ce lien mort. Dans le cas contraire, c\'est probablement un accès direct, ce qui peut également vouloir dire qu\'un utilisateur a mis en favoris une page qui n\'existe plus.'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_a90083861c168ef985bf70763980aa60'] = 'Comment attraper ces erreurs ?'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_535ff57deda0b45d32cb37fd430accc8'] = 'Si votre hébergeur supporte les fichiers .htaccess, vous pouvez en créer un à la racine de PrestaShop et insérer la ligne suivante :'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_9cfaa8e935f9e3e65b0959b15b070b15'] = 'Un utilisateur qui demande une page non existante sera redirigé vers la page'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_feb436b0dabe28068aa6d866ac47bf0a'] = 'Ce module enregistre les accès à cette page avec : la page demandée initialement, la page source et le nombre de fois que c\'est arrivé.'; diff --git a/modules/pagesnotfound/it.php b/modules/pagesnotfound/it.php new file mode 100644 index 000000000..a7343d79c --- /dev/null +++ b/modules/pagesnotfound/it.php @@ -0,0 +1,23 @@ +pagesnotfound_251295238bdf7693252f2804c8d3707e'] = 'Pagine non trovate'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3ae7050d9f8502e9b69448a6db73fab2'] = 'Visualizza le pagine richieste dai visitatori ma non trovate'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_50004bd606668bb842e80f51337b765d'] = 'Pagine non trovate svuotate'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6cb944288ac528fcfd76b20156dddce1'] = 'È necessario utilizzare un file. Htaccess per reindirizzare gli errori 404 alla pagina \"404.php\"'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_193cfc9be3b995831c6af2fea6650e60'] = 'Pagina'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_b6f05e5ddde1ec63d992d61144452dfa'] = 'Referente'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_64d129224a5377b63e9727479ec987d9'] = 'Contatore'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d372ffc9065cb7d2ea24df137927d060'] = 'Nessuna pagina registrata'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_d8847bc418fc4f5a3e37c2e8390bb9ed'] = 'database vuoto'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_254b5e94768b90388cc7002d362351f0'] = 'Elimina TUTTE le pagine non trovate'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_3604249130acf7fda296e16edc996e5b'] = 'errori 404 '; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_1c4e115caef0bed8f5ca76da1909f967'] = 'Un errore 404 è un codice di errore HTTP che significa che il file richiesto dall\'utente non può essere trovato. Nel tuo caso significa che uno dei tuoi visitatori ha inserito un URL sbagliato nella barra degli indirizzi o che tu o un altro sito web ha un link morto da qualche parte. Quando è disponibile, il referente è mostrato in modo da poter trovare la pagina che contiene il link morti. Altrimenti in genere significa che si tratta di un accesso diretto, così forse qualcuno ha segnato un link che non esiste più.'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_a90083861c168ef985bf70763980aa60'] = 'Come individuare questi errori?'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_535ff57deda0b45d32cb37fd430accc8'] = 'Se il tuo provider supporta il file htaccess, è possibile crearlo nella directory principale di PrestaShop e inserirvi dentro la seguente riga:'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_9cfaa8e935f9e3e65b0959b15b070b15'] = 'Un utente che richiede una pagina che non esiste verrà reindirizzato alla pagina'; +$_MODULE['<{pagesnotfound}prestashop>pagesnotfound_feb436b0dabe28068aa6d866ac47bf0a'] = 'Questo modulo registra gli accessi a questa pagina: la pagina richiesta, la provenienza e il numero di volte che si è verificato.'; + +?> \ No newline at end of file diff --git a/modules/pagesnotfound/logo.gif b/modules/pagesnotfound/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3cbb5dfb45a999ea0ad9003b5aa53dcf9ec7b20 GIT binary patch literal 898 zcmZ?wbhEHb6krfw_|5EBI#)}W~M>>Qw?N|gZCb;)9>3co-QMlm5Lx2^&UO87Vp52@_$+7%3$GOq2ZJ>Ldmb%# literal 0 HcmV?d00001 diff --git a/modules/pagesnotfound/pagesnotfound.php b/modules/pagesnotfound/pagesnotfound.php new file mode 100644 index 000000000..45b28c7e9 --- /dev/null +++ b/modules/pagesnotfound/pagesnotfound.php @@ -0,0 +1,168 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Pagesnotfound extends Module +{ + private $_html = ''; + + function __construct() + { + $this->name = 'pagesnotfound'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Pages not found'); + $this->description = $this->l('Display the pages requested by your visitors but not found.'); + } + + function install() + { + if (!parent::install() OR !$this->registerHook('top') OR !$this->registerHook('AdminStatsModules')) + return false; + return Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'pagenotfound` ( + id_pagenotfound INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_shop INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + id_group_shop INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + request_uri VARCHAR(256) NOT NULL, + http_referer VARCHAR(256) NOT NULL, + date_add DATETIME NOT NULL, + PRIMARY KEY(id_pagenotfound), + INDEX (`date_add`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'); + } + + function uninstall() + { + return (parent::uninstall() AND Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'pagenotfound`')); + } + + private function getPages() + { + $sql = 'SELECT http_referer, request_uri, COUNT(*) as nb + FROM `'._DB_PREFIX_.'pagenotfound` + WHERE date_add BETWEEN '.ModuleGraph::getDateBetween() + .$this->sqlShopRestriction(). + 'GROUP BY http_referer, request_uri'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + $pages = array(); + foreach ($result as $row) + { + $row['http_referer'] = parse_url($row['http_referer'], PHP_URL_HOST).parse_url($row['http_referer'], PHP_URL_PATH); + if (!isset($row['http_referer']) OR empty($row['http_referer'])) + $row['http_referer'] = '--'; + if (!isset($pages[$row['request_uri']])) + $pages[$row['request_uri']] = array('nb' => 0); + $pages[$row['request_uri']][$row['http_referer']] = $row['nb']; + $pages[$row['request_uri']]['nb'] += $row['nb']; + } + uasort($pages, 'pnfSort'); + return $pages; + } + + function hookAdminStatsModules() + { + if (Tools::isSubmit('submitTruncatePNF')) + { + Db::getInstance()->Execute('TRUNCATE `'._DB_PREFIX_.'pagenotfound`'); + $this->_html .= '
    '.$this->l('Pages not found has been emptied.').'
    '; + } + + $this->_html .= '
    '.$this->displayName.''; + if (!file_exists(dirname(__FILE__).'/../../.htaccess')) + $this->_html .= '
    '.$this->l('You must use a .htaccess file to redirect 404 errors to the page "404.php"').'
    '; + + $pages = $this->getPages(); + if (sizeof($pages)) + { + $this->_html .= ' + + + + + + '; + foreach ($pages as $ru => $hrs) + foreach ($hrs as $hr => $counter) + if ($hr != 'nb') + $this->_html .= ' + + + + + '; + $this->_html .= ' +
    '.$this->l('Page').''.$this->l('Referrer').''.$this->l('Counter').'
    '.wordwrap($ru, 30, '
    ', true).'
    '.wordwrap($hr, 40, '
    ', true).'
    '.$counter.'
    '; + } + else + $this->_html .= '
    '.$this->l('No pages registered').'
    '; + + $this->_html .= '
    '; + if (sizeof($pages)) + $this->_html .= '
     
    +
    '.$this->l('Empty database').' +
    +
    '; + $this->_html .= '
     
    +
    '.$this->l('Guide').' +

    '.$this->l('404 errors').'

    +

    '.$this->l('A 404 error is an HTTP error code which means that the file requested by the user cannot be found. In your case it means that one of your visitors entered a wrong URL in the address bar or that you or another website has a dead link. When it is available, the referrer is shown so you can find the page which contains the dead link. If not, it means generally that it is a direct access, so someone may have bookmarked a link which doesn\'t exist anymore.').'

    +

    '.$this->l('How to catch these errors?').'

    +

    '.$this->l('If your webhost supports the .htaccess file, you can create it in the root directory of PrestaShop and insert the following line inside:').' ErrorDocument 404 '.__PS_BASE_URI__.'404.php. '.$this->l('A user requesting a page which doesn\'t exist will be redirected to the page.').' '.__PS_BASE_URI__.'404.php. '.$this->l('This module logs the accesses to this page: the page requested, the referrer and the number of times that it occurred.').'


    +
    '; + + return $this->_html; + } + + function hookTop($params) + { + if (strstr($_SERVER['REQUEST_URI'], '404.php') AND isset($_SERVER['REDIRECT_URL'])) + $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL']; + if (!Validate::isUrl($request_uri = $_SERVER['REQUEST_URI']) OR strstr($_SERVER['REQUEST_URI'], '-admin404')) + return; + if (strstr($_SERVER['PHP_SELF'], '404.php') AND !strstr($_SERVER['REQUEST_URI'], '404.php')) + { + $http_referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; + if (empty($http_referer) OR Validate::isAbsoluteUrl($http_referer)) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'pagenotfound` (`request_uri`, `http_referer`, `date_add`, `id_shop`, `id_group_shop`) VALUES (\''.pSQL($request_uri).'\', \''.pSQL($http_referer).'\', NOW(), '.$this->shopID.', '.$this->shopGroupID.')'); + } + } +} + +function pnfSort($a, $b) { + if ($a['nb'] == $b['nb']) + return 0; + return ($a['nb'] > $b['nb']) ? -1 : 1; +} \ No newline at end of file diff --git a/modules/paypal/about.php b/modules/paypal/about.php new file mode 100644 index 000000000..98e765295 --- /dev/null +++ b/modules/paypal/about.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); + +include(dirname(__FILE__).'/../../header.php'); + +$smarty->assign('iso_code', Tools::strtolower(Language::getIsoById($cookie->id_lang ? (int)$cookie->id_lang : Configuration::get('PS_LANG_DEFAULT')))); + +echo Module::display(dirname(__FILE__).'/paypal', 'about.tpl'); + +include(dirname(__FILE__).'/../../footer.php'); \ No newline at end of file diff --git a/modules/paypal/about.tpl b/modules/paypal/about.tpl new file mode 100644 index 000000000..593a2d310 --- /dev/null +++ b/modules/paypal/about.tpl @@ -0,0 +1,42 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='What Is PayPal?' mod='paypal'}

    + +
    +

    {l s='PayPal, the trusted leader in online payments, enables buyers and businesses to send and receive money online. PayPal has over 100 million member accounts in 190 countries and regions. It\'s accepted by merchants everywhere, both on and off eBay.' mod='paypal'}

    +

    {l s='Is it safe to use?' mod='paypal'}

    +

    {l s='PayPal helps protect your credit card information with industry-leading security and fraud prevention systems. When you use PayPal, your financial information is never shared with the merchant.' mod='paypal'}

    +

    {l s='Why use PayPal?' mod='paypal'}

    +

    +

      +
    • {l s='Make purchases or send money with PayPal - it\'s free' mod='paypal'}
    • +
    • {l s='Shop and pay conveniently by saving your information with PayPal' mod='paypal'}
    • +
    • {l s='PayPal is accepted by millions of businesses worldwide and is the preferred payment method on eBay' mod='paypal'}
    • +
    +

    +

    {l s='Start using PayPal today!' mod='paypal'}

    +
    \ No newline at end of file diff --git a/modules/paypal/api/paypalconnect.php b/modules/paypal/api/paypalconnect.php new file mode 100644 index 000000000..f45608eec --- /dev/null +++ b/modules/paypal/api/paypalconnect.php @@ -0,0 +1,93 @@ +_logs[] = $this->l('Making new connection to').' \''.$host.$script.'\''; + if (function_exists('curl_exec')) + $return = $this->_connectByCURL($host.$script, $body); + if (isset($return) AND $return) + return $return; + $tmp = $this->_connectByFSOCK($host, $script, $body); + if (!$simple_mode || !preg_match('/[A-Z]+=/', $tmp, $result)) + return $tmp; + $pos = strpos($tmp, $result[0]); + $body = substr($tmp, $pos); + return $body; + } + + public function getLogs() + { + return $this->_logs; + } + + /************************************************************/ + /********************** CONNECT METHODS *********************/ + /************************************************************/ + + private function _connectByCURL($url, $body) + { + $ch = @curl_init(); + if (!$ch) + $this->_logs[] = $this->l('Connect failed with CURL method'); + else + { + $this->_logs[] = $this->l('Connect with CURL method successful'); + $this->_logs[] = ''.$this->l('Sending this params:').''; + $this->_logs[] = $body; + @curl_setopt($ch, CURLOPT_URL, 'https://'.$url); + @curl_setopt($ch, CURLOPT_POST, true); + @curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + @curl_setopt($ch, CURLOPT_HEADER, false); + @curl_setopt($ch, CURLOPT_TIMEOUT, 30); + @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + @curl_setopt($ch, CURLOPT_VERBOSE, true); + $result = @curl_exec($ch); + if (!$result) + $this->_logs[] = $this->l('Send with CURL method failed ! Error:').' '.curl_error($ch); + else + $this->_logs[] = $this->l('Send with CURL method successful'); + @curl_close($ch); + } + return (isset($result) ? $result : false); + } + + private function _connectByFSOCK($host, $script, $body) + { + $fp = @fsockopen('ssl://'.$host, 443, $errno, $errstr, 4); + if (!$fp) + $this->_logs[] = $this->l('Connect failed with fsockopen method'); + else + { + $header = $this->_makeHeader($host, $script, strlen($body)); + $this->_logs[] = $this->l('Connect with fsockopen method successful'); + $this->_logs[] = $this->l('Sending this params:').' '.$header.$body; + @fputs($fp, $header.$body); + $tmp = ''; + while (!feof($fp)) + $tmp .= trim(fgets($fp, 1024)); + fclose($fp); + $result = $tmp; + if (!$result) + $this->_logs[] = $this->l('Send with fsockopen method failed !'); + else + $this->_logs[] = $this->l('Send with fsockopen method successful'); + } + return (isset($result) ? $result : false); + } + + private function _makeHeader($host, $script, $lenght) + { + $header = 'POST '.strval($script).' HTTP/1.0'."\r\n" . + 'Host: '.strval($host)."\r\n". + 'Content-Type: application/x-www-form-urlencoded'."\r\n". + 'Content-Length: '.(int)($lenght)."\r\n". + 'Connection: close'."\r\n\r\n"; + return $header; + } +} diff --git a/modules/paypal/api/paypallib.php b/modules/paypal/api/paypallib.php new file mode 100644 index 000000000..91210325a --- /dev/null +++ b/modules/paypal/api/paypallib.php @@ -0,0 +1,63 @@ +_logs; + } + + public function makeCall($host, $script, $methodName, $string) + { + // Making request string + $request = 'METHOD='.urlencode($methodName).'&VERSION='.urlencode(PAYPAL_API_VERSION); + $request .= '&PWD='.urlencode(Configuration::get('PAYPAL_API_PASSWORD')).'&USER='.urlencode(Configuration::get('PAYPAL_API_USER')); + $request .= '&SIGNATURE='.urlencode(Configuration::get('PAYPAL_API_SIGNATURE')).$string; + + // Making connection + include_once(_PS_MODULE_DIR_.'paypal/api/paypalconnect.php'); + $ppConnect = new PaypalConnect(); + $result = $ppConnect->makeConnection($host, $script, $request, true); + $this->_logs = $ppConnect->getLogs(); + + // Formating response value + $response = explode('&', $result); + foreach ($response as $k => $res) + { + $tmp = explode('=', $res); + if (!isset($tmp[1])) + $response[$tmp[0]] = urldecode($tmp[0]); + else + { + $response[$tmp[0]] = urldecode($tmp[1]); + unset($response[$k]); + } + } + if (!Configuration::get('PAYPAL_MODE_DEBUG')) + $this->_logs = array(); + $toExclude = array('TOKEN', 'SUCCESSPAGEREDIRECTREQUESTED', 'VERSION', 'BUILD', 'ACK', 'CORRELATIONID'); + $this->_logs[] = ''.$this->l('PayPal response:').''; + foreach ($response as $k => $res) + { + if (!Configuration::get('PAYPAL_MODE_DEBUG') AND in_array($k, $toExclude)) + continue; + $this->_logs[] = $k.' -> '.$res; + } + return $response; + } + + public function makeSimpleCall($host, $script, $request) + { + // Making connection + include_once(_PS_MODULE_DIR_.'paypal/api/paypalconnect.php'); + $ppConnect = new PaypalConnect(); + $result = $ppConnect->makeConnection($host, $script, $request); + $this->_logs = $ppConnect->getLogs(); + return $result; + } +} + diff --git a/modules/paypal/column.tpl b/modules/paypal/column.tpl new file mode 100644 index 000000000..52d54867f --- /dev/null +++ b/modules/paypal/column.tpl @@ -0,0 +1,29 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
    +

    PayPal

    +
    \ No newline at end of file diff --git a/modules/paypal/config.xml b/modules/paypal/config.xml new file mode 100755 index 000000000..e60150f26 --- /dev/null +++ b/modules/paypal/config.xml @@ -0,0 +1,13 @@ + + + paypal + + + + + + Are you sure you want to delete your details? + 1 + 1 + + \ No newline at end of file diff --git a/modules/paypal/confirm.tpl b/modules/paypal/confirm.tpl new file mode 100644 index 000000000..a794d0f22 --- /dev/null +++ b/modules/paypal/confirm.tpl @@ -0,0 +1,66 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Your shopping cart' mod='paypal'}{$navigationPipe}{l s='PayPal' mod='paypal'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

    {l s='Order summary' mod='paypal'}

    + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +

    {l s='PayPal payment' mod='paypal'}

    +
    + {if isset($ppToken)}{/if} + {if isset($payerID)}{/if} +

    + {l s='PayPal' mod='paypal'} +
    {l s='You have chosen to pay with PayPal.' mod='paypal'} +

    + {l s='Here is a short summary of your order:' mod='paypal'} +

    +

    + - {l s='The total amount of your order is' mod='paypal'} + {convertPriceWithCurrency price=$total currency=$currency} {if $use_taxes == 1}{l s='(tax incl.)' mod='paypal'}{/if} +

    +

    + - {l s='We accept the following currency to be sent by PayPal:' mod='paypal'} {$currency->name} + +

    +

    + {l s='Please confirm your order by clicking \'I confirm my order\'' mod='paypal'}. +

    +

    + {if isset($paypalError)} + {l s='Return' mod='paypal'}

    + {l s='Session expired, please go back and try again' mod='paypal'} + {else} + {l s='Other payment methods' mod='paypal'} + + {/if} +

    +
    + diff --git a/modules/paypal/confirmation.tpl b/modules/paypal/confirmation.tpl new file mode 100644 index 000000000..1ba79647f --- /dev/null +++ b/modules/paypal/confirmation.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='Your order on' mod='paypal'} {$shop_name} {l s='is complete.' mod='paypal'} +

    + {l s='You have chosen the PayPal method.' mod='paypal'} +

    {l s='Your order will be sent very soon.' mod='paypal'} +

    {l s='For any questions or for further information, please contact our' mod='paypal'} {l s='customer support' mod='paypal'}. +

    diff --git a/modules/paypal/de.php b/modules/paypal/de.php new file mode 100644 index 000000000..f66b2a550 --- /dev/null +++ b/modules/paypal/de.php @@ -0,0 +1,227 @@ +authentication_cd42c6dd6cc4cd65cb5e13b729050469'] = 'Überprüfen Sie Ihre Informationen'; +$_MODULE['<{paypal}prestashop>authentication_6335a00a08fde0fbb8f6d6630cdadd92'] = 'Ihre persönlichen Daten'; +$_MODULE['<{paypal}prestashop>authentication_b78a3223503896721cca1303f776159b'] = 'Titel'; +$_MODULE['<{paypal}prestashop>authentication_127469a6b4253ebb77adccc0dd48461e'] = 'Herr'; +$_MODULE['<{paypal}prestashop>authentication_29e32764941c30d1bb41c601014fbdbd'] = 'Frau'; +$_MODULE['<{paypal}prestashop>authentication_20db0bfeecd8fe60533206a2b5e9891a'] = 'Vorname'; +$_MODULE['<{paypal}prestashop>authentication_8d3f5eff9c40ee315d452392bed5309b'] = 'Nachname'; +$_MODULE['<{paypal}prestashop>authentication_1e884e3078d9978e216a027ecd57fb34'] = 'E-Mail'; +$_MODULE['<{paypal}prestashop>authentication_dc647eb65e6711e155375218212b3964'] = 'Kennwort'; +$_MODULE['<{paypal}prestashop>authentication_bf2957630c4209f61a388a08c2154915'] = '(5 Zeichen min.)'; +$_MODULE['<{paypal}prestashop>authentication_aac772216aecbeca0e86d06671fe985a'] = 'Geburtstag'; +$_MODULE['<{paypal}prestashop>authentication_86f5978d9b80124f509bdb71786e929e'] = 'Januar'; +$_MODULE['<{paypal}prestashop>authentication_659e59f062c75f81259d22786d6c44aa'] = 'Februar'; +$_MODULE['<{paypal}prestashop>authentication_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'März'; +$_MODULE['<{paypal}prestashop>authentication_3fcf026bbfffb63fb24b8de9d0446949'] = 'April'; +$_MODULE['<{paypal}prestashop>authentication_195fbb57ffe7449796d23466085ce6d8'] = 'Mai'; +$_MODULE['<{paypal}prestashop>authentication_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Juni'; +$_MODULE['<{paypal}prestashop>authentication_1b539f6f34e8503c97f6d3421346b63c'] = 'Juli'; +$_MODULE['<{paypal}prestashop>authentication_41ba70891fb6f39327d8ccb9b1dafb84'] = 'August'; +$_MODULE['<{paypal}prestashop>authentication_cc5d90569e1c8313c2b1c2aab1401174'] = 'September'; +$_MODULE['<{paypal}prestashop>authentication_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Oktober'; +$_MODULE['<{paypal}prestashop>authentication_7e823b37564da492ca1629b4732289a8'] = 'November'; +$_MODULE['<{paypal}prestashop>authentication_82331503174acbae012b2004f6431fa5'] = 'Dezember'; +$_MODULE['<{paypal}prestashop>authentication_6f6162d3a052bb330e9c60285c74c6c9'] = 'Unseren Newsletter abonnieren'; +$_MODULE['<{paypal}prestashop>authentication_ac135c86084a47630c9eadb4edd5ef75'] = 'Sonderangebote unserer Partner erhalten'; +$_MODULE['<{paypal}prestashop>authentication_455175f3f5be6306247babb349c0515a'] = 'Ihre Adresse'; +$_MODULE['<{paypal}prestashop>authentication_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Firma'; +$_MODULE['<{paypal}prestashop>authentication_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{paypal}prestashop>authentication_783cb853aae6984e51583b3bb80c09d2'] = 'Adresse 2'; +$_MODULE['<{paypal}prestashop>authentication_9b514b51d03075005814a33edc74c958'] = 'PLZ '; +$_MODULE['<{paypal}prestashop>authentication_57d056ed0984166336b7879c2af3657f'] = 'Stadt'; +$_MODULE['<{paypal}prestashop>authentication_59716c97497eb9694541f7c3d37b1a4d'] = 'Land'; +$_MODULE['<{paypal}prestashop>authentication_46a2a41cc6e552044816a2d04634545d'] = 'Staat'; +$_MODULE['<{paypal}prestashop>authentication_0f68b904e33d9ac04605aecc958bcf52'] = 'Weitere Informationen'; +$_MODULE['<{paypal}prestashop>authentication_fe66abce284ec8589e7d791185b5c442'] = 'Telefon Festnetz'; +$_MODULE['<{paypal}prestashop>authentication_41c2fff4867cc204120f001e7af20f7a'] = 'Telefon mobil'; +$_MODULE['<{paypal}prestashop>authentication_6c1c4d5a22e3d6ed8385e7287233396f'] = 'Tragen Sie einen Adresstitel ein für spätere Referenz'; +$_MODULE['<{paypal}prestashop>authentication_ae7bdef7fe2bbbbf02c11e92c5fceb40'] = 'Meine Adresse'; +$_MODULE['<{paypal}prestashop>authentication_a0bfb8e59e6c13fc8d990781f77694fe'] = 'Weiter'; +$_MODULE['<{paypal}prestashop>authentication_19f823c6453c2b1ffd09cb715214813d'] = 'Pflichtfeld'; +$_MODULE['<{paypal}prestashop>login_b40ad46c25c153a3d2fde078c0e1b0f8'] = 'Bitte loggen Sie sich ein'; +$_MODULE['<{paypal}prestashop>login_abc57016a138dea055e0d8be6358f84e'] = 'Diese E-Mail wurde bereits registriert, bitte melden Sie sich an!'; +$_MODULE['<{paypal}prestashop>login_8b5dd64ab8d0b8158906796b53a200e2'] = 'E-Mail-Adresse'; +$_MODULE['<{paypal}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Kennwort'; +$_MODULE['<{paypal}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Anmelden'; +$_MODULE['<{paypal}prestashop>login_01a569ddc6cf67ddec2a683f0a5f5956'] = 'Kennwort vergessen?'; +$_MODULE['<{paypal}prestashop>shopping_cart_aa91004934e1abdb620b5d0f0c18681c'] = 'Bezahlen mit PayPal Express Checkout'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Bezahlen mit PayPal'; +$_MODULE['<{paypal}prestashop>paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Akzeptierte Zahlungen per Kreditkarte (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) mit PayPal'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Sie sind sicher, dass Sie Ihre Daten löschen möchten?'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Sie nutzenzur Zeit die Standard-PayPal-Mail-Adresse, Sie müssen Ihre eigene E-Mail-Adresse verwenden'; +$_MODULE['<{paypal}prestashop>paypal_a706f7e37a81dc235d41bbeb6fae92aa'] = 'Keine gültige Zahlungsmethode ausgewählt'; +$_MODULE['<{paypal}prestashop>paypal_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Geldbetrag wurde überwiesen'; +$_MODULE['<{paypal}prestashop>paypal_d238649ac5ec14afc894fad36c0b50fc'] = 'Die Anfrage nach Geldüberweisung war nicht erfolgreich, bitte lesen Sie die Protokollnachricht!'; +$_MODULE['<{paypal}prestashop>paypal_05b998de2c4fb46a7bdd37bd378b81d9'] = 'Die Bestätigung ist erfolgt, siehe Protokollnachricht!'; +$_MODULE['<{paypal}prestashop>paypal_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Der Betrag wurde überwiesen'; +$_MODULE['<{paypal}prestashop>paypal_cba030a50c8a99c7e224adbe1cf58544'] = 'Die Anfrage nach Geldüberweisung war nicht erfolgreich, bitte lesen Sie die Protokollnachricht!'; +$_MODULE['<{paypal}prestashop>paypal_b630aa9b5e25da971949cae62dd109aa'] = 'PayPal Validation'; +$_MODULE['<{paypal}prestashop>paypal_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Information:'; +$_MODULE['<{paypal}prestashop>paypal_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Ausstehender Einzug- Kein Versand'; +$_MODULE['<{paypal}prestashop>paypal_c14eb95a724174f336b8ffdd98ef2f35'] = 'Ausstehende Zahlung - Kein Versand'; +$_MODULE['<{paypal}prestashop>paypal_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Zahlungsstatus erhalten'; +$_MODULE['<{paypal}prestashop>paypal_81e826adb70e2e6b189c2eef739d52d4'] = 'PayPal Capture'; +$_MODULE['<{paypal}prestashop>paypal_6f1f179632d90b3f71f5c83a1137e302'] = 'Einzugsbereite Geldbeträge vor Versand'; +$_MODULE['<{paypal}prestashop>paypal_3a81739e892c77e29ff4718c9dd92a34'] = 'Geld einziehen'; +$_MODULE['<{paypal}prestashop>paypal_8ba079f305b81b172792bc0469b6a690'] = 'PayPal Refund'; +$_MODULE['<{paypal}prestashop>paypal_016e1f278eccd700eaf33f74a501d050'] = 'Zahlung akzeptiert'; +$_MODULE['<{paypal}prestashop>paypal_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Wenn Sie ein Produkt zurückzahlen, wird eine teilweise Rückerstattung vorgenommen, bis Sie die Option \"Gutschein generieren\" wählen'; +$_MODULE['<{paypal}prestashop>paypal_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Rückerstattung der gesamten Transaktion'; +$_MODULE['<{paypal}prestashop>paypal_729a51874fe901b092899e9e8b31c97a'] = 'Sind Sie sicher?'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Produktergebnisse löschen'; +$_MODULE['<{paypal}prestashop>paypal_e5970a9962bc4cacb5adb408418a9f0c'] = 'Zulassung zu PayPal fehlgeschlagen'; +$_MODULE['<{paypal}prestashop>paypal_be6575076ac9b651d870a59970e7cd54'] = 'PayPal bestätigt Fehler'; +$_MODULE['<{paypal}prestashop>paypal_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'Der von PayPal vergebene Token ist nicht der gleiche wie der Cookie Token'; +$_MODULE['<{paypal}prestashop>paypal_33ac76215cb67f61f891cc3113e55997'] = 'Genehmigung von PayPal für Zahlungsaufschub erteilt '; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Bestellung mit PayPal abgeschlossen!'; +$_MODULE['<{paypal}prestashop>paypal_d89a00d4ba79c176bb0fc17f12d42a18'] = 'Paypal-Schlüssel \'mc_gross\' nicht angegeben, kann gezahlten Betrag nicht kontrollieren.'; +$_MODULE['<{paypal}prestashop>paypal_202a2860b19003ce53966a8780bb448b'] = 'Paypal-Schlüssel \"payment_status\" nicht angegeben, kann Zahlungsgültigkeit nicht kontrollieren.'; +$_MODULE['<{paypal}prestashop>paypal_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Zahlung:'; +$_MODULE['<{paypal}prestashop>paypal_23703f7d045936080031477df1fc237b'] = 'Paypal Schlüssel \'custom\' nicht angegeben, kann keine Verbindung zum Warenkorb herstellen'; +$_MODULE['<{paypal}prestashop>paypal_760c3c2ccfadeee26c80c7b39462cf1d'] = 'Paypal-Schlüssel \'txn_id\' nicht angegeben, Transaktion unbekannt'; +$_MODULE['<{paypal}prestashop>paypal_7faa8448e059fb97d60d4a4b15634d98'] = 'Paypal-Schlüssel \'mc_currency\' nicht angegeben, Währung unbekannt'; +$_MODULE['<{paypal}prestashop>paypal_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Warenkorb nicht gefunden'; +$_MODULE['<{paypal}prestashop>paypal_0617900b1aff826081d07f5a3e2e7cd0'] = 'Bestellauftrag wurde bereits gestellt'; +$_MODULE['<{paypal}prestashop>paypal_f5209b3301a46f3057ffbf34d903e205'] = 'PayPal-Transaktion-ID:'; +$_MODULE['<{paypal}prestashop>paypal_7b19e875ff64b09d80ee05dcc84b9975'] = 'Die PayPal-Transaktion konnte nicht VERIFIZIERT werden.'; +$_MODULE['<{paypal}prestashop>paypal_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problem beim Verbinden mit dem PayPal-Server.'; +$_MODULE['<{paypal}prestashop>paypal_76ee8dc73701e846f7bccdf98dae079b'] = 'Keine Kommunikationsmittel zur Verfügung.'; +$_MODULE['<{paypal}prestashop>paypal_8358ec19f397d4cdd632688d4f79e535'] = 'Fehler in der Überprüfung (mit fsockopen). Zurückgegeben:'; +$_MODULE['<{paypal}prestashop>paypal_eca77e208634d52703b07672abbf16ec'] = 'Fehler in der Überprüfung (mit cURL). Zurückgegeben:'; +$_MODULE['<{paypal}prestashop>paypal_f7799c2ded739cf3c3e9babffc5f315b'] = 'Verbindung über cURL fehlgeschlagen'; +$_MODULE['<{paypal}prestashop>paypal_c640d8a3c2c34f79061a0bbe50e8420c'] = 'Bitte warten, Umleitung zu Paypal ... Danke.'; +$_MODULE['<{paypal}prestashop>paypal_ea4788705e6873b424c65e91c2846b19'] = 'Abbrechen'; +$_MODULE['<{paypal}prestashop>paypal_dae3b417a0fc4a49e851ce55d6d49551'] = 'Mein Warenkorb'; +$_MODULE['<{paypal}prestashop>paypal_9bfa2332c9c7198ac9774c6710bf76c4'] = 'Zurück zum Shop'; +$_MODULE['<{paypal}prestashop>paypal_d56249aa9643851a94bd3ef3da309d35'] = 'Paypal Fehler: (ungültige oder nicht definierte Geschäftskonto-E-Mail)'; +$_MODULE['<{paypal}prestashop>paypal_e7ac6f09a936201890de4094b1ee4e50'] = 'Paypal Fehler: (ungültige Adresse oder ungültiger Kunde)'; +$_MODULE['<{paypal}prestashop>paypal_49b21ad0d38942f635877e7bbc5d7a1e'] = 'Lösung'; +$_MODULE['<{paypal}prestashop>paypal_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{paypal}prestashop>paypal_9c81c7e49db6edc5ea243dbadfb28c2a'] = 'Logos und Benutzereinstellung'; +$_MODULE['<{paypal}prestashop>paypal_9d51eb502e6f46830cb97f53d761c212'] = 'Wählen Sie eine Lösung:'; +$_MODULE['<{paypal}prestashop>paypal_0234fed198d74928f2864c574a9a89c1'] = 'Zahlungen mit Kreditkarten'; +$_MODULE['<{paypal}prestashop>paypal_627fabff813cafcd9313ea0037c0125b'] = 'CB, Visa, Mastercard und Paypal-Konto'; +$_MODULE['<{paypal}prestashop>paypal_ec2d6b2d2cfb9eadee1c15f3d579252d'] = 'Zahlungen mit Karten + Verkäuferschutz'; +$_MODULE['<{paypal}prestashop>paypal_7d8bea00c8ed9c1cdf9da980bd69c85a'] = '(PayPal Integral Evolution, Monatsabonnement)'; +$_MODULE['<{paypal}prestashop>paypal_457e5c04d6690cc6a72412c792c504d9'] = 'Zahlungen durch'; +$_MODULE['<{paypal}prestashop>paypal_5d4023dba17f36ce69357d25cbe4fbad'] = 'PayPal-Konto'; +$_MODULE['<{paypal}prestashop>paypal_e574ea35c565033a741efb1925b5f188'] = '(PayPal-Option +)'; +$_MODULE['<{paypal}prestashop>paypal_fdcd0dc7120ef9d14417c968e0a16e97'] = 'Aktivierung an Bedingungen geknüpft'; +$_MODULE['<{paypal}prestashop>paypal_89e92ec866e363e88f12a7372d682c5c'] = 'Klicken Sie hier, um sich anzumelden'; +$_MODULE['<{paypal}prestashop>paypal_cd1bd0b0d3d22ede663f17df5194b3fe'] = 'Option:'; +$_MODULE['<{paypal}prestashop>paypal_28882d910d7b5311aa0a9d5094e11caf'] = 'PayPal Express: Zahlung in 2 Klicks'; +$_MODULE['<{paypal}prestashop>paypal_22afd6155cd35727f6ed449aef994731'] = 'Mit dem PayPal-Konto direkt aus der Warenkorb-Seite'; +$_MODULE['<{paypal}prestashop>paypal_4037fe43ff7b926e093805e2931c0f77'] = 'Nur Debuggen:'; +$_MODULE['<{paypal}prestashop>paypal_7c8ab5ce5bf608dd41cf3e8f2312451c'] = 'Lange Protokollnachricht aktivieren'; +$_MODULE['<{paypal}prestashop>paypal_d4dccb8ca2dac4e53c01bd9954755332'] = 'Speichern Sie die Einstellungen'; +$_MODULE['<{paypal}prestashop>paypal_7a262cb0d3d917313c8ba12f996fe83c'] = 'Wichtig:'; +$_MODULE['<{paypal}prestashop>paypal_de79de54313d8b57cd45c840d196b7d0'] = 'Zur Verwendung aller PayPal-Lösungen, müssen Sie die API-Parameter im «Einstellungen» -Tab einstellen'; +$_MODULE['<{paypal}prestashop>paypal_79f53a401ee04dbc765d0ba9a951a106'] = 'Sandbox-Modus (Tests)'; +$_MODULE['<{paypal}prestashop>paypal_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Aktiv'; +$_MODULE['<{paypal}prestashop>paypal_3cab03c00dbd11bc3569afa0748013f0'] = 'Inaktiv'; +$_MODULE['<{paypal}prestashop>paypal_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Zahlungsart'; +$_MODULE['<{paypal}prestashop>paypal_5bc5650bfb4c1eb3887ea80e7802301f'] = 'Direkt (Vertrieb)'; +$_MODULE['<{paypal}prestashop>paypal_6dd446781e32f1a989396e93db70437d'] = 'Autorisierung / Manuelle Erfassung'; +$_MODULE['<{paypal}prestashop>paypal_7186106a954f390f62860c11c8ba10d5'] = '(Zahlung Versand)'; +$_MODULE['<{paypal}prestashop>paypal_3cf5408a4a41b56c6fd7878a070b76ff'] = 'PayPal-Konto E-Mail'; +$_MODULE['<{paypal}prestashop>paypal_467008be031b7e1a913395f53556fea8'] = 'Aktivierung der API-Aufrufe'; +$_MODULE['<{paypal}prestashop>paypal_11931512987fbd1b884da55f13273a07'] = 'API Benutzername'; +$_MODULE['<{paypal}prestashop>paypal_5e07b6956454390018af63962ef4a3f6'] = 'API Kennwort'; +$_MODULE['<{paypal}prestashop>paypal_1c1357865e46a07448c95ebca39d4541'] = 'Leer lassen, wenn das Kennwort nicht geändert wurde'; +$_MODULE['<{paypal}prestashop>paypal_e1ededd62537e048b815f70cc971bec8'] = 'Signatur-API'; +$_MODULE['<{paypal}prestashop>paypal_52c59dac7b7ebfa8a0d78c98f2bc0225'] = 'Hier erfahren Sie, wie Sie Ihren API Benutzernamen, Ihr Kennwort und Ihre Signatur generieren können'; +$_MODULE['<{paypal}prestashop>paypal_e28b278d67eeecfad67e76ec78fc13e8'] = 'Logos und Benutzereinstellungen'; +$_MODULE['<{paypal}prestashop>paypal_ee0174ba1fc039128d0a38074a7af945'] = 'Banner Bild-URL'; +$_MODULE['<{paypal}prestashop>paypal_4c1c997e72e71eb6f690a9cd3dacb1f4'] = 'Das Bild sollte auf einem sicheren (https) Server gehostet werden. Max: 750x90px.'; +$_MODULE['<{paypal}prestashop>paypal_091878185fc791198ac80982860b21ed'] = 'Gewählte Vorlage für PayPal-Integral Evolution '; +$_MODULE['<{paypal}prestashop>paypal_cd8d30bc59ccf92028335d7e69e29905'] = 'Hier lernen Sie, wie man diese Vorlagen benutzerdefiniert'; +$_MODULE['<{paypal}prestashop>paypal_9518e6d551f7dc752b24af3629e849f9'] = 'Eröffnung Ihres PayPal-Kontos'; +$_MODULE['<{paypal}prestashop>paypal_4c9ef5964631b6d4b38f5f2f77d1be74'] = 'Durch die Eröffnung Ihres PayPal-Kontos, indem Sie auf das folgende Bild klicken, tragen Sie wesentlich zur Verbesserung der PrestaShop Software:'; +$_MODULE['<{paypal}prestashop>paypal_1569f6a31ff61f45c5ba13d7cab7e042'] = 'Dieses Modul ermöglicht es Ihnen, Zahlungen per PayPal akzeptieren.'; +$_MODULE['<{paypal}prestashop>paypal_3c4cb777e8df15388c680354569636b6'] = 'Wählt der Kunde diesen Zahlungsmodus, wird Ihr PayPal-Konto automatisch gutgeschrieben.'; +$_MODULE['<{paypal}prestashop>paypal_f9b49f93306d28e3dec595c3b89c926d'] = 'Sie müssen Ihr PayPal-Konto konfigurieren, bevor Sie dieses Modul benutzen.'; +$_MODULE['<{paypal}prestashop>paypal_57487012438fe78ae1d462e53a91bfc0'] = 'Lösung ist nicht gültig'; +$_MODULE['<{paypal}prestashop>paypal_f629bddb66252b97da3e7e5346697955'] = 'Sie müssen zumindest die Kontoinformationen angeben'; +$_MODULE['<{paypal}prestashop>paypal_909d37302176080797966972da84b4e7'] = 'E-Mail ist nicht gültig'; +$_MODULE['<{paypal}prestashop>paypal_2fa631ec6f6afeac6335f3261181063f'] = 'URL für Banner ist nicht gültig'; +$_MODULE['<{paypal}prestashop>paypal_19ea461c401bd941bf47a8bc01eecd6c'] = 'URL für Banner muss das HTTPS-Protokoll verwenden'; +$_MODULE['<{paypal}prestashop>paypal_b8822117a8cc930315a50bab7f6a4c80'] = 'PayPal-Vorlage ist nicht gültig'; +$_MODULE['<{paypal}prestashop>paypal_b02186eee414487a068584dc0d177ad2'] = 'Sie können Zulassung/ Einzug nicht nutzen, wenn Sie '; +$_MODULE['<{paypal}prestashop>paypal_17fcef6818690d11d7caaab023ecdcff'] = 'Sie können diese Lösung nicht nutzen, wenn Sie keine API-Zulassung haben'; +$_MODULE['<{paypal}prestashop>paypal_30e4e115bfc5e140782fd9cb01be6898'] = 'Sie können PayPal Express nicht nutzen, wenn Sie keine API-Zulassung haben'; +$_MODULE['<{paypal}prestashop>paypal_c888438d14855d7d96a2724ee9c306bd'] = 'Die Einstellungen werden aktualisiert'; +$_MODULE['<{paypal}prestashop>paypal_67c0e5ec07dd31dc74aaf55d6a72da31'] = 'Fehler beim Abrufen des Zahlungsstatus'; +$_MODULE['<{paypal}prestashop>paypal_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{paypal}prestashop>paypal_ccb168b5a6a86eb100dc2dee754a316b'] = 'Grund:'; +$_MODULE['<{paypal}prestashop>paypal_4f3acf5bcd7152fd301550bec6d0ffac'] = 'Fehler von PayPal:'; +$_MODULE['<{paypal}prestashop>paypal_a0d09826326fd385f6ceb17442f290de'] = 'Fehler bei Einzugsanfrage'; +$_MODULE['<{paypal}prestashop>paypal_e03187f3f9d6eda06a2a7c201f58cdca'] = 'Fehler bei Rückerstattungsanfrage'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Die Zahlungsnachricht ist nicht gültig, prüfen Sie bitte Ihr Modul!'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Ergebnis Rückerstattungsoperation'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Rückerstattung abgeschlossen mit PayPal!'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Fehler bei der Transaktion!'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Ergebnis Einzugsoperation'; +$_MODULE['<{paypal}prestashop>paypal_5a05744b8ccb5909bc83355092e0f3fa'] = 'Überprüfungsstatus:'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Bezahlen mit PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Bezahlen Sie mit Ihrem PayPal-Konto, Kreditkarte (CB, Visa, Mastercard ...), oder privaten Kreditkarte'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Bezahlen Sie mit Ihrem PayPal-Konto'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Was ist PayPal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal ist ein bewährter Marktführer bei Online-Shop-Zahlungen, der es Käufern und Unternehmen ermöglicht, Geld online zu senden und zu empfangen. PayPal hat über 100 Millionen Mitgliedskonten in 190 Ländern und Regionen. Es wird von Händlern allerorten, sowohl auf als auch außerhalb von eBay, akzeptiert.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'Ist es sicher?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal schützt Ihre Kreditkarteninformationen mit branchenweit führenden Sicherheits-und Betrugsbekämpfungssystemen. Wenn Sie PayPal verwenden, werden Ihre finanziellen Informationen dem Händler niemals sichtbar gemacht.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Warum PayPal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Gebührenfrei einkaufen oder Geld senden mit PayPal'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Bequem einkaufen und zahlen durch gespeicherte Daten bei PayPal'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal wird von Millionen von Händlern weltweit akzeptiert und ist die bevorzugte Zahlungsmethode bei eBay'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Nutzen Sie PayPal noch heute!'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Mit PayPal bezahlen '; +$_MODULE['<{paypal}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Ihr Warenkorb'; +$_MODULE['<{paypal}prestashop>confirm_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Zusammenfassung der Bestellung '; +$_MODULE['<{paypal}prestashop>confirm_dd23adc5fb6bda9c384397b31e57fc53'] = 'PayPal-Zahlung'; +$_MODULE['<{paypal}prestashop>confirm_62d74398cb6ebaa69ab7339052ca5c92'] = 'Sie haben PayPal für Ihre Zahlung gewählt.'; +$_MODULE['<{paypal}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Hier eine kurze Zusammenfassung Ihrer Bestellung:'; +$_MODULE['<{paypal}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'Der Gesamtbetrag Ihrer Bestellung beträgt'; +$_MODULE['<{paypal}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(Inkl. Mwst.)'; +$_MODULE['<{paypal}prestashop>confirm_8ed356c32b198c9cb2abab7c3d262b93'] = 'Wir akzeptieren die folgenden Währungen über PayPal:'; +$_MODULE['<{paypal}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Bitte bestätigen Sie Ihre Bestellung durch Klicken auf \"BESTELLEN\"'; +$_MODULE['<{paypal}prestashop>confirm_988fd738de9c6d177440c5dcf69e73ce'] = 'Zurück'; +$_MODULE['<{paypal}prestashop>confirm_22551b0fea4863f62ee37c847ce032a2'] = 'Session ist abgelaufen, bitte erneut einloggen'; +$_MODULE['<{paypal}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Andere Zahlungsmethoden'; +$_MODULE['<{paypal}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'BESTELLEN'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Sie haben die PayPal-Methode gewählt.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Ihre Bestellung wird sehr bald geschickt werden.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Ihr Warenkorb'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Bitte lesen Sie die Protokolle:'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Zurück'; +$_MODULE['<{paypal}prestashop>paypalconnect_d1f14cc4a2dade80c92421d26422fea0'] = 'Neue Verbindung herstellen zu'; +$_MODULE['<{paypal}prestashop>paypalconnect_94a27811a721ef512ad7bfa06cab34e0'] = 'Verbindung fehlgeschlagen mit CURL Methode '; +$_MODULE['<{paypal}prestashop>paypalconnect_70215486455daee13382c68b1a230b82'] = 'Verbindung erfolgreich mit CURL Methode '; +$_MODULE['<{paypal}prestashop>paypalconnect_e4c4ad49bced42265b5facc2175cdafd'] = 'Senden dieser Parameter:'; +$_MODULE['<{paypal}prestashop>paypalconnect_445583f6641da98fc7ac8fd9d13a564b'] = 'Sendung mit CURL Methode fehlgeschlagen! Fehler:'; +$_MODULE['<{paypal}prestashop>paypalconnect_ef4fbf36eaa2083442d386990ba063c2'] = 'Sendung mit CURL Methode erfolgreich'; +$_MODULE['<{paypal}prestashop>paypalconnect_bf059c9751bb1a20b449b7917b1df374'] = 'Verbindung fehlgeschlagen mit fsockopen Methode '; +$_MODULE['<{paypal}prestashop>paypalconnect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Verbindung erfolgreich mit fsockopen Methode '; +$_MODULE['<{paypal}prestashop>paypalconnect_6e9aa4cb541e09b07602d4ea96080811'] = 'Sendung mit fsockopen Methode fehlgeschlagen!'; +$_MODULE['<{paypal}prestashop>paypalconnect_842a183be225d415b2b4375ba1dd1c94'] = 'Sendung mit fsockopen Methode erfolgreich'; +$_MODULE['<{paypal}prestashop>paypallib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'PayPal Antwort:'; +$_MODULE['<{paypal}prestashop>paypalexpress_b601224a2a6c61f38738ca903fb019a2'] = 'Kein gültiger Warenkorb'; +$_MODULE['<{paypal}prestashop>paypalexpress_ee9dc1e678d54c517f481583c3fb2db8'] = 'Keine gültige Währung'; +$_MODULE['<{paypal}prestashop>submit_528d1f824243db48e40cb6223d32fa06'] = 'Kein Token von PayPal erhalten'; +$_MODULE['<{paypal}prestashop>submit_795277047da13b4fc74e02e050b1a675'] = 'PayPal Fehlerrücksendung'; +$_MODULE['<{paypal}prestashop>submit_b4133f1ba03a914134a5281a08231078'] = 'Zulassung zu PayPal fehlgeschlagen'; +$_MODULE['<{paypal}prestashop>submit_4935b58d37fda5bd60acc510cb324342'] = 'Kann PayPal-Kontoinformationen nicht abrufen '; +$_MODULE['<{paypal}prestashop>submit_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'Von PayPal erhaltener Token ist nicht derselbe wie der Cookie-Token'; +$_MODULE['<{paypal}prestashop>paypalpayment_ee9dc1e678d54c517f481583c3fb2db8'] = 'Keine gültige Währung'; + +?> \ No newline at end of file diff --git a/modules/paypal/error.tpl b/modules/paypal/error.tpl new file mode 100644 index 000000000..77af46812 --- /dev/null +++ b/modules/paypal/error.tpl @@ -0,0 +1,41 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Your shopping cart' mod='paypal'}{$navigationPipe}{l s='PayPal' mod='paypal'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

    {$message}

    +{if isset($logs) && $logs} +
    +

    {l s='Please refer to logs:' mod='paypal'}

    +
      + {foreach from=$logs key=k item=log} +
    1. {$log}
    2. + {/foreach} +
    +

    « {l s='Back' mod='paypal'}

    +
    +{/if} diff --git a/modules/paypal/es.php b/modules/paypal/es.php new file mode 100644 index 000000000..851a3ac8a --- /dev/null +++ b/modules/paypal/es.php @@ -0,0 +1,227 @@ +about_e816e21c1c8e0eba0620fa3df6bd6795'] = '¿Qué es PayPal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal es el líder indiscutible de pagos por Internet: tiene más de 100 millones de cuentas repartidas en 190 países de todo el mundo. Es aceptado como forma de pago por muchos vendedores, tanto dentro como fuera de eBay. '; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = '¿Es un servicio seguro?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal protege sus datos financieros con los mejores sistemas de seguridad y prevención de fraude del mercado. PayPal nunca revela sus datos financieros al vendedor. '; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = '¿Por qué utilizar PayPal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = ' Haga compras y envíe pagos con PayPal: es gratuito (consulte las condicio'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Registre sus datos en PayPal y compre con toda tranquilidad . '; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'Millones de vendedores de todo el mundo aceptan PayPal y es la forma de pago más utilizada en eBay. '; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = '¡Utilice PayPal ya!'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; +$_MODULE['<{paypal}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Su carrito de la compra'; +$_MODULE['<{paypal}prestashop>confirm_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal '; +$_MODULE['<{paypal}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Resumen del pedido '; +$_MODULE['<{paypal}prestashop>confirm_dd23adc5fb6bda9c384397b31e57fc53'] = 'Pago con PayPal '; +$_MODULE['<{paypal}prestashop>confirm_62d74398cb6ebaa69ab7339052ca5c92'] = 'Ha elegido pagar con PayPal. '; +$_MODULE['<{paypal}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Breve resumen del pedido: '; +$_MODULE['<{paypal}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'El importe total de su pedido es de'; +$_MODULE['<{paypal}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(TTC) '; +$_MODULE['<{paypal}prestashop>confirm_8ed356c32b198c9cb2abab7c3d262b93'] = 'Aceptamos esta divisa para el pago : '; +$_MODULE['<{paypal}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Confirme su pedido pulsando \"Confirmar pedido\"'; +$_MODULE['<{paypal}prestashop>confirm_988fd738de9c6d177440c5dcf69e73ce'] = 'Retorno'; +$_MODULE['<{paypal}prestashop>confirm_22551b0fea4863f62ee37c847ce032a2'] = 'La sesión ha finalizado, por favor, vuelva e intentalo de nuevo'; +$_MODULE['<{paypal}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Otras formas de pago'; +$_MODULE['<{paypal}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'Confirmar pedido'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = ' El pedido de '; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = ' se ha guardado correctamente'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = ' Ha seleccionado PayPal como forma de pago'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = ' Le enviaremos el pedido lo antes posible'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = ' Si tiene dudas o necesita información adicional, póngase en contacto con nuestro'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = ' servicio de atención al cliente '; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Carrito de la compra'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Compruebe los registros: '; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Anterior'; +$_MODULE['<{paypal}prestashop>paypal_ad69e733ebae8d264bccaa38d68830e8'] = ' PayPal '; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Acepta pagos con tarjetas de débito y crédito (Visa, MasterCard, Amex, Aurora) con PayPal'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = '¿Está seguro de que desea eliminar su configuración? '; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Actualmente está utilizando la dirección email PayPal por defecto, debe sustituirla por sus propia dirección'; +$_MODULE['<{paypal}prestashop>paypal_b1c5ae0be0bf2b540a852f248c3b32dd'] = 'Todas las aplicaciones del módulo PaypalAPI se encuentran incluidas en este módulo de Paypal. Para no provocar ningún conflicto, por favor, no lo use y suprima el módulo PayPalAPI.'; +$_MODULE['<{paypal}prestashop>paypal_f76de4f0d7f11db73e62f1f04f3a23ef'] = 'Todas las aplicaciones del módulo PaypalAPI se encuentran incluidas en este módulo de Paypal. Para no provocar ningún conflicto, por favor, no lo use y suprima el módulo PayPalAPI.'; +$_MODULE['<{paypal}prestashop>paypal_a706f7e37a81dc235d41bbeb6fae92aa'] = 'No se ha seleccionado una forma de págo válida'; +$_MODULE['<{paypal}prestashop>paypal_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Se han recuperado los fondos'; +$_MODULE['<{paypal}prestashop>paypal_d238649ac5ec14afc894fad36c0b50fc'] = 'La solicitud de recuperación de fondos no se ha hecho correctamente, consulte el mensaje de registro.'; +$_MODULE['<{paypal}prestashop>paypal_05b998de2c4fb46a7bdd37bd378b81d9'] = 'Se ha completado la validación, consulte el mensaje de registro.'; +$_MODULE['<{paypal}prestashop>paypal_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Se ha hecho un reintegro.'; +$_MODULE['<{paypal}prestashop>paypal_cba030a50c8a99c7e224adbe1cf58544'] = 'La solicitud de reintegro no se ha hecho correctamente, consulte el mensaje de registro.'; +$_MODULE['<{paypal}prestashop>paypal_b630aa9b5e25da971949cae62dd109aa'] = 'Validación de PayPal'; +$_MODULE['<{paypal}prestashop>paypal_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Información:'; +$_MODULE['<{paypal}prestashop>paypal_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Pendiente de captura; sin envío'; +$_MODULE['<{paypal}prestashop>paypal_c14eb95a724174f336b8ffdd98ef2f35'] = 'Pendiente de pago; sin envío'; +$_MODULE['<{paypal}prestashop>paypal_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Obtener estado de pago'; +$_MODULE['<{paypal}prestashop>paypal_81e826adb70e2e6b189c2eef739d52d4'] = 'Captura de PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6f1f179632d90b3f71f5c83a1137e302'] = 'Pueden capturarse los fondos antes del envío'; +$_MODULE['<{paypal}prestashop>paypal_3a81739e892c77e29ff4718c9dd92a34'] = 'Obtener el dinero'; +$_MODULE['<{paypal}prestashop>paypal_8ba079f305b81b172792bc0469b6a690'] = 'Reintegro de PayPal'; +$_MODULE['<{paypal}prestashop>paypal_016e1f278eccd700eaf33f74a501d050'] = 'Pago aceptado'; +$_MODULE['<{paypal}prestashop>paypal_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Si emite un reintegro por un producto, se realiza un reintegro parcial a menos que marque la opción \"Generar cupón\".'; +$_MODULE['<{paypal}prestashop>paypal_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Reintegrar el total de la transacción'; +$_MODULE['<{paypal}prestashop>paypal_729a51874fe901b092899e9e8b31c97a'] = '¿Está seguro?'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Cancelar resultados de productos:'; +$_MODULE['<{paypal}prestashop>paypal_e5970a9962bc4cacb5adb408418a9f0c'] = 'Error de autorización a PayPal'; +$_MODULE['<{paypal}prestashop>paypal_be6575076ac9b651d870a59970e7cd54'] = 'PayPal devolvió un error'; +$_MODULE['<{paypal}prestashop>paypal_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'El token proporcionado por PayPal no es el mismo que el de la cookie'; +$_MODULE['<{paypal}prestashop>paypal_33ac76215cb67f61f891cc3113e55997'] = 'Autorización de pago diferido concedida por PayPal'; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Pedido completado con PayPal'; +$_MODULE['<{paypal}prestashop>paypal_d89a00d4ba79c176bb0fc17f12d42a18'] = 'La clave de PayPal \'mc_gross\' no se ha especificado; no se puede controlar el importe pagado.'; +$_MODULE['<{paypal}prestashop>paypal_202a2860b19003ce53966a8780bb448b'] = 'No se ha especificado la clave PayPal \'payment_status\'; no se puede verificar la validez del pago'; +$_MODULE['<{paypal}prestashop>paypal_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Pago: '; +$_MODULE['<{paypal}prestashop>paypal_23703f7d045936080031477df1fc237b'] = 'El token proporcionado por PayPal no es el mismo que el del cookie'; +$_MODULE['<{paypal}prestashop>paypal_760c3c2ccfadeee26c80c7b39462cf1d'] = 'No se ha especificado la clave PayPal \'txn_id\', transacción no reconocida'; +$_MODULE['<{paypal}prestashop>paypal_7faa8448e059fb97d60d4a4b15634d98'] = 'No se ha especificado la clave PayPal \'mc_currency\', divisa no reconocida'; +$_MODULE['<{paypal}prestashop>paypal_e61f52d02b9f52fbe1fd41ed320e29c3'] = ' No se puede encontrar el carro de la compra'; +$_MODULE['<{paypal}prestashop>paypal_0617900b1aff826081d07f5a3e2e7cd0'] = 'Ya se ha procesado el pedido'; +$_MODULE['<{paypal}prestashop>paypal_f5209b3301a46f3057ffbf34d903e205'] = 'Id. de la transacción de PayPal: '; +$_MODULE['<{paypal}prestashop>paypal_7b19e875ff64b09d80ee05dcc84b9975'] = 'No se ha podido verificar la transacción de PayPal. '; +$_MODULE['<{paypal}prestashop>paypal_20dfea1a472e5be3f15f6b5f36ca335c'] = ' Error de conexión con el servidor de PayPal. '; +$_MODULE['<{paypal}prestashop>paypal_76ee8dc73701e846f7bccdf98dae079b'] = 'No hay protocolos de comunicación disponibles. '; +$_MODULE['<{paypal}prestashop>paypal_8358ec19f397d4cdd632688d4f79e535'] = 'Error de verificación (protocolo fsockopen) . Retroceso: '; +$_MODULE['<{paypal}prestashop>paypal_eca77e208634d52703b07672abbf16ec'] = 'Error de verificación (protocolo cURL) . Retroceso: '; +$_MODULE['<{paypal}prestashop>paypal_f7799c2ded739cf3c3e9babffc5f315b'] = 'Error de conexión con protocolo cURL. '; +$_MODULE['<{paypal}prestashop>paypal_c640d8a3c2c34f79061a0bbe50e8420c'] = 'Por favor espere, le redirigimos a PayPal... Gracias. '; +$_MODULE['<{paypal}prestashop>paypal_ea4788705e6873b424c65e91c2846b19'] = 'Cancelar'; +$_MODULE['<{paypal}prestashop>paypal_dae3b417a0fc4a49e851ce55d6d49551'] = 'Mi carrito'; +$_MODULE['<{paypal}prestashop>paypal_9bfa2332c9c7198ac9774c6710bf76c4'] = 'Volver a la tienda'; +$_MODULE['<{paypal}prestashop>paypal_d56249aa9643851a94bd3ef3da309d35'] = 'Error Paypal: (dirección email business no válida o incorrecta)'; +$_MODULE['<{paypal}prestashop>paypal_e7ac6f09a936201890de4094b1ee4e50'] = 'Error Paypal: (direccción o cliente no válidos)'; +$_MODULE['<{paypal}prestashop>paypal_49b21ad0d38942f635877e7bbc5d7a1e'] = 'Solución'; +$_MODULE['<{paypal}prestashop>paypal_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{paypal}prestashop>paypal_9c81c7e49db6edc5ea243dbadfb28c2a'] = 'Logotipos y personalizaciones'; +$_MODULE['<{paypal}prestashop>paypal_9d51eb502e6f46830cb97f53d761c212'] = 'Elija una solución:'; +$_MODULE['<{paypal}prestashop>paypal_0234fed198d74928f2864c574a9a89c1'] = 'Pago exprés'; +$_MODULE['<{paypal}prestashop>paypal_627fabff813cafcd9313ea0037c0125b'] = 'con tarjetas de débito o crédito (Visa, MasterCard, Amex y Aurora) y cuenta PayPal'; +$_MODULE['<{paypal}prestashop>paypal_ec2d6b2d2cfb9eadee1c15f3d579252d'] = 'Pasarela integral'; +$_MODULE['<{paypal}prestashop>paypal_7d8bea00c8ed9c1cdf9da980bd69c85a'] = '(Pagos con tarjetas de débito o crédito y cuenta PayPal, y proteccíon al vendedor)'; +$_MODULE['<{paypal}prestashop>paypal_457e5c04d6690cc6a72412c792c504d9'] = 'Pago exprés on'; +$_MODULE['<{paypal}prestashop>paypal_5d4023dba17f36ce69357d25cbe4fbad'] = 'Cuenta PayPal'; +$_MODULE['<{paypal}prestashop>paypal_e574ea35c565033a741efb1925b5f188'] = '(PayPal como opción)'; +$_MODULE['<{paypal}prestashop>paypal_fdcd0dc7120ef9d14417c968e0a16e97'] = 'Activación sujeta a aprobación y suscripción mensual'; +$_MODULE['<{paypal}prestashop>paypal_89e92ec866e363e88f12a7372d682c5c'] = 'haga clic aquí para suscribirse'; +$_MODULE['<{paypal}prestashop>paypal_cd1bd0b0d3d22ede663f17df5194b3fe'] = 'Opción:'; +$_MODULE['<{paypal}prestashop>paypal_28882d910d7b5311aa0a9d5094e11caf'] = 'Pago exprés de PayPal: pago en 2 clics'; +$_MODULE['<{paypal}prestashop>paypal_22afd6155cd35727f6ed449aef994731'] = 'con cuenta PayPal directamente del carro de la compra'; +$_MODULE['<{paypal}prestashop>paypal_4037fe43ff7b926e093805e2931c0f77'] = 'Solo modo debug'; +$_MODULE['<{paypal}prestashop>paypal_7c8ab5ce5bf608dd41cf3e8f2312451c'] = 'Activa los mensajes de log completos'; +$_MODULE['<{paypal}prestashop>paypal_d4dccb8ca2dac4e53c01bd9954755332'] = 'Guardar configuración'; +$_MODULE['<{paypal}prestashop>paypal_7a262cb0d3d917313c8ba12f996fe83c'] = 'Importante:'; +$_MODULE['<{paypal}prestashop>paypal_de79de54313d8b57cd45c840d196b7d0'] = 'Para utilizar cualquier solución de PayPal, debe configurar los parámetros de API en la pestaña \"Ajustes\".'; +$_MODULE['<{paypal}prestashop>paypal_79f53a401ee04dbc765d0ba9a951a106'] = 'Modo de entorno de pruebas'; +$_MODULE['<{paypal}prestashop>paypal_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Activado'; +$_MODULE['<{paypal}prestashop>paypal_3cab03c00dbd11bc3569afa0748013f0'] = 'Desactivado'; +$_MODULE['<{paypal}prestashop>paypal_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Tipo de pago'; +$_MODULE['<{paypal}prestashop>paypal_5bc5650bfb4c1eb3887ea80e7802301f'] = 'Directo (ventas)'; +$_MODULE['<{paypal}prestashop>paypal_6dd446781e32f1a989396e93db70437d'] = 'Autorización y captura'; +$_MODULE['<{paypal}prestashop>paypal_7186106a954f390f62860c11c8ba10d5'] = '(Pago de envío)'; +$_MODULE['<{paypal}prestashop>paypal_3cf5408a4a41b56c6fd7878a070b76ff'] = 'Correo electrónico de cuenta PayPal'; +$_MODULE['<{paypal}prestashop>paypal_467008be031b7e1a913395f53556fea8'] = 'Activación de llamadas API'; +$_MODULE['<{paypal}prestashop>paypal_11931512987fbd1b884da55f13273a07'] = 'Nombre de usuario de API'; +$_MODULE['<{paypal}prestashop>paypal_5e07b6956454390018af63962ef4a3f6'] = 'Contraseña de API'; +$_MODULE['<{paypal}prestashop>paypal_1c1357865e46a07448c95ebca39d4541'] = 'Déjelo en blanco si no ha cambiado la contraseña'; +$_MODULE['<{paypal}prestashop>paypal_e1ededd62537e048b815f70cc971bec8'] = 'Firma de API'; +$_MODULE['<{paypal}prestashop>paypal_52c59dac7b7ebfa8a0d78c98f2bc0225'] = 'Haga clic aquí para saber cómo generar su nombre de usuario, contraseña y firma de API.'; +$_MODULE['<{paypal}prestashop>paypal_e28b278d67eeecfad67e76ec78fc13e8'] = 'Logotipos y personalizaciones'; +$_MODULE['<{paypal}prestashop>paypal_ee0174ba1fc039128d0a38074a7af945'] = ' URL de la imagen del banner '; +$_MODULE['<{paypal}prestashop>paypal_4c1c997e72e71eb6f690a9cd3dacb1f4'] = 'La imagen debe estar alojada en un servidor seguro (https). Máx.: 750x90px.'; +$_MODULE['<{paypal}prestashop>paypal_091878185fc791198ac80982860b21ed'] = 'Plantilla de Pasarela integral de PayPal'; +$_MODULE['<{paypal}prestashop>paypal_cd8d30bc59ccf92028335d7e69e29905'] = 'Haga clic aquí para saber cómo personalizar esta plantilla.'; +$_MODULE['<{paypal}prestashop>paypal_9518e6d551f7dc752b24af3629e849f9'] = 'Abrir una cuenta PayPal '; +$_MODULE['<{paypal}prestashop>paypal_4c9ef5964631b6d4b38f5f2f77d1be74'] = 'Si abre su cuenta PayPal pulsando la imagen que aparece a continuación, nos ayuda a mejorar la aplicación PrestaShop: '; +$_MODULE['<{paypal}prestashop>paypal_1569f6a31ff61f45c5ba13d7cab7e042'] = 'Este módulo le permite aceptar los pagos por PayPal '; +$_MODULE['<{paypal}prestashop>paypal_3c4cb777e8df15388c680354569636b6'] = 'Si el cliente elige esta forma de pago, los fondos se abonarán automáticamente a su cuenta'; +$_MODULE['<{paypal}prestashop>paypal_f9b49f93306d28e3dec595c3b89c926d'] = 'Debe configurar su cuenta PayPal antes de usar este módulo.'; +$_MODULE['<{paypal}prestashop>paypal_57487012438fe78ae1d462e53a91bfc0'] = 'la solución no es válida.'; +$_MODULE['<{paypal}prestashop>paypal_f629bddb66252b97da3e7e5346697955'] = 'debe indicar al menos la información de cuenta'; +$_MODULE['<{paypal}prestashop>paypal_909d37302176080797966972da84b4e7'] = 'el correo electrónico no es válido'; +$_MODULE['<{paypal}prestashop>paypal_2fa631ec6f6afeac6335f3261181063f'] = 'La URL del banner no es válida'; +$_MODULE['<{paypal}prestashop>paypal_19ea461c401bd941bf47a8bc01eecd6c'] = 'La URL del banner debe utilizar el protocolo HTTPS'; +$_MODULE['<{paypal}prestashop>paypal_b8822117a8cc930315a50bab7f6a4c80'] = 'la plantilla de PayPal no es válida'; +$_MODULE['<{paypal}prestashop>paypal_b02186eee414487a068584dc0d177ad2'] = 'no puede utilizar autorización y captura si no tiene credenciales de API'; +$_MODULE['<{paypal}prestashop>paypal_17fcef6818690d11d7caaab023ecdcff'] = 'no puede utilizar esta solución si no tiene credenciales de API'; +$_MODULE['<{paypal}prestashop>paypal_30e4e115bfc5e140782fd9cb01be6898'] = 'no puede utilizar Pago exprés si no tiene credenciales de API'; +$_MODULE['<{paypal}prestashop>paypal_c888438d14855d7d96a2724ee9c306bd'] = 'Se actualiza la configuración'; +$_MODULE['<{paypal}prestashop>paypal_67c0e5ec07dd31dc74aaf55d6a72da31'] = 'Error al obtener estado de pago'; +$_MODULE['<{paypal}prestashop>paypal_ec53a8c4f07baed5d8825072c89799be'] = 'Estado'; +$_MODULE['<{paypal}prestashop>paypal_ccb168b5a6a86eb100dc2dee754a316b'] = 'Razón:'; +$_MODULE['<{paypal}prestashop>paypal_4f3acf5bcd7152fd301550bec6d0ffac'] = 'Error de PayPal:'; +$_MODULE['<{paypal}prestashop>paypal_a0d09826326fd385f6ceb17442f290de'] = 'Error al solicitar captura'; +$_MODULE['<{paypal}prestashop>paypal_e03187f3f9d6eda06a2a7c201f58cdca'] = 'Error al solicitar reintegro'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'El mensaje de pago no es válido, compruebe su módulo.'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Resultado de la operación de reintegro:'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Reintegro completado con PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Error de transacción.'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Resultado de la operación de captura:'; +$_MODULE['<{paypal}prestashop>paypal_5a05744b8ccb5909bc83355092e0f3fa'] = 'Estado de verificación:'; +$_MODULE['<{paypal}prestashop>paypalconnect_d1f14cc4a2dade80c92421d26422fea0'] = 'Abrir una nueva conexión con'; +$_MODULE['<{paypal}prestashop>paypalconnect_94a27811a721ef512ad7bfa06cab34e0'] = 'Error de la conexión con el método cURL'; +$_MODULE['<{paypal}prestashop>paypalconnect_70215486455daee13382c68b1a230b82'] = 'La conexión con el método cURL se ha desarrollado con éxito'; +$_MODULE['<{paypal}prestashop>paypalconnect_e4c4ad49bced42265b5facc2175cdafd'] = 'Envío de parámetros:'; +$_MODULE['<{paypal}prestashop>paypalconnect_445583f6641da98fc7ac8fd9d13a564b'] = 'Error de envío con el método cURL. Error:'; +$_MODULE['<{paypal}prestashop>paypalconnect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envío con éxito con el método cURL'; +$_MODULE['<{paypal}prestashop>paypalconnect_bf059c9751bb1a20b449b7917b1df374'] = 'Error de la conexión con el método fsockopen'; +$_MODULE['<{paypal}prestashop>paypalconnect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'La conexión con el método fsockopen se ha desarrollado con éxito'; +$_MODULE['<{paypal}prestashop>paypalconnect_6e9aa4cb541e09b07602d4ea96080811'] = 'Error de envío con el método fsockopen. Error:'; +$_MODULE['<{paypal}prestashop>paypalconnect_842a183be225d415b2b4375ba1dd1c94'] = 'Envío con éxito con el método fsockopen'; +$_MODULE['<{paypal}prestashop>paypallib_7c2d00d8c94d1ce0f515db8b0481db40'] = ' Respuesta de PayPal : '; +$_MODULE['<{paypal}prestashop>authentication_cd42c6dd6cc4cd65cb5e13b729050469'] = 'Compruebe sus datos'; +$_MODULE['<{paypal}prestashop>authentication_6335a00a08fde0fbb8f6d6630cdadd92'] = 'Datos personales'; +$_MODULE['<{paypal}prestashop>authentication_b78a3223503896721cca1303f776159b'] = 'Tratamiento'; +$_MODULE['<{paypal}prestashop>authentication_127469a6b4253ebb77adccc0dd48461e'] = 'Sr.'; +$_MODULE['<{paypal}prestashop>authentication_29e32764941c30d1bb41c601014fbdbd'] = 'Sra.'; +$_MODULE['<{paypal}prestashop>authentication_20db0bfeecd8fe60533206a2b5e9891a'] = 'Nombre'; +$_MODULE['<{paypal}prestashop>authentication_8d3f5eff9c40ee315d452392bed5309b'] = 'Apellidos'; +$_MODULE['<{paypal}prestashop>authentication_1e884e3078d9978e216a027ecd57fb34'] = 'Correo electrónico'; +$_MODULE['<{paypal}prestashop>authentication_dc647eb65e6711e155375218212b3964'] = 'Contraseña'; +$_MODULE['<{paypal}prestashop>authentication_bf2957630c4209f61a388a08c2154915'] = '( 5 caracteres mín.)'; +$_MODULE['<{paypal}prestashop>authentication_aac772216aecbeca0e86d06671fe985a'] = 'Fecha de nacimiento'; +$_MODULE['<{paypal}prestashop>authentication_86f5978d9b80124f509bdb71786e929e'] = 'Enero'; +$_MODULE['<{paypal}prestashop>authentication_659e59f062c75f81259d22786d6c44aa'] = 'Febrero'; +$_MODULE['<{paypal}prestashop>authentication_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'Marzo'; +$_MODULE['<{paypal}prestashop>authentication_3fcf026bbfffb63fb24b8de9d0446949'] = 'Abril'; +$_MODULE['<{paypal}prestashop>authentication_195fbb57ffe7449796d23466085ce6d8'] = 'Mayo'; +$_MODULE['<{paypal}prestashop>authentication_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Junio'; +$_MODULE['<{paypal}prestashop>authentication_1b539f6f34e8503c97f6d3421346b63c'] = 'Julio'; +$_MODULE['<{paypal}prestashop>authentication_41ba70891fb6f39327d8ccb9b1dafb84'] = 'Agosto'; +$_MODULE['<{paypal}prestashop>authentication_cc5d90569e1c8313c2b1c2aab1401174'] = 'Septiembre'; +$_MODULE['<{paypal}prestashop>authentication_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Octubre'; +$_MODULE['<{paypal}prestashop>authentication_7e823b37564da492ca1629b4732289a8'] = 'Noviembre'; +$_MODULE['<{paypal}prestashop>authentication_82331503174acbae012b2004f6431fa5'] = 'Diciembre'; +$_MODULE['<{paypal}prestashop>authentication_6f6162d3a052bb330e9c60285c74c6c9'] = 'Suscribirse al boletín'; +$_MODULE['<{paypal}prestashop>authentication_ac135c86084a47630c9eadb4edd5ef75'] = 'Recibir las ofertas especiales de nuestros socios'; +$_MODULE['<{paypal}prestashop>authentication_455175f3f5be6306247babb349c0515a'] = 'Su dirección'; +$_MODULE['<{paypal}prestashop>authentication_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Empresa'; +$_MODULE['<{paypal}prestashop>authentication_dd7bf230fde8d4836917806aff6a6b27'] = 'Dirección'; +$_MODULE['<{paypal}prestashop>authentication_783cb853aae6984e51583b3bb80c09d2'] = 'Dirección (línea 2)'; +$_MODULE['<{paypal}prestashop>authentication_9b514b51d03075005814a33edc74c958'] = 'Código postal'; +$_MODULE['<{paypal}prestashop>authentication_57d056ed0984166336b7879c2af3657f'] = 'Ciudad'; +$_MODULE['<{paypal}prestashop>authentication_59716c97497eb9694541f7c3d37b1a4d'] = 'Provincia'; +$_MODULE['<{paypal}prestashop>authentication_46a2a41cc6e552044816a2d04634545d'] = 'Estado'; +$_MODULE['<{paypal}prestashop>authentication_0f68b904e33d9ac04605aecc958bcf52'] = 'Información adicional'; +$_MODULE['<{paypal}prestashop>authentication_fe66abce284ec8589e7d791185b5c442'] = 'Teléfono personal'; +$_MODULE['<{paypal}prestashop>authentication_41c2fff4867cc204120f001e7af20f7a'] = 'Teléfono móvil'; +$_MODULE['<{paypal}prestashop>authentication_6c1c4d5a22e3d6ed8385e7287233396f'] = 'Dé un nombre a esta dirección para encontrarla fácilmente'; +$_MODULE['<{paypal}prestashop>authentication_ae7bdef7fe2bbbbf02c11e92c5fceb40'] = 'Mi dirección'; +$_MODULE['<{paypal}prestashop>authentication_a0bfb8e59e6c13fc8d990781f77694fe'] = 'Continuar'; +$_MODULE['<{paypal}prestashop>authentication_19f823c6453c2b1ffd09cb715214813d'] = 'Campo obligatorio'; +$_MODULE['<{paypal}prestashop>login_b40ad46c25c153a3d2fde078c0e1b0f8'] = 'Identifíquese'; +$_MODULE['<{paypal}prestashop>login_abc57016a138dea055e0d8be6358f84e'] = 'Dirección ya registrada. Identifíquese.'; +$_MODULE['<{paypal}prestashop>login_8b5dd64ab8d0b8158906796b53a200e2'] = 'Dirección de correo electrónico'; +$_MODULE['<{paypal}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Contraseña'; +$_MODULE['<{paypal}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Identificarse'; +$_MODULE['<{paypal}prestashop>login_01a569ddc6cf67ddec2a683f0a5f5956'] = '¿Ha olvidado su contraseña?'; +$_MODULE['<{paypal}prestashop>paypalexpress_b601224a2a6c61f38738ca903fb019a2'] = 'Carrito de compra incorrecto'; +$_MODULE['<{paypal}prestashop>paypalexpress_ee9dc1e678d54c517f481583c3fb2db8'] = 'Divisa incorrecta'; +$_MODULE['<{paypal}prestashop>shopping_cart_aa91004934e1abdb620b5d0f0c18681c'] = 'Pagar con Pago exprés'; +$_MODULE['<{paypal}prestashop>submit_528d1f824243db48e40cb6223d32fa06'] = 'PayPal no ha dado ningún código'; +$_MODULE['<{paypal}prestashop>submit_795277047da13b4fc74e02e050b1a675'] = 'PayPal ha devuelto un error'; +$_MODULE['<{paypal}prestashop>submit_b4133f1ba03a914134a5281a08231078'] = 'Error de autorización de PayPal'; +$_MODULE['<{paypal}prestashop>submit_4935b58d37fda5bd60acc510cb324342'] = 'No se han encontrado los datos de la cuenta PayPal'; +$_MODULE['<{paypal}prestashop>submit_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'El código proporcionado por PayPal no es el mismo que el de la cookie'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Pagar con PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Pague con su cuenta PayPal, tarjeta de crédito (CB, Visa, Mastercard ...), o tarjeta de crédito privado'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Pague con su cuenta PayPal'; +$_MODULE['<{paypal}prestashop>paypalpayment_ee9dc1e678d54c517f481583c3fb2db8'] = 'Divisa incorrecta'; diff --git a/modules/paypal/express/authentication.tpl b/modules/paypal/express/authentication.tpl new file mode 100644 index 000000000..3e06010ee --- /dev/null +++ b/modules/paypal/express/authentication.tpl @@ -0,0 +1,200 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +

    {l s='Check your information' mod='paypal'}

    + +{assign var='current_step' value='login'} +{include file="$tpl_dir./order-steps.tpl"} + +{include file="$tpl_dir./errors.tpl"} + +
    + + +

    + + + + *{l s='Required field' mod='paypal'} +

    +
    \ No newline at end of file diff --git a/modules/paypal/express/login.tpl b/modules/paypal/express/login.tpl new file mode 100644 index 000000000..85a175aef --- /dev/null +++ b/modules/paypal/express/login.tpl @@ -0,0 +1,52 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='Please log in' mod='paypal'}

    + +{assign var='current_step' value='login'} +{include file="$tpl_dir./order-steps.tpl"} + +{include file="$tpl_dir./errors.tpl"} + +
    +
    +

    {l s='This email has already been registered, please log in !' mod='paypal'}

    +

    + + +

    +

    + + +

    +

    + + + +

    +

    {l s='Forgot your password?' mod='paypal'}

    +
    +
    diff --git a/modules/paypal/express/paypalexpress.php b/modules/paypal/express/paypalexpress.php new file mode 100644 index 000000000..96e9be79e --- /dev/null +++ b/modules/paypal/express/paypalexpress.php @@ -0,0 +1,105 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PaypalExpress extends Paypal +{ + protected $_logs = array(); + + public function getAuthorisation() + { + global $cookie; + + // Getting cart informations + $cart = new Cart((int)($cookie->id_cart)); + if (!Validate::isLoadedObject($cart)) + $this->_logs[] = $this->l('Not a valid cart'); + $currency = new Currency((int)($cart->id_currency)); + if (!Validate::isLoadedObject($currency)) + $this->_logs[] = $this->l('Not a valid currency'); + + if (sizeof($this->_logs)) + return false; + + // Making request + $returnURL = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/paypal/express/submit.php'; + $cancelURL = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'order.php'; + $paymentAmount = (float)$cart->getOrderTotal(); + $currencyCodeType = strval($currency->iso_code); + $paymentType = Configuration::get('PAYPAL_CAPTURE') == 1 ? 'Authorization' : 'Sale'; + $request = '&Amt='.urlencode($paymentAmount).'&PAYMENTACTION='.urlencode($paymentType).'&ReturnUrl='.urlencode($returnURL).'&CANCELURL='.urlencode($cancelURL).'&CURRENCYCODE='.urlencode($currencyCodeType); + if ($this->_pp_integral) + $request .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing'; + else + $request .= '&SOLUTIONTYPE=Mark&LANDINGPAGE=Login'; + $request .= '&LOCALECODE='.strtoupper($this->getCountryCode()); + if ($this->_header) + $request .= '&HDRIMG='.urlencode($this->_header); + // Customer informations + $customer = new Customer((int)$cart->id_customer); + $request .= '&EMAIL='.urlencode($customer->email);//customer + // address of delivery + $address = new Address((int)$cart->id_address_delivery); + $country = new Country((int)$address->id_country); + if ($address->id_state) + $state = new State((int)$address->id_state); + $request .= '&SHIPTONAME='.urlencode($address->firstname.' '.$address->lastname); + $request .= '&SHIPTOSTREET='.urlencode($address->address1); + $request .= '&SHIPTOSTREET2='.urlencode($address->address2); + $request .= '&SHIPTOCITY='.urlencode($address->city); + $request .= '&SHIPTOSTATE='.($address->id_state ? $state->iso_code : $country->iso_code); + $request .= '&SHIPTOZIP='.urlencode($address->postcode); + $request .= '&SHIPTOCOUNTRY='.urlencode($country->iso_code); + $request .= '&SHIPTOPHONENUM='.urlencode($address->phone); + + // Calling PayPal API + include(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + $ppAPI = new PaypalLib(); + $result = $ppAPI->makeCall($this->getAPIURL(), $this->getAPIScript(), 'SetExpressCheckout', $request); + $this->_logs = array_merge($this->_logs, $ppAPI->getLogs()); + return $result; + } + + public function getCustomerInfos() + { + global $cookie; + + // Making request + $request = '&TOKEN='.urlencode(strval($cookie->paypal_token)); + + // Calling PayPal API + include(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + $ppAPI = new PaypalLib(); + $result = $ppAPI->makeCall($this->getAPIURL(), $this->getAPIScript(), 'GetExpressCheckoutDetails', $request); + $this->_logs = array_merge($this->_logs, $ppAPI->getLogs()); + return $result; + } + + public function getLogs() + { + return $this->_logs; + } +} diff --git a/modules/paypal/express/shopping_cart.tpl b/modules/paypal/express/shopping_cart.tpl new file mode 100644 index 000000000..879d8b71f --- /dev/null +++ b/modules/paypal/express/shopping_cart.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +paypal \ No newline at end of file diff --git a/modules/paypal/express/submit.php b/modules/paypal/express/submit.php new file mode 100644 index 000000000..c9b3375a0 --- /dev/null +++ b/modules/paypal/express/submit.php @@ -0,0 +1,390 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../../config/config.inc.php'); +include_once(dirname(__FILE__).'/../../../init.php'); + +include_once(_PS_MODULE_DIR_.'paypal/paypal.php'); +include_once(_PS_MODULE_DIR_.'paypal/express/paypalexpress.php'); + +$paypal = new Paypal(); + +if (!$paypal->active) + exit; + +$ppExpress = new PaypalExpress(); +$errors = array(); + +// ##### +// Functions + +function getAuthorization() +{ + global $ppExpress, $cookie; + + $result = $ppExpress->getAuthorisation(); + $logs = $ppExpress->getLogs(); + if (is_array($result) AND sizeof($result)) + { + if (strtoupper($result['ACK']) == 'SUCCESS') + { + if (isset($result['TOKEN'])) + { + $cookie->paypal_token = strval($result['TOKEN']); + $cookie->paypal_token_date = time(); + header('Location: https://'.$ppExpress->getPayPalURL().'/webscr&cmd=_express-checkout&token='.urldecode(strval($cookie->paypal_token))); + exit; + } + else + $logs[] = ''.$ppExpress->l('No token given by PayPal', 'submit').''; + } + else + $logs[] = ''.$ppExpress->l('PayPal returned error', 'submit').''; + } + $ppExpress->displayPayPalAPIError($ppExpress->l('Authorisation to PayPal failed', 'submit'), $logs); +} + +function getInfos() +{ + global $ppExpress, $cookie; + + $result = $ppExpress->getCustomerInfos(); + $logs = $ppExpress->getLogs(); + + if (!is_array($result) OR !isset($result['ACK']) OR strtoupper($result['ACK']) != 'SUCCESS') + { + $logs[] = ''.$ppExpress->l('Cannot retrieve PayPal account information', 'submit').''; + $ppExpress->displayPayPalAPIError($ppExpress->l('PayPal returned error', 'submit'), $logs); + } + elseif (!isset($result['TOKEN']) OR $result['TOKEN'] != $cookie->paypal_token) + { + $logs[] = ''.$ppExpress->l('Token given by PayPal is not the same as the cookie token', 'submit').''; + $ppExpress->displayPayPalAPIError($ppExpress->l('PayPal returned error', 'submit'), $logs); + } + return $result; +} + +function displayProcess($payerID) +{ + global $cookie; + + $cookie->paypal_token = strval($cookie->paypal_token); + $cookie->paypal_payer_id = $payerID; + Tools::redirect('index.php?controller=order&step=1&back=paypal'); +} + +function displayConfirm() +{ + global $cookie, $smarty, $ppExpress, $cart, $payerID; + + if (!$cookie->isLogged(true)) + die('Not logged'); + if (!$payerID AND !$payerID = Tools::htmlentitiesUTF8(strval(Tools::getValue('payerID')))) + die('No payer ID'); + + // Display all and exit + include(_PS_ROOT_DIR_.'/header.php'); + + $smarty->assign(array( + 'back' => 'paypal', + 'logo' => $ppExpress->getLogo(), + 'ppToken' => strval($cookie->paypal_token), + 'cust_currency' => $cart->id_currency, + 'currencies' => $ppExpress->getCurrency((int)$cart->id_currency), + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'. $ppExpress->name.'/', + 'payerID' => $payerID, + 'mode' => 'express/' + )); + + echo $ppExpress->display('paypal.php', 'confirm.tpl'); + include(_PS_ROOT_DIR_.'/footer.php'); + die ; +} + +function submitConfirm() +{ + global $cookie, $smarty, $ppExpress, $cart; + + if (!$cookie->isLogged(true)) + die('Not logged'); + elseif (!$currency = (int)(Tools::getValue('currency_payement'))) + die('No currency'); + elseif (!$payerID = Tools::htmlentitiesUTF8(strval(Tools::getValue('payerID')))) + die('No payer ID'); + elseif (!$cart->getOrderTotal(true, Cart::BOTH)) + die('Empty cart'); + + $ppExpress->makePayPalAPIValidation($cookie, $cart, $currency, $payerID, 'express'); +} + +function submitAccount() +{ + global $cookie, $errors, $smarty; + $email = Tools::getValue('email'); + if (empty($email) OR !Validate::isEmail($email)) + $errors[] = Tools::displayError('e-mail not valid'); + elseif (!Validate::isPasswd(Tools::getValue('passwd'))) + $errors[] = Tools::displayError('invalid password'); + elseif (Customer::customerExists($email, false, true, (int)Shop::getCurrentGroupShop(), (int)Shop::getCurrentShop())) + $errors[] = Tools::displayError('someone has already registered with this e-mail address'); + elseif (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) AND !(Tools::getValue('months') == '' AND Tools::getValue('days') == '' AND Tools::getValue('years') == '')) + $errors[] = Tools::displayError('invalid birthday'); + else + { + $customer = new Customer(); + if (Tools::isSubmit('newsletter')) + { + $customer->ip_registration_newsletter = pSQL(Tools::getRemoteAddr()); + $customer->newsletter_date_add = pSQL(date('Y-m-d h:i:s')); + } + $customer->birthday = (empty($_POST['years']) ? '' : (int)($_POST['years']).'-'.(int)($_POST['months']).'-'.(int)($_POST['days'])); + /* Customer and address, same fields, caching data */ + $errors = $customer->validateControler(); + $address = new Address(); + $address->id_customer = 1; + $errors = array_unique(array_merge($errors, $address->validateControler())); + if (!sizeof($errors)) + { + $customer->active = 1; + if (!$customer->add()) + $errors[] = Tools::displayError('an error occurred while creating your account'); + else + { + $address->id_customer = (int)($customer->id); + if (!$address->add()) + $errors[] = Tools::displayError('an error occurred while creating your address'); + else + { + if (Mail::Send((int)($cookie->id_lang), 'account', Mail::l('Welcome!'), + array('{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{passwd}' => Tools::getValue('passwd')), $customer->email, $customer->firstname.' '.$customer->lastname)) + $smarty->assign('confirmation', 1); + $cookie->id_customer = (int)($customer->id); + $cookie->customer_lastname = $customer->lastname; + $cookie->customer_firstname = $customer->firstname; + $cookie->passwd = $customer->passwd; + $cookie->logged = 1; + $cookie->email = $customer->email; + Module::hookExec('createAccount', array( + '_POST' => $_POST, + 'newCustomer' => $customer + )); + + // Next ! + $payerID = strval(Tools::getValue('payerID')); + displayProcess($payerID); + } + } + } + } +} + +function submitLogin() +{ + global $cookie, $errors; + + $passwd = trim(Tools::getValue('passwd')); + $email = trim(Tools::getValue('email')); + if (empty($email)) + $errors[] = Tools::displayError('e-mail address is required'); + elseif (empty($email) OR !Validate::isEmail($email)) + $errors[] = Tools::displayError('invalid e-mail address'); + elseif (empty($passwd)) + $errors[] = Tools::displayError('password is required'); + elseif (Tools::strlen($passwd) > 32) + $errors[] = Tools::displayError('password is too long'); + elseif (!Validate::isPasswd($passwd)) + $errors[] = Tools::displayError('invalid password'); + else + { + $customer = new Customer(); + $authentication = $customer->getByemail(trim($email), trim($passwd), (int)Shop::getCurrentGroupShop(), (int)Shop::getCurrentShop()); + /* Handle brute force attacks */ + sleep(1); + if (!$authentication OR !$customer->id) + $errors[] = Tools::displayError('authentication failed'); + else + { + $cookie->id_customer = (int)($customer->id); + $cookie->customer_lastname = $customer->lastname; + $cookie->customer_firstname = $customer->firstname; + $cookie->logged = 1; + $cookie->passwd = $customer->passwd; + $cookie->email = $customer->email; + if (Configuration::get('PS_CART_FOLLOWING') AND (empty($cookie->id_cart) OR Cart::getNbProducts($cookie->id_cart) == 0)) + $cookie->id_cart = Cart::lastNoneOrderedCart($customer->id); + Module::hookExec('authentication'); + + // Next ! + $payerID = strval(Tools::getValue('payerID')); + displayProcess($payerID); + } + } +} + +function displayLogin() +{ + global $cookie, $result, $email, $payerID, $errors, $ppExpress, $smarty; + + // Customer exists, login form + + // If customer already logged, check if same mail than PayPal, and go through, or unlog + if ($cookie->isLogged(true) AND isset($result['EMAIL']) AND $cookie->email == $result['EMAIL']) + displayProcess($payerID); + elseif ($cookie->isLogged(true)) + $cookie->makeNewLog(); + + // Smarty assigns + $smarty->assign(array( + 'email' => $email, + 'ppToken' => strval($cookie->paypal_token), + 'errors'=> $errors, + 'payerID' => $payerID + )); + + // Display all and exit + include(_PS_ROOT_DIR_.'/header.php'); + echo $ppExpress->display('paypal.php', 'express/login.tpl'); + include(_PS_ROOT_DIR_.'/footer.php'); + die ; +} + +function displayAccount() +{ + global $cookie, $result, $email, $payerID, $errors, $ppExpress, $smarty; + + // Customer does not exists, signup form + + // If customer already logged, unlog him + if ($cookie->isLogged(true)) + $cookie->makeNewLog(); + + // Generate years, months and days + if (isset($_POST['years']) AND is_numeric($_POST['years'])) + $selectedYears = (int)($_POST['years']); + $years = Tools::dateYears(); + if (isset($_POST['months']) AND is_numeric($_POST['months'])) + $selectedMonths = (int)($_POST['months']); + $months = Tools::dateMonths(); + if (isset($_POST['days']) AND is_numeric($_POST['days'])) + $selectedDays = (int)($_POST['days']); + $days = Tools::dateDays(); + + // Select the most appropriate country + if (Tools::getValue('id_country')) + $selectedCountry = (int)(Tools::getValue('id_country')); + else + $selectedCountry = Country::getByIso(strval($result['COUNTRYCODE'])); + $countries = Country::getCountries((int)($cookie->id_lang), true); + + // Smarty assigns + $smarty->assign(array( + 'years' => $years, + 'sl_year' => (isset($selectedYears) ? $selectedYears : 0), + 'months' => $months, + 'sl_month' => (isset($selectedMonths) ? $selectedMonths : 0), + 'days' => $days, + 'sl_day' => (isset($selectedDays) ? $selectedDays : 0), + 'countries' => $countries, + 'sl_country' => (isset($selectedCountry) ? $selectedCountry : 0), + 'email' => $email, + 'firstname' => (Tools::getValue('customer_firstname') ? Tools::htmlentitiesUTF8(strval(Tools::getValue('customer_firstname'))) : $result['FIRSTNAME']), + 'lastname' => (Tools::getValue('customer_lastname') ? Tools::htmlentitiesUTF8(strval(Tools::getValue('customer_lastname'))) : $result['LASTNAME']), + 'street' => (Tools::getValue('address1') ? Tools::htmlentitiesUTF8(strval(Tools::getValue('address1'))) : (isset($result['SHIPTOSTREET']) ? $result['SHIPTOSTREET'] : '')), + 'city' => (Tools::getValue('city') ? Tools::htmlentitiesUTF8(strval(Tools::getValue('city'))) : (isset($result['SHIPTOCITY']) ? $result['SHIPTOCITY'] : '')), + 'zip' => (Tools::getValue('postcode') ? Tools::htmlentitiesUTF8(strval(Tools::getValue('postcode'))) : (isset($result['SHIPTOZIP']) ? $result['SHIPTOZIP'] : '')), + 'payerID' => $payerID, + 'ppToken' => strval($cookie->paypal_token), + 'errors'=> $errors + )); + + // Display all and exit + include(_PS_ROOT_DIR_.'/header.php'); + echo $ppExpress->display('paypal.php', 'express/authentication.tpl'); + include(_PS_ROOT_DIR_.'/footer.php'); + die ; +} + +// ##### +// Process !! + +if (!$cookie->isLogged(true)) + die('Not logged'); +elseif (!$cart->getOrderTotal(true, Cart::BOTH)) + die('Empty cart'); + +// No token, we need to get one by making PayPal Authorisation +if (!isset($cookie->paypal_token) OR !$cookie->paypal_token) + getAuthorization(); +else +{ + // We have token, we need to confirm user informations (login or signup) + if ((int)(Tools::getValue('confirm'))) + displayConfirm(); + elseif (Tools::isSubmit('submitAccount')) + submitAccount(); + elseif (Tools::isSubmit('submitLogin')) + submitLogin(); + elseif (Tools::isSubmit('submitPayment')) + submitConfirm(); + + // We got an error or we still not submit form + if ((!Tools::isSubmit('submitAccount') AND !Tools::isSubmit('submitLogin')) OR sizeof($errors)) + { + if (isset($cookie->paypal_token) AND isset($cookie->paypal_token_date) AND (time() - 10800 > $cookie->paypal_token_date)) + { + // Token expired, unset it + unset($cookie->paypal_token); + Tools::redirect('modules/paypal/express/submit.php'); + } + // We didn't submit form, getting PayPal informations + if (!Tools::isSubmit('submitAccount') AND !Tools::isSubmit('submitLogin')) + $result = getInfos(); + + if (Tools::getValue('email') AND Tools::getValue('payerID')) + { + // Form was submitted (errors) + $email = Tools::htmlentitiesUTF8(strval(Tools::getValue('email'))); + $payerID = Tools::htmlentitiesUTF8(strval(Tools::getValue('payerID'))); + } + elseif (isset($result['EMAIL']) AND isset($result['PAYERID'])) + { + // Displaying form for the first time + $email = $result['EMAIL']; + $payerID = $result['PAYERID']; + } + else + { + // Error in token, we need to make authorization again + unset($cookie->paypal_token); + Tools::redirect('modules/paypal/express/submit.php'); + } + if (Customer::customerExists($email, false, true, (int)Shop::getCurrentGroupShop(), (int)Shop::getCurrentShop()) OR Tools::isSubmit('submitLogin')) + displayLogin(); + displayAccount(); + } +} diff --git a/modules/paypal/fr.php b/modules/paypal/fr.php new file mode 100644 index 000000000..6b70e4f1e --- /dev/null +++ b/modules/paypal/fr.php @@ -0,0 +1,227 @@ +about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Qu\'est-ce que PayPal ?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, leader incontesté en matière de paiement en ligne, permet aux acheteurs et aux vendeurs d\'envoyer et de recevoir des paiements en ligne. PayPal compte plus de 100 millions de comptes dans 190 pays et régions du monde. Il est accepté par les marchands partout, à la fois sur eBay et en dehors d\'eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'Est-ce un service sécurisé ?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal contribue à protéger les informations concernant votre carte bancaire grâce aux meilleurs systèmes présents sur le marché pour la sécurité et la prévention contre la fraude. Lorsque vous utilisez PayPal, vos informations financières ne sont jamais communiquées au marchand.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Pourquoi utiliser PayPal ?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Effectuez des achats ou envoyez des paiements avec PayPal : c\'est gratuit.'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Achetez et payez en toute tranquillité en enregistrant vos informations auprès de PayPal.'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal est accepté par des millions de marchands dans le monde et constitue le mode de paiement le plus utilisé sur eBay.'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Utilisez PayPal dès aujourd\'hui !'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer par PayPal'; +$_MODULE['<{paypal}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>confirm_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Résumé de la commande'; +$_MODULE['<{paypal}prestashop>confirm_dd23adc5fb6bda9c384397b31e57fc53'] = 'Paiement PayPal'; +$_MODULE['<{paypal}prestashop>confirm_62d74398cb6ebaa69ab7339052ca5c92'] = 'Vous avez choisi de payer avec PayPal.'; +$_MODULE['<{paypal}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Voici un court résumé de votre commande :'; +$_MODULE['<{paypal}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'Le montant total de votre commande s\'élève à'; +$_MODULE['<{paypal}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(TTC)'; +$_MODULE['<{paypal}prestashop>confirm_8ed356c32b198c9cb2abab7c3d262b93'] = 'Nous acceptons la devise suivante pour votre paiement :'; +$_MODULE['<{paypal}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Merci de confirmer votre commande en cliquant sur \"Je confirme ma commande\"'; +$_MODULE['<{paypal}prestashop>confirm_988fd738de9c6d177440c5dcf69e73ce'] = 'Retour'; +$_MODULE['<{paypal}prestashop>confirm_22551b0fea4863f62ee37c847ce032a2'] = 'Session expirée, veuillez cliquer sur \"Retour\" et recommencez'; +$_MODULE['<{paypal}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Autres moyens de paiement'; +$_MODULE['<{paypal}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'Je confirme ma commande'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'est bien enregistrée.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Vous avez choisi de payer avec PayPal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande vous sera envoyée très prochainement.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toute question ou information complémentaire merci de contacter notre'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'support client'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Votre panier'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Merci de vous reférer aux logs :'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Précédent'; +$_MODULE['<{paypal}prestashop>paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Accepter les paiements par cartes de paiement (CB, Visa, MasterCard, American Express, Aurore, Cofinoga, 4 étoiles) avec Paypal'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Etes vous sûr de vouloir supprimer vos informations ?'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Vous utilisez actuellement l\'adresse e-mail PayPal par défaut, vous devez la remplacer par votre propre adresse'; +$_MODULE['<{paypal}prestashop>paypal_b1c5ae0be0bf2b540a852f248c3b32dd'] = 'Toutes les fonctionnalités du module PaypalAPI sont maintenant inclues dans le nouveau module Paypal. Afin de ne pas avoir de conflit, merci de ne pas utiliser et de supprimer le module Paypal API.'; +$_MODULE['<{paypal}prestashop>paypal_f76de4f0d7f11db73e62f1f04f3a23ef'] = 'Toutes les fonctionnalités du module PaypalAPI sont maintenant inclues dans ce module. Afin de ne pas avoir de conflit, merci de ne pas utiliser et de supprimer le module Paypal API.'; +$_MODULE['<{paypal}prestashop>paypal_a706f7e37a81dc235d41bbeb6fae92aa'] = 'Aucun moyen de paiement valide'; +$_MODULE['<{paypal}prestashop>paypal_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Les fonds ont été récupérés'; +$_MODULE['<{paypal}prestashop>paypal_d238649ac5ec14afc894fad36c0b50fc'] = 'La requête pour la récupération des fonds a été effectuée sans succès, merci de vous referez au message de log !'; +$_MODULE['<{paypal}prestashop>paypal_05b998de2c4fb46a7bdd37bd378b81d9'] = 'La validation a été effectuée, merci de regarder le message de log !'; +$_MODULE['<{paypal}prestashop>paypal_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Le remboursement a été effectuée'; +$_MODULE['<{paypal}prestashop>paypal_cba030a50c8a99c7e224adbe1cf58544'] = 'La requête pour le remboursement a été effectuée sans succès, merci de vous referez au message de log !'; +$_MODULE['<{paypal}prestashop>paypal_b630aa9b5e25da971949cae62dd109aa'] = 'Validation PayPal'; +$_MODULE['<{paypal}prestashop>paypal_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informations :'; +$_MODULE['<{paypal}prestashop>paypal_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'Collecte en attente de validation - Ne pas expédier'; +$_MODULE['<{paypal}prestashop>paypal_c14eb95a724174f336b8ffdd98ef2f35'] = 'Paiement en attente de validation - ne pas expédier '; +$_MODULE['<{paypal}prestashop>paypal_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Récupérer le statut du paiement'; +$_MODULE['<{paypal}prestashop>paypal_81e826adb70e2e6b189c2eef739d52d4'] = 'Capture PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6f1f179632d90b3f71f5c83a1137e302'] = 'Paiement pret à être collecté avant expedition'; +$_MODULE['<{paypal}prestashop>paypal_3a81739e892c77e29ff4718c9dd92a34'] = 'Récupérer les fonds'; +$_MODULE['<{paypal}prestashop>paypal_8ba079f305b81b172792bc0469b6a690'] = 'Remboursement PayPal'; +$_MODULE['<{paypal}prestashop>paypal_016e1f278eccd700eaf33f74a501d050'] = 'Paiement accepté'; +$_MODULE['<{paypal}prestashop>paypal_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Quand vous remboursez un produit, un remboursement partiel est effectué sauf si vous cochez l\'option \"Générer un bon de réduction\"'; +$_MODULE['<{paypal}prestashop>paypal_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Rembourser totalement la transaction'; +$_MODULE['<{paypal}prestashop>paypal_729a51874fe901b092899e9e8b31c97a'] = 'Etes vous sûr ?'; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Résultat du remboursement de produit:'; +$_MODULE['<{paypal}prestashop>paypal_e5970a9962bc4cacb5adb408418a9f0c'] = 'Echec de l\'autorisation auprès de PayPal'; +$_MODULE['<{paypal}prestashop>paypal_be6575076ac9b651d870a59970e7cd54'] = 'PayPal a retourné une erreur'; +$_MODULE['<{paypal}prestashop>paypal_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'Le token fournit par PayPal n\'est pas le même que celui du cookie'; +$_MODULE['<{paypal}prestashop>paypal_33ac76215cb67f61f891cc3113e55997'] = 'Autorisation accepté par PayPal pour le paiement différé'; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Commande achevée avec PayPal !'; +$_MODULE['<{paypal}prestashop>paypal_d89a00d4ba79c176bb0fc17f12d42a18'] = 'La clef PayPal \'mc_gross\' n\'a pas été spécifiée, impossible de contrôler le montant payé.'; +$_MODULE['<{paypal}prestashop>paypal_202a2860b19003ce53966a8780bb448b'] = 'La clef PayPal \'payment_status\' n\'a pas été spécifiée, impossible de vérifier la validité du paiement'; +$_MODULE['<{paypal}prestashop>paypal_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Paiement :'; +$_MODULE['<{paypal}prestashop>paypal_23703f7d045936080031477df1fc237b'] = 'Le token fournit par PayPal n\'est pas le même que celui du cookie'; +$_MODULE['<{paypal}prestashop>paypal_760c3c2ccfadeee26c80c7b39462cf1d'] = 'La clef PayPal \'txn_id\' n\'a pas été spécifiée, transaction inconnue'; +$_MODULE['<{paypal}prestashop>paypal_7faa8448e059fb97d60d4a4b15634d98'] = 'La clef PayPal \'mc_currency\' n\'a pas été spécifiée, devise inconnue'; +$_MODULE['<{paypal}prestashop>paypal_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Panier introuvable'; +$_MODULE['<{paypal}prestashop>paypal_0617900b1aff826081d07f5a3e2e7cd0'] = 'La commande a déjà été traitée'; +$_MODULE['<{paypal}prestashop>paypal_f5209b3301a46f3057ffbf34d903e205'] = 'ID de la transaction PayPal :'; +$_MODULE['<{paypal}prestashop>paypal_7b19e875ff64b09d80ee05dcc84b9975'] = 'La transaction PayPal ne peut pas être VERIFIEE.'; +$_MODULE['<{paypal}prestashop>paypal_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problèmes lors de la tentative de connexion au serveur PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_76ee8dc73701e846f7bccdf98dae079b'] = 'Aucun protocole de communication disponible.'; +$_MODULE['<{paypal}prestashop>paypal_8358ec19f397d4cdd632688d4f79e535'] = 'Echec de la vérification (protocole fsockopen). Retour :'; +$_MODULE['<{paypal}prestashop>paypal_eca77e208634d52703b07672abbf16ec'] = 'Echec de la vérification (protocole cURL). Retour :'; +$_MODULE['<{paypal}prestashop>paypal_f7799c2ded739cf3c3e9babffc5f315b'] = 'La connection via le protocole cURL a échoué.'; +$_MODULE['<{paypal}prestashop>paypal_c640d8a3c2c34f79061a0bbe50e8420c'] = 'Merci de patienter, vous allez être redirigé vers PayPal. Merci.'; +$_MODULE['<{paypal}prestashop>paypal_ea4788705e6873b424c65e91c2846b19'] = 'Annuler'; +$_MODULE['<{paypal}prestashop>paypal_dae3b417a0fc4a49e851ce55d6d49551'] = 'Mon Panier'; +$_MODULE['<{paypal}prestashop>paypal_9bfa2332c9c7198ac9774c6710bf76c4'] = 'Retour à la boutique'; +$_MODULE['<{paypal}prestashop>paypal_d56249aa9643851a94bd3ef3da309d35'] = 'Paypal erreur: (adresse e-mail business invalide or indéfinie)'; +$_MODULE['<{paypal}prestashop>paypal_e7ac6f09a936201890de4094b1ee4e50'] = 'Paypal erreur: (client ou adresse invalide)'; +$_MODULE['<{paypal}prestashop>paypal_49b21ad0d38942f635877e7bbc5d7a1e'] = 'Solution'; +$_MODULE['<{paypal}prestashop>paypal_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{paypal}prestashop>paypal_9c81c7e49db6edc5ea243dbadfb28c2a'] = 'Personnalisation et logos'; +$_MODULE['<{paypal}prestashop>paypal_9d51eb502e6f46830cb97f53d761c212'] = 'Choisissez votre solution :'; +$_MODULE['<{paypal}prestashop>paypal_0234fed198d74928f2864c574a9a89c1'] = 'Paiements par cartes'; +$_MODULE['<{paypal}prestashop>paypal_627fabff813cafcd9313ea0037c0125b'] = 'cartes (CB , Visa, Mastercard, American Express, Aurore, Cofinoga, 4 Etoiles) et comptes PayPal (PayPal Intégral)'; +$_MODULE['<{paypal}prestashop>paypal_ec2d6b2d2cfb9eadee1c15f3d579252d'] = 'Paiements par cartes et compte PayPal avec une garantie des paiements en plus'; +$_MODULE['<{paypal}prestashop>paypal_7d8bea00c8ed9c1cdf9da980bd69c85a'] = '(PayPal Intégral Evolution, avec abonnement mensuel)'; +$_MODULE['<{paypal}prestashop>paypal_457e5c04d6690cc6a72412c792c504d9'] = 'Paiements par'; +$_MODULE['<{paypal}prestashop>paypal_5d4023dba17f36ce69357d25cbe4fbad'] = 'comptes PayPal uniquement'; +$_MODULE['<{paypal}prestashop>paypal_e574ea35c565033a741efb1925b5f188'] = '(PayPal Option + )'; +$_MODULE['<{paypal}prestashop>paypal_fdcd0dc7120ef9d14417c968e0a16e97'] = 'Activation soumise à conditions'; +$_MODULE['<{paypal}prestashop>paypal_89e92ec866e363e88f12a7372d682c5c'] = 'cliquez ici pour connaître la procédure'; +$_MODULE['<{paypal}prestashop>paypal_cd1bd0b0d3d22ede663f17df5194b3fe'] = 'Option :'; +$_MODULE['<{paypal}prestashop>paypal_28882d910d7b5311aa0a9d5094e11caf'] = 'Paiement par compte PayPal en 2 clics'; +$_MODULE['<{paypal}prestashop>paypal_22afd6155cd35727f6ed449aef994731'] = 'depuis le panier d’achat (PayPal Express)'; +$_MODULE['<{paypal}prestashop>paypal_4037fe43ff7b926e093805e2931c0f77'] = 'Mode debug seulement :'; +$_MODULE['<{paypal}prestashop>paypal_7c8ab5ce5bf608dd41cf3e8f2312451c'] = 'Active les messages de log complet'; +$_MODULE['<{paypal}prestashop>paypal_d4dccb8ca2dac4e53c01bd9954755332'] = 'Valider'; +$_MODULE['<{paypal}prestashop>paypal_7a262cb0d3d917313c8ba12f996fe83c'] = 'Important :'; +$_MODULE['<{paypal}prestashop>paypal_de79de54313d8b57cd45c840d196b7d0'] = 'L’utilisation des solutions PayPal nécessite une activation des appels API dans le menu Paramètres'; +$_MODULE['<{paypal}prestashop>paypal_79f53a401ee04dbc765d0ba9a951a106'] = 'Mode Test '; +$_MODULE['<{paypal}prestashop>paypal_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Activé'; +$_MODULE['<{paypal}prestashop>paypal_3cab03c00dbd11bc3569afa0748013f0'] = 'Désactivé'; +$_MODULE['<{paypal}prestashop>paypal_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Type de paiement '; +$_MODULE['<{paypal}prestashop>paypal_5bc5650bfb4c1eb3887ea80e7802301f'] = 'Direct (sales)'; +$_MODULE['<{paypal}prestashop>paypal_6dd446781e32f1a989396e93db70437d'] = 'Autorisation / Capture manuelle'; +$_MODULE['<{paypal}prestashop>paypal_7186106a954f390f62860c11c8ba10d5'] = '(Paiement à l\'expédition)'; +$_MODULE['<{paypal}prestashop>paypal_3cf5408a4a41b56c6fd7878a070b76ff'] = 'Adresse email de votre compte PayPal marchand'; +$_MODULE['<{paypal}prestashop>paypal_467008be031b7e1a913395f53556fea8'] = 'Activation des appels API'; +$_MODULE['<{paypal}prestashop>paypal_11931512987fbd1b884da55f13273a07'] = 'Utilisateur API'; +$_MODULE['<{paypal}prestashop>paypal_5e07b6956454390018af63962ef4a3f6'] = 'Mot de passe API'; +$_MODULE['<{paypal}prestashop>paypal_1c1357865e46a07448c95ebca39d4541'] = 'Laisser vide si le mot de passe n\'a pas changé'; +$_MODULE['<{paypal}prestashop>paypal_e1ededd62537e048b815f70cc971bec8'] = 'Signature API'; +$_MODULE['<{paypal}prestashop>paypal_52c59dac7b7ebfa8a0d78c98f2bc0225'] = 'Cliquez ici pour savoir comment générer votre utilisateur, mot de passe et signature API'; +$_MODULE['<{paypal}prestashop>paypal_e28b278d67eeecfad67e76ec78fc13e8'] = 'Personnalisation et logos'; +$_MODULE['<{paypal}prestashop>paypal_ee0174ba1fc039128d0a38074a7af945'] = 'URL de votre bannière (affichée sur la page de paiement PayPal)'; +$_MODULE['<{paypal}prestashop>paypal_4c1c997e72e71eb6f690a9cd3dacb1f4'] = '(750 x 90 px, hébergement sécurisé « https »)'; +$_MODULE['<{paypal}prestashop>paypal_091878185fc791198ac80982860b21ed'] = 'Template choisi pour PayPal Intégral Evolution'; +$_MODULE['<{paypal}prestashop>paypal_cd8d30bc59ccf92028335d7e69e29905'] = 'Cliquez ici pour savoir comment personnaliser votre template (Tutorial)'; +$_MODULE['<{paypal}prestashop>paypal_9518e6d551f7dc752b24af3629e849f9'] = 'Ouvrir son compte PayPal'; +$_MODULE['<{paypal}prestashop>paypal_4c9ef5964631b6d4b38f5f2f77d1be74'] = 'En ouvrant votre compte PayPal en cliquant sur l\'image ci-dessous vous nous aidez activement à améliorer le logiciel PrestaShop :'; +$_MODULE['<{paypal}prestashop>paypal_1569f6a31ff61f45c5ba13d7cab7e042'] = 'Ce module vous permet d\'accepter les paiements par PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_3c4cb777e8df15388c680354569636b6'] = 'Si le client choisit ce mode de paiement, votre compte PayPal sera automatiquement crédité.'; +$_MODULE['<{paypal}prestashop>paypal_f9b49f93306d28e3dec595c3b89c926d'] = 'Vous devez configurer votre compte PayPal avant d\'utiliser ce module.'; +$_MODULE['<{paypal}prestashop>paypal_57487012438fe78ae1d462e53a91bfc0'] = 'solution invalide'; +$_MODULE['<{paypal}prestashop>paypal_f629bddb66252b97da3e7e5346697955'] = 'vous devez renseigner au moins un compte'; +$_MODULE['<{paypal}prestashop>paypal_909d37302176080797966972da84b4e7'] = 'adresse e-mail invalide'; +$_MODULE['<{paypal}prestashop>paypal_2fa631ec6f6afeac6335f3261181063f'] = 'l\'URL du logo est invalide'; +$_MODULE['<{paypal}prestashop>paypal_19ea461c401bd941bf47a8bc01eecd6c'] = 'l\'URL du logo doit utiliser le protocole HTTPS'; +$_MODULE['<{paypal}prestashop>paypal_b8822117a8cc930315a50bab7f6a4c80'] = 'le template PayPal est invalide'; +$_MODULE['<{paypal}prestashop>paypal_b02186eee414487a068584dc0d177ad2'] = 'vous ne pouvez pas utiliser l\'autorisation / capture si vous n\'avez pas les droits API'; +$_MODULE['<{paypal}prestashop>paypal_17fcef6818690d11d7caaab023ecdcff'] = 'vous ne pouvez pas utiliser cette solution si vous n\'avez pas les droits API'; +$_MODULE['<{paypal}prestashop>paypal_30e4e115bfc5e140782fd9cb01be6898'] = 'vous ne pouvez pas utiliser PayPal Express si vous n\'avez pas les droits API'; +$_MODULE['<{paypal}prestashop>paypal_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{paypal}prestashop>paypal_67c0e5ec07dd31dc74aaf55d6a72da31'] = 'Erreur lors de la récupération du statut de paiement'; +$_MODULE['<{paypal}prestashop>paypal_ec53a8c4f07baed5d8825072c89799be'] = 'Statut'; +$_MODULE['<{paypal}prestashop>paypal_ccb168b5a6a86eb100dc2dee754a316b'] = 'Raison:'; +$_MODULE['<{paypal}prestashop>paypal_4f3acf5bcd7152fd301550bec6d0ffac'] = 'Erreur PayPal:'; +$_MODULE['<{paypal}prestashop>paypal_a0d09826326fd385f6ceb17442f290de'] = 'Erreur lors de la requête de capture des fonds'; +$_MODULE['<{paypal}prestashop>paypal_e03187f3f9d6eda06a2a7c201f58cdca'] = 'Erreur lors de la requête de remboursement'; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Message de paiement n\'est pas valide, merci de vérifier votre module !'; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Résultat de l\'opération de remboursement:'; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Remboursement fini avec PayPal !'; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Erreur lors de la transaction !'; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Résultat opération de récupération des fonds:'; +$_MODULE['<{paypal}prestashop>paypal_5a05744b8ccb5909bc83355092e0f3fa'] = 'Statut de la vérification :'; +$_MODULE['<{paypal}prestashop>paypalconnect_d1f14cc4a2dade80c92421d26422fea0'] = 'Ouvre une nouvelle connection vers'; +$_MODULE['<{paypal}prestashop>paypalconnect_94a27811a721ef512ad7bfa06cab34e0'] = 'Echec de la connection avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypalconnect_70215486455daee13382c68b1a230b82'] = 'Connection réussie avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypalconnect_e4c4ad49bced42265b5facc2175cdafd'] = 'Envoie des paramètres :'; +$_MODULE['<{paypal}prestashop>paypalconnect_445583f6641da98fc7ac8fd9d13a564b'] = 'Echec de l\'envoie avec la méthode cURL ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypalconnect_ef4fbf36eaa2083442d386990ba063c2'] = 'Envoie réussi avec la méthode cURL'; +$_MODULE['<{paypal}prestashop>paypalconnect_bf059c9751bb1a20b449b7917b1df374'] = 'Echec de la connection avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypalconnect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Connection réussie avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypalconnect_6e9aa4cb541e09b07602d4ea96080811'] = 'Echec de l\'envoie avec la méthode fsockopen ! Erreur :'; +$_MODULE['<{paypal}prestashop>paypalconnect_842a183be225d415b2b4375ba1dd1c94'] = 'Envoie réussi avec la méthode fsockopen'; +$_MODULE['<{paypal}prestashop>paypallib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'Réponse PayPal :'; +$_MODULE['<{paypal}prestashop>authentication_cd42c6dd6cc4cd65cb5e13b729050469'] = 'Vérifiez vos informations'; +$_MODULE['<{paypal}prestashop>authentication_6335a00a08fde0fbb8f6d6630cdadd92'] = 'Vos informations personnelles'; +$_MODULE['<{paypal}prestashop>authentication_b78a3223503896721cca1303f776159b'] = 'Civilité'; +$_MODULE['<{paypal}prestashop>authentication_127469a6b4253ebb77adccc0dd48461e'] = 'M.'; +$_MODULE['<{paypal}prestashop>authentication_29e32764941c30d1bb41c601014fbdbd'] = 'Mme'; +$_MODULE['<{paypal}prestashop>authentication_20db0bfeecd8fe60533206a2b5e9891a'] = 'Prénom'; +$_MODULE['<{paypal}prestashop>authentication_8d3f5eff9c40ee315d452392bed5309b'] = 'Nom'; +$_MODULE['<{paypal}prestashop>authentication_1e884e3078d9978e216a027ecd57fb34'] = 'E-mail'; +$_MODULE['<{paypal}prestashop>authentication_dc647eb65e6711e155375218212b3964'] = 'Mot de passe'; +$_MODULE['<{paypal}prestashop>authentication_bf2957630c4209f61a388a08c2154915'] = '(5 caractères min.)'; +$_MODULE['<{paypal}prestashop>authentication_aac772216aecbeca0e86d06671fe985a'] = 'Date de naissance'; +$_MODULE['<{paypal}prestashop>authentication_86f5978d9b80124f509bdb71786e929e'] = 'Janvier'; +$_MODULE['<{paypal}prestashop>authentication_659e59f062c75f81259d22786d6c44aa'] = 'Février'; +$_MODULE['<{paypal}prestashop>authentication_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'Mars'; +$_MODULE['<{paypal}prestashop>authentication_3fcf026bbfffb63fb24b8de9d0446949'] = 'Avril'; +$_MODULE['<{paypal}prestashop>authentication_195fbb57ffe7449796d23466085ce6d8'] = 'Mai'; +$_MODULE['<{paypal}prestashop>authentication_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Juin'; +$_MODULE['<{paypal}prestashop>authentication_1b539f6f34e8503c97f6d3421346b63c'] = 'Juillet'; +$_MODULE['<{paypal}prestashop>authentication_41ba70891fb6f39327d8ccb9b1dafb84'] = 'Août'; +$_MODULE['<{paypal}prestashop>authentication_cc5d90569e1c8313c2b1c2aab1401174'] = 'Septembre'; +$_MODULE['<{paypal}prestashop>authentication_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Octobre'; +$_MODULE['<{paypal}prestashop>authentication_7e823b37564da492ca1629b4732289a8'] = 'Novembre'; +$_MODULE['<{paypal}prestashop>authentication_82331503174acbae012b2004f6431fa5'] = 'Décembre'; +$_MODULE['<{paypal}prestashop>authentication_6f6162d3a052bb330e9c60285c74c6c9'] = 'S\'inscrire à la newsletter'; +$_MODULE['<{paypal}prestashop>authentication_ac135c86084a47630c9eadb4edd5ef75'] = 'Recevez les offres spéciales de nos partenaires'; +$_MODULE['<{paypal}prestashop>authentication_455175f3f5be6306247babb349c0515a'] = 'Votre adresse'; +$_MODULE['<{paypal}prestashop>authentication_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Société'; +$_MODULE['<{paypal}prestashop>authentication_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{paypal}prestashop>authentication_783cb853aae6984e51583b3bb80c09d2'] = 'Adresse (2)'; +$_MODULE['<{paypal}prestashop>authentication_9b514b51d03075005814a33edc74c958'] = 'Code postal'; +$_MODULE['<{paypal}prestashop>authentication_57d056ed0984166336b7879c2af3657f'] = 'Ville'; +$_MODULE['<{paypal}prestashop>authentication_59716c97497eb9694541f7c3d37b1a4d'] = 'Pays'; +$_MODULE['<{paypal}prestashop>authentication_46a2a41cc6e552044816a2d04634545d'] = 'Etat'; +$_MODULE['<{paypal}prestashop>authentication_0f68b904e33d9ac04605aecc958bcf52'] = 'Informations complémentaires'; +$_MODULE['<{paypal}prestashop>authentication_fe66abce284ec8589e7d791185b5c442'] = 'Téléphone domicile'; +$_MODULE['<{paypal}prestashop>authentication_41c2fff4867cc204120f001e7af20f7a'] = 'Téléphone portable'; +$_MODULE['<{paypal}prestashop>authentication_6c1c4d5a22e3d6ed8385e7287233396f'] = 'Donnez un titre à cette adresse pour la retrouver plus facilement'; +$_MODULE['<{paypal}prestashop>authentication_ae7bdef7fe2bbbbf02c11e92c5fceb40'] = 'Mon adresse'; +$_MODULE['<{paypal}prestashop>authentication_a0bfb8e59e6c13fc8d990781f77694fe'] = 'Continuer'; +$_MODULE['<{paypal}prestashop>authentication_19f823c6453c2b1ffd09cb715214813d'] = 'Champs requis'; +$_MODULE['<{paypal}prestashop>login_b40ad46c25c153a3d2fde078c0e1b0f8'] = 'Merci de vous identifier'; +$_MODULE['<{paypal}prestashop>login_abc57016a138dea055e0d8be6358f84e'] = 'Email déjà enregistrée, merci de vous identifier !'; +$_MODULE['<{paypal}prestashop>login_8b5dd64ab8d0b8158906796b53a200e2'] = 'Adresse e-mail'; +$_MODULE['<{paypal}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Mot de passe'; +$_MODULE['<{paypal}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'S\'identifier'; +$_MODULE['<{paypal}prestashop>login_01a569ddc6cf67ddec2a683f0a5f5956'] = 'Mot de passe oublié ?'; +$_MODULE['<{paypal}prestashop>paypalexpress_b601224a2a6c61f38738ca903fb019a2'] = 'Panier incorrect'; +$_MODULE['<{paypal}prestashop>paypalexpress_ee9dc1e678d54c517f481583c3fb2db8'] = 'Devise incorrecte'; +$_MODULE['<{paypal}prestashop>shopping_cart_aa91004934e1abdb620b5d0f0c18681c'] = 'Payer avec PayPal Express Checkout'; +$_MODULE['<{paypal}prestashop>submit_528d1f824243db48e40cb6223d32fa06'] = 'Aucun token donné par PayPal'; +$_MODULE['<{paypal}prestashop>submit_795277047da13b4fc74e02e050b1a675'] = 'PayPal a retourné une erreur'; +$_MODULE['<{paypal}prestashop>submit_b4133f1ba03a914134a5281a08231078'] = 'L\'autorisation à PayPal a échoué'; +$_MODULE['<{paypal}prestashop>submit_4935b58d37fda5bd60acc510cb324342'] = 'Impossible de trouver les informations du compte PayPal'; +$_MODULE['<{paypal}prestashop>submit_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'Le token fournit par PayPal n\'est pas le même que celui du cookie'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer par PayPal'; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Payer par PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Payez avec votre compte PayPal, carte de crédit (CB, Visa, Mastercard ...)'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Payez avec votre compte PayPal'; +$_MODULE['<{paypal}prestashop>paypalpayment_ee9dc1e678d54c517f481583c3fb2db8'] = 'La devise est incorrecte'; diff --git a/modules/paypal/img/AU_pp_express.gif b/modules/paypal/img/AU_pp_express.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eb68d2fa33a1786301c97c25fbafc4afc0781b1 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/AU_pp_integral.gif b/modules/paypal/img/AU_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..064afc62ca9e0352f3641a0c75090444c3f51c9b GIT binary patch literal 5490 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 I1OdJO11be!7ytkO literal 0 HcmV?d00001 diff --git a/modules/paypal/img/CA_pp_express.gif b/modules/paypal/img/CA_pp_express.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eb68d2fa33a1786301c97c25fbafc4afc0781b1 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/CA_pp_integral.gif b/modules/paypal/img/CA_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..b3fbc2cfd38e7a56cfbdf9daf94b37951034c205 GIT binary patch literal 5253 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/CN_pp_express.gif b/modules/paypal/img/CN_pp_express.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eb68d2fa33a1786301c97c25fbafc4afc0781b1 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/CN_pp_integral.gif b/modules/paypal/img/CN_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c244ca2bd9faf4a4091907683f9f978c576acd3 GIT binary patch literal 6495 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 B)Oi2^ literal 0 HcmV?d00001 diff --git a/modules/paypal/img/FR_pp_integral.gif b/modules/paypal/img/FR_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..2559e80223f092eb5caab7fde28fecfb751b458f GIT binary patch literal 7046 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 I8iQE>7sQ7k)Bpeg literal 0 HcmV?d00001 diff --git a/modules/paypal/img/IT_pp_integral.gif b/modules/paypal/img/IT_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cd6475f5992cdb7ea5315170df8c2c846fdd583 GIT binary patch literal 7069 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/JP_pp_integral.gif b/modules/paypal/img/JP_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ae0a063a2add571eba59f030fcf8c2e2818da23 GIT binary patch literal 4563 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%0A>Oce! zt{@8!&aA`>Gqs&t;E^9%Q4vf~?11Qj=J`s|1Cw4mGsON$!_Y+*{hh*Irj;O?ccCK1 z!n&_ZEu%f1VQ!H%m$dV2TELQ4`Z4o(NiAeT(>A?y0uQmbJAC~YdsHBkbwkMUe2Sky z-^JtQy=*by6Kl|wm#T+sip6`mm4j&hfe5NvN-^;@by+&Tw1E`g9`KOd;>X? zmfZ3FF4>#$QaRtH+0eRNem{&NV?>eCKlUS} zuV1L@NFckjy_FrToRuAhxwkm*TNXzN8WTay`h7a+bgZMwz4Ul}E38cM1z)2mW}>}1 zOOD`8(N=BaIa$x&XD&J&z!pjn$s?Do+~G(ooQ!5J@s4^bVpmK4i;KbWm(^3@2uN7! zu1nN>Tn1M}2eouM4y!E?lUB8R7*b4XDnr*nGb_l2sO@k8pgp!9Z{UYmFFX-4^7iJ$ zz)3Lj&QA}eHIDfvhpbV-ui7raHDEFo#R6>e}NTUL+5L0W#I zZX0X>Ew@4`C&M$j7J0715Z0*ddXNZ@z%ouKb5+oH3mo*_j@(w~V3@N>dpw3wF>EeO z&C^k8|FI+VU1SBjg(Up}abgVel=PEmChgY!qa++z;rYr-w=^+Lf{&EJMG}akWeJh| z(DN2&j9}Zu~9^QZVv`i%}NA59RZAIPLq> zPMYM8%~3^P@R2GbD~!Qq4^B+kGP4;^ODs`4eW{%x>Ip{@2pSglO%e#)of2+$zGYvx z8k&q$Gq>M{d{h*&JeTOlw%_qKbgSJB*vB|D5mVq<9Olz;yr;bpvqo;ht<1%%gNlEM z#yg~Sk7xAh!%o57k&db%xGmk)r=@Y^R+W-63KjuZenGZV6=9PV-sPzOg>Ex_ETo*Z z)q2OJ6J>TZz!fj*Af3{w8rEXkN%o5^(~(jU<3*^`k$)rYd0x(F4$3EXxS}pPku2jO zmeBC!s5L5CbJEo&l*lK+H2t96PwTnI-Wf}z^KQS<(LY_hk9y$%=##1xo-Kx^5*^6g^WRU7#*^K)e!#Xqi>}IcBGjtox5ku1ZddFQ0 zw@CiqvH1s^BLr76i)_cS!S8{s8)F9|V$$%n-*z~^pIE4y zXI_C8f!+rpyz5$1Rn~k#O6|ARfGbrI&ldCQ4~fop-TdcA?6N~?Tu=Gn`iML9jf1M4 WNXh!$rvX-lDRqnaUYleX%;tY#07n%7 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/NL_pp_integral.gif b/modules/paypal/img/NL_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..54d37f1fbcff2b2fd7969f15601bb0b7ce74607f GIT binary patch literal 3452 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 T2gA5=cfZ!i3y+f1R5Bq^~ovNyA zYI=Efb5Cz`CU_kQZ+zn1F(>^V+tX9;6&{tJ>QVq*MQ-?P)1Tp$qUfr4li|qUV2z^IW^>HN+An$UIUXa zd?FG*3fQ2E1Ukdv)i+}g_wPG%15}xUYEx=*a^FDb{P%aE0ghR7G zbfhiix-EESH9RrreD)NmGzQ`&c>Ud2mLd391m35^;wey}4-emmR|jCxG`!FWZ;XPc z7RyVYIlUwBNItyM1FsH_@gIVE*WVeHU~2=g9bxeVESiMZJ_4=}Jlg;ZKfvD_z;HIa zK1{IoqUCb{+llPr4(3{%uh7B2BzU|8JTc0rTEoIY@IDh3B!s84y}VAs;u&~jd|`Pt z;Pw-EZHSu5N-1ps6}q75)V^cq!Atvq_^LwwuG0u$zBmer<-8p(ZUBd z7`O|%BV58Cz@m@viU6K@4o_8{xLHOx7FycS2cD4ukihG2;ZND{SP?u|2QPL2cx!=u zL7sdC7Ego6x|FbdYMA3#^#x9@S6`WD^?fh!lmgzS*1j49U<<&Kc|l%t+fxAGvGI=t z`yhCw56pFfs(tel4Wr{dK=h@#Ch7CH#e%X@SUi?j#oBkmf1hi}LQe+#y&0^I0pVBb z-#+t0WuWb%b7;as2?_qz4llG*Li6FFls;Y+s6TP%@vE#VE~t0Dn_mDrL*b=9S^;PD zZS_KL3K&dX{#5sQVsPR6Xx>96sL%tC_keP3(||0$KXQOv&U~AxfDC*I$o=A-C=q8rfNKN ztB-2NXm#QpQZVvG{`tn~-mHUsr41H)B^j@UaSmu1-S+vrl zt-YCHKD-zN#xjR^cemFsEJa`KiQ+q6JKQS+rN4Hoo-cQM;(4SiKZsiF{@QY-*9$%T zg71o8s0*{)gDzKkTV1zHeN!4Kw3O06SvtYH<6f&XyBcg26D!E{95K_eN{_7s1>8=i z{hliZTZgn?-Q5%}PH`@BgX4k%uHzg1#`9De3fkQb$iCvX_~6 zwt|CTYH8ghX@h@yvZ>he|%q-$v#hL~<}jsRS>!V3kbvwyZ>L z?8f{i%1+Whz1oGqR9(p0R*Ajg!8%C9FMilikWadP@<- z?{@5ZF{VTxO>?^acT_RzFck;bB#>i>?i!0ASa&NInsv~AG*0u<3d z2E>D$qo_$~gUA!8>k2d-(H-lYp_ZWQSNAvl@Vy#mAi&ojl;M|NQu)=Cen_vMbKchK zCsG(ee)6KU+)&uACzslcuJhY8#EbEiXG}6!M)0(dOVE3f&n~1U16%8hi9DO$l`d4% zM{{xiV0{ciF;jA(Z)oCOrRe0^nM{o{^M3F`oOGr`yL`aGQk;np})m|Esy>Ajg{)4$d^1z ztRl%4rt{2@1T)CVTZSDGOfUKpM&ymDMd3U-7gt+W5{M)rjWN-;q$w6f6bKD!Zr}B(l>HtHIlvafQ zw4-Lo$VwIOdMidwM^3C~sJ?17x|}{paJp7WcJT3ZWHWJMmss*M)~V>Yma@Er1;@{u zYDOOJg!x=#v?l2^mUWDvMvDDuAY01Mo7RXYwVT(!iQQ3NEMrZ1WzwF;&`g;8Mb*0% zV>uD)SB^m3?5Er;q+wA!8Up8VOFoW-GA7ctT^P6iiRXe|$f%mS$fkIPPw&>$gCMl)0+fNKSsUF1+96FhnDCe)bCl)&VBqFl1|^JA97+W zhe;<~3X@Yq%l|&;;tS2Mp{mBzgN<;M+P;&vPca3k99ak{VLyLyrD^*C^CA|9_55h# zhosZf1+tq%>o2H<7wlP@BXf6!(0XA?=!#9?t~4%$d!6{#%G4ONoy`UR(x}BPP3N#| z#aU?3D4$%5qi9{WD*%q-^P!VL*W@p`0aK4pcA3)+Y3xBL1McKO)`&2@R-b4 zL$!IGT*>A;PH})zON0!JKm$x=L_pHBY*!mHc((q~Kq_Dmr8ajhd92WKp zn>V)>XxkgdG0vh^b$Btsxp7jZPt^V^yo6lBOzS#tymFf*+!H!{QRQsV|7zCG1r}p= zV>bp4TCUtX*fe#9bL0JQF>7fZ7CBmAL*NIm*JK=-I|$T9W=4N0&~;b{blwz55riEX z(M!=OQG+U;f3(`itX`o;3OYu`L!9Q-BZRHFnbFPBKFh@Ume9y=ZF!r`y3rfY_eC$c zaU^XZW-~rCMkK{q=Tyf?4w0kR%Kc2sz&*!nVr;*5~O92;P1OTK`>7&kJ{;isgna{5QAedMC zC}`{2;Qfp@W9@w-(lTIU{`>tW?b19zx;%BX_UFdRbXVtx!wI!(!%vPvEcMg6*2mf( z`nqqAY?Q7qmx(@}ZJ+9izO+8srD@^6BeZ6RZN#Ob7em6EI|K74${lA<$*)ODHx_?N z*XGxT9*RfiZzkOCn^*$eZ?hh}-B=o5A8E+0`2+v~zut9wk!Wk*O0;tOzE8|cS7-kj zoT3Zb9Ipzum3#$&vz-G|BeN^(qt86bK5YE%8Tv8iar625OK)OOWpDprdaRFIP^z3< z=w3myvT_8yWqh?a%kt6C#slJ?`DNqS=XI}YE+*aiGc*5Zc`f(J8#%d%gAqkEZ>Hac z>u=vxj(i)$BE4fE1XGAJ@ls_aDBo+g{W8rQ?OU=^j5Wu*;X@wGjE>6!ryuVk=O9#h zx}?Xky!Y{H0@2`gqC*jOOLvNCLe=Mrr$dhi{%GF*tbjT_KiD?U!f!18sV;12EpJ&` z+o;vcyRhia z-Qtqcd&2u=4<0@$e_T;n^`yF{wywUR@o7_Y%QMmQ*0y$mm$tY=+so~EzV4RyJzG5C zw*^}+Rk-@ObhA|KjH-6B79v#Kd)yTr>M(OLTv)}8ZQeEj9fQ~y=E!R_$nrXHD z?pK)PUQtPkSWo_QvWW~i4zGus7rD5o7iyaiV% zrJk@a{kyyQ4j^r!X&Q+Wt4)BK3?SV4MrTDfMjxshBtGdck12>cktj?~^@re&UMzlG ztqI)m&fBDC%Yo5-oV$1wFO(=-(UdKFiRa4gz!=zDoVTb7hs@EwC~Hs@bMtE;6`D@a zF^7N;=OSL>uaF@F{6lE2yp2G0R(6gqY3T}t@#blB<6bGioMhvN}|RGJt8P~a3R_ECMY_J^SG1f^#Ci|zpZ*B+MA zm2~_O4_QIbPzoX2Lma(?<>UVHtFg!c354InpQXuAoIU9m?bPND?aDIW^S5rWUQ9q4;~F+< z?AN`*B;zvSaUvdoT1yPaPJ0RWjySR;j5U>2%?2zQQsCCo8??&+6Q#I6Im>A+SDHT`Q4(#)ekiI}e z9f`H1;V&s5m~1j5-eOJJsc4W~u(M;ET$47`s4iyawfR5XsyC$X6K0086v^y63Ud2g zx6S6zx%YO4kLG%8e>d5`LzD3Hy+`-C?Cx`OkFDwTiVU6a^|XC7|Iuf4ZFm2vlV9gQ z1*WB2^t)%JU-%M|Gg)mQYq!pVMlU{E?2UtNwEiz<_Q2A&B-LA_LGI#Y-S_nI*ro6B z$1JZ5rW`(3Kb#SHYUxMJx0@*-JLlZWFX6rNm9d9)Q!C>YucjJDa|z+Cll4E#SErg5 zr&fQ9kfv+X?a(8uTWd|jSu>rc&!T7FeN#Lz`)_K@Z2vx=19Oc>e3};q&YH$a7rw>+ zUSIm56P5zXRsW7#EoqWksyg(B#jkq|KbEd9j^92gUCg?@YB9|)z;rW|E{jxeiP-!4 zMF@2vL#>#>l#P=>X=wUtue;1bFfmTUpCwPTYt)# z3G;v`S~9G`7&H`Ury#F5O`Ont-=~oh6`^+%pikYtLYw{EUyYVMFEVXFrb`rT}_3y!%TuM1Ter7AZ{ zJI)v&pCb-6vE5$n>(gANKRNMYAt1lmf6F#1WB@_c?a`3jnwZPm*8y=3bLb|@v-&6= z=fl4f+3NL0N}%|;@)(hgo3nz)dOTOw6Css3R=`0HMXNC!W;r|v8nisGibjVSxUYRu zs)hhB&nD|s-~nS45HN@a(4h+mh@FVP?X7>9UnfZ6G`xP{#32mKy#g+umy4@7VlMDP zmIN%~11uw3T3i)I}!sc z0@1yf(R9rOoo?pvWFMpWm^M4`C1b+u5}7yc97!F;DX{T`&@Yovsq|w>DN7RV;zRB= z-E<*845Rxk1^rqUpiiPGWZYZ1lMRtq4pTn@-{#{`Z~%fJk`9cWrgLERA~;DWLyp_V z!Zc|wm|j^gh?!m~DBoBlqRPTGmAYQtt<2vEw2WQATgf%}VUGMV&Q$ z{kZnPm@o#CR2+{YLH05r6R#LkKjSvT;%D~6%jCw=dg4`iObriNjee$Tx5F7cqf#HC zHjT&(1T1W*+CnCLnz3UkPKCt$Q^&%3#9w7GwZ&4Vd9GdR@S(~%xWzEsAGmUTn6{I` zR_$h)3T+(Jm^%q@!xjy;GQi8ijqAEU-MM*rF3r6OGRau-;KTaYkIf6vp zlVH7Pj&n{eC6fS67Q@vkFmFb3^k{-vfAUNqhijM0LIG}esb%%45BpQgmr^S*X;q}O z2V(f)3Ya$~tx=eIPY4)=1IX#L=O}I)f%_7}eU{68Wyfvx;JygrycKfAVs3|+`vJx6 z!KAm@aYbTy11Y^soc@OJGrh|rJ*hvfTbw>tpE1#&F}0L2jmexLWzLZ@M=t{gjLenX z%<&*_1I1kvXSU~Nf*t8F86Nb0CMuY>gyG5F=OI63DlKP1mNR9Rc?#HTtMxole;U>k zx`E;AVflD6e`_#*<1(LM#NT?KuTSP1{o)hz_}j=?rX75Xyez$6*LDN^1Hs^dUs)8a zz(z(uBMZ#zv$kUe4k-d+gMj8KuwBlw^Awyg5}dH-Q?XeG?FEMRf@YzSFFD)aGdqB+ n58-E@X~+)wlznbFI~<#Ho}3fqnRD?<&gHzEtM(`+0POoep#LhV literal 0 HcmV?d00001 diff --git a/modules/paypal/img/PayPal_mark_60x38.gif b/modules/paypal/img/PayPal_mark_60x38.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a5871650a7192df985c5435f75486f546c315a4 GIT binary patch literal 956 zcmV;t14H~rNk%w1VLSjP0M!5h|CuwDsI~m)!vFvOo3O(E`tkeYvS)UT8#ZM8?9BY> z#xY57{`czs^y4#Tm&eD%Mp=6O^4$II(f|DS`{uj<{rdj<_5c6={O7*=;ja7Sw*L6- z|Ni{@<+%Lo%E-gFw86;Z+sks2tc{kY*2KN7;nTTHcb>k* z!qd&bA^8LV00000EC2ui06YLD000L6K!9*aEELp zV5;y!E}PHjw0g}h3pwz(d`_?1@A$Z|!teY4fPsR8gndF2h>41ejE#55tzUx|-B^_P25v<>1S;%}1ZUB~ z!v-x)v_xkDMuUb9NMx*M??AWzmp&2bBPsOchz2?qbbEmFhCQ4Ca;S@et_F>BISe)s z5}~V7c_o4(C{bcXR}~@gAvh2L{Iv++mrrD;e&ToYZXdX}2>D?= zI0?bO%>a&$Id$DNZp2)1&II@F03=B8CPTk}<0KuRpLs&*_rN(l_~%~=k-ekBI|}M2 z#DFc#5TSl3=+i=ZE&Pz#fCK=B@SzL=1mMGk5>#eF3O|%6!wN25C`1A@)@b96I3}Q6 z3pw`aV~;|3Amorl7HQ-Rjmco-l1w%!q!0>3Ddm(@R{7NoRc5K>mQq5=C6_`m}aW!q(W%m>8GHED(a}DmTKy!LKvXxs;su^>Z`EED(kAL&T8we exV|bx2E6v_>#x8DE9|hu_PWHe$R@i)5CA*Ec=mMw literal 0 HcmV?d00001 diff --git a/modules/paypal/img/UK_pp_express.gif b/modules/paypal/img/UK_pp_express.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eb68d2fa33a1786301c97c25fbafc4afc0781b1 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/UK_pp_integral.gif b/modules/paypal/img/UK_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ad665efe13b1c0a23c5b53abd7e0a3b06d6ecaf GIT binary patch literal 7191 zcmWlbc{G#_8^)j6XUv#+Xt6|1X`#ZjqK&r&DK%s(WGvYdBV}wcBuk+w``S?1X;k*| zl6}imgh)fy491piW}ff;&biL-+~@k|KIcB?I`^e_QCCyTRu@JERsi72l`9?|9wyF@ zg}iJ)w+JwQA)2Tva^BiLowc8!lp&ME$ zn&}j;Oj^QEiUmFV;>+LrM}gz%!m%>puh;KC4T_hB)zs9)YjZ7QORD#)jSgNGul}+9 zclyz*I%s2AG*##9nyq%HwBHjH{b>j);EMl_ix&o`y13CPC8EiXZA4HkT;jC-mXeaX zXb~1y)+Zc&7uq^0n&bYSUZiKXnpaJU|Bi}9>*Gu7;`KSo#k=B_KLf+FO-)VD8^^`- zeWIB*;YfjUU_*09pMB)p_MbD^_a3ub#_aFMXIFpw^7-5R{8DS@=)&Z5OZVUHiQUT~ zWKo0F!t&~SI6?Tk*dV_BcGM@~*Qc+GzducDKI@tP@yq1p_v6a1e#Y1EEb_Y{@w$-r zdW&7I@Ha;&6n6HH<^7m{kz4a!U1fB1H1^Bv@A2tlu*+bH(=n;quC<|-C$(-C1aUYN8@jA*o_h~EsY&*#5y6!CHleP4+;783HligaJ_0FiJc_GQ1Khd~}bJ-3pG9O+?epV&NL+$jOhz4N==Q#mm2oD@U6OOMgUc{uFw0 zbao9It6LtfuL@15VZU$wIwc$~&~+-dJ#}T^eY$vYD57MbAf>7-E3@oFSNQ?_YVwxx z>6!Zh?>f3CR}!@V0O$Y!2!eL5A^)2J;Nbu9|4aZ_2!L=3`W$xML+qygRxO;&`fyOm zAWgp{tMQ5K5!b<%l9$a-$>$y`TzvbgHCFjrzE$hn*X@ZE`?j=;@3K2nHNE}}w!X{h zdZF`BLeb!T?w6PPvHPvt-sgSGp}sUoHz>{TDX@6w`m^mmE%ptqGT`V!c42?9bG3wQ zW0|U@isA7qJ1>;0Sv!8+ZcuQ$CTGT}~Ia2s6-a^INTF&q3-@3h^OUR>RHlwz#i zUT^iEDg%q{_X=!jWo74&9=d4>F`LX3;g6cPN|~lnWgOr;&3m`yKKti}7o>S8Gf<&y zH_g(nXFkI6u(Ke-4*sBJEB#JmBTDLy$|A}2m5+cVv)xMbm-ap%wt|fO*Z9O3#jSb9 z3W%~t^-m2a_YQ=_moEQ|eHqb|65##u5O>>meI-NIs}Hv4t!L$2950sdQDIuN$wnk? zu6$-5Zs}Yzu~bLlRJ)nfCXgzBP-m*hhb+b%e+R zd`<(}63ow1T*{4ttDInE8584v{3HF`c<xX^4Pbc>A*S%Cfw>=wIOC87!Z!q8Q85ody92u-C?7l+5CxQl_UcyhYWTke< zAGLd4Z#_7o<5e0?B{60-RRS^EZVRo-IfaKSq!KMz?DNV_pp1Kr^k7JlZvWOag~fQ# zpJ6C*z1e|kw$P@(uW0G($lE7v->%}7O65&b?MmgTPKL*N{<(Ljw1@i8RPXx@Mj1~b zn^p9;mzw(g>UG_uEZyFFjOfQIpSbCzLyR0qwAAai@?iOUs89Otsctv+TBBM>? zQ^0A_Y`wq7{X={iFaPzj!J%r^+V|?hxdpwT!2N>hGap7~ympA0`)Y(2-Y{$HZRYwW zPQoQ#`u=NA=IvfR_9HlSN1nb8JU8d$pFK3D+^Y=CF)TsSm9nMtNG2}te5m9J59a=; zOuU}{S*a{Ar0U4h=Adc&_J=(2M?F+srCcYcJhl2cD;;)bil4R4CgJ+IOR zMx0aNiQRka$+M(zC7~iQ(&DV*4S|wSCs@8Ww@JRjGa5&Kxy{f5Vb{ z)@O(OcXI7kj_TtVub3&k+cMehcwk%$>N4eqq>E1N)&7`#**hyX1(Uw_z_?sjP}rt) z@J{Y2%n!Wxc!?ardi->}%GC!=i|L&@jtBbk@DauD(wE~VPbXG#Z}x3UpYNW~)vo;F zSDcll{9x~)lb=Ya)$W{DtSdDrAIOxypL^c$k5RB+clNIPc^8hk8t2HH<{F#kUN%Hu zi_hRNGC%rHMf?8o-VY*pX_gw{<}5m!a+yLZT%fL$~aLXzSEwK zzWO1%lFal%d-EqZI`5XfW8EsW|0nfF1C(L*KE3FmgZia`-Vw8s49PmzaQ}ghn&TB8 zdx|`~QU|+;IwQ^+%7pT2uQ^izp45`shao+Ny8N zegCvYFm}PGeA|;AyWXnR^b2adb{qbQ1R22FBM=raB>G!k6SMrreq!5A@u%J@AchjC z$bSrf$*6m){D#rnZarh{^I>h-UCpQD$9z>{_3vl_!>P_@rDmn>`yI+7>z#O^gzUdD zV{-u|+iZbf@DGAxZw|VD`MIU*)5jl@bXC8DLyKQ~Kb~)FH*geX1@g-?v zs!nU|H1S=Z@{U`F!>_lSpYck0SNKyc^*Yq)p}UyUWd*;^yq3`_LU*eS$gRhJ3qi8+|QT%HAe+ z@*PiZ^mAj%-sc$3xLR)f=qzKtQUCN*ChGUVZy==Nf@kF2)Q!Q(E9F(alJ1^Q{1rqI zSm+R=RoGqSvBCGE_^oRsXaz}H5j)wgMQ@R27&x<5UT4F(^F&~;umjSsY||!7U@C-TYUTAP$3WQ0TH)AFGVD|tj3j+@ zWL({5t!)E#594EpK-MB*$9Xum#t1x8@NkE;XYdQe#~o*{R-z1^FUR2nc3VThCqpLl zZ7O@1^i;D^HO4dA;}l;aQkNW~!>H;C-ebK(ul2yEr=*s1+x@TsJWJxD?(QtSSpUO_ zh#s66%LAk$K8z~SneKpSj!6>!iX<*d(n4Tt(rE;x1eUn%=6vo-_>MyHLLg1Ntgd`< z90jesd2(J*(OXY!x#|55svQPj_%y0#%uBfipn`Hlzev&qD}aaAh***IK12YRG}&PN z$OT9o{P9}o4nJlvwAxHUe5w}0^RE88gAc5=R%^otDzw&GyL>TLAwX7__9TuLzLfLt ze33@bh>ZX4oy?Ja^eGT6A&Z`(fZG8)hese`@%i&4Ga#5lLF;})*aN{xTPB6$|8c^< zHpjcZ*So3QlWYNcfxs6%4-Gow3kUxN1L)DE(R~m2aKuIK!;6%_@kFdRG4P-uP}c{b zOguD5LZ&frFLHv`n$ba&(7Z$}OgYd%leniO^vvpgMGh(j45N_2W-5T<5pG!k+qnoA z=P(ov2J2)LhwLGz4i# z2?2yGB{D7o78)LCk`$=B8aO|3*T5n&Ej);deZ*o#K6dgVa!F?_B6rkAoVJK83ztZ! zC8clyh=z3ULwuu!od)pk`e-*Q01tlRu8BsJJdUsM{}2uka>8%x1-O^PgET=H(?dj! z2wM#y(-{z%aZe9bDImFn*ak|B2^|^CLqj@*QGJ4`fK*3ER`c-pbr@a@q*d)BSpe}= zSxU%4#_LC__F}V>d@fW(raJo)K~|jpy$s6ZH4G_;@+`ufrPfO#M8X!RQden&CfZSn zXU}A5{t$qFRZFrJknCw;wEs4)k{oDZpUI#X7VT~U^g_Fy+n3V`EB>T?o?Q_k+hlON zRKOnR=sr!bg6u&C2@r_Y0N`C355AD&>wpIlSm22ufDFJ*$Pq?3_~-BlV=ataGEyWf zC1k=*aTDBI5vuz_QOSN-Enodfz+)}p{7NX87vxV#jP51*_9tvxBhX~S9#X(Fv@l;D z+)-Z=q7eq^v8*-Hab8%w3iz-;VYdqkr6Xa zE(s8j04^!`zy4o~ujAoG5CCrgp4uHEhZ7;QoP{uXv zj1E|G@wwV{z=xNN;;LV(eZJKv){QOynHFZx3gc8J?-Jn3D-jSGevga|A;Ym8#7QPH zl!?5`L^lbLS^|<5fG(*_TMdghbOH6`JWME~fNBw2 zs4$O6moZA>Mkos%*v6bV)JrPa#WNBh|H5ghkV2KxP&2`f}3vu%>q(U{}V@N zC5TeEMF)FN2UERTrBK5hcS3%UG069rTUve!P!94_+cs-C{%EQBG`-3$- zV6@jVOqBOJu}?^N#tQ+&L+q?48*n+-!JFE|Q z4zUYRloX_A>6Qao2Yh2abHkAHWez-;e10LkuFQY~Kss1D2ME!@W`Yt!5*Vl!8>NFa zq9MvH&%S#`edJXXKlXCGI z^oRB-<>uQ;_{OjnCSizGJ;Wr)4WPEuP$pbrfB<;FhS^aigXogdAflIv8l$5~G~_cU z;<65^mx@WCqA+B%Ef`e(q`C^4mOPF3(`U<@QBk@S^mZ~X-xkTgjWi{r*L6_O0UUqZ zdp;Kf>A+0}NWV5d4zWrR^93jt>?~OJ>|z1LDRp1X)R2zq<0PSI1cX!#bRerCqMYIq zrVF62kkQ*&Va+@wW4aIytF82}j-tU&vWnC$V^j|ok32>nO~Wj*5SnR-W;T+yt>)SZ z!XIVOo$~sk7C0mCK_=t$c=#GR^2sFH@YF*SFuj_>sHQiLT_jXc2=#P^7Y{$TN;+Lw zy@gyttRoq4;jSN=R9PiKG$fxY83AH<_@g2zXj7^riAkIm08|h$!X(PEQL>bGy=W%)LXpNTLLsUAg-RAy=c||udCD_45$ZzdLI6t0I(W>|J@Jj0dR*l z)a+_|ej(Cv5ESwxRRmo?I{dC5<`4}x4HE5X|2+;^FAX_NhL6#3@^r~1D%P5eIIDvi zrAo?kF@Na5C=EHuK}E}RVT!E;9jqNK_&E^%oYM9j{HB^G{||Hkmq2M_P;u&aaM4Vk zys9QxCjzyzuF|5t>Qt@b{;2Xl2Dtv5AbKhHF>~(+8|K?)Jmd= zEG&;bc(#Hq67(D)cO&cCB~F!X3U~#F=8^8sggsG`2&3L3BZg5`s3{4tL)+m#Xd6m$h2leZ*C>LBz++azkY)^HPs9Kh-Z|?S^K_*$QjiF z(v1@tTrGsnjO0cKDCELZ6h~4;gI?DYQ(NF_`$l%vB(f)b)vowmY6ko%UO^PEKprU) zynk2gzQ!ymIBz7y8diEYHfn=Z998h7Rq~=CERFiY3#Db*8mk2OB66WF9(LGClAoshWy0k^=_hvM(h+ z81Q9mzWG@MW<%hZD#RVe*O63cK#X`2&AltqNX&H_dDa`rB2E$e6RFCH$rbFpq^TIS zQIzNCAO%!U?smWrxts*cF4sZiKQS?}N;{{~ER2kkXKf_9W(uwbq}5h-deEi?vhfK| zUjM$#i!I1_F?i4w(=~W;O)iroa=@JOvmK-af@U>zr&i<=$E07nC7&pw@1&za43o;pa!scS5qvk405PxPlgOU5$u zT9zg<=62gIPt1<)=|I=|q}-fCe$zqQ|NG<$7~4>|tWb+n;>;`e%{Q;i?<6g_YJ)w@ zhDPSpNY+#yo&3GmWhxvvdcajRfJ(*mRb)B%m?nDqIB z(r4#{30-Q*bHbEgYeYKC*yfRTFLr$)pTnHVtXlop+<{7gF(C$;W! zo@=YED7EL0;BVK+g($gW?xU+7BMtDK7h-m+G_@wd?P+zpHrqGB=Lq=;0^-XY8VkVSK*g6X7hu0)se8}kZa}-(R%_umx5+Iv z;?8+3huiy%c4-GnTRXRuNqs3VQ73WFosG|zjel0jwDy;JFq}Wut)Oof#_Y2h68bKgy|MiFV0xvD zVCZyLj*X3j@M2ia<*M|P${v7Ho?6YH!6V$-<@|@UwMDC6V5hK3arCni2i^e_RK6zs>;>Gc(_fl}| z&61@qlq%h{&tOeZc9&-x$?~BZ{`_BrUq9u6pwY;m^{cfQL#Q|Y-VVa9A}I@ zfB$~3ai4JU`^`HhJ=YA)@06NgLm$NVYkR%kY;rMNwC9^)(4%-0Yn$b=&AN(;1(K#F zT4QmyzMftgyxVEb0DQigCjRuEx?euX_-!h4)A`38nVUgBA2FEBdFvIP7v_vC?csE3 z`C#yJJR>=z(@;h}O7cvj&7)pJ4IT{Ky0$rLth3yng&Vi95ASc3m5*J#vvSM%Y_^=d zzebtGP=ef*ir*3Qk|%h_<+sQv1%8OAKxAVas~$$YOz?Bfe;K$`HI<)OlQI?gE~etP zPbSgQt?=V^A3NX1Y`@#N`_u;brN6@b`IZ0bR=el*B*=Ocyh-?hfBCd5;sv_+=5Iks z|13{%jNl}kZZ(`7{(^d$pn!#T4Jcsgn|aWKzXJ^D!RqhCpuqL%awt%^*c%ii-dKTx05p|}*iC~; d`sg6{QiJghG=$=+4px^Mvgs8Wg@6Mm{|B%W!Xy9y literal 0 HcmV?d00001 diff --git a/modules/paypal/img/US_pp_express.gif b/modules/paypal/img/US_pp_express.gif new file mode 100644 index 0000000000000000000000000000000000000000..3eb68d2fa33a1786301c97c25fbafc4afc0781b1 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/img/US_pp_integral.gif b/modules/paypal/img/US_pp_integral.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cc5cfffc79be46c890c21bbcdbaccfdc0fcc286 GIT binary patch literal 6181 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 EADlAFH2?qr literal 0 HcmV?d00001 diff --git a/modules/paypal/img/integral_evolution.png b/modules/paypal/img/integral_evolution.png new file mode 100644 index 0000000000000000000000000000000000000000..2d20ef8df248f14c7632ef182bd914731b610627 GIT binary patch literal 18370 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ξLrqb@ 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 XS*0xvRlMrb00000NkvXXu0mjfxBW_j literal 0 HcmV?d00001 diff --git a/modules/paypal/img/vertical_US_large.png b/modules/paypal/img/vertical_US_large.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4baf775f2b97623663d6263a49b910690476da GIT binary patch literal 11877 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 literal 0 HcmV?d00001 diff --git a/modules/paypal/integral_evolution/paypal.tpl b/modules/paypal/integral_evolution/paypal.tpl new file mode 100644 index 000000000..256ee7e45 --- /dev/null +++ b/modules/paypal/integral_evolution/paypal.tpl @@ -0,0 +1,31 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + + {l s='Pay with PayPal' mod='paypal'} + +

    diff --git a/modules/paypal/integral_evolution/redirect.php b/modules/paypal/integral_evolution/redirect.php new file mode 100644 index 000000000..0822cd454 --- /dev/null +++ b/modules/paypal/integral_evolution/redirect.php @@ -0,0 +1,111 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../../config/config.inc.php'); +include(dirname(__FILE__).'/../../../init.php'); +include(dirname(__FILE__).'/../paypal.php'); + +$paypal = new Paypal(); +$cart = new Cart((int)$cookie->id_cart); + +// Billing address +$billingAddress = new Address((int)($cart->id_address_invoice)); +$billingCountry = new Country((int)($billingAddress->id_country)); +$billingState = NULL; +if ($billingAddress->id_state) + $billingState = new State((int)($billingAddress->id_state)); + +// Shipping address +if ($cart->id_address_delivery == $cart->id_address_invoice) +{ + $shippingAddress = $billingAddress; + $shippingCountry = $billingCountry; + $shippingState = $billingState; +} +else +{ + $shippingAddress = new Address((int)($cart->id_address_delivery)); + $shippingCountry = new Country((int)($shippingAddress->id_country)); + $shippingState = NULL; + if ($shippingAddress->id_state) + $shippingState = new State((int)($shippingAddress->id_state)); +} + +$customer = new Customer((int)($cart->id_customer)); +$business = Configuration::get('PAYPAL_BUSINESS'); +$header = Configuration::get('PAYPAL_HEADER'); +$currency_order = new Currency((int)($cart->id_currency)); +$currency_module = $paypal->getCurrency((int)($cart->id_currency)); + +if (empty($business) OR !Validate::isEmail($business)) + die($paypal->getL('Paypal error: (invalid or undefined business account email)')); + +if (!Validate::isLoadedObject($billingAddress) OR !Validate::isLoadedObject($shippingAddress) OR !Validate::isLoadedObject($customer) OR !Validate::isLoadedObject($currency_module)) + die($paypal->getL('Paypal error: (invalid address or customer)')); + +// check currency of payment +if ($currency_order->id != $currency_module->id) +{ + $cookie->id_currency = $currency_module->id; + $cart->id_currency = $currency_module->id; + $cart->update(); +} + +$smarty->assign(array( + 'redirect_text' => $paypal->getL('Please wait, redirecting to Paypal... Thanks.'), + 'cancel_text' => $paypal->getL('Cancel'), + 'cart_text' => $paypal->getL('My cart'), + 'return_text' => $paypal->getL('Return to shop'), + 'paypal_url' => $paypal->getPaypalIntegralEvolutionUrl(), + 'billing_address' => $billingAddress, + 'billing_country' => $billingCountry, + 'billing_state' => $billingState, + 'shipping_address' => $shippingAddress, + 'shipping_country' => $shippingCountry, + 'shipping_state' => $shippingState, + 'amount' => (float)($cart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING)), + 'customer' => $customer, + 'total' => (float)($cart->getOrderTotal(true, Cart::BOTH)), + 'shipping' => Tools::ps_round((float)($cart->getOrderShippingCost()) + (float)($cart->getOrderTotal(true, Cart::ONLY_WRAPPING)), 2), + 'discount' => $cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS), + 'business' => $business, + 'currency_module' => $currency_module, + 'cart_id' => (int)($cart->id).'_'.pSQL($cart->secure_key), + 'products' => $cart->getProducts(), + 'paypal_id' => (int)($paypal->id), + 'header' => $header, + 'template' => 'Template'.Configuration::get('PAYPAL_TEMPLATE'), + 'url' => Tools::getShopDomain(true, true).__PS_BASE_URI__, + 'paymentaction' => (Configuration::get('PAYPAL_CAPTURE') ? 'authorization' : 'sale') +)); + + +if (is_file(_PS_THEME_DIR_.'modules/paypal/integral_evolution/redirect.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/'.$paypal->name.'/integral_evolution/redirect.tpl'); +else + $smarty->display(_PS_MODULE_DIR_.$paypal->name.'/integral_evolution/redirect.tpl'); + diff --git a/modules/paypal/integral_evolution/redirect.tpl b/modules/paypal/integral_evolution/redirect.tpl new file mode 100644 index 000000000..3843b6aa6 --- /dev/null +++ b/modules/paypal/integral_evolution/redirect.tpl @@ -0,0 +1,93 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + + +

    {$redirect_text}
    {$cancel_text}

    + + + + diff --git a/modules/paypal/ipn.php b/modules/paypal/ipn.php new file mode 100644 index 000000000..ec0745a7e --- /dev/null +++ b/modules/paypal/ipn.php @@ -0,0 +1,80 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/../../init.php'); + +include_once(_PS_MODULE_DIR_.'paypal/paypal.php'); +$pp = new Paypal(); + +if (!$transaction_id = Tools::getValue('txn_id')) + die('No transaction id'); +if (!$id_order = $pp->getOrder($transaction_id)) + die('No order'); + +$order = new Order((int)($id_order)); +if (!Validate::isLoadedObject($order) OR !$order->id) + die('Invalid order'); +if (!$amount = (float)(Tools::getValue('mc_gross')) OR $amount != $order->total_paid) + die('Incorrect amount'); + +if (!$status = strval(Tools::getValue('payment_status'))) + die('Incorrect order status'); + +// Getting params +$params = 'cmd=_notify-validate'; +foreach ($_POST AS $key => $value) + $params .= '&'.$key.'='.urlencode(stripslashes($value)); + +// Checking params by asking PayPal +include(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); +$ppAPI = new PaypalLib(); +$result = $ppAPI->makeSimpleCall($pp->getAPIURL(), $pp->getAPIScript(), $params); +if (!$result OR (Tools::strlen($result) < 8) OR (!$statut = substr($result, -8)) OR $statut != 'VERIFIED') + die('Incorrect PayPal verified'); + +// Getting order status +switch ($status) +{ + case 'Completed': + $id_order_state = _PS_OS_PAYMENT_; + break; + case 'Pending': + $id_order_state = _PS_OS_PAYPAL_; + break; + default: + $id_order_state = _PS_OS_ERROR_; +} + +if ($order->getCurrentState() == $id_order_state) + die('Same status'); + +// Set order state in order history +$history = new OrderHistory(); +$history->id_order = (int)$order->id; +$history->changeIdOrderState((int)$id_order_state, (int)$order->id); +$history->addWithemail(true, $extraVars); diff --git a/modules/paypal/it.php b/modules/paypal/it.php new file mode 100644 index 000000000..192aac3d7 --- /dev/null +++ b/modules/paypal/it.php @@ -0,0 +1,227 @@ +authentication_cd42c6dd6cc4cd65cb5e13b729050469'] = 'Controlla le tue informazioni'; +$_MODULE['<{paypal}prestashop>authentication_6335a00a08fde0fbb8f6d6630cdadd92'] = 'I tuoi dati personali'; +$_MODULE['<{paypal}prestashop>authentication_b78a3223503896721cca1303f776159b'] = 'Titolo'; +$_MODULE['<{paypal}prestashop>authentication_127469a6b4253ebb77adccc0dd48461e'] = 'Sig.'; +$_MODULE['<{paypal}prestashop>authentication_29e32764941c30d1bb41c601014fbdbd'] = 'Sig.ra'; +$_MODULE['<{paypal}prestashop>authentication_20db0bfeecd8fe60533206a2b5e9891a'] = 'Nome'; +$_MODULE['<{paypal}prestashop>authentication_8d3f5eff9c40ee315d452392bed5309b'] = 'Cognome'; +$_MODULE['<{paypal}prestashop>authentication_1e884e3078d9978e216a027ecd57fb34'] = 'E-mail'; +$_MODULE['<{paypal}prestashop>authentication_dc647eb65e6711e155375218212b3964'] = 'Password'; +$_MODULE['<{paypal}prestashop>authentication_bf2957630c4209f61a388a08c2154915'] = '(5 caratteri min.)'; +$_MODULE['<{paypal}prestashop>authentication_aac772216aecbeca0e86d06671fe985a'] = 'Compleanno'; +$_MODULE['<{paypal}prestashop>authentication_86f5978d9b80124f509bdb71786e929e'] = 'Gennaio'; +$_MODULE['<{paypal}prestashop>authentication_659e59f062c75f81259d22786d6c44aa'] = 'Febbraio'; +$_MODULE['<{paypal}prestashop>authentication_fa3e5edac607a88d8fd7ecb9d6d67424'] = 'Marzo'; +$_MODULE['<{paypal}prestashop>authentication_3fcf026bbfffb63fb24b8de9d0446949'] = 'Aprile'; +$_MODULE['<{paypal}prestashop>authentication_195fbb57ffe7449796d23466085ce6d8'] = 'Maggio'; +$_MODULE['<{paypal}prestashop>authentication_688937ccaf2a2b0c45a1c9bbba09698d'] = 'Giugno'; +$_MODULE['<{paypal}prestashop>authentication_1b539f6f34e8503c97f6d3421346b63c'] = 'Luglio'; +$_MODULE['<{paypal}prestashop>authentication_41ba70891fb6f39327d8ccb9b1dafb84'] = 'Agosto'; +$_MODULE['<{paypal}prestashop>authentication_cc5d90569e1c8313c2b1c2aab1401174'] = 'Settembre'; +$_MODULE['<{paypal}prestashop>authentication_eca60ae8611369fe28a02e2ab8c5d12e'] = 'Ottobre'; +$_MODULE['<{paypal}prestashop>authentication_7e823b37564da492ca1629b4732289a8'] = 'Novembre'; +$_MODULE['<{paypal}prestashop>authentication_82331503174acbae012b2004f6431fa5'] = 'Dicembre'; +$_MODULE['<{paypal}prestashop>authentication_6f6162d3a052bb330e9c60285c74c6c9'] = 'Iscriviti alla nostra newsletter'; +$_MODULE['<{paypal}prestashop>authentication_ac135c86084a47630c9eadb4edd5ef75'] = 'Ricevere le offerte speciali dei nostri partner'; +$_MODULE['<{paypal}prestashop>authentication_455175f3f5be6306247babb349c0515a'] = 'Il tuo indirizzo'; +$_MODULE['<{paypal}prestashop>authentication_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Azienda'; +$_MODULE['<{paypal}prestashop>authentication_dd7bf230fde8d4836917806aff6a6b27'] = 'Indirizzo'; +$_MODULE['<{paypal}prestashop>authentication_783cb853aae6984e51583b3bb80c09d2'] = 'Indirizzo (2)'; +$_MODULE['<{paypal}prestashop>authentication_9b514b51d03075005814a33edc74c958'] = 'CAP '; +$_MODULE['<{paypal}prestashop>authentication_57d056ed0984166336b7879c2af3657f'] = 'Città'; +$_MODULE['<{paypal}prestashop>authentication_59716c97497eb9694541f7c3d37b1a4d'] = 'Paese'; +$_MODULE['<{paypal}prestashop>authentication_46a2a41cc6e552044816a2d04634545d'] = 'Stato'; +$_MODULE['<{paypal}prestashop>authentication_0f68b904e33d9ac04605aecc958bcf52'] = 'Ulteriori informazioni'; +$_MODULE['<{paypal}prestashop>authentication_fe66abce284ec8589e7d791185b5c442'] = 'Telefono'; +$_MODULE['<{paypal}prestashop>authentication_41c2fff4867cc204120f001e7af20f7a'] = 'Cellulare'; +$_MODULE['<{paypal}prestashop>authentication_6c1c4d5a22e3d6ed8385e7287233396f'] = 'Assegna un titolo di indirizzo per riferimento futuro'; +$_MODULE['<{paypal}prestashop>authentication_ae7bdef7fe2bbbbf02c11e92c5fceb40'] = 'Il mio indirizzo'; +$_MODULE['<{paypal}prestashop>authentication_a0bfb8e59e6c13fc8d990781f77694fe'] = 'Continua'; +$_MODULE['<{paypal}prestashop>authentication_19f823c6453c2b1ffd09cb715214813d'] = 'Campo obbligatorio'; +$_MODULE['<{paypal}prestashop>login_b40ad46c25c153a3d2fde078c0e1b0f8'] = 'Accedi'; +$_MODULE['<{paypal}prestashop>login_abc57016a138dea055e0d8be6358f84e'] = 'Questa e-mail è già stato registrata, effettua il login!'; +$_MODULE['<{paypal}prestashop>login_8b5dd64ab8d0b8158906796b53a200e2'] = 'Indirizzo e-mail'; +$_MODULE['<{paypal}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Password'; +$_MODULE['<{paypal}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Entra'; +$_MODULE['<{paypal}prestashop>login_01a569ddc6cf67ddec2a683f0a5f5956'] = 'Hai dimenticato la password?'; +$_MODULE['<{paypal}prestashop>shopping_cart_aa91004934e1abdb620b5d0f0c18681c'] = 'Paga con PayPal Express Checkout'; +$_MODULE['<{paypal}prestashop>paypal_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; +$_MODULE['<{paypal}prestashop>paypal_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>paypal_6e7012516038a096b9f6bb71ba2cc5a3'] = 'Si accettano pagamenti con carte di credito e prepagate (Visa, MasterCard, Amex, Aurora) associate al conto PayPal'; +$_MODULE['<{paypal}prestashop>paypal_69a1a3ad8dd5da6db3c4da838a0cf9c7'] = 'Sei sicuro di voler cancellare i tuoi dati?'; +$_MODULE['<{paypal}prestashop>paypal_1828820cc60e36b6f9fdf60cab103ed7'] = 'Si sta attualmente utilizzando l\'indirizzo di posta elettronica predefinito, è necessario utilizzare il proprio indirizzo e-mail'; +$_MODULE['<{paypal}prestashop>paypal_b1c5ae0be0bf2b540a852f248c3b32dd'] = 'Tutte le caratteristiche del modulo PayPal API sono incluse nel nuovo modulo Paypal. Al fine di non avere alcun conflitto, si prega di non utilizzare e rimuovere il modulo PayPalAPI.'; +$_MODULE['<{paypal}prestashop>paypal_f76de4f0d7f11db73e62f1f04f3a23ef'] = 'Tutte le caratteristiche del modulo PayPal API sono incluse nel nuovo modulo Paypal. Al fine di non avere alcun conflitto, si prega di non utilizzare e rimuovere il modulo PayPalAPI.'; +$_MODULE['<{paypal}prestashop>paypal_a706f7e37a81dc235d41bbeb6fae92aa'] = 'Non hai selezionato un metodo di pagamento valido '; +$_MODULE['<{paypal}prestashop>paypal_32af90c3cfef1bacf43b0c3a8f60a4da'] = 'Il denaro è stato recuperato '; +$_MODULE['<{paypal}prestashop>paypal_d238649ac5ec14afc894fad36c0b50fc'] = 'La richiesta di recupero fondi non è andata a buon fine, vedi il messaggio nella cronologia.'; +$_MODULE['<{paypal}prestashop>paypal_05b998de2c4fb46a7bdd37bd378b81d9'] = 'La convalida è stata eseguita, vedi il messaggio nella cronologia. '; +$_MODULE['<{paypal}prestashop>paypal_aeca7e93a1b3d77e38c3cffa131774d5'] = 'Il rimborso è stato completato '; +$_MODULE['<{paypal}prestashop>paypal_cba030a50c8a99c7e224adbe1cf58544'] = 'La richiesta di rimborso non è andata a buon fine, vedi il messaggio nella cronologia.'; +$_MODULE['<{paypal}prestashop>paypal_b630aa9b5e25da971949cae62dd109aa'] = 'Convalida PayPal '; +$_MODULE['<{paypal}prestashop>paypal_e8fdd4382b75b42bfbd96eb7b032cf47'] = 'Informazioni:'; +$_MODULE['<{paypal}prestashop>paypal_9119a92adbbf6c67bfb8a3aee0bdb720'] = 'In attesa di raccolta - Non spedire'; +$_MODULE['<{paypal}prestashop>paypal_c14eb95a724174f336b8ffdd98ef2f35'] = 'In attesa di pagamento - Non spedire'; +$_MODULE['<{paypal}prestashop>paypal_5b18ff32c2aaaf4b79bdead10b10fe29'] = 'Vedi lo stato del pagamento'; +$_MODULE['<{paypal}prestashop>paypal_81e826adb70e2e6b189c2eef739d52d4'] = 'Riscossione PayPal '; +$_MODULE['<{paypal}prestashop>paypal_6f1f179632d90b3f71f5c83a1137e302'] = 'Fondi pronti per essere catturato prima della spedizione'; +$_MODULE['<{paypal}prestashop>paypal_3a81739e892c77e29ff4718c9dd92a34'] = 'Ricevi il denaro '; +$_MODULE['<{paypal}prestashop>paypal_8ba079f305b81b172792bc0469b6a690'] = 'Rimborso PayPal '; +$_MODULE['<{paypal}prestashop>paypal_016e1f278eccd700eaf33f74a501d050'] = 'Pagamento accettato'; +$_MODULE['<{paypal}prestashop>paypal_a8b1cc445942a2e1a7d7cca641c86d67'] = 'Quando emetti un rimborso per un prodotto, viene eseguito un rimborso parziale a meno che non selezioni l\'opzione Crea buono'; +$_MODULE['<{paypal}prestashop>paypal_c2a5e2e23d8ec9cad779d657b7d33fc1'] = 'Rimborsa l\'intero importo della transazione '; +$_MODULE['<{paypal}prestashop>paypal_729a51874fe901b092899e9e8b31c97a'] = 'Sei sicuro? '; +$_MODULE['<{paypal}prestashop>paypal_20fda49ece75d93bea97648ab1f1f1cf'] = 'Annulla i risultati per i prodotti: '; +$_MODULE['<{paypal}prestashop>paypal_e5970a9962bc4cacb5adb408418a9f0c'] = 'Autorizzazione di PayPal non riuscita '; +$_MODULE['<{paypal}prestashop>paypal_be6575076ac9b651d870a59970e7cd54'] = 'PayPal ha restituito un errore '; +$_MODULE['<{paypal}prestashop>paypal_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'Il numero di sicurezza fornito da PayPal non è uguale a quello del cookie '; +$_MODULE['<{paypal}prestashop>paypal_33ac76215cb67f61f891cc3113e55997'] = 'Autorizzazione di pagamento differito concessa da PayPal '; +$_MODULE['<{paypal}prestashop>paypal_8778ee03f6592d5fec9a1f2ee851e476'] = 'Ordine PayPal completato '; +$_MODULE['<{paypal}prestashop>paypal_d89a00d4ba79c176bb0fc17f12d42a18'] = 'Chiave Paypal \'Mc_gross\' non specificata, non può controllare l\'importo corrisposto.'; +$_MODULE['<{paypal}prestashop>paypal_202a2860b19003ce53966a8780bb448b'] = 'Chiave Paypal \'Payment_status\' non specificata, non in grado di controllare la validità di pagamento'; +$_MODULE['<{paypal}prestashop>paypal_bd0e34e5be6447844e6f262d51f1a9dc'] = 'Pagamento:'; +$_MODULE['<{paypal}prestashop>paypal_23703f7d045936080031477df1fc237b'] = 'Chiave Paypal \'Custom\' non specificata, non in grado di inoltrare al carrello'; +$_MODULE['<{paypal}prestashop>paypal_760c3c2ccfadeee26c80c7b39462cf1d'] = 'Chiave Paypal \'Txn_id\' non specificata, operazione sconosciuta'; +$_MODULE['<{paypal}prestashop>paypal_7faa8448e059fb97d60d4a4b15634d98'] = 'Chiave Paypal \'Mc_currency\' non specificata, valuta sconosciuto'; +$_MODULE['<{paypal}prestashop>paypal_e61f52d02b9f52fbe1fd41ed320e29c3'] = 'Carrello non trovato'; +$_MODULE['<{paypal}prestashop>paypal_0617900b1aff826081d07f5a3e2e7cd0'] = 'Ordine è già stato effettuato'; +$_MODULE['<{paypal}prestashop>paypal_f5209b3301a46f3057ffbf34d903e205'] = 'ID Transazione PayPal:'; +$_MODULE['<{paypal}prestashop>paypal_7b19e875ff64b09d80ee05dcc84b9975'] = 'La transazione PayPal non è stata VERIFICATA.'; +$_MODULE['<{paypal}prestashop>paypal_20dfea1a472e5be3f15f6b5f36ca335c'] = 'Problema di connessione al server di PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_76ee8dc73701e846f7bccdf98dae079b'] = 'Nessuna comunicazione di trasporto disponibile.'; +$_MODULE['<{paypal}prestashop>paypal_8358ec19f397d4cdd632688d4f79e535'] = 'Verifica fallimento (usando fsockopen). Restituito:'; +$_MODULE['<{paypal}prestashop>paypal_eca77e208634d52703b07672abbf16ec'] = 'Verifica fallimento (con cURL). Restituito:'; +$_MODULE['<{paypal}prestashop>paypal_f7799c2ded739cf3c3e9babffc5f315b'] = 'Collegamento tramite cURL non riuscita'; +$_MODULE['<{paypal}prestashop>paypal_c640d8a3c2c34f79061a0bbe50e8420c'] = 'Attendere, reindirizzamento a Paypal ... Grazie.'; +$_MODULE['<{paypal}prestashop>paypal_ea4788705e6873b424c65e91c2846b19'] = 'Annulla'; +$_MODULE['<{paypal}prestashop>paypal_dae3b417a0fc4a49e851ce55d6d49551'] = 'Il mio carrello'; +$_MODULE['<{paypal}prestashop>paypal_9bfa2332c9c7198ac9774c6710bf76c4'] = 'Torna al negozio'; +$_MODULE['<{paypal}prestashop>paypal_d56249aa9643851a94bd3ef3da309d35'] = 'Errore Paypal: (e-mail account business non valido o non definito)'; +$_MODULE['<{paypal}prestashop>paypal_e7ac6f09a936201890de4094b1ee4e50'] = 'Errore Paypal: (indirizzo o cliente non valido)'; +$_MODULE['<{paypal}prestashop>paypal_49b21ad0d38942f635877e7bbc5d7a1e'] = 'Soluzione '; +$_MODULE['<{paypal}prestashop>paypal_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{paypal}prestashop>paypal_9c81c7e49db6edc5ea243dbadfb28c2a'] = 'Logo e personalizzazioni '; +$_MODULE['<{paypal}prestashop>paypal_9d51eb502e6f46830cb97f53d761c212'] = 'Scegli una soluzione: '; +$_MODULE['<{paypal}prestashop>paypal_0234fed198d74928f2864c574a9a89c1'] = 'Pagamenti con carta di credito '; +$_MODULE['<{paypal}prestashop>paypal_627fabff813cafcd9313ea0037c0125b'] = '(Visa, Mastercard, Amex, Aurora) e conto PayPal '; +$_MODULE['<{paypal}prestashop>paypal_ec2d6b2d2cfb9eadee1c15f3d579252d'] = 'Pagamenti con carta e protezione venditori '; +$_MODULE['<{paypal}prestashop>paypal_7d8bea00c8ed9c1cdf9da980bd69c85a'] = '(PayPal Integral Evolution, abbonamento mensile)'; +$_MODULE['<{paypal}prestashop>paypal_457e5c04d6690cc6a72412c792c504d9'] = 'Pagamenti con '; +$_MODULE['<{paypal}prestashop>paypal_5d4023dba17f36ce69357d25cbe4fbad'] = 'Conto PayPal '; +$_MODULE['<{paypal}prestashop>paypal_e574ea35c565033a741efb1925b5f188'] = '(PayPal Option+) '; +$_MODULE['<{paypal}prestashop>paypal_fdcd0dc7120ef9d14417c968e0a16e97'] = 'Attivazione soggetta a condizioni e a tariffa mensile '; +$_MODULE['<{paypal}prestashop>paypal_89e92ec866e363e88f12a7372d682c5c'] = 'clicca qui per registrarti '; +$_MODULE['<{paypal}prestashop>paypal_cd1bd0b0d3d22ede663f17df5194b3fe'] = 'Opzione: '; +$_MODULE['<{paypal}prestashop>paypal_28882d910d7b5311aa0a9d5094e11caf'] = 'Pagamento express PayPal: pagamenti in 2 clic '; +$_MODULE['<{paypal}prestashop>paypal_22afd6155cd35727f6ed449aef994731'] = 'con conto PayPal direttamente dalla pagina del carrello'; +$_MODULE['<{paypal}prestashop>paypal_4037fe43ff7b926e093805e2931c0f77'] = 'Solo debug:'; +$_MODULE['<{paypal}prestashop>paypal_7c8ab5ce5bf608dd41cf3e8f2312451c'] = 'Attiva messaggio di log completo'; +$_MODULE['<{paypal}prestashop>paypal_d4dccb8ca2dac4e53c01bd9954755332'] = 'Salva impostazioni '; +$_MODULE['<{paypal}prestashop>paypal_7a262cb0d3d917313c8ba12f996fe83c'] = 'Importante: '; +$_MODULE['<{paypal}prestashop>paypal_de79de54313d8b57cd45c840d196b7d0'] = 'Per usare una delle soluzioni PayPal, devi impostare i parametri API nella sezione Impostazioni.'; +$_MODULE['<{paypal}prestashop>paypal_79f53a401ee04dbc765d0ba9a951a106'] = 'Modalità Sandbox (test) '; +$_MODULE['<{paypal}prestashop>paypal_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Attivo '; +$_MODULE['<{paypal}prestashop>paypal_3cab03c00dbd11bc3569afa0748013f0'] = 'Non attivo '; +$_MODULE['<{paypal}prestashop>paypal_4dbcb38bbbff5d4a402f2575c57a35e6'] = 'Tipo di pagamento '; +$_MODULE['<{paypal}prestashop>paypal_5bc5650bfb4c1eb3887ea80e7802301f'] = 'Diretto (vendite)'; +$_MODULE['<{paypal}prestashop>paypal_6dd446781e32f1a989396e93db70437d'] = 'Autorizzazione / riscossione'; +$_MODULE['<{paypal}prestashop>paypal_7186106a954f390f62860c11c8ba10d5'] = '(Invio pagamento) '; +$_MODULE['<{paypal}prestashop>paypal_3cf5408a4a41b56c6fd7878a070b76ff'] = 'Email associata al conto PayPal '; +$_MODULE['<{paypal}prestashop>paypal_467008be031b7e1a913395f53556fea8'] = 'Attivazione chiamate API '; +$_MODULE['<{paypal}prestashop>paypal_11931512987fbd1b884da55f13273a07'] = 'Nome utente API '; +$_MODULE['<{paypal}prestashop>paypal_5e07b6956454390018af63962ef4a3f6'] = 'Password API '; +$_MODULE['<{paypal}prestashop>paypal_1c1357865e46a07448c95ebca39d4541'] = 'Lasciare vuoto se la password non è stata modificata '; +$_MODULE['<{paypal}prestashop>paypal_e1ededd62537e048b815f70cc971bec8'] = 'Firma API '; +$_MODULE['<{paypal}prestashop>paypal_52c59dac7b7ebfa8a0d78c98f2bc0225'] = 'Clicca qui per maggiori informazioni su come creare username, password e firma API. '; +$_MODULE['<{paypal}prestashop>paypal_e28b278d67eeecfad67e76ec78fc13e8'] = 'Loghi e personalizzazioni'; +$_MODULE['<{paypal}prestashop>paypal_ee0174ba1fc039128d0a38074a7af945'] = 'URL del Banner'; +$_MODULE['<{paypal}prestashop>paypal_4c1c997e72e71eb6f690a9cd3dacb1f4'] = 'L\'immagine deve essere ospitata su un server sicuro (https). Max.: 750x90 pixel '; +$_MODULE['<{paypal}prestashop>paypal_091878185fc791198ac80982860b21ed'] = 'Modello scelto per PayPal Pro '; +$_MODULE['<{paypal}prestashop>paypal_cd8d30bc59ccf92028335d7e69e29905'] = 'Clicca qui per maggiori informazioni su come personalizzare questo modello '; +$_MODULE['<{paypal}prestashop>paypal_9518e6d551f7dc752b24af3629e849f9'] = 'Aprire un conto PayPal '; +$_MODULE['<{paypal}prestashop>paypal_4c9ef5964631b6d4b38f5f2f77d1be74'] = 'Se crei il tuo conto PayPal cliccando sull\'immagine sottostante, ci aiuti a migliorare il software PrestaShop:'; +$_MODULE['<{paypal}prestashop>paypal_1569f6a31ff61f45c5ba13d7cab7e042'] = 'Questo modulo ti consente di accettare pagamenti con PayPal. '; +$_MODULE['<{paypal}prestashop>paypal_3c4cb777e8df15388c680354569636b6'] = 'Se il cliente sceglie questo metodo di pagamento, l\'importo sarà accreditato automaticamente sul tuo conto PayPal.'; +$_MODULE['<{paypal}prestashop>paypal_f9b49f93306d28e3dec595c3b89c926d'] = 'È necessario configurare il proprio conto PayPal prima di utilizzare questo modulo.'; +$_MODULE['<{paypal}prestashop>paypal_57487012438fe78ae1d462e53a91bfc0'] = 'la soluzione non è valida. '; +$_MODULE['<{paypal}prestashop>paypal_f629bddb66252b97da3e7e5346697955'] = 'devi indicare almeno le informazioni sul conto '; +$_MODULE['<{paypal}prestashop>paypal_909d37302176080797966972da84b4e7'] = 'e-mail non valida'; +$_MODULE['<{paypal}prestashop>paypal_2fa631ec6f6afeac6335f3261181063f'] = 'L\'URL del banner non è valido '; +$_MODULE['<{paypal}prestashop>paypal_19ea461c401bd941bf47a8bc01eecd6c'] = 'URL del banner deve utilizzare il protocollo HTTPS'; +$_MODULE['<{paypal}prestashop>paypal_b8822117a8cc930315a50bab7f6a4c80'] = 'il modello PayPal non è valido '; +$_MODULE['<{paypal}prestashop>paypal_b02186eee414487a068584dc0d177ad2'] = 'non puoi usare Autorizzazione e riscossione se non hai le credenziali API'; +$_MODULE['<{paypal}prestashop>paypal_17fcef6818690d11d7caaab023ecdcff'] = 'non puoi usare questa soluzione se non hai le credenziali API '; +$_MODULE['<{paypal}prestashop>paypal_30e4e115bfc5e140782fd9cb01be6898'] = 'non puoi usare Pagamento express se non hai le credenziali API '; +$_MODULE['<{paypal}prestashop>paypal_c888438d14855d7d96a2724ee9c306bd'] = 'Le impostazioni sono aggiornate '; +$_MODULE['<{paypal}prestashop>paypal_67c0e5ec07dd31dc74aaf55d6a72da31'] = 'La richiesta dello stato del pagamento ha generato un errore '; +$_MODULE['<{paypal}prestashop>paypal_ec53a8c4f07baed5d8825072c89799be'] = 'Stato '; +$_MODULE['<{paypal}prestashop>paypal_ccb168b5a6a86eb100dc2dee754a316b'] = 'Motivo: '; +$_MODULE['<{paypal}prestashop>paypal_4f3acf5bcd7152fd301550bec6d0ffac'] = 'Errore di PayPal: '; +$_MODULE['<{paypal}prestashop>paypal_a0d09826326fd385f6ceb17442f290de'] = 'La richiesta di riscossione ha generato un errore '; +$_MODULE['<{paypal}prestashop>paypal_e03187f3f9d6eda06a2a7c201f58cdca'] = 'La richiesta di rimborso ha generato un errore '; +$_MODULE['<{paypal}prestashop>paypal_e5d5d9f40763cfe6549bef705e3529a7'] = 'Il messaggio di pagamento non è valido, rivedi il tuo modulo. '; +$_MODULE['<{paypal}prestashop>paypal_eec39bf42bd135971fb2d838c67d1449'] = 'Risultato dell\'operazione di rimborso: '; +$_MODULE['<{paypal}prestashop>paypal_2ab62d1a578713d0862b56819295630e'] = 'Rimborso PayPal completato. '; +$_MODULE['<{paypal}prestashop>paypal_a64db959966ba8d07c8b5d9493fcc21f'] = 'Errore durante la transazione '; +$_MODULE['<{paypal}prestashop>paypal_67962779da962e3d4225055afc05e7bd'] = 'Risultato operazione di riscossione: '; +$_MODULE['<{paypal}prestashop>paypal_5a05744b8ccb5909bc83355092e0f3fa'] = 'Stato della verifica: '; +$_MODULE['<{paypal}prestashop>payment_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; +$_MODULE['<{paypal}prestashop>payment_a3f2caee6ef8e68fbd26e42d83f2bf65'] = 'Paga con il tuo conto PayPal, carta di credito (Visa, Mastercard ...), o carta di credito privata'; +$_MODULE['<{paypal}prestashop>payment_b08008a2de4331ba13f006c9bcf37b62'] = 'Paga con il tuo conto PayPal'; +$_MODULE['<{paypal}prestashop>about_e816e21c1c8e0eba0620fa3df6bd6795'] = 'Che cos\'è PayPal?'; +$_MODULE['<{paypal}prestashop>about_16ea57badae98f402bb8f2b2f49d4e77'] = 'PayPal, leader di fiducia nei pagamenti online, consente ad acquirenti e aziende di inviare e ricevere pagamenti online. PayPal vanta oltre 100 milioni di conti in 190 Paesi e territori. È accettato dai commercianti di tutto il mondo, dentro e fuori di eBay.'; +$_MODULE['<{paypal}prestashop>about_d20adade7baa1b60b713521031ea676c'] = 'E\' sicuro?'; +$_MODULE['<{paypal}prestashop>about_64f7b897c6d56fc62428f692ee5737cd'] = 'PayPal consente di proteggere i dati della carta di credito con la sicurezza dei leader di settore e dei sistemi di prevenzione delle frodi. Quando utilizzi PayPal, le tue informazioni finanziarie non vengono mai condivise con il commerciante.'; +$_MODULE['<{paypal}prestashop>about_5ef30813484389e4200640c2f006004d'] = 'Perché utilizzare PayPal?'; +$_MODULE['<{paypal}prestashop>about_86550d4ea832930db4366f03b90bdfb8'] = 'Fai acquisti o invia denaro con PayPal - è gratis'; +$_MODULE['<{paypal}prestashop>about_7dc9e529337e5a55a12bf362b8e68cac'] = 'Fai acquisti e paga comodamente salvando le tue informazioni con PayPal'; +$_MODULE['<{paypal}prestashop>about_32098ae6a7ecd96805df9e48fb6cc739'] = 'PayPal è accettato da milioni di aziende in tutto il mondo ed è il metodo di pagamento preferito su eBay'; +$_MODULE['<{paypal}prestashop>about_7934d7d1280bfbb8778743e39292af30'] = 'Inizia a utilizzare PayPal oggi stesso!'; +$_MODULE['<{paypal}prestashop>column_dac2693baa5c5c9a5318609ed81c4f2a'] = 'Paga con PayPal'; +$_MODULE['<{paypal}prestashop>confirm_a40cab5994f36d4c48103a22ca082e8f'] = 'Il tuo carrello'; +$_MODULE['<{paypal}prestashop>confirm_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>confirm_f1d3b424cd68795ecaa552883759aceb'] = 'Riepilogo ordine'; +$_MODULE['<{paypal}prestashop>confirm_dd23adc5fb6bda9c384397b31e57fc53'] = 'pagamento PayPal'; +$_MODULE['<{paypal}prestashop>confirm_62d74398cb6ebaa69ab7339052ca5c92'] = 'Hai scelto di pagare con PayPal.'; +$_MODULE['<{paypal}prestashop>confirm_c884ed19483d45970c5bf23a681e2dd2'] = 'Ecco un breve riepilogo del tuo ordine:'; +$_MODULE['<{paypal}prestashop>confirm_e2867a925cba382f1436d1834bb52a1c'] = 'L\'importo totale del tuo ordine è'; +$_MODULE['<{paypal}prestashop>confirm_1f87346a16cf80c372065de3c54c86d9'] = '(Tasse incl.)'; +$_MODULE['<{paypal}prestashop>confirm_8ed356c32b198c9cb2abab7c3d262b93'] = 'Accettiamo che la seguente valuta sia inviata tramite PayPal:'; +$_MODULE['<{paypal}prestashop>confirm_0881a11f7af33bc1b43e437391129d66'] = 'Si prega di confermare l\'ordine cliccando su \'confermo il mio ordine\''; +$_MODULE['<{paypal}prestashop>confirm_569fd05bdafa1712c4f6be5b153b8418'] = 'Altri metodi di pagamento'; +$_MODULE['<{paypal}prestashop>confirm_46b9e3665f187c739c55983f757ccda0'] = 'Confermo il mio ordine'; +$_MODULE['<{paypal}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine'; +$_MODULE['<{paypal}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{paypal}prestashop>confirmation_15b0f8e55c6bdfc3d5fd0b6b3b6cb3ee'] = 'Hai scelto il metodo PayPal.'; +$_MODULE['<{paypal}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{paypal}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{paypal}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{paypal}prestashop>error_a40cab5994f36d4c48103a22ca082e8f'] = 'Il tuo carrello'; +$_MODULE['<{paypal}prestashop>error_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{paypal}prestashop>error_425551a2289ed60c9260933d1c45ef00'] = 'Si prega di fare riferimento ai log:'; +$_MODULE['<{paypal}prestashop>error_0557fa923dcee4d0f86b1409f5c2167f'] = 'Indietro'; +$_MODULE['<{paypal}prestashop>paypalconnect_d1f14cc4a2dade80c92421d26422fea0'] = 'Fare nuova connessione'; +$_MODULE['<{paypal}prestashop>paypalconnect_94a27811a721ef512ad7bfa06cab34e0'] = 'Connessione non riuscita con metodo CURL'; +$_MODULE['<{paypal}prestashop>paypalconnect_70215486455daee13382c68b1a230b82'] = 'Connessione con metodo CURL riuscita'; +$_MODULE['<{paypal}prestashop>paypalconnect_e4c4ad49bced42265b5facc2175cdafd'] = 'Invio di questo param.:'; +$_MODULE['<{paypal}prestashop>paypalconnect_445583f6641da98fc7ac8fd9d13a564b'] = 'Invio con metodo CURL fallito! Errore:'; +$_MODULE['<{paypal}prestashop>paypalconnect_ef4fbf36eaa2083442d386990ba063c2'] = 'Invio con metodo CURL riuscito'; +$_MODULE['<{paypal}prestashop>paypalconnect_bf059c9751bb1a20b449b7917b1df374'] = 'Connessione non riuscita con metodo fsockopen'; +$_MODULE['<{paypal}prestashop>paypalconnect_ea800e3536f81238a4cbc32eb6db4eaf'] = 'Connettiti con metodo fsockopen riuscita'; +$_MODULE['<{paypal}prestashop>paypalconnect_6e9aa4cb541e09b07602d4ea96080811'] = 'Invio con metodo fsockopen non riuscito!'; +$_MODULE['<{paypal}prestashop>paypalconnect_842a183be225d415b2b4375ba1dd1c94'] = 'Invio con metodo fsockopen riuscito'; +$_MODULE['<{paypal}prestashop>paypallib_7c2d00d8c94d1ce0f515db8b0481db40'] = 'risposta di PayPal:'; +$_MODULE['<{paypal}prestashop>paypalexpress_b601224a2a6c61f38738ca903fb019a2'] = 'Non è un carrello valido'; +$_MODULE['<{paypal}prestashop>paypalexpress_ee9dc1e678d54c517f481583c3fb2db8'] = 'Non è una valuta valida'; +$_MODULE['<{paypal}prestashop>submit_528d1f824243db48e40cb6223d32fa06'] = 'Nessun token dato da PayPal'; +$_MODULE['<{paypal}prestashop>submit_795277047da13b4fc74e02e050b1a675'] = 'PayPal ha rinviato l\'errore'; +$_MODULE['<{paypal}prestashop>submit_b4133f1ba03a914134a5281a08231078'] = 'Autorizzazione a PayPal non riuscita'; +$_MODULE['<{paypal}prestashop>submit_4935b58d37fda5bd60acc510cb324342'] = 'Impossibile recuperare le informazioni del tuo conto PayPal'; +$_MODULE['<{paypal}prestashop>submit_90aa7ebf75251f535a9bdd6ba671ae7a'] = 'Token dato da PayPal non è lo di quello del cookie'; +$_MODULE['<{paypal}prestashop>paypalpayment_ee9dc1e678d54c517f481583c3fb2db8'] = 'Non è una valuta valida'; + +?> \ No newline at end of file diff --git a/modules/paypal/logo.gif b/modules/paypal/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..455c89991c439891e9a37b8daa144f40c75a16d4 GIT binary patch literal 2066 zcmZ?wbhEHb6krfw_}bZpFO-K3Q~y{K@aylHY+Y*S+K`NwP)8?0MVH?LB%)J8f3;#MP(H-dwn7*X2uhwroFf z{Ory73wCtR+|bgzz_W0XdBJ>n!$bwkG!@%SS(D_y|Nd=QfB4MB2PQ808p+cm;#!vM zzO1AZyJXc7CCfB@_d@5Qg{GNvLL%#P>t;tKv}!x&&6~Gv?cwWr?VFW!<7Up@mXy|Y z_u&hp^jXpE>sz{4&t87CtYXIeb!T6`{$T4_boSg$6PLV#!bzsixxr;ix1YMbaod@h zn@(4DE;(}KQe4d{9h;1hy48=Ly>YBudg#P$9s6uOn+#REtcANSnz-f%HLj93OgMex zsgg}b&cv-+&Uu@5pFVT`uAFg_j9JQmFkl!3bO`~)|J)J20SYdOC5b@V#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg zxv3?I3Kh9IdBs*0wn~X9`AMl(KsHENUr7P1q$Jx`$q^)>0J76LzbI9~RL?*+*}%*| z!OT$4(AdP>++0V&$iUD*-@r)U&`8(N+{)O<%D_MY3Y37h6{VzE1-ZCE?E>;_l`=|7 z3as??%gf94%8m8%i_-NCEiElUW*8ai0#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH* znV6WAUs__T1av9H3%LcpzHo!{iuJ%A(o4?I)vrh_&^OdG(9g{U`3tPNxFjeQ;S8** zi$f|4QuTvUi}Op1l2d`om0_BJVTa!$kV2qqtX%SwOLJ56N<3X`m4G68DVZr&PEN+= zj?Na2CI&{XhK8;Njz(riE^dylE-tR7X3nP0Fuk66#U+V($*C~CnFzg>c=cL27o{ea zA6= zBXe_0S0{6G7iU95Cns}fCo@AQ6C)Eh7Z+n=C8)*}B+o)Lni9~c4|Ik;C@PVn7A6Et zFCZp7p#nMZq@J1wOy5Pogv|K=-`_vKfBpRN{oB_spFe&4@c!M~H?Lp4eDVC*(TITuzuazHLF*xT(NxF(j|)*EnF~v-rPB}XU&{3ecIG1lP67_(BIeF)7{nC(caeD z(%jV8P+wPDQ(aYAQC?PBQe0G6ke`>Elbw~Bk)D>ClAM&75FZyC6CD*95gryA5*!p5 z;P2<_Vr&G=M0&b9+FF_#>T0Sg%1Vj~@^Z2= z(o&KV;$osA!a{-q{CvDT++3U->};$o%uI|742nNlfMh#^4yfz_)sPMx4;lD5MFLwI z4r&J)gq&0iSkU9tD#YQ?@W6%9#No}FNGGQU-A*l0G6pU|Obv`&J4|L6B(%v02j4K6 zV;L-Pgu!cV~kfG6t&!xM*;Pq)0qYKFlt~pC$9lar%TluF@|@PB=9lJ;UeB YQXo*A+;VfK_A?L8htJ9nH!xTO0PKdG2><{9 literal 0 HcmV?d00001 diff --git a/modules/paypal/mails/de/error_reporting.html b/modules/paypal/mails/de/error_reporting.html new file mode 100644 index 000000000..2de2546dc --- /dev/null +++ b/modules/paypal/mails/de/error_reporting.html @@ -0,0 +1,46 @@ + + + + + Nachricht von {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Hallo,
     
    Fehlerbericht aus Ihrem PayPalAPI Modul
     
    Bei einem Kunden ist ein Problem mit dem PayPalAPI Modul aufgetreten, lesen Sie den Bericht:
     
    {logs}
     
    {shop_name} powered with PrestaShop™
    + + \ No newline at end of file diff --git a/modules/paypal/mails/de/error_reporting.txt b/modules/paypal/mails/de/error_reporting.txt new file mode 100644 index 000000000..97b6ab49d --- /dev/null +++ b/modules/paypal/mails/de/error_reporting.txt @@ -0,0 +1,9 @@ + Hallo, + + Fehlerbericht aus Ihrem PayPalAPI Modul + + Bei einem Kunden ist ein Problem mit dem PayPalAPI Modul aufgetreten, lesen Sie den Bericht: + + {logs} + + {shop_url} powered by PrestaShop™ diff --git a/modules/paypal/mails/en/error_reporting.html b/modules/paypal/mails/en/error_reporting.html new file mode 100644 index 000000000..139e8749b --- /dev/null +++ b/modules/paypal/mails/en/error_reporting.html @@ -0,0 +1,42 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Hi,
     
    Error reporting from your PayPalAPI module
     
    + A client has encountered a problem with the module PayPalAPI, see the report: +
     
    + {logs} +
     
    + {shop_name} powered with PrestaShop™ +
    + + diff --git a/modules/paypal/mails/en/error_reporting.txt b/modules/paypal/mails/en/error_reporting.txt new file mode 100644 index 000000000..802ac51ab --- /dev/null +++ b/modules/paypal/mails/en/error_reporting.txt @@ -0,0 +1,9 @@ + Hi, + + Error reporting from your PayPalAPI module + + A client has encountered a problem with the module PayPalAPI, see the report: + + {logs} + + {shop_url} powered by PrestaShop™ diff --git a/modules/paypal/mails/es/error_reporting.html b/modules/paypal/mails/es/error_reporting.html new file mode 100644 index 000000000..303d0c173 --- /dev/null +++ b/modules/paypal/mails/es/error_reporting.html @@ -0,0 +1,47 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Hola,
     
    Informe de error a partir de su módulo PayPalAPI
     
    Un cliente ha encontrado un problema con el módulo PayPalAPI:
     
    {logs}
     
    {shop_name} lanzado por PrestaShop™
    + + + \ No newline at end of file diff --git a/modules/paypal/mails/es/error_reporting.txt b/modules/paypal/mails/es/error_reporting.txt new file mode 100644 index 000000000..a293fc640 --- /dev/null +++ b/modules/paypal/mails/es/error_reporting.txt @@ -0,0 +1,9 @@ + Hola, + + Informe de error a partir de su módulo PayPalAPI + + Un cliente ha encontrado un problema con el módulo PayPalAPI: + + {logs} + + {shop_url} lanzado por PrestaShop™ diff --git a/modules/paypal/mails/fr/error_reporting.html b/modules/paypal/mails/fr/error_reporting.html new file mode 100644 index 000000000..3d9c475d0 --- /dev/null +++ b/modules/paypal/mails/fr/error_reporting.html @@ -0,0 +1,42 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Bonjour,
     
    Rapport d'erreur à partir de votre module PayPalAPI
     
    + Un client a rencontré un problème avec le module PayPalAPI: +
     
    + {logs} +
     
    + {shop_name} propulsé par PrestaShop™ +
    + + diff --git a/modules/paypal/mails/fr/error_reporting.txt b/modules/paypal/mails/fr/error_reporting.txt new file mode 100644 index 000000000..87cf56505 --- /dev/null +++ b/modules/paypal/mails/fr/error_reporting.txt @@ -0,0 +1,9 @@ + Bonjour, + + Rapport d'erreur à partir de votre module PayPalAPI + + Un client a rencontré un problème avec le module PayPalAPI: + + {logs} + + {shop_url} propulsé par PrestaShop™ diff --git a/modules/paypal/mails/it/error_reporting.html b/modules/paypal/mails/it/error_reporting.html new file mode 100644 index 000000000..dee608304 --- /dev/null +++ b/modules/paypal/mails/it/error_reporting.html @@ -0,0 +1,46 @@ + + + + + Messaggio da {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
    Salve,
    Errore dal tuo modulo PayPalAPI
    Un cliente ha avuto un problema con il modulo PayPalAPI, vedi il rapporto:
    {logs}
    {shop_name} powered with PrestaShop™
    + + \ No newline at end of file diff --git a/modules/paypal/mails/it/error_reporting.txt b/modules/paypal/mails/it/error_reporting.txt new file mode 100644 index 000000000..054d5a3f4 --- /dev/null +++ b/modules/paypal/mails/it/error_reporting.txt @@ -0,0 +1,9 @@ + Salve, + + Errore dal tuo modulo PayPalAPI + + Un cliente ha avuto un problema con il modulo PayPalAPI, vedi il rapporto: + + {logs} + + {shop_url} powered by PrestaShop™ diff --git a/modules/paypal/payment/payment.tpl b/modules/paypal/payment/payment.tpl new file mode 100644 index 000000000..bea7657fe --- /dev/null +++ b/modules/paypal/payment/payment.tpl @@ -0,0 +1,38 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + + {l s='Pay with PayPal' mod='paypal'} +
    + {if $integral} + {l s='Pay with your PayPal account, credit card (CB, Visa, Mastercard...), or private credit card' mod='paypal'} + {else} + {l s='Pay with your PayPal account' mod='paypal'} + {/if} +
    +
    +

    \ No newline at end of file diff --git a/modules/paypal/payment/paypalpayment.php b/modules/paypal/payment/paypalpayment.php new file mode 100644 index 000000000..59a647959 --- /dev/null +++ b/modules/paypal/payment/paypalpayment.php @@ -0,0 +1,119 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PaypalPayment extends Paypal +{ + protected $_logs = array(); + + public function PayPalRound($value) + { + return (floor($value * 100) / 100); + } + + public function getAuthorisation() + { + global $cookie, $cart; + + // Getting cart informations + $currency = new Currency((int)($cart->id_currency)); + if (!Validate::isLoadedObject($currency)) + $this->_logs[] = $this->l('Not a valid currency'); + if (sizeof($this->_logs)) + return false; + + // Making request + $vars = '?fromPayPal=1'; + $returnURL = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/paypal/payment/submit.php'.$vars; + $cancelURL = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'order.php'; + $paymentAmount = (float)($cart->getOrderTotal()); + $currencyCodeType = strval($currency->iso_code); + $paymentType = Configuration::get('PAYPAL_CAPTURE') == 1 ? 'Authorization' : 'Sale'; + $request = '&Amt='.urlencode($paymentAmount).'&PAYMENTACTION='.urlencode($paymentType).'&ReturnUrl='.urlencode($returnURL).'&CANCELURL='.urlencode($cancelURL).'&CURRENCYCODE='.urlencode($currencyCodeType).'&NOSHIPPING=1'; + if (Configuration::get('PAYPAL_PAYMENT_METHOD') == 0) + $request .= '&SOLUTIONTYPE=Sole&LANDINGPAGE=Billing'; + else + $request .= '&SOLUTIONTYPE=Mark&LANDINGPAGE=Login'; + $request .= '&LOCALECODE='.strtoupper(Language::getIsoById($cart->id_lang)); + if (Configuration::get('PAYPAL_HEADER')) + $request .= '&HDRIMG='.urlencode(Configuration::get('PAYPAL_HEADER')); + // Customer informations + $customer = new Customer((int)$cart->id_customer); + $request .= '&EMAIL='.urlencode($customer->email);//customer + // address of delivery + $id_address = $cart->id_address_delivery; + $address = new Address((int)$id_address); + $country = new Country((int)$address->id_country); + if ($address->id_state) + $state = new State((int)$address->id_state); + $discounts = (float)($cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS)); + if ($discounts == 0) + { + $products = $cart->getProducts(); + $amt = 0; + for ($i = 0; $i < sizeof($products); $i++) + { + $request .= '&L_NAME'.$i.'='.substr(urlencode($products[$i]['name'].(isset($products[$i]['attributes'])?' - '.$products[$i]['attributes']:'').(isset($products[$i]['instructions'])?' - '.$products[$i]['instructions']:'') ), 0, 127); + $request .= '&L_AMT'.$i.'='.urlencode($this->PayPalRound($products[$i]['price_wt'])); + $request .= '&L_QTY'.$i.'='.urlencode($products[$i]['cart_quantity']); + $amt += $this->PayPalRound($products[$i]['price_wt']*$products[$i]['cart_quantity']); + } + $shipping = $this->PayPalRound($cart->getOrderShippingCost($cart->id_carrier, false)); + $request .= '&ITEMAMT='.urlencode($amt); + $request .= '&SHIPPINGAMT='.urlencode($shipping); + $request .= '&TAXAMT='.urlencode((float)max($this->PayPalRound($paymentAmount - $amt - $shipping), 0)); + } + else + { + $products = $cart->getProducts(); + $description = 0; + for ($i = 0; $i < sizeof($products); $i++) + $description .= ($description == ''?'':', ').$products[$i]['cart_quantity']." x ".$products[$i]['name'].(isset($products[$i]['attributes'])?' - '.$products[$i]['attributes']:'').(isset($products[$i]['instructions'])?' - '.$products[$i]['instructions']:'') ; + $request .= '&ORDERDESCRIPTION='.urlencode(substr($description, 0, 120)); + } + $request .= '&SHIPTONAME='.urlencode($address->firstname.' '.$address->lastname); + $request .= '&SHIPTOSTREET='.urlencode($address->address1); + $request .= '&SHIPTOSTREET2='.urlencode($address->address2); + $request .= '&SHIPTOCITY='.urlencode($address->city); + $request .= '&SHIPTOSTATE='.($address->id_state ? $state->iso_code : $country->iso_code); + $request .= '&SHIPTOZIP='.urlencode($address->postcode); + $request .= '&SHIPTOCOUNTRY='.urlencode($country->iso_code); + $request .= '&SHIPTOPHONENUM='.urlencode($address->phone); + $request .= '&ADDROVERRIDE=1'; + + // Calling PayPal API + include(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + $ppAPI = new PaypalLib(); + $result = $ppAPI->makeCall($this->getAPIURL(), $this->getAPIScript(), 'SetExpressCheckout', $request); + $this->_logs = array_merge($this->_logs, $ppAPI->getLogs()); + return $result; + } + + public function getLogs() + { + return $this->_logs; + } +} diff --git a/modules/paypal/payment/submit.php b/modules/paypal/payment/submit.php new file mode 100644 index 000000000..8fae2a1e4 --- /dev/null +++ b/modules/paypal/payment/submit.php @@ -0,0 +1,168 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$useSSL = true; + +include_once(dirname(__FILE__).'/../../../config/config.inc.php'); +include_once(dirname(__FILE__).'/../../../init.php'); + +include_once(_PS_MODULE_DIR_.'paypal/paypal.php'); +include_once(_PS_MODULE_DIR_.'paypal/payment/paypalpayment.php'); + +$paypal = new Paypal(); + +if (!$paypal->active) + exit; + +$ppPayment = new PaypalPayment(); +$errors = array(); + +// ##### +// Functions + +function getAuthorization() +{ + global $ppPayment, $cookie, $cart; + + $result = $ppPayment->getAuthorisation(); + $logs = $ppPayment->getLogs(); + if (is_array($result) AND sizeof($result)) + { + if (strtoupper($result['ACK']) == 'SUCCESS') + { + if (isset($result['TOKEN'])) + { + $cookie->paypal_token = strval($result['TOKEN']); + $cookie->paypal_token_date = time(); + header('Location: https://'.$ppPayment->getPayPalURL().'/webscr&cmd=_express-checkout&token='.urldecode(strval($cookie->paypal_token)).'&useraction=commit'); + exit; + } + else + $logs[] = ''.$ppPayment->l('No token given by PayPal', 'submit').''; + } else + $logs[] = ''.$ppPayment->l('PayPal returned error', 'submit').''; + } + $ppPayment->displayPayPalAPIError($ppPayment->l('Authorisation to PayPal failed', 'submit'), $logs); +} + +function displayConfirm() +{ + global $cookie, $smarty, $ppPayment, $cart; + + if (!$cookie->isLogged(true)) + { + header('location:../../../'); exit; + die('Not logged'); + } + unset($cookie->paypal_token); + + if ($cart->id_currency != $ppPayment->getCurrency((int)$cart->id_currency)->id) + { + $cart->id_currency = (int)($ppPayment->getCurrency((int)$cart->id_currency)->id); + $cookie->id_currency = (int)($cart->id_currency); + $cart->update(); + Tools::redirect('modules/'.$ppPayment->name.'/payment/submit.php'); + } + + // Display all and exit + include(_PS_ROOT_DIR_.'/header.php'); + + $smarty->assign(array( + 'logo' => $ppPayment->getLogo(), + 'cust_currency' => $cart->id_currency, + 'currency' => $ppPayment->getCurrency((int)$cart->id_currency), + 'total' => $cart->getOrderTotal(true, Cart::BOTH), + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'. $ppPayment->name.'/', + 'mode' => 'payment/' + )); + + echo $ppPayment->display('paypal.php', 'confirm.tpl'); + include(_PS_ROOT_DIR_.'/footer.php'); + die ; +} + +function submitConfirm() +{ + global $cookie, $smarty, $ppPayment, $cart; + + if (!$cookie->isLogged(true)) + { + header('location:../../../'); exit; + die('Not logged'); + } + elseif (!$id_currency = (int)(Tools::getValue('currency_payement'))) + die('No currency'); + elseif (!$cart->getOrderTotal(true, Cart::BOTH)) + die('Empty cart'); + $currency = new Currency((int)($id_currency)); + if (!Validate::isLoadedObject($currency)) + die('Invalid currency'); + $cookie->id_currency = (int)($id_currency); + getAuthorization(); +} + +function validOrder() +{ + global $cookie, $cart, $ppPayment; + if (!$cookie->isLogged(true)) + { + header('location:../../../'); exit; + die('Not logged'); + } + elseif (!$cart->getOrderTotal(true, Cart::BOTH)) + die('Empty cart'); + if (!$token = Tools::htmlentitiesUTF8(strval(Tools::getValue('token')))) + { + global $smarty; + $smarty->assign('paypalError', 'Invalid token'); + displayConfirm(); + die('Invalid token'); + } + if ($token != strval($cookie->paypal_token)) + die('Invalid cookie token'); + if (!$payerID = Tools::htmlentitiesUTF8(strval(Tools::getValue('PayerID')))) + die('Invalid payerID'); + $ppPayment->makePayPalAPIValidation($cookie, $cart, $cart->id_currency, $payerID, 'payment'); +} + +// ##### +// Process !! + +if (!$cookie->isLogged(true)) + die('Not logged'); +elseif (!$cart->getOrderTotal(true, Cart::BOTH)) + die('Empty cart'); + +// No submit, confirmation page +if (!Tools::isSubmit('submitPayment') AND !Tools::getValue('fromPayPal')) + displayConfirm(); +else +{ + if (!isset($cookie->paypal_token) OR !$cookie->paypal_token) + submitConfirm(); + validOrder(); +} diff --git a/modules/paypal/paypal.gif b/modules/paypal/paypal.gif new file mode 100644 index 0000000000000000000000000000000000000000..e480d4b0c5d162cdf7ef9538521d88bcb1899d6b GIT binary patch literal 1525 zcmcJOdrVVT9LIn6(o1g(y1Ogywon`j5@aAKR3^Da#DWisU`0|ga6DC%Nl{=-Tc|_C z2VPK7p`ua;GB;3+&uM+2?br|tW<}9;##bWhK-e^yVTU^ZShjz6a!&I5{m%FEdz|FV zkBteJq$?m8DgfNWGJ><~wjF5i{K=A-TUB?mYnFV2Z}gg>;Ze(j!HqkcBR|(w9qT-8 z=zj2cFmwBfM}x!q3+DVX-Nl=~^z}bT*0%2d`g~XaqxS2T=u}N}N9U%-OAAW$>-L@* z9(|L(e)rhe82rzR<;`Pxi)qhj9DHbD5Wo_4cK=%|?4k(T!-9&_g63T>+*n?I-9rN# zxt5Jw0XRu}KBYYk@7Y=#tNsTo@UyY6|AX}kr@bgz&?Et1xibI~B+h4$9ce_tQUEtv zWEiKo;b?p$VC`F3`)9PL7I0Jo-np{MWPlF9dr$-jbfVFDJCOCRB^XGe1sUU2JeyD| z+AACY_1wWSfzIM)TDa}+ahR7ZbKV95s4)pv1Q13G0}?@rf_xy^$Sr_-AR84OLQgTC zCkwesShW`Navl)QN+s_d8>yOA@@VTU?TezMF4mZ0Le%JuGP$#haVP2xF4Lo znwj!MAW@V!sABQ3B@Pyw5@>IqMF(GxYY}hT-fuW|0AiE^t?@qr#BEo9|@vHi%6o#MG$g|R1^Of`Oq$CRcM`USNUz*sK{DaSeD zk2w}ojc>&S$|ur#R;t!&=p6su#p)|J@Ht0@uR*Z%CTVBy7}}<4(d?Y7k4d%u>iw0D zM_D-JB0PHgZ~1d?mIY_~yKP~V1p37j+Wxm8E6!VwXDcp6t!$ zIqpsa(|a-Lbvw3uPk)+WK;w}^!!7Li}kjsYh4++U4lUe`N8&TAeVKfjU#rYk=2B^LgI)Tl3L_6auXUGt zT_~z!oT4QSB?>$rNVBO)!#I*>6DxVm$wJciMG_;W%^5WX;*8Ty1yCxcDrPK~-DP6q zmST2}Q+qPv8;5FBsw1XLs=o{oQJ=2SzG>Fmcb}SBL*OP;Um-r)Vc@tbtJTu-Kng22 zX{fAC9Aav38kuY6Gpq2kd`KkHP|DYF%eWhdk`(b5&&BknaA$sD;HvPpdkni?R=w}Y|S4;^4NCA_41 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +define('_PAYPAL_INTEGRAL_', 0); +define('_PAYPAL_OPTION_PLUS_', 1); +define('_PAYPAL_INTEGRAL_EVOLUTION_', 2); + +class PayPal extends PaymentModule +{ + private $_html = ''; + + public function __construct() + { + $this->name = 'paypal'; + $this->tab = 'payments_gateways'; + $this->version = '2.4'; + + $this->currencies = true; + $this->currencies_mode = 'radio'; + + parent::__construct(); + + $this->_errors = array(); + $this->page = basename(__FILE__, '.php'); + $this->displayName = $this->l('PayPal'); + $this->description = $this->l('Accepts payments by credit cards (CB, Visa, MasterCard, Amex, Aurore, Cofinoga, 4 stars) with PayPal.'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your details?'); + if (Configuration::get('PAYPAL_BUSINESS') == 'paypal@prestashop.com') + $this->warning = $this->l('You are currently using the default PayPal e-mail address, please enter your own e-mail address.'); + $this->_checkAndUpdateFromOldVersion(); + if (file_exists(_PS_ROOT_DIR_.'/modules/paypalapi/paypalapi.php') AND $this->active) + $this->warning = $this->l('All features of Paypal API module are be include in the new Paypal module. In order to don\'t have any conflict, please don\'t use and remove PayPalAPI module.'); + + global $cookie; + $context = stream_context_create(array('http' => array('method'=>"GET", 'timeout' => 5))); + $content = @file_get_contents('https://www.prestashop.com/partner/preactivation/preactivation-warnings.php?version=1.0&partner=paypal&iso_country='.Tools::strtolower(Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT'))).'&iso_lang='.Tools::strtolower(Language::getIsoById(intval($cookie->id_lang))).'&id_lang='.(int)$cookie->id_lang.'&email='.urlencode(Configuration::get('PS_SHOP_EMAIL')).'&security='.md5(Configuration::get('PS_SHOP_EMAIL')._COOKIE_IV_), false, $context); + $content = explode('|', $content); + if ($content[0] == 'OK') + { + if (!empty($this->warning)) + $this->warning .= ', '; + $this->warning .= $content[1]; + } + } + + public function install() + { + /* Install and register on hook */ + if (!parent::install() + OR !$this->registerHook('payment') + OR !$this->registerHook('paymentReturn') + OR !$this->registerHook('shoppingCartExtra') + OR !$this->registerHook('backBeforePayment') + OR !$this->registerHook('paymentReturn') + OR !$this->registerHook('rightColumn') + OR !$this->registerHook('cancelProduct') + OR !$this->registerHook('adminOrder')) + return false; + + if (file_exists(_PS_ROOT_DIR_.'/modules/paypalapi/paypalapi.php') AND !Configuration::get('PAYPAL_NEW')) + { + include_once(_PS_ROOT_DIR_.'/modules/paypalapi/paypalapi.php'); + $paypalapi = new PaypalAPI(); + return $this->_checkAndUpdateFromOldVersion(true); + } + + /* Set database */ + if (!Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_order` ( + `id_order` int(10) unsigned NOT NULL, + `id_transaction` varchar(255) NOT NULL, + `payment_method` int(10) unsigned NOT NULL, + `payment_status` varchar(255) NOT NULL, + `capture` int(10) unsigned NOT NULL, + PRIMARY KEY (`id_order`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) + return false; + + /* Set configuration */ + Configuration::updateValue('PAYPAL_SANDBOX', 1); + Configuration::updateValue('PAYPAL_BUSINESS', 'paypal@prestashop.com'); + Configuration::updateValue('PAYPAL_HEADER', ''); + Configuration::updateValue('PAYPAL_API_USER', ''); + Configuration::updateValue('PAYPAL_API_PASSWORD', ''); + Configuration::updateValue('PAYPAL_API_SIGNATURE', ''); + Configuration::updateValue('PAYPAL_EXPRESS_CHECKOUT', 0); + Configuration::updateValue('PAYPAL_CAPTURE', 0); + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', _PAYPAL_INTEGRAL_); + Configuration::updateValue('PAYPAL_TEMPLATE', 'A'); + Configuration::updateValue('PAYPAL_NEW', 1); + Configuration::updateValue('PAYPAL_DEBUG_MODE', 0); + + if (!Configuration::get('PAYPAL_OS_AUTHORIZATION')) + { + $orderState = new OrderState(); + $orderState->name = array(); + foreach (Language::getLanguages() AS $language) + { + if (strtolower($language['iso_code']) == 'fr') + $orderState->name[$language['id_lang']] = 'Autorisation acceptée par PayPal'; + else + $orderState->name[$language['id_lang']] = 'Authorization accepted from PayPal'; + } + $orderState->send_email = false; + $orderState->color = '#DDEEFF'; + $orderState->hidden = false; + $orderState->delivery = false; + $orderState->logable = true; + $orderState->invoice = true; + if ($orderState->add()) + copy(dirname(__FILE__).'/../../img/os/'._PS_OS_PAYPAL_.'.gif', dirname(__FILE__).'/../../img/os/'.(int)$orderState->id.'.gif'); + Configuration::updateValue('PAYPAL_OS_AUTHORIZATION', (int)$orderState->id); + } + + return true; + } + + public function uninstall() + { + /* Delete all configurations */ + Configuration::deleteByName('PAYPAL_SANDBOX'); + Configuration::deleteByName('PAYPAL_BUSINESS'); + Configuration::deleteByName('PAYPAL_HEADER'); + Configuration::deleteByName('PAYPAL_API_USER'); + Configuration::deleteByName('PAYPAL_API_PASSWORD'); + Configuration::deleteByName('PAYPAL_API_SIGNATURE'); + Configuration::deleteByName('PAYPAL_EXPRESS_CHECKOUT'); + Configuration::deleteByName('PAYPAL_PAYMENT_METHOD'); + Configuration::deleteByName('PAYPAL_TEMPLATE'); + Configuration::deleteByName('PAYPAL_CAPTURE'); + Configuration::deleteByName('PAYPAL_DEBUG_MODE'); + + return parent::uninstall(); + } + + public function getContent() + { + $this->_html .= '

    '.$this->l('PayPal').'

    '; + + $this->_postProcess(); + $this->_setPayPalSubscription(); + if (file_exists(_PS_ROOT_DIR_.'/modules/paypalapi/paypalapi.php')) + $this->_html .= '

    '.$this->l('All features of Paypal API module are be include in this new module. In order to don\'t have any conflict, please don\'t use and remove PayPalAPI module.').'

    '; + $this->_setConfigurationForm(); + + return $this->_html; + } + + public function hookPayment($params) + { + global $smarty; + + if (!$this->active) + return ; + /* + * PAYMENT METHOD: + * 0: Integral + * 1: Option + + * 2: Integral Evolution + */ + if (Configuration::get('PAYPAL_PAYMENT_METHOD') == _PAYPAL_INTEGRAL_EVOLUTION_) + return $this->display(__FILE__, 'integral_evolution/paypal.tpl'); + elseif (Configuration::get('PAYPAL_PAYMENT_METHOD') == _PAYPAL_INTEGRAL_ OR Configuration::get('PAYPAL_PAYMENT_METHOD') == _PAYPAL_OPTION_PLUS_) + { + if ($this->_isPayPalAPIAvailable()) + { + $smarty->assign('integral', (Configuration::get('PAYPAL_PAYMENT_METHOD') == 0 ? 1 : 0)); + $smarty->assign('logo', _MODULE_DIR_.$this->name.'/paypal.gif'); + return $this->display(__FILE__, 'payment/payment.tpl'); + } + else + return $this->display(__FILE__, 'standard/paypal.tpl'); + } + else + die($this->l('No valid payment method selected')); + } + + public function hookShoppingCartExtra($params) + { + global $cookie, $smarty; + + if (!$this->active) + return ; + + if (Configuration::get('PAYPAL_EXPRESS_CHECKOUT') AND !$cookie->isLogged(true) AND $this->_isPayPalAPIAvailable()) + { + $smarty->assign('logo', $this->getLogo(true)); + return $this->display(__FILE__, 'express/shopping_cart.tpl'); + } + } + + public function hookPaymentReturn($params) + { + if (!$this->active) + return ; + + return $this->display(__FILE__, 'confirmation.tpl'); + } + + public function hookRightColumn($params) + { + global $smarty, $cookie; + + $smarty->assign('iso_code', Tools::strtolower(Language::getIsoById($cookie->id_lang ? (int)($cookie->id_lang) : 1))); + $smarty->assign('logo', $this->getLogo(false, true)); + return $this->display(__FILE__, 'column.tpl'); + } + + public function hookLeftColumn($params) + { + return $this->hookRightColumn($params); + } + + public function hookBackBeforePayment($params) + { + if (!$this->active) + return ; + + /* Only execute if you use PayPal API for payment */ + if (Configuration::get('PAYPAL_PAYMENT_METHOD') != _PAYPAL_INTEGRAL_EVOLUTION_ AND $this->_isPayPalAPIAvailable()) + { + global $cookie; + + if ($params['module'] != $this->name) + return false; + if (!$token = $cookie->paypal_token) + return false; + if (!$payerID = $cookie->paypal_payer_id) + return false; + Tools::redirect('modules/paypal/express/submit.php?confirm=1&token='.$token.'&payerID='.$payerID); + } + } + + public function hookAdminOrder($params) + { + if (Tools::isSubmit('paypal')) + { + switch (Tools::getValue('paypal')) + { + case 'captureOk': + $message = $this->l('Funds have been recovered.'); + break; + case 'captureError': + $message = $this->l('Recovery of funds request unsuccessful. Please see log message!'); + break; + case 'validationOk': + $message = $this->l('Validation successful. Please see log message!'); + break; + case 'refundOk': + $message = $this->l('Refund has been made.'); + break; + case 'refundError': + $message = $this->l('Refund request unsuccessful. Please see log message!'); + break; + } + if (isset($message) AND $message) + $this->_html .= ' +
    +
    + '.$message.' +
    '; + } + + if ($this->_needValidation((int)$params['id_order']) AND $this->_isPayPalAPIAvailable()) + { + $this->_html .= '
    +
    + '.$this->l('PayPal Validation').' +

    '.$this->l('Information:').' '.(OrderHistory::getLastOrderState((int)($params['id_order']))->id == (int)(Configuration::get('PAYPAL_OS_AUTHORIZATION')) ? $this->l('Pending Capture - No shipping') : $this->l('Pending Payment - No shipping')).'

    +
    + +

    +
    '; + $this->_postProcess(); + $this->_html .= '
    '; + } + + if ($this->_needCapture((int)$params['id_order']) AND $this->_isPayPalAPIAvailable()) + { + $this->_html .= '
    +
    + '.$this->l('PayPal Capture').' +

    '.$this->l('Information:').' '.$this->l('Funds ready to be captured before shipping.').'

    +
    + +

    +
    '; + $this->_postProcess(); + $this->_html .= '
    '; + } + + if ($this->_canRefund((int)$params['id_order']) AND $this->_isPayPalAPIAvailable()) + { + $this->_html .= '
    +
    + '.$this->l('PayPal Refund').' +

    '.$this->l('Information:').' '.$this->l('Payment accepted').'

    +

    '.$this->l('Information:').' '.$this->l('When you refund a product, a partial refund is made unless you select "Generate a voucher".').'

    +
    + +

    +
    '; + $this->_postProcess(); + $this->_html .= '
    '; + } + + return $this->_html; + } + + public function hookCancelProduct($params) + { + if (Tools::isSubmit('generateDiscount')) + return false; + if (!$this->_isPayPalAPIAvailable()) + return false; + if ($params['order']->module != $this->name) + return false; + if (!($order = $params['order']) OR !Validate::isLoadedObject($order)) + return false; + if (!$order->hasBeenPaid()) + return false; + if (!($order_detail = new OrderDetail((int)($params['id_order_detail']))) OR !Validate::isLoadedObject($order_detail)) + return false; + + $id_transaction = $this->_getTransactionId((int)($order->id)); + if (!$id_transaction) + return false; + + $products = $order->getProducts(); + $amt = $products[(int)($order_detail->id)]['product_price_wt'] * (int)($_POST['cancelQuantity'][(int)($order_detail->id)]); + + $response = $this->_makeRefund($id_transaction, (float)($amt)); + $message = $this->l('Cancel products result:').'
    '; + foreach ($response AS $k => $value) + $message .= $k.': '.$value.'
    '; + $this->_addNewPrivateMessage((int)$order->id, $message); + } + + public function makePayPalAPIValidation($cookie, $cart, $id_currency, $payerID, $type) + { + global $cookie; + + if (!$this->active) + return ; + if (!$this->_isPayPalAPIAvailable()) + return ; + + // Filling-in vars + $id_cart = (int)($cart->id); + $currency = new Currency((int)($id_currency)); + $iso_currency = $currency->iso_code; + $token = $cookie->paypal_token; + $total = (float)($cart->getOrderTotal(true, Cart::BOTH)); + $paymentType = Configuration::get('PAYPAL_CAPTURE') == 1 ? 'Authorization' : 'Sale'; + $serverName = urlencode($_SERVER['SERVER_NAME']); + $bn = ($type == 'express' ? 'ECS' : 'ECM'); + $notifyURL = urlencode(Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/paypal/ipn.php'); + + // Getting address + if (isset($cookie->id_cart) AND $cookie->id_cart) + $cart = new Cart((int)($cookie->id_cart)); + if (isset($cart->id_address_delivery) AND $cart->id_address_delivery) + $address = new Address((int)($cart->id_address_delivery)); + $requestAddress = ''; + if (Validate::isLoadedObject($address)) + { + $country = new Country((int)($address->id_country)); + $state = new State((int)($address->id_state)); + $requestAddress = '&SHIPTONAME='.urlencode($address->company.' '.$address->firstname.' '.$address->lastname).'&SHIPTOSTREET='.urlencode($address->address1.' '.$address->address2).'&SHIPTOCITY='.urlencode($address->city).'&SHIPTOSTATE='.urlencode($address->id_state ? $state->iso_code :$country->iso_code).'&SHIPTOCOUNTRYCODE='.urlencode($country->iso_code).'&SHIPTOZIP='.urlencode($address->postcode); + } + + // Making request + $request='&TOKEN='.urlencode($token).'&PAYERID='.urlencode($payerID).'&PAYMENTACTION='.$paymentType.'&AMT='.$total.'&CURRENCYCODE='.$iso_currency.'&IPADDRESS='.$serverName.'&NOTIFYURL='.$notifyURL.'&BUTTONSOURCE=PRESTASHOP_'.$bn.$requestAddress ; + $discounts = (float)$cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS); + if ($discounts == 0) + { + $products = $cart->getProducts(); + $amt = 0; + for ($i = 0; $i < sizeof($products); $i++) + { + $request .= '&L_NAME'.$i.'='.substr(urlencode($products[$i]['name'].(isset($products[$i]['attributes'])?' - '.$products[$i]['attributes']:'').(isset($products[$i]['instructions'])?' - '.$products[$i]['instructions']:'') ), 0, 127); + $request .= '&L_AMT'.$i.'='.urlencode(round($products[$i]['price'], 2)); + $request .= '&L_QTY'.$i.'='.urlencode($products[$i]['cart_quantity']); + $amt += round($products[$i]['price']*$products[$i]['cart_quantity'], 2); + } + $shipping = round($cart->getOrderShippingCost($cart->id_carrier, false), 2); + $request .= '&ITEMAMT='.urlencode($amt); + $request .= '&SHIPPINGAMT='.urlencode($shipping); + $request .= '&TAXAMT='.urlencode((float)max(round($total - $amt - $shipping, 2), 0)); + } + else + { + $products = $cart->getProducts(); + $description = 0; + for ($i = 0; $i < sizeof($products); $i++) + $description .= ($description == ''?'':', ').$products[$i]['cart_quantity']." x ".$products[$i]['name'].(isset($products[$i]['attributes'])?' - '.$products[$i]['attributes']:'').(isset($products[$i]['instructions'])?' - '.$products[$i]['instructions']:'') ; + $request .= '&ORDERDESCRIPTION='.urlencode(substr($description, 0, 120)); + } + + + // Calling PayPal API + include_once(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + $ppAPI = new PaypalLib(); + $result = $ppAPI->makeCall($this->getAPIURL(), $this->getAPIScript(), 'DoExpressCheckoutPayment', $request); + $this->_logs = array_merge($this->_logs, $ppAPI->getLogs()); + + // Checking PayPal result + if (!is_array($result) OR !sizeof($result)) + $this->displayPayPalAPIError($this->l('Authorization to PayPal failed.'), $this->_logs); + elseif (!isset($result['ACK']) OR strtoupper($result['ACK']) != 'SUCCESS') + $this->displayPayPalAPIError($this->l('PayPal return error.'), $this->_logs); + elseif (!isset($result['TOKEN']) OR $result['TOKEN'] != $cookie->paypal_token) + { + $logs[] = ''.$ppExpress->l('Token given by PayPal is not the same as the cookie token', 'submit').''; + $ppExpress->displayPayPalAPIError($ppExpress->l('PayPal return error.', 'submit'), $logs); + } + + // Making log + $id_transaction = $result['TRANSACTIONID']; + if (Configuration::get('PAYPAL_CAPTURE')) + $this->_logs[] = $this->l('Authorization for deferred payment granted by PayPal.'); + else + $this->_logs[] = $this->l('Order finished with PayPal!'); + $message = Tools::htmlentitiesUTF8(strip_tags(implode("\n", $this->_logs))); + + // Order status + switch ($result['PAYMENTSTATUS']) + { + case 'Completed': + $id_order_state = _PS_OS_PAYMENT_; + break; + case 'Pending': + if ($result['PENDINGREASON'] != 'authorization') + $id_order_state = _PS_OS_PAYPAL_; + else + $id_order_state = (int)(Configuration::get('PAYPAL_OS_AUTHORIZATION')); + break; + default: + $id_order_state = _PS_OS_ERROR_; + } + + // Call payment validation method + $this->validateOrder($id_cart, $id_order_state, (float)($cart->getOrderTotal(true, Cart::BOTH)), $this->displayName, $message, array('transaction_id' => $id_transaction, 'payment_status' => $result['PAYMENTSTATUS'], 'pending_reason' => $result['PENDINGREASON']), $id_currency, false, $cart->secure_key); + + // Clean cookie + unset($cookie->paypal_token); + + // Displaying output + $order = new Order((int)($this->currentOrder)); + Tools::redirect('index.php?controller=order-confirmation&id_cart='.(int)($id_cart).'&id_module='.(int)($this->id).'&id_order='.(int)($this->currentOrder).'&key='.$order->secure_key); + + } + + public function validateOrder($id_cart, $id_order_state, $amountPaid, $paymentMethod = 'Unknown', $message = NULL, $extraVars = array(), $currency_special = NULL, $dont_touch_amount = false, $secure_key = false) + { + if (!$this->active) + return; + + parent::validateOrder($id_cart, $id_order_state, $amountPaid, $paymentMethod, $message, $extraVars, $currency_special, $dont_touch_amount, $secure_key); + + if (array_key_exists('transaction_id', $extraVars) AND array_key_exists('payment_status', $extraVars)) + $this->_saveTransaction($id_cart, $extraVars); + } + + public function getPayPalURL() + { + return 'www'.(Configuration::get('PAYPAL_SANDBOX') ? '.sandbox' : '').'.paypal.com'; + } + + public function getPaypalIntegralEvolutionUrl() + { + if (Configuration::get('PAYPAL_SANDBOX')) + return 'https://'.$this->getPayPalURL().'/cgi-bin/acquiringweb'; + return 'https://securepayments.paypal.com/acquiringweb?cmd=_hosted-payment'; + } + + public function getPaypalStandardUrl() + { + return 'https://'.$this->getPayPalURL().'/cgi-bin/webscr'; + } + + public function getAPIURL() + { + return 'api-3t'.(Configuration::get('PAYPAL_SANDBOX') ? '.sandbox' : '').'.paypal.com'; + } + + public function getAPIScript() + { + return '/nvp'; + } + + public function getL($key) + { + $translations = array( + 'mc_gross' => $this->l('Paypal key \'mc_gross\' not specified, can\'t control amount paid.'), + 'payment_status' => $this->l('Paypal key \'payment_status\' not specified, can\'t control payment validity'), + 'payment' => $this->l('Payment: '), + 'custom' => $this->l('Paypal key \'custom\' not specified, cannot relay to cart'), + 'txn_id' => $this->l('Paypal key \'txn_id\' not specified, transaction unknown'), + 'mc_currency' => $this->l('Paypal key \'mc_currency\' not specified, currency unknown'), + 'cart' => $this->l('Cart not found'), + 'order' => $this->l('Order has already been placed'), + 'transaction' => $this->l('Paypal Transaction ID: '), + 'verified' => $this->l('The PayPal transaction could not be VERIFIED.'), + 'connect' => $this->l('Problem connecting to the PayPal server.'), + 'nomethod' => $this->l('No communications transport available.'), + 'socketmethod' => $this->l('Verification failure (using fsockopen). Returned: '), + 'curlmethod' => $this->l('Verification failure (using cURL). Returned: '), + 'curlmethodfailed' => $this->l('Connection using cURL failed'), + 'Please wait, redirecting to Paypal... Thanks.' => $this->l('Please wait, redirecting to Paypal... Thanks.'), + 'Cancel' => $this->l('Cancel'), + 'My cart' => $this->l('My cart'), + 'Return to shop' => $this->l('Return to shop'), + 'Paypal error: (invalid or undefined business account email)' => $this->l('Paypal error: (invalid or undefined business account e-mail)'), + 'Paypal error: (invalid address or customer)' => $this->l('Paypal error: (invalid address or customer)') + ); + if (!isset($translations[$key])) + return $key; + return $translations[$key]; + } + + public function getLogo($ppExpress = false, $vertical = false) + { + global $cookie; + + if ($ppExpress) + { + $iso_code = Tools::strtoupper(Language::getIsoById($cookie->id_lang ? (int)$cookie->id_lang : 1)); + $logo = array( + 'FR' => 'FR', + 'DE' => 'DE', + 'US' => 'US', + 'GB' => 'UK', + 'ES' => 'ES', + 'IT' => 'IT', + 'PL' => 'PL', + 'NL' => 'NL', + 'AU' => 'AU', + 'CA' => 'CA', + 'CN' => 'CN', + 'JP' => 'JP' + ); + if (!isset($logo[$iso_code])) + $iso_code = 'US'; + return _MODULE_DIR_.$this->name.'/img/'.$logo[$iso_code].'_pp_express.gif'; + } + + if (Configuration::get('PAYPAL_PAYMENT_METHOD') == _PAYPAL_INTEGRAL_) + { + $country_code = $this->getCountryCode(); + $logo = array( + 'FR' => _MODULE_DIR_.$this->name.'/img/FR_pp_integral.gif', + 'DE' => _MODULE_DIR_.$this->name.'/img/DE_pp_integral.gif', + 'US' => _MODULE_DIR_.$this->name.'/img/US_pp_integral.gif', + 'GB' => _MODULE_DIR_.$this->name.'/img/UK_pp_integral.gif', + 'ES' => _MODULE_DIR_.$this->name.'/img/ES_pp_integral.gif', + 'IT' => _MODULE_DIR_.$this->name.'/img/IT_pp_integral.gif', + 'PL' => _MODULE_DIR_.$this->name.'/img/PL_pp_integral.gif', + 'NL' => _MODULE_DIR_.$this->name.'/img/NL_pp_integral.gif', + 'AU' => _MODULE_DIR_.$this->name.'/img/AU_pp_integral.gif', + 'CA' => _MODULE_DIR_.$this->name.'/img/CA_pp_integral.gif', + 'CN' => _MODULE_DIR_.$this->name.'/img/CN_pp_integral.gif', + 'JP' => _MODULE_DIR_.$this->name.'/img/JP_pp_integral.gif', + 'FR_vertical' => _MODULE_DIR_.$this->name.'/img/vertical_FR_large.png', + 'US_vertical' => _MODULE_DIR_.$this->name.'/img/vertical_US_large.png' + ); + if (isset($logo[$country_code.($vertical ? '_vertical' : '')])) + return $logo[$country_code.($vertical ? '_vertical' : '')]; + return ($vertical ? $logo['US_vertical'] : $logo['US']); + } + elseif (Configuration::get('PAYPAL_PAYMENT_METHOD') == _PAYPAL_INTEGRAL_EVOLUTION_) + return _MODULE_DIR_.$this->name.'/img/integral_evolution'.($vertical ? '_vertical' : '').'.png'; + return _MODULE_DIR_.$this->name.'/img/PayPal_mark_60x38.gif'; + } + + public function getCountryCode() + { + global $cookie; + + $cart = new Cart((int)$cookie->id_cart); + $address = new Address((int)$cart->id_address_invoice); + $country = new Country((int)$address->id_country); + return $country->iso_code; + } + + public function displayPayPalAPIError($message, $log = false) + { + global $cookie, $smarty; + + $send = true; + // Sanitize log + foreach ($log AS $key => $string) + if ($string == 'ACK -> Success') + $send = false; + elseif (substr($string, 0, 6) == 'METHOD') + { + $values = explode('&', $string); + foreach ($values AS $key2 => $value) + { + $values2 = explode('=', $value); + foreach ($values2 AS $key3 => $value2) + if ($value2 == 'PWD' || $value2 == 'SIGNATURE') + $values2[$key3 + 1] = '*********'; + $values[$key2] = implode('=', $values2); + } + $log[$key] = implode('&', $values); + } + + include(dirname(__FILE__).'/../../header.php'); + $smarty->assign('message', $message); + $smarty->assign('logs', $log); + $data = array('{logs}' => implode('
    ', $log)); + if ($send) + Mail::Send((int)($cookie->id_lang), 'error_reporting', Mail::l('Error reporting from your PayPal module'), $data, Configuration::get('PS_SHOP_EMAIL'), NULL, NULL, NULL, NULL, NULL, _PS_MODULE_DIR_.$this->name.'/mails/'); + echo $this->display(__FILE__, 'error.tpl'); + include_once(dirname(__FILE__).'/../../footer.php'); + die; + } + + private function _saveTransaction($id_cart, $extraVars) + { + $cart = new Cart((int)($id_cart)); + if (Validate::isLoadedObject($cart) AND $cart->OrderExists()) + { + $id_order = Db::getInstance()->getValue(' + SELECT `id_order` + FROM `'._DB_PREFIX_.'orders` + WHERE `id_cart` = '.(int)$cart->id); + + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'paypal_order` (`id_order`, `id_transaction`, `payment_method`, `payment_status`, `capture`) + VALUES ('.(int)$id_order.', \''.pSQL($extraVars['transaction_id']).'\', '.(int)Configuration::get('PAYPAL_PAYMENT_METHOD').', \''.pSQL($extraVars['payment_status']).((isset($extraVars['pending_reason']) AND $extraVars['pending_reason'] == 'authorization') ? '_authorization' : '').'\', '.(int)(Configuration::get('PAYPAL_CAPTURE')).')'); + } + } + + private function _canRefund($id_order) + { + if (!(int)$id_order) + return false; + $paypal_order = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int)$id_order); + if (!is_array($paypal_order) OR !sizeof($paypal_order)) + return false; + if ($paypal_order['payment_status'] != 'Completed' OR $paypal_order['capture'] != 0) + return false; + return true; + } + + private function _needValidation($id_order) + { + if (!(int)$id_order) + return false; + $order = Db::getInstance()->getRow(' + SELECT `payment_method`, `payment_status` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int)$id_order); + if (!$order) + return false; + return $order['payment_status'] == 'Pending' AND $order['payment_method'] == _PAYPAL_INTEGRAL_EVOLUTION_; + } + + private function _needCapture($id_order) + { + if (!(int)$id_order) + return false; + $result = Db::getInstance()->getRow(' + SELECT `payment_method`, `payment_status`, `capture` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int)($id_order).' AND `capture` = 1'); + if (!isset($result['payment_method'])) + return false; + if ($result['payment_status'] != 'Pending_authorization' AND $result['payment_status'] != 'Completed') + return false; + return true; + } + + private function _setConfigurationForm() + { + $this->_html .= ' +
    + + + + +
    +
    +

    '.$this->l('Solution').'

    + '.$this->_getSolutionTabHtml().' +
    +
    +

    '.$this->l('Settings').'

    + '.$this->_getSettingsTabHtml().' +
    +
    +

    '.$this->l('Logos and personalization').'

    + '.$this->_getPersonalizationsTabHtml().' +
    +
    +
    + +
    '; + } + + private function _getSolutionTabHtml() + { + global $cookie; + + $paymentMethod = (int)(Tools::getValue('payment_method', Configuration::get('PAYPAL_PAYMENT_METHOD'))); + $paypalExpress = (int)(Tools::isSubmit('paypal_express') ? 1 : Configuration::get('PAYPAL_EXPRESS_CHECKOUT')); + $paypalDebug = (int)(Tools::isSubmit('paypal_debug') ? 1 : Configuration::get('PAYPAL_DEBUG_MODE')); + + $link = 'http://altfarm.mediaplex.com/ad/ck/3484-23403-8030-88?ID=PROCPRESTA'; + $lang = new Language((int)$cookie->id_lang); + if (strtolower($lang->iso_code) == 'es') + $link = 'http://altfarm.mediaplex.com/ad/ck/3484-34334-12439-1'; + else if (strtolower($lang->iso_code) == 'it') + $link = 'https://www.paypal-business.it/paypalpro.asp'; + + return ' +

    '.$this->l('Solution').'

    +

    '.$this->l('Choose a solution:').'

    +
      +
    • +
    • * '.$this->l('(PayPal Integral Evolution, monthly subscription)').'
    • +
    • +
    +

    * '.$this->l('Activation subject to conditions').', '.$this->l('click here to subscribe').'

    +

    '.$this->l('Option:').'

    +
      +
    • +
    • +
    +

    +
    + '.$this->l('Important:').' + '.$this->l('To use any PayPal solution, you need to set up API parameters in the « Settings » Tab').' +
    '; + } + + private function _getSettingsTabHtml() + { + global $cookie; + + $lang = new Language((int)$cookie->id_lang); + $sandboxMode = (int)(Tools::getValue('sandbox_mode', Configuration::get('PAYPAL_SANDBOX'))); + $paypalCapture = (int)(Tools::getValue('paypal_capture', Configuration::get('PAYPAL_CAPTURE'))); + + $html = ' +

    '.$this->l('Settings').'

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

    '.$this->l('Activation of API calls').'

    + +
    + +
    +
    + +
    + +

    '.$this->l('Leave blank if the password has not changed').'

    +
    + +
    + +
    +

    + '.$this->l('Click here to learn how to generate your API username, password and signature.').' +

    +

    '; + return $html; + } + + private function _getPersonalizationsTabHtml() + { + global $cookie; + + $lang = new Language((int)$cookie->id_lang); + $template_paypal = Tools::getValue('template_paypal', Configuration::get('PAYPAL_TEMPLATE')); + + return ' +

    '.$this->l('Logos and personalizations').'

    + +
    + +

    '.$this->l('The image should be hosted on a secure (https) server. Max: 750x90px.').'

    +
    + +
    + + + +
    + '.($lang->iso_code == 'fr' ? '

    '.$this->l('Click here to learn how to customize these templates').'

    ' : '').' +

    '; + } + + private function _setPayPalSubscription() + { + $this->_html .= ' +
    +

    '.$this->l('Opening your PayPal account').'

    +
    +

    '.$this->l('When opening your PayPal account by clicking on the following image, you are helping us significantly to improve the PrestaShop software:').'

    +

    PrestaShop & PayPal

    +
    +
    + + '.$this->l('This module allows you to accept payments by PayPal.').'

    + '.$this->l('If the client chooses this payment mode, your PayPal account will be automatically credited.').'
    + '.$this->l('You need to configure your PayPal account before using this module.').' +
     
    '; + } + + private function _postProcess() + { + global $currentIndex, $cookie; + + if (Tools::isSubmit('submitPayPal')) + { + $template_available = array('A', 'B', 'C'); + if (!Validate::isUnsignedInt(Tools::getValue('payment_method')) OR (int)(Tools::getValue('payment_method')) > 2) + $this->_errors[] = $this->l('Invalid solution'); + if (Tools::getValue('email_paypal') == NULL AND Tools::getValue('api_username') == NULL AND Tools::getValue('api_signature') == NULL) + $this->_errors[] = $this->l('Indicate account information.'); + if (Tools::getValue('email_paypal') != NULL AND !Validate::isEmail(Tools::getValue('email_paypal'))) + $this->_errors[] = $this->l('E-mail invalid'); + if (Tools::getValue('banner_url') != NULL AND !Validate::isUrl(Tools::getValue('banner_url'))) + $this->_errors[] = $this->l('URL for banner is invalid'); + elseif (Tools::getValue('banner_url') != NULL AND strpos(Tools::getValue('banner_url'), 'https://') === false) + $this->_errors[] = $this->l('URL for banner must use HTTPS protocol'); + if (!in_array(Tools::getValue('template_paypal'), $template_available)) + $this->_errors[] = $this->l('PayPal template invalid.'); + if (Tools::getValue('paypal_capture') == 1 AND (Tools::getValue('api_username') == NULL OR Tools::getValue('api_signature') == NULL)) + $this->_errors[] = $this->l('Cannot use Authorization / capture without API Credentials.'); + if (Tools::getValue('payment_method') == _PAYPAL_INTEGRAL_EVOLUTION_ AND (Tools::getValue('api_username') == NULL OR Tools::getValue('api_signature') == NULL)) + $this->_errors[] = $this->l('Cannot use this solution without API Credentials.'); + if (Tools::isSubmit('paypal_express') AND (Tools::getValue('api_username') == NULL OR Tools::getValue('api_signature') == NULL)) + $this->_errors[] = $this->l('Cannot use PayPal Express without API Credentials.'); + + if (!sizeof($this->_errors)) + { + Configuration::updateValue('PAYPAL_SANDBOX', (int)(Tools::getValue('sandbox_mode'))); + Configuration::updateValue('PAYPAL_BUSINESS', trim(Tools::getValue('email_paypal'))); + Configuration::updateValue('PAYPAL_HEADER', Tools::getValue('banner_url')); + Configuration::updateValue('PAYPAL_API_USER', trim(Tools::getValue('api_username'))); + Configuration::updateValue('PAYPAL_API_PASSWORD', Tools::getValue('api_password')); + Configuration::updateValue('PAYPAL_API_SIGNATURE', trim(Tools::getValue('api_signature'))); + Configuration::updateValue('PAYPAL_EXPRESS_CHECKOUT', (int)(Tools::isSubmit('paypal_express'))); + Configuration::updateValue('PAYPAL_MODE_DEBUG', (int)(Tools::isSubmit('paypal_debug'))); + Configuration::updateValue('PAYPAL_CAPTURE', (int)(Tools::getValue('paypal_capture'))); + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', (int)(Tools::getValue('payment_method'))); + Configuration::updateValue('PAYPAL_TEMPLATE', Tools::getValue('template_paypal')); + if (Tools::getValue('payment_method') == _PAYPAL_INTEGRAL_EVOLUTION_) + $method = 'Paypal Integrale Evolution'; + elseif (Tools::getValue('payment_method') == _PAYPAL_INTEGRAL_) + $method = 'Paypal Integrale'; + elseif (Tools::getValue('payment_method') == _PAYPAL_OPTION_PLUS_) + $method = 'Paypal Integrale'; + else + $method = ''; + $this->_html = $this->displayConfirmation($this->l('Settings updated').''); + } + else + { + $error_msg = ''; + foreach ($this->_errors AS $error) + $error_msg .= $error.'
    '; + $this->_html = $this->displayError($error_msg); + } + } + + if (Tools::isSubmit('submitPayPalValidation')) + { + if (!($response = $this->_updatePaymentStatusOfOrder((int)(Tools::getValue('id_order')))) OR !sizeof($response)) + $this->_html .= '

    '.$this->l('Error obtaining payment status.').'

    '; + else + { + if ($response['ACK'] == 'Success') + { + if ($response['PAYMENTSTATUS'] == 'Completed' OR $response['PAYMENTSTATUS'] == 'Reversed' OR ($response['PAYMENTSTATUS'] == 'Pending' AND $response['PENDINGREASON'] == 'authorization')) + Tools::redirectAdmin($currentIndex.'&id_order='.(int)(Tools::getValue('id_order')).'&vieworder&paypal=validationOk&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + else + $this->_html .= '

    '.$this->l('Status').': '.$response['PAYMENTSTATUS'].' ('.$this->l('Reason:').' '.$response['PENDINGREASON'].')

    '; + } + else + $this->_html .= '

    '.$this->l('Error from PayPal: ').$response['L_LONGMESSAGE0'].' (#'.$response['L_ERRORCODE0'].')

    '; + } + } + + if (Tools::isSubmit('submitPayPalCapture')) + { + if (!($response = $this->_doCapture((int)(Tools::getValue('id_order')))) OR !sizeof($response)) + $this->_html .= '

    '.$this->l('Error when making capture request').'

    '; + else + { + if ($response['ACK'] == 'Success') + { + if ($response['PAYMENTSTATUS'] == 'Completed') + Tools::redirectAdmin($currentIndex.'&id_order='.(int)(Tools::getValue('id_order')).'&vieworder&paypal=captureOk&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + else + Tools::redirectAdmin($currentIndex.'&id_order='.(int)(Tools::getValue('id_order')).'&vieworder&paypal=captureError&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + } + else + $this->_html .= '

    '.$this->l('Error from PayPal: ').$response['L_LONGMESSAGE0'].' (#'.$response['L_ERRORCODE0'].')

    '; + } + } + + if (Tools::isSubmit('submitPayPalRefund')) + { + if (!($response = $this->_doTotalRefund((int)(Tools::getValue('id_order')))) OR !sizeof($response)) + $this->_html .= '

    '.$this->l('Error when making refund request').'

    '; + else + { + if ($response['ACK'] == 'Success') + { + if ($response['REFUNDTRANSACTIONID'] != '') + Tools::redirectAdmin($currentIndex.'&id_order='.(int)(Tools::getValue('id_order')).'&vieworder&paypal=refundOk&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + else + Tools::redirectAdmin($currentIndex.'&id_order='.(int)(Tools::getValue('id_order')).'&vieworder&paypal=refundError&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + } + else + $this->_html .= '

    '.$this->l('Error from PayPal: ').$response['L_LONGMESSAGE0'].' (#'.$response['L_ERRORCODE0'].')

    '; + } + } + } + + private function _getTransactionId($id_order) + { + if (!(int)$id_order) + return false; + + return Db::getInstance()->getValue(' + SELECT `id_transaction` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_order` = '.(int)$id_order); + } + + private function _makeRefund($id_transaction, $amt = false) + { + include_once(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + + if (!$this->_isPayPalAPIAvailable()) + die(Tools::displayError('Fatal Error: no API Credentials are available')); + if (!$id_transaction) + die(Tools::displayError('Fatal Error: id_transaction is null')); + + if (!$amt) + $request = '&TRANSACTIONID='.urlencode($id_transaction).'&REFUNDTYPE=Full'; + else + { + $isoCurrency = Db::getInstance()->getValue(' + SELECT `iso_code` + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'currency` c ON (o.`id_currency` = c.`id_currency`)'); + $request = '&TRANSACTIONID='.urlencode($id_transaction).'&REFUNDTYPE=Partial&AMT='.(float)($amt).'&CURRENCYCODE='.urlencode(strtoupper($isoCurrency)); + } + $paypalLib = new PaypalLib(); + return $paypalLib->makeCall($this->getAPIURL(), $this->getAPIScript(), 'RefundTransaction', $request); + } + + private function _addNewPrivateMessage($id_order, $message) + { + if (!$id_order) + return false; + $msg = new Message(); + $message = strip_tags($message, '
    '); + if (!Validate::isCleanHtml($message)) + $message = $this->l('Payment message is not valid, please check your module.'); + $msg->message = $message; + $msg->id_order = (int)($id_order); + $msg->private = 1; + + return $msg->add(); + } + + private function _doTotalRefund($id_order) + { + global $cookie; + + if (!$this->_isPayPalAPIAvailable()) + return false; + if (!$id_order) + return false; + + $id_transaction = $this->_getTransactionId((int)($id_order)); + if (!$id_transaction) + return false; + + $order = new Order((int)($id_order)); + if (!Validate::isLoadedObject($order)) + return false; + $products = $order->getProducts(); + // Amount for refund + $amt = 0.00; + foreach ($products AS $product) + if ($product['product_quantity_refunded'] == 0) + $amt += (float)($product['total_price']); + $amt += (float)($order->total_shipping); + // check if total or partial + if ($order->total_products_wt == $amt) + $response = $this->_makeRefund($id_transaction); + else + $response = $this->_makeRefund($id_transaction, (float)($amt)); + $message = $this->l('Refund operation result:').'
    '; + foreach ($response AS $k => $value) + $message .= $k.': '.$value.'
    '; + if (array_key_exists('ACK', $response) AND $response['ACK'] == 'Success' AND $response['REFUNDTRANSACTIONID'] != '') + { + $message .= $this->l('PayPal refund successful!'); + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'paypal_order` SET `payment_status` = \'Refunded\' WHERE `id_order` = '.(int)($id_order))) + die(Tools::displayError('Error when updating PayPal database')); + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState(_PS_OS_REFUND_, (int)($id_order)); + $history->addWithemail(); + } + else + $message .= $this->l('Transaction error!'); + $this->_addNewPrivateMessage((int)($id_order), $message); + + return $response; + } + + private function _doCapture($id_order) + { + global $cookie; + + include_once(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + + if (!$this->_isPayPalAPIAvailable()) + return false; + if (!$id_order) + return false; + + $id_transaction = $this->_getTransactionId((int)($id_order)); + if (!$id_transaction) + return false; + + $order = new Order((int)($id_order)); + $currency = new Currency((int)($order->id_currency)); + $request = '&AUTHORIZATIONID='.urlencode($id_transaction).'&AMT='.(float)($order->total_paid).'&CURRENCYCODE='.$currency->iso_code.'&COMPLETETYPE=Complete'; + $paypalLib = new PaypalLib(); + $response = $paypalLib->makeCall($this->getAPIURL(), $this->getAPIScript(), 'DoCapture', $request); + $message = $this->l('Capture operation result:').'
    '; + foreach ($response AS $k => $value) + $message .= $k.': '.$value.'
    '; + if (array_key_exists('ACK', $response) AND $response['ACK'] == 'Success' AND $response['PAYMENTSTATUS'] == 'Completed') + { + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState(_PS_OS_PAYMENT_, (int)$id_order); + $history->addWithemail(); + $message .= $this->l('Order finished with PayPal!'); + } + elseif (isset($response['PAYMENTSTATUS'])) + $message .= $this->l('Transaction error!'); + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'paypal_order` SET `capture` = 0, `payment_status` = \''.pSQL($response['PAYMENTSTATUS']).'\', `id_transaction` = \''.pSQL($response['TRANSACTIONID']).'\' WHERE `id_order` = '.(int)$id_order)) + die(Tools::displayError('Error when updating PayPal database')); + $this->_addNewPrivateMessage((int)($id_order), $message); + + return $response; + } + + private function _updatePaymentStatusOfOrder($id_order) + { + global $cookie; + + include_once(_PS_MODULE_DIR_.'paypal/api/paypallib.php'); + + if (!$this->_isPayPalAPIAvailable()) + return false; + if (!$id_order) + return false; + + $id_transaction = $this->_getTransactionId((int)($id_order)); + if (!$id_transaction) + return false; + + $request = '&TRANSACTIONID='.urlencode($id_transaction); + $paypalLib = new PaypalLib(); + $response = $paypalLib->makeCall($this->getAPIURL(), $this->getAPIScript(), 'GetTransactionDetails', $request); + if (array_key_exists('ACK', $response)) + { + if ($response['ACK'] == 'Success') + { + if (isset($response['PAYMENTSTATUS'])) + { + if ($response['PAYMENTSTATUS'] == 'Completed') + { + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState(_PS_OS_PAYMENT_, (int)($id_order)); + $history->addWithemail(); + } + elseif ($response['PAYMENTSTATUS'] == 'Pending' AND $response['PENDINGREASON'] == 'authorization') + { + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState((int)(Configuration::get('PAYPAL_OS_AUTHORIZATION')), (int)($id_order)); + $history->addWithemail(); + } + elseif ($response['PAYMENTSTATUS'] == 'Reversed') + { + $history = new OrderHistory(); + $history->id_order = (int)($id_order); + $history->changeIdOrderState(_PS_OS_ERROR_, (int)($id_order)); + $history->addWithemail(); + } + if (!Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'paypal_order` SET `payment_status` = \''.pSQL($response['PAYMENTSTATUS']).($response['PENDINGREASON'] == 'authorization' ? '_authorization' : '').'\' WHERE `id_order` = '.(int)$id_order)) + die(Tools::displayError('Error when updating PayPal database')); + } + } + $message = $this->l('Verification status:').'
    '; + foreach ($response AS $k => $value) + $message .= $k.': '.$value.'
    '; + $this->_addNewPrivateMessage((int)$id_order, $message); + return $response; + } + return false; + } + + private function _isPayPalAPIAvailable() + { + if (Configuration::get('PAYPAL_API_USER') != NULL AND Configuration::get('PAYPAL_API_PASSWORD') != NULL AND Configuration::get('PAYPAL_API_SIGNATURE') != NULL) + return true; + return false; + } + + private function _checkAndUpdateFromOldVersion($install = false) + { + if (!Configuration::get('PAYPAL_NEW') AND ($this->active OR $install)) + { + $ok = true; + /* Check PayPal API */ + if (file_exists(_PS_ROOT_DIR_.'/modules/paypalapi/paypalapi.php')) + { + $confs = Configuration::getMultiple(array('PAYPAL_HEADER', 'PAYPAL_SANDBOX', 'PAYPAL_API_USER', 'PAYPAL_API_PASSWORD', 'PAYPAL_API_SIGNATURE', 'PAYPAL_EXPRESS_CHECKOUT')); + include_once(_PS_ROOT_DIR_.'/modules/paypalapi/paypalapi.php'); + $paypalapi = new PayPalAPI(); + if ($paypalapi->active) + { + if (Configuration::get('PAYPAL_INTEGRAL') == 1) + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', _PAYPAL_INTEGRAL_); + elseif (Configuration::get('PAYPAL_INTEGRAL') == 0) + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', _PAYPAL_OPTION_PLUS_); + $paypalapi->uninstall(); + Configuration::loadConfiguration(); + foreach ($confs AS $key => $value) + Configuration::updateValue($key, $value); + } + } + /* Create Table */ + if (!Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'paypal_order` ( + `id_order` int(10) unsigned NOT NULL auto_increment, + `id_transaction` varchar(255) NOT NULL, + PRIMARY KEY (`id_order`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) + $ok = false; + if (!Db::getInstance()->Execute(' + ALTER TABLE `'._DB_PREFIX_.'paypal_order` ADD `payment_method` INT NOT NULL, + ADD `payment_status` VARCHAR(255) NOT NULL, + ADD `capture` INT NOT NULL')) + $ok = false; + + /* Hook */ + $this->registerHook('cancelProduct'); + $this->registerHook('adminOrder'); + + /* Create OrderState */ + if (!Configuration::get('PAYPAL_OS_AUTHORIZATION')) + { + $orderState = new OrderState(); + $orderState->name = array(); + foreach (Language::getLanguages() AS $language) + { + if (strtolower($language['iso_code']) == 'fr') + $orderState->name[$language['id_lang']] = 'Autorisation acceptée par PayPal'; + else + $orderState->name[$language['id_lang']] = 'Authorization accepted from PayPal'; + } + $orderState->send_email = false; + $orderState->color = '#DDEEFF'; + $orderState->hidden = false; + $orderState->delivery = false; + $orderState->logable = true; + $orderState->invoice = true; + if ($orderState->add()) + copy(_PS_ROOT_DIR_.'/img/os/'._PS_OS_PAYPAL_.'.gif', _PS_ROOT_DIR_.'/img/os/'.(int)($orderState->id).'.gif'); + Configuration::updateValue('PAYPAL_OS_AUTHORIZATION', (int)($orderState->id)); + } + /* Delete unseless configuration */ + Configuration::deleteByName('PAYPAL_INTEGRAL'); + + /* Add new Configurations */ + if (!Configuration::get('PAYPAL_PAYMENT_METHOD')) + Configuration::updateValue('PAYPAL_PAYMENT_METHOD', _PAYPAL_INTEGRAL_); + Configuration::updateValue('PAYPAL_CAPTURE', 0); + Configuration::updateValue('PAYPAL_TEMPLATE', 'A'); + + if ($ok) + Configuration::updateValue('PAYPAL_NEW', 1); + return $ok; + } + return false; + } + + public function getOrder($id_transaction) + { + return Db::getInstance()->getValue(' + SELECT `id_order` + FROM `'._DB_PREFIX_.'paypal_order` + WHERE `id_transaction` = \''.pSQL($id_transaction).'\''); + } +} diff --git a/modules/paypal/prestashop_paypal.png b/modules/paypal/prestashop_paypal.png new file mode 100644 index 0000000000000000000000000000000000000000..0561139900e1d4f561bbc807bfd8ea8116f68d7f GIT binary patch literal 5388 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + + {l s='Pay with PayPal' mod='paypal'} + {l s='Pay with PayPal' mod='paypal'} + +

    diff --git a/modules/paypal/standard/redirect.php b/modules/paypal/standard/redirect.php new file mode 100644 index 000000000..4c24f12cd --- /dev/null +++ b/modules/paypal/standard/redirect.php @@ -0,0 +1,89 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../../config/config.inc.php'); +include(dirname(__FILE__).'/../../../init.php'); +include(dirname(__FILE__).'/../paypal.php'); + +$paypal = new Paypal(); +$cart = new Cart((int)($cookie->id_cart)); + +$address = new Address((int)($cart->id_address_delivery)); +$country = new Country((int)($address->id_country)); +$state = NULL; +if ($address->id_state) + $state = new State((int)($address->id_state)); +$customer = new Customer((int)($cart->id_customer)); +$business = Configuration::get('PAYPAL_BUSINESS'); +$header = Configuration::get('PAYPAL_HEADER'); +$currency_order = new Currency((int)($cart->id_currency)); +$currency_module = $paypal->getCurrency((int)($cart->id_currency)); + +if (empty($business) OR !Validate::isEmail($business)) + die($paypal->getL('Paypal error: (invalid or undefined business account email)')); + +if (!Validate::isLoadedObject($address) OR !Validate::isLoadedObject($customer) OR !Validate::isLoadedObject($currency_module)) + die($paypal->getL('Paypal error: (invalid address or customer)')); + +// check currency of payment +if ($currency_order->id != $currency_module->id) +{ + $cookie->id_currency = $currency_module->id; + $cart->id_currency = $currency_module->id; + $cart->update(); +} + +$smarty->assign(array( + 'redirect_text' => $paypal->getL('Please wait, redirecting to Paypal... Thanks.'), + 'cancel_text' => $paypal->getL('Cancel'), + 'cart_text' => $paypal->getL('My cart'), + 'return_text' => $paypal->getL('Return to shop'), + 'paypal_url' => $paypal->getPaypalStandardUrl(), + 'address' => $address, + 'country' => $country, + 'state' => $state, + 'amount' => (float)($cart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING)), + 'customer' => $customer, + 'total' => (float)($cart->getOrderTotal(true, Cart::BOTH)), + 'shipping' => Tools::ps_round((float)($cart->getOrderShippingCost()) + (float)($cart->getOrderTotal(true, Cart::ONLY_WRAPPING)), 2), + 'discount' => $cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS), + 'business' => $business, + 'currency_module' => $currency_module, + 'cart_id' => (int)($cart->id).'_'.pSQL($cart->secure_key), + 'products' => $cart->getProducts(), + 'paypal_id' => (int)($paypal->id), + 'header' => $header, + 'url' => Tools::getShopDomain(true, true).__PS_BASE_URI__ +)); + + +if (is_file(_PS_THEME_DIR_.'modules/paypal/standard/redirect.tpl')) + $smarty->display(_PS_THEME_DIR_.'modules/'.$paypal->name.'/standard/redirect.tpl'); +else + $smarty->display(_PS_MODULE_DIR_.$paypal->name.'/standard/redirect.tpl'); + + diff --git a/modules/paypal/standard/redirect.tpl b/modules/paypal/standard/redirect.tpl new file mode 100644 index 000000000..59a9a8ae1 --- /dev/null +++ b/modules/paypal/standard/redirect.tpl @@ -0,0 +1,90 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + PayPal + + + +

    {$redirect_text}
    {$cancel_text}

    + + + + diff --git a/modules/paypal/validation.php b/modules/paypal/validation.php new file mode 100644 index 000000000..2ec3a5fd3 --- /dev/null +++ b/modules/paypal/validation.php @@ -0,0 +1,151 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/paypal.php'); + +$errors = ''; +$result = false; +$paypal = new Paypal(); + +// Fill params +$params = 'cmd=_notify-validate'; +foreach ($_POST AS $key => $value) + $params .= '&'.$key.'='.urlencode(stripslashes($value)); + +// PayPal Server +$paypalServer = 'www.'.(Configuration::get('PAYPAL_SANDBOX') ? 'sandbox.' : '').'paypal.com'; + +// Getting PayPal data... +if (function_exists('curl_exec')) +{ + // curl ready + $ch = curl_init('https://' . $paypalServer . '/cgi-bin/webscr'); + + // If the above fails, then try the url with a trailing slash (fixes problems on some servers) + if (!$ch) + $ch = curl_init('https://' . $paypalServer . '/cgi-bin/webscr/'); + + if (!$ch) + $errors .= $paypal->getL('connect').' '.$paypal->getL('curlmethodfailed'); + else + { + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $params); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + + $result = curl_exec($ch); + + if (strtoupper($result) != 'VERIFIED') + $errors .= $paypal->getL('curlmethod').$result.' cURL error:'.curl_error($ch); + curl_close($ch); + } +} +elseif (($fp = @fsockopen('ssl://' . $paypalServer, 443, $errno, $errstr, 30)) || ($fp = @fsockopen($paypalServer, 80, $errno, $errstr, 30))) +{ + // fsockopen ready + $header = 'POST /cgi-bin/webscr HTTP/1.0'."\r\n" . + 'Host: '.$paypalServer."\r\n". + 'Content-Type: application/x-www-form-urlencoded'."\r\n". + 'Content-Length: '.Tools::strlen($params)."\r\n". + 'Connection: close'."\r\n\r\n"; + fputs($fp, $header.$params); + + $read = ''; + while (!feof($fp)) + { + $reading = trim(fgets($fp, 1024)); + $read .= $reading; + if (strtoupper($reading) == 'VERIFIED' OR strtoupper($reading) == 'INVALID') + { + $result = $reading; + break; + } + } + if (strtoupper($result) != 'VERIFIED') + $errors .= $paypal->getL('socketmethod').$result; + fclose($fp); +} +else + $errors = $paypal->getL('connect').$paypal->getL('nomethod'); + +$cart_secure = (isset($_POST['custom']) ? explode('_', $_POST['custom']) : array()); +// If there isn't any cart ID, set it to "0" +if (!isset($cart_secure[0])) + $cart_secure[0] = 0; +// If there isn't any secure key, set it to anything short of "false" +if (!isset($cart_secure[1])) + $cart_secure[1] = '42'; + +// Printing errors... +if (strtoupper($result) == 'VERIFIED') +{ + if (!isset($_POST['mc_gross'])) + { + $errors .= $paypal->getL('mc_gross').'
    '; + $_POST['mc_gross'] = 0; + } + if (!isset($_POST['payment_status'])) + { + $errors .= $paypal->getL('payment_status').'
    '; + $_POST['payment_status'] = 'ko'; + } + elseif (strtoupper($_POST['payment_status']) != 'COMPLETED') + $errors .= $paypal->getL('payment').$_POST['payment_status'].'
    '; + if (!isset($_POST['custom'])) + $errors .= $paypal->getL('custom').'
    '; + if (!isset($_POST['txn_id'])) + { + $errors .= $paypal->getL('txn_id').'
    '; + $_POST['txn_id'] = 0; + } + if (!isset($_POST['mc_currency'])) + $errors .= $paypal->getL('mc_currency').'
    '; + if (empty($errors)) + { + $cart = new Cart((int)$cart_secure[0]); + if (!$cart->id) + $errors = $paypal->getL('cart').'
    '; + elseif (Order::getOrderByCartId((int)($cart_secure[0]))) + $errors = $paypal->getL('order').'
    '; + else + $paypal->validateOrder((int)$cart_secure[0], _PS_OS_PAYMENT_, (float)($_POST['mc_gross']), $paypal->displayName, $paypal->getL('transaction').$_POST['txn_id'], array('transaction_id' => $_POST['txn_id'], 'payment_status' => $_POST['payment_status']), NULL, false, $cart_secure[1]); + } +} +else + $errors .= $paypal->getL('verified'); + +if (!empty($errors) AND isset($_POST['custom'])) +{ + if (strtoupper($_POST['payment_status']) == 'PENDING') + $paypal->validateOrder((int)$cart_secure[0], _PS_OS_PAYPAL_, (float)$_POST['mc_gross'], $paypal->displayName, $paypal->getL('transaction').$_POST['txn_id'].'
    '.$errors, array('transaction_id' => $_POST['txn_id'], 'payment_status' => $_POST['payment_status']), NULL, false, $cart_secure[1]); + else + $paypal->validateOrder((int)$cart_secure[0], _PS_OS_ERROR_, 0, $paypal->displayName, $errors.'
    ', array(), NULL, false, $cart_secure[1]); +} diff --git a/modules/paysafecard/Disposition.php b/modules/paysafecard/Disposition.php new file mode 100644 index 000000000..792084e59 --- /dev/null +++ b/modules/paysafecard/Disposition.php @@ -0,0 +1,82 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class Disposition +{ + const TABLE_NAME = 'disposition'; + + public static function create($id_cart, $mtid, $amount, $currency) + { + return Db::getInstance()->Execute( + 'INSERT INTO `'._DB_PREFIX_.self::TABLE_NAME.'` (`id_cart`, `mtid`, `amount`, `currency`) + VALUES ('.(int)($id_cart).',\''.pSQL($mtid).'\','.(float)($amount).',\''.pSQL($currency).'\')'); + } + + public static function delete($id) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_disposition` = '.(int)($id)); + } + + public static function deleteByCartId($id_cart) + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_cart` = '.(int)($id_cart)); + } + + public static function getByCartId($id_cart) + { + return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_cart` = '.(int)($id_cart)); + } + + public static function createTable() + { + return Db::getInstance()->Execute( + 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'` ( + `id_disposition` int(11) NOT NULL AUTO_INCREMENT, + `id_cart` int(11) NOT NULL, + `mtid` varchar(20) NOT NULL, + `amount` float NOT NULL, + `currency` varchar(3) NOT NULL, + PRIMARY KEY (`id_disposition`), + UNIQUE KEY `id_cart` (`id_cart`) + ) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); + } + + public static function dropTable() + { + return Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'`'); + } + + public static function updateAmount($id_disposition, $amount) + { + return Db::getInstance()->Execute( + 'UPDATE `'._DB_PREFIX_.self::TABLE_NAME.'` SET `amount` = `amount` - '.(float)($amount).' WHERE `id_disposition` = '.(int)($id_disposition)); + } + + +} + + diff --git a/modules/paysafecard/PrepaidServices.php b/modules/paysafecard/PrepaidServices.php new file mode 100644 index 000000000..124bae23c --- /dev/null +++ b/modules/paysafecard/PrepaidServices.php @@ -0,0 +1,663 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +$module_name = 'paysafecard'; + +include(_PS_MODULE_DIR_.$module_name.'/Disposition.php'); +include(_PS_MODULE_DIR_.$module_name.'/PrepaidServicesAPI.php'); + +abstract class PrepaidServices extends PaymentModule +{ + protected $max_amount = 1000; + protected $max_amount_currency = 'EUR'; + protected $default_language = 'en'; + + protected $prefix = ''; + + protected $environments = array('P' => 'Production', + 'T' => 'Test'); + + protected $business_types = array('I' => 'Intangible', + 'T' => 'Tangible'); + + // abstract + protected $supported_languages; + protected $allowed_currencies; + protected $supported_currencies; + protected $payment_url; + protected $prepaid_api_configuration; + protected $register_url; + + public function __construct() + { + parent::__construct(); + + if ($this->active AND !extension_loaded('curl')) + $this->warning = $this->getL('curl_required'); + } + + public function install() + { + $ps_ct_immediat_payment = Configuration::get($this->prefix.'IMMEDIAT_PAYMENT') ? Configuration::get($this->prefix.'IMMEDIAT_PAYMENT') : '1'; + $ps_ct_salt = Configuration::get($this->prefix.'SALT') ? Configuration::get($this->prefix.'SALT') : strtoupper(Tools::passwdGen(8)); + $ps_ct_business_type = Configuration::get($this->prefix.'BUSINESS_TYPE') ? Configuration::get($this->prefix.'BUSINESS_TYPE') : 'I'; + $ps_ct_environment = Configuration::get($this->prefix.'ENVIRONMENT') ? Configuration::get($this->prefix.'ENVIRONMENT') : 'T'; + + return parent::install() AND Disposition::createTable() AND $this->_createOrderState() AND + $this->registerHook('payment') AND $this->registerHook('paymentReturn') AND $this->registerHook('adminOrder') + AND Configuration::updateValue($this->prefix.'IMMEDIAT_PAYMENT', $ps_ct_immediat_payment) + AND Configuration::updateValue($this->prefix.'SALT', $ps_ct_salt) + AND Configuration::updateValue($this->prefix.'BUSINESS_TYPE', $ps_ct_business_type) + AND Configuration::updateValue($this->prefix.'ENVIRONMENT', $ps_ct_environment); + } + + private function _createOrderState() + { + + if (Configuration::get($this->prefix.'ORDER_STATE_ID') && Configuration::get($this->prefix.'ORDER_STATE_PART_ID')) return true; + + // Awaiting payment + $os = new OrderState(); + $os->name = array('1' => 'Awaiting '.$this->displayName.' payment', + '2' => 'En attente du paiement par '.$this->displayName, + '3' => 'En espera de pago por '.$this->displayName); + + $os->invoice = false; + $os->color = 'lightblue'; + $os->logable = true; + + if ($os->save()) + { + Configuration::updateValue($this->prefix.'ORDER_STATE_ID', $os->id); + + copy(_PS_MODULE_DIR_.$this->name.'/logo.gif',_PS_IMG_DIR_.'os/'.$os->id.'.gif'); + } else + return false; + + // Partially paid + $os1 = new OrderState(); + $os1->name = array('1' => 'Partially paid by '.$this->displayName, + '2' => 'Payé partiellement via '.$this->displayName, + '3' => 'Pagado parcialmente con '.$this->displayName); + + $os1->invoice = false; + $os1->color = 'lightblue'; + $os1->logable = true; + + if ($os1->save()) + { + Configuration::updateValue($this->prefix.'ORDER_STATE_PART_ID', $os1->id); + copy(_PS_MODULE_DIR_.$this->name.'/logo.gif',_PS_IMG_DIR_.'os/'.$os1->id.'.gif'); + return true; + } + + return false; + } + + private function _deleteOrderState() + { + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_ID'))); + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state_lang` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_ID'))); + + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_PART_ID'))); + DB::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'order_state_lang` WHERE `id_order_state` = '.(int)(Configuration::get($this->prefix.'ORDER_STATE_PART_ID'))); + + return true; + } + + public function getPaymentUrlBase() + { + return $this->payment_url[Configuration::get($this->prefix.'ENVIRONMENT')]; + } + + private function _getSupportedLanguageIsoById($id_lang) + { + $lang = Language::getIsoById((int)($id_lang)); + + return in_array($lang, $this->supported_languages) ? $lang : $this->default_language; + } + + private function _getRegisterLink($id_lang) + { + $lang = Language::getIsoById((int)($id_lang)); + return array_key_exists($lang, $this->register_url) ? $this->register_url[$lang] : $this->register_url[$this->default_language]; + } + + private function _getAllowedCurrencies() + { + if (empty($this->allowed_currencies)) + $this->allowed_currencies = DB::getInstance()->ExecuteS( + 'SELECT c.id_currency, c.iso_code, c.name, c.sign + FROM '._DB_PREFIX_.'currency c + WHERE c.deleted = 0 + AND iso_code IN (\''.implode('\',\'', $this->supported_currencies).'\')'); + + return $this->allowed_currencies; + } + + public function isCurrencyActive($currency_iso_code) + { + $mid = Configuration::get($this->prefix.'MERCHANT_ID_'.$currency_iso_code); + return ($mid && file_exists($this->certificat_dir.$mid.'.pem') && Configuration::get($this->prefix.'KEYRING_PW_'.$currency_iso_code)); + } + + public function createDisposition($cart) + { + global $cookie; + + $currency = new Currency((int)($cart->id_currency)); + $language = $this->_getSupportedLanguageIsoById((int)($cookie->id_lang)); + $mid = Configuration::get($this->prefix.'MERCHANT_ID_'.$currency->iso_code); + $mtid = $cart->id.'-'.time(); + $amount = number_format((float)($cart->getOrderTotal(true, Cart::BOTH)), 2, '.',''); + $currency_iso = $currency->iso_code; + $business_type = Configuration::get($this->prefix.'BUSINESS_TYPE'); + $reporting_criteria = ''; + + $hash = md5(Configuration::get($this->prefix.'SALT') + $amount + $currency_iso); + + $ok_url = Tools::getShopDomainSsl(true, true)._MODULE_DIR_.$this->name.'/payment.php?hash='.$hash; + $nok_url = Tools::getShopDomainSsl(true, true).'index.php?controller=order&step=3'; + + list($return_code, $error_code, $message) = PrepaidServicesAPI::createDisposition($this->getAPIConfiguration($currency_iso), $mid, $mtid, $amount, $currency_iso, $ok_url, $nok_url, $business_type, $reporting_criteria); + + if ($return_code == 0) + { + Disposition::deleteByCartId((int)($cart->id)); // Avoid duplicate disposition (canceled orders in CT for example) + Disposition::create((int)($cart->id), $mtid, $amount, $currency_iso); + $message = $this->getPaymentUrlBase().'?currency='.$currency->iso_code.'&mid='.$mid.'&mtid='.$mtid.'&amount='.$amount.'&language='.$language; + } + + return array('return_code' => $return_code, 'message' => $message); + } + + public function getDispositionState($id_cart) + { + $disposition = Disposition::getByCartId((int)($id_cart)); + + if (!array_key_exists('id_disposition', $disposition)) + die(Tools::displayError()); + + return PrepaidServicesAPI::getSerialNumbers($this->getAPIConfiguration($disposition['currency']), Configuration::get($this->prefix.'MERCHANT_ID_'.$disposition['currency']), $disposition['mtid'], $disposition['currency']); + } + + public function executeDebit($id_cart, $amount = NULL, $close_flag = 1) + { + $disposition = Disposition::getByCartId((int)($id_cart)); + if (!array_key_exists('id_disposition', $disposition)) + die(Tools::displayError()); + + if (!isset($amount) || $amount === '') + $amount = $disposition['amount']; + + $result = PrepaidServicesAPI::executeDebit($this->getAPIConfiguration($disposition['currency']), Configuration::get($this->prefix.'MERCHANT_ID_'.$disposition['currency']), $disposition['mtid'], number_format($amount, 2, '.', ''), $disposition['currency'], $close_flag); + + if ($result[0] == 0) + { + if ($amount == $disposition['amount'] || $close_flag) + Disposition::delete((int)($disposition['id_disposition'])); + else + Disposition::updateAmount((int)($disposition['id_disposition']), (float)($amount)); + } + + return $result; + } + + + public function getContent() + { + $out = '

    '.$this->displayName.'

    '; + $err_req = false; + + // check requirements + if (!extension_loaded('curl')) + { + $out .= $this->displayError($this->getL('curl_required')); + $err_req = true; + } + + + if (!is_writable($this->certificat_dir)) + { + $out .= $this->displayError($this->certificat_dir.' '.$this->getL('not_writable')); + $err_req = true; + } + + $id_currency = Currency::getIdByIsoCode($this->max_amount_currency); + if (empty($id_currency)) + { + $out .= $this->displayError($this->getL('currency_required').'['.$this->max_amount_currency.']'); + $err_req = true; + } + + if (!$err_req && Tools::isSubmit('submitCtConfiguration')) + { + $errors = $this->_validateForm(); + + if (empty($errors)) + $out .= $this->_postProcess(); + else + $out .= $errors; + } + + $out .= $this->_displayStyleAndJS(); + $out .= $this->_displayInfos(); + $out .= $this->_displayForm(); + + return $out; + } + + private function _displayStyleAndJS() + { + return ' + '; + } + + private function _displayForm() + { + $business_type_options = ''; + foreach ($this->business_types AS $key => $value) + $business_type_options .= ''; + + $currencies_configuration = '

    '.$this->getL('configure_currency').'

    +

    '.$this->getL('payment_not_displayed').'

    + '; + + $environment_radio = ''; + foreach ($this->environments AS $key => $value) + $environment_radio .= 'prefix.'ENVIRONMENT') == $key ? 'checked' : '').'>'. $value. '
    '; + + foreach ($this->_getAllowedCurrencies() AS $currency) + { + $currencies_configuration .= ' + + + + '; + } + $currencies_configuration .= '
    '.$this->getL('configuration_in').' '.$currency['name'].' '.$currency['sign'].' + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    '; + + return '
    +
    + '.$this->getL('configuration').' + +
    + '.$environment_radio.' +
    +
    + +
    + +
    +
    + +
    + prefix.'IMMEDIAT_PAYMENT') ? 'checked' : '').' /> +
    +
    +
    + '.$currencies_configuration.' +
    +
    + +
    + +
    +
    '; + } + + private function _displayInfos() + { + global $cookie; + + return '
    + '.$this->displayName.' +
    + '.$this->getL('introduction').' +

    + '.$this->getL('register').' +
    +

    '; + } + + private function _validateForm() + { + $errors = ''; + + foreach ($this->_getAllowedCurrencies() AS $currency) + { + $mid = trim(Tools::getValue('ct_merchant_id_'.$currency['iso_code'])); + + if (preg_match('/^[0-9]{10}$/', $mid)) + { + $mid_certificat = $_FILES['ct_keyring_certificate_'.$currency['iso_code']]; + + if (!$mid_certificat || $mid_certificat['error'] == 4 || $mid_certificat['error'] == 3) + { + if (!file_exists($this->certificat_dir.$mid.'.pem')) + $errors .= $this->displayError($this->getL('certificate_required').' ['.$currency['iso_code'].']'); + } + else + { + if ($mid_certificat['error']) + { + switch ($mid_certificat['error']) + { + case 3: // UPLOAD_ERR_PARTIAL + $errors .= $this->displayError($this->getL('file_partialy_uploaded')); + break; + + case 4: // UPLOAD_ERR_NO_FILE + $errors .= $this->displayError($this->getL('file_empty')); + break; + } + } + + if (substr($mid_certificat['name'], -4) != '.pem') + $errors .= $this->displayError($this->getL('invalid_file').' ['.$currency['iso_code'].']'); + } + } + elseif (!empty($mid)) + { + $errors .= $this->displayError($this->getL('invalid_merchant_id').' ['.$currency['iso_code'].']'); + } + } + + if (!array_key_exists(Tools::getValue('ct_business_type'), $this->business_types)) + $errors .= $this->getL('invalid_business_type'); + + if (!array_key_exists(Tools::getValue('ct_environment'), $this->environments)) + $errors .= $this->getL('invalid_environment'); + + return $errors; + } + + private function _acceptPayment($order, $disposition, $currency_sign, $amount = NULL) + { + $isCorrect = true; + if (!$disposition) + die(Tools::displayError()); + + if (!isset($amount) || $amount === '') + $amount = $disposition['amount']; + + $amount = number_format($amount, 2, '.', ''); + $close_flag = (int)($amount == $disposition['amount']); + + list($resultcode, $errorcode, $errormessage) = $this->executeDebit($disposition['id_cart'], $amount, $close_flag); + + $param = ''; + if ($resultcode != 0) + { + $message = $this->getL('payment_error').' '.$errormessage; + $isCorrect = false; + } + else + $message = $this->getL('payment_accepted') .'('.$amount.' '.$currency_sign.') '.($close_flag ? $this->getL('disposition_consumed') : '') ; + + $msg = new Message(); + $msg->message = $message; + $msg->id_order = (int)($order->id); + $msg->private = 1; + $msg->add(); + + if ($isCorrect) + { + if ($order->total_paid == $order->total_paid_real) + $order->total_paid_real = $amount; + else + $order->total_paid_real += $amount; + + $os = _PS_OS_PAYMENT_; + if ($order->total_paid != $order->total_paid_real) + $os = Configuration::get($this->prefix.'ORDER_STATE_PART_ID'); + + $history = new OrderHistory(); + $history->id_order = (int)($order->id); + $history->changeIdOrderState($os, (int)($order->id)); + $history->save(); + + $order->save(); + } + + return $isCorrect; + } + + public function _releasePayment($order, $disposition) + { + if (!$disposition) + die(Tools::displayError()); + + list($resultcode, $errorcode, $errormessage) = $this->executeDebit($disposition['id_cart'], 0, 1); + + $param = ''; + if ($resultcode != 0) + { + $message = $this->getL('release_error').' '.$errormessage; + $isCorrect = false; + } + else + $message = $this->getL('payment_released'); + + $msg = new Message(); + $msg->message = $message; + $msg->id_order = (int)($order->id); + $msg->private = 1; + $msg->add(); + + return $errorcode; + } + + private function _postProcess() + { + Configuration::updateValue($this->prefix.'BUSINESS_TYPE', Tools::getValue('ct_business_type')); + Configuration::updateValue($this->prefix.'ENVIRONMENT', Tools::getValue('ct_environment')); + + $immediat_payment = Tools::getValue('ct_immediat_payment'); + if (Configuration::get($this->prefix.'BUSINESS_TYPE') == 'I') + $immediat_payment = 1; + + Configuration::updateValue($this->prefix.'IMMEDIAT_PAYMENT', $immediat_payment); + + $params = ''; + $dataSync = ''; + $delim = '?'; + $key = 1; + foreach ($this->_getAllowedCurrencies() AS $currency) + { + $mid = trim(Tools::getValue('ct_merchant_id_'.$currency['iso_code'])); + + Configuration::updateValue($this->prefix.'MERCHANT_ID_'.$currency['iso_code'], $mid); + Configuration::updateValue($this->prefix.'KEYRING_PW_'.$currency['iso_code'], Tools::getValue('ct_keyring_pw_'.$currency['iso_code'])); + + if (isset($_FILES['ct_keyring_certificate_'.$currency['iso_code']])) + move_uploaded_file($_FILES['ct_keyring_certificate_'.$currency['iso_code']]['tmp_name'], $this->certificat_dir.$mid.'.pem'); + + if ($mid) + { + $params .= $delim.'mid'.$key.'='.urlencode($mid).'¤cy'.$key.'='.urlencode($currency['iso_code']); + $delim = '&'; + $key++; + } + } + + if (!empty($params)) + $dataSync = ''; + + return $this->displayConfirmation($this->getL('settings_updated').$dataSync); + } + + public function hookPayment($params) + { + global $smarty; + + // check currency + $currency = new Currency((int)($params['cart']->id_currency)); + + if (!$this->isCurrencyActive($currency->iso_code)) + return false; + + // check max amount + $amount = (float)($params['cart']->getOrderTotal(true, Cart::BOTH)); + $id_currency_max = Currency::getIdByIsoCode($this->max_amount_currency); + + if ($currency->id != $id_currency_max) + { + $amount = $amount / $currency->conversion_rate; + $amount = Tools::convertPrice($amount, new Currency((int)($id_currency_max))); + } + + if ($amount > $this->max_amount) + return false; + + $smarty->assign(array('pic_url' => _MODULE_DIR_.'/'.$this->name.'/img/payment-logo.png', + 'payment_name' => $this->displayName, + 'module_name' => $this->name)); + + return $this->display(__FILE__, 'payment.tpl'); + } + + + public function hookPaymentReturn($params) + { + global $smarty, $cookie; + + if ($params['objOrder']->module != $this->name) + return; + + $smarty->assign('payment_name', $this->displayName); + return $this->display(__FILE__, $this->name.'-confirmation.tpl'); + } + + + public function hookAdminOrder($params) + { + global $smarty, $cookie; + $error = 0; + $order = new Order((int)($params['id_order'])); + + if (!Validate::isLoadedObject($order)) + die(Tools::displayError()); + + if ($order->module != $this->name) + return false; + + $disposition = Disposition::getByCartId((int)($order->id_cart)); + if (!$disposition) // No disposition = Order paid + return false; + + // check disposition state + $res = PrepaidServicesAPI::getSerialNumbers($this->getAPIConfiguration($disposition['currency']), Configuration::get($this->prefix.'MERCHANT_ID_'.$disposition['currency']), $disposition['mtid'], $disposition['currency']); + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + + // if the disposition is not "active" + if ($res[5] != PrepaidServicesAPI::DISPOSITION_DISPOSED && $res[5] != PrepaidServicesAPI::DISPOSITION_DEBITED) + { + $smarty->assign(array('disposition_state' => $res[5], 'payment_name' => $order->payment)); + return $this->display($this->module_dir.'/'.$this->name, 'disposition-error.tpl'); + } + + if (Tools::isSubmit('acceptPayment')) + { + $amount = Tools::getValue('ps_amount'); + if (isset($amount) && !empty($amount) && $amount <= $res[3] && $amount > 0) + { + if (!$this->_acceptPayment($order, $disposition, $currency->getSign('right'), $amount)) + $error = 1; + } + else + $error = 2; + + $query_string = $error ? self::changeQueryStringParameter($_SERVER['QUERY_STRING'], 'pp_error', (int)($error)) : self::removeQueryStringParameter($_SERVER['QUERY_STRING'], 'pp_error'); + Tools::redirectAdmin(Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$query_string); + } else if (Tools::isSubmit('releasePayment')) { + if (!$this->_releasePayment($order, $disposition)) + $error = 1; + + $query_string = $error ? self::changeQueryStringParameter($_SERVER['QUERY_STRING'], 'pp_error', (int)($error)) : $_SERVER['QUERY_STRING']; + Tools::redirectAdmin(Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$query_string); + } + + $error_msg = ''; + if (Tools::getIsset('pp_error')) + $error_msg = $this->_getErrorMsgFromErrorCode(Tools::getValue('pp_error')); + + $smarty->assign(array('action' => Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$_SERVER['QUERY_STRING'], + 'payment_name' => $order->payment, + 'error' => $error_msg, + 'currency' => $currency->getSign('right'), + 'amount' => $res[3] + )); + + return $this->display($this->module_dir.'/'.$this->name, $this->name.'-accept-payment.tpl'); + } + + public function getAPIConfiguration($iso_currency) + { + return array('keyring_file' => $this->certificat_dir.Configuration::get($this->prefix.'MERCHANT_ID_'.strtoupper($iso_currency)).'.pem', + 'keyring_pw' => Configuration::get($this->prefix.'KEYRING_PW_'.strtoupper($iso_currency)), + 'keyring_prepaid' => $this->certificat_dir.'paysafecard-CA.pem', + 'env' => Configuration::get($this->prefix.'ENVIRONMENT')); + } + + public static function changeQueryStringParameter($query_string, $param, $value) + { + parse_str($query_string, $output); + $output[$param] = $value; + return http_build_query($output); + } + + public static function removeQueryStringParameter($query_string, $param) + { + parse_str($query_string, $output); + unset($output[$param]); + return http_build_query($output); + } + +} + diff --git a/modules/paysafecard/PrepaidServicesAPI.php b/modules/paysafecard/PrepaidServicesAPI.php new file mode 100644 index 000000000..55836cbfe --- /dev/null +++ b/modules/paysafecard/PrepaidServicesAPI.php @@ -0,0 +1,190 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PrepaidServicesAPI +{ + const DISPOSITION_CREATED = 'R'; + const DISPOSITION_DISPOSED = 'S'; + const DISPOSITION_DEBITED = 'E'; + const DISPOSITION_CONSUMED = 'O'; + const DISPOSITION_CANCELLED = 'L'; + const DISPOSITION_INVALID = 'I'; + const DISPOSITION_EXPIRED = 'X'; + + // Test & Production environment (shared between CT & PSC) + private static $base_url = array('T' => array('create_disposition_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/CreateDispositionServlet', + 'get_disposition_state_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/GetDispositionStateServlet', + 'execute_debit_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/DebitServlet', + 'get_serial_number_url' => 'https://shops.test.at.paysafecard.com/pscmerchant/GetSerialNumbersServlet' + ), + 'P' => array('create_disposition_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/CreateDispositionServlet', + 'get_disposition_state_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/GetDispositionStateServlet', + 'execute_debit_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/DebitServlet', + 'get_serial_number_url' => 'https://shops.cc.at.paysafecard.com/pscmerchant/GetSerialNumbersServlet' + )); + + public static function getBaseUrl($key, $env) + { + $base_url = self::$base_url[$env]; + + if (array_key_exists($key, $base_url)) + return $base_url[$key]; + + return ''; + } + + public static function createDisposition($configuration, $mid, $mtid, $amount, $currency, $okurl, $nokurl, $businesstype, $reportingcriteria) + { + $language = 'en'; + $params = 'currency='.$currency.'&mid='.$mid.'&mtid='.$mtid.'&amount='.$amount.'&businesstype='.$businesstype. + '&reportingcriteria='.$reportingcriteria.'&okurl='.$okurl.'&nokurl='.$nokurl.'&language='.$language; + + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('create_disposition_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + + if ($rc == 0) { + $data_array = explode("\n", $data,7); + $resultcode = trim($data_array[0]); + $errorcode = trim($data_array[1]); + $errormessage = trim($data_array[2]); + + return array($resultcode, $errorcode, $errormessage); + } else { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array($resultcode,$errorcode,$errormessage); + } + } + + public static function getDispositionState($configuration, $mid, $mtid, $currency_iso_code) + { + $language = 'en'; + $params = 'mid='.$mid.'&mtid='.$mtid.'&language='.$language; + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('get_disposition_state_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + + if ($rc == 0) { + $dataarray = explode("\n", $data,7); + $resultcode = trim($dataarray[0]); + $errorcode = trim($dataarray[1]); + $errormessage = trim($dataarray[2]); + $amount = trim($dataarray[3]); + $currency = trim($dataarray[4]); + $state = trim($dataarray[5]); + + return array($resultcode, $errorcode, $errormessage, $amount, $currency, $state); + } else { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array($resultcode, $errorcode, $errormessage); + } + } + + public static function getSerialNumbers($configuration, $mid, $mtid, $currency_iso_code) + { + $language = 'en'; + $params = 'mid='.$mid.'&mtid='.$mtid.'&language='.$language; + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('get_serial_number_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + if ($rc == 0) { + /* read and return data from paysafecard server */ + $dataarray = explode("\n", $data,7); + $resultcode = trim($dataarray[0]); + $errorcode = trim($dataarray[1]); + $errormessage = trim($dataarray[2]); + $amount = trim($dataarray[3]); + $currency = trim($dataarray[4]); + $state = trim($dataarray[5]); + $snamount = trim($dataarray[6]); + return array ($resultcode, $errorcode, $errormessage, $amount, $currency, $state, $snamount); + } else { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array ($resultcode, $errorcode, $errormessage); + } + } + + public static function executeDebit($configuration, $mid, $mtid, $amount, $currency, $close_flag = 1) + { + $language = 'en'; + $params = 'currency='.$currency.'&mid='.$mid.'&mtid='.$mtid.'&amount='.$amount.'&close='.$close_flag.'&language='.$language; + + list ($rc, $msg, $data) = self::_doHttpRequest(self::getBaseUrl('execute_debit_url', $configuration['env']), $params, $configuration['keyring_file'], $configuration['keyring_pw'], $configuration['keyring_prepaid']); + + if ($rc == 0) { + $dataarray=explode("\n", $data,7); + $resultcode=trim($dataarray[0]); + $errorcode=trim($dataarray[1]); + $errormessage=trim($dataarray[2]); + + return array ($resultcode, $errorcode, $errormessage); + } else { + $resultcode = '9001'; + $errorcode = $rc; + $errormessage = 'libcurl error: '.$msg; + + return array ($resultcode, $errorcode, $errormessage); + } + } + + private static function _doHttpRequest($url, $urlparam, $keyringfile, $keyringpw, $cakeyringfile) + { + /* some prerquisites for the connection */ + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_POST, 1); // a non-zero parameter tells the library to do a regular HTTP post. + curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); // add POST fields + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // don't allow redirects + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable + curl_setopt($ch, CURLOPT_TIMEOUT, 240); // maximum time, in seconds, that you'll allow the CURL functions to take + curl_setopt($ch, CURLOPT_SSLCERT, $keyringfile); // filename of PEM formatted certificate + curl_setopt($ch, CURLOPT_SSLCERTTYPE, "PEM"); // format of certificate, "PEM" or "DER" + curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $keyringpw); // password required to use the CURLOPT_SSLCERT certificate + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // verify the peer's certificate + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // verify the Common name from the peer certificate + curl_setopt($ch, CURLOPT_CAINFO, $cakeyringfile); // file holding one or more certificates to verify the peer with + + $data = curl_exec($ch); + $errno = curl_errno($ch); + $errmsg = curl_error($ch); + + /* bug fix for PHP 4.1.0/4.1.2 (curl_errno() returns high negative + * value in case of successful termination) */ + if ($errno < 0) $errno = 0; + + curl_close($ch); + + return array ($errno,$errmsg,$data); + } +} + + diff --git a/modules/paysafecard/config.xml b/modules/paysafecard/config.xml new file mode 100755 index 000000000..47ab4c356 --- /dev/null +++ b/modules/paysafecard/config.xml @@ -0,0 +1,12 @@ + + + paysafecard + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/paysafecard/de.php b/modules/paysafecard/de.php new file mode 100644 index 000000000..766eb652c --- /dev/null +++ b/modules/paysafecard/de.php @@ -0,0 +1,53 @@ +disposition-error_393988def796f78c4b673b90548f3afa'] = 'Der Dispositionsstatus ist ungültig'; +$_MODULE['<{paysafecard}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = 'Sie sind nicht berechtigt, die Zahlung durchzuführen.'; +$_MODULE['<{paysafecard}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Bezahlen Sie mit'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'Die Zahlung wurde noch nicht akzeptiert:'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Zahlung akzeptieren '; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Betrag freigeben'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Ihre Bestellung vom'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ist abgeschlossen.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Sie haben die '; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = '-Methode gewählt.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Ihre Bestellung wird sehr bald geschickt werden.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Bei Fragen oder für weitere Informationen, kontaktieren Sie bitte unseren'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'Kunden-Support'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9240e3ec97017ab6af036384ff7199'] = 'PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b3e93e632edfb4fa64c3c0949c5eb56d'] = 'Akzeptiert Zahlungen per Paysafecard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposition erstellt. Warten auf Belastung.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_894f0316a71ef67255369c82bf8a0e5b'] = 'Ungültiger Dispositionsstatus:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c1c25198721552ea8ddd963c7278d4ab'] = 'Ein Fehler ist bei der Zahlung aufgetreten:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_36ec50c0e914dd2fb48a1b27540512ce'] = 'Zahlung akzeptiert.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d6ca44369efe062cec0c09f392465f55'] = 'Dieses Modul erfordert das ordnungsgemäße Funktionieren der CURL PHP-Erweiterung.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_8e9647b486000683917484190b68ac8a'] = 'ist nicht beschreibbar!'; +$_MODULE['<{paysafecard}prestashop>paysafecard_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Dieses Modul erfordert die Währung:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Konfigurieren Sie jede Währung einzeln:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9c8794db26bbef6bd2aaa68c15211d'] = '(Das Zahlungsmodul wird nicht für Kunden angezeigt, die nicht konfigurierte Währung benutzen.)'; +$_MODULE['<{paysafecard}prestashop>paysafecard_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Konfiguration in'; +$_MODULE['<{paysafecard}prestashop>paysafecard_229a7ec501323b94db7ff3157a7623c9'] = 'Händler-ID'; +$_MODULE['<{paysafecard}prestashop>paysafecard_845314022daaa8b665e718c4b51738aa'] = 'Keyring Zertifikat'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a01813de717585e9ac9458bbfc54485a'] = 'Keyring PW'; +$_MODULE['<{paysafecard}prestashop>paysafecard_254f642527b45bc260048e30704edb39'] = 'Konfiguration'; +$_MODULE['<{paysafecard}prestashop>paysafecard_0ba29c6a1afacf586b03a26162c72274'] = 'Umgebung'; +$_MODULE['<{paysafecard}prestashop>paysafecard_1d5ad3d37f236c9eebda547690373bba'] = 'Geschäftsart'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b024248d9fecf8c34f629e89a9fb93b4'] = 'Sofortige Zahlung'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c80a51a60c5ee43553c3881459b8f431'] = 'Konfiguration aktualisieren'; +$_MODULE['<{paysafecard}prestashop>paysafecard_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Sie müssen ein Zertifikat für die Händler-ID vorweisen'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bbced877c13c763f0141ff906c8ed0e5'] = 'Ungültige Datei'; +$_MODULE['<{paysafecard}prestashop>paysafecard_97e5793f511c7930ab295997cb28553a'] = 'Ungültige Händler-ID'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c7c32346a2f800fc49f79d52f3f37f90'] = 'Die Datei wurde teilweise hochgeladen'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f09bc49e98e94cb04dc058087fbb3878'] = 'Die Datei ist leer'; +$_MODULE['<{paysafecard}prestashop>paysafecard_e9185d874b4244d6f13619cf77dca0aa'] = 'Die Transaktion konnte wegen Problemen mit der Verbindung nicht initiiert werden. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an unseren Support.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposition verbraucht'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c3e260f43a99b6fd907538953fe700d0'] = 'Disposition freigegeben'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f6a62a622cbba2c1b8cd0be062deff96'] = 'Ein Fehler ist während der Freigabe aufgetreten '; +$_MODULE['<{paysafecard}prestashop>paysafecard_315e941f57cf90350aea15d968e190f8'] = 'paysafecard ist Europas erste Prepaid-Lösung für Zahlungen im Internet in Übereinstimmung mit Bankgesetzen. In den letzten Jahren hat sich paysafecard zu einer der führenden alternativen europäischen Online-Payment-Lösungen entwickelt.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d59048f21fd887ad520398ce677be586'] = 'Erfahren Sie mehr'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ee363d108ef0c9c5a599d3afe04b9e32'] = 'Ein Fehler ist aufgetreten, überprüfen Sie die Mitteilungen, um mehr zu erfahren'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a9ced76f2dd6907220fa95b3a136b04a'] = 'Ungültiger Betrag'; + +?> \ No newline at end of file diff --git a/modules/paysafecard/disposition-error.tpl b/modules/paysafecard/disposition-error.tpl new file mode 100644 index 000000000..3645cbc7a --- /dev/null +++ b/modules/paysafecard/disposition-error.tpl @@ -0,0 +1,37 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
    +
    + {$payment_name} + +

    + {l s='The disposition state is invalid' mod='paysafecard'} ({$disposition_state}) + {l s='. You are not allowed to perform the payment.' mod='paysafecard'} + +

    +
    + diff --git a/modules/paysafecard/es.php b/modules/paysafecard/es.php new file mode 100755 index 000000000..32240854d --- /dev/null +++ b/modules/paysafecard/es.php @@ -0,0 +1,51 @@ +disposition-error_393988def796f78c4b673b90548f3afa'] = 'La disposición se encuentra en un estado no válido'; +$_MODULE['<{paysafecard}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = 'No está autorizado a recuperar el pago.'; +$_MODULE['<{paysafecard}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Pagar con'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'El pago aún no ha sido aceptado'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Aceptar el pago'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Rechazar el pago'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Su pedido en'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'ha sido registrado.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Ha elegido pagar con'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = 'método.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Su pedido será enviado rápidamente'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Para cualquier pregunta o información suplementaria, póngase en contacto con nuestro'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'servicio clientela'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9240e3ec97017ab6af036384ff7199'] = 'PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b3e93e632edfb4fa64c3c0949c5eb56d'] = 'Aceptar los pagos a través de PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposición creada. En espera del débito.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_894f0316a71ef67255369c82bf8a0e5b'] = 'El estado de la disposición no es válido:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c1c25198721552ea8ddd963c7278d4ab'] = 'Se ha producido un error durante el pago:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pago aceptado'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d6ca44369efe062cec0c09f392465f55'] = 'Este módulo necesita la librería PHP cURL para funcionar correctamente.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_8e9647b486000683917484190b68ac8a'] = 'no tiene los derechos en escritura.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Para funcionar correctamente, este módulo necesita la divisa:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Configurar cada divisa independientemente:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9c8794db26bbef6bd2aaa68c15211d'] = '(El módulo de pago no se mostrará a los clientes que utilicen una divisa no configurada)'; +$_MODULE['<{paysafecard}prestashop>paysafecard_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Configuración en'; +$_MODULE['<{paysafecard}prestashop>paysafecard_229a7ec501323b94db7ff3157a7623c9'] = 'ID vendedor'; +$_MODULE['<{paysafecard}prestashop>paysafecard_845314022daaa8b665e718c4b51738aa'] = 'Keyring Certificado'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a01813de717585e9ac9458bbfc54485a'] = 'Keyring PW'; +$_MODULE['<{paysafecard}prestashop>paysafecard_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{paysafecard}prestashop>paysafecard_0ba29c6a1afacf586b03a26162c72274'] = 'Entorno'; +$_MODULE['<{paysafecard}prestashop>paysafecard_1d5ad3d37f236c9eebda547690373bba'] = 'Tipo negocio'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b024248d9fecf8c34f629e89a9fb93b4'] = 'Pago inmediato'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c80a51a60c5ee43553c3881459b8f431'] = 'Actualizar la configuración'; +$_MODULE['<{paysafecard}prestashop>paysafecard_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Debe indicar un certificado para el ID vendedor'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bbced877c13c763f0141ff906c8ed0e5'] = 'Archivo no válido'; +$_MODULE['<{paysafecard}prestashop>paysafecard_97e5793f511c7930ab295997cb28553a'] = 'ID del vendedor no válido'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c7c32346a2f800fc49f79d52f3f37f90'] = 'El archivo no se ha cargado correctamente'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f09bc49e98e94cb04dc058087fbb3878'] = 'El archivo está vacío'; +$_MODULE['<{paysafecard}prestashop>paysafecard_e9185d874b4244d6f13619cf77dca0aa'] = 'La transacción no ha podido inicializarse por problemas de conexión. Si el problema persiste, contacte con nosotros.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposición consumida'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c3e260f43a99b6fd907538953fe700d0'] = 'Disposición abandonada'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f6a62a622cbba2c1b8cd0be062deff96'] = 'Se ha producido un error en el momento de abandonar.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_315e941f57cf90350aea15d968e190f8'] = 'Todo el mundo puede utilizar Paysafecard ya que no necesita ni tarjeta de crédito ni cuenta bancaria. En los últimos años, Paysafecard se ha convertido en uno de los líderes de los modos de pago en línea alternativos.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d59048f21fd887ad520398ce677be586'] = 'Más información'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ee363d108ef0c9c5a599d3afe04b9e32'] = 'Se ha producido un error. Consulte el apartado \"Mensajes\" para más información.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a9ced76f2dd6907220fa95b3a136b04a'] = 'Importe incorrecto'; diff --git a/modules/paysafecard/fr.php b/modules/paysafecard/fr.php new file mode 100755 index 000000000..5d3f4e69f --- /dev/null +++ b/modules/paysafecard/fr.php @@ -0,0 +1,51 @@ +disposition-error_393988def796f78c4b673b90548f3afa'] = 'La disposition est dans un état invalide'; +$_MODULE['<{paysafecard}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = '. Vous n\'êtes pas authorisé à récupérer le paiement.'; +$_MODULE['<{paysafecard}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Payer avec'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'Le paiement n\'a pas encore été accepté : '; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Accepter le paiement'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Relacher le paiement'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Votre commande sur'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'a bien été enregistrée.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Vous avez choisi de payer avec '; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = ' '; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Votre commande va être expediée rapidement.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Pour toutes questions ou informations complémentaires, contactez notre'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'service client'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9240e3ec97017ab6af036384ff7199'] = 'PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b3e93e632edfb4fa64c3c0949c5eb56d'] = 'Accepter les paiements via PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposition crée. En attente du débit.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_894f0316a71ef67255369c82bf8a0e5b'] = 'L\'état de la disposition est invalide :'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c1c25198721552ea8ddd963c7278d4ab'] = 'Une erreur est survenue pendant le paiement :'; +$_MODULE['<{paysafecard}prestashop>paysafecard_36ec50c0e914dd2fb48a1b27540512ce'] = 'Paiement accepté.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d6ca44369efe062cec0c09f392465f55'] = 'Ce module requiert la librairie PHP cURL pour fonctionner correctement.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_8e9647b486000683917484190b68ac8a'] = 'n\'a pas les droits en écriture.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Ce module pour fonctionner correctement requiert la devise :'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Configurer chaque devise indépendament :'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9c8794db26bbef6bd2aaa68c15211d'] = '(Le module de paiement ne sera pas affiché pour les clients qui utilisent une devise non configurée)'; +$_MODULE['<{paysafecard}prestashop>paysafecard_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Configuration en'; +$_MODULE['<{paysafecard}prestashop>paysafecard_229a7ec501323b94db7ff3157a7623c9'] = 'ID Marchand'; +$_MODULE['<{paysafecard}prestashop>paysafecard_845314022daaa8b665e718c4b51738aa'] = 'Keyring Certificat'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a01813de717585e9ac9458bbfc54485a'] = 'Keyring PW'; +$_MODULE['<{paysafecard}prestashop>paysafecard_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{paysafecard}prestashop>paysafecard_0ba29c6a1afacf586b03a26162c72274'] = 'Environement'; +$_MODULE['<{paysafecard}prestashop>paysafecard_1d5ad3d37f236c9eebda547690373bba'] = 'Business Type'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b024248d9fecf8c34f629e89a9fb93b4'] = 'Paiement immédiat'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c80a51a60c5ee43553c3881459b8f431'] = 'Mettre à jour la configuration'; +$_MODULE['<{paysafecard}prestashop>paysafecard_86f28c996ee9075e9fc9a97dc8d5f254'] = 'Vous devez fournir un certificat pour l\'ID marchand'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bbced877c13c763f0141ff906c8ed0e5'] = 'Fichier invalide'; +$_MODULE['<{paysafecard}prestashop>paysafecard_97e5793f511c7930ab295997cb28553a'] = 'ID marchand invalide'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c7c32346a2f800fc49f79d52f3f37f90'] = 'Le fichier n\'a pas été téléchargé correctement'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f09bc49e98e94cb04dc058087fbb3878'] = 'Le fichier est vide'; +$_MODULE['<{paysafecard}prestashop>paysafecard_e9185d874b4244d6f13619cf77dca0aa'] = 'La transaction n\'a pu être initialisée du à des problèmes de connexions. Si le problème persiste, merci de nous contacter.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposition consommée'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c3e260f43a99b6fd907538953fe700d0'] = 'Disposition relachée'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f6a62a622cbba2c1b8cd0be062deff96'] = 'Une erreur est survenue au moment de la relache.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_315e941f57cf90350aea15d968e190f8'] = 'Tout le monde peut utiliser paysafecard puisqu’elle ne nécessite ni carte de crédit ni compte bancaire. Aux cours des dernières années, Paysafecard est devenu l\'un des leaders des moyens de paiement en ligne alternatifs. '; +$_MODULE['<{paysafecard}prestashop>paysafecard_d59048f21fd887ad520398ce677be586'] = 'En savoir plus'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ee363d108ef0c9c5a599d3afe04b9e32'] = 'Une erreur est survenue. Consulter la partie \"Messages\" ci-dessous pour plus d\'informations'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a9ced76f2dd6907220fa95b3a136b04a'] = 'Montant incorrect'; diff --git a/modules/paysafecard/img/payment-logo.png b/modules/paysafecard/img/payment-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..49e8da84f8cd5f20bc8c8666318635c040ccec87 GIT binary patch literal 8718 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 literal 0 HcmV?d00001 diff --git a/modules/paysafecard/it.php b/modules/paysafecard/it.php new file mode 100644 index 000000000..a7cbd3012 --- /dev/null +++ b/modules/paysafecard/it.php @@ -0,0 +1,53 @@ +disposition-error_393988def796f78c4b673b90548f3afa'] = 'Lo stato di disposizione non è valido'; +$_MODULE['<{paysafecard}prestashop>disposition-error_5db89f2bf67f2c7dbd86cac101c3c1b8'] = '. Non hai i permessi per effettuare il pagamento.'; +$_MODULE['<{paysafecard}prestashop>payment_da9c72b9e543135f3f59e3c8ac68ef35'] = 'Paga con'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_330bf06fb43e715e5d03c9fd016df4cd'] = 'Il pagamento non è stato ancora accettato:'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_486cb12e1ec3c8b28b80a8eb9f2db2c0'] = 'Accetta il pagamento'; +$_MODULE['<{paysafecard}prestashop>paysafecard-accept-payment_e9b3579d8e877bcd29ab436f2ef87cc8'] = 'Rilascia l\'importo'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Il tuo ordine'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'è completo.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_91675397c13245179e4bc959514fc2ca'] = 'Hai scelto il'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_2c987f462c2ab7fc63e061e871e6a97d'] = 'metodo.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Il tuo ordine verrà inviato al più presto.'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'Per eventuali domande o per ulteriori informazioni, contatta la nostra'; +$_MODULE['<{paysafecard}prestashop>paysafecard-confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'assistenza clienti'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9240e3ec97017ab6af036384ff7199'] = 'PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b3e93e632edfb4fa64c3c0949c5eb56d'] = 'Si accettano pagamenti con PaysafeCard'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bed51f5187d4bf98e08f44d93f3098d9'] = 'Disposizione creata. In attesa di addebito.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_894f0316a71ef67255369c82bf8a0e5b'] = 'Stato della disposizione non valido:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c1c25198721552ea8ddd963c7278d4ab'] = 'Si è verificato un errore durante il pagamento:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_36ec50c0e914dd2fb48a1b27540512ce'] = 'Pagamento accettato.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d6ca44369efe062cec0c09f392465f55'] = 'Questo modulo richiede che l\'estensione curl di PHP funzioni correttamente.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_8e9647b486000683917484190b68ac8a'] = 'non è scrivibile!'; +$_MODULE['<{paysafecard}prestashop>paysafecard_139cfa047b503ac5b9a6b4b1b03090ad'] = 'Questo modulo richiede la valuta:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ef5d34b04ab3b2eaaf7cb9d0f51267ed'] = 'Configurare ogni valuta singolarmente:'; +$_MODULE['<{paysafecard}prestashop>paysafecard_be9c8794db26bbef6bd2aaa68c15211d'] = '(Il modulo di pagamento non sarà visualizzato per i clienti che utilizzano una valuta non configurata.)'; +$_MODULE['<{paysafecard}prestashop>paysafecard_7d3d009ac1b9d1e826a1a72c046ea635'] = 'Configurazione in'; +$_MODULE['<{paysafecard}prestashop>paysafecard_229a7ec501323b94db7ff3157a7623c9'] = 'ID commerciante'; +$_MODULE['<{paysafecard}prestashop>paysafecard_845314022daaa8b665e718c4b51738aa'] = 'Certificato Keyring'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a01813de717585e9ac9458bbfc54485a'] = 'PW Keyring'; +$_MODULE['<{paysafecard}prestashop>paysafecard_254f642527b45bc260048e30704edb39'] = 'Configurazione'; +$_MODULE['<{paysafecard}prestashop>paysafecard_0ba29c6a1afacf586b03a26162c72274'] = 'Ambiente'; +$_MODULE['<{paysafecard}prestashop>paysafecard_1d5ad3d37f236c9eebda547690373bba'] = 'Tipo di Business'; +$_MODULE['<{paysafecard}prestashop>paysafecard_b024248d9fecf8c34f629e89a9fb93b4'] = 'Pagamento immediato'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c80a51a60c5ee43553c3881459b8f431'] = 'Aggiornare la configurazione'; +$_MODULE['<{paysafecard}prestashop>paysafecard_86f28c996ee9075e9fc9a97dc8d5f254'] = 'È necessario fornire un certificato per ID commerciante'; +$_MODULE['<{paysafecard}prestashop>paysafecard_bbced877c13c763f0141ff906c8ed0e5'] = 'File non valido'; +$_MODULE['<{paysafecard}prestashop>paysafecard_97e5793f511c7930ab295997cb28553a'] = 'ID commerciante non valido'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c7c32346a2f800fc49f79d52f3f37f90'] = 'Il file è stato parzialmente caricato'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f09bc49e98e94cb04dc058087fbb3878'] = 'Il file è vuoto'; +$_MODULE['<{paysafecard}prestashop>paysafecard_e9185d874b4244d6f13619cf77dca0aa'] = 'Operazione non avviata a causa di problemi di connessione. Se il problema persiste, contatta il nostro supporto.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_99f6765a05b697eb78e8c2e5e228f2fc'] = 'Disposizione consumata'; +$_MODULE['<{paysafecard}prestashop>paysafecard_c3e260f43a99b6fd907538953fe700d0'] = 'Disposizione rilasciata'; +$_MODULE['<{paysafecard}prestashop>paysafecard_f6a62a622cbba2c1b8cd0be062deff96'] = 'È verificato un errore durante il rilascio'; +$_MODULE['<{paysafecard}prestashop>paysafecard_315e941f57cf90350aea15d968e190f8'] = 'paysafecard è la prima soluzione prepagata d\'Europa per i pagamenti su Internet che rispetta le leggi bancarie. Negli ultimi anni, paysafecard è diventato una delle soluzioni alternative di pagamento online leader in Europa.'; +$_MODULE['<{paysafecard}prestashop>paysafecard_d59048f21fd887ad520398ce677be586'] = 'Per saperne di più'; +$_MODULE['<{paysafecard}prestashop>paysafecard_ee363d108ef0c9c5a599d3afe04b9e32'] = 'Si è verificato un errore, controlla Messaggi per maggiori informazioni'; +$_MODULE['<{paysafecard}prestashop>paysafecard_a9ced76f2dd6907220fa95b3a136b04a'] = 'Importo non valido'; + +?> \ No newline at end of file diff --git a/modules/paysafecard/keyring/.htaccess b/modules/paysafecard/keyring/.htaccess new file mode 100755 index 000000000..3a4288278 --- /dev/null +++ b/modules/paysafecard/keyring/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/modules/paysafecard/keyring/paysafecard-CA.pem b/modules/paysafecard/keyring/paysafecard-CA.pem new file mode 100755 index 000000000..2df56c61d --- /dev/null +++ b/modules/paysafecard/keyring/paysafecard-CA.pem @@ -0,0 +1,227 @@ +-----BEGIN CERTIFICATE----- +MIIFszCCBJugAwIBAgIBADANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3DQEJ +ARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMGVmll +bm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJvb3Qg +Q0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUGA1UE +AxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBQMB4XDTAyMDExMDE2NDU0 +M1oXDTM4MDExMDE2NDU0M1owge8xITAfBgkqhkiG9w0BCQEWEmNhQHBheXNhZmVj +YXJkLmNvbTELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMG +Vmllbm5hMRwwGgYDVQQLExNwYXlzYWZlY2FyZCBSb290IENBMSwwKgYDVQQLEyNw +YXlzYWZlY2FyZCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEmMCQGA1UEChMdcGF5 +c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxJzAlBgNVBAMTHnBheXNhZmVjYXJk +IFJvb3QgQ0EgLSBTeXN0ZW0gUDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALRAMIFNZR16P4ggPR6hlyXGSONVOklx7U3Xg9zihKA4vmzVMwXUJPP+lHCU +OKiYUSU+cQ+BMfTJCJPvJlqOHH36+ugyGQLI2M9Lq7ILxkGJ3+iQJx4ON1Yf3lJh +uyPLMjvRVCOoN29fUOROfdBxlAGNG33kKYNEh+VJ+ibxX5DmZApsMu6lJJ7LUZvs +2Rho6r9wKQVZaPNeWzJb+7dgLlW7XLIQIv6Fp/bMhZDPhCrX4rN0iiR7I9o5DZiJ +OXwRmWhroRUEo9pPf44XMfdEyaWDK6tbnIsEa7gTOPY3Zt5SMFeSYw1E0OjkUyFo +WL0NoAT7beVqJar+zzwvOjVaeMUCAwEAAaOCAVYwggFSMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFCgXaDOdI1dXvmnxpQ1ZM3M/BK07MIIBHgYDVR0jBIIBFTCC +ARGAFCgXaDOdI1dXvmnxpQ1ZM3M/BK07oYH1pIHyMIHvMSEwHwYJKoZIhvcNAQkB +FhJjYUBwYXlzYWZlY2FyZC5jb20xCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVu +bmExDzANBgNVBAcTBlZpZW5uYTEcMBoGA1UECxMTcGF5c2FmZWNhcmQgUm9vdCBD +QTEsMCoGA1UECxMjcGF5c2FmZWNhcmQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +JjAkBgNVBAoTHXBheXNhZmVjYXJkLmNvbSBXZXJ0a2FydGVuIEFHMScwJQYDVQQD +Ex5wYXlzYWZlY2FyZCBSb290IENBIC0gU3lzdGVtIFCCAQAwDQYJKoZIhvcNAQEE +BQADggEBAEkGu19kW0cROxNmEIhlF2LMFA8Jj9Y5aPPDwM1tMIoZtFWCH1g1g0Zl +PDrp9+ihDFimiXfhIosGvnrclbQ5yIJnxoNmDptkCKTAB+4rPoHSIz8rjCHHTOU2 +rJMVdFvS8hcVkallN1g9o8g7ryA2vRltum5NZUBwAFq986Cur4l2koRzz1UyOkrT +0G0i8cQIR9trGuCaUbhIFTBe/QvSNkIEqDWRDPLfBQnYnBFSwObH5uXiToUXlTnM +/aOuY+p2D8Oh6MneD6nh8turvFTMkLqLS7DzjQAYmF7HWGkRFPsHi2EtLFVIwM9q +FioR7mWBcKh2lZr18AtzGIkKQSQWQkI= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCBKKgAwIBAgIEIAAABjANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3 +DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMG +Vmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJv +b3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUG +A1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBQMB4XDTAyMDExNjEy +MTUxN1oXDTM0MDExNjEyMTUxN1owgfMxCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZW +aWVubmExDzANBgNVBAcTBlZpZW5uYTEmMCQGA1UEChMdcGF5c2FmZWNhcmQuY29t +IFdlcnRrYXJ0ZW4gQUcxHjAcBgNVBAsTFXBheXNhZmVjYXJkIFNlcnZlciBDQTEs +MCoGA1UECxMjcGF5c2FmZWNhcmQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxKTAn +BgNVBAMTIHBheXNhZmVjYXJkIFNlcnZlciBDQSAtIFN5c3RlbSBQMSEwHwYJKoZI +hvcNAQkBFhJjYUBwYXlzYWZlY2FyZC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDGbD6yVmszQYpuUX0zVyam8DdqPXfY5c8OSQK7u8I7mPoEw0SG +lxSbHy7Aywlx5rhSr6j1k0HgmnOsO6j6bup5CXGvGBWkiahN1TrUN8qAZvIdorUz ++YrZyg/EkddrOqkgZpaqyEEJ2wGdM3Lhbg8oBWufVh/TX0sA9K0NCSrl3UzKLw0n +mEVbUnBxRUGbctnOkmLiIWqX7o8jmupvE7lIvRPLHUyFKGp0Wn2oKosr3fhCQxEU +4dQdH9Uwf53kPt0Ct0MML1p1u8OAN4e6bYL1T86YA/bnaaPFI5D4cVP66X1gcamM ++ro//XJOee2d1FM7lWoyA03ypt54SRB1N6aVAgMBAAGjggFWMIIBUjAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBSB6bcBOjQU0y5+rr8pbTyHYFxKbjCCAR4GA1Ud +IwSCARUwggERgBQoF2gznSNXV75p8aUNWTNzPwStO6GB9aSB8jCB7zEhMB8GCSqG +SIb3DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UE +CBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJk +IFJvb3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEn +MCUGA1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBQggEAMA0GCSqG +SIb3DQEBBAUAA4IBAQAwuR+OYbQh8+2A8Ya48pGbEbggbYfJYZAcfZlTxVeilkXb +jhinDfG4mBuvsW8RG7CW1fnHYlytyN9AVJFHchB57SkfDDxhPYI6WBsJTnDaxROa +QzW0r6Pi3e5XAtqC221vKYYC5OoMBq+S+LWUc9kSYX7PAm3ObCEPNBirJMDDwSLm +iovY3UHByFeJ8dYM5u7wKM+WRBzIEi4dMk5VWWx7KO7fieGTxqVCPa1Bd1GQV3yq +Z5P0lzduqD2M1oUr1BCwiivxpHO4aMYo9lVz7ZMFhbyDLiiQqcR3unVKpSpN4oAq +TW3iZ32LXHkLFSCEFinOO43/uWk8+RzNR0N+XZ1F +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFszCCBJugAwIBAgIBADANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3DQEJ +ARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMGVmll +bm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJvb3Qg +Q0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUGA1UE +AxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBNMB4XDTAyMDExMDE1MDUx +M1oXDTM4MDExMDE1MDUxM1owge8xITAfBgkqhkiG9w0BCQEWEmNhQHBheXNhZmVj +YXJkLmNvbTELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMG +Vmllbm5hMRwwGgYDVQQLExNwYXlzYWZlY2FyZCBSb290IENBMSwwKgYDVQQLEyNw +YXlzYWZlY2FyZCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEmMCQGA1UEChMdcGF5 +c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxJzAlBgNVBAMTHnBheXNhZmVjYXJk +IFJvb3QgQ0EgLSBTeXN0ZW0gTTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALtYbwxejm8ZTdZmvLG1TtVHMGyIVnTFeyIbt7SUP4GjycrFs0GiWCJzYHAX +gEtwzIX3ibt3bIR62/itJ4ra/pkIUBDd1ARNM1F9R/MyE3Ci1SGmp1IyaFK2tQRX +dxHqIBZtH6hUSK750mxE9Ln+YjHjbkEnvXB49qIyJsvgQSPrvzldj+bBDpNyCppf +H16U55azIpq7gWvyqsFe/NeAp8iW8quhgZQWqXhPFMA/dypcwBwSTJSW/jVqfqhd +iRhEfZEeV6pBPtaZeeUUvWBgBccr39sQd3FUADH7d7AepxsiIxTDm971wn9bNiOM +YwCdfQlEYLlAhEc3XMRv5Mifnp8CAwEAAaOCAVYwggFSMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFEdDEuV3HVe81QNu5wgYE/h2K14EMIIBHgYDVR0jBIIBFTCC +ARGAFEdDEuV3HVe81QNu5wgYE/h2K14EoYH1pIHyMIHvMSEwHwYJKoZIhvcNAQkB +FhJjYUBwYXlzYWZlY2FyZC5jb20xCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVu +bmExDzANBgNVBAcTBlZpZW5uYTEcMBoGA1UECxMTcGF5c2FmZWNhcmQgUm9vdCBD +QTEsMCoGA1UECxMjcGF5c2FmZWNhcmQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +JjAkBgNVBAoTHXBheXNhZmVjYXJkLmNvbSBXZXJ0a2FydGVuIEFHMScwJQYDVQQD +Ex5wYXlzYWZlY2FyZCBSb290IENBIC0gU3lzdGVtIE2CAQAwDQYJKoZIhvcNAQEE +BQADggEBACJ9nG6+DmSxJKoqyCDaBUTCeVWk1jpBAvxR1Nwq68L25VYqWp8M0x74 +/Wd/rcut532BaStABiba+P5V4/VpV4cYlExPb2CCr1E3BWd9nMaJEqjFOdNfy2Aq +OZhTeKqKZ0oALhk61AdX7OmimW2DGe7jwEbZxtjcUBUMo+olSAqDD/oVmOLooQOE +oCHQ7U/+PFHtzO9Im7Jlq0fJESJSRheSbjItZSJxl18neu3xN58Ku9Pnu4pInyM+ +ObX4TJxmBbyRXlBkWfDWljih9MANqE/XkwOE3BlAt2haymRs/GSYiIWqNwTd2Rbx +NwdV0sBoOmFmSMNt7/NhXIT6GO3hFK4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFujCCBKKgAwIBAgIEEAAAAzANBgkqhkiG9w0BAQQFADCB7zEhMB8GCSqGSIb3 +DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UECBMG +Vmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJkIFJv +b3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEnMCUG +A1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBNMB4XDTAyMDExMDE1 +MjE1OVoXDTM0MDExMDE1MjE1OVowgfMxITAfBgkqhkiG9w0BCQEWEmNhQHBheXNh +ZmVjYXJkLmNvbTELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UE +BxMGVmllbm5hMR4wHAYDVQQLExVwYXlzYWZlY2FyZCBTZXJ2ZXIgQ0ExLDAqBgNV +BAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSYwJAYDVQQK +Ex1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEpMCcGA1UEAxMgcGF5c2Fm +ZWNhcmQgU2VydmVyIENBIC0gU3lzdGVtIE0wggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCySPf9dV1J73WgihZzq6PuFZw8G+5YgCG7KVvmm/unkabEHzQ7 +PKfHT0awGRfZgfsRzbLxnohaXDHE8e2whWjV5ZROXKpeYb7MhFcmPdPAuxx6lPD9 +jocbEA530vTonL3WrAPY9P4v48Upd8xTKy+HmdruBn80tOwnvJeSH+2Itm2Qo6cU +JslOxJYqmIu76aNbh/Is37rZV37zegkNr7RVpE82tUZR8CRnY46f+FrYEJYpZRVc +hg9NOM6fmswG7BAP4oLXOjOERR79Rom/ACZZNcz1PSBJRIarm2eXLUptlTfTR1lb +92wX+KGtYvcLFnr/2RkHDT2Wdcb8s3pI7bhxAgMBAAGjggFWMIIBUjAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBTNjfh4N1yNw7Bo/E0sMOrdcZbJ8TCCAR4GA1Ud +IwSCARUwggERgBRHQxLldx1XvNUDbucIGBP4diteBKGB9aSB8jCB7zEhMB8GCSqG +SIb3DQEJARYSY2FAcGF5c2FmZWNhcmQuY29tMQswCQYDVQQGEwJBVDEPMA0GA1UE +CBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExHDAaBgNVBAsTE3BheXNhZmVjYXJk +IFJvb3QgQ0ExLDAqBgNVBAsTI3BheXNhZmVjYXJkIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MSYwJAYDVQQKEx1wYXlzYWZlY2FyZC5jb20gV2VydGthcnRlbiBBRzEn +MCUGA1UEAxMecGF5c2FmZWNhcmQgUm9vdCBDQSAtIFN5c3RlbSBNggEAMA0GCSqG +SIb3DQEBBAUAA4IBAQAZ7naLoETGD8TW6lAbuZ7ntd9zNqutizAtPzC5bJRq2sL3 +AyIsSDO6jQnJgvHsW3XiBfYP0R8MGbMg5cLvgcyKHjnpkzcGEXFuvOeeh50oWSTl +aJ9VNTvvGK6nY4rQ710I6qCollj+pqlSq4sak/zYJ87lKc8TXEzvzyncYAfrRp3G +XIA5zG3TniBIYC/cuiXjBupmWelFCKRK8/Uhm0vbg71wAWrouJKcBkSMYgZCdEC6 +3g0EBmD94j9FBEiW7q4sUgqYxGTjeOv1Wb4EsHJhq2eBzOKLp+NHYbPzI++50nQU +AjKavlzdAr9PVC8BBS74M567rtIooeIgEDqqi/7J +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfjCCAuegAwIBAgIQAdAC7XDZlmGZ84pH2aljUjANBgkqhkiG9w0BAQUFADCB +zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh +d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTA2MTAyNTAwMDAwMFoXDTA4MTAyNDIzNTk1OVow +gYIxCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVubmExDzANBgNVBAcTBlZpZW5u +YTEmMCQGA1UEChMdcGF5c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxKTAnBgNV +BAMTIGN1c3RvbWVyLnRlc3QuYXQucGF5c2FmZWNhcmQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDgay0tcil7faWjhcRYg4HvOt9DA6llt87cxZtkGalY +Fvxr+tKLg2U031cbmQjRpCEXIWeZjIqOreZLK3PNYfQJi7C3m7bU2D8owt6xijt4 +reOsNH5nTy4NNt9J+tUVaRO0YCWG7O2v1T1L4QMwdHjHcsvpoO9NnFM/Sqmo8tSz +EwIDAQABo4GmMIGjMAwGA1UdEwEB/wQCMAAwQAYDVR0fBDkwNzA1oDOgMYYvaHR0 +cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVNlcnZlclByZW1pdW1DQS5jcmwwHQYD +VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDIGCCsGAQUFBwEBBCYwJDAiBggr +BgEFBQcwAYYWaHR0cDovL29jc3AudGhhd3RlLmNvbTANBgkqhkiG9w0BAQUFAAOB +gQBzovJPMRON4GSrPeAZ93nDYHHfZMV2yUY0+8Kfi+5smLfV3VaurPjL8WSYA2mY +F1vI2tkNhAbELQwm/6RqrU7AG1wKnoyljzZ9V0Uk7Mfcw3Wg/uCTEtes9NNz6KbW +RM9X8CWd8gJGwTODZy4JU0qMWiETqPvbvzXTX0oihp2nEQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfDCCAuWgAwIBAgIQWAYuIHYD1tplIr6DdfOxoDANBgkqhkiG9w0BAQUFADCB +zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ +Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh +d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTA2MTAyNTAwMDAwMFoXDTA4MTAyNDIzNTk1OVow +gYAxCzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVubmExDzANBgNVBAcTBlZpZW5u +YTEmMCQGA1UEChMdcGF5c2FmZWNhcmQuY29tIFdlcnRrYXJ0ZW4gQUcxJzAlBgNV +BAMTHmN1c3RvbWVyLmNjLmF0LnBheXNhZmVjYXJkLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAs1G3ieyBRUxgDLUAlqipvBtnlsb7W0TqcXYY9MF/XOyp +1KoS6xKcH6dV1PYGUi8roITcEPB2VBnR2lCpqjUwhmeJcXf2sJLIInf0J0ld05qE +G8I6tHh8DOylkN+G9NdbdWsHyQLxiqQ1TkLIAX28ioJziLVSJ0AU/Vw5MSj3x+UC +AwEAAaOBpjCBozAMBgNVHRMBAf8EAjAAMEAGA1UdHwQ5MDcwNaAzoDGGL2h0dHA6 +Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVTZXJ2ZXJQcmVtaXVtQ0EuY3JsMB0GA1Ud +JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAyBggrBgEFBQcBAQQmMCQwIgYIKwYB +BQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0ZS5jb20wDQYJKoZIhvcNAQEFBQADgYEA +dLrNu1On6Vp5JWdeFmA0wZjrvbVSXmH3fGuuY5pw+RDDq5AVZ0ug5AoNO90DkAn5 +7s1zOelLs1imjS1MpPKOs7jgC+kbzW/PRFfY1oYSHZdSQGfmTjdz3PtT3XVWMmne +z4cv4RYpEiZrkrxL/fdd36E/Lo0GctmhlXBT7SiNM0g= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDhjCCAu+gAwIBAgIQeO5I3hhbIHHJycO1HXvdwTANBgkqhkiG9w0BAQUFADBfMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi +bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNOTcwNDE3MDAwMDAwWhcN +MTExMDI0MjM1OTU5WjCBujEfMB0GA1UEChMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazEXMBUG +A1UECxMOVmVyaVNpZ24sIEluYy4xMzAxBgNVBAsTKlZlcmlTaWduIEludGVybmF0aW9uYWwg +U2VydmVyIENBIC0gQ2xhc3MgMzFJMEcGA1UECxNAd3d3LnZlcmlzaWduLmNvbS9DUFMgSW5j +b3JwLmJ5IFJlZi4gTElBQklMSVRZIExURC4oYyk5NyBWZXJpU2lnbjCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA2IKA6NYZAn0fhRg5JaJlK+G/1AXTvOY2O6rwTGxbtueqPHNFVbLx +veqXQu2aNAoV1Klc9UAl3dkHwTKydWzEyruj/lYncUOqY/UwPpMo5frxCTvzt01OOfdcSVq4 +wR3Tsor+cDCVQsv+K1GLWjw6+SJPkLICp1OcTzTnqwSye28CAwEAAaOB5jCB4zAPBgNVHRME +CDAGAQH/AgEAMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEwKjAoBggrBgEFBQcCARYcaHR0 +cHM6Ly93d3cudmVyaXNpZ24uY29tL0NQUzA0BgNVHR8ELTArMCmgJ6AlhiNodHRwOi8vY3Js +LnZlcmlzaWduLmNvbS9wY2EzLWcyLmNybDA0BgNVHSUELTArBggrBgEFBQcDAQYIKwYBBQUH +AwIGCWCGSAGG+EIEAQYKYIZIAYb4RQEIATALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4QgEBBAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4GBACNd7qYkBf1202oa1rpGBqpqDwOQZrKwpsKeyR6jVVOv +PkX93Iwn3VM4Cbt8Syu6lUr+cE4badY8908HxfIXWkyij6wLigbbudRrxR1Y2hdS4yHx0tda +1eWrWXsheoZq1P4XETpTDZxgoErZXuQdDCmqEwdlhh+/tMmCU5wsAo8j +-----END CERTIFICATE----- + diff --git a/modules/paysafecard/logo.gif b/modules/paysafecard/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..685963854a2cb5866a6418aeb4ea1c2279579878 GIT binary patch literal 940 zcmXYwJ*XH&5QOIu#h=EXPGTb{7N-&z1%n_)#k>#;C0-$E{DH+r4Tz))9518@C>CNd zDTEMwzFeUqMle+b%SE(UP%sc})FxOcQ4q#^>NUsR!tLxga|aJS_3-`|Z^7-jhW{3U z00bmpG@ubJ(1ey~Mh80416}BeZVX@$BQS)K7{&x9F#}VWiD?v2LZgNXE zyThIC;V$=dw+B4v5gzhL4|~Fsp5ZCa^t1~uy22$_x^|nbpe?r-@-_Fr&HvB++V1-6 zx((oO+_!tR`zLVYXhzvBto{pGV$ zdyYT)`+3&Bt(`Mhf6#5`A3OK#hufcCeErvNws*$OPoMhZ$0t7e{?Y@Npa1yE{-alZ R+B&)S-LscZY;53>e*lZWz>5F? literal 0 HcmV?d00001 diff --git a/modules/paysafecard/payment.php b/modules/paysafecard/payment.php new file mode 100644 index 000000000..455a77066 --- /dev/null +++ b/modules/paysafecard/payment.php @@ -0,0 +1,102 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/paysafecard.php'); + +$module = new PaysafeCard(); + +if (!$cart->id OR $cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$module->active) + Tools::redirect('index.php?controller=order&step=3'); + +$currency = new Currency($cart->id_currency); +if (!$module->isCurrencyActive($currency->iso_code)) + Tools::redirect('index.php?controller=order&step=3'); + +$amount = number_format((float)($cart->getOrderTotal(true, Cart::BOTH)), 2, '.',''); +if (Tools::getValue('hash') != md5(Configuration::get($module->prefix.'SALT') + $amount + $currency->iso_code)) + die(Tools::displayError()); + +$result = $module->getDispositionState((int)($cart->id)); +$state = _PS_OS_ERROR_; + +$disposition = Disposition::getByCartId((int)($cart->id)); + +$message = 'Transaction ID #'.$disposition['mtid'].': '.$disposition['amount'].$disposition['currency'].'
    '. date('Y-m-d').' '; +if ($result[0] == 0) +{ + list ($rc, $errorcode, $error_message, $amount, $used_currency, $state) = $result; + + if ($state == PrepaidServicesAPI::DISPOSITION_DISPOSED || $state == PrepaidServicesAPI::DISPOSITION_DEBITED) + { + $state = _PS_OS_PAYMENT_; + $message .= $module->getL('disposition_created'); + } else { + $message .= $module->getL('disposition_invalid').' '.$state; + } +} else { + $message .= 'payment_error'.' '.$result[2]; +} + +if ($state != _PS_OS_ERROR_) +{ + $state = (int)(Configuration::get($module->prefix.'ORDER_STATE_ID')); + + if (Configuration::get($module->prefix.'IMMEDIAT_PAYMENT')) + { + $message .= '
    '.date('Y-m-d').' '; + $result = $module->executeDebit((int)($cart->id)); + + if ($result[0] != 0) + { + $message .= $module->getL('payment_error').' '.$result[2]; + $state = _PS_OS_ERROR_; + } + else + { + $message .= $module->getL('payment_accepted'); + $state = _PS_OS_PAYMENT_; + } + } +} + +$module->validateOrder((int)($cart->id), $state, (float)($cart->getOrderTotal(true, Cart::BOTH)), $module->displayName, $message, NULL, (int)($currency->id), false, $cart->secure_key); + +if ($state == _PS_OS_ERROR_) +{ + include(dirname(__FILE__).'/../../header.php'); + echo $message; + include(dirname(__FILE__).'/../../footer.php'); +} +else +{ + $order = new Order($module->currentOrder); + Tools::redirect('index.php?controller=order-confirmation&id_cart='.(int)($cart->id).'&id_module='.(int)($module->id).'&id_order='.(int)($module->currentOrder).'&key='.$order->secure_key); +} + + + diff --git a/modules/paysafecard/payment.tpl b/modules/paysafecard/payment.tpl new file mode 100644 index 000000000..3915f2431 --- /dev/null +++ b/modules/paysafecard/payment.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + + + {l s='Pay with' mod='paysafecard'} {$payment_name} + +

    diff --git a/modules/paysafecard/paysafecard-accept-payment.tpl b/modules/paysafecard/paysafecard-accept-payment.tpl new file mode 100644 index 000000000..bbc8817a8 --- /dev/null +++ b/modules/paysafecard/paysafecard-accept-payment.tpl @@ -0,0 +1,43 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
    +
    + {$payment_name} + {if $error} + {$error} + {/if} + +

    {l s='Payment has not been accepted yet:' mod='paysafecard'}

    +

    +

    + {$currency} + + +
    +

    +
    + diff --git a/modules/paysafecard/paysafecard-confirmation.tpl b/modules/paysafecard/paysafecard-confirmation.tpl new file mode 100644 index 000000000..040ad1161 --- /dev/null +++ b/modules/paysafecard/paysafecard-confirmation.tpl @@ -0,0 +1,32 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='Your order on' mod='paysafecard'} {$shop_name} {l s='is complete.' mod='paysafecard'} +

    + {l s='You have chosen the' mod='paysafecard'} {$payment_name} {l s='method.' mod='paysafecard'} +

    {l s='Your order will be sent very soon.' mod='paysafecard'} +

    {l s='For any questions or for further information, please contact our' mod='paysafecard'} {l s='customer support' mod='paysafecard'}. +

    diff --git a/modules/paysafecard/paysafecard.php b/modules/paysafecard/paysafecard.php new file mode 100644 index 000000000..1d0ce4463 --- /dev/null +++ b/modules/paysafecard/paysafecard.php @@ -0,0 +1,120 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +if (!in_array('PrepaidServices', get_declared_classes())) include_once(_PS_MODULE_DIR_.'paysafecard/PrepaidServices.php'); + + +class PaysafeCard extends PrepaidServices +{ + public $prefix = 'PS_PSC_'; + protected $supported_languages = array('de', 'en', 'gr', 'el', 'es', 'it', 'fr', 'nl', 'pl', 'pt', 'si', 'sk', 'tr'); + protected $allowed_currencies = array(); + + protected $environments = array('P' => 'Production', + 'T' => 'Test'); + + protected $business_types = array('I' => 'Intangible', + 'T' => 'Tangible'); + + protected $payment_url = array('T' =>'https://customer.test.at.paysafecard.com/psccustomer/GetCustomerPanelServlet', + 'P' => 'https://customer.cc.at.paysafecard.com/psccustomer/GetCustomerPanelServlet'); + + protected $supported_currencies = array('EUR', 'GBP', 'CHF', 'USD', 'PLN', 'CZK', 'SEK', 'DKK', 'RON', 'NOK', 'ARS'); + + protected $register_url = array('en' => 'http://www.prestashop.com/partner/url.php?to=http://www.paysafecard.com/index.php?id=947&L=8', + 'fr' => 'http://www.prestashop.com/partner/url.php?to=http://www.paysafecard.com/index.php?id=947&L=3', + 'es' => 'http://www.prestashop.com/partner/url.php?to=http://www.paysafecard.com/index.php?id=947&L=9'); + + + protected $certificat_dir; + + public function __construct() + { + $this->name = 'paysafecard'; + $this->tab = 'payments_gateways'; + $this->version = 1.2; + $this->module_dir = dirname(__FILE__); + $this->certificat_dir = dirname(__FILE__).'/keyring/'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('PaysafeCard'); + $this->description = $this->l('Accepts payments by PaysafeCard.'); + } + + public function getL($key) + { + $translations = array( + 'disposition_created' => $this->l('Disposition created. Waiting for debit.'), + 'disposition_invalid' => $this->l('Invalid disposition state:'), + 'payment_error' => $this->l('An error has occurred during payment:'), + 'payment_accepted' => $this->l('Payment accepted.'), + 'curl_required' => $this->l('This module requires the curl PHP extension to function properly.'), + 'not_writable' => $this->l('Not writable!'), + 'currency_required' => $this->l('This module requires the currency: '), + 'configure_currency' => $this->l('Configure each currency individually:'), + 'payment_not_displayed' => $this->l('(The payment module will not be displayed for customers using non configured currency.)'), + 'configuration_in' => $this->l('Configuration in '), + 'merchant_id' => $this->l('Merchant ID'), + 'keyring_certificate' => $this->l('Keyring Certificate'), + 'keyring_pw' => $this->l('Keyring PW'), + 'configuration' => $this->l('Configuration'), + 'environment' => $this->l('Environment'), + 'business_type' => $this->l('Business Type'), + 'immediat_payment' => $this->l('Immediate Payment'), + 'update_configuration' => $this->l('Update configuration'), + 'certificate_required' => $this->l('You must provide a certificate for MERCHANT ID'), + 'invalid_file' => $this->l('Invalid file'), + 'invalid_merchant_id' => $this->l('Invalid Merchant ID'), + 'invalid_business_type' => $this->displayError('Invalid business type'), + 'invalid_environment' => $this->displayError('Invalid environment'), + 'settings_updated' => $this->l('Settings updated'), + 'file_partialy_uploaded' => $this->l('The file was partially uploaded.'), + 'file_empty' => $this->l('The file is empty.'), + 'cant_create_dispo' => $this->l('Transaction could not be initiated due to connection problems. If the problem persists, please contact support.'), + 'disposition_consumed' => $this->l('Disposition consumed'), + 'payment_released' => $this->l('Disposition released'), + 'release_error' => $this->l('An error has occurred during the release'), + 'introduction' => $this->l('Paysafecard is Europe’s first prepaid solution for payments over the Internet to comply with banking laws. Over the past years, paysafecard has become one of Europe’s leading alternative online payment solutions.'), + 'register' => $this->l('Learn more') + ); + + return $translations[$key]; + } + + protected function _getErrorMsgFromErrorCode($error_code) + { + $error_msg = array(1 => $this->l('An error has occurred, check Messages for more info'), + 2 => $this->l('Invalid amount')); + + return $error_msg[$error_code]; + } +} + diff --git a/modules/paysafecard/prepaidservices.js b/modules/paysafecard/prepaidservices.js new file mode 100644 index 000000000..3d7b7537f --- /dev/null +++ b/modules/paysafecard/prepaidservices.js @@ -0,0 +1,38 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function toggleImediatPayment() +{ + if ($('#ct_business_type').val() == 'I') + $('#imediat_payment').hide(); + else + $('#imediat_payment').show(); +} + +$(document).ready(function() { + toggleImediatPayment(); +}); + diff --git a/modules/paysafecard/redirect.php b/modules/paysafecard/redirect.php new file mode 100644 index 000000000..dcc96c9b2 --- /dev/null +++ b/modules/paysafecard/redirect.php @@ -0,0 +1,50 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/paysafecard.php'); + +$module = new PaysafeCard(); + +if (!$cart->id OR $cart->id_customer == 0 OR $cart->id_address_delivery == 0 OR $cart->id_address_invoice == 0 OR !$module->active) + Tools::redirect('index.php?controller=order&step=3'); + +$currency = new Currency($cart->id_currency); +if (!$module->isCurrencyActive($currency->iso_code)) + Tools::redirect('index.php?controller=order&step=3'); + +$result = $module->createDisposition($cart); + +if ($result['return_code'] != 0) +{ + include(dirname(__FILE__).'/../../header.php'); + echo $module->getL('cant_create_dispo'); + include(dirname(__FILE__).'/../../footer.php'); +} +else + Tools::redirectLink($result['message']); + diff --git a/modules/prestafraud/config.xml b/modules/prestafraud/config.xml new file mode 100644 index 000000000..6ee34c67b --- /dev/null +++ b/modules/prestafraud/config.xml @@ -0,0 +1,12 @@ + + + prestafraud + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/prestafraud/de.php b/modules/prestafraud/de.php new file mode 100644 index 000000000..128ec6884 --- /dev/null +++ b/modules/prestafraud/de.php @@ -0,0 +1,65 @@ +prestafraud_eed029a9cfe78c1230a654e58fe8b6f8'] = 'PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_95d311a37e934646eec0c79c4f266feb'] = 'Schützen Sie Ihr Shop von betrügerischen Zahlungen'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4d0a6a9777a818ecc3b59b9a8ecd0c43'] = '- Bitte wählen Sie Ihre Haupttätigkeit -'; +$_MODULE['<{prestafraud}prestashop>prestafraud_5a600f5b88f416c470991c6831add13a'] = 'Erwachsene'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0fe4ca3df29658482098bb33a2ff66e5'] = 'Tiere und Haustiere'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9e4359f35054190eba36e09466e39d01'] = 'Kunst und Kultur'; +$_MODULE['<{prestafraud}prestashop>prestafraud_066cd752c82ddc6231a9723b5822a945'] = 'Babys'; +$_MODULE['<{prestafraud}prestashop>prestafraud_41a081c3f3042ac40117cf295350870d'] = 'Schönheit und Körperpflege'; +$_MODULE['<{prestafraud}prestashop>prestafraud_f2b545a8abb14f8706f808a79277c061'] = 'KFZ'; +$_MODULE['<{prestafraud}prestashop>prestafraud_39bb2fdc532f8984d8348863c86ebfca'] = 'Computer Hardware und Software'; +$_MODULE['<{prestafraud}prestashop>prestafraud_801ab24683a4a8c433c6eb40c48bcd9d'] = 'Download'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8bdd8b2357d516da5b81eb16746ba9a9'] = 'Mode und Accessoires'; +$_MODULE['<{prestafraud}prestashop>prestafraud_33cb31c5505618a808d3bcd7490a793c'] = 'Blumen, Geschenke und Kunsthandwerk'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0570b6d9de5c37a026e69c6987fc27f6'] = 'Nahrungsmittel und Getränke'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4b73b8913afcdf06d9f49c176306d950'] = 'HiFi, Foto und Video'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2e9d6500d9b2a65985a621f0f0afdeb3'] = 'Haus und Garten'; +$_MODULE['<{prestafraud}prestashop>prestafraud_83dd3493957bcd92a37bc39111f670b8'] = 'Haushaltsgeräte'; +$_MODULE['<{prestafraud}prestashop>prestafraud_565631402af79df42f22a117b0d6f1a5'] = 'Schmuck'; +$_MODULE['<{prestafraud}prestashop>prestafraud_18848d605251b3627014c6a58c14c449'] = 'Mobile Geräte und Telekommunikation'; +$_MODULE['<{prestafraud}prestashop>prestafraud_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Dienstleistungen'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4ef7205b13f6821177d0dbc2fb90f79e'] = 'Schuhe und Zubehör'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9503054261b8aeed48e0a3902019b579'] = 'Sport und Unterhaltung'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1fb0f99b55e6c2be35aed72ebe38c245'] = 'Reisen'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Scheck'; +$_MODULE['<{prestafraud}prestashop>prestafraud_35b4b09d5d0686ec5c2e2cc9f3d9039c'] = 'Banküberweisung'; +$_MODULE['<{prestafraud}prestashop>prestafraud_e7f9e382dc50889098cbe56f2554c77b'] = 'Kreditkarte'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1cf575079afed29675c47e822bc3d493'] = 'mehrere Kreditkarten'; +$_MODULE['<{prestafraud}prestashop>prestafraud_75b95ea268cb6b5baf7483aafa80d5ad'] = 'Prepaid-Konto (Moneybookers, PayPal, ...)'; +$_MODULE['<{prestafraud}prestashop>prestafraud_688000bea2f79c9ca3d2d1755456024f'] = 'Bitte akzeptieren Sie die Nutzungsbedingungen.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8dc42e0ea3bedd2c1cc400141540cf62'] = 'PrestaShop Security Konfiguration'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7e97953add2f27fce07653151ba3e862'] = 'Mein Shop hat noch kein Konto auf PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3b2aee63259f6dc9b94914884474f8de'] = 'Ich habe bereits ein Konto'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9d5c4ae518b30bacdb69912d87b3406a'] = 'Ihre E-Mail:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_6c3b9b51615d1d57773f25903da2018c'] = 'Shop URL:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_432dc11f749f7a5ea483a3c71e34e119'] = 'Ich bin mit den Prestashop Datenschutzbestimmungen einverstanden'; +$_MODULE['<{prestafraud}prestashop>prestafraud_42369faa6a6b243aac58683f3874bf99'] = 'Konto erstellen'; +$_MODULE['<{prestafraud}prestashop>prestafraud_212713efb37cd2f521ee584f1dbb5f0b'] = 'Shop-ID:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c6b84387320705147af2f9e79d72c6fc'] = 'Shop SCHLÜSSEL:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b51cb26e6b60a3ff585ab9f757495c52'] = 'Shop-Aktivität:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ab8cba13a061fe8d4a330bcc8d6b0175'] = 'Lieferanten:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_914419aa32f04011357d3b604a86d7eb'] = 'Lieferant'; +$_MODULE['<{prestafraud}prestashop>prestafraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Lieferantenart'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Wählen Sie eine Lieferantenart...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2edfe3cd8034975c073e23158e976428'] = 'Zahlungen:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Zahlungs-Modul'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Zahlungsart'; +$_MODULE['<{prestafraud}prestashop>prestafraud_827638f0be5ae74be04ed494087de714'] = 'Wählen Sie eine Zahlungsart ...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{prestafraud}prestashop>prestafraud_16648260e58b4cf9d458e1a197ef43f1'] = 'E-Mail ist ungültig'; +$_MODULE['<{prestafraud}prestashop>prestafraud_cb18f4dc13847e2ed5d69cb936f9b26c'] = 'Shop-URL ist ungültig'; +$_MODULE['<{prestafraud}prestashop>prestafraud_950c093b260d7c7709f8ff96e10a6fe0'] = 'Diese Bestellung wurde hat nicht an PrestaShop Security gesandt.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_d0c6a2fa938df84c0ce628de99c97e16'] = 'Wertung:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Unbekannt'; +$_MODULE['<{prestafraud}prestashop>prestafraud_240f3031f25601fa128bd4e15f0a37de'] = 'Kommentar:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b88011726eba59d6bf37f0fdec202edc'] = 'Diese Bestellung als Betrug an PrestaShop melden'; +$_MODULE['<{prestafraud}prestashop>prestafraud_a8bbb000124c9697aa5d63e7e758b64d'] = 'Geschäftsabholung'; +$_MODULE['<{prestafraud}prestashop>prestafraud_08eb31af908e2244867f6e812f82e935'] = 'Abholungspunkt'; +$_MODULE['<{prestafraud}prestashop>prestafraud_880f973e4ddae42c6bebd2c31bb977f8'] = 'Langsamer Versand mehr als 3 Tage'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b61de91e556aee84e83c3fde8ef67ddc'] = 'Express-Versand'; + +?> \ No newline at end of file diff --git a/modules/prestafraud/es.php b/modules/prestafraud/es.php new file mode 100644 index 000000000..7a15ec9c6 --- /dev/null +++ b/modules/prestafraud/es.php @@ -0,0 +1,63 @@ +prestafraud_eed029a9cfe78c1230a654e58fe8b6f8'] = 'PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_95d311a37e934646eec0c79c4f266feb'] = 'Proteja su tienda de pagos fraudulentos'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4d0a6a9777a818ecc3b59b9a8ecd0c43'] = '- Por favor, elija su actividad principal -'; +$_MODULE['<{prestafraud}prestashop>prestafraud_5a600f5b88f416c470991c6831add13a'] = 'Adultos'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0fe4ca3df29658482098bb33a2ff66e5'] = 'Animales y animales domésticos'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9e4359f35054190eba36e09466e39d01'] = 'Arte y Cultura'; +$_MODULE['<{prestafraud}prestashop>prestafraud_066cd752c82ddc6231a9723b5822a945'] = 'Bebés'; +$_MODULE['<{prestafraud}prestashop>prestafraud_41a081c3f3042ac40117cf295350870d'] = 'Belleza e higiene personal'; +$_MODULE['<{prestafraud}prestashop>prestafraud_f2b545a8abb14f8706f808a79277c061'] = 'Automóviles'; +$_MODULE['<{prestafraud}prestashop>prestafraud_39bb2fdc532f8984d8348863c86ebfca'] = 'Material informático y softwares'; +$_MODULE['<{prestafraud}prestashop>prestafraud_801ab24683a4a8c433c6eb40c48bcd9d'] = 'Descargas'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8bdd8b2357d516da5b81eb16746ba9a9'] = 'Moda y complementos'; +$_MODULE['<{prestafraud}prestashop>prestafraud_33cb31c5505618a808d3bcd7490a793c'] = 'Flores, regalos y artesanía'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0570b6d9de5c37a026e69c6987fc27f6'] = 'Alimentación y bebidas'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4b73b8913afcdf06d9f49c176306d950'] = 'HiFi, Foto y Vídeo'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2e9d6500d9b2a65985a621f0f0afdeb3'] = 'Casa y Jardín'; +$_MODULE['<{prestafraud}prestashop>prestafraud_83dd3493957bcd92a37bc39111f670b8'] = 'Home Appliances'; +$_MODULE['<{prestafraud}prestashop>prestafraud_565631402af79df42f22a117b0d6f1a5'] = 'Joyas'; +$_MODULE['<{prestafraud}prestashop>prestafraud_18848d605251b3627014c6a58c14c449'] = 'Móviles y Telefonía'; +$_MODULE['<{prestafraud}prestashop>prestafraud_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Servicios'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4ef7205b13f6821177d0dbc2fb90f79e'] = 'Calzado y Complementos'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9503054261b8aeed48e0a3902019b579'] = 'Deporte y Ocio'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1fb0f99b55e6c2be35aed72ebe38c245'] = 'Viajes'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Cheque'; +$_MODULE['<{prestafraud}prestashop>prestafraud_35b4b09d5d0686ec5c2e2cc9f3d9039c'] = 'Transferencia bancaria'; +$_MODULE['<{prestafraud}prestashop>prestafraud_e7f9e382dc50889098cbe56f2554c77b'] = 'Tarjeta de crédito'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1cf575079afed29675c47e822bc3d493'] = 'Tarjeta de crédito en varias veces'; +$_MODULE['<{prestafraud}prestashop>prestafraud_75b95ea268cb6b5baf7483aafa80d5ad'] = 'Cuenta prepagada (MoneyBookers, PayPal,...)'; +$_MODULE['<{prestafraud}prestashop>prestafraud_688000bea2f79c9ca3d2d1755456024f'] = 'Debe aceptar las condiciones del servicio'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8dc42e0ea3bedd2c1cc400141540cf62'] = 'Confuguración de PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7e97953add2f27fce07653151ba3e862'] = 'Mi tienda aún no dispone de cuenta en PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3b2aee63259f6dc9b94914884474f8de'] = 'Ya tengo una cuenta'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9d5c4ae518b30bacdb69912d87b3406a'] = 'Su email:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_6c3b9b51615d1d57773f25903da2018c'] = 'URL de la tienda:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_432dc11f749f7a5ea483a3c71e34e119'] = 'He leido las condiciones de servicio PrestaShop Security y las acepto sin condiciones'; +$_MODULE['<{prestafraud}prestashop>prestafraud_42369faa6a6b243aac58683f3874bf99'] = 'Crear una cuenta'; +$_MODULE['<{prestafraud}prestashop>prestafraud_212713efb37cd2f521ee584f1dbb5f0b'] = 'ID de la tienda:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c6b84387320705147af2f9e79d72c6fc'] = 'Clave de la tienda:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b51cb26e6b60a3ff585ab9f757495c52'] = 'Actividad de la tienda:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ab8cba13a061fe8d4a330bcc8d6b0175'] = 'Transportistas:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_914419aa32f04011357d3b604a86d7eb'] = 'Transportista'; +$_MODULE['<{prestafraud}prestashop>prestafraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Tipo de transportista'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Elija un tipo de transportista...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2edfe3cd8034975c073e23158e976428'] = 'Pagos:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Módulo de pago'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Tipo de pago'; +$_MODULE['<{prestafraud}prestashop>prestafraud_827638f0be5ae74be04ed494087de714'] = 'Elija un tipo de pago'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{prestafraud}prestashop>prestafraud_16648260e58b4cf9d458e1a197ef43f1'] = 'El email no es válido'; +$_MODULE['<{prestafraud}prestashop>prestafraud_cb18f4dc13847e2ed5d69cb936f9b26c'] = 'URL de la tienda no válido'; +$_MODULE['<{prestafraud}prestashop>prestafraud_950c093b260d7c7709f8ff96e10a6fe0'] = 'Este pedido no se ha enviado a PrestaShop Security.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_d0c6a2fa938df84c0ce628de99c97e16'] = 'Nota:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Desconocido'; +$_MODULE['<{prestafraud}prestashop>prestafraud_240f3031f25601fa128bd4e15f0a37de'] = 'Comentario:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b88011726eba59d6bf37f0fdec202edc'] = 'Notificar este pedido como un fraude a PrestaShop'; +$_MODULE['<{prestafraud}prestashop>prestafraud_a8bbb000124c9697aa5d63e7e758b64d'] = 'Recoger en tienda'; +$_MODULE['<{prestafraud}prestashop>prestafraud_08eb31af908e2244867f6e812f82e935'] = 'Punto de recogida'; +$_MODULE['<{prestafraud}prestashop>prestafraud_880f973e4ddae42c6bebd2c31bb977f8'] = 'Envío lento superior a 3 días'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b61de91e556aee84e83c3fde8ef67ddc'] = 'Envío express'; diff --git a/modules/prestafraud/fr.php b/modules/prestafraud/fr.php new file mode 100644 index 000000000..01c661ecc --- /dev/null +++ b/modules/prestafraud/fr.php @@ -0,0 +1,63 @@ +prestafraud_eed029a9cfe78c1230a654e58fe8b6f8'] = 'PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_95d311a37e934646eec0c79c4f266feb'] = 'Protégez votre magasin des paiements frauduleux'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4d0a6a9777a818ecc3b59b9a8ecd0c43'] = '- Merci de choisir votre activité principale -'; +$_MODULE['<{prestafraud}prestashop>prestafraud_5a600f5b88f416c470991c6831add13a'] = 'Adultes'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0fe4ca3df29658482098bb33a2ff66e5'] = 'Animaux et animaux domestiques'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9e4359f35054190eba36e09466e39d01'] = 'Art et Culture'; +$_MODULE['<{prestafraud}prestashop>prestafraud_066cd752c82ddc6231a9723b5822a945'] = 'Bébés'; +$_MODULE['<{prestafraud}prestashop>prestafraud_41a081c3f3042ac40117cf295350870d'] = 'Beauté et soins personnels'; +$_MODULE['<{prestafraud}prestashop>prestafraud_f2b545a8abb14f8706f808a79277c061'] = 'Voitures'; +$_MODULE['<{prestafraud}prestashop>prestafraud_39bb2fdc532f8984d8348863c86ebfca'] = 'Matériel informatique et logiciel'; +$_MODULE['<{prestafraud}prestashop>prestafraud_801ab24683a4a8c433c6eb40c48bcd9d'] = 'Téléchargement'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8bdd8b2357d516da5b81eb16746ba9a9'] = 'Mode et accessoires'; +$_MODULE['<{prestafraud}prestashop>prestafraud_33cb31c5505618a808d3bcd7490a793c'] = 'Fleurs, cadeaux et artisanat'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0570b6d9de5c37a026e69c6987fc27f6'] = 'Aliments et boissons'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4b73b8913afcdf06d9f49c176306d950'] = 'Hi-fi, Photo et Vidéo'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2e9d6500d9b2a65985a621f0f0afdeb3'] = 'Maison et jardin'; +$_MODULE['<{prestafraud}prestashop>prestafraud_83dd3493957bcd92a37bc39111f670b8'] = 'Home Appliances'; +$_MODULE['<{prestafraud}prestashop>prestafraud_565631402af79df42f22a117b0d6f1a5'] = 'Bijoux'; +$_MODULE['<{prestafraud}prestashop>prestafraud_18848d605251b3627014c6a58c14c449'] = 'Mobile et Telecom'; +$_MODULE['<{prestafraud}prestashop>prestafraud_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Services'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4ef7205b13f6821177d0dbc2fb90f79e'] = 'Chaussures et accessoires'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9503054261b8aeed48e0a3902019b579'] = 'Sport et Loisirs'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1fb0f99b55e6c2be35aed72ebe38c245'] = 'Voyage'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Chèque'; +$_MODULE['<{prestafraud}prestashop>prestafraud_35b4b09d5d0686ec5c2e2cc9f3d9039c'] = 'Virement bancaire'; +$_MODULE['<{prestafraud}prestashop>prestafraud_e7f9e382dc50889098cbe56f2554c77b'] = 'Carte de crédit'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1cf575079afed29675c47e822bc3d493'] = 'Carte de crédit en plusieurs fois'; +$_MODULE['<{prestafraud}prestashop>prestafraud_75b95ea268cb6b5baf7483aafa80d5ad'] = 'Compte prépayé (MoneyBookers, PayPal ...)'; +$_MODULE['<{prestafraud}prestashop>prestafraud_688000bea2f79c9ca3d2d1755456024f'] = 'Merci d\'accepter les termes du service.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8dc42e0ea3bedd2c1cc400141540cf62'] = 'Configuration de PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7e97953add2f27fce07653151ba3e862'] = 'Mon magasin n\'a pas encore de compte sur Prestashop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3b2aee63259f6dc9b94914884474f8de'] = 'J\'ai déjà un compte'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9d5c4ae518b30bacdb69912d87b3406a'] = 'Votre email:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_6c3b9b51615d1d57773f25903da2018c'] = 'URL de la boutique:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_432dc11f749f7a5ea483a3c71e34e119'] = 'Je suis d\'accord avec les conditions de service PrestaShop Security et y adhére sans condition.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_42369faa6a6b243aac58683f3874bf99'] = 'Créer un compte'; +$_MODULE['<{prestafraud}prestashop>prestafraud_212713efb37cd2f521ee584f1dbb5f0b'] = 'Shop ID:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c6b84387320705147af2f9e79d72c6fc'] = 'Shop Key:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b51cb26e6b60a3ff585ab9f757495c52'] = 'Activité de la boutique:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ab8cba13a061fe8d4a330bcc8d6b0175'] = 'Transporteurs:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_914419aa32f04011357d3b604a86d7eb'] = 'Transporteur'; +$_MODULE['<{prestafraud}prestashop>prestafraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Type de transporteur'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Choisissez un type de transporteur...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2edfe3cd8034975c073e23158e976428'] = 'Paiements:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Module de paiement'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Type de paiement'; +$_MODULE['<{prestafraud}prestashop>prestafraud_827638f0be5ae74be04ed494087de714'] = 'Choisissez un type de paiement ...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{prestafraud}prestashop>prestafraud_16648260e58b4cf9d458e1a197ef43f1'] = 'Email est invalide'; +$_MODULE['<{prestafraud}prestashop>prestafraud_cb18f4dc13847e2ed5d69cb936f9b26c'] = 'URL de la boutique n\'est pas valide'; +$_MODULE['<{prestafraud}prestashop>prestafraud_950c093b260d7c7709f8ff96e10a6fe0'] = 'Cette commande n\'a pas été envoyé à PrestaShop Security.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_d0c6a2fa938df84c0ce628de99c97e16'] = 'Notation:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Inconnu'; +$_MODULE['<{prestafraud}prestashop>prestafraud_240f3031f25601fa128bd4e15f0a37de'] = 'Commentaire:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b88011726eba59d6bf37f0fdec202edc'] = 'Rapporter cette commande comme une fraude à PrestaShop'; +$_MODULE['<{prestafraud}prestashop>prestafraud_a8bbb000124c9697aa5d63e7e758b64d'] = 'Retrait en magasin'; +$_MODULE['<{prestafraud}prestashop>prestafraud_08eb31af908e2244867f6e812f82e935'] = 'Point de retrait, point relais'; +$_MODULE['<{prestafraud}prestashop>prestafraud_880f973e4ddae42c6bebd2c31bb977f8'] = 'Livraison lente de plus de 3 jours'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b61de91e556aee84e83c3fde8ef67ddc'] = 'Livraison express'; diff --git a/modules/prestafraud/install.sql b/modules/prestafraud/install.sql new file mode 100644 index 000000000..62c775644 --- /dev/null +++ b/modules/prestafraud/install.sql @@ -0,0 +1,29 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_prestafraud_carrier` +( + `id_carrier` int(11) default NULL, + `id_prestafraud_carrier_type` int(11) default NULL, + PRIMARY KEY (`id_carrier`, `id_prestafraud_carrier_type`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_prestafraud_payment` +( + `id_module` int(11) default NULL, + `id_prestafraud_payment_type` int(11) default NULL, + PRIMARY KEY (`id_module`, `id_prestafraud_payment_type`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_prestafraud_carts` +( + `id_cart` int(11) default NULL, + `ip_address` int(11) default NULL, + `date` DATETIME NOT NULL, + PRIMARY KEY (`id_cart`, `ip_address`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_prestafraud_orders` +( + `id_order` int(11) default NULL, + `scoring` decimal(2,2) default NULL, + `comment` VARCHAR(255) default NULL, + PRIMARY KEY (`id_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; diff --git a/modules/prestafraud/it.php b/modules/prestafraud/it.php new file mode 100755 index 000000000..2c54df65a --- /dev/null +++ b/modules/prestafraud/it.php @@ -0,0 +1,64 @@ +prestafraud_eed029a9cfe78c1230a654e58fe8b6f8'] = 'PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_95d311a37e934646eec0c79c4f266feb'] = 'Proteggi il tuo negozio da pagamenti fraudolenti'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4d0a6a9777a818ecc3b59b9a8ecd0c43'] = '- Scegli la tua attività principale -'; +$_MODULE['<{prestafraud}prestashop>prestafraud_5a600f5b88f416c470991c6831add13a'] = 'Adulti'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0fe4ca3df29658482098bb33a2ff66e5'] = 'Animali'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9e4359f35054190eba36e09466e39d01'] = 'Arte e Cultura'; +$_MODULE['<{prestafraud}prestashop>prestafraud_066cd752c82ddc6231a9723b5822a945'] = 'Neonati'; +$_MODULE['<{prestafraud}prestashop>prestafraud_41a081c3f3042ac40117cf295350870d'] = 'Bellezza e cura della persona'; +$_MODULE['<{prestafraud}prestashop>prestafraud_f2b545a8abb14f8706f808a79277c061'] = 'Auto'; +$_MODULE['<{prestafraud}prestashop>prestafraud_39bb2fdc532f8984d8348863c86ebfca'] = 'Computer Hardware e Software'; +$_MODULE['<{prestafraud}prestashop>prestafraud_801ab24683a4a8c433c6eb40c48bcd9d'] = 'Download'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8bdd8b2357d516da5b81eb16746ba9a9'] = 'Moda e Accessori'; +$_MODULE['<{prestafraud}prestashop>prestafraud_33cb31c5505618a808d3bcd7490a793c'] = 'Fiori, regali e oggettistica'; +$_MODULE['<{prestafraud}prestashop>prestafraud_0570b6d9de5c37a026e69c6987fc27f6'] = 'Alimenti e bevande'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4b73b8913afcdf06d9f49c176306d950'] = 'Hi-Fi, Foto e Video'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2e9d6500d9b2a65985a621f0f0afdeb3'] = 'Casa e Giardino'; +$_MODULE['<{prestafraud}prestashop>prestafraud_83dd3493957bcd92a37bc39111f670b8'] = 'Elettrodomestici'; +$_MODULE['<{prestafraud}prestashop>prestafraud_565631402af79df42f22a117b0d6f1a5'] = 'Gioielli'; +$_MODULE['<{prestafraud}prestashop>prestafraud_18848d605251b3627014c6a58c14c449'] = 'Telefonia mobile'; +$_MODULE['<{prestafraud}prestashop>prestafraud_992a0f0542384f1ee5ef51b7cf4ae6c4'] = 'Servizi'; +$_MODULE['<{prestafraud}prestashop>prestafraud_4ef7205b13f6821177d0dbc2fb90f79e'] = 'Scarpe e accessori'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9503054261b8aeed48e0a3902019b579'] = 'Sport e Spettacolo'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1fb0f99b55e6c2be35aed72ebe38c245'] = 'Viaggi'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Assegno'; +$_MODULE['<{prestafraud}prestashop>prestafraud_35b4b09d5d0686ec5c2e2cc9f3d9039c'] = 'Bonifico bancario'; +$_MODULE['<{prestafraud}prestashop>prestafraud_e7f9e382dc50889098cbe56f2554c77b'] = 'Carta di credito'; +$_MODULE['<{prestafraud}prestashop>prestafraud_1cf575079afed29675c47e822bc3d493'] = 'Carte di credito multiple'; +$_MODULE['<{prestafraud}prestashop>prestafraud_75b95ea268cb6b5baf7483aafa80d5ad'] = 'Conto prepagato (Moneybookers, PayPal ...)'; +$_MODULE['<{prestafraud}prestashop>prestafraud_688000bea2f79c9ca3d2d1755456024f'] = 'Si prega di accettare i termini del servizio.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_8dc42e0ea3bedd2c1cc400141540cf62'] = 'Configurazione PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7e97953add2f27fce07653151ba3e862'] = 'Il mio negozio non ha ancora account su PrestaShop Security'; +$_MODULE['<{prestafraud}prestashop>prestafraud_3b2aee63259f6dc9b94914884474f8de'] = 'Ho già un account'; +$_MODULE['<{prestafraud}prestashop>prestafraud_9d5c4ae518b30bacdb69912d87b3406a'] = 'Il tuo indirizzo email:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_6c3b9b51615d1d57773f25903da2018c'] = 'Url negozio'; +$_MODULE['<{prestafraud}prestashop>prestafraud_42369faa6a6b243aac58683f3874bf99'] = 'Crea un account'; +$_MODULE['<{prestafraud}prestashop>prestafraud_212713efb37cd2f521ee584f1dbb5f0b'] = 'ID negozio:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c6b84387320705147af2f9e79d72c6fc'] = 'KEY negozio:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b51cb26e6b60a3ff585ab9f757495c52'] = 'Attività negozio:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ab8cba13a061fe8d4a330bcc8d6b0175'] = 'Corrieri:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_914419aa32f04011357d3b604a86d7eb'] = 'Corriere'; +$_MODULE['<{prestafraud}prestashop>prestafraud_fecb07f7ab46e23e9b520a9a9af7b97b'] = 'Tipo di corriere'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b04ad61ad875f6e7149fdd51c2e60ce2'] = 'Scegli un tipo di corriere...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_2edfe3cd8034975c073e23158e976428'] = 'Pagamenti:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_ec51b543e5a38f6044c83f21dce2b23d'] = 'Modulo Pagamento'; +$_MODULE['<{prestafraud}prestashop>prestafraud_7c9a3504dd4ce74b8021267ae1802968'] = 'Tipo di pagamento'; +$_MODULE['<{prestafraud}prestashop>prestafraud_827638f0be5ae74be04ed494087de714'] = 'Scegli un tipo di pagamento ...'; +$_MODULE['<{prestafraud}prestashop>prestafraud_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{prestafraud}prestashop>prestafraud_16648260e58b4cf9d458e1a197ef43f1'] = 'E-mail non è valida'; +$_MODULE['<{prestafraud}prestashop>prestafraud_cb18f4dc13847e2ed5d69cb936f9b26c'] = 'URL Shop non è valido'; +$_MODULE['<{prestafraud}prestashop>prestafraud_950c093b260d7c7709f8ff96e10a6fe0'] = 'Questo ordine non è stato inviato a PrestaShop Security.'; +$_MODULE['<{prestafraud}prestashop>prestafraud_d0c6a2fa938df84c0ce628de99c97e16'] = 'Punteggio:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Sconosciuto'; +$_MODULE['<{prestafraud}prestashop>prestafraud_240f3031f25601fa128bd4e15f0a37de'] = 'Commento:'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b88011726eba59d6bf37f0fdec202edc'] = 'Segnala questo ordine come una frode a PrestaShop'; +$_MODULE['<{prestafraud}prestashop>prestafraud_a8bbb000124c9697aa5d63e7e758b64d'] = 'Ritiro nel negozio'; +$_MODULE['<{prestafraud}prestashop>prestafraud_08eb31af908e2244867f6e812f82e935'] = 'Punto di ritiro'; +$_MODULE['<{prestafraud}prestashop>prestafraud_880f973e4ddae42c6bebd2c31bb977f8'] = 'Spedizione lenta oltre 3 giorni'; +$_MODULE['<{prestafraud}prestashop>prestafraud_b61de91e556aee84e83c3fde8ef67ddc'] = 'Spedizione express'; + +?> \ No newline at end of file diff --git a/modules/prestafraud/logo.gif b/modules/prestafraud/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cb4e257893adf230db7220c06fb9371360312e7 GIT binary patch literal 702 zcmV;v0zv(WP)CSS=grr57X34Zl(zd#$wMb&<%>`t-B(tkBb(psfna0f6_}Do~^xke$ZPQvRr946H zWWosxshhe2GGhTlX^H4l2T{)>lHM28PjBPv)052H^wfm_GUcM~_VUEV$3cdCKWX1R z!rT&^3rTv;k{#1R&D<>@Px1a?%-hNzH)w3T)o)siWm4p$YE@#8C&=cg43(z=rJn}gKmtpUPjP_< zhQXyc#h?f*t`d2Vd9yzWR3(s7PzH#A7!f0%A|E3em_y#OBXS^bn8gJ3v%wOOhaiEV zN+Bg6K!%U|v5J*O8kij|KR-n{eladP2^TtCnBu~OphnPUSs(4yA3V7-gl0O@~?V*x@CTl&E<2=tI5q@L#DQla@S41 zJh{xk+x)uL-5)Og@e9A})romiTU+;hxI5}I{Y{<6W=--* k<)9^%y{&t@hew +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registred Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class PrestaFraud extends Module +{ + + private $_html; + public $_errors; + private $_trustUrl; + + private $_activities; + private $_payment_types; + + public function __construct() + { + $this->name = 'prestafraud'; + $this->tab = 'payment_security'; + $this->version = '0.99'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('PrestaShop Security'); + $this->description = $this->l('Protect your store from fraudulent payments'); + + $this->_activities = array(0 => $this->l('-- Please choose your main activity --'), + 1 => $this->l('Adult'), + 2 => $this->l('Animals and Pets'), + 3 => $this->l('Art and Culture'), + 4 => $this->l('Babies'), + 5 => $this->l('Beauty and Personal Care'), + 6 => $this->l('Cars'), + 7 => $this->l('Computer Hardware and Software'), + 8 => $this->l('Download'), + 9 => $this->l('Fashion and accessories'), + 10 => $this->l('Flowers, Gifts and Crafts'), + 11 => $this->l('Food and beverage'), + 12 => $this->l('HiFi, Photo and Video'), + 13 => $this->l('Home and Garden'), + 14 => $this->l('Home Appliances'), + 15 => $this->l('Jewelry'), + 16 => $this->l('Mobile and Telecom'), + 17 => $this->l('Services'), + 18 => $this->l('Shoes and accessories'), + 19 => $this->l('Sport and Entertainment'), + 20 => $this->l('Travel')); + + $this->_payment_types = array(0 => $this->l('Cheque'), + 1 => $this->l('Bankwire'), + 2 => $this->l('Credit card'), + 3 => $this->l('Credit card multiple'), + 4 => $this->l('Prepaid account (MoneyBookers, PayPal...)')); + + $this->_trustUrl = 'http'.(extension_loaded('openssl') ? 's' : '').'://trust.prestashop.com/'; + } + + public function install() + { + if (!parent::install() OR + !$this->registerHook('updatecarrier') OR + !$this->registerHook('newOrder') OR + !$this->registerHook('adminOrder') OR + !$this->registerHook('cart')) + return false; + + if (!$sql = file_get_contents(dirname(__FILE__).'/install.sql')) + die(Tools::displayError('File install.sql is not readable')); + $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); + $sql = preg_split("/;\s*[\r\n]+/", $sql); + + foreach ($sql as $query) + if ($query AND sizeof($query) AND !Db::getInstance()->Execute(trim($query))) + return false; + return true; + } + + public function uninstall() + { + parent::uninstall(); + } + + public function getContent() + { + $this->postProcess(); + $this->_displayConfiguration(); + + return $this->_html; + } + + private function _displayConfiguration() + { + global $cookie; + $this->_html .= ' +
    '.$this->l('PrestaShop Security configuration').' +
    +
    +
    + '.$this->l('My shop does not have a PrestaShop Security account yet').'    + '.$this->l('I already have an account').' +
    +
    +
    +
     
    +
    +
    + +
    + +
    + +
    + +
    +
    + '.$this->l('I agree with the terms of PrestaShop Security service and I adhere to them unconditionally.').' +
    +
    '; + $terms = file_get_contents($this->_trustUrl.'terms.php?lang='.Language::getIsoById((int)$cookie->id_lang)); + $this->_html .= $terms; + $this->_html .= '
    +
    + +
    +
    +
     
    +
    +
    +
    + +
    + +
    + +
    + +
    +
     
    +
    +
    '; + return $this->_html; + } + + public function postProcess() + { + if (Tools::isSubmit('submitSettings')) + { + if (isset($_POST['login'])) + Configuration::updateValue('PS_TRUST_EMAIL', $_POST['email']); + if (isset($_POST['passwd'])) + Configuration::updateValue('PS_TRUST_PASSWD', $_POST['passwd']); + if ($activity = Tools::getValue('shop_activity')) + Configuration::updateValue('PS_SHOP_ACTIVITY', $activity); + $carriers_configuration = array(); + $payments_configuration = array(); + foreach($_POST AS $field => $val) + { + if (preg_match('/^carrier_([0-9]+)/Ui', $field, $res)) + $carriers_configuration[$res[1]] = $val; + elseif (preg_match('/^paymentmodule_([0-9]+)/Ui', $field, $pay_res)) + $payments_configuration[$pay_res[1]] = $val; + } + + $this->_setCarriersConfiguration($carriers_configuration); + $this->_setPaymentsConfiguration($payments_configuration); + } + elseif (Tools::isSubmit('submitCreateAccount')) + $this->_html .= $this->_createAccount(); + + if (sizeof($this->_errors)) + { + $err = ''; + foreach ($this->_errors AS $error) + $err .= $error.'
    '; + $this->_html .= $this->displayError($err); + } + } + + private function _createAccount() + { + if (!$email = Tools::getValue('email') OR !Validate::isEmail($email)) + $this->_errors[] = $this->l('Email is invalid'); + if (!$shop_url = Tools::getValue('shop_url') OR !Validate::isAbsoluteUrl($shop_url)) + $this->_errors[] = $this->l('Shop URL is invalid'); + + if (sizeof($this->_errors)) + return false; + + $root = new SimpleXMLElement(""); + $xml = $root->addChild('create_account'); + $xml->addChild('email', $email); + $xml->addChild('shop_url', $shop_url); + $result = $this->_pushDatas($root->asXml()); + $xml_result = simplexml_load_string($result); + if (!(int)$xml_result->create_account->result) + { + $this->_errors[] = (string)$xml_result->create_account->errors; + return false; + } + Configuration::updateValue('PS_TRUST_SHOP_ID', (string)$xml_result->create_account->shop_id); + Configuration::updateValue('PS_TRUST_SHOP_KEY', (string)$xml_result->create_account->shop_key); + + $this->_html .= $this->displayConfirmation('Account successfull created'); + } + + public function hookUpdateCarrier($params) + { + $this->_updateConfiguredCarrier((int)$params['id_carrier'], (int)$params['carrier']->id); + } + + public function hookNewOrder($params) + { + if (!Configuration::get('PS_SHOP_ENABLE') OR !Configuration::get('PS_TRUST_SHOP_ID') OR !Configuration::get('PS_TRUST_SHOP_KEY')) + return; + $customer = new Customer((int)$params['order']->id_customer); + + $address_delivery = new Address((int)$params['order']->id_address_delivery); + $address_invoice = new Address((int)$params['order']->id_address_invoice); + $root = new SimpleXMLElement(""); + $xml = $root->addChild('new_order'); + $shop_configuration = $xml->addChild('shop'); + + $default_country = new Country((int)Configuration::get('PS_COUNTRY_DEFAULT')); + $default_currency = new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT')); + $shop_configuration->addChild('default_country', $default_country->iso_code); + $shop_configuration->addChild('default_currency', $default_currency->iso_code); + $shop_configuration->addChild('shop_id', Configuration::get('PS_TRUST_SHOP_ID')); + $shop_configuration->addChild('shop_password', Configuration::get('PS_TRUST_SHOP_KEY')); + + if ($activity = Configuration::get('PS_SHOP_ACTIVITY')) + $shop_configuration->addChild('shop_activity', $activity); + $customer_infos = $xml->addChild('customer'); + $customer_infos->addChild('customer_id', $customer->id); + $customer_infos->addChild('lastname', $customer->lastname); + $customer_infos->addChild('firstname', $customer->firstname); + $customer_infos->addChild('email', $customer->email); + $customer_infos->addChild('is_guest', (int)$customer->is_guest); + $customer_infos->addChild('birthday', $customer->birthday); + + $delivery = $xml->addChild('delivery'); + $delivery->addChild('lastname', $address_delivery->lastname); + $delivery->addChild('firstname', $address_delivery->firstname); + $delivery->addChild('company', $address_delivery->company); + $delivery->addChild('dni', $address_delivery->dni); + $delivery->addChild('address1', $address_delivery->address1); + $delivery->addChild('address2', $address_delivery->address2); + $delivery->addChild('phone', $address_delivery->phone); + $delivery->addChild('phone_mobile', $address_delivery->phone_mobile); + $delivery->addChild('city', $address_delivery->city); + $delivery->addChild('postcode', $address_delivery->postcode); + if ($address_delivery->id_state !== NULL OR $address_delivery->id_state != '') + { + $State = new State((int)$address_delivery->id_state); + $delivery->addChild('state', $State->iso_code); + } + $delivery->addChild('country', Country::getIsoById((int)$address_delivery->id_country)); + + $invoice = $xml->addChild('invoice'); + $invoice->addChild('lastname', $address_invoice->lastname); + $invoice->addChild('firstname', $address_invoice->firstname); + $invoice->addChild('company', $address_invoice->company); + $invoice->addChild('dni', $address_invoice->dni); + $invoice->addChild('address1', $address_invoice->address1); + $invoice->addChild('address2', $address_invoice->address2); + $invoice->addChild('phone', $address_invoice->phone); + $invoice->addChild('phone_mobile', $address_invoice->phone_mobile); + $invoice->addChild('city', $address_invoice->city); + $invoice->addChild('postcode', $address_invoice->postcode); + if ($address_invoice->id_state !== NULL OR $address_invoice->id_state != '') + { + $State = new State((int)$address_invoice->id_state); + $invoice->addChild('state', $State->iso_code); + } + $invoice->addChild('country', Country::getIsoById((int)$address_invoice->id_country)); + + $infos = $this->_getCustomerInfos($params['order']); + $history = $xml->addChild('customer_history'); + $history->addChild('customer_date_last_order', $infos['customer_date_last_order']); + $history->addChild('customer_orders_valid_count', (int)$infos['customer_orders_valid_count']); + $history->addChild('customer_orders_valid_sum', (float)$infos['customer_orders_valid_sum']); + $history->addChild('customer_orders_unvalid_count', (int)$infos['customer_orders_unvalid_count']); + $history->addChild('customer_orders_unvalid_sum', (float)$infos['customer_orders_unvalid_sum']); + $history->addChild('customer_ip_addresses_history', $infos['customer_ip_addresses_history']); + + $history->addChild('customer_date_add', $customer->date_add); + + $product_list = $params['order']->getProductsDetail(); + + $order = $xml->addChild('order_detail'); + $order->addChild('order_id', (int)$params['order']->id); + $order->addChild('order_amount', $params['order']->total_paid); + $currency = new Currency((int)$params['order']->id_currency); + $order->addChild('currency', $currency->iso_code); + $products = $order->addChild('products'); + foreach ($product_list AS $p) + { + $products->addChild('name', $p['product_name']); + $products->addChild('price', $p['product_price']); + $products->addChild('quantity', $p['product_quantity']); + $products->addChild('is_virtual', (int)!empty($p['download_hash'])); + } + + $sources = ConnectionsSource::getOrderSources($params['order']->id); + $referers = array(); + if ($sources) + foreach ($sources AS $source) + $referers[] = $source['http_referer']; + if (sizeof($referers)) + $order->addChild('order_referers', serialize($referers)); + + $configured_payments = $this->_getConfiguredPayments(); + $paymentModule = Module::getInstanceByName($params['order']->module); + $order->addChild('payment_name', $paymentModule->displayName); + $order->addChild('payment_type', (int)$configured_payments[$paymentModule->id]); + $order->addChild('order_date', $params['order']->date_add); + $order->addChild('order_ip_address', $this->_getIpByCart($id_cart)); + + $carrier = new Carrier((int)$params['order']->id_carrier); + $carrier_infos = $order->addChild('carrier_infos'); + $carrier_infos->addChild('name', $carrier->name); + $carriers_type = $this->_getConfiguredCarriers(); + + $carrier_infos->addChild('type', $carriers_type[$carrier->id]); + if ($this->_pushDatas($root->asXml()) !== false) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'prestafraud_orders (id_order) VALUES('.(int)$params['order']->id.')'); + return true; + } + + public function hookCart($params) + { + if ($_SERVER['REMOTE_ADDR'] == '0.0.0.0' OR $_SERVER['REMOTE_ADDR'] == '' OR $_SERVER['REMOTE_ADDR'] === false OR $_SERVER['REMOTE_ADDR'] === '::1') + return; + if (!$params['cart']->id) + return; + $res = Db::getInstance()->getValue(' + SELECT `id_cart` + FROM '._DB_PREFIX_.'prestafraud_carts + WHERE id_cart='.(int)($params['cart']->id)); + if ($res) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'prestafraud_carts` + SET `ip_address` = '.ip2long($_SERVER['REMOTE_ADDR']).', `date` = \''.pSQL(date('Y-m-d H:i:s')).'\' + WHERE `id_cart` = '.(int)($params['cart']->id).' LIMIT 1'); + else + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'prestafraud_carts` (`id_cart`, `ip_address`, `date`) + VALUES ('.(int)($params['cart']->id).', '.ip2long($_SERVER['REMOTE_ADDR']).',\''.date('Y-m-d H:i:s').'\')'); + return true; + } + + private function _getCustomerInfos($order) + { + $last_order = Db::getInstance()->getValue('SELECT date_add + FROM '._DB_PREFIX_.'orders + WHERE id_customer='.(int)$order->id_customer.' AND id_order != '.(int)$order->id.' + ORDER BY date_add DESC'); + + $orders_valid = Db::getInstance()->getRow(' + SELECT COUNT(*) nb_valid, SUM(total_paid) sum_valid + FROM '._DB_PREFIX_.'orders + WHERE valid=1 AND id_order!='.(int)$order->id.' AND id_customer = '.(int)$order->id_customer); + + $orders_unvalid = Db::getInstance()->getRow(' + SELECT COUNT(*) nb_unvalid, SUM(total_paid) sum_unvalid + FROM '._DB_PREFIX_.'orders + WHERE valid=0 AND id_order!='.(int)$order->id.' AND id_customer = '.(int)$order->id_customer); + + $ip_addresses = Db::getInstance()->ExecuteS(' + SELECT c.ip_address + FROM '._DB_PREFIX_.'guest g + LEFT JOIN '._DB_PREFIX_.'connections c ON (c.id_guest = g.id_guest) + WHERE g.id_customer='.(int)$order->id_customer.' + ORDER BY c.id_connections DESC'); + $address_list = array(); + foreach ($ip_addresses AS $ip) + $address_list[] = $ip['ip_address']; + + return array( + 'customer_date_last_order' => $last_order, + 'customer_orders_valid_count' => $orders_valid['nb_valid'], + 'customer_orders_valid_sum' => $orders_valid['sum_valid'], + 'customer_orders_unvalid_count' => $orders_unvalid['nb_unvalid'], + 'customer_orders_unvalid_sum' => $orders_unvalid['sum_unvalid'], + 'customer_ip_addresses_history' => serialize($address_list) + ); + } + + private static function _getIpByCart($id_cart) + { + return long2ip(Db::getInstance()->getValue(' + SELECT `ip_address` + FROM '._DB_PREFIX_.'prestafraud_carts + WHERE id_cart = '.(int)$id_cart)); + } + + public function hookAdminOrder($params) + { + global $cookie; + $id_order = Db::getInstance()->getValue('SELECT id_order FROM '._DB_PREFIX_.'prestafraud_orders WHERE id_order = '.(int)$params['id_order']); + $this->_html .= '
    '.$this->l('PrestaShop Security').''; + if (!$id_order) + $this->_html .= $this->l('This order has not been sent to PrestaShop Security.'); + else + { + $scoring = $this->_getScoring((int)$id_order, $cookie->id_lang); + $this->_html .= '

    '.$this->l('Scoring:').' '.($scoring['scoring'] < 0 ? $this->l('Unknown') : (float)$scoring['scoring']).'

    +

    '.$this->l('Comment:').' '.htmlentities($scoring['comment']).'

    +

    '.$this->l('Report this order as a fraud to PrestaShop').'

    '; + } + $this->_html .= '
    '; + return $this->_html; + } + + + + private function _getScoring($id_order, $id_lang) + { + if (!$scoring = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'prestafraud_orders WHERE scoring IS NOT NULL AND id_order = '.(int)$id_order)) + { + $root = new SimpleXMLElement(""); + $xml = $root->addChild('get_scoring'); + $xml->addChild('shop_id', Configuration::get('PS_TRUST_SHOP_ID')); + $xml->addChild('shop_password', Configuration::get('PS_TRUST_SHOP_KEY')); + $xml->addChild('id_order', (int)$id_order); + $xml->addChild('lang', Language::getIsoById((int)$id_lang)); + $result = $this->_pushDatas($root->asXml()); + if (!$result) + return false; + $xml = simplexml_load_string($result); + if ((int)$xml->check_scoring->status != -1) + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'prestafraud_orders SET scoring = '.(float)$xml->check_scoring->scoring.', comment = \''.pSQL($xml->check_scoring->comment).'\' WHERE id_order='.(int)$id_order); + $scoring = array('scoring' => (float)$xml->check_scoring->scoring, 'comment' => (string)$xml->check_scoring->comment); + } + return $scoring; + } + + private function _getPrestaTrustCarriersType() + { + return array( + '1' => $this->l('Pick up in-store'), + '2' => $this->l('Withdrawal point'), + '3' => $this->l('Slow shipping more than 3 days'), + '4' => $this->l('Shipping express')); + } + + private function _getConfiguredCarriers() + { + $res = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'prestafraud_carrier'); + $carriers = array(); + foreach ($res AS $row) + $carriers[$row['id_carrier']] = $row['id_prestafraud_carrier_type']; + + return $carriers; + } + + private function _getConfiguredPayments() + { + $res = Db::getInstance()->ExecuteS('SELECT * FROM '._DB_PREFIX_.'prestafraud_payment'); + $payments = array(); + foreach ($res AS $row) + $payments[$row['id_module']] = $row['id_prestafraud_payment_type']; + + return $payments; + } + + private function _setCarriersConfiguration($carriers) + { + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'prestafraud_carrier'); + foreach ($carriers AS $id_carrier => $id_carrier_type) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'prestafraud_carrier (id_carrier, id_prestafraud_carrier_type) VALUES ('.(int)$id_carrier.', '.(int)$id_carrier_type.')'); + } + + private function _setPaymentsConfiguration($payments) + { + Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'prestafraud_payment'); + foreach ($payments AS $id_module => $id_payment_type) + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'prestafraud_payment (id_module, id_prestafraud_payment_type) VALUES ('.(int)$id_module.', '.(int)$id_payment_type.')'); + } + + private function _updateConfiguredCarrier($old, $new) + { + return Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'prestafraud_carrier SET id_carrier='.(int)$new.' WHERE id_carrier='.(int)$old); + } + + private function _pushDatas($datas) + { + if (function_exists('curl_init')) + { + $ch = curl_init($this->_trustUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, array('xml' => $datas)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + $content = curl_exec($ch); + curl_close($ch); + return $content; + } + elseif (function_exists('file_get_contents')) + { + $context = stream_context_create(array('http' => array('timeout' => 5))); + return file_get_contents($this->_trustUrl.'?xml='.urlencode(str_replace("\r", "\n", '', $datas)), $context); + } + else + return false; + } +} diff --git a/modules/productcomments/ProductComment.php b/modules/productcomments/ProductComment.php new file mode 100644 index 000000000..fbe8dc26a --- /dev/null +++ b/modules/productcomments/ProductComment.php @@ -0,0 +1,260 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class ProductComment extends ObjectModel +{ + public $id; + + /** @var integer Product's id */ + public $id_product; + + /** @var integer Customer's id */ + public $id_customer; + + /** @var integer Guest's id */ + public $id_guest; + + + /** @var integer Customer name */ + public $customer_name; + + /** @var string Title */ + public $title; + + /** @var string Content */ + public $content; + + /** @var integer Grade */ + public $grade; + + /** @var boolean Validate */ + public $validate = 0; + + public $deleted = 0; + + /** @var string Object creation date */ + public $date_add; + + protected $fieldsRequired = array('id_product', 'id_customer', 'content'); + protected $fieldsSize = array('content' => 65535); + protected $fieldsValidate = array('id_product' => 'isUnsignedId', 'id_customer' => 'isUnsignedId', 'content' => 'isMessage', + 'grade' => 'isFloat', 'validate' => 'isBool'); + + protected $table = 'product_comment'; + protected $identifier = 'id_product_comment'; + + public function getFields() + { + parent::validateFields(false); + $fields['id_product'] = (int)($this->id_product); + $fields['id_customer'] = (int)($this->id_customer); + $fields['id_guest'] = (int)($this->id_guest); + $fields['customer_name'] = pSQL($this->customer_name); + $fields['title'] = pSQL($this->title); + $fields['content'] = pSQL($this->content); + $fields['grade'] = (float)($this->grade); + $fields['validate'] = (int)($this->validate); + $fields['deleted'] = (int)($this->deleted); + $fields['date_add'] = pSQL($this->date_add); + return ($fields); + } + + /** + * Get comments by IdProduct + * + * @return array Comments + */ + static public function getByProduct($id_product, $p = 1, $n = null) + { + if (!Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + $validate = Configuration::get('PRODUCT_COMMENTS_MODERATE'); + $p = (int)($p); + $n = (int)($n); + if ($p <= 1) + $p = 1; + if ($n != null AND $n <= 0) + $n = 5; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT pc.`id_product_comment`, IF(c.id_customer, CONCAT(c.`firstname`, \' \', LEFT(c.`lastname`, 1)), pc.customer_name) customer_name, pc.`content`, pc.`grade`, pc.`date_add`, pc.title + FROM `'._DB_PREFIX_.'product_comment` pc + LEFT JOIN `'._DB_PREFIX_.'customer` c ON c.`id_customer` = pc.`id_customer` + WHERE pc.`id_product` = '.(int)($id_product).($validate == '1' ? ' AND pc.`validate` = 1' : '').' + ORDER BY pc.`date_add` DESC + '.($n ? 'LIMIT '.(int)(($p - 1) * $n).', '.(int)($n) : '')); + } + + static public function getByCustomer($id_product, $id_customer, $last = false, $id_guest = false) + { + $results = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'product_comment` pc + WHERE pc.`id_product` = '.(int)($id_product).' AND '.(!$id_guest ? 'pc.`id_customer` = '.(int)($id_customer) : 'pc.`id_guest` = '.(int)($id_guest)).' + ORDER BY pc.`date_add` DESC ' + .($last ? 'LIMIT 1' : '') + ); + + if ($last) + return array_shift($results); + + return $results; + } + + /** + * Get Grade By product + * + * @return array Grades + */ + static public function getGradeByProduct($id_product, $id_lang) + { + if (!Validate::isUnsignedId($id_product) || + !Validate::isUnsignedId($id_lang)) + die(Tools::displayError()); + $validate = Configuration::get('PRODUCT_COMMENTS_MODERATE'); + + return (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT pc.`id_product_comment`, pcg.`grade`, pccl.`name`, pcc.`id_product_comment_criterion` + FROM `'._DB_PREFIX_.'product_comment` pc + LEFT JOIN `'._DB_PREFIX_.'product_comment_grade` pcg ON (pcg.`id_product_comment` = pc.`id_product_comment`) + LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion` pcc ON (pcc.`id_product_comment_criterion` = pcg.`id_product_comment_criterion`) + LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl ON (pccl.`id_product_comment_criterion` = pcg.`id_product_comment_criterion`) + WHERE pc.`id_product` = '.(int)($id_product).' + AND pccl.`id_lang` = '.(int)($id_lang). + ($validate == '1' ? ' AND pc.`validate` = 1' : ''))); + } + + static public function getAveragesByProduct($id_product, $id_lang) + { + /* Get all grades */ + $grades = ProductComment::getGradeByProduct((int)($id_product), (int)($id_lang)); + $total = ProductComment::getGradedCommentNumber((int)($id_product)); + if (!sizeof($grades) OR (!$total)) + return array(); + + /* Addition grades for each criterion */ + $criterionsGradeTotal = array(); + for ($i = 0; $i < count($grades); ++$i) + if (array_key_exists($grades[$i]['id_product_comment_criterion'], $criterionsGradeTotal) === false) + $criterionsGradeTotal[$grades[$i]['id_product_comment_criterion']] = (int)($grades[$i]['grade']); + else + $criterionsGradeTotal[$grades[$i]['id_product_comment_criterion']] += (int)($grades[$i]['grade']); + + /* Finally compute the averages */ + $averages = array(); + foreach ($criterionsGradeTotal AS $key => $criterionGradeTotal) + $averages[(int)($key)] = (int)($total) ? ((int)($criterionGradeTotal) / (int)($total)) : 0; + return $averages; + } + + /** + * Return number of comments and average grade by products + * + * @return array Info + */ + static public function getCommentNumber($id_product) + { + if (!Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + $validate = (int)(Configuration::get('PRODUCT_COMMENTS_MODERATE')); + if (($result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(`id_product_comment`) AS "nbr" + FROM `'._DB_PREFIX_.'product_comment` pc + WHERE `id_product` = '.(int)($id_product).($validate == '1' ? ' AND `validate` = 1' : ''))) === false) + return false; + return (int)($result['nbr']); + } + + /** + * Return number of comments and average grade by products + * + * @return array Info + */ + static public function getGradedCommentNumber($id_product) + { + if (!Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + $validate = (int)(Configuration::get('PRODUCT_COMMENTS_MODERATE')); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(pc.`id_product`) AS nbr + FROM `'._DB_PREFIX_.'product_comment` pc + WHERE `id_product` = '.(int)($id_product).($validate == '1' ? ' AND `validate` = 1' : '').' + AND `grade` > 0'); + return (int)($result['nbr']); + } + + /** + * Get comments by Validation + * + * @return array Comments + */ + static public function getByValidate($validate = '0', $deleted = false) + { + global $cookie; + + return (Db::getInstance()->ExecuteS(' + SELECT pc.`id_product_comment`, pc.`id_product`, IF(c.id_customer, CONCAT(c.`firstname`, \' \', c.`lastname`), pc.customer_name) customer_name, pc.`content`, pc.`grade`, pc.`date_add`, pl.`name` + FROM `'._DB_PREFIX_.'product_comment` pc + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = pc.`id_customer`) + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = pc.`id_product`) + WHERE pc.`validate` = '.(int)($validate).' + AND pl.`id_lang` = '.(int)($cookie->id_lang).' + ORDER BY pc.`date_add` DESC')); + } + + /** + * Validate a comment + * + * @return boolean succeed + */ + public function validate($validate = '1') + { + if (!Validate::isUnsignedId($this->id)) + die(Tools::displayError()); + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product_comment` SET + `validate` = '.(int)($validate).' + WHERE `id_product_comment` = '.(int)($this->id))); + } + + /** + * Delete Grades + * + * @return boolean succeed + */ + static public function deleteGrades($id_product_comment) + { + if (!Validate::isUnsignedId($id_product_comment)) + die(Tools::displayError()); + return (Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_comment_grade` + WHERE `id_product_comment` = '.(int)($id_product_comment))); + } +}; diff --git a/modules/productcomments/ProductCommentCriterion.php b/modules/productcomments/ProductCommentCriterion.php new file mode 100644 index 000000000..a13e607ec --- /dev/null +++ b/modules/productcomments/ProductCommentCriterion.php @@ -0,0 +1,214 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ProductCommentCriterion extends ObjectModel +{ + public $id; + public $id_product_comment_criterion_type; + + public $name; + public $active = 1; + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 128); + protected $fieldsValidateLang = array('name' => 'isGenericName'); + + protected $table = 'product_comment_criterion'; + protected $identifier = 'id_product_comment_criterion'; + + + public function getFields() + { + parent::validateFields(); + return array('id_product_comment_criterion_type' => (int)$this->id_product_comment_criterion_type, 'active' => (int)$this->active); + } + + public function getTranslationsFieldsChild() + { + parent::validateFieldsLang(); + return parent::getTranslationsFields(array('name')); + } + + public function delete() + { + if (!parent::delete()) + return false; + if ($this->id_product_comment_criterion_type == 2) + if (!Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_comment_criterion_category + WHERE id_product_comment_criterion='.(int)$this->id)) + return false; + elseif ($this->id_product_comment_criterion_type == 3) + if (!Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_comment_criterion_product + WHERE id_product_comment_criterion='.(int)$this->id)) + return false; + + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_comment_grade` + WHERE `id_product_comment_criterion` = '.(int)$this->id); + } + + public function update($nullValues = false) + { + $previousUpdate = new self((int)$this->id); + if (!parent::update($nullValues)) + return false; + if ($previousUpdate->id_product_comment_criterion_type != $this->id_product_comment_criterion_type) + { + if ($previousUpdate->id_product_comment_criterion_type == 2) + return Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_comment_criterion_category + WHERE id_product_comment_criterion='.(int)$previousUpdate->id); + elseif ($previousUpdate->id_product_comment_criterion_type == 3) + return Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.'product_comment_criterion_product + WHERE id_product_comment_criterion='.(int)$previousUpdate->id); + } + return true; + } + + /** + * Link a Comment Criterion to a product + * + * @return boolean succeed + */ + public function addProduct($id_product) + { + if (!Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + return (Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'product_comment_criterion_product` (`id_product_comment_criterion`, `id_product`) + VALUES('.(int)$this->id.','.(int)$id_product.')')); + } + + /** + * Link a Comment Criterion to a category + * + * @return boolean succeed + */ + public function addCategory($id_category) + { + if (!Validate::isUnsignedId($id_category)) + die(Tools::displayError()); + return (Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'product_comment_criterion_category` (`id_product_comment_criterion`, `id_category`) + VALUES('.(int)$this->id.','.(int)$id_category.')')); + } + + /** + * Add grade to a criterion + * + * @return boolean succeed + */ + public function addGrade($id_product_comment, $grade) + { + if (!Validate::isUnsignedId($id_product_comment)) + die(Tools::displayError()); + if ($grade < 0) + $grade = 0; + else if ($grade > 10) + $grade = 10; + return (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_comment_grade` + (`id_product_comment`, `id_product_comment_criterion`, `grade`) VALUES( + '.(int)($id_product_comment).', + '.(int)$this->id.', + '.(int)($grade).')')); + } + + /** + * Get criterion by Product + * + * @return array Criterion + */ + static public function getByProduct($id_product, $id_lang) + { + if (!Validate::isUnsignedId($id_product) || + !Validate::isUnsignedId($id_lang)) + die(Tools::displayError()); + return Db::getInstance()->ExecuteS(' + SELECT pcc.`id_product_comment_criterion`, pccl.`name` + FROM `'._DB_PREFIX_.'product_comment_criterion` pcc + LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl ON (pcc.id_product_comment_criterion = pccl.id_product_comment_criterion) + LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_product` pccp ON (pcc.`id_product_comment_criterion` = pccp.`id_product_comment_criterion` AND pccp.`id_product` = '.(int)$id_product.') + LEFT JOIN `'._DB_PREFIX_.'product_comment_criterion_category` pccc ON (pcc.`id_product_comment_criterion` = pccc.`id_product_comment_criterion`) + LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_category_default = pccc.id_category AND p.id_product = '.(int)$id_product.') + WHERE pccl.`id_lang` = '.(int)($id_lang).' AND (pccp.id_product IS NOT NULL OR p.id_product IS NOT NULL OR pcc.id_product_comment_criterion_type = 1) AND pcc.active = 1 + GROUP BY pcc.id_product_comment_criterion'); + } + + /** + * Get Criterions + * + * @return array Criterions + */ + static public function getCriterions($id_lang, $type = false, $active = false) + { + if (!Validate::isUnsignedId($id_lang)) + die(Tools::displayError()); + return (Db::getInstance()->ExecuteS(' + SELECT pcc.`id_product_comment_criterion`, pcc.id_product_comment_criterion_type, pccl.`name`, pcc.active + FROM `'._DB_PREFIX_.'product_comment_criterion` pcc + JOIN `'._DB_PREFIX_.'product_comment_criterion_lang` pccl ON (pcc.id_product_comment_criterion = pccl.id_product_comment_criterion) + WHERE pccl.`id_lang` = '.(int)$id_lang.($active ? ' AND active = 1' : '').($type ? ' AND id_product_comment_criterion_type = '.(int)$type : '').' + ORDER BY pccl.`name` ASC')); + } + + public function getProducts() + { + $res = Db::getInstance()->ExecuteS(' + SELECT pccp.id_product, pccp.id_product_comment_criterion + FROM `'._DB_PREFIX_.'product_comment_criterion_product` pccp + WHERE pccp.id_product_comment_criterion = '.(int)$this->id); + $products = array(); + if ($res) + foreach ($res AS $row) + $products[] = (int)$row['id_product']; + return $products; + } + + public function getCategories() + { + $res = Db::getInstance()->ExecuteS(' + SELECT pccc.id_category, pccc.id_product_comment_criterion + FROM `'._DB_PREFIX_.'product_comment_criterion_category` pccc + WHERE pccc.id_product_comment_criterion = '.(int)$this->id); + $criterions = array(); + if ($res) + foreach ($res AS $row) + $criterions[] = (int)$row['id_category']; + return $criterions; + } + + public function deleteCategories() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_category` WHERE `id_product_comment_criterion` = '.(int)$this->id); + } + + public function deleteProducts() + { + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_product` WHERE `id_product_comment_criterion` = '.(int)$this->id); + } + + static public function getTypes() + { + return array(1 => Tools::displayError('Valid for the entire catalog'), 2 => Tools::displayError('Restricted to some categories'), 3 => Tools::displayError('Restricted to some products')); + } +} \ No newline at end of file diff --git a/modules/productcomments/ProductCriterion.php b/modules/productcomments/ProductCriterion.php new file mode 100644 index 000000000..8e5ae1d4d --- /dev/null +++ b/modules/productcomments/ProductCriterion.php @@ -0,0 +1,175 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class ProductCommentCriterion +{ + /** + * Add a Comment Criterion + * + * @return boolean succeed + */ + static public function add($id_lang, $name) + { + if (!Validate::isUnsignedId($id_lang) || + !Validate::isMessage($name)) + die(Tools::displayError()); + return (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_comment_criterion` + (`id_lang`, `name`) VALUES( + '.(int)($id_lang).', + \''.pSQL($name).'\')')); + } + + /** + * Link a Comment Criterion to a product + * + * @return boolean succeed + */ + static public function addToProduct($id_product_comment_criterion, $id_product) + { + if (!Validate::isUnsignedId($id_product_comment_criterion) || + !Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + return (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_comment_criterion_product` + (`id_product_comment_criterion`, `id_product`) VALUES( + '.(int)($id_product_comment_criterion).', + '.(int)($id_product).')')); + } + + /** + * Add grade to a criterion + * + * @return boolean succeed + */ + static public function addGrade($id_product_comment, $id_product_comment_criterion, $grade) + { + if (!Validate::isUnsignedId($id_product_comment) || + !Validate::isUnsignedId($id_product_comment_criterion)) + die(Tools::displayError()); + if ($grade < 0) + $grade = 0; + else if ($grade > 10) + $grade = 10; + return (Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'product_comment_grade` + (`id_product_comment`, `id_product_comment_criterion`, `grade`) VALUES( + '.(int)($id_product_comment).', + '.(int)($id_product_comment_criterion).', + '.(int)($grade).')')); + } + + /** + * Update criterion + * + * @return boolean succeed + */ + static public function update($id_product_comment_criterion, $id_lang, $name) + { + if (!Validate::isUnsignedId($id_product_comment_criterion) || + !Validate::isUnsignedId($id_lang) || + !Validate::isMessage($name)) + die(Tools::displayError()); + return (Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'product_comment_criterion` SET + `name` = \''.pSQL($name).'\' + WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion).' AND + `id_lang` = '.(int)($id_lang))); + } + + /** + * Get criterion by Product + * + * @return array Criterion + */ + static public function getByProduct($id_product, $id_lang) + { + if (!Validate::isUnsignedId($id_product) || + !Validate::isUnsignedId($id_lang)) + die(Tools::displayError()); + return (Db::getInstance()->ExecuteS(' + SELECT pcc.`id_product_comment_criterion`, pcc.`name` + FROM `'._DB_PREFIX_.'product_comment_criterion` pcc + INNER JOIN `'._DB_PREFIX_.'product_comment_criterion_product` pccp ON pcc.`id_product_comment_criterion` = pccp.`id_product_comment_criterion` + WHERE pccp.`id_product` = '.(int)($id_product).' AND + pcc.`id_lang` = '.(int)($id_lang))); + } + + /** + * Get Criterions + * + * @return array Criterions + */ + static public function get($id_lang) + { + if (!Validate::isUnsignedId($id_lang)) + die(Tools::displayError()); + return (Db::getInstance()->ExecuteS(' + SELECT pcc.`id_product_comment_criterion`, pcc.`name` + FROM `'._DB_PREFIX_.'product_comment_criterion` pcc + WHERE pcc.`id_lang` = '.(int)($id_lang).' + ORDER BY pcc.`name` ASC')); + } + + /** + * Delete product criterion by product + * + * @return boolean succeed + */ + static public function deleteByProduct($id_product) + { + if (!Validate::isUnsignedId($id_product)) + die(Tools::displayError()); + return (Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_product` + WHERE `id_product` = '.(int)($id_product))); + } + + /** + * Delete all reference of a criterion + * + * @return boolean succeed + */ + static public function delete($id_product_comment_criterion) + { + if (!Validate::isUnsignedId($id_product_comment_criterion)) + die(Tools::displayError()); + $result = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_comment_grade` + WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion)); + if ($result === false) + return ($result); + $result = Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_comment_criterion_product` + WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion)); + if ($result === false) + return ($result); + return (Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'product_comment_criterion` + WHERE `id_product_comment_criterion` = '.(int)($id_product_comment_criterion))); + } +}; \ No newline at end of file diff --git a/modules/productcomments/config.xml b/modules/productcomments/config.xml new file mode 100755 index 000000000..027c54713 --- /dev/null +++ b/modules/productcomments/config.xml @@ -0,0 +1,12 @@ + + + productcomments + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/productcomments/de.php b/modules/productcomments/de.php new file mode 100644 index 000000000..c42ef775d --- /dev/null +++ b/modules/productcomments/de.php @@ -0,0 +1,75 @@ +productcomments_7c3b0e9898b88deee7ea75aafd2e37e2'] = 'Durchschnittsgrad'; +$_MODULE['<{productcomments}prestashop>productcomments_b1897515d548a960afe49ecf66a29021'] = 'Durchschnitt'; +$_MODULE['<{productcomments}prestashop>productcomments_5da618e8e4b89c66fe86e32cdafde142'] = 'Von'; +$_MODULE['<{productcomments}prestashop>productcomments_b78a3223503896721cca1303f776159b'] = 'Titel'; +$_MODULE['<{productcomments}prestashop>productcomments_0be8406951cdfda82f00f79328cf4efc'] = 'Kommentieren'; +$_MODULE['<{productcomments}prestashop>productcomments_08621d00a3a801b9159a11b8bbd69f89'] = 'Zur Zeit keine Kundenkommentare.'; +$_MODULE['<{productcomments}prestashop>productcomments_6d28f2900adb9e500868166f6d04da92'] = 'Sie sollten '; +$_MODULE['<{productcomments}prestashop>productcomments_30b3dbf8b5c381c2e8d62189048ab37c'] = 'Sekunde (n) vor dem Posten eines neuen Kommentars'; +$_MODULE['<{productcomments}prestashop>productcomments_c3edcf2cedbd4ce230fd6d4ea8915718'] = 'Kommentar hinzufügen'; +$_MODULE['<{productcomments}prestashop>productcomments_a2ed44743411cf8b80e397448fce104c'] = 'Ihr Name:'; +$_MODULE['<{productcomments}prestashop>productcomments_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Titel:'; +$_MODULE['<{productcomments}prestashop>productcomments_240f3031f25601fa128bd4e15f0a37de'] = 'Kommentar:'; +$_MODULE['<{productcomments}prestashop>productcomments_94966d90747b97d1f0f206c98a8b1ac3'] = 'Senden'; +$_MODULE['<{productcomments}prestashop>productcomments_720fae7db6e6055d2b47890240bb3598'] = 'Nur registrierte Benutzer können einen neuen Kommentar posten.'; +$_MODULE['<{productcomments}prestashop>productcomments_b91c4e8b229a399a3bc911d352524a9b'] = 'Produkt-Kommentare'; +$_MODULE['<{productcomments}prestashop>productcomments_0c21532dfd3476791e5aab1aa7fa7405'] = 'Benutzern erlauben, einen Kommentar zu einem Produkt zu posten'; +$_MODULE['<{productcomments}prestashop>productcomments_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Bestätigung'; +$_MODULE['<{productcomments}prestashop>productcomments_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{productcomments}prestashop>productcomments_1bb54e382f7dbdb260f0aa6b42bb624b'] = 'Kriterium gelöscht'; +$_MODULE['<{productcomments}prestashop>productcomments_e6ea19ae2eb9447f98c7ed74227bb4a3'] = 'Das Feld Name ist erfolderlich mindestns in'; +$_MODULE['<{productcomments}prestashop>productcomments_21b0922096daf5c742cc98986d857cc1'] = 'Kriterium aktualisiert'; +$_MODULE['<{productcomments}prestashop>productcomments_e140a9c4fcfa0aad7af83f65e577c287'] = 'Kriterium hinzugefügt'; +$_MODULE['<{productcomments}prestashop>productcomments_254f642527b45bc260048e30704edb39'] = 'Konfiguration'; +$_MODULE['<{productcomments}prestashop>productcomments_9ca2adc05abbe3cc0a659a16fd7d5edc'] = 'Alle Kommentare müssen durch einen Mitarbeiter bestätigt werden'; +$_MODULE['<{productcomments}prestashop>productcomments_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{productcomments}prestashop>productcomments_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{productcomments}prestashop>productcomments_66b06316f84eb73075bca0e27f2a5581'] = 'Gastkommentare erlauben'; +$_MODULE['<{productcomments}prestashop>productcomments_2e53b6c4c0d39a73718342ab2366ae37'] = 'Minimale Zeit zwischen 2 Kommentaren vom selben Benutzer'; +$_MODULE['<{productcomments}prestashop>productcomments_783e8e29e6a8c3e22baa58a19420eb4f'] = 'Sekunden'; +$_MODULE['<{productcomments}prestashop>productcomments_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{productcomments}prestashop>productcomments_0a36c5f3ea6825804e6b4314c4084a12'] = 'Kommentare moderieren'; +$_MODULE['<{productcomments}prestashop>productcomments_a517747c3d12f99244ae598910d979c5'] = 'Verfasser'; +$_MODULE['<{productcomments}prestashop>productcomments_df644ae155e79abf54175bd15d75f363'] = 'Produktname'; +$_MODULE['<{productcomments}prestashop>productcomments_06df33001c1d7187fdd81ea1f5b277aa'] = 'Handlungen'; +$_MODULE['<{productcomments}prestashop>productcomments_c4408d335012a56ff58937d78050efad'] = 'Akzeptieren'; +$_MODULE['<{productcomments}prestashop>productcomments_f2a6c498fb90ee345d997f888fce3b18'] = 'Löschen'; +$_MODULE['<{productcomments}prestashop>productcomments_8bf0c707232d63bf83b4b2467d2df41a'] = 'Auswahl:'; +$_MODULE['<{productcomments}prestashop>productcomments_d00b7f656273a495f555bead0248d6f5'] = 'Zur Zeit keine Kommentare zum Bestätigen.'; +$_MODULE['<{productcomments}prestashop>productcomments_7799b301b44c329fc9ec6a3a9c1905e0'] = 'Ein neues Kriterium hinzufügen'; +$_MODULE['<{productcomments}prestashop>productcomments_7753ab38f8e113e8af65ab1241331625'] = 'Sie können mehrere Kriterien definieren, um Ihren Kunden bei ihrem Beitrag zu helfen. Zum Beispiel: Effizienz, Leichtigkeit, Design.'; +$_MODULE['<{productcomments}prestashop>productcomments_bc58d00e1e42de31a8e58f8dc7d9bdc7'] = 'Sie können hier unten ein neues Kriterium hinzufügen:'; +$_MODULE['<{productcomments}prestashop>productcomments_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{productcomments}prestashop>productcomments_f255b686708be7c5082cd3f5bab872c1'] = 'Gilt für'; +$_MODULE['<{productcomments}prestashop>productcomments_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Aktiv'; +$_MODULE['<{productcomments}prestashop>productcomments_f1d04e02f02d1f13450ae56f213a93f2'] = 'Ändern Sie das Kriterium'; +$_MODULE['<{productcomments}prestashop>productcomments_9be4d6372a6487e90d8f153c66c1499d'] = 'Fügen Sie dieses Kriterium hinzu'; +$_MODULE['<{productcomments}prestashop>productcomments_21a512e9d635e82fc7c7077fc880988b'] = 'Kriterium'; +$_MODULE['<{productcomments}prestashop>productcomments_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Typ'; +$_MODULE['<{productcomments}prestashop>productcomments_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{productcomments}prestashop>productcomments_7dce122004969d56ae2e0245cb754d35'] = 'Bearbeiten'; +$_MODULE['<{productcomments}prestashop>productcomments_8eb0b6ced310b120b12106e8d4bdbdb8'] = 'Bereich der Kriterien verwalten'; +$_MODULE['<{productcomments}prestashop>productcomments_6556e73b0255c988d9fe70141f1d4bd9'] = 'Nur Kriterien, die auf Kategorien oder Produkte beschränkt sind, können untenstehend konfiguriert werden:'; +$_MODULE['<{productcomments}prestashop>productcomments_a942d4abf908e5f708ec4dfaa949065e'] = 'Wählen Sie ein Kriterium'; +$_MODULE['<{productcomments}prestashop>productcomments_068f80c7519d0528fb08e82137a72131'] = 'Produkte'; +$_MODULE['<{productcomments}prestashop>productcomments_af1b98adf7f686b84cd0b443e022b7a0'] = 'Kategorien'; +$_MODULE['<{productcomments}prestashop>productcomments_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{productcomments}prestashop>productcomments_b9aefa40a54680bb258f9f9569290fae'] = 'Name des Produkts'; +$_MODULE['<{productcomments}prestashop>productcomments_99121ab27aaa7472cfada9071c5ba434'] = 'Name der Kategorie '; +$_MODULE['<{productcomments}prestashop>productcomments_fd4b5401d4d3c7d32d158bfc1e552f3b'] = 'Bitte tragen Sie Ihren Namen ein'; +$_MODULE['<{productcomments}prestashop>productcomments_7b2f2ea0f690ef3c2fc9bba0e4bfbc4c'] = 'Ungültiger Kommentartext gepostet.'; +$_MODULE['<{productcomments}prestashop>productcomments_f88dc17737f7fdd4464b2eb922a8f133'] = 'Ein Fehler bist eim Speichern Ihres Kommentars aufgetreten.'; +$_MODULE['<{productcomments}prestashop>productcomments_7fa4a3510dafd0eac6435c19861b2bb7'] = 'Kommentar erfolgreich geschrieben.'; +$_MODULE['<{productcomments}prestashop>productcomments_f8694a9aae2eb045920f613cfa7f1235'] = 'Wartet aufBestätigung durch Moderator.'; +$_MODULE['<{productcomments}prestashop>productcomments_6bf852d9850445291f5e9d4740ac7b50'] = 'Kommentartext ist erforderlich.'; +$_MODULE['<{productcomments}prestashop>productcomments_ba8d7ae5dcadfba739f28a777378f208'] = 'Sekunden warten, bevor Sie einen neuen Kommentar posten'; +$_MODULE['<{productcomments}prestashop>products-comparison_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Kommentare'; +$_MODULE['<{productcomments}prestashop>products-comparison_b1897515d548a960afe49ecf66a29021'] = 'Durchschnitt'; +$_MODULE['<{productcomments}prestashop>products-comparison_bc976f6c3405523cde61f63a7cbe224b'] = 'Kommentare ansehen'; +$_MODULE['<{productcomments}prestashop>tab_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Kommentare'; + +?> \ No newline at end of file diff --git a/modules/productcomments/en.php b/modules/productcomments/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/productcomments/en.php @@ -0,0 +1,4 @@ +productcomments_b91c4e8b229a399a3bc911d352524a9b'] = 'Comentario sobre el producto'; +$_MODULE['<{productcomments}prestashop>productcomments_0c21532dfd3476791e5aab1aa7fa7405'] = 'Permitir a los usuarios registrar comentarios acerca del producto'; +$_MODULE['<{productcomments}prestashop>productcomments_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmación'; +$_MODULE['<{productcomments}prestashop>productcomments_c888438d14855d7d96a2724ee9c306bd'] = 'Ajustes actualizados'; +$_MODULE['<{productcomments}prestashop>productcomments_1bb54e382f7dbdb260f0aa6b42bb624b'] = 'Criterio suprimido'; +$_MODULE['<{productcomments}prestashop>productcomments_e6ea19ae2eb9447f98c7ed74227bb4a3'] = 'El campo Nombre es requerido por lo menos en'; +$_MODULE['<{productcomments}prestashop>productcomments_21b0922096daf5c742cc98986d857cc1'] = 'Criterio actualizado'; +$_MODULE['<{productcomments}prestashop>productcomments_e140a9c4fcfa0aad7af83f65e577c287'] = 'Creteria añadido'; +$_MODULE['<{productcomments}prestashop>productcomments_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{productcomments}prestashop>productcomments_9ca2adc05abbe3cc0a659a16fd7d5edc'] = 'Todos los comentarios deben estar validados por un empleado'; +$_MODULE['<{productcomments}prestashop>productcomments_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{productcomments}prestashop>productcomments_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{productcomments}prestashop>productcomments_66b06316f84eb73075bca0e27f2a5581'] = 'Autorizar los comentarios de visitantes que no están conectados.'; +$_MODULE['<{productcomments}prestashop>productcomments_2e53b6c4c0d39a73718342ab2366ae37'] = 'Tiempo mínimo entre dos comentarios de un mismo usuario'; +$_MODULE['<{productcomments}prestashop>productcomments_783e8e29e6a8c3e22baa58a19420eb4f'] = 'segundos'; +$_MODULE['<{productcomments}prestashop>productcomments_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{productcomments}prestashop>productcomments_0a36c5f3ea6825804e6b4314c4084a12'] = 'Moderar Comentarios'; +$_MODULE['<{productcomments}prestashop>productcomments_a517747c3d12f99244ae598910d979c5'] = 'Autor'; +$_MODULE['<{productcomments}prestashop>productcomments_0be8406951cdfda82f00f79328cf4efc'] = 'Comentario'; +$_MODULE['<{productcomments}prestashop>productcomments_df644ae155e79abf54175bd15d75f363'] = 'Nombre del producto'; +$_MODULE['<{productcomments}prestashop>productcomments_06df33001c1d7187fdd81ea1f5b277aa'] = 'Acciones'; +$_MODULE['<{productcomments}prestashop>productcomments_c4408d335012a56ff58937d78050efad'] = 'Aceptar'; +$_MODULE['<{productcomments}prestashop>productcomments_f2a6c498fb90ee345d997f888fce3b18'] = 'Eliminar'; +$_MODULE['<{productcomments}prestashop>productcomments_8bf0c707232d63bf83b4b2467d2df41a'] = 'Selección:'; +$_MODULE['<{productcomments}prestashop>productcomments_d00b7f656273a495f555bead0248d6f5'] = 'Ningún comentario que validar'; +$_MODULE['<{productcomments}prestashop>productcomments_7799b301b44c329fc9ec6a3a9c1905e0'] = 'Añadir un nuevo criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_7753ab38f8e113e8af65ab1241331625'] = 'Puede definir varios criterios para guiar a sus clientes en su comentario. Por ejemplo: eficacia, diseño, etc...'; +$_MODULE['<{productcomments}prestashop>productcomments_bc58d00e1e42de31a8e58f8dc7d9bdc7'] = 'Puede añadir un nuevo criterio a continuación:'; +$_MODULE['<{productcomments}prestashop>productcomments_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{productcomments}prestashop>productcomments_f255b686708be7c5082cd3f5bab872c1'] = 'Aplicar a '; +$_MODULE['<{productcomments}prestashop>productcomments_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Activo'; +$_MODULE['<{productcomments}prestashop>productcomments_f1d04e02f02d1f13450ae56f213a93f2'] = 'Modificar este criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_9be4d6372a6487e90d8f153c66c1499d'] = 'Añadir este criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_21a512e9d635e82fc7c7077fc880988b'] = 'Criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Tipo '; +$_MODULE['<{productcomments}prestashop>productcomments_ec53a8c4f07baed5d8825072c89799be'] = 'Estado'; +$_MODULE['<{productcomments}prestashop>productcomments_7dce122004969d56ae2e0245cb754d35'] = 'Modificar'; +$_MODULE['<{productcomments}prestashop>productcomments_8eb0b6ced310b120b12106e8d4bdbdb8'] = 'Administrar el'; +$_MODULE['<{productcomments}prestashop>productcomments_6556e73b0255c988d9fe70141f1d4bd9'] = 'Solo pueden configurarse a continuación los criterios que corresponden a categorías o productos:'; +$_MODULE['<{productcomments}prestashop>productcomments_a942d4abf908e5f708ec4dfaa949065e'] = 'Elija un criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_068f80c7519d0528fb08e82137a72131'] = 'Productos'; +$_MODULE['<{productcomments}prestashop>productcomments_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorías'; +$_MODULE['<{productcomments}prestashop>productcomments_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{productcomments}prestashop>productcomments_b9aefa40a54680bb258f9f9569290fae'] = 'Nombre del producto'; +$_MODULE['<{productcomments}prestashop>productcomments_99121ab27aaa7472cfada9071c5ba434'] = 'Nombre de la categoría'; +$_MODULE['<{productcomments}prestashop>productcomments_fd4b5401d4d3c7d32d158bfc1e552f3b'] = 'Por favor, escriba su nombre'; +$_MODULE['<{productcomments}prestashop>productcomments_7b2f2ea0f690ef3c2fc9bba0e4bfbc4c'] = 'Comentario texto no válido para una publicación.'; +$_MODULE['<{productcomments}prestashop>productcomments_f88dc17737f7fdd4464b2eb922a8f133'] = 'Se ha producido un error al guardar su comentario.'; +$_MODULE['<{productcomments}prestashop>productcomments_7fa4a3510dafd0eac6435c19861b2bb7'] = 'Comentario publicado con éxito.'; +$_MODULE['<{productcomments}prestashop>productcomments_f8694a9aae2eb045920f613cfa7f1235'] = 'En espera de validación moderador'; +$_MODULE['<{productcomments}prestashop>productcomments_6bf852d9850445291f5e9d4740ac7b50'] = 'Se necesita el texto del comentario.'; +$_MODULE['<{productcomments}prestashop>productcomments_6d28f2900adb9e500868166f6d04da92'] = 'Debe esperar'; +$_MODULE['<{productcomments}prestashop>productcomments_ba8d7ae5dcadfba739f28a777378f208'] = 'segundos antes de escribir un nuevo comentario.'; +$_MODULE['<{productcomments}prestashop>productcomments_7c3b0e9898b88deee7ea75aafd2e37e2'] = 'Grado medio'; +$_MODULE['<{productcomments}prestashop>productcomments_b1897515d548a960afe49ecf66a29021'] = 'Promedio'; +$_MODULE['<{productcomments}prestashop>productcomments_5da618e8e4b89c66fe86e32cdafde142'] = 'Desde'; +$_MODULE['<{productcomments}prestashop>productcomments_b78a3223503896721cca1303f776159b'] = 'Título'; +$_MODULE['<{productcomments}prestashop>productcomments_08621d00a3a801b9159a11b8bbd69f89'] = 'No hay comentarios de clientes por ahora.'; +$_MODULE['<{productcomments}prestashop>productcomments_30b3dbf8b5c381c2e8d62189048ab37c'] = 'segundo(s) antes de escribir un nuevo comentario.'; +$_MODULE['<{productcomments}prestashop>productcomments_c3edcf2cedbd4ce230fd6d4ea8915718'] = 'Añadir un comentario'; +$_MODULE['<{productcomments}prestashop>productcomments_a2ed44743411cf8b80e397448fce104c'] = 'Su nombre:'; +$_MODULE['<{productcomments}prestashop>productcomments_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Título:'; +$_MODULE['<{productcomments}prestashop>productcomments_240f3031f25601fa128bd4e15f0a37de'] = 'Comentario:'; +$_MODULE['<{productcomments}prestashop>productcomments_94966d90747b97d1f0f206c98a8b1ac3'] = 'Enviar'; +$_MODULE['<{productcomments}prestashop>productcomments_720fae7db6e6055d2b47890240bb3598'] = 'Solamente los usuarios registrados pueden introducir comentarios.'; +$_MODULE['<{productcomments}prestashop>products-comparison_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Comentarios'; +$_MODULE['<{productcomments}prestashop>products-comparison_b1897515d548a960afe49ecf66a29021'] = 'Media'; +$_MODULE['<{productcomments}prestashop>products-comparison_bc976f6c3405523cde61f63a7cbe224b'] = 'Ver las opiniones'; +$_MODULE['<{productcomments}prestashop>tab_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Comentarios'; diff --git a/modules/productcomments/fr.php b/modules/productcomments/fr.php new file mode 100644 index 000000000..67b610f07 --- /dev/null +++ b/modules/productcomments/fr.php @@ -0,0 +1,73 @@ +productcomments_b91c4e8b229a399a3bc911d352524a9b'] = 'Commentaires produits'; +$_MODULE['<{productcomments}prestashop>productcomments_0c21532dfd3476791e5aab1aa7fa7405'] = 'Autorise les utilisateurs à poster des commentaires sur les produits'; +$_MODULE['<{productcomments}prestashop>productcomments_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Confirmation'; +$_MODULE['<{productcomments}prestashop>productcomments_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{productcomments}prestashop>productcomments_1bb54e382f7dbdb260f0aa6b42bb624b'] = 'Critère supprimé'; +$_MODULE['<{productcomments}prestashop>productcomments_e6ea19ae2eb9447f98c7ed74227bb4a3'] = 'Le champ Nom est requis au moins une fois en'; +$_MODULE['<{productcomments}prestashop>productcomments_21b0922096daf5c742cc98986d857cc1'] = 'Critère mis à jour'; +$_MODULE['<{productcomments}prestashop>productcomments_e140a9c4fcfa0aad7af83f65e577c287'] = 'Critère ajouté'; +$_MODULE['<{productcomments}prestashop>productcomments_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{productcomments}prestashop>productcomments_9ca2adc05abbe3cc0a659a16fd7d5edc'] = 'Les commentaires doivent être validés par un employé'; +$_MODULE['<{productcomments}prestashop>productcomments_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{productcomments}prestashop>productcomments_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{productcomments}prestashop>productcomments_66b06316f84eb73075bca0e27f2a5581'] = 'Autoriser les commentaires des visiteurs qui n\'ont pas de compte client'; +$_MODULE['<{productcomments}prestashop>productcomments_2e53b6c4c0d39a73718342ab2366ae37'] = 'Temps minimum entre 2 commentaires d\'un même utilisateur'; +$_MODULE['<{productcomments}prestashop>productcomments_783e8e29e6a8c3e22baa58a19420eb4f'] = 'secondes'; +$_MODULE['<{productcomments}prestashop>productcomments_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{productcomments}prestashop>productcomments_0a36c5f3ea6825804e6b4314c4084a12'] = 'Modérer les commentaires'; +$_MODULE['<{productcomments}prestashop>productcomments_a517747c3d12f99244ae598910d979c5'] = 'Auteur'; +$_MODULE['<{productcomments}prestashop>productcomments_0be8406951cdfda82f00f79328cf4efc'] = 'Commentaire'; +$_MODULE['<{productcomments}prestashop>productcomments_df644ae155e79abf54175bd15d75f363'] = 'Nom du produit'; +$_MODULE['<{productcomments}prestashop>productcomments_06df33001c1d7187fdd81ea1f5b277aa'] = 'Actions'; +$_MODULE['<{productcomments}prestashop>productcomments_c4408d335012a56ff58937d78050efad'] = 'Accepter'; +$_MODULE['<{productcomments}prestashop>productcomments_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{productcomments}prestashop>productcomments_8bf0c707232d63bf83b4b2467d2df41a'] = 'Sélection :'; +$_MODULE['<{productcomments}prestashop>productcomments_d00b7f656273a495f555bead0248d6f5'] = 'Aucun commentaire à valider.'; +$_MODULE['<{productcomments}prestashop>productcomments_7799b301b44c329fc9ec6a3a9c1905e0'] = 'Ajouter un nouveau critère'; +$_MODULE['<{productcomments}prestashop>productcomments_7753ab38f8e113e8af65ab1241331625'] = 'Vous pouvez définir plusieurs critères afin de guider vos clients dans leur commentaire. Par exemple: performance, design etc ...'; +$_MODULE['<{productcomments}prestashop>productcomments_bc58d00e1e42de31a8e58f8dc7d9bdc7'] = 'Vous pouvez ajouter un nouveau critère ci-dessous :'; +$_MODULE['<{productcomments}prestashop>productcomments_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{productcomments}prestashop>productcomments_f255b686708be7c5082cd3f5bab872c1'] = 'Appliquer à'; +$_MODULE['<{productcomments}prestashop>productcomments_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Actif'; +$_MODULE['<{productcomments}prestashop>productcomments_f1d04e02f02d1f13450ae56f213a93f2'] = 'Modifier ce critère'; +$_MODULE['<{productcomments}prestashop>productcomments_9be4d6372a6487e90d8f153c66c1499d'] = 'Ajouter ce critère'; +$_MODULE['<{productcomments}prestashop>productcomments_21a512e9d635e82fc7c7077fc880988b'] = 'Critère'; +$_MODULE['<{productcomments}prestashop>productcomments_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Type'; +$_MODULE['<{productcomments}prestashop>productcomments_ec53a8c4f07baed5d8825072c89799be'] = 'Etat'; +$_MODULE['<{productcomments}prestashop>productcomments_7dce122004969d56ae2e0245cb754d35'] = 'Modifier'; +$_MODULE['<{productcomments}prestashop>productcomments_8eb0b6ced310b120b12106e8d4bdbdb8'] = 'Gérer le champ d\'action des critères'; +$_MODULE['<{productcomments}prestashop>productcomments_6556e73b0255c988d9fe70141f1d4bd9'] = 'Seuls les critères correspondant à des catégories ou des produits peuvent être configurés ci-dessous:'; +$_MODULE['<{productcomments}prestashop>productcomments_a942d4abf908e5f708ec4dfaa949065e'] = 'Choisissez un critère'; +$_MODULE['<{productcomments}prestashop>productcomments_068f80c7519d0528fb08e82137a72131'] = 'Produits'; +$_MODULE['<{productcomments}prestashop>productcomments_af1b98adf7f686b84cd0b443e022b7a0'] = 'Catégories'; +$_MODULE['<{productcomments}prestashop>productcomments_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{productcomments}prestashop>productcomments_b9aefa40a54680bb258f9f9569290fae'] = 'Nom du produit'; +$_MODULE['<{productcomments}prestashop>productcomments_99121ab27aaa7472cfada9071c5ba434'] = 'Nom de la catégorie'; +$_MODULE['<{productcomments}prestashop>productcomments_fd4b5401d4d3c7d32d158bfc1e552f3b'] = 'Merci de saisir votre nom'; +$_MODULE['<{productcomments}prestashop>productcomments_7b2f2ea0f690ef3c2fc9bba0e4bfbc4c'] = 'Commentaire invalide.'; +$_MODULE['<{productcomments}prestashop>productcomments_f88dc17737f7fdd4464b2eb922a8f133'] = 'Une erreur est survenue lors de l\'ajout du commentaire.'; +$_MODULE['<{productcomments}prestashop>productcomments_7fa4a3510dafd0eac6435c19861b2bb7'] = 'Commentaire ajouté avec succès.'; +$_MODULE['<{productcomments}prestashop>productcomments_f8694a9aae2eb045920f613cfa7f1235'] = 'En attente d\'une validation modérateur'; +$_MODULE['<{productcomments}prestashop>productcomments_6bf852d9850445291f5e9d4740ac7b50'] = 'Un texte est nécessaire pour publier un commentaire.'; +$_MODULE['<{productcomments}prestashop>productcomments_6d28f2900adb9e500868166f6d04da92'] = 'Vous devez attendre'; +$_MODULE['<{productcomments}prestashop>productcomments_ba8d7ae5dcadfba739f28a777378f208'] = 'secondes avant de poster un nouveau commentaire.'; +$_MODULE['<{productcomments}prestashop>productcomments_7c3b0e9898b88deee7ea75aafd2e37e2'] = 'Note moyenne'; +$_MODULE['<{productcomments}prestashop>productcomments_b1897515d548a960afe49ecf66a29021'] = 'Moyenne'; +$_MODULE['<{productcomments}prestashop>productcomments_5da618e8e4b89c66fe86e32cdafde142'] = 'De'; +$_MODULE['<{productcomments}prestashop>productcomments_b78a3223503896721cca1303f776159b'] = 'Titre'; +$_MODULE['<{productcomments}prestashop>productcomments_08621d00a3a801b9159a11b8bbd69f89'] = 'Aucun commentaire n\'a été publié pour le moment.'; +$_MODULE['<{productcomments}prestashop>productcomments_30b3dbf8b5c381c2e8d62189048ab37c'] = 'seconde(s) avant de poster un nouveau commentaire.'; +$_MODULE['<{productcomments}prestashop>productcomments_c3edcf2cedbd4ce230fd6d4ea8915718'] = 'Ajouter un commentaire'; +$_MODULE['<{productcomments}prestashop>productcomments_a2ed44743411cf8b80e397448fce104c'] = 'Votre nom :'; +$_MODULE['<{productcomments}prestashop>productcomments_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Titre : '; +$_MODULE['<{productcomments}prestashop>productcomments_240f3031f25601fa128bd4e15f0a37de'] = 'Commentaire :'; +$_MODULE['<{productcomments}prestashop>productcomments_94966d90747b97d1f0f206c98a8b1ac3'] = 'Envoyer'; +$_MODULE['<{productcomments}prestashop>productcomments_720fae7db6e6055d2b47890240bb3598'] = 'Seuls les utilisateurs enregistrés peuvent poster des commentaires.'; +$_MODULE['<{productcomments}prestashop>products-comparison_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Commentaires'; +$_MODULE['<{productcomments}prestashop>products-comparison_b1897515d548a960afe49ecf66a29021'] = 'Moyenne'; +$_MODULE['<{productcomments}prestashop>products-comparison_bc976f6c3405523cde61f63a7cbe224b'] = 'Voir les avis'; +$_MODULE['<{productcomments}prestashop>tab_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Commentaires'; diff --git a/modules/productcomments/img/accept.png b/modules/productcomments/img/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8129a490b329f3165f32fa0781701aab417ea GIT binary patch literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C4%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/modules/productcomments/img/comments_delete.png b/modules/productcomments/img/comments_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..6df7376d05443e4027ccbb4db640f5af33fa93d8 GIT binary patch literal 670 zcmV;P0%84$P)c;A#1+9e&U9~QBdhb7i%XEvtC8q~e*9 zTGor!c}UBO!Tp8?(pAKoEsCX!Dv~OwaI#?S|7Y+#Qz)whJ4xaq8BjDPqnKjt1re<^tvd-qJefSYq(anuCjd93vneh6K+h(i&yD!a1MnYqE;KZ-O};W0OdWKgI_pLK zle)Hr=PlJ{;*D|xQkXchK9;-N1yEG%b|6WX&N<<4bB3E4Y$IN>=XK}S-Z!3BGt%RR zcEyG7o^?>|EvvpZ=hdbo)D!63ewiH?<=TAz5V4&90#T#$5FJ5q1^@s607*qoM6N<$ Eg00gme*gdg literal 0 HcmV?d00001 diff --git a/modules/productcomments/img/delete.gif b/modules/productcomments/img/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..43c6ca8763d79bde87bcf437e497af00c8be562d GIT binary patch literal 752 zcmZ?wbhEHb6kt$bc*el6GthYN-n}zt&b)vB{*)i+-#|NQy$ zABXln&Q1FL`t{#CH*SY|{oJwc*Qz;h;)0))7aYq9ewP~fc2e)_P3vAY)$9wl{IzJp zy{ydlr;a^HiGHwZ{*SH8FZkJhE{gei`OM?;ir*_{?@ji478&@mD*tSH_`A&5@6Vqe z@G<&xeCOwiq-WvY-eS5f?;vgCP8#IHGBw=+^cY}xvy zx8c*8mDl2ff1W;kCeZrNm9vlQYJg5Caki?(^G9DBs4DA0KlA4-ZT3fl8 z8F_gb*}2-1v>0WWwY1oIg_&Emc-aM+Wn|bpRc1GF^$N-etzA1qr9X*XNNWw_j-BjG zGEKc(x)1gUF{(82E@ad^eMXp9hUxg0Q)f<}lVRDncBb&%dq*yAR+(|l-D@bZwvw%g)cL7VG z)An_f*+XqOetkIP*eg{wS7K(+qJ{-x0ue3?v&y~1d1To>MqD_2keNGNE=Pc|!BJ7b fV_(F^#N=Z_Jo9)pKRPly^YODPxtBC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/modules/productcomments/img/note.png b/modules/productcomments/img/note.png new file mode 100644 index 0000000000000000000000000000000000000000..244e6ca045c50a130086ac388b560a12761544b4 GIT binary patch literal 500 zcmV z!-sF!^gVb+8rtpyctW0#N6uWni0LCt_6PoOdbjll_d4>B|?abUmpo8>v>h}Zj|Ya;Eu#qwvU1IVc9khP8VrtAsT2=e83P~$#!xXbw)n}FlPSEe7Hq1uCb zR8w;xqmBrUgA^pnkB=O@-lq0DPz$ay0yh_~I_IDpzxRb(4=Iy9CT||k!08w)Pe>W4 zElmH8fF;68$GMwZ#7{4ozI(ySrR%I+xs4-G1q^UxnUV7rlf9>Rn&_6Wike0000R5;6} zlR-$7K@`V--@00+DaBF-W?)2!79o*g)FH}yo{A10qGLqR*@KDKJa+EdtwTj9l&K)3 z2LlOBDn&C*S6$t2zL_`kI_yf>8U)SZ4Lo?i|9|Ga7pW@$bJ76%<)upQ2dWkohkA#K zMI}Lf0?y#Ypb~>K)OJ3Nb_2Xn-g2{qt_l$p1E7$7cB|Auvc5p2DjMQKHUiZEL@2)q zQEDIR;ys=qLa<9nZVW<#sx92XLNI7BXo#uE+#tC89sr*Jf(8TXibcN{8#LrW1+{xP zkge5%a#8RJW;(ld$se?!rw>(L9V3?ZryF^h$&-Xc4 zn#Bgeig4`EDVplq$eC?A`s&;zw4fx;* zD2p5OoTmDXLoU5Kp}zH~JhS7O#P?t24MDNN_ms*i3Sq zJARohmrsv<9yY}}Fl1l#qhe4OW8)8)+A72gM{638;PD#xwlT-y>N+OoM;MtM{%D2P z=x@u^`J~YsYq7y%#BwszoVwW9!TY&U2B%+7TH(TCpC-}2ZevStYUO;x)y$je!EqaC vU+hy`Y{0((8oQ$vAIdUu@a4;WDm(d~Ny&QoBWxc?00000NkvXXu0mjf`uQqR literal 0 HcmV?d00001 diff --git a/modules/productcomments/img/star.gif b/modules/productcomments/img/star.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0948a70843bf01952d1f81dcfcdadc92976a04a GIT binary patch literal 815 zcmZ?wbhEHb6ksr5c*el6(A@m!(W5UnOP^`reSRqFN=wUy;^KSv?mbz*{y;*);~mc5 z-|RUW6m;#{wMW}bp6pHg_U+rN({8s`u6+0I-Q5+MAMeb%w`5!M# z{q=^=j}*N*e*EQepZ7;K-(U6l^W*)qy-uI5Mx04YJ9FmD@2@w0e|`3BzvYV!svmDJ zy1UBtA9dUx3IVz=bW<9TmSpMHPB|LHc1x92?H@6~*NPV?1P?R#4d zPbMV1-s|#ytJ9}D;U7+0e!n;8#jahi&$Zv4GUd&Fk1akv*Jf&ey1!wEi_7gU#eYv#yB=$CE4*Ha3+f942mV(XO4k$!yUkYI4!^v z(7()>%8M?Gl%7kx>Gn`^RAQF96>H~ zqm`q-QcY~aQ7_g~!8sNO9r=2u3Mlqi#CWtc9T(=ypIRf>c$iT@(<;xV@nLFbqN;ve z&H|wp@2R5NS2`L#KJ=KR(rKEJaLDyUmqb%cL}by=)-=YHmH-A@k7GPXma%d?aC*qL zh)X7I#x;cnUQ^jS^;|kOFmg@Nv0U}W!=<5%L(6DYL1B*CL?*3JjSUV#i&`dVbSiW! SUO9NY!6jXVS5kz7!5RQproductcomments_7c3b0e9898b88deee7ea75aafd2e37e2'] = 'Grado medio'; +$_MODULE['<{productcomments}prestashop>productcomments_b1897515d548a960afe49ecf66a29021'] = 'Media'; +$_MODULE['<{productcomments}prestashop>productcomments_5da618e8e4b89c66fe86e32cdafde142'] = 'Da'; +$_MODULE['<{productcomments}prestashop>productcomments_b78a3223503896721cca1303f776159b'] = 'Titolo'; +$_MODULE['<{productcomments}prestashop>productcomments_0be8406951cdfda82f00f79328cf4efc'] = 'Commenta'; +$_MODULE['<{productcomments}prestashop>productcomments_08621d00a3a801b9159a11b8bbd69f89'] = 'Non ci sono commenti dei clienti per il momento.'; +$_MODULE['<{productcomments}prestashop>productcomments_6d28f2900adb9e500868166f6d04da92'] = 'Si deve attendere'; +$_MODULE['<{productcomments}prestashop>productcomments_30b3dbf8b5c381c2e8d62189048ab37c'] = 'secondo/i prima di postare un nuovo commento'; +$_MODULE['<{productcomments}prestashop>productcomments_c3edcf2cedbd4ce230fd6d4ea8915718'] = 'Aggiungi un commento'; +$_MODULE['<{productcomments}prestashop>productcomments_a2ed44743411cf8b80e397448fce104c'] = 'Il tuo nome:'; +$_MODULE['<{productcomments}prestashop>productcomments_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Titolo:'; +$_MODULE['<{productcomments}prestashop>productcomments_240f3031f25601fa128bd4e15f0a37de'] = 'Commento:'; +$_MODULE['<{productcomments}prestashop>productcomments_94966d90747b97d1f0f206c98a8b1ac3'] = 'Invia'; +$_MODULE['<{productcomments}prestashop>productcomments_720fae7db6e6055d2b47890240bb3598'] = 'Solo gli utenti registrati possono inserire un nuovo commento.'; +$_MODULE['<{productcomments}prestashop>productcomments_b91c4e8b229a399a3bc911d352524a9b'] = 'Commenti prodotto'; +$_MODULE['<{productcomments}prestashop>productcomments_0c21532dfd3476791e5aab1aa7fa7405'] = 'Consenti agli utenti di inviare un commento su un prodotto'; +$_MODULE['<{productcomments}prestashop>productcomments_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Conferma'; +$_MODULE['<{productcomments}prestashop>productcomments_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{productcomments}prestashop>productcomments_1bb54e382f7dbdb260f0aa6b42bb624b'] = 'Criterio eliminato'; +$_MODULE['<{productcomments}prestashop>productcomments_e6ea19ae2eb9447f98c7ed74227bb4a3'] = 'Il campo Nome è obbligatorio almeno in'; +$_MODULE['<{productcomments}prestashop>productcomments_21b0922096daf5c742cc98986d857cc1'] = 'Criterio aggiornato'; +$_MODULE['<{productcomments}prestashop>productcomments_e140a9c4fcfa0aad7af83f65e577c287'] = 'Criterio aggiunto'; +$_MODULE['<{productcomments}prestashop>productcomments_254f642527b45bc260048e30704edb39'] = 'Configurazione'; +$_MODULE['<{productcomments}prestashop>productcomments_9ca2adc05abbe3cc0a659a16fd7d5edc'] = 'Tutti i commenti devono essere convalidati da un dipendente'; +$_MODULE['<{productcomments}prestashop>productcomments_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{productcomments}prestashop>productcomments_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{productcomments}prestashop>productcomments_66b06316f84eb73075bca0e27f2a5581'] = 'Permetti i commenti degli ospiti'; +$_MODULE['<{productcomments}prestashop>productcomments_2e53b6c4c0d39a73718342ab2366ae37'] = 'Tempo minimo tra 2 commenti dello stesso utente'; +$_MODULE['<{productcomments}prestashop>productcomments_783e8e29e6a8c3e22baa58a19420eb4f'] = 'secondi'; +$_MODULE['<{productcomments}prestashop>productcomments_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{productcomments}prestashop>productcomments_0a36c5f3ea6825804e6b4314c4084a12'] = 'Moderare i commenti'; +$_MODULE['<{productcomments}prestashop>productcomments_a517747c3d12f99244ae598910d979c5'] = 'Autore'; +$_MODULE['<{productcomments}prestashop>productcomments_df644ae155e79abf54175bd15d75f363'] = 'Nome del prodotto'; +$_MODULE['<{productcomments}prestashop>productcomments_06df33001c1d7187fdd81ea1f5b277aa'] = 'Azioni'; +$_MODULE['<{productcomments}prestashop>productcomments_c4408d335012a56ff58937d78050efad'] = 'Accettare'; +$_MODULE['<{productcomments}prestashop>productcomments_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{productcomments}prestashop>productcomments_8bf0c707232d63bf83b4b2467d2df41a'] = 'Selezione:'; +$_MODULE['<{productcomments}prestashop>productcomments_d00b7f656273a495f555bead0248d6f5'] = 'Non ci sono commenti da convalidare ora.'; +$_MODULE['<{productcomments}prestashop>productcomments_7799b301b44c329fc9ec6a3a9c1905e0'] = 'Aggiungi un nuovo criterio di commento'; +$_MODULE['<{productcomments}prestashop>productcomments_7753ab38f8e113e8af65ab1241331625'] = 'È possibile definire criteri diversi, al fine di aiutare i clienti durante la loro opinione. Per esempio: efficienza, leggerezza, design.'; +$_MODULE['<{productcomments}prestashop>productcomments_bc58d00e1e42de31a8e58f8dc7d9bdc7'] = 'È possibile aggiungere un nuovo criterio di seguito:'; +$_MODULE['<{productcomments}prestashop>productcomments_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{productcomments}prestashop>productcomments_f255b686708be7c5082cd3f5bab872c1'] = 'Applica a'; +$_MODULE['<{productcomments}prestashop>productcomments_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Attivo'; +$_MODULE['<{productcomments}prestashop>productcomments_f1d04e02f02d1f13450ae56f213a93f2'] = 'Modifica questo criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_9be4d6372a6487e90d8f153c66c1499d'] = 'Aggiungi questo criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_21a512e9d635e82fc7c7077fc880988b'] = 'Criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Tipo'; +$_MODULE['<{productcomments}prestashop>productcomments_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{productcomments}prestashop>productcomments_7dce122004969d56ae2e0245cb754d35'] = 'Modifica'; +$_MODULE['<{productcomments}prestashop>productcomments_8eb0b6ced310b120b12106e8d4bdbdb8'] = 'Gestire le applicazioni dei criteri'; +$_MODULE['<{productcomments}prestashop>productcomments_6556e73b0255c988d9fe70141f1d4bd9'] = 'Solo i criteri limitati a categorie o prodotti possono essere configurati qui sotto:'; +$_MODULE['<{productcomments}prestashop>productcomments_a942d4abf908e5f708ec4dfaa949065e'] = 'Scegli un criterio'; +$_MODULE['<{productcomments}prestashop>productcomments_068f80c7519d0528fb08e82137a72131'] = 'Prodotti'; +$_MODULE['<{productcomments}prestashop>productcomments_af1b98adf7f686b84cd0b443e022b7a0'] = 'Categorie'; +$_MODULE['<{productcomments}prestashop>productcomments_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{productcomments}prestashop>productcomments_b9aefa40a54680bb258f9f9569290fae'] = 'Nome del prodotto'; +$_MODULE['<{productcomments}prestashop>productcomments_99121ab27aaa7472cfada9071c5ba434'] = 'Nome categoria'; +$_MODULE['<{productcomments}prestashop>productcomments_fd4b5401d4d3c7d32d158bfc1e552f3b'] = 'Inserisci il tuo nome'; +$_MODULE['<{productcomments}prestashop>productcomments_7b2f2ea0f690ef3c2fc9bba0e4bfbc4c'] = 'E\' stato postato un commento non valido.'; +$_MODULE['<{productcomments}prestashop>productcomments_f88dc17737f7fdd4464b2eb922a8f133'] = 'Errore durante il salvataggio del tuo commento.'; +$_MODULE['<{productcomments}prestashop>productcomments_7fa4a3510dafd0eac6435c19861b2bb7'] = 'Commento pubblicato con successo.'; +$_MODULE['<{productcomments}prestashop>productcomments_f8694a9aae2eb045920f613cfa7f1235'] = 'In attesa della convalida moderatore.'; +$_MODULE['<{productcomments}prestashop>productcomments_6bf852d9850445291f5e9d4740ac7b50'] = 'Testo commento richiesto.'; +$_MODULE['<{productcomments}prestashop>productcomments_ba8d7ae5dcadfba739f28a777378f208'] = 'secondi prima di pubblicare un nuovo commento'; +$_MODULE['<{productcomments}prestashop>products-comparison_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Commenti'; +$_MODULE['<{productcomments}prestashop>products-comparison_b1897515d548a960afe49ecf66a29021'] = 'Media'; +$_MODULE['<{productcomments}prestashop>products-comparison_bc976f6c3405523cde61f63a7cbe224b'] = 'visualizzare i commenti'; +$_MODULE['<{productcomments}prestashop>tab_8413c683b4b27cc3f4dbd4c90329d8ba'] = 'Commenti'; + +?> \ No newline at end of file diff --git a/modules/productcomments/js/jquery.rating.pack.js b/modules/productcomments/js/jquery.rating.pack.js new file mode 100644 index 000000000..488c28bd8 --- /dev/null +++ b/modules/productcomments/js/jquery.rating.pack.js @@ -0,0 +1,12 @@ +/* + ### jQuery Star Rating Plugin v2.0 - 2008-03-12 ### + By Diego A, http://www.fyneworks.com, diego@fyneworks.com + - v2 by Keith Wood, kbwood@virginbroadband.com.au + + Project: http://plugins.jquery.com/project/MultipleFriendlyStarRating + Website: http://www.fyneworks.com/jquery/star-rating/ + + This is a modified version of the star rating plugin from: + http://www.phpletter.com/Demo/Jquery-Star-Rating-Plugin/ +*/ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';4(w)(3($){$.Y.T=3(c){c=$.15({m:\'X U\',E:\'\',B:z,8:z},c||{});o d={};o e={t:3(n,a,b){2.6(n);$(a).D(\'.j\').A().l(b||\'x\')},6:3(n){$(d[n].7).O(\'.j\').u(\'9\').u(\'x\')},h:3(n){4(!$(d[n].5).Z(\'.m\')){$(d[n].5).D(\'.j\').A().l(\'9\')}},g:3(n,a){d[n].5=a;o b=$(a).L(\'a\').K();$(d[n].7).J(b);e.6(n);e.h(n);4(c.I)c.I.W(d[n].7,[b,a])}};2.V(3(i){o n=2.G;4(!d[n])d[n]={r:0};i=d[n].r;d[n].r++;4(i==0){c.8=$(2).S(\'p\')||c.8;d[n].7=$(\'\');$(2).C(d[n].7);4(c.8||c.B){}F{$(2).C($(\'\'+c.E+\'\').H(3(){e.6(n);$(2).l(\'9\')}).v(3(){e.h(n);$(2).u(\'9\')}).g(3(){e.g(n,2)}))}};f=$(\'\'+2.q+\'\');$(2).N(f);4(c.8){$(f).l(\'M\')}F{$(f).H(3(){e.6(n);e.t(n,2)}).v(3(){e.6(n);e.h(n)}).g(3(){e.g(n,2)})};4(2.14)d[n].5=f;$(2).13();4(i+1==2.12)e.h(n)});11(n 10 d)4(d[n].5){e.t(n,d[n].5,\'9\');$(d[n].7).J($(d[n].5).L(\'a\').K())}16 2}})(w);',62,69,'||this|function|if|currentElem|drain|valueElem|readOnly|star_on||||||eStar|click|reset||star|div|addClass|cancel||var|disabled|value|count|title|fill|removeClass|mouseout|jQuery|star_hover|class|false|andSelf|required|before|prevAll|cancelValue|else|name|mouseover|callback|val|text|children|star_readonly|after|siblings|hidden|type|input|attr|rating|Rating|each|apply|Cancel|fn|is|in|for|length|remove|checked|extend|return'.split('|'),0,{})) \ No newline at end of file diff --git a/modules/productcomments/js/moderate.js b/modules/productcomments/js/moderate.js new file mode 100644 index 000000000..620d3e3fa --- /dev/null +++ b/modules/productcomments/js/moderate.js @@ -0,0 +1,77 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function getCommentForm() +{ + if (document.forms) + return (document.forms['comment_form']); + else + return (document.comment_form); +} + +function acceptComment(id) +{ + var form = getCommentForm(); + if (id) + form.elements['id_product_comment'].value = id; + form.elements['action'].value = 'accept'; + form.submit(); +} + + +function deleteComment(id) +{ + var form = getCommentForm(); + if (id) + form.elements['id_product_comment'].value = id; + form.elements['action'].value = 'delete'; + form.submit(); +} + +function getCriterionForm() +{ + if (document.forms) + return (document.forms['criterion_form']); + else + return (document.criterion_form); +} + +function editCriterion(id) +{ + var form = getCriterionForm(); + form.elements['id_product_comment_criterion'].value = id; + form.elements['criterion_name'].value = document.getElementById('criterion_name_' + id).value; + form.elements['criterion_action'].value = 'edit'; + form.submit(); +} + +function deleteCriterion(id) +{ + var form = getCriterionForm(); + form.elements['id_product_comment_criterion'].value = id; + form.elements['criterion_action'].value = 'delete'; + form.submit(); +} diff --git a/modules/productcomments/js/productCriterion.js b/modules/productcomments/js/productCriterion.js new file mode 100644 index 000000000..afb66af86 --- /dev/null +++ b/modules/productcomments/js/productCriterion.js @@ -0,0 +1,41 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function getProductCriterionForm() +{ + if (document.forms) + return (document.forms['product_criterion_form']); + else + return (document.product_criterion_form); +} + +function getProductCriterion(path, id_product, id_lang) +{ + $.get(path + 'productcommentscriterion.php', { id_product: id_product, id_lang: id_lang }, + function(data){ + document.getElementById('product_criterions').innerHTML = data; + }); +} diff --git a/modules/productcomments/js/products-comparison.js b/modules/productcomments/js/products-comparison.js new file mode 100755 index 000000000..95ee980cf --- /dev/null +++ b/modules/productcomments/js/products-comparison.js @@ -0,0 +1,46 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$(function () { + $('a.cluetip') + .cluetip({ + local:true, + cursor: 'pointer', + cluetipClass: 'comparison_comments', + dropShadow: false, + dropShadowSteps: 0, + showTitle: false, + tracking: true, + sticky: false, + mouseOutClose: true, + width: 450, + fx: { + open: 'fadeIn', + openSpeed: 'fast' + } + }) + .css('opacity', 0.8); +}); diff --git a/modules/productcomments/logo.gif b/modules/productcomments/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..39433cf78a3e9869f24b0a95f04b1819391596e8 GIT binary patch literal 557 zcmV+|0@D47P)kO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P literal 0 HcmV?d00001 diff --git a/modules/productcomments/productcomments.php b/modules/productcomments/productcomments.php new file mode 100644 index 000000000..b341089b9 --- /dev/null +++ b/modules/productcomments/productcomments.php @@ -0,0 +1,638 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class ProductComments extends Module +{ + const INSTALL_SQL_FILE = 'install.sql'; + + private $_html = ''; + private $_postErrors = array(); + + private $_productCommentsCriterionTypes = array(); + private $_baseUrl; + + public function __construct() + { + $this->name = 'productcomments'; + $this->tab = 'front_office_features'; + $this->version = '2.1'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Product Comments'); + $this->description = $this->l('Allow users to post comment about a product.'); + } + + public function install() + { + if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return false; + elseif (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) + return false; + $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); + $sql = preg_split("/;\s*[\r\n]+/", trim($sql)); + + foreach ($sql AS $query) + if (!Db::getInstance()->Execute(trim($query))) + return false; + if (parent::install() == false OR $this->registerHook('productTab') == false + OR $this->registerHook('extraProductComparison') == false OR $this->registerHook('productTabContent') == false + OR $this->registerHook('header') == false OR !Configuration::updateValue('PRODUCT_COMMENTS_MINIMAL_TIME', 30) + OR !Configuration::updateValue('PRODUCT_COMMENTS_ALLOW_GUESTS', 0) + OR !Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', 1)) + return false; + return true; + } + + function uninstall() + { + if (!parent::uninstall() OR !Configuration::deleteByName('PRODUCT_COMMENTS_MODERATE') OR !Configuration::deleteByName('PRODUCT_COMMENTS_ALLOW_GUESTS') OR !Configuration::deleteByName('PRODUCT_COMMENTS_MINIMAL_TIME')) + return false; + return true; + } + + protected function _postProcess() + { + if (Tools::isSubmit('submitModerate')) + { + Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', (int)Tools::getValue('moderate')); + Configuration::updateValue('PRODUCT_COMMENTS_ALLOW_GUESTS', (int)Tools::getValue('allow_guest')); + Configuration::updateValue('PRODUCT_COMMENTS_MINIMAL_TIME', (int)Tools::getValue('product_comments_minimal_time')); + $this->_html .= '
    '.$this->l('Confirmation').''.$this->l('Settings updated').'
    '; + } + if ($id_criterion = (int)Tools::getValue('deleteCriterion')) + { + $productCommentCriterion = new ProductCommentCriterion((int)$id_criterion); + if ($productCommentCriterion->id) + if ($productCommentCriterion->delete()) + $this->_html .= '
    '.$this->l('Confirmation').''.$this->l('Criterion deleted').'
    '; + } + } + + public function getContent() + { + include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + + $this->_setBaseUrl(); + $this->_productCommentsCriterionTypes = ProductCommentCriterion::getTypes(); + $this->_html = '

    '.$this->displayName.'

    '; + $this->_postProcess(); + $this->_checkModerateComment(); + $this->_checkCriterion(); + $this->_updateApplicationCriterion(); + + return $this->_html.$this->_displayForm(); + } + + private function _setBaseUrl() + { + $this->_baseUrl = 'index.php?'; + foreach ($_GET AS $k => $value) + if (!in_array($k, array('deleteCriterion', 'editCriterion'))) + $this->_baseUrl .= $k.'='.$value.'&'; + $this->_baseUrl = rtrim($this->_baseUrl, '&'); + } + + private function _checkModerateComment() + { + $action = Tools::getValue('action'); + if (empty($action) === false && + (int)(Configuration::get('PRODUCT_COMMENTS_MODERATE'))) + { + $product_comments = Tools::getValue('id_product_comment'); + if (sizeof($product_comments)) + { + require_once(dirname(__FILE__).'/ProductComment.php'); + switch ($action) + { + case 'accept': + foreach ($product_comments AS $id_product_comment) + { + if (!$id_product_comment) + continue; + $comment = new ProductComment((int)$id_product_comment); + $comment->validate(); + } + break; + case 'delete': + foreach ($product_comments AS $id_product_comment) + { + if (!$id_product_comment) + continue; + $comment = new ProductComment((int)$id_product_comment); + $comment->delete(); + ProductComment::deleteGrades((int)$id_product_comment); + } + break; + default: + ; + } + } + } + } + private function _checkCriterion() + { + $action_criterion = Tools::getValue('criterion_action'); + $name = Tools::getValue('criterion'); + if (Tools::isSubmit('submitAddCriterion')) + { + global $cookie; + require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + $languages = Language::getLanguages(); + $id_criterion = (int)Tools::getValue('id_product_comment_criterion'); + $productCommentCriterion = new ProductCommentCriterion((int)$id_criterion); + foreach ($languages AS $lang) + $productCommentCriterion->name[(int)$lang['id_lang']] = Tools::getValue('criterion_'.(int)$lang['id_lang']); + + // Check default language criterion name + $defaultLanguage = new Language((int)(Configuration::get('PS_LANG_DEFAULT'))); + if (!Tools::getValue('criterion_'.$defaultLanguage->id)) + { + $this->_html .= '
    '.$this->l('The field Name is required at least in').' '.$defaultLanguage->name.'
    '; + return; + } + + $productCommentCriterion->id_product_comment_criterion_type = (int)Tools::getValue('criterion_type'); + $productCommentCriterion->active = (int)Tools::getValue('criterion_active'); + + if ($productCommentCriterion->save()) + $this->_html .= '
    '.$this->l('Confirmation').''.(Tools::getValue('editCriterion') ? $this->l('Criterion updated') : $this->l('Criterion added')).'
    '; + } + elseif (!empty($action_criterion) AND empty($name)) + { + $id_product_comment_criterion = Tools::getValue('id_product_comment_criterion'); + require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + switch ($action_criterion) + { + case 'edit': + ProductCommentCriterion::update($id_product_comment_criterion, + Tools::getValue('criterion_id_lang'), + Tools::getValue('criterion_name')); + break; + case 'delete': + ProductCommentCriterion::delete($id_product_comment_criterion); + break; + default: + ; + } + } + } + + private function _updateApplicationCriterion() + { + if (Tools::isSubmit('submitApplicationCriterion')) + { + include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + + $id_criterion = (int)Tools::getValue('id_criterion'); + $productCommentCriterion = new ProductCommentCriterion((int)$id_criterion); + if ($productCommentCriterion->id) + { + if ($productCommentCriterion->id_product_comment_criterion_type == 2) + { + $productCommentCriterion->deleteCategories(); + if ($categories = Tools::getValue('id_product')) + if (sizeof($categories)) + foreach ($categories AS $id_category) + $productCommentCriterion->addCategory((int)$id_category); + } + elseif ($productCommentCriterion->id_product_comment_criterion_type == 3) + { + $productCommentCriterion->deleteProducts(); + if ($products = Tools::getValue('id_product')) + if (sizeof($products)) + foreach ($products AS $product) + $productCommentCriterion->addProduct((int)$product); + } + } + + $this->_html .= '
    '.$this->l('Confirmation').''.$this->l('Settings updated').'
    '; + } + } + + private function _displayForm() + { + $this->_displayFormModerate(); + $this->_displayFormConfigurationCriterion(); + $this->_displayFormApplicationCriterion(); + return $this->_html; + } + + private function _displayFormModerate() + { + $this->_html = ' +
    + '.$this->l('Configuration').' +
    + +
    + + + + +
    +
    + +
    + + + + +
    +
    + +
    + '.$this->l('seconds').' +
    +
    +
    + +
    +
    +
    +
    +
    + '.$this->l('Moderate Comments').''; + if (Configuration::get('PRODUCT_COMMENTS_MODERATE')) + { + require_once(dirname(__FILE__).'/ProductComment.php'); + $comments = ProductComment::getByValidate(); + if (sizeof($comments)) + { + $this->_html .= ' +
    + + +
    + + + + + + + + + + '; + foreach ($comments AS $comment) + $this->_html .= ' + + + + + + '; + $this->_html .= ' + + + + + +
    '.$this->l('Author').''.$this->l('Comment').''.$this->l('Product name').''.$this->l('Actions').'
    '.htmlspecialchars($comment['customer_name'], ENT_COMPAT, 'UTF-8').'.'.htmlspecialchars($comment['content'], ENT_COMPAT, 'UTF-8').''.$comment['id_product'].' - '.htmlspecialchars($comment['name'], ENT_COMPAT, 'UTF-8').''.$this->l('Accept').' + '.$this->l('Delete').'
    '.$this->l('Selection:').''.$this->l('Accept').' + '.$this->l('Delete').'
    +
    '; + } + else + $this->_html .= $this->l('No comments to validate at this time.'); + } + $this->_html .= '

    '; + } + + private function _displayFormConfigurationCriterion() + { + global $cookie; + + $langs = Language::getLanguages(false); + $id_lang_default = (int)Configuration::get('PS_LANG_DEFAULT'); + + $id_criterion = (int)Tools::getValue('editCriterion'); + $criterion = new ProductCommentCriterion((int)$id_criterion); + $languageIds = 'criterion'; + $this->_html .= ' +
    + '.$this->l('Add a new comment criterion').' +

    '.$this->l('You can define several criterions to help your customers during their review. For instance: efficiency, lightness, design.').'
    +
    '.$this->l('You can add a new criterion below:').'

    +
    + +
    + '; + foreach ($langs AS $lang) + $this->_html .= ' +
    + +
    '; + $this->_html .= $this->displayFlags($langs, (int)$id_lang_default, $languageIds, 'criterion', true); + $this->_html .= ' +
    +
     
    + +
    + +
    + +
    + active ? 'checked="checked" ' : '').'/> + + active ? 'checked="checked" ' : '').'/> + +
    +
    + +
    +
    '; + require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + $criterions = ProductCommentCriterion::getCriterions((int)$cookie->id_lang); + if (sizeof($criterions)) + { + $this->_html.= '
    + + + + + + + + + + '; + + foreach ($criterions AS $criterion) + { + $this->_html .= ' + + + + '; + } + $this->_html .= '
    '.$this->l('Criterion').''.$this->l('Type').''.$this->l('Status').''.$this->l('Actions').'
    '.$criterion['name'].''.$this->_productCommentsCriterionTypes[(int)$criterion['id_product_comment_criterion_type']].''.$this->l('Edit').' + '.$this->l('Delete').'
    '; + } + $this->_html .= '

    '; + } + + private function _displayFormApplicationCriterion() + { + global $cookie; + + include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + + $criterions = ProductCommentCriterion::getCriterions((int)$cookie->id_lang, false, true); + $id_criterion = (int)Tools::getValue('updateCriterion'); + + if ($id_criterion) + { + $criterion = new ProductCommentCriterion((int)$id_criterion); + if ($criterion->id_product_comment_criterion_type == 2) + { + $categories = Category::getSimpleCategories((int)$cookie->id_lang); + $criterion_categories = $criterion->getCategories(); + } + elseif ($criterion->id_product_comment_criterion_type == 3) + { + $criterion_products = $criterion->getProducts(); + $products = Product::getSimpleProducts((int)$cookie->id_lang); + } + } + + foreach ($criterions AS $key => $foo) + if ($foo['id_product_comment_criterion_type'] == 1) + unset($criterions[$key]); + + if (sizeof($criterions)) + { + $this->_html .= ' +
    + '.$this->l('Manage criterions scope').' +

    '.$this->l('Only criterions restricted to categories or products can be configured below:').'

    +
    + +
    + +
    +
    '; + + if ($id_criterion AND $criterion->id_product_comment_criterion_type != 1) + { + $this->_html .=' +
    +
    + +
    + + + + + + + + '; + + if ($criterion->id_product_comment_criterion_type == 3) + foreach ($products AS $product) + $this->_html .=' + '; + elseif ($criterion->id_product_comment_criterion_type == 2) + foreach ($categories AS $category) + $this->_html .=' + '; + $this->_html .=' +
    '.$this->l('ID').''.($criterion->id_product_comment_criterion_type == 3 ? $this->l('Product Name') : $this->l('Category Name')).'
    '.(int)$product['id_product'].''.$product['name'].'
    '.(int)$category['id_category'].''.$category['name'].'
    +
    +
    + +
    +
    '; + } + + $this->_html .= '
    '; + } + } + + public function hookProductTab($params) + { + global $smarty, $cookie; + + require_once(dirname(__FILE__).'/ProductComment.php'); + require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + + $smarty->assign(array( + 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), + 'comments' => ProductComment::getByProduct((int)($_GET['id_product'])), + 'criterions' => ProductCommentCriterion::getByProduct((int)($_GET['id_product']), (int)($cookie->id_lang)), + 'nbComments' => (int)(ProductComment::getCommentNumber((int)($_GET['id_product']))))); + + return ($this->display(__FILE__, '/tab.tpl')); + } + + private function _frontOfficePostProcess() + { + global $smarty, $cookie, $errors; + + require_once(dirname(__FILE__).'/ProductComment.php'); + require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + + $allow_guests = (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'); + if (Tools::isSubmit('submitMessage') AND (empty($cookie->id_customer) === false OR ($cookie->id_guest AND $allow_guests))) + { + $id_guest = (!$id_customer = (int)$cookie->id_customer) ? (int)$cookie->id_guest : false; + $customerComment = ProductComment::getByCustomer((int)(Tools::getValue('id_product')), (int)$cookie->id_customer, true, (int)$id_guest); + + if (!$customerComment OR ($customerComment AND (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) < time())) + { + $customer_name = false; + if ($id_guest AND (!$customer_name = Tools::getValue('customer_name'))) + $errors[] = $this->l('Please fill your name'); + if (!sizeof($errors) AND Tools::getValue('content')) + { + $comment = new ProductComment(); + $comment->content = strip_tags(Tools::getValue('content')); + $comment->id_product = (int)$_GET['id_product']; + $comment->id_customer = (int)$cookie->id_customer; + $comment->id_guest = (int)$id_guest; + $comment->customer_name = pSQL($customer_name); + $comment->title = pSQL(Tools::getValue('title')); + $comment->grade = 0; + $comment->validate = 0; + + if (!$comment->content) + $errors[] = $this->l('Invalid comment text posted.'); + else + { + $comment->save(); + for ($i = 1, $grade = 0; isset($_POST[$i.'_grade']) === true; ++$i) + { + $cgrade = (int)Tools::getValue($i.'_grade'); + $grade += $cgrade; + $productCommentCriterion = new ProductCommentCriterion((int)Tools::getValue('id_product_comment_criterion_'.$i)); + if ($productCommentCriterion->id) + $productCommentCriterion->addGrade($comment->id, $cgrade); + } + if (($i - 1) > 0) + $comment->grade = ($grade / ($i - 1)); + if (!$comment->save()) + $errors[] = $this->l('An error occurred while saving your comment.'); + else + $smarty->assign('confirmation', $this->l('Comment posted.').((int)(Configuration::get('PRODUCT_COMMENTS_MODERATE')) ? ' '.$this->l('Awaiting moderator validation.') : '')); + } + } + else + $errors[] = $this->l('Comment text is required.'); + } + else + $errors[] = $this->l('You should wait').' '.Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME').' '.$this->l('seconds before posting a new comment'); + } + } + + public function hookProductTabContent($params) + { + global $smarty, $cookie; + + $id_guest = (!$id_customer = (int)$cookie->id_customer) ? (int)$cookie->id_guest : false; + $customerComment = ProductComment::getByCustomer((int)(Tools::getValue('id_product')), (int)$cookie->id_customer, true, (int)$id_guest); + + $averages = ProductComment::getAveragesByProduct((int)Tools::getValue('id_product'), (int)$cookie->id_lang); + $averageTotal = 0; + foreach ($averages AS $average) + $averageTotal += (float)($average); + $averageTotal = count($averages) ? ($averageTotal / count($averages)) : 0; + + $smarty->assign(array( + 'logged' => (int)$cookie->id_customer, + 'action_url' => '', + 'comments' => ProductComment::getByProduct((int)Tools::getValue('id_product')), + 'criterions' => ProductCommentCriterion::getByProduct((int)Tools::getValue('id_product'), (int)$cookie->id_lang), + 'averages' => $averages, + 'product_comment_path' => $this->_path, + 'averageTotal' => $averageTotal, + 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), + 'too_early' => ($customerComment AND (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) > time()), + 'delay' => Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME'))); + + $controller = new FrontController(); + $controller->pagination((int)ProductComment::getCommentNumber((int)Tools::getValue('id_product'))); + + return ($this->display(__FILE__, '/productcomments.tpl')); + } + + public function hookHeader() + { + $this->_frontOfficePostProcess(); + } + + public function hookExtraProductComparison($params) + { + global $smarty, $cookie; + + $list_grades = array(); + $list_product_grades = array(); + $list_product_average = array(); + $list_product_comment = array(); + + foreach ($params['list_ids_product'] AS $id_product) + { + $grades = ProductComment::getAveragesByProduct((int)$id_product, (int)$cookie->id_lang); + $criterions = ProductCommentCriterion::getByProduct((int)$id_product, (int)$cookie->id_lang); + $grade_total = 0; + if (sizeof($grades) > 0) + { + foreach ($criterions AS $criterion) + { + $list_product_grades[$criterion['id_product_comment_criterion']][$id_product] = $grades[$criterion['id_product_comment_criterion']]; + $grade_total += (float)($grades[$criterion['id_product_comment_criterion']]); + + if (!array_key_exists($criterion['id_product_comment_criterion'], $list_grades)) + $list_grades[$criterion['id_product_comment_criterion']] = $criterion['name']; + } + + $list_product_average[$id_product] = $grade_total / sizeof($criterion); + $list_product_comment[$id_product] = ProductComment::getByProduct($id_product, 0, 3); + } + } + + if (sizeof($list_grades) < 1) + return false; + + $smarty->assign(array('grades' => $list_grades, 'product_grades' => $list_product_grades, 'list_ids_product' => $params['list_ids_product'], + 'list_product_average' => $list_product_average, 'product_comments' => $list_product_comment)); + + return $this->display(__FILE__,'/products-comparison.tpl'); + } +} diff --git a/modules/productcomments/productcomments.tpl b/modules/productcomments/productcomments.tpl new file mode 100644 index 000000000..c89815168 --- /dev/null +++ b/modules/productcomments/productcomments.tpl @@ -0,0 +1,137 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
    + + +{if $comments} + {if $criterions|@count > 0} +

    {l s='Average grade' mod='productcomments'}

    +
    + {l s='Average' mod='productcomments'}:
    + {section loop=6 step=1 start=1 name=average} + + {/section} +
    +
    + {foreach from=$criterions item=c} +
    + {$c.name|escape:'html':'UTF-8'}
    + {section loop=6 step=1 start=1 name=average} + + {/section} +
    + {/foreach} +
    + {/if} +
    + + + + + + + + + + {foreach from=$comments item=comment} + {if $comment.content} + + + + + + {/if} + {/foreach} + +
    {l s='From' mod='productcomments'}{l s='Title' mod='productcomments'}{l s='Comment' mod='productcomments'}
    + {dateFormat date=$comment.date_add|escape:'html':'UTF-8' full=0} + {$comment.customer_name|escape:'html':'UTF-8'}. + + {$comment.title} + + {$comment.content|escape:'html':'UTF-8'|nl2br} +
    +
    +{else} +

    {l s='No customer comments for the moment.' mod='productcomments'}

    +{/if} + +{if $too_early == true} +

    {l s='You should wait' mod='productcomments'} {$delay} {l s='second(s) before posting a new comment' mod='productcomments'}

    +{elseif $cookie->isLogged() == true || $allow_guests == true} +

    + +{else} +

    {l s='Only registered users can post a new comment.' mod='productcomments'}

    +{/if} +
    \ No newline at end of file diff --git a/modules/productcomments/productcommentscriterion.php b/modules/productcomments/productcommentscriterion.php new file mode 100644 index 000000000..5a26ba39f --- /dev/null +++ b/modules/productcomments/productcommentscriterion.php @@ -0,0 +1,52 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../classes/Validate.php'); +require_once(dirname(__FILE__).'/../../classes/Db.php'); +require_once(dirname(__FILE__).'/../../classes/Tools.php'); +require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); + +if (empty($_GET['id_lang']) === false && + isset($_GET['id_product']) === true) +{ + $criterions = ProductCommentCriterion::get($_GET['id_lang']); + if ((int)($_GET['id_product'])) + $selects = ProductCommentCriterion::getByProduct($_GET['id_product'], $_GET['id_lang']); + echo ''; +} \ No newline at end of file diff --git a/modules/productcomments/products-comparison.tpl b/modules/productcomments/products-comparison.tpl new file mode 100755 index 000000000..4005e022b --- /dev/null +++ b/modules/productcomments/products-comparison.tpl @@ -0,0 +1,116 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + + + + + {l s='Comments' mod='productcomments'} + + {section loop=$list_ids_product|count step=1 start=0 name=td} + + {/section} + + +{foreach from=$grades item=grade key=grade_id} + + {cycle values='comparison_feature_odd,comparison_feature_even' assign='classname'} + + {$grade} + + + {foreach from=$list_ids_product item=id_product} + {assign var='tab_grade' value=$product_grades[$grade_id]} + + {if isset($tab_grade[$id_product]) AND $tab_grade[$id_product]} + {section loop=6 step=1 start=1 name=average} + + {/section} + {else} + - + {/if} + + {/foreach} + +{/foreach} + + {cycle values='comparison_feature_odd,comparison_feature_even' assign='classname'} + + {l s='Average' mod='productcomments'} +{foreach from=$list_ids_product item=id_product} + + {if isset($list_product_average[$id_product]) AND $list_product_average[$id_product]} + {section loop=6 step=1 start=1 name=average} + + {/section} + {else} + - + {/if} + +{/foreach} + + + +   + {foreach from=$list_ids_product item=id_product} + + {if isset($product_comments[$id_product]) AND $product_comments[$id_product]} + {l s='view comments' mod='productcomments'} + + {else} + - + {/if} + +{/foreach} + \ No newline at end of file diff --git a/modules/productcomments/tab.tpl b/modules/productcomments/tab.tpl new file mode 100644 index 000000000..fda062f4d --- /dev/null +++ b/modules/productcomments/tab.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
  • {l s='Comments' mod='productcomments'} ({$nbComments})
  • \ No newline at end of file diff --git a/modules/productscategory/config.xml b/modules/productscategory/config.xml new file mode 100755 index 000000000..62f724fc0 --- /dev/null +++ b/modules/productscategory/config.xml @@ -0,0 +1,12 @@ + + + productscategory + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/productscategory/de.php b/modules/productscategory/de.php new file mode 100644 index 000000000..abd30b45e --- /dev/null +++ b/modules/productscategory/de.php @@ -0,0 +1,19 @@ +productscategory_4aae87211f77aada2c87907121576cfe'] = 'andere Produkte der gleichen Kategorie:'; +$_MODULE['<{productscategory}prestashop>productscategory_dd1f775e443ff3b9a89270713580a51b'] = 'Zurück'; +$_MODULE['<{productscategory}prestashop>productscategory_4351cfebe4b61d8aa5efa1d020710005'] = 'Anzeigen'; +$_MODULE['<{productscategory}prestashop>productscategory_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Weiter'; +$_MODULE['<{productscategory}prestashop>productscategory_db33983df8ef521000b0ab60dcb5a83f'] = 'Produktkategorie'; +$_MODULE['<{productscategory}prestashop>productscategory_0157084bddd8b408e1cdaba00f54a009'] = 'Zeigt Produkte der gleichen Kategorie auf der Produktseite an'; +$_MODULE['<{productscategory}prestashop>productscategory_462390017ab0938911d2d4e964c0cab7'] = 'Einstellungen erfolgreich aktualisiert'; +$_MODULE['<{productscategory}prestashop>productscategory_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{productscategory}prestashop>productscategory_b6bf131edd323320bac67303a3f4de8a'] = 'Preis auf Produkten anzeigen '; +$_MODULE['<{productscategory}prestashop>productscategory_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{productscategory}prestashop>productscategory_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{productscategory}prestashop>productscategory_70f9a895dc3273d34a7f6d14642708ec'] = 'Preise auf den Produkten im Block anzeigen.'; +$_MODULE['<{productscategory}prestashop>productscategory_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; + +?> \ No newline at end of file diff --git a/modules/productscategory/en.php b/modules/productscategory/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/productscategory/en.php @@ -0,0 +1,4 @@ +productscategory_db33983df8ef521000b0ab60dcb5a83f'] = 'Categoría de productos'; +$_MODULE['<{productscategory}prestashop>productscategory_0157084bddd8b408e1cdaba00f54a009'] = 'Mostrar productos de la misma categoría en la página producto'; +$_MODULE['<{productscategory}prestashop>productscategory_462390017ab0938911d2d4e964c0cab7'] = 'Parámetros actualizados con éxito'; +$_MODULE['<{productscategory}prestashop>productscategory_f4f70727dc34561dfde1a3c529b6205c'] = 'Parámetros'; +$_MODULE['<{productscategory}prestashop>productscategory_b6bf131edd323320bac67303a3f4de8a'] = 'Mostrar el precio del producto'; +$_MODULE['<{productscategory}prestashop>productscategory_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{productscategory}prestashop>productscategory_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{productscategory}prestashop>productscategory_70f9a895dc3273d34a7f6d14642708ec'] = 'Mostrar el precio del producto en el bloque'; +$_MODULE['<{productscategory}prestashop>productscategory_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{productscategory}prestashop>productscategory_4aae87211f77aada2c87907121576cfe'] = 'otros productos de la misma categoría:'; +$_MODULE['<{productscategory}prestashop>productscategory_dd1f775e443ff3b9a89270713580a51b'] = 'Anterior'; +$_MODULE['<{productscategory}prestashop>productscategory_4351cfebe4b61d8aa5efa1d020710005'] = 'Ver'; +$_MODULE['<{productscategory}prestashop>productscategory_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Siguiente'; diff --git a/modules/productscategory/fr.php b/modules/productscategory/fr.php new file mode 100644 index 000000000..e574054d6 --- /dev/null +++ b/modules/productscategory/fr.php @@ -0,0 +1,17 @@ +productscategory_db33983df8ef521000b0ab60dcb5a83f'] = 'Dans la même catégorie'; +$_MODULE['<{productscategory}prestashop>productscategory_0157084bddd8b408e1cdaba00f54a009'] = 'Affiche la liste des produits dans la même catégorie que celui affiché'; +$_MODULE['<{productscategory}prestashop>productscategory_462390017ab0938911d2d4e964c0cab7'] = 'Paramètres mis à jour avec succès'; +$_MODULE['<{productscategory}prestashop>productscategory_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{productscategory}prestashop>productscategory_b6bf131edd323320bac67303a3f4de8a'] = 'Afficher le prix du produit'; +$_MODULE['<{productscategory}prestashop>productscategory_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{productscategory}prestashop>productscategory_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{productscategory}prestashop>productscategory_70f9a895dc3273d34a7f6d14642708ec'] = 'Afficher le prix du produit dans le block'; +$_MODULE['<{productscategory}prestashop>productscategory_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{productscategory}prestashop>productscategory_4aae87211f77aada2c87907121576cfe'] = 'autres produits dans la même catégorie :'; +$_MODULE['<{productscategory}prestashop>productscategory_dd1f775e443ff3b9a89270713580a51b'] = 'Précédent'; +$_MODULE['<{productscategory}prestashop>productscategory_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{productscategory}prestashop>productscategory_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Suivant'; diff --git a/modules/productscategory/img/thumbs_left.gif b/modules/productscategory/img/thumbs_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..2830a5fc8fe7f8ed6e754fe6324c236d2362b76d GIT binary patch literal 201 zcmZ?wbhEHb#mkp3|NHmv+O=ypZ{ECp`}VJ2zwX|>`~Uxc25dm_ zCkrD3g9L*PND^cx1FM^YTHlN>6BbR0SdkL*MnhLr$2vsT`^c2rlbnw%pB$rbcs{G3 qgHU2)TF~+ai>WglQ?gDQ%`@a#&?w8OWhL_9k}4-hV!0va8l^XJch{P^+n=g%iko_ziK z_3G8D4VjryY}zjzsr{|U%Ytn{Q2`|&z}AM{rms_{~2%t#h)yU3=Con zIv^z=I~iD=6c{2?GDFX0%nMmOP1KZA-`exA^nJm_?I284@;~5Z4J@qc!=!siuJS&J5N7EjL_V literal 0 HcmV?d00001 diff --git a/modules/productscategory/it.php b/modules/productscategory/it.php new file mode 100644 index 000000000..31082cf23 --- /dev/null +++ b/modules/productscategory/it.php @@ -0,0 +1,19 @@ +productscategory_4aae87211f77aada2c87907121576cfe'] = 'altri prodotti della stessa categoria:'; +$_MODULE['<{productscategory}prestashop>productscategory_dd1f775e443ff3b9a89270713580a51b'] = 'Precedente'; +$_MODULE['<{productscategory}prestashop>productscategory_4351cfebe4b61d8aa5efa1d020710005'] = 'Visualizza'; +$_MODULE['<{productscategory}prestashop>productscategory_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Successivo'; +$_MODULE['<{productscategory}prestashop>productscategory_db33983df8ef521000b0ab60dcb5a83f'] = 'Categoria prodotti'; +$_MODULE['<{productscategory}prestashop>productscategory_0157084bddd8b408e1cdaba00f54a009'] = 'Visualizza i prodotti della stessa categoria sulla pagina del prodotto'; +$_MODULE['<{productscategory}prestashop>productscategory_462390017ab0938911d2d4e964c0cab7'] = 'Impostazioni aggiornate con successo'; +$_MODULE['<{productscategory}prestashop>productscategory_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{productscategory}prestashop>productscategory_b6bf131edd323320bac67303a3f4de8a'] = 'Mostra prezzo sui prodotti'; +$_MODULE['<{productscategory}prestashop>productscategory_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{productscategory}prestashop>productscategory_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{productscategory}prestashop>productscategory_70f9a895dc3273d34a7f6d14642708ec'] = 'Mostra il prezzo sui prodotti nel blocco.'; +$_MODULE['<{productscategory}prestashop>productscategory_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; + +?> \ No newline at end of file diff --git a/modules/productscategory/logo.gif b/modules/productscategory/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8d62638a65520d58e2125ce4e69e66ff9b47f15 GIT binary patch literal 1071 zcmd_p?N1YT0KoBEth2hgfmt?Rkgd)Q(TFjDR+KmG(3Wl^3fAbHLMv@DkSw7z8<@_v zY&;}m7zBnf%b+}zP^!eiB4SJim<^FZS&Ou1cecT0s8uY>r$uwqpMQ`Ed-p{`7J6S!TG7O%p9XelUR~h>*Tp2!db)eMfC^I^~G81@Wh>L_@MO*6U*`DZOxJ7+`u8Dp{%~}*^2vM`a2^GV z`RGCg<~okK6dUu+sIv-lE75=S_>+^sRp;;ld|8Drp9O9cShB?29U};_v^+<6FJjA$ z1YAx$)nT62I{}9DRblYYqpL|0(UZtGW5E>eYsa7dIu_yxq>c0&38ce^Al_#y_`icx zz(TDw5dLmz^+z(`po6WU;36Grqn~#s)_zHZt%-0y8Gb~sPcackC_;uJ6cZf{Makz; za%}@$-$2>ey%#ZZEk;G+)H+H

    PBBUIOYRpjj}R1T!p{ivlVNXcS;c%n2|I#VLSO z7*4U|8j}EQBF-jImH{k-r5KcBVkri2NsLXVxFpFXDLzT?DUwgo9GBu>;dp-2|Ghn2 zdVyZ2G3d0SZz~L6i4@ABQ_!A-;I$nP4;_Rydo>Cqq#%BK2E9< +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function pc_serialScrollFixLock(event, targeted, scrolled, items, position) +{ + var leftArrow = position == 0 ? true : false; + var rightArrow = position + 5 >= $('#productscategory_list li:visible').length ? true : false; + + $('a#productscategory_scroll_left').css('cursor', leftArrow ? 'default' : 'pointer').fadeTo(0, leftArrow ? 0 : 1); + $('a#productscategory_scroll_right').css('cursor', rightArrow ? 'default' : 'pointer').fadeTo(0, rightArrow ? 0 : 1).css('display', rightArrow ? 'none' : 'block'); + + return true; +} + +$(document).ready(function() +{ + $('#productscategory_list').serialScroll({ + items: 'li', + prev: 'a#productscategory_scroll_left', + next: 'a#productscategory_scroll_right', + axis: 'x', + offset: 0, + stop: true, + onBefore: pc_serialScrollFixLock, + duration: 300, + step: 1, + lazy: true, + lock: false, + force: false, + cycle: false }); + $('#productscategory_list').trigger( 'goto', 0); +}); \ No newline at end of file diff --git a/modules/productscategory/productscategory.php b/modules/productscategory/productscategory.php new file mode 100644 index 000000000..57ee2224b --- /dev/null +++ b/modules/productscategory/productscategory.php @@ -0,0 +1,182 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class productsCategory extends Module +{ + private $_html; + + public function __construct() + { + $this->name = 'productscategory'; + $this->version = '1.3'; + $this->author = 'PrestaShop'; + $this->tab = 'front_office_features'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Products Category'); + $this->description = $this->l('Display products of the same category on the product page.'); + + if (!$this->isRegisteredInHook('header')) + $this->registerHook('header'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('productfooter') OR !$this->registerHook('header') OR !Configuration::updateValue('PRODUCTSCATEGORY_DISPLAY_PRICE', 0)) + return false; + return true; + } + + public function uninstall() + { + if (!parent::uninstall() OR !Configuration::deleteByName('PRODUCTSCATEGORY_DISPLAY_PRICE')) + return false; + return true; + } + + public function getContent() + { + $this->_html = ''; + if (Tools::isSubmit('submitCross') AND Tools::getValue('displayPrice') != 0 AND Tools::getValue('displayPrice') != 1) + $this->_html .= $this->displayError('Invalid displayPrice'); + elseif (Tools::isSubmit('submitCross')) + { + Configuration::updateValue('PRODUCTSCATEGORY_DISPLAY_PRICE', Tools::getValue('displayPrice')); + $this->_html .= $this->displayConfirmation($this->l('Settings updated successfully')); + } + $this->_html .= ' +

    +
    '.$this->l('Settings').' + +
    + + + + +

    '.$this->l('Show the price on the products in the block.').'

    +
    +
    +
    +
    '; + return $this->_html; + } + + private function getCurrentProduct($products, $id_current) + { + if ($products) + foreach ($products AS $key => $product) + if ($product['id_product'] == $id_current) + return $key; + return false; + } + + public function hookProductFooter($params) + { + global $smarty, $cookie; + + $idProduct = (int)(Tools::getValue('id_product')); + $product = new Product((int)($idProduct)); + + /* If the visitor has came to this product by a category, use this one */ + if (isset($params['category']->id_category)) + $category = $params['category']; + /* Else, use the default product category */ + else + { + if (isset($product->id_category_default) AND $product->id_category_default > 1) + $category = New Category((int)($product->id_category_default)); + } + + if (!Validate::isLoadedObject($category) OR !$category->active) + return; + + // Get infos + $categoryProducts = $category->getProducts((int)($cookie->id_lang), 1, 100); /* 100 products max. */ + $sizeOfCategoryProducts = (int)sizeof($categoryProducts); + $middlePosition = 0; + + // Remove current product from the list + if (is_array($categoryProducts) AND sizeof($categoryProducts)) + { + foreach ($categoryProducts AS $key => $categoryProduct) + if ($categoryProduct['id_product'] == $idProduct) + { + unset($categoryProducts[$key]); + break; + } + + $taxes = Product::getTaxCalculationMethod(); + if (Configuration::get('PRODUCTSCATEGORY_DISPLAY_PRICE')) + foreach ($categoryProducts AS $key => $categoryProduct) + if ($categoryProduct['id_product'] != $idProduct) + { + if ($taxes == 0 OR $taxes == 2) + $categoryProducts[$key]['displayed_price'] = Product::getPriceStatic((int)$categoryProduct['id_product'], true, NULL); + elseif ($taxes == 1) + $categoryProducts[$key]['displayed_price'] = Product::getPriceStatic((int)$categoryProduct['id_product'], false, NULL); + } + + // Get positions + $middlePosition = round($sizeOfCategoryProducts / 2, 0); + $productPosition = $this->getCurrentProduct($categoryProducts, (int)$idProduct); + + // Flip middle product with current product + if ($productPosition) + { + $tmp = $categoryProducts[$middlePosition-1]; + $categoryProducts[$middlePosition-1] = $categoryProducts[$productPosition]; + $categoryProducts[$productPosition] = $tmp; + } + + // If products tab higher than 30, slice it + if ($sizeOfCategoryProducts > 30) + { + $categoryProducts = array_slice($categoryProducts, $middlePosition - 15, 30, true); + $middlePosition = 15; + } + } + + // Display tpl + $smarty->assign(array( + 'categoryProducts' => $categoryProducts, + 'middlePosition' => (int)$middlePosition, + 'ProdDisplayPrice' => Configuration::get('PRODUCTSCATEGORY_DISPLAY_PRICE'))); + + return $this->display(__FILE__, 'productscategory.tpl'); + } + + public function hookHeader($params) + { + Tools::addCSS($this->_path.'productscategory.css', 'all'); + Tools::addJS(array($this->_path.'productscategory.js', _PS_JS_DIR_.'jquery/jquery.serialScroll-1.2.2-min.js')); + } +} \ No newline at end of file diff --git a/modules/productscategory/productscategory.tpl b/modules/productscategory/productscategory.tpl new file mode 100644 index 000000000..b0ed55cec --- /dev/null +++ b/modules/productscategory/productscategory.tpl @@ -0,0 +1,56 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if count($categoryProducts) > 0} +

    {$categoryProducts|@count} {l s='other products in the same category:' mod='productscategory'}

    +
    + {if count($categoryProducts) > 5}{l s='Previous' mod='productscategory'}{/if} +
    + +
    + {if count($categoryProducts) > 5}{l s='Next' mod='productscategory'}{/if} +
    + +{/if} diff --git a/modules/producttooltip/config.xml b/modules/producttooltip/config.xml new file mode 100755 index 000000000..9e700b32e --- /dev/null +++ b/modules/producttooltip/config.xml @@ -0,0 +1,12 @@ + + + producttooltip + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/producttooltip/de.php b/modules/producttooltip/de.php new file mode 100644 index 000000000..5ca002351 --- /dev/null +++ b/modules/producttooltip/de.php @@ -0,0 +1,26 @@ +producttooltip_975f3743bcce9c5a2e30001aab592fb1'] = 'Person sieht gerade'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e1a1dc1574c9f178c14e2952351aa47d'] = 'Menschen sehen gerade'; +$_MODULE['<{producttooltip}prestashop>producttooltip_d296e0c3a7dffc0f4d02574bd502653f'] = 'dieses Produkt'; +$_MODULE['<{producttooltip}prestashop>producttooltip_71736c614b237f4368128077411f1699'] = 'Dieses Produkt wurde zuletzt gekauft '; +$_MODULE['<{producttooltip}prestashop>producttooltip_4dda321f0231c2d50fcee5c20075dbbd'] = 'Dieses Produkt wurde zuletzt in den Warenkorb hinzugefügt'; +$_MODULE['<{producttooltip}prestashop>producttooltip_4776f7eb5998034f7bbc63b6457d1ff4'] = 'Produkt-Tooltips'; +$_MODULE['<{producttooltip}prestashop>producttooltip_3e29935c25a10ae452308dc52381f353'] = 'Zeigt an, wie viele Besucher gerade Ihr Produkt ansehen, letzten Verkauf und letztes Hinzufügen zum Warenkorb.'; +$_MODULE['<{producttooltip}prestashop>producttooltip_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e548d0d6a94a27306b8b31472a3e5ec3'] = 'Anzahl der Menschen anzeigen, die gerade dieses Produkt ansehen?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{producttooltip}prestashop>producttooltip_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{producttooltip}prestashop>producttooltip_2c8de3180924949acc5f6250af689802'] = 'Online-Zeit'; +$_MODULE['<{producttooltip}prestashop>producttooltip_640fd0cc0ffa0316ae087652871f4486'] = 'Minuten'; +$_MODULE['<{producttooltip}prestashop>producttooltip_8a8110f8a25a0e445f51edf84fd98a96'] = 'Wenn Sie die Option aktivieren, müssen Sie ebenfalls die erste Option von StartData aktivieren'; +$_MODULE['<{producttooltip}prestashop>producttooltip_1e358b149c2d4105f3a74c1961d1d9fb'] = 'Datum der letzten Bestellung dieses Produkts anzeigen?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_69cd5a64d37c70989558b58f0b484fb3'] = 'Falls noch nie bestellt, Datum der letzten Auswahl in einem Warenkorb anzeigen?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_a536f110cc080569666e95e8f49fda9b'] = 'Keine Ereignisse, anzeigen, die älter sind als :'; +$_MODULE['<{producttooltip}prestashop>producttooltip_44fdec47036f482b68b748f9d786801b'] = 'Tage'; +$_MODULE['<{producttooltip}prestashop>producttooltip_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{producttooltip}prestashop>producttooltip_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Beispiel:'; + +?> \ No newline at end of file diff --git a/modules/producttooltip/es.php b/modules/producttooltip/es.php new file mode 100644 index 000000000..57bfb4537 --- /dev/null +++ b/modules/producttooltip/es.php @@ -0,0 +1,24 @@ +producttooltip_4776f7eb5998034f7bbc63b6457d1ff4'] = 'Ventana de información producto'; +$_MODULE['<{producttooltip}prestashop>producttooltip_3e29935c25a10ae452308dc52381f353'] = 'Mostrar cuántas personas están viendo la página del producto, así como la fecha del último producto pedido o incluido en el carrito'; +$_MODULE['<{producttooltip}prestashop>producttooltip_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e548d0d6a94a27306b8b31472a3e5ec3'] = '¿Mostrar el número de personas que están viendo este producto?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{producttooltip}prestashop>producttooltip_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{producttooltip}prestashop>producttooltip_2c8de3180924949acc5f6250af689802'] = 'Periodo de validez:'; +$_MODULE['<{producttooltip}prestashop>producttooltip_640fd0cc0ffa0316ae087652871f4486'] = 'minutos'; +$_MODULE['<{producttooltip}prestashop>producttooltip_8a8110f8a25a0e445f51edf84fd98a96'] = 'Si activa la opción anterior, debe activar la primera opción del módulo StatData'; +$_MODULE['<{producttooltip}prestashop>producttooltip_1e358b149c2d4105f3a74c1961d1d9fb'] = '¿Mostrar la fecha del último pedido?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_dbcfa4aa50cd5f7ad099b3ba50e1137c'] = 'Si no hay pedido, ¿mostrar la última vez que un producto ha sido añadido al carrito?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_a536f110cc080569666e95e8f49fda9b'] = 'No mostrar los acontecimientos de más de:'; +$_MODULE['<{producttooltip}prestashop>producttooltip_44fdec47036f482b68b748f9d786801b'] = 'días'; +$_MODULE['<{producttooltip}prestashop>producttooltip_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar configuración'; +$_MODULE['<{producttooltip}prestashop>producttooltip_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Mostrar:'; +$_MODULE['<{producttooltip}prestashop>producttooltip_975f3743bcce9c5a2e30001aab592fb1'] = 'la persona que está viendo en este momento'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e1a1dc1574c9f178c14e2952351aa47d'] = 'las personas que están viendo en este momento'; +$_MODULE['<{producttooltip}prestashop>producttooltip_d296e0c3a7dffc0f4d02574bd502653f'] = 'este producto'; +$_MODULE['<{producttooltip}prestashop>producttooltip_71736c614b237f4368128077411f1699'] = 'Este producto fue comprado por última vez el'; +$_MODULE['<{producttooltip}prestashop>producttooltip_4dda321f0231c2d50fcee5c20075dbbd'] = 'Este producto fue añadido al carrito por última vez el'; diff --git a/modules/producttooltip/fr.php b/modules/producttooltip/fr.php new file mode 100644 index 000000000..8b5d9aac6 --- /dev/null +++ b/modules/producttooltip/fr.php @@ -0,0 +1,24 @@ +producttooltip_4776f7eb5998034f7bbc63b6457d1ff4'] = 'Infobulles produit'; +$_MODULE['<{producttooltip}prestashop>producttooltip_3e29935c25a10ae452308dc52381f353'] = 'Affiche combien de personnes consultent un produit ainsi que les dates de dernière commande ou ajout au panier'; +$_MODULE['<{producttooltip}prestashop>producttooltip_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e548d0d6a94a27306b8b31472a3e5ec3'] = 'Afficher le nombre de personnes qui consultent la fiche produit ?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{producttooltip}prestashop>producttooltip_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{producttooltip}prestashop>producttooltip_2c8de3180924949acc5f6250af689802'] = 'Période de validité :'; +$_MODULE['<{producttooltip}prestashop>producttooltip_640fd0cc0ffa0316ae087652871f4486'] = 'minutes'; +$_MODULE['<{producttooltip}prestashop>producttooltip_8a8110f8a25a0e445f51edf84fd98a96'] = 'Si vous activez l\'option ci-dessus, vous devez activer la première option du module StatData'; +$_MODULE['<{producttooltip}prestashop>producttooltip_1e358b149c2d4105f3a74c1961d1d9fb'] = 'Afficher la date de la dernière commande ?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_dbcfa4aa50cd5f7ad099b3ba50e1137c'] = 'Si aucune commande à afficher, afficher la date du dernier ajout au panier ?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_a536f110cc080569666e95e8f49fda9b'] = 'Ne pas afficher les événements datant de plus de :'; +$_MODULE['<{producttooltip}prestashop>producttooltip_44fdec47036f482b68b748f9d786801b'] = 'jours'; +$_MODULE['<{producttooltip}prestashop>producttooltip_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour les paramètres'; +$_MODULE['<{producttooltip}prestashop>producttooltip_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Exemple :'; +$_MODULE['<{producttooltip}prestashop>producttooltip_975f3743bcce9c5a2e30001aab592fb1'] = 'personne regarde actuellement'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e1a1dc1574c9f178c14e2952351aa47d'] = 'personnes regardent actuellement'; +$_MODULE['<{producttooltip}prestashop>producttooltip_d296e0c3a7dffc0f4d02574bd502653f'] = 'ce produit'; +$_MODULE['<{producttooltip}prestashop>producttooltip_71736c614b237f4368128077411f1699'] = 'Ce produit a été acheté dernièrement le'; +$_MODULE['<{producttooltip}prestashop>producttooltip_4dda321f0231c2d50fcee5c20075dbbd'] = 'Ce produit a été ajouté au panier dernièrement le'; diff --git a/modules/producttooltip/it.php b/modules/producttooltip/it.php new file mode 100644 index 000000000..155fadc1e --- /dev/null +++ b/modules/producttooltip/it.php @@ -0,0 +1,25 @@ +producttooltip_975f3743bcce9c5a2e30001aab592fb1'] = 'persona sta guardando'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e1a1dc1574c9f178c14e2952351aa47d'] = 'persone stanno guardando'; +$_MODULE['<{producttooltip}prestashop>producttooltip_d296e0c3a7dffc0f4d02574bd502653f'] = 'questo prodotto'; +$_MODULE['<{producttooltip}prestashop>producttooltip_71736c614b237f4368128077411f1699'] = 'Questo prodotto è stato comprato'; +$_MODULE['<{producttooltip}prestashop>producttooltip_4dda321f0231c2d50fcee5c20075dbbd'] = 'Questo prodotto è stato aggiunto al carrello '; +$_MODULE['<{producttooltip}prestashop>producttooltip_4776f7eb5998034f7bbc63b6457d1ff4'] = 'Tooltip prodotto'; +$_MODULE['<{producttooltip}prestashop>producttooltip_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{producttooltip}prestashop>producttooltip_e548d0d6a94a27306b8b31472a3e5ec3'] = 'Visualizzare il numero di persone che stanno attualmente guardando questo prodotto?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{producttooltip}prestashop>producttooltip_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{producttooltip}prestashop>producttooltip_2c8de3180924949acc5f6250af689802'] = 'Periodo:'; +$_MODULE['<{producttooltip}prestashop>producttooltip_640fd0cc0ffa0316ae087652871f4486'] = 'minuti'; +$_MODULE['<{producttooltip}prestashop>producttooltip_8a8110f8a25a0e445f51edf84fd98a96'] = 'Se si attiva l\'opzione di sopra, è necessario attivare la prima opzione del modulo StatDATA'; +$_MODULE['<{producttooltip}prestashop>producttooltip_1e358b149c2d4105f3a74c1961d1d9fb'] = 'Visualizzare l\'ultima volta in cui il prodotto è stato ordinato?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_69cd5a64d37c70989558b58f0b484fb3'] = 'Se ancora non c\'è nessun ordine, vuoi vedere l\'ultima volta che il prodotto è stato aggiunto al carrello?'; +$_MODULE['<{producttooltip}prestashop>producttooltip_a536f110cc080569666e95e8f49fda9b'] = 'Non visualizzare gli eventi che datano a prima di:'; +$_MODULE['<{producttooltip}prestashop>producttooltip_44fdec47036f482b68b748f9d786801b'] = 'giorno'; +$_MODULE['<{producttooltip}prestashop>producttooltip_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiornare le impostazioni'; +$_MODULE['<{producttooltip}prestashop>producttooltip_f0f5fac9602d88bc27f0edf960dda8b8'] = 'Esempio:'; + +?> \ No newline at end of file diff --git a/modules/producttooltip/logo.gif b/modules/producttooltip/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d893833a03ad9d2af40d293b861ac0f8862bbc6f GIT binary patch literal 359 zcmZ?wbhEHb6krfwxXQp_mL+lF+0LGw$>D9=yH=k~?e+Wc?ccJ!GglnA_2BKlhE)mK zQ}$nY@^{LH7Vj#9y%!$eeDc0=(WDKR`>W<3pS1D9^LJnW|NnpI)!%csU(MNmb@R#l z&p!NfC{oFv8XMHDzWK_O4M$c*ckb-oopSB@-|QQhYi;z)+{^`*S(8@XrTC$g^`^>j6nya1LP+Lwibu(0uLRj{$oO_ zCK*=jOSmRBIAn<(zH}hzMumCj>7z!4oW3{mm1-m-Ic5|~osrx5&}nV!Jvl=OF#`eT z5Eo7!X|Zq@FF#2q1zA>Bb`Ne*K`wblZ8=^y4P8T4At5m(C3RO(ZhkR7EoXTK4>5Hn b9Wfp4RUVphO!7?gwu +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class ProductToolTip extends Module +{ + public function __construct() + { + $this->name = 'producttooltip'; + $this->tab = 'front_office_features'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Product tooltips'); + $this->description = $this->l('Show how many people are watching a product page, last sale and last cart added.'); + } + + public function install() + { + if (!parent::install()) + return false; + + /* Default configuration values */ + Configuration::updateValue('PS_PTOOLTIP_PEOPLE', 1); + Configuration::updateValue('PS_PTOOLTIP_DATE_CART', 1); + Configuration::updateValue('PS_PTOOLTIP_DATE_ORDER', 1); + Configuration::updateValue('PS_PTOOLTIP_DAYS', 3); + Configuration::updateValue('PS_PTOOLTIP_LIFETIME', 30); + + return $this->registerHook('productfooter'); + } + + public function uninstall() + { + if (!Configuration::deleteByName('PS_PTOOLTIP_PEOPLE') + OR !Configuration::deleteByName('PS_PTOOLTIP_DATE_CART') + OR !Configuration::deleteByName('PS_PTOOLTIP_DATE_ORDER') + OR !Configuration::deleteByName('PS_PTOOLTIP_DAYS') + OR !Configuration::deleteByName('PS_PTOOLTIP_LIFETIME') + OR !parent::uninstall()) + return false; + return true; + } + + public function getContent() + { + /* Update values in DB */ + if (Tools::isSubmit('SubmitToolTip')) + { + Configuration::updateValue('PS_PTOOLTIP_PEOPLE', (int)(Tools::getValue('ps_ptooltip_people'))); + Configuration::updateValue('PS_PTOOLTIP_DATE_CART', (int)(Tools::getValue('ps_ptooltip_date_cart'))); + Configuration::updateValue('PS_PTOOLTIP_DATE_ORDER', (int)(Tools::getValue('ps_ptooltip_date_order'))); + Configuration::updateValue('PS_PTOOLTIP_DAYS', ((int)(Tools::getValue('ps_ptooltip_days') < 0 ? 0 : (int)Tools::getValue('ps_ptooltip_days')))); + Configuration::updateValue('PS_PTOOLTIP_LIFETIME', ((int)(Tools::getValue('ps_ptooltip_lifetime') < 0 ? 0 : (int)Tools::getValue('ps_ptooltip_lifetime')))); + + echo $this->displayConfirmation($this->l('Settings updated')); + } + + /* Configuration form */ + $output = ' +
    +
    + '.$this->l('Product tooltips').' +

    + '.$this->l('Display the number of people who are currently watching this product?').'

    + '.$this->l('Yes').' +   '.$this->l('No').'
    +

    +

    + '.$this->l('Lifetime:').' + '.$this->l('minutes').'
    +

    +

    + '.$this->l('If you activate the option above, you must activate the first option of StatData module').' +

    +
    +

    + '.$this->l('Display the last time the product has been ordered?').'

    + '.$this->l('Yes').' +   '.$this->l('No').'

    +

    +

    + '.$this->l('If not ordered yet, display the last time the product has been added to a cart?').'

    + '.$this->l('Yes').' +   '.$this->l('No').'

    + +

    +

    + '.$this->l('Do not display events older than:').' + '.$this->l('days').'
    +

    +
    +
    +
    +

    + '.$this->l('Sample:').'
    + +

    +
    +
    '; + + return $output; + } + + public function hookProductFooter($params) + { + global $smarty, $cookie; + + $id_product = (int)($params['product']->id); + + /* First we try to display the number of people who are currently watching this product page */ + if (Configuration::get('PS_PTOOLTIP_PEOPLE')) + { + $date = strftime('%Y-%m-%d %H:%M:%S' , time() - (int)(Configuration::get('PS_PTOOLTIP_LIFETIME') * 60)); + + $nbPeople = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT COUNT(DISTINCT(id_connections)) nb + FROM '._DB_PREFIX_.'page p + LEFT JOIN '._DB_PREFIX_.'connections_page cp ON (p.id_page = cp.id_page) + WHERE p.id_page_type = 1 AND p.id_object = '.(int)($id_product).' AND cp.time_start > \''.pSQL($date).'\''); + + if (isset($nbPeople['nb']) AND $nbPeople['nb'] > 0) + $smarty->assign('nb_people', (int)($nbPeople['nb'])); + } + + /* Then, we try to display last sale */ + if (Configuration::get('PS_PTOOLTIP_DATE_ORDER')) + { + $days = (int)(Configuration::get('PS_PTOOLTIP_DAYS')); + $date = strftime('%Y-%m-%d' , strtotime('-'.(int)($days).' day')); + + $order = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT o.date_add + FROM '._DB_PREFIX_.'order_detail od + LEFT JOIN '._DB_PREFIX_.'orders o ON (od.id_order = o.id_order) + WHERE od.product_id = '.(int)($id_product).' AND o.date_add >= \''.pSQL($date).'\' + ORDER BY o.date_add DESC'); + + if (isset($order['date_add'])) + $smarty->assign('date_last_order', $order['date_add']); + else + { + /* No sale? display last cart add instead */ + if (Configuration::get('PS_PTOOLTIP_DATE_CART')) + { + $cart = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' + SELECT cp.date_add + FROM '._DB_PREFIX_.'cart_product cp + WHERE cp.id_product = '.(int)($id_product)); + + if (isset($cart['date_add'])) + $smarty->assign('date_last_cart', $cart['date_add']); + } + } + } + + if ((isset($nbPeople['nb']) AND $nbPeople['nb'] > 0) OR isset($order['date_add']) OR isset($cart['date_add'])) + return $this->display(__FILE__, 'producttooltip.tpl'); + } +} + + diff --git a/modules/producttooltip/producttooltip.tpl b/modules/producttooltip/producttooltip.tpl new file mode 100644 index 000000000..246d4a45c --- /dev/null +++ b/modules/producttooltip/producttooltip.tpl @@ -0,0 +1,36 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + diff --git a/modules/producttooltip/sample.gif b/modules/producttooltip/sample.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef252d76f61e54b11eb72ce29db0b32064624234 GIT binary patch literal 30852 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/referralprogram/ReferralProgramModule.php b/modules/referralprogram/ReferralProgramModule.php new file mode 100644 index 000000000..96d491b77 --- /dev/null +++ b/modules/referralprogram/ReferralProgramModule.php @@ -0,0 +1,200 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class ReferralProgramModule extends ObjectModel +{ + public $id_sponsor; + public $email; + public $lastname; + public $firstname; + public $id_customer; + public $id_discount; + public $id_discount_sponsor; + public $date_add; + public $date_upd; + + protected $fieldsRequired = array('id_sponsor', 'email', 'lastname', 'firstname'); + protected $fieldsSize = array('id_sponsor' => 8, 'email' => 255, 'lastname' => 128, 'firstname' => 128, 'id_customer' => 8, 'id_discount' => 8, 'id_discount_sponsor' => 8); + protected $fieldsValidate = array( 'id_sponsor' => 'isUnsignedId', 'email' => 'isEmail', 'lastname' => 'isName', 'firstname' => 'isName', 'id_customer' => 'isUnsignedId', 'id_discount' => 'isUnsignedId', 'id_discount_sponsor' => 'isUnsignedId'); + protected $table = 'referralprogram'; + protected $identifier = 'id_referralprogram'; + + public function getFields() + { + parent::validateFields(); + $fields['id_sponsor'] = (int)$this->id_sponsor; + $fields['email'] = pSQL($this->email); + $fields['lastname'] = pSQL($this->lastname); + $fields['firstname'] = pSQL($this->firstname); + $fields['id_customer'] = (int)$this->id_customer; + $fields['id_discount'] = (int)$this->id_discount; + $fields['id_discount_sponsor'] = (int)$this->id_discount_sponsor; + $fields['date_add'] = pSQL($this->date_add); + $fields['date_upd'] = pSQL($this->date_upd); + return $fields; + } + + static public function getDiscountPrefix() + { + return 'SP'; + } + + public function registerDiscountForSponsor($id_currency) + { + if ((int)$this->id_discount_sponsor > 0) + return false; + return $this->registerDiscount((int)$this->id_sponsor, 'sponsor', (int)$id_currency); + } + + public function registerDiscountForSponsored($id_currency) + { + if (!(int)$this->id_customer OR (int)$this->id_discount > 0) + return false; + return $this->registerDiscount((int)$this->id_customer, 'sponsored', (int)$id_currency); + } + + public function registerDiscount($id_customer, $register = false, $id_currency = 0) + { + $configurations = Configuration::getMultiple(array('REFERRAL_DISCOUNT_TYPE', 'REFERRAL_PERCENTAGE', 'REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency)); + + $discount = new Discount(); + $discount->id_discount_type = (int)$configurations['REFERRAL_DISCOUNT_TYPE']; + + /* % */ + if ($configurations['REFERRAL_DISCOUNT_TYPE'] == 1) + $discount->value = (float)$configurations['REFERRAL_PERCENTAGE']; + /* Fixed amount */ + elseif ($configurations['REFERRAL_DISCOUNT_TYPE'] == 2 AND isset($configurations['REFERRAL_DISCOUNT_VALUE_'.(int)($id_currency)])) + $discount->value = (float)$configurations['REFERRAL_DISCOUNT_VALUE_'.(int)($id_currency)]; + /* Unknown or value undefined for this currency (configure your module correctly) */ + else + $discount->value = 0; + + $discount->quantity = 1; + $discount->quantity_per_user = 1; + $discount->date_from = date('Y-m-d H:i:s', time()); + $discount->date_to = date('Y-m-d H:i:s', time() + 31536000); // + 1 year + $discount->name = $this->getDiscountPrefix().Tools::passwdGen(6); + $discount->description = Configuration::getInt('REFERRAL_DISCOUNT_DESCRIPTION'); + $discount->id_customer = (int)$id_customer; + $discount->id_currency = (int)$id_currency; + + if ($discount->add()) + { + if ($register != false) + { + if ($register == 'sponsor') + $this->id_discount_sponsor = (int)$discount->id; + elseif ($register == 'sponsored') + $this->id_discount = (int)$discount->id; + return $this->save(); + } + return true; + } + return false; + } + + /** + * Return sponsored friends + * + * @return array Sponsor + */ + static public function getSponsorFriend($id_customer, $restriction = false) + { + if (!(int)($id_customer)) + return array(); + + $query = ' + SELECT s.* + FROM `'._DB_PREFIX_.'referralprogram` s + WHERE s.`id_sponsor` = '.(int)$id_customer; + if ($restriction) + { + if ($restriction == 'pending') + $query.= ' AND s.`id_customer` = 0'; + elseif ($restriction == 'subscribed') + $query.= ' AND s.`id_customer` != 0'; + } + + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($query); + } + + /** + * Return if a customer is sponsorised + * + * @return boolean + */ + static public function isSponsorised($id_customer, $getId=false) + { + $result = Db::getInstance()->getRow(' + SELECT s.`id_referralprogram` + FROM `'._DB_PREFIX_.'referralprogram` s + WHERE s.`id_customer` = '.(int)$id_customer); + + if (isset($result['id_referralprogram']) AND $getId === true) + return (int)$result['id_referralprogram']; + + return isset($result['id_referralprogram']); + } + + static public function isSponsorFriend($id_sponsor, $id_friend) + { + if (!(int)($id_sponsor) OR !(int)($id_friend)) + return false; + + $result = Db::getInstance()->getRow(' + SELECT s.`id_referralprogram` + FROM `'._DB_PREFIX_.'referralprogram` s + WHERE s.`id_sponsor` = '.(int)($id_sponsor).' AND s.`id_referralprogram` = '.(int)($id_friend)); + + return isset($result['id_referralprogram']); + } + + /** + * Return if an email is already register + * + * @return boolean OR int idReferralProgram + */ + static public function isEmailExists($email, $getId = false, $checkCustomer = true) + { + if (empty($email) OR !Validate::isEmail($email)) + die (Tools::displayError('Email invalid.')); +// $return_id = false, $ignoreGuest = true, $id_group_shop = false, $id_shop = false + if ($checkCustomer === true AND Customer::customerExists($email, false, true, (int)Shop::getCurrentGroupShop(), (int)Shop::getCurrentShop())) + return false; + $result = Db::getInstance()->getRow(' + SELECT s.`id_referralprogram` + FROM `'._DB_PREFIX_.'referralprogram` s + WHERE s.`email` = \''.pSQL($email).'\''); + if ($getId) + return (int)$result['id_referralprogram']; + return isset($result['id_referralprogram']); + } +} diff --git a/modules/referralprogram/authentication.tpl b/modules/referralprogram/authentication.tpl new file mode 100644 index 000000000..1fa2c6ea6 --- /dev/null +++ b/modules/referralprogram/authentication.tpl @@ -0,0 +1,35 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + \ No newline at end of file diff --git a/modules/referralprogram/config.xml b/modules/referralprogram/config.xml new file mode 100755 index 000000000..95b86dcd6 --- /dev/null +++ b/modules/referralprogram/config.xml @@ -0,0 +1,13 @@ + + + referralprogram + + + + + + All sponsors and friends will be deleted. Are you sure you want to uninstall this module? + 1 + 1 + + \ No newline at end of file diff --git a/modules/referralprogram/de.php b/modules/referralprogram/de.php new file mode 100644 index 000000000..0bf28c421 --- /dev/null +++ b/modules/referralprogram/de.php @@ -0,0 +1,112 @@ +authentication_6b31baf25848e7a6563ecc3946626c80'] = 'Referral Programm'; +$_MODULE['<{referralprogram}prestashop>authentication_8fdb2298a0db461ac64e71192a562ca1'] = 'E-Mail-Adresse Ihres Sponsors'; +$_MODULE['<{referralprogram}prestashop>my-account_6b31baf25848e7a6563ecc3946626c80'] = 'Referral Programm'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_6a1fc5f99c944639b4005366d393a1ee'] = 'Danke für Ihre Bestellung, Ihr Sponsor'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_eb8c6d2e305207c8fbc14a2ebb2e42fc'] = 'verdient einen Gutschein im Wert von'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_cda09d90a2d64cf06ae6516cc20ae468'] = 'wenn diese Bestellung bestätigt ist.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d3d2e617335f08df83599665eef8a418'] = 'Schließen'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7a81aa9275331bb0f5e6adb5e8650a03'] = 'oder Esc-Taste'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mein Konto'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6540b502e953f4c05abeb8f234cd50bf'] = 'Referral Program'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b31baf25848e7a6563ecc3946626c80'] = 'Referral Programm'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dbc65cd60abde51277c2881ce915a225'] = 'Sie müssen sich den Bedingungen des Referral-Programm zustimmen!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_83fc792f687bc45d75ac35c84c721a26'] = 'Mindestens eine E-Mail-Adresse ist ungültig!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1019072b9e450c8652590cda2db45e49'] = 'Mindestens ein Vorname oder Nachname ist ungültig!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ff2d2e45b90b4426c3bb14bd56b95a2d'] = 'Jemand mit dieser E-Mail-Adresse ist bereits gesponsert worden!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3f8a4c7f93945fea0d951fa402ee4272'] = 'Bitte kreuzen Sie mindestens ein Kontrollkästchen an'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dcc99d8715486f570db3ec5ee469a828'] = 'Kann keine Freunde zur Datenbank hinzufügen '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_f6cb78f0afcf7c3a06048a7a5855d6a1'] = 'Es wurden E-Mails an Ihre Freunde gesendet!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_79cd362fc64832faa0a2079f1142aa12'] = 'Eine E-Mail wurde an Ihren Freund geschickt!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2b90ca4a7b1c83e0a3bb65899725cd65'] = 'Erinnerungs-E-Mails wurden an Ihre Freunde verschickt!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_819e52b3c6ca4db131dcfea19188a0c3'] = 'Eine Erinnerungs-E-Mail wurde an Ihren Freund verschickt!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_46ee2fe8845962d24bf5178a26e109f3'] = 'Meine Freunde sponsern '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_c56567bc42584de1a7ac430039b3a87e'] = 'Anhängige Freunde'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_58c7f2542ab2e2c3e4e39e851ea0f225'] = 'Freunde, die ich gesponsert habe'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_00c2fab6945aadad3e822d8f38e18ce7'] = 'Einen Rabatt erhalten von'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2dd74a0c7eda49de19eeaed3e1988e8f'] = 'für Sie und Ihre Freunde durch die Empfehlung dieser Webseite.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3ae82bfa996855cdf841dd9e15a7e3'] = 'Es ist schnell und einfach. Nur denVornamen, Nachnamen un d die E-Mail-Adresse (n) Ihres (r) Freunds (e) in die Felder unten eintragen.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9cee6c57b3003b3068177fa913f56468'] = 'Wenn einer von ihnen mindestens'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_12c500ed0b7879105fb46af0f246be87'] = 'Bestellungen'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_70a17ffa722a3985b86d30b034ad06d7'] = 'Bestellung'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_08b002301ef588d9cb9d7b009df2d1e1'] = 'vornimmt, wird er oder sie'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ae01c01c004a8c391d1b9ecd6949f9f8'] = 'einen Gutschein erhalten und Sie erhalten Ihren eigenen Gutschein im Wert von'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3f5eff9c40ee315d452392bed5309b'] = 'Nachname'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_20db0bfeecd8fe60533206a2b5e9891a'] = 'Vorname'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1e884e3078d9978e216a027ecd57fb34'] = 'E-Mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9386de858384e7f790a28beecdb986dd'] = 'Wichtig: Die E-Mail-Adressen Ihrer Freunde werden nur im Referral-Programm verwendet. Sie werden niemals für andere Zwecke verwendet werden.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_605eef3cad421619ce034ab48415190f'] = 'Ich stimme den Nutzungsbedingungen zu und halte sie bedingungslos ein.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b719c160f9b08dad4760bcc4b52ed48'] = 'Geschäftsbedingungen des Referral-Programms'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_868ca5fe643791c23b47c75fb833c9b8'] = 'Lesen Sie die Nutzungsbedingungen.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_31fde7b05ac8952dacf4af8a704074ec'] = 'Vorschau'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8e8dc296c6bf3876468aa028974bfebe'] = 'Einladungs-E-Mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_a86073a0c3b0bebf11bd807caf8e505a'] = 'Standard-E-Mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7532696b81dfc0b94a37e876677152c5'] = 'die Ihrem (n) Freund (en) gesendet wird.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ad3d06d03d94223fa652babc913de686'] = 'Bestätigen'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_59352cd5314a67c0fb10c964831920f3'] = 'Um Sponsor zu werden, müssen Sie eine mindestens ausfüllen'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ec7342814444c667ab93181b30b28e38'] = 'Diese Freunde haben noch nichts auf dieser Website bestellt, seit Sie sie sponsern, aber Sie können es erneut versuchen! Dazu markieren Sie die Kontrollkästchen des (r) Freundes (e) an, die Sie erinnern möchten, dann klicken Sie auf die Schaltfläche \"Meine(n) Freund (e) erinnern\"'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3e717a04ff77cd5fa068d8ad9d3facc8'] = 'Letzte Einladung'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9c9d4ed270f02c72124702edb192ff19'] = 'Meine(n) Freund (e) erinnern'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8b9f390369560635a2ba5ba271d953df'] = 'Sie haben keine Freunde gesponsert.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_193f3d8bbaceba40499cab1a3545e9e8'] = 'Hier sind gesponserte Freunde, die Ihre Einladung angenommen haben:'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3c648ba41cfb45f13b083a9cbbacdfdf'] = 'Anmeldedatum'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d4e5c2bc4c3cf67d2b59b263a707cb6'] = 'Keine gesponserten Freunde haben bisher Ihre Einladung angenommen.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_0b3db27bc15f682e92ff250ebb167d4b'] = 'Zurück zu Ihrem Konto'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8cf04a9734132302f96da8e113e80ce5'] = 'Startseite'; +$_MODULE['<{referralprogram}prestashop>referralprogram-rules_01705c0177ebf5fbcbf4e882bc454405'] = 'Regeln des Referral Programms'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6b31baf25848e7a6563ecc3946626c80'] = 'Referral Programm'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_50b12ad08d38a2b00a790304bbe851be'] = 'Sie haben einen Gutschein verdient im Wert von'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6c8352dbdb1fa1433bd5974c603dced4'] = 'Dank Ihrem Sponsor!'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_764a957fffea7861310082f57445c83a'] = 'Geben Sie den Gutscheinnamen ein'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_5c24e8005181f1a32b1df54bfe112525'] = 'um den Rabatt für diese Bestellung zu erhalten.'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_106527986549f3ec8da1ae5a7abde467'] = 'Ihr Referral-Programm sehen.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_40604a195d001353d697b0fd26f5d8fe'] = 'Alle Sponsoren und Freunde werden gelöscht. Wollen Sie dieses Modul wirklich deinstallieren?'; +$_MODULE['<{referralprogram}prestashop>referralprogram_83090230d3c11aa76851030eba008a71'] = 'Kunden Referral-Programm'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46a3a666d8823b972af8018a5242a3ac'] = 'Integrieren Sie ein Referral-Programm-System in Ihrem Shop.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_d59ce2e96c0c2362a0a4269e0d874e32'] = 'Sie müssen einen Betrag für Referral-Programm Gutscheine angeben'; +$_MODULE['<{referralprogram}prestashop>referralprogram_284033830e0eaf55340844305bf34fdd'] = 'Referral-Belohnung'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3c5db6c207f700f4f209b43bed966e96'] = 'Kann diese Datei nicht löschen:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6c58031e7824c3cd6febc2f2107b0652'] = 'Konfiguration aktualisiert.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_167579019fe14b4efed431a82985d9ad'] = 'Bestellmenge ist erforderlich / ungültig.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ceb0ce9b627fb9a962543f3271da29b1'] = 'Rabatt-Wert ist ungültig.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c96c84a1a64878d4d742daf52e359e36'] = 'Rabatt-Wert für die Währung Nr.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_4218c2cb615fbc2870f6b1e8d283ab8d'] = 'ist leer.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_bb7476567f5e12e60b01436dad77a533'] = 'ist ungültig.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_addae886b20a06e2954461706c90cd7d'] = 'Rabatt-Typ ist erforderlich / ungültig.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ac3357de2dec8d74d89dd378962ec621'] = 'Anzahl der Freunde ist erforderlich / ungültig.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d31dd445991f35b1ee6491eec7ac71c'] = 'Kann die XML-Datei nicht schreiben.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_96191c1f54bb6311624210333ef797eb'] = 'Kann die XML-Datei nicht schließen.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_21cc1fccae3b04bb8cd2719cc5269e1e'] = 'Kann die XML-Datei nicht aktualisieren. Bitte überprüfen Sie die Schreibrechte der XML-Datei.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5be920293db3e38c81330fd0798336b1'] = 'Ungültiges html Feld, Javascript ist verboten'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7ca3288a38b048b0df25394ccc22ad46'] = 'Minimale Bestellungsanzahl eines gesponserten Freund, damit dieser einen Gutschein erhält:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_624f983eb0713e10faf35ff3889e8d68'] = 'Anzahl der Freunde in dem Einladungsformular des Referral-Programms (Kundenkonto, Referral-Programm-Abschnitt):'; +$_MODULE['<{referralprogram}prestashop>referralprogram_9ad4f790c8bb9be21a2fa388c7730353'] = 'Gutschein-Typ:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46da7ad7d01e209241016d308f9fafce'] = 'Gutschein mit einem Prozentsatz'; +$_MODULE['<{referralprogram}prestashop>referralprogram_97839379a0f447599405341b852e2e24'] = 'Gutschein mit einem festen Betrag (nach Währung)'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d5a011fdba2979f8d0ffd30b9f5c6ba'] = 'Prozentsatz:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_386c339d37e737a436499d423a77df0c'] = 'Währung'; +$_MODULE['<{referralprogram}prestashop>referralprogram_edf7f0a17b8a8f1732f12856fcbc8a6b'] = 'Gutscheinbetrag'; +$_MODULE['<{referralprogram}prestashop>referralprogram_8465d83b5c1b569299af284c14d957bb'] = 'Gutscheinbeschreibung:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisieren'; +$_MODULE['<{referralprogram}prestashop>referralprogram_562ad64cf21ac2da656134355115133d'] = 'Ihr Text ist leer.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_01705c0177ebf5fbcbf4e882bc454405'] = 'Referral Programm Regeln'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c5afb9c76a7880978cba32872d01f068'] = 'Aktualisieren Sie den Text'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6b31baf25848e7a6563ecc3946626c80'] = 'Referral Programm'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7790d51a3d62c85aae65464dee12ee8b'] = 'Kundensponsor:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f964f762284ede747ed9f6428a5469b8'] = 'Niemand hat diesen Kunden gesponsert.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_53d0d7aba39ee971f7f179e6e1092708'] = 'gesponserte Kunden:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_58dc82d3e2e17ced0225064a9b496ee9'] = 'gesponserter Kunde:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{referralprogram}prestashop>referralprogram_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-Mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram_22ffd0379431f3b615eb8292f6c31d12'] = 'Anmeldedatum'; +$_MODULE['<{referralprogram}prestashop>referralprogram_325c8bbd07033a39d25b5c4457f79861'] = 'Kunden, die von diesem Freund gesponsert wurden'; +$_MODULE['<{referralprogram}prestashop>referralprogram_fc6e0920b914b164802d44220e6163f3'] = 'abgesandte Bestellungen'; +$_MODULE['<{referralprogram}prestashop>referralprogram_970ad4e4787cc75cd63dbf8d5c757513'] = 'Kunden-Konto erstellt'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5b541747d46b39c37f0e100ddfe44472'] = 'hat noch keine Freunde gesponsert.'; + +?> \ No newline at end of file diff --git a/modules/referralprogram/en.php b/modules/referralprogram/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/referralprogram/en.php @@ -0,0 +1,4 @@ +authentication_6b31baf25848e7a6563ecc3946626c80'] = 'Programa de patrocinio'; +$_MODULE['<{referralprogram}prestashop>authentication_8fdb2298a0db461ac64e71192a562ca1'] = 'Email de su patrocinador'; +$_MODULE['<{referralprogram}prestashop>my-account_6b31baf25848e7a6563ecc3946626c80'] = 'Programa de patrocinio'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_6a1fc5f99c944639b4005366d393a1ee'] = 'Gracias a su pedido, su patrocinador'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_eb8c6d2e305207c8fbc14a2ebb2e42fc'] = 'ganará un vale por valor de'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_cda09d90a2d64cf06ae6516cc20ae468'] = 'cuando esta compra se confirme.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d3d2e617335f08df83599665eef8a418'] = 'Cerrar'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7a81aa9275331bb0f5e6adb5e8650a03'] = 'o tecla Esc'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mi cuenta'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6540b502e953f4c05abeb8f234cd50bf'] = 'Programa de patrocinio'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b31baf25848e7a6563ecc3946626c80'] = 'Patrocinio'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dbc65cd60abde51277c2881ce915a225'] = '¡Necesita aceptar las condiciones del programa de patrocinio!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_83fc792f687bc45d75ac35c84c721a26'] = '¡Al menos una dirección de correo no es válida!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1019072b9e450c8652590cda2db45e49'] = '¡El nombre o los apellidos no son válidos!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ff2d2e45b90b4426c3bb14bd56b95a2d'] = '¡Alguien con este e-mail ya se ha registrado!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3f8a4c7f93945fea0d951fa402ee4272'] = 'Por favor, marque al menos una casilla'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dcc99d8715486f570db3ec5ee469a828'] = 'No puede añadir amigos a la base de datos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_f6cb78f0afcf7c3a06048a7a5855d6a1'] = 'Emails enviados a sus amigos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_79cd362fc64832faa0a2079f1142aa12'] = 'Se ha enviado un email a su amigo'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2b90ca4a7b1c83e0a3bb65899725cd65'] = 'Se han enviado emails recordatorios a sus amigos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_819e52b3c6ca4db131dcfea19188a0c3'] = 'Se ha enviado un email recordatorio a su amigo'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_46ee2fe8845962d24bf5178a26e109f3'] = 'Patrocinar a mis amigos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_c56567bc42584de1a7ac430039b3a87e'] = 'En espera de amigos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_58c7f2542ab2e2c3e4e39e851ea0f225'] = 'Amigos que he patrocinado'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_00c2fab6945aadad3e822d8f38e18ce7'] = 'Consiga un descuento de'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2dd74a0c7eda49de19eeaed3e1988e8f'] = 'para usted y sus amigos por recomendar este sitio Web.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3ae82bfa996855cdf841dd9e15a7e3'] = 'Es rápido y sencillo. Simplemente rellene el nombre, apellidos, email de su amigo o amigos en los siguientes campos.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9cee6c57b3003b3068177fa913f56468'] = 'Cuando uno de ellos haga por lo menos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_12c500ed0b7879105fb46af0f246be87'] = 'pedidos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_70a17ffa722a3985b86d30b034ad06d7'] = 'un pedido'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_08b002301ef588d9cb9d7b009df2d1e1'] = 'recibirá un vale de descuanto de '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ae01c01c004a8c391d1b9ecd6949f9f8'] = 'y usted también'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3f5eff9c40ee315d452392bed5309b'] = 'Apellidos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_20db0bfeecd8fe60533206a2b5e9891a'] = 'Nombre '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1e884e3078d9978e216a027ecd57fb34'] = 'Email'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9386de858384e7f790a28beecdb986dd'] = 'Importante: las direcciones de correo electrónico de sus amigos sólo serán utilizadas en el programa de patrocinio. Nunca se utilizarán para otros fines.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_605eef3cad421619ce034ab48415190f'] = 'He leido las condiciones de uso y las acepto sin reservas.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b719c160f9b08dad4760bcc4b52ed48'] = 'Condiciones del programa de patrocinio'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_868ca5fe643791c23b47c75fb833c9b8'] = 'Leer condiciones.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_31fde7b05ac8952dacf4af8a704074ec'] = 'Vista previa'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8e8dc296c6bf3876468aa028974bfebe'] = 'Invitación por email'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_a86073a0c3b0bebf11bd807caf8e505a'] = 'Email por defecto '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7532696b81dfc0b94a37e876677152c5'] = 'que se enviará a su amigo o amigos.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ad3d06d03d94223fa652babc913de686'] = 'Validar'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_59352cd5314a67c0fb10c964831920f3'] = 'Para ser un patrocinador, es necesario que usted tenga por lo menos'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ec7342814444c667ab93181b30b28e38'] = '¡Estos amigos aún no han realizado ningún pedido en este sitio web patrocinado, pero usted puede intentarlo nuevamente! Para ello, marque la casilla de verificación de los amigos a los que desea contactar de nuevo. A continuación, haga clic en el botón \\\"contactar a mi(s) amigo (s)\\\"'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3e717a04ff77cd5fa068d8ad9d3facc8'] = 'Última invitación'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9c9d4ed270f02c72124702edb192ff19'] = 'Contactar a mi(s) amigo (s)'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8b9f390369560635a2ba5ba271d953df'] = 'Usted no ha patrocinado a ningún amigo.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_193f3d8bbaceba40499cab1a3545e9e8'] = ' Aquí­ están los amigos patrocinados que han aceptado su invitación:'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3c648ba41cfb45f13b083a9cbbacdfdf'] = 'Fecha de inscripción'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d4e5c2bc4c3cf67d2b59b263a707cb6'] = 'Aún no hay amigos Patrocinados que hayan aceptado su invitación.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_0b3db27bc15f682e92ff250ebb167d4b'] = 'Volver a su cuenta'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8cf04a9734132302f96da8e113e80ce5'] = 'Inicio'; +$_MODULE['<{referralprogram}prestashop>referralprogram-rules_01705c0177ebf5fbcbf4e882bc454405'] = 'Condiciones del programa de patrocinio'; +$_MODULE['<{referralprogram}prestashop>referralprogram_40604a195d001353d697b0fd26f5d8fe'] = 'Todos los datos relativos al programa de apadrinamiento. ¿Está seguro de que desea desinstalarlo?'; +$_MODULE['<{referralprogram}prestashop>referralprogram_83090230d3c11aa76851030eba008a71'] = 'Programa de apadrinamiento de clientes'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46a3a666d8823b972af8018a5242a3ac'] = 'Integrar un programa de apadrinamiento en su tienda'; +$_MODULE['<{referralprogram}prestashop>referralprogram_d59ce2e96c0c2362a0a4269e0d874e32'] = 'Debe especificar un importe para los vales descuento de apadrinamiento'; +$_MODULE['<{referralprogram}prestashop>referralprogram_284033830e0eaf55340844305bf34fdd'] = 'Recompensa apadrinamiento'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3c5db6c207f700f4f209b43bed966e96'] = 'No se puede eliminar este archivo:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6c58031e7824c3cd6febc2f2107b0652'] = 'Configuración actualizada.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_167579019fe14b4efed431a82985d9ad'] = 'Cantidad de pedido se necesita o no es válida.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ceb0ce9b627fb9a962543f3271da29b1'] = 'El valor del descuento no es válido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c96c84a1a64878d4d742daf52e359e36'] = 'El valor del descuento para la moneda #'; +$_MODULE['<{referralprogram}prestashop>referralprogram_4218c2cb615fbc2870f6b1e8d283ab8d'] = 'está vacío.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_bb7476567f5e12e60b01436dad77a533'] = 'no es válido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_addae886b20a06e2954461706c90cd7d'] = 'El tipo de descuento se necesita o no es válido'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ac3357de2dec8d74d89dd378962ec621'] = 'el número de amigos se necesita o no es válido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_18d0d79eb088abb4357e3666eec35660'] = 'El porcentaje de descuento es necesario / no válido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d31dd445991f35b1ee6491eec7ac71c'] = 'No se puede escribir en el archivo XML.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_96191c1f54bb6311624210333ef797eb'] = 'No se puede cerrar el archivo xml.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_21cc1fccae3b04bb8cd2719cc5269e1e'] = 'No se puede actualizar el archivo xml. Por favor, compruebe el archivo XML de los permisos de escritura.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5be920293db3e38c81330fd0798336b1'] = 'Campo Html no válido, javascript está prohibido'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f4f70727dc34561dfde1a3c529b6205c'] = 'Ajustes'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7ca3288a38b048b0df25394ccc22ad46'] = 'Número mínimo de pedidos que un amigo debe hacer para recibir un vale descuento'; +$_MODULE['<{referralprogram}prestashop>referralprogram_624f983eb0713e10faf35ff3889e8d68'] = 'Número de amigos en el formulario de invitación por apadrinamiento ( cuenta cliente, apartado apadrinamiento):'; +$_MODULE['<{referralprogram}prestashop>referralprogram_9ad4f790c8bb9be21a2fa388c7730353'] = 'Tipo vale:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46da7ad7d01e209241016d308f9fafce'] = 'Vale descuento con un porcentaje'; +$_MODULE['<{referralprogram}prestashop>referralprogram_97839379a0f447599405341b852e2e24'] = 'Vale descuento con un importe (por divisa)'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d5a011fdba2979f8d0ffd30b9f5c6ba'] = 'Porcentaje:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_386c339d37e737a436499d423a77df0c'] = 'Divisa'; +$_MODULE['<{referralprogram}prestashop>referralprogram_edf7f0a17b8a8f1732f12856fcbc8a6b'] = 'Importe del vale descuento'; +$_MODULE['<{referralprogram}prestashop>referralprogram_8465d83b5c1b569299af284c14d957bb'] = 'Descripción vale:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar ajustes'; +$_MODULE['<{referralprogram}prestashop>referralprogram_562ad64cf21ac2da656134355115133d'] = 'Su texto está vacio.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_01705c0177ebf5fbcbf4e882bc454405'] = 'Reglas programa apadrinamiento'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c5afb9c76a7880978cba32872d01f068'] = 'Actualizar el texto'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6b31baf25848e7a6563ecc3946626c80'] = 'Programa de apadrinamiento'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7790d51a3d62c85aae65464dee12ee8b'] = 'Padrino del cliente:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f964f762284ede747ed9f6428a5469b8'] = 'Nadie ha apadrinado a este cliente.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_53d0d7aba39ee971f7f179e6e1092708'] = 'clientes apadrinados:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_58dc82d3e2e17ced0225064a9b496ee9'] = 'cliente apadrinado:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{referralprogram}prestashop>referralprogram_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{referralprogram}prestashop>referralprogram_22ffd0379431f3b615eb8292f6c31d12'] = 'Fecha de Registro'; +$_MODULE['<{referralprogram}prestashop>referralprogram_325c8bbd07033a39d25b5c4457f79861'] = 'Clientes apadrinados por este amigo'; +$_MODULE['<{referralprogram}prestashop>referralprogram_fc6e0920b914b164802d44220e6163f3'] = 'Pedidos realizados'; +$_MODULE['<{referralprogram}prestashop>referralprogram_970ad4e4787cc75cd63dbf8d5c757513'] = 'Cuenta cliente creada'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5b541747d46b39c37f0e100ddfe44472'] = 'no ha apadrinado a ningún amigo todavía.'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6b31baf25848e7a6563ecc3946626c80'] = 'Programa de patrocinio'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_50b12ad08d38a2b00a790304bbe851be'] = 'Usted se ha ganado un vale por un valor de'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6c8352dbdb1fa1433bd5974c603dced4'] = 'gracias a su patrocinador'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_764a957fffea7861310082f57445c83a'] = 'Introduzca nombre de vale'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_5c24e8005181f1a32b1df54bfe112525'] = 'para recibir la reducción en este pedido.'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_106527986549f3ec8da1ae5a7abde467'] = 'Ver su programa de patrocinio.'; diff --git a/modules/referralprogram/fr.php b/modules/referralprogram/fr.php new file mode 100644 index 000000000..e9cd44619 --- /dev/null +++ b/modules/referralprogram/fr.php @@ -0,0 +1,111 @@ +authentication_6b31baf25848e7a6563ecc3946626c80'] = 'Programme de parrainage'; +$_MODULE['<{referralprogram}prestashop>authentication_8fdb2298a0db461ac64e71192a562ca1'] = 'Adresse mail de votre parrain'; +$_MODULE['<{referralprogram}prestashop>my-account_6b31baf25848e7a6563ecc3946626c80'] = 'Parrainage'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_6a1fc5f99c944639b4005366d393a1ee'] = 'Grâce à votre commande, votre parrain'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_eb8c6d2e305207c8fbc14a2ebb2e42fc'] = 'gagnera un bon de réduction d\'une valeur de'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_cda09d90a2d64cf06ae6516cc20ae468'] = 'quand cette commande sera confirmée.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d3d2e617335f08df83599665eef8a418'] = 'Fermer'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7a81aa9275331bb0f5e6adb5e8650a03'] = 'ou Echap.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Mon compte'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6540b502e953f4c05abeb8f234cd50bf'] = 'Parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b31baf25848e7a6563ecc3946626c80'] = 'Parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dbc65cd60abde51277c2881ce915a225'] = 'Vous devez accepter les conditions du programme !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_83fc792f687bc45d75ac35c84c721a26'] = 'Une ou plusieurs adresses e-mail sont incorrectes !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1019072b9e450c8652590cda2db45e49'] = 'Un ou plusieurs nom ou prénom sont incorrects !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ff2d2e45b90b4426c3bb14bd56b95a2d'] = 'Quelqu\'un avec cette adresse e-mail est déjà enregistré !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3f8a4c7f93945fea0d951fa402ee4272'] = 'Veuillez cocher au moins une case'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dcc99d8715486f570db3ec5ee469a828'] = 'Impossible d\'ajouter des amis à la base de données'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_f6cb78f0afcf7c3a06048a7a5855d6a1'] = 'E-mails envoyés à vos filleuls !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_79cd362fc64832faa0a2079f1142aa12'] = 'Un e-mail a été envoyé à votre filleul !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2b90ca4a7b1c83e0a3bb65899725cd65'] = 'Des e-mails de rappel ont été envoyés à vos filleuls !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_819e52b3c6ca4db131dcfea19188a0c3'] = 'Un e-mail de rappel a été envoyé à votre filleul !'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_46ee2fe8845962d24bf5178a26e109f3'] = 'Parrainer mes amis'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_c56567bc42584de1a7ac430039b3a87e'] = 'Filleuls en attente'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_58c7f2542ab2e2c3e4e39e851ea0f225'] = 'Mes filleuls'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_00c2fab6945aadad3e822d8f38e18ce7'] = 'Obtenir un bon de réduction de'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2dd74a0c7eda49de19eeaed3e1988e8f'] = 'pour vous et vos amis en recommandant notre boutique.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3ae82bfa996855cdf841dd9e15a7e3'] = 'C\'est rapide et facile. Il suffit de remplir les noms, prénoms et adresses e-mails de vos amis dans les champs ci-dessous.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9cee6c57b3003b3068177fa913f56468'] = 'Quand l\'un d\'entre eux passera au moins'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_12c500ed0b7879105fb46af0f246be87'] = 'commandes'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_70a17ffa722a3985b86d30b034ad06d7'] = 'commande'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_08b002301ef588d9cb9d7b009df2d1e1'] = 'il/elle recevra un bon de réduction de'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ae01c01c004a8c391d1b9ecd6949f9f8'] = 'et vous de même'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3f5eff9c40ee315d452392bed5309b'] = 'Nom'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_20db0bfeecd8fe60533206a2b5e9891a'] = 'Prénom'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1e884e3078d9978e216a027ecd57fb34'] = 'E-mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9386de858384e7f790a28beecdb986dd'] = 'Important : Les e-mails de vos amis ne seront jamais utilisés à d\'autres fins que celles de notre programme.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_605eef3cad421619ce034ab48415190f'] = 'J\'ai lu les conditions d\'utilisation et j\'y adhère sans réserves.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b719c160f9b08dad4760bcc4b52ed48'] = 'Conditions du programme'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_868ca5fe643791c23b47c75fb833c9b8'] = 'Lisez les conditions.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_31fde7b05ac8952dacf4af8a704074ec'] = 'Visualisez'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8e8dc296c6bf3876468aa028974bfebe'] = 'E-mail d\'invitation'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_a86073a0c3b0bebf11bd807caf8e505a'] = 'l\'email par défaut'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7532696b81dfc0b94a37e876677152c5'] = 'qui sera envoyé à vos filleuls.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ad3d06d03d94223fa652babc913de686'] = 'Validez'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_59352cd5314a67c0fb10c964831920f3'] = 'Pour devenir un parrain, vous devez finaliser au moins'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ec7342814444c667ab93181b30b28e38'] = 'Ces filleuls n\'ont pas encore effectué d\'achat, mais vous pouvez les relancer ! Pour ce faire, vous devez cocher les cases des filleuls que vous voulez relancer, puis cliquer sur le bouton \"Relancer mes amis\"'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3e717a04ff77cd5fa068d8ad9d3facc8'] = 'Dernière invitation'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9c9d4ed270f02c72124702edb192ff19'] = 'Relancer mes amis'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8b9f390369560635a2ba5ba271d953df'] = 'Vous n\'avez pas encore parrainé d\'amis.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_193f3d8bbaceba40499cab1a3545e9e8'] = 'Ici sont affichés les filleuls qui ont accepté votre invitation :'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3c648ba41cfb45f13b083a9cbbacdfdf'] = 'Date d\'inscription'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d4e5c2bc4c3cf67d2b59b263a707cb6'] = 'Aucun filleul n\'a encore accepté votre invitation.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_0b3db27bc15f682e92ff250ebb167d4b'] = 'Retour à votre compte'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8cf04a9734132302f96da8e113e80ce5'] = 'Accueil'; +$_MODULE['<{referralprogram}prestashop>referralprogram-rules_01705c0177ebf5fbcbf4e882bc454405'] = 'Conditions du programme de parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_40604a195d001353d697b0fd26f5d8fe'] = 'Tous les informations relatives aux parrains et filleuls'; +$_MODULE['<{referralprogram}prestashop>referralprogram_83090230d3c11aa76851030eba008a71'] = 'Programme de parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46a3a666d8823b972af8018a5242a3ac'] = 'Intègre un programme de parrainage à votre boutique'; +$_MODULE['<{referralprogram}prestashop>referralprogram_d59ce2e96c0c2362a0a4269e0d874e32'] = 'Vous devez spécifier un montant pour les bons de réduction de parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_284033830e0eaf55340844305bf34fdd'] = 'Récompense parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3c5db6c207f700f4f209b43bed966e96'] = 'Suppression de ce fichier impossible :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6c58031e7824c3cd6febc2f2107b0652'] = 'Mise a jour effectuée.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_167579019fe14b4efed431a82985d9ad'] = 'Le nombre de commande est invalide.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ceb0ce9b627fb9a962543f3271da29b1'] = 'La valeur de réduction est invalide'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c96c84a1a64878d4d742daf52e359e36'] = 'Valeur de la réduction pour'; +$_MODULE['<{referralprogram}prestashop>referralprogram_4218c2cb615fbc2870f6b1e8d283ab8d'] = 'est vide.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_bb7476567f5e12e60b01436dad77a533'] = 'est invalide.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_addae886b20a06e2954461706c90cd7d'] = 'Le type de réduction est invalide.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ac3357de2dec8d74d89dd378962ec621'] = 'Le nombre d\'amis est incorrect.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_18d0d79eb088abb4357e3666eec35660'] = 'pourcentage de remise est exigée / non valide.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d31dd445991f35b1ee6491eec7ac71c'] = 'Impossible d\'écrire dans le fichier XML.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_96191c1f54bb6311624210333ef797eb'] = 'Impossible de fermer le fichier XML.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_21cc1fccae3b04bb8cd2719cc5269e1e'] = 'Impossible de mettre à jour le fichier XML. Veuillez vérifier les droits d\'écriture sur le fichier XML.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5be920293db3e38c81330fd0798336b1'] = 'Champ HTML invalide, le Javascript y est interdit.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7ca3288a38b048b0df25394ccc22ad46'] = 'Nombre minimum de commandes qu\'un filleul doit passer afin de recevoir son bon de réduction :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_624f983eb0713e10faf35ff3889e8d68'] = 'Nombre de filleuls dans le formulaire d\'invitation pour parrainage (compte client, section parrainage) :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_9ad4f790c8bb9be21a2fa388c7730353'] = 'Type de bon :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46da7ad7d01e209241016d308f9fafce'] = 'Bon de réduction avec un pourcentage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_97839379a0f447599405341b852e2e24'] = 'Bon de réduction avec un montant (par devise)'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d5a011fdba2979f8d0ffd30b9f5c6ba'] = 'Pourcentage :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_386c339d37e737a436499d423a77df0c'] = 'Devise'; +$_MODULE['<{referralprogram}prestashop>referralprogram_edf7f0a17b8a8f1732f12856fcbc8a6b'] = 'Montant du bon de réduction'; +$_MODULE['<{referralprogram}prestashop>referralprogram_8465d83b5c1b569299af284c14d957bb'] = 'Description du bon :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour les paramètres'; +$_MODULE['<{referralprogram}prestashop>referralprogram_562ad64cf21ac2da656134355115133d'] = 'Vous devez spécifier un texte.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_01705c0177ebf5fbcbf4e882bc454405'] = 'Conditions du programme de parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c5afb9c76a7880978cba32872d01f068'] = 'Mise à jour du texte'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6b31baf25848e7a6563ecc3946626c80'] = 'Programme de parrainage'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7790d51a3d62c85aae65464dee12ee8b'] = 'Parrain du client :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f964f762284ede747ed9f6428a5469b8'] = 'Ce client n\'a aucun parrain.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_53d0d7aba39ee971f7f179e6e1092708'] = 'Filleuls :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_58dc82d3e2e17ced0225064a9b496ee9'] = 'Filleul :'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{referralprogram}prestashop>referralprogram_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram_22ffd0379431f3b615eb8292f6c31d12'] = 'Date d\'enregistrement'; +$_MODULE['<{referralprogram}prestashop>referralprogram_325c8bbd07033a39d25b5c4457f79861'] = 'Clients parrainés par ce filleul'; +$_MODULE['<{referralprogram}prestashop>referralprogram_fc6e0920b914b164802d44220e6163f3'] = 'Nombre de commandes effectuées'; +$_MODULE['<{referralprogram}prestashop>referralprogram_970ad4e4787cc75cd63dbf8d5c757513'] = 'Compte client créé'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5b541747d46b39c37f0e100ddfe44472'] = 'n\'a parrainé aucun filleul pour le moment.'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6b31baf25848e7a6563ecc3946626c80'] = 'Programme de parrainage'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_50b12ad08d38a2b00a790304bbe851be'] = 'Vous avez gagné un bon de réduction d\'une valeur de'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6c8352dbdb1fa1433bd5974c603dced4'] = 'grâce à votre parrain !'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_764a957fffea7861310082f57445c83a'] = 'Saisissez le nom du bon'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_5c24e8005181f1a32b1df54bfe112525'] = 'pour profiter de la réduction sur cette commande.'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_106527986549f3ec8da1ae5a7abde467'] = 'Voir votre programme de parrainage.'; diff --git a/modules/referralprogram/it.php b/modules/referralprogram/it.php new file mode 100644 index 000000000..a90a60a64 --- /dev/null +++ b/modules/referralprogram/it.php @@ -0,0 +1,112 @@ +authentication_6b31baf25848e7a6563ecc3946626c80'] = 'Programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>authentication_8fdb2298a0db461ac64e71192a562ca1'] = 'Indirizzo e-mail della persona che ti ha segnalato'; +$_MODULE['<{referralprogram}prestashop>my-account_6b31baf25848e7a6563ecc3946626c80'] = 'Programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_6a1fc5f99c944639b4005366d393a1ee'] = 'Grazie al tuo ordine, chi ti ha segnalato'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_eb8c6d2e305207c8fbc14a2ebb2e42fc'] = 'guadagnerà un buono del valore di'; +$_MODULE['<{referralprogram}prestashop>order-confirmation_cda09d90a2d64cf06ae6516cc20ae468'] = 'quando l\'ordine sarà confermato.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d3d2e617335f08df83599665eef8a418'] = 'Chiudi'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7a81aa9275331bb0f5e6adb5e8650a03'] = 'o il tasto Esc'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_d95cf4ab2cbf1dfb63f066b50558b07d'] = 'Il mio conto'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6540b502e953f4c05abeb8f234cd50bf'] = 'Programma di Segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b31baf25848e7a6563ecc3946626c80'] = 'Programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dbc65cd60abde51277c2881ce915a225'] = 'È necessario accettare le condizioni del programma di segnalazione!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_83fc792f687bc45d75ac35c84c721a26'] = 'Almeno un indirizzo e-mail non è valido!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1019072b9e450c8652590cda2db45e49'] = 'Almeno un nome o cognome non è valido!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ff2d2e45b90b4426c3bb14bd56b95a2d'] = 'Qualcuno con questo indirizzo e-mail è già stato segnalato!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3f8a4c7f93945fea0d951fa402ee4272'] = 'Spunta almeno una casella '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_dcc99d8715486f570db3ec5ee469a828'] = 'Impossibile aggiungere amici alla banca dati'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_f6cb78f0afcf7c3a06048a7a5855d6a1'] = 'E-mail sono state inviate ai tuoi amici!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_79cd362fc64832faa0a2079f1142aa12'] = 'Una e-mail è stata inviata ad un amico!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2b90ca4a7b1c83e0a3bb65899725cd65'] = 'E-mail di promemoria sono state inviate ai tuoi amici!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_819e52b3c6ca4db131dcfea19188a0c3'] = 'Una mail di promemoria è stata inviata ad un amico!'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_46ee2fe8845962d24bf5178a26e109f3'] = 'Segnala i miei amici'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_c56567bc42584de1a7ac430039b3a87e'] = 'Amici in attesa'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_58c7f2542ab2e2c3e4e39e851ea0f225'] = 'Amici che ho segnalato'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_00c2fab6945aadad3e822d8f38e18ce7'] = 'Ottieni uno sconto di'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_2dd74a0c7eda49de19eeaed3e1988e8f'] = 'per te e i tuoi amici segnalando questo sito web.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3ae82bfa996855cdf841dd9e15a7e3'] = 'È veloce ed è facile. Basta compilare il nome, cognome e indirizzo/i di posta elettronica del tuo amico/amici nei campi sottostanti.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9cee6c57b3003b3068177fa913f56468'] = 'Quando uno di loro fa almeno'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_12c500ed0b7879105fb46af0f246be87'] = 'ordini'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_70a17ffa722a3985b86d30b034ad06d7'] = 'ordine'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_08b002301ef588d9cb9d7b009df2d1e1'] = 'lui o lei riceverà un'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ae01c01c004a8c391d1b9ecd6949f9f8'] = 'buono e riceverai il tuo buono del valore di '; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d3f5eff9c40ee315d452392bed5309b'] = 'Cognome'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_20db0bfeecd8fe60533206a2b5e9891a'] = 'Nome'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_1e884e3078d9978e216a027ecd57fb34'] = 'E-mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9386de858384e7f790a28beecdb986dd'] = 'Importante: gli indirizzi e-mail dei tuoi amici saranno utilizzati solo nel programma di segnalazione. Non saranno mai utilizzati per altri scopi.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_605eef3cad421619ce034ab48415190f'] = 'Accetto i termini del servizio e vi aderisco incondizionatamente.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_6b719c160f9b08dad4760bcc4b52ed48'] = 'Condizioni del programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_868ca5fe643791c23b47c75fb833c9b8'] = 'Leggi le condizioni.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_31fde7b05ac8952dacf4af8a704074ec'] = 'Anteprima'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8e8dc296c6bf3876468aa028974bfebe'] = 'Invito e-mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_a86073a0c3b0bebf11bd807caf8e505a'] = 'l\'e-mail di default'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_7532696b81dfc0b94a37e876677152c5'] = 'che sarà inviata al tuo amico/amici.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ad3d06d03d94223fa652babc913de686'] = 'Convalida'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_59352cd5314a67c0fb10c964831920f3'] = 'Per diventare un segnalatore, è necessario aver completato almeno'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_ec7342814444c667ab93181b30b28e38'] = 'Questi amici non hanno ancora effettuato un ordine su questo sito da quando li hai segnalati, ma puoi provare di nuovo! Per farlo, spunta le caselle degli amici che desideri ricordare, quindi fare clic sul pulsante \"Ricorda il mio amico/i\"'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3e717a04ff77cd5fa068d8ad9d3facc8'] = 'ultimo invito'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_9c9d4ed270f02c72124702edb192ff19'] = 'Ricorda il mio amico/i'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8b9f390369560635a2ba5ba271d953df'] = 'Non hai segnalato nessun amico.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_193f3d8bbaceba40499cab1a3545e9e8'] = 'Ecco gli amici segnalati che hanno accettato il tuo invito:'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_3c648ba41cfb45f13b083a9cbbacdfdf'] = 'Data di iscrizione'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8d4e5c2bc4c3cf67d2b59b263a707cb6'] = 'Nessun amico segnalato ha ancora accettato il tuo invito.'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_0b3db27bc15f682e92ff250ebb167d4b'] = 'Torna al tuo account'; +$_MODULE['<{referralprogram}prestashop>referralprogram-program_8cf04a9734132302f96da8e113e80ce5'] = 'Home'; +$_MODULE['<{referralprogram}prestashop>referralprogram-rules_01705c0177ebf5fbcbf4e882bc454405'] = 'Regole programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6b31baf25848e7a6563ecc3946626c80'] = 'Programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_50b12ad08d38a2b00a790304bbe851be'] = 'Hai guadagnato un buono del valore'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_6c8352dbdb1fa1433bd5974c603dced4'] = 'grazie al tuo sponsor!'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_764a957fffea7861310082f57445c83a'] = 'Inserisci il nome del buono'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_5c24e8005181f1a32b1df54bfe112525'] = 'per ricevere lo sconto su questo ordine.'; +$_MODULE['<{referralprogram}prestashop>shopping-cart_106527986549f3ec8da1ae5a7abde467'] = 'Visualizza il tuo programma di segnalazione.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_40604a195d001353d697b0fd26f5d8fe'] = 'Tutti gli sponsor e gli amici saranno cancellati. Sei sicuro di voler disinstallare questo modulo?'; +$_MODULE['<{referralprogram}prestashop>referralprogram_83090230d3c11aa76851030eba008a71'] = 'Programma segnalazione clienti'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46a3a666d8823b972af8018a5242a3ac'] = 'Integra un sistema di programma di segnalazione nel tuo negozio.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_d59ce2e96c0c2362a0a4269e0d874e32'] = 'Devi specificare una quantità di buoni programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram_284033830e0eaf55340844305bf34fdd'] = 'Ricompensa segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3c5db6c207f700f4f209b43bed966e96'] = 'Non è possibile eliminare questo file:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6c58031e7824c3cd6febc2f2107b0652'] = 'Configurazione aggiornata.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_167579019fe14b4efed431a82985d9ad'] = 'la quantità di ordine è necessaria / non valida.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ceb0ce9b627fb9a962543f3271da29b1'] = 'Valore di sconto non valido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c96c84a1a64878d4d742daf52e359e36'] = 'valore di sconto per la valuta n.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_4218c2cb615fbc2870f6b1e8d283ab8d'] = 'è vuoto.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_bb7476567f5e12e60b01436dad77a533'] = 'non è valido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_addae886b20a06e2954461706c90cd7d'] = 'tipo di sconto è richiesto / non valido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ac3357de2dec8d74d89dd378962ec621'] = 'Numero di amici è richiesto / non valido.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d31dd445991f35b1ee6491eec7ac71c'] = 'Impossibile scrivere il file xml.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_96191c1f54bb6311624210333ef797eb'] = 'Impossibile chiudere il file xml.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_21cc1fccae3b04bb8cd2719cc5269e1e'] = 'Impossibile aggiornare il file xml. Si prega di controllare i permessi di scrittura del file XML.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5be920293db3e38c81330fd0798336b1'] = 'Campo html non valido, javascript è vietato'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7ca3288a38b048b0df25394ccc22ad46'] = 'Numero minimo di ordini che un amico segnalato deve eseguire per ottenere il voucher:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_624f983eb0713e10faf35ff3889e8d68'] = 'Numero di amici nel modulo di invito del programma di segnalazione (conto del cliente, sezione programma di segnalazione):'; +$_MODULE['<{referralprogram}prestashop>referralprogram_9ad4f790c8bb9be21a2fa388c7730353'] = 'Tipo di buono:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_46da7ad7d01e209241016d308f9fafce'] = 'Buono che offre una percentuale'; +$_MODULE['<{referralprogram}prestashop>referralprogram_97839379a0f447599405341b852e2e24'] = 'Buono che offre un importo fisso (per valuta)'; +$_MODULE['<{referralprogram}prestashop>referralprogram_3d5a011fdba2979f8d0ffd30b9f5c6ba'] = 'Percentuale:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_386c339d37e737a436499d423a77df0c'] = 'Valuta'; +$_MODULE['<{referralprogram}prestashop>referralprogram_edf7f0a17b8a8f1732f12856fcbc8a6b'] = 'Importo buono'; +$_MODULE['<{referralprogram}prestashop>referralprogram_8465d83b5c1b569299af284c14d957bb'] = 'Descrizione buono:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{referralprogram}prestashop>referralprogram_562ad64cf21ac2da656134355115133d'] = 'Il testo è vuoto.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_01705c0177ebf5fbcbf4e882bc454405'] = 'Regole programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram_c5afb9c76a7880978cba32872d01f068'] = 'Aggiorna il testo'; +$_MODULE['<{referralprogram}prestashop>referralprogram_6b31baf25848e7a6563ecc3946626c80'] = 'Programma di segnalazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram_7790d51a3d62c85aae65464dee12ee8b'] = 'Sponsor del cliente.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_f964f762284ede747ed9f6428a5469b8'] = 'Nessuno ha segnalato questo cliente.'; +$_MODULE['<{referralprogram}prestashop>referralprogram_53d0d7aba39ee971f7f179e6e1092708'] = 'clienti segnalati:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_58dc82d3e2e17ced0225064a9b496ee9'] = 'cliente segnalato:'; +$_MODULE['<{referralprogram}prestashop>referralprogram_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{referralprogram}prestashop>referralprogram_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{referralprogram}prestashop>referralprogram_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{referralprogram}prestashop>referralprogram_22ffd0379431f3b615eb8292f6c31d12'] = 'Data di registrazione'; +$_MODULE['<{referralprogram}prestashop>referralprogram_325c8bbd07033a39d25b5c4457f79861'] = 'Clienti segnalati da questo amico'; +$_MODULE['<{referralprogram}prestashop>referralprogram_fc6e0920b914b164802d44220e6163f3'] = 'Ordini effettuati'; +$_MODULE['<{referralprogram}prestashop>referralprogram_970ad4e4787cc75cd63dbf8d5c757513'] = 'Account cliente creato'; +$_MODULE['<{referralprogram}prestashop>referralprogram_5b541747d46b39c37f0e100ddfe44472'] = 'non ha ancora segnalato alcun amico.'; + +?> \ No newline at end of file diff --git a/modules/referralprogram/logo.gif b/modules/referralprogram/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..85de792287d846f3e7502afdac0fd02f40ecdce4 GIT binary patch literal 1051 zcmZ?wbhEHb6krfwcs`54-rn932%KFVTs+*|+`PQJyuH1Be0+hxGcYDaSkadDHEa{gVP(6QZrLiQzykbPKtHb zty3>fiJcoSnx3AXkeO?ee{x!a^VCGAsfjLGSvlF+*;(0nX*mUsMcYF2x6DX)nVGFz zSXekKGa#t=Y;ke%{CuU7va-aw#E9AnUiB+0Dk>@~E0-3BM%JB}RGvMlJZExcTwQJX ztm=s6RgPtC#Z663wQV(xEp7Gf)h!*(iPIA5drH?eB=2uF?CI)Q(^}Zu+uPMYgu3dX=Sst3W zJzZz=Y_0W~HIpk(W_2Get3I98e7fNI+TxD0MUOW&cAhQmJ6rgCQ*Hmbif21gr=Kg| zyLa#W3pEE19z1mD(Cz)pj~qGj{J^A*SC_25G56!qX`hcx`*x!D+_`hFPA`9Qe%q$& zf6raM{QSa>PZ!txzOeAxjjLa;Z1{V9-QBx)U%Ytne-w}y0*e0xor_WvOHxx5$}>wc z6x=<10~i#4vM_Qn{AbW%00K}(Vc>Yo@Sju0Lcn{bfiZ`ch{drUXJb7vJ{G~}{K}S@ zn><7`949Gxb<64A)Cf4c#CsZFWJE+0Gbg*vhZip|FKu)ZmMBW<2y*ojaw)LkS;FAl zDJ?4-#ldt$-G7m;0E?f-7sC_*`|5W$7B(L_?O@t>!r(^b literal 0 HcmV?d00001 diff --git a/modules/referralprogram/mails/de/referralprogram-congratulations.html b/modules/referralprogram/mails/de/referralprogram-congratulations.html new file mode 100644 index 000000000..95887d060 --- /dev/null +++ b/modules/referralprogram/mails/de/referralprogram-congratulations.html @@ -0,0 +1,46 @@ + + + + + Nachricht von {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Herzlichen Glückwunsch!
     
    Ihr empfohlener Freund, {sponsored_firstname} {sponsored_lastname} hat seine erste Bestellung bei {shop_name} ausgeführt!
     
    Wir freuen uns, Ihnen einen Gutschein über {discount_display} (voucher # {discount_name}) schenken zu dürfen, den Sie bei Ihrer nächsten Bestellung einlösen können.
     
    Mit freundlichen Grüßen,
     
    {shop_name} powered by PrestaShop™
    + + \ No newline at end of file diff --git a/modules/referralprogram/mails/de/referralprogram-congratulations.txt b/modules/referralprogram/mails/de/referralprogram-congratulations.txt new file mode 100644 index 000000000..1faced01c --- /dev/null +++ b/modules/referralprogram/mails/de/referralprogram-congratulations.txt @@ -0,0 +1,8 @@ +Herzlichen Glückwunsch! + +Ihr empfohlener Freund, {sponsored_firstname} {sponsored_lastname} hat seine erste Bestellung bei {shop_url} ausgeführt ! + +Wir freuen uns, Ihnen einen Gutschein über {discount_display} (voucher # {discount_name}) schenken zu dürfen, den Sie bei Ihrer nächsten Bestellung einlösen können. + + +{shop_name} powered with PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/de/referralprogram-invitation.html b/modules/referralprogram/mails/de/referralprogram-invitation.html new file mode 100644 index 000000000..b3b758583 --- /dev/null +++ b/modules/referralprogram/mails/de/referralprogram-invitation.html @@ -0,0 +1,58 @@ + + + + + Nachricht von {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    {firstname_friend} {lastname_friend}, machen Sie mit!
     
    Ihr Freund {firstname} {lastname} möchte Sie empfehlen auf {shop_name}!
     
    Lassen Sie sich empfehlen und erhalten Sie einen Ermäßigungsgutschein {discount}!
     
    Klicken Sie einfach hier, um sich anzumelden!
     
    Vergessen Sie bei der Anmeldung bitte nicht, die E-Mail-Adresse Ihres Freundes anzugeben: {email}.
     
    Mit freundlichen Grüßen,
     
    {shop_name} powered by PrestaShop™
    + + \ No newline at end of file diff --git a/modules/referralprogram/mails/de/referralprogram-invitation.txt b/modules/referralprogram/mails/de/referralprogram-invitation.txt new file mode 100644 index 000000000..2ecaf353b --- /dev/null +++ b/modules/referralprogram/mails/de/referralprogram-invitation.txt @@ -0,0 +1,12 @@ +{firstname_friend} {lastname_friend}, machen Sie mit! + +Ihr Freund {firstname} {lastname} möchte Sie empfehlen auf {shop_url}. + +Lassen Sie sich empfehlen und erhalten Sie einen Ermäßigungsgutschein {discount}! + +Klicken Sie einfach hier, um sich anzumelden! +{shop_url}{link} + +Vergessen Sie bei der Anmeldung bitte nicht, die E-Mail-Adresse Ihres Freundes anzugeben: {email}. + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/de/referralprogram-voucher.html b/modules/referralprogram/mails/de/referralprogram-voucher.html new file mode 100644 index 000000000..ad9756925 --- /dev/null +++ b/modules/referralprogram/mails/de/referralprogram-voucher.html @@ -0,0 +1,46 @@ + + + + + Nachricht von {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Hallo {firstname} {lastname},
     
    Empfehlungsprogramm
     
    Wir freuen uns, Ihnen mitteilen zu können, dass ein Gutschein auf Ihren Namen in Ihrer Bestellung Nr. {id_order} zur Verfügung steht.
     
    Hier ist der Code für Ihren Gutschein: {voucher_num} über {voucher_amount}.
    Bitte kopieren Sie diesen Code einfach und setzen ihn beim Zahlungsvorgang Ihrer nächsten Bestellung ein.
     
    {shop_name} powered by PrestaShop™
    + + \ No newline at end of file diff --git a/modules/referralprogram/mails/de/referralprogram-voucher.txt b/modules/referralprogram/mails/de/referralprogram-voucher.txt new file mode 100644 index 000000000..76cf25adb --- /dev/null +++ b/modules/referralprogram/mails/de/referralprogram-voucher.txt @@ -0,0 +1,12 @@ +Hallo {firstname} {lastname}, + +Wir freuen uns, Ihnen mitteilen zu können, dass ein Gutschein auf Ihren Namen in Ihrer Bestellung Nr. {id_order} zur Verfügung steht. + +Hier ist der Code für Ihren Gutschein: {voucher_num} über {voucher_amount}. +Bitte kopieren Sie diesen Code einfach und setzen ihn beim Zahlungsvorgang Ihrer nächsten Bestellung ein. + +Danke für Ihren Kauf bei {shop_name}. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-congratulations.html b/modules/referralprogram/mails/en/referralprogram-congratulations.html new file mode 100644 index 000000000..d1851bfab --- /dev/null +++ b/modules/referralprogram/mails/en/referralprogram-congratulations.html @@ -0,0 +1,40 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Congratulations!
     
    Your sponsored friend, {sponsored_firstname} {sponsored_lastname} has placed his or her first order on {shop_name}!
     
    + We are pleased to offer you a voucher worth {discount_display} (voucher # {discount_name}) that you can use on your next order. +
     
    Best regards,
     
    + {shop_name} powered by PrestaShop™ +
    + + diff --git a/modules/referralprogram/mails/en/referralprogram-congratulations.txt b/modules/referralprogram/mails/en/referralprogram-congratulations.txt new file mode 100644 index 000000000..5aa39b3c8 --- /dev/null +++ b/modules/referralprogram/mails/en/referralprogram-congratulations.txt @@ -0,0 +1,9 @@ +Congratulations! + +Your sponsored friend, {sponsored_firstname} {sponsored_lastname} has placed his or her first order on {shop_url} ! + +We are pleased to offer you a voucher worth {discount_display} (voucher # {discount_name}) that you can use on your next order. + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-invitation.html b/modules/referralprogram/mails/en/referralprogram-invitation.html new file mode 100644 index 000000000..7f0fe9125 --- /dev/null +++ b/modules/referralprogram/mails/en/referralprogram-invitation.html @@ -0,0 +1,52 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    {firstname_friend} {lastname_friend}, join us!
     
    Your friend {firstname} {lastname} wants to sponsor you on {shop_name}!
     
    + Get sponsored and win a discount voucher of {discount}! +
     
    + It's very easy to sign up. Just click here! +
     
    + When signing up, don't forget to provide the e-mail address of your sponsoring friend: {email}. +
     
    Best regards,
     
    + {shop_name} powered by PrestaShop™ +
    + + diff --git a/modules/referralprogram/mails/en/referralprogram-invitation.txt b/modules/referralprogram/mails/en/referralprogram-invitation.txt new file mode 100644 index 000000000..63b5ce03d --- /dev/null +++ b/modules/referralprogram/mails/en/referralprogram-invitation.txt @@ -0,0 +1,15 @@ +{firstname_friend} {lastname_friend}, join us! + +Your friend {firstname} {lastname} wants to sponsor you on {shop_url}. + +Get sponsored and win a discount voucher of {discount}! + +It's very easy to sign up. Just click on the following link: + +{shop_url}{link} + +When signing up, don't forget to provide the e-mail address of your sponsoring friend: {email}. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/en/referralprogram-voucher.html b/modules/referralprogram/mails/en/referralprogram-voucher.html new file mode 100644 index 000000000..aa18b52b4 --- /dev/null +++ b/modules/referralprogram/mails/en/referralprogram-voucher.html @@ -0,0 +1,42 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Hi {firstname} {lastname},
     
    Sponsorship Program
     
    + We inform you about the generation of a voucher to your name regarding your sponsorship. +
     
    + Here is the code of your voucher : {voucher_num}, with an amount of {voucher_amount}.
    + Simply copy/paste this code during the payment process for your next order. +
     
    + {shop_name} powered by PrestaShop™ +
    + diff --git a/modules/referralprogram/mails/en/referralprogram-voucher.txt b/modules/referralprogram/mails/en/referralprogram-voucher.txt new file mode 100644 index 000000000..35f224710 --- /dev/null +++ b/modules/referralprogram/mails/en/referralprogram-voucher.txt @@ -0,0 +1,12 @@ +Hi {firstname} {lastname}, + +We inform you about the generation of a voucher to your name regarding your sponsorship. + +Here is the code of your voucher : {voucher_num}, with an amount of {voucher_amount}. +Simply copy/paste this code during the payment process for your next order. + +Thank you for shopping at {shop_name}. + + + +{shop_url} powered by PrestaShop™ diff --git a/modules/referralprogram/mails/es/referralprogram-congratulations.html b/modules/referralprogram/mails/es/referralprogram-congratulations.html new file mode 100755 index 000000000..ff6a80c1b --- /dev/null +++ b/modules/referralprogram/mails/es/referralprogram-congratulations.html @@ -0,0 +1,47 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    ¡Felicidades!
     
    ¡Su ahijado {sponsored_firstname} {sponsored_lastname} hizo su primera compra en nuestro sitio {shop_name} !
     
    Estamos encantados de ofrecerle un vale {discount_display} (con el código de cupón: {discount_name}), usted puede utilizar durante su próxima compra.
     
    Atentamente,
     
    {shop_name} dirigida por PrestaShop™
    + + + \ No newline at end of file diff --git a/modules/referralprogram/mails/es/referralprogram-congratulations.txt b/modules/referralprogram/mails/es/referralprogram-congratulations.txt new file mode 100755 index 000000000..a7123299a --- /dev/null +++ b/modules/referralprogram/mails/es/referralprogram-congratulations.txt @@ -0,0 +1,9 @@ +¡Felicidades! + +¡Su ahijado {sponsored_firstname} {sponsored_lastname} hizo su primera compra en nuestro sitio {shop_url}! + +Estamos encantados de ofrecerle un vale {discount_display} (con el código de cupón: {discount_name}), usted puede utilizar durante su próxima compra. + + + +{shop_url} dirigida por PrestaShop™ diff --git a/modules/referralprogram/mails/es/referralprogram-invitation.html b/modules/referralprogram/mails/es/referralprogram-invitation.html new file mode 100755 index 000000000..ecf94a3cd --- /dev/null +++ b/modules/referralprogram/mails/es/referralprogram-invitation.html @@ -0,0 +1,59 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    ¡{firstname_friend} {lastname_friend}, Únete a nosotros!
     
    Su amigo {firstname} {lastname} patrocinado por usted en el sitio {shop_name} !
     
    ¡Conviértete en su ahijado, para ganar un bono de {discount}!
     
    ¡Para nosotros, nada más simple, haga clic aquí!
     
    Recuerde que debe especificar el correo electrónico a tu amigo como patrocinador en el registro: {email}.
     
    Atentamente,
     
    {shop_name} dirigida por PrestaShop™
    + + + \ No newline at end of file diff --git a/modules/referralprogram/mails/es/referralprogram-invitation.txt b/modules/referralprogram/mails/es/referralprogram-invitation.txt new file mode 100755 index 000000000..9c5700640 --- /dev/null +++ b/modules/referralprogram/mails/es/referralprogram-invitation.txt @@ -0,0 +1,15 @@ +¡{firstname_friend} {lastname_friend}, Únete a nosotros! + +Su amigo {firstname} {lastname} patrocinado por usted en el sitio {shop_url}. + +¡Conviértete en su ahijado, para ganar un bono de {discount}! + +Para nosotros, nada más simple, vaya a abordar los siguientes: + +{shop_url}{link} + +Recuerde que debe especificar el correo electrónico a tu amigo como patrocinador en el registro: {email}. + + + +{shop_url} dirigida por PrestaShop™ diff --git a/modules/referralprogram/mails/es/referralprogram-voucher.html b/modules/referralprogram/mails/es/referralprogram-voucher.html new file mode 100755 index 000000000..f4a207f0b --- /dev/null +++ b/modules/referralprogram/mails/es/referralprogram-voucher.html @@ -0,0 +1,47 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Hola {firstname} {lastname},
     
    Programa de Patrocinio
     
    Le informamos de que usted acaba de obtener una orden de compra después de su remisión.
     
    Aquí está su número de comprobante: {voucher_num}, de un total de {voucher_amount} euros.
    Copia y pega este código en la canasta de tu próxima compra antes de ajustar el orden.
     
    {shop_name} dirigida por PrestaShop™
    + + + \ No newline at end of file diff --git a/modules/referralprogram/mails/es/referralprogram-voucher.txt b/modules/referralprogram/mails/es/referralprogram-voucher.txt new file mode 100755 index 000000000..d7779a26d --- /dev/null +++ b/modules/referralprogram/mails/es/referralprogram-voucher.txt @@ -0,0 +1,10 @@ +Hola {firstname} {lastname}, + +Le informamos de que usted acaba de obtener una orden de compra después de su remisión. + +Aquí está su número de comprobante: {voucher_num}, de un total de {voucher_amount} euros. +Copia y pega este código en la canasta de tu próxima compra antes de ajustar el orden. + + + +{shop_url} dirigida por PrestaShop™ diff --git a/modules/referralprogram/mails/fr/referralprogram-congratulations.html b/modules/referralprogram/mails/fr/referralprogram-congratulations.html new file mode 100644 index 000000000..a5f847fcd --- /dev/null +++ b/modules/referralprogram/mails/fr/referralprogram-congratulations.html @@ -0,0 +1,40 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Félicitations !
     
    Votre filleul(e) {sponsored_firstname} {sponsored_lastname} a effectué son premier achat sur {shop_name} !
     
    + Nous avons le plaisir de vous offrir un bon d'achat de {discount_display} (bon de réduction avec le code {discount_name}), que vous pourrez utiliser à l'occasion de votre prochaine commande. +
     
    Bien cordialement,
     
    + {shop_name} propulsé par PrestaShop™ +
    + + diff --git a/modules/referralprogram/mails/fr/referralprogram-congratulations.txt b/modules/referralprogram/mails/fr/referralprogram-congratulations.txt new file mode 100644 index 000000000..e1f74e4b2 --- /dev/null +++ b/modules/referralprogram/mails/fr/referralprogram-congratulations.txt @@ -0,0 +1,9 @@ +Félicitations ! + +Votre filleul(e) {sponsored_firstname} {sponsored_lastname} a effectué son premier achat sur notre site {shop_url} ! + +Nous avons le plaisir de vous offrir un bon d'achat de {discount_display} (bon de réduction avec le code : {discount_name}), que vous pourrez utiliser à l'occasion de votre prochaine commande. + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/fr/referralprogram-invitation.html b/modules/referralprogram/mails/fr/referralprogram-invitation.html new file mode 100644 index 000000000..1e36c256b --- /dev/null +++ b/modules/referralprogram/mails/fr/referralprogram-invitation.html @@ -0,0 +1,52 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    {firstname_friend} {lastname_friend}, rejoignez-nous !
     
    Votre ami(e) {firstname} {lastname} vous a parrainé depuis le site {shop_name} !
     
    + Devenez son(sa) filleul(e) afin de gagner un bon d'achat de {discount}! +
     
    + Pour nous rejoindre, rien de plus simple, cliquez-ici ! +
     
    + N'oubliez pas d'y préciser l'email de votre ami en tant que parrain lors de votre inscription : {email}. +
     
    Bien cordialement,
     
    + {shop_name} propulsé par PrestaShop™ +
    + + diff --git a/modules/referralprogram/mails/fr/referralprogram-invitation.txt b/modules/referralprogram/mails/fr/referralprogram-invitation.txt new file mode 100644 index 000000000..e2a2f764d --- /dev/null +++ b/modules/referralprogram/mails/fr/referralprogram-invitation.txt @@ -0,0 +1,15 @@ +{firstname_friend} {lastname_friend}, rejoignez-nous ! + +Votre ami(e) {firstname} {lastname} vous a parrainé depuis le site {shop_url}. + +Devenez son(sa) filleul(e) afin de gagner un bon d'achat de {discount}! + +Pour nous rejoindre, rien de plus simple, rendez-vous à l'adresse suivante : + +{shop_url}{link} + +N'oubliez pas d'y préciser l'email de votre ami en tant que parrain lors de votre inscription : {email}. + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/fr/referralprogram-voucher.html b/modules/referralprogram/mails/fr/referralprogram-voucher.html new file mode 100644 index 000000000..adb10c960 --- /dev/null +++ b/modules/referralprogram/mails/fr/referralprogram-voucher.html @@ -0,0 +1,43 @@ + + + + + Message de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Bonjour {firstname} {lastname},
     
    Programme de Parrainage
     
    + Nous vous informons de la génération d'un bon de réduction à votre nom relatif à votre parrainage. +
     
    + Voici le numéro de votre bon de réduction : {voucher_num}, d'un montant total de {voucher_amount}.
    + Copiez-collez ce code dans le panier de votre prochain achat avant de régler la commande. +
     
    + {shop_name} propulsé par PrestaShop™ +
    + + diff --git a/modules/referralprogram/mails/fr/referralprogram-voucher.txt b/modules/referralprogram/mails/fr/referralprogram-voucher.txt new file mode 100644 index 000000000..59b8b712b --- /dev/null +++ b/modules/referralprogram/mails/fr/referralprogram-voucher.txt @@ -0,0 +1,10 @@ +Bonjour {firstname} {lastname}, + +Nous vous informons que vous venez d'obtenir un bon d'achat suite à votre parrainage. + +Voici le numéro de votre bon : {voucher_num}, d'un montant total de {voucher_amount}. +Copiez-collez ce code dans le panier de votre prochain achat avant de régler la commande. + + + +{shop_url} réalisé par PrestaShop™ diff --git a/modules/referralprogram/mails/it/referralprogram-congratulations.html b/modules/referralprogram/mails/it/referralprogram-congratulations.html new file mode 100644 index 000000000..4086b3f67 --- /dev/null +++ b/modules/referralprogram/mails/it/referralprogram-congratulations.html @@ -0,0 +1,46 @@ + + + + + Messaggio da {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
    Congratulazioni!
    L'amico che hai presentato, {sponsored_firstname} {sponsored_lastname} ha effettuato il suo primo ordine su {shop_name}!
    Siamo lieti di offrirti un buono sconto del valore di {discount_display} (voucher # {discount_name}) che potrai utilizzare sul tuo prossimo ordine.
    Cordialmente,
    {shop_name} powered by PrestaShop™
    + + \ No newline at end of file diff --git a/modules/referralprogram/mails/it/referralprogram-congratulations.txt b/modules/referralprogram/mails/it/referralprogram-congratulations.txt new file mode 100644 index 000000000..a176f8003 --- /dev/null +++ b/modules/referralprogram/mails/it/referralprogram-congratulations.txt @@ -0,0 +1,9 @@ +Congratulazioni! + +L'amico che hai presentato, {sponsored_firstname} {sponsored_lastname} ha effettuato il suo primo ordine su {shop_url} ! + +Siamo lieti di offrirti un buono sconto del valore di {discount_display} (voucher # {discount_name}) che puoi utilizzare sul tuo prossimo ordine. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/it/referralprogram-invitation.html b/modules/referralprogram/mails/it/referralprogram-invitation.html new file mode 100644 index 000000000..804a02681 --- /dev/null +++ b/modules/referralprogram/mails/it/referralprogram-invitation.html @@ -0,0 +1,58 @@ + + + + + Messaggio da {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
    {firstname_friend} {lastname_friend}, iscriviti!
    Il tuo amico {firstname} {lastname} vuole presentarti su {shop_name}!
    Fatti presentare e vinci un buono sconto di {discount}!
    E' facilissimo iscriversi. Basta cliccare qui!
    Quando ti iscrivi, non dimenticare di indicare la mail dell'amico/a che ti ha presentato: {email}.
    Cordialmente,
    {shop_name} powered by PrestaShop™
    + + \ No newline at end of file diff --git a/modules/referralprogram/mails/it/referralprogram-invitation.txt b/modules/referralprogram/mails/it/referralprogram-invitation.txt new file mode 100644 index 000000000..9685bd37d --- /dev/null +++ b/modules/referralprogram/mails/it/referralprogram-invitation.txt @@ -0,0 +1,15 @@ +{firstname_friend} {lastname_friend}, iscriviti! + +Il tuo amico {firstname} {lastname} vuole presentarti su {shop_url}. + +Fatti presentare e vinci un buono sconto di {discount}! + +E' facilissimo iscriversi. Basta cliccare nel link seguente: + +{shop_url}{link} + +Quando ti iscrivi, non dimenticare di indicare la mail dell'amico/a che ti ha presentato: {email}. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/mails/it/referralprogram-voucher.html b/modules/referralprogram/mails/it/referralprogram-voucher.html new file mode 100644 index 000000000..6663b03aa --- /dev/null +++ b/modules/referralprogram/mails/it/referralprogram-voucher.html @@ -0,0 +1,46 @@ + + + + + Messaggio da {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
    Salve {firstname} {lastname},
    Programma di presentazione
    Siamo lieti di informarti che è disponibile un buono sconto a tuo nome per il tuo ordine n.{id_order}.
    Ecco il codice del tuo buono: {voucher_num}, per un importo di {voucher_amount}.
    Basta che nel processo di pagamento del tuo prossimo ordine tu copi/incolli questo codice.
    {shop_name} powered by PrestaShop™
    + + \ No newline at end of file diff --git a/modules/referralprogram/mails/it/referralprogram-voucher.txt b/modules/referralprogram/mails/it/referralprogram-voucher.txt new file mode 100644 index 000000000..2049b7615 --- /dev/null +++ b/modules/referralprogram/mails/it/referralprogram-voucher.txt @@ -0,0 +1,12 @@ +Salve {firstname} {lastname}, + +Siamo lieti di informarti che è disponibile un buono sconto a tuo nome per il tuo ordine n.{id_order}. + +Ecco il codice del tuo buono: {voucher_num}, per un importo di {voucher_amount}. +Basta che nel processo di pagamento del tuo prossimo ordine copi/incolli questo codice. + +Grazie di aver acquistato su {shop_name}. + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/referralprogram/my-account.tpl b/modules/referralprogram/my-account.tpl new file mode 100644 index 000000000..c78c62a65 --- /dev/null +++ b/modules/referralprogram/my-account.tpl @@ -0,0 +1,29 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + +
  • {l s='Referral program' mod='referralprogram'}{l s='Referral program' mod='referralprogram'}
  • + \ No newline at end of file diff --git a/modules/referralprogram/order-confirmation.tpl b/modules/referralprogram/order-confirmation.tpl new file mode 100644 index 000000000..bcda8e4ac --- /dev/null +++ b/modules/referralprogram/order-confirmation.tpl @@ -0,0 +1,30 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + {l s='Thanks to your order, your sponsor' mod='referralprogram'} {$sponsor_firstname} {$sponsor_lastname} {l s='will earn a voucher worth' mod='referralprogram'} {$discount} {l s='off when this order is confirmed.' mod='referralprogram'} +

    +
    \ No newline at end of file diff --git a/modules/referralprogram/preview-email.php b/modules/referralprogram/preview-email.php new file mode 100644 index 000000000..82ab8da42 --- /dev/null +++ b/modules/referralprogram/preview-email.php @@ -0,0 +1,56 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once('../../config/config.inc.php'); +require_once('../../init.php'); +/* +if (!$cookie->isLogged()) + Tools::redirect('../../authentication.php?back=modules/referralprogram/referralprogram-program.php'); +*/ +$shop_name = htmlentities(Configuration::get('PS_SHOP_NAME'), NULL, 'utf-8'); +$shop_url = Tools::getHttpHost(true, true); +$customer = new Customer((int)($cookie->id_customer)); + +if (!preg_match("#.*\.html$#Ui", Tools::getValue('mail')) OR !preg_match("#.*\.html$#Ui", Tools::getValue('mail'))) + die(Tools::displayError()); + +$file = file_get_contents(dirname(__FILE__).'/mails/'.strval(preg_replace('#\.{2,}#', '.', Tools::getValue('mail')))); + +$file = str_replace('{shop_name}', $shop_name, $file); +$file = str_replace('{shop_url}', $shop_url.__PS_BASE_URI__, $file); +$file = str_replace('{shop_logo}', $shop_url._PS_IMG_.'logo.jpg', $file); +$file = str_replace('{firstname}', $customer->firstname, $file); +$file = str_replace('{lastname}', $customer->lastname, $file); +$file = str_replace('{email}', $customer->email, $file); +$file = str_replace('{firstname_friend}', 'XXXXX', $file); +$file = str_replace('{lastname_friend}', 'xxxxxx', $file); +$file = str_replace('{link}', 'authentication.php?create_account=1', $file); +$file = str_replace('{discount}', Discount::display((float)(Configuration::get('REFERRAL_DISCOUNT_VALUE_' . $cookie->id_currency)), (int)(Configuration::get('REFERRAL_DISCOUNT_TYPE')), new Currency($cookie->id_currency)), $file); + +echo $file; + + diff --git a/modules/referralprogram/referralprogram-program.php b/modules/referralprogram/referralprogram-program.php new file mode 100644 index 000000000..55a9dfed3 --- /dev/null +++ b/modules/referralprogram/referralprogram-program.php @@ -0,0 +1,192 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/* SSL Management */ +$useSSL = true; +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); + +include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + +if (!$cookie->isLogged()) + Tools::redirect('index.php?controller=authentication&back=modules/referralprogram/referralprogram-program.php'); + +Tools::addCSS(_PS_CSS_DIR_.'thickbox.css', 'all'); +Tools::addJS(array(_PS_JS_DIR_.'jquery/thickbox-modified.js',_PS_JS_DIR_.'jquery/jquery.idTabs.modified.js')); + +include(dirname(__FILE__).'/../../header.php'); + +// get discount value (ready to display) +$discount = Discount::display((float)(Configuration::get('REFERRAL_DISCOUNT_VALUE_'.(int)($cookie->id_currency))), (int)(Configuration::get('REFERRAL_DISCOUNT_TYPE')), new Currency($cookie->id_currency)); + +$activeTab = 'sponsor'; +$error = false; + +// Mailing invitation to friend sponsor +$invitation_sent = false; +$nbInvitation = 0; +if (Tools::isSubmit('submitSponsorFriends') AND Tools::getValue('friendsEmail') AND sizeof($friendsEmail = Tools::getValue('friendsEmail')) >= 1) +{ + $activeTab = 'sponsor'; + if (!Tools::getValue('conditionsValided')) + $error = 'conditions not valided'; + else + { + $friendsLastName = Tools::getValue('friendsLastName'); + $friendsFirstName = Tools::getValue('friendsFirstName'); + $mails_exists = array(); + foreach ($friendsEmail AS $key => $friendEmail) + { + $friendEmail = strval($friendEmail); + $friendLastName = strval($friendsLastName[$key]); + $friendFirstName = strval($friendsFirstName[$key]); + + if (empty($friendEmail) AND empty($friendLastName) AND empty($friendFirstName)) + continue; + elseif (empty($friendEmail) OR !Validate::isEmail($friendEmail)) + $error = 'email invalid'; + elseif (empty($friendFirstName) OR empty($friendLastName) OR !Validate::isName($friendLastName) OR !Validate::isName($friendFirstName)) + $error = 'name invalid'; + elseif (ReferralProgramModule::isEmailExists($friendEmail) OR Customer::customerExists($friendEmail)) + { + $mails_exists[] = $friendEmail; + + } + else + { + $referralprogram = new ReferralProgramModule(); + $referralprogram->id_sponsor = (int)($cookie->id_customer); + $referralprogram->firstname = $friendFirstName; + $referralprogram->lastname = $friendLastName; + $referralprogram->email = $friendEmail; + if (!$referralprogram->validateFields(false)) + $error = 'name invalid'; + else + { + if ($referralprogram->save()) + { + if (Configuration::get('PS_CIPHER_ALGORITHM')) + $cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); + else + $cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_); + $vars = array( + '{email}' => strval($cookie->email), + '{lastname}' => strval($cookie->customer_lastname), + '{firstname}' => strval($cookie->customer_firstname), + '{email_friend}' => $friendEmail, + '{lastname_friend}' => $friendLastName, + '{firstname_friend}' => $friendFirstName, + '{link}' => 'authentication.php?create_account=1&sponsor='.urlencode($cipherTool->encrypt($referralprogram->id.'|'.$referralprogram->email.'|')), + '{discount}' => $discount); + Mail::Send((int)($cookie->id_lang), 'referralprogram-invitation', Mail::l('Referral Program'), $vars, $friendEmail, $friendFirstName.' '.$friendLastName, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + $invitation_sent = true; + $nbInvitation++; + $activeTab = 'pending'; + } + else + $error = 'cannot add friends'; + } + } + if ($error) + break; + } + if ($nbInvitation > 0) + unset($_POST); + //Not to stop the sending of e-mails in case of doubloon + if(sizeof($mails_exists)) + $error = 'email exists'; + } +} + +// Mailing revive +$revive_sent = false; +$nbRevive = 0; +if (Tools::isSubmit('revive')) +{ + $activeTab = 'pending'; + if (Tools::getValue('friendChecked') AND sizeof($friendsChecked = Tools::getValue('friendChecked')) >= 1) + { + foreach ($friendsChecked as $key => $friendChecked) + { + if (ReferralProgramModule::isSponsorFriend((int)($cookie->id_customer), (int)($friendChecked))) + { + if (Configuration::get('PS_CIPHER_ALGORITHM')) + $cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); + else + $cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_); + $referralprogram = new ReferralProgramModule((int)($key)); + $vars = array( + '{email}' => $cookie->email, + '{lastname}' => $cookie->customer_lastname, + '{firstname}' => $cookie->customer_firstname, + '{email_friend}' => $referralprogram->email, + '{lastname_friend}' => $referralprogram->lastname, + '{firstname_friend}' => $referralprogram->firstname, + '{link}' => 'authentication.php?create_account=1&sponsor='.urlencode($cipherTool->encrypt($referralprogram->id.'|'.$referralprogram->email.'|')), + '{discount}' => $discount + ); + $referralprogram->save(); + Mail::Send((int)($cookie->id_lang), 'referralprogram-invitation', Mail::l('Referral Program'), $vars, $referralprogram->email, $referralprogram->firstname.' '.$referralprogram->lastname, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + $revive_sent = true; + $nbRevive++; + } + } + } + else + $error = 'no revive checked'; +} + +$customer = new Customer((int)($cookie->id_customer)); +$stats = $customer->getStats(); + +$orderQuantity = (int)(Configuration::get('REFERRAL_ORDER_QUANTITY')); +$canSendInvitations = false; +if ((int)($stats['nb_orders']) >= $orderQuantity) + $canSendInvitations = true; + +// Smarty display +$smarty->assign(array( + 'activeTab' => $activeTab, + 'discount' => $discount, + 'orderQuantity' => $orderQuantity, + 'canSendInvitations' => $canSendInvitations, + 'nbFriends' => (int)(Configuration::get('REFERRAL_NB_FRIENDS')), + 'error' => $error, + 'invitation_sent' => $invitation_sent, + 'nbInvitation' => $nbInvitation, + 'pendingFriends' => ReferralProgramModule::getSponsorFriend((int)($cookie->id_customer), 'pending'), + 'revive_sent' => $revive_sent, + 'nbRevive' => $nbRevive, + 'subscribeFriends' => ReferralProgramModule::getSponsorFriend((int)($cookie->id_customer), 'subscribed'), + 'mails_exists' => (isset($mails_exists) ? $mails_exists : array()) +)); + +echo Module::display(dirname(__FILE__).'/referralprogram.php', 'referralprogram-program.tpl'); + +include(dirname(__FILE__).'/../../footer.php'); + + diff --git a/modules/referralprogram/referralprogram-program.tpl b/modules/referralprogram/referralprogram-program.tpl new file mode 100644 index 000000000..f0fb36788 --- /dev/null +++ b/modules/referralprogram/referralprogram-program.tpl @@ -0,0 +1,223 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7077 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + +{capture name=path}{l s='My account' mod='referralprogram'}{$navigationPipe}{l s='Referral Program' mod='referralprogram'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

    {l s='Referral program' mod='referralprogram'}

    + +{if $error} +

    + {if $error == 'conditions not valided'} + {l s='You need to agree to the conditions of the referral program!' mod='referralprogram'} + {elseif $error == 'email invalid'} + {l s='At least one e-mail address is invalid!' mod='referralprogram'} + {elseif $error == 'name invalid'} + {l s='At least one first name or last name is invalid!' mod='referralprogram'} + {elseif $error == 'email exists'} + {l s='Someone with this e-mail address has already been sponsored!' mod='referralprogram'}: {foreach from=$mails_exists item=mail}{$mail} {/foreach} + {elseif $error == 'no revive checked'} + {l s='Please mark at least one checkbox' mod='referralprogram'} + {elseif $error == 'cannot add friends'} + {l s='Cannot add friends to database' mod='referralprogram'} + {/if} +

    +{/if} + +{if $invitation_sent} +

    + {if $nbInvitation > 1} + {l s='E-mails have been sent to your friends!' mod='referralprogram'} + {else} + {l s='An e-mail has been sent to your friend!' mod='referralprogram'} + {/if} +

    +{/if} + +{if $revive_sent} +

    + {if $nbRevive > 1} + {l s='Reminder e-mails have been sent to your friends!' mod='referralprogram'} + {else} + {l s='A reminder e-mail has been sent to your friend!' mod='referralprogram'} + {/if} +

    +{/if} + + +
    + +
    +

    + {l s='Get a discount of' mod='referralprogram'} {$discount} {l s='for you and your friends by recommending this Website.' mod='referralprogram'} +

    + {if $canSendInvitations} +

    + {l s='It\'s quick and it\'s easy. Just fill in the first name, last name, and e-mail address(es) of your friend(s) in the fields below.' mod='referralprogram'} + {l s='When one of them makes at least' mod='referralprogram'} {$orderQuantity} {if $orderQuantity > 1}{l s='orders' mod='referralprogram'}{else}{l s='order' mod='referralprogram'}{/if}, + {l s='he or she will receive a' mod='referralprogram'} {$discount} {l s='voucher and you will receive your own voucher worth' mod='referralprogram'} {$discount}. +

    +
    + + + + + + + + + + + {section name=friends start=0 loop=$nbFriends step=1} + + + + + + + {/section} + +
     {l s='Last name' mod='referralprogram'}{l s='First name' mod='referralprogram'}{l s='E-mail' mod='referralprogram'}
    {$smarty.section.friends.iteration}
    +

    + {l s='Important: Your friends\' e-mail addresses will only be used in the referral program. They will never be used for other purposes.' mod='referralprogram'} +

    +

    + + + {l s='Read conditions.' mod='referralprogram'} +

    +

    + {l s='Preview' mod='referralprogram'} {l s='the default e-mail' mod='referralprogram'} {l s='that will be sent to your friend(s).' mod='referralprogram'} +

    +

    + +

    +
    + {else} +

    + {l s='To become a sponsor, you need to have completed at least' mod='referralprogram'} {$orderQuantity} {if $orderQuantity > 1}{l s='orders' mod='referralprogram'}{else}{l s='order' mod='referralprogram'}{/if}. +

    + {/if} +
    + +
    + {if $pendingFriends AND $pendingFriends|@count > 0} +

    + {l s='These friends have not yet placed an order on this Website since you sponsored them, but you can try again! To do so, mark the checkboxes of the friend(s) you want to remind, then click on the button "Remind my friend(s)"' mod='referralprogram'} +

    +
    + + + + + + + + + + + + {foreach from=$pendingFriends item=pendingFriend name=myLoop} + + + + + + + + {/foreach} + +
     {l s='Last name' mod='referralprogram'}{l s='First name' mod='referralprogram'}{l s='E-mail' mod='referralprogram'}{l s='Last invitation' mod='referralprogram'}
    + + + + {$pendingFriend.firstname|substr:0:22}{$pendingFriend.email}{dateFormat date=$pendingFriend.date_upd full=1}
    +

    + +

    +
    + {else} +

    {l s='You have not sponsored any friends.' mod='referralprogram'}

    + {/if} +
    + +
    + {if $subscribeFriends AND $subscribeFriends|@count > 0} +

    + {l s='Here are sponsored friends who have accepted your invitation:' mod='referralprogram'} +

    + + + + + + + + + + + + {foreach from=$subscribeFriends item=subscribeFriend name=myLoop} + + + + + + + + {/foreach} + +
     {l s='Last name' mod='referralprogram'}{l s='First name' mod='referralprogram'}{l s='E-mail' mod='referralprogram'}{l s='Inscription date' mod='referralprogram'}
    {$smarty.foreach.myLoop.iteration}.{$subscribeFriend.lastname|substr:0:22}{$subscribeFriend.firstname|substr:0:22}{$subscribeFriend.email}{dateFormat date=$subscribeFriend.date_upd full=1}
    + {else} +

    + {l s='No sponsored friends have accepted your invitation yet.' mod='referralprogram'} +

    + {/if} +
    +
    + + diff --git a/modules/referralprogram/referralprogram-rules.php b/modules/referralprogram/referralprogram-rules.php new file mode 100644 index 000000000..ea15fe66a --- /dev/null +++ b/modules/referralprogram/referralprogram-rules.php @@ -0,0 +1,51 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +require_once(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/../../init.php'); + +if (!Tools::getValue('width') AND !Tools::getValue('height')) + require_once(dirname(__FILE__).'/../../header.php'); + +$xmlFile = _PS_MODULE_DIR_.'referralprogram/referralprogram.xml'; + +if (file_exists($xmlFile)) +{ + if ($xml = @simplexml_load_file($xmlFile)) + { + $smarty->assign(array( + 'xml' => $xml, + 'paragraph' => 'paragraph_'.$cookie->id_lang + )); + } +} + +echo Module::display(dirname(__FILE__).'/referralprogram', 'referralprogram-rules.tpl'); + +if (!Tools::getValue('width') AND !Tools::getValue('height')) + require_once(dirname(__FILE__).'/../../footer.php'); + diff --git a/modules/referralprogram/referralprogram-rules.tpl b/modules/referralprogram/referralprogram-rules.tpl new file mode 100644 index 000000000..254f76e1b --- /dev/null +++ b/modules/referralprogram/referralprogram-rules.tpl @@ -0,0 +1,33 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='Referral program rules' mod='referralprogram'}

    + +{if isset($xml)} +
    + {if isset($xml->body->$paragraph)}
    {$xml->body->$paragraph|replace:"\'":"'"|replace:'\"':'"'}
    {/if} +
    +{/if} diff --git a/modules/referralprogram/referralprogram.gif b/modules/referralprogram/referralprogram.gif new file mode 100644 index 0000000000000000000000000000000000000000..85de792287d846f3e7502afdac0fd02f40ecdce4 GIT binary patch literal 1051 zcmZ?wbhEHb6krfwcs`54-rn932%KFVTs+*|+`PQJyuH1Be0+hxGcYDaSkadDHEa{gVP(6QZrLiQzykbPKtHb zty3>fiJcoSnx3AXkeO?ee{x!a^VCGAsfjLGSvlF+*;(0nX*mUsMcYF2x6DX)nVGFz zSXekKGa#t=Y;ke%{CuU7va-aw#E9AnUiB+0Dk>@~E0-3BM%JB}RGvMlJZExcTwQJX ztm=s6RgPtC#Z663wQV(xEp7Gf)h!*(iPIA5drH?eB=2uF?CI)Q(^}Zu+uPMYgu3dX=Sst3W zJzZz=Y_0W~HIpk(W_2Get3I98e7fNI+TxD0MUOW&cAhQmJ6rgCQ*Hmbif21gr=Kg| zyLa#W3pEE19z1mD(Cz)pj~qGj{J^A*SC_25G56!qX`hcx`*x!D+_`hFPA`9Qe%q$& zf6raM{QSa>PZ!txzOeAxjjLa;Z1{V9-QBx)U%Ytne-w}y0*e0xor_WvOHxx5$}>wc z6x=<10~i#4vM_Qn{AbW%00K}(Vc>Yo@Sju0Lcn{bfiZ`ch{drUXJb7vJ{G~}{K}S@ zn><7`949Gxb<64A)Cf4c#CsZFWJE+0Gbg*vhZip|FKu)ZmMBW<2y*ojaw)LkS;FAl zDJ?4-#ldt$-G7m;0E?f-7sC_*`|5W$7B(L_?O@t>!r(^b literal 0 HcmV?d00001 diff --git a/modules/referralprogram/referralprogram.php b/modules/referralprogram/referralprogram.php new file mode 100644 index 000000000..e8c0ffeb3 --- /dev/null +++ b/modules/referralprogram/referralprogram.php @@ -0,0 +1,604 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class ReferralProgram extends Module +{ + public function __construct() + { + $this->name = 'referralprogram'; + $this->tab = 'advertising_marketing'; + $this->version = '1.5'; + $this->author = 'PrestaShop'; + + parent::__construct(); + + $this->confirmUninstall = $this->l('All sponsors and friends will be deleted. Are you sure you want to uninstall this module?'); + $this->displayName = $this->l('Customer referral program'); + $this->description = $this->l('Integrate a referral program system into your shop.'); + if (Configuration::get('REFERRAL_DISCOUNT_TYPE') == 1 AND !Configuration::get('REFERRAL_PERCENTAGE')) + $this->warning = $this->l('Please specify an amount for referral program vouchers.'); + + if ($this->id) + { + $this->_configuration = Configuration::getMultiple(array('REFERRAL_NB_FRIENDS', 'REFERRAL_ORDER_QUANTITY', 'REFERRAL_DISCOUNT_TYPE', 'REFERRAL_DISCOUNT_VALUE')); + $this->_configuration['REFERRAL_DISCOUNT_DESCRIPTION'] = Configuration::getInt('REFERRAL_DISCOUNT_DESCRIPTION'); + $this->_xmlFile = dirname(__FILE__).'/referralprogram.xml'; + } + } + + public function install() + { + $defaultTranslations = array('en' => 'Referral reward', 'fr' => 'Récompense parrainage'); + $desc = array((int)Configuration::get('PS_LANG_DEFAULT') => $this->l('Referral reward')); + foreach (Language::getLanguages() AS $language) + if (isset($defaultTranslations[$language['iso_code']])) + $desc[(int)$language['id_lang']] = $defaultTranslations[$language['iso_code']]; + + if (!parent::install() OR !$this->installDB() OR !Configuration::updateValue('REFERRAL_DISCOUNT_DESCRIPTION', $desc) + OR !Configuration::updateValue('REFERRAL_ORDER_QUANTITY', 1) OR !Configuration::updateValue('REFERRAL_DISCOUNT_TYPE', 2) + OR !Configuration::updateValue('REFERRAL_NB_FRIENDS', 5) OR !$this->registerHook('shoppingCart') + OR !$this->registerHook('orderConfirmation') OR !$this->registerHook('updateOrderStatus') + OR !$this->registerHook('adminCustomers') OR !$this->registerHook('createAccount') + OR !$this->registerHook('createAccountForm') OR !$this->registerHook('customerAccount')) + return false; + + /* Define a default value for fixed amount vouchers, for each currency */ + foreach (Currency::getCurrencies() AS $currency) + Configuration::updateValue('REFERRAL_DISCOUNT_VALUE_'.(int)($currency['id_currency']), 5); + + /* Define a default value for the percentage vouchers */ + Configuration::updateValue('REFERRAL_PERCENTAGE', 5); + + /* This hook is optional */ + $this->registerHook('myAccountBlock'); + + return true; + } + + public function installDB() + { + return Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'referralprogram` ( + `id_referralprogram` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_sponsor` INT UNSIGNED NOT NULL, + `email` VARCHAR(255) NOT NULL, + `lastname` VARCHAR(128) NOT NULL, + `firstname` VARCHAR(128) NOT NULL, + `id_customer` INT UNSIGNED DEFAULT NULL, + `id_discount` INT UNSIGNED DEFAULT NULL, + `id_discount_sponsor` INT UNSIGNED DEFAULT NULL, + `date_add` DATETIME NOT NULL, + `date_upd` DATETIME NOT NULL, + PRIMARY KEY (`id_referralprogram`), + UNIQUE KEY `index_unique_referralprogram_email` (`email`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'); + } + + public function uninstall() + { + $result = true; + foreach (Currency::getCurrencies() AS $currency) + $result = $result AND Configuration::deleteByName('REFERRAL_DISCOUNT_VALUE_'.(int)($currency['id_currency'])); + if (!parent::uninstall() OR !$this->uninstallDB() OR !$this->removeMail() OR !$result + OR !Configuration::deleteByName('REFERRAL_PERCENTAGE') OR !Configuration::deleteByName('REFERRAL_ORDER_QUANTITY') + OR !Configuration::deleteByName('REFERRAL_DISCOUNT_TYPE') OR !Configuration::deleteByName('REFERRAL_NB_FRIENDS') + OR !Configuration::deleteByName('REFERRAL_DISCOUNT_DESCRIPTION')) + return false; + return true; + } + + public function uninstallDB() + { + return Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'referralprogram`;'); + } + + public function removeMail() + { + $langs = Language::getLanguages(false); + foreach ($langs AS $lang) + foreach ($this->_mails['name'] AS $name) + foreach ($this->_mails['ext'] AS $ext) + { + $file = _PS_MAIL_DIR_.$lang['iso_code'].'/'.$name.'.'.$ext; + if (file_exists($file) AND !@unlink($file)) + $this->_errors[] = $this->l('Cannot delete this file:').' '.$file; + } + return true; + } + + private function _postProcess() + { + Configuration::updateValue('REFERRAL_ORDER_QUANTITY', (int)(Tools::getValue('order_quantity'))); + foreach (Tools::getValue('discount_value') AS $id_currency => $discount_value) + Configuration::updateValue('REFERRAL_DISCOUNT_VALUE_'.(int)($id_currency), (float)($discount_value)); + Configuration::updateValue('REFERRAL_DISCOUNT_TYPE', (int)(Tools::getValue('discount_type'))); + Configuration::updateValue('REFERRAL_NB_FRIENDS', (int)(Tools::getValue('nb_friends'))); + Configuration::updateValue('REFERRAL_PERCENTAGE', (int)(Tools::getValue('discount_value_percentage'))); + Configuration::updateValue('REFERRAL_DISCOUNT_DESCRIPTION', Tools::getValue('discount_description')); + $this->_html .= $this->displayConfirmation($this->l('Configuration updated.')); + } + + private function _postValidation() + { + $this->_errors = array(); + if (!(int)(Tools::getValue('order_quantity')) OR Tools::getValue('order_quantity') < 0) + $this->_errors[] = $this->displayError($this->l('Order quantity is required/invalid.')); + if (!is_array(Tools::getValue('discount_value'))) + $this->_errors[] = $this->displayError($this->l('Discount value is invalid.')); + foreach (Tools::getValue('discount_value') AS $id_currency => $discount_value) + if ($discount_value == '') + $this->_errors[] = $this->displayError($this->l('Discount value for the currency #').$id_currency.$this->l(' is empty.')); + elseif (!Validate::isUnsignedFloat($discount_value)) + $this->_errors[] = $this->displayError($this->l('Discount value for the currency #').$id_currency.$this->l(' is invalid.')); + if (!(int)(Tools::getValue('discount_type')) OR Tools::getValue('discount_type') < 1 OR Tools::getValue('discount_type') > 2) + $this->_errors[] = $this->displayError($this->l('Discount type is required/invalid.')); + if (!(int)(Tools::getValue('nb_friends')) OR Tools::getValue('nb_friends') < 0) + $this->_errors[] = $this->displayError($this->l('Number of friends is required/invalid.')); + if (!(int)(Tools::getValue('discount_value_percentage')) OR (int)(Tools::getValue('discount_value_percentage')) < 0 OR (int)(Tools::getValue('discount_value_percentage')) > 100) + $this->_errors[] = $this->displayError($this->l('Discount percentage is required/invalid.')); + } + + private function _writeXml() + { + $forbiddenKey = array('submitUpdate'); // Forbidden key + + // Generate new XML data + $newXml = '<'.'?xml version=\'1.0\' encoding=\'utf-8\' ?>'."\n"; + $newXml .= ''."\n"; + $newXml .= "\t".''; + // Making body data + foreach ($_POST AS $key => $field) + if ($line = $this->putContent($newXml, $key, $field, $forbiddenKey, 'body')) + $newXml .= $line; + $newXml .= "\n\t".''."\n"; + $newXml .= ''."\n"; + + /* write it into the editorial xml file */ + if ($fd = @fopen($this->_xmlFile, 'w')) + { + if (!@fwrite($fd, $newXml)) + $this->_html .= $this->displayError($this->l('Unable to write to the xml file.')); + if (!@fclose($fd)) + $this->_html .= $this->displayError($this->l('Cannot close the xml file.')); + } + else + $this->_html .= $this->displayError($this->l('Unable to update the xml file. Please check the xml file\'s writing permissions.')); + } + + public function putContent($xml_data, $key, $field, $forbidden, $section) + { + foreach ($forbidden AS $line) + if ($key == $line) + return 0; + if (!preg_match('/^'.$section.'_/i', $key)) + return 0; + $key = preg_replace('/^'.$section.'_/i', '', $key); + $field = Tools::htmlentitiesDecodeUTF8(htmlspecialchars($field)); + if (!$field) + return 0; + return ("\n\t\t".'<'.$key.'>'); + } + + public function getContent() + { + if (Tools::isSubmit('submitReferralProgram')) + { + $this->_postValidation(); + if (!sizeof($this->_errors)) + $this->_postProcess(); + else + foreach ($this->_errors AS $err) + $this->_html .= '
    '.$err.'
    '; + } + elseif (Tools::isSubmit('submitText')) + { + foreach ($_POST AS $key => $value) + if (!is_array(Tools::getValue($key)) && !Validate::isString(Tools::getValue($key))) + { + $this->_html .= $this->displayError($this->l('Invalid html field, javascript is forbidden')); + $this->_displayForm(); + return $this->_html; + } + $this->_writeXml(); + } + + $this->_html .= '

    '.$this->displayName.'

    '; + $this->_displayForm(); + $this->_displayFormRules(); + return $this->_html; + } + + private function _displayForm() + { + $divLangName = 'cpara¤dd'; + $currencies = Currency::getCurrencies(); + + $this->_html .= ' +
    +
    + '.$this->l('Settings').''.$this->l('Settings').' +

    + + +

    +

    + + +

    +

    + + + +   + + +

    + + + + + + '; + + foreach ($currencies AS $currency) + $this->_html .= ' + + + + '; + + $this->_html .= ' +
    '.$this->l('Currency').''.$this->l('Voucher amount').'
    '.(Configuration::get('PS_CURRENCY_DEFAULT') == $currency['id_currency'] ? '' : '').htmlentities($currency['name'], ENT_NOQUOTES, 'utf-8').(Configuration::get('PS_CURRENCY_DEFAULT') == $currency['id_currency'] ? '' : '').' '.$currency['sign'].'
    +

    +

    '; + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(false); + + foreach ($languages AS $language) + $this->_html .= ' +
    + +
    '; + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'dd', true); + $this->_html .= ' +

    +
    +
    +

    '; + } + + private function _displayFormRules() + { + global $cookie; + + // Languages preliminaries + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(); + $iso = Language::getIsoById($defaultLanguage); + $divLangName = 'cpara¤dd'; + + // xml loading + $xml = false; + if (file_exists($this->_xmlFile)) + if (!$xml = @simplexml_load_file($this->_xmlFile)) + $this->_html .= $this->displayError($this->l('Your text is empty.')); + + // TinyMCE + global $cookie; + $iso = Language::getIsoById((int)($cookie->id_lang)); + $isoTinyMCE = (file_exists(_PS_ROOT_DIR_.'/js/tiny_mce/langs/'.$iso.'.js') ? $iso : 'en'); + $ad = dirname($_SERVER["PHP_SELF"]); + echo ' + + + + +
    +
    + '.$this->l('Referral program rules').''; + foreach ($languages AS $language) + { + $this->_html .= ' +
    + +
    '; + } + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'cpara', true); + + $this->_html .= ' +
    +
    +
    '; + } + + + /** + * Hook call when cart created and updated + * Display the discount name if the sponsor friend have one + */ + public function hookShoppingCart($params) + { + include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + + if (!isset($params['cart']->id_customer)) + return false; + if (!($id_referralprogram = ReferralProgramModule::isSponsorised((int)($params['cart']->id_customer), true))) + return false; + $referralprogram = new ReferralProgramModule($id_referralprogram); + if (!Validate::isLoadedObject($referralprogram)) + return false; + $discount = new Discount($referralprogram->id_discount); + if (!Validate::isLoadedObject($discount)) + return false; + + if ($params['cart']->checkDiscountValidity($discount, $params['cart']->getDiscounts(), $params['cart']->getOrderTotal(true, Cart::ONLY_PRODUCTS), $params['cart']->getProducts(), false, $this->shopID, $this->shopGroupID)===false) + { + global $smarty; + $smarty->assign(array('discount_display' => Discount::display($discount->value, $discount->id_discount_type, new Currency($params['cookie']->id_currency)), 'discount' => $discount)); + return $this->display(__FILE__, 'shopping-cart.tpl'); + } + return false; + } + + /** + * Hook display on customer account page + * Display an additional link on my-account and block my-account + */ + public function hookCustomerAccount($params) + { + return $this->display(__FILE__, 'my-account.tpl'); + } + + public function hookMyAccountBlock($params) + { + return $this->hookCustomerAccount($params); + } + + /** + * Hook display on form create account + * Add an additional input on bottom for fill the sponsor's e-mail address + */ + public function hookCreateAccountForm($params) + { + include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + + global $smarty; + + if (Configuration::get('PS_CIPHER_ALGORITHM')) + $cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_); + else + $cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_); + $explodeResult = explode('|', $cipherTool->decrypt(urldecode(Tools::getValue('sponsor')))); + if ($explodeResult AND count($explodeResult) > 1 AND list($id_referralprogram, $email) = $explodeResult AND (int)($id_referralprogram) AND !empty($email) AND Validate::isEmail($email) AND $id_referralprogram == ReferralProgramModule::isEmailExists($email)) + { + $referralprogram = new ReferralProgramModule($id_referralprogram); + if (Validate::isLoadedObject($referralprogram)) + { + /* hack for display referralprogram information in form */ + $_POST['customer_firstname'] = $referralprogram->firstname; + $_POST['firstname'] = $referralprogram->firstname; + $_POST['customer_lastname'] = $referralprogram->lastname; + $_POST['lastname'] = $referralprogram->lastname; + $_POST['email'] = $referralprogram->email; + $_POST['email_create'] = $referralprogram->email; + $sponsor = new Customer((int)$referralprogram->id_sponsor); + $_POST['referralprogram'] = $sponsor->email; + } + } + return $this->display(__FILE__, 'authentication.tpl'); + } + + /** + * Hook called on creation customer account + * Create a discount for the customer if sponsorised + */ + public function hookCreateAccount($params) + { + global $cookie; + + $newCustomer = $params['newCustomer']; + if (!Validate::isLoadedObject($newCustomer)) + return false; + $postVars = $params['_POST']; + if (empty($postVars) OR !isset($postVars['referralprogram']) OR empty($postVars['referralprogram'])) + return false; + $sponsorEmail = $postVars['referralprogram']; + if (!Validate::isEmail($sponsorEmail) OR $sponsorEmail == $newCustomer->email) + return false; + + $sponsor = new Customer(); + if ($sponsor = $sponsor->getByEmail($sponsorEmail, NULL, $this->shopGroupID, $this->shopID)) + { + include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + + /* If the customer was not invited by the sponsor, we create the invitation dynamically */ + if (!$id_referralprogram = ReferralProgramModule::isEmailExists($newCustomer->email, true, false)) + { + $referralprogram = new ReferralProgramModule(); + $referralprogram->id_sponsor = (int)$sponsor->id; + $referralprogram->firstname = $newCustomer->firstname; + $referralprogram->lastname = $newCustomer->lastname; + $referralprogram->email = $newCustomer->email; + if (!$referralprogram->validateFields(false)) + return false; + else + $referralprogram->save(); + } + else + $referralprogram = new ReferralProgramModule((int)$id_referralprogram); + + if ($referralprogram->id_sponsor == $sponsor->id) + { + $referralprogram->id_customer = (int)$newCustomer->id; + $referralprogram->save(); + if ($referralprogram->registerDiscountForSponsored((int)$params['cookie']->id_currency)) + { + $discount = new Discount((int)$referralprogram->id_discount); + if (Validate::isLoadedObject($discount)) + { + $data = array('{firstname}' => $newCustomer->firstname, '{lastname}' => $newCustomer->lastname, '{voucher_num}' => $discount->name, + '{voucher_amount}' => Tools::displayPrice((float)Configuration::get('REFERRAL_DISCOUNT_VALUE_'.(int)($cookie->id_currency)), (int)Configuration::get('PS_CURRENCY_DEFAULT'))); + Mail::Send((int)$cookie->id_lang, 'referralprogram-voucher', Mail::l('Congratulations!'), $data, $newCustomer->email, $newCustomer->firstname.' '.$newCustomer->lastname, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + } + } + return true; + } + } + return false; + } + + /** + * Hook display in tab AdminCustomers on BO + * Data table with all sponsors informations for a customer + */ + public function hookAdminCustomers($params) + { + include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + + $customer = new Customer((int)$params['id_customer']); + if (!Validate::isLoadedObject($customer)) + die (Tools::displayError('Incorrect object Customer.')); + + global $cookie; + $friends = ReferralProgramModule::getSponsorFriend((int)$customer->id); + if ($id_referralprogram = ReferralProgramModule::isSponsorised((int)$customer->id, true)) + { + $referralprogram = new ReferralProgramModule((int)$id_referralprogram); + $sponsor = new Customer((int)$referralprogram->id_sponsor); + } + + $html = ' +

    '.$this->l('Referral program').'

    +

    '.(isset($sponsor) ? $this->l('Customer\'s sponsor:').' '.$sponsor->firstname.' '.$sponsor->lastname.'' : $this->l('No one has sponsored this customer.')).'

    '; + + if ($friends AND sizeof($friends)) + { + $html.= '

    '.sizeof($friends).' '.(sizeof($friends) > 1 ? $this->l('Sponsored customers:') : $this->l('Sponsored customer:')).'

    '; + $html.= ' + + + + + + + + + + '; + foreach ($friends AS $key => $friend) + { + $orders = Order::getCustomerOrders($friend['id_customer']); + $html.= ' + + + + + + + + + '; + } + $html.= ' +
    '.$this->l('ID').''.$this->l('Name').''.$this->l('Email').''.$this->l('Registration date').''.$this->l('Customers sponsored by this friend').''.$this->l('Placed orders').''.$this->l('Customer account created').'
    '.((int)($friend['id_customer']) ? $friend['id_customer'] : '--').''.$friend['firstname'].' '.$friend['lastname'].''.$friend['email'].''.Tools::displayDate($friend['date_add'], (int)($cookie->id_lang), true).''.sizeof(ReferralProgramModule::getSponsorFriend($friend['id_customer'])).''.($orders ? sizeof($orders) : 0).''.((int)$friend['id_customer'] ? '' : '').'
    '; + } + else + $html.= $customer->firstname.' '.$customer->lastname.' '.$this->l('has not sponsored any friends yet.'); + return $html.'

    '; + } + + /** + * Hook called when a order is confimed + * display a message to customer about sponsor discount + */ + public function hookOrderConfirmation($params) + { + if ($params['objOrder'] AND !Validate::isLoadedObject($params['objOrder'])) + return die(Tools::displayError('Incorrect object Order.')); + + include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + + $customer = new Customer((int)$params['objOrder']->id_customer); + $stats = $customer->getStats(); + $nbOrdersCustomer = (int)$stats['nb_orders'] + 1; // hack to count current order + $referralprogram = new ReferralProgramModule(ReferralProgramModule::isSponsorised((int)$customer->id, true)); + if (!Validate::isLoadedObject($referralprogram)) + return false; + $sponsor = new Customer((int)$referralprogram->id_sponsor); + if ((int)$nbOrdersCustomer == (int)$this->_configuration['REFERRAL_ORDER_QUANTITY']) + { + $discount = new Discount((int)$referralprogram->id_discount_sponsor); + if (!Validate::isLoadedObject($discount)) + return false; + global $smarty; + $smarty->assign(array('discount' => $discount->display($discount->value, (int)$discount->id_discount_type, new Currency((int)$params['objOrder']->id_currency)), 'sponsor_firstname' => $sponsor->firstname, 'sponsor_lastname' => $sponsor->lastname)); + return $this->display(__FILE__, 'order-confirmation.tpl'); + } + return false; + } + + /** + * Hook called when order status changed + * register a discount for sponsor and send him an e-mail + */ + public function hookUpdateOrderStatus($params) + { + if (!Validate::isLoadedObject($params['newOrderStatus'])) + die (Tools::displayError('Missing parameters')); + $orderState = $params['newOrderStatus']; + $order = new Order((int)($params['id_order'])); + if ($order AND !Validate::isLoadedObject($order)) + die(Tools::displayError('Incorrect object Order.')); + + include_once(dirname(__FILE__).'/ReferralProgramModule.php'); + + $customer = new Customer((int)$order->id_customer); + $stats = $customer->getStats(); + $nbOrdersCustomer = (int)$stats['nb_orders'] + 1; // hack to count current order + $referralprogram = new ReferralProgramModule(ReferralProgramModule::isSponsorised((int)($customer->id), true)); + if (!Validate::isLoadedObject($referralprogram)) + return false; + $sponsor = new Customer((int)$referralprogram->id_sponsor); + if ((int)$orderState->logable AND $nbOrdersCustomer >= (int)$this->_configuration['REFERRAL_ORDER_QUANTITY'] AND $referralprogram->registerDiscountForSponsor((int)$order->id_currency)) + { + $discount = new Discount((int)$referralprogram->id_discount_sponsor); + $currency = new Currency((int)$order->id_currency); + $discount_display = $discount->display($discount->value, (int)$discount->id_discount_type, $currency); + $data = array('{sponsored_firstname}' => $customer->firstname, '{sponsored_lastname}' => $customer->lastname, '{discount_display}' => $discount_display, '{discount_name}' => $discount->name); + Mail::Send((int)$order->id_lang, 'referralprogram-congratulations', Mail::l('Congratulations!'), $data, $sponsor->email, $sponsor->firstname.' '.$sponsor->lastname, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); + return true; + } + return false; + } +} diff --git a/modules/referralprogram/referralprogram.xml b/modules/referralprogram/referralprogram.xml new file mode 100644 index 000000000..55ee26257 --- /dev/null +++ b/modules/referralprogram/referralprogram.xml @@ -0,0 +1,13 @@ + + + + toto Quisque in mauris. Duis eu diam. Nullam at metus in lectus interdum elementum. Vestibulum dapibus diam ut libero. Vivamus placerat lacus at dui. Integer dapibus est in magna.

    +

    Curabitur vel erat eget sapien semper feugiat. Sed sodales dictum pede. Ut adipiscing. Cras aliquam, erat eget auctor pretium, lorem pede pellentesque metus, at ultrices est est sit amet libero.

    +

    Aliquam erat volutpat. Maecenas aliquet, felis at eleifend suscipit, risus sem congue est, id vestibulum libero sapien in ligula. Nulla ut urna id eros lacinia gravida.

    ]]>
    + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean nisl diam, sollicitudin vitae, tempor nec, suscipit non, quam. Donec in nulla. Nam consequat bibendum leo. Etiam viverra congue nisl. Aliquam ac tellus vitae arcu ornare convallis.

    +

    Nulla ut erat. Vivamus ornare imperdiet libero. Integer risus mauris, faucibus eu, fermentum tincidunt, molestie non, arcu. Phasellus mattis, dui ac vestibulum pellentesque, enim turpis scelerisque augue, ut tristique quam metus eu metus. Donec pellentesque faucibus velit. Vivamus quis ipsum. leather edition is near from you ut libero sed mauris venenatis iaculis. Curabitur nulla erat, accumsan ac, consequat quis, aliquet sit amet, orci.

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean nisl diam, sollicitudin vitae, tempor nec, suscipit non, quam. Donec in nulla. Nam consequat bibendum leo. Etiam viverra congue nisl. Aliquam ac tellus vitae arcu ornare convallis.

    +

    Nulla ut erat. Vivamus ornare imperdiet libero. Integer risus mauris, faucibus eu, fermentum tincidunt, molestie non, arcu. Phasellus mattis, dui ac vestibulum pellentesque, enim turpis scelerisque augue, ut tristique quam metus eu metus. Donec pellentesque faucibus velit. Vivamus quis ipsum. Pellentesque ut libero sed mauris venenatis iaculis. Curabitur nulla erat, accumsan ac, consequat quis, aliquet sit amet, orci.

    ]]>
    + test espagnol

    ]]>
    + +
    diff --git a/modules/referralprogram/shopping-cart.tpl b/modules/referralprogram/shopping-cart.tpl new file mode 100644 index 000000000..7621b8675 --- /dev/null +++ b/modules/referralprogram/shopping-cart.tpl @@ -0,0 +1,35 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + +

    + {l s='Referral program' mod='referralprogram'} + {l s='You have earned a voucher worth' mod='referralprogram'} {$discount_display} {l s='thanks to your sponsor!' mod='referralprogram'} + {l s='Enter voucher name' mod='referralprogram'} {$discount->name} {l s='to receive the reduction on this order.' mod='referralprogram'} + {l s='View your referral program.' mod='referralprogram'} +

    +
    + \ No newline at end of file diff --git a/modules/reverso/config.xml b/modules/reverso/config.xml new file mode 100755 index 000000000..05c3f392d --- /dev/null +++ b/modules/reverso/config.xml @@ -0,0 +1,12 @@ + + + reverso + + + + + + 1 + 0 + fr + \ No newline at end of file diff --git a/modules/reverso/de.php b/modules/reverso/de.php new file mode 100644 index 000000000..30f59fc89 --- /dev/null +++ b/modules/reverso/de.php @@ -0,0 +1,18 @@ +reverso_9dd6474008963ad22e9fd0f28447e7b2'] = 'Wir können diese Nummer nicht finden '; +$_MODULE['<{reverso}prestashop>reverso_87094afb0ee64892a41b1f6acab60b02'] = 'Tragen Sie Ihre Telefonnummer automatisch in dieses Formular ein '; +$_MODULE['<{reverso}prestashop>reverso_86774f1550b9ad3cc207184b35afb514'] = 'ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_1e9fcdadfd0ced6424c9692da9373fbf'] = 'Füllen Sie das Authentifizierungsformular mit ReversoForm aus'; +$_MODULE['<{reverso}prestashop>reverso_254f642527b45bc260048e30704edb39'] = 'Konfiguration'; +$_MODULE['<{reverso}prestashop>reverso_3460276ef9eb483d13aa31b870077a0d'] = 'Seriennummer'; +$_MODULE['<{reverso}prestashop>reverso_af53b10cb956fa2562af3c3fcd1c08f6'] = 'Webseiten-Adresse'; +$_MODULE['<{reverso}prestashop>reverso_06933067aafd48425d67bcb01bba5cb6'] = 'Aktualisierung'; +$_MODULE['<{reverso}prestashop>reverso_a67fe5b600cc617a0cc6f782b2b466e1'] = 'Reverso Kontokonfiguration'; +$_MODULE['<{reverso}prestashop>reverso_af21713c577d79637cb7ce743b9522be'] = 'Sie haben noch kein ReversoForm-Konto?'; +$_MODULE['<{reverso}prestashop>reverso_15e80d88e64872dffe151e5ba783270b'] = 'Jetzt anmelden!'; +$_MODULE['<{reverso}prestashop>reverso_7ccf58c950043c9fbfed668df13ce608'] = 'Die Einstellungen werden aktualisiert'; + +?> \ No newline at end of file diff --git a/modules/reverso/es.php b/modules/reverso/es.php new file mode 100644 index 000000000..c953b4f12 --- /dev/null +++ b/modules/reverso/es.php @@ -0,0 +1,16 @@ +reverso_86774f1550b9ad3cc207184b35afb514'] = 'ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_1e9fcdadfd0ced6424c9692da9373fbf'] = 'Rellenar el formulario de autentificación con ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_254f642527b45bc260048e30704edb39'] = 'Configuración'; +$_MODULE['<{reverso}prestashop>reverso_3460276ef9eb483d13aa31b870077a0d'] = 'Número de serie'; +$_MODULE['<{reverso}prestashop>reverso_af53b10cb956fa2562af3c3fcd1c08f6'] = 'Dirección del sitio'; +$_MODULE['<{reverso}prestashop>reverso_06933067aafd48425d67bcb01bba5cb6'] = 'Actualizar'; +$_MODULE['<{reverso}prestashop>reverso_a67fe5b600cc617a0cc6f782b2b466e1'] = 'Configuración de la cuenta ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_af21713c577d79637cb7ce743b9522be'] = '¿Aún no tiene una cuenta Reverso?'; +$_MODULE['<{reverso}prestashop>reverso_15e80d88e64872dffe151e5ba783270b'] = 'Regístrese ahora'; +$_MODULE['<{reverso}prestashop>reverso_7ccf58c950043c9fbfed668df13ce608'] = 'Parámetros actualizados'; +$_MODULE['<{reverso}prestashop>reverso_9dd6474008963ad22e9fd0f28447e7b2'] = 'Imposible encontrar ese número'; +$_MODULE['<{reverso}prestashop>reverso_87094afb0ee64892a41b1f6acab60b02'] = 'Completar el formulario automáticamente con su número de teléfono'; diff --git a/modules/reverso/fr.php b/modules/reverso/fr.php new file mode 100644 index 000000000..7da8fc84e --- /dev/null +++ b/modules/reverso/fr.php @@ -0,0 +1,16 @@ +reverso_86774f1550b9ad3cc207184b35afb514'] = 'ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_1e9fcdadfd0ced6424c9692da9373fbf'] = 'Remplir le formulaire d\'authentification avec ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_254f642527b45bc260048e30704edb39'] = 'Configuration'; +$_MODULE['<{reverso}prestashop>reverso_3460276ef9eb483d13aa31b870077a0d'] = 'Numéro de série'; +$_MODULE['<{reverso}prestashop>reverso_af53b10cb956fa2562af3c3fcd1c08f6'] = 'Adresse du site'; +$_MODULE['<{reverso}prestashop>reverso_06933067aafd48425d67bcb01bba5cb6'] = 'Mettre à jour'; +$_MODULE['<{reverso}prestashop>reverso_a67fe5b600cc617a0cc6f782b2b466e1'] = 'Configuration compte Reverso'; +$_MODULE['<{reverso}prestashop>reverso_af21713c577d79637cb7ce743b9522be'] = 'Vous n\'avez pas de compte Reverso ?'; +$_MODULE['<{reverso}prestashop>reverso_15e80d88e64872dffe151e5ba783270b'] = 'Enregistrez vous maintenant !'; +$_MODULE['<{reverso}prestashop>reverso_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour'; +$_MODULE['<{reverso}prestashop>reverso_9dd6474008963ad22e9fd0f28447e7b2'] = 'Impossible de trouver ce numéro'; +$_MODULE['<{reverso}prestashop>reverso_87094afb0ee64892a41b1f6acab60b02'] = 'Complétez automatiquement le formulaire avec votre numéro de téléphone'; diff --git a/modules/reverso/it.php b/modules/reverso/it.php new file mode 100644 index 000000000..bf9a0bfc0 --- /dev/null +++ b/modules/reverso/it.php @@ -0,0 +1,18 @@ +reverso_9dd6474008963ad22e9fd0f28447e7b2'] = 'Non possiamo trovare questo numero'; +$_MODULE['<{reverso}prestashop>reverso_87094afb0ee64892a41b1f6acab60b02'] = 'Compilare automaticamente questo modulo con il tuo numero di telefono'; +$_MODULE['<{reverso}prestashop>reverso_86774f1550b9ad3cc207184b35afb514'] = 'ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_1e9fcdadfd0ced6424c9692da9373fbf'] = 'Compila modulo di autenticazione con ReversoForm'; +$_MODULE['<{reverso}prestashop>reverso_254f642527b45bc260048e30704edb39'] = 'Configurazione'; +$_MODULE['<{reverso}prestashop>reverso_3460276ef9eb483d13aa31b870077a0d'] = 'Numero di serie'; +$_MODULE['<{reverso}prestashop>reverso_af53b10cb956fa2562af3c3fcd1c08f6'] = 'Indirizzo del sito'; +$_MODULE['<{reverso}prestashop>reverso_06933067aafd48425d67bcb01bba5cb6'] = 'Aggiornamento'; +$_MODULE['<{reverso}prestashop>reverso_a67fe5b600cc617a0cc6f782b2b466e1'] = 'Configurazione account Reverso'; +$_MODULE['<{reverso}prestashop>reverso_af21713c577d79637cb7ce743b9522be'] = 'Non hai ancora un account ReversoForm?'; +$_MODULE['<{reverso}prestashop>reverso_15e80d88e64872dffe151e5ba783270b'] = 'Registrati ora!'; +$_MODULE['<{reverso}prestashop>reverso_7ccf58c950043c9fbfed668df13ce608'] = 'Le impostazioni sono aggiornate'; + +?> \ No newline at end of file diff --git a/modules/reverso/js/index.php b/modules/reverso/js/index.php new file mode 100644 index 000000000..9278e0dbe --- /dev/null +++ b/modules/reverso/js/index.php @@ -0,0 +1,26 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");header("Cache-Control: no-store, no-cache, must-revalidate");header("Cache-Control: post-check=0, pre-check=0", false);header("Pragma: no-cache");header("Location: ../");exit; \ No newline at end of file diff --git a/modules/reverso/js/reverso.js b/modules/reverso/js/reverso.js new file mode 100644 index 000000000..f0152b428 --- /dev/null +++ b/modules/reverso/js/reverso.js @@ -0,0 +1,63 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function updateAddress(phone) +{ + $.ajax({ + type: 'GET', + url: baseDir+'modules/reverso/reverso_check.php?phone=' + $('#reverso_form').val(), + async: true, + cache: false, + type: 'text', + success: function(data) + { + if (data == 0) + { + alert(unknown_number); + return false; + } + else if (data == 11) + { + return false; + } + var fields = data.split(','); + $(fields).each(function(){ + var field = this.split(':'); + $('form#account-creation_form input[name=\''+ field[0] +'\']').val(field[1]); + }); + } + }); + return false; +} + +$(document).ready(function(){ + $('#reverso_form').typeWatch({ + callback:function(){ updateAddress();}, + wait:800, + highlight:false, + enterkey:false + }); +}); diff --git a/modules/reverso/logo.gif b/modules/reverso/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e473540c53731192f9deac762a69e4c7cc6f259 GIT binary patch literal 1021 zcmW-gdrVUY7{$A|EyQdY#4T}dE`W)PiYD7InSsqNu(m+ilrTp&7eEF=f|*0ImoW?t zFM+yFa9Cx4=zt6}sU`%7Bj6@D?7R22rKK(O-Fw@6dtdE+uiNjOzs~vVOTHs7k-dAQ zHdB%*35gP7L?$p4`J0lM{5sK9h+aJG)qKU%1mjvwB~!$hg6DYh?hhNP8fvzcyj|w= z`w5Md7%$aowFr@nL?Vo1nMcF8s#M@viWBrkv+=}koleiPY-)9a7;mO#`z@eD5P0CP zIqX^`)?4IgQ~JUX7jY2;!TOBJA5 z+V}uh9|0Xs@a%r)WEa%D$6&Ua0Ndt7JJu%?lDHQ%SS(gNkuX|qX`8>;<8pfqX25K< zg;wr!A-ff@Io6%A?+>}XTLue&*jA~Bzl6hKr_;q_5C?gKvo{h5>aEX>UaQ6~f8d+$ z@%e*BD}ZBI`fy^nju185oh}b>CLe-fmSNY{ zbnrkGf+lEQKoG?5c5*BS^_9b#ItH8%jGkjTj=Fc6Nkb+!H#ZX~id>bWs`4aFbFiC9 zQjR|c@hi%xs)BJoWLYM~vec%9w#<_x$zc%B^EAzvEMPPmHCRA~p;1){+9!{rNGui$ zLlLvtobXs+wajj}3lu_XJM5?T3TZ@>@B^~xet8M0OnR~ zYp=-dY*U`vZT#fLuHmNayqCMXpTAUC@Z|kBYIb->R5?18P=+CokAAK@<)*u8HKVT_ zozrwH^7M;4#nS0!+1*{XSNFNLM|aIS8zPc+Zyjbx-v;Nb$YA4 ha^QrtXQ-vW*w9f>_B3 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Reverso extends Module +{ + private $_html; + private $_api_url = 'http://api2.reversoform.com/includes/api.controler.reverso2.php?phone_number={ARG_PHONE}&serial={ARG_SERIAL}&remoteAddress={ARG_ADDRESS}'; + + function __construct() + { + $this->name = 'reverso'; + $this->tab = 'front_office_features'; + $this->version = '1.0'; + // Iso code of countries where the module can be used, if none module available for all countries + $this->limited_countries = array('fr'); + $this->need_instance = 0; + + parent::__construct(); + /* The parent construct is required for translations */ + $this->displayName = $this->l('ReversoForm'); + $this->description = $this->l('Fill Authentication form with ReversoForm'); + } + + public function install() + { + // Check if hook exists + $result = Db::getInstance()->getValue(' + SELECT COUNT(*) AS total + FROM `'._DB_PREFIX_.'hook` + WHERE `name` = \'createAccountTop\' + '); + if (!$result) + if(!Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook` (`name`, `title`, `description`, `position`) + VALUES (\'createAccountTop\', \'Block above the form for create an account\', NULL , \'1\'); + ')) + return false; + + if (!parent::install()) + return false; + + if (!$this->registerHook('createAccountTop')) + return false; + + return (Configuration::updateValue('REVERSO_SERIAL', '0123456789123') AND + Configuration::updateValue('REVERSO_BAD_NUMBER', 1) AND + Configuration::updateValue('REVERSO_UNKNOWN_NUMBER', 2) AND + Configuration::updateValue('REVERSO_ADDRESS', str_replace('http://', '', $_SERVER['HTTP_HOST']))); + } + + private function _postProcess() + { + return (Configuration::updateValue('REVERSO_SERIAL', pSQL(Tools::getValue('reverso_serial'))) AND + Configuration::updateValue('REVERSO_ADDRESS', pSQL(Tools::getValue('reverso_address')))); + + } + + public function hookCreateAccountTop($params) + { + global $smarty; + $tag = ''; + $smarty->assign(array('reverso_tag' => $tag)); + return $this->display(__FILE__, 'reverso.tpl'); + } + + private function _displayForm() + { + $conf = Configuration::getMultiple(array('REVERSO_SERIAL', 'REVERSO_ADDRESS')); + + $this->_html .= + '
    '.$this->l('Configuration').' +
    + +
    + +
    + +
    + +
    + +
    '; + } + + public function getContent() + { + $this->_html .= '

    '.$this->l('Reverso account configuration').'

    + '.$this->l('You don\'t have a ReversoForm account yet?').' '.$this->l('Register now!').''; + if (!empty($_POST)) + { + if ($this->_postProcess()) + $this->_html .= $this->displayConfirmation($this->l('Settings are updated').''); + } + else + $this->_html .= '
    '; + $this->_displayForm(); + return $this->_html; + } + + public function callReverso($phone = false) + { + if ($phone === false) + return false; + + $conf = Configuration::getMultiple(array('REVERSO_SERIAL', + 'REVERSO_ADDRESS', + 'REVERSO_BAD_NUMBER', + 'REVERSO_UNKNOWN_NUMBER')); + + $phone = str_replace(array(' '), '', $phone); + if (strlen($phone) < 10) + return (int)($conf['REVERSO_BAD_NUMBER']); + + $url_to_call = str_replace(array('{ARG_PHONE}', '{ARG_SERIAL}', '{ARG_ADDRESS}'), array($phone, $conf['REVERSO_SERIAL'], $conf['REVERSO_ADDRESS']), $this->_api_url); + $reverso = file_get_contents($url_to_call); + + $address = Tools::jsonDecode($reverso, true); + if ($address == 'NULL') + return (int)($conf['REVERSO_BAD_NUMBER']); + + $fields = array('last_name' => 'lastname', + 'first_name' => 'firstname', + 'zip' => 'postcode', + 'city' => 'city', + 'address' => 'address1', + 'company' => 'company' + ); + $to_presta = array(); + foreach ($fields AS $k => $field) + if (array_key_exists($k, $address)) + $to_presta[$field] = $address[$k]; + + $to_presta = ''; + foreach ($fields AS $k => $field) + $to_presta .= (array_key_exists($k, $address) ? $field.':'.$address[$k].',' : ''); + + $to_presta .= 'customer_firstname:'.(array_key_exists('first_name', $address) ? $address['first_name'] : '').',customer_lastname:'.(array_key_exists('last_name', $address) ? $address['last_name'] : ''); + + return rtrim($to_presta, ','); + } +} + diff --git a/modules/reverso/reverso.tpl b/modules/reverso/reverso.tpl new file mode 100644 index 000000000..27a0ee64d --- /dev/null +++ b/modules/reverso/reverso.tpl @@ -0,0 +1,39 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{$reverso_tag} + + + diff --git a/modules/reverso/reverso_check.php b/modules/reverso/reverso_check.php new file mode 100644 index 000000000..1077f8499 --- /dev/null +++ b/modules/reverso/reverso_check.php @@ -0,0 +1,41 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/reverso.php'); + +if (!class_exists('Reverso')) + Tools::d(Tools::displayError('Error in loading Reverso')); + +$reverso = new Reverso(); +if (!Validate::isLoadedObject($reverso)) + Tools::d(Tools::displayError('Error in loading Reverso')); + +$reverso_result = $reverso->callReverso(pSQL(Tools::getValue('phone'))); + +echo $reverso_result; +exit; + diff --git a/modules/secuvad/classes/PaymentCC.php b/modules/secuvad/classes/PaymentCC.php new file mode 100644 index 000000000..5aa401ec2 --- /dev/null +++ b/modules/secuvad/classes/PaymentCC.php @@ -0,0 +1,64 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class PaymentCC extends ObjectModel +{ + public $id_order; + public $id_currency; + public $amount; + public $transaction_id; + public $card_number; + public $card_brand; + public $card_expiration; + public $card_holder; + public $date_add; + + protected $fieldsRequired = array('id_currency', 'amount'); + protected $fieldsSize = array('transaction_id' => 254, 'card_number' => 254, 'card_brand' => 254, 'card_expiration' => 254, 'card_holder' => 254); + protected $fieldsValidate = array( + 'id_order' => 'isUnsignedId', 'id_currency' => 'isUnsignedId', 'amount' => 'isPrice', + 'transaction_id' => 'isAnything', 'card_number' => 'isAnything', 'card_brand' => 'isAnything', 'card_expiration' => 'isAnything', 'card_holder' => 'isAnything'); + + protected $table = 'payment_cc'; + protected $identifier = 'id_payment_cc'; + + public function getFields() + { + parent::validateFields(); + $fields['id_order'] = (int)($this->file); + $fields['id_currency'] = (int)($this->file); + $fields['amount'] = (float)($this->amount); + $fields['transaction_id'] = pSQL($this->transaction_id); + $fields['card_number'] = pSQL($this->card_number); + $fields['card_brand'] = pSQL($this->card_brand); + $fields['card_expiration'] = pSQL($this->card_expiration); + $fields['card_holder'] = pSQL($this->card_holder); + $fields['date_add'] = pSQL($this->date_add); + return $fields; + } +} + diff --git a/modules/secuvad/classes/Secuvad_connection.php b/modules/secuvad/classes/Secuvad_connection.php new file mode 100644 index 000000000..1546a1f6b --- /dev/null +++ b/modules/secuvad/classes/Secuvad_connection.php @@ -0,0 +1,180 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class Secuvad_connection +{ + public $data; + public $idsecuvad; + public $url; + public $secuvad_orders; + private $secuvad_h; + + public function __construct($data, $idsecuvad, $url, &$secuvad_h) + { + $this->data = $data; + $this->idsecuvad = $idsecuvad; + $this->url = $url; + $this->secuvad_h = $secuvad_h; + } + + private function send($key) + { + $toReturn = 'false'; + $url = $this->url; + if ($key == 'bulk_transactions') + $post = 'siteid='.(int)(Configuration::get('SECUVAD_ID')).'&bulk_transactions='.$this->data; + else + $post = $key.'='.$this->data; + $ci = curl_init($url); + if ($ci === false) + { + $error = curl_error($ci); + $this->secuvad_h->secuvad_log("secuvad_connection.php::send() \n\t Error curl_init() : ".$error); + } + else + { + curl_setopt($ci, CURLOPT_POST, 1); + curl_setopt($ci, CURLOPT_POSTFIELDS, $post); + curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); + + $headers = array('Content-type: text/xml;charset="utf-8"'); + $rep = curl_exec($ci); + + if ($rep === false) + { + $toReturn = 'false'; + $error = curl_error($ci); + $this->secuvad_h->secuvad_log('secuvad_connection.php::send() '."\n\t".' Error: curl_exec() : '.$error); + } + else + { + $toReturn = $rep; + $this->secuvad_h->secuvad_log('secuvad_connection.php::send() '."\n\t".' curl_exec() returned : '.$toReturn); + } + curl_close($ci); + } + return $toReturn; + } + + public function report_fraud($post, $balise) + { + $response = str_replace("\n", "", $this->send($post)); + $response = str_replace("\r", "", $response); + if (preg_match('#<'.$balise.'>.{0,4}([^<]*)<.transaction_report>.{0,4}<.'.$balise.'>#Ui', $response, $regs)) + { + $response = preg_replace('#<'.$balise.'>.{0,4}'.$regs[2].'<.transaction_report>.{0,4}<.'.$balise.'>#Ui','', $response); + $idtransaction = $regs[1]; + $feedback = $regs[2]; + if ($feedback == 'OK' AND ($balise == 'fraude_report' OR $balise == 'impaye_report')) + { + if ($balise == 'fraude_report') + $this->secuvad_h->secuvad_log('secuvad_connection.php::report_fraud() '."\n\t".' Fraud: '.(int)($idtransaction).'/'.$feedback); + elseif ($balise == 'impaye_report') + $this->secuvad_h->secuvad_log('secuvad_connection.php::report_fraud() '."\n\t".' Unpaid: '.(int)($idtransaction).'/'.$feedback); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `is_fraud` = 1 + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + return 'true'; + } + else + { + $this->secuvad_h->secuvad_log('secuvad_connection.php::report_fraud() '."\n\t".' Error: '.(int)($idtransaction).'/'.$feedback); + return $feedback; + } + } + else + return 'Erreur de connexion'; + } + + + public function send_transaction() + { + global $currentIndex, $cookie; + + $flag_rep = false; + $response = str_replace("\n", "", $this->send('bulk_transactions')); + $response = str_replace("\r", "", $response); + + if (preg_match('#([0-9]*)<.score>([^<]*)([^<]*)<.error><.transaction_report>#Ui', $response, $regs)) + { + $flag_rep = true; + $response = preg_replace("#".$regs[2]."<.score>".$regs[3]."".$regs[4]."<.error><.transaction_report>#Ui","", $response); + + $idtransaction = $regs[1]; + $score = $regs[2]; + $advice = $regs[3]; + $erreur = $regs[4]; + + if (!empty($erreur)) + { + $this->secuvad_h->secuvad_log('secuvad_connection.php::send_transaction() '."\n\t".' Error: '.$erreur); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `secuvad_status` = 4, `error` = \''.pSQL($erreur).'\' + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + } + else + { + $this->secuvad_h->secuvad_log('secuvad_connection.php::send_transaction() '."\n\t".' Response: '.(int)($idtransaction).'/'.(int)($score).'/'.$advice); + if(preg_match('/[0-9]+/', $score)) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `secuvad_status` = 5, `score` = '.(int)($score).', error = \'\' + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + else + { + if (strtoupper($advice) == 'INVALIDE') + $secuvad_status = 3; + elseif (strtoupper($advice) == 'VALIDE') + $secuvad_status = 1; + elseif (strtoupper($advice) == 'A EXPERTISER') + $secuvad_status = 7; + elseif (strtoupper($advice) == 'A EXPERTISER C') + $secuvad_status = 6; + elseif (strtoupper($advice) == 'EN ATTENTE') + $secuvad_status = 2; + else + $secuvad_status = 4; + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `advice` = \''.pSQL($advice).'\', `error` = \'\', `secuvad_status` = '.(int)($secuvad_status).' + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + } + } + } + if (preg_match('#([^<]*)<.global_report>([^<]+)<.error><.bulk_report>#Ui', $response, $regs)) + { + $flag_rep = true; + $this->secuvad_h->secuvad_log('secuvad_connection.php::send_transaction() '."\n\t".' Error: '.$regs[2]); + } + if (!$flag_rep) + $this->secuvad_h->secuvad_log('secuvad_connection.php::send_transaction() '."\n\t".' Error: '.$rep); + } +} + diff --git a/modules/secuvad/classes/Secuvad_flux.php b/modules/secuvad/classes/Secuvad_flux.php new file mode 100644 index 000000000..3b92ed0ac --- /dev/null +++ b/modules/secuvad/classes/Secuvad_flux.php @@ -0,0 +1,237 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class Secuvad_flux +{ + public $encoding = 'utf-8'; + public $flux_xml; + public $id_order; + public $imp_time; + public $idsecuvad; + + function __construct($idsecuvad, $encoding) + { + $this->idsecuvad = $idsecuvad; + $this->encoding = $encoding; + } + + public function get_flux_xml_fraud($id_order) + { + $this->id_order = (int)($id_order); + $this->imp_time = date("Y-m-d H:i:s"); + $this->flux_xml = 'encoding.'" ?>' . "\n"; + $this->flux_xml .= ''.$this->idsecuvad.''.(int)($this->id_order).''.$this->imp_time.''; + + return ($this->flux_xml); + } + + function get_flux_xml($id_order) + { + $this->id_order = (int)($id_order); + $this->flux_xml = ''; + $this->flux_xml .= 'encoding.'" ?>' . "\n"; + $this->flux_xml .= '' . "\n"; + $this->flux_xml .= $this->get_flux_xml_order(); + $this->flux_xml .= '' . "\n"; + return $this->flux_xml; + } + + private function get_flux_xml_order() + { + global $cookie; + + $order = new Order((int)($this->id_order)); + $address_delivery = new Address((int)($order->id_address_delivery)); + $address_invoice = new Address((int)($order->id_address_invoice)); + $customer = new Customer((int)($order->id_customer)); + $currency = new Currency((int)($order->id_currency)); + $carrier = new Carrier((int)($order->id_carrier)); + + $ip = Db::getInstance()->getValue(' + SELECT `ip` + FROM `'._DB_PREFIX_.'secuvad_order` + WHERE `id_secuvad_order` = '.(int)($this->id_order)); + if (!$ip) + return false; + $payment_cc = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'payment_cc` + WHERE `id_order` = '.(int)($this->id_order)); + if ($payment_cc) + { + $card_number = $payment_cc['card_number']; + $card_expiration = $payment_cc['card_expiration']; + } + + $carrier = Db::getInstance()->getRow(' + SELECT at.`transport_id`, td.`transport_delay_name` + FROM `'._DB_PREFIX_.'secuvad_assoc_transport` at + JOIN `'._DB_PREFIX_.'secuvad_transport_delay` td ON (at.`transport_delay_id` = td.`transport_delay_id`) + JOIN `'._DB_PREFIX_.'lang` l ON (l.`id_lang` = td.`id_lang`) + WHERE l.`id_lang` = '.((isset($cookie->id_lang) AND (int)($cookie->id_lang)) ? (int)($cookie->id_lang) : (int)(Configuration::get('PS_LANG_DEFAULT'))).' + AND at.`id_carrier` = '.(int)($order->id_carrier)); + $transptype = $carrier['transport_id']; + $rapidite = $carrier['transport_delay_name']; + + $code_payment = Db::getInstance()->getValue(' + SELECT sap.`code` + FROM `'._DB_PREFIX_.'module` m + JOIN `'._DB_PREFIX_.'secuvad_assoc_payment` sap ON (m.`id_module` = sap.`id_module`) + WHERE m.`name` = \''.pSQL($order->module).'\''); + + $flux_xml = "\n"; + switch ($customer->id_gender) + { + case 1: + $gender = 'M'; + break; + case 2: + $gender = 'Mme'; + break; + case 3: + $gender = 'Mlle'; + break; + default: + $gender = 'M'; + break; + } + + if($address_invoice->company == '') + $flux_xml .= ''."\n"; + else + $flux_xml .= ''."\n"; + $flux_xml .= ''.$address_invoice->lastname.''."\n"; + $flux_xml .= ''.$address_invoice->firstname.''."\n"; + if($address_invoice->company != '') + $flux_xml .= ''.$address_invoice->company.''."\n"; + $flux_xml .= ''.$address_invoice->phone.''."\n"; + $flux_xml .= ''.$address_invoice->phone_mobile.''."\n"; + $flux_xml .= ''.$customer->email.''."\n"; + $flux_xml .= ''; + + $flux_xml .= ''."\n"; + $flux_xml .= ''.$address_invoice->address1.''."\n"; + $flux_xml .= ''.$address_invoice->address2.''."\n"; + $flux_xml .= ''.$address_invoice->postcode.''."\n"; + $flux_xml .= ''.$address_invoice->city.''."\n"; + $flux_xml .= ''.$address_invoice->country.''."\n"; + $flux_xml .= ''."\n"; + + $flux_xml .= ''."\n"; + $flux_xml .= ''.$address_delivery->address1.''."\n"; + $flux_xml .= ''.$address_delivery->address2.''."\n"; + $flux_xml .= ''.$address_delivery->postcode.''."\n"; + $flux_xml .= ''.$address_delivery->city.''."\n"; + $flux_xml .= ''.$address_delivery->country.''."\n"; + $flux_xml .= ''."\n"; + + $flux_xml .= ''."\n"; + $flux_xml .= ''.$this->idsecuvad.''."\n"; + $flux_xml .= ''.(int)($this->id_order).''."\n"; + $flux_xml .= ''.$order->date_add.''."\n"; + $flux_xml .= ''.$order->total_paid_real.''."\n"; + $flux_xml .= ''.$order->total_shipping.''."\n"; + $flux_xml .= ''.$ip.''."\n"; + $flux_xml .= ''."\n"; + $flux_xml .= $this->get_flux_xml_products(); + $flux_xml .= ''."\n"; + + $flux_xml .= ''."\n"; + $flux_xml .= ''."\n"; + if($code_payment == 'cheque') + $flux_xml .= ''."\n"; + elseif($code_payment == 'virement') + $flux_xml .= ''."\n"; + elseif($code_payment == 'paypal') + $flux_xml .= ''."\n"; + elseif($code_payment == 'cb en n fois') + $flux_xml .= ''."\n"; + elseif($code_payment == 'contre-remboursement') + $flux_xml .= ''."\n"; + elseif($code_payment == "carte") + { + if (!empty($card_number)) + { + $cc_array = preg_split('/([X0-9]{4})/Ui', strtoupper($card_number), -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + + if (sizeof($cc_array)) + { + $bin_array = array(); + foreach ($cc_array as $element) + $bin_array[] = str_replace('X', '', $element); + + $card_number = str_replace('X', '', $card_number); // 16 char + $bin = $bin_array[0].'-'.$bin_array[1]; // 6 char + $bin4 = $bin_array[0]; // 4 char + $bin42 = $bin_array[0].'-'.$bin_array[3]; // 6 char + + if (strlen($bin42) != 7 AND strlen($bin4) != 4 AND strlen($bin) != 7 AND strlen($card_number) != 16) + return false; + + $flux_xml .= ''."\n"; + } + else + return false; + } + else + return false; + } + $flux_xml .= ''."\n"; + $flux_xml .= ''."\n"; + $flux_xml .= ''."\n"; + + return $flux_xml; + } + + private function get_flux_xml_products() + { + global $cookie; + + $flux_xml = ''; + $order = new Order((int)($this->id_order)); + $products = $order->getProducts(); + foreach($products as $product) + { + $data = Db::getInstance()->getRow(' + SELECT sac.`category_id`, pl.`name` + FROM `'._DB_PREFIX_.'secuvad_assoc_category` sac + JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = sac.`id_category`) + JOIN `'._DB_PREFIX_.'category` c ON (c.`id_category` = cp.`id_category`) + JOIN `'._DB_PREFIX_.'product_lang` pl ON (cp.`id_product` = pl.`id_product`) + JOIN `'._DB_PREFIX_.'lang` l ON (l.`id_lang` = pl.`id_lang` AND l.`id_lang` = '.((isset($cookie->id_lang) AND (int)($cookie->id_lang)) ? (int)($cookie->id_lang) : (int)(Configuration::get('PS_LANG_DEFAULT'))).') + WHERE pl.`id_product` = '.(int)($product['product_id']).' + ORDER BY c.`level_depth` DESC + ',true); + $flux_xml .= ''."\n"; + } + $flux_xml = ''."\n".$flux_xml.''."\n"; + return $flux_xml; + } + +} + + diff --git a/modules/secuvad/config.xml b/modules/secuvad/config.xml new file mode 100755 index 000000000..f3f2beb8d --- /dev/null +++ b/modules/secuvad/config.xml @@ -0,0 +1,13 @@ + + + secuvad + + + + + + Are you sure you want to delete this module? + 1 + 0 + + \ No newline at end of file diff --git a/modules/secuvad/de.php b/modules/secuvad/de.php new file mode 100644 index 000000000..a34d5e38e --- /dev/null +++ b/modules/secuvad/de.php @@ -0,0 +1,116 @@ +secuvad_e4ba26360a7818a71d48addc3ea19078'] = 'Secuvad Modul'; +$_MODULE['<{secuvad}prestashop>secuvad_ebedf7d0e130dbb2afd22987ff22708b'] = 'Lösung für den Kampf gegen Online-Betrug'; +$_MODULE['<{secuvad}prestashop>secuvad_a9828808bf0dcd0b7af8e6f20b80ad85'] = 'Sie sind sicher, dass Sie dieses Modul löschen möchten?'; +$_MODULE['<{secuvad}prestashop>secuvad_307bfa08da823ee566ce867b563eb223'] = 'Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_8fbc70c37e2deff790fe4e95fce7c9d8'] = 'Um denSecuvad Schutz zu verwenden, konfigurieren Sie bitte Ihr Modul.'; +$_MODULE['<{secuvad}prestashop>secuvad_d3dd6e2937eb4430278bce947553b7ca'] = 'Secuvad Status:'; +$_MODULE['<{secuvad}prestashop>secuvad_163f6b2856a83d0bb03aee72f8f072a5'] = 'Übermittelte offene Zahlungen'; +$_MODULE['<{secuvad}prestashop>secuvad_f3182252d448607de30d2b4cfe420db1'] = 'Secuvad Status aktualisieren'; +$_MODULE['<{secuvad}prestashop>secuvad_af7fdbd69d96ddaba932d48c45b89dcf'] = 'Ein offene Zahlung übermitteln '; +$_MODULE['<{secuvad}prestashop>secuvad_ef1168698f5c33450f0d3166da5e4740'] = 'Bitte beachten Sie, dass Sie durch die Übergabe solcher offenen Zahlungen an SECUVAD bestätigen, dass Ihre Forderung stimmt, flüssig und zahlbar ist, und dass Sie SECUVAD EXKLUSIV die Deckung der Beträge anvertrauen. Möchten Sie fortfahren?'; +$_MODULE['<{secuvad}prestashop>secuvad_85b94c96da82beb688084f64adfbf185'] = 'Secuvad Konfiguration'; +$_MODULE['<{secuvad}prestashop>secuvad_04d45d9f5ece926babe251d7b628ecca'] = 'Die Zahlungs- CC Datei ist nicht vorhanden, kopieren Sie bitte diese Datei in das Klassen-Verzeichnis Ihres Prestashop'; +$_MODULE['<{secuvad}prestashop>secuvad_2113b53bbb4a93786e042937cd04f21f'] = 'Bitte konfigurieren Sie alle Verknüpfungen'; +$_MODULE['<{secuvad}prestashop>secuvad_062f3f5ae8644882a2da949705ced1ac'] = 'Wenn Sie bereits ein Konto haben'; +$_MODULE['<{secuvad}prestashop>secuvad_0e79ca3a8ef61f2ec317e5734082de3f'] = 'Firmentyp ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_73c23113d237a4f8e56df46745d9e08e'] = 'Firmenname ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_a5253c7f1e4f48d55eb46507f9af21e3'] = 'Kapital ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_c99b7e43f604b6c71a06336b727d99b9'] = 'Webseite ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_5b550fbcefc1b473adff36761fbc97fd'] = 'Adresse ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_7b3bad39fc3ac5b25ae0523e6d58be68'] = 'PLZ ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_ceb8e9adca824ee71883fce1612e9fea'] = 'Stadt ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_3f1e50fba8ee7cc383eb164c7d5d0fb9'] = 'Land ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_c678a6253de57c93c0ab007d23a119c6'] = 'RCS ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_b5061793e15ec84cd10f3b299d1f51a2'] = 'Siren ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_8c97e587c1b4e519bec26f3903561da3'] = 'Sie müssen mindestens eine Kategorie wählen'; +$_MODULE['<{secuvad}prestashop>secuvad_e0d398bfe015c1cc6fbd01fa9bcafb71'] = 'Titel ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_9bd987e611b01bc320c4b41fd0f44cb0'] = 'Nachname ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_d4a7da3641038f3a960339e8880297e4'] = 'Vorname ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_b3871d55ec4fd5d776a9411b8a3286d8'] = 'Funktion ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_d9a821ab8ae9651b6e4a11798bb4fd39'] = 'E-Mail-Name ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_7f203a223defb75e34e9949e9054511a'] = 'Telefon ist ungültig'; +$_MODULE['<{secuvad}prestashop>secuvad_a6f2a48726b0d36107e00e20795d3d37'] = 'Ungültige Login'; +$_MODULE['<{secuvad}prestashop>secuvad_cba0b206627d45fbf0ae707e20d4a38f'] = 'Ungültiges Kennwort'; +$_MODULE['<{secuvad}prestashop>secuvad_12477418db51dc813000335f72b9fcf2'] = 'Ungültiger Modus'; +$_MODULE['<{secuvad}prestashop>secuvad_c1c8a564c10a0efe07bb4e4b20d88cc9'] = 'Ungültige ID'; +$_MODULE['<{secuvad}prestashop>secuvad_7ccf58c950043c9fbfed668df13ce608'] = 'Einstellungen werden aktualisiert'; +$_MODULE['<{secuvad}prestashop>secuvad_5a7f1ef0cabc9cac6fc4ef1c2eba2eb4'] = 'Fehler beim Aktualisieren'; +$_MODULE['<{secuvad}prestashop>secuvad_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Firma'; +$_MODULE['<{secuvad}prestashop>secuvad_051672911a3f1f05efba78a553ef6fe2'] = 'Login:'; +$_MODULE['<{secuvad}prestashop>secuvad_b341a59d5636ed3d6a819137495b08a0'] = 'Kennwort:'; +$_MODULE['<{secuvad}prestashop>secuvad_1ee1c44c2dc81681f961235604247b81'] = 'Modus:'; +$_MODULE['<{secuvad}prestashop>secuvad_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{secuvad}prestashop>secuvad_756d97bb256b8580d4d71ee0c547804e'] = 'Betrieb'; +$_MODULE['<{secuvad}prestashop>secuvad_e0f0b0564d3d29a93fad7a4178b7b1ca'] = 'ID:'; +$_MODULE['<{secuvad}prestashop>secuvad_94966d90747b97d1f0f206c98a8b1ac3'] = 'Senden'; +$_MODULE['<{secuvad}prestashop>secuvad_8cf04a9734132302f96da8e113e80ce5'] = 'Startseite'; +$_MODULE['<{secuvad}prestashop>secuvad_201095b8aa27cc3bd5e6dcc407ab2bdb'] = 'Secuvad Kategorien'; +$_MODULE['<{secuvad}prestashop>secuvad_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{secuvad}prestashop>secuvad_116b7a3c4f415260f5a0d9a9d3a49f97'] = 'Secuvad Kategorie'; +$_MODULE['<{secuvad}prestashop>secuvad_7a0de9003696a0e833694b22a5ea6d91'] = 'Secuvad Zahlung'; +$_MODULE['<{secuvad}prestashop>secuvad_593bda837f8ae222993fc189457c92a0'] = 'Secuvad Zahlungsart'; +$_MODULE['<{secuvad}prestashop>secuvad_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Unbekannt'; +$_MODULE['<{secuvad}prestashop>secuvad_68eb4e159f449c625edb23b2c35e7259'] = 'Secuvad Lieferant'; +$_MODULE['<{secuvad}prestashop>secuvad_7cc72fb5b56d882a4c34cb68dd4604aa'] = 'Secuvad Lieferfrist'; +$_MODULE['<{secuvad}prestashop>secuvad_de5744adc681a40f1b0fe16f3707da5b'] = 'Um das Secuvad Modul zu verwenden, füllen Sie bitte dieses Formular aus, klicken Sie dann auf \"Registrieren\"'; +$_MODULE['<{secuvad}prestashop>secuvad_6bf36964a57a5eaa5f46504ca9882cdb'] = 'Firmentyp:'; +$_MODULE['<{secuvad}prestashop>secuvad_c700e3beca05135eca91df55981402f5'] = 'SARL'; +$_MODULE['<{secuvad}prestashop>secuvad_3dd6b9265ff18f31dc30df59304b0ca7'] = 'SA'; +$_MODULE['<{secuvad}prestashop>secuvad_e00147cd1ed977d431491ce5c1b02f8a'] = 'EURL'; +$_MODULE['<{secuvad}prestashop>secuvad_2db46c628cfb3bd1545d3b5a14b4a9c5'] = 'SAS'; +$_MODULE['<{secuvad}prestashop>secuvad_d3cc996e019ec9721479e63b2fd622d8'] = 'Einzelunternehmen'; +$_MODULE['<{secuvad}prestashop>secuvad_57aab2fcd93938cfbca356bb5571b25b'] = 'SNC'; +$_MODULE['<{secuvad}prestashop>secuvad_5e116ceb48a98fb755f22df7ea1e2396'] = 'Firmenname:'; +$_MODULE['<{secuvad}prestashop>secuvad_7b1b1d6f1a6793e17aeeffa80ac8fdaa'] = 'Kapital:'; +$_MODULE['<{secuvad}prestashop>secuvad_e5cb8489f57db7c15eed3258e48cd5f3'] = 'Webseite:'; +$_MODULE['<{secuvad}prestashop>secuvad_2bf1d5fae1c321d594fdedf05058f709'] = 'Adresse:'; +$_MODULE['<{secuvad}prestashop>secuvad_8116ea5ccd73f945bb5e260861b0b570'] = 'Postleitzahl:'; +$_MODULE['<{secuvad}prestashop>secuvad_bffb711ec36f280459d11dce315da72f'] = 'Stadt:'; +$_MODULE['<{secuvad}prestashop>secuvad_f64be5eef68442a8f50cf535b92ad3e4'] = 'Land:'; +$_MODULE['<{secuvad}prestashop>secuvad_51bdf131ea9fab11d517cc19fe5d8d73'] = 'RCS:'; +$_MODULE['<{secuvad}prestashop>secuvad_f4e462b9ed48a0e96da9730875f9dd58'] = 'Siren:'; +$_MODULE['<{secuvad}prestashop>secuvad_70397c4b252a5168c5ec003931cea215'] = 'Pflichtfelder'; +$_MODULE['<{secuvad}prestashop>secuvad_0e0f3e0ad86de8103ac0f5c74726da24'] = 'Produkttypen'; +$_MODULE['<{secuvad}prestashop>secuvad_432d0563f8721b5285e5bd18c0aee4ea'] = 'Kategorien Ihrer Produkte:'; +$_MODULE['<{secuvad}prestashop>secuvad_7d0ba2d2a3223badb6f7b026946fc16d'] = 'Firmendaten'; +$_MODULE['<{secuvad}prestashop>secuvad_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Titel:'; +$_MODULE['<{secuvad}prestashop>secuvad_2c9b5b15a6d3cc951ca57c65e4966fd3'] = 'Herr'; +$_MODULE['<{secuvad}prestashop>secuvad_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Frau'; +$_MODULE['<{secuvad}prestashop>secuvad_e7ddb7cd777b59610b220bcfa80bd95f'] = 'Fräulein'; +$_MODULE['<{secuvad}prestashop>secuvad_be5e0b5d50d48b049bd0f7b57cd163f9'] = 'Nachname:'; +$_MODULE['<{secuvad}prestashop>secuvad_668a8d8d7ffe5da112b266e46b79b685'] = 'Vorname:'; +$_MODULE['<{secuvad}prestashop>secuvad_6a858980896cb9daee81930c61bc1696'] = 'Funktion:'; +$_MODULE['<{secuvad}prestashop>secuvad_01401fe9a93df81d28637e5218597b76'] = 'E-Mail:'; +$_MODULE['<{secuvad}prestashop>secuvad_673ae02fffb72f0fe68a66f096a01347'] = 'Telefon:'; +$_MODULE['<{secuvad}prestashop>secuvad_7dce122004969d56ae2e0245cb754d35'] = 'Bearbeiten'; +$_MODULE['<{secuvad}prestashop>secuvad_0ba7583639a274c434bbe6ef797115a4'] = 'Registrieren'; +$_MODULE['<{secuvad}prestashop>secuvad_2f8531293ddfd4f30bb978e93d49f650'] = 'Mail:'; +$_MODULE['<{secuvad}prestashop>secuvad_42dbbc555675ff22f80115c0570de888'] = 'VorgansbBeschreibung:'; +$_MODULE['<{secuvad}prestashop>secuvad_401886eb11224f37cbbd93211e991c85'] = 'Protokoll-Dateien:'; +$_MODULE['<{secuvad}prestashop>secuvad_fa29ad39f28d8d3a9b873ac37dec2899'] = 'Fehlerbericht'; +$_MODULE['<{secuvad}prestashop>secuvad_a649552939461a1cce6c2d77e2de44d0'] = 'Folgende Zahlungsmodule sind nicht zugeordnet:'; +$_MODULE['<{secuvad}prestashop>secuvad_b0d7bc21f644e151a6dec99181ac0718'] = 'Folgende Versandmodule sind nicht zugeordnet:'; +$_MODULE['<{secuvad}prestashop>secuvad_68a569c0346cff10b9626e27fae1de48'] = 'Folgende Kategorien sind nicht zugeordnet:'; +$_MODULE['<{secuvad}prestashop>secuvad_a1d333dc75f4e131835c8104c4b2d966'] = 'Fehler bei der Aktivierung'; +$_MODULE['<{secuvad}prestashop>secuvad_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Fehler'; +$_MODULE['<{secuvad}prestashop>secuvad_7fd791b8ff524778a13d978ff04f0bb9'] = 'Unmöglich, Betrug zu melden vor dem Absenden der entsprechenden Bestellung'; +$_MODULE['<{secuvad}prestashop>secuvad_2e92ae79ff32b37fee4368a594792183'] = 'Verbindungsfehler'; +$_MODULE['<{secuvad}prestashop>secuvad_2d7839314eb05f8988381b70dbc1548b'] = 'Ist kein Betrug'; +$_MODULE['<{secuvad}prestashop>secuvad_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{secuvad}prestashop>secuvad_1b93ce75458ea0ce94250a781ff0835e'] = 'Ist ein Betrug'; +$_MODULE['<{secuvad}prestashop>secuvad_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{secuvad}prestashop>secuvad_830560d945b2aa75e58b6f0b7ffe0882'] = 'Nicht a Secuvad gesendet'; +$_MODULE['<{secuvad}prestashop>secuvad_3d0362bcbb2783e82be0612668eb7ce9'] = 'Bestätigt durch Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_999dfff14d541898b1c7266c3c271d40'] = 'Analysiert'; +$_MODULE['<{secuvad}prestashop>secuvad_a464f32e0e54df4786e7d905577b7f0c'] = 'Verdächtige Bestellung'; +$_MODULE['<{secuvad}prestashop>secuvad_f6ba219e7a45632ab4d39822108d68f3'] = 'Muss vom Kunden überprüft werden'; +$_MODULE['<{secuvad}prestashop>secuvad_e2cadc35c8d021861738765b25666ebb'] = 'Muss von Secuvad überprüft werden'; +$_MODULE['<{secuvad}prestashop>secuvad_config_8bcaf785d6c5771e3c49bd90e0885c2a'] = 'Hackversuch'; +$_MODULE['<{secuvad}prestashop>secuvad_config_1f4eee5122ff1dfb7c7ff3aa8e879222'] = 'Kein autorisierter Zugriff'; +$_MODULE['<{secuvad}prestashop>secuvad_config_635c1728fc02b144a4357007b44d55b7'] = 'Die gesendeten Daten sind:'; + +?> \ No newline at end of file diff --git a/modules/secuvad/en.php b/modules/secuvad/en.php new file mode 100644 index 000000000..62af5abcb --- /dev/null +++ b/modules/secuvad/en.php @@ -0,0 +1,101 @@ +AdminSecuvad_e77d1c075ac8442c061e9b97c1be30e1'] = 'Valide'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_3b2bcaaa719709957ea65f7b554da650'] = 'Fraud'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_830560d945b2aa75e58b6f0b7ffe0882'] = 'Not sent to Secuvad'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_e734be84875a28b47281b9288ddbf5c9'] = 'Valide order'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_f611e08cffb261d08d536dc0b3e3cce3'] = 'Analysing'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_a464f32e0e54df4786e7d905577b7f0c'] = 'Suspect order'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Error'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_5dd135d1bcfa7f63c3b7f25425c2a4a1'] = 'Score'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_ce26601dac0dea138b7295f02b7620a7'] = 'Customer'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_ec53a8c4f07baed5d8825072c89799be'] = 'Status'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_b130f12d0f2e4cc10edbe80fe31738dc'] = 'Fraud'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_0ca88066c014448b3922d433bfcbda98'] = 'Advice'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_39f0dc2e628c524bb4508e96fb2bb8c2'] = 'Report sent'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_64be8347a1f66883b245658d9c5fd2d2'] = 'Send an error report to Secuvad'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_1e884e3078d9978e216a027ecd57fb34'] = 'E-mail'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_20b97fe763e2c83e86ad13c5deab2793'] = 'Problem'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_548e51fa67d541384e9585adf0db95dc'] = 'SEND'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_a240fa27925a635b08dc28c9e4f9216d'] = 'Order'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_6a3a15bb9cf9363939c4a185bab2baa8'] = 'Submit order'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_0793107616f0dd23aeb93f6333e4497a'] = 'Report fraud'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_a289f218c10d38d0c2d5893d6f66e2e0'] = 'Order sent'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_cd0f4554faa0a407e62e61e75fefe215'] = 'Impossible to report fraud before submiting the associated order'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_ccc693a747385bc315564d772b46a096'] = 'Fraud reported'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_d2354a0232ac2c6b5733ea81e9b92775'] = 'Connection error'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_cff75be08dec22be91f1e35b8ff11c69'] = 'Association payment missing'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_6a1388142be79a7d239f7a3b383af476'] = 'Association shipping missing'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_27b56e2cd17fda9b2079154b45224368'] = 'Association category missing'; +$_MODULE['<{secuvad}prestashop>AdminSecuvad_8207142adb1f99448ea323f057348d6c'] = 'To use this service you have to record'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadCategory_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Category'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadCategory_feb25f4827fd0ffc7180fe60fad65e9c'] = 'Secuvad category'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadCategory_9fbf44c45663e9ebd4660bf1f39fccff'] = 'Category associated'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadCategory_acc9e4f383a2fe511526e54f95f5c735'] = 'Associate the category'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadCategory_c9759ceb6487a0bd2720ca98f2622d24'] = 'to'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadCategory_c9cc8cce247e49bae79f15173ce97354'] = 'Save'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadPayment_e55f75a29310d7b60f7ac1d390c8ae42'] = 'Payment module'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadPayment_307bfa08da823ee566ce867b563eb223'] = 'Payment mode'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadPayment_55059c1f396617c3e8d7b5cce9a38dc1'] = 'Payment associated'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadPayment_593fbedbfba012f2191dbf4cdcff9102'] = 'Associate the payment module'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadPayment_c9759ceb6487a0bd2720ca98f2622d24'] = 'to'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadPayment_c9cc8cce247e49bae79f15173ce97354'] = 'Save'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_914419aa32f04011357d3b604a86d7eb'] = 'Carrier'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_7579788079ec44e74eed653179a3383f'] = 'Shipping type'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_e217d047544934933fcb276951ffe1cf'] = 'Delay'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_cfba8bb4d48ec796dfb51beff1578eea'] = 'Shipping associated'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_57865bf4056d8da5e67c992e84d91814'] = 'Associate the shipping'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_c9759ceb6487a0bd2720ca98f2622d24'] = 'to'; +$_MODULE['<{secuvad}prestashop>AdminSecuvadTransport_c9cc8cce247e49bae79f15173ce97354'] = 'Save'; +$_MODULE['<{secuvad}prestashop>secuvad_e4ba26360a7818a71d48addc3ea19078'] = 'Secuvad module'; +$_MODULE['<{secuvad}prestashop>secuvad_8dfaf37c512f96f126f30e0f5cfbf320'] = 'Solution fighting against online frauds'; +$_MODULE['<{secuvad}prestashop>secuvad_a9828808bf0dcd0b7af8e6f20b80ad85'] = 'Are you sure you want to delete this module ?'; +$_MODULE['<{secuvad}prestashop>secuvad_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Error'; +$_MODULE['<{secuvad}prestashop>secuvad_d3c779f2eff6d9bc3075bcbbabfd5afc'] = 'classes/PaymentModule.php missing'; +$_MODULE['<{secuvad}prestashop>secuvad_34d9eb70abf213ddff973fdff966ee88'] = 'Cannot read file classes/PaymentModule.php'; +$_MODULE['<{secuvad}prestashop>secuvad_272ac5599c0472cb373c617889f1c0d7'] = 'Cannot open file classes/PaymentModule.php on write mode'; +$_MODULE['<{secuvad}prestashop>secuvad_79f6a7cbdbec503b44bd8914a0a300ec'] = 'Cannot write into file classes/PaymentModule.php'; +$_MODULE['<{secuvad}prestashop>secuvad_3cd2cc055bf498ff13338c1690b72ba4'] = 'classes/PaymentModule.php is not writable'; +$_MODULE['<{secuvad}prestashop>secuvad_98b37f1d9af13040deac790c688c21f1'] = 'classes/PaymentModule.php not recognised'; +$_MODULE['<{secuvad}prestashop>secuvad_4f012eecd63b26d04225003668d08694'] = 'Already recorded'; +$_MODULE['<{secuvad}prestashop>secuvad_0f025176fb8b953690ad8f20f119ed75'] = 'COMPANY'; +$_MODULE['<{secuvad}prestashop>secuvad_abf4c8ff520e20fa12dc0dc39f58f9f4'] = 'Company type'; +$_MODULE['<{secuvad}prestashop>secuvad_c281f92b77ba329f692077d23636f5c9'] = 'Company name'; +$_MODULE['<{secuvad}prestashop>secuvad_27f08504c8e23c89383aa5ad890892e9'] = 'capital'; +$_MODULE['<{secuvad}prestashop>secuvad_15bbb9d0bbf25e8d2978de1168c749dc'] = 'Website'; +$_MODULE['<{secuvad}prestashop>secuvad_e839622d891ff633bc0e4f9f47445233'] = 'HEADQUARTER'; +$_MODULE['<{secuvad}prestashop>secuvad_dd7bf230fde8d4836917806aff6a6b27'] = 'Address'; +$_MODULE['<{secuvad}prestashop>secuvad_572ed696f21038e6cc6c86bb272a3222'] = 'Postal code'; +$_MODULE['<{secuvad}prestashop>secuvad_57d056ed0984166336b7879c2af3657f'] = 'City'; +$_MODULE['<{secuvad}prestashop>secuvad_59716c97497eb9694541f7c3d37b1a4d'] = 'Country'; +$_MODULE['<{secuvad}prestashop>secuvad_5852281688f5bba8ddab1a5c7a2a3c6b'] = 'RCS'; +$_MODULE['<{secuvad}prestashop>secuvad_58a84e851e55175d22158ca97af58a1f'] = 'Siren'; +$_MODULE['<{secuvad}prestashop>secuvad_de0e59337080aa9d487ea25375ab4fa1'] = 'REPRESENTATIVE'; +$_MODULE['<{secuvad}prestashop>secuvad_a1e8db7dba8f18eff1391b2eda88b14c'] = 'Civility'; +$_MODULE['<{secuvad}prestashop>secuvad_8d3f5eff9c40ee315d452392bed5309b'] = 'Last name'; +$_MODULE['<{secuvad}prestashop>secuvad_20db0bfeecd8fe60533206a2b5e9891a'] = 'First name'; +$_MODULE['<{secuvad}prestashop>secuvad_86408593c34af77fdd90df932f8b5261'] = 'Function'; +$_MODULE['<{secuvad}prestashop>secuvad_c914477b7443f8b5344304a910b273e1'] = 'PRODUCT TYPES'; +$_MODULE['<{secuvad}prestashop>secuvad_548e51fa67d541384e9585adf0db95dc'] = 'SEND'; +$_MODULE['<{secuvad}prestashop>secuvad_554bd6f99175b80414595911cb8f2e3b'] = 'Recording'; +$_MODULE['<{secuvad}prestashop>secuvad_c700e3beca05135eca91df55981402f5'] = 'SARL'; +$_MODULE['<{secuvad}prestashop>secuvad_3dd6b9265ff18f31dc30df59304b0ca7'] = 'SA'; +$_MODULE['<{secuvad}prestashop>secuvad_e00147cd1ed977d431491ce5c1b02f8a'] = 'EURL'; +$_MODULE['<{secuvad}prestashop>secuvad_2db46c628cfb3bd1545d3b5a14b4a9c5'] = 'SAS'; +$_MODULE['<{secuvad}prestashop>secuvad_35b52a2945b0225ee8d0f95a01701e1c'] = 'Entreprise individuelle'; +$_MODULE['<{secuvad}prestashop>secuvad_57aab2fcd93938cfbca356bb5571b25b'] = 'SNC'; +$_MODULE['<{secuvad}prestashop>secuvad_c56ccc6a1321e66ddd94fe430b8a1f82'] = 'Capital'; +$_MODULE['<{secuvad}prestashop>secuvad_2c9b5b15a6d3cc951ca57c65e4966fd3'] = 'Mr'; +$_MODULE['<{secuvad}prestashop>secuvad_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Mrs'; +$_MODULE['<{secuvad}prestashop>secuvad_e7ddb7cd777b59610b220bcfa80bd95f'] = 'Miss'; +$_MODULE['<{secuvad}prestashop>secuvad_307bfa08da823ee566ce867b563eb223'] = 'Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_bcc254b55c4a1babdf1dcb82c207506b'] = 'Phone number'; +$_MODULE['<{secuvad}prestashop>secuvad_082e55a73f10496681c84231dc1c88f7'] = 'E-Mail'; +$_MODULE['<{secuvad}prestashop>secuvad_e89ab59baea830bd940c300886c50efe'] = 'All fields are mandatory.'; +$_MODULE['<{secuvad}prestashop>secuvad_0b79795d3efc95b9976c7c5b933afce2'] = 'In order to activate you SECUVAD plug\'in, please fill the following form :'; +$_MODULE['<{secuvad}prestashop>secuvad_f4d1ea475eaa85102e2b4e6d95da84bd'] = 'Press SEND to submit your activation form or BACK to modify.'; +$_MODULE['<{secuvad}prestashop>secuvad_421cfd143e450c3f5814a0495409e073'] = 'BACK'; \ No newline at end of file diff --git a/modules/secuvad/es.php b/modules/secuvad/es.php new file mode 100644 index 000000000..9d0255358 --- /dev/null +++ b/modules/secuvad/es.php @@ -0,0 +1,114 @@ +secuvad_e4ba26360a7818a71d48addc3ea19078'] = 'Módulo Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_ebedf7d0e130dbb2afd22987ff22708b'] = 'Solución de lucha contra el fraude en línea'; +$_MODULE['<{secuvad}prestashop>secuvad_a9828808bf0dcd0b7af8e6f20b80ad85'] = '¿Está seguro de querer suprimir este módulo?'; +$_MODULE['<{secuvad}prestashop>secuvad_307bfa08da823ee566ce867b563eb223'] = 'Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_8fbc70c37e2deff790fe4e95fce7c9d8'] = 'Para utilizar el módulo Secuvad, configúrelo.'; +$_MODULE['<{secuvad}prestashop>secuvad_d3dd6e2937eb4430278bce947553b7ca'] = 'Estado Secuvad:'; +$_MODULE['<{secuvad}prestashop>secuvad_163f6b2856a83d0bb03aee72f8f072a5'] = 'Impago transmitido'; +$_MODULE['<{secuvad}prestashop>secuvad_f3182252d448607de30d2b4cfe420db1'] = 'Actualizar el estado Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_af7fdbd69d96ddaba932d48c45b89dcf'] = 'Transmitir un impago'; +$_MODULE['<{secuvad}prestashop>secuvad_ef1168698f5c33450f0d3166da5e4740'] = 'Atención, al transmitir este impago a SECUVAD, implica que su crédito es REAL, EFECTIVA y EXIGIBLE y que autoriza de manera EXCLUSIVA a SECUVAD el cobro del mismo. ¿Desea continuar?'; +$_MODULE['<{secuvad}prestashop>secuvad_85b94c96da82beb688084f64adfbf185'] = 'Configuración Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_04d45d9f5ece926babe251d7b628ecca'] = 'El archivo PaymentCC no está presente, por favor oipie este archivo en la carpeta Classes/ de PrestaShop.'; +$_MODULE['<{secuvad}prestashop>secuvad_2113b53bbb4a93786e042937cd04f21f'] = 'Por favor configure todas las asociaciones'; +$_MODULE['<{secuvad}prestashop>secuvad_062f3f5ae8644882a2da949705ced1ac'] = 'Si ya tiene una cuenta'; +$_MODULE['<{secuvad}prestashop>secuvad_0e79ca3a8ef61f2ec317e5734082de3f'] = 'Tipo de empresa no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_73c23113d237a4f8e56df46745d9e08e'] = 'Nombre de la empresa no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_a5253c7f1e4f48d55eb46507f9af21e3'] = 'Capital no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_c99b7e43f604b6c71a06336b727d99b9'] = 'URL de su sitio Web no válida'; +$_MODULE['<{secuvad}prestashop>secuvad_5b550fbcefc1b473adff36761fbc97fd'] = 'Dirección no válida'; +$_MODULE['<{secuvad}prestashop>secuvad_7b3bad39fc3ac5b25ae0523e6d58be68'] = 'Código postal no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_ceb8e9adca824ee71883fce1612e9fea'] = 'Ciudad no válida'; +$_MODULE['<{secuvad}prestashop>secuvad_3f1e50fba8ee7cc383eb164c7d5d0fb9'] = 'País no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_c678a6253de57c93c0ab007d23a119c6'] = 'CRS no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_b5061793e15ec84cd10f3b299d1f51a2'] = 'Siren no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_8c97e587c1b4e519bec26f3903561da3'] = 'Debe seleccionar al menos una categoría'; +$_MODULE['<{secuvad}prestashop>secuvad_e0d398bfe015c1cc6fbd01fa9bcafb71'] = 'Tratamiento no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_9bd987e611b01bc320c4b41fd0f44cb0'] = 'Apellido no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_d4a7da3641038f3a960339e8880297e4'] = 'Nombre no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_b3871d55ec4fd5d776a9411b8a3286d8'] = 'Función no válida'; +$_MODULE['<{secuvad}prestashop>secuvad_d9a821ab8ae9651b6e4a11798bb4fd39'] = 'Email no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_7f203a223defb75e34e9949e9054511a'] = 'Teléfono no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_a6f2a48726b0d36107e00e20795d3d37'] = 'Login no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_cba0b206627d45fbf0ae707e20d4a38f'] = 'Contraseña no válida'; +$_MODULE['<{secuvad}prestashop>secuvad_12477418db51dc813000335f72b9fcf2'] = 'Modo no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_c1c8a564c10a0efe07bb4e4b20d88cc9'] = 'ID no válido'; +$_MODULE['<{secuvad}prestashop>secuvad_7ccf58c950043c9fbfed668df13ce608'] = 'Parámetros actualizados'; +$_MODULE['<{secuvad}prestashop>secuvad_5a7f1ef0cabc9cac6fc4ef1c2eba2eb4'] = 'Error durante la actualización'; +$_MODULE['<{secuvad}prestashop>secuvad_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Empresa'; +$_MODULE['<{secuvad}prestashop>secuvad_051672911a3f1f05efba78a553ef6fe2'] = 'Login:'; +$_MODULE['<{secuvad}prestashop>secuvad_b341a59d5636ed3d6a819137495b08a0'] = 'Contraseña:'; +$_MODULE['<{secuvad}prestashop>secuvad_1ee1c44c2dc81681f961235604247b81'] = 'Modo:'; +$_MODULE['<{secuvad}prestashop>secuvad_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{secuvad}prestashop>secuvad_756d97bb256b8580d4d71ee0c547804e'] = 'Producción'; +$_MODULE['<{secuvad}prestashop>secuvad_e0f0b0564d3d29a93fad7a4178b7b1ca'] = 'ID:'; +$_MODULE['<{secuvad}prestashop>secuvad_94966d90747b97d1f0f206c98a8b1ac3'] = 'Enviar'; +$_MODULE['<{secuvad}prestashop>secuvad_8cf04a9734132302f96da8e113e80ce5'] = 'Inicio'; +$_MODULE['<{secuvad}prestashop>secuvad_201095b8aa27cc3bd5e6dcc407ab2bdb'] = 'Categorías Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{secuvad}prestashop>secuvad_116b7a3c4f415260f5a0d9a9d3a49f97'] = 'Categoría Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_7a0de9003696a0e833694b22a5ea6d91'] = 'Pago Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_593bda837f8ae222993fc189457c92a0'] = 'Tipo de pago'; +$_MODULE['<{secuvad}prestashop>secuvad_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Desconocido'; +$_MODULE['<{secuvad}prestashop>secuvad_68eb4e159f449c625edb23b2c35e7259'] = 'Transportista Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_7cc72fb5b56d882a4c34cb68dd4604aa'] = 'Plazos Transportista Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_de5744adc681a40f1b0fe16f3707da5b'] = 'Para activar su módulo Secuvad, rellene el formulario y pulse en \"Guardar\"'; +$_MODULE['<{secuvad}prestashop>secuvad_6bf36964a57a5eaa5f46504ca9882cdb'] = 'Tipo de empresa'; +$_MODULE['<{secuvad}prestashop>secuvad_c700e3beca05135eca91df55981402f5'] = 'SARL'; +$_MODULE['<{secuvad}prestashop>secuvad_3dd6b9265ff18f31dc30df59304b0ca7'] = 'SA'; +$_MODULE['<{secuvad}prestashop>secuvad_e00147cd1ed977d431491ce5c1b02f8a'] = 'EURL'; +$_MODULE['<{secuvad}prestashop>secuvad_2db46c628cfb3bd1545d3b5a14b4a9c5'] = 'SAS'; +$_MODULE['<{secuvad}prestashop>secuvad_d3cc996e019ec9721479e63b2fd622d8'] = 'Empresa individual'; +$_MODULE['<{secuvad}prestashop>secuvad_57aab2fcd93938cfbca356bb5571b25b'] = 'SNC'; +$_MODULE['<{secuvad}prestashop>secuvad_5e116ceb48a98fb755f22df7ea1e2396'] = 'Nombre de la empresa:'; +$_MODULE['<{secuvad}prestashop>secuvad_7b1b1d6f1a6793e17aeeffa80ac8fdaa'] = 'Capital:'; +$_MODULE['<{secuvad}prestashop>secuvad_e5cb8489f57db7c15eed3258e48cd5f3'] = 'Sitio:'; +$_MODULE['<{secuvad}prestashop>secuvad_2bf1d5fae1c321d594fdedf05058f709'] = 'Dirección:'; +$_MODULE['<{secuvad}prestashop>secuvad_8116ea5ccd73f945bb5e260861b0b570'] = 'Código postal:'; +$_MODULE['<{secuvad}prestashop>secuvad_bffb711ec36f280459d11dce315da72f'] = 'Ciudad:'; +$_MODULE['<{secuvad}prestashop>secuvad_f64be5eef68442a8f50cf535b92ad3e4'] = 'País:'; +$_MODULE['<{secuvad}prestashop>secuvad_51bdf131ea9fab11d517cc19fe5d8d73'] = 'RCS:'; +$_MODULE['<{secuvad}prestashop>secuvad_f4e462b9ed48a0e96da9730875f9dd58'] = 'Siren:'; +$_MODULE['<{secuvad}prestashop>secuvad_70397c4b252a5168c5ec003931cea215'] = 'Campos necesarios'; +$_MODULE['<{secuvad}prestashop>secuvad_0e0f3e0ad86de8103ac0f5c74726da24'] = 'Tipo de productos'; +$_MODULE['<{secuvad}prestashop>secuvad_432d0563f8721b5285e5bd18c0aee4ea'] = 'Categorías de sus productos:'; +$_MODULE['<{secuvad}prestashop>secuvad_7d0ba2d2a3223badb6f7b026946fc16d'] = 'Contacto en la empresa'; +$_MODULE['<{secuvad}prestashop>secuvad_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Tratamiento:'; +$_MODULE['<{secuvad}prestashop>secuvad_2c9b5b15a6d3cc951ca57c65e4966fd3'] = 'Señor'; +$_MODULE['<{secuvad}prestashop>secuvad_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Señora'; +$_MODULE['<{secuvad}prestashop>secuvad_e7ddb7cd777b59610b220bcfa80bd95f'] = 'Señorita'; +$_MODULE['<{secuvad}prestashop>secuvad_be5e0b5d50d48b049bd0f7b57cd163f9'] = 'Apellido:'; +$_MODULE['<{secuvad}prestashop>secuvad_668a8d8d7ffe5da112b266e46b79b685'] = 'Nombre:'; +$_MODULE['<{secuvad}prestashop>secuvad_6a858980896cb9daee81930c61bc1696'] = 'Función:'; +$_MODULE['<{secuvad}prestashop>secuvad_01401fe9a93df81d28637e5218597b76'] = 'Email:'; +$_MODULE['<{secuvad}prestashop>secuvad_673ae02fffb72f0fe68a66f096a01347'] = 'Teléfono:'; +$_MODULE['<{secuvad}prestashop>secuvad_7dce122004969d56ae2e0245cb754d35'] = 'Modificar'; +$_MODULE['<{secuvad}prestashop>secuvad_0ba7583639a274c434bbe6ef797115a4'] = 'Guardar'; +$_MODULE['<{secuvad}prestashop>secuvad_2f8531293ddfd4f30bb978e93d49f650'] = 'Email:'; +$_MODULE['<{secuvad}prestashop>secuvad_42dbbc555675ff22f80115c0570de888'] = 'Descripción del problema:'; +$_MODULE['<{secuvad}prestashop>secuvad_401886eb11224f37cbbd93211e991c85'] = 'Archivos de log:'; +$_MODULE['<{secuvad}prestashop>secuvad_fa29ad39f28d8d3a9b873ac37dec2899'] = 'Informe de error'; +$_MODULE['<{secuvad}prestashop>secuvad_a649552939461a1cce6c2d77e2de44d0'] = 'Los siguientes módulos de pago no están asociados:'; +$_MODULE['<{secuvad}prestashop>secuvad_b0d7bc21f644e151a6dec99181ac0718'] = 'Los siguientes métodos de transportista no están asociados:'; +$_MODULE['<{secuvad}prestashop>secuvad_68a569c0346cff10b9626e27fae1de48'] = 'Las siguientes categorías no están asociadas:'; +$_MODULE['<{secuvad}prestashop>secuvad_a1d333dc75f4e131835c8104c4b2d966'] = 'Error durante la activación'; +$_MODULE['<{secuvad}prestashop>secuvad_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Error'; +$_MODULE['<{secuvad}prestashop>secuvad_7fd791b8ff524778a13d978ff04f0bb9'] = 'Imposible trasladar el fraude'; +$_MODULE['<{secuvad}prestashop>secuvad_2e92ae79ff32b37fee4368a594792183'] = 'Error de conexión'; +$_MODULE['<{secuvad}prestashop>secuvad_2d7839314eb05f8988381b70dbc1548b'] = 'No es un fraude'; +$_MODULE['<{secuvad}prestashop>secuvad_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{secuvad}prestashop>secuvad_1b93ce75458ea0ce94250a781ff0835e'] = 'Es un fraude'; +$_MODULE['<{secuvad}prestashop>secuvad_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{secuvad}prestashop>secuvad_830560d945b2aa75e58b6f0b7ffe0882'] = 'No sometido a Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_3d0362bcbb2783e82be0612668eb7ce9'] = 'Validado por Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_999dfff14d541898b1c7266c3c271d40'] = 'Análisis en curso'; +$_MODULE['<{secuvad}prestashop>secuvad_a464f32e0e54df4786e7d905577b7f0c'] = 'Invalidado por Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_f6ba219e7a45632ab4d39822108d68f3'] = 'A valorar por el cliente'; +$_MODULE['<{secuvad}prestashop>secuvad_e2cadc35c8d021861738765b25666ebb'] = 'En espera de validación por Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_config_8bcaf785d6c5771e3c49bd90e0885c2a'] = 'Intento de pirateo'; +$_MODULE['<{secuvad}prestashop>secuvad_config_1f4eee5122ff1dfb7c7ff3aa8e879222'] = 'Acceso no autorizado'; +$_MODULE['<{secuvad}prestashop>secuvad_config_635c1728fc02b144a4357007b44d55b7'] = 'Los datos enviados son:'; diff --git a/modules/secuvad/fr.php b/modules/secuvad/fr.php new file mode 100755 index 000000000..2f832517d --- /dev/null +++ b/modules/secuvad/fr.php @@ -0,0 +1,114 @@ +secuvad_e4ba26360a7818a71d48addc3ea19078'] = 'Module Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_ebedf7d0e130dbb2afd22987ff22708b'] = 'Solution luttant contre les fraudes en ligne'; +$_MODULE['<{secuvad}prestashop>secuvad_a9828808bf0dcd0b7af8e6f20b80ad85'] = 'Etes-vous certain de vouloir supprimer ce module ?'; +$_MODULE['<{secuvad}prestashop>secuvad_307bfa08da823ee566ce867b563eb223'] = 'Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_8fbc70c37e2deff790fe4e95fce7c9d8'] = 'Pour utiliser le module Secuvad, merci de configurer le module.'; +$_MODULE['<{secuvad}prestashop>secuvad_d3dd6e2937eb4430278bce947553b7ca'] = 'Statut Secuvad:'; +$_MODULE['<{secuvad}prestashop>secuvad_163f6b2856a83d0bb03aee72f8f072a5'] = 'Impayé transmis :'; +$_MODULE['<{secuvad}prestashop>secuvad_f3182252d448607de30d2b4cfe420db1'] = 'Mettre à jour le statut Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_af7fdbd69d96ddaba932d48c45b89dcf'] = 'Transmettre un impayé'; +$_MODULE['<{secuvad}prestashop>secuvad_ef1168698f5c33450f0d3166da5e4740'] = 'Attention, par la transmission de cet impayé à Secuvad, vous certifiez que votre créance est CERTAINE, LIQUIDE et EXIGIBLE, et que vous en confiez le recouvrement EXCLUSIF à Secuvad. Souhaitez-vous poursuivre ?'; +$_MODULE['<{secuvad}prestashop>secuvad_85b94c96da82beb688084f64adfbf185'] = 'Configuration de Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_04d45d9f5ece926babe251d7b628ecca'] = 'Le fichier PaymentCC.php n\'est pas présent, merci de copier ce fichier dans le dossier classes/ de Prestashop.'; +$_MODULE['<{secuvad}prestashop>secuvad_2113b53bbb4a93786e042937cd04f21f'] = 'Merci de configurer toutes les associations'; +$_MODULE['<{secuvad}prestashop>secuvad_062f3f5ae8644882a2da949705ced1ac'] = 'Si vous avez déjà un compte'; +$_MODULE['<{secuvad}prestashop>secuvad_0e79ca3a8ef61f2ec317e5734082de3f'] = 'Type de la société invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_73c23113d237a4f8e56df46745d9e08e'] = 'Nom de la société invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_a5253c7f1e4f48d55eb46507f9af21e3'] = 'Capital invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_c99b7e43f604b6c71a06336b727d99b9'] = 'Url de votre site invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_5b550fbcefc1b473adff36761fbc97fd'] = 'Adresse invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_7b3bad39fc3ac5b25ae0523e6d58be68'] = 'Code postal invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_ceb8e9adca824ee71883fce1612e9fea'] = 'Ville invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_3f1e50fba8ee7cc383eb164c7d5d0fb9'] = 'Pays invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_c678a6253de57c93c0ab007d23a119c6'] = 'RCS invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_b5061793e15ec84cd10f3b299d1f51a2'] = 'Siren invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_8c97e587c1b4e519bec26f3903561da3'] = 'Vous devez sélectionner au moins une catégorie'; +$_MODULE['<{secuvad}prestashop>secuvad_e0d398bfe015c1cc6fbd01fa9bcafb71'] = 'Civilité invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_9bd987e611b01bc320c4b41fd0f44cb0'] = 'Nom invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_d4a7da3641038f3a960339e8880297e4'] = 'Prénom invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_b3871d55ec4fd5d776a9411b8a3286d8'] = 'Fonction invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_d9a821ab8ae9651b6e4a11798bb4fd39'] = 'E-mail invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_7f203a223defb75e34e9949e9054511a'] = 'Telephone invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_a6f2a48726b0d36107e00e20795d3d37'] = 'Identifiant invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_cba0b206627d45fbf0ae707e20d4a38f'] = 'Mot de passe invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_12477418db51dc813000335f72b9fcf2'] = 'Mode invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_c1c8a564c10a0efe07bb4e4b20d88cc9'] = 'ID invalide'; +$_MODULE['<{secuvad}prestashop>secuvad_7ccf58c950043c9fbfed668df13ce608'] = 'Paramètres mis à jour'; +$_MODULE['<{secuvad}prestashop>secuvad_5a7f1ef0cabc9cac6fc4ef1c2eba2eb4'] = 'Erreur lors de la mise à jour'; +$_MODULE['<{secuvad}prestashop>secuvad_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Société'; +$_MODULE['<{secuvad}prestashop>secuvad_051672911a3f1f05efba78a553ef6fe2'] = 'Identifiant :'; +$_MODULE['<{secuvad}prestashop>secuvad_b341a59d5636ed3d6a819137495b08a0'] = 'Mot de passe :'; +$_MODULE['<{secuvad}prestashop>secuvad_1ee1c44c2dc81681f961235604247b81'] = 'Mode :'; +$_MODULE['<{secuvad}prestashop>secuvad_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{secuvad}prestashop>secuvad_756d97bb256b8580d4d71ee0c547804e'] = 'Production'; +$_MODULE['<{secuvad}prestashop>secuvad_e0f0b0564d3d29a93fad7a4178b7b1ca'] = 'ID :'; +$_MODULE['<{secuvad}prestashop>secuvad_94966d90747b97d1f0f206c98a8b1ac3'] = 'Envoyer'; +$_MODULE['<{secuvad}prestashop>secuvad_8cf04a9734132302f96da8e113e80ce5'] = 'Accueil'; +$_MODULE['<{secuvad}prestashop>secuvad_201095b8aa27cc3bd5e6dcc407ab2bdb'] = 'Catégories Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{secuvad}prestashop>secuvad_116b7a3c4f415260f5a0d9a9d3a49f97'] = 'Catégorie Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_7a0de9003696a0e833694b22a5ea6d91'] = 'Méthode de paiement Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_593bda837f8ae222993fc189457c92a0'] = 'Type de paiement'; +$_MODULE['<{secuvad}prestashop>secuvad_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Inconnu'; +$_MODULE['<{secuvad}prestashop>secuvad_68eb4e159f449c625edb23b2c35e7259'] = 'Transporteur Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_7cc72fb5b56d882a4c34cb68dd4604aa'] = 'Délais Transporteur Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_de5744adc681a40f1b0fe16f3707da5b'] = 'Pour activer votre module SECUVAD, merci de remplir le formulaire, de cliquer sur \"Enregistrer\"'; +$_MODULE['<{secuvad}prestashop>secuvad_6bf36964a57a5eaa5f46504ca9882cdb'] = 'Type de société :'; +$_MODULE['<{secuvad}prestashop>secuvad_c700e3beca05135eca91df55981402f5'] = 'SARL'; +$_MODULE['<{secuvad}prestashop>secuvad_3dd6b9265ff18f31dc30df59304b0ca7'] = 'SA'; +$_MODULE['<{secuvad}prestashop>secuvad_e00147cd1ed977d431491ce5c1b02f8a'] = 'EURL'; +$_MODULE['<{secuvad}prestashop>secuvad_2db46c628cfb3bd1545d3b5a14b4a9c5'] = 'SAS'; +$_MODULE['<{secuvad}prestashop>secuvad_d3cc996e019ec9721479e63b2fd622d8'] = 'Entreprise individuelle'; +$_MODULE['<{secuvad}prestashop>secuvad_57aab2fcd93938cfbca356bb5571b25b'] = 'SNC'; +$_MODULE['<{secuvad}prestashop>secuvad_5e116ceb48a98fb755f22df7ea1e2396'] = 'Nom de la société :'; +$_MODULE['<{secuvad}prestashop>secuvad_7b1b1d6f1a6793e17aeeffa80ac8fdaa'] = 'Capital :'; +$_MODULE['<{secuvad}prestashop>secuvad_e5cb8489f57db7c15eed3258e48cd5f3'] = 'Site :'; +$_MODULE['<{secuvad}prestashop>secuvad_2bf1d5fae1c321d594fdedf05058f709'] = 'Adresse :'; +$_MODULE['<{secuvad}prestashop>secuvad_8116ea5ccd73f945bb5e260861b0b570'] = 'Code postale :'; +$_MODULE['<{secuvad}prestashop>secuvad_bffb711ec36f280459d11dce315da72f'] = 'Ville :'; +$_MODULE['<{secuvad}prestashop>secuvad_f64be5eef68442a8f50cf535b92ad3e4'] = 'Pays :'; +$_MODULE['<{secuvad}prestashop>secuvad_51bdf131ea9fab11d517cc19fe5d8d73'] = 'RCS :'; +$_MODULE['<{secuvad}prestashop>secuvad_f4e462b9ed48a0e96da9730875f9dd58'] = 'Siren :'; +$_MODULE['<{secuvad}prestashop>secuvad_70397c4b252a5168c5ec003931cea215'] = 'Champs requis'; +$_MODULE['<{secuvad}prestashop>secuvad_0e0f3e0ad86de8103ac0f5c74726da24'] = 'Type de produits'; +$_MODULE['<{secuvad}prestashop>secuvad_432d0563f8721b5285e5bd18c0aee4ea'] = 'Catégories de vos produits :'; +$_MODULE['<{secuvad}prestashop>secuvad_7d0ba2d2a3223badb6f7b026946fc16d'] = 'Contact dans votre société'; +$_MODULE['<{secuvad}prestashop>secuvad_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Civilité :'; +$_MODULE['<{secuvad}prestashop>secuvad_2c9b5b15a6d3cc951ca57c65e4966fd3'] = 'M'; +$_MODULE['<{secuvad}prestashop>secuvad_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Mme'; +$_MODULE['<{secuvad}prestashop>secuvad_e7ddb7cd777b59610b220bcfa80bd95f'] = 'Mlle'; +$_MODULE['<{secuvad}prestashop>secuvad_be5e0b5d50d48b049bd0f7b57cd163f9'] = 'Nom :'; +$_MODULE['<{secuvad}prestashop>secuvad_668a8d8d7ffe5da112b266e46b79b685'] = 'Prénom :'; +$_MODULE['<{secuvad}prestashop>secuvad_6a858980896cb9daee81930c61bc1696'] = 'Fonction :'; +$_MODULE['<{secuvad}prestashop>secuvad_01401fe9a93df81d28637e5218597b76'] = 'E-mail :'; +$_MODULE['<{secuvad}prestashop>secuvad_673ae02fffb72f0fe68a66f096a01347'] = 'Téléphone :'; +$_MODULE['<{secuvad}prestashop>secuvad_7dce122004969d56ae2e0245cb754d35'] = 'Modifier'; +$_MODULE['<{secuvad}prestashop>secuvad_0ba7583639a274c434bbe6ef797115a4'] = 'Enregistrer'; +$_MODULE['<{secuvad}prestashop>secuvad_2f8531293ddfd4f30bb978e93d49f650'] = 'E-mail :'; +$_MODULE['<{secuvad}prestashop>secuvad_42dbbc555675ff22f80115c0570de888'] = 'Description du problème :'; +$_MODULE['<{secuvad}prestashop>secuvad_401886eb11224f37cbbd93211e991c85'] = 'Fichiers de log :'; +$_MODULE['<{secuvad}prestashop>secuvad_fa29ad39f28d8d3a9b873ac37dec2899'] = 'Rapport d\'erreur'; +$_MODULE['<{secuvad}prestashop>secuvad_a649552939461a1cce6c2d77e2de44d0'] = 'Les modules de paiement suivant ne sont pas associés :'; +$_MODULE['<{secuvad}prestashop>secuvad_b0d7bc21f644e151a6dec99181ac0718'] = 'Les méthodes de transporteur suivantes ne sont pas associées :'; +$_MODULE['<{secuvad}prestashop>secuvad_68a569c0346cff10b9626e27fae1de48'] = 'Les catégories suivantes ne sont pas associées :'; +$_MODULE['<{secuvad}prestashop>secuvad_a1d333dc75f4e131835c8104c4b2d966'] = 'Erreur lors de l\'activation'; +$_MODULE['<{secuvad}prestashop>secuvad_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Erreur'; +$_MODULE['<{secuvad}prestashop>secuvad_7fd791b8ff524778a13d978ff04f0bb9'] = 'Impossible de reporter la fraude'; +$_MODULE['<{secuvad}prestashop>secuvad_2e92ae79ff32b37fee4368a594792183'] = 'Erreur de connexion'; +$_MODULE['<{secuvad}prestashop>secuvad_2d7839314eb05f8988381b70dbc1548b'] = 'Ce n\'est pas une fraude'; +$_MODULE['<{secuvad}prestashop>secuvad_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{secuvad}prestashop>secuvad_1b93ce75458ea0ce94250a781ff0835e'] = 'C\'est une fraude'; +$_MODULE['<{secuvad}prestashop>secuvad_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{secuvad}prestashop>secuvad_830560d945b2aa75e58b6f0b7ffe0882'] = 'Non soumise à Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_3d0362bcbb2783e82be0612668eb7ce9'] = 'Validée par Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_999dfff14d541898b1c7266c3c271d40'] = 'En cours d\'analyse'; +$_MODULE['<{secuvad}prestashop>secuvad_a464f32e0e54df4786e7d905577b7f0c'] = 'Invalidée par Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_f6ba219e7a45632ab4d39822108d68f3'] = 'A expertiser par le CLIENT'; +$_MODULE['<{secuvad}prestashop>secuvad_e2cadc35c8d021861738765b25666ebb'] = 'En attente de validation par Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_config_8bcaf785d6c5771e3c49bd90e0885c2a'] = 'Tentative de piratage:'; +$_MODULE['<{secuvad}prestashop>secuvad_config_1f4eee5122ff1dfb7c7ff3aa8e879222'] = 'Accès non autorisé'; +$_MODULE['<{secuvad}prestashop>secuvad_config_635c1728fc02b144a4357007b44d55b7'] = 'Les données envoyées sont:'; diff --git a/modules/secuvad/install.sql b/modules/secuvad/install.sql new file mode 100644 index 000000000..f5c305fa8 --- /dev/null +++ b/modules/secuvad/install.sql @@ -0,0 +1,93 @@ +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_assoc_category` +( + `id_secuvad_assoc_category` int NOT NULL auto_increment, + `id_category` int default NULL, + `category_id` int default NULL, + PRIMARY KEY (`id_secuvad_assoc_category`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_assoc_payment` +( + `id_secuvad_assoc_payment` int NOT NULL auto_increment, + `id_module` int default NULL, + `code` varchar(45) default NULL, + PRIMARY KEY (`id_secuvad_assoc_payment`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_assoc_transport` +( + `id_secuvad_assoc_transport` int NOT NULL auto_increment, + `id_carrier` int default NULL, + `transport_id` int default NULL, + `transport_delay_id` int default NULL, + PRIMARY KEY (`id_secuvad_assoc_transport`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_category` +( + `category_id` int NOT NULL default '0', + `category_name` varchar(255) default NULL, + `sort_num` int default NULL, + `id_lang` int default '1', + PRIMARY KEY (`category_id`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_logs` +( + `id_secuvad_logs` int NOT NULL auto_increment, + `message` text default NULL, + `date` timestamp NOT NULL default CURRENT_TIMESTAMP, + PRIMARY KEY (`id_secuvad_logs`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_order` +( + `id_secuvad_order` int NOT NULL, + `secuvad_status` tinyint NOT NULL default '0', + `is_fraud` tinyint NOT NULL default '0', + `score` int unsigned default NULL, + `error` varchar(150) NOT NULL, + `advice` varchar(45) NOT NULL, + `ip` varchar(16) default NULL, + `ip_time` timestamp NULL default NULL, + PRIMARY KEY (`id_secuvad_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_payment` +( + `code` varchar(45) NOT NULL default '', + `name` varchar(255) default NULL, + `id_lang` int(11) NOT NULL, + PRIMARY KEY USING BTREE (`code`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_transport` +( + `transport_id` int NOT NULL, + `transport_name` varchar(150) character set latin1 default NULL, + `id_lang` int(11) NOT NULL, + PRIMARY KEY USING BTREE (`transport_id`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_secuvad_transport_delay` +( + `transport_delay_id` int NOT NULL, + `transport_delay_name` varchar(45) character set latin1 default NULL, + `id_lang` int(11) NOT NULL, + PRIMARY KEY USING BTREE (`transport_delay_id`,`id_lang`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `PREFIX_payment_cc` ( + `id_payment_cc` int(11) NOT NULL AUTO_INCREMENT, + `id_order` int(10) unsigned DEFAULT NULL, + `id_currency` int(10) unsigned NOT NULL, + `amount` decimal(10,2) NOT NULL, + `transaction_id` varchar(254) DEFAULT NULL, + `card_number` varchar(254) DEFAULT NULL, + `card_brand` varchar(254) DEFAULT NULL, + `card_expiration` char(7) DEFAULT NULL, + `card_holder` varchar(254) DEFAULT NULL, + `date_add` datetime NOT NULL, + PRIMARY KEY (`id_payment_cc`), + KEY `id_order` (`id_order`) +) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/modules/secuvad/it.php b/modules/secuvad/it.php new file mode 100644 index 000000000..bc9754d56 --- /dev/null +++ b/modules/secuvad/it.php @@ -0,0 +1,116 @@ +secuvad_e4ba26360a7818a71d48addc3ea19078'] = 'Modulo Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_ebedf7d0e130dbb2afd22987ff22708b'] = 'Soluzione che lotta contro le frodi online'; +$_MODULE['<{secuvad}prestashop>secuvad_a9828808bf0dcd0b7af8e6f20b80ad85'] = 'Sei sicuro di voler cancellare questo modulo?'; +$_MODULE['<{secuvad}prestashop>secuvad_307bfa08da823ee566ce867b563eb223'] = 'Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_8fbc70c37e2deff790fe4e95fce7c9d8'] = 'Per poter utilizzare la protezione Secuvad, si prega di configurare il modulo.'; +$_MODULE['<{secuvad}prestashop>secuvad_d3dd6e2937eb4430278bce947553b7ca'] = 'Status Secuvad:'; +$_MODULE['<{secuvad}prestashop>secuvad_163f6b2856a83d0bb03aee72f8f072a5'] = 'Insoluti trasmessi:'; +$_MODULE['<{secuvad}prestashop>secuvad_f3182252d448607de30d2b4cfe420db1'] = 'Aggiorna status Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_af7fdbd69d96ddaba932d48c45b89dcf'] = 'Trasmetti una transazione insoluta'; +$_MODULE['<{secuvad}prestashop>secuvad_ef1168698f5c33450f0d3166da5e4740'] = 'Si prega di notare che con la consegna di questo insoluto a SECUVAD insoluto, certifichi che il tuo credito è certo, liquido ed esigibile, e che affidi a SECUVAD il recupero ESCLUSIVO. Vuoi continuare?'; +$_MODULE['<{secuvad}prestashop>secuvad_85b94c96da82beb688084f64adfbf185'] = 'configurazione Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_04d45d9f5ece926babe251d7b628ecca'] = 'Pagamento file CC non è presente, si prega di copiare questo file nella directory delle classi di Prestashop'; +$_MODULE['<{secuvad}prestashop>secuvad_2113b53bbb4a93786e042937cd04f21f'] = 'Si prega di configurare tutte le associazioni'; +$_MODULE['<{secuvad}prestashop>secuvad_062f3f5ae8644882a2da949705ced1ac'] = 'Se hai già un account'; +$_MODULE['<{secuvad}prestashop>secuvad_0e79ca3a8ef61f2ec317e5734082de3f'] = 'tipo di società non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_73c23113d237a4f8e56df46745d9e08e'] = 'Nome della società non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_a5253c7f1e4f48d55eb46507f9af21e3'] = 'Capitale non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_c99b7e43f604b6c71a06336b727d99b9'] = 'WebSite non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_5b550fbcefc1b473adff36761fbc97fd'] = 'Indirizzo non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_7b3bad39fc3ac5b25ae0523e6d58be68'] = 'CAP non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_ceb8e9adca824ee71883fce1612e9fea'] = 'Città non valida'; +$_MODULE['<{secuvad}prestashop>secuvad_3f1e50fba8ee7cc383eb164c7d5d0fb9'] = 'Paese non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_c678a6253de57c93c0ab007d23a119c6'] = 'RCS non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_b5061793e15ec84cd10f3b299d1f51a2'] = 'Siren non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_8c97e587c1b4e519bec26f3903561da3'] = 'è necessario selezionare almeno una categoria'; +$_MODULE['<{secuvad}prestashop>secuvad_e0d398bfe015c1cc6fbd01fa9bcafb71'] = 'Titolo non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_9bd987e611b01bc320c4b41fd0f44cb0'] = 'Cognome non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_d4a7da3641038f3a960339e8880297e4'] = 'Nome non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_b3871d55ec4fd5d776a9411b8a3286d8'] = 'Nome funzione non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_d9a821ab8ae9651b6e4a11798bb4fd39'] = 'Nome E-mail non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_7f203a223defb75e34e9949e9054511a'] = 'Telefono non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_a6f2a48726b0d36107e00e20795d3d37'] = 'login non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_cba0b206627d45fbf0ae707e20d4a38f'] = 'Password non valida'; +$_MODULE['<{secuvad}prestashop>secuvad_12477418db51dc813000335f72b9fcf2'] = 'Modalità non valida'; +$_MODULE['<{secuvad}prestashop>secuvad_c1c8a564c10a0efe07bb4e4b20d88cc9'] = 'ID non valido'; +$_MODULE['<{secuvad}prestashop>secuvad_7ccf58c950043c9fbfed668df13ce608'] = 'Le impostazioni sono aggiornate'; +$_MODULE['<{secuvad}prestashop>secuvad_5a7f1ef0cabc9cac6fc4ef1c2eba2eb4'] = 'Errore su aggiornamento'; +$_MODULE['<{secuvad}prestashop>secuvad_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Società'; +$_MODULE['<{secuvad}prestashop>secuvad_051672911a3f1f05efba78a553ef6fe2'] = 'Login:'; +$_MODULE['<{secuvad}prestashop>secuvad_b341a59d5636ed3d6a819137495b08a0'] = 'Password:'; +$_MODULE['<{secuvad}prestashop>secuvad_1ee1c44c2dc81681f961235604247b81'] = 'Modalità:'; +$_MODULE['<{secuvad}prestashop>secuvad_0cbc6611f5540bd0809a388dc95a615b'] = 'Test'; +$_MODULE['<{secuvad}prestashop>secuvad_756d97bb256b8580d4d71ee0c547804e'] = 'Produzione'; +$_MODULE['<{secuvad}prestashop>secuvad_e0f0b0564d3d29a93fad7a4178b7b1ca'] = 'ID:'; +$_MODULE['<{secuvad}prestashop>secuvad_94966d90747b97d1f0f206c98a8b1ac3'] = 'Invia'; +$_MODULE['<{secuvad}prestashop>secuvad_8cf04a9734132302f96da8e113e80ce5'] = 'Home'; +$_MODULE['<{secuvad}prestashop>secuvad_201095b8aa27cc3bd5e6dcc407ab2bdb'] = 'categorie Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{secuvad}prestashop>secuvad_116b7a3c4f415260f5a0d9a9d3a49f97'] = 'Categoria Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_7a0de9003696a0e833694b22a5ea6d91'] = 'pagamento Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_593bda837f8ae222993fc189457c92a0'] = 'Tipo di pagamento Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Sconosciuto'; +$_MODULE['<{secuvad}prestashop>secuvad_68eb4e159f449c625edb23b2c35e7259'] = 'Corriere Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_7cc72fb5b56d882a4c34cb68dd4604aa'] = 'Ritardo corriere Secuvad '; +$_MODULE['<{secuvad}prestashop>secuvad_de5744adc681a40f1b0fe16f3707da5b'] = 'Per poter utilizzare il modulo Secuvad, si prega di compilare il presente modulo, quindi fare clic su \"Registrati\"'; +$_MODULE['<{secuvad}prestashop>secuvad_6bf36964a57a5eaa5f46504ca9882cdb'] = 'Tipo di Azienda:'; +$_MODULE['<{secuvad}prestashop>secuvad_c700e3beca05135eca91df55981402f5'] = 'SARL'; +$_MODULE['<{secuvad}prestashop>secuvad_3dd6b9265ff18f31dc30df59304b0ca7'] = 'SA'; +$_MODULE['<{secuvad}prestashop>secuvad_e00147cd1ed977d431491ce5c1b02f8a'] = 'EURL'; +$_MODULE['<{secuvad}prestashop>secuvad_2db46c628cfb3bd1545d3b5a14b4a9c5'] = 'SAS'; +$_MODULE['<{secuvad}prestashop>secuvad_d3cc996e019ec9721479e63b2fd622d8'] = 'Società Individuale '; +$_MODULE['<{secuvad}prestashop>secuvad_57aab2fcd93938cfbca356bb5571b25b'] = 'SNC'; +$_MODULE['<{secuvad}prestashop>secuvad_5e116ceb48a98fb755f22df7ea1e2396'] = 'Nome società'; +$_MODULE['<{secuvad}prestashop>secuvad_7b1b1d6f1a6793e17aeeffa80ac8fdaa'] = 'Capitale:'; +$_MODULE['<{secuvad}prestashop>secuvad_e5cb8489f57db7c15eed3258e48cd5f3'] = 'Sito web:'; +$_MODULE['<{secuvad}prestashop>secuvad_2bf1d5fae1c321d594fdedf05058f709'] = 'Indirizzo:'; +$_MODULE['<{secuvad}prestashop>secuvad_8116ea5ccd73f945bb5e260861b0b570'] = 'CAP:'; +$_MODULE['<{secuvad}prestashop>secuvad_bffb711ec36f280459d11dce315da72f'] = 'Città:'; +$_MODULE['<{secuvad}prestashop>secuvad_f64be5eef68442a8f50cf535b92ad3e4'] = 'Paese:'; +$_MODULE['<{secuvad}prestashop>secuvad_51bdf131ea9fab11d517cc19fe5d8d73'] = 'RCS:'; +$_MODULE['<{secuvad}prestashop>secuvad_f4e462b9ed48a0e96da9730875f9dd58'] = 'Siren:'; +$_MODULE['<{secuvad}prestashop>secuvad_70397c4b252a5168c5ec003931cea215'] = 'Campi obbligatori'; +$_MODULE['<{secuvad}prestashop>secuvad_0e0f3e0ad86de8103ac0f5c74726da24'] = 'Tipi di prodotto'; +$_MODULE['<{secuvad}prestashop>secuvad_432d0563f8721b5285e5bd18c0aee4ea'] = 'Categorie dei tuoi prodotti:'; +$_MODULE['<{secuvad}prestashop>secuvad_7d0ba2d2a3223badb6f7b026946fc16d'] = 'Contatto società'; +$_MODULE['<{secuvad}prestashop>secuvad_51ec9bf4aaeab1b25bb57f9f8d4de557'] = 'Titolo:'; +$_MODULE['<{secuvad}prestashop>secuvad_2c9b5b15a6d3cc951ca57c65e4966fd3'] = 'Sig.'; +$_MODULE['<{secuvad}prestashop>secuvad_7f2a1b59ac1ab6d2d892dbbf4f132c40'] = 'Sig.ra'; +$_MODULE['<{secuvad}prestashop>secuvad_e7ddb7cd777b59610b220bcfa80bd95f'] = 'Sig.na'; +$_MODULE['<{secuvad}prestashop>secuvad_be5e0b5d50d48b049bd0f7b57cd163f9'] = 'Cognome:'; +$_MODULE['<{secuvad}prestashop>secuvad_668a8d8d7ffe5da112b266e46b79b685'] = 'Nome:'; +$_MODULE['<{secuvad}prestashop>secuvad_6a858980896cb9daee81930c61bc1696'] = 'Funzione:'; +$_MODULE['<{secuvad}prestashop>secuvad_01401fe9a93df81d28637e5218597b76'] = 'E-Mail:'; +$_MODULE['<{secuvad}prestashop>secuvad_673ae02fffb72f0fe68a66f096a01347'] = 'Telefono:'; +$_MODULE['<{secuvad}prestashop>secuvad_7dce122004969d56ae2e0245cb754d35'] = 'Modifica'; +$_MODULE['<{secuvad}prestashop>secuvad_0ba7583639a274c434bbe6ef797115a4'] = 'Registrati'; +$_MODULE['<{secuvad}prestashop>secuvad_2f8531293ddfd4f30bb978e93d49f650'] = 'Mail:'; +$_MODULE['<{secuvad}prestashop>secuvad_42dbbc555675ff22f80115c0570de888'] = 'Descrizione del problema:'; +$_MODULE['<{secuvad}prestashop>secuvad_401886eb11224f37cbbd93211e991c85'] = 'I file di log:'; +$_MODULE['<{secuvad}prestashop>secuvad_fa29ad39f28d8d3a9b873ac37dec2899'] = 'Rapporto di errore'; +$_MODULE['<{secuvad}prestashop>secuvad_a649552939461a1cce6c2d77e2de44d0'] = 'I seguenti moduli di pagamento non sono associati:'; +$_MODULE['<{secuvad}prestashop>secuvad_b0d7bc21f644e151a6dec99181ac0718'] = 'I seguenti moduli di spedizione non sono associati:'; +$_MODULE['<{secuvad}prestashop>secuvad_68a569c0346cff10b9626e27fae1de48'] = ' Le seguenti categorie non sono associate:'; +$_MODULE['<{secuvad}prestashop>secuvad_a1d333dc75f4e131835c8104c4b2d966'] = 'Errore all\'attivazione'; +$_MODULE['<{secuvad}prestashop>secuvad_902b0d55fddef6f8d651fe1035b7d4bd'] = 'Errore'; +$_MODULE['<{secuvad}prestashop>secuvad_7fd791b8ff524778a13d978ff04f0bb9'] = 'Impossibile segnalare la frode prima di inviare l\'ordine associato'; +$_MODULE['<{secuvad}prestashop>secuvad_2e92ae79ff32b37fee4368a594792183'] = 'Errore di connessione'; +$_MODULE['<{secuvad}prestashop>secuvad_2d7839314eb05f8988381b70dbc1548b'] = 'Non è una truffa'; +$_MODULE['<{secuvad}prestashop>secuvad_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{secuvad}prestashop>secuvad_1b93ce75458ea0ce94250a781ff0835e'] = 'È una truffa'; +$_MODULE['<{secuvad}prestashop>secuvad_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{secuvad}prestashop>secuvad_830560d945b2aa75e58b6f0b7ffe0882'] = 'Non inviate a Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_3d0362bcbb2783e82be0612668eb7ce9'] = 'Convalidato da Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_999dfff14d541898b1c7266c3c271d40'] = 'Analisi'; +$_MODULE['<{secuvad}prestashop>secuvad_a464f32e0e54df4786e7d905577b7f0c'] = 'Ordine sospetto'; +$_MODULE['<{secuvad}prestashop>secuvad_f6ba219e7a45632ab4d39822108d68f3'] = 'Da controllare da parte del CLIENTE'; +$_MODULE['<{secuvad}prestashop>secuvad_e2cadc35c8d021861738765b25666ebb'] = 'Da controllare da parte di Secuvad'; +$_MODULE['<{secuvad}prestashop>secuvad_config_8bcaf785d6c5771e3c49bd90e0885c2a'] = 'Tentativo di pirateria'; +$_MODULE['<{secuvad}prestashop>secuvad_config_1f4eee5122ff1dfb7c7ff3aa8e879222'] = 'Nessun accesso autorizzato'; +$_MODULE['<{secuvad}prestashop>secuvad_config_635c1728fc02b144a4357007b44d55b7'] = 'I dati inviati sono:'; + +?> \ No newline at end of file diff --git a/modules/secuvad/logo.gif b/modules/secuvad/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb0cd495c57077ccb60862ea39195563e4921335 GIT binary patch literal 631 zcmZ?wbhEHb6krfwc*ekRE|+ob+O>B#`qtFc{CKqf+9a)?SBpzaOJBZx`QuE~-o1PO zd^~$+N94?zGgmeGJX&h<|M`^5&62-f?mBbk%)9O8lP6F9|ETlfVz2jGz2EPN{COes zVzuC(4@aLZG3%*K>Fw=ZKEM6{x9dlb9{q6GKBFI8*cg^I8AzS1(<<^lG=# z|92~|FL(WUC-33G_sNojC*k7}{|Eb`|37TLKhN;z{gPXYY<}F#yuIA%&+Y7ohZ5c&jsI~i z<^TWx40HsFKUo;r8KN0~UXGq+5xs)`QHgm{pYIb)n>|tKe9HAg8&%@)+akV z0hNYkF&@bphC+eXP7!HqGY+p$kB&`M@G@HDk#Lxevom^)gr@o#z$mJvlq0cA(T#^8nu(FY8UUt_`~Cm` literal 0 HcmV?d00001 diff --git a/modules/secuvad/secuvad.php b/modules/secuvad/secuvad.php new file mode 100644 index 000000000..b8a5290b2 --- /dev/null +++ b/modules/secuvad/secuvad.php @@ -0,0 +1,1324 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Secuvad extends Module +{ + private $_html = ''; + private $_postErrors = array(); + private $_allowed_modes = array('TEST', 'PROD'); + private $_secuvad_category = array(); + private $_secuvad_assoc_category = array(); + private $_secuvad_code_payment = array(); + private $_secuvad_carrier_type = array(); + private $_secuvad_carrier_delay = array(); + + public function __construct() + { + $this->name = 'secuvad'; + $this->tab = 'payment_security'; + $this->version = '2.0.1'; + $this->currencies = NULL; + $this->currencies_mode = NULL; + $this->need_instance = 0; + + parent::__construct(); + $this->displayName = $this->l('Secuvad module'); + $this->description = $this->l('Solution fighting against online fraud'); + $this->confirmUninstall = $this->l('Are you sure you want to delete this module?'); + } + + public function install() + { + if(!parent::install() + || !$this->registerHook('paymentConfirm') + || !$this->registerHook('adminOrder') + || !Configuration::updateValue('SECUVAD_CONTACT', 'prestashop@secuvad.com') + || !Configuration::updateValue('SECUVAD_ACTIVATION', '0') + || !Configuration::updateValue('SECUVAD_ID', '') + || !Configuration::updateValue('SECUVAD_IP', '91.121.209.139,91.121.209.140') + || !Configuration::updateValue('SECUVAD_IP_CONFIG', '91.213.82.241') + || !Configuration::updateValue('SECUVAD_IP_TEST', '91.121.147.62') + || !Configuration::updateValue('SECUVAD_NB_LOG_REPORTED', '100') + || !Configuration::updateValue('SECUVAD_MAX_LOG_SIZE', '200') + || !Configuration::updateValue('SECUVAD_LOG_SIZE', '100') + || !Configuration::updateValue('SECUVAD_LOGIN', '') + || !Configuration::updateValue('SECUVAD_MDP', '') + || !Configuration::updateValue('SECUVAD_MODE', 'TEST') + || !Configuration::updateValue('SECUVAD_RANDOM', 'b9ffecdde6169472ce33e354131cd26d34641358') + || !Configuration::updateValue('SECUVAD_URL_PROD', 'www.secuvad.com/submission/index.php') + || !Configuration::updateValue('SECUVAD_URL_TEST', 'www.secuvad-test.com/submission/index.php') + || !Configuration::updateValue('SECUVAD_XML_ENCODING', 'utf-8')) + return false; + + if (!file_exists(dirname(__FILE__).'/install.sql')) + die(Tools::displayError('File install.sql is missing')); + elseif (!$sql = file_get_contents(dirname(__FILE__).'/install.sql')) + die(Tools::displayError('File install.sql is not readable')); + $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); + + $sql = preg_split("/;\s*[\r\n]+/", $sql); + foreach ($sql as $query) + if ($query AND sizeof($query) AND !Db::getInstance()->Execute(trim($query))) + return false; + + $langs = Language::getLanguages(); + $query = ' + INSERT IGNORE INTO '._DB_PREFIX_.'secuvad_category(`category_id`, `category_name`, `sort_num`, `id_lang`) + VALUES '; + foreach ($langs as $lang) + if ($lang['iso_code'] == 'fr') + { + $query .= ' + (1, \'Informatique et Logiciels\', 101,'.(int)($lang['id_lang']).'), + (2,\'Téléphonie, Télécommunications\',102,'.(int)($lang['id_lang']).'), + (3,\'Matériels HiFi, Vidéo, Photo\',103,'.(int)($lang['id_lang']).'), + (4,\'Voyages, Tourisme\',104,'.(int)($lang['id_lang']).'), + (5,\'Vêtements, accessoires de mode\',105,'.(int)($lang['id_lang']).'), + (6,\'Sport\',106,'.(int)($lang['id_lang']).'), + (7,\'Electroménager\',107,'.(int)($lang['id_lang']).'), + (8,\'Cadeaux, fleurs\',108,'.(int)($lang['id_lang']).'), + (9,\'Accessoires de maison et jardin\',109,'.(int)($lang['id_lang']).'), + (10,\'Auto, moto et accessoires\',110,'.(int)($lang['id_lang']).'), + (11,\'Alimentation\',111,'.(int)($lang['id_lang']).'), + (12,\'Culture, divertissements\',112,'.(int)($lang['id_lang']).'), + (13,\'Beauté, santé\',113,'.(int)($lang['id_lang']).'), + (14,\'Services\',114,'.(int)($lang['id_lang']).'),'; + } + else + { + $query .= ' + (1,\'Computing and Softwares\',1,'.(int)($lang['id_lang']).'), + (2,\'Phones, Telecommunications\',2,'.(int)($lang['id_lang']).'), + (3,\'HiFi, Video, Photo\',3,'.(int)($lang['id_lang']).'), + (4,\'Travels, Tourism\',4,'.(int)($lang['id_lang']).'), + (5,\'Clothes, fashion accessories\',5,'.(int)($lang['id_lang']).'), + (6,\'Sport\',6,'.(int)($lang['id_lang']).'), + (7,\'Domestic appliances\',7,'.(int)($lang['id_lang']).'), + (8,\'Gifts, flowers\',8,'.(int)($lang['id_lang']).'), + (9,\'Home and garden goods\',9,'.(int)($lang['id_lang']).'), + (10,\'Cars, motorbikes and accessories\',10,'.(int)($lang['id_lang']).'), + (11,\'Food\',11,'.(int)($lang['id_lang']).'), + (12,\'Culture, entertainement\',12,'.(int)($lang['id_lang']).'), + (13,\'Beauty, healthcare\',13,'.(int)($lang['id_lang']).'), + (14,\'Services\',14,'.(int)($lang['id_lang']).'),'; + } + $query = rtrim($query, ','); + Db::getInstance()->Execute($query); + + $query = ' + INSERT IGNORE INTO '._DB_PREFIX_.'secuvad_payment(`code`, `name`, `id_lang`) + VALUES '; + foreach ($langs as $lang) + if ($lang['iso_code'] == 'fr') + { + $query .= ' + (\'carte\',\'Carte bancaire\','.(int)($lang['id_lang']).'), + (\'cheque\',\'Chèque\','.(int)($lang['id_lang']).'), + (\'virement\',\'Virement\','.(int)($lang['id_lang']).'), + (\'paypal\',\'Tiers de paiement\','.(int)($lang['id_lang']).'), + (\'cb en n fois\',\'Carte bancaire en plusieurs fois\','.(int)($lang['id_lang']).'), + (\'contre-remboursement\',\'Contre-Remboursement\','.(int)($lang['id_lang']).'),'; + } + else + { + $query .= ' + (\'carte\',\'Credit card\','.(int)($lang['id_lang']).'), + (\'cheque\',\'Check\','.(int)($lang['id_lang']).'), + (\'virement\',\'Transfer\','.(int)($lang['id_lang']).'), + (\'paypal\',\'Third-party payment\','.(int)($lang['id_lang']).'), + (\'cb en n fois\',\'Credit Card (n times)\','.(int)($lang['id_lang']).'), + (\'contre-remboursement\',\'On delivery\','.(int)($lang['id_lang']).'),'; + } + $query = rtrim($query, ','); + Db::getInstance()->Execute($query); + + $query = ' + INSERT IGNORE INTO '._DB_PREFIX_.'secuvad_transport(`transport_id`, `transport_name`, `id_lang`) + VALUES '; + foreach ($langs as $lang) + if ($lang['iso_code'] == 'fr') + { + $query .= ' + (1,\'Retrait chez le commerçant\','.(int)($lang['id_lang']).'), + (2,\'Retrait dans un point de retrait tiers\','.(int)($lang['id_lang']).'), + (3,\'Coliposte\','.(int)($lang['id_lang']).'), + (4,\'Chronopost\','.(int)($lang['id_lang']).'), + (5,\'Envoi remis sans signature\','.(int)($lang['id_lang']).'), + (6,\'Bien/service immatériel\','.(int)($lang['id_lang']).'),'; + } + else + { + $query .= ' + (1,\'Merchant Warehouse\','.(int)($lang['id_lang']).'), + (2,\'Other withdrawal\','.(int)($lang['id_lang']).'), + (3,\'Public conveyor with signature\','.(int)($lang['id_lang']).'), + (4,\'Private conveyor with signature\','.(int)($lang['id_lang']).'), + (5,\'Public conveyor without signature\','.(int)($lang['id_lang']).'), + (6,\'Immaterial Good/Service\','.(int)($lang['id_lang']).'),'; + } + $query = rtrim($query, ','); + Db::getInstance()->Execute($query); + + $query = ' + INSERT IGNORE INTO `'._DB_PREFIX_.'secuvad_transport_delay`(`transport_delay_id`, `transport_delay_name`, `id_lang`) + VALUES '; + foreach ($langs as $lang) + $query .= ' + (1,\'express\','.(int)($lang['id_lang']).'), + (2,\'standard\','.(int)($lang['id_lang']).'),'; + $query = rtrim($query, ','); + Db::getInstance()->Execute($query); + + if (!file_exists(dirname(__FILE__).'/../../classes/PaymentCC.php')) + { + @copy(dirname(__FILE__).'/classes/PaymentCC.php', dirname(__FILE__).'/../../classes/PaymentCC.php'); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook`(`name`, `title`, `position`) + VALUES (\'paymentCCAdded\', \'paymentCCAdded\', 0)'); + $this->registerHook('paymentCCAdded'); + } + else + $this->registerHook('paymentCCAdded'); + + return true; + } + + public function uninstall() + { + if(!parent::uninstall() + || !Configuration::deleteByName('SECUVAD_CONTACT') + || !Configuration::deleteByName('SECUVAD_ACTIVATION') + || !Configuration::deleteByName('SECUVAD_ID') + || !Configuration::deleteByName('SECUVAD_IP') + || !Configuration::deleteByName('SECUVAD_IP_CONFIG') + || !Configuration::deleteByName('SECUVAD_IP_TEST') + || !Configuration::deleteByName('SECUVAD_NB_LOG_REPORTED') + || !Configuration::deleteByName('SECUVAD_MAX_LOG_SIZE') + || !Configuration::deleteByName('SECUVAD_LOG_SIZE') + || !Configuration::deleteByName('SECUVAD_LOGIN') + || !Configuration::deleteByName('SECUVAD_MDP') + || !Configuration::deleteByName('SECUVAD_MODE') + || !Configuration::deleteByName('SECUVAD_RANDOM') + || !Configuration::deleteByName('SECUVAD_URL_PROD') + || !Configuration::deleteByName('SECUVAD_URL_TEST') + || !Configuration::deleteByName('SECUVAD_XML_ENCODING')) + return false; + + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_assoc_category`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_assoc_payment`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_assoc_transport`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_category`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_logs`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_order`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_payment`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_transport`'); + Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'secuvad_transport_delay`'); + return true; + } + + public function hookAdminOrder($params) + { + global $cookie, $currentIndex; + + if ($this->check_assoc() != '') + return ' +
    +
    + '.$this->l('Secuvad').' +

    '.$this->l('In order to use Secuvad protection, please configure your module.').'

    +
    + '; + + $secuvad_order = Db::getInstance()->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_order` + WHERE `id_secuvad_order` = '.(int)($params['id_order']).' + '); + if (is_array($secuvad_order) AND sizeof($secuvad_order)) + { + if (Tools::isSubmit('send_to_secuvad')) + $this->_sendToSecuvad(); + elseif (Tools::isSubmit('report_fraud')) + $this->_reportFraud(); + + return ' +
    +
    + '.$this->l('Secuvad').' +

    + '.$this->l('Secuvad status:').' '.$this->_getSecuvadStatusHtml((int)($secuvad_order['secuvad_status'])).' + '.($secuvad_order['is_fraud'] ? '
    '.$this->l('Unpaid transmitted:').' '.$this->_getFraudStatusHtml((int)($secuvad_order['is_fraud'])) : '').' +

    + +
    +

    + + + +

    +
    +
    + '; + } + } + + public function hookPaymentConfirm($params) + { + $id_order = (int)($params['id_order']); + $exists = Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'secuvad_order` + WHERE `id_secuvad_order` = '.(int)($id_order)); + if (!$exists) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'secuvad_order`(`id_secuvad_order`, `ip`, `ip_time`) + VALUES ('.(int)($id_order).', \''.pSQL($this->getRemoteIPaddress()).'\', \''.pSQL(date("Y-m-d H:i:s")).'\') + '); + if ($this->check_assoc() == '' AND Configuration::get('SECUVAD_ACTIVATION') == 1) + { + include_once (_PS_MODULE_DIR_.'secuvad/classes/Secuvad_flux.php'); + include_once (_PS_MODULE_DIR_.'secuvad/classes/Secuvad_connection.php'); + + $xml_obj = new Secuvad_flux(Configuration::get('SECUVAD_ID'),Configuration::get('SECUVAD_XML_ENCODING')); + $flux_xml = $xml_obj->get_flux_xml((int)($id_order)); + + if (Configuration::get('SECUVAD_MODE') == 'TEST') + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_TEST'); + else + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_PROD'); + + $connection_obj = new Secuvad_connection($flux_xml, Configuration::get('SECUVAD_ID'), $url, $this); + $connection_obj->send_transaction(); + } + } + } + + public function hookPaymentCCAdded($params) + { + $id_order = (int)($params['paymentCC']->id_order); + $exists = Db::getInstance()->getValue(' + SELECT COUNT(*) + FROM `'._DB_PREFIX_.'secuvad_order` + WHERE `id_secuvad_order` = '.(int)($id_order)); + if (!$exists) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'secuvad_order`(`id_secuvad_order`, `ip`, `ip_time`) + VALUES ('.(int)($id_order).', \''.pSQL($this->getRemoteIPaddress()).'\', \''.pSQL(date("Y-m-d H:i:s")).'\') + '); + if ($this->check_assoc() == '' AND Configuration::get('SECUVAD_ACTIVATION') == 1) + { + include_once (_PS_MODULE_DIR_.'secuvad/classes/Secuvad_flux.php'); + include_once (_PS_MODULE_DIR_.'secuvad/classes/Secuvad_connection.php'); + + $xml_obj = new Secuvad_flux(Configuration::get('SECUVAD_ID'), Configuration::get('SECUVAD_XML_ENCODING')); + $flux_xml = $xml_obj->get_flux_xml((int)($id_order)); + if (Configuration::get('SECUVAD_MODE') == 'TEST') + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_TEST'); + else + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_PROD'); + + $connection_obj = new Secuvad_connection($flux_xml, Configuration::get('SECUVAD_ID'), $url, $this); + $connection_obj->send_transaction(); + } + } + } + + public function getContent() + { + global $cookie; + + $this->_html = '

    '.$this->l('Secuvad configuration').'

    '; + + if (!$this->_isPaymentCCFilePresent()) + $this->_html .= $this->displayError($this->l('Payment CC file isn\'t present, please copy this file into classes directory of your Prestashop')); + $lock = $this->_postProcess(); + if ($this->check_assoc() AND Configuration::get('SECUVAD_ACTIVATION')) + $this->_html .= '
    '.$this->l('Please configure all associations').'
    '; + $this->_initSecuvadAssoc(); + if (Configuration::get('SECUVAD_ACTIVATION')) + $this->_setFormConfigure(); + else + { + $this->_html .= '

    '.$this->l('If you have already an account').'

    '; + $this->_setFormConfigure(); + $this->_setFormRegister($lock); + } + + return $this->_html; + } + + private function _isPaymentCCFilePresent() + { + if (!file_exists(dirname(__FILE__).'/../../classes/PaymentCC.php')) + return false; + return true; + } + + private function _initSecuvadAssoc() + { + $this->check_assoc(); + $this->_secuvad_category = $this->_getSecuvadCategories(); + $this->_secuvad_assoc_category = $this->_getSecuvadCategoryAssoc(); + $this->_secuvad_code_payment = $this->_getSecuvadCodePayment(); + $this->_secuvad_carrier_type = $this->_getSecuvadCarrierType(); + $this->_secuvad_carrier_delay = $this->_getSecuvadCarrierDelay(); + } + + private function _getSecuvadCategories() + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_category` sc + WHERE sc.`id_lang` = '.(int)($cookie->id_lang)); + } + + private function _getSecuvadCategoryAssoc() + { + $data = Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_assoc_category`'); + + if (!sizeof($data)) + return array(); + + $assoc = array(); + foreach ($data as $d) + $assoc[$d['id_category']] = $d['category_id']; + return $assoc; + } + + private function _getSecuvadPayment() + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT IF(sp.name IS NULL, "Unknown", sp.name) AS `secuvad_name`, sp.`code`, m.`id_module`, m.`name` AS `module_name` + FROM `'._DB_PREFIX_.'secuvad_assoc_payment` sac + JOIN `'._DB_PREFIX_.'module` m ON (m.`id_module` = sac.`id_module`) + LEFT JOIN `'._DB_PREFIX_.'secuvad_payment` sp ON (sp.`code` = sac.`code` AND sp.`id_lang` = '.(int)($cookie->id_lang).')'); + } + + private function _getSecuvadCodePayment() + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_payment` + WHERE `id_lang` = '.(int)($cookie->id_lang) + ); + } + + private function _getSecuvadCarrier() + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_assoc_transport` sat + JOIN '._DB_PREFIX_.'carrier c ON (c.id_carrier = sat.id_carrier) + LEFT JOIN '._DB_PREFIX_.'secuvad_transport st ON st.transport_id = sat.transport_id AND st.id_lang='.(int)($cookie->id_lang).' + LEFT JOIN '._DB_PREFIX_.'secuvad_transport_delay std ON std.transport_delay_id = sat.transport_delay_id AND std.id_lang='.(int)($cookie->id_lang) + ); + } + + private function _getSecuvadCarrierType() + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_transport` + WHERE `id_lang` = '.(int)($cookie->id_lang) + ); + } + + private function _getSecuvadCarrierDelay() + { + global $cookie; + + return Db::getInstance()->ExecuteS(' + SELECT * + FROM `'._DB_PREFIX_.'secuvad_transport_delay` + WHERE `id_lang` = '.(int)($cookie->id_lang) + ); + } + + private function _postProcess() + { + $errors = array(); + if (Tools::isSubmit('submitSecuvadEdit')) + return false; + if (Tools::isSubmit('submitSecuvadConfiguration')) + { + if (Tools::getValue('forme') != 'SARL' + AND Tools::getValue('forme') != 'SA' + AND Tools::getValue('forme') != 'EURL' + AND Tools::getValue('forme') != 'SAS' + AND Tools::getValue('forme') != 'Entreprise individuelle' + AND Tools::getValue('forme') != 'SNC') + $errors[] = $this->l('Company type is invalid'); + if (Tools::getValue('societe') == NULL OR !Validate::isName(Tools::getValue('societe'))) + $errors[] = $this->l('Company name is invalid'); + if (Tools::getValue('capital') != NULL AND !Validate::isGenericName(Tools::getValue('capital'))) + $errors[] = $this->l('Capital is invalid'); + if (Tools::getValue('web_site') == NULL OR !Validate::isUrl(Tools::getValue('web_site'))) + $errors[] = $this->l('WebSite is invalid'); + if (Tools::getValue('address') != NULL AND !Validate::isAddress(Tools::getValue('address'))) + $errors[] = $this->l('Address is invalid'); + if (Tools::getValue('code_postal') != NULL AND !Validate::isPostCode(Tools::getValue('code_postal'))) + $errors[] = $this->l('Zip/ Postal Code is invalid'); + if (Tools::getValue('ville') != NULL AND !Validate::isCityName(Tools::getValue('ville'))) + $errors[] = $this->l('City is invalid'); + if (Tools::getValue('pays') != NULL AND !Validate::isCountryName(Tools::getValue('pays'))) + $errors[] = $this->l('Country is invalid'); + if (Tools::getValue('rcs') != NULL AND !Validate::isGenericName(Tools::getValue('rcs'))) + $errors[] = $this->l('RCS is invalid'); + if (Tools::getValue('siren') != NULL AND !Validate::isGenericName(Tools::getValue('siren'))) + $errors[] = $this->l('Siren is invalid'); + if (!is_array(Tools::getValue('categories')) OR !sizeof(Tools::getValue('categories'))) + $errors[] = $this->l('You must select at least one category.'); + if (Tools::getValue('civilite') != 'M' + AND Tools::getValue('civilite') != 'Mme' + AND Tools::getValue('civilite') != 'Mlle') + $errors[] = $this->l('Title is invalid'); + if (Tools::getValue('nom') == NULL OR !Validate::isName(Tools::getValue('nom'))) + $errors[] = $this->l('Last name is invalid'); + if (Tools::getValue('prenom') == NULL OR !Validate::isName(Tools::getValue('prenom'))) + $errors[] = $this->l('First name is invalid'); + if (Tools::getValue('fonction') != NULL AND !Validate::isGenericName(Tools::getValue('fonction'))) + $errors[] = $this->l('Function name is invalid'); + if (Tools::getValue('email') == NULL OR !Validate::isEmail(Tools::getValue('email'))) + $errors[] = $this->l('E-mail name is invalid'); + if (Tools::getValue('telephone') == NULL OR !Validate::isPhoneNumber(Tools::getValue('telephone'))) + $errors[] = $this->l('Telephone is invalid'); + if (!sizeof($errors)) + return true; + else + { + $this->_html .= $this->displayError(implode('
    ', $errors)); + return false; + } + } + + if (Tools::isSubmit('submitSecuvadPostConfiguration')) + { + $errors = array(); + if (!Validate::isGenericName(Tools::getValue('secuvad_login'))) + $errors[] = $this->l('Invalid login'); + if (!Validate::isGenericName(Tools::getValue('secuvad_password'))) + $errors[] = $this->l('Invalid password'); + if (!in_array(Tools::getValue('secuvad_mode'), $this->_allowed_modes)) + $errors[] = $this->l('Invalid Mode'); + if (!Validate::isInt(Tools::getValue('secuvad_id'))) + $errors[] = $this->l('Invalid ID'); + if (!sizeof($errors)) + { + // update configuration + Configuration::updateValue('SECUVAD_LOGIN',Tools::getValue('secuvad_login')); + Configuration::updateValue('SECUVAD_MDP',Tools::getValue('secuvad_password')); + Configuration::updateValue('SECUVAD_MODE',Tools::getValue('secuvad_mode')); + Configuration::updateValue('SECUVAD_ID',Tools::getValue('secuvad_id')); + Configuration::updateValue('SECUVAD_ACTIVATION', 1); + $this->_html .= $this->displayConfirmation($this->l('Settings are updated').''); + } + else + $this->_html .= $this->displayError(implode('
    ', $errors)); + } + + if (Tools::isSubmit('submitSecuvadCategory')) + { + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_assoc_category` + '); + $sql = 'INSERT INTO `'._DB_PREFIX_.'secuvad_assoc_category` VALUES'; + foreach ($_POST as $k => $category_id) + if (preg_match('/secuvad_cat_([0-9]+)$/Ui', $k, $result)) + { + $id_category = $result[1]; + $sql .= '(NULL, '.(int)($id_category).', '.(int)($category_id).'),'; + } + $sql = rtrim($sql, ','); + if (Db::getInstance()->Execute($sql)) + $this->_html .= $this->displayConfirmation($this->l('Settings are updated')); + else + $this->_html .= $this->displayError($this->l('Error during update')); + } + + if (Tools::isSubmit('submitSecuvadPayment')) + { + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_assoc_payment` + '); + $sql = 'INSERT INTO `'._DB_PREFIX_.'secuvad_assoc_payment` VALUES'; + foreach ($_POST as $k => $code) + if (preg_match('/secuvad_payment_([0-9]+)$/Ui', $k, $result)) + { + $id_module = $result[1]; + $sql .= '(NULL, '.(int)($id_module).', \''.pSQL($code).'\'),'; + } + $sql = rtrim($sql, ','); + if (Db::getInstance()->Execute($sql)) + $this->_html .= $this->displayConfirmation($this->l('Settings are updated')); + else + $this->_html .= $this->displayError($this->l('Error during update')); + } + + if (Tools::isSubmit('submitSecuvadCarrier')) + { + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_assoc_transport` + '); + $sql = 'INSERT INTO `'._DB_PREFIX_.'secuvad_assoc_transport` VALUES'; + foreach ($_POST as $k => $value) + if (preg_match('/secuvad_carrier_type_([0-9]+)$/Ui', $k, $result)) + { + $id_carrier = $result[1]; + $sql .= '(NULL, '.(int)($id_carrier).', '.(int)($value).', '.(int)($_POST['secuvad_carrier_delay_'.(int)($id_carrier)]).'),'; + } + $sql = rtrim($sql, ','); + if (Db::getInstance()->Execute($sql)) + $this->_html .= $this->displayConfirmation($this->l('Settings are updated')); + else + $this->_html .= $this->displayError($this->l('Error during update')); + } + } + + private function _getSecuvadRegisterURL() + { + return 'http://www.secuvad.com/contrat/'; + } + + private function _setFormConfigure() + { + global $cookie; + + $this->_html .= ' +
    +
    + '.$this->l('Company').' + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +

    +
    +
    + '; + + if (Configuration::get('SECUVAD_ACTIVATION')) + { + $categories = Category::getCategories((int)($cookie->id_lang), false); + $categories[1]['infos'] = array('name' => $this->l('Home'), 'id_parent' => 0, 'level_depth' => 0); + + $this->_html .= ' +
    +
    + '.$this->l('Secuvad categories').' + + + + + + + '; + $this->recurseCategoryForInclude($categories, $categories[1]); + $this->_html .= ' +
    '.$this->l('Name').''.$this->l('Secuvad Category').'
    +

    +
    +
    + '; + + $this->_html .= ' +
    +
    + '.$this->l('Secuvad Payment').' + + + + + + + '; + $secuvad_payements = $this->_getSecuvadPayment(); + foreach ($secuvad_payements as $payment) + { + $this->_html .= ' + + + + + '; + } + $this->_html .= ' +
    '.$this->l('Name').''.$this->l('Secuvad Payment type').'
    '.htmlentities($payment['module_name'], ENT_QUOTES, 'UTF-8').' + +
    +

    +
    +
    + '; + + $this->_html .= ' +
    +
    + '.$this->l('Secuvad Carrier').' + + + + + + + + '; + $secuvad_carriers = $this->_getSecuvadCarrier(); + foreach ($secuvad_carriers as $carrier) + { + $this->_html .= ' + + + + + + '; + } + $this->_html .= ' +
    '.$this->l('Name').''.$this->l('Secuvad Carrier').''.$this->l('Secuvad Carrier Delay').'
    '.(!preg_match('/^0$/Ui', $carrier['name']) ? htmlentities($carrier['name'], ENT_QUOTES, 'UTF-8') : Configuration::get('PS_SHOP_NAME')).' + + + +
    +

    +
    +
    + '; + } + } + + private function recurseCategoryForInclude($categories, $current, $id_category = 1, $has_suite = array()) + { + global $done, $cookie; + static $irow; + + if (!isset($done[$current['infos']['id_parent']])) + $done[$current['infos']['id_parent']] = 0; + $done[$current['infos']['id_parent']] += 1; + + $todo = sizeof($categories[$current['infos']['id_parent']]); + $doneC = $done[$current['infos']['id_parent']]; + + $level = $current['infos']['level_depth'] + 1; + $this->_html .= ' + '; + for ($i = 2; $i < $level; $i++) + $this->_html .= ''; + $this->_html .= '  '; + $this->_html .= ' + + + + + + '; + if ($level > 1) + $has_suite[] = ($todo == $doneC ? 0 : 1); + if (isset($categories[$id_category])) + foreach ($categories[$id_category] AS $key => $row) + if ($key != 'infos') + $this->recurseCategoryForInclude($categories, $categories[$id_category][$key], $key, $has_suite); + } + + private function _setFormRegister($lock = false) + { + $this->_html .= ' +

    '.$this->l('In order to use the Secuvad module, please fill in this form, then click "Register".').'

    +
    '; + if ($lock) + { + foreach (Tools::getValue('categories') as $category) + $this->_html .= ''; + } + $this->_html .= ' + + +
    + '.$this->l('Company').' + + +
    + + '.($lock ? '' : '').' +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +

    * '.$this->l('Required fields').'

    +
    +
    + '.$this->l('Product types').' + + +
    +
      + '; + + foreach ($this->_getSecuvadCategories() as $category) + $this->_html .= ' +
    • + + '.(($lock AND is_array(Tools::getValue('categories')) AND in_array((int)($category['category_id']), Tools::getValue('categories'))) ? ''; + $this->_html .= ' +
    +
    +
    +
    +
    + '.$this->l('Company contact').' + + +
    + + '.($lock ? '' : '').' +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +

    * '.$this->l('Required fields').'

    +
    + '.($lock ? + '

    ' : + '

    ').' +
    + '; + } + + private function installModuleTab($tabClass, $tabName, $idTabParent) + { + @copy(_PS_IMG_DIR_.'t/AdminAccess.gif', _PS_MODULE_DIR_.$this->name.'/'.$tabClass.'.gif'); + @copy(_PS_IMG_DIR_.'t/AdminAccess.gif', _PS_IMG_DIR_.'t/'.$tabClass.'.gif'); + $tab = new Tab(); + $tab->name = $tabName; + $tab->class_name = $tabClass; + $tab->module = $this->name; + $tab->id_parent = (int)($idTabParent); + if(!$tab->save()) + return false; + return true; + } + + private function uninstallModuleTab($tabClass) + { + $idTab = Tab::getIdFromClassName($tabClass); + if($idTab != 0) + { + $tab = new Tab($idTab); + $tab->delete(); + return true; + } + return false; + } + + public function getRemoteIPaddress() + { + return $_SERVER['REMOTE_ADDR']; + } + + private function send_error_report($probleme,$mail) + { + $report = 'idsecuvad='.get_secuvad_id()."\n\n"; + $report .= $this->l('Mail:').$mail."\n\n"; + $report .= $this->l('Issue description:')."\n".$probleme."\n\n"; + $report .= $this->l('Log files:')."\n"; + $res = Db::getInstance()->ExecuteS(' + SELECT `message`, `date` + FROM `'._DB_PREFIX_.'secuvad_logs` + ORDER BY `date` DESC + LIMIT '.(int)($this->get_secuvad_nb_log_reportred())); + foreach($res as $msg) + $report .= $msg['date']." : ".$msg['message']."\n\n"; + mail($this->get_secuvad_contact(), $this->l('Error report').' idsecuvad='.$this->get_secuvad_id(), $report); + } + + public function sent_to_secuvad($id_secuvad_order) + { + $secuvad_status = Db::getInstance()->getValue(' + SELECT `secuvad_status` + FROM `'._DB_PREFIX_.'secuvad_order` + WHERE `id_secuvad_order` = '.(int)($id_secuvad_order)); + + if($secuvad_status == 0) + return false; + return true; + } + + public function check_assoc() + { + $result = ''; + if(!$this->check_payment()) + $result .= 'payment'; + if(!$this->check_transport()) + $result .= 'transport'; + if(!$this->check_category()) + $result .= 'category'; + return $result; + } + + private function check_payment() + { + $result = true; + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_assoc_payment` + WHERE `id_module` NOT IN + ( + SELECT m.`id_module` + FROM `'._DB_PREFIX_.'hook` h + JOIN `'._DB_PREFIX_.'hook_module` hm ON (hm.`id_hook` = h.`id_hook`) + JOIN `'._DB_PREFIX_.'module` m ON (m.`id_module` = hm.`id_module`) + WHERE h.`name` = \'payment\' + ) + '); + + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'secuvad_assoc_payment` (`id_module`) + ( + SELECT m.`id_module` FROM `'._DB_PREFIX_.'hook` h + JOIN `'._DB_PREFIX_.'hook_module` hm ON (hm.`id_hook` = h.`id_hook`) + JOIN `'._DB_PREFIX_.'module` m ON (m.`id_module` = hm.`id_module`) + LEFT JOIN `'._DB_PREFIX_.'secuvad_assoc_payment` sap ON (sap.`id_module` = m.`id_module`) + WHERE h.`name` = "payment" + AND sap.`id_module` IS NULL + )'); + + $module_not_assoc = Db::getInstance()->ExecuteS(' + SELECT m.`name`, m.`id_module` + FROM `'._DB_PREFIX_.'hook` h + JOIN `'._DB_PREFIX_.'hook_module` hm ON (hm.`id_hook` = h.`id_hook`) + JOIN `'._DB_PREFIX_.'module` m ON (m.`id_module` = hm.`id_module`) + JOIN `'._DB_PREFIX_.'secuvad_assoc_payment` sap ON (sap.`id_module` = m.`id_module`) + WHERE h.`name` = "payment" AND sap.`code` IS NULL + '); + if (sizeof($module_not_assoc) > 0) + { + $message = $this->l('Following payment modules are not associated:'); + foreach($module_not_assoc as $mod) + $message .= "\n\t".$mod['id_module']."->".$mod['name']; + $this->secuvad_log($message); + $result = false; + } + + return $result; + } + + private function check_transport() + { + global $cookie; + + $result = true; + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_assoc_transport` + WHERE `id_carrier` NOT IN + ( + SELECT c.`id_carrier` FROM `'._DB_PREFIX_.'carrier` c + WHERE c.`deleted` = 0 + ) + '); + + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'secuvad_assoc_transport`(id_carrier) + ( + SELECT c.`id_carrier` + FROM `'._DB_PREFIX_.'carrier` c + LEFT JOIN `'._DB_PREFIX_.'secuvad_assoc_transport` sat ON (sat.`id_carrier` = c.`id_carrier`) + WHERE sat.`id_carrier` IS NULL + AND c.`deleted` = 0 + ) + '); + + $module_not_assoc = Db::getInstance()->ExecuteS(' + SELECT c.`name`, c.`id_carrier` + FROM `'._DB_PREFIX_.'carrier` c + JOIN `'._DB_PREFIX_.'secuvad_assoc_transport` sat ON (sat.`id_carrier` = c.`id_carrier`) + LEFT JOIN `'._DB_PREFIX_.'secuvad_transport` st ON (st.`transport_id` = sat.`transport_id` AND st.`id_lang` = '.(int)($cookie->id_lang).') + LEFT JOIN `'._DB_PREFIX_.'secuvad_transport_delay` std ON (std.`transport_delay_id` = sat.`transport_delay_id` AND std.`id_lang`='.(int)($cookie->id_lang).') + WHERE (st.`transport_id` IS NULL OR std.`transport_delay_id` IS NULL) + AND c.`deleted` = 0 + AND c.`active` = 1 + '); + if (count($module_not_assoc) > 0) + { + $message = $this->l('Following shipping methods are not associated:'); + foreach($module_not_assoc as $mod) + $message .= "\n\t".$mod['id_carrier']."->".$mod['name']; + $this->secuvad_log($message); + $result = false; + } + + return($result); + } + + private function check_category() + { + global $cookie; + + $result = true; + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_assoc_category` + WHERE `id_category` NOT IN + ( + SELECT c.`id_category` + FROM `'._DB_PREFIX_.'category` c + ) + '); + + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'secuvad_assoc_category`(id_category) + ( + SELECT c.`id_category` + FROM `'._DB_PREFIX_.'category` c + LEFT JOIN `'._DB_PREFIX_.'secuvad_assoc_category` sac ON (sac.`id_category` = c.`id_category`) + WHERE sac.`id_category` IS NULL + ) + '); + + $module_not_assoc = Db::getInstance()->ExecuteS(' + SELECT cl.`name`, c.`id_category` + FROM `'._DB_PREFIX_.'category` c + JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = c.`id_category`) + JOIN `'._DB_PREFIX_.'lang` l ON (l.`id_lang` = cl.`id_lang` AND l.`iso_code` = \'en\') + JOIN `'._DB_PREFIX_.'secuvad_assoc_category` sac ON (sac.`id_category` = c.`id_category`) + LEFT JOIN `'._DB_PREFIX_.'secuvad_category` sc ON (sc.`category_id` = sac.`category_id` AND sc.`id_lang` = '.(int)($cookie->id_lang).') + WHERE sc.`category_id` IS NULL + '); + if(count($module_not_assoc)>0) + { + $message = $this->l('Following categories are not associated:'); + foreach($module_not_assoc as $mod) + $message .= "\n\t".$mod['id_category']."->".$mod['name']; + $this->secuvad_log($message); + $result = false; + } + + return($result); + } + + private function _sendToSecuvad() + { + global $cookie; + + if ($this->check_assoc() != '' || Configuration::get('SECUVAD_ACTIVATION') != 1) + { + $this->secuvad_log('AdminOrders.php : '.$this->l('Error during activation')); + return 0; + } + include_once(_PS_MODULE_DIR_.'secuvad/classes/Secuvad_flux.php'); + include_once(_PS_MODULE_DIR_.'secuvad/classes/Secuvad_connection.php'); + if (Tools::isSubmit('id_secuvad_order')) + { + $xml_obj = new Secuvad_flux(Configuration::get('SECUVAD_ID'), Configuration::get('SECUVAD_XML_ENCODING')); + $flux_xml = $xml_obj->get_flux_xml(Tools::getValue('id_secuvad_order')); + if (Configuration::get('SECUVAD_MODE') == 'TEST') + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_TEST'); + else + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_PROD'); + $connection_obj = new Secuvad_connection($flux_xml, Configuration::get('SECUVAD_ID'),$url, $this); + $connection_obj->send_transaction(); + Tools::redirectAdmin('index.php?tab=AdminOrders&confirm=1&id_order='.Tools::getValue('id_secuvad_order').'&vieworder&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + } + } + + private function _reportFraud() + { + global $cookie; + + if ($this->check_assoc() != '' || Configuration::get('SECUVAD_ACTIVATION') != 1) + { + $this->secuvad_log('AdminOrders.php : '.$this->l('Error during activation')); + return 0; + } + include_once (_PS_MODULE_DIR_.'secuvad/classes/Secuvad_flux.php'); + include_once (_PS_MODULE_DIR_.'secuvad/classes/Secuvad_connection.php'); + + if (Tools::isSubmit('id_secuvad_order')) + { + if (!$this->sent_to_secuvad(Tools::getValue('id_secuvad_order'))) + { + echo '
    +

    '.$this->l('Error').'

    +
      +
    1. '.$this->l('Impossible to report fraud before submitting the associated order').'
    2. +
    +
    '; + return 0; + } + + $xml_obj = new Secuvad_flux(Configuration::get('SECUVAD_ID'), Configuration::get('SECUVAD_XML_ENCODING')); + $flux_xml = $xml_obj->get_flux_xml_fraud(Tools::getValue('id_secuvad_order')); + + if(Configuration::get('SECUVAD_MODE') == 'TEST') + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_TEST'); + else + $url = 'https://'.Configuration::get('SECUVAD_LOGIN').':'.Configuration::get('SECUVAD_MDP').'@'.Configuration::get('SECUVAD_URL_PROD'); + $connection_obj = new Secuvad_connection($flux_xml, Configuration::get('SECUVAD_ID'),$url ,$this); + $result = $connection_obj->report_fraud('impaye','impaye_report'); + + if ($result == "true") + Tools::redirectAdmin('index.php?tab=AdminOrders&confirm=2&id_order='.Tools::getValue('id_secuvad_order').'&vieworder&token='.Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee))); + else + { + if ($result == "Erreur de connexion") + $result = $this->l('Connection error'); + echo '
    +

    '.$this->l('Error').'

    +
    1. '.$result.'
    2. +
    +
    '; + } + } + } + + public function secuvad_log($message) + { + $res = Db::getInstance()->getValue(' + SELECT COUNT(0) nb + FROM `'._DB_PREFIX_.'secuvad_logs`'); + if($res > $this->get_secuvad_max_log_size()) + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'secuvad_logs` + ORDER BY `date` + LIMIT '.(int)($this->get_secuvad_log_size())); + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'secuvad_logs` (`message`) + VALUES (\''.pSQL($message).'\') + '); + } + + public function get_secuvad_ip() + { + if (Configuration::get('SECUVAD_MODE') == 'TEST') + return explode(',', Configuration::get('SECUVAD_IP_TEST')); + else + return explode(',', Configuration::get('SECUVAD_IP')); + } + + public function get_secuvad_ip_config() + { + return explode(',', Configuration::get('SECUVAD_IP_CONFIG')); + } + + public function get_secuvad_random() + { + return(Configuration::get('SECUVAD_RANDOM')); + } + + public function get_secuvad_id() + { + return(Configuration::get('SECUVAD_ID')); + } + + public function get_secuvad_contact() + { + return(Configuration::get('SECUVAD_CONTACT')); + } + + public function get_secuvad_nb_log_reportred() + { + return(Configuration::get('SECUVAD_NB_LOG_REPORTED')); + } + + public function get_secuvad_max_log_size() + { + return(Configuration::get('SECUVAD_MAX_LOG_SIZE')); + } + + public function get_secuvad_log_size() + { + return(Configuration::get('SECUVAD_LOG_SIZE')); + } + + public function _getFraudStatusHtml($is_fraud) + { + if ($is_fraud == 0) + return ''.$this->l('Is not a fraud').' '.$this->l('No'); + elseif ($is_fraud == 1) + return ''.$this->l('Is a fraud').' '.$this->l('Yes'); + } + + public function _getSecuvadStatusHtml($secuvad_status) + { + switch ($secuvad_status) + { + case 0 : + return ''.$this->l('Not sent to Secuvad').' '.$this->l('Not sent to Secuvad'); + break; + case 1 : + return ''.$this->l('Validated by Secuvad').' '.$this->l('Validated by Secuvad'); + break; + case 2 : + return ''.$this->l('Analyzing').' '.$this->l('Analyzing'); + break; + case 3 : + return ''.$this->l('Suspect order').' '.$this->l('Suspect order'); + break; + case 4 : + return ''.$this->l('Error').' '.$this->l('Error'); + break; + case 6 : + return ''.$this->l('To be checked by CUSTOMER').' '.$this->l('To be checked by CUSTOMER'); + break; + case 7 : + return ''.$this->l('To be checked by Secuvad').' '.$this->l('To be checked by Secuvad'); + break; + default: + return ''.$this->l('Not sent to Secuvad').' '.$this->l('Not sent to Secuvad'); + } + } +} + + diff --git a/modules/secuvad/secuvad_config.php b/modules/secuvad/secuvad_config.php new file mode 100644 index 000000000..b4d4d32de --- /dev/null +++ b/modules/secuvad/secuvad_config.php @@ -0,0 +1,43 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/secuvad.php'); + +$secuvad = new Secuvad(); +if (in_array($secuvad->getRemoteIPaddress(), $secuvad->get_secuvad_ip_config()) AND sha1(Tools::getValue('p')) == $secuvad->get_secuvad_random()) +{ + $value = stripslashes(Tools::getValue('value')); + $key = stripslashes(Tools::getValue('key')); + Configuration::updateValue($key, $value); + echo 'OK'; +} +else + mail($secuvad->get_secuvad_contact(), $this->l('Hack Attempt'), 'secuvad_id='.$secuvad->get_secuvad_id()."\n".$this->l('No authorized access').' (ip='.$secuvad->getRemoteIPaddress().')'."\n".$this->l('The data sent is:')."\n\n".'GET :'."\n".print_r($_GET,true)."\n\n".'POST :'."\n".print_r($_POST,true)); + + diff --git a/modules/secuvad/secuvad_response.php b/modules/secuvad/secuvad_response.php new file mode 100644 index 000000000..90847f95c --- /dev/null +++ b/modules/secuvad/secuvad_response.php @@ -0,0 +1,95 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/************************************************************************************************************************* + +Script destiner à traiter les analyses de secuvad qui ne sont pas renvoyées immédiatement (status 'en attente' ou erreur). + +*************************************************************************************************************************/ + +include_once(dirname(__FILE__).'/../../config/config.inc.php'); +include_once(dirname(__FILE__).'/secuvad.php'); + +if (!Tools::isSubmit('transaction_report')) + exit; + +$secuvad = new Secuvad(); + +if (in_array($secuvad->getRemoteIPaddress(), $secuvad->get_secuvad_ip())) +{ + $rep = stripslashes(urldecode(Tools::getValue('transaction_report'))); + if (preg_match('#([0-9]*)<.score>([^<]*)([^<]*)<.error><.transaction_report>#Ui', $rep, $regs)) + { + $rep = preg_replace('#'.$regs[2].'<.score>'.$regs[3].''.$regs[4].'<.error><.transaction_report>#Ui', '', $rep); + $idtransaction = $regs[1]; + $score = $regs[2]; + $advice = $regs[3]; + $erreur = $regs[4]; + + if (!empty($erreur)) + { + $secuvad->secuvad_log('secuvad_response.php '."\n\t".' Error: '.$erreur); + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `secuvad_status` = 4, `error` = '.pSQL($erreur).' + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + } + else + { + $secuvad->secuvad_log('secuvad_response.php '."\n\t".' Response: '.$rep); + + if (preg_match('/[0-9]+/Ui', $score)) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `secuvad_status` = 5, `score` = '.(int)($score).' + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + else + { + if (strtoupper($advice) == 'INVALIDE') + $secuvad_status = 3; + elseif (strtoupper($advice) == 'VALIDE') + $secuvad_status = 1; + elseif (strtoupper($advice) == 'A EXPERTISER') + $secuvad_status = 7; + elseif (strtoupper($advice) == 'A EXPERTISER C') + $secuvad_status = 6; + elseif (strtoupper($advice) == 'EN ATTENTE') + $secuvad_status = 2; + else + $secuvad_status = 4; + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'secuvad_order` + SET `secuvad_status` = '.(int)($secuvad_status).', `advice` = \''.pSQL($advice).'\' + WHERE `id_secuvad_order` = '.(int)($idtransaction)); + } + } + } + if(preg_match('#([^<]*)<.global_report>([^<]+)<.error><.bulk_report>#Ui', $rep, $regs)) + $secuvad->secuvad_log('secuvad_response.php '."\n\t".' Error '.$regs[2]); +} + + diff --git a/modules/sekeywords/config.xml b/modules/sekeywords/config.xml new file mode 100755 index 000000000..a2bd2a5f1 --- /dev/null +++ b/modules/sekeywords/config.xml @@ -0,0 +1,12 @@ + + + sekeywords + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/sekeywords/de.php b/modules/sekeywords/de.php new file mode 100644 index 000000000..7ac16172d --- /dev/null +++ b/modules/sekeywords/de.php @@ -0,0 +1,26 @@ +sekeywords_65b0b42febc8ea16db4652eab6f420a4'] = 'Suchmaschinen-Keywords'; +$_MODULE['<{sekeywords}prestashop>sekeywords_de13be6263895a5efe4d51e15ab1535e'] = 'Anzeigen, durch welche Keywords Besucher Ihre Webseite gefunden haben'; +$_MODULE['<{sekeywords}prestashop>sekeywords_a6a5cc2d3979e54597c79a68448adee2'] = 'Keyword, das Ihrer Abfrage entspricht.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_abc9f128fb01c8504e08e77bfc8af795'] = 'Keywords, die Ihrer Abfrage entsprechen.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_867343577fa1f33caa632a19543bd252'] = 'Keywords'; +$_MODULE['<{sekeywords}prestashop>sekeywords_e52e6aa1a43a0187e44f048f658db5f9'] = 'Vorkommen'; +$_MODULE['<{sekeywords}prestashop>sekeywords_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{sekeywords}prestashop>sekeywords_0849140171616600e8f2c35f0a225212'] = 'Filtern nach Keyword'; +$_MODULE['<{sekeywords}prestashop>sekeywords_188ef1f71ff3ef1c5501dc5c8ee27f88'] = 'und Mindestvorkommen'; +$_MODULE['<{sekeywords}prestashop>sekeywords_03e0e9ef8b776b5f7bcc590e51bfa63b'] = 'Anwenden'; +$_MODULE['<{sekeywords}prestashop>sekeywords_7b48f6cc4a1dde7fca9597e717c2465f'] = 'Keine Keywords'; +$_MODULE['<{sekeywords}prestashop>sekeywords_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{sekeywords}prestashop>sekeywords_39f040a1f174811285297763fcaada12'] = 'Externe Suchmaschinen-Keywords identifizieren'; +$_MODULE['<{sekeywords}prestashop>sekeywords_f4e8acc0e0cfc0653d6354c3ef878d29'] = 'Es gibt viele Möglichkeiten, eine Webseite zu finden, aber eine der häufigsten ist es, sie mit einer Suchmaschine zu finden. Die Ermittlung der Keywords, die die meisten Besucher anlocken, ist daher von großer Bedeutung. Dadurch können Sie erkennen, welches Produkt Sie hervorheben müssen, um mehr Besucher und Kunden zu haben.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_359f9e79e746fa9f684e5cda9e60ca2e'] = 'Wie funktioniert das?'; +$_MODULE['<{sekeywords}prestashop>sekeywords_b20af255c34d0a4ace56863dbd8f0c90'] = 'Wenn ein Besucher auf Ihre Webseite kommt, kennt der Server ihre davorige Seite. Dieses Modul analysiert diese URL und findet die in ihr enthaltenen Keywords. Derzeit verwaltet es die folgende Suchmaschinen:'; +$_MODULE['<{sekeywords}prestashop>sekeywords_be5d5d37542d75f93a87094459f76678'] = 'und'; +$_MODULE['<{sekeywords}prestashop>sekeywords_474c03326cba5cb2ce6c07ddf3e1e656'] = 'Bald wird es möglich sein, eine neue Suchmaschine dynamisch hinzufügen und zu diesem Modul beizutragen!'; +$_MODULE['<{sekeywords}prestashop>sekeywords_8d01ac22a68176ddd7067da99508751d'] = '10 erste Keywords'; +$_MODULE['<{sekeywords}prestashop>sekeywords_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Weitere'; + +?> \ No newline at end of file diff --git a/modules/sekeywords/en.php b/modules/sekeywords/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/sekeywords/en.php @@ -0,0 +1,4 @@ +sekeywords_65b0b42febc8ea16db4652eab6f420a4'] = 'Palabras clave en el motor de búsqueda'; +$_MODULE['<{sekeywords}prestashop>sekeywords_de13be6263895a5efe4d51e15ab1535e'] = 'Mostrar qué palabras claves han llevado visitantes a su tienda'; +$_MODULE['<{sekeywords}prestashop>sekeywords_a6a5cc2d3979e54597c79a68448adee2'] = 'palabra clave encontrada para su búsqueda.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_abc9f128fb01c8504e08e77bfc8af795'] = 'palabras clave encontrada para su búsqueda.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_867343577fa1f33caa632a19543bd252'] = 'Palabras clave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_e52e6aa1a43a0187e44f048f658db5f9'] = 'Frecuencia'; +$_MODULE['<{sekeywords}prestashop>sekeywords_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{sekeywords}prestashop>sekeywords_0849140171616600e8f2c35f0a225212'] = 'Filtrar por palabra clave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_188ef1f71ff3ef1c5501dc5c8ee27f88'] = 'y un mínimo de incidencias'; +$_MODULE['<{sekeywords}prestashop>sekeywords_03e0e9ef8b776b5f7bcc590e51bfa63b'] = 'Aplicar'; +$_MODULE['<{sekeywords}prestashop>sekeywords_7b48f6cc4a1dde7fca9597e717c2465f'] = 'No hay palabras clave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{sekeywords}prestashop>sekeywords_39f040a1f174811285297763fcaada12'] = 'Identifique las palabras claves externas en los motores de la búsqueda'; +$_MODULE['<{sekeywords}prestashop>sekeywords_f4e8acc0e0cfc0653d6354c3ef878d29'] = 'Hay muchas maneras de encontrar una Web, pero una de las más comunes es encontrarla con un buscador. Identificar la mayoría de las palabras claves incorporadas por sus nuevos visitantes es realmente importante, ya que le permite ver qué producto debe poner en valor si quiere más visitantes y clientes.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_359f9e79e746fa9f684e5cda9e60ca2e'] = '¿Cómo funciona?'; +$_MODULE['<{sekeywords}prestashop>sekeywords_b20af255c34d0a4ace56863dbd8f0c90'] = 'Cuando un visitante accede a un sitio Web, el servidor conoce la dirección del sitio anterior. Este módulo analiza la dirección e identifica las palabras claves incluidas en el mismo.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_be5d5d37542d75f93a87094459f76678'] = 'y'; +$_MODULE['<{sekeywords}prestashop>sekeywords_474c03326cba5cb2ce6c07ddf3e1e656'] = '¡Pronto será posible agregar dinámicamente un nuevo motor de búsqueda y colaborar en este módulo!'; +$_MODULE['<{sekeywords}prestashop>sekeywords_8d01ac22a68176ddd7067da99508751d'] = '10 primeras palabras clave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Otros'; diff --git a/modules/sekeywords/fr.php b/modules/sekeywords/fr.php new file mode 100644 index 000000000..b134c9cf1 --- /dev/null +++ b/modules/sekeywords/fr.php @@ -0,0 +1,24 @@ +sekeywords_65b0b42febc8ea16db4652eab6f420a4'] = 'Mots clés'; +$_MODULE['<{sekeywords}prestashop>sekeywords_de13be6263895a5efe4d51e15ab1535e'] = 'Affiche les mots clés qui ont mené les visiteurs jusqu\'à votre boutique'; +$_MODULE['<{sekeywords}prestashop>sekeywords_a6a5cc2d3979e54597c79a68448adee2'] = 'mot clé trouvé pour votre recherche.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_abc9f128fb01c8504e08e77bfc8af795'] = 'mots clés trouvés pour votre recherche.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_867343577fa1f33caa632a19543bd252'] = 'mots clés'; +$_MODULE['<{sekeywords}prestashop>sekeywords_e52e6aa1a43a0187e44f048f658db5f9'] = 'Occurences'; +$_MODULE['<{sekeywords}prestashop>sekeywords_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV '; +$_MODULE['<{sekeywords}prestashop>sekeywords_0849140171616600e8f2c35f0a225212'] = 'Filter par mot clé'; +$_MODULE['<{sekeywords}prestashop>sekeywords_188ef1f71ff3ef1c5501dc5c8ee27f88'] = 'et minimum d\'occurences'; +$_MODULE['<{sekeywords}prestashop>sekeywords_03e0e9ef8b776b5f7bcc590e51bfa63b'] = 'Appliquer'; +$_MODULE['<{sekeywords}prestashop>sekeywords_7b48f6cc4a1dde7fca9597e717c2465f'] = 'Aucun mot clé'; +$_MODULE['<{sekeywords}prestashop>sekeywords_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{sekeywords}prestashop>sekeywords_39f040a1f174811285297763fcaada12'] = 'Identifier des mots de moteurs de recherche externes'; +$_MODULE['<{sekeywords}prestashop>sekeywords_f4e8acc0e0cfc0653d6354c3ef878d29'] = 'Il y a de nombreux moyens pour accéder à un site internet, mais l\'un des plus courants est de passer par un moteur de recherche. Identifier les mots clés qui amènent le plus de visiteurs est donc très important car cela vous permet de connaître les produits que vous devez mettre en avant afin d\'attirer toujours plus de visiteurs et donc de clients potentiels.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_359f9e79e746fa9f684e5cda9e60ca2e'] = 'Comment ça marche ?'; +$_MODULE['<{sekeywords}prestashop>sekeywords_b20af255c34d0a4ace56863dbd8f0c90'] = 'Quand un visiteur accède à un site internet, le serveur connaît l\'adresse du site précédent. Ce module analyse l\'adresse et identifie les mots clés inclus. Actuellement, il gère les moteurs suivants :'; +$_MODULE['<{sekeywords}prestashop>sekeywords_be5d5d37542d75f93a87094459f76678'] = 'et'; +$_MODULE['<{sekeywords}prestashop>sekeywords_474c03326cba5cb2ce6c07ddf3e1e656'] = 'Bientôt il sera possible d\'ajouter dynamiquement de nouveaux moteurs de recherche à cette liste et ainsi contribuer au développement du module !'; +$_MODULE['<{sekeywords}prestashop>sekeywords_8d01ac22a68176ddd7067da99508751d'] = '10 premiers mots clés'; +$_MODULE['<{sekeywords}prestashop>sekeywords_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Autres'; diff --git a/modules/sekeywords/it.php b/modules/sekeywords/it.php new file mode 100644 index 000000000..d12caeec2 --- /dev/null +++ b/modules/sekeywords/it.php @@ -0,0 +1,26 @@ +sekeywords_65b0b42febc8ea16db4652eab6f420a4'] = 'parole chiave dei motori di ricerca'; +$_MODULE['<{sekeywords}prestashop>sekeywords_de13be6263895a5efe4d51e15ab1535e'] = 'Visualizza le parole chiave che hanno portato i visitatori del tuo sito web'; +$_MODULE['<{sekeywords}prestashop>sekeywords_a6a5cc2d3979e54597c79a68448adee2'] = 'parola chiave corrisponde alla tua ricerca.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_abc9f128fb01c8504e08e77bfc8af795'] = 'parole chiave corrispondono alla tua ricerca.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_867343577fa1f33caa632a19543bd252'] = 'Parole chiave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_e52e6aa1a43a0187e44f048f658db5f9'] = 'Occorrenze'; +$_MODULE['<{sekeywords}prestashop>sekeywords_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{sekeywords}prestashop>sekeywords_0849140171616600e8f2c35f0a225212'] = 'Filtra per parole chiave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_188ef1f71ff3ef1c5501dc5c8ee27f88'] = 'e min. di occorrenze'; +$_MODULE['<{sekeywords}prestashop>sekeywords_03e0e9ef8b776b5f7bcc590e51bfa63b'] = 'Applica'; +$_MODULE['<{sekeywords}prestashop>sekeywords_7b48f6cc4a1dde7fca9597e717c2465f'] = 'Nessuna parola chiave'; +$_MODULE['<{sekeywords}prestashop>sekeywords_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{sekeywords}prestashop>sekeywords_39f040a1f174811285297763fcaada12'] = 'Identifica parole chiave motori di ricerca estenri'; +$_MODULE['<{sekeywords}prestashop>sekeywords_f4e8acc0e0cfc0653d6354c3ef878d29'] = 'Ci sono molti modi per trovare un sito web, ma uno dei più comuni è quello di trovarlo con un motore di ricerca. Identificare la maggior parte delle parole chiave \"visitatore-making\" inserite dai nuovi visitatori è molto importante, ti permette di vedere quale prodotto mettere in vista se vuoi più visitatori e clienti.'; +$_MODULE['<{sekeywords}prestashop>sekeywords_359f9e79e746fa9f684e5cda9e60ca2e'] = 'Come funziona?'; +$_MODULE['<{sekeywords}prestashop>sekeywords_b20af255c34d0a4ace56863dbd8f0c90'] = 'Quando un visitatore arriva al tuo sito web, il server conosce la sua posizione precedente. Questo modulo analizza l\'URL e trova le parole chiave in esso. Attualmente, gestisce i seguenti motori di ricerca:'; +$_MODULE['<{sekeywords}prestashop>sekeywords_be5d5d37542d75f93a87094459f76678'] = 'e'; +$_MODULE['<{sekeywords}prestashop>sekeywords_474c03326cba5cb2ce6c07ddf3e1e656'] = 'Presto sarà possibile aggiungere dinamicamente un nuovo motore di ricerca e contribuire a questo modulo!'; +$_MODULE['<{sekeywords}prestashop>sekeywords_8d01ac22a68176ddd7067da99508751d'] = 'Le prime 10 parole chiave '; +$_MODULE['<{sekeywords}prestashop>sekeywords_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Altri'; + +?> \ No newline at end of file diff --git a/modules/sekeywords/logo.gif b/modules/sekeywords/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5dd1e7b247369a3f7394fd079fee02bbc954fc9 GIT binary patch literal 1013 zcmZ?wbhEHb6krfw_|57n&Tt@98);%IN-2yKCVs8E7UK3@UCu+D)(es{a z95`Jue1=B!Y|Xg&Rxt}~lIQ9t&o@k+Z?t|jZ+m8<-StN8 zTN4cK&M>;a(DK}5ha)qBkIf0cFvI!k0ury(w|&3f_55}R$c}w= zB>&aXvhPn)zdfw~_N4mzle%dK8>Sy>nsKOk-qDVQ$GVoD=v{GY!m85~*PflS;oP+A z`}^)4oBsNA_qz)dKi}$pdVb;8hfUufwSIrv@cn7y_oq!io_GFu-uwG~>-T5#f4rRX z^Yy%+Zx;T1wffh)HNW0%`0;YjulKwEd|mhZW^M89dJO$Y2X$GI$ zvQs&YQ(l~_@QWvNG1n|5hgU5D6303v6@5(ter$AW;c2s+cSLd#%c)jDzNj-29m*4A zH6;x~CNLzOW@q6kJmC1~u#>o6^p+I|9wi>ImuYw+^D;4oX}XAp&jgJ`)g}hnlBN#{ zLC+ee=|rrXv*MED!B|_DNfRP3DjZ~F7Fbabp-|vHPa`LyLNOwNxw$bp>q5szSH(sK J7G@>}YXFIfOm_eP literal 0 HcmV?d00001 diff --git a/modules/sekeywords/sekeywords.php b/modules/sekeywords/sekeywords.php new file mode 100644 index 000000000..b54d7bfcf --- /dev/null +++ b/modules/sekeywords/sekeywords.php @@ -0,0 +1,200 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class SEKeywords extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + + public function __construct() + { + $this->name = 'sekeywords'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->_query = 'SELECT `keyword`, COUNT(TRIM(`keyword`)) as occurences + FROM `'._DB_PREFIX_.'sekeyword` + WHERE '.(Configuration::get('SEK_FILTER_KW') == '' ? '1' : '`keyword` REGEXP \''.pSQL(Configuration::get('SEK_FILTER_KW')).'\'') + .$this->sqlShopRestriction(). + 'AND `date_add` BETWEEN '; + + $this->_query2 = 'GROUP BY TRIM(`keyword`) + HAVING occurences > '.(int)Configuration::get('SEK_MIN_OCCURENCES').' + ORDER BY occurences DESC'; + + $this->displayName = $this->l('Search engine keywords'); + $this->description = $this->l('Display which keywords have led visitors to your website.'); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('top') OR !$this->registerHook('AdminStatsModules')) + return false; + Configuration::updateValue('SEK_MIN_OCCURENCES', 1); + Configuration::updateValue('SEK_FILTER_KW', ''); + return Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'sekeyword` ( + id_sekeyword INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_shop INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + id_group_shop INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + keyword VARCHAR(256) NOT NULL, + date_add DATETIME NOT NULL, + PRIMARY KEY(id_sekeyword) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); + } + + public function uninstall() + { + if (!parent::uninstall()) + return false; + return (Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'sekeyword`')); + } + + public function hookTop($params) + { + if (!isset($_SERVER['HTTP_REFERER']) OR strstr($_SERVER['HTTP_REFERER'], Tools::getHttpHost(false, false))) + return; + + if ($keywords = $this->getKeywords($_SERVER['HTTP_REFERER'])) + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'sekeyword` (`keyword`, `date_add`, `id_shop`, `id_group_shop`) + VALUES (\''.pSQL(Tools::strtolower(trim($keywords))).'\', NOW(), '.$this->shopID.', '.$this->shopGroupID.')'); + } + + public function hookAdminStatsModules() + { + if (Tools::isSubmit('submitSEK')) + { + Configuration::updateValue('SEK_FILTER_KW', trim(Tools::getValue('SEK_FILTER_KW'))); + Configuration::updateValue('SEK_MIN_OCCURENCES', (int)Tools::getValue('SEK_MIN_OCCURENCES')); + Tools::redirectAdmin('index.php?tab=AdminStats&token='.Tools::getValue('token').'&module='.$this->name); + } + + if (Tools::getValue('export')) + $this->csvExport(array('type' => 'pie')); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.ModuleGraph::getDateBetween().$this->_query2); + $total = count($result); + $this->_html = '
    '.$this->displayName.' + '.$total.' '.($total == 1 ? $this->l('keyword matches your query.') : $this->l('keywords match your query.')).'
     
    '; + if ($result AND $total) + { + $table = ' +
    + + + + + '; + foreach ($result as $index => $row) + { + $keyword =& $row['keyword']; + $occurences =& $row['occurences']; + $table .= ''; + } + $table .= '
    '.$this->l('Keywords').''.$this->l('Occurrences').'
    '.$keyword.''.$occurences.'
    '; + $this->_html .= '
    '.$this->engine(array('type' => 'pie')).'
    +
    +

    '.$this->l('CSV Export').'


    +
    + '.$this->l('Filter by keyword').' + '.$this->l('and min occurrences').' + +
    +
    '.$table; + } + else + $this->_html .= '

    '.$this->l('No keywords').'

    '; + + $this->_html .= '

    +
    '.$this->l('Guide').' +

    '.$this->l('Identify external search engines\' keywords').'

    +

    '.$this->l('One of the most common ways of finding a website through a search engine. Identifying the most popular keywords entered by your new visitors allows you to see which products you should put in front if you want to attract more visitors and potential customers.').'


    +

    '.$this->l('How does it work?').'

    +

    '.$this->l('When a visitor comes to your website, the server notes their previous location. This module parses the URL and finds the keywords in it. Currently, it manages the following search engines:').' Google, AOL, Yandex, Ask, NHL, Yahoo, Baidu, Lycos, Exalead, Live, Voila '.$this->l('and').' Altavista. '.$this->l('Soon it will be possible to dynamically add new search engines and contribute to this module.').'


    +
    '; + return $this->_html; + } + + public function getKeywords($url) + { + if (!Validate::isAbsoluteUrl($url)) + return false; + + $parsedUrl = parse_url($url); + if (!isset($parsedUrl['query']) && isset($parsedUrl['fragment'])) + $parsedUrl['query'] = $parsedUrl['fragment']; + if (!isset($parsedUrl['query'])) + return false; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `server`, `getvar` FROM `'._DB_PREFIX_.'search_engine`'); + foreach ($result as $index => $row) + { + $host =& $row['server']; + $varname =& $row['getvar']; + if (strstr($parsedUrl['host'], $host)) + { + $kArray = array(); + preg_match('/[^a-z]'.$varname.'=.+\&'.'/U', $parsedUrl['query'], $kArray); + if (!isset($kArray[0]) OR empty($kArray[0])) + preg_match('/[^a-z]'.$varname.'=.+$'.'/', $parsedUrl['query'], $kArray); + if (!isset($kArray[0]) OR empty($kArray[0])) + return false; + $kString = urldecode(str_replace('+', ' ', ltrim(substr(rtrim($kArray[0], '&'), strlen($varname) + 1), '='))); + return $kString; + } + } + } + + protected function getData($layers) + { + $this->_titles['main'] = $this->l('10 first keywords'); + $totalResult = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + $total = 0; + $total2 = 0; + foreach ($totalResult as $totalRow) + $total += $totalRow['occurences']; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2.' LIMIT 9'); + foreach ($result as $row) + { + $this->_legend[] = $row['keyword']; + $this->_values[] = $row['occurences']; + $total2 += $row['occurences']; + } + if ($total >= $total2) + { + $this->_legend[] = $this->l('Others'); + $this->_values[] = $total - $total2; + } + } +} \ No newline at end of file diff --git a/modules/sendtoafriend/config.xml b/modules/sendtoafriend/config.xml new file mode 100755 index 000000000..e74dd4f73 --- /dev/null +++ b/modules/sendtoafriend/config.xml @@ -0,0 +1,12 @@ + + + sendtoafriend + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/sendtoafriend/de.php b/modules/sendtoafriend/de.php new file mode 100644 index 000000000..52ba662a0 --- /dev/null +++ b/modules/sendtoafriend/de.php @@ -0,0 +1,23 @@ +product_page_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'An einen Freund senden'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'An einen Freund senden'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_20589174124c25654cac3736e737d2a3'] = 'Senden Sie diese Seite einem Freund, der an diesem Artiekl interessiert sein könnte.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_b31afdfa73c89b567778f15180c2dd6c'] = 'Ihre Email wurde erfolgreich versendet'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_cc5fd9b9f1cad59fcff97a1f21f34304'] = 'Senden Sie eine Nachricht'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_19d305aea0ccec77d23362111ebdb6b4'] = 'Name des Freundes:'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_7ae8a9a7a5d8fa40d4515fc52f16bb2e'] = 'E-Mail des Freundes:'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2541d938b0a58946090d7abdde0d3890'] = 'senden'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_68728c1897e5936032fe21ffb6b10c2e'] = 'Zurück zur Produktseite'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2074615eb70699e55b1f9289c6c77c25'] = 'An einen Freund senden-Modul'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_3234e2609dd694d8763c390fe97eba04'] = 'Ermöglicht den Kunden, einen Produktlink an einen Freund zu senden'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_666f6333e43c215212b916fef3d94af0'] = 'Sie müssen alle Felder ausfüllen.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ed95f7e7c4691956e0d6f2cd0136d483'] = 'Die E-Mail Ihres Freunds ist ungültig.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_0e2a8a9d9c363a1ed93e7822eb3fc0ca'] = 'Der Name Ihres Freundes ist ungültig.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_98db77c121d8acdba66ec89626ae896c'] = 'Ein Fehler trat während des Prozesses auf.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_22c4733a9ceb239bf825a0cecd1cfaec'] = 'Ein Freund'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ffa719e6b8863717a9e86579249c7d9b'] = 'hat Ihnen einen Link zu geschickt'; + +?> \ No newline at end of file diff --git a/modules/sendtoafriend/en.php b/modules/sendtoafriend/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/sendtoafriend/en.php @@ -0,0 +1,4 @@ +product_page_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'Enviar a un amigo'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2074615eb70699e55b1f9289c6c77c25'] = 'Módulo enviar a un amigo'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_3234e2609dd694d8763c390fe97eba04'] = 'Permitir a los clientes enviar un enlace del producto a un amigo'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_666f6333e43c215212b916fef3d94af0'] = 'Debe rellenar todos los campos.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ed95f7e7c4691956e0d6f2cd0136d483'] = 'El email de su amigo no es correcto'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_0e2a8a9d9c363a1ed93e7822eb3fc0ca'] = 'El nombre de su amigo no es correcto'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_98db77c121d8acdba66ec89626ae896c'] = 'Se ha producido un error durante el proceso.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_22c4733a9ceb239bf825a0cecd1cfaec'] = 'Un amigo'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ffa719e6b8863717a9e86579249c7d9b'] = 'te ha enviado un enlace a'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'Enviar a un amigo'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_20589174124c25654cac3736e737d2a3'] = 'Enviar esta página a un amigo al que podía interesarle este artículo.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_b31afdfa73c89b567778f15180c2dd6c'] = 'Su email ha sido enviado con éxito'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_cc5fd9b9f1cad59fcff97a1f21f34304'] = 'Enviar un mensaje'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_19d305aea0ccec77d23362111ebdb6b4'] = 'nombre del amigo:'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_7ae8a9a7a5d8fa40d4515fc52f16bb2e'] = 'Email del amigo:'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2541d938b0a58946090d7abdde0d3890'] = 'enviar'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_68728c1897e5936032fe21ffb6b10c2e'] = 'Volver a la página del producto'; diff --git a/modules/sendtoafriend/fr.php b/modules/sendtoafriend/fr.php new file mode 100644 index 000000000..5cbfbf9c0 --- /dev/null +++ b/modules/sendtoafriend/fr.php @@ -0,0 +1,21 @@ +product_page_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'Envoyer à un ami'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2074615eb70699e55b1f9289c6c77c25'] = 'Module envoyer à un ami'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_3234e2609dd694d8763c390fe97eba04'] = 'Permet à vos clients d\'envoyer des liens à leurs amis'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_666f6333e43c215212b916fef3d94af0'] = 'Vous devez remplir tous les champs.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ed95f7e7c4691956e0d6f2cd0136d483'] = 'L\'email de votre ami est invalide.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_0e2a8a9d9c363a1ed93e7822eb3fc0ca'] = 'Le nom de votre ami est invalide.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_98db77c121d8acdba66ec89626ae896c'] = 'Une erreur est survenue durant le processus.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_22c4733a9ceb239bf825a0cecd1cfaec'] = 'Un ami'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ffa719e6b8863717a9e86579249c7d9b'] = 'vous a envoyé un lien pour'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'Envoyer à un ami'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_20589174124c25654cac3736e737d2a3'] = 'Envoyer cette page à un ami susceptible d\'être intéressé par le produit ci-dessous'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_b31afdfa73c89b567778f15180c2dd6c'] = 'Votre email a bien été envoyé'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_cc5fd9b9f1cad59fcff97a1f21f34304'] = 'Envoyer un message'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_19d305aea0ccec77d23362111ebdb6b4'] = 'Nom de votre ami :'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_7ae8a9a7a5d8fa40d4515fc52f16bb2e'] = 'Email de votre ami :'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2541d938b0a58946090d7abdde0d3890'] = 'Envoyer'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_68728c1897e5936032fe21ffb6b10c2e'] = 'Retour à la fiche produit'; diff --git a/modules/sendtoafriend/it.php b/modules/sendtoafriend/it.php new file mode 100644 index 000000000..b970e626d --- /dev/null +++ b/modules/sendtoafriend/it.php @@ -0,0 +1,23 @@ +product_page_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'Invia ad un amico'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2107f6398c37b4b9ee1e1b5afb5d3b2a'] = 'Invia ad un amico'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_20589174124c25654cac3736e737d2a3'] = 'Invia questa pagina ad un amico che potrebbe essere interessato all\'articolo seguente.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_b31afdfa73c89b567778f15180c2dd6c'] = 'La tua mail è stata inviata con successo'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_cc5fd9b9f1cad59fcff97a1f21f34304'] = 'Invia un messaggio'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_19d305aea0ccec77d23362111ebdb6b4'] = 'Nome dell\'amico:'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_7ae8a9a7a5d8fa40d4515fc52f16bb2e'] = 'E-mail del tuo amico:'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2541d938b0a58946090d7abdde0d3890'] = 'invia'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_68728c1897e5936032fe21ffb6b10c2e'] = 'Torna alla pagina del prodotto'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_2074615eb70699e55b1f9289c6c77c25'] = 'Modulo Invia ad un amico'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_3234e2609dd694d8763c390fe97eba04'] = 'Consente ai clienti di inviare un link prodotto a un amico'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_666f6333e43c215212b916fef3d94af0'] = 'È necessario compilare tutti i campi.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ed95f7e7c4691956e0d6f2cd0136d483'] = 'E-mail del tuo amico non valida.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_0e2a8a9d9c363a1ed93e7822eb3fc0ca'] = 'Nome del tuo amico non valido.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_98db77c121d8acdba66ec89626ae896c'] = 'Errore durante il processo.'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_22c4733a9ceb239bf825a0cecd1cfaec'] = 'Un amico'; +$_MODULE['<{sendtoafriend}prestashop>sendtoafriend_ffa719e6b8863717a9e86579249c7d9b'] = 'ti ha inviato un link a'; + +?> \ No newline at end of file diff --git a/modules/sendtoafriend/logo.gif b/modules/sendtoafriend/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c31836bf745a58f7780ac75639d67a2afcf36e1 GIT binary patch literal 633 zcmV-<0*3uZNk%w1VGsZi0OkMyKte=WdC${?HDHxrxwgCe`udMrK*XSW*4WijW`K!~ zleNO!w~lLle0F-vX>xLMPhDu8ot@jhrihb#=f9EPqaucQR)?O-Gj7R>xpk`8oOsD; zbcw*?n^D8V!}sdlg@uJxulVDzfIxAzlX-2-%*>K_UG>zj#*#{JuWU<8Ov$;YosMqh ztutk7Z^Nc`xulMya#Wc9taAI%pz6z}o|KQ9vfQ!P z{c^77`1tsmX-j^KbgP7L#jAqV%f(1gTGgB|=;-L*mP%lKU{`#PW@cuDzJaKHVfM(3 zTXeROTtei}wW^VQp3r-Bg>u%Vd*!7Vi;0KUqjJNSYkRGCrg=c-w`9z#lDxdU-QC^I zzNm`Cb$o?;|NsA!latQV(`ssLg3E7EP*9kSg7L(am0?6_kZ0V(tmmJEyJSv$eO58DRCG8v8Ywq|3=*NET+?U{ z4g*Q2SvxRT5e*q)V-X-q<75{kCS^!q9%EGq_+@HjJp#~pU?z?VCS~d{Q31k3odr;Q zECFFAgq$xWJj_u6!~+NcUVhAQVI~0p0BO>kZ1|wV5F0fhD3CFy%!3DI=G0{J!3_rt TBaFm3bB4!?n`h#H2?PK;l<+sI literal 0 HcmV?d00001 diff --git a/modules/sendtoafriend/mails/de/send_to_a_friend.html b/modules/sendtoafriend/mails/de/send_to_a_friend.html new file mode 100644 index 000000000..77962ff31 --- /dev/null +++ b/modules/sendtoafriend/mails/de/send_to_a_friend.html @@ -0,0 +1,40 @@ + + + + + Nachricht von {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Hallo {name},
     
    {customer} hat Ihnen einen Link zu dem Produkt gesandt, das Sie interessieren könnte.
     
    Klicken Sie hier, um den Artikel zu sehen: {product}
     
    {shop_name} powered with PrestaShop™
    + + \ No newline at end of file diff --git a/modules/sendtoafriend/mails/de/send_to_a_friend.txt b/modules/sendtoafriend/mails/de/send_to_a_friend.txt new file mode 100644 index 000000000..402660973 --- /dev/null +++ b/modules/sendtoafriend/mails/de/send_to_a_friend.txt @@ -0,0 +1,13 @@ +Hallo {name}, + + +{customer} hat Ihnen einen Link zu dem Produkt gesandt, das Sie interessieren könnte. + +{product}: {product_link} + + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/sendtoafriend/mails/en/send_to_a_friend.html b/modules/sendtoafriend/mails/en/send_to_a_friend.html new file mode 100644 index 000000000..e77dbab53 --- /dev/null +++ b/modules/sendtoafriend/mails/en/send_to_a_friend.html @@ -0,0 +1,36 @@ + + + + + Message from {shop_name} + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Hi {name},
     
    {customer} has sent you a link to a product that (s)he thinks may interest you.
     
    + Click here to view this item: {product} +
     
    + {shop_name} powered with PrestaShop™ +
    + + diff --git a/modules/sendtoafriend/mails/en/send_to_a_friend.txt b/modules/sendtoafriend/mails/en/send_to_a_friend.txt new file mode 100644 index 000000000..6ee66b52d --- /dev/null +++ b/modules/sendtoafriend/mails/en/send_to_a_friend.txt @@ -0,0 +1,13 @@ +Hi {name}, + + +{customer} has sent you a link to a product that (s)he thinks may interest you. + +{product}: {product_link} + + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/sendtoafriend/mails/es/send_to_a_friend.html b/modules/sendtoafriend/mails/es/send_to_a_friend.html new file mode 100644 index 000000000..b5398b635 --- /dev/null +++ b/modules/sendtoafriend/mails/es/send_to_a_friend.html @@ -0,0 +1,41 @@ + + + + + Mensaje de {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
     
    Hola {name},
     
    {customer} te ha enviado un vínculo a un producto que él piensa que pueden interesarle.
     
    Haga clic aquí para ver este artículo: {product}
     
    {shop_name} desarrollado por PrestaShop™
    + + + \ No newline at end of file diff --git a/modules/sendtoafriend/mails/es/send_to_a_friend.txt b/modules/sendtoafriend/mails/es/send_to_a_friend.txt new file mode 100644 index 000000000..8bc058eea --- /dev/null +++ b/modules/sendtoafriend/mails/es/send_to_a_friend.txt @@ -0,0 +1,13 @@ +Hola {name}, + + +{customer} te ha enviado un vínculo a un producto que él piensa que pueden interesarle. + +{product}: {product_link} + + +{shop_name} - {shop_url} + + + +{shop_url} desarrollado por PrestaShop™ \ No newline at end of file diff --git a/modules/sendtoafriend/mails/fr/send_to_a_friend.html b/modules/sendtoafriend/mails/fr/send_to_a_friend.html new file mode 100644 index 000000000..8cdc2033b --- /dev/null +++ b/modules/sendtoafriend/mails/fr/send_to_a_friend.html @@ -0,0 +1,36 @@ + + + + + Message depuis {shop_name} + + + + + + + + + + + + + + + + + + + + + + +
    + {shop_name} +
     
    Bonjour {name},
     
    {customer} vous envoie un lien vers un produit qui pourrait vous intéresser.
     
    + Il s'agit de {product} +
     
    + {shop_name} réalisé avec PrestaShop™ +
    + + diff --git a/modules/sendtoafriend/mails/fr/send_to_a_friend.txt b/modules/sendtoafriend/mails/fr/send_to_a_friend.txt new file mode 100644 index 000000000..8959567c0 --- /dev/null +++ b/modules/sendtoafriend/mails/fr/send_to_a_friend.txt @@ -0,0 +1,13 @@ +Bonjour {name}, + + +{customer} vous envoie un lien vers un produit qui pourrait vous intéresser. + +Il s'agit de {product} : {product_link} + + +{shop_name} - {shop_url} + + + +{shop_url} réalisé par PrestaShop™ \ No newline at end of file diff --git a/modules/sendtoafriend/mails/it/send_to_a_friend.html b/modules/sendtoafriend/mails/it/send_to_a_friend.html new file mode 100644 index 000000000..ac9348b7f --- /dev/null +++ b/modules/sendtoafriend/mails/it/send_to_a_friend.html @@ -0,0 +1,40 @@ + + + + + Messaggio da {shop_name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {shop_name}
    Salve {name},
    {customer} ti ha inviato un link per un prodotto che potrebbe interessarti.
    Clicca qui per vedere questo articolo: {product}
    {shop_name} powered with PrestaShop™
    + + \ No newline at end of file diff --git a/modules/sendtoafriend/mails/it/send_to_a_friend.txt b/modules/sendtoafriend/mails/it/send_to_a_friend.txt new file mode 100644 index 000000000..4e54dc4fe --- /dev/null +++ b/modules/sendtoafriend/mails/it/send_to_a_friend.txt @@ -0,0 +1,13 @@ +Salve {name}, + + +{customer} ti ha inviato un link per un prodotto che potrebbe interessarti. + +{product}: {product_link} + + +{shop_name} - {shop_url} + + + +{shop_url} powered by PrestaShop™ \ No newline at end of file diff --git a/modules/sendtoafriend/product_page.tpl b/modules/sendtoafriend/product_page.tpl new file mode 100644 index 000000000..f451af3f1 --- /dev/null +++ b/modules/sendtoafriend/product_page.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
  • {l s='Send to a friend' mod='sendtoafriend'}
  • diff --git a/modules/sendtoafriend/sendtoafriend-form.php b/modules/sendtoafriend/sendtoafriend-form.php new file mode 100644 index 000000000..096813363 --- /dev/null +++ b/modules/sendtoafriend/sendtoafriend-form.php @@ -0,0 +1,38 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +require_once(dirname(__FILE__).'/sendtoafriend.php'); + +$sendtoafriend = new sendToAFriend(); +if (!$sendtoafriend->active) + Tools::display404Error(); + +include(dirname(__FILE__).'/../../header.php'); +echo $sendtoafriend->displayFrontForm(); +include(dirname(__FILE__).'/../../footer.php'); + diff --git a/modules/sendtoafriend/sendtoafriend.php b/modules/sendtoafriend/sendtoafriend.php new file mode 100644 index 000000000..d339567c5 --- /dev/null +++ b/modules/sendtoafriend/sendtoafriend.php @@ -0,0 +1,130 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class sendToAFriend extends Module +{ + function __construct() + { + $this->name = 'sendtoafriend'; + $this->version = '1.1'; + $this->author = 'PrestaShop'; + $this->tab = 'front_office_features'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Send to a Friend module'); + $this->description = $this->l('Allows customers to send a product link to a friend.'); + } + + function install() + { + return (parent::install() AND $this->registerHook('extraLeft')); + } + + function hookExtraLeft($params) + { + global $smarty; + $smarty->assign('this_path', $this->_path); + return $this->display(__FILE__, 'product_page.tpl'); + } + + public function displayFrontForm() + { + global $smarty; + $error = false; + $confirm = false; + + if (isset($_POST['submitAddtoafriend'])) + { + global $cookie, $link; + /* Product informations */ + $product = new Product((int)Tools::getValue('id_product'), false, (int)$cookie->id_lang); + $productLink = $link->getProductLink($product); + + /* Fields verifications */ + if (empty($_POST['email']) OR empty($_POST['name'])) + $error = $this->l('You must fill in all fields.'); + elseif (empty($_POST['email']) OR !Validate::isEmail($_POST['email'])) + $error = $this->l('The e-mail given is invalid.'); + elseif (!Validate::isName($_POST['name'])) + $error = $this->l('The name given is invalid.'); + elseif (!isset($_GET['id_product']) OR !is_numeric($_GET['id_product'])) + $error = $this->l('An error occurred during the process.'); + else + { + /* Email generation */ + $subject = ($cookie->customer_firstname ? $cookie->customer_firstname.' '.$cookie->customer_lastname : $this->l('A friend')).' '.$this->l('sent you a link to').' '.$product->name; + $templateVars = array( + '{product}' => $product->name, + '{product_link}' => $productLink, + '{customer}' => ($cookie->customer_firstname ? $cookie->customer_firstname.' '.$cookie->customer_lastname : $this->l('A friend')), + '{name}' => Tools::safeOutput($_POST['name']) + ); + + /* Email sending */ + if (!Mail::Send((int)$cookie->id_lang, 'send_to_a_friend', Mail::l('A friend sent you a link to').' '.$product->name, $templateVars, $_POST['email'], NULL, ($cookie->email ? $cookie->email : NULL), ($cookie->customer_firstname ? $cookie->customer_firstname.' '.$cookie->customer_lastname : NULL), NULL, NULL, dirname(__FILE__).'/mails/')) + $error = $this->l('An error occurred during the process.'); + else + Tools::redirect(_MODULE_DIR_.'/'.$this->name.'/sendtoafriend-form.php?id_product='.(int)$product->id.'&submited'); + } + } + else + { + global $cookie, $link; + /* Product informations */ + $product = new Product((int)Tools::getValue('id_product'), false, (int)$cookie->id_lang); + $productLink = $link->getProductLink($product); + } + + /* Image */ + $images = $product->getImages((int)$cookie->id_lang); + foreach ($images AS $k => $image) + if ($image['cover']) + { + $cover['id_image'] = (int)$product->id.'-'.(int)$image['id_image']; + $cover['legend'] = $image['legend']; + } + + if (!isset($cover)) + $cover = array('id_image' => Language::getIsoById((int)$cookie->id_lang).'-default', 'legend' => 'No picture'); + + $smarty->assign(array( + 'cover' => $cover, + 'errors' => $error, + 'confirm' => $confirm, + 'product' => $product, + 'productLink' => $productLink + )); + + return $this->display(__FILE__, 'sendtoafriend.tpl'); + } +} + diff --git a/modules/sendtoafriend/sendtoafriend.png b/modules/sendtoafriend/sendtoafriend.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6c5d396ad024567a769d1f2285c525bef8c88b GIT binary patch literal 754 zcmV~0d>kmp9&fG9>#5EaEn(MD9Xvl47<{Rb2T3D!0$wpy4@P!Tnn zB0fxQ2!aPL_fZ@!=Wv9zmj8jnf5JO`<=MmZs@#@p z5O*{}9L5B6J+L7ORza<+9h)-B~<&cwIhUkd?cp4is-ziNrfY^u-7xdbFt=#%1534Oi8ajBBo}VZvCxd1 zTu*VtX+~P45)Om?dG5aS`PPW(%?lDPBwaz$6C^$8$_Q#plJTjpbgj;_rYi*?oK~m+ zDD`C->dkZKh0j6|Q^-0bJxIFHnHJOo$@r8{VNIUWU>31rp3@BVvYIZG2D0>Yuj2Y- zg?b?AObc>pK`oG+zkPsr3x_BTWXX8H*w}0@e;@>?SdsP&!-HMidhRn*4VkHi+<58} zTg6ae0~aSoNqRq(^;(g}0#Yiz)&q*YIg-f)mmeJA&3%nD3aJ$X-6L%1+fEQRIeTL* zS5K6|3cOaNtTtBowSZzzj!ZfM7L<|f+jtyp4ccf7mf6J$n}&ALkZlfLEYRoNvtG0Q zzJh|U~_Rdjkv}0kGt_?V}5$?sXN`N zTt|nOa)sx)IIf_-7XW**;!X9`USPjuUUsJrREk)6q*M9ZHEb zl2A!T3LBjrrTx74{FsUNcVA1zw%IWoiGNMw=s9P8>+qh!B*saR2}S literal 0 HcmV?d00001 diff --git a/modules/sendtoafriend/sendtoafriend.tpl b/modules/sendtoafriend/sendtoafriend.tpl new file mode 100644 index 000000000..79947451e --- /dev/null +++ b/modules/sendtoafriend/sendtoafriend.tpl @@ -0,0 +1,66 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Send to a friend' mod='sendtoafriend'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

    {l s='Send to a friend' mod='sendtoafriend'}

    + +

    {l s='Send this page to a friend who might be interested in the item below.' mod='sendtoafriend'}.

    +{include file="$tpl_dir./errors.tpl"} + +{if isset($smarty.get.submited)} +

    {l s='Your email has been sent successfully' mod='sendtoafriend'}

    +{else} +
    +
    +

    {l s='Send a message' mod='sendtoafriend'}

    + +

    +
    + {$product->name} +

    + +

    + + +

    +

    + + +

    + +

    + +

    +
    +
    +{/if} + + + diff --git a/modules/shopimporter/ajax.php b/modules/shopimporter/ajax.php new file mode 100644 index 000000000..db4602624 --- /dev/null +++ b/modules/shopimporter/ajax.php @@ -0,0 +1,130 @@ +supportedImports as $key => $import) + if (array_key_exists('alterTable', $import)) + $columns = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.pSQL($import['table']).'`'); + foreach ($columns as $column) + if ($column['Field'] == $import['identifier'].'_'.$moduleName) + Db::getInstance()->Execute('ALTER IGNORE TABLE `'._DB_PREFIX_.pSQL($import['table']).'` DROP `'.pSQL($import['identifier'].'_'.$moduleName).'`'); + if ($link = @mysql_connect(Tools::getValue('server'), Tools::getValue('user'), Tools::getValue('password'))) + { + if (!@mysql_select_db(Tools::getValue('database'), $link)) + die('{"hasError" : true, "error" : ["'.Tools::displayError('The database selection cannot be made.').'"]}'); + else + { + @mysql_close($link); + die('{"hasError" : false, "error" : []}'); + } + } + else + die('{"hasError" : true, "error" : ["'.Tools::displayError('Link to database cannot be established.').'"]}'); + +} + +if (Tools::isSubmit('getData') || Tools::isSubmit('syncLang') || Tools::isSubmit('syncCurrency')) +{ + if (Tools::isSubmit('syncLang')) + $save = true; + + if (file_exists('../../modules/'.$moduleName.'/'.$moduleName.'.php')) + { + require_once('../../modules/'.$moduleName.'/'.$moduleName.'.php'); + $importModule = new $moduleName(); + $importModule->server = $server; + $importModule->user = $user; + $importModule->passwd = $password; + $importModule->database = $database; + $importModule->prefix = $prefix; + if (!method_exists($importModule, $getMethod)) + die('{"hasError" : true, "error" : ["not_exist"], "datas" : []}'); + else + { + $return = call_user_func_array(array($importModule, $getMethod), array($limit, $nbr_import)); + $shopImporter = new shopImporter(); + $shopImporter->generiqueImport($className, $return, (bool)$save); + } + } +} + +if (Tools::isSubmit('truncatTable')) +{ + $shopImporter = new shopImporter(); + if ($shopImporter->truncateTable($className)) + die('{"hasError" : false, "error" : []}'); + else + die('{"hasError" : true, "error" : ["'.$className.'"]}'); + +} + +if (Tools::isSubmit('alterTable')) +{ + $shopImporter = new shopImporter(); + if ($shopImporter->alterTable($className)) + die('{"hasError" : false, "error" : []}'); + else + die('{"hasError" : true, "error" : ["'.$className.'"]}'); + +} + +if (Tools::isSubmit('displaySpecificOptions')) +{ + if (file_exists('../../modules/'.$moduleName.'/'.$moduleName.'.php')) + { + require_once('../../modules/'.$moduleName.'/'.$moduleName.'.php'); + $importModule = new $moduleName(); + $importModule->server = $server; + $importModule->user = $user; + $importModule->passwd = $password; + $importModule->database = $database; + $importModule->prefix = $prefix; + if ($link = @mysql_connect(Tools::getValue('server'), Tools::getValue('user'), Tools::getValue('password'))) + { + if(!@mysql_select_db(Tools::getValue('database'), $link)) + die(Tools::displayError('The database selection cannot be made.')); + elseif (method_exists($importModule, 'displaySpecificOptions')) + die($importModule->displaySpecificOptions()); + else + die('not_exist'); + } + else + die(Tools::displayError('Link to database cannot be established.')); + } +} +if (Tools::isSubmit('validateSpecificOptions')) +{ + if (file_exists('../../modules/'.$moduleName.'/'.$moduleName.'.php')) + { + require_once('../../modules/'.$moduleName.'/'.$moduleName.'.php'); + $importModule = new $moduleName(); + if (!method_exists($importModule, 'validateSpecificOptions')) + die('{"hasError" : true, "error" : ["not_exist"]}'); + else + die($importModule->validateSpecificOptions()); + } +} + +?> diff --git a/modules/shopimporter/config.xml b/modules/shopimporter/config.xml new file mode 100644 index 000000000..eced3ac92 --- /dev/null +++ b/modules/shopimporter/config.xml @@ -0,0 +1,12 @@ + + + shopimporter + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/shopimporter/de.php b/modules/shopimporter/de.php new file mode 100644 index 000000000..72ae7d38b --- /dev/null +++ b/modules/shopimporter/de.php @@ -0,0 +1,93 @@ +shopimporter_d714c742b360a8ecbb124c15e9a391a1'] = 'Shop Importeur'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8c0fe18034f47d7d3dd3e58098e3ffdb'] = 'Dieses Modul ermöglicht es Ihnen, Ihren Shop aus einem anderen System zu prestashop zu importieren '; +$_MODULE['<{shopimporter}prestashop>shopimporter_4994a8ffeba4ac3140beb89e8d41f174'] = 'Sprache'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a9db6adcdafc85c5830439401fd866f6'] = 'Sprachen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b8b8ca447e355455b8dc638993c41ae7'] = 'Neue Sprachen fügen automatisch Übersetzungen hinzu!'; +$_MODULE['<{shopimporter}prestashop>shopimporter_386c339d37e737a436499d423a77df0c'] = 'Währung'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4234c64201820401dfa04eeb449c1bbc'] = 'Währungen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_719fec04166d6fa75f89cd29ad61fa8c'] = 'Steuern'; +$_MODULE['<{shopimporter}prestashop>shopimporter_94c5ffc9d364127b232f58b4cfd8c88a'] = 'Steuern importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6ec25fc9cc7df7b0d1fce57923f46ec1'] = 'Steuerregeln importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3ff996fe5c77610359114835baf9b38'] = 'Zone'; +$_MODULE['<{shopimporter}prestashop>shopimporter_21d250d17e35e3e02db9f1a618bad913'] = 'Zone importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_59716c97497eb9694541f7c3d37b1a4d'] = 'Land'; +$_MODULE['<{shopimporter}prestashop>shopimporter_13eedcf49d68ce49274db71e63a7aa3d'] = 'Länder importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_46a2a41cc6e552044816a2d04634545d'] = 'Staat'; +$_MODULE['<{shopimporter}prestashop>shopimporter_118421de3201927a23bf921057e69c4a'] = 'Staaten importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_03937134cedab9078be39a77ee3a48a0'] = 'Gruppe'; +$_MODULE['<{shopimporter}prestashop>shopimporter_65ac19ad248219902394739bda0cef62'] = 'Gruppen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ce26601dac0dea138b7295f02b7620a7'] = 'Kunde'; +$_MODULE['<{shopimporter}prestashop>shopimporter_22c34564e80ce8adab6a235061d277f4'] = 'Kunden importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{shopimporter}prestashop>shopimporter_77497d022aeb4cdd78ec394ca8d223b4'] = 'Adressen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Hersteller'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ed4cbbbeb3d575ccfeb405ae5c5c4d43'] = 'Hersteller importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ec136b444eede3bc85639fac0dd06229'] = 'Zulieferer'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0ae5f9c75e6a7460ec31e33201576bd9'] = 'Zulieferer importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1db7ae20c24e257b6f1a7def365da1ad'] = 'Kategorien importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1f5a36b380c53d7f82e762baa08c2e5c'] = 'Attributgruppen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7eb915ee907703ede51dabab88fc1701'] = 'Attributgruppen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attribute'; +$_MODULE['<{shopimporter}prestashop>shopimporter_66e2d23b2d257d56af6f1d6443ce0ce3'] = 'Attribute importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_deb10517653c255364175796ace3553f'] = 'Produkt'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4bfc4a7632bae0877b798dbd9efc4f70'] = 'Produkte importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_47ac923d219501859fb68fed8c8db77b'] = 'Kombination'; +$_MODULE['<{shopimporter}prestashop>shopimporter_58e2fcec5e04716c627b3e8b9d2955b1'] = 'Produktkombinationen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3df6b363e7979ce81b71d92961fc672'] = 'Bestellstatus'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6b24bd15b10bc10de9687f16ebe728e4'] = 'Bestellstatus importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a240fa27925a635b08dc28c9e4f9216d'] = 'Bestellung'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3b7e768ebab2171baa41d5ea13017b02'] = 'Bestellungen importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_782c8b38bce4f2f6975ca7f33ac8189b'] = 'Bestellverlauf'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2931b8b1622867fcc461d7de388e319'] = 'Bestellverlauf importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_32a6deec3cca312a54d6b8769c9b8dd7'] = 'nicht in diesem Modul verfügbar'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1e411d25230ba738b9ae583bcb9b0b57'] = 'Verbindung zur Datenbank ok'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3596c777cbc8b72d678f34daabc9148b'] = 'Fehler anzeigen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_89a399eee52b2a6daaea92eba3e14cad'] = 'Importprozess testen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_bf79359f8edda6f7df97ef57a4ee09b6'] = 'Import starten'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0b5a6ead644b8ae4edb8a036334c9ed6'] = 'Beim Import sind Fehler aufgetreten. Weitere Details siehe unter \"Fehler anzeigen\"'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e905d0eb5204b761d8c0e3eebed4a0e0'] = 'Der Import ist abgeschlossen.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_596403b61367ca30d6de75812275f9cd'] = 'Daten entfernen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_edc186cbc5cc897a79312880ec16c621'] = 'Bitte wählen Sie etwas zum Importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_81b33153f65252001fe132d74b658fbe'] = 'Aus einem anderen System importieren'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd4c0c798ebbf8c6e15dcba8632f558d'] = 'Vor dem Start des Import, sichern Sie bitte eine Kopie Ihrer Datenbank. '; +$_MODULE['<{shopimporter}prestashop>shopimporter_60474e812295a5adc371de63dc62a164'] = 'Für das Backup hier klicken'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05f4be265d59ea66f3a1fb12ba103583'] = 'Wählen Sie Ihren Import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_961f2247a2070bedff9f9cd8d64e2650'] = 'Wählen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_151a0fbfcc4894aa53335091c2512de5'] = 'Kein Import-Modul installiert'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9aa1b03934893d7134a660af4204f2a9'] = 'Server'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8f9bfe9d1345237cb3b2b205864da075'] = 'Benutzer'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dc647eb65e6711e155375218212b3964'] = 'Kennwort'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e307db07b3975fef922a80d07455ee5e'] = 'Datenbank'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dac130bdd2c5492a8108a4145bd9f04a'] = 'Datenbank-Präfix'; +$_MODULE['<{shopimporter}prestashop>shopimporter_2bb4cbbf4c51025867d47131e79ad05f'] = 'Nächster Schritt'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72dd98a453e92ccc01697f29bb5dbeb9'] = 'Import-Optionen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9dfc5d5738312210c3c75e68a468691d'] = 'Advanced-Optionen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c195d4db1be0d349d21f236f0a6400ff'] = 'Dieser Modus ist gefährlich'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11e9fa925cb444a223769edd53334f13'] = 'Import für jeden'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70fda5850e8d8946a340c55bf985fd39'] = 'Wählen Sie die Vorkommenszahl für jede Import-Anfrage'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35f178a340d9aa1a080d8cfaf0b57f36'] = 'Falls Fehler auftreten'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11a755d598c0c417f9a36758c3da7481'] = 'Anhalten'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72ef2b9b6965d078e3c7f95487a82d1c'] = 'Überspringen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9eb6b78a99cdb6ffd3d40d18621d9f80'] = 'Erzwingen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05d2b3715ac0c697b86799d1989c4aeb'] = 'Anhalten: wenn die Daten fehlerhaft sind, läuft der Import nicht.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_690c3a7f595050729df99a6d30dd6f96'] = 'Überspringen: wenn die Daten fehlerhaft sind, überspringt der Import fehlerhafte Daten.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35a6535254a93c5338bff1e3572755d2'] = 'Erzwingen: wenn die Daten fehlerhaft sind, ersetzt der Import fehlerhafte Daten durch Ersatzdaten.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_09b4382d10c396e0c4fcd51064702213'] = 'Spezielle Optionen'; +$_MODULE['<{shopimporter}prestashop>shopimporter_044a8ce60a6c5a464e7a7f78698fc05d'] = 'Standardsprache stimmt nicht überein:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_807079d19357b6d44089c220f74cc2d0'] = 'Bitte ändern Sie die Standardsprache in Ihrer Konfiguration'; +$_MODULE['<{shopimporter}prestashop>shopimporter_29361e9c6917fb14b43d3e78e2811e56'] = 'Standardwährung stimmt nicht überein:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6117c4d73fcf0c20fe3946f1d00dde85'] = 'Bitte ändern Sie die Standardwährung in Ihrer Konfiguration'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8136c99d09cb6e9f0f998dd231fff6ed'] = 'Ein Fehler ist beim Hinzufügen des Objekts aufgetreten'; +$_MODULE['<{shopimporter}prestashop>shopimporter_01f8544c8fd4628bc686502e8b727d95'] = 'das Feld'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0a5fa53f3f20f67f98bd6c3b16df059d'] = 'ist erforderlich'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f755e8b92cb8f02c24f6f539180d45b1'] = 'ist zu lang'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70f4b635847038d056e33959821a7a66'] = 'max. Warenkörbe'; +$_MODULE['<{shopimporter}prestashop>shopimporter_998b344cff693ad388a14ba89b1523c7'] = 'ist ungültig'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7e47a344b06d82a8836cbee2748a79e6'] = 'ist mindestens erforderlich in'; + +?> \ No newline at end of file diff --git a/modules/shopimporter/es.php b/modules/shopimporter/es.php new file mode 100644 index 000000000..b14739277 --- /dev/null +++ b/modules/shopimporter/es.php @@ -0,0 +1,92 @@ +shopimporter_d714c742b360a8ecbb124c15e9a391a1'] = 'Import de tienda'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8c0fe18034f47d7d3dd3e58098e3ffdb'] = 'Este módulo le permite importar su tienda a partir de otro sistema.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4994a8ffeba4ac3140beb89e8d41f174'] = 'Idiomas'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a9db6adcdafc85c5830439401fd866f6'] = 'Import de idiomas'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b8b8ca447e355455b8dc638993c41ae7'] = 'Los nuevos idiomas añadirán automáticamente las traducciones'; +$_MODULE['<{shopimporter}prestashop>shopimporter_386c339d37e737a436499d423a77df0c'] = 'Divisa'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4234c64201820401dfa04eeb449c1bbc'] = 'Import de las divisas'; +$_MODULE['<{shopimporter}prestashop>shopimporter_719fec04166d6fa75f89cd29ad61fa8c'] = 'Impuestos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_94c5ffc9d364127b232f58b4cfd8c88a'] = 'Importar los impuestos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3c994b8c6c4e8b756185f74ded711f69'] = 'TaxesRules'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6ec25fc9cc7df7b0d1fce57923f46ec1'] = 'Importar Taxes Rules'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3ff996fe5c77610359114835baf9b38'] = 'Zona'; +$_MODULE['<{shopimporter}prestashop>shopimporter_21d250d17e35e3e02db9f1a618bad913'] = 'Import de las zonas'; +$_MODULE['<{shopimporter}prestashop>shopimporter_59716c97497eb9694541f7c3d37b1a4d'] = 'País'; +$_MODULE['<{shopimporter}prestashop>shopimporter_13eedcf49d68ce49274db71e63a7aa3d'] = 'Import de los países'; +$_MODULE['<{shopimporter}prestashop>shopimporter_46a2a41cc6e552044816a2d04634545d'] = 'Estados'; +$_MODULE['<{shopimporter}prestashop>shopimporter_118421de3201927a23bf921057e69c4a'] = 'Import de los estados'; +$_MODULE['<{shopimporter}prestashop>shopimporter_03937134cedab9078be39a77ee3a48a0'] = 'Grupo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_65ac19ad248219902394739bda0cef62'] = 'Import de los grupos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{shopimporter}prestashop>shopimporter_22c34564e80ce8adab6a235061d277f4'] = 'Import de los clientes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd7bf230fde8d4836917806aff6a6b27'] = 'Dirección'; +$_MODULE['<{shopimporter}prestashop>shopimporter_77497d022aeb4cdd78ec394ca8d223b4'] = 'Import de las direcciones'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Fabricante'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ed4cbbbeb3d575ccfeb405ae5c5c4d43'] = 'Import de los fabricantes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ec136b444eede3bc85639fac0dd06229'] = 'Proveedor'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0ae5f9c75e6a7460ec31e33201576bd9'] = 'Import de los fabricantes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoría'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1db7ae20c24e257b6f1a7def365da1ad'] = 'Import de las categorías'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1f5a36b380c53d7f82e762baa08c2e5c'] = 'Grupo de atributos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7eb915ee907703ede51dabab88fc1701'] = 'Import grupos de atributos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Atributo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_66e2d23b2d257d56af6f1d6443ce0ce3'] = 'Import de atributos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_deb10517653c255364175796ace3553f'] = 'Producto'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4bfc4a7632bae0877b798dbd9efc4f70'] = 'Import de los productos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_47ac923d219501859fb68fed8c8db77b'] = 'Combinación'; +$_MODULE['<{shopimporter}prestashop>shopimporter_58e2fcec5e04716c627b3e8b9d2955b1'] = 'Import de las declinaciones de los productos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3df6b363e7979ce81b71d92961fc672'] = 'Estados de los pedidos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6b24bd15b10bc10de9687f16ebe728e4'] = 'Import des estado de los pedidos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a240fa27925a635b08dc28c9e4f9216d'] = 'Pedido'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3b7e768ebab2171baa41d5ea13017b02'] = 'Import de los pedidos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_782c8b38bce4f2f6975ca7f33ac8189b'] = 'Historial de los pedidos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2931b8b1622867fcc461d7de388e319'] = 'Import del historial de los pedidos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_32a6deec3cca312a54d6b8769c9b8dd7'] = 'no se encuentra disponible en este módulo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1e411d25230ba738b9ae583bcb9b0b57'] = 'Connexión a la base de datos OK'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3596c777cbc8b72d678f34daabc9148b'] = 'Mostrar los errores'; +$_MODULE['<{shopimporter}prestashop>shopimporter_89a399eee52b2a6daaea92eba3e14cad'] = 'Lanzar el test de import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_bf79359f8edda6f7df97ef57a4ee09b6'] = 'Ejecutar importación'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0b5a6ead644b8ae4edb8a036334c9ed6'] = 'Se han producido errores durante la importación. Para más detalles haga clic en \"Mostrar errores\"'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e905d0eb5204b761d8c0e3eebed4a0e0'] = 'El import ha terminado'; +$_MODULE['<{shopimporter}prestashop>shopimporter_596403b61367ca30d6de75812275f9cd'] = 'Supresión de los datos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_edc186cbc5cc897a79312880ec16c621'] = 'Por favor seleccione algún elemento para importar'; +$_MODULE['<{shopimporter}prestashop>shopimporter_81b33153f65252001fe132d74b658fbe'] = 'Importar a partir de otro sistema'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd4c0c798ebbf8c6e15dcba8632f558d'] = 'Antes de empezar la importación, por favor haga una copia de seguridad de sus base de datos.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_60474e812295a5adc371de63dc62a164'] = 'Pulsar aquí para guardar'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05f4be265d59ea66f3a1fb12ba103583'] = 'Elegir un import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_961f2247a2070bedff9f9cd8d64e2650'] = 'Elegir'; +$_MODULE['<{shopimporter}prestashop>shopimporter_151a0fbfcc4894aa53335091c2512de5'] = 'No hay ningún módulo de importación instalado'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9aa1b03934893d7134a660af4204f2a9'] = 'Servidor'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8f9bfe9d1345237cb3b2b205864da075'] = 'Usuario'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dc647eb65e6711e155375218212b3964'] = 'Contraseña'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e307db07b3975fef922a80d07455ee5e'] = 'Base de datos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dac130bdd2c5492a8108a4145bd9f04a'] = 'Prefijo de la base de datos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_2bb4cbbf4c51025867d47131e79ad05f'] = 'Etapa siguiente'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72dd98a453e92ccc01697f29bb5dbeb9'] = 'Opción de import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9dfc5d5738312210c3c75e68a468691d'] = 'Opciones avanzadas'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c195d4db1be0d349d21f236f0a6400ff'] = 'Este modo no es aconsejable'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11e9fa925cb444a223769edd53334f13'] = 'Importar para'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70fda5850e8d8946a340c55bf985fd39'] = 'Seleccionar el número de ocurrencias para cada consulta para importar'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35f178a340d9aa1a080d8cfaf0b57f36'] = 'Si hay errores'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11a755d598c0c417f9a36758c3da7481'] = 'Stop'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72ef2b9b6965d078e3c7f95487a82d1c'] = 'Saltar'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9eb6b78a99cdb6ffd3d40d18621d9f80'] = 'Forzar'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05d2b3715ac0c697b86799d1989c4aeb'] = 'Stop: si hay errores, la importación no funciona'; +$_MODULE['<{shopimporter}prestashop>shopimporter_690c3a7f595050729df99a6d30dd6f96'] = 'Saltar: si hay errores, la importación va a saltar los datos incorrectos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35a6535254a93c5338bff1e3572755d2'] = 'Forzar: si hay errores, la importación sustituirá los datos incorrectos por datos genéricos.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_09b4382d10c396e0c4fcd51064702213'] = 'Opciones específicas'; +$_MODULE['<{shopimporter}prestashop>shopimporter_044a8ce60a6c5a464e7a7f78698fc05d'] = 'El idioma por defecto no coincide:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_807079d19357b6d44089c220f74cc2d0'] = 'Por favor, cambie el idioma por defecto en la configuración'; +$_MODULE['<{shopimporter}prestashop>shopimporter_29361e9c6917fb14b43d3e78e2811e56'] = 'La moneda por defecto no coincide:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6117c4d73fcf0c20fe3946f1d00dde85'] = 'Por favor, cambie la moneda por defecto en la configuración'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8136c99d09cb6e9f0f998dd231fff6ed'] = 'Se produjo un error al agregar el objeto'; +$_MODULE['<{shopimporter}prestashop>shopimporter_01f8544c8fd4628bc686502e8b727d95'] = 'el campo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0a5fa53f3f20f67f98bd6c3b16df059d'] = 'es necesario'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f755e8b92cb8f02c24f6f539180d45b1'] = 'es demasiado largo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70f4b635847038d056e33959821a7a66'] = 'caracteres máximos'; +$_MODULE['<{shopimporter}prestashop>shopimporter_998b344cff693ad388a14ba89b1523c7'] = 'no es válido'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7e47a344b06d82a8836cbee2748a79e6'] = 'es necesario en'; diff --git a/modules/shopimporter/fr.php b/modules/shopimporter/fr.php new file mode 100644 index 000000000..448b265cd --- /dev/null +++ b/modules/shopimporter/fr.php @@ -0,0 +1,92 @@ +shopimporter_d714c742b360a8ecbb124c15e9a391a1'] = 'Import de boutique'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8c0fe18034f47d7d3dd3e58098e3ffdb'] = 'Ce module vous permet d\'importer votre boutique depuis autre système.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4994a8ffeba4ac3140beb89e8d41f174'] = 'Langues'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a9db6adcdafc85c5830439401fd866f6'] = 'Import des langues'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b8b8ca447e355455b8dc638993c41ae7'] = 'Les nouveaux langages ajouterons automatiquement les traductions'; +$_MODULE['<{shopimporter}prestashop>shopimporter_386c339d37e737a436499d423a77df0c'] = 'Devise'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4234c64201820401dfa04eeb449c1bbc'] = 'Import des devises'; +$_MODULE['<{shopimporter}prestashop>shopimporter_719fec04166d6fa75f89cd29ad61fa8c'] = 'Taxes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_94c5ffc9d364127b232f58b4cfd8c88a'] = 'Importer les taxes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3c994b8c6c4e8b756185f74ded711f69'] = 'Règle de taxes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6ec25fc9cc7df7b0d1fce57923f46ec1'] = 'Importer les règles de taxes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3ff996fe5c77610359114835baf9b38'] = 'Zone'; +$_MODULE['<{shopimporter}prestashop>shopimporter_21d250d17e35e3e02db9f1a618bad913'] = 'Import des zones'; +$_MODULE['<{shopimporter}prestashop>shopimporter_59716c97497eb9694541f7c3d37b1a4d'] = 'Pays'; +$_MODULE['<{shopimporter}prestashop>shopimporter_13eedcf49d68ce49274db71e63a7aa3d'] = 'Import des pays'; +$_MODULE['<{shopimporter}prestashop>shopimporter_46a2a41cc6e552044816a2d04634545d'] = 'Etats'; +$_MODULE['<{shopimporter}prestashop>shopimporter_118421de3201927a23bf921057e69c4a'] = 'Import des états'; +$_MODULE['<{shopimporter}prestashop>shopimporter_03937134cedab9078be39a77ee3a48a0'] = 'Groupe'; +$_MODULE['<{shopimporter}prestashop>shopimporter_65ac19ad248219902394739bda0cef62'] = 'Import des groupes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ce26601dac0dea138b7295f02b7620a7'] = 'Client'; +$_MODULE['<{shopimporter}prestashop>shopimporter_22c34564e80ce8adab6a235061d277f4'] = 'Import des clients'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd7bf230fde8d4836917806aff6a6b27'] = 'Adresse'; +$_MODULE['<{shopimporter}prestashop>shopimporter_77497d022aeb4cdd78ec394ca8d223b4'] = 'Import des adresses'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Fabricant'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ed4cbbbeb3d575ccfeb405ae5c5c4d43'] = 'Import des Fabricants'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ec136b444eede3bc85639fac0dd06229'] = 'Fournisseur'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0ae5f9c75e6a7460ec31e33201576bd9'] = 'Import des Fournisseurs'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categorie'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1db7ae20c24e257b6f1a7def365da1ad'] = 'Import des categories'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1f5a36b380c53d7f82e762baa08c2e5c'] = 'Groupe d\'attributs'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7eb915ee907703ede51dabab88fc1701'] = 'Import des groupes d\'attributs'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attribut'; +$_MODULE['<{shopimporter}prestashop>shopimporter_66e2d23b2d257d56af6f1d6443ce0ce3'] = 'Import des attributs'; +$_MODULE['<{shopimporter}prestashop>shopimporter_deb10517653c255364175796ace3553f'] = 'Produit'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4bfc4a7632bae0877b798dbd9efc4f70'] = 'Import des produits'; +$_MODULE['<{shopimporter}prestashop>shopimporter_47ac923d219501859fb68fed8c8db77b'] = 'Déclinaison'; +$_MODULE['<{shopimporter}prestashop>shopimporter_58e2fcec5e04716c627b3e8b9d2955b1'] = 'Import des déclinaisons de produits'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3df6b363e7979ce81b71d92961fc672'] = 'Statuts de commande'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6b24bd15b10bc10de9687f16ebe728e4'] = 'Import des statuts de commande'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a240fa27925a635b08dc28c9e4f9216d'] = 'Commande'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3b7e768ebab2171baa41d5ea13017b02'] = 'Import des commandes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_782c8b38bce4f2f6975ca7f33ac8189b'] = 'Historique de commande'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2931b8b1622867fcc461d7de388e319'] = 'Import des historique de commande'; +$_MODULE['<{shopimporter}prestashop>shopimporter_32a6deec3cca312a54d6b8769c9b8dd7'] = 'n\'est pas disponible dans ce module'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1e411d25230ba738b9ae583bcb9b0b57'] = 'Connexion à la base de données OK '; +$_MODULE['<{shopimporter}prestashop>shopimporter_3596c777cbc8b72d678f34daabc9148b'] = 'Afficher les erreurs'; +$_MODULE['<{shopimporter}prestashop>shopimporter_89a399eee52b2a6daaea92eba3e14cad'] = 'Lancer le test d\'import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_bf79359f8edda6f7df97ef57a4ee09b6'] = 'Lancer l\'import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0b5a6ead644b8ae4edb8a036334c9ed6'] = 'Des erreurs sont survenues lors de l\'importation. Pour plus de détails, cliquer sur \"Afficher les erreurs\"'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e905d0eb5204b761d8c0e3eebed4a0e0'] = 'L\'import est terminé'; +$_MODULE['<{shopimporter}prestashop>shopimporter_596403b61367ca30d6de75812275f9cd'] = 'Suppression des données'; +$_MODULE['<{shopimporter}prestashop>shopimporter_edc186cbc5cc897a79312880ec16c621'] = 'Merci de choisir quelque chose à importer'; +$_MODULE['<{shopimporter}prestashop>shopimporter_81b33153f65252001fe132d74b658fbe'] = 'Importer depuis un autre systeme'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd4c0c798ebbf8c6e15dcba8632f558d'] = 'Avant de commencer l\'importation merci de faire une sauvegarde de votre base de données.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_60474e812295a5adc371de63dc62a164'] = 'Cliquez ici pour sauvegarder'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05f4be265d59ea66f3a1fb12ba103583'] = 'Choisir un import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_961f2247a2070bedff9f9cd8d64e2650'] = 'Choisir'; +$_MODULE['<{shopimporter}prestashop>shopimporter_151a0fbfcc4894aa53335091c2512de5'] = 'Aucun module d\'import installé'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9aa1b03934893d7134a660af4204f2a9'] = 'Serveur'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8f9bfe9d1345237cb3b2b205864da075'] = 'Utilisateur'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dc647eb65e6711e155375218212b3964'] = 'Mot de passe'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e307db07b3975fef922a80d07455ee5e'] = 'Base de données'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dac130bdd2c5492a8108a4145bd9f04a'] = 'Prefix de base de données'; +$_MODULE['<{shopimporter}prestashop>shopimporter_2bb4cbbf4c51025867d47131e79ad05f'] = 'Etape suivante'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72dd98a453e92ccc01697f29bb5dbeb9'] = 'Option d\'import'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9dfc5d5738312210c3c75e68a468691d'] = 'Options avancées '; +$_MODULE['<{shopimporter}prestashop>shopimporter_c195d4db1be0d349d21f236f0a6400ff'] = 'Ce mode n\'est pas recommandé'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11e9fa925cb444a223769edd53334f13'] = 'Importer par'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70fda5850e8d8946a340c55bf985fd39'] = 'Sélectionnez le nombre d\'occurrences pour chaque requête à l\'importation'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35f178a340d9aa1a080d8cfaf0b57f36'] = 'Si il y a des erreurs'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11a755d598c0c417f9a36758c3da7481'] = 'Stop'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72ef2b9b6965d078e3c7f95487a82d1c'] = 'Sauter'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9eb6b78a99cdb6ffd3d40d18621d9f80'] = 'Forcer'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05d2b3715ac0c697b86799d1989c4aeb'] = 'Stop: s\'il ya des erreurs, l\'importation ne fonctionne pas.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_690c3a7f595050729df99a6d30dd6f96'] = 'Skip: s\'il ya des erreurs, l\'importation va sauter des données incorrectes'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35a6535254a93c5338bff1e3572755d2'] = 'Force: s\'il ya des erreurs, l\'importation remplacera les données incorrectes par des données génériques.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_09b4382d10c396e0c4fcd51064702213'] = 'Options spécifiques '; +$_MODULE['<{shopimporter}prestashop>shopimporter_044a8ce60a6c5a464e7a7f78698fc05d'] = 'La langue par défaut ne correspond pas à :'; +$_MODULE['<{shopimporter}prestashop>shopimporter_807079d19357b6d44089c220f74cc2d0'] = 'Merci de changer la langue par défaut dans votre configuration '; +$_MODULE['<{shopimporter}prestashop>shopimporter_29361e9c6917fb14b43d3e78e2811e56'] = 'La devise par défaut ne correspond pas à:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6117c4d73fcf0c20fe3946f1d00dde85'] = 'Merci de changer la devise par défaut dans votre configuration '; +$_MODULE['<{shopimporter}prestashop>shopimporter_8136c99d09cb6e9f0f998dd231fff6ed'] = 'Une erreur s\'est produite lors de l\'ajout de l\'objet '; +$_MODULE['<{shopimporter}prestashop>shopimporter_01f8544c8fd4628bc686502e8b727d95'] = 'le champ'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0a5fa53f3f20f67f98bd6c3b16df059d'] = 'est nécessaire '; +$_MODULE['<{shopimporter}prestashop>shopimporter_f755e8b92cb8f02c24f6f539180d45b1'] = 'est trop long'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70f4b635847038d056e33959821a7a66'] = 'caractères max '; +$_MODULE['<{shopimporter}prestashop>shopimporter_998b344cff693ad388a14ba89b1523c7'] = 'est invalide'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7e47a344b06d82a8836cbee2748a79e6'] = 'est nécessaire dans '; diff --git a/modules/shopimporter/img/ajax-loader.gif b/modules/shopimporter/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..3dba96d65fcf86a59969c1c991ffad3ac7294f83 GIT binary patch literal 1849 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 Cz9@ERCLGF#WBR9cWH1mSCfN??c}I{+uoj@ zcb!;t6<6qFaxeQaQCg?Pvi3wraGG+g#Ejn-{W}esR4!!~t$%&%Xh(s}@>_XjavqNg zZWZUKOlS5y^lp>ge17GxFH5f7d;2|Yo_O;EgP81}?2ZCI-1PPdMNIoD-`J(IJF`;8 zU4e5_8cU%}=1wMQ;V+D{7k{tj{IsWG%BRJ0EdTP^RUZCcEtl%#W%o&`e2i}kD@MLAs Y*M4#`ErB`v0??lfp00i_>zopr0KT_>NB{r; literal 0 HcmV?d00001 diff --git a/modules/shopimporter/img/force.gif b/modules/shopimporter/img/force.gif new file mode 100644 index 0000000000000000000000000000000000000000..d876e5e9c066ae926e6125ffd1ca9d58de9f2c9b GIT binary patch literal 971 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 KMNUMnLSTZf56)Kr literal 0 HcmV?d00001 diff --git a/modules/shopimporter/img/stop.png b/modules/shopimporter/img/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc3cee2aff35a84921be69ccf5d513ca1502c54 GIT binary patch literal 1496 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 literal 0 HcmV?d00001 diff --git a/modules/shopimporter/it.php b/modules/shopimporter/it.php new file mode 100644 index 000000000..ca414eca3 --- /dev/null +++ b/modules/shopimporter/it.php @@ -0,0 +1,92 @@ +shopimporter_d714c742b360a8ecbb124c15e9a391a1'] = 'Importatore negozio'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8c0fe18034f47d7d3dd3e58098e3ffdb'] = 'Questo modulo ti consente di importare il tuo negozio da un altro sistema in PrestaShop'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4994a8ffeba4ac3140beb89e8d41f174'] = 'Lingua'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a9db6adcdafc85c5830439401fd866f6'] = 'Importa Lingue'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b8b8ca447e355455b8dc638993c41ae7'] = 'Nuove lingue aggiungerà automaticamente traduzioni!'; +$_MODULE['<{shopimporter}prestashop>shopimporter_386c339d37e737a436499d423a77df0c'] = 'Valuta'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4234c64201820401dfa04eeb449c1bbc'] = 'Importa Valute'; +$_MODULE['<{shopimporter}prestashop>shopimporter_719fec04166d6fa75f89cd29ad61fa8c'] = 'Tasse'; +$_MODULE['<{shopimporter}prestashop>shopimporter_94c5ffc9d364127b232f58b4cfd8c88a'] = 'Importa Tasse'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6ec25fc9cc7df7b0d1fce57923f46ec1'] = 'Importa norme fiscali'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3ff996fe5c77610359114835baf9b38'] = 'Zona'; +$_MODULE['<{shopimporter}prestashop>shopimporter_21d250d17e35e3e02db9f1a618bad913'] = 'Importa Zone'; +$_MODULE['<{shopimporter}prestashop>shopimporter_59716c97497eb9694541f7c3d37b1a4d'] = 'Paese'; +$_MODULE['<{shopimporter}prestashop>shopimporter_13eedcf49d68ce49274db71e63a7aa3d'] = 'Importa paesi'; +$_MODULE['<{shopimporter}prestashop>shopimporter_46a2a41cc6e552044816a2d04634545d'] = 'Stato'; +$_MODULE['<{shopimporter}prestashop>shopimporter_118421de3201927a23bf921057e69c4a'] = 'Importa Stati'; +$_MODULE['<{shopimporter}prestashop>shopimporter_03937134cedab9078be39a77ee3a48a0'] = 'Gruppo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_65ac19ad248219902394739bda0cef62'] = 'Importa gruppi'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{shopimporter}prestashop>shopimporter_22c34564e80ce8adab6a235061d277f4'] = 'Importa Clienti'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd7bf230fde8d4836917806aff6a6b27'] = 'Indirizzo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_77497d022aeb4cdd78ec394ca8d223b4'] = 'Importa gli indirizzi'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c0bd7654d5b278e65f21cf4e9153fdb4'] = 'Produttore'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ed4cbbbeb3d575ccfeb405ae5c5c4d43'] = 'Importa Produttori'; +$_MODULE['<{shopimporter}prestashop>shopimporter_ec136b444eede3bc85639fac0dd06229'] = 'Fornitore'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0ae5f9c75e6a7460ec31e33201576bd9'] = 'Importa Fornitori'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoria'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1db7ae20c24e257b6f1a7def365da1ad'] = 'Importa categorie'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1f5a36b380c53d7f82e762baa08c2e5c'] = 'Gruppo attributi'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7eb915ee907703ede51dabab88fc1701'] = 'Importa gruppo attributi'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attributo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_66e2d23b2d257d56af6f1d6443ce0ce3'] = 'Importa Attributi'; +$_MODULE['<{shopimporter}prestashop>shopimporter_deb10517653c255364175796ace3553f'] = 'Prodotto'; +$_MODULE['<{shopimporter}prestashop>shopimporter_4bfc4a7632bae0877b798dbd9efc4f70'] = 'Importa prodotti'; +$_MODULE['<{shopimporter}prestashop>shopimporter_47ac923d219501859fb68fed8c8db77b'] = 'Combinazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_58e2fcec5e04716c627b3e8b9d2955b1'] = 'Importa combinazioni di prodotti'; +$_MODULE['<{shopimporter}prestashop>shopimporter_b3df6b363e7979ce81b71d92961fc672'] = 'Stati ordini'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6b24bd15b10bc10de9687f16ebe728e4'] = 'Importa Stati ordini'; +$_MODULE['<{shopimporter}prestashop>shopimporter_a240fa27925a635b08dc28c9e4f9216d'] = 'Ordine'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3b7e768ebab2171baa41d5ea13017b02'] = 'Importa Ordini'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f2931b8b1622867fcc461d7de388e319'] = 'Importa cronologia ordini'; +$_MODULE['<{shopimporter}prestashop>shopimporter_32a6deec3cca312a54d6b8769c9b8dd7'] = 'non è disponibile in questo modulo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_1e411d25230ba738b9ae583bcb9b0b57'] = 'Connessione al database OK'; +$_MODULE['<{shopimporter}prestashop>shopimporter_3596c777cbc8b72d678f34daabc9148b'] = 'Mostra gli errori'; +$_MODULE['<{shopimporter}prestashop>shopimporter_89a399eee52b2a6daaea92eba3e14cad'] = 'Lancia la prova di importazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_bf79359f8edda6f7df97ef57a4ee09b6'] = 'Lancia importazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0b5a6ead644b8ae4edb8a036334c9ed6'] = 'Si sono verificati errori durante l\'importazione. Per maggiori dettagli cliccate su \"Mostra errori\"'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e905d0eb5204b761d8c0e3eebed4a0e0'] = 'L\'importazione è completata'; +$_MODULE['<{shopimporter}prestashop>shopimporter_596403b61367ca30d6de75812275f9cd'] = 'Rimuovere i dati'; +$_MODULE['<{shopimporter}prestashop>shopimporter_edc186cbc5cc897a79312880ec16c621'] = 'Si prega di scegliere una cosa da importare'; +$_MODULE['<{shopimporter}prestashop>shopimporter_81b33153f65252001fe132d74b658fbe'] = 'Importa da un altro sistema'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dd4c0c798ebbf8c6e15dcba8632f558d'] = 'Prima di iniziare l\'importazione, fare il backup del database.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_60474e812295a5adc371de63dc62a164'] = 'Clicca qui per il backup'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05f4be265d59ea66f3a1fb12ba103583'] = 'Scegli la tua importazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_961f2247a2070bedff9f9cd8d64e2650'] = 'Scegli'; +$_MODULE['<{shopimporter}prestashop>shopimporter_151a0fbfcc4894aa53335091c2512de5'] = 'Nessun modulo di importazione installato'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9aa1b03934893d7134a660af4204f2a9'] = 'Server'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8f9bfe9d1345237cb3b2b205864da075'] = 'Utente'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dc647eb65e6711e155375218212b3964'] = 'Password'; +$_MODULE['<{shopimporter}prestashop>shopimporter_e307db07b3975fef922a80d07455ee5e'] = 'Database'; +$_MODULE['<{shopimporter}prestashop>shopimporter_dac130bdd2c5492a8108a4145bd9f04a'] = 'Prefisso database'; +$_MODULE['<{shopimporter}prestashop>shopimporter_2bb4cbbf4c51025867d47131e79ad05f'] = 'Passo successivo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72dd98a453e92ccc01697f29bb5dbeb9'] = 'Opzioni di importazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9dfc5d5738312210c3c75e68a468691d'] = 'Opzioni avanzate'; +$_MODULE['<{shopimporter}prestashop>shopimporter_c195d4db1be0d349d21f236f0a6400ff'] = 'Questa modalità è pericolosa'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11e9fa925cb444a223769edd53334f13'] = 'Importa per ogni'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70fda5850e8d8946a340c55bf985fd39'] = 'Selezionare il numero di occorrenze per ogni richiesta di importazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35f178a340d9aa1a080d8cfaf0b57f36'] = 'Se si verificano errori'; +$_MODULE['<{shopimporter}prestashop>shopimporter_11a755d598c0c417f9a36758c3da7481'] = 'Stop'; +$_MODULE['<{shopimporter}prestashop>shopimporter_72ef2b9b6965d078e3c7f95487a82d1c'] = 'Salta'; +$_MODULE['<{shopimporter}prestashop>shopimporter_9eb6b78a99cdb6ffd3d40d18621d9f80'] = 'Forza'; +$_MODULE['<{shopimporter}prestashop>shopimporter_05d2b3715ac0c697b86799d1989c4aeb'] = 'Stop: se ci sono errori con i dati, l\'importazione non verrà eseguita.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_690c3a7f595050729df99a6d30dd6f96'] = 'Salta: se ci sono errori con i dati, l\'importazione salterà dati non corretti.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_35a6535254a93c5338bff1e3572755d2'] = 'Forze: se ci sono errori con i dati, l\'importazione sostituirà i dati non corretti con dati generici.'; +$_MODULE['<{shopimporter}prestashop>shopimporter_09b4382d10c396e0c4fcd51064702213'] = 'Opzioni specifiche'; +$_MODULE['<{shopimporter}prestashop>shopimporter_044a8ce60a6c5a464e7a7f78698fc05d'] = 'Lingua di default non corrisponde:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_807079d19357b6d44089c220f74cc2d0'] = 'Si prega di cambiare la lingua di default nella configurazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_29361e9c6917fb14b43d3e78e2811e56'] = 'Valuta di default non corrisponde:'; +$_MODULE['<{shopimporter}prestashop>shopimporter_6117c4d73fcf0c20fe3946f1d00dde85'] = 'Si prega di cambiare valuta di default nella configurazione'; +$_MODULE['<{shopimporter}prestashop>shopimporter_8136c99d09cb6e9f0f998dd231fff6ed'] = 'Si è verificato un errore nell\'aggiunta dell\'oggetto'; +$_MODULE['<{shopimporter}prestashop>shopimporter_01f8544c8fd4628bc686502e8b727d95'] = 'il campo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_0a5fa53f3f20f67f98bd6c3b16df059d'] = 'è richiesto'; +$_MODULE['<{shopimporter}prestashop>shopimporter_f755e8b92cb8f02c24f6f539180d45b1'] = 'è troppo lungo'; +$_MODULE['<{shopimporter}prestashop>shopimporter_70f4b635847038d056e33959821a7a66'] = 'caratteri max'; +$_MODULE['<{shopimporter}prestashop>shopimporter_998b344cff693ad388a14ba89b1523c7'] = 'non è valido'; +$_MODULE['<{shopimporter}prestashop>shopimporter_7e47a344b06d82a8836cbee2748a79e6'] = 'è richiesto almeno in'; + +?> \ No newline at end of file diff --git a/modules/shopimporter/logo.gif b/modules/shopimporter/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..263b1e430e35185a34788e038c49ba61f9c4f237 GIT binary patch literal 379 zcmV->0fhcXNk%w1VGsZi0M$PLgpi&4`ug+s`Tzg_HbG1ht{(sY01BfGg^-*8UI4($ z)&NWZ5NHslw8H!R{k+D|v%k!1bbjLK?*Li=?C$b-f{pX__xbw!{Qdsu?C|XH^8jQ3 z`~3X&`1;e^2rLC{r>&{ zV*mg~0ORND@bmZY@$~WY^#El6eTb6)MF0Rq0O{=STFou>_xb=+0Nvu}>hJUbTmS$` z0RR90A^8LW002J#EC2ui01yBW000J_>4 zqgx'+jsonData.error+'
    '); + $('#lang_feedback').fadeIn('slow'); + onComplete(false); + } + else + onComplete(true); + + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + $('#steps').html($('#steps').html()+''); + $('#technical_error_feedback').fadeIn('slow'); + onComplete(false); + } + }); + + }, + syncCurrency : function (onComplete) + { + $.ajax({ + type: 'GET', + url: '../modules/shopimporter/ajax.php', + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&token='+this.token+'&syncCurrency&getMethod=getCurrencies&className=Currency&moduleName='+this.moduleName+'&server='+this.server+'&user='+this.user+'&password='+this.password+'&database='+this.database+'&prefix='+prefix+this.specificOptions+'&nbr_import='+this.nbr_import , + success: function(jsonData) + { + if (jsonData.hasError) + { + $('#steps').html(''); + $('#currency_feedback').fadeIn('slow'); + onComplete(false); + } + else + onComplete(true); + + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + $('#steps').html($('#steps').html()+''); + $('#technical_error_feedback').fadeIn('slow'); + onComplete(false); + } + }); + + }, + checkAndSaveConfig : function (save) + { + //sync languages and currency + this.syncLang(function(isOk) { + if (isOk) + { + shopImporter.syncCurrency(function(isOk) { + if (isOk) + { + $.ajax({ + type: 'GET', + url: '../modules/shopimporter/ajax.php', + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&token='+this.token+'&checkAndSaveConfig&moduleName='+shopImporter.moduleName+'&server='+shopImporter.server+'&user='+shopImporter.user+'&password='+shopImporter.password+'&database='+shopImporter.database+'&prefix='+prefix+shopImporter.specificOptions+'&nbr_import='+shopImporter.nbr_import , + success: function(jsonData) + { + if ($('#technical_error_feedback').length) + $('#technical_error_feedback').fadeIn('slow'); + + if (!jsonData.hasError) + { + $('#checkAndSaveConfig').fadeOut('slow'); + $('#steps').html($('#steps').html()+''); + $('#steps').html($('#steps').html()+''); + $('#database_feedback').fadeIn('slow', function() { + if (save) + { + shopImporter.idMethod = 0; + shopImporter.limit = 0; + shopImporter.nbrMethod = conf.length; + $('.truncateTable:checked').each(function (){ + shopImporter.truncatTable(this.id, 'add'); + }); + + if($('#truncat_feedback').length != 0) + $('#truncat_feedback').removeClass('import').addClass('conf'); + + shopImporter.getDatas(conf[shopImporter.idMethod]); + } + else + { + $('#next').fadeIn('slow', function () { + $('#next').unbind('click').click(function(){ + $('#next').fadeOut('fast', function() { + shopImporter.nbrMethod = conf.length; + shopImporter.getDatas(conf[shopImporter.idMethod]); + }); + return false; + }); + }); + } + }); + } + else + { + $('#steps').html(''); + $('#database_feedback').fadeIn('slow'); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + $('#steps').html($('#steps').html()+''); + $('#technical_error_feedback').fadeIn('slow'); + + } + }); + } + }); + } + }); + + + }, + + getDatas : function (methodName) + { + //check if method have to be call + if (shopImporter.idMethod >= shopImporter.nbrMethod) + shopImporter.displayEnd(false); + else if ($('input[name='+methodName[0]+']:radio:checked').val() == 0) + { + shopImporter.idMethod ++; + shopImporter.getDatas(conf[shopImporter.idMethod]); + return; + } + if (typeof(methodName) != 'undefined') + { + + $('#steps').html($('#steps').html()+''); + $('#ok_feedback_'+methodName[0]).css('display', ''); + + $('#checkAndSaveConfig').fadeIn('slow'); + $.ajax({ + type: 'GET', + url: '../modules/shopimporter/ajax.php', + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&token='+this.token+'&getData&className='+methodName[2]+'&getMethod='+methodName[0]+'&moduleName='+this.moduleName+'&server='+this.server+'&user='+this.user+'&password='+this.password+'&database='+this.database+'&prefix='+prefix+'&limit='+this.limit+'&nbr_import='+this.nbr_import+'&save='+this.save+'&errors='+this.errors+'&hasErrors='+this.hasErrors+this.specificOptions+this.imagesOptions , + success: function(jsonData) + { + var jsonError; + if (jsonData.hasError) + { + jsonError = ''; + if (jsonData.error == 'not_exist') + { + $('#ok_feedback_'+methodName[0]).removeClass('conf').addClass(function() { + $('#ok_feedback_'+methodName[0]).html(''+methodName[1]+' '+notExist); + return 'warn'; + }); + } + else + { + for (i=0;iId : '+jsonData.error[i]+'
    + +
    +
     
    +
    + +
    +

    + +
    PrestaShop '.lang('Installer'); ?>
    +
    PrestaShop '.lang('Updater'); ?>
    +

    + +
    1.  
    + +
    + help + +
    +

    +

    + +
      +

    • +

    • +
    +
    +
    + + getIsoCodeSelectedLang() == 'fr'): ?> +

    + '.lang('A question about PrestaShop or issues during installation or upgrade? Call us!').'
    '.lang('+33 (0)1.40.18.30.04'); ?> +

    + +
    + + +
    + +
    +

    +


    +


    +
      +
    • +
    • +
    • +
    +

    + . +

    + +

    +
    +
      + getAvailableLangs() as $lang): ?> +
    • getIdSelectedLang() ) ? "checked=\"checked\"" : '' ?> id="lang_" name="language" style="vertical-align: middle; margin-right: 0;" />
    • + + +
    +
    +

    +

    + http://www.prestashop.com +

    + +

    +
    +

    type="radio" value="install" name="typeInstall" id="typeInstallInstall"/>

    +

    > type="radio" value="upgrade" name="typeInstall" id="typeInstallUpgrade"/>

    +
    +

    +
    +

    Open Software License ("OSL") v. 3.0

    +

    This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work:

    +

    Licensed under the Open Software License version 3.0

    +

    1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:

    +
      +
    1. to reproduce the Original Work in copies, either alone or as part of a collective work
    2. +
    3. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work
    4. +
    5. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License
    6. +
    7. to perform the Original Work publicly
    8. +
    9. to display the Original Work publicly
    10. +
    +

    2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.

    +

    3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.

    +

    4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.

    +

    5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).

    +

    6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.

    +

    7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer.

    +

    8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation.

    +

    9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).

    +

    10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.

    +

    11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.

    +

    12. Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.

    +

    13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.

    +

    14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    +

    15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.

    +

    16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under Open Software License ("OSL") v. 3.0" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.

    +
    +

    +
    +

    +
    + +
    + +

    + +

    + +

    + + + + +

    + + +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • /config
    • +
    • /tools/smarty/compile
    • +
    • /tools/smarty/cache
    • +
    • /tools/smarty_v2/compile
    • +
    • /tools/smarty_v2/cache
    • +
    • /sitemap.xml
    • +
    • /log
    • +
    • +
    • /img
    • +
    • /mails
    • +
    • /modules
    • +
    • /themes/prestashop/lang
    • +
    • /themes/prestashop/cache
    • +
    • /translations
    • +
    • /upload
    • +
    • /download
    • +
    + +

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    + +

    + +
    + +
    +

    + +

    +
    +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    + +

    +

    +
    + +
    +
    +

    +

    +

    +
    +
    '.lang('and demo products'); ?> +

    +
    +

    +
    +
    +

    + +

    +
    + +

    + +
    +
    +

    + + +

    +

    + + +

    + +

    + + +

    + +

    + + +

    + +

    + + +

    + +
    +
    +

    + + +

    + +

    +
    +
    + +
    +
    + +

    + +

    +
    +
    + +
    +
    + + +

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

    + +
    +
    + + + + + +

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

    +
    + + + + + + + + + '), trim($object->{$field.'_'.((int)($_GET['language'])+1)})); + if (Tools::property_exists($object, $field.'_1')) + return str_replace(array('!|', '|!'), array('<', '>'), trim($object->{$field.'_1'})); + return ''; + } + + $context = stream_context_create(array('http' => array('method'=>"GET", 'timeout' => 3))); + $content = @file_get_contents('http://www.prestashop.com/partner/preactivation/partners.php?version=1.0', false, $context); + if ($content && $content[0] == '<') + { + $result = simplexml_load_string($content); + if ($result->partner) + { + echo ' +

    '.lang('Additional Benefits').'

    +

    '.lang('Exclusive offers dedicated to PrestaShop merchants').'

    '; + + $modulesHelpInstall = array(); + $modulesDescription = array(); + $modulesPrechecked = array(); + foreach ($result->partner as $p) + { + $modulesDescription[trim($p->key)] = array('name' => trim($p->label), 'logo' => trim($p->logo_medium), 'label' => getPreinstallXmlLang($p, 'label'), 'description' => getPreinstallXmlLang($p, 'description'), 'more' => getPreinstallXmlLang($p, 'more')); + foreach ($p->country as $country_iso_code) + $modulesHelpInstall[trim($country_iso_code)][] = trim($p->key); + if ($p->prechecked) + foreach ($p->prechecked as $country_iso_code) + $modulesPrechecked[trim($p->key)][trim($country_iso_code)] = 1; + } + + foreach ($modulesHelpInstall as $country_iso_code => $modulesList) + { + echo '
    '; + foreach ($modulesList as $module) + { + echo ' + + + + + + + +
    '.$modulesDescription[$module]['name'].''.(isset($modulesDescription[$module]['more']) ? $modulesDescription[$module]['more'] : '').' + '.$modulesDescription[$module]['description'].' + + + + +
     
    +
    '; + echo ""; + } + echo '
    '; + } + } + } + + ?> + + + + + + + + + + + + + +
    + +
    + + +
    + +
    + +
    +
    +

    +

    +

    +

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

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

    +

    +

    +



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

    + +

    + +

    + + + + +

    + + +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • /config
    • +
    • /tools/smarty/compile
    • +
    • /tools/smarty/cache
    • +
    • /tools/smarty_v2/compile
    • +
    • /tools/smarty_v2/cache
    • +
    • /sitemap.xml
    • +
    • /log
    • +
    • +
    • /img
    • +
    • /mails
    • +
    • /modules
    • +
    • /themes/prestashop/lang
    • +
    • /themes/prestashop/cache
    • +
    • /translations
    • +
    • /upload
    • +
    • /download
    • +
    + +

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    + +

    + +
    + +
    +

    +

    +

    +

    +
    + +
    +
    +

    +

    +

    +

    +
    +


    + + '.lang('New features in PrestaShop v').INSTALL_VERSION.' + '; + } + + ?> + +

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

    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 literal 0 HcmV?d00001 diff --git a/img/scenes/2-large_scene.jpg b/img/scenes/2-large_scene.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7567634e690cad3aa7313be3c17ffd278ca1f81d GIT binary patch literal 17003 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 vVAgTdx#i{d8j5b)4 literal 0 HcmV?d00001 diff --git a/img/scenes/2.jpg b/img/scenes/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19ba0dfc804dcc4f5e57155617b0cce4576a4305 GIT binary patch literal 15334 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 (?d5dHwl5inUo;}*sU;oHnK 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 literal 0 HcmV?d00001 diff --git a/img/scenes/3.jpg b/img/scenes/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16de52e68817086c02a7b7328f170ff79e7c8589 GIT binary patch literal 16080 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 literal 0 HcmV?d00001 diff --git a/img/scenes/es-default-large_scene.jpg b/img/scenes/es-default-large_scene.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0c8b30dbe1def114bf933c4a6b0d1b58d2d16bb0 GIT binary patch literal 4298 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 literal 0 HcmV?d00001 diff --git a/img/scenes/fr-default-large_scene.jpg b/img/scenes/fr-default-large_scene.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b68f5ddca45ffac46d6a9eef80ec6a6feb09bfb2 GIT binary patch literal 6215 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 literal 0 HcmV?d00001 diff --git a/img/scenes/fr-default-thumb_scene.jpg b/img/scenes/fr-default-thumb_scene.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91d22f97f0069cfe5fb63f00e0a69c0a57333b7e GIT binary patch literal 1734 zcmb7EdpuNm6#w0OXUt%RnZY!|dbJtkEw98--jP?e(Q7KSvPssX?S&Fb@-C0{Sej** zB*m7=qev{KC}AiiM2czTRhqq{^lATTKYQ-E_jB*L-{1Xx&-a{j1>J%HKytKoumunV z0E8Yuzy<370>eT_4TCxskHumzSTP(<1Wynn5X8mA#fcIW5>bLIAudj$lE_lhGBPp* z$z?REG>sxHBQ5+0grI9MSWzriRGKJGl>Xl)xDCj7U%pAF@N!2*huv@U}z z)c!pN*IJPf3)g?MSqb3sSC}FTpJ|3yw!Y(tFkGI{kpS(NcTz1a0G&ip5 zeKn&4WzGX9d&=+I%v9KM40y#E?eq33k?6jaL)Pel9K0=0{7@@jZLI&Rez)JufG(iY~F^CB6bAk{| z1_(t;Sw+vvO_jmK=<2)Y*BiJVicBhh_BmYDzZp z-K(GPvK_cfr5X)kBYdr&dg7i({V{ zS`{97?C0Koly2g}I5yt_{VZZu9vl;{DmyASRjRc=&BooM@c1iYX|+k1J7ORB;fT;lcxX7tocscgWcqn^q0l_ zP(ky#q@RirugFY!2ckN!jM$yre1jlmuI%r8&kkE#KQPD9=O$CvGGAcHM z8L8_Ul$2jyztmNh%J0$@+FzPBf#`}o^UI82C4MAPB(2NQP9$6abw+tiF;wLUY0a~_zb1r zEX%csady^}cpApe4eBvFxA#p^@LhdkYO14U(!5Vpf9`eB=IygN5g9<^*51-bJ|PC( z8;z-C!^|u-NnCvVz0=yKSG-g(j`uAL4i_^E==reAG;n}sa^H4gGBtM3KAVWa6Er5n z&E$ARRJ_#16xlKF9XeTAylnbVuX9s)UiRL*RjYS2iEitYs-G*g^qrW9Qc-B>xJAg} z58Gl^#&|^SqTord-t1f&Z6Fkk#ODBAV9w{5^BXWqlERy}POE~^M~*qT1JLU?+Fm#p zr2m?WMS!BPO32rLpv5ZbTDb*9GV{L_h%^~!oYgiw$v2Rw!oi*kNcGlE=W}14 zcf|Ih#NsV%jTvjI9Ve)EsPPw8PtXgl71mJ#IauhTNA8Y|9bX^Hd}@$*jYY$&=;;q! zUBjpCyqb9i&%P7x6fsVe(S7io8Pc3*bh;Yv);~d@*V6JC&*)ZVdUcNV?zi2G{Wp2D z&D)O;4Xc!{ds#;h5iRLg&=P=65p<-{(Fim zZc{_YcN##3m*Aqzrh7&fSWh$j3pGnJ!+fRi)p>BIJcwMKe;J>sJ^1!cy>Xtlr00Nr zo7=qN`ptDfQ>}unR=CZoJFc^>)w +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/scenes/it-default-large_scene.jpg b/img/scenes/it-default-large_scene.jpg new file mode 100755 index 0000000000000000000000000000000000000000..be32f833b2de480b7c62788bfeafd2974de4df56 GIT binary patch literal 8770 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 +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/st/1-medium.jpg b/img/st/1-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b272c26668b8a64ebc8ecb5d08f8dfd6d6c96f5 GIT binary patch literal 2951 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 AZ~y=R literal 0 HcmV?d00001 diff --git a/img/st/1.jpg b/img/st/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34b45eee64d8a12615a4f9482980b71ffa24f950 GIT binary patch literal 8072 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 F{{uwqhIRk| literal 0 HcmV?d00001 diff --git a/img/st/2-medium.jpg b/img/st/2-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad01d54a345ff630e031ee26adce3a5e22bab615 GIT binary patch literal 2674 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 F{{uwqhIRk| literal 0 HcmV?d00001 diff --git a/img/st/3-medium.jpg b/img/st/3-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad01d54a345ff630e031ee26adce3a5e22bab615 GIT binary patch literal 2674 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 F{{uwqhIRk| literal 0 HcmV?d00001 diff --git a/img/st/4-medium.jpg b/img/st/4-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad01d54a345ff630e031ee26adce3a5e22bab615 GIT binary patch literal 2674 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 F{{uwqhIRk| literal 0 HcmV?d00001 diff --git a/img/st/5-medium.jpg b/img/st/5-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad01d54a345ff630e031ee26adce3a5e22bab615 GIT binary patch literal 2674 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 F{{uwqhIRk| literal 0 HcmV?d00001 diff --git a/img/st/index.php b/img/st/index.php new file mode 100755 index 000000000..ab85ebaf4 --- /dev/null +++ b/img/st/index.php @@ -0,0 +1,36 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; diff --git a/img/su/1-large.jpg b/img/su/1-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4bbc33c2ea0ecd23c25b89fda656a03f309f0c8 GIT binary patch literal 8179 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 literal 0 HcmV?d00001 diff --git a/img/su/1-medium.jpg b/img/su/1-medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f22b458258784e4c96e055c77d1e3cb6ee610a8 GIT binary patch literal 3040 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�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

  • '; + + if ($('#display_error_'+methodName[0]+'_link').length == 0) + { + $('#ok_feedback_'+methodName[0]).html($('#ok_feedback_'+methodName[0]).html()+''+showErrors+'('+jsonData.error.length+')'+''); + } + else + { + var nbrErrors = $('#nbr_errors_'+methodName[0]).html(); + var newNbrError = parseInt(jsonData.error.length) + parseInt(nbrErrors); + $('#nbr_errors_'+methodName[0]).html(newNbrError); + $('#feedback_'+methodName[0]+'_errors_list > ul').html($('#feedback_'+methodName[0]+'_errors_list > ul').html() + jsonError); + } + } + + if (jsonData.datas.length != parseInt(shopImporter.nbr_import)) + { + if ($('#display_error_'+methodName[0]+'_link').length != 0) + $('#ok_feedback_'+methodName[0]).removeClass('import').addClass( function() { + $('#ok_feedback_'+methodName[0]+' >img:first').attr('src', shopImporter.srcError); + return 'error'; + }); + shopImporter.idMethod ++; + shopImporter.limit = 0; + } + else + shopImporter.limit += parseInt(shopImporter.nbr_import); + if ((shopImporter.idMethod < shopImporter.nbrMethod)) + shopImporter.getDatas(conf[shopImporter.idMethod]); + else + shopImporter.displayEnd(false); + } + else + { + if (jsonData.datas.length != parseInt(shopImporter.nbr_import)) + { + if ($('#display_error_'+methodName[0]+'_link').length != 0) + { + $('#ok_feedback_'+methodName[0]).removeClass('import').addClass( function() { + $('#ok_feedback_'+methodName[0]+' >img:first').attr('src', shopImporter.srcError); + return 'error'; + }); + }else + { + $('#ok_feedback_'+methodName[0]).removeClass('import').addClass('conf'); + $('#ok_feedback_'+methodName[0]+'>img:first').attr('src', shopImporter.srcConf); + } + shopImporter.idMethod ++; + shopImporter.limit = 0; + shopImporter.getDatas(conf[shopImporter.idMethod]); + } + else + { + if (shopImporter.idMethod < shopImporter.nbrMethod) + { + shopImporter.limit += parseInt(shopImporter.nbr_import); + shopImporter.getDatas(conf[shopImporter.idMethod]); + } + else + shopImporter.displayEnd(true); + } + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + $('#steps').html($('#steps').html()+''); + $('#technical_error_feedback').fadeIn('slow'); + $('#checkAndSaveConfig').fadeIn('slow'); + } + }); + } + }, + + truncatTable : function (className) + { + if (!$('#truncat_feedback').length) + { + $('#steps').html($('#steps').html()+''); + $('#truncat_feedback').css('display', ''); + } + + $.ajax({ + type: 'GET', + url: '../modules/shopimporter/ajax.php', + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&token='+this.token+'&truncatTable&className='+className+this.specificOptions , + success: function(jsonData) + { + var jsonError; + if (jsonData.hasError) + { + jsonError = ''; + for (i=0;iTable : '+jsonData.error[i]+''; + $('#truncat_feedback').removeClass('import').addClass('error'); + $('#truncat_feedback >img:first').attr('src', shopImporter.srcError); + if ($('#display_error_truncat_feedback_link').length == 0) + { + $('#truncat_feedback').html($('#truncat_feedback').html()+''+showErrors+''); + } + else + { + var nbrErrors = $('#nbr_errors_'+methodName[0]).html(); + var newNbrError = parseInt(jsonData.error.length) + parseInt(nbrErrors); + $('#nbr_errors_'+methodName[0]).html(newNbrError); + $('#feedback_'+methodName[0]+'_errors_list > ul').html($('#feedback_'+methodName[0]+'_errors_list > ul').html() + jsonError); + } + } + else + { + + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + $('#steps').html($('#steps').html()+''); + $('#technical_error_feedback').fadeIn('slow'); + $('#checkAndSaveConfig').fadeIn('slow'); + } + + }); + }, + + displayEnd : function (finish) + { + + if ((this.hasErrors != 0 || ($('.display_error_link').length == 0 && this.hasErrors == 0)) || (this.hasErrors == 1)) + { + if (this.save) + { + $('#steps').html($('#steps').html()+''); + $('#ok_feedback_end').fadeIn('slow'); + } + else + { + $('#steps').html($('#steps').html()+''); + $('#submitImport').fadeIn('slow', function() { + $(this).unbind('click').click(function() { + $.scrollTo($("#steps"), 300 , { + onAfter:function(){ + $('#steps').html(''); + shopImporter.save = 1; + shopImporter.checkAndSaveConfig(shopImporter.save); + } + }); + }); + }); + } + } + else + { + $('#steps').html($('#steps').html()+''); + $('#technical_error_feedback').fadeIn('slow'); + } + $('#checkAndSaveConfig').fadeIn('slow'); + }, + +}; + + +function enableShowErrors(methodName) +{ + $(document).find('#feedback_'+methodName+'_errors_list').slideToggle(); + return false; +} + +function enableShowErrorsTruncate() +{ + $(document).find('#feedback_truncat_errors_list').slideToggle(); + return false; +} + +function displaySpecificOptions(moduleName, server, user, password, database, prefix) +{ + $.ajax({ + type: 'GET', + url: '../modules/shopimporter/ajax.php', + async: false, + cache: false, + dataType : "html", + data: 'ajax=true&token='+this.token+'&displaySpecificOptions&moduleName='+moduleName+'&server='+ server+'&user='+user+'&password='+password+'&database='+database+'&prefix='+prefix , + success: function(htmlData) + { + if (htmlData != 'not_exist') + { + $('#specificOptionsContent').html(htmlData); + $('#specificOptions').show(); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + alert('TECHNICAL ERROR\nDetails:\nError thrown: ' + XMLHttpRequest + '\n' + 'Text status: ' + textStatus); + } + }); +} +function validateSpecificOptions(moduleName, specificOptions) +{ + $.ajax({ + type: 'GET', + url: '../modules/shopimporter/ajax.php', + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&token='+this.token+'&validateSpecificOptions&moduleName='+moduleName+specificOptions , + success: function(jsonData) + { + var jsonError = ''; + if (jsonData.hasError) + { + for (i=0;i'+jsonData.error[i]+''; + $('#specificOptionsErrors').html('
      '+jsonError+'
    '); + $('#specificOptionsErrors').fadeIn('slow'); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) + { + alert('TECHNICAL ERROR\nDetails:\nError thrown: ' + XMLHttpRequest + '\n' + 'Text status: ' + textStatus); + } + }); + + if ($('#specificOptionsErrors').html().length != 0) + return false; + else + return true; +} + + +$(document).ready(function(){ + + $('#db_input input').each(function () { + $(this).keyup(function () { + $('#steps').fadeOut(200, function () { + $(this).html(''); + $('#steps').fadeIn(); + }); + + + + $('#importOptions').fadeOut('slow'); + $('#displayOptions').show(); + $('#checkAndSaveConfig').show(); + }) + }); + + $('input[name=hasErrors]:radio').change(function () { + if ($(this).val() == 1) + $('#warnSkip').fadeIn('slow'); + else + $('#warnSkip').fadeOut('slow'); + }); + + $('#choose_module_name').unbind('click').click(function(){ + $('#db_config').hide(); + $('#importOptions').hide(); + $('#steps').html(''); + if ($('#import_module_name').attr('value') != 0) + { + $('#db_config').slideDown('slow'); + $('#displayOptions').show(); + $('#checkAndSaveConfig').show(); + } + else + { + $('#db_config').slideUp('slow'); + $('#checkAndSaveConfig').show(); + } + return false; + }); + + $('#displayOptions').unbind('click').click(function(){ + $(this).fadeOut('slow'); + $('#importOptions').slideDown('slow'); + moduleName = $('#import_module_name').val(); + server = $('#server').val(); + user = $('#user').val(); + password = $('#password').val(); + database = $('#database').val(); + prefix = $('#prefix').val(); + displaySpecificOptions(moduleName, server, user, password, database, prefix); + return false; + }); + + $('#checkAndSaveConfig').unbind('click').click(function(){ + $('#steps, #specificOptionsErrors').html(''); + $('#specificOptionsErrors').hide(); + shopImporter.specificOptions = ''; + $('#specificOptionsContent :input').each(function (){ + shopImporter.specificOptions = shopImporter.specificOptions+'&'+$(this).attr('name')+'='+$(this).attr('value'); + }); + shopImporter.imagesOptions = ''; + $('.importImages:input:checked').each(function (){ + shopImporter.imagesOptions = shopImporter.imagesOptions+'&'+$(this).attr('name'); + }); + moduleName = $('#import_module_name').val(); + if (validateSpecificOptions(moduleName, shopImporter.specificOptions) == true) + { + $.scrollTo($("#steps"), 300 , { + onAfter:function(){ + shopImporter.specificOptions = ''; + $('#specificOptionsContent :input').each(function (){ + shopImporter.specificOptions = shopImporter.specificOptions+'&'+$(this).attr('name')+'='+$(this).attr('value'); + }); + shopImporter.idMethod = 0; + shopImporter.limit = 0; + shopImporter.nbr_import = parseInt($('#nbr_import').val()); + shopImporter.save = 0; + shopImporter.moduleName = $('#import_module_name').val(); + shopImporter.server = $('#server').val(); + shopImporter.user = $('#user').val(); + shopImporter.password = $('#password').val(); + shopImporter.database = $('#database').val(); + shopImporter.prefix = $('#prefix').val(); + shopImporter.hasErrors = $('input[name=hasErrors]:radio:checked').val(); + shopImporter.checkAndSaveConfig(shopImporter.save); + return false; + } + }); + } + + }); + + $('#importOptionsYesNo :radio').change( function () { + $('#steps').html(''); + onThing = false; + + $('#importOptionsYesNo :radio:checked').each( function () { + if ($(this).attr('value') == 1) + onThing = true; + }); + if (onThing) + $('#checkAndSaveConfig').fadeIn(); + else + { + $('#checkAndSaveConfig').fadeOut(); + $('#steps').html(''); + $('#one_thing_error_feedback').fadeIn('slow'); + } + }); +}); diff --git a/modules/shopimporter/shopimporter.php b/modules/shopimporter/shopimporter.php new file mode 100644 index 000000000..ff93fa297 --- /dev/null +++ b/modules/shopimporter/shopimporter.php @@ -0,0 +1,1266 @@ +name = 'shopimporter'; + $this->tab = 'migration_tools'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct (); + + $this->displayName = $this->l('Shop Importer'); + $this->description = $this->l('This module allows you to import your shop from another system into Prestashop.'); + $this->supportedImports = array( + 'language' => array('methodName' => 'getLangagues', + 'name' => $this->l('Language'), + 'className' => 'Language', + 'label' => $this->l('Import Languages'), + 'table' => 'lang', + 'identifier' => 'id_lang', + 'alterTable' => array('id_lang' => 'int(10)'), + 'info' => $this->l('New languages will automatically add translations.'), + 'defaultId' => 'PS_LANG_DEFAULT' + ), + 'currency' => array('methodName' => 'getCurrencies', + 'name' => $this->l('Currency'), + 'className' => 'Currency', + 'label' => $this->l('Import Currencies'), + 'table' => 'currency', + 'identifier' => 'id_currency', + 'alterTable' => array('id_currency' => 'int(10)'), + 'delete' => true, + 'defaultId' => 'PS_CURRENCY_DEFAULT' + ), + /* + 'tax' => array('methodName' => 'getTaxes', + 'name' => $this->l('Taxes'), + 'className' => 'Tax', + 'label' => $this->l('Import Taxes'), + 'table' => 'tax', + 'identifier' => 'id_tax', + 'alterTable' => array('id_tax' => 'int(10)'), + 'delete' => true + ), + 'tax_rule' => array('methodName' => 'getTaxes rules', + 'name' => $this->l('Taxes rules'), + 'className' => 'TaxRule', + 'label' => $this->l('Import Taxes Rules'), + 'table' => 'tax_rules_group', + 'identifier' => 'id_tax', + 'alterTable' => array('id_tax_rules_group' => 'int(10)'), + 'delete' => true + ), +*/ + 'zone' => array('methodName' => 'getZones', + 'name' => $this->l('Zone'), + 'className' => 'Zone', + 'label' => $this->l('Import Zones'), + 'table' => 'zone', + 'identifier' => 'id_zone', + 'alterTable' => array('id_zone' => 'int(10)'), + 'delete' => true + ), + 'country' => array('methodName' => 'getCountries', + 'name' => $this->l('Country'), + 'className' => 'Country', + 'label' => $this->l('Import Countries'), + 'table' => 'country', + 'identifier' => 'id_country', + 'foreign_key' => array('id_zone', 'id_currency'), + 'alterTable' => array('id_country' => 'int(10)'), + 'delete' => true, + 'defaultId' => 'PS_COUNTRY_DEFAULT' + ), + 'state' => array('methodName' => 'getStates', + 'name' => $this->l('State'), + 'className' => 'State', + 'label' => $this->l('Import States'), + 'table' => 'state', + 'identifier' => 'id_state', + 'foreign_key' => array('id_zone', 'id_country'), + 'alterTable' => array('id_state' => 'int(10)'), + 'delete' => true + ), + 'group' => array('methodName' => 'getGroups', + 'name' => $this->l('Group'), + 'className' => 'Group', + 'label' => $this->l('Import Groups'), + 'table' => 'group', + 'identifier' => 'id_group', + 'alterTable' => array('id_group' => 'int(10)'), + 'delete' => true, + ), + 'customer' => array('methodName' => 'getCustomers', + 'name' => $this->l('Customer'), + 'className' => 'Customer', + 'label' => $this->l('Import Customers'), + 'table' => 'customer', + 'identifier' => 'id_customer', + 'foreign_key' => array('id_group'), + 'alterTable' => array('id_customer' => 'int(10)', 'passwd' => 'varchar(100)'), + 'delete' => true, + 'association' => array( + array( + 'table' => 'customer_group', + 'fields' => array('id_customer', 'id_group'), + 'matchTable' => array('customer', 'group'), + ) + ) + ), + 'address' => array('methodName' => 'getAddresses', + 'name' => $this->l('Address'), + 'className' => 'Address', + 'label' => $this->l('Import Addresses'), + 'table' => 'address', + 'identifier' => 'id_address', + 'foreign_key' => array('id_country', 'id_state', 'id_customer'), + 'alterTable' => array('id_address' => 'int(10)'), + 'delete' => true + ), + 'manufacturer' => array('methodName' => 'getManufacturers', + 'name' => $this->l('Manufacturer'), + 'className' => 'Manufacturer', + 'label' => $this->l('Import Manufacturers'), + 'table' => 'manufacturer', + 'identifier' => 'id_manufacturer', + 'delete' => true, + 'alterTable' => array('id_manufacturer' => 'int(10)'), + 'hasImage' => true + ), + 'supplier' => array('methodName' => 'getSuppliers', + 'name' => $this->l('Supplier'), + 'className' => 'Supplier', + 'label' => $this->l('Import Suppliers'), + 'table' => 'supplier', + 'identifier' => 'id_supplier', + 'delete' => true, + 'alterTable' => array('id_supplier' => 'int(10)'), + 'hasImage' => true + ), + 'category' => array('methodName' => 'getCategories', + 'name' => $this->l('Category'), + 'className' => 'Category', + 'label' => $this->l('Import Categories'), + 'table' => 'category', + 'identifier' => 'id_category', + 'alterTable' => array('id_category' => 'int(10)'), + 'delete' => true, + 'hasImage' => true, + ), + 'attributegroup' => array('methodName' => 'getAttributesGroups', + 'name' => $this->l('AttributeGroup'), + 'className' => 'AttributeGroup', + 'label' => $this->l('Import Attributes Groups'), + 'table' => 'attribute_group', + 'identifier' => 'id_attribute_group', + 'alterTable' => array('id_attribute_group' => 'int(10)'), + 'delete' => true + ), + 'attribute' => array('methodName' => 'getAttributes', + 'name' => $this->l('Attribute'), + 'className' => 'Attribute', + 'label' => $this->l('Import Attributes'), + 'table' => 'attribute', + 'identifier' => 'id_attribute', + 'alterTable' => array('id_attribute' => 'int(10)'), + 'foreign_key' => array('id_attribute_group'), + 'delete' => true + ), + 'product' => array('methodName' => 'getProducts', + 'name' => $this->l('Product'), + 'className' => 'Product', + 'label' => $this->l('Import Products'), + 'table' => 'product', + 'identifier' => 'id_product', + 'alterTable' => array('id_product' => 'int(10)'), + 'foreign_key' => array('id_category'), + 'delete' => true, + 'association' => array( + array( + 'table' => 'category_product', + 'fields' => array('id_category', 'id_product'), + 'matchTable' => array('category', 'product') + ) + ), + 'hasImage' => true + ), + 'combination' => array('methodName' => 'getProductsCombination', + 'name' => $this->l('Combination'), + 'className' => 'Combination', + 'label' => $this->l('Import Products Combinations'), + 'table' => 'product_attribute', + 'identifier' => 'id_product_attribute', + 'alterTable' => array('id_product_attribute' => 'int(10)', 'id_product' => 'int(10)'), + 'foreign_key' => array('id_product'), + 'delete' => false, + 'association' => array( + array( + 'table' => 'product_attribute_combination', + 'fields' => array('id_attribute', 'id_product_attribute'), + 'matchTable' => array('attribute', 'product_attribute') + ) + ) + ), + 'orderstate' => array('methodName' => 'getOrdersStates', + 'name' => $this->l('Orders States'), + 'className' => 'OrderState', + 'label' => $this->l('Import Orders States'), + 'table' => 'order_state', + 'identifier' => 'id_order_state', + 'alterTable' => array('id_order_state' => 'int(10)') + ), + 'cart' => array('methodName' => 'getOrders', + 'name' => $this->l('Order'), + 'className' => 'Cart', + 'label' => $this->l('Import Orders'), + 'table' => 'cart', + 'identifier' => 'id_cart', + 'foreign_key' => array('id_address_delivery', 'id_address_invoice', 'id_customer'), + 'alterTable' => array('id_cart' => 'int(10)') + ), + 'orderhistory' => array('methodName' => 'getOrdersHistory', + 'name' => $this->l('Order history'), + 'className' => 'Order history', + 'label' => $this->l('Import Order History'), + 'table' => 'order_history', + 'identifier' => 'id_order_history', + 'foreign_key' => array('id_order', 'id_order_state'), + 'alterTable' => array('id_order_history' => 'int(10)'), + 'hidden' => true + ), + 'order' => array('methodName' => 'getOrders', + 'name' => $this->l('Order'), + 'className' => 'Order', + 'label' => $this->l('Import Order History'), + 'table' => 'orders', + 'identifier' => 'id_order', + 'alterTable' => array('id_order' => 'int(10)'), + 'hidden' => true + ) + ); + } + + public function install() + { + return parent::install(); + } + + public function uninstall() + { + return parent::uninstall(); + } + + public function getContent() + { + global $cookie; + $exportModules = parent::getImportModulesOnDisk(); + //get installed module only + foreach($exportModules as $key => $module) + if ($module->name == $this->name OR !(bool)$module->id) + unset($exportModules[$key]); + $html = ' + + + + +
    '.$this->l('Import from another system').' +
    + '.$this->l('Before starting the import please backup your database. ').' + '.$this->l(' Click here to backup').' +
    +
    +
    '; + if (sizeof($exportModules)) + { + $html .= ' + +
    + +
    '; + } + else + $html .= '
    '.$this->l('No import module installed').'
    '; + $html .= ' + +
    '; + return $html; + } + + public function generiqueImport($className, $fields, $save = false) + { + $return = ''; + $json = array(); + $errors = array(); + $json['hasError'] = false; + $json['datas'] = array_values($fields); + $languages = array(); + $defaultLanguage = ''; + $table = $this->supportedImports[strtolower($className)]['table']; + + $object = new $className(); + $rules = call_user_func(array($className, 'getValidationRules'), $className); + + if ((sizeof($rules['requiredLang']) OR sizeof($rules['sizeLang']) OR sizeof($rules['validateLang']) OR Tools::isSubmit('syncLang') OR Tools::isSubmit('syncCurrency'))) + { + $moduleName = Tools::getValue('moduleName'); + if (file_exists('../../modules/'.$moduleName.'/'.$moduleName.'.php')) + { + require_once('../../modules/'.$moduleName.'/'.$moduleName.'.php'); + $importModule = new $moduleName(); + $importModule->server = Tools::getValue('server'); + $importModule->user = Tools::getValue('user'); + $importModule->passwd = Tools::getValue('password'); + $importModule->database = Tools::getValue('database'); + $importModule->prefix = Tools::getValue('prefix'); + $defaultLanguage = new Language((int)Configuration::get('PS_LANG_DEFAULT')); + $languages = $importModule->getLangagues(0); + if (Tools::isSubmit('syncLang')) + { + $defaultIdLand = $importModule->getDefaultIdLang(); + $defaultLanguageImport = new Language(Language::getIdByIso($languages[$defaultIdLand]['iso_code'])); + if ($defaultLanguage->iso_code != $defaultLanguageImport->iso_code) + $errors[] = $this->l('Default language doesn\'t match : ').'
    '.Configuration::get('PS_SHOP_NAME').' : '.$defaultLanguage->name.' ≠ + '.$importModule->displayName.' : '.$defaultLanguageImport->name.'
    '.$this->l('Please change default language in your configuration'); + } + + if (Tools::isSubmit('syncCurrency')) + { + $defaultIdCurrency = $importModule->getDefaultIdCurrency(); + $currencies = $importModule->getCurrencies(0); + if(!empty($currencies[$defaultIdCurrency]['iso_code'])) + $defaultCurrencyImport = new Currency((int)Currency::getIdByIsoCode($currencies[$defaultIdCurrency]['iso_code'])); + else + $defaultCurrencyImport = new Currency((int)Currency::getIdByIsoCodeNum($currencies[$defaultIdCurrency]['iso_code_num'])); + + $defaultCurrency = new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT')); + if ($defaultCurrency->iso_code != $defaultCurrencyImport->iso_code) + $errors[] = $this->l('Default currency doesn\'t match : ').'
    '.Configuration::get('PS_SHOP_NAME').' : '.$defaultCurrency->name.' ≠ '.$importModule->displayName.' : '.$defaultCurrencyImport->name.'
    '.$this->l('Please change default currency in your configuration'); + } + if (!empty($errors)) + die('{"hasError" : true, "error" : '.Tools::jsonEncode($errors).'}'); + } + else + die('{"hasError" : true, "error" : ["FATAL ERROR"], "datas" : []}'); + } + + foreach($fields as $key => $field) + { + $id = $this->supportedImports[strtolower($className)]['identifier']; + //remove wrong fields (ex : id_toto in Customer) + foreach($field as $name => $value) + if (!array_key_exists($name, get_object_vars($object)) AND ($name != $id) AND ($name != 'association') AND ($name != 'images') AND (strtolower($className) != 'cart')) + unset($field[$name]); + $return = $this->validateRules($rules, $field, $className, $languages, $defaultLanguage); + $fields[$key] = $field; + if (!empty($return)) + { + //skip mode + if (Tools::getValue('hasErrors') == 1) + unset($fields[$key]); + + $errors[] = $return; + array_unshift($errors[sizeof($errors)-1], $field[$id]); + } + } + if (sizeof($errors) > 0) + { + $json['hasError'] = true; + $json['error'] = $errors; + } + if ($save OR Tools::isSubmit('syncLang')) + { + //add language if not exist in prestashop + if ($className == 'Language') + { + if (Tools::isSubmit('syncLang')) + $add = true; + else + $add = false; + $errors = $this->checkAndAddLang($fields, $add); + } + elseif ($className == 'Cart') + { + $this->saveOrders($fields); + } + else + { + $return = $this->saveObject($className, $fields); + $this->cleanPositions($table); + //insert association + if (array_key_exists('association', $this->supportedImports[strtolower($className)])) + $this->insertAssociation(strtolower($className), $fields); + if (!empty($return)) + { + $json['hasError'] = true; + $json['error'] = $return; + } + } + if ($className == 'Category' AND (sizeof($fields) != (int)Tools::getValue('nbr_import'))) + $this->updateCat(); + } + if (sizeof($errors) > 0 AND is_array($errors)) + { + $json['hasError'] = true; + $json['error'] = $errors; + } + die(Tools::jsonEncode($json)); + } + + private function saveObject($className, $items) + { + $return = array(); + $table = $this->supportedImports[strtolower($className)]['table']; + //creating temporary fields for identifiers matching and password + if (array_key_exists('alterTable', $this->supportedImports[strtolower($className)])) + $this->alterTable(strtolower($className)); + foreach($items as $item) + { + $object = new $className; + $id = $item[$this->supportedImports[strtolower($className)]['identifier']]; + if (array_key_exists('foreign_key', $this->supportedImports[strtolower($className)])) + $this->replaceForeignKey($item, $table); + $matchIdLang = $this->getMatchIdLang(1); + foreach($item as $key => $val) + { + if ($key == 'passwd') + { + $password = $val; + $val = substr($val,0,29); + } + if (is_array($val) AND $key != 'images') + { + + foreach($matchIdLang as $k => $v) + if ($k != $v) + { + $item[$key][$v] = $val[$k]; + unset($item[$key][$k]); + } + $object->$key = $item[$key]; + } + else + $object->$key = $val; + } + if (!$object->save(false, false)) + $return[] = array($item[$this->supportedImports[strtolower($className)]['identifier']], $this->l('An error occurred when adding the object')); + else + { + $this->saveMatchId(strtolower($className), (int)$object->id, (int)$id); + if ($className == 'Customer') + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'customer SET passwd_'.Tools::getValue('moduleName').' = \''.$password.'\' WHERE id_customer = '.(int)$object->id); + if (array_key_exists('hasImage', $this->supportedImports[strtolower($className)]) AND Tools::isSubmit('images_'.$className)) + $this->copyImg($item, $className); + } + } + return $return; + } + + private function saveOrders($items) + { + $this->saveObject('cart', $items); + //import cart product + $foreignKey = $this->getForeignKey('Cart', array('id_cart', 'id_product', 'id_product_attribute', 'id_customer','id_address_invoice', 'id_address_delivery')); + foreach($items as &$item) + { + foreach($item['cart_products'] as $k => $cart_products) + { + foreach($cart_products as $key => $val) + if (array_key_exists($key, $foreignKey)) + if (array_key_exists($val, $foreignKey[$key])) + $item['cart_products'][$k][$key] = $foreignKey[$key][$val]; + else + $item['cart_products'][$k][$key] = 0; + Db::getInstance()->autoExecute(_DB_PREFIX_.'cart_product', $item['cart_products'][$k],'INSERT'); + } + foreach($item['order_products'] as $k => $order_products) + { + foreach($order_products as $key => $val) + if (array_key_exists($key, $foreignKey)) + if (array_key_exists($val, $foreignKey[$key])) + $item['order_products'][$k][$key] = $foreignKey[$key][$val]; + else + $item['order_products'][$k][$key] = 0; + } + } + //cart to order + $this->cartToOrder($items, $foreignKey); + $foreignKey = array_merge($this->getForeignKey('Cart', array('id_order', 'id_order_state')), $foreignKey); + foreach($items as &$item) + { + //insert product in order detail + foreach($item['order_products'] as $k => $order_products) + { + foreach($order_products as $key => $val) + if (array_key_exists($key, $foreignKey)) + if (array_key_exists($val, $foreignKey[$key])) + $item['order_products'][$k][$key] = $foreignKey[$key][$val]; + else + $item['order_products'][$k][$key] = 0; + Db::getInstance()->autoExecute(_DB_PREFIX_.'order_detail', $item['order_products'][$k],'INSERT'); + } + //save order history + foreach($item['order_history'] as $k => $order_history) + { + foreach($order_history as $key => $val) + if (array_key_exists($key, $foreignKey)) + if (array_key_exists($val, $foreignKey[$key])) + $item['order_history'][$k][$key] = $foreignKey[$key][$val]; + else + $item['order_history'][$k][$key] = 0; + + Db::getInstance()->autoExecute(_DB_PREFIX_.'order_history', $item['order_history'][$k],'INSERT'); + } + } + } + + private function insertAssociation($table, $items) + { + foreach($this->supportedImports[$table]['association'] AS $association) + { + $associatFields = ''; + $associatFieldsName = implode('`, `', $association['fields']); + $tableAssociation = $association['table']; + $matchTable = $association['matchTable']; + if (!empty($items)) + { + $match = array(); + foreach($matchTable as $mTable) + { + $tmp = $this->getForeignKey($mTable, array('id_'.$mTable)); + if (array_key_exists('id_'.$mTable, $tmp)) + $match['id_'.$mTable] = $tmp['id_'.$mTable]; + else + $match['id_'.$mTable] = $this->getDefaultId($table); + } + foreach($items AS $item) + foreach($item AS $key => $val) + if ($key == 'association' AND !empty($key)) + foreach($val[$tableAssociation] AS $k => $v) + { + $associatFields .= ' ('.((array_key_exists($k, $match[$association['fields'][0]])) ? (int)$match[$association['fields'][0]][$k] : '1').', '; + $associatFields .= (int)$match[$association['fields'][1]][$v].'), '; + } + if ($associatFields != '') + Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.pSQL($tableAssociation).'` (`'.$associatFieldsName.'`) VALUES '.rtrim($associatFields, ', ')); + } + } + } + + private function saveMatchId($className, $psId, $matchId) + { + $table = $this->supportedImports[$className]['table']; + $moduleName = Tools::getValue('moduleName'); + $identifier = $this->supportedImports[$className]['identifier']; + Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.pSQL($table).' SET `'.pSQL($identifier).'_'.pSQL($moduleName).'` = '.(int)$matchId.' WHERE `'.pSQL($identifier).'` = '.(int)$psId); + } + + private function getMatchId($className) + { + $table = $this->supportedImports[$className]['table']; + $moduleName = Tools::getValue('moduleName'); + $identifier = $this->supportedImports[$className]['identifier']; + $returns = Db::getInstance()->ExecuteS('SELECT `'.pSQL($identifier).'_'.pSQL($moduleName).'`, `'.pSQL($identifier).'` FROM '._DB_PREFIX_.pSQL($table).' WHERE `'.pSQL($identifier).'_'.pSQL($moduleName).'` != 0 '); + $match = array(); + foreach($returns as $return) + $match[$return[$identifier.'_'.$moduleName]] = $return[$identifier]; + return $match; + } + + private function getDefaultId($table) + { + $defaultId = 1; + if (array_key_exists('defaultId', $this->supportedImports[strtolower($table)])) + $defaultId = Configuration::get($this->supportedImports[strtolower($table)]['defaultId']); + return $defaultId; + } + + private function copyImg($item, $className) + { + require_once('../../images.inc.php'); + $identifier = $this->supportedImports[strtolower($className)]['identifier']; + $matchId = $this->getMatchId(strtolower($className)); + $matchIdLang = $this->getMatchIdLang(); + switch($className) + { + default: + case 'Product': + $path = _PS_PROD_IMG_DIR_; + $type = 'products'; + break; + case 'Category': + $path = _PS_CAT_IMG_DIR_; + $type = 'categories'; + break; + case 'Manufacturer': + $path = _PS_MANU_IMG_DIR_; + $type = 'manufacturers'; + break; + case 'Supplier': + $path = _PS_SUPP_IMG_DIR_; + $type = 'suppliers'; + break; + } + $cover = 1; + if (array_key_exists($item[$identifier], $matchId)) + foreach($item['images'] as $key => $image) + { + $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'import'); + if (@copy($image, $tmpfile)) + { + + $imagesTypes = ImageType::getImagesTypes($type); + imageResize($tmpfile, $path.(int)$matchId[$item[$identifier]].'.jpg'); + if ($className == 'Product') + { + $image = new Image(); + $image->id_product = (int)($matchId[$item[$identifier]]); + $image->cover = $cover; + $image->position = Image::getHighestPosition((int)$matchId[$item[$identifier]]) + 1; + $legend = array(); + foreach($item['name'] as $key => $val) + if (array_key_exists($key, $matchIdLang)) + $legend[$matchIdLang[$key]] = Tools::link_rewrite($val); + else + $legend[Configuration::get('PS_LANG_DEFAULT')] = Tools::link_rewrite($val); + $image->legend = $legend; + $image->add(); + imageResize($tmpfile, $path.(int)$matchId[$item[$identifier]].'-'.(int)$image->id.'.jpg'); + foreach ($imagesTypes AS $k => $imageType) + imageResize($tmpfile, $path.(int)$matchId[$item[$identifier]].'-'.(int)$image->id.'-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height']); + } + else + foreach ($imagesTypes AS $k => $imageType) + imageResize($tmpfile, $path.(int)$matchId[$item[$identifier]].'-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height']); + } + else + @unlink($tmpfile); + @unlink($tmpfile); + $cover = 0; + } + + } + + private function replaceForeignKey(&$item, $table) + { + if ($table == 'product_attribute') + $table2 = 'combination'; + else + $table2 = $table; + + $foreingKey = $this->supportedImports[$table2]['foreign_key']; + $foreingKeyValue = $this->getForeignKey($table, $foreingKey); + foreach($foreingKey as $key) + { + if ($table == 'product' AND $key == 'id_category') + $key2 = 'id_category_default'; + else if ($table == 'customer' AND $key == 'id_group') + $key2 = 'id_default_group'; + else + $key2 = $key; + if (array_key_exists($key, $foreingKeyValue) && $item[$key2] != 0) + $item[$key2] = (array_key_exists($item[$key2], $foreingKeyValue[$key]) ? $item[$key2] = $foreingKeyValue[$key][$item[$key2]] : $item[$key2] = 0); + else + $item[$key2] = $this->getDefaultId($table); + } + } + + private function alterTable($className) + { + $query =''; + $queryTmp = ''; + $from = $this->supportedImports[$className]['table']; + $result = array(); + $result = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.pSQL($from).'`'); + if (!$result) + $result = array(); + foreach ($this->supportedImports[$className]['alterTable'] AS $name => $type) + { + $moduleName = Tools::getValue('moduleName'); + if (!array_key_exists($name.'_'.$moduleName, $result)) + $queryTmp .= ' ADD `'.$name.'_'.$moduleName.'` '.$type.' NOT NULL,'; + } + if (!empty($queryTmp)) + { + $query = 'ALTER TABLE `'._DB_PREFIX_.pSQL($from).'` '; + $query .= rtrim($queryTmp, ','); + Db::getInstance()->Execute($query); + } + } + + private function updateCat() + { + $moduleName = Tools::getValue('moduleName'); + Db::getInstance()->Execute('UPDATE + '._DB_PREFIX_.'category c + INNER JOIN + '._DB_PREFIX_.'category c2 + ON + c.id_parent = c2.id_category_'.pSQL($moduleName).' + SET + c.id_parent = c2.id_category + WHERE c.id_category_'.pSQL($moduleName).' != 0'); + $category = new Category(); + $cats = $category->getSimpleCategories((int)Configuration::get('PS_LANG_DEFAULT')); + foreach($cats as $cat) + { + $cat = new Category((int)$cat['id_category']); + $cat->level_depth = $cat->calcLevelDepth(); + $cat->update(); + } + } + + private function getForeignKey($className, $foreign_key = null) + { + $moduleName = Tools::getValue('moduleName'); + if (is_null($foreign_key)) + $foreign_key = $this->supportedImports[$className]['foreign_key']; + $match = array(); + foreach($foreign_key AS $key) + { + if (in_array($key , array('id_address_invoice', 'id_address_delivery'))) + $key2 = 'id_address'; + elseif (in_array($key , array('id_category_default'))) + $key2 = 'id_category'; + else + $key2 = $key; + foreach($this->supportedImports AS $table => $conf) + if ($conf['identifier'] == $key2) + $from = $this->supportedImports[$table]['table']; + $return = Db::getInstance()->ExecuteS('SELECT `'.pSQL($key2).'_'.pSQL($moduleName).'`, `'.pSQL($key2).'` FROM `'._DB_PREFIX_.pSQL($from).'` WHERE `'.pSQL($key2).'_'.pSQL($moduleName).'` != 0'); + if (!empty($return)) + foreach($return AS $name => $val) + $match[$key][$val[$key2.'_'.$moduleName]] = $val[$key2]; + } + return $match; + } + + private function getForeignKeyLang($table) + { + $id = $this->supportedImports[$table]['identifier']; + $moduleName = Tools::getValue('moduleName'); + $return = Db::getInstance()->ExecuteS('SELECT `'.pSQL($id).'_'.pSQL($moduleName).'`, `'.pSQL($id).'` FROM `'._DB_PREFIX_.pSQL($table).'` WHERE `'.pSQL($id).'_'.pSQL($moduleName).'` != 0'); + $match = array(); + foreach($return AS $name => $val) + $match[$val[$id.'_'.$moduleName]] = $val[$id]; + return $match; + } + + private function getMatchIdLang($order = 1) + { + $moduleName = Tools::getValue('moduleName'); + $return = Db::getInstance()->ExecuteS('SELECT `id_lang`, `id_lang_'.pSQL($moduleName).'` FROM `'._DB_PREFIX_.'lang'.'` WHERE `id_lang_'.pSQL($moduleName).'` != 0'); + $match = array(); + foreach($return AS $name => $val) + if ((bool)$order) + $match[$val['id_lang_'.$moduleName]] = $val['id_lang']; + else + $match[$val['id_lang']] = $val['id_lang_'.$moduleName]; + return $match; + } + + + private function validateRules($rules, &$fields, $className, $languages, $defaultLanguage) + { + $returnErrors = array(); + $hasErrors = Tools::getValue('hasErrors'); + /* Checking for required fields */ + foreach ($rules['required'] AS $field) + if (($value = $fields[$field]) == false AND (string)$value != '0') + if ($hasErrors == 2) + { + if (array_key_exists($field, $rules['size'])) + $size = $rules['size'][$field]; + else + $size = 1; + $fields[$field] = $this->generateData($size, $rules['validate'][$field]); + } + else + $returnErrors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $field, $className).' '.$this->l('is required'); + + /* Checking for maximum fields sizes */ + foreach ($rules['size'] AS $field => $maxLength) + if (array_key_exists($field, $fields) AND $field != 'passwd') + if ($fields[$field] !== false AND Tools::strlen($fields[$field]) > $maxLength) + if ($hasErrors == 2) + $fields[$field] = substr($fields[$field], 0, $maxLength); + else + $returnErrors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $field, $className).''.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')'; + + /* Checking for fields validity */ + foreach ($rules['validate'] AS $field => $function) + if (array_key_exists($field, $fields)) + if (($value = $fields[$field]) !== false AND ($field != 'passwd')) + if (!Validate::$function($value)) + if ($hasErrors == 2) + { + if (array_key_exists($field, $rules['size'])) + $size = $rules['size'][$field]; + else + $size = 1; + $fields[$field] = $this->generateData($size, $rules['validate'][$field]); + } + else + $returnErrors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $field, $className).' '.$this->l('is invalid'); + + if ((sizeof($rules['requiredLang']) OR sizeof($rules['sizeLang']) OR sizeof($rules['validateLang']))) + { + $matchIdLang = $this->getMatchIdLang(0); + /* Checking for multilingual required fields */ + foreach ($rules['requiredLang'] AS $fieldLang) + { + if (($empty = $fields[$fieldLang][$matchIdLang[$defaultLanguage->id]]) === false OR empty($empty)) + if ($hasErrors == 2) + { + if (array_key_exists($fieldLang, $rules['sizeLang'])) + $size = $rules['sizeLang'][$fieldLang]; + else + $size = 1; + $fields[$fieldLang][$matchIdLang[$defaultLanguage->id]] = $this->generateData($size, $rules['validateLang'][$fieldLang]); + } + else + $returnErrors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' '.$this->l('is required at least in').' '.$defaultLanguage->name; + } + /* Checking for maximum multilingual fields size */ + foreach ($rules['sizeLang'] AS $fieldLang => $maxLength) + foreach ($languages AS $language) + if (isset($fields[$fieldLang][$language['id_lang']]) && $fields[$fieldLang] !== false AND Tools::strlen($fields[$fieldLang][$language['id_lang']]) > $maxLength) + if ($hasErrors == 2) + $fields[$fieldLang] = substr($fields[$fieldLang], 0, $maxLength); + else + $returnErrors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].') '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')'; + /* Checking for multilingual fields validity */ + foreach ($rules['validateLang'] AS $fieldLang => $function) + foreach ($languages AS $language) + { + if (array_key_exists($fieldLang, $fields) AND ($value = $fields[$fieldLang][$language['id_lang']]) !== false AND !empty($value)) + { + if (!Validate::$function($value)) + if ($hasErrors == 2) + { + if (array_key_exists($fieldLang, $rules['sizeLang'])) + $size = $rules['sizeLang'][$fieldLang]; + else + $size = 1; + $fields[$fieldLang][$language['id_lang']] = $this->generateData($size, $rules['validateLang'][$fieldLang]); + } + else + $returnErrors[] = $this->l('the field').' '.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].') '.$this->l('is invalid'); + } + } + } + return $returnErrors; + } + + public function checkAndAddLang ($languages, $add = true) + { + $errors = ''; + $moduleName = Tools::getValue('moduleName'); + $this->alterTable('language'); + foreach($languages as $language) + { + $iso = $language['iso_code']; + if (!Language::isInstalled($iso)) + { + if ($add) + { + if (@fsockopen('www.prestashop.com', 80)) + { + if ($lang_pack = Tools::jsonDecode(Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_language_pack.php?version='._PS_VERSION_.'&iso_lang='.$iso))) + { + if ($content = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/gzip/'.$lang_pack->version.'/'.$iso.'.gzip')) + { + $file = _PS_TRANSLATIONS_DIR_.$iso.'.gzip'; + if (file_put_contents($file, $content)) + { + require_once('../../tools/tar/Archive_Tar.php'); + $gz = new Archive_Tar($file, true); + if ($gz->extract(_PS_TRANSLATIONS_DIR_.'../', false)) + { + if (!Language::checkAndAddLanguage($iso)) + $errors[] = Tools::displayError('Archive cannot be extracted.'); + else + { + $newId = Language::getIdByIso($iso); + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'lang` + SET `id_lang_'.pSQL($moduleName).'` = '.(int)$language['id_lang'].' + WHERE `id_lang` = '.(int)$newId); + } + } + $errors[] = Tools::displayError('Archive cannot be extracted.'); + } + else + $errors[] = Tools::displayError('Server does not have permissions for writing.'); + } + else + $errors[] = Tools::displayError('Language not found'); + } + else + $errors[] = Tools::displayError('archive cannot be downloaded from prestashop.com.'); + } + else + $errors[] = Tools::displayError('archive cannot be downloaded from prestashop.com.'); + } + } + else + { + $newId = Language::getIdByIso($iso); + Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'lang` + SET `id_lang_'.pSQL($moduleName).'` = '.(int)$language['id_lang'].' + WHERE `id_lang` = '.(int)$newId); + } + } + } + + public function truncateTable($table) + { + switch ($table) + { + case 'customer' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'customer'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'customer_group'); + break; + case 'address' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'address'); + break; + case 'category' : + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category` WHERE id_category != 1'); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_lang` WHERE id_category != 1'); + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.'category` AUTO_INCREMENT = 2 '); + foreach (scandir(_PS_CAT_IMG_DIR_) AS $d) + if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $d)) + unlink(_PS_CAT_IMG_DIR_.$d); + Image::clearTmpDir(); + break; + case 'product' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'product'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'feature_product'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_lang'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'category_product'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_tag'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'image'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'image_lang'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_combination'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'specific_price'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'specific_price_priority'); + + Image::deleteAllImages(_PS_PROD_IMG_DIR_); + Image::clearTmpDir(); + break; + case 'Manufacturers' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'manufacturer_lang'); + foreach (scandir(_PS_MANU_IMG_DIR_) AS $d) + if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $d)) + unlink(_PS_MANU_IMG_DIR_.$d); + Image::clearTmpDir(); + break; + case 'Suppliers' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'supplier_lang'); + foreach (scandir(_PS_SUPP_IMG_DIR_) AS $d) + if (preg_match('/^[0-9]+(\-(.*))?\.jpg$/', $d)) + unlink(_PS_SUPP_IMG_DIR_.$d); + Image::clearTmpDir(); + break; + case 'attribute' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_lang'); + break; + case 'attributegroup' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group'); + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group_lang'); + break; + case 'currency' : + case 'customer' : + case 'zone' : + case 'state' : + case 'group' : + Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.pSQL($table)); + break; + } + return true; + } + + public function cleanPositions($table) + { + if($table == 'category') + { + //clean category position + $cat = Category::getCategories(1, false, false); + foreach($cat AS $i => $categ) + Category::cleanPositions((int)($categ['id_category'])); + } + if($table == 'product') + { + //clean products position + $cat = Category::getCategories(1, false, false); + foreach($cat AS $i => $categ) + Product::cleanPositions((int)($categ['id_category'])); + } + } + + public function getDefaultIdLang() + { + return; + } + + private function generateData($size = 1, $type) + { + $type = str_replace('is', '', $type); + $dom = array('com', 'net', 'org', 'biz', 'info'); + $alphaNum = '0123456789abcdefghijklmnopqrstuvwxyz'; + $alpha = 'abcdefghijklmnopqrstuvwxyz'; + $num = '0123456789'; + $return = ''; + switch($type) + { + case 'CityName': + case 'Name': + case 'GenericName': + case 'CatalogName': + case 'Address': + case 'LinkRewrite': + case 'String': + $a = mt_rand($size/2, $size); + for ($i = 1; $i <= $a; $i++) + $return .= substr($alpha, mt_rand(0, strlen($alpha)), 1); + break; + case 'LanguageIsoCode': + for ($i = 1; $i <= 2; $i++) + $return .= substr($alpha, mt_rand(0, strlen($alpha)), 1); + break; + case 'LanguageCode': + for ($i = 1; $i <= 2; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + $return .= '-'; + for ($i = 1; $i <= 2; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + break; + case 'Bool': + $return .= mt_rand(0,1); + break; + case 'Int': + case 'UnsignedId': + case 'NumericIsoCode': + case 'PhoneNumber': + case 'PostCode': + $a = mt_rand($size/2, $size); + for ($i = 1; $i <= $a; $i++) + $return .= substr($num, mt_rand(0, strlen($num)), 1); + break; + case 'Price': + case 'Float': + $a = mt_rand(4, 10); + $b = mt_rand(4, 10); + for ($i = 1; $i <= $a; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + $return .= '-'; + for ($i = 1; $i <= $b; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + $return .= '.'.$dom[mt_rand(0, (sizeof($dom)-1))]; + break; + case 'ZipCodeFormat'; + $str = 'NLC -'; + $a = mt_rand($size/2, $size); + for ($i = 1; $i <= $a; $i++) + $return .= substr($str, mt_rand(0, strlen($str)), 1); + break; + case 'StateIsoCode'; + + break; + case 'Email': + $a = mt_rand(4, 10); + $b = mt_rand(4, 10); + for ($i = 1; $i <= $a; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + $return .= '@'; + for ($i = 1; $i <= $b; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + $return .= '.'.$dom[mt_rand(0, (sizeof($dom)-1))]; + break; + case 'Passwd': + $a = mt_rand($size/2, $size); + for ($i = 1; $i <= $a; $i++) + $return .= substr($alphaNum, mt_rand(0, strlen($alphaNum)), 1); + break; + case 'BirthDate': + $return .= '1970-01-01 00:00:00'; + break; + } + return $return; + } + + private function cartToOrder($items, $foreignKey) + { + $this->alterTable('order'); + foreach($items as $item) + { + $order = new Order(); + $order->id_carrier = (int)$item['id_carrier']; + $order->id_customer = (int)$foreignKey['id_customer'][$item['id_customer']]; + $order->id_address_invoice = (int)$foreignKey['id_address_invoice'][$item['id_address_invoice']]; + $order->id_address_delivery = (int)$foreignKey['id_address_delivery'][$item['id_address_delivery']]; + + $vat_address = new Address((int)$foreignKey['id_address_delivery'][$item['id_address_delivery']]); + $id_zone = Address::getZoneById((int)$vat_address->id); + $order->id_currency = (int)$item['id_currency']; + $order->id_lang = (int)$item['id_lang']; + $order->id_cart = (int)$foreignKey['id_cart'][$item['id_cart']]; + + $customer = new Customer((int)$order->id_customer); + $order->secure_key = pSQL($customer->secure_key); + if (!strlen(trim($item['payment']))) + $order->payment = 'payment'.Tools::getValue('moduleName'); + else + $order->payment = utf8_encode(html_entity_decode(strip_tags(Tools::substr($item['payment'], 0, 32)))); + if (isset($this->name)) + $order->module = $this->name; + + $currency = new Currency($order->id_currency); + $order->conversion_rate = $currency->conversion_rate; + $order->total_products = (float)$item['total_products']; + $order->total_products_wt = (float)$item['total_products_wt']; + $order->total_discounts = (float)$item['total_discounts']; + $order->total_shipping = (float)$item['total_shipping']; + $order->carrier_tax_rate = (float)Tax::getCarrierTaxRate((int)$item['id_carrier'], (int)$item[Configuration::get('PS_TAX_ADDRESS_TYPE')]); + $order->total_wrapping = (float)$item['total_wrapping']; + $order->total_paid = (float)$item['total_paid']; + $order->total_paid_real = (float)$item['total_paid_real']; + $order->invoice_date = '0000-00-00 00:00:00'; + $order->delivery_date = '0000-00-00 00:00:00'; + $order->save(false, false); + + $this->saveMatchId('order', (int)$order->id, (int)$item['id_cart']); + } + } +} + +?> diff --git a/modules/socolissimo/ajax.php b/modules/socolissimo/ajax.php new file mode 100644 index 000000000..46110791c --- /dev/null +++ b/modules/socolissimo/ajax.php @@ -0,0 +1,19 @@ +getDeliveryInfos($cookie->id_cart,$cookie->id_customer); +if (!$result) + die('{"result" : false}'); +else + die('{"result" : true}'); +?> \ No newline at end of file diff --git a/modules/socolissimo/config.xml b/modules/socolissimo/config.xml new file mode 100755 index 000000000..e8508f088 --- /dev/null +++ b/modules/socolissimo/config.xml @@ -0,0 +1,12 @@ + + + socolissimo + + + + + + 1 + 1 + fr + \ No newline at end of file diff --git a/modules/socolissimo/de.php b/modules/socolissimo/de.php new file mode 100644 index 000000000..38089e3eb --- /dev/null +++ b/modules/socolissimo/de.php @@ -0,0 +1,89 @@ +socolissimo_42ab10dea7d96b9c353e0f5bae43ec20'] = 'So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_27d52fec98c204daecd4c4df2b8e11fa'] = 'Bieten Sie Ihren Kunden unterschiedliche Liefermethoden mit LaPoste.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f8e355b97fa1be7a8d8c206aa66f0077'] = '\'Lieferzone(n)\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_690c1c6abf905b88281a7cd324af9942'] = '\'Liefergruppe\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a18ef2e8b3730915798057a50ecbf2cd'] = '\'beste Lieferanten\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_59f26c70c0230e4ec5e4acdfed0e270c'] = '\'Lieferant Lieferpreis\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_798547c41ec3e64e2322df678e939344'] = '\'Id FO\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_ac08649aa09ff3b879525627bf086dd1'] = '\'Schlüssel\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a3a53f075adf77334cc34d0f7497ff44'] = '\'URL So\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_4d470fde8487e755a50e9235e3dc13ab'] = 'muss konfiguriert sein, um dieses Modul richtig zu nutzen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_94c614a9df45ea1fcd27b15b7d6f3e67'] = 'Ungültiger Schlüssel'; +$_MODULE['<{socolissimo}prestashop>socolissimo_90a5cb3d07bb39bbd4b76f7f9a0d7947'] = 'Ein Fehler ist beim Abschnitt Versand aufgetreten '; +$_MODULE['<{socolissimo}prestashop>socolissimo_70b2e65f0f2aabf3e2c58d70cf1e1e9a'] = 'Login FO fehlt'; +$_MODULE['<{socolissimo}prestashop>socolissimo_2b639b851983a24bc12358523861c7ff'] = 'Login FO falsch'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ca12228b5ad636c637425a086fe0092'] = 'Kunden unberechtigt'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0b1d0c0a00cc2727fcd77902867e3641'] = 'Pflichtfeld fehlt'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fa419073252af9d022afe65dccbb34a2'] = 'Fehlende Signatur'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fca3fbced675f75182786525bf4706dc'] = 'Ungültige Signatur'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d14afc3f67d2457d29f0aa0db98e2c9d'] = 'Postleitzahl ungültig'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f9733e52e8841f1e45d015d5af5e8655'] = 'Falsches URL-Format zurück Bestätigung'; +$_MODULE['<{socolissimo}prestashop>socolissimo_417434a4e55adbc67c9c391902cea7f3'] = 'Falsches URL-Format zurück Fehler'; +$_MODULE['<{socolissimo}prestashop>socolissimo_140c34f0b21b932e34d11575509d093b'] = 'Ungültige Transaktions-ID'; +$_MODULE['<{socolissimo}prestashop>socolissimo_28ee1015b475a3a70613ea9c98d712b6'] = 'Format falsch Versandkosten'; +$_MODULE['<{socolissimo}prestashop>socolissimo_afa50e8b2fc14bf578331b2b8e98179d'] = 'Socolissimo Server nicht verfügbar'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Beschreibung'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d0b34d3e1cb0cc1150ae6bf650e9b569'] = 'SoColissimo ist ein Service von La Poste, der Ihren Käufern 5 Zustellungsarten anbietet'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e5c7c47a2cc967ae4834ad5c076734df'] = 'Nach Hause'; +$_MODULE['<{socolissimo}prestashop>socolissimo_05ded48a069b0390fd4609e103eec154'] = 'Nach Hause nach Terminvereinbarung'; +$_MODULE['<{socolissimo}prestashop>socolissimo_402c04ef2c99ebccbc8fb047bb7a1185'] = 'zum Cityssimo Abholpunkt'; +$_MODULE['<{socolissimo}prestashop>socolissimo_45b080bdf4c705a1e4cd664da70bf41c'] = 'In ihr Büro'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e6fb019213dbc66e25bef9d25b889eed'] = 'Zu ihrem Händler'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9fbff0971c06ee404f638e9abcbd9446'] = 'Dieses Modul ist kostenlos und ermöglicht Ihnen das Aktivieren dieses Angebot in Ihrem Shop.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_5b6cf869265c13af8566f192b4ab3d2a'] = 'Dokumentation'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0ab984d91ab0a037bdf692bf0e73c349'] = 'Wichtig'; +$_MODULE['<{socolissimo}prestashop>socolissimo_58f73ae759adc826a9e15e26280cdaa4'] = 'Um Ihr SoColissimo-Konto zu eröffnen, kontaktieren Sie bitte \"La Poste\" unter dieser Rufnummer: 3634 (Französische Telefonnummer)'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9c85d4c2bae6ab548fe23e57bd89ddc4'] = 'ID So'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7b95472e0575adc1e3d90a2d7b51e496'] = 'Benutzer-Id für das SoColissimo Backoffice.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_897356954c2cd3d41b221e3f24f99bba'] = 'Schlüssel'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fe78e0a947bf1e0c9e0d9485f40e69cb'] = 'Sicherheitsschlüssel für das SoColissimo Backoffice.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_64979b52d796defbdf05356df9e37d57'] = 'Vorbereitungszeit'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c76660d589be9a49e8846e51b71744ae'] = 'Tag (e)'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1fb031ceef337d6c513315dc5ec98a27'] = 'Durchschnittliche Zeit der Sendungsvorbereitung.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e986d627f454602880075fe556378073'] = 'Die durchschnittliche Zeit muss die gleiche sein im ColiPoste Back Office.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_31e3fd47be6f64fb2e0a4f85cb63a069'] = 'Mehraufwendungen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a68e8fd6d255edb0ca099c7400252694'] = 'Zusätzliche Kosten bei Terminvereinbarungen.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d38ac03101faea9ed5f9ea96bf8627b4'] = 'Zusätzliche Kosten müssen die gleichen im ColiPoste Back Office sein.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9954970bc5804ff557ced19516e2a55c'] = 'Seien Sie SEHR VORSICHTIG mit diesen Einstellungen, Änderungen können zu einer Fehlfunktion des Moduls führen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b0b2896e75025245cbb05e96bd1466d6'] = 'Url So'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce88aabea3b363c753b02ddcb2fbafff'] = 'URL des SoColissimo Backoffice.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_85068ddf0b9bcbb6913008356fe328a0'] = 'Kontrolle'; +$_MODULE['<{socolissimo}prestashop>socolissimo_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Aktiviert'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b9f5c797ebbf55adccdd8539a65a0241'] = 'Deaktiviert'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fdd526b84abc0b8fc17060e62d022b84'] = 'Verfügbarkeit von Service SoColissimo erlauben oder nicht erlauben '; +$_MODULE['<{socolissimo}prestashop>socolissimo_32996bdf4214d6cb8bf7fa02273813c8'] = 'URL Kontrolle'; +$_MODULE['<{socolissimo}prestashop>socolissimo_995a56aecac4198b9bc0a17a976561b5'] = 'URL der Kontrolle'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c9cc8cce247e49bae79f15173ce97354'] = 'Speichern'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{socolissimo}prestashop>socolissimo_3e387f5ebd657c6372f0594c8226863e'] = 'Hier sind zwei Adressen, die Sie in Ihrem Back Office SoColissimo ausfüllen müssen '; +$_MODULE['<{socolissimo}prestashop>socolissimo_49977cbb6772deeac9ceb89f069e491c'] = 'Bestätigungs-URL '; +$_MODULE['<{socolissimo}prestashop>socolissimo_06dc3f24f73027164d2b19556118624e'] = 'Rückgabe-URL'; +$_MODULE['<{socolissimo}prestashop>socolissimo_82c440defe28e2099cba1af1f0761807'] = 'ID SO nicht angegeben'; +$_MODULE['<{socolissimo}prestashop>socolissimo_826361881cfc18b8b75405d398f633b5'] = 'Key SO nicht angegeben'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0bf6a620e5f22d8b46e3903a993f7741'] = 'Vorbereitungszeit nicht angegeben'; +$_MODULE['<{socolissimo}prestashop>socolissimo_228485c5faff886fa4520323dc5b2c76'] = 'Ungültige Vorbereitungszeit '; +$_MODULE['<{socolissimo}prestashop>socolissimo_c3288acdf9ecd0a4fb1e308442b06867'] = 'Mehraufwendungen nicht angegeben'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1a89bc7d83f6e90b2368e3401690a87a'] = 'Ungültige Mehraufwendungen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{socolissimo}prestashop>socolissimo_126d781eae70fa41e9e848f3013e1799'] = 'Kann Einstellungen nicht speichern'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ea4eac85d1d1967562869cf1e14b1d0'] = 'Klicken Sie auf eine Liefermethode, um SoColissimo auszuwählen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_201bdb87f8e278b943d07ae924d5de6e'] = 'Liefermodus'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce26601dac0dea138b7295f02b7620a7'] = 'Kunde'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Firma'; +$_MODULE['<{socolissimo}prestashop>socolissimo_8b5dd64ab8d0b8158906796b53a200e2'] = 'E-Mail-Adresse'; +$_MODULE['<{socolissimo}prestashop>socolissimo_bcc254b55c4a1babdf1dcb82c207506b'] = 'Tel'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e19726b466603bc3e444dd26fbcde074'] = 'Kundenadresse'; +$_MODULE['<{socolissimo}prestashop>socolissimo_6311ae17c1ee52b36e68aaf4ad066387'] = 'Andere'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d676596f71fd0f73f735da4bb4225151'] = 'Tür-Code'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ea7d9b60cc8654d2c6e8813529a2f3e8'] = 'Liefer-Informationen'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e937c6393ce858786bd31a279b50572d'] = 'Abholpunkt-ID'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f109a88feec5ad3aeb82580c7a20ec31'] = 'Abholpunkt'; +$_MODULE['<{socolissimo}prestashop>socolissimo_021944549c2795a6e4db23b92f198a5e'] = 'Abholpunkt-Adresse'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-Mail'; + +?> \ No newline at end of file diff --git a/modules/socolissimo/es.php b/modules/socolissimo/es.php new file mode 100644 index 000000000..634d6ab12 --- /dev/null +++ b/modules/socolissimo/es.php @@ -0,0 +1,88 @@ +socolissimo_42ab10dea7d96b9c353e0f5bae43ec20'] = 'La Poste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_27d52fec98c204daecd4c4df2b8e11fa'] = 'Proponga a sus clientes cinco modos de entraga a través de la Poste.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f8e355b97fa1be7a8d8c206aa66f0077'] = 'Zona(s) transportista'; +$_MODULE['<{socolissimo}prestashop>socolissimo_690c1c6abf905b88281a7cd324af9942'] = 'Grupo del transportista'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a18ef2e8b3730915798057a50ecbf2cd'] = 'Franja del transportista'; +$_MODULE['<{socolissimo}prestashop>socolissimo_59f26c70c0230e4ec5e4acdfed0e270c'] = 'Precio de franja'; +$_MODULE['<{socolissimo}prestashop>socolissimo_798547c41ec3e64e2322df678e939344'] = '\'Identificante FO\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_ac08649aa09ff3b879525627bf086dd1'] = '\'Clave de encriptación\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a3a53f075adf77334cc34d0f7497ff44'] = '\'URL de la administración de SoColissimo\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_4d470fde8487e755a50e9235e3dc13ab'] = 'deben indicarse para funcionar correctamente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_94c614a9df45ea1fcd27b15b7d6f3e67'] = 'Clave no válida'; +$_MODULE['<{socolissimo}prestashop>socolissimo_90a5cb3d07bb39bbd4b76f7f9a0d7947'] = 'Se ha producido un error en la etapa \'transportista\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_70b2e65f0f2aabf3e2c58d70cf1e1e9a'] = 'Identificante FO inexistente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_2b639b851983a24bc12358523861c7ff'] = 'Identificante FO incorrecto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ca12228b5ad636c637425a086fe0092'] = 'Cliente no autorizado'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0b1d0c0a00cc2727fcd77902867e3641'] = 'Faltan campos obligatorios'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fa419073252af9d022afe65dccbb34a2'] = 'Falta firma'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fca3fbced675f75182786525bf4706dc'] = 'Firma no válida'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d14afc3f67d2457d29f0aa0db98e2c9d'] = 'Código postal no válido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f9733e52e8841f1e45d015d5af5e8655'] = 'Formato URL devolución Validación incorrecto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_417434a4e55adbc67c9c391902cea7f3'] = 'Formato URL devolución Fracaso incorrecto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_140c34f0b21b932e34d11575509d093b'] = 'ID de la transacción no válida'; +$_MODULE['<{socolissimo}prestashop>socolissimo_28ee1015b475a3a70613ea9c98d712b6'] = 'Formato de gastos de envío incorrecto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_afa50e8b2fc14bf578331b2b8e98179d'] = 'Servidor SoColissimo no disponible'; +$_MODULE['<{socolissimo}prestashop>socolissimo_27e0a4f1ce5bb4ad9687a021e95367df'] = 'So Colissimo no es compatible con la función One Page Checkout, con el fin de utilizar este módulo, por favor, activa el proceso de compra estándar (Preferencias> \"Tipo de proceso de pedidos\")'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descripción'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d0b34d3e1cb0cc1150ae6bf650e9b569'] = 'SoColissimo es un servicio propuesto Por La Poste, que le permite proponer a sus compradores cinco modos de entrega:'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e5c7c47a2cc967ae4834ad5c076734df'] = 'Entrega a domicilio'; +$_MODULE['<{socolissimo}prestashop>socolissimo_05ded48a069b0390fd4609e103eec154'] = 'Entrega a domicilio previa cita entre las 17h y las 21h30'; +$_MODULE['<{socolissimo}prestashop>socolissimo_402c04ef2c99ebccbc8fb047bb7a1185'] = 'Entrega en uno de los 31 espacios Cityssimo, 7/7 y 24h/24'; +$_MODULE['<{socolissimo}prestashop>socolissimo_45b080bdf4c705a1e4cd664da70bf41c'] = 'Entrega en uno de los 10.000 oficinas de Correos que elijan'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e6fb019213dbc66e25bef9d25b889eed'] = 'Entrega en uno de los numerosos puntos de recogida en partenariado con La Poste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9fbff0971c06ee404f638e9abcbd9446'] = 'Este módulo es totalmente gratuito y le permite activar dicha oferta en su tienda.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_5b6cf869265c13af8566f192b4ab3d2a'] = 'Documentación'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0ab984d91ab0a037bdf692bf0e73c349'] = 'Importante'; +$_MODULE['<{socolissimo}prestashop>socolissimo_58f73ae759adc826a9e15e26280cdaa4'] = 'Para abrir una cuenta SoColissimo, póngase en contacto con \"La Poste\" a través de 3634'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9c85d4c2bae6ab548fe23e57bd89ddc4'] = 'Identificante FO'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7b95472e0575adc1e3d90a2d7b51e496'] = 'Usuario So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_897356954c2cd3d41b221e3f24f99bba'] = 'Clave de encriptación'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fe78e0a947bf1e0c9e0d9485f40e69cb'] = 'Clave de encriptación So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_64979b52d796defbdf05356df9e37d57'] = 'Tiempo de preparación'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c76660d589be9a49e8846e51b71744ae'] = 'día(s)'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1fb031ceef337d6c513315dc5ec98a27'] = 'Plazo medio de preparación de sus pedidos'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e986d627f454602880075fe556378073'] = 'El plazo de preparación de pedido debe ser idéntico al indicado en Back Office ColiPoste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_31e3fd47be6f64fb2e0a4f85cb63a069'] = 'Coste adicional'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a68e8fd6d255edb0ca099c7400252694'] = 'Coste adicional aplicable a la entrega a domicilio previa cita'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d38ac03101faea9ed5f9ea96bf8627b4'] = 'El coste adicional debe ser idéntico al indicado en el Back Office ColiPoste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9954970bc5804ff557ced19516e2a55c'] = 'Tenga cuidado con estos parámetros, su modificación puede provocar un disfuncionamiento del módulo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b0b2896e75025245cbb05e96bd1466d6'] = 'Dirección FO'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce88aabea3b363c753b02ddcb2fbafff'] = 'URL de la administración de So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_85068ddf0b9bcbb6913008356fe328a0'] = 'Supervisión'; +$_MODULE['<{socolissimo}prestashop>socolissimo_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activado'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b9f5c797ebbf55adccdd8539a65a0241'] = 'Desactivado'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fdd526b84abc0b8fc17060e62d022b84'] = 'Autorizar o no la comprobación de la disponiblidad de los servicios SoColissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_32996bdf4214d6cb8bf7fa02273813c8'] = 'Dirección de comprobación'; +$_MODULE['<{socolissimo}prestashop>socolissimo_995a56aecac4198b9bc0a17a976561b5'] = 'Dirección de comprobación de disponibilidad'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Información'; +$_MODULE['<{socolissimo}prestashop>socolissimo_3e387f5ebd657c6372f0594c8226863e'] = 'Aquí tiene las dos direcciones que debe indicar en su Back-Office Coliposte'; +$_MODULE['<{socolissimo}prestashop>socolissimo_49977cbb6772deeac9ceb89f069e491c'] = 'URL de validación'; +$_MODULE['<{socolissimo}prestashop>socolissimo_06dc3f24f73027164d2b19556118624e'] = 'URL de devolución'; +$_MODULE['<{socolissimo}prestashop>socolissimo_82c440defe28e2099cba1af1f0761807'] = 'Identificante FO no especificado'; +$_MODULE['<{socolissimo}prestashop>socolissimo_826361881cfc18b8b75405d398f633b5'] = 'Clave de encriptación no especificada'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0bf6a620e5f22d8b46e3903a993f7741'] = 'Tiempo de preparación no especificado'; +$_MODULE['<{socolissimo}prestashop>socolissimo_228485c5faff886fa4520323dc5b2c76'] = 'Tiempo de preparación no válido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c3288acdf9ecd0a4fb1e308442b06867'] = 'Coste adicional no especificado'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1a89bc7d83f6e90b2368e3401690a87a'] = 'Coste adicional no válido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración actualizada'; +$_MODULE['<{socolissimo}prestashop>socolissimo_126d781eae70fa41e9e848f3013e1799'] = 'Imposible guardar los parámetros'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ea4eac85d1d1967562869cf1e14b1d0'] = 'Para elegir SoColissimo, marque un modo en entrega'; +$_MODULE['<{socolissimo}prestashop>socolissimo_201bdb87f8e278b943d07ae924d5de6e'] = 'Modo de entrega'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Empresa'; +$_MODULE['<{socolissimo}prestashop>socolissimo_8b5dd64ab8d0b8158906796b53a200e2'] = 'Dirección email'; +$_MODULE['<{socolissimo}prestashop>socolissimo_bcc254b55c4a1babdf1dcb82c207506b'] = 'Tel.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e19726b466603bc3e444dd26fbcde074'] = 'Dirección del cliente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_6311ae17c1ee52b36e68aaf4ad066387'] = 'Otros'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d676596f71fd0f73f735da4bb4225151'] = 'Código acceso portal'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ea7d9b60cc8654d2c6e8813529a2f3e8'] = 'Datos de entrega'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e937c6393ce858786bd31a279b50572d'] = 'ID del punto de entrega'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f109a88feec5ad3aeb82580c7a20ec31'] = 'Punto de entrega'; +$_MODULE['<{socolissimo}prestashop>socolissimo_021944549c2795a6e4db23b92f198a5e'] = 'Dirección del punto de entrega'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; diff --git a/modules/socolissimo/fr.php b/modules/socolissimo/fr.php new file mode 100644 index 000000000..306b4c5c6 --- /dev/null +++ b/modules/socolissimo/fr.php @@ -0,0 +1,88 @@ +socolissimo_42ab10dea7d96b9c353e0f5bae43ec20'] = 'La Poste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_27d52fec98c204daecd4c4df2b8e11fa'] = '\'Proposez à vos clients 5 modes de livraison via La Poste.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f8e355b97fa1be7a8d8c206aa66f0077'] = '\'Zone(s) du transporteur\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_690c1c6abf905b88281a7cd324af9942'] = '\'Groupe du transporteur\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a18ef2e8b3730915798057a50ecbf2cd'] = '\'Tranche(s) du transporteur\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_59f26c70c0230e4ec5e4acdfed0e270c'] = '\'Prix de tranche\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_798547c41ec3e64e2322df678e939344'] = '\'Identifiant FO\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_ac08649aa09ff3b879525627bf086dd1'] = '\'Clé de cryptage\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a3a53f075adf77334cc34d0f7497ff44'] = '\'Url de l\'administration de SoColissimo\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_4d470fde8487e755a50e9235e3dc13ab'] = 'doivent être renseignés pour fonctionner correctement'; +$_MODULE['<{socolissimo}prestashop>socolissimo_94c614a9df45ea1fcd27b15b7d6f3e67'] = 'Clé invalide'; +$_MODULE['<{socolissimo}prestashop>socolissimo_90a5cb3d07bb39bbd4b76f7f9a0d7947'] = 'une erreur s\'est produite lors de l\'étape transporteur'; +$_MODULE['<{socolissimo}prestashop>socolissimo_70b2e65f0f2aabf3e2c58d70cf1e1e9a'] = 'Identifiant FO manquant'; +$_MODULE['<{socolissimo}prestashop>socolissimo_2b639b851983a24bc12358523861c7ff'] = 'Identifiant FO incorrect'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ca12228b5ad636c637425a086fe0092'] = 'Client non autorise'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0b1d0c0a00cc2727fcd77902867e3641'] = 'Champs obligatoire manquant'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fa419073252af9d022afe65dccbb34a2'] = 'Signature manquante'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fca3fbced675f75182786525bf4706dc'] = 'Signature invalide'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d14afc3f67d2457d29f0aa0db98e2c9d'] = 'Code postal invalide'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f9733e52e8841f1e45d015d5af5e8655'] = 'Format url retour Validation incorrect'; +$_MODULE['<{socolissimo}prestashop>socolissimo_417434a4e55adbc67c9c391902cea7f3'] = 'Format url retour Echec incorrect'; +$_MODULE['<{socolissimo}prestashop>socolissimo_140c34f0b21b932e34d11575509d093b'] = 'ID de la transaction invalide'; +$_MODULE['<{socolissimo}prestashop>socolissimo_28ee1015b475a3a70613ea9c98d712b6'] = 'Format des frais d’expédition incorrect'; +$_MODULE['<{socolissimo}prestashop>socolissimo_afa50e8b2fc14bf578331b2b8e98179d'] = 'Serveur Socolissimo non disponible'; +$_MODULE['<{socolissimo}prestashop>socolissimo_27e0a4f1ce5bb4ad9687a021e95367df'] = 'So Colissimo n\'est pas compatible avec la One Page Checkout, afin d\'utiliser ce module, merci d\'activer le processus de commande standard (Préférences > \"Type de processus de commande\")'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Description'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d0b34d3e1cb0cc1150ae6bf650e9b569'] = 'So Colissimo est un service proposé par La Poste, qui vous permet d\'offrir à vos acheteurs 5 modes de livraison :'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e5c7c47a2cc967ae4834ad5c076734df'] = 'Livraison à Domicile'; +$_MODULE['<{socolissimo}prestashop>socolissimo_05ded48a069b0390fd4609e103eec154'] = 'Livraison à Domicile sur Rendez-vous le soir entre 17h et 21h30'; +$_MODULE['<{socolissimo}prestashop>socolissimo_402c04ef2c99ebccbc8fb047bb7a1185'] = 'Livraison dans l\'un des 31 espaces Cityssimo, 7j/7 et 24h/24'; +$_MODULE['<{socolissimo}prestashop>socolissimo_45b080bdf4c705a1e4cd664da70bf41c'] = 'Livraison dans l\'un des 10.000 Bureaux de Poste de leur choix'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e6fb019213dbc66e25bef9d25b889eed'] = 'Livraison dans l\'un des nombreux point de retrait du réseau partenaire La Poste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9fbff0971c06ee404f638e9abcbd9446'] = 'Ce module est gratuit et vous permet d\'activer cette offre sur votre magasin.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_5b6cf869265c13af8566f192b4ab3d2a'] = 'Documentation'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0ab984d91ab0a037bdf692bf0e73c349'] = 'Important'; +$_MODULE['<{socolissimo}prestashop>socolissimo_58f73ae759adc826a9e15e26280cdaa4'] = 'Pour ouvrir un compte SoColissimo, merci de contacter \"La poste\" à ce numéro: 3634.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9c85d4c2bae6ab548fe23e57bd89ddc4'] = 'Identifiant FO'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7b95472e0575adc1e3d90a2d7b51e496'] = 'Utilisateur So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_897356954c2cd3d41b221e3f24f99bba'] = 'Clé de cryptage'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fe78e0a947bf1e0c9e0d9485f40e69cb'] = 'Clé de cryptage So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_64979b52d796defbdf05356df9e37d57'] = 'Temps de préparation'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c76660d589be9a49e8846e51b71744ae'] = 'Jour(s)'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1fb031ceef337d6c513315dc5ec98a27'] = 'Délai moyen de préparation de vos commandes'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e986d627f454602880075fe556378073'] = 'Le délai de préparation de commande doit être identique à celui saisi dans le Back Office ColiPoste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_31e3fd47be6f64fb2e0a4f85cb63a069'] = 'Surcoût'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a68e8fd6d255edb0ca099c7400252694'] = 'Surcoût à appliquer pour la livraison à domicile sur rendez-vous'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d38ac03101faea9ed5f9ea96bf8627b4'] = 'Le \"surcoût\" doit être identique à celui saisi dans le Back Office ColiPoste'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9954970bc5804ff557ced19516e2a55c'] = 'Soyez très prudent avec ces paramètres, le changement peut provoquer un dysfonctionnement du module'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b0b2896e75025245cbb05e96bd1466d6'] = 'Adresse FO'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce88aabea3b363c753b02ddcb2fbafff'] = 'Url de l\'administration de So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_85068ddf0b9bcbb6913008356fe328a0'] = 'Supervision'; +$_MODULE['<{socolissimo}prestashop>socolissimo_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Activé'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b9f5c797ebbf55adccdd8539a65a0241'] = 'Désactivé'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fdd526b84abc0b8fc17060e62d022b84'] = 'Autoriser ou non la verification de la disponibilité des services SoColissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_32996bdf4214d6cb8bf7fa02273813c8'] = 'Adresse de verification'; +$_MODULE['<{socolissimo}prestashop>socolissimo_995a56aecac4198b9bc0a17a976561b5'] = 'Adresse de verification de disponibilité'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{socolissimo}prestashop>socolissimo_3e387f5ebd657c6372f0594c8226863e'] = 'Voici les deux adresses que vous devez renseigner dans votre Back-Office Coliposte'; +$_MODULE['<{socolissimo}prestashop>socolissimo_49977cbb6772deeac9ceb89f069e491c'] = 'Url de validation'; +$_MODULE['<{socolissimo}prestashop>socolissimo_06dc3f24f73027164d2b19556118624e'] = 'Url de retour'; +$_MODULE['<{socolissimo}prestashop>socolissimo_82c440defe28e2099cba1af1f0761807'] = 'Identifiant FO non spécifié'; +$_MODULE['<{socolissimo}prestashop>socolissimo_826361881cfc18b8b75405d398f633b5'] = 'Clé de cryptage non spécifié'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0bf6a620e5f22d8b46e3903a993f7741'] = 'Temps de préparation non spécifié'; +$_MODULE['<{socolissimo}prestashop>socolissimo_228485c5faff886fa4520323dc5b2c76'] = 'Temps de préparation invalide'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c3288acdf9ecd0a4fb1e308442b06867'] = 'Surcoût non spécifié'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1a89bc7d83f6e90b2368e3401690a87a'] = 'Surcoût invalide'; +$_MODULE['<{socolissimo}prestashop>socolissimo_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration mise à jour'; +$_MODULE['<{socolissimo}prestashop>socolissimo_126d781eae70fa41e9e848f3013e1799'] = 'Impossible de sauvegarder les paramètres'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ea4eac85d1d1967562869cf1e14b1d0'] = 'Pour choisir SoColissimo, cocher une méthode de livraison'; +$_MODULE['<{socolissimo}prestashop>socolissimo_201bdb87f8e278b943d07ae924d5de6e'] = 'Mode de livraison'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce26601dac0dea138b7295f02b7620a7'] = 'Client'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Entreprise'; +$_MODULE['<{socolissimo}prestashop>socolissimo_8b5dd64ab8d0b8158906796b53a200e2'] = 'Adresse e-mail'; +$_MODULE['<{socolissimo}prestashop>socolissimo_bcc254b55c4a1babdf1dcb82c207506b'] = 'Tel'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e19726b466603bc3e444dd26fbcde074'] = 'Adresse du client'; +$_MODULE['<{socolissimo}prestashop>socolissimo_6311ae17c1ee52b36e68aaf4ad066387'] = 'Autre'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d676596f71fd0f73f735da4bb4225151'] = 'Code de la porte'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ea7d9b60cc8654d2c6e8813529a2f3e8'] = 'Information de livraison'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e937c6393ce858786bd31a279b50572d'] = 'ID du point de retrait'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f109a88feec5ad3aeb82580c7a20ec31'] = 'Point de retrait'; +$_MODULE['<{socolissimo}prestashop>socolissimo_021944549c2795a6e4db23b92f198a5e'] = 'Adresse du point de retrait'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; diff --git a/modules/socolissimo/it.php b/modules/socolissimo/it.php new file mode 100644 index 000000000..851bbab4f --- /dev/null +++ b/modules/socolissimo/it.php @@ -0,0 +1,89 @@ +socolissimo_42ab10dea7d96b9c353e0f5bae43ec20'] = 'So Colissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_27d52fec98c204daecd4c4df2b8e11fa'] = 'Offri ai tuoi clienti diverse modalità di consegna LaPoste.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f8e355b97fa1be7a8d8c206aa66f0077'] = '\'Zona/e del corriere\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_690c1c6abf905b88281a7cd324af9942'] = '\'Gruppo Corriere\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a18ef2e8b3730915798057a50ecbf2cd'] = '\'Fascia/e del corriere\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_59f26c70c0230e4ec5e4acdfed0e270c'] = '\'Prezzo consegna corriere\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_798547c41ec3e64e2322df678e939344'] = '\'ID FO\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_ac08649aa09ff3b879525627bf086dd1'] = '\'Chiave\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_a3a53f075adf77334cc34d0f7497ff44'] = '\'Url So\''; +$_MODULE['<{socolissimo}prestashop>socolissimo_4d470fde8487e755a50e9235e3dc13ab'] = 'deve essere configurato per utilizzare questo modulo correttamente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_94c614a9df45ea1fcd27b15b7d6f3e67'] = 'Chiave non valida'; +$_MODULE['<{socolissimo}prestashop>socolissimo_90a5cb3d07bb39bbd4b76f7f9a0d7947'] = 'Errore durante la fase di spedizione '; +$_MODULE['<{socolissimo}prestashop>socolissimo_70b2e65f0f2aabf3e2c58d70cf1e1e9a'] = 'Manca Login FO'; +$_MODULE['<{socolissimo}prestashop>socolissimo_2b639b851983a24bc12358523861c7ff'] = 'Login FO non valido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ca12228b5ad636c637425a086fe0092'] = 'Cliente non autorizzato'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0b1d0c0a00cc2727fcd77902867e3641'] = 'Campo obbligatori mancante'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fa419073252af9d022afe65dccbb34a2'] = 'Firma mancante'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fca3fbced675f75182786525bf4706dc'] = 'Firma non valida'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d14afc3f67d2457d29f0aa0db98e2c9d'] = 'CAP non valido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f9733e52e8841f1e45d015d5af5e8655'] = 'Formato url restituzione convalida non corretto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_417434a4e55adbc67c9c391902cea7f3'] = 'Formato url restituzione errore non corretto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_140c34f0b21b932e34d11575509d093b'] = ' ID di transazione non valido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_28ee1015b475a3a70613ea9c98d712b6'] = 'Formato spese di spedizione formato non corretto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_afa50e8b2fc14bf578331b2b8e98179d'] = 'Socolissimo server non disponibile'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descrizione'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d0b34d3e1cb0cc1150ae6bf650e9b569'] = 'SoColissimo è un servizio offerto da La Poste, che permette di offrire all\'acquirente 5 modalità di consegna'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e5c7c47a2cc967ae4834ad5c076734df'] = 'A casa'; +$_MODULE['<{socolissimo}prestashop>socolissimo_05ded48a069b0390fd4609e103eec154'] = 'A casa com appuntamenti'; +$_MODULE['<{socolissimo}prestashop>socolissimo_402c04ef2c99ebccbc8fb047bb7a1185'] = 'Nello spazio Cityssimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_45b080bdf4c705a1e4cd664da70bf41c'] = 'Nel loro ufficio postale'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e6fb019213dbc66e25bef9d25b889eed'] = 'Nel loro punto di ritiro'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9fbff0971c06ee404f638e9abcbd9446'] = 'Questo modulo è gratuito e permette di attivare questa offerta nel tuo negozio.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_5b6cf869265c13af8566f192b4ab3d2a'] = 'Documentazione'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0ab984d91ab0a037bdf692bf0e73c349'] = 'Importante'; +$_MODULE['<{socolissimo}prestashop>socolissimo_58f73ae759adc826a9e15e26280cdaa4'] = 'Per aprire il tuo account SoColissimo, si prega di contattare \"La Poste\" a questo numero telefonico: 3634 (numero di telefono francese)'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9c85d4c2bae6ab548fe23e57bd89ddc4'] = 'ID So'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7b95472e0575adc1e3d90a2d7b51e496'] = 'ID utente per back office SoColissimo.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_897356954c2cd3d41b221e3f24f99bba'] = 'Chiave'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fe78e0a947bf1e0c9e0d9485f40e69cb'] = 'Chiave sicura per back office SoColissimo.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_64979b52d796defbdf05356df9e37d57'] = 'Tempo di preparazione'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c76660d589be9a49e8846e51b71744ae'] = 'Giorno/i'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1fb031ceef337d6c513315dc5ec98a27'] = 'Tempo medio di preparazione del materiale.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e986d627f454602880075fe556378073'] = 'Tempo medio deve essere lo stesso del ColiPoste Back Office.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_31e3fd47be6f64fb2e0a4f85cb63a069'] = 'Sovraccosto'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a68e8fd6d255edb0ca099c7400252694'] = 'Costo aggiuntivo se consegna su appuntamento.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d38ac03101faea9ed5f9ea96bf8627b4'] = 'Costo aggiuntivo deve essere lo stesso del ColiPoste Back Office.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_9954970bc5804ff557ced19516e2a55c'] = 'Fare MOLTA ATTENZIONE con queste impostazioni, il cambiamento può causare un malfunzionamento del modulo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b0b2896e75025245cbb05e96bd1466d6'] = 'URL So'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce88aabea3b363c753b02ddcb2fbafff'] = 'URL del back office SoColissimo.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_85068ddf0b9bcbb6913008356fe328a0'] = 'Supervisione'; +$_MODULE['<{socolissimo}prestashop>socolissimo_00d23a76e43b46dae9ec7aa9dcbebb32'] = 'Attivato'; +$_MODULE['<{socolissimo}prestashop>socolissimo_b9f5c797ebbf55adccdd8539a65a0241'] = 'Disattivato'; +$_MODULE['<{socolissimo}prestashop>socolissimo_fdd526b84abc0b8fc17060e62d022b84'] = 'Autorizza o meno la verifica di disponibilità dei servizi di SoColissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_32996bdf4214d6cb8bf7fa02273813c8'] = 'Supervisione Url'; +$_MODULE['<{socolissimo}prestashop>socolissimo_995a56aecac4198b9bc0a17a976561b5'] = 'Url di superivisione.'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{socolissimo}prestashop>socolissimo_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Informazioni'; +$_MODULE['<{socolissimo}prestashop>socolissimo_3e387f5ebd657c6372f0594c8226863e'] = 'Qui ci sono due indirizzi che è necessario compilare nel tuo Back Office SoColissimo'; +$_MODULE['<{socolissimo}prestashop>socolissimo_49977cbb6772deeac9ceb89f069e491c'] = 'Convalida degli URL'; +$_MODULE['<{socolissimo}prestashop>socolissimo_06dc3f24f73027164d2b19556118624e'] = 'Ritorno url'; +$_MODULE['<{socolissimo}prestashop>socolissimo_82c440defe28e2099cba1af1f0761807'] = 'ID SO non specificato'; +$_MODULE['<{socolissimo}prestashop>socolissimo_826361881cfc18b8b75405d398f633b5'] = 'Chiave SO non specificata'; +$_MODULE['<{socolissimo}prestashop>socolissimo_0bf6a620e5f22d8b46e3903a993f7741'] = 'Tempo di preparazione non specificato'; +$_MODULE['<{socolissimo}prestashop>socolissimo_228485c5faff886fa4520323dc5b2c76'] = 'Tempo di preparazione non valido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_c3288acdf9ecd0a4fb1e308442b06867'] = 'sovraccosto non specificato'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1a89bc7d83f6e90b2368e3401690a87a'] = 'Sovraccosto non valido'; +$_MODULE['<{socolissimo}prestashop>socolissimo_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{socolissimo}prestashop>socolissimo_126d781eae70fa41e9e848f3013e1799'] = 'Impossibile salvare le impostazioni'; +$_MODULE['<{socolissimo}prestashop>socolissimo_7ea4eac85d1d1967562869cf1e14b1d0'] = 'Per scegliere SoColissimo, spunta un metodo di consegna'; +$_MODULE['<{socolissimo}prestashop>socolissimo_201bdb87f8e278b943d07ae924d5de6e'] = 'Modalità di consegna'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Società'; +$_MODULE['<{socolissimo}prestashop>socolissimo_8b5dd64ab8d0b8158906796b53a200e2'] = 'Indirizzo e-mail'; +$_MODULE['<{socolissimo}prestashop>socolissimo_bcc254b55c4a1babdf1dcb82c207506b'] = 'Tel'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e19726b466603bc3e444dd26fbcde074'] = 'Indirizzo del cliente'; +$_MODULE['<{socolissimo}prestashop>socolissimo_6311ae17c1ee52b36e68aaf4ad066387'] = 'Altri'; +$_MODULE['<{socolissimo}prestashop>socolissimo_d676596f71fd0f73f735da4bb4225151'] = 'Codice della porta'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ea7d9b60cc8654d2c6e8813529a2f3e8'] = 'Informazioni di consegna'; +$_MODULE['<{socolissimo}prestashop>socolissimo_e937c6393ce858786bd31a279b50572d'] = 'ID punto ritiro'; +$_MODULE['<{socolissimo}prestashop>socolissimo_f109a88feec5ad3aeb82580c7a20ec31'] = 'Punto di ritiro'; +$_MODULE['<{socolissimo}prestashop>socolissimo_021944549c2795a6e4db23b92f198a5e'] = 'Indirizzo punto di ritiro'; +$_MODULE['<{socolissimo}prestashop>socolissimo_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; + +?> \ No newline at end of file diff --git a/modules/socolissimo/logo.gif b/modules/socolissimo/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..978ef8b44658adc00f00d851e7638da0c35cf4ca GIT binary patch literal 1625 zcmchXdrXs86u=LtWjG`Sifz$q5e6Nh2rXeng$ybdsG3qi5s9<36>$h%TX49TU@HtN z2wH~n7y>dQO30>*L!ucN6&1+vF?@kTS1R%-g_hd#>h4Fkm@G54_x%G_h`1y;zjw}7Agum5fzB;*mu&-CE+N3Rt)t=d})xOqh zhh7g24V_7QGj13bz_4au5sjtt!)XwW+P#)Lvm4>NkyQ-nQnw zHJi+>D)SAs`DT^5qt1NitmRIPrTc=Vr+NC}<>}t5(@(F>^xc^0zdQ4)b4K%EcIeUU z@UuDH%ejfcIpgrWX=47ZdETO%pP8DUpN0QXJS~eI0g}PfIvc}g^Er{6puivofPI@l zB1yMLl^n>BOOc(LxHF0B@CEdveoXuuMQWkS>dESX#=k)j~`YQ)}H1JECdoC^?60a(=a&XyztXgUW#^m%8a zkpSFx0JJdQ*$iP51=hW zm?h0#h(*!%p#c9jwr$R~y6q6KJbx-?{u}pXEHnV~Kp;R}G{BCf0Ngx)%9jAX%>Zs! z0C>v);zPlnrTI&3&03h}!4{;arAP&Gv51OY7o2*nHT|L!9fe~AtSfSoDH zk*1~YlT#zm{Sy0AV={yR{!~U_5ZZ$OLIiqbz`>fEtWYL1=!~OYfhjeu9iWTdR5kE=3T^vQJPS_Hj zz$Bhe->ImNblA%Y5k0xTIm#!1!qc=J5ys^o;;eFc`sn68=hgB2MAqXj#}fMXkmN+N zvqSw#GNF6ViH-RDLt%>tSwRK2oFbxHG&F{n`okQ>?iRd86kF!&6_CgiXkstZ=wz~|=TJiK{rDkq#htp5WznFCM& literal 0 HcmV?d00001 diff --git a/modules/socolissimo/redirect.php b/modules/socolissimo/redirect.php new file mode 100644 index 000000000..610dfd2cc --- /dev/null +++ b/modules/socolissimo/redirect.php @@ -0,0 +1,44 @@ + +* @copyright 2007-2010 Prestashop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registred Trademark & Property of PrestaShop SA +*/ + +require_once ('../../config/config.inc.php'); + +?> + + + + + + + '; + foreach($_GET as $key => $val) + echo ''; + ?> + + + \ No newline at end of file diff --git a/modules/socolissimo/socolissimo.jpg b/modules/socolissimo/socolissimo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd46bbaf50c6d0adbfdf642bdff27c07768ef815 GIT binary patch literal 8040 zcma)hbyO5yyY3JI0)ljRgLIdOlz?;%Lw63TbSNNQ1CkOF(%p^J&?q894c#$=gLGbg z-*@gg=l*lgdH33Dy=y-^p0#Ve``Hik4{LzuYRan005o&}!1gf#9*zJ+itlY)`~heH zOu#>dfCnUiK;G8f+74j*{jmh?VF?fcK>Obt`hOY5f7*XEM@K_@L?82i0{>g*;X8l` z2fzy$!9XJdpcA2C5TQK`0ty~!qhtKj`6JVR8y5BxoTs>$k0U)o|6u3qmP9RAR@*gA!QOId#c0CLQWws%=%G?%DR!wPx5h0 zw0}`W!@|VEcx-`&jzNTp1t5OHM1n2Ij3ci@DrDvP@ihyXwJ$vXLv07NdE-zxtUss2Q zj!4&G)khc7h4!PyRFKPMFNH7k*hIe;g1fDmes{&&#=!|Z^V#vpM&_vI&(>p(u?Ed6 z;`4?JIr?fWqF%@d?}VGdi>dO7W84NYc)v6oouAvW)?H`6C7dTIPc+)lT>&-ChjMGI zVMf>d2CO!AKc`W>t0%f(F;j)n7+D}qm9adly#kI(Y4YJ>6JaV$1>@ABS|(1IleCMK z65aa;D#?OrWo6ycrn6=+=t&43|Ax&DYAF-xx38jXp&e3j;5f2*P=&_eOjNBo=J_HH zcZYS&E6|u%QsNrnIsN%s#+AE)C7AB1-fzRNAFaFsfyf-EQfjAvFWvv-RQRj}y`_)j zJnXbc-V!FR`K-38GZAnen3X^=Qj_?rK3pp{0Lq|mc)`J$pM0;=hH_6T?q2Up<=-kX z;d?27A=sWtt=bf>gNx;X!&HobI>Boij`-=R2>F-V_MuA!={9>}{3mn!Z9jwikyiT^ z)&p-9pK)4zIdb&t8XuLdu^s5QVOyNkyif{SdirP8PNL>;Hr~L9-#k}ub5d<1gyOF+ zTzgvvl8#3oay5}e3{80efGoUUWDrkM<>_kmS{5)O>`B2uj8T_o`J^ zC-0Z+qzZ@V13>f-xnAThWKHJ9w0BN%-&^YiV^g>CB_Tl`JnjUY;R$6)&b@cmZsgk<5{FxRN3Pphr|pmZadoIS+Aus67Kcs|#= z@1zxfgRj#N9?J6Gt>jBztknIi;R~np<)-_-YHcXX71Md;DkV&-fhRpAZr%{(nbWaK zk;Q(9J7P^VXh;cW^-J0Jj%5r;S;N%^7{8@@CEn%E|F(!~Bj^)qhAr%Gj#373N19FU zy1gIW(>t@*P2P&!dvyAB_+Qg_D-|+(P@!XRtljA0ErbK?c@wODs*-NP4STQbMZ?mB z6YVFuFhLbNLxb8<+;L6{(dG*>-99TLFcw>y>t*q4=ofSkY;M}NZTD?P)?ps=VU9k~ zmU#eXVhUr55VaT}Oe%~}TjfaVTAqc1>J+HM_wh}kto;B%lK-_OrX^7pN zfrt9~rPnl{aU#I2p~VdWBkud>4}e+$vJ*{#dj)q&tS@)^=@y@jS^~{#as$&!kVW4_ zE#=}*B2d4sRMQDhi&jGz-PVv79jAz2ox!Em@2zb7p;Vc9=X@M#o9!Yw=D(Ya89Cit z5E=?zqz1fZZEGXahr5J@XGA)+O3tO4W!*v{{ETbuqkK&3wY+ZIjhO=yk^0F4oM(xz zB0hVb85Zn?3gIS|HKJ10WH`A%Wo%Ke8751Uo zag&pO7LQ6wvFpZA^TxTiT!#9Y#huxgS7hBm^k*4j9hnU@Rzf20NM?Uf!hg$m2i&W? zi_T|UtM-rfy!kQ?yjsd!*l2aq)?#M!6;d<_mXF|#Tr2H-Lj;?$;Asew&(3Ub-J z{*6CTa%XIUL5xq!A$72%>g(v1z+@Mhz%sMapgPk?P`;XNR#@DMP8LF-|3|nK53%|{ z9$6Tr~2ds>`~8Fb@a{tP4}eG*i)7jM=7FT9kJY;5 zKG_2DukSGJa7vrFLL$)d7%a^E7fz(dEd*MQQ)o27FX4;S`IK`e7#u?$N5W4>TqXZq8V<3qi>&p%L7ac6#93!2yEEdBC_VdO!yg4*>qi=&?y+E{ zQ0iNYI45Z2LED|Wa@WOsM++@Rv!~W1838}gJW@GN$vCTLO4gj@XF%&yC~ZIQt%T-8 zD&Y`XnS=r*d{rPaB6!J%qY}{2@N8CEE!FU_%snYYXPYvAkq~qFRbW!KO?HnMgA%vp zFFl(@Y%WMGs(pt_2k1HT`V~d}9Z1V9!B^jxvB9131jsOqJ>lAMa^B@C&<}JguH^=) zFkzqhjK^>Wh%Hjj>7p*@Vkbj@KO)R-{M2i#{kILIU5KFMh%%w%QhWmZlA5!Ko%}vugRWHwKBY_(g_Rp zzqj6!o&C2?A~N($eWu+x0t4=7E8tA%(cK6fldrl#1h|))qgj^hu1YzcSCpSYzns(2M5>dEG{ap667BM9jOn1#iD!9L-zIuz%S|0o4NuA1rl#kHz^3wnB>^L&Fe_y5^Gj^mNS_11bnRDG}CB(VFBk7>9XGnqM3n z%7MPURy58t6{YQ&^BFPv=E(L~wk>PrO-9>|jdnwWGCII?I^c9jrZ3*#1meo_Y3%Ba zq|=qA(34FTC8BfPweK;s)k{h5;z4ZwPrY8_wraKzCcZQ_^Cz<+HuDLezfA1xtZZw6 zioKtJ2bfE`(C3Zs+s27#mjq^astPUc#7YN`FYkA+E;&PlEGYc5Z$>Y;L~F#y7HlY< zkFs^&R^!Pt#@yHeS=%$OtJjX9R_%`SR_@vR^RvVp(#<>4oE zF!RHiX7r*b#Ba_-7f-djRoUbtr*6s)w+70^L|E_s^biY-#U!q+(|W5%++TaJCPA#8LVy z&J~zG(Aj(WrvL`hp+hx<78{OV>{Q*1*r8`gb zO;|`WkFtl+lbOr2n*}vR3Tn7I3U5+QQJ-_PBAA;8sDeYF($D*PR6Hf=EwG5vJm4*o zkmZ^~+wLT1I4(&uFoJ0W+mWj|la#P0*89crrUie(`rln(zUZKB=JFSCMN&e0SY#{qKvjd8di1`lp`)#`Z19XX zKE3Wye5@$`ccwMcLYc2cCil-X+DsQ9;%>s!0*k>~p!~G}7a+duC}v`HTL8fa!VRgz zqRjUq*Z5vN4KNQ^Flc|qbw`QlBYwJAix9%T0jD@mzvNXCyGtY?@SAuc^g7A=CZ}7O zF*`}a=l65Y;P>piJH7Az2@o|!W)eilwWQaqFYm{H)6iJrA{J*;QYoialb$}amk4J9 zR}v){3E%o_F+tsiUSDhIQylP+WLumx60Eshb=ioG6}6`lHg^PSDxik!h|~;$A-`Ym zGfQHMvKEJ&o4FnjPpNw;`{H5P~23+ zK+4WLlaj_D%Xc%{p?q%1mFv)~XPX}HZ?cv6O5+4iTJAgeasz|>~S=!)56 zkNX#w>ztaXPIYJm^auch(0GOIn^CyOH-Qpg}2I^5frr{F_BFP7T1a^6q-2T zoH$ZqjRAd1XXNzNYi}=CgU81!i z=h(o8pI$M#Ojr5?fXynMih!v@px?S3*QQ(AzTpADYIB~su?~D?m@sWg_l;RZ0YUWo z8D3Y~k~SAo);LMko&3^*r*k4IMJ8_&Z-B=PB8`=`r8Y7Hf37w}`^r}=<(dAoitt)J zk+$DqRI15W3V^x#X#;lRY*k^r6qWDx4(n; zOVNhWTOE#sc6%2F@6&H6N6kgApD^-p+ z^D{vNAhBr3e$R5e?N3Ctqmzc-wI1W&0ca2{wL1%{2Mbl)_uV-jPh!YNl#ZdZAaR#X zp9|%noGUVIl`tYu&N7h9C|cxAU#(L8?4wsGbC*t1&9gD<=`ER1`Vt=L&cMCGW!wiq zdQDBuwtk>~gW|ylF2j;dUw@4F%k}N5PmMi1JgIbBlH|lIAXDI^*g|&hu(Glu{xH1H zT;G8$oKsp^Yb;n{%l>M*1H%aqrv&Tlw||kCEUeI2N7Yy&RM+)$ajcE;n;0u00Jqh9 zlC8o~lBooJ?j|?HRru4BC`eau!uI~~_a23H{-L8Tw{5|;6`H2vPM!vwjf#xQ@?>=S z*nkk4DH-FEjs7!!r94lFOi|#>RGmF; ztd~hB$Tz-s$PLvM8ns1?JlH{W4<*;^tyL&b;9zoUFJ)FrDyil4Qe+H10O;z2l0I*q zbiU1C-tpUQY-(w;a5Q?>qMlI8U5**Ho#j(z_v+}BhKR(-l|6VIAvS=bi9Gb$`?zU6 zp^tyf#s55Q3IxmleQeAb=DUr!j~kbwRbjVC`?X^~<{3x(?iHV-v@)o)p}7Vb_3dSL zW$A=qm$&r!Lbo=s`oy}5g^b{<erRDG7){m|#6zZP zr1QnvuO{A?iJp`sI+273>-z7&rKXk54$Vs&yfsO<7ABBY=3Dd8#QCo=o$u;)q3p!ReV0)@TTeZ~V{In(3a zF#Ul)?13Y3`v4GJYyUw_zA3agwb9|8RWR~?48=|-wxS$+;MxJWacB=)O z=Zi`ddwxX2I(zH^f)q#BKK4}mtODtvh8rq%zo;Vtvxx@X+K!{-#v@mAdUlzzVbk+j zc~80qQQ2{AZ65PS5i}5uD)D#!^8iTc+um@S^iIe#fsZtzX80y{D z#A6f@RE*)A{$3G>c+F=>yFmVU`LwI6Dij5TYsOc}Wzngs=uM|ZKL-D!9Zj-5aovp- zQ}w%3RWiR?8YNwyfXY!i2lJ4UQ5W;iuoupyewx)TD-}iFODBKb#ZmNH8~NLqz}GV#=!)84(5M3ms+O!potof+9*H?NaMlHwIbnKP zF+KZJTdl&;#B3W~AbYDS9uTwthcS==9(O65tD~2ubfgQ<{Z(&ubM1V->33*CjI}6n zO{DSqN9^pvTb%7a+R+BJX%)ct2K#YI+5}1)Wju9e`RE5gI0#yq7NR;#pRw_-r2#2} z>@#>yZqML8u%p_vZ(kiPlbs^iM|Rs$X#}w&PdqP8GOEZ<4=uc zpwumf6d3cdfzp+9_f^>>t;8-61=pCR4(of{sD7C9o$L42#jJ?r7KyhZ@$X_;Pc%yC zh!dL9{&pI2XkvIUUC*#P#r-Oo@MPn_h9mITs{)xnR}?1{(c3RLP{)aE#PgF!Jw0j> zX=vrmEwXruz)*9yFl}j181W>>S6DOkZ|9)w=$QMMnJ-q=G;;N z=koZtN^3;<gI}KQ*SNTk-ex`k@Y=6Bp;If!o#T?p9>nbF(j21Z?RGwj z@JugQ literal 0 HcmV?d00001 diff --git a/modules/socolissimo/socolissimo.php b/modules/socolissimo/socolissimo.php new file mode 100644 index 000000000..5cb44b662 --- /dev/null +++ b/modules/socolissimo/socolissimo.php @@ -0,0 +1,774 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Socolissimo extends CarrierModule +{ + private $_html = ''; + private $_postErrors = array(); + private $url = ''; + public $_errors = array(); + public $errorMessage = array(); + + private $_config = array( + 'name' => 'La Poste - So Colissimo', + 'id_tax_rules_group' => 0, + 'url' => 'http://www.colissimo.fr/portail_colissimo/suivreResultat.do?parcelnumber=@', + 'active' => true, + 'deleted' => 0, + 'shipping_handling' => false, + 'range_behavior' => 0, + 'is_module' => true, + 'delay' => array('fr'=>'Avec La Poste, Faites-vous livrer là où vous le souhaitez en France Métropolitaine.', + 'en'=>'Do you deliver wherever you want in France.'), + 'id_zone' => 1, + 'shipping_external'=> true, + 'external_module_name'=> 'socolissimo', + 'need_range' => true + ); + + function __construct() + { + global $cookie; + + $this->name = 'socolissimo'; + $this->tab = 'shipping_logistics'; + $this->version = '2.0'; + $this->author = 'PrestaShop'; + $this->limited_countries = array('fr'); + + parent::__construct (); + + $this->page = basename(__FILE__, '.php'); + $this->displayName = $this->l('So Colissimo'); + $this->description = $this->l('Offer your customers, different delivery methods with LaPoste.'); + $this->url = Tools::getProtocol().htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__.'modules/'.$this->name.'/validation.php'; + + if (self::isInstalled($this->name)) + { + $ids = array(); + $warning = array(); + $soCarrier = new Carrier(Configuration::get('SOCOLISSIMO_CARRIER_ID')); + if (Validate::isLoadedObject($soCarrier)) + { + if (!$this->checkZone((int)($soCarrier->id))) + $warning[] .= $this->l('\'Carrier Zone(s)\'').' '; + if (!$this->checkGroup((int)($soCarrier->id))) + $warning[] .= $this->l('\'Carrier Group\'').' '; + if (!$this->checkRange((int)($soCarrier->id))) + $warning[] .= $this->l('\'Carrier Range(s)\'').' '; + if (!$this->checkDelivery((int)($soCarrier->id))) + $warning[] .= $this->l('\'Carrier price delivery\'').' '; + } + + //Check config and display warning + if (!Configuration::get('SOCOLISSIMO_ID')) + $warning[] .= $this->l('\'Id FO\'').' '; + if (!Configuration::get('SOCOLISSIMO_KEY')) + $warning[] .= $this->l('\'Key\'').' '; + if (!Configuration::get('SOCOLISSIMO_URL')) + $warning[] .= $this->l('\'Url So\'').' '; + + if (count($warning)) + $this->warning .= implode(' , ',$warning).$this->l('must be configured to use this module correctly').' '; + } + $this->errorMessage = array('998' => $this->l('Invalid key'), '999' => $this->l('Error occurred during shipping step.'), '001' => $this->l('Login FO missing'), + '002' => $this->l('Login FO incorrect'), '003' => $this->l('Customer unauthorized'),'004' => $this->l('Required field missing'), '006' => $this->l('Missing signature'), + '007' => $this->l('Invalid signature'), '008' => $this->l('Invalid Zip/ Postal code'), '009' => $this->l('Incorrect url format return validation.'), '010' => $this->l('Incorrect url format return error.'), + '011' => $this->l('Invalid transaction ID.'), '012' => $this->l('Format incorrect shipping costs.'), '015' => $this->l('Socolissimo server unavailable.'), + '016' => $this->l('Socolissimo server unavailable.'), '004' => $this->l('Required field missing'), '004' => $this->l('Required field missing')); + + } + + public function install() + { + global $cookie; + + if (!parent::install() OR !Configuration::updateValue('SOCOLISSIMO_ID', NULL) OR !Configuration::updateValue('SOCOLISSIMO_KEY', NULL) + OR !Configuration::updateValue('SOCOLISSIMO_URL', 'https://ws.colissimo.fr/pudo-fo/storeCall.do') OR !Configuration::updateValue('SOCOLISSIMO_PREPARATION_TIME', 1) + OR !Configuration::updateValue('SOCOLISSIMO_OVERCOST', 3.6) OR !$this->registerHook('extraCarrier') OR !$this->registerHook('AdminOrder') OR !$this->registerHook('updateCarrier') + OR !$this->registerHook('newOrder') OR !Configuration::updateValue('SOCOLISSIMO_SUP_URL', 'http://ws.colissimo.fr/supervision-pudo/supervision.jsp') + OR !Configuration::updateValue('SOCOLISSIMO_SUP', true)) + return false; + + + //creat config table in database + $sql = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'socolissimo_delivery_info` ( + `id_cart` int(10) NOT NULL, + `id_customer` int(10) NOT NULL, + `delivery_mode` varchar(3) NOT NULL, + `prid` text(10) NOT NULL, + `prname` varchar(64) NOT NULL, + `prfirstname` varchar(64) NOT NULL, + `prcompladress` text NOT NULL, + `pradress1` text NOT NULL, + `pradress2` text NOT NULL, + `pradress3` text NOT NULL, + `pradress4` text NOT NULL, + `przipcode` text(10) NOT NULL, + `prtown` varchar(64) NOT NULL, + `cephonenumber` varchar(10) NOT NULL, + `ceemail` varchar(64) NOT NULL, + `cecompanyname` varchar(64) NOT NULL, + `cedeliveryinformation` text NOT NULL, + `cedoorcode1` varchar(10) NOT NULL, + `cedoorcode2` varchar(10) NOT NULL, + PRIMARY KEY (`id_cart`,`id_customer`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8;'; + + if(!Db::getInstance()->Execute($sql)) + return false; + + //add carrier in back office + if(!$this->createSoColissimoCarrier($this->_config)) + return false; + + return true; + } + + public function uninstall() + { + global $cookie; + + $so_id = (int)Configuration::get('SOCOLISSIMO_CARRIER_ID'); + + if (!parent::uninstall() + OR !Db::getInstance()->Execute('DROP TABLE IF EXISTS`'._DB_PREFIX_.'socolissimo_delivery_info`') + OR !$this->unregisterHook('extraCarrier') + OR !$this->unregisterHook('payment') + OR !$this->unregisterHook('AdminOrder') + OR !$this->unregisterHook('newOrder') + OR !$this->unregisterHook('updateCarrier') + OR !Configuration::deleteByName('SOCOLISSIMO_ID') + OR !Configuration::deleteByName('SOCOLISSIMO_KEY') + OR !Configuration::deleteByName('SOCOLISSIMO_URL') + OR !Configuration::deleteByName('SOCOLISSIMO_OVERCOST') + OR !Configuration::deleteByName('SOCOLISSIMO_PREPARATION_TIME') + OR !Configuration::deleteByName('SOCOLISSIMO_CARRIER_ID') + OR !Configuration::deleteByName('SOCOLISSIMO_SUP') + OR !Configuration::deleteByName('SOCOLISSIMO_SUP_URL') + OR !Configuration::deleteByName('SOCOLISSIMO_OVERCOST_TAX')) + return false; + + //Delete So Carrier + $soCarrier = new Carrier($so_id); + //if socolissimo carrier is default set other one as default + if(Configuration::get('PS_CARRIER_DEFAULT') == (int)($soCarrier->id)) + { + $carriersD = Carrier::getCarriers((int)($cookie->id_lang)); + foreach($carriersD as $carrierD) + if ($carrierD['active'] AND !$carrierD['deleted'] AND ($carrierD['name'] != $this->_config['name'])) + Configuration::updateValue('PS_CARRIER_DEFAULT', $carrierD['id_carrier']); + } + //save old carrier id + Configuration::updateValue('SOCOLISSIMO_CARRIER_ID_HIST', Configuration::get('SOCOLISSIMO_CARRIER_ID_HIST').'|'.(int)($soCarrier->id)); + $soCarrier->deleted = 1; + + if (!$soCarrier->update()) + return false; + return true; + } + + public function getContent() + { + $this->_html .= '

    ' . $this->l('So Colissimo').'

    '; + if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) + $this->_html .= '
    nok '.$this->l('So Colissimo isn\'t compliant with One Page Checkout feature, in order to use this module, please activate the standard order process (Preferences > "Order process type")').'
    '; + + if (!empty($_POST) AND Tools::isSubmit('submitSave')) + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= '
    nok '.$err.'
    '; + } + $this->_displayForm(); + return $this->_html; + } + + + private function _displayForm() + { + global $cookie; + + $this->_html .= '
    +
    '.$this->l('Description').''. + $this->l('SoColissimo is a service offered by La Poste, which allows you to offer buyers 5 modes of delivery.').' : +

      +
    • '.$this->l('To home').'.
    • +
    • '.$this->l('To home (with appointment)').'.
    • +
    • '.$this->l('To Cityssimo space').'.
    • +
    • '.$this->l('To post office').'.
    • +
    • '.$this->l('To merchant').'.
    • +
    +

    '.$this->l('This module is free and allows you to activate the offer on your store.').'

    +

    + >'.$this->l('Documentation').'<

    +
    +
     
    +
    '.$this->l('Settings').' + +
    +

    '.$this->l('To open your SoColissimo account, please contact "La Poste" at this phone number: 3634 (French phone number).').'

    +
    + + +
    + +

    ' . $this->l('Id user for back office SoColissimo.') . '

    +
    + + +
    + +

    '.$this->l('Secure key for back office SoColissimo.').'

    +
    + + +
    + '.$this->l('Day(s)').' +

    ' . $this->l('Average time of preparation of materials.') . '
    ' + .$this->l('Average time must be the same in Coliposte back office.').'

    +
    + + +
    + € HT +

    '. $this->l('Additional cost if making appointments.') . '
    ' + .$this->l('Additional cost must be the same in Coliposte back office.').'

    +
    +
    +

    --------------------------------------------------------------------------------------------------------

    + ' + .$this->l('Be VERY CAREFUL with these settings, change may cause a malfunction of the module.'). + ' +
    + +
    + +

    ' . $this->l('Url of back office SoColissimo.') . '

    +
    + + +
    + + + + +

    '.$this->l('Enable or disable the \'check availability\' of SoColissimo service.').'

    +
    + + +
    + +

    ' . $this->l('Url of supervision.') . '

    +
    + +
    + +
    +
    + +
     
    + +
    '.$this->l('Information').' +

    '.$this->l('Please fill in these two addresses in your Back Office SoColissimo.').' :


    + +
    +

    '.htmlentities($this->url,ENT_NOQUOTES, 'UTF-8').'

    +
    + +
    +

    '.htmlentities($this->url,ENT_NOQUOTES, 'UTF-8').'

    +
    +
    '; + } + + private function _postValidation() + { + if (Tools::getValue('id_user') == NULL) + $this->_postErrors[] = $this->l('ID SO not specified'); + + if (Tools::getValue('key') == NULL) + $this->_postErrors[] = $this->l('Key SO not specified'); + + if (Tools::getValue('dypreparationtime') == NULL) + $this->_postErrors[] = $this->l('Preparation time not specified'); + elseif (!Validate::isInt(Tools::getValue('dypreparationtime'))) + $this->_postErrors[] = $this->l('Invalid preparation time'); + + if (Tools::getValue('overcost') == NULL) + $this->_postErrors[] = $this->l('Overcost not specified'); + elseif (!Validate::isFloat(Tools::getValue('overcost'))) + $this->_postErrors[] = $this->l('Invalid overcost'); + } + + private function _postProcess() + { + + if (Configuration::updateValue('SOCOLISSIMO_ID', Tools::getValue('id_user')) + AND Configuration::updateValue('SOCOLISSIMO_KEY', Tools::getValue('key')) + AND Configuration::updateValue('SOCOLISSIMO_URL', pSQL(Tools::getValue('url_so'))) + AND Configuration::updateValue('SOCOLISSIMO_PREPARATION_TIME', (int)(Tools::getValue('dypreparationtime'))) + AND Configuration::updateValue('SOCOLISSIMO_OVERCOST', (float)(Tools::getValue('overcost'))) + AND Configuration::updateValue('SOCOLISSIMO_SUP_URL', Tools::getValue('url_sup')) + AND Configuration::updateValue('SOCOLISSIMO_OVERCOST_TAX', Tools::getValue('id_tax_rules_group')) + AND Configuration::updateValue('SOCOLISSIMO_SUP', (int)(Tools::getValue('sup_active')))) + { + //save old carrier id if change + if (!in_array((int)(Tools::getValue('carrier')), explode('|',Configuration::get('SOCOLISSIMO_CARRIER_ID_HIST')))) + Configuration::updateValue('SOCOLISSIMO_CARRIER_ID_HIST', Configuration::get('SOCOLISSIMO_CARRIER_ID_HIST').'|'.(int)(Tools::getValue('carrier'))); + + $dataSync = (($so_login = Configuration::get('SOCOLISSIMO_ID')) + ? '' : ''); + $this->_html .= $this->displayConfirmation($this->l('Configuration updated').$dataSync); + + } + else + $this->_html .= '
    nok '.$this->l('Cannot save settings').'
    '; + } + + public function hookExtraCarrier($params) + { + global $smarty, $cookie; + + $customer = new Customer($params['address']->id_customer); + $gender = array('1'=>'MR','2'=>'MME'); + if (in_array((int)($customer->id_gender),array(1,2))) + $cecivility = $gender[(int)($customer->id_gender)]; + else + $cecivility = 'MR'; + $carrierSo = new Carrier((int)(Configuration::get('SOCOLISSIMO_CARRIER_ID'))); + + if (isset($carrierSo) AND $carrierSo->active) + { + $signature = $this->make_key(substr($this->lower($params['address']->lastname),0,34), + (int)(Configuration::Get('SOCOLISSIMO_PREPARATION_TIME')), + number_format((float)($params['cart']->getOrderShippingCost($carrierSo->id, true)), 2, ',', ''), + (int)($params['address']->id_customer),(int)($params['address']->id)); + + $orderId = $this->formatOrderId((int)($params['address']->id)); + $inputs = array('PUDOFOID' => Configuration::get('SOCOLISSIMO_ID'), + 'ORDERID' => $orderId, + 'CENAME' => substr($this->lower($params['address']->lastname),0, 34), + 'TRCLIENTNUMBER' => $this->upper((int)($params['address']->id_customer)), + 'CECIVILITY' => $cecivility, + 'CEFIRSTNAME' => substr($this->lower($params['address']->firstname),0,29), + 'CECOMPANYNAME' => substr($this->upper($params['address']->company),0,38), + 'CEEMAIL' => $params['cookie']->email, + 'CEPHONENUMBER' => str_replace(array(' ', '.', '-', ',', ';', '+', '/', '\\', '+', '(', ')'),'',$params['address']->phone_mobile), + 'CEADRESS3' => substr($this->upper($params['address']->address1),0,38), + 'CEADRESS4' => substr($this->upper($params['address']->address2),0,38), + 'CEZIPCODE' => $params['address']->postcode, + 'CETOWN' => substr($this->upper($params['address']->city),0,32), + 'DYWEIGHT' => ((float)($params['cart']->getTotalWeight()) * 1000), + 'SIGNATURE' => htmlentities($signature,ENT_NOQUOTES, 'UTF-8'), + 'TRPARAMPLUS' => (int)($carrierSo->id), + 'DYFORWARDINGCHARGES' => number_format((float)($params['cart']->getOrderShippingCost($carrierSo->id)), 2, ',', ''), + 'DYPREPARATIONTIME' => (int)(Configuration::Get('SOCOLISSIMO_PREPARATION_TIME')), + 'TRRETURNURLKO' => htmlentities($this->url,ENT_NOQUOTES, 'UTF-8'), + 'TRRETURNURLOK' => htmlentities($this->url,ENT_NOQUOTES, 'UTF-8')); + + $serialsInput = ''; + foreach($inputs as $key => $val) + $serialsInput .= '&'.$key.'='.$val; + $serialsInput = ltrim($serialsInput, '&'); + $row['id_carrier'] = (int)($carrierSo->id); + $smarty->assign(array('urlSo' => Configuration::get('SOCOLISSIMO_URL').'?trReturnUrlKo='.htmlentities($this->url,ENT_NOQUOTES, 'UTF-8'),'id_carrier' => (int)($row['id_carrier']), + 'inputs' => $inputs, 'serialsInput' => $serialsInput, 'finishProcess' => $this->l('To choose SoColissimo, click on a delivery method'))); + + $country = new Country((int)($params['address']->id_country)); + $carriers = Carrier::getCarriers($cookie->id_lang, true , false,false, NULL, ALL_CARRIERS); + $ids = array(); + foreach($carriers as $carrier) + $ids[] = $carrier['id_carrier']; + + if ($this->getDeliveryInfos((int)$cookie->id_cart, (int)$cookie->id_customer)) + $smarty->assign('already_select_delivery', true); + else + $smarty->assign('already_select_delivery', false); + + if (($country->iso_code == 'FR') AND (Configuration::Get('SOCOLISSIMO_ID') != NULL) + AND (Configuration::get('SOCOLISSIMO_KEY') != NULL) AND $this->checkAvailibility() + AND $this->checkSoCarrierAvailable((int)(Configuration::get('SOCOLISSIMO_CARRIER_ID'))) + AND in_array((int)(Configuration::get('SOCOLISSIMO_CARRIER_ID')),$ids)) + { + return $this->display(__FILE__, 'socolissimo_carrier.tpl'); + } + else + { + $smarty->assign('ids', explode('|',Configuration::get('SOCOLISSIMO_CARRIER_ID_HIST'))); + return $this->display(__FILE__, 'socolissimo_error.tpl'); + } + + } + } + + public function hooknewOrder($params) + { + global $cookie; + if ($params['order']->id_carrier != Configuration::get('SOCOLISSIMO_CARRIER_ID')) + return; + $order = $params['order']; + $order->id_address_delivery = $this->isSameAddress((int)($order->id_address_delivery), (int)($order->id_cart), (int)($order->id_customer)); + $order->update(); + } + + public function hookAdminOrder($params) + { + + $deliveryMode = array('DOM' => 'Livraison à domicile', 'BPR' => 'Livraison en Bureau de Poste', + 'A2P' => 'Livraison Commerce de proximité', 'MRL' => 'Livraison Commerce de proximité', + 'CIT' => 'Livraison en Cityssimo', 'ACP' => 'Agence ColiPoste', 'CDI' => 'Centre de distribution', + 'RDV' => 'Livraison sur Rendez-vous'); + + $order = new Order($params['id_order']); + $addressDelivery = new Address((int)($order->id_address_delivery), (int)($params['cookie']->id_lang)); + + $soCarrier = new Carrier((int)(Configuration::get('SOCOLISSIMO_CARRIER_ID'))); + $deliveryInfos = $this->getDeliveryInfos((int)($order->id_cart),(int)($order->id_customer)); + if (((int)($order->id_carrier) == (int)($soCarrier->id) OR in_array((int)($order->id_carrier), explode('|',Configuration::get('SOCOLISSIMO_CARRIER_ID_HIST')))) AND !empty($deliveryInfos)) + { + $html = '

    '.$this->l('So Colissimo').''; + $html .= ''.$this->l('Delivery mode').' : '; + switch ($deliveryInfos['delivery_mode']) + { + case 'DOM': + case 'RDV': + $html .= $deliveryMode[$deliveryInfos['delivery_mode']].'

    '; + $html .=''.$this->l('Customer').' : '.Tools::htmlentitiesUTF8($addressDelivery->firstname).' '.Tools::htmlentitiesUTF8($addressDelivery->lastname).'
    '. + (!empty($deliveryInfos['cecompanyname']) ? ''.$this->l('Company').' : '.Tools::htmlentitiesUTF8($deliveryInfos['cecompanyname']).'
    ' : '' ). + (!empty($deliveryInfos['ceemail']) ? ''.$this->l('E-mail address').' : '.Tools::htmlentitiesUTF8($deliveryInfos['ceemail']).'
    ' : '' ). + (!empty($deliveryInfos['cephonenumber']) ? ''.$this->l('Phone').' : '.Tools::htmlentitiesUTF8($deliveryInfos['cephonenumber']).'

    ' : '' ). + ''.$this->l('Customer address').' :
    ' + .(Tools::htmlentitiesUTF8($addressDelivery->address1) ? Tools::htmlentitiesUTF8($addressDelivery->address1).'
    ' : '') + .(!empty($addressDelivery->address2) ? Tools::htmlentitiesUTF8($addressDelivery->address2).'
    ' : '') + .(!empty($addressDelivery->postcode) ? Tools::htmlentitiesUTF8($addressDelivery->postcode).'
    ' : '') + .(!empty($addressDelivery->city) ? Tools::htmlentitiesUTF8($addressDelivery->city).'
    ' : '') + .(!empty($addressDelivery->country) ? Tools::htmlentitiesUTF8($addressDelivery->country).'
    ' : '') + .(!empty($addressDelivery->other) ? '
    '.$this->l('Other').' : '.Tools::htmlentitiesUTF8($addressDelivery->other).'

    ' : '') + .(!empty($deliveryInfos['cedoorcode1']) ? ''.$this->l('Door code').' 1 : '.Tools::htmlentitiesUTF8($deliveryInfos['cedoorcode1']).'
    ' : '' ) + .(!empty($deliveryInfos['cedoorcode2']) ? ''.$this->l('Door code').' 2 : '.Tools::htmlentitiesUTF8($deliveryInfos['cedoorcode2']).'
    ' : '' ) + .(!empty($deliveryInfos['cedeliveryinformation']) ? ''.$this->l('Delivery information').' : '.Tools::htmlentitiesUTF8($deliveryInfos['cedeliveryinformation']).'

    ' : '' ); + break; + default: + $html .= str_replace('+',' ',$deliveryMode[$deliveryInfos['delivery_mode']]).'
    ' + .(!empty($deliveryInfos['prid']) ? ''.$this->l('Pick up point ID').' : '.Tools::htmlentitiesUTF8($deliveryInfos['prid']).'
    ' : '' ) + .(!empty($deliveryInfos['prname']) ? ''.$this->l('Pick up point').' : '.Tools::htmlentitiesUTF8($deliveryInfos['prname']).'
    ' : '' ) + .''.$this->l('Pick up point address').' :
    ' + .(!empty($deliveryInfos['pradress1']) ? Tools::htmlentitiesUTF8($deliveryInfos['pradress1']).'
    ' : '' ) + .(!empty($deliveryInfos['pradress2']) ? Tools::htmlentitiesUTF8($deliveryInfos['pradress2']).'
    ' : '' ) + .(!empty($deliveryInfos['pradress3']) ? Tools::htmlentitiesUTF8($deliveryInfos['pradress3']).'
    ' : '' ) + .(!empty($deliveryInfos['pradress4']) ? Tools::htmlentitiesUTF8($deliveryInfos['pradress4']).'
    ' : '' ) + .(!empty($deliveryInfos['przipcode']) ? Tools::htmlentitiesUTF8($deliveryInfos['przipcode']).'
    ' : '' ) + .(!empty($deliveryInfos['prtown']) ? Tools::htmlentitiesUTF8($deliveryInfos['prtown']).'
    ' : '' ) + .(!empty($deliveryInfos['ceemail']) ? ''.$this->l('Email').' : '.Tools::htmlentitiesUTF8($deliveryInfos['ceemail']).'
    ' : '' ) + .(!empty($deliveryInfos['cephonenumber']) ? ''.$this->l('Phone').' : '.Tools::htmlentitiesUTF8($deliveryInfos['cephonenumber']).'

    ' : '' ); + + break; + } + $html .= '
    '; + return $html; + } + + } + + public function hookupdateCarrier($params) + { + if ((int)($params['id_carrier']) == (int)(Configuration::get('SOCOLISSIMO_CARRIER_ID'))) + { + Configuration::updateValue('SOCOLISSIMO_CARRIER_ID', (int)($params['carrier']->id)); + Configuration::updateValue('SOCOLISSIMO_CARRIER_ID_HIST', Configuration::get('SOCOLISSIMO_CARRIER_ID_HIST').'|'.(int)($params['carrier']->id)); + } + + } + + public function make_key($ceName, $dyPraparationTime, $dyForwardingCharges, $trClientNumber, $orderId) + { + return sha1(Configuration::get('SOCOLISSIMO_ID').$ceName.$dyPraparationTime.$dyForwardingCharges.$trClientNumber.self::formatOrderId($orderId).Configuration::get('SOCOLISSIMO_KEY')); + } + + public static function createSoColissimoCarrier($config) + { + $carrier = new Carrier(); + $carrier->name = $config['name']; + $carrier->id_tax_rules_group = $config['id_tax_rules_group']; + $carrier->id_zone = $config['id_zone']; + $carrier->url = $config['url']; + $carrier->active = $config['active']; + $carrier->deleted = $config['deleted']; + $carrier->delay = $config['delay']; + $carrier->shipping_handling = $config['shipping_handling']; + $carrier->range_behavior = $config['range_behavior']; + $carrier->is_module = $config['is_module']; + $carrier->shipping_external = $config['shipping_external']; + $carrier->external_module_name = $config['external_module_name']; + $carrier->need_range = $config['need_range']; + + $languages = Language::getLanguages(true); + foreach ($languages as $language) { + if ($language['iso_code'] == 'fr') + $carrier->delay[$language['id_lang']] = $config['delay'][$language['iso_code']]; + if ($language['iso_code'] == 'en') + $carrier->delay[$language['id_lang']] = $config['delay'][$language['iso_code']]; + } + if($carrier->add()) + { + + Configuration::updateValue('SOCOLISSIMO_CARRIER_ID',(int)($carrier->id)); + $groups = Group::getgroups(true); + foreach ($groups as $group) + { + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'carrier_group VALUE (\''.(int)($carrier->id).'\',\''.(int)($group['id_group']).'\')'); + } + $rangePrice = new RangePrice(); + $rangePrice->id_carrier = $carrier->id; + $rangePrice->delimiter1 = '0'; + $rangePrice->delimiter2 = '10000'; + $rangePrice->add(); + + $rangeWeight = new RangeWeight(); + $rangeWeight->id_carrier = $carrier->id; + $rangeWeight->delimiter1 = '0'; + $rangeWeight->delimiter2 = '10000'; + $rangeWeight->add(); + + $zones = Zone::getZones(true); + foreach ($zones as $zone) + { + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'carrier_zone VALUE (\''.(int)($carrier->id).'\',\''.(int)($zone['id_zone']).'\')'); + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'delivery VALUE (\'\',\''.(int)($carrier->id).'\',\''.(int)($rangePrice->id).'\',NULL,\''.(int)($zone['id_zone']).'\',\'1\')'); + Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'delivery VALUE (\'\',\''.(int)($carrier->id).'\',NULL,\''.(int)($rangeWeight->id).'\',\''.(int)($zone['id_zone']).'\',\'1\')'); + } + //copy logo + if (!copy(dirname(__FILE__).'/socolissimo.jpg',_PS_SHIP_IMG_DIR_.'/'.$carrier->id.'.jpg')) + return false; + return true; + } + else + return false; + } + + public function getDeliveryInfos($idCart,$idCustomer) + { + + $result = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'socolissimo_delivery_info WHERE id_cart = '.(int)($idCart).' AND id_customer = '.(int)($idCustomer)); + return $result; + } + + public function isSameAddress($idAddress,$idCart,$idCustomer) + { + $return = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'socolissimo_delivery_info WHERE id_cart =\''.(int)($idCart).'\' AND id_customer =\''.(int)($idCustomer).'\''); + $psAddress = new Address((int)($idAddress)); + $newAddress = new Address(); + + if ($this->upper($psAddress->lastname) != $this->upper($return['prname']) || $this->upper($psAddress->firstname) != $this->upper($return['prfirstname']) || $this->upper($psAddress->address1) != $this->upper($return['pradress3']) || $this->upper($psAddress->address2) != $this->upper($return['pradress2']) || $this->upper($psAddress->postcode) != $this->upper($return['przipcode']) || $this->upper($psAddress->city) != $this->upper($return['prtown']) || str_replace(array(' ', '.', '-', ',', ';', '+', '/', '\\', '+', '(', ')'),'',$psAddress->phone_mobile) != $return['cephonenumber']) + { + + $newAddress->id_customer = (int)($idCustomer); + $newAddress->lastname = substr($return['prname'],0,32); + $newAddress->firstname = substr($return['prfirstname'],0,32); + $newAddress->postcode = $return['przipcode']; + $newAddress->city = $return['prtown']; + $newAddress->id_country = Country::getIdByName(null, 'france'); + $newAddress->alias = 'So Colissimo - '.date('d-m-Y'); + + if (!in_array($return['delivery_mode'], array('DOM','RDV'))) + { + $newAddress->active = 1; + $newAddress->deleted = 1; + $newAddress->address1 = $return['pradress1']; + $newAddress->add(); + } + else + { + $newAddress->address1 = $return['pradress3']; + ((isset($return['pradress2'])) ? $newAddress->address2 = $return['pradress2'] : $newAddress->address2 = ''); + ((isset($return['pradress1'])) ? $newAddress->other .= $return['pradress1'] : $newAddress->other = ''); + ((isset($return['pradress4'])) ? $newAddress->other .= ' | '.$return['pradress4'] : $newAddress->other = ''); + $newAddress->postcode = $return['przipcode']; + $newAddress->city = $return['prtown']; + $newAddress->id_country = Country::getIdByName(null, 'france'); + $newAddress->alias = 'So Colissimo - '.date('d-m-Y'); + $newAddress->add(); + } + return (int)($newAddress->id); + } + else + return (int)($psAddress->id); + } + + public function checkZone($id_carrier) + { + $result = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'carrier_zone WHERE id_carrier = '.(int)($id_carrier)); + if ($result) + return true; + else + return false; + } + + public function checkGroup($id_carrier) + { + $result = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'carrier_group WHERE id_carrier = '.(int)($id_carrier)); + if ($result) + return true; + else + return false; + } + + public function checkRange($id_carrier) + { + switch (Configuration::get('PS_SHIPPING_METHOD')) + { + case '0' : + $sql = 'SELECT * FROM '._DB_PREFIX_.'range_price WHERE id_carrier = '.(int)($id_carrier); + break; + case '1' : + $sql = 'SELECT * FROM '._DB_PREFIX_.'range_weight WHERE id_carrier = '.(int)($id_carrier); + break; + } + $result = Db::getInstance()->getRow($sql); + if ($result) + return true; + else + return false; + } + + public function checkDelivery($id_carrier) + { + $result = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'delivery WHERE id_carrier = '.(int)($id_carrier)); + if ($result) + return true; + else + return false; + } + + public function upper($strIn) + { + $strOut = Tools::link_rewrite($strIn); + return strtoupper(str_replace('-',' ',$strOut)); + } + + + public function lower($strIn) + { + $strOut = Tools::link_rewrite($strIn); + return strtolower(str_replace('-',' ',$strOut)); + } + + public function formatOrderId($id) + { + if(strlen($id)<5) + while (strLen($id) != 5) + { + $id = '0'.$id; + } + return $id; + } + + public function checkAvailibility() + { + if (Configuration::get('SOCOLISSIMO_SUP')) + { + $ctx = stream_context_create(array('http' => array('timeout' => 1))); + $return = @file_get_contents(Configuration::get('SOCOLISSIMO_SUP_URL'), 0, $ctx); + + if(ini_get('allow_url_fopen') == 0) + return true; + else + { + if (!empty($return)) + { + preg_match('[OK]',$return, $matches); + if ($matches[0]=='OK') + return true; + else + return false; + } + } + } + else + return true; + } + + public function displaySoError($key) + { + return $this->errorMessage[$key]; + } + + private function checkSoCarrierAvailable($id_carrier) + { + global $cart, $defaultCountry; + $carrier = new Carrier((int)($id_carrier)); + $address = new Address((int)($cart->id_address_delivery)); + $id_zone = Address::getZoneById((int)($address->id)); + + // Get only carriers that are compliant with shipping method + if ((Configuration::get('PS_SHIPPING_METHOD') AND $carrier->getMaxDeliveryPriceByWeight($id_zone) === false) + OR (!Configuration::get('PS_SHIPPING_METHOD') AND $carrier->getMaxDeliveryPriceByPrice($id_zone) === false)) + { + return false; + } + + // If out-of-range behavior carrier is set on "Desactivate carrier" + if ($carrier->range_behavior) + { + // Get id zone + if (isset($cart->id_address_delivery) AND $cart->id_address_delivery) + $id_zone = Address::getZoneById((int)($cart->id_address_delivery)); + else + $id_zone = (int)$defaultCountry->id_zone; + + // Get only carriers that have a range compatible with cart + if ((Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByWeight((int)($carrier->id), $cart->getTotalWeight(), $id_zone))) + OR (!Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByPrice((int)($carrier->id), $cart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING), $id_zone, $cart->id_currency)))) + { + return false; + } + } + return true; + } + + public function getOrderShippingCost($params,$shipping_cost) + { + global $cart; + $deliveryInfo = $this->getDeliveryInfos($cart->id, $cart->id_customer); + if (!empty($deliveryInfo)) + if ($deliveryInfo['delivery_mode'] == 'RDV') + $shipping_cost += (float)(Configuration::get('SOCOLISSIMO_OVERCOST')); + return $shipping_cost; + } + + public function getOrderShippingCostExternal($params){} + +} + diff --git a/modules/socolissimo/socolissimo_carrier.tpl b/modules/socolissimo/socolissimo_carrier.tpl new file mode 100644 index 000000000..ea1d71ac3 --- /dev/null +++ b/modules/socolissimo/socolissimo_carrier.tpl @@ -0,0 +1,128 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{if isset($opc) && $opc} + +{else} + +{/if} +{if isset($already_select_delivery) && $already_select_delivery} + +{else} + +{/if} + + +{foreach from=$inputs item=input key=name name=myLoop} + +{/foreach} diff --git a/modules/socolissimo/socolissimo_error.tpl b/modules/socolissimo/socolissimo_error.tpl new file mode 100644 index 000000000..36fffd934 --- /dev/null +++ b/modules/socolissimo/socolissimo_error.tpl @@ -0,0 +1,37 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + diff --git a/modules/socolissimo/validation.php b/modules/socolissimo/validation.php new file mode 100644 index 000000000..b090ae627 --- /dev/null +++ b/modules/socolissimo/validation.php @@ -0,0 +1,204 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include('../../config/config.inc.php'); +include('../../init.php'); +include('../../header.php'); + +require_once(_PS_MODULE_DIR_ . 'socolissimo/socolissimo.php'); + +$validReturn = array('PUDOFOID','CECIVILITY','CENAME','CEFIRSTNAME', 'CECOMPANYNAME','CEEMAIL','CEPHONENUMBER', 'DELIVERYMODE','CEADRESS1','CEADRESS2','CEADRESS3','CEADRESS4', + 'CEZIPCODE','CEDOORCODE1','CEDOORCODE2','CEENTRYPHONE','DYPREPARATIONTIME','DYFORWARDINGCHARGES','ORDERID', 'SIGNATURE','ERRORCODE','TRPARAMPLUS','TRCLIENTNUMBER','PRID','PRNAME', + 'PRCOMPLADRESS','PRADRESS1','PRADRESS2','PRZIPCODE', 'PRTOWN','CETOWN','TRADERCOMPANYNAME', 'CEDELIVERYINFORMATION', 'CEDOORCODE1', 'CEDOORCODE2'); + +//list of non-blocking error +$nonBlockingError = array(133, 131, 517, 516, 515, 514, 513, 512, 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, 501); + +$so = new Socolissimo(); + +$return = array(); +foreach ($_POST AS $key => $val) + if (in_array(strtoupper($key),$validReturn)) + $return[strtoupper($key)] = utf8_encode(urldecode(stripslashes($val))); + +if (isset($return['SIGNATURE']) AND isset($return['CENAME']) AND isset($return['DYPREPARATIONTIME']) AND isset($return['DYFORWARDINGCHARGES']) AND isset($return['TRCLIENTNUMBER']) AND isset($return['ORDERID']) AND isset($return['TRCLIENTNUMBER'])) +{ + if (!isset($return['ERRORCODE']) OR $return['ERRORCODE'] == NULL OR in_array($return['ERRORCODE'],$nonBlockingError)) + { + + if ($return['SIGNATURE'] === socolissimo::make_key($return['CENAME'],(float)($return['DYPREPARATIONTIME']),$return['DYFORWARDINGCHARGES'],$return['TRCLIENTNUMBER'], $return['ORDERID'])) + { + global $cookie ; + if (isset($cookie) OR is_object($cookie)) + { + + if (saveOrderShippingDetails((int)($cookie->id_cart),(int)($return['TRCLIENTNUMBER']),$return)) + { + global $cookie; + $cart->id_carrier = (int)($_POST['TRPARAMPLUS']); + if (!$cart->update()) + Tools::redirect(); + else + Tools::redirect('index.php?controller=order&step=3'); + } + else + echo '
    nok '.$so->displaySoError('999').' +


    « Retour

    '; + } + else + echo '
    nok '.$so->displaySoError('999').' +


    « Retour

    '; + } + else + { + echo '
    nok '.$so->displaySoError('998').' +


    « Retour

    '; + } + } + else + { + echo '
    nok '.$so->displaySoError('999').': '; + $errors = explode(',', str_replace('+',',', $return['ERRORCODE'])); + foreach($errors as $error) + echo $so->displaySoError(rtrim($error)); + echo '


    + « Retour +

    '; } +} +else + Tools::redirect(); + +include('../../footer.php'); + +function saveOrderShippingDetails($idCart, $idCustomer, $soParams) +{ + + $deliveryMode = array('DOM' => 'Livraison à domicile', 'BPR' => 'Livraison en Bureau de Poste', + 'A2P' => 'Livraison Commerce de proximité', 'MRL' => 'Livraison Commerce de proximité', + 'CIT' => 'Livraison en Cityssimo', 'ACP' => 'Agence ColiPoste', 'CDI' => 'Centre de distribution', + 'RDV' => 'Livraison sur Rendez-vous'); + + $db = Db::getInstance(); + $db->ExecuteS('SELECT * FROM '._DB_PREFIX_.'socolissimo_delivery_info WHERE id_cart = '.(int)($idCart).' AND id_customer ='.(int)($idCustomer)); + $numRows = (int)($db->NumRows()); + if ($numRows == 0) + { + $sql = 'INSERT INTO '._DB_PREFIX_.'socolissimo_delivery_info + ( `id_cart`, `id_customer`, `delivery_mode`, `prid`, `prname`, `prfirstname`, `prcompladress`, + `pradress1`, `pradress2`, `pradress3`, `pradress4`, `przipcode`, `prtown`, `cephonenumber`, `ceemail` , `cecompanyname`, `cedeliveryinformation`, `cedoorcode1`, `cedoorcode2`) + VALUES ('.(int)($idCart).','.(int)($idCustomer).','; + if ($soParams['DELIVERYMODE'] != 'DOM' AND $soParams['DELIVERYMODE'] != 'RDV') + $sql .= '\''.pSQL($soParams['DELIVERYMODE']).'\''.', + '.(isset($soParams['PRID']) ? '\''.pSQL($soParams['PRID']).'\'' : '').', + '.(isset($soParams['PRNAME']) ? '\''.ucfirst(pSQL($soParams['PRNAME'])).'\'' : '').', + '.(isset($deliveryMode[$soParams['DELIVERYMODE']]) ? '\''.$deliveryMode[$soParams['DELIVERYMODE']].'\'' : 'So Colissimo').', + '.(isset($soParams['PRCOMPLADRESS']) ? '\''.pSQL($soParams['PRCOMPLADRESS']).'\'' : '\'\'').', + '.(isset($soParams['PRADRESS1']) ? '\''.pSQL($soParams['PRADRESS1']).'\'' : '\'\'').', + '.(isset($soParams['PRADRESS2']) ? '\''.pSQL($soParams['PRADRESS2']).'\'' : '\'\'').', + '.(isset($soParams['PRADRESS3']) ? '\''.pSQL($soParams['PRADRESS3']).'\'' : '\'\'').', + '.(isset($soParams['PRADRESS4']) ? '\''.pSQL($soParams['PRADRESS4']).'\'' : '\'\'').', + '.(isset($soParams['PRZIPCODE']) ? '\''.pSQL($soParams['PRZIPCODE']).'\'' : '\'\'').', + '.(isset($soParams['PRTOWN']) ? '\''.pSQL($soParams['PRTOWN']).'\'' : '\'\'').', + '.(isset($soParams['CEPHONENUMBER']) ? '\''.pSQL($soParams['CEPHONENUMBER']).'\'' : '\'\'').', + '.(isset($soParams['CEEMAIL']) ? '\''.pSQL($soParams['CEEMAIL']).'\'' : '\'\'').', + '.(isset($soParams['CECOMPANYNAME']) ? '\''.pSQL($soParams['CECOMPANYNAME']).'\'' : '\'\'').', + '.(isset($soParams['CEDELIVERYINFORMATION']) ? '\''.pSQL($soParams['CEDELIVERYINFORMATION']).'\'' : '\'\'').', + '.(isset($soParams['CEDOORCODE1']) ? '\''.pSQL($soParams['CEDOORCODE1']).'\'' : '\'\'').', + '.(isset($soParams['CEDOORCODE2']) ? '\''.pSQL($soParams['CEDOORCODE2']).'\'' : '\'\'').')'; + else + $sql .= '\''.pSQL($soParams['DELIVERYMODE']).'\',\'\', + '.(isset($soParams['CENAME']) ? '\''.ucfirst(pSQL($soParams['CENAME'])).'\'' : '').', + '.(isset($soParams['CEFIRSTNAME']) ? '\''.ucfirst(pSQL($soParams['CEFIRSTNAME'])).'\'' : '').', + '.(isset($soParams['CECOMPLADRESS']) ? '\''.pSQL($soParams['CECOMPLADRESS']).'\'' : '\'\'').', + '.(isset($soParams['CEADRESS1']) ? '\''.pSQL($soParams['CEADRESS1']).'\'' : '\'\'').', + '.(isset($soParams['CEADRESS2']) ? '\''.pSQL($soParams['CEADRESS2']).'\'' : '\'\'').', + '.(isset($soParams['CEADRESS3']) ? '\''.pSQL($soParams['CEADRESS3']).'\'' : '\'\'').', + '.(isset($soParams['CEADRESS4']) ? '\''.pSQL($soParams['CEADRESS4']).'\'' : '\'\'').', + '.(isset($soParams['CEZIPCODE']) ? '\''.pSQL($soParams['CEZIPCODE']).'\'' : '\'\'').', + '.(isset($soParams['CETOWN']) ? '\''.pSQL($soParams['CETOWN']).'\'' : '\'\'').', + '.(isset($soParams['CEPHONENUMBER']) ? '\''.pSQL($soParams['CEPHONENUMBER']).'\'' : '\'\'').', + '.(isset($soParams['CEEMAIL']) ? '\''.pSQL($soParams['CEEMAIL']).'\'' : '\'\'').', + '.(isset($soParams['CECOMPANYNAME']) ? '\''.pSQL($soParams['CECOMPANYNAME']).'\'' : '\'\'').', + '.(isset($soParams['CEDELIVERYINFORMATION']) ? '\''.pSQL($soParams['CEDELIVERYINFORMATION']).'\'' : '\'\'').', + '.(isset($soParams['CEDOORCODE1']) ? '\''.pSQL($soParams['CEDOORCODE1']).'\'' : '\'\'').', + '.(isset($soParams['CEDOORCODE2']) ? '\''.pSQL($soParams['CEDOORCODE2']).'\'' : '\'\'').')'; + + if (Db::getInstance()->Execute($sql)) + return true; + } + else + { + $table = _DB_PREFIX_.'socolissimo_delivery_info'; + $values = array(); + $values['delivery_mode'] = pSQL($soParams['DELIVERYMODE']); + + if (!in_array($soParams['DELIVERYMODE'], array('DOM', 'RDV'))) + { + (isset($soParams['PRID']) ? $values['prid'] = pSQL($soParams['PRID']) : ''); + (isset($soParams['PRNAME']) ? $values['prname'] = ucfirst(pSQL($soParams['PRNAME'])) : ''); + (isset($deliveryMode['DELIVERYMODE']) ? $values['prfirstname'] = $deliveryMode[$soParams['DELIVERYMODE']] : $values['prfirstname'] = 'So Colissimo'); + (isset($soParams['PRCOMPLADRESS']) ? $values['prcompladress'] = pSQL($soParams['PRCOMPLADRESS']) : ''); + (isset($soParams['PRADRESS1']) ? $values['pradress1'] = pSQL($soParams['PRADRESS1']) : ''); + (isset($soParams['PRADRESS2']) ? $values['pradress2'] = pSQL($soParams['PRADRESS2']) : ''); + (isset($soParams['PRADRESS3']) ? $values['pradress3'] = pSQL($soParams['PRADRESS3']) : ''); + (isset($soParams['PRADRESS4']) ? $values['pradress4'] = pSQL($soParams['PRADRESS4']) : ''); + (isset($soParams['PRZIPCODE']) ? $values['przipcode'] = pSQL($soParams['PRZIPCODE']) : ''); + (isset($soParams['CETOWN']) ? $values['prtown'] = pSQL($soParams['CETOWN']) : ''); + (isset($soParams['CEPHONENUMBER']) ? $values['cephonenumber'] = pSQL($soParams['CEPHONENUMBER']) : ''); + (isset($soParams['CEEMAIL']) ? $values['ceemail'] = pSQL($soParams['CEEMAIL']) : ''); + (isset($soParams['CEDELIVERYINFORMATION']) ? $values['cedeliveryinformation'] = pSQL($soParams['CEDELIVERYINFORMATION']) : ''); + (isset($soParams['CEDOORCODE1']) ? $values['cedoorcode1'] = pSQL($soParams['CEDOORCODE1']) : ''); + (isset($soParams['CEDOORCODE2']) ? $values['cedoorcode2'] = pSQL($soParams['CEDOORCODE2']) : ''); + (isset($soParams['CECOMPANYNAME']) ? $values['cecompanyname'] = pSQL($soParams['CECOMPANYNAME']) : ''); + } + else + { + (isset($soParams['CENAME']) ? $values['prname'] = ucfirst(pSQL($soParams['CENAME'])) : ''); + (isset($soParams['CEFIRSTNAME']) ? $values['prfirstname'] = ucfirst(pSQL($soParams['CEFIRSTNAME'])) : ''); + (isset($soParams['CECOMPLADRESS']) ? $values['prcompladress'] = pSQL($soParams['CECOMPLADRESS']) : ''); + (isset($soParams['CEADRESS1']) ? $values['pradress1'] = pSQL($soParams['CEADRESS1']) : ''); + (isset($soParams['CEADRESS2']) ? $values['pradress2'] = pSQL($soParams['CEADRESS2']) : ''); + (isset($soParams['CEADRESS3']) ? $values['pradress3'] = pSQL($soParams['CEADRESS3']) : ''); + (isset($soParams['CEADRESS4']) ? $values['pradress4'] = pSQL($soParams['CEADRESS4']) : ''); + (isset($soParams['CEZIPCODE']) ? $values['przipcode'] = pSQL($soParams['CEZIPCODE']) : ''); + (isset($soParams['PRTOWN']) ? $values['prtown'] = pSQL($soParams['PRTOWN']) : '') ; + (isset($soParams['CEEMAIL']) ? $values['ceemail'] = pSQL($soParams['CEEMAIL']) : ''); + (isset($soParams['CEPHONENUMBER']) ? $values['cephonenumber'] = pSQL($soParams['CEPHONENUMBER']) : ''); + (isset($soParams['CEDELIVERYINFORMATION']) ? $values['cedeliveryinformation'] = pSQL($soParams['CEDELIVERYINFORMATION']) : ''); + (isset($soParams['CEDOORCODE1']) ? $values['cedoorcode1'] = pSQL($soParams['CEDOORCODE1']) : ''); + (isset($soParams['CEDOORCODE2']) ? $values['cedoorcode2'] = pSQL($soParams['CEDOORCODE2']) : ''); + (isset($soParams['CECOMPANYNAME']) ? $values['cecompanyname'] = pSQL($soParams['CECOMPANYNAME']) : ''); + } + $where = ' `id_cart` =\''.(int)($idCart).'\' AND `id_customer` =\''.(int)($idCustomer).'\''; + + if (Db::getInstance()->autoExecute($table, $values, 'UPDATE', $where)) + return true; + } +} + + + diff --git a/modules/statsbestcategories/config.xml b/modules/statsbestcategories/config.xml new file mode 100755 index 000000000..cbf7bc888 --- /dev/null +++ b/modules/statsbestcategories/config.xml @@ -0,0 +1,12 @@ + + + statsbestcategories + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsbestcategories/de.php b/modules/statsbestcategories/de.php new file mode 100644 index 000000000..bd6181895 --- /dev/null +++ b/modules/statsbestcategories/de.php @@ -0,0 +1,16 @@ +statsbestcategories_4f29d8c727dcf2022ac241cb96c31083'] = 'Ausgabe Aufnahmeeinstellungen leer'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eab2b4237a7cd89c309119e35f62d168'] = 'Anzeige'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_8bf8854bebe108183caeb845c7676ae4'] = 'von'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eebfd2d9a7ea25b9e61e8260bcd4849c'] = 'Insgesamt verkaufte Menge'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_411919c5d99ff5d0f9770e96ffe22a01'] = 'Gesamtpreis Verkauf'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_c13329e42ec01a10f84c0f950274b404'] = 'Insgesamt gesehen'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_6e3b3150807da868ebd33ad2c991b8d7'] = 'Beste Kategorien'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_a2e1fa19a6a3405a4e82cb5daa66310d'] = 'Eine Liste der besten Kategorien'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; + +?> \ No newline at end of file diff --git a/modules/statsbestcategories/en.php b/modules/statsbestcategories/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsbestcategories/en.php @@ -0,0 +1,4 @@ +statsbestcategories_4f29d8c727dcf2022ac241cb96c31083'] = 'El recordset se devolvió vacío'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eab2b4237a7cd89c309119e35f62d168'] = 'mostrando'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_8bf8854bebe108183caeb845c7676ae4'] = 'de'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_49ee3087348e8d44e1feda1917443987'] = 'Nombre:'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eebfd2d9a7ea25b9e61e8260bcd4849c'] = 'Cantidad total venta'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_411919c5d99ff5d0f9770e96ffe22a01'] = 'Precio total venta'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_c13329e42ec01a10f84c0f950274b404'] = 'Total visto'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_6e3b3150807da868ebd33ad2c991b8d7'] = 'Mejores categorías'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_a2e1fa19a6a3405a4e82cb5daa66310d'] = 'Lista de las mejores categorías'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; diff --git a/modules/statsbestcategories/fr.php b/modules/statsbestcategories/fr.php new file mode 100644 index 000000000..7ac882a9d --- /dev/null +++ b/modules/statsbestcategories/fr.php @@ -0,0 +1,14 @@ +statsbestcategories_4f29d8c727dcf2022ac241cb96c31083'] = 'Aucun résultat'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eab2b4237a7cd89c309119e35f62d168'] = 'Affichage de'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_8bf8854bebe108183caeb845c7676ae4'] = 'sur'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eebfd2d9a7ea25b9e61e8260bcd4849c'] = 'Quantité totale vendue'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_411919c5d99ff5d0f9770e96ffe22a01'] = 'Prix total vendu'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_c13329e42ec01a10f84c0f950274b404'] = 'Total consulté'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_6e3b3150807da868ebd33ad2c991b8d7'] = 'Meilleures catégories'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_a2e1fa19a6a3405a4e82cb5daa66310d'] = 'Liste des meilleures catégories'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; diff --git a/modules/statsbestcategories/it.php b/modules/statsbestcategories/it.php new file mode 100644 index 000000000..dc96ae0d7 --- /dev/null +++ b/modules/statsbestcategories/it.php @@ -0,0 +1,16 @@ +statsbestcategories_4f29d8c727dcf2022ac241cb96c31083'] = 'recordset vuoto restituito'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eab2b4237a7cd89c309119e35f62d168'] = 'Visualizzazione'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_8bf8854bebe108183caeb845c7676ae4'] = 'di'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_eebfd2d9a7ea25b9e61e8260bcd4849c'] = 'Quantità totali vendute'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_411919c5d99ff5d0f9770e96ffe22a01'] = 'Prezzo totale venduto'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_c13329e42ec01a10f84c0f950274b404'] = 'Totale Visto'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_6e3b3150807da868ebd33ad2c991b8d7'] = 'Migliori categorie'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_a2e1fa19a6a3405a4e82cb5daa66310d'] = 'Elenco dei migliori categorie'; +$_MODULE['<{statsbestcategories}prestashop>statsbestcategories_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV '; + +?> \ No newline at end of file diff --git a/modules/statsbestcategories/logo.gif b/modules/statsbestcategories/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3a15dd67285af0074b69bb46f3df2860ee7dfc GIT binary patch literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) literal 0 HcmV?d00001 diff --git a/modules/statsbestcategories/statsbestcategories.php b/modules/statsbestcategories/statsbestcategories.php new file mode 100644 index 000000000..b0323c41a --- /dev/null +++ b/modules/statsbestcategories/statsbestcategories.php @@ -0,0 +1,205 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6957 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsBestCategories extends ModuleGrid +{ + private $_html; + private $_query; + private $_columns; + private $_defaultSortColumn; + private $_defaultSortDirection; + private $_emptyMessage; + private $_pagingMessage; + + function __construct() + { + $this->name = 'statsbestcategories'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_defaultSortColumn = 'totalPriceSold'; + $this->_defaultSortDirection = 'DESC'; + $this->_emptyMessage = $this->l('Empty recordset returned'); + $this->_pagingMessage = $this->l('Displaying').' {0} - {1} '.$this->l('of').' {2}'; + + $this->_columns = array( + array( + 'id' => 'name', + 'header' => $this->l('Name'), + 'dataIndex' => 'name', + 'align' => 'left', + 'width' => 140 + ), + array( + 'id' => 'totalQuantitySold', + 'header' => $this->l('Total Quantity Sold'), + 'dataIndex' => 'totalQuantitySold', + 'width' => 20, + 'align' => 'right' + ), + array( + 'id' => 'totalPriceSold', + 'header' => $this->l('Total Price Sold'), + 'dataIndex' => 'totalPriceSold', + 'width' => 30, + 'align' => 'right' + ), + array( + 'id' => 'totalPageViewed', + 'header' => $this->l('Total Viewed'), + 'dataIndex' => 'totalPageViewed', + 'width' => 30, + 'align' => 'right' + ) + ); + + parent::__construct(); + + $this->displayName = $this->l('Best categories'); + $this->description = $this->l('A list of the best categories'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $engineParams = array( + 'id' => 'id_category', + 'title' => $this->displayName, + 'columns' => $this->_columns, + 'defaultSortColumn' => $this->_defaultSortColumn, + 'defaultSortDirection' => $this->_defaultSortDirection, + 'emptyMessage' => $this->_emptyMessage, + 'pagingMessage' => $this->_pagingMessage + ); + + if (Tools::getValue('export')) + $this->csvExport($engineParams); + + $this->_html = ' +
    '.$this->displayName.' + '.$this->engine($engineParams).' +
    '.$this->l('CSV Export').' +
    '; + return $this->_html; + } + + public function getData() + { + $dateBetween = $this->getDate(); + $id_lang = $this->getLang(); + + // If a shop is selected, get all children categories for the shop + $categories = array(); + if ($this->shopID || $this->shopGroupID) + { + $sql = 'SELECT c.nleft, c.nright + FROM '._DB_PREFIX_.'category c + WHERE c.id_category IN ( + SELECT s.id_category + FROM '._DB_PREFIX_.'shop s + WHERE s.id_shop IN ('.(($this->shopID) ? $this->shopID : 'SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID).') + )'; + if ($result = Db::getInstance()->executeS($sql)) + { + $ntreeRestriction = array(); + foreach ($result as $row) + $ntreeRestriction[] = '(nleft >= ' . $row['nleft'] . ' AND nright <= ' . $row['nright'] . ')'; + + if ($ntreeRestriction) + { + $sql = 'SELECT id_category + FROM '._DB_PREFIX_.'category + WHERE '.implode(' OR ', $ntreeRestriction); + if ($result = Db::getInstance()->executeS($sql)) + { + foreach ($result as $row) + $categories[] = $row['id_category']; + } + } + } + } + + // Get best categories + $this->_query = ' + SELECT SQL_CALC_FOUND_ROWS ca.`id_category`, CONCAT(parent.name, \' > \', calang.`name`) as name, + IFNULL(SUM(t.`totalQuantitySold`), 0) AS totalQuantitySold, + ROUND(IFNULL(SUM(t.`totalPriceSold`), 0), 2) AS totalPriceSold, + ( + SELECT IFNULL(SUM(pv.`counter`), 0) + FROM `'._DB_PREFIX_.'page` p + LEFT JOIN `'._DB_PREFIX_.'page_viewed` pv ON p.`id_page` = pv.`id_page` + LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON pv.`id_date_range` = dr.`id_date_range` + LEFT JOIN `'._DB_PREFIX_.'product` pr ON CAST(p.`id_object` AS UNSIGNED INTEGER) = pr.`id_product` + LEFT JOIN `'._DB_PREFIX_.'category_product` capr2 ON capr2.`id_product` = pr.`id_product` + WHERE capr.`id_category` = capr2.`id_category` + AND p.`id_page_type` = 1 + AND dr.`time_start` BETWEEN '.$dateBetween.' + AND dr.`time_end` BETWEEN '.$dateBetween.' + ) AS totalPageViewed + FROM `'._DB_PREFIX_.'category` ca + LEFT JOIN `'._DB_PREFIX_.'category_lang` calang ON (ca.`id_category` = calang.`id_category` AND calang.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_lang` parent ON (ca.`id_parent` = parent.`id_category` AND parent.`id_lang` = '.(int)$id_lang.') + LEFT JOIN `'._DB_PREFIX_.'category_product` capr ON ca.`id_category` = capr.`id_category` + LEFT JOIN ( + SELECT pr.`id_product`, t.`totalQuantitySold`, t.`totalPriceSold` + FROM `'._DB_PREFIX_.'product` pr + LEFT JOIN ( + SELECT pr.`id_product`, + IFNULL(SUM(cp.`product_quantity`), 0) AS totalQuantitySold, + IFNULL(SUM(cp.`product_price` * cp.`product_quantity`), 0) / o.conversion_rate AS totalPriceSold + FROM `'._DB_PREFIX_.'product` pr + LEFT OUTER JOIN `'._DB_PREFIX_.'order_detail` cp ON pr.`id_product` = cp.`product_id` + LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = cp.`id_order` + WHERE o.valid = 1 + AND o.invoice_date BETWEEN '.$dateBetween.' + GROUP BY pr.`id_product` + ) t ON t.`id_product` = pr.`id_product` + ) t ON t.`id_product` = capr.`id_product` + '.(($categories) ? 'WHERE ca.id_category IN ('.implode(', ', $categories).')' : '').' + GROUP BY ca.`id_category` + HAVING ca.`id_category` != 1'; + if (Validate::IsName($this->_sort)) + { + $this->_query .= ' ORDER BY `'.$this->_sort.'`'; + if (isset($this->_direction) AND Validate::IsSortDirection($this->_direction)) + $this->_query .= ' '.$this->_direction; + } + if (($this->_start === 0 OR Validate::IsUnsignedInt($this->_start)) AND Validate::IsUnsignedInt($this->_limit)) + $this->_query .= ' LIMIT '.$this->_start.', '.($this->_limit); + $this->_values = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query); + $this->_totalCount = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT FOUND_ROWS()'); + } +} \ No newline at end of file diff --git a/modules/statsbestcustomers/config.xml b/modules/statsbestcustomers/config.xml new file mode 100755 index 000000000..2bf863790 --- /dev/null +++ b/modules/statsbestcustomers/config.xml @@ -0,0 +1,12 @@ + + + statsbestcustomers + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsbestcustomers/de.php b/modules/statsbestcustomers/de.php new file mode 100644 index 000000000..198f6d6dc --- /dev/null +++ b/modules/statsbestcustomers/de.php @@ -0,0 +1,25 @@ +statsbestcustomers_4f29d8c727dcf2022ac241cb96c31083'] = 'Ausgabe Aufnahmeeinstellungen leer'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_eab2b4237a7cd89c309119e35f62d168'] = 'Anzeige'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8bf8854bebe108183caeb845c7676ae4'] = 'von'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_dff4bf10409100d989495c6d5486035e'] = 'Nachname'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_04176f095283bc729f1e3926967e7034'] = 'Vorname'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-Mail'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d7e637a6e9ff116de2fa89551240a94d'] = 'Besuche'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_1ff1b62d08d1195f073c6adac00f1894'] = 'ausgegebenes Geld '; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Beste Kunden'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cdc31cfb8cc370e79d854a2f82849dd2'] = 'Eine Liste der besten Kunden'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cb21e843b037359d0fb5b793fccf964f'] = 'Kundentreue entwickeln'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d29468c130aa9793f3af4aeab7573dfe'] = 'Einen Kunden zu behalten ist rentabler als einen Neukunden zu akquirieren. Daher ist es notwendig, Ihre Treue zu gewinnen, oder anders gesagt, sie dazu zu bringen, zu Ihrem Webshop zurückzukehren.'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_689416adced81b3cdaeda598e82aa607'] = 'Der gute Ruf ist ebenfalls ein Mittel, zufriedene Kunden zu bekommen; ein unzufriedener Kunde zieht keine Neukunden an.'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_410008089d5bb723438103a84d48a59c'] = 'Um dieses Ziel zu erreichen, können Sie folgende Aktionen organisieren:'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_397a5e109a5897ee7d699050cbc93347'] = 'Punktuelle Aktionen: kommerzielle Belohnungen (benutzerdefinierte Sondernagebote, geschenkte Produkte oder Dienstleistungen), nicht-kommerzielle Belohnungen (bevorzugte Bearbeitung einer Bestellung oder eines Produkts), geldliche Belohnungen (Gutscheine, Ermäßigungsgutscheine, Payback,...).'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_4bc24eed56e0ba89fc3ab4e094d18d8a'] = 'Dauerhafte Aktionen: Treue- oder Punktekarten, die nicht nur der Kommunikation mit dem Kunden dienen, sondern ihm auch Vorteile bringen (persönliche Angebote, Rabatte).'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_2ac84f3e753fa299ebe4a6dfe57f1d9c'] = 'Diese Aktionen ermutigen Kunden zum Kauf und zu erneuten, regelmäßigen Besuchenauch in Ihrem Webshop.'; + +?> \ No newline at end of file diff --git a/modules/statsbestcustomers/en.php b/modules/statsbestcustomers/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsbestcustomers/en.php @@ -0,0 +1,4 @@ +statsbestcustomers_4f29d8c727dcf2022ac241cb96c31083'] = 'El recordset se devolvió vacío'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_eab2b4237a7cd89c309119e35f62d168'] = 'Mostrando'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8bf8854bebe108183caeb845c7676ae4'] = 'de'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_dff4bf10409100d989495c6d5486035e'] = 'apellido'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_04176f095283bc729f1e3926967e7034'] = 'Nombre'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d7e637a6e9ff116de2fa89551240a94d'] = 'Visitas'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_1ff1b62d08d1195f073c6adac00f1894'] = 'Dinero enviado'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Mejores clientes'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cdc31cfb8cc370e79d854a2f82849dd2'] = 'Lista de los mejores clientes'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cb21e843b037359d0fb5b793fccf964f'] = 'Desarrolle la fidelidad de sus clientes'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d29468c130aa9793f3af4aeab7573dfe'] = 'Mantener un cliente satisfecho es más rentable que captar uno nuevo. Por lo tanto, es necesario ganarse su lealtad, para que vuelva a su tienda.'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_689416adced81b3cdaeda598e82aa607'] = 'El boca a boca es uno de los mejores medios de conseguir clientes satisfechos; un cliente satisfecho atrae nuevos clientes.'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_410008089d5bb723438103a84d48a59c'] = 'Para alcanzar este objetivo usted puede organizar: '; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_397a5e109a5897ee7d699050cbc93347'] = 'Operaciones puntuales: recompensas comerciales (ofertas especiales personalizadas, producto o servicio ofrecidos), recompensas no comerciales (prioridad en el envío de un pedido o de un producto), recompensas pecuniarias (enlaces, cupones del descuento, reembolsos...)'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_4bc24eed56e0ba89fc3ab4e094d18d8a'] = 'Operaciones sostenibles: tarjetas clientes o puntos de fidelidad, que no sólo justifican la comunicación entre el comerciante y el cliente, pero también ofrecen ventajas a los clientes (ofertas, descuentos privados).'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_b18d224f0c27b329bc0bd2f7f876228b'] = 'Estas operaciones animan a sus clientes a comprar y también a volver a su tienda regularmente.'; diff --git a/modules/statsbestcustomers/fr.php b/modules/statsbestcustomers/fr.php new file mode 100644 index 000000000..e55eb614c --- /dev/null +++ b/modules/statsbestcustomers/fr.php @@ -0,0 +1,23 @@ +statsbestcustomers_4f29d8c727dcf2022ac241cb96c31083'] = 'Aucun résultat retourné'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_eab2b4237a7cd89c309119e35f62d168'] = 'Affichage'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8bf8854bebe108183caeb845c7676ae4'] = 'de'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_dff4bf10409100d989495c6d5486035e'] = 'Nom'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_04176f095283bc729f1e3926967e7034'] = 'Prénom'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d7e637a6e9ff116de2fa89551240a94d'] = 'Visites'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_1ff1b62d08d1195f073c6adac00f1894'] = 'Argent dépensé'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Meilleurs clients'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cdc31cfb8cc370e79d854a2f82849dd2'] = 'Classement des meilleurs clients'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cb21e843b037359d0fb5b793fccf964f'] = 'Fidéliser les clients'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d29468c130aa9793f3af4aeab7573dfe'] = 'Garder un client est plus rentable que d’en conquérir un nouveau. Il est donc impératif de le fidéliser, c\'est-à-dire de le faire revenir sur votre boutique. '; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_689416adced81b3cdaeda598e82aa607'] = 'Le bouche à oreille est également un moyen d\'avoir de nouveaux clients satisfaits ; car un client non satisfait n\'en attirera pas de nouveaux. '; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_410008089d5bb723438103a84d48a59c'] = 'Pour y parvenir, plusieurs moyens existent :'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_397a5e109a5897ee7d699050cbc93347'] = 'Les opérations ponctuelles : les récompenses marchandes (offres promotionnelles ciblées et personnalisées, cadeaux -produit ou service offert-), les récompenses non marchandes (traitement prioritaire d\'une commande ou d\'un produit), les récompenses pécuniaires (bons d\'achat, de réduction, de remboursement). '; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_4bc24eed56e0ba89fc3ab4e094d18d8a'] = 'Les opérations pérennes : (carte de fidélité, points de fidélité) qui non seulement justifient la communication marchand-clients, et aussi offre des avantages aux clients (offres privatives, réductions).'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_b18d224f0c27b329bc0bd2f7f876228b'] = 'Ces opérations incitent non seulement le client à acheter, mais aussi à revenir régulièrement sur votre boutique.'; diff --git a/modules/statsbestcustomers/it.php b/modules/statsbestcustomers/it.php new file mode 100644 index 000000000..46c3d8e9c --- /dev/null +++ b/modules/statsbestcustomers/it.php @@ -0,0 +1,25 @@ +statsbestcustomers_4f29d8c727dcf2022ac241cb96c31083'] = 'recordset vuoto restituito'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_eab2b4237a7cd89c309119e35f62d168'] = 'Visualizzazione'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8bf8854bebe108183caeb845c7676ae4'] = 'di'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_dff4bf10409100d989495c6d5486035e'] = 'Cognome'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_04176f095283bc729f1e3926967e7034'] = 'Nome'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d7e637a6e9ff116de2fa89551240a94d'] = 'Visite'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_1ff1b62d08d1195f073c6adac00f1894'] = 'Soldi spesi'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_8b83489bd116cb60e2f348e9c63cd7f6'] = 'Migliori clienti'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cdc31cfb8cc370e79d854a2f82849dd2'] = 'Elenco dei migliori clienti'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_cb21e843b037359d0fb5b793fccf964f'] = 'Sviluppa la fedeltà dei clienti '; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_d29468c130aa9793f3af4aeab7573dfe'] = 'Mantenere un cliente è più redditizio che catturarne uno nuovo. Pertanto, è necessario sviluppare la loro fedeltà, in altre parole, devi farli tornare al tuo negozio online.'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_689416adced81b3cdaeda598e82aa607'] = 'Il passaparola è anche un mezzo per ottenere nuovi clienti soddisfatti; un cliente non soddisfatto non attirerà nuovi clienti.'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_410008089d5bb723438103a84d48a59c'] = 'Al fine di raggiungere questo obiettivo è possibile organizzare:'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_397a5e109a5897ee7d699050cbc93347'] = 'operazioni puntuali: premi commerciali (offerte speciali personalizzate, prodotto o servizio offerto), premi non commerciale (gestione prioritaria di un ordine o un prodotto), premi pecuniari (obbligazioni, buoni sconto, ...).'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_4bc24eed56e0ba89fc3ab4e094d18d8a'] = 'operazioni sostenibili: le carte fedeltà o punti, che non solo giustificano la comunicazione tra commerciante e cliente, ma offre anche vantaggi ai clienti (offerte private, sconti).'; +$_MODULE['<{statsbestcustomers}prestashop>statsbestcustomers_2ac84f3e753fa299ebe4a6dfe57f1d9c'] = 'Queste operazioni incoraggiano i clienti ad acquistare e a tornare regolarmente al tu negozio online .'; + +?> \ No newline at end of file diff --git a/modules/statsbestcustomers/logo.gif b/modules/statsbestcustomers/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb7ee8e83fef7e0e3222486530b79bc338c5dfc3 GIT binary patch literal 992 zcmZ?wbhEHb6krfw_|5(OJN&Z|U^?QljpCvMXmdHNcY5Z@w!oL-Y|5mB}U#m-~8&*&iB{%emlSP+lA%dF0A-^bp$FF_W#MQACHcFdUE~Ci#uOG zy!rO| +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7329 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsBestCustomers extends ModuleGrid +{ + private $_html; + private $_query; + private $_columns; + private $_defaultSortColumn; + private $_defaultSortDirection; + private $_emptyMessage; + private $_pagingMessage; + + function __construct() + { + $this->name = 'statsbestcustomers'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_defaultSortColumn = 'totalMoneySpent'; + $this->_defaultSortDirection = 'DESC'; + $this->_emptyMessage = $this->l('Empty recordset returned'); + $this->_pagingMessage = $this->l('Displaying').' {0} - {1} '.$this->l('of').' {2}'; + + $this->_columns = array( + array( + 'id' => 'lastname', + 'header' => $this->l('Lastname'), + 'dataIndex' => 'lastname', + 'width' => 50 + ), + array( + 'id' => 'firstname', + 'header' => $this->l('Firstname'), + 'dataIndex' => 'firstname', + 'width' => 50 + ), + array( + 'id' => 'email', + 'header' => $this->l('Email'), + 'dataIndex' => 'email', + 'width' => 120 + ), + array( + 'id' => 'totalVisits', + 'header' => $this->l('Visits'), + 'dataIndex' => 'totalVisits', + 'width' => 80, + 'align' => 'right'), + array( + 'id' => 'totalMoneySpent', + 'header' => $this->l('Money spent'), + 'dataIndex' => 'totalMoneySpent', + 'width' => 80, + 'align' => 'right') + ); + + parent::__construct(); + + $this->displayName = $this->l('Best customers'); + $this->description = $this->l('A list of the best customers'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $engineParams = array( + 'id' => 'id_customer', + 'title' => $this->displayName, + 'columns' => $this->_columns, + 'defaultSortColumn' => $this->_defaultSortColumn, + 'defaultSortDirection' => $this->_defaultSortDirection, + 'emptyMessage' => $this->_emptyMessage, + 'pagingMessage' => $this->_pagingMessage + ); + if (Tools::getValue('export')) + $this->csvExport($engineParams); + $this->_html = ' +
    '.$this->displayName.' + '.$this->engine($engineParams).' +

    '.$this->l('CSV Export').'

    +

    +
    '.$this->l('Guide').' +

    '.$this->l('Develop clients\' loyalty').'

    +

    + '.$this->l('Keeping a client is more profitable than gaining a new one. Thus, it is necessary to develop their loyalty, in other words to make them want to come back to your webshop.').'
    + '.$this->l('Word of mouth is also a means to of getting new, satisfied clients; a dissatisfied one won\'t attract new clients.').'
    + '.$this->l('In order to achieve this goal you can organize: ').' +

      +
    • '.$this->l('Punctual operations: commercial rewards (personalized special offers, product or service offered), non commercial rewards (priority handling of an order or a product), pecuniary rewards (bonds, discount coupons, payback).').'
    • +
    • '.$this->l('Sustainable operations: loyalty points or cards, which not only justify communication between merchant and client, but also offer advantages to clients (private offers, discounts).').'
    • +
    + '.$this->l('These operations encourage clients to buy products and visit your webshop regularly.').'
    +


    +
    '; + return $this->_html; + } + + public function getData() + { + $this->_query = ' + SELECT SQL_CALC_FOUND_ROWS c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`, + COUNT(co.`id_connections`) as totalVisits, + IFNULL(( + SELECT ROUND(SUM(IFNULL(o.`total_paid_real`, 0) / cu.conversion_rate), 2) + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'currency` cu ON o.id_currency = cu.id_currency + WHERE o.id_customer = c.id_customer + AND o.invoice_date BETWEEN '.$this->getDate().' + AND o.valid + ), 0) as totalMoneySpent + FROM `'._DB_PREFIX_.'customer` c + LEFT JOIN `'._DB_PREFIX_.'guest` g ON c.`id_customer` = g.`id_customer` + LEFT JOIN `'._DB_PREFIX_.'connections` co ON g.`id_guest` = co.`id_guest` + WHERE co.date_add BETWEEN '.$this->getDate() + .$this->sqlShopRestriction(true, 'c'). + 'GROUP BY c.`id_customer`, c.`lastname`, c.`firstname`, c.`email`'; + if (Validate::IsName($this->_sort)) + { + $this->_query .= ' ORDER BY `'.$this->_sort.'`'; + if (isset($this->_direction) AND Validate::IsSortDirection($this->_direction)) + $this->_query .= ' '.$this->_direction; + } + if (($this->_start === 0 OR Validate::IsUnsignedInt($this->_start)) AND Validate::IsUnsignedInt($this->_limit)) + $this->_query .= ' LIMIT '.$this->_start.', '.($this->_limit); + $this->_values = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query); + $this->_totalCount = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT FOUND_ROWS()'); + } +} diff --git a/modules/statsbestmanufacturers/config.xml b/modules/statsbestmanufacturers/config.xml new file mode 100755 index 000000000..687bebd6f --- /dev/null +++ b/modules/statsbestmanufacturers/config.xml @@ -0,0 +1,12 @@ + + + statsbestmanufacturers + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsbestmanufacturers/de.php b/modules/statsbestmanufacturers/de.php new file mode 100644 index 000000000..2f5232aff --- /dev/null +++ b/modules/statsbestmanufacturers/de.php @@ -0,0 +1,15 @@ +statsbestmanufacturers_4f29d8c727dcf2022ac241cb96c31083'] = 'Ausgabe Aufnahmeeinstellungen leer'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_eab2b4237a7cd89c309119e35f62d168'] = 'Anzeige'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_8bf8854bebe108183caeb845c7676ae4'] = 'von'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_2a0440eec72540c5b30d9199c01f348c'] = 'Verkaufte Menge'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_ea067eb37801c5aab1a1c685eb97d601'] = 'Bezahlter Gesamtbetrag'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_72fd9b5482201824daae557360d91196'] = 'Beste Hersteller'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_aa1b814546fe3e2e96ef3a185e4df8e9'] = 'Eine Liste der besten Hersteller'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; + +?> \ No newline at end of file diff --git a/modules/statsbestmanufacturers/en.php b/modules/statsbestmanufacturers/en.php new file mode 100755 index 000000000..601358d4f --- /dev/null +++ b/modules/statsbestmanufacturers/en.php @@ -0,0 +1,4 @@ +statsbestmanufacturers_4f29d8c727dcf2022ac241cb96c31083'] = 'Empty recordset returned'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_eab2b4237a7cd89c309119e35f62d168'] = 'Mostrar'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_8bf8854bebe108183caeb845c7676ae4'] = 'de'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_2a0440eec72540c5b30d9199c01f348c'] = 'Cantidad vendida'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_ea067eb37801c5aab1a1c685eb97d601'] = 'Total pagado'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_72fd9b5482201824daae557360d91196'] = 'Mejores fabricantes'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_aa1b814546fe3e2e96ef3a185e4df8e9'] = 'Lista de los mejores fabricantes'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; diff --git a/modules/statsbestmanufacturers/fr.php b/modules/statsbestmanufacturers/fr.php new file mode 100755 index 000000000..5b342a1ce --- /dev/null +++ b/modules/statsbestmanufacturers/fr.php @@ -0,0 +1,13 @@ +statsbestmanufacturers_4f29d8c727dcf2022ac241cb96c31083'] = 'Empty recordset returned'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_eab2b4237a7cd89c309119e35f62d168'] = 'Affichage'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_8bf8854bebe108183caeb845c7676ae4'] = 'de'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_2a0440eec72540c5b30d9199c01f348c'] = 'Quantité vendus '; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_ea067eb37801c5aab1a1c685eb97d601'] = 'Total des sommes versées '; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_72fd9b5482201824daae557360d91196'] = 'Meilleur fabricants '; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_aa1b814546fe3e2e96ef3a185e4df8e9'] = 'Une liste des meilleurs fabricants '; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; diff --git a/modules/statsbestmanufacturers/it.php b/modules/statsbestmanufacturers/it.php new file mode 100644 index 000000000..d7c3c535a --- /dev/null +++ b/modules/statsbestmanufacturers/it.php @@ -0,0 +1,15 @@ +statsbestmanufacturers_4f29d8c727dcf2022ac241cb96c31083'] = 'recordset vuoto restituito'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_eab2b4237a7cd89c309119e35f62d168'] = 'Visualizzazione'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_8bf8854bebe108183caeb845c7676ae4'] = 'di'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_2a0440eec72540c5b30d9199c01f348c'] = 'Quantità venduta'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_ea067eb37801c5aab1a1c685eb97d601'] = 'Totale pagato'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_72fd9b5482201824daae557360d91196'] = 'Migliori produttori'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_aa1b814546fe3e2e96ef3a185e4df8e9'] = 'Elenco dei migliori produttori'; +$_MODULE['<{statsbestmanufacturers}prestashop>statsbestmanufacturers_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV '; + +?> \ No newline at end of file diff --git a/modules/statsbestmanufacturers/logo.gif b/modules/statsbestmanufacturers/logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..fa3a15dd67285af0074b69bb46f3df2860ee7dfc GIT binary patch literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) literal 0 HcmV?d00001 diff --git a/modules/statsbestmanufacturers/statsbestmanufacturers.php b/modules/statsbestmanufacturers/statsbestmanufacturers.php new file mode 100755 index 000000000..97e9d6dd5 --- /dev/null +++ b/modules/statsbestmanufacturers/statsbestmanufacturers.php @@ -0,0 +1,152 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + + +class StatsBestManufacturers extends ModuleGrid +{ + private $_html = null; + private $_query = null; + private $_columns = null; + private $_defaultSortColumn = null; + private $_defaultSortDirection = null; + private $_emptyMessage = null; + private $_pagingMessage = null; + + function __construct() + { + $this->name = 'statsbestmanufacturers'; + $this->tab = 'analytics_stats'; + $this->version = '1.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_defaultSortColumn = 'sales'; + $this->_defaultSortDirection = 'DESC'; + $this->_emptyMessage = $this->l('Empty recordset returned'); + $this->_pagingMessage = $this->l('Displaying').' {0} - {1} '.$this->l('of').' {2}'; + + $this->_columns = array( + array( + 'id' => 'name', + 'header' => $this->l('Name'), + 'dataIndex' => 'name', + 'align' => 'left', + 'width' => 200 + ), + array( + 'id' => 'quantity', + 'header' => $this->l('Quantity sold'), + 'dataIndex' => 'quantity', + 'width' => 60, + 'align' => 'right' + ), + array( + 'id' => 'sales', + 'header' => $this->l('Total paid'), + 'dataIndex' => 'sales', + 'width' => 60, + 'align' => 'right' + ) + ); + + parent::__construct(); + + $this->displayName = $this->l('Best manufacturers'); + $this->description = $this->l('A list of the best manufacturers'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $engineParams = array( + 'id' => 'id_category', + 'title' => $this->displayName, + 'columns' => $this->_columns, + 'defaultSortColumn' => $this->_defaultSortColumn, + 'defaultSortDirection' => $this->_defaultSortDirection, + 'emptyMessage' => $this->_emptyMessage, + 'pagingMessage' => $this->_pagingMessage + ); + + if (Tools::getValue('export')) + $this->csvExport($engineParams); + + $this->_html = ' +
    '.$this->displayName.' + '.$this->engine($engineParams).' +
    '.$this->l('CSV Export').' +
    '; + return $this->_html; + } + + public function getTotalCount() + { + $sql = 'SELECT COUNT(DISTINCT(m.id_manufacturer)) + FROM '._DB_PREFIX_.'order_detail od + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = od.product_id) + LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_order = od.id_order) + LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) + WHERE o.invoice_date BETWEEN '.$this->getDate() + .$this->sqlShopRestriction(false, 'o'). + 'AND o.valid = 1 + AND m.id_manufacturer IS NOT NULL'; + return Db::getInstance()->getValue($sql); + } + + public function getData() + { + $this->_totalCount = $this->getTotalCount(); + + $this->_query = 'SELECT m.name, SUM(od.product_quantity) as quantity, ROUND(SUM(od.product_quantity * od.product_price) / c.conversion_rate, 2) as sales + FROM '._DB_PREFIX_.'order_detail od + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = od.product_id) + LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_order = od.id_order) + LEFT JOIN '._DB_PREFIX_.'currency c ON (c.id_currency = o.id_currency) + LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) + WHERE '.$this->sqlShopRestriction(false, 'o').' + o.invoice_date BETWEEN '.$this->getDate().' + AND o.valid = 1 + AND m.id_manufacturer IS NOT NULL + GROUP BY p.id_manufacturer'; + if (Validate::IsName($this->_sort)) + { + $this->_query .= ' ORDER BY `'.$this->_sort.'`'; + if (isset($this->_direction) AND Validate::IsSortDirection($this->_direction)) + $this->_query .= ' '.$this->_direction; + } + if (($this->_start === 0 OR Validate::IsUnsignedInt($this->_start)) AND Validate::IsUnsignedInt($this->_limit)) + $this->_query .= ' LIMIT '.$this->_start.', '.($this->_limit); + $this->_values = Db::getInstance()->ExecuteS($this->_query); + } +} diff --git a/modules/statsbestproducts/config.xml b/modules/statsbestproducts/config.xml new file mode 100755 index 000000000..87fa66809 --- /dev/null +++ b/modules/statsbestproducts/config.xml @@ -0,0 +1,12 @@ + + + statsbestproducts + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsbestproducts/de.php b/modules/statsbestproducts/de.php new file mode 100644 index 000000000..31c62f70a --- /dev/null +++ b/modules/statsbestproducts/de.php @@ -0,0 +1,20 @@ +statsbestproducts_4f29d8c727dcf2022ac241cb96c31083'] = 'Ausgabe Aufnahmeeinstellungen leer'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_eab2b4237a7cd89c309119e35f62d168'] = 'Anzeige'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_8bf8854bebe108183caeb845c7676ae4'] = 'von'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_2a0440eec72540c5b30d9199c01f348c'] = 'Verkaufte Menge'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_6771f2d557a34bd89ea7abc92a0a069c'] = 'Verkaufspreis'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_213c80e9307852da96029181967ff545'] = 'Verkaufte Menge/ Tag'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_57f32d7d0e6672cc2b60bc7a49f91453'] = 'Angesehene Seite'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_27ce7f8b5623b2e2df568d64cf051607'] = 'Lager'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_71a5c322b7f69a8a4e40b3eb20da5559'] = 'Beste Produkte'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_1784296dda47f4d571a179aad8106018'] = 'Eine Liste der besten Produkte'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; + +?> \ No newline at end of file diff --git a/modules/statsbestproducts/en.php b/modules/statsbestproducts/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsbestproducts/en.php @@ -0,0 +1,4 @@ +statsbestproducts_4f29d8c727dcf2022ac241cb96c31083'] = 'Ningún resultado'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_eab2b4237a7cd89c309119e35f62d168'] = 'Mostrar'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_8bf8854bebe108183caeb845c7676ae4'] = 'en'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_2a0440eec72540c5b30d9199c01f348c'] = 'Cant.'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_6771f2d557a34bd89ea7abc92a0a069c'] = 'Precio de venta'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'ventas'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_213c80e9307852da96029181967ff545'] = 'Cant./día'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_57f32d7d0e6672cc2b60bc7a49f91453'] = 'Páginas vistas'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_71a5c322b7f69a8a4e40b3eb20da5559'] = 'Mejores productos'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_1784296dda47f4d571a179aad8106018'] = 'Lista de los mejores productos'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; diff --git a/modules/statsbestproducts/fr.php b/modules/statsbestproducts/fr.php new file mode 100644 index 000000000..be747cfd8 --- /dev/null +++ b/modules/statsbestproducts/fr.php @@ -0,0 +1,18 @@ +statsbestproducts_4f29d8c727dcf2022ac241cb96c31083'] = 'Aucun résultat'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_eab2b4237a7cd89c309119e35f62d168'] = 'Affichage de'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_8bf8854bebe108183caeb845c7676ae4'] = 'sur'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_2a0440eec72540c5b30d9199c01f348c'] = 'Qté'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_6771f2d557a34bd89ea7abc92a0a069c'] = 'Prix de vente'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'CA'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_213c80e9307852da96029181967ff545'] = 'Qté / jour'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_57f32d7d0e6672cc2b60bc7a49f91453'] = 'Pages vues'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_71a5c322b7f69a8a4e40b3eb20da5559'] = 'Meilleurs produits'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_1784296dda47f4d571a179aad8106018'] = 'Liste des meilleurs produits'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; diff --git a/modules/statsbestproducts/it.php b/modules/statsbestproducts/it.php new file mode 100644 index 000000000..ba320e265 --- /dev/null +++ b/modules/statsbestproducts/it.php @@ -0,0 +1,20 @@ +statsbestproducts_4f29d8c727dcf2022ac241cb96c31083'] = 'recordset vuoto restituito'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_eab2b4237a7cd89c309119e35f62d168'] = 'Visualizzazione'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_8bf8854bebe108183caeb845c7676ae4'] = 'di'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_12d3c7a4296542c62474856ec452c045'] = 'Rif.'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_2a0440eec72540c5b30d9199c01f348c'] = 'Qtà venduti'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_6771f2d557a34bd89ea7abc92a0a069c'] = 'Prezzo di vendita'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_213c80e9307852da96029181967ff545'] = 'Qtà venduto / giorno'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_57f32d7d0e6672cc2b60bc7a49f91453'] = 'Pagina visualizzata'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_27ce7f8b5623b2e2df568d64cf051607'] = 'Magazzino'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_71a5c322b7f69a8a4e40b3eb20da5559'] = 'I migliori prodotti'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_1784296dda47f4d571a179aad8106018'] = 'Elenco dei migliori prodotti'; +$_MODULE['<{statsbestproducts}prestashop>statsbestproducts_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; + +?> \ No newline at end of file diff --git a/modules/statsbestproducts/logo.gif b/modules/statsbestproducts/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3a15dd67285af0074b69bb46f3df2860ee7dfc GIT binary patch literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) literal 0 HcmV?d00001 diff --git a/modules/statsbestproducts/statsbestproducts.php b/modules/statsbestproducts/statsbestproducts.php new file mode 100644 index 000000000..0ffba44a0 --- /dev/null +++ b/modules/statsbestproducts/statsbestproducts.php @@ -0,0 +1,199 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6946 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsBestProducts extends ModuleGrid +{ + private $_html = null; + private $_query = null; + private $_columns = null; + private $_defaultSortColumn = null; + private $_defaultSortDirection = null; + private $_emptyMessage = null; + private $_pagingMessage = null; + + function __construct() + { + $this->name = 'statsbestproducts'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_defaultSortColumn = 'totalPriceSold'; + $this->_defaultSortDirection = 'DESC'; + $this->_emptyMessage = $this->l('Empty recordset returned'); + $this->_pagingMessage = $this->l('Displaying').' {0} - {1} '.$this->l('of').' {2}'; + + $this->_columns = array( + array( + 'id' => 'reference', + 'header' => $this->l('Ref.'), + 'dataIndex' => 'reference', + 'align' => 'left', + 'width' => 50 + ), + array( + 'id' => 'name', + 'header' => $this->l('Name'), + 'dataIndex' => 'name', + 'align' => 'left', + 'width' => 100 + ), + array( + 'id' => 'totalQuantitySold', + 'header' => $this->l('Quantity sold'), + 'dataIndex' => 'totalQuantitySold', + 'width' => 50, + 'align' => 'right' + ), + array( + 'id' => 'avgPriceSold', + 'header' => $this->l('Price sold'), + 'dataIndex' => 'avgPriceSold', + 'width' => 50, + 'align' => 'right' + ), + array( + 'id' => 'totalPriceSold', + 'header' => $this->l('Sales'), + 'dataIndex' => 'totalPriceSold', + 'width' => 50, + 'align' => 'right' + ), + array( + 'id' => 'averageQuantitySold', + 'header' => $this->l('Quantity sold/ day'), + 'dataIndex' => 'averageQuantitySold', + 'width' => 60, + 'align' => 'right' + ), + array( + 'id' => 'totalPageViewed', + 'header' => $this->l('Page viewed'), + 'dataIndex' => 'totalPageViewed', + 'width' => 60, + 'align' => 'right' + ), + array( + 'id' => 'quantity', + 'header' => $this->l('Stock'), + 'dataIndex' => 'quantity', + 'width' => 50, + 'align' => 'right' + ) + ); + + parent::__construct(); + + $this->displayName = $this->l('Best products'); + $this->description = $this->l('A list of the best products'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $engineParams = array( + 'id' => 'id_product', + 'title' => $this->displayName, + 'columns' => $this->_columns, + 'defaultSortColumn' => $this->_defaultSortColumn, + 'defaultSortDirection' => $this->_defaultSortDirection, + 'emptyMessage' => $this->_emptyMessage, + 'pagingMessage' => $this->_pagingMessage + ); + + if (Tools::getValue('export')) + $this->csvExport($engineParams); + + $this->_html = ' +
    '.$this->displayName.' + '.$this->engine($engineParams).' +

    '.$this->l('CSV Export').'

    +
    '; + return $this->_html; + } + + public function getData() + { + $dateBetween = $this->getDate(); + $arrayDateBetween = explode(' AND ', $dateBetween); + + $joinShop = $whereShop = ''; + if ($this->shopID || $this->shopGroupID) + { + $joinShop = ' LEFT JOIN '._DB_PREFIX_.'product_shop ps ON ps.id_product = p.id_product '; + if ($this->shopID) + $whereShop = ' ps.id_shop = '.$this->shopID.' AND '; + else if ($this->shopGroupID) + $whereShop = 'ps.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.') AND'; + } + + $this->_query = 'SELECT SQL_CALC_FOUND_ROWS p.reference, p.id_product, pl.name, ROUND(AVG(od.product_price / o.conversion_rate), 2) as avgPriceSold, + IFNULL((SELECT SUM(pa.quantity) FROM '._DB_PREFIX_.'product_attribute pa WHERE pa.id_product = p.id_product GROUP BY pa.id_product), p.quantity) as quantity, + IFNULL(SUM(od.product_quantity), 0) AS totalQuantitySold, + ROUND(IFNULL(IFNULL(SUM(od.product_quantity), 0) / (1 + LEAST(TO_DAYS('.$arrayDateBetween[1].'), TO_DAYS(NOW())) - GREATEST(TO_DAYS('.$arrayDateBetween[0].'), TO_DAYS(p.date_add))), 0), 2) as averageQuantitySold, + ROUND(IFNULL(SUM((od.product_price * od.product_quantity) / o.conversion_rate), 0), 2) AS totalPriceSold, + ( + SELECT IFNULL(SUM(pv.counter), 0) + FROM '._DB_PREFIX_.'page pa + LEFT JOIN '._DB_PREFIX_.'page_viewed pv ON pa.id_page = pv.id_page + LEFT JOIN '._DB_PREFIX_.'date_range dr ON pv.id_date_range = dr.id_date_range + WHERE pa.id_object = p.id_product AND pa.id_page_type = 1 + AND dr.time_start BETWEEN '.$dateBetween.' + AND dr.time_end BETWEEN '.$dateBetween.' + ) AS totalPageViewed + FROM '._DB_PREFIX_.'product p + '.$joinShop.' + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_lang = '.(int)($this->getLang()).') + LEFT JOIN '._DB_PREFIX_.'order_detail od ON od.product_id = p.id_product + LEFT JOIN '._DB_PREFIX_.'orders o ON od.id_order = o.id_order + WHERE '.$whereShop.' + p.active = 1 + AND o.valid = 1 + AND o.invoice_date BETWEEN '.$dateBetween.' + GROUP BY od.product_id'; + + if (Validate::IsName($this->_sort)) + { + $this->_query .= ' ORDER BY `'.$this->_sort.'`'; + if (isset($this->_direction) AND Validate::IsSortDirection($this->_direction)) + $this->_query .= ' '.$this->_direction; + } + + if (($this->_start === 0 OR Validate::IsUnsignedInt($this->_start)) AND Validate::IsUnsignedInt($this->_limit)) + $this->_query .= ' LIMIT '.$this->_start.', '.($this->_limit); + $this->_values = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query); + $this->_totalCount = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT FOUND_ROWS()'); + } +} diff --git a/modules/statsbestsuppliers/config.xml b/modules/statsbestsuppliers/config.xml new file mode 100755 index 000000000..f7831f66d --- /dev/null +++ b/modules/statsbestsuppliers/config.xml @@ -0,0 +1,12 @@ + + + statsbestsuppliers + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsbestsuppliers/de.php b/modules/statsbestsuppliers/de.php new file mode 100644 index 000000000..ea0d0e5e3 --- /dev/null +++ b/modules/statsbestsuppliers/de.php @@ -0,0 +1,15 @@ +statsbestsuppliers_4f29d8c727dcf2022ac241cb96c31083'] = 'Ausgabe Aufnahmeeinstellungen leer'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_eab2b4237a7cd89c309119e35f62d168'] = 'Anzeige'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_8bf8854bebe108183caeb845c7676ae4'] = 'von '; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_2a0440eec72540c5b30d9199c01f348c'] = 'verkaufte Menge '; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_ea067eb37801c5aab1a1c685eb97d601'] = 'Bezahlter Gesamtbetrag'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_cc3eb9ba7d0e236f33023a4744d0693a'] = 'Beste Zulieferer'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_0fbee5f62b2695e84a5eb275bcf98c6f'] = 'Eine Liste der besten Zulieferer'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; + +?> \ No newline at end of file diff --git a/modules/statsbestsuppliers/en.php b/modules/statsbestsuppliers/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsbestsuppliers/en.php @@ -0,0 +1,4 @@ +statsbestsuppliers_4f29d8c727dcf2022ac241cb96c31083'] = 'Ningún resultado'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_eab2b4237a7cd89c309119e35f62d168'] = 'Mostrar'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_8bf8854bebe108183caeb845c7676ae4'] = 'en'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_2a0440eec72540c5b30d9199c01f348c'] = 'Cantidad'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_ea067eb37801c5aab1a1c685eb97d601'] = 'Total pagado'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_cc3eb9ba7d0e236f33023a4744d0693a'] = 'Mejores proveedores'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_0fbee5f62b2695e84a5eb275bcf98c6f'] = 'Lista de los mejores proveedores'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; diff --git a/modules/statsbestsuppliers/fr.php b/modules/statsbestsuppliers/fr.php new file mode 100644 index 000000000..e6ab6d621 --- /dev/null +++ b/modules/statsbestsuppliers/fr.php @@ -0,0 +1,13 @@ +statsbestsuppliers_4f29d8c727dcf2022ac241cb96c31083'] = 'Aucun résultat'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_eab2b4237a7cd89c309119e35f62d168'] = 'Affichage'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_8bf8854bebe108183caeb845c7676ae4'] = 'sur'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_2a0440eec72540c5b30d9199c01f348c'] = 'Quantité'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_ea067eb37801c5aab1a1c685eb97d601'] = 'CA'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_cc3eb9ba7d0e236f33023a4744d0693a'] = 'Meilleurs fournisseurs'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_0fbee5f62b2695e84a5eb275bcf98c6f'] = 'Liste des meilleurs fournisseurs'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; diff --git a/modules/statsbestsuppliers/it.php b/modules/statsbestsuppliers/it.php new file mode 100644 index 000000000..e4f19d378 --- /dev/null +++ b/modules/statsbestsuppliers/it.php @@ -0,0 +1,15 @@ +statsbestsuppliers_4f29d8c727dcf2022ac241cb96c31083'] = 'recordset vuoto restituito'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_eab2b4237a7cd89c309119e35f62d168'] = 'Visualizzazione'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_8bf8854bebe108183caeb845c7676ae4'] = 'di'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_2a0440eec72540c5b30d9199c01f348c'] = 'Quantità venduta'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_ea067eb37801c5aab1a1c685eb97d601'] = 'Totale pagato'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_cc3eb9ba7d0e236f33023a4744d0693a'] = 'Migliori fornitori'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_0fbee5f62b2695e84a5eb275bcf98c6f'] = 'Elenco dei migliori fornitori'; +$_MODULE['<{statsbestsuppliers}prestashop>statsbestsuppliers_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; + +?> \ No newline at end of file diff --git a/modules/statsbestsuppliers/logo.gif b/modules/statsbestsuppliers/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3a15dd67285af0074b69bb46f3df2860ee7dfc GIT binary patch literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) literal 0 HcmV?d00001 diff --git a/modules/statsbestsuppliers/statsbestsuppliers.php b/modules/statsbestsuppliers/statsbestsuppliers.php new file mode 100644 index 000000000..287d46045 --- /dev/null +++ b/modules/statsbestsuppliers/statsbestsuppliers.php @@ -0,0 +1,153 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsBestSuppliers extends ModuleGrid +{ + private $_html = null; + private $_query = null; + private $_columns = null; + private $_defaultSortColumn = null; + private $_defaultSortDirection = null; + private $_emptyMessage = null; + private $_pagingMessage = null; + + function __construct() + { + $this->name = 'statsbestsuppliers'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_defaultSortColumn = 'sales'; + $this->_defaultSortDirection = 'DESC'; + $this->_emptyMessage = $this->l('Empty recordset returned'); + $this->_pagingMessage = $this->l('Displaying').' {0} - {1} '.$this->l('of').' {2}'; + + $this->_columns = array( + array( + 'id' => 'name', + 'header' => $this->l('Name'), + 'dataIndex' => 'name', + 'align' => 'left', + 'width' => 200 + ), + array( + 'id' => 'quantity', + 'header' => $this->l('Quantity sold'), + 'dataIndex' => 'quantity', + 'width' => 60, + 'align' => 'right' + ), + array( + 'id' => 'sales', + 'header' => $this->l('Total paid'), + 'dataIndex' => 'sales', + 'width' => 60, + 'align' => 'right' + ) + ); + + parent::__construct(); + + $this->displayName = $this->l('Best suppliers'); + $this->description = $this->l('A list of the best suppliers'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $engineParams = array( + 'id' => 'id_category', + 'title' => $this->displayName, + 'columns' => $this->_columns, + 'defaultSortColumn' => $this->_defaultSortColumn, + 'defaultSortDirection' => $this->_defaultSortDirection, + 'emptyMessage' => $this->_emptyMessage, + 'pagingMessage' => $this->_pagingMessage + ); + + if (Tools::getValue('export') == 1) + $this->csvExport($engineParams); + $this->_html = ' +
    '.$this->displayName.' + '.$this->engine($engineParams).' +

    '.$this->l('CSV Export').'

    +
    '; + return $this->_html; + } + + /** + * @return int Get total of distinct suppliers + */ + public function getTotalCount() + { + $sql = 'SELECT COUNT(DISTINCT(s.id_supplier)) + FROM '._DB_PREFIX_.'order_detail od + LEFT JOIN '._DB_PREFIX_.'product p ON p.id_product = od.product_id + LEFT JOIN '._DB_PREFIX_.'orders o ON o.id_order = od.id_order + LEFT JOIN '._DB_PREFIX_.'supplier s ON s.id_supplier = p.id_supplier + WHERE o.invoice_date BETWEEN '.$this->getDate().' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND s.id_supplier IS NOT NULL'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + public function getData() + { + $this->_totalCount = $this->getTotalCount(); + + $this->_query = 'SELECT s.name, SUM(od.product_quantity) as quantity, ROUND(SUM(od.product_quantity * od.product_price) / o.conversion_rate, 2) as sales + FROM '._DB_PREFIX_.'order_detail od + LEFT JOIN '._DB_PREFIX_.'product p ON p.id_product = od.product_id + LEFT JOIN '._DB_PREFIX_.'orders o ON o.id_order = od.id_order + LEFT JOIN '._DB_PREFIX_.'supplier s ON s.id_supplier = p.id_supplier + WHERE o.invoice_date BETWEEN '.$this->getDate().' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND s.id_supplier IS NOT NULL + GROUP BY p.id_supplier'; + if (Validate::IsName($this->_sort)) + { + $this->_query .= ' ORDER BY `'.$this->_sort.'`'; + if (isset($this->_direction) AND Validate::IsSortDirection($this->_direction)) + $this->_query .= ' '.$this->_direction; + } + + if (($this->_start === 0 OR Validate::IsUnsignedInt($this->_start)) AND Validate::IsUnsignedInt($this->_limit)) + $this->_query .= ' LIMIT '.$this->_start.', '.($this->_limit); + $this->_values = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query); + } +} \ No newline at end of file diff --git a/modules/statsbestvouchers/config.xml b/modules/statsbestvouchers/config.xml new file mode 100755 index 000000000..14244866c --- /dev/null +++ b/modules/statsbestvouchers/config.xml @@ -0,0 +1,12 @@ + + + statsbestvouchers + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsbestvouchers/de.php b/modules/statsbestvouchers/de.php new file mode 100644 index 000000000..70068ef07 --- /dev/null +++ b/modules/statsbestvouchers/de.php @@ -0,0 +1,15 @@ +statsbestvouchers_4f29d8c727dcf2022ac241cb96c31083'] = 'Ausgabe Aufnahmeeinstellungen leer'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_eab2b4237a7cd89c309119e35f62d168'] = 'Anzeige'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8bf8854bebe108183caeb845c7676ae4'] = 'von'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_df25596dc94d556af2f1823725118572'] = 'Gesamt benutzt'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_b769cee333527b8dc6f3f67882e35a0b'] = 'Beste Gutscheine'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8fc8a29113479bf76f0917c51795ca99'] = 'Eine Liste der besten Gutscheine'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; + +?> \ No newline at end of file diff --git a/modules/statsbestvouchers/en.php b/modules/statsbestvouchers/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsbestvouchers/en.php @@ -0,0 +1,4 @@ +statsbestvouchers_4f29d8c727dcf2022ac241cb96c31083'] = 'Devolución de recordset vacío'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_eab2b4237a7cd89c309119e35f62d168'] = 'Mostrando'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8bf8854bebe108183caeb845c7676ae4'] = 'de'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventas'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_df25596dc94d556af2f1823725118572'] = 'Total utilizado'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_b769cee333527b8dc6f3f67882e35a0b'] = 'Mejores vales descuento'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8fc8a29113479bf76f0917c51795ca99'] = 'Lista de mejores vales descuento'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; diff --git a/modules/statsbestvouchers/fr.php b/modules/statsbestvouchers/fr.php new file mode 100644 index 000000000..cf68358f8 --- /dev/null +++ b/modules/statsbestvouchers/fr.php @@ -0,0 +1,13 @@ +statsbestvouchers_4f29d8c727dcf2022ac241cb96c31083'] = 'Aucun résultat'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_eab2b4237a7cd89c309119e35f62d168'] = 'Affichage de'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8bf8854bebe108183caeb845c7676ae4'] = 'sur'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Chiffre d\'affaire'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_df25596dc94d556af2f1823725118572'] = 'Total utilisé'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_b769cee333527b8dc6f3f67882e35a0b'] = 'Meilleurs coupons de réduction'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8fc8a29113479bf76f0917c51795ca99'] = 'Liste des meilleurs coupons de réduction'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; diff --git a/modules/statsbestvouchers/it.php b/modules/statsbestvouchers/it.php new file mode 100644 index 000000000..f7f908823 --- /dev/null +++ b/modules/statsbestvouchers/it.php @@ -0,0 +1,15 @@ +statsbestvouchers_4f29d8c727dcf2022ac241cb96c31083'] = 'recordset vuoto restituito'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_eab2b4237a7cd89c309119e35f62d168'] = 'Visualizzazione'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8bf8854bebe108183caeb845c7676ae4'] = 'di'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_df25596dc94d556af2f1823725118572'] = 'Totale usato'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_b769cee333527b8dc6f3f67882e35a0b'] = 'Miglior buoni'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_8fc8a29113479bf76f0917c51795ca99'] = 'Eenco dei migliori buoni'; +$_MODULE['<{statsbestvouchers}prestashop>statsbestvouchers_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; + +?> \ No newline at end of file diff --git a/modules/statsbestvouchers/logo.gif b/modules/statsbestvouchers/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3a15dd67285af0074b69bb46f3df2860ee7dfc GIT binary patch literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) literal 0 HcmV?d00001 diff --git a/modules/statsbestvouchers/statsbestvouchers.php b/modules/statsbestvouchers/statsbestvouchers.php new file mode 100644 index 000000000..89e867f0d --- /dev/null +++ b/modules/statsbestvouchers/statsbestvouchers.php @@ -0,0 +1,132 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsBestVouchers extends ModuleGrid +{ + private $_html; + private $_query; + private $_columns; + private $_defaultSortColumn; + private $_defaultSortDirection; + private $_emptyMessage; + private $_pagingMessage; + + function __construct() + { + $this->name = 'statsbestvouchers'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + $this->_defaultSortColumn = 'ca'; + $this->_defaultSortDirection = 'DESC'; + $this->_emptyMessage = $this->l('Empty recordset returned'); + $this->_pagingMessage = $this->l('Displaying').' {0} - {1} '.$this->l('of').' {2}'; + + $this->_columns = array( + array( + 'id' => 'name', + 'header' => $this->l('Name'), + 'dataIndex' => 'name', + 'align' => 'left', + 'width' => 300 + ), + array( + 'id' => 'ca', + 'header' => $this->l('Sales'), + 'dataIndex' => 'ca', + 'width' => 30, + 'align' => 'right' + ), + array( + 'id' => 'total', + 'header' => $this->l('Total used'), + 'dataIndex' => 'total', + 'width' => 30, + 'align' => 'right' + ) + ); + + parent::__construct(); + + $this->displayName = $this->l('Best vouchers'); + $this->description = $this->l('A list of the best vouchers'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $engineParams = array( + 'id' => 'id_product', + 'title' => $this->displayName, + 'columns' => $this->_columns, + 'defaultSortColumn' => $this->_defaultSortColumn, + 'defaultSortDirection' => $this->_defaultSortDirection, + 'emptyMessage' => $this->_emptyMessage, + 'pagingMessage' => $this->_pagingMessage + ); + + if (Tools::getValue('export')) + $this->csvExport($engineParams); + + $this->_html = ' +
    '.$this->displayName.' + '.$this->engine($engineParams).' +
    '.$this->l('CSV Export').' +
    '; + return $this->_html; + } + + public function getData() + { + $this->_query = 'SELECT SQL_CALC_FOUND_ROWS od.name, COUNT(od.id_discount) as total, SUM(o.total_paid_real) / o.conversion_rate as ca + FROM '._DB_PREFIX_.'order_discount od + LEFT JOIN '._DB_PREFIX_.'orders o ON o.id_order = od.id_order + WHERE o.valid = 1 + '.$this->sqlShopRestriction(false, 'o').' + AND o.invoice_date BETWEEN '.$this->getDate().' + GROUP BY od.id_discount'; + if (Validate::IsName($this->_sort)) + { + $this->_query .= ' ORDER BY `'.$this->_sort.'`'; + if (isset($this->_direction)) + $this->_query .= ' '.$this->_direction; + } + if (($this->_start === 0 OR Validate::IsUnsignedInt($this->_start)) AND Validate::IsUnsignedInt($this->_limit)) + $this->_query .= ' LIMIT '.$this->_start.', '.($this->_limit); + $this->_values = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query); + $this->_totalCount = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('SELECT FOUND_ROWS()'); + } +} \ No newline at end of file diff --git a/modules/statscarrier/config.xml b/modules/statscarrier/config.xml new file mode 100755 index 000000000..c016ccb09 --- /dev/null +++ b/modules/statscarrier/config.xml @@ -0,0 +1,12 @@ + + + statscarrier + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statscarrier/de.php b/modules/statscarrier/de.php new file mode 100644 index 000000000..c4b53b82b --- /dev/null +++ b/modules/statscarrier/de.php @@ -0,0 +1,14 @@ +statscarrier_2e6774abc54cb13cef2c5bfd5a2cb463'] = 'Verteilung der Lieferanten'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca0e2bcc96175be91d54e4efb1b32053'] = 'Zeigt die Verteilung der Lieferanten an'; +$_MODULE['<{statscarrier}prestashop>statscarrier_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Alle'; +$_MODULE['<{statscarrier}prestashop>statscarrier_d7778d0c64b6ba21494c97f77a66885a'] = 'Filter'; +$_MODULE['<{statscarrier}prestashop>statscarrier_0bed2833289bf7aae607f86b0750101c'] = 'Diese Grafik zeigt die Verteilung der Lieferanten für Ihre Bestellung an. Sie können sie auch auf einen Bestellstatus begrenzen.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statscarrier}prestashop>statscarrier_07701328e4cdbd1c145f234f136892b5'] = 'Keine gültigen Bestellungen für diesen Zeitraum.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca190d96c8c6f00f57f5e572708253fb'] = 'Prozentsatz der Bestellungen pro Lieferant'; + +?> \ No newline at end of file diff --git a/modules/statscarrier/en.php b/modules/statscarrier/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statscarrier/en.php @@ -0,0 +1,4 @@ +statscarrier_2e6774abc54cb13cef2c5bfd5a2cb463'] = 'Distribución transportista'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca0e2bcc96175be91d54e4efb1b32053'] = 'Mostrar la distribución de los transportistas'; +$_MODULE['<{statscarrier}prestashop>statscarrier_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Todos'; +$_MODULE['<{statscarrier}prestashop>statscarrier_d7778d0c64b6ba21494c97f77a66885a'] = 'Filtrar'; +$_MODULE['<{statscarrier}prestashop>statscarrier_0bed2833289bf7aae607f86b0750101c'] = 'Este gráfico representa la distribución de transportistas por pedidos. Es posible limitarlo a un estado del pedido. '; +$_MODULE['<{statscarrier}prestashop>statscarrier_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statscarrier}prestashop>statscarrier_07701328e4cdbd1c145f234f136892b5'] = 'No hay pedidos válidos para este periodo.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca190d96c8c6f00f57f5e572708253fb'] = 'porcentaje de pedidos por transportista'; diff --git a/modules/statscarrier/fr.php b/modules/statscarrier/fr.php new file mode 100644 index 000000000..20f3add1e --- /dev/null +++ b/modules/statscarrier/fr.php @@ -0,0 +1,12 @@ +statscarrier_2e6774abc54cb13cef2c5bfd5a2cb463'] = 'Répartition par transporteur'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca0e2bcc96175be91d54e4efb1b32053'] = 'Affiche la répartition des commandes par transporteur'; +$_MODULE['<{statscarrier}prestashop>statscarrier_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tout afficher'; +$_MODULE['<{statscarrier}prestashop>statscarrier_d7778d0c64b6ba21494c97f77a66885a'] = 'Filtrer'; +$_MODULE['<{statscarrier}prestashop>statscarrier_0bed2833289bf7aae607f86b0750101c'] = 'Ce graphique représente la répartition des transporteurs pour vos commandes. Il est également possible de filtrer par état de commande.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statscarrier}prestashop>statscarrier_07701328e4cdbd1c145f234f136892b5'] = 'Aucune commande valide pour cette période.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca190d96c8c6f00f57f5e572708253fb'] = 'Pourcentage de commandes par transporteur'; diff --git a/modules/statscarrier/it.php b/modules/statscarrier/it.php new file mode 100644 index 000000000..08f3e9bb4 --- /dev/null +++ b/modules/statscarrier/it.php @@ -0,0 +1,14 @@ +statscarrier_2e6774abc54cb13cef2c5bfd5a2cb463'] = 'Ripartizione per corriere'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca0e2bcc96175be91d54e4efb1b32053'] = 'Mostra la ripartizione per corrieri '; +$_MODULE['<{statscarrier}prestashop>statscarrier_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tutto'; +$_MODULE['<{statscarrier}prestashop>statscarrier_d7778d0c64b6ba21494c97f77a66885a'] = 'Filtro'; +$_MODULE['<{statscarrier}prestashop>statscarrier_0bed2833289bf7aae607f86b0750101c'] = 'Questo grafico rappresenta la ripartizione per corriere dei tuoi ordini. È inoltre possibile limitare a uno stato di ordine.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statscarrier}prestashop>statscarrier_07701328e4cdbd1c145f234f136892b5'] = 'Nessun ordine valido per questo periodo.'; +$_MODULE['<{statscarrier}prestashop>statscarrier_ca190d96c8c6f00f57f5e572708253fb'] = 'Percentuale degli ordini per corriere'; + +?> \ No newline at end of file diff --git a/modules/statscarrier/logo.gif b/modules/statscarrier/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..482ceea3cddf5a48431d1f910553c60ea5683cb5 GIT binary patch literal 583 zcmZ?wbhEHb6krfwc*elsZK-&DWA(N=7oCJ9)tm3CN6ml!>A$L}@A3J?n>TMxPEI~@ z8L9Ky+U{zCh92BX{H(G}s;ZJJ7!3_IjQIJ@1Z36Kot#uu82&S~ qanyWt65wFv)3KPaAmM^zTa%Q5&jEuY3Y}a!=Wd +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsCarrier extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + private $_option = ''; + + function __construct() + { + $this->name = 'statscarrier'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Carrier distribution'); + $this->description = $this->l('Display the carriers distribution'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + global $cookie; + + $sql = 'SELECT COUNT(o.`id_order`) as total + FROM `'._DB_PREFIX_.'orders` o + WHERE o.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(false, 'o').' + '.((int)(Tools::getValue('id_order_state')) ? 'AND (SELECT oh.id_order_state FROM `'._DB_PREFIX_.'order_history` oh WHERE o.id_order = oh.id_order ORDER BY oh.date_add DESC, oh.id_order_history DESC LIMIT 1) = '.(int)(Tools::getValue('id_order_state')) : ''); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + $states = OrderState::getOrderStates((int)($cookie->id_lang)); + + if (Tools::getValue('export')) + $this->csvExport(array('type' => 'pie', 'option' => Tools::getValue('id_order_state'))); + $this->_html = ' +
    '.$this->displayName.' +
    + + +
    +

    '.$this->l('This graph represents the carrier distribution for your orders. You can also limit it to orders in one state.').'

    + '.($result['total'] ? $this->engine(array('type' => 'pie', 'option' => Tools::getValue('id_order_state'))).'

    '.$this->l('CSV Export').'' : $this->l('No valid orders for this period.')).' +
    '; + return $this->_html; + } + + public function setOption($option, $layers = 1) + { + $this->_option = (int)($option); + } + + protected function getData($layers) + { + $stateQuery = ''; + if ((int)($this->_option)) + $stateQuery = 'AND (SELECT oh.id_order_state FROM `'._DB_PREFIX_.'order_history` oh WHERE o.id_order = oh.id_order ORDER BY oh.date_add DESC, oh.id_order_history DESC LIMIT 1) = '.(int)($this->_option); + $this->_titles['main'] = $this->l('Percentage of orders by carrier'); + + $sql = 'SELECT c.name, COUNT(DISTINCT o.`id_order`) as total + FROM `'._DB_PREFIX_.'carrier` c + LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.id_carrier = c.id_carrier + WHERE o.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(false, 'o').' + '.$stateQuery.' + GROUP BY c.`id_carrier`'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = $row['name']; + } + } +} + + diff --git a/modules/statscatalog/application_home.png b/modules/statscatalog/application_home.png new file mode 100644 index 0000000000000000000000000000000000000000..b60d0c85afc41d8888b874fb21fbb215a8678065 GIT binary patch literal 685 zcmV;e0#f~nP)I{hwZ<~aTagPdH^@uK zjY~?Dw;H9EMl7~jY&PfYJf}U+@AtF+YUNh@d;&9LB7zNj@9bW&y4W^QvDgey#Z(a$ zObs=~L{KwK1W{#5ln!@vbRT?hX7fc?Y${&J*Tmt>8vaK-T#*aFMOR5JtPGU-m&=A} z>TO{pOGy&t!=mG4xtM^3mKOte|UGJg?xP-rE$mV9Ba&%vrgIZ=IbKrquG}+;$3iho_m~IZ?q2fogS#R3qlEKgP5f zb4V+{nb+8a*%6*zK1`NoxG2O^Q9NgAj0pmk@4U(5NB5aEw}I1btqcwh5yvsj&CT4t zSL8s;X;8+f3SOuxj0=K*R0A{}A)k+EY-}V50x%;N*Wq#y<`|=@crHs*yjQ(1c>V1S zpUNF9?O#T1TuY%)U{Zb(?E`NqE$`v{vo;n^UCgH9MzS=+b0&&+^W}AtO2Rb}@>rRo0Q0^~dYKRD`il?SH=a@Wg zGEo%asTrQ@{?c`K*V%NlilCy12&#&tDXNN^VJesyYKp0%ig%Y$ftfK8Artf$>Q*=b T>SSUs00000NkvXXu0mjf_=`4z literal 0 HcmV?d00001 diff --git a/modules/statscatalog/basket_delete.png b/modules/statscatalog/basket_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..1349974f60fbd0aaa127377ac1dea26e5750fbd5 GIT binary patch literal 773 zcmV+g1N!`lP)2;YAlw2H{OX6m%2x z9k^~Jj3Ckr9VnQr!KB%;i_&6Q-*(XV^lcB9Pu|&GNonSO7$7c6eYa1wJ=xR_(A>>1`N5p7 zsCYibaSEm3C|Z4d`qoJIKLgO*40(CD#Kb~u;S1PEWOj9F847I;D8ro>?l*53aI{A1 zw@@0=mf-t&P#)*lE?-*hbMX_6_(>;&HVm-K$D;kYD4FDlj`cs$<#J_l7sY6*DV#2{0r?SCzu$9X+Hvz4A#KOj%eOjUg_)^kmHOR* z1`3r%1NNDUgv3N)up5mIjhZ)>YP>$qw8+_m~#CmCO(2yCKyGw00000NkvXXu0mjf DL5fvw literal 0 HcmV?d00001 diff --git a/modules/statscatalog/config.xml b/modules/statscatalog/config.xml new file mode 100755 index 000000000..8e7b927ff --- /dev/null +++ b/modules/statscatalog/config.xml @@ -0,0 +1,12 @@ + + + statscatalog + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statscatalog/de.php b/modules/statscatalog/de.php new file mode 100644 index 000000000..2f9418b33 --- /dev/null +++ b/modules/statscatalog/de.php @@ -0,0 +1,28 @@ +statscatalog_cf3aa21c6a2147ddbd86f34091daeccd'] = 'Katalogstatistik'; +$_MODULE['<{statscatalog}prestashop>statscatalog_226ed1224c5b2db3d3e0716bb4f74da5'] = 'Allgemeine Statistiken über Ihren Katalog'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85dbdb21fe502c4d7a1e81bca0aa396d'] = 'Kauf'; +$_MODULE['<{statscatalog}prestashop>statscatalog_233d48e63da77b092da350559d2f8382'] = 'Besuche'; +$_MODULE['<{statscatalog}prestashop>statscatalog_0173374ac20f5843d58b553d5b226ef6'] = 'Wählen Sie eine Kategorie'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Alle'; +$_MODULE['<{statscatalog}prestashop>statscatalog_a7b623414d4b6a3225b4e935babec6d2'] = 'Produkte zur Verfügung:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_1099377f1598a0856e2457a5145d89c2'] = 'Durchschnittlicher Preis (Basispreis):'; +$_MODULE['<{statscatalog}prestashop>statscatalog_48a93dc02c74f3065af1ba47fca070d0'] = 'Größe und gesehene Seiten:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_156e5c5872c9af24a5c982da07a883c2'] = 'Gekaufte Produkte:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85f179d4142ca061d49605a7fffdc09d'] = 'Durchschnittliche Anzahl an Seitenaufrufen:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_05ff4bfc3baf0acd31a72f1ac754de04'] = 'Durchschnittliche Anzahl an Einkäufen:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_c09d09e371989d89847049c9574b6b8e'] = 'Bilder zur Verfügung:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_65275d1b04037d8c8e42425002110363'] = 'Durchschnittliche Anzahl an Bildern:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_51b8891d531ad91128ba58c8928322ab'] = 'Nie angesehene Produkte:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8725647ef741e5d48c1e6f652ce80b50'] = 'Nie gekaufte Produkte:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b86770bc713186bcf43dbb1164c5fd28'] = 'Umwandlungsrate*:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_64de80ec5f50aefd6ab2b9260a1f4055'] = 'Durchschnittliche Umwandlungsrate für die Produktseite. Man kann ein Produkt kaufen, ohne die Produktseite anzusehen. In dem Fall kann diese Rate größer als 1 sein.'; +$_MODULE['<{statscatalog}prestashop>statscatalog_58a714d3e9bb2902a5b688c99bd4d8e6'] = 'Nie gekaufte Produkte '; +$_MODULE['<{statscatalog}prestashop>statscatalog_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscatalog}prestashop>statscatalog_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8e7c9a35104a5a68199678bd6bc5d187'] = 'Bearbeiten/ Ansehen'; + +?> \ No newline at end of file diff --git a/modules/statscatalog/en.php b/modules/statscatalog/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statscatalog/en.php @@ -0,0 +1,4 @@ +statscatalog_cf3aa21c6a2147ddbd86f34091daeccd'] = 'Catálogo de estadísticas'; +$_MODULE['<{statscatalog}prestashop>statscatalog_226ed1224c5b2db3d3e0716bb4f74da5'] = 'Estadísticas generales sobre su catálogo'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85dbdb21fe502c4d7a1e81bca0aa396d'] = 'compras'; +$_MODULE['<{statscatalog}prestashop>statscatalog_233d48e63da77b092da350559d2f8382'] = 'visitas'; +$_MODULE['<{statscatalog}prestashop>statscatalog_0173374ac20f5843d58b553d5b226ef6'] = 'Elija una categoría'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'todas'; +$_MODULE['<{statscatalog}prestashop>statscatalog_a7b623414d4b6a3225b4e935babec6d2'] = 'Producto disponibles:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_1099377f1598a0856e2457a5145d89c2'] = 'Precio medio (precio base):'; +$_MODULE['<{statscatalog}prestashop>statscatalog_48a93dc02c74f3065af1ba47fca070d0'] = 'Páginas del producto vistas:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_156e5c5872c9af24a5c982da07a883c2'] = 'Productos comprados:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85f179d4142ca061d49605a7fffdc09d'] = 'Número medio de á¡ginas visitadas:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_05ff4bfc3baf0acd31a72f1ac754de04'] = 'Número medio de compras:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_c09d09e371989d89847049c9574b6b8e'] = 'Imágenes disponibles:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_65275d1b04037d8c8e42425002110363'] = 'Número medio de imágenes:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_51b8891d531ad91128ba58c8928322ab'] = 'Producto nunca vistos:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8725647ef741e5d48c1e6f652ce80b50'] = 'Producto no comprados nunca:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b86770bc713186bcf43dbb1164c5fd28'] = 'Índice de conversión'; +$_MODULE['<{statscatalog}prestashop>statscatalog_64de80ec5f50aefd6ab2b9260a1f4055'] = 'Promedio tipo de conversión de la página del producto. Es posible comprar un producto sin ver la página del producto, por lo que esta tasa puede ser mayor que 1.'; +$_MODULE['<{statscatalog}prestashop>statscatalog_58a714d3e9bb2902a5b688c99bd4d8e6'] = 'Productos nunca comprados'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscatalog}prestashop>statscatalog_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8e7c9a35104a5a68199678bd6bc5d187'] = 'Editar/Ver'; diff --git a/modules/statscatalog/fr.php b/modules/statscatalog/fr.php new file mode 100644 index 000000000..c5456cdb1 --- /dev/null +++ b/modules/statscatalog/fr.php @@ -0,0 +1,26 @@ +statscatalog_cf3aa21c6a2147ddbd86f34091daeccd'] = 'Statistiques catalogue'; +$_MODULE['<{statscatalog}prestashop>statscatalog_226ed1224c5b2db3d3e0716bb4f74da5'] = 'Statistiques générales sur le catalogue'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85dbdb21fe502c4d7a1e81bca0aa396d'] = 'achat'; +$_MODULE['<{statscatalog}prestashop>statscatalog_233d48e63da77b092da350559d2f8382'] = 'visites'; +$_MODULE['<{statscatalog}prestashop>statscatalog_0173374ac20f5843d58b553d5b226ef6'] = 'Choisissez une catégorie'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Toutes'; +$_MODULE['<{statscatalog}prestashop>statscatalog_a7b623414d4b6a3225b4e935babec6d2'] = 'Produits disponibles :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_1099377f1598a0856e2457a5145d89c2'] = 'Prix moyen (HT) :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_48a93dc02c74f3065af1ba47fca070d0'] = 'Pages produit vues :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_156e5c5872c9af24a5c982da07a883c2'] = 'Produits achetés :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85f179d4142ca061d49605a7fffdc09d'] = 'Nombre moyen de visites :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_05ff4bfc3baf0acd31a72f1ac754de04'] = 'Nombre moyen d\'achats :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_c09d09e371989d89847049c9574b6b8e'] = 'Images disponibles :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_65275d1b04037d8c8e42425002110363'] = 'Nombre moyen d\'images :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_51b8891d531ad91128ba58c8928322ab'] = 'Produits jamais consultés :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8725647ef741e5d48c1e6f652ce80b50'] = 'Produits jamais achetés :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b86770bc713186bcf43dbb1164c5fd28'] = 'Taux de transformation* :'; +$_MODULE['<{statscatalog}prestashop>statscatalog_64de80ec5f50aefd6ab2b9260a1f4055'] = 'Taux de transformation moyen pour une page produit. Un produit pouvant être acheté sans passer par sa page dédiée, cet indicateur peut être supérieur à 1.'; +$_MODULE['<{statscatalog}prestashop>statscatalog_58a714d3e9bb2902a5b688c99bd4d8e6'] = 'Produits jamais achetés'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscatalog}prestashop>statscatalog_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8e7c9a35104a5a68199678bd6bc5d187'] = 'Editer / Voir'; diff --git a/modules/statscatalog/it.php b/modules/statscatalog/it.php new file mode 100644 index 000000000..89389b079 --- /dev/null +++ b/modules/statscatalog/it.php @@ -0,0 +1,28 @@ +statscatalog_cf3aa21c6a2147ddbd86f34091daeccd'] = 'Catalogo statistiche'; +$_MODULE['<{statscatalog}prestashop>statscatalog_226ed1224c5b2db3d3e0716bb4f74da5'] = 'Statistiche generali sul tuo catalogo'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85dbdb21fe502c4d7a1e81bca0aa396d'] = 'acquisto'; +$_MODULE['<{statscatalog}prestashop>statscatalog_233d48e63da77b092da350559d2f8382'] = 'visite'; +$_MODULE['<{statscatalog}prestashop>statscatalog_0173374ac20f5843d58b553d5b226ef6'] = 'Scegli una categoria'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tutto'; +$_MODULE['<{statscatalog}prestashop>statscatalog_a7b623414d4b6a3225b4e935babec6d2'] = 'Prodotti disponibili:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_1099377f1598a0856e2457a5145d89c2'] = 'Prezzo medio (prezzo base):'; +$_MODULE['<{statscatalog}prestashop>statscatalog_48a93dc02c74f3065af1ba47fca070d0'] = 'Pagine viste del prodotto:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_156e5c5872c9af24a5c982da07a883c2'] = 'I prodotti acquistati:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_85f179d4142ca061d49605a7fffdc09d'] = 'Numero medio di visite pagina:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_05ff4bfc3baf0acd31a72f1ac754de04'] = 'Numero medio di acquisti:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_c09d09e371989d89847049c9574b6b8e'] = 'Immagini disponibili:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_65275d1b04037d8c8e42425002110363'] = 'Numero medio di immagini:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_51b8891d531ad91128ba58c8928322ab'] = 'I prodotti mai visti:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8725647ef741e5d48c1e6f652ce80b50'] = 'Prodotti mai comprati:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b86770bc713186bcf43dbb1164c5fd28'] = 'Tasso di conversione *:'; +$_MODULE['<{statscatalog}prestashop>statscatalog_64de80ec5f50aefd6ab2b9260a1f4055'] = 'Tasso medio di conversione per la pagina del prodotto. E\' possibile acquistare un prodotto senza visualizzare la pagina del prodotto, quindi questo tasso può essere maggiore di 1.'; +$_MODULE['<{statscatalog}prestashop>statscatalog_58a714d3e9bb2902a5b688c99bd4d8e6'] = 'Prodotti mai comprati'; +$_MODULE['<{statscatalog}prestashop>statscatalog_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscatalog}prestashop>statscatalog_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statscatalog}prestashop>statscatalog_8e7c9a35104a5a68199678bd6bc5d187'] = 'Modifica / Visualizza'; + +?> \ No newline at end of file diff --git a/modules/statscatalog/logo.gif b/modules/statscatalog/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b7ff6f1bc583c5d05a7ee8a2f4588ebdc182e3b GIT binary patch literal 932 zcmZ?wbhEHb6krfw_|5Y}$HH}?t;b?}zZI?ltK37^_=m3zh*%dGwLUm}gHOap z-{?&Naa)4pw}vEc3r*e;p0Xn%V|R4M?wG8-aXI_qbN43{989h`P!!N}Hn8_x{LJeK zb8h4=d04RGQSFA8^_yOG9IJ0?YU=Cjn>lmlqD70=tXZ>hvR+Gxfli9fw~XIQ{m}*>@+ed;oiN zlo$;G^bk<|$->CM@Si~kBmv433>=LN|2btmHY_+;@6mLkp>TtOfSPxViHd}?r;wO1 z`@W2gOpeF;dCQ;7_;J{sU)Cb;#tO&B4UJ4Jl_@F=mlC){)I2y?EiHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj literal 0 HcmV?d00001 diff --git a/modules/statscatalog/statscatalog.php b/modules/statscatalog/statscatalog.php new file mode 100644 index 000000000..2ee20eb18 --- /dev/null +++ b/modules/statscatalog/statscatalog.php @@ -0,0 +1,244 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7060 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsCatalog extends Module +{ + private $_join = ''; + private $_where = ''; + + function __construct() + { + $this->name = 'statscatalog'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Catalog statistics'); + $this->description = $this->l('General statistics about your catalog.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function getQuery1() + { + $sql = 'SELECT COUNT(DISTINCT p.`id_product`) AS total, SUM(p.`price`) / COUNT(`price`) AS average_price, COUNT(DISTINCT i.`id_image`) AS images + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'image` i ON i.`id_product` = p.`id_product` + '.$this->_join.' + WHERE p.`active` = 1 + '.$this->_where; + return DB::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + } + + public function getTotalPageViewed() + { + $sql = 'SELECT SUM(pv.`counter`) AS viewed + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'page` pa ON p.`id_product` = pa.`id_object` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON (pt.`id_page_type` = pa.`id_page_type` AND pt.`name` = \'product.php\') + LEFT JOIN `'._DB_PREFIX_.'page_viewed` pv ON pv.`id_page` = pa.`id_page` + '.$this->_join.' + WHERE p.`active` = 1 + '.$this->_where; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return isset($result['viewed']) ? $result['viewed'] : 0; + } + + public function getTotalProductViewed() + { + $sql = 'SELECT COUNT(DISTINCT pa.`id_object`) + FROM `'._DB_PREFIX_.'page_viewed` pv + LEFT JOIN `'._DB_PREFIX_.'page` pa ON pv.`id_page` = pa.`id_page` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = pa.`id_page_type` + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = pa.`id_object` + '.$this->_join.' + WHERE pt.`name` = \'product.php\' + AND p.`active` = 1 + '.$this->_where; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + public function getTotalBought() + { + $sql = 'SELECT SUM(od.`product_quantity`) AS bought + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.`id_order` = od.`id_order` + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = od.`product_id` + '.$this->_join.' + WHERE o.valid = 1 + '.$this->_where; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return isset($result['bought']) ? $result['bought'] : 0; + } + + public function getProductsNB($id_lang) + { + $sql = 'SELECT p.`id_product` + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.`id_order` = od.`id_order` + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = od.`product_id` + '.$this->_join.' + WHERE o.valid = 1 + '.$this->_where.' + AND p.`active` = 1 + GROUP BY p.`id_product`'; + $precalc = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + + $precalc2 = array(); + foreach ($precalc as $array) + $precalc2[] = (int)($array['id_product']); + + $sql = 'SELECT p.id_product, pl.name, pl.link_rewrite + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product` AND pl.id_lang = '.(int)($id_lang).') + '.$this->_join.' + WHERE p.`active` = 1 + '.(sizeof($precalc2) ? 'AND p.`id_product` NOT IN ('.implode(',', $precalc2).')' : '').' + '.$this->_where; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + return array('total' => Db::getInstance(_PS_USE_SQL_SLAVE_)->NumRows(), 'result' => $result); + } + + public function hookAdminStatsModules($params) + { + global $cookie; + + $categories = Category::getCategories((int)($cookie->id_lang), true, false); + $productToken = Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee)); + $currency = Currency::getCurrency(Configuration::get('PS_CURRENCY_DEFAULT')); + $link = new Link(); + $irow = 0; + + if ($id_category = (int)(Tools::getValue('id_category'))) + { + $this->_join = ' LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = p.`id_product`)'; + $this->_where = ' AND cp.`id_category` = '.$id_category; + } + + if ($this->shopID || $this->shopGroupID) + { + $this->_join .= ' LEFT JOIN '._DB_PREFIX_.'product_shop ps ON ps.id_product = p.id_product'; + if ($this->shopID) + $this->_where .= ' AND ps.id_shop = ' . $this->shopID; + else if ($this->shopGroupID) + $this->_where .= ' AND ps.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.')'; + } + + $result1 = $this->getQuery1(true); + $total = $result1['total']; + $averagePrice = $result1['average_price']; + $totalPictures = $result1['images']; + $averagePictures = $total ? $totalPictures / $total : 0; + + $neverBought = $this->getProductsNB((int)($cookie->id_lang)); + $totalNB = $neverBought['total']; + $productsNB = $neverBought['result']; + + $totalBought = $this->getTotalBought(); + $averagePurchase = $total ? ($totalBought / $total) : 0; + + $totalPageViewed = $this->getTotalPageViewed(); + $averageViewed = $total ? ($totalPageViewed / $total) : 0; + $conversion = number_format((float)($totalPageViewed ? ($totalBought / $totalPageViewed) : 0), 2, '.', ''); + if ($conversionReverse = number_format((float)($totalBought ? ($totalPageViewed / $totalBought) : 0), 2, '.', '')) + $conversion .= ' (1 '.$this->l('purchase').' / '.$conversionReverse.' '.$this->l('visits').')'; + + $totalNV = $total - $this->getTotalProductViewed(); + + $html = ' + +
    '.$this->displayName.' + +
    +
    + +
    +
    +
    + + '.$this->returnLine($this->l('Products available:'), (int)($total)).' + '.$this->returnLine($this->l('Average price (base price):'), Tools::displayPrice($averagePrice, $currency)).' + '.$this->returnLine($this->l('Product pages viewed:'), (int)($totalPageViewed)).' + '.$this->returnLine($this->l('Products bought:'), (int)($totalBought)).' + '.$this->returnLine($this->l('Average number of page visits:'), number_format((float)($averageViewed), 2, '.', '')).' + '.$this->returnLine($this->l('Average number of purchases:'), number_format((float)($averagePurchase), 2, '.', '')).' + '.$this->returnLine($this->l('Images available:'), (int)($totalPictures)).' + '.$this->returnLine($this->l('Average number of images:'), number_format((float)($averagePictures), 2, '.', '')).' + '.$this->returnLine($this->l('Products never viewed:'), (int)($totalNV).' / '.(int)($total)).' + '.$this->returnLine(''.$this->l('Products never purchased:').'', (int)($totalNB).' / '.(int)($total)).' + '.$this->returnLine($this->l('Conversion rate*:'), $conversion).' +
    +
    + * + '.$this->l('Average conversion rate for the product page. It is possible to purchase a product without viewing the product page, so this rate can be greater than 1.').' +
    +
    '; + + if (sizeof($productsNB) AND sizeof($productsNB) < 50) + { + $html .= ' +
    '.$this->l('Products never purchased').' + + '; + foreach ($productsNB as $product) + $html .= ' + + + + + '; + $html .= ' +
    '.$this->l('ID').''.$this->l('Name').''.$this->l('Edit / View').'
    '.$product['id_product'].''.$product['name'].' + + +
    +
    '; + } + return $html; + } + + private function returnLine($label, $data) + { + return ''.$label.''.$data.''; + } +} \ No newline at end of file diff --git a/modules/statscheckup/config.xml b/modules/statscheckup/config.xml new file mode 100755 index 000000000..a724b5305 --- /dev/null +++ b/modules/statscheckup/config.xml @@ -0,0 +1,12 @@ + + + statscheckup + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statscheckup/de.php b/modules/statscheckup/de.php new file mode 100644 index 000000000..4d895c1cd --- /dev/null +++ b/modules/statscheckup/de.php @@ -0,0 +1,32 @@ +statscheckup_e7a908d79d3758c911692ba791da9c70'] = 'Katalogbewertung'; +$_MODULE['<{statscheckup}prestashop>statscheckup_24f870376156be0e8e22cfb94d29df6d'] = 'Katalogqualität im Handumdrehen'; +$_MODULE['<{statscheckup}prestashop>statscheckup_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{statscheckup}prestashop>statscheckup_bae60998ffe4923b131e3d6e4c19993e'] = 'schlecht'; +$_MODULE['<{statscheckup}prestashop>statscheckup_6927a3a7218a3195858411433ec20a21'] = 'Durchschnitt'; +$_MODULE['<{statscheckup}prestashop>statscheckup_755f85c2723bb39381c7379a604160d8'] = 'gut'; +$_MODULE['<{statscheckup}prestashop>statscheckup_8bc84316c4078bf66723fd019616d920'] = 'Beschreibungen'; +$_MODULE['<{statscheckup}prestashop>statscheckup_5cd1930570823694abdd596f29c8943d'] = 'Zeichen (ohne HTML)'; +$_MODULE['<{statscheckup}prestashop>statscheckup_fff0d600f8a0b5e19e88bfb821dd1157'] = 'Bilder'; +$_MODULE['<{statscheckup}prestashop>statscheckup_59b514174bffe4ae402b3d63aad79fe0'] = 'Bilder'; +$_MODULE['<{statscheckup}prestashop>statscheckup_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{statscheckup}prestashop>statscheckup_c3917e1f7138a24c6dc954fe81b86679'] = 'Bestellungen/ Monat'; +$_MODULE['<{statscheckup}prestashop>statscheckup_27ce7f8b5623b2e2df568d64cf051607'] = 'Lager'; +$_MODULE['<{statscheckup}prestashop>statscheckup_691d502cfd0e0626cd3b058e5682ad1c'] = 'Artikel'; +$_MODULE['<{statscheckup}prestashop>statscheckup_dc270bcf468689b19074a5eef7581b52'] = 'Nicht genug'; +$_MODULE['<{statscheckup}prestashop>statscheckup_f4abc77d498c89880f67331609406774'] = 'In Ordnung'; +$_MODULE['<{statscheckup}prestashop>statscheckup_eb37cbc42e2338eec3de04db470d689a'] = 'weniger als'; +$_MODULE['<{statscheckup}prestashop>statscheckup_bde3207d6920ce65500670d7eaf77af9'] = 'größer als'; +$_MODULE['<{statscheckup}prestashop>statscheckup_38fb7d24e0d60a048f540ecb18e13376'] = 'Speichern'; +$_MODULE['<{statscheckup}prestashop>statscheckup_01fda57aa6c7e9f07f5aa36b108e95cb'] = 'Bestellung nach'; +$_MODULE['<{statscheckup}prestashop>statscheckup_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscheckup}prestashop>statscheckup_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statscheckup}prestashop>statscheckup_7d74f3b92b19da5e606d737d339a9679'] = 'Artikel'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Aktiv'; +$_MODULE['<{statscheckup}prestashop>statscheckup_3f74e68055b1123e5d7deb32cd8b0b1b'] = 'Beschr.'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4cc6684df7b4a92b1dec6fce3264fac8'] = 'Insgesamt'; + +?> \ No newline at end of file diff --git a/modules/statscheckup/es.php b/modules/statscheckup/es.php new file mode 100644 index 000000000..f3aef4fb6 --- /dev/null +++ b/modules/statscheckup/es.php @@ -0,0 +1,30 @@ +statscheckup_e7a908d79d3758c911692ba791da9c70'] = 'Evaluación del catálogo'; +$_MODULE['<{statscheckup}prestashop>statscheckup_24f870376156be0e8e22cfb94d29df6d'] = 'Calidad de su catálogo de inmediato'; +$_MODULE['<{statscheckup}prestashop>statscheckup_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración actualizada'; +$_MODULE['<{statscheckup}prestashop>statscheckup_bae60998ffe4923b131e3d6e4c19993e'] = 'mal'; +$_MODULE['<{statscheckup}prestashop>statscheckup_6927a3a7218a3195858411433ec20a21'] = 'regular'; +$_MODULE['<{statscheckup}prestashop>statscheckup_755f85c2723bb39381c7379a604160d8'] = 'bien'; +$_MODULE['<{statscheckup}prestashop>statscheckup_8bc84316c4078bf66723fd019616d920'] = 'Descripciones'; +$_MODULE['<{statscheckup}prestashop>statscheckup_5cd1930570823694abdd596f29c8943d'] = 'caracteres (sin HTML)'; +$_MODULE['<{statscheckup}prestashop>statscheckup_fff0d600f8a0b5e19e88bfb821dd1157'] = 'Imágenes'; +$_MODULE['<{statscheckup}prestashop>statscheckup_59b514174bffe4ae402b3d63aad79fe0'] = 'imágenes'; +$_MODULE['<{statscheckup}prestashop>statscheckup_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventas'; +$_MODULE['<{statscheckup}prestashop>statscheckup_c3917e1f7138a24c6dc954fe81b86679'] = 'pedidos / mes'; +$_MODULE['<{statscheckup}prestashop>statscheckup_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statscheckup}prestashop>statscheckup_691d502cfd0e0626cd3b058e5682ad1c'] = 'artículos'; +$_MODULE['<{statscheckup}prestashop>statscheckup_dc270bcf468689b19074a5eef7581b52'] = 'Insuficiente'; +$_MODULE['<{statscheckup}prestashop>statscheckup_f4abc77d498c89880f67331609406774'] = 'Perfecto'; +$_MODULE['<{statscheckup}prestashop>statscheckup_eb37cbc42e2338eec3de04db470d689a'] = 'inferior a '; +$_MODULE['<{statscheckup}prestashop>statscheckup_bde3207d6920ce65500670d7eaf77af9'] = 'superior a'; +$_MODULE['<{statscheckup}prestashop>statscheckup_38fb7d24e0d60a048f540ecb18e13376'] = 'Guardar'; +$_MODULE['<{statscheckup}prestashop>statscheckup_01fda57aa6c7e9f07f5aa36b108e95cb'] = 'Seleccionar por'; +$_MODULE['<{statscheckup}prestashop>statscheckup_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscheckup}prestashop>statscheckup_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statscheckup}prestashop>statscheckup_7d74f3b92b19da5e606d737d339a9679'] = 'Artículo'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Activado'; +$_MODULE['<{statscheckup}prestashop>statscheckup_3f74e68055b1123e5d7deb32cd8b0b1b'] = 'Desactivado'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4cc6684df7b4a92b1dec6fce3264fac8'] = 'Global'; diff --git a/modules/statscheckup/fr.php b/modules/statscheckup/fr.php new file mode 100644 index 000000000..a47a9b0ef --- /dev/null +++ b/modules/statscheckup/fr.php @@ -0,0 +1,31 @@ +statscheckup_e7a908d79d3758c911692ba791da9c70'] = 'Evaluation du catalogue'; +$_MODULE['<{statscheckup}prestashop>statscheckup_24f870376156be0e8e22cfb94d29df6d'] = 'Qualité de votre catalogue en un clin d\'oeil'; +$_MODULE['<{statscheckup}prestashop>statscheckup_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration mise à jour'; +$_MODULE['<{statscheckup}prestashop>statscheckup_bae60998ffe4923b131e3d6e4c19993e'] = 'mauvais'; +$_MODULE['<{statscheckup}prestashop>statscheckup_6927a3a7218a3195858411433ec20a21'] = 'moyen'; +$_MODULE['<{statscheckup}prestashop>statscheckup_755f85c2723bb39381c7379a604160d8'] = 'bon'; +$_MODULE['<{statscheckup}prestashop>statscheckup_44fb451a35a1c382da79166dc8c78e43'] = 'Aucun produit trouvé'; +$_MODULE['<{statscheckup}prestashop>statscheckup_8bc84316c4078bf66723fd019616d920'] = 'Descriptions'; +$_MODULE['<{statscheckup}prestashop>statscheckup_5cd1930570823694abdd596f29c8943d'] = 'caractères (sans HTML)'; +$_MODULE['<{statscheckup}prestashop>statscheckup_fff0d600f8a0b5e19e88bfb821dd1157'] = 'Images'; +$_MODULE['<{statscheckup}prestashop>statscheckup_59b514174bffe4ae402b3d63aad79fe0'] = 'images'; +$_MODULE['<{statscheckup}prestashop>statscheckup_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventes'; +$_MODULE['<{statscheckup}prestashop>statscheckup_c3917e1f7138a24c6dc954fe81b86679'] = 'commandes / mois'; +$_MODULE['<{statscheckup}prestashop>statscheckup_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statscheckup}prestashop>statscheckup_691d502cfd0e0626cd3b058e5682ad1c'] = 'articles'; +$_MODULE['<{statscheckup}prestashop>statscheckup_dc270bcf468689b19074a5eef7581b52'] = 'Insuffisant'; +$_MODULE['<{statscheckup}prestashop>statscheckup_f4abc77d498c89880f67331609406774'] = 'Parfait'; +$_MODULE['<{statscheckup}prestashop>statscheckup_eb37cbc42e2338eec3de04db470d689a'] = 'inférieur à'; +$_MODULE['<{statscheckup}prestashop>statscheckup_bde3207d6920ce65500670d7eaf77af9'] = 'supérieur à'; +$_MODULE['<{statscheckup}prestashop>statscheckup_38fb7d24e0d60a048f540ecb18e13376'] = 'Sauvegarder'; +$_MODULE['<{statscheckup}prestashop>statscheckup_01fda57aa6c7e9f07f5aa36b108e95cb'] = 'Trier par'; +$_MODULE['<{statscheckup}prestashop>statscheckup_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscheckup}prestashop>statscheckup_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statscheckup}prestashop>statscheckup_7d74f3b92b19da5e606d737d339a9679'] = 'Article'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Actif'; +$_MODULE['<{statscheckup}prestashop>statscheckup_3f74e68055b1123e5d7deb32cd8b0b1b'] = 'Desc.'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4cc6684df7b4a92b1dec6fce3264fac8'] = 'Global'; diff --git a/modules/statscheckup/green.png b/modules/statscheckup/green.png new file mode 100644 index 0000000000000000000000000000000000000000..516bb0c462d026830e3fa08920cf78c0658379d7 GIT binary patch literal 776 zcmV+j1NZ!iP)e8uF6#5&YTM$I&3OabSOC)s7pi9RHtWc?gn(i9Au543-k*QfnO7Mwbf-iXEs~;e39g`^n9ji?cm_n#^-toC+vKby7pQ4*=-#ujw|8dpQ(TJ!wE+$!E}~#H3frg@9~U>izJK~_#?rl=s5icX zh)^e|2OizJpPM2k58mdX@e0y{8b`Dj*coRExcwkMaeZ#!F()Av^~QkCUL`kicX&>r z0tBB!N>JiBC(7s$6=+gB(vk`|A&f&Cmu_^=rhDaF0?>Mu%l$)I2JG1qFQSb_N{|^q zh0IHEeGh-FIx0pDd;12oPPs$vk*_2!q%vH;s>t9e2Z3<0x=r7KK^<5@3w7Iq={lfH zOfDo4B=(CLGLQgTF7*#;CK|K_KI9<_928MNn7W%TAA8OOJPSsZ0#!{Xr|(`lc`Mtm%sf8`eTohZWVwy{7@$5fMhs z2OE+>cx04NG8iX#T82!w>Sgbb)+u0rJ2v11aF+F7fB^tE0!yIhDXXOb0000statscheckup_e7a908d79d3758c911692ba791da9c70'] = 'Valutazione catalogo'; +$_MODULE['<{statscheckup}prestashop>statscheckup_24f870376156be0e8e22cfb94d29df6d'] = 'Qualità del catalogo a colpo d\'occhio'; +$_MODULE['<{statscheckup}prestashop>statscheckup_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{statscheckup}prestashop>statscheckup_bae60998ffe4923b131e3d6e4c19993e'] = 'mediocre'; +$_MODULE['<{statscheckup}prestashop>statscheckup_6927a3a7218a3195858411433ec20a21'] = 'medio'; +$_MODULE['<{statscheckup}prestashop>statscheckup_755f85c2723bb39381c7379a604160d8'] = 'buono'; +$_MODULE['<{statscheckup}prestashop>statscheckup_8bc84316c4078bf66723fd019616d920'] = 'Descrizioni'; +$_MODULE['<{statscheckup}prestashop>statscheckup_5cd1930570823694abdd596f29c8943d'] = 'caratteri (senza HTML)'; +$_MODULE['<{statscheckup}prestashop>statscheckup_fff0d600f8a0b5e19e88bfb821dd1157'] = 'Immagini'; +$_MODULE['<{statscheckup}prestashop>statscheckup_59b514174bffe4ae402b3d63aad79fe0'] = 'immagini'; +$_MODULE['<{statscheckup}prestashop>statscheckup_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{statscheckup}prestashop>statscheckup_c3917e1f7138a24c6dc954fe81b86679'] = 'ordini / mese'; +$_MODULE['<{statscheckup}prestashop>statscheckup_27ce7f8b5623b2e2df568d64cf051607'] = 'Magazzino'; +$_MODULE['<{statscheckup}prestashop>statscheckup_691d502cfd0e0626cd3b058e5682ad1c'] = 'articoli'; +$_MODULE['<{statscheckup}prestashop>statscheckup_dc270bcf468689b19074a5eef7581b52'] = 'Non abbastanza'; +$_MODULE['<{statscheckup}prestashop>statscheckup_f4abc77d498c89880f67331609406774'] = 'Perfetto'; +$_MODULE['<{statscheckup}prestashop>statscheckup_eb37cbc42e2338eec3de04db470d689a'] = 'inferiore a '; +$_MODULE['<{statscheckup}prestashop>statscheckup_bde3207d6920ce65500670d7eaf77af9'] = 'maggiore di'; +$_MODULE['<{statscheckup}prestashop>statscheckup_38fb7d24e0d60a048f540ecb18e13376'] = 'Salva'; +$_MODULE['<{statscheckup}prestashop>statscheckup_01fda57aa6c7e9f07f5aa36b108e95cb'] = 'Ordina per'; +$_MODULE['<{statscheckup}prestashop>statscheckup_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statscheckup}prestashop>statscheckup_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statscheckup}prestashop>statscheckup_7d74f3b92b19da5e606d737d339a9679'] = 'Articoloi'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Attivo'; +$_MODULE['<{statscheckup}prestashop>statscheckup_3f74e68055b1123e5d7deb32cd8b0b1b'] = 'Desc.'; +$_MODULE['<{statscheckup}prestashop>statscheckup_4cc6684df7b4a92b1dec6fce3264fac8'] = 'Globale'; + +?> \ No newline at end of file diff --git a/modules/statscheckup/logo.gif b/modules/statscheckup/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..78c325d64fbd56e88eaba5a5c08e8cfa91d5110a GIT binary patch literal 1025 zcmZ?wbhEHb6krfw_|52A(V|6*7cXA6Y}twx zD^{&qwR-jHHEY(aUAuPOx^?TmU4oj-s6;>C-XE?v5O z`SR7PSFc^WcK!PG8#iv;x^?UJ?b~Yg_BQ`!$o3~a$66de$u`V7Y;SG3bRdP`x&Twq+_y*O2mx~2U{39 zoEv^TXnfq-%`awD@?k@wOCzgG%aa3!%xvAfvP{V*6qF7;kajFOQgKj;nVnC}Ehm8C z;eBonnUXIP4jy{dA;8PGz(Q#QM<@@~~@tn6URk8w-bG LC3m`n0E0CEL8cAq literal 0 HcmV?d00001 diff --git a/modules/statscheckup/orange.png b/modules/statscheckup/orange.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2a20a89f60522a9527d9ee10e8d378e7e88e57 GIT binary patch literal 770 zcmV+d1O5DoP)py`5+nLOHg1w3DHA;K}1CM>K{-M)Jr}H^$LCHi|K6JuxFhV`gOxqsDB zGGuSD%TrIY&%Q1cZ+uBPpLZ1y$wGyK_6Ggf)I{gwfm3Z=Oh~b9R{*{0DNdnl3e;K+ zZ=Yw9BR7AHWH+5TA1m|W5RG0NYZ)IHZ0WKJ71+!LH2_7UzEL4r#w~4`fj*Hzpy&in*@3%iVl)vxA8*!s1A?Bo(%0A= zGAcs01VY}dS3!!xK`J)94HG<9gqbO#-cXF5gIZrOg#%GF2AzU4Pc%i;&baSWh_N^f z*b#Au`}c8DC2fn)SU^xTU7Pw=pPXx`R=T$AMSCK%B~dNRi4M#a@ zx#WnPlGC%sbCB^UlmlNs{0=!o(p-5;U?t=}jwR=2+@_USl`L3}YOSQF7hl zt{<#AVff*F)v0x2MRL|*5{?1JE?&v!o-UrBm>}H+h2N7D7{{Hn@{X0 zDs*s?U=bBqjEyf(oqKcl^7L%0*Fd1EL~zI-M^J+Ry6586xAo7DHj4B6QM4tnvbfg) zDy;V7eGOA zPY=`+CQ?=wx|M^T%|Xi@Sgz}EWf`}I`xgc^ZK_K!s;hHnEYt8)Dp)!VMo&;p6Ka1R znq^TdQV1I!ylM@$-J*HB^*WqG72hq-Y41XbV&3lTu0(|C zE>bU*$${P(BmMZng^7oksQZ$pBax)ewjrS>Y}htd3Z><*Zu1#s_B^qKolO*CN|H8~ z))r^XzI)dOa#wSjt_Xjn)rwc`%EvF&+Vjn(|FWL6H^2Qa93dD>F;t=$!%R6H%km_b xNYJ85Wg-9o002ovPDHLkV1nnhW+wmu literal 0 HcmV?d00001 diff --git a/modules/statscheckup/statscheckup.php b/modules/statscheckup/statscheckup.php new file mode 100644 index 000000000..3ce88406f --- /dev/null +++ b/modules/statscheckup/statscheckup.php @@ -0,0 +1,299 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7060 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsCheckUp extends Module +{ + function __construct() + { + $this->name = 'statscheckup'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Catalog evaluation'); + $this->description = $this->l('Quick evaluation of your catalog quality.'); + } + + public function install() + { + foreach (array('CHECKUP_DESCRIPTIONS_LT'=>100,'CHECKUP_DESCRIPTIONS_GT'=>400,'CHECKUP_IMAGES_LT'=>1,'CHECKUP_IMAGES_GT'=>2,'CHECKUP_SALES_LT'=>1,'CHECKUP_SALES_GT'=>2,'CHECKUP_STOCK_LT'=>1,'CHECKUP_STOCK_GT'=>3) as $confname => $confdefault) + if (!Configuration::get($confname)) + Configuration::updateValue($confname, (int)$confdefault); + return (parent::install() && $this->registerHook('AdminStatsModules')); + } + + function hookAdminStatsModules() + { + global $cookie, $currentIndex; + + if (Tools::isSubmit('submitCheckup')) + { + foreach (array('CHECKUP_DESCRIPTIONS_LT','CHECKUP_DESCRIPTIONS_GT','CHECKUP_IMAGES_LT','CHECKUP_IMAGES_GT','CHECKUP_SALES_LT','CHECKUP_SALES_GT','CHECKUP_STOCK_LT','CHECKUP_STOCK_GT') as $confname) + Configuration::updateValue($confname, (int)Tools::getValue($confname)); + echo '
    '.$this->l('Configuration updated').'
    '; + } + + if (Tools::isSubmit('submitCheckupOrder')) + { + $cookie->checkup_order = (int)Tools::getValue('submitCheckupOrder'); + echo '
    '.$this->l('Configuration updated').'
    '; + } + + if (!isset($cookie->checkup_order)) + $cookie->checkup_order = 1; + + $db = Db::getInstance(_PS_USE_SQL_SLAVE_); + $employee = new Employee((int)($cookie->id_employee)); + $prop30 = ((strtotime($employee->stats_date_to.' 23:59:59') - strtotime($employee->stats_date_from.' 00:00:00')) / 60 / 60 / 24) / 30; + + // Get languages + $sql = 'SELECT l.* + FROM '._DB_PREFIX_.'lang l'; + if ($this->shopID || $this->shopGroupID) + { + $sql .= ' LEFT JOIN '._DB_PREFIX_.'lang_shop ls ON ls.id_lang = l.id_lang'; + if ($this->shopID) + $sql .= ' WHERE ls.id_shop = ' . $this->shopID; + else if ($this->shopGroupID) + $sql .= ' WHERE ls.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.')'; + } + $languages = $db->ExecuteS($sql); + + $arrayColors = array( + 0 => ''.$this->l('bad').'', + 1 => ''.$this->l('average').'', + 2 => ''.$this->l('good').'' + ); + $tokenProducts = Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee)); + $divisor = 4; + $totals = array('products' => 0, 'active' => 0, 'images' => 0, 'sales' => 0, 'stock' => 0); + foreach ($languages as $language) + { + $divisor++; + $totals['description_'.$language['iso_code']] = 0; + } + + $orderBy = 'p.id_product'; + if ($cookie->checkup_order == 2) + $orderBy = 'pl.name'; + elseif ($cookie->checkup_order == 3) + $orderBy = 'nbSales DESC'; + + // Generate SQL restrictions for products stats per shop + $joinProduct = $joinImage = $whereProduct = $whereImage = $whereOrder = ''; + if ($this->shopID || $this->shopGroupID) + { + $joinProduct = ' LEFT JOIN '._DB_PREFIX_.'product_shop ps ON ps.id_product = p.id_product '; + $joinImage = ' LEFT JOIN '._DB_PREFIX_.'image_shop ishop ON ishop.id_image = i.id_image '; + if ($this->shopID) + { + $whereProduct = ' WHERE ps.id_shop = '.$this->shopID; + $whereImage = ' AND ishop.id_shop = '.$this->shopID; + $whereOrder = ' AND o.id_shop = '.$this->shopID; + } + else if ($this->shopGroupID) + { + $whereProduct = ' WHERE ps.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.')'; + $whereImage = ' AND ishop.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.')'; + $whereOrder = ' AND o.id_group_shop = '.$this->shopGroupID; + } + } + + // Get products stats + $sql = 'SELECT p.id_product, p.active, pl.name, ( + SELECT COUNT(*) + FROM '._DB_PREFIX_.'image i + '.$joinImage.' + WHERE i.id_product = p.id_product + '.$whereImage.' + ) as nbImages, ( + SELECT SUM(od.product_quantity) + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'order_detail od ON o.id_order = od.id_order + WHERE od.product_id = p.id_product + AND o.invoice_date BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereOrder.' + ) as nbSales, IFNULL(( + SELECT SUM(pa.quantity) + FROM '._DB_PREFIX_.'product_attribute pa + WHERE pa.id_product = p.id_product + ), p.quantity) as stock + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_lang = '.(int)$cookie->id_lang.') + '.$joinProduct.' + '.$whereProduct.' + ORDER BY '.$orderBy; + $result = $db->ExecuteS($sql); + + if (!$result) + return $this->l('No product found'); + + $arrayConf = array( + 'DESCRIPTIONS' => array('name' => $this->l('Descriptions'), 'text' => $this->l('chars (without HTML)')), + 'IMAGES' => array('name' => $this->l('Images'), 'text' => $this->l('images')), + 'SALES' => array('name' => $this->l('Sales'), 'text' => $this->l('orders / month')), + 'STOCK' => array('name' => $this->l('Stock'), 'text' => $this->l('items')) + ); + + $html = ' + +
    + + '; + foreach ($arrayConf as $conf => $translations) + $html .= ' + + '; + $html .= '
    '.$arrayColors[0].' '.$this->l('Not enough').''.$arrayColors[2].' '.$this->l('Alright').'
    '.$translations['name'].''.$this->l('lower than').' '.$translations['text'].' + '.$this->l('greater than').' '.$translations['text'].' +
    +
    +
    +
     
    +
    + '.$this->l('Order by').' + +
    +
     
    + + + + + '; + foreach ($languages as $language) + $html .= ''; + $html .= ' + + + + + '; + foreach ($result as $row) + { + $totals['products']++; + $scores = array( + 'active' => ($row['active'] ? 2 : 0), + 'images' => ($row['nbImages'] < Configuration::get('CHECKUP_IMAGES_LT') ? 0 : ($row['nbImages'] > Configuration::get('CHECKUP_IMAGES_GT') ? 2 : 1)), + 'sales' => (($row['nbSales'] * $prop30 < Configuration::get('CHECKUP_SALES_LT')) ? 0 : (($row['nbSales'] * $prop30 > Configuration::get('CHECKUP_SALES_GT')) ? 2 : 1)), + 'stock' => (($row['stock'] < Configuration::get('CHECKUP_STOCK_LT')) ? 0 : (($row['stock'] > Configuration::get('CHECKUP_STOCK_GT')) ? 2 : 1)), + ); + $totals['active'] += (int)$scores['active']; + $totals['images'] += (int)$scores['images']; + $totals['sales'] += (int)$scores['sales']; + $totals['stock'] += (int)$scores['stock']; + $descriptions = $db->ExecuteS('SELECT iso_code, description FROM '._DB_PREFIX_.'product_lang pl LEFT JOIN '._DB_PREFIX_.'lang l ON pl.id_lang = l.id_lang WHERE id_product = '.(int)$row['id_product']); + foreach ($descriptions as $description) + { + $row['desclength_'.$description['iso_code']] = Tools::strlen(strip_tags($description['description'])); + $scores['description_'.$description['iso_code']] = ($row['desclength_'.$description['iso_code']] < Configuration::get('CHECKUP_DESCRIPTIONS_LT') ? 0 : ($row['desclength_'.$description['iso_code']] > Configuration::get('CHECKUP_DESCRIPTIONS_GT') ? 2 : 1)); + $totals['description_'.$description['iso_code']] += $scores['description_'.$description['iso_code']]; + } + $scores['average'] = array_sum($scores) / $divisor; + $scores['average'] = ($scores['average'] < 1 ? 0 : ($scores['average'] > 1.5 ? 2 : 1)); + + $html .= ' + + + '; + foreach ($languages as $language) + if (isset($row['desclength_'.$language['iso_code']])) + $html .= ''; + else + $html .= ''; + $html .= ' + + + + + '; + } + + $totals['active'] = $totals['active'] / $totals['products']; + $totals['active'] = ($totals['active'] < 1 ? 0 : ($totals['active'] > 1.5 ? 2 : 1)); + $totals['images'] = $totals['images'] / $totals['products']; + $totals['images'] = ($totals['images'] < 1 ? 0 : ($totals['images'] > 1.5 ? 2 : 1)); + $totals['sales'] = $totals['sales'] / $totals['products']; + $totals['sales'] = ($totals['sales'] < 1 ? 0 : ($totals['sales'] > 1.5 ? 2 : 1)); + $totals['stock'] = $totals['stock'] / $totals['products']; + $totals['stock'] = ($totals['stock'] < 1 ? 0 : ($totals['stock'] > 1.5 ? 2 : 1)); + foreach ($languages as $language) + { + $totals['description_'.$language['iso_code']] = $totals['description_'.$language['iso_code']] / $totals['products']; + $totals['description_'.$language['iso_code']] = ($totals['description_'.$language['iso_code']] < 1 ? 0 : ($totals['description_'.$language['iso_code']] > 1.5 ? 2 : 1)); + } + $totals['average'] = array_sum($totals) / $divisor; + $totals['average'] = ($totals['average'] < 1 ? 0 : ($totals['average'] > 1.5 ? 2 : 1)); + + $html .= ' + + + '; + foreach ($languages as $language) + $html .= ''; + $html .= ' + + + + + + + + '; + foreach ($languages as $language) + $html .= ''; + $html .= ' + + + + + +
    '.$this->l('ID').''.$this->l('Item').''.$this->l('Active').''.$this->l('Desc.').' ('.strtoupper($language['iso_code']).')'.$this->l('Images').''.$this->l('Sales').''.$this->l('Stock').''.$this->l('Global').'
    '.$row['id_product'].''.Tools::substr($row['name'], 0, 42).''.$arrayColors[$scores['active']].''.(int)$row['desclength_'.$language['iso_code']].' '.$arrayColors[$scores['description_'.$language['iso_code']]].'0 '.$arrayColors[0].''.(int)$row['nbImages'].' '.$arrayColors[$scores['images']].''.(int)$row['nbSales'].' '.$arrayColors[$scores['sales']].''.(int)$row['stock'].' '.$arrayColors[$scores['stock']].''.$arrayColors[$scores['average']].'
    '.$this->l('Active').''.$this->l('Desc.').' ('.strtoupper($language['iso_code']).')'.$this->l('Images').''.$this->l('Sales').''.$this->l('Stock').''.$this->l('Global').'
    '.$arrayColors[$totals['active']].''.$arrayColors[$totals['description_'.$language['iso_code']]].''.$arrayColors[$totals['images']].''.$arrayColors[$totals['sales']].''.$arrayColors[$totals['stock']].''.$arrayColors[$totals['average']].'
    +
     
    + '; + + return $html; + } +} \ No newline at end of file diff --git a/modules/statsdata/config.xml b/modules/statsdata/config.xml new file mode 100644 index 000000000..1393d3b7f --- /dev/null +++ b/modules/statsdata/config.xml @@ -0,0 +1,12 @@ + + + statsdata + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/statsdata/de.php b/modules/statsdata/de.php new file mode 100644 index 000000000..68aa82b77 --- /dev/null +++ b/modules/statsdata/de.php @@ -0,0 +1,19 @@ +statsdata_a51950bf91ba55cd93a33ce3f8d448c2'] = 'Data Mining für die Statistik'; +$_MODULE['<{statsdata}prestashop>statsdata_974ccf59b041ae66afa975f609368573'] = 'Dieses Modul muss aktiviert sein, wenn Sie die Statistiken verwenden möchten'; +$_MODULE['<{statsdata}prestashop>statsdata_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Konfiguration aktualisiert'; +$_MODULE['<{statsdata}prestashop>statsdata_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{statsdata}prestashop>statsdata_1a5b75c4be3c0100c99764b21e844cc8'] = 'Speichern Sie die Seitenaufrufe für jeden Kunden'; +$_MODULE['<{statsdata}prestashop>statsdata_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{statsdata}prestashop>statsdata_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Nein'; +$_MODULE['<{statsdata}prestashop>statsdata_1ef5adaa7eef1a44e4cb6ce3fb61f5f5'] = 'Seitenaufrufe von Kunden verbrauchen viele CPU-Ressourcen und Datenbank-Speicherplatz.'; +$_MODULE['<{statsdata}prestashop>statsdata_dd8289e220ec0de9a8b99adc7f9014b1'] = 'Gesamtseitenaufrufe speichern'; +$_MODULE['<{statsdata}prestashop>statsdata_6511e0043f774246017a4c255e1e10c3'] = 'Gesamtseitenaufrufe verbrauchen ebenfalls CPU-Ressourcen, aber weniger '; +$_MODULE['<{statsdata}prestashop>statsdata_48f08588e7f264b5ea1e7ea56ed768f6'] = 'Plug-Ins Erkennung'; +$_MODULE['<{statsdata}prestashop>statsdata_54e5f8bdd6c51a73d79ed702cdc9ac05'] = 'Die Plug-Ins Erkennung lädte ein zusätzliche 20kb JavaScript-Datei für neue Besucher.'; +$_MODULE['<{statsdata}prestashop>statsdata_06933067aafd48425d67bcb01bba5cb6'] = 'Aktualisieren'; + +?> \ No newline at end of file diff --git a/modules/statsdata/en.php b/modules/statsdata/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsdata/en.php @@ -0,0 +1,4 @@ +statsdata_a51950bf91ba55cd93a33ce3f8d448c2'] = 'Explotación de datos para las estadísticas'; +$_MODULE['<{statsdata}prestashop>statsdata_974ccf59b041ae66afa975f609368573'] = 'Este módulo debe estar activado si usted quiere utilizar las estadísticas'; +$_MODULE['<{statsdata}prestashop>statsdata_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuración actualizada'; +$_MODULE['<{statsdata}prestashop>statsdata_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{statsdata}prestashop>statsdata_1a5b75c4be3c0100c99764b21e844cc8'] = 'Guardar las páginas vistas por cada cliente'; +$_MODULE['<{statsdata}prestashop>statsdata_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{statsdata}prestashop>statsdata_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{statsdata}prestashop>statsdata_1ef5adaa7eef1a44e4cb6ce3fb61f5f5'] = 'Las páginas vistas de los clientes consumen muchos recursos de procesador y espacio en la base de datos. '; +$_MODULE['<{statsdata}prestashop>statsdata_dd8289e220ec0de9a8b99adc7f9014b1'] = 'Guardar las páginas vistas globales'; +$_MODULE['<{statsdata}prestashop>statsdata_6511e0043f774246017a4c255e1e10c3'] = 'Las páginas vistas necesitan menos recursos que el detalle por cliente, pero siguen necesitando bastantes.'; +$_MODULE['<{statsdata}prestashop>statsdata_48f08588e7f264b5ea1e7ea56ed768f6'] = 'Detección de plug-ins'; +$_MODULE['<{statsdata}prestashop>statsdata_54e5f8bdd6c51a73d79ed702cdc9ac05'] = 'La detección de los plug-ins carga un archivo javascript de 20 ko suplementario para los nuevos visitantes.'; +$_MODULE['<{statsdata}prestashop>statsdata_06933067aafd48425d67bcb01bba5cb6'] = 'Actualizar'; diff --git a/modules/statsdata/fr.php b/modules/statsdata/fr.php new file mode 100644 index 000000000..52c27a77c --- /dev/null +++ b/modules/statsdata/fr.php @@ -0,0 +1,17 @@ +statsdata_a51950bf91ba55cd93a33ce3f8d448c2'] = 'Récupération des données statistiques'; +$_MODULE['<{statsdata}prestashop>statsdata_974ccf59b041ae66afa975f609368573'] = 'Ce module doit être activé pour bénéficier des statistiques'; +$_MODULE['<{statsdata}prestashop>statsdata_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configuration mise à jour'; +$_MODULE['<{statsdata}prestashop>statsdata_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{statsdata}prestashop>statsdata_1a5b75c4be3c0100c99764b21e844cc8'] = 'Enregistrer les pages vues pour chaque client'; +$_MODULE['<{statsdata}prestashop>statsdata_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{statsdata}prestashop>statsdata_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{statsdata}prestashop>statsdata_1ef5adaa7eef1a44e4cb6ce3fb61f5f5'] = 'Les pages vues des clients consomment beaucoup de ressources processeur et d\'espace en base de données.'; +$_MODULE['<{statsdata}prestashop>statsdata_dd8289e220ec0de9a8b99adc7f9014b1'] = 'Enregistrer les pages vues globales'; +$_MODULE['<{statsdata}prestashop>statsdata_6511e0043f774246017a4c255e1e10c3'] = 'Les pages vues nécessitent moins de ressources que le détail par client, mais en nécessitent néanmoins pas mal.'; +$_MODULE['<{statsdata}prestashop>statsdata_48f08588e7f264b5ea1e7ea56ed768f6'] = 'Détection des plug-ins'; +$_MODULE['<{statsdata}prestashop>statsdata_54e5f8bdd6c51a73d79ed702cdc9ac05'] = 'La détection des plug-ins charge un fichier javascript de 20ko supplémentaire pour les nouveaux visiteurs.'; +$_MODULE['<{statsdata}prestashop>statsdata_06933067aafd48425d67bcb01bba5cb6'] = 'Mettre à jour'; diff --git a/modules/statsdata/it.php b/modules/statsdata/it.php new file mode 100644 index 000000000..1b1de0b2f --- /dev/null +++ b/modules/statsdata/it.php @@ -0,0 +1,19 @@ +statsdata_a51950bf91ba55cd93a33ce3f8d448c2'] = 'Recupero dati per statistiche'; +$_MODULE['<{statsdata}prestashop>statsdata_974ccf59b041ae66afa975f609368573'] = 'Questo modulo deve essere attivato se si desidera utilizzare le statistiche'; +$_MODULE['<{statsdata}prestashop>statsdata_20015706a8cbd457cbb6ea3e7d5dc9b3'] = 'Configurazione aggiornata'; +$_MODULE['<{statsdata}prestashop>statsdata_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{statsdata}prestashop>statsdata_1a5b75c4be3c0100c99764b21e844cc8'] = 'Salvare le pagine viste per ogni cliente'; +$_MODULE['<{statsdata}prestashop>statsdata_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{statsdata}prestashop>statsdata_bafd7322c6e97d25b6299b5d6fe8920b'] = 'No'; +$_MODULE['<{statsdata}prestashop>statsdata_1ef5adaa7eef1a44e4cb6ce3fb61f5f5'] = 'Le pagine viste dal cliente utilizzano molte risorse CPU e di spazio database.'; +$_MODULE['<{statsdata}prestashop>statsdata_dd8289e220ec0de9a8b99adc7f9014b1'] = 'Salva pagine globali viste'; +$_MODULE['<{statsdata}prestashop>statsdata_6511e0043f774246017a4c255e1e10c3'] = 'Le pagine viste utilizzano meno risorse rispetto al cliente, ma utilizzano comunque le risorse'; +$_MODULE['<{statsdata}prestashop>statsdata_48f08588e7f264b5ea1e7ea56ed768f6'] = 'Individuazione dei plug-in'; +$_MODULE['<{statsdata}prestashop>statsdata_54e5f8bdd6c51a73d79ed702cdc9ac05'] = 'L\'individuazione dei plug-in carica un ulteriore file javascript di 20kb per i nuovi visitatori'; +$_MODULE['<{statsdata}prestashop>statsdata_06933067aafd48425d67bcb01bba5cb6'] = 'Aggiornamento'; + +?> \ No newline at end of file diff --git a/modules/statsdata/logo.gif b/modules/statsdata/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6103b8a96576afff36c2085582027d44fe40181 GIT binary patch literal 1044 zcmeHG>rYYv9KAYwnJ#*lZH0@q)~wOi*2C4zP^_(5MvJXk=~h!`ro%F)NfhL}d~BJn zEFKk!GbBT%P6@&baX~at5Uv9hL>vzVg?M<={)9evc6N5YoSp6W+rghtJ#jJ<1)u;Q zu!#Kkw8**)J4%HHz$-U-{MJ_i85c>I^yciu@)hzgb=QT19FZA+@R>w5p2RbR};z zrETg*ZQ7D|`qDRW!An!gdtE8rP{!0hW=@uWfT@F5RtjIs?zhMa>2x}a#bUGB?d|Ox z4yU7|qqDP<%jNQTyzcI9KA+#y(<2ZFdV72O`uh6&`v(RFp0dWCe1vHXn8t=FpG=fb z=GrgQjo+-ze0wY3)grLd2UqB76S}^FQ@u(TSK$Gj6`-?r+{+kWVhDvokw_#KizN~X z2!c|nR4$i85TsNphlht%D%Hry$mr;(TCLV-G-G39TCG;6)9LkkgTVm9@Z{tqg1|gMB*3SdTh8U&<|1#lL)FFa2rS@%d6UI`~v_>u>-!u|< zKf0JqY{ri0%4ctyAKj7F18+zeNQwC3mX`iO%GAk&xWA5b(hg8 z4BYHy%>H#nP{O%X1@*w;%8s-K2CgdV +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsData extends Module +{ + public function __construct() + { + $this->name = 'statsdata'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Data mining for statistics'); + $this->description = $this->l('This module must be enabled if you want to use Statistics.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('footer') AND $this->registerHook('authentication') AND $this->registerHook('createAccount')); + } + + public function getContent() + { + if (Tools::isSubmit('submitStatsData')) + { + Configuration::updateValue('PS_STATSDATA_CUSTOMER_PAGESVIEWS', (int)Tools::getValue('PS_STATSDATA_CUSTOMER_PAGESVIEWS')); + Configuration::updateValue('PS_STATSDATA_PAGESVIEWS', (int)Tools::getValue('PS_STATSDATA_PAGESVIEWS')); + Configuration::updateValue('PS_STATSDATA_PLUGINS', (int)Tools::getValue('PS_STATSDATA_PLUGINS')); + echo '
    '.$this->l('Configuration updated').'
    '; + } + + return '
    +
    '.$this->l('Settings').' + +
    + + + + +

    '.$this->l('Customer page views uses a lot of CPU resources and database space.').'

    +
    +
     
    + +
    + + + + +

    '.$this->l('Global page views uses less resources than customer\'s, but uses resources nonetheless.').'

    +
    +
     
    + +
    + + + + +

    '.$this->l('Plug-ins detection loads an extra 20kb javascript file for new visitors.').'

    +
    +
     
    + +
    '; + } + + public function hookFooter($params) + { + $html = ''; + if (!isset($params['cookie']->id_guest)) + { + Guest::setNewGuest($params['cookie']); + + if (Configuration::get('PS_STATSDATA_PLUGINS')) + { + // Ajax request sending browser information + $token = sha1($params['cookie']->id_guest._COOKIE_KEY_); + $html .= ' + + '; + } + } + + // Record the guest path then increment the visit counter of the page + $tokenArray = Connection::setPageConnection($params['cookie']); + ConnectionsSource::logHttpReferer(); + if (Configuration::get('PS_STATSDATA_PAGESVIEWS')) + Page::setPageViewed($tokenArray['id_page']); + + if (Configuration::get('PS_STATSDATA_CUSTOMER_PAGESVIEWS')) + { + // Ajax request sending the time spend on the page + $token = sha1($tokenArray['id_connections'].$tokenArray['id_page'].$tokenArray['time_start']._COOKIE_KEY_); + $html .= ' + '; + } + + return $html; + } + + public function hookCreateAccount($params) + { + return $this->hookAuthentication($params); + } + + public function hookAuthentication($params) + { + // Update or merge the guest with the customer id (login and account creation) + $guest = new Guest($params['cookie']->id_guest); + $result = Db::getInstance()->getRow(' + SELECT `id_guest` + FROM `'._DB_PREFIX_.'guest` + WHERE `id_customer` = '.(int)($params['cookie']->id_customer)); + + if ((int)($result['id_guest'])) + { + // The new guest is merged with the old one when it's connecting to an account + $guest->mergeWithCustomer($result['id_guest'], $params['cookie']->id_customer); + $params['cookie']->id_guest = $guest->id; + } + else + { + // The guest is duplicated if it has multiple customer accounts + $method = ($guest->id_customer) ? 'add' : 'update'; + $guest->id_customer = $params['cookie']->id_customer; + $guest->{$method}(); + } + } +} + + diff --git a/modules/statsequipment/config.xml b/modules/statsequipment/config.xml new file mode 100755 index 000000000..96be54b23 --- /dev/null +++ b/modules/statsequipment/config.xml @@ -0,0 +1,12 @@ + + + statsequipment + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsequipment/de.php b/modules/statsequipment/de.php new file mode 100644 index 000000000..1d6b5faa9 --- /dev/null +++ b/modules/statsequipment/de.php @@ -0,0 +1,17 @@ +statsequipment_719d067b229178f03bcfa1da4ac4dede'] = 'Software'; +$_MODULE['<{statsequipment}prestashop>statsequipment_a7b3ac03f9e0f1dabad82e41f6cfed37'] = 'Anzeige der von Ihren Besuchern benutzten Software'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dcbcd22b719ba36dad1330178c6bf761'] = 'Bestimmen Sie den Web-Browser-Prozentsatz, den Ihr Kunden nutzt.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dc29a12c359732b223367cb61df2196d'] = 'Bestimmen Sie den Prozentsatz der Betriebssysteme, die Ihre Kunden nutzen.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_575e3c9cac82aacd649b1196d845588a'] = 'Plug-ins'; +$_MODULE['<{statsequipment}prestashop>statsequipment_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statsequipment}prestashop>statsequipment_501361472d0528ee07f202297f599d40'] = 'Stellen Sie sicher, dass Ihre Webseite für alle zugänglich ist '; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ebe1665d646cc99d4a80835d1734cad'] = 'Bei der Webseitenverwaltung ist es wichtig, die vom Kunden genutzte Software im Auge zu behalten, um sicher zu gehen, dass die Webseite allen das Gleiche anzeigt. PrestaShop wurde so konzipiert, dass es mit den meisten neueren Webbrowsern und Betriebssystemen kompatibel ist. Falls Sie schließlich jedoch Ihren Webbrowser durch fortgeschrittene Funktionen erweitern oder sogar den PrestaShop Core Code verändern, können diese Zusätze nicht für alle zugänglich sein. Daher ist es angeraten, Tabs auf dem Prozentsatz der Kunden für jede Software-Art zu behalten, bevor Sie etwas hinzufügen oder ändern, was nur einer begrenzten Zahl an Benutzern zugänglich ist.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ce59076ab4eaa3570ff2a931706d3c1'] = 'Web-Browser-Benutzung'; +$_MODULE['<{statsequipment}prestashop>statsequipment_eb84ea9e8324beffd94fdeff011edfd7'] = 'Betriebssystem-Benutzung'; + +?> \ No newline at end of file diff --git a/modules/statsequipment/en.php b/modules/statsequipment/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsequipment/en.php @@ -0,0 +1,4 @@ +statsequipment_719d067b229178f03bcfa1da4ac4dede'] = 'Software'; +$_MODULE['<{statsequipment}prestashop>statsequipment_a7b3ac03f9e0f1dabad82e41f6cfed37'] = 'Mostrar el Software utilizado por sus visitantes'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dcbcd22b719ba36dad1330178c6bf761'] = 'Determine la repartición de los buscadores que utilizan sus clientes'; +$_MODULE['<{statsequipment}prestashop>statsequipment_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dc29a12c359732b223367cb61df2196d'] = 'Determine la repartición de los sistemas operativo que utilizan sus clientes'; +$_MODULE['<{statsequipment}prestashop>statsequipment_575e3c9cac82aacd649b1196d845588a'] = 'Plug-ins'; +$_MODULE['<{statsequipment}prestashop>statsequipment_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsequipment}prestashop>statsequipment_501361472d0528ee07f202297f599d40'] = 'Asegúrese de que su sitio Web sea accesible a todos'; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ebe1665d646cc99d4a80835d1734cad'] = 'Cuando se administran sitios web, es importante no perder de vista el software utilizado por los visitantes con el fin de asegurarse de que el sitio se muestra de manera idéntica para cada uno. PrestaShop fue creado para ser compatible con la mayoría de los buscadores recientes y de los sistemas operativos de ordenadores (OS) de la red. Sin embargo, puesto que usted puede terminar agregando características avanzadas a su sitio Web o incluso modificar el código de base de PrestaShop, estas adiciones pueden no ser accesibles para todos. Por esa razón es una buena idea guardar en pestañas una relación del porcentaje de usuarios para cada tipo de software antes de hacer algún cambio al que sólo podrá acceder un número limitado de usuarios. '; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ce59076ab4eaa3570ff2a931706d3c1'] = 'Buscador utilizado'; +$_MODULE['<{statsequipment}prestashop>statsequipment_eb84ea9e8324beffd94fdeff011edfd7'] = 'Sistema operativo utilizado'; diff --git a/modules/statsequipment/fr.php b/modules/statsequipment/fr.php new file mode 100644 index 000000000..9bb9c4a58 --- /dev/null +++ b/modules/statsequipment/fr.php @@ -0,0 +1,15 @@ +statsequipment_719d067b229178f03bcfa1da4ac4dede'] = 'Equipement'; +$_MODULE['<{statsequipment}prestashop>statsequipment_a7b3ac03f9e0f1dabad82e41f6cfed37'] = 'Affiche l\'équipement de vos visiteurs'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dcbcd22b719ba36dad1330178c6bf761'] = 'Déterminez la répartition des navigateurs web utilisés par vos clients'; +$_MODULE['<{statsequipment}prestashop>statsequipment_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dc29a12c359732b223367cb61df2196d'] = 'Déterminez la répartition des systèmes d\'exploitation utilisés par vos clients'; +$_MODULE['<{statsequipment}prestashop>statsequipment_575e3c9cac82aacd649b1196d845588a'] = 'Extensions'; +$_MODULE['<{statsequipment}prestashop>statsequipment_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsequipment}prestashop>statsequipment_501361472d0528ee07f202297f599d40'] = 'Veillez à ce que votre site soit accessible à tous'; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ebe1665d646cc99d4a80835d1734cad'] = 'Lorsque l\'on gère des sites web, il est important de garder une trace des logiciels utilisés par les visiteurs afin de s\'assurer que le site s\'affiche de la même façon pour tout le monde. Et PrestaShop a été construit de manière à être compatible avec la plupart des navigateurs Web récents et les systèmes d\'exploitation. Toutefois, dans le cas où vous auriez ajouté des fonctionnalités avancées à votre site Web ou même modifié le code de base PrestaShop, ces ajouts pourraient ne pas être accessibles par tous. C\'est pourquoi il est bon de contrôler le pourcentage de visiteurs pour chaque système avant de songer à ajouter ce type de fonctionnalités trop spécifiques.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ce59076ab4eaa3570ff2a931706d3c1'] = 'Navigateurs utilisés'; +$_MODULE['<{statsequipment}prestashop>statsequipment_eb84ea9e8324beffd94fdeff011edfd7'] = 'Systèmes d\'exploitation utilisés'; diff --git a/modules/statsequipment/it.php b/modules/statsequipment/it.php new file mode 100644 index 000000000..719f3327c --- /dev/null +++ b/modules/statsequipment/it.php @@ -0,0 +1,17 @@ +statsequipment_719d067b229178f03bcfa1da4ac4dede'] = 'Software'; +$_MODULE['<{statsequipment}prestashop>statsequipment_a7b3ac03f9e0f1dabad82e41f6cfed37'] = 'Visualizza il software utilizzato dai visitatori'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dcbcd22b719ba36dad1330178c6bf761'] = 'Determina la percentuale di browser utilizzati dai tuoi clienti.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsequipment}prestashop>statsequipment_dc29a12c359732b223367cb61df2196d'] = 'Determina la percentuale di sistemi operativi usati dai tuoi clienti.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_575e3c9cac82aacd649b1196d845588a'] = 'Plug-in'; +$_MODULE['<{statsequipment}prestashop>statsequipment_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsequipment}prestashop>statsequipment_501361472d0528ee07f202297f599d40'] = 'Assicuratevi che il tuo sito web sia accessibile a tutti'; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ebe1665d646cc99d4a80835d1734cad'] = 'Nella gestione dei siti web, è importante tenere traccia dei software utilizzati dai visitatori, al fine di essere sicuri che il sito sia visualizzato allo stesso modo da tutti, per questo PrestaShop è stato costruito in modo da essere compatibile con la maggior parte dei browser e recenti sistemi operativi (OS). Tuttavia, siccome potrà capitare che tu aggiunga funzionalità avanzate al tuo sito web o modifichi il codice di base PrestaShop, tali aggiunte possono non essere accessibili a tutti. Ecco perché è una buona idea tenere sotto controllo la percentuale di utenti per ogni tipo di software prima di aggiungere o modificare qualcosa a cui potrà accedere solo un numero limitato di utenti.'; +$_MODULE['<{statsequipment}prestashop>statsequipment_8ce59076ab4eaa3570ff2a931706d3c1'] = 'Uso del browser'; +$_MODULE['<{statsequipment}prestashop>statsequipment_eb84ea9e8324beffd94fdeff011edfd7'] = 'Uso del sistema operativo'; + +?> \ No newline at end of file diff --git a/modules/statsequipment/logo.gif b/modules/statsequipment/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..98323f9a9258b24d93e7d70d08b16e42f5f5fa81 GIT binary patch literal 1030 zcmZ?wbhEHb6krfw_|5(b2K7v5AR^$;rv7sj2Dd=@}UrSy@@x z+1WWcIk~yH`T6+;1qDS#Ma9L%B_$=LrKM$MWfc__m6eq>H8r)hwRLrM_4V~(86A;1 zJ+Va-5=$l~mP}19pPErKE3a{WNyoDCu2pgCJ|(UHl(g=1^7=1{>%XRL_>{KcbJ~V4 zsT;ngZ1|S3@pIOu&lwxPWNrGAx#?@>rf)f$zvONKqOXNpzZ7i!TCnw7@wP7o+rE}; z|5m)?TltPJWjnrB>;$53RlC2}?)h4~=Ue^0?=Nj^8X6i}T3XuL+B!QsTW4->owcKD z{{Ftj2b%VOZ`%K({m}QeLq9qX|L8gLqwm;{{^P$U9RD@(#E(fQeoZ;~YwD?=Q&0V# zapw2Dv%lt^`#t}{?}ZnBExq(-<&{6Hul-qj?a#&=f41HJ0}l03Vo-#D;!hSv28RC( zIw048@&p6NV}}2Kxs}}(I5wN6$jC$#DDp~hvo`%KDmd2N!IpnRK;p2gi?Ev46orRJ zy~Xtu>?$4jRyqE-dsowUUo`E)wAo*jf)No z*sY51ZLn-sJteH_*6=1lA>gpIY3hldjY3O1Cn-Bt=m`91^k&l))5@8-LG{oyb}1o_ qI~SZ>xr9|*8X{IIGPAKTX__Q#aA0g=X5|u)P;hW)sAptkum%922Py>s literal 0 HcmV?d00001 diff --git a/modules/statsequipment/statsequipment.php b/modules/statsequipment/statsequipment.php new file mode 100644 index 000000000..3aa3cf462 --- /dev/null +++ b/modules/statsequipment/statsequipment.php @@ -0,0 +1,183 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsEquipment extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + + function __construct() + { + $this->name = 'statsequipment'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Software'); + $this->description = $this->l('Display the software used by your visitors.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + /** + * @return array Get list of browser "plugins" (javascript, media player, etc.) + */ + private function getEquipment() + { + $sql = 'SELECT DISTINCT g.* + FROM `'._DB_PREFIX_.'connections` c + LEFT JOIN `'._DB_PREFIX_.'guest` g ON g.`id_guest` = c.`id_guest` + WHERE c.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(false, 'c'); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql, false); + + $calcArray = array('jsOK' => 0, 'jsKO' => 0, 'javaOK' => 0, 'javaKO' => 0, 'wmpOK' => 0, 'wmpKO' => 0, 'qtOK' => 0, 'qtKO' => 0, 'realOK' => 0, 'realKO' => 0, 'flashOK' => 0, 'flashKO' => 0, 'directorOK' => 0, 'directorKO' => 0); + while ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->nextRow($result)) + { + if (!$row['javascript']) + { + ++$calcArray['jsKO']; + continue; + } + ++$calcArray['jsOK']; + ($row['windows_media']) ? ++$calcArray['wmpOK'] : ++$calcArray['wmpKO']; + ($row['real_player']) ? ++$calcArray['realOK'] : ++$calcArray['realKO']; + ($row['adobe_flash']) ? ++$calcArray['flashOK'] : ++$calcArray['flashKO']; + ($row['adobe_director']) ? ++$calcArray['directorOK'] : ++$calcArray['directorKO']; + ($row['sun_java']) ? ++$calcArray['javaOK'] : ++$calcArray['javaKO']; + ($row['apple_quicktime']) ? ++$calcArray['qtOK'] : ++$calcArray['qtKO']; + } + + if (!$calcArray['jsOK']) + return false; + + $equip = array( + 'Windows Media Player' => $calcArray['wmpOK'] / ($calcArray['wmpOK'] + $calcArray['wmpKO']), + 'Real Player' => $calcArray['realOK'] / ($calcArray['realOK'] + $calcArray['realKO']), + 'Apple Quicktime' => $calcArray['qtOK'] / ($calcArray['qtOK'] + $calcArray['qtKO']), + 'Sun Java' => $calcArray['javaOK'] / ($calcArray['javaOK'] + $calcArray['javaKO']), + 'Adobe Flash' => $calcArray['flashOK'] / ($calcArray['flashOK'] + $calcArray['flashKO']), + 'Adobe Shockwave' => $calcArray['directorOK'] / ($calcArray['directorOK'] + $calcArray['directorKO']) + ); + arsort($equip); + return $equip; + } + + public function hookAdminStatsModules($params) + { + if (Tools::getValue('export')) + if (Tools::getValue('exportType') == 'browser') + $this->csvExport(array('type' => 'pie', 'option' => 'wb')); + elseif (Tools::getValue('exportType') == 'os') + $this->csvExport(array('type' => 'pie', 'option' => 'os')); + + $equipment = $this->getEquipment(); + $this->_html = ' +
    '.$this->displayName.' +
    +

    '.$this->l('Determine the percentage of web browsers used by your customers.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'wb')).'

    +

    '.$this->l('CSV Export').'

    +

    '.$this->l('Determine the percentage of operating systems used by your customers.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'os')).' +

    '.$this->l('CSV Export').'

    '; + + if ($equipment) + { + $this->_html .= ' + '; + foreach ($equipment as $name => $value) + $this->_html .= ''; + $this->_html .= '
    '.$this->l('Plug-ins').'
    '.$name.''.number_format(100 * $value, 2).'%
    '; + } + $this->_html .= ' +
    +

    +
    '.$this->l('Guide').' +

    '.$this->l('Ensure that your website is accessible to all.').'

    +

    + '.$this->l('When managing Websites, it is important to keep track of software used by visitors in order to be sure that the site displays the same way for everyone. PrestaShop was built in order to be compatible with most recent Web browsers and computer operating systems (OS). However, because you may end up adding advanced features to your Website or even modify the core PrestaShop code, these additions may not be accessible by everyone. That is why it is a good idea to keep tabs on the percentage of users for each type of software before adding or changing something that only a limited number of users will be able to access.').' +


    + +
    '; + return $this->_html; + } + + public function setOption($option, $layers = 1) + { + switch($option) + { + case 'wb': + $this->_titles['main'] = $this->l('Web browser use'); + $this->_query = 'SELECT wb.`name`, COUNT(g.`id_web_browser`) AS total + FROM `'._DB_PREFIX_.'web_browser` wb + LEFT JOIN `'._DB_PREFIX_.'guest` g ON g.`id_web_browser` = wb.`id_web_browser` + LEFT JOIN `'._DB_PREFIX_.'connections` c ON g.`id_guest` = c.`id_guest` + WHERE 1 + '.$this->sqlShopRestriction(false, 'c').' + c.`date_add` BETWEEN '; + $this->_query2 = ' GROUP BY g.`id_web_browser`'; + break; + + case 'os': + $this->_titles['main'] = $this->l('Operating systems use'); + $this->_query = 'SELECT os.`name`, COUNT(g.`id_operating_system`) AS total + FROM `'._DB_PREFIX_.'operating_system` os + LEFT JOIN `'._DB_PREFIX_.'guest` g ON g.`id_operating_system` = os.`id_operating_system` + LEFT JOIN `'._DB_PREFIX_.'connections` c ON g.`id_guest` = c.`id_guest` + WHERE 1 + '.$this->sqlShopRestriction(false, 'c').' + c.`date_add` BETWEEN '; + $this->_query2 = ' GROUP BY g.`id_operating_system`'; + break; + } + } + + protected function getData($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + $this->_values = array(); + $i = 0; + foreach ($result as $row) + { + $this->_values[$i] = $row['total']; + $this->_legend[$i++] = $row['name']; + } + } +} + + diff --git a/modules/statsforecast/config.xml b/modules/statsforecast/config.xml new file mode 100755 index 000000000..3c9fb8a7e --- /dev/null +++ b/modules/statsforecast/config.xml @@ -0,0 +1,12 @@ + + + statsforecast + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/statsforecast/de.php b/modules/statsforecast/de.php new file mode 100644 index 000000000..a2f161006 --- /dev/null +++ b/modules/statsforecast/de.php @@ -0,0 +1,59 @@ +statsforecast_240c994d8b61c7bd68ac1c5182bbdb2e'] = 'Statistik Startseite'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b53bb8c5ac3b77a4667498709efba55d'] = 'Alle Beträge verstehen sich zzgl. MsWst.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1ee1c44c2dc81681f961235604247b81'] = 'Modus:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03727ac48595a24daed975559c944a44'] = 'Tag'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d2ce009594dcc60befa6a4e6cbeb71fc'] = 'Woche'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7cbb885aa1164b390a0bc050a64e1812'] = 'Monat'; +$_MODULE['<{statsforecast}prestashop>statsforecast_537c66b24ef5c83b7382cdc3f34885f2'] = 'Jahr'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d7e637a6e9ff116de2fa89551240a94d'] = 'Besuche'; +$_MODULE['<{statsforecast}prestashop>statsforecast_591411cc8927851db2002208676d8330'] = 'Reg.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Bestellungen'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9dea4016dbcc290b773ab2fae678aaa8'] = 'Artikel'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e46b5c15331f34b9ff653fdf1ea0a7f0'] = '% Reg.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1d34a18a13e480b0aa6a799bb8a49c1b'] = '% Bestellungen'; +$_MODULE['<{statsforecast}prestashop>statsforecast_cc4616c718d99e1face99b5e46a5755c'] = 'Gutscheine'; +$_MODULE['<{statsforecast}prestashop>statsforecast_899433c0e135bcfe0d93e9397630f86a'] = 'Verkäufe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_96b0141273eabab320119c467cdcaf17'] = 'Insgesamt'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b1897515d548a960afe49ecf66a29021'] = 'Durchschnitt'; +$_MODULE['<{statsforecast}prestashop>statsforecast_89c1265be62d3ba835a3d963db5956b0'] = 'Prognose'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3bb1503332637805beddb73a2dd1fe1b'] = 'Umwandlung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Besucher'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9b945efebb006547a94415eadaa12921'] = 'Konten'; +$_MODULE['<{statsforecast}prestashop>statsforecast_fc26e55e0993a75e892175deb02aae15'] = 'Warenkörbe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_87cac5a0b60008003ccf46dc1d49e0c3'] = 'Volle Warenkörbe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5a9e532b24379dca2ab0e973172a78e1'] = 'Registrierte Besucher'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b4aec469184819e8369588e5d84b38fb'] = 'Wandeln Sie Ihre Besucher in bares Geld um:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_38f2d5f34a773b7c0668f03e6b8eb6dc'] = 'Ertrag aus jedem Besucher'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8ca76c564cccfd5a2ff4d2e08f46db5a'] = 'Ertrag aus jedem registrierten Besucher'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0faa470ff0741ece6c8346b66e0e459c'] = 'Zahlungsverteilung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6e42855066e7a3ae050b2c698021b14'] = 'Zone:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5ed26836c96d7dcae8a40307e8e250c3'] = '- Kein Filter -'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e55f75a29310d7b60f7ac1d390c8ae42'] = 'Modul'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e93f994f01c537c4e2f7d8528c3eb5e9'] = 'Zählung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_a85eba4c6c699122b2bb1387ea4813ad'] = 'Warenkorb'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f13877f6ad53ce91fcb20fb8b7969698'] = 'Verteilung der Kategorien'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{statsforecast}prestashop>statsforecast_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_52f39d7c5cad5c1550553385f55277ae'] = '% Zählung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_41b63feded4acc3719f9bcd016388324'] = '% Verkäufe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_4364f8c09d7bf97996a20840900e7b30'] = 'Durchschnittl. Preis'; +$_MODULE['<{statsforecast}prestashop>statsforecast_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Unbekannt'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Sprachenverteilung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Kunden'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{statsforecast}prestashop>statsforecast_699aed86dada6ca01ef74013a4464066'] = 'Wachstum'; +$_MODULE['<{statsforecast}prestashop>statsforecast_07aa83862ec591697b4325b66d36a78b'] = 'Zonenverteilung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b3ff996fe5c77610359114835baf9b38'] = 'Zone'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Undefiniert'; +$_MODULE['<{statsforecast}prestashop>statsforecast_28e81c8343702f6c813cc31a7f90616a'] = 'Währungsverteilung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_386c339d37e737a436499d423a77df0c'] = 'Währung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_61569923d8075889a162c4e603258e6e'] = 'Verkäufe (umgewandelt)'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8471eed257db7258f935588a664ba4f3'] = 'Attributverteilung'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03937134cedab9078be39a77ee3a48a0'] = 'Gruppe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attribute'; + +?> \ No newline at end of file diff --git a/modules/statsforecast/es.php b/modules/statsforecast/es.php new file mode 100644 index 000000000..1f27ab9b5 --- /dev/null +++ b/modules/statsforecast/es.php @@ -0,0 +1,57 @@ +statsforecast_240c994d8b61c7bd68ac1c5182bbdb2e'] = 'Tabla de mando de estadísticas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b53bb8c5ac3b77a4667498709efba55d'] = 'Todos los importes se indican sin IVA'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1ee1c44c2dc81681f961235604247b81'] = 'Modo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03727ac48595a24daed975559c944a44'] = 'Día'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d2ce009594dcc60befa6a4e6cbeb71fc'] = 'Semana'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7cbb885aa1164b390a0bc050a64e1812'] = 'Mes'; +$_MODULE['<{statsforecast}prestashop>statsforecast_537c66b24ef5c83b7382cdc3f34885f2'] = 'Año'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d7e637a6e9ff116de2fa89551240a94d'] = 'Visitas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_591411cc8927851db2002208676d8330'] = 'Inscritos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Pedidos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9dea4016dbcc290b773ab2fae678aaa8'] = 'Productos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e46b5c15331f34b9ff653fdf1ea0a7f0'] = '% insc.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1d34a18a13e480b0aa6a799bb8a49c1b'] = '% pedidos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_cc4616c718d99e1face99b5e46a5755c'] = 'Descuentos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_899433c0e135bcfe0d93e9397630f86a'] = 'Volumne de ventas de los productos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b1897515d548a960afe49ecf66a29021'] = 'Media'; +$_MODULE['<{statsforecast}prestashop>statsforecast_89c1265be62d3ba835a3d963db5956b0'] = 'Previsiones'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3bb1503332637805beddb73a2dd1fe1b'] = 'Conversión'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitantes'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9b945efebb006547a94415eadaa12921'] = 'Cuentas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_fc26e55e0993a75e892175deb02aae15'] = 'Carritos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_87cac5a0b60008003ccf46dc1d49e0c3'] = 'Carritos llenos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5a9e532b24379dca2ab0e973172a78e1'] = 'Visitantes inscritos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b4aec469184819e8369588e5d84b38fb'] = 'Dirigir a los visitantes hacia el pago'; +$_MODULE['<{statsforecast}prestashop>statsforecast_38f2d5f34a773b7c0668f03e6b8eb6dc'] = 'Beneficio por visitante'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8ca76c564cccfd5a2ff4d2e08f46db5a'] = 'Beneficio por visitante inscrito'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0faa470ff0741ece6c8346b66e0e459c'] = 'Repartición por modos de pago'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6e42855066e7a3ae050b2c698021b14'] = 'Zona:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5ed26836c96d7dcae8a40307e8e250c3'] = '-No hay filtros-'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e55f75a29310d7b60f7ac1d390c8ae42'] = 'Módulo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e93f994f01c537c4e2f7d8528c3eb5e9'] = 'Cálculo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrito'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f13877f6ad53ce91fcb20fb8b7969698'] = 'Repartición por categorías'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoría'; +$_MODULE['<{statsforecast}prestashop>statsforecast_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Volumen de ventas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_52f39d7c5cad5c1550553385f55277ae'] = '% cálculo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_41b63feded4acc3719f9bcd016388324'] = '% volume de ventas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_4364f8c09d7bf97996a20840900e7b30'] = 'Precio medio'; +$_MODULE['<{statsforecast}prestashop>statsforecast_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Desconocido'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Repartición por idiomas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clientes'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{statsforecast}prestashop>statsforecast_699aed86dada6ca01ef74013a4464066'] = 'Evolución'; +$_MODULE['<{statsforecast}prestashop>statsforecast_07aa83862ec591697b4325b66d36a78b'] = 'Repartición por zonas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b3ff996fe5c77610359114835baf9b38'] = 'Zona'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Indefinido'; +$_MODULE['<{statsforecast}prestashop>statsforecast_28e81c8343702f6c813cc31a7f90616a'] = 'Repartición por divisas'; +$_MODULE['<{statsforecast}prestashop>statsforecast_386c339d37e737a436499d423a77df0c'] = 'Divisa'; +$_MODULE['<{statsforecast}prestashop>statsforecast_61569923d8075889a162c4e603258e6e'] = 'Volumen de ventas (convertido)'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8471eed257db7258f935588a664ba4f3'] = 'Repartición de las ventas por atributos'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03937134cedab9078be39a77ee3a48a0'] = 'Grupo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Atributo'; diff --git a/modules/statsforecast/fr.php b/modules/statsforecast/fr.php new file mode 100644 index 000000000..0b4b5ccd3 --- /dev/null +++ b/modules/statsforecast/fr.php @@ -0,0 +1,57 @@ +statsforecast_240c994d8b61c7bd68ac1c5182bbdb2e'] = 'Tableau de bord statistiques'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b53bb8c5ac3b77a4667498709efba55d'] = 'Tous les montants sont exprimés HT.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1ee1c44c2dc81681f961235604247b81'] = 'Mode :'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03727ac48595a24daed975559c944a44'] = 'Jour'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d2ce009594dcc60befa6a4e6cbeb71fc'] = 'Semaine'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7cbb885aa1164b390a0bc050a64e1812'] = 'Mois'; +$_MODULE['<{statsforecast}prestashop>statsforecast_537c66b24ef5c83b7382cdc3f34885f2'] = 'Année'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d7e637a6e9ff116de2fa89551240a94d'] = 'Visites'; +$_MODULE['<{statsforecast}prestashop>statsforecast_591411cc8927851db2002208676d8330'] = 'Insc.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Com.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9dea4016dbcc290b773ab2fae678aaa8'] = 'Prods.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e46b5c15331f34b9ff653fdf1ea0a7f0'] = '% Insc.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1d34a18a13e480b0aa6a799bb8a49c1b'] = '% Com.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_cc4616c718d99e1face99b5e46a5755c'] = 'Réducs.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_899433c0e135bcfe0d93e9397630f86a'] = 'CA Produits'; +$_MODULE['<{statsforecast}prestashop>statsforecast_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b1897515d548a960afe49ecf66a29021'] = 'Moyenne'; +$_MODULE['<{statsforecast}prestashop>statsforecast_89c1265be62d3ba835a3d963db5956b0'] = 'Prévisions'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3bb1503332637805beddb73a2dd1fe1b'] = 'Conversion'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visiteurs'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9b945efebb006547a94415eadaa12921'] = 'Comptes'; +$_MODULE['<{statsforecast}prestashop>statsforecast_fc26e55e0993a75e892175deb02aae15'] = 'Paniers'; +$_MODULE['<{statsforecast}prestashop>statsforecast_87cac5a0b60008003ccf46dc1d49e0c3'] = 'Paniers complets'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5a9e532b24379dca2ab0e973172a78e1'] = 'Visiteurs inscrits'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b4aec469184819e8369588e5d84b38fb'] = 'Monétisation des visiteurs'; +$_MODULE['<{statsforecast}prestashop>statsforecast_38f2d5f34a773b7c0668f03e6b8eb6dc'] = 'Chaque visiteur rapporte en moyenne'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8ca76c564cccfd5a2ff4d2e08f46db5a'] = 'Chaque visiteur inscrit rapporte en moyenne'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0faa470ff0741ece6c8346b66e0e459c'] = 'Répartition par modes de paiement'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6e42855066e7a3ae050b2c698021b14'] = 'Zone :'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5ed26836c96d7dcae8a40307e8e250c3'] = '-- Aucun filtre --'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e55f75a29310d7b60f7ac1d390c8ae42'] = 'Module'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e93f994f01c537c4e2f7d8528c3eb5e9'] = 'Nb'; +$_MODULE['<{statsforecast}prestashop>statsforecast_a85eba4c6c699122b2bb1387ea4813ad'] = 'Panier'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f13877f6ad53ce91fcb20fb8b7969698'] = 'Répartition par catégories'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Catégorie'; +$_MODULE['<{statsforecast}prestashop>statsforecast_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'CA'; +$_MODULE['<{statsforecast}prestashop>statsforecast_52f39d7c5cad5c1550553385f55277ae'] = '% Nb'; +$_MODULE['<{statsforecast}prestashop>statsforecast_41b63feded4acc3719f9bcd016388324'] = '% CA'; +$_MODULE['<{statsforecast}prestashop>statsforecast_4364f8c09d7bf97996a20840900e7b30'] = 'Prix moyen'; +$_MODULE['<{statsforecast}prestashop>statsforecast_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Inconnu'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Répartition par langues'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clients'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{statsforecast}prestashop>statsforecast_699aed86dada6ca01ef74013a4464066'] = 'Evolution'; +$_MODULE['<{statsforecast}prestashop>statsforecast_07aa83862ec591697b4325b66d36a78b'] = 'Répartition par zones'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b3ff996fe5c77610359114835baf9b38'] = 'Zone'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Indéfini'; +$_MODULE['<{statsforecast}prestashop>statsforecast_28e81c8343702f6c813cc31a7f90616a'] = 'Répartition par devises'; +$_MODULE['<{statsforecast}prestashop>statsforecast_386c339d37e737a436499d423a77df0c'] = 'Devise'; +$_MODULE['<{statsforecast}prestashop>statsforecast_61569923d8075889a162c4e603258e6e'] = 'CA (converti)'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8471eed257db7258f935588a664ba4f3'] = 'Répartition des ventes par attributs'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03937134cedab9078be39a77ee3a48a0'] = 'Groupe'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attribut'; diff --git a/modules/statsforecast/funnel.png b/modules/statsforecast/funnel.png new file mode 100644 index 0000000000000000000000000000000000000000..2213a2b205c6f68316690c69cd54ba310345ab89 GIT binary patch literal 732 zcmV<20wev2P)XCKpMJ;LU(uf+%WIlyyRd=0%emX+aw$3y_%ZX;Kc{?=KaikZ{~Y5Ot;&G{~0rcZSXK{` zB!Ss%CO{yH0>ok$uMI>%Mj#M~C6mdNqA2KGL#acxS_7Sq2YeN*Rx1TbB<{uu&;UTI z)q0BRs>9)cN~MC1ReaTqM>XJi5o|Ua$g&I;iEEPHqXa34rnA1I84fSS&)RRDw>Y(>wpxZ-gXgZIK1QqDyr(Z3Fe?p#W$& zwA#kdxq;#CHk;l{=f=IL<2?}FKdO}0_*m%vG=JE0W*3>yWwY?!u0eR#>3z1e6~}0R zA-%vb%)VFO`sV8DhevZiZOTl*Eqzz8D%yY0kB$N?FMixS5CH-FT_hTraxc@l!iJwC zYX$#(GT`-2oNz*VVQrIP*~k3=#7IIBvC>EwJn4b$HxE{j+(lv_MVHp<$DHtX{yB9X zH5$|XDdPZ6t literal 0 HcmV?d00001 diff --git a/modules/statsforecast/it.php b/modules/statsforecast/it.php new file mode 100644 index 000000000..b995f0849 --- /dev/null +++ b/modules/statsforecast/it.php @@ -0,0 +1,59 @@ +statsforecast_240c994d8b61c7bd68ac1c5182bbdb2e'] = 'Statistiche Dashboard'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b53bb8c5ac3b77a4667498709efba55d'] = 'Tutti gli importi sono senza tasse.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1ee1c44c2dc81681f961235604247b81'] = 'Modalità:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03727ac48595a24daed975559c944a44'] = 'Giorno'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d2ce009594dcc60befa6a4e6cbeb71fc'] = 'Settimana'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7cbb885aa1164b390a0bc050a64e1812'] = 'Mese'; +$_MODULE['<{statsforecast}prestashop>statsforecast_537c66b24ef5c83b7382cdc3f34885f2'] = 'Anno'; +$_MODULE['<{statsforecast}prestashop>statsforecast_d7e637a6e9ff116de2fa89551240a94d'] = 'Visite'; +$_MODULE['<{statsforecast}prestashop>statsforecast_591411cc8927851db2002208676d8330'] = 'Reg.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Ordini'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9dea4016dbcc290b773ab2fae678aaa8'] = 'Articoli'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e46b5c15331f34b9ff653fdf1ea0a7f0'] = '% Reg.'; +$_MODULE['<{statsforecast}prestashop>statsforecast_1d34a18a13e480b0aa6a799bb8a49c1b'] = '% Ordini'; +$_MODULE['<{statsforecast}prestashop>statsforecast_cc4616c718d99e1face99b5e46a5755c'] = 'Buoni'; +$_MODULE['<{statsforecast}prestashop>statsforecast_899433c0e135bcfe0d93e9397630f86a'] = 'Vendite prodotti'; +$_MODULE['<{statsforecast}prestashop>statsforecast_96b0141273eabab320119c467cdcaf17'] = 'Totale'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b1897515d548a960afe49ecf66a29021'] = 'Media'; +$_MODULE['<{statsforecast}prestashop>statsforecast_89c1265be62d3ba835a3d963db5956b0'] = 'Previsione'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3bb1503332637805beddb73a2dd1fe1b'] = 'Conversione'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitatori'; +$_MODULE['<{statsforecast}prestashop>statsforecast_9b945efebb006547a94415eadaa12921'] = 'Conti'; +$_MODULE['<{statsforecast}prestashop>statsforecast_fc26e55e0993a75e892175deb02aae15'] = 'Carrelli'; +$_MODULE['<{statsforecast}prestashop>statsforecast_87cac5a0b60008003ccf46dc1d49e0c3'] = 'carri completi'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5a9e532b24379dca2ab0e973172a78e1'] = 'Visitatori registrati'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b4aec469184819e8369588e5d84b38fb'] = 'Trasforma i tuoi visitatori in denaro:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_38f2d5f34a773b7c0668f03e6b8eb6dc'] = 'Ogni visitatore rende'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8ca76c564cccfd5a2ff4d2e08f46db5a'] = 'Ogni visitatore registrato rende'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0faa470ff0741ece6c8346b66e0e459c'] = 'Distribuzione del pagamento'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6e42855066e7a3ae050b2c698021b14'] = 'Zona:'; +$_MODULE['<{statsforecast}prestashop>statsforecast_5ed26836c96d7dcae8a40307e8e250c3'] = '- Nessun Filtro -'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e55f75a29310d7b60f7ac1d390c8ae42'] = 'Modulo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e93f994f01c537c4e2f7d8528c3eb5e9'] = 'Conteggio'; +$_MODULE['<{statsforecast}prestashop>statsforecast_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrello'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f13877f6ad53ce91fcb20fb8b7969698'] = 'Categoria distribuzione'; +$_MODULE['<{statsforecast}prestashop>statsforecast_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoria'; +$_MODULE['<{statsforecast}prestashop>statsforecast_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{statsforecast}prestashop>statsforecast_52f39d7c5cad5c1550553385f55277ae'] = '% conteggio'; +$_MODULE['<{statsforecast}prestashop>statsforecast_41b63feded4acc3719f9bcd016388324'] = '% vendite'; +$_MODULE['<{statsforecast}prestashop>statsforecast_4364f8c09d7bf97996a20840900e7b30'] = 'Prezzo medio'; +$_MODULE['<{statsforecast}prestashop>statsforecast_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Sconosciuto'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Lingua di distribuzione'; +$_MODULE['<{statsforecast}prestashop>statsforecast_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clienti'; +$_MODULE['<{statsforecast}prestashop>statsforecast_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{statsforecast}prestashop>statsforecast_699aed86dada6ca01ef74013a4464066'] = 'Crescita'; +$_MODULE['<{statsforecast}prestashop>statsforecast_07aa83862ec591697b4325b66d36a78b'] = 'Zone di distribuzione'; +$_MODULE['<{statsforecast}prestashop>statsforecast_b3ff996fe5c77610359114835baf9b38'] = 'Zone'; +$_MODULE['<{statsforecast}prestashop>statsforecast_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Indefinito'; +$_MODULE['<{statsforecast}prestashop>statsforecast_28e81c8343702f6c813cc31a7f90616a'] = 'Distribuzione valuta'; +$_MODULE['<{statsforecast}prestashop>statsforecast_386c339d37e737a436499d423a77df0c'] = 'Valuta'; +$_MODULE['<{statsforecast}prestashop>statsforecast_61569923d8075889a162c4e603258e6e'] = 'Vendite (convertito)'; +$_MODULE['<{statsforecast}prestashop>statsforecast_8471eed257db7258f935588a664ba4f3'] = 'Distribuzione attributo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_03937134cedab9078be39a77ee3a48a0'] = 'Gruppo'; +$_MODULE['<{statsforecast}prestashop>statsforecast_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attributo'; + +?> \ No newline at end of file diff --git a/modules/statsforecast/logo.gif b/modules/statsforecast/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ff27b432bc8fd68d9cfeff4d7249b73437bdef6 GIT binary patch literal 1028 zcmeH``%hAF0L8CcmXQ?!nj$(hH7hIItZ5HpjbXVgUA647l-{+rmia^Pm}T~&$I_Lp zhf*!lr5P!fHBw77NJC5~p=hK;BHRo24cu?pFZ~mpoqc{dKc2IbzDAOgDrG}#h=9gr zzBB#nO>TE7ueUtZT){CbIF=`z{>Sqy&tgrA6&7WhxoYL0lKZ`q_v1NlxQ6Gf;f_^@ z+f*SxRUvkD=%{+;SmR7bV;Ee+MN~YbF4SGiN7WIqCTzGW$@N0$s81YjNOd-(!F96` z^*p400rDo!-8kQ)N$Rf_4XH$fs&&@-T-W<>q$S+l%tt;%cv>USwg|LcfPad_^#Zh2 z2sh8gbTLGS(A~7e^C1~){==ns>oQck+@nh++S3R_0%1rdyBCi%r8`?r`dM55GS%+IAK( zNbzo|+js~y9VU%Zs%JOVv!CicM4EPy-}cgd2QX7U(N{nW9KlRysJ;SfAfGfHqs+(Y z{*zwINt;&Y=qN<{uh9cVwB-^$_{W!NYZ3jun6h5oWPVkG(JIDS2b^lg)c{;?{jPTmTvP#3qV@|ss*SXpdAd>2~Y#TjezI@L@z^_0BQL<_<#IsAex#G06_ps9FN97 z0R;^~V6q@bTr3xCoH$pIa-OZsEDa9aqWmIJu9ib_ZqX6p)Qqds-d#Fc@kkVYq6AJ^ z^s%u0?80gHU&n}9MMdI+`i21O)Em6mHc{3c?esa>_jp5W&kt?bB-XyGbcx*%Hzh4g zCd(H|gV&eEhVYZ4uiT1~vJwhv+vK<7_eMDqnkvp+2ymJ(TwPl$CASMz%Q$2XGNyuataP`cgkmpPbprJ#S=QCk|a4vVY0y> a{^CvIpnIx987r0bI+0zTr_;!wWxoNY__+Q6 literal 0 HcmV?d00001 diff --git a/modules/statsforecast/next.png b/modules/statsforecast/next.png new file mode 100644 index 0000000000000000000000000000000000000000..e252606d3e68c6da135a9b165996d9da968ef7fc GIT binary patch literal 395 zcmV;60d)R}P)IO8de(|Ml<%@O-40!dwX61{2C5s-llVw2V@@N0oo_PPieZ!0Y2~+R( zk!(QTf=B;X9DnzJ@u9c>OP4(U@7{849!UlyO@H`*;lVfmCvAW6f9CF&{}ZR*{jXDW zb_vl21ozzrYJBy-Vb$aRjjJF3@7nm}zjw#A|58cE9uZ}LbIY~=6ShA8U$XeY|MDdd zfQCH!?_7WRzhvaG%|sbsT7Kz&`}!yUix%Do#>T_{_Ei`DO9UTSBkH=Hg(w4*^UnUS zTk-IJ<+2C=ZObqG7Z2FGlB7VCN;>(!bn*TFHYMl(i+Sx`L~=ArL>~EXU3lidsO!!J pWF;gqzXSh89JkLNxXeT<1_12n>%V}Y6R`jQ002ovPDHLkV1iLCz99er literal 0 HcmV?d00001 diff --git a/modules/statsforecast/statsforecast.php b/modules/statsforecast/statsforecast.php new file mode 100644 index 000000000..f2895a44c --- /dev/null +++ b/modules/statsforecast/statsforecast.php @@ -0,0 +1,646 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7104 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsForecast extends Module +{ + private $_html = ''; + private $t1 = 0; + private $t2 = 0; + private $t3 = 0; + private $t4 = 0; + private $t5 = 0; + private $t6 = 0; + private $t7 = 0; + private $t8 = 0; + + public function __construct() + { + $this->name = 'statsforecast'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Stats Dashboard'); + $this->description = ''; + } + + public function install() + { + return (parent::install() && $this->registerHook('AdminStatsModules')); + } + + public function getContent() + { + Tools::redirectAdmin('index.php?tab=AdminStats&module=statsforecast&token='.Tools::getAdminTokenLite('AdminStats')); + } + + public function hookAdminStatsModules() + { + global $cookie, $currentIndex; + $ru = $currentIndex.'&module='.$this->name.'&token='.Tools::getValue('token'); + + $db = Db::getInstance(); + + if (!isset($cookie->stats_granularity)) + $cookie->stats_granularity = 10; + if (Tools::isSubmit('submitIdZone')) + $cookie->stats_id_zone = Tools::getValue('stats_id_zone'); + if (Tools::isSubmit('submitGranularity')) + $cookie->stats_granularity = Tools::getValue('stats_granularity'); + + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $employee = new Employee((int)($cookie->id_employee)); + + // Prepare SQL clause to filter per shop + $whereOrder = $whereConnection = $whereCustomer = $whereCart = ''; + if ($this->shopID || $this->shopGroupID) + { + if ($this->shopID) + { + $whereOrder = ' AND o.id_shop = '.$this->shopID; + $whereConnection = ' AND c.id_shop = '.$this->shopID; + $whereCustomer = ' AND id_shop = '.$this->shopID; + $whereCart = ' AND id_shop = '.$this->shopID; + } + else if ($this->shopGroupID) + { + $whereOrder = ' AND o.id_group_shop = '.$this->shopGroupID; + $whereConnection = ' AND c.id_group_shop = '.$this->shopGroupID; + $whereCustomer = ' AND id_group_shop = '.$this->shopGroupID; + $whereCart = ' AND id_group_shop = '.$this->shopGroupID; + } + } + + // @todo use PHP functions to get timestamp ... + $result = $db->getRow('SELECT UNIX_TIMESTAMP(\'2009-06-05 00:00:00\') as t1, UNIX_TIMESTAMP(\''.$employee->stats_date_from.' 00:00:00\') as t2'); + $from = max($result['t1'], $result['t2']); + $to = strtotime($employee->stats_date_to.' 23:59:59'); + $result2 = $db->getRow('SELECT UNIX_TIMESTAMP(NOW()) as t1, UNIX_TIMESTAMP(\''.$employee->stats_date_to.' 23:59:59\') as t2'); + $to2 = min($result2['t1'], $result2['t2']); + $interval = ($to - $from) / 60 / 60 / 24; + $interval2 = ($to2 - $from) / 60 / 60 / 24; + $prop30 = $interval / $interval2; + + if ($cookie->stats_granularity == 7) + $intervalAvg = $interval2 / 30; + if ($cookie->stats_granularity == 4) + $intervalAvg = $interval2 / 365; + if ($cookie->stats_granularity == 10) + $intervalAvg = $interval2; + if ($cookie->stats_granularity == 42) + $intervalAvg = $interval2 / 7; + + define('PS_BASE_URI', '/'); + $result = $db->getRow('SELECT UNIX_TIMESTAMP(\'2009-06-05\') as t1, UNIX_TIMESTAMP(\''.$employee->stats_date_from.'\') as t2'); + $from = max($result['t1'], $result['t2']); + $to = strtotime($employee->stats_date_to.''); + + $dateFromGAdd = ($cookie->stats_granularity != 42 + ? 'SUBSTRING(date_add, 1, '.(int)$cookie->stats_granularity.')' + : 'IFNULL(MAKEDATE(YEAR(date_add),DAYOFYEAR(date_add)-WEEKDAY(date_add)), CONCAT(YEAR(date_add),"-01-01*"))'); + $dateFromGInvoice = ($cookie->stats_granularity != 42 + ? 'SUBSTRING(invoice_date, 1, '.(int)$cookie->stats_granularity.')' + : 'IFNULL(MAKEDATE(YEAR(invoice_date),DAYOFYEAR(invoice_date)-WEEKDAY(invoice_date)), CONCAT(YEAR(invoice_date),"-01-01*"))'); + + $sql = 'SELECT + '.$dateFromGInvoice.' as fix_date, + COUNT(DISTINCT o.id_order) as countOrders, + SUM(od.product_quantity) as countProducts, + SUM(od.product_price * od.product_quantity / o.conversion_rate) as totalProducts + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'order_detail od ON o.id_order = od.id_order + LEFT JOIN '._DB_PREFIX_.'product p ON od.product_id = p.id_product + WHERE o.valid = 1 + AND o.invoice_date BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereOrder.' + GROUP BY '.$dateFromGInvoice.' + ORDER BY fix_date'; + $result = $db->ExecuteS($sql, false); + + $dataTable = array(); + if ($cookie->stats_granularity == 10) + { + $dateEnd = strtotime($employee->stats_date_to.' 23:59:59'); + $dateToday = time(); + for ($i = strtotime($employee->stats_date_from.' 00:00:00'); $i <= $dateEnd AND $i <= $dateToday; $i += 86400) + $dataTable[$i] = array('fix_date' => date('Y-m-d', $i), 'countOrders' => 0, 'countProducts' => 0, 'totalProducts' => 0); + } + + while ($row = $db->nextRow($result)) + $dataTable[strtotime($row['fix_date'])] = $row; + + $this->_html .= '
    +
    '.$this->displayName.' +

    '.$this->l('All amounts are without taxes.').'

    + + + '.$this->l('Mode:').' + +
     
    + + + + + + + + + + + + '; + + $visitArray = array(); + $sql = 'SELECT '.$dateFromGAdd.' as fix_date, COUNT(*) as visits + FROM '._DB_PREFIX_.'connections c + WHERE c.date_add BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereConnection.' + GROUP BY '.$dateFromGAdd; + $visits = Db::getInstance()->ExecuteS($sql, false); + while ($row = $db->nextRow($visits)) + $visitArray[$row['fix_date']] = $row['visits']; + + $discountArray = array(); + $sql = 'SELECT '.$dateFromGInvoice.' as fix_date, SUM(od.value) as total + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'order_discount od ON o.id_order = od.id_order + WHERE o.valid = 1 + AND o.total_paid_real > 0 + AND o.invoice_date BETWEEN '.ModuleGraph::getDateBetween() + .$whereOrder.' + GROUP BY '.$dateFromGInvoice; + $discounts = Db::getInstance()->ExecuteS($sql, false); + while ($row = $db->nextRow($discounts)) + $discountArray[$row['fix_date']] = $row['total']; + + $today = date('Y-m-d'); + foreach ($dataTable as $row) + { + $discountToday = (isset($discountArray[$row['fix_date']]) ? $discountArray[$row['fix_date']] : 0); + $visitsToday = (int)(isset($visitArray[$row['fix_date']]) ? $visitArray[$row['fix_date']] : 0); + + $dateFromGReg = ($cookie->stats_granularity != 42 + ? 'LIKE \''.$row['fix_date'].'%\'' + : 'BETWEEN \''.substr($row['fix_date'], 0, 10).' 00:00:00\' AND DATE_ADD(\''.substr($row['fix_date'], 0, 8).substr($row['fix_date'], 8, 2).' 23:59:59\', INTERVAL 7 DAY)'); + $sql = 'SELECT COUNT(*) FROM '._DB_PREFIX_.'customer + WHERE date_add BETWEEN '.ModuleGraph::getDateBetween().' + AND date_add '.$dateFromGReg + .$whereCustomer; + $row['registrations'] = Db::getInstance()->getValue($sql); + $totalHT = $row['totalProducts'] - $discountToday; + + $this->_html .= ' + + + + + + + + + + + '; + + $this->t1 += $visitsToday; + $this->t2 += (int)($row['registrations']); + $this->t3 += (int)($row['countOrders']); + $this->t4 += (int)($row['countProducts']); + $this->t7 += $discountToday; + $this->t8 += $totalHT; + } + + $this->_html .= ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    '.$this->l('Visits').''.$this->l('Reg.').''.$this->l('Orders').''.$this->l('Items').''.$this->l('% Reg.').''.$this->l('% Orders').''.$this->l('Coupons').''.$this->l('Products Sales').'
    '.$row['fix_date'].''.$visitsToday.''.(int)($row['registrations']).''.(int)($row['countOrders']).''.(int)($row['countProducts']).''.($visitsToday ? round(100 * (int)($row['registrations']) / $visitsToday, 2).' %' : '-').''.($visitsToday ? round(100 * (int)($row['countOrders']) / $visitsToday, 2).' %' : '-').''.Tools::displayPrice($discountToday, $currency).''.Tools::displayPrice($totalHT, $currency).'
    '.$this->l('Visits').''.$this->l('Reg.').''.$this->l('Orders').''.$this->l('Items').''.$this->l('% Reg.').''.$this->l('% Orders').''.$this->l('Coupons').''.$this->l('Products Sales').'
    '.$this->l('Total').''.(int)($this->t1).''.(int)($this->t2).''.(int)($this->t3).''.(int)($this->t4).'----'.Tools::displayPrice($this->t7, $currency).''.Tools::displayPrice($this->t8, $currency).'
    '.$this->l('Average').''.(int)($this->t1 / $intervalAvg).''.(int)($this->t2 / $intervalAvg).''.(int)($this->t3 / $intervalAvg).''.(int)($this->t4 / $intervalAvg).''.($this->t1 ? round(100 * $this->t2 / $this->t1, 2) .' %' : '-').''.($this->t1 ? round(100 * $this->t3 / $this->t1, 2) .' %' : '-').''.Tools::displayPrice($this->t7 / $intervalAvg, $currency).''.Tools::displayPrice($this->t8 / $intervalAvg, $currency).'
    '.$this->l('Forecast').''.(int)($this->t1 * $prop30).''.(int)($this->t2 * $prop30).''.(int)($this->t3 * $prop30).''.(int)($this->t4 * $prop30).'----'.Tools::displayPrice($this->t7 * $prop30, $currency).''.Tools::displayPrice($this->t8 * $prop30, $currency).'
    +
    '; + + $ca = $this->getRealCA(); + + $sql = 'SELECT COUNT(DISTINCT c.id_guest) + FROM '._DB_PREFIX_.'connections c + WHERE c.date_add BETWEEN '.ModuleGraph::getDateBetween() + .$whereConnection; + $visitors = Db::getInstance()->getValue($sql); + + $sql = 'SELECT COUNT(DISTINCT id_customer) + FROM '._DB_PREFIX_.'connections c + INNER JOIN '._DB_PREFIX_.'guest g ON c.id_guest = g.id_guest + WHERE c.id_customer != 0 + AND c.date_add BETWEEN '.ModuleGraph::getDateBetween() + .$whereConnection; + $customers = Db::getInstance()->getValue($sql); + + $sql = 'SELECT COUNT(*) + FROM '._DB_PREFIX_.'cart + WHERE id_cart IN ( + SELECT id_cart FROM '._DB_PREFIX_.'cart_product + ) AND ( + date_add BETWEEN '.ModuleGraph::getDateBetween().' OR date_upd BETWEEN '.ModuleGraph::getDateBetween().' + )'.$whereCart; + $carts = Db::getInstance()->getValue($sql); + + $sql = 'SELECT COUNT(*) + FROM '._DB_PREFIX_.'cart + WHERE id_cart IN ( + SELECT id_cart FROM '._DB_PREFIX_.'cart_product + ) AND id_address_invoice != 0 + AND ( + date_add BETWEEN '.ModuleGraph::getDateBetween().' OR date_upd BETWEEN '.ModuleGraph::getDateBetween().' + )'.$whereCart; + $fullcarts = Db::getInstance()->getValue($sql); + + $sql = 'SELECT COUNT(*) + FROM '._DB_PREFIX_.'orders o + WHERE o.valid = 1 + AND o.date_add BETWEEN '.ModuleGraph::getDateBetween() + .$whereOrder; + $orders = Db::getInstance()->getValue($sql); + + $this->_html .= '
     
    +
    '.$this->l('Conversion').' + '.$this->l('Visitors').'
    '.$visitors.'
    + +
    '.round(100 * $customers / max(1, $visitors)).' %
    +
    '.round(100 * $carts / max(1, $visitors)).' % +
    + + '.$this->l('Accounts').'
    '.$customers.'
    + '.$this->l('Carts').'
    '.$carts.' +
    + +
    '.round(100 * $fullcarts / max(1, $customers)).' %
    +
    '.round(100 * $fullcarts / max(1, $carts)).' %
    +
    + '.$this->l('Full carts').'
    '.$fullcarts.'
    +
    '.round(100 * $orders / max(1, $fullcarts)).' %
    + '.$this->l('Orders').'
    '.$orders.'
    +

    + '.$this->l('Registered visitors').' + + '.round(100 * $orders / max(1, $customers), 2).' % + + '.$this->l('Orders').' +
    + '.$this->l('Visitors').' + + '.round(100 * $orders / max(1, $visitors), 2).' % + + '.$this->l('Orders').' +
     
    + '.$this->l('Turn your visitors into money:').' +
    '.$this->l('Each visitor yields').' '.Tools::displayPrice($ca['ventil']['total'] / max(1, $visitors), $currency).'. +
    '.$this->l('Each registered visitor yields').' '.Tools::displayPrice($ca['ventil']['total'] / max(1, $customers), $currency).'. +
    '; + + $from = strtotime($employee->stats_date_from.' 00:00:00'); + $to = strtotime($employee->stats_date_to.' 23:59:59'); + $interval = ($to - $from) / 60 / 60 / 24; + $prop5000 = 5000 / 30 * $interval; + + $this->_html .= ' +
     
    '; + $this->_html .= '
    '.$this->l('Payment distibution').' +
    + + '.$this->l('Zone:').' +
    + + '; + foreach ($ca['payment'] as $payment) + $this->_html .= ' + + + + + + '; + $this->_html .= ' +
    '.$this->l('Module').''.$this->l('Count').''.$this->l('Total').''.$this->l('Cart').'
    '.$payment['module'].''.(int)($payment['nb']).'
    '.number_format((100 * $payment['nb'] / $ca['ventil']['nb']), 1, '.', ' ').' %
    '.Tools::displayPrice($payment['total'], $currency).'
    '.number_format((100 * $payment['total'] / $ca['ventil']['total']), 1, '.', ' ').' %
    '.Tools::displayPrice($payment['cart'], $currency).'
    +
    +
     
    +
    '.$this->l('Category distribution').' +
    + + '.$this->l('Zone:').' +
    + + '; + foreach ($ca['cat'] as $catrow) + $this->_html .= ' + + + + + + + + '; + $this->_html .= ' +
    '.$this->l('Category').''.$this->l('Count').''.$this->l('Sales').''.$this->l('% Count').''.$this->l('% Sales').''.$this->l('Avg price').'
    '.(empty($catrow['name']) ? $this->l('Unknown') : $catrow['name']).''.$catrow['orderQty'].''.Tools::displayPrice($catrow['orderSum'], $currency).''.number_format((100 * $catrow['orderQty'] / $this->t4), 1, '.', ' ').'%'.number_format((100 * $catrow['orderSum'] / $ca['ventil']['total']), 1, '.', ' ').'%'.Tools::displayPrice($catrow['priveAvg'], $currency).'
    +
    +
     
    +
    '.$this->l('Language distribution').' + + '; + foreach ($ca['lang'] as $ophone => $amount) + { + $percent = (int)($ca['langprev'][$ophone]) ? number_format((100 * $amount / $ca['langprev'][$ophone]) - 100, 1, '.', ' ') : '∞'; + $this->_html .= ' + + + + + + + '; + } + $this->_html .= ' +
    '.$this->l('Customers').''.$this->l('Sales').''.$this->l('%').''.$this->l('Growth').'
    '.$ophone.''.Tools::displayPrice($amount, $currency).''.($ca['ventil']['total'] ? number_format((100 * $amount / $ca['ventil']['total']), 1, '.', ' ').'%' : '-').''.(($percent > 0 OR $percent == '∞') ? '' : ' ').''.(($percent > 0 OR $percent == '∞') ? '+' : '').$percent.'%
    +
    +
     
    +
    '.$this->l('Zone distribution').' + + '; + foreach ($ca['zones'] as $zone) + $this->_html .= ' + + + + + + + '; + $this->_html .= ' +
    '.$this->l('Zone').''.$this->l('Count').''.$this->l('Total').''.$this->l('% Count').''.$this->l('% Sales').'
    '.(isset($zone['name']) ? $zone['name'] : $this->l('Undefined')).''.(int)($zone['nb']).''.Tools::displayPrice($zone['total'], $currency).''.number_format((100 * $zone['nb'] / $ca['ventil']['nb']), 1, '.', ' ').'%'.number_format((100 * $zone['total'] / $ca['ventil']['total']), 1, '.', ' ').'%
    +
    +
     
    +
    '.$this->l('Currency distribution').' +
    + + '.$this->l('Zone:').' +
    + + '; + foreach ($ca['currencies'] as $currencyRow) + $this->_html .= ' + + + + + + + '; + $this->_html .= ' +
    '.$this->l('Currency').''.$this->l('Count').''.$this->l('Sales (converted)').''.$this->l('% Count').''.$this->l('% Sales').'
    '.$currencyRow['name'].''.(int)($currencyRow['nb']).''.Tools::displayPrice($currencyRow['total'], $currency).''.number_format((100 * $currencyRow['nb'] / $ca['ventil']['nb']), 1, '.', ' ').'%'.number_format((100 * $currencyRow['total'] / $ca['ventil']['total']), 1, '.', ' ').'%
    +
    +
     
    +
    '.$this->l('Attribute distribution').' + + '; + foreach ($ca['attributes'] as $attribut) + $this->_html .= ' + + + + + '; + $this->_html .= '
    '.$this->l('Group').''.$this->l('Attribute').''.$this->l('Count').'
    '.$attribut['gname'].''.$attribut['aname'].''.(int)($attribut['total']).'
    +
    +
    '; + + return $this->_html; + } + + private function getRealCA() + { + global $cookie; + + $employee = new Employee($cookie->id_employee); + $ca = array(); + + // Prepare SQL clause to filter per shop + $whereOrder = $where = $join = $joinLang = $whereLang = ''; + if ($this->shopID || $this->shopGroupID) + { + $joinLang = ' LEFT JOIN '._DB_PREFIX_.'lang_shop ls ON ls.id_lang = l.id_lang '; + if ($this->shopID) + { + $whereOrder = ' AND o.id_shop = '.$this->shopID; + $whereLang = ' AND ls.id_shop = '.$this->shopID; + } + else if ($this->shopGroupID) + { + $whereOrder = ' AND o.id_group_shop = '.$this->shopGroupID; + $whereLang = ' AND ls.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.')'; + } + } + + if ((int)$cookie->stats_id_zone) + { + $join = ' LEFT JOIN `'._DB_PREFIX_.'address` a ON o.id_address_invoice = a.id_address LEFT JOIN `'._DB_PREFIX_.'country` co ON co.id_country = a.id_country'; + $where = ' AND co.id_zone = '.$cookie->stats_id_zone.' '; + } + + $sql = 'SELECT SUM(od.`product_price` * od.`product_quantity` / o.conversion_rate) as orderSum, COUNT(*) AS orderQty, cl.name, AVG(od.`product_price` / o.conversion_rate) as priveAvg + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order + LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = od.product_id + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.id_category_default = cl.id_category AND cl.id_lang = '.(int)($cookie->id_lang).') + '.$join.' + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$where.' + '.$whereOrder.' + GROUP BY p.id_category_default'; + $ca['cat'] = Db::getInstance()->ExecuteS($sql); + uasort($ca['cat'], 'statsforecast_sort'); + + $langValues = ''; + $sql = 'SELECT l.id_lang, l.iso_code + FROM `'._DB_PREFIX_.'lang` l + '.$joinLang.' + WHERE l.active = 1 + '.$whereLang; + $languages = Db::getInstance()->ExecuteS($sql); + foreach ($languages as $language) + $langValues .= 'SUM(IF(o.id_lang = '.(int)$language['id_lang'].', total_products / o.conversion_rate, 0)) as '.pSQL($language['iso_code']).','; + $langValues = rtrim($langValues, ','); + + if ($langValues) + { + $sql = 'SELECT '.$langValues.' + FROM `'._DB_PREFIX_.'orders` o + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereOrder; + $ca['lang'] = Db::getInstance()->getRow($sql); + arsort($ca['lang']); + + $sql = 'SELECT '.$langValues.' + FROM `'._DB_PREFIX_.'orders` o + WHERE o.valid = 1 + AND ADDDATE(o.`invoice_date`, interval 30 day) BETWEEN \''.$employee->stats_date_from.' 00:00:00\' AND \''.min(date('Y-m-d H:i:s'), $employee->stats_date_to.' 23:59:59').'\' + '.$whereOrder; + $ca['langprev'] = Db::getInstance()->getRow($sql); + } + else + { + $ca['lang'] = array(); + $ca['langprev'] = array(); + } + + $sql = 'SELECT module, SUM(total_products / o.conversion_rate) as total, COUNT(*) as nb, AVG(total_products / o.conversion_rate) as cart + FROM `'._DB_PREFIX_.'orders` o + '.$join.' + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$where.' + '.$whereOrder.' + GROUP BY o.module + ORDER BY total DESC'; + $ca['payment'] = Db::getInstance()->ExecuteS($sql); + + $sql = 'SELECT z.name, SUM(o.total_products / o.conversion_rate) as total, COUNT(*) as nb + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'address` a ON o.id_address_invoice = a.id_address + LEFT JOIN `'._DB_PREFIX_.'country` c ON c.id_country = a.id_country + LEFT JOIN `'._DB_PREFIX_.'zone` z ON z.id_zone = c.id_zone + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereOrder.' + GROUP BY c.id_zone + ORDER BY total DESC'; + $ca['zones'] = Db::getInstance()->ExecuteS($sql); + + $sql = 'SELECT cu.name, SUM(o.total_products / o.conversion_rate) as total, COUNT(*) as nb + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'currency` cu ON o.id_currency = cu.id_currency + '.$join.' + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$where.' + '.$whereOrder.' + GROUP BY o.id_currency + ORDER BY total DESC'; + $ca['currencies'] = Db::getInstance()->ExecuteS($sql); + + $sql = 'SELECT SUM(total_products / o.conversion_rate) as total, COUNT(*) AS nb + FROM `'._DB_PREFIX_.'orders` o + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereOrder; + $ca['ventil'] = Db::getInstance()->getRow($sql); + + $sql = 'SELECT /*pac.id_attribute,*/ agl.name as gname, al.name as aname, COUNT(*) as total + FROM '._DB_PREFIX_.'orders o + LEFT JOIN '._DB_PREFIX_.'order_detail od ON o.id_order = od.id_order + INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON od.product_attribute_id = pac.id_product_attribute + INNER JOIN '._DB_PREFIX_.'attribute a ON pac.id_attribute = a.id_attribute + INNER JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (a.id_attribute_group = agl.id_attribute_group AND agl.id_lang = '.(int)($cookie->id_lang).') + INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (a.id_attribute = al.id_attribute AND al.id_lang = '.(int)($cookie->id_lang).') + WHERE o.valid = 1 + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween().' + '.$whereOrder.' + GROUP BY pac.id_attribute'; + $ca['attributes'] = Db::getInstance()->ExecuteS($sql); + + return $ca; + } +} + +function statsforecast_sort($a, $b) +{ + if ($a['orderSum'] == $b['orderSum']) + return 0; + return ($a['orderSum'] > $b['orderSum']) ? -1 : 1; +} \ No newline at end of file diff --git a/modules/statsgeolocation/config.php b/modules/statsgeolocation/config.php new file mode 100644 index 000000000..a87da9123 --- /dev/null +++ b/modules/statsgeolocation/config.php @@ -0,0 +1,110 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); + +function show_countries($id_lang, $nb_by_line = 7) +{ + if (!is_numeric($id_lang) || !is_numeric($nb_by_line)) + return ("error"); + + $output = ' + '; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT cl.`id_country`, `name`, `iso_code` FROM `'._DB_PREFIX_.'country_lang` cl + LEFT JOIN `'._DB_PREFIX_.'country` c ON c.`id_country` = cl.`id_country` + WHERE `id_lang` = \''.(int)($id_lang).'\' ORDER BY `name` ASC;'); + $separator = 0; + foreach ($result as $index => $row) + { + if ($separator) + $output .= ($separator % $nb_by_line) ? ' | ' : '
    '; + $output .= ''.$row['name'] . ' (' . $row['iso_code'] . ')'; + $separator++; + } + return ($output); +} + +function show_buttons($id_lang, $id_country) +{ + if (!is_numeric($id_lang) || !is_numeric($id_country)) + return ("error"); + $coord_x = -1; + $coord_y = -1; + $output = ' + '; + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT cl.`id_country`, `name`, `iso_code`, `x`, `y` FROM `'._DB_PREFIX_.'country_lang` cl + LEFT JOIN `'._DB_PREFIX_.'country` c ON c.`id_country` = cl.`id_country` + LEFT JOIN `'._DB_PREFIX_.'location_coords` lc ON c.`id_country` = lc.`id_country` + WHERE `id_lang` = \''.(int)($id_lang).'\' AND cl.`id_country`= \''.(int)($id_country).'\';'); + if (isset($result[0]['id_country'])) + { + $output .= $result[0]['name'].' ('.$result[0]['iso_code'].')'; + if (isset($result[0]['x']) && isset($result[0]['y'])) + { + $coord_x = $result[0]['x']; + $coord_y = $result[0]['y']; + } + } + $output .= ' + +
    +
    '; + return ($output); +} + +function insert_coords($id_lang, $id_country, $x, $y) +{ + if (!is_numeric($id_lang) || !is_numeric($id_country) || !is_numeric($x) || !is_numeric($y)) + return ("error"); + Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'location_coords` WHERE `id_country` = \''.$id_country.'\';'); + if (!Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'location_coords` (`x`, `y`, `id_country`) VALUES (\''.(int)($x).'\', \''.(int)($y).'\', \''.(int)($id_country).'\');')) + echo("error while inserting data
    "); + return (show_countries($id_lang)); +} + + +$option = Tools::getValue('opt', 0); +$id_lang = Tools::getValue('id_lang'); + +if ($option == 1) +{ + echo show_countries($id_lang); +} +else if ($option == 2) +{ + $id_country = Tools::getValue('id_country'); + echo show_buttons($id_lang, $id_country); +} +else if ($option == 3) +{ + $id_country = Tools::getValue('id_country'); + $x = Tools::getValue('x'); + $y = Tools::getValue('y'); + echo insert_coords($id_lang, $id_country, $x, $y); +} + + diff --git a/modules/statsgeolocation/config.xml b/modules/statsgeolocation/config.xml new file mode 100755 index 000000000..a4e4b4621 --- /dev/null +++ b/modules/statsgeolocation/config.xml @@ -0,0 +1,12 @@ + + + statsgeolocation + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/statsgeolocation/de.php b/modules/statsgeolocation/de.php new file mode 100644 index 000000000..576972016 --- /dev/null +++ b/modules/statsgeolocation/de.php @@ -0,0 +1,20 @@ +statsgeolocation_323d4eb70b252acb4a04eaf9e0882597'] = 'Geotargeting'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_621bd20bc26d0f67bacffc7785616372'] = 'Anzeige des Kundenstandorts'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60503475047260bb2e6b815e3dcad910'] = 'Dieses Modul zeigt die Länderverteilung der Kunden durch Punkte in verschiedenen Größen auf der Weltkarte an. Zeigen Sie den Ruf Ihrer Webseite rund um die Welt an sowie die Kontinente, die Sie noch nicht erobert haben.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e346362c256cd1ff6efd70288f769d89'] = 'Ein Tor zur Welt'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_1b625393440dce51a25ccb43a38ddf67'] = 'Hinzufügen neuer Sprachen zu Ihrem Shop, wenn Sie sehen, dass ein ausreichender Teil Ihrer Kunden aus dem Ausland kommt.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_a2f24ad94046ee38db78c336564acd30'] = 'Vergrößern Sie Ihre Versand-Bereich, um der potenziellen Nachfrage gerecht zu werden.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_25e8f2fd2871c8423bbe4e254066cd98'] = 'Bitte warten ...'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e7173e323991c8c33ad2dae1d528fc2e'] = 'Koordinaten aktualisieren'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60e421611f85e8faa9f6950ce71dab7a'] = 'Klicken Sie auf einen Ländernamen und bestimmen Sie seine Position auf der Karte'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_64d80b7a177f4bd0a1f1dde09741852d'] = 'Klicken Sie auf die Karte, um die Position von einzustellen:'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_dc25612aeb2ba1c2705fc2e9c947f084'] = 'Fehler: Sie müssen auf die Karte klicken oder auf die Schaltfläche Abbrechen'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ea4788705e6873b424c65e91c2846b19'] = 'Abbrechen'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ad3d06d03d94223fa652babc913de686'] = 'Bestätigen'; + +?> \ No newline at end of file diff --git a/modules/statsgeolocation/drawer.php b/modules/statsgeolocation/drawer.php new file mode 100644 index 000000000..4f136d74b --- /dev/null +++ b/modules/statsgeolocation/drawer.php @@ -0,0 +1,90 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(dirname(__FILE__).'/../../config/config.inc.php'); +$img_path="./img/map.png"; + +function loadBaseImage($img_path) +{ + $img_size = getimagesize($img_path); + $img_png = imagecreatefrompng($img_path); if (!$img_png) exit(1); + + $img_tc = imagecreatetruecolor($img_size[0], $img_size[1]); + imagealphablending($img_tc, false); + imagesavealpha($img_tc, true); + imagecopy($img_tc, $img_png, 0, 0, 0, 0, $img_size[0], $img_size[1]); + imagedestroy($img_png); + + if (function_exists('imageantialias')) + imageantialias($img_tc, true); + return ($img_tc); +} + +function drawImage($image) +{ + header("Content-type: image/png"); + imagepng($image); + imagedestroy($image); +} + +function drawCircle($image, $x, $y, $size) +{ + $color = imagecolorallocate($image, 255, 122, 56); + imagefilledellipse($image, $x, $y, $size, $size, $color); +} + +function drawCircles($image) +{ + $max = 12; + $min = 2; + $gap = ($max - $min); + $total = getTotalElements(); + $result = getCoords(); + + foreach ($result as $row) + drawCircle($image, $row['x'], $row['y'], $min + ($gap * ($row['total'] / $total))); +} + +function getTotalElements() +{ + $result = Db::getInstance()->ExecuteS('SELECT COUNT(`id_address`) as total FROM `'._DB_PREFIX_.'address` WHERE deleted = 0 AND id_customer IS NOT NULL AND id_customer != 0'); + return (isset($result[0]) ? $result[0]['total'] : 0); +} + +function getCoords() +{ + return (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT `x`, `y`, COUNT(`id_address`) AS total + FROM `'._DB_PREFIX_.'address` a + LEFT JOIN `'._DB_PREFIX_.'location_coords` lc ON lc.`id_country`=a.`id_country` + WHERE deleted = 0 AND id_customer IS NOT NULL AND id_customer != 0 + GROUP BY a.`id_country` + ORDER BY `total` DESC')); +} + +$image = loadBaseImage($img_path); +drawCircles($image); +drawImage($image); + diff --git a/modules/statsgeolocation/en.php b/modules/statsgeolocation/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsgeolocation/en.php @@ -0,0 +1,4 @@ +statsgeolocation_323d4eb70b252acb4a04eaf9e0882597'] = 'Loaclización'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_621bd20bc26d0f67bacffc7785616372'] = 'Muestre el origen de sus clientes'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60503475047260bb2e6b815e3dcad910'] = 'Este módulo muestra la distribución del país de sus clientes mostrando diversos puntos clasificados en el mapamundi mostrado abajo. Vea desde donde ven su tienda toda en el mundo y que continente no ha conquistado todavía.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e346362c256cd1ff6efd70288f769d89'] = 'Abrir al mundo'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_1b625393440dce51a25ccb43a38ddf67'] = 'Añada nuevos idiomas a su tienda si ve que gran parte de sus posibles clientes viene de un país extranjero.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_a2f24ad94046ee38db78c336564acd30'] = 'Aumente su área de envío para cubrir una demanda potencial.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_25e8f2fd2871c8423bbe4e254066cd98'] = 'Espere por favor..'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e7173e323991c8c33ad2dae1d528fc2e'] = 'Coordenadas de la actualización'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60e421611f85e8faa9f6950ce71dab7a'] = 'Haga clic sobre el país deseado para definir su posición en el mapa'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_64d80b7a177f4bd0a1f1dde09741852d'] = 'Haga clic en el mapa para definir la posición de:'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_dc25612aeb2ba1c2705fc2e9c947f084'] = 'Error: tiene que hacer clic en el mapa o en el botón cancelar'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ea4788705e6873b424c65e91c2846b19'] = 'Cancelar'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ad3d06d03d94223fa652babc913de686'] = 'Validar'; diff --git a/modules/statsgeolocation/fr.php b/modules/statsgeolocation/fr.php new file mode 100644 index 000000000..e8e8549aa --- /dev/null +++ b/modules/statsgeolocation/fr.php @@ -0,0 +1,18 @@ +statsgeolocation_323d4eb70b252acb4a04eaf9e0882597'] = 'Géolocalisation'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_621bd20bc26d0f67bacffc7785616372'] = 'Affiche la provenance de vos clients'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60503475047260bb2e6b815e3dcad910'] = 'Ce module montre la répartition de vos clients par un point plus ou moins gros sur la carte ci-dessous. Constatez la popularité qu\'a votre boutique à l\'échelle du monde et sachez quels continents vous n\'avez pas encore conquis.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e346362c256cd1ff6efd70288f769d89'] = 'S\'ouvrir au monde'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_1b625393440dce51a25ccb43a38ddf67'] = 'Ajoutez une nouvelle langue à votre boutique si vous constatez que suffisamment de clients viennent d\'un autre pays.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_a2f24ad94046ee38db78c336564acd30'] = 'Elargissez votre zone de livraison pour répondre à une potentielle demande.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_25e8f2fd2871c8423bbe4e254066cd98'] = 'Patientez...'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e7173e323991c8c33ad2dae1d528fc2e'] = 'Mise à jour des coordonnées'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60e421611f85e8faa9f6950ce71dab7a'] = 'Cliquez sur le nom d\'un pays puis sur la carte afin de définir son emplacement'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_64d80b7a177f4bd0a1f1dde09741852d'] = 'Cliquez sur la carte pour mettre à jour les coordonnées de :'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_dc25612aeb2ba1c2705fc2e9c947f084'] = 'Erreur : vous devez cliquer sur la carte ou sur le bouton Annuler'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ea4788705e6873b424c65e91c2846b19'] = 'Annuler'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ad3d06d03d94223fa652babc913de686'] = 'Valider'; diff --git a/modules/statsgeolocation/img/cross.png b/modules/statsgeolocation/img/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..c53f6810f180ab948dbaa5bf234a2878190df46a GIT binary patch literal 1212 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uGBwbBK{D2fox}&cn1H<|g=B!;W85o!u0(?ST zf#Sx-#z1lujE2An41uTFpH?w2Ffx<``33(U*?=MVJG&|{2}qQ#RpY9R67_2 ynO-v+DV|bX=3p7|B;d=!S)Ez(ld=P1*%*GSRd0&k-TDfY(mY-LT-G@yGywn#>NQvZ literal 0 HcmV?d00001 diff --git a/modules/statsgeolocation/img/map.png b/modules/statsgeolocation/img/map.png new file mode 100644 index 0000000000000000000000000000000000000000..74504a206aa175b68e46260b9443d4d8e354ff95 GIT binary patch literal 66827 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'] = 'Geolocalizzazione'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_621bd20bc26d0f67bacffc7785616372'] = 'Mostra l\'origine dei tuoi clienti '; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60503475047260bb2e6b815e3dcad910'] = 'Questo modulo indica la distribuzione dei Paesi dei tuoi clienti, mostrando i diversi punti di grandezza sulla mappa mondiale sotto. Vedi la fama del tuo sito web in tutto il mondo e quale continente non hai ancora conquistato.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e346362c256cd1ff6efd70288f769d89'] = 'Apriti al mondo'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_1b625393440dce51a25ccb43a38ddf67'] = 'Aggiungi nuove lingue al tuo negozio se si vede che una parte sufficiente dei tuoi clienti provengono da un paese straniero.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_a2f24ad94046ee38db78c336564acd30'] = 'Amplia l\'area di spedizione per soddisfare la domanda potenziale.'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_25e8f2fd2871c8423bbe4e254066cd98'] = 'Si prega di attendere ...'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_e7173e323991c8c33ad2dae1d528fc2e'] = 'Aggiorna le coordinate'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_60e421611f85e8faa9f6950ce71dab7a'] = 'Clicca sul nome di un paese e definisci la sua posizione sulla mappa'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_64d80b7a177f4bd0a1f1dde09741852d'] = 'Clicca sulla mappa per impostare la posizione di:'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_dc25612aeb2ba1c2705fc2e9c947f084'] = 'Errore: devi cliccare sulla mappa o sul pulsante Annulla'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ea4788705e6873b424c65e91c2846b19'] = 'Annulla'; +$_MODULE['<{statsgeolocation}prestashop>statsgeolocation_ad3d06d03d94223fa652babc913de686'] = 'Convalida'; + +?> \ No newline at end of file diff --git a/modules/statsgeolocation/logo.gif b/modules/statsgeolocation/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ae4d1d374498471b7287bef546a44283bb7cc54 GIT binary patch literal 1042 zcmds${Zo<$0D$pqC$&|kuC1=^@XV|0YIVD|+efuzeyuf+>^fVuS}u2+njV%Nd2|PD zexS}2E0r_#h|CO(d3;Er0`m3pksu(vf$$>dn+S*`A-wUi^>6h21<&)tQ}9FnS6^RD zMWv$FI4BMe;P6$fQ3Z>w;0e@ny#w~FL?VdB94y~;PgFy&_M%d%NWpjJ!HvfT;s5C+T`>C zRv%lt#MXM4z#?FVU;pnHj)cQu7=|Y$va@Nc5-1c(E{}hqruEuQ`t^1m{?3F*rv9y& zd#d3nj?6Ep8_lbIe1B-9joNd*ntJ0FTOygNYI=}IU}LY1d{;AkxRQRTtfzu_yW;9U z1S0jAmNsGxG)ZVwD zZ=XP+{ir|J??7Wnq@?8ZO*?TSQPR5g8GCVsEjh_4n=!fV2gum>-v21AR5@@lxpC8{ zM@Z<*Qt8pO?Bl&hJFv11Tlbw4lD2$5(7Nqlxn+!;)!6pQp*qn@jwhuZgKbF7ES4%; zvkIxZf0i&Pox5=K!XE5{W0bT4<~cDnPrdcCUxdV@^nA_7pOaz+vc5dv=1&XqN>^e|3 t!=aqqRo{1nydk?h<5BTo(FsQVo;$;*m}dlaUl1|O)1$wi_yCRi_CGg~_&NXp literal 0 HcmV?d00001 diff --git a/modules/statsgeolocation/statsgeolocation.js b/modules/statsgeolocation/statsgeolocation.js new file mode 100644 index 000000000..df51e1f7b --- /dev/null +++ b/modules/statsgeolocation/statsgeolocation.js @@ -0,0 +1,236 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function wait() +{ + var wait = document.getElementById('wait').value; + if (typeof(wait) == 'number') //should never appear... + wait="wait..."; + document.getElementById("belowmap").innerHTML=wait; +} + +/** + * Launch the url page in background and write its content in the selected div + */ +function doAjax(dataform) +{ + $.ajax({ + url: '../modules/statsgeolocation/config.php', + type: 'POST', + data: dataform, + dataType: 'html', + error: function() + { + $("#belowmap").html("Cannot load countries' list"); + }, + success: function(data) + { + $("#belowmap").html(data); + } + }); +} + +/** + * Show the cross in the map + */ +function displayMarker(x, y) +{ + var m = $("#marker").get(0); + var size = $('#marker_size').val(); + + m.style.display=''; + m.style.width=size+'px'; + m.style.height=size+'px'; + m.style.left=(x - (size/2))+'px'; + m.style.top=(y - (size/2))+'px'; + $("#form_x").val(x); + $("#form_y").val(y); +} + +/** + * For jQuery to register events on the different buttons + */ +_registerClickButtons=function() +{ + var x=$('#hiddenx').val(); + var y=$('#hiddeny').val(); + if (x != -1 && y != -1) + displayMarker(x, y); + $('#selectinfo').html($('#lang_info').val()); + $('#cancel_id').val($('#lang_cancel').val()); + $('#validate_id').val($('#lang_validate').val()); + $("#cancel_id").click(function() + { + var dataform="opt=1&id_lang="+$('#id_lang').val(); + wait(); + $('#opt').val(1); + document.getElementById("marker").style.display='none'; + doAjax(dataform); + }); + $("#validate_id").click(function() + { + if (document.getElementById("marker").style.display == 'none') + alert(document.getElementById("lang_error").value); + else + { + var dataform="opt=3&id_lang="+$('#id_lang').val()+"&id_country="+document.getElementById("country_selected").value; + dataform +="&x="+document.getElementById("form_x").value+"&y="+document.getElementById("form_y").value; + wait(); + $('#opt').val(1); + document.getElementById("marker").style.display='none'; + doAjax(dataform); + } + }); +} + +/** + * For jQuery to register events while clicking on a country + */ +_registerClickOnCountry=function() +{ + var dataform="opt=2&id_lang="+$('#id_lang').val(); + $('#country_selected').val(0); + + $(".country").click(function() + { + wait(); + $('#country_selected').val($(this).attr("id")); + dataform += "&id_country="+$(this).attr("id"); + doAjax(dataform); + }); +} + +/** + * The first thing jQuery should do once the fist page is loaded +*/ +_firstOfAll=function() +{ + var dataform="opt=1&id_lang=" + $('#id_lang').val(); + doAjax(dataform); +}; + +/** + * This is what happens when someone is doing a mouse click on the map + */ +function clickOnImage(event) +{ + if ($("#country_selected").val() != '0') + { + var e = event || window.event; + var pos = getRelativeCoordinates(event, $("#reference").get(0)); + var m = $("#marker").get(0); + displayMarker(pos.x, pos.y); + } +} + +/** + * Retrieve the absolute coordinates of an element. + * + * @param element + * A DOM element. + * @return + * A hash containing keys 'x' and 'y'. + */ +function getAbsolutePosition(element) +{ + var r = { x: element.offsetLeft, y: element.offsetTop }; + if (element.offsetParent) + { + var tmp = getAbsolutePosition(element.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +/** + * Retrieve the coordinates of the given event relative to the center + * of the widget. + * + * @param event + * A mouse-related DOM event. + * @param reference + * A DOM element whose position we want to transform the mouse coordinates to. + * @return + * A hash containing keys 'x' and 'y'. + */ +function getRelativeCoordinates(event, reference) +{ + var x, y; + event = event || window.event; + var el = event.target || event.srcElement; + + if (!window.opera && typeof event.offsetX != 'undefined') + { + // Use offset coordinates and find common offsetParent + var pos = { x: event.offsetX, y: event.offsetY }; + + // Send the coordinates upwards through the offsetParent chain. + var e = el; + while (e) + { + e.mouseX = pos.x; + e.mouseY = pos.y; + pos.x += e.offsetLeft; + pos.y += e.offsetTop; + e = e.offsetParent; + } + + // Look for the coordinates starting from the reference element. + var e = reference; + var offset = { x: 0, y: 0 } + while (e) + { + if (typeof e.mouseX != 'undefined') + { + x = e.mouseX - offset.x; + y = e.mouseY - offset.y; + break; + } + offset.x += e.offsetLeft; + offset.y += e.offsetTop; + e = e.offsetParent; + } + + // Reset stored coordinates + e = el; + while (e) + { + e.mouseX = undefined; + e.mouseY = undefined; + e = e.offsetParent; + } + } + else + { + // Use absolute coordinates + var pos = getAbsolutePosition(reference); + x = event.pageX - pos.x; + y = event.pageY - pos.y; + } + // Subtract distance to middle + return { x: x, y: y }; +} diff --git a/modules/statsgeolocation/statsgeolocation.php b/modules/statsgeolocation/statsgeolocation.php new file mode 100644 index 000000000..43fb6aff2 --- /dev/null +++ b/modules/statsgeolocation/statsgeolocation.php @@ -0,0 +1,193 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsGeoLocation extends Module +{ + private $_map_path = 'img/map.png'; + private $_cross_path = 'img/cross.png'; + + function __construct() + { + $this->name = 'statsgeolocation'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Geolocation'); + $this->description = $this->l('Display your customers\' origin'); + } + + function install() + { + $countries = array('AT' => array('x' => 294, 'y' => 68), + 'AU' => array('x' => 534, 'y' => 228), + 'BE' => array('x' => 276, 'y' => 62), + 'BO' => array('x' => 135, 'y' => 210), + 'CA' => array('x' => 84, 'y' => 45), + 'CH' => array('x' => 281, 'y' => 69), + 'CI' => array('x' => 253, 'y' => 156), + 'CN' => array('x' => 470, 'y' => 99), + 'CZ' => array('x' => 293, 'y' => 63), + 'DE' => array('x' => 285, 'y' => 61), + 'DK' => array('x' => 284, 'y' => 51), + 'ES' => array('x' => 260, 'y' => 85), + 'FI' => array('x' => 310, 'y' => 35), + 'FR' => array('x' => 271, 'y' => 69), + 'GB' => array('x' => 265, 'y' => 55), + 'GR' => array('x' => 308, 'y' => 87), + 'HK' => array('x' => 491, 'y' => 123), + 'IE' => array('x' => 253, 'y' => 58), + 'IL' => array('x' => 334, 'y' => 106), + 'IT' => array('x' => 292, 'y' => 80), + 'JP' => array('x' => 531, 'y' => 92), + 'KR' => array('x' => 509, 'y' => 93), + 'LU' => array('x' => 277, 'y' => 63), + 'NG' => array('x' => 282, 'y' => 153), + 'NL' => array('x' => 278, 'y' => 58), + 'NO' => array('x' => 283, 'y' => 41), + 'NZ' => array('x' => 590, 'y' => 264), + 'PL' => array('x' => 300, 'y' => 59), + 'PT' => array('x' => 251, 'y' => 86), + 'TG' => array('x' => 267, 'y' => 154), + 'SE' => array('x' => 294, 'y' => 40), + 'SG' => array('x' => 475, 'y' => 169), + 'US' => array('x' => 71, 'y' => 87), + 'ZA' => array('x' => 311, 'y' => 239)); + + if ( !parent::install() OR !$this->registerHook('AdminStatsModules')) + return false; + if (!Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'location_coords` ( + `id_location_coords` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `x` int(4) NOT NULL, + `y` int(4) NOT NULL, + `id_country` INTEGER UNSIGNED NOT NULL, + PRIMARY KEY(`id_location_coords`) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8')) + return false; + + $flag = 0; + $query = 'INSERT INTO `'._DB_PREFIX_.'location_coords` (`x`, `y`, `id_country`) VALUES '; + $result = Db::getInstance()->ExecuteS('SELECT `id_country`, `iso_code` FROM `'._DB_PREFIX_.'country`;'); + foreach ($result as $index => $row) + { + if (isset($countries[$row['iso_code']])) + { + if ($flag) + $query .= ', '; + $query .= '(\''.$countries[$row['iso_code']]['x'].'\', \''.$countries[$row['iso_code']]['y'].'\', \''.$row['id_country'].'\')'; + $flag = 1; + } + } + return Db::getInstance()->Execute($query.';'); + } + + function uninstall() + { + if (!parent::uninstall()) + return false; + return (Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'location_coords`')); + } + + function hookAdminStatsModules() + { + $this->_html = ' +
    '.$this->displayName.' +
    +

    '.$this->l('This module shows the distribution of the countries of your customers by displaying different sized points on the worldmap below. See the fame of your website all around the world and which continent you have yet to conquer.').'

    +
    +

    + +

    + +

    +
    '.$this->l('Guide').' +

    '.$this->l('Open to the world').'

    +

    +

      +
    • '.$this->l('Add new languages to your shop if you see that a sufficient part of your customers come from a foreign country.').'
    • +
    • '.$this->l('Enlarge your shipping area to meet the potential demand.').'
    • +
    +

    +
    '; + return $this->_html; + } + + public function getContent() + { + $output = '

    '.$this->displayName.'

    '; + return $output.$this->displayForm(); + } + + public function displayForm() + { + global $cookie; + + $map_size; + $cross_size; + $id_lang = (isset($cookie->id_lang) ? (int)($cookie->id_lang) : Configuration::get('PS_LANG_DEFAULT')); + $wait = $this->l('Please wait...'); + + if ((file_exists('../modules/'.$this->name.'/'.$this->_map_path) == FALSE) || + (file_exists('../modules/'.$this->name.'/'.$this->_cross_path) == FALSE) || + (!($map_size = getimagesize('../modules/'.$this->name.'/'.$this->_map_path))) || + (!($cross_size = getimagesize('../modules/'.$this->name.'/'.$this->_cross_path)))) + return ("Error: cannot load images"); + + $output = ' + + +
    '.$this->l('Update coordinates').' +
    '.$this->l('Click on a country\'s name and define its position on the map').'

    +
    + +
    +
    '.$wait.'
    + + + + + + + + + + + + + +
    '; + return $output; + } +} + diff --git a/modules/statslive/config.xml b/modules/statslive/config.xml new file mode 100755 index 000000000..fb278a004 --- /dev/null +++ b/modules/statslive/config.xml @@ -0,0 +1,12 @@ + + + statslive + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statslive/de.php b/modules/statslive/de.php new file mode 100644 index 000000000..918c4d020 --- /dev/null +++ b/modules/statslive/de.php @@ -0,0 +1,24 @@ +statslive_fa55230e9791f2b71322869318a5f00f'] = 'Besucher online'; +$_MODULE['<{statslive}prestashop>statslive_b8a5ea9b6e7f2d0b56fbb18e5b6b9246'] = 'Zeigt eine Liste der Kunden und Besucher, die zur Zeit online sind'; +$_MODULE['<{statslive}prestashop>statslive_fd42d96861238b1cd5859585c4351eca'] = 'Sie müssen die Option \"Seitenaufrufe für jeden Kunden\" im \"Statistik Datamining\"-Modul aktivieren, um die Seiten zu sehen, die derzeit von Ihren Kunden eingesehen werden.'; +$_MODULE['<{statslive}prestashop>statslive_5c948349bdf1a7a77ba54497d019e4ca'] = 'Kunden online'; +$_MODULE['<{statslive}prestashop>statslive_66c4c5112f455a19afde47829df363fa'] = 'Gesamt:'; +$_MODULE['<{statslive}prestashop>statslive_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statslive}prestashop>statslive_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statslive}prestashop>statslive_f88589c3e803217e3f6fe9d8e740e6e8'] = 'Aktuelle Seite'; +$_MODULE['<{statslive}prestashop>statslive_4351cfebe4b61d8aa5efa1d020710005'] = 'Anzeigen'; +$_MODULE['<{statslive}prestashop>statslive_bc59449a563c905a40eb3c871bb36d03'] = 'Zur Zeit sind keine Kunden online.'; +$_MODULE['<{statslive}prestashop>statslive_adb831a7fdd83dd1e2a309ce7591dff8'] = 'Besucher'; +$_MODULE['<{statslive}prestashop>statslive_a12a3079e14ced46e69ba52b8a90b21a'] = 'IP'; +$_MODULE['<{statslive}prestashop>statslive_38c50b731f70abc42c8baa3e7399b413'] = 'Seit'; +$_MODULE['<{statslive}prestashop>statslive_13aa8652e950bb7c4b9b213e6d8d0dc5'] = 'Aktuelle Seite'; +$_MODULE['<{statslive}prestashop>statslive_b6f05e5ddde1ec63d992d61144452dfa'] = 'Referrer'; +$_MODULE['<{statslive}prestashop>statslive_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Undefiniert'; +$_MODULE['<{statslive}prestashop>statslive_334c4a4c42fdb79d7ebc3e73b517e6f8'] = 'nichts'; +$_MODULE['<{statslive}prestashop>statslive_a55533db46597bee3cd16899c007257e'] = 'Zur Zeit sind keine Besucher online.'; + +?> \ No newline at end of file diff --git a/modules/statslive/en.php b/modules/statslive/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statslive/en.php @@ -0,0 +1,4 @@ +statslive_fa55230e9791f2b71322869318a5f00f'] = 'Visitantes en línea'; +$_MODULE['<{statslive}prestashop>statslive_b8a5ea9b6e7f2d0b56fbb18e5b6b9246'] = 'Mostrar la lista de clientes y visitantes conectados'; +$_MODULE['<{statslive}prestashop>statslive_fd42d96861238b1cd5859585c4351eca'] = 'Debe activar la opción \"páginas vistas por cada cliente\" en el módulo \"Recuperación de datos estadíisticos\" para visualizar las páginas consultadas por sus clientes.'; +$_MODULE['<{statslive}prestashop>statslive_5c948349bdf1a7a77ba54497d019e4ca'] = 'Clientes en línea'; +$_MODULE['<{statslive}prestashop>statslive_66c4c5112f455a19afde47829df363fa'] = 'Total:'; +$_MODULE['<{statslive}prestashop>statslive_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statslive}prestashop>statslive_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statslive}prestashop>statslive_f88589c3e803217e3f6fe9d8e740e6e8'] = 'Página en curso'; +$_MODULE['<{statslive}prestashop>statslive_4351cfebe4b61d8aa5efa1d020710005'] = 'Vista'; +$_MODULE['<{statslive}prestashop>statslive_2fb60e2c82df1e84e827b2f50661403e'] = 'No hay clientes en línea'; +$_MODULE['<{statslive}prestashop>statslive_adb831a7fdd83dd1e2a309ce7591dff8'] = 'Visitante'; +$_MODULE['<{statslive}prestashop>statslive_a12a3079e14ced46e69ba52b8a90b21a'] = 'IP'; +$_MODULE['<{statslive}prestashop>statslive_38c50b731f70abc42c8baa3e7399b413'] = 'Desde'; +$_MODULE['<{statslive}prestashop>statslive_13aa8652e950bb7c4b9b213e6d8d0dc5'] = 'Página en curso'; +$_MODULE['<{statslive}prestashop>statslive_b6f05e5ddde1ec63d992d61144452dfa'] = 'origen'; +$_MODULE['<{statslive}prestashop>statslive_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Indefinido'; +$_MODULE['<{statslive}prestashop>statslive_334c4a4c42fdb79d7ebc3e73b517e6f8'] = 'ninguno'; +$_MODULE['<{statslive}prestashop>statslive_a55533db46597bee3cd16899c007257e'] = 'No hay visitantes en línea ahora.'; diff --git a/modules/statslive/fr.php b/modules/statslive/fr.php new file mode 100644 index 000000000..97634648f --- /dev/null +++ b/modules/statslive/fr.php @@ -0,0 +1,22 @@ +statslive_fa55230e9791f2b71322869318a5f00f'] = 'Visiteurs en ligne'; +$_MODULE['<{statslive}prestashop>statslive_b8a5ea9b6e7f2d0b56fbb18e5b6b9246'] = 'Affiche la liste des clients et visiteurs en ligne actuellement'; +$_MODULE['<{statslive}prestashop>statslive_fd42d96861238b1cd5859585c4351eca'] = 'Vous devez activer l\'option \"pages vues pour chaque client\" dans le module \"Récupération des données statistiques\" pour visualiser les pages consultées par vos clients.'; +$_MODULE['<{statslive}prestashop>statslive_5c948349bdf1a7a77ba54497d019e4ca'] = 'Clients en ligne'; +$_MODULE['<{statslive}prestashop>statslive_66c4c5112f455a19afde47829df363fa'] = 'Total :'; +$_MODULE['<{statslive}prestashop>statslive_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statslive}prestashop>statslive_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statslive}prestashop>statslive_f88589c3e803217e3f6fe9d8e740e6e8'] = 'Page en cours'; +$_MODULE['<{statslive}prestashop>statslive_4351cfebe4b61d8aa5efa1d020710005'] = 'Voir'; +$_MODULE['<{statslive}prestashop>statslive_2fb60e2c82df1e84e827b2f50661403e'] = 'Il n\'y a aucun client en ligne en ce moment.'; +$_MODULE['<{statslive}prestashop>statslive_adb831a7fdd83dd1e2a309ce7591dff8'] = 'Visiteur'; +$_MODULE['<{statslive}prestashop>statslive_a12a3079e14ced46e69ba52b8a90b21a'] = 'IP'; +$_MODULE['<{statslive}prestashop>statslive_38c50b731f70abc42c8baa3e7399b413'] = 'Depuis'; +$_MODULE['<{statslive}prestashop>statslive_13aa8652e950bb7c4b9b213e6d8d0dc5'] = 'Page en cours'; +$_MODULE['<{statslive}prestashop>statslive_b6f05e5ddde1ec63d992d61144452dfa'] = 'Origine'; +$_MODULE['<{statslive}prestashop>statslive_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Indéfini'; +$_MODULE['<{statslive}prestashop>statslive_334c4a4c42fdb79d7ebc3e73b517e6f8'] = '- accès direct -'; +$_MODULE['<{statslive}prestashop>statslive_a55533db46597bee3cd16899c007257e'] = 'Il n\'y a aucun visiteur en ligne actuellement.'; diff --git a/modules/statslive/it.php b/modules/statslive/it.php new file mode 100644 index 000000000..7fa80cd79 --- /dev/null +++ b/modules/statslive/it.php @@ -0,0 +1,24 @@ +statslive_fa55230e9791f2b71322869318a5f00f'] = 'Visitatori online'; +$_MODULE['<{statslive}prestashop>statslive_b8a5ea9b6e7f2d0b56fbb18e5b6b9246'] = 'Visualizza l\'elenco dei clienti e dei visitatori online'; +$_MODULE['<{statslive}prestashop>statslive_fd42d96861238b1cd5859585c4351eca'] = 'È necessario attivare l\'opzione \"pagine viste per ogni cliente\" nel modulo \"recupero dei dati statistici\" per visualizzare le pagine attualmente viste dai suoi clienti.'; +$_MODULE['<{statslive}prestashop>statslive_5c948349bdf1a7a77ba54497d019e4ca'] = 'Clienti online'; +$_MODULE['<{statslive}prestashop>statslive_66c4c5112f455a19afde47829df363fa'] = 'Totale:'; +$_MODULE['<{statslive}prestashop>statslive_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statslive}prestashop>statslive_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statslive}prestashop>statslive_f88589c3e803217e3f6fe9d8e740e6e8'] = 'Pagina corrente'; +$_MODULE['<{statslive}prestashop>statslive_4351cfebe4b61d8aa5efa1d020710005'] = 'Visualizza'; +$_MODULE['<{statslive}prestashop>statslive_bc59449a563c905a40eb3c871bb36d03'] = 'Non ci sono clienti online adesso.'; +$_MODULE['<{statslive}prestashop>statslive_adb831a7fdd83dd1e2a309ce7591dff8'] = 'Ospite'; +$_MODULE['<{statslive}prestashop>statslive_a12a3079e14ced46e69ba52b8a90b21a'] = 'IP'; +$_MODULE['<{statslive}prestashop>statslive_38c50b731f70abc42c8baa3e7399b413'] = 'Da'; +$_MODULE['<{statslive}prestashop>statslive_13aa8652e950bb7c4b9b213e6d8d0dc5'] = 'Pagina corrente'; +$_MODULE['<{statslive}prestashop>statslive_b6f05e5ddde1ec63d992d61144452dfa'] = 'Referente'; +$_MODULE['<{statslive}prestashop>statslive_ec0fc0100c4fc1ce4eea230c3dc10360'] = 'Indefinito'; +$_MODULE['<{statslive}prestashop>statslive_334c4a4c42fdb79d7ebc3e73b517e6f8'] = 'nessuno'; +$_MODULE['<{statslive}prestashop>statslive_a55533db46597bee3cd16899c007257e'] = 'Non ci sono visitatori online adesso.'; + +?> \ No newline at end of file diff --git a/modules/statslive/logo.gif b/modules/statslive/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e2e980c1b752b2fb0814d74b25683c1e21ac740 GIT binary patch literal 1009 zcmeH`+fPyf0LG6|^Abyz+A_5%b8BnPE?Zl!T4-jLtJSP`+|;>pE3;*ynSwa8ys*6G zkrV_g$mUT(1TTlY1nBUBpx_0$oO3vMI0u`XV?NmIU+A^(;d}f&e7}9SZf9Ih$zcEt zU>7*ZvE$L<5i#MBF^s6V+z%Ut?e?N}Ye}cApw;mVbQKF7#X_W{+g&DdawJ%}*!fz5 zRrDg|QjfB(P|am)_&F+m-b4+1wy{9l%7H(=SpZAzJ>`zpd{;*y(pv_K26}~{Tm%kw zH;&8OL{dfXm%)~PdyO2cmf_VhZv%ukKwAO@(W3Nq3}Njm0#uWqG+ROqDH?W&$0-R+ zeVwG_lYZzIHK5-fTkyleswr8^lpNH_TGnO!MM!8?b*)3qYnrb4VUcCD&#IPK$E5CW zJX}%lf|{^Ffor6bR0#-mGp+&sPz^RJLdT^R!>HW=5wH-0rN~U5S1TqbdOW&5R1cvu z3T#G+8dbRd2R^4n=0}KyA&*H-m^7q$Y+EOrGFWV;IsKAnZk1ZF;cM>Ss0qdvC*9_0 z)G~#b4VZZbS=OO8qt^rzOFy@)M#^e%SWT$iLaZ$k8z#cO?A~0*H1)1!-xtBcb`}oXOhEPFBO|;VK8as_GD9l8{S}vuWC($S1LJ zVXjo&__cfAHv_x^LEg>Mj#n$^@7FiRXNlROi+p`B{W{$kl;+^_!%j8Ccit^~$pWtY E0ayi{#Q*>R literal 0 HcmV?d00001 diff --git a/modules/statslive/statslive.php b/modules/statslive/statslive.php new file mode 100644 index 000000000..24aa73022 --- /dev/null +++ b/modules/statslive/statslive.php @@ -0,0 +1,173 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsLive extends Module +{ + function __construct() + { + $this->name = 'statslive'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Visitors online'); + $this->description = $this->l('Display the list of customers and visitors currently online.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + /** + * Get the number of online customers + * + * @return array(array, int) array of online customers entries, number of online customers + */ + private function getCustomersOnline() + { + $sql = 'SELECT u.id_customer, u.firstname, u.lastname, pt.name as page + FROM `'._DB_PREFIX_.'connections` c + LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.id_connections = cp.id_connections + LEFT JOIN `'._DB_PREFIX_.'page` p ON p.id_page = cp.id_page + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON p.id_page_type = pt.id_page_type + INNER JOIN `'._DB_PREFIX_.'guest` g ON c.id_guest = g.id_guest + INNER JOIN `'._DB_PREFIX_.'customer` u ON u.id_customer = g.id_customer + WHERE cp.`time_end` IS NULL + '.$this->sqlShopRestriction(false, 'c').' + AND TIME_TO_SEC(TIMEDIFF(NOW(), cp.`time_start`)) < 900 + GROUP BY c.id_connections + ORDER BY u.firstname, u.lastname'; + $results = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + return array($results, Db::getInstance()->NumRows()); + } + + /** + * Get the number of online visitors + * + * @return array(array, int) array of online visitors entries, number of online visitors + */ + private function getVisitorsOnline() + { + if (Configuration::get('PS_STATSDATA_CUSTOMER_PAGESVIEWS')) + { + $sql = 'SELECT c.id_guest, c.ip_address, c.date_add, c.http_referer, pt.name as page + FROM `'._DB_PREFIX_.'connections` c + LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.id_connections = cp.id_connections + LEFT JOIN `'._DB_PREFIX_.'page` p ON p.id_page = cp.id_page + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON p.id_page_type = pt.id_page_type + INNER JOIN `'._DB_PREFIX_.'guest` g ON c.id_guest = g.id_guest + WHERE (g.id_customer IS NULL OR g.id_customer = 0) + '.$this->sqlShopRestriction(false, 'c').' + AND cp.`time_end` IS NULL + AND TIME_TO_SEC(TIMEDIFF(NOW(), cp.`time_start`)) < 900 + GROUP BY c.id_connections + ORDER BY c.date_add DESC'; + } + else + { + $sql = 'SELECT c.id_guest, c.ip_address, c.date_add, c.http_referer + FROM `'._DB_PREFIX_.'connections` c + INNER JOIN `'._DB_PREFIX_.'guest` g ON c.id_guest = g.id_guest + WHERE (g.id_customer IS NULL OR g.id_customer = 0) + '.$this->sqlShopRestriction(false, 'c').' + AND TIME_TO_SEC(TIMEDIFF(NOW(), c.`date_add`)) < 900 + ORDER BY c.date_add DESC'; + } + + $results = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + return array($results, Db::getInstance()->NumRows()); + } + + public function hookAdminStatsModules($params) + { + global $cookie; + + list($customers, $totalCustomers) = $this->getCustomersOnline(); + list($visitors, $totalVisitors) = $this->getVisitorsOnline(); + $irow = 0; + + echo ''; + if (!Configuration::get('PS_STATSDATA_CUSTOMER_PAGESVIEWS')) + echo '
    '.$this->l('You must activate the option "pages views for each customer" in the "Stats datamining" module in order to see the pages currently viewed by your customers.').'
    '; + echo ' +
    '.$this->l('Customers online').''; + if ($totalCustomers) + { + echo $this->l('Total:').' '.(int)($totalCustomers).' + + '; + foreach ($customers as $customer) + echo ' + + + + + + '; + echo '
    '.$this->l('ID').''.$this->l('Name').''.$this->l('Current Page').''.$this->l('View').'
    '.$customer['id_customer'].''.$customer['firstname'].' '.$customer['lastname'].''.$customer['page'].' + + + +
    '; + } + else + echo $this->l('There are no customers online.'); + echo '
    +
    '.$this->l('Visitors online').''; + if ($totalVisitors) + { + echo $this->l('Total:').' '.(int)($totalVisitors).' +
    + + '; + foreach ($visitors as $visitor) + echo ' + + + + + + '; + echo '
    '.$this->l('Guest').''.$this->l('IP').''.$this->l('Since').''.$this->l('Current page').''.$this->l('Referrer').'
    '.$visitor['id_guest'].''.long2ip($visitor['ip_address']).''.substr($visitor['date_add'], 11).''.(isset($visitor['page']) ? $visitor['page'] : $this->l('Undefined')).''.(empty($visitor['http_referer']) ? $this->l('none') : parse_url($visitor['http_referer'], PHP_URL_HOST)).'
    '; + } + else + echo $this->l('There are no visitors online.'); + echo '
    '; + } +} + + diff --git a/modules/statsnewsletter/config.xml b/modules/statsnewsletter/config.xml new file mode 100755 index 000000000..78ac1de0d --- /dev/null +++ b/modules/statsnewsletter/config.xml @@ -0,0 +1,12 @@ + + + statsnewsletter + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsnewsletter/de.php b/modules/statsnewsletter/de.php new file mode 100644 index 000000000..9490fc508 --- /dev/null +++ b/modules/statsnewsletter/de.php @@ -0,0 +1,17 @@ +statsnewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_eb4337ccc2c2e7d7622d21554e1bcc25'] = 'Newsletter-Anmeldung anzeigen'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_39d3d2445552ee17e870d7f64262669f'] = 'Anmeldungen von Kunden:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_a6152725246f91ab908781d1d6345bc3'] = 'Anmeldungen von Besuchern:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_64342cd480b27dfeefb08bace6e82fdc'] = 'Beide:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ce182d3cf87db4fd00942a586f16170a'] = 'Modul Newsletter Block muss installiert sein'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_cf74c2815ab62be1efa55a4a5d3f46a4'] = 'Newsletter Statistik'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Kunden'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Besucher'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_130c5b3473c57faa76e2a1c54e26f88e'] = 'Beide'; + +?> \ No newline at end of file diff --git a/modules/statsnewsletter/en.php b/modules/statsnewsletter/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsnewsletter/en.php @@ -0,0 +1,4 @@ +statsnewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_eb4337ccc2c2e7d7622d21554e1bcc25'] = 'Mostrar suscripciones a la newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_39d3d2445552ee17e870d7f64262669f'] = 'Suscripciones de clientes:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_a6152725246f91ab908781d1d6345bc3'] = 'Suscripciones de visitantes'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_64342cd480b27dfeefb08bace6e82fdc'] = 'ambos:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ce182d3cf87db4fd00942a586f16170a'] = 'El módulo bloque newsletter debe instalarse'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_cf74c2815ab62be1efa55a4a5d3f46a4'] = 'estadísticas de la newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clientes '; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitantes'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_130c5b3473c57faa76e2a1c54e26f88e'] = 'Ambos'; diff --git a/modules/statsnewsletter/fr.php b/modules/statsnewsletter/fr.php new file mode 100644 index 000000000..6dd27ccac --- /dev/null +++ b/modules/statsnewsletter/fr.php @@ -0,0 +1,15 @@ +statsnewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_eb4337ccc2c2e7d7622d21554e1bcc25'] = 'Affiche les inscriptions à la newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_39d3d2445552ee17e870d7f64262669f'] = 'Inscriptions depuis le compte client :'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_a6152725246f91ab908781d1d6345bc3'] = 'Inscriptions depuis le block sur le front office :'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_64342cd480b27dfeefb08bace6e82fdc'] = 'Les deux :'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ce182d3cf87db4fd00942a586f16170a'] = 'Le module block newsletter doit être installé'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_cf74c2815ab62be1efa55a4a5d3f46a4'] = 'Statistiques de la newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clients'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visiteurs'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_130c5b3473c57faa76e2a1c54e26f88e'] = 'Les deux'; diff --git a/modules/statsnewsletter/it.php b/modules/statsnewsletter/it.php new file mode 100644 index 000000000..4f8c0cea0 --- /dev/null +++ b/modules/statsnewsletter/it.php @@ -0,0 +1,17 @@ +statsnewsletter_ffb7e666a70151215b4c55c6268d7d72'] = 'Newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_eb4337ccc2c2e7d7622d21554e1bcc25'] = 'Visualizza le iscrizioni alla newsletter'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_39d3d2445552ee17e870d7f64262669f'] = 'Iscrizioni da parte dei clienti:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_a6152725246f91ab908781d1d6345bc3'] = 'Iscrizioni da parte dei visitatori:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_64342cd480b27dfeefb08bace6e82fdc'] = 'Entrambi:'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ce182d3cf87db4fd00942a586f16170a'] = 'Il modulo del blocco Newsletter deve essere installato'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_cf74c2815ab62be1efa55a4a5d3f46a4'] = 'Statistiche Newsletter '; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_e6d0e1c8fc6a4fcf47869df87e04cd88'] = 'Clienti'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitatori'; +$_MODULE['<{statsnewsletter}prestashop>statsnewsletter_130c5b3473c57faa76e2a1c54e26f88e'] = 'Entrambi'; + +?> \ No newline at end of file diff --git a/modules/statsnewsletter/logo.gif b/modules/statsnewsletter/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dd879dab4c880aaa0593a92b497456037c82c1 GIT binary patch literal 983 zcmZ?wbhEHb6krfwXlG!s&DmmIwA-#?pLgN9_?lI&r3amA4*J&|32WXO(7r#aeQR|4 zuGr3Pp3R4Y+l~fw9gk`~8PRnjw&zr8@0t9m7Yb)wte$iEx9^j-<#$@v-s@U%ea_}< z^S9mUS^s$ImdCUAy`8`B<&@nYmK}Ms>gd}|r(f+j|7OG4kGn6t*>?TUo~vK>-~My% z*6YK!e;mF4=j?+Y*Pi^m_WbY7Cm-)V|9| z$)e!GfrCs;G8Hc#9Nf6rUDjM8;=)76wmwOX^cx#CI=i(=@N0Z92n=HHooZ2b<%NLK z@n%k&gbPzPGPCo^S=%r8z^SOwBPfwou%_{0Gnc3xKTD~jlZ&UMoJ&W-#Y5?ga{697 z8YVKabch)2*tFxL!ht?v{frA9Gbd&DvNIQ5x!_pQ{_wDM-kJah1_uU4HXf51cN7|* RvT$%H+&Qz;_;~|^H2?}N&ustz literal 0 HcmV?d00001 diff --git a/modules/statsnewsletter/statsnewsletter.php b/modules/statsnewsletter/statsnewsletter.php new file mode 100644 index 000000000..80d8c84d8 --- /dev/null +++ b/modules/statsnewsletter/statsnewsletter.php @@ -0,0 +1,170 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsNewsletter extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + private $_option = ''; + + function __construct() + { + $this->name = 'statsnewsletter'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Newsletter'); + $this->description = $this->l('Display the newsletter registrations'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + if (Module::isInstalled('blocknewsletter')) + { + $totals = $this->getTotals(); + if (Tools::getValue('export')) + $this->csvExport(array('type' => 'line', 'layers' => 3)); + $this->_html = ' +
    '.$this->displayName.' +

    '.$this->l('Registrations from customers:').' '.(int)($totals['customers']).'

    +

    '.$this->l('Registrations from visitors:').' '.(int)($totals['visitors']).'

    +

    '.$this->l('Both:').' '.(int)($totals['both']).'

    +
    '.$this->engine(array('type' => 'line', 'layers' => 3)).'
    +

    '.$this->l('CSV Export').'

    +
    '; + } + else + $this->_html = '

    '.$this->l('Module Newsletter Block must be installed').'

    '; + + return $this->_html; + } + + private function getTotals() + { + $sql = 'SELECT COUNT(*) as customers + FROM `'._DB_PREFIX_.'customer` + WHERE 1 + '.$this->sqlShopRestriction(true).' + `newsletter_date_add` BETWEEN '.ModuleGraph::getDateBetween(); + $result1 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + + $sql = 'SELECT COUNT(*) as visitors + FROM '._DB_PREFIX_.'newsletter + WHERE '.$this->sqlShopRestriction().' + `newsletter_date_add` BETWEEN '.ModuleGraph::getDateBetween(); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return array('customers' => $result1['customers'], 'visitors' => $result2['visitors'], 'both' => $result1['customers'] + $result2['visitors']); + } + + protected function getData($layers) + { + $this->_titles['main'][0] = $this->l('Newsletter statistics'); + $this->_titles['main'][1] = $this->l('Customers'); + $this->_titles['main'][2] = $this->l('Visitors'); + $this->_titles['main'][3] = $this->l('Both'); + + $this->_query = 'SELECT newsletter_date_add + FROM `'._DB_PREFIX_.'customer` + WHERE 1 + '.$this->sqlShopRestriction(true).' + `newsletter_date_add` BETWEEN '; + + $this->_query2 = 'SELECT newsletter_date_add + FROM '._DB_PREFIX_.'newsletter + WHERE 1 + '.$this->sqlShopRestriction(true).' + `newsletter_date_add` BETWEEN '; + $this->setDateGraph($layers, true); + } + + protected function setAllTimeValues($layers) + { + $result1 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query2.$this->getDate()); + foreach ($result1 AS $row) + $this->_values[0][(int)(substr($row['newsletter_date_add'], 0, 4))] += 1; + if ($result2) + foreach ($result2 AS $row) + $this->_values[1][(int)(substr($row['newsletter_date_add'], 0, 4))] += 1; + foreach ($this->_values[2] as $key => $zerofill) + $this->_values[2][$key] = $this->_values[0][$key] + $this->_values[1][$key]; + } + + protected function setYearValues($layers) + { + $result1 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query2.$this->getDate()); + foreach ($result1 AS $row) + $this->_values[0][(int)(substr($row['newsletter_date_add'], 5, 2))] += 1; + if ($result2) + foreach ($result2 AS $row) + $this->_values[1][(int)(substr($row['newsletter_date_add'], 5, 2))] += 1; + foreach ($this->_values[2] as $key => $zerofill) + $this->_values[2][$key] = $this->_values[0][$key] + $this->_values[1][$key]; + } + + protected function setMonthValues($layers) + { + $result1 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query2.$this->getDate()); + foreach ($result1 AS $row) + $this->_values[0][(int)(substr($row['newsletter_date_add'], 8, 2))] += 1; + if ($result2) + foreach ($result2 AS $row) + $this->_values[1][(int)(substr($row['newsletter_date_add'], 8, 2))] += 1; + foreach ($this->_values[2] as $key => $zerofill) + $this->_values[2][$key] = $this->_values[0][$key] + $this->_values[1][$key]; + } + + protected function setDayValues($layers) + { + $result1 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query2.$this->getDate()); + foreach ($result1 AS $row) + $this->_values[0][(int)(substr($row['newsletter_date_add'], 11, 2))] += 1; + if ($result2) + foreach ($result2 AS $row) + $this->_values[1][(int)(substr($row['newsletter_date_add'], 11, 2))] += 1; + foreach ($this->_values[2] as $key => $zerofill) + $this->_values[2][$key] = $this->_values[0][$key] + $this->_values[1][$key]; + } +} + + diff --git a/modules/statsorigin/config.xml b/modules/statsorigin/config.xml new file mode 100755 index 000000000..8ab43f61c --- /dev/null +++ b/modules/statsorigin/config.xml @@ -0,0 +1,12 @@ + + + statsorigin + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsorigin/de.php b/modules/statsorigin/de.php new file mode 100644 index 000000000..d4c95fede --- /dev/null +++ b/modules/statsorigin/de.php @@ -0,0 +1,23 @@ +statsorigin_f0b1507c6bdcdefb60a0e6f9b89d4ae8'] = 'Herkunft des Besuchers'; +$_MODULE['<{statsorigin}prestashop>statsorigin_ada7786973910e9c8cb95f0450bf55c3'] = 'Anzeige der Webseiten, von denen Ihre Besucher kommen'; +$_MODULE['<{statsorigin}prestashop>statsorigin_14542f5997c4a02d4276da364657f501'] = 'Direkt-Link'; +$_MODULE['<{statsorigin}prestashop>statsorigin_3edf8ca26a1ec14dd6e91dd277ae1de6'] = 'Herkunft'; +$_MODULE['<{statsorigin}prestashop>statsorigin_b5c1b8a326be0d2fb25b3cf6da677d0e'] = 'Hier ist der Prozentsatz der 10 beliebtesten Referrer-Webseiten, über die Besucher zu Ihrem Shop gekommen sind.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsorigin}prestashop>statsorigin_96b0141273eabab320119c467cdcaf17'] = 'Insgesamt'; +$_MODULE['<{statsorigin}prestashop>statsorigin_0bebf95ee829c33f34fde535ed4ed100'] = 'Nur direkte Links'; +$_MODULE['<{statsorigin}prestashop>statsorigin_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statsorigin}prestashop>statsorigin_64ae584c62d0992a911d52122ebefc9a'] = 'Was ist eine Referrer-Webseite?'; +$_MODULE['<{statsorigin}prestashop>statsorigin_77de261cf4c31a96146bcf1b52fd9856'] = 'Beim Besuch einer Webseite ist der Referrer die URL der vorherigen Webseite, von der ein Link folgte.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_d8d034b6911b1ce74bdb2158a14cd287'] = 'Ein Referrer informiert Sie darüber, welche Keywords Besucher in Suchmaschinen eingeben, wenn sie zu ihrem Shop kommen wollen, und optimiert damit auch Ihre Werbung im Web.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_af19c8da1c414055c960a73d86471119'] = 'Referrer können sein:'; +$_MODULE['<{statsorigin}prestashop>statsorigin_a3dec1a06e19a810a9a4884293f666d0'] = 'Jemand, der einen Link zu Ihrem Shop auf seiner Webseite hat'; +$_MODULE['<{statsorigin}prestashop>statsorigin_95b90f58e843b56885beabf4802676a9'] = 'Ein Partner, mit dem Sie Links getauscht haben, um die Verkäufe zu erhöhen oder Neukunden anzuziehen'; +$_MODULE['<{statsorigin}prestashop>statsorigin_7a82cc29e910ea0c07501d5fe809fd75'] = '10 erste Webseiten'; +$_MODULE['<{statsorigin}prestashop>statsorigin_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Andere'; + +?> \ No newline at end of file diff --git a/modules/statsorigin/en.php b/modules/statsorigin/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsorigin/en.php @@ -0,0 +1,4 @@ +statsorigin_f0b1507c6bdcdefb60a0e6f9b89d4ae8'] = 'Procedencia de los visitantes'; +$_MODULE['<{statsorigin}prestashop>statsorigin_ada7786973910e9c8cb95f0450bf55c3'] = 'Muestra los sitios Web de los que proceden sus visitantes'; +$_MODULE['<{statsorigin}prestashop>statsorigin_14542f5997c4a02d4276da364657f501'] = 'Enlace directo'; +$_MODULE['<{statsorigin}prestashop>statsorigin_3edf8ca26a1ec14dd6e91dd277ae1de6'] = 'Origen'; +$_MODULE['<{statsorigin}prestashop>statsorigin_b5c1b8a326be0d2fb25b3cf6da677d0e'] = 'Porcentaje de los diez mejores sitios referentes por los que pasan los visitantes para acceder a su tienda.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsorigin}prestashop>statsorigin_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{statsorigin}prestashop>statsorigin_0bebf95ee829c33f34fde535ed4ed100'] = 'Enlaces directos solamente'; +$_MODULE['<{statsorigin}prestashop>statsorigin_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsorigin}prestashop>statsorigin_64ae584c62d0992a911d52122ebefc9a'] = '¿Cuál es el sitio web referente?'; +$_MODULE['<{statsorigin}prestashop>statsorigin_77de261cf4c31a96146bcf1b52fd9856'] = 'Cuando se visita una página web, el referente es la URL de la página web anterior desde la cual se siguió el enlace.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_d8d034b6911b1ce74bdb2158a14cd287'] = 'Un referente le permite saber qué palabras claves incorporan los visitantes en motores de búsqueda cuando intentan acceder a su tienda; y también optimizar su promoción en la Webrnrn'; +$_MODULE['<{statsorigin}prestashop>statsorigin_af19c8da1c414055c960a73d86471119'] = 'Un referente puede ser'; +$_MODULE['<{statsorigin}prestashop>statsorigin_a3dec1a06e19a810a9a4884293f666d0'] = 'Alguien ha puesto un link de su tienda en su sitio Web'; +$_MODULE['<{statsorigin}prestashop>statsorigin_95b90f58e843b56885beabf4802676a9'] = 'Un colaborador con quien intercambió enlaces para aumentar las ventas o para atraer nueva clientela. '; +$_MODULE['<{statsorigin}prestashop>statsorigin_7a82cc29e910ea0c07501d5fe809fd75'] = '10 primeros sitios web'; +$_MODULE['<{statsorigin}prestashop>statsorigin_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Otros'; diff --git a/modules/statsorigin/fr.php b/modules/statsorigin/fr.php new file mode 100644 index 000000000..e75dc33c5 --- /dev/null +++ b/modules/statsorigin/fr.php @@ -0,0 +1,21 @@ +statsorigin_f0b1507c6bdcdefb60a0e6f9b89d4ae8'] = 'Sites affluents'; +$_MODULE['<{statsorigin}prestashop>statsorigin_ada7786973910e9c8cb95f0450bf55c3'] = 'Affiche les sites d\'origine de vos visiteurs'; +$_MODULE['<{statsorigin}prestashop>statsorigin_14542f5997c4a02d4276da364657f501'] = 'Lien direct'; +$_MODULE['<{statsorigin}prestashop>statsorigin_3edf8ca26a1ec14dd6e91dd277ae1de6'] = 'Origine'; +$_MODULE['<{statsorigin}prestashop>statsorigin_b5c1b8a326be0d2fb25b3cf6da677d0e'] = 'Pourcentage des 10 meilleurs sites affluents par lesquels les visiteurs passent pour accéder à votre boutique.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsorigin}prestashop>statsorigin_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{statsorigin}prestashop>statsorigin_0bebf95ee829c33f34fde535ed4ed100'] = 'Liens directs uniquement'; +$_MODULE['<{statsorigin}prestashop>statsorigin_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsorigin}prestashop>statsorigin_64ae584c62d0992a911d52122ebefc9a'] = 'Qu\'est-ce qu\'un site affluent (référant) ?'; +$_MODULE['<{statsorigin}prestashop>statsorigin_77de261cf4c31a96146bcf1b52fd9856'] = 'Lorsqu\'un internaute visite une page web, le site affluent est l\'URL du lien qu\'a suivi le visiteur pour accéder à sa page web actuelle.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_d8d034b6911b1ce74bdb2158a14cd287'] = 'Un référant vous permet de savoir quels sont les mots clés tapés par les visiteurs dans les moteurs de recherche quand ils tentent d\'aller sur votre boutique; et ainsi d\'optimiser le référencement de votre boutique.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_af19c8da1c414055c960a73d86471119'] = 'Un référant peut être :'; +$_MODULE['<{statsorigin}prestashop>statsorigin_a3dec1a06e19a810a9a4884293f666d0'] = 'Quelqu\'un qui a mis un lien de votre boutique sur son site'; +$_MODULE['<{statsorigin}prestashop>statsorigin_95b90f58e843b56885beabf4802676a9'] = 'Un partenaire avec lequel vous avez fait un échange de lien visant à rapporter des ventes ou attirer de nouveaux clients'; +$_MODULE['<{statsorigin}prestashop>statsorigin_7a82cc29e910ea0c07501d5fe809fd75'] = '10 premiers sites'; +$_MODULE['<{statsorigin}prestashop>statsorigin_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Autres'; diff --git a/modules/statsorigin/it.php b/modules/statsorigin/it.php new file mode 100644 index 000000000..06fdfb659 --- /dev/null +++ b/modules/statsorigin/it.php @@ -0,0 +1,23 @@ +statsorigin_f0b1507c6bdcdefb60a0e6f9b89d4ae8'] = 'Origine visitatori'; +$_MODULE['<{statsorigin}prestashop>statsorigin_ada7786973910e9c8cb95f0450bf55c3'] = 'Visualizzare i siti web da cui provengono i tuoi visitatori'; +$_MODULE['<{statsorigin}prestashop>statsorigin_14542f5997c4a02d4276da364657f501'] = 'Link diretto'; +$_MODULE['<{statsorigin}prestashop>statsorigin_3edf8ca26a1ec14dd6e91dd277ae1de6'] = 'Origine'; +$_MODULE['<{statsorigin}prestashop>statsorigin_b5c1b8a326be0d2fb25b3cf6da677d0e'] = 'Ecco la percentuale dei 10 siti più popolari di riferimento dai quali i visitatori hanno raggiunto il tuo negozio.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsorigin}prestashop>statsorigin_96b0141273eabab320119c467cdcaf17'] = 'Totale'; +$_MODULE['<{statsorigin}prestashop>statsorigin_0bebf95ee829c33f34fde535ed4ed100'] = 'Solo link diretti '; +$_MODULE['<{statsorigin}prestashop>statsorigin_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsorigin}prestashop>statsorigin_64ae584c62d0992a911d52122ebefc9a'] = 'Che cosa è un sito web di riferimento?'; +$_MODULE['<{statsorigin}prestashop>statsorigin_77de261cf4c31a96146bcf1b52fd9856'] = 'Quando si visita una pagina web, il riferimento è l\'URL della pagina web precedente da cui è stato seguito un link.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_d8d034b6911b1ce74bdb2158a14cd287'] = 'Un riferimento consente di sapere quali parole chiave sono state inserite dai visitatori nei motori di ricerca quando hanno cercato di raggiungere il tuo negozio, e anche per ottimizzare la promozione sul web.'; +$_MODULE['<{statsorigin}prestashop>statsorigin_af19c8da1c414055c960a73d86471119'] = 'Un riferimento può essere:'; +$_MODULE['<{statsorigin}prestashop>statsorigin_a3dec1a06e19a810a9a4884293f666d0'] = 'Qualcuno che mettere un link sul suo sito web verso il tuo negozio'; +$_MODULE['<{statsorigin}prestashop>statsorigin_95b90f58e843b56885beabf4802676a9'] = 'Un partner con cui hai fatto uno scambio di link al fine di aumentare le vendite o attirare nuovi clienti'; +$_MODULE['<{statsorigin}prestashop>statsorigin_7a82cc29e910ea0c07501d5fe809fd75'] = 'I primi 10 siti web '; +$_MODULE['<{statsorigin}prestashop>statsorigin_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Altri'; + +?> \ No newline at end of file diff --git a/modules/statsorigin/logo.gif b/modules/statsorigin/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae910c2b158ee0f9d56596a4773aa5ac42f3c512 GIT binary patch literal 967 zcmZ?wbhEHb6krfw_|5FB-Imt6Evs`!cHgf2342N!8yj0&Tie^)ySux4dwVBLm@skT#7UDTO_?%f z)~s3c=FMBNV#V6EYuBw?w_(GEO`A6D+O=!%-o5+x@1J(CVfvw_8HbwZ9qm|ntZV6s z-W8`NtU5h$?b#_C&P_Xb@Zh0ChmIUMa_-!@^XJcBzI^%m_3O88-MV}C?u!>MzyUK# z4F3>N{K>+|!0?|z2jo>yo?zfu!tkF{#$&^RgUuYmS}{M)ckn4#ve;coT%sT#7qiXh z;Ya7w)3j_Fcw8PSaQ88BRGBygFt`h{d$7FQ(fCxpQ8{b{homCY>0Vi;W`i9`&IcHn z+1P3dHa0p=XymLBkSsdH!YQD;V8e=l4-HMMs!LoNKP_>aEGod)*5Q=w)+25(t)e1f o!eL=`-x((Y7Ck!T$SbDd^J0PuD_fgTKuW?7eJ6${Mn(o}07Hh);Q#;t literal 0 HcmV?d00001 diff --git a/modules/statsorigin/statsorigin.php b/modules/statsorigin/statsorigin.php new file mode 100644 index 000000000..671656e0e --- /dev/null +++ b/modules/statsorigin/statsorigin.php @@ -0,0 +1,150 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsOrigin extends ModuleGraph +{ + private $_html; + + function __construct() + { + $this->name = 'statsorigin'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Visitors origin'); + $this->description = $this->l('Display the websites your visitors come from.'); + } + + function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + private function getOrigins($dateBetween) + { + $directLink = $this->l('Direct link'); + $sql = 'SELECT http_referer + FROM '._DB_PREFIX_.'connections + WHERE 1 + '.$this->sqlShopRestriction().' + date_add BETWEEN '.$dateBetween; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql, false); + $websites = array($directLink => 0); + while ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->nextRow($result)) + { + if (!isset($row['http_referer']) OR empty($row['http_referer'])) + ++$websites[$directLink]; + else + { + $website = preg_replace('/^www./', '', parse_url($row['http_referer'], PHP_URL_HOST)); + if (!isset($websites[$website])) + $websites[$website] = 1; + else + ++$websites[$website]; + } + } + arsort($websites); + return $websites; + } + + function hookAdminStatsModules() + { + $websites = $this->getOrigins(ModuleGraph::getDateBetween()); + if (Tools::getValue('export')) + if (Tools::getValue('exportType') == 'top') + $this->csvExport(array('type' => 'pie')); + $this->_html = '
    '.$this->l('Origin').''; + if (sizeof($websites)) + { + $this->_html .= ' +

    '. $this->l('Here is the percentage of the 10 most popular referrer websites by which visitors went through to get to your shop.').'

    + '.$this->engine(array('type' => 'pie')).'
    +

    '.$this->l('CSV Export').'



    +
    +
    + + + + + '; + foreach ($websites as $website => $total) + $this->_html .= ''; + $this->_html .= '
    '.$this->l('Origin').''.$this->l('Total').'
    '.(!strstr($website, ' ') ? '' : '').$website.(!strstr($website, ' ') ? '' : '').''.$total.'
    '; + } + else + $this->_html .= '

    '.$this->l('Direct links only').'

    '; + $this->_html .= '

    +
    '.$this->l('Guide').' +

    '.$this->l('What is a referrer website?').'

    +

    + '.$this->l('When visiting a webpage, the referrer is the URL of the previous webpage from which a link was followed.').'
    + '.$this->l('A referrer enables you to know which keywords are entered by visitors in search engines when getting to your shop and allows you to optimize web promotion.').'

    + '. $this->l('A referrer can be:').' +

      +
    • '. $this->l('Someone who put a link on their website for your shop').'
    • +
    • '. $this->l('A partner with whom you made a link exchange in order to bring in sales or attract new customers').'
    • +
    +

    +
    '; + return $this->_html; + } + + protected function getData($layers) + { + $this->_titles['main'] = $this->l('First 10 websites'); + $websites = $this->getOrigins($this->getDate()); + $total = 0; + $total2 = 0; + $i = 0; + foreach ($websites as $website => $totalRow) + { + if (!$totalRow) + continue; + $total += $totalRow; + if ($i++ < 9) + { + $this->_legend[] = $website; + $this->_values[] = $totalRow; + $total2 += $totalRow; + } + } + if ($total != $total2) + { + $this->_legend[] = $this->l('Others'); + $this->_values[] = $total - $total2; + } + } +} + + diff --git a/modules/statspersonalinfos/config.xml b/modules/statspersonalinfos/config.xml new file mode 100755 index 000000000..4262ab925 --- /dev/null +++ b/modules/statspersonalinfos/config.xml @@ -0,0 +1,12 @@ + + + statspersonalinfos + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statspersonalinfos/de.php b/modules/statspersonalinfos/de.php new file mode 100644 index 000000000..ddd7269f7 --- /dev/null +++ b/modules/statspersonalinfos/de.php @@ -0,0 +1,38 @@ +statspersonalinfos_8063f7c341dbe2cadc294a530cb1cad2'] = 'Information zu registrierten Kunden'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_ff9c34d2829b95a0936b22b409640143'] = 'Zeigt Merkmale wie Geschlecht und Alter an'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0df28a79b0b6ee5f2a91da83bb07117c'] = 'Mit der Geschlechterverteilung können Sie den Prozentsatz von Männern und Frauen unter Ihren Kunden zu bestimmen.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_66ea53c179f966ec08fc4710c60a85be'] = 'Mit den Altersklassen können Sie bestimmen, in welcher Altersklasse sich Ihre Kunden befinden.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_d053730180bf7c54024068ab2a2edf5c'] = 'Mit der Länderverteilung können Sie erkennen, in welchem Teil der Welt Ihre Kunden sind.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_bcfebaf66fa6f885171c63997e2613d5'] = 'Mit den Währungsbereichen können Sie erkennen, mit welcher Währung Ihre Kunden bezahlen.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e0c88fe08ea4e9b77760ed2429628dea'] = 'Mit der Sprachenverteilung können Sie die allgemeine Sprache, die Ihre Kunden in Ihrem Shop verwenden, erkennen.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7a7012cc5c52802b45aed45d1f616f1e'] = 'Noch keine Kunden registriert.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_3ca26e413e485538a7f3e610c0324636'] = 'Visieren Sie Ihre Zielgruppe an'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_c8eb1ba430d9ae8fe45fe2d990a481f5'] = 'Damit jede Nachricht ihre Wirkung erzielt, müssen Sie wissen,an wen sie gerichtet werden sollte.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_5beafb6329f9718aa46293a7433697e5'] = 'Auf die richtige Zielgruppe zu antworten ist entscheidend für die Wahl der richtigen Werkzeuge, um sie zu überzeugen.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f94ccd67cb072f87473491d409fe4c'] = 'Am besten ist es, Maßnahmen auf eine Gruppe oder Gruppen von Kunden zu begrenzen.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f94c9050d83dfc68894175207b330785'] = 'Informationen zu registrierten Kunden helfen Ihnen dabei, das typische Kundenprofil genauer zu bestimmen, so dass Sie Ihre Specials verschiedenen Kriterien anpassen können.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_72d2596650eeec0e4f630dd8841eb21e'] = 'Sie sollten diese Informationen zur Steigerung Ihrer Umsätze nutzen, indem Sie:'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_325004e2f6f72a36519c6a79bd59de74'] = 'Werbekampagnen starten, die an bestimmte Kunden gerichtet sind, welche an einem bestimmten Angebot interessiert sein könnten, zu bestimmten Daten und Zeiten'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7878438ad0cb68d43646e19bf8cda504'] = 'eine KundenGruppe per E-Mail / Newsletter kontaktieren.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_8dc514f6da8c696c4a522efc145ad28a'] = 'Geschlechterverteilung'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_63889cfb9d3cbe05d1bd2be5cc9953fd'] = 'Männlich'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_b719ce180ec7bd9641fece2f920f4817'] = 'Weiblich'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Unbekannt'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0e8cb607499d7862540d5736f6ab84e3'] = 'Altersklassen'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_306fb378f025305fd17ec219fb193797'] = '0-18 Jahre alt'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_95ad6a8434399a1020f496ae093394a1'] = '18-24 Jahre alt'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_fb0d334f12a24f10715baef863e20db7'] = '25-34 Jahre alt'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_268750725a2f1cba57267447006d22ef'] = '35-49 Jahre alt'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_31974086ef82d676924acbb48fc3de1e'] = '50-59 Jahre alt'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f407fa37f8cd8c5900329882ad4529'] = '60 Jahre alt und älter'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_73b0130037e21b76351aebfd29d0b9aa'] = 'Länderverteilung'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_28e81c8343702f6c813cc31a7f90616a'] = 'Währungsverteilung'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Sprachenverteilung'; + +?> \ No newline at end of file diff --git a/modules/statspersonalinfos/en.php b/modules/statspersonalinfos/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statspersonalinfos/en.php @@ -0,0 +1,4 @@ +statspersonalinfos_8063f7c341dbe2cadc294a530cb1cad2'] = 'Información de clientes registrados'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_ff9c34d2829b95a0936b22b409640143'] = 'Mostrar características como género y edad'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0df28a79b0b6ee5f2a91da83bb07117c'] = 'La distribución del género le permite determinar el porcentaje de hombres y de mujeres entre sus clientes.rnrn'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_66ea53c179f966ec08fc4710c60a85be'] = 'El rango de edades le permite determinar en qué gama de edades se encuentran sus clientes.rnrn'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_d053730180bf7c54024068ab2a2edf5c'] = 'La distribución por países le permite determinar en qué parte del mundo se encuentran sus clientes.rnrn'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_bcfebaf66fa6f885171c63997e2613d5'] = 'Las gamas de monedas le permiten determinar con que moneda pagan sus clientes.rnrn'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e0c88fe08ea4e9b77760ed2429628dea'] = 'La distribución por idiomas le permite determinar el idioma general que hablan los clientes de su tienda.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7a7012cc5c52802b45aed45d1f616f1e'] = 'Aún no hay clientes registrados'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_3ca26e413e485538a7f3e610c0324636'] = 'Seleccione su audiencia'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_c8eb1ba430d9ae8fe45fe2d990a481f5'] = 'Para que cada mensaje tenga un impacto, necesita saber a quien va dirigido.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_5beafb6329f9718aa46293a7433697e5'] = 'Dirigirse al público adecuado es primordial para elegir las herramientas correctas para convencer a cada uno de los públicos perseguidos'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f94ccd67cb072f87473491d409fe4c'] = 'Es preferible limitar la acción a un grupo o grupos de clientes.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f94c9050d83dfc68894175207b330785'] = 'La información de clientes registrados le permite definir con mas exactitud el perfil de cliente típico de modo que usted pueda adaptar sus ofertas a los diferentes criterios.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_72d2596650eeec0e4f630dd8841eb21e'] = 'Usted debe utilizar esta información para aumentar sus ventas:'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_325004e2f6f72a36519c6a79bd59de74'] = 'Lanzando campañas publicitarias dirigidas a clientes específicos que pudieran estar interesados en una oferta particular, en las fechas y horas específicas'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7878438ad0cb68d43646e19bf8cda504'] = 'Ponerse en contacto con un grupo de clientes por email o a través de la newsletter.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_8dc514f6da8c696c4a522efc145ad28a'] = 'Distribución del género'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_63889cfb9d3cbe05d1bd2be5cc9953fd'] = 'Hombre'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_b719ce180ec7bd9641fece2f920f4817'] = 'Mujer'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Desconocido'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0e8cb607499d7862540d5736f6ab84e3'] = 'Rango de edades'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_306fb378f025305fd17ec219fb193797'] = '0-18 años'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_95ad6a8434399a1020f496ae093394a1'] = '18-24 años'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_fb0d334f12a24f10715baef863e20db7'] = '25-34 años'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_268750725a2f1cba57267447006d22ef'] = '35-49 años'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_31974086ef82d676924acbb48fc3de1e'] = '50-59 años'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f407fa37f8cd8c5900329882ad4529'] = '60 años y más'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_73b0130037e21b76351aebfd29d0b9aa'] = 'distribución del país'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_28e81c8343702f6c813cc31a7f90616a'] = 'Distribución de la moneda'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Distribución del idioma'; diff --git a/modules/statspersonalinfos/fr.php b/modules/statspersonalinfos/fr.php new file mode 100644 index 000000000..c17bfdd8e --- /dev/null +++ b/modules/statspersonalinfos/fr.php @@ -0,0 +1,36 @@ +statspersonalinfos_8063f7c341dbe2cadc294a530cb1cad2'] = 'Informations clients'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_ff9c34d2829b95a0936b22b409640143'] = 'Affiche la répartition de vos clients par âge, sexe ou pays'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0df28a79b0b6ee5f2a91da83bb07117c'] = 'La répartition par genre vous permet de déterminer le pourcentage d\'hommes et de femmes parmis vos clients.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_66ea53c179f966ec08fc4710c60a85be'] = 'Les tranches d\'âges vous permettent de déterminer dans quelle tranche d\'âge se positionne votre clientèle.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_d053730180bf7c54024068ab2a2edf5c'] = 'La répartition par pays vous permet de déterminer dans quelle partie du monde sont vos clients.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_bcfebaf66fa6f885171c63997e2613d5'] = 'Les tranches de devise vous permettent de déterminer avec quelle devise vos clients payent.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e0c88fe08ea4e9b77760ed2429628dea'] = 'La répartition par langues vous permet de déterminer la langue qu\'utilisent généralement vos clients dans votre boutique.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7a7012cc5c52802b45aed45d1f616f1e'] = 'Aucun client enregistré pour le moment.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_3ca26e413e485538a7f3e610c0324636'] = 'Ciblez votre public'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_c8eb1ba430d9ae8fe45fe2d990a481f5'] = 'Pour que chacun de vos messages ait de l\'impact, il faut savoir à quelle clientèle vous vous adressez.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_5beafb6329f9718aa46293a7433697e5'] = 'S\'adresser au bon public est primordial afin de choisir les bons outils pour convaincre chacun des publics cibles.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f94ccd67cb072f87473491d409fe4c'] = 'Il est préférable de limiter son action à un ou plusieurs groupes de clients'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f94c9050d83dfc68894175207b330785'] = 'Les informations personnelles relatives aux clients vous permettent de mieux définir le profil du client type afin d\'adapter les promotions sur votre site en fonction des différents critères.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_72d2596650eeec0e4f630dd8841eb21e'] = 'Nous vous conseillons d\'utiliser cette information pour faire accroitre vos ventes : '; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_325004e2f6f72a36519c6a79bd59de74'] = 'Préparez une campagne de publicité destinée à un groupe de clients susceptible d\'être intéressé par une offre en particulier, puis diffusez la à des heures précises.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7878438ad0cb68d43646e19bf8cda504'] = 'Contactez ces groupes de clients par e-mail ou avec une liste de diffusion'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_8dc514f6da8c696c4a522efc145ad28a'] = 'Répartition par sexe'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_63889cfb9d3cbe05d1bd2be5cc9953fd'] = 'Homme'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_b719ce180ec7bd9641fece2f920f4817'] = 'Femme'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Inconnu'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0e8cb607499d7862540d5736f6ab84e3'] = 'Tranches d\'âges'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_306fb378f025305fd17ec219fb193797'] = '0-18 ans'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_95ad6a8434399a1020f496ae093394a1'] = '18-24 ans'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_fb0d334f12a24f10715baef863e20db7'] = '25-34 ans'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_268750725a2f1cba57267447006d22ef'] = '35-49 ans'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_31974086ef82d676924acbb48fc3de1e'] = '50-59 ans'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f407fa37f8cd8c5900329882ad4529'] = '60 ans'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_73b0130037e21b76351aebfd29d0b9aa'] = 'Répartition par pays'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_28e81c8343702f6c813cc31a7f90616a'] = 'Répartition par devise'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Répartition par langue'; diff --git a/modules/statspersonalinfos/it.php b/modules/statspersonalinfos/it.php new file mode 100644 index 000000000..163315ec2 --- /dev/null +++ b/modules/statspersonalinfos/it.php @@ -0,0 +1,38 @@ +statspersonalinfos_8063f7c341dbe2cadc294a530cb1cad2'] = 'Info cliente registrato'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_ff9c34d2829b95a0936b22b409640143'] = 'Mostra caratteristiche come sesso ed età'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0df28a79b0b6ee5f2a91da83bb07117c'] = 'La distribuzione di sesso ti permette di determinare la percentuale di uomini e donne tra i tuoi clienti.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_66ea53c179f966ec08fc4710c60a85be'] = 'Le fasce di età ti permettono di determinare in quale fascia di età si trovano i tuoi clienti.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_d053730180bf7c54024068ab2a2edf5c'] = 'La distribuzione del paese ti permette di determinare da quale parte del mondo provengono i tuoi clienti.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_bcfebaf66fa6f885171c63997e2613d5'] = 'Le fasce di valuta ti permettono di determinare con quale valuta i tuoi clienti effettuano i pagamenti.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e0c88fe08ea4e9b77760ed2429628dea'] = 'La distribuzione delle lingue ti permette di determinare la lingua chei clienti usano nel tuo negozio.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7a7012cc5c52802b45aed45d1f616f1e'] = 'Nessun cliente ancora registrato.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_3ca26e413e485538a7f3e610c0324636'] = 'Raggiungi il tuo pubblico'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_c8eb1ba430d9ae8fe45fe2d990a481f5'] = 'Affinché ogni messaggio abbia un impatto, bisogna sapere a chi dovrebbe essere rivolto.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_5beafb6329f9718aa46293a7433697e5'] = 'Rivolgersi al pubblico giusto è fondamentale per poter scegliere gli strumenti giusti per conquistarlo.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f94ccd67cb072f87473491d409fe4c'] = 'E\' meglio limitare l\'azione ad un gruppo o gruppi di clienti.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f94c9050d83dfc68894175207b330785'] = 'Le informazioni sui clienti registrati consente di definire con maggiore precisione il profilo tipico del cliente in modo da poter adattare le tue caratteristiche a diversi criteri.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_72d2596650eeec0e4f630dd8841eb21e'] = 'Dovresti utilizzare queste informazioni per incrementare le vendite di:'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_325004e2f6f72a36519c6a79bd59de74'] = 'Avvio di campagne pubblicitarie rivolte a clienti specifici che potrebbero essere interessati a un\'offerta particolare, in date e orari specifici'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_7878438ad0cb68d43646e19bf8cda504'] = 'Contattare un gruppo di clienti via e-mail / newsletter.'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_8dc514f6da8c696c4a522efc145ad28a'] = 'Distribuzione di sesso'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_63889cfb9d3cbe05d1bd2be5cc9953fd'] = 'Maschio'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_b719ce180ec7bd9641fece2f920f4817'] = 'Femmina'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_88183b946cc5f0e8c96b2e66e1c74a7e'] = 'Sconosciuto'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_0e8cb607499d7862540d5736f6ab84e3'] = 'Fasce di età'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_306fb378f025305fd17ec219fb193797'] = '0-18 anni'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_95ad6a8434399a1020f496ae093394a1'] = '18-24 anni'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_fb0d334f12a24f10715baef863e20db7'] = '25-34 anni'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_268750725a2f1cba57267447006d22ef'] = '35-49 anni'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_31974086ef82d676924acbb48fc3de1e'] = '50-59 anni'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_e7f407fa37f8cd8c5900329882ad4529'] = '60 anni e più'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_73b0130037e21b76351aebfd29d0b9aa'] = 'Distribuzione per paese'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_28e81c8343702f6c813cc31a7f90616a'] = 'Distribuzione per valuta'; +$_MODULE['<{statspersonalinfos}prestashop>statspersonalinfos_f1dd68fb6a00d3e4d7f751deacde995d'] = 'Distribuzione per lingua'; + +?> \ No newline at end of file diff --git a/modules/statspersonalinfos/logo.gif b/modules/statspersonalinfos/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..899ecf56185b8e69abf9121fec121ff9f24524ef GIT binary patch literal 1031 zcmZ?wbhEHb6krfw_|5y5JSi*)FVa+nb9I62m7YMk@T1eckKuCo%|7Uc!6DDhfb8M&!8cu7sl zlG^kgZ7KUFq->i~ccWeRMu+Z=PW_vG#<%*dZ%r}1HOuVQLbF@T%x|qWy|v2h)_T)h zo6T-*v%b>laC?&D{i$xpr=^~rnSOD0%9-_Uch;0WSnB&|Rp`q-DbM#5eArs~@KD^N z!||UkI()w3_4$hLmmASvZpJ=3obdH_`q$f;pDq`CzFPA6deygkh2QR#e!pM!{b7Cc zq^_39lR9TESiEvi^O9G4FU;C=X+_hy|4YyQ-*NNt>;0|ocDB9W-TG=*_t7i!4_sY) z`uf6CH`iXiwczrdRoCvWeQHG1d|J#G9-yY8R`e6Q# zrxSiWo%rMFq#sWw|9Cp($FnK#o^QST^2*JZx9@!Xd*|c7AFmGm{&ed1r!&7k+1wi0cJ&%+wHIKC0qS|L@B} +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsPersonalInfos extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_option; + + function __construct() + { + $this->name = 'statspersonalinfos'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Registered Customer Info'); + $this->description = $this->l('Display characteristics such as gender and age.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + $this->_html = '
    '.$this->displayName.''; + if (sizeof(Customer::getCustomers())) + { + if (Tools::getValue('export')) + if (Tools::getValue('exportType') =='gender') + $this->csvExport(array('type' => 'pie', 'option' => 'gender')); + elseif (Tools::getValue('exportType') =='age') + $this->csvExport(array('type' => 'pie', 'option' => 'age')); + elseif (Tools::getValue('exportType') =='country') + $this->csvExport(array('type' => 'pie', 'option' => 'country')); + elseif (Tools::getValue('exportType') =='currency') + $this->csvExport(array('type' => 'pie', 'option' => 'currency')); + elseif (Tools::getValue('exportType') =='language') + $this->csvExport(array('type' => 'pie', 'option' => 'language')); + + $this->_html .= ' + +

    '.$this->l('Gender distribution allows you to determine the percentage of men and women among your customers.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'gender')).'
    +

    '.$this->l('CSV Export').'

    +

    +

    '.$this->l('Age ranges allows you to determine in which age range your customers are.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'age')).'
    +

    '.$this->l('CSV Export').'



    +

    '.$this->l('Country distribution allows you to determine in which part of the world your customers are shopping from.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'country')).'
    +

    '.$this->l('CSV Export').'



    +

    '.$this->l('Currency ranges allows you to determine which currencies your customers are using.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'currency')).'
    +

    '.$this->l('CSV Export').'



    +

    '.$this->l('Language distribution allows you to determine the general languages your customers are using on your shop.').'

    + '.$this->engine(array('type' => 'pie', 'option' => 'language')).'
    +

    '.$this->l('CSV Export').'

    + '; + } + else + $this->_html .= '

    '.$this->l('No customers registered yet.').'

    '; + $this->_html .= ' +

    +
    '.$this->l('Guide').' +

    '.$this->l('Target your audience').'

    +

    + '.$this->l('In order for each message to have an impact, you need to know to whom it should be addressed.').' + '.$this->l('Addressing the right audience is essential for choosing the right tools to win them over.').' + '.$this->l('It is best to limit action to a group or groups of clients.').' + '.$this->l('Registered customer information allows you to accurately define the typical customer profile so that you can adapt your specials to various criteria.').' +


    +

    + '.$this->l('You should use this information to increase your sales by').' +

      +
    • '.$this->l('launching ad campaigns addressed to specific customers who might be interested in a particular offer at specific dates and times.').'
    • +
    • '.$this->l('Contacting a group of clients by e-mail / newsletter.').'
    • +
    +


    +
    '; + return $this->_html; + } + + public function setOption($option, $layers = 1) + { + $this->_option = $option; + } + + protected function getData($layers) + { + global $cookie; + + switch ($this->_option) + { + case 'gender': + $this->_titles['main'] = $this->l('Gender distribution'); + $sql = 'SELECT `id_gender`, COUNT(`id_customer`) AS total + FROM `'._DB_PREFIX_.'customer` + WHERE 1 + '.$this->sqlShopRestriction(true).' + GROUP BY `id_gender`'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + $gender = array(1 => $this->l('Male'), 2 => $this->l('Female'), 9 => $this->l('Unknown'), 0 => $this->l('Unknown')); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = $gender[$row['id_gender']]; + } + break; + + case 'age': + $this->_titles['main'] = $this->l('Age ranges'); + + // 0 - 18 years + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) < 18 + '.$this->sqlShopRestriction(true).' + AND `birthday` IS NOT NULL'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('0-18 years old'); + } + + // 18 - 24 years + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) >= 18 + AND (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) < 25 + '.$this->sqlShopRestriction(true).' + AND `birthday` IS NOT NULL'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('18-24 years old'); + } + + // 25 - 34 years + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) >= 25 + AND (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) < 35 + '.$this->sqlShopRestriction(true).' + AND `birthday` IS NOT NULL'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('25-34 years old'); + } + + // 35 - 49 years + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) >= 35 + AND (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) < 50 + '.$this->sqlShopRestriction(true).' + AND `birthday` IS NOT NULL'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('35-49 years old'); + } + + // 50 - 59 years + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) >= 50 + AND (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) < 60 + '.$this->sqlShopRestriction(true).' + AND `birthday` IS NOT NULL'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('50-59 years old'); + } + + // More than 60 years + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE (YEAR(CURDATE()) - YEAR(`birthday`)) - (RIGHT(CURDATE(), 5) < RIGHT(`birthday`, 5)) >= 60 + '.$this->sqlShopRestriction(true).' + AND `birthday` IS NOT NULL'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('60 years old and more'); + } + + // Total unknown + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE `birthday` IS NULL + '.$this->sqlShopRestriction(true); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + if (isset($result['total']) AND $result['total']) + { + $this->_values[] = $result['total']; + $this->_legend[] = $this->l('Unknown'); + } + break; + + case 'country': + $this->_titles['main'] = $this->l('Country distribution'); + $sql = 'SELECT cl.`name`, COUNT(c.`id_country`) AS total + FROM `'._DB_PREFIX_.'address` a + LEFT JOIN `'._DB_PREFIX_.'customer` cu ON cu.id_customer = a.id_customer + LEFT JOIN `'._DB_PREFIX_.'country` c ON a.`id_country` = c.`id_country` + LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)$cookie->id_lang.') + WHERE a.id_customer != 0 + '.$this->sqlShopRestriction(true, 'cu').' + GROUP BY c.`id_country`'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = $row['name']; + } + break; + + case 'currency': + $this->_titles['main'] = $this->l('Currency distribution'); + $sql = 'SELECT c.`name`, COUNT(c.`id_currency`) AS total + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'currency` c ON o.`id_currency` = c.`id_currency` + WHERE 1 + '.$this->sqlShopRestriction(false, 'o').' + GROUP BY c.`id_currency`'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = $row['name']; + } + break; + + case 'language': + $this->_titles['main'] = $this->l('Language distribution'); + $sql = 'SELECT c.`name`, COUNT(c.`id_lang`) AS total + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'lang` c ON o.`id_lang` = c.`id_lang` + WHERE 1 + '.$this->sqlShopRestriction(false, 'o').' + GROUP BY c.`id_lang`'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = $row['name']; + } + break; + } + } +} + + diff --git a/modules/statsproduct/config.xml b/modules/statsproduct/config.xml new file mode 100755 index 000000000..9cd7859d7 --- /dev/null +++ b/modules/statsproduct/config.xml @@ -0,0 +1,12 @@ + + + statsproduct + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsproduct/de.php b/modules/statsproduct/de.php new file mode 100644 index 000000000..e930161e0 --- /dev/null +++ b/modules/statsproduct/de.php @@ -0,0 +1,41 @@ +statsproduct_78e454064a7d3a7755a011a3b79f31a7'] = 'Produktdetails'; +$_MODULE['<{statsproduct}prestashop>statsproduct_285201dab507840d082d58dc13602b00'] = 'Holen Sie sich detaillierte Statistiken für jedes Produkt'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3ec365dd533ddb7ef3d1c111186ce872'] = 'Details'; +$_MODULE['<{statsproduct}prestashop>statsproduct_981a6013008c8f4b75836b0f415b05b8'] = 'Insgesamt gekauft:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6780a9268e38d2ddd4f6c4a8ccf83d24'] = 'Verkäufe (-Tx):'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b262bbde88b3b8dca3b27d730aca69bf'] = 'Insgesamt angesehen:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_bebbab2c1ac732ccef4181f51ed52967'] = 'Umwandlungsrate:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsproduct}prestashop>statsproduct_c90b9dca2d3f5bb6e0d0bdceac8a631d'] = 'Attribute Umsatzverteilung'; +$_MODULE['<{statsproduct}prestashop>statsproduct_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{statsproduct}prestashop>statsproduct_44749712dbec183e983dcd78a7736c41'] = 'Datum'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a240fa27925a635b08dc28c9e4f9216d'] = 'Bestellung'; +$_MODULE['<{statsproduct}prestashop>statsproduct_ce26601dac0dea138b7295f02b7620a7'] = 'Kunde'; +$_MODULE['<{statsproduct}prestashop>statsproduct_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attribut'; +$_MODULE['<{statsproduct}prestashop>statsproduct_03ab340b3f99e03cff9e84314ead38c0'] = 'Anz'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3601146c4e948c32b6424d2c0a7f0118'] = 'Preis'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Cross-Selling'; +$_MODULE['<{statsproduct}prestashop>statsproduct_df644ae155e79abf54175bd15d75f363'] = 'Produktname'; +$_MODULE['<{statsproduct}prestashop>statsproduct_2a0440eec72540c5b30d9199c01f348c'] = 'Verkaufte Menge '; +$_MODULE['<{statsproduct}prestashop>statsproduct_844c29394eea07066bb2efefc35784ec'] = 'Durchschnittlicher Preis'; +$_MODULE['<{statsproduct}prestashop>statsproduct_0173374ac20f5843d58b553d5b226ef6'] = 'Wählen Sie eine Kategorie'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Alle'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3303da9d5241177588a06ad60d7edaba'] = 'Klicken Sie auf ein Produkt, um auf seine Statistiken zugreifen.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6ccf03bc05e4b749b74b5d577c7e7d3a'] = 'Produkte verfügbar'; +$_MODULE['<{statsproduct}prestashop>statsproduct_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{statsproduct}prestashop>statsproduct_27ce7f8b5623b2e2df568d64cf051607'] = 'Lager'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6c1a8292e4da90e1ef19ae9444226d8f'] = 'Anzahl der Käufe im Vergleich zur Anzahl der Aufrufe'; +$_MODULE['<{statsproduct}prestashop>statsproduct_1d0ba341c7847cbff109276485417a1c'] = 'Nach Auswahl einer Kategorie sowie eines verfügbaren Produkts in dieser Kategorie erscheinen einige Schaubilder. Diese können Sie analysieren.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6559cc601f073740b825a4fc9b76149b'] = 'Wenn Sie merken, dass ein Produkt erfolgreich ist, oft gekauft wird, aber auch selten angesehen wird, sollten Sie es weiter nach vorne in Ihren Webshop Front-Office setzen.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_20b9641efab51dee7d27eed2b6773ef0'] = 'Wenn aber ein Produkt oft aufgerufen, aber nicht gekauft wurde, raten wir Ihnen, diese Produktinformationen Beschreibungen und Fotografien zu überprüfen oder zu ändern.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_e22269bb51f9f2394e148716babbafbb'] = 'Beliebtheit'; +$_MODULE['<{statsproduct}prestashop>statsproduct_5e9613e58f3bdbc89b1fef07274c0877'] = 'Besuche (x100)'; +$_MODULE['<{statsproduct}prestashop>statsproduct_287234a1ff35a314b5b6bc4e5828e745'] = 'Attribute'; + +?> \ No newline at end of file diff --git a/modules/statsproduct/en.php b/modules/statsproduct/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsproduct/en.php @@ -0,0 +1,4 @@ +statsproduct_78e454064a7d3a7755a011a3b79f31a7'] = 'Detalles del producto'; +$_MODULE['<{statsproduct}prestashop>statsproduct_285201dab507840d082d58dc13602b00'] = 'Conseguir las estadísticas detalladas para cada producto'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3ec365dd533ddb7ef3d1c111186ce872'] = 'Detalles'; +$_MODULE['<{statsproduct}prestashop>statsproduct_981a6013008c8f4b75836b0f415b05b8'] = 'Total de compras:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6780a9268e38d2ddd4f6c4a8ccf83d24'] = 'Volumen de ventas (sin IVA)'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b262bbde88b3b8dca3b27d730aca69bf'] = 'total visto:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_bebbab2c1ac732ccef4181f51ed52967'] = 'Índice de conversión'; +$_MODULE['<{statsproduct}prestashop>statsproduct_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsproduct}prestashop>statsproduct_c90b9dca2d3f5bb6e0d0bdceac8a631d'] = 'Distribuir las ventas por cualidades'; +$_MODULE['<{statsproduct}prestashop>statsproduct_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventas'; +$_MODULE['<{statsproduct}prestashop>statsproduct_44749712dbec183e983dcd78a7736c41'] = 'Fecha'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a240fa27925a635b08dc28c9e4f9216d'] = 'Pedido'; +$_MODULE['<{statsproduct}prestashop>statsproduct_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{statsproduct}prestashop>statsproduct_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Atributo'; +$_MODULE['<{statsproduct}prestashop>statsproduct_03ab340b3f99e03cff9e84314ead38c0'] = 'Cant.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3601146c4e948c32b6424d2c0a7f0118'] = 'Precio'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Ventas cruzadas'; +$_MODULE['<{statsproduct}prestashop>statsproduct_df644ae155e79abf54175bd15d75f363'] = 'Artículo'; +$_MODULE['<{statsproduct}prestashop>statsproduct_2a0440eec72540c5b30d9199c01f348c'] = 'Cantidad vendida'; +$_MODULE['<{statsproduct}prestashop>statsproduct_844c29394eea07066bb2efefc35784ec'] = 'Precio medio'; +$_MODULE['<{statsproduct}prestashop>statsproduct_0173374ac20f5843d58b553d5b226ef6'] = 'Elegir una categoría'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Todas'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3303da9d5241177588a06ad60d7edaba'] = 'Haga clic en un producto para acceder a sus estadísticas.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6ccf03bc05e4b749b74b5d577c7e7d3a'] = 'Disponibilidad de los productos'; +$_MODULE['<{statsproduct}prestashop>statsproduct_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{statsproduct}prestashop>statsproduct_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6c1a8292e4da90e1ef19ae9444226d8f'] = 'Número de compras en relación con el número de visitas'; +$_MODULE['<{statsproduct}prestashop>statsproduct_1d0ba341c7847cbff109276485417a1c'] = 'Tras elegir una categoría y seleccionar un producto disponible de la categoría, aparecen algunos gráficos. Entonces, usted puede analizarlos.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6559cc601f073740b825a4fc9b76149b'] = 'Si observa que un producto tiene éxito, que se compra mucho pero que se consulta poco, debería hacerlo resaltar más en el escaparate de su tienda.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_20b9641efab51dee7d27eed2b6773ef0'] = 'Si por el contrario, un producto es muy consultado pero se vende mal le aconsejamos que compruebe de nuevo o modifique las informaciones, descripción o fotografía(s) presentes en su ficha producto.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_e22269bb51f9f2394e148716babbafbb'] = 'Popularidad'; +$_MODULE['<{statsproduct}prestashop>statsproduct_5e9613e58f3bdbc89b1fef07274c0877'] = 'Visitas (x100)'; +$_MODULE['<{statsproduct}prestashop>statsproduct_287234a1ff35a314b5b6bc4e5828e745'] = 'Atributos'; diff --git a/modules/statsproduct/fr.php b/modules/statsproduct/fr.php new file mode 100644 index 000000000..43d32b500 --- /dev/null +++ b/modules/statsproduct/fr.php @@ -0,0 +1,39 @@ +statsproduct_78e454064a7d3a7755a011a3b79f31a7'] = 'Détail produit'; +$_MODULE['<{statsproduct}prestashop>statsproduct_285201dab507840d082d58dc13602b00'] = 'Propose des statistiques détaillées pour chaque produit'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3ec365dd533ddb7ef3d1c111186ce872'] = 'Détails'; +$_MODULE['<{statsproduct}prestashop>statsproduct_981a6013008c8f4b75836b0f415b05b8'] = 'Total des achats'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6780a9268e38d2ddd4f6c4a8ccf83d24'] = 'CA (hors taxes) :'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b262bbde88b3b8dca3b27d730aca69bf'] = 'Total des consultations'; +$_MODULE['<{statsproduct}prestashop>statsproduct_bebbab2c1ac732ccef4181f51ed52967'] = 'Taux de conversion'; +$_MODULE['<{statsproduct}prestashop>statsproduct_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsproduct}prestashop>statsproduct_c90b9dca2d3f5bb6e0d0bdceac8a631d'] = 'Répartition des ventes par attributs'; +$_MODULE['<{statsproduct}prestashop>statsproduct_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'CA'; +$_MODULE['<{statsproduct}prestashop>statsproduct_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a240fa27925a635b08dc28c9e4f9216d'] = 'Commande'; +$_MODULE['<{statsproduct}prestashop>statsproduct_ce26601dac0dea138b7295f02b7620a7'] = 'Client'; +$_MODULE['<{statsproduct}prestashop>statsproduct_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attribut'; +$_MODULE['<{statsproduct}prestashop>statsproduct_03ab340b3f99e03cff9e84314ead38c0'] = 'Qté'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3601146c4e948c32b6424d2c0a7f0118'] = 'Prix'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Ventes croisées'; +$_MODULE['<{statsproduct}prestashop>statsproduct_df644ae155e79abf54175bd15d75f363'] = 'Article'; +$_MODULE['<{statsproduct}prestashop>statsproduct_2a0440eec72540c5b30d9199c01f348c'] = 'Quantité vendue'; +$_MODULE['<{statsproduct}prestashop>statsproduct_844c29394eea07066bb2efefc35784ec'] = 'Prix moyen'; +$_MODULE['<{statsproduct}prestashop>statsproduct_0173374ac20f5843d58b553d5b226ef6'] = 'Choisissez une catégorie'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Toutes'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3303da9d5241177588a06ad60d7edaba'] = 'Cliquez sur un produit pour accéder à ses statistiques.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6ccf03bc05e4b749b74b5d577c7e7d3a'] = 'Produits disponibles'; +$_MODULE['<{statsproduct}prestashop>statsproduct_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{statsproduct}prestashop>statsproduct_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6c1a8292e4da90e1ef19ae9444226d8f'] = 'Comparaison du nombre d\'achat et du nombre de consultations'; +$_MODULE['<{statsproduct}prestashop>statsproduct_1d0ba341c7847cbff109276485417a1c'] = 'Après avoir choisi une catégorie et sélectionné un produit disponible dans cette catégorie, des graphiques apparaissent. Vous pouvez ensuite les analyser.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6559cc601f073740b825a4fc9b76149b'] = 'Si vous constatez qu\'un produit a du succès, qu\'il est beaucoup acheté mais très peu consulté : vous devriez le mettre davantage en évidence dans la vitrine de votre boutique.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_20b9641efab51dee7d27eed2b6773ef0'] = 'Si au contraire un produit connait un grand nombre de consultations mais est très peu acheté : nous vous conseillons alors de vérifier à nouveau ou de modifier les informations, description ou photographie(s) présentes dans sa fiche produit.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_e22269bb51f9f2394e148716babbafbb'] = 'Popularité'; +$_MODULE['<{statsproduct}prestashop>statsproduct_5e9613e58f3bdbc89b1fef07274c0877'] = 'Visites (x100)'; +$_MODULE['<{statsproduct}prestashop>statsproduct_287234a1ff35a314b5b6bc4e5828e745'] = 'Attributs'; diff --git a/modules/statsproduct/it.php b/modules/statsproduct/it.php new file mode 100644 index 000000000..bf8bb2a99 --- /dev/null +++ b/modules/statsproduct/it.php @@ -0,0 +1,41 @@ +statsproduct_78e454064a7d3a7755a011a3b79f31a7'] = 'Dettagli del prodotto'; +$_MODULE['<{statsproduct}prestashop>statsproduct_285201dab507840d082d58dc13602b00'] = 'Ottieni statistiche dettagliate per ogni prodotto'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3ec365dd533ddb7ef3d1c111186ce872'] = 'Dettagli'; +$_MODULE['<{statsproduct}prestashop>statsproduct_981a6013008c8f4b75836b0f415b05b8'] = 'Totale comprato:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6780a9268e38d2ddd4f6c4a8ccf83d24'] = 'Vendite (-Tasse):'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b262bbde88b3b8dca3b27d730aca69bf'] = 'Totale visite:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_bebbab2c1ac732ccef4181f51ed52967'] = 'Tasso di conversione:'; +$_MODULE['<{statsproduct}prestashop>statsproduct_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsproduct}prestashop>statsproduct_c90b9dca2d3f5bb6e0d0bdceac8a631d'] = 'Distribuzione vendite attributo'; +$_MODULE['<{statsproduct}prestashop>statsproduct_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{statsproduct}prestashop>statsproduct_44749712dbec183e983dcd78a7736c41'] = 'Data'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a240fa27925a635b08dc28c9e4f9216d'] = 'Ordine'; +$_MODULE['<{statsproduct}prestashop>statsproduct_ce26601dac0dea138b7295f02b7620a7'] = 'Cliente'; +$_MODULE['<{statsproduct}prestashop>statsproduct_f2bbdf9f72c085adc4d0404e370f0f4c'] = 'Attributo'; +$_MODULE['<{statsproduct}prestashop>statsproduct_03ab340b3f99e03cff9e84314ead38c0'] = 'Qtà'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3601146c4e948c32b6424d2c0a7f0118'] = 'Prezzo'; +$_MODULE['<{statsproduct}prestashop>statsproduct_a1892c39b2598b4f30f9cc92c59f1aa5'] = 'Vendita incrociata'; +$_MODULE['<{statsproduct}prestashop>statsproduct_df644ae155e79abf54175bd15d75f363'] = 'Nome del prodotto'; +$_MODULE['<{statsproduct}prestashop>statsproduct_2a0440eec72540c5b30d9199c01f348c'] = 'Quantità venduta'; +$_MODULE['<{statsproduct}prestashop>statsproduct_844c29394eea07066bb2efefc35784ec'] = 'Prezzo medio'; +$_MODULE['<{statsproduct}prestashop>statsproduct_0173374ac20f5843d58b553d5b226ef6'] = 'Scegli una categoria'; +$_MODULE['<{statsproduct}prestashop>statsproduct_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tutti'; +$_MODULE['<{statsproduct}prestashop>statsproduct_3303da9d5241177588a06ad60d7edaba'] = 'Clicca su un prodotto per accedere alle statistiche.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6ccf03bc05e4b749b74b5d577c7e7d3a'] = 'Prodotti disponibili'; +$_MODULE['<{statsproduct}prestashop>statsproduct_12d3c7a4296542c62474856ec452c045'] = 'Rif.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{statsproduct}prestashop>statsproduct_27ce7f8b5623b2e2df568d64cf051607'] = 'Magazzino'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6c1a8292e4da90e1ef19ae9444226d8f'] = 'Numero di acquisti rispetto al numero di visualizzazioni'; +$_MODULE['<{statsproduct}prestashop>statsproduct_1d0ba341c7847cbff109276485417a1c'] = 'Dopo aver scelto una categoria e selezionato un prodotto disponibile in questa categoria, appariranno dei grafici. Poi, potrai analizzarli.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_6559cc601f073740b825a4fc9b76149b'] = 'Se noti che un prodotto ha successo, viene spesso acquistato ma visualizzato raramente, dovresti collocarlo in maniera più visibile nel tuo negozio'; +$_MODULE['<{statsproduct}prestashop>statsproduct_20b9641efab51dee7d27eed2b6773ef0'] = 'D\'altra parte, se un prodotto ha un sacco di visualizzazioni ma non è realmente acquistato: ti consigliamo di controllare o modificare le informazioni di questo prodotto, la descrizione e la fotografia.'; +$_MODULE['<{statsproduct}prestashop>statsproduct_e22269bb51f9f2394e148716babbafbb'] = 'Popolarità'; +$_MODULE['<{statsproduct}prestashop>statsproduct_5e9613e58f3bdbc89b1fef07274c0877'] = 'Visite (x100)'; +$_MODULE['<{statsproduct}prestashop>statsproduct_287234a1ff35a314b5b6bc4e5828e745'] = 'Attributi'; + +?> \ No newline at end of file diff --git a/modules/statsproduct/logo.gif b/modules/statsproduct/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2350555ed39e05138b662421841771d7e48cf69d GIT binary patch literal 1018 zcmeH`+fPyf0Eds-NC#^~%WgiXEM2YjV9n`t4a=EsJy2uKX&YF~>3VV1)>}i}5H;o6 zBs9mS8Cp2*0wULgT#ww6KoAZj0)U3S$C*qfi^XEI*&Ggs z%jNQTJU*W<5C|q_RBvZwLZNVOZcZc;iN)f@#YL%9DwE0Na=B72Q79BjrBbC*snu$Y zMx)hgmY0`xI-OpxHy8|)Vv|4>p47&tSKtM$F5E4*N#Wb9_O98u;uzSg9G@48%v)OF1SU?c8*=%;Z-QjRJ zolcj_<#xLv2wGcP^LRX7uh-}E`ThPtAh5o^9t;LUp-?y+jzl8SXmoRPGZu@*<8gQN zhiPNq8r`?X4jj>+Hu%s9|8gbsP%r zo6Y8Oxt*Pzy}dmILH_pskAJ8@#qSdZ0B{6cJ9aw$1W^11I4UV?l?Y9Ps1!w7`F{I~_Uc=Yp0 zY-Nu4oQ}CrTQ`L*XJ57st-##c$b(Sd2^LCyVZ_I*}Kj?E0lQq`Ui?o n=nh`n6BNY66kROG$nV(Dm?j*ysa3)#tU&dgDI0(Z1fby$6F+L* literal 0 HcmV?d00001 diff --git a/modules/statsproduct/statsproduct.php b/modules/statsproduct/statsproduct.php new file mode 100644 index 000000000..ff5b67db1 --- /dev/null +++ b/modules/statsproduct/statsproduct.php @@ -0,0 +1,437 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsProduct extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_option = 0; + private $_id_product = 0; + + function __construct() + { + $this->name = 'statsproduct'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Product details'); + $this->description = $this->l('Get detailed statistics for each product.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function getTotalBought($id_product) + { + $dateBetween = ModuleGraph::getDateBetween(); + $sql = 'SELECT SUM(od.`product_quantity`) AS total + FROM `'._DB_PREFIX_.'order_detail` od + LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = od.`id_order` + WHERE od.`product_id` = '.(int)$id_product.' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND o.`date_add` BETWEEN '.$dateBetween; + return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + public function getTotalSales($id_product) + { + $dateBetween = ModuleGraph::getDateBetween(); + $sql = 'SELECT SUM(od.`product_quantity` * od.`product_price`) AS total + FROM `'._DB_PREFIX_.'order_detail` od + LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = od.`id_order` + WHERE od.`product_id` = '.(int)($id_product).' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND o.`date_add` BETWEEN '.$dateBetween; + return (float)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + public function getTotalViewed($id_product) + { + $dateBetween = ModuleGraph::getDateBetween(); + $sql = 'SELECT SUM(pv.`counter`) AS total + FROM `'._DB_PREFIX_.'page_viewed` pv + LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON pv.`id_date_range` = dr.`id_date_range` + LEFT JOIN `'._DB_PREFIX_.'page` p ON pv.`id_page` = p.`id_page` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type` + WHERE pt.`name` = \'product.php\' + '.$this->sqlShopRestriction(false, 'pv').' + AND p.`id_object` = '.(int)($id_product).' + AND dr.`time_start` BETWEEN '.$dateBetween.' + AND dr.`time_end` BETWEEN '.$dateBetween; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return isset($result['total']) ? $result['total'] : 0; + } + + private function getProducts($id_lang) + { + $joinShop = $whereShop = ''; + if ($this->shopID || $this->shopGroupID) + { + $joinShop = ' LEFT JOIN '._DB_PREFIX_.'product_shop ps ON ps.id_product = p.id_product '; + if ($this->shopID) + $whereShop = ' ps.id_shop = '.$this->shopID.' AND '; + else if ($this->shopGroupID) + $whereShop = 'ps.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.') AND'; + } + + $sql = 'SELECT p.`id_product`, p.reference, pl.`name`, IFNULL( + (SELECT SUM(pa.quantity) FROM '._DB_PREFIX_.'product_attribute pa WHERE pa.id_product = p.id_product), p.quantity) as quantity + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.`id_product` = pl.`id_product` + '.$joinShop.' + '.(Tools::getValue('id_category') ? 'LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product`' : '').' + WHERE '.$whereShop.' + pl.`id_lang` = '.(int)($id_lang).' + '.(Tools::getValue('id_category') ? 'AND cp.id_category = '.(int)(Tools::getValue('id_category')) : '').' + ORDER BY pl.`name`'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + private function getSales($id_product, $id_lang) + { + $sql = 'SELECT o.date_add, o.id_order, o.id_customer, od.product_quantity, (od.product_price * od.product_quantity) as total, od.tax_name, od.product_name + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order + WHERE o.date_add BETWEEN '.$this->getDate().' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND od.product_id = '.(int)($id_product); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + private function getCrossSales($id_product, $id_lang) + { + $sql = 'SELECT pl.name as pname, pl.id_product, SUM(od.product_quantity) as pqty, AVG(od.product_price) as pprice + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.id_product = od.product_id AND pl.id_lang = '.(int)($id_lang).') + WHERE o.id_customer IN ( + SELECT o.id_customer + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order + WHERE o.date_add BETWEEN '.$this->getDate().' + AND o.valid = 1 + AND od.product_id = '.(int)($id_product).' + ) + '.$this->sqlShopRestriction(false, 'o').' + AND o.date_add BETWEEN '.$this->getDate().' + AND o.valid = 1 + AND od.product_id != '.(int)($id_product).' + GROUP BY od.product_id + ORDER BY pqty DESC'; + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); + } + + public function hookAdminStatsModules($params) + { + global $cookie, $currentIndex; + $id_category = (int)(Tools::getValue('id_category')); + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + + if (Tools::getValue('export')) + if (!Tools::getValue('exportType')) + $this->csvExport(array('layers' => 2, 'type' => 'line', 'option' => '42')); + + $this->_html = '
    '.$this->displayName.''; + if ($id_product = (int)(Tools::getValue('id_product'))) + { + if (Tools::getValue('export')) + if (Tools::getValue('exportType') == 1) + $this->csvExport(array('layers' => 2, 'type' => 'line', 'option' => '1-'.$id_product)); + elseif (Tools::getValue('exportType') == 2) + $this->csvExport(array('type' => 'pie', 'option' => '3-'.$id_product)); + $product = new Product($id_product, false, (int)($cookie->id_lang)); + $totalBought = $this->getTotalBought($product->id); + $totalSales = $this->getTotalSales($product->id); + $totalViewed = $this->getTotalViewed($product->id); + $this->_html .= '

    '.$product->name.' - '.$this->l('Details').'

    +

    '.$this->l('Total bought:').' '.$totalBought.'

    +

    '.$this->l('Sales (-Tx):').' '.Tools::displayprice($totalSales, $currency).'

    +

    '.$this->l('Total viewed:').' '.$totalViewed.'

    +

    '.$this->l('Conversion rate:').' '.number_format($totalViewed ? $totalBought / $totalViewed : 0, 2).'

    +
    '.$this->engine(array('layers' => 2, 'type' => 'line', 'option' => '1-'.$id_product)).'
    +
    +

    '.$this->l('CSV Export').'

    '; + if ($hasAttribute = $product->hasAttributes() AND $totalBought) + $this->_html .= '

    '.$this->l('Attribute sales distribution').'

    '.$this->engine(array('type' => 'pie', 'option' => '3-'.$id_product)).'

    +

    '.$this->l('CSV Export').'


    '; + if ($totalBought) + { + $sales = $this->getSales($id_product, $cookie->id_lang); + $this->_html .= '
    +

    '.$this->l('Sales').'

    +
    + + + + + + + '.($hasAttribute ? '' : '').' + + + + '; + $tokenOrder = Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($cookie->id_employee)); + $tokenCustomer = Tools::getAdminToken('AdminCustomers'.(int)(Tab::getIdFromClassName('AdminCustomers')).(int)($cookie->id_employee)); + foreach ($sales as $sale) + $this->_html .= ' + + + + + '.($hasAttribute ? '' : '').' + + + '; + $this->_html .= '
    '.$this->l('Date').''.$this->l('Order').''.$this->l('Customer').''.$this->l('Attribute').''.$this->l('Qty').''.$this->l('Price').'
    '.Tools::displayDate($sale['date_add'], (int)($cookie->id_lang), false).''.(int)($sale['id_order']).''.(int)($sale['id_customer']).''.$sale['product_name'].''.(int)($sale['product_quantity']).''.Tools::displayprice($sale['total'], $currency).'
    '; + + $crossSelling = $this->getCrossSales($id_product, $cookie->id_lang); + if (count($crossSelling)) + { + $this->_html .= '
    +

    '.$this->l('Cross Selling').'

    +
    + + + + + + + + '; + $tokenProducts = Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)($cookie->id_employee)); + foreach ($crossSelling as $selling) + $this->_html .= ' + + + + + '; + $this->_html .= '
    '.$this->l('Product name').''.$this->l('Quantity sold').''.$this->l('Average price').'
    '.$selling['pname'].''.(int)($selling['pqty']).''.Tools::displayprice($selling['pprice'], $currency).'
    '; + } + } + } + else + { + $categories = Category::getCategories((int)($cookie->id_lang), true, false); + $this->_html .= ' + +
    +
    + +
    +
    +
    + '.$this->l('Click on a product to access its statistics.').' +
    +

    '.$this->l('Products available').'

    +
    + + + + + + + + '; + foreach ($this->getProducts($cookie->id_lang) AS $product) + $this->_html .= ''; + $this->_html .= '
    '.$this->l('Ref.').''.$this->l('Name').''.$this->l('Stock').'
    '.$product['reference'].''.$product['name'].''.$product['quantity'].'


    + '.$this->l('CSV Export').'
    '; + } + + $this->_html .= '

    +
    '.$this->l('Guide').' +

    '.$this->l('Number of purchases compared to number of viewings').'

    +

    + '.$this->l('After choosing a category and selecting a product, informational graphs will appear. Then, you will be able to analyze them.').' +

      +
    • '.$this->l('If you notice that a product is successful and often purchased, but viewed infrequently, you should put it more prominently on your webshop front-office.').'
    • +
    • '.$this->l('On the other hand, if a product has many viewings but is not often purchased, we advise you to check or modify this product\'s information, description and photography again.').' +
    • +
    +

    +
    '; + return $this->_html; + } + + public function setOption($option, $layers = 1) + { + $options = explode('-', $option); + if (count($options) === 2) + list($this->_option, $this->_id_product) = $options; + else + $this->_option = $option; + $dateBetween = $this->getDate(); + switch ($this->_option) + { + case 1: + $this->_titles['main'][0] = $this->l('Popularity'); + $this->_titles['main'][1] = $this->l('Sales'); + $this->_titles['main'][2] = $this->l('Visits (x100)'); + $this->_query[0] = 'SELECT o.`date_add`, SUM(od.`product_quantity`) AS total + FROM `'._DB_PREFIX_.'order_detail` od + LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = od.`id_order` + WHERE od.`product_id` = '.(int)($this->_id_product).' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND o.`date_add` BETWEEN '.$dateBetween.' + GROUP BY o.`date_add`'; + + $this->_query[1] = 'SELECT dr.`time_start` AS date_add, (SUM(pv.`counter`) / 100) AS total + FROM `'._DB_PREFIX_.'page_viewed` pv + LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON pv.`id_date_range` = dr.`id_date_range` + LEFT JOIN `'._DB_PREFIX_.'page` p ON pv.`id_page` = p.`id_page` + LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type` + WHERE pt.`name` = \'product.php\' + '.$this->sqlShopRestriction(false, 'pv').' + AND p.`id_object` = '.(int)($this->_id_product).' + AND dr.`time_start` BETWEEN '.$dateBetween.' + AND dr.`time_end` BETWEEN '.$dateBetween.' + GROUP BY dr.`time_start`'; + break; + + case 3: + $this->_query = 'SELECT product_attribute_id, SUM(od.`product_quantity`) AS total + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.`id_order` = od.`id_order` + WHERE od.`product_id` = '.(int)($this->_id_product).' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND o.`date_add` BETWEEN '.$dateBetween.' + GROUP BY od.`product_attribute_id`'; + $this->_titles['main'] = $this->l('Attributes'); + break; + + case 42: + $this->_titles['main'][1] = $this->l('Ref.'); + $this->_titles['main'][2] = $this->l('Name'); + $this->_titles['main'][3] = $this->l('Stock'); + break; + } + } + + protected function getData($layers) + { + global $cookie; + if ($this->_option == 42) + { + $products = $this->getProducts(intval($cookie->id_lang)); + foreach ($products AS $product) + { + $this->_values[0][] = $product['reference']; + $this->_values[1][] = $product['name']; + $this->_values[2][] = $product['quantity']; + $this->_legend[] = $product['id_product']; + } + } + elseif ($this->_option != 3) + $this->setDateGraph($layers, true); + else + { + $product = new Product($this->_id_product, false, (int)($this->getLang())); + + $combArray = array(); + $assocNames = array(); + $combinaisons = $product->getAttributeCombinaisons((int)($this->getLang())); + foreach ($combinaisons AS $k => $combinaison) + $combArray[$combinaison['id_product_attribute']][] = array('group' => $combinaison['group_name'], 'attr' => $combinaison['attribute_name']); + foreach ($combArray AS $id_product_attribute => $product_attribute) + { + $list = ''; + foreach ($product_attribute AS $attribute) + $list .= trim($attribute['group']).' - '.trim($attribute['attr']).', '; + $list = rtrim($list, ', '); + $assocNames[$id_product_attribute] = $list; + } + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = @$assocNames[$row['product_attribute_id']]; + } + } + } + + protected function setAllTimeValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i]); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 0, 4))] += $row['total']; + } + } + + protected function setYearValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i]); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 5, 2))] += $row['total']; + } + } + + protected function setMonthValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i]); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 8, 2))] += $row['total']; + } + } + + protected function setDayValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i]); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 11, 2))] += $row['total']; + } + } +} \ No newline at end of file diff --git a/modules/statsregistrations/config.xml b/modules/statsregistrations/config.xml new file mode 100755 index 000000000..547b31c7d --- /dev/null +++ b/modules/statsregistrations/config.xml @@ -0,0 +1,12 @@ + + + statsregistrations + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsregistrations/de.php b/modules/statsregistrations/de.php new file mode 100644 index 000000000..067a82efc --- /dev/null +++ b/modules/statsregistrations/de.php @@ -0,0 +1,22 @@ +statsregistrations_8b15fc6468c919d299f9a601b61b95fc'] = 'Kundenkonten'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_089c9061407fd978366e78b6ad1d0111'] = 'Anzeige des Fortschritts der Kundenregistrierung'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_75abad0b891bc086fd4837e81a8c488a'] = 'Besucher, die bei der Registrierung aufgehört haben:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_4e4f3af3fb18136b8eec4b77f25095ce'] = 'Besucher, die direkt nach der Anmeldung eine Bestellung vorgenommen haben:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a751e9cc4ed4c7585ecc0d97781cb48a'] = 'Kundenkonten insgesamt:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_fba0e64541196123bbf8e3737bf9287b'] = 'Anzahl der erstellten Kundenkonten '; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a286f4eaef73a0b4f955c42b84472444'] = 'Die Gesamtzahl der erstellten Konten ist an sich keine wichtige Information. Es ist allerdings interessant, die Zahl der Eröffnungen über die Zeit gesehen zu analysieren. Dies sagt aus, ob die Dinge auf dem richtigen Weg sind.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_57a6f41a27c9baa5b402d30e97d4c1e8'] = 'Die richtige Reaktion auf die Entwicklung der Registrierungen'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f123e4522d188fba4cbe1dc58034f95c'] = 'Wenn Sie Ihren Shop laufen lassen, ohne etwas zu ändern, sollte die Anzahl der Kunden-Registrierungen stabil bleiben oder leicht rückläufig sein.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f8426f15c536f4341dbeb4d806f76167'] = 'Ein signifikanter Anstieg oder Rückgang zeigt, dass es wahrscheinlich eine Änderung in Ihrem Shop gegeben hat, Sie müssensie identifizieren, um herauszufinden, ob diese Änderung die Zahl der Anmeldungen zurückgehen lässt oder fortfahren, wenn dies vorteilhaft ist.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_48ad285c9749cc74821048c49aea6a50'] = 'Hier ist eine Zusammenfassung dessen, was die Eröffnung von Kundenkonten beeinflusst:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_cd0d9770ca8ee818040fa3453fbaa1ae'] = 'Eine Werbekampagne kann eine größere Anzahl von Besuchern anziehen. Eine sich daraus ergebende Zunahme von Kundenkonten, hängt von der \"Qualität\" der Kampagne ab: gezielte Werbung kann effektiver sein als breit angelegte Werbung.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_b2eceb617c0a86e0dbe5d844f0ec353e'] = 'Sonderangebote, Verkäufe, oder Wettbewerbe schaffen mehr Aufmerksamkeit und Neugier, und halten Ihren Shop nicht nur lebendig, sondern erhöhen auch die Besucherzahl. Auf diese Weise können Sie impulsive Käufer zum Kaufen animieren.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_52a6042899eefb32fcd219672c0c7179'] = 'Design und Benutzerfreundlichkeit sind heute wichtiger denn je: ein schlecht gewähltes oder schwer verständliches grafisches Thema kann Besuchern die Lust zum Kaufen nehmen. Sie müssen die richtige Balance zwischen einem innovativen Design und einer leichten Surfbarkeit für Besucher finden. Korrekte Rechtschreibung und Klarheit wecken ebenso mehr das Kundenvertrauen in Ihren Shop.'; + +?> \ No newline at end of file diff --git a/modules/statsregistrations/en.php b/modules/statsregistrations/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsregistrations/en.php @@ -0,0 +1,4 @@ +statsregistrations_8b15fc6468c919d299f9a601b61b95fc'] = 'Cuentas cliente'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_089c9061407fd978366e78b6ad1d0111'] = 'Mostrar la progresión de la suscripción de clientes'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_75abad0b891bc086fd4837e81a8c488a'] = 'Visitantes que no han pasado de la suscripción:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_4e4f3af3fb18136b8eec4b77f25095ce'] = 'Visitantes que han efectuado un pedido directamente después de suscribirse:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a751e9cc4ed4c7585ecc0d97781cb48a'] = 'Total cuentas cliente:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_fba0e64541196123bbf8e3737bf9287b'] = 'Número de clientes que han creado una cuenta'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a286f4eaef73a0b4f955c42b84472444'] = 'El número total de cuentas creadas no es en sí misma información importante. Sin embargo, es interesante analizar la cantidad creada en un cierto plazo. Esto indicará de una manera u otra si las cosas van por buen camino.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_57a6f41a27c9baa5b402d30e97d4c1e8'] = '¿Cómo intervenir en la evolución de las suscripciones?'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f123e4522d188fba4cbe1dc58034f95c'] = 'i usted deja su tienda funcionar sin realizar cambios, el número de suscripciones de cliente puede permanecer estable o declinar levemente.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f8426f15c536f4341dbeb4d806f76167'] = 'Un aumento significativo o una disminución demuestra que ha habido probablemente un cambio en su tienda; por lo tanto, usted debe identificarlo y dar marcha atrás si ha habido una disminución de suscripciones o continuar con él si es ventajoso. '; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_48ad285c9749cc74821048c49aea6a50'] = 'Aquí se muestra un sumario de lo que puede afectar a la hora de crear cuentas de clientes.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_cd0d9770ca8ee818040fa3453fbaa1ae'] = 'Una campaña publicitaria puede atraer un mayor número de visitantes.Un incremento de clientes registrados le dará cierta seguridad, pero depende de su \\\"calidad\\\": una publicidad bien dirigida puede resultar más efectiva que un campaña a gran escala.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_b2eceb617c0a86e0dbe5d844f0ec353e'] = 'Ofertas especiales, rebajas o contenidos crean grandes espectativas y curiosidad, así no sólo se mantiene activo su comercio activo sino que además aumenta el tráfico. De esta manera, puede captar clientes impulsivos.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_52a6042899eefb32fcd219672c0c7179'] = 'El diseño y la accesibilidad son más importantes que nunca: una mala accesibilidad o una mala presentación gráfica puede hacer que sus visitantes se vayan. Tiene que crear un balance entre un diseño innovador que permita al visitante moverse por la red con comodidad. Un escritura clara y correcta también inspirarán más confianza para el cliente hacia su comercio.'; diff --git a/modules/statsregistrations/fr.php b/modules/statsregistrations/fr.php new file mode 100644 index 000000000..b7033816c --- /dev/null +++ b/modules/statsregistrations/fr.php @@ -0,0 +1,20 @@ +statsregistrations_8b15fc6468c919d299f9a601b61b95fc'] = 'Comptes clients'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_089c9061407fd978366e78b6ad1d0111'] = 'Affiche l\'évolution des créations de compte'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_75abad0b891bc086fd4837e81a8c488a'] = 'Visiteurs bloqués à la phase d\'inscription :'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_4e4f3af3fb18136b8eec4b77f25095ce'] = 'Visiteurs ayant passé une commande dès leur inscription :'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a751e9cc4ed4c7585ecc0d97781cb48a'] = 'Total de comptes créés :'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_fba0e64541196123bbf8e3737bf9287b'] = 'Nombre de comptes créés'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a286f4eaef73a0b4f955c42b84472444'] = 'Le nombre d\'inscrits en lui-même n\'est pas important. Il vous permet surtout d\'apprécier son évolution sur une période plus ou moins longue. '; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_57a6f41a27c9baa5b402d30e97d4c1e8'] = 'Comment agir sur l\'évolution des inscriptions ?'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f123e4522d188fba4cbe1dc58034f95c'] = 'Si vous laissez votre boutique tourner sans rien changer, le nombre d\'inscriptions devrait être stable ou baisser légèrement. '; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f8426f15c536f4341dbeb4d806f76167'] = 'Une forte croissance ou une forte baisse montre donc probablement un changement sur votre boutique. C\'est pourquoi vous devez l\'identifier de manière à pouvoir revenir sur vos pas au cas où ce changement fait décroître le nombre d\'inscriptions, ou au contraire continuer dans cette voie si celui-ci se trouve avantageux.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_48ad285c9749cc74821048c49aea6a50'] = 'Différents modificateurs sont possibles : '; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_cd0d9770ca8ee818040fa3453fbaa1ae'] = 'Une campagne de publicité peut attirer un grand nombre de visiteurs. De plus, une campagne de pub bien ciblée peut s\'avérer plus efficace qu\'une publicité à grande échelle.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_b2eceb617c0a86e0dbe5d844f0ec353e'] = 'Les promotions, soldes ou jeux-concours attirent fortement l\'attention et la curiosité des visiteurs ; permettant non seulement l\'animation de votre boutique, mais aussi l\'augmentation de son trafic. De cette manière, vous pouvez pousser un acheteur \"spontané\" à se lancer.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_52a6042899eefb32fcd219672c0c7179'] = 'Esthétique : un changement de thème peut rebuter les visiteurs. L\'orthographe et la clarté sont également à soigner. '; diff --git a/modules/statsregistrations/it.php b/modules/statsregistrations/it.php new file mode 100644 index 000000000..a6d5ab263 --- /dev/null +++ b/modules/statsregistrations/it.php @@ -0,0 +1,22 @@ +statsregistrations_8b15fc6468c919d299f9a601b61b95fc'] = 'Account clienti'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_089c9061407fd978366e78b6ad1d0111'] = 'Visualizzare lo stato di registrazione del cliente'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_75abad0b891bc086fd4837e81a8c488a'] = 'I visitatori che si sono fermati alla fase di registrazione:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_4e4f3af3fb18136b8eec4b77f25095ce'] = 'I visitatori che hanno effettuato un ordine direttamente dopo la registrazione:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a751e9cc4ed4c7585ecc0d97781cb48a'] = 'Totale account dei clienti:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_fba0e64541196123bbf8e3737bf9287b'] = 'Numero di account clienti creati'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_a286f4eaef73a0b4f955c42b84472444'] = 'Il numero totale di account creati non è di per sé un\'informazione importante. Tuttavia, è interessante analizzare il numero creato nel tempo. Questo indica se le cose sono sulla strada giusta.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_57a6f41a27c9baa5b402d30e97d4c1e8'] = 'Come agire sull\'evoluzione delle iscrizioni?'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f123e4522d188fba4cbe1dc58034f95c'] = 'Se lasci che il tuo negozio vada avanti senza cambiare nulla, il numero di iscrizioni dei clienti dovrebbe rimanere stabile o diminuire leggermente.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_f8426f15c536f4341dbeb4d806f76167'] = 'Un significativo aumento o diminuzione dimostra che vi è stato probabilmente un cambiamento nel tuo negozio; pertanto, è necessario identificarlo in modo da effettuare degli aggiustamenti laddove questa modifica faccia diminuire il numero di registrazioni, o invece proseguire se il risultato è positivo.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_48ad285c9749cc74821048c49aea6a50'] = 'Ecco un riassunto di ciò che può influenzare la creazione di account cliente:'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_cd0d9770ca8ee818040fa3453fbaa1ae'] = 'Una campagna pubblicitaria può attrarre un numero maggiore di visitatori. Un aumento di account dei clienti che ne seguirà, che dipenderà dalla loro \"qualità\": le pubblicità ben mirate possono essere più efficaci di una pubblicità su larga scala.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_b2eceb617c0a86e0dbe5d844f0ec353e'] = 'Le promozioni, le vendite, o concorsi creano una maggiore attenzione e curiosità, non solo mantengono vivace il tuo negozio, ma ne aumentano il traffico. In questo modo, puoi spingere gli acquirenti impulsivi a fare il grande passo.'; +$_MODULE['<{statsregistrations}prestashop>statsregistrations_52a6042899eefb32fcd219672c0c7179'] = 'Design e semplicità d\'uso sono più importanti che mai: una grafica complicata o difficile da seguire può allontanare i visitatori. Devi trovare il giusto equilibrio tra un design innovativo e lasciare che i visitatori si muovano facilmente. Anche una corretta ortografia e una grande chiarezza ispireranno maggiore fiducia nel tuo negozio.'; + +?> \ No newline at end of file diff --git a/modules/statsregistrations/logo.gif b/modules/statsregistrations/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b58d27d237d13885723ec48afd48faead46ba56 GIT binary patch literal 992 zcmZ?wbhEHb6krfw_|5rjywZ0maLFUO}e#vo>8L?rR$?-Kwb z8n!q$Zgpwe=Gwg7y>+K|%QoM}&7LhgeA;*UbnWx&+8^4nBfNKCWXJaOrn!Yp(+Vc< z3h6r#+IKK=;-TnChhrumNuPB*bIysp`KJnI9V%UXrefK-+LagTS6^&&F?m4VCre7D9qFDVK=UZQ!bTbV+?b9H(bYc(%Kd!0y+ zyOa>Hb#lew$?0bomRw$x`)YH=+Z}by>n^pfyWFwi@|2x7=Iy_;VBd`e`)=;pc4Wh; zM|U?gKH1*&ZdcR$J{&fAlV-bZwCu>yr&F7#5YrmX*{g)>bn+lmlts5A= zu53EEuv0L%CSm8LLub2%StqWjILLNf+Q9S*2d86FLYHDe(uoTnRnPQ_T26bTp*W#i zQZ-}RhYdxIY!ek+&!q^yNcEdw>NV+4Lg5h)De00e96Fm>IeJVoXPj}E?AFq*m&)<& WLW9zgc77SFl!C^MTMjfZSOWm;2o}r$ literal 0 HcmV?d00001 diff --git a/modules/statsregistrations/statsregistrations.php b/modules/statsregistrations/statsregistrations.php new file mode 100644 index 000000000..6802ddc91 --- /dev/null +++ b/modules/statsregistrations/statsregistrations.php @@ -0,0 +1,185 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsRegistrations extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + + function __construct() + { + $this->name = 'statsregistrations'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Customer accounts'); + $this->description = $this->l('Display the progress of customer registration.'); + } + + /** + * Called during module installation + */ + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + /** + * @return int Get total of registration in date range + */ + public function getTotalRegistrations() + { + $sql = 'SELECT COUNT(`id_customer`) as total + FROM `'._DB_PREFIX_.'customer` + WHERE `date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(true); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return isset($result['total']) ? $result['total'] : 0; + } + + /** + * @return int Get total of blocked visitors during registration process + */ + public function getBlockedVisitors() + { + $sql = 'SELECT COUNT(DISTINCT c.`id_guest`) as blocked + FROM `'._DB_PREFIX_.'page_type` pt + LEFT JOIN `'._DB_PREFIX_.'page` p ON p.id_page_type = pt.id_page_type + LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON p.id_page = cp.id_page + LEFT JOIN `'._DB_PREFIX_.'connections` c ON c.id_connections = cp.id_connections + LEFT JOIN `'._DB_PREFIX_.'guest` g ON c.id_guest = g.id_guest + WHERE pt.name = "authentication.php" + '.$this->sqlShopRestriction(false, 'c').' + AND (g.id_customer IS NULL OR g.id_customer = 0) + AND c.`date_add` BETWEEN '.ModuleGraph::getDateBetween(); + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return $result['blocked']; + } + + public function getFirstBuyers() + { + $sql = 'SELECT COUNT(DISTINCT o.`id_customer`) as buyers + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'guest` g ON o.id_customer = g.id_customer + LEFT JOIN `'._DB_PREFIX_.'connections` c ON c.id_guest = g.id_guest + WHERE o.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(false, 'o').' + AND o.valid = 1 + AND ABS(TIMEDIFF(o.date_add, c.date_add)+0) < 120000'; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + return $result['buyers']; + } + + public function hookAdminStatsModules($params) + { + $totalRegistrations = $this->getTotalRegistrations(); + $totalBlocked = $this->getBlockedVisitors(); + $totalBuyers = $this->getFirstBuyers(); + if (Tools::getValue('export')) + $this->csvExport(array('layers' => 0, 'type' => 'line')); + $this->_html = ' +
    '.$this->displayName.' +

    + '.$this->l('Visitors who have stopped at the registering step:').' '.(int)($totalBlocked).($totalRegistrations ? ' ('.number_format(100*$totalBlocked/($totalRegistrations+$totalBlocked), 2).'%)' : '').'
    + '.$this->l('Visitors who have placed an order directly after registration:').' '.(int)($totalBuyers).($totalRegistrations ? ' ('.number_format(100*$totalBuyers/($totalRegistrations), 2).'%)' : '').' +

    +

    '.$this->l('Total customer accounts:').' '.$totalRegistrations.'

    +
    '.$this->engine(array('type' => 'line')).'
    +

    '.$this->l('CSV Export').'

    +

    +
    '.$this->l('Guide').' +

    '.$this->l('Number of customer accounts created').'

    +

    '.$this->l('The total number of accounts created is not in itself important information. However, it is beneficial to analyze the number created over time. This will indicate whether or not things are on the right track.').'

    +

    '.$this->l('How to act on the registrations\' evolution?').'

    +

    + '.$this->l('If you let your shop run without changing anything, the number of customer registrations should stay stable or may slightly decline.').' + '.$this->l('A significant increase or decrease shows that there has probably been a change to your shop.Therefore, you have to identify it in order to backtrack if this change makes the number of registrations decrease, or continue with it if it increases registration.').'
    + '.$this->l('Here is summary of what may affect the creation of customer accounts:').' +

      +
    • '.$this->l('An advertising campaign can attract a greater number of visitors. An increase in customer accounts will ensue, which will depend on their "quality". Well-targeted advertising can be more effective than large-scale advertising.').'
    • +
    • '.$this->l('Specials, sales, or contests draw greater attention and curiosity, not only keeping your shop lively but also increasing its traffic. This way, you can push impulsive buyers to take the plunge.').'
    • +
    • '.$this->l('Design and user-friendliness are more important than ever: an ill-chosen or hard-to-follow graphical theme can turn off visitors. You should strike the right balance between an innovative design and letting visitors move around easily. Proper spelling and clarity also inspire more customer confidence in your shop.').'
    • +
    +


    +
    '; + return $this->_html; + } + + protected function getData($layers) + { + $this->_query = ' + SELECT `date_add` + FROM `'._DB_PREFIX_.'customer` + WHERE 1 + '.$this->sqlShopRestriction(true).' + `date_add` BETWEEN'; + $this->_titles['main'] = $this->l('Number of customer accounts created'); + $this->setDateGraph($layers, true); + } + + protected function setAllTimeValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + foreach ($result AS $row) + $this->_values[(int)(substr($row['date_add'], 0, 4))]++; + } + + protected function setYearValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + foreach ($result AS $row) + { + $mounth = (int)substr($row['date_add'], 5, 2); + if (!isset($this->_values[$mounth])) + $this->_values[$mounth] = 0; + $this->_values[$mounth]++; + } + } + + protected function setMonthValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + foreach ($result AS $row) + $this->_values[(int)(substr($row['date_add'], 8, 2))]++; + } + + protected function setDayValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate()); + foreach ($result AS $row) + $this->_values[(int)(substr($row['date_add'], 11, 2))]++; + } +} + + diff --git a/modules/statssales/config.xml b/modules/statssales/config.xml new file mode 100755 index 000000000..dd964ba06 --- /dev/null +++ b/modules/statssales/config.xml @@ -0,0 +1,12 @@ + + + statssales + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statssales/de.php b/modules/statssales/de.php new file mode 100644 index 000000000..e14532f39 --- /dev/null +++ b/modules/statssales/de.php @@ -0,0 +1,26 @@ +statssales_45c4b3e103155326596d6ccd2fea0f25'] = 'Verkäufe und Bestellungen'; +$_MODULE['<{statssales}prestashop>statssales_09a6e97d1ccb13182c8fd316450dbebf'] = 'Anzeige der Umsatzentwicklung und Bestellungen nach Status'; +$_MODULE['<{statssales}prestashop>statssales_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Alle'; +$_MODULE['<{statssales}prestashop>statssales_d7778d0c64b6ba21494c97f77a66885a'] = 'Filter'; +$_MODULE['<{statssales}prestashop>statssales_052d402bac5d6be562de993113d3108b'] = 'Diese Grafiken stellen die Entwicklung Ihrer Bestellungen und Verkaufsumsätze für einen bestimmten Zeitraum dar. Es ist kein fortgeschrittenes Analyse-Tool, aber Sie können die Rentabilität Ihres Shops mit einem Blick erfassen. Sie Könne auch Unterschiede im Vergleich zu anderen Zeiträumen überwachen, z.B. Weihnachten. Nur bestätigte Bestellungen werden in diesen beiden Grafiken berücksichtigt.'; +$_MODULE['<{statssales}prestashop>statssales_9ccb8353e945f1389a9585e7f21b5a0d'] = 'Erfolgte Bestellungen:'; +$_MODULE['<{statssales}prestashop>statssales_156e5c5872c9af24a5c982da07a883c2'] = 'Gekaufte Produkte:'; +$_MODULE['<{statssales}prestashop>statssales_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statssales}prestashop>statssales_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Verkäufe:'; +$_MODULE['<{statssales}prestashop>statssales_0718e1ec4754e199aa9cb4bc43a6ff53'] = 'Hier können Sie die Bestellstatusverteilung sehen.'; +$_MODULE['<{statssales}prestashop>statssales_da80af4de99df74dd59e665adf1fac8f'] = 'Keine Bestellung für diesen Zeitraum'; +$_MODULE['<{statssales}prestashop>statssales_6602bbeb2956c035fb4cb5e844a4861b'] = 'Erklärung'; +$_MODULE['<{statssales}prestashop>statssales_75288849ad081e6ef15e00c37b7570f2'] = 'Verschiedene Bestellstatus'; +$_MODULE['<{statssales}prestashop>statssales_94272e39a7493ab1baf7600d78926024'] = 'In Ihrem Back Office finden Sie viele andere Bestellstatus: Scheckzahlung in Bearbeitung, Zahlung akzeptiert, Vorbereitung im Gang, Versand, Geliefert, Abgebrochen, Rückzahlung, Fehler bei Zahlung, Lagerfehlbestand sowie Zahlung durch Banküberweisung in Bearbeitung.'; +$_MODULE['<{statssales}prestashop>statssales_d3ca3781ea021039c95d2830dd6db169'] = 'Dieses Satatus können nicht aus dem Back Office entfernt werden, neue können jedoch hinzugefügt werden.'; +$_MODULE['<{statssales}prestashop>statssales_bb7ad89807bf69ddca986c142311f936'] = 'Produkte und Bestellungen'; +$_MODULE['<{statssales}prestashop>statssales_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Bestellungen'; +$_MODULE['<{statssales}prestashop>statssales_068f80c7519d0528fb08e82137a72131'] = 'Produkte'; +$_MODULE['<{statssales}prestashop>statssales_14f1c54626d722168ee62dff05ed811e'] = 'Verkäufe in'; +$_MODULE['<{statssales}prestashop>statssales_33eee7690a8cd62490ed9eeadd47d163'] = 'Prozente der Bestellungen nach Status'; + +?> \ No newline at end of file diff --git a/modules/statssales/en.php b/modules/statssales/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statssales/en.php @@ -0,0 +1,4 @@ +statssales_45c4b3e103155326596d6ccd2fea0f25'] = 'Ventas y pedidos'; +$_MODULE['<{statssales}prestashop>statssales_09a6e97d1ccb13182c8fd316450dbebf'] = 'Mostrar la evolución de las ventas y de los pedidos por estados'; +$_MODULE['<{statssales}prestashop>statssales_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Todos'; +$_MODULE['<{statssales}prestashop>statssales_d7778d0c64b6ba21494c97f77a66885a'] = 'Filtrar'; +$_MODULE['<{statssales}prestashop>statssales_052d402bac5d6be562de993113d3108b'] = 'Estos gráficos representan la evolución de los pedidos y del volumen de ventas en un periodo dado. No son herramientas de análisis avanzadas pero le permiten ver la rentabilidad de su tienda inmediatamente. También puede observar variaciones en periodos concretos, como Navidad. Sólo los pedidos válidos se incluyen en estos gráficos. '; +$_MODULE['<{statssales}prestashop>statssales_9ccb8353e945f1389a9585e7f21b5a0d'] = 'Pedidos realizados:'; +$_MODULE['<{statssales}prestashop>statssales_156e5c5872c9af24a5c982da07a883c2'] = 'Productos pedidos:'; +$_MODULE['<{statssales}prestashop>statssales_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statssales}prestashop>statssales_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Ventas:'; +$_MODULE['<{statssales}prestashop>statssales_0718e1ec4754e199aa9cb4bc43a6ff53'] = 'Puede ver la distribución del estado del pedido a continuación.'; +$_MODULE['<{statssales}prestashop>statssales_da80af4de99df74dd59e665adf1fac8f'] = 'No hay pedidos para este periodo'; +$_MODULE['<{statssales}prestashop>statssales_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statssales}prestashop>statssales_75288849ad081e6ef15e00c37b7570f2'] = 'Varios estados de pedido'; +$_MODULE['<{statssales}prestashop>statssales_94272e39a7493ab1baf7600d78926024'] = 'En su Back-Office, hay varios estados de pedido disponibles: En espera de pago por cheque, Pago aceptado, Preparación en curso, En espera de entraga, Entregado, Anulado, Reembolsado, Error de pago, Productos no disponibles y en espera de pago por transferencia bancaria.'; +$_MODULE['<{statssales}prestashop>statssales_d3ca3781ea021039c95d2830dd6db169'] = 'Estos estados no pueden suprimirse a partir del Back-Office, sin embargo puede añadir otros nuevos.'; +$_MODULE['<{statssales}prestashop>statssales_bb7ad89807bf69ddca986c142311f936'] = 'Productos y pedidos'; +$_MODULE['<{statssales}prestashop>statssales_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Pedidos'; +$_MODULE['<{statssales}prestashop>statssales_068f80c7519d0528fb08e82137a72131'] = 'Productos'; +$_MODULE['<{statssales}prestashop>statssales_14f1c54626d722168ee62dff05ed811e'] = 'Ventas en'; +$_MODULE['<{statssales}prestashop>statssales_33eee7690a8cd62490ed9eeadd47d163'] = 'Porcentaje de pedidos por estado'; diff --git a/modules/statssales/fr.php b/modules/statssales/fr.php new file mode 100644 index 000000000..75d4764ee --- /dev/null +++ b/modules/statssales/fr.php @@ -0,0 +1,24 @@ +statssales_45c4b3e103155326596d6ccd2fea0f25'] = 'Commandes et CA'; +$_MODULE['<{statssales}prestashop>statssales_09a6e97d1ccb13182c8fd316450dbebf'] = 'Affiche l\'évolution du chiffre d\'affaires et la répartition des commandes par statut'; +$_MODULE['<{statssales}prestashop>statssales_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tout afficher'; +$_MODULE['<{statssales}prestashop>statssales_d7778d0c64b6ba21494c97f77a66885a'] = 'Filtrer'; +$_MODULE['<{statssales}prestashop>statssales_052d402bac5d6be562de993113d3108b'] = 'Ces graphiques représentent l\'évolution de vos commandes et chiffre d\'affaires pour une période donnée. Ce n\'est pas un outil d\'analyse avancé mais il vous permet toutefois de visualiser la rentabilité de votre boutique en un clin d\'oeil. Vous pouvez également comparer les ventes entre différentes périodes (Noël...). Seules les commandes valides sont inclues dans ces deux graphes.'; +$_MODULE['<{statssales}prestashop>statssales_9ccb8353e945f1389a9585e7f21b5a0d'] = 'Commandes passées :'; +$_MODULE['<{statssales}prestashop>statssales_156e5c5872c9af24a5c982da07a883c2'] = 'Produits commandés :'; +$_MODULE['<{statssales}prestashop>statssales_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statssales}prestashop>statssales_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Chiffre d\'affaires :'; +$_MODULE['<{statssales}prestashop>statssales_0718e1ec4754e199aa9cb4bc43a6ff53'] = 'La répartition des états de commande est représentée ci-dessous.'; +$_MODULE['<{statssales}prestashop>statssales_da80af4de99df74dd59e665adf1fac8f'] = 'Aucune commande pour cette période'; +$_MODULE['<{statssales}prestashop>statssales_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statssales}prestashop>statssales_75288849ad081e6ef15e00c37b7570f2'] = 'Plusieurs statuts de commande'; +$_MODULE['<{statssales}prestashop>statssales_94272e39a7493ab1baf7600d78926024'] = 'Au sein de votre Back-office, plusieurs statuts de commande sont disponibles : En attente du paiement par chèque, Paiement accepté, Préparation en cours, En cours de livraison, Livré, Annulé, Remboursé, Erreur de paiement, Produits indisponibles et en attente du paiement par virement bancaire.'; +$_MODULE['<{statssales}prestashop>statssales_d3ca3781ea021039c95d2830dd6db169'] = 'Ces statuts ne peuvent être supprimés depuis le Back-office, cependant vous pouvez en ajouter de nouveaux.'; +$_MODULE['<{statssales}prestashop>statssales_bb7ad89807bf69ddca986c142311f936'] = 'Commandes et produits'; +$_MODULE['<{statssales}prestashop>statssales_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Commandes'; +$_MODULE['<{statssales}prestashop>statssales_068f80c7519d0528fb08e82137a72131'] = 'Produits'; +$_MODULE['<{statssales}prestashop>statssales_14f1c54626d722168ee62dff05ed811e'] = 'Chiffre d\'affaires en'; +$_MODULE['<{statssales}prestashop>statssales_33eee7690a8cd62490ed9eeadd47d163'] = 'Pourcentage de commandes par statut'; diff --git a/modules/statssales/it.php b/modules/statssales/it.php new file mode 100644 index 000000000..bd3546382 --- /dev/null +++ b/modules/statssales/it.php @@ -0,0 +1,26 @@ +statssales_45c4b3e103155326596d6ccd2fea0f25'] = 'Le vendite e gli ordini'; +$_MODULE['<{statssales}prestashop>statssales_09a6e97d1ccb13182c8fd316450dbebf'] = 'Visualizza l\'andamento delle vendite e degli ordini per status'; +$_MODULE['<{statssales}prestashop>statssales_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tutti'; +$_MODULE['<{statssales}prestashop>statssales_d7778d0c64b6ba21494c97f77a66885a'] = 'Filtro'; +$_MODULE['<{statssales}prestashop>statssales_052d402bac5d6be562de993113d3108b'] = 'Questi grafici rappresentano l\'evoluzione dei tuoi ordini e del fatturato per un determinato periodo. Non è uno strumento di analisi avanzata, ma almeno puoi controllare la redditività del tuo negozio in un lampo. È inoltre possibile tenere sotto controllo la differenza rispetto ad alcuni periodi come Natale. Solo gli ordini validi sono compresi in questi due grafici.'; +$_MODULE['<{statssales}prestashop>statssales_9ccb8353e945f1389a9585e7f21b5a0d'] = 'Gli ordini effettuati:'; +$_MODULE['<{statssales}prestashop>statssales_156e5c5872c9af24a5c982da07a883c2'] = 'I prodotti acquistati:'; +$_MODULE['<{statssales}prestashop>statssales_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statssales}prestashop>statssales_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Vendite:'; +$_MODULE['<{statssales}prestashop>statssales_0718e1ec4754e199aa9cb4bc43a6ff53'] = 'È possibile visualizzare la distribuzione dello stato dell\'ordine di seguito.'; +$_MODULE['<{statssales}prestashop>statssales_da80af4de99df74dd59e665adf1fac8f'] = 'Nessun ordine per questo periodo'; +$_MODULE['<{statssales}prestashop>statssales_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statssales}prestashop>statssales_75288849ad081e6ef15e00c37b7570f2'] = 'Vari status degli ordini'; +$_MODULE['<{statssales}prestashop>statssales_94272e39a7493ab1baf7600d78926024'] = 'Nel tuo back-office, è possibile trovare molti stati dell\'ordine: In attesa di pagamento con assegno, Pagamento accettato, Preparazione in corso, Spedizione, Consegnato, Annullato, Rimborso, Errore di pagamento, Esaurito, e In attesa di pagamento con bonifico bancario.'; +$_MODULE['<{statssales}prestashop>statssales_d3ca3781ea021039c95d2830dd6db169'] = 'Questi stati non possono essere rimossi dal back-office, ma si ha la possibilità di aggiungerne altri'; +$_MODULE['<{statssales}prestashop>statssales_bb7ad89807bf69ddca986c142311f936'] = 'Prodotti e ordini'; +$_MODULE['<{statssales}prestashop>statssales_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Ordini'; +$_MODULE['<{statssales}prestashop>statssales_068f80c7519d0528fb08e82137a72131'] = 'Prodotti'; +$_MODULE['<{statssales}prestashop>statssales_14f1c54626d722168ee62dff05ed811e'] = 'Le vendite in'; +$_MODULE['<{statssales}prestashop>statssales_33eee7690a8cd62490ed9eeadd47d163'] = 'Percentuale degli ordini in base allo stato'; + +?> \ No newline at end of file diff --git a/modules/statssales/logo.gif b/modules/statssales/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..4364683de6324868dac3cb86c247291b1ec0f391 GIT binary patch literal 936 zcmZ?wbhEHb6krfw_|5ZhLQo{ew03_qMs*-Q{v`pVxym4iDBjJlNv)V3*f}-QJIP z`9Ij>^I)Iv<2`{-cLhD&7xv(Q|DywekB>$^J|6Y-V8qkIkx!3AKRy}v;$Ym<?#t78uTB=eJYDeeRMCsG1uxDNzBpg_;#|?obH%UE zl)pS*`r;xGmA|}D@$zETi%XTSFV?@hRQu|3-K$IWFR#?Ty4v{qO7rV0EpIM0y}8i? z_UI@v8UpAcp!k!8k%8eqgAPanlqVQCS{eRx%6M#8;K-rb!ooP|aHC@*f1kod#U>U3 zC1tsP8bOHNJ}3|2ZYcd4oyc}VjxY#5c+S8k Nt|zj<%0z*|8UPvr%S`|P literal 0 HcmV?d00001 diff --git a/modules/statssales/statssales.php b/modules/statssales/statssales.php new file mode 100644 index 000000000..97c48c5b5 --- /dev/null +++ b/modules/statssales/statssales.php @@ -0,0 +1,257 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsSales extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + private $_option = ''; + private $id_country = ''; + + function __construct() + { + $this->name = 'statssales'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Sales and orders'); + $this->description = $this->l('Display the sales evolution and orders by statuses'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function hookAdminStatsModules($params) + { + global $cookie; + + $totals = $this->getTotals(); + $currency = new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT')); + if (($id_export = (int)Tools::getValue('export')) == 1) + $this->csvExport(array('layers' => 2, 'type' => 'line', 'option' => '1-'.(int)Tools::getValue('id_country'))); + elseif ($id_export == 2) + $this->csvExport(array('layers' => 0, 'type' => 'line', 'option' => '2-'.(int)Tools::getValue('id_country'))); + elseif ($id_export == 3) + $this->csvExport(array('type' => 'pie', 'option' => '3-'.(int)Tools::getValue('id_country'))); + + $this->_html = ' +
    '.$this->displayName.' +
    + + +
    +

    + '.$this->l('These graphs represent the evolution of your orders and sales turnover for a given period. This tool allows for quick overview of the viability of your shop. You can also keep watch on the difference between time periods (like the holiday season). Only valid orders are included in these two graphs.').' +

    +

    '.$this->l('Orders placed:').' '.(int)($totals['orderCount']).'

    +

    '.$this->l('Products bought:').' '.(int)($totals['products']).'

    +
    '.$this->engine(array('type' => 'line', 'option' => '1-'.(int)Tools::getValue('id_country'), 'layers' => 2)).'
    +

    '.$this->l('CSV Export').'

    +

    '.$this->l('Sales:').' '.Tools::displayPrice($totals['orderSum'], $currency).'

    +
    '.$this->engine(array('type' => 'line', 'option' => '2-'.(int)Tools::getValue('id_country'))).'

    +

    '.$this->l('CSV Export').'

    +

    + '.$this->l('You can see the order state distribution below.').' +


    + '.($totals['orderCount'] ? $this->engine(array('type' => 'pie', 'option' => '3-'.(int)Tools::getValue('id_country'))) : $this->l('No orders for this period.')).' +

    '.$this->l('CSV Export').'

    +
    +
    +
    '.$this->l('Guide').' +

    '.$this->l('Various order statuses').'

    +

    + '.$this->l('In your back-office, you can find the following order statuses : Awaiting check payment, Payment accepted, Preparation in progress, Shipping, Delivered, Cancelled, Refund, Payment error, Out of stock, and Awaiting bank wire payment.').'
    + '.$this->l('Statuses cannot be removed from the back-office, but you have the option to add more.').' +

    +
    '; + return $this->_html; + } + + private function getTotals() + { + $sql = 'SELECT COUNT(o.`id_order`) as orderCount, SUM(o.`total_paid_real` / o.conversion_rate) as orderSum + FROM `'._DB_PREFIX_.'orders` o + '.((int)Tools::getValue('id_country') ? 'LEFT JOIN `'._DB_PREFIX_.'address` a ON o.id_address_delivery = a.id_address' : '').' + WHERE o.valid = 1 + '.$this->sqlShopRestriction(false, 'o').' + '.((int)Tools::getValue('id_country') ? 'AND a.id_country = '.(int)Tools::getValue('id_country') : '').' + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween(); + $result1 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + + $sql = 'SELECT SUM(od.product_quantity) as products + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON od.`id_order` = o.`id_order` + '.((int)Tools::getValue('id_country') ? 'LEFT JOIN `'._DB_PREFIX_.'address` a ON o.id_address_delivery = a.id_address' : '').' + WHERE o.valid = 1 + '.$this->sqlShopRestriction(false, 'o').' + '.((int)Tools::getValue('id_country') ? 'AND a.id_country = '.(int)Tools::getValue('id_country') : '').' + AND o.`invoice_date` BETWEEN '.ModuleGraph::getDateBetween(); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); + + return array_merge($result1, $result2); + } + + public function setOption($options, $layers = 1) + { + list($this->_option, $this->id_country) = explode('-', $options); + switch ($this->_option) + { + case 1: + $this->_titles['main'][0] = $this->l('Products and orders'); + $this->_titles['main'][1] = $this->l('Orders'); + $this->_titles['main'][2] = $this->l('Products'); + break; + case 2: + $currency = new Currency((int)Configuration::get('PS_CURRENCY_DEFAULT')); + $this->_titles['main'] = $this->l('Sales in').' '.$currency->iso_code; + break; + case 3: + $this->_titles['main'] = $this->l('Percentage of orders by status'); + break; + } + } + + protected function getData($layers) + { + if ($this->_option == 3) + return $this->getStatesData(); + + $this->_query = ' + SELECT o.`invoice_date`, o.`total_paid_real` / o.conversion_rate AS total_paid_real, SUM(od.product_quantity) as product_quantity + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON od.`id_order` = o.`id_order` + '.((int)($this->id_country) ? 'LEFT JOIN `'._DB_PREFIX_.'address` a ON o.id_address_delivery = a.id_address' : '').' + WHERE o.valid = 1 + '.$this->sqlShopRestriction('o').' + '.((int)($this->id_country) ? 'AND a.id_country = '.(int)$this->id_country : '').' + AND o.`invoice_date` BETWEEN '; + $this->_query2 = ' GROUP BY o.id_order'; + $this->setDateGraph($layers, true); + } + + protected function setAllTimeValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + foreach ($result AS $row) + if ($this->_option == 1) + { + $this->_values[0][(int)(substr($row['invoice_date'], 0, 4))] += 1; + $this->_values[1][(int)(substr($row['invoice_date'], 0, 4))] += $row['product_quantity']; + } + else + $this->_values[(int)(substr($row['invoice_date'], 0, 4))] += $row['total_paid_real']; + } + + protected function setYearValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + foreach ($result AS $row) { + $mounth = (int)substr($row['invoice_date'], 5, 2); + if ($this->_option == 1) + { + if (!isset($this->_values[0][$mounth])) + $this->_values[0][$mounth] = 0; + if (!isset($this->_values[1][$mounth])) + $this->_values[1][$mounth] = 0; + $this->_values[0][$mounth] += 1; + $this->_values[1][$mounth] += $row['product_quantity']; + } + else + { + if (!isset($this->_values[$mounth])) + $this->_values[$mounth] = 0; + $this->_values[$mounth] += $row['total_paid_real']; + } + } + } + + protected function setMonthValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + foreach ($result AS $row) + if ($this->_option == 1) + { + $this->_values[0][(int)(substr($row['invoice_date'], 8, 2))] += 1; + $this->_values[1][(int)(substr($row['invoice_date'], 8, 2))] += $row['product_quantity']; + } + else + $this->_values[(int)(substr($row['invoice_date'], 8, 2))] += $row['total_paid_real']; + } + + protected function setDayValues($layers) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + foreach ($result AS $row) + if ($this->_option == 1) + { + $this->_values[0][(int)(substr($row['invoice_date'], 11, 2))] += 1; + $this->_values[1][(int)(substr($row['invoice_date'], 11, 2))] += $row['product_quantity']; + } + else + $this->_values[(int)(substr($row['invoice_date'], 11, 2))] += $row['total_paid_real']; + } + + private function getStatesData() + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT osl.`name`, COUNT(oh.`id_order`) as total + FROM `'._DB_PREFIX_.'order_state` os + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)($this->getLang()).') + LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON os.`id_order_state` = oh.`id_order_state` + LEFT JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = oh.`id_order` + '.((int)($this->id_country) ? 'LEFT JOIN `'._DB_PREFIX_.'address` a ON o.id_address_delivery = a.id_address' : '').' + WHERE oh.`id_order_history` = ( + SELECT ios.`id_order_history` + FROM `'._DB_PREFIX_.'order_history` ios + WHERE ios.`id_order` = oh.`id_order` + ORDER BY ios.`date_add` DESC, oh.`id_order_history` DESC + LIMIT 1 + ) + '.((int)($this->id_country) ? 'AND a.id_country = '.(int)($this->id_country) : '').' + AND o.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + GROUP BY oh.`id_order_state`'); + foreach ($result as $row) + { + $this->_values[] = $row['total']; + $this->_legend[] = $row['name']; + } + } +} \ No newline at end of file diff --git a/modules/statssearch/config.xml b/modules/statssearch/config.xml new file mode 100755 index 000000000..bd801505a --- /dev/null +++ b/modules/statssearch/config.xml @@ -0,0 +1,12 @@ + + + statssearch + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statssearch/de.php b/modules/statssearch/de.php new file mode 100644 index 000000000..d521d68b8 --- /dev/null +++ b/modules/statssearch/de.php @@ -0,0 +1,15 @@ +statssearch_8c3c245232744602822902b97e65d6f9'] = 'Shop-Suche'; +$_MODULE['<{statssearch}prestashop>statssearch_5393c969e2fb0e630e03b993fee091e7'] = 'Anzeigen, welche Keywords von Ihren Besuchern gesucht worden sind'; +$_MODULE['<{statssearch}prestashop>statssearch_867343577fa1f33caa632a19543bd252'] = 'Keywords'; +$_MODULE['<{statssearch}prestashop>statssearch_e52e6aa1a43a0187e44f048f658db5f9'] = 'Vorkommen'; +$_MODULE['<{statssearch}prestashop>statssearch_fd69c5cf902969e6fb71d043085ddee6'] = 'Ergebnisse'; +$_MODULE['<{statssearch}prestashop>statssearch_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statssearch}prestashop>statssearch_df7e8db30f72561b6c3f3941ce88722a'] = 'Keine Keywords gesucht, die mehr als einmal gefunden wurden.'; +$_MODULE['<{statssearch}prestashop>statssearch_6b4d88dce7077cd4181a692a1678b60a'] = '10 erste Keywords'; +$_MODULE['<{statssearch}prestashop>statssearch_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Andere'; + +?> \ No newline at end of file diff --git a/modules/statssearch/en.php b/modules/statssearch/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statssearch/en.php @@ -0,0 +1,4 @@ +statssearch_8c3c245232744602822902b97e65d6f9'] = 'Búsqueda de la tienda'; +$_MODULE['<{statssearch}prestashop>statssearch_5393c969e2fb0e630e03b993fee091e7'] = 'Mostrar las palabras clave que han sido utilizadas por sus visitantes'; +$_MODULE['<{statssearch}prestashop>statssearch_867343577fa1f33caa632a19543bd252'] = 'Palabras clave'; +$_MODULE['<{statssearch}prestashop>statssearch_e52e6aa1a43a0187e44f048f658db5f9'] = 'Frecuencia'; +$_MODULE['<{statssearch}prestashop>statssearch_fd69c5cf902969e6fb71d043085ddee6'] = 'Resultados'; +$_MODULE['<{statssearch}prestashop>statssearch_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statssearch}prestashop>statssearch_df7e8db30f72561b6c3f3941ce88722a'] = 'ninguna palabra clave buscada más de una vez'; +$_MODULE['<{statssearch}prestashop>statssearch_6b4d88dce7077cd4181a692a1678b60a'] = '10 primeras palabras clave'; +$_MODULE['<{statssearch}prestashop>statssearch_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Otros'; diff --git a/modules/statssearch/fr.php b/modules/statssearch/fr.php new file mode 100644 index 000000000..7a5463119 --- /dev/null +++ b/modules/statssearch/fr.php @@ -0,0 +1,13 @@ +statssearch_8c3c245232744602822902b97e65d6f9'] = 'Recherches de la boutique'; +$_MODULE['<{statssearch}prestashop>statssearch_5393c969e2fb0e630e03b993fee091e7'] = 'Affiche les mots clés recherchés par vos visiteurs'; +$_MODULE['<{statssearch}prestashop>statssearch_867343577fa1f33caa632a19543bd252'] = 'Mots clés'; +$_MODULE['<{statssearch}prestashop>statssearch_e52e6aa1a43a0187e44f048f658db5f9'] = 'Occurences'; +$_MODULE['<{statssearch}prestashop>statssearch_fd69c5cf902969e6fb71d043085ddee6'] = 'Résultats'; +$_MODULE['<{statssearch}prestashop>statssearch_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statssearch}prestashop>statssearch_df7e8db30f72561b6c3f3941ce88722a'] = 'Aucun mot clé recherché plus d\'une fois.'; +$_MODULE['<{statssearch}prestashop>statssearch_6b4d88dce7077cd4181a692a1678b60a'] = '10 premiers mots clés'; +$_MODULE['<{statssearch}prestashop>statssearch_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Autres'; diff --git a/modules/statssearch/it.php b/modules/statssearch/it.php new file mode 100644 index 000000000..3bd161c98 --- /dev/null +++ b/modules/statssearch/it.php @@ -0,0 +1,15 @@ +statssearch_8c3c245232744602822902b97e65d6f9'] = 'Ricerca negozio'; +$_MODULE['<{statssearch}prestashop>statssearch_5393c969e2fb0e630e03b993fee091e7'] = 'Mostra quali parole chiave sono state ricercate dai tuoi visitatori'; +$_MODULE['<{statssearch}prestashop>statssearch_867343577fa1f33caa632a19543bd252'] = 'parole chiave'; +$_MODULE['<{statssearch}prestashop>statssearch_e52e6aa1a43a0187e44f048f658db5f9'] = 'Occorrenze'; +$_MODULE['<{statssearch}prestashop>statssearch_fd69c5cf902969e6fb71d043085ddee6'] = 'Risultati'; +$_MODULE['<{statssearch}prestashop>statssearch_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statssearch}prestashop>statssearch_df7e8db30f72561b6c3f3941ce88722a'] = 'Nessuna parola chiave cercata più di una volta.'; +$_MODULE['<{statssearch}prestashop>statssearch_6b4d88dce7077cd4181a692a1678b60a'] = 'Le prime 10 parole chiave '; +$_MODULE['<{statssearch}prestashop>statssearch_52ef9633d88a7480b3a938ff9eaa2a25'] = 'Altri'; + +?> \ No newline at end of file diff --git a/modules/statssearch/logo.gif b/modules/statssearch/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5dd1e7b247369a3f7394fd079fee02bbc954fc9 GIT binary patch literal 1013 zcmZ?wbhEHb6krfw_|57n&Tt@98);%IN-2yKCVs8E7UK3@UCu+D)(es{a z95`Jue1=B!Y|Xg&Rxt}~lIQ9t&o@k+Z?t|jZ+m8<-StN8 zTN4cK&M>;a(DK}5ha)qBkIf0cFvI!k0ury(w|&3f_55}R$c}w= zB>&aXvhPn)zdfw~_N4mzle%dK8>Sy>nsKOk-qDVQ$GVoD=v{GY!m85~*PflS;oP+A z`}^)4oBsNA_qz)dKi}$pdVb;8hfUufwSIrv@cn7y_oq!io_GFu-uwG~>-T5#f4rRX z^Yy%+Zx;T1wffh)HNW0%`0;YjulKwEd|mhZW^M89dJO$Y2X$GI$ zvQs&YQ(l~_@QWvNG1n|5hgU5D6303v6@5(ter$AW;c2s+cSLd#%c)jDzNj-29m*4A zH6;x~CNLzOW@q6kJmC1~u#>o6^p+I|9wi>ImuYw+^D;4oX}XAp&jgJ`)g}hnlBN#{ zLC+ee=|rrXv*MED!B|_DNfRP3DjZ~F7Fbabp-|vHPa`LyLNOwNxw$bp>q5szSH(sK J7G@>}YXFIfOm_eP literal 0 HcmV?d00001 diff --git a/modules/statssearch/statssearch.php b/modules/statssearch/statssearch.php new file mode 100644 index 000000000..653562a9c --- /dev/null +++ b/modules/statssearch/statssearch.php @@ -0,0 +1,156 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsSearch extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + + function __construct() + { + $this->name = 'statssearch'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->_query = 'SELECT `keywords`, COUNT(TRIM(`keywords`)) as occurences, MAX(results) as total + FROM `'._DB_PREFIX_.'statssearch` + WHERE 1 + '.$this->sqlShopRestriction().' + `date_add` BETWEEN '; + + $this->_query2 = 'GROUP BY `keywords` + HAVING occurences > 1 + ORDER BY occurences DESC'; + + $this->displayName = $this->l('Shop search'); + $this->description = $this->l('Display which keywords have been searched by your visitors.'); + } + + function install() + { + if (!parent::install() OR !$this->registerHook('search') OR !$this->registerHook('AdminStatsModules')) + return false; + return Db::getInstance()->Execute(' + CREATE TABLE `'._DB_PREFIX_.'statssearch` ( + id_statssearch INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_shop INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + id_group_shop INTEGER UNSIGNED NOT NULL DEFAULT \'1\', + keywords VARCHAR(255) NOT NULL, + results INT(6) NOT NULL DEFAULT 0, + date_add DATETIME NOT NULL, + PRIMARY KEY(id_statssearch) + ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8'); + } + + function uninstall() + { + if (!parent::uninstall()) + return false; + return (Db::getInstance()->Execute('DROP TABLE `'._DB_PREFIX_.'statssearch`')); + } + + /** + * Insert keywords in statssearch table when a search is launched on FO + */ + function hookSearch($params) + { + $sql = 'INSERT INTO `'._DB_PREFIX_.'statssearch` (`id_shop`, `id_group_shop`, `keywords`, `results`, `date_add`) + VALUES ('.$this->shopID.', '.$this->shopGroupID.', \''.pSQL($params['expr']).'\', '.(int)($params['total']).', NOW())'; + Db::getInstance()->Execute($sql); + } + + function hookAdminStatsModules() + { + if (Tools::getValue('export')) + $this->csvExport(array('type' => 'pie')); + + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.ModuleGraph::getDateBetween().$this->_query2); + $this->_html = ' +
    '.$this->displayName.''; + $table = '
    + + + + + + + + '; + + foreach ($result as $row) + { + if (Tools::strlen($row['keywords']) >= Configuration::get('PS_SEARCH_MINWORDLEN')) + $table .= ' + + + + '; + } + $table .= '
    '.$this->l('Keywords').''.$this->l('Occurrences').''.$this->l('Results').'
    '.$row['keywords'].''.$row['occurences'].''.$row['total'].'
    '; + + if (sizeof($result)) + $this->_html .= '
    '.$this->engine(array('type' => 'pie')).'
    +

    '.$this->l('CSV Export').'

    +
    '.$table; + else + $this->_html .= '

    '.$this->l('No keywords searched more than once found.').'

    '; + $this->_html .= '
    '; + return $this->_html; + } + + protected function getData($layers) + { + $this->_titles['main'] = $this->l('First 10 keywords'); + $totalResult = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2); + $total = 0; + $total2 = 0; + foreach ($totalResult as $totalRow) + $total += $totalRow['occurences']; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query.$this->getDate().$this->_query2.' LIMIT 9'); + foreach ($result as $row) + { + if (!$row['occurences']) + continue; + $this->_legend[] = $row['keywords']; + $this->_values[] = $row['occurences']; + $total2 += $row['occurences']; + } + if ($total > $total2) + { + $this->_legend[] = $this->l('Others'); + $this->_values[] = $total - $total2; + } + } +} \ No newline at end of file diff --git a/modules/statsstock/config.xml b/modules/statsstock/config.xml new file mode 100755 index 000000000..9d52db698 --- /dev/null +++ b/modules/statsstock/config.xml @@ -0,0 +1,12 @@ + + + statsstock + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsstock/de.php b/modules/statsstock/de.php new file mode 100644 index 000000000..5bdef2d12 --- /dev/null +++ b/modules/statsstock/de.php @@ -0,0 +1,21 @@ +statsstock_1e8a6897e195774f3bc6fa7b2ae7f801'] = 'Lager-Statistik'; +$_MODULE['<{statsstock}prestashop>statsstock_8fd17aacf4c601e502cade4914545d4d'] = 'Lager-Wert'; +$_MODULE['<{statsstock}prestashop>statsstock_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Kategorie'; +$_MODULE['<{statsstock}prestashop>statsstock_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Alle'; +$_MODULE['<{statsstock}prestashop>statsstock_1b2379801de373b6b563c347014fb34b'] = 'Ihr Katalog ist leer.'; +$_MODULE['<{statsstock}prestashop>statsstock_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statsstock}prestashop>statsstock_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsstock}prestashop>statsstock_7d74f3b92b19da5e606d737d339a9679'] = 'Artikel'; +$_MODULE['<{statsstock}prestashop>statsstock_27ce7f8b5623b2e2df568d64cf051607'] = 'Lager'; +$_MODULE['<{statsstock}prestashop>statsstock_88940d60e75cf4ff38ce27db4efc83b2'] = 'Preis *'; +$_MODULE['<{statsstock}prestashop>statsstock_689202409e48743b914713f96d93947c'] = 'Wert'; +$_MODULE['<{statsstock}prestashop>statsstock_26d6b7e13fef62e89ebdc5b7bef429cb'] = 'Gesamtbestand'; +$_MODULE['<{statsstock}prestashop>statsstock_4364f8c09d7bf97996a20840900e7b30'] = 'Durchschnittl. Preis'; +$_MODULE['<{statsstock}prestashop>statsstock_62668f75fc6977f3d09df632d1585d07'] = 'Gesamtwert'; +$_MODULE['<{statsstock}prestashop>statsstock_2dee758ce6cb0116b234dc3908f016c5'] = 'Durchschnittlicher Preis, wenn das Produkt Attribute hat.'; + +?> \ No newline at end of file diff --git a/modules/statsstock/es.php b/modules/statsstock/es.php new file mode 100644 index 000000000..b76cd97b2 --- /dev/null +++ b/modules/statsstock/es.php @@ -0,0 +1,19 @@ +statsstock_1e8a6897e195774f3bc6fa7b2ae7f801'] = 'Estadísticas stock'; +$_MODULE['<{statsstock}prestashop>statsstock_8fd17aacf4c601e502cade4914545d4d'] = 'Valor del stock'; +$_MODULE['<{statsstock}prestashop>statsstock_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoría'; +$_MODULE['<{statsstock}prestashop>statsstock_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Todas'; +$_MODULE['<{statsstock}prestashop>statsstock_1b2379801de373b6b563c347014fb34b'] = 'Su catálogo está vacío'; +$_MODULE['<{statsstock}prestashop>statsstock_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statsstock}prestashop>statsstock_12d3c7a4296542c62474856ec452c045'] = 'Ref.'; +$_MODULE['<{statsstock}prestashop>statsstock_7d74f3b92b19da5e606d737d339a9679'] = 'Artículo'; +$_MODULE['<{statsstock}prestashop>statsstock_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statsstock}prestashop>statsstock_88940d60e75cf4ff38ce27db4efc83b2'] = 'Precio*'; +$_MODULE['<{statsstock}prestashop>statsstock_689202409e48743b914713f96d93947c'] = 'Valor'; +$_MODULE['<{statsstock}prestashop>statsstock_26d6b7e13fef62e89ebdc5b7bef429cb'] = 'Stock total'; +$_MODULE['<{statsstock}prestashop>statsstock_4364f8c09d7bf97996a20840900e7b30'] = 'Precio medio'; +$_MODULE['<{statsstock}prestashop>statsstock_62668f75fc6977f3d09df632d1585d07'] = 'Valor total'; +$_MODULE['<{statsstock}prestashop>statsstock_2dee758ce6cb0116b234dc3908f016c5'] = 'Precio medio cuando el producto tiene declinaciones.'; diff --git a/modules/statsstock/fr.php b/modules/statsstock/fr.php new file mode 100644 index 000000000..836254f4f --- /dev/null +++ b/modules/statsstock/fr.php @@ -0,0 +1,19 @@ +statsstock_1e8a6897e195774f3bc6fa7b2ae7f801'] = 'Stats stock'; +$_MODULE['<{statsstock}prestashop>statsstock_8fd17aacf4c601e502cade4914545d4d'] = 'Stats stock'; +$_MODULE['<{statsstock}prestashop>statsstock_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Catégorie'; +$_MODULE['<{statsstock}prestashop>statsstock_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Toutes'; +$_MODULE['<{statsstock}prestashop>statsstock_1b2379801de373b6b563c347014fb34b'] = 'Votre catalogue est vide.'; +$_MODULE['<{statsstock}prestashop>statsstock_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statsstock}prestashop>statsstock_12d3c7a4296542c62474856ec452c045'] = 'Réf.'; +$_MODULE['<{statsstock}prestashop>statsstock_7d74f3b92b19da5e606d737d339a9679'] = 'Article'; +$_MODULE['<{statsstock}prestashop>statsstock_27ce7f8b5623b2e2df568d64cf051607'] = 'Stock'; +$_MODULE['<{statsstock}prestashop>statsstock_88940d60e75cf4ff38ce27db4efc83b2'] = 'Prix*'; +$_MODULE['<{statsstock}prestashop>statsstock_689202409e48743b914713f96d93947c'] = 'Valeur'; +$_MODULE['<{statsstock}prestashop>statsstock_26d6b7e13fef62e89ebdc5b7bef429cb'] = 'Stock total'; +$_MODULE['<{statsstock}prestashop>statsstock_4364f8c09d7bf97996a20840900e7b30'] = 'Prix moyen'; +$_MODULE['<{statsstock}prestashop>statsstock_62668f75fc6977f3d09df632d1585d07'] = 'Valeur total'; +$_MODULE['<{statsstock}prestashop>statsstock_2dee758ce6cb0116b234dc3908f016c5'] = 'Prix moyen lorsque le produit comporte des déclinaisons.'; diff --git a/modules/statsstock/it.php b/modules/statsstock/it.php new file mode 100644 index 000000000..412b38a4b --- /dev/null +++ b/modules/statsstock/it.php @@ -0,0 +1,21 @@ +statsstock_1e8a6897e195774f3bc6fa7b2ae7f801'] = 'Statistiche magazzino'; +$_MODULE['<{statsstock}prestashop>statsstock_8fd17aacf4c601e502cade4914545d4d'] = 'Valore magazzino'; +$_MODULE['<{statsstock}prestashop>statsstock_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Categoria'; +$_MODULE['<{statsstock}prestashop>statsstock_b1c94ca2fbc3e78fc30069c8d0f01680'] = 'Tutti'; +$_MODULE['<{statsstock}prestashop>statsstock_1b2379801de373b6b563c347014fb34b'] = 'Il tuo catalogo è vuoto.'; +$_MODULE['<{statsstock}prestashop>statsstock_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{statsstock}prestashop>statsstock_12d3c7a4296542c62474856ec452c045'] = 'Rif.'; +$_MODULE['<{statsstock}prestashop>statsstock_7d74f3b92b19da5e606d737d339a9679'] = 'Articolo'; +$_MODULE['<{statsstock}prestashop>statsstock_27ce7f8b5623b2e2df568d64cf051607'] = 'Magazzino'; +$_MODULE['<{statsstock}prestashop>statsstock_88940d60e75cf4ff38ce27db4efc83b2'] = 'Prezzo *'; +$_MODULE['<{statsstock}prestashop>statsstock_689202409e48743b914713f96d93947c'] = 'Valore'; +$_MODULE['<{statsstock}prestashop>statsstock_26d6b7e13fef62e89ebdc5b7bef429cb'] = 'Magazzino totale'; +$_MODULE['<{statsstock}prestashop>statsstock_4364f8c09d7bf97996a20840900e7b30'] = 'Prezzo medio'; +$_MODULE['<{statsstock}prestashop>statsstock_62668f75fc6977f3d09df632d1585d07'] = 'Valore totale'; +$_MODULE['<{statsstock}prestashop>statsstock_2dee758ce6cb0116b234dc3908f016c5'] = 'Prezzo medio quando il prodotto ha attributi.'; + +?> \ No newline at end of file diff --git a/modules/statsstock/logo.gif b/modules/statsstock/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..be2d2d62f60a23c5239a5bbfad7bbe06e4926ce1 GIT binary patch literal 1035 zcmds$`BRd40Eb`7N-VdU*=crWn+A-`t|@EUB6T}R#VsZ)wWgiS+KyTG2dk;kns!qH z#beDd)|@W1OBvBb@k%@r3D6XfGr$C2;&{PC_vMg!zm5B6?B|E)_h;t$B&Q_pCZAma zt$_T{{BH503iu=@kHlyov6?sBd%d&1aZ7X4w(gEy_3gAe<&Fl`u0}PvMZ3R4m(-uocrz^}CTw;oQFd30hKfj{}-%^8Os<%JG(sy;D z?@x>PhE^_MiqIe;x^FaV%j{+aO=$&)7-@zRuzm@A!a{a{O#|Tj zuay5Gh`}%%1OaICyxaUIpl}BS@T&tkv{m%*CDDSKqR5DN{F13U%BEG%4xPv(sRe`T zEx*=g1!@k)6n$5adp>5P&{0;sCO+c&{MXdfQF`^P4;4X_j)p-uBUtSfJzaSk~z+e%Uu2*r%iSkO~rnCbG$x#eSH9nd| z&R0+?*To*^{@}dK?RyZuF1!Awf-74~Jr++O5GEu);`iof(QPc;!u9yYVW|^^GS>GC wPG{kmE*TwK47U;saKy)v*~hL323{>%w0$KA)@@5J4qx4m7o1!fOMv3O0St8KWdHyG literal 0 HcmV?d00001 diff --git a/modules/statsstock/statsstock.php b/modules/statsstock/statsstock.php new file mode 100644 index 000000000..adbd290a1 --- /dev/null +++ b/modules/statsstock/statsstock.php @@ -0,0 +1,152 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7048 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsStock extends Module +{ + function __construct() + { + $this->name = 'statsstock'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Stock stats'); + $this->description = ''; + } + + public function install() + { + return (parent::install() && $this->registerHook('AdminStatsModules')); + } + + function hookAdminStatsModules() + { + global $cookie, $currentIndex; + + if (Tools::isSubmit('submitCategory')) + $cookie->statsstock_id_category = Tools::getValue('statsstock_id_category'); + + $ru = $currentIndex.'&module='.$this->name.'&token='.Tools::getValue('token'); + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $filter = ((int)$cookie->statsstock_id_category ? ' AND p.id_product IN (SELECT cp.id_product FROM '._DB_PREFIX_.'category_product cp WHERE cp.id_category = '.(int)$cookie->statsstock_id_category.')' : ''); + + $joinProduct = $whereProduct = ''; + if ($this->shopID || $this->shopGroupID) + { + $joinProduct = ' LEFT JOIN '._DB_PREFIX_.'product_shop ps ON ps.id_product = p.id_product '; + if ($this->shopID) + $whereProduct = ' AND ps.id_shop = '.$this->shopID; + else if ($this->shopGroupID) + $whereProduct = ' AND ps.id_shop IN (SELECT id_shop FROM '._DB_PREFIX_.'shop WHERE id_group_shop = '.$this->shopGroupID.')'; + } + + $sql = 'SELECT p.id_product, p.reference, pl.name, + IFNULL(( + SELECT AVG(pa.wholesale_price) + FROM '._DB_PREFIX_.'product_attribute pa WHERE p.id_product = pa.id_product + AND wholesale_price != 0 + ), p.wholesale_price) as wholesale_price, + IFNULL(( + SELECT SUM(pa.quantity) + FROM '._DB_PREFIX_.'product_attribute pa WHERE p.id_product = pa.id_product + ), p.quantity) as quantity, + IFNULL(( + SELECT SUM(IF(pa.wholesale_price > 0, pa.wholesale_price, p.wholesale_price) * pa.quantity) + FROM '._DB_PREFIX_.'product_attribute pa WHERE p.id_product = pa.id_product + ), p.wholesale_price * p.quantity) as stockvalue + FROM '._DB_PREFIX_.'product p + '.$joinProduct.' + INNER JOIN '._DB_PREFIX_.'product_lang pl ON (p.id_product = pl.id_product AND pl.id_lang = '.(int)$cookie->id_lang.') + WHERE 1 = 1 + '.$filter.$whereProduct; + $products = Db::getInstance()->ExecuteS($sql); + + echo ' + +

    '.$this->l('Stock value').'

    +
    + + '.$this->l('Category').' : +
    +
     
    '; + + if (!count($products)) + echo $this->l('Your catalog is empty.'); + else + { + $rollup = array('quantity' => 0, 'wholesale_price' => 0, 'stockvalue' => 0); + echo ' + + + + + + + + '; + foreach ($products as $product) + { + $rollup['quantity'] += $product['quantity']; + $rollup['wholesale_price'] += $product['wholesale_price']; + $rollup['stockvalue'] += $product['stockvalue']; + echo ' + + + + + + + '; + } + echo ' + + + + + + + + + + + + +
    '.$this->l('ID').''.$this->l('Ref.').''.$this->l('Item').''.$this->l('Stock').''.$this->l('Price*').''.$this->l('Value').'
    '.$product['id_product'].''.$product['reference'].''.$product['name'].''.$product['quantity'].''.Tools::displayPrice($product['wholesale_price'], $currency).''.Tools::displayPrice($product['stockvalue'], $currency).'
    '.$this->l('Total stock').''.$this->l('Avg price').''.$this->l('Total value').'
    '.$rollup['quantity'].''.Tools::displayPrice($rollup['wholesale_price'] / count($products), $currency).''.Tools::displayPrice($rollup['stockvalue'], $currency).'
    +

    * '.$this->l('Average price when the product has attributes.').'

    '; + } + } +} \ No newline at end of file diff --git a/modules/statsvisits/config.xml b/modules/statsvisits/config.xml new file mode 100755 index 000000000..e36c97b63 --- /dev/null +++ b/modules/statsvisits/config.xml @@ -0,0 +1,12 @@ + + + statsvisits + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/statsvisits/de.php b/modules/statsvisits/de.php new file mode 100644 index 000000000..86279ab98 --- /dev/null +++ b/modules/statsvisits/de.php @@ -0,0 +1,22 @@ +statsvisits_504c16c26a96283f91fb46a69b7c8153'] = 'Besuche und Besucher'; +$_MODULE['<{statsvisits}prestashop>statsvisits_2d9101f085dd2114768a88ec53a4d338'] = 'Zeigt Statistiken über Ihre Besuche und Besucher an'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9efcb563b932863f45ab70cbf1647a61'] = 'Ein Besuch entspricht einem Internet-Benutzer, der Ihren Shop besucht. Bis zum Ende ihres Besuchs auf dieser Webseite wird nur ein Besuch gezählt.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9cc2d19df71705e62e5ae8ec152ef78f'] = 'Ein Besucher ist eine unbekannte Person - die nicht registriert oder angemeldet ist - und in Ihrem Shop surft. Ein Besucher kann Ihren Shop mehrmals besuchen.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_54067074d24489ddb5654bf46642cb85'] = 'Besuche gesamt:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_23e640d55e56db79971918936e95bf9d'] = 'Besucher gesamt:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_998e4c5c80f27dec552e99dfed34889a'] = 'CSV-Export'; +$_MODULE['<{statsvisits}prestashop>statsvisits_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ffbee337f031c2282b311bac40bc8bb9'] = 'Bestimmen Sie das Ziel eines Besuchs'; +$_MODULE['<{statsvisits}prestashop>statsvisits_e90d50ca1e68dc66c97bd62929dcbaf1'] = 'Die Besucherentwicklungsgrafik sieht der Besuchsgrafik sehr ähnlich, liefert aber zusätzliche Informationen: '; +$_MODULE['<{statsvisits}prestashop>statsvisits_cb3ba5c56a0115bd92d888c89e759745'] = 'Falls dies der Fall ist: Gratulation, Ihre Webseite ist gut durchdacht und gefällt.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_0ec292c17c7dded03bee9b3a6528cb9c'] = 'Anderenfalls ist die Bilanz nicht so einfach. Es kann sich um ein ÄSthetisches oder ergonomisches Problem handeln, oder das Angebot ist unzureichend. Es kann auch sein, dass diese Besucher rein zufällig auf diese Webseite gekommen sind, ohne spezielles Interesse an Ihrem Shop; dieses Phänomen tritt häufig auf bei Suchmaschinen.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_4793db9717cc512af1406b09766a0a1f'] = 'Diese Information ist hauptsächlich qualitativer Art: Sie müssen die Ursache eines zufälligen Besuchs erkennen.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_39b960b0a5e2ebaaa638d946f1892050'] = 'Anzahl der Besuche und einmalige Besucher'; +$_MODULE['<{statsvisits}prestashop>statsvisits_d7e637a6e9ff116de2fa89551240a94d'] = 'Besuche'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Besucher'; + +?> \ No newline at end of file diff --git a/modules/statsvisits/en.php b/modules/statsvisits/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/statsvisits/en.php @@ -0,0 +1,4 @@ +statsvisits_504c16c26a96283f91fb46a69b7c8153'] = 'Visitas y Visitantes'; +$_MODULE['<{statsvisits}prestashop>statsvisits_2d9101f085dd2114768a88ec53a4d338'] = 'Mostrar estadísticas sobre visitas y visitantes'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9efcb563b932863f45ab70cbf1647a61'] = 'Una visita corresponde a un usuario que visita su tienda. Hasta el final de la sesión se contabiliza una única visita.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9cc2d19df71705e62e5ae8ec152ef78f'] = 'Un visitante es una persona desconocida, que no se ha registrado ni abierto una sesión- que visita su tienda. Un visitante puede visitar su tienda varias veces.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_54067074d24489ddb5654bf46642cb85'] = 'Total de visitas:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_23e640d55e56db79971918936e95bf9d'] = 'Total de visitantes:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_998e4c5c80f27dec552e99dfed34889a'] = 'CSV Export'; +$_MODULE['<{statsvisits}prestashop>statsvisits_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guía'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ffbee337f031c2282b311bac40bc8bb9'] = 'Determinar el interés de las visitas'; +$_MODULE['<{statsvisits}prestashop>statsvisits_e90d50ca1e68dc66c97bd62929dcbaf1'] = 'El gráfico de evolución visitantes es muy similar al gráfico de las visitas pero da información suplementaria'; +$_MODULE['<{statsvisits}prestashop>statsvisits_cb3ba5c56a0115bd92d888c89e759745'] = 'Si es el caso, enhorabuena, su sitio está bien pensado y resulta agradable.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_0ec292c17c7dded03bee9b3a6528cb9c'] = 'En el caso contrario, la conclusión no es simple. El problema puede ser estético o ergonómico, o quizás la oferta sea insuficiente. También es posible que dichos visitantes hayan llegado a su sitio por error, sin interés particular por su tienda; este fenómeno ocurre con frecuencia con los motores de búsqueda.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_4793db9717cc512af1406b09766a0a1f'] = 'Esta información es sobre todo cualitativa. Usted deberá determinar el interés de este tipo de visitas.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_39b960b0a5e2ebaaa638d946f1892050'] = 'Número de visitas y visitantes únicos'; +$_MODULE['<{statsvisits}prestashop>statsvisits_d7e637a6e9ff116de2fa89551240a94d'] = 'Visitas'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitantes'; diff --git a/modules/statsvisits/fr.php b/modules/statsvisits/fr.php new file mode 100644 index 000000000..e0b3f6ef5 --- /dev/null +++ b/modules/statsvisits/fr.php @@ -0,0 +1,20 @@ +statsvisits_504c16c26a96283f91fb46a69b7c8153'] = 'Visites et visiteurs'; +$_MODULE['<{statsvisits}prestashop>statsvisits_2d9101f085dd2114768a88ec53a4d338'] = 'Propose des graphiques montrant l\'évolution de vos visites et visiteurs'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9efcb563b932863f45ab70cbf1647a61'] = 'Une visite correspond au passage d\'un internaute sur votre boutique. Une seule visite est comptée pour toute la durée de sa session.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9cc2d19df71705e62e5ae8ec152ef78f'] = 'On appelle visiteur une personne inconnue - non inscrite ou non identifiée - naviguant sur votre boutique. Un visiteur peut donc visiter votre boutique plusieurs fois.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_54067074d24489ddb5654bf46642cb85'] = 'Nombre total de visites'; +$_MODULE['<{statsvisits}prestashop>statsvisits_23e640d55e56db79971918936e95bf9d'] = 'Nombre total de visiteurs'; +$_MODULE['<{statsvisits}prestashop>statsvisits_998e4c5c80f27dec552e99dfed34889a'] = 'Export CSV'; +$_MODULE['<{statsvisits}prestashop>statsvisits_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guide'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ffbee337f031c2282b311bac40bc8bb9'] = 'Déterminez l\'intérêt d\'une visite'; +$_MODULE['<{statsvisits}prestashop>statsvisits_e90d50ca1e68dc66c97bd62929dcbaf1'] = 'Le graphique d\'évolution visiteurs ressemble fortement au graphique des visites, mais fournit des informations supplémentaires:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_cb3ba5c56a0115bd92d888c89e759745'] = 'Si c\'est le cas, alors félicitations, votre site est bien conçu et plaît indéniablement.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_0ec292c17c7dded03bee9b3a6528cb9c'] = 'Dans le cas contraire, la conclusion n\'est pas si simple. Le problème peut être esthétique ou ergonomique, ou alors l\'offre insuffisante. Il se peut également que ces visiteurs soient arrivés là par erreur, sans intérêt particulier pour votre boutique ; ce phénomène arrive couramment avec les moteurs de recherche.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_4793db9717cc512af1406b09766a0a1f'] = 'Cette information est surtout qualitative : c\'est à vous de déterminer l\'intérêt d\'une visite sans suite.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_39b960b0a5e2ebaaa638d946f1892050'] = 'Nombre de visites et visiteurs uniques'; +$_MODULE['<{statsvisits}prestashop>statsvisits_d7e637a6e9ff116de2fa89551240a94d'] = 'Visites'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visiteurs'; diff --git a/modules/statsvisits/it.php b/modules/statsvisits/it.php new file mode 100644 index 000000000..2dec288d1 --- /dev/null +++ b/modules/statsvisits/it.php @@ -0,0 +1,22 @@ +statsvisits_504c16c26a96283f91fb46a69b7c8153'] = 'Visite e visitatori'; +$_MODULE['<{statsvisits}prestashop>statsvisits_2d9101f085dd2114768a88ec53a4d338'] = 'Visualizza le statistiche relative alle visite e visitatori'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9efcb563b932863f45ab70cbf1647a61'] = 'Una visita corrisponde ad un utente di Internet che viene nel tuo negozio. Fino alla fine della sessione, una sola visita viene conteggiata.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_9cc2d19df71705e62e5ae8ec152ef78f'] = 'Un visitatore è una persona sconosciuta - che non si è registrata o iscritta - e naviga nel tuo negozio. Un visitatore può venire a visitare il tuo negozio molte volte.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_54067074d24489ddb5654bf46642cb85'] = 'Visite totali:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_23e640d55e56db79971918936e95bf9d'] = 'Totale visitatori:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_998e4c5c80f27dec552e99dfed34889a'] = 'Esporta CSV'; +$_MODULE['<{statsvisits}prestashop>statsvisits_6602bbeb2956c035fb4cb5e844a4861b'] = 'Guida'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ffbee337f031c2282b311bac40bc8bb9'] = 'Determinare l\'interesse di una visita'; +$_MODULE['<{statsvisits}prestashop>statsvisits_e90d50ca1e68dc66c97bd62929dcbaf1'] = 'Il grafico di evoluzione dei visitatori ricorda molto il grafico delle visite, ma fornisce ulteriori informazioni:'; +$_MODULE['<{statsvisits}prestashop>statsvisits_cb3ba5c56a0115bd92d888c89e759745'] = 'Se questo è il caso, complimenti, il tuo sito è ben congegnato e piacevole.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_0ec292c17c7dded03bee9b3a6528cb9c'] = 'In caso contrario, la conclusione non è così semplice. Il problema può essere estetico o ergonomico, oppure l\'offerta non è sufficiente. E\' anche possibile che questi visitatori sono arrivati qui per errore, senza particolare interesse per il tuo negozio, questo fenomeno spesso accade con i motori di ricerca.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_4793db9717cc512af1406b09766a0a1f'] = 'Questa informazione è prevalentemente qualitativa: è necessario determinare l\'interesse di una visita errata.'; +$_MODULE['<{statsvisits}prestashop>statsvisits_39b960b0a5e2ebaaa638d946f1892050'] = 'Numero di visite e visitatori unici'; +$_MODULE['<{statsvisits}prestashop>statsvisits_d7e637a6e9ff116de2fa89551240a94d'] = 'Visite'; +$_MODULE['<{statsvisits}prestashop>statsvisits_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitatori'; + +?> \ No newline at end of file diff --git a/modules/statsvisits/logo.gif b/modules/statsvisits/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb73d718ba44d1b6ce4d8058404dcb19cd309dd2 GIT binary patch literal 1033 zcmZ?wbhEHb6krfw_|5eXx4u3fio z-TL+GH*em&Wy_YGJ9qBdwQJ9wJ$v`=-M4Sw{{8zWuDLpG!;P+Wk0)$=K4<5XnLA!D z+Ief??x!0sPuO&6>c(r6wp^LI?aG`B&vqR?eE7(bBgc;)KXKy3sZ*y;pFVx&%$alN z&YeGh{?x@gXD;44bLIZUix)3lx^(&S<(oHe-nw<`_U+qu?%cV1_wN1s_b=ak_Ta&T zhYueeZ{)uV24;^XBc_x9{G)d;k9ZhYueAsz9euS7E}>iA=2A+#*5&k}g(VkHnI;#V883xc4zDIq@(x{)}g3 f=M@u>P*8Aa +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7307 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class StatsVisits extends ModuleGraph +{ + private $_html = ''; + private $_query = ''; + private $_query2 = ''; + private $_option; + + function __construct() + { + $this->name = 'statsvisits'; + $this->tab = 'analytics_stats'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Visits and Visitors'); + $this->description = $this->l('Display statistics about your visits and visitors.'); + } + + public function install() + { + return (parent::install() AND $this->registerHook('AdminStatsModules')); + } + + public function getTotalVisits() + { + $sql = 'SELECT COUNT(c.`id_connections`) + FROM `'._DB_PREFIX_.'connections` c + WHERE c.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(false, 'c'); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + public function getTotalGuests() + { + $sql = 'SELECT COUNT(DISTINCT c.`id_guest`) + FROM `'._DB_PREFIX_.'connections` c + WHERE c.`date_add` BETWEEN '.ModuleGraph::getDateBetween().' + '.$this->sqlShopRestriction(false, 'c'); + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); + } + + public function hookAdminStatsModules($params) + { + $graphParams = array( + 'layers' => 2, + 'type' => 'line', + 'option' => 3, + ); + + $totalVisits = $this->getTotalVisits(); + $totalGuests = $this->getTotalGuests(); + if (Tools::getValue('export')) + $this->csvExport(array('layers' => 2, 'type' => 'line', 'option' => 3)); + $this->_html = ' +
    '.$this->displayName.' +

    + '.$this->l('A visit corresponds to an internet user coming to your shop. Until the end of their session, only one visit is counted.').' + '.$this->l('A visitor is an unknown person, who has not registered or logged on, surfing on your shop. A visitor can come and visit your shop many times.').' +

    +
    +

    '.$this->l('Total visits:').' '.$totalVisits.'

    +

    '.$this->l('Total visitors:').' '.$totalGuests.'

    + '.($totalVisits ? $this->engine($graphParams).'

    '.$this->l('CSV Export').'

    ' : '').' + +
    +
    +
    '.$this->l('Guide').' +

    '.$this->l('Determine the interest of a visit').'

    + '.$this->l('The visitors\' evolution graph strongly resembles the visits\' graph, but provides additional information:').'
    +
      +
    • '.$this->l('If this is the case, congratulations, your website is well planned and pleasing.').'
    • +
    • '.$this->l('Otherwise, the conclusion is not so simple. The problem can be aesthetic or ergonomic, or else the offer is not sufficient. It is also possible that these visitors mistakenly came here without particular interest for your shop; this phenomenon often happens with the search engines.').'
    • +
    + '.$this->l('This information is mostly qualitative: you have to determine the interest of a disjointed visit.').'
    +
    '; + + return $this->_html; + } + + public function setOption($option, $layers = 1) + { + switch ($option) + { + case 3: + $this->_titles['main'][0] = $this->l('Number of visits and unique visitors'); + $this->_titles['main'][1] = $this->l('Visits'); + $this->_titles['main'][2] = $this->l('Visitors'); + $this->_query[0] = 'SELECT date_add, COUNT(`date_add`) as total + FROM `'._DB_PREFIX_.'connections` + WHERE 1 + '.$this->sqlShopRestriction().' + `date_add` BETWEEN '; + $this->_query[1] = 'SELECT date_add, COUNT(DISTINCT `id_guest`) as total + FROM `'._DB_PREFIX_.'connections` + WHERE 1 + '.$this->sqlShopRestriction().' + `date_add` BETWEEN '; + break; + } + } + + protected function getData($layers) + { + $this->setDateGraph($layers, true); + } + + protected function setAllTimeValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i].$this->getDate().' GROUP BY LEFT(date_add, 4)'); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 0, 4))] = (int)($row['total']); + } + } + + protected function setYearValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i].$this->getDate().' GROUP BY LEFT(date_add, 7)'); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 5, 2))] = (int)($row['total']); + } + } + + protected function setMonthValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i].$this->getDate().' GROUP BY LEFT(date_add, 10)'); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 8, 2))] = (int)($row['total']); + } + } + + protected function setDayValues($layers) + { + for ($i = 0; $i < $layers; $i++) + { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($this->_query[$i].$this->getDate().' GROUP BY LEFT(date_add, 13)'); + foreach ($result AS $row) + $this->_values[$i][(int)(substr($row['date_add'], 11, 2))] = (int)($row['total']); + } + } +} + + diff --git a/modules/themeinstallator/add.png b/modules/themeinstallator/add.png new file mode 100644 index 0000000000000000000000000000000000000000..f4872d2dd2af8824982ab9ecdeacd1d6c12a4524 GIT binary patch literal 759 zcmVs>?k?5dzyt((>bM8G?r)iqTe?it)^N&RO-6F|zIxrS3})6QaDM5=l9ok5P8o@YWOmhE z{M)OH&JMD(Epe@)g^IkIg8(yY6ZCw3PMPBj$FoYA6KC*6JV>fU>Y-G!5|1)6vyg$+Uc#X;k|tv`CJ>UgaR=uqwO0|0h&&m7h~1J; zPHHZCfXUTy;*AL$%Q(rfZ-9ujLs*K?R&k3P#q9{u0GnGrM!j#SIdL9A{?5>JKfq4_ z*UA`qSp`gQO|mYoBZftUP+(7|$GwCU4G{`%up+vtEvTh`sxKyCGqgdG!Ng+F&8`}y zqw3DSO+UEu41hN0bv(j6C5J2Vi9<04vLX|bf&_O(q&VrXch?jZ9U77%#~7FnrQiuH zlAMr?5ZR>dT`M8K$m6Ro_9g@9b$X7N?JW7-q?;@;2IaPDKDo!Rn;d9T6rCbtNl)50 zSyeRjst%jkL9c6o#^Q@HAFOY$ao5?2F(r=E`R5o}e1)vaD5`>{0B9KWan$EG<8-}b zcEw9q%TuftTg*t~3!^-GdymYFG|m<@u)O8QBe>C26>EAvR&ySGt{z;ob97$5O+!)R zK`W2V57YJjJ{wU#^@Vk0n{z>f<-iiokAoO6(caXt*L(l~z`NyPX!a)}Ei&DbpVKR?sI#1CLpH#S3^P>BEl002ovPDHLkV1l#YO1S_4 literal 0 HcmV?d00001 diff --git a/modules/themeinstallator/config.xml b/modules/themeinstallator/config.xml new file mode 100755 index 000000000..a176348b8 --- /dev/null +++ b/modules/themeinstallator/config.xml @@ -0,0 +1,12 @@ + + + themeinstallator + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/themeinstallator/de.php b/modules/themeinstallator/de.php new file mode 100644 index 000000000..01e5d400f --- /dev/null +++ b/modules/themeinstallator/de.php @@ -0,0 +1,89 @@ +themeinstallator_fff01a1de50e0559f82501a927654d1b'] = 'Import / Export eines Themas'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_83ebbd7865677d356ffde5ad7e12784f'] = 'Exportieren oder installieren Sie ein Thema und seine Module auf Ihren Shop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_25b9e1d82d8200d70be2b22a1a283957'] = 'Ein Fehler ist beim Hochladen der Datei aufgetreten.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_050991b5b76aad0be75563b7cb93a33e'] = 'Nur zip-Dateien sind erlaubt'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_57c1ed81b02e5d3361323c7930897295'] = 'Ein Fehler ist beim Kopieren der Datei aufgetreten.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5fd13c2b89a6eaaa4614bfe258f6c40f'] = 'Zip-Datei scheint beschädigt zu sein'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dea6caeb83e5c11d3678284e64ebed8'] = 'Fehler beim Herunterladen der Datei'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c186217583219f4cd040d9ee8d388ffb'] = 'Fehler bei der Zip-Extraktion'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0210b6456cdccad569cb56026bb0f689'] = 'Schlechte Konfigurationsdatei'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5b6cf869265c13af8566f192b4ab3d2a'] = 'Dokumentation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_6bdbe5a8a9f446d4d758ee4c22648771'] = 'Sie möchten eventuell die Dokumentation prüfen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7348fd57bfb5c837fc57e54fcfeeed9e'] = 'Rechtsklick auf den Namen und \"Link speichern unter\" wählen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b857ef1f431c5f3290dc5b5e644826a6'] = 'Folgende Module wurden installiert'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_22c765d777eb4ca6b4292bcbb596872e'] = 'Folgende Module wurden deaktiviert'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e501dc865768ac08d49c129a23c3ae09'] = 'Folgende Module wurden aktiviert'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dfbf4744524c8573235d60589d8b66e'] = 'Bilder wurden korrekt in der Datenbank aktualisiert'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd1f775e443ff3b9a89270713580a51b'] = 'Zurück'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a20ddccbb6f808ec42cd66323e6c6061'] = 'Fertig'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_33167fe8de7517798cf2e95c7680d6a4'] = 'Die folgenden Themen wurden erfolgreich importiert'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4ef3a40f287dd9849004a7f5af73f00'] = 'Achtung: ein Modul mit dem gleichen Namen existiert bereits'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_df8703a4066393da85e8188261660717'] = 'Wählen Sie das Themenmodul, das Sie installieren möchten'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7651cc4a979c5e21ee50de988ce574b0'] = 'Native Modulkonfiguration'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8ab378b3ad05e14cbe61bff60c50afa6'] = 'Aktuelle Konfiguration'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f94545e00cff9d0395194458b2245702'] = 'Themen-Konfiguration'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_130c5b3473c57faa76e2a1c54e26f88e'] = 'Beide'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c90ba3aaed0a2bafed18233111062cf0'] = 'Konfiguration der Themenbilder'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2a84d9915b12fcb0c1436709a77a8dd0'] = 'Hinzufügen einer neuer Konfiguration'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd3acd810b479275ce68d69e78ed7a95'] = 'Fügen Sie alle hinzu (Sie verlieren eventuell Ihre aktuelle Konfig.)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_332efbbfb2c4bd5a37fd7a55659b821a'] = 'Nichts ändern'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Weiter'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5138a89d1b730dacf446855e15c24496'] = 'Sie werden die folgenden Themen installieren'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f364da141450380ae79d7a45528f4c06'] = 'Dieses Thema ist für Prestashop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac85d9784348dc8f0c2db93f4a095eb0'] = 'Achtung: Sie haben bereits ein Thema mit dem gleichen Ordnernamen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8f3ea15c5b87db00561ccde5067310a5'] = 'für Prestashop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_caeedb303068f9915e8e5ce091c9c02f'] = '(Achtung: Ein Ordner mit dem gleichen Namen ist bereits vorhanden)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2dd99d7426b4fe6dd04d7a98f5e32a62'] = 'Wählen Sie die Varianten, die Sie importieren möchten'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f956917da1716add289f33a8869b85d4'] = 'Hauptthema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1e3de51d693cd0c7e903bcf3769a0cdb'] = 'Deaktivieren Sie dieses Feld, wenn Sie das Hauptthema nicht installieren möchten'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c49fbf2b822fd14929fd1fd76cdb0c96'] = 'Wählen Sie die Variationen, die Sie importieren möchten'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d1baba351b02042982a133c4df5d4924'] = 'Exportieren Sie ein Thema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5092965125a28a17f49ee460fbc1f62c'] = 'Wählen Sie ein Thema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0557cae4cf5b379e665910d701210f69'] = 'Exportieren Sie dieses Thema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7961c4434751797a383d52d647e044d6'] = 'Import aus Ihrem Computer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bc52857ec49d8de10e55171f5bbc7f2a'] = 'Archiv-Datei'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_24ad8bfdfce09842a83f10d59a8ef01f'] = 'Wo ist Ihre Zip-Datei?'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dec0faa6eb19bd9120d12c5a876bd1cf'] = 'Import aus dem Internet'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a33388a338ee2b199d66112369279558'] = 'Archiv-URL'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_cd8d9cc19984ccf9d314eee5eebfc2cc'] = 'Import vom FTP'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_94f2371003860a92b12bf4c66b2851ac'] = 'Wählen Sie ein Archiv'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1031371f906a92891140f384d04b3421'] = 'Ein Fehler trat beim Generieren des Archivs auf'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2c19b34eebed37ccc288c518006615b3'] = 'Fehler in Ihrer E-Mail-Syntax!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_129b7dae66f0029381da64578a351198'] = 'Fehler in Ihrer URL-Syntax!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_87e0eaf3f9614cb904fafb0d4f4c1f56'] = 'Dateierweiterung muss .txt oder .pdf sein'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_550a06d4fd147c22a4c921036003abf6'] = 'Fehler beim heraufladen der Dokumentation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ecd8e7704f6f4f730f6a43bfb24a9546'] = 'Bitte geben Sie einen gültigen Dokumentationsnamen an'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_623e4ca0275c19c3134b7290fdd19264'] = 'Bitte geben Sie einen gültigen Autornamen an '; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a43f1054076c2389afd746ec3d5d1c71'] = 'Bitte geben Sie einen gültigen Themennamen an'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_03d105aa95f842fc54b18ca8a73109ca'] = 'Bitte geben Sie einen gültigen Themavariationsnamen an'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_9891d2e13ad8b753833055c5809a733e'] = 'Syntaxfehler im Versionsfeld. Nur Ziffern und Punkte sind erlaubt und die Kompatibilität sollte steigend oder gleich sein.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd88d85745bba1abfa65cef79472da6a'] = 'Syntaxfehler auf der Version. Nur Ziffern und Punkte sind erlaubt die Kompatibilität sollte steigend oder gleich sein.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bf17ac149e2e7a530c677e9bd51d3fd2'] = 'Module'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_714af595b1403ed23ff51f27e863c9a2'] = 'Wählen Sie die Module, die Sie exportieren möchten'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a517747c3d12f99244ae598910d979c5'] = 'Autor'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-Mail'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_15bbb9d0bbf25e8d2978de1168c749dc'] = 'Webseite'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d721757161f7f70c5b0949fdb6ec2c30'] = 'Thema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4f10e7d35bef4e7b48e76ee4bdeae24'] = 'Ihr Themenname'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Beschreibung'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_742ec436610daf7b51a1ba94039adf78'] = 'Geben Sie eine kurze Beschreibung Ihres Themas ein'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_34b6cd75171affba6957e308dcbd92be'] = 'Version'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7da6f328a4647adb2b96a01a6d7c05c4'] = 'Ihre Themenversion'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_333dfbe2bb5c64b140df4607935ec8be'] = 'Kompatibel ab'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e12167aa0a7698e6ebc92b4ce3909b53'] = 'bis'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a82cac3db0465cfc701f3765fd880019'] = 'Dokumentation hinzufügen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_08e27f4e5511f4f6aa73557e6ad6df48'] = 'Geben Sie dem Benutzer eine Hilfe. Fügen Sie ein Feld hinzu, indem Sie hier klicken'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a508df4b049c5b044cb4568b76b6c7e6'] = 'Variation hinzufügen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_626bd6acdcd835a5d064ef6358124b6c'] = 'Anderes Thema und Kompatibilität zum Hinzufügen wählen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac70412e939d72a9234cdebb1af5867b'] = 'Pfad'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5da618e8e4b89c66fe86e32cdafde142'] = 'Von'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_3271e801d0a5db9dc2963a19ed9695d6'] = 'Wählen Sie ein Thema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ea4788705e6873b424c65e91c2846b19'] = 'Abbrechen'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_abb381ee4077396e5d5d475b9022ba86'] = 'Generieren Sie das Archiv jetzt!'; + +?> \ No newline at end of file diff --git a/modules/themeinstallator/delete.png b/modules/themeinstallator/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0d06d64b6b8f6a7f51b7dbac01b81896c1dada GIT binary patch literal 823 zcmV-71IYY|P)(RCwBi zQe8-sQ5Zhw?C0Cu#vF!DGfX#Ex!l~uYRx32ZH8nTl}p!!nMxK|;6=MNp)L}|J4c~l zU9_UYROVk$fzvddNzOkQp)%J{n26@4JDnLDb4We#T%7Yh@Ba%h#=v^&9QCdG&KpzV z<)*;c_uqkW|b-A3OUZerlMkD)%$lhzyava&WVjlO||41 zN;5oOFO=KHvykuT;g@o8io)l11MKm@Dy>HU;(AFRBnWr@R9Iw`=`_n{^0f-5%e8&$ zX=BX?yS(xKt#-+lcf%AD*{0gs2~ z<`>rQb#&Bp&CWaz1crg04n;*JHVNZRH+kHPJ5njwO-ce3n++_}_Q?beM|eV%630LY z*p`;o9$I=U4NB!(gZUK*1qh-!E32(!Z0uT$Sj_R|<^q;L0K9%bfW&#ix$>*tI#gb! zQ1%40!2l?{&-Ie$sdP&xV08$ZeS0^t+@J5zMJe^#Z!D`jQaAd%EY z`iExFds2}uaV`#kwbfYPo&|z-2nUJPQ;hKyBoYC-NaU}y*)(G=*T;Pobfw9Jv$1gt zfvi6W=LwAneGXPu0Aa0#{Pl7S#2RjX2jqG)OeGe+3BO61lk+8Vw5( zQtpXp0MH+wRX0)qBt+iDK_GgD7=Wux0EB-87y!{TZL+l<8Xo`v002ovPDHLkV1kkB Bc-Q~{ literal 0 HcmV?d00001 diff --git a/modules/themeinstallator/es.php b/modules/themeinstallator/es.php new file mode 100644 index 000000000..6d91b3d69 --- /dev/null +++ b/modules/themeinstallator/es.php @@ -0,0 +1,87 @@ +themeinstallator_fff01a1de50e0559f82501a927654d1b'] = 'Importar / exportar un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_83ebbd7865677d356ffde5ad7e12784f'] = 'Exportar o importar un tema y sus módulos en su tienda'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_25b9e1d82d8200d70be2b22a1a283957'] = 'Se ha producido un error durante el envío del archivo.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_050991b5b76aad0be75563b7cb93a33e'] = 'Solo están autorizados los archivos zip'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_57c1ed81b02e5d3361323c7930897295'] = 'Se ha producido un error durante la copia del archivo.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5fd13c2b89a6eaaa4614bfe258f6c40f'] = 'El archivo zip parece corrupto'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dea6caeb83e5c11d3678284e64ebed8'] = 'Se ha producido un error durante el envío del archivo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c186217583219f4cd040d9ee8d388ffb'] = 'Se ha producido un error durante la extracción del archivo zip'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0210b6456cdccad569cb56026bb0f689'] = 'Configuración de archivo errónea'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5b6cf869265c13af8566f192b4ab3d2a'] = 'Documentación'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_6bdbe5a8a9f446d4d758ee4c22648771'] = 'Puede consultar la documentación'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7348fd57bfb5c837fc57e54fcfeeed9e'] = 'Haga clic derecho en el nombre y elija \"guardar el enlace bajo\"'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b857ef1f431c5f3290dc5b5e644826a6'] = 'Se han instalado los siguientes módulos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_22c765d777eb4ca6b4292bcbb596872e'] = 'Se han desactivado los siguientes módulos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e501dc865768ac08d49c129a23c3ae09'] = 'Se han activado los siguientes módulos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dfbf4744524c8573235d60589d8b66e'] = 'Se han actualizado las imágenes en la base de datos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd1f775e443ff3b9a89270713580a51b'] = 'Anterior'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a20ddccbb6f808ec42cd66323e6c6061'] = 'Terminar'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_33167fe8de7517798cf2e95c7680d6a4'] = 'Los siguientes temas se han importado correctamente'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4ef3a40f287dd9849004a7f5af73f00'] = 'Atención: ya existe un módulo con ese nombre'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_df8703a4066393da85e8188261660717'] = 'Seleccione los módulos del tema que desea instalar'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7651cc4a979c5e21ee50de988ce574b0'] = 'Configuración de los módulos nativos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8ab378b3ad05e14cbe61bff60c50afa6'] = 'Configuración actual'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f94545e00cff9d0395194458b2245702'] = 'Configuración de los temas'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_130c5b3473c57faa76e2a1c54e26f88e'] = 'Ambos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c90ba3aaed0a2bafed18233111062cf0'] = 'Configuración de las imágenes del tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2a84d9915b12fcb0c1436709a77a8dd0'] = 'Añadir la nueva configuración'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd3acd810b479275ce68d69e78ed7a95'] = 'Añadir todo (riesgo de perder su configuración actual)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_332efbbfb2c4bd5a37fd7a55659b821a'] = 'No cambiar nada'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Siguiente'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5138a89d1b730dacf446855e15c24496'] = 'Está a punto de instalar los siguientes temas'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f364da141450380ae79d7a45528f4c06'] = 'Este tema es para PrestaShop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac85d9784348dc8f0c2db93f4a095eb0'] = '(Atención: ya existe un tema con ese nombre)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8f3ea15c5b87db00561ccde5067310a5'] = 'para PrestaShop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_caeedb303068f9915e8e5ce091c9c02f'] = '(Atención: ya existe una carpeta con ese nombre)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2dd99d7426b4fe6dd04d7a98f5e32a62'] = 'Elija la declinación que desea importar'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f956917da1716add289f33a8869b85d4'] = 'Tema principal'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1e3de51d693cd0c7e903bcf3769a0cdb'] = 'Desmarque este campo si no quiere instalar el tema principa'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c49fbf2b822fd14929fd1fd76cdb0c96'] = 'Seleccione las variaciones que desee importar'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d1baba351b02042982a133c4df5d4924'] = 'Exportar un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5092965125a28a17f49ee460fbc1f62c'] = 'Seleccionar un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0557cae4cf5b379e665910d701210f69'] = 'Exportar este tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7961c4434751797a383d52d647e044d6'] = 'Importar a partir del ordenador'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bc52857ec49d8de10e55171f5bbc7f2a'] = 'Fichero del archivo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_24ad8bfdfce09842a83f10d59a8ef01f'] = '¿Dónde está su archivo zip?'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dec0faa6eb19bd9120d12c5a876bd1cf'] = 'Importar a partir del Web'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a33388a338ee2b199d66112369279558'] = 'URL del archivo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_cd8d9cc19984ccf9d314eee5eebfc2cc'] = 'Importar a partir del FTP'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_94f2371003860a92b12bf4c66b2851ac'] = 'Seleccionar el archivo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1031371f906a92891140f384d04b3421'] = 'Se ha producido un error al general el archivo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2c19b34eebed37ccc288c518006615b3'] = '¡Hay un error de sintaxis en el campo \"email\"!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_129b7dae66f0029381da64578a351198'] = '¡Hay un error de sintaxis en el campo \"url\"!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_87e0eaf3f9614cb904fafb0d4f4c1f56'] = 'La extensión del archivo debe ser .txt o .pdf'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_550a06d4fd147c22a4c921036003abf6'] = 'Se ha producido un error al enviar la documentación'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ecd8e7704f6f4f730f6a43bfb24a9546'] = 'Introduzca un nombre de documentación válido'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_623e4ca0275c19c3134b7290fdd19264'] = 'Introduzca un nombre de autor válido'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a43f1054076c2389afd746ec3d5d1c71'] = 'Introduzca un nombre de tema válido'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_03d105aa95f842fc54b18ca8a73109ca'] = 'Introduzca un nombre de variación válido'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_9891d2e13ad8b753833055c5809a733e'] = 'Error de sintaxis en el campo versión. Solo se autorizan los números y los puntos y la contabilidad debe ser creciente o igual.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd88d85745bba1abfa65cef79472da6a'] = 'Error de sintaxis en el campo versión. Solo se autorizan los números y los puntos y la contabilidad debe ser creciente o igual.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bf17ac149e2e7a530c677e9bd51d3fd2'] = 'Módulos'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_714af595b1403ed23ff51f27e863c9a2'] = 'Seleccione los módulos que quiere exportar'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a517747c3d12f99244ae598910d979c5'] = 'Autor'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_15bbb9d0bbf25e8d2978de1168c749dc'] = 'Sitio Web'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d721757161f7f70c5b0949fdb6ec2c30'] = 'Tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4f10e7d35bef4e7b48e76ee4bdeae24'] = 'El nombre de su tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descripción'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_742ec436610daf7b51a1ba94039adf78'] = 'Introduzca una descripción breve de su tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_34b6cd75171affba6957e308dcbd92be'] = 'Versión'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7da6f328a4647adb2b96a01a6d7c05c4'] = 'La versión de su tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_333dfbe2bb5c64b140df4607935ec8be'] = 'Compatible a partir de '; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e12167aa0a7698e6ebc92b4ce3909b53'] = 'Hasta'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a82cac3db0465cfc701f3765fd880019'] = 'Añadir una documentación'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_08e27f4e5511f4f6aa73557e6ad6df48'] = 'Ayude un poco al usuario. Añada un campo pulsando aquí'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a508df4b049c5b044cb4568b76b6c7e6'] = 'Añadir una variación'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_626bd6acdcd835a5d064ef6358124b6c'] = 'Seleccione otro tema y su contabilidad para incluir'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac70412e939d72a9234cdebb1af5867b'] = 'Camino'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5da618e8e4b89c66fe86e32cdafde142'] = 'A partir de '; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_3271e801d0a5db9dc2963a19ed9695d6'] = 'El nombre de su tienda'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ea4788705e6873b424c65e91c2846b19'] = 'Anular'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_abb381ee4077396e5d5d475b9022ba86'] = '¡Generar el archivo ahora!'; diff --git a/modules/themeinstallator/fr.php b/modules/themeinstallator/fr.php new file mode 100644 index 000000000..fa7916e67 --- /dev/null +++ b/modules/themeinstallator/fr.php @@ -0,0 +1,87 @@ +themeinstallator_fff01a1de50e0559f82501a927654d1b'] = 'Importer / Exporter un thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_83ebbd7865677d356ffde5ad7e12784f'] = 'Exporter ou importer un thème et ses modules sur votre boutique'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_25b9e1d82d8200d70be2b22a1a283957'] = 'Une erreur est survenue durant l\'envoi du fichier.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_050991b5b76aad0be75563b7cb93a33e'] = 'Seuls les fichiers zip sont autorisés'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_57c1ed81b02e5d3361323c7930897295'] = 'Une erreur est survenue durant la copie du fichier.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5fd13c2b89a6eaaa4614bfe258f6c40f'] = 'Le fichier zip semble corrompu'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dea6caeb83e5c11d3678284e64ebed8'] = 'Une erreur est survenue durant l\'envoi du fichier'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c186217583219f4cd040d9ee8d388ffb'] = 'Une erreur est survenue durant l\'extraction du fichier zip'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0210b6456cdccad569cb56026bb0f689'] = 'Mauvais fichier de configuration'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5b6cf869265c13af8566f192b4ab3d2a'] = 'Documentation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_6bdbe5a8a9f446d4d758ee4c22648771'] = 'Vous pouvez consulter la documentation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7348fd57bfb5c837fc57e54fcfeeed9e'] = 'Faites un clic droit sur le nom et choisissez \"enregistrer le lien sous\"'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b857ef1f431c5f3290dc5b5e644826a6'] = 'Les modules suivants ont été installés'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_22c765d777eb4ca6b4292bcbb596872e'] = 'Les modules suivants ont été désactivés'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e501dc865768ac08d49c129a23c3ae09'] = 'Les modules suivants ont été activés'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dfbf4744524c8573235d60589d8b66e'] = 'Les images ont bien été mises à jour dans la base de données'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd1f775e443ff3b9a89270713580a51b'] = 'Précédent'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a20ddccbb6f808ec42cd66323e6c6061'] = 'Terminer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_33167fe8de7517798cf2e95c7680d6a4'] = 'Les thèmes suivants ont correctement été importés'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4ef3a40f287dd9849004a7f5af73f00'] = 'Attention : un module avec le même nom existe déjà'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_df8703a4066393da85e8188261660717'] = 'Sélectionnez les modules du thème que vous souhaitez installer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7651cc4a979c5e21ee50de988ce574b0'] = 'Configuration des modules natifs'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8ab378b3ad05e14cbe61bff60c50afa6'] = 'Configuration actuelle'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f94545e00cff9d0395194458b2245702'] = 'Configuration du thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_130c5b3473c57faa76e2a1c54e26f88e'] = 'Les deux'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c90ba3aaed0a2bafed18233111062cf0'] = 'Configuration des images du thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2a84d9915b12fcb0c1436709a77a8dd0'] = 'Ajouter la nouvelle configuration'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd3acd810b479275ce68d69e78ed7a95'] = 'Tout ajouter (vous risquez de perdre votre configuration actuelle)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_332efbbfb2c4bd5a37fd7a55659b821a'] = 'Ne rien changer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Suivant'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5138a89d1b730dacf446855e15c24496'] = 'Vous êtes sur le point d\'installer les thèmes suivants'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f364da141450380ae79d7a45528f4c06'] = 'Ce thème est pour Prestashop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac85d9784348dc8f0c2db93f4a095eb0'] = 'Attention : un thème avec le même nom de dossier existe déjà'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8f3ea15c5b87db00561ccde5067310a5'] = 'pour Prestashop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_caeedb303068f9915e8e5ce091c9c02f'] = '(Attention : un dossier avec le même nom existe déjà)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2dd99d7426b4fe6dd04d7a98f5e32a62'] = 'Choisissez la déclinaison que vous souhaitez importer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f956917da1716add289f33a8869b85d4'] = 'Thème principal'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1e3de51d693cd0c7e903bcf3769a0cdb'] = 'Décochez ce champs si vous ne souhaitez pas installer le thème principal'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c49fbf2b822fd14929fd1fd76cdb0c96'] = 'Sélectionnez les variations que vous souhaitez importer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d1baba351b02042982a133c4df5d4924'] = 'Exporter un thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5092965125a28a17f49ee460fbc1f62c'] = 'Selectionner un thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0557cae4cf5b379e665910d701210f69'] = 'Exporter ce thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7961c4434751797a383d52d647e044d6'] = 'Importer à partir de l\'ordinateur'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bc52857ec49d8de10e55171f5bbc7f2a'] = 'Fichier de l\'archive'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_24ad8bfdfce09842a83f10d59a8ef01f'] = 'Où se trouve votre fichier zip?'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dec0faa6eb19bd9120d12c5a876bd1cf'] = 'Importer à partir du web'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a33388a338ee2b199d66112369279558'] = 'URL de l\'archive'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_cd8d9cc19984ccf9d314eee5eebfc2cc'] = 'Importer à partir du FTP'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_94f2371003860a92b12bf4c66b2851ac'] = 'Selectionnez l\'archive'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1031371f906a92891140f384d04b3421'] = 'Une erreur est survenue durant la génération de l\'archive'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2c19b34eebed37ccc288c518006615b3'] = 'Il y a une erreur de syntaxe dans le champ \"email\"!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_129b7dae66f0029381da64578a351198'] = 'Il y a une erreur de syntaxe dans le champ \"url\"!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_87e0eaf3f9614cb904fafb0d4f4c1f56'] = 'L\'extension du fichier doit être .txt ou .pdf'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_550a06d4fd147c22a4c921036003abf6'] = 'Une erreur est survenue durant l\'envoi de la documentation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ecd8e7704f6f4f730f6a43bfb24a9546'] = 'Veuillez entrer un nom de documentation valide'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_623e4ca0275c19c3134b7290fdd19264'] = 'Veuillez entrer un nom d\'auteur valide'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a43f1054076c2389afd746ec3d5d1c71'] = 'Veuillez entrer un nom de thème valide'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_03d105aa95f842fc54b18ca8a73109ca'] = 'Veuillez entrer un nom de variation valide'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_9891d2e13ad8b753833055c5809a733e'] = 'Erreur de syntaxe dans le champ version. Seuls les nombres et les points sont autorisés et la compatibilité doit être croissante ou égale.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd88d85745bba1abfa65cef79472da6a'] = 'Erreur de syntaxe dans le champ version. Seuls les nombres et les points sont autorisés et la compatibilité doit être croissante ou égale.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bf17ac149e2e7a530c677e9bd51d3fd2'] = 'Modules'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_714af595b1403ed23ff51f27e863c9a2'] = 'Sélectionnez les modules que vous souhaitez exporter'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a517747c3d12f99244ae598910d979c5'] = 'Auteur'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_15bbb9d0bbf25e8d2978de1168c749dc'] = 'Site Web'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d721757161f7f70c5b0949fdb6ec2c30'] = 'Thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4f10e7d35bef4e7b48e76ee4bdeae24'] = 'Le nom de votre thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Description'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_742ec436610daf7b51a1ba94039adf78'] = 'Entrez une courte description de votre thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_34b6cd75171affba6957e308dcbd92be'] = 'Version'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7da6f328a4647adb2b96a01a6d7c05c4'] = 'La version de votre thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_333dfbe2bb5c64b140df4607935ec8be'] = 'Compatible à partir de'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e12167aa0a7698e6ebc92b4ce3909b53'] = 'Jusqu\'à'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a82cac3db0465cfc701f3765fd880019'] = 'Ajouter une documentation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_08e27f4e5511f4f6aa73557e6ad6df48'] = 'Donnez un peu d\'aide à l\'utilisateur. Ajoutez un champs en cliquant ici'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a508df4b049c5b044cb4568b76b6c7e6'] = 'Ajouter une variation'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_626bd6acdcd835a5d064ef6358124b6c'] = 'Selectionnez un autre thème à inclure et sa compatibilité'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac70412e939d72a9234cdebb1af5867b'] = 'Chemin'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5da618e8e4b89c66fe86e32cdafde142'] = 'A partir de'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_3271e801d0a5db9dc2963a19ed9695d6'] = 'Choisissez un thème'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ea4788705e6873b424c65e91c2846b19'] = 'Annuler'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_abb381ee4077396e5d5d475b9022ba86'] = 'Générer l\'archive maintenant!'; diff --git a/modules/themeinstallator/it.php b/modules/themeinstallator/it.php new file mode 100644 index 000000000..c8390a510 --- /dev/null +++ b/modules/themeinstallator/it.php @@ -0,0 +1,89 @@ +themeinstallator_fff01a1de50e0559f82501a927654d1b'] = 'Import / export di un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_83ebbd7865677d356ffde5ad7e12784f'] = 'Esportare o installare un tema ed i suoi moduli per il tuo negozio'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_25b9e1d82d8200d70be2b22a1a283957'] = 'Errore durante il caricamento del file.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_050991b5b76aad0be75563b7cb93a33e'] = 'Solo i file zip sono ammessi'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_57c1ed81b02e5d3361323c7930897295'] = 'Errore durante la copia dei file.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5fd13c2b89a6eaaa4614bfe258f6c40f'] = 'file Zip sembra essere rotto'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dea6caeb83e5c11d3678284e64ebed8'] = 'Errore durante il download di file'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c186217583219f4cd040d9ee8d388ffb'] = 'Errore durante l\'estrazione zip'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0210b6456cdccad569cb56026bb0f689'] = 'Cattivo file di configurazione '; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5b6cf869265c13af8566f192b4ab3d2a'] = 'Documentazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_6bdbe5a8a9f446d4d758ee4c22648771'] = 'Si consiglia di consultare la documentazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7348fd57bfb5c837fc57e54fcfeeed9e'] = 'Fai clic destro sul nome e scegli \"Salva collegamento come\"'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b857ef1f431c5f3290dc5b5e644826a6'] = 'I seguenti moduli sono stati installati'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_22c765d777eb4ca6b4292bcbb596872e'] = 'I seguenti moduli sono stati disabilitati'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e501dc865768ac08d49c129a23c3ae09'] = 'I seguenti moduli sono stati abilitati'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0dfbf4744524c8573235d60589d8b66e'] = 'Le immagini sono state correttamente aggiornate nel database'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd1f775e443ff3b9a89270713580a51b'] = 'Precedente'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a20ddccbb6f808ec42cd66323e6c6061'] = 'Fine'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_33167fe8de7517798cf2e95c7680d6a4'] = 'I temi seguenti sono stati importati con successo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4ef3a40f287dd9849004a7f5af73f00'] = 'Attenzione: esiste già un modulo con lo stesso nome '; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_df8703a4066393da85e8188261660717'] = 'Seleziona i moduli del tema che desideri installare'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7651cc4a979c5e21ee50de988ce574b0'] = 'Moduli di configurazione originali'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8ab378b3ad05e14cbe61bff60c50afa6'] = 'configurazione attuale'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f94545e00cff9d0395194458b2245702'] = 'configurazione del tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_130c5b3473c57faa76e2a1c54e26f88e'] = 'Entrambi'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c90ba3aaed0a2bafed18233111062cf0'] = 'configurazione immagini tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2a84d9915b12fcb0c1436709a77a8dd0'] = 'Aggiungi nuova configurazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd3acd810b479275ce68d69e78ed7a95'] = 'Aggiungi tutti (rischi di perdere la tua attuale configurazione)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_332efbbfb2c4bd5a37fd7a55659b821a'] = 'Non cambiare nulla'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_10ac3d04253ef7e1ddc73e6091c0cd55'] = 'Successivo'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5138a89d1b730dacf446855e15c24496'] = 'Stai per installare il seguente tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f364da141450380ae79d7a45528f4c06'] = 'Questo tema è per Prestashop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac85d9784348dc8f0c2db93f4a095eb0'] = 'Attenzione: Hai già un tema con il nome della stessa cartella di'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_8f3ea15c5b87db00561ccde5067310a5'] = 'per Prestashop'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_caeedb303068f9915e8e5ce091c9c02f'] = '(Attenzione: una cartella con lo stesso nome esiste già)'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2dd99d7426b4fe6dd04d7a98f5e32a62'] = 'Scegli le variazioni che si desidera importare'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f956917da1716add289f33a8869b85d4'] = 'Tema principale'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1e3de51d693cd0c7e903bcf3769a0cdb'] = 'Deseleziona questo campo se non desideri installare il tema principale'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_c49fbf2b822fd14929fd1fd76cdb0c96'] = 'Seleziona le variazioni che si desidera importare'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d1baba351b02042982a133c4df5d4924'] = 'Esporta un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5092965125a28a17f49ee460fbc1f62c'] = 'Seleziona un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_0557cae4cf5b379e665910d701210f69'] = 'Esporta questo tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7961c4434751797a383d52d647e044d6'] = 'Importa dal computer'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bc52857ec49d8de10e55171f5bbc7f2a'] = 'Archivio File'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_24ad8bfdfce09842a83f10d59a8ef01f'] = 'Dove si trova il file zip?'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dec0faa6eb19bd9120d12c5a876bd1cf'] = 'Importare dal web'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a33388a338ee2b199d66112369279558'] = 'Archivio URL '; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_cd8d9cc19984ccf9d314eee5eebfc2cc'] = 'Importa da FTP'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_94f2371003860a92b12bf4c66b2851ac'] = 'Seleziona archivio'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_1031371f906a92891140f384d04b3421'] = 'Errore durante la generazione di archivio'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_2c19b34eebed37ccc288c518006615b3'] = 'C\'è un errore nella tua sintassi e-mail!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_129b7dae66f0029381da64578a351198'] = 'C\'è un errore di sintassi URL!'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_87e0eaf3f9614cb904fafb0d4f4c1f56'] = 'File di estensione deve essere. Txt o. Pdf'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_550a06d4fd147c22a4c921036003abf6'] = 'È verificato un errore durante il caricamento di documentazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ecd8e7704f6f4f730f6a43bfb24a9546'] = 'Si prega di inserire un nome valido documentazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_623e4ca0275c19c3134b7290fdd19264'] = 'Si prega di inserire un nome valido autore'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a43f1054076c2389afd746ec3d5d1c71'] = 'Si prega di inserire un nome valido tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_03d105aa95f842fc54b18ca8a73109ca'] = 'Si prega di inserire un nome valido variazione tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_9891d2e13ad8b753833055c5809a733e'] = 'Errore di sintassi sul campo della versione. Solo cifre e punti sono ammessi e la compatibilità dovrebbe essere crescente o uguale.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_dd88d85745bba1abfa65cef79472da6a'] = 'Errore di sintassi sulla versione. Solo cifre e punti sono ammessi e compatibilità dovrebbe essere in aumento o pari.'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_bf17ac149e2e7a530c677e9bd51d3fd2'] = 'Moduli'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_714af595b1403ed23ff51f27e863c9a2'] = 'Selezionare i moduli che si desidera esportare'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a517747c3d12f99244ae598910d979c5'] = 'Autore'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_15bbb9d0bbf25e8d2978de1168c749dc'] = 'Sito'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_d721757161f7f70c5b0949fdb6ec2c30'] = 'Tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_f4f10e7d35bef4e7b48e76ee4bdeae24'] = 'Il nome del tuo tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Descrizione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_742ec436610daf7b51a1ba94039adf78'] = 'Inserisci una breve descrizione del tuo tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_34b6cd75171affba6957e308dcbd92be'] = 'Versione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_7da6f328a4647adb2b96a01a6d7c05c4'] = 'Versione del tuo tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_333dfbe2bb5c64b140df4607935ec8be'] = 'Compatibile dal'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_e12167aa0a7698e6ebc92b4ce3909b53'] = 'Per'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a82cac3db0465cfc701f3765fd880019'] = 'Aggiungi documentazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_08e27f4e5511f4f6aa73557e6ad6df48'] = 'Aiuta l\'utente. Aggiungi un campo cliccando qui'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_a508df4b049c5b044cb4568b76b6c7e6'] = 'Aggiungi variazione'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_626bd6acdcd835a5d064ef6358124b6c'] = 'Seleziona un altro tema da includere altri e la sua compatibilità'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ac70412e939d72a9234cdebb1af5867b'] = 'Percorso'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_5da618e8e4b89c66fe86e32cdafde142'] = 'Da'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_3271e801d0a5db9dc2963a19ed9695d6'] = 'Scegli un tema'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_ea4788705e6873b424c65e91c2846b19'] = 'Annulla'; +$_MODULE['<{themeinstallator}prestashop>themeinstallator_abb381ee4077396e5d5d475b9022ba86'] = 'Genera l\'archivio ora!'; + +?> \ No newline at end of file diff --git a/modules/themeinstallator/logo.gif b/modules/themeinstallator/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..13a9cf6516a019779c1b3c6d0c9db3e7d6ddce7e GIT binary patch literal 963 zcmZ?wbhEHb6krfw_|59j*z6YFu*8t;d994hTUS~cTX^_1Jy^DkDkKaS~o z7T@tbsQXi7@280VFHt=Ylcv4Snf;)2+Rv=z|0`GisP1lRZ)~10bw>O2iIb<#Uedj> zY5tlCvllO0y>9NprAwACS-*M5?hU*4?A*0~{i*|-)*tFW+&KSg1L>y9tjeq{I7 z+iSMoS-b1X?ydjZ_kEbY|NpYx#}6Mmy!+s(?HB&D~LEzrVhH{prnz&u{*G zc=Pwu|4;w^eft0J*Z)8N|Nj3E4%$&-u!n%+PZmZ7hW`vYAcunT1OvwchX0&09vc=o zHmbSFn0PpGaf@=ZFI&;5?A59*XslBx= +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function addVariation(id_variation) +{ + var idRow = $('#variation_table tr').length + 1; + var newRow = ''; + newRow += ''+writeName+''; + newRow += ''; + newRow += ''; + newRow += ''+compafrom+''; + newRow += ''; + newRow += ''+compato+''; + newRow += ''; + + if ($('#variation_table tr').length > 0) + $('#variation_table tr:last').after(newRow); + else + $('#variation_table').html(newRow); + + $('#myvar_'+idRow).after(' delete'); + +} + +function removeVariation(id) +{ + + $('#myvar_'+id).val(-1); + $('#myvar_tr_'+id).hide(); + +} + +/* +** -------------------------------------------- +*/ + +function addDocumentation(id_variation) +{ + var idRow = $('#documentation_table tr').length + 1; + var newRow = ''; + newRow += ''+writeName+''; + newRow += ''; + newRow += ''+path+''; + + newRow += ''; + + if ($('#documentation_table tr').length > 0) + $('#documentation_table tr:last').after(newRow); + else + $('#documentation_table').html(newRow); + + $('#mydoc_'+idRow).after(' delete'); + +} + +function removeDocumentation(id) +{ + $('#mydoc_'+id).parent().html(''); + $('#mydoc_tr_'+id).hide(); +} + +$('document').ready(function() +{ + if (themes.length > 0) + { + var count = 0; + while (themes_id[count] != null && count < 10) + addVariation(themes_id[count++]); + } + else + addVariation(0); + addDocumentation(0); +}); \ No newline at end of file diff --git a/modules/themeinstallator/themeinstallator.php b/modules/themeinstallator/themeinstallator.php new file mode 100644 index 000000000..5590cd199 --- /dev/null +++ b/modules/themeinstallator/themeinstallator.php @@ -0,0 +1,1275 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7451 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class ThemeInstallator extends Module +{ + /* + ** Modules + */ + private $to_install = array(); + private $to_enable = array(); + private $to_disable = array(); + private $to_export = array(); + + /* + ** index + */ + private $page; + + /* + ** Config File + */ + private $xml; + + public function __construct() + { + $this->name = 'themeinstallator'; + $this->version = '1.4'; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + if (version_compare(_PS_VERSION_, 1.4) >= 0) + $this->tab = 'administration'; + else + $this->tab = 'Theme'; + parent::__construct(); + $this->displayName = $this->l('Import/export a theme'); + $this->description = $this->l('Export or Install a theme and its modules on your shop.'); + } + + private function getTheNativeModules() + { + $xml = @simplexml_load_string(file_get_contents('http://www.prestashop.com/xml/modules_list.xml')); + $natives = array(); + if ($xml) + foreach ($xml->modules as $row) + foreach ($row->module as $row2) + $natives[] = (string)$row2['name']; + + if (count($natives > 0)) + return $natives; + // use this list if we can't contact the prestashop.com server + $natives = array('bankwire', 'birthdaypresent', 'blockadvertising', 'blockbestsellers', 'blockcart', 'blockcategories', + 'blockcurrencies', 'blockinfos', 'blocklanguages', 'blocklink', 'blockmanufacturer', 'blockmyaccount', 'blocknewproducts', + 'blocknewsletter', 'blockpaymentlogo', 'blockpermanentlinks', 'blockrss', 'blocksearch', 'blockspecials', 'blocksupplier', + 'blocktags', 'blockuserinfo', 'blockvariouslinks', 'blockviewed', 'blockwishlist', 'canonicalurl', 'cashondelivery', 'cheque', + 'crossselling', 'dejala', 'editorial', 'feeder', 'followup', 'gadsense', 'ganalytics', 'gcheckout', 'graphartichow', 'graphgooglechart', + 'graphvisifire', 'graphxmlswfcharts', 'gridhtml', 'gsitemap', 'hipay', 'homefeatured', 'loyalty', 'mailalerts', 'moneybookers', + 'newsletter', 'pagesnotfound', 'paypal', 'paypalapi', 'productcomments', 'productscategory', 'producttooltip', 'referralprogram', 'reverso', + 'sekeywords', 'sendtoafriend', 'statsbestcategories', 'statsbestcustomers', 'statsbestproducts', 'statsbestsuppliers', 'statsbestvouchers', + 'statscarrier', 'statscatalog', 'statscheckup', 'statsdata', 'statsequipment', 'statsgeolocation', 'statshome', 'statslive', 'statsnewsletter', + 'statsorigin', 'statspersonalinfos', 'statsproduct', 'statsregistrations', 'statssales', 'statssearch', 'themeinstallator', 'statsvisits', 'tm4b', + 'trackingfront', 'watermark'); + return $natives; + } + + private function deleteDirectory($dirname) + { + self::cleanDirectory($dirname); + rmdir($dirname); + } + private function cleanDirectory($dirname) + { + $files = scandir($dirname); + foreach ($files as $file) + if ($file != '.' AND $file != '..' AND $file != '.svn') + { + if (is_dir($dirname.'/'.$file)) + self::deleteDirectory($dirname.'/'.$file); + elseif (file_exists($dirname.'/'.$file)) + unlink($dirname.'/'.$file); + } + } + + private function recurseCopy($src, $dst) + { + if (!$dir = opendir($src)) + return; + if (!file_exists($dst)) + mkdir($dst); + while(($file = readdir($dir)) !== false) + if (strncmp($file, '.', 1) != 0) + { + if (is_dir($src.'/'.$file)) + self::recurseCopy($src.'/'.$file, $dst.'/'.$file); + else if (is_readable($src.'/'.$file) AND $file != 'Thumbs.db' AND $file != '.DS_Store' AND substr($file, -1) != '~') + copy($src.'/'.$file, $dst.'/'.$file); + } + closedir($dir); + } + + /* + ** Checks if module is installed + ** Returns true if module is active + ** Also returns false if it's a payment or stat module + */ + private function checkParentClass($name) + { + if (!$obj = Module::getInstanceByName($name)) + return false; + if (is_callable(array($obj, 'validateOrder'))) + return false; + if (is_callable(array($obj, 'getDateBetween'))) + return false; + if (is_callable(array($obj, 'getGridEngines'))) + return false; + if (is_callable(array($obj, 'getGraphEngines'))) + return false; + if (is_callable(array($obj, 'hookAdminStatsModules'))) + return false; + else + return true; + return false; + } + + private function deleteTmpFiles() + { + self::cleanDirectory(_IMPORT_FOLDER_); + if (file_exists(_EXPORT_FOLDER_.'archive.zip')) + unlink(_EXPORT_FOLDER_.'archive.zip'); + } + + private function init_defines() + { + global $currentIndex, $cookie; + + define('_EXPORT_FOLDER_', dirname(__FILE__).'/export/'); + define('_IMPORT_FOLDER_', dirname(__FILE__).'/import/'); + $this->page = 1; + if (!file_exists(_EXPORT_FOLDER_) OR !is_dir(_EXPORT_FOLDER_)) + mkdir(_EXPORT_FOLDER_, 0777); + if (!file_exists(_IMPORT_FOLDER_) OR !is_dir(_IMPORT_FOLDER_)) + mkdir(_IMPORT_FOLDER_, 0777); + + if (!Tools::isSubmit('cancelExport') AND (Tools::isSubmit('exportTheme') OR Tools::isSubmit('submitExport'))) + $this->page = 'exportPage'; + $this->_html = '
    '; + + if (Tools::isSubmit('modulesToExport') OR Tools::isSubmit('submitModules')) + $this->to_export = Tools::getValue('modulesToExport'); + if (Tools::isSubmit('submitThemes')) + $this->selectedVariations = Tools::getValue('variation'); + $_POST = @array_map('trim', $_POST); + define('DEFAULT_COMPATIBILITY_FROM', '1.0.0.0'); + define('DEFAULT_COMPATIBILITY_TO', _PS_VERSION_); + define('DEFAULT_T_VER', '1.0'); + define('MAX_NAME_LENGTH', 32); + define('MAX_EMAIL_LENGTH', 128); + define('MAX_WEBSITE_LENGTH', 64); + define('MAX_DESCRIPTION_LENGTH', 64); + define('MAX_T_VER_LENGTH', 3); + define('MAX_COMPATIBILITY_VER', 7); + define('ARCHIVE_NAME', _IMPORT_FOLDER_.'uploaded.zip'); + define('XMLFILENAME', 'Config.xml'); + + $this->_msg = ''; + $this->to_enable = false; + $this->to_disable = false; + $this->to_install = false; + $this->errors = false; + if ($this->page == 'exportPage' AND Tools::isSubmit('exportTheme') AND ($theme = Tools::getValue('mainTheme'))) + if (!(is_dir(_PS_ALL_THEMES_DIR_.$theme) AND file_exists(_PS_ALL_THEMES_DIR_.$theme.'/index.tpl') AND $theme != 'prestashop')) + { + $this->page = 1; + echo parent::displayError(''.$theme.' is not a valid theme to export'); + } + } + + private function handleInformations() + { + if (Tools::isSubmit('submitImport1')) + { + if ($_FILES['themearchive']['error'] OR !file_exists($_FILES['themearchive']['tmp_name'])) + $this->errors .= parent::displayError($this->l('An error has occurred during the file upload.')); + else if (substr($_FILES['themearchive']['name'], -4) != '.zip') + $this->errors .= parent::displayError($this->l('Only zip files are allowed')); + else if (!rename($_FILES['themearchive']['tmp_name'], ARCHIVE_NAME)) + $this->errors .= parent::displayError($this->l('An error has occurred during the file copy.')); + elseif (Tools::ZipTest(ARCHIVE_NAME)) + $this->page = 2; + else + $this->errors .= parent::displayError($this->l('Zip file seems to be broken')); + } + else if (Tools::isSubmit('submitImport2')) + { + if (!Validate::isModuleUrl($url = Tools::getValue('linkurl'), $this->errors)) + $this->errors .= parent::displayError($this->l('Only zip files are allowed')); + else if (!copy($url, ARCHIVE_NAME)) + $this->errors .= parent::displayError($this->l('Error during the file download')); + elseif (Tools::ZipTest(ARCHIVE_NAME)) + $this->errors .= parent::displayError($this->l('Zip file seems to be broken')); + else + $this->page = 2; + } + else if (Tools::isSubmit('submitImport3')) + { + $filename = _IMPORT_FOLDER_.Tools::getValue('ArchiveName'); + if (substr($filename, -4) != '.zip') + $this->errors .= parent::displayError($this->l('Only zip files are allowed')); + else if (!copy($filename, ARCHIVE_NAME)) + $this->errors .= parent::displayError($this->l('An error has occurred during the file copy.')); + elseif (Tools::ZipTest(ARCHIVE_NAME)) + $this->page = 2; + else + $this->errors .= parent::displayError($this->l('Zip file seems to be broken')); + } + else if (Tools::isSubmit('prevThemes')) + $this->page = 2; + else if (Tools::isSubmit('submitThemes')) + $this->page = 3; + else if (Tools::isSubmit('submitModules')) + $this->page = 4; + if ($this->page == 2 AND file_exists(ARCHIVE_NAME)) + { + if (!Tools::ZipExtract(ARCHIVE_NAME, _IMPORT_FOLDER_)) + { + $this->errors .= parent::displayError($this->l('Error during zip extraction')); + $this->page = 1; + } + } + if (file_exists(ARCHIVE_NAME)) + unlink(ARCHIVE_NAME); + if ($this->page != 1) + { + if (!self::checkXmlFields()) + { + $this->errors .= parent::displayError($this->l('Bad configuration file')); + $this->page = 1; + } + else + return ; + } + self::deleteTmpFiles(); + } + + private function checkXmlFields() + { + if (!file_exists(_IMPORT_FOLDER_.XMLFILENAME) OR !$xml = simplexml_load_file(_IMPORT_FOLDER_.XMLFILENAME)) + return false; + if (!$xml['version'] OR !$xml['name']) + return false; + foreach ($xml->variations->variation as $val) + if (!$val['name'] OR !$val['directory'] OR !$val['from'] OR !$val['to']) + return false; + foreach ($xml->modules->module as $val) + if (!$val['action'] OR !$val['name']) + return false; + foreach ($xml->modules->hooks->hook as $val) + if (!$val['module'] OR !$val['hook'] OR !$val['position']) + return false; + return true; + } + + public function getContentExport() + { + $this->theme_list = scandir(_PS_ALL_THEMES_DIR_); + $this->error = false; + + self::getModuleState(); + self::displayInformations(); + if (Tools::isSubmit('submitExport') AND $this->error === false AND $this->checkPostedDatas() == true) + { + self::getThemeVariations(); + self::getDocumentation(); + self::getHookState(); + self::getImageState(); + self::generateXML(); + self::generateArchive(); + } + self::AuthorInformationForm(); + self::ModulesInformationForm(); + self::ThemeInformationForm(); + self::DocInformationForm(); + self::VariationInformationForm(); + return $this->_html; + } + + /* + ** Main function + */ + public function getContent() + { + self::init_defines(); + if (!Tools::isSubmit('cancelExport') AND $this->page == 'exportPage') + return self::getContentExport(); + self::handleInformations(); + switch ($this->page) + { + case 1: + self::_displayForm1(); + break; + case 2: + self::_displayForm2(); + break; + case 3: + self::_displayForm3(); + break; + case 4: + self::_displayForm4(); + break; + } + return $this->errors.$this->_msg.$this->_html; + } + + /* + ** Checker si le dossier doc existe : Si oui appeler la fonction ! + */ + private function _loadDocForm() + { + $docname = array(); + $docpath = array(); + + foreach ($this->xml->docs->doc as $row) + { + $docname[] = strval($row['name']); + $docpath[] = strval($row['path']); + } + $doc = ' +
    + '.$this->l('Documentation').' + +
    +
      '; + $i = 0; + foreach ($docname as $row) + $doc .= '
    • '.$row.''; + $doc .= ' +
    +

    '.$this->l('Right click on the name and choose "save link as"').' +

    +
    +

     

    '; + $this->_html .= $doc; + } + + private function getModules() + { + $this->native_modules = self::getTheNativeModules(); + foreach ($this->xml->modules->module as $row) + { + if (strval($row['action']) == 'install' AND !in_array(strval($row['name']), $this->native_modules)) + $this->to_install[] = strval($row['name']); + else if (strval($row['action']) == 'enable') + $this->to_enable[] = strval($row['name']); + else if (strval($row['action']) == 'disable') + $this->to_disable[] = strval($row['name']); + } + } + + private function updateImages() + { + foreach ($this->xml->images->image as $row) + { + $foo = Db::getInstance()->getRow(' + SELECT name FROM `'._DB_PREFIX_.'image_type` i + WHERE i.name LIKE \''.pSQL($row['name']).'\''); + if ((int)(Tools::getValue('imagesConfig')) == 1 AND $foo) + continue ; + if ($foo) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'image_type` i + SET `width` = '.(int)($row['width']).', + `height` = '.(int)($row['height']).', + `products` = '.($row['products'] == 'true' ? 1 : 0).', + `categories` = '.($row['categories'] == 'true' ? 1 : 0).', + `manufacturers` = '.($row['manufacturers'] == 'true' ? 1 : 0).', + `suppliers` = '.($row['suppliers'] == 'true' ? 1 : 0).', + `scenes` = '.($row['scenes'] == 'true' ? 1 : 0).' + WHERE i.name LIKE \''.pSQL($row['name']).'\''); + else + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'image_type` (`name`, `width`, `height`, `products`, `categories`, `manufacturers`, `suppliers`, `scenes`) + VALUES ( + \''.pSQL($row['name']).'\', + '.(int)($row['width']).', + '.(int)($row['height']).', + '.($row['products'] == 'true' ? 1 : 0).', + '.($row['categories'] == 'true' ? 1 : 0).', + '.($row['manufacturers'] == 'true' ? 1 : 0).', + '.($row['suppliers'] == 'true' ? 1 : 0).', + '.($row['scenes'] == 'true' ? 1 : 0).')'); + } + return true; + } + + private function _displayForm4() + { + $xml = simplexml_load_file(_IMPORT_FOLDER_.XMLFILENAME); + $this->xml = $xml; + self::getModules(); + $hook = array(); + $hookedModule = array(); + $position = array(); + $msg = ''; + + foreach ($this->xml->modules->hooks->hook as $row) + { + $hookedModule[] = strval($row['module']); + $hook[] = strval($row['hook']); + $position[] = strval($row['position']); + $exceptions[] = (isset($row['exceptions']) ? explode(',', strval($row['exceptions'])) : array()); + } + + if (file_exists(_IMPORT_FOLDER_.'doc') AND sizeof($xml->docs->doc) != 0) + self::_loadDocForm(); + // install selected modules + $flag = 0; + if (isset($this->to_export) AND $this->to_export) + foreach ($this->to_export as $row) + { + if (in_array($row, $this->native_modules)) + continue; + if ($flag++ == 0) + $msg .= ''.$this->l('The following modules have been installed').' :
    '; + self::recurseCopy(_IMPORT_FOLDER_.'modules/'.$row, _PS_ROOT_DIR_.'/modules/'.$row); + $obj = Module::getInstanceByName($row); + if (Validate::isLoadedObject($obj)) + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'module` + SET `active`= 1 + WHERE `name` = \''.pSQL($row).'\''); + else if (!$obj OR !$obj->install()) + continue; + Db::getInstance()->Execute('INSERT IGNORE INTO '._DB_PREFIX_.'module_shop (id_module, id_shop) VALUES('.(int)$obj->id.', '.(int)Shop::getCurrentShop().')'); + $msg .= '- '.pSQL($row).'
    '; + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.pSQL($obj->id).' AND id_shop='.(int)Shop::getCurrentShop()); + $count = -1; + while (isset($hookedModule[++$count])) + if ($hookedModule[$count] == $row) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook_module` (`id_module`, `id_shop`, `id_hook`, `position`) + VALUES ('.(int)$obj->id.', '.(int)Shop::getCurrentShop().', '.(int)Hook::get($hook[$count]).', '.(int)$position[$count].')'); + } + if (($val = (int)(Tools::getValue('nativeModules'))) != 1) + { + $flag = 0; + // Disable native modules + if ($val == 2 AND $this->to_disable AND count($this->to_disable)) + foreach ($this->to_disable as $row) + { + $obj = Module::getInstanceByName($row); + if (Validate::isLoadedObject($obj)) + { + if ($flag++ == 0) + $msg .= ''.$this->l('The following modules have been disabled').' :
    '; + $msg .= '- '.pSQL($row).'
    '; + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'module_shop` + WHERE `id_module` = '.pSQL($obj->id).' AND id_shop='.(int)Shop::getCurrentShop(true)); + } + } + $flag = 0; + if ($this->to_enable AND count($this->to_enable)) + foreach ($this->to_enable as $row) + { + $obj = Module::getInstanceByName($row); + if (Validate::isLoadedObject($obj)) + { + Db::getInstance()->Execute(' + UPDATE `'._DB_PREFIX_.'module` + SET `active`= 1 + WHERE `name` = \''.pSQL($row).'\''); + Db::getInstance()->Execute('INSERT IGNORE INTO '._DB_PREFIX_.'module_shop (id_module, id_shop) VALUES('.(int)$obj->id.', '.(int)Shop::getCurrentShop(true).')'); + } + else if (!is_object($obj) OR !$obj->install()) + continue ; + if ($flag++ == 0) + $msg .= ''.$this->l('The following modules have been enabled').' :
    '; + $msg .= '- '.pSQL($row).'
    '; + Db::getInstance()->Execute(' + DELETE FROM `'._DB_PREFIX_.'hook_module` + WHERE `id_module` = '.pSQL($obj->id).' AND id_shop='.(int)Shop::getCurrentShop(true)); + $count = -1; + while (isset($hookedModule[++$count])) + if ($hookedModule[$count] == $row) + { + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook_module` (`id_module`, `id_shop`, `id_hook`, `position`) + VALUES ('.(int)$obj->id.', '.(int)Shop::getCurrentShop(true).', '.(int)Hook::get($hook[$count]).', '.(int)$position[$count].')'); + foreach ($exceptions[$count] as $filename) + if (!empty($filename)) + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'hook_module_exceptions` (`id_module`, id_shop, `id_hook`, `file_name`) + VALUES ('.(int)$obj->id.', '.(int)Shop::getCurrentShop(true).', '.(int)Hook::get($hook[$count]).', "'.pSQL($filename).'")'); + } + } + } + if ((int)(Tools::getValue('imagesConfig')) != 3 AND self::updateImages()) + $msg .= '
    '.$this->l('Images have been correctly updated in database').'
    '; + + $this->_msg .= parent::displayConfirmation($msg); + $this->_html .= ' + + +
    '; + + } + + private function _displayForm3() + { + $xml = simplexml_load_file(_IMPORT_FOLDER_.XMLFILENAME); + $this->xml = $xml; + + if ($this->selectedVariations AND count($this->selectedVariations) > 0) + { + $ok = array(); + foreach ($this->selectedVariations as $count => $theme) + { + if ($theme == 'prestashop') + continue; + self::recurseCopy(_IMPORT_FOLDER_.'themes/'.$theme, _PS_ALL_THEMES_DIR_.$theme); + if (file_exists(_PS_ALL_THEMES_DIR_.$theme)) + $ok[] = $theme; + } + if (sizeof($ok) > 0) + { + $msg = $this->l('The following themes were successfully imported').':
      '; + foreach ($ok as $row) + $msg .= '
    • '.$row; + $msg .= '
    '; + $this->_msg = parent::displayConfirmation($msg); + } + } + self::getModules(); + if (file_exists(_IMPORT_FOLDER_.'doc') AND sizeof($xml->docs->doc) != 0) + self::_loadDocForm(); + $this->_html .= '
    '; + if ($this->to_install AND sizeof($this->to_install) > 0) + { + $var = ''; + foreach ($this->to_install as $row) + if (file_exists(_IMPORT_FOLDER_.'modules/'.$row)) + $var .= '
    '; + + if ($var != '') + $this->_html .= ' +
    + '.$this->l('Select the theme\'s modules you wish to install').' +

    '.$var.'

    +
    +

     

    '; + } + $this->_html .= ' +
    + '.$this->l('Native modules configuration').' +
      +
    • +
    • +
    • +
    +
    +

     

    '; + $this->_html .= ' +
    + '.$this->l('Theme images configuration').' +
      +
    • +
    • +
    • +
    +
    '; + $this->_html .= ' +

     

    + + +
    + '; + } + + private function _displayForm2() + { + global $cookie; + + $iso = Language::getIsoById((int)($cookie->id_lang)); + $xml = simplexml_load_file(_IMPORT_FOLDER_.XMLFILENAME); + $this->xml = $xml; + $res = $xml->xpath('/theme/descriptions/description[@iso="'.$iso.'"]'); + $description = (isset($res[0]) ? (string)$res[0] : ''); + + $this->_msg = parent::displayConfirmation( + $this->l('You are going to install the following theme').' :
    '. + $xml['name'].' v'.$xml['version'].'
    '. + (strlen($description) ? ''.$description.'
    ' : ''). + $this->l('This theme is for Prestashop').' v'. + $xml->variations->variation[0]['from']. + ' -> v'.$xml->variations->variation[0]['to'].'
    '. + (file_exists(_PS_ALL_THEMES_DIR_.strval($xml->variations->variation[0]['directory'])) ? $this->l('Warning : You already have a theme with the same folder\'s name') : '').' +
    '); + if (file_exists(_IMPORT_FOLDER_.'doc') AND sizeof($xml->docs->doc) != 0) + self::_loadDocForm(); + if (sizeof($xml->variations->variation) > 1) + { + $count = 0; + $var = ''; + while ($xml->variations->variation[++$count]) + { + $foo = (file_exists(_PS_ALL_THEMES_DIR_.strval($xml->variations->variation[$count]['directory'])) ? 1 : 0); + $var .= '
    '; + } + $this->_html .= ' +
    + '.$this->l('Choose the variations that you wish to import').' + +
    + +

    '.$this->l('Uncheck this field if you do not want to install the main theme.').'

    +
    +

    '.$this->l('Select the variations you wish to import').'

    +

    '.$var.'

    + + +
    '; + } + else + $this->_html .= ' + + + +'; + $this->_html .= ''; + } + + private function _displayForm1() + { + $tmp = scandir(_PS_ALL_THEMES_DIR_); + $themeList = array(); + + foreach ($tmp as $row) + if (is_dir(_PS_ALL_THEMES_DIR_.$row) AND file_exists(_PS_ALL_THEMES_DIR_.$row.'/index.tpl') AND $row != 'prestashop') + $themeList[] = $row; + if (count($themeList) > 0) + { + $tmp = ''; + foreach ($themeList as $row) + $tmp .= ''; + $this->_html .= ' +
    + '.$this->l('Export a theme').' + +
    + +
    + +
    +
     
    '; + } + $this->_html .= ' +
    + '.$this->l('Import from your computer').' + + +
    + +

    '.$this->l('Where is your zip file?').'

    +
    + +
    +
     
    + '; + $this->_html .= ' +
    + '.$this->l('Import from the web').' + +
    + +
    + +
    +
     
    '; + + $tmp = scandir(_IMPORT_FOLDER_); + $list = array(); + foreach ($tmp as $row) + if (substr(_IMPORT_FOLDER_.$row, -4) == '.zip') + $list[] = $row; + $tmp = ''; + foreach ($list as $row) + $tmp .= ''; + $this->_html .= ' +
    + '.$this->l('Import from FTP').' + +
    + +
    + +
    +
     
    + '; + } +/* +** EXPORT FUNCTIONS ######################################## +*/ + + private function displayInformations() + { + $this->_html .= ''; + if ($this->error === false AND class_exists('ZipArchive', false) AND ($zip = new ZipArchive())) + { + if (!($zip->open(_EXPORT_FOLDER_.'archive.zip', ZipArchive::OVERWRITE) === true) OR !$zip->addEmptyDir('test') === true) + $this->_html .= parent::displayError('Permission denied. Please set permisssion to 666 on this folder: '._EXPORT_FOLDER_); + $zip->close(); + if ($this->error === false) + $this->_html .= parent::displayConfirmation('Fill this formular to export this theme: '.Tools::getValue('mainTheme').' in a ZIP file'); + } + } + + private function archiveThisFile($obj, $file, $serverPath, $archivePath) + { + if (is_dir($serverPath.$file)) + { + $dir = scandir($serverPath.$file); + foreach ($dir as $row) + if ($row != '.' AND $row != '..') + $this->archiveThisFile($obj, $row, $serverPath.$file.'/', $archivePath.$file.'/'); + } + else if (!$obj->addFile($serverPath.$file, $archivePath.$file)) + $this->error = true; + } + + /* + ** Generate Archive ! + */ + private function generateArchive() + { + $count = 0; + $zip = new ZipArchive(); + $zip_file_name = md5(time()).".zip"; + if ($zip->open(_EXPORT_FOLDER_.$zip_file_name, ZipArchive::OVERWRITE) === true) + { + if (!$zip->addFromString('Config.xml', $this->xmlFile)) + $this->error = true; + while (isset($_FILES['mydoc_'.++$count])) + { + if (!$_FILES['mydoc_'.$count]['name']) + continue; + if (!$zip->addFile($_FILES['mydoc_'.$count]['tmp_name'], 'doc/'.$_FILES['mydoc_'.$count]['name'])) + $this->error = true; + } + foreach ($this->variations as $row) + { + $array = explode('¤', $row); + $this->archiveThisFile($zip, $array[1], _PS_ALL_THEMES_DIR_, 'themes/'); + } + foreach ($this->to_export as $row) + if (!in_array($row, $this->native_modules)) + $this->archiveThisFile($zip, $row, dirname(__FILE__).'/../../modules/', 'modules/'); + $zip->close(); + if ($this->error === false) + { + ob_end_clean(); + header('Content-Type: multipart/x-zip'); + header('Content-Disposition:attachment;filename="'.$zip_file_name.'"'); + readfile(_EXPORT_FOLDER_.$zip_file_name); + unlink(_EXPORT_FOLDER_.$zip_file_name); + die ; + } + } + $this->_html .= parent::displayError($this->l('An error occurred during the archive generation')); + } + + /* + ** XML Generation, all vars should be GOOD at this point + */ + private function generateXML() + { + $theme = new SimpleXMLElement(''); + $theme->addAttribute('version', Tools::getValue('version')); + $theme->addAttribute('name', Tools::htmlentitiesUTF8(Tools::getValue('theme_name'))); + $author = $theme->addChild('author'); + $author->addAttribute('name', Tools::htmlentitiesUTF8(Tools::getValue('author_name'))); + $author->addAttribute('email', Tools::htmlentitiesUTF8(Tools::getValue('email'))); + $author->addAttribute('url', Tools::htmlentitiesUTF8(Tools::getValue('website'))); + + $descriptions = $theme->addChild('descriptions'); + $languages = Language::getLanguages(); + foreach ($languages as $language) + { + $val = Tools::htmlentitiesUTF8(Tools::getValue('body_title_'.$language['id_lang'])); + $description = $descriptions->addChild('description', Tools::htmlentitiesUTF8($val)); + $description->addAttribute('iso', $language['iso_code']); + } + + $variations = $theme->addChild('variations'); + foreach ($this->variations as $row) + { + $array = explode('¤', $row); + $variation = $variations->addChild('variation'); + $variation->addAttribute('name', Tools::htmlentitiesUTF8($array[0])); + $variation->addAttribute('directory', $array[1]); + $variation->addAttribute('from', $array[2]); + $variation->addAttribute('to', $array[3]); + } + + $docs = $theme->addChild('docs'); + if (isset($this->user_doc)) + foreach ($this->user_doc as $row) + { + $array = explode('¤', $row); + $doc = $docs->addChild('doc'); + $doc->addAttribute('name', $array[0]); + $doc->addAttribute('path', $array[1]); + } + + $modules = $theme->addChild('modules'); + if (isset($this->to_export)) + foreach ($this->to_export as $row) + if (!in_array($row, $this->native_modules)) + { + $module = $modules->addChild('module'); + $module->addAttribute('action', 'install'); + $module->addAttribute('name', $row); + } + foreach ($this->to_enable as $row) + { + $module = $modules->addChild('module'); + $module->addAttribute('action', 'enable'); + $module->addAttribute('name', $row); + } + foreach ($this->to_disable as $row) + { + $module = $modules->addChild('module'); + $module->addAttribute('action', 'disable'); + $module->addAttribute('name', $row); + } + + $hooks = $modules->addChild('hooks'); + foreach ($this->to_hook as $row) + { + $array = explode(';', $row); + $hook = $hooks->addChild('hook'); + $hook->addAttribute('module', $array[0]); + $hook->addAttribute('hook', $array[1]); + $hook->addAttribute('position', $array[2]); + if (!empty($array[3])) + $hook->addAttribute('exceptions', $array[3]); + } + + $images = $theme->addChild('images'); + foreach ($this->image_list as $row) + { + $array = explode(';', $row); + $image = $images->addChild('image'); + $image->addAttribute('name', Tools::htmlentitiesUTF8($array[0])); + $image->addAttribute('width', $array[1]); + $image->addAttribute('height', $array[2]); + $image->addAttribute('products', $array[3]); + $image->addAttribute('categories', $array[4]); + $image->addAttribute('manufacturers', $array[5]); + $image->addAttribute('suppliers', $array[6]); + $image->addAttribute('scenes', $array[7]); + } + $this->xmlFile = $theme->asXML(); + } + + /* + ** Init modules and Hooks + */ + private function _initList() + { + $this->native_modules = self::getTheNativeModules(); + $this->module_list = Db::getInstance()->ExecuteS('SELECT id_module, name, active FROM `'._DB_PREFIX_.'module`'); + $this->hook_list = Db::getInstance()->ExecuteS(' + SELECT a.id_hook, a.name as name_hook, c.position, c.id_module, d.name as name_module, GROUP_CONCAT(hme.file_name, ",") as exceptions + FROM `'._DB_PREFIX_.'hook` a + LEFT JOIN `'._DB_PREFIX_.'hook_module` c ON c.id_hook = a.id_hook + LEFT JOIN `'._DB_PREFIX_.'module` d ON c.id_module = d.id_module + LEFT OUTER JOIN `'._DB_PREFIX_.'hook_module_exceptions` hme ON (hme.id_module = c.id_module AND hme.id_hook = a.id_hook) + GROUP BY id_module, id_hook + ORDER BY name_module'); + foreach ($this->hook_list as &$row) + $row['exceptions'] = trim(preg_replace('/(,,+)/', ',', $row['exceptions']), ','); + + } + + /* + ** Fill module's vars + */ + private function getModuleState() + { + self::_initList(); + foreach ($this->module_list as $array) + { + if (!self::checkParentClass($array['name'])) + continue ; + if (in_array($array['name'], $this->native_modules)) + { + if ($array['active'] == 1) + $this->to_enable[] = $array['name']; + else + $this->to_disable[] = $array['name']; + } + else if ($array['active'] == 1) + $this->to_install[] = $array['name']; + } + foreach ($this->native_modules as $str) + { + $flag = 0; + if (!self::checkParentClass($str)) + continue ; + foreach ($this->module_list as $tmp) + if (in_array($str, $tmp)) + { + $flag = 1; + break; + } + if ($flag == 0) + $this->to_disable[] = $str; + } + } + + /* + ** Fill Hook Var + */ + private function getHookState() + { + foreach ($this->to_install as $string) + foreach ($this->hook_list as $tmp) + if ($tmp['name_module'] == $string) + $this->to_hook[] = $string.';'.$tmp['name_hook'].';'.$tmp['position'].';'.$tmp['exceptions']; + foreach ($this->to_enable as $string) + foreach ($this->hook_list as $tmp) + if ($tmp['name_module'] == $string) + $this->to_hook[] = $string.';'.$tmp['name_hook'].';'.$tmp['position'].';'.$tmp['exceptions']; + } + + /* + ** Fill Image var + */ + private function getImageState() + { + $table = Db::getInstance()->ExecuteS('SELECT name, width, height, products, categories, manufacturers, suppliers, scenes FROM `'._DB_PREFIX_.'image_type`'); + foreach ($table as $row) + $this->image_list[] = $row['name'].';'.$row['width'].';'.$row['height'].';'. + ($row['products'] == 1 ? 'true' : 'false').';'. + ($row['categories'] == 1 ? 'true' : 'false').';'. + ($row['manufacturers'] == 1 ? 'true' : 'false').';'. + ($row['suppliers'] == 1 ? 'true' : 'false').';'. + ($row['scenes'] == 1 ? 'true' : 'false'); + } + + /* + ** Takes current and submited theme's informations + */ + private function getThemeVariations() + { + $from = Tools::getValue('compa_from'); + $to = Tools::getValue('compa_to'); + $this->variations[] = Tools::getValue('theme_name').'¤'.Tools::getValue('mainTheme').'¤'.$from.'¤'.$to; + $count = 0; + while (Tools::isSubmit('myvar_'.++$count)) + { + if ((int)(Tools::getValue('myvar_'.$count)) == -1) + continue ; + $name = Tools::getValue('themevariationname_'.$count); + $dir = Tools::getValue('myvar_'.$count); + $from = Tools::getValue('compafrom_'.$count); + $to = Tools::getValue('compato_'.$count); + $this->variations[] = $name.'¤'.$dir.'¤'.$from.'¤'.$to; + } + } + + private function getDocumentation() + { + $count = 0; + while (Tools::isSubmit('documentationName_'.++$count)) + { + if (!($filename = Tools::htmlentitiesUTF8($_FILES['mydoc_'.$count]['name']))) + continue ; + $name = Tools::htmlentitiesUTF8(Tools::getValue('documentationName_'.$count)); + $this->user_doc[] = $name.'¤'.'doc/'.$filename; + } + } + + private function checkPostedDatas() + { + $mail = Tools::getValue('email'); + $website = Tools::getValue('website'); + + if ($mail AND !preg_match('#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#', $mail)) + $this->_html .= parent::displayError($this->l('There is an error in your e-mail syntax!')); + else if ($website AND (!Validate::isURL($website) OR !Validate::isAbsoluteUrl($website))) + $this->_html .= parent::displayError($this->l('There is an error in your URL syntax!')); + else if (!$this->checkVersionsAndCompatibility() OR !$this->checkNames() OR !$this->checkDocumentation()) + return false; + else + return true; + return false; + } + + /* + ** Checks posted documentation + */ + private function checkDocumentation() + { + $count = 0; + $extensions = array('.pdf', '.txt'); + while ($this->error == false AND isset($_FILES['mydoc_'.++$count])) + { + if (!$_FILES['mydoc_'.$count]['name']) + continue; + $extension = strrchr($_FILES['mydoc_'.$count]['name'], '.'); + $name = Tools::getValue('documentationName_'.$count); + + if (!in_array($extension, $extensions)) + $this->_html .= parent::displayError($this->l('File extension must be .txt or .pdf')); + else if ($_FILES['mydoc_'.$count]['error'] > 0 OR $_FILES['mydoc_'.$count]['size'] > 1048576) + $this->_html .= parent::displayError($this->l('An error occurred during documentation upload')); + else if (!$name OR !Validate::isGenericName($name) OR strlen($name) > MAX_NAME_LENGTH) + $this->_html .= parent::displayError($this->l('Please enter a valid documentation name')); + } + if ($this->error == true) + return false; + return true; + } + + /* + ** Checks theme's and author's name syntax, existence and length + */ + private function checkNames() + { + $author = Tools::getValue('author_name'); + $name = Tools::getValue('theme_name'); + $count = 0; + + if (!$author OR !Validate::isGenericName($author) OR strlen($author) > MAX_NAME_LENGTH) + $this->_html .= parent::displayError($this->l('Please enter a valid author name')); + else if (!$name OR !Validate::isGenericName($name) OR strlen($name) > MAX_NAME_LENGTH) + $this->_html .= parent::displayError($this->l('Please enter a valid theme name')); + while ($this->error === false AND Tools::isSubmit('myvar_'.++$count)) + { + if ((int)(Tools::getValue('myvar_'.$count)) == -1) + continue ; + $name = Tools::getValue('themevariationname_'.$count); + if (!$name OR !Validate::isGenericName($name) OR strlen($name) > MAX_NAME_LENGTH) + $this->_html .= parent::displayError($this->l('Please enter a valid theme variation name')); + } + if ($this->error == true) + return false; + return true; + } + + private function checkVersionsAndCompatibility() + { + $count = 0; + $exp = "#^[0-9]+[.]+[0-9.]*[0-9]$#"; + + if (!preg_match("#^[0-9][.][0-9]$#", Tools::getValue('version')) OR + !preg_match($exp, Tools::getValue('compa_from')) OR !preg_match($exp, Tools::getValue('compa_to')) OR + version_compare(Tools::getValue('compa_from'), Tools::getValue('compa_to')) == 1) + $this->_html .= parent::displayError($this->l('Syntax error on version field. Only digits and points are allowed and the compatibility should be increasing or equal.')); + while ($this->error === false AND Tools::isSubmit('myvar_'.++$count)) + { + if ((int)(Tools::getValue('myvar_'.$count)) == -1) + continue ; + $from = Tools::getValue('compafrom_'.$count); + $to = Tools::getValue('compato_'.$count); + if (!preg_match($exp, $from) OR !preg_match($exp, $to) OR version_compare($from, $to) == 1) + $this->_html .= parent::displayError($this->l('Syntax error on version. Only digits and points are allowed and compatibility should be increasing or equal.')); + } + if ($this->error == true) + return false; + return true; + } + + private function ModulesInformationForm() + { + if ($this->to_install AND count($this->to_install)) + { + $tmp = ''; + foreach ($this->to_install as $key => $val) + $tmp .= 'to_export) ? 'checked="checked"' : "").'/>
    '; + $this->_html .= ' +
    + '.$this->l('Modules').' + +
    '.$tmp.'
    +
    +

     

    '; + } + } + + private function AuthorInformationForm() + { + global $cookie; + + $employee = new Employee((int)$cookie->id_employee); + $mail = Tools::getValue('email') ? Tools::htmlentitiesUTF8(Tools::getValue('email')) : Tools::htmlentitiesUTF8($cookie->email); + $author = Tools::getValue('author_name') ? Tools::htmlentitiesUTF8(Tools::getValue('author_name')) : Tools::htmlentitiesUTF8(($employee->firstname).' '.$employee->lastname); + $website = Tools::getValue('website') ? Tools::htmlentitiesUTF8(Tools::getValue('website')) : Tools::getHttpHost(true); + + $this->_html .= ' +
    + '.$this->l('Author').' + +
    + +
    + +
    + +
    + +
    + +
    +
    +
     
    '; + } + + private function ThemeInformationForm() + { + global $cookie; + + $defaultLanguage = (int)(Configuration::get('PS_LANG_DEFAULT')); + $languages = Language::getLanguages(); + $iso = Language::getIsoById((int)($cookie->id_lang)); + $divLangName = 'title'; + $val = Tools::getValue('theme_name') ? Tools::getValue('theme_name') : Tools::getValue('mainTheme'); + + $this->_html .= ' +
    + '.$this->l('Theme').' + +
    + +

    '.$this->l('Your theme\'s name').'

    +
    + +
    '; + foreach ($languages as $language) + { + $val = Tools::htmlentitiesUTF8(Tools::getValue('body_title_'.$language['id_lang'])); + $this->_html .= ' +
    + +
    '; + } + $this->_html .= $this->displayFlags($languages, $defaultLanguage, $divLangName, 'title', true); + $this->_html .= ' +

    '.$this->l('Enter a short description of your theme').'

    +
    '; + $val = Tools::getValue('version') ? Tools::getValue('version') : DEFAULT_T_VER; + $this->_html .= ' + +
    + +

    '.$this->l('Your theme\'s version').'

    +
    '; + $val = Tools::getValue('compa_from') ? Tools::getValue('compa_from') : DEFAULT_COMPATIBILITY_FROM; + $val2 = Tools::getValue('compa_to') ? Tools::getValue('compa_to') : DEFAULT_COMPATIBILITY_TO; + $this->_html .= ' +
    + +
    + +
    +
    +
    + +
    + +
    +
    +

     

    '; + } + + private function DocInformationForm() + { + $val = Tools::htmlentitiesUTF8(Tools::getValue('documentation')); + $this->_html .= ' + +

    '. + $this->l('Give the user some help. Add a field by clicking here').' + add.
    '. + $this->l('File extension must be .txt or .pdf').' +

    + +
    + '; + $this->_html .= '

     

    '; + } + + private function VariationInformationForm() + { + $script = _MODULE_DIR_.$this->name.'/script.js'; + + $this->_html .= ' + +

    '.$this->l('Select theme to include and its compatibility.').'

    + + +
    +
     
    '; + $this->_html .= ' +
    +
     
    +   + + '; + } +} diff --git a/modules/tm4b/classes/Tm4bSms.php b/modules/tm4b/classes/Tm4bSms.php new file mode 100644 index 000000000..1870daf60 --- /dev/null +++ b/modules/tm4b/classes/Tm4bSms.php @@ -0,0 +1,232 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +class Tm4bSms { + + const __TM4B_SMS_HTTP_HOST__ = 'www.tm4b.com'; + const __TM4B_SMS_HTTP_SERVICE__ = '/client/api/http.php'; + const __TM4B_SMS_HTTP_METHOD__ = 'GET'; + const __TM4B_SMS_MESSAGE_TYPE__ = 'broadcast'; + + const __TM4B_SMS_CHECKBALANCE_TYPE__ = 'check_balance'; + const __TM4B_SMS_CHECKROUTE_TYPE__ = 'check_destination'; + const __TM4B_SMS_CHECKSTATUS_TYPE__ = 'check_status'; + + + // Keep the Query String for HTTP + private $_httpQS = ''; + + public $msg; + private $_to = array(); + + private $errors; + private $_user; + private $_pass; + private $_route; + private $_from; + + private $_id; + + function __construct($user, $pass, $route, $from = 'tm4b', $to = array(), $message = '') + { + $this->msg = $message; + $this->_user = $user; + $this->_pass = $pass; + $this->_route = $route; + $this->_from = $from; + + foreach ($to as $num) + { + $this->addRecipient($num); + } + $this->_id = array(); // identifier of the sent sms + } + + + // Build the query string for HTTP + private function BuildQS($args) + { + $qs = ''; + $countArgs = 1; + foreach ($args as $key => $value) + { + if (is_array($value)) + { + $countTo = 1; + $qs .= $key . '='; + foreach ($value as $index => $recipient) + { + if ($key == 'id') + $qs .= $recipient; + else + $qs .= urlencode($recipient); + + if ($countTo < sizeof($value)) + $qs .= '|'; + $countTo++; + } + } + else + { + $qs .= $key . '=' . urlencode($value); + } + + if ($countArgs < sizeof($args)) + $qs .= '&'; + $countArgs++; + } + return $qs; + } + + // Send a HTTP Queries through sockets + private function SendSocketHTTP() + { + // init infos + if( self::__TM4B_SMS_HTTP_METHOD__ == "GET") + { + $script = self::__TM4B_SMS_HTTP_SERVICE__ . '?' . $this->_httpQS; + } + else + { + $script = self::__TM4B_SMS_HTTP_SERVICE__ ; + } + + + // Build HTTP Header + $header = self::__TM4B_SMS_HTTP_METHOD__ . " " . $script . " HTTP/1.1\r\n"; + $header .= "Host: " . self::__TM4B_SMS_HTTP_HOST__ . "\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . Tools::strlen($this->_httpQS) . "\r\n"; + $header .= "Connection: close\r\n\r\n"; + $header .= $this->_httpQS . "\r\n"; + + // Socket connection + $socket = fsockopen( self::__TM4B_SMS_HTTP_HOST__ , 80, $errno, $errstr); + + if($socket) // if we're connected + { + fputs($socket, $header); // Send header + while(!feof($socket)) + { + $response[] = fgets($socket); // Grab return codes + } + fclose($socket); + } + else + { + $response = false; + } + return ($response); + } + + +############################################################# +# +# PUBLIC METHODS +# +############################################################# + + // Add a recipent + public function AddRecipient($to, $country_code = NULL) + { + if ($country_code) + $to = preg_replace('/^0/', $country_code, $to); + array_push($this->_to, $to); + } + + // Returns the current balance of the account in credits + public function CheckCredits() + { + $this->_httpQS = $this->BuildQS( array( 'username' => $this->_user, + 'password' => $this->_pass, + 'type' => self::__TM4B_SMS_CHECKBALANCE_TYPE__) ); + $response = $this->SendSocketHTTP(); + if (isset($response[8])) + return $response[8]; + return ''; + } + + // Return the cost to send sms to a given country or number + public function CheckRoute() + { + $this->_httpQS = $this->BuildQS( array ( 'username' => $this->_user, + 'password' => $this->_pass, + 'type' => self::__TM4B_SMS_CHECKROUTE_TYPE__, + 'dest' => $this->to, + 'route' => $this->_route ) ); + return ($this->SendSocketHTTP()); + } + + // Send SMS trought various possible methods (SMTP / HTTP) + public function Send($sim = 'no') + { + // Return if we can't send the sms + if (empty($this->msg) OR empty($this->_to)) + return false; + + $sim = ($sim == '0' ? 'no' : 'yes'); + + $this->_httpQS = $this->BuildQS( array ( + 'username' => $this->_user, + 'password' => $this->_pass, + 'type' => self::__TM4B_SMS_MESSAGE_TYPE__, + 'to' => $this->_to, + 'route' => $this->_route, + 'from' => $this->_from, + 'msg' => $this->msg, + 'sim' => $sim + ) + ); + $ret = $this->SendSocketHTTP(); + if (is_array($ret)) + { + $this->_id = $ret[8]; + return $ret[8]; + } + else + return $ret; + } + + public function isSent() + { + if (isset($this->_id) AND preg_match('/^MT.*/', $this->_id)) + return true; + return false; + } + + public function CheckStatus() + { + $this->_httpQS = $this->BuildQS( array ( + $this->_user, + 'password' => $this->_pass, + 'type' => self::__TM4B_SMS_CHECKSTATUS_TYPE__, + 'id' => $this->_id ) + ); + echo 'QS = '.$this->_httpQS."\n"; + return $this->SendSocketHTTP(); + } +} + diff --git a/modules/tm4b/config.xml b/modules/tm4b/config.xml new file mode 100755 index 000000000..e77e11ada --- /dev/null +++ b/modules/tm4b/config.xml @@ -0,0 +1,13 @@ + + + tm4b + + + + + + Are you sure you want to delete your info? + 1 + 0 + + \ No newline at end of file diff --git a/modules/tm4b/cron.php b/modules/tm4b/cron.php new file mode 100644 index 000000000..595d255eb --- /dev/null +++ b/modules/tm4b/cron.php @@ -0,0 +1,51 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/tm4b.php'); +include(dirname(__FILE__).'/classes/Tm4bSms.php'); + +$module = new Tm4b(); +if (Tools::getValue('token') != $module->token) + exit; + +if (!Configuration::get('TM4B_DAILY_REPORT_ACTIVE')) + die ('Daily report not active'); +if (Configuration::get('TM4B_LAST_REPORT') == date('Y-m-d')) + die ('Report already sent'); +Configuration::updateValue('TM4B_LAST_REPORT', date('Y-m-d')); + +$sms = new Tm4bSms(Configuration::get('TM4B_USER'), Configuration::get('TM4B_PASSWORD'), Configuration::get('TM4B_ROUTE')); +$sms->msg = $module->getStatsBody(); +$numbers = explode(',', Configuration::get('TM4B_NEW_ORDER_NUMBERS')); +foreach ($numbers as $number) + if ($number != '') + $sms->addRecipient($number); +$sms->Send(Configuration::get('TM4B_SIM')); +die ('OK'); + diff --git a/modules/tm4b/de.php b/modules/tm4b/de.php new file mode 100644 index 000000000..a13ed7ff0 --- /dev/null +++ b/modules/tm4b/de.php @@ -0,0 +1,46 @@ +tm4b_599f02a21a8d80cfa87a3a42f9aef067'] = 'Sendet eine SMS bei jeder neuen Bestellung'; +$_MODULE['<{tm4b}prestashop>tm4b_2c8be96b677dc6b891a343193822fea4'] = 'Sie sind sicher, dass Sie Ihre Daten löschen möchten?'; +$_MODULE['<{tm4b}prestashop>tm4b_088d3bfa945e4c27ac0fea363bb13d12'] = 'Nachricht erfolgreich gesendet'; +$_MODULE['<{tm4b}prestashop>tm4b_0cda570a27de3fbd0940da019f759721'] = 'Fehler beim Senden der Nachricht'; +$_MODULE['<{tm4b}prestashop>tm4b_884b60418e2f1f9a6a40f12e8ca0a64d'] = 'Login und Telefonnummer'; +$_MODULE['<{tm4b}prestashop>tm4b_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{tm4b}prestashop>tm4b_8b58aafd28dcaee7f6e92442c96e31db'] = 'Schicken Sie eine Test-SMS:'; +$_MODULE['<{tm4b}prestashop>tm4b_43e9e66e3a7acefd0663287c95acd407'] = 'Geben Sie Ihre Telefonnummer ein'; +$_MODULE['<{tm4b}prestashop>tm4b_35ba634a7df95f937550c54b7b94d2c5'] = 'z.B.: 33642424242'; +$_MODULE['<{tm4b}prestashop>tm4b_2e1779891f69b099b16616ae7ea2e76c'] = 'SMS-Guthaben:'; +$_MODULE['<{tm4b}prestashop>tm4b_00db7aae85aecb79c75afca7daa8f22e'] = 'Sie haben'; +$_MODULE['<{tm4b}prestashop>tm4b_928735d6f2c63bee316dd511c8ccaf55'] = 'Guthaben'; +$_MODULE['<{tm4b}prestashop>tm4b_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{tm4b}prestashop>tm4b_cac81c648846c9b8c3e6085a45782c7e'] = 'Benutzername:'; +$_MODULE['<{tm4b}prestashop>tm4b_b341a59d5636ed3d6a819137495b08a0'] = 'Kennwort:'; +$_MODULE['<{tm4b}prestashop>tm4b_6c47d739c79e0f93ec0cd90663a68ebf'] = 'Relais:'; +$_MODULE['<{tm4b}prestashop>tm4b_43e7396afc9f4633157a47bf5f5af96c'] = 'SMS Absendertelefonnr.'; +$_MODULE['<{tm4b}prestashop>tm4b_1ee1c44c2dc81681f961235604247b81'] = 'Modus:'; +$_MODULE['<{tm4b}prestashop>tm4b_4f502b57d2835715eaa382c7d4c32e94'] = 'Simulation'; +$_MODULE['<{tm4b}prestashop>tm4b_756d97bb256b8580d4d71ee0c547804e'] = 'Betrieb'; +$_MODULE['<{tm4b}prestashop>tm4b_ea24be6a78dd661afe60448e87b75065'] = 'Benachrichtigungen über neue Bestellung:'; +$_MODULE['<{tm4b}prestashop>tm4b_93cba07454f06a4a960172bbd6e2a435'] = 'Ja'; +$_MODULE['<{tm4b}prestashop>tm4b_7b357f8e4b60349aeba339f3032e4a84'] = 'SMS schicken, wenn eine neue Bestellung gemacht wird'; +$_MODULE['<{tm4b}prestashop>tm4b_ff914fecb4b37bd6edb2e4515ec1d4dc'] = 'Benachrichtigungen zur Produktmenge:'; +$_MODULE['<{tm4b}prestashop>tm4b_2ed5f5c1670d557c67c958d1f230cb2c'] = 'SMS schicken, wenn die Produktmenge aktualisiert wird'; +$_MODULE['<{tm4b}prestashop>tm4b_d0759ad8efa7234c0f9b919f9ec88c2b'] = 'Tagesbericht:'; +$_MODULE['<{tm4b}prestashop>tm4b_a5d859ac85a50ed9d8b6d93be6abd217'] = 'Senden Sie einen täglichen Statistikbericht - Sie müssen einen CRON einstellen auf'; +$_MODULE['<{tm4b}prestashop>tm4b_481bfc100d0a3590edb72f53679e310c'] = 'SMS-Empfänger-Telefonnr.'; +$_MODULE['<{tm4b}prestashop>tm4b_b17f3f4dcf653a5776792498a9b44d6a'] = 'Einstellungen aktualisiert'; +$_MODULE['<{tm4b}prestashop>tm4b_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; +$_MODULE['<{tm4b}prestashop>tm4b_b1a293b0efa4e1e7c35ef375c3cd7a44'] = 'Benutzername ist obligatorisch'; +$_MODULE['<{tm4b}prestashop>tm4b_8c194fef39e0d251494686926884733e'] = 'Kennwort ist obligatorisch'; +$_MODULE['<{tm4b}prestashop>tm4b_6ac6840e86a7b09bf9eb326228060981'] = 'Root ist obligatorisch'; +$_MODULE['<{tm4b}prestashop>tm4b_486493b98a473ebb777dd86bbf264e06'] = 'Herkunft ist obligatorisch'; +$_MODULE['<{tm4b}prestashop>tm4b_30c94c563402b0a87e4b5411518ab542'] = 'Modus ist obligatorisch'; +$_MODULE['<{tm4b}prestashop>tm4b_aea21c9ea4f10d22071eb479eee918c3'] = 'Bitte geben Sie eine Telefonnummer ein'; +$_MODULE['<{tm4b}prestashop>tm4b_713569f69019a591adfda481f6668a06'] = 'Telefonnummer ungültig'; +$_MODULE['<{tm4b}prestashop>tm4b_8394f2c720f3798ff8ef93fe7e331866'] = 'Bestellungen:'; +$_MODULE['<{tm4b}prestashop>tm4b_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Verkäufe:'; +$_MODULE['<{tm4b}prestashop>tm4b_01411a97818b38fc6524d56590ca5a12'] = 'Monat:'; + +?> \ No newline at end of file diff --git a/modules/tm4b/en.php b/modules/tm4b/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/tm4b/en.php @@ -0,0 +1,4 @@ +tm4b_599f02a21a8d80cfa87a3a42f9aef067'] = 'Enviar un SMS para cada nuevo pedido'; +$_MODULE['<{tm4b}prestashop>tm4b_2c8be96b677dc6b891a343193822fea4'] = '¿Está seguro de querer eliminar toda su información?'; +$_MODULE['<{tm4b}prestashop>tm4b_088d3bfa945e4c27ac0fea363bb13d12'] = 'Mensaje enviado correctamente'; +$_MODULE['<{tm4b}prestashop>tm4b_0cda570a27de3fbd0940da019f759721'] = 'error durante el envío del mensaje'; +$_MODULE['<{tm4b}prestashop>tm4b_884b60418e2f1f9a6a40f12e8ca0a64d'] = 'Login y número de teléfono'; +$_MODULE['<{tm4b}prestashop>tm4b_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Información'; +$_MODULE['<{tm4b}prestashop>tm4b_8b58aafd28dcaee7f6e92442c96e31db'] = 'Probar envío de SMS'; +$_MODULE['<{tm4b}prestashop>tm4b_43e9e66e3a7acefd0663287c95acd407'] = 'Introduzca su número de teléfono'; +$_MODULE['<{tm4b}prestashop>tm4b_35ba634a7df95f937550c54b7b94d2c5'] = 'ej: 33642424242rnrn'; +$_MODULE['<{tm4b}prestashop>tm4b_2e1779891f69b099b16616ae7ea2e76c'] = 'crédito SMS'; +$_MODULE['<{tm4b}prestashop>tm4b_00db7aae85aecb79c75afca7daa8f22e'] = 'Tiene'; +$_MODULE['<{tm4b}prestashop>tm4b_928735d6f2c63bee316dd511c8ccaf55'] = 'de crédito'; +$_MODULE['<{tm4b}prestashop>tm4b_466f8189c781f6e003d6a2a9f6c5b541'] = 'Información sobre la lengüeta CRON'; +$_MODULE['<{tm4b}prestashop>tm4b_60c28ac0d4876263692a88786d2626ef'] = 'URL para la configuración de tarea cron'; +$_MODULE['<{tm4b}prestashop>tm4b_f4f70727dc34561dfde1a3c529b6205c'] = 'configuración'; +$_MODULE['<{tm4b}prestashop>tm4b_cac81c648846c9b8c3e6085a45782c7e'] = 'Nombre de usuario'; +$_MODULE['<{tm4b}prestashop>tm4b_b341a59d5636ed3d6a819137495b08a0'] = 'Contraseña'; +$_MODULE['<{tm4b}prestashop>tm4b_6c47d739c79e0f93ec0cd90663a68ebf'] = 'Relay:'; +$_MODULE['<{tm4b}prestashop>tm4b_43e7396afc9f4633157a47bf5f5af96c'] = 'Teléfono del remitente del SMS '; +$_MODULE['<{tm4b}prestashop>tm4b_1ee1c44c2dc81681f961235604247b81'] = 'modo:'; +$_MODULE['<{tm4b}prestashop>tm4b_4f502b57d2835715eaa382c7d4c32e94'] = 'Simulación'; +$_MODULE['<{tm4b}prestashop>tm4b_756d97bb256b8580d4d71ee0c547804e'] = 'Producción'; +$_MODULE['<{tm4b}prestashop>tm4b_ea24be6a78dd661afe60448e87b75065'] = 'Alerta cada nuevo pedido:'; +$_MODULE['<{tm4b}prestashop>tm4b_93cba07454f06a4a960172bbd6e2a435'] = 'Sí'; +$_MODULE['<{tm4b}prestashop>tm4b_7b357f8e4b60349aeba339f3032e4a84'] = 'Enviar un SMS si se realiza un nuevo pedido'; +$_MODULE['<{tm4b}prestashop>tm4b_ff914fecb4b37bd6edb2e4515ec1d4dc'] = 'Alerta por cantidad de productos:'; +$_MODULE['<{tm4b}prestashop>tm4b_2ed5f5c1670d557c67c958d1f230cb2c'] = 'Enviar un SMS cuando se actualiza el stock del producto'; +$_MODULE['<{tm4b}prestashop>tm4b_d0759ad8efa7234c0f9b919f9ec88c2b'] = 'Informe diario'; +$_MODULE['<{tm4b}prestashop>tm4b_a5d859ac85a50ed9d8b6d93be6abd217'] = 'Enviar un informe diario de las estadísticas. Debe fijar un CRON a'; +$_MODULE['<{tm4b}prestashop>tm4b_481bfc100d0a3590edb72f53679e310c'] = 'teléfono del destinatario del SMS'; +$_MODULE['<{tm4b}prestashop>tm4b_b17f3f4dcf653a5776792498a9b44d6a'] = 'Actualizar configuración'; +$_MODULE['<{tm4b}prestashop>tm4b_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{tm4b}prestashop>tm4b_b1a293b0efa4e1e7c35ef375c3cd7a44'] = 'El nombre de usuario es obligatorio'; +$_MODULE['<{tm4b}prestashop>tm4b_8c194fef39e0d251494686926884733e'] = 'La contraseña es obligatoria'; +$_MODULE['<{tm4b}prestashop>tm4b_6ac6840e86a7b09bf9eb326228060981'] = 'La ruta es obligatoria'; +$_MODULE['<{tm4b}prestashop>tm4b_486493b98a473ebb777dd86bbf264e06'] = 'El origen es obligatorio'; +$_MODULE['<{tm4b}prestashop>tm4b_30c94c563402b0a87e4b5411518ab542'] = 'El modo es obligatorio'; +$_MODULE['<{tm4b}prestashop>tm4b_aea21c9ea4f10d22071eb479eee918c3'] = 'Por favor, indique un número de teléfono'; +$_MODULE['<{tm4b}prestashop>tm4b_713569f69019a591adfda481f6668a06'] = 'Número de teléfono no válido'; +$_MODULE['<{tm4b}prestashop>tm4b_8394f2c720f3798ff8ef93fe7e331866'] = 'Pedidos:'; +$_MODULE['<{tm4b}prestashop>tm4b_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Ventas:'; +$_MODULE['<{tm4b}prestashop>tm4b_01411a97818b38fc6524d56590ca5a12'] = 'Mes:'; diff --git a/modules/tm4b/fr.php b/modules/tm4b/fr.php new file mode 100644 index 000000000..d9b973972 --- /dev/null +++ b/modules/tm4b/fr.php @@ -0,0 +1,46 @@ +tm4b_599f02a21a8d80cfa87a3a42f9aef067'] = 'Envoyer un SMS à chaque nouvelle commande'; +$_MODULE['<{tm4b}prestashop>tm4b_2c8be96b677dc6b891a343193822fea4'] = 'Êtes-vous sûr de vouloir supprimer ces informations ?'; +$_MODULE['<{tm4b}prestashop>tm4b_088d3bfa945e4c27ac0fea363bb13d12'] = 'Message bien envoyé'; +$_MODULE['<{tm4b}prestashop>tm4b_0cda570a27de3fbd0940da019f759721'] = 'Erreur lors de l\'envoie du message'; +$_MODULE['<{tm4b}prestashop>tm4b_884b60418e2f1f9a6a40f12e8ca0a64d'] = 'Identifiant et numéro de téléphone'; +$_MODULE['<{tm4b}prestashop>tm4b_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Information'; +$_MODULE['<{tm4b}prestashop>tm4b_8b58aafd28dcaee7f6e92442c96e31db'] = 'Envoyer un SMS de test :'; +$_MODULE['<{tm4b}prestashop>tm4b_43e9e66e3a7acefd0663287c95acd407'] = 'Entrez votre numéro de téléphone'; +$_MODULE['<{tm4b}prestashop>tm4b_35ba634a7df95f937550c54b7b94d2c5'] = 'ex: 33642424242'; +$_MODULE['<{tm4b}prestashop>tm4b_2e1779891f69b099b16616ae7ea2e76c'] = 'Crédits SMS :'; +$_MODULE['<{tm4b}prestashop>tm4b_00db7aae85aecb79c75afca7daa8f22e'] = 'Vous avez'; +$_MODULE['<{tm4b}prestashop>tm4b_928735d6f2c63bee316dd511c8ccaf55'] = 'crédits'; +$_MODULE['<{tm4b}prestashop>tm4b_466f8189c781f6e003d6a2a9f6c5b541'] = 'Information pour la tache CRON'; +$_MODULE['<{tm4b}prestashop>tm4b_60c28ac0d4876263692a88786d2626ef'] = 'URL pour la configuration de la tache CRON:'; +$_MODULE['<{tm4b}prestashop>tm4b_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{tm4b}prestashop>tm4b_cac81c648846c9b8c3e6085a45782c7e'] = 'Identifiant :'; +$_MODULE['<{tm4b}prestashop>tm4b_b341a59d5636ed3d6a819137495b08a0'] = 'Mot de passe :'; +$_MODULE['<{tm4b}prestashop>tm4b_6c47d739c79e0f93ec0cd90663a68ebf'] = 'Relais :'; +$_MODULE['<{tm4b}prestashop>tm4b_43e7396afc9f4633157a47bf5f5af96c'] = 'Numéro de téléphone de l\'expéditeur du SMS'; +$_MODULE['<{tm4b}prestashop>tm4b_1ee1c44c2dc81681f961235604247b81'] = 'Mode :'; +$_MODULE['<{tm4b}prestashop>tm4b_4f502b57d2835715eaa382c7d4c32e94'] = 'Simulation'; +$_MODULE['<{tm4b}prestashop>tm4b_756d97bb256b8580d4d71ee0c547804e'] = 'Production'; +$_MODULE['<{tm4b}prestashop>tm4b_ea24be6a78dd661afe60448e87b75065'] = 'Alerte nouvelle commande'; +$_MODULE['<{tm4b}prestashop>tm4b_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{tm4b}prestashop>tm4b_7b357f8e4b60349aeba339f3032e4a84'] = 'Envoi un SMS à chaque nouvelle commande'; +$_MODULE['<{tm4b}prestashop>tm4b_ff914fecb4b37bd6edb2e4515ec1d4dc'] = 'Alerte changement de stock'; +$_MODULE['<{tm4b}prestashop>tm4b_2ed5f5c1670d557c67c958d1f230cb2c'] = 'Envoi un SMS à chaque changement de stock'; +$_MODULE['<{tm4b}prestashop>tm4b_d0759ad8efa7234c0f9b919f9ec88c2b'] = 'Rapport quotidien'; +$_MODULE['<{tm4b}prestashop>tm4b_a5d859ac85a50ed9d8b6d93be6abd217'] = 'Envoi un rapport journalier - vous devez configurer un CRON sur le fichier'; +$_MODULE['<{tm4b}prestashop>tm4b_481bfc100d0a3590edb72f53679e310c'] = 'Numéro de téléphone du destinataire du SMS'; +$_MODULE['<{tm4b}prestashop>tm4b_b17f3f4dcf653a5776792498a9b44d6a'] = 'Mettre à jour les informations'; +$_MODULE['<{tm4b}prestashop>tm4b_c888438d14855d7d96a2724ee9c306bd'] = 'Informations mises à jour'; +$_MODULE['<{tm4b}prestashop>tm4b_b1a293b0efa4e1e7c35ef375c3cd7a44'] = 'Identifiant obligatoire'; +$_MODULE['<{tm4b}prestashop>tm4b_8c194fef39e0d251494686926884733e'] = 'Mot de passe obligatoire'; +$_MODULE['<{tm4b}prestashop>tm4b_6ac6840e86a7b09bf9eb326228060981'] = 'Route obligatoire'; +$_MODULE['<{tm4b}prestashop>tm4b_486493b98a473ebb777dd86bbf264e06'] = 'Origine obligatoire'; +$_MODULE['<{tm4b}prestashop>tm4b_30c94c563402b0a87e4b5411518ab542'] = 'Mode obligatoire'; +$_MODULE['<{tm4b}prestashop>tm4b_aea21c9ea4f10d22071eb479eee918c3'] = 'Merci d\'entrer un numéro de téléphone'; +$_MODULE['<{tm4b}prestashop>tm4b_713569f69019a591adfda481f6668a06'] = 'Numéro de téléphone invalide'; +$_MODULE['<{tm4b}prestashop>tm4b_8394f2c720f3798ff8ef93fe7e331866'] = 'Commandes'; +$_MODULE['<{tm4b}prestashop>tm4b_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'CA'; +$_MODULE['<{tm4b}prestashop>tm4b_01411a97818b38fc6524d56590ca5a12'] = 'Mois'; diff --git a/modules/tm4b/informations.gif b/modules/tm4b/informations.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4316825ec00c16f0047334aab6eb7c318b89c18 GIT binary patch literal 581 zcmZ?wbhEHb6krfwc*el+9|->a{P*Ym-(O$<{(S!T=i9$O?)~|8lo_2kGu;$DC6`$^G`gTA0b*5JEWEt<#0?tF(YzNYr83sL2 z{K>+|4s@js$fck-VPId>z|hp((%ROft=`@yB_}7;-OOaj#AVDhkwHbAnMGcCBD)Er z01vARm(H@0P*||Qk&#tM eOu+GoOJBR45)-Gtm4b_599f02a21a8d80cfa87a3a42f9aef067'] = 'Invia un SMS per ogni nuovo ordine'; +$_MODULE['<{tm4b}prestashop>tm4b_2c8be96b677dc6b891a343193822fea4'] = 'Sei sicuro di voler cancellare le tue informazioni?'; +$_MODULE['<{tm4b}prestashop>tm4b_088d3bfa945e4c27ac0fea363bb13d12'] = 'Messaggio inviato con successo'; +$_MODULE['<{tm4b}prestashop>tm4b_0cda570a27de3fbd0940da019f759721'] = 'Errore durante l\'invio del messaggio'; +$_MODULE['<{tm4b}prestashop>tm4b_884b60418e2f1f9a6a40f12e8ca0a64d'] = 'Login e numero di telefono'; +$_MODULE['<{tm4b}prestashop>tm4b_a82be0f551b8708bc08eb33cd9ded0cf'] = 'Informazioni'; +$_MODULE['<{tm4b}prestashop>tm4b_8b58aafd28dcaee7f6e92442c96e31db'] = 'Inviare SMS di prova:'; +$_MODULE['<{tm4b}prestashop>tm4b_43e9e66e3a7acefd0663287c95acd407'] = 'Inserisci il tuo numero di telefono'; +$_MODULE['<{tm4b}prestashop>tm4b_35ba634a7df95f937550c54b7b94d2c5'] = 'es: 33642424242'; +$_MODULE['<{tm4b}prestashop>tm4b_2e1779891f69b099b16616ae7ea2e76c'] = 'Crediti SMS:'; +$_MODULE['<{tm4b}prestashop>tm4b_00db7aae85aecb79c75afca7daa8f22e'] = 'Hai'; +$_MODULE['<{tm4b}prestashop>tm4b_928735d6f2c63bee316dd511c8ccaf55'] = 'crediti'; +$_MODULE['<{tm4b}prestashop>tm4b_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{tm4b}prestashop>tm4b_cac81c648846c9b8c3e6085a45782c7e'] = 'Nome utente:'; +$_MODULE['<{tm4b}prestashop>tm4b_b341a59d5636ed3d6a819137495b08a0'] = 'Password:'; +$_MODULE['<{tm4b}prestashop>tm4b_6c47d739c79e0f93ec0cd90663a68ebf'] = 'Relay:'; +$_MODULE['<{tm4b}prestashop>tm4b_43e7396afc9f4633157a47bf5f5af96c'] = 'N. di telefono del mittente dell\'SMS '; +$_MODULE['<{tm4b}prestashop>tm4b_1ee1c44c2dc81681f961235604247b81'] = 'Modalità:'; +$_MODULE['<{tm4b}prestashop>tm4b_4f502b57d2835715eaa382c7d4c32e94'] = 'Simulazione'; +$_MODULE['<{tm4b}prestashop>tm4b_756d97bb256b8580d4d71ee0c547804e'] = 'Produzione'; +$_MODULE['<{tm4b}prestashop>tm4b_ea24be6a78dd661afe60448e87b75065'] = 'Segnalazioni del nuovo ordine:'; +$_MODULE['<{tm4b}prestashop>tm4b_93cba07454f06a4a960172bbd6e2a435'] = 'Sì'; +$_MODULE['<{tm4b}prestashop>tm4b_7b357f8e4b60349aeba339f3032e4a84'] = 'Inviare SMS se viene fatto un nuovo ordine'; +$_MODULE['<{tm4b}prestashop>tm4b_ff914fecb4b37bd6edb2e4515ec1d4dc'] = 'Segnalazioni di quantità di prodotto:'; +$_MODULE['<{tm4b}prestashop>tm4b_2ed5f5c1670d557c67c958d1f230cb2c'] = 'Inviare SMS se lo stock di prodotto viene aggiornato'; +$_MODULE['<{tm4b}prestashop>tm4b_d0759ad8efa7234c0f9b919f9ec88c2b'] = 'Rapporto giornaliero:'; +$_MODULE['<{tm4b}prestashop>tm4b_a5d859ac85a50ed9d8b6d93be6abd217'] = 'Inviare una relazione quotidiana statistiche - È necessario impostare un CRON per'; +$_MODULE['<{tm4b}prestashop>tm4b_481bfc100d0a3590edb72f53679e310c'] = 'N. telefono ricevente SMS'; +$_MODULE['<{tm4b}prestashop>tm4b_b17f3f4dcf653a5776792498a9b44d6a'] = 'Aggiorna le impostazioni'; +$_MODULE['<{tm4b}prestashop>tm4b_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{tm4b}prestashop>tm4b_b1a293b0efa4e1e7c35ef375c3cd7a44'] = 'Il nome utente è obbligatorio'; +$_MODULE['<{tm4b}prestashop>tm4b_8c194fef39e0d251494686926884733e'] = 'Password è obbligatoria'; +$_MODULE['<{tm4b}prestashop>tm4b_6ac6840e86a7b09bf9eb326228060981'] = 'Route è obbligatoria'; +$_MODULE['<{tm4b}prestashop>tm4b_486493b98a473ebb777dd86bbf264e06'] = 'L\'origine è obbligatoria'; +$_MODULE['<{tm4b}prestashop>tm4b_30c94c563402b0a87e4b5411518ab542'] = 'Modalità è obbligatoria'; +$_MODULE['<{tm4b}prestashop>tm4b_aea21c9ea4f10d22071eb479eee918c3'] = 'Si prega di inserire un numero di telefono'; +$_MODULE['<{tm4b}prestashop>tm4b_713569f69019a591adfda481f6668a06'] = 'Numero di telefono non valido'; +$_MODULE['<{tm4b}prestashop>tm4b_8394f2c720f3798ff8ef93fe7e331866'] = 'Ordini:'; +$_MODULE['<{tm4b}prestashop>tm4b_ec3e48bb9aa902ba2ad608547fdcbfdc'] = 'Vendite:'; +$_MODULE['<{tm4b}prestashop>tm4b_01411a97818b38fc6524d56590ca5a12'] = 'Mese:'; + +?> \ No newline at end of file diff --git a/modules/tm4b/logo.gif b/modules/tm4b/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..87a5f1fc6a1c8d8aed5eb63687b14a67a8331133 GIT binary patch literal 241 zcmVlqx-rm;M*38x0qTBbJ*!axM%)HIk#l^+Fy}h!s zvVO#MtE;Pby>6zarkRu7}Kx6ShXwEH%pq!{1 rGI4HK2Bq0Dhn~!Ss literal 0 HcmV?d00001 diff --git a/modules/tm4b/mails/de/sms_new_order.txt b/modules/tm4b/mails/de/sms_new_order.txt new file mode 100755 index 000000000..4eda1490d --- /dev/null +++ b/modules/tm4b/mails/de/sms_new_order.txt @@ -0,0 +1,5 @@ +{shop_name} +Kunde: {firstname} {lastname} +Bestellung: {order_name} +Zahlung: {payment} +Gesamt TI: ({total_paid} {currency}) diff --git a/modules/tm4b/mails/de/sms_out_of_stock.txt b/modules/tm4b/mails/de/sms_out_of_stock.txt new file mode 100755 index 000000000..f07afbabb --- /dev/null +++ b/modules/tm4b/mails/de/sms_out_of_stock.txt @@ -0,0 +1,5 @@ +{shop_name} +Dieser Artikel ist bald ausverkauft: +Ref.: {product_ref} +Id: {product_id} +Menge: {qty} \ No newline at end of file diff --git a/modules/tm4b/mails/en/sms_new_order.txt b/modules/tm4b/mails/en/sms_new_order.txt new file mode 100644 index 000000000..2e233bae5 --- /dev/null +++ b/modules/tm4b/mails/en/sms_new_order.txt @@ -0,0 +1,5 @@ +{shop_name} +Customer: {firstname} {lastname} +Order: {order_name} +Payment: {payment} +Total TI: ({total_paid} {currency}) diff --git a/modules/tm4b/mails/en/sms_out_of_stock.txt b/modules/tm4b/mails/en/sms_out_of_stock.txt new file mode 100644 index 000000000..b8c3c19df --- /dev/null +++ b/modules/tm4b/mails/en/sms_out_of_stock.txt @@ -0,0 +1,5 @@ +{shop_name} +This product is soon out of stock: +Ref: {product_ref} +Id: {product_id} +Qty: {qty} \ No newline at end of file diff --git a/modules/tm4b/mails/es/sms_new_order.txt b/modules/tm4b/mails/es/sms_new_order.txt new file mode 100644 index 000000000..e69de29bb diff --git a/modules/tm4b/mails/es/sms_out_of_stock.txt b/modules/tm4b/mails/es/sms_out_of_stock.txt new file mode 100644 index 000000000..34f1e4639 --- /dev/null +++ b/modules/tm4b/mails/es/sms_out_of_stock.txt @@ -0,0 +1,5 @@ +nombre de la tienda: {shop_name} +Este producto es poco fuera de stock: +Ref: {product_ref} +Id: {product_id} +Cantidad: {qty} \ No newline at end of file diff --git a/modules/tm4b/mails/fr/sms_new_order.txt b/modules/tm4b/mails/fr/sms_new_order.txt new file mode 100644 index 000000000..102e5276b --- /dev/null +++ b/modules/tm4b/mails/fr/sms_new_order.txt @@ -0,0 +1,5 @@ +{shop_name} +Client : {firstname} {lastname} +Commande : {order_name} +Mode de paiement : {payment} +Total TTC : ({total_paid} {currency}) diff --git a/modules/tm4b/mails/fr/sms_out_of_stock.txt b/modules/tm4b/mails/fr/sms_out_of_stock.txt new file mode 100644 index 000000000..d222e0682 --- /dev/null +++ b/modules/tm4b/mails/fr/sms_out_of_stock.txt @@ -0,0 +1,5 @@ +{shop_name} +Ce produit est bientot en rupture de stock : +Ref: {product_ref} +Id: {product_id} +Quantité: {qty} \ No newline at end of file diff --git a/modules/tm4b/mails/it/sms_new_order.txt b/modules/tm4b/mails/it/sms_new_order.txt new file mode 100755 index 000000000..18d7a1452 --- /dev/null +++ b/modules/tm4b/mails/it/sms_new_order.txt @@ -0,0 +1,5 @@ +{shop_name} +Cliente: {firstname} {lastname} +Ordine: {order_name} +Pagamento: {payment} +Totale TI: ({total_paid} {currency}) diff --git a/modules/tm4b/mails/it/sms_out_of_stock.txt b/modules/tm4b/mails/it/sms_out_of_stock.txt new file mode 100755 index 000000000..b81273f04 --- /dev/null +++ b/modules/tm4b/mails/it/sms_out_of_stock.txt @@ -0,0 +1,5 @@ +{shop_name} +Questo prodotto sarà presto non disponibile: +Rif: {product_ref} +Id: {product_id} +Qtà: {qty} \ No newline at end of file diff --git a/modules/tm4b/prefs.gif b/modules/tm4b/prefs.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a1f43562f26ba1c172ff8f19febdf520f899ea1 GIT binary patch literal 351 zcmZ?wbhEHb6krfwxXQrL*4FmFMq&T{{r~s$EMLC-|LXkf*RQ{u8TWfZ;{WLZ|IaR) zJbCi-=gM(N{|`;yvSrK6nKSR+y?f@&neSVh-@SYHe@;+$clYYmt3NHv z`@cNv|NhDUkIeetpz(ih#Q$?^|1V4ZzqRTA`m+E3|1(eTa9MO|;p9n*iTiFIJ>sa4!o%<~C9#0xUXw~-V5Egc z-yVhsGrC=**aR6`%8L29xLDaG#Dcgwn3-icIQl2@^UKP!dUGjrF)J$x$V&%_FI+4j fzC4ImwqAf!F;YcQQDF1dZ7Q5{jMMfyGFSruy83zV literal 0 HcmV?d00001 diff --git a/modules/tm4b/tm4b.php b/modules/tm4b/tm4b.php new file mode 100644 index 000000000..b57fdad87 --- /dev/null +++ b/modules/tm4b/tm4b.php @@ -0,0 +1,399 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class Tm4b extends Module +{ + private $_html = ''; + private $_postErrors = array(); + private $_postSucess; + + private $_data; + private $_password; + private $_user; + private $_originator; + private $_route; + private $_simulation; + private $_new_order_numbers; + + private $_alert_new_order_active; + private $_alert_update_quantity_active; + private $_daily_report_active; + + public $token; + + const __TM4B_LOWBALANCE__ = '20'; + const __TM4B_NUMBER_DELIMITOR__ = ','; + + static private $_tpl_sms_files = array( + 'name' => array( + 'new_orders' => 'sms_new_order', + 'out_of_stock' => 'sms_out_of_stock' + ), + 'ext' => array( + 'new_orders' => '.txt', + 'out_of_stock' => '.txt' + ) + ); + + public function __construct() + { + $this->name = 'tm4b'; + $this->displayName = 'SMS Tm4b'; + $this->description = $this->l('Sends an SMS for each new order'); + $this->tab = 'administration'; + $this->version = 1.1; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + if ($this->id) + { + $this->_data = array('shopname' => Configuration::get('PS_SHOP_NAME')); + + /* Get config vars */ + $this->_password = Configuration::get('TM4B_PASSWORD'); + $this->_user = Configuration::get('TM4B_USER'); + $this->_originator = Configuration::get('TM4B_ORIGINATOR'); + $this->_route = Configuration::get('TM4B_ROUTE'); + $this->_simulation = Configuration::get('TM4B_SIM'); + $this->_new_order_numbers = Configuration::get('TM4B_NEW_ORDER_NUMBERS'); + + $this->_alert_new_order_active = Configuration::get('TM4B_ALERT_NO_ACTIVE'); + $this->_alert_update_quantity_active = Configuration::get('TM4B_ALERT_UQ_ACTIVE'); + $this->_daily_report_active = Configuration::get('TM4B_DAILY_REPORT_ACTIVE'); + } + + $this->displayName = 'SMS Tm4b'; + $this->description = $this->l('Sends an SMS for each new order'); + $this->confirmUninstall = $this->l('Are you sure you want to delete your info?'); + + $this->token = md5('tm4b'._COOKIE_KEY_); + } + + public function install() + { + if (!parent::install() OR + !$this->registerHook('newOrder') OR + !$this->registerHook('updateQuantity')) + return false; + + Configuration::updateValue('TM4B_SIM', 1); + Configuration::updateValue('TM4B_ALERT_NO_ACTIVE', 1); + Configuration::updateValue('TM4B_ALERT_UQ_ACTIVE', 1); + Configuration::updateValue('TM4B_DAILY_REPORT_ACTIVE', 0); + return true; + } + + public function uninstall() + { + Configuration::deleteByName('TM4B_PASSWORD'); + Configuration::deleteByName('TM4B_USER'); + Configuration::deleteByName('TM4B_ORIGINATOR'); + Configuration::deleteByName('TM4B_ROUTE'); + Configuration::deleteByName('TM4B_SIM'); + Configuration::deleteByName('TM4B_NEW_ORDER_NUMBERS'); + Configuration::deleteByName('TM4B_ALERT_NO_ACTIVE'); + Configuration::deleteByName('TM4B_ALERT_UQ_ACTIVE'); + Configuration::deleteByName('TM4B_DAILY_REPORT_ACTIVE'); + Configuration::deleteByName('TM4B_LAST_REPORT'); + + return parent::uninstall(); + } + + private function _getTplBody($tpl_file, $vars = array()) + { + $iso = Language::getIsoById((int)(Configuration::get('PS_LANG_DEFAULT'))); + $file = dirname(__FILE__).'/mails/'.$iso.'/'.$tpl_file; + if (!file_exists($file)) + die($file); + $tpl = file($file); + $template = str_replace(array_keys($vars), array_values($vars), $tpl); + return (implode("\n", $template)); + } + + public function hookNewOrder($params) + { + require_once (dirname(__FILE__).'/classes/Tm4bSms.php'); + + if ( !(int)($this->_alert_new_order_active) OR empty($this->_user) OR empty($this->_password) + OR empty($this->_new_order_numbers)) + return ; + $order = $params['order']; + $customer = $params['customer']; + $currency = $params['currency']; + + $templateVars = array( + '{firstname}' => utf8_decode($customer->firstname), + '{lastname}' => utf8_decode($customer->lastname), + '{order_name}' => sprintf("%06d", $order->id), + '{shop_name}' => Configuration::get('PS_SHOP_NAME'), + '{payment}' => $order->payment, + '{total_paid}' => $order->total_paid, + '{currency}' => $currency->sign); + + $body = $this->_getTplBody(self::$_tpl_sms_files['name']['new_orders'].self::$_tpl_sms_files['ext']['new_orders'], $templateVars); + + $sms = new Tm4bSms($this->_user, $this->_password, $this->_route, $this->_originator); + $sms->msg = $body; + $numbers = explode(self::__TM4B_NUMBER_DELIMITOR__, $this->_new_order_numbers); + foreach ($numbers as $number) + if ($number != '') + $sms->addRecipient($number); + $sms->Send($this->_simulation); + } + + public function hookUpdateQuantity($params) + { + require_once (dirname(__FILE__).'/classes/Tm4bSms.php'); + if (!(int)($this->_alert_update_quantity_active) OR empty($this->_new_order_numbers)) + return ; + + if (is_object($params['product'])) + $params['product'] = get_object_vars($params['product']); + + $product = $params['product']; + + $qty = (int)($params['product']['quantity_attribute'] ? $params['product']['quantity_attribute'] : $params['product']['stock_quantity']) - (int)($params['product']['quantity']); + if ($qty <= (int)(Configuration::get('PS_LAST_QTIES'))) + { + $templateVars = array( + '{last_qty}' => (int)(Configuration::get('PS_LAST_QTIES')), + '{qty}' => $qty, + '{product}' => strval($params['product']['name'])); + + $body = $this->_getTplBody(self::$_tpl_sms_files['name']['out_of_stock'].self::$_tpl_sms_files['ext']['out_of_stock'], $templateVars); + } + + if (!empty($body)) + { + $sms = new Tm4bSms($this->_user, $this->_password, $this->_route, $this->_originator); + $sms->msg = $body; + $numbers = explode(self::__TM4B_NUMBER_DELIMITOR__, $this->_new_order_numbers); + foreach ($numbers as $number) + if ($number != '') + $sms->addRecipient($number); + $sms->Send($this->_simulation); + } + } + + public function getContent() + { + require_once (dirname(__FILE__).'/classes/Tm4bSms.php'); + + $this->_html = '

    '.$this->displayName.'

    '; + + if (!empty($_POST)) + { + if (isset($_POST['btnTestSms'])) + { + if (!empty($this->_user) AND !empty($this->_password) AND !empty($_POST['test_number']) AND is_numeric($_POST['test_number'])) + { + $sms = new Tm4bSms($this->_user, $this->_password, $this->_route, $this->_originator); + $sms->msg = 'Test SMS for your PrestaShop website'; + $sms->addRecipient($_POST['test_number']); + $ret = $sms->Send($this->_simulation); + if ($sms->isSent()) + $this->_html .= $this->displayConfirmation($this->l('Message sent')); + else + $this->_html .= $this->displayError($this->l('Error while sending message')); + } + else + $this->_html .= $this->displayError($this->l('Login and phone number')); + } + else + { + $this->_postValidation(); + if (!sizeof($this->_postErrors)) + $this->_postProcess(); + else + foreach ($this->_postErrors AS $err) + $this->_html .= $this->displayError($err); + } + } + + $this->_displayTm4b(); + $this->_displayForm(); + + return $this->_html; + } + + private function _displayTm4b() + { + require_once (dirname(__FILE__).'/classes/Tm4bSms.php'); + + $testsms_txt = 'Send'; + + $this->_html .= ' +
    '.$this->l('Information').' +
    + +
    +
    '.$this->l('ex: 33642424242').'
    '; + if (!empty($this->_user) AND !empty($this->_password)) + { + $sms = new Tm4bSms($this->_user, $this->_password, $this->_route, $this->_originator); + $credits = $sms->CheckCredits(); + $color = ($credits < self::__TM4B_LOWBALANCE__ ? '#900' : '#080'); + $this->_html .= ' +
    '.$this->l('You have').' '.$credits.' '.$this->l('credits').'
    '; + } + $this->_html .= ' +
    +

    +
    + '.$this->l('Information about CRON tab').' + + + http://'.Tools::getShopDomain().__PS_BASE_URI__.'modules/'.$this->name.'/cron.php?token='.$this->token.' +

    '; + } + + private function _displayForm() + { + if (Tools::isSubmit('btnSubmit')) + { + if ($this->_user) + { + $_POST['user'] = $this->_user; + $_POST['password'] = $this->_password; + $_POST['route'] = $this->_route; + $_POST['originator'] = $this->_originator; + $_POST['simulation'] = $this->_simulation; + $_POST['new_order_numbers'] = str_replace(self::__TM4B_NUMBER_DELIMITOR__, "\n", $this->_new_order_numbers); + $_POST['alert_new_order'] = $this->_alert_new_order_active; + $_POST['alert_update_quantity'] = $this->_alert_update_quantity_active; + $_POST['daily_report'] = $this->_daily_report_active; + } + } + + $this->_html .= ' +
    + '.$this->l('Settings').' +
    + +
    + +
    + +
    + +

    '.$this->l('ex: 33642424242').'
    + +
    '.$this->l('Simulation').' +   '.$this->l('Production').'
    +
    + +
     '.$this->l('Yes').'
    '.$this->l('Send SMS if a new order is made').'
    + +
     '.$this->l('Yes').'
    '.$this->l('Send SMS if the stock of product is updated').'
    + +
     '.$this->l('Yes').'
    '.$this->l('Send a daily stats report - You must set a CRON to').' /modules/tm4b/cron.php
    +
    + +

    '.$this->l('ex: 33642424242').'
    +
    +
    +
    +
    '; + } + + private function _postProcess() + { + Configuration::updateValue('TM4B_PASSWORD', Tools::getValue('password')); + Configuration::updateValue('TM4B_USER', Tools::getValue('user')); + Configuration::updateValue('TM4B_ORIGINATOR', Tools::getValue('originator')); + Configuration::updateValue('TM4B_ROUTE', Tools::getValue('route')); + Configuration::updateValue('TM4B_SIM', Tools::getValue('simulation')); + Configuration::updateValue('TM4B_ALERT_NO_ACTIVE', (int)Tools::isSubmit('alert_new_order')); + Configuration::updateValue('TM4B_ALERT_UQ_ACTIVE', (int)Tools::isSubmit('alert_update_quantity')); + Configuration::updateValue('TM4B_DAILY_REPORT_ACTIVE', (int)Tools::isSubmit('daily_report')); + + $numbers = explode("\n", Tools::getValue('new_order_numbers')); + $this->_new_order_numbers = ''; + foreach ($numbers as $number) + { + if (preg_match("/([0-9]+)/", $number, $regs)) + $this->_new_order_numbers .= $regs[1].self::__TM4B_NUMBER_DELIMITOR__; + } + Configuration::updateValue('TM4B_NEW_ORDER_NUMBERS', $this->_new_order_numbers); + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + } + + private function _postValidation() + { + if (!Tools::getValue('user') || Validate::isGenericName(Tools::getValue('user')) != true) + $this->_postErrors[] = $this->l('Username is mandatory'); + elseif (!Tools::getValue('password') || Validate::isPasswd(Tools::getValue('password')) != true) + $this->_postErrors[] = $this->l('Password is mandatory'); + elseif (!Tools::getValue('route') OR (Tools::getValue('route') != 'GD01' AND Tools::getValue('route') != 'GD02' AND Tools::getValue('route') != 'USS1')) + $this->_postErrors[] = $this->l('Route is mandatory'); + elseif (!Tools::getValue('originator')) + $this->_postErrors[] = $this->l('Origin is mandatory'); + elseif (!Tools::isSubmit('simulation') OR (Tools::getValue('simulation') != 0 AND Tools::getValue('simulation') != 1)) + $this->_postErrors[] = $this->l('Mode is mandatory'); + elseif (!Tools::getValue('new_order_numbers')) + $this->_postErrors[] = $this->l('Please enter a phone number'); + elseif (preg_match('/([^0-9[:space:],])/', $_POST['new_order_numbers'], $regs)) + $this->_postErrors[] = $this->l('Phone number invalid'); + } + + public function getStatsBody() + { + $currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT')); + $currency->sign = $currency->iso_code; + $query = ' + SELECT SUM(o.`total_paid_real`) as total_sales, COUNT(o.`total_paid_real`) as total_orders + FROM `'._DB_PREFIX_.'orders` o + WHERE ( + SELECT IF(os.`id_order_state` = 8, 0, 1) + FROM `'._DB_PREFIX_.'orders` oo + LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON oh.`id_order` = oo.`id_order` + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON os.`id_order_state` = oh.`id_order_state` + WHERE oo.`id_order` = o.`id_order` + ORDER BY oh.`date_add` DESC, oh.`id_order_history` DESC + LIMIT 1 + ) = 1 '; + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query.' + AND o.`date_add` >= DATE_SUB(\''.date('Y-m-d').' 20:00:00\', INTERVAL 1 DAY) + AND o.`date_add` < \''.date('Y-m-d').' 20:00:00\''); + $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query.'AND o.`date_add` LIKE \''.date('Y-m').'-%\''); + + return date('Y-m-d')."\n". + $this->l('Orders:').' '.(int)$result['total_orders']."\n". + $this->l('Sales:').' '.Tools::displayPrice($result['total_sales'], $currency, true)."\n". + '('.$this->l('Month:').' '.Tools::displayPrice($result2['total_sales'], $currency, true).')'; + } +} + diff --git a/modules/trackingfront/account.tpl b/modules/trackingfront/account.tpl new file mode 100644 index 000000000..22838b0a7 --- /dev/null +++ b/modules/trackingfront/account.tpl @@ -0,0 +1,70 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
    +
    {l s='Affiliation space' mod='trackingfront'}
    + +
    +
    +
    +
    + + + +

    {l s='From:' mod='trackingfront'}

    +

    {l s='To:' mod='trackingfront'}

    + +
    +
    +
    +
    {$referrer->name} + {foreach from=$displayTab key=data item=label} +
    {$label}
    + {/foreach} +
    +
    +
    + {* + + + + + + + + + + + + + + + + + + +
    {l s='ID' mod='trackingfront'}{l s='Name' mod='trackingfront'}{l s='Visitors' mod='trackingfront'}{l s='Visits' mod='trackingfront'}{l s='Pages' mod='trackingfront'}{l s='Reg.' mod='trackingfront'}{l s='Ord.' mod='trackingfront'}{l s='Sales' mod='trackingfront'}{l s='Cart' mod='trackingfront'}{l s='Reg. rate' mod='trackingfront'}{l s='Ord. rate' mod='trackingfront'}{l s='Click' mod='trackingfront'}{l s='¤' mod='trackingfront'}{l s='%' mod='trackingfront'}
    + *} \ No newline at end of file diff --git a/modules/trackingfront/config.xml b/modules/trackingfront/config.xml new file mode 100755 index 000000000..778379bb5 --- /dev/null +++ b/modules/trackingfront/config.xml @@ -0,0 +1,12 @@ + + + trackingfront + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/trackingfront/de.php b/modules/trackingfront/de.php new file mode 100644 index 000000000..41c07e8ae --- /dev/null +++ b/modules/trackingfront/de.php @@ -0,0 +1,53 @@ +account_8954e140059f7b2544469f40161ba507'] = 'Mitgliederbereich'; +$_MODULE['<{trackingfront}prestashop>account_0323de4f66a1700e2173e9bcdce02715'] = 'Abmelden'; +$_MODULE['<{trackingfront}prestashop>account_1dd1c5fb7f25cd41b291d43a89e3aefd'] = 'Heute'; +$_MODULE['<{trackingfront}prestashop>account_7cbb885aa1164b390a0bc050a64e1812'] = 'Monat'; +$_MODULE['<{trackingfront}prestashop>account_537c66b24ef5c83b7382cdc3f34885f2'] = 'Jahr'; +$_MODULE['<{trackingfront}prestashop>account_1e6d57e813355689e9c77e947d73ad8f'] = 'Von:'; +$_MODULE['<{trackingfront}prestashop>account_33caa076f23f453dd4061726f3706325'] = 'An:'; +$_MODULE['<{trackingfront}prestashop>account_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{trackingfront}prestashop>account_49ee3087348e8d44e1feda1917443987'] = 'Name'; +$_MODULE['<{trackingfront}prestashop>account_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Besucher'; +$_MODULE['<{trackingfront}prestashop>account_d7e637a6e9ff116de2fa89551240a94d'] = 'Besuche'; +$_MODULE['<{trackingfront}prestashop>account_453aceb005ceaf54a47da15fee8b2a26'] = 'Seiten'; +$_MODULE['<{trackingfront}prestashop>account_591411cc8927851db2002208676d8330'] = 'Reg.'; +$_MODULE['<{trackingfront}prestashop>account_a9841e29f2c8180709b16cd2a13c55fe'] = 'Best.'; +$_MODULE['<{trackingfront}prestashop>account_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{trackingfront}prestashop>account_a85eba4c6c699122b2bb1387ea4813ad'] = 'Warenkorb'; +$_MODULE['<{trackingfront}prestashop>account_43005b13d452a4ad6f2d8e29b499c55a'] = 'Reg.-Rate'; +$_MODULE['<{trackingfront}prestashop>account_e14c8640d236365d11a060832b219a11'] = 'Best.-Rate'; +$_MODULE['<{trackingfront}prestashop>account_316853cc3718335f11c048e33b9be98a'] = 'Klicken Sie auf'; +$_MODULE['<{trackingfront}prestashop>account_b450fdef2453e92c31263a70f14fbd7b'] = '¤'; +$_MODULE['<{trackingfront}prestashop>account_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{trackingfront}prestashop>header_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Mitgliedschaft'; +$_MODULE['<{trackingfront}prestashop>login_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Mitgliedschaft'; +$_MODULE['<{trackingfront}prestashop>login_8954e140059f7b2544469f40161ba507'] = 'Mitgliederbereich'; +$_MODULE['<{trackingfront}prestashop>login_99dea78007133396a7b8ed70578ac6ae'] = 'Anmelden'; +$_MODULE['<{trackingfront}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Kennwort'; +$_MODULE['<{trackingfront}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Anmelden'; +$_MODULE['<{trackingfront}prestashop>trackingfront_e8a827db4eca37d2c6cdef8e406f6fa9'] = 'Tracking - Front Office'; +$_MODULE['<{trackingfront}prestashop>trackingfront_68d4e1b474858937b300e27273283f41'] = 'Ermöglichen Sie Ihren Mitgliedern, auf ihre eigenen Statistiken zugreifen.'; +$_MODULE['<{trackingfront}prestashop>trackingfront_8f5ac7793b2547cd025a7335f4934d26'] = 'Anmeldung ist erforderlich '; +$_MODULE['<{trackingfront}prestashop>trackingfront_6f658a5bbec855ca5ae4ef4c94eb5d43'] = 'ungültige Anmeldung'; +$_MODULE['<{trackingfront}prestashop>trackingfront_962c91be4b1056412febf0c272760814'] = 'Kennwort ist erforderlich'; +$_MODULE['<{trackingfront}prestashop>trackingfront_703c2b69e5d9f7072b7db5338214448b'] = 'ungültiges Kennwort'; +$_MODULE['<{trackingfront}prestashop>trackingfront_c41c77e4dddc04b1e0752a6050ae5656'] = 'Authentifizierung fehlgeschlagen'; +$_MODULE['<{trackingfront}prestashop>trackingfront_10965b2740f42ad4887932c35cee26ab'] = 'Einmalige Besucher'; +$_MODULE['<{trackingfront}prestashop>trackingfront_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Besucher'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d7e637a6e9ff116de2fa89551240a94d'] = 'Besuche'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d3139f39f1ad6324c80a9ddd50cc7867'] = 'Setenaufrufe'; +$_MODULE['<{trackingfront}prestashop>trackingfront_a28735af01fbb1e35371cb120985ac47'] = 'Anmeldungen'; +$_MODULE['<{trackingfront}prestashop>trackingfront_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Bestellungen'; +$_MODULE['<{trackingfront}prestashop>trackingfront_2e27c4006a026eacfc1f85b41bf9bc4c'] = 'Grundgebühr'; +$_MODULE['<{trackingfront}prestashop>trackingfront_86190054fc32554662ffbb12b717e8d0'] = 'Prozent-Gebühr'; +$_MODULE['<{trackingfront}prestashop>trackingfront_51d53cd2ecdae6b5dd3397875197e898'] = 'Klick-Gebühr'; +$_MODULE['<{trackingfront}prestashop>trackingfront_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Verkäufe'; +$_MODULE['<{trackingfront}prestashop>trackingfront_da9cb586c6689202ca65cd77fd9b84ef'] = 'Durchschnittlicher Warenkorb'; +$_MODULE['<{trackingfront}prestashop>trackingfront_200f5c9c419f0a53d5d361eff7b33abc'] = 'Anmeldungsrate'; +$_MODULE['<{trackingfront}prestashop>trackingfront_89741aae300253f498b0993fa678fa18'] = 'Bestellrate'; + +?> \ No newline at end of file diff --git a/modules/trackingfront/en.php b/modules/trackingfront/en.php new file mode 100644 index 000000000..601358d4f --- /dev/null +++ b/modules/trackingfront/en.php @@ -0,0 +1,4 @@ +account_8954e140059f7b2544469f40161ba507'] = 'espacio afiliados'; +$_MODULE['<{trackingfront}prestashop>account_0323de4f66a1700e2173e9bcdce02715'] = 'Identificarse'; +$_MODULE['<{trackingfront}prestashop>account_1dd1c5fb7f25cd41b291d43a89e3aefd'] = 'Hoy'; +$_MODULE['<{trackingfront}prestashop>account_7cbb885aa1164b390a0bc050a64e1812'] = 'Mes'; +$_MODULE['<{trackingfront}prestashop>account_537c66b24ef5c83b7382cdc3f34885f2'] = 'Año'; +$_MODULE['<{trackingfront}prestashop>account_1e6d57e813355689e9c77e947d73ad8f'] = 'De: '; +$_MODULE['<{trackingfront}prestashop>account_33caa076f23f453dd4061726f3706325'] = 'a:'; +$_MODULE['<{trackingfront}prestashop>account_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{trackingfront}prestashop>account_49ee3087348e8d44e1feda1917443987'] = 'Nombre'; +$_MODULE['<{trackingfront}prestashop>account_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitantes'; +$_MODULE['<{trackingfront}prestashop>account_d7e637a6e9ff116de2fa89551240a94d'] = 'Visitas'; +$_MODULE['<{trackingfront}prestashop>account_453aceb005ceaf54a47da15fee8b2a26'] = 'Páginas'; +$_MODULE['<{trackingfront}prestashop>account_591411cc8927851db2002208676d8330'] = 'Reg.'; +$_MODULE['<{trackingfront}prestashop>account_a9841e29f2c8180709b16cd2a13c55fe'] = 'Pedido'; +$_MODULE['<{trackingfront}prestashop>account_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventas'; +$_MODULE['<{trackingfront}prestashop>account_a85eba4c6c699122b2bb1387ea4813ad'] = 'carrito'; +$_MODULE['<{trackingfront}prestashop>account_43005b13d452a4ad6f2d8e29b499c55a'] = 'evolución Reg.'; +$_MODULE['<{trackingfront}prestashop>account_e14c8640d236365d11a060832b219a11'] = 'pedido Reg.'; +$_MODULE['<{trackingfront}prestashop>account_316853cc3718335f11c048e33b9be98a'] = 'clic'; +$_MODULE['<{trackingfront}prestashop>account_b450fdef2453e92c31263a70f14fbd7b'] = '¤'; +$_MODULE['<{trackingfront}prestashop>account_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{trackingfront}prestashop>header_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Afiliación'; +$_MODULE['<{trackingfront}prestashop>login_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Afiliación'; +$_MODULE['<{trackingfront}prestashop>login_8954e140059f7b2544469f40161ba507'] = 'Espacio afiliación'; +$_MODULE['<{trackingfront}prestashop>login_99dea78007133396a7b8ed70578ac6ae'] = 'Login'; +$_MODULE['<{trackingfront}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Contraseña'; +$_MODULE['<{trackingfront}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Log in'; +$_MODULE['<{trackingfront}prestashop>trackingfront_e8a827db4eca37d2c6cdef8e406f6fa9'] = 'Tracking-Front office'; +$_MODULE['<{trackingfront}prestashop>trackingfront_68d4e1b474858937b300e27273283f41'] = 'Permitir a sus afiliados a tener acceso a sus estadísticas.'; +$_MODULE['<{trackingfront}prestashop>trackingfront_8f5ac7793b2547cd025a7335f4934d26'] = 'El login es necesario'; +$_MODULE['<{trackingfront}prestashop>trackingfront_6f658a5bbec855ca5ae4ef4c94eb5d43'] = 'login no válido'; +$_MODULE['<{trackingfront}prestashop>trackingfront_962c91be4b1056412febf0c272760814'] = 'se necesita una contraseña'; +$_MODULE['<{trackingfront}prestashop>trackingfront_703c2b69e5d9f7072b7db5338214448b'] = 'contraseña no válida'; +$_MODULE['<{trackingfront}prestashop>trackingfront_c41c77e4dddc04b1e0752a6050ae5656'] = 'autentificación errónea'; +$_MODULE['<{trackingfront}prestashop>trackingfront_10965b2740f42ad4887932c35cee26ab'] = 'Visitantes únicos'; +$_MODULE['<{trackingfront}prestashop>trackingfront_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitantes'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d7e637a6e9ff116de2fa89551240a94d'] = 'Visitas'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d3139f39f1ad6324c80a9ddd50cc7867'] = 'Páginas vistas'; +$_MODULE['<{trackingfront}prestashop>trackingfront_a28735af01fbb1e35371cb120985ac47'] = 'Registros'; +$_MODULE['<{trackingfront}prestashop>trackingfront_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Pedidos'; +$_MODULE['<{trackingfront}prestashop>trackingfront_2e27c4006a026eacfc1f85b41bf9bc4c'] = 'Comisión de base'; +$_MODULE['<{trackingfront}prestashop>trackingfront_86190054fc32554662ffbb12b717e8d0'] = 'Comisión en porcentaje'; +$_MODULE['<{trackingfront}prestashop>trackingfront_51d53cd2ecdae6b5dd3397875197e898'] = 'Comisión por clic'; +$_MODULE['<{trackingfront}prestashop>trackingfront_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventas'; +$_MODULE['<{trackingfront}prestashop>trackingfront_da9cb586c6689202ca65cd77fd9b84ef'] = 'Carrito medio'; +$_MODULE['<{trackingfront}prestashop>trackingfront_200f5c9c419f0a53d5d361eff7b33abc'] = 'Evolución de registros'; +$_MODULE['<{trackingfront}prestashop>trackingfront_89741aae300253f498b0993fa678fa18'] = 'Evolución pedidos'; diff --git a/modules/trackingfront/footer.tpl b/modules/trackingfront/footer.tpl new file mode 100644 index 000000000..061496467 --- /dev/null +++ b/modules/trackingfront/footer.tpl @@ -0,0 +1,28 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + \ No newline at end of file diff --git a/modules/trackingfront/fr.php b/modules/trackingfront/fr.php new file mode 100644 index 000000000..348717da5 --- /dev/null +++ b/modules/trackingfront/fr.php @@ -0,0 +1,51 @@ +account_8954e140059f7b2544469f40161ba507'] = 'Espace affilié'; +$_MODULE['<{trackingfront}prestashop>account_0323de4f66a1700e2173e9bcdce02715'] = 'Déconnexion'; +$_MODULE['<{trackingfront}prestashop>account_1dd1c5fb7f25cd41b291d43a89e3aefd'] = 'Aujourd\'hui'; +$_MODULE['<{trackingfront}prestashop>account_7cbb885aa1164b390a0bc050a64e1812'] = 'Mois'; +$_MODULE['<{trackingfront}prestashop>account_537c66b24ef5c83b7382cdc3f34885f2'] = 'Année'; +$_MODULE['<{trackingfront}prestashop>account_1e6d57e813355689e9c77e947d73ad8f'] = 'Du'; +$_MODULE['<{trackingfront}prestashop>account_33caa076f23f453dd4061726f3706325'] = 'au'; +$_MODULE['<{trackingfront}prestashop>account_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{trackingfront}prestashop>account_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{trackingfront}prestashop>account_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visiteurs'; +$_MODULE['<{trackingfront}prestashop>account_d7e637a6e9ff116de2fa89551240a94d'] = 'Visites'; +$_MODULE['<{trackingfront}prestashop>account_453aceb005ceaf54a47da15fee8b2a26'] = 'Pages vues'; +$_MODULE['<{trackingfront}prestashop>account_591411cc8927851db2002208676d8330'] = 'Inscriptions'; +$_MODULE['<{trackingfront}prestashop>account_a9841e29f2c8180709b16cd2a13c55fe'] = 'Com.'; +$_MODULE['<{trackingfront}prestashop>account_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventes'; +$_MODULE['<{trackingfront}prestashop>account_a85eba4c6c699122b2bb1387ea4813ad'] = 'Panier'; +$_MODULE['<{trackingfront}prestashop>account_43005b13d452a4ad6f2d8e29b499c55a'] = 'Tx insc.'; +$_MODULE['<{trackingfront}prestashop>account_e14c8640d236365d11a060832b219a11'] = 'Tx com.'; +$_MODULE['<{trackingfront}prestashop>account_316853cc3718335f11c048e33b9be98a'] = 'Clics'; +$_MODULE['<{trackingfront}prestashop>account_b450fdef2453e92c31263a70f14fbd7b'] = '¤'; +$_MODULE['<{trackingfront}prestashop>account_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{trackingfront}prestashop>header_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Affiliation'; +$_MODULE['<{trackingfront}prestashop>login_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Affiliation'; +$_MODULE['<{trackingfront}prestashop>login_8954e140059f7b2544469f40161ba507'] = 'Espace affilié'; +$_MODULE['<{trackingfront}prestashop>login_99dea78007133396a7b8ed70578ac6ae'] = 'Identifiant'; +$_MODULE['<{trackingfront}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Mot de passe'; +$_MODULE['<{trackingfront}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Connexion'; +$_MODULE['<{trackingfront}prestashop>trackingfront_e8a827db4eca37d2c6cdef8e406f6fa9'] = 'Affiliation - Accès boutique'; +$_MODULE['<{trackingfront}prestashop>trackingfront_68d4e1b474858937b300e27273283f41'] = 'Permet aux affiliés de consulter leurs statistiques'; +$_MODULE['<{trackingfront}prestashop>trackingfront_8f5ac7793b2547cd025a7335f4934d26'] = 'identifiant requis'; +$_MODULE['<{trackingfront}prestashop>trackingfront_6f658a5bbec855ca5ae4ef4c94eb5d43'] = 'identifiant invalide'; +$_MODULE['<{trackingfront}prestashop>trackingfront_962c91be4b1056412febf0c272760814'] = 'mot de passe requis'; +$_MODULE['<{trackingfront}prestashop>trackingfront_703c2b69e5d9f7072b7db5338214448b'] = 'mot de passe invalide'; +$_MODULE['<{trackingfront}prestashop>trackingfront_c41c77e4dddc04b1e0752a6050ae5656'] = 'identifiation échouée'; +$_MODULE['<{trackingfront}prestashop>trackingfront_10965b2740f42ad4887932c35cee26ab'] = 'Visiteurs uniques'; +$_MODULE['<{trackingfront}prestashop>trackingfront_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visiteurs'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d7e637a6e9ff116de2fa89551240a94d'] = 'Visites'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d3139f39f1ad6324c80a9ddd50cc7867'] = 'Pages vues'; +$_MODULE['<{trackingfront}prestashop>trackingfront_a28735af01fbb1e35371cb120985ac47'] = 'Inscriptions'; +$_MODULE['<{trackingfront}prestashop>trackingfront_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Commandes'; +$_MODULE['<{trackingfront}prestashop>trackingfront_2e27c4006a026eacfc1f85b41bf9bc4c'] = 'Commission €'; +$_MODULE['<{trackingfront}prestashop>trackingfront_86190054fc32554662ffbb12b717e8d0'] = 'Commission %'; +$_MODULE['<{trackingfront}prestashop>trackingfront_51d53cd2ecdae6b5dd3397875197e898'] = 'Commission au clic'; +$_MODULE['<{trackingfront}prestashop>trackingfront_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Ventes'; +$_MODULE['<{trackingfront}prestashop>trackingfront_da9cb586c6689202ca65cd77fd9b84ef'] = 'Panier moyen'; +$_MODULE['<{trackingfront}prestashop>trackingfront_200f5c9c419f0a53d5d361eff7b33abc'] = 'Taux d\'inscription'; +$_MODULE['<{trackingfront}prestashop>trackingfront_89741aae300253f498b0993fa678fa18'] = 'Taux de commandes'; diff --git a/modules/trackingfront/header.tpl b/modules/trackingfront/header.tpl new file mode 100644 index 000000000..6eecf5f5b --- /dev/null +++ b/modules/trackingfront/header.tpl @@ -0,0 +1,36 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + + PrestaShop™ - {l s='Affiliation' mod='trackingfront'} + + + + + \ No newline at end of file diff --git a/modules/trackingfront/it.php b/modules/trackingfront/it.php new file mode 100644 index 000000000..342d7553c --- /dev/null +++ b/modules/trackingfront/it.php @@ -0,0 +1,53 @@ +account_8954e140059f7b2544469f40161ba507'] = 'Spazio affiliazione'; +$_MODULE['<{trackingfront}prestashop>account_0323de4f66a1700e2173e9bcdce02715'] = 'Logout'; +$_MODULE['<{trackingfront}prestashop>account_1dd1c5fb7f25cd41b291d43a89e3aefd'] = 'Oggi'; +$_MODULE['<{trackingfront}prestashop>account_7cbb885aa1164b390a0bc050a64e1812'] = 'Mese'; +$_MODULE['<{trackingfront}prestashop>account_537c66b24ef5c83b7382cdc3f34885f2'] = 'Anno'; +$_MODULE['<{trackingfront}prestashop>account_1e6d57e813355689e9c77e947d73ad8f'] = 'Da:'; +$_MODULE['<{trackingfront}prestashop>account_33caa076f23f453dd4061726f3706325'] = 'A:'; +$_MODULE['<{trackingfront}prestashop>account_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{trackingfront}prestashop>account_49ee3087348e8d44e1feda1917443987'] = 'Nome'; +$_MODULE['<{trackingfront}prestashop>account_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitatori'; +$_MODULE['<{trackingfront}prestashop>account_d7e637a6e9ff116de2fa89551240a94d'] = 'Visite'; +$_MODULE['<{trackingfront}prestashop>account_453aceb005ceaf54a47da15fee8b2a26'] = 'Pagine'; +$_MODULE['<{trackingfront}prestashop>account_591411cc8927851db2002208676d8330'] = 'Reg.'; +$_MODULE['<{trackingfront}prestashop>account_a9841e29f2c8180709b16cd2a13c55fe'] = 'Ord.'; +$_MODULE['<{trackingfront}prestashop>account_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{trackingfront}prestashop>account_a85eba4c6c699122b2bb1387ea4813ad'] = 'Carrello'; +$_MODULE['<{trackingfront}prestashop>account_43005b13d452a4ad6f2d8e29b499c55a'] = 'Tasso di reg.'; +$_MODULE['<{trackingfront}prestashop>account_e14c8640d236365d11a060832b219a11'] = 'Tasso di ord.'; +$_MODULE['<{trackingfront}prestashop>account_316853cc3718335f11c048e33b9be98a'] = 'Fare clic su'; +$_MODULE['<{trackingfront}prestashop>account_b450fdef2453e92c31263a70f14fbd7b'] = '¤'; +$_MODULE['<{trackingfront}prestashop>account_0bcef9c45bd8a48eda1b26eb0c61c869'] = '%'; +$_MODULE['<{trackingfront}prestashop>header_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Affiliazione'; +$_MODULE['<{trackingfront}prestashop>login_bf15e68d25d8a2b7664950ba7385ed0a'] = 'Affiliazione'; +$_MODULE['<{trackingfront}prestashop>login_8954e140059f7b2544469f40161ba507'] = 'Spazio affiliazione'; +$_MODULE['<{trackingfront}prestashop>login_99dea78007133396a7b8ed70578ac6ae'] = 'Login'; +$_MODULE['<{trackingfront}prestashop>login_dc647eb65e6711e155375218212b3964'] = 'Password'; +$_MODULE['<{trackingfront}prestashop>login_bffe9a3c9a7e00ba00a11749e022d911'] = 'Entra'; +$_MODULE['<{trackingfront}prestashop>trackingfront_e8a827db4eca37d2c6cdef8e406f6fa9'] = 'Tracking - Front office'; +$_MODULE['<{trackingfront}prestashop>trackingfront_68d4e1b474858937b300e27273283f41'] = 'Permetti ai tuoi affiliati di accedere alle proprie statistiche.'; +$_MODULE['<{trackingfront}prestashop>trackingfront_8f5ac7793b2547cd025a7335f4934d26'] = 'È richiesto il login'; +$_MODULE['<{trackingfront}prestashop>trackingfront_6f658a5bbec855ca5ae4ef4c94eb5d43'] = 'accesso non valido'; +$_MODULE['<{trackingfront}prestashop>trackingfront_962c91be4b1056412febf0c272760814'] = 'è richiesta la password'; +$_MODULE['<{trackingfront}prestashop>trackingfront_703c2b69e5d9f7072b7db5338214448b'] = 'password non valida'; +$_MODULE['<{trackingfront}prestashop>trackingfront_c41c77e4dddc04b1e0752a6050ae5656'] = 'autenticazione fallita'; +$_MODULE['<{trackingfront}prestashop>trackingfront_10965b2740f42ad4887932c35cee26ab'] = 'Visitatori unici'; +$_MODULE['<{trackingfront}prestashop>trackingfront_ae5d01b6efa819cc7a7c05a8c57fcc2c'] = 'Visitatori'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d7e637a6e9ff116de2fa89551240a94d'] = 'Visite'; +$_MODULE['<{trackingfront}prestashop>trackingfront_d3139f39f1ad6324c80a9ddd50cc7867'] = 'Pagine viste'; +$_MODULE['<{trackingfront}prestashop>trackingfront_a28735af01fbb1e35371cb120985ac47'] = 'Registrazioni'; +$_MODULE['<{trackingfront}prestashop>trackingfront_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Ordini'; +$_MODULE['<{trackingfront}prestashop>trackingfront_2e27c4006a026eacfc1f85b41bf9bc4c'] = 'Tariffa di base'; +$_MODULE['<{trackingfront}prestashop>trackingfront_86190054fc32554662ffbb12b717e8d0'] = 'Tariffa percentuale'; +$_MODULE['<{trackingfront}prestashop>trackingfront_51d53cd2ecdae6b5dd3397875197e898'] = 'Tariffa clic'; +$_MODULE['<{trackingfront}prestashop>trackingfront_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Vendite'; +$_MODULE['<{trackingfront}prestashop>trackingfront_da9cb586c6689202ca65cd77fd9b84ef'] = 'Carrello medio'; +$_MODULE['<{trackingfront}prestashop>trackingfront_200f5c9c419f0a53d5d361eff7b33abc'] = 'Tasso registrazione'; +$_MODULE['<{trackingfront}prestashop>trackingfront_89741aae300253f498b0993fa678fa18'] = 'Tasso ordini'; + +?> \ No newline at end of file diff --git a/modules/trackingfront/login.tpl b/modules/trackingfront/login.tpl new file mode 100644 index 000000000..7c86fa210 --- /dev/null +++ b/modules/trackingfront/login.tpl @@ -0,0 +1,57 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + + + PrestaShop™ - {l s='Affiliation' mod='trackingfront'} + + + {include file="$tpl_dir./errors.tpl"} +
    +
    +
    {l s='Affiliation space' mod='trackingfront'}
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/modules/trackingfront/logo.gif b/modules/trackingfront/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..117f9626ed287da0fc9f4600ee371f67ef5e6613 GIT binary patch literal 1073 zcmZ?wbhEHb6krfw_|5V(o6zc%*yfVf=U+5EqHxCfs(BYn7u>2^bnSXY z!t40R4^csnvi%;_g?>m4`=6cquQ2IzO<~u(xW?6qZL3S#cP6y&O6cB|)VnLCXHRPX zp7j3RSv~vnrmnA>zqNEjbJ&_i@w=B4Y~Nqre=vXY;o|8h%cq~HnsKaj=BbidC+p{) ztJ`)saQpe9W9?zrJ3{Zz4?D27D-Fx<_OH3twf1h$x_f;a z?oHotW#We0^S9q@Uj1mw<_FVvy`HoE!HgZx=I?s6c-O6Ed+sgV`(*z4hJ`2FmYwQZ zd97>Zt*2nU7EV_+N3R4rf$4CW80NEdu}h;{c!TuqX(B9db9H2 z)0M~Ht~>r}(}}0ME`B_6Z}zFHGw$DQynny<%B|^VudKQMeC~y3yPn-_|8=?L<@1JD zFB@OIY<=~z`_-$iSFa|#em&*&>*=50PW}F={mYl0k00m%`Z4q8&$&N;&VT!Q$*-S_ ze*Rqc>(~0(}32x&HRrwKvzVzq@kf)y*4kuiboi<;J_Kx87fS{pIzW zudm;HdH3%7n|I&ezWw(8{f~D)et-Y*2Z(z+V-s(S66-I3eyQ+BWAK-DW_+r+w>`4UIwL| zmf%~ikkccQ$}&;gb3@9{O$(dZ0tLas(Bw+ z@KDH&TXV@)8^=>2tu3OOH7q|Fw>(?b95sW>bykuK%M|IxODhDMvku+#pKRs2>Pw>F zAhnXixN*Y8=NZc;A!lk<8z{A8xEM3-J2_Y5?iPsj$C|8VDnsJ8dsSvHu j8{tbATv+7C&Bgl9kZ*#)!aYAZIoMbv5+1}mFjxZs-h1av literal 0 HcmV?d00001 diff --git a/modules/trackingfront/stats.php b/modules/trackingfront/stats.php new file mode 100644 index 000000000..9524b630e --- /dev/null +++ b/modules/trackingfront/stats.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7091 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__).'/trackingfront.php'); + +$tf = new TrackingFront(); +if (!$tf->active) + Tools::redirect('index.php?controller=404'); +$tf->postProcess(); +echo $tf->isLogged() ? $tf->displayAccount() : $tf->displayLogin(); + diff --git a/modules/trackingfront/trackingfront.php b/modules/trackingfront/trackingfront.php new file mode 100644 index 000000000..1f0d9de2f --- /dev/null +++ b/modules/trackingfront/trackingfront.php @@ -0,0 +1,265 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class TrackingFront extends Module +{ + public function __construct() + { + $this->name = 'trackingfront'; + $this->tab = 'shipping_logistics'; + $this->version = 1.0; + $this->author = 'PrestaShop'; + $this->need_instance = 0; + + parent::__construct(); + + $this->displayName = $this->l('Tracking - Front office'); + $this->description = $this->l('Enable your affiliates to access their own statistics.'); + } + + public function postProcess() + { + global $cookie, $smarty; + + if (Tools::isSubmit('ajaxProductFilter')) + { + $fakeEmployee = new Employee(); + $fakeEmployee->stats_date_from = $cookie->stats_date_from; + $fakeEmployee->stats_date_to = $cookie->stats_date_to; + $result = Db::getInstance()->getRow(' + SELECT `id_referrer` + FROM `'._DB_PREFIX_.'referrer` + WHERE `id_referrer` = '.(int)(Tools::getValue('id_referrer')).' AND `passwd` = \''.pSQL(Tools::getValue('token')).'\''); + if (isset($result['id_referrer']) ? $result['id_referrer'] : false) + Referrer::getAjaxProduct((int)(Tools::getValue('id_referrer')), (int)(Tools::getValue('id_product')), $fakeEmployee); + } + elseif (Tools::isSubmit('logout_tracking')) + { + unset($cookie->tracking_id); + unset($cookie->tracking_passwd); + Tools::redirect('modules/trackingfront/stats.php'); + } + elseif (Tools::isSubmit('submitLoginTracking')) + { + $errors = array(); + $login = trim(Tools::getValue('login')); + $passwd = trim(Tools::getValue('passwd')); + if (empty($login)) + $errors[] = $this->l('login is required'); + elseif (!Validate::isGenericName($login)) + $errors[] = $this->l('invalid login'); + elseif (empty($passwd)) + $errors[] = $this->l('password is required'); + elseif (!Validate::isPasswd($passwd,1)) + $errors[] = $this->l('invalid password'); + else + { + $passwd = Tools::encrypt($passwd); + $result = Db::getInstance()->getRow(' + SELECT `id_referrer` + FROM `'._DB_PREFIX_.'referrer` + WHERE `name` = \''.pSQL($login).'\' AND `passwd` = \''.pSQL($passwd).'\''); + if (!isset($result['id_referrer']) OR !($tracking_id = (int)($result['id_referrer']))) + $errors[] = $this->l('authentication failed'); + else + { + $cookie->tracking_id = $tracking_id; + $cookie->tracking_passwd = $passwd; + Tools::redirect('modules/trackingfront/stats.php'); + } + } + $smarty->assign('errors', $errors); + } + + if (Tools::isSubmit('submitDatePicker')) + { + $cookie->stats_date_from = Tools::getValue('datepickerFrom'); + $cookie->stats_date_to = Tools::getValue('datepickerTo'); + } + if (Tools::isSubmit('submitDateDay')) + { + $from = date('Y-m-d'); + $to = date('Y-m-d'); + } + if (Tools::isSubmit('submitDateDayPrev')) + { + $yesterday = time() - 60*60*24; + $from = date('Y-m-d', $yesterday); + $to = date('Y-m-d', $yesterday); + } + if (Tools::isSubmit('submitDateMonth')) + { + $from = date('Y-m-01'); + $to = date('Y-m-t'); + } + if (Tools::isSubmit('submitDateMonthPrev')) + { + $m = (date('m') == 1 ? 12 : date('m') - 1); + $y = ($m == 12 ? date('Y') - 1 : date('Y')); + $from = $y.'-'.$m.'-01'; + $to = $y.'-'.$m.date('-t', mktime(12, 0, 0, $m, 15, $y)); + } + if (Tools::isSubmit('submitDateYear')) + { + $from = date('Y-01-01'); + $to = date('Y-12-31'); + } + if (Tools::isSubmit('submitDateYearPrev')) + { + $from = (date('Y') - 1).date('-01-01'); + $to = (date('Y') - 1).date('-12-31'); + } + } + + public function isLogged() + { + global $cookie; + if (!$cookie->tracking_id OR !$cookie->tracking_passwd) + return false; + $result = Db::getInstance()->getRow(' + SELECT `id_referrer` + FROM `'._DB_PREFIX_.'referrer` + WHERE `id_referrer` = '.(int)($cookie->tracking_id).' AND `passwd` = \''.pSQL($cookie->tracking_passwd).'\''); + return isset($result['id_referrer']) ? $result['id_referrer'] : false; + } + + public function displayLogin() + { + return $this->display(__FILE__, 'login.tpl'); + } + + public function displayAccount() + { + global $smarty, $cookie; + + if (!isset($cookie->stats_date_from)) + $cookie->stats_date_from = date('Y-m-d'); + if (!isset($cookie->stats_date_to)) + $cookie->stats_date_to = date('Y-m-t'); + $fakeEmployee = new Employee(); + $fakeEmployee->stats_date_from = $cookie->stats_date_from; + $fakeEmployee->stats_date_to = $cookie->stats_date_to; + Referrer::refreshCache(array(array('id_referrer' => (int)($cookie->tracking_id))), $fakeEmployee); + + $referrer = new Referrer((int)($cookie->tracking_id)); + $smarty->assign('referrer', $referrer); + $smarty->assign('datepickerFrom', $fakeEmployee->stats_date_from); + $smarty->assign('datepickerTo', $fakeEmployee->stats_date_to); + + $displayTab = array( + 'uniqs' => $this->l('Unique visitors'), + 'visitors' => $this->l('Visitors'), + 'visits' => $this->l('Visits'), + 'pages' => $this->l('Pages viewed'), + 'registrations' => $this->l('Registrations'), + 'orders' => $this->l('Orders'), + 'base_fee' => $this->l('Base fee'), + 'percent_fee' => $this->l('Percent fee'), + 'click_fee' => $this->l('Click fee'), + 'sales' => $this->l('Sales'), + 'cart' => $this->l('Average cart'), + 'reg_rate' => $this->l('Registration rate'), + 'order_rate' => $this->l('Order rate')); + $smarty->assign('displayTab', $displayTab); + + $products = Product::getSimpleProducts((int)($cookie->id_lang)); + $productsArray = array(); + foreach ($products as $product) + $productsArray[] = $product['id_product']; + + $echo = ' + + '; + + $echo2 = ' + '; + + return $this->display(__FILE__, 'header.tpl').$echo.$this->display(__FILE__, 'account.tpl').$echo2; + } +} + diff --git a/modules/treepodia/add-to-cart.tpl b/modules/treepodia/add-to-cart.tpl new file mode 100644 index 000000000..e41dc687b --- /dev/null +++ b/modules/treepodia/add-to-cart.tpl @@ -0,0 +1,57 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{literal} + +{/literal} \ No newline at end of file diff --git a/modules/treepodia/api/get_data_feed.php b/modules/treepodia/api/get_data_feed.php new file mode 100644 index 000000000..6ff53de19 --- /dev/null +++ b/modules/treepodia/api/get_data_feed.php @@ -0,0 +1,19 @@ +generateXmlFlow(); +} +else + die ('Bad token'); + +?> diff --git a/modules/treepodia/api/ping.php b/modules/treepodia/api/ping.php new file mode 100644 index 000000000..88aa0bcea --- /dev/null +++ b/modules/treepodia/api/ping.php @@ -0,0 +1,3 @@ + + + treepodia + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/treepodia/de.php b/modules/treepodia/de.php new file mode 100644 index 000000000..0f102d029 --- /dev/null +++ b/modules/treepodia/de.php @@ -0,0 +1,38 @@ +treepodia_63003285187eda3cbab5be4c64b19da7'] = 'Bestücken Sie Ihren gesamten Katalog mit Produkt-Videos in nur 24 Stunden'; +$_MODULE['<{treepodia}prestashop>treepodia_e0f18214ada56df05a4cb4f2834a6bbd'] = 'Sie haben Ihre Treepodia-Konfiguration noch nicht eingestellt'; +$_MODULE['<{treepodia}prestashop>treepodia_84d2e2420a102446904946c6611610e7'] = 'Wählen Sie ein Bild unten oder laden Sie ein neues.'; +$_MODULE['<{treepodia}prestashop>treepodia_93f1004ef4f6180d1ff4c3e5e097535a'] = 'Neues Logo:'; +$_MODULE['<{treepodia}prestashop>treepodia_9fab8fa8c181098a13b1a360cbc6ff95'] = 'Es ist bekannt, dass Produktvideos Umsätze, Kundenengagement und -Treue erhöhen, und wesentlich zum Verkaufserlebnis Ihrer Käufer beitragen. Sie verstärken ebenso sehr das allgemeine Verkaufserlebnis Ihrer Käufer und haben einen extrem positiven Effekt auf Ihre Sichtbarkeit in den Suchmaschinen.'; +$_MODULE['<{treepodia}prestashop>treepodia_d59048f21fd887ad520398ce677be586'] = 'Erfahren Sie mehr'; +$_MODULE['<{treepodia}prestashop>treepodia_5f9c47215d373f15d8ab231a7803eafb'] = 'Mein Treepodia-Konto '; +$_MODULE['<{treepodia}prestashop>treepodia_14d4af7e8b50a553a484be490748b8f8'] = 'Sie sind noch nicht für einen Treepodia Video-Konto angemeldet. Bitte melden Sie sich bei Treepodia an.'; +$_MODULE['<{treepodia}prestashop>treepodia_0f98b7f230f3c91292f0de4c99e263f2'] = 'Anmeldung'; +$_MODULE['<{treepodia}prestashop>treepodia_7f4f7010abf7fb495ffe34fad24dfc96'] = 'Video-Konto-Code'; +$_MODULE['<{treepodia}prestashop>treepodia_95df9efce09730856d2674c630a1a35a'] = 'Ihr Video-Konto-Code identifiziert ausschließlich Ihren Shop, und wurde Ihnen automatisch zugewiesen.'; +$_MODULE['<{treepodia}prestashop>treepodia_35ac6a06187c6dab85b3024e3f457dd9'] = 'Melden Sie sich in Ihrem Video-Konto an, um Ihre Präferenzen und Einstellungen zu ändern und Ihren Geschäftsentwicklungsbericht einzusehen.'; +$_MODULE['<{treepodia}prestashop>treepodia_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Anmelden'; +$_MODULE['<{treepodia}prestashop>treepodia_f4f70727dc34561dfde1a3c529b6205c'] = 'Einstellungen'; +$_MODULE['<{treepodia}prestashop>treepodia_1e26f63fb925b49c1c741197cdc0dc7b'] = 'Verwenden Sie die vordefinierte Integration'; +$_MODULE['<{treepodia}prestashop>treepodia_d7cf3a48c409acbac7598ca616569864'] = 'Die vordefinierte Integration bettet den Treepodia-Itegrationscode automatisch in Ihren Shop ein und zeigt einen Link zum Video auf Ihrer Produktseite an'; +$_MODULE['<{treepodia}prestashop>treepodia_56850ed64712ade8b062ed706b0fdeb6'] = 'Aktuelles Logo:'; +$_MODULE['<{treepodia}prestashop>treepodia_947f55293d691cd5c06a642e55d31895'] = 'Logo ändern'; +$_MODULE['<{treepodia}prestashop>treepodia_d236e43ab0c1cb8f7b8024b61903ded2'] = 'Logo anzeigen:'; +$_MODULE['<{treepodia}prestashop>treepodia_f3d1747a115a48cc0399d6ef5a8d6d9a'] = 'Über nützliche Links'; +$_MODULE['<{treepodia}prestashop>treepodia_f87758e540d66df6593a86ab336b4ae2'] = 'Über Mehr Infos'; +$_MODULE['<{treepodia}prestashop>treepodia_caf5518b3c8ec0e6e41f225a23baaf79'] = 'Setzen Sie das Logo her:'; +$_MODULE['<{treepodia}prestashop>treepodia_c68e0631cf123732fb880cb653eaa783'] = 'Produktbild'; +$_MODULE['<{treepodia}prestashop>treepodia_945d5e233cf7d6240f6b783b36a374ff'] = 'Links'; +$_MODULE['<{treepodia}prestashop>treepodia_4f1f6016fc9f3f2353c0cc7c67b292bd'] = 'Mitte'; +$_MODULE['<{treepodia}prestashop>treepodia_92b09c7c48c520c3c55e497875da437c'] = 'Rechts'; +$_MODULE['<{treepodia}prestashop>treepodia_1decb322633084a2d5c42c1ff047becd'] = 'Oder implementieren Sie Ihre eigene Integration'; +$_MODULE['<{treepodia}prestashop>treepodia_d280700ce09ead998bbdf9b33d8c1cb4'] = 'Verwenden Sie diese Option, wenn Sie den Treepodia Integrationscode selbst implementieren wollen. Der vordefinierte Integrationscode wird deaktiviert, wenn Sie diese Option wählen.'; +$_MODULE['<{treepodia}prestashop>treepodia_86102199212f7d05ab38d8df0a2045a7'] = 'Lesen Sie hier, wie Sie den Treepodia Integrationscode selbst implementieren können'; +$_MODULE['<{treepodia}prestashop>treepodia_d4dccb8ca2dac4e53c01bd9954755332'] = 'Speichern Sie die Einstellungen'; +$_MODULE['<{treepodia}prestashop>treepodia_3832f6deff5d50413adcbc9c06388c32'] = 'Ungültiger Dateityp'; +$_MODULE['<{treepodia}prestashop>treepodia_c888438d14855d7d96a2724ee9c306bd'] = 'Einstellungen aktualisiert'; + +?> \ No newline at end of file diff --git a/modules/treepodia/es.php b/modules/treepodia/es.php new file mode 100644 index 000000000..dc91e2f8c --- /dev/null +++ b/modules/treepodia/es.php @@ -0,0 +1,36 @@ +treepodia_63003285187eda3cbab5be4c64b19da7'] = '¡Videos de demostración para cada uno de sus productos en 24!'; +$_MODULE['<{treepodia}prestashop>treepodia_e0f18214ada56df05a4cb4f2834a6bbd'] = 'El módulo no está configurado.'; +$_MODULE['<{treepodia}prestashop>treepodia_84d2e2420a102446904946c6611610e7'] = 'Elija una imagen o baje una'; +$_MODULE['<{treepodia}prestashop>treepodia_93f1004ef4f6180d1ff4c3e5e097535a'] = 'Nuevo logo:'; +$_MODULE['<{treepodia}prestashop>treepodia_9fab8fa8c181098a13b1a360cbc6ff95'] = 'Los videos aumentan las ventas, el compromiso y la fidelidad del cliente al mismo tiempo que su experiencia como usuario.'; +$_MODULE['<{treepodia}prestashop>treepodia_d59048f21fd887ad520398ce677be586'] = 'Más información'; +$_MODULE['<{treepodia}prestashop>treepodia_5f9c47215d373f15d8ab231a7803eafb'] = 'Mi cuenta Treepodia'; +$_MODULE['<{treepodia}prestashop>treepodia_14d4af7e8b50a553a484be490748b8f8'] = 'No tiene una cuenta Treepodia Video. Debe registrarse.'; +$_MODULE['<{treepodia}prestashop>treepodia_0f98b7f230f3c91292f0de4c99e263f2'] = 'Registrarse'; +$_MODULE['<{treepodia}prestashop>treepodia_7f4f7010abf7fb495ffe34fad24dfc96'] = 'Código de la cuenta video'; +$_MODULE['<{treepodia}prestashop>treepodia_95df9efce09730856d2674c630a1a35a'] = 'El código de la cuenta video le ha sido atribuido automáticamente, identifica de manera única su tienda.'; +$_MODULE['<{treepodia}prestashop>treepodia_35ac6a06187c6dab85b3024e3f457dd9'] = 'Conéctese a su cuenta para cambiar sus preferencias, configuración, y estar al tanto de sus resultados.'; +$_MODULE['<{treepodia}prestashop>treepodia_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Conexión'; +$_MODULE['<{treepodia}prestashop>treepodia_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuración'; +$_MODULE['<{treepodia}prestashop>treepodia_1e26f63fb925b49c1c741197cdc0dc7b'] = 'Implementación por defecto'; +$_MODULE['<{treepodia}prestashop>treepodia_d7cf3a48c409acbac7598ca616569864'] = 'La implementación por defecto integra el código de Treepodia en su tienda y muestra un link hacia el video en su página producto.'; +$_MODULE['<{treepodia}prestashop>treepodia_56850ed64712ade8b062ed706b0fdeb6'] = 'Logo actual:'; +$_MODULE['<{treepodia}prestashop>treepodia_947f55293d691cd5c06a642e55d31895'] = 'Cambiar de logo'; +$_MODULE['<{treepodia}prestashop>treepodia_d236e43ab0c1cb8f7b8024b61903ded2'] = 'Mostrar el logo'; +$_MODULE['<{treepodia}prestashop>treepodia_f3d1747a115a48cc0399d6ef5a8d6d9a'] = 'Encima de los enlaces útiles'; +$_MODULE['<{treepodia}prestashop>treepodia_f87758e540d66df6593a86ab336b4ae2'] = 'Encima de más informaciones'; +$_MODULE['<{treepodia}prestashop>treepodia_caf5518b3c8ec0e6e41f225a23baaf79'] = 'Poner el logo aquí:'; +$_MODULE['<{treepodia}prestashop>treepodia_c68e0631cf123732fb880cb653eaa783'] = 'Imagen del producto'; +$_MODULE['<{treepodia}prestashop>treepodia_945d5e233cf7d6240f6b783b36a374ff'] = 'Izquierda'; +$_MODULE['<{treepodia}prestashop>treepodia_4f1f6016fc9f3f2353c0cc7c67b292bd'] = 'Centro'; +$_MODULE['<{treepodia}prestashop>treepodia_92b09c7c48c520c3c55e497875da437c'] = 'Derecha'; +$_MODULE['<{treepodia}prestashop>treepodia_1decb322633084a2d5c42c1ff047becd'] = 'O bien, implementar su propia integración'; +$_MODULE['<{treepodia}prestashop>treepodia_d280700ce09ead998bbdf9b33d8c1cb4'] = 'Ulitizar esta opción si desea implementar el código de Treepodia usted mismo. La implementación por defecto se desactivará.'; +$_MODULE['<{treepodia}prestashop>treepodia_86102199212f7d05ab38d8df0a2045a7'] = 'Pulse aquí para ver como integrar Treepodia con su propio código.'; +$_MODULE['<{treepodia}prestashop>treepodia_d4dccb8ca2dac4e53c01bd9954755332'] = 'Guardar'; +$_MODULE['<{treepodia}prestashop>treepodia_3832f6deff5d50413adcbc9c06388c32'] = 'Archivo no válido'; +$_MODULE['<{treepodia}prestashop>treepodia_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; diff --git a/modules/treepodia/export/export.php b/modules/treepodia/export/export.php new file mode 100644 index 000000000..349b2b2b6 --- /dev/null +++ b/modules/treepodia/export/export.php @@ -0,0 +1,3 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{literal} + +{/literal} \ No newline at end of file diff --git a/modules/treepodia/fr.php b/modules/treepodia/fr.php new file mode 100644 index 000000000..0f094da8c --- /dev/null +++ b/modules/treepodia/fr.php @@ -0,0 +1,36 @@ +treepodia_63003285187eda3cbab5be4c64b19da7'] = 'Des vidéos de démonstration pour chacun de vos produits en 24h chrono!'; +$_MODULE['<{treepodia}prestashop>treepodia_e0f18214ada56df05a4cb4f2834a6bbd'] = 'Le module n\'est pas configuré.'; +$_MODULE['<{treepodia}prestashop>treepodia_84d2e2420a102446904946c6611610e7'] = 'Choisissez une image ou télécharger '; +$_MODULE['<{treepodia}prestashop>treepodia_93f1004ef4f6180d1ff4c3e5e097535a'] = 'Nouveau logo :'; +$_MODULE['<{treepodia}prestashop>treepodia_9fab8fa8c181098a13b1a360cbc6ff95'] = 'Les vidéos augmentent les ventes, l\'engagement et la fidélité du client tout en augmentant l\'expérience utilisateur. '; +$_MODULE['<{treepodia}prestashop>treepodia_d59048f21fd887ad520398ce677be586'] = 'En savoir plus'; +$_MODULE['<{treepodia}prestashop>treepodia_5f9c47215d373f15d8ab231a7803eafb'] = 'Mon compte Treepodia'; +$_MODULE['<{treepodia}prestashop>treepodia_14d4af7e8b50a553a484be490748b8f8'] = 'Vous ne possédez pas de compte Treepodia Vidéo. Merci de vous enregistrer.'; +$_MODULE['<{treepodia}prestashop>treepodia_0f98b7f230f3c91292f0de4c99e263f2'] = 'Enregistrement'; +$_MODULE['<{treepodia}prestashop>treepodia_7f4f7010abf7fb495ffe34fad24dfc96'] = 'Code du compte vidéo'; +$_MODULE['<{treepodia}prestashop>treepodia_95df9efce09730856d2674c630a1a35a'] = 'Le code du compte vidéo vous a été attribué automatiquement, il identifie de manière unique votre magasin.'; +$_MODULE['<{treepodia}prestashop>treepodia_35ac6a06187c6dab85b3024e3f457dd9'] = 'Connectez vous sur votre compte pour changer vos préférences, configuration et suivre vos performances.'; +$_MODULE['<{treepodia}prestashop>treepodia_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Connexion'; +$_MODULE['<{treepodia}prestashop>treepodia_f4f70727dc34561dfde1a3c529b6205c'] = 'Configuration'; +$_MODULE['<{treepodia}prestashop>treepodia_1e26f63fb925b49c1c741197cdc0dc7b'] = 'Implémentation par défaut'; +$_MODULE['<{treepodia}prestashop>treepodia_d7cf3a48c409acbac7598ca616569864'] = 'L\'implémentation par défaut, intègre le code de Treepodia dans votre magasin et affiche un lien vers la vidéo dans votre page produit.'; +$_MODULE['<{treepodia}prestashop>treepodia_56850ed64712ade8b062ed706b0fdeb6'] = 'Logo actuel:'; +$_MODULE['<{treepodia}prestashop>treepodia_947f55293d691cd5c06a642e55d31895'] = 'Changer votre logo'; +$_MODULE['<{treepodia}prestashop>treepodia_d236e43ab0c1cb8f7b8024b61903ded2'] = 'Logo affiché:'; +$_MODULE['<{treepodia}prestashop>treepodia_f3d1747a115a48cc0399d6ef5a8d6d9a'] = 'Au-dessus des liens utiles'; +$_MODULE['<{treepodia}prestashop>treepodia_f87758e540d66df6593a86ab336b4ae2'] = 'Au-dessus de plus d\'informations'; +$_MODULE['<{treepodia}prestashop>treepodia_caf5518b3c8ec0e6e41f225a23baaf79'] = 'Placer le logo ici:'; +$_MODULE['<{treepodia}prestashop>treepodia_c68e0631cf123732fb880cb653eaa783'] = 'Image du produit'; +$_MODULE['<{treepodia}prestashop>treepodia_945d5e233cf7d6240f6b783b36a374ff'] = 'Gauche'; +$_MODULE['<{treepodia}prestashop>treepodia_4f1f6016fc9f3f2353c0cc7c67b292bd'] = 'Centre'; +$_MODULE['<{treepodia}prestashop>treepodia_92b09c7c48c520c3c55e497875da437c'] = 'Droite'; +$_MODULE['<{treepodia}prestashop>treepodia_1decb322633084a2d5c42c1ff047becd'] = 'Ou, implementer votre propre intégration'; +$_MODULE['<{treepodia}prestashop>treepodia_d280700ce09ead998bbdf9b33d8c1cb4'] = 'Utiliser cette option si vous souhaitez implémenter le code de Treepodia vous même. L\'implémentation par défaut sera désactivée.'; +$_MODULE['<{treepodia}prestashop>treepodia_86102199212f7d05ab38d8df0a2045a7'] = 'Cliquez ici pour savoir comment intégrer Treepodia avec votre propre code.'; +$_MODULE['<{treepodia}prestashop>treepodia_d4dccb8ca2dac4e53c01bd9954755332'] = 'Sauvegarder'; +$_MODULE['<{treepodia}prestashop>treepodia_3832f6deff5d50413adcbc9c06388c32'] = 'Fichier invalide'; +$_MODULE['<{treepodia}prestashop>treepodia_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; diff --git a/modules/treepodia/it.php b/modules/treepodia/it.php new file mode 100644 index 000000000..48192d8a9 --- /dev/null +++ b/modules/treepodia/it.php @@ -0,0 +1,38 @@ +treepodia_63003285187eda3cbab5be4c64b19da7'] = 'Riempi il tuo intero catalogo con video realizzati in 24 ore'; +$_MODULE['<{treepodia}prestashop>treepodia_e0f18214ada56df05a4cb4f2834a6bbd'] = 'Non hai impostato la configurazione Treepodia'; +$_MODULE['<{treepodia}prestashop>treepodia_84d2e2420a102446904946c6611610e7'] = 'Seleziona una foto qui sotto o caricane una nuova.'; +$_MODULE['<{treepodia}prestashop>treepodia_93f1004ef4f6180d1ff4c3e5e097535a'] = 'Nuovo logo:'; +$_MODULE['<{treepodia}prestashop>treepodia_9fab8fa8c181098a13b1a360cbc6ff95'] = 'E\' noto che i video dei prodotti aumentano le vendite, l\'impegno e la fedeltà dei clienti, e migliorano moltissimo lo shopping.Hanno inoltre un forte effetto positivo sulla tua visibilità motori di ricerca'; +$_MODULE['<{treepodia}prestashop>treepodia_d59048f21fd887ad520398ce677be586'] = 'Per saperne di più'; +$_MODULE['<{treepodia}prestashop>treepodia_5f9c47215d373f15d8ab231a7803eafb'] = 'Il mio account Treepodia'; +$_MODULE['<{treepodia}prestashop>treepodia_14d4af7e8b50a553a484be490748b8f8'] = 'Non sei ancora registrato in un account Treepodia video. Si prega di registrarsi con Treepodia.'; +$_MODULE['<{treepodia}prestashop>treepodia_0f98b7f230f3c91292f0de4c99e263f2'] = 'Registrazione'; +$_MODULE['<{treepodia}prestashop>treepodia_7f4f7010abf7fb495ffe34fad24dfc96'] = 'Codice account video'; +$_MODULE['<{treepodia}prestashop>treepodia_95df9efce09730856d2674c630a1a35a'] = 'Il tuo codice account video identifica in modo univoco il tuo negozio, e ti è stato assegnato automaticamente.'; +$_MODULE['<{treepodia}prestashop>treepodia_35ac6a06187c6dab85b3024e3f457dd9'] = 'Accedi al tuo account video per modificare le preferenze, le impostazioni e visualizzare i report delle prestazioni aziendali.'; +$_MODULE['<{treepodia}prestashop>treepodia_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Entra'; +$_MODULE['<{treepodia}prestashop>treepodia_f4f70727dc34561dfde1a3c529b6205c'] = 'Impostazioni'; +$_MODULE['<{treepodia}prestashop>treepodia_1e26f63fb925b49c1c741197cdc0dc7b'] = 'Usa integrazione built-in'; +$_MODULE['<{treepodia}prestashop>treepodia_d7cf3a48c409acbac7598ca616569864'] = 'L\'integrazione built-in incorpora automaticamente il codice integrazione Treepodia nel tuo negozio, e viene visualizzato un link verso il video sulla pagina del prodotto'; +$_MODULE['<{treepodia}prestashop>treepodia_56850ed64712ade8b062ed706b0fdeb6'] = 'Logo attuale:'; +$_MODULE['<{treepodia}prestashop>treepodia_947f55293d691cd5c06a642e55d31895'] = 'cambiare il logo'; +$_MODULE['<{treepodia}prestashop>treepodia_d236e43ab0c1cb8f7b8024b61903ded2'] = 'Mostra logo:'; +$_MODULE['<{treepodia}prestashop>treepodia_f3d1747a115a48cc0399d6ef5a8d6d9a'] = 'Sopra link utili'; +$_MODULE['<{treepodia}prestashop>treepodia_f87758e540d66df6593a86ab336b4ae2'] = 'Sopra più info'; +$_MODULE['<{treepodia}prestashop>treepodia_caf5518b3c8ec0e6e41f225a23baaf79'] = 'Colloca qui il logo:'; +$_MODULE['<{treepodia}prestashop>treepodia_c68e0631cf123732fb880cb653eaa783'] = 'Foto del prodotto'; +$_MODULE['<{treepodia}prestashop>treepodia_945d5e233cf7d6240f6b783b36a374ff'] = 'Sinistra'; +$_MODULE['<{treepodia}prestashop>treepodia_4f1f6016fc9f3f2353c0cc7c67b292bd'] = 'Centro'; +$_MODULE['<{treepodia}prestashop>treepodia_92b09c7c48c520c3c55e497875da437c'] = 'Destra'; +$_MODULE['<{treepodia}prestashop>treepodia_1decb322633084a2d5c42c1ff047becd'] = 'In alternativa, implementare la propria integrazione'; +$_MODULE['<{treepodia}prestashop>treepodia_d280700ce09ead998bbdf9b33d8c1cb4'] = 'Utilizza questa opzione se vuoi implementare il codice integrazione Treepodia sul tuo. Il codice di integrazione built-in sarà disattivato se si sceglie questa opzione.'; +$_MODULE['<{treepodia}prestashop>treepodia_86102199212f7d05ab38d8df0a2045a7'] = 'Leggi qui come attuare il codice di integrazione Treepodia sul tuo'; +$_MODULE['<{treepodia}prestashop>treepodia_d4dccb8ca2dac4e53c01bd9954755332'] = 'Salva impostazioni'; +$_MODULE['<{treepodia}prestashop>treepodia_3832f6deff5d50413adcbc9c06388c32'] = 'Tipo di file non valido'; +$_MODULE['<{treepodia}prestashop>treepodia_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; + +?> \ No newline at end of file diff --git a/modules/treepodia/logo.gif b/modules/treepodia/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e032d94b2a6ac5ab523f420c119325764b1c9854 GIT binary patch literal 93 zcmZ?wbhEHb6krfwSi}GV|NsAw>}3dUVThm32xNoB7!-f9FfuT(GU$M~Ahit4N)fy6 n{4=m}e4=C#zT$U5?2p()k7+knENH39x^y9`B=>$G6N5DX=PMqt literal 0 HcmV?d00001 diff --git a/modules/treepodia/logo.png b/modules/treepodia/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..37f2d0acd7e3fc5b3a3bcb22f6fba15ed0568626 GIT binary patch literal 14731 zcmV;6IdsN}P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#00007bV*G`2igY@ z3m*wB;Q(|103ZNKL_t(|+U>n}m|fL%{{PwgoOA2ksTz&isLZJMF40UAm~LzsV#jgp zI0^h5m*g8e5wR0Y96ydpV#hI#W571X*cb~pIz}?ZRD*;N2vyWjpWbgfXRqHM``j{O z0AY$Dnf*LhqnWw)+&lNad+oK}^{%yGWR0wmHL^z5$QoHA>wnc!f2b$+rK`yRU{(pi z9=~Fy@9K0c8`2aBkNrWdSBYs1o$lh83J-B1VbJ$2nN9iz`;Wh6b>2}g+}3_ zaKf+N1_$>_N7b$y`S?cGI|}q!Xn6`!J|H$_XvHV^CU93X~F*7PNp;s(1s? zTBDSMQr6ysMxoJoBx4nfsc&R#{RGC3nZ%feDbyy%;S$HC0!+y%JhI*r z(C4IWO`d_4P1_&kjF8FBHwaD!qq8_l5M2O!c+(;1m33Z#@b}^Wm4v_trL^4$ zD3o$=aM0qSh~nxP@-wW{jI$q#EuKOoC z(=TDXesD6N0<^Z4+X9<15UY~4R|*~ePDF4uh!z|aq7@E>6QN}N3!9*H9figzyN|-b z0r5~oP?A9TFxVo6VSxb#BhiL-W9H@yM6=~BcOlPVD<383rqg_ zKmLy1{DBbgIdJ^YCkI`OP(v_=)?HJ+0YFRW!(%`zG!lMQWiF2ed;!?nK7nNr6@LMmQM^Q5`VY+l5qhFQd@4da32NGvb{`r%iv?2s>h zAg@+agOcZ6}s31v9)i7=1e5N%mVEW_*cvRw$ zKojdyM3#=^3r0XsT3(XdANV1+-G3c^w8vU_mA6*cF$ka?P-1VMqXC2KI8;?6sY+E+ zkxUYedKQubg24bHf(DGT=_^qd^icTTfKkQ&3kDG(2=e%T4ucQ`0lx1e5)csBqXuKI z1@A1X44qW%w z|M*b`IDm-^VpJBTL$^hVbupBMnyVF2$7O88XzJ=}a2*F_1dJ4|xk$ln0b?wPl~NYq zWxp?M1Z5N=0ix|!u$!jv7_mFWf?fG`lvvOGOe&Qy6^s8^-M|%)AV}Y)MVsNQZ zXeBsG7+YV@#Bt+rb;(sJ1g;zd>eBxU-&^ba^52J#(<*dt3O@mqSWqj$7-Nr-@LKlY zz`91hPu>JYSE=*_E)EgIxF{2WAcB$@(MUD3n-?)}=7~(GnvP2q9+h2=YN#E7(z|E5 zzt4kwvi$bRbp%ct30<0UkSZw!r_GZm(NI^1#)K}4y{8gEl>@b4cLhX>-i!6gMUYo` zEp`LwFgOmcCpPFsY_MC}Fd9RELgOfnb{#wg0RdVlodkhTV0>_FY@l6_08Pepv2jN$ z&u)E;QHe>+o3WC4Gnds2%4Ts$;Se9O{{LGo{h{>J@~MAnAs_8TIT_2=CvtEx1wPb}0f=hFEn%e_hm2peq5i!WR<)-jvz$(#a4Igqu2c2l3F7K$$4oM432tHj8GTO!I{K#Hb5%0OLk- z0RLMoeO6l6KeFjg0-Xot7eQ2FN$eU`UB%eZqb=_q0AgNtpI5fr$G2YTzU4nJP@S*3 z^94k#TV|w0iMp)Fj>jIqJ7$zp;miZp_Q5sy7>-Ryth1>$Z4^JXk(!R!+mlouqF zLyTDecRT0}nI*gS?EvN5Ak(H&tpyM7;{X#UG+JqakgEui<~)Rvi;9J4gYzWi;g*@!PG@6_lf1 z)wdtcpcevDt@SI$B(LYx5e!O$F+QR|X+>ZHMCTARS`DI{2s;k;^5Wj-8C^AnrSr~U zZqu^W8QHa3kszwZj<`PWO!vmD8pw4MkOgIm)=(*h7|_}wk%)%Lr-FU92_F?iEr=YA zNG{}!%((fI;{%!i zvD7C4NE%OP(2+EU2fDfU@f|$8{%0(heG-f3yoa=G7muoUt>2%Q_OF6o=e-Lm+Fm#4 zyZgGs;Lm~v5sVQW zl>i8_c%)PiqBLSW;$A)PUHK8tUhyZ4Z?<-VYc!C(P@QbskFTY9av^_hq9 z(}%P21pt<;x3+Eu>O8mD4fwk^pikzPX zP{Fc>6;y&MS35LdEMY}lfL}~jW+lDkcN-o>T%SX2d)c}Bg?F>1m!_fCjH1A-V5u!5Vwshag$qAm z9K<*%uSk@j zln>fqBwq&XAatK}X+wmRs}qVUv~jFkS3H#rnt(v;HN_|-JOQj*Q+8UIu*f}7XyYQr z0pp+og@_`T^T}r0=JgUDKb^TVPFS0jeK;gu)$;q&)dXghy#csa zzI8PLB{xt2S4H^H2mgczAG)6@lV>t-&ir>T=oM*}w)TVUJ+zgFpShcrOHOCu^b=b$vR51` z&njn3^3wiQLwa?dqXc9Tg0NMJ*OHOFcvPPCdV2=tq-{;%6Vd2(g_25Nx|(uy72Qt} zg~BDO#;U9wmJ80j6ot1TavU;@!X~xvx?UG~3yXH#*LRdjlPZH`dE%x3e8+KyVPUML zcZi`)3MXHKI7v`ezhi~th*>iiFmc=zlF~Gn!Z6ilo50J@caNP(Eb>o;Zbsj61 zu3DRxy?CTvwH`PtM>_-3H81Yj#@fez#lXM-N-3(Us#>-me&o7|VxzC4%-{)(9xH8=y!M0)6<17hKh;`Ht$_W^Q38LVqMWUS-S1Mkq28B z)&`bEnsOM{#QNq6A-3W4<(DowZTSV(wIPopAfS&UnH}75-;WU26pKKViJ<)|YAYu5 zo)zcQP}z8luWYwoZ@!)Nn;v4@o~O`W7nq!_f(lZMs%YYbMQ1T_^t7-`n(e1nex0t| z5!OHZAY1o5g--{#5>l##I3R+PuOy=DSvG$a3ude&MlxirtnAqqp%}6ZvT55BJhtIJ z`f^7Qw-*y;tnCJhB7P-P>KF6=3;&dwXhZ1w1>vb+h&k2NPMFA?2`6yzs*iHVuW#ew zC+{K9g9K#gNw?9rw~xJhck{sLhxp8=KiA?ZVdIX+xNF_b4CFfz^56)fg&eS_b3c2Y z*uc8q{hU>&yq~j{UV5D`ZL5xTk#f?urY~r1`Qb0V!NZUJn*Ma(P*y6$b$wj}7hZTF zrz|@OadLD?+~_G}P`edsiFH97 zOLN*PTC{R)n-8UI7E?S_kfd?+JkC1l5?m^9(Ddbd>F(=5M5wH+q{6Eu<&EOhrROtY z!UP_8{5FIPI!H2a=83GFcP0@k(P(^p+Iw3W%naapQR-?&;}NGOGLAEse}I`Y=W_RN zenfxvFitd$NFI!X<5w`cayl2C^AVENhn*7)ec4_*`#S)rO4d*nt0hJiOJ<(VoSF0a z&P=`M}x^B#zp6=m^bZYE?)I8DvV>oiu(dk+dlhHjqR_yF5>ZzS*c zTcxM6al*uLQ#onbnbgN7(^xs1OV7Q6HFtfNjDG->i}qvGC7WnD=MzM!B*!3I_CL+~ zXCI)m?+BuN0t7KGmGOF3E;@s`QvnZ881rZwS=X3F@kKvJ^ zH|XF;w|$#EhqmEMrWn{815dpW;m+Uum=C`HFPPiBghkU%VerBnKm6sj)@?Eo&N%gK z=1iZ-vpb&P;oseX@%qUzNMBD6CU9`w2oWcWRt}zy;5ZJsAcryiJhS})Y9FoU{F6W4 zl9%?c3TD;eo)?#V`D<6wpYFy}QO-NNh4at3gsNyQ3O78}d^-A%aMyi5}@l}D1WR!0=f^@Dj_+RbJzO>}3fBie!I}W0h=A6?n;iB^|r8-fM6T;Du zXE4{tJ?nnOukO8-*3JWb>EHjJfBC1cwfsTcn{wanc(m#^;0^0r$&&Fq=uYoPIcbct z{<|&Q_Cvnj6kB!7oV|z`m4M5yfAdR@_G~BcdJ)n^AzD|akNban7)~)%#8d3qeSrGf ziL6+#3Xce#xr6-To|_p64v?2_B$BsTh7k1ojt+A0SNk|^`6bM4T1tJaiPKlSk6%Cj zBhXp2sp8zTK1h^W1mXTiZ)f|yr!Za*#v4Sm&BBUt>COyr-$S>tbNfzO&bb1QN0{mFcd~TB>5NS^ug;U@J2!lt{&Xjv=dt=zS21_$avV}uM2>MQa?-Zu zqnCcNW!9`&{O5PR6p|3UJkJrz$gRQiziP-X`Of#hPHWdbTpi(4pZF{*=B~m$CKxZ~ zgk-grrWsox_>7vha~<63v^y*Mpl|^iw#v2nZ4?zMVGx9CS+&wpt3fZ zq0<0sRxKjv4zzKM>` zR+cS23583REVtkH69)Vv1PmZfzC?+N313SZU-$Bx$9}=y)@?W>nANzFn#2T@U&ZtZ z%NP}zLV)478`rX9|3(6Dzy@!+Oo^!jdyIPn>^krqcmC!!e0&m&;-tmrq5NtlHq4}< zVj>!k2Ohhfqdhw?UO%GK7@Z?fIh5mr%7Mya+(81blUsg%0|8kyE~lP&HjZDx@`a}o zCB?H_o@T&r$LJinT#kqrClReA9!ZgiR1l9OiFrw4UIp<;6^Upy^`pjNj8ES5@yHYR zlckFt2cBX3u1zS>e7NP$nKyMMaWz>*hVi2#s{XRLnxdA^Ig<;{Zb1ie5O?@^4g>fE zq?hbFvYm~ap9BmSoYTUJxo6^$y5g1eIx*F#=1w_*KWX_3M1)=YwyC)^~KDX^zP4k3%E zLC}NbbuY#l!1E%EubqrTlr39#FwmC)-$9uqPQDr^UxVY<;`p`bd=)CFKnF3jityN@ zPoRn5l4N@Gd~}dxR`UupDYCxd`DeF*A4LTTlwXO?*OYFVY8<}`m5-u=2-~*qpslkL zO^UhGm!tg{lN+a_h+`0*+59Bp4iJ#GY?BH=+1@=y34zLEbe2G;=}Wiq!p`SWXquljZrX z&k!)cQyU+~=qyzg)tqtCxwyn{do3(DByYR)!jCX@%51c_uPD1Iv|@kynJ0k&$8mVy zd6y6&bs)1!p$TKM-_e-`iiR12BfrGl`8#SDTmt11{~rz#F;#H7NgFtMVvIE zttwOxCma*kN+nDThyaHA+VLn8XH?AuTq=nY;REM=3~~A~PP%k*g_~W6C5Hx$OOzlV zBNcDJB~DFp46c(TnW#d5vsp5FM$T>ur z)-;`s&#&jmkwcc5db=~SzV9QtB9fKb1p%+faB5@NAf5hus{9LZ!de1Gyo3Vhy{KsE>hL?0`_BJ49m zF=a1>AC!4g$G#a7mMs;O4MQZkuc}!oyT36gWpL04KACJk;A6jj|cw zP*gVk1f+GH#eT)+N4QG>8xw!V}0Q#u~>@LZPi?Rylh5x~Qp*QCnF@SKoe& z5~9&4Q74M)#EE(dJRQaJqC}hsuH)f(9!}K7@eJMFeV9O#h^NqaB%&#l()9FnA2+Cc z>1xW;PG?seB0@ZxC^JG*8?Su2`&!AdwdOn*dY}d-}d(r6LwlwVWX)eW9ud{ZQ=|- zcwyTn#L2N||8^!%YM^<_40gS=1@Q5GpQ>bxh!e+iVt8(xNCn7vQ-u+j>yv!O7Ui6mCu$ z(HVPl1_@L@;`AeWkU-@qh%q9hICI7OnLK(ij$eu6C($N`HW3_&q5?PkK1EWG<br{vpQ_nn%;Im@!dvGNM;?djN56TdYdBkEd;*mJwgVa@xt~;Ze=W%g;uON7f(Y*4utSz`(0=;(>Io^69Vn(XH2GbRN%5vSR5e zICvW<&W$lhK~6%1Ws6QE8c87vZvN>FJYmelKka|Kf|(lt8jC*xVgF_6QuGrxVc&;jh@G6KlP7{ubqS;&mH&OO4mRe#>uk# zzz(**w4DlPG^d_)0g{UmWHq~Y?WMoJmsrdrny@!7ridh5I=b4p=bn4$?e4|oqO4eW z8q*sW5~1?8DP!hv!m`r=&2JvQpI_elV=}T=vT|6m(*9Lnx|)3HYRXB+=$U+2=QcXwEx-f4eKlp2;!KZB`_vw7yZ$Jw)g8<}js6;D;KoGCm202u#C zL_t*6F|~OP^JdLKk>}A(ceClmhcT`Vmb8;0kWPO6$gQN#tz}HInTEtvKK}mIJhSC7 zw(QtQNB3cr35Z8hOqw*6Ws6UyrlNuagD-H?t=|rnpW$W=J1h@m`)WFR4>G#GnoH0A zbKd)&OL$@1^R%_M;u|YNnBF{>Nexp_IQV3Ec*EV?|LD&N7_iw-<#Y4RH*?iLe2w>> zco_!|?q}1s$H}SzHgDO?u06YHs2@WtT0uUar}ao1?d|P0X39lqo-m)k{K((oQqk;$ zipJhxr?hn*VaM*x{Pd2S*tqp6&OhfOX3to#I_{)a3qsoOW7FpK+nwfF!0=fXe&1<6bs>8A5-J59FX0zbNh>I+V&(5J$5hKcfG(x=Y4=hbC)kk zMk{v#WP=PZY<-ry*WS*K7dIg~OFSMYJ77XrNx!|Ie>F>QOjsJ{s4|~F0G;K@XYQx6 zvXarMNsOx-$Jo;^!jMO-(gsZwgTaudsyc;stveDh06L9wY%4$q^|BDC)X>%1QE~b? z*s+CQ-2Xk!KJ_wcqvNQG*K*p5b2w$iX<uT5&B~PAS1_uX2+SLlgjLLy4WP^5o zcGq_~?Su=NGjTaC5f;y0$->!-G2{pkBE&)lD1y%beZ7N2SS{=8`zRnU8E&}gTby_P zD(25xOl7Q^l?zX{F-7>wT%w_vu7jW7c?(ZI^8kU$qQyf@gk-Fa6PKTf_LD>-Nj}!{ z|G4AVqgngdod{|Ab9wr@U$PZi#>N)-E(B3lEIF0G`q-63slBaSV;|GCSA5}fU%BoF zxBL$eJ-U{iFK*)-*X~4%OVqQkCzBftW1av zImDBXu7@Cs!h1VGue+jdv_^@x^qc6CQd|j+4msvflvV(b=rlQVn0p?$k?B(xGiUl@ zQeF+Z$msZF7+}}I?QGui1l@hDpcRAp!wiz3KY!HfO$tL7l$3hcA1h;4KFWbWb<;ku zja%>f8q+4vXYPz;)K`oP=hNyiYmg^RH@gmO=9$fp($%*g@zRI{#kyDP>hzK20Kb0X zCN^#VEsN)!z@#x#iIPBv*Yn9?$Z@dqCDw0xgl&5^AUYiex}}*~LLSj+2IL^O-u>VF z`te%k%$(2U#%59#RcNj0PY=?5w3Tf;xAEKy&tgmtQ9jzZq~Z;n`JM||^`47~Q&*JT z=A`5DmiK=0x|NI1X6-|FvFW*|=o##=qCTUE>o{}gEatsuzK=Ogi*TrDKDMYNqUx^q zrEA^)_s6Suopajzx##}d*|=#v{eyjE^VXl%+9MgOWWn4eocG>~Xqqq+P4uktYk6wa zmABsh&DEo;CR39dk3;O5(sR`822@54$(bi#$bIYXWYhD{kjV~`&1Z|-CgD}HaKTb8 zI`?84$2Ic9pWaAAWjD3S@i@fJdLy8JUCvQPj&`nn<|j4R-STf3uNRywqWy5p4!8)* z7tWT{eP z3nJx*IX*Q6^u@2*f>n!aQ{%=(1u-1I0*543m32g;F^nJ3H`qmgy3?ln^#Dc>f-Yox z!{QGK=UW*&xkO70$;WX`l2p8wL^K6x1~UV6_O_BY{Z<03GZ@L(=1};K(mFE+umbjX%hA;T& zxIAFsIzyW7!43w}{Y0a2YAWjSNZ^q?E{SelI#&f`)*7;O^tIE|*NIY!>dG3blXbWx zyPQ{<(2|$VRYHD^!n^F%+Ja={fCOae>}#jDzZ(psQdQJdj>aKIgm|-7HM{e2v{R58 zO|3_r~))v?wI3Up-cIR&0Y2>RZY)rXV&T(GCMaHv@h9i$SQkg3&%g#@1X4 zh^vu;WLf3QLe^K`t9I^`!30@w@-~B~vIKO~Hh35Y3;E7GCK^~B4SCRZg1J!zGD^Z~ z#Q?#|C5+_3OOrQ!bmrP<&zNFvA#j6mP=t>JIgAPj0zrvWOkS08mZ1hoX zZH0>jnn)x?O=>(RFFT79m!C~s)!>l4?bWEnP%Cr2FI`Pz67@|%BDg#ZC0|#$UG)RBS>DK1Y^xFb z$}CvR%FthSEv;;R)ou=Lm5}AUyeYPFzytw-3T)7&^viqtC{r{9LLQ?9B{ngqb(EM_ zO9`vuPfsFqA)bcq$VlJTU@F z4PQ$QS&^Yr3)Qi~x^l|yPnZQ(7!zQ`6w3=m?B6YRN0quF$SbuT4Ab@jxGF|6RZn$n zJj)iI$+G#Ulhk!UoY+XW<3Ake6>4`Po?3Ej;;6i8Dx1wy==q{lDKj~=Pfodv;kBD7 zz0yw#!x=;|i~#PH9#v}bEs7z+F~!ivtwy~9d!;D$;IS<~f{>Og)dSmhCeDyPK3WR0 zX~&jAN{pyiNi11Ob+Um)^G;^zoYP5Ak4N=LXXAGU=$-3RsjBM=GJyhZZa-A(2xl^x zVY_?{?N>7#^=XF48j2Hr)X=SBO1?=++8lzZ&^W5x-6|r@c+YVdRtMU2X5#TA!-_^Rs^f;;}XHqQCug13S#J>istc)X`V1Y>`Z29#S!?uYe4VOFnT;Yjy{EsXpG5Q5QJ{7 zXlU>1q^cr;Q^v5^Ze)cDs$no#9Ghvv6Tx0k57U9zT4|xwGS3`y>IjAD$feD2OowDO z9Fr0bXwXAjb(e=04o^a=bgcfiHq<^p-IAgWa)!rx-A@^)wToIZ5TM#SyGdcF`-_MlBu{fn<=8#!ULw$M5l0{{h3oWxgPWPs?ca$CfBQFQM zRZ*&;Lm!S|m+Z7~+igr67p0`&z%o5U8bp-Qj_Qs1x(VB zE(WNjxWXtq)FBW-e4kw4hkfmB4X-vHj`6IoE^#6%#muQoSUm4k#-*m=Qj16G8fRoI z=Kp@sYa&;idcu3J`^8;9L8Q=L!=~j$+h!02-+AZ0LuB$f8pn*mDI_w>C`_#tL2*Va zXbDHzgu@ub952Ob3WGo_uuY*AiC7U^`Ct?Rd}GM@c_grUcYCC0zyl&^6Ga6{+Zh}C?n%sUS{^oo9kJ@~=Jk6s3jMN2zW%+dSigNOCf19nylri#t&8J?l47lFAyq}( zW8(O6RHl+Pn_8qD4S5q3Czur6k5U4tAT%>C>x5tdY>IACAyaFxZjJ3UU|kiHw^rQu z{h|&?u)`LVa?vIV5yWgz9b)$MrElqT{oeiQJyO@ST=cQk&tCHcIX{DPjrHvf zXsyB|lzZ+}8Pqq^ zs{i$8|3bd}Y7{PvrfF!`@r-mDMy;V18rEnBwmiI0Eo4FTxE$L?jpf(38O z2HSsh55Iln0W#9ICiWJdqQ5ujqiWQZgK}{7*{8mbdmmk6b?+*$eJL5r$qQJyF~VRj z&r636qkw4Cp&}6@7K;*zL~P4Btx?KmdX!ZZjag<_;ow95$8ftn5vaRbQ5%)?#ntWqcIXKrx9m_Ih!_l3A2`*R4xjwFI*Jb5s=M6vp z7RE`FmLn2>6C}>ZzW$taH5r1-ef-ticW$x$J4v@>rTweXvQu>+({Xt+_U34l-q0VB zldh&gj_msKH?QQyLr-HOecp5GZOLGCA5R8lCdr>%w$EYm`-Jsg;)S zdxgfz9)<$k{yAFPDp;lLFf@gSBeqS4BbCJ6QOumOh?!HDGI7i_qEy<^Kt$iPiQV75 zjlu9~iFv=Km0hMA44$(&3$4dF9_z z86U+DZu~JyxpcI4aOowNF}1mgjhokV@4fd@Q&Y=8Z<@>h{I3{OJ)`(q?|$${^32Ak z@Z2~b{n&@uwQn0cUfjtaUHn0=`M3XI%9JVWJFu5b(9en$E7Mj8Sb}d*#~y`8uor;cv)`&*wk?1+M5nNqVwn<=;fEc{3Ug@ zqv>kz;V=H|3P#n}@Rk4gBI6s!LEy1$#d3c8$T~j$v5)hE8*gFGoO#TdGmCG3`#aQE zjbYl9nVfg_AE`f>rMH}Y&F-wU-M0FZ|J?GGYge=P=w=LqfUTXiDa*n{5>@)YD$tf8 zvP0dD5CXs8(W^oSOjY9Q6_~;)B4Cup5!)F}iG#wrEsk+f60zSCWpwQXrcGJEjHbnm zshUEBY8)zXNxmhV`m*JVxck04ShjT0>W$Am!|Zv}(aJEG?Z=Sg_IrNCocYr@=gbT6 z#piEVe*&We9(-ag6Q?$?>XftS8%Xo*|Nai2{oMcKmY@EBtFOMAsFUP(PdvqKKf9HJ zHOxs@(?5OXvwY&O{(`#dhA>V_lgkefki`$u%$q-(OIqH?^*{PH-TiHR@{?Ea)D!D@ z@ZtOUqYqw2o9aD0As_Zr4Ej$-BVB|NeIaVAb4$A?-zj7$6v z>)w>yochah(zfP{fAgO$H{9|Ko_KyOhCUz*+DDlH?WoZ2E_6H#J2w_(>0!r!BH3SP zfTs(61VT3c6-(6et(RcxV$t5yLeJD!e+HCe5a4@*J8c&!N(*M-vNMeneii zsQJxU)0$_{-qA|G-_4WjAK{VO5Bef#)e%gMG_TN!F=M+5NUo^AAY^|NQ^ z9<=dLN^$VuLB@}5B;iz`i861_LVkVkIs|_;aAic*?0(|8JNU2vx|W5D=kdM^FAC>& z1tCGKnK-@)k2noAV`*rxot+y-Phi{DoyF5}=JYv4NfM2xsI9A`qsuC3l~IhVn?S_% zIM}wEC!T(Y3(mTXSXtfb!i5XjzI_`nYwy52=c3Dx%eR z#F#y69zVG8CVXu3fZ4O> zHCn8Tq6(udaZpC#s)(&VQZ^&(s3?`OY9>#f&ZP0vX_`2j`ie$eDnfcOzQH|?v5s%% z(zsnGErVg-{7GTl5#mt^JgB!koJx_03kLzgL@wnJK)WspTL7B)B z0vC@M8gEG2Z*XuBYV7CH)749LWi8scXo;YRaO!)`grltA}HhG5XB*iG9FVVPUn3&ut#XvBNM#K#JIbZiK2*JgLtb|v01KR%`bn- zDJ$C9x_Kvy<}W4b)S!bH%0!8fWaYAxSo8BAbN;y(;ouEnSEh`g%I5gLI%#+x< zX+J;v)i0Pmdp5njJ#==p(=ckxAC{+o?I5>pO`d_4JpCN$+{>c%p_{E})@$vKo}bvVG?ZboKNwYx*3N-E=(w`EPXW zFku4Qw{ORbI4qdEgoJ+MrIc@Z!XYPJO+tPR1WWAf*Z`r_dc%a3ud3u0gi;5m$k|&5 zz(u1mxLpdpPQRsN-~Vr|taPsW%Ga-2`=@{UCrlXCv>`go33;?;uxB+5d_{ryct?$>ST=%E&u4vPRa(8d)Q2WR0wmHL^z5$ofOC Z{~x0;b7#Og6dV8m002ovPDHLkV1m@+z4QP8 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/01_1.jpg b/modules/treepodia/logos/01_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f10f733785b3fe783cf44aa1519902fe3dd0a5c GIT binary patch literal 11662 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 a9&JPrYPO*~=YUde!=ZP%BmMGW|NjFu+$wGW literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/01_2.jpg b/modules/treepodia/logos/01_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f97ced43fde3cc9a0e3001afc4f78eb72e1ca1e GIT binary patch literal 11738 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/01_3.jpg b/modules/treepodia/logos/01_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edb2fbd7f33d5ff5e9fc4746088c4a54b5c53f63 GIT binary patch literal 12213 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/02_1.jpg b/modules/treepodia/logos/02_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f08d3f0f97d1310f6168df1270a6e4e6d5f8695 GIT binary patch literal 3531 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/02_2.jpg b/modules/treepodia/logos/02_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d561ef01aa7839fd5ce3981846cc0bfe6ef27b92 GIT binary patch literal 6446 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 ITyN+84~Iq8&;S4c literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/03_1.jpg b/modules/treepodia/logos/03_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e4628cbf92729344b331b2c8bc5ef84d4c44d5f GIT binary patch literal 5711 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 QEnK4cvptUU=F6%7023zW$p8QV literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/04_2.jpg b/modules/treepodia/logos/04_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a6e75e182d423cc4cc479b30cdd237d66460f4 GIT binary patch literal 4310 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 BqVWI# literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/04_3.jpg b/modules/treepodia/logos/04_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30fb99b19029f3c66bcb7a9b2f84e2aa3d9646ef GIT binary patch literal 4260 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 Gp85|^HmU3Y literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/04_5.jpg b/modules/treepodia/logos/04_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c755dde3fdf8c26ebf865ed053bd9616f86942e9 GIT binary patch literal 2879 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 RYt<#jY{1A=ON#4Y{6Ff2Jn;Yk literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/05_1.jpg b/modules/treepodia/logos/05_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93edd6d409b1926c47726242b3ae442f983a2f55 GIT binary patch literal 6287 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 H+|K?Fc?jn> literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/05_2.jpg b/modules/treepodia/logos/05_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f826a845fe14f8aa1b53e9a89db1759a439fb13 GIT binary patch literal 5846 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/05_3.jpg b/modules/treepodia/logos/05_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08e798d4535bdf1dc3b98e77d7cdd5802a942482 GIT binary patch literal 5786 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 X8(#vt?q33ICeSOv_W$nbOVa-UAeY}u literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/05_4.jpg b/modules/treepodia/logos/05_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b78fad05d886a33bbae4a0fa217c66f15a73ac9b GIT binary patch literal 5238 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/07_1.jpg b/modules/treepodia/logos/07_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fc5b794161c3375c9b47c6f1eea1f27dca9f54b GIT binary patch literal 2909 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/08_1.jpg b/modules/treepodia/logos/08_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef39adb9dd7f4992c4498942bb69f9916f8afcbb GIT binary patch literal 7096 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 oh_ut$Aw17?02%m4rY literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/09.jpg b/modules/treepodia/logos/09.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba7d282be7935bfaa94416936084b9dded883f74 GIT binary patch literal 6363 zcmbuDcQ70d(DzR#A#pf8h!Qn8Ed&w0_uhMr-lK*fdM~F$IsNq0dv`hsj_8~&M2X(s z{N|l`=K25G{cC4;Kl7cP*_oYvT6kIq5Gu&X%K*^O&;WA(9PqRRko+(DKiPkf{}bT9 z=BFM25Emc<5WzqL0?>hI7(leA0l+H&039720}b#$hJ%NVi}eg01M|N$KOq1e1AvZ( zfq{mFh4)|0zgkQzY#624Z^kQ?9LK2VN8ZnwJrG-T zDdSI6`QX6l$(K!pSz*$2W83pBdSm{ufFQIgmnzskI|DNhhtuv*)fa3i8!XET{*1c? zmGBeTankL%5!iUqB=9pFySmFMb%qN)%9Lcr8uVEeBY`4}_wnST%W<%{=7-IijCUg_JMgiUybu+QO3zFgFYy7%0;1^0qr}Hlxjv%)xv7%dUtCel z-YmH0trNi;r_M(`(Q_MqHd@*$p_fkp0NbvysD_&Dw$LbRp41*pIc1XgIH=njMkTL9l^}3A_#E47-0ov zW&OyxJx7;}bwEUnf*+mLUnYEfVLyRFSN!3Hpx`(Y#o*t%p}k2*cvH`B-tO$|MQjhmg&ilZOygV_NG*#LO;?(PH5ZRxSk4?{I@ZT^h(1k^q<%bovKp@u; z$h}g4>b24XCI8gkkD3?X*Cz^X_Ct8s%VM=?v3G(<3o@e)^hSWk7H0kzWG4d;lzasr z4sUdsoGW+_45D^~aj$5LX5-p&*fFCLBMZbI3T}}*cjjUK_qM5xmW~ zpoqKm?ERjoCvDh~wPGbP0Codm8rt_!8GUw-ob}(F(JAEzN|I3s4&on8}SHm8|{?t4cl^k%*c|ATK`>T?X51p$Ral|>{IjmlNb9_dGhpzS*TD;is1^c_yY;^W!?Dea-0z8N_ra?!~5XF9?tG^EYeYkX9iR;b`BIM{F&#yD#5% zk~ka~jn=M>-`PFvjiW9q-<4&OAZvGWUS64b%&HVWcdFtrnzp!EUEW4=s_1KKr=+(H zNhX0NNj`3;wJh1@6;p3v(#r||fPJMP3)2zwQFEPX|0J8LDPsXmwrZ;zk7hjkZXL+D zWQ!n6U`p(b>u}wLLZP_t0_;8B9PX`6HD(v6ts5Ksq|*6GaSA>#1d#KB=_R?r3**#E zu>%hd8a8X2$ieESICE(a1Lu^XbcWtM!rxl{ei2d>1CJo;`Q|Vkm{9eGy60f^*!q%$ zJxV^x(v>jGV`KWD;JY>QW5mWh*)GA+%IkYZ{ z_{FdAk;;8Mrjhk6l$efRhwLMwHty5HPG^FHXo6+drD(jAyHK@7D{M}dS>e1tCC%mS zhE7w?Jb2PFtIES@r?p!8Q`Sz6Vv<3J5QsW@PFhM!OUsnCV&$>BW**ss6xJA2NaZwY zC)6(2u526dZS@!dUo2>y2R=n!@Fqd28}=%tUPN7kR8 z#)q->WV$&g$*?0)JV#rk--G0__4Ztes~km=Lz#O1-ldb$po&Ye#xV`bS~w)J&w4_I zMa@#s7=Nf`E_o~5>P}V>M?*l`Y@CW}%sipkCbgDrOUOe0mZ=Mm`P`ophB%z8EjDbt z)aC8#B*J{h{b~yj2#Zabwwq=U)h2nXIZFHH8GS@6^Rvzx=b`w_4@dJC$DQYl8gw7h z%IN9DwWnJ^y48sW>_uoS2D1Pl)_GuS^N17U(khK|acnN-jYd}~UD$U(JT`*?ODzho z3SUrtfxM2PR=p5YoNy??K`EZVO07S%XE2siJ(SoW?!Z57fMFR{!>VxMhHue11g72u zZ80owGdy(po>GWp7^Z6#$hxHMXmZ4Z5FB7zoc2zgQHu6*lNb7?I82@h zN%r+L#kHTAS;{IwI&PU);HmA>*RTk6j!eu+-|&7GVs2SuH&nR6GC zk5Vuv;D7qP%Ivyb!(T)*Ht};F-Z=RPzZ0v=DxSb`mwtR<@niA67 zWu>|C#+Lbr4^m^I!cOl-)^dqH?n#svrfyv3<83h;;eN5hy@~PgGp`S9UUgp0L=`LZQOq&`Z=eRwxG%pO@L@Ser9 zfUsTvh1G3QX;JJfE9drF5swf(Pv!&gQPp@eyUmc~Sxh-+MsO37HEJYTw_;1a7ql2%5eLm8s+n5uQl+J=5VPPQ^X%=bohGEObhWWm$G^p^nTx?aAcbi&r z=uvNa(=Qz^PpIz3XoZMoNc!E1czWjo490BtUSG2mW=#j4KdYDO*~Tz&s= zGr0yQxM3fMsqSp69?qbQ^JQ8#K0N`<2P}vmCyRDbqrrUFs%-%W^){blvVxA+Yp>^2 zto>DklQbDMYHXTfB;r*Gyj0DF%HgeVhSEYIl+ySttmH4{<<-YuJxs<#ZJO-9jLXqq z-VwS`ifl~WmTBV1vTKnHW$CHFFG!puXxAQHyt<;^<&s-YILyu4Kjyphch2rdC7J!4 z9--Ju#f})rV5c)rt%2wr+YRk0$y5~c8{{+^?X-M?IvoWmhlDGppT8tJGvUp17-O9Y zZH_7Q{7WUVWXH*?FvvbzX;7O~1EJ(Eha(GSq2chkwhE6yhHbv?Nv@4btL`M`b6TRNz5#jP+gbklgipM(KOkof_0lKsg&c}5(I_NWx zY~En6X8$hmw)-J@NiL9eKQc`a7F*ph%@uSycza#{{J>NVblo>Pne=NgAWI`s8*8NE zc8zV(s2AN@N`_`-5W+jxHZbohqciXchtjB-=?m+;VeCW^yh#o9hyvvb13S+QwfT>K zOOSZ95HpH+jV#D0duoL_Q`^#(Nw_pHMbzi&or`*|3{;F=b%a+wC^=APCD)$S&&A15 zc`w4yess4YNXOC~cY$MbGJ~2F`m;Y9;8%shop%V*>T{}?7K-DYg^^4{O-NtmP~Gjq z!mO23LqQ+VOmP@ooJ2>oKPtrwRm6yZawxLm`(@}=buZ})fG*)~qec>R=2O|ybV#Je znw_lx9gQtqNufPxL4l$y@|`@M0qioD&geVao9&9h&LQ_31WkqOp}R3VEQ^W+=luj} z_2rSoe4msf#6C_RVnamBx ziqY|#Koj3bXynj{qnR(|T*}F5Teqr>QP%qv#EEM?qf3SAeiv|KK85W>;S?1LCu5_( zq22nJ`S9m3@bW5afqO{Zfk{Q5uhgN3c7Q9ad@7gkAZWQEuYSD-bYS>~>W}Mk z43X^t4}X@w{0KErDJu|uY}@*$JNGX8)1&F>=>z}E;HmTP1RwSV4?N-6&SePoTI1QNI%>kUF0iC2{nAEQvOU9 zTnYW^>AjdWfT^n&-&t#0=r?RWS!1WCQMNGnd5UC0-Vv}^6lgs#hk?gYhuQpfm`0{> z^h8MKVNulgPo%$RN>sh+Vz9{0rCR!q?f$M_q`U8q@S4d=bhWOZvuVdLn->9okn_&@ z;4nDgil+|d+mzufe=Y6w>RzHht(_|8GU24{kn)$L)$p~ms7PHg4Y+@`EtPDXAu!Gz zk=QWchM~Ent~r<1JfD3r3^fC4$Vvb3*zM(mB#y~mK%*J)7OI^W> z@bYenYR#|-XvwWis|PL zw_3e=Dzs`XU8~Ec8$|9aqnVNV&CUndY%O>GZUOz0uaHvf6IYeP76jB5lpk|m?cC>ORnN+Xng*S3g*=uoC63ptr2GuoON6zn3S#r9S|egat8 z=s=Yre>M%|-i-T*%8&b82>ty!Z!5H!dQ(F&gKAb>j43~^g3zkZbd*PEHUXEFMos8t z2qph8FUzYIhjZKg^xqLQ$RW#KEw9tEbDV>eLo<5g-Z~hMBLm>rR>^Y%AW!$ zo`aW;tcyC;bNx==Eid$;ubFB*lBajPjU$wDalMQ`4OkW=-UiIas*p3f+O1S_Kj&Sn{jQiOr&t<$1fwt`Dgak&Rch618fQilgUj^%fw3PBtsSVaH=+j{5gwG#ZkKvC zy=KhHqofvZJBo>1p!9JBA1piT6I)FCGjse1f`I6XR;>_oTtaS6jc`WDQ9hyM@F(lm zq@s()Oe|K)>j5`ET=9tn79#VZ+$(TGI@S9fy^FfCBy#rPQ?4X~BN z(LSLRLi2HC*ykPZi{QPhGQNo5RH)^l`WyNMhbt{79Ws6XPGypPf-!gL=<3s3w((My zwtV{LzUGygF%O#W%39hcffK_rR#IsxMx#VGz6J^q+{X`MdgZXHoT2usM2(1f`o~fF zlTN=5VVkq^l{Jph#;WJ)xWQ42LTaErac? z>aGbkR&ypM4hMm$!xT->G)g`b9F{T%&X;Erx#9e5xMUA9Kt3;rWgS+ue$|7UYY;hp zn}Wzs#tu?LS)=KqCWv^1bAROb@JVTzq{(t=Kp*&Zk6n%}zdW>^fabR{?AE3OeT+7# z-x3`dea!$*cFiuq#bCnM%hXQ)PR`H7p@n=pT$89LKt(HlpgtMA9pvBM(9)~wOTtearl^^@rg;u<<19TFp~ZXnQaW^YetRUyFcnzfWkc*f`J z1|YAa4|7Aw#0!K0;(@i|fUp4>d~x!{-dH;%IO-=7N>4BCK?29u$6>{{Oxgx3?1~h# znrsq=`KM|BVOZYnJl;O`NHf|tb_~2&tM2sT?@3A)I$*e!_4sQy=YIZ;=yW%!P9cv; zIjb!-q%LKc7YQtdINs3VfkPVABe+$HEgSOG#Myj`p>{tF&XNP>H)1Yh;@)Qnq3}L0 zNX$#WPwQf?v%H?n0UeNSS>BE5g&{HTxfHkjknWYd#FOmFrCbQsGlk2PHWuWGIG7>R zaORkvq|(iNMCw-m4f}vMGuuz*A$Y@81__bQzo9SAw8D6Zs6%nOn6$O=7UslrjB1i7 zil|chv$_P)?Sp=(Ekz{;t{pJH?yDA;MeQ1XeJA{S|G|coS1{)6 zv*3hSpl$-Ee=j+%wDwu&kdSV!_Gri1%PrG@VE+$}jSn#!H6%Dxb*?3CpFtu7fud~F ztB7S)fwPk85&;IB8a0!#*qCURlp1r7*+AR6H5EhgcvY-=u+Ey{pocu=JU6_4tYnbg z*W|D47SC@<{N=MUxe$!3KW}wlu+q?=P3wA8GNu0GEBuZEdQF)aHFSQ>_~b`w+yP!e z6Hquq2fcg6X~nzCuXmihLN5HOnO#>m6A7&DidpPSwy}Hr_D9zH_TJ1d{v9FHiR~lf zxBw1|?I%DR$Fo6FZ!eFiRO|J~$Q*ilde_LPODP9t+7-~}I~c4c&Dfs({0Yz~y4A7ZpWl@)93) zioaBu(Q$((wVSOYfgvMFiqIKOXaC7MxaIrw^y~itddvEq literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/1-1.png b/modules/treepodia/logos/1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..292a0a584c344b99bc2670d24a37bbfad81bd802 GIT binary patch literal 4483 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 Vpcr7fMx+1$002ovPDHLkV1fj*S#AIT literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/1-2.png b/modules/treepodia/logos/1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..acbeb3e64fe31c71f5f012b603a414c1f95d9640 GIT binary patch literal 4399 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 Ef@Mq|QUCw| literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/1-4.png b/modules/treepodia/logos/1-4.png new file mode 100644 index 0000000000000000000000000000000000000000..de88e1ef4480501c1940ff454c0227f76fad65d9 GIT binary patch literal 4440 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/1-6.png b/modules/treepodia/logos/1-6.png new file mode 100644 index 0000000000000000000000000000000000000000..5a63c13c50baf6a844cac4474eb1ad93b00b132d GIT binary patch literal 4405 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/1-7.png b/modules/treepodia/logos/1-7.png new file mode 100644 index 0000000000000000000000000000000000000000..473b5597a0b3f5a1801f4b4111f5991c7295be74 GIT binary patch literal 4493 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 f31BK_<$ElX00000NkvXXu0mjf>i<#x literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/10.jpg b/modules/treepodia/logos/10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6c641f3fc9f068de387c15b355e2e8a7ee92862 GIT binary patch literal 3766 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 z z`|VVKFeRzm3giTfx|6!p_p|8emy^q#iLgz4q(mShIBXL?zY`lmBDfZhMs{t1ULfs8dsJ&PNEq0;_f{%3__$*R(_7iDA&O7$EZ(9+Uvwy|M3t9UbJf!vr+hvS zp|QRO&^HktmNk|S#UsP=AJf%Lu*q!raUTLfcNqkTrEYu=Ilx!bf0hh;{-yuj$ji^k zwTT#If`I7mp?bb*jo7fy>3l?BZs=0WQdbSiZIZ&a=)fHsUg}|u=LmN2ltcey`xEXl zWN5i|u+3mi0ao!tjQl+J*ZWTVK9ix7yk-UZYb)CS~ z9oF>N4gla!^o>(P?^sx`KSG$<~j?N?{ zP^YKo67>AJR3movB#2wQlVAo8zDlcO+U}W;iu#NXbLqMBJ`Q^mgB$u*i%&0 z+tb$MedoA#Ve&nyQ?HGvW75;b>L&R%L+F*e%}`mCQMrR9W@CM+%X97_CU5_!D9na! zR7vLbj^bl3XI?q))aVi=nf>#JoxIkOVb(!3I0am!{C3CeAHUBSO=pD*g|D$iYllbv z0U1i%lWN~-M1V)XS=>pZK8+{tja~y>RisRkTgLBkf_POCv7<^YXQ9WQqkh=&hmjp( zXV~`c&O)#4q|9r;0Jmw{40pHBo=-gi^X%#xa1Ds^`ZhK;Uj3S*;w+>&3J1I>jY)4v z$d@|PTO9FUzbqX3HgU97!i0e+FPdEggz9nJ0_Xp9ov}FV?sV@C^Tk{zBqx3ML_G@0>L;x)h@wC7+dyzDFuyKO-srO+}wl*tv z33cDlzK05l1B*2>PHoapbRdrR99`voZ(=IwzYm2xau-tLkqY%*Hv9d1BLKeHwC&Ez zHUd#uxL7sg|1{&S3(sKW7hzyaWFTT=VEZj4!)Wlt*ffR9c0PE$sbs&6MF!7HTb^L> l>ByN^wVgJ+`Hevq1{?xZp2|a{BMI6(k4Py=D{Zc4{|Clqa%KPk literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/11_2.jpg b/modules/treepodia/logos/11_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffc1df7bfc14c9cb0e91a0a05e2f64ddeef540f6 GIT binary patch literal 5584 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/11_3.jpg b/modules/treepodia/logos/11_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..311b44b073418f8058f8b2dbdf2b008136d50496 GIT binary patch literal 5121 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 B%>e)a literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/11_5.jpg b/modules/treepodia/logos/11_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2dddb4d2a4ab2aa81af39dadd41931e385d6ef80 GIT binary patch literal 3538 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 PBED*M%=Qq5H*4l!-78mG literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/12_1.jpg b/modules/treepodia/logos/12_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..632f50da6ca0fc42cc7247c76443a5e0224ee808 GIT binary patch literal 4023 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 Z%)~%Y|D#^Rz;-`sIq=75*eCMre*oDXI$r<) literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/12_2.jpg b/modules/treepodia/logos/12_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3bf43ccffc41aba4d9ad62814ffd60112d4e843 GIT binary patch literal 4158 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/12_5.jpg b/modules/treepodia/logos/12_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50f930ae63eba0ad6abe44c5150d63ee45b87417 GIT binary patch literal 3779 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 B&!zwX literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/2-1-2.png b/modules/treepodia/logos/2-1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4e06eaa3de1fdef5af7bdceee0dae812309b0a82 GIT binary patch literal 3094 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 I9Y;v~AEl+XcmMzZ literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/2-1.png b/modules/treepodia/logos/2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fab4cafa90872b96fdeea1f6f817dbd0118894bd GIT binary patch literal 3227 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 Hc8>fHP#EmU literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/2-2-2.png b/modules/treepodia/logos/2-2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..38c94c4390d556bf70ccbee79980bf6318706071 GIT binary patch literal 3095 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 C=p|7A literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/2-3.png b/modules/treepodia/logos/2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..81b2b2f6d331b3c23a0f65391250a720d0c3ff92 GIT binary patch literal 3432 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 b{s;0{8*b_+-Tiv>7Xg^dSB+^#4$=PynbLU- literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/2-5.png b/modules/treepodia/logos/2-5.png new file mode 100644 index 0000000000000000000000000000000000000000..257e192568e1282f1a3e2f9aa9b85ae853ef0dda GIT binary patch literal 4969 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 MIwsn+nkfAL0r3<_lmGw# literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/2-6.png b/modules/treepodia/logos/2-6.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0980a627e9f37dfdcaf9e807819e2a9cd88144 GIT binary patch literal 3272 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/3-2.png b/modules/treepodia/logos/3-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2f17bcc7e29737a3d8f55d1086d8a19fe49ee0 GIT binary patch literal 3470 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/4-2.png b/modules/treepodia/logos/4-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1a19cb93bfdcb59515704b741d5d2d3dd44cc4ae GIT binary patch literal 5360 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 E0R=!9y#N3J literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/4-3.png b/modules/treepodia/logos/4-3.png new file mode 100644 index 0000000000000000000000000000000000000000..8937c15b4a6a8ebb907aabff68fe940a5e071311 GIT binary patch literal 6267 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 YZ&rf0nBOWM=|7e09FUEs{jB1 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/4-5.png b/modules/treepodia/logos/4-5.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0e870166b7d6193f06a8f5f37f6e23f1275a3d GIT binary patch literal 5448 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 k|6yJJKM!-=82k@XT@laW>S-dmXw!r3FckF2OO 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 DUxzyS literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/5-3.png b/modules/treepodia/logos/5-3.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7e401c6431554d067501c79eecca980c7e1e12 GIT binary patch literal 4453 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/5-4.png b/modules/treepodia/logos/5-4.png new file mode 100644 index 0000000000000000000000000000000000000000..a03c3c788fb275db879dce2d7b85c5ba45bb202a GIT binary patch literal 4334 zcmV004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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≫mZ6gY!!zN4p;4?@0$C}jC`XdzYLTZ2 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%0AaT{E@4DPav;6?~2=qeB*NLC>v2yR4C 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

    JuNQvK(-Y)Du@1=e=RA>;u!ss1qRk7 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/7-1.png b/modules/treepodia/logos/7-1.png new file mode 100644 index 0000000000000000000000000000000000000000..21d077babb7324d594f2754848d57e66f6679610 GIT binary patch literal 10176 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/7-2-3.png b/modules/treepodia/logos/7-2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..418aa984ac0ec313aafff939a95067a8f2aa26ed GIT binary patch literal 10122 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 bH$)ZK`X5(m_Q2aeaR99s5KzT)+pzxw-axW3 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/7-2.png b/modules/treepodia/logos/7-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2128b97a9ba1836899e4bc4796b7938aa456f6 GIT binary patch literal 21332 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 b|NZ|1Tt1qHzkk;*00000NkvXXu0mjfp!W!I literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/7-4.png b/modules/treepodia/logos/7-4.png new file mode 100644 index 0000000000000000000000000000000000000000..b64727895d5fad94aec08c197cf125c2ff792653 GIT binary patch literal 19378 zcmV))K#ISKP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 RH$*!?M-!@1^VlZx{{h@u!!rN? literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/8-1.png b/modules/treepodia/logos/8-1.png new file mode 100644 index 0000000000000000000000000000000000000000..382f910a4941c86f92295d94e25b4557c1b816c9 GIT binary patch literal 3750 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 literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/8-4.png b/modules/treepodia/logos/8-4.png new file mode 100644 index 0000000000000000000000000000000000000000..12394c6eb3caa9bc8ef839a45f349ab9fae59e3a GIT binary patch literal 4084 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 C3}TG{ literal 0 HcmV?d00001 diff --git a/modules/treepodia/logos/8-6.png b/modules/treepodia/logos/8-6.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb097de91ffefa7f9fc013bd303efb93684f9a6 GIT binary patch literal 3413 zcmZu!cR1S%7ycz7^4S-q)T&!GTSbgCY84fu606juf*`c^jA(=6qP6$l!Zo9&ilOQ{BzD9@AI4!gT8-{jah&h001_WzK-bylP^LU2EE8; z6136a-rrCT`lh5bFT zqbns)Go7yIs7>6PQ&UxkbDu;t%*Avm2LVSWle z1M!kIdHAi#goS=@?))++)Nk73(@ecBp=K_b<`T`%NbB$mH5ifqjLT%+TeJL`U22l` zxfwK+*`f1LLs>7I?%za|>nI^spt$`5@=n@8@SaPkQe!F^*l4wnoI$K0P$6E=Us$2V zM&zW@Xt)8~kC3)f|LFj&TVW}5k!Sc$&^VASXqFJ%Ys4XKRSkDcaUO~Q-aMh(sox2* zs`@3An4s~mgs11+Jc(PAiFMF&TR^cOcR!}|kZYe{;EFc#Ym;~;euGI})OPcVthoDx zVb3oipVe^}iocC6jCeOny%3mv_O%e~w^YriU7K|~w3SxfvG+sZ#?;@hT{|GLSSq=b*mhgg^L!tjt+)wvGKcnn-}xny2EJ5S_q}0 z6&-S1PkMN>tfhlK4GpBMrbsN(%H+lofphJg^>(%$58a0IS-`QCZz6<`e?+%ED*;{) z5yxyiEhgX_UkvfsSMpb`Vw`(ljCpxzYbz}$@YN-I>kc@5OE=KsZha?BZ^oScI(Wta z+Q`Y`_hADdK=97oT#-; zIkUFDx*h6&NP(bL-rBYuB<>XyaDZcD&O9EvU%FNl6Z7?@b2~!oXM|c23CuwPNs%0A z2>ExvW0Ws;6+#9^0W;?fYGq+hhB629_&wJ7MTB@xn~yfmi)qw*H|>08`c&1Tt8$)t z<(-{S{;UwJJ3jT>b=H7itUjBu?y16=~QedKiAuAGzdNxzo>{_aaMbb7g(s*DBG9gP?q(jF#QLE=aW-bN5XKm@_vO16LIl0z+HE z)5ta&(hc|Rexx%`0yC;M8 ztwnofr#~m(aRYJASJC@AKhA#}>_?BGe|8q&{W8o#oxcOEofQP*+a1{o6zMy{4b07# zb_5@sor+*R{3GGtNEDVwH)Ve^^4Mpjr}yuya?i(8K{-{4Nc1jqIlGX$z+hx@fKSHl zmT02X<_D5>gT$KrJD9abJ^Pz4V_|_g2LtCv56jv%Gq+zTEJo0MvVZH7meg|On)a`J zRXt89xaQe;t_73H;Sj3JOL5-ZkE@bJwDs*C=V_YLpI>rO=LnwL8ac&CK|@(nfe~+! zW`$-||1h`|iR)UC*2w2^{rv_OtS2UNv4-5Kq;VmbqB%hsXf zQ_7D8!W)fk=3-c=!UM{%xH^%i&YkuBm7t6#Q_@Y1lj)vAsyhJT`1F0L#qa`cb@b7f z{P%j5M$j+!G-`=^FDaa@)&XFG>67$V(Y~H9a0x3%F_uln?Z|pZBW3-#0=fi!L_jS5 z(0cECU>)1f?S3|F=z)Iv4Lk|V=_NebMaM2}bb)@1I`&0U%C5-zkZ%`mnLkfQhSe4O zL`w%wDFxTXa>bkl!O0m}8vbV^w4I4PZH7(dE!VfoEskY-17-auz0Awod@PIc75Ns2 zw!L3JSS+jh*1i%^(e+aK=}2>5WWQ0>74^n4jJ%jX>3Dd$?tsIti+N!gq@{4snB0$s+d)ZagW-l>DngBu<)M=Z_pWz5`Q|G-Kf;4|NA;LVf;a~6HtkLZR0)1Z_q=vn$phUcfP)9sFzNR6kz@vGM6 z%o{&;xa&b8qWg{$Np34}_prO~?;)9L4V$6j1|#beCU`w*UE>@j7DQtsQ_NFSA)iOl z))E<21$K@*viI|QvXYX%2@WuSn6H5cX9e3+OM(N3QzMN+TuW&I0h(!?nh=cAtyJRr z;8^n1SZH5RxB$GIJsw#RS5O(QZfG;LBCq1=q>(R6UkXyYq8w`Qv_?+go{45R2*-uT z@>h z5V8tEpJwdO?GJLL^xnl zZJdmVWOoc7_m<02C4)Z!o74>X&mc0Xx@|tyRr8U?QuQn(qrU|zZ8i)y^9x3UMTMxd zE_n!aQ^6WjPTOM}i%`=RH7Pd9(Ex96?~YtG!-KFjW^(McJH^4-wflrSOL@ATzPp2k zyc9n9i?P<`UkM-K(Ll^~j#&OL7slcIlinY~?lRvYZNl(U%5y%Z+SkWtb@97(40L>8 zFhzYdp)hy?Om+fR17tGqR$znKH~371dDtqLP@DGA@(qHIExU5dA1q3_)8L;|sQ#G8 zi%a%Za{MC5PV3?z8-2Uc_UVx}_i-zez2VC-)IwK@I!l!*m3LJZg(jkZ1fyx%n+5_4 zTxuA^n6X+{h(8i@_NpdU7~VS{mn|w~&^J3UI4x?gH>;l832Oig7$)wO%#6|qAC{-M zaD|Oh>Bsx-qojAn_}AdGVyD;kQwxaYd-fiw?#PFh;(z_)plZ)nhykzSmNp{ax0}gG zcw5_3&7K1b1l3&HpCG<^rHx~i zZ)iF$ibEfPSv*opp8N!)#uxLRGNIPKnT&g|)X0ETTU@guSB+>g=qbjdJlLGPa zpCt$w?@D`d(er+8-?#@M*UQFN7+oC`<|EkK?!mjpj>bs}Tb6szA0gy0B+74B<7{P8 z3VWITLZeBWEgb#t1esWsUhB|^@s((;IE-}T8abemPx5@ovm4K+wdUZ9QyU)TrWMmF z-Ge1qn1L0HAa;mC3TEqN>2YL$=$yvdTm>Q2n*<2cs3JmNlVhR{FQ-0Hlt*4iYx@O$ z9((mJw|E2cy3Rf8w2+&snZlf?@N7_N3)B?O<}jf7>D^IYS0g^iQ?n-d%sW6nOH$o{ zZpOsUsozH(jleU4H9@srD}0+J$|GQ3jw$`~k4!DPys1QN{rOml3wMpqRnihmxY(T= zr6b%09LASDWa}pM$!piuRhjuEtKK0=QL}OGno4C?lk} z7^Y56{fr0EF&v4j>UhxugYrJ5Hoi^&g$uKgD`))YtOx->m3x_|8}YM!motr#i957O zxAsGZ4unSWfAgGHpl&f5)s3Kfk{{CQj17299uV(pXD#c5ws$KXd_Gk? zL4n3)jb{0JKh|4DL8+=l48-L0i6(>$g4ZfHA5E3YL;BAv`cMzpDgQgO2LWpcMdVl0 zpw3A;hx#quK!a*2R^QOC3-8rM4wZIyk`gQi9vm*b&G@LxFivbpKXj;xa(YXg&OL1H oOFeBh+*2yk1OI$f3N5Dyr0+ey#IOrdH?Z#hBP%~XT87*006rY+`#-)i%zM*%y>FcvZGH< z1>|RLs1Fbag;q`ty}O=?9sqoJ#dhS(aO%Ze;pQd)5G(@#xEKJSokln^0AN%AVATl# zv@!sI|KXd)+t*JQ^8PRzf0XY%|3K%*Xu!nN)x#NmUksrv26uk!hL!abv-0%AINujT zI(z!~i-%n%dI7+h`$h(O7C{ahcIbReQC9`rWuo@Cl=kG$EcB_6LXSm0Iv?j0pFXXN#Ge+Wq!Q&;}>_NvjX{)@8KI zIJjO$7DS)O6=Je^wV@!{r^@{{_;FYLWqB8$+`8o8mp#NUZW;6I<1iAZuw(f=fFD(| zKI5ToT;nrqdi`5v=KkmAy_({B-# zcVDs#UTtV&frb@h(~{p7|i}Q>s+z65Ykx%)C%s@F>CrQFZX%-jZzh%N>E8pgWGEV zNXaIjdKb_(_X@9JX*KnHiKxMqR-1moR(RRP8M(?BnaUrItq!3FLlK(5Mp6>j zBMzWtzs^kfBJEckyZ!P)gmRAK;vFjn`2PF-;(BI20}NB1!K#i0PXBwI?>t|f&m7lW z$o5lUK7wfP2R!Fh2OW9zrIEJW(}i*RBf6e{QRk(cpFLYBM>lCll9{%UAl4v2;J>a~ zbgW%w7C`57pZO1xV8Re)$ltch;7`9tRo_yC#P+Z6+4Eg)Z%@LP{H8Epf9hDwZAVkL z57R3kKWVd@oz~XA%!4q8nuBhs{$ElhF%v7DzQm@AoU8p9HeQ19dNk<)SLl8^)9xmJ z_bZXq+t~2W`Ygk`CyQk-h=v>j7sF6o>%;yToR%nCwlQl~XtAjGdmlbFnlcqHJE4BO zzqE7}obGPADRKMgFyS14Pi;igoqg09Jjno>A8e|N1Al|X#$KLtyGaJJOU~YILa1Y28mf0c0T zbx)4amQ==pFUak$t({=X+1CkWIX(==!L5`D_RK#t`|tb(ZzfzdIv9`|6ci_9(`9}tWModxRqdm`2=cux*YmxP~RgxWXtV6Ct?qi<~p>JW(tT5Pnv%fv2KZ_01+xlWIfa*Dg-i zNS}o+@7OAELM* z-4CBhS6}JMGMz|r?~c66o@!0&WX7kN;HqqC5Ut_Y1#VdpskfpOuTsO$d~MqP!p^_-+AHJ2D^LF-a(rfGv5 zS0*=1)jc==MPEia^-7G0c0>h_T%UAxNnbg~dUZt@$4;{>%=iH@8})4h@ER_00uw$> z{hJcek)?mV(x*E9%675NvLD-Ml-pD$_L{Hc;!Cb6*|RI=CoS%!??V}k3e5%}A$5a^ zZ9=nN^#W6>-!nz2p~Yivs_Rpdl1m@aJsK;$^tE{`baKT~6>edr8V{s4T%?O-^d=lE z%#Z~oM)Y@pAM}ogyBqcZj98+uvdrPN7dp!$ny^G2WfjKCG*>4=viErNXI=%)Mh1br zXi@#K3|(9x39!a7K?RJnZ2Qev^nJd3(4~0DB=`w$kn$`api{T^eek&clJVz5z+6`$ zK=j+1;{;c!d|>=h2LBb`yna00`90L;v}Ou5VLSI;ezx48JT*XIZuE{ z$v;?65$cx6*fv$6V=#?aQhGAkPA^BDvHYzp6
      W24st8r^q56ssARZiRn`z3S-# ziveU}Ou7R_bB7K`N^6=fEeX5|9Yc`$wtc`wq66G1l^MgIawIzpV;SXpR(+s(AiIw% zX2cLikX%15g5CS?tOF2MJoe7((0ky`B>??}aUkLj&Z@ff*h3^Xd%Gp{pMudQcd25T zNJAX^aG3Wj76l-Xoi1RanBk*;A)~C-ltgFq>&4P@34g2Ow3i!>T^W$ig(jnd>-p5* z2I*$K=Td7}6Kp>tMc8{=ZfIcfrk#;IqV(rYzG7&N;4;gw4V7RME=;(dAD$6T6#XXm zIm?z_(ZifB#p4r!K(J!m8x32?0*}91@@y=$%j1A;x@x;=TEUfEz5(iMBzl$LNin!c zNQD$3ra9zWEQB9LFn|oJ)FE#>63Hb1^z3mK}L1OLv!IG^G#S zlq%Z+6wU$abF4C|gpIT5J8Vfzo$V`nN$1zaxJwb}{!8yyEU{6Ra=`E1-a4MmR0#8z zs9+eiFxRk@z~4+as-h@2*;6`^usVR}DhSN#DLd?5WlG}9d*LNQZ)P#*ui3P_8qnU{ zhQV2G6I3TPrKC86>tGZ_rb8{ZHpoldU)0nwCJ1!FEb&X1!0_WD-#i@=TN|jl@8hf* zHvJ7f4%)elY?oBRqN!kKcSbff4_o_iSiANyShhkcAP?vb`+%f}Ywa+Cc&3J3;J;Xg zfCR~8#`A4_n|fc^Ai!^Ea>@7#T5s(W=PLg|DeRW-6+#II1hGVGI;u7RQfkc73+G@b z-A}$I{G3wc;;bY)7kq|Uh9w#;KIKE)jkV#3f*lPK2ZDQhx&7F@Al?b2wUGbr@gPo~ zokvaVFqPU4mWzKi@y?U(VUnL^!ch1|zy}-xe?!O8%vwA-OM3+3l+O}(7-DPj7;Nr@6V+=&ifM*ZJZI20J&vJa&UeWc(VzSceJe1=@*2=eZwQlV>WdQOy;0 zb7bU&Dfv4$yYE>;Oa%LjwQQG`kyRYXB_g!<=&g4sVyVY(ZHk(;hrOAT;KDG(TN7_| zo?$JziyWg^|&&W3t2O zn0_!aZm3%*zh{f~BBs%lf+$>lr>{(Xm(tgOVERf@Z?Ku6!EHz6P^gEK7dofVRJeer zOc;gozS0ihxW(W!y%;X6)5{9d=gaVZoRcXDDkp;4a0#&qGu5^jGdF0qLLvn*tzw9& zSPh2m3@uiN@=IZRETPiqnAUQC+?l1pT3~D~#GLXjZQGCAMNgDAJ+%4Ur;vcCor>L? zJB|Uym61Vg+hJ1$3?4!{q{JE5y5ZB&m>JXk$_RsbWIsR2>nDe8ZMHc2-C literal 0 HcmV?d00001 diff --git a/modules/treepodia/product.tpl b/modules/treepodia/product.tpl new file mode 100644 index 000000000..c56fa88ae --- /dev/null +++ b/modules/treepodia/product.tpl @@ -0,0 +1,36 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +
      +{literal} + + +
      + + + +{/literal} +
      diff --git a/modules/treepodia/tracking.tpl b/modules/treepodia/tracking.tpl new file mode 100644 index 000000000..c91c71c40 --- /dev/null +++ b/modules/treepodia/tracking.tpl @@ -0,0 +1,39 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + diff --git a/modules/treepodia/treepodia.js b/modules/treepodia/treepodia.js new file mode 100644 index 000000000..a2bfddcb0 --- /dev/null +++ b/modules/treepodia/treepodia.js @@ -0,0 +1,42 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function setPreview(path, name){ + $("#preview-logo").attr("src", path); + $('#trpd_play_logo').val(name); +} + +function toggleSelector() +{ + $('#selector').toggle('fast'); + $('#change-logo').hide(); + return false; +} + +$(document).ready(function() { + $('#change-logo').click(toggleSelector); + $('#selector').hide(); +}); diff --git a/modules/treepodia/treepodia.php b/modules/treepodia/treepodia.php new file mode 100644 index 000000000..f0ea898ed --- /dev/null +++ b/modules/treepodia/treepodia.php @@ -0,0 +1,778 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +if (!defined('_CAN_LOAD_FILES_')) + exit; + +class SimpleXMLExtended extends SimpleXMLElement +{ + public function addCData($nodename, $cdata_text) + { + $node = $this->addChild($nodename); + $node = dom_import_simplexml($node); + $no = $node->ownerDocument; + $node->appendChild($no->createCDATASection($cdata_text)); + } +} + +class Treepodia extends Module +{ + private $allowed_extensions = array('.png','.gif','.jpg'); + + function __construct() + { + $this->name = 'treepodia'; + $this->tab = 'front_office_features'; + $this->version = '1.2'; + $this->displayName = 'Treepodia'; + + parent::__construct(); + $this->description = $this->l('Cover your entire catalog with product videos in 24 hours.'); + + if ($this->active && !Configuration::get('TREEPODIA_ACCOUNT_CODE')) + $this->warning = $this->l('You have not set your Treepodia configuration.'); + } + + function install() + { + if (!parent::install()) + return false; + + $this->registerHook('extraLeft'); + $this->registerHook('footer'); + $this->registerHook('orderConfirmation'); + + $token = Configuration::get('TREEPODIA_TOKEN') ? Configuration::get('TREEPODIA_TOKEN') : Tools::passwdGen(16); + $type = Configuration::get('TREEPODIA_INTEGRATION_TYPE') ? Configuration::get('TREEPODIA_INTEGRATION_TYPE') : 0; + $logo = Configuration::get('TREEPODIA_PLAY_LOGO') ? Configuration::get('TREEPODIA_PLAY_LOGO') : '4-7.png'; + $position = Configuration::get('TREEPODIA_POSITION') ? Configuration::get('TREEPODIA_POSITION') : 1; + $hook = Configuration::get('TREEPODIA_HOOK') ? Configuration::get('TREEPODIA_HOOK') : 0; + + Configuration::updateValue('TREEPODIA_TOKEN', $token); + Configuration::updateValue('TREEPODIA_INTEGRATION_TYPE', $type); + Configuration::updateValue('TREEPODIA_PLAY_LOGO', $logo); + Configuration::updateValue('TREEPODIA_POSITION', $position); + Configuration::updateValue('TREEPODIA_HOOK', $hook); + + return true; + } + + private function _getShopURL() + { + $host = ((Configuration::get('PS_SSL_ENABLED') OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? Tools::getShopDomainSsl() : Tools::getShopDomain()).__PS_BASE_URI__; + if (substr($host, 0, 4) != 'http') + $host = ((Configuration::get('PS_SSL_ENABLED') OR (!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://'.$host : 'http://'.$host); + return $host; + } + + public function generateXmlFlow() + { + global $cart, $cookie; + $cookie->id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); // url rewriting case + + $cart = new Cart(); + $link = new Link(); + $defaultCurrencyIsoCode = strtoupper(Db::getInstance()->getValue('SELECT c.iso_code FROM '._DB_PREFIX_.'currency c WHERE c.id_currency = '.(int)Configuration::get('PS_CURRENCY_DEFAULT'))); + $defaultIdLang = (int)Configuration::get('PS_LANG_DEFAULT'); + + $sqlLangs = Db::getInstance()->ExecuteS('SELECT l.id_lang, l.iso_code FROM '._DB_PREFIX_.'lang l'); + + foreach ($sqlLangs AS $sqlLang) + $langs[$sqlLang['id_lang']] = $sqlLang['iso_code']; + + $xmlString = << + + +XML; + + $products = new SimpleXMLExtended($xmlString); + + $infos = $products->addChild('infos'); + $infos->addCData('url', $this->_getShopURL()); + $infos->addCData('logo', $this->_getShopURL()); + + $languages = Db::getInstance()->ExecuteS(' + SELECT l.iso_code + FROM '._DB_PREFIX_.'lang l + WHERE l.active = 1'); + + foreach ($languages AS $language) + $infos->addChild('lang', $language['iso_code']); + + $sqlProducts = Db::getInstance()->ExecuteS(' + SELECT p.id_product, p.reference, p.weight, m.name manufacturer, s.name supplier, p.on_sale, p.id_manufacturer, pd.id_product_download + FROM '._DB_PREFIX_.'product p + LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) + LEFT JOIN '._DB_PREFIX_.'supplier s ON (s.id_supplier = p.id_supplier) + LEFT JOIN '._DB_PREFIX_.'product_download pd ON (pd.id_product = p.id_product) + WHERE p.active = 1'); + + foreach ($sqlProducts AS $sqlProduct) + { + $id_product = $sqlProduct['id_product'] ; + + $product = $products->addChild('product') ; + $product->addChild('sku', (int)($sqlProduct['id_product'])); + $product->addCData('manufacturer', $sqlProduct['manufacturer']); + if (file_exists(dirname(__FILE__).'/../../img/m/'.(int)($sqlProduct['id_manufacturer']).'jpg')) + $product->addCData('manufacturer-logo', $_SERVER['HTTP_HOST'].__PS_BASE_URI__.'img/m/'.(int)($sqlProduct['id_manufacturer']).'jpg'); + $product->addChild('weight', (float)($sqlProduct['weight'])); + $product->addChild('weight_unit', strtolower(Configuration::get('PS_WEIGHT_UNIT'))); + $product->addCData('supplier', $sqlProduct['supplier']); + $name = $product->addChild('name'); + $languageVariant = $name->addChild('language-variant'); + + $texts = Db::getInstance()->ExecuteS(' + SELECT pl.name, pl.description_short, pl.link_rewrite, l.iso_code, l.id_lang + FROM '._DB_PREFIX_.'product_lang pl + LEFT JOIN '._DB_PREFIX_.'lang l ON (l.id_lang = pl.id_lang) + WHERE pl.id_product = '.(int)$sqlProduct['id_product']); + + foreach ($texts AS $text) + { + $variant = $languageVariant->addChild('variant'); + $variant->addChild('locale', $text['iso_code']); + $variant->addCData('value', $text['name']); + if ($text['id_lang'] == $defaultIdLang) + { + $productName = $text['name']; + $productLinkRewrite = $text['link_rewrite']; + } + } + + $product->addCData('page-url', $link->getProductLink((int)$sqlProduct['id_product'], $productLinkRewrite)); + $shortDescription = $product->addChild('short-description'); + $languageVariant = $shortDescription->addChild('language-variant'); + + foreach ($texts AS $text) + { + $variant = $languageVariant->addChild('variant'); + $variant->addChild('locale', $text['iso_code']); + $variant->addCData('value', Tools::htmlentitiesDecodeUTF8(strip_tags($text['description_short']))); + } + + $accessories = Db::getInstance()->ExecuteS(' + SELECT a.id_product_2 + FROM '._DB_PREFIX_.'accessory a + WHERE a.id_product_1 = '.(int)$sqlProduct['id_product']); + + foreach ($accessories AS $accessory) + $product->addChild('accessory-sku', (int)($accessory['id_product_2'])); + + $price = $product->addChild('price'); + $price->addChild('currency', $defaultCurrencyIsoCode); + $price->addChild('retail-price-with-tax', Product::getPriceStatic((int)$sqlProduct['id_product'], true, NULL, 6, NULL, false, false)); + $price->addChild('retail-price-without-tax', Product::getPriceStatic((int)$sqlProduct['id_product'], false, NULL, 6, NULL, false, false)); + $price->addChild('final-retail-price-with-tax', Product::getPriceStatic((int)$sqlProduct['id_product'], true)); + $price->addChild('final-retail-price-without-tax', Product::getPriceStatic((int)$sqlProduct['id_product'], false, NULL, 6, NULL, false, true, 1, false, NULL, NULL, NULL, $specificPrice)); + $price->addChild('reduction_percent', ($specificPrice AND $specificPrice['reduction_type'] == 'percentage') ? $specificPrice['reduction'] * 100 : 0.00); + $price->addChild('reduction_price', ($specificPrice AND $specificPrice['reduction_type'] == 'amount') ? (float)$specificPrice['reduction'] : 0.00); + $price->addChild('display-on-sale', (int)$sqlProduct['on_sale']); + + $product->addChild('downloadable', $sqlProduct['id_product_download'] >= 1 ? 1 : 0); + + $pack = Db::getInstance()->ExecuteS(' + SELECT p.id_product, pp.quantity + FROM '._DB_PREFIX_.'pack pp + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = pp.id_product_item) + WHERE pp.id_product_pack = '.(int)$sqlProduct['id_product']); + + if (sizeof($pack)) + { + $pack = $product->addChild('pack'); + foreach ($pack AS $p) + { + $packItem = $pack->addChild('pack-item'); + $packItem->addChild('quantity', (int)$p['quantity']); + $packItem->addChild('sku', (int)$p['id_product']); + } + } + + $images = Db::getInstance()->ExecuteS(' + SELECT i.id_image, il.legend, l.iso_code + FROM '._DB_PREFIX_.'image i + LEFT JOIN '._DB_PREFIX_.'image_lang il ON (il.id_image = i.id_image) + LEFT JOIN '._DB_PREFIX_.'lang l ON (l.id_lang = il.id_lang) + WHERE i.id_product = '.(int)$sqlProduct['id_product']); + + $imagesLegends = array(); + foreach ($images AS $image) + { + $imagesLegends[(int)$image['id_image']][$image['iso_code']]['legend'] = $image['legend']; + $imagesLegends[(int)$image['id_image']][$image['iso_code']]['iso_code'] = $image['iso_code']; + } + + $imagesAlreadyDone = array(); + foreach ($images AS $imageSQL) + { + if (isset($imagesAlreadyDone[$imageSQL['id_image']])) + continue; + + $imagesAlreadyDone[(int)$imageSQL['id_image']] = 1; + + $image = $product->addChild('image'); + $image->addAttribute('id',$imageSQL['id_image']); + + $image->addCData('image-url', $link->getImageLink($productLinkRewrite, (int)($sqlProduct['id_product']).'-'.(int)($imageSQL['id_image']), 'large')); + + if (isset($imagesLegends[$imageSQL['id_image']]) AND sizeof($imagesLegends[$imageSQL['id_image']])) + { + $imageCaption = $image->addChild('image-caption'); + $languageVariant = $imageCaption->addChild('language-variant'); + + foreach ($imagesLegends[(int)($imageSQL['id_image'])] AS $legend) + { + $variant = $languageVariant->addChild('variant'); + $variant->addChild('locale', $legend['iso_code']); + $variant->addCData('value', $legend['legend']); + } + } + } + + $quantityDiscounts = SpecificPrice::getQuantityDiscounts((int)$sqlProduct['id_product'], $this->shopID, 0, 0, 0); + + foreach ($quantityDiscounts AS $quantityDiscount) + { + $discount = $product->addChild('discount'); + $discount->addChild('discount-quantity', (int)($quantityDiscount['from_quantity'])); + $discount->addChild('discount-value', ((float)($quantityDiscount['price']) AND $quantityDiscount['reduction_type'] == 'amount') ? (float)($quantityDiscount['price']) : $quantityDiscount['reduction'] * 100); + $discount->addChild('discount-type', ($quantityDiscount['reduction_type'] == 'amount' ? $defaultCurrencyIsoCode : '%')); + } + + $categories = Db::getInstance()->ExecuteS(' + SELECT cl.name, l.iso_code + FROM '._DB_PREFIX_.'category_product cp + LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = cp.id_category) + LEFT JOIN '._DB_PREFIX_.'lang l ON (l.id_lang = cl.id_lang) + WHERE cp.id_product = '.(int)$sqlProduct['id_product']); + + if (sizeof($categories)) + { + $category = $product->addChild('category'); + $languageVariant = $category->addChild('language-variant'); + + foreach ($categories AS $category) + { + $variant = $languageVariant->addChild('variant'); + $variant->addChild('locale', $category['iso_code']); + $variant->addCData('value', $category['name']); + } + } + + $tags = Db::getInstance()->ExecuteS(' + SELECT pt.id_product, pt.id_tag, l.iso_code, t.name + FROM '._DB_PREFIX_.'product_tag pt + LEFT JOIN '._DB_PREFIX_.'tag t ON (t.id_tag = pt.id_tag) + LEFT JOIN '._DB_PREFIX_.'lang l ON (l.id_lang = t.id_lang) + WHERE pt.id_product = '.(int)$sqlProduct['id_product']); + + + if (!empty($tags) && sizeof($tags) > 0) + { + $tagsTexts = array(); + $tagsIso = array(); + foreach ($tags AS $tag) + { + if (!in_array($tag['iso_code'], $tagsIso)) + $tagsIso[] = $tag['iso_code']; + $tagsTexts[$tag['iso_code']][] = $tag['name']; + } + + $tags_item = $product->addChild('tags'); + foreach ($tagsIso AS $iso) + { + $languageVariant = $tags_item->addChild('language-variant'); + $languageVariant->addChild('locale', $iso); + $languageVariant->addCData('value', implode(',', $tagsTexts[$iso])); + } + } + + $groupAttributes = Db::getInstance()->ExecuteS(' + SELECT DISTINCT agl.id_attribute_group, agl.name, l.iso_code, a.id_attribute, al.name as attribute_name, al.id_lang, pa.id_product_attribute + FROM '._DB_PREFIX_.'attribute_group_lang agl + LEFT JOIN '._DB_PREFIX_.'attribute a ON (a.id_attribute_group = agl.id_attribute_group) + LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute) + LEFT JOIN '._DB_PREFIX_.'lang l ON (l.id_lang = al.id_lang) + LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_attribute = a.id_attribute) + LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (pa.id_product_attribute = pac.id_product_attribute) + WHERE pa.id_product = '.(int)$sqlProduct['id_product'].' + GROUP BY a.id_attribute, l.iso_code'); + + $groups = array(); + foreach ($groupAttributes AS $groupAttribute) + { + $id_group_attribute = $groupAttribute[ 'id_attribute_group' ] ; + $id_attribute = $groupAttribute[ 'id_attribute' ] ; + $id_product_attribute = $groupAttribute[ 'id_product_attribute' ] ; + + $groups[$id_group_attribute]['name'][$groupAttribute['iso_code']] = $groupAttribute['name'] ; + $groups[$id_group_attribute]['attributes'][$groupAttribute['id_attribute']][$groupAttribute['iso_code']] = $groupAttribute['attribute_name']; + } + + if (!empty($groups)) + { + foreach ($groups AS $id_group => $group) + { + $xml_group = $product->addChild('attribute-group'); + $xml_group->addAttribute('id', $id_group); + + if(!empty($group[ 'name' ])) + { + $nameGroup = $xml_group->addChild('name'); + $languageVariant = $nameGroup->addChild('language-variant'); + + foreach ($group['name'] AS $iso2 => $name_group) + { + $variant = $languageVariant->addChild('variant'); + $variant->addChild('locale', $iso2); + $variant->addCData('value', $name_group); + } + } + + if (!empty($group['attributes'])) + { + foreach ($group['attributes'] AS $id_attribute => $attribute) + { + $xml_attribute = $xml_group->addChild('attribute'); + $xml_attribute->addAttribute('id', $id_attribute); + $languageVariant = $xml_attribute->addChild('language-variant'); + + foreach ($attribute AS $iso2 => $name_attribute) + { + $variant = $languageVariant->addChild('variant'); + $variant->addChild('locale', $iso2); + $variant->addCData('value', $name_attribute); + } + } + } + } + } + + $groupAttributes = Db::getInstance()->ExecuteS(' + SELECT agl.id_attribute_group, agl.name, l.iso_code, a.id_attribute, al.name attribute_name, al.id_lang, pa.id_product_attribute + FROM '._DB_PREFIX_.'attribute_group_lang agl + LEFT JOIN '._DB_PREFIX_.'lang l ON (l.id_lang = agl.id_lang) + LEFT JOIN '._DB_PREFIX_.'attribute a ON (a.id_attribute_group = agl.id_attribute_group) + LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute) + LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_attribute = a.id_attribute) + LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (pa.id_product_attribute = pac.id_product_attribute) + WHERE pa.id_product = '.(int)$sqlProduct['id_product']); + + $combinaison = array(); + + foreach ($groupAttributes AS $groupAttribute) + { + $id_group_attribute = $groupAttribute['id_attribute_group']; + $id_attribute = $groupAttribute['id_attribute']; + $id_product_attribute = $groupAttribute['id_product_attribute']; + $combinaison[$id_product_attribute][$id_group_attribute] = $id_attribute; + } + + $productAttributes = Db::getInstance()->ExecuteS(' + SELECT pa.id_product_attribute, pa.weight, pa.quantity, pi.id_image + FROM '._DB_PREFIX_.'product_attribute pa + LEFT JOIN '._DB_PREFIX_.'product_attribute_image pi ON (pa.id_product_attribute = pi.id_product_attribute) + WHERE pa.id_product = '.(int)$sqlProduct['id_product']); + + if(!empty($productAttributes)) + { + foreach ($productAttributes AS $productAttribute) + { + $id_product_attribute = (int)$productAttribute['id_product_attribute']; + + $attributeCombination = $product->addChild('attribute-combination'); + $attributeCombination->addAttribute('id', $id_product_attribute); + $attributeCombination->addChild('weight', (float)($sqlProduct['weight'] + $productAttribute['weight'])); + $attributeCombination->addChild('final-retail-price-with-tax', Product::getPriceStatic((int)($sqlProduct['id_product']), true, $id_product_attribute)); + $attributeCombination->addChild('final-retail-price-without-tax', Product::getPriceStatic((int)($sqlProduct['id_product']), false, $id_product_attribute)); + $attributeCombination->addChild('quantity', $productAttribute['quantity']); + + if (isset($productAttribute['id_image']) && !empty($productAttribute['id_image'])) + { + $image = $attributeCombination->addChild('image'); + $image->addAttribute('ref-id', $productAttribute['id_image']); + } + + if (isset($combinaison[$id_product_attribute]) && !empty($combinaison[$id_product_attribute])) + { + foreach ($combinaison[$id_product_attribute] AS $id_group_attribute => $id_attribute) + { + $attribute = $attributeCombination->addChild('attribute'); + $attribute->addAttribute('group-ref-id', $id_group_attribute); + $attribute->addAttribute('ref-id', $id_attribute); + } + } + } + } + } + echo $products->asXML(); + } + + + private function _displayCSSAndJS() + { + return ' + '; + } + + private function _displayImageSelector() + { + $max_width = 60; + $max_height = 60; + $dir = _PS_MODULE_DIR_.$this->name.'/logos/'; + + $out = '
      '. + $this->l('Select a picture below or upload a new one.').'
      + + +
      '; + + if (is_dir($dir) AND $dh = opendir($dir)) + { + while (($file = readdir($dh)) !== false) + { + $filename = $dir.$file; + if (is_file($filename) AND in_array(substr($filename, -4), $this->allowed_extensions)) + { + list($width, $height) = getimagesize($filename); + + if ($width > $height) + { + if ($width > $max_width) + { + $ratio = $width / $max_width; + $width = $max_width; + $height = $height / $ratio; + } + } + elseif ($height > $max_height) + { + $ratio = $height / $max_height; + $height = $max_height; + $width = $width / $ratio; + } + + $out .= '
      '; + } + } + closedir($dh); + } + + $out .= '
      '; + return $out; + } + + public function displayForm() + { + global $cookie; + + $lang = new Language((int)($cookie->id_lang)); + + $output = $this->_displayCSSAndJS().'

      '.$this->displayName.'

      + +

      '.$this->l('It is well known that product videos increase sales, customer engagement and loyalty, and enhance your shoppers experience dramatically. They also enhance your shoppers\' overall experience and have a strong positive effect on your search engine visibility.').'. '.$this->l('Learn more').'


      '; + + $output .= ' +
      + '.$this->l('My Treepodia account').''; + + if (!Configuration::get('TREEPODIA_ACCOUNT_CODE')) + { + $output .= ' +

      '.$this->l('You are not yet registered for a Treepodia video account. Please register with Treepodia.').'

      +

      +
      '; + } + else + { + $output .= ' + +
      +
      ' + .$this->l('Your video account code uniquely identifies your store and was assigned to you automatically.').' +

      +

      + '.$this->l('Sign in to your video account to change your preferences, settings and see your business performance reports.').' +

      '; + } + + $output .= '

      '; + + if (Configuration::get('TREEPODIA_ACCOUNT_CODE')) + { + $output .= ' +
      + '.$this->l('Settings').' +
      + +

      '.$this->l('The built-in integration automatically embeds Treepodia integration code into your store and displays a link to the video on your product page.').'


      +

      '.$this->l('Current logo:').'
      +

      +
      + +
      +

      + '.$this->_displayImageSelector().' +

      +
      +

      '.$this->l('Display logo:').'
      + +

      '.$this->l('Place logo here:').'

      +
      '.$this->l('Product picture').'
      + + + +
      +
      +
      + +

      '.$this->l('Use this option if you wish to implement the Treepodia integration code on your own. The built-in integration code will be deactivated if you choose this option.').' '.$this->l('Read here how to implement Treepodia integration code on your own.').'

      +
      + +
      '; + } + + return $output; + } + + public function getContent() + { + $out = ''; + if (Tools::isSubmit('submitTreepodia')) + { + $errors = $this->_validateForm(); + $out .= (empty($errors) ? $this->_postProcess() : $errors); + } + $out .= $this->displayForm(); + return $out; + } + + private function _validateForm() + { + $errors = ''; + if (Tools::getValue('trpd_integration_type') != 0 AND Tools::getValue('trpd_integration_type') != 1) + $errors .= $this->displayError('Invalid Integration Type'); + + $file = $_FILES['trpd_logo_file']; + + if ($file AND !empty($file['name'])) + { + if ($file['error']) + { + switch ($file['error']) + { + case 1: + $errors .= $this->displayError('The file is too large.'); + break; + case 2: + $errors .= $this->displayError('The file is too large.'); + break; + case 3: + $errors .= $this->displayError('The file was partialy uploaded'); + break; + case 4: + $errors .= $this->displayError('The file is empty'); + break; + } + } + + if (!in_array(substr($file['name'], -4), $this->allowed_extensions)) + $errors .= $this->displayError($this->l('Invalid file type')); + } + elseif (!is_file(_PS_MODULE_DIR_.$this->name.'/logos/'.Tools::getValue('trpd_play_logo'))) + $errors .= $this->displayError('Invalid logo'); + + return $errors; + } + + private function _postProcess() + { + Configuration::updateValue('TREEPODIA_INTEGRATION_TYPE', (int)(Tools::getValue('trpd_integration_type'))); + + $position = Tools::getValue('trpd_position'); + if ($position < 0 || $position > 2) $position = 0; + + Configuration::updateValue('TREEPODIA_POSITION', $position); + + $file = $_FILES['trpd_logo_file']; + if ($file AND $file['name']) + { + $name = time().'-'.$_FILES['trpd_logo_file']['name']; + move_uploaded_file($_FILES['trpd_logo_file']['tmp_name'], _PS_MODULE_DIR_.$this->name.'/logos/'.$name); + Configuration::updateValue('TREEPODIA_PLAY_LOGO', $name); + } + else + Configuration::updateValue('TREEPODIA_PLAY_LOGO', Tools::getValue('trpd_play_logo')); + + $this->_sendUpdate(); + + if (Tools::getValue('trpd_hook_position') == 0) + { + Configuration::updateValue('TREEPODIA_HOOK', 0); + $this->unregisterHook(Hook::get('productFooter')); + $this->registerHook('extraLeft'); + } + else + { + Configuration::updateValue('TREEPODIA_HOOK', 1); + $this->unregisterHook(Hook::get('extraLeft')); + $this->registerHook('productFooter'); + } + + $dataSync = ''; + + return $this->displayConfirmation($this->l('Settings updated').$dataSync); + } + + private function _sendUpdate() + { + $host = 'www.treepodia.com'; + $uri = '/prestashop/api/account-settings-set'; + + if (!ini_get('allow_url_fopen')) + return false; + + if ($socket = fsockopen('ssl://'.$host, 443, $errno, $errstr, 30)) + { + $params = 'prestashop-api='._PS_BASE_URL_._MODULE_DIR_.$this->name.'/api'. + '&account-code='.Configuration::get('TREEPODIA_ACCOUNT_CODE'). + '&integration='.(Configuration::get('TREEPODIA_INTEGRATION_TYPE') == 0 ? 'built-in' : 'custom'). + '&watch-video-image-url='._PS_BASE_URL_._MODULE_DIR_.$this->name.'/logos/'.Configuration::get('TREEPODIA_PLAY_LOGO'). + '&watch-video-image-location=top-left'; + + $header = 'GET '.$uri.'?'.$params.' HTTP/1.1'."\r\n"; + $header .= 'Host: '.$host."\r\n"; + $header .= 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; + $header .= 'Content-Length: '.strlen($params)."\r\n". + $header .= 'Connection: Close'."\r\n\r\n"; + + fputs($socket, $header.$params); + + $result = ''; + while (!feof($socket)) + $result .= trim(fgets($socket, 1024)); + + fclose($socket); + } + + } + + private function _isAccountCode($accountCode) + { + return ereg('^[A-Z]+[0-9]+$', $accountCode); + } + + public function hookExtraLeft($params) + { + global $smarty; + + $id_product = Tools::getValue('id_product'); + if (!Configuration::get('TREEPODIA_ACCOUNT_CODE') OR Configuration::get('TREEPODIA_INTEGRATION_TYPE') != 0) + return ''; + + switch(Configuration::get('TREEPODIA_POSITION')) + { + case 0: + $position = 'left'; + break; + case 1: + $position = 'center'; + break; + case 2: + $position = 'right'; + break; + default: + $position = 'left'; + } + + $smarty->assign(array('position' => $position, 'img_src' => _MODULE_DIR_.$this->name.'/logos/'.Configuration::get('TREEPODIA_PLAY_LOGO'), 'account_id' => Configuration::get('TREEPODIA_ACCOUNT_CODE'), 'product_sku' => (int)($id_product))); + return $this->display(__FILE__, 'product.tpl'); + } + + public function hookProductFooter($params) + { + return $this->hookExtraLeft($params); + } + + + public function hookFooter($params) + { + global $smarty; + + if (!Configuration::get('TREEPODIA_ACCOUNT_CODE') OR Configuration::get('TREEPODIA_INTEGRATION_TYPE') != 0) + return; + if (!(int)Tools::getValue('id_product')) + return; + + $smarty->assign(array('account_id' => Configuration::get('TREEPODIA_ACCOUNT_CODE'), 'product_sku' => (int)Tools::getValue('id_product'))); + return $this->display(__FILE__, 'footer.tpl'); + } + + public function hookProductDescription($params) + { + return $this->hookExtraLeft($params); + } + + public function hookOrderConfirmation($params) + { + $order = $params['objOrder']; + $products = $order->getProducts(); + + global $smarty; + $smarty->assign(array('account_id' => Configuration::get('TREEPODIA_ACCOUNT_CODE'), 'products' => $products)); + return $this->display(__FILE__, 'tracking.tpl'); + } +} + diff --git a/modules/treepodia/video-sitemap.php b/modules/treepodia/video-sitemap.php new file mode 100644 index 000000000..c4ad7e913 --- /dev/null +++ b/modules/treepodia/video-sitemap.php @@ -0,0 +1,7 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class RatingAlert +{ + const TABLE_NAME = 'ts_rating_alert'; + const MAIL_TEMPLATE = 'rating_email'; + + public static function save($id_order) + { + Db::getInstance()->AutoExecute(_DB_PREFIX_.self::TABLE_NAME, array('id_order' => (int)($id_order)), 'INSERT'); + } + + private static function _getAlertsInformations($nb_days = 10) + { + return Db::getInstance()->ExecuteS(' + SELECT a.id_alert, c.`email`, o.`id_order`, o.`id_lang` + FROM `'._DB_PREFIX_.self::TABLE_NAME.'` a + LEFT JOIN '._DB_PREFIX_.'orders o ON (a.id_order = o.id_order) + LEFT JOIN '._DB_PREFIX_.'customer c ON (c.id_customer = o.id_customer) + WHERE DATE_ADD(o.`date_add`, INTERVAL '.(int)($nb_days).' DAY) <= NOW()'); + } + + public static function removeAlerts($ids) + { + $to_remove = array(); + foreach ($ids AS $id) + $to_remove[] = (int)($id); + + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_alert` IN (\''.implode('\',\'', $to_remove).'\')'); + } + + public static function executeCronTask() + { + global $cookie; + if (!Configuration::get('TS_SEND_SEPERATE_MAIL')) + return true; + + $to_remove = array(); + $alerts_infos = RatingAlert::_getAlertsInformations((int)(Configuration::get('TS_SEND_SEPERATE_MAIL_DELAY'))); + + $ts_module = new TrustedShops(); + + foreach ($alerts_infos AS $infos) + { + $cookie->id_lang = $infos['id_lang']; + $subject = $ts_module->getL('title_part_1').' '.Configuration::get('PS_SHOP_NAME').$ts_module->getL('title_part_2'); + $template_vars = array('{ts_id}' => Configuration::get('TS_ID_'.(int)($infos['id_lang'])), + '{button_url}' => TrustedShops::getHttpHost(true, true)._MODULE_DIR_.$ts_module->name.'/img', + '{rating_url}' => $ts_module->getRatingUrlWithBuyerEmail($infos['id_lang'], $infos['id_order'], $infos['email'])); + + $result = Mail::Send((int)($infos['id_lang']), self::MAIL_TEMPLATE, $subject, $template_vars, $infos['email'], NULL, Configuration::get('PS_SHOP_EMAIL'), Configuration::get('PS_SHOP_NAME'), NULL, NULL, dirname(__FILE__).'/mails/'); + + if ($result) + $to_remove[] = (int)($infos['id_alert']); + } + + if (sizeof($to_remove) > 0) + self::removeAlerts($to_remove); + + return (sizeof($to_remove) == sizeof($alerts_infos)); + } + + public static function createTable() + { + return Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'` ( + `id_alert` INT NOT NULL AUTO_INCREMENT, + `id_order` INT NOT NULL, + PRIMARY KEY (`id_alert`), + UNIQUE KEY `id_order` (`id_order`) + ) ENGINE = '._MYSQL_ENGINE_); + } + + public static function dropTable() + { + return Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'`'); + } + + public static function truncateTable() + { + return Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.self::TABLE_NAME.'`'); + } +} + diff --git a/modules/trustedshops/TrustedShopsSoapApi.php b/modules/trustedshops/TrustedShopsSoapApi.php new file mode 100644 index 000000000..e67035447 --- /dev/null +++ b/modules/trustedshops/TrustedShopsSoapApi.php @@ -0,0 +1,71 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class TrustedShopsSoapApi +{ + const TS_SERVER = 'www.trustedshops.de'; + const WS_USER = 'presta-shopsoftware'; + const WS_PASSWORD = 'Yx1F5uXR'; + + const ACTIVATE = 1; + const DESACTIVATE = 0; + + const RT_OK = 'OK'; + const RT_SOAP_ERROR = -1; + const RT_INVALID_TSID = 'INVALID_TSID'; + const RT_NOT_REGISTERED = 'NOT_REGISTERED_FOR_TRUSTEDRATING'; + const RT_WRONG_LOGIN = 'WRONG_WSUSERNAME_WSPASSWORD'; + + + public static function validate($partener_package, $trusted_shops_id, $action = self::ACTIVATE) + { + $ini = ini_set('soap.wsdl_cache_enabled', 1); + $result = self::RT_SOAP_ERROR; + + try + { + $wsdlUrl = 'https://'.self::TS_SERVER.'/ts/services/TsRating?wsdl'; + $client = new SoapClient($wsdlUrl); + + $result = $client->updateRatingWidgetState($trusted_shops_id, $action, self::WS_USER, self::WS_PASSWORD, $partener_package); + } + catch(SoapFault $fault) + { + $errorText = 'SOAP Fault: (faultcode:{$fault->faultcode}, faultstring:{$fault->faultstring})'; + + /** Enable this line if you are experiencing issues with your Trusted Shops ID activation. + die($errorText); + */ + } + + if ($result == self::RT_WRONG_LOGIN) + die('Wrong login/password'); + + return $result; + } +} + diff --git a/modules/trustedshops/WidgetCache.php b/modules/trustedshops/WidgetCache.php new file mode 100644 index 000000000..ff783f3c7 --- /dev/null +++ b/modules/trustedshops/WidgetCache.php @@ -0,0 +1,52 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class WidgetCache +{ + private $_fileName; + private $__ts_id; + + public function __construct($_fileName, $_ts_id) + { + $this->_fileName = $_fileName; + $this->_ts_id = $_ts_id; + } + + public function isFresh($timeout = 10800) + { + if (file_exists($this->_fileName)) + return ((time() - filemtime($this->_fileName)) < $timeout); + else + return false; + } + + public function refresh() + { + return file_put_contents($this->_fileName, file_get_contents('https://www.trustedshops.com/bewertung/widget/widgets/'.$this->_ts_id.'.gif')); + } +} + diff --git a/modules/trustedshops/config.xml b/modules/trustedshops/config.xml new file mode 100755 index 000000000..eb4351eb0 --- /dev/null +++ b/modules/trustedshops/config.xml @@ -0,0 +1,13 @@ + + + trustedshops + + + + + + Are you sure you want to delete all your settings? + 1 + 1 + + \ No newline at end of file diff --git a/modules/trustedshops/cron.php b/modules/trustedshops/cron.php new file mode 100644 index 000000000..4499b8d0e --- /dev/null +++ b/modules/trustedshops/cron.php @@ -0,0 +1,34 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__) .'/trustedshops.php'); + +if (isset($_GET['secure_key']) AND Configuration::get('PS_TS_TAB0_SECURE_KEY') == $_GET['secure_key']) + RatingAlert::executeCronTask(); + diff --git a/modules/trustedshops/cron_garantee.php b/modules/trustedshops/cron_garantee.php new file mode 100644 index 000000000..2d0f67f03 --- /dev/null +++ b/modules/trustedshops/cron_garantee.php @@ -0,0 +1,39 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +include(dirname(__FILE__).'/../../config/config.inc.php'); +include(dirname(__FILE__).'/../../init.php'); +include(dirname(__FILE__) .'/trustedshops.php'); + +if (isset($_GET['secure_key']) AND !empty($_GET['secure_key']) AND Configuration::get(TSBuyerProtection::PREFIX_TABLE.'SECURE_KEY') == $_GET['secure_key']) +{ + $ts_module = new TrustedShops(); + TSBuyerProtection::setTranslationObject($ts_module); + $bp = new TSBuyerProtection(); + $bp->setModuleName($ts_module->name); + $bp->cronTask(); +} \ No newline at end of file diff --git a/modules/trustedshops/de.php b/modules/trustedshops/de.php new file mode 100644 index 000000000..c5d875958 --- /dev/null +++ b/modules/trustedshops/de.php @@ -0,0 +1,104 @@ +display_products_02ecb4a4709d9bcc590f1a25fc82c0e2'] = 'Trusted Shops Käuferschutz (empfohlen)'; +$_MODULE['<{trustedshops}prestashop>display_products_b55aab8932a39ca85bb0a1b6eb83f83f'] = 'Käuferschutz ab'; +$_MODULE['<{trustedshops}prestashop>display_products_a53a5a9f38f31d62a791717b943e02f3'] = 'Gesamtbetrag inkl. MwSt.'; +$_MODULE['<{trustedshops}prestashop>display_products_b3c25d2f94cf87ece3dbb2907318520c'] = 'Trusted Shops Käuferschutz sichert Ihre Online Bestellung ab. Ich stimme zu, dass meine E-Mail Adresse gespeichert und'; +$_MODULE['<{trustedshops}prestashop>display_products_536a056b710e94b16169efd17a4a657b'] = 'gespeichert'; +$_MODULE['<{trustedshops}prestashop>display_products_2dc4be4d5564180e6df95d5a5a679195'] = 'zu Zwecken des Käuferschutzes von Trusted Shops verwendet wird.'; +$_MODULE['<{trustedshops}prestashop>display_products_229eb04083e06f419f9ac494329f957d'] = 'Konditionen'; +$_MODULE['<{trustedshops}prestashop>display_products_4ccaceceffe4b5e58f6a7a7ed3ced4c4'] = 'für Käuferschutz'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_7b5406da2d5f15923d6b01d3264c5619'] = 'Trusted Shops Gütesiegel - Bitte hier Gültigkeit prüfen!'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_4052048c767f22e9071c3e6f404d00c6'] = 'Als zusätzlichen Service bieten wir Ihnen den Trusted Shops Käuferschutz an. Wir übernehmen alle Kosten dieser Garantie, Sie müssen sich lediglich anmelden.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_f975f42362625cf21e592009ff4b3d7b'] = 'Anmeldung zum Trusted Shops Käuferschutz'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_ee9ae315b086e1b1a0c8fdc6078f9add'] = 'Trusted Shops Gütesiegel - Bitte hier Gültigkeit prüfen!'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_750bea678eeb1d07f21fe86173288e2e'] = 'Testzertifikat für Shopsystempartner DE trägt das Trusted Shops Zertifikat mit Käuferschutz. Mehr...'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_79fc246c2b70963d27ebb0e9ebaab349'] = 'Kontaktieren Sie Trusted Shops unter service@trustedshops.co.uk.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_de14ce5aee772cd0330819c0ecf76adb'] = 'Benutzername oder Passwort ungültig'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_43048f232a4ebab67835c425a1113b29'] = 'Sie haben Ihr Kreditlimit erreicht'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_eb601fb44b908fec1ee41383d4d948ac'] = 'Keine Kredite von Trusted Shops erältlich'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_cb71cc86f5c38200b3821adb49966522'] = 'Daten konnten nicht gespeichert werden'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8711dbcb9166dca544544b027d7edb83'] = 'Ein Fehler ist aufgetreten'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5fb7a36c0bdf3cde4f3e038a0eff2b6f'] = 'Webservice Anmeldung oder TS-ID ist ungültig'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_6453e3467d4c087afbfd33d4013cd3e9'] = 'Bestellnummer wird bereits verwendet'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8100f51dcd57174e15ef0c3b3456e3ca'] = 'Nicht unterstützter Käuferschutz-Produkt'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f9e1392429699e6921d775ca98660faa'] = 'Inaktive Zahlungsmethode'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_1dbec1039be7b747704bde7acddca451'] = 'Nicht unterstützte Zahlungsmethode'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_53cf8eb9e9cb36a367ba553b30cac77a'] = 'Die Währung des Käuferschutz-Produktes passt nicht zu der Währung, die im Warenkorb verwendet wird.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ad1407fbd2b8c75e47b9c15a976c4d2'] = 'Die Währung ist im Shop nicht ntersützt'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_74d27ae48e301b6bbf9bba911a3037e3'] = 'Der Wechselkurs wird nicht unterstützt'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_02a4ecbbc2d936231663c1b3255ba137'] = 'Die Zahlungsmethode wird nicht unterstützt'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f8c4826b4580a3f2e9786ac6bc5c8635'] = 'Für dieses Zertifikat ist kein Kredit limit verfügbar'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f1b7a6cab6562707aea970971edba9c4'] = 'Das Lieferdatum liegt in der Vergangeheit'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_93dff7e30cdf7dec5572f192c774f5ca'] = 'Die Bestellgarantie wurde vor über 3 Tagen gemacht'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_138ed5814f1b04d3c44fe4975acdeefc'] = 'Ungültige E-Mail-Adresse'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5eded1b4097ea8e9bd12bb35fe57b6b1'] = 'Keine Bestellnummer zugewiesen'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5b8230d466534f0cf347188d78c0b248'] = 'Keine Kundennummer zugewiesen'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ace4c2d63acb0eb87071efea55be813'] = 'Das Kreditlimit für dieses Zertifikat ist abgelaufen'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_35caaf4f25a287580302c851d88a29dc'] = 'Keine E-Mail-Adresse zugewiesen'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_0db21cf8f0a16321cda7a2e9e37850c7'] = 'Nicht zuweisbarer Käuferschutz-Produkt'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_db26e10564e958809d798e8048fcbc0a'] = 'Ungültiger Sicherheitsschlüssel'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_36cd72871a0f3dac493a38f5d82f7441'] = 'Allgemeiner Systemfehler, bitte kontaktieren Sie Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_73a61696f100b3858511e212a3feea6b'] = 'Kreditkarte'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_466eadd40b3c10580e3ab4e8061161ce'] = 'Rechnung'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_22d2c7f90dc862df71ac7aff95183fb2'] = 'Nachnahme'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1ff8e518d6a560568fbf66f01e9eb937'] = 'Vorkasse'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Check'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3deb0a4146e33809942e46416fb60228'] = 'Paybox'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4761b2212f04e7409afa7f8103d6fc60'] = 'Bar bei Abholung'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_917709346cd3cefd00e463f65f1a55d8'] = 'Finanzierung'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9e6689415e7e5aa4d42d1f2abc78726c'] = 'Leasing'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1c9f173da9bf497cffc19357ab04a8e8'] = 'T-Pay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_369b94cdb6bac25435d00d04255de1ab'] = 'Click&Buy'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_31911306551723245e7417ae4520fecb'] = 'Giropay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_982830b027a279fdc4b4b7993f65498f'] = 'Online shop payment card'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7e1795d054242cf7c546c1491a7c467d'] = 'DIRECTebanking.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_37554cc43c645833d6713b9cddda909b'] = 'moneybookers.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9203aec73d2ea1770f66f065c4069816'] = 'Andere Zahlungsmethode'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_068ce643ff39bf2189935d14736fd10b'] = 'Siegel und Käuferschutz'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f51dabfce0c8ccc01734ed38d8afe27a'] = 'Json Funktionen müssen in Ihrer php Version eingeschaltet sein.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b1801eaadecfddd04529313a1e929262'] = 'Die Zertifizierung ist gültig'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ce323cb3453812434f9abc007ba7a952'] = 'Die Zertifizierung ist angelaufen'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_98121ffd0d2a0b4bed569a726632f402'] = 'Die Zertifizierung ist deaktiviert'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3ec2499357b45a38139485b2b824aa4c'] = 'Der Shop befindet sich gerade im Zertifizierungsprozess'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a8fcbddffdaccc6daa529aa9c38d82df'] = 'Kein Zertifikat wurde der Trustd Shops ID zugewiesen'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5abbd73fc5189212c57adfb43adac459'] = 'Testzertifizierung'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eaf4354c3a17f478859421ac2e33a975'] = 'Code #'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d9fd9cab8b813e70e20c615abf036307'] = 'Mitteilung :'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_109715467b74bd66639faa5673f707c1'] = 'Unbekannter Fehler.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d4eb1e83b0ea3af3e2b8a6e7b7984d9c'] = 'Das Feld %s ist ungültig, bitte korrekt ausfüllen'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b656f5f53cf7ee9bbfe7452685f71e30'] = 'Trusted Shops API gibt den Fehler in der Anwendung:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd511061055fcb2d10d31a51be3539d0'] = 'Registrierungslink'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_de5536f42490f11e92ad1c20d999fd15'] = 'Registrierungslink anklicken'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Link'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_32ba2d2119a269c536c5d9e1362d5865'] = 'Produkt nicht gespeichert'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_bf67e5e156927e871cc3dd2bde2faa78'] = 'Zertifikat wurde hinzugefügt'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_259060bb469ed1256c2e758e32da126f'] = 'Das Zertifikat'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8512ae7d57b1396273f76fe6ed341a23'] = 'Sprache'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8638c4fb6ff62122acd9927c4edbd22c'] = 'wurde entfernt'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_10b5f8531f2b6a3f6d8abad45024bbea'] = 'Kein Bedarf'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5c697646774e5acf5c5864b6819e82b5'] = 'Zertifikat bearbeiten'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f8c823f9ba0a86ceaa8d3ea7e688595d'] = 'Zertifikat ID'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_92f1b1481fa6ff46c4a3caae78354dab'] = 'Username'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc647eb65e6711e155375218212b3964'] = 'Passwort'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_89c26d1f2de72a1e78d0ae7a7b83880c'] = 'Zu bearbeitende Bezahlart'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_23a58bf9274bedb19375e527a0744fa9'] = 'mit'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd5291d7f0624933870702ff183bb14e'] = 'Bezahlmodul'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b3b1a406e097bc87c8745db26e11904e'] = 'Aktualisieren'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c9ba5f6e6d58162530424afaa68bf496'] = 'Cronjob Konfiguration'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c17d7635f5ee99ee25f7f2cc9a672c74'] = 'Die Datei, die aufgerufen werden soll:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9d36bad327b052a9bdec7003f95ce4bd'] = 'Problem mit Ihrer Sprache:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_03e9e3ceaf5769311c57b5903a958e94'] = 'Ein Käufer kann mehrfachen Käuferschutz nicht kaufen.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c006c102f7e2ffef1f7c1808d5e0e54a'] = 'Kundenbewertungen'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ab78702e34e81e82ca61847300b1618'] = 'Sind Sie zufriedn mit'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_a11109fe93f6dc4637e5b039651a4fdb'] = '? Schreiben Sie bitte eine Kundnemeinung'; +$_MODULE['<{trustedshops}prestashop>trustedshops_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Dieses Modul erfordert die SOAP-PHP-Erweiterung, um ordnungsgemäß zu funktionieren.'; +$_MODULE['<{trustedshops}prestashop>trustedshops_9a983837b32d42343dc0c62d35b1f955'] = 'Trusted Shops Kundenbeurteilung'; +$_MODULE['<{trustedshops}prestashop>trustedshops_eeae17826fa637ecca0344165514ab4e'] = 'Stärken Sie das Vertrauen der Verbraucher und machen Sie mehr Shopper zu Käufer'; +$_MODULE['<{trustedshops}prestashop>trustedshops_968e0f78caa7d3245c8f6f858de993d8'] = 'Sie sind sicher, dass Sie alle Ihre Einstellungen löschen möchten?'; + +?> \ No newline at end of file diff --git a/modules/trustedshops/display_products.tpl b/modules/trustedshops/display_products.tpl new file mode 100644 index 000000000..665ec3dd4 --- /dev/null +++ b/modules/trustedshops/display_products.tpl @@ -0,0 +1,85 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +
      +

      {l s='Trusted Shops Buyer Protection (recommended)' mod='trustedshops'}

      +
      + logo +
      +
      + {foreach from=$buyer_protection_items item=product} +

      {l s='Buyer protection from' mod='trustedshops'} {$product.protected_amount_decimal} ({$product.gross_fee|round:2} {l s='GBP incl. VAT' mod='trustedshops'})

      + {/foreach} +
      +

      {l s='The Trusted Shops Buyer Protection secures your online purchase. I agree to my email address being transferred and' mod='trustedshops'} {l s='saved' mod='trustedshops'} {l s='for the purposes of Buyer Protection processing by Trusted Shops.' mod='trustedshops'}{l s='Conditions' mod='trustedshops'}: {l s='for Buyer Protection.' mod='trustedshops'}

      +
      +
      +
      diff --git a/modules/trustedshops/es.php b/modules/trustedshops/es.php new file mode 100644 index 000000000..a058392d7 --- /dev/null +++ b/modules/trustedshops/es.php @@ -0,0 +1,176 @@ +display_products_02ecb4a4709d9bcc590f1a25fc82c0e2'] = 'Trusted Shops protección comprador (recomendado)'; +$_MODULE['<{trustedshops}prestashop>display_products_b55aab8932a39ca85bb0a1b6eb83f83f'] = 'Protección comprador hasta'; +$_MODULE['<{trustedshops}prestashop>display_products_a53a5a9f38f31d62a791717b943e02f3'] = 'EUR IVA incluído'; +$_MODULE['<{trustedshops}prestashop>display_products_b3c25d2f94cf87ece3dbb2907318520c'] = 'La protección comprador Trusted Shops hace su compra en línea segura. Acepto que mi email sea trasferido y'; +$_MODULE['<{trustedshops}prestashop>display_products_536a056b710e94b16169efd17a4a657b'] = 'guardado'; +$_MODULE['<{trustedshops}prestashop>display_products_2dc4be4d5564180e6df95d5a5a679195'] = 'para el tratamiento de la protección comprador por Trusted Shops.'; +$_MODULE['<{trustedshops}prestashop>display_products_229eb04083e06f419f9ac494329f957d'] = 'Condiciones'; +$_MODULE['<{trustedshops}prestashop>display_products_4ccaceceffe4b5e58f6a7a7ed3ced4c4'] = 'para la protección del comprador.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_7b5406da2d5f15923d6b01d3264c5619'] = 'Cuño Trusted Shops- Pulse aquí para comprobar'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_4052048c767f22e9071c3e6f404d00c6'] = 'Como miembro de Trusted Shops, le ofrecemos un servicio complementario excepcional: la garantía de reembolso Trusted Shops. '; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_f975f42362625cf21e592009ff4b3d7b'] = 'Inscríbase para obtener la garantía de reembolso de Trusted Shops. '; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_ee9ae315b086e1b1a0c8fdc6078f9add'] = 'Cuño Trusted Shops- Pulse aquí para comprobar'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_750bea678eeb1d07f21fe86173288e2e'] = 'es un sitio de venta en línea certificado con la garantía de reembolso de Trusted Shops. '; +$_MODULE['<{trustedshops}prestashop>trustedshops_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Este módulo requiere la extensión PHP SOAP para funcionar correctamente.'; +$_MODULE['<{trustedshops}prestashop>trustedshops_9a983837b32d42343dc0c62d35b1f955'] = 'Trusted Shops Systema de evaluación cliente'; +$_MODULE['<{trustedshops}prestashop>trustedshops_eeae17826fa637ecca0344165514ab4e'] = 'Haga que sus clientes confíen en usted y transforme a sus visitantes en compradores.'; +$_MODULE['<{trustedshops}prestashop>trustedshops_968e0f78caa7d3245c8f6f858de993d8'] = '¿Está seguro de que desea suprimir esta configuración?'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_79fc246c2b70963d27ebb0e9ebaab349'] = 'Póngase en contacto con Trusted Shops en la siguiente dirección service@trustedshop.fr'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_de14ce5aee772cd0330819c0ecf76adb'] = 'El nombre de usuario o contrasea no son válidos.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_43048f232a4ebab67835c425a1113b29'] = 'Se ha anulado la línea de crédito acordada por Trusted Shop.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_eb601fb44b908fec1ee41383d4d948ac'] = 'No existe ninguna línea de crédito en Trusted Shops. '; +$_MODULE['<{trustedshops}prestashop>tsbpexception_cb71cc86f5c38200b3821adb49966522'] = 'No se han podido guardar los datos.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8711dbcb9166dca544544b027d7edb83'] = 'Se ha producido un error. '; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5fb7a36c0bdf3cde4f3e038a0eff2b6f'] = 'Login Web servicio o TS-ID no válido.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_b515cf9cc8234bf6413ed84f5cde066a'] = 'Trusted Shops ha suspendido los límites de crédito de la tienda '; +$_MODULE['<{trustedshops}prestashop>tsbpexception_6453e3467d4c087afbfd33d4013cd3e9'] = 'Número de pedido ya utilizado'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8100f51dcd57174e15ef0c3b3456e3ca'] = 'No acepta este producto de protección comprador'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f9e1392429699e6921d775ca98660faa'] = 'Método de pago inactivo'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_1dbec1039be7b747704bde7acddca451'] = 'Método de pago no aceptado'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_53cf8eb9e9cb36a367ba553b30cac77a'] = 'La divisa del producto de protección comprador no corresponde a la divisa del carrito'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ad1407fbd2b8c75e47b9c15a976c4d2'] = 'Esta tienda no acepta esta divisa'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_74d27ae48e301b6bbf9bba911a3037e3'] = 'No acepta este índice de cambio'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_02a4ecbbc2d936231663c1b3255ba137'] = 'No se acepta este modo de pago'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f8c4826b4580a3f2e9786ac6bc5c8635'] = 'No hay límite de crédito disponible para esta certificado'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f1b7a6cab6562707aea970971edba9c4'] = 'Fecha de entrega caducada'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_93dff7e30cdf7dec5572f192c774f5ca'] = 'La garantía se aplica a una compra efectuada 3 días antes'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_138ed5814f1b04d3c44fe4975acdeefc'] = 'La dirección email contiene un error'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5eded1b4097ea8e9bd12bb35fe57b6b1'] = 'No se ha asignado ningún número de pedido'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5b8230d466534f0cf347188d78c0b248'] = 'No se ha asignado ningún número de cliente'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ace4c2d63acb0eb87071efea55be813'] = 'Se ha sobrepasado el límite de créditos para este certificado'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_35caaf4f25a287580302c851d88a29dc'] = 'No se ha asignado ningún número de dirección email'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_0db21cf8f0a16321cda7a2e9e37850c7'] = 'Producto de protección comprador no aplicable'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_db26e10564e958809d798e8048fcbc0a'] = 'Clave de seguridad no válida'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_36cd72871a0f3dac493a38f5d82f7441'] = 'Error general del sistema, póngase en contacto con Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fed85cfada8f3bbc5ad9eb128227210a'] = 'Cargo en cuenta'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_73a61696f100b3858511e212a3feea6b'] = 'Tarjeta de crédito'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_466eadd40b3c10580e3ab4e8061161ce'] = 'Factura'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_22d2c7f90dc862df71ac7aff95183fb2'] = 'Envío contra reembolso'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1ff8e518d6a560568fbf66f01e9eb937'] = 'Pago / Transferencia previa'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Cheque'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3deb0a4146e33809942e46416fb60228'] = 'Paybox'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4761b2212f04e7409afa7f8103d6fc60'] = 'Pago en el momento de la recogida'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_917709346cd3cefd00e463f65f1a55d8'] = 'Financiación'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9e6689415e7e5aa4d42d1f2abc78726c'] = 'Leasing'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1c9f173da9bf497cffc19357ab04a8e8'] = 'T-Pay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_369b94cdb6bac25435d00d04255de1ab'] = 'Click&Buy'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_31911306551723245e7417ae4520fecb'] = 'Giropay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_982830b027a279fdc4b4b7993f65498f'] = 'Tarjeta de crédito de la tienda en línea'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7e1795d054242cf7c546c1491a7c467d'] = 'DIRECTebanking.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_37554cc43c645833d6713b9cddda909b'] = 'moneybookers.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9203aec73d2ea1770f66f065c4069816'] = 'Otros modos de pago'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_068ce643ff39bf2189935d14736fd10b'] = 'Cuño Trusted Shops y protección comprador'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f51dabfce0c8ccc01734ed38d8afe27a'] = 'Las aplicaciones Json deben ser implementadas en la versión de PHP'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b1801eaadecfddd04529313a1e929262'] = 'El certificado es válido'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ce323cb3453812434f9abc007ba7a952'] = 'El certificado ha caducado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_98121ffd0d2a0b4bed569a726632f402'] = 'El certificado se ha anulado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3ec2499357b45a38139485b2b824aa4c'] = 'La tienda está en curso de identificación'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a8fcbddffdaccc6daa529aa9c38d82df'] = 'No se ha distribuido ningún certificado para esta ID Trusted Shops '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5abbd73fc5189212c57adfb43adac459'] = 'Certificado de test'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eaf4354c3a17f478859421ac2e33a975'] = 'Código n°'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d9fd9cab8b813e70e20c615abf036307'] = 'mensaje:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_109715467b74bd66639faa5673f707c1'] = 'Error desconocido'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d4eb1e83b0ea3af3e2b8a6e7b7984d9c'] = 'el campo % es erróneo, compruebe que lo ha rellenado correctamente'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c230eb5eefd15fa219ff97d42e461a7d'] = 'Algunos parámetros enviados al método \"requestForProtectionV2\" son falsos o inexistentes.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b656f5f53cf7ee9bbfe7452685f71e30'] = 'El API de Trusted Shops envía un error que concierne a la aplicación n°'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fdf1d399a4b88e3c62ff925295a4bb0c'] = 'El número % 1$d de la aplicación Trusted Shops a funcionado con éxito. El número de garantía es: %2$d'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd511061055fcb2d10d31a51be3539d0'] = 'Link de registro'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_de5536f42490f11e92ad1c20d999fd15'] = 'Pulse para recibir el link de registro'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_58e9c4050ed75489c2108a1b316f1251'] = 'Se ha creado el link de registro. Pulse sobre este link si no ha sido redirigido'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Link'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_32ba2d2119a269c536c5d9e1362d5865'] = 'El producto no se ha guardado.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_bf67e5e156927e871cc3dd2bde2faa78'] = 'Se ha añadido el certificado.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8e3ee664fd829b2fa78533957c1041ce'] = 'Debe editar o suprimir los certificados uno por uno.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_259060bb469ed1256c2e758e32da126f'] = 'El certificado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8512ae7d57b1396273f76fe6ed341a23'] = 'idioma'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8638c4fb6ff62122acd9927c4edbd22c'] = 'ha sido suprimido'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a599ec4408db04d4bb9e4edd78b849f4'] = 'Certificado de inicio de sesión es un éxito'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b18f5630d5ffdfcee5ab0a44ee6e1eb6'] = 'Tiene que crear un nombre de usuario y una contraseña antes de efectuar cualquier cambio.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_e32263743aac776e5e32fc385d8b669a'] = 'Trusted Shops es el sello de calidad europea para sitios de venta en línea con garantía de reembolso para sus clientes. En el momento de la certificación, su tienda está sometida a una auditoría que agrupa más de 1000 criterios diferentes que respetan las exigencias de las asociaciones de protección de los consumidores, así como las legislaciones nacionales y europeas. '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_2c786e15a571a442adf85460e6358883'] = '¡Más confianza implica más ventas!'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_e06f60bb083e167516a94aafd5a3a2e2'] = 'El sello de calidad Trusted Shops es ideal para aumentar la confianza de los clientes en su tienda en línea. Cuanto más confíen los clientes en su sitio Wab, más compras realizarán el el mismo.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8dd66ca6788218bd7d2ba7fe43c34f63'] = 'Disminución de las interrupciones de los pedidos'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5580bc4adbb864a67180bf2f058393f3'] = 'Puede proponer a sus clientes en línea un argumento importante: la protección comprador Trusted Shops que asegura al cliente en caso de no reembolso o si no reciba la mercancía. Este seguro suplementario permite reducir la interrupción de los pedidos. '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_710142158c105c01ef807ce959cbc451'] = 'Una fidelización clientela fructuosa y durable'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f7e15d97ad927ef705de61e787883ada'] = 'Para aumentar las compras en línea, el sello de calidad Trusted Shops con protección comprador es un criterio de calidad durable para compras en línea seguras. Es una manera de transformar clientes únicos en clientes fieles. '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7442a1e0ab5e2e26ca9363d226b93d13'] = 'Ambiente tipo'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8e77e16312de3f95afdf5b92b10232a2'] = 'En este momento está usando el modo:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc62561dd8d390e274487516e869fc93'] = 'Obtenir el link de registro'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6e637d8b8b8a933612b19c881d33672d'] = 'Esta variable ha sido enviada por email por Tructed Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_233a96df2f68dbeafaa3126edadc1ce8'] = 'Identificación interna del software de la tienda en Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_261720a5c993fb1cfad560d874d06254'] = 'Canal del Etracker'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_02977dc4b8561c8d7312b1931782c36b'] = 'Campaña del Etrackter'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4994a8ffeba4ac3140beb89e8d41f174'] = 'Idioma'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_2541d938b0a58946090d7abdde0d3890'] = 'enviar'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_72ca0dcf49befb037f8d4734ee0a2a1c'] = 'Añadir un certificado Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_48e31908bfdcda34b0f01cad9d7077af'] = 'Nuevo certificado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_75904cf055527a97739601e0f5ff7e51'] = 'Añadir el'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_566853604b7330b3adbb9105cb15e96b'] = 'Editar los certificados Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eb0f48a107df1a0f343d4cd513b555e6'] = 'Certificado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_46a2a41cc6e552044816a2d04634545d'] = 'Estado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Tipo'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c61ebc45acfe2f244e91ac4cd423e81'] = 'Url de la tienda'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7dce122004969d56ae2e0245cb754d35'] = 'Editar'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f2a6c498fb90ee345d997f888fce3b18'] = 'Suprimir'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97bd7efe2f4d953cc0b77a25ff053d97'] = 'Contraseña o login inexistentes'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_10b5f8531f2b6a3f6d8abad45024bbea'] = 'Innecesario'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5c697646774e5acf5c5864b6819e82b5'] = 'Editar el certificado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f8c823f9ba0a86ceaa8d3ea7e688595d'] = 'Id del certificado'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_92f1b1481fa6ff46c4a3caae78354dab'] = 'Nombre de usuario'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc647eb65e6711e155375218212b3964'] = 'Contraseña'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_89c26d1f2de72a1e78d0ae7a7b83880c'] = 'Tipo de pago para editar'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_23a58bf9274bedb19375e527a0744fa9'] = 'con'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd5291d7f0624933870702ff183bb14e'] = 'módulo de pago'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b3b1a406e097bc87c8745db26e11904e'] = 'Actualizar'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c9ba5f6e6d58162530424afaa68bf496'] = 'Configuración del cron'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9a82b12b4b1fe9b34ce7c2952f0284d2'] = 'Debe añadir una tarea cron en su servidor, que funcionen para sus certificados EXCELLENT'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c17d7635f5ee99ee25f7f2cc9a672c74'] = 'El archivo que debe llamar:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a3c2818ac0ecfe9beff0973388eedd69'] = 'Trusted Shops aconseja que se automatice la búsqueda para una tarea cron con un intervalo de 10 minutos.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b40495f7999e31d4abed3183d2e3cd25'] = 'La protección comprador de Trusted Shops requiere un login para funcionar. '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9d36bad327b052a9bdec7003f95ce4bd'] = 'Se ha producido un error con su idioma:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_03e9e3ceaf5769311c57b5903a958e94'] = 'Un comprador no puede comprar varios productos de protección comprador'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_26a7019f9c88a24e63ebc690e9527f31'] = 'Va a recibir un email de Trusted Shops con su número de garantía.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c006c102f7e2ffef1f7c1808d5e0e54a'] = 'Trusted Shops Sistema de aealuación cliente'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b20a16afda98421bbf7457ccfa50e311'] = 'Este módulo necesita los derechos de lectura y de escritura en el repertorio cache del módulo.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Este módulo necesita la extensión PHP SOAP para funcionar correctamente.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_1097e2b0ee70e248749f0d0a9292df56'] = 'ID Trusted Shops no válido'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_086dbc83aa6b78fa9a234d264ba5808a'] = 'Diferido no válido'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_24bbca53f91f119c930d147557a4e997'] = 'Por favor, régístrese'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_6c92285fa6d3e827b198d120ea3ac674'] = 'aquí'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9ad6278cff9ee53a9970b3a9ecc00a5c'] = 'o contacte con service@trustedshops.com.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b4fc8e4eaf37aa936859367ad7c642ca'] = 'El sistema de evaluación Trusted Shops aún no se ha activado para este Trusted Shops ID'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_8db5bd2272b51b3525ad7661c10d8b2b'] = 'Se ha producido un error'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c888438d14855d7d96a2724ee9c306bd'] = 'Configuración actualizada'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Activo'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_eeb41070f0552af9f1339ed58da237fb'] = 'Inactivo mientras no especifique su Trusted Shops ID'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9eb274fb901206f4fc8345a787443269'] = 'Atención, se van a suprimir las alertas existentes'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2a94082b582d0620bae922fc14c36444'] = 'Configuración básica'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_e66ff458a8281bc8983ef58f991accb0'] = 'Por favor, introduzca su Trusted Shops ID (un ID diferente por idioma)'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9dc0b7bdd32d5e30f4d71eb5abb6b8d4'] = 'Parámetros que se muestran'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b30cb94d482485bf0bf7015520ffb557'] = 'Mostrar widget en la tienda'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_75a1b325a14f20c2cbb97061d1340451'] = 'Link de evaluación en la tienda'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ab2ededbdea4f61279ec75b5777d39a0'] = 'Link de evaluación en la página de confirmación'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ef0e903dffb94fd6d4362340d2f74a15'] = 'Enviar valoración de enlaces en un correo electrónico por separado'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_d344c0ebc1a11797405e4115a8260deb'] = 'Enviar el email después de'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_44fdec47036f482b68b748f9d786801b'] = 'día(s)'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9013b630235e2a5c48b7357e23e1bd2f'] = 'IMPORTANTE:'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ed8b925eb242d6a40ff29ec1a5141b3'] = 'Añada esta URL en una tarea Cron o llámela manualmente cada día'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c9cc8cce247e49bae79f15173ce97354'] = 'Guardar'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_f5395c9793af8a11b406ca7c1ac70da9'] = 'Más información'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9a983837b32d42343dc0c62d35b1f955'] = 'Trusted Shops Systema de evaluación cliente'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_5b91fe21d207317c7c9fad225a7ce442'] = 'Para los compradores en línea, las evaluaciones positivas y que los clientes pueden comprobar, son la muestra que un sitio Web es digno de confianza. El software requerido ya existe en PrestaShop, por lo que unos clics son suficientes para ir a buscar las evaluciones de clientes en su sitio Web. '; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c81bc534bc261e4107a5c30257fb5ba4'] = 'Ayuda para orientar a sus clientes'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ec1bfc4d5646681a86038f770be8fd0b'] = 'Los mejores vendedores son los clientes satisfechos. Haga que sus clientes corran la voz de lo buenos que son los productos de su tienda.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_866a520be0de10a4fc8958a9e89126c3'] = 'Base de optimización del sitio'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9c6dfeed0caab43f7ff0f6bbd19b27dd'] = 'Con sus intervenciones, sus clientes le ayudan a optimizar el proceso de compra en su sitio. Cuanto mejor funcione su tienda, más satisfechos estarán sus clientes.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_0fac19c0cc6e205682dd52d61dd5a0a2'] = 'Difusión en Facebook, Twitter y Google'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_afe906fe9448ed1b480b3eec383461de'] = 'Sus clientes dan opiniones y evaluaciones en Facebook y Twitter directamente a sus amigos y conocidos. Las evaluaciones se integran directamente en el Google-Index y se tienen en cuenta en Google Shopping.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_273769f3a3d91979bfdb5ca4909c517a'] = 'Crear una cuenta Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ab78702e34e81e82ca61847300b1618'] = '¿Está satisfecho de su compra en'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_a11109fe93f6dc4637e5b039651a4fdb'] = '? ¡Denos su opinión!'; diff --git a/modules/trustedshops/fr.php b/modules/trustedshops/fr.php new file mode 100644 index 000000000..af4951bd4 --- /dev/null +++ b/modules/trustedshops/fr.php @@ -0,0 +1,176 @@ +display_products_02ecb4a4709d9bcc590f1a25fc82c0e2'] = 'Trusted Shops protection acheteur (recommandée)'; +$_MODULE['<{trustedshops}prestashop>display_products_b55aab8932a39ca85bb0a1b6eb83f83f'] = 'Protection acheteur jusqu\'à'; +$_MODULE['<{trustedshops}prestashop>display_products_a53a5a9f38f31d62a791717b943e02f3'] = 'EUR TVA incluse'; +$_MODULE['<{trustedshops}prestashop>display_products_b3c25d2f94cf87ece3dbb2907318520c'] = 'La protection acheteur Trusted Shops sécurise votre achat en ligne. J’accepte le transfert et la'; +$_MODULE['<{trustedshops}prestashop>display_products_536a056b710e94b16169efd17a4a657b'] = 'sauvegarde'; +$_MODULE['<{trustedshops}prestashop>display_products_2dc4be4d5564180e6df95d5a5a679195'] = 'de mon adresse email pour le traitement de la protection acheteur par Trusted Shops.'; +$_MODULE['<{trustedshops}prestashop>display_products_229eb04083e06f419f9ac494329f957d'] = 'Conditions'; +$_MODULE['<{trustedshops}prestashop>display_products_4ccaceceffe4b5e58f6a7a7ed3ced4c4'] = 'pour la protection acheteur.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_7b5406da2d5f15923d6b01d3264c5619'] = 'Sceau Trusted Shops - Cliquez pour le verifier.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_4052048c767f22e9071c3e6f404d00c6'] = 'En tant que membre Trusted Shops, nous vous offrons un service complémentaire exceptionnel: la garantie de remboursement Trusted Shops. Les frais relatifs à cette garantie sont entièrement à notre charge, alors n\'hésitez pas, il vous suffit de vous inscrire.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_f975f42362625cf21e592009ff4b3d7b'] = 'Enregistrez-vous pour la garantie de remboursement Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_ee9ae315b086e1b1a0c8fdc6078f9add'] = 'Sceau Trusted Shops - Cliquez pour le verifier.'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_750bea678eeb1d07f21fe86173288e2e'] = 'est un site marchand certifié avec la garantie de remboursement de Trusted Shops. En savoir plus...'; +$_MODULE['<{trustedshops}prestashop>trustedshops_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Ce module requiert l\'extension PHP SOAP pour fonctionner correctement.'; +$_MODULE['<{trustedshops}prestashop>trustedshops_9a983837b32d42343dc0c62d35b1f955'] = 'Trusted Shops Système d’évaluation client'; +$_MODULE['<{trustedshops}prestashop>trustedshops_eeae17826fa637ecca0344165514ab4e'] = 'Boostez la confiance de vos clients et transformez vos visiteurs en acheteurs.'; +$_MODULE['<{trustedshops}prestashop>trustedshops_968e0f78caa7d3245c8f6f858de993d8'] = 'Etes-vous sûr de vouloir supprimer votre configuration?'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_79fc246c2b70963d27ebb0e9ebaab349'] = 'Veuillez contacter Trusted Shops à l\'adresse service@trustedshops.fr'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_de14ce5aee772cd0330819c0ecf76adb'] = 'Le nom d\'utilisateur ou le mot de passe n\'est pas valable.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_43048f232a4ebab67835c425a1113b29'] = 'La ligne de crédit accordée par Trusted Shops a été annulée.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_eb601fb44b908fec1ee41383d4d948ac'] = 'Aucune ligne de crédit n\'existe chez Trusted Shops.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_cb71cc86f5c38200b3821adb49966522'] = 'Les données n\'ont pas pu être sauvegardées.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8711dbcb9166dca544544b027d7edb83'] = 'Une erreur est survenue.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5fb7a36c0bdf3cde4f3e038a0eff2b6f'] = 'Web service login ou TS-ID invalide'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_b515cf9cc8234bf6413ed84f5cde066a'] = 'Les limites de crédits de la boutique on était suspendu par Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_6453e3467d4c087afbfd33d4013cd3e9'] = 'Numéro de commande déjà utilisé'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8100f51dcd57174e15ef0c3b3456e3ca'] = 'Produit de protection acheteur non supporté'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f9e1392429699e6921d775ca98660faa'] = 'Méthode de paiement inactive'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_1dbec1039be7b747704bde7acddca451'] = 'Méthode de paiement non supportée'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_53cf8eb9e9cb36a367ba553b30cac77a'] = 'La devise du produit de protection acheteur ne correspond pas à la devise du panier'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ad1407fbd2b8c75e47b9c15a976c4d2'] = 'La devise n\'est pas supportée par cette boutique'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_74d27ae48e301b6bbf9bba911a3037e3'] = 'Ce taux de change n\'est pas supporté'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_02a4ecbbc2d936231663c1b3255ba137'] = 'Cette méthode de paiement n\'est pas supportée'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f8c4826b4580a3f2e9786ac6bc5c8635'] = 'Pas de limite de crédit disponible pour ce certificat'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f1b7a6cab6562707aea970971edba9c4'] = 'La date de livraison est dépassée'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_93dff7e30cdf7dec5572f192c774f5ca'] = 'la garantie est pour un achat effectué 3 jours auparavant'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_138ed5814f1b04d3c44fe4975acdeefc'] = 'L\'adresse e-mail contient une erreur'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5eded1b4097ea8e9bd12bb35fe57b6b1'] = 'Aucun numéro de commande n\'a été assigné'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5b8230d466534f0cf347188d78c0b248'] = 'Aucun numéro de client n\'a été assigné'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ace4c2d63acb0eb87071efea55be813'] = 'La limite de crédits pour ce certificat a été dépassée'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_35caaf4f25a287580302c851d88a29dc'] = 'Aucune adresse e-mail n\'a été assignée'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_0db21cf8f0a16321cda7a2e9e37850c7'] = 'Produit de protection acheteur non applicable'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_db26e10564e958809d798e8048fcbc0a'] = 'Clé de sécurité invalide'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_36cd72871a0f3dac493a38f5d82f7441'] = 'Erreur générale du système, veuillez contacter Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fed85cfada8f3bbc5ad9eb128227210a'] = 'Prélèvement bancaire'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_73a61696f100b3858511e212a3feea6b'] = 'Carte de crédit'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_466eadd40b3c10580e3ab4e8061161ce'] = 'Facture'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_22d2c7f90dc862df71ac7aff95183fb2'] = 'Envoi contre remboursement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1ff8e518d6a560568fbf66f01e9eb937'] = 'Paiement / Virement préalable'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Chèque bancaire'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3deb0a4146e33809942e46416fb60228'] = 'Paybox'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4761b2212f04e7409afa7f8103d6fc60'] = 'Paiement à l’enlèvement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_917709346cd3cefd00e463f65f1a55d8'] = 'Financement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9e6689415e7e5aa4d42d1f2abc78726c'] = 'Leasing'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1c9f173da9bf497cffc19357ab04a8e8'] = 'T-Pay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_369b94cdb6bac25435d00d04255de1ab'] = 'Click&Buy'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_31911306551723245e7417ae4520fecb'] = 'Giropay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_982830b027a279fdc4b4b7993f65498f'] = 'Carte de paiement de la boutique en ligne'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7e1795d054242cf7c546c1491a7c467d'] = 'DIRECTebanking.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_37554cc43c645833d6713b9cddda909b'] = 'moneybookers.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9203aec73d2ea1770f66f065c4069816'] = 'Autre mode de paiement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_068ce643ff39bf2189935d14736fd10b'] = 'Sceau Trusted Shops et protection acheteur'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f51dabfce0c8ccc01734ed38d8afe27a'] = 'Les fonctions Json doivent être installées sur votre version de PHP'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b1801eaadecfddd04529313a1e929262'] = 'Le certificat est valide'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ce323cb3453812434f9abc007ba7a952'] = 'le certificat a expiré'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_98121ffd0d2a0b4bed569a726632f402'] = 'le certificat a été annulé'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3ec2499357b45a38139485b2b824aa4c'] = 'La boutique est en cours de certification'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a8fcbddffdaccc6daa529aa9c38d82df'] = 'Aucun certificat n\'a été distribué pour cette Trusted Shops ID'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5abbd73fc5189212c57adfb43adac459'] = 'Certificat de test'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eaf4354c3a17f478859421ac2e33a975'] = 'Code n°'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d9fd9cab8b813e70e20c615abf036307'] = 'message :'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_109715467b74bd66639faa5673f707c1'] = 'Erreur inconnue'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d4eb1e83b0ea3af3e2b8a6e7b7984d9c'] = 'le champ % est erroné, veuillez vérifier qu\'il a été correctement remplie'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c230eb5eefd15fa219ff97d42e461a7d'] = 'Certains paramètres envoyés à la méthode \"requestForProtectionV2\" sont faux ou manquant'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b656f5f53cf7ee9bbfe7452685f71e30'] = 'L\'API de Trusted Shops retourne une erreur concernant l\'application n°'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fdf1d399a4b88e3c62ff925295a4bb0c'] = 'Le numéro %1$d de l\'application Trusted Shops a fonctionné avec succès. Le numéro de garantie est : %2$d'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd511061055fcb2d10d31a51be3539d0'] = 'Lien d\'enregistrement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_de5536f42490f11e92ad1c20d999fd15'] = 'Cliquez pour recevoir le lien d\'enregistrement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_58e9c4050ed75489c2108a1b316f1251'] = 'Le lien d\'enregistrement a été crée. Suivez ce lien si vous n\'avez pas été redirigé plus tôt :'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Lien'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_32ba2d2119a269c536c5d9e1362d5865'] = 'Le produit n\'a pas été sauvegardé.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_bf67e5e156927e871cc3dd2bde2faa78'] = 'Le certificat à bien été ajouté.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8e3ee664fd829b2fa78533957c1041ce'] = 'Vous devez éditer ou supprimer un certificat un par un'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_259060bb469ed1256c2e758e32da126f'] = 'Le certificat'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8512ae7d57b1396273f76fe6ed341a23'] = 'langue'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8638c4fb6ff62122acd9927c4edbd22c'] = 'A bien été supprimé'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a599ec4408db04d4bb9e4edd78b849f4'] = 'Le login du certificat à bien été ajouté'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b18f5630d5ffdfcee5ab0a44ee6e1eb6'] = 'Vous devez définir un nom d\'utilisateur et un mot de passe avant toute modification.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_e32263743aac776e5e32fc385d8b669a'] = 'Trusted Shops est le label de qualité européen pour sites marchands avec garantie de remboursement pour vos clients. Lors de la certification, votre boutique est soumise à un audit qui regroupe plus de 100 critères différents respectant les exigences des associations de protection des consommateurs, ainsi que les législations nationales et européennes.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_2c786e15a571a442adf85460e6358883'] = 'Plus de confiance pour plus de ventes!'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_e06f60bb083e167516a94aafd5a3a2e2'] = 'Le label de qualité Trusted Shops est optimal pour accroître la confiance des clients dans votre boutique en ligne. Plus les internautes ont confiance en votre site marchand, plus ils achèteront chez vous.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8dd66ca6788218bd7d2ba7fe43c34f63'] = 'Diminution des interruptions de commandes'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5580bc4adbb864a67180bf2f058393f3'] = 'Vous proposez à vos clients en ligne un argument fort : la protection acheteur Trusted Shops qui assure le client contre non-livraison ou non-remboursement. Cette sécurité supplémentaire permet de réduire les interruptions de commandes.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_710142158c105c01ef807ce959cbc451'] = 'Une fidélisation clientèle fructueuse et durable'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f7e15d97ad927ef705de61e787883ada'] = 'Pour de nombreux acheteurs en ligne, le label de qualité Trusted Shops avec protection acheteur est un critère de qualité durable pour des achats en ligne sécurisés . Vous transformez ainsi des clients uniques en clients loyaux.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7442a1e0ab5e2e26ca9363d226b93d13'] = 'Type d\'environnement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8e77e16312de3f95afdf5b92b10232a2'] = 'Vous utilisez actuellement le mode:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc62561dd8d390e274487516e869fc93'] = 'Obtenir le lien d\'enregistrement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6e637d8b8b8a933612b19c881d33672d'] = 'Cette variable a été envoyée via mail par Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_233a96df2f68dbeafaa3126edadc1ce8'] = 'Identification interne de logiciel de la boutique chez Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_261720a5c993fb1cfad560d874d06254'] = 'Canal du Etracker'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_02977dc4b8561c8d7312b1931782c36b'] = 'Campagne du Etracker'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4994a8ffeba4ac3140beb89e8d41f174'] = 'Langue'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_2541d938b0a58946090d7abdde0d3890'] = 'envoyer'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_72ca0dcf49befb037f8d4734ee0a2a1c'] = 'Ajouter un certificat Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_48e31908bfdcda34b0f01cad9d7077af'] = 'Nouveau certificat'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_75904cf055527a97739601e0f5ff7e51'] = 'Ajouter le'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_566853604b7330b3adbb9105cb15e96b'] = 'Éditer les certificats Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eb0f48a107df1a0f343d4cd513b555e6'] = 'Certificat'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_46a2a41cc6e552044816a2d04634545d'] = 'État'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Type'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c61ebc45acfe2f244e91ac4cd423e81'] = 'Url de la boutique'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7dce122004969d56ae2e0245cb754d35'] = 'Éditer'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97bd7efe2f4d953cc0b77a25ff053d97'] = 'Mot de passe ou login manquant'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_10b5f8531f2b6a3f6d8abad45024bbea'] = 'Inutile'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5c697646774e5acf5c5864b6819e82b5'] = 'Éditer le certificat'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f8c823f9ba0a86ceaa8d3ea7e688595d'] = 'Id du certificat'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_92f1b1481fa6ff46c4a3caae78354dab'] = 'Nom d\'utilisateur'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc647eb65e6711e155375218212b3964'] = 'mot de passe'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_89c26d1f2de72a1e78d0ae7a7b83880c'] = 'Type de paiement à éditer'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_23a58bf9274bedb19375e527a0744fa9'] = 'avec'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd5291d7f0624933870702ff183bb14e'] = 'module de paiement'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b3b1a406e097bc87c8745db26e11904e'] = 'Le mettre à jour'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c9ba5f6e6d58162530424afaa68bf496'] = 'Configuration de la tâche cron'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9a82b12b4b1fe9b34ce7c2952f0284d2'] = 'Vous devez ajouter une tâche cron sur votre serveur, fonctionnant pour vos certificats EXCELLENT'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c17d7635f5ee99ee25f7f2cc9a672c74'] = 'Le fichier que vous devez appeler :'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a3c2818ac0ecfe9beff0973388eedd69'] = 'Trusted Shops recommande que la requête doit être automatisé par une tâche cron avec un intervalle de 10 minutes.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b40495f7999e31d4abed3183d2e3cd25'] = 'La protection acheteur de Trusted Shops à besoin d\'un login pour fonctionner. Veuillez contacter l\'administrateur de la boutique.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9d36bad327b052a9bdec7003f95ce4bd'] = 'Une erreur est apparue avec votre langue :'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_03e9e3ceaf5769311c57b5903a958e94'] = 'Un acheteur ne peut pas acheter plusieurs produits de protection d\'acheteur'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_26a7019f9c88a24e63ebc690e9527f31'] = 'Vous allez recevoir un mail de la part de Trusted Shops à propos de votre numéro de garantie.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c006c102f7e2ffef1f7c1808d5e0e54a'] = 'Trusted Shops Système d’évaluation client'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b20a16afda98421bbf7457ccfa50e311'] = 'Ce module nécessite les droits de lecture et d\'écriture sur le répertoire cache du module.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Ce module requiert l\'extension PHP SOAP pour fonctionner correctement.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_1097e2b0ee70e248749f0d0a9292df56'] = 'Trusted Shops ID non valide'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_086dbc83aa6b78fa9a234d264ba5808a'] = 'Différé invalide'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_24bbca53f91f119c930d147557a4e997'] = 'Veuillez vous enregistrer'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_6c92285fa6d3e827b198d120ea3ac674'] = 'ici'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9ad6278cff9ee53a9970b3a9ecc00a5c'] = 'ou contacter service@trustedshops.com.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b4fc8e4eaf37aa936859367ad7c642ca'] = '\'Le système d’évaluation Trusted Shops n’a pas encore été activé pour ce Trusted Shops ID.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_8db5bd2272b51b3525ad7661c10d8b2b'] = 'Une erreur est survenue'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c888438d14855d7d96a2724ee9c306bd'] = 'Configuration mise à jour'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Actif'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_eeb41070f0552af9f1339ed58da237fb'] = 'Inactif tant que vous n\'avez pas spécifiez votre Trusted Shops ID'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9eb274fb901206f4fc8345a787443269'] = 'Attention, les alertes existantes vont être supprimées'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2a94082b582d0620bae922fc14c36444'] = 'Configuration'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_e66ff458a8281bc8983ef58f991accb0'] = 'Merci de renseigner votre Trusted Shops ID (un ID différent par langue) :'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9dc0b7bdd32d5e30f4d71eb5abb6b8d4'] = 'Paramètres d\'affichage'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b30cb94d482485bf0bf7015520ffb557'] = 'Affichage widget sur la boutique'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_75a1b325a14f20c2cbb97061d1340451'] = 'Lien d\'évaluation sur la boutique'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ab2ededbdea4f61279ec75b5777d39a0'] = 'Lien d\'évaluation sur la page de confirmation'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ef0e903dffb94fd6d4362340d2f74a15'] = 'Lien d\'évaluation dans un email séparé'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_d344c0ebc1a11797405e4115a8260deb'] = 'Envoyer l\'email après'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_44fdec47036f482b68b748f9d786801b'] = 'jour(s)'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9013b630235e2a5c48b7357e23e1bd2f'] = 'IMPORTANT :'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ed8b925eb242d6a40ff29ec1a5141b3'] = 'Ajoutez cette URL dans une tâche cron ou appelez la manuellement chaque jour :'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_f5395c9793af8a11b406ca7c1ac70da9'] = 'En savoir plus'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9a983837b32d42343dc0c62d35b1f955'] = 'Trusted Shops Système d’évaluation client'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_5b91fe21d207317c7c9fad225a7ce442'] = 'Pour les acheteurs en ligne, les évaluations positives et vérifiables des clients sont le signe évident qu’un site marchand est digne de confiance. Le logiciel requis existe déjà dans Prestashop, ce qui fait que quelques clics vous suffisent pour aller chercher également des évaluations de clients sur votre site.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c81bc534bc261e4107a5c30257fb5ba4'] = 'Aide à l’orientation pour vos clients'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ec1bfc4d5646681a86038f770be8fd0b'] = 'Les meilleurs vendeurs, ce sont les clients satisfaits. Faites dire pour vous par vos clients combien les achats sur votre site marchand sont sûrs et confortables.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_866a520be0de10a4fc8958a9e89126c3'] = 'Base d’optimisation du site'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9c6dfeed0caab43f7ff0f6bbd19b27dd'] = 'Par leurs interventions, vos clients vous aident à optimiser les processus de votre site. Car mieux un site marchand fonctionne, plus vos clients sont satisfaits.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_0fac19c0cc6e205682dd52d61dd5a0a2'] = 'Diffusion sur Facebook, Twitter et Google'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_afe906fe9448ed1b480b3eec383461de'] = 'Vos clients diffusent avis et évaluations sur Facebook et Twitter directement à leurs amis et connaissances. Les évaluations sont intégrées automatiquement dans le Google-Index et prises en compte dans Google Shopping.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_273769f3a3d91979bfdb5ca4909c517a'] = 'Créer un compte Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ab78702e34e81e82ca61847300b1618'] = 'Etes-vous satisfait de votre achat chez'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_a11109fe93f6dc4637e5b039651a4fdb'] = '? Donnez nous votre avis!'; diff --git a/modules/trustedshops/img/apply_de.gif b/modules/trustedshops/img/apply_de.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8cece0516300ce6e112fc61258a84311e77d3d6 GIT binary patch literal 3243 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 literal 0 HcmV?d00001 diff --git a/modules/trustedshops/img/apply_en.gif b/modules/trustedshops/img/apply_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..116be7ff9f3314a78f583cd7b85bf41a356b31d5 GIT binary patch literal 3178 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'] = 'Protezione acquirente Trusted Shops (consigliato)'; +$_MODULE['<{trustedshops}prestashop>display_products_b55aab8932a39ca85bb0a1b6eb83f83f'] = 'Protezione acquirente da'; +$_MODULE['<{trustedshops}prestashop>display_products_a53a5a9f38f31d62a791717b943e02f3'] = 'EUR incl. IVA'; +$_MODULE['<{trustedshops}prestashop>display_products_536a056b710e94b16169efd17a4a657b'] = 'salvato'; +$_MODULE['<{trustedshops}prestashop>display_products_229eb04083e06f419f9ac494329f957d'] = 'Condizioni'; +$_MODULE['<{trustedshops}prestashop>display_products_4ccaceceffe4b5e58f6a7a7ed3ced4c4'] = 'per la protezione dell\'acquirente.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_7b5406da2d5f15923d6b01d3264c5619'] = 'Sigillo di Approvazione Trusted Shops - Clicca per verificare.'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_4052048c767f22e9071c3e6f404d00c6'] = 'Ti offriamo la Protezione acquirente di Trusted Shop come servizio aggiuntivo. Copriamo tutti i costi per questa garanzia. Tutto quello che devi fare è registrarti!'; +$_MODULE['<{trustedshops}prestashop>order-confirmation-tsbp-classic_f975f42362625cf21e592009ff4b3d7b'] = 'Registrati per la Protezione acquirente Trusted shops'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_ee9ae315b086e1b1a0c8fdc6078f9add'] = 'Sigillo di Approvazione Trusted Shops - Clicca per verificare.'; +$_MODULE['<{trustedshops}prestashop>seal_of_approval_750bea678eeb1d07f21fe86173288e2e'] = 'è un negozio on-line certificato con Protezione acquirente Trusted Shops. Maggiori informazioni ...'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_79fc246c2b70963d27ebb0e9ebaab349'] = 'Si prega di contattare Trusted Shops a service@trustedshops.co.uk.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_de14ce5aee772cd0330819c0ecf76adb'] = 'Nome utente o password non valida.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_43048f232a4ebab67835c425a1113b29'] = 'Hai raggiunto il limite di credito.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_eb601fb44b908fec1ee41383d4d948ac'] = 'Nessun credito a disposizione di Trusted Shops.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_cb71cc86f5c38200b3821adb49966522'] = 'I dati non possono essere salvati.'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5fb7a36c0bdf3cde4f3e038a0eff2b6f'] = 'Login servizio web o TS-ID non valido'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_b515cf9cc8234bf6413ed84f5cde066a'] = 'Il limite di credito del negozio è stato sospeso da Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_6453e3467d4c087afbfd33d4013cd3e9'] = 'Numero d\'ordine già utilizzato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_8100f51dcd57174e15ef0c3b3456e3ca'] = 'Prodotto Protezione acquirente non supportato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f9e1392429699e6921d775ca98660faa'] = 'Metodo di pagamento inattivo'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_1dbec1039be7b747704bde7acddca451'] = 'metodo di pagamento non supportato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_53cf8eb9e9cb36a367ba553b30cac77a'] = 'La valuta del prodotto Protezione acquirenti non corrisponde con la valuta del carrello'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ad1407fbd2b8c75e47b9c15a976c4d2'] = 'Questa valuta non è supportata in questo negozio'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_74d27ae48e301b6bbf9bba911a3037e3'] = 'Questo tasso di cambio non è supportato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_02a4ecbbc2d936231663c1b3255ba137'] = 'Questo metodo di pagamento non è supportato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f8c4826b4580a3f2e9786ac6bc5c8635'] = 'Nessun limite di credito disponibile per questo certificato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_f1b7a6cab6562707aea970971edba9c4'] = 'La data di consegna è nel passato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_93dff7e30cdf7dec5572f192c774f5ca'] = 'La garanzia è di un acquisto che è stato fatto oltre 3 giorni fa'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_138ed5814f1b04d3c44fe4975acdeefc'] = 'L\'indirizzo e-mail contiene un errore'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5eded1b4097ea8e9bd12bb35fe57b6b1'] = 'Nessun numero d\'ordine assegnato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5b8230d466534f0cf347188d78c0b248'] = 'Nessun numero cliente assegnato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_5ace4c2d63acb0eb87071efea55be813'] = 'Il limite di credito per questo certificato è stato superato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_35caaf4f25a287580302c851d88a29dc'] = 'Nessun indirizzo e-mail assegnato'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_0db21cf8f0a16321cda7a2e9e37850c7'] = 'Prodotto Protezione acquirente non applicabile '; +$_MODULE['<{trustedshops}prestashop>tsbpexception_db26e10564e958809d798e8048fcbc0a'] = 'Token di protezione non valido'; +$_MODULE['<{trustedshops}prestashop>tsbpexception_36cd72871a0f3dac493a38f5d82f7441'] = 'errore di sistema generale, si prega di contattare Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fed85cfada8f3bbc5ad9eb128227210a'] = 'Addebito diretto'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_73a61696f100b3858511e212a3feea6b'] = 'Carta di credito'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_466eadd40b3c10580e3ab4e8061161ce'] = 'Fattura'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_22d2c7f90dc862df71ac7aff95183fb2'] = 'In contanti alla consegna'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1ff8e518d6a560568fbf66f01e9eb937'] = 'Pagamento anticipato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3e0deb2f1df28a6a13c9c18cc0e1c755'] = 'Assegno'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3deb0a4146e33809942e46416fb60228'] = 'Paybox'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ad69e733ebae8d264bccaa38d68830e8'] = 'PayPal'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4761b2212f04e7409afa7f8103d6fc60'] = 'Contanti al ritiro'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_917709346cd3cefd00e463f65f1a55d8'] = 'Finanziamento'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9e6689415e7e5aa4d42d1f2abc78726c'] = 'Leasing'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_1c9f173da9bf497cffc19357ab04a8e8'] = 'T-Pay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_369b94cdb6bac25435d00d04255de1ab'] = 'Click & Buy'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_31911306551723245e7417ae4520fecb'] = 'Giropay'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c132b5e262594950586ae13a7d3aa94'] = 'Google Checkout'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_982830b027a279fdc4b4b7993f65498f'] = 'Carta di pagamento negozio online'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7e1795d054242cf7c546c1491a7c467d'] = 'DIRECTebanking.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_37554cc43c645833d6713b9cddda909b'] = 'moneybookers.com'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9203aec73d2ea1770f66f065c4069816'] = 'Altri metodi di pagamento'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_068ce643ff39bf2189935d14736fd10b'] = 'Sigillo di Approvazione e protezione acquirente'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f51dabfce0c8ccc01734ed38d8afe27a'] = 'Le funzioni Json devono essere attuate nella tua versione di PHP'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b1801eaadecfddd04529313a1e929262'] = 'Il certificato è valido'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_ce323cb3453812434f9abc007ba7a952'] = 'Il certificato è scaduto'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_98121ffd0d2a0b4bed569a726632f402'] = 'Il certificato è stato disabilitato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_3ec2499357b45a38139485b2b824aa4c'] = 'Il negozio è attualmente in fase di certificazione'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a8fcbddffdaccc6daa529aa9c38d82df'] = 'Nessun certificato è stato assegnato all\'iD Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5abbd73fc5189212c57adfb43adac459'] = 'Certificato di prova'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eaf4354c3a17f478859421ac2e33a975'] = 'Codice n.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d9fd9cab8b813e70e20c615abf036307'] = 'messaggio:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_109715467b74bd66639faa5673f707c1'] = 'Errore sconosciuto.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_d4eb1e83b0ea3af3e2b8a6e7b7984d9c'] = 'Il campo%s è sbagliato, assicurati che sia stato correttamente compilato.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c230eb5eefd15fa219ff97d42e461a7d'] = 'Alcuni parametri per l\'invio al metodo \"requestForProtectionV2\" sono sbagliati o mancanti.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b656f5f53cf7ee9bbfe7452685f71e30'] = 'Trusted Shops API segnala un errore riguardante l\'applicazione n.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd511061055fcb2d10d31a51be3539d0'] = 'Link di registrazione'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_de5536f42490f11e92ad1c20d999fd15'] = 'Fare clic per ottenere il link di registrazione'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97e7c9a7d06eac006a28bf05467fcc8b'] = 'Link'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_259060bb469ed1256c2e758e32da126f'] = 'Il certificato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8512ae7d57b1396273f76fe6ed341a23'] = 'lingua'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b18f5630d5ffdfcee5ab0a44ee6e1eb6'] = 'È necessario impostare un nome utente e una password prima di qualsiasi modifica.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_e32263743aac776e5e32fc385d8b669a'] = 'Trusted Shops è il famoso noto Sigillo di Approvazione per i negozi online che offre anche ai clienti una protezione dell\'acquirente. Nel corso del controllo, il tuo negozio online è sottoposto a test ampi ed approfonditi. Questo controllo, che consta di oltre 100 criteri individuali, si basa sui requisiti di tutela dei consumatori, sulle leggi nazionali ed europee.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_2c786e15a571a442adf85460e6358883'] = 'Più fiducia porta a più vendite!'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_e06f60bb083e167516a94aafd5a3a2e2'] = 'Il sigillo di approvazione Trusted Shops è il modo ottimale per aumentare la fiducia dei tuoi clienti online. Trust aumenta la propensione dei clienti a comprare da te.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8dd66ca6788218bd7d2ba7fe43c34f63'] = 'Meno abbandoni di acquisti'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_710142158c105c01ef807ce959cbc451'] = 'Rapporto con il cliente redditizio e a lungo termine'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f7e15d97ad927ef705de61e787883ada'] = 'Per molti acquirenti online, il Sigillo di ApprovazioneTrusted Shops con la Protezione acquirenti è un segno efficace di qualità per uno shopping sicuro su Internet. Gli acquirenti saltuari diventano clienti abituali.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7442a1e0ab5e2e26ca9363d226b93d13'] = 'Tipo di ambiente'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_8e77e16312de3f95afdf5b92b10232a2'] = 'Stai attualmente utilizzando la modalità:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc62561dd8d390e274487516e869fc93'] = 'Prendi il link di registrazione'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_233a96df2f68dbeafaa3126edadc1ce8'] = 'identificazione interna del software del negozio a Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_261720a5c993fb1cfad560d874d06254'] = 'Canale Etracker '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_02977dc4b8561c8d7312b1931782c36b'] = 'Campagna Etracker '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_4994a8ffeba4ac3140beb89e8d41f174'] = 'Lingua'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_2541d938b0a58946090d7abdde0d3890'] = 'invia'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_72ca0dcf49befb037f8d4734ee0a2a1c'] = 'Aggiungi certificato Trusted Shops '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_48e31908bfdcda34b0f01cad9d7077af'] = 'Nuovo certificato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_75904cf055527a97739601e0f5ff7e51'] = 'Aggiungilo'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_566853604b7330b3adbb9105cb15e96b'] = 'Gestisci certificati Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_eb0f48a107df1a0f343d4cd513b555e6'] = 'Certificato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_46a2a41cc6e552044816a2d04634545d'] = 'Stato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Tipo'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_6c61ebc45acfe2f244e91ac4cd423e81'] = 'Url negozio'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_7dce122004969d56ae2e0245cb754d35'] = 'Modifica'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f2a6c498fb90ee345d997f888fce3b18'] = 'Elimina'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_97bd7efe2f4d953cc0b77a25ff053d97'] = 'Login o password mancanti'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_10b5f8531f2b6a3f6d8abad45024bbea'] = 'Non c\'è bisogno'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_5c697646774e5acf5c5864b6819e82b5'] = 'Modifica del certificato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_f8c823f9ba0a86ceaa8d3ea7e688595d'] = 'Id certificato'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_92f1b1481fa6ff46c4a3caae78354dab'] = 'Nome Utente'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_dc647eb65e6711e155375218212b3964'] = 'Password'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_89c26d1f2de72a1e78d0ae7a7b83880c'] = 'tipo di pagamento da modificare'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_23a58bf9274bedb19375e527a0744fa9'] = 'con'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_fd5291d7f0624933870702ff183bb14e'] = 'modulo di pagamento'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_b3b1a406e097bc87c8745db26e11904e'] = 'Aggiornalo'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c9ba5f6e6d58162530424afaa68bf496'] = 'Configurazione Cronjob '; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9a82b12b4b1fe9b34ce7c2952f0284d2'] = 'È necessario impostare un cron Task sul server, lavorando con il certificato EXCELLENT.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_c17d7635f5ee99ee25f7f2cc9a672c74'] = 'Il file che devi nominare:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_a3c2818ac0ecfe9beff0973388eedd69'] = 'Trusted Shops raccomanda che la richiesta sia automatizzata da un cronjob con un intervallo di 10 minuti.'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_9d36bad327b052a9bdec7003f95ce4bd'] = 'Problema con la tua lingua:'; +$_MODULE['<{trustedshops}prestashop>tsbuyerprotection_03e9e3ceaf5769311c57b5903a958e94'] = 'L\'acquirente non può acquistare più prodotti Protezione acquirente.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c006c102f7e2ffef1f7c1808d5e0e54a'] = 'Valutazione del cliente'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b20a16afda98421bbf7457ccfa50e311'] = 'Questo modulo richiede permessi di scrittura e lettura sulla directory della cache dei moduli.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Questo modulo richiede l\'estensione SOAP di PHP per funzionare correttamente.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_1097e2b0ee70e248749f0d0a9292df56'] = 'ID Trusted Shops non valido'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_086dbc83aa6b78fa9a234d264ba5808a'] = 'Tempo non valido'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_24bbca53f91f119c930d147557a4e997'] = 'Si prega di registrarsi'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_6c92285fa6d3e827b198d120ea3ac674'] = 'qui'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9ad6278cff9ee53a9970b3a9ecc00a5c'] = 'o contattare service@trustedshops.co.uk.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b4fc8e4eaf37aa936859367ad7c642ca'] = 'La valutazione del cliente non è stata ancora attivata per questo ID di Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_8db5bd2272b51b3525ad7661c10d8b2b'] = 'Si è verificato un errore'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c888438d14855d7d96a2724ee9c306bd'] = 'Impostazioni aggiornate'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_4d3d769b812b6faa6b76e1a8abaece2d'] = 'Attivo'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_eeb41070f0552af9f1339ed58da237fb'] = 'Inattivo a meno che tu non abbia specificato il tuo ID Trusted Shops'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9eb274fb901206f4fc8345a787443269'] = 'Attenzione, tutti gli avvisi di valutazione esistenti saranno eliminati'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2a94082b582d0620bae922fc14c36444'] = 'Impostazioni di base'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_e66ff458a8281bc8983ef58f991accb0'] = 'Ti preghiamo di compilare il tuo ID Trusted Shops (un ID diverso per lingua):'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9dc0b7bdd32d5e30f4d71eb5abb6b8d4'] = 'Mostra impostazioni '; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_b30cb94d482485bf0bf7015520ffb557'] = 'Mostra widget nel negozio'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_75a1b325a14f20c2cbb97061d1340451'] = 'Mostra link valutazione nel negozio'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ab2ededbdea4f61279ec75b5777d39a0'] = 'Mostra link valutazione sulla pagina di conferma dell\'ordine'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_d344c0ebc1a11797405e4115a8260deb'] = 'Inviare e-mail dopo '; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_44fdec47036f482b68b748f9d786801b'] = 'giorni'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9013b630235e2a5c48b7357e23e1bd2f'] = 'IMPORTANTE:'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ed8b925eb242d6a40ff29ec1a5141b3'] = 'Metti questo URL nel crontab o chiamalo ogni giorno:'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c9cc8cce247e49bae79f15173ce97354'] = 'Salva'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_f5395c9793af8a11b406ca7c1ac70da9'] = 'Per saperne di più'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9a983837b32d42343dc0c62d35b1f955'] = 'Valutazione del cliente Trusted Shops '; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_5b91fe21d207317c7c9fad225a7ce442'] = 'Per gli acquirenti on-line, giudizi positivi e verificabili dei clienti sono un importante segnale di fiducia in un negozio online. Il software necessario è già compreso in Prestashop, in modo da poter iniziare a raccogliere le recensioni dei clienti nel tuo negozio on-line. L\'integrazione è facile con pochi clic.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_c81bc534bc261e4107a5c30257fb5ba4'] = 'Supporto di orientamento per i tuoi clienti'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_ec1bfc4d5646681a86038f770be8fd0b'] = 'I clienti soddisfatti sono i tuoi rappresentanti migliori. Lascia che i tuoi clienti parlino da soli di quanto sia sicuro e facile acquistare dal tuo negozio online.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_866a520be0de10a4fc8958a9e89126c3'] = 'Base per l\'ottimizzazione negozio'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_9c6dfeed0caab43f7ff0f6bbd19b27dd'] = 'I tuoi clienti sono felici di aiutarti a ottimizzare il negozio con i loro feedback. Dopotutto, meglio funziona il tuo negozio online, e più soddisfatti saranno i tuoi clienti.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_0fac19c0cc6e205682dd52d61dd5a0a2'] = 'Aumenta la portata tramite Facebook, Twitter e Google'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_afe906fe9448ed1b480b3eec383461de'] = 'I tuoi clienti diffondono opinioni e valutazioni su Facebook e Twitter direttamente ad amici e seguaci. Le valutazioni sono automaticamente elencate nel Google Index e vengono visualizzati in Google Shopping.'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_273769f3a3d91979bfdb5ca4909c517a'] = 'Registrati per la valutazione del cliente Trusted shops'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_2ab78702e34e81e82ca61847300b1618'] = 'Sei soddisfatto di'; +$_MODULE['<{trustedshops}prestashop>trustedshopsrating_a11109fe93f6dc4637e5b039651a4fdb'] = '? Scrivi una recensione!'; +$_MODULE['<{trustedshops}prestashop>trustedshops_0aa7ce92297d05fc09fb9fdbe5da6be6'] = 'Questo modulo richiede l\'estensione SOAP di PHP per funzionare correttamente.'; +$_MODULE['<{trustedshops}prestashop>trustedshops_9a983837b32d42343dc0c62d35b1f955'] = 'Trusted Shops Valutazione del cliente'; +$_MODULE['<{trustedshops}prestashop>trustedshops_eeae17826fa637ecca0344165514ab4e'] = 'Accrescere la fiducia dei consumatori e girare più acquirenti in clienti'; +$_MODULE['<{trustedshops}prestashop>trustedshops_968e0f78caa7d3245c8f6f858de993d8'] = 'Sei sicuro di voler eliminare tutte le impostazioni?'; + +?> \ No newline at end of file diff --git a/modules/trustedshops/lib/AbsTrustedShops.php b/modules/trustedshops/lib/AbsTrustedShops.php new file mode 100644 index 000000000..c56d9226b --- /dev/null +++ b/modules/trustedshops/lib/AbsTrustedShops.php @@ -0,0 +1,151 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +abstract class AbsTrustedShops +{ + /** + * Saved errors messages. + * @var array + */ + public $errors = array(); + + /** + * Saved warning messages. + * @var array + */ + public $warnings = array(); + + /** + * Saved confirmations messages. + * @var array + */ + public $confirmations = array(); + + /** + * @var string + */ + protected static $module_name; + + public $limited_countries = array(); + public static $smarty; + public $tab_name; + public $id_tab; + + /** + * Set the object which use the translation method for the specific module. + * @var Module + */ + protected static $translation_object; + + abstract public function install(); + abstract public function uninstall(); + abstract public function getContent(); + public static function setTranslationObject(Module $object) + { + self::$translation_object = $object; + } + protected function _makeFormAction($uri, $id_tab) + { + $uri_component = parse_url($uri); + $arr_query = explode('&', $uri_component['query']); + $arr_query_new = array(); + foreach($arr_query as $key=>$value) + { + $arr = explode('=', $value); + $arr_query_new[$arr[0]] = $arr[1]; + } + $arr_query_new['id_tab'] = $id_tab; + return str_replace($uri_component['query'], '', $uri).http_build_query($arr_query_new); + } + /** + * Set a static name for the module. + * + * @param string $name + */ + public function setModuleName($name) + { + self::$module_name = $name; + } + + public function setSmarty($smarty) + { + self::$smarty = $smarty; + } + + /** + * Get translation for a given module text + * + * @param string $string String to translate + * @return string Translation + */ + public function l($string, $specific = false) + { + if ($specific === false) + { + $reflection_class = new ReflectionClass(get_class($this)); + $specific = basename($reflection_class->getFileName(), '.php'); + } + if (self::$translation_object instanceof Module) + { + return self::$translation_object->l($string, $specific); + } + } + public function display($file, $template, $cacheId = NULL, $compileId = NULL) + { + global $smarty; + + if (Configuration::get('PS_FORCE_SMARTY_2')) /* Keep a backward compatibility for Smarty v2 */ + { + $previousTemplate = $smarty->currentTemplate; + $smarty->currentTemplate = substr(basename($template), 0, -4); + } + $smarty->assign('module_dir', __PS_BASE_URI__.'modules/'.basename($file, '.php').'/'); + if (($overloaded = self::_isTemplateOverloadedStatic(basename($file, '.php'), $template)) === NULL) + $result = Tools::displayError('No template found'); + else + { + $smarty->assign('module_template_dir', ($overloaded ? _THEME_DIR_ : __PS_BASE_URI__).'modules/'.basename($file, '.php').'/'); + $result = $smarty->fetch(($overloaded ? _PS_THEME_DIR_.'modules/'.basename($file, '.php') : _PS_MODULE_DIR_.basename($file, '.php')).'/'.$template, $cacheId, $compileId); + } + if (Configuration::get('PS_FORCE_SMARTY_2')) /* Keep a backward compatibility for Smarty v2 */ + $smarty->currentTemplate = $previousTemplate; + return $result; + } + + /** + * Template management (display, overload, cache) + * @see Module::_isTemplateOverloadedStatic() + */ + protected static function _isTemplateOverloadedStatic($moduleName, $template) + { + if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$moduleName.'/'.$template)) + return true; + elseif (Tools::file_exists_cache(_PS_MODULE_DIR_.$moduleName.'/'.$template)) + return false; + return NULL; + } +} \ No newline at end of file diff --git a/modules/trustedshops/lib/RatingAlert.php b/modules/trustedshops/lib/RatingAlert.php new file mode 100644 index 000000000..b4b0cc897 --- /dev/null +++ b/modules/trustedshops/lib/RatingAlert.php @@ -0,0 +1,109 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class RatingAlert +{ + const TABLE_NAME = 'ts_rating_alert'; + const MAIL_TEMPLATE = 'rating_email'; + + public static function save($id_order) + { + Db::getInstance()->AutoExecute(_DB_PREFIX_.self::TABLE_NAME, array('id_order' => (int)($id_order)), 'INSERT'); + } + + private static function _getAlertsInformations($nb_days = 10) + { + return Db::getInstance()->ExecuteS(' + SELECT a.id_alert, c.`email`, o.`id_order`, o.`id_lang` + FROM `'._DB_PREFIX_.self::TABLE_NAME.'` a + LEFT JOIN '._DB_PREFIX_.'orders o ON (a.id_order = o.id_order) + LEFT JOIN '._DB_PREFIX_.'customer c ON (c.id_customer = o.id_customer) + WHERE DATE_ADD(o.`date_add`, INTERVAL '.(int)($nb_days).' DAY) <= NOW()'); + } + + public static function removeAlerts($ids) + { + $to_remove = array(); + foreach ($ids AS $id) + $to_remove[] = (int)($id); + + return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.self::TABLE_NAME.'` WHERE `id_alert` IN (\''.implode('\',\'', $to_remove).'\')'); + } + + public static function executeCronTask() + { + global $cookie; + if (!Configuration::get('TS_SEND_SEPERATE_MAIL')) + return true; + + $to_remove = array(); + $alerts_infos = RatingAlert::_getAlertsInformations((int)(Configuration::get('TS_SEND_SEPERATE_MAIL_DELAY'))); + + $ts_module = new TrustedShops(); + + foreach ($alerts_infos AS $infos) + { + $cookie->id_lang = $infos['id_lang']; + $subject = $ts_module->getL('title_part_1').' '.Configuration::get('PS_SHOP_NAME').$ts_module->getL('title_part_2'); + $template_vars = array('{ts_id}' => Configuration::get('TS_ID_'.(int)($infos['id_lang'])), + '{button_url}' => TrustedShops::getHttpHost(true, true)._MODULE_DIR_.$ts_module->name.'/img', + '{rating_url}' => $ts_module->getRatingUrlWithBuyerEmail($infos['id_lang'], $infos['id_order'], $infos['email'])); + + $result = Mail::Send((int)($infos['id_lang']), self::MAIL_TEMPLATE, $subject, $template_vars, $infos['email'], NULL, Configuration::get('PS_SHOP_EMAIL'), Configuration::get('PS_SHOP_NAME'), NULL, NULL, dirname(__FILE__).'/mails/'); + + if ($result) + $to_remove[] = (int)($infos['id_alert']); + } + + if (sizeof($to_remove) > 0) + self::removeAlerts($to_remove); + + return (sizeof($to_remove) == sizeof($alerts_infos)); + } + + public static function createTable() + { + return Db::getInstance()->Execute(' + CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'` ( + `id_alert` INT NOT NULL AUTO_INCREMENT, + `id_order` INT NOT NULL, + PRIMARY KEY (`id_alert`), + UNIQUE KEY `id_order` (`id_order`) + ) ENGINE = '._MYSQL_ENGINE_); + } + + public static function dropTable() + { + return Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.self::TABLE_NAME.'`'); + } + + public static function truncateTable() + { + return Db::getInstance()->Execute('TRUNCATE TABLE `'._DB_PREFIX_.self::TABLE_NAME.'`'); + } +} + diff --git a/modules/trustedshops/lib/TSBPException.php b/modules/trustedshops/lib/TSBPException.php new file mode 100644 index 000000000..05702abfa --- /dev/null +++ b/modules/trustedshops/lib/TSBPException.php @@ -0,0 +1,106 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class TSBPException extends Exception +{ + const ADMINISTRATION = 1; + const FRONT_END = 2; + /** + * Set the object which use the translation method for the specific module. + * @var AbsTrustedShops + */ + private static $translation_object; + private static $translate_key; + + public function __construct($code, $type = TSBPException::ADMINISTRATION) + { + if(!(self::$translation_object instanceof AbsTrustedShops) OR self::$translation_object === NULL) + { + die('In '.__METHOD__.', you must defined an object for get messages translations. An herited object from AbsTrustedShops.'); + } + if (TSBPException::$translate_key === NULL) + TSBPException::$translate_key = basename(__FILE__, '.php'); + + if($type === TSBPException::ADMINISTRATION) + $message = $this->_getAdministrationMessage((int)$code); + else + $message = $this->_getFrontEndMessage($code); + parent::__construct($message, $code); + } + private function _getAdministrationMessage($code) + { + // @todo : don't forget to change email in translation + $mail = self::$translation_object->l('Please contact Trusted Shops at service@trustedshops.co.uk.', TSBPException::$translate_key); + $errors = array( + -10001 => self::$translation_object->l('Username or password invalid.', TSBPException::$translate_key), + -10002 => self::$translation_object->l('You have reached your credit limit.', TSBPException::$translate_key), + -10011 => self::$translation_object->l('No credit available from Trusted Shops.', TSBPException::$translate_key), + -11111 => self::$translation_object->l('The data could not be saved.', TSBPException::$translate_key), + ); + $return_message = ''; + if(array_key_exists($code, $errors)) + $return_message = $errors[$code].$mail; + else + $return_message = self::$translation_object->l('An error occurred.').$mail; + + return $return_message; + } + private function _getFrontEndMessage($code) + { + $return_message = ''; + switch ($code) + { + case -10001 : case 'NO_VALID_SHOP' : $return_message .= self::$translation_object->l('Web service login or TS-ID invalid', TSBPException::$translate_key);break; + case -10002 : case 'LIMIT_CANCELLED' : $return_message .= self::$translation_object->l('The shop\'s credit limit has been suspended by Trusted Shops', TSBPException::$translate_key); break; + case -10003 : case 'DUPLICATE_ORDER_NUMBER' : $return_message .= self::$translation_object->l('Order number already used', TSBPException::$translate_key); break; + case -10004 : case 'UNSUPPORTED_TS_PRODUCT' : $return_message .= self::$translation_object->l('Unsupported Buyer Protection product', TSBPException::$translate_key); break; + case -10005 : case 'INACTIVE_PAYMENT_TYPE' : $return_message .= self::$translation_object->l('Inactive payment method', TSBPException::$translate_key); break; + case -10006 : case 'UNSUPPORTED_PAYMENT_TYPE' : $return_message .= self::$translation_object->l('Unsupported payment method', TSBPException::$translate_key); break; + case -10007 : case 'CURRENCY_MISMATCH' : $return_message .= self::$translation_object->l('The currency of the Buyer Protection product does not match with the currency of the shopping basket', TSBPException::$translate_key); break; + case -10008 : case 'UNSUPPORTED_CURRENCY' : $return_message .= self::$translation_object->l('This currency is not supported in this shop', TSBPException::$translate_key); break; + case -10009 : case 'UNSUPPORTED_EXCHANGE_RATE' : $return_message .= self::$translation_object->l('This exchange rate is not supported', TSBPException::$translate_key); break; + case -10010 : case 'NOT_PERSISTENT_PAYMENT_TYPE' : $return_message .= self::$translation_object->l('This payment method is not supported', TSBPException::$translate_key); break; + case -10011 : case 'NO_LIMIT' : $return_message .= self::$translation_object->l('No credit limit available for this certificate', TSBPException::$translate_key); break; + case -10012 : case 'PAST_DELIVERY_DATE' : $return_message .= self::$translation_object->l('The delivery date is in the past', TSBPException::$translate_key); break; + case -10013 : case 'TOO_OLD_ORDER' : $return_message .= self::$translation_object->l('The guarantee is for a purchase that was made over 3 days ago', TSBPException::$translate_key); break; + case -10014 : case 'EMAIL_MALFORMED' : $return_message .= self::$translation_object->l('The email address contains an error', TSBPException::$translate_key); break; + case -10015 : case 'ORDER_ID_EMPTY' : $return_message .= self::$translation_object->l('No order number was assigned', TSBPException::$translate_key); break; + case -10016 : case 'CUSTOMER_ID_EMPTY' : $return_message .= self::$translation_object->l('No customer number was assigned', TSBPException::$translate_key); break; + case -10017 : case 'LIMIT_OVERFLOW' : $return_message .= self::$translation_object->l('The credit limit for this certificate has been exceeded', TSBPException::$translate_key); break; + case -10018 : case 'EMAIL_EMPTY' : $return_message .= self::$translation_object->l('No email address was assigned', TSBPException::$translate_key); break; + case -10019 : case 'WRONG_TS_PRODUCT' : $return_message .= self::$translation_object->l('Non-applicable Buyer Protection product', TSBPException::$translate_key); break; + case -11001 : case 'INVALID_SECURITY_TOKEN' : $return_message .= self::$translation_object->l('Invalid security token', TSBPException::$translate_key); break; + case -11111 : case 'SYSTEM_EXCEPTION' : $return_message .= self::$translation_object->l('General system error, please contact Trusted Shops', TSBPException::$translate_key); break; + default : $return_message .= self::$translation_object->l('An error occurred.', TSBPException::$translate_key); break; + } + return $return_message; + } + public static function setTranslationObject(AbsTrustedShops $object) + { + self::$translation_object = $object; + } +} \ No newline at end of file diff --git a/modules/trustedshops/lib/TSBuyerProtection.php b/modules/trustedshops/lib/TSBuyerProtection.php new file mode 100644 index 000000000..f4a9ed5bd --- /dev/null +++ b/modules/trustedshops/lib/TSBuyerProtection.php @@ -0,0 +1,1393 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7096 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ +include(_PS_MODULE_DIR_.'trustedshops/lib/TSBPException.php'); + +/** + * @see the technical doc for entire description. + * too long to set it here. + * @author Prestashop - Nans Pellicari + * @since prestashop 1.4 + * @version 0.1 + */ +class TSBuyerProtection extends AbsTrustedShops +{ + const PREFIX_TABLE = 'TS_TAB1_'; + const ENV_TEST = 'test'; + const ENV_PROD = 'production'; + const DB_ITEMS = 'ts_buyerprotection_items'; + const DB_APPLI = 'ts_application_id'; + const WEBSERVICE_BO = 'administration'; + const WEBSERVICE_FO = 'front-end'; + + /** + * List of registration link, need to add parameters + * @see TSBuyerProtection::_getRegistrationLink() + * @var array + */ + private $registration_link = array( + 'DE' => 'http://www.trustedshops.de/shopbetreiber/mitgliedschaft.html', + 'EN' => 'http://www.trustedshops.com/merchants/membership.html', + 'FR' => 'http://www.trustedshops.com/marchands/affiliation.html', + 'PL' => 'http://www.trustedshops.pl/handlowcy/cennik.html', + ); + + /** + * Link to obtain the certificate about the shop. + * Use by seal of approval. + * @see TSBuyerProtection::hookRightColumn() + * @var array + */ + private static $certificate_link = array( + 'DE' => 'http://www.trustedshops.de/profil/#shop_name#_#shop_id#.html', + 'EN' => 'http://www.trustedshops.com/profile/#shop_name#_#shop_id#.html', + 'FR' => 'http://www.trustedshops.fr', + 'PL' => 'http://www.trustedshops.de/profil/#shop_name#_#shop_id#.html', + ); + + /** + * Available language for used TrustedShops Buyer Protection + * @see TSBuyerProtection::__construct() + * @var array + */ + private $available_languages = array('EN'=>'', 'FR'=>'', 'DE'=>'', 'PL'=>'', ); + + /** + * @todo : be sure : see TrustedShopsRating::__construct() + * @var array + */ + public $limited_countries = array('PL', 'GB', 'US', 'FR', 'DE'); + + /** + * Differents urls to call for Trusted Shops API + * @var array + */ + private static $webservice_urls = array( + 'administration' => array( + 'test' => 'https://qa.trustedshops.de/ts/services/TsProtection?wsdl', + 'production' => 'https://www.trustedshops.de/ts/services/TsProtection?wsdl', + ), + 'front-end' => array( + 'test' => 'https://protection-qa.trustedshops.com/ts/protectionservices/ApplicationRequestService?wsdl', + 'production' => 'https://protection.trustedshops.com/ts/protectionservices/ApplicationRequestService?wsdl', + ), + ); + + // Configuration vars + private static $SHOPSW; + private static $ET_CID; + private static $ET_LID; + + /** + * Its must look like : + * array( + * 'lang_iso(ex: FR)' => array('stateEnum'=>'', 'typeEnum'=>'', 'url'=>'', 'tsID'=>'', 'user'=>'', 'password'=>''), + * ... + * ) + * @var array + */ + private static $CERTIFICATE; + private static $DEFAULT_LANG; + private static $CAT_ID; + private static $ENV_API; + + /** + * save shop url + * @var string + */ + private $site_url; + + /** + * Payment type used by Trusted Shops. + * @var array + */ + private static $payments_type; + + public function __construct() + { + // need to set this in constructor to allow translation + TSBuyerProtection::$payments_type = array( + 'DIRECT_DEBIT' => $this->l('Direct debit'), + 'CREDIT_CARD' => $this->l('Credit Card'), + 'INVOICE' => $this->l('Invoice'), + 'CASH_ON_DELIVERY' => $this->l('Cash on delivery'), + 'PREPAYMENT' => $this->l('Prepayment'), + 'CHEQUE' => $this->l('Cheque'), + 'PAYBOX' => $this->l('Paybox'), + 'PAYPAL' => $this->l('PayPal'), + 'CASH_ON_PICKUP' => $this->l('Cash on pickup'), + 'FINANCING' => $this->l('Financing'), + 'LEASING' => $this->l('Leasing'), + 'T_PAY' => $this->l('T-Pay'), + 'CLICKANDBUY' => $this->l('Click&Buy'), + 'GIROPAY' => $this->l('Giropay'), + 'GOOGLE_CHECKOUT' => $this->l('Google Checkout'), + 'SHOP_CARD' => $this->l('Online shop payment card'), + 'DIRECT_E_BANKING' => $this->l('DIRECTebanking.com'), + 'MONEYBOOKERS' => $this->l('moneybookers.com'), + 'OTHER' => $this->l('Other method of payment'), + ); + $this->tab_name = $this->l('Seal of Approval and Buyer Protection'); + $this->site_url = Tools::htmlentitiesutf8('http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__); + TSBPException::setTranslationObject($this); + if (!method_exists('Tools', 'jsonDecode') || !method_exists('Tools', 'jsonEncode')) + { + $this->warnings[] = $this->l('Json functions must be implemented in your php version'); + } + else + { + foreach ($this->available_languages as $iso => $lang) + { + if($lang === '') + $this->available_languages[$iso] = Language::getLanguage(Language::getIdByIso($iso)); + TSBuyerProtection::$CERTIFICATE[strtoupper($iso)] = (array)Tools::jsonDecode( + Tools::htmlentitiesDecodeUTF8(Configuration::get(TSBuyerProtection::PREFIX_TABLE.'CERTIFICATE_'.strtoupper($iso)))); + } + if(TSBuyerProtection::$SHOPSW === NULL) + { + TSBuyerProtection::$SHOPSW = Configuration::get(TSBuyerProtection::PREFIX_TABLE.'SHOPSW'); + TSBuyerProtection::$ET_CID = Configuration::get(TSBuyerProtection::PREFIX_TABLE.'ET_CID'); + TSBuyerProtection::$ET_LID = Configuration::get(TSBuyerProtection::PREFIX_TABLE.'ET_LID'); + TSBuyerProtection::$DEFAULT_LANG = (int)Configuration::get('PS_LANG_DEFAULT'); + TSBuyerProtection::$CAT_ID = (int)Configuration::get(TSBuyerProtection::PREFIX_TABLE.'CAT_ID'); + TSBuyerProtection::$ENV_API = Configuration::get(TSBuyerProtection::PREFIX_TABLE.'ENV_API'); + } + } + } + + public function install() + { + if (!method_exists('Tools', 'jsonDecode') || !method_exists('Tools', 'jsonEncode')) + return false; + + foreach ($this->available_languages as $iso=>$lang) + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'CERTIFICATE_'.strtoupper($iso), + Tools::htmlentitiesUTF8(Tools::jsonEncode(array('stateEnum'=>'', 'typeEnum'=>'', 'url'=>'', 'tsID'=>'', 'user'=>'', 'password'=>'')))); + + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'SHOPSW', ''); + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'ET_CID', ''); + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'ET_LID', ''); + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'ENV_API', TSBuyerProtection::ENV_PROD); + $req = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.TSBuyerProtection::DB_ITEMS.'` ( + `id_item` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , + `id_product` INT NOT NULL, + `ts_id` VARCHAR( 33 ) NOT NULL, + `id` INT NOT NULL, + `currency` VARCHAR( 3 ) NOT NULL , + `gross_fee` DECIMAL( 20, 6 ) NOT NULL , + `net_fee` DECIMAL( 20, 6 ) NOT NULL , + `protected_amount_decimal` INT NOT NULL , + `protection_duration_int` INT NOT NULL , + `ts_product_id` TEXT NOT NULL , + `creation_date` VARCHAR( 25 ) NOT NULL + ); + '; + Db::getInstance()->Execute($req); + + $req = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.TSBuyerProtection::DB_APPLI.'` ( + `id_application` INT NOT NULL PRIMARY KEY, + `ts_id` VARCHAR( 33 ) NOT NULL, + `id_order` INT NOT NULL, + `statut_number` INT NOT NULL DEFAULT \'0\', + `creation_date` DATETIME NOT NULL, + `last_update` DATETIME NOT NULL + ); + '; + Db::getInstance()->Execute($req); + + //add hidden category + $category = new Category(); + $languages = Language::getLanguages(true); + foreach ($this->available_languages as $iso=>$lang) + { + $category->name[Language::getIdByIso(strtolower($iso))] = 'Trustedshops'; + $category->link_rewrite[Language::getIdByIso(strtolower($iso))] = 'trustedshops'; + } + + // If the default lang is different than available languages : + // (Bug occurred otherwise) + if (!array_key_exists(Language::getIsoById((int)Configuration::get('PS_LANG_DEFAULT')), $this->available_languages)) + { + $category->name[(int)Configuration::get('PS_LANG_DEFAULT')] = 'Trustedshops'; + $category->link_rewrite[(int)Configuration::get('PS_LANG_DEFAULT')] = 'trustedshops'; + } + + $category->id_parent = 0; + $category->level_depth = 0; + $category->active = 0; + $category->add(); + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'CAT_ID', intval($category->id)); + Configuration::updateValue(TSBuyerProtection::PREFIX_TABLE.'SECURE_KEY', strtoupper(Tools::passwdGen(16))); + return true; + } + + public function uninstall() + { + foreach ($this->available_languages as $iso=>$lang) + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'CERTIFICATE_'.strtoupper($iso)); + + $category = new Category((int)TSBuyerProtection::$CAT_ID); + $category->delete(); + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'CAT_ID'); + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'SHOPSW'); + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'ET_CID'); + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'ET_LID'); + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'ENV_API'); + Configuration::deleteByName(TSBuyerProtection::PREFIX_TABLE.'SECURE_KEY'); + return true; + } + + /** + * Just for return the file path + * @return string + */ + public function getCronFilePath() + { + return $this->site_url.'modules/'.self::$module_name.'/cron_garantee.php?secure_key='.Configuration::get(TSBuyerProtection::PREFIX_TABLE.'SECURE_KEY'); + } + + /** + * This method is used to access of TrustedShops API + * from a SoapClient object. + * + * @uses TSBuyerProtection::$webservice_urls with TSBuyerProtection::$ENV_API + * To get the api url according to the environment (test or production) + * @param string $type + * @return SoapClient + */ + private function _getClient($type = TSBuyerProtection::WEBSERVICE_BO) + { + $url = TSBuyerProtection::$webservice_urls[$type][TSBuyerProtection::$ENV_API]; + $client = new SoapClient($url); + return $client; + } + + /** + * Checks the Trusted Shops IDs entered in the shop administration + * and returns the characteristics of the corresponding certificate. + * + * @uses TSBuyerProtection::_getClient() + * @param string $certificate certificate code already send by Trusted Shops + */ + private function _checkCertificate($certificate) + { + $array_state = array( + 'PRODUCTION' => $this->l('The certificate is valid'), + 'CANCELLED' => $this->l('The certificate has expired'), + 'DISABLED' => $this->l('The certificate has been disabled'), + 'INTEGRATION' => $this->l('The shop is currently being certified'), + 'INVALID_TS_ID' => $this->l('No certificate has been allocated to the Trusted Shops ID'), + 'TEST' => $this->l('Test certificate'), + ); + $client = $this->_getClient(); + $validation = false; + try { + $validation = $client->checkCertificate($certificate); + } catch (SoapFault $fault) { + $this->errors[] = $this->l('Code #').$fault->faultcode.',
      '.$this->l('message:').$fault->faultstring; + } + + if(is_int($validation)) + throw new TSBPException($validation, TSBPException::ADMINISTRATION); + + if (!$validation OR array_key_exists($validation->stateEnum, $array_state)) + { + if ($validation->stateEnum === 'TEST' || $validation->stateEnum === 'PRODUCTION' || $validation->stateEnum === 'INTEGRATION') + { + $this->confirmations[] = $array_state[$validation->stateEnum]; + return $validation; + } + else + { + $this->errors[] = $array_state[$validation->stateEnum]; + return false; + } + } + else + { + $this->errors[] = $this->l('Unknown error.'); + } + } + + /** + * Checks the shop's web service access credentials. + * + * @uses TSBuyerProtection::_getClient() + * @param string $ts_id + * @param string $user + * @param string $password + */ + private function _checkLogin($ts_id, $user, $password) + { + $client = $this->_getClient(); + $return = 0; + try { + $return = $client->checkLogin($ts_id, $user, $password); + } catch (SoapClient $fault) { + $this->errors[] = $this->l('Code #').$fault->faultcode.',
      '.$this->l('message:').$fault->faultstring; + } + if ($return < 0) + throw new TSBPException($return, TSBPException::ADMINISTRATION); + + return true; + } + + /** + * Returns the characteristics of the buyer protection products + * that are allocated individually to each certificate by Trusted Shops. + * + * @uses TSBuyerProtection::_getClient() + * @param string $ts_id + */ + private function _getProtectionItems($ts_id) + { + $client = $this->_getClient(); + try { + $items = $client->getProtectionItems($ts_id); + } catch (SoapFault $fault) { + $this->errors[] = $this->l('Code #').$fault->faultcode.',
      '.$this->l('message:').$fault->faultstring; + } + if (isset($items->item)) + return $items->item; + return false; + } + + /** + * Check validity for params required for TSBuyerProtection::_requestForProtectionV2() + * + * @param array $params + */ + private function _requestForProtectionV2ParamsValidator($params) + { + $bool_flag = true; + $mandatory_keys = array( + array('name'=>'tsID', 'validator'=>array('isCleanHtml'),), + array('name'=>'tsProductID', 'validator'=>array('isCleanHtml'),), + array('name'=>'amount', 'validator'=>array('isFloat'),), + array('name'=>'currency', 'length'=>3, 'validator'=>array('isString'),), + array('name'=>'paymentType', 'validator'=>array('isString'),), + array('name'=>'buyerEmail', 'validator'=>array('isEmail'),), + array('name'=>'shopCustomerID', 'validator'=>array('isInt'),), + array('name'=>'shopOrderID', 'validator'=>array('isInt'),), + array('name'=>'orderDate', 'ereg'=>'#[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}#',), + array('name'=>'shopSystemVersion','validator'=>array('isCleanHtml'),), + array('name'=>'wsUser','validator'=>array('isCleanHtml'),), + array('name'=>'wsPassword', 'validator'=>array('isCleanHtml'),), + ); + foreach ($mandatory_keys as $key) + { + $bool_flag = (!array_key_exists($key['name'], $params)) ? false : $bool_flag; + if ($bool_flag) + { + if (isset($key['length'])) + $bool_flag = strlen((string)$params[$key['name']]) === $key['length']; + if (isset($key['length-min'])) + $bool_flag = strlen((string)$params[$key['name']]) > $key['length-min']; + if (isset($key['length-max'])) + $bool_flag = strlen((string)$params[$key['name']]) < $key['length-max']; + if (isset($key['validator'])) + foreach ($key['validator'] as $validator) + if (method_exists('Validate', $validator)) + $bool_flag = !Validate::$validator((string)$params[$key['name']]) ? false : $bool_flag; + if(isset($key['ereg'])) + $bool_flag = !preg_match($key['ereg'], $params[$key['name']]) ? false : $bool_flag ; + } + + if (!$bool_flag) + { + $this->errors[] = sprintf($this->l('The field %s is wrong, please ensure it was correctly filled.'), $key['name']); + break; + } + } + return $bool_flag; + + } + + /** + * Create the Buyer Protection application by the web service. + * Applications are saved by Trusted Shops and are processed at regular intervals. + * + * @uses TSBuyerProtection::_getClient() + * @uses TSBuyerProtection::_requestForProtectionV2ParamsValidator() + * to check required params + * @see TSBuyerProtection::cronTasks() + * @param array $params + */ + private function _requestForProtectionV2($params) + { + $client = $this->_getClient(TSBuyerProtection::WEBSERVICE_FO); + $testing_params = $this->_requestForProtectionV2ParamsValidator($params); + $code = 0; + $sql = ' + SELECT * + FROM `'._DB_PREFIX_.TSBuyerProtection::DB_APPLI.'` + WHERE `id_order` = "'.(int)$params['shopOrderID'].'" + '; + $order = Db::getInstance()->ExecuteS($sql); + + // If an order was already added, no need to continue. + // Otherwise a new application is created by TrustedShops. + // this can occurred when order confirmation page is reload. + if(isset($order[0])) + return false; + + if ($testing_params) + { + try { + $code = $client->requestForProtectionV2($params['tsID'], $params['tsProductID'], $params['amount'], $params['currency'], $params['paymentType'], $params['buyerEmail'], $params['shopCustomerID'], $params['shopOrderID'], $params['orderDate'], $params['shopSystemVersion'], $params['wsUser'], $params['wsPassword']); + if ($code < 0) + throw new TSBPException($code, TSBPException::FRONT_END); + } catch (SoapFault $fault) { + $this->errors[] = $this->l('Code #').$fault->faultcode.',
      '.$this->l('message:').$fault->faultstring; + } catch (TSBPException $e) { + $this->errors[] = $e->getMessage(); + } + if ($code > 0) + { + $date = date('Y-m-d H:i:s'); + $sql = ' + INSERT INTO `'._DB_PREFIX_.TSBuyerProtection::DB_APPLI.'` + ( + `id_application`, + `ts_id`, + `id_order`, + `creation_date`, + `last_update` + ) + VALUES + ( + "'.pSQL($code).'", + "'.pSQL($params['tsID']).'", + "'.pSQL($params['shopOrderID']).'", + "'.$date.'", + "'.$date.'" + ) + '; + Db::getInstance()->Execute($sql); + + // To reset product quantity in database. + $sql = ' + SELECT `id_product` + FROM `'._DB_PREFIX_.TSBuyerProtection::DB_ITEMS.'` + WHERE `ts_product_id` = "'.(int)$params['tsProductID'].'" + '; + $ts_product = Db::getInstance()->ExecuteS($sql); + $product = new Product($ts_product[0]['id_product']); + $product->quantity = 1000; + $product->update(); + } + } + else + $this->errors[] = $this->l('Some parameters sending to "requestForProtectionV2" method are wrong or missing.'); + } + + /** + * With the getRequestState() method, + * the status of a guarantee application is requested + * and in the event of a successful transaction, + * the guarantee number is returned. + * + * @uses TSBuyerProtection::_getClient() + * @param array $params + * @throws TSBPException + */ + private function _getRequestState($params) + { + $client = $this->_getClient(TSBuyerProtection::WEBSERVICE_FO); + $code = 0; + try { + $code = $client->getRequestState($params['tsID'], $params['applicationID']); + if ($code < 0) + throw new TSBPException($code, TSBPException::FRONT_END); + } catch (SoapFault $fault) { + $this->errors[] = $this->l('Code #').$fault->faultcode.',
      '.$this->l('message:').$fault->faultstring; + } catch (TSBPException $e) { + $this->errors[] = $e->getMessage(); + } + return $code; + } + + /** + * Check statut of last applications + * saved with TSBuyerProtection::_requestForProtectionV2() + * + * Negative value means an error occurred. + * Error code are managed in TSBPException. + * @see (exception) TSBPException::_getFrontEndMessage() method + * + * Trusted Shops recommends that the request + * should be automated by a cronjob with an interval of 10 minutes. + * @see /../cron_garantee.php + * + * A message is added to the sheet order in Back-office, + * @see Message class + * + * @uses TSBuyerProtection::_getRequestState() + * @uses Message class + * @return void + */ + public function cronTask() + { + // get the last 20min to get the api number (to be sure) + $mktime = mktime(date('H'), date('i')-20, date('s'), date('m'), date('d'), date('Y')); + $date = date('Y-m-d H:i:s', $mktime); + $db_name = _DB_PREFIX_.TSBuyerProtection::DB_APPLI; + $sql = ' + SELECT * + FROM `'.$db_name.'` + WHERE `last_update` >= "'.$date.'" OR `statut_number` <= 0 + '; + $to_check = Db::getInstance()->ExecuteS($sql); + foreach ($to_check as $application) + { + $code = $this->_getRequestState(array('tsID'=>$application['ts_id'], 'applicationID'=>$application['id_application'])); + if (!empty($this->errors)) + { + $return_message = '

      '.$this->l('Trusted Shops API returns an error concerning the application #').$application['id_application'].':
      '.implode(',
      ', $this->errors).'

      '; + $this->errors = array(); + } + elseif ($code > 0) + { + $return_message = sprintf($this->l('Trusted Shops application number %1$d was successfully processed. The guarantee number is: %2$d'), $application['id_application'], $code); + } + $sql = ' + UPDATE `'.$db_name.'` + SET `statut_number` = "'.$code.'" + WHERE `id_application` >= "'.$application['id_application'].'" + '; + Db::getInstance()->Execute($sql); + $msg = new Message(); + $msg->message = $return_message; + $msg->id_order = (int)$application['id_order']; + $msg->private = 1; + $msg->add(); + } + } + + /** + * Registration link to Trusted Shops + * + * @param string $shopsw + * @param string $et_cid + * @param string $et_lid + * @param string $lang + * @return boolean|string boolean in case of $lang is not supported by Trusted Shops + * string return is the url to access of form subscription + */ + private function _makeRegistrationLink($shopsw, $et_cid, $et_lid, $lang) + { + if(array_key_exists($lang, $this->registration_link)) + return $this->registration_link[$lang].sprintf('?shopsw=%s&et_cid=%s&et_lid=%s', urlencode($shopsw), urlencode($et_cid), urlencode($et_lid)); + return false; + } + + /** + * Method to display or redirect the subscription link. + * + * @param string $link + */ + private function _getRegistrationLink($link) + { + + return ' +
      + {/if} + + diff --git a/themes/prestashop/guest-tracking.tpl b/themes/prestashop/guest-tracking.tpl new file mode 100644 index 000000000..518f4385f --- /dev/null +++ b/themes/prestashop/guest-tracking.tpl @@ -0,0 +1,85 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7075 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Guest tracking'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

      {l s='Guest Tracking'}

      + +{if isset($order)} +
      +
      + {include file="$tpl_dir./order-detail.tpl"} +
      +
      + +

      {l s='For more advantages...'}

      + + {include file="$tpl_dir./errors.tpl"} + + {if isset($transformSuccess)} +

      {l s='Your guest account has been successfully transformed into a customer account. You can now log in on this'} {l s='page'}

      + {else} +
      +
      +

      {l s='Transform your guest account to a customer account and enjoy :'}

      +
        +
      • {l s='Personalized and secure access'}
      • +
      • {l s='Fast and easy check out'}
      • +
      • {l s='Easier merchandise return'}
      • +
      +

      + + +

      + + + + +

      +
      +
      + {/if} +{else} + {include file="$tpl_dir./errors.tpl"} +
      +
      +

      {l s='To track your order, please enter the following information:'}

      +

      + + + {l s='For example: 010123'} +

      + +

      + + +

      + +

      +
      +
      +{/if} diff --git a/themes/prestashop/header.tpl b/themes/prestashop/header.tpl new file mode 100644 index 000000000..0137d7d75 --- /dev/null +++ b/themes/prestashop/header.tpl @@ -0,0 +1,90 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + {$meta_title|escape:'htmlall':'UTF-8'} +{if isset($meta_description) AND $meta_description} + +{/if} +{if isset($meta_keywords) AND $meta_keywords} + +{/if} + + + + + + +{if isset($css_files)} + {foreach from=$css_files key=css_uri item=media} + + {/foreach} +{/if} +{if isset($js_files)} + {foreach from=$js_files item=js_uri} + + {/foreach} +{/if} + {$HOOK_HEADER} + + + + {if !$content_only} + {if isset($restricted_country_mode) && $restricted_country_mode} +
      +

      {l s='You cannot place a new order from your country.'} {$geolocation_country}

      +
      + {/if} +
      + + + + +
      + +
      + {$HOOK_LEFT_COLUMN} +
      + + +
      + {/if} diff --git a/themes/prestashop/history.tpl b/themes/prestashop/history.tpl new file mode 100644 index 000000000..9f76e1136 --- /dev/null +++ b/themes/prestashop/history.tpl @@ -0,0 +1,96 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7454 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{capture name=path}{l s='My account'}{$navigationPipe}{l s='Order history'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} +{include file="$tpl_dir./errors.tpl"} + +

      {l s='Order history'}

      +

      {l s='Here are the orders you have placed since the creation of your account'}.

      + +{if $slowValidation}

      {l s='If you have just placed an order, it may take a few minutes for it to be validated. Please refresh the page if your order is missing.'}

      {/if} + +
      + {if $orders && count($orders)} + + + + + + + + + + + + + + {foreach from=$orders item=order name=myLoop} + + + + + + + + + + {/foreach} + +
      {l s='Order'}{l s='Date'}{l s='Total price'}{l s='Payment'}{l s='Status'}{l s='Invoice'} 
      {dateFormat date=$order.date_add full=0}{displayPrice price=$order.total_paid_real currency=$order.id_currency no_utf8=false convert=false}{$order.payment|escape:'htmlall':'UTF-8'}{if isset($order.order_state)}{$order.order_state|escape:'htmlall':'UTF-8'}{/if} + {if (isset($order.invoice) && $order.invoice && isset($order.invoice_number) && $order.invoice_number) && isset($invoiceAllowed) && $invoiceAllowed == true} + {l s='Invoice'} + {l s='PDF'} + {else}-{/if} + + {l s='details'} + {if isset($opc) && $opc} + + {else} + + {/if} + {l s='Reorder'} + +
      + + {else} +

      {l s='You have not placed any orders.'}

      + {/if} +
      + + diff --git a/themes/prestashop/identity.tpl b/themes/prestashop/identity.tpl new file mode 100644 index 000000000..9c267c562 --- /dev/null +++ b/themes/prestashop/identity.tpl @@ -0,0 +1,139 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7075 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{capture name=path}{l s='My account'}{$navigationPipe}{l s='Your personal information'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

      {l s='Your personal information'}

      + +{include file="$tpl_dir./errors.tpl"} + +{if isset($confirmation) && $confirmation} +

      + {l s='Your personal information has been successfully updated.'} + {if isset($pwd_changed)}
      {l s='Your password has been sent to your e-mail:'} {$email|escape:'htmlall':'UTF-8'}{/if} +

      +{else} +

      {l s='Please do not hesitate to update your personal information if it has changed.'}

      +

      *{l s='Required field'}

      +
      +
      +

      + {l s='Title'} + + + + +

      +

      + + * +

      +

      + + * +

      +

      + + * +

      +

      + + * +

      +

      + + +

      +

      + + +

      +

      + + + {* + {l s='January'} + {l s='February'} + {l s='March'} + {l s='April'} + {l s='May'} + {l s='June'} + {l s='July'} + {l s='August'} + {l s='September'} + {l s='October'} + {l s='November'} + {l s='December'} + *} + + +

      + {if $newsletter} +

      + + +

      +

      + + +

      + {/if} +

      + +

      +
      +
      +

      + {l s='[Insert customer data privacy clause or law here, if applicable]'} +

      +{/if} + + diff --git a/themes/prestashop/img/address_alias_left.gif b/themes/prestashop/img/address_alias_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..df0d6399d5ea856b3ceac0a2817ae07b7228ccc1 GIT binary patch literal 928 zcmb`?2~Sf80KoA_?0~9?m>Gf#YuN?{I3zSJM``I@OACynEv4;yuXDw9QjDu_@jLAQ0e;E9yt1t1^B=aS zy$5*l0BA6ZrAnDXV>DTu?pfC}uiNAE%+AgF7BCE3UJ0a9DXkuwoHAMMF0;jMfTkTT zkIpdV@y>4~lNxZ+?(`@%pv~cijAoPBX0|viHm5?R6NqF|xmqMqsC5P{2pJ%gP%M8s zAqD=|K6r&o0{}d*_pSQ&2}sBEv>JEbgHH3v<(Ufy=`PNdswdwI=EoajyY}aI;(x6E zq~8fkuGxQ9`_~oMj|djy$al>B2RE^%8#kM2w^~};Znt;bx!c**eed_yf~_B>_dR;t zKQK5%XACo0Bctpw4wuItXBK4bct<3bNM&+`Ql-{tb)eob2~8QNH3j)QaW=cd>2g2w z%zAxu^9z40E-kP41HSU?wQwW~BWUc;=YPf5U;Lf;=jBFnGhUwaZ|V&OY}uMyA!Hbu zGv6hhGz*8J)~p?bAbEmm?8rG#zhs_ZnY!}6Y0s?`jm-2Eeoa`=i$<*v_nos0REpX5 z{*qtNr5W*<6Qh$a65M17$IYtfA)T^FxSp{ZR@GpYl;`E2pc8iMrTjU;S*ZQ}!?N)O zF~!3>WtBZylwWcZX2|lV%W7%@UAD>vez0lFHbS*R7=+p|!fu0NB4q0R=2z`c^G_zNk1u+-XqD<9>bfHsTSD;zh{Z z^YIynMwy7Zx`_BgTGh+gytu*d(5jR10MtP|s?)qmz#vhn*J)oT*F#qNQBaq9y_tyl zogj!|z{;VNr2)B(ur}D5*HXCJmfuTR zyFIwv^&8}O!SMi2g3RD*(Ydtk( zMdAC$YwN-fPMqh4drvkZ;fH5WU&Uqq)LR#ML}7Cyk1xoONdKkjqUgXCUtM&Ns=JEA zU*ABY^rmzY%%El0!^3TRcrf!$F$%M~3D;;D_iO8s(Z2IMggwxRB4dme63Q9rtw*_> V-z-MnxC}-4!f8?i{}2Ft@gD}s`Yiwe literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/address_alias_right.gif b/themes/prestashop/img/address_alias_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0c0779cbee3481e4d863cd5d6e0398efebe709c GIT binary patch literal 928 zcmb`?2~Sf80KoA_?0~i=V&(`M<_WIt*kmLx`G02p{4Xt>3z4ak4I_gU3&oIXiI7PTBgNyQVpwJ{0{qnfM4?erlzXmlZ)GP z_5eOK076EIOeI%pjV6oJ?R7ozxjlZ5ch2iy$Y!(4E5S@Aqcgx$(&n`NXTiNy-H#^9;I=i}W_w@GNxl17*dIw#aOB)!x|6pi% zgw9}&j269J1`-lXw2AKbhK&7EMl1``@ilft`W0mskkpO3kLDHb>PS)%W#c^V;`#c zC9yOsnQ&$q#Gf#3qLk}qRZ|J)EK;6l;uNcPq*liF3C=JuyA3kI+~ftg=iTG-hYJ#t zhkwp0f3&D*abjkPipR^Ewp3!-s+bIb?c1<>>y*L}+?~bjhLobPssGS%dYwufu?`+> zUa_epF(>mQYz|Q^jeEG?2^#Eb+4`LDl9hf!BY(Q6JdfQ8X%xwTp#!_`TdneW*i3!@ zyhE!>#at9D`j}4rVtroH9B}9~>0}V@-FH&2eU(B$tjeI*ZKXHDR>nzCpV@kuS`Rou zFq;Kd-mA<*6_SEC@(*)^H@BA~!H$9|T!_4@o)o%O^aYL#6t^O}P}lxW+-i3TjkJ0j z$KkH_l*y6R-XnC}bl%5)Qut0qlpDVL`6d#k5OeWs{gs7{Yrj>$##I7!fcKs=iRGsijNOo=Eph1t%>*qvy+hEvT02T9{1O4 UM*c&2A|VjY5Sj(Y0N}I#0A|bdod5s; literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/ajax-loader.gif b/themes/prestashop/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f1fb335a9636874c4236ba949cc9c3fcc1fa042 GIT binary patch literal 3208 zcmc(ic~Dc=9>*`aH#f_@`t;sl1A!Wph)@ebfwHO)AV5GC0YN|{Mg(zX5eQpYLIScS zgf*ZfkQkyB5f{*ES)?Eq2J3>_hYx7$g1FVO&(_ZKft@$=W*&dMnK#pS{ycN$ocVlz z-|u(kaDBZUo#L1P6LPr zAYk?@M4`@~TDNe+!lMB6c-gRTVw`4n^f8|&HgEPu4O>G9?uyW}>qwgQTW74;_BJ-x z_p1+?39I|QWg8KextI^KIR;JE1Yaw&-+ef1-8U~kXaE(OZEy;;zZ8Ab(NecW(z3Jf z#ksQr8Yw-4>lO)7_t2oibRT}P=@Ho7P0pr-M>j=FT_^-1*rsVZ?xN8veRQSjlc$=y zOzYVf&Zn|uJ}D(flOtVy@~rdm!IF!$l&f<7*Z6j0{!pOT9%raNj~f|d-Rt(i{cnN6 zO)15XfZ1sNK!UZ?oLkDCw|U2QmA%oJf)F}FgYs7IWlN|Pw0&jVJz4Bru*5ar zl~NR?j*=wEGBhe~J4DTFSGS+&khET?jXK7zyTtg4drrpCX@iP|P1sPv^{c9D^-02h zEYY~`IytkV<>p92w(w4ZoI6=G6F#W!$bSkv?|BxTfIp7vsCWqswMk3guBrJ<*0Sx` z7Z)9;jE2n!i{ZbR$G5bd$A4_gwHL&Q*Vd>)hR!NN*Ow{w`WIyl+;U~&QRDVg0ko@A zRQ9-$rPzqd^zUBL=1VAkwO>5yr5oBwI|mUDVVW>1k`L{Or?JQdJ35KOKbjKYG}Hwr z2!(_kc2NX_LM_?K26v~MWq$U>ScwlR5Ni{{L6}IWKMpVNTR**RpdD(-Za6ojef>wAvcj6AqHU;{OWc!gl9|H-r7Vk(re+*% zQ6WT1g}BU3rAM_VnopvwniCt2UEtQTdK8B)U14jf4S1Jd$U(6^K3vT9y{6rtnIwe< zGDdN7s5CZbcx@#hp4c%nlgVqYNI8$qH9g&!7^`Dd+<9@}H@ExP%!84`_w06$ejd=@ zwz&I0j^9c*J8EI+r4hu`RN-{(Ku`$9ovd&+`|`aoSzb`x#80nY!g3I;;N6jx;qNrj(}cs&CdHDs_Vv;kT&QH+Fi0)l~r?iaMLh&KvjiAe91@ zltqAhQ8-U+$4aq8dN0e;3ZX);4YY2w6^INI865>uAJjg2B>Tp*)clcOV!(6PsmLjp z(tBrcQN6&mni)taNR9Z}^{~Zf%RQDZKK?fg1rX9cUjVE8Sj^_yDw;~`6}(+vbsGB) zd+9Hbm;U|p$kSTt+k}GJq$k0uY*7(rKb?kMMeQQr`O*pv3{SQYpe;-I+Ym{)C`~4@ zS5jZ}B^UfcImOE4Gd|h4gGD%KlYGQqssuizQBV$6;ktbqm}eZdK@= zKoP6lgoq&E(L|@NF1Q)fF*#&X4?|qL`9uVAf-ZKTSq>)e*rh#KSBB1yj^B~Fu zn&tm+QxGtMA_`@o9e_-X_j=uW1N|gdhCef>cRw0gZXf^%e&eexG4Wpxg)i^#HD9y| zp8cB+;(04D4OJoi+qaZh1z8!KoOZcm9+YLJ*iz8@Jlbo#>Sr@@o^4p*`bkepLu|5x z?=O6+s_m!S*L><49Vs4lE|jyUR#}ksP20bJka|VVHxcnxb1Zn$5*#cmC#L6Yl9nq# znVeSxRwfD^N?V-4i~=46!^Avyj!s89z9z>hk8~O)r3#}>iAXebL8te$r@Lf;2-1TS zb)CWag0<*ffN}%rU-`f20f4lxV^?mH`*8}_`8|zD~_IV z28BeGA8qGme=f9G6TbX2__;#*Jg~IVF-KS;FIVK2Dp?UlJOT(hnHD;$b@}X^HWr1b z1Bnad5bQzjY}-fQg@VQ)43qrT{NQ{TMTd}^0A&!ak`l*Iqniju92_b^#`=LtoHW?Q z1IHd>Pq6Mm>5u5#CvTar^T7|FvPa24w$)qB8 zoB8a6oE$m>LbTfAv}hdeK;bS10Zho@YqSW_v)>p3!GV~SZbYpPCn1Oqp7+2om>+I= z3o*J2W7G$w@U8I~oH*>n0dM_)J@b6TdxBH}Z?WfJ@w8%fS~=w+He_YOW>;Bu%c^%sI zumeCIG>)Q?SGqxZO*af{zzJYm#v04pu+hYKzD`oo?Nh+?=7SvKZ4y2kx{3Gjo2U11 z!S{@pw4Y<%^?7`u>IDi~9LV(Xlb(wP;mQAG0y6rI$nawkEMt>5tRU*U6bW~_@j_)> zZ{1#I7)C_0IKD|H`}w@pl3hHR91}TGin8M5HI5Ajlr{AFhH8zZAiT<1YD0wK!_EQu z3@WLkgOeu81uk}zN{qb{x{^+JkQ@LCcm-HcA-1El5Ck29Ty4V0_rXXXZ~3&-CM=+z zMV;o}`1UDhI_V8?M8~-QdZTsBZw|EfS7s8+rJoSOrTN5X(K4-S6xTph#F!Bj6g0961=UO`D)(&dH866{+01K-V z?)TG3X=$Wn8wX~DJzVJP5?gGNiVy==dr`6il}f2oI0;s_HXUmxX`8$MsLm CZnPr+ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/arrow_rotate_anticlockwise.png b/themes/prestashop/img/arrow_rotate_anticlockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..46c75aa859671e2d1366f2aed7f5792b371091f1 GIT binary patch literal 608 zcmV-m0-ybfP)*nn(6-Ko08>y5Bipj zFuyiPrdN8pDqvvkw%oSbD|$YUB3aMBizpn!0@bH?0kAfUJ+m=Vt{!e1UD z_AQ7AnZ&Yq3oU^QbQ$1o#v~>3AqYSCl3VwJuGp2*ve%Mr?A16`oZg&5Nc6*_Q~a<`f+n=r+3NUh>M=H*cV_-chG}N7Vspn9Y`Se z0C&>eX!bRrM=;=eq7!GFC$R4w=n|A@e`7&l%LDhi6W$FLp7k-fKe@oJG0^dCs2ftC zB0v*S$*EwIXr4EM`7n&hl5iB`A4lL?b)cQ2aNKqjRZp2DO_QVx^C5UDGKfoZ!!H~hg$jm6nz$D1XEXer(2++BV zj6gRc0X9yMRSe8XLQIUz3~ZbNK&>py$jTWfihM}icrh?2X(7-+2B4#m%@R~(EKHmz z6!`xZ0}oJwNsw8P!Jc7F(fi)Hmv&Y?(KWSPrg5%9WY(O^Y==tZ%`g4YwvQ5=w|C`X zMoZo~dpAX;Tk*{;I8b$==DydNMG;AO^2+YvcE!Z`}j}n LvdVcB{r@HaL+egR literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_bg.jpg b/themes/prestashop/img/block_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12d87c9d8a482e5a92f792313f7bc1f6989677ae GIT binary patch literal 361 zcmex=C*tJ8G-$GM6Lu|8D{SU#c{h literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_bg_myaccount.jpg b/themes/prestashop/img/block_bg_myaccount.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ec840993ad113ecb3d07a484f4e0d899536071c GIT binary patch literal 394 zcmex=C5UDGKfoZ!!BD`!$jm6nz$D1XEXer(2tyLk zVL&$`0TwQZRY*cW-?Fd^FaYgkW<^ph#F!ZPVc|x>!p4V5!h(zp%s_|)7zGsr8=3y! zV&GwB1X{=}$Y9T~MZEj^g1N o&YTDNlB_5CqkoCoY*O~C5Pc%L&h=2j+dDDh%v($D%pfoF!LQaTcu7Jm@3xa;2i!3yBHYhAcf*YxmUj>Q20J H^8ZZ$?0GtC literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_exclusive_bg.jpg b/themes/prestashop/img/block_exclusive_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c2ee9f6d7f3feab243c433e6005fd58736d441d GIT binary patch literal 375 zcmex=6+}!OQxCM~+wD-Nj3UwHnvU`5l! zogT3~@dA6_x8CjdPt7_Nym9OEmM?z|Vyd4Obofi&%rT-rUb;v!CDie-i*lV)zIE literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_footer.gif b/themes/prestashop/img/block_footer.gif new file mode 100644 index 0000000000000000000000000000000000000000..47c8de4ff566c5f10b4fb123a365679be744bd85 GIT binary patch literal 261 zcmZ?wbhEHb+|R(qaD;*3$+H(vp1u12|NqC2pZ@*(_vGobhmW2^2yWZ3`79MpDbWiIv^5cCj)C!g0kmmaka3YW12W?6K1o8LR=eOLqwX literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_footer.png b/themes/prestashop/img/block_footer.png new file mode 100755 index 0000000000000000000000000000000000000000..dc055ece11cb7fb60defd96e80bf38cbc4a07a5c GIT binary patch literal 207 zcmV;=05JcFP)uky<>u$;{QUgm<>=<-=i%e!=(* z>Ez|-IP-*50000^Nkl?;Sc}-002ov JPDHLkV1mGfY+wKY literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_footer_myaccount.jpg b/themes/prestashop/img/block_footer_myaccount.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84df35ea964b4656fda45088dcf73a29a57a8ff9 GIT binary patch literal 852 zcmex=C5UDGKfoZ!!NA6_pP5mRfk}{&S&;Gn5r!g= z!+?%N0&HAB5oT0DMiy3f0R{$ER*)1-Eh7`NFbl(^%OR|SY>GxAf(#7I9Lx-itZ=PN z%#48>FA6QXBrK>H{K3#siABWe|1Aa{py5n{%z_N|4A=MHJot0R-AK1bWsAR9zFN2N z@q~?48oHv!62}q~Ci99+Vc8#Gm1ZEbfceK42b0L#_IAA=4=<@(|7F#+t!Y_*=hd4@ zZwvjN8RfNa?fbTkbIhj|T@<_H+jL`{Rgn8Jr*B(ph4wS#sU6G-m(^5$tZ;4pqVNa2 zM{ekLJzlC(lOlEXi`O5<9kW?C#*{4S?`e+O*BRenE}XDUyKlE{b|7Q?k=)M@_vajLulW7uMN7^zvR6>s|6EvFF z(ZJsLqQklB#oWE?((gZK>e_$7^^{A6)v;{J(^iV!|8Cu@Fpl=OHQ4VLeV-?}{{Kw? DEnyxj literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_footer_page.gif b/themes/prestashop/img/block_footer_page.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0e8c1aef97889b3616179f3ba5fcc038151afdf GIT binary patch literal 1733 zcmV;$20HmiNk%w1VblW@0LB9VwY!lS3JdxVp%vALO^rHhZ4o}#LTi41ejE#(BTJr4xw7TUm@{kM z%(*jRxj~Fj$bjO90VrsQc$p$XjqBI2W6PdRySDAyxO3~?&AYen-@tZFK12haiS1 z;)o=cXyS<|rl{hIEVk(4i!jD0+R%zvxSZ1l^mRxq}<(FWFDdw1DmTBghXr`&=nryb|=9_TFDd(JY z)@kRRc;>0+o_zL+W)(an0Rjn!aN$G?9$>M?qKr1`=%bKED(R$@R%+>`m}aW!rkr-_ z>8GHED(a}DmTKy$sHUpws;su^>Z`EED(kGYeu{+$EjYo&AzEb7fddl2A?&ck7HjOW z$R?}ovdlK??6c5DEA6z@R%`9G*k-Hkw%m5>?YH2DEAF`DmTT_0=%%agy4FhIKnGc9 zamW!R=rBeMZse=)zWny<@4o;CEbzbt7i{ps2q&!Y!VEX;@WT*CEb+t?{#R`A#TaL- z@x~l??D5AShb(f#F^r)@2}c~Vgc(9iaL3Cq$1L;AG}mnN%{b?*^Ugf??DNk+2QBo_ zL>F!J(MTt)^wLZ>?ex=7M=kZ#R99{F)mRrjfe>aaamW=&-0+1RWS4FB*=VP&_S$T> z?e^Pn$1V5Vbk}Y7-FWA%_uhQ>?f2h+2QK*Fgcol3;fN=$_~MK=uJ;!=AaTVZ8;o$q z5LCRO`R1H=?)m4Shc5c)q?c~`>8Pi!`s%E=?)vMn$1eNqwAXI??YQTz`|iB=?)&e+ z2QU2au2V6@86#|P2pJE6kpmEML@)jH)K_o)_1I^x{r22<@BR1w;D;~%_~e&w{`u&q zum1Y%x9|S@@W(Iz{Pfpv|NZ#quYdVK|xFyI3Sq<{_xOrQc6$iN0V@PQDF zpadsK!3tXNf*8!81~TO>_H7eaDhWCKm#xmvvDv3Nl_6sejvqI9OUlAu^2yWZ7N1)}faY)(ctjR6FmMZlFeAgPITAoY_7YEDSN7YiYyvWp$LAd2 z1qx}DxJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5rD5T{VDFhUy7MCOjXXF=zZ9kz4 z)Kl&0;usQf`0X`MzLo$E*T9PXn^$VFe%~Kn$Z2J;|I1uUW~aQSn!Bm5C+518^zG1} zkXf?vxy#*(@G5;_d3BFfQlZj|)qZ_nvN&@s=cLnX>QeslWVz^z?%#e+)!AUmukJOw zlcz7My3_JP?$^px2bbPCw{9s$cfOc1&8R{4&aPR`GA_H!fzDv?boFyt=akR{0G?Kz AoB#j- literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_header.gif b/themes/prestashop/img/block_header.gif new file mode 100644 index 0000000000000000000000000000000000000000..98a450a5b05dca1e30735f355773c8ac39e24291 GIT binary patch literal 1286 zcmV+h1^N0%Nk%w1VZQ(w0Oo%H*V^9D($?DD;o9Eh+}`5c-{W?Jo7vsu*4yOO+T*pj zyVKa>(bnIzx4YKcn#)5*=$$jsHu(AU)1-qhIP z&C%4?+TYC3)!E$Q*xlpU+~U;P;nCLM#mUgm)ZEwF;m*<4($v|?&eYA(*1p2Y$ji{j z%Ffu_;l;?z)7Rg|$&yn)7#6?*xBCX*WBaB%+=T1 zpa?(A3+^&ePA**v87z!pG3b&DO-m%+b`?)z{n1&(qG) z)Y;tN#K+9W$<4*b%*)Nu*4W+1%Fff(*~!b$!p6+O#?7j&umAu5A^8LW004ggEC2ui z0KWhk000O7fPa4!5KR((h>41ejE#(BTJr4Suq$Z8j=)2 zRN{ycA$UTI9!C>oFt6t5zwd>cgW2Y8kPXyJtzW~kwY9Cqm8haiS1 z;)o=cxFHuOsF1-Eh;;FU2TpJx$BZ=AXyc7I=BVS2Jof10k3a?~0+o_zLMXANgWVF4m*;K0Hjh$gD&qKr1`=%bKED(R$@R%+>`m`ch54r?F+ z1PL*;kjJQ`mTKy$sHUpws;su^>Z`EED(kGPwh#jeKp^r16jDSGK^?#bE9|hu7HjOW z$R?}ovdlK??6c4s>#Gz{{D24>Q_x_?3wCtt?YH2DEAF`DmTT_0=%%agy6m<)F1IvH z!3H7^450)aZqT9czWny<@4o;CEbzbt7i{ps2q&yC!1*dM!~^tR(FY$CS8VZP#TaL- z@x~l??D5AShb;2QBzxS)6%hM@MHyxEK}H`i$1L;AG}mnN%{b?*^Ugf??DNk++x#-i wSRleg0}Uvkv>ygE?ex=7M=kZ#R99{F)mUe(_10W>{j?uSD}Xc;egpylJIc%a{{R30 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_header.png b/themes/prestashop/img/block_header.png new file mode 100755 index 0000000000000000000000000000000000000000..3dbdc2c56ac102e57e85584b51d34f3d862b7112 GIT binary patch literal 966 zcmc&y>u(fw6dg2(EtV!FRj5T;TT)4QL{LGp6sue5gH%!%N>e`2M5Uq<$NC8`C+kJJOyYt+6{pPvdoefe+wT)5|ch_l;l{^P_#6|%Slm0{mvvj6OPiH6lWBKU|kWEU}kZK7XZ-bWHlARm@vvs!P7JkfRSaBGReqr2$_VZ z71aV}R+RPWP$Y^n5tNm+3`r$9QKuMzO#&>QjNu$f%LqpCB5-X{tibT1YRn-xg^@Ih zQwjG^U=ndgkW@0k#V{(0(Ldg}Hf3`(<0`mcgnGy_?2Q)SmvpGd6r*^uK-S z)#7`Hd&f#j&rU&!>IL<|gTq}-)z;k#=EMFMp8d9d*O6UlF>>|H*i7da%X{{$z35*W zXgK%R8uqKu&)YHQNPAaLmA_);Cp#`UqhI>7tH+!2u^|V4XFi9l_5^Z&3orkB{b)_D z)Vn;=dfus<+&j7Cu8*nFLL|HWU+^MB_02D-JSM@#$Os|SS(J&z-mG3VH8+pnC9)Li-PPD6g< z(O?}@e%GzRF@}YlDlJf{2owps1{{xR{-!xxL1?zsk0~ z%dxu4y1&Tx`1rZM$hf`6l9rjOv%#32s(ONstF*(fxyqECuBouSf{dGmidxSXP`hmDz+ouqn% zmW`2_pQNpjn53|}%Cfr3qpiN)-{7XMyoHXQi;41ejE#g(OcgW6PdRySDAyxO3~?&Aaz(9jePPIaGy76e&~c zC|}OJx%21Hqf4Joy}I@5*t2VgK1E6tCRGkmNwML?i8<)gt6$H)z5Dm@0+o_zM{=bwNED(Iku7HX)USIp_eAx$WO#0NjzA?c))R%+>`m}aW!rkr-_ z>8GHEDk`Qwe1L=!O&oGW2Rs1q#;dT#D(kGY)@tjmxaO+suDtf@>#w&0z(WT|9D>0B z8Dx;hvdlK??6c5DEA6z@R%`9G*k-Hkw$mm%00xJMfdc{L%3=?z`~D zEAPDY)@v`jCS2#tLERA@INi7i{ps2q&!Y!VEX;@WT*CEV062tU$(A42QJg z0SqsILC41+hb;2QB$sUR$tb6+^2#i??DEScgYg0k9<*@?8#VY~#vVNP?DNk+2QBo_ jL>F!J(MTt)^wLZdZH5muuz|_cR99{F)mUd8Ngx0_z2(0X literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_header_exclusive.png b/themes/prestashop/img/block_header_exclusive.png new file mode 100755 index 0000000000000000000000000000000000000000..c19ec41e7b1dbf93f18ffd3bf3dcd476a5f7f745 GIT binary patch literal 960 zcmc(d`%fDM0LO0_BYOZEAL($@xGW=N$uf)?KJZoBx$4&8AYuZ;bw+Tjf=xhU*HKp5 zE2UiR^?iLnS#Mp-mFw%;UXQjXbcOD^jVO}3EMuL~C>c%`Gwc#V?SJ7n`F_9o{`~!@ zn)&ZnZL8e|06-P*29TiLK32{)QO!I6Y#D4m+R7b<%&`=6x?4D;w#bHccBjV| zAT16wo}43TCYsCzsT@UT|1B2dbe2rc=}gFEc*Zg|DVAw4BJGbe1_$m9BxR#Eh1z(@ zKjU-7^N{kX}>t7gb=d>70XQ!jEtjGS_>MW zm=MLdrc%py3T`~1(2S{JTaZkv;4zKS>GZ^gVW-;QvN^qw+3oU1+!%4$M<5qN_Dhke zSXOIvbP2!y{A>?FWuns=Unqfx6JBBti_A;puoTn{j#!Dr)d8i+g^^;p0gGg{RXRw8s3#y9(t3P^pGZKkB|4o3M|4t!Ry?FPAWqn5 z?+|pAN~PBJ1F`ZYgMBCXE#>)t3V8ML54+1;^zu0Gwz3wNZm8HZ01GHI+!owF$h91) z-|9O3+APQ*)om+Jo}_Y}NqW9W*A**2GPFEwINbliff2byr`dJvcB;Sn>3b=Bg~e;x z^O9MYr#Ou)Yi92=tNZ%$Xe+OAHG)D1NXhTw7rUJ|1xcM8=1hlySv>r)ur~ea(gH3igmr&mn5vfIyV1A^hW}}l z+*sJLa;&($?Umigl{)rfTgAry*&jtK&yN4}0B*h@z4_HQ@y<0-{M!AOHo1P3?)tW}RI!jBXqbE;*|Pbl zqpN;hbNtJCeJ)-4A@p9;DbDIA)dl*UT43MJ&8x@gJ=Dn zJu}h(c~=Onoq2TVxhK}>JInXZfA;gOTPfw+JyK9q^#}KPKv2d2;BomJoPA36AK2MP AMF0Q* literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_header_exclusive_cart.gif b/themes/prestashop/img/block_header_exclusive_cart.gif new file mode 100644 index 0000000000000000000000000000000000000000..8315b8c3172fcc1a369edf532731df5788e6e656 GIT binary patch literal 1431 zcmV;I1!($5Nk%w1VZQ(w0Oo%HwYFVsh!pVJxmA$~lvAW8ltGbq)rh0^y z`uh8gk(#Ww$da3>*4W#*zQ}rpnz6OI)YjRRp0AOZqk)K&h>e%2u)V6Tx0#=+oujRV zig?{{;pDfvzqPo)prov}yThEIsHCW{tgyJRw7j#ozxVj~`}_Q-t+=qYzMrJ5 zjhCjQt-gtop0KyX^YrzyxWbm5tF*eqr>wNDw!*Nu#(jvIm!PnpsJNM-u9KXsf{dH0 zv%#yh!{+Gfj+LN=j-HR0q@$;>rmnoBskNr7w2P6OvbMg6k)Vr|qnMqfiH((wk(jx? z#=5`AhKiDunV_+{%eKACxWCGgm7IcykbHxXe}#~GgOglgX8-^HA^8LW004ggEC2ui z0KWhk000O7fPa5W0}6hJh>41ejE#CxTzd)(g9;NKqyPYS$jQpf%+1cv(9zP<)YaD4*viHjG9D8O zgfkHy7{_?$=;`X~?CtLF@bU8V^!4`l>vsSc9uYHzB_e2f03bw&IS3OfT*$DY!-o(f zN}NcsqQ#3C6&eKaKud%YhGK}B@}Nk80&-HST*C>oFt6t5zwd>cgW6PdR8#M_66-qm~L0|y`0w4kq7-NG#4b+~| zWH{6%LlYH9qD!Any}I@5*t2Wj&b_<$@8GLbxPjyXkOT|HI9L#bI0FhehEP}0Btw@& z2N0xDgGGS<{{RLk;D7`cXyAbeCaB0+o_zM{=bwNED(Iku7HVjpXY>F<1r7)>f&)Sb;DQc))@j8ThkWpX1{%EK z>8GHED(a}DmTKy$sHUpws;stJ>Iek55QGD?IuL{prE;q2AyAlMLLI;cE9|hu7HjOW z$R?}ovdlK??6b*U00IdKBrq)rM<8p08BiSJ1{q}JA?~>3mTT_0=%%agy6m>=?z`~D z%kBw@dXA#F&pMh6|lA@INi7i{ps2q&!Y!VEX;@WT*CoUjcv{4hfF2MN${ z!wv`oyoMBQ98v}hFrWa($tb6+^2#i??DESn$1L;AG}mnN%QX;?W*s_f=rRf?ex=7M=kZ#R99{F)lg4JfDmxFKmZdtJZq{R1SjyogC18Pi!`s%E=?)vMn$A0?f7HlBG=A3WP$L_rM?)&e+ l2QU2a#20V;@yI8y{PM$ZVEgTuL@)jH)K_o)^^gPt06RZ?{(t}g literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_header_exclusive_cart.png b/themes/prestashop/img/block_header_exclusive_cart.png new file mode 100755 index 0000000000000000000000000000000000000000..26add9ea2a3224391af190e4da7a0a651e465507 GIT binary patch literal 1134 zcmc&y`!gE`9FM8lsG+ngT{n8OwPx4d+G&rr9;IZIH1n8sMRC&UbfUeQv<^W8^++U< zh(}1sQ-nN3h)57Zx_Vbi=2E1J(^Y9gl4bcX_PP5!zQ2AypE6KXn1h|W9RL7u0EUNv zEiSRp?IUZ8#zP%P0RXE4P-ILfzh9wHPSaRCG>%|4n}y<$>DdJ$g-fDxRWHM(v?d%Bt%`zT zff6(_F3#5ayU7`o%U2`Nq;MJZjFu9;X-oQ%+vI8+SnUJII^!4-Uzm+}n?=%L&tD$Q z#k+Ztt}0Q^dQ3q$R&M@LgvK!G_^;F%jg+-9Xa-Ac&4_x!r%`s^E_ z1JV0u7ZM*#hqOdF=B08xWy&nyl0Qz;%(Gp`5~M`0zLc|I5h5r)0||?`2NhnM|BOmY zB8&S1K*=4Aaj%lehd+(GHJMnvulX}8pE@^Ya?iZ$cK?*?{fyPdUqFUz)N*PB6J@vx z=~_5AqTMBU*}KlwxR1}A^xTwJf%!lS3JdxVp%vALO^rHhZ4o}#LTi41ejE#zMNIKR1Pv5JGMcam zqhgNd&!9t#9!C>oFt6t5zwd>cgW6PdRySDAyxO3~?jax++7ENRvf+6L^iXv^2 zD__pMx%21Hqf4Joy}I@5*t2Wj&b_<$@8H9WA5Xr#`SC?ooR9+J5D5@TcvO)?zrOwZ z`19-E&%eL_{{RLk;D7`cXyAbeCaBM?haiS1 z;)o=cXyS<|rl{hIEVk(4i!jD00+o_zM{=bwNED(Iku7Ha6Bh$gD&qKr1`=%bKED(Ry!jG;pbM;x+*8A42O z$ETo%D(a}DmTKy$sHUpws;su^>Z`EED(kGY)@tjmxaO+suDtF#fe>aaamW=&-0+1R z$R?}ovdlK??6c5DEA6z@R%`9G*k-Hkw%m5>?YH2DEAF`DmP_szHz0AvAsdWv#t>Az zA@98O)@$#*_~xtczWny<@4o;CEbzbt7i{ps2q&!Y!VEX;@WTvKF~k`oY;XwX84rMw z0}yd^?D5AShb;2QB$sUR$tb6+^2#i??DESn$1L;AG}mnN%{b?*^UXly0LBAk98v)W zK0uHH9Y`mw^wLZ>?ex=7M=kZ#R99{F)mUe(_10W>?e*7Shb{KlWS1>=3J~~!K?R3g z5JC+-)FJoWbk}Y7-FWA%_uhQ>?f2h+2QK*Fgcol3;fN=$_~MK=?)c-5_fSI!7aX#H z1~k|(0~?%o?)m4Shc5c)q?c~`>8Pi!`s%E=?)vMn$1eNqwAXI??YQS|`wTYFpuqyA X1TXyX#20V;@yI8y{PN5%9|!!lS3JdxVp%vALO^rHhZ4o}#LTiDuya7ms z=-!x{i7SUb=jlCwbn5gSR+#ww%+Y6h0gz06jh0#5)^ps_lcV&eVl?SXHA zj)Cp#eI_pLu2jDOI;tzXB_A<4fzG03GW~;}#~?+C$612LLI!9I|Vf7~l^-T0WgHD`#1)00000NkvXX Hu0mjf(9oKG literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_header_myaccount.jpg b/themes/prestashop/img/block_header_myaccount.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9af1a82a20a6d292acbf83076299ab81bec8c339 GIT binary patch literal 1851 zcmex=|R%SLvCUy=1phsCDo`Gr+Visl;WD;Q&WpPk8WD^92 z8Bie$JHkK~#*0iwlT8H;SsfGul_x4qS|p-kA_TO6frTB(3dV^>4uXnI35Je^jT?m) z3Ii1|vLL&H@q=KZV&TD$4u*~k11D~5{C|sq2k1s7L1sZ<@L&3Ne&dU14XCx;&$d3> zr@yq<0Lo_xN_;r?4Dy;3GHJtvdn_K7TJWR*Ik^ix@XzIT%5siR_POV%>l$+?ko3$Z}ch8tjH0-SnS$%&o z#6wJM_DrWc>>=&}aemxf7Qb}Pw4%t9>8b=M{dL(Pzh17~z5DQbyWYF^Ol53Z(|P=ZL`e8zf47S-?qAi?$iN2j)ZAaB zr#05~9xk|J&WoM6vVC{-+M4;02m)E|6ntzI2&_{M{?;xQnK}&_Mcm@q^z`&}y_lUv z$W&=1G*UqZT(#R(a&gnQ+ducO_ju!;WG#53??{>QM%fOmoN}dk*WMqnZ~T32)&Bb# zy){1`Ffi0j{>AlO?N1fh9U-5hfsR9DegT(Bo+=>ZG&^_OZ4lZr4NPsjode6_3}Eko z!crjHb?GIIt!r8m?)Q9seSLl0-YO)j%A`f)C2OchvYPLsI-}cDU3eNN7_m8=kYrX! z!DLFzum1etuTkTE&mh%J(fEd&h~@(##jt_PRBz0In&?9A+|mx6>mh39#mS9w0E_@w2N zIiLJ0)omu@5h$GhqD`nhy8h85W8>_QDQzoeu0PJez;vKIa+S4}@nXDa(aO4+ztSiF GzX06SC0>!D+mkiUIG{-Rqt#QlBr%cV3!6jM3##>%BuT46YnOe~@);M*qJEn+; zxMqeciW_FRMT$EhDv4VziJ*X@2!f*K=xx5=KjEIQ=gWD1&p8Kde{*w zz%vF=X;M6+|L3IXn}y3yYbLPt#Ya_>gpgU}^~b^fLJkGH)~s=AOw{(tHuS965F zWVWM-T$g0t5Lok&zthi9kh@8>_*^urgu2w#z^h0ZpnkOjib0`ZU}{!+B$STaXP74`RDtUIQs1U z@*x6a@EL82*ft8oanE2EM5 zQI^yqK#^FU8AFkEk{5N8n2K3vyb@C>aKK8?=|iXERN*y>kh0!0*ri*=3%;*s&Lwri zlEiT0>YwkY?BY5N9)bR^|3$!bU1J9bqz$t9+x&YIAn-OwAM8(?i7Jf&e`oE_q~*6` z^$w$Q5j6#!NrtCFCYUva-6>GlL}TRJTb;lq1F-*Hp$^2xFh}nUthS{0mE+_2305to z{|zig`w;3~>8C-@Ju;B*;8LV)e^aDPxuE>N`~nbrz}qz)ZN74Fr5T)A-|pN$vPGK zh0|Co?kBq@nRqn4o8y&UE&sK*>AiG>cC#n%ukR7NPaK|@d07K%H?j0OaM~}G>=-R% zrX9V}M{iV$xrLYBT>jX!A|0&_o$CAeLA}IpPul+Rm*(e6!ESH6D{h)>6CGVi5tpZ# zs;>osNT&K*zMTR{%aR|dVGzuZ0-KleqapSZevF>G<#g-;@8Ib;L+yk&`Uy|+;o46O zRT|I$8qIZ=4umX7w5gK_l5D#yg*dz6U}3VOs8onQw<-~)z_hGp2yO;AmCa`OhtJJs2E<#5vTkME6=esPl!gGhRFkM#S+$Y1= zg7o*fne93P96H&(=OQ_hMUFKHk>n?sQzZpB`*}$r!QFbUh~ynISDY0@oh!)=pP!?U zn5pFjhIOYuj2{@oqRoTG=3?N~`Fr^U`XD*3ku8he7B<4b!}Q z;Vs90T&iU)kAfQjlTenv{<~CG-9)%_v7R4)RMs$)5h`nxl$6Vw7V4z35Av>~OLWz6 z=+ehE(X0DE==+{PH39 zTlYrDW1x_HFdWggKSv&GiO$#dVYV5B(=?sd7@9U10-ONb4Q0YC!kO(R8*(fRQlPhu zMRb@MDH0Iqg8iAy4s$2POHW+E0Scni+E0<_%lU2pDbUWJ2>gA(z7E|wvesEI0WKI_ zXf(p?vTsr(V{nDWVnnyom;(QdQ)r@Qc3;>~q(nlBpa7ETGW=<8$Y`6c#zTU!Dp32W zrJJQWl7;eHCT4Mp%pF*)%Mr_IWJs|k9Lc_tvrH;Q7hC(V*xpUc=``GJ%RLXVRw`2f zD2vj?KzIJE!OvtsN^G%6&TmG_EGD|-WG0If0E!!J zq#}bof-j^oG+k)Fvk)=l&%7;CW z(WEN2O)f*UF2;Ne!NgVoxf~E}5sw-yFj^@^cu=oovIk3?R?0k+sa_P+ z5Y=ym>f1~8u4fNbMXZzu=!AM@^J7oh769hRa=#Jwa9z_%B__GtUyK@QGCu+Zo&7JB C_A}-H literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/block_search_bg.jpg b/themes/prestashop/img/block_search_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b496335c729e95a9ab562776f5b828bb6d04ac94 GIT binary patch literal 1104 zcmex=uI=H%w(=K}(Mey}1a#RK7?>VxzCA7BvVV31)9U}h9#U=n0x7G(T?gdv-O5d?tF zgaa04R!$5-pof_SfNI&;m>8K^VQPgF7Xp1D!gz5~vPy`ckYZrrL#Iu~tfGQwMlvt} zExX0Q!^{Y@nOTs*p5fcMu1S-uqAC_In<^6M)hw~-7)Rl8nZkB9S;^2;*Q=8k$#goM z>RzqxV#y^I5*ulycp_laqE{y`@;S9m6%X_4C=$_Gv1?O_^Mr*E)verGdTZtiJkf{@ zEKPaQt~jDJPun(W5?55mf@M>A0#5ZyBpu=?IL=ehE+&%hZhlnPPTn)1?hfaorL$bc zGFWFZrZq$^pf00PH|4&`R*BkF_uqwj%5&Ay3{FnvvzIu`Vv*c_o53_fV*_i04r2m0 zLj=C5UDGKfoZ!!NAMF%giXqz$D1XEXer(2tyGA z12ZGgkqE%T%Fe~ez{rXa0kRkwn3!2u1%SdJ7F>#n5h%*WF2W%!DkjLl$jrpb%naAa zD99wF$jo3ED9lo*r0nRF)HrdWk;wmB3_L&^nFN^y8SEKu=KEYSKfW_hdqum^lU-|M z&5~H&t^2kudvXTTTppDW(4KD)!rA$PTq>GP`Z zdQTh6UdQin4)T+nC2(26q&xPq&xzYxkEK4&yFHUpwZoFDDWh&l>48bR-TCEQUEgf@ z+#B&ZeCNFNDenp`rZrkIuW`TlSo87hIUhCbp8Vq!nyauW?An5C8EunUQ&l!k*}CUy zy?FTW2YBoJG4CrM{Xm#eIr*0#qrb9$HG z!+bLEs%l18US_T6ej=x literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-account-large.gif b/themes/prestashop/img/button-account-large.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffb311741b6481952a850b5ce6dc42202d15fdb0 GIT binary patch literal 1739 zcmdVXi&xTz0>E)9k9w4vXLZ$inz`kSe3a+L)V0pN9W%jV*=?6(&Na4q^O@DwtnKdH zG)XKeF%7#u@&}?QkfQSNjfn!Hre=wm4-k3tlZOiOQ102Eale1T=bSGhDKYMgAJ~u> zhzbq?+b71KwrN{O!Lr`6{a;zTXAS98)%VYPek_&K1d8Hz%|q_fkG{6|zOy{xTSJFtU=|brx;)|#(=H(dH7a{|P5E&r!|?0DfiYuY@rpdkxY7prH# ztsU|ISxMqU{!jYE?y(C3fkPty^#1t-;^i)Y$0XwJ7voDFJS-(VdR#^J6Ro+0&Ul^>ofy>K(aGj;d0pK-y?y-y{K1!8oacy8Bp#KFjZeIq zoSJ?;^X9Dt=k;#>{lenXvP{0BSXHXj8toF!A6zq<%$D_yO{;Co?r^%cEjZY2pMyvi z@UqBze|VahMHb-w4hMw}lPM#mfhV#T#O)2DvXCa`6XXAKiJmsv(KuEW{gb3N zsk3RKChnJ>&|75MWc}$PpO4S6o2MI)72)4W*ew_14^z(7o#W8oGBBOlixLh)+J+UR zepX3gzU$1Kp?^2Vees@m!>y3io#(Zt#s^w-i(|aDWq!dP-(XZ1OD-tc@BA#C(ykB@ z51)UI>h4gEJv))JG~V5r9uJK#4gRW!t(|H9nsH^KhohIWeyRye0Jz}$u3z*^6TLj+ z@?eqgp$mOod52G5?Zdq4>t0t+HJq=%(BHGEpXIC&Opze z0_4R9^EGmONHJ`sB$Sl7@&MMUdT&`AC zb3=GkU3+UbOI>$I)uOHe%Vp~N0?%*_fb-ARkW0eo8VVssrvboUL$uV&%h}q-XIJUk zrrLa+mIf4u>l(ppSY1nV6J1AVa&bo@0hd*8Xgl}K6%~W>6yF$_I#lUfX<&$#}6jn|2%Alw$Ew*17bmN56gm7yBjn=JG)6`x~Mt+rlmB zHQVAH^$Xk5AN-GTPy{?=ONI-`+me?YY28{O#I9{Ah=^l$IXVDqS3b*VwX14xui4cA z{+L5Ut;%z#(8+*9$KjC$U%Vu=DAy5F~g&f=+WGe7R0lVEP9FI6tp&tS8ID&lXlWMvbI1YHmieK*g{l-1? z{z7jAa_GZq6Ap$V`=p46{CiCIqX}eaGUjuiIa6`mICmx{P4)(PlIma z(Gi6oR*8qhPMRNFBv1~}kR#!#=7*SZihn)kbMHImQY^F~P=plzwc1R`L^T9S#lo1L zn*{Wp!h>q0=;XZl@tyI8V4GOb!--uH3bE J_b$kn{{z8;n+^Z~ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-account-mini.gif b/themes/prestashop/img/button-account-mini.gif new file mode 100644 index 0000000000000000000000000000000000000000..97cc1732503cc709922d0c3cf31f9ea3446d53a8 GIT binary patch literal 932 zcmdVX3r~_!0DxgETUSk2nQa}#Y-P*V=7rU2>*7?*%+%HFYE~<1*0Q#?Rx7cS(ruuX zEfvKiMMMSRAc#OkkOD$PL82(|g?^@FNor(e^)q^Z!Mi=lDM_0)=Y|nTgh3L)Bj{$Y z$sKO)8qBHk&}D9}#wY7>)~m20ft}i@f7CKwszgVNP+b1#Nj7~+TKn<4=5l0VN=%n) z`fHU<8_x7+Kek@2mv6oDMf66OUtwd(l&2Z$yt45#+;44WLn_Uh$fqk;?@o`G zZ<1!yMtI#5mZ34Z)#n}?xGwOTu&?UAilBXOAGF%?>O4?_*JvzBh#l)|tGfGMyl*Y#-g*_>+sAN{bz?!GE>}Pdw zb_2JO*VGI{1g%0562k~-yR1X5fW#LsRj-*EA)1uMyX){e-y0#SA+zeZIYNPTnc zA?Io0&X~Lpcm})nHJzAHIGP)&VJwfz;vVk0=w^f_W_DJl26bxLa>%|L?>?QZ38p$oy^p> zX1fe*!R@-XmH{Q$JTGjwgzr>=h^V7_i2!>IR*gmnVIYnD>y;X=d;D0UdbiQkULuw5c2%y!tg!Uz6XRRFN(@BbV$8JD3x5jN8Ua$ zg0@ix4074j7>cEZrz<*qUgXEgF)HNKQ)o_Sb-GgVYZ@)Y2aHPP%nSlVM}dC`#X&_G zEJxuY67IN(&Jmq(>3)jy7D{0`i&kF7oy91T=%TGIqquIP5|-;uv>12YMeB&zy*LX6 hyPq5s3>R#j#4-Bz-=Y4&^5Ih-OVEpB34TPvmOnb`u(tpJ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-account-small.gif b/themes/prestashop/img/button-account-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa6aa735f88e7290e7d0039631648d28b2f7d47f GIT binary patch literal 1192 zcmdVXi&N4E0KjonW}G^YJB`cBW;>ko)w#Ka?$%XP4^3xzb91bkT9!lfcDC)fwsz&? zCnDNOK9GEcf`Et$iio1(3siiN+VC+SAj%uTNEB%2)}OKOU+}&A#9u>3e{ts$2mw+f zKql^d=YlC3lkF8yX=3FYVqZE=OW@muYf8pMnRkNyxrCke#5uAqtzsYj+_jEr(@@0H@Fylf&;b2T zolA9L69=<-{QV%RTx zBoXL;(ua1i3+O+J@OQuOOhBhj3J{l(KnboCUq&deKwd^fUW}-&sU_8spVv1;T#Q8e zwX{-cZFB~+y%lip?CR!ldwO|&U4ZMrpm1n-L^L`!2*AXWsp%Q%?A*Kr_-Juy`PE{R zQd%ZTq431U1a50=jBg}nW135ysyrWy39O;eW~zfzS+{3;+OEZT-IX?8>!r^(ME@!c zjH57QFRm7QoJ-^}Z@^>FOq7(@zRXCWCN{B(aL|OOJ(x{G0`C2@u>}0NBtCns7ro57 z5IN~y;TLwYBW+6R@7feTw04nQsE{&Ift%+CUkfmBAG7ojuZ6BpGK?EFt3b*{K?9z?jgIxI9Sf^vv^Bp?1|SEo?^E; z1sSqe^KDwrea|bC`CyORSlwP-CN4xxzK6AEfzkAKb$uRRr*6on+f}Z=$#XPK57q6O z=0D|jl}mwpsFni2FxnQpy8{lYK<$xuBh5*LC~#r>f?ZPX{(u(eghPyc!@kfW2{RA9;XC23$LbFA$XlDiECOjB mfuT`?Ov@PLW42}7E6T|6i~?~3t9-xDJ9v-y=_(Wg`to1Y$4p)T literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-account.gif b/themes/prestashop/img/button-account.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b423948697012304dedb9bfd32e2ac99d6bb475 GIT binary patch literal 1456 zcmdVX2UC*=0D$37L4rssM-Q@aCK@+{qjCc?DAyj5JQL~u zcc(KN^!Xe?DMMP%6{D%f*0JopA*PpHV&uaO_9QQ#xSHHJ30BMTJv`XMrJgArOE`kS zP9kdzl#$WrO^OQc>_1e)h*(V=ltsMKq8KKrt}PlK(^EUjt8S2qq8vCIk``sKFh;CJ?`gw#v51k@>Ow3X<0eG z;&mndjBoJ4y7~qpsgX>fHZ{}eG?YbKdk2%n=5)S!+tuCEje_*^_ydFQhK5H*$Hw1} zqmF!-{5Ul|Gb@^#7fYlP)Lx}Zt3-rrQs$N9wZN({p0m9TSU^ST=C%o<3`-Y`0|@n3h%#-0p>wGHkqL8;58TEa1D(?pb6E~( z=sd=`FkwC$T7z)}?P!YmTpun}{KQ|7AbuJk!#IIo8x`Wbvlea=Y>;iD?k3tzR&=W{QT8&SCffzvM^nm*Q@L*Pk~Bf0 zy!5^-+ZD7lD&^(r7VZi>$`({qU|e#bppCyuQHc$9S5_57g39Wm+c|FFu{4#EfJeKl zYO4xCRb6dO4*2B>;LY0x3fEmtqzOPZi6N_3H!^m{nkCbBd1xrzw)Xbc)k~?}O#>&? zn&#nP4=rsx@{X21uJ;MFK1ma4TSaJ(1%{;X&O)1_reUG&WOr(i*&^3N$21D==vZsA z1|55Ip#!-CfWQ_z&FzqjZ!BGji*K#HnMf-e1Z=5$e-v_QyXQbWafy2;XCa=(;UK#t<4A}r$vAq>o2A(u zf$&@&zY>+S{60FKv@E!u!b0x6ndP}MaSNBU@*#mhTA4(WS+HHHy`HO6X~Lw{>HBih z>dXTj3kFGtc&&+0cFAjV7}v(N`6u3N;%+R$%Ooj?N;XN0;u}q}k`y-59G~U2uBgH# zuPbW_jq55RnXQ3Pdc8I@G-2|FmLYH4SYYbdNT3tqy}8(Jm$JFk=Stqx4|qQe+8e-d p*fNesrED!v#FMvHrvA`vtprFYo?o;`a4DZmip%z0))@eB>ObMq-GTrB literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-large.gif b/themes/prestashop/img/button-large.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1a2bcda00ab195b79e323b039780b382062a1b5 GIT binary patch literal 2737 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 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-medium.gif b/themes/prestashop/img/button-medium.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf429515fca19d41f9a82632e11e6072ee5c9bf3 GIT binary patch literal 2521 zcmWlYdsLGJ1I9O*Fs?39AS41qCB^b16Cz7Qk*nmTPmAaisw0M0l%62;^l?#G2uP`b zTw*X_1IDf}#@NQ*-QL~z?tWp6aUU1seu+>%zvs{A{Lb^o@0=$t;aubg8M&|%u=Ok$ zAhQa@%0KFG71gbTUNK9crE}z^k6U~Cg*Y0hF$}2;BWnGSOg-4vP6CyKpu#Man+L=e zK&`Ai{(izNFkwn?t+F`WVw5DOUP~ATuQfbXfolUJZ()#!o+c;z#RX|3bSgkWy zx=1v+Qf(d@Gg|D`^;i~%XBZqen1_X+oXuBCWGaDJ&E-qz99eH4TcXejMY7*(n(Hxb z)NTg8gQ(FD0(_BqXaZDOySf31#!l`NW7-IEt-ZLkqNlfy+AmXT%!F^P%Hhj9dO#*$EmYci`T+BwRRI~EKC4&hhnWI{KmuuvHmO3(ms=h^ zYoC~M&{$HvX|Nx(5J)-`oCw9%M6h`|<v~+aS8B7*m0V=I(gT0R%X`(2V>lO>o9Ft9LX^~&0q;;XXgfZ60XEV zWhr?wiwrVh+Q^XBMCcWD_k(~?!4oOuDkF)?U~`3l)KY^X$~8mvEtEdKo-dU4^P!Tm zM>2()LI#UF7W9W)>Ckt6M#~zKzCW|?)SHFh21h!lKFfh$!G9^EcMbMt zk4YPndWl0laNE;@6U9NUF?-8KF2^v)BYd>?k^jgUlrgZr3xR8cQs_W@Bymy6D${oi@Nl z+R6)GO$H#2zQ=_fctRFn?)zjpn$QP39L;4XW*pf2&YM%=FCDifaF>&XytewEXQpwO z;=?oema43o_CG%^oIbF5VUN0#EZROiOYqESD)wiuU}uS}wV7EG*ZIgCS>SVXj?Bhq z?EEkXmR}sAy%7AoTX*H=^B&Xn&gXRN&$CDOYU2x?VL9ZlV^3LNTwt%e$^KXWg6POR zYsGMLp1m>IIp6P|2Ebt!$6?^e)exE+3VDdI!1IWhTi~PO!WIR44zUu$ud?qu)p0q5$44)!%PU<8j2z8A9)0o3rF<4&a0S^m0BiGZ{J^^@YIx&pg-V-K_6<>dzZPBOs2o(#s7Q2tJFa$9({M1DPL`59E!b{vp+f%^%$D`RjxczE>)em~-l!3H&tVEnQ&*b(6!>!yQgub%3O2~I zJ@)y+{e(N|`|jQ=a0#b)T^zT!9xHE8&P>$ST2|U3740cGZkI0--trF21p=2xJg*T7 zeBX=jxKu6GwMDJAUnuYR6ql&)IQ-Q2=E8%BB?_2vZv^op@{F4((Lk+TCEPgQnQD|8 z=*-owZ#>Tgq%1thm|OIF6A3%EMk(TKu9EUS3F$6LCZ7Kq8GW8`Z5>_)yJz>it3&Lx zzLtLtHA1aX5Uxka%*wnq8pgBhM%+X5H3avKJ&+(UAszk^8t{)nciqZN8nn-!wppiOG<{|YMF8BYe?yZJlzhL*fmC9_UOt@lCY#5=g8p_$Zmru=B!&M>ILeeN|U z-)L^+C3w+N?K;bGo|I>l+18lr?1ggDFPH!2g-C-r-POUIKfZ{Jh3o?`FLJ(1vVF(C z4K6Z;TG&^t43HgZE-3@+_7X=-cJi5DXLvUG~?OfYb akox4S-_d21vdrW$fA4VjEF=>4;r{>**|dHD literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-medium.png b/themes/prestashop/img/button-medium.png new file mode 100755 index 0000000000000000000000000000000000000000..061df6085f7d4d5f168bcddbe459e8a29e201eb1 GIT binary patch literal 1733 zcmchW`%_Z~9>wEewLmQaJ1W9b8Q4 zU}04dEU|`H5<=cD@_yZWb8~ZZZ*uc~69Q3U?K-$nmJTy){)#;_=bV`{-=DrSpF2m& z_AX0VokAj!mX+?KlqdRf!rNa@N@V^dXP!h#A{{wcQLIOUpb5X zaYSylv`I$fLM4jZeQdE_4-<$jsDo@jJYir~ryfK_O2p-lY5)sM0xJLl!ow1|-WLdB zHh1SEs?{~B0No&Bb9lmL%mG;Z?T?0H&n87Gv&$P$!hSYS^ziYJ+F;h3eFBk8qc`Yb zE1NHSKppPsW#HMKCvN^@vpnjUiEJASPR^h3p)OfhPrII-A4g8yk-eu*6cC zLIq$j9wgimxyI-TMxFi%+Q2aG4Dl5fBOVHmMs$Y6K0#wC2Zm*XTqTpI5Ra%`i6>)z zZ*bi04cqJ}7-+W3b+`&7e(Y!K0rQ9!mCDqFCrWt2tq+;FBghcw z`UZwIP~sS63)KK@Gub0LlLs)nK_hA=LVP)*Ho8C(Iriy`RCG zjK^gv@TZ?%Xbp%C@d{PA0rjIcFOAN(IlSxVQBFxB$qk1Z=nOwxbv!km?^k?!R*V28S;c2iqDGNYq{^FZ=Vt|4pRJkBY|<2qu?O z_EfBLK-khe*Eg$3kSI<`wUw0g@tmw!*mfrSx z&gPuV*>L#qRQOryhfU{Ce)DZo@f+OsKisIjKz1#Dzl57bcBkH|eh{yu&<}licjdc= zTvqwaC3nfh3tsgXiv@oXVO#zCDdH2`u}X4n(?0FOrEEewYhSyX%$Qn#DE4?yM_wn` zwL~!A7mB=H(Ri`-6?vsJxP`T=g(;n^Jg^p=ySeCrhC!YyTk_V^B5L=K*$rRi_tgrJ z_#N`XZ?ecczTbc9(NHt5S~&4yey$fybkU!uP71 zYnqxM<(j8+8K1J5t^0@%qN!7~}xf(6+U0)A$QhRCzcp_O+3?R^I(H6Nvc_diQp{0XmQx;pY*cMf=> z^X2oa+}#sH4OMgRfIGKL6}(+nH2vSbs+Kpw`cd=Gqi1(d8#VKRY|!=8&s~A0ACrCA zQ&lv-r?XPdPa+D}ADT%5lgpQjTN<0UoLOF;Os+Lu{#g2Quk&2|_x+0mFAitMdx7R# z17BP>7rwg@&FfaLIQq+)C+uu6<@`|Z(X901n{@MLerd^fg^j8^$dzpyHoRJv@>*t7 g?y353*UtR*=UiV_%jpdV6D*QSi_0k7!jm`t2f$}N-T(jq literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-medium_exclusive.gif b/themes/prestashop/img/button-medium_exclusive.gif new file mode 100644 index 0000000000000000000000000000000000000000..ebe67091fc99cb9e514d81c489298db815703b16 GIT binary patch literal 1860 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 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-mini.gif b/themes/prestashop/img/button-mini.gif new file mode 100644 index 0000000000000000000000000000000000000000..53cc95649333bee532014a719df984ef690b1c31 GIT binary patch literal 1877 zcmV-b2del-Nk%w1VIBZB0QX`5!OPsl$j*|Rr;eAUthdO##M8FE%!-qxwY$Zqv&Yib z-OtwH(be6{(c7k}ugA{Y$IaQr%-O%l+QG=xyTQ%9!O6M4$*;G?s$%w7AaD)R&y2k(i>|-sHT# z!q?i~&eY!2*4ozFvjb#>=g*v#6@B z$;;28rK+v8!O7C#$IslbxyZ7+%Z7@M!N<|g(%H$-+_ks4pr)+A#n7y@!OYX(%+lSK zovGpD<%^c6%+J@=+Tz5?(4?xgz{1AF%F>{!yQQwXv9q|v&Dy%d(VL;I=;`T?nW@6d z+MA%Jvbe*yzst3`!PD2?!^hCd(cQep*2>M(z{%Lb%G%Y~+rh`rzQMwloTQwjvAV+0 zxV^}^yu#(@=*`g9n4hSyxyiS@#fy}qnxChGjhwN%%d@-5)Y;+3(BIVA}4x5Ki$ z&c)8&m7ArkvbN6B+tbzAwz#^y!_B|P*15pV$ji{Vz|Pg#-_h6JsIIut*5IeHz`4H0 zxxmZ1zQwGvy`ZPHz{uCs+T@_5tDd8*&eYwwz|g(M)w8_Hw70##$JDjH&DY%IzQfGW z)7Zw&-O0|_$IjfNr?0!m+0WJA>+9^^-{8N($=BTC!OGdHwa2`|&)D4K*4Ww7bW_#m&OT&9=C`qNJ#GKD1ugAefVR>gw2~cbKW%b=ff*21Rvo- zW-b7eqezn~MH;{yGF*=ck|0z89KI%4vufR%6(6_?gh&u9g&-F@G)K~^UCUN28g{u5 zlp>gcpPfQJ^6K5omv13E{4x*}rRy89b2btyUd&kWIbz>*i6R(^mbi6na%kSnx$|Z= z>%`FtMR3;{N|WR{SqSLKFrb!8ig0pbE63z5Dm@-3LOIJ`TY#0|t~R z!K1(b{{Z^8Uw&iwqfa9T9Iyxq3^wTCgAXo}U?ci4l+cA35_E+aVx-c~haiS1;)o)q zA_f=XI0L{bk-Rg-i!jD0;}q{iatZ*>gu_KYDsu3}0!subD9=*9#cXp=<@$R?}o zvdLzlO$QUW@nJBZc#sJhH)N~rw%lqTm&~BQ?j>npk&iJS zIue34UEoo~zWny zMgtjf-Kwt?2C#Ycf;fN=G_z4VH0)Z<-PXK``3SjfY<(Ox# zIp)|Xpb7*N3|&kImAK$X3aF>9`s%6s;X)-H6f?9D9%z!xDnaC~`|iB!zDhEhcwofP z`LwgmA=wb2{PN5F?>+bF>|sI|u?$_u2LZsc&kO9g z@BaJk?*mH!AJj4QCKQwt05?$d@BjY*^dC0@P!0-gVrV3=z&-5Yjv6@dfe?(~1KnYd zdsu)3L%RSuEKmVy(BOk0450`?D2)nOfE*VX8U`+a07cva1~81F3}+a_TPOkn7r?;K zG=PCol!6XQ2%-=&he$*r(xDWiz<>t+!HP9#z!n+sf)}Jf#VT6yic*kb25g~$HLzl7 PNDHGFhqeVV1Oxy(%+EG6 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-mini.png b/themes/prestashop/img/button-mini.png new file mode 100755 index 0000000000000000000000000000000000000000..8035b7f2aa33f0279d8592432ad2a56a0d6cae2d GIT binary patch literal 1703 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 KU1IS^AOJf*fj%ez literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-small.gif b/themes/prestashop/img/button-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..998f601cadd10a37ec5b6de7f1ba990f011871c3 GIT binary patch literal 2163 zcmV-(2#ohfNk%w1VLSjf0QYGC!OPsl$j*|Rr;eAUthdO##M8FE%!-qxwY$Zqv&Yib z-OtwH(be6{(c7k}ugA{Y$IaQr%-O%l+QG=xyTQ%9!O6M4$*;G?s? z*4on5+q=KUyuQND)ZWa_(b?VO*4f|0$kD>c(X+Y3x4FI0*W$&-%h}!KoS>$%w7AjJ z*V^9X*V^9J+vJy=qrJn<$<5Tj!^yV3%f-jc#>vj2rK;1|-_6k1&d}7Yud~n7*}cWl z!NbO=s;;fH!N+~SsZO#nQ04%(1%5v%AT%xWkK-qtw~q)Y;?J+TyCNv#6}J&C=P- z(%Y!6xVXU3$<5Zw&)4DO<+QxXyu{Jb*5J_7*uKTkkC~~}*xRtT!>6yjxx>|#oTRq6 zy2#7Wyu;1D!_2w9#+sj}psKsGyvn4jxYXL@x4gyP-{8f~+MuMXtg^Pw)ZMwj&DY%I zxxmhcjE~07-NVeUd_6->({VVR|A6w%_xGdEWwM1t%vX5z=I1PPQ3VUZ1Lb(az(Hi zuSt^7HJMJmy7lYWvumf0PSPY^%?R56OSjEIl=JA*t6$H)y?gZzwxzR2klr9Vv$Q4I z&%eL_{{RLkAb;A-LdPKV5G05j!>ker4-iHu;e-@cXyJts2C~X9ZU{mUC;|wOM=3&- zXyS<|rl{hIESgwK9wCB4&>aH|P(leT+*pHz@@4I2Rbp$-@Q%*jC(3*_MFqmV`_>7ZqiaYU-(|raI~?#$=(31Z0Z;!$B~R+_J;1xaO+suDtf@E3UUd5)238kO_zwokUX1 z56m{}?6c5DEA6z+786M)VgN#BI9~+wNE*)NJ$3IOnYM&OF;}#Tp$v@<1I^gfIU1<-fe?(K1Si-) zU)17a(`X(wAW#Vgn1BW#450`|NWv1D@Pr{W0Rt)l0ctdF0ubnh0+0cO8rtxNILx6A zcgRB2ds$2!{aj(E(Y9`{(sWQ;=@<;X|#aNz|M z0OK7@NTebc$;d`J@{y2KSk08X(F8F=!OpbVubM@h<3esUkD2*3xR z(Y#GifE@u?Mha$0%Uas__2u-L$7s}9vIuxOe5XBiVpn-pwLJk@jLk6&b p1u1y+qaY2bNJmQ2l1hQ285n~GIS?{GVjcN3@kcNN&06S`z*319^ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-small.png b/themes/prestashop/img/button-small.png new file mode 100755 index 0000000000000000000000000000000000000000..16f58d0bb0604cbebd6670be1440c6479dbffd81 GIT binary patch literal 1727 zcmchW`&Uzk0mrk6*0MSe&La~QHGSaDS~9ng> z+Xj??fIJe25(tDqLLTIKliVaX_m$k-d-J%tc_IWAu~NlHw^kj0#lGi!zTe-zzkR+d z-M?p9a#}Kn!&z2Tm|wQAe_9}G>7s>}>672!a29b&_m&rcc*KDaE!~nU*ZO5z#N_af zn_axC{Td@AQNeT|>IvMW{85|=4-Cm+A`H7($i-Ta5QzAVpc?>Dy&08jA*sqftg?#b zAmt08WX$OfK$zd`AdEK8xP{OFm|TY_4KV*&pD!3|Y`ppBCg=m~ z1nTx#?dZ4}hhUczC2sUfy}`JfWC+qXB3F65EC5lU-8m>79Z`d@CxX%w3Oz#5EC^FF zHR$qAT;g5PX!W82nbL?`Ard7cYApadaEyvd#;jgHE7ia*4>O{%$&|qK?K`l`i<3c! zh%u4LcHxl05ippch3o!NBT58&`eZN>@w4%U_Q5d?(AM3r(Su48VFqm$*az4!Bh1?H zP`7B{s$jVL`iO8qWw29vlg*9=E?gE^AX;H?jTvy25moB!4Xu4X_NI@W@`om+qpCrf z+D)@AIy^Y4(^*N>9l$-z&8ca%2{kz=DlkEMgJy_q>KyV1!wRikA~)&n{&sX6LgqjVqPYOxxF5L++_1~^bWG&NH8)*F_Tt=2?S##%^)rxf_bbqr%0l4pd@I= zv=$t2`W+Z;at17LU|a`i%x;*BkEwKeD}F;f+$WLWnVD(p6wJ=vv)E888U!&G#6oT| zfY1{*gmyS_g&vj3RiXifOzR}P5fF0QVbbPwyFEUcLMK=104t<6!X2Vf7abLd$LtVh zu#rYPsRIz)O^uC%?ZUn@=gyBPl-xP)}7X9Z980!^%M*>re7Ctn!kQz_@(|WzfU~a zkVY%^)YbtnE$bjW`gQ%L7J4`D2g^?> z*KYMJ+LY_w?3l~x{r2Z?do;E!uPy#GcQS*^_2BejM41A&WD{*IXg@10Tpat3Wn z21@wPmS;faqr0SyMceKz*S~Y{BwPE7mf7j#L#c`CX>*ypv+(`?vzVX1ro43}?&4!B z+se~6lqAn9Xw6Pq^KfZ*Qg;5nI9vU8OPk7Eu{81H(hEuOy22|jFG+d8-?8_^8etYU z`wyoww(m3}XO2BRokEuwZwnguGw0E}tJm z`CY|zA67kh8A>hst|SHf8~61Oc)>S%O5ZAb5^0(odQV)>rP>SWZSxmjo#+4g>;DLk ztl%Cg`%8VfVcpQ9=9c2$Bkl&-F3_5JXlU1V`IphjC$EUZ ztC+{0-Q!zz&Ht*&qN&81CGGr-?M#iO;_@S@@z#7&Lh|{oX-ggV+2*&kUnJ{e{PyQ{ z+v#{s*P+}*{^Rv(#@qb9_uODcUKV9KaR*-|&irQcKf88TEk9CS^I6_ql3ZK4J5Y&F z=XP9pw4vn6$l|~6nLSwTTOl6weN?e+#i_YgBIRiM@%70~lC$}@eYtsTvH0*i&t7_H XHD6x6F*j+!LQYY^{`}Fr56}M(R%}P< literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/button-small_exclusive.gif b/themes/prestashop/img/button-small_exclusive.gif new file mode 100644 index 0000000000000000000000000000000000000000..c56c233610a558599445a230014b84c635e8023c GIT binary patch literal 1507 zcmV<91swWENk%w1VLSjf0Oo%HWurlIt7%=9Lt&~ocD7Smh*M^+KwYIXf4Og=!=!Gq zRIAUUT$wpSb~t{tb&ji;V3|j&%$;$dR-C+?r^%C=x|3CeOrOE3N_$C4f;n!bVR5re zqsE)3%BGXCkdUpDYOqN{d@59nL{*M7QinQSl0AB~W0tj=eY$0vyNzU>P(FDiZmvkK z(xI=@n|ZigQ<*D8f+m-?j#Gs~OpPd^!I4FMGHj|mYBAZrpTaMkW5a5MXAlBqr#F#c|LNlVPKJ1WtduOtxi#sENP=xZ>wBt zon2OkNv6q~Q41ejC}%sP*DK^K$Vu4n39SckPzC(N`^KumT29|wX4^!V8eEe(I$fxLRM{rAi}n- z+qZE4V#v|}iQ~tRBTJr4xpL$NSuiB_ zlX-E2&!9t#9!c2p#1qG!H@0RxO3~?&AYd6KN9|w(2yesg5$`O zD__pMxpU^lHI(p^!@+SB*t2Wj&b_<$@7s?%$YI-o4ihiZt6$H)z5Dm@+nX?u{+@OJq)}RBxk3a?~`m}Xk32x%~C zn;Hd(Ap!}cmTKy$sHUpws;7z|MgeMkT0p2X)N1RkxaO+suDs&?YH2DEAF^_MDPa|6I@V79UZjm?z`~D zEAPDY!n^JT6JWuIx*c3`#R32aEbzbt7i{ps0sGrQ9T#kyKpp?KAo0W$S8VbB#TaK? z@d8)Wk$}TgT(Lt7Pn2x($tb6+^2#im+`_~e%#{uFrJ z@j&(ueBiKtR>;J+301Ti22S~sI8c=}xYu_BsMXm-q@PXgL J!XE+w06Wbx@-qMc literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/flag_new_bg.jpg b/themes/prestashop/img/flag_new_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a5e68457e7fe155d48252b19a25f920bc6afe7b GIT binary patch literal 359 zcmex=C5UDGKfoZ!!NASH$jm6nz$D1XEXer(2tzW^ zVL&$`0d@|MRY(F13~U^n0t`$H>?ndPm#3(Priv{S1cn7OC$bbHQ=szV#EBOt1+$2x zi2lFDz{AW4w2@hm!Jc8`clNyZej6oDz7u<;zt_Y0X5H$|dWyC7(wF<6mcC+2jSTpI F695XxGll>F literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/footer_account.gif b/themes/prestashop/img/footer_account.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8126d010f3ebc6304593f6ab5fe460ae863c113 GIT binary patch literal 243 zcmZ?wbhEHb+|R(qaD;*3|NsC0e*Jki>(F`o?rl0nm%Juz(=J+VSN!wYhs_2>tE>xG zTNf_zC_bTBxzxS*m~`pofT@>#Cm$6nTI621$fIbnXE6g_p!k!85u`u|M1bsMU@drX zI3y)=UdF0*Ij{E>=$zm3#^h+=`79%Twgx(CA9mFEt-t;L$DX?L?|=VqsNiDD%FbpI5bEmg>Fw*EFmcl4 TDO0CSpD}aRB*B<$MFwjCY{+A8 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/form-input-bg.gif b/themes/prestashop/img/form-input-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..5aca1c7241e35fe56fed3e5eece1d5d5994fe572 GIT binary patch literal 93 zcmZ?wbhEHbWMmLx*v!Ci;K0F;pFY<&G<^B;_0#7sSFc|C{N?NCFJC@?{=$F_DE?#t a3+sSLkQodtTmcPC5UDGKfoZ!!D!6D$jm6nz$D1XEXer(2ty{= zVL(^H0W%8|7t}Ji7|;_;%q*+|42&#Hj4aFuaYn&Jp$~x@3mYdc{KzaU2-62wA;_pG z6v&iVsPz990}nGJ&|YRi2789L#h-tDX}|FGSLO1ji_Ha8N>aAV9CCNO$sI9E-6^krCLOYzX^nBBqwC4vSIZZm>v+dgFoN`}j@)vO#TlEs-um?H29~3;$ z*`R13?s@L0JJc zd(x{rtkY^{J&J!|eq2SZmUZ#Xw7)jJM-RPVcG~3e+Rp7+-qwS+xFtWCt6tk-tuoEn Jv}w!#n*h!TfA9bR literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/header_account.gif b/themes/prestashop/img/header_account.gif new file mode 100644 index 0000000000000000000000000000000000000000..082590bfc568f2e82e548f6779bbd436beff75a1 GIT binary patch literal 1231 zcmV;=1TgzYNk%w1VZQ(w0Ok?^^s&+LoW$BYi_v_f`Q+}`oVe??&iUTz`||e2b({U@ z^8NVw`}g_n)!^%Dr~dl={OX8QId-luYP2+Ps3~Q~M1lYR|M~It|Nj2i zW1;@|`}b|G>sg@s@%86lpWZ`|l`{(iKxX1U+wZK~vUs?U?J=y+A^8LW000sIEC2ui z0KWhk000O7fD(c&8-Ip}h>41ejE#9d%eEDz`?@9#Kp$P$jQpf%+1L&9uh4AdDYg}*xB0K+}+;a z;NjxqU4;@HN-vWd*b@B4^^!4`l`1$(#{Qds_0Qos^vZTWkDgaz0>7tKDAsKce zN}NcsqQ#3CGiuz(v7^V2AUAReK)}To2N3}<5u#CsAw4i-%A85Frp=o;bL!m5v!~CW zJHbE*QUO5B2nr(TG<2t_)2C3QN}Wozs@1DlvufSS6>EqC2R`TsaYqW0HeRk8io>?8 z+qZE4=`S}-Pr0X9Gk zY?6@MP>Sc!qf4Joy}I@5*t2Wj&b_;L?5PEXx$wZqfGo?g8=Awuz5Dm@iEO09uyrl{hIEVk(4i!jD08GHED(a}DmTKy$sHQq<7@MFmK?5tC@x^kZ8bZRYxaO+suDtf@>#x8DE9|hu7Hcf9 z7Hp!%1Q|dfMxL7hYls}wR%`9G*k-Hkw%m5>?YH2DEAF`6UahV-HE!VEX;@WT*CEb+t?S8VYt#TaL- tvBrk*;qk{Hhb;2QB$sUR$tb6+^2#i??6S+3#4Pj7G}mnN&5#5F06Qe~#`FLH literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/add.gif b/themes/prestashop/img/icon/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..df08c0b6b93e51661981722c0f8514a8bb2748af GIT binary patch literal 598 zcmZ?wbhEHb6krfwc*ekB(`vH$=912x71!Tg%G(kVH#>CJ!D;{h|KELeXZ6nHma`Qn z?jD|VV`A&Jg6AKedh|J_uL_!ergPH1x>Z+Z*X&NsKajNa#QeRFw%&Ys(SL?R!vOo@`xmd)CzbO}%HD9eYgAJ~+Pg z{M4o`xj|EXcHLQ5us1Gwe#oP@52s!2N?8@M<@WM*_m@^4&3gas&5;-TPd_`f_3rB8 zt;sbzvU>JbWv-5L?zSr19Y66%{j}pPJ=a=#j#ekk4L@>c=YvmouD!q3dA_D+YjN0I zm*TbA41*OY{$ycfXJBX00XYy9Ck*VH8`ztgTUuMq-PCz?n5323*d>ItEtxI#Y-F@r zB~Rn^o?Eo|kuo6UtxYZgUDO|~W_8Ji57 zZ309ao-()h;zl^7pPXXjqjnY1_pq8(RMV|6jV`NL0&8r{qZ~6E}y|JFGwb zsBPV)u$KI5cb|urES$3EO2@pt%l6K!TyWScd&<-2ue*1rtU380w0r-B>koU^pNsEW zXBj)OaPfi6Imc(NJ|5JqUbXmKT-~ac6{j{|nc`5Sk~bx`f6JA`#?>W@&t%NpzVyiL zo~_C6-@kwO=1c74gY);@%AGkerpd7EzxW7DmqwPh;1Map3%* z%ruotA(LT+#pA=rv?j26Q%v4k&*bGcO?wjkw~EHiw27Wz?Yl*&WNu8#TC38d z?qO4m+KwisPW3EZ5xM+USM8pNW6!sguZcMFY-8`~%%)?}rH4IdU##svk(agEF?ET< z)YD}N(;c$s`(@4W&zSF#zsa+5dsz4mh4M|IAAY{R{N_mGzS!dZ9_+IMFKZj;Dc<$d05c;p|lUwoq_WuM{q-(Ny^$o~KTpJ5~F7U zYN}@+B?k7L*o w#Kg_26wpvp@ZbTnfJ&f-K~RwE!5$XQG>sLLS}rb-H4{+SurYb!0tW_b0B$(HQ~&?~ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/cancel.gif b/themes/prestashop/img/icon/cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc4c2ce83bf483105c8947cdc9616d09989fcc19 GIT binary patch literal 614 zcmZ?wbhEHb6k!l!c*ejGQY(-;LoQ*0RMvc@+$E~PH3E@sqT$WL$x~!9<|w4kR!EsH z7v3c7mcg1dStf0keBwmuvNZ;QReZ@)WdkbsVtXV!b2%bgMRFD?_wNmD*leFRQ$D^= zvTeJ2)*RL1RXQPcg8t>adCOFzJH)Ein^mqeX;|+R+8`9xD3rfkEn|*i=i0EMm0A(4 zB1MZ0Tei5aIn^BBFXdmxGviQlM2kq?0?od)aXv-dc}vuG9$nbE&2PfKu#CBi(+?%| z>f7R`tD%sWApGS>247lxw2-2B>Lu?apVbc>=J!a) z+Vn)6c-F}%#m*$rl<@G#Y+iOFqlV`!E{x2rTqX=3o+&m=X5IIJo3T-#l}$l0wB^e( NN4{AW!mLaT)&L$F(scj; literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/cancel_16x18.gif b/themes/prestashop/img/icon/cancel_16x18.gif new file mode 100644 index 0000000000000000000000000000000000000000..64a59b287a567aeb5718a0819acd66ce7441e1aa GIT binary patch literal 565 zcmZ?wbhEHb6krfyIF`>4QY(-;LoQ*0RMvc@+$E~PH3E@sqT$WL$x~!9<|w4kR!EsH z7v3c7mcg1dStf0keBwmuvNZ;QReZ@)WdkbsVtXV!b2%bgMRFD?_wNmD*leFRQ$D^= zvTeJ2)*RL1RXQPcg8t>adCOFzJH)Ein^mqeX;|+R+8`9xD3rfkEn|*i=i0EMm0A(4 zB1MZ0Tei5aIn^BBFXdmxGviQlM2kq?0?od)aXv-dc}vuG9$nbE&2PfKu#CBi(+?%| z>kSU}0XB?8zjT10#iW;b1h zyi_J{Lm5ZDwrKNMIc4P>e>Qf;Rsr>TX?AuV4Fv^OwiZ@~dNvaV2G)Ho9E^zqt!%yj OA_}H&P+aK1U=0A?De1WY literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/cart.gif b/themes/prestashop/img/icon/cart.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1e1ab4e55faabc7435c8525b767b91f924a5e02 GIT binary patch literal 636 zcmV-?0)zcWNk%w1VHW@r0Oo%H4Gs-=d2U8VMP6Q4A0HoFU0>tll_~?#0E$=H}+&;^KOGdSPN&U0zj>kB+OXrc_l> zO-)TvQd5(YlZS_f9UUFu;NOCSgexp3#KgjdhKO@>bGW#;&CSh-h=+4@Z)9X*)YR01 zf`V9CR2Uf!M@LEE;o!>3%W`sYU0qd6OH04MznGYqFfcGtQcM+Ab98BRb!uQ?Vr6Az7Z(;*S5Dg7+5G(c@9*#W`ug79+~42dk&%(J zv$U$Ks90E7$;rva#>R1Sa@g3|g@uK|!NJnf(tm({NJvN}CMCYUzE4k2T3S|JUSFA+ znKLspQBhHMcx|Mlq^qo}Iy*U~rKEd%d-nGBHa0eokB^IsivR!rA^8LW004ggEC2ui z02crf000NsfPaF6goTEOh>3!H1UM0jiDzUzbcK5ce_NP;1`vM~O@wL*a)Spv2n|07 zH%kapC?ITw9tkXhT}S{EdH_B_0ApzYbA}u{e+@MjZVy*BQV%C4Z+4G`6<8TX069Fyu7BSrl6ppm6n#0l9JBO&YPQ?;o#x9xVhru z;@{uj+S=ON+uPRG*4*6OI*Voswva-s`%I4FK|~zsAPK($dn=(b47Q<>KSxudlD) z;Nafh-k8)32_s%G>+6q?kI2c$%*@T&+uOs!!?(A$tE#K(>+9p=K|i+1SIw#NXcDy}iBY=ji6<=jZ3>=ji9+;^CvCqvGM>)zsC8 zh=|qI)t#N4kdTnj&(P%Kgnm~>g(!+g@ufajNsqk3%JeSVG$5`2;m4-E_xAPyNQgp7_Y3od+2k~w#mKMp)- zgbJR13y_k0l?)pfAYz=0UyYzwe1m&MX%iO?KuxW#2#ziigL1VKUji9|jIm&>5tMqy`-TD&QfMWd)xqHtfu?Fet)@8b}0q@$iC> zAD{+3I?Rv}fkvDVNCgbYbAUhrLLkIhkP+p>4H5tV=pFOIuaFpoh@3EyK*N%(13Y-> STY!w47-8B(98KC#AOJg;lc+oZ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/contact.gif b/themes/prestashop/img/icon/contact.gif new file mode 100644 index 0000000000000000000000000000000000000000..72f1de6e63848b95b668c6b46952841eefdd1123 GIT binary patch literal 616 zcmV-u0+;`Egwt{ zJ3DA;X~o6GTz7oFzP?IKOp}+FLseNKCMMX~*+*n+Vq;|P@9!fcBO4fC=S3z-oT!fBLP*4*gBqv^LNR6Hi4GsVQ{{R30A^8LW004dfEC2ui z01^NY000NYfPR95goTEKBXL-65?P0YV|jg(eF#4@hhR8!l$}>ygij?Qls*pxs48Jg@^faZt_7Yj^OP|!eupch2Q ze7F!GfDtW10?1f1#7+P~EAYtKLvoLRlOWeG&|oaAH<-KIHDfQQMjPHk1yo0;pD{+Z-peR!*PvpCP%$DRxf)&S}mA1eR= literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/download_product.gif b/themes/prestashop/img/icon/download_product.gif new file mode 100644 index 0000000000000000000000000000000000000000..f25a6121fd061b816c3b7ca9263e0973ef24ac1d GIT binary patch literal 580 zcmZ?wbhEHb6krfwc$UR5Z{EC#6DQuid$+f@ckS6JZf(_({6Am0WP+eWU z>h#2wD_8pZ`lhC)c64+E1_l-u7JmQ!{qp6@ZEbA}k9Apea_`-{ciz#CwQJW-KhzYz z(AlV6WX7T9jHPaAOFfbnySepAcJ9c&apOkxY|X~T#_$;$NplTLR{PJMJv(*2Va@u` z{H3-(fB*RY>)VeXKPK!c$zE*kK1Hu@SN?_#8-D%yx$@KmS6A1{%F3lDde^O6H|=1< z`Sa(qv$H>b{CM!-L6?adhYlSoC@ARe?p|?vLhH6HmkHuQGnA9(8~*=lqpk= z96565&YkoHCR$Bw_wV1At7i7_@Q9mlm6@6O=g*(kZE3bWf*a0Fd-39h&s5{4t?4lf zY#KL5B_<}GJ9o}&lI*Qpw{G9Q-LN?^caeonujr&nlQwPIwD5RW<{Zoa|Nk>k1{8m? zFfuS?G3bDd0mTUe`@)8-rskH`w)T$Bu5KYVW(MZ~yMAUip=Ndl#z-c6M$JSfA4UfD zCQdG8eqO#b3qD@{bS};&4iRDfAn|xd$xJO_5soGvK^s+bRsjK4uUIufo+hRcZxbt> z6hC!sZVg4>rqHA~TPMQ^7H$`V3^}oO4;Evku;ggj82>gEGfPnek&7P~JGh7_0#$R^&|p literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/error.gif b/themes/prestashop/img/icon/error.gif new file mode 100644 index 0000000000000000000000000000000000000000..8167058157851354e175a787ca05731137de8447 GIT binary patch literal 1391 zcmZ?wbhEHbRA5kGXlDQcPBAfFK|xIo4S!CKSb4c9Ev;A^n=}T7G(mw>aj|S!=^{pk zB5uxVF_8il_hMGi|#oRgKh$IpFDi0`Vb zoLkJsUts5|a1_aY;Xq$Hh5OFLVTf3&LNYDL+t zlA`C%4ljK?pT|VK4G;Mi8vG+R`bk#i^WviaX=(rSa=uno{FC|EG-2X|mX?__XD;jQ zUD?>MdgjdSO^vHot=hVE>)yS4cON-&V&a5T%a%QDX@1hx`DV)G&;5O$X3luLZ{PQ| zYyYoUe*ECUGiT1+K7Rb#)vI^!-u-pt(9bKEf8M?O?Afyy-+z36`t-wx58uCk|M2I} z|NsBNkuXXOOb96cWMO7th+)tHSr5t+3>^O%c5=vgY*=uxnM1fpP zc&7=}D!F}OR_=4x^-9TT;aJvrTsLw{&jw>5#p7MMn@-FTTKv?}K;-5EA1Bw-U6y8? zzbZGT^-5`nS!_As#OijTF(GS3VDZvZQ+Z`pL=*--TPZK#KhI&I($ljNyiRKZ7(a@f z;nDD&;xW^x(TP(iXw?pZ9 z7>@K_tYl+5T-taN>Trv3kyGY^i|-rVB* z>gw#5o4rr;+FxB7@axI?-*=inKfikWP{*Gi&+cq5|9G|k>G_HOAI>^4!Q}1Hw*RlU zeSdfH@hZy~d!24>OuoCb^1`&Bj|W2U%`?2U#{cVu@~E6ks5&HDfC z?uR{Ae|~=W|Nijn1C9UgPdPW+?#Jyp-{0SPf871Uh3@ayyPlk!dVO)+smX>9ms^kb8r|KI@%G-{|DVp?+7|lr;mX?^6Ys6HdV6!p|F?S| z?63L%e9ftT&rjE;TwDBg4ekLO$8Y&HM!>G{vY?*IQkd%7<4 z>-oCt>wQm5wmLo4;@{2c7yI0=uM7Qur~5>&&b96NpYE>v{{Gs%lT)5-D*pd?-jfY3 zA0F-a_H^IFW%f_^!pP2$&!7X+0g4j__InNaP0dE^ zoJP%^%{m?~-0acZI$cd!1!BU&Dg3qxtew)FoYHo7&dR2)zHV~N`C?oi(oShY$&R8? zhOUx)@?2WdqU^Z|G17rj`iwRL7B0ep{2@^)mi+eOi~%g7vB4JuJxx`45);Ei4 zUvzdprRcA1ENf*YDG_~lGQ!F+st?d|RB+{bXVW{{AO zq@<*JKqsuMtj3d4;NINBjZ3K3q2l7=o}QjghDeudR?3@VvV>4^adEqaJH(JpUZho` zbw{~-Hld-Rqi{aMoM+|p;>4F#Vy{_Pj#8FnI?$$SeZO)zb~CYnL&lL%!iz||emuU3 zLS>s_ZM0&?j$uxpa72MiEnc2iyMIEifK9uNRcUEy zx`R8skyW{cJidiLw1YuPct&`5c*mu8w|6zMj9jF_qL0dijEsz#nVH6wRQC4vq{yJb zh(~mEbiJBubGd4Au4-F#Sz?i1yNN|xidm_tspH|_(W!2xc0GQ)cEZ=d@$vCKdpdi2 zdyR{Vetv%L?(U|hrjd`0=H}+clTnC=KJU484K9P!jJs}MZ0tF6enu2`-;egCtjitMRk7H1~y4qHYOP= z3`QWx*Vk)G2^|)H88LTXeqsXyR(=q3Nb7?eaDD?_dM?--fJc#p2!7;{c%i^viVA{c z1OZS(O9VO`>;#A)f<_rIZ^&rC0pv^t1!_D{7~y8i5f(WBEcsEz%!L3HByf2mq{NRn LX(S096bJx25jZS} literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/infos.gif b/themes/prestashop/img/icon/infos.gif new file mode 100644 index 0000000000000000000000000000000000000000..12cd1aef900803abba99b26920337ec01ad5c267 GIT binary patch literal 778 zcmV+l1NHogP)BVme|mWaqy4$_pJm?y9KM{-*hp?1+Ey3e-CEDooTa!B;e(Q>TSF?bj>5At13y1p zriN3w3x~5SfZj{@J4M{kp{?=M_Lh2bV+5LH)Q)5W!-ePA$RgE1@5f1cyHki0Y}JyVEYZF(LD$xXlt$7A5CgE@ zpV-&l%vf;=5kZ2-2gi@Y6J&=cuwt>!vJ^#(&n|LcZyUzi6Duj$$hJ1s*HD-#;k-w@ zpdrwAuoDG_N2bvb07G$Zk*?Hc)JLtW4yqOnic_$zO7NZ#l>Fm){;fE?b$IbOaX2fe z0la4g0Dfw2xk7Wi7NapVD8YMPCZu?A1QCK*67dgsvRKBLFtrM>?$%&_lD1882mzdO zWPdw5KWw6IT`m1b_8=lS5jt8D3=RDa=&jWzR-)S@56WMslZ~mKu1)-wpXB>rNBQ>N zU#K`#1B&v|_AQK;7I~B}OdGiUT9LX>f0xm6<;LeP!=vFjPsUQF*wCJ*dO)4YBypgdiuF!=i@6Zyi7F|q#K zz?tlSZULa@t1D?$e;f@b36&N!V2mjOHw|*0fhcXNk%w1VG#fi0M$PL<>lq=?d=sA8G?d>Vq|2>(bKoSz^t&bN>x{xot>Pk zuXS~H8a6y5BqS9lDk@T3EH^mZ+}tWZLuqMg&d<+HO-U3m;o?R`MpI{O zuCA|%l9eDzR1FOc%F4@<0 ZLm34H8AL82AtW?-L@X*iE!ads06WbMnQZ_7 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/more.gif b/themes/prestashop/img/icon/more.gif new file mode 100644 index 0000000000000000000000000000000000000000..072e49dfdf1ae1537b0fb5d27010b97ab2096e59 GIT binary patch literal 58 zcmZ?wbhEHbFTr3)}W!Hr>CbwRa#G4T{2o^IXgUKW@cewVqaoo$jQma$HzTNOfWMvgM)+l`S~|G zI>W=mY=MSgi(WP+P6Ewz9XmO-oGT;^M8Yuv=?x z=kD*x$;!&h%hT1?!NI|&r>H7EM4g_VpR2A%SY5=##P#*{-{a#rIXPu$XsWus>FMbb z6%|2EP)15hf{u`6WMqVdgeD~>)7aV?8X6fQB*@6fCp9?U;NgsojXpy}K14*An3#u% zi5C|b?eFh0F)}eYIe>wKA2mAo`1sDw&J7O_%gf6R4h{_s4gdfDA^8LW004ggEC2ui z02crf000O7fPaF6goTEKFll~^jE#+DhI0u&T6~t5n3he3ejkEGCwiizq#slOM}vMp ze?t`ru(7aV5D>8xW`cb=TNi!5z`=7B!CitFIUp2!%+1UfaUfuB63h;Q5Njb80uc^0 z6A}VpRfJap0uzD=INJhaH8)-n0zQR3I|2%Vb5SA(0S+)=V24BiIEEAicq2%H6cHXc z*jYhf#Q_c;+7Ozeh64dXXFAYf^Pr^3k}|jmBBGm#VZuNI4M>qTF!BeD5+*2?sKf$

      UHGvTjK7Wsr#kHVO~LG^Y+3VsVD58V?{;11XIJoeU;DkO^@3yTZd&^4 z=lHas_K9oeWmfTeU-N!p{nyUrVpZ~~pW=+mxT1DlHpxa?wE%7wWarlZ1k+5{p{)Uucq*yj_se7^qGX~ zucGUTeeue{{lm5Cf@=Tn>*;-H@u-{j&c^4Fh39Nt&RtC7VN~O0Tk?Qq_|eGk$G_^0 zd+wl>hkfy#koAst_`b2xVNlLwPWOy;;dETkSwY==Z~EEO z^?_pZjdtB|UG95f<#Ji^rJ3xDf7ozY-l3K4fobD}b@%7v_U7X0!MNaaVET@C-FXglE-Y zNBY0A^{}J$glhS@rrvN_@sonoWK#H|iNjPq;iQ-Fw5b38|NsC0A^8LW004ggEC2ui z01yBW000NVfPaF6goTANFhM4DM@T4!e-K|{A`1%@Gg&-^5Nsg_7Yqz~L?Bc(gK0~j z2nc?D4+3^RObUW?Wd{gQ6t4~j1SL`}f>9M_6tS-a0|0m=SAtU*aRR@u00{wMG);mX zA3MMUPksRw1vgb~f-x#A%?U;+1q~4{HcEnhUT)eJuOj4_AR!4KK??48pi^(dh6y7i zfO*4Z&(;kSOxJ~kz6%Ik+|&Y;bp12O~TCkD3J2c~{tu;OTyX#AK_F+*)q`@)|lo~>-6DNK=b{JL|m zH}GaMNqH^4XqoM$n&aluq492o;DI2;^*ov?($buALw0kBqv5E_`Pw-yQ%QTTkcp}G&{?)=VjN2GD_O0gG*2_3=*bG%do%N}U%7gXo!N3#c-?cKZg#;nHh#4Q2fclD#F0TpaXI{C{7sIk2Wwh@rbpy zwX!#LF$oC>_KQl$af)#^Nhzpm>FVkm7?>+Ea7s**)i*Y^w6U?ZbI@d1EXJx}WMXEu z*4ExxPF-C|j>p3J*zseIti1d}XS)P>czHQ>I5~NE_<2Mx+?b}#&dkcm%Pw|-os*f% zP@L&859^C2LDo(g7D*ANC!a4cv*{E#Ha2mKYnbsYP*-qr5atu$;c!Se)KUMHXTk}F t^$a_UrYxxaVep_~R}PPgK#&R}!=6I*t!qV865A)twkUkJLV$z88USl4vTy(Z literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/previous.gif b/themes/prestashop/img/icon/previous.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa59060c9bccb2fe0721e1f4caa25cf3a34c862e GIT binary patch literal 82 zcmZ?wbhEHb<{9 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/quantity_down_off.gif b/themes/prestashop/img/icon/quantity_down_off.gif new file mode 100755 index 0000000000000000000000000000000000000000..fe6de305e8455ec3fbe2a0ed9ec0654b4ada4650 GIT binary patch literal 73 zcmZ?wbhEHbUCIA2c literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/quantity_up.gif b/themes/prestashop/img/icon/quantity_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c2dcce602544ff0380b1fc70a804da47b2f259f GIT binary patch literal 73 zcmZ?wbhEHb1kb?=;mn_BkPUVgR3?qZqi zh0M4W>pZ*Mnon<8cYWg7=j&EpIGla4|LXgzWowH9mfk8nnzG{E$*vRE{bsvouS&{X zakT$p>zpIAYAzPdzqCJX_wLQNj-+lV51hH9VbhVc+of+lzbQF+I{wDe)z_C^es$sa zi?vNR8qyX;Mz6b-HZ?MJ!rwZn-x-b@SP-Tid5xzP0TBnXG;B85^!o zI9@sBTzAgl&H0OSijQWuZp%-Z*HCb6X6?b^%qP9NO#OGUeG6~Q%-wx7 zV6xBB+gBaCZTk0BTz-3Q%Fz~vkpvWfvM{nU%xBO6c^Z@_7&!hj*mM5*qSndIEheWr z(_llQ7I#Nc30I-ItC$|IeWAjWltbE5O&>%$8M;p%Ftb|rWoAN4sHCL?!`+)r4GUUb zf_P?T1wHOk_U5Z_IKiOKIn~u(@5Bs~m0TQ#?q|+KIv;dya&quGS-|qxrPHEtnt|h% zQ-?&v=5Zu+x*X@?V&$&MXqa$(4Lj!?rJWBJuW}b>V~%pz@R7qwBgDU8M}gqdNezO{ zNj!>&pB~gy37GQ0BDhgxwqRmRpwD?8y=eaf%;bb9~h(8g0C&8NZ|&xJLg32#0V)_OX;?My`T z>4^3-k?m(<+Rmo;pUj+cId8_L!ue+lrd}?beYs%4nc9`t>epPaU3qIpvclXft$8`R z3-k1rl$tLsv;OUVdv$}?#*WbKlalw$%0JuVd#=y#{KSCslLBr}b-Xjx>CQADa=tU& z|_?yRf0vmxWortG_$bM9@;zrU^E?xyMo zJ4+tzt^9DMv~lhA#&y>l*WPGZf3suvtH}r7tiSkq%jK`TuYcQf^ZUb{4UhJ>+H z*^!QC$2y;%?0$K=@4?BbFV9YVd3N&aOEcbHoA>#4!~0uHA70w`@$RZmkJf#9xZ&@+ zt^eL{J9Ovgp*z2h-2Hjv-p`}={+zh~>&T;D#~=JY_2Ad($G=ZM`hVup@3W8ooPGS~ z!jnH2f#~VqOHcn?diwv$v%goL|GWD9|F!3TuRs5P_vP1{FaO_u_5byQ%kQ4vdi?&^ zllQ-#e|-Pq)BEQiem(yLM1Nm={PptV?^mCGzXqbuzg~R$^YZiG7oY#V`uz9J=Rfbh z{(k@M_uH@k-hKJ|;oH9t-~WI7{_o@W|DV49|NP_k=b!(+{rLUk*Pnm?|1*qup!k!8 znSnu`K?f8Ppgh6A@t?uICSc0KgoC_H!dyNoO3v+OX=k=PoRG*O-YR!!MdiU~Cxy-Q z4)k1HU~pJUT{mJ)z(l52UVTZgWtp2)I45Za>cy;3NMv9QkvEzXSaiglUt^^~=B_Oq zLZTeYjixv%v3T@r&UQOQn6XSW{ig=~UcN1mUX?Zai1GgI+# z3n%wtK1Hh#4uN@roJJX)jEh+~x#xszF1!2Ep+m{1M?kV^;ly{>Dr6)bm=7hivCmeq do#oOQwA7zlglkR%g98I2;~`<@0s#RAYXIpN-sAuP literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/search.gif b/themes/prestashop/img/icon/search.gif new file mode 100644 index 0000000000000000000000000000000000000000..e32a989f13c60bd75cd71e7aadce57f2e418d148 GIT binary patch literal 662 zcmV;H0%`q6Nk%w1VG{rn0OkMy>+J0f4Grq*?CI+3>g(+lCn~nLxDF2x88tk&z{4qN zco{Z44Gs<&H9Nt=!yzFdp`)cuQBzG#P14lW93mqU93H&E!^h6hD^pw`N>oZxRJggi zeu#>AczJE8wvC{rOkrhRWM(H(TiM#%tFg1k$jP?6zs=6iB_$ht8bLroadC1^S6Fp*ch}h2)z#O&zrd-ftHs908X6jro}$#<-+6m`y}iF8A|hK` zT$rAqDk>_du(M)eV_{)pICFrZqNGh>XP%^{AWBmsJwwRO(bLq`yuZPtqof@;KHc8m zMn^}Dk&`JZDrI+kXlQ7FfPrFjci!OQsl>}eLPVdduRKdmbbf&l5D*j;6h?fBBqSwE zOG~-ByA&B36%`e_$IG*`w9CxR+uYvg=;|ynGAL16uCcQ!IzE1gixU+VMNm_loSkWF zZRqLi@bU8S@$>KS@$BsG?(gyK?(gX6>g?_B?(gvD=;`tD^XBL2A^8LV00000EC2ui z022Tb000N`fPR95goT84h>3_aFkk@zKr%Clbd{ELW)A^jRaH;{C^eOKq@^b~Qevfc z20af;c6hS0K3xv8vpfMqcznLTBVH`O#C$Dee0j>s8w^d$(0OqTd3)B@1_w6R+@MJwy~J_)obmV8elTVc=F`QvuDq)UAy+;#fvLfuADe= z;?=8Hmo8n}w{PFkqeu7d-Mf4D?h6+#96x@1&z?O;jvP67@ZjOYhu^$;vw#2oW5wN_}=Sy<$SFC$q^Zx&Vscy-a zH9AZlvua-U5aU+!nd}&`RIm5&0n>y?DX&DEf2&NUHCE;NWiouQSkQZk<=qd4ze`qf z{A;MLkzi?UZK~mA?`H4llTVc=F`QvuDq)UAy+;#fvLfuADe= z;?=8Hmo8n}w{PFkqeu7d-Mf4D?h6+#96x@1&z?O;jvP67@ZjOYhu^$;vw#2oW5wN_}=Sy<$SFC$q^ZviXWVhnW z8Xcx*pU#NUQSq3`=6Kd6QL6dcgB`m}S_@`8O3h?@v1RF+OAPl47_66a-gw_=>81SQ zw|14f6iZ8sL}L?s7dvl96X%3pV<{dU{=RBK;ThEebE@Y%E?T@~>9XZ3R<2sTX04$j GgEatW@P)eo literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/sitemap.gif b/themes/prestashop/img/icon/sitemap.gif new file mode 100644 index 0000000000000000000000000000000000000000..594afa56eb4889339af947c8ec5eb88613e8f54a GIT binary patch literal 600 zcmZ?wbhEHb6l4%!cvi+BB_$;-Egg{{(ikdWYis-S=g$WZ9vB)Lc64-Hzkc1t#U(8* zO+6vc+1c5nZ@#IishXOath4vNef#d;zkl!Ez3AxZ+qZ9DzOt{fvg+EkYjft#GBY!? zu&~fdDsXpqe|m1+g4G#ImMq!XZ0zgnw`kF#ty{OwnlL>C>m~-Myovq_lBSU+*;MuU|j+^z@jTS!il%u3o)5J3D*tvEwQ#Dr=U^ID7W& z)oa&wH0ato3p{)M^3U&|${rz2J^HrJ{Jgxp|NsAIzzr0CvM@3*lriXllz`%dfqiR3 zSyOXMYg-w2EF%LWqjP$D6MLzEG(STr$HX$3QV;GR{?e4$lharn6K2j9?a6Xt&{mnP zljEl9;>S6W)m4nmH$%;g&BVA>#Day3SC2tJj+cwYhqc+GP_ArQ0YYG!B+OU=0{Tu*(**&k=OU6?G{T zb14vWEt2vmk@6~+^{JHetx^c6RSc|E4zAaWs8b1PQVVaIBP-$rhQ@EwX3W7R-yPo$XY%*tvYEXYFdQy48No8~vL%#I>&u z?%W>Iu`Q}|V{G^4*xs!Xy}Kg%_QXuwm(;yJzh`OMge_T9c4ST6UEIH_WWws0$p;gr z9!i*gG-<}Md-v|W zd-pc1xzM!k^7GYM$XRcm3d+qA^8#gXrzI^4%m8(~;UcY|*!i{SeZ(hG}^X7$HH!t40b?L_48#iv; zxpU{TOXzJ2@d-Mjbi-+%o0@zbYIpFe;8 z^5x6duU~)s`0?}S&tJcO{rU5UVH6BR2q^w!VP;@(XV3vz4$2b@91j@!Ib=LGEO0R8 zxV(TTMge(a7M%SCA%Q`FtM1T2%?-1%h8qH1mkxp*v?T)*T*gCOe!ZwDzimY;$i zr$x1@uN@GaaLEMJrrC^4?oK?!SJs%ez?~`^AGGkaMsBwC#X7ZE`ADfqYO}6JZ z_)#F}ael64@}!)z!OPFiXBEj>!*HdzOJZwnp3%={g+o0e4QEaXHZSp!w<)^jph9i?pJC9h!n~Vhq7#JBDg;sPN-1U`(V{Np&#lf4#8G?!) Wv)y Vbhmc*HTO;Im^i6@T2mu~H2`Dj5{m!; literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/sort_asc_white.png b/themes/prestashop/img/icon/sort_asc_white.png new file mode 100755 index 0000000000000000000000000000000000000000..d73f00a2148545ff772892b0f92d11abcef6a10a GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4|3?y&GPYDK6YymzYuK)l42QotsU9JOCOeH~n z!T%YaZa44(@?EFhEEkV-(Oc1QdU=FfuSOG3bCS1;q&iyG#R9 hQ*%peGjm60Clft+4`~UxcAP-1xT{L+i zki}dQzopr00PS`rvLx| literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/star.gif b/themes/prestashop/img/icon/star.gif new file mode 100644 index 0000000000000000000000000000000000000000..182e7d42cc6f38115d5ecc45a71a2ba7dcbeeff0 GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZi0M$PL3JMB2IXMLd1r-$)4-XG8FfjS~`6MJHsHmtG78ZYh zf02=q5D*YpSXd$=BJ=a}TwGjHQBfTo9pd8REiEnR=;;3b{_ybdQ&Us)^z;}Q7@nS< z%*@QKt*yny#ZXXC6B858&d#Q$rc_i^jEszU1vIy!`egl}(eX=!Ny00960 z|NsC0A^8LW002J#EC2ui01yBW000J#z@KpV<8+8fYV6Dct{1cs?l@$%_< z4di3fxDf_6AL<|g93qPe1uFAgeE3X=1nmue4m~1xgm^4a3^6|j5&|cMJ~IhD02Mh>izV6v`Usv~LlKah;yzjnFpZ#6_e)#arM&nszOC6cl!YuEG*?e*| z{g4**z(M^^d;aT;xSLf8R~u6vRis~=RC>88=DCCJ*Ra6fF=1~!-ENnre2EFV=jC#@ zD*aJ@waa@w`0eiR%JYiaQ^%C>(kKCcatVP_V9RUZvOxOe};hoia%Kx85klMbU>Da z;)H>He?vr5FeeWyD-UOIQ;&X_wIDOIpmmsj51+QCGK+)+i?XIRUxY}wj*+5@gM*5q zkxsZsD3hFmIh&aoo4JAqZET~pn-v>O^}_H ztgMxtn~iIDh`gn#t*WS~s;#M|d`PIXj5wnqFK-gdjsuAvQ(437R?H|!INZi89P($! wCI)UkH5ZW`6BG`%GO79&7&IlZwss1u`z+W{)N)aQMNH0SLqo#E1r7|>0N%>Wh5!Hn literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/up.gif b/themes/prestashop/img/icon/up.gif new file mode 100644 index 0000000000000000000000000000000000000000..67345103c2c56780647290326f0e06473b3b9150 GIT binary patch literal 55 zcmZ?wbhEHb9|5tW6UEJ3H z_uIjjFJG?BQvG^A>i+%v&-Zs--&xv{rh9Vl`VWtHe*gac#?0X7d&}NEy7K?igO4vC zyt`6!dU@WR=^jr`hMa71cz0vNnW+(9U*F$bDf#pG9M^A`*It^J`u0@L|Ibg4_qxBk*6{cH@eh|aKfSW<`l6((TPu5# zH9tMwb9YX_m4#V%XL@~m_vG8%?C;OEzP(V+Ff@VUPZmaY1`Y-tkn=%t!oWVYfrFpD zrL~oxqqCD;w5v~)siTXXLv)%bBO?!oIg7fU0>_l;(`IRkn;GdVE}FVTl+DCZKws5% zZNG>#w}YXDf&GpyYbR4aK4~rC?mlzoV<+r%rySA|(qsL1n5EcwjAV5Kdy%kt6l6$`ezv5AH*Fgr29*{Oqxk--`O@;Jcx literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/userinfo.gif b/themes/prestashop/img/icon/userinfo.gif new file mode 100644 index 0000000000000000000000000000000000000000..dee5739e98df54c6ec3f6de9fb244f9e666e98c4 GIT binary patch literal 589 zcmZ?wbhEHb6krfwc*ejGVkl6u=!|vw8msi_ch@&8&(?W$X4RHSg$u;wc_2`WfKa67S<O)OxmKl} z@Z!RdmbI7XrRrRW^7JZSl3>ced+XstlhV>=9uMx_zy8#t*O#|BR;@c(uJ?9(?TaJx zK7Rd~)3-i<($1b$$GtoEo?TG9CDy6kgFnMU==+s*^Y`A^ykXtkO{d~4L|$zwFKC>4 zzR|eYT+q67MMa?5rFj3iiiM8#n=6){`*CKrSM$~v=Qpoyj99w=#{1n(8M9A3e(`o@ zML@ib)Z3GbY%12Ct5Of|*;}{j;ZJ=K+P5{h@V&pj z=l#}}zSXC)odg!`ybxg_{p{M-+|`t9eoWmYZ)U)Gp9J677q=l5CbJHS6NXFk>-SOHF0rnc?Sb0gP=f* zrT{Bv*`O$X3DA QkDdLDJO-U2A{-3X0QCdhU;qFB literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/voucher.gif b/themes/prestashop/img/icon/voucher.gif new file mode 100644 index 0000000000000000000000000000000000000000..020a5a783c11314f867a090d57b2fffa86d1561a GIT binary patch literal 592 zcmZ?wbhEHb6krfwcoxEN_Uzd&U%veM_3P%%n-3m5*uH)HxpU`!e7N%C)s9Dx9({i} zW!tuGU+*;k{Q2|Bl`Fr0|GsqT(vv4o-oAbN{rmS%pFX{N_wK@l3*R41`u=Ffms^cr zzkWS^`t*$(H%^{B`TF(iFSi;tY}oMY+q0kFKkwVO@7AqbhYuhA^W){W2NN$|y!id$ zwByH*f4Nn?b?eseFM+l+e*XOV<;$0sFJJ!f;luUo*LUyUedo@dFZU;G*|O#D@9%&9 z{P}ce($~AKd-v{r|Ni~A`~5$D{J3}T-uoNvJ9q9pdi3bir%#_hfBx(1vu}6XuU@_S z_s{Q-A3q*Cbm;4?>L2ef{`heD#fuj|UhO<^;K0}0O@IIX{r~?z!$1SYpDc_F3?U3U zAcuhBgn@l+g9o30h8PVd%FMR^##E2sRDm?Pib*W^xO%Vsj)!MAjhKS6f};>;Yz{ zOCrwx!R(UaxAk;`jdkq1yu4kXJkxY{^kin0>NZk#c_Lr-LSUl4!%{gDC7;41X7__$ iU0Na@A2JRwH47-;Q#kN2$<0m3q2domQT$Q|25SI36A_sJ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/icon/yes.gif b/themes/prestashop/img/icon/yes.gif new file mode 100644 index 0000000000000000000000000000000000000000..7902938e95f869a59031e04271bb03d0f491b973 GIT binary patch literal 622 zcmV-!0+IbkNk%w1VGsZi0Oo%H=k?;@?crR)JdwMPYs5-&$7XKCVw%c_uH2=4y=Rxq zhBbaMZ?#yo+NQ79p>4NUL!mQ2j61a6tG3a#tJ9mI*Oi~rk#)#uZ^L19w_Kgrl5)ss z{Qdio&VPf>cemlMddzLL;jVJITXDW$x7oFY#dVm>hv4hrdBJ3Hxm&*Dwy@)$f4FIy z$A`D!u$ISzU9~?yg*$P?W9j(i%k992$$5jmZL!^_>G$RR{{585kGk8nCWIrI(Twr= z@OH^**6z}y*OqX&S;6DBz~s5h?7wioS9iQ%eYa+<-S zzvH-x#CBD)HCnzmHIFf}+o-kMs9~*2aKU3tmpx9KL3G1pbGlsP@!{n1;eg6>fXs4I zphA(rk7mV5Z^mS4$V#)>rJL80zTdT~+?OYEBqo0&DR(6)dL?qpRhG?&e#dV=nLH|w zC5y;-n$(Rup(lL0Wc2#-?f2_;%4*r{)OpEkhr)83&Wr#5|NsC0A^8LW004ggEC2ui z01yBW000NefPaF6goTAOD{cZ)1Ze<7!FK?n#HPEtdKMFJfk8Xg`RA#-(TgE(Uy zAs~4h7Z-aHQ4n2%Nk$(a8)OCsGAeKqS2}_O6=y%b7#Ku;06l$if=V}F1uj5XP<|Xe zOb$GPPY6w4K7M%KZz%~5Yl1KqbXzrdemM#cA_^@Lf-GE-fMP@mJ$)W9$k0H`06|_L z@Tqcyix372&9GPyV9*XZHmsOPV8?_RBx)uUB0(k00SXjeWLconPyjIz+OUZ+-~^4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/logo_paiement_mastercard.jpg b/themes/prestashop/img/logo_paiement_mastercard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6022d872f8555333b3b32fe9a9918e11ae2b7fa7 GIT binary patch literal 1880 zcma)2dpOezAOG!w*>M}2kkZ^Q=gno!rHhO)t;yYx+%FCB(u5vlu0s}z! zRsoVl0D(^mi%A7Q02KHk0+J;_0T&)08UciNZYdxMAIJhg{~X|-fc%ZW#=#)amb=w| z8~>C@IspU>KmofTAOrwLfFKBvqzB0R5o{~uPsqaHKW_aLwirxCRtW&4z)&fWjMQHi z7y^}&2FWNRRbc=^1+`7qTpOdSr>};_>8Qgs5L+LDLZqc25UKxf0&g8uhDxa*r2%u4 zstgRRZK1ObhtYMHRk!yDbx@Ox19A}1Rxk(xI0$4M2<@PlG!l~Q6vL|IFd01u34K>P zY=||rBun1Y07eDd^QJ$aTj_@`KHzTs0=+ZDT=q(q%uO9bN(B56H?Vs3>iOtqwt_%T zU(c}bCG&lyv61pJK2KX06^3+avSRJ--# zA)L#RuL@q2BH>h7VR?f0bRI5JIoj}1p@>$*e75cyNjJgHwqJ96^VsN7v+z%vfV?K6xoc)fUqSPrQ3g4%=~fi6pb5;!!4v4>0Om6&%5p<%hf)`!3-5dfLaQ^6>gl zn&9Do_OhyY$(q%t7^3FHl4HYo0`LS*dYB6;N4RBiU|}d63Wa|`V8jVMVhJayA@Y1a zs3m%Gsm&vGF>w*O`b^M<@jdbD-si**GpU|jC+ADe{W-0v(cT7@cauhJhG`%>5A;eX zcb(;We4wTF9=nB6(z@a(a&itaIZ@})rdCm*+t-+@pJ|^M?-GA^# zZ{l#njDXD;r5Onsb=R5L5YG2GuR?ZkzDe<#5yDEJ)6p)*kB=1B3!RyRZ&hal>P_zy z-nq;Fw^uAx1|SxM*{e$XhNt54Yfcvqdo!`G3r%TVJ7kZ9dUYYM`iRNZdtP~_J$A+> zG+Qj0H+qSpbElk->?&>j9f?tc_qfqv_Q$SJna}o>(_5|$KCV^t;aQB>WhIfZ=FvgMITp<3Rr{F>RVEu$q9ccu`}-&@HF}`mdXD;rTTl(MF}Jm! z+LJH1bVuefh_4#B1bG}sn^vKAJfZp};iw?~#4qVJp(~a1#-bWCl2nCJgA9ehw^G_I z*L8Q2NWbCJ#fuWL9Uu;Q#f&*m|+~Pc87QB4q9K zuIT_d!_N*z4mENB+_hOgB6MCrbD_{gV{;Aa(QGfzQYkF<07fic_IUWw%&Sw@4cUKK zliV>x=tLn9mYC0qbiqrXvm@lPCjwLPXu%`v%eK=ZQPXoS3rgUgGsq4 zZ+}d>R<^BT%EtVPRn}VWy1;KByj`GT;U7fhiCtZ_9GWr+())KV?bcW?EBWGg@<`By zUY&fHi-@{T-_%`;&mIoExWRit+W4jStI$5%p3?YG|EUDL$AJzG%v z-DPNE8n!sNKwUl9w{*IUlWHonny7Btg1j7`ojx3QD>Hg$N8ub*%wi%_KAF zwYW%t@qk86lbnzBrtw+^*RKT0o;-N9eMrl4?o1iFFauSsemaHT6z6sz|8RKwPO?(l zOnc_QMu6|v^a+x0$I|KJmf15*PuiD-i>ra~h(znu0PB0>Pgc{a_UwCydfZVE}RnONKX65w5~a6&fh&98c^-SLvKKLM>T5=;O9 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/logo_paiement_paypal.jpg b/themes/prestashop/img/logo_paiement_paypal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c94c46c0d702dcf9ff5056e1cd47c7867069f300 GIT binary patch literal 2426 zcma)1c{J1u8~*)f##pM!FeobPL?a|*DF)dhvP_l?$-XbyWf>ubv4=~g$t3Fx(~zaB zsVswvJ9or1lx*1|x>_-x?>qN&zd!Hup7)&hJkR^Q3vY}!2?$%7oiPJI2mpBR1i)Jc zkS5VyLGb_xz<~df0B;3A7^o6y z*EM#l_gd%PJ$30K`%m3*UpV1^jZ9QG_w+U^d+Xws6MGCFX(_`Nl0v0F&sCeYz2KK% zBWI?EFyF%ipybB0Md8<4NcTr1^zI4RXxmN_4x+P{+jluAJZJI%HdiT^#yEq1S_2pw zUHoM9&Vi`-1KLXt3=^2h%+)1YbN+I(c^_qfD`|0+$g-Icj>$Nh(TVZ2h}xW+sVg8Q zsrVbuk-$I^l>d!mp71$3Vl%o}PJfI=x_CqG6J6D{?SncMLnxQHEZU7y>YyL&64rJ} z=&o@3=-SY{4EB)3P8BV7=2sCC~a)HFj=y$t=om_Pxq0uF#$SftW&a zbEuWfk<_cqOeZVHuBsrGF$x(I`>-lZs8pY#iV1sKrR(C`=xB!)Fcda@fD1df5O=-J z-vyso8=pvQWiL6Y5?BFFx}-^XRxbkam&Y6Fn&U<6&iB()X9Se7&0OWWI0}EqWbY z$vwpl&rhTpa2DP*uWUVid%J&h)5kUPVEvfe-o67=^9B8rT|8iA!^X8XoCl;mdG_o9C;XQAW+cr`|-H+V$r!1ZJ!4gWM0h`-9sDa z6O7ob7l@A4$*)#%hi;0)C6^4oggu_%%V5*nXQU4gTM_(VcefBUR>Ji9?}eKU*$2No z4IriK2;G9>f&&4`c2m76{c8zRZOt@|oEEkE7gw6OYd%xm5eYA9RJB~a8pB)(WZ%Al z9L+(>5gehPwDu}<#Nw=P9h+oGUfaEX`fj#((MH$Mt|KwHSDeFt44xQ9RwhrxG}f_Q zL++KA6vn_(n?Kn39;111o28&WQ((MyMaW;{DFVCtai-Qx{(_pN++>Q%JgolB#K$Br zQdzT|Rnyhsy7_N2bK8Dh=d}vIqM+#+oT))O)gtETr@d(poZGGP?FsO<-SqeDdptlq z-hhL!zGa4$R^*oVe_3&hJX&FyYY06OWWFu~r>;4)vuvA=tKgYdrGBHi^Aw+^rK?j) zg9YzUNc{8e!5u!oUs)#w2$RFwiC9CF+C`5;-ixor&49k>i~uL z=xhva9L6ljSI&mYBA844*f71i@crhh+HN>$>N*|R){c#GYTtHYKEljT=vhf+hE!`& z#WPI%XD)=&?!sS6AyCO34U5v*5i7ld`mGwbOQT11nkF=_QM0nc$VHvGABy!H-N#DH z@^q!H7!UPI9h&HaE4eJ|q(T~Kf~|zR$|dyR_q#A3oCh^N@4Hwjbe_^tYfM(S)siCW zkRuss7~rTAIylnkK^ok@3mHl6#Boc#_8$)|T$MRA*HQ8SAtcE*vXvQ~?O63`uP8+^ zo+!cxanBzG8s;4ugLap+ysRA@w3N`rkzoGn+}8&7<_gIzQ$>sQ_Zf@I;={~Ssqqe& ztEx6HJ@oro6;gS1CLFZmNMMM%!Dq;vlCrsh}TY}@R zg0ZKTMiB4xg68)~NoofBv$_^PJ<6Kn0nP4epGr-&ncIOM&xw6mMcu((`8u?rn%(z) z^)nAJ+g=^|Fzq|}^X}9jv5n_ErG*=JZna>;47e|L*>yx#}X1^B-u) BEFu5^ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/logo_paiement_visa.jpg b/themes/prestashop/img/logo_paiement_visa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be8cc9ed2dc88da2952fbdbbfb9aefd30f564db5 GIT binary patch literal 1700 zcma)2c~BE}7XIbp2m%QqK`PiLBp^z;v*OAj1Ua;z5Cp+OB@w}5IE@J5Pzje@8j6t^ zr4-#pI)ns_2&f!di%3vF5)}jt7?uTsMFVT0q}kcl&h)Q-Z{EzC@4fH6Z=UA4W)h(G z_yzg_2o!)L+5nn)fc9n56Egt>z`_4Wpiu!M?<2{yIB=v(%Rn@vfDIsjAJ9Jm`-tD= zPzXfZ)#k^>-z_v<0IdhG01tzp0Tc~^p&^&5^e|^nMut9qeiiV+q7Z{G2W*IlTKF*e;)z=m_=v@Dbd9Q1q zb(K6ka~tzaB=U?L+E36L{oyGtEz8Ep&9n_^Z!>ljbs z9luCEBeko!^H%m|gSSh}wWt5S9n!I+FJp~(ki5B5Gh&rB2IG5+Gq0fV_3&z|*Tvpp ztn#tdWB2_`2=%jq;Z~8fN`xH}*@RWaVYXZ>I3OtdQk@#~f%J$|bELnd>%joP)qGF< zzPrt?Yx8D``VQ{C?`Y|jkp0VtY!6!B!RfRMk8(zzinec2r?p}I=+~A?`75E4<~I^` z)fHF(alx^;1mAnjH|j*n#Q?Y)VNM<)k+zH*^nA_p&HrL6^5G3$l%7L5>yrEEV9?|5 zzD0vJta*(W{sLRzDk>t)B1uo*vu%8zTOnlT^j-sLF12T#pEY6EM}9YF;~dkk)DOPS zUm*q|?lK<#tmWHlFEKa-F+DYXQRlOa7DNdx6g$WWY*yE%KBTUJ>N z$G_`6Wr?UP+jP3tX{8NAY_7YqGwl^w+=KFML^MRmf9^XJVcmFpoE5Q${`nJQ=U4nB zLwj((v#t+?3d^z`^zUyqdfwm_pDWnrkYJN24rg#bZ+ampDJxO`c#HV#rFeINIk(W+ zmxq%Ke$6rUAO0t?90+IKf*m2QkzFo)UAGeo3t3CiIpF}++VfwBq6|tL%k0hks2j z>yC^~Fq=!K_MB~g9V@%)Z$D>2DkK|HvS>?VCPUXl%1rGxhER}Zq}77uccY1plJppuq4}7>bfdTwYPOKuBkG?WLm z<;BwXn-!F^$uk1f(AHn#=QvJo=c7-Si|5S}gpAXYEj^M8u$_EA~`1!>}YXIf$rIyFlduh!R4f8i8)|m{CX2pjj zp6*_DUrlKK!J$gS1RqMU_W@PW{K{BIzH(pt*zuckWJzpoNNOE@QW_PxHGM1)ev?Bf z4Gi5wEFG%+DvP>*5hr>1%S`<7cLoxN(1Yr#=-nwL>&MJkjPpNP7{uHtS40z{m@(rM z@*VNTM*}Fd0-Cb>FfN@xqWCoL-Z*P8H{<5}Fs`k|)#;Uev4T3&8mdT|l4_KidNvaB z{6-kyAo_Df3lZ}flR&FiaSmR!PEB4C!$$zN_ zb9-UEl|fjSk7PI(8D>YYvXbMcvN_w6JBki?N$$QMoL$ubwz&|xtMj2->Dubsq?JNe z6L!k$Go|v0*Tw(jy;5a%W-x!{=XSzU99~zdSMnDzP4xJ7xyOI+HIU`3MrOBX#2P1m zt)uVc1UDnSbzji6b+(tGu(r^$lJ^jm;=YKTAgbK+IEv(0*+PfP1J7Iy&Rd*%s+^f# zw>Y(4t2^*>^!vv3iAPMvZk@$G+GtE?HLYl=;Z14Us!DcLwix%#G1E_q>A|%%=$sIj NZez9+^;6A@-vIN6!IA&~ literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/nav-logout.gif b/themes/prestashop/img/nav-logout.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d7775de61cda690803945feb2d6dc69b92b69e5 GIT binary patch literal 371 zcmZ?wbhEHb6krfwxXQrro`K=-kt5$74S#AV{|gNK|MBBTDdBfQLjT>Iz8e|+KXc|k z1H->pul{Go{P42=X=U|IM*Me}$G^moubiC!g@u3VX?~TL{Qv#?cQ2>^#>RiVy#B@o zeiIP*mlpX)L*u=;_%9W??+grotj+&h8U9gI{2lK3E6DkOR5$~bfZ|UUMs@~q1|5)j zAU`p%O*qh9;GrX?*}Y^^(w+dD-o7o$iiLdvE@{z%xennEHx~v8Xo>bZ2{Uqw%eE{E zxR4>i>Uxx=qTGn3qNIdhfUj1ZTSzjqiIrbQrafOsPOiLp!lVvvX*rHQRvu1ara97* z#XS7{6^sJQoMaSKi)L{$ax$^WJ8xEFo+u-{VUMef7~d(TGsoQ687^L8_r2=s$Y2cs DaprA8 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/onsale_en.gif b/themes/prestashop/img/onsale_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..48bfa342de2fc6938b5b68205a37573faa80a089 GIT binary patch literal 1962 zcmeH`SyNL707mbN>*F(I8ZF&@g!neV0&CUQu6P*V9}x|GEf$cTuk?L_d_EbC>kf_t3fD z4fBs%nw$H2U!l4-bg5@_Wcb~bW_IR-VP#aOThOmBp(qOczyAyT*8+B{7^9D_+edu- z1VBImkiZluN)gtUXe*B37XNYv#bGZ-I}&t}=0~2W4LMcTobA6~r!l|9C#Pb}_t$FaO;yEL0C&Gy$bXU;Ei(Awu2b$#1v$#}w?T$b`k?smB==o)KJ*=qKz{QaH^r21rirOg3rQ5wKhsY|$ z;So>uRaRP?Y+urLlDW+L_~0}cG~N~%AU_gA=SRrX&F`EDExQ+{a@{*!Ec1Oj@kaKE zda&3pBjzQ?W8v=_Se!asTlb<+n#Ru_ZVsYYiS=iQ)MpM$TBM;a!HfV|q1sY5oI0!N zMptV6&n1{ZPm*PSC>u7isLAyjr11jY1dCxK(B^a}76xRhhf>K)%g}l3R4@Ai4kH9W z(796yU{K~%@ScHMFem6VVZ6{!#qK29q`Syv%ow-=5U74YaJcl4$jpd9 z#e^*WVv-8x7F1W>NGYt2x-skmNC13H-uJoI!Bz;A?AtbZ+EeFJ{hQ}`iaaNn)vAO9 zQC={BarT-j_oV5JWIuJahRcGY^1z$%-=M#^7CY4(5}Mr4eI!n@nRY#fYdFl1S7OLT z$4!jK6(FwN_r2SFIzu~U^o;sGCZFWy1w$RaMfp6J_^lo|Iw=pvJwN*1Efcc$Izhrc z6-%&|J;!Gomd}eoDLz=N#CE?8Wr5b}2 zv`7M(@tFt!r3hn-EWgvjsf+R)&w8Loq-^);4O@WbOt=dG-7HUn-D)fJmYT8Qs^>lq z#!%P3(9Up(6QGzavv{E|>+x=6AT7o|Z#gD*!R)2J$jko4SZi7-jNR&_wTI~S$6zeY zSqnB=7r6Uko!U_^O5fS*M>qqKaROcnDTMMZ1X5w%pd_m_k0<)HVc`{qt&K}8A;}UZ zv7(H`z@AK3b6BEbpd$j literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/onsale_es.gif b/themes/prestashop/img/onsale_es.gif new file mode 100644 index 0000000000000000000000000000000000000000..787f007f2207e9fe6a7867ba5a3a8ef21678c641 GIT binary patch literal 1688 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 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/pagination-prev-border.gif b/themes/prestashop/img/pagination-prev-border.gif new file mode 100644 index 0000000000000000000000000000000000000000..903d7afa489c39d886030b187fb4976c554f7dfd GIT binary patch literal 518 zcmdUs$5O&T06-T-us7_zSL_XYjgFt;_#?{23nx#W@+m4HZ7?Pw*=&-{X43>b>D3dC z{)O-G&Tr;jT%Jd^uL2+hiU2&tlLe?*wo{NG#|w#MN+X_bzQ2ixx*xo#sD@`+o+#^> zdWPw|3Mif9MG573XjsJ@2UTp#2ovXnP>Ww~Xj5=p_Fpa_yCBVE-g zwM&XhOs7n&(n~s%=an2MX@-rktr{+MiaK$z>BN&6q*K!_YM2T#&g4ZA>Xus)B$bzR z5gMGJLXD;}*;F>q3Gnmt>+v~JsZ_wfV)Wbp*Bk!z?-LNbzG0%L)ko2)pB)_So?y4OeLi+? ge7F7KptiRDKGHgN5(Ay{p}V!Va5PpucMEoZ06yf(>;M1& literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/pagination-prevnext-bg.gif b/themes/prestashop/img/pagination-prevnext-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..d144484586f02f37c162e5f1c9d0eaf8666ef62d GIT binary patch literal 147 zcmZ?wbhEHbWMmL#IKsg2;PJ}`kDlFs{OaN3=NB(uzkKz^y$4V3-hcG)@yoLpu3o=+ z=hV5Y=PzD8eg4YL+xKtZeQ@>qt$ha$F%S(Df3kqp>VQa)oeZo32`UUH1SF0>)(CJk L@Z9X8$Y2csAjCIm literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/pagination_bg.gif b/themes/prestashop/img/pagination_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..824748ea409059d79570e6e3c8bfa0754203e4e7 GIT binary patch literal 146 zcmZ?wbhEHbWMmLzIKsfNVau*Vr*G`qcVy}6Eho-iJ9g&AvD23puGq9~*TFryiy?*=b#T$>DIDg{Ybp}#^;!hT^avcx}vXg<8KS4-DAkl_fS%K>UPrEP^ GgEauTAT2Tg literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/product-buy-bg.gif b/themes/prestashop/img/product-buy-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..626fb3f63a9a8da884b9e1ee68d60934c6c46838 GIT binary patch literal 184 zcmZ?wbhEHbWMoKSIKsg2>GPM*U%q_${Q1YvpI^Uy`}pb0j~~Cj|M>Cc>(}o;etrA? z(_5TfByRT=`)c3<;&O4pTGS0`Rm7zpPxQ`X21Z7KUu(H zIv^5cCj+Z#LQ>51lvycOJQ1&x{Qt;=Wf=ef literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/product-short-desc-bg.gif b/themes/prestashop/img/product-short-desc-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..dda67ed0a526fd1836bc1cafb8e8e972de9e57a9 GIT binary patch literal 332 zcmb7YI{9aI#5gib15y6EKOP*fB;2o6ONsvWeh zBAwhE1UI2SAi1wR?kg#{h^ha;Gn{kae9PI`TrV!~4uBi*1%T`Mp3hX+^8-%ZxCef~ z2=x#qm{6%gAyvRQ`3w`f@0>cNT3+>397`mT5 z8?3A}&hh)&b7#D}UHLdHmL99G<(Iq9y;^5!UmvS(?aa(|M<0%pZ<_Iw$e-jVwOZyh pV;H&1T(X`@Sy$G`wXQET8rj=yIz8WP7FsRSTzqP`r>4tb^%q5YvW@@% literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/rss.gif b/themes/prestashop/img/rss.gif new file mode 100644 index 0000000000000000000000000000000000000000..12c1d33b5788527dbfb7bca114eefd80e13b9e60 GIT binary patch literal 209 zcmZ?wbhEHblw%NJXl4KbLqmpSLx%s!K;-p5x%mGahW~St|L^tsf35ic);0g%&-wp< z@Bh8`{=feZ1d2adm_eF!Km^DP29`R36P~O0TD)Gh>wkiV)*-_=8LQUioZMIN>ev@6 z{-cXupIG^Z|L}wD!t?TW9&LD#z$4!oeE35*-!hFS&NGYuO<9qDy5!W`183$MuPshH zxnu3k3a{wtd@rP@)>ui~`g1hc@i#I@CGhg|bX(i@*%%d=PBouu%EUN(&fIzP7cepj HGFSruv7=uh literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/sitemap-horizontal.gif b/themes/prestashop/img/sitemap-horizontal.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cea2f7724a1c5adf7b0664fc7d7cc5fdb3d7729 GIT binary patch literal 427 zcmZ?wbhEHb&X#Yff~OvdUK^-^#%$vc)I$ztaD0e0stzc7;OLm literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/sitemap-last.gif b/themes/prestashop/img/sitemap-last.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee3a5ef3f06bd058ec1c2c61084a23b650680d7e GIT binary patch literal 76 zcmZ?wbhEHblw^=%XkcJyXlVHV|G(l-7DjdkMg|=QAOOiQFe&%+vz>g)f3a)JrOeG? dyQAN<@@h=G)5NBkx$PbI@lQV2%|aO%tO0#}8dd-R literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/sitemap-top.gif b/themes/prestashop/img/sitemap-top.gif new file mode 100644 index 0000000000000000000000000000000000000000..98a27e4a0b4af0d8a28d93c28be95207b0c1fb57 GIT binary patch literal 393 zcmZ?wbhEHblw^=%xXQrr|NsBrzkmPw{pbJxrT_oW{QrN>{~wdzzkmP#edp`fufKoj z{QtV;$&)AlpVWVNQuY6K>Hq63f3FrCJ9g~g!Gn(u2He`8vwi#aZQHh8-{J6Rv-7fL z%g!%SJGnsd%uJKhGmMYTk~}s`>f|)T6H^Ti^=s|zQr*?Aw7o@sYm@BeM(GW85)BOv zYpO(+m+~(y=3P?6v$&9ZQ32P2JdSxeY;&?$W@RwVOlJhTkO4PP{K>+|&S1u%15yI= z69d~ahuH-lI#T^7mK2@Lv6_EDW1}-~D_>&<`vFl7x1Ke{(HhekmrOd@;w3vpuA%bW z({(DR1P&Z{|C?J!%u~LlwXH>jTVK4HrMO>IUcj)&L!O1Du9lTcUeIW&JNtBwrOTEw z%Sak8bYq;(!n<^ zUw(g{pT57|-~R8Nynyru8nky1UqXEg`8D+S5MV@s2rDYI$PlALjsFliO7uwaqR5OR zHh#I;r_i883xYJd5-ClkJDCD?IuvSA zZ1boRv^r6$R;)+4CiS`$Y*VpM$woCh6;wR;wCT5qZN2J_pk zN?*Z$2?xef81Z2=gB4fR+ZOO+$yXt>y=*x%<+Yj(Pxf4S^IOqzNzXN17xi7$d0FoT z&DnKi*rREewtX6RYTc`OxAy(oacJPPg~uk2S$1;dosHLaej9pj>AR`-w*DJ?aK?$b zFLv`;dvWjK$qyI59DQ^1$JHxe5B@y+=kuf2pMJl3{_Fd*_aEOLUwi+J7a)BF+IJv+ W3F@~Xe+~NgAb@&&^WFmm0028n6d(lv literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/step_current.gif b/themes/prestashop/img/step_current.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b63ceced336ef38323c7dd64d6326ad5476a177 GIT binary patch literal 230 zcmZ?wbhEHbOkv<=IKsei`s~H4*Kd9N`04A{Z~y-Nd;H|tt=o5h|NedA)VU{5pI^Cp zwN_}=Sy<$SL6wwY+_}eTX4fD zqfg3Z!ik(bjpLmTi#RP}Ppm0B{kCc|AFp$XXWjW1TdK}pi!f<8v24M~E$^RazrN6* b-N#zhWWmJX!N$_uWy&rf%HOS}$Y2csC=-0b literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/step_end.gif b/themes/prestashop/img/step_end.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd181fd5090ca1c30989ede6a7d47d8b148a368c GIT binary patch literal 190 zcmZ?wbhEHb)L`IdIKsei^Y+~nr_TNU{rl_JZ~y-Nd-C-8<0sEPe*ARd($&{*-d??S z^Yqz^XU<-H@$%KFGZ#L6{&MyDtq&hQo;i2v_{p>X|Nmzo1QdU=fR*TgNRXWjtkw#u zeJPpqGFGk2dA-lTN2G(9w~)u@kH~|aVN0$D2XvfRQnZstX6A(zK|(p4Vjj+0OB22@ Ow5&C~SkdFeU=09cQ&t=R literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/step_end_current.gif b/themes/prestashop/img/step_end_current.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1a6c42e5412d6fc26759b8a32788532c9cd1b92 GIT binary patch literal 196 zcmZ?wbhEHb)L`IdIKsei^Y+~nr_TNU{rl_JZ~y-Nd-C-8<0sEPe*ARd($&{*-d??S z^Yqz^XU<-H@$%KFGZ#L6{&MyDtq&hQo;i2v_{p>X|Nmzo1av?OKz1>(dMc>)rDV>_ zShX(a^*#e1kq&0wLLQ$#A`f$hINdHdnR$4{TX96x#X|Ns9CL;%H~EMQeSAQEIJ1FQc7mA;hB zc^RwL<-FckpmV+?_kKklze}?P)7*j^OdfrcTqc~z@l)`4a_D7O)cPB1%1*zn+W%lf gg%4kFG-K=5g1pB(>?#Ql)?H`fcRR9f**oAi}meD~j;IyuGWz@m+T3=Gx)f~+Mc literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/tab_bg.jpg b/themes/prestashop/img/tab_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79f1e23ae01bdf44a97dd83dda191fc65920b994 GIT binary patch literal 1073 zcmex=BN0W%z=M-S*#*HygA9V1!YHU1 zC?w2e$n5z476T8^S|&keK?Zw&b^7cDi^g9(GLnsn(@w z;&zzjFq=!7Yv(+*w6x@xfBqalV^eJWRd=nG`svdPCSH)6xWaPMix8NpStAyML84Z?>|xgw6ajHaMp_* z{T3oI?sK^Gl+Uq>3qEJ+?)cp3dZhBeqDM9l0t@8|G)PjQ5jHnD&^!ER?Hs>s`zOl< z{xdAx^3V7`L(HR?J2#eY`sCj=*>e)d?u_dhJ*OW;NKT%t^sDd8BVqZK`RcJQNm4h3 zvrc>}z2c_0cEV=mlh*?!+O|2J>4!*h8`;b)73|1P(HRU%x)vALf3tD6)AElgvg6sG V&z%0G&wlls`u-c4M(zJ^0s!}qcs>9C literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/tab_bg_selected.jpg b/themes/prestashop/img/tab_bg_selected.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18610f21abbd6218510141cc4b63728b46606d7a GIT binary patch literal 1434 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 literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/table_footer.gif b/themes/prestashop/img/table_footer.gif new file mode 100644 index 0000000000000000000000000000000000000000..01f1e34f46a97d4f5bc86fd050899dec01cea2cd GIT binary patch literal 105 zcmZ?wbhEHblx1RLXkcXc4+e@qSr{1@7#VaJfB+=Jz~s=5{)-0I$ZZ_jW3 zwnrY*o^>vJb!yu??&F_)u7B%&{_EWLfBZaL?MEJ|CirMgKeKGIc!%BcE33YC`MPj3 GSOWm|-Y_r# literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/table_header.gif b/themes/prestashop/img/table_header.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c25ee4d7cdefa1dc0cd3b75c68a8ecf103860bf GIT binary patch literal 1262 zcmb`?c~6rE0D$p#+R=*4F%LA02NQ!Fg_vlNZT>+bp@^s?GiVm3m^mzGh#EwPOBI9) zs5n$mxdbew_uWDZEwr?ycP(vUT!ljK11R*MvMzpyJs;qgJg{>asXyL0wC#I9y93~k zj8W+W3>IfhBvGm-RG+kJjZQP6pU_Q(LZR6?!`9Z;5RX495J}}Ku|z(?7b;Ym;SqsG zJL&cLINVXWQZvBe$`oq;m{=s1i6sh&OvxG?CQ=x5CYwTIv4=;7xcm{mh(u))$aLU; z?S}y9D*)I5K)$w{rb7M_x5~jPeCzLXmh}B9+M%N|pMPWrwnzbRfiwSqM_A2nav6K`=Dw~UrtX}dlns|#a^Wr%}VH4Ju#nOf9N~|H${bO zFuzH?w(oY88zt@MnS@z(rN=faWfJGPi0wNMXR}BPeB_?QYcdwu$bqF~c4QAwmZhyH zi|1qmRI{?{Y{TITgEXrK{R{S*e2{L}lTIH|r?DB%Y1SS4oSe;c&-1Ex9=XV2ts2G6 ziPsgJ0gqYLbKd>%CSt=rNiCjN46%J~1Ha+OrD0CMW6@x*D~E@Iz7?ai^HM1IGQ#h% z&nvmyPzVT%Gax`waKj@=EZXomBE@2;j?9Q#sM(tfzkz@?b}iH%tgwU@>Y{7o7Lmu^ zz!#s!q0o!!UI_xucrC^kX<_k8P3cjEOD{8H`JP$I)~}c09|3u@g96o1MrbJV*x%qKX}4aV*wBk)_xjR8>Zz zlQxlC?4(Z?V4aMa3cHhOs7)-R!XWvs0SgKnat%5db{Bg^nCRxL>x$h&eiPO`{Ml=F za{(}Pg$LsPDF8!`<5or^PCHikkud10VDFWZ)v*J&aI3(1y z>4x^|E&PTq@1Ao*pI?{coxIsn>Yal3;VZPTCWCjnT$JRSxvMYr%~qQ6zPT!&(>IR* zC;JUG`^)?b$m0b6V&nY78gLUVIk5EVN?BmJ^%fyuYP;tOn7itdH!Zy_Wt&!XA7Rsm dW4a!g3IxeP2TfnLGw5WQ2|*V}dKd)!{2y}X&jbJf literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/thumbs_left.gif b/themes/prestashop/img/thumbs_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..2830a5fc8fe7f8ed6e754fe6324c236d2362b76d GIT binary patch literal 201 zcmZ?wbhEHb#mkp3|NHmv+O=ypZ{ECp`}VJ2zwX|>`~Uxc25dm_ zCkrD3g9L*PND^cx1FM^YTHlN>6BbR0SdkL*MnhLr$2vsT`^c2rlbnw%pB$rbcs{G3 qgHU2)TF~+ai>WglQ?gDQ%`@a#&?w8OWhL_9k}4-hV!0va8l^XJch{P^+n=g%iko_ziK z_3G8D4VjryY}zjzsr{|U%Ytn{Q2`|&z}AM{rms_{~2%t#h)yU3=Con zIv^z=I~iD=6c{2?GDFX0%nMmOP1KZA-`exA^nJm_?I284@;~5Z4J@qc!=!siuJS&J5N7EjL_V literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/title_bg.gif b/themes/prestashop/img/title_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..44fd38e9a7378f10054211ddc940922e910062f6 GIT binary patch literal 1385 zcmdUs`A^da7{<%7mMgA9he$k%5-bAFOe1W%gvkU1+*n-HY)nOsRu0!hqAt3HD;5Dy z5O5+?KqxI>5h#^IkZLJ%Iws&i+d{wh-Imf~rK^9&-XGrg&6_8mym_A3eKC<=rG&YD z&H_DHFpNSlLNN;zV+J7Sj*_&AX3P$U1H~x-!YJB^lMF?hKp3MKXGb9fXN<<>uAH7&AZ^K^hU1wA<|l0K^Fz#YqDQlavv~NQ|Ixf&u{00HH8~ zBOfme?$l!hf>DGMf>R)bQnZ<*jWlBfKm>pglA>wGM9~aRkQh!9q*H^y2!^0IZ8W1! zgwgy?t7HAID$wTc!eV)_!ajceF%uTYk>!!&>$hgFDF13fVbQhgH*Vg#U0iafw5Fnz6dD`3etY7u~g?d0U_;P4? zWOQu&Rac9fzh^{|ksCSXET6*Sh#NenQ!&0sdJ(YW9wBzOIhHAKxy0Ej!$r`u1hJZ0gZ5 zRl&LhMdO=R!G!eJAw|tLUQ7PA}@>hl)8CJH; z58T|8P?`ATF)&oVee>uqHF=_FpW}jYc}*KKAvqvBGSb%HN~rA!~T=;v*cq(G4g8m~#H`o5=g0h?}3(~kCZEmAsF;f5cccH2zwgzV_p zyItql;VUwxdHtdf@2w_GJJ#FlaIn~XU6#9_K$q+!($-Z`DSA|7B4S zPvyy{b$Su+3V$v?s8ld_m0u^BD+p7-bA{W~{Q06ClY;qck)UM$`tHvBe$Ow1gdX0( zMdPYlals7+$L++Oh@m(sCIl$?>EIdQ&f!xHKxy)M1SmUpB?K%#S$Y@n2$l;qoG*Oz z;60%_1gglKJOkao2sS{Kmn{fXmBroyi}Urc8DsFR= z`R~LC!aR|*@*6i7FJ)ri>&TN$3zNwgh=r+RqHxRf$+8T~8$o@O<=^xU!ZITq2w$Ad zoXS{yd*S->P)%_>=<4q9^YHQX|NsB$?C<60>+kUL?C$aJ@bl*A>+kXN=IH9@>Fn|H z^8Wt*<>u<`?(pX4=;-S0?(p>A;NkA?@$2pI=jiL?=j-k6^6BdC{QUgn<>u_|@apXD zut)>geh0>Fe(6?eXmH^6BgC>Fe+9@A2#G@8;*~@9^~Q z@bd8S^5y2~<>%?{@9^;P^Y8HS?CtLB?C$OE@8;*}=;`a}>g@3H^y=&F@$&TE-{1&r z3qSw>010$bPE-H?|NsC0|Nj6}Pk0gl009z7L_t&-)9t|pcEUgu1<>D4WMTw3aiIry zhf%7E0niEqYm*cA#%Ira z1kmuj^SH;v{=O()0kn!@?=$h*kK<tXw9Yvhly8{ z;X6Qs;bg_c58EGrM%xD_PSbCIMrq2#o#humqh*JQJ5^Rn=kQR;z8AcK{lu z*>1I%*foxy01b|Y%fzl>7*7CNhGDo&T-S>zx&UZI(W0)I7~r3N0iv>Z^wm}OdjJ3c M07*qoM6N<$f*zD#3jhEB literal 0 HcmV?d00001 diff --git a/themes/prestashop/img/title_bg_large.gif b/themes/prestashop/img/title_bg_large.gif new file mode 100644 index 0000000000000000000000000000000000000000..d06f6e6ba7565424e15a89cec915ab42cb004f84 GIT binary patch literal 1428 zcmdUs`A^da7{)swf{2Dhhh$*_!5|h?;v8aThz2GoI!Sb5GE^1~RH=kSgDzPzL~I$L zpeP`sl)JR$5NcbbToyUn3TP2Tu0q@Ief9)e>B^t6H%~tKJiook6MynV^pQWmx_!?8 z7!0S=xxT*ca5!kAkusVo+DvcIMA1f)wve=$q)jAcCMg$p@iSss=z0KzakPs9joE)H428 z7rg4h@MJg{5gT7`Y{Kw#<}h;IkHr1T&HuNcu;}5V;*!TtN}oO}E3bH7`J(FOt7=|N zZC!msV-vqw@a%~DcWrIQkB9hrOE$~8-ge7-di(kZ-YEv(4-Jou4oJL}W8)JaKWQdE zPfdTB`8qo{Kcn^ziHUK`jg9h!eLY+&xmGor%oeL{Wp&N&__pq3xO)dAwDSh;du?Z? zjI`G%xOTSB=E!3Sd4>L4S#u+=>xPSiVhaLJcGQoShMg0njCM4r$|J8Tt4?+{es~dm z3z-}3Og|Nzmz1i8I{6>#5=xnul;UPhQ&Qcj-wSF>IKm&cvF4R;gwt)Qih>^#C8C*5 zmPT+%C25(JW;u1rmxCWagBxJ*?v{^>P)u;pOxK07d~`L$;JNrTLOQR z%V^z5Y50{fd6x;Cs7tJlaZGU0z%bV0SWmZ&)G7)C&-Th!O^`--WxTh?ZliRn>a%^l z-|Q0~ZV_+UYnK>WE{q%s(-j?>V(A`61AN`1qgF^)d~DNReMy|(b^YUn&}O~! z$>}IqUz+6hSAzHX%2dO%i)qb_MrxQWMM zG8?$<{kdECjRHg+ZR_6@j=ckO-@#rl;k#jUeh+!ph;+on|8{9Ulcw(z$N zw=L#)?qAX7?aW+R%HPwvvRrhSSkaZl?_bqFP0n03RHR>yp1&PvRDjjRA!|^5dFC3- zZ)#mbL{ef6Z6Drm$Hdc_c3cLw+6lRhu#^3s2OQL(rdLUi>}hit)rU!kX(Il>H}hn2 KaY7K|m;V6ZBq{p< literal 0 HcmV?d00001 diff --git a/themes/prestashop/index.php b/themes/prestashop/index.php new file mode 100644 index 000000000..521586247 --- /dev/null +++ b/themes/prestashop/index.php @@ -0,0 +1,37 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); +header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); + +header("Cache-Control: no-store, no-cache, must-revalidate"); +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); + +header("Location: ../"); +exit; +?> \ No newline at end of file diff --git a/themes/prestashop/index.tpl b/themes/prestashop/index.tpl new file mode 100644 index 000000000..c6dfe9651 --- /dev/null +++ b/themes/prestashop/index.tpl @@ -0,0 +1,27 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{$HOOK_HOME} \ No newline at end of file diff --git a/themes/prestashop/js/cart-summary.js b/themes/prestashop/js/cart-summary.js new file mode 100644 index 000000000..874c875be --- /dev/null +++ b/themes/prestashop/js/cart-summary.js @@ -0,0 +1,406 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$(document).ready(function() +{ + // If block cart isn't used, we don't bind the handle actions + if (window.ajaxCart !== undefined) + { + $('.cart_quantity_up').unbind('click').click(function(){ upQuantity($(this).attr('id').replace('cart_quantity_up_', '')); return false; }); + $('.cart_quantity_down').unbind('click').click(function(){ downQuantity($(this).attr('id').replace('cart_quantity_down_', '')); return false; }); + $('.cart_quantity_delete' ).unbind('click').click(function(){ deletProductFromSummary($(this).attr('id')); return false; }); + $('.cart_quantity_input').typeWatch({ highlight: true, wait: 600, captureLength: 0, callback: updateQty }); + } +}); + +function updateQty(val) +{ + var id = $(this.el).attr('name'); + var exp = new RegExp("^[0-9]+$"); + + if (exp.test(val) == true) + { + var hidden = $('input[name='+ id +'_hidden]').val(); + var input = $('input[name='+ id +']').val(); + var QtyToUp = parseInt(input) - parseInt(hidden); + + if (parseInt(QtyToUp) > 0) + upQuantity(id.replace('quantity_', ''),QtyToUp); + else if(parseInt(QtyToUp) < 0) + downQuantity(id.replace('quantity_', ''),QtyToUp); + } + else + $('input[name='+ id +']').val($('input[name='+ id +'_hidden]').val()); +} + +function deletProductFromSummary(id) +{ + var customizationId = 0; + var productId = 0; + var productAttributeId = 0; + var ids = 0; + ids = id.split('_'); + productId = parseInt(ids[0]); + if (typeof(ids[1]) != 'undefined') + productAttributeId = parseInt(ids[1]); + if (typeof(ids[2]) != 'undefined') + customizationId = parseInt(ids[2]); + $.ajax({ + type: 'GET', + url: baseDir + 'cart.php', + async: true, + cache: false, + dataType: 'json', + data: 'ajax=true&delete&summary&id_product='+productId+'&ipa='+productAttributeId+ ( (customizationId != 0) ? '&id_customization='+customizationId : '') + '&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + } + else + { + if (parseInt(jsonData.summary.products.length) == 0) + { + $('#center_column').children().each(function() { + if ($(this).attr('id') != 'emptyCartWarning' && $(this).attr('class') != 'breadcrumb' && $(this).attr('id') != 'cart_title') + { + $(this).fadeOut('slow', function () { + $(this).remove(); + }); + } + }); + $('#summary_products_label').remove(); + $('#emptyCartWarning').fadeIn('slow'); + } + else + { + $('#product_'+ id).fadeOut('slow', function() { + $(this).remove(); + }); + + var exist = false; + for (i=0;i delete product line + if (!exist) + $('#product_'+ productId+'_'+productAttributeId).fadeOut('slow', function() { + $(this).remove(); + }); + } + updateCartSummary(jsonData.summary); + updateHookShoppingCart(jsonData.HOOK_SHOPPING_CART); + updateHookShoppingCartExtra(jsonData.HOOK_SHOPPING_CART_EXTRA); + updateCustomizedDatas(jsonData.customizedDatas); + if (jsonData.carriers != null) + updateCarrierList(jsonData); + + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save update quantity \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); +} + +function upQuantity(id, qty) +{ + if(typeof(qty)=='undefined' || !qty) + qty = 1; + var customizationId = 0; + var productId = 0; + var productAttributeId = 0; + var ids = 0; + ids = id.split('_'); + productId = parseInt(ids[0]); + if (typeof(ids[1]) != 'undefined') + productAttributeId = parseInt(ids[1]); + if (typeof(ids[2]) != 'undefined') + customizationId = parseInt(ids[2]); + $.ajax({ + type: 'GET', + url: baseDir + 'cart.php', + async: true, + cache: false, + dataType: 'json', + data: 'ajax=true&add&summary&id_product='+productId+'&ipa='+productAttributeId + ( (customizationId != 0) ? '&id_customization='+customizationId : '') + '&qty='+qty+'&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + $('input[name=quantity_'+ id +']').val($('input[name=quantity_'+ id +'_hidden]').val()); + } + else + { + updateCustomizedDatas(jsonData.customizedDatas); + updateCartSummary(jsonData.summary); + updateHookShoppingCart(jsonData.HOOK_SHOPPING_CART); + updateHookShoppingCartExtra(jsonData.HOOK_SHOPPING_CART_EXTRA); + if (jsonData.carriers != null) + updateCarrierList(jsonData); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save update quantity \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); +} + +function downQuantity(id, qty) +{ + var val = $('input[name=quantity_'+id+']').val(); + var newVal = val; + if(typeof(qty)=='undefined' || !qty) + { + qty = 1; + newVal = val - 1; + } + else if (qty < 0) + qty = -qty; + var customizationId = 0; + var productId = 0; + var productAttributeId = 0; + var ids = 0; + if (newVal > 0) + { + ids = id.split('_'); + productId = parseInt(ids[0]); + if (typeof(ids[1]) != 'undefined') + productAttributeId = parseInt(ids[1]); + if (typeof(ids[2]) != 'undefined') + customizationId = parseInt(ids[2]); + $.ajax({ + type: 'GET', + url: baseDir + 'cart.php', + async: true, + cache: false, + dataType: 'json', + data: 'ajax=true&add&summary&id_product='+productId+'&ipa='+productAttributeId+'&op=down' + ( (customizationId != 0) ? '&id_customization='+customizationId : '') + '&qty='+qty+'&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + $('input[name=quantity_'+ id +']').val($('input[name=quantity_'+ id +'_hidden]').val()); + } + else + { + updateCustomizedDatas(jsonData.customizedDatas); + updateCartSummary(jsonData.summary); + updateHookShoppingCart(jsonData.HOOK_SHOPPING_CART); + updateHookShoppingCartExtra(jsonData.HOOK_SHOPPING_CART_EXTRA); + if (jsonData.carriers != null) + updateCarrierList(jsonData); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save update quantity \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); + + } + else + { + deletProductFromSummary(id); + } +} + +function updateCartSummary(json) +{ + // Update products prices + discount + var i; + var nbrProducts = 0; + for (i=0;i 1 ? txtProducts : txtProduct)); + if (priceDisplayMethod != 0) + $('#total_product').html(formatCurrency(json.total_products, currencyFormat, currencySign, currencyBlank)); + else + $('#total_product').html(formatCurrency(json.total_products_wt, currencyFormat, currencySign, currencyBlank)); + $('#total_price').html(formatCurrency(json.total_price, currencyFormat, currencySign, currencyBlank)); + $('#total_price_without_tax').html(formatCurrency(json.total_price_without_tax, currencyFormat, currencySign, currencyBlank)); + $('#total_tax').html(formatCurrency(json.total_tax, currencyFormat, currencySign, currencyBlank)); + + if (json.total_shipping <= 0) + $('.cart_total_delivery').fadeOut(); + else + { + $('.cart_total_delivery').fadeIn(); + if (priceDisplayMethod != 0) + { + $('#total_shipping').html(formatCurrency(json.total_shipping_tax_exc, currencyFormat, currencySign, currencyBlank)); + } + else + { + $('#total_shipping').html(formatCurrency(json.total_shipping, currencyFormat, currencySign, currencyBlank)); + } + } + + if (json.free_ship > 0 && !json.is_virtual_cart) + { + $('.cart_free_shipping').fadeIn(); + $('#free_shipping').html(formatCurrency(json.free_ship, currencyFormat, currencySign, currencyBlank)); + } + else + $('.cart_free_shipping').hide(); + + if (json.total_wrapping > 0) + { + $('#total_wrapping').html(formatCurrency(json.total_wrapping, currencyFormat, currencySign, currencyBlank)); + $('#total_wrapping').parent().show(); + } + else + { + $('#total_wrapping').html(formatCurrency(json.total_wrapping, currencyFormat, currencySign, currencyBlank)); + $('#total_wrapping').parent().hide(); + } + if (window.ajaxCart !== undefined) + ajaxCart.refresh(); +} + +function updateCustomizedDatas(json) +{ + for(i in json) + for(j in json[i]) + for(k in json[i][j]) + { + $('input[name=quantity_'+i+'_'+j+'_'+k+'_hidden]').val(json[i][j][k]['quantity']); + $('input[name=quantity_'+i+'_'+j+'_'+k+']').val(json[i][j][k]['quantity']); + } +} + +function updateHookShoppingCart(html) +{ + $('#HOOK_SHOPPING_CART').html(html); +} + +function updateHookShoppingCartExtra(html) +{ + $('#HOOK_SHOPPING_CART_EXTRA').html(html); +} + diff --git a/themes/prestashop/js/cms.js b/themes/prestashop/js/cms.js new file mode 100644 index 000000000..a644500ae --- /dev/null +++ b/themes/prestashop/js/cms.js @@ -0,0 +1,41 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function submitPublishCMS(url, redirect) +{ + var id_cms = $('#admin-action-cms-id').val(); + + $.ajaxSetup({async: false}); + $.post(url+'/ajax.php', { submitPublishCMS: '1', id_cms: id_cms, status: 1, redirect: redirect }, + function(data) + { + if (data.indexOf('error') === -1) + document.location.href = data; + } + ); + + return true; +} \ No newline at end of file diff --git a/themes/prestashop/js/history.js b/themes/prestashop/js/history.js new file mode 100644 index 000000000..d90645658 --- /dev/null +++ b/themes/prestashop/js/history.js @@ -0,0 +1,128 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +//show the order-details with ajax +function showOrder(mode, var_content, file) +{ + var url; + if (file.match(/^https?:\/\//)) + url = file; + else + url = baseDir + file + '.php'; + + $.get( + url, + ((mode == 1) ? {'id_order': var_content, 'ajax': true} : {'id_order_return': var_content, 'ajax': true}), + function(data) + { + $('#block-order-detail').fadeOut('slow', function() + { + $(this).html(data); + /* if return is allowed*/ + if ($('div#order-detail-content table td.order_cb').length > 0) + { + //return slip : check or uncheck every checkboxes + $('form div#order-detail-content th input[type=checkbox]').click(function() + { + $('form div#order-detail-content td input[type=checkbox]').each(function() + { + this.checked = $('form div#order-detail-content th input[type=checkbox]').is(':checked'); + updateOrderLineDisplay(this); + }); + }); + //return slip : enable or disable 'global' quantity editing + $('form div#order-detail-content td input[type=checkbox]').click(function() + { + updateOrderLineDisplay(this); + }); + //return slip : limit quantities + $('form div#order-detail-content td input.order_qte_input').keyup(function() + { + var maxQuantity = parseInt($(this).parent().find('span.order_qte_span').text()); + var quantity = parseInt($(this).val()); + if (isNaN($(this).val()) && $(this).val() != '') + { + $(this).val(maxQuantity); + } + else + { + if (quantity > maxQuantity) + $(this).val(maxQuantity); + else if (quantity < 1) + $(this).val(1); + } + }); + } + //catch the submit event of sendOrderMessage form + $('form#sendOrderMessage').submit(function(){ + return sendOrderMessage(); + }); + $(this).fadeIn('slow'); + $.scrollTo(this, 1200); + resizeAddressesBox(); + }); + }); +} + +function updateOrderLineDisplay(domCheckbox){ + var lineQuantitySpan = $(domCheckbox).parent().parent().find('span.order_qte_span'); + var lineQuantityInput = $(domCheckbox).parent().parent().find('input.order_qte_input'); + if($(domCheckbox).is(':checked')) + { + lineQuantitySpan.hide(); + lineQuantityInput.show(); + } + else + { + lineQuantityInput.hide(); + lineQuantityInput.val(lineQuantitySpan.text()); + lineQuantitySpan.show(); + } +} + +//send a message in relation to the order with ajax +function sendOrderMessage (){ + paramString = "ajax=true"; + $('form#sendOrderMessage').find('input, textarea').each(function(){ + paramString += '&' + $(this).attr('name') + '=' + encodeURI($(this).val()); + }); + $.ajax({ + type: "POST", + url: baseDir + "order-detail.php", + data: paramString, + success: function (msg){ + $('#block-order-detail').fadeOut('slow', function() { + $(this).html(msg); + //catch the submit event of sendOrderMessage form + $('form#sendOrderMessage').submit(function(){ + return sendOrderMessage(); + }); + $(this).fadeIn('slow'); + }); + } + }); + return false; +} diff --git a/themes/prestashop/js/order-address.js b/themes/prestashop/js/order-address.js new file mode 100644 index 000000000..5f5536571 --- /dev/null +++ b/themes/prestashop/js/order-address.js @@ -0,0 +1,122 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +$(document).ready(function() +{ + if (typeof(formatedAddressFieldsValuesList) != 'undefined') + updateAddressesDisplay(true); + resizeAddressesBox(); +}); + +//update the display of the addresses +function updateAddressesDisplay(first_view) +{ + // update content of delivery address + updateAddressDisplay('delivery'); + + var txtInvoiceTitle = ""; + + try{ + var adrs_titles = getAddressesTitles(); + txtInvoiceTitle = adrs_titles.invoice; + } + catch (e) + { + + } + + // update content of invoice address + //if addresses have to be equals... + + if ($('input[type=checkbox]#addressesAreEquals:checked').length == 1) + { + $('#address_invoice_form:visible').hide('fast'); + $('ul#address_invoice').html($('ul#address_delivery').html()); + $('ul#address_invoice li.address_title').html(txtInvoiceTitle); + } + else + { + $('#address_invoice_form:hidden').show('fast'); + if ($('select#id_address_invoice').val()) + updateAddressDisplay('invoice'); + else + { + $('ul#address_invoice').html($('ul#address_delivery').html()); + $('ul#address_invoice li.address_title').html(txtInvoiceTitle); + } + } + + if(!first_view) + { + if (orderProcess == 'order') + updateAddresses(); + } + return true; +} + +function updateAddressDisplay(addressType) +{ + if (formatedAddressFieldsValuesList.length <= 0) + return false; + + var idAddress = $('select#id_address_' + addressType + '').val(); + buildAddressBlock(idAddress, addressType, $('#address_'+ addressType)); + + // change update link + var link = $('ul#address_' + addressType + ' li.address_update a').attr('href'); + var expression = /id_address=\d+/; + link = link.replace(expression, 'id_address='+idAddress); + $('ul#address_' + addressType + ' li.address_update a').attr('href', link); +} + +function updateAddresses() +{ + var idAddress_delivery = $('select#id_address_delivery').val(); + var idAddress_invoice = $('input[type=checkbox]#addressesAreEquals:checked').length == 1 ? idAddress_delivery : $('select#id_address_invoice').val(); + + $.ajax({ + type: 'POST', + url: baseDir + 'order.php', + async: true, + cache: false, + dataType : "json", + data: 'processAddress=true&step=2&ajax=true&id_address_delivery=' + idAddress_delivery + '&id_address_invoice=' + idAddress_invoice+ '&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save adresses \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); + resizeAddressesBox(); +} diff --git a/themes/prestashop/js/order-opc.js b/themes/prestashop/js/order-opc.js new file mode 100755 index 000000000..dbe56eff7 --- /dev/null +++ b/themes/prestashop/js/order-opc.js @@ -0,0 +1,687 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function updateCarrierList(json) +{ + var carriers = json.carriers; + + /* contains all carrier available for this address */ + if (carriers.length == 0) + { + checkedCarrier = 0; + $('input[name=id_carrier]:checked').attr('checked', false); + $('#noCarrierWarning').show(); + $('#extra_carrier').hide(); + $('#recyclable_block').hide(); + $('table#carrierTable:visible').hide(); + } + else + { + checkedCarrier = json.checked; + var html = ''; + for (i=0;i'; + + if (!(carriers[i].is_module && !isLogged)) + var extraHtml = 'disabled="disabled"'; + else if (checkedCarrier == carriers[i].id_carrier || carriers.length == 1) + var extraHtml = 'checked="checked"'; + + html = html + + ''+ + ''+ + ''+ + ''+carriers[i].delay+''+ + ''+formatCurrency(carriers[i].price, currencyFormat, currencySign, currencyBlank)+''; + if (taxEnabled && displayPrice == 0) + html = html + ' ' + txtWithTax; + else + html = html + ' ' + txtWithoutTax; + html = html + ''+ + ''; + } + if (json.HOOK_EXTRACARRIER !== null && json.HOOK_EXTRACARRIER != undefined) html += json.HOOK_EXTRACARRIER; + $('#noCarrierWarning').hide(); + $('#extra_carrier:hidden').show(); + $('table#carrierTable tbody').html(html); + $('table#carrierTable:hidden').show(); + $('#recyclable_block:hidden').show(); + } + + /* update hooks for carrier module */ + $('#HOOK_BEFORECARRIER').html(json.HOOK_BEFORECARRIER); +} + +function updatePaymentMethods(json) +{ + $('#HOOK_TOP_PAYMENT').html(json.HOOK_TOP_PAYMENT); + $('#opc_payment_methods-content div#HOOK_PAYMENT').html(json.HOOK_PAYMENT); +} + +function updateAddressSelection() +{ + var idAddress_delivery = ($('input#opc_id_address_delivery').length == 1 ? $('input#opc_id_address_delivery').val() : $('select#id_address_delivery').val()); + var idAddress_invoice = ($('input#opc_id_address_invoice').length == 1 ? $('input#opc_id_address_invoice').val() : ($('input[type=checkbox]#addressesAreEquals:checked').length == 1 ? idAddress_delivery : ($('select#id_address_invoice').length == 1 ? $('select#id_address_invoice').val() : idAddress_delivery))); + + $('#opc_account-overlay').fadeIn('slow'); + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $('#opc_payment_methods-overlay').fadeIn('slow'); + + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&method=updateAddressesSelected&id_address_delivery=' + idAddress_delivery + '&id_address_invoice=' + idAddress_invoice + '&token=' + static_token, + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + } + else + { + updateCarrierList(jsonData); + updatePaymentMethods(jsonData); + updateCartSummary(jsonData.summary); + updateHookShoppingCart(jsonData.HOOK_SHOPPING_CART); + updateHookShoppingCartExtra(jsonData.HOOK_SHOPPING_CART_EXTRA); + if ($('#gift-price').length == 1) + $('#gift-price').html(jsonData.gift_price); + $('#opc_account-overlay').fadeOut('slow'); + $('#opc_delivery_methods-overlay').fadeOut('slow'); + $('#opc_payment_methods-overlay').fadeOut('slow'); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save adresses \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); +} + +function getCarrierListAndUpdate() +{ + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&method=getCarrierList&token=' + static_token, + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + } + else + updateCarrierList(jsonData); + $('#opc_delivery_methods-overlay').fadeOut('slow'); + } + }); +} + +function updateCarrierSelectionAndGift() +{ + var recyclablePackage = 0; + var gift = 0; + var giftMessage = ''; + var idCarrier = 0; + + if ($('input#recyclable:checked').length) + recyclablePackage = 1; + if ($('input#gift:checked').length) + { + gift = 1; + giftMessage = encodeURIComponent($('textarea#gift_message').val()); + } + + if ($('input[name=id_carrier]:checked').length) + { + idCarrier = $('input[name=id_carrier]:checked').val(); + checkedCarrier = idCarrier; + } + + $('#opc_payment_methods-overlay').fadeIn('slow'); + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&method=updateCarrierAndGetPayments&id_carrier=' + idCarrier + '&recyclable=' + recyclablePackage + '&gift=' + gift + '&gift_message=' + giftMessage + '&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + } + else + { + updateCartSummary(jsonData.summary); + updatePaymentMethods(jsonData); + updateHookShoppingCart(jsonData.summary.HOOK_SHOPPING_CART); + updateHookShoppingCartExtra(jsonData.summary.HOOK_SHOPPING_CART_EXTRA); + $('#opc_payment_methods-overlay').fadeOut('slow'); + $('#opc_delivery_methods-overlay').fadeOut('slow'); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save carrier \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); +} + +function confirmFreeOrder() +{ + if ($('#opc_new_account-overlay').length != 0) + $('#opc_new_account-overlay').fadeIn('slow'); + else + $('#opc_account-overlay').fadeIn('slow'); + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $('#opc_payment_methods-overlay').fadeIn('slow'); + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: true, + cache: false, + dataType : "html", + data: 'ajax=true&method=makeFreeOrder&token=' + static_token , + success: function(html) + { + var array_split = html.split(':'); + if (array_split[0] === 'freeorder') + { + if (isGuest) + document.location.href = guestTrackingUrl+'?id_order='+encodeURIComponent(array_split[1])+'&email='+encodeURIComponent(array_split[2]); + else + document.location.href = historyUrl; + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to confirm the order \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); +} + +function saveAddress(type) +{ + if (type != 'delivery' && type != 'invoice') + return false; + + var params = 'firstname='+encodeURIComponent($('#firstname'+(type == 'invoice' ? '_invoice' : '')).val())+'&lastname='+encodeURIComponent($('#lastname'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'company='+encodeURIComponent($('#company'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'vat_number='+encodeURIComponent($('#vat_number'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'dni='+encodeURIComponent($('#dni'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'address1='+encodeURIComponent($('#address1'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'address2='+encodeURIComponent($('#address2'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'postcode='+encodeURIComponent($('#postcode'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'city='+encodeURIComponent($('#city'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'id_country='+encodeURIComponent($('#id_country').val())+'&'; + if ($('#id_state'+(type == 'invoice' ? '_invoice' : '')).val()) + { + params += 'id_state='+encodeURIComponent($('#id_state'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + } + params += 'other='+encodeURIComponent($('#other'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'phone='+encodeURIComponent($('#phone'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'phone_mobile='+encodeURIComponent($('#phone_mobile'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + params += 'alias='+encodeURIComponent($('#alias'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; + // Clean the last & + params = params.substr(0, params.length-1); + + var result = false; + + $.ajax({ + type: 'POST', + url: addressUrl, + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&submitAddress=true&type='+type+'&'+params+'&token=' + static_token, + success: function(jsonData) + { + if (jsonData.hasError) + { + var tmp = ''; + var i = 0; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + { + i = i+1; + tmp += '

    • '+jsonData.errors[error]+'
    • '; + } + tmp += ''; + var errors = ''+txtThereis+' '+i+' '+txtErrors+':
        '+tmp; + $('#opc_account_errors').html(errors).slideDown('slow'); + $.scrollTo('#opc_account_errors', 800); + $('#opc_new_account-overlay').fadeOut('slow'); + $('#opc_delivery_methods-overlay').fadeOut('slow'); + $('#opc_payment_methods-overlay').fadeOut('slow'); + result = false; + } + else + { + // update addresses id + $('input#opc_id_address_delivery').val(jsonData.id_address_delivery); + $('input#opc_id_address_invoice').val(jsonData.id_address_invoice); + + result = true; + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save adresses \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); + + return result; +} + +function updateNewAccountToAddressBlock() +{ + $('#opc_new_account-overlay').fadeIn('slow'); + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $('#opc_payment_methods-overlay').fadeIn('slow'); + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&method=getAddressBlockAndCarriersAndPayments&token=' + static_token , + success: function(json) + { + if (json.no_address == 1) + document.location.href = addressUrl; + + $('#opc_new_account').fadeOut('fast', function() { + $('#opc_new_account').html(json.order_opc_adress); + // update block user info + if (json.block_user_info != '' && $('#header_user').length == 1) + { + $('#header_user').fadeOut('slow', function() { + $(this).attr('id', 'header_user_old').after(json.block_user_info).fadeIn('slow'); + $('#header_user_old').remove(); + }); + } + $('#opc_new_account').fadeIn('fast', function() { + updateCartSummary(json.summary); + updateAddressesDisplay(true); + updateCarrierList(json.carrier_list); + updatePaymentMethods(json); + if ($('#gift-price').length == 1) + $('#gift-price').html(json.gift_price); + $('#opc_delivery_methods-overlay').fadeOut('slow'); + $('#opc_payment_methods-overlay').fadeOut('slow'); + }); + }); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to send login informations \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); +} + +$(function() { + // GUEST CHECKOUT / NEW ACCOUNT MANAGEMENT + if ((!isLogged) || (isGuest)) + { + if (guestCheckoutEnabled && !isLogged) + { + $('#opc_account_choice').show(); + $('#opc_account_form').hide(); + $('#opc_invoice_address').hide(); + + $('#opc_createAccount').click(function() { + $('.is_customer_param').show(); + $('#opc_account_form').slideDown('slow'); + $('#is_new_customer').val('1'); + $('#opc_account_choice').hide(); + $('#opc_invoice_address').hide(); + updateState(); + updateNeedIDNumber(); + updateZipCode(); + }); + $('#opc_guestCheckout').click(function() { + $('.is_customer_param').hide(); + $('#opc_account_form').slideDown('slow'); + $('#is_new_customer').val('0'); + $('#opc_account_choice').hide(); + $('#opc_invoice_address').hide(); + $('#new_account_title').html(txtInstantCheckout); + updateState(); + updateNeedIDNumber(); + updateZipCode(); + }); + } + else if (isGuest) + { + $('.is_customer_param').hide(); + $('#opc_account_form').show('slow'); + $('#is_new_customer').val('0'); + $('#opc_account_choice').hide(); + $('#opc_invoice_address').hide(); + $('#new_account_title').html(txtInstantCheckout); + updateState(); + updateNeedIDNumber(); + updateZipCode(); + } + else + { + $('#opc_account_choice').hide(); + $('#is_new_customer').val('1'); + $('.is_customer_param').show(); + $('#opc_account_form').show(); + $('#opc_invoice_address').hide(); + updateState(); + updateNeedIDNumber(); + updateZipCode(); + } + + // LOGIN FORM + $('#openLoginFormBlock').click(function() { + $('#openNewAccountBlock').show(); + $(this).hide(); + $('#login_form_content').slideDown('slow'); + $('#new_account_form_content').slideUp('slow'); + return false; + }); + // LOGIN FORM SENDING + $('#SubmitLogin').click(function() { + $.ajax({ + type: 'POST', + url: authenticationUrl, + async: false, + cache: false, + dataType : "json", + data: 'SubmitLogin=true&ajax=true&email='+encodeURIComponent($('#login_email').val())+'&passwd='+encodeURIComponent($('#passwd').val())+'&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''+txtThereis+' '+jsonData.errors.length+' '+txtErrors+':
          '; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += '
        1. '+jsonData.errors[error]+'
        2. '; + errors += '
        '; + $('#opc_login_errors').html(errors).slideDown('slow'); + } + else + { + // update token + static_token = jsonData.token; + updateNewAccountToAddressBlock(); + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to send login informations \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); + return false; + }); + + // INVOICE ADDRESS + $('#invoice_address').click(function() { + if ($('#invoice_address:checked').length > 0) + { + $('#opc_invoice_address').slideDown('slow'); + if ($('#company_invoice').val() == '') + $('#vat_number_block_invoice').hide(); + updateState('invoice'); + updateNeedIDNumber('invoice'); + updateZipCode('invoice'); + } + else + $('#opc_invoice_address').slideUp('slow'); + }); + + // VALIDATION / CREATION AJAX + $('#submitAccount').click(function() { + $('#opc_new_account-overlay').fadeIn('slow'); + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $('#opc_payment_methods-overlay').fadeIn('slow'); + + // RESET ERROR(S) MESSAGE(S) + $('#opc_account_errors').html('').slideUp('slow'); + + if ($('input#opc_id_customer').val() == 0) + { + var callingFile = authenticationUrl; + var params = 'submitAccount=true&'; + } + else + { + var callingFile = orderOpcUrl; + var params = 'method=editCustomer&'; + } + + $('#opc_account_form input:visible').each(function() { + if ($(this).is('input[type=checkbox]')) + { + if ($(this).is(':checked')) + params += encodeURIComponent($(this).attr('name'))+'=1&'; + } + else if ($(this).is('input[type=radio]')) + { + if ($(this).is(':checked')) + params += encodeURIComponent($(this).attr('name'))+'='+encodeURIComponent($(this).val())+'&'; + } + else + params += encodeURIComponent($(this).attr('name'))+'='+encodeURIComponent($(this).val())+'&'; + }); + $('#opc_account_form select:visible').each(function() { + params += encodeURIComponent($(this).attr('name'))+'='+encodeURIComponent($(this).val())+'&'; + }); + params += 'customer_lastname='+encodeURIComponent($('#customer_lastname').val())+'&'; + params += 'customer_firstname='+encodeURIComponent($('#customer_firstname').val())+'&'; + params += 'alias='+encodeURIComponent($('#alias').val())+'&'; + params += 'other='+encodeURIComponent($('#other').val())+'&'; + params += 'is_new_customer='+encodeURIComponent($('#is_new_customer').val())+'&'; + // Clean the last & + params = params.substr(0, params.length-1); + + $.ajax({ + type: 'POST', + url: callingFile, + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&'+params+'&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var tmp = ''; + var i = 0; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + { + i = i+1; + tmp += '
      1. '+jsonData.errors[error]+'
      2. '; + } + tmp += '
      '; + var errors = ''+txtThereis+' '+i+' '+txtErrors+':
        '+tmp; + $('#opc_account_errors').html(errors).slideDown('slow'); + $.scrollTo('#opc_account_errors', 800); + } + + isGuest = ($('#is_new_customer').val() == 1 ? 0 : 1); + + if (jsonData.id_customer != undefined && jsonData.id_customer != 0 && jsonData.isSaved) + { + // update token + static_token = jsonData.token; + + // update addresses id + $('input#opc_id_address_delivery').val(jsonData.id_address_delivery); + $('input#opc_id_address_invoice').val(jsonData.id_address_invoice); + + // It's not a new customer + if ($('input#opc_id_customer').val() != '0') + { + if (!saveAddress('delivery')) + return false; + } + + // update id_customer + $('input#opc_id_customer').val(jsonData.id_customer); + + if ($('#invoice_address:checked').length != 0) + { + if (!saveAddress('invoice')) + return false; + } + + // update id_customer + $('input#opc_id_customer').val(jsonData.id_customer); + + // force to refresh carrier list + if (isGuest) + { + $('#opc_account_saved').fadeIn('slow'); + $('#submitAccount').hide(); + updateAddressSelection(); + } + else + updateNewAccountToAddressBlock(); + } + $('#opc_new_account-overlay').fadeOut('slow'); + $('#opc_delivery_methods-overlay').fadeOut('slow'); + $('#opc_payment_methods-overlay').fadeOut('slow'); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save account \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); + return false; + }); + } + + // Order message update + $('#message').blur(function() { + $('#opc_delivery_methods-overlay').fadeIn('slow'); + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: false, + cache: false, + dataType : "json", + data: 'ajax=true&method=updateMessage&message=' + encodeURIComponent($('#message').val()) + '&token=' + static_token , + success: function(jsonData) + { + if (jsonData.hasError) + { + var errors = ''; + for(error in jsonData.errors) + //IE6 bug fix + if(error != 'indexOf') + errors += jsonData.errors[error] + "\n"; + alert(errors); + } + else + $('#opc_delivery_methods-overlay').fadeOut('slow'); + }, + error: function(XMLHttpRequest, textStatus, errorThrown) {alert("TECHNICAL ERROR: unable to save message \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus);} + }); + }); + + // Recyclable checkbox + $('input#recyclable').click(function() { + updateCarrierSelectionAndGift(); + }); + + // Gift checkbox update + $('input#gift').click(function() { + if ($('input#gift').is(':checked')) + $('p#gift_div').show(); + else + $('p#gift_div').hide(); + updateCarrierSelectionAndGift(); + }); + + if ($('input#gift').is(':checked')) + $('p#gift_div').show(); + else + $('p#gift_div').hide(); + + // Gift message update + $('textarea#gift_message').blur(function() { + updateCarrierSelectionAndGift(); + }); + + // TOS + $('#cgv').click(function() { + if ($('#cgv:checked').length != 0) + var checked = 1; + else + var checked = 0; + + $('#opc_payment_methods-overlay').fadeIn('slow'); + $.ajax({ + type: 'POST', + url: orderOpcUrl, + async: true, + cache: false, + dataType : "json", + data: 'ajax=true&method=updateTOSStatusAndGetPayments&checked=' + checked + '&token=' + static_token, + success: function(json) + { + $('div#HOOK_TOP_PAYMENT').html(json.HOOK_TOP_PAYMENT); + $('#opc_payment_methods-content div#HOOK_PAYMENT').html(json.HOOK_PAYMENT); + $('#opc_payment_methods-overlay').fadeOut('slow'); + } + }); + }); + + $('#opc_account_form input,select,textarea').change(function() { + if ($(this).is(':visible')) + { + $('#opc_account_saved').fadeOut('slow'); + $('#submitAccount').show(); + } + }); + +}); diff --git a/themes/prestashop/js/product.js b/themes/prestashop/js/product.js new file mode 100644 index 000000000..f2423f1ca --- /dev/null +++ b/themes/prestashop/js/product.js @@ -0,0 +1,528 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7310 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + +//global variables +var combinations = new Array(); +var selectedCombination = new Array(); +var globalQuantity = new Number; +var colors = new Array(); + +//check if a function exists +function function_exists(function_name) +{ + if (typeof function_name == 'string') + return (typeof window[function_name] == 'function'); + return (function_name instanceof Function); +} + +//execute oosHook js code +function oosHookJsCode() +{ + for (var i = 0; i < oosHookJsCodeFunctions.length; i++) + { + if (function_exists(oosHookJsCodeFunctions[i])) + setTimeout(oosHookJsCodeFunctions[i]+'()', 0); + } +} + +//add a combination of attributes in the global JS sytem +function addCombination(idCombination, arrayOfIdAttributes, quantity, price, ecotax, id_image, reference, unit_price, minimal_quantity) +{ + globalQuantity += quantity; + + var combination = new Array(); + combination['idCombination'] = idCombination; + combination['quantity'] = quantity; + combination['idsAttributes'] = arrayOfIdAttributes; + combination['price'] = price; + combination['ecotax'] = ecotax; + combination['image'] = id_image; + combination['reference'] = reference; + combination['unit_price'] = unit_price; + combination['minimal_quantity'] = minimal_quantity; + combinations.push(combination); + +} + +// search the combinations' case of attributes and update displaying of availability, prices, ecotax, and image +function findCombination(firstTime) +{ + $('#minimal_quantity_wanted_p').fadeOut(); + $('#quantity_wanted').val(1); + //create a temporary 'choice' array containing the choices of the customer + var choice = new Array(); + $('div#attributes select').each(function(){ + choice.push($(this).val()); + }); + + //testing every combination to find the conbination's attributes' case of the user + for (var combination = 0; combination < combinations.length; ++combination) + { + //verify if this combinaison is the same that the user's choice + var combinationMatchForm = true; + $.each(combinations[combination]['idsAttributes'], function(key, value) + { + if (!in_array(value, choice)) + { + combinationMatchForm = false; + } + }) + + if (combinationMatchForm) + { + if (combinations[combination]['minimal_quantity'] > 1) + { + $('#minimal_quantity_label').html(combinations[combination]['minimal_quantity']); + $('#minimal_quantity_wanted_p').fadeIn(); + $('#quantity_wanted').val(combinations[combination]['minimal_quantity']); + $('#quantity_wanted').bind('keyup', function() {checkMinimalQuantity(combinations[combination]['minimal_quantity'])}); + } + //combination of the user has been found in our specifications of combinations (created in back office) + selectedCombination['unavailable'] = false; + selectedCombination['reference'] = combinations[combination]['reference']; + $('#idCombination').val(combinations[combination]['idCombination']); + + //get the data of product with these attributes + quantityAvailable = combinations[combination]['quantity']; + selectedCombination['price'] = combinations[combination]['price']; + selectedCombination['unit_price'] = combinations[combination]['unit_price']; + if (combinations[combination]['ecotax']) + selectedCombination['ecotax'] = combinations[combination]['ecotax']; + else + selectedCombination['ecotax'] = default_eco_tax; + + //show the large image in relation to the selected combination + if (combinations[combination]['image'] && combinations[combination]['image'] != -1) + displayImage( $('#thumb_'+combinations[combination]['image']).parent() ); + + //update the display + updateDisplay(); + + if(typeof(firstTime) != 'undefined' && firstTime) + refreshProductImages(0); + else + refreshProductImages(combinations[combination]['idCombination']); + //leave the function because combination has been found + return; + } + } + //this combination doesn't exist (not created in back office) + selectedCombination['unavailable'] = true; + updateDisplay(); +} + +function updateColorSelect(id_attribute) +{ + if (id_attribute == 0) + { + refreshProductImages(0); + return ; + } + // Visual effect + $('#color_'+id_attribute).fadeTo('fast', 1, function(){ $(this).fadeTo('slow', 0, function(){ $(this).fadeTo('slow', 1, function(){}); }); }); + // Attribute selection + $('#group_'+id_color_default+' option[value='+id_attribute+']').attr('selected', 'selected'); + $('#group_'+id_color_default+' option[value!='+id_attribute+']').removeAttr('selected'); + findCombination(); +} + +//update display of the availability of the product AND the prices of the product +function updateDisplay() +{ + if (!selectedCombination['unavailable'] && quantityAvailable > 0 && productAvailableForOrder == 1) + { + //show the choice of quantities + $('#quantity_wanted_p:hidden').show('slow'); + + //show the "add to cart" button ONLY if it was hidden + $('#add_to_cart:hidden').fadeIn(600); + + //hide the hook out of stock + $('#oosHook').hide(); + + //availability value management + if (availableNowValue != '') + { + //update the availability statut of the product + $('#availability_value').removeClass('warning_inline'); + $('#availability_value').text(availableNowValue); + $('#availability_statut:hidden').show(); + } + else + { + //hide the availability value + $('#availability_statut:visible').hide(); + } + + //'last quantities' message management + if (!allowBuyWhenOutOfStock) + { + if (quantityAvailable <= maxQuantityToAllowDisplayOfLastQuantityMessage) + $('#last_quantities').show('slow'); + else + $('#last_quantities').hide('slow'); + } + + if (quantitiesDisplayAllowed) + { + $('#pQuantityAvailable:hidden').show('slow'); + $('#quantityAvailable').text(quantityAvailable); + + if (quantityAvailable < 2) // we have 1 or less product in stock and need to show "item" instead of "items" + { + $('#quantityAvailableTxt').show(); + $('#quantityAvailableTxtMultiple').hide(); + } + else + { + $('#quantityAvailableTxt').hide(); + $('#quantityAvailableTxtMultiple').show(); + } + } + } + else + { + //show the hook out of stock + if (productAvailableForOrder == 1) + { + $('#oosHook').show(); + if ($('#oosHook').length > 0 && function_exists('oosHookJsCode')) + oosHookJsCode(); + } + + //hide 'last quantities' message if it was previously visible + $('#last_quantities:visible').hide('slow'); + + //hide the quantity of pieces if it was previously visible + $('#pQuantityAvailable:visible').hide('slow'); + + //hide the choice of quantities + if (!allowBuyWhenOutOfStock) + $('#quantity_wanted_p:visible').hide('slow'); + + //display that the product is unavailable with theses attributes + if (!selectedCombination['unavailable']) + $('#availability_value').text(doesntExistNoMore + (globalQuantity > 0 ? ' ' + doesntExistNoMoreBut : '')).addClass('warning_inline'); + else + { + $('#availability_value').text(doesntExist).addClass('warning_inline'); + $('#oosHook').hide(); + } + $('#availability_statut:hidden').show(); + + + //show the 'add to cart' button ONLY IF it's possible to buy when out of stock AND if it was previously invisible + if (allowBuyWhenOutOfStock && !selectedCombination['unavailable'] && productAvailableForOrder == 1) + { + $('#add_to_cart:hidden').fadeIn(600); + + if (availableLaterValue != '') + { + $('#availability_value').text(availableLaterValue); + $('p#availability_statut:hidden').show('slow'); + } + else + $('p#availability_statut:visible').hide('slow'); + } + else + { + $('#add_to_cart:visible').fadeOut(600); + $('p#availability_statut:hidden').show('slow'); + } + + if (productAvailableForOrder == 0) + $('p#availability_statut:visible').hide(); + } + + if (selectedCombination['reference'] || productReference) + { + if (selectedCombination['reference']) + $('#product_reference span').text(selectedCombination['reference']); + else if (productReference) + $('#product_reference span').text(productReference); + $('#product_reference:hidden').show('slow'); + } + else + $('#product_reference:visible').hide('slow'); + + //update display of the the prices in relation to tax, discount, ecotax, and currency criteria + if (!selectedCombination['unavailable'] && productShowPrice == 1) + { + // retrieve price without group_reduction in order to compute the group reduction after + // the specific price discount (done in the JS in order to keep backward compatibility) + if (!displayPrice && !noTaxForThisProduct) + { + var priceTaxExclWithoutGroupReduction = ps_round(productPriceTaxExcluded, 6) * (1 / group_reduction); + } else { + var priceTaxExclWithoutGroupReduction = ps_round(productPriceTaxExcluded, 6) * (1 / group_reduction); + } + var combination_add_price = selectedCombination['price'] * group_reduction; + + var tax = (taxRate / 100) + 1; + var taxExclPrice = (specific_price ? (specific_currency ? specific_price : specific_price * currencyRate) : priceTaxExclWithoutGroupReduction) + selectedCombination['price'] * currencyRate; + + if (specific_price) + var productPriceWithoutReduction = priceTaxExclWithoutGroupReduction + selectedCombination['price'] * currencyRate; + + if (!displayPrice && !noTaxForThisProduct) + { + var productPrice = taxExclPrice * tax; + if (specific_price) + productPriceWithoutReduction = ps_round(productPriceWithoutReduction * tax, 2); + } + else + { + var productPrice = ps_round(taxExclPrice, 2); + if (specific_price) + productPriceWithoutReduction = ps_round(productPriceWithoutReduction, 2); + } + + var reduction = 0; + if (reduction_price || reduction_percent) + { + reduction = productPrice * (parseFloat(reduction_percent) / 100) + reduction_price; + if (reduction_price && (displayPrice || noTaxForThisProduct)) + reduction = ps_round(reduction / tax, 6); + } + + if (!specific_price) + productPriceWithoutReduction = productPrice * group_reduction; + + + productPrice -= reduction; + var tmp = productPrice * group_reduction; + productPrice = ps_round(productPrice * group_reduction, 2); + + var ecotaxAmount = !displayPrice ? ps_round(selectedCombination['ecotax'] * (1 + ecotaxTax_rate / 100), 2) : selectedCombination['ecotax']; + productPrice += ecotaxAmount; + productPriceWithoutReduction += ecotaxAmount; + + //productPrice = ps_round(productPrice * currencyRate, 2); + if (productPrice > 0) + $('#our_price_display').text(formatCurrency(productPrice, currencyFormat, currencySign, currencyBlank)); + else + $('#our_price_display').text(formatCurrency(0, currencyFormat, currencySign, currencyBlank)); + + $('#old_price_display').text(formatCurrency(productPriceWithoutReduction, currencyFormat, currencySign, currencyBlank)); + + /* Special feature: "Display product price tax excluded on product page" */ + if (!noTaxForThisProduct) + var productPricePretaxed = productPrice / tax; + else + var productPricePretaxed = productPrice; + $('#pretaxe_price_display').text(formatCurrency(productPricePretaxed, currencyFormat, currencySign, currencyBlank)); + /* Unit price */ + productUnitPriceRatio = parseFloat(productUnitPriceRatio); + if (productUnitPriceRatio > 0 ) + { + newUnitPrice = (productPrice / parseFloat(productUnitPriceRatio)) + selectedCombination['unit_price']; + $('#unit_price_display').text(formatCurrency(newUnitPrice, currencyFormat, currencySign, currencyBlank)); + } + + /* Ecotax */ + var ecotaxAmount = !displayPrice ? ps_round(selectedCombination['ecotax'] * (1 + ecotaxTax_rate / 100), 2) : selectedCombination['ecotax']; + $('#ecotax_price_display').text(formatCurrency(ecotaxAmount, currencyFormat, currencySign, currencyBlank)); + } +} + +//update display of the large image +function displayImage(domAAroundImgThumb) +{ + if (domAAroundImgThumb.attr('href')) + { + var newSrc = domAAroundImgThumb.attr('href').replace('thickbox','large'); + if ($('#bigpic').attr('src') != newSrc) + { + $('#bigpic').fadeOut('fast', function(){ + $(this).attr('src', newSrc).show(); + if (typeof(jqZoomEnabled) != 'undefined' && jqZoomEnabled) + $(this).attr('alt', domAAroundImgThumb.attr('href')); + }); + } + $('#views_block li a').removeClass('shown'); + $(domAAroundImgThumb).addClass('shown'); + } +} + +// Serialscroll exclude option bug ? +function serialScrollFixLock(event, targeted, scrolled, items, position) +{ + serialScrollNbImages = $('#thumbs_list li:visible').length; + serialScrollNbImagesDisplayed = 3; + + var leftArrow = position == 0 ? true : false; + var rightArrow = position + serialScrollNbImagesDisplayed >= serialScrollNbImages ? true : false; + + $('a#view_scroll_left').css('cursor', leftArrow ? 'default' : 'pointer').css('display', leftArrow ? 'none' : 'block').fadeTo(0, leftArrow ? 0 : 1); + $('a#view_scroll_right').css('cursor', rightArrow ? 'default' : 'pointer').fadeTo(0, rightArrow ? 0 : 1).css('display', rightArrow ? 'none' : 'block'); + return true; +} + +// Change the current product images regarding the combination selected +function refreshProductImages(id_product_attribute) +{ + $('#thumbs_list_frame').scrollTo('li:eq(0)', 700, {axis:'x'}); + $('#thumbs_list li').hide(); + id_product_attribute = parseInt(id_product_attribute); + + if (typeof(combinationImages) != 'undefined' && typeof(combinationImages[id_product_attribute]) != 'undefined') + { + for (var i = 0; i < combinationImages[id_product_attribute].length; i++) + $('#thumbnail_' + parseInt(combinationImages[id_product_attribute][i])).show(); + } + if (i > 0) + { + var thumb_width = $('#thumbs_list_frame >li').width()+parseInt($('#thumbs_list_frame >li').css('marginRight')); + $('#thumbs_list_frame').width((parseInt((thumb_width)* i) + 3) + 'px'); // Bug IE6, needs 3 pixels more ? + } + else + { + $('#thumbnail_' + idDefaultImage).show(); + displayImage($('#thumbnail_'+ idDefaultImage +' a')); + } + $('#thumbs_list').trigger('goto', 0); + serialScrollFixLock('', '', '', '', 0);// SerialScroll Bug on goto 0 ? +} + +//To do after loading HTML +$(document).ready(function() +{ + //init the serialScroll for thumbs + $('#thumbs_list').serialScroll({ + items:'li:visible', + prev:'a#view_scroll_left', + next:'a#view_scroll_right', + axis:'x', + offset:0, + start:0, + stop:true, + onBefore:serialScrollFixLock, + duration:700, + step: 2, + lazy: true, + lock: false, + force:false, + cycle:false + }); + + $('#thumbs_list').trigger('goto', 1);// SerialScroll Bug on goto 0 ? + $('#thumbs_list').trigger('goto', 0); + + //hover 'other views' images management + $('#views_block li a').hover( + function(){displayImage($(this));}, + function(){} + ); + + //set jqZoom parameters if needed + if (typeof(jqZoomEnabled) != 'undefined' && jqZoomEnabled) + { + $('img.jqzoom').jqueryzoom({ + xzoom: 200, //zooming div default width(default width value is 200) + yzoom: 200, //zooming div default width(default height value is 200) + offset: 21 //zooming div default offset(default offset value is 10) + //position: "right" //zooming div position(default position value is "right") + }); + } + + //add a link on the span 'view full size' and on the big image + $('span#view_full_size, div#image-block img').click(function(){ + $('#views_block li a.shown').click(); + }); + + //catch the click on the "more infos" button at the top of the page + $('div#short_description_block p a.button').click(function(){ + $('#more_info_tab_more_info').click(); + $.scrollTo( '#more_info_tabs', 1200 ); + }); + + // Hide the customization submit button and display some message + $('p#customizedDatas input').click(function() { + $('p#customizedDatas input').hide(); + $('#ajax-loader').fadeIn(); + $('p#customizedDatas').append(uploading_in_progress); + }); + + //init the price in relation of the selected attributes + if (typeof productHasAttributes != 'undefined' && productHasAttributes) + findCombination(true); + else if (typeof productHasAttributes != 'undefined' && !productHasAttributes) + refreshProductImages(0); + + // + $('a#resetImages').click(function() { + updateColorSelect(0); + }); + + $('.thickbox').fancybox({ + 'hideOnContentClick': true, + 'transitionIn' : 'elastic', + 'transitionOut' : 'elastic' + }); +}); + +function saveCustomization() +{ + $('#quantityBackup').val($('#quantity_wanted').val()); + customAction = $('#customizationForm').attr('action'); + $('body select[id^="group_"]').each(function() { + customAction = customAction.replace(new RegExp(this.id + '=\\d+'), this.id +'='+this.value); + }); + $('#customizationForm').attr('action', customAction); + $('#customizationForm').submit(); +} + +function submitPublishProduct(url, redirect) +{ + var id_product = $('#admin-action-product-id').val(); + + $.ajaxSetup({async: false}); + $.post(url+'/ajax.php', { submitPublishProduct: '1', id_product: id_product, status: 1, redirect: redirect }, + function(data) + { + if (data.indexOf('error') === -1) + document.location.href = data; + } + ); + + return true; +} + +function checkMinimalQuantity(minimal_quantity) +{ + if ($('#quantity_wanted').val() < minimal_quantity) + { + $('#quantity_wanted').css('border', '1px solid red'); + $('#minimal_quantity_wanted_p').css('color', 'red'); + } + else + { + $('#quantity_wanted').css('border', '1px solid #BDC2C9'); + $('#minimal_quantity_wanted_p').css('color', '#374853'); + } +} + diff --git a/themes/prestashop/js/products-comparison.js b/themes/prestashop/js/products-comparison.js new file mode 100644 index 000000000..7bc2a7dfc --- /dev/null +++ b/themes/prestashop/js/products-comparison.js @@ -0,0 +1,53 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function checkBeforeComparison() +{ + var id_list = ''; + $('.comparator:checked').each( + function() + { + id_list += $(this).val() + '|'; + } + ); + + $('.compare_product_list').val(id_list); + + if ($('.comparator:checked').length == 0) + { + alert(min_item); + return false; + } + + return true; +} + +function checkForComparison(nb_max_item) +{ + if ($('.comparator:checked').length > nb_max_item) + alert(max_item); +} + diff --git a/themes/prestashop/js/scenes.js b/themes/prestashop/js/scenes.js new file mode 100644 index 000000000..095a57d29 --- /dev/null +++ b/themes/prestashop/js/scenes.js @@ -0,0 +1,92 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +nb_move_available = null; +current_move = 0; +next_scene_is_at_right = true; + +function loadScene(id_scene){ + $('#scenes').find('.screen_scene:visible').fadeTo(300, 0, function(){ + $(this).hide(); + $('#scenes').find('#screen_scene_' + id_scene).css('opacity', '0').show().fadeTo(500, 1); + }); + return false; +} + +function onSceneMove(){ + if (next_scene_is_at_right) current_move++; + else current_move--; + if (current_move == nb_move_available - 1) $('#scenes .next').fadeOut(); + else $('#scenes .next:hidden').fadeIn().css('display','block'); + if (current_move == 0) $('#scenes .prev').fadeOut().css('display','block'); + else $('#scenes .prev').fadeIn().css('display','block'); + return true; +} + +$(function () { + /* calcul nb of click to see every scenes */ + var ul_width = parseInt($('#scenes_list ul').width()); + var div_width = parseInt($('#scenes_list').width()); + nb_move_available = Math.ceil((ul_width-div_width)/li_width)+1; + if (nb_move_available < 2) + $('#scenes .next').hide(); + + /* set cluetip parameters */ + $('a.cluetip') + .cluetip({ + local:true, + cursor: 'pointer', + attribute:'accesskey', + cluetipClass: 'product_scene', + dropShadow: false, + dropShadowSteps: 0, + showTitle: false, + tracking: true, + sticky: false, + mouseOutClose: true, + closeText: i18n_scene_close, + fx: { + open: 'fadeIn', + openSpeed: 'fast' + } + }) + .css('opacity', 0.8); + + /* set serialscroll parameters */ + $('#scenes_list').serialScroll({ + items:'a', + duration:1000, + lock:false, + axis:'x', + cycle:false, + force:true, + lazy:true, + step:1, + onBefore:onSceneMove + }); + $('#scenes_list').trigger( 'goto', 0); + +}); diff --git a/themes/prestashop/js/stores.js b/themes/prestashop/js/stores.js new file mode 100644 index 000000000..79196bf19 --- /dev/null +++ b/themes/prestashop/js/stores.js @@ -0,0 +1,217 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function initMarkers() +{ + var localSearchUrl = searchUrl + '?ajax=1&all=1'; + downloadUrl(localSearchUrl, function(data) { + var xml = parseXml(data); + var markerNodes = xml.documentElement.getElementsByTagName('marker'); + var bounds = new google.maps.LatLngBounds(); + for (var i = 0; i < markerNodes.length; i++) + { + var name = markerNodes[i].getAttribute('name'); + var address = markerNodes[i].getAttribute('address'); + var addressNoHtml = markerNodes[i].getAttribute('addressNoHtml'); + var other = markerNodes[i].getAttribute('other'); + var id_store = markerNodes[i].getAttribute('id_store'); + var has_store_picture = markerNodes[i].getAttribute('has_store_picture'); + var latlng = new google.maps.LatLng( + parseFloat(markerNodes[i].getAttribute('lat')), + parseFloat(markerNodes[i].getAttribute('lng'))); + createMarker(latlng, name, address, addressNoHtml, other, id_store, has_store_picture); + bounds.extend(latlng); + } +}); +} + +function searchLocations() +{ + $('#stores_loader').show(); + var address = document.getElementById('addressInput').value; + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({address: address}, function(results, status) { + if (status == google.maps.GeocoderStatus.OK) + searchLocationsNear(results[0].geometry.location); + else + alert(address+' '+translation_6); + $('#stores_loader').hide(); + }); +} + +function clearLocations(n) +{ + infoWindow.close(); + for (var i = 0; i < markers.length; i++) + markers[i].setMap(null); + + markers.length = 0; + + locationSelect.innerHTML = ''; + var option = document.createElement('option'); + option.value = 'none'; + if (!n) + option.innerHTML = translation_1; + else + { + if (n == 1) + option.innerHTML = '1'+' '+translation_2; + else + option.innerHTML = n+' '+translation_3; + } + locationSelect.appendChild(option); + $('#stores-table tr.node').remove(); + initMarkers(); +} + +function searchLocationsNear(center) +{ + var radius = document.getElementById('radiusSelect').value; + var localSearchUrl = searchUrl + '?ajax=1&latitude=' + center.lat() + '&longitude=' + center.lng() + '&radius=' + radius; + downloadUrl(localSearchUrl, function(data) { + var xml = parseXml(data); + var markerNodes = xml.documentElement.getElementsByTagName('marker'); + var bounds = new google.maps.LatLngBounds(); + + clearLocations(markerNodes.length); + for (var i = 0; i < markerNodes.length; i++) + { + var name = markerNodes[i].getAttribute('name'); + var address = markerNodes[i].getAttribute('address'); + var addressNoHtml = markerNodes[i].getAttribute('addressNoHtml'); + var other = markerNodes[i].getAttribute('other'); + var distance = parseFloat(markerNodes[i].getAttribute('distance')); + var id_store = parseFloat(markerNodes[i].getAttribute('id_store')); + var phone = markerNodes[i].getAttribute('phone'); + var has_store_picture = markerNodes[i].getAttribute('has_store_picture'); + var latlng = new google.maps.LatLng( + parseFloat(markerNodes[i].getAttribute('lat')), + parseFloat(markerNodes[i].getAttribute('lng'))); + + createOption(name, distance, i); + createMarker(latlng, name, address, addressNoHtml, other, id_store, has_store_picture); + bounds.extend(latlng); + + $('#stores-table tr:last').after(''+parseInt(i + 1)+''+name+''+(has_store_picture == 1 ? '
        ' : '')+''+address+(phone != '' ? '

        '+translation_4+' '+phone : '')+''+distance+' '+distance_unit+''); + $('#stores-table').show(); + } + + if (markerNodes.length) + { + map.fitBounds(bounds); + var listener = google.maps.event.addListener(map, "idle", function() { + if (map.getZoom() > 13) map.setZoom(13); + google.maps.event.removeListener(listener); + }); + } + locationSelect.style.visibility = 'visible'; + locationSelect.onchange = function() { + var markerNum = locationSelect.options[locationSelect.selectedIndex].value; + google.maps.event.trigger(markers[markerNum], 'click'); + }; + }); +} + +function createMarker(latlng, name, address, addressNoHtml, other, id_store, has_store_picture) +{ + var html = ''+name+'
        '+address+(has_store_picture == 1 ? '

        ' : '')+other+'
        '+translation_5+'<\/a>'; + var image = new google.maps.MarkerImage(img_ps_dir+'logo_stores.gif'); + if (hasStoreIcon) + var marker = new google.maps.Marker({ map: map, icon: image, position: latlng }); + else + var marker = new google.maps.Marker({ map: map, position: latlng }); + google.maps.event.addListener(marker, 'click', function() { + infoWindow.setContent(html); + infoWindow.open(map, marker); + }); + markers.push(marker); +} + +function createOption(name, distance, num) +{ + var option = document.createElement('option'); + option.value = num; + option.innerHTML = name+' ('+distance.toFixed(1)+' '+distance_unit+')'; + locationSelect.appendChild(option); +} + +function downloadUrl(url, callback) +{ + var request = window.ActiveXObject ? + new ActiveXObject('Microsoft.XMLHTTP') : + new XMLHttpRequest; + + request.onreadystatechange = function() { + if (request.readyState == 4) { + request.onreadystatechange = doNothing; + callback(request.responseText, request.status); + } + }; + + request.open('GET', url, true); + request.send(null); +} + +function parseXml(str) +{ + if (window.ActiveXObject) { + var doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.loadXML(str); + return doc; + } + else if (window.DOMParser) { + return (new DOMParser).parseFromString(str, 'text/xml'); + } +} + +function doNothing() {} + +$(document).ready(function() +{ + map = new google.maps.Map(document.getElementById('map'), { + center: new google.maps.LatLng(defaultLat, defaultLong), + zoom: 10, + mapTypeId: 'roadmap', + mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU} + }); + infoWindow = new google.maps.InfoWindow(); + + locationSelect = document.getElementById('locationSelect'); + locationSelect.onchange = function() { + var markerNum = locationSelect.options[locationSelect.selectedIndex].value; + if (markerNum != 'none') + google.maps.event.trigger(markers[markerNum], 'click'); + }; + + $('#addressInput').keypress(function(e) { + code = e.keyCode ? e.keyCode : e.which; + if(code.toString() == 13) + searchLocations(); + }); + + + initMarkers(); +}); diff --git a/themes/prestashop/js/tools.js b/themes/prestashop/js/tools.js new file mode 100644 index 000000000..04ee1ba7d --- /dev/null +++ b/themes/prestashop/js/tools.js @@ -0,0 +1,226 @@ +/* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +function ps_round(value, precision) +{ + if (typeof(roundMode) == 'undefined') + roundMode = 2; + if (typeof(precision) == 'undefined') + precision = 2; + + method = roundMode; + if (method == 0) + return ceilf(value, precision); + else if (method == 1) + return floorf(value, precision); + precisionFactor = precision == 0 ? 1 : Math.pow(10, precision); + return Math.round(value * precisionFactor) / precisionFactor; +} + +function ceilf(value, precision) +{ + if (typeof(precision) == 'undefined') + precision = 0; + precisionFactor = precision == 0 ? 1 : Math.pow(10, precision); + tmp = value * precisionFactor; + tmp2 = tmp.toString(); + if (tmp2[tmp2.length - 1] == 0) + return value; + return Math.ceil(value * precisionFactor) / precisionFactor; +} + +function floorf(value, precision) +{ + if (typeof(precision) == 'undefined') + precision = 0; + precisionFactor = precision == 0 ? 1 : Math.pow(10, precision); + tmp = value * precisionFactor; + tmp2 = tmp.toString(); + if (tmp2[tmp2.length - 1] == 0) + return value; + return Math.floor(value * precisionFactor) / precisionFactor; +} + +function formatedNumberToFloat(price, currencyFormat, currencySign) +{ + price = price.replace(currencySign, ''); + if (currencyFormat == 1) + return parseFloat(price.replace(',', '').replace(' ', '')); + else if (currencyFormat == 2) + return parseFloat(price.replace(' ', '').replace(',', '.')); + else if (currencyFormat == 3) + return parseFloat(price.replace('.', '').replace(' ', '').replace(',', '.')); + else if (currencyFormat == 4) + return parseFloat(price.replace(',', '').replace(' ', '')); + return price; +} + +//return a formatted price +function formatCurrency(price, currencyFormat, currencySign, currencyBlank) +{ + // if you modified this function, don't forget to modify the PHP function displayPrice (in the Tools.php class) + blank = ''; + price = parseFloat(price.toFixed(6)); + price = ps_round(price, priceDisplayPrecision); + if (currencyBlank > 0) + blank = ' '; + if (currencyFormat == 1) + return currencySign + blank + formatNumber(price, priceDisplayPrecision, ',', '.'); + if (currencyFormat == 2) + return (formatNumber(price, priceDisplayPrecision, ' ', ',') + blank + currencySign); + if (currencyFormat == 3) + return (currencySign + blank + formatNumber(price, priceDisplayPrecision, '.', ',')); + if (currencyFormat == 4) + return (formatNumber(price, priceDisplayPrecision, ',', '.') + blank + currencySign); + return price; +} + +//return a formatted number +function formatNumber(value, numberOfDecimal, thousenSeparator, virgule) +{ + value = value.toFixed(numberOfDecimal); + var val_string = value+''; + var tmp = val_string.split('.'); + var abs_val_string = (tmp.length == 2) ? tmp[0] : val_string; + var deci_string = ('0.' + (tmp.length == 2 ? tmp[1] : 0)).substr(2); + var nb = abs_val_string.length; + + for (var i = 1 ; i < 4; i++) + if (value >= Math.pow(10, (3 * i))) + abs_val_string = abs_val_string.substring(0, nb - (3 * i)) + thousenSeparator + abs_val_string.substring(nb - (3 * i)); + + if (parseInt(numberOfDecimal) == 0) + return abs_val_string; + return abs_val_string + virgule + (deci_string > 0 ? deci_string : '00'); +} + +//change the text of a jQuery element with a sliding effect (velocity could be a number in ms, 'slow' or 'fast', effect1 and effect2 could be slide, fade, hide, show) +function updateTextWithEffect(jQueryElement, text, velocity, effect1, effect2, newClass) +{ + if(jQueryElement.text() != text) + if(effect1 == 'fade') + jQueryElement.fadeOut(velocity, function(){ + $(this).addClass(newClass); + if(effect2 == 'fade') $(this).text(text).fadeIn(velocity); + else if(effect2 == 'slide') $(this).text(text).slideDown(velocity); + else if(effect2 == 'show') $(this).text(text).show(velocity, function(){}); + }); + else if(effect1 == 'slide') + jQueryElement.slideUp(velocity, function(){ + $(this).addClass(newClass); + if(effect2 == 'fade') $(this).text(text).fadeIn(velocity); + else if(effect2 == 'slide') $(this).text(text).slideDown(velocity); + else if(effect2 == 'show') $(this).text(text).show(velocity); + }); + else if(effect1 == 'hide') + jQueryElement.hide(velocity, function(){ + $(this).addClass(newClass); + if(effect2 == 'fade') $(this).text(text).fadeIn(velocity); + else if(effect2 == 'slide') $(this).text(text).slideDown(velocity); + else if(effect2 == 'show') $(this).text(text).show(velocity); + }); +} + +//show a JS debug +function dbg(value) +{ + var active = false;//true for active + var firefox = true;//true if debug under firefox + + if (active) + if (firefox) + console.log(value); + else + alert(value); +} + +/** +* Function : print_r() +* Arguments: The data - array,hash(associative array),object +* The level - OPTIONAL +* Returns : The textual representation of the array. +* This function was inspired by the print_r function of PHP. +* This will accept some data as the argument and return a +* text that will be a more readable version of the +* array/hash/object that is given. +*/ +function print_r(arr, level) +{ + var dumped_text = ""; + if (!level) + level = 0; + + //The padding given at the beginning of the line. + var level_padding = ""; + for (var j = 0 ; j < level + 1; j++) + level_padding += " "; + + if (typeof(arr) == 'object') + { //Array/Hashes/Objects + for (var item in arr) + { + var value = arr[item]; + if (typeof(value) == 'object') { //If it is an array, + dumped_text += level_padding + "'" + item + "' ...\n"; + dumped_text += dump(value,level+1); + } + else + { + dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n"; + } + } + } + else + { //Stings/Chars/Numbers etc. + dumped_text = "===>" + arr + "<===("+typeof(arr)+")"; + } + return dumped_text; +} + +//verify if value is in the array +function in_array(value, array) +{ + for (var i in array) + if (array[i] == value) + return true; + return false; +} + +function resizeAddressesBox(nameBox) +{ + maxHeight = 0; + + if (typeof(nameBox) == 'undefined') + nameBox = '.address'; + $(nameBox).each(function() + { + $(this).css('height', 'auto'); + currentHeight = $(this).height(); + if (maxHeight < currentHeight) + maxHeight = currentHeight; + }); + $(nameBox).height(maxHeight); +} diff --git a/themes/prestashop/js/tools/statesManagement.js b/themes/prestashop/js/tools/statesManagement.js new file mode 100644 index 000000000..94317f785 --- /dev/null +++ b/themes/prestashop/js/tools/statesManagement.js @@ -0,0 +1,61 @@ +$(document).ready(function(){ + $('select#id_country').change(function(){ + updateState(); + updateNeedIDNumber(); + updateZipCode(); + }); + updateState(); + updateNeedIDNumber(); + updateZipCode(); + + if ($('select#id_country_invoice').length != 0) + { + $('select#id_country_invoice').change(function(){ + updateState('invoice'); + updateNeedIDNumber('invoice'); + updateZipCode(); + }); + if ($('select#id_country_invoice:visible').length != 0) + { + updateState('invoice'); + updateNeedIDNumber('invoice'); + updateZipCode('invoice'); + } + } +}); + +function updateState(suffix) +{ + $('select#id_state'+(suffix !== undefined ? '_'+suffix : '')+' option:not(:first-child)').remove(); + var states = countries[$('select#id_country'+(suffix !== undefined ? '_'+suffix : '')).val()]; + if(typeof(states) != 'undefined') + { + $(states).each(function (key, item){ + $('select#id_state'+(suffix !== undefined ? '_'+suffix : '')).append(''); + }); + + $('p.id_state'+(suffix !== undefined ? '_'+suffix : '')+':hidden').slideDown('slow'); + } + else + $('p.id_state'+(suffix !== undefined ? '_'+suffix : '')).slideUp('fast'); +} + +function updateNeedIDNumber(suffix) +{ + var idCountry = parseInt($('select#id_country'+(suffix !== undefined ? '_'+suffix : '')).val()); + + if ($.inArray(idCountry, countriesNeedIDNumber) >= 0) + $('.dni'+(suffix !== undefined ? '_'+suffix : '')).slideDown('slow'); + else + $('.dni'+(suffix !== undefined ? '_'+suffix : '')).slideUp('fast'); +} + +function updateZipCode(suffix) +{ + var idCountry = parseInt($('select#id_country'+(suffix !== undefined ? '_'+suffix : '')).val()); + + if (countriesNeedZipCode[idCountry] != 0) + $('.postcode'+(suffix !== undefined ? '_'+suffix : '')).slideDown('slow'); + else + $('.postcode'+(suffix !== undefined ? '_'+suffix : '')).slideUp('fast'); +} diff --git a/themes/prestashop/js/tools/treeManagement.js b/themes/prestashop/js/tools/treeManagement.js new file mode 100644 index 000000000..dc308b578 --- /dev/null +++ b/themes/prestashop/js/tools/treeManagement.js @@ -0,0 +1,57 @@ +//animate the opening of the branch (span.grower jQueryElement) +function openBranch(jQueryElement, noAnimation) { + jQueryElement.addClass('OPEN').removeClass('CLOSE'); + if(noAnimation) + jQueryElement.parent().find('ul:first').show(); + else + jQueryElement.parent().find('ul:first').slideDown(); +} +//animate the closing of the branch (span.grower jQueryElement) +function closeBranch(jQueryElement, noAnimation) { + jQueryElement.addClass('CLOSE').removeClass('OPEN'); + if(noAnimation) + jQueryElement.parent().find('ul:first').hide(); + else + jQueryElement.parent().find('ul:first').slideUp(); +} + +//animate the closing or opening of the branch (ul jQueryElement) +function toggleBranch(jQueryElement, noAnimation) { + if(jQueryElement.hasClass('OPEN')) + closeBranch(jQueryElement, noAnimation); + else + openBranch(jQueryElement, noAnimation); +} + +//when the page is loaded... +$(document).ready(function () { + //to do not execute this script as much as it's called... + if(!$('ul.tree.dhtml').hasClass('dynamized')) + { + //add growers to each ul.tree elements + $('ul.tree.dhtml ul').prev().before(" "); + + //dynamically add the '.last' class on each last item of a branch + $('ul.tree.dhtml ul li:last-child, ul.tree.dhtml li:last-child').addClass('last'); + + //collapse every expanded branch + $('ul.tree.dhtml span.grower.OPEN').addClass('CLOSE').removeClass('OPEN').parent().find('ul:first').hide(); + $('ul.tree.dhtml').show(); + + //open the tree for the selected branch + $('ul.tree.dhtml .selected').parents().each( function() { + if ($(this).is('ul')) + toggleBranch($(this).prev().prev(), true); + }); + toggleBranch( $('ul.tree.dhtml .selected').prev(), true); + + //add a fonction on clicks on growers + $('ul.tree.dhtml span.grower').click(function(){ + toggleBranch($(this)); + }); + //mark this 'ul.tree' elements as already 'dynamized' + $('ul.tree.dhtml').addClass('dynamized'); + + $('ul.tree.dhtml').removeClass('dhtml'); + } +}); diff --git a/themes/prestashop/lang/de.php b/themes/prestashop/lang/de.php new file mode 100644 index 000000000..a7f4a2a21 --- /dev/null +++ b/themes/prestashop/lang/de.php @@ -0,0 +1,719 @@ + diff --git a/themes/prestashop/lang/en.php b/themes/prestashop/lang/en.php new file mode 100644 index 000000000..697d7f9b4 --- /dev/null +++ b/themes/prestashop/lang/en.php @@ -0,0 +1,6 @@ + diff --git a/themes/prestashop/lang/es.php b/themes/prestashop/lang/es.php new file mode 100644 index 000000000..abc580753 --- /dev/null +++ b/themes/prestashop/lang/es.php @@ -0,0 +1,732 @@ + diff --git a/themes/prestashop/lang/fr.php b/themes/prestashop/lang/fr.php new file mode 100644 index 000000000..c7796209a --- /dev/null +++ b/themes/prestashop/lang/fr.php @@ -0,0 +1,732 @@ + \ No newline at end of file diff --git a/themes/prestashop/lang/it.php b/themes/prestashop/lang/it.php new file mode 100755 index 000000000..46d2c389e --- /dev/null +++ b/themes/prestashop/lang/it.php @@ -0,0 +1,711 @@ + \ No newline at end of file diff --git a/themes/prestashop/maintenance.tpl b/themes/prestashop/maintenance.tpl new file mode 100644 index 000000000..93fda5137 --- /dev/null +++ b/themes/prestashop/maintenance.tpl @@ -0,0 +1,51 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + {$meta_title|escape:'htmlall':'UTF-8'} + +{if isset($meta_description)} + +{/if} +{if isset($meta_keywords)} + +{/if} + + + + + +
        +

        logo

        +

        + {l s='In order to perform site maintenance, our online shop has shut down temporarily. We apologize for the inconvenience and ask that you please try again later.'} +

        +   +
        + + diff --git a/themes/prestashop/manufacturer-list.tpl b/themes/prestashop/manufacturer-list.tpl new file mode 100644 index 000000000..dac52fe15 --- /dev/null +++ b/themes/prestashop/manufacturer-list.tpl @@ -0,0 +1,85 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Manufacturers'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Manufacturers'}

        + +{if isset($errors) AND $errors} + {include file="$tpl_dir./errors.tpl"} +{else} +

        {strip} + + {if $nbManufacturers == 0}{l s='There are no manufacturers.'} + {else} + {if $nbManufacturers == 1}{l s='There is'}{else}{l s='There are'}{/if}  + {$nbManufacturers}  + {if $nbManufacturers == 1}{l s='manufacturer.'}{else}{l s='manufacturers.'}{/if} + {/if} + {/strip} +

        + + {if $nbManufacturers > 0} +
        + {include file="$tpl_dir./pagination.tpl"} + {/if} +{/if} diff --git a/themes/prestashop/manufacturer.tpl b/themes/prestashop/manufacturer.tpl new file mode 100644 index 000000000..31ebd62d8 --- /dev/null +++ b/themes/prestashop/manufacturer.tpl @@ -0,0 +1,41 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{include file="$tpl_dir./breadcrumb.tpl"} + +{include file="$tpl_dir./errors.tpl"} + +{if !isset($errors) OR !sizeof($errors)} +

        {l s='List of products by manufacturer:'} {$manufacturer->name|escape:'htmlall':'UTF-8'}

        + + {if $products} + {include file="$tpl_dir./product-sort.tpl"} + {include file="$tpl_dir./product-list.tpl" products=$products} + {include file="$tpl_dir./pagination.tpl"} + {else} +

        {l s='No products for this manufacturer.'}

        + {/if} +{/if} diff --git a/themes/prestashop/my-account.tpl b/themes/prestashop/my-account.tpl new file mode 100644 index 000000000..b881665d4 --- /dev/null +++ b/themes/prestashop/my-account.tpl @@ -0,0 +1,51 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7075 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{capture name=path}{l s='My account'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='My account'}

        +

        {l s='Welcome to your account. Here you can manage your addresses and orders.'}

        + +

        {l s='Home'}{l s='Home'}

        diff --git a/themes/prestashop/new-products.tpl b/themes/prestashop/new-products.tpl new file mode 100644 index 000000000..17b7eb131 --- /dev/null +++ b/themes/prestashop/new-products.tpl @@ -0,0 +1,38 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='New products'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='New products'}

        + +{if $products} + {include file="$tpl_dir./product-sort.tpl"} + {include file="$tpl_dir./product-list.tpl" products=$products} + {include file="$tpl_dir./pagination.tpl"} +{else} +

        {l s='No new products.'}

        +{/if} diff --git a/themes/prestashop/order-address.tpl b/themes/prestashop/order-address.tpl new file mode 100644 index 000000000..b777b6a4a --- /dev/null +++ b/themes/prestashop/order-address.tpl @@ -0,0 +1,195 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{if !$opc} +{capture name=path}{l s='Addresses'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} +{/if} + +{if !$opc}

        {l s='Addresses'}

        {else}

        1. {l s='Addresses'}

        {/if} + +{if !$opc} +{assign var='current_step' value='address'} +{include file="$tpl_dir./order-steps.tpl"} +{include file="$tpl_dir./errors.tpl"} +
        +{else} +
        + +{/if} +
        +

        + + +

        +

        + id_address_invoice == $cart->id_address_delivery || $addresses|@count == 1}checked="checked"{/if} /> + +

        + +

        id_address_invoice == $cart->id_address_delivery}style="display: none;"{/if}> + + {if $addresses|@count > 1} + + + {else} + {if $back} + {l s='Add a new address'} + {else} + {l s='Add a new address'} + {/if} + {/if} +

        +
        +
          +
        +
          +
        +
        +

        + {if $back} + {l s='Add a new address'} + {else} + {l s='Add a new address'} + {/if} +

        + {if !$opc} +
        +

        {l s='If you would like to add a comment about your order, please write it below.'}

        +

        +
        + {/if} +
        +{if !$opc} +

        + + + {if $back} + « {l s='Previous'} + {else} + « {l s='Previous'} + {/if} + +

        + +{else} +
        +{/if} diff --git a/themes/prestashop/order-carrier.tpl b/themes/prestashop/order-carrier.tpl new file mode 100644 index 000000000..f5f03a224 --- /dev/null +++ b/themes/prestashop/order-carrier.tpl @@ -0,0 +1,198 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7444 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if !$opc} + +{/if} + +{if !$virtual_cart && $giftAllowed && $cart->gift == 1} + +{/if} + +{if !$opc} +{capture name=path}{l s='Shipping'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} +{/if} + +{if !$opc}

        {l s='Shipping'}

        {else}

        2. {l s='Delivery methods'}

        {/if} + +{if !$opc} +{assign var='current_step' value='shipping'} +{include file="$tpl_dir./order-steps.tpl"} + +{include file="$tpl_dir./errors.tpl"} + +
        +{else} +
        + +{/if} + +{if $conditions AND $cms_id} +

        {l s='Terms of service'}

        +

        + + {l s='(read)'} +

        + +{/if} + +{if $virtual_cart} + +{else} +

        {l s='Choose your delivery method'}

        + +
        {if isset($carriers)}{$HOOK_BEFORECARRIER}{/if}
        + {if isset($isVirtualCart) && $isVirtualCart} +

        {l s='No carrier needed for this order'}

        + {else} + {if $recyclablePackAllowed} +

        + + +

        + {/if} +

        {l s='There are no carriers available that deliver to this address.'}

        + + + + + + + + + + + {if isset($carriers)} + {foreach from=$carriers item=carrier name=myLoop} + + + + + + + {/foreach} + {$HOOK_EXTRACARRIER} + {/if} + +
        {l s='Carrier'}{l s='Information'}{l s='Price'}
        + + + + {$carrier.delay|escape:'htmlall':'UTF-8'} + {if $carrier.price} + + {if $priceDisplay == 1}{convertPrice price=$carrier.price_tax_exc}{else}{convertPrice price=$carrier.price}{/if} + + {if $use_taxes}{if $priceDisplay == 1} {l s='(tax excl.)'}{else} {l s='(tax incl.)'}{/if}{/if} + {else} + {l s='Free!'} + {/if} +
        + + + {if $giftAllowed} +

        {l s='Gift'}

        +

        + gift == 1}checked="checked"{/if} onclick="$('#gift_div').toggle('slow');" /> + +
        +       + {if $gift_wrapping_price > 0} + ({l s='Additional cost of'} + + {if $priceDisplay == 1}{convertPrice price=$total_wrapping_tax_exc_cost}{else}{convertPrice price=$total_wrapping_cost}{/if} + + {if $use_taxes}{if $priceDisplay == 1} {l s='(tax excl.)'}{else} {l s='(tax incl.)'}{/if}{/if}) + {/if} +

        +

        + + +

        + {/if} + {/if} +{/if} + +{if !$opc} +

        + + + {if !$is_guest} + {if $back} + « {l s='Previous'} + {else} + « {l s='Previous'} + {/if} + {else} + « {l s='Previous'} + {/if} + +

        + +{else} +

        {l s='Leave a message'}

        +
        +

        {l s='If you would like to add a comment about your order, please write it below.'}

        +

        +
        +
        +{/if} diff --git a/themes/prestashop/order-confirmation.tpl b/themes/prestashop/order-confirmation.tpl new file mode 100644 index 000000000..d881d017f --- /dev/null +++ b/themes/prestashop/order-confirmation.tpl @@ -0,0 +1,54 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7455 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{capture name=path}{l s='Order confirmation'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Order confirmation'}

        + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +{include file="$tpl_dir./errors.tpl"} + +{$HOOK_ORDER_CONFIRMATION} +{$HOOK_PAYMENT_RETURN} + +
        +{if $is_guest} +

        {l s='Your order ID is:'} {$id_order_formatted} . {l s='Your order ID has been sent to your e-mail.'}

        + {l s='Follow my order'} + {l s='Follow my order'} +{else} + {l s='Back to orders'} + {l s='Back to orders'} +{/if} diff --git a/themes/prestashop/order-detail.tpl b/themes/prestashop/order-detail.tpl new file mode 100644 index 000000000..fb495dac5 --- /dev/null +++ b/themes/prestashop/order-detail.tpl @@ -0,0 +1,371 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7455 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +
        +
        + +

        + {l s='Order placed on'} {dateFormat date=$order->date_add full=0} + +

        +
        +
        + +{if count($order_history)} +

        {l s='Follow your order step by step'}

        +
        + + + + + + + + + {foreach from=$order_history item=state name="orderStates"} + + + + + {/foreach} + +
        {l s='Date'}{l s='Status'}
        {dateFormat date=$state.date_add full=1}{$state.ostate_name|escape:'htmlall':'UTF-8'}
        +
        +{/if} + +{if isset($followup)} +

        {l s='Click the following link to track the delivery of your order'}

        +{$followup|escape:'htmlall':'UTF-8'} +{/if} + +

        {l s='Order:'} {l s='#'}{$order->id|string_format:"%06d"}

        +{if $carrier->id}

        {l s='Carrier:'} {if $carrier->name == "0"}{$shop_name|escape:'htmlall':'UTF-8'}{else}{$carrier->name|escape:'htmlall':'UTF-8'}{/if}

        {/if} +

        {l s='Payment method:'} {$order->payment|escape:'htmlall':'UTF-8'}

        +{if $invoice AND $invoiceAllowed} +

        + + {if $is_guest} + id&secure_key=$order->secure_key")}" >{l s='Download your invoice as a .PDF file'} + {else} + id")}" >{l s='Download your invoice as a .PDF file'} + {/if} +

        +{/if} +{if $order->recyclable} +

         {l s='You have given permission to receive your order in recycled packaging.'}

        +{/if} +{if $order->gift} +

         {l s='You requested gift-wrapping for your order.'}

        +

        {l s='Message:'} {$order->gift_message|nl2br}

        +{/if} +
        +
          +
        • {l s='Invoice'}
        • + {foreach from=$inv_adr_fields name=inv_loop item=field_item} + {if $field_item eq "company" && isset($address_invoice->company)}
        • {$address_invoice->company|escape:'htmlall':'UTF-8'}
        • + {elseif $field_item eq "address2" && $address_invoice->address2}
        • {$address_invoice->address2|escape:'htmlall':'UTF-8'}
        • + {elseif $field_item eq "phone_mobile" && $address_invoice->phone_mobile}
        • {$address_invoice->phone_mobile|escape:'htmlall':'UTF-8'}
        • + {else} + {assign var=address_words value=" "|explode:$field_item} +
        • {foreach from=$address_words item=word_item name="word_loop"}{if !$smarty.foreach.word_loop.first} {/if}{$invoiceAddressFormatedValues[$word_item]|escape:'htmlall':'UTF-8'}{/foreach}
        • + {/if} + + {/foreach} +
        +
          +
        • {l s='Delivery'}
        • + {foreach from=$dlv_adr_fields name=dlv_loop item=field_item} + {if $field_item eq "company" && isset($address_delivery->company)}
        • {$address_delivery->company|escape:'htmlall':'UTF-8'}
        • + {elseif $field_item eq "address2" && $address_delivery->address2}
        • {$address_delivery->address2|escape:'htmlall':'UTF-8'}
        • + {elseif $field_item eq "phone_mobile" && $address_delivery->phone_mobile}
        • {$address_delivery->phone_mobile|escape:'htmlall':'UTF-8'}
        • + {else} + {assign var=address_words value=" "|explode:$field_item} +
        • {foreach from=$address_words item=word_item name="word_loop"}{if !$smarty.foreach.word_loop.first} {/if}{$deliveryAddressFormatedValues[$word_item]|escape:'htmlall':'UTF-8'}{/foreach}
        • + {/if} + {/foreach} +
        +{$HOOK_ORDERDETAILDISPLAYED} +{if !$is_guest}
        {/if} +
        + + + + {if $return_allowed}{/if} + + + + + + + + + {if $priceDisplay && $use_tax} + + + + {/if} + + + + {if $order->total_discounts > 0} + + + + {/if} + {if $order->total_wrapping > 0} + + + + {/if} + + + + + + + + + {foreach from=$products item=product name=products} + {if !isset($product.deleted)} + {assign var='productId' value=$product.product_id} + {assign var='productAttributeId' value=$product.product_attribute_id} + {if isset($customizedDatas.$productId.$productAttributeId)}{assign var='productQuantity' value=$product.product_quantity-$product.customizationQuantityTotal}{else}{assign var='productQuantity' value=$product.product_quantity}{/if} + + {if isset($customizedDatas.$productId.$productAttributeId)} + + {if $return_allowed}{/if} + + + + + + + {foreach from=$customizedDatas.$productId.$productAttributeId item='customization' key='customizationId'} + + {if $return_allowed}{/if} + + + + + {/foreach} + {/if} + + {if $product.product_quantity > $product.customizationQuantityTotal} + + {if $return_allowed}{/if} + + + + + + + {/if} + {/if} + {/foreach} + {foreach from=$discounts item=discount} + + + + + + + {if $return_allowed} + + {/if} + + {/foreach} + +
        {l s='Reference'}{l s='Product'}{l s='Quantity'}{l s='Unit price'}{l s='Total price'}
        + {l s='Total products (tax excl.):'} {displayWtPriceWithCurrency price=$order->getTotalProductsWithoutTaxes() currency=$currency} +
        + {l s='Total products'} {if $use_tax}{l s='(tax incl.)'}{/if}: {displayWtPriceWithCurrency price=$order->getTotalProductsWithTaxes() currency=$currency} +
        + {l s='Total vouchers:'} {displayWtPriceWithCurrency price=$order->total_discounts currency=$currency} +
        + {l s='Total gift-wrapping:'} {displayWtPriceWithCurrency price=$order->total_wrapping currency=$currency} +
        + {l s='Total shipping'} {if $use_tax}{l s='(tax incl.)'}{/if}: {displayWtPriceWithCurrency price=$order->total_shipping currency=$currency} +
        + {l s='Total:'} {displayWtPriceWithCurrency price=$order->total_paid currency=$currency} +
        + + + + + +
        + {foreach from=$customization.datas key='type' item='datas'} + {if $type == $CUSTOMIZE_FILE} +
          + {foreach from=$datas item='data'} +
        • + {/foreach} +
        + {elseif $type == $CUSTOMIZE_TEXTFIELD} +
          {counter start=0 print=false} + {foreach from=$datas item='data'} + {assign var='customizationFieldName' value="Text #"|cat:$data.id_customization_field} +
        • {$data.name|default:$customizationFieldName}{l s=':'} {$data.value}
        • + {/foreach} +
        + {/if} + {/foreach} +
        + +
        + + + + + +
        {$discount.name|escape:'htmlall':'UTF-8'}{l s='Voucher:'} {$discount.name|escape:'htmlall':'UTF-8'}1 {if $discount.value != 0.00}{l s='-'}{/if}{convertPriceWithCurrency price=$discount.value currency=$currency convert=0} 
        +
        +
        +{if !$is_guest} + {if $return_allowed} +

        {l s='Merchandise return'}

        +

        {l s='If you wish to return one or more products, please mark the corresponding boxes and provide an explanation for the return. Then click the button below.'}

        +

        + +

        +

        + + +

        +
        + {/if} +
        + + {if count($messages)} +

        {l s='Messages'}

        +
        + + + + + + + + + {foreach from=$messages item=message name="messageList"} + + + + + {/foreach} + +
        {l s='From'}{l s='Message'}
        + {if isset($message.ename) && $message.ename} + {$message.efirstname|escape:'htmlall':'UTF-8'} {$message.elastname|escape:'htmlall':'UTF-8'} + {elseif $message.clastname} + {$message.cfirstname|escape:'htmlall':'UTF-8'} {$message.clastname|escape:'htmlall':'UTF-8'} + {else} + {$shop_name|escape:'htmlall':'UTF-8'} + {/if} +
        + {dateFormat date=$message.date_add full=1} +
        {$message.message|nl2br}
        +
        + {/if} + {if isset($errors) && $errors} +
        +

        {if $errors|@count > 1}{l s='There are'}{else}{l s='There is'}{/if} {$errors|@count} {if $errors|@count > 1}{l s='errors'}{else}{l s='error'}{/if} :

        +
          + {foreach from=$errors key=k item=error} +
        1. {$error}
        2. + {/foreach} +
        +
        + {/if} +
        +

        {l s='Add a message:'}

        +

        {l s='If you would like to add a comment about your order, please write it below.'}

        +

        + +

        +

        + + +

        +
        +{else} +

         {l s='You can\'t make a merchandise return with a guest account'}

        +{/if} diff --git a/themes/prestashop/order-follow.tpl b/themes/prestashop/order-follow.tpl new file mode 100644 index 000000000..0662f6ede --- /dev/null +++ b/themes/prestashop/order-follow.tpl @@ -0,0 +1,84 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{capture name=path}{l s='My account'}{$navigationPipe}{l s='Return Merchandise Authorization (RMA)'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Return Merchandise Authorization (RMA)'}

        +{if isset($errorQuantity) && $errorQuantity}

        {l s='You do not have enough products to request another merchandise return.'}

        {/if} +{if isset($errorMsg) && $errorMsg}

        {l s='Please provide an explanation for your RMA.'}

        {/if} +{if isset($errorDetail1) && $errorDetail1}

        {l s='Please check at least one product you would like to return.'}

        {/if} +{if isset($errorDetail2) && $errorDetail2}

        {l s='Please provide a quantity for the product you checked.'}

        {/if} +{if isset($errorNotReturnable) && $errorNotReturnable}

        {l s='This order cannot be returned.'}

        {/if} + +

        {l s='Here are the merchandise returns you have made'}.

        +
        + {if $ordersReturn && count($ordersReturn)} + + + + + + + + + + + + {foreach from=$ordersReturn item=return name=myLoop} + + + + + + + + {/foreach} + +
        {l s='Return'}{l s='Order'}{l s='Package status'}{l s='Date issued'}{l s='Return slip'}
        {l s='#'}{$return.id_order_return|string_format:"%06d"}{l s='#'}{$return.id_order|string_format:"%06d"}{$return.state_name|escape:'htmlall':'UTF-8'}{dateFormat date=$return.date_add full=0} + {if $return.state == 2} + {l s='Order return'} {l s='#'}{$return.id_order_return|string_format: + {l s='Print out'} + {else} + -- + {/if} +
        + + {else} +

        {l s='You have no return merchandise authorizations.'}

        + {/if} +
        + + diff --git a/themes/prestashop/order-opc-new-account.tpl b/themes/prestashop/order-opc-new-account.tpl new file mode 100644 index 000000000..a3876d3dc --- /dev/null +++ b/themes/prestashop/order-opc-new-account.tpl @@ -0,0 +1,382 @@ +
        + +

        1. {l s='Account'}

        +
        +
        +

        {l s='Already registered?'} {l s='Click here'}

        + +
        +
        +
        +
        +

        {l s='New Customer'}

        +
        +
        +

        {l s='Instant Checkout'}

        +

        + +

        +
        + +
        +

        {l s='Create your account today and enjoy:'}

        +
          +
        • {l s='Personalized and secure access'}
        • +
        • {l s='Fast and easy check out'}
        • +
        +

        + +

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

        + + + * +

        +

        + + + * + {l s='(5 characters min.)'} +

        +

        + {l s='Title'} + + + + +

        +

        + + + * +

        +

        + + + * +

        +

        + {l s='Date of Birth'} + + {* + {l s='January'} + {l s='February'} + {l s='March'} + {l s='April'} + {l s='May'} + {l s='June'} + {l s='July'} + {l s='August'} + {l s='September'} + {l s='October'} + {l s='November'} + {l s='December'} + *} + + +

        + {if $newsletter} +

        + + +

        +

        + + +

        + {/if} +

        {l s='Delivery address'}

        + {foreach from=$dlv_all_fields item=field_name} + {if $field_name eq "company"} +

        + + +

        + {elseif $field_name eq "firstname"} +

        + + + * +

        + {elseif $field_name eq "lastname"} +

        + + + * +

        + {elseif $field_name eq "address1"} +

        + + + * +

        + {elseif $field_name eq "address2"} +

        + + +

        + {elseif $field_name eq "postcode"} +

        + + + * +

        + {elseif $field_name eq "city"} +

        + + + * +

        + {elseif $field_name eq "country" || $field_name eq "Country:name"} +

        + + + * +

        + {elseif $field_name eq "vat_number"} + + {/if} + {/foreach} +

        + + + {l s='DNI / NIF / NIE'} + * +

        +

        + + + * +

        +

        + + +

        +

        + + * +

        +

        + + +

        + + +

        + + +

        + +
        +

        {l s='Invoice address'}

        + {foreach from=$inv_all_fields item=field_name} + {if $field_name eq "company"} +

        + + +

        + {elseif $field_name eq "vat_number"} + +

        + + + {l s='DNI / NIF / NIE'} + * +

        + {elseif $field_name eq "firstname"} +

        + + + * +

        + {elseif $field_name eq "lastname"} +

        + + + * +

        + {elseif $field_name eq "address1"} +

        + + + * +

        + {elseif $field_name eq "address2"} +

        + + +

        + {elseif $field_name eq "postcode"} +

        + + + * +

        + {elseif $field_name eq "city"} +

        + + + * +

        + {elseif $field_name eq "country"} +

        + + + * +

        + {elseif $field_name eq "state"} + + {/if} + {/foreach} +

        + + +

        +

        + + * +

        +

        + + +

        + +
        +

        + +

        + +

        + *{l s='Required field'} +

        + +
        +
        +
        +
        +
        + diff --git a/themes/prestashop/order-opc.tpl b/themes/prestashop/order-opc.tpl new file mode 100755 index 000000000..818916eee --- /dev/null +++ b/themes/prestashop/order-opc.tpl @@ -0,0 +1,105 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7075 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $PS_CATALOG_MODE} + {capture name=path}{l s='Your shopping cart'}{/capture} + {include file="$tpl_dir./breadcrumb.tpl"} +

        {l s='Your shopping cart'}

        +

        {l s='This store has not accepted your new order.'}

        +{else} + + {if $productNumber} + + {include file="$tpl_dir./shopping-cart.tpl"} + + {if $isLogged AND !$isGuest} + {include file="$tpl_dir./order-address.tpl"} + {else} + + {include file="$tpl_dir./order-opc-new-account.tpl"} + + {/if} + + {include file="$tpl_dir./order-carrier.tpl"} + + + + {include file="$tpl_dir./order-payment.tpl"} + + {else} + {capture name=path}{l s='Your shopping cart'}{/capture} + {include file="$tpl_dir./breadcrumb.tpl"} +

        {l s='Your shopping cart'}

        +

        {l s='Your shopping cart is empty.'}

        + {/if} +{/if} diff --git a/themes/prestashop/order-payment.tpl b/themes/prestashop/order-payment.tpl new file mode 100644 index 000000000..28ef37e55 --- /dev/null +++ b/themes/prestashop/order-payment.tpl @@ -0,0 +1,72 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if !$opc} + + + {capture name=path}{l s='Your payment method'}{/capture} + {include file="$tpl_dir./breadcrumb.tpl"} +{/if} + +{if !$opc}

        {l s='Choose your payment method'}

        {else}

        3. {l s='Choose your payment method'}

        {/if} + +{if !$opc} + {assign var='current_step' value='payment'} + {include file="$tpl_dir./order-steps.tpl"} + + {include file="$tpl_dir./errors.tpl"} +{else} +
        + +{/if} + +
        {$HOOK_TOP_PAYMENT}
        + +{if $HOOK_PAYMENT} + {if !$opc}

        {l s='Please select your preferred payment method to pay the amount of'} {convertPrice price=$total_price} {if $taxes_enabled}{l s='(tax incl.)'}{/if}


        {/if} + {if $opc}
        {/if} +
        {$HOOK_PAYMENT}
        + {if $opc}
        {/if} +{else} +

        {l s='No payment modules have been installed.'}

        +{/if} + +{if !$opc} +

        « {l s='Previous'}

        +{else} +
        +{/if} + diff --git a/themes/prestashop/order-return.tpl b/themes/prestashop/order-return.tpl new file mode 100644 index 000000000..64606f28c --- /dev/null +++ b/themes/prestashop/order-return.tpl @@ -0,0 +1,106 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

        {l s='RE#'}{$orderRet->id|string_format:"%06d"} {l s='on'} {dateFormat date=$order->date_add full=0}

        +
        +

        {l s='We have logged your return request.'}

        +

        {l s='Your package must be returned to us within'} {$nbdaysreturn} {l s='days of receiving your order.'}

        +

        {l s='Current status of your merchandise return:'} {$state_name|escape:'htmlall':'UTF-8'}

        +

        {l s='List of items marked as returned:'}

        +
        +
        + + + + + + + + + + {foreach from=$products item=product name=products} + + {assign var='quantityDisplayed' value=0} + {foreach from=$returnedCustomizations item='customization' name=products} + {if $customization.product_id == $product.product_id} + + + + + + {assign var='productId' value=$customization.product_id} + {assign var='productAttributeId' value=$customization.product_attribute_id} + {assign var='customizationId' value=$customization.id_customization} + {foreach from=$customizedDatas.$productId.$productAttributeId.$customizationId.datas key='type' item='datas'} + + + + {/foreach} + {assign var='quantityDisplayed' value=$quantityDisplayed+$customization.product_quantity} + {/if} + {/foreach} + + {if $product.product_quantity > $quantityDisplayed} + + + + + + {/if} + {/foreach} + +
        {l s='Reference'}{l s='Product'}{l s='Quantity'}
        {if $customization.reference}{$customization.reference|escape:'htmlall':'UTF-8'}{else}--{/if}{$customization.name|escape:'htmlall':'UTF-8'}{$customization.product_quantity|intval}
        + {if $type == $smarty.const._CUSTOMIZE_FILE_} +
          + {foreach from=$datas item='data'} +
        • WAHOU
        • + {/foreach} +
        + {elseif $type == $smarty.const._CUSTOMIZE_TEXTFIELD_} +
          {counter start=0 print=false} + {foreach from=$datas item='data'} + {assign var='customizationFieldName' value="Text #"|cat:$data.id_customization_field} +
        • {$data.name|default:$customizationFieldName}{l s=':'} {$data.value}
        • + {/foreach} +
        + {/if} +
        {if $product.product_reference}{$product.product_reference|escape:'htmlall':'UTF-8'}{else}--{/if}{$product.product_name|escape:'htmlall':'UTF-8'}{$product.product_quantity|intval}
        +
        +{if $orderRet->state == 2} +

        {l s='REMINDER:'}

        +
        + - {l s='All products must be returned in their original packaging without damage or wear.'} +
        - {l s='Please print out the'} id|intval}")}">{l s='PDF document'} {l s='and slip it into your package.'} +
        - {l s='Please see PDF document'} (id|intval}")}">{l s='for the correct address'}) +

        + {l s='Upon receiving your package, you will be notified by e-mail. We will then begin processing the reimbursement of your order total.'} +

        {l s='Let us know if you have any questions.'} +
        +

        {l s='If the conditions of return listed above are not respected, we reserve the right to refuse your package and/or reimbursement.'}

        +
        +{elseif $orderRet->state == 1} +

        {l s='You must wait for our confirmation before returning any merchandise.'}

        +{/if} diff --git a/themes/prestashop/order-slip.tpl b/themes/prestashop/order-slip.tpl new file mode 100644 index 000000000..c21bd239e --- /dev/null +++ b/themes/prestashop/order-slip.tpl @@ -0,0 +1,71 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + +{capture name=path}{l s='My account'}{$navigationPipe}{l s='Credit slips'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Credit slips'}

        +

        {l s='Credit slips you have received after cancelled orders'}.

        +
        + {if $ordersSlip && count($ordersSlip)} + + + + + + + + + + + {foreach from=$ordersSlip item=slip name=myLoop} + + + + + + + {/foreach} + +
        {l s='Credit slip'}{l s='Order'}{l s='Date issued'}{l s='View credit slip'}
        {l s='#'}{$slip.id_order_slip|string_format:"%06d"}{l s='#'}{$slip.id_order|string_format:"%06d"}{dateFormat date=$slip.date_add full=0} + {l s='Order slip'} {l s='#'}{$slip.id_order_slip|string_format: + {l s='PDF'} +
        + + {else} +

        {l s='You have not received any credit slips.'}

        + {/if} +
        + diff --git a/themes/prestashop/order-steps.tpl b/themes/prestashop/order-steps.tpl new file mode 100644 index 000000000..f53a301bd --- /dev/null +++ b/themes/prestashop/order-steps.tpl @@ -0,0 +1,75 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{* Assign a value to 'current_step' to display current style *} +{capture name="url_back"} +{if isset($back) && $back}back={$back}{/if} +{/capture} +{if !$opc} + +
          +
        • + {if $current_step=='payment' || $current_step=='shipping' || $current_step=='address' || $current_step=='login'} + + {l s='Summary'} + + {else} + {l s='Summary'} + {/if} +
        • +
        • + {if $current_step=='payment' || $current_step=='shipping' || $current_step=='address'} + + {l s='Login'} + + {else} + {l s='Login'} + {/if} +
        • +
        • + {if $current_step=='payment' || $current_step=='shipping'} + + {l s='Address'} + + {else} + {l s='Address'} + {/if} +
        • +
        • + {if $current_step=='payment'} + + {l s='Shipping'} + + {else} + {l s='Shipping'} + {/if} +
        • +
        • + {l s='Payment'} +
        • +
        + +{/if} diff --git a/themes/prestashop/pagination.tpl b/themes/prestashop/pagination.tpl new file mode 100644 index 000000000..99b69c9e2 --- /dev/null +++ b/themes/prestashop/pagination.tpl @@ -0,0 +1,102 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if isset($p) AND $p} + {if isset($smarty.get.id_category) && $smarty.get.id_category && isset($category)} + {assign var='requestPage' value=$link->getPaginationLink('category', $category, false, false, true, false)} + {assign var='requestNb' value=$link->getPaginationLink('category', $category, true, false, false, true)} + {elseif isset($smarty.get.id_manufacturer) && $smarty.get.id_manufacturer && isset($manufacturer)} + {assign var='requestPage' value=$link->getPaginationLink('manufacturer', $manufacturer, false, false, true, false)} + {assign var='requestNb' value=$link->getPaginationLink('manufacturer', $manufacturer, true, false, false, true)} + {elseif isset($smarty.get.id_supplier) && $smarty.get.id_supplier && isset($supplier)} + {assign var='requestPage' value=$link->getPaginationLink('supplier', $supplier, false, false, true, false)} + {assign var='requestNb' value=$link->getPaginationLink('supplier', $supplier, true, false, false, true)} + {else} + {assign var='requestPage' value=$link->getPaginationLink(false, false, false, false, true, false)} + {assign var='requestNb' value=$link->getPaginationLink(false, false, true, false, false, true)} + {/if} + + + +{/if} diff --git a/themes/prestashop/password.tpl b/themes/prestashop/password.tpl new file mode 100644 index 000000000..1b7aa1d98 --- /dev/null +++ b/themes/prestashop/password.tpl @@ -0,0 +1,54 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7075 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Forgot your password'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Forgot your password'}

        + +{include file="$tpl_dir./errors.tpl"} + +{if isset($confirmation) && $confirmation == 1} +

        {l s='Your password has been successfully reset and has been sent to your e-mail address:'} {$email|escape:'htmlall':'UTF-8'}

        +{elseif isset($confirmation) && $confirmation == 2} +

        {l s='A confirmation e-mail has been sent to your address:'} {$email|escape:'htmlall':'UTF-8'}

        +{else} +

        {l s='Please enter the e-mail address used to register. We will e-mail you your new password.'}

        +
        +
        +

        + + +

        +

        + +

        +
        +
        +{/if} +

        + {l s='Return to Login'}{l s='Back to Login'} +

        diff --git a/themes/prestashop/preview.jpg b/themes/prestashop/preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22a3cf9f5a01e19864fe14fe04a0f3e1c73a0385 GIT binary patch literal 12628 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 literal 0 HcmV?d00001 diff --git a/themes/prestashop/prices-drop.tpl b/themes/prestashop/prices-drop.tpl new file mode 100644 index 000000000..86ad113da --- /dev/null +++ b/themes/prestashop/prices-drop.tpl @@ -0,0 +1,38 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Price drop'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Price drop'}

        + +{if $products} + {include file="$tpl_dir./product-sort.tpl"} + {include file="$tpl_dir./product-list.tpl" products=$products} + {include file="$tpl_dir./pagination.tpl"} +{else} +

        {l s='No price drop.'}

        +{/if} diff --git a/themes/prestashop/product-compare.tpl b/themes/prestashop/product-compare.tpl new file mode 100644 index 000000000..9a6a9d50f --- /dev/null +++ b/themes/prestashop/product-compare.tpl @@ -0,0 +1,41 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7507 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if $comparator_max_item} + +
        +

        + + +

        +
        +{/if} + diff --git a/themes/prestashop/product-list.tpl b/themes/prestashop/product-list.tpl new file mode 100644 index 000000000..72e03de13 --- /dev/null +++ b/themes/prestashop/product-list.tpl @@ -0,0 +1,67 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7457 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if isset($products)} + +
          + {foreach from=$products item=product name=products} +
        • + +
          + {if isset($product.on_sale) && $product.on_sale && isset($product.show_price) && $product.show_price && !$PS_CATALOG_MODE}{l s='On sale!'} + {elseif isset($product.reduction) && $product.reduction && isset($product.show_price) && $product.show_price && !$PS_CATALOG_MODE}{l s='Reduced price!'}{/if} + {if isset($product.online_only) && $product.online_only}{l s='Online only!'}{/if} + {if (!$PS_CATALOG_MODE AND ((isset($product.show_price) && $product.show_price) || (isset($product.available_for_order) && $product.available_for_order)))} +
          + {if isset($product.show_price) && $product.show_price && !isset($restricted_country_mode)}{if !$priceDisplay}{convertPrice price=$product.price}{else}{convertPrice price=$product.price_tax_exc}{/if}
          {/if} + {if isset($product.available_for_order) && $product.available_for_order && !isset($restricted_country_mode)}{if ($product.allow_oosp || $product.quantity > 0)}{l s='Available'}{elseif (isset($product.quantity_all_versions) && $product.quantity_all_versions > 0)}{l s='Product available with different options'}{else}{l s='Out of stock'}{/if}{/if} +
          + {/if} + {if ($product.id_product_attribute == 0 || (isset($add_prod_display) && ($add_prod_display == 1))) && $product.available_for_order && !isset($restricted_country_mode) && $product.minimal_quantity <= 1 && $product.customizable != 2 && !$PS_CATALOG_MODE} + {if ($product.allow_oosp || $product.quantity > 0)} + {if isset($static_token)} + {l s='Add to cart'} + {else} + {l s='Add to cart'} + {/if} + {else} + {l s='Add to cart'} + {/if} + {/if} + {l s='View'} + {if isset($comparator_max_item) && $comparator_max_item} +

          + {/if} +
          +
        • + {/foreach} +
        + +{/if} diff --git a/themes/prestashop/product-sort.tpl b/themes/prestashop/product-sort.tpl new file mode 100644 index 000000000..a154ec652 --- /dev/null +++ b/themes/prestashop/product-sort.tpl @@ -0,0 +1,75 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7040 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if isset($orderby) AND isset($orderway)} + +{if isset($smarty.get.id_category) && $smarty.get.id_category} + {assign var='request' value=$link->getPaginationLink('category', $category, false, true)} +{elseif isset($smarty.get.id_manufacturer) && $smarty.get.id_manufacturer} + {assign var='request' value=$link->getPaginationLink('manufacturer', $manufacturer, false, true)} +{elseif isset($smarty.get.id_supplier) && $smarty.get.id_supplier} + {assign var='request' value=$link->getPaginationLink('supplier', $supplier, false, true)} +{else} + {assign var='request' value=$link->getPaginationLink(false, false, false, true)} +{/if} + + + +
        +

        + + +

        +
        + +{/if} diff --git a/themes/prestashop/product.tpl b/themes/prestashop/product.tpl new file mode 100644 index 000000000..5d7c3c421 --- /dev/null +++ b/themes/prestashop/product.tpl @@ -0,0 +1,542 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{include file="$tpl_dir./errors.tpl"} +{if $errors|@count == 0} + + +{include file="$tpl_dir./breadcrumb.tpl"} +
        +

        {$product->name|escape:'htmlall':'UTF-8'}

        + + {if isset($adminActionDisplay) && $adminActionDisplay} +
        +

        {l s='This product is not visible to your customers.'} + + + +

        +
        +

        +

        +
        + {/if} + + {if isset($confirmation) && $confirmation} +

        + {$confirmation} +

        + {/if} + + +
        + +
        + {if $have_image} + {$link->getImageLink($product->link_rewrite, $cover.id_image, 'thickbox')} + {else} + + {/if} +
        + + {if isset($images) && count($images) > 0} + +
        + {if isset($images) && count($images) > 3}{/if} +
        +
          + {if isset($images)} + {foreach from=$images item=image name=thumbnails} + {assign var=imageIds value="`$product->id`-`$image.id_image`"} +
        • + + {$image.legend|htmlspecialchars} + +
        • + {/foreach} + {/if} +
        +
        + {if isset($images) && count($images) > 3}{l s='Next'}{/if} +
        + {/if} + {if isset($images) && count($images) > 1}

        {/if} + + +
        + + +
        + {if $product->description_short OR $packItems|@count > 0} +
        + {if $product->description_short} +
        {$product->description_short}
        + {/if} + {if $product->description} +

        {l s='More details'}

        + {/if} + {if $packItems|@count > 0} +

        {l s='Pack content'}

        + {foreach from=$packItems item=packItem} +
        + {$packItem.pack_quantity} x {$packItem.name|escape:'htmlall':'UTF-8'} +

        {$packItem.description_short}

        +
        + {/foreach} + {/if} +
        + {/if} + + {if isset($colors) && $colors} + +
        +

        {l s='Pick a color:' js=1}

        +
        + +
        +
        + {/if} + + {if ($product->show_price AND !isset($restricted_country_mode)) OR isset($groups) OR $product->reference OR (isset($HOOK_PRODUCT_ACTIONS) && $HOOK_PRODUCT_ACTIONS)} + +
        quantity > 0}class="hidden"{/if} action="{$link->getPageLink('cart')}" method="post"> + + + + + + {if $product->show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE} +

        + {if !$priceDisplay || $priceDisplay == 2} + {assign var='productPrice' value=$product->getPrice(true, $smarty.const.NULL, 2)} + {assign var='productPriceWithoutRedution' value=$product->getPriceWithoutReduct(false, $smarty.const.NULL)} + {elseif $priceDisplay == 1} + {assign var='productPrice' value=$product->getPrice(false, $smarty.const.NULL, 2)} + {assign var='productPriceWithoutRedution' value=$product->getPriceWithoutReduct(true, $smarty.const.NULL)} + {/if} + {if $product->on_sale} + {l s='On sale'} + {l s='On sale!'} + {elseif $product->specificPrice AND $product->specificPrice.reduction AND $productPriceWithoutRedution > $productPrice} + {l s='Reduced price!'} + {/if} +
        + + {if $priceDisplay >= 0 && $priceDisplay <= 2} + {convertPrice price=$productPrice} + {if $tax_enabled && ((isset($display_tax_label) && $display_tax_label == 1) OR !isset($display_tax_label))} + {if $priceDisplay == 1}{l s='tax excl.'}{else}{l s='tax incl.'}{/if} + {/if} + {/if} + + {if $priceDisplay == 2} +
        + {convertPrice price=$product->getPrice(false, $smarty.const.NULL)} {l s='tax excl.'} + {/if} +
        +

        + {if $product->specificPrice AND $product->specificPrice.reduction} +

        + {if $priceDisplay >= 0 && $priceDisplay <= 2} + {if $productPriceWithoutRedution > $productPrice} + {convertPrice price=$productPriceWithoutRedution} + {if $tax_enabled && $display_tax_label == 1} + {if $priceDisplay == 1}{l s='tax excl.'}{else}{l s='tax incl.'}{/if} + {/if} + {/if} + {/if} + +

        + + {/if} + {if $product->specificPrice AND $product->specificPrice.reduction_type == 'percentage'} +

        {l s='(price reduced by'} {$product->specificPrice.reduction*100} %{l s=')'}

        + {/if} + {if $packItems|@count} +

        {l s='instead of'} {convertPrice price=$product->getNoPackPrice()}

        +
        + {/if} + {if $product->ecotax != 0} +

        {l s='include'} {if $priceDisplay == 2}{$ecotax_tax_exc|convertAndFormatPrice}{else}{$ecotax_tax_inc|convertAndFormatPrice}{/if} {l s='for green tax'} + {if $product->specificPrice AND $product->specificPrice.reduction} +
        {l s='(not impacted by the discount)'} + {/if} +

        + {/if} + {if !empty($product->unity) && $product->unit_price_ratio > 0.000000} + {math equation="pprice / punit_price" pprice=$productPrice punit_price=$product->unit_price_ratio assign=unit_price} +

        {convertPrice price=$unit_price} {l s='per'} {$product->unity|escape:'htmlall':'UTF-8'}

        + {/if} + {*close if for show price*} + {/if} + + {if isset($groups)} + +
        + {foreach from=$groups key=id_attribute_group item=group} + {if $group.attributes|@count} +

        + + {assign var="groupName" value="group_$id_attribute_group"} + +

        + {/if} + {/foreach} +
        + {/if} + +

        reference}style="display: none;"{/if}>{$product->reference|escape:'htmlall':'UTF-8'}

        + + +

        quantity <= 0) OR $virtual OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if}> + + minimal_quantity > 1}onkeyup="checkMinimalQuantity({$product->minimal_quantity});"{/if} /> +

        + + +

        minimal_quantity <= 1 OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if}>{l s='You must add '}{$product->minimal_quantity}{l s=' as a minimum quantity to buy this product.'}

        + {if $product->minimal_quantity > 1} + + {/if} + + +

        quantity <= 0 && !$product->available_later && $allow_oosp) OR ($product->quantity > 0 && !$product->available_now) OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if}> + {l s='Availability:'} + quantity <= 0} class="warning_inline"{/if}> + {if $product->quantity <= 0}{if $allow_oosp}{$product->available_later}{else}{l s='This product is no longer in stock'}{/if}{else}{$product->available_now}{/if} + +

        + + + {if ($display_qties == 1 && !$PS_CATALOG_MODE && $product->available_for_order)} +

        quantity <= 0} style="display: none;"{/if}> + {$product->quantity|intval} + quantity > 1} style="display: none;"{/if} id="quantityAvailableTxt">{l s='item in stock'} + quantity == 1} style="display: none;"{/if} id="quantityAvailableTxtMultiple">{l s='items in stock'} +

        + {/if} + +

        quantity > 0} style="display: none;"{/if}> + {$HOOK_PRODUCT_OOS} +

        + +

        quantity > $last_qties OR $product->quantity <= 0) OR $allow_oosp OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if} >{l s='Warning: Last items in stock!'}

        + + {if $product->online_only} +

        {l s='Online only'}

        + {/if} + + quantity <= 0) OR !$product->available_for_order OR (isset($restricted_country_mode) AND $restricted_country_mode) OR $PS_CATALOG_MODE} style="display: none;"{/if} id="add_to_cart" class="buttons_bottom_block">

        + {if isset($HOOK_PRODUCT_ACTIONS) && $HOOK_PRODUCT_ACTIONS}{$HOOK_PRODUCT_ACTIONS}{/if} +
        + + {/if} + {if $HOOK_EXTRA_RIGHT}{$HOOK_EXTRA_RIGHT}{/if} +
        +
        + +{if $quantity_discounts} + + +
        + + + {foreach from=$quantity_discounts item='quantity_discount' name='quantity_discounts'} + + {/foreach} + + + {foreach from=$quantity_discounts item='quantity_discount' name='quantity_discounts'} + + {/foreach} + +
        {$quantity_discount.quantity|intval} + {if $quantity_discount.quantity|intval > 1} + {l s='quantities'} + {else} + {l s='quantity'} + {/if} +
        + {if $quantity_discount.price != 0 OR $quantity_discount.reduction_type == 'amount'} + -{convertPrice price=$quantity_discount.real_value|floatval} + {else} + -{$quantity_discount.real_value|floatval}% + {/if} +
        +
        +{/if} + +{$HOOK_PRODUCT_FOOTER} + + +{if $product->description || $features || $accessories || $HOOK_PRODUCT_TAB || $attachments} +
        + +
        + {if $product->description} + +
        {$product->description}
        + {/if} + {if $features} + +
          + {foreach from=$features item=feature} +
        • {$feature.name|escape:'htmlall':'UTF-8'} {$feature.value|escape:'htmlall':'UTF-8'}
        • + {/foreach} +
        + {/if} + {if $attachments} + + {/if} + {if isset($accessories) AND $accessories} + +
          +
          +
          +
            + {foreach from=$accessories item=accessory name=accessories_list} + {assign var='accessoryLink' value=$link->getProductLink($accessory.id_product, $accessory.link_rewrite, $accessory.category)} +
          • +
            {$accessory.name|truncate:22:'...':true|escape:'htmlall':'UTF-8'}
            + +

            + {if $accessory.show_price AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE}{if $priceDisplay != 1}{displayWtPrice p=$accessory.price}{else}{displayWtPrice p=$accessory.price_tax_exc}{/if}{/if} + {l s='View'} + {if ($accessory.allow_oosp || $accessory.quantity > 0) AND $accessory.available_for_order AND !isset($restricted_country_mode) AND !$PS_CATALOG_MODE} + {l s='Add to cart'} + {else} + {l s='Add to cart'} + {if (isset($accessory.quantity_all_versions) && $accessory.quantity_all_versions > 0)}{l s='Product available with different options'}{else}{l s='Out of stock'}{/if} + {/if} +

            +
          • + + {/foreach} +
          +
          +
          +
        + {/if} + {$HOOK_PRODUCT_TAB_CONTENT} +
        +
        +{/if} + + +{if $product->customizable} + +
        +
        +

        + Informations + {l s='After saving your customized product, remember to add it to your cart.'} + {if $product->uploadable_files}
        {l s='Allowed file formats are: GIF, JPG, PNG'}{/if} +

        + {if $product->uploadable_files|intval} +

        {l s='Pictures'}

        +
          + {counter start=0 assign='customizationField'} + {foreach from=$customizationFields item='field' name='customizationFields'} + {if $field.type == 0} +
        • {assign var='key' value='pictures_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} + {if isset($pictures.$key)}
          + + + {l s='Delete'} + +
          {/if} +
          {if $field.required}*{/if} +
          {if !empty($field.name)}{$field.name}{else}{l s='Please select an image file from your hard drive'}{/if}
          +
        • + {counter} + {/if} + {/foreach} +
        + {/if} +
        + {if $product->text_fields|intval} +

        {l s='Texts'}

        +
          + {counter start=0 assign='customizationField'} + {foreach from=$customizationFields item='field' name='customizationFields'} + {if $field.type == 1} +
        • {assign var='key' value='textFields_'|cat:$product->id|cat:'_'|cat:$field.id_customization_field} + {if !empty($field.name)}{$field.name}{/if}{if $field.required}*{/if} +
        • + {counter} + {/if} + {/foreach} +
        + {/if} +

        + + + + +

        +
        +

        * {l s='required fields'}

        +
        +{/if} + +{if $packItems|@count > 0} +
        +

        {l s='Pack content'}

        + {include file="$tpl_dir./product-list.tpl" products=$packItems} +
        +{/if} + +{/if} + diff --git a/themes/prestashop/products-comparison.tpl b/themes/prestashop/products-comparison.tpl new file mode 100644 index 000000000..587ed7f33 --- /dev/null +++ b/themes/prestashop/products-comparison.tpl @@ -0,0 +1,143 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Product Comparison'}{/capture} + +{include file="$tpl_dir./breadcrumb.tpl"} +

        {l s='Product Comparison'}

        + +{if $hasProduct} +
        + + + {assign var='taxes_behavior' value=false} + {if $use_taxes && (!$priceDisplay || $priceDisplay == 2)} + {assign var='taxes_behavior' value=true} + {/if} + {foreach from=$products item=product name=for_products} + {assign var='replace_id' value=$product->id|cat:'|'} + + + {/foreach} + + + + + {section loop=$products|count step=1 start=0 name=td} + + {/section} + + + {if $ordered_features} + {foreach from=$ordered_features item=feature} + + {cycle values='comparison_feature_odd,comparison_feature_even' assign='classname'} + + + {foreach from=$products item=product name=for_products} + {assign var='product_id' value=$product->id} + {assign var='feature_id' value=$feature.id_feature} + {if isset($product_features[$product_id])} + {assign var='tab' value=$product_features[$product_id]} + + {else} + + {/if} + {/foreach} + + {/foreach} + {else} + + + + + {/if} + + {$HOOK_EXTRA_PRODUCT_COMPARISON} +
        +
        {$product->name|truncate:27:'...'|escape:'htmlall':'UTF-8'}
        + +
        + + {$product->name|escape:html:'UTF-8'} + + + {if isset($product->show_price) && $product->show_price && !isset($restricted_country_mode) && !$PS_CATALOG_MODE} +

        {convertPrice price=$product->getPrice($taxes_behavior)}

        +
        + {if $product->on_sale} + {l s='On sale!'} + {elseif $product->specificPrice AND $product->specificPrice.reduction} + {l s='Reduced price!'} + {/if} +
        + + {if !empty($product->unity) && $product->unit_price_ratio > 0.000000} + {math equation="pprice / punit_price" pprice=$product->getPrice($taxes_behavior) punit_price=$product->unit_price_ratio assign=unit_price} +

        {convertPrice price=$unit_price} {l s='per'} {$product->unity|escape:'htmlall':'UTF-8'}

        + {else} +   + {/if} + {/if} + +

        + {if !(($product->quantity <= 0 && !$product->available_later) OR ($product->quantity != 0 && !$product->available_now) OR !$product->available_for_order OR $PS_CATALOG_MODE)} + {l s='Availability:'} + quantity <= 0} class="warning-inline"{/if}> + {if $product->quantity <= 0} + {if $allow_oosp} + {$product->available_later|escape:'htmlall':'UTF-8'} + {else} + {l s='This product is no longer in stock'} + {/if} + {else} + {$product->available_now|escape:'htmlall':'UTF-8'} + {/if} + + {/if} +

        + {l s='Remove'} + {l s='View'} + {if (!$product->hasAttributes() OR (isset($add_prod_display) AND ($add_prod_display == 1))) AND $product->minimal_quantity == 1 AND $product->customizable != 2 AND !$PS_CATALOG_MODE} + {if ($product->quantity > 0 OR $product->allow_oosp)} + id}&token={$static_token}&add")}" title="{l s='Add to cart'}">{l s='Add to cart'} + {else} + {l s='Add to cart'} + {/if} + {else} +
        + {/if} +
        +
        + {l s='Features'} +
        + {$feature.name|escape:'htmlall':'UTF-8'} + {$tab[$feature_id]|escape:'htmlall':'UTF-8'}
        {l s='No features to compare'}
        +
        +{else} +

        {l s='There is no product in the comparator'}

        +{/if} + diff --git a/themes/prestashop/restricted-country.tpl b/themes/prestashop/restricted-country.tpl new file mode 100644 index 000000000..4146bb641 --- /dev/null +++ b/themes/prestashop/restricted-country.tpl @@ -0,0 +1,51 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + + {$meta_title|escape:'htmlall':'UTF-8'} + +{if isset($meta_description)} + +{/if} +{if isset($meta_keywords)} + +{/if} + + + + + +
        +

        logo

        +

        + {l s='You cannot access our store from your country. We apologize for the inconvenience.'} +

        +   +
        + + \ No newline at end of file diff --git a/themes/prestashop/scenes.tpl b/themes/prestashop/scenes.tpl new file mode 100644 index 000000000..8404f2772 --- /dev/null +++ b/themes/prestashop/scenes.tpl @@ -0,0 +1,92 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{if scenes} + + + + + +
        +
        + {foreach from=$scenes key='scene_key' item='scene' name='scenes'} +
        + {foreach from=$scene->products key='product_key' item='product'} + {assign var=imageIds value="`$product.id_product`-`$product.id_image`"} + +   + + + {/foreach} +
        + {/foreach} +
        + {if isset($scenes.1)} +
        + + + +
        +
          + {foreach from=$scenes item='scene' name='scenes_list'} +
        • + + {$scene->name|escape:'htmlall':'UTF-8'} + +
        • + {/foreach} +
        +
        + + + +
        + {/if} +
        +{/if} diff --git a/themes/prestashop/search.tpl b/themes/prestashop/search.tpl new file mode 100644 index 000000000..215dd480d --- /dev/null +++ b/themes/prestashop/search.tpl @@ -0,0 +1,51 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Search'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        +{l s='Search'} {if $nbProducts > 0}"{if isset($search_query) && $search_query}{$search_query|escape:'htmlall':'UTF-8'}{elseif $search_tag}{$search_tag|escape:'htmlall':'UTF-8'}{elseif $ref}{$ref|escape:'htmlall':'UTF-8'}{/if}"{/if} +{if isset($instantSearch) && $instantSearch}{l s='Return to previous page'}{/if} +

        + +{include file="$tpl_dir./errors.tpl"} +{if !$nbProducts} +

        + {if isset($search_query) && $search_query} + {l s='No results found for your search'} "{if isset($search_query)}{$search_query|escape:'htmlall':'UTF-8'}{/if}" + {elseif isset($search_tag) && $search_tag} + {l s='No results found for your search'} "{$search_tag|escape:'htmlall':'UTF-8'}" + {else} + {l s='Please type a search keyword'} + {/if} +

        +{else} +

        {$nbProducts|intval} {if $nbProducts == 1}{l s='result has been found.'}{else}{l s='results have been found.'}{/if}

        + {if !isset($instantSearch) || (isset($instantSearch) && !$instantSearch)}{include file="$tpl_dir./product-sort.tpl"}{/if} + {include file="$tpl_dir./product-list.tpl" products=$search_products} + {if !isset($instantSearch) || (isset($instantSearch) && !$instantSearch)}{include file="$tpl_dir./pagination.tpl"}{/if} +{/if} diff --git a/themes/prestashop/shopping-cart-product-line.tpl b/themes/prestashop/shopping-cart-product-line.tpl new file mode 100644 index 000000000..3f1a9fd41 --- /dev/null +++ b/themes/prestashop/shopping-cart-product-line.tpl @@ -0,0 +1,80 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7465 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + {$product.name|escape:'htmlall':'UTF-8'} + + +
        {$product.name|escape:'htmlall':'UTF-8'}
        + {if isset($product.attributes) && $product.attributes}{$product.attributes|escape:'htmlall':'UTF-8'}{/if} + + {if $product.reference}{$product.reference|escape:'htmlall':'UTF-8'}{else}--{/if} + + {if $product.active AND ($product.allow_oosp OR ($product.quantity <= $product.stock_quantity)) AND $product.available_for_order AND !$PS_CATALOG_MODE} + {l s='Available'} + {else} + {l s='Out of stock'} + {/if} + + + + {if !$priceDisplay}{convertPrice price=$product.price_wt}{else}{convertPrice price=$product.price}{/if} + + + + {if isset($customizedDatas.$productId.$productAttributeId) AND $quantityDisplayed == 0}{$product.customizationQuantityTotal}{/if} + {if !isset($customizedDatas.$productId.$productAttributeId) OR $quantityDisplayed > 0} +
        + {l s='Delete'} +
        +
        + {l s='Add'}
        + {if $product.minimal_quantity < ($product.cart_quantity-$quantityDisplayed) OR $product.minimal_quantity <= 1} + + {l s='Subtract'} + + {else} + + {l s='Subtract'} + + {/if} +
        + + + + {/if} + + + + {if $quantityDisplayed == 0 AND isset($customizedDatas.$productId.$productAttributeId)} + {if !$priceDisplay}{displayPrice price=$product.total_customization_wt}{else}{displayPrice price=$product.total_customization}{/if} + {else} + {if !$priceDisplay}{displayPrice price=$product.total_wt}{else}{displayPrice price=$product.total}{/if} + {/if} + + + diff --git a/themes/prestashop/shopping-cart.tpl b/themes/prestashop/shopping-cart.tpl new file mode 100644 index 000000000..e7714dab4 --- /dev/null +++ b/themes/prestashop/shopping-cart.tpl @@ -0,0 +1,358 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7476 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Your shopping cart'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Shopping cart summary'}

        + +{assign var='current_step' value='summary'} +{include file="$tpl_dir./order-steps.tpl"} +{include file="$tpl_dir./errors.tpl"} + +{if isset($empty)} +

        {l s='Your shopping cart is empty.'}

        +{elseif $PS_CATALOG_MODE} +

        {l s='This store has not accepted your new order.'}

        +{else} + + +{if isset($lastProductAdded) AND $lastProductAdded} + {foreach from=$products item=product} + {if $product.id_product == $lastProductAdded.id_product AND (!$product.id_product_attribute OR ($product.id_product_attribute == $lastProductAdded.id_product_attribute))} +
        +
        +
        {l s='Last added product'}
        +
        + {$product.name|escape:'htmlall':'UTF-8'} +
        +
        {$product.name|escape:'htmlall':'UTF-8'}
        + {if isset($product.attributes) && $product.attributes}{$product.attributes|escape:'htmlall':'UTF-8'}{/if} +
        +
        +
        + {/if} + {/foreach} +{/if} +

        {l s='Your shopping cart contains'} {$productNumber} {if $productNumber == 1}{l s='product'}{else}{l s='products'}{/if}

        +
        + + + + + + + + + + + + + + {if $use_taxes} + {if $priceDisplay} + + + + + {else} + + + + + {/if} + {else} + + + + + {/if} + + + + + + + + + {if $use_taxes} + {if $priceDisplay} + + + + + {else} + + + + + {/if} + {else} + + + + + {/if} + + {if $use_taxes} + + + + + + + + + + + + + {else} + + + + + {/if} + + + + + + + {foreach from=$products item=product name=productLoop} + {assign var='productId' value=$product.id_product} + {assign var='productAttributeId' value=$product.id_product_attribute} + {assign var='quantityDisplayed' value=0} + {* Display the product line *} + {include file="$tpl_dir./shopping-cart-product-line.tpl"} + {* Then the customized datas ones*} + {if isset($customizedDatas.$productId.$productAttributeId)} + {foreach from=$customizedDatas.$productId.$productAttributeId key='id_customization' item='customization'} + + + + + + {assign var='quantityDisplayed' value=$quantityDisplayed+$customization.quantity} + {/foreach} + {* If it exists also some uncustomized products *} + {if $product.quantity-$quantityDisplayed > 0}{include file="$tpl_dir./shopping-cart-product-line.tpl"}{/if} + {/if} + {/foreach} + + {if sizeof($discounts)} + + {foreach from=$discounts item=discount name=discountLoop} + + + + + + + {/foreach} + + {/if} +
        {l s='Product'}{l s='Description'}{l s='Ref.'}{l s='Avail.'}{l s='Unit price'}{l s='Qty'}{l s='Total'}
        {l s='Total products'}{if $display_tax_label} {l s='(tax excl.)'}{/if}{l s=':'}{displayPrice price=$total_products}
        {l s='Total products'}{if $display_tax_label} {l s='(tax incl.)'}{/if}{l s=':'}{displayPrice price=$total_products_wt}
        {l s='Total products:'}{displayPrice price=$total_products}
        + {if $use_taxes} + {if $priceDisplay} + {l s='Total vouchers'}{if $display_tax_label} {l s='(tax excl.)'}{/if}{l s=':'} + {else} + {l s='Total vouchers'}{if $display_tax_label} {l s='(tax incl.)'}{/if}{l s=':'} + {/if} + {else} + {l s='Total vouchers:'} + {/if} + + {if $use_taxes} + {if $priceDisplay} + {displayPrice price=$total_discounts_tax_exc} + {else} + {displayPrice price=$total_discounts} + {/if} + {else} + {displayPrice price=$total_discounts_tax_exc} + {/if} +
        + {if $use_taxes} + {if $priceDisplay} + {l s='Total gift-wrapping'}{if $display_tax_label} {l s='(tax excl.)'}{/if}{l s=':'} + {else} + {l s='Total gift-wrapping'}{if $display_tax_label} {l s='(tax incl.)'}{/if}{l s=':'} + {/if} + {else} + {l s='Total gift-wrapping:'} + {/if} + + {if $use_taxes} + {if $priceDisplay} + {displayPrice price=$total_wrapping_tax_exc} + {else} + {displayPrice price=$total_wrapping} + {/if} + {else} + {displayPrice price=$total_wrapping_tax_exc} + {/if} +
        + {if $display_tax_label} + {l s='Total (tax excl.):'} + {else} + {l s='Subtotal:'} + {/if} + {displayPrice price=$total_price_without_tax}
        + {if $display_tax_label} + {l s='Total tax:'} + {else} + {l s='Estimated Sales Tax:'} + {/if} + {displayPrice price=$total_tax}
        + {if $display_tax_label} + {l s='Total (tax incl.):'} + {else} + {l s='Total:'} + {/if} + {displayPrice price=$total_price}
        {l s='Total:'}{displayPrice price=$total_price_without_tax}
        + {foreach from=$customization.datas key='type' item='datas'} + {if $type == $CUSTOMIZE_FILE} +
        +
          + {foreach from=$datas item='picture'}
        • {/foreach} +
        +
        + {elseif $type == $CUSTOMIZE_TEXTFIELD} +
          + {foreach from=$datas item='textField' name='typedText'}
        • {if $textField.name}{$textField.name}{else}{l s='Text #'}{$smarty.foreach.typedText.index+1}{/if}{l s=':'} {$textField.value}
        • {/foreach} +
        + {/if} + {/foreach} +
        +
        + {l s='Delete'} +
        +
        + {l s='Add'}
        + {if $product.minimal_quantity < ($customization.quantity -$quantityDisplayed) OR $product.minimal_quantity <= 1} + + {l s='Subtract'} + + {else} + + {l s='Subtract'} + + {/if} +
        + + +
        {$discount.name}{$discount.description}{l s='Delete'} + {if $discount.value_real > 0} + {if !$priceDisplay}{displayPrice price=$discount.value_real*-1}{else}{displayPrice price=$discount.value_tax_exc*-1}{/if} + {/if} +
        +
        + +{if $voucherAllowed} +
        + {if isset($errors_discount) && $errors_discount} +
          + {foreach from=$errors_discount key=k item=error} +
        • {$error|escape:'htmlall':'UTF-8'}
        • + {/foreach} +
        + {/if} +
        +
        +

        {l s='Vouchers'}

        +

        + + +

        +

        + {if $displayVouchers} +

        {l s='Take advantage of our offers:'}

        +
        + {foreach from=$displayVouchers item=voucher} + {$voucher.name} - {$voucher.description}
        + {/foreach} +
        + {/if} +
        +
        +
        +{/if} +
        {$HOOK_SHOPPING_CART}
        +{if (($carrier->id AND !isset($virtualCart)) OR $delivery->id OR $invoice->id) AND !$opc} +
        + {if $delivery->id} +
          +
        • {l s='Delivery address'}
        • + {if $delivery->company}
        • {$delivery->company|escape:'htmlall':'UTF-8'}
        • {/if} +
        • {$delivery->firstname|escape:'htmlall':'UTF-8'} {$delivery->lastname|escape:'htmlall':'UTF-8'}
        • +
        • {$delivery->address1|escape:'htmlall':'UTF-8'}
        • + {if $delivery->address2}
        • {$delivery->address2|escape:'htmlall':'UTF-8'}
        • {/if} +
        • {$delivery->postcode|escape:'htmlall':'UTF-8'} {$delivery->city|escape:'htmlall':'UTF-8'}
        • +
        • {$delivery->country|escape:'htmlall':'UTF-8'} {if $delivery_state}({$delivery_state|escape:'htmlall':'UTF-8'}){/if}
        • +
        + {/if} + {if $invoice->id} +
          +
        • {l s='Invoice address'}
        • + {if $invoice->company}
        • {$invoice->company|escape:'htmlall':'UTF-8'}
        • {/if} +
        • {$invoice->firstname|escape:'htmlall':'UTF-8'} {$invoice->lastname|escape:'htmlall':'UTF-8'}
        • +
        • {$invoice->address1|escape:'htmlall':'UTF-8'}
        • + {if $invoice->address2}
        • {$invoice->address2|escape:'htmlall':'UTF-8'}
        • {/if} +
        • {$invoice->postcode|escape:'htmlall':'UTF-8'} {$invoice->city|escape:'htmlall':'UTF-8'}
        • +
        • {$invoice->country|escape:'htmlall':'UTF-8'} {if $invoice_state}({$invoice_state|escape:'htmlall':'UTF-8'}){/if}
        • +
        + {/if} + {if $carrier->id AND !isset($virtualCart)} +
        +

        {l s='Carrier:'}

        + {if isset($carrierPicture)}{l s='Carrier'}{/if} + {$carrier->name|escape:'htmlall':'UTF-8'} +
        + {/if} +
        +{/if} +

        + {if !$opc}{l s='Next'} »{/if} + « {l s='Continue shopping'} +

        +



        +
        +

        + {$HOOK_SHOPPING_CART_EXTRA} +

        +{/if} + diff --git a/themes/prestashop/sitemap.tpl b/themes/prestashop/sitemap.tpl new file mode 100644 index 000000000..41dbfd7fe --- /dev/null +++ b/themes/prestashop/sitemap.tpl @@ -0,0 +1,90 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 7471 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Sitemap'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Sitemap'}

        +
        +
        +

        {l s='Our offers'}

        + +
        +
        +

        {l s='Your Account'}

        + +
        +
        +
        +
        +
        +

        {l s='Categories'}

        + +
          + {if isset($categoriesTree.children)} + {foreach from=$categoriesTree.children item=child name=sitemapTree} + {if $smarty.foreach.sitemapTree.last} + {include file="$tpl_dir./category-tree-branch.tpl" node=$child last='true'} + {else} + {include file="$tpl_dir./category-tree-branch.tpl" node=$child} + {/if} + {/foreach} + {/if} +
        +
        +
        +

        {l s='Pages'}

        + +
          + {if isset($categoriescmsTree.children)} + {foreach from=$categoriescmsTree.children item=child name=sitemapCmsTree} + {if (isset($child.children) && $child.children|@count > 0) || $child.cms|@count > 0} + {include file="$tpl_dir./category-cms-tree-branch.tpl" node=$child} + {/if} + {/foreach} + {/if} + {foreach from=$categoriescmsTree.cms item=cms name=cmsTree} +
        • {$cms.meta_title|escape:'htmlall':'UTF-8'}
        • + {/foreach} +
        • {l s='Contact'}
        • + {if $display_store}
        • {l s='Our stores'}
        • {/if} +
        +
        +
        diff --git a/themes/prestashop/store_infos.tpl b/themes/prestashop/store_infos.tpl new file mode 100644 index 000000000..aa20de585 --- /dev/null +++ b/themes/prestashop/store_infos.tpl @@ -0,0 +1,45 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} +{* The following lines allow translations in back-office and has to stay commented + + {l s='Monday'} + {l s='Tuesday'} + {l s='Wednesday'} + {l s='Thursday'} + {l s='Friday'} + {l s='Saturday'} + {l s='Sunday'} +*} +
        +
        +{l s='Hours:'} + + {foreach from=$days_datas item=one_day} + + + + {/foreach} +
        {l s=$one_day.day}{$one_day.hours}
        diff --git a/themes/prestashop/stores.tpl b/themes/prestashop/stores.tpl new file mode 100644 index 000000000..2df967162 --- /dev/null +++ b/themes/prestashop/stores.tpl @@ -0,0 +1,100 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Our stores'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + + + +

        {l s='Our stores'}

        + +{if $simplifiedStoresDiplay} + {if $stores|@count} +

        {l s='Here are the details of our stores, feel free to contact us:'}

        + {foreach from=$stores item=store} +
        + {if $store.has_picture}

        {/if} +

        + {$store.name|escape:'htmlall':'UTF-8'}
        + {$store.address1|escape:'htmlall':'UTF-8'}
        + {if $store.address2}{$store.address2|escape:'htmlall':'UTF-8'}{/if}
        + {$store.postcode} {$store.city|escape:'htmlall':'UTF-8'}{if $store.state}, {$store.state}{/if}
        + {$store.country|escape:'htmlall':'UTF-8'}
        + {if $store.phone}{l s='Phone:' js=0} {$store.phone}{/if} +

        +
        + {/foreach} + {/if} +{else} + + +

        {l s='Enter a location (eg.: a zip/postal code, an address, a city or a country) in order to find the nearest stores.'}

        +

        {l s='Your location:'}

        +

        + {l s='Radius:'} + {$distance_unit} + + +

        +
        +
        + + + + + + + +
        {l s='#'}{l s='Store'}{l s='Address'}{l s='Distance'}
        +{/if} diff --git a/themes/prestashop/supplier-list.tpl b/themes/prestashop/supplier-list.tpl new file mode 100644 index 000000000..de7a4cced --- /dev/null +++ b/themes/prestashop/supplier-list.tpl @@ -0,0 +1,106 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path}{l s='Suppliers'}{/capture} +{include file="$tpl_dir./breadcrumb.tpl"} + +

        {l s='Suppliers'}

        + +{if isset($errors) AND $errors} + {include file="$tpl_dir./errors.tpl"} +{else} + +

        {strip} + + {if $nbSuppliers == 0}{l s='There are no suppliers.'} + {else} + {if $nbSuppliers == 1}{l s='There is'}{else}{l s='There are'}{/if}  + {$nbSuppliers}  + {if $nbSuppliers == 1}{l s='supplier.'}{else}{l s='suppliers.'}{/if} + {/if} + {/strip} +

        + +{if $nbSuppliers > 0} + + {include file="$tpl_dir./pagination.tpl"} +{/if} +{/if} diff --git a/themes/prestashop/supplier.tpl b/themes/prestashop/supplier.tpl new file mode 100644 index 000000000..05643afb9 --- /dev/null +++ b/themes/prestashop/supplier.tpl @@ -0,0 +1,41 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{include file="$tpl_dir./breadcrumb.tpl"} + +{include file="$tpl_dir./errors.tpl"} + +{if !isset($errors) OR !sizeof($errors)} +

        {l s='List of products by supplier:'} {$supplier->name|escape:'htmlall':'UTF-8'}

        + + {if $products} + {include file="$tpl_dir./product-sort.tpl"} + {include file="$tpl_dir./product-list.tpl" products=$products} + {include file="$tpl_dir./pagination.tpl"} + {else} +

        {l s='No products for this supplier.'}

        + {/if} +{/if} \ No newline at end of file diff --git a/tools/.htaccess b/tools/.htaccess new file mode 100755 index 000000000..93169e4eb --- /dev/null +++ b/tools/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/tools/fpdf/font/courier.php b/tools/fpdf/font/courier.php new file mode 100644 index 000000000..4c009f39b --- /dev/null +++ b/tools/fpdf/font/courier.php @@ -0,0 +1,7 @@ + diff --git a/tools/fpdf/font/helvetica.php b/tools/fpdf/font/helvetica.php new file mode 100644 index 000000000..8fa7683e7 --- /dev/null +++ b/tools/fpdf/font/helvetica.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/tools/fpdf/font/helveticab.php b/tools/fpdf/font/helveticab.php new file mode 100644 index 000000000..a8473c94d --- /dev/null +++ b/tools/fpdf/font/helveticab.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/tools/fpdf/font/helveticabi.php b/tools/fpdf/font/helveticabi.php new file mode 100644 index 000000000..41379537d --- /dev/null +++ b/tools/fpdf/font/helveticabi.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/tools/fpdf/font/helveticai.php b/tools/fpdf/font/helveticai.php new file mode 100644 index 000000000..d5bb6e094 --- /dev/null +++ b/tools/fpdf/font/helveticai.php @@ -0,0 +1,15 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/tools/fpdf/font/index.php b/tools/fpdf/font/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/tools/fpdf/font/index.php @@ -0,0 +1,11 @@ +Error:
        encoding not found: '.$enc); + $cc2gn=array(); + foreach($a as $l) + { + if($l[0]=='!') + { + $e=preg_split('/[ \\t]+/',rtrim($l)); + $cc=hexdec(substr($e[0],1)); + $gn=$e[2]; + $cc2gn[$cc]=$gn; + } + } + for($i=0;$i<=255;$i++) + { + if(!isset($cc2gn[$i])) + $cc2gn[$i]='.notdef'; + } + return $cc2gn; +} + +function ReadAFM($file, &$map) +{ + //Read a font metric file + $a=file($file); + if(empty($a)) + die('File not found'); + $widths=array(); + $fm=array(); + $fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent', + 'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut', + 'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent', + 'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent', + 'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent', + 'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat', + 'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb', + 'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong'); + foreach($a as $l) + { + $e=explode(' ',rtrim($l)); + if(count($e)<2) + continue; + $code=$e[0]; + $param=$e[1]; + if($code=='C') + { + //Character metrics + $cc=(int)$e[1]; + $w=$e[4]; + $gn=$e[7]; + if(substr($gn,-4)=='20AC') + $gn='Euro'; + if(isset($fix[$gn])) + { + //Fix incorrect glyph name + foreach($map as $c=>$n) + { + if($n==$fix[$gn]) + $map[$c]=$gn; + } + } + if(empty($map)) + { + //Symbolic font: use built-in encoding + $widths[$cc]=$w; + } + else + { + $widths[$gn]=$w; + if($gn=='X') + $fm['CapXHeight']=$e[13]; + } + if($gn=='.notdef') + $fm['MissingWidth']=$w; + } + elseif($code=='FontName') + $fm['FontName']=$param; + elseif($code=='Weight') + $fm['Weight']=$param; + elseif($code=='ItalicAngle') + $fm['ItalicAngle']=(double)$param; + elseif($code=='Ascender') + $fm['Ascender']=(int)$param; + elseif($code=='Descender') + $fm['Descender']=(int)$param; + elseif($code=='UnderlineThickness') + $fm['UnderlineThickness']=(int)$param; + elseif($code=='UnderlinePosition') + $fm['UnderlinePosition']=(int)$param; + elseif($code=='IsFixedPitch') + $fm['IsFixedPitch']=($param=='true'); + elseif($code=='FontBBox') + $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); + elseif($code=='CapHeight') + $fm['CapHeight']=(int)$param; + elseif($code=='StdVW') + $fm['StdVW']=(int)$param; + } + if(!isset($fm['FontName'])) + die('FontName not found'); + if(!empty($map)) + { + if(!isset($widths['.notdef'])) + $widths['.notdef']=600; + if(!isset($widths['Delta']) && isset($widths['increment'])) + $widths['Delta']=$widths['increment']; + //Order widths according to map + for($i=0;$i<=255;$i++) + { + if(!isset($widths[$map[$i]])) + { + echo 'Warning: character '.$map[$i].' is missing
        '; + $widths[$i]=$widths['.notdef']; + } + else + $widths[$i]=$widths[$map[$i]]; + } + } + $fm['Widths']=$widths; + return $fm; +} + +function MakeFontDescriptor($fm, $symbolic) +{ + //Ascent + $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd="array('Ascent'=>".$asc; + //Descent + $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd.=",'Descent'=>".$desc; + //CapHeight + if(isset($fm['CapHeight'])) + $ch=$fm['CapHeight']; + elseif(isset($fm['CapXHeight'])) + $ch=$fm['CapXHeight']; + else + $ch=$asc; + $fd.=",'CapHeight'=>".$ch; + //Flags + $flags=0; + if(isset($fm['IsFixedPitch']) && $fm['IsFixedPitch']) + $flags+=1<<0; + if($symbolic) + $flags+=1<<2; + if(!$symbolic) + $flags+=1<<5; + if(isset($fm['ItalicAngle']) && $fm['ItalicAngle']!=0) + $flags+=1<<6; + $fd.=",'Flags'=>".$flags; + //FontBBox + if(isset($fm['FontBBox'])) + $fbb=$fm['FontBBox']; + else + $fbb=array(0,$desc-100,1000,$asc+100); + $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd.=",'ItalicAngle'=>".$ia; + //StemV + if(isset($fm['StdVW'])) + $stemv=$fm['StdVW']; + elseif(isset($fm['Weight']) && preg_match('/bold|black/i',$fm['Weight'])) + $stemv=120; + else + $stemv=70; + $fd.=",'StemV'=>".$stemv; + //MissingWidth + if(isset($fm['MissingWidth'])) + $fd.=",'MissingWidth'=>".$fm['MissingWidth']; + $fd.=')'; + return $fd; +} + +function MakeWidthArray($fm) +{ + //Make character width array + $s="array(\n\t"; + $cw=$fm['Widths']; + for($i=0;$i<=255;$i++) + { + if(chr($i)=="'") + $s.="'\\''"; + elseif(chr($i)=="\\") + $s.="'\\\\'"; + elseif($i>=32 && $i<=126) + $s.="'".chr($i)."'"; + else + $s.="chr($i)"; + $s.='=>'.$fm['Widths'][$i]; + if($i<255) + $s.=','; + if(($i+1)%22==0) + $s.="\n\t"; + } + $s.=')'; + return $s; +} + +function MakeFontEncoding($map) +{ + //Build differences from reference encoding + $ref=ReadMap('cp1252'); + $s=''; + $last=0; + for($i=32;$i<=255;$i++) + { + if($map[$i]!=$ref[$i]) + { + if($i!=$last+1) + $s.=$i.' '; + $last=$i; + $s.='/'.$map[$i].' '; + } + } + return rtrim($s); +} + +function SaveToFile($file, $s, $mode) +{ + $f=fopen($file,'w'.$mode); + if(!$f) + die('Can\'t write to file '.$file); + fwrite($f,$s,strlen($s)); + fclose($f); +} + +function ReadShort($f) +{ + $a=unpack('n1n',fread($f,2)); + return $a['n']; +} + +function ReadLong($f) +{ + $a=unpack('N1N',fread($f,4)); + return $a['N']; +} + +function CheckTTF($file) +{ + //Check if font license allows embedding + $f=fopen($file,'rb'); + if(!$f) + die('Error: Can\'t open '.$file); + //Extract number of tables + fseek($f,4,SEEK_CUR); + $nb=ReadShort($f); + fseek($f,6,SEEK_CUR); + //Seek OS/2 table + $found=false; + for($i=0;$i<$nb;$i++) + { + if(fread($f,4)=='OS/2') + { + $found=true; + break; + } + fseek($f,12,SEEK_CUR); + } + if(!$found) + { + fclose($f); + return; + } + fseek($f,4,SEEK_CUR); + $offset=ReadLong($f); + fseek($f,$offset,SEEK_SET); + //Extract fsType flags + fseek($f,8,SEEK_CUR); + $fsType=ReadShort($f); + $rl=($fsType & 0x02)!=0; + $pp=($fsType & 0x04)!=0; + $e=($fsType & 0x08)!=0; + fclose($f); + if($rl && !$pp && !$e) + echo 'Warning: font license does not allow embedding'; +} + +/******************************************************************************* +* fontfile : chemin du fichier TTF (ou chane vide si pas d'incorporation) * +* afmfile : chemin du fichier AFM * +* enc : encodage (ou chane vide si la police est symbolique) * +* patch : patch optionnel pour l'encodage * +* type : type de la police si fontfile est vide * +*******************************************************************************/ +function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='TrueType') +{ + ini_set('auto_detect_line_endings','1'); + if($enc) + { + $map=ReadMap($enc); + foreach($patch as $cc=>$gn) + $map[$cc]=$gn; + } + else + $map=array(); + if(!file_exists($afmfile)) + die('Error: AFM file not found: '.$afmfile); + $fm=ReadAFM($afmfile,$map); + if($enc) + $diff=MakeFontEncoding($map); + else + $diff=''; + $fd=MakeFontDescriptor($fm,empty($map)); + //Find font type + if($fontfile) + { + $ext=strtolower(substr($fontfile,-3)); + if($ext=='ttf') + $type='TrueType'; + elseif($ext=='pfb') + $type='Type1'; + else + die('Error: unrecognized font file extension: '.$ext); + } + else + { + if($type!='TrueType' && $type!='Type1') + die('Error: incorrect font type: '.$type); + } + //Start generation + $s='Error:
        font file not found: '.$fontfile); + if($type=='TrueType') + CheckTTF($fontfile); + $f=fopen($fontfile,'rb'); + if(!$f) + die('Error: Can\'t open '.$fontfile); + $file=fread($f,filesize($fontfile)); + fclose($f); + if($type=='Type1') + { + //Find first two sections and discard third one + $header=(ord($file[0])==128); + if($header) + { + //Strip first binary header + $file=substr($file,6); + } + $pos=strpos($file,'eexec'); + if(!$pos) + die('Error: font file does not seem to be valid Type1'); + $size1=$pos+6; + if($header && ord($file[$size1])==128) + { + //Strip second binary header + $file=substr($file,0,$size1).substr($file,$size1+6); + } + $pos=strpos($file,'00000000'); + if(!$pos) + die('Error: font file does not seem to be valid Type1'); + $size2=$pos-$size1; + $file=substr($file,0,$size1+$size2); + } + if(function_exists('gzcompress')) + { + $cmp=$basename.'.z'; + SaveToFile($cmp,gzcompress($file),'b'); + $s.='$file=\''.$cmp."';\n"; + echo 'Font file compressed ('.$cmp.')
        '; + } + else + { + $s.='$file=\''.basename($fontfile)."';\n"; + echo 'Notice: font file could not be compressed (zlib extension not available)
        '; + } + if($type=='Type1') + { + $s.='$size1='.$size1.";\n"; + $s.='$size2='.$size2.";\n"; + } + else + $s.='$originalsize='.filesize($fontfile).";\n"; + } + else + { + //Not embedded font + $s.='$file='."'';\n"; + } + $s.="?>\n"; + SaveToFile($basename.'.php',$s,'t'); + echo 'Font definition file generated ('.$basename.'.php'.')
        '; +} +?> diff --git a/tools/fpdf/font/symbol.php b/tools/fpdf/font/symbol.php new file mode 100644 index 000000000..b556ed84c --- /dev/null +++ b/tools/fpdf/font/symbol.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); +?> diff --git a/tools/fpdf/font/times.php b/tools/fpdf/font/times.php new file mode 100644 index 000000000..b9be1b21d --- /dev/null +++ b/tools/fpdf/font/times.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); +?> diff --git a/tools/fpdf/font/timesb.php b/tools/fpdf/font/timesb.php new file mode 100644 index 000000000..c3eb9fa75 --- /dev/null +++ b/tools/fpdf/font/timesb.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/tools/fpdf/font/timesbi.php b/tools/fpdf/font/timesbi.php new file mode 100644 index 000000000..161f6302c --- /dev/null +++ b/tools/fpdf/font/timesbi.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/tools/fpdf/font/timesi.php b/tools/fpdf/font/timesi.php new file mode 100644 index 000000000..de171fd19 --- /dev/null +++ b/tools/fpdf/font/timesi.php @@ -0,0 +1,15 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/tools/fpdf/font/zapfdingbats.php b/tools/fpdf/font/zapfdingbats.php new file mode 100644 index 000000000..f2bdfd5c9 --- /dev/null +++ b/tools/fpdf/font/zapfdingbats.php @@ -0,0 +1,15 @@ +0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); +?> diff --git a/tools/fpdf/fpdf.php b/tools/fpdf/fpdf.php new file mode 100644 index 000000000..76495eb64 --- /dev/null +++ b/tools/fpdf/fpdf.php @@ -0,0 +1,1729 @@ +_dochecks(); + //Initialization of properties + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->pages=array(); + $this->PageSizes=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->diffs=array(); + $this->images=array(); + $this->links=array(); + $this->InHeader=false; + $this->InFooter=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=12; + $this->underline=false; + $this->DrawColor='0 G'; + $this->FillColor='0 g'; + $this->TextColor='0 g'; + $this->ColorFlag=false; + $this->ws=0; + //Standard fonts + $this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol', 'zapfdingbats'=>'ZapfDingbats'); + //Scale factor + if($unit=='pt') + $this->k=1; + elseif($unit=='mm') + $this->k=72/25.4; + elseif($unit=='cm') + $this->k=72/2.54; + elseif($unit=='in') + $this->k=72; + else + $this->Error('Incorrect unit: '.$unit); + //Page format + $this->PageFormats=array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + if(is_string($format)) + $format=$this->_getpageformat($format); + $this->DefPageFormat=$format; + $this->CurPageFormat=$format; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation='P'; + $this->w=$this->DefPageFormat[0]; + $this->h=$this->DefPageFormat[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation='L'; + $this->w=$this->DefPageFormat[1]; + $this->h=$this->DefPageFormat[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$this->DefOrientation; + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + //Page margins (1 cm) + $margin=28.35/$this->k; + $this->SetMargins($margin,$margin); + //Interior cell margin (1 mm) + $this->cMargin=$margin/10; + //Line width (0.2 mm) + $this->LineWidth=.567/$this->k; + //Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + //Full width display mode + $this->SetDisplayMode('fullwidth'); + //Enable compression + $this->SetCompression(true); + //Set default PDF version number + $this->PDFVersion='1.3'; +} + +function SetMargins($left, $top, $right=null) +{ + //Set left, top and right margins + $this->lMargin=$left; + $this->tMargin=$top; + if($right===null) + $right=$left; + $this->rMargin=$right; +} + +function SetLeftMargin($margin) +{ + //Set left margin + $this->lMargin=$margin; + if($this->page>0 && $this->x<$margin) + $this->x=$margin; +} + +function SetTopMargin($margin) +{ + //Set top margin + $this->tMargin=$margin; +} + +function SetRightMargin($margin) +{ + //Set right margin + $this->rMargin=$margin; +} + +function SetAutoPageBreak($auto, $margin=0) +{ + //Set auto page break mode and triggering margin + $this->AutoPageBreak=$auto; + $this->bMargin=$margin; + $this->PageBreakTrigger=$this->h-$margin; +} + +function SetDisplayMode($zoom, $layout='continuous') +{ + //Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode=$layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + //Set page compression + if(function_exists('gzcompress')) + $this->compress=$compress; + else + $this->compress=false; +} + +function SetTitle($title, $isUTF8=false) +{ + //Title of document + if($isUTF8) + $title=$this->_UTF8toUTF16($title); + $this->title=$title; +} + +function SetSubject($subject, $isUTF8=false) +{ + //Subject of document + if($isUTF8) + $subject=$this->_UTF8toUTF16($subject); + $this->subject=$subject; +} + +function SetAuthor($author, $isUTF8=false) +{ + //Author of document + if($isUTF8) + $author=$this->_UTF8toUTF16($author); + $this->author=$author; +} + +function SetKeywords($keywords, $isUTF8=false) +{ + //Keywords of document + if($isUTF8) + $keywords=$this->_UTF8toUTF16($keywords); + $this->keywords=$keywords; +} + +function SetCreator($creator, $isUTF8=false) +{ + //Creator of document + if($isUTF8) + $creator=$this->_UTF8toUTF16($creator); + $this->creator=$creator; +} + +function AliasNbPages($alias='{nb}') +{ + //Define an alias for total number of pages + $this->AliasNbPages=$alias; +} + +function Error($msg) +{ + //Fatal error + die('FPDF error: '.$msg); +} + +function Open() +{ + //Begin document + $this->state=1; +} + +function Close() +{ + //Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + //Close document + $this->_enddoc(); +} + +function AddPage($orientation='', $format='') +{ + //Start a new page + if($this->state==0) + $this->Open(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->underline ? 'U' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + if($this->page>0) + { + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + } + //Start new page + $this->_beginpage($orientation,$format); + //Set line cap style to square + $this->_out('2 J'); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + //Set font + if($family) + $this->SetFont($family,$style,$size); + //Set colors + $this->DrawColor=$dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor=$fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + //Page header + $this->InHeader=true; + $this->Header(); + $this->InHeader=false; + //Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + //Restore font + if($family) + $this->SetFont($family,$style,$size); + //Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor=$dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor=$fc; + $this->_out($fc); + } + $this->TextColor=$tc; + $this->ColorFlag=$cf; +} + +function Header() +{ + //To be implemented in your own inherited class +} + +function Footer() +{ + //To be implemented in your own inherited class +} + +function PageNo() +{ + //Get current page number + return $this->page; +} + +function SetDrawColor($r, $g=null, $b=null) +{ + //Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor=sprintf('%.3F G',$r/255); + else + $this->DrawColor=sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r, $g=null, $b=null) +{ + //Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor=sprintf('%.3F g',$r/255); + else + $this->FillColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r, $g=null, $b=null) +{ + //Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor=sprintf('%.3F g',$r/255); + else + $this->TextColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + //Get width of a string in the current font + $s=(string)$s; + $cw=&$this->CurrentFont['cw']; + $w=0; + $l=strlen($s); + for($i=0;$i<$l;$i++) + $w+=$cw[$s[$i]]; + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + //Set line width + $this->LineWidth=$width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); +} + +function Line($x1, $y1, $x2, $y2) +{ + //Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x, $y, $w, $h, $style='') +{ + //Draw a rectangle + if($style=='F') + $op='f'; + elseif($style=='FD' || $style=='DF') + $op='B'; + else + $op='S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family, $style='', $file='') +{ + //Add a TrueType or Type1 font + $family=strtolower($family); + if($file=='') + $file=str_replace(' ','',$family).strtolower($style).'.php'; + if($family=='arial') + $family='helvetica'; + $style=strtoupper($style); + if($style=='IB') + $style='BI'; + $fontkey=$family.$style; + if(isset($this->fonts[$fontkey])) + return; + include($this->_getfontpath().$file); + if(!isset($name)) + $this->Error('Could not include font definition file'); + $i=count($this->fonts)+1; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file); + if($diff) + { + //Search existing encodings + $d=0; + $nb=count($this->diffs); + for($i=1;$i<=$nb;$i++) + { + if($this->diffs[$i]==$diff) + { + $d=$i; + break; + } + } + if($d==0) + { + $d=$nb+1; + $this->diffs[$d]=$diff; + } + $this->fonts[$fontkey]['diff']=$d; + } + if($file) + { + if($type=='TrueType') + $this->FontFiles[$file]=array('length1'=>$originalsize); + else + $this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2); + } +} + +function SetFont($family, $style='', $size=0) +{ + //Select a font; size given in points + global $fpdf_charwidths; + + $family=strtolower($family); + if($family=='') + $family=$this->FontFamily; + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + $style=strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline=true; + $style=str_replace('U','',$style); + } + else + $this->underline=false; + if($style=='IB') + $style='BI'; + if($size==0) + $size=$this->FontSizePt; + //Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + //Test if used for the first time + $fontkey=$family.$style; + if(!isset($this->fonts[$fontkey])) + { + //Check if one of the standard fonts + if(isset($this->CoreFonts[$fontkey])) + { + if(!isset($fpdf_charwidths[$fontkey])) + { + //Load metric file + $file=$family; + if($family=='times' || $family=='helvetica') + $file.=strtolower($style); + include($this->_getfontpath().$file.'.php'); + if(!isset($fpdf_charwidths[$fontkey])) + $this->Error('Could not include font metric file'); + } + $i=count($this->fonts)+1; + $name=$this->CoreFonts[$fontkey]; + $cw=$fpdf_charwidths[$fontkey]; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + $this->CurrentFont=&$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + //Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + //Create a new internal link + $n=count($this->links)+1; + $this->links[$n]=array(0, 0); + return $n; +} + +function SetLink($link, $y=0, $page=-1) +{ + //Set destination of internal link + if($y==-1) + $y=$this->y; + if($page==-1) + $page=$this->page; + $this->links[$link]=array($page, $y); +} + +function Link($x, $y, $w, $h, $link) +{ + //Put a link on the page + $this->PageLinks[$this->page][]=array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); +} + +function Text($x, $y, $txt) +{ + //Output a string + $s=sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s.=' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s='q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + //Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') +{ + //Output a cell + $k=$this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x=$this->x; + $ws=$this->ws; + if($ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x; + if($ws>0) + { + $this->ws=$ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $s=''; + if($fill || $border==1) + { + if($fill) + $op=($border==1) ? 'B' : 'f'; + else + $op='S'; + $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x=$this->x; + $y=$this->y; + if(strpos($border,'L')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if($align=='R') + $dx=$w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx=($w-$this->GetStringWidth($txt))/2; + else + $dx=$this->cMargin; + if($this->ColorFlag) + $s.='q '.$this->TextColor.' '; + $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); + $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + if($this->underline) + $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s.=' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth=$h; + if($ln>0) + { + //Go to next line + $this->y+=$h; + if($ln==1) + $this->x=$this->lMargin; + } + else + $this->x+=$w; +} + +function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) +{ + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b=0; + if($border) + { + if($border==1) + { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else + { + $b2=''; + if(strpos($border,'L')!==false) + $b2.='L'; + if(strpos($border,'R')!==false) + $b2.='R'; + $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + continue; + } + if($c==' ') + { + $sep=$i; + $ls=$l; + $ns++; + } + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + } + else + $i++; + } + //Last chunk + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b.='B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x=$this->lMargin; +} + +function Write($h, $txt, $link='') +{ + //Output text in flowing mode + $cw=&$this->CurrentFont['cw']; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + $sep=-1; + $i=0; + $j=0; + $l=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep=$i; + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + //Move to next line + $this->x=$this->lMargin; + $this->y+=$h; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + //Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); +} + +function Ln($h=null) +{ + //Line feed; default value is last cell height + $this->x=$this->lMargin; + if($h===null) + $this->y+=$this->lasth; + else + $this->y+=$h; +} + +function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') +{ + //Put an image on the page + if(!isset($this->images[$file])) + { + //First use of this image, get info + if($type=='') + { + $pos=strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type=substr($file,$pos+1); + } + $type=strtolower($type); + if($type=='jpeg') + $type='jpg'; + $mtd='_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info=$this->$mtd($file); + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + else + $info=$this->images[$file]; + //Automatic width and height calculation if needed + if($w==0 && $h==0) + { + //Put image at 72 dpi + $w=$info['w']/$this->k; + $h=$info['h']/$this->k; + } + elseif($w==0) + $w=$h*$info['w']/$info['h']; + elseif($h==0) + $h=$w*$info['h']/$info['w']; + //Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x2=$this->x; + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x2; + } + $y=$this->y; + $this->y+=$h; + } + if($x===null) + $x=$this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function GetX() +{ + //Get x position + return $this->x; +} + +function SetX($x) +{ + //Set x position + if($x>=0) + $this->x=$x; + else + $this->x=$this->w+$x; +} + +function GetY() +{ + //Get y position + return $this->y; +} + +function SetY($y) +{ + //Set y position and reset x + $this->x=$this->lMargin; + if($y>=0) + $this->y=$y; + else + $this->y=$this->h+$y; +} + +function SetXY($x, $y) +{ + //Set x and y positions + $this->SetY($y); + $this->SetX($x); +} + +function Output($name='', $dest='') +{ + //Output PDF to some destination + if($this->state<3) + $this->Close(); + $dest=strtoupper($dest); + if($dest=='') + { + if($name=='') + { + $name='doc.pdf'; + $dest='I'; + } + else + $dest='F'; + } + switch($dest) + { + case 'I': + //Send to standard output + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if(php_sapi_name()!='cli') + { + //We send to a browser + header('Content-Type: application/pdf'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: inline; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + } + echo $this->buffer; + break; + case 'D': + //Download file + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Type: application/x-download'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: attachment; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + echo $this->buffer; + break; + case 'F': + //Save to local file + $f=fopen($name,'wb'); + if(!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + //Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* * +* Protected methods * +* * +*******************************************************************************/ +function _dochecks() +{ + //Check availability of %F + if(sprintf('%.1F',1.0)!='1.0') + $this->Error('This version of PHP is not supported'); + //Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); +} + +function _getpageformat($format) +{ + $format=strtolower($format); + if(!isset($this->PageFormats[$format])) + $this->Error('Unknown page format: '.$format); + $a=$this->PageFormats[$format]; + return array($a[0]/$this->k, $a[1]/$this->k); +} + +function _getfontpath() +{ + if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) + define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); + return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; +} + +function _beginpage($orientation, $format) +{ + $this->page++; + $this->pages[$this->page]=''; + $this->state=2; + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + //Check page size + if($orientation=='') + $orientation=$this->DefOrientation; + else + $orientation=strtoupper($orientation[0]); + if($format=='') + $format=$this->DefPageFormat; + else + { + if(is_string($format)) + $format=$this->_getpageformat($format); + } + if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) + { + //New size + if($orientation=='P') + { + $this->w=$format[0]; + $this->h=$format[1]; + } + else + { + $this->w=$format[1]; + $this->h=$format[0]; + } + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + $this->PageBreakTrigger=$this->h-$this->bMargin; + $this->CurOrientation=$orientation; + $this->CurPageFormat=$format; + } + if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1]) + $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); +} + +function _endpage() +{ + $this->state=1; +} + +function _escape($s) +{ + //Escape special characters in strings + $s=str_replace('\\','\\\\',$s); + $s=str_replace('(','\\(',$s); + $s=str_replace(')','\\)',$s); + $s=str_replace("\r",'\\r',$s); + return $s; +} + +function _textstring($s) +{ + //Format a text string + return '('.$this->_escape($s).')'; +} + +function _UTF8toUTF16($s) +{ + //Convert UTF-8 to UTF-16BE with BOM + $res="\xFE\xFF"; + $nb=strlen($s); + $i=0; + while($i<$nb) + { + $c1=ord($s[$i++]); + if($c1>=224) + { + //3-byte character + $c2=ord($s[$i++]); + $c3=ord($s[$i++]); + $res.=chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res.=chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + //2-byte character + $c2=ord($s[$i++]); + $res.=chr(($c1 & 0x1C)>>2); + $res.=chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + //Single-byte character + $res.="\0".chr($c1); + } + } + return $res; +} + +function _dounderline($x, $y, $txt) +{ + //Underline text + $up=$this->CurrentFont['up']; + $ut=$this->CurrentFont['ut']; + $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +function _parsejpg($file) +{ + //Extract info from a JPEG file + $a=GetImageSize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace='DeviceRGB'; + elseif($a['channels']==4) + $colspace='DeviceCMYK'; + else + $colspace='DeviceGray'; + $bpc=isset($a['bits']) ? $a['bits'] : 8; + //Read whole file + $f=fopen($file,'rb'); + $data=''; + while(!feof($f)) + $data.=fread($f,8192); + fclose($f); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); +} + +function _parsepng($file) +{ + //Extract info from a PNG file + $f=fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + //Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + //Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w=$this->_readint($f); + $h=$this->_readint($f); + $bpc=ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct=ord($this->_readstream($f,1)); + if($ct==0) + $colspace='DeviceGray'; + elseif($ct==2) + $colspace='DeviceRGB'; + elseif($ct==3) + $colspace='Indexed'; + else + $this->Error('Alpha channel not supported: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $parms='/DecodeParms <>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $data=''; + do + { + $n=$this->_readint($f); + $type=$this->_readstream($f,4); + if($type=='PLTE') + { + //Read palette + $pal=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + //Read transparency info + $t=$this->_readstream($f,$n); + if($ct==0) + $trns=array(ord(substr($t,1,1))); + elseif($ct==2) + $trns=array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos=strpos($t,chr(0)); + if($pos!==false) + $trns=array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + //Read image data block + $data.=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + fclose($f); + return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); +} + +function _readstream($f, $n) +{ + //Read n bytes from stream + $res=''; + while($n>0 && !feof($f)) + { + $s=fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n-=strlen($s); + $res.=$s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; +} + +function _readint($f) +{ + //Read a 4-byte integer from stream + $a=unpack('Ni',$this->_readstream($f,4)); + return $a['i']; +} + +function _parsegif($file) +{ + //Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im=imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + $tmp=tempnam('.','gif'); + if(!$tmp) + $this->Error('Unable to create a temporary file'); + if(!imagepng($im,$tmp)) + $this->Error('Error while saving to temporary file'); + imagedestroy($im); + $info=$this->_parsepng($tmp); + unlink($tmp); + return $info; +} + +function _newobj() +{ + //Begin a new object + $this->n++; + $this->offsets[$this->n]=strlen($this->buffer); + $this->_out($this->n.' 0 obj'); +} + +function _putstream($s) +{ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + +function _out($s) +{ + //Add a line to the document + if($this->state==2) + $this->pages[$this->page].=$s."\n"; + else + $this->buffer.=$s."\n"; +} + +function _putpages() +{ + $nb=$this->page; + if(!empty($this->AliasNbPages)) + { + //Replace number of pages + for($n=1;$n<=$nb;$n++) + $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); + } + if($this->DefOrientation=='P') + { + $wPt=$this->DefPageFormat[0]*$this->k; + $hPt=$this->DefPageFormat[1]*$this->k; + } + else + { + $wPt=$this->DefPageFormat[1]*$this->k; + $hPt=$this->DefPageFormat[0]*$this->k; + } + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + for($n=1;$n<=$nb;$n++) + { + //Page + $this->_newobj(); + $this->_out('<_out('/Parent 1 0 R'); + if(isset($this->PageSizes[$n])) + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); + $this->_out('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + //Links + $annots='/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots.='<_textstring($pl[4]).'>>>>'; + else + { + $l=$this->links[$pl[4]]; + $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; + $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); + } + } + $this->_out($annots.']'); + } + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + //Page content + $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putfonts() +{ + $nf=$this->n; + foreach($this->diffs as $diff) + { + //Encodings + $this->_newobj(); + $this->_out('<>'); + $this->_out('endobj'); + } + foreach($this->FontFiles as $file=>$info) + { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n']=$this->n; + $font=''; + $f=fopen($this->_getfontpath().$file,'rb',1); + if(!$f) + $this->Error('Font file not found'); + while(!feof($f)) + $font.=fread($f,8192); + fclose($f); + $compressed=(substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + { + $header=(ord($font[0])==128); + if($header) + { + //Strip first binary header + $font=substr($font,6); + } + if($header && ord($font[$info['length1']])==128) + { + //Strip second binary header + $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); + } + } + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + foreach($this->fonts as $k=>$font) + { + //Font objects + $this->fonts[$k]['n']=$this->n+1; + $type=$font['type']; + $name=$font['name']; + if($type=='core') + { + //Standard font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + if($font['enc']) + { + if(isset($font['diff'])) + $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + //Widths + $this->_newobj(); + $cw=&$font['cw']; + $s='['; + for($i=32;$i<=255;$i++) + $s.=$cw[chr($i)].' '; + $this->_out($s.']'); + $this->_out('endobj'); + //Descriptor + $this->_newobj(); + $s='<$v) + $s.=' /'.$k.' '.$v; + $file=$font['file']; + if($file) + $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } + else + { + //Allow for additional types + $mtd='_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +function _putimages() +{ + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + while(list($file,$info)=each($this->images)) + { + $this->_newobj(); + $this->images[$file]['n']=$this->n; + $this->_out('<_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if(isset($info['parms'])) + $this->_out($info['parms']); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns=''; + for($i=0;$i_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + unset($this->images[$file]['data']); + $this->_out('endobj'); + //Palette + if($info['cs']=='Indexed') + { + $this->_newobj(); + $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } +} + +function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +function _putresourcedict() +{ + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); +} + +function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putinfo() +{ + $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); +} + +function _putcatalog() +{ + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_out('/PageLayout /TwoColumnLeft'); +} + +function _putheader() +{ + $this->_out('%PDF-'.$this->PDFVersion); +} + +function _puttrailer() +{ + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n-1).' 0 R'); +} + +function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + //Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + //Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + //Cross-ref + $o=strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + //Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state=3; +} +//End of class +} + +//Handle special IE contype request +if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype') +{ + header('Content-Type: application/pdf'); + exit; +} + +?> diff --git a/tools/fpdf/index.php b/tools/fpdf/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/tools/fpdf/index.php @@ -0,0 +1,11 @@ + 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5, +"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "AN" => 10, "AO" => 11, +"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17, +"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23, +"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29, +"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35, +"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41, +"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47, +"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53, +"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59, +"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65, +"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71, +"FM" => 72, "FO" => 73, "FR" => 74, "FX" => 75, "GA" => 76, "GB" => 77, +"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83, +"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89, +"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95, +"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101, +"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107, +"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113, +"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119, +"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125, +"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131, +"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137, +"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143, +"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149, +"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155, +"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161, +"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167, +"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173, +"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179, +"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185, +"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191, +"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197, +"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203, +"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209, +"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215, +"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221, +"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227, +"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233, +"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239, +"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245, +"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251, +"MF" => 252 +); + var $GEOIP_COUNTRY_CODES = array( +"", "AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ", +"AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", +"BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", +"CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", +"CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", +"EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "FX", "GA", "GB", +"GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", +"GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", +"IO", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", +"KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", +"LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML", "MM", "MN", +"MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", +"NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", +"PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", +"QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", +"SJ", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD", +"TF", "TG", "TH", "TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW", +"TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", +"VU", "WF", "WS", "YE", "YT", "RS", "ZA", "ZM", "ME", "ZW", "A1", "A2", "O1", +"AX", "GG", "IM", "JE", "BL", "MF" +); + var $GEOIP_COUNTRY_CODES3 = array( +"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","ATA","ARG", +"ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI", +"BEN","BMU","BRN","BOL","BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK", +"COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV", +"CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH", +"ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD", +"GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM","GUM", +"GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IOT", +"IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA", +"PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU", +"LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC", +"MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL", +"NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER", +"PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT", +"REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM", +"SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF", +"TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA", +"UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT", +"WLF","WSM","YEM","MYT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1", +"ALA","GGY","IMN","JEY","BLM","MAF" + ); + var $GEOIP_COUNTRY_NAMES = array( +"", "Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates", +"Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia", +"Netherlands Antilles", "Angola", "Antarctica", "Argentina", "American Samoa", +"Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina", +"Barbados", "Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain", +"Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia", "Brazil", +"Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize", +"Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the", +"Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook Islands", +"Chile", "Cameroon", "China", "Colombia", "Costa Rica", "Cuba", "Cape Verde", +"Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti", +"Denmark", "Dominica", "Dominican Republic", "Algeria", "Ecuador", "Estonia", +"Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji", +"Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe Islands", +"France", "France, Metropolitan", "Gabon", "United Kingdom", +"Grenada", "Georgia", "French Guiana", "Ghana", "Gibraltar", "Greenland", +"Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia and the South Sandwich Islands", +"Guatemala", "Guam", "Guinea-Bissau", +"Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras", +"Croatia", "Haiti", "Hungary", "Indonesia", "Ireland", "Israel", "India", +"British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of", +"Iceland", "Italy", "Jamaica", "Jordan", "Japan", "Kenya", "Kyrgyzstan", +"Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic People's Republic of", +"Korea, Republic of", "Kuwait", "Cayman Islands", +"Kazakhstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia", +"Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania", "Luxembourg", +"Latvia", "Libyan Arab Jamahiriya", "Morocco", "Monaco", "Moldova, Republic of", +"Madagascar", "Marshall Islands", "Macedonia", +"Mali", "Myanmar", "Mongolia", "Macau", "Northern Mariana Islands", +"Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives", +"Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia", +"Niger", "Norfolk Island", "Nigeria", "Nicaragua", "Netherlands", "Norway", +"Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French Polynesia", +"Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint Pierre and Miquelon", +"Pitcairn Islands", "Puerto Rico", "Palestinian Territory", +"Portugal", "Palau", "Paraguay", "Qatar", "Reunion", "Romania", +"Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands", +"Seychelles", "Sudan", "Sweden", "Singapore", "Saint Helena", "Slovenia", +"Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal", +"Somalia", "Suriname", "Sao Tome and Principe", "El Salvador", "Syrian Arab Republic", +"Swaziland", "Turks and Caicos Islands", "Chad", "French Southern Territories", +"Togo", "Thailand", "Tajikistan", "Tokelau", "Turkmenistan", +"Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu", +"Taiwan", "Tanzania, United Republic of", "Ukraine", +"Uganda", "United States Minor Outlying Islands", "United States", "Uruguay", +"Uzbekistan", "Holy See (Vatican City State)", "Saint Vincent and the Grenadines", +"Venezuela", "Virgin Islands, British", "Virgin Islands, U.S.", +"Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte", +"Serbia", "South Africa", "Zambia", "Montenegro", "Zimbabwe", +"Anonymous Proxy","Satellite Provider","Other", +"Aland Islands","Guernsey","Isle of Man","Jersey","Saint Barthelemy","Saint Martin" +); + + var $GEOIP_CONTINENT_CODES = array( + "--", "AS", "EU", "EU", "AS", "AS", "NA", "NA", "EU", "AS", + "NA", "AF", "AN", "SA", "OC", "EU", "OC", "NA", "AS", "EU", + "NA", "AS", "EU", "AF", "EU", "AS", "AF", "AF", "NA", "AS", + "SA", "SA", "NA", "AS", "AN", "AF", "EU", "NA", "NA", "AS", + "AF", "AF", "AF", "EU", "AF", "OC", "SA", "AF", "AS", "SA", + "NA", "NA", "AF", "AS", "AS", "EU", "EU", "AF", "EU", "NA", + "NA", "AF", "SA", "EU", "AF", "AF", "AF", "EU", "AF", "EU", + "OC", "SA", "OC", "EU", "EU", "EU", "AF", "EU", "NA", "AS", + "SA", "AF", "EU", "NA", "AF", "AF", "NA", "AF", "EU", "AN", + "NA", "OC", "AF", "SA", "AS", "AN", "NA", "EU", "NA", "EU", + "AS", "EU", "AS", "AS", "AS", "AS", "AS", "EU", "EU", "NA", + "AS", "AS", "AF", "AS", "AS", "OC", "AF", "NA", "AS", "AS", + "AS", "NA", "AS", "AS", "AS", "NA", "EU", "AS", "AF", "AF", + "EU", "EU", "EU", "AF", "AF", "EU", "EU", "AF", "OC", "EU", + "AF", "AS", "AS", "AS", "OC", "NA", "AF", "NA", "EU", "AF", + "AS", "AF", "NA", "AS", "AF", "AF", "OC", "AF", "OC", "AF", + "NA", "EU", "EU", "AS", "OC", "OC", "OC", "AS", "NA", "SA", + "OC", "OC", "AS", "AS", "EU", "NA", "OC", "NA", "AS", "EU", + "OC", "SA", "AS", "AF", "EU", "EU", "AF", "AS", "OC", "AF", + "AF", "EU", "AS", "AF", "EU", "EU", "EU", "AF", "EU", "AF", + "AF", "SA", "AF", "NA", "AS", "AF", "NA", "AF", "AN", "AF", + "AS", "AS", "OC", "AS", "AF", "OC", "AS", "EU", "NA", "OC", + "AS", "AF", "EU", "AF", "OC", "NA", "SA", "AS", "EU", "NA", + "SA", "NA", "NA", "AS", "OC", "OC", "OC", "AS", "AF", "EU", + "AF", "AF", "EU", "AF", "--", "--", "--", "EU", "EU", "EU", + "EU", "NA", "NA" +); + +} +function geoip_load_shared_mem ($file) { + + $fp = fopen($file, "rb"); + if (!$fp) { + print "error opening $file: $php_errormsg\n"; + exit; + } + $s_array = fstat($fp); + $size = $s_array['size']; + if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) { + shmop_delete ($shmid); + shmop_close ($shmid); + } + $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size); + shmop_write ($shmid, fread($fp, $size), 0); + shmop_close ($shmid); +} + +function _setup_segments($gi){ + $gi->databaseType = GEOIP_COUNTRY_EDITION; + $gi->record_length = STANDARD_RECORD_LENGTH; + if ($gi->flags & GEOIP_SHARED_MEMORY) { + $offset = @shmop_size ($gi->shmid) - 3; + for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) { + $delim = @shmop_read ($gi->shmid, $offset, 3); + $offset += 3; + if ($delim == (chr(255).chr(255).chr(255))) { + $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1)); + $offset++; + + if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ + $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0; + } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){ + $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1; + } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)|| + ($gi->databaseType == GEOIP_CITY_EDITION_REV1) + || ($gi->databaseType == GEOIP_ORG_EDITION) + || ($gi->databaseType == GEOIP_DOMAIN_EDITION) + || ($gi->databaseType == GEOIP_ISP_EDITION) + || ($gi->databaseType == GEOIP_LOCATIONA_EDITION) + || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION) + || ($gi->databaseType == GEOIP_ASNUM_EDITION)){ + $gi->databaseSegments = 0; + $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH); + for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){ + $gi->databaseSegments += (ord($buf[$j]) << ($j * 8)); + } + if (($gi->databaseType == GEOIP_ORG_EDITION) + || ($gi->databaseType == GEOIP_DOMAIN_EDITION) + || ($gi->databaseType == GEOIP_ISP_EDITION)) { + $gi->record_length = ORG_RECORD_LENGTH; + } + } + break; + } else { + $offset -= 4; + } + } + if (($gi->databaseType == GEOIP_COUNTRY_EDITION)|| + ($gi->databaseType == GEOIP_PROXY_EDITION)|| + ($gi->databaseType == GEOIP_NETSPEED_EDITION)){ + $gi->databaseSegments = GEOIP_COUNTRY_BEGIN; + } + } else { + $filepos = ftell($gi->filehandle); + fseek($gi->filehandle, -3, SEEK_END); + for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) { + $delim = fread($gi->filehandle,3); + if ($delim == (chr(255).chr(255).chr(255))){ + $gi->databaseType = ord(fread($gi->filehandle,1)); + if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ + $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0; + } + else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){ + $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1; + } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0) + || ($gi->databaseType == GEOIP_CITY_EDITION_REV1) + || ($gi->databaseType == GEOIP_ORG_EDITION) + || ($gi->databaseType == GEOIP_DOMAIN_EDITION) + || ($gi->databaseType == GEOIP_ISP_EDITION) + || ($gi->databaseType == GEOIP_LOCATIONA_EDITION) + || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION) + || ($gi->databaseType == GEOIP_ASNUM_EDITION)){ + $gi->databaseSegments = 0; + $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH); + for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){ + $gi->databaseSegments += (ord($buf[$j]) << ($j * 8)); + } + if ( ( $gi->databaseType == GEOIP_ORG_EDITION ) + || ( $gi->databaseType == GEOIP_DOMAIN_EDITION ) + || ( $gi->databaseType == GEOIP_ISP_EDITION ) ) { + $gi->record_length = ORG_RECORD_LENGTH; + } + } + break; + } else { + fseek($gi->filehandle, -4, SEEK_CUR); + } + } + if (($gi->databaseType == GEOIP_COUNTRY_EDITION)|| + ($gi->databaseType == GEOIP_PROXY_EDITION)|| + ($gi->databaseType == GEOIP_NETSPEED_EDITION)){ + $gi->databaseSegments = GEOIP_COUNTRY_BEGIN; + } + fseek($gi->filehandle,$filepos,SEEK_SET); + } + return $gi; +} + +function geoip_open($filename, $flags) { + $gi = new GeoIP; + $gi->flags = $flags; + if ($gi->flags & GEOIP_SHARED_MEMORY) { + $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0); + } else { + $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" ); + if ($gi->flags & GEOIP_MEMORY_CACHE) { + $s_array = fstat($gi->filehandle); + $gi->memory_buffer = fread($gi->filehandle, $s_array['size']); + } + } + + $gi = _setup_segments($gi); + return $gi; +} + +function geoip_close($gi) { + if ($gi->flags & GEOIP_SHARED_MEMORY) { + return true; + } + + return fclose($gi->filehandle); +} + +function geoip_country_id_by_name($gi, $name) { + $addr = gethostbyname($name); + if (!$addr || $addr == $name) { + return false; + } + return geoip_country_id_by_addr($gi, $addr); +} + +function geoip_country_code_by_name($gi, $name) { + $country_id = geoip_country_id_by_name($gi,$name); + if ($country_id !== false) { + return $gi->GEOIP_COUNTRY_CODES[$country_id]; + } + return false; +} + +function geoip_country_name_by_name($gi, $name) { + $country_id = geoip_country_id_by_name($gi,$name); + if ($country_id !== false) { + return $gi->GEOIP_COUNTRY_NAMES[$country_id]; + } + return false; +} + +function geoip_country_id_by_addr($gi, $addr) { + $ipnum = ip2long($addr); + return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN; +} + +function geoip_country_code_by_addr($gi, $addr) { + if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) { + $record = geoip_record_by_addr($gi,$addr); + if ( $record !== false ) { + return $record->country_code; + } + } else { + $country_id = geoip_country_id_by_addr($gi,$addr); + if ($country_id !== false) { + return $gi->GEOIP_COUNTRY_CODES[$country_id]; + } + } + return false; +} + +function geoip_country_name_by_addr($gi, $addr) { + if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) { + $record = geoip_record_by_addr($gi,$addr); + return $record->country_name; + } else { + $country_id = geoip_country_id_by_addr($gi,$addr); + if ($country_id !== false) { + return $gi->GEOIP_COUNTRY_NAMES[$country_id]; + } + } + return false; +} + +function _geoip_seek_country($gi, $ipnum) { + $offset = 0; + for ($depth = 31; $depth >= 0; --$depth) { + if ($gi->flags & GEOIP_MEMORY_CACHE) { + // workaround php's broken substr, strpos, etc handling with + // mbstring.func_overload and mbstring.internal_encoding + $enc = mb_internal_encoding(); + mb_internal_encoding('ISO-8859-1'); + + $buf = substr($gi->memory_buffer, + 2 * $gi->record_length * $offset, + 2 * $gi->record_length); + + mb_internal_encoding($enc); + } elseif ($gi->flags & GEOIP_SHARED_MEMORY) { + $buf = @shmop_read ($gi->shmid, + 2 * $gi->record_length * $offset, + 2 * $gi->record_length ); + } else { + fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0 + or die("fseek failed"); + $buf = fread($gi->filehandle, 2 * $gi->record_length); + } + $x = array(0,0); + for ($i = 0; $i < 2; ++$i) { + for ($j = 0; $j < $gi->record_length; ++$j) { + $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8); + } + } + if ($ipnum & (1 << $depth)) { + if ($x[1] >= $gi->databaseSegments) { + return $x[1]; + } + $offset = $x[1]; + } else { + if ($x[0] >= $gi->databaseSegments) { + return $x[0]; + } + $offset = $x[0]; + } + } + trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR); + return false; +} + +function _get_org($gi,$ipnum){ + $seek_org = _geoip_seek_country($gi,$ipnum); + if ($seek_org == $gi->databaseSegments) { + return NULL; + } + $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments; + if ($gi->flags & GEOIP_SHARED_MEMORY) { + $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH); + } else { + fseek($gi->filehandle, $record_pointer, SEEK_SET); + $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH); + } + // workaround php's broken substr, strpos, etc handling with + // mbstring.func_overload and mbstring.internal_encoding + $enc = mb_internal_encoding(); + mb_internal_encoding('ISO-8859-1'); + $org_buf = substr($org_buf, 0, strpos($org_buf, "\0")); + mb_internal_encoding($enc); + return $org_buf; +} + +function geoip_org_by_addr ($gi,$addr) { + if ($addr == NULL) { + return 0; + } + $ipnum = ip2long($addr); + return _get_org($gi, $ipnum); +} + +function _get_region($gi,$ipnum){ + if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ + $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0; + if ($seek_region >= 1000){ + $country_code = "US"; + $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65); + } else { + $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region]; + $region = ""; + } + return array ($country_code,$region); + } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) { + $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1; + //print $seek_region; + if ($seek_region < US_OFFSET){ + $country_code = ""; + $region = ""; + } else if ($seek_region < CANADA_OFFSET) { + $country_code = "US"; + $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65); + } else if ($seek_region < WORLD_OFFSET) { + $country_code = "CA"; + $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65); + } else { + $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE]; + $region = ""; + } + return array ($country_code,$region); + } +} + +function geoip_region_by_addr ($gi,$addr) { + if ($addr == NULL) { + return 0; + } + $ipnum = ip2long($addr); + return _get_region($gi, $ipnum); +} + +function getdnsattributes ($l,$ip){ + $r = new Net_DNS_Resolver(); + $r->nameservers = array("ws1.maxmind.com"); + $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN"); + $str = is_object($p->answer[0])?$p->answer[0]->string():''; + ereg("\"(.*)\"",$str,$regs); + $str = $regs[1]; + return $str; +} + +?> diff --git a/tools/geoip/geoipcity.inc b/tools/geoip/geoipcity.inc new file mode 100755 index 000000000..08efe52d9 --- /dev/null +++ b/tools/geoip/geoipcity.inc @@ -0,0 +1,217 @@ +country_code = $value; + } + if ($key == "ci"){ + $record->city = $value; + } + if ($key == "re"){ + $record->region = $value; + } + if ($key == "ac"){ + $record->areacode = $value; + } + if ($key == "dm" || $key == "me" ){ + $record->dmacode = $value; + $record->metrocode = $value; + } + if ($key == "is"){ + $record->isp = $value; + } + if ($key == "or"){ + $record->org = $value; + } + if ($key == "zi"){ + $record->postal_code = $value; + } + if ($key == "la"){ + $record->latitude = $value; + } + if ($key == "lo"){ + $record->longitude = $value; + } + } + $number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code]; + $record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number]; + $record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number]; + if ($record->region != "") { + if (($record->country_code == "US") || ($record->country_code == "CA")){ + $record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region]; + } else { + $record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region]; + } + } + return $record; +} + +function _get_record($gi,$ipnum){ + $seek_country = _geoip_seek_country($gi,$ipnum); + if ($seek_country == $gi->databaseSegments) { + return NULL; + } + + // workaround php's broken substr, strpos, etc handling with + // mbstring.func_overload and mbstring.internal_encoding + $enc = mb_internal_encoding(); + mb_internal_encoding('ISO-8859-1'); + + $record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments; + + if ($gi->flags & GEOIP_MEMORY_CACHE) { + $record_buf = substr($gi->memory_buffer,$record_pointer,FULL_RECORD_LENGTH); + } elseif ($gi->flags & GEOIP_SHARED_MEMORY){ + $record_buf = @shmop_read($gi->shmid,$record_pointer,FULL_RECORD_LENGTH); + } else { + fseek($gi->filehandle, $record_pointer, SEEK_SET); + $record_buf = fread($gi->filehandle,FULL_RECORD_LENGTH); + } + $record = new geoiprecord; + $record_buf_pos = 0; + $char = ord(substr($record_buf,$record_buf_pos,1)); + $record->country_code = $gi->GEOIP_COUNTRY_CODES[$char]; + $record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char]; + $record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char]; + $record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char]; + $record_buf_pos++; + $str_length = 0; + // Get region + $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); + while ($char != 0){ + $str_length++; + $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); + } + if ($str_length > 0){ + $record->region = substr($record_buf,$record_buf_pos,$str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; + // Get city + $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); + while ($char != 0){ + $str_length++; + $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); + } + if ($str_length > 0){ + $record->city = substr($record_buf,$record_buf_pos,$str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; + // Get postal code + $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); + while ($char != 0){ + $str_length++; + $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); + } + if ($str_length > 0){ + $record->postal_code = substr($record_buf,$record_buf_pos,$str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; + // Get latitude and longitude + $latitude = 0; + $longitude = 0; + for ($j = 0;$j < 3; ++$j){ + $char = ord(substr($record_buf,$record_buf_pos++,1)); + $latitude += ($char << ($j * 8)); + } + $record->latitude = ($latitude/10000) - 180; + for ($j = 0;$j < 3; ++$j){ + $char = ord(substr($record_buf,$record_buf_pos++,1)); + $longitude += ($char << ($j * 8)); + } + $record->longitude = ($longitude/10000) - 180; + if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType){ + $metroarea_combo = 0; + if ($record->country_code == "US"){ + for ($j = 0;$j < 3;++$j){ + $char = ord(substr($record_buf,$record_buf_pos++,1)); + $metroarea_combo += ($char << ($j * 8)); + } + $record->metro_code = $record->dma_code = floor($metroarea_combo/1000); + $record->area_code = $metroarea_combo%1000; + } + } + mb_internal_encoding($enc); + return $record; +} + +function GeoIP_record_by_addr ($gi,$addr){ + if ($addr == NULL){ + return 0; + } + $ipnum = ip2long($addr); + return _get_record($gi, $ipnum); +} + +?> diff --git a/tools/geoip/geoipregionvars.php b/tools/geoip/geoipregionvars.php new file mode 100755 index 000000000..4f34d2fd1 --- /dev/null +++ b/tools/geoip/geoipregionvars.php @@ -0,0 +1,4191 @@ + array( + "02" => "Canillo", + "03" => "Encamp", + "04" => "La Massana", + "05" => "Ordino", + "06" => "Sant Julia de Loria", + "07" => "Andorra la Vella", + "08" => "Escaldes-Engordany"), +"AE" => array( + "01" => "Abu Dhabi", + "02" => "Ajman", + "03" => "Dubai", + "04" => "Fujairah", + "05" => "Ras Al Khaimah", + "06" => "Sharjah", + "07" => "Umm Al Quwain"), +"AF" => array( + "01" => "Badakhshan", + "02" => "Badghis", + "03" => "Baghlan", + "05" => "Bamian", + "06" => "Farah", + "07" => "Faryab", + "08" => "Ghazni", + "09" => "Ghowr", + "10" => "Helmand", + "11" => "Herat", + "13" => "Kabol", + "14" => "Kapisa", + "17" => "Lowgar", + "18" => "Nangarhar", + "19" => "Nimruz", + "23" => "Kandahar", + "24" => "Kondoz", + "26" => "Takhar", + "27" => "Vardak", + "28" => "Zabol", + "29" => "Paktika", + "30" => "Balkh", + "31" => "Jowzjan", + "32" => "Samangan", + "33" => "Sar-e Pol", + "34" => "Konar", + "35" => "Laghman", + "36" => "Paktia", + "37" => "Khowst", + "38" => "Nurestan", + "39" => "Oruzgan", + "40" => "Parvan", + "41" => "Daykondi", + "42" => "Panjshir"), +"AG" => array( + "01" => "Barbuda", + "03" => "Saint George", + "04" => "Saint John", + "05" => "Saint Mary", + "06" => "Saint Paul", + "07" => "Saint Peter", + "08" => "Saint Philip", + "09" => "Redonda"), +"AL" => array( + "40" => "Berat", + "41" => "Diber", + "42" => "Durres", + "43" => "Elbasan", + "44" => "Fier", + "45" => "Gjirokaster", + "46" => "Korce", + "47" => "Kukes", + "48" => "Lezhe", + "49" => "Shkoder", + "50" => "Tirane", + "51" => "Vlore"), +"AM" => array( + "01" => "Aragatsotn", + "02" => "Ararat", + "03" => "Armavir", + "04" => "Geghark'unik'", + "05" => "Kotayk'", + "06" => "Lorri", + "07" => "Shirak", + "08" => "Syunik'", + "09" => "Tavush", + "10" => "Vayots' Dzor", + "11" => "Yerevan"), +"AO" => array( + "01" => "Benguela", + "02" => "Bie", + "03" => "Cabinda", + "04" => "Cuando Cubango", + "05" => "Cuanza Norte", + "06" => "Cuanza Sul", + "07" => "Cunene", + "08" => "Huambo", + "09" => "Huila", + "12" => "Malanje", + "13" => "Namibe", + "14" => "Moxico", + "15" => "Uige", + "16" => "Zaire", + "17" => "Lunda Norte", + "18" => "Lunda Sul", + "19" => "Bengo", + "20" => "Luanda"), +"AR" => array( + "01" => "Buenos Aires", + "02" => "Catamarca", + "03" => "Chaco", + "04" => "Chubut", + "05" => "Cordoba", + "06" => "Corrientes", + "07" => "Distrito Federal", + "08" => "Entre Rios", + "09" => "Formosa", + "10" => "Jujuy", + "11" => "La Pampa", + "12" => "La Rioja", + "13" => "Mendoza", + "14" => "Misiones", + "15" => "Neuquen", + "16" => "Rio Negro", + "17" => "Salta", + "18" => "San Juan", + "19" => "San Luis", + "20" => "Santa Cruz", + "21" => "Santa Fe", + "22" => "Santiago del Estero", + "23" => "Tierra del Fuego", + "24" => "Tucuman"), +"AT" => array( + "01" => "Burgenland", + "02" => "Karnten", + "03" => "Niederosterreich", + "04" => "Oberosterreich", + "05" => "Salzburg", + "06" => "Steiermark", + "07" => "Tirol", + "08" => "Vorarlberg", + "09" => "Wien"), +"AU" => array( + "01" => "Australian Capital Territory", + "02" => "New South Wales", + "03" => "Northern Territory", + "04" => "Queensland", + "05" => "South Australia", + "06" => "Tasmania", + "07" => "Victoria", + "08" => "Western Australia"), +"AZ" => array( + "01" => "Abseron", + "02" => "Agcabadi", + "03" => "Agdam", + "04" => "Agdas", + "05" => "Agstafa", + "06" => "Agsu", + "07" => "Ali Bayramli", + "08" => "Astara", + "09" => "Baki", + "10" => "Balakan", + "11" => "Barda", + "12" => "Beylaqan", + "13" => "Bilasuvar", + "14" => "Cabrayil", + "15" => "Calilabad", + "16" => "Daskasan", + "17" => "Davaci", + "18" => "Fuzuli", + "19" => "Gadabay", + "20" => "Ganca", + "21" => "Goranboy", + "22" => "Goycay", + "23" => "Haciqabul", + "24" => "Imisli", + "25" => "Ismayilli", + "26" => "Kalbacar", + "27" => "Kurdamir", + "28" => "Lacin", + "29" => "Lankaran", + "30" => "Lankaran", + "31" => "Lerik", + "32" => "Masalli", + "33" => "Mingacevir", + "34" => "Naftalan", + "35" => "Naxcivan", + "36" => "Neftcala", + "37" => "Oguz", + "38" => "Qabala", + "39" => "Qax", + "40" => "Qazax", + "41" => "Qobustan", + "42" => "Quba", + "43" => "Qubadli", + "44" => "Qusar", + "45" => "Saatli", + "46" => "Sabirabad", + "47" => "Saki", + "48" => "Saki", + "49" => "Salyan", + "50" => "Samaxi", + "51" => "Samkir", + "52" => "Samux", + "53" => "Siyazan", + "54" => "Sumqayit", + "55" => "Susa", + "56" => "Susa", + "57" => "Tartar", + "58" => "Tovuz", + "59" => "Ucar", + "60" => "Xacmaz", + "61" => "Xankandi", + "62" => "Xanlar", + "63" => "Xizi", + "64" => "Xocali", + "65" => "Xocavand", + "66" => "Yardimli", + "67" => "Yevlax", + "68" => "Yevlax", + "69" => "Zangilan", + "70" => "Zaqatala", + "71" => "Zardab"), +"BA" => array( + "01" => "Federation of Bosnia and Herzegovina", + "02" => "Republika Srpska"), +"BB" => array( + "01" => "Christ Church", + "02" => "Saint Andrew", + "03" => "Saint George", + "04" => "Saint James", + "05" => "Saint John", + "06" => "Saint Joseph", + "07" => "Saint Lucy", + "08" => "Saint Michael", + "09" => "Saint Peter", + "10" => "Saint Philip", + "11" => "Saint Thomas"), +"BD" => array( + "81" => "Dhaka", + "82" => "Khulna", + "83" => "Rajshahi", + "84" => "Chittagong", + "85" => "Barisal", + "86" => "Sylhet"), +"BE" => array( + "01" => "Antwerpen", + "03" => "Hainaut", + "04" => "Liege", + "05" => "Limburg", + "06" => "Luxembourg", + "07" => "Namur", + "08" => "Oost-Vlaanderen", + "09" => "West-Vlaanderen", + "10" => "Brabant Wallon", + "11" => "Brussels Hoofdstedelijk Gewest", + "12" => "Vlaams-Brabant"), +"BF" => array( + "15" => "Bam", + "19" => "Boulkiemde", + "20" => "Ganzourgou", + "21" => "Gnagna", + "28" => "Kouritenga", + "33" => "Oudalan", + "34" => "Passore", + "36" => "Sanguie", + "40" => "Soum", + "42" => "Tapoa", + "44" => "Zoundweogo", + "45" => "Bale", + "46" => "Banwa", + "47" => "Bazega", + "48" => "Bougouriba", + "49" => "Boulgou", + "50" => "Gourma", + "51" => "Houet", + "52" => "Ioba", + "53" => "Kadiogo", + "54" => "Kenedougou", + "55" => "Komoe", + "56" => "Komondjari", + "57" => "Kompienga", + "58" => "Kossi", + "59" => "Koulpelogo", + "60" => "Kourweogo", + "61" => "Leraba", + "62" => "Loroum", + "63" => "Mouhoun", + "64" => "Namentenga", + "65" => "Naouri", + "66" => "Nayala", + "67" => "Noumbiel", + "68" => "Oubritenga", + "69" => "Poni", + "70" => "Sanmatenga", + "71" => "Seno", + "72" => "Sissili", + "73" => "Sourou", + "74" => "Tuy", + "75" => "Yagha", + "76" => "Yatenga", + "77" => "Ziro", + "78" => "Zondoma"), +"BG" => array( + "33" => "Mikhaylovgrad", + "38" => "Blagoevgrad", + "39" => "Burgas", + "40" => "Dobrich", + "41" => "Gabrovo", + "42" => "Grad Sofiya", + "43" => "Khaskovo", + "44" => "Kurdzhali", + "45" => "Kyustendil", + "46" => "Lovech", + "47" => "Montana", + "48" => "Pazardzhik", + "49" => "Pernik", + "50" => "Pleven", + "51" => "Plovdiv", + "52" => "Razgrad", + "53" => "Ruse", + "54" => "Shumen", + "55" => "Silistra", + "56" => "Sliven", + "57" => "Smolyan", + "58" => "Sofiya", + "59" => "Stara Zagora", + "60" => "Turgovishte", + "61" => "Varna", + "62" => "Veliko Turnovo", + "63" => "Vidin", + "64" => "Vratsa", + "65" => "Yambol"), +"BH" => array( + "01" => "Al Hadd", + "02" => "Al Manamah", + "05" => "Jidd Hafs", + "06" => "Sitrah", + "08" => "Al Mintaqah al Gharbiyah", + "09" => "Mintaqat Juzur Hawar", + "10" => "Al Mintaqah ash Shamaliyah", + "11" => "Al Mintaqah al Wusta", + "12" => "Madinat", + "13" => "Ar Rifa", + "14" => "Madinat Hamad", + "15" => "Al Muharraq", + "16" => "Al Asimah", + "17" => "Al Janubiyah", + "18" => "Ash Shamaliyah", + "19" => "Al Wusta"), +"BI" => array( + "02" => "Bujumbura", + "09" => "Bubanza", + "10" => "Bururi", + "11" => "Cankuzo", + "12" => "Cibitoke", + "13" => "Gitega", + "14" => "Karuzi", + "15" => "Kayanza", + "16" => "Kirundo", + "17" => "Makamba", + "18" => "Muyinga", + "19" => "Ngozi", + "20" => "Rutana", + "21" => "Ruyigi", + "22" => "Muramvya", + "23" => "Mwaro"), +"BJ" => array( + "07" => "Alibori", + "08" => "Atakora", + "09" => "Atlanyique", + "10" => "Borgou", + "11" => "Collines", + "12" => "Kouffo", + "13" => "Donga", + "14" => "Littoral", + "15" => "Mono", + "16" => "Oueme", + "17" => "Plateau", + "18" => "Zou"), +"BM" => array( + "01" => "Devonshire", + "02" => "Hamilton", + "03" => "Hamilton", + "04" => "Paget", + "05" => "Pembroke", + "06" => "Saint George", + "07" => "Saint George's", + "08" => "Sandys", + "09" => "Smiths", + "10" => "Southampton", + "11" => "Warwick"), +"BN" => array( + "07" => "Alibori", + "08" => "Belait", + "09" => "Brunei and Muara", + "10" => "Temburong", + "11" => "Collines", + "12" => "Kouffo", + "13" => "Donga", + "14" => "Littoral", + "15" => "Tutong", + "16" => "Oueme", + "17" => "Plateau", + "18" => "Zou"), +"BO" => array( + "01" => "Chuquisaca", + "02" => "Cochabamba", + "03" => "El Beni", + "04" => "La Paz", + "05" => "Oruro", + "06" => "Pando", + "07" => "Potosi", + "08" => "Santa Cruz", + "09" => "Tarija"), +"BR" => array( + "01" => "Acre", + "02" => "Alagoas", + "03" => "Amapa", + "04" => "Amazonas", + "05" => "Bahia", + "06" => "Ceara", + "07" => "Distrito Federal", + "08" => "Espirito Santo", + "11" => "Mato Grosso do Sul", + "13" => "Maranhao", + "14" => "Mato Grosso", + "15" => "Minas Gerais", + "16" => "Para", + "17" => "Paraiba", + "18" => "Parana", + "20" => "Piaui", + "21" => "Rio de Janeiro", + "22" => "Rio Grande do Norte", + "23" => "Rio Grande do Sul", + "24" => "Rondonia", + "25" => "Roraima", + "26" => "Santa Catarina", + "27" => "Sao Paulo", + "28" => "Sergipe", + "29" => "Goias", + "30" => "Pernambuco", + "31" => "Tocantins"), +"BS" => array( + "05" => "Bimini", + "06" => "Cat Island", + "10" => "Exuma", + "13" => "Inagua", + "15" => "Long Island", + "16" => "Mayaguana", + "18" => "Ragged Island", + "22" => "Harbour Island", + "23" => "New Providence", + "24" => "Acklins and Crooked Islands", + "25" => "Freeport", + "26" => "Fresh Creek", + "27" => "Governor's Harbour", + "28" => "Green Turtle Cay", + "29" => "High Rock", + "30" => "Kemps Bay", + "31" => "Marsh Harbour", + "32" => "Nichollstown and Berry Islands", + "33" => "Rock Sound", + "34" => "Sandy Point", + "35" => "San Salvador and Rum Cay"), +"BT" => array( + "05" => "Bumthang", + "06" => "Chhukha", + "07" => "Chirang", + "08" => "Daga", + "09" => "Geylegphug", + "10" => "Ha", + "11" => "Lhuntshi", + "12" => "Mongar", + "13" => "Paro", + "14" => "Pemagatsel", + "15" => "Punakha", + "16" => "Samchi", + "17" => "Samdrup", + "18" => "Shemgang", + "19" => "Tashigang", + "20" => "Thimphu", + "21" => "Tongsa", + "22" => "Wangdi Phodrang"), +"BW" => array( + "01" => "Central", + "03" => "Ghanzi", + "04" => "Kgalagadi", + "05" => "Kgatleng", + "06" => "Kweneng", + "08" => "North-East", + "09" => "South-East", + "10" => "Southern", + "11" => "North-West"), +"BY" => array( + "01" => "Brestskaya Voblasts'", + "02" => "Homyel'skaya Voblasts'", + "03" => "Hrodzyenskaya Voblasts'", + "04" => "Minsk", + "05" => "Minskaya Voblasts'", + "06" => "Mahilyowskaya Voblasts'", + "07" => "Vitsyebskaya Voblasts'"), +"BZ" => array( + "01" => "Belize", + "02" => "Cayo", + "03" => "Corozal", + "04" => "Orange Walk", + "05" => "Stann Creek", + "06" => "Toledo"), +"CA" => array( + "AB" => "Alberta", + "BC" => "British Columbia", + "MB" => "Manitoba", + "NB" => "New Brunswick", + "NL" => "Newfoundland", + "NS" => "Nova Scotia", + "NT" => "Northwest Territories", + "NU" => "Nunavut", + "ON" => "Ontario", + "PE" => "Prince Edward Island", + "QC" => "Quebec", + "SK" => "Saskatchewan", + "YT" => "Yukon Territory"), +"CD" => array( + "01" => "Bandundu", + "02" => "Equateur", + "04" => "Kasai-Oriental", + "05" => "Katanga", + "06" => "Kinshasa", + "08" => "Bas-Congo", + "09" => "Orientale", + "10" => "Maniema", + "11" => "Nord-Kivu", + "12" => "Sud-Kivu"), +"CF" => array( + "01" => "Bamingui-Bangoran", + "02" => "Basse-Kotto", + "03" => "Haute-Kotto", + "04" => "Mambere-Kadei", + "05" => "Haut-Mbomou", + "06" => "Kemo", + "07" => "Lobaye", + "08" => "Mbomou", + "09" => "Nana-Mambere", + "11" => "Ouaka", + "12" => "Ouham", + "13" => "Ouham-Pende", + "14" => "Cuvette-Ouest", + "15" => "Nana-Grebizi", + "16" => "Sangha-Mbaere", + "17" => "Ombella-Mpoko", + "18" => "Bangui"), +"CG" => array( + "01" => "Bouenza", + "04" => "Kouilou", + "05" => "Lekoumou", + "06" => "Likouala", + "07" => "Niari", + "08" => "Plateaux", + "10" => "Sangha", + "11" => "Pool", + "12" => "Brazzaville", + "13" => "Cuvette", + "14" => "Cuvette-Ouest"), +"CH" => array( + "01" => "Aargau", + "02" => "Ausser-Rhoden", + "03" => "Basel-Landschaft", + "04" => "Basel-Stadt", + "05" => "Bern", + "06" => "Fribourg", + "07" => "Geneve", + "08" => "Glarus", + "09" => "Graubunden", + "10" => "Inner-Rhoden", + "11" => "Luzern", + "12" => "Neuchatel", + "13" => "Nidwalden", + "14" => "Obwalden", + "15" => "Sankt Gallen", + "16" => "Schaffhausen", + "17" => "Schwyz", + "18" => "Solothurn", + "19" => "Thurgau", + "20" => "Ticino", + "21" => "Uri", + "22" => "Valais", + "23" => "Vaud", + "24" => "Zug", + "25" => "Zurich", + "26" => "Jura"), +"CI" => array( + "74" => "Agneby", + "75" => "Bafing", + "76" => "Bas-Sassandra", + "77" => "Denguele", + "78" => "Dix-Huit Montagnes", + "79" => "Fromager", + "80" => "Haut-Sassandra", + "81" => "Lacs", + "82" => "Lagunes", + "83" => "Marahoue", + "84" => "Moyen-Cavally", + "85" => "Moyen-Comoe", + "86" => "N'zi-Comoe", + "87" => "Savanes", + "88" => "Sud-Bandama", + "89" => "Sud-Comoe", + "90" => "Vallee du Bandama", + "91" => "Worodougou", + "92" => "Zanzan"), +"CL" => array( + "01" => "Valparaiso", + "02" => "Aisen del General Carlos Ibanez del Campo", + "03" => "Antofagasta", + "04" => "Araucania", + "05" => "Atacama", + "06" => "Bio-Bio", + "07" => "Coquimbo", + "08" => "Libertador General Bernardo O'Higgins", + "09" => "Los Lagos", + "10" => "Magallanes y de la Antartica Chilena", + "11" => "Maule", + "12" => "Region Metropolitana", + "13" => "Tarapaca", + "14" => "Los Lagos", + "15" => "Tarapaca", + "16" => "Arica y Parinacota", + "17" => "Los Rios"), +"CM" => array( + "04" => "Est", + "05" => "Littoral", + "07" => "Nord-Ouest", + "08" => "Ouest", + "09" => "Sud-Ouest", + "10" => "Adamaoua", + "11" => "Centre", + "12" => "Extreme-Nord", + "13" => "Nord", + "14" => "Sud"), +"CN" => array( + "01" => "Anhui", + "02" => "Zhejiang", + "03" => "Jiangxi", + "04" => "Jiangsu", + "05" => "Jilin", + "06" => "Qinghai", + "07" => "Fujian", + "08" => "Heilongjiang", + "09" => "Henan", + "10" => "Hebei", + "11" => "Hunan", + "12" => "Hubei", + "13" => "Xinjiang", + "14" => "Xizang", + "15" => "Gansu", + "16" => "Guangxi", + "18" => "Guizhou", + "19" => "Liaoning", + "20" => "Nei Mongol", + "21" => "Ningxia", + "22" => "Beijing", + "23" => "Shanghai", + "24" => "Shanxi", + "25" => "Shandong", + "26" => "Shaanxi", + "28" => "Tianjin", + "29" => "Yunnan", + "30" => "Guangdong", + "31" => "Hainan", + "32" => "Sichuan", + "33" => "Chongqing"), +"CO" => array( + "01" => "Amazonas", + "02" => "Antioquia", + "03" => "Arauca", + "04" => "Atlantico", + "05" => "Bolivar Department", + "06" => "Boyaca Department", + "07" => "Caldas Department", + "08" => "Caqueta", + "09" => "Cauca", + "10" => "Cesar", + "11" => "Choco", + "12" => "Cordoba", + "14" => "Guaviare", + "15" => "Guainia", + "16" => "Huila", + "17" => "La Guajira", + "18" => "Magdalena Department", + "19" => "Meta", + "20" => "Narino", + "21" => "Norte de Santander", + "22" => "Putumayo", + "23" => "Quindio", + "24" => "Risaralda", + "25" => "San Andres y Providencia", + "26" => "Santander", + "27" => "Sucre", + "28" => "Tolima", + "29" => "Valle del Cauca", + "30" => "Vaupes", + "31" => "Vichada", + "32" => "Casanare", + "33" => "Cundinamarca", + "34" => "Distrito Especial", + "35" => "Bolivar", + "36" => "Boyaca", + "37" => "Caldas", + "38" => "Magdalena"), +"CR" => array( + "01" => "Alajuela", + "02" => "Cartago", + "03" => "Guanacaste", + "04" => "Heredia", + "06" => "Limon", + "07" => "Puntarenas", + "08" => "San Jose"), +"CU" => array( + "01" => "Pinar del Rio", + "02" => "Ciudad de la Habana", + "03" => "Matanzas", + "04" => "Isla de la Juventud", + "05" => "Camaguey", + "07" => "Ciego de Avila", + "08" => "Cienfuegos", + "09" => "Granma", + "10" => "Guantanamo", + "11" => "La Habana", + "12" => "Holguin", + "13" => "Las Tunas", + "14" => "Sancti Spiritus", + "15" => "Santiago de Cuba", + "16" => "Villa Clara"), +"CV" => array( + "01" => "Boa Vista", + "02" => "Brava", + "04" => "Maio", + "05" => "Paul", + "07" => "Ribeira Grande", + "08" => "Sal", + "10" => "Sao Nicolau", + "11" => "Sao Vicente", + "13" => "Mosteiros", + "14" => "Praia", + "15" => "Santa Catarina", + "16" => "Santa Cruz", + "17" => "Sao Domingos", + "18" => "Sao Filipe", + "19" => "Sao Miguel", + "20" => "Tarrafal"), +"CY" => array( + "01" => "Famagusta", + "02" => "Kyrenia", + "03" => "Larnaca", + "04" => "Nicosia", + "05" => "Limassol", + "06" => "Paphos"), +"CZ" => array( + "52" => "Hlavni mesto Praha", + "78" => "Jihomoravsky kraj", + "79" => "Jihocesky kraj", + "80" => "Vysocina", + "81" => "Karlovarsky kraj", + "82" => "Kralovehradecky kraj", + "83" => "Liberecky kraj", + "84" => "Olomoucky kraj", + "85" => "Moravskoslezsky kraj", + "86" => "Pardubicky kraj", + "87" => "Plzensky kraj", + "88" => "Stredocesky kraj", + "89" => "Ustecky kraj", + "90" => "Zlinsky kraj"), +"DE" => array( + "01" => "Baden-Wurttemberg", + "02" => "Bayern", + "03" => "Bremen", + "04" => "Hamburg", + "05" => "Hessen", + "06" => "Niedersachsen", + "07" => "Nordrhein-Westfalen", + "08" => "Rheinland-Pfalz", + "09" => "Saarland", + "10" => "Schleswig-Holstein", + "11" => "Brandenburg", + "12" => "Mecklenburg-Vorpommern", + "13" => "Sachsen", + "14" => "Sachsen-Anhalt", + "15" => "Thuringen", + "16" => "Berlin"), +"DJ" => array( + "01" => "Ali Sabieh", + "04" => "Obock", + "05" => "Tadjoura", + "06" => "Dikhil", + "07" => "Djibouti", + "08" => "Arta"), +"DK" => array( + "17" => "Hovedstaden", + "18" => "Midtjylland", + "19" => "Nordjylland", + "20" => "Sjelland", + "21" => "Syddanmark"), +"DM" => array( + "02" => "Saint Andrew", + "03" => "Saint David", + "04" => "Saint George", + "05" => "Saint John", + "06" => "Saint Joseph", + "07" => "Saint Luke", + "08" => "Saint Mark", + "09" => "Saint Patrick", + "10" => "Saint Paul", + "11" => "Saint Peter"), +"DO" => array( + "01" => "Azua", + "02" => "Baoruco", + "03" => "Barahona", + "04" => "Dajabon", + "05" => "Distrito Nacional", + "06" => "Duarte", + "08" => "Espaillat", + "09" => "Independencia", + "10" => "La Altagracia", + "11" => "Elias Pina", + "12" => "La Romana", + "14" => "Maria Trinidad Sanchez", + "15" => "Monte Cristi", + "16" => "Pedernales", + "17" => "Peravia", + "18" => "Puerto Plata", + "19" => "Salcedo", + "20" => "Samana", + "21" => "Sanchez Ramirez", + "23" => "San Juan", + "24" => "San Pedro De Macoris", + "25" => "Santiago", + "26" => "Santiago Rodriguez", + "27" => "Valverde", + "28" => "El Seibo", + "29" => "Hato Mayor", + "30" => "La Vega", + "31" => "Monsenor Nouel", + "32" => "Monte Plata", + "33" => "San Cristobal", + "34" => "Distrito Nacional", + "35" => "Peravia", + "36" => "San Jose de Ocoa", + "37" => "Santo Domingo"), +"DZ" => array( + "01" => "Alger", + "03" => "Batna", + "04" => "Constantine", + "06" => "Medea", + "07" => "Mostaganem", + "09" => "Oran", + "10" => "Saida", + "12" => "Setif", + "13" => "Tiaret", + "14" => "Tizi Ouzou", + "15" => "Tlemcen", + "18" => "Bejaia", + "19" => "Biskra", + "20" => "Blida", + "21" => "Bouira", + "22" => "Djelfa", + "23" => "Guelma", + "24" => "Jijel", + "25" => "Laghouat", + "26" => "Mascara", + "27" => "M'sila", + "29" => "Oum el Bouaghi", + "30" => "Sidi Bel Abbes", + "31" => "Skikda", + "33" => "Tebessa", + "34" => "Adrar", + "35" => "Ain Defla", + "36" => "Ain Temouchent", + "37" => "Annaba", + "38" => "Bechar", + "39" => "Bordj Bou Arreridj", + "40" => "Boumerdes", + "41" => "Chlef", + "42" => "El Bayadh", + "43" => "El Oued", + "44" => "El Tarf", + "45" => "Ghardaia", + "46" => "Illizi", + "47" => "Khenchela", + "48" => "Mila", + "49" => "Naama", + "50" => "Ouargla", + "51" => "Relizane", + "52" => "Souk Ahras", + "53" => "Tamanghasset", + "54" => "Tindouf", + "55" => "Tipaza", + "56" => "Tissemsilt"), +"EC" => array( + "01" => "Galapagos", + "02" => "Azuay", + "03" => "Bolivar", + "04" => "Canar", + "05" => "Carchi", + "06" => "Chimborazo", + "07" => "Cotopaxi", + "08" => "El Oro", + "09" => "Esmeraldas", + "10" => "Guayas", + "11" => "Imbabura", + "12" => "Loja", + "13" => "Los Rios", + "14" => "Manabi", + "15" => "Morona-Santiago", + "17" => "Pastaza", + "18" => "Pichincha", + "19" => "Tungurahua", + "20" => "Zamora-Chinchipe", + "22" => "Sucumbios", + "23" => "Napo", + "24" => "Orellana"), +"EE" => array( + "01" => "Harjumaa", + "02" => "Hiiumaa", + "03" => "Ida-Virumaa", + "04" => "Jarvamaa", + "05" => "Jogevamaa", + "06" => "Kohtla-Jarve", + "07" => "Laanemaa", + "08" => "Laane-Virumaa", + "09" => "Narva", + "10" => "Parnu", + "11" => "Parnumaa", + "12" => "Polvamaa", + "13" => "Raplamaa", + "14" => "Saaremaa", + "15" => "Sillamae", + "16" => "Tallinn", + "17" => "Tartu", + "18" => "Tartumaa", + "19" => "Valgamaa", + "20" => "Viljandimaa", + "21" => "Vorumaa"), +"EG" => array( + "01" => "Ad Daqahliyah", + "02" => "Al Bahr al Ahmar", + "03" => "Al Buhayrah", + "04" => "Al Fayyum", + "05" => "Al Gharbiyah", + "06" => "Al Iskandariyah", + "07" => "Al Isma'iliyah", + "08" => "Al Jizah", + "09" => "Al Minufiyah", + "10" => "Al Minya", + "11" => "Al Qahirah", + "12" => "Al Qalyubiyah", + "13" => "Al Wadi al Jadid", + "14" => "Ash Sharqiyah", + "15" => "As Suways", + "16" => "Aswan", + "17" => "Asyut", + "18" => "Bani Suwayf", + "19" => "Bur Sa'id", + "20" => "Dumyat", + "21" => "Kafr ash Shaykh", + "22" => "Matruh", + "23" => "Qina", + "24" => "Suhaj", + "26" => "Janub Sina'", + "27" => "Shamal Sina'"), +"ER" => array( + "01" => "Anseba", + "02" => "Debub", + "03" => "Debubawi K'eyih Bahri", + "04" => "Gash Barka", + "05" => "Ma'akel", + "06" => "Semenawi K'eyih Bahri"), +"ES" => array( + "07" => "Islas Baleares", + "27" => "La Rioja", + "29" => "Madrid", + "31" => "Murcia", + "32" => "Navarra", + "34" => "Asturias", + "39" => "Cantabria", + "51" => "Andalucia", + "52" => "Aragon", + "53" => "Canarias", + "54" => "Castilla-La Mancha", + "55" => "Castilla y Leon", + "56" => "Catalonia", + "57" => "Extremadura", + "58" => "Galicia", + "59" => "Pais Vasco", + "60" => "Comunidad Valenciana"), +"ET" => array( + "44" => "Adis Abeba", + "45" => "Afar", + "46" => "Amara", + "47" => "Binshangul Gumuz", + "48" => "Dire Dawa", + "49" => "Gambela Hizboch", + "50" => "Hareri Hizb", + "51" => "Oromiya", + "52" => "Sumale", + "53" => "Tigray", + "54" => "YeDebub Biheroch Bihereseboch na Hizboch"), +"FI" => array( + "01" => "Aland", + "06" => "Lapland", + "08" => "Oulu", + "13" => "Southern Finland", + "14" => "Eastern Finland", + "15" => "Western Finland"), +"FJ" => array( + "01" => "Central", + "02" => "Eastern", + "03" => "Northern", + "04" => "Rotuma", + "05" => "Western"), +"FM" => array( + "01" => "Kosrae", + "02" => "Pohnpei", + "03" => "Chuuk", + "04" => "Yap"), +"FR" => array( + "97" => "Aquitaine", + "98" => "Auvergne", + "99" => "Basse-Normandie", + "A1" => "Bourgogne", + "A2" => "Bretagne", + "A3" => "Centre", + "A4" => "Champagne-Ardenne", + "A5" => "Corse", + "A6" => "Franche-Comte", + "A7" => "Haute-Normandie", + "A8" => "Ile-de-France", + "A9" => "Languedoc-Roussillon", + "B1" => "Limousin", + "B2" => "Lorraine", + "B3" => "Midi-Pyrenees", + "B4" => "Nord-Pas-de-Calais", + "B5" => "Pays de la Loire", + "B6" => "Picardie", + "B7" => "Poitou-Charentes", + "B8" => "Provence-Alpes-Cote d'Azur", + "B9" => "Rhone-Alpes", + "C1" => "Alsace"), +"GA" => array( + "01" => "Estuaire", + "02" => "Haut-Ogooue", + "03" => "Moyen-Ogooue", + "04" => "Ngounie", + "05" => "Nyanga", + "06" => "Ogooue-Ivindo", + "07" => "Ogooue-Lolo", + "08" => "Ogooue-Maritime", + "09" => "Woleu-Ntem"), +"GB" => array( + "A1" => "Barking and Dagenham", + "A2" => "Barnet", + "A3" => "Barnsley", + "A4" => "Bath and North East Somerset", + "A5" => "Bedfordshire", + "A6" => "Bexley", + "A7" => "Birmingham", + "A8" => "Blackburn with Darwen", + "A9" => "Blackpool", + "B1" => "Bolton", + "B2" => "Bournemouth", + "B3" => "Bracknell Forest", + "B4" => "Bradford", + "B5" => "Brent", + "B6" => "Brighton and Hove", + "B7" => "Bristol, City of", + "B8" => "Bromley", + "B9" => "Buckinghamshire", + "C1" => "Bury", + "C2" => "Calderdale", + "C3" => "Cambridgeshire", + "C4" => "Camden", + "C5" => "Cheshire", + "C6" => "Cornwall", + "C7" => "Coventry", + "C8" => "Croydon", + "C9" => "Cumbria", + "D1" => "Darlington", + "D2" => "Derby", + "D3" => "Derbyshire", + "D4" => "Devon", + "D5" => "Doncaster", + "D6" => "Dorset", + "D7" => "Dudley", + "D8" => "Durham", + "D9" => "Ealing", + "E1" => "East Riding of Yorkshire", + "E2" => "East Sussex", + "E3" => "Enfield", + "E4" => "Essex", + "E5" => "Gateshead", + "E6" => "Gloucestershire", + "E7" => "Greenwich", + "E8" => "Hackney", + "E9" => "Halton", + "F1" => "Hammersmith and Fulham", + "F2" => "Hampshire", + "F3" => "Haringey", + "F4" => "Harrow", + "F5" => "Hartlepool", + "F6" => "Havering", + "F7" => "Herefordshire", + "F8" => "Hertford", + "F9" => "Hillingdon", + "G1" => "Hounslow", + "G2" => "Isle of Wight", + "G3" => "Islington", + "G4" => "Kensington and Chelsea", + "G5" => "Kent", + "G6" => "Kingston upon Hull, City of", + "G7" => "Kingston upon Thames", + "G8" => "Kirklees", + "G9" => "Knowsley", + "H1" => "Lambeth", + "H2" => "Lancashire", + "H3" => "Leeds", + "H4" => "Leicester", + "H5" => "Leicestershire", + "H6" => "Lewisham", + "H7" => "Lincolnshire", + "H8" => "Liverpool", + "H9" => "London, City of", + "I1" => "Luton", + "I2" => "Manchester", + "I3" => "Medway", + "I4" => "Merton", + "I5" => "Middlesbrough", + "I6" => "Milton Keynes", + "I7" => "Newcastle upon Tyne", + "I8" => "Newham", + "I9" => "Norfolk", + "J1" => "Northamptonshire", + "J2" => "North East Lincolnshire", + "J3" => "North Lincolnshire", + "J4" => "North Somerset", + "J5" => "North Tyneside", + "J6" => "Northumberland", + "J7" => "North Yorkshire", + "J8" => "Nottingham", + "J9" => "Nottinghamshire", + "K1" => "Oldham", + "K2" => "Oxfordshire", + "K3" => "Peterborough", + "K4" => "Plymouth", + "K5" => "Poole", + "K6" => "Portsmouth", + "K7" => "Reading", + "K8" => "Redbridge", + "K9" => "Redcar and Cleveland", + "L1" => "Richmond upon Thames", + "L2" => "Rochdale", + "L3" => "Rotherham", + "L4" => "Rutland", + "L5" => "Salford", + "L6" => "Shropshire", + "L7" => "Sandwell", + "L8" => "Sefton", + "L9" => "Sheffield", + "M1" => "Slough", + "M2" => "Solihull", + "M3" => "Somerset", + "M4" => "Southampton", + "M5" => "Southend-on-Sea", + "M6" => "South Gloucestershire", + "M7" => "South Tyneside", + "M8" => "Southwark", + "M9" => "Staffordshire", + "N1" => "St. Helens", + "N2" => "Stockport", + "N3" => "Stockton-on-Tees", + "N4" => "Stoke-on-Trent", + "N5" => "Suffolk", + "N6" => "Sunderland", + "N7" => "Surrey", + "N8" => "Sutton", + "N9" => "Swindon", + "O1" => "Tameside", + "O2" => "Telford and Wrekin", + "O3" => "Thurrock", + "O4" => "Torbay", + "O5" => "Tower Hamlets", + "O6" => "Trafford", + "O7" => "Wakefield", + "O8" => "Walsall", + "O9" => "Waltham Forest", + "P1" => "Wandsworth", + "P2" => "Warrington", + "P3" => "Warwickshire", + "P4" => "West Berkshire", + "P5" => "Westminster", + "P6" => "West Sussex", + "P7" => "Wigan", + "P8" => "Wiltshire", + "P9" => "Windsor and Maidenhead", + "Q1" => "Wirral", + "Q2" => "Wokingham", + "Q3" => "Wolverhampton", + "Q4" => "Worcestershire", + "Q5" => "York", + "Q6" => "Antrim", + "Q7" => "Ards", + "Q8" => "Armagh", + "Q9" => "Ballymena", + "R1" => "Ballymoney", + "R2" => "Banbridge", + "R3" => "Belfast", + "R4" => "Carrickfergus", + "R5" => "Castlereagh", + "R6" => "Coleraine", + "R7" => "Cookstown", + "R8" => "Craigavon", + "R9" => "Down", + "S1" => "Dungannon", + "S2" => "Fermanagh", + "S3" => "Larne", + "S4" => "Limavady", + "S5" => "Lisburn", + "S6" => "Derry", + "S7" => "Magherafelt", + "S8" => "Moyle", + "S9" => "Newry and Mourne", + "T1" => "Newtownabbey", + "T2" => "North Down", + "T3" => "Omagh", + "T4" => "Strabane", + "T5" => "Aberdeen City", + "T6" => "Aberdeenshire", + "T7" => "Angus", + "T8" => "Argyll and Bute", + "T9" => "Scottish Borders, The", + "U1" => "Clackmannanshire", + "U2" => "Dumfries and Galloway", + "U3" => "Dundee City", + "U4" => "East Ayrshire", + "U5" => "East Dunbartonshire", + "U6" => "East Lothian", + "U7" => "East Renfrewshire", + "U8" => "Edinburgh, City of", + "U9" => "Falkirk", + "V1" => "Fife", + "V2" => "Glasgow City", + "V3" => "Highland", + "V4" => "Inverclyde", + "V5" => "Midlothian", + "V6" => "Moray", + "V7" => "North Ayrshire", + "V8" => "North Lanarkshire", + "V9" => "Orkney", + "W1" => "Perth and Kinross", + "W2" => "Renfrewshire", + "W3" => "Shetland Islands", + "W4" => "South Ayrshire", + "W5" => "South Lanarkshire", + "W6" => "Stirling", + "W7" => "West Dunbartonshire", + "W8" => "Eilean Siar", + "W9" => "West Lothian", + "X1" => "Isle of Anglesey", + "X2" => "Blaenau Gwent", + "X3" => "Bridgend", + "X4" => "Caerphilly", + "X5" => "Cardiff", + "X6" => "Ceredigion", + "X7" => "Carmarthenshire", + "X8" => "Conwy", + "X9" => "Denbighshire", + "Y1" => "Flintshire", + "Y2" => "Gwynedd", + "Y3" => "Merthyr Tydfil", + "Y4" => "Monmouthshire", + "Y5" => "Neath Port Talbot", + "Y6" => "Newport", + "Y7" => "Pembrokeshire", + "Y8" => "Powys", + "Y9" => "Rhondda Cynon Taff", + "Z1" => "Swansea", + "Z2" => "Torfaen", + "Z3" => "Vale of Glamorgan, The", + "Z4" => "Wrexham"), +"GD" => array( + "01" => "Saint Andrew", + "02" => "Saint David", + "03" => "Saint George", + "04" => "Saint John", + "05" => "Saint Mark", + "06" => "Saint Patrick"), +"GE" => array( + "01" => "Abashis Raioni", + "02" => "Abkhazia", + "03" => "Adigenis Raioni", + "04" => "Ajaria", + "05" => "Akhalgoris Raioni", + "06" => "Akhalk'alak'is Raioni", + "07" => "Akhalts'ikhis Raioni", + "08" => "Akhmetis Raioni", + "09" => "Ambrolauris Raioni", + "10" => "Aspindzis Raioni", + "11" => "Baghdat'is Raioni", + "12" => "Bolnisis Raioni", + "13" => "Borjomis Raioni", + "14" => "Chiat'ura", + "15" => "Ch'khorotsqus Raioni", + "16" => "Ch'okhatauris Raioni", + "17" => "Dedop'listsqaros Raioni", + "18" => "Dmanisis Raioni", + "19" => "Dushet'is Raioni", + "20" => "Gardabanis Raioni", + "21" => "Gori", + "22" => "Goris Raioni", + "23" => "Gurjaanis Raioni", + "24" => "Javis Raioni", + "25" => "K'arelis Raioni", + "26" => "Kaspis Raioni", + "27" => "Kharagaulis Raioni", + "28" => "Khashuris Raioni", + "29" => "Khobis Raioni", + "30" => "Khonis Raioni", + "31" => "K'ut'aisi", + "32" => "Lagodekhis Raioni", + "33" => "Lanch'khut'is Raioni", + "34" => "Lentekhis Raioni", + "35" => "Marneulis Raioni", + "36" => "Martvilis Raioni", + "37" => "Mestiis Raioni", + "38" => "Mts'khet'is Raioni", + "39" => "Ninotsmindis Raioni", + "40" => "Onis Raioni", + "41" => "Ozurget'is Raioni", + "42" => "P'ot'i", + "43" => "Qazbegis Raioni", + "44" => "Qvarlis Raioni", + "45" => "Rust'avi", + "46" => "Sach'kheris Raioni", + "47" => "Sagarejos Raioni", + "48" => "Samtrediis Raioni", + "49" => "Senakis Raioni", + "50" => "Sighnaghis Raioni", + "51" => "T'bilisi", + "52" => "T'elavis Raioni", + "53" => "T'erjolis Raioni", + "54" => "T'et'ritsqaros Raioni", + "55" => "T'ianet'is Raioni", + "56" => "Tqibuli", + "57" => "Ts'ageris Raioni", + "58" => "Tsalenjikhis Raioni", + "59" => "Tsalkis Raioni", + "60" => "Tsqaltubo", + "61" => "Vanis Raioni", + "62" => "Zestap'onis Raioni", + "63" => "Zugdidi", + "64" => "Zugdidis Raioni"), +"GH" => array( + "01" => "Greater Accra", + "02" => "Ashanti", + "03" => "Brong-Ahafo", + "04" => "Central", + "05" => "Eastern", + "06" => "Northern", + "08" => "Volta", + "09" => "Western", + "10" => "Upper East", + "11" => "Upper West"), +"GL" => array( + "01" => "Nordgronland", + "02" => "Ostgronland", + "03" => "Vestgronland"), +"GM" => array( + "01" => "Banjul", + "02" => "Lower River", + "03" => "Central River", + "04" => "Upper River", + "05" => "Western", + "07" => "North Bank"), +"GN" => array( + "01" => "Beyla", + "02" => "Boffa", + "03" => "Boke", + "04" => "Conakry", + "05" => "Dabola", + "06" => "Dalaba", + "07" => "Dinguiraye", + "09" => "Faranah", + "10" => "Forecariah", + "11" => "Fria", + "12" => "Gaoual", + "13" => "Gueckedou", + "15" => "Kerouane", + "16" => "Kindia", + "17" => "Kissidougou", + "18" => "Koundara", + "19" => "Kouroussa", + "21" => "Macenta", + "22" => "Mali", + "23" => "Mamou", + "25" => "Pita", + "27" => "Telimele", + "28" => "Tougue", + "29" => "Yomou", + "30" => "Coyah", + "31" => "Dubreka", + "32" => "Kankan", + "33" => "Koubia", + "34" => "Labe", + "35" => "Lelouma", + "36" => "Lola", + "37" => "Mandiana", + "38" => "Nzerekore", + "39" => "Siguiri"), +"GQ" => array( + "03" => "Annobon", + "04" => "Bioko Norte", + "05" => "Bioko Sur", + "06" => "Centro Sur", + "07" => "Kie-Ntem", + "08" => "Litoral", + "09" => "Wele-Nzas"), +"GR" => array( + "01" => "Evros", + "02" => "Rodhopi", + "03" => "Xanthi", + "04" => "Drama", + "05" => "Serrai", + "06" => "Kilkis", + "07" => "Pella", + "08" => "Florina", + "09" => "Kastoria", + "10" => "Grevena", + "11" => "Kozani", + "12" => "Imathia", + "13" => "Thessaloniki", + "14" => "Kavala", + "15" => "Khalkidhiki", + "16" => "Pieria", + "17" => "Ioannina", + "18" => "Thesprotia", + "19" => "Preveza", + "20" => "Arta", + "21" => "Larisa", + "22" => "Trikala", + "23" => "Kardhitsa", + "24" => "Magnisia", + "25" => "Kerkira", + "26" => "Levkas", + "27" => "Kefallinia", + "28" => "Zakinthos", + "29" => "Fthiotis", + "30" => "Evritania", + "31" => "Aitolia kai Akarnania", + "32" => "Fokis", + "33" => "Voiotia", + "34" => "Evvoia", + "35" => "Attiki", + "36" => "Argolis", + "37" => "Korinthia", + "38" => "Akhaia", + "39" => "Ilia", + "40" => "Messinia", + "41" => "Arkadhia", + "42" => "Lakonia", + "43" => "Khania", + "44" => "Rethimni", + "45" => "Iraklion", + "46" => "Lasithi", + "47" => "Dhodhekanisos", + "48" => "Samos", + "49" => "Kikladhes", + "50" => "Khios", + "51" => "Lesvos"), +"GT" => array( + "01" => "Alta Verapaz", + "02" => "Baja Verapaz", + "03" => "Chimaltenango", + "04" => "Chiquimula", + "05" => "El Progreso", + "06" => "Escuintla", + "07" => "Guatemala", + "08" => "Huehuetenango", + "09" => "Izabal", + "10" => "Jalapa", + "11" => "Jutiapa", + "12" => "Peten", + "13" => "Quetzaltenango", + "14" => "Quiche", + "15" => "Retalhuleu", + "16" => "Sacatepequez", + "17" => "San Marcos", + "18" => "Santa Rosa", + "19" => "Solola", + "20" => "Suchitepequez", + "21" => "Totonicapan", + "22" => "Zacapa"), +"GW" => array( + "01" => "Bafata", + "02" => "Quinara", + "04" => "Oio", + "05" => "Bolama", + "06" => "Cacheu", + "07" => "Tombali", + "10" => "Gabu", + "11" => "Bissau", + "12" => "Biombo"), +"GY" => array( + "10" => "Barima-Waini", + "11" => "Cuyuni-Mazaruni", + "12" => "Demerara-Mahaica", + "13" => "East Berbice-Corentyne", + "14" => "Essequibo Islands-West Demerara", + "15" => "Mahaica-Berbice", + "16" => "Pomeroon-Supenaam", + "17" => "Potaro-Siparuni", + "18" => "Upper Demerara-Berbice", + "19" => "Upper Takutu-Upper Essequibo"), +"HN" => array( + "01" => "Atlantida", + "02" => "Choluteca", + "03" => "Colon", + "04" => "Comayagua", + "05" => "Copan", + "06" => "Cortes", + "07" => "El Paraiso", + "08" => "Francisco Morazan", + "09" => "Gracias a Dios", + "10" => "Intibuca", + "11" => "Islas de la Bahia", + "12" => "La Paz", + "13" => "Lempira", + "14" => "Ocotepeque", + "15" => "Olancho", + "16" => "Santa Barbara", + "17" => "Valle", + "18" => "Yoro"), +"HR" => array( + "01" => "Bjelovarsko-Bilogorska", + "02" => "Brodsko-Posavska", + "03" => "Dubrovacko-Neretvanska", + "04" => "Istarska", + "05" => "Karlovacka", + "06" => "Koprivnicko-Krizevacka", + "07" => "Krapinsko-Zagorska", + "08" => "Licko-Senjska", + "09" => "Medimurska", + "10" => "Osjecko-Baranjska", + "11" => "Pozesko-Slavonska", + "12" => "Primorsko-Goranska", + "13" => "Sibensko-Kninska", + "14" => "Sisacko-Moslavacka", + "15" => "Splitsko-Dalmatinska", + "16" => "Varazdinska", + "17" => "Viroviticko-Podravska", + "18" => "Vukovarsko-Srijemska", + "19" => "Zadarska", + "20" => "Zagrebacka", + "21" => "Grad Zagreb"), +"HT" => array( + "03" => "Nord-Ouest", + "06" => "Artibonite", + "07" => "Centre", + "09" => "Nord", + "10" => "Nord-Est", + "11" => "Ouest", + "12" => "Sud", + "13" => "Sud-Est", + "14" => "Grand' Anse", + "15" => "Nippes"), +"HU" => array( + "01" => "Bacs-Kiskun", + "02" => "Baranya", + "03" => "Bekes", + "04" => "Borsod-Abauj-Zemplen", + "05" => "Budapest", + "06" => "Csongrad", + "07" => "Debrecen", + "08" => "Fejer", + "09" => "Gyor-Moson-Sopron", + "10" => "Hajdu-Bihar", + "11" => "Heves", + "12" => "Komarom-Esztergom", + "13" => "Miskolc", + "14" => "Nograd", + "15" => "Pecs", + "16" => "Pest", + "17" => "Somogy", + "18" => "Szabolcs-Szatmar-Bereg", + "19" => "Szeged", + "20" => "Jasz-Nagykun-Szolnok", + "21" => "Tolna", + "22" => "Vas", + "23" => "Veszprem", + "24" => "Zala", + "25" => "Gyor", + "26" => "Bekescsaba", + "27" => "Dunaujvaros", + "28" => "Eger", + "29" => "Hodmezovasarhely", + "30" => "Kaposvar", + "31" => "Kecskemet", + "32" => "Nagykanizsa", + "33" => "Nyiregyhaza", + "34" => "Sopron", + "35" => "Szekesfehervar", + "36" => "Szolnok", + "37" => "Szombathely", + "38" => "Tatabanya", + "39" => "Veszprem", + "40" => "Zalaegerszeg", + "41" => "Salgotarjan", + "42" => "Szekszard", + "43" => "Erd"), +"ID" => array( + "01" => "Aceh", + "02" => "Bali", + "03" => "Bengkulu", + "04" => "Jakarta Raya", + "05" => "Jambi", + "06" => "Jawa Barat", + "07" => "Jawa Tengah", + "08" => "Jawa Timur", + "09" => "Papua", + "10" => "Yogyakarta", + "11" => "Kalimantan Barat", + "12" => "Kalimantan Selatan", + "13" => "Kalimantan Tengah", + "14" => "Kalimantan Timur", + "15" => "Lampung", + "16" => "Maluku", + "17" => "Nusa Tenggara Barat", + "18" => "Nusa Tenggara Timur", + "19" => "Riau", + "20" => "Sulawesi Selatan", + "21" => "Sulawesi Tengah", + "22" => "Sulawesi Tenggara", + "23" => "Sulawesi Utara", + "24" => "Sumatera Barat", + "25" => "Sumatera Selatan", + "26" => "Sumatera Utara", + "28" => "Maluku", + "29" => "Maluku Utara", + "30" => "Jawa Barat", + "31" => "Sulawesi Utara", + "32" => "Sumatera Selatan", + "33" => "Banten", + "34" => "Gorontalo", + "35" => "Kepulauan Bangka Belitung", + "36" => "Papua", + "37" => "Riau", + "38" => "Sulawesi Selatan", + "39" => "Irian Jaya Barat", + "40" => "Kepulauan Riau", + "41" => "Sulawesi Barat"), +"IE" => array( + "01" => "Carlow", + "02" => "Cavan", + "03" => "Clare", + "04" => "Cork", + "06" => "Donegal", + "07" => "Dublin", + "10" => "Galway", + "11" => "Kerry", + "12" => "Kildare", + "13" => "Kilkenny", + "14" => "Leitrim", + "15" => "Laois", + "16" => "Limerick", + "18" => "Longford", + "19" => "Louth", + "20" => "Mayo", + "21" => "Meath", + "22" => "Monaghan", + "23" => "Offaly", + "24" => "Roscommon", + "25" => "Sligo", + "26" => "Tipperary", + "27" => "Waterford", + "29" => "Westmeath", + "30" => "Wexford", + "31" => "Wicklow"), +"IL" => array( + "01" => "HaDarom", + "02" => "HaMerkaz", + "03" => "HaZafon", + "04" => "Hefa", + "05" => "Tel Aviv", + "06" => "Yerushalayim"), +"IN" => array( + "01" => "Andaman and Nicobar Islands", + "02" => "Andhra Pradesh", + "03" => "Assam", + "05" => "Chandigarh", + "06" => "Dadra and Nagar Haveli", + "07" => "Delhi", + "09" => "Gujarat", + "10" => "Haryana", + "11" => "Himachal Pradesh", + "12" => "Jammu and Kashmir", + "13" => "Kerala", + "14" => "Lakshadweep", + "16" => "Maharashtra", + "17" => "Manipur", + "18" => "Meghalaya", + "19" => "Karnataka", + "20" => "Nagaland", + "21" => "Orissa", + "22" => "Puducherry", + "23" => "Punjab", + "24" => "Rajasthan", + "25" => "Tamil Nadu", + "26" => "Tripura", + "28" => "West Bengal", + "29" => "Sikkim", + "30" => "Arunachal Pradesh", + "31" => "Mizoram", + "32" => "Daman and Diu", + "33" => "Goa", + "34" => "Bihar", + "35" => "Madhya Pradesh", + "36" => "Uttar Pradesh", + "37" => "Chhattisgarh", + "38" => "Jharkhand", + "39" => "Uttarakhand"), +"IQ" => array( + "01" => "Al Anbar", + "02" => "Al Basrah", + "03" => "Al Muthanna", + "04" => "Al Qadisiyah", + "05" => "As Sulaymaniyah", + "06" => "Babil", + "07" => "Baghdad", + "08" => "Dahuk", + "09" => "Dhi Qar", + "10" => "Diyala", + "11" => "Arbil", + "12" => "Karbala'", + "13" => "At Ta'mim", + "14" => "Maysan", + "15" => "Ninawa", + "16" => "Wasit", + "17" => "An Najaf", + "18" => "Salah ad Din"), +"IR" => array( + "01" => "Azarbayjan-e Bakhtari", + "03" => "Chahar Mahall va Bakhtiari", + "04" => "Sistan va Baluchestan", + "05" => "Kohkiluyeh va Buyer Ahmadi", + "07" => "Fars", + "08" => "Gilan", + "09" => "Hamadan", + "10" => "Ilam", + "11" => "Hormozgan", + "12" => "Kerman", + "13" => "Bakhtaran", + "15" => "Khuzestan", + "16" => "Kordestan", + "17" => "Mazandaran", + "18" => "Semnan Province", + "19" => "Markazi", + "21" => "Zanjan", + "22" => "Bushehr", + "23" => "Lorestan", + "24" => "Markazi", + "25" => "Semnan", + "26" => "Tehran", + "27" => "Zanjan", + "28" => "Esfahan", + "29" => "Kerman", + "30" => "Khorasan", + "31" => "Yazd", + "32" => "Ardabil", + "33" => "East Azarbaijan", + "34" => "Markazi", + "35" => "Mazandaran", + "36" => "Zanjan", + "37" => "Golestan", + "38" => "Qazvin", + "39" => "Qom", + "40" => "Yazd", + "41" => "Khorasan-e Janubi", + "42" => "Khorasan-e Razavi", + "43" => "Khorasan-e Shemali"), +"IS" => array( + "03" => "Arnessysla", + "05" => "Austur-Hunavatnssysla", + "06" => "Austur-Skaftafellssysla", + "07" => "Borgarfjardarsysla", + "09" => "Eyjafjardarsysla", + "10" => "Gullbringusysla", + "15" => "Kjosarsysla", + "17" => "Myrasysla", + "20" => "Nordur-Mulasysla", + "21" => "Nordur-Tingeyjarsysla", + "23" => "Rangarvallasysla", + "28" => "Skagafjardarsysla", + "29" => "Snafellsnes- og Hnappadalssysla", + "30" => "Strandasysla", + "31" => "Sudur-Mulasysla", + "32" => "Sudur-Tingeyjarsysla", + "34" => "Vestur-Bardastrandarsysla", + "35" => "Vestur-Hunavatnssysla", + "36" => "Vestur-Isafjardarsysla", + "37" => "Vestur-Skaftafellssysla", + "40" => "Norourland Eystra", + "41" => "Norourland Vestra", + "42" => "Suourland", + "43" => "Suournes", + "44" => "Vestfiroir", + "45" => "Vesturland"), +"IT" => array( + "01" => "Abruzzi", + "02" => "Basilicata", + "03" => "Calabria", + "04" => "Campania", + "05" => "Emilia-Romagna", + "06" => "Friuli-Venezia Giulia", + "07" => "Lazio", + "08" => "Liguria", + "09" => "Lombardia", + "10" => "Marche", + "11" => "Molise", + "12" => "Piemonte", + "13" => "Puglia", + "14" => "Sardegna", + "15" => "Sicilia", + "16" => "Toscana", + "17" => "Trentino-Alto Adige", + "18" => "Umbria", + "19" => "Valle d'Aosta", + "20" => "Veneto"), +"JM" => array( + "01" => "Clarendon", + "02" => "Hanover", + "04" => "Manchester", + "07" => "Portland", + "08" => "Saint Andrew", + "09" => "Saint Ann", + "10" => "Saint Catherine", + "11" => "Saint Elizabeth", + "12" => "Saint James", + "13" => "Saint Mary", + "14" => "Saint Thomas", + "15" => "Trelawny", + "16" => "Westmoreland", + "17" => "Kingston"), +"JO" => array( + "02" => "Al Balqa'", + "07" => "Ma", + "09" => "Al Karak", + "10" => "Al Mafraq", + "11" => "Amman Governorate", + "12" => "At Tafilah", + "13" => "Az Zarqa", + "14" => "Irbid", + "16" => "Amman"), +"JP" => array( + "01" => "Aichi", + "02" => "Akita", + "03" => "Aomori", + "04" => "Chiba", + "05" => "Ehime", + "06" => "Fukui", + "07" => "Fukuoka", + "08" => "Fukushima", + "09" => "Gifu", + "10" => "Gumma", + "11" => "Hiroshima", + "12" => "Hokkaido", + "13" => "Hyogo", + "14" => "Ibaraki", + "15" => "Ishikawa", + "16" => "Iwate", + "17" => "Kagawa", + "18" => "Kagoshima", + "19" => "Kanagawa", + "20" => "Kochi", + "21" => "Kumamoto", + "22" => "Kyoto", + "23" => "Mie", + "24" => "Miyagi", + "25" => "Miyazaki", + "26" => "Nagano", + "27" => "Nagasaki", + "28" => "Nara", + "29" => "Niigata", + "30" => "Oita", + "31" => "Okayama", + "32" => "Osaka", + "33" => "Saga", + "34" => "Saitama", + "35" => "Shiga", + "36" => "Shimane", + "37" => "Shizuoka", + "38" => "Tochigi", + "39" => "Tokushima", + "40" => "Tokyo", + "41" => "Tottori", + "42" => "Toyama", + "43" => "Wakayama", + "44" => "Yamagata", + "45" => "Yamaguchi", + "46" => "Yamanashi", + "47" => "Okinawa"), +"KE" => array( + "01" => "Central", + "02" => "Coast", + "03" => "Eastern", + "05" => "Nairobi Area", + "06" => "North-Eastern", + "07" => "Nyanza", + "08" => "Rift Valley", + "09" => "Western"), +"KG" => array( + "01" => "Bishkek", + "02" => "Chuy", + "03" => "Jalal-Abad", + "04" => "Naryn", + "05" => "Osh", + "06" => "Talas", + "07" => "Ysyk-Kol", + "08" => "Osh", + "09" => "Batken"), +"KH" => array( + "01" => "Batdambang", + "02" => "Kampong Cham", + "03" => "Kampong Chhnang", + "04" => "Kampong Speu", + "05" => "Kampong Thum", + "06" => "Kampot", + "07" => "Kandal", + "08" => "Koh Kong", + "09" => "Kracheh", + "10" => "Mondulkiri", + "11" => "Phnum Penh", + "12" => "Pursat", + "13" => "Preah Vihear", + "14" => "Prey Veng", + "15" => "Ratanakiri Kiri", + "16" => "Siem Reap", + "17" => "Stung Treng", + "18" => "Svay Rieng", + "19" => "Takeo", + "25" => "Banteay Meanchey", + "29" => "Batdambang", + "30" => "Pailin"), +"KI" => array( + "01" => "Gilbert Islands", + "02" => "Line Islands", + "03" => "Phoenix Islands"), +"KM" => array( + "01" => "Anjouan", + "02" => "Grande Comore", + "03" => "Moheli"), +"KN" => array( + "01" => "Christ Church Nichola Town", + "02" => "Saint Anne Sandy Point", + "03" => "Saint George Basseterre", + "04" => "Saint George Gingerland", + "05" => "Saint James Windward", + "06" => "Saint John Capisterre", + "07" => "Saint John Figtree", + "08" => "Saint Mary Cayon", + "09" => "Saint Paul Capisterre", + "10" => "Saint Paul Charlestown", + "11" => "Saint Peter Basseterre", + "12" => "Saint Thomas Lowland", + "13" => "Saint Thomas Middle Island", + "15" => "Trinity Palmetto Point"), +"KP" => array( + "01" => "Chagang-do", + "03" => "Hamgyong-namdo", + "06" => "Hwanghae-namdo", + "07" => "Hwanghae-bukto", + "08" => "Kaesong-si", + "09" => "Kangwon-do", + "11" => "P'yongan-bukto", + "12" => "P'yongyang-si", + "13" => "Yanggang-do", + "14" => "Namp'o-si", + "15" => "P'yongan-namdo", + "17" => "Hamgyong-bukto", + "18" => "Najin Sonbong-si"), +"KR" => array( + "01" => "Cheju-do", + "03" => "Cholla-bukto", + "05" => "Ch'ungch'ong-bukto", + "06" => "Kangwon-do", + "10" => "Pusan-jikhalsi", + "11" => "Seoul-t'ukpyolsi", + "12" => "Inch'on-jikhalsi", + "13" => "Kyonggi-do", + "14" => "Kyongsang-bukto", + "15" => "Taegu-jikhalsi", + "16" => "Cholla-namdo", + "17" => "Ch'ungch'ong-namdo", + "18" => "Kwangju-jikhalsi", + "19" => "Taejon-jikhalsi", + "20" => "Kyongsang-namdo", + "21" => "Ulsan-gwangyoksi"), +"KW" => array( + "01" => "Al Ahmadi", + "02" => "Al Kuwayt", + "05" => "Al Jahra", + "07" => "Al Farwaniyah", + "08" => "Hawalli", + "09" => "Mubarak al Kabir"), +"KY" => array( + "01" => "Creek", + "02" => "Eastern", + "03" => "Midland", + "04" => "South Town", + "05" => "Spot Bay", + "06" => "Stake Bay", + "07" => "West End", + "08" => "Western"), +"KZ" => array( + "01" => "Almaty", + "02" => "Almaty City", + "03" => "Aqmola", + "04" => "Aqtobe", + "05" => "Astana", + "06" => "Atyrau", + "07" => "West Kazakhstan", + "08" => "Bayqonyr", + "09" => "Mangghystau", + "10" => "South Kazakhstan", + "11" => "Pavlodar", + "12" => "Qaraghandy", + "13" => "Qostanay", + "14" => "Qyzylorda", + "15" => "East Kazakhstan", + "16" => "North Kazakhstan", + "17" => "Zhambyl"), +"LA" => array( + "01" => "Attapu", + "02" => "Champasak", + "03" => "Houaphan", + "04" => "Khammouan", + "05" => "Louang Namtha", + "07" => "Oudomxai", + "08" => "Phongsali", + "09" => "Saravan", + "10" => "Savannakhet", + "11" => "Vientiane", + "13" => "Xaignabouri", + "14" => "Xiangkhoang", + "17" => "Louangphrabang"), +"LB" => array( + "01" => "Beqaa", + "02" => "Al Janub", + "03" => "Liban-Nord", + "04" => "Beyrouth", + "05" => "Mont-Liban", + "06" => "Liban-Sud", + "07" => "Nabatiye", + "08" => "Beqaa", + "09" => "Liban-Nord", + "10" => "Aakk,r", + "11" => "Baalbek-Hermel"), +"LC" => array( + "01" => "Anse-la-Raye", + "02" => "Dauphin", + "03" => "Castries", + "04" => "Choiseul", + "05" => "Dennery", + "06" => "Gros-Islet", + "07" => "Laborie", + "08" => "Micoud", + "09" => "Soufriere", + "10" => "Vieux-Fort", + "11" => "Praslin"), +"LI" => array( + "01" => "Balzers", + "02" => "Eschen", + "03" => "Gamprin", + "04" => "Mauren", + "05" => "Planken", + "06" => "Ruggell", + "07" => "Schaan", + "08" => "Schellenberg", + "09" => "Triesen", + "10" => "Triesenberg", + "11" => "Vaduz", + "21" => "Gbarpolu", + "22" => "River Gee"), +"LK" => array( + "01" => "Amparai", + "02" => "Anuradhapura", + "03" => "Badulla", + "04" => "Batticaloa", + "06" => "Galle", + "07" => "Hambantota", + "09" => "Kalutara", + "10" => "Kandy", + "11" => "Kegalla", + "12" => "Kurunegala", + "14" => "Matale", + "15" => "Matara", + "16" => "Moneragala", + "17" => "Nuwara Eliya", + "18" => "Polonnaruwa", + "19" => "Puttalam", + "20" => "Ratnapura", + "21" => "Trincomalee", + "23" => "Colombo", + "24" => "Gampaha", + "25" => "Jaffna", + "26" => "Mannar", + "27" => "Mullaittivu", + "28" => "Vavuniya", + "29" => "Central", + "30" => "North Central", + "31" => "Northern", + "32" => "North Western", + "33" => "Sabaragamuwa", + "34" => "Southern", + "35" => "Uva", + "36" => "Western"), +"LR" => array( + "01" => "Bong", + "04" => "Grand Cape Mount", + "05" => "Lofa", + "06" => "Maryland", + "07" => "Monrovia", + "09" => "Nimba", + "10" => "Sino", + "11" => "Grand Bassa", + "12" => "Grand Cape Mount", + "13" => "Maryland", + "14" => "Montserrado", + "17" => "Margibi", + "18" => "River Cess", + "19" => "Grand Gedeh", + "20" => "Lofa", + "21" => "Gbarpolu", + "22" => "River Gee"), +"LS" => array( + "10" => "Berea", + "11" => "Butha-Buthe", + "12" => "Leribe", + "13" => "Mafeteng", + "14" => "Maseru", + "15" => "Mohales Hoek", + "16" => "Mokhotlong", + "17" => "Qachas Nek", + "18" => "Quthing", + "19" => "Thaba-Tseka"), +"LT" => array( + "56" => "Alytaus Apskritis", + "57" => "Kauno Apskritis", + "58" => "Klaipedos Apskritis", + "59" => "Marijampoles Apskritis", + "60" => "Panevezio Apskritis", + "61" => "Siauliu Apskritis", + "62" => "Taurages Apskritis", + "63" => "Telsiu Apskritis", + "64" => "Utenos Apskritis", + "65" => "Vilniaus Apskritis"), +"LU" => array( + "01" => "Diekirch", + "02" => "Grevenmacher", + "03" => "Luxembourg"), +"LV" => array( + "01" => "Aizkraukles", + "02" => "Aluksnes", + "03" => "Balvu", + "04" => "Bauskas", + "05" => "Cesu", + "06" => "Daugavpils", + "07" => "Daugavpils", + "08" => "Dobeles", + "09" => "Gulbenes", + "10" => "Jekabpils", + "11" => "Jelgava", + "12" => "Jelgavas", + "13" => "Jurmala", + "14" => "Kraslavas", + "15" => "Kuldigas", + "16" => "Liepaja", + "17" => "Liepajas", + "18" => "Limbazu", + "19" => "Ludzas", + "20" => "Madonas", + "21" => "Ogres", + "22" => "Preilu", + "23" => "Rezekne", + "24" => "Rezeknes", + "25" => "Riga", + "26" => "Rigas", + "27" => "Saldus", + "28" => "Talsu", + "29" => "Tukuma", + "30" => "Valkas", + "31" => "Valmieras", + "32" => "Ventspils", + "33" => "Ventspils"), +"LY" => array( + "03" => "Al Aziziyah", + "05" => "Al Jufrah", + "08" => "Al Kufrah", + "13" => "Ash Shati'", + "30" => "Murzuq", + "34" => "Sabha", + "41" => "Tarhunah", + "42" => "Tubruq", + "45" => "Zlitan", + "47" => "Ajdabiya", + "48" => "Al Fatih", + "49" => "Al Jabal al Akhdar", + "50" => "Al Khums", + "51" => "An Nuqat al Khams", + "52" => "Awbari", + "53" => "Az Zawiyah", + "54" => "Banghazi", + "55" => "Darnah", + "56" => "Ghadamis", + "57" => "Gharyan", + "58" => "Misratah", + "59" => "Sawfajjin", + "60" => "Surt", + "61" => "Tarabulus", + "62" => "Yafran"), +"MA" => array( + "45" => "Grand Casablanca", + "46" => "Fes-Boulemane", + "47" => "Marrakech-Tensift-Al Haouz", + "48" => "Meknes-Tafilalet", + "49" => "Rabat-Sale-Zemmour-Zaer", + "50" => "Chaouia-Ouardigha", + "51" => "Doukkala-Abda", + "52" => "Gharb-Chrarda-Beni Hssen", + "53" => "Guelmim-Es Smara", + "54" => "Oriental", + "55" => "Souss-Massa-Dr,a", + "56" => "Tadla-Azilal", + "57" => "Tanger-Tetouan", + "58" => "Taza-Al Hoceima-Taounate", + "59" => "La,youne-Boujdour-Sakia El Hamra"), +"MC" => array( + "01" => "La Condamine", + "02" => "Monaco", + "03" => "Monte-Carlo"), +"MD" => array( + "51" => "Gagauzia", + "57" => "Chisinau", + "58" => "Stinga Nistrului", + "59" => "Anenii Noi", + "60" => "Balti", + "61" => "Basarabeasca", + "62" => "Bender", + "63" => "Briceni", + "64" => "Cahul", + "65" => "Cantemir", + "66" => "Calarasi", + "67" => "Causeni", + "68" => "Cimislia", + "69" => "Criuleni", + "70" => "Donduseni", + "71" => "Drochia", + "72" => "Dubasari", + "73" => "Edinet", + "74" => "Falesti", + "75" => "Floresti", + "76" => "Glodeni", + "77" => "Hincesti", + "78" => "Ialoveni", + "79" => "Leova", + "80" => "Nisporeni", + "81" => "Ocnita", + "83" => "Rezina", + "84" => "Riscani", + "85" => "Singerei", + "86" => "Soldanesti", + "87" => "Soroca", + "88" => "Stefan-Voda", + "89" => "Straseni", + "90" => "Taraclia", + "91" => "Telenesti", + "92" => "Ungheni"), +"MG" => array( + "01" => "Antsiranana", + "02" => "Fianarantsoa", + "03" => "Mahajanga", + "04" => "Toamasina", + "05" => "Antananarivo", + "06" => "Toliara"), +"MK" => array( + "01" => "Aracinovo", + "02" => "Bac", + "03" => "Belcista", + "04" => "Berovo", + "05" => "Bistrica", + "06" => "Bitola", + "07" => "Blatec", + "08" => "Bogdanci", + "09" => "Bogomila", + "10" => "Bogovinje", + "11" => "Bosilovo", + "12" => "Brvenica", + "13" => "Cair", + "14" => "Capari", + "15" => "Caska", + "16" => "Cegrane", + "17" => "Centar", + "18" => "Centar Zupa", + "19" => "Cesinovo", + "20" => "Cucer-Sandevo", + "21" => "Debar", + "22" => "Delcevo", + "23" => "Delogozdi", + "24" => "Demir Hisar", + "25" => "Demir Kapija", + "26" => "Dobrusevo", + "27" => "Dolna Banjica", + "28" => "Dolneni", + "29" => "Dorce Petrov", + "30" => "Drugovo", + "31" => "Dzepciste", + "32" => "Gazi Baba", + "33" => "Gevgelija", + "34" => "Gostivar", + "35" => "Gradsko", + "36" => "Ilinden", + "37" => "Izvor", + "38" => "Jegunovce", + "39" => "Kamenjane", + "40" => "Karbinci", + "41" => "Karpos", + "42" => "Kavadarci", + "43" => "Kicevo", + "44" => "Kisela Voda", + "45" => "Klecevce", + "46" => "Kocani", + "47" => "Konce", + "48" => "Kondovo", + "49" => "Konopiste", + "50" => "Kosel", + "51" => "Kratovo", + "52" => "Kriva Palanka", + "53" => "Krivogastani", + "54" => "Krusevo", + "55" => "Kuklis", + "56" => "Kukurecani", + "57" => "Kumanovo", + "58" => "Labunista", + "59" => "Lipkovo", + "60" => "Lozovo", + "61" => "Lukovo", + "62" => "Makedonska Kamenica", + "63" => "Makedonski Brod", + "64" => "Mavrovi Anovi", + "65" => "Meseista", + "66" => "Miravci", + "67" => "Mogila", + "68" => "Murtino", + "69" => "Negotino", + "70" => "Negotino-Polosko", + "71" => "Novaci", + "72" => "Novo Selo", + "73" => "Oblesevo", + "74" => "Ohrid", + "75" => "Orasac", + "76" => "Orizari", + "77" => "Oslomej", + "78" => "Pehcevo", + "79" => "Petrovec", + "80" => "Plasnica", + "81" => "Podares", + "82" => "Prilep", + "83" => "Probistip", + "84" => "Radovis", + "85" => "Rankovce", + "86" => "Resen", + "87" => "Rosoman", + "88" => "Rostusa", + "89" => "Samokov", + "90" => "Saraj", + "91" => "Sipkovica", + "92" => "Sopiste", + "93" => "Sopotnica", + "94" => "Srbinovo", + "95" => "Staravina", + "96" => "Star Dojran", + "97" => "Staro Nagoricane", + "98" => "Stip", + "99" => "Struga", + "A1" => "Strumica", + "A2" => "Studenicani", + "A3" => "Suto Orizari", + "A4" => "Sveti Nikole", + "A5" => "Tearce", + "A6" => "Tetovo", + "A7" => "Topolcani", + "A8" => "Valandovo", + "A9" => "Vasilevo", + "B1" => "Veles", + "B2" => "Velesta", + "B3" => "Vevcani", + "B4" => "Vinica", + "B5" => "Vitoliste", + "B6" => "Vranestica", + "B7" => "Vrapciste", + "B8" => "Vratnica", + "B9" => "Vrutok", + "C1" => "Zajas", + "C2" => "Zelenikovo", + "C3" => "Zelino", + "C4" => "Zitose", + "C5" => "Zletovo", + "C6" => "Zrnovci"), +"ML" => array( + "01" => "Bamako", + "03" => "Kayes", + "04" => "Mopti", + "05" => "Segou", + "06" => "Sikasso", + "07" => "Koulikoro", + "08" => "Tombouctou", + "09" => "Gao", + "10" => "Kidal"), +"MM" => array( + "01" => "Rakhine State", + "02" => "Chin State", + "03" => "Irrawaddy", + "04" => "Kachin State", + "05" => "Karan State", + "06" => "Kayah State", + "07" => "Magwe", + "08" => "Mandalay", + "09" => "Pegu", + "10" => "Sagaing", + "11" => "Shan State", + "12" => "Tenasserim", + "13" => "Mon State", + "14" => "Rangoon", + "17" => "Yangon"), +"MN" => array( + "01" => "Arhangay", + "02" => "Bayanhongor", + "03" => "Bayan-Olgiy", + "05" => "Darhan", + "06" => "Dornod", + "07" => "Dornogovi", + "08" => "Dundgovi", + "09" => "Dzavhan", + "10" => "Govi-Altay", + "11" => "Hentiy", + "12" => "Hovd", + "13" => "Hovsgol", + "14" => "Omnogovi", + "15" => "Ovorhangay", + "16" => "Selenge", + "17" => "Suhbaatar", + "18" => "Tov", + "19" => "Uvs", + "20" => "Ulaanbaatar", + "21" => "Bulgan", + "22" => "Erdenet", + "23" => "Darhan-Uul", + "24" => "Govisumber", + "25" => "Orhon"), +"MO" => array( + "01" => "Ilhas", + "02" => "Macau"), +"MR" => array( + "01" => "Hodh Ech Chargui", + "02" => "Hodh El Gharbi", + "03" => "Assaba", + "04" => "Gorgol", + "05" => "Brakna", + "06" => "Trarza", + "07" => "Adrar", + "08" => "Dakhlet Nouadhibou", + "09" => "Tagant", + "10" => "Guidimaka", + "11" => "Tiris Zemmour", + "12" => "Inchiri"), +"MS" => array( + "01" => "Saint Anthony", + "02" => "Saint Georges", + "03" => "Saint Peter"), +"MU" => array( + "12" => "Black River", + "13" => "Flacq", + "14" => "Grand Port", + "15" => "Moka", + "16" => "Pamplemousses", + "17" => "Plaines Wilhems", + "18" => "Port Louis", + "19" => "Riviere du Rempart", + "20" => "Savanne", + "21" => "Agalega Islands", + "22" => "Cargados Carajos", + "23" => "Rodrigues"), +"MV" => array( + "01" => "Seenu", + "05" => "Laamu", + "30" => "Alifu", + "31" => "Baa", + "32" => "Dhaalu", + "33" => "Faafu ", + "34" => "Gaafu Alifu", + "35" => "Gaafu Dhaalu", + "36" => "Haa Alifu", + "37" => "Haa Dhaalu", + "38" => "Kaafu", + "39" => "Lhaviyani", + "40" => "Maale", + "41" => "Meemu", + "42" => "Gnaviyani", + "43" => "Noonu", + "44" => "Raa", + "45" => "Shaviyani", + "46" => "Thaa", + "47" => "Vaavu"), +"MW" => array( + "02" => "Chikwawa", + "03" => "Chiradzulu", + "04" => "Chitipa", + "05" => "Thyolo", + "06" => "Dedza", + "07" => "Dowa", + "08" => "Karonga", + "09" => "Kasungu", + "11" => "Lilongwe", + "12" => "Mangochi", + "13" => "Mchinji", + "15" => "Mzimba", + "16" => "Ntcheu", + "17" => "Nkhata Bay", + "18" => "Nkhotakota", + "19" => "Nsanje", + "20" => "Ntchisi", + "21" => "Rumphi", + "22" => "Salima", + "23" => "Zomba", + "24" => "Blantyre", + "25" => "Mwanza", + "26" => "Balaka", + "27" => "Likoma", + "28" => "Machinga", + "29" => "Mulanje", + "30" => "Phalombe"), +"MX" => array( + "01" => "Aguascalientes", + "02" => "Baja California", + "03" => "Baja California Sur", + "04" => "Campeche", + "05" => "Chiapas", + "06" => "Chihuahua", + "07" => "Coahuila de Zaragoza", + "08" => "Colima", + "09" => "Distrito Federal", + "10" => "Durango", + "11" => "Guanajuato", + "12" => "Guerrero", + "13" => "Hidalgo", + "14" => "Jalisco", + "15" => "Mexico", + "16" => "Michoacan de Ocampo", + "17" => "Morelos", + "18" => "Nayarit", + "19" => "Nuevo Leon", + "20" => "Oaxaca", + "21" => "Puebla", + "22" => "Queretaro de Arteaga", + "23" => "Quintana Roo", + "24" => "San Luis Potosi", + "25" => "Sinaloa", + "26" => "Sonora", + "27" => "Tabasco", + "28" => "Tamaulipas", + "29" => "Tlaxcala", + "30" => "Veracruz-Llave", + "31" => "Yucatan", + "32" => "Zacatecas"), +"MY" => array( + "01" => "Johor", + "02" => "Kedah", + "03" => "Kelantan", + "04" => "Melaka", + "05" => "Negeri Sembilan", + "06" => "Pahang", + "07" => "Perak", + "08" => "Perlis", + "09" => "Pulau Pinang", + "11" => "Sarawak", + "12" => "Selangor", + "13" => "Terengganu", + "14" => "Kuala Lumpur", + "15" => "Labuan", + "16" => "Sabah", + "17" => "Putrajaya"), +"MZ" => array( + "01" => "Cabo Delgado", + "02" => "Gaza", + "03" => "Inhambane", + "04" => "Maputo", + "05" => "Sofala", + "06" => "Nampula", + "07" => "Niassa", + "08" => "Tete", + "09" => "Zambezia", + "10" => "Manica", + "11" => "Maputo"), +"NA" => array( + "01" => "Bethanien", + "02" => "Caprivi Oos", + "03" => "Boesmanland", + "04" => "Gobabis", + "05" => "Grootfontein", + "06" => "Kaokoland", + "07" => "Karibib", + "08" => "Keetmanshoop", + "09" => "Luderitz", + "10" => "Maltahohe", + "11" => "Okahandja", + "12" => "Omaruru", + "13" => "Otjiwarongo", + "14" => "Outjo", + "15" => "Owambo", + "16" => "Rehoboth", + "17" => "Swakopmund", + "18" => "Tsumeb", + "20" => "Karasburg", + "21" => "Windhoek", + "22" => "Damaraland", + "23" => "Hereroland Oos", + "24" => "Hereroland Wes", + "25" => "Kavango", + "26" => "Mariental", + "27" => "Namaland", + "28" => "Caprivi", + "29" => "Erongo", + "30" => "Hardap", + "31" => "Karas", + "32" => "Kunene", + "33" => "Ohangwena", + "34" => "Okavango", + "35" => "Omaheke", + "36" => "Omusati", + "37" => "Oshana", + "38" => "Oshikoto", + "39" => "Otjozondjupa"), +"NE" => array( + "01" => "Agadez", + "02" => "Diffa", + "03" => "Dosso", + "04" => "Maradi", + "05" => "Niamey", + "06" => "Tahoua", + "07" => "Zinder", + "08" => "Niamey"), +"NG" => array( + "05" => "Lagos", + "11" => "Federal Capital Territory", + "16" => "Ogun", + "21" => "Akwa Ibom", + "22" => "Cross River", + "23" => "Kaduna", + "24" => "Katsina", + "25" => "Anambra", + "26" => "Benue", + "27" => "Borno", + "28" => "Imo", + "29" => "Kano", + "30" => "Kwara", + "31" => "Niger", + "32" => "Oyo", + "35" => "Adamawa", + "36" => "Delta", + "37" => "Edo", + "39" => "Jigawa", + "40" => "Kebbi", + "41" => "Kogi", + "42" => "Osun", + "43" => "Taraba", + "44" => "Yobe", + "45" => "Abia", + "46" => "Bauchi", + "47" => "Enugu", + "48" => "Ondo", + "49" => "Plateau", + "50" => "Rivers", + "51" => "Sokoto", + "52" => "Bayelsa", + "53" => "Ebonyi", + "54" => "Ekiti", + "55" => "Gombe", + "56" => "Nassarawa", + "57" => "Zamfara"), +"NI" => array( + "01" => "Boaco", + "02" => "Carazo", + "03" => "Chinandega", + "04" => "Chontales", + "05" => "Esteli", + "06" => "Granada", + "07" => "Jinotega", + "08" => "Leon", + "09" => "Madriz", + "10" => "Managua", + "11" => "Masaya", + "12" => "Matagalpa", + "13" => "Nueva Segovia", + "14" => "Rio San Juan", + "15" => "Rivas", + "16" => "Zelaya", + "17" => "Autonoma Atlantico Norte", + "18" => "Region Autonoma Atlantico Sur"), +"NL" => array( + "01" => "Drenthe", + "02" => "Friesland", + "03" => "Gelderland", + "04" => "Groningen", + "05" => "Limburg", + "06" => "Noord-Brabant", + "07" => "Noord-Holland", + "08" => "Overijssel", + "09" => "Utrecht", + "10" => "Zeeland", + "11" => "Zuid-Holland", + "15" => "Overijssel", + "16" => "Flevoland"), +"NO" => array( + "01" => "Akershus", + "02" => "Aust-Agder", + "04" => "Buskerud", + "05" => "Finnmark", + "06" => "Hedmark", + "07" => "Hordaland", + "08" => "More og Romsdal", + "09" => "Nordland", + "10" => "Nord-Trondelag", + "11" => "Oppland", + "12" => "Oslo", + "13" => "Ostfold", + "14" => "Rogaland", + "15" => "Sogn og Fjordane", + "16" => "Sor-Trondelag", + "17" => "Telemark", + "18" => "Troms", + "19" => "Vest-Agder", + "20" => "Vestfold"), +"NP" => array( + "01" => "Bagmati", + "02" => "Bheri", + "03" => "Dhawalagiri", + "04" => "Gandaki", + "05" => "Janakpur", + "06" => "Karnali", + "07" => "Kosi", + "08" => "Lumbini", + "09" => "Mahakali", + "10" => "Mechi", + "11" => "Narayani", + "12" => "Rapti", + "13" => "Sagarmatha", + "14" => "Seti"), +"NR" => array( + "01" => "Aiwo", + "02" => "Anabar", + "03" => "Anetan", + "04" => "Anibare", + "05" => "Baiti", + "06" => "Boe", + "07" => "Buada", + "08" => "Denigomodu", + "09" => "Ewa", + "10" => "Ijuw", + "11" => "Meneng", + "12" => "Nibok", + "13" => "Uaboe", + "14" => "Yaren"), +"NZ" => array( + "10" => "Chatham Islands", + "E7" => "Auckland", + "E8" => "Bay of Plenty", + "E9" => "Canterbury", + "F1" => "Gisborne", + "F2" => "Hawke's Bay", + "F3" => "Manawatu-Wanganui", + "F4" => "Marlborough", + "F5" => "Nelson", + "F6" => "Northland", + "F7" => "Otago", + "F8" => "Southland", + "F9" => "Taranaki", + "G1" => "Waikato", + "G2" => "Wellington", + "G3" => "West Coast"), +"OM" => array( + "01" => "Ad Dakhiliyah", + "02" => "Al Batinah", + "03" => "Al Wusta", + "04" => "Ash Sharqiyah", + "05" => "Az Zahirah", + "06" => "Masqat", + "07" => "Musandam", + "08" => "Zufar"), +"PA" => array( + "01" => "Bocas del Toro", + "02" => "Chiriqui", + "03" => "Cocle", + "04" => "Colon", + "05" => "Darien", + "06" => "Herrera", + "07" => "Los Santos", + "08" => "Panama", + "09" => "San Blas", + "10" => "Veraguas"), +"PE" => array( + "01" => "Amazonas", + "02" => "Ancash", + "03" => "Apurimac", + "04" => "Arequipa", + "05" => "Ayacucho", + "06" => "Cajamarca", + "07" => "Callao", + "08" => "Cusco", + "09" => "Huancavelica", + "10" => "Huanuco", + "11" => "Ica", + "12" => "Junin", + "13" => "La Libertad", + "14" => "Lambayeque", + "15" => "Lima", + "16" => "Loreto", + "17" => "Madre de Dios", + "18" => "Moquegua", + "19" => "Pasco", + "20" => "Piura", + "21" => "Puno", + "22" => "San Martin", + "23" => "Tacna", + "24" => "Tumbes", + "25" => "Ucayali"), +"PG" => array( + "01" => "Central", + "02" => "Gulf", + "03" => "Milne Bay", + "04" => "Northern", + "05" => "Southern Highlands", + "06" => "Western", + "07" => "North Solomons", + "08" => "Chimbu", + "09" => "Eastern Highlands", + "10" => "East New Britain", + "11" => "East Sepik", + "12" => "Madang", + "13" => "Manus", + "14" => "Morobe", + "15" => "New Ireland", + "16" => "Western Highlands", + "17" => "West New Britain", + "18" => "Sandaun", + "19" => "Enga", + "20" => "National Capital"), +"PH" => array( + "01" => "Abra", + "02" => "Agusan del Norte", + "03" => "Agusan del Sur", + "04" => "Aklan", + "05" => "Albay", + "06" => "Antique", + "07" => "Bataan", + "08" => "Batanes", + "09" => "Batangas", + "10" => "Benguet", + "11" => "Bohol", + "12" => "Bukidnon", + "13" => "Bulacan", + "14" => "Cagayan", + "15" => "Camarines Norte", + "16" => "Camarines Sur", + "17" => "Camiguin", + "18" => "Capiz", + "19" => "Catanduanes", + "20" => "Cavite", + "21" => "Cebu", + "22" => "Basilan", + "23" => "Eastern Samar", + "24" => "Davao", + "25" => "Davao del Sur", + "26" => "Davao Oriental", + "27" => "Ifugao", + "28" => "Ilocos Norte", + "29" => "Ilocos Sur", + "30" => "Iloilo", + "31" => "Isabela", + "32" => "Kalinga-Apayao", + "33" => "Laguna", + "34" => "Lanao del Norte", + "35" => "Lanao del Sur", + "36" => "La Union", + "37" => "Leyte", + "38" => "Marinduque", + "39" => "Masbate", + "40" => "Mindoro Occidental", + "41" => "Mindoro Oriental", + "42" => "Misamis Occidental", + "43" => "Misamis Oriental", + "44" => "Mountain", + "45" => "Negros Occidental", + "46" => "Negros Oriental", + "47" => "Nueva Ecija", + "48" => "Nueva Vizcaya", + "49" => "Palawan", + "50" => "Pampanga", + "51" => "Pangasinan", + "53" => "Rizal", + "54" => "Romblon", + "55" => "Samar", + "56" => "Maguindanao", + "57" => "North Cotabato", + "58" => "Sorsogon", + "59" => "Southern Leyte", + "60" => "Sulu", + "61" => "Surigao del Norte", + "62" => "Surigao del Sur", + "63" => "Tarlac", + "64" => "Zambales", + "65" => "Zamboanga del Norte", + "66" => "Zamboanga del Sur", + "67" => "Northern Samar", + "68" => "Quirino", + "69" => "Siquijor", + "70" => "South Cotabato", + "71" => "Sultan Kudarat", + "72" => "Tawitawi", + "A1" => "Angeles", + "A2" => "Bacolod", + "A3" => "Bago", + "A4" => "Baguio", + "A5" => "Bais", + "A6" => "Basilan City", + "A7" => "Batangas City", + "A8" => "Butuan", + "A9" => "Cabanatuan", + "B1" => "Cadiz", + "B2" => "Cagayan de Oro", + "B3" => "Calbayog", + "B4" => "Caloocan", + "B5" => "Canlaon", + "B6" => "Cavite City", + "B7" => "Cebu City", + "B8" => "Cotabato", + "B9" => "Dagupan", + "C1" => "Danao", + "C2" => "Dapitan", + "C3" => "Davao City", + "C4" => "Dipolog", + "C5" => "Dumaguete", + "C6" => "General Santos", + "C7" => "Gingoog", + "C8" => "Iligan", + "C9" => "Iloilo City", + "D1" => "Iriga", + "D2" => "La Carlota", + "D3" => "Laoag", + "D4" => "Lapu-Lapu", + "D5" => "Legaspi", + "D6" => "Lipa", + "D7" => "Lucena", + "D8" => "Mandaue", + "D9" => "Manila", + "E1" => "Marawi", + "E2" => "Naga", + "E3" => "Olongapo", + "E4" => "Ormoc", + "E5" => "Oroquieta", + "E6" => "Ozamis", + "E7" => "Pagadian", + "E8" => "Palayan", + "E9" => "Pasay", + "F1" => "Puerto Princesa", + "F2" => "Quezon City", + "F3" => "Roxas", + "F4" => "San Carlos", + "F5" => "San Carlos", + "F6" => "San Jose", + "F7" => "San Pablo", + "F8" => "Silay", + "F9" => "Surigao", + "G1" => "Tacloban", + "G2" => "Tagaytay", + "G3" => "Tagbilaran", + "G4" => "Tangub", + "G5" => "Toledo", + "G6" => "Trece Martires", + "G7" => "Zamboanga", + "G8" => "Aurora", + "H2" => "Quezon", + "H3" => "Negros Occidental"), +"PK" => array( + "01" => "Federally Administered Tribal Areas", + "02" => "Balochistan", + "03" => "North-West Frontier", + "04" => "Punjab", + "05" => "Sindh", + "06" => "Azad Kashmir", + "07" => "Northern Areas", + "08" => "Islamabad"), +"PL" => array( + "72" => "Dolnoslaskie", + "73" => "Kujawsko-Pomorskie", + "74" => "Lodzkie", + "75" => "Lubelskie", + "76" => "Lubuskie", + "77" => "Malopolskie", + "78" => "Mazowieckie", + "79" => "Opolskie", + "80" => "Podkarpackie", + "81" => "Podlaskie", + "82" => "Pomorskie", + "83" => "Slaskie", + "84" => "Swietokrzyskie", + "85" => "Warminsko-Mazurskie", + "86" => "Wielkopolskie", + "87" => "Zachodniopomorskie"), +"PS" => array( + "GZ" => "Gaza", + "WE" => "West Bank"), +"PT" => array( + "02" => "Aveiro", + "03" => "Beja", + "04" => "Braga", + "05" => "Braganca", + "06" => "Castelo Branco", + "07" => "Coimbra", + "08" => "Evora", + "09" => "Faro", + "10" => "Madeira", + "11" => "Guarda", + "13" => "Leiria", + "14" => "Lisboa", + "16" => "Portalegre", + "17" => "Porto", + "18" => "Santarem", + "19" => "Setubal", + "20" => "Viana do Castelo", + "21" => "Vila Real", + "22" => "Viseu", + "23" => "Azores"), +"PY" => array( + "01" => "Alto Parana", + "02" => "Amambay", + "03" => "Boqueron", + "04" => "Caaguazu", + "05" => "Caazapa", + "06" => "Central", + "07" => "Concepcion", + "08" => "Cordillera", + "10" => "Guaira", + "11" => "Itapua", + "12" => "Misiones", + "13" => "Neembucu", + "15" => "Paraguari", + "16" => "Presidente Hayes", + "17" => "San Pedro", + "19" => "Canindeyu", + "20" => "Chaco", + "21" => "Nueva Asuncion", + "23" => "Alto Paraguay"), +"QA" => array( + "01" => "Ad Dawhah", + "02" => "Al Ghuwariyah", + "03" => "Al Jumaliyah", + "04" => "Al Khawr", + "05" => "Al Wakrah Municipality", + "06" => "Ar Rayyan", + "08" => "Madinat ach Shamal", + "09" => "Umm Salal", + "10" => "Al Wakrah", + "11" => "Jariyan al Batnah", + "12" => "Umm Sa'id"), +"RO" => array( + "01" => "Alba", + "02" => "Arad", + "03" => "Arges", + "04" => "Bacau", + "05" => "Bihor", + "06" => "Bistrita-Nasaud", + "07" => "Botosani", + "08" => "Braila", + "09" => "Brasov", + "10" => "Bucuresti", + "11" => "Buzau", + "12" => "Caras-Severin", + "13" => "Cluj", + "14" => "Constanta", + "15" => "Covasna", + "16" => "Dambovita", + "17" => "Dolj", + "18" => "Galati", + "19" => "Gorj", + "20" => "Harghita", + "21" => "Hunedoara", + "22" => "Ialomita", + "23" => "Iasi", + "25" => "Maramures", + "26" => "Mehedinti", + "27" => "Mures", + "28" => "Neamt", + "29" => "Olt", + "30" => "Prahova", + "31" => "Salaj", + "32" => "Satu Mare", + "33" => "Sibiu", + "34" => "Suceava", + "35" => "Teleorman", + "36" => "Timis", + "37" => "Tulcea", + "38" => "Vaslui", + "39" => "Valcea", + "40" => "Vrancea", + "41" => "Calarasi", + "42" => "Giurgiu", + "43" => "Ilfov"), +"RS" => array( + "01" => "Kosovo", + "02" => "Vojvodina"), +"RU" => array( + "01" => "Adygeya, Republic of", + "02" => "Aginsky Buryatsky AO", + "03" => "Gorno-Altay", + "04" => "Altaisky krai", + "05" => "Amur", + "06" => "Arkhangel'sk", + "07" => "Astrakhan'", + "08" => "Bashkortostan", + "09" => "Belgorod", + "10" => "Bryansk", + "11" => "Buryat", + "12" => "Chechnya", + "13" => "Chelyabinsk", + "14" => "Chita", + "15" => "Chukot", + "16" => "Chuvashia", + "17" => "Dagestan", + "18" => "Evenk", + "19" => "Ingush", + "20" => "Irkutsk", + "21" => "Ivanovo", + "22" => "Kabardin-Balkar", + "23" => "Kaliningrad", + "24" => "Kalmyk", + "25" => "Kaluga", + "26" => "Kamchatka", + "27" => "Karachay-Cherkess", + "28" => "Karelia", + "29" => "Kemerovo", + "30" => "Khabarovsk", + "31" => "Khakass", + "32" => "Khanty-Mansiy", + "33" => "Kirov", + "34" => "Komi", + "35" => "Komi-Permyak", + "36" => "Koryak", + "37" => "Kostroma", + "38" => "Krasnodar", + "39" => "Krasnoyarsk", + "40" => "Kurgan", + "41" => "Kursk", + "42" => "Leningrad", + "43" => "Lipetsk", + "44" => "Magadan", + "45" => "Mariy-El", + "46" => "Mordovia", + "47" => "Moskva", + "48" => "Moscow City", + "49" => "Murmansk", + "50" => "Nenets", + "51" => "Nizhegorod", + "52" => "Novgorod", + "53" => "Novosibirsk", + "54" => "Omsk", + "55" => "Orenburg", + "56" => "Orel", + "57" => "Penza", + "58" => "Perm'", + "59" => "Primor'ye", + "60" => "Pskov", + "61" => "Rostov", + "62" => "Ryazan'", + "63" => "Sakha", + "64" => "Sakhalin", + "65" => "Samara", + "66" => "Saint Petersburg City", + "67" => "Saratov", + "68" => "North Ossetia", + "69" => "Smolensk", + "70" => "Stavropol'", + "71" => "Sverdlovsk", + "72" => "Tambovskaya oblast", + "73" => "Tatarstan", + "74" => "Taymyr", + "75" => "Tomsk", + "76" => "Tula", + "77" => "Tver'", + "78" => "Tyumen'", + "79" => "Tuva", + "80" => "Udmurt", + "81" => "Ul'yanovsk", + "82" => "Ust-Orda Buryat", + "83" => "Vladimir", + "84" => "Volgograd", + "85" => "Vologda", + "86" => "Voronezh", + "87" => "Yamal-Nenets", + "88" => "Yaroslavl'", + "89" => "Yevrey", + "90" => "Permskiy Kray", + "91" => "Krasnoyarskiy Kray", + "CI" => "Chechnya Republic"), +"RW" => array( + "01" => "Butare", + "06" => "Gitarama", + "07" => "Kibungo", + "09" => "Kigali", + "11" => "Est", + "12" => "Kigali", + "13" => "Nord", + "14" => "Ouest", + "15" => "Sud"), +"SA" => array( + "02" => "Al Bahah", + "03" => "Al Jawf", + "05" => "Al Madinah", + "06" => "Ash Sharqiyah", + "08" => "Al Qasim", + "09" => "Al Qurayyat", + "10" => "Ar Riyad", + "13" => "Ha'il", + "14" => "Makkah", + "15" => "Al Hudud ash Shamaliyah", + "16" => "Najran", + "17" => "Jizan", + "19" => "Tabuk", + "20" => "Al Jawf"), +"SB" => array( + "03" => "Malaita", + "06" => "Guadalcanal", + "07" => "Isabel", + "08" => "Makira", + "09" => "Temotu", + "10" => "Central", + "11" => "Western", + "12" => "Choiseul", + "13" => "Rennell and Bellona"), +"SC" => array( + "01" => "Anse aux Pins", + "02" => "Anse Boileau", + "03" => "Anse Etoile", + "04" => "Anse Louis", + "05" => "Anse Royale", + "06" => "Baie Lazare", + "07" => "Baie Sainte Anne", + "08" => "Beau Vallon", + "09" => "Bel Air", + "10" => "Bel Ombre", + "11" => "Cascade", + "12" => "Glacis", + "13" => "Grand' Anse", + "14" => "Grand' Anse", + "15" => "La Digue", + "16" => "La Riviere Anglaise", + "17" => "Mont Buxton", + "18" => "Mont Fleuri", + "19" => "Plaisance", + "20" => "Pointe La Rue", + "21" => "Port Glaud", + "22" => "Saint Louis", + "23" => "Takamaka"), +"SD" => array( + "27" => "Al Wusta", + "28" => "Al Istiwa'iyah", + "29" => "Al Khartum", + "30" => "Ash Shamaliyah", + "31" => "Ash Sharqiyah", + "32" => "Bahr al Ghazal", + "33" => "Darfur", + "34" => "Kurdufan", + "35" => "Upper Nile", + "40" => "Al Wahadah State", + "44" => "Central Equatoria State"), +"SE" => array( + "02" => "Blekinge Lan", + "03" => "Gavleborgs Lan", + "05" => "Gotlands Lan", + "06" => "Hallands Lan", + "07" => "Jamtlands Lan", + "08" => "Jonkopings Lan", + "09" => "Kalmar Lan", + "10" => "Dalarnas Lan", + "12" => "Kronobergs Lan", + "14" => "Norrbottens Lan", + "15" => "Orebro Lan", + "16" => "Ostergotlands Lan", + "18" => "Sodermanlands Lan", + "21" => "Uppsala Lan", + "22" => "Varmlands Lan", + "23" => "Vasterbottens Lan", + "24" => "Vasternorrlands Lan", + "25" => "Vastmanlands Lan", + "26" => "Stockholms Lan", + "27" => "Skane Lan", + "28" => "Vastra Gotaland"), +"SH" => array( + "01" => "Ascension", + "02" => "Saint Helena", + "03" => "Tristan da Cunha"), +"SI" => array( + "01" => "Ajdovscina", + "02" => "Beltinci", + "03" => "Bled", + "04" => "Bohinj", + "05" => "Borovnica", + "06" => "Bovec", + "07" => "Brda", + "08" => "Brezice", + "09" => "Brezovica", + "11" => "Celje", + "12" => "Cerklje na Gorenjskem", + "13" => "Cerknica", + "14" => "Cerkno", + "15" => "Crensovci", + "16" => "Crna na Koroskem", + "17" => "Crnomelj", + "19" => "Divaca", + "20" => "Dobrepolje", + "22" => "Dol pri Ljubljani", + "24" => "Dornava", + "25" => "Dravograd", + "26" => "Duplek", + "27" => "Gorenja Vas-Poljane", + "28" => "Gorisnica", + "29" => "Gornja Radgona", + "30" => "Gornji Grad", + "31" => "Gornji Petrovci", + "32" => "Grosuplje", + "34" => "Hrastnik", + "35" => "Hrpelje-Kozina", + "36" => "Idrija", + "37" => "Ig", + "38" => "Ilirska Bistrica", + "39" => "Ivancna Gorica", + "40" => "Izola-Isola", + "42" => "Jursinci", + "44" => "Kanal", + "45" => "Kidricevo", + "46" => "Kobarid", + "47" => "Kobilje", + "49" => "Komen", + "50" => "Koper-Capodistria", + "51" => "Kozje", + "52" => "Kranj", + "53" => "Kranjska Gora", + "54" => "Krsko", + "55" => "Kungota", + "57" => "Lasko", + "61" => "Ljubljana", + "62" => "Ljubno", + "64" => "Logatec", + "66" => "Loski Potok", + "68" => "Lukovica", + "71" => "Medvode", + "72" => "Menges", + "73" => "Metlika", + "74" => "Mezica", + "76" => "Mislinja", + "77" => "Moravce", + "78" => "Moravske Toplice", + "79" => "Mozirje", + "80" => "Murska Sobota", + "81" => "Muta", + "82" => "Naklo", + "83" => "Nazarje", + "84" => "Nova Gorica", + "86" => "Odranci", + "87" => "Ormoz", + "88" => "Osilnica", + "89" => "Pesnica", + "91" => "Pivka", + "92" => "Podcetrtek", + "94" => "Postojna", + "97" => "Puconci", + "98" => "Racam", + "99" => "Radece", + "A1" => "Radenci", + "A2" => "Radlje ob Dravi", + "A3" => "Radovljica", + "A6" => "Rogasovci", + "A7" => "Rogaska Slatina", + "A8" => "Rogatec", + "B1" => "Semic", + "B2" => "Sencur", + "B3" => "Sentilj", + "B4" => "Sentjernej", + "B6" => "Sevnica", + "B7" => "Sezana", + "B8" => "Skocjan", + "B9" => "Skofja Loka", + "C1" => "Skofljica", + "C2" => "Slovenj Gradec", + "C4" => "Slovenske Konjice", + "C5" => "Smarje pri Jelsah", + "C6" => "Smartno ob Paki", + "C7" => "Sostanj", + "C8" => "Starse", + "C9" => "Store", + "D1" => "Sveti Jurij", + "D2" => "Tolmin", + "D3" => "Trbovlje", + "D4" => "Trebnje", + "D5" => "Trzic", + "D6" => "Turnisce", + "D7" => "Velenje", + "D8" => "Velike Lasce", + "E1" => "Vipava", + "E2" => "Vitanje", + "E3" => "Vodice", + "E5" => "Vrhnika", + "E6" => "Vuzenica", + "E7" => "Zagorje ob Savi", + "E9" => "Zavrc", + "F1" => "Zelezniki", + "F2" => "Ziri", + "F3" => "Zrece", + "G4" => "Dobrova-Horjul-Polhov Gradec", + "G7" => "Domzale", + "H4" => "Jesenice", + "H6" => "Kamnik", + "H7" => "Kocevje", + "I2" => "Kuzma", + "I3" => "Lenart", + "I5" => "Litija", + "I6" => "Ljutomer", + "I7" => "Loska Dolina", + "I9" => "Luce", + "J1" => "Majsperk", + "J2" => "Maribor", + "J5" => "Miren-Kostanjevica", + "J7" => "Novo Mesto", + "J9" => "Piran", + "K5" => "Preddvor", + "K7" => "Ptuj", + "L1" => "Ribnica", + "L3" => "Ruse", + "L7" => "Sentjur pri Celju", + "L8" => "Slovenska Bistrica", + "N2" => "Videm", + "N3" => "Vojnik", + "N5" => "Zalec"), +"SK" => array( + "01" => "Banska Bystrica", + "02" => "Bratislava", + "03" => "Kosice", + "04" => "Nitra", + "05" => "Presov", + "06" => "Trencin", + "07" => "Trnava", + "08" => "Zilina"), +"SL" => array( + "01" => "Eastern", + "02" => "Northern", + "03" => "Southern", + "04" => "Western Area"), +"SM" => array( + "01" => "Acquaviva", + "02" => "Chiesanuova", + "03" => "Domagnano", + "04" => "Faetano", + "05" => "Fiorentino", + "06" => "Borgo Maggiore", + "07" => "San Marino", + "08" => "Monte Giardino", + "09" => "Serravalle"), +"SN" => array( + "01" => "Dakar", + "03" => "Diourbel", + "05" => "Tambacounda", + "07" => "Thies", + "09" => "Fatick", + "10" => "Kaolack", + "11" => "Kolda", + "12" => "Ziguinchor", + "13" => "Louga", + "14" => "Saint-Louis", + "15" => "Matam"), +"SO" => array( + "01" => "Bakool", + "02" => "Banaadir", + "03" => "Bari", + "04" => "Bay", + "05" => "Galguduud", + "06" => "Gedo", + "07" => "Hiiraan", + "08" => "Jubbada Dhexe", + "09" => "Jubbada Hoose", + "10" => "Mudug", + "11" => "Nugaal", + "12" => "Sanaag", + "13" => "Shabeellaha Dhexe", + "14" => "Shabeellaha Hoose", + "16" => "Woqooyi Galbeed", + "18" => "Nugaal", + "19" => "Togdheer", + "20" => "Woqooyi Galbeed", + "21" => "Awdal", + "22" => "Sool"), +"SR" => array( + "10" => "Brokopondo", + "11" => "Commewijne", + "12" => "Coronie", + "13" => "Marowijne", + "14" => "Nickerie", + "15" => "Para", + "16" => "Paramaribo", + "17" => "Saramacca", + "18" => "Sipaliwini", + "19" => "Wanica"), +"ST" => array( + "01" => "Principe", + "02" => "Sao Tome"), +"SV" => array( + "01" => "Ahuachapan", + "02" => "Cabanas", + "03" => "Chalatenango", + "04" => "Cuscatlan", + "05" => "La Libertad", + "06" => "La Paz", + "07" => "La Union", + "08" => "Morazan", + "09" => "San Miguel", + "10" => "San Salvador", + "11" => "Santa Ana", + "12" => "San Vicente", + "13" => "Sonsonate", + "14" => "Usulutan"), +"SY" => array( + "01" => "Al Hasakah", + "02" => "Al Ladhiqiyah", + "03" => "Al Qunaytirah", + "04" => "Ar Raqqah", + "05" => "As Suwayda'", + "06" => "Dar", + "07" => "Dayr az Zawr", + "08" => "Rif Dimashq", + "09" => "Halab", + "10" => "Hamah", + "11" => "Hims", + "12" => "Idlib", + "13" => "Dimashq", + "14" => "Tartus"), +"SZ" => array( + "01" => "Hhohho", + "02" => "Lubombo", + "03" => "Manzini", + "04" => "Shiselweni", + "05" => "Praslin"), +"TD" => array( + "01" => "Batha", + "02" => "Biltine", + "03" => "Borkou-Ennedi-Tibesti", + "04" => "Chari-Baguirmi", + "05" => "Guera", + "06" => "Kanem", + "07" => "Lac", + "08" => "Logone Occidental", + "09" => "Logone Oriental", + "10" => "Mayo-Kebbi", + "11" => "Moyen-Chari", + "12" => "Ouaddai", + "13" => "Salamat", + "14" => "Tandjile"), +"TG" => array( + "22" => "Centrale", + "23" => "Kara", + "24" => "Maritime", + "25" => "Plateaux", + "26" => "Savanes"), +"TH" => array( + "01" => "Mae Hong Son", + "02" => "Chiang Mai", + "03" => "Chiang Rai", + "04" => "Nan", + "05" => "Lamphun", + "06" => "Lampang", + "07" => "Phrae", + "08" => "Tak", + "09" => "Sukhothai", + "10" => "Uttaradit", + "11" => "Kamphaeng Phet", + "12" => "Phitsanulok", + "13" => "Phichit", + "14" => "Phetchabun", + "15" => "Uthai Thani", + "16" => "Nakhon Sawan", + "17" => "Nong Khai", + "18" => "Loei", + "20" => "Sakon Nakhon", + "21" => "Nakhon Phanom", + "22" => "Khon Kaen", + "23" => "Kalasin", + "24" => "Maha Sarakham", + "25" => "Roi Et", + "26" => "Chaiyaphum", + "27" => "Nakhon Ratchasima", + "28" => "Buriram", + "29" => "Surin", + "30" => "Sisaket", + "31" => "Narathiwat", + "32" => "Chai Nat", + "33" => "Sing Buri", + "34" => "Lop Buri", + "35" => "Ang Thong", + "36" => "Phra Nakhon Si Ayutthaya", + "37" => "Saraburi", + "38" => "Nonthaburi", + "39" => "Pathum Thani", + "40" => "Krung Thep", + "41" => "Phayao", + "42" => "Samut Prakan", + "43" => "Nakhon Nayok", + "44" => "Chachoengsao", + "45" => "Prachin Buri", + "46" => "Chon Buri", + "47" => "Rayong", + "48" => "Chanthaburi", + "49" => "Trat", + "50" => "Kanchanaburi", + "51" => "Suphan Buri", + "52" => "Ratchaburi", + "53" => "Nakhon Pathom", + "54" => "Samut Songkhram", + "55" => "Samut Sakhon", + "56" => "Phetchaburi", + "57" => "Prachuap Khiri Khan", + "58" => "Chumphon", + "59" => "Ranong", + "60" => "Surat Thani", + "61" => "Phangnga", + "62" => "Phuket", + "63" => "Krabi", + "64" => "Nakhon Si Thammarat", + "65" => "Trang", + "66" => "Phatthalung", + "67" => "Satun", + "68" => "Songkhla", + "69" => "Pattani", + "70" => "Yala", + "71" => "Ubon Ratchathani", + "72" => "Yasothon", + "73" => "Nakhon Phanom", + "75" => "Ubon Ratchathani", + "76" => "Udon Thani", + "77" => "Amnat Charoen", + "78" => "Mukdahan", + "79" => "Nong Bua Lamphu", + "80" => "Sa Kaeo"), +"TJ" => array( + "01" => "Kuhistoni Badakhshon", + "02" => "Khatlon", + "03" => "Sughd"), +"TM" => array( + "01" => "Ahal", + "02" => "Balkan", + "03" => "Dashoguz", + "04" => "Lebap", + "05" => "Mary"), +"TN" => array( + "02" => "Kasserine", + "03" => "Kairouan", + "06" => "Jendouba", + "10" => "Qafsah", + "14" => "El Kef", + "15" => "Al Mahdia", + "16" => "Al Munastir", + "17" => "Bajah", + "18" => "Bizerte", + "19" => "Nabeul", + "22" => "Siliana", + "23" => "Sousse", + "27" => "Ben Arous", + "28" => "Madanin", + "29" => "Gabes", + "31" => "Kebili", + "32" => "Sfax", + "33" => "Sidi Bou Zid", + "34" => "Tataouine", + "35" => "Tozeur", + "36" => "Tunis", + "37" => "Zaghouan", + "38" => "Aiana", + "39" => "Manouba"), +"TO" => array( + "01" => "Ha", + "02" => "Tongatapu", + "03" => "Vava"), +"TR" => array( + "02" => "Adiyaman", + "03" => "Afyonkarahisar", + "04" => "Agri", + "05" => "Amasya", + "07" => "Antalya", + "08" => "Artvin", + "09" => "Aydin", + "10" => "Balikesir", + "11" => "Bilecik", + "12" => "Bingol", + "13" => "Bitlis", + "14" => "Bolu", + "15" => "Burdur", + "16" => "Bursa", + "17" => "Canakkale", + "19" => "Corum", + "20" => "Denizli", + "21" => "Diyarbakir", + "22" => "Edirne", + "23" => "Elazig", + "24" => "Erzincan", + "25" => "Erzurum", + "26" => "Eskisehir", + "28" => "Giresun", + "31" => "Hatay", + "32" => "Mersin", + "33" => "Isparta", + "34" => "Istanbul", + "35" => "Izmir", + "37" => "Kastamonu", + "38" => "Kayseri", + "39" => "Kirklareli", + "40" => "Kirsehir", + "41" => "Kocaeli", + "43" => "Kutahya", + "44" => "Malatya", + "45" => "Manisa", + "46" => "Kahramanmaras", + "48" => "Mugla", + "49" => "Mus", + "50" => "Nevsehir", + "52" => "Ordu", + "53" => "Rize", + "54" => "Sakarya", + "55" => "Samsun", + "57" => "Sinop", + "58" => "Sivas", + "59" => "Tekirdag", + "60" => "Tokat", + "61" => "Trabzon", + "62" => "Tunceli", + "63" => "Sanliurfa", + "64" => "Usak", + "65" => "Van", + "66" => "Yozgat", + "68" => "Ankara", + "69" => "Gumushane", + "70" => "Hakkari", + "71" => "Konya", + "72" => "Mardin", + "73" => "Nigde", + "74" => "Siirt", + "75" => "Aksaray", + "76" => "Batman", + "77" => "Bayburt", + "78" => "Karaman", + "79" => "Kirikkale", + "80" => "Sirnak", + "81" => "Adana", + "82" => "Cankiri", + "83" => "Gaziantep", + "84" => "Kars", + "85" => "Zonguldak", + "86" => "Ardahan", + "87" => "Bartin", + "88" => "Igdir", + "89" => "Karabuk", + "90" => "Kilis", + "91" => "Osmaniye", + "92" => "Yalova", + "93" => "Duzce"), +"TT" => array( + "01" => "Arima", + "02" => "Caroni", + "03" => "Mayaro", + "04" => "Nariva", + "05" => "Port-of-Spain", + "06" => "Saint Andrew", + "07" => "Saint David", + "08" => "Saint George", + "09" => "Saint Patrick", + "10" => "San Fernando", + "11" => "Tobago", + "12" => "Victoria"), +"TW" => array( + "01" => "Fu-chien", + "02" => "Kao-hsiung", + "03" => "T'ai-pei", + "04" => "T'ai-wan"), +"TZ" => array( + "02" => "Pwani", + "03" => "Dodoma", + "04" => "Iringa", + "05" => "Kigoma", + "06" => "Kilimanjaro", + "07" => "Lindi", + "08" => "Mara", + "09" => "Mbeya", + "10" => "Morogoro", + "11" => "Mtwara", + "12" => "Mwanza", + "13" => "Pemba North", + "14" => "Ruvuma", + "15" => "Shinyanga", + "16" => "Singida", + "17" => "Tabora", + "18" => "Tanga", + "19" => "Kagera", + "20" => "Pemba South", + "21" => "Zanzibar Central", + "22" => "Zanzibar North", + "23" => "Dar es Salaam", + "24" => "Rukwa", + "25" => "Zanzibar Urban", + "26" => "Arusha", + "27" => "Manyara"), +"UA" => array( + "01" => "Cherkas'ka Oblast'", + "02" => "Chernihivs'ka Oblast'", + "03" => "Chernivets'ka Oblast'", + "04" => "Dnipropetrovs'ka Oblast'", + "05" => "Donets'ka Oblast'", + "06" => "Ivano-Frankivs'ka Oblast'", + "07" => "Kharkivs'ka Oblast'", + "08" => "Khersons'ka Oblast'", + "09" => "Khmel'nyts'ka Oblast'", + "10" => "Kirovohrads'ka Oblast'", + "11" => "Krym", + "12" => "Kyyiv", + "13" => "Kyyivs'ka Oblast'", + "14" => "Luhans'ka Oblast'", + "15" => "L'vivs'ka Oblast'", + "16" => "Mykolayivs'ka Oblast'", + "17" => "Odes'ka Oblast'", + "18" => "Poltavs'ka Oblast'", + "19" => "Rivnens'ka Oblast'", + "20" => "Sevastopol'", + "21" => "Sums'ka Oblast'", + "22" => "Ternopil's'ka Oblast'", + "23" => "Vinnyts'ka Oblast'", + "24" => "Volyns'ka Oblast'", + "25" => "Zakarpats'ka Oblast'", + "26" => "Zaporiz'ka Oblast'", + "27" => "Zhytomyrs'ka Oblast'"), +"UG" => array( + "26" => "Apac", + "28" => "Bundibugyo", + "29" => "Bushenyi", + "30" => "Gulu", + "31" => "Hoima", + "33" => "Jinja", + "36" => "Kalangala", + "37" => "Kampala", + "38" => "Kamuli", + "39" => "Kapchorwa", + "40" => "Kasese", + "41" => "Kibale", + "42" => "Kiboga", + "43" => "Kisoro", + "45" => "Kotido", + "46" => "Kumi", + "47" => "Lira", + "50" => "Masindi", + "52" => "Mbarara", + "56" => "Mubende", + "58" => "Nebbi", + "59" => "Ntungamo", + "60" => "Pallisa", + "61" => "Rakai", + "65" => "Adjumani", + "66" => "Bugiri", + "67" => "Busia", + "69" => "Katakwi", + "70" => "Luwero", + "71" => "Masaka", + "72" => "Moyo", + "73" => "Nakasongola", + "74" => "Sembabule", + "76" => "Tororo", + "77" => "Arua", + "78" => "Iganga", + "79" => "Kabarole", + "80" => "Kaberamaido", + "81" => "Kamwenge", + "82" => "Kanungu", + "83" => "Kayunga", + "84" => "Kitgum", + "85" => "Kyenjojo", + "86" => "Mayuge", + "87" => "Mbale", + "88" => "Moroto", + "89" => "Mpigi", + "90" => "Mukono", + "91" => "Nakapiripirit", + "92" => "Pader", + "93" => "Rukungiri", + "94" => "Sironko", + "95" => "Soroti", + "96" => "Wakiso", + "97" => "Yumbe"), +"US" => array( + "AA" => "Armed Forces Americas", + "AE" => "Armed Forces Europe, Middle East, & Canada", + "AK" => "Alaska", + "AL" => "Alabama", + "AP" => "Armed Forces Pacific", + "AR" => "Arkansas", + "AS" => "American Samoa", + "AZ" => "Arizona", + "CA" => "California", + "CO" => "Colorado", + "CT" => "Connecticut", + "DC" => "District of Columbia", + "DE" => "Delaware", + "FL" => "Florida", + "FM" => "Federated States of Micronesia", + "GA" => "Georgia", + "GU" => "Guam", + "HI" => "Hawaii", + "IA" => "Iowa", + "ID" => "Idaho", + "IL" => "Illinois", + "IN" => "Indiana", + "KS" => "Kansas", + "KY" => "Kentucky", + "LA" => "Louisiana", + "MA" => "Massachusetts", + "MD" => "Maryland", + "ME" => "Maine", + "MH" => "Marshall Islands", + "MI" => "Michigan", + "MN" => "Minnesota", + "MO" => "Missouri", + "MP" => "Northern Mariana Islands", + "MS" => "Mississippi", + "MT" => "Montana", + "NC" => "North Carolina", + "ND" => "North Dakota", + "NE" => "Nebraska", + "NH" => "New Hampshire", + "NJ" => "New Jersey", + "NM" => "New Mexico", + "NV" => "Nevada", + "NY" => "New York", + "OH" => "Ohio", + "OK" => "Oklahoma", + "OR" => "Oregon", + "PA" => "Pennsylvania", + "PR" => "Puerto Rico", + "PW" => "Palau", + "RI" => "Rhode Island", + "SC" => "South Carolina", + "SD" => "South Dakota", + "TN" => "Tennessee", + "TX" => "Texas", + "UT" => "Utah", + "VA" => "Virginia", + "VI" => "Virgin Islands", + "VT" => "Vermont", + "WA" => "Washington", + "WI" => "Wisconsin", + "WV" => "West Virginia", + "WY" => "Wyoming"), +"UY" => array( + "01" => "Artigas", + "02" => "Canelones", + "03" => "Cerro Largo", + "04" => "Colonia", + "05" => "Durazno", + "06" => "Flores", + "07" => "Florida", + "08" => "Lavalleja", + "09" => "Maldonado", + "10" => "Montevideo", + "11" => "Paysandu", + "12" => "Rio Negro", + "13" => "Rivera", + "14" => "Rocha", + "15" => "Salto", + "16" => "San Jose", + "17" => "Soriano", + "18" => "Tacuarembo", + "19" => "Treinta y Tres"), +"UZ" => array( + "01" => "Andijon", + "02" => "Bukhoro", + "03" => "Farghona", + "04" => "Jizzakh", + "05" => "Khorazm", + "06" => "Namangan", + "07" => "Nawoiy", + "08" => "Qashqadaryo", + "09" => "Qoraqalpoghiston", + "10" => "Samarqand", + "11" => "Sirdaryo", + "12" => "Surkhondaryo", + "13" => "Toshkent", + "14" => "Toshkent"), +"VC" => array( + "01" => "Charlotte", + "02" => "Saint Andrew", + "03" => "Saint David", + "04" => "Saint George", + "05" => "Saint Patrick", + "06" => "Grenadines"), +"VE" => array( + "01" => "Amazonas", + "02" => "Anzoategui", + "03" => "Apure", + "04" => "Aragua", + "05" => "Barinas", + "06" => "Bolivar", + "07" => "Carabobo", + "08" => "Cojedes", + "09" => "Delta Amacuro", + "11" => "Falcon", + "12" => "Guarico", + "13" => "Lara", + "14" => "Merida", + "15" => "Miranda", + "16" => "Monagas", + "17" => "Nueva Esparta", + "18" => "Portuguesa", + "19" => "Sucre", + "20" => "Tachira", + "21" => "Trujillo", + "22" => "Yaracuy", + "23" => "Zulia", + "24" => "Dependencias Federales", + "25" => "Distrito Federal", + "26" => "Vargas"), +"VN" => array( + "01" => "An Giang", + "03" => "Ben Tre", + "05" => "Cao Bang", + "09" => "Dong Thap", + "13" => "Hai Phong", + "20" => "Ho Chi Minh", + "21" => "Kien Giang", + "23" => "Lam Dong", + "24" => "Long An", + "30" => "Quang Ninh", + "32" => "Son La", + "33" => "Tay Ninh", + "34" => "Thanh Hoa", + "35" => "Thai Binh", + "37" => "Tien Giang", + "39" => "Lang Son", + "43" => "An Giang", + "44" => "Dac Lac", + "45" => "Dong Nai", + "46" => "Dong Thap", + "47" => "Kien Giang", + "49" => "Song Be", + "50" => "Vinh Phu", + "51" => "Ha Noi", + "52" => "Ho Chi Minh", + "53" => "Ba Ria-Vung Tau", + "54" => "Binh Dinh", + "55" => "Binh Thuan", + "58" => "Ha Giang", + "59" => "Ha Tay", + "60" => "Ha Tinh", + "61" => "Hoa Binh", + "62" => "Khanh Hoa", + "63" => "Kon Tum", + "64" => "Quang Tri", + "65" => "Nam Ha", + "66" => "Nghe An", + "67" => "Ninh Binh", + "68" => "Ninh Thuan", + "69" => "Phu Yen", + "70" => "Quang Binh", + "71" => "Quang Ngai", + "72" => "Quang Tri", + "73" => "Soc Trang", + "74" => "Thua Thien", + "75" => "Tra Vinh", + "76" => "Tuyen Quang", + "77" => "Vinh Long", + "78" => "Da Nang", + "79" => "Hai Duong", + "80" => "Ha Nam", + "81" => "Hung Yen", + "82" => "Nam Dinh", + "83" => "Phu Tho", + "84" => "Quang Nam", + "85" => "Thai Nguyen", + "86" => "Vinh Puc Province", + "87" => "Can Tho", + "88" => "Dak Lak", + "89" => "Lai Chau", + "90" => "Lao Cai", + "91" => "Dak Nong", + "92" => "Dien Bien", + "93" => "Hau Giang"), +"VU" => array( + "05" => "Ambrym", + "06" => "Aoba", + "07" => "Torba", + "08" => "Efate", + "09" => "Epi", + "10" => "Malakula", + "11" => "Paama", + "12" => "Pentecote", + "13" => "Sanma", + "14" => "Shepherd", + "15" => "Tafea", + "16" => "Malampa", + "17" => "Penama", + "18" => "Shefa"), +"WS" => array( + "02" => "Aiga-i-le-Tai", + "03" => "Atua", + "04" => "Fa", + "05" => "Gaga", + "06" => "Va", + "07" => "Gagaifomauga", + "08" => "Palauli", + "09" => "Satupa", + "10" => "Tuamasaga", + "11" => "Vaisigano"), +"YE" => array( + "01" => "Abyan", + "02" => "Adan", + "03" => "Al Mahrah", + "04" => "Hadramawt", + "05" => "Shabwah", + "06" => "Al Ghaydah", + "08" => "Al Hudaydah", + "10" => "Al Mahwit", + "11" => "Dhamar", + "14" => "Ma'rib", + "15" => "Sa", + "16" => "San", + "20" => "Al Bayda'", + "21" => "Al Jawf", + "22" => "Hajjah", + "23" => "Ibb", + "24" => "Lahij", + "25" => "Ta"), +"ZA" => array( + "01" => "North-Western Province", + "02" => "KwaZulu-Natal", + "03" => "Free State", + "05" => "Eastern Cape", + "06" => "Gauteng", + "07" => "Mpumalanga", + "08" => "Northern Cape", + "09" => "Limpopo", + "10" => "North-West", + "11" => "Western Cape"), +"ZM" => array( + "01" => "Western", + "02" => "Central", + "03" => "Eastern", + "04" => "Luapula", + "05" => "Northern", + "06" => "North-Western", + "07" => "Southern", + "08" => "Copperbelt", + "09" => "Lusaka"), +"ZW" => array( + "01" => "Manicaland", + "02" => "Midlands", + "03" => "Mashonaland Central", + "04" => "Mashonaland East", + "05" => "Mashonaland West", + "06" => "Matabeleland North", + "07" => "Matabeleland South", + "08" => "Masvingo", + "09" => "Bulawayo", + "10" => "Harare") +); +?> diff --git a/tools/index.php b/tools/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/tools/index.php @@ -0,0 +1,11 @@ + + * @copyright 2002 Douglas Crockford (jsmin.c) + * @copyright 2008 Ryan Grove (PHP port) + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 1.1.1 (2008-03-02) + * @link http://code.google.com/p/jsmin-php?controller= + */ + +class JSMin { + const ORD_LF = 10; + const ORD_SPACE = 32; + + protected $a = ''; + protected $b = ''; + protected $input = ''; + protected $inputIndex = 0; + protected $inputLength = 0; + protected $lookAhead = null; + protected $output = ''; + + // -- Public Static Methods -------------------------------------------------- + + public static function minify($js) { + $jsmin = new JSMin($js); + return $jsmin->min(); + } + + // -- Public Instance Methods ------------------------------------------------ + + public function __construct($input) { + $this->input = str_replace("\r\n", "\n", $input); + $this->inputLength = strlen($this->input); + } + + // -- Protected Instance Methods --------------------------------------------- + + protected function action($d) { + switch($d) { + case 1: + $this->output .= $this->a; + + case 2: + $this->a = $this->b; + + if ($this->a === "'" || $this->a === '"') { + for (;;) { + $this->output .= $this->a; + $this->a = $this->get(); + + if ($this->a === $this->b) { + break; + } + + if (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated string literal.'); + } + + if ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } + } + } + + case 3: + $this->b = $this->next(); + + if ($this->b === '/' && ( + $this->a === '(' || $this->a === ',' || $this->a === '=' || + $this->a === ':' || $this->a === '[' || $this->a === '!' || + $this->a === '&' || $this->a === '|' || $this->a === '?')) { + + $this->output .= $this->a . $this->b; + + for (;;) { + $this->a = $this->get(); + + if ($this->a === '/') { + break; + } elseif ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } elseif (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated regular expression '. + 'literal.'); + } + + $this->output .= $this->a; + } + + $this->b = $this->next(); + } + } + } + + protected function get() { + $c = $this->lookAhead; + $this->lookAhead = null; + + if ($c === null) { + if ($this->inputIndex < $this->inputLength) { + $c = substr($this->input, $this->inputIndex, 1); + $this->inputIndex += 1; + } else { + $c = null; + } + } + + if ($c === "\r") { + return "\n"; + } + + if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { + return $c; + } + + return ' '; + } + + protected function isAlphaNum($c) { + return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; + } + + protected function min() { + $this->a = "\n"; + $this->action(3); + + while ($this->a !== null) { + switch ($this->a) { + case ' ': + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } else { + $this->action(2); + } + break; + + case "\n": + switch ($this->b) { + case '{': + case '[': + case '(': + case '+': + case '-': + $this->action(1); + break; + + case ' ': + $this->action(3); + break; + + default: + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } + else { + $this->action(2); + } + } + break; + + default: + switch ($this->b) { + case ' ': + if ($this->isAlphaNum($this->a)) { + $this->action(1); + break; + } + + $this->action(3); + break; + + case "\n": + switch ($this->a) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case "'": + $this->action(1); + break; + + default: + if ($this->isAlphaNum($this->a)) { + $this->action(1); + } + else { + $this->action(3); + } + } + break; + + default: + $this->action(1); + break; + } + } + } + + return $this->output; + } + + protected function next() { + $c = $this->get(); + + if ($c === '/') { + switch($this->peek()) { + case '/': + for (;;) { + $c = $this->get(); + + if (ord($c) <= self::ORD_LF) { + return $c; + } + } + + case '*': + $this->get(); + + for (;;) { + switch($this->get()) { + case '*': + if ($this->peek() === '/') { + $this->get(); + return ' '; + } + break; + + case null: + throw new JSMinException('Unterminated comment.'); + } + } + + default: + return $c; + } + } + + return $c; + } + + protected function peek() { + $this->lookAhead = $this->get(); + return $this->lookAhead; + } +} + +// -- Exceptions --------------------------------------------------------------- +class JSMinException extends Exception {} +?> diff --git a/tools/json/json.php b/tools/json/json.php new file mode 100644 index 000000000..811e858f0 --- /dev/null +++ b/tools/json/json.php @@ -0,0 +1,804 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: json.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function __construct($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} \ No newline at end of file diff --git a/tools/minify_html/minify_html.class.php b/tools/minify_html/minify_html.class.php new file mode 100755 index 000000000..e7b06c972 --- /dev/null +++ b/tools/minify_html/minify_html.class.php @@ -0,0 +1,220 @@ + + */ +class Minify_HTML { + + /** + * Defines which class to call as part of callbacks, change this + * if you extend Minify_HTML + * @var string + */ + protected static $className = 'Minify_HTML'; + + /** + * "Minify" an HTML page + * + * @param string $html + * + * @param array $options + * + * 'cssMinifier' : (optional) callback function to process content of STYLE + * elements. + * + * 'jsMinifier' : (optional) callback function to process content of SCRIPT + * elements. Note: the type attribute is ignored. + * + * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If + * unset, minify will sniff for an XHTML doctype. + * + * @return string + */ + public static function minify($html, $options = array()) { + + if (isset($options['cssMinifier'])) { + self::$_cssMinifier = $options['cssMinifier']; + } + if (isset($options['jsMinifier'])) { + self::$_jsMinifier = $options['jsMinifier']; + } + + $html = str_replace("\r\n", "\n", trim($html)); + + self::$_isXhtml = ( + isset($options['xhtml']) + ? (bool)$options['xhtml'] + : (false !== strpos($html, ']*?>)([\\s\\S]*?)<\\/script>\\s*/i' + ,array(self::$className, '_removeScriptCB') + ,$html); + + // replace STYLEs (and minify) with placeholders + $html = preg_replace_callback( + '/\\s*(]*?>)([\\s\\S]*?)<\\/style>\\s*/i' + ,array(self::$className, '_removeStyleCB') + ,$html); + + // remove HTML comments (not containing IE conditional comments). + $html = preg_replace_callback( + '//' + ,array(self::$className, '_commentCB') + ,$html); + + // replace PREs with placeholders + $html = preg_replace_callback('/\\s*(]*?>[\\s\\S]*?<\\/pre>)\\s*/i' + ,array(self::$className, '_removePreCB') + , $html); + + // replace TEXTAREAs with placeholders + $html = preg_replace_callback( + '/\\s*(]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' + ,array(self::$className, '_removeTaCB') + , $html); + + // trim each line. + // @todo take into account attribute values that span multiple lines. + $html = preg_replace('/^\\s+|\\s+$/m', '', $html); + + // remove ws around block/undisplayed elements + $html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' + .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' + .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' + .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' + .'|ul)\\b[^>]*>)/i', '$1', $html); + + // remove ws outside of all elements + $html = preg_replace_callback( + '/>([^<]+)]+>)/i', "$1\n$2", $html); + + // fill placeholders + $html = str_replace( + array_keys(self::$_placeholders) + ,array_values(self::$_placeholders) + ,$html + ); + self::$_placeholders = array(); + + self::$_cssMinifier = self::$_jsMinifier = null; + return $html; + } + + protected static function _commentCB($m) + { + return (0 === strpos($m[1], '[') || false !== strpos($m[1], '' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<'; + } + + protected static function _removePreCB($m) + { + return self::_reservePlace($m[1]); + } + + protected static function _removeTaCB($m) + { + return self::_reservePlace($m[1]); + } + + protected static function _removeStyleCB($m) + { + $openStyle = $m[1]; + $css = $m[2]; + // remove HTML comments + $css = preg_replace('/(?:^\\s*\\s*$)/', '', $css); + + // remove CDATA section markers + $css = self::_removeCdata($css); + + // minify + $minifier = self::$_cssMinifier + ? self::$_cssMinifier + : 'trim'; + $css = call_user_func($minifier, $css); + + return self::_reservePlace(self::_needsCdata($css) + ? "{$openStyle}/**/" + : "{$openStyle}{$css}" + ); + } + + protected static function _removeScriptCB($m) + { + $openScript = $m[1]; + $js = $m[2]; + + // remove HTML comments (and ending "//" if present) + $js = preg_replace('/(?:^\\s*\\s*$)/', '', $js); + + // remove CDATA section markers + $js = self::_removeCdata($js); + + // minify + $minifier = self::$_jsMinifier + ? self::$_jsMinifier + : 'trim'; + $js = call_user_func($minifier, $js); + + return self::_reservePlace(self::_needsCdata($js) + ? "{$openScript}/**/" + : "{$openScript}{$js}" + ); + } + + + protected static function _removeCdata($str) + { + return (false !== strpos($str, ''), '', $str) + : $str; + } + + protected static function _needsCdata($str) + { + return (self::$_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str)); + } +} + diff --git a/tools/pclzip/pclzip.lib.php b/tools/pclzip/pclzip.lib.php new file mode 100644 index 000000000..4bf05a523 --- /dev/null +++ b/tools/pclzip/pclzip.lib.php @@ -0,0 +1,5694 @@ +zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + if($last == 'm') + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + if($last == 'k') + $v_memory_limit = $v_memory_limit*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + +?> diff --git a/tools/pear/PEAR.php b/tools/pear/PEAR.php new file mode 100644 index 000000000..fad7d23e2 --- /dev/null +++ b/tools/pear/PEAR.php @@ -0,0 +1,1410 @@ + + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Greg Beaver + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: PEAR.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/PEAR + * @since File available since Release 0.1 + */ + +/* + * If the is already loaded (some hosts do that), don't load it again. + */ +// as we need PEAR, PEAR_Exception and PEAR_Error, we have to check their existence separately +if (!class_exists('PEAR', false)) +{ + + + + /**#@+ + * ERROR constants + */ + define('PEAR_ERROR_RETURN', 1); + define('PEAR_ERROR_PRINT', 2); + define('PEAR_ERROR_TRIGGER', 4); + define('PEAR_ERROR_DIE', 8); + define('PEAR_ERROR_CALLBACK', 16); + + /** + * WARNING: obsolete + * @deprecated + */ + define('PEAR_ERROR_EXCEPTION', 32); + /**#@-*/ + define('PEAR_ZE2', (function_exists('version_compare') && + version_compare(zend_version(), "2-dev", "ge"))); + + if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); + } else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption + } + + // instant backwards compatibility + if (!defined('PATH_SEPARATOR')) { + if (OS_WINDOWS) { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } + } + + $GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; + $GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; + $GLOBALS['_PEAR_destructor_object_list'] = array(); + $GLOBALS['_PEAR_shutdown_funcs'] = array(); + $GLOBALS['_PEAR_error_handler_stack'] = array(); + + @ini_set('track_errors', true); + + /** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Greg Beaver + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.4.9 + * @link http://pear.php.net/package/PEAR + * @see PEAR_Error + * @since Class available since PHP 4.0.2 + * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear + */ + class PEAR + { + // {{{ properties + + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + // }}} + + // {{{ constructor + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function PEAR($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + if ($error_class !== null) { + $this->_error_class = $error_class; + } + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + // }}} + // {{{ destructor + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + // }}} + // {{{ getStaticProperty() + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @access public + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &getStaticProperty($class, $var) + { + static $properties; + return $properties[$class][$var]; + } + + // }}} + // {{{ registerShutdownFunc() + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @access public + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * @return void + */ + function registerShutdownFunc($func, $args = array()) + { + // if we are called statically, there is a potential + // that no shutdown func is registered. Bug #6445 + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + // }}} + // {{{ isError() + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * @access public + * @return bool true if parameter is an error + */ + function isError($data, $code = null) + { + if (is_a($data, 'PEAR_Error')) { + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } else { + return $data->getCode() == $code; + } + } + return false; + } + + // }}} + // {{{ setErrorHandling() + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + + function setErrorHandling($mode = null, $options = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $setmode = &$this->_default_error_mode; + $setoptions = &$this->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + // }}} + // {{{ expectError() + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return sizeof($this->_expected_errors); + } + + // }}} + // {{{ popExpect() + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + // }}} + // {{{ _checkDelExpect() + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + + foreach ($this->_expected_errors AS $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == sizeof($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + return $deleted; + } + + // }}} + // {{{ delExpect() + + /** + * This method deletes all occurences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + + if ((is_array($error_code) && (0 != sizeof($error_code)))) { + // $error_code is a non-empty array here; + // we walk through it trying to unset all + // values + foreach($error_code as $key => $error) { + if ($this->_checkDelExpect($error)) { + $deleted = true; + } else { + $deleted = false; + } + } + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } else { + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + } else { + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + } + + // }}} + // {{{ raiseError() + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @access public + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + function &raiseError($message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp))) { + $mode = PEAR_ERROR_RETURN; + } + } + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if (isset($this) && isset($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif (isset($this) && isset($this->_error_class)) { + $ec = $this->_error_class; + } else { + $ec = 'PEAR_Error'; + } + if ($skipmsg) { + $a = new $ec($code, $mode, $options, $userinfo); + return $a; + } else { + $a = new $ec($message, $code, $mode, $options, $userinfo); + return $a; + } + } + + // }}} + // {{{ throwError() + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param string $message + * + */ + function &throwError($message = null, + $code = null, + $userinfo = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $a = &$this->raiseError($message, $code, null, null, $userinfo); + return $a; + } else { + $a = &PEAR::raiseError($message, $code, null, null, $userinfo); + return $a; + } + } + + // }}} + function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + // {{{ pushErrorHandling() + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + function pushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if (isset($this) && is_a($this, 'PEAR')) { + $def_mode = &$this->_default_error_mode; + $def_options = &$this->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + // }}} + // {{{ popErrorHandling() + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + function popErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + // }}} + // {{{ loadExtension() + + /** + * OS independant PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + function loadExtension($ext) + { + if (!extension_loaded($ext)) { + // if either returns true dl() will produce a FATAL error, stop that + if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { + return false; + } + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } + return true; + } + + // }}} + } + + // {{{ _PEAR_call_destructors() + + function _PEAR_call_destructors() + { + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } + } +} + +// }}} +/** + * Standard PEAR error class for PHP 4 + * + * This class is supserseded by {@link PEAR_Exception} in PHP 5 + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Gregory Beaver + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.4.9 + * @link http://pear.php.net/manual/en/core.pear.pear-error.php + * @see PEAR::raiseError(), PEAR::throwError() + * @since Class available since PHP 4.0.2 + */ +if (!class_exists('PEAR_Error', false)) +{ + class PEAR_Error + { + // {{{ properties + + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + // }}} + // {{{ constructor + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function PEAR_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + if (function_exists("debug_backtrace")) { + if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { + $this->backtrace = debug_backtrace(); + } + } + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + $this->level = $options; + $this->callback = null; + } + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + printf($format, $this->getMessage()); + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + die(sprintf($format, $msg)); + } + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + } + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);throw($e);'); + } + } + + // }}} + // {{{ getMode() + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() { + return $this->mode; + } + + // }}} + // {{{ getCallback() + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() { + return $this->callback; + } + + // }}} + // {{{ getMessage() + + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + + // }}} + // {{{ getCode() + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + // }}} + // {{{ getType() + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + // }}} + // {{{ getUserInfo() + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + // }}} + // {{{ getDebugInfo() + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + // }}} + // {{{ getBacktrace() + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if (defined('PEAR_IGNORE_BACKTRACE')) { + return null; + } + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + // }}} + // {{{ addUserInfo() + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + // }}} + // {{{ toString() + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } + + // }}} + } +} +if (!class_exists('PEAR_Exception', false)) +{ + class PEAR_Exception extends Exception + { + const OBSERVER_PRINT = -2; + const OBSERVER_TRIGGER = -4; + const OBSERVER_DIE = -8; + protected $cause; + private static $_observers = array(); + private static $_uniqueid = 0; + private $_trace; + + /** + * Supported signatures: + * - PEAR_Exception(string $message); + * - PEAR_Exception(string $message, int $code); + * - PEAR_Exception(string $message, Exception $cause); + * - PEAR_Exception(string $message, Exception $cause, int $code); + * - PEAR_Exception(string $message, PEAR_Error $cause); + * - PEAR_Exception(string $message, PEAR_Error $cause, int $code); + * - PEAR_Exception(string $message, array $causes); + * - PEAR_Exception(string $message, array $causes, int $code); + * @param string exception message + * @param int|Exception|PEAR_Error|array|null exception cause + * @param int|null exception code or null + */ + public function __construct($message, $p2 = null, $p3 = null) + { + if (is_int($p2)) { + $code = $p2; + $this->cause = null; + } elseif (is_object($p2) || is_array($p2)) { + // using is_object allows both Exception and PEAR_Error + if (is_object($p2) && !($p2 instanceof Exception)) { + if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) { + throw new PEAR_Exception('exception cause must be Exception, ' . + 'array, or PEAR_Error'); + } + } + $code = $p3; + if (is_array($p2) && isset($p2['message'])) { + // fix potential problem of passing in a single warning + $p2 = array($p2); + } + $this->cause = $p2; + } else { + $code = null; + $this->cause = null; + } + parent::__construct($message, $code); + $this->signal(); + } + + /** + * @param mixed $callback - A valid php callback, see php func is_callable() + * - A PEAR_Exception::OBSERVER_* constant + * - An array(const PEAR_Exception::OBSERVER_*, + * mixed $options) + * @param string $label The name of the observer. Use this if you want + * to remove it later with removeObserver() + */ + public static function addObserver($callback, $label = 'default') + { + self::$_observers[$label] = $callback; + } + + public static function removeObserver($label = 'default') + { + unset(self::$_observers[$label]); + } + + /** + * @return int unique identifier for an observer + */ + public static function getUniqueId() + { + return self::$_uniqueid++; + } + + private function signal() + { + foreach (self::$_observers as $func) { + if (is_callable($func)) { + call_user_func($func, $this); + continue; + } + settype($func, 'array'); + switch ($func[0]) { + case self::OBSERVER_PRINT : + $f = (isset($func[1])) ? $func[1] : '%s'; + printf($f, $this->getMessage()); + break; + case self::OBSERVER_TRIGGER : + $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE; + trigger_error($this->getMessage(), $f); + break; + case self::OBSERVER_DIE : + $f = (isset($func[1])) ? $func[1] : '%s'; + die(printf($f, $this->getMessage())); + break; + default: + trigger_error('invalid observer type', E_USER_WARNING); + } + } + } + + /** + * Return specific error information that can be used for more detailed + * error messages or translation. + * + * This method may be overridden in child exception classes in order + * to add functionality not present in PEAR_Exception and is a placeholder + * to define API + * + * The returned array must be an associative array of parameter => value like so: + *
        +			 * array('name' => $name, 'context' => array(...))
        +			 * 
        + * @return array + */ + public function getErrorData() + { + return array(); + } + + /** + * Returns the exception that caused this exception to be thrown + * @access public + * @return Exception|array The context of the exception + */ + public function getCause() + { + return $this->cause; + } + + /** + * Function must be public to call on caused exceptions + * @param array + */ + public function getCauseMessage(&$causes) + { + $trace = $this->getTraceSafe(); + $cause = array('class' => get_class($this), + 'message' => $this->message, + 'file' => 'unknown', + 'line' => 'unknown'); + if (isset($trace[0])) { + if (isset($trace[0]['file'])) { + $cause['file'] = $trace[0]['file']; + $cause['line'] = $trace[0]['line']; + } + } + $causes[] = $cause; + if ($this->cause instanceof PEAR_Exception) { + $this->cause->getCauseMessage($causes); + } elseif ($this->cause instanceof Exception) { + $causes[] = array('class' => get_class($this->cause), + 'message' => $this->cause->getMessage(), + 'file' => $this->cause->getFile(), + 'line' => $this->cause->getLine()); + } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) { + $causes[] = array('class' => get_class($this->cause), + 'message' => $this->cause->getMessage(), + 'file' => 'unknown', + 'line' => 'unknown'); + } elseif (is_array($this->cause)) { + foreach ($this->cause as $cause) { + if ($cause instanceof PEAR_Exception) { + $cause->getCauseMessage($causes); + } elseif ($cause instanceof Exception) { + $causes[] = array('class' => get_class($cause), + 'message' => $cause->getMessage(), + 'file' => $cause->getFile(), + 'line' => $cause->getLine()); + } elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) { + $causes[] = array('class' => get_class($cause), + 'message' => $cause->getMessage(), + 'file' => 'unknown', + 'line' => 'unknown'); + } elseif (is_array($cause) && isset($cause['message'])) { + // PEAR_ErrorStack warning + $causes[] = array( + 'class' => $cause['package'], + 'message' => $cause['message'], + 'file' => isset($cause['context']['file']) ? + $cause['context']['file'] : + 'unknown', + 'line' => isset($cause['context']['line']) ? + $cause['context']['line'] : + 'unknown', + ); + } + } + } + } + + public function getTraceSafe() + { + if (!isset($this->_trace)) { + $this->_trace = $this->getTrace(); + if (empty($this->_trace)) { + $backtrace = debug_backtrace(); + $this->_trace = array($backtrace[sizeof($backtrace)-1]); + } + } + return $this->_trace; + } + + public function getErrorClass() + { + $trace = $this->getTraceSafe(); + return $trace[0]['class']; + } + + public function getErrorMethod() + { + $trace = $this->getTraceSafe(); + return $trace[0]['function']; + } + + public function __toString() + { + if (isset($_SERVER['REQUEST_URI'])) { + return $this->toHtml(); + } + return $this->toText(); + } + + public function toHtml() + { + $trace = $this->getTraceSafe(); + $causes = array(); + $this->getCauseMessage($causes); + $html = '' . "\n"; + foreach ($causes as $i => $cause) { + $html .= '\n"; + } + $html .= '' . "\n" + . '' + . '' + . '' . "\n"; + + foreach ($trace as $k => $v) { + $html .= '' + . '' + . '' . "\n"; + } + $html .= '' + . '' + . '' . "\n" + . '
        ' + . str_repeat('-', $i) . ' ' . $cause['class'] . ': ' + . htmlspecialchars($cause['message']) . ' in ' . $cause['file'] . ' ' + . 'on line ' . $cause['line'] . '' + . "
        Exception trace
        #FunctionLocation
        ' . $k . ''; + if (!empty($v['class'])) { + $html .= $v['class'] . $v['type']; + } + $html .= $v['function']; + $args = array(); + if (!empty($v['args'])) { + foreach ($v['args'] as $arg) { + if (is_null($arg)) $args[] = 'null'; + elseif (is_array($arg)) $args[] = 'Array'; + elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')'; + elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false'; + elseif (is_int($arg) || is_double($arg)) $args[] = $arg; + else { + $arg = (string)$arg; + $str = htmlspecialchars(substr($arg, 0, 16)); + if (strlen($arg) > 16) $str .= '…'; + $args[] = "'" . $str . "'"; + } + } + } + $html .= '(' . implode(', ',$args) . ')' + . '' . (isset($v['file']) ? $v['file'] : 'unknown') + . ':' . (isset($v['line']) ? $v['line'] : 'unknown') + . '
        ' . ($k+1) . '{main} 
        '; + return $html; + } + + public function toText() + { + $causes = array(); + $this->getCauseMessage($causes); + $causeMsg = ''; + foreach ($causes as $i => $cause) { + $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': ' + . $cause['message'] . ' in ' . $cause['file'] + . ' on line ' . $cause['line'] . "\n"; + } + return $causeMsg . $this->getTraceAsString(); + } + } +} +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/tools/pear_xml_parser/Parser.php b/tools/pear_xml_parser/Parser.php new file mode 100644 index 000000000..6173582a0 --- /dev/null +++ b/tools/pear_xml_parser/Parser.php @@ -0,0 +1,351 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL + * @version CVS: $Id: Parser.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * XML_Feed_Parser_Type is an abstract class required by all of our + * feed types. It makes sense to load it here to keep the other files + * clean. + */ +require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/Type.php'); + +/** + * We will throw exceptions when errors occur. + */ +require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/Exception.php'); + +/** + * This is the core of the XML_Feed_Parser package. It identifies feed types + * and abstracts access to them. It is an iterator, allowing for easy access + * to the entire feed. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser implements Iterator +{ + /** + * This is where we hold the feed object + * @var Object + */ + private $feed; + + /** + * To allow for extensions, we make a public reference to the feed model + * @var DOMDocument + */ + public $model; + + /** + * A map between entry ID and offset + * @var array + */ + protected $idMappings = array(); + + /** + * A storage space for Namespace URIs. + * @var array + */ + private $feedNamespaces = array( + 'rss2' => array( + 'http://backend.userland.com/rss', + 'http://backend.userland.com/rss2', + 'http://blogs.law.harvard.edu/tech/rss')); + /** + * Detects feed types and instantiate appropriate objects. + * + * Our constructor takes care of detecting feed types and instantiating + * appropriate classes. For now we're going to treat Atom 0.3 as Atom 1.0 + * but raise a warning. I do not intend to introduce full support for + * Atom 0.3 as it has been deprecated, but others are welcome to. + * + * @param string $feed XML serialization of the feed + * @param bool $strict Whether or not to validate the feed + * @param bool $suppressWarnings Trigger errors for deprecated feed types? + * @param bool $tidy Whether or not to try and use the tidy library on input + */ + function __construct($feed, $strict = false, $suppressWarnings = false, $tidy = false) + { + $this->model = new DOMDocument; + if (! $this->model->loadXML($feed)) { + if (extension_loaded('tidy') && $tidy) { + $tidy = new tidy; + $tidy->parseString($feed, + array('input-xml' => true, 'output-xml' => true)); + $tidy->cleanRepair(); + if (! $this->model->loadXML((string) $tidy)) { + throw new XML_Feed_Parser_Exception('Invalid input: this is not ' . + 'valid XML'); + } + } else { + throw new XML_Feed_Parser_Exception('Invalid input: this is not valid XML'); + } + + } + + /* detect feed type */ + $doc_element = $this->model->documentElement; + $error = false; + + switch (true) { + case ($doc_element->namespaceURI == 'http://www.w3.org/2005/Atom'): + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/Atom.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/AtomElement.php'); + $class = 'XML_Feed_Parser_Atom'; + break; + case ($doc_element->namespaceURI == 'http://purl.org/atom/ns#'): + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/Atom.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/AtomElement.php'); + $class = 'XML_Feed_Parser_Atom'; + $error = 'Atom 0.3 deprecated, using 1.0 parser which won\'t provide ' . + 'all options'; + break; + case ($doc_element->namespaceURI == 'http://purl.org/rss/1.0/' || + ($doc_element->hasChildNodes() && $doc_element->childNodes->length > 1 + && $doc_element->childNodes->item(1)->namespaceURI == + 'http://purl.org/rss/1.0/')): + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS1.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS1Element.php'); + $class = 'XML_Feed_Parser_RSS1'; + break; + case ($doc_element->namespaceURI == 'http://purl.org/rss/1.1/' || + ($doc_element->hasChildNodes() && $doc_element->childNodes->length > 1 + && $doc_element->childNodes->item(1)->namespaceURI == + 'http://purl.org/rss/1.1/')): + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS11.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS11Element.php'); + $class = 'XML_Feed_Parser_RSS11'; + break; + case (($doc_element->hasChildNodes() && $doc_element->childNodes->length > 1 + && $doc_element->childNodes->item(1)->namespaceURI == + 'http://my.netscape.com/rdf/simple/0.9/') || + $doc_element->namespaceURI == 'http://my.netscape.com/rdf/simple/0.9/'): + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS09.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS09Element.php'); + $class = 'XML_Feed_Parser_RSS09'; + break; + case ($doc_element->tagName == 'rss' and + $doc_element->hasAttribute('version') && + $doc_element->getAttribute('version') == 0.91): + $error = 'RSS 0.91 has been superceded by RSS2.0. Using RSS2.0 parser.'; + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS2.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS2Element.php'); + $class = 'XML_Feed_Parser_RSS2'; + break; + case ($doc_element->tagName == 'rss' and + $doc_element->hasAttribute('version') && + $doc_element->getAttribute('version') == 0.92): + $error = 'RSS 0.92 has been superceded by RSS2.0. Using RSS2.0 parser.'; + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS2.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS2Element.php'); + $class = 'XML_Feed_Parser_RSS2'; + break; + case (in_array($doc_element->namespaceURI, $this->feedNamespaces['rss2']) + || $doc_element->tagName == 'rss'): + if (! $doc_element->hasAttribute('version') || + $doc_element->getAttribute('version') != 2) { + $error = 'RSS version not specified. Parsing as RSS2.0'; + } + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS2.php'); + require_once (_PS_PEAR_XML_PARSER_PATH_.'Parser/RSS2Element.php'); + $class = 'XML_Feed_Parser_RSS2'; + break; + default: + throw new XML_Feed_Parser_Exception('Feed type unknown'); + break; + } + + if (! $suppressWarnings && ! empty($error)) { + trigger_error($error, E_USER_WARNING); + } + + /* Instantiate feed object */ + $this->feed = new $class($this->model, $strict); + } + + /** + * Proxy to allow feed element names to be used as method names + * + * For top-level feed elements we will provide access using methods or + * attributes. This function simply passes on a request to the appropriate + * feed type object. + * + * @param string $call - the method being called + * @param array $attributes + */ + function __call($call, $attributes) + { + $attributes = array_pad($attributes, 5, false); + list($a, $b, $c, $d, $e) = $attributes; + return $this->feed->$call($a, $b, $c, $d, $e); + } + + /** + * Proxy to allow feed element names to be used as attribute names + * + * To allow variable-like access to feed-level data we use this + * method. It simply passes along to __call() which in turn passes + * along to the relevant object. + * + * @param string $val - the name of the variable required + */ + function __get($val) + { + return $this->feed->$val; + } + + /** + * Provides iteration functionality. + * + * Of course we must be able to iterate... This function simply increases + * our internal counter. + */ + function next() + { + if (isset($this->current_item) && + $this->current_item <= $this->feed->numberEntries - 1) { + ++$this->current_item; + } else if (! isset($this->current_item)) { + $this->current_item = 0; + } else { + return false; + } + } + + /** + * Return XML_Feed_Type object for current element + * + * @return XML_Feed_Parser_Type Object + */ + function current() + { + return $this->getEntryByOffset($this->current_item); + } + + /** + * For iteration -- returns the key for the current stage in the array. + * + * @return int + */ + function key() + { + return $this->current_item; + } + + /** + * For iteration -- tells whether we have reached the + * end. + * + * @return bool + */ + function valid() + { + return $this->current_item < $this->feed->numberEntries; + } + + /** + * For iteration -- resets the internal counter to the beginning. + */ + function rewind() + { + $this->current_item = 0; + } + + /** + * Provides access to entries by ID if one is specified in the source feed. + * + * As well as allowing the items to be iterated over we want to allow + * users to be able to access a specific entry. This is one of two ways of + * doing that, the other being by offset. This method can be quite slow + * if dealing with a large feed that hasn't yet been processed as it + * instantiates objects for every entry until it finds the one needed. + * + * @param string $id Valid ID for the given feed format + * @return XML_Feed_Parser_Type|false + */ + function getEntryById($id) + { + if (isset($this->idMappings[$id])) { + return $this->getEntryByOffset($this->idMappings[$id]); + } + + /* + * Since we have not yet encountered that ID, let's go through all the + * remaining entries in order till we find it. + * This is a fairly slow implementation, but it should work. + */ + return $this->feed->getEntryById($id); + } + + /** + * Retrieve entry by numeric offset, starting from zero. + * + * As well as allowing the items to be iterated over we want to allow + * users to be able to access a specific entry. This is one of two ways of + * doing that, the other being by ID. + * + * @param int $offset The position of the entry within the feed, starting from 0 + * @return XML_Feed_Parser_Type|false + */ + function getEntryByOffset($offset) + { + if ($offset < $this->feed->numberEntries) { + if (isset($this->feed->entries[$offset])) { + return $this->feed->entries[$offset]; + } else { + try { + $this->feed->getEntryByOffset($offset); + } catch (Exception $e) { + return false; + } + $id = $this->feed->entries[$offset]->getID(); + $this->idMappings[$id] = $offset; + return $this->feed->entries[$offset]; + } + } else { + return false; + } + } + + /** + * Retrieve version details from feed type class. + * + * @return void + * @author James Stewart + */ + function version() + { + return $this->feed->version; + } + + /** + * Returns a string representation of the feed. + * + * @return String + **/ + function __toString() + { + return $this->feed->__toString(); + } +} +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/Atom.php b/tools/pear_xml_parser/Parser/Atom.php new file mode 100644 index 000000000..f36db71c5 --- /dev/null +++ b/tools/pear_xml_parser/Parser/Atom.php @@ -0,0 +1,365 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: Atom.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ +*/ + +/** + * This is the class that determines how we manage Atom 1.0 feeds + * + * How we deal with constructs: + * date - return as unix datetime for use with the 'date' function unless specified otherwise + * text - return as is. optional parameter will give access to attributes + * person - defaults to name, but parameter based access + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_Atom extends XML_Feed_Parser_Type +{ + /** + * The URI of the RelaxNG schema used to (optionally) validate the feed + * @var string + */ + private $relax = 'atom.rnc'; + + /** + * We're likely to use XPath, so let's keep it global + * @var DOMXPath + */ + public $xpath; + + /** + * When performing XPath queries we will use this prefix + * @var string + */ + private $xpathPrefix = '//'; + + /** + * The feed type we are parsing + * @var string + */ + public $version = 'Atom 1.0'; + + /** + * The class used to represent individual items + * @var string + */ + protected $itemClass = 'XML_Feed_Parser_AtomElement'; + + /** + * The element containing entries + * @var string + */ + protected $itemElement = 'entry'; + + /** + * Here we map those elements we're not going to handle individually + * to the constructs they are. The optional second parameter in the array + * tells the parser whether to 'fall back' (not apt. at the feed level) or + * fail if the element is missing. If the parameter is not set, the function + * will simply return false and leave it to the client to decide what to do. + * @var array + */ + protected $map = array( + 'author' => array('Person'), + 'contributor' => array('Person'), + 'icon' => array('Text'), + 'logo' => array('Text'), + 'id' => array('Text', 'fail'), + 'rights' => array('Text'), + 'subtitle' => array('Text'), + 'title' => array('Text', 'fail'), + 'updated' => array('Date', 'fail'), + 'link' => array('Link'), + 'generator' => array('Text'), + 'category' => array('Category')); + + /** + * Here we provide a few mappings for those very special circumstances in + * which it makes sense to map back to the RSS2 spec. Key is RSS2 version + * value is an array consisting of the equivalent in atom and any attributes + * needed to make the mapping. + * @var array + */ + protected $compatMap = array( + 'guid' => array('id'), + 'links' => array('link'), + 'tags' => array('category'), + 'contributors' => array('contributor')); + + /** + * Our constructor does nothing more than its parent. + * + * @param DOMDocument $xml A DOM object representing the feed + * @param bool (optional) $string Whether or not to validate this feed + */ + function __construct(DOMDocument $model, $strict = false) + { + $this->model = $model; + + if ($strict) { + if (! $this->model->relaxNGValidateSource($this->relax)) { + throw new XML_Feed_Parser_Exception('Failed required validation'); + } + } + + $this->xpath = new DOMXPath($this->model); + $this->xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom'); + $this->numberEntries = $this->count('entry'); + } + + /** + * Implement retrieval of an entry based on its ID for atom feeds. + * + * This function uses XPath to get the entry based on its ID. If DOMXPath::evaluate + * is available, we also use that to store a reference to the entry in the array + * used by getEntryByOffset so that method does not have to seek out the entry + * if it's requested that way. + * + * @param string $id any valid Atom ID. + * @return XML_Feed_Parser_AtomElement + */ + function getEntryById($id) + { + if (isset($this->idMappings[$id])) { + return $this->entries[$this->idMappings[$id]]; + } + + $entries = $this->xpath->query("//atom:entry[atom:id='$id']"); + + if ($entries->length > 0) { + $xmlBase = $entries->item(0)->baseURI; + $entry = new $this->itemElement($entries->item(0), $this, $xmlBase); + + if (in_array('evaluate', get_class_methods($this->xpath))) { + $offset = $this->xpath->evaluate("count(preceding-sibling::atom:entry)", $entries->item(0)); + $this->entries[$offset] = $entry; + } + + $this->idMappings[$id] = $entry; + + return $entry; + } + + } + + /** + * Retrieves data from a person construct. + * + * Get a person construct. We default to the 'name' element but allow + * access to any of the elements. + * + * @param string $method The name of the person construct we want + * @param array $arguments An array which we hope gives a 'param' + * @return string|false + */ + protected function getPerson($method, $arguments) + { + $offset = empty($arguments[0]) ? 0 : $arguments[0]; + $parameter = empty($arguments[1]['param']) ? 'name' : $arguments[1]['param']; + $section = $this->model->getElementsByTagName($method); + + if ($parameter == 'url') { + $parameter = 'uri'; + } + + if ($section->length <= $offset) { + return false; + } + + $param = $section->item($offset)->getElementsByTagName($parameter); + if ($param->length == 0) { + return false; + } + return $param->item(0)->nodeValue; + } + + /** + * Retrieves an element's content where that content is a text construct. + * + * Get a text construct. When calling this method, the two arguments + * allowed are 'offset' and 'attribute', so $parser->subtitle() would + * return the content of the element, while $parser->subtitle(false, 'type') + * would return the value of the type attribute. + * + * @todo Clarify overlap with getContent() + * @param string $method The name of the text construct we want + * @param array $arguments An array which we hope gives a 'param' + * @return string + */ + protected function getText($method, $arguments) + { + $offset = empty($arguments[0]) ? 0: $arguments[0]; + $attribute = empty($arguments[1]) ? false : $arguments[1]; + $tags = $this->model->getElementsByTagName($method); + + if ($tags->length <= $offset) { + return false; + } + + $content = $tags->item($offset); + + if (! $content->hasAttribute('type')) { + $content->setAttribute('type', 'text'); + } + $type = $content->getAttribute('type'); + + if (! empty($attribute) and + ! ($method == 'generator' and $attribute == 'name')) { + if ($content->hasAttribute($attribute)) { + return $content->getAttribute($attribute); + } else if ($attribute == 'href' and $content->hasAttribute('uri')) { + return $content->getAttribute('uri'); + } + return false; + } + return $this->parseTextConstruct($content); + } + + /** + * Extract content appropriately from atom text constructs + * + * Because of different rules applied to the content element and other text + * constructs, they are deployed as separate functions, but they share quite + * a bit of processing. This method performs the core common process, which is + * to apply the rules for different mime types in order to extract the content. + * + * @param DOMNode $content the text construct node to be parsed + * @return String + * @author James Stewart + **/ + protected function parseTextConstruct(DOMNode $content) + { + if ($content->hasAttribute('type')) { + $type = $content->getAttribute('type'); + } else { + $type = 'text'; + } + + if (strpos($type, 'text/') === 0) { + $type = 'text'; + } + switch ($type) { + case 'text': + return $content->nodeValue; + break; + case 'html': + return str_replace('<', '<', $content->nodeValue); + break; + case 'xhtml': + $container = $content->getElementsByTagName('div'); + if ($container->length == 0) { + return false; + } + $contents = $container->item(0); + if ($contents->hasChildNodes()) { + /* Iterate through, applying xml:base and store the result */ + $result = ''; + foreach ($contents->childNodes as $node) { + $result .= $this->traverseNode($node); + } + return utf8_decode($result); + } + break; + case preg_match('@^[a-zA-Z]+/[a-zA-Z+]*xml@i', $type) > 0: + return $content; + break; + case 'application/octet-stream': + default: + return base64_decode(trim($content->nodeValue)); + break; + } + return false; + } + /** + * Get a category from the entry. + * + * A feed or entry can have any number of categories. A category can have the + * attributes term, scheme and label. + * + * @param string $method The name of the text construct we want + * @param array $arguments An array which we hope gives a 'param' + * @return string + */ + function getCategory($method, $arguments) + { + $offset = empty($arguments[0]) ? 0: $arguments[0]; + $attribute = empty($arguments[1]) ? 'term' : $arguments[1]; + $categories = $this->model->getElementsByTagName('category'); + if ($categories->length <= $offset) { + $category = $categories->item($offset); + if ($category->hasAttribute($attribute)) { + return $category->getAttribute($attribute); + } + } + return false; + } + + /** + * This element must be present at least once with rel="feed". This element may be + * present any number of further times so long as there is no clash. If no 'rel' is + * present and we're asked for one, we follow the example of the Universal Feed + * Parser and presume 'alternate'. + * + * @param int $offset the position of the link within the container + * @param string $attribute the attribute name required + * @param array an array of attributes to search by + * @return string the value of the attribute + */ + function getLink($offset = 0, $attribute = 'href', $params = false) + { + if (is_array($params) and !empty($params)) { + $terms = array(); + $alt_predicate = ''; + $other_predicate = ''; + + foreach ($params as $key => $value) { + if ($key == 'rel' && $value == 'alternate') { + $alt_predicate = '[not(@rel) or @rel="alternate"]'; + } else { + $terms[] = "@$key='$value'"; + } + } + if (!empty($terms)) { + $other_predicate = '[' . join(' and ', $terms) . ']'; + } + $query = $this->xpathPrefix . 'atom:link' . $alt_predicate . $other_predicate; + $links = $this->xpath->query($query); + } else { + $links = $this->model->getElementsByTagName('link'); + } + if ($links->length > $offset) { + if ($links->item($offset)->hasAttribute($attribute)) { + $value = $links->item($offset)->getAttribute($attribute); + if ($attribute == 'href') { + $value = $this->addBase($value, $links->item($offset)); + } + return $value; + } else if ($attribute == 'rel') { + return 'alternate'; + } + } + return false; + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/AtomElement.php b/tools/pear_xml_parser/Parser/AtomElement.php new file mode 100644 index 000000000..ca5084220 --- /dev/null +++ b/tools/pear_xml_parser/Parser/AtomElement.php @@ -0,0 +1,261 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: AtomElement.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This class provides support for atom entries. It will usually be called by + * XML_Feed_Parser_Atom with which it shares many methods. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_AtomElement extends XML_Feed_Parser_Atom +{ + /** + * This will be a reference to the parent object for when we want + * to use a 'fallback' rule + * @var XML_Feed_Parser_Atom + */ + protected $parent; + + /** + * When performing XPath queries we will use this prefix + * @var string + */ + private $xpathPrefix = ''; + + /** + * xml:base values inherited by the element + * @var string + */ + protected $xmlBase; + + /** + * Here we provide a few mappings for those very special circumstances in + * which it makes sense to map back to the RSS2 spec or to manage other + * compatibilities (eg. with the Univeral Feed Parser). Key is the other version's + * name for the command, value is an array consisting of the equivalent in our atom + * api and any attributes needed to make the mapping. + * @var array + */ + protected $compatMap = array( + 'guid' => array('id'), + 'links' => array('link'), + 'tags' => array('category'), + 'contributors' => array('contributor')); + + /** + * Our specific element map + * @var array + */ + protected $map = array( + 'author' => array('Person', 'fallback'), + 'contributor' => array('Person'), + 'id' => array('Text', 'fail'), + 'published' => array('Date'), + 'updated' => array('Date', 'fail'), + 'title' => array('Text', 'fail'), + 'rights' => array('Text', 'fallback'), + 'summary' => array('Text'), + 'content' => array('Content'), + 'link' => array('Link'), + 'enclosure' => array('Enclosure'), + 'category' => array('Category')); + + /** + * Store useful information for later. + * + * @param DOMElement $element - this item as a DOM element + * @param XML_Feed_Parser_Atom $parent - the feed of which this is a member + */ + function __construct(DOMElement $element, $parent, $xmlBase = '') + { + $this->model = $element; + $this->parent = $parent; + $this->xmlBase = $xmlBase; + $this->xpathPrefix = "//atom:entry[atom:id='" . $this->id . "']/"; + $this->xpath = $this->parent->xpath; + } + + /** + * Provides access to specific aspects of the author data for an atom entry + * + * Author data at the entry level is more complex than at the feed level. + * If atom:author is not present for the entry we need to look for it in + * an atom:source child of the atom:entry. If it's not there either, then + * we look to the parent for data. + * + * @param array + * @return string + */ + function getAuthor($arguments) + { + /* Find out which part of the author data we're looking for */ + if (isset($arguments['param'])) { + $parameter = $arguments['param']; + } else { + $parameter = 'name'; + } + + $test = $this->model->getElementsByTagName('author'); + if ($test->length > 0) { + $item = $test->item(0); + return $item->getElementsByTagName($parameter)->item(0)->nodeValue; + } + + $source = $this->model->getElementsByTagName('source'); + if ($source->length > 0) { + $test = $this->model->getElementsByTagName('author'); + if ($test->length > 0) { + $item = $test->item(0); + return $item->getElementsByTagName($parameter)->item(0)->nodeValue; + } + } + return $this->parent->getAuthor($arguments); + } + + /** + * Returns the content of the content element or info on a specific attribute + * + * This element may or may not be present. It cannot be present more than + * once. It may have a 'src' attribute, in which case there's no content + * If not present, then the entry must have link with rel="alternate". + * If there is content we return it, if not and there's a 'src' attribute + * we return the value of that instead. The method can take an 'attribute' + * argument, in which case we return the value of that attribute if present. + * eg. $item->content("type") will return the type of the content. It is + * recommended that all users check the type before getting the content to + * ensure that their script is capable of handling the type of returned data. + * (data carried in the content element can be either 'text', 'html', 'xhtml', + * or any standard MIME type). + * + * @return string|false + */ + protected function getContent($method, $arguments = array()) + { + $attribute = empty($arguments[0]) ? false : $arguments[0]; + $tags = $this->model->getElementsByTagName('content'); + + if ($tags->length == 0) { + return false; + } + + $content = $tags->item(0); + + if (! $content->hasAttribute('type')) { + $content->setAttribute('type', 'text'); + } + if (! empty($attribute)) { + return $content->getAttribute($attribute); + } + + $type = $content->getAttribute('type'); + + if (! empty($attribute)) { + if ($content->hasAttribute($attribute)) + { + return $content->getAttribute($attribute); + } + return false; + } + + if ($content->hasAttribute('src')) { + return $content->getAttribute('src'); + } + + return $this->parseTextConstruct($content); + } + + /** + * For compatibility, this method provides a mapping to access enclosures. + * + * The Atom spec doesn't provide for an enclosure element, but it is + * generally supported using the link element with rel='enclosure'. + * + * @param string $method - for compatibility with our __call usage + * @param array $arguments - for compatibility with our __call usage + * @return array|false + */ + function getEnclosure($method, $arguments = array()) + { + $offset = isset($arguments[0]) ? $arguments[0] : 0; + $query = "//atom:entry[atom:id='" . $this->getText('id', false) . + "']/atom:link[@rel='enclosure']"; + + $encs = $this->parent->xpath->query($query); + if ($encs->length > $offset) { + try { + if (! $encs->item($offset)->hasAttribute('href')) { + return false; + } + $attrs = $encs->item($offset)->attributes; + $length = $encs->item($offset)->hasAttribute('length') ? + $encs->item($offset)->getAttribute('length') : false; + return array( + 'url' => $attrs->getNamedItem('href')->value, + 'type' => $attrs->getNamedItem('type')->value, + 'length' => $length); + } catch (Exception $e) { + return false; + } + } + return false; + } + + /** + * Get details of this entry's source, if available/relevant + * + * Where an atom:entry is taken from another feed then the aggregator + * is supposed to include an atom:source element which replicates at least + * the atom:id, atom:title, and atom:updated metadata from the original + * feed. Atom:source therefore has a very similar structure to atom:feed + * and if we find it we will return it as an XML_Feed_Parser_Atom object. + * + * @return XML_Feed_Parser_Atom|false + */ + function getSource() + { + $test = $this->model->getElementsByTagName('source'); + if ($test->length == 0) { + return false; + } + $source = new XML_Feed_Parser_Atom($test->item(0)); + } + + /** + * Get the entry as an XML string + * + * Return an XML serialization of the feed, should it be required. Most + * users however, will already have a serialization that they used when + * instantiating the object. + * + * @return string XML serialization of element + */ + function __toString() + { + $simple = simplexml_import_dom($this->model); + return $simple->asXML(); + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/Exception.php b/tools/pear_xml_parser/Parser/Exception.php new file mode 100644 index 000000000..41198b22a --- /dev/null +++ b/tools/pear_xml_parser/Parser/Exception.php @@ -0,0 +1,42 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL + * @version CVS: $Id: Exception.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * We are extending PEAR_Exception + */ +require_once(dirname(__FILE__).'/../../pear/PEAR.php'); + +/** + * XML_Feed_Parser_Exception is a simple extension of PEAR_Exception, existing + * to help with identification of the source of exceptions. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_Exception extends PEAR_Exception +{ + +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS09.php b/tools/pear_xml_parser/Parser/RSS09.php new file mode 100644 index 000000000..07664097f --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS09.php @@ -0,0 +1,214 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS09.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This class handles RSS0.9 feeds. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + * @todo Find a Relax NG URI we can use + */ +class XML_Feed_Parser_RSS09 extends XML_Feed_Parser_Type +{ + /** + * The URI of the RelaxNG schema used to (optionally) validate the feed + * @var string + */ + private $relax = ''; + + /** + * We're likely to use XPath, so let's keep it global + * @var DOMXPath + */ + protected $xpath; + + /** + * The feed type we are parsing + * @var string + */ + public $version = 'RSS 0.9'; + + /** + * The class used to represent individual items + * @var string + */ + protected $itemClass = 'XML_Feed_Parser_RSS09Element'; + + /** + * The element containing entries + * @var string + */ + protected $itemElement = 'item'; + + /** + * Here we map those elements we're not going to handle individually + * to the constructs they are. The optional second parameter in the array + * tells the parser whether to 'fall back' (not apt. at the feed level) or + * fail if the element is missing. If the parameter is not set, the function + * will simply return false and leave it to the client to decide what to do. + * @var array + */ + protected $map = array( + 'title' => array('Text'), + 'link' => array('Text'), + 'description' => array('Text'), + 'image' => array('Image'), + 'textinput' => array('TextInput')); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS2. + * @var array + */ + protected $compatMap = array( + 'title' => array('title'), + 'link' => array('link'), + 'subtitle' => array('description')); + + /** + * We will be working with multiple namespaces and it is useful to + * keep them together + * @var array + */ + protected $namespaces = array( + 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); + + /** + * Our constructor does nothing more than its parent. + * + * @todo RelaxNG validation + * @param DOMDocument $xml A DOM object representing the feed + * @param bool (optional) $string Whether or not to validate this feed + */ + function __construct(DOMDocument $model, $strict = false) + { + $this->model = $model; + + $this->xpath = new DOMXPath($model); + foreach ($this->namespaces as $key => $value) { + $this->xpath->registerNamespace($key, $value); + } + $this->numberEntries = $this->count('item'); + } + + /** + * Included for compatibility -- will not work with RSS 0.9 + * + * This is not something that will work with RSS0.9 as it does not have + * clear restrictions on the global uniqueness of IDs. + * + * @param string $id any valid ID. + * @return false + */ + function getEntryById($id) + { + return false; + } + + /** + * Get details of the image associated with the feed. + * + * @return array|false an array simply containing the child elements + */ + protected function getImage() + { + $images = $this->model->getElementsByTagName('image'); + if ($images->length > 0) { + $image = $images->item(0); + $details = array(); + if ($image->hasChildNodes()) { + $details = array( + 'title' => $image->getElementsByTagName('title')->item(0)->value, + 'link' => $image->getElementsByTagName('link')->item(0)->value, + 'url' => $image->getElementsByTagName('url')->item(0)->value); + } else { + $details = array('title' => false, + 'link' => false, + 'url' => $image->attributes->getNamedItem('resource')->nodeValue); + } + $details = array_merge($details, + array('description' => false, 'height' => false, 'width' => false)); + if (! empty($details)) { + return $details; + } + } + return false; + } + + /** + * The textinput element is little used, but in the interests of + * completeness we will support it. + * + * @return array|false + */ + protected function getTextInput() + { + $inputs = $this->model->getElementsByTagName('textinput'); + if ($inputs->length > 0) { + $input = $inputs->item(0); + $results = array(); + $results['title'] = isset( + $input->getElementsByTagName('title')->item(0)->value) ? + $input->getElementsByTagName('title')->item(0)->value : null; + $results['description'] = isset( + $input->getElementsByTagName('description')->item(0)->value) ? + $input->getElementsByTagName('description')->item(0)->value : null; + $results['name'] = isset( + $input->getElementsByTagName('name')->item(0)->value) ? + $input->getElementsByTagName('name')->item(0)->value : null; + $results['link'] = isset( + $input->getElementsByTagName('link')->item(0)->value) ? + $input->getElementsByTagName('link')->item(0)->value : null; + if (empty($results['link']) && + $input->attributes->getNamedItem('resource')) { + $results['link'] = $input->attributes->getNamedItem('resource')->nodeValue; + } + if (! empty($results)) { + return $results; + } + } + return false; + } + + /** + * Get details of a link from the feed. + * + * In RSS1 a link is a text element but in order to ensure that we resolve + * URLs properly we have a special function for them. + * + * @return string + */ + function getLink($offset = 0, $attribute = 'href', $params = false) + { + $links = $this->model->getElementsByTagName('link'); + if ($links->length <= $offset) { + return false; + } + $link = $links->item($offset); + return $this->addBase($link->nodeValue, $link); + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS09Element.php b/tools/pear_xml_parser/Parser/RSS09Element.php new file mode 100644 index 000000000..0441221fa --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS09Element.php @@ -0,0 +1,62 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS09Element.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/* + * This class provides support for RSS 0.9 entries. It will usually be called by + * XML_Feed_Parser_RSS09 with which it shares many methods. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_RSS09Element extends XML_Feed_Parser_RSS09 +{ + /** + * This will be a reference to the parent object for when we want + * to use a 'fallback' rule + * @var XML_Feed_Parser_RSS09 + */ + protected $parent; + + /** + * Our specific element map + * @var array + */ + protected $map = array( + 'title' => array('Text'), + 'link' => array('Link')); + + /** + * Store useful information for later. + * + * @param DOMElement $element - this item as a DOM element + * @param XML_Feed_Parser_RSS1 $parent - the feed of which this is a member + */ + function __construct(DOMElement $element, $parent, $xmlBase = '') + { + $this->model = $element; + $this->parent = $parent; + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS1.php b/tools/pear_xml_parser/Parser/RSS1.php new file mode 100644 index 000000000..648129cb8 --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS1.php @@ -0,0 +1,277 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS1.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This class handles RSS1.0 feeds. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + * @todo Find a Relax NG URI we can use + */ +class XML_Feed_Parser_RSS1 extends XML_Feed_Parser_Type +{ + /** + * The URI of the RelaxNG schema used to (optionally) validate the feed + * @var string + */ + private $relax = 'rss10.rnc'; + + /** + * We're likely to use XPath, so let's keep it global + * @var DOMXPath + */ + protected $xpath; + + /** + * The feed type we are parsing + * @var string + */ + public $version = 'RSS 1.0'; + + /** + * The class used to represent individual items + * @var string + */ + protected $itemClass = 'XML_Feed_Parser_RSS1Element'; + + /** + * The element containing entries + * @var string + */ + protected $itemElement = 'item'; + + /** + * Here we map those elements we're not going to handle individually + * to the constructs they are. The optional second parameter in the array + * tells the parser whether to 'fall back' (not apt. at the feed level) or + * fail if the element is missing. If the parameter is not set, the function + * will simply return false and leave it to the client to decide what to do. + * @var array + */ + protected $map = array( + 'title' => array('Text'), + 'link' => array('Text'), + 'description' => array('Text'), + 'image' => array('Image'), + 'textinput' => array('TextInput'), + 'updatePeriod' => array('Text'), + 'updateFrequency' => array('Text'), + 'updateBase' => array('Date'), + 'rights' => array('Text'), # dc:rights + 'description' => array('Text'), # dc:description + 'creator' => array('Text'), # dc:creator + 'publisher' => array('Text'), # dc:publisher + 'contributor' => array('Text'), # dc:contributor + 'date' => array('Date') # dc:contributor + ); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS2. + * @var array + */ + protected $compatMap = array( + 'title' => array('title'), + 'link' => array('link'), + 'subtitle' => array('description'), + 'author' => array('creator'), + 'updated' => array('date')); + + /** + * We will be working with multiple namespaces and it is useful to + * keep them together + * @var array + */ + protected $namespaces = array( + 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'rss' => 'http://purl.org/rss/1.0/', + 'dc' => 'http://purl.org/rss/1.0/modules/dc/', + 'content' => 'http://purl.org/rss/1.0/modules/content/', + 'sy' => 'http://web.resource.org/rss/1.0/modules/syndication/'); + + /** + * Our constructor does nothing more than its parent. + * + * @param DOMDocument $xml A DOM object representing the feed + * @param bool (optional) $string Whether or not to validate this feed + */ + function __construct(DOMDocument $model, $strict = false) + { + $this->model = $model; + if ($strict) { + $validate = $this->model->relaxNGValidate(self::getSchemaDir . + DIRECTORY_SEPARATOR . $this->relax); + if (! $validate) { + throw new XML_Feed_Parser_Exception('Failed required validation'); + } + } + + $this->xpath = new DOMXPath($model); + foreach ($this->namespaces as $key => $value) { + $this->xpath->registerNamespace($key, $value); + } + $this->numberEntries = $this->count('item'); + } + + /** + * Allows retrieval of an entry by ID where the rdf:about attribute is used + * + * This is not really something that will work with RSS1 as it does not have + * clear restrictions on the global uniqueness of IDs. We will employ the + * _very_ hit and miss method of selecting entries based on the rdf:about + * attribute. If DOMXPath::evaluate is available, we also use that to store + * a reference to the entry in the array used by getEntryByOffset so that + * method does not have to seek out the entry if it's requested that way. + * + * @param string $id any valid ID. + * @return XML_Feed_Parser_RSS1Element + */ + function getEntryById($id) + { + if (isset($this->idMappings[$id])) { + return $this->entries[$this->idMappings[$id]]; + } + + $entries = $this->xpath->query("//rss:item[@rdf:about='$id']"); + if ($entries->length > 0) { + $classname = $this->itemClass; + $entry = new $classname($entries->item(0), $this); + if (in_array('evaluate', get_class_methods($this->xpath))) { + $offset = $this->xpath->evaluate("count(preceding-sibling::rss:item)", $entries->item(0)); + $this->entries[$offset] = $entry; + } + $this->idMappings[$id] = $entry; + return $entry; + } + return false; + } + + /** + * Get details of the image associated with the feed. + * + * @return array|false an array simply containing the child elements + */ + protected function getImage() + { + $images = $this->model->getElementsByTagName('image'); + if ($images->length > 0) { + $image = $images->item(0); + $details = array(); + if ($image->hasChildNodes()) { + $details = array( + 'title' => $image->getElementsByTagName('title')->item(0)->value, + 'link' => $image->getElementsByTagName('link')->item(0)->value, + 'url' => $image->getElementsByTagName('url')->item(0)->value); + } else { + $details = array('title' => false, + 'link' => false, + 'url' => $image->attributes->getNamedItem('resource')->nodeValue); + } + $details = array_merge($details, array('description' => false, 'height' => false, 'width' => false)); + if (! empty($details)) { + return $details; + } + } + return false; + } + + /** + * The textinput element is little used, but in the interests of + * completeness we will support it. + * + * @return array|false + */ + protected function getTextInput() + { + $inputs = $this->model->getElementsByTagName('textinput'); + if ($inputs->length > 0) { + $input = $inputs->item(0); + $results = array(); + $results['title'] = isset( + $input->getElementsByTagName('title')->item(0)->value) ? + $input->getElementsByTagName('title')->item(0)->value : null; + $results['description'] = isset( + $input->getElementsByTagName('description')->item(0)->value) ? + $input->getElementsByTagName('description')->item(0)->value : null; + $results['name'] = isset( + $input->getElementsByTagName('name')->item(0)->value) ? + $input->getElementsByTagName('name')->item(0)->value : null; + $results['link'] = isset( + $input->getElementsByTagName('link')->item(0)->value) ? + $input->getElementsByTagName('link')->item(0)->value : null; + if (empty($results['link']) and + $input->attributes->getNamedItem('resource')) { + $results['link'] = + $input->attributes->getNamedItem('resource')->nodeValue; + } + if (! empty($results)) { + return $results; + } + } + return false; + } + + /** + * Employs various techniques to identify the author + * + * Dublin Core provides the dc:creator, dc:contributor, and dc:publisher + * elements for defining authorship in RSS1. We will try each of those in + * turn in order to simulate the atom author element and will return it + * as text. + * + * @return array|false + */ + function getAuthor() + { + $options = array('creator', 'contributor', 'publisher'); + foreach ($options as $element) { + $test = $this->model->getElementsByTagName($element); + if ($test->length > 0) { + return $test->item(0)->value; + } + } + return false; + } + + /** + * Retrieve a link + * + * In RSS1 a link is a text element but in order to ensure that we resolve + * URLs properly we have a special function for them. + * + * @return string + */ + function getLink($offset = 0, $attribute = 'href', $params = false) + { + $links = $this->model->getElementsByTagName('link'); + if ($links->length <= $offset) { + return false; + } + $link = $links->item($offset); + return $this->addBase($link->nodeValue, $link); + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS11.php b/tools/pear_xml_parser/Parser/RSS11.php new file mode 100644 index 000000000..e514e892d --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS11.php @@ -0,0 +1,276 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS11.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This class handles RSS1.1 feeds. RSS1.1 is documented at: + * http://inamidst.com/rss1.1/ + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + * @todo Support for RDF:List + * @todo Ensure xml:lang is accessible to users + */ +class XML_Feed_Parser_RSS11 extends XML_Feed_Parser_Type +{ + /** + * The URI of the RelaxNG schema used to (optionally) validate the feed + * @var string + */ + private $relax = 'rss11.rnc'; + + /** + * We're likely to use XPath, so let's keep it global + * @var DOMXPath + */ + protected $xpath; + + /** + * The feed type we are parsing + * @var string + */ + public $version = 'RSS 1.0'; + + /** + * The class used to represent individual items + * @var string + */ + protected $itemClass = 'XML_Feed_Parser_RSS1Element'; + + /** + * The element containing entries + * @var string + */ + protected $itemElement = 'item'; + + /** + * Here we map those elements we're not going to handle individually + * to the constructs they are. The optional second parameter in the array + * tells the parser whether to 'fall back' (not apt. at the feed level) or + * fail if the element is missing. If the parameter is not set, the function + * will simply return false and leave it to the client to decide what to do. + * @var array + */ + protected $map = array( + 'title' => array('Text'), + 'link' => array('Text'), + 'description' => array('Text'), + 'image' => array('Image'), + 'updatePeriod' => array('Text'), + 'updateFrequency' => array('Text'), + 'updateBase' => array('Date'), + 'rights' => array('Text'), # dc:rights + 'description' => array('Text'), # dc:description + 'creator' => array('Text'), # dc:creator + 'publisher' => array('Text'), # dc:publisher + 'contributor' => array('Text'), # dc:contributor + 'date' => array('Date') # dc:contributor + ); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS2. + * @var array + */ + protected $compatMap = array( + 'title' => array('title'), + 'link' => array('link'), + 'subtitle' => array('description'), + 'author' => array('creator'), + 'updated' => array('date')); + + /** + * We will be working with multiple namespaces and it is useful to + * keep them together. We will retain support for some common RSS1.0 modules + * @var array + */ + protected $namespaces = array( + 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'rss' => 'http://purl.org/net/rss1.1#', + 'dc' => 'http://purl.org/rss/1.0/modules/dc/', + 'content' => 'http://purl.org/rss/1.0/modules/content/', + 'sy' => 'http://web.resource.org/rss/1.0/modules/syndication/'); + + /** + * Our constructor does nothing more than its parent. + * + * @param DOMDocument $xml A DOM object representing the feed + * @param bool (optional) $string Whether or not to validate this feed + */ + function __construct(DOMDocument $model, $strict = false) + { + $this->model = $model; + + if ($strict) { + $validate = $this->model->relaxNGValidate(self::getSchemaDir . + DIRECTORY_SEPARATOR . $this->relax); + if (! $validate) { + throw new XML_Feed_Parser_Exception('Failed required validation'); + } + } + + $this->xpath = new DOMXPath($model); + foreach ($this->namespaces as $key => $value) { + $this->xpath->registerNamespace($key, $value); + } + $this->numberEntries = $this->count('item'); + } + + /** + * Attempts to identify an element by ID given by the rdf:about attribute + * + * This is not really something that will work with RSS1.1 as it does not have + * clear restrictions on the global uniqueness of IDs. We will employ the + * _very_ hit and miss method of selecting entries based on the rdf:about + * attribute. Please note that this is even more hit and miss with RSS1.1 than + * with RSS1.0 since RSS1.1 does not require the rdf:about attribute for items. + * + * @param string $id any valid ID. + * @return XML_Feed_Parser_RSS1Element + */ + function getEntryById($id) + { + if (isset($this->idMappings[$id])) { + return $this->entries[$this->idMappings[$id]]; + } + + $entries = $this->xpath->query("//rss:item[@rdf:about='$id']"); + if ($entries->length > 0) { + $classname = $this->itemClass; + $entry = new $classname($entries->item(0), $this); + return $entry; + } + return false; + } + + /** + * Get details of the image associated with the feed. + * + * @return array|false an array simply containing the child elements + */ + protected function getImage() + { + $images = $this->model->getElementsByTagName('image'); + if ($images->length > 0) { + $image = $images->item(0); + $details = array(); + if ($image->hasChildNodes()) { + $details = array( + 'title' => $image->getElementsByTagName('title')->item(0)->value, + 'url' => $image->getElementsByTagName('url')->item(0)->value); + if ($image->getElementsByTagName('link')->length > 0) { + $details['link'] = + $image->getElementsByTagName('link')->item(0)->value; + } + } else { + $details = array('title' => false, + 'link' => false, + 'url' => $image->attributes->getNamedItem('resource')->nodeValue); + } + $details = array_merge($details, + array('description' => false, 'height' => false, 'width' => false)); + if (! empty($details)) { + return $details; + } + } + return false; + } + + /** + * The textinput element is little used, but in the interests of + * completeness we will support it. + * + * @return array|false + */ + protected function getTextInput() + { + $inputs = $this->model->getElementsByTagName('textinput'); + if ($inputs->length > 0) { + $input = $inputs->item(0); + $results = array(); + $results['title'] = isset( + $input->getElementsByTagName('title')->item(0)->value) ? + $input->getElementsByTagName('title')->item(0)->value : null; + $results['description'] = isset( + $input->getElementsByTagName('description')->item(0)->value) ? + $input->getElementsByTagName('description')->item(0)->value : null; + $results['name'] = isset( + $input->getElementsByTagName('name')->item(0)->value) ? + $input->getElementsByTagName('name')->item(0)->value : null; + $results['link'] = isset( + $input->getElementsByTagName('link')->item(0)->value) ? + $input->getElementsByTagName('link')->item(0)->value : null; + if (empty($results['link']) and + $input->attributes->getNamedItem('resource')) { + $results['link'] = $input->attributes->getNamedItem('resource')->nodeValue; + } + if (! empty($results)) { + return $results; + } + } + return false; + } + + /** + * Attempts to discern authorship + * + * Dublin Core provides the dc:creator, dc:contributor, and dc:publisher + * elements for defining authorship in RSS1. We will try each of those in + * turn in order to simulate the atom author element and will return it + * as text. + * + * @return array|false + */ + function getAuthor() + { + $options = array('creator', 'contributor', 'publisher'); + foreach ($options as $element) { + $test = $this->model->getElementsByTagName($element); + if ($test->length > 0) { + return $test->item(0)->value; + } + } + return false; + } + + /** + * Retrieve a link + * + * In RSS1 a link is a text element but in order to ensure that we resolve + * URLs properly we have a special function for them. + * + * @return string + */ + function getLink($offset = 0, $attribute = 'href', $params = false) + { + $links = $this->model->getElementsByTagName('link'); + if ($links->length <= $offset) { + return false; + } + $link = $links->item($offset); + return $this->addBase($link->nodeValue, $link); + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS11Element.php b/tools/pear_xml_parser/Parser/RSS11Element.php new file mode 100644 index 000000000..9922cb719 --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS11Element.php @@ -0,0 +1,151 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS11Element.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/* + * This class provides support for RSS 1.1 entries. It will usually be called by + * XML_Feed_Parser_RSS11 with which it shares many methods. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_RSS11Element extends XML_Feed_Parser_RSS11 +{ + /** + * This will be a reference to the parent object for when we want + * to use a 'fallback' rule + * @var XML_Feed_Parser_RSS1 + */ + protected $parent; + + /** + * Our specific element map + * @var array + */ + protected $map = array( + 'id' => array('Id'), + 'title' => array('Text'), + 'link' => array('Link'), + 'description' => array('Text'), # or dc:description + 'category' => array('Category'), + 'rights' => array('Text'), # dc:rights + 'creator' => array('Text'), # dc:creator + 'publisher' => array('Text'), # dc:publisher + 'contributor' => array('Text'), # dc:contributor + 'date' => array('Date'), # dc:date + 'content' => array('Content') + ); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS1. + * @var array + */ + protected $compatMap = array( + 'content' => array('content'), + 'updated' => array('lastBuildDate'), + 'published' => array('pubdate'), + 'subtitle' => array('description'), + 'updated' => array('date'), + 'author' => array('creator'), + 'contributor' => array('contributor') + ); + + /** + * Store useful information for later. + * + * @param DOMElement $element - this item as a DOM element + * @param XML_Feed_Parser_RSS1 $parent - the feed of which this is a member + */ + function __construct(DOMElement $element, $parent, $xmlBase = '') + { + $this->model = $element; + $this->parent = $parent; + } + + /** + * If an rdf:about attribute is specified, return that as an ID + * + * There is no established way of showing an ID for an RSS1 entry. We will + * simulate it using the rdf:about attribute of the entry element. This cannot + * be relied upon for unique IDs but may prove useful. + * + * @return string|false + */ + function getId() + { + if ($this->model->attributes->getNamedItem('about')) { + return $this->model->attributes->getNamedItem('about')->nodeValue; + } + return false; + } + + /** + * Return the entry's content + * + * The official way to include full content in an RSS1 entry is to use + * the content module's element 'encoded'. Often, however, the 'description' + * element is used instead. We will offer that as a fallback. + * + * @return string|false + */ + function getContent() + { + $options = array('encoded', 'description'); + foreach ($options as $element) { + $test = $this->model->getElementsByTagName($element); + if ($test->length == 0) { + continue; + } + if ($test->item(0)->hasChildNodes()) { + $value = ''; + foreach ($test->item(0)->childNodes as $child) { + if ($child instanceof DOMText) { + $value .= $child->nodeValue; + } else { + $simple = simplexml_import_dom($child); + $value .= $simple->asXML(); + } + } + return $value; + } else if ($test->length > 0) { + return $test->item(0)->nodeValue; + } + } + return false; + } + + /** + * How RSS1.1 should support for enclosures is not clear. For now we will return + * false. + * + * @return false + */ + function getEnclosure() + { + return false; + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS1Element.php b/tools/pear_xml_parser/Parser/RSS1Element.php new file mode 100644 index 000000000..7cf02ca00 --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS1Element.php @@ -0,0 +1,116 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS1Element.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/* + * This class provides support for RSS 1.0 entries. It will usually be called by + * XML_Feed_Parser_RSS1 with which it shares many methods. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_RSS1Element extends XML_Feed_Parser_RSS1 +{ + /** + * This will be a reference to the parent object for when we want + * to use a 'fallback' rule + * @var XML_Feed_Parser_RSS1 + */ + protected $parent; + + /** + * Our specific element map + * @var array + */ + protected $map = array( + 'id' => array('Id'), + 'title' => array('Text'), + 'link' => array('Link'), + 'description' => array('Text'), # or dc:description + 'category' => array('Category'), + 'rights' => array('Text'), # dc:rights + 'creator' => array('Text'), # dc:creator + 'publisher' => array('Text'), # dc:publisher + 'contributor' => array('Text'), # dc:contributor + 'date' => array('Date'), # dc:date + 'content' => array('Content') + ); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS1. + * @var array + */ + protected $compatMap = array( + 'content' => array('content'), + 'updated' => array('lastBuildDate'), + 'published' => array('pubdate'), + 'subtitle' => array('description'), + 'updated' => array('date'), + 'author' => array('creator'), + 'contributor' => array('contributor') + ); + + /** + * Store useful information for later. + * + * @param DOMElement $element - this item as a DOM element + * @param XML_Feed_Parser_RSS1 $parent - the feed of which this is a member + */ + function __construct(DOMElement $element, $parent, $xmlBase = '') + { + $this->model = $element; + $this->parent = $parent; + } + + /** + * If an rdf:about attribute is specified, return it as an ID + * + * There is no established way of showing an ID for an RSS1 entry. We will + * simulate it using the rdf:about attribute of the entry element. This cannot + * be relied upon for unique IDs but may prove useful. + * + * @return string|false + */ + function getId() + { + if ($this->model->attributes->getNamedItem('about')) { + return $this->model->attributes->getNamedItem('about')->nodeValue; + } + return false; + } + + /** + * How RSS1 should support for enclosures is not clear. For now we will return + * false. + * + * @return false + */ + function getEnclosure() + { + return false; + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS2.php b/tools/pear_xml_parser/Parser/RSS2.php new file mode 100644 index 000000000..ada5f1cac --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS2.php @@ -0,0 +1,334 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS2.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This class handles RSS2 feeds. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_RSS2 extends XML_Feed_Parser_Type +{ + /** + * The URI of the RelaxNG schema used to (optionally) validate the feed + * @var string + */ + private $relax = 'rss20.rnc'; + + /** + * We're likely to use XPath, so let's keep it global + * @var DOMXPath + */ + protected $xpath; + + /** + * The feed type we are parsing + * @var string + */ + public $version = 'RSS 2.0'; + + /** + * The class used to represent individual items + * @var string + */ + protected $itemClass = 'XML_Feed_Parser_RSS2Element'; + + /** + * The element containing entries + * @var string + */ + protected $itemElement = 'item'; + + /** + * Here we map those elements we're not going to handle individually + * to the constructs they are. The optional second parameter in the array + * tells the parser whether to 'fall back' (not apt. at the feed level) or + * fail if the element is missing. If the parameter is not set, the function + * will simply return false and leave it to the client to decide what to do. + * @var array + */ + protected $map = array( + 'ttl' => array('Text'), + 'pubDate' => array('Date'), + 'lastBuildDate' => array('Date'), + 'title' => array('Text'), + 'link' => array('Link'), + 'description' => array('Text'), + 'language' => array('Text'), + 'copyright' => array('Text'), + 'managingEditor' => array('Text'), + 'webMaster' => array('Text'), + 'category' => array('Text'), + 'generator' => array('Text'), + 'docs' => array('Text'), + 'ttl' => array('Text'), + 'image' => array('Image'), + 'skipDays' => array('skipDays'), + 'skipHours' => array('skipHours')); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS2. + * @var array + */ + protected $compatMap = array( + 'title' => array('title'), + 'rights' => array('copyright'), + 'updated' => array('lastBuildDate'), + 'subtitle' => array('description'), + 'date' => array('pubDate'), + 'author' => array('managingEditor')); + + protected $namespaces = array( + 'dc' => 'http://purl.org/rss/1.0/modules/dc/', + 'content' => 'http://purl.org/rss/1.0/modules/content/'); + + /** + * Our constructor does nothing more than its parent. + * + * @param DOMDocument $xml A DOM object representing the feed + * @param bool (optional) $string Whether or not to validate this feed + */ + function __construct(DOMDocument $model, $strict = false) + { + $this->model = $model; + + if ($strict) { + if (! $this->model->relaxNGValidate($this->relax)) { + throw new XML_Feed_Parser_Exception('Failed required validation'); + } + } + + $this->xpath = new DOMXPath($this->model); + foreach ($this->namespaces as $key => $value) { + $this->xpath->registerNamespace($key, $value); + } + $this->numberEntries = $this->count('item'); + } + + /** + * Retrieves an entry by ID, if the ID is specified with the guid element + * + * This is not really something that will work with RSS2 as it does not have + * clear restrictions on the global uniqueness of IDs. But we can emulate + * it by allowing access based on the 'guid' element. If DOMXPath::evaluate + * is available, we also use that to store a reference to the entry in the array + * used by getEntryByOffset so that method does not have to seek out the entry + * if it's requested that way. + * + * @param string $id any valid ID. + * @return XML_Feed_Parser_RSS2Element + */ + function getEntryById($id) + { + if (isset($this->idMappings[$id])) { + return $this->entries[$this->idMappings[$id]]; + } + + $entries = $this->xpath->query("//item[guid='$id']"); + if ($entries->length > 0) { + $entry = new $this->itemElement($entries->item(0), $this); + if (in_array('evaluate', get_class_methods($this->xpath))) { + $offset = $this->xpath->evaluate("count(preceding-sibling::item)", $entries->item(0)); + $this->entries[$offset] = $entry; + } + $this->idMappings[$id] = $entry; + return $entry; + } + } + + /** + * Get a category from the element + * + * The category element is a simple text construct which can occur any number + * of times. We allow access by offset or access to an array of results. + * + * @param string $call for compatibility with our overloading + * @param array $arguments - arg 0 is the offset, arg 1 is whether to return as array + * @return string|array|false + */ + function getCategory($call, $arguments = array()) + { + $categories = $this->model->getElementsByTagName('category'); + $offset = empty($arguments[0]) ? 0 : $arguments[0]; + $array = empty($arguments[1]) ? false : true; + if ($categories->length <= $offset) { + return false; + } + if ($array) { + $list = array(); + foreach ($categories as $category) { + array_push($list, $category->nodeValue); + } + return $list; + } + return $categories->item($offset)->nodeValue; + } + + /** + * Get details of the image associated with the feed. + * + * @return array|false an array simply containing the child elements + */ + protected function getImage() + { + $images = $this->model->getElementsByTagName('image'); + if ($images->length > 0) { + $image = $images->item(0); + $desc = $image->getElementsByTagName('description'); + $description = $desc->length ? $desc->item(0)->nodeValue : false; + $heigh = $image->getElementsByTagName('height'); + $height = $heigh->length ? $heigh->item(0)->nodeValue : false; + $widt = $image->getElementsByTagName('width'); + $width = $widt->length ? $widt->item(0)->nodeValue : false; + return array( + 'title' => $image->getElementsByTagName('title')->item(0)->nodeValue, + 'link' => $image->getElementsByTagName('link')->item(0)->nodeValue, + 'url' => $image->getElementsByTagName('url')->item(0)->nodeValue, + 'description' => $description, + 'height' => $height, + 'width' => $width); + } + return false; + } + + /** + * The textinput element is little used, but in the interests of + * completeness... + * + * @return array|false + */ + function getTextInput() + { + $inputs = $this->model->getElementsByTagName('input'); + if ($inputs->length > 0) { + $input = $inputs->item(0); + return array( + 'title' => $input->getElementsByTagName('title')->item(0)->value, + 'description' => + $input->getElementsByTagName('description')->item(0)->value, + 'name' => $input->getElementsByTagName('name')->item(0)->value, + 'link' => $input->getElementsByTagName('link')->item(0)->value); + } + return false; + } + + /** + * Utility function for getSkipDays and getSkipHours + * + * This is a general function used by both getSkipDays and getSkipHours. It simply + * returns an array of the values of the children of the appropriate tag. + * + * @param string $tagName The tag name (getSkipDays or getSkipHours) + * @return array|false + */ + protected function getSkips($tagName) + { + $hours = $this->model->getElementsByTagName($tagName); + if ($hours->length == 0) { + return false; + } + $skipHours = array(); + foreach($hours->item(0)->childNodes as $hour) { + if ($hour instanceof DOMElement) { + array_push($skipHours, $hour->nodeValue); + } + } + return $skipHours; + } + + /** + * Retrieve skipHours data + * + * The skiphours element provides a list of hours on which this feed should + * not be checked. We return an array of those hours (integers, 24 hour clock) + * + * @return array + */ + function getSkipHours() + { + return $this->getSkips('skipHours'); + } + + /** + * Retrieve skipDays data + * + * The skipdays element provides a list of days on which this feed should + * not be checked. We return an array of those days. + * + * @return array + */ + function getSkipDays() + { + return $this->getSkips('skipDays'); + } + + /** + * Return content of the little-used 'cloud' element + * + * The cloud element is rarely used. It is designed to provide some details + * of a location to update the feed. + * + * @return array an array of the attributes of the element + */ + function getCloud() + { + $cloud = $this->model->getElementsByTagName('cloud'); + if ($cloud->length == 0) { + return false; + } + $cloudData = array(); + foreach ($cloud->item(0)->attributes as $attribute) { + $cloudData[$attribute->name] = $attribute->value; + } + return $cloudData; + } + + /** + * Get link URL + * + * In RSS2 a link is a text element but in order to ensure that we resolve + * URLs properly we have a special function for them. We maintain the + * parameter used by the atom getLink method, though we only use the offset + * parameter. + * + * @param int $offset The position of the link within the feed. Starts from 0 + * @param string $attribute The attribute of the link element required + * @param array $params An array of other parameters. Not used. + * @return string + */ + function getLink($offset, $attribute = 'href', $params = array()) + { + $links = $this->model->getElementsByTagName('link'); + + if ($links->length <= $offset) { + return false; + } + $link = $links->item($offset); + return $this->addBase($link->nodeValue, $link); + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/RSS2Element.php b/tools/pear_xml_parser/Parser/RSS2Element.php new file mode 100644 index 000000000..0022fd74e --- /dev/null +++ b/tools/pear_xml_parser/Parser/RSS2Element.php @@ -0,0 +1,171 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: RSS2Element.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This class provides support for RSS 2.0 entries. It will usually be + * called by XML_Feed_Parser_RSS2 with which it shares many methods. + * + * @author James Stewart + * @version Release: 1.0.2 + * @package XML_Feed_Parser + */ +class XML_Feed_Parser_RSS2Element extends XML_Feed_Parser_RSS2 +{ + /** + * This will be a reference to the parent object for when we want + * to use a 'fallback' rule + * @var XML_Feed_Parser_RSS2 + */ + protected $parent; + + /** + * Our specific element map + * @var array + */ + protected $map = array( + 'title' => array('Text'), + 'guid' => array('Guid'), + 'description' => array('Text'), + 'author' => array('Text'), + 'comments' => array('Text'), + 'enclosure' => array('Enclosure'), + 'pubDate' => array('Date'), + 'source' => array('Source'), + 'link' => array('Text'), + 'content' => array('Content')); + + /** + * Here we map some elements to their atom equivalents. This is going to be + * quite tricky to pull off effectively (and some users' methods may vary) + * but is worth trying. The key is the atom version, the value is RSS2. + * @var array + */ + protected $compatMap = array( + 'id' => array('guid'), + 'updated' => array('lastBuildDate'), + 'published' => array('pubdate'), + 'guidislink' => array('guid', 'ispermalink'), + 'summary' => array('description')); + + /** + * Store useful information for later. + * + * @param DOMElement $element - this item as a DOM element + * @param XML_Feed_Parser_RSS2 $parent - the feed of which this is a member + */ + function __construct(DOMElement $element, $parent, $xmlBase = '') + { + $this->model = $element; + $this->parent = $parent; + } + + /** + * Get the value of the guid element, if specified + * + * guid is the closest RSS2 has to atom's ID. It is usually but not always a + * URI. The one attribute that RSS2 can posess is 'ispermalink' which specifies + * whether the guid is itself dereferencable. Use of guid is not obligatory, + * but is advisable. To get the guid you would call $item->id() (for atom + * compatibility) or $item->guid(). To check if this guid is a permalink call + * $item->guid("ispermalink"). + * + * @param string $method - the method name being called + * @param array $params - parameters required + * @return string the guid or value of ispermalink + */ + protected function getGuid($method, $params) + { + $attribute = (isset($params[0]) and $params[0] == 'ispermalink') ? + true : false; + $tag = $this->model->getElementsByTagName('guid'); + if ($tag->length > 0) { + if ($attribute) { + if ($tag->hasAttribute("ispermalink")) { + return $tag->getAttribute("ispermalink"); + } + } + return $tag->item(0)->nodeValue; + } + return false; + } + + /** + * Access details of file enclosures + * + * The RSS2 spec is ambiguous as to whether an enclosure element must be + * unique in a given entry. For now we will assume it needn't, and allow + * for an offset. + * + * @param string $method - the method being called + * @param array $parameters - we expect the first of these to be our offset + * @return array|false + */ + protected function getEnclosure($method, $parameters) + { + $encs = $this->model->getElementsByTagName('enclosure'); + $offset = isset($parameters[0]) ? $parameters[0] : 0; + if ($encs->length > $offset) { + try { + if (! $encs->item($offset)->hasAttribute('url')) { + return false; + } + $attrs = $encs->item($offset)->attributes; + return array( + 'url' => $attrs->getNamedItem('url')->value, + 'length' => $attrs->getNamedItem('length')->value, + 'type' => $attrs->getNamedItem('type')->value); + } catch (Exception $e) { + return false; + } + } + return false; + } + + /** + * Get the entry source if specified + * + * source is an optional sub-element of item. Like atom:source it tells + * us about where the entry came from (eg. if it's been copied from another + * feed). It is not a rich source of metadata in the same way as atom:source + * and while it would be good to maintain compatibility by returning an + * XML_Feed_Parser_RSS2 element, it makes a lot more sense to return an array. + * + * @return array|false + */ + protected function getSource() + { + $get = $this->model->getElementsByTagName('source'); + if ($get->length) { + $source = $get->item(0); + $array = array( + 'content' => $source->nodeValue); + foreach ($source->attributes as $attribute) { + $array[$attribute->name] = $attribute->value; + } + return $array; + } + return false; + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/Type.php b/tools/pear_xml_parser/Parser/Type.php new file mode 100644 index 000000000..47b658926 --- /dev/null +++ b/tools/pear_xml_parser/Parser/Type.php @@ -0,0 +1,441 @@ + + * @copyright 2005 James Stewart + * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL 2.1 + * @version CVS: $Id: Type.php 6844 2011-06-03 14:46:51Z dMetzger $ + * @link http://pear.php.net/package/XML_Feed_Parser/ + */ + +/** + * This abstract class provides some general methods that are likely to be + * implemented exactly the same way for all feed types. + * + * @package XML_Feed_Parser + * @author James Stewart + * @version Release: 1.0.2 + */ +abstract class XML_Feed_Parser_Type +{ + /** + * Where we store our DOM object for this feed + * @var DOMDocument + */ + public $model; + + /** + * For iteration we'll want a count of the number of entries + * @var int + */ + public $numberEntries; + + /** + * Where we store our entry objects once instantiated + * @var array + */ + public $entries = array(); + + /** + * Proxy to allow use of element names as method names + * + * We are not going to provide methods for every entry type so this + * function will allow for a lot of mapping. We rely pretty heavily + * on this to handle our mappings between other feed types and atom. + * + * @param string $call - the method attempted + * @param array $arguments - arguments to that method + * @return mixed + */ + function __call($call, $arguments = array()) + { + if (! is_array($arguments)) { + $arguments = array(); + } + + if (isset($this->compatMap[$call])) { + $tempMap = $this->compatMap; + $tempcall = array_pop($tempMap[$call]); + if (! empty($tempMap)) { + $arguments = array_merge($arguments, $tempMap[$call]); + } + $call = $tempcall; + } + + /* To be helpful, we allow a case-insensitive search for this method */ + if (! isset($this->map[$call])) { + foreach (array_keys($this->map) as $key) { + if (strtoupper($key) == strtoupper($call)) { + $call = $key; + break; + } + } + } + + if (empty($this->map[$call])) { + return false; + } + + $method = 'get' . $this->map[$call][0]; + if ($method == 'getLink') { + $offset = empty($arguments[0]) ? 0 : $arguments[0]; + $attribute = empty($arguments[1]) ? 'href' : $arguments[1]; + $params = isset($arguments[2]) ? $arguments[2] : array(); + return $this->getLink($offset, $attribute, $params); + } + if (method_exists($this, $method)) { + return $this->$method($call, $arguments); + } + + return false; + } + + /** + * Proxy to allow use of element names as attribute names + * + * For many elements variable-style access will be desirable. This function + * provides for that. + * + * @param string $value - the variable required + * @return mixed + */ + function __get($value) + { + return $this->__call($value, array()); + } + + /** + * Utility function to help us resolve xml:base values + * + * We have other methods which will traverse the DOM and work out the different + * xml:base declarations we need to be aware of. We then need to combine them. + * If a declaration starts with a protocol then we restart the string. If it + * starts with a / then we add on to the domain name. Otherwise we simply tag + * it on to the end. + * + * @param string $base - the base to add the link to + * @param string $link + */ + function combineBases($base, $link) + { + if (preg_match('/^[A-Za-z]+:\/\//', $link)) { + return $link; + } else if (preg_match('/^\//', $link)) { + /* Extract domain and suffix link to that */ + preg_match('/^([A-Za-z]+:\/\/.*)?\/*/', $base, $results); + $firstLayer = $results[0]; + return $firstLayer . "/" . $link; + } else if (preg_match('/^\.\.\//', $base)) { + /* Step up link to find place to be */ + preg_match('/^((\.\.\/)+)(.*)$/', $link, $bases); + $suffix = $bases[3]; + $count = preg_match_all('/\.\.\//', $bases[1], $steps); + $url = explode("/", $base); + for ($i = 0; $i <= $count; $i++) { + array_pop($url); + } + return implode("/", $url) . "/" . $suffix; + } else if (preg_match('/^(?!\/$)/', $base)) { + $base = preg_replace('/(.*\/).*$/', '$1', $base) ; + return $base . $link; + } else { + /* Just stick it on the end */ + return $base . $link; + } + } + + /** + * Determine whether we need to apply our xml:base rules + * + * Gets us the xml:base data and then processes that with regard + * to our current link. + * + * @param string + * @param DOMElement + * @return string + */ + function addBase($link, $element) + { + if (preg_match('/^[A-Za-z]+:\/\//', $link)) { + return $link; + } + + return $this->combineBases($element->baseURI, $link); + } + + /** + * Get an entry by its position in the feed, starting from zero + * + * As well as allowing the items to be iterated over we want to allow + * users to be able to access a specific entry. This is one of two ways of + * doing that, the other being by ID. + * + * @param int $offset + * @return XML_Feed_Parser_RSS1Element + */ + function getEntryByOffset($offset) + { + if (! isset($this->entries[$offset])) { + $entries = $this->model->getElementsByTagName($this->itemElement); + if ($entries->length > $offset) { + $xmlBase = $entries->item($offset)->baseURI; + $this->entries[$offset] = new $this->itemClass( + $entries->item($offset), $this, $xmlBase); + if ($id = $this->entries[$offset]->id) { + @$this->idMappings[$id] = $this->entries[$offset]; + } + } else { + throw new XML_Feed_Parser_Exception('No entries found'); + } + } + + return $this->entries[$offset]; + } + + /** + * Return a date in seconds since epoch. + * + * Get a date construct. We use PHP's strtotime to return it as a unix datetime, which + * is the number of seconds since 1970-01-01 00:00:00. + * + * @link http://php.net/strtotime + * @param string $method The name of the date construct we want + * @param array $arguments Included for compatibility with our __call usage + * @return int|false datetime + */ + protected function getDate($method, $arguments) + { + $time = $this->model->getElementsByTagName($method); + if ($time->length == 0) { + return false; + } + return strtotime($time->item(0)->nodeValue); + } + + /** + * Get a text construct. + * + * @param string $method The name of the text construct we want + * @param array $arguments Included for compatibility with our __call usage + * @return string + */ + protected function getText($method, $arguments = array()) + { + $tags = $this->model->getElementsByTagName($method); + if ($tags->length > 0) { + $value = $tags->item(0)->nodeValue; + return $value; + } + return false; + } + + /** + * Apply various rules to retrieve category data. + * + * There is no single way of declaring a category in RSS1/1.1 as there is in RSS2 + * and Atom. Instead the usual approach is to use the dublin core namespace to + * declare categories. For example delicious use both: + * PEAR and: + * + * to declare a categorisation of 'PEAR'. + * + * We need to be sensitive to this where possible. + * + * @param string $call for compatibility with our overloading + * @param array $arguments - arg 0 is the offset, arg 1 is whether to return as array + * @return string|array|false + */ + protected function getCategory($call, $arguments) + { + $categories = $this->model->getElementsByTagName('subject'); + $offset = empty($arguments[0]) ? 0 : $arguments[0]; + $array = empty($arguments[1]) ? false : true; + if ($categories->length <= $offset) { + return false; + } + if ($array) { + $list = array(); + foreach ($categories as $category) { + array_push($list, $category->nodeValue); + } + return $list; + } + return $categories->item($offset)->nodeValue; + } + + /** + * Count occurrences of an element + * + * This function will tell us how many times the element $type + * appears at this level of the feed. + * + * @param string $type the element we want to get a count of + * @return int + */ + protected function count($type) + { + if ($tags = $this->model->getElementsByTagName($type)) { + return $tags->length; + } + return 0; + } + + /** + * Part of our xml:base processing code + * + * We need a couple of methods to access XHTML content stored in feeds. + * This is because we dereference all xml:base references before returning + * the element. This method handles the attributes. + * + * @param DOMElement $node The DOM node we are iterating over + * @return string + */ + function processXHTMLAttributes($node) { + $return = ''; + foreach ($node->attributes as $attribute) { + if ($attribute->name == 'src' or $attribute->name == 'href') { + $attribute->value = $this->addBase($attribute->value, $attribute); + } + if ($attribute->name == 'base') { + continue; + } + $return .= $attribute->name . '="' . $attribute->value .'" '; + } + if (! empty($return)) { + return ' ' . trim($return); + } + return ''; + } + + /** + * Part of our xml:base processing code + * + * We need a couple of methods to access XHTML content stored in feeds. + * This is because we dereference all xml:base references before returning + * the element. This method recurs through the tree descending from the node + * and builds our string + * + * @param DOMElement $node The DOM node we are processing + * @return string + */ + function traverseNode($node) + { + $content = ''; + + /* Add the opening of this node to the content */ + if ($node instanceof DOMElement) { + $content .= '<' . $node->tagName . + $this->processXHTMLAttributes($node) . '>'; + } + + /* Process children */ + if ($node->hasChildNodes()) { + foreach ($node->childNodes as $child) { + $content .= $this->traverseNode($child); + } + } + + if ($node instanceof DOMText) { + $content .= htmlentities($node->nodeValue); + } + + /* Add the closing of this node to the content */ + if ($node instanceof DOMElement) { + $content .= 'tagName . '>'; + } + + return $content; + } + + /** + * Get content from RSS feeds (atom has its own implementation) + * + * The official way to include full content in an RSS1 entry is to use + * the content module's element 'encoded', and RSS2 feeds often duplicate that. + * Often, however, the 'description' element is used instead. We will offer that + * as a fallback. Atom uses its own approach and overrides this method. + * + * @return string|false + */ + protected function getContent() + { + $options = array('encoded', 'description'); + foreach ($options as $element) { + $test = $this->model->getElementsByTagName($element); + if ($test->length == 0) { + continue; + } + if ($test->item(0)->hasChildNodes()) { + $value = ''; + foreach ($test->item(0)->childNodes as $child) { + if ($child instanceof DOMText) { + $value .= $child->nodeValue; + } else { + $simple = simplexml_import_dom($child); + $value .= $simple->asXML(); + } + } + return $value; + } else if ($test->length > 0) { + return $test->item(0)->nodeValue; + } + } + return false; + } + + /** + * Checks if this element has a particular child element. + * + * @param String + * @param Integer + * @return bool + **/ + function hasKey($name, $offset = 0) + { + $search = $this->model->getElementsByTagName($name); + return $search->length > $offset; + } + + /** + * Return an XML serialization of the feed, should it be required. Most + * users however, will already have a serialization that they used when + * instantiating the object. + * + * @return string XML serialization of element + */ + function __toString() + { + $simple = simplexml_import_dom($this->model); + return $simple->asXML(); + } + + /** + * Get directory holding RNG schemas. Method is based on that + * found in Contact_AddressBook. + * + * @return string PEAR data directory. + * @access public + * @static + */ + static function getSchemaDir() + { + require_once 'PEAR/Config.php'; + $config = new PEAR_Config; + return $config->get('data_dir') . '/XML_Feed_Parser/schemas'; + } +} + +?> \ No newline at end of file diff --git a/tools/pear_xml_parser/Parser/index.php b/tools/pear_xml_parser/Parser/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/tools/pear_xml_parser/Parser/index.php @@ -0,0 +1,11 @@ + + * @author Uwe Tews + * @package Smarty + * @version 3.0.7 + */ + +/** + * define shorthand directory separator constant + */ +if (!defined('DS')) { + define('DS', DIRECTORY_SEPARATOR); +} + +/** + * set SMARTY_DIR to absolute path to Smarty library files. + * Sets SMARTY_DIR only if user application has not already defined it. + */ +if (!defined('SMARTY_DIR')) { + define('SMARTY_DIR', dirname(__FILE__) . DS); +} + +/** + * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. + * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. + */ +if (!defined('SMARTY_SYSPLUGINS_DIR')) { + define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DS); +} +if (!defined('SMARTY_PLUGINS_DIR')) { + define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS); +} +if (!defined('SMARTY_RESOURCE_CHAR_SET')) { + define('SMARTY_RESOURCE_CHAR_SET', 'UTF-8'); +} +if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { + define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); +} + +/** + * register the class autoloader + */ +if (!defined('SMARTY_SPL_AUTOLOAD')) { + define('SMARTY_SPL_AUTOLOAD', 0); +} + +/* PrestaShop +if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) { + $registeredAutoLoadFunctions = spl_autoload_functions(); + if (!isset($registeredAutoLoadFunctions['spl_autoload'])) { + spl_autoload_register(); + } +} else { + spl_autoload_register('smartyAutoload'); +} + End */ +/** + * This is the main Smarty class + */ +class Smarty extends Smarty_Internal_Data { + /** + * constant definitions + */ + // smarty version + const SMARTY_VERSION = 'Smarty-3.0.7'; + //define variable scopes + const SCOPE_LOCAL = 0; + const SCOPE_PARENT = 1; + const SCOPE_ROOT = 2; + const SCOPE_GLOBAL = 3; + // define caching modes + const CACHING_OFF = 0; + const CACHING_LIFETIME_CURRENT = 1; + const CACHING_LIFETIME_SAVED = 2; + /** modes for handling of "" tags in templates. **/ + const PHP_PASSTHRU = 0; //-> print tags as plain text + const PHP_QUOTE = 1; //-> escape tags as entities + const PHP_REMOVE = 2; //-> escape tags as entities + const PHP_ALLOW = 3; //-> escape tags as entities + // filter types + const FILTER_POST = 'post'; + const FILTER_PRE = 'pre'; + const FILTER_OUTPUT = 'output'; + const FILTER_VARIABLE = 'variable'; + // plugin types + const PLUGIN_FUNCTION = 'function'; + const PLUGIN_BLOCK = 'block'; + const PLUGIN_COMPILER = 'compiler'; + const PLUGIN_MODIFIER = 'modifier'; + + /** + * static variables + */ + // assigned global tpl vars + static $global_tpl_vars = array(); + + /** + * variables + */ + // auto literal on delimiters with whitspace + public $auto_literal = true; + // display error on not assigned variables + public $error_unassigned = false; + // template directory + public $template_dir = null; + // default template handler + public $default_template_handler_func = null; + // compile directory + public $compile_dir = null; + // plugins directory + public $plugins_dir = null; + // cache directory + public $cache_dir = null; + // config directory + public $config_dir = null; + // force template compiling? + public $force_compile = false; + // check template for modifications? + public $compile_check = true; + // locking concurrent compiles + public $compile_locking = true; + // use sub dirs for compiled/cached files? + public $use_sub_dirs = false; + // compile_error? + public $compile_error = false; + // caching enabled + public $caching = false; + // merge compiled includes + public $merge_compiled_includes = false; + // cache lifetime + public $cache_lifetime = 3600; + // force cache file creation + public $force_cache = false; + // cache_id + public $cache_id = null; + // compile_id + public $compile_id = null; + // template delimiters + public $left_delimiter = "{"; + public $right_delimiter = "}"; + // security + public $security_class = 'Smarty_Security'; + public $security_policy = null; + public $php_handling = self::PHP_PASSTHRU; + public $allow_php_tag = false; + public $allow_php_templates = false; + public $direct_access_security = true; + public $trusted_dir = array(); + // debug mode + public $debugging = false; + public $debugging_ctrl = 'NONE'; + public $smarty_debug_id = 'SMARTY_DEBUG'; + public $debug_tpl = null; + // When set, smarty does uses this value as error_reporting-level. + public $error_reporting = null; + // config var settings + public $config_overwrite = true; //Controls whether variables with the same name overwrite each other. + public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean + public $config_read_hidden = false; //Controls whether hidden config sections/vars are read from the file. + // config vars + public $config_vars = array(); + // assigned tpl vars + public $tpl_vars = array(); + // dummy parent object + public $parent = null; + // global template functions + public $template_functions = array(); + // resource type used if none given + public $default_resource_type = 'file'; + // caching type + public $caching_type = 'file'; + // internal cache resource types + public $cache_resource_types = array('file'); + // internal config properties + public $properties = array(); + // config type + public $default_config_type = 'file'; + // cached template objects + public $template_objects = null; + // check If-Modified-Since headers + public $cache_modified_check = false; + // registered plugins + public $registered_plugins = array(); + // plugin search order + public $plugin_search_order = array('function', 'block', 'compiler', 'class'); + // registered objects + public $registered_objects = array(); + // registered classes + public $registered_classes = array(); + // registered filters + public $registered_filters = array(); + // registered resources + public $registered_resources = array(); + // autoload filter + public $autoload_filters = array(); + // status of filter on variable output + public $variable_filter = true; + // default modifier + public $default_modifiers = array(); + // global internal smarty vars + static $_smarty_vars = array(); + // start time for execution time calculation + public $start_time = 0; + // default file permissions + public $_file_perms = 0644; + // default dir permissions + public $_dir_perms = 0771; + // block tag hierarchy + public $_tag_stack = array(); + // flag if {block} tag is compiled for template inheritance + public $inheritance = false; + // generate deprecated function call notices? + public $deprecation_notices = true; + // Smarty 2 BC + public $_version = self::SMARTY_VERSION; + // self pointer to Smarty object + public $smarty; + + /** + * Class constructor, initializes basic smarty properties + */ + public function __construct() + { + // selfpointer need by some other class methods + $this->smarty = $this; + if (is_callable('mb_internal_encoding')) { + mb_internal_encoding(SMARTY_RESOURCE_CHAR_SET); + } + $this->start_time = microtime(true); + // set default dirs + $this->template_dir = array('.' . DS . 'templates' . DS); + $this->compile_dir = '.' . DS . 'templates_c' . DS; + $this->plugins_dir = array(SMARTY_PLUGINS_DIR); + $this->cache_dir = '.' . DS . 'cache' . DS; + $this->config_dir = '.' . DS . 'configs' . DS; + $this->debug_tpl = SMARTY_DIR . 'debug.tpl'; + if (isset($_SERVER['SCRIPT_NAME'])) { + $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); + } + } + + /** + * Class destructor + */ + public function __destruct() + { + } + + /** + * fetches a rendered Smarty template + * + * @param string $template the resource handle of the template file or template object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $ |null $parent next higher level of Smarty variables + * @return string rendered template output + */ + public function fetch($template, $cache_id = null, $compile_id = null, $parent = null, $display = false) + { + if (!empty($cache_id) && is_object($cache_id)) { + $parent = $cache_id; + $cache_id = null; + } + if ($parent === null) { + // get default Smarty data object + $parent = $this; + } + // create template object if necessary + ($template instanceof $this->template_class)? $_template = $template : + $_template = $this->createTemplate ($template, $cache_id, $compile_id, $parent, false); + if (isset($this->error_reporting)) { + $_smarty_old_error_level = error_reporting($this->error_reporting); + } + // check URL debugging control + if (!$this->debugging && $this->debugging_ctrl == 'URL') { + if (isset($_SERVER['QUERY_STRING'])) { + $_query_string = $_SERVER['QUERY_STRING']; + } else { + $_query_string = ''; + } + if (false !== strpos($_query_string, $this->smarty_debug_id)) { + if (false !== strpos($_query_string, $this->smarty_debug_id . '=on')) { + // enable debugging for this browser session + setcookie('SMARTY_DEBUG', true); + $this->debugging = true; + } elseif (false !== strpos($_query_string, $this->smarty_debug_id . '=off')) { + // disable debugging for this browser session + setcookie('SMARTY_DEBUG', false); + $this->debugging = false; + } else { + // enable debugging for this page + $this->debugging = true; + } + } else { + if (isset($_COOKIE['SMARTY_DEBUG'])) { + $this->debugging = true; + } + } + } + // obtain data for cache modified check + if ($this->cache_modified_check && $this->caching && $display) { + $_isCached = $_template->isCached() && !$_template->has_nocache_code; + if ($_isCached) { + $_gmt_mtime = gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT'; + } else { + $_gmt_mtime = ''; + } + } + // return rendered template + if ((!$this->caching || $_template->resource_object->isEvaluated) && (isset($this->autoload_filters['output']) || isset($this->registered_filters['output']))) { + $_output = Smarty_Internal_Filter_Handler::runFilter('output', $_template->getRenderedTemplate(), $_template); + } else { + $_output = $_template->getRenderedTemplate(); + } + $_template->rendered_content = null; + if (isset($this->error_reporting)) { + error_reporting($_smarty_old_error_level); + } + // display or fetch + if ($display) { + if ($this->caching && $this->cache_modified_check) { + $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3); + if ($_isCached && $_gmt_mtime == $_last_modified_date) { + if (php_sapi_name() == 'cgi') + header('Status: 304 Not Modified'); + else + header('HTTP/1.1 304 Not Modified'); + } else { + header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT'); + echo $_output; + } + } else { + echo $_output; + } + // debug output + if ($this->debugging) { + Smarty_Internal_Debug::display_debug($this); + } + return; + } else { + // return fetched content + return $_output; + } + } + + /** + * displays a Smarty template + * + * @param string $ |object $template the resource handle of the template file or template object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + */ + public function display($template, $cache_id = null, $compile_id = null, $parent = null) + { + // display template + $this->fetch ($template, $cache_id, $compile_id, $parent, true); + } + + /** + * test if cache i valid + * + * @param string $ |object $template the resource handle of the template file or template object + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @return boolean cache status + */ + public function isCached($template, $cache_id = null, $compile_id = null, $parent = null) + { + if ($parent === null) { + $parent = $this; + } + if (!($template instanceof $this->template_class)) { + $template = $this->createTemplate ($template, $cache_id, $compile_id, $parent, false); + } + // return cache status of template + return $template->isCached(); + } + + /** + * creates a data object + * + * @param object $parent next higher level of Smarty variables + * @returns object data object + */ + public function createData($parent = null) + { + return new Smarty_Data($parent, $this); + } + + /** + * creates a template object + * + * @param string $template the resource handle of the template file + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @param boolean $do_clone flag is Smarty object shall be cloned + * @returns object template object + */ + public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) + { + if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) { + $parent = $cache_id; + $cache_id = null; + } + if (!empty($parent) && is_array($parent)) { + $data = $parent; + $parent = null; + } else { + $data = null; + } + if (!is_object($template)) { + // we got a template resource + // already in template cache? + $_templateId = sha1($template . $cache_id . $compile_id); + if (isset($this->template_objects[$_templateId]) && $this->caching) { + // return cached template object + $tpl = $this->template_objects[$_templateId]; + } else { + // create new template object + if ($do_clone) { + $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id); + } else { + $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id); + } + } + } else { + // just return a copy of template class + $tpl = $template; + } + // fill data if present + if (!empty($data) && is_array($data)) { + // set up variable values + foreach ($data as $_key => $_val) { + $tpl->tpl_vars[$_key] = new Smarty_variable($_val); + } + } + return $tpl; + } + + + + /** + * Check if a template resource exists + * + * @param string $resource_name template name + * @return boolean status + */ + function templateExists($resource_name) + { + // create template object + $save = $this->template_objects; + $tpl = new $this->template_class($resource_name, $this); + // check if it does exists + $result = $tpl->isExisting(); + $this->template_objects = $save; + return $result; + } + + /** + * Returns a single or all global variables + * + * @param object $smarty + * @param string $varname variable name or null + * @return string variable value or or array of variables + */ + function getGlobal($varname = null) + { + if (isset($varname)) { + if (isset(self::$global_tpl_vars[$varname])) { + return self::$global_tpl_vars[$varname]->value; + } else { + return ''; + } + } else { + $_result = array(); + foreach (self::$global_tpl_vars AS $key => $var) { + $_result[$key] = $var->value; + } + return $_result; + } + } + + /** + * Empty cache folder + * + * @param integer $exp_time expiration time + * @param string $type resource type + * @return integer number of cache files deleted + */ + function clearAllCache($exp_time = null, $type = null) + { + // load cache resource and call clearAll + return $this->loadCacheResource($type)->clearAll($exp_time); + } + + /** + * Empty cache for a specific template + * + * @param string $template_name template name + * @param string $cache_id cache id + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @param string $type resource type + * @return integer number of cache files deleted + */ + function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) + { + // load cache resource and call clear + return $this->loadCacheResource($type)->clear($template_name, $cache_id, $compile_id, $exp_time); + } + + /** + * Loads security class and enables security + */ + public function enableSecurity($security_class = null) + { + if ($security_class instanceof Smarty_Security) { + $this->security_policy = $security_class; + return; + } + if ($security_class == null) { + $security_class = $this->security_class; + } + if (class_exists($security_class)) { + $this->security_policy = new $security_class($this); + } else { + throw new SmartyException("Security class '$security_class' is not defined"); + } + } + + /** + * Disable security + */ + public function disableSecurity() + { + $this->security_policy = null; + } + + /** + * Loads cache resource. + * + * @param string $type cache resource type + * @return object of cache resource + */ + public function loadCacheResource($type = null) { + if (!isset($type)) { + $type = $this->caching_type; + } + if (in_array($type, $this->cache_resource_types)) { + $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); + return new $cache_resource_class($this); + } + else { + // try plugins dir + $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); + if ($this->loadPlugin($cache_resource_class)) { + return new $cache_resource_class($this); + } + else { + throw new SmartyException("Unable to load cache resource '{$type}'"); + } + } + } + + + /** + * Set template directory + * + * @param string $ |array $template_dir folder(s) of template sorces + */ + public function setTemplateDir($template_dir) + { + $this->template_dir = (array)$template_dir; + return; + } + + /** + * Adds template directory(s) to existing ones + * + * @param string $ |array $template_dir folder(s) of template sources + */ + public function addTemplateDir($template_dir) + { + $this->template_dir = array_unique(array_merge((array)$this->template_dir, (array)$template_dir)); + return; + } + + /** + * Adds directory of plugin files + * + * @param object $smarty + * @param string $ |array $ plugins folder + * @return + */ + function addPluginsDir($plugins_dir) + { + $this->plugins_dir = array_unique(array_merge((array)$this->plugins_dir, (array)$plugins_dir)); + return; + } + + + /** + * return a reference to a registered object + * + * @param string $name object name + * @return object + */ + function getRegisteredObject($name) + { + if (!isset($this->registered_objects[$name])) + throw new SmartyException("'$name' is not a registered object"); + + if (!is_object($this->registered_objects[$name][0])) + throw new SmartyException("registered '$name' is not an object"); + + return $this->registered_objects[$name][0]; + } + + + /** + * return name of debugging template + * + * @return string + */ + function getDebugTemplate() + { + return $this->debug_tpl; + } + + /** + * set the debug template + * + * @param string $tpl_name + * @return bool + */ + function setDebugTemplate($tpl_name) + { + return $this->debug_tpl = $tpl_name; + } + + /** + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param string $plugin_name class plugin name to load + * @return string |boolean filepath of loaded file or false + */ + public function loadPlugin($plugin_name, $check = true) + { + // if function or class exists, exit silently (already loaded) + if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) + return true; + // Plugin name is expected to be: Smarty_[Type]_[Name] + $_plugin_name = strtolower($plugin_name); + $_name_parts = explode('_', $_plugin_name, 3); + // class name must have three parts to be valid plugin + if (count($_name_parts) < 3 || $_name_parts[0] !== 'smarty') { + throw new SmartyException("plugin {$plugin_name} is not a valid name format"); + return false; + } + // if type is "internal", get plugin from sysplugins + if ($_name_parts[1] == 'internal') { + $file = SMARTY_SYSPLUGINS_DIR . $_plugin_name . '.php'; + if (file_exists($file)) { + require_once($file); + return $file; + } else { + return false; + } + } + // plugin filename is expected to be: [type].[name].php + $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php"; + // loop through plugin dirs and find the plugin + foreach((array)$this->plugins_dir as $_plugin_dir) { + if (strpos('/\\', substr($_plugin_dir, -1)) === false) { + $_plugin_dir .= DS; + } + $file = $_plugin_dir . $_plugin_filename; + if (file_exists($file)) { + require_once($file); + return $file; + } + } + // no plugin loaded + return false; + } + + /** + * clean up properties on cloned object + */ + public function __clone() + { + // clear config vars + $this->config_vars = array(); + // clear assigned tpl vars + $this->tpl_vars = array(); + // clear objects for external methods + unset($this->register); + unset($this->filter); + } + + + /** + * Handle unknown class methods + * + * @param string $name unknown methode name + * @param array $args aurgument array + */ + public function __call($name, $args) + { + static $camel_func; + if (!isset($camel_func)) + $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);'); + // see if this is a set/get for a property + $first3 = strtolower(substr($name, 0, 3)); + if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') { + // try to keep case correct for future PHP 6.0 case-sensitive class methods + // lcfirst() not available < PHP 5.3.0, so improvise + $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4); + // convert camel case to underscored name + $property_name = preg_replace_callback('/([A-Z])/', $camel_func, $property_name); + if (!property_exists($this, $property_name)) { + throw new SmartyException("property '$property_name' does not exist."); + return false; + } + if ($first3 == 'get') + return $this->$property_name; + else + return $this->$property_name = $args[0]; + } + // Smarty Backward Compatible wrapper + if (strpos($name,'_') !== false) { + if (!isset($this->wrapper)) { + $this->wrapper = new Smarty_Internal_Wrapper($this); + } + return $this->wrapper->convert($name, $args); + } + // external Smarty methods ? + foreach(array('filter','register') as $external) { + /* PrestaShop */ + if ((PHP_VERSION_ID <= 50100 AND is_callable(array("Smarty_Internal_{$external}", $name))) OR method_exists("Smarty_Internal_{$external}",$name)) { + if (!isset($this->$external)) { + $class = "Smarty_Internal_{$external}"; + $this->$external = new $class($this); + } + return call_user_func_array(array($this->$external,$name), $args); + } + /* End */ + } + if (in_array($name,array('clearCompiledTemplate','compileAllTemplates','compileAllConfig','testInstall','getTags'))) { + if (!isset($this->utility)) { + $this->utility = new Smarty_Internal_Utility($this); + } + return call_user_func_array(array($this->utility,$name), $args); + } + // PHP4 call to constructor? + if (strtolower($name) == 'smarty') { + throw new SmartyException('Please use parent::__construct() to call parent constuctor'); + return false; + } + throw new SmartyException("Call of unknown function '$name'."); + } +} + +/** + * Autoloader + */ +function smartyAutoload($class) +{ + $_class = strtolower($class); + /* PrestaShop */ + if (substr($_class, 0, 16) === 'smarty_internal_' || $_class == 'smarty_security' && file_exists(SMARTY_SYSPLUGINS_DIR.$_class.'.php')) { + include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; + return true; + } + return false; + /* End */ +} + +/** + * Smarty exception class + */ +Class SmartyException extends Exception { +} + +/** + * Smarty compiler exception class + */ +Class SmartyCompilerException extends SmartyException { +} + +?> diff --git a/tools/smarty/cache/index.php b/tools/smarty/cache/index.php new file mode 100644 index 000000000..15aba8204 --- /dev/null +++ b/tools/smarty/cache/index.php @@ -0,0 +1,11 @@ + + + + Smarty Debug Console + + + + +

        Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}

        + +{if !empty($template_data)} +

        included templates & config files (load time in seconds)

        + +
        +{foreach $template_data as $template} + {$template.name} + + (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"}) + +
        +{/foreach} +
        +{/if} + +

        assigned template variables

        + + + {foreach $assigned_vars as $vars} + + + + {/foreach} +
        ${$vars@key|escape:'html'}{$vars|debug_print_var}
        + +

        assigned config file variables (outer template scope)

        + + + {foreach $config_vars as $vars} + + + + {/foreach} + +
        {$vars@key|escape:'html'}{$vars|debug_print_var}
        + + +{/capture} + diff --git a/tools/smarty/plugins/block.php.php b/tools/smarty/plugins/block.php.php new file mode 100644 index 000000000..8fedd8b43 --- /dev/null +++ b/tools/smarty/plugins/block.php.php @@ -0,0 +1,27 @@ +allow_php_tag) { + throw new SmartyException("{php} is deprecated, set allow_php_tag = true to enable"); + } + eval($content); + return ''; +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/block.textformat.php b/tools/smarty/plugins/block.textformat.php new file mode 100644 index 000000000..517fd62dd --- /dev/null +++ b/tools/smarty/plugins/block.textformat.php @@ -0,0 +1,102 @@ + + * Name: textformat
        + * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings
        + * + * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * @param array $params parameters + *
        + * Params:   style: string (email)
        + *            indent: integer (0)
        + *            wrap: integer (80)
        + *            wrap_char string ("\n")
        + *            indent_char: string (" ")
        + *            wrap_boundary: boolean (true)
        + * 
        + * @author Monte Ohrt + * @param string $content contents of the block + * @param object $template template object + * @param boolean &$repeat repeat flag + * @return string content re-formatted + */ +function smarty_block_textformat($params, $content, $template, &$repeat) +{ + if (is_null($content)) { + return; + } + + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'style': + case 'indent_char': + case 'wrap_char': + case 'assign': + $$_key = (string)$_val; + break; + + case 'indent': + case 'indent_first': + case 'wrap': + $$_key = (int)$_val; + break; + + case 'wrap_cut': + $$_key = (bool)$_val; + break; + + default: + trigger_error("textformat: unknown attribute '$_key'"); + } + } + + if ($style == 'email') { + $wrap = 72; + } + // split into paragraphs + $_paragraphs = preg_split('![\r\n][\r\n]!', $content); + $_output = ''; + + for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) { + if ($_paragraphs[$_x] == '') { + continue; + } + // convert mult. spaces & special chars to single space + $_paragraphs[$_x] = preg_replace(array('!\s+!', '!(^\s+)|(\s+$)!'), array(' ', ''), $_paragraphs[$_x]); + // indent first line + if ($indent_first > 0) { + $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x]; + } + // wordwrap sentences + $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); + // indent lines + if ($indent > 0) { + $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]); + } + } + $_output = implode($wrap_char . $wrap_char, $_paragraphs); + + return $assign ? $template->assign($assign, $_output) : $_output; +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/function.counter.php b/tools/smarty/plugins/function.counter.php new file mode 100644 index 000000000..7c50bd44b --- /dev/null +++ b/tools/smarty/plugins/function.counter.php @@ -0,0 +1,78 @@ + + * Name: counter
        + * Purpose: print out a counter value + * @author Monte Ohrt + * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * @param array parameters + * @param Smarty + * @param object $template template object + * @return string|null + */ +function smarty_function_counter($params, $template) +{ + static $counters = array(); + + $name = (isset($params['name'])) ? $params['name'] : 'default'; + if (!isset($counters[$name])) { + $counters[$name] = array( + 'start'=>1, + 'skip'=>1, + 'direction'=>'up', + 'count'=>1 + ); + } + $counter =& $counters[$name]; + + if (isset($params['start'])) { + $counter['start'] = $counter['count'] = (int)$params['start']; + } + + if (!empty($params['assign'])) { + $counter['assign'] = $params['assign']; + } + + if (isset($counter['assign'])) { + $template->assign($counter['assign'], $counter['count']); + } + + if (isset($params['print'])) { + $print = (bool)$params['print']; + } else { + $print = empty($counter['assign']); + } + + if ($print) { + $retval = $counter['count']; + } else { + $retval = null; + } + + if (isset($params['skip'])) { + $counter['skip'] = $params['skip']; + } + + if (isset($params['direction'])) { + $counter['direction'] = $params['direction']; + } + + if ($counter['direction'] == "down") + $counter['count'] -= $counter['skip']; + else + $counter['count'] += $counter['skip']; + + return $retval; + +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/function.cycle.php b/tools/smarty/plugins/function.cycle.php new file mode 100644 index 000000000..98e3e2878 --- /dev/null +++ b/tools/smarty/plugins/function.cycle.php @@ -0,0 +1,106 @@ + + * Name: cycle
        + * Date: May 3, 2002
        + * Purpose: cycle through given values
        + * Input: + * - name = name of cycle (optional) + * - values = comma separated list of values to cycle, + * or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset = boolean - resets given var to true + * - print = boolean - print var or not. default is true + * - advance = boolean - whether or not to advance the cycle + * - delimiter = the value delimiter, default is "," + * - assign = boolean, assigns to template var instead of + * printed. + * + * Examples:
        + *
        + * {cycle values="#eeeeee,#d0d0d0d"}
        + * {cycle name=row values="one,two,three" reset=true}
        + * {cycle name=row}
        + * 
        + * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt + * @author credit to Mark Priatel + * @author credit to Gerard + * @author credit to Jason Sweat + * @version 1.3 + * @param array + * @param object $template template object + * @return string|null + */ + +function smarty_function_cycle($params, $template) +{ + static $cycle_vars; + + $name = (empty($params['name'])) ? 'default' : $params['name']; + $print = (isset($params['print'])) ? (bool)$params['print'] : true; + $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; + $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; + + if (!in_array('values', array_keys($params))) { + if(!isset($cycle_vars[$name]['values'])) { + trigger_error("cycle: missing 'values' parameter"); + return; + } + } else { + if(isset($cycle_vars[$name]['values']) + && $cycle_vars[$name]['values'] != $params['values'] ) { + $cycle_vars[$name]['index'] = 0; + } + $cycle_vars[$name]['values'] = $params['values']; + } + + if (isset($params['delimiter'])) { + $cycle_vars[$name]['delimiter'] = $params['delimiter']; + } elseif (!isset($cycle_vars[$name]['delimiter'])) { + $cycle_vars[$name]['delimiter'] = ','; + } + + if(is_array($cycle_vars[$name]['values'])) { + $cycle_array = $cycle_vars[$name]['values']; + } else { + $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); + } + + if(!isset($cycle_vars[$name]['index']) || $reset ) { + $cycle_vars[$name]['index'] = 0; + } + + if (isset($params['assign'])) { + $print = false; + $template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); + } + + if($print) { + $retval = $cycle_array[$cycle_vars[$name]['index']]; + } else { + $retval = null; + } + + if($advance) { + if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { + $cycle_vars[$name]['index'] = 0; + } else { + $cycle_vars[$name]['index']++; + } + } + + return $retval; +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/function.fetch.php b/tools/smarty/plugins/function.fetch.php new file mode 100644 index 000000000..2b09fb947 --- /dev/null +++ b/tools/smarty/plugins/function.fetch.php @@ -0,0 +1,216 @@ + + * Name: fetch
        + * Purpose: fetch file, web or ftp data and display results + * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @author Monte Ohrt + * @param array $params parameters + * @param object $template template object + * @return string|null if the assign parameter is passed, Smarty assigns the + * result to a template variable + */ +function smarty_function_fetch($params, $template) +{ + if (empty($params['file'])) { + trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE); + return; + } + + $content = ''; + if (isset($template->security_policy) && !preg_match('!^(http|ftp)://!i', $params['file'])) { + if(!$template->security_policy->isTrustedResourceDir($params['file'])) { + return; + } + + // fetch the file + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + trigger_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'',E_USER_NOTICE); + return; + } + } else { + // not a local file + if(preg_match('!^http://!i',$params['file'])) { + // http fetch + if($uri_parts = parse_url($params['file'])) { + // set defaults + $host = $server_name = $uri_parts['host']; + $timeout = 30; + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + $agent = "Smarty Template Engine ".$template->_version; + $referer = ""; + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; + $_is_proxy = false; + if(empty($uri_parts['port'])) { + $port = 80; + } else { + $port = $uri_parts['port']; + } + if(!empty($uri_parts['user'])) { + $user = $uri_parts['user']; + } + if(!empty($uri_parts['pass'])) { + $pass = $uri_parts['pass']; + } + // loop through parameters, setup headers + foreach($params as $param_key => $param_value) { + switch($param_key) { + case "file": + case "assign": + case "assign_headers": + break; + case "user": + if(!empty($param_value)) { + $user = $param_value; + } + break; + case "pass": + if(!empty($param_value)) { + $pass = $param_value; + } + break; + case "accept": + if(!empty($param_value)) { + $accept = $param_value; + } + break; + case "header": + if(!empty($param_value)) { + if(!preg_match('![\w\d-]+: .+!',$param_value)) { + trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case "proxy_host": + if(!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case "proxy_port": + if(!preg_match('!\D!', $param_value)) { + $proxy_port = (int) $param_value; + } else { + trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); + return; + } + break; + case "agent": + if(!empty($param_value)) { + $agent = $param_value; + } + break; + case "referer": + if(!empty($param_value)) { + $referer = $param_value; + } + break; + case "timeout": + if(!preg_match('!\D!', $param_value)) { + $timeout = (int) $param_value; + } else { + trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); + return; + } + break; + default: + trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE); + return; + } + } + if(!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); + } else { + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); + } + + if(!$fp) { + trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); + return; + } else { + if($_is_proxy) { + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if(!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if(!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if(!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if(!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if(isset($extra_headers) && is_array($extra_headers)) { + foreach($extra_headers as $curr_header) { + fputs($fp, $curr_header."\r\n"); + } + } + if(!empty($user) && !empty($pass)) { + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); + } + + fputs($fp, "\r\n"); + while(!feof($fp)) { + $content .= fgets($fp,4096); + } + fclose($fp); + $csplit = preg_split("!\r\n\r\n!",$content,2); + + $content = $csplit[1]; + + if(!empty($params['assign_headers'])) { + $template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); + } + } + } else { + trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); + return; + } + } else { + // ftp fetch + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + trigger_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'',E_USER_NOTICE); + return; + } + } + + } + + + if (!empty($params['assign'])) { + $template->assign($params['assign'],$content); + } else { + return $content; + } +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/function.html_checkboxes.php b/tools/smarty/plugins/function.html_checkboxes.php new file mode 100644 index 000000000..6a1a3ffdc --- /dev/null +++ b/tools/smarty/plugins/function.html_checkboxes.php @@ -0,0 +1,143 @@ + + * Type: function
        + * Name: html_checkboxes
        + * Date: 24.Feb.2003
        + * Purpose: Prints out a list of checkbox input types
        + * Examples: + *
        + * {html_checkboxes values=$ids output=$names}
        + * {html_checkboxes values=$ids name='box' separator='
        ' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='
        ' output=$names} + *
        + * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * @param array $params parameters + * Input:
        + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
        or   + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * @param object $template template object + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_checkboxes($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $name = 'checkbox'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $labels = true; + $output = null; + + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = $_val; + break; + + case 'labels': + $$_key = (bool)$_val; + break; + + case 'options': + $$_key = (array)$_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + + case 'checked': + case 'selected': + $selected = array_map('strval', array_values((array)$_val)); + break; + + case 'checkboxes': + trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array)$_val; + break; + + case 'assign': + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + settype($selected, 'array'); + $_html_result = array(); + + if (isset($options)) { + + foreach ($options as $_key=>$_val) + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + + + } else { + foreach ($values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + } + + } + + if(!empty($params['assign'])) { + $template->assign($params['assign'], $_html_result); + } else { + return implode("\n",$_html_result); + } + +} + +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) { + $_output = ''; + if ($labels) $_output .= ''; + $_output .= $separator; + + return $_output; +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/function.html_image.php b/tools/smarty/plugins/function.html_image.php new file mode 100644 index 000000000..abb7b5789 --- /dev/null +++ b/tools/smarty/plugins/function.html_image.php @@ -0,0 +1,137 @@ + + * Name: html_image
        + * Date: Feb 24, 2003
        + * Purpose: format HTML tags for the image
        + * Examples: {html_image file="/images/masthead.gif"} + * Output: + * + * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt + * @author credits to Duda + * @version 1.0 + * @param array $params parameters + * Input:
        + * - file = file (and path) of image (required) + * - height = image height (optional, default actual height) + * - width = image width (optional, default actual width) + * - basedir = base directory for absolute paths, default + * is environment variable DOCUMENT_ROOT + * - path_prefix = prefix for path output (optional, default empty) + * @param object $template template object + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $alt = ''; + $file = ''; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $path_prefix = ''; + $server_vars = $_SERVER; + $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : ''; + foreach($params as $_key => $_val) { + switch ($_key) { + case 'file': + case 'height': + case 'width': + case 'dpi': + case 'path_prefix': + case 'basedir': + $$_key = $_val; + break; + + case 'alt': + if (!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + + case 'link': + case 'href': + $prefix = ''; + $suffix = ''; + break; + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (empty($file)) { + trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + return; + } + + if (substr($file, 0, 1) == '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + + if (!isset($params['width']) || !isset($params['height'])) { + if (!$_image_data = @getimagesize($_image_path)) { + if (!file_exists($_image_path)) { + trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + return; + } else if (!is_readable($_image_path)) { + trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + return; + } else { + trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + return; + } + } + if (isset($template->security_policy)) { + if (!$template->security_policy->isTrustedResourceDir($_image_path)) { + return; + } + } + + if (!isset($params['width'])) { + $width = $_image_data[0]; + } + if (!isset($params['height'])) { + $height = $_image_data[1]; + } + } + + if (isset($params['dpi'])) { + if (strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) { + $dpi_default = 72; + } else { + $dpi_default = 96; + } + $_resize = $dpi_default / $params['dpi']; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + + return $prefix . '' . $alt . '' . $suffix; +} + +?> \ No newline at end of file diff --git a/tools/smarty/plugins/function.html_options.php b/tools/smarty/plugins/function.html_options.php new file mode 100644 index 000000000..7ac039028 --- /dev/null +++ b/tools/smarty/plugins/function.html_options.php @@ -0,0 +1,133 @@ + + * Name: html_options
        + * Purpose: Prints the list of